ZGlmZiAtLWdpdCBhLy5hc2YueWFtbCBiLy5hc2YueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDlhODUxCi0tLSAvZGV2L251bGwKKysrIGIvLmFzZi55YW1sCkBAIC0wLDAgKzEsMjIgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2dpdGh1YjoKKyAgZGVzY3JpcHRpb246ICJBcGFjaGUgQW50IGlzIGEgSmF2YS1iYXNlZCBidWlsZCB0b29sLiIKKyAgaG9tZXBhZ2U6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcvCisgIGxhYmVsczoKKyAgICAtIGphdmEKKyAgICAtIGJ1aWxkCisgICAgLSBhcGFjaGUKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDgwZDE0MjUuLjJhZDRlMzEgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtNSw2ICs1LDcgQEAKICouc25hcAogLmFudC5wcm9wZXJ0aWVzCiAuY2xhc3NwYXRoCisuRFNfU3RvcmUKIC5wcm9qZWN0CiAuc2V0dGluZ3MKIGJpbgpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCmluZGV4IDc5Zjk0YmUuLjVhZDg2YjIgMTAwNjQ0Ci0tLSBhL0NPTlRSSUJVVElORy5tZAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTYsNyArNiw3IEBACiBoZWFyIGZyb20geW91LgogCiBBbnQncyBwcmltYXJ5IGNvZGUgcmVwb3NpdG9yeSBpcyB0aGUKLVtnaXQgcmVwb3NpdG9yeSBhdCBBcGFjaGVdKGh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQuZ2l0KQorW2dpdCByZXBvc2l0b3J5IGF0IEFwYWNoZV0oaHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50LmdpdCkKIGFuZCB3ZSd2ZSBhbHNvIGdvdCBhIFtnaXRodWIgbWlycm9yXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2FudC8pLgogCiBUaGVyZSBhcmUgdHdvIHdheXMgeW91IGNhbiBjb250cmlidXRlLCB5b3UgY2FuIGVpdGhlciB1c2UgdGhlCkBAIC0xNSwxOSArMTUsMzIgQEAKIHVzZSBnaXRodWIgaXNzdWVzLCBzbyBpZiB5b3UgYXJlIHJlcG9ydGluZyBhIGJ1ZywgcGxlYXNlIHJhaXNlIGEKIFtCdWd6aWxsYSBpc3N1ZV0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8pLgogCi1CZWZvcmUgcmVwb3J0aW5nIGEgYnVnLCBwbGVhc2UgYWxzbyByZXZpZXcgaHR0cDovL2FudC5hcGFjaGUub3JnL3Byb2JsZW1zLmh0bWwKK0JlZm9yZSByZXBvcnRpbmcgYSBidWcsIHBsZWFzZSBhbHNvIHJldmlldyBodHRwczovL2FudC5hcGFjaGUub3JnL3Byb2JsZW1zLmh0bWwKIAogSWYgeW91J3JlIHBsYW5uaW5nIHRvIGltcGxlbWVudCBhIG5ldyBmZWF0dXJlIHBsZWFzZSBkaXNjdXNzIHlvdSdyZQogY2hhbmdlcyBvbiB0aGUKLVtkZXYgbGlzdF0oaHR0cDovL2FudC5hcGFjaGUub3JnL21haWwuaHRtbCNEZXZlbG9wZXIlMjBMaXN0OiUyMGRldkBhbnQuYXBhY2hlLm9yZykKK1tkZXYgbGlzdF0oaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwjRGV2ZWxvcGVyJTIwTGlzdDolMjBkZXZAYW50LmFwYWNoZS5vcmcpCiBmaXJzdC4gVGhpcyB3YXkgeW91IGNhbiBtYWtlIHN1cmUgeW91J3JlIG5vdCB3YXN0aW5nIHlvdXIgdGltZSBvbgogc29tZXRoaW5nIHRoYXQgaXNuJ3QgY29uc2lkZXJlZCB0byBiZSBpbiBBbnQncyBzY29wZS4KIAorQnJhbmNoZXMKKy0tLS0tLS0tCisKK1RoZSBtYXN0ZXIgYnJhbmNoIGlzIHdoZXJlIHdlIGRldmVsb3AgdGhlIG5leHQgcmVsZWFzZSBvZiBBbnQgMS4xMC54IC0KK2FueSBwYXRjaCBvciBQUiBhZ2FpbnN0IHRoaXMgYnJhbmNoIG11c3QgYmUgYnVpbGRhYmxlIHVzaW5nIEphdmE4LgorCitUaGUgYnJhbmNoIDEuOS54IGlzIHdoZXJlIHdlIGRldmVsb3AgdGhlIG5leHQgcmVsZWFzZSBvZiBBbnQgMS45LnggLQorYW55IHBhdGNoIG9yIFBSIGFnYWluc3QgdGhpcyBicmFuY2ggbXVzdCBiZSBidWlsZGFibGUgdXNpbmcgSmF2YTUuCisKK1BsZWFzZSBzdGF0ZSBjbGVhcmx5IHdoZXRoZXIgeW91IGFyZSB0YXJnZXRpbmcgMS45Lnggb3IgMS4xMC54IC0KK3VzdWFsbHkgd2UgcG9ydCBjaGFuZ2VzIGZyb20gMS45LnggdG8gMS4xMC54IGJ1dCBub3QgbmVjZXNzYXJpbHkgdGhlCitvdGhlciB3YXkgYXJvdW5kLgorCiBNYWtpbmcgQ2hhbmdlcwogLS0tLS0tLS0tLS0tLS0KIAogKyBDcmVhdGUgYSB0b3BpYyBicmFuY2ggZnJvbSB3aGVyZSB5b3Ugd2FudCB0byBiYXNlIHlvdXIgd29yayAodGhpcyBpcwotICB1c3VhbGx5IHRoZSBtYXN0ZXIgYnJhbmNoKS4KKyAgdXN1YWxseSB0aGUgbWFzdGVyIG9yIHRoZSAxLjkueCBicmFuY2gsIHNlZSBhYm92ZSkuCiArIE1ha2UgY29tbWl0cyBvZiBsb2dpY2FsIHVuaXRzLgogKyBSZXNwZWN0IHRoZSBvcmlnaW5hbCBjb2RlIHN0eWxlOgogICArIE9ubHkgdXNlIHNwYWNlcyBmb3IgaW5kZW50YXRpb24uCkBAIC01Miw0ICs2NSw0IEBACiArIEFsdGVybmF0aXZlbHkgcHVzaCB5b3VyIGNoYW5nZXMgdG8gYSB0b3BpYyBicmFuY2ggaW4geW91ciBmb3JrIG9mIHRoZSByZXBvc2l0b3J5LgogICArIFN1Ym1pdCBhIHB1bGwgcmVxdWVzdCB0byB0aGUgcmVwb3NpdG9yeSBpbiB0aGUgYXBhY2hlIG9yZ2FuaXphdGlvbi4KIAotW2NsYV06aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyNjbGFzCitbY2xhXTpodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyNjbGFzCmRpZmYgLS1naXQgYS9DT05UUklCVVRPUlMgYi9DT05UUklCVVRPUlMKaW5kZXggNzAwNWM3NS4uNGIyMWNmNyAxMDA2NDQKLS0tIGEvQ09OVFJJQlVUT1JTCisrKyBiL0NPTlRSSUJVVE9SUwpAQCAtMiwxMCArMiwxNCBAQAogCiBBZGFtIEJsaW5raW5zb3AKIEFkYW0gQnJ5emFrCitBZGFtIE11cmRvY2gKK0FkYW0gUmV0dGVyCiBBZGFtIFNvdG9uYQogQWRyaWFuIE5pc3RvcgorQWRyaWVuIEdyYW5kCiBBbGVrc2FuZHIgSXNodXRpbgogQWxleCBSb3NlbgorQWxleGFuZGVyIEdydW5kCiBBbGV4ZWkgWXVkaWNoZXYKIEFsZXhleSBQYW5jaGVua28KIEFsZXhleSBTb2xvZm5lbmtvCkBAIC0yNywxNyArMzEsMjAgQEAKIEFudG9pbmUgQmF1ZG91eAogQW50b2luZSBMZXZ5LUxhbWJlcnQKIEFudG9uIE1hemtvdm9pCitBcmNhZGl1cyBBaG91YW5zb3UKIEFyamFuIFZlZW5zdHJhCiBBcm5hdWQgVmFuZHljawogQXJub3V0IEouIEt1aXBlcgorQXJ1biBKYW13YWwKIEFzbGFrIEhlbGxlc8O0eQogQXRzdWhpa28gWWFtYW5ha2EKIEF2aWsgU2VuZ3VwdGEKIEJhbGF6cyBGZWplcyAyCitiYXJuZXkyazcKIEJhcnQgVmFuaGF1dGUKLUJlbmphbWluIEJ1cmdlc3MKIEJlbiBHYWxicmFpdGgKIEJlbiBHZXJ0emZpZWxkCitCZW5qYW1pbiBCdXJnZXNzCiBCZW5vaXQgTW91c3NhdWQKIEJlcm5kIER1dGtvd3NraQogQmVybmhhcmQgUm9zZW5rcmFlbnplcgpAQCAtNDksNiArNTYsNyBAQAogQnJpYW4gUmVwa28KIEJydWNlIEF0aGVydG9uCiBDZWRvbWlyIElnYWx5CitDaGFybGVzIER1ZmZ5CiBDaGFybGVzIEh1ZGFrCiBDaGFybGllIEh1YmJhcmQKIENocmlzIEhlZ2FydHkKQEAgLTY1LDkgKzczLDExIEBACiBDbGVtZW50IE9VRE9UCiBDbGl2ZSBCcmV0dGluZ2hhbS1Nb29yZQogQ29ub3IgTWFjTmVpbGwKK0Nvc3RpbiBNYW5vbGFjaGUKIENyYWVnIFN0cm9uZwogQ3JhaWcgQ290dGluZ2hhbQogQ3JhaWcgUi4gTWNDbGFuYWhhbgorQ3JhaWcgUGVsbAogQ3JhaWcgUmljaGFyZHNvbgogQ3JhaWcgUnlhbgogQ3JhaWcgU2FuZHZpawpAQCAtODYsNiArOTYsNyBAQAogRGFubm8gRmVycmluCiBEYW5ueSBZYXRlcwogRGFudGUgQnJpb25lcworRGFycmVsbCBEZUJvZXIKIERhdmFudW0gU3Jpbml2YXMKIERhdmUgQnJvbmRzZW1hCiBEYXZlIEJyb3NpdXMKQEAgLTEwNiwxMCArMTE3LDExIEBACiBkSW9uIEdpbGxhcmQKIERtaXRyeSBBLiBLdW1pbm92CiBEb21pbmlxdWUgRGV2aWVubmUKLURvbmFsIFF1aW5sYW4KIERvbiBCcm93bgogRG9uIEZlcmd1c29uCiBEb24gSmVmZmVyeQorRG9uYWwgUXVpbmxhbgorRG9uYWxkIExlc2xpZQogRHJldyBTdWRlbGwKIEVhcmwgSG9vZAogRWRpc29uIEd1bwpAQCAtMTE3LDYgKzEyOSw3IEBACiBFZHdpbiBXb3VkdAogRWxpIFR1Y2tlcgogRW1tYW51ZWwgQm91cmcKK0V1Z8OobmUgQWRlbGwKIEVyaWMgQmFyYm9uaQogRXJpYyBPbHNlbgogRXJpYyBQdWdoCkBAIC0xMjksOSArMTQyLDEwIEBACiBGcmFuayBIYXJuYWNrCiBGcmFuayBTb21lcnMKIEZyYW5rIFpleWRhCi1GcmFudGlzZWsgS3VjZXJhCi1GcmVkZXJpYyBCb3RoYW15CitGcmFudGnFoWVrIEt1xI1lcmEKK0Zyw6lkw6lyaWMgQm90aGFteQogRnJlZGVyaWMgTGF2aWduZQorR2FsIFNoYWNob3IKIEdhcnkgUy4gV2VhdmVyCiBHYXV0YW0gR3VsaWFuaQogR2VuZS1TdW5nIENodW5nCkBAIC0xNjIsOSArMTc2LDEyIEBACiBJc3NhIEdvcmlzc2VuCiBJdmFuIEl2YW5vdgogSiBCbGVpamVuYmVyZ2gKK0pDIE1hbm4KIEphY2sgSi4gV29laHIKK0phY29idXMgTWFydGludXMgS3J1aXRob2YKIEphaWtpcmFuIFBhaQogSmFtZXMgRHVuY2FuIERhdmlkc29uCitKYW1lcyBUb2RkCiBKYW4gQ3VtcHMKIEphbiBNYXTDqHJuZQogSmFuIE15bmFyaWsKQEAgLTE3Niw4ICsxOTMsNiBAQAogSmF5IERpY2tvbiBHbGFudmlsbGUKIEpheSBQZWNrCiBKYXkgdmFuIGRlciBNZWVyCi1KQyBNYW5uCi1KIEQgR2xhbnZpbGxlCiBKZWFuLUZyYW5jb2lzIEJyb3Vzc2VhdQogSmVhbi1Mb3VpcyBCb3VkYXJ0CiBKZWZmIEdldHRsZQpAQCAtMTkyLDIxICsyMDcsMjQgQEAKIEplc3NlIFN0b2NrYWxsCiBKaW0gQWxsZXJzCiBKaW1teSBDYXNleQotSm9lcmcgV2Fzc21lcgogSm9lbCBUdWNjaQorSm9lcmcgV2Fzc21lcgogSm9leSBSaWNoZXkKIEpvaGFubiBIZXJ1bnRlcgogSm9obiBFbGlvbgogSm9obiBTaXNzb24KIEpvbiBEaWNraW5zb24KLUpvbiBTLiBTdGV2ZW5zCiBKb24gU2tlZXQKK0pvbiBTLiBTdGV2ZW5zCitKb25hdGhhbiBLLiBTY2huZWlkZXIKIEpvc2UgQWxiZXJ0byBGZXJuYW5kZXoKIEpvc2VwaCBXYWx0b24KIEpvc2ggTHVjYXMKIEp1ZXJnIFdhbm5lcgogSnVsaWFuIFNpbXBzb24KK0p1bGllbiBMZXBpbGxlcgogSnVzdGluIFZhbGxvbgorSnVzdHluYSBIb3J3YXQKIEthcmwgSmFuc2VuCiBLZWlyb24gTGlkZGxlCiBLZWl0aCBWaXNjbwpAQCAtMjE0LDcgKzIzMiw3IEBACiBLZXZpbiBHcmVpbmVyCiBLZXZpbiBKYWNrc29uCiBLZXZpbiBSb3NzCi1LZXZpbiBaIEdyZXkKK0tldmluIFouIEdyZXkKIEtpbSBIYW5zZW4KIEtpcmsgV3lsaWUKIEtyaXN0aWFuIFJvc2Vudm9sZApAQCAtMjMxLDEyICsyNDksMTQgQEAKIE1hYXJ0ZW4gQ29lbmUKIE1hZ2VzaCBVbWFzYW5rYXIKIE1hbmVlc2ggU2FodQorTWFyYyBHdWlsbGVtb3QKIE1hcmNlbCBTY2h1dHRlCi1NYXJjdXMgQiZvdW1sO3JnZXIKK01hcmN1cyBCw7ZyZ2VyCiBNYXJpbyBGcmFzY2EgCiBNYXJpdXN6IE5vd29zdGF3c2tpCiBNYXJrIEEuIFppZXNlbWVyCiBNYXJrIERlTGFGcmFuaWVyCitNYXJrIEhhcm1lcgogTWFyayBIZWNrZXIKIE1hcmsgTmlnZ2VtYW5uCiBNYXJrIFIuIERpZ2dvcnkKQEAgLTI2MCw5ICsyODAsMTEgQEAKIE1hdHRoZXcgSGF3dGhvcm5lCiBNYXR0aGV3IEluZ2VyCiBNYXR0aGV3IEt1cGVydXMgSGV1bgorTWF0dGhldyBXYXJtYW4KIE1hdHRoZXcgV2F0c29uCiBNYXR0aGV3IFlhbm9zCiBNYXR0aGlhcyBCaGVuZAorTWF0dGhpYXMgR3V0aGVpbAogTWljaGFlbCBCYXluZQogTWljaGFlbCBDbGFya2UKIE1pY2hhZWwgRGF2ZXkKQEAgLTI3MCwzMiArMjkyLDM2IEBACiBNaWNoYWVsIE1jQ2FsbHVtCiBNaWNoYWVsIE1vbnR1b3JpCiBNaWNoYWVsIE5ld2NvbWIKLU1pY2hlYWwgTnlnYXJkCitNaWNoYWVsIE55Z2FyZAogTWljaGFlbCBTYXVuZGVycworTWljaGFlbCBTZWVsZQorTWlja2HDq2wgR3Vlc3NhbnQKIE1paGEKIE1pa2UgRGF2aXMKIE1pa2UgUm9iZXJ0cwogTWlrZSBXaWxsaWFtcwogTWlyb3NsYXYgWmHFpWtvCi1tbm93b3N0YXdza2kKIE1vdW5pciBFbCBIYWpqCiBOYXRoYW4gQmV5ZXIKIE5pY2sgQ2hhbGtvCi1OaWNrIEZvcnRlc2N1ZQogTmljayBDcm9zc2xleQorTmljayBEYXZpcworTmljayBGb3J0ZXNjdWUKK05pY2sgS2luZwogTmljayBQZWxsb3cKLU5pY29sYSBLZW4gQmFyb3p6aQogTmljbyBTZWVzc2xlCitOaWNvbGEgS2VuIEJhcm96emkKK05pY29sYXMgTGFsZXZlzIFlCiBOaWdlbCBNYWduYXkKIE9saXZlciBNZXJrZWwKIE9saXZlciBSb3NzbXVlbGxlcgotT25kcmEgTWVkZWsKK09saXZpZXIgUGFyZW50CiBPbWVyIFNoYXBpcmEKLU95c3RlaW4gR2lzbmFzCitPbmRyYSBNZWRlawogUGF0cmljayBBbHRhaWUKIFBhdHJpY2sgQy4gQmVhcmQKIFBhdHJpY2sgQ2hhbmV6b24KLVBhdHJpY2sgRy4gSGVjayAoR3VzIEhlY2spCitQYXRyaWNrIEd1cyBIZWNrCiBQYXRyaWNrIE1hcnRpbgogUGF1bCBBdXN0aW4KIFBhdWwgQ2hyaXN0bWFubgpAQCAtMzA0LDcgKzMzMCw3IEBACiBQYXVsbyBHYXNwYXIKIFBhdmFuIEJheXlhcHUKIFBhdmVsIEppc2wKLVBhd2VsIFp1emVsc2tpCitQYXdlxYIgWnV6ZWxza2kKIFBldGVyIEIuIFdlc3QKIFBldGVyIERvbmFsZAogUGV0ZXIgRG9vcm5ib3NjaApAQCAtMzE3LDEzICszNDMsMTMgQEAKIFBoaWxsaXAgV2VsbHMKIFBpZXJyZSBEZWxpc2xlCiBQaWVycmUgRGl0dGdlbgotcmlhc29sCi1SIEhhbmRlcnNvbgorUHJlc3RvbiBCYW5uaXN0ZXIKIFJhbGYgSGVyZ2VydAogUmFtaSBPamFyZXMKIFJhbmR5IFdhdGxlcgogUmFwaGFlbCBQaWVycXVpbgogUmF5IFdhbGRpbgorUmF6emkgQWJ1aXNzYQogUmVpbmhhcmQgUG9pbnRuZXIKIFJlbWllIEJvbHRlCiBSZW7DqSBLcmVsbApAQCAtMzMxLDggKzM1NywxMSBAQAogUmljaGFyZCBFdmFucwogUmljaGFyZCBTdGVlbGUKIFJpY2sgQmV0b24KK1JvYiBPeHNwcmluZworUm9iIHZhbiBPb3N0cnVtCitSb2IgUmlhc29sCiBSb2JiaWUgR2lic29uCi1Sb2JlcnQgQW5kZXJzb24KK1JvYmVydCBILiBBbmRlcnNvbgogUm9iZXJ0IENsYXJrCiBSb2JlcnQgRmxhaGVydHkKIFJvYmVydCBTaGF3CkBAIC0zNDIsOCArMzcxLDYgQEAKIFJvYmluIEdyZWVuCiBSb2JpbiBQb3dlcgogUm9iaW4gVmVyZHVpam4KLVJvYiBPeHNwcmluZwotUm9iIHZhbiBPb3N0cnVtCiBSb2RyaWdvIFNjaG1pZHQKIFJvZ2VyIFZhdWdobgogUm9tYW4gSXZhc2hpbgpAQCAtMzU5LDE4ICszODYsMTkgQEAKIFNjb3R0IE0uIFN0aXJsaW5nCiBTZWFuIEVnYW4KIFNlYW4gUC4gS2FuZQorU2ViYXN0aWFuIEthbnRoYQogU2ViYXN0aWVuIEFyb2QKIFNoaXJheiBLYW5nYQotU2ViYXN0aWFuIEthbnRoYQorU2ltZW9uIEZpdGNoCiBTaW1vbiBMYXcKIFNpbW9uZSBCb3JkZXQKIFN0ZWZhbiBCb2Rld2lnCiBTdGVmYW4gSGVpbWFubgogU3RlZmFubyBNYXp6b2NjaGkKLVN0ZXBoYW4gU3RyaXR0bWF0dGVyCi1TdGVwaGFuZSBCYWlsbGllegogc3RlcGhhbgogU3RlcGhhbiBNaWNoZWxzCitTdGVwaGFuIFN0cml0dG1hdHRlcgorU3RlcGhhbmUgQmFpbGxpZXoKIFN0ZXBoZW4gQ2hpbgogU3RlcGhlbiBHb2V0emUKIFN0ZXZlIENvaGVuCkBAIC00MDUsMTggKzQzMywyMiBAQAogVG9tIE1heQogVG9tYXN6IEJlY2gKIFRvbcOhxaEgWmV6dWxhCitUb255IEdyYXZhZ25vCiBUcmVqa2F6IFhhb3phCiBVbHJpY2ggU2NobWlkdAogVXdlIFNjaGluZGxlcgogVmFsZW50aW5vIE1pYXp6bwogVmljdG9yIFRvbmkKK1ZpbGxlIFNreXR0w6QKIFZpbWlsIFNhanUKIFZpbmNlbnQgTGVnb2xsCiBWaW5jZW50IFByaXZhdAogVml0b2xkIFNlZHlzaGV2CitWbGFkaXNsYXYgQmF1ZXIKIFZvbGtlciBMZWlkbAogV2FsZGVrIEhlcmthCiBXYW5nIFdlaWp1bgorV2VuamluZyBXYW5nCiBXaWxsIFdhbmcKIFdpbGxpYW0gQmVybmFyZGV0CiBXaWxsaWFtIEZlcmd1c29uCkBAIC00MjgsOCArNDYwLDEwIEBACiBXb2xmZ2FuZyBXZXJuZXIKIFhhdmllciBIYW5pbgogWGF2aWVyIFdpdGRvdWNrCitYaWEgTGkKIFlvaGFubiBSb3Vzc2VsCiBZdWppIFlhbWFubwogWXZlcyBNYXJ0aW4KIFphY2ggR2FybmVyCiBaZGVuZWsgV2FnbmVyCivDmHlzdGVpbiBHaXNuw6VzCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTAppbmRleCA4M2MxMTY3Li4yODllNWI4IDEwMDY0NAotLS0gYS9JTlNUQUxMCisrKyBiL0lOU1RBTEwKQEAgLTEsMiArMSwyIEBACi1Gb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBzZWUgdGhlIG1hbnVhbCBpbiB0aGUgZG9jcyBzdWJkaXJlY3RvcnkKLW9yIG9ubGluZSBhdCA8aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9pbmRleC5odG1sPi4KK0ZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIHNlZSB0aGUgbWFudWFsIGJ5IG9wZW5pbmcgbWFudWFsL2luZGV4Lmh0bWwKK29yIHNlZSBpdCBvbmxpbmUgYXQgPGh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2luZGV4Lmh0bWw+LgpkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKaW5kZXggY2RmNmZmOC4uNWNmZTMwOSAxMDA2NDQKLS0tIGEvTElDRU5TRQorKysgYi9MSUNFTlNFCkBAIC0xOTMsNyArMTkzLDcgQEAKICAqICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICogICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwMyw3ICsyMDMsNyBAQAogICovCiAKIFczQ64gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCi1odHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMDIvY29weXJpZ2h0LXNvZnR3YXJlLTIwMDIxMjMxCitodHRwczovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8yMDAyL2NvcHlyaWdodC1zb2Z0d2FyZS0yMDAyMTIzMQogCiBUaGlzIHdvcmsgKGFuZCBpbmNsdWRlZCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiBzdWNoIGFzIFJFQURNRXMsIG9yIG90aGVyCiByZWxhdGVkIGl0ZW1zKSBpcyBiZWluZyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgdW5kZXIgdGhlIGZvbGxvd2luZwpkaWZmIC0tZ2l0IGEvTk9USUNFIGIvTk9USUNFCmluZGV4IDc3YjQxNjUuLmIzY2ZkNDAgMTAwNjQ0Ci0tLSBhL05PVElDRQorKysgYi9OT1RJQ0UKQEAgLTIsNyArMiw3IEBACiBDb3B5cmlnaHQgMTk5OS0yMDIwIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgogCiBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGF0Ci1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgorVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwczovL3d3dy5hcGFjaGUub3JnLykuCiAKIFRoZSA8c3luYz4gdGFzayBpcyBiYXNlZCBvbiBjb2RlIENvcHlyaWdodCAoYykgMjAwMiwgTGFuZG1hcmsKIEdyYXBoaWNzIENvcnAgdGhhdCBoYXMgYmVlbiBraW5kbHkgZG9uYXRlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggOTUxMDk0MS4uY2ZmN2U4OSAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMSw1ICsxLDUgQEAKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAgICAgTiAgICAgVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIEFudAogIAogCiAgIFdoYXQgaXMgaXQ/IApAQCAtNDYsMTYgKzQ2LDE5IEBACiAgIC0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIERldGFpbHMgb2YgdGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBvbiB0aGUgQXBhY2hlIEFudAotICBQcm9qZWN0IHdlYiBzaXRlIDxodHRwOi8vYW50LmFwYWNoZS5vcmcvPi4KKyAgUHJvamVjdCB3ZWIgc2l0ZSA8aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8+LgogCiAKICAgRG9jdW1lbnRhdGlvbgogICAtLS0tLS0tLS0tLS0tCiAKLSAgRG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgaW4gSFRNTCBmb3JtYXQsIGluIHRoZSBkb2NzLyBkaXJlY3RvcnkuCisgIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGluIEhUTUwgZm9ybWF0LCBpbiB0aGUgbWFudWFsLyBkaXJlY3RvcnkuCiAgIEZvciBpbmZvcm1hdGlvbiBhYm91dCBidWlsZGluZyBhbmQgaW5zdGFsbGluZyBBbnQsIHNlZQotICBkb2NzL21hbnVhbC9pbmRleC5odG1sCi0KKyAgbWFudWFsL2luc3RhbGwuaHRtbAorICBUaGUgbWFudWFsIGZvciB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgQW50IGlzIGF2YWlsYWJsZSBvbmxpbmUgYXQKKyAgPGh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2luZGV4Lmh0bWw+LgorICBUaGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIG1hbnVhbCBpcyBhdmFpbGFibGUgb25saW5lIGF0CisgIDxodHRwczovL3Jhd2dpdC5jb20vYXBhY2hlL2FudC9tYXN0ZXIvbWFudWFsL2luZGV4Lmh0bWw+LgogCiAgIExpY2Vuc2luZwogICAtLS0tLS0tLS0KQEAgLTY5LDcgKzcyLDcgQEAKICAgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIAogICBjaGVjayB5b3VyIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUKICAgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gCi0gIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC4gIFNlZSA8aHR0cDovL3d3dy53YXNzZW5hYXIub3JnLz4gZm9yIG1vcmUKKyAgc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLiAgU2VlIDxodHRwczovL3d3dy53YXNzZW5hYXIub3JnLz4gZm9yIG1vcmUKICAgaW5mb3JtYXRpb24uCiAKICAgVGhlIFUuUy4gR292ZXJubWVudCBEZXBhcnRtZW50IG9mIENvbW1lcmNlLCBCdXJlYXUgb2YgSW5kdXN0cnkgYW5kCkBAIC04OCwxMCArOTEsMTAgQEAKICAgRm9yIHRoZSBTU0ggZmFtaWx5IG9mIHRhc2tzICg8c3NoZXhlYz4gYW5kIDxzY3A+KSBBbnQgcmVxdWlyZXMgdGhlCiAgIEpTY2ggPGh0dHA6Ly93d3cuamNyYWZ0LmNvbS9qc2NoL2luZGV4Lmh0bWw+IGxpYnJhcnkgYXMgd2VsbCBhcyB0aGUKICAgSmF2YSBDcnlwdG9ncmFwaHkgZXh0ZW5zaW9ucwotICA8aHR0cDovL2phdmEuc3VuLmNvbS9qYXZhc2UvdGVjaG5vbG9naWVzL3NlY3VyaXR5Lz4uICBBbnQgZG9lcyBub3QKKyAgPGh0dHBzOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhc2UvdGVjaC9pbmRleC1qc3AtMTM2MDA3Lmh0bWw+LiAgQW50IGRvZXMgbm90CiAgIGluY2x1ZGUgdGhlc2UgbGlicmFyaWVzIGl0c2VsZiwgYnV0IGlzIGRlc2lnbmVkIHRvIHVzZSB0aGVtLgogCiAgIFRoYW5rcyBmb3IgdXNpbmcgQW50LgogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgQXBhY2hlIEFudCBQcm9qZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxodHRwOi8vYW50LmFwYWNoZS5vcmcvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8+CmRpZmYgLS1naXQgYS9SZWxlYXNlSW5zdHJ1Y3Rpb25zIGIvUmVsZWFzZUluc3RydWN0aW9ucwppbmRleCA0OGQ1ZTBhLi5iYjljMGFhIDEwMDY0NAotLS0gYS9SZWxlYXNlSW5zdHJ1Y3Rpb25zCisrKyBiL1JlbGVhc2VJbnN0cnVjdGlvbnMKQEAgLTUsOCArNSw5IEBACiAgICAgICAgICBNYWdlc2ggVW1hc2Fua2FyCiAgICAgICAgICBBbnRvaW5lIExldnktTGFtYmVydAogCi1Ob3RlOiBUaGlzIGRvY3VtZW50IHdhcyB1cGRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHJlbGVhc2luZyBBbnQKLSAgICAgIDEuOS43IHdoaWNoIHdhcyB0aGUgZmlyc3QgcmVsZWFzZSBjdXQgZnJvbSB0aGUgMS45LnggYnJhbmNoLgorTm90ZTogVGhpcyBkb2N1bWVudCB3YXMgYWRhcHRlZCBmcm9tIHRoZSBvbmUgY3JlYXRlZCBpbiB0aGUgY29udGV4dCBvZgorICAgICAgcmVsZWFzaW5nIEFudCAxLjkuNy4gSXQgYXNzdW1lcyB0aGUgZmlyc3QgcmVsZWFzZSBjcmVhdGVkIGZyb20KKyAgICAgIG1hc3RlciB3aWxsIGJlIDEuMTAuCiAgICAgICBQbGVhc2UgaW50ZXJwcmV0IHRoZSBicmFuY2ggbmFtZXMsIHRhZ3MsIGV0Yy4gYWNjb3JkaW5nIHRvCiAgICAgICB5b3VyIGNvbnRleHQuCiAKQEAgLTMxLDcgKzMyLDcgQEAKIAogMi4gIEVuc3VyZSB5b3UgaGF2ZSBhbGwgdGhlIGV4dGVybmFsIGxpYnJhcmllcyB0aGF0IEFudCB1c2VzIGluIHlvdXIKICAgICBsaWIvb3B0aW9uYWwgZGlyZWN0b3J5LiAgQWxsIGRlcGVuZGVuY2llcyBhcmUgZWl0aGVyIHByb3ZpZGVkIGJ5Ci0gICAgSkRLIDEuNS4wIG9yIGRvd25sb2FkYWJsZSB1c2luZworICAgIEpESyAxLjguMCBvciBkb3dubG9hZGFibGUgdXNpbmcKICAgICBhbnQgLWYgZmV0Y2gueG1sIC1EZGVzdD1vcHRpb25hbAogICAgIFRvIGZpbmQgb3V0IHdoZXRoZXIgeW91IGhhdmUgYWxsIHRoZSBsaWJyYXJpZXMgeW91IG5lZWQsIGV4ZWN1dGUKICAgICB0aGUgYnVpbGQgd2l0aCAtdmVyYm9zZSBvcHRpb24gYW5kIHNjYW4gZm9yIGxpbmVzIGJlZ2lubmluZyB3aXRoCkBAIC00Miw2ICs0MywxMCBAQAogICAgIHRoZSByaWdodCB5ZWFyIGFuZCBjb21taXQgYW5kIHB1c2ggdGhlIGNoYW5nZSB1cHN0cmVhbSwgYmVmb3JlCiAgICAgc3RhcnRpbmcgYW55IHJlbGVhc2UgcHJvY2Vzcy4KIAorICAgIFRoZXJlIGFyZSBjZXJ0YWluIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSBKREsgOSsgdmVyc2lvbiB0byBiZSB1c2VkCisgICAgd2hpbGUgcmVsZWFzaW5nIEFudCAxLjEwLnggZnJvbSBtYXN0ZXIgYnJhbmNoLiBNYWtlIHN1cmUgSkFWQV9IT01FCisgICAgcG9pbnRzIHRvIGEgSkRLIGluc3RhbGxhdGlvbiB3aGljaCBpcyBtaW5pbWFsbHkgSmF2YSA5LgorCiAgICAgWW91IHdpbGwgbmVlZCB0byBoYXZlIHRoZSBzbmFwY3JhZnQgQ0xJIHRvb2wgaW5zdGFsbGVkIGluIG9yZGVyIHRvCiAgICAgY3JlYXRlIGFuZCBwdWJsaXNoIHNuYXAgYXJjaGl2ZXMuIFNlZQogICAgIGh0dHBzOi8vZG9jcy5zbmFwY3JhZnQuaW8vc25hcGNyYWZ0LW92ZXJ2aWV3CkBAIC01MSw5ICs1Niw5IEBACiAzLiAgV2UgZG9uJ3Qgd2FudCB0YWdzIGZvciBmYWlsZWQgdm90ZXMgdG8gZW5kIHVwIG9uIG91ciBicmFuY2hlcyBzbwogICAgIHRoZSByZWxlYXNlIGlzIGZpcnN0IGNyZWF0ZWQgZnJvbSBhIGRldGFjaGVkIGhlYWQuCiAKLSAgICBDaGVja291dCB0aGUgSEVBRCBvZiB0aGUgMS45LnggYnJhbmNoIGFzIGEgZGV0YWNoZWQgaGVhZDoKKyAgICBDaGVja291dCB0aGUgSEVBRCBvZiB0aGUgbWFzdGVyIGJyYW5jaCBhcyBhIGRldGFjaGVkIGhlYWQ6CiAKLSAgICAkIGdpdCBjaGVja291dCAxLjkueF4wCisgICAgJCBnaXQgY2hlY2tvdXQgbWFzdGVyXjAKIAogNC4gIE1ha2Ugc3VyZSB0aGF0IHlvdXIgZGlyZWN0b3J5IHRyZWUgaXMgY2xlYW4gYnkgcnVubmluZyBnaXQgc3RhdHVzLgogICAgIFNvbWUgdGVzdHMgbGVhdmUgYmVoaW5kIGxlZnRvdmVycyB3aGljaCBlbmQgdXAgaW4gdGhlIHNvdXJjZQpAQCAtNjgsMTggKzczLDI3IEBACiAgICAgKiBQT00gZmlsZXMgdW5kZXIgc3JjL2V0Yy9wb21zIGFuZCBzdWJkaXJlY3RvcmllcwogICAgICAgaWYgeW91J3ZlIGdvdCBtdm4gaW5zdGFsbGVkCiAKLSAgICAgICQgbXZuIHZlcnNpb25zOnNldCAtRG5ld1ZlcnNpb249MS45LjcgLURnZW5lcmF0ZUJhY2t1cFBvbXM9ZmFsc2UKKyAgICAgICQgbXZuIHZlcnNpb25zOnNldCAtRG5ld1ZlcnNpb249MS4xMC4wIC1EZ2VuZXJhdGVCYWNrdXBQb21zPWZhbHNlCiAKICAgICAgIGluc2lkZSBzcmMvZXRjL3BvbXMgc2hvdWxkIGRvIHRoZSB0cmljay4KIAogICAgICogaXZ5LnhtbCBpbiByZWxlYXNlIHN1YmRpcmVjdG9yeSAodmVyc2lvbiBzaG91bGQgYWxyZWFkeSBiZSBjb3JyZWN0IGhlcmUpCiAgICAgKiBXSEFUU05FVyAodmVyc2lvbiBzaG91bGQgYWxyZWFkeSBiZSBjb3JyZWN0IGhlcmUpCiAgICAgKiBzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2FudHZlcnNpb24ueG1sICh2ZXJzaW9uIHNob3VsZCBhbHJlYWR5IGJlIGNvcnJlY3QgaGVyZSkKLSAgICAqIHNuYXAvc25hcGNyYWZ0LnltbAorICAgICogc25hcC9zbmFwY3JhZnQueWFtbCAtIGNoYW5nZSB0aGUgdmFsdWUgZm9yICJ2ZXJzaW9uIiBhdHRyaWJ1dGUuIFBsdXMsIGNoYW5nZSB0aGUgdmFsdWUgZm9yICJncmFkZSIKKyAgICAgIHRvICJzdGFibGUiLgogCiA2LiAgTmV4dCBib290c3RyYXAsIGJ1aWxkIGFuZCBydW4gdGhlIHRlc3RzLgogCiAgICAgJCAuL2Jvb3RzdHJhcC5zaAorCisgICAgTWFrZSBzdXJlIHRoZSBsb2cgbWVzc2FnZXMgZG9lc24ndCBjb250YWluIHRoZSBtZXNzYWdlOgorCisgICAgIkphdmEgOSsgZmVhdHVyZXMgd29uJ3QgYmUgYXZhaWxhYmxlIGluIHRoZSBkaXN0cmlidXRpb24iCisKKyAgICBJZiBpdCBkb2VzLCB0aGVuIGl0J3MgYSBzaWduIHRoYXQgSkFWQV9IT01FIGlzbid0IHBvaW50aW5nIHRvIGEgSkRLIDkrIHZlcnNpb24uCisgICAgRml4IEpBVkFfSE9NRSB0byBwb2ludCB0byBhIHZhbGlkIEpESyA5KyB2ZXJzaW9uIGFuZCByZWRvIHRoZSByZWxlYXNlIHN0ZXBzLgorCiAgICAgJCAuL2J1aWxkLnNoCiAgICAgJCAuL2J1aWxkLnNoIHRlc3QKICAgICAjIGlmIHlvdSd2ZSBnb3QgbWF2ZW4gaW5zdGFsbGVkCkBAIC05NCwxMSArMTA4LDEyIEBACiAgICAgJCAuL2Rpc3QvYmluL2FudCAtbm91c2VybGliIC1saWIgbGliL29wdGlvbmFsIGRpc3RyaWJ1dGlvbgogCiAgICAgYnVpbGQueG1sIHNwZWNpZmllcyB0aGF0IHRoZSBjb2RlIHNob3VsZCBiZSBjb21waWxlZCB3aXRoCi0gICAgc291cmNlPTEuNSBhbmQgdGFyZ2V0PTEuNS4KKyAgICBzb3VyY2U9MS44IGFuZCB0YXJnZXQ9MS44LgogCiA4LiAgQ29tbWl0IHlvdXIgY2hhbmdlcywgdGFnIHRoZW0sIHB1c2ggdGhlbS4KIAotICAgICQgZ2l0IHRhZyAtcyAtbSAiVGFnZ2luZyBSQzEgZm9yIHZlcnNpb24gMS45Ljcgb2YgQW50IiBBTlRfMTk3X1JDMQorICAgICQgZ2l0IGNvbW1pdCAtbSAiUHJlcGFyZSBmb3IgUkMxIG9mIHZlcnNpb24gMS4xMC4wIG9mIEFudCIgLi8KKyAgICAkIGdpdCB0YWcgLXMgLW0gIlRhZ2dpbmcgUkMxIGZvciB2ZXJzaW9uIDEuMTAuMCBvZiBBbnQiIEFOVF8xLjEwLjBfUkMxCiAgICAgJCBnaXQgcHVzaCAtLXRhZ3MKIAogOS4gIEVuc3VyZSB0aGF0IHRoZSBHUEcga2V5IHlvdSB1c2UgaXMgaW5zaWRlIHRoZSBLRVlTIGZpbGUgaW4gQW50J3MKQEAgLTE1NiwxMiArMTcxLDEyIEBACiAgICAgVGhpcyB0YXJnZXQgZ2VuZXJhdGVzIGEgZmlsZSBidWlsZC9odG1sL1dIQVRTTkVXLmh0bWwKIAogICAgIEFkZCBhbiBodG1sIGhlYWQgZWxlbWVudCB3aXRoIGEgdGl0bGUgbGlrZSAiUmVsZWFzZSBOb3RlcyBvZiBBcGFjaGUgQW50Ci0gICAgMS45LjciIChmcm9tIHRoZSBkZWZhdWx0IHR4dDJodG1sKQorICAgIDEuMTAuMCIgKGZyb20gdGhlIGRlZmF1bHQgdHh0Mmh0bWwpCiAKICAgICBDdXQgYWxsIHNlY3Rpb25zIGFib3V0IHByZXZpb3VzIHJlbGVhc2VzIHRvIGtlZXAgb25seSB0aGUgY3VycmVudCByZWxlYXNlLAotICAgIGFuZCBzYXZlIGFzICBSRUxFQVNFLU5PVEVTLTEuOS43Lmh0bWwgaW5zaWRlIHRoZSBkaXN0cmlidXRpb24gZm9sZGVyLgorICAgIGFuZCBzYXZlIGFzICBSRUxFQVNFLU5PVEVTLTEuMTAuMC5odG1sIGluc2lkZSB0aGUgZGlzdHJpYnV0aW9uIGZvbGRlci4KIAotICAgIENvcHkgdGhlIGNvbnRlbnRzIG9mIFJFTEVBU0UtTk9URVMtMS45LjcuaHRtbCBhbHNvIGludG8gUkVBRE1FLmh0bWwKKyAgICBDb3B5IHRoZSBjb250ZW50cyBvZiBSRUxFQVNFLU5PVEVTLTEuMTAuMC5odG1sIGFsc28gaW50byBSRUFETUUuaHRtbAogCiAxMi4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBub3cgcmVhZHkgdG8gZ28uCiAgICAgQ3JlYXRlIGEgU1ZOIHNhbmRib3ggb24geW91ciBjb21wdXRlciB3aXRoIGh0dHBzOi8vZGlzdC5hcGFjaGUub3JnL3JlcG9zL2Rpc3QvZGV2L2FudCBpbiBpdApAQCAtMjAwLDkgKzIxNSw5IEBACiAKICAgICAgICQgc25hcGNyYWZ0IGNsZWFuCiAgICAgICAkIHNuYXBjcmFmdCBzbmFwCi0gICAgICAkIHNuYXBjcmFmdCBwdXNoIC0tcmVsZWFzZSAxLjkvY2FuZGlkYXRlIGFudF8qLnNuYXAKKyAgICAgICQgc25hcGNyYWZ0IHB1c2ggLS1yZWxlYXNlIGNhbmRpZGF0ZSBhbnRfKi5zbmFwCiAKLSAgICBUaGlzIHdpbGwgcHVibGlzaCB0aGUgbmV3IHJlbGVhc2Ugc25hcCB0byB0aGUgMS45IHRyYWNrIG9uIHRoZQorICAgIFRoaXMgd2lsbCBwdWJsaXNoIHRoZSBuZXcgcmVsZWFzZSBzbmFwIHRvIHRoZSBsYXRlc3QgdHJhY2sgb24gdGhlCiAgICAgY2FuZGlkYXRlIHJpc2sgbGV2ZWwuIEl0IHdpbGwgYmUgbW92ZWQgdG8gc3RhYmxlLCBvbmNlIHRoZSB2b3RlCiAgICAgaGFzIHBhc3NlZC4KIApAQCAtMjE5LDkgKzIzNCwxMyBAQAogMTYuIElmIHRoZSB2b3RlIGZhaWxzLCBhZGRyZXNzIHRoZSBwcm9ibGVtcyBhbmQgcmVjcmVhdGUgdGhlIG5leHQgUkMKICAgICBidWlsZC4KIAotMTcuIE9uY2UgdGhlIHZvdGUgaGFzIHBhc3NlZCwgdGFnIHRoZSBsYXN0IFJDIGNyZWF0ZWQgd2l0aCB0aGUgZmluYWwgdGFnCisxNy4gT25jZSB0aGUgdm90ZSBoYXMgcGFzc2VkLCB0YWcgdGhlIGxhc3QgUkMgY3JlYXRlZCB3aXRoIHRoZSBmaW5hbCB0YWcuCisgICAgSXQgaXMgaW1wb3J0YW50IHRvIHRhZyB0aGUgcmVsZWFzZSB1bmRlciB0aGUgInJlbC8iIHBhdGggc2luY2UgdGhlCisgICAgQXBhY2hlIGluZnJhc3RydWN0dXJlIGZvciAuZ2l0IHByb3ZpZGVzIGNlcnRhaW4gcHJvdGVjdGlvbnMgZm9yIHRhZ3MKKyAgICB1bmRlciB0aGUgInJlbC8iIHBhdGguIFJlbGVhc2VzIG5lZWQgc3VjaCBwcm90ZWN0aW9ucyBhcyBwZXIgQXBhY2hlCisgICAgcmVsZWFzZSBndWlkZWxpbmVzLgogCi0gICAgJCBnaXQgdGFnIC1zIC1tICJUYWdnaW5nIHZlcnNpb24gMS45Ljcgb2YgQW50IiByZWwvMS45LjcgSEFTSF9PRl9MQVNUX1JDCisgICAgJCBnaXQgdGFnIC1zIC1tICJUYWdnaW5nIHZlcnNpb24gMS4xMC4wIG9mIEFudCIgcmVsLzEuMTAuMCBIQVNIX09GX0xBU1RfUkMKICAgICAkIGdpdCBwdXNoIC0tdGFncwogCiAxOC4gVGhlIGRpc3RyaWIgYXJ0aWZhY3RzIHNob3VsZCBiZSBwdWJsaXNoZWQgdGhlIGFwYWNoZSBkaXN0LiBJdCBpcwpAQCAtMjQ5LDQzICsyNjgsNDcgQEAKICAgICBodHRwczovL3JlcG9ydGVyLmFwYWNoZS5vcmcvYWRkcmVsZWFzZS5odG1sP2FudAogCiAyMC4gQWRkcmVzcyB0aGUgYXZhaWxhYmxlIHZlcnNpb24gdGFncyBpbiBCdWdaaWxsYS4gQ3JlYXRlIG5ldwotICAgIG1pbGVzdG9uZSAxLjkuOCBhbmQgdmVyc2lvbiAxLjkuNy4KKyAgICBtaWxlc3RvbmUgMS4xMC4xIGFuZCB2ZXJzaW9uIDEuMTAuMC4KIAogMjEuIEFkZCBhIG5ldyByZWxlYXNlIHRhZyB0byBkb2FwX0FudC5yZGYgaW4gQW50J3Mgc2l0ZS4KIAotMjIuIGNoZWNrb3V0IHRoZSAxLjkueCBicmFuY2gsIG1lcmdlIHRoZSB0YWcgYnV0IGRvbid0IHB1c2ggdGhlCisyMi4gY2hlY2tvdXQgdGhlIG1hc3RlciBicmFuY2gsIG1lcmdlIHRoZSB0YWcgYnV0IGRvbid0IHB1c2ggdGhlCiAgICAgY29tbWl0CiAKLSAgICAkIGdpdCBjaGVja291dCAxLjkueAotICAgICQgZ2l0IG1lcmdlIHJlbC8xLjkuNworICAgIFtpZiBhIHJlbGVhc2Ugb2YgQW50IDEuOS54IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUsIGRlYWwgd2l0aAorICAgIHRoZSAxLjkueCB0YWcgb24gdGhlIDEuOS54IGJyYW5jaCBmaXJzdCBhbmQgbWVyZ2UgdGhlIDEuOS54IGJyYW5jaAorICAgIHRvIG1hc3RlciBiZWZvcmUgcHJvY2VlZGluZyBoZXJlXQorCisgICAgJCBnaXQgY2hlY2tvdXQgbWFzdGVyCisgICAgJCBnaXQgbWVyZ2UgcmVsLzEuMTAuMAogCiAgICAgU2V0IHRoZSB2ZXJzaW9uIG51bWJlciBpbiBzZXZlcmFsIGZpbGVzIHRvIHRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mCi0gICAgdGhlIG5leHQgMS45LnggcmVsZWFzZS4gVGhlc2UgYXJlOgorICAgIHRoZSBuZXh0IDEuMTAueCByZWxlYXNlLiBUaGVzZSBhcmU6CiAKICAgICAqIG1hbnVhbC9jb3Zlci5odG1sCiAgICAgKiBtYW51YWwvY3JlZGl0cy5odG1sCiAgICAgKiBidWlsZC54bWwgcHJvcGVydGllcyA6IHByb2plY3QudmVyc2lvbixtYW5pZmVzdC12ZXJzaW9uLHBvbS52ZXJzaW9uCiAKICAgICAgIHByb2plY3QudmVyc2lvbiBwcm9wZXJ0eSBpbiBidWlsZC54bWwgZ2V0cyBidW1wZWQgdG8KLSAgICAgIFtuZXd2ZXJzaW9uXWFscGhhLCBmb3IgZXhhbXBsZSAxLjkuOGFscGhhCisgICAgICBbbmV3dmVyc2lvbl1hbHBoYSwgZm9yIGV4YW1wbGUgMS4xMC4xYWxwaGEKIAogICAgICAgbWFuaWZlc3QtdmVyc2lvbiBnZXRzIGJ1bXBlZCB0byB0aGUgZXhhY3QgbmV4dCByZWxlYXNlIG51bWJlcgotICAgICAgZm9yIGV4YW1wbGUgMS45LjguCisgICAgICBmb3IgZXhhbXBsZSAxLjEwLjEuCiAKICAgICAgIHBvbS52ZXJzaW9uIGdldHMgYnVtcGVkIHRvIFtuZXd2ZXJzaW9uXS1TTkFQU0hPVAotICAgICAgZm9yIGV4YW1wbGUgMS45LjgtU05BUFNIT1QuCisgICAgICBmb3IgZXhhbXBsZSAxLjEwLjEtU05BUFNIT1QuCiAKICAgICAqIFBPTSBmaWxlcyB1bmRlciBzcmMvZXRjL3BvbXMgYW5kIHN1YmRpcmVjdG9yaWVzCiAgICAgICBpZiB5b3UndmUgZ290IG12biBpbnN0YWxsZWQKIAotICAgICAgJCBtdm4gdmVyc2lvbnM6c2V0IC1EbmV3VmVyc2lvbj0xLjkuOC1TTkFQU0hPVCAtRGdlbmVyYXRlQmFja3VwUG9tcz1mYWxzZQorICAgICAgJCBtdm4gdmVyc2lvbnM6c2V0IC1EbmV3VmVyc2lvbj0xLjEwLjEtU05BUFNIT1QgLURnZW5lcmF0ZUJhY2t1cFBvbXM9ZmFsc2UKIAogICAgICAgaW5zaWRlIHNyYy9ldGMvcG9tcyBzaG91bGQgZG8gdGhlIHRyaWNrLgogCiAgICAgKiBpdnkueG1sIGluIHJlbGVhc2Ugc3ViZGlyZWN0b3J5CiAgICAgKiBXSEFUU05FVyAoYWRkIGEgbmV3IHNlY3Rpb24pCiAgICAgKiBzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2FudHZlcnNpb24ueG1sCi0gICAgKiBzbmFwL3NuYXBjcmFmdC55bWwgKGJ1bXAgdmVyc2lvbiB0byBbbmV3dmVyc2lvbl1hbHBoYSkKKyAgICAqIHNuYXAvc25hcGNyYWZ0LnlhbWwgLSBidW1wIHZlcnNpb24gdG8gW25ld3ZlcnNpb25dYWxwaGEgYW5kIGNoYW5nZSB2YWx1ZSBvZiAiZ3JhZGUiIHRvICJkZXZlbCIKIAogICAgIEFtZW5kIHRoZSBtZXJnZSBjb21taXQKIApAQCAtMjkzLDIyICszMTYsMjAgQEAKICAgICAkIGdpdCBjb21taXQgLWEgLS1hbWVuZAogICAgICQgZ2l0IHB1c2gKIAotMjIuIGNoZWNrb3V0IHRoZSBtYXN0ZXIgYnJhbmNoLCBtZXJnZSB0aGUgMS45LnggYnJhbmNoCi0KLSAgICAkIGdpdCBjaGVja291dCBtYXN0ZXIKLSAgICAkIGdpdCBtZXJnZSAxLjkueAotICAgICQgZ2l0IHB1c2gKLQotMjQuIGNvcHkgdGhlIGNhbmRpZGF0ZSBzbmFwcyB0byBzdGFibGUuIEZpcnN0IGZpZ3VyZSBvdXQgdGhlIHJldmlzaW9uCisyMy4gY29weSB0aGUgY2FuZGlkYXRlIHNuYXBzIHRvIHN0YWJsZS4gRmlyc3QgZmlndXJlIG91dCB0aGUgcmV2aXNpb24KIAogICAgICQgc25hcGNyYWZ0IHN0YXR1cyBhbnQKLSAgICAkIHNuYXBjcmFmdCByZWxlYXNlIGFudCBSRVZJU0lPTiAxLjkvc3RhYmxlCisgICAgJCBzbmFwY3JhZnQgcmVsZWFzZSBhbnQgUkVWSVNJT04gbGF0ZXN0L3N0YWJsZQorICAgICQgc25hcGNyYWZ0IHJlbGVhc2UgYW50IFJFVklTSU9OIDEuMTAvc3RhYmxlCiAKLSAgICB3aGVyZSBSRVZJU0lPTiBpcyB0aGUgcmV2aXNpb24geW91IHdhbnQgdG8gcHJvbW90ZQorICAgIHdoZXJlIFJFVklTSU9OIGlzIHRoZSByZXZpc2lvbiB5b3Ugd2FudCB0byBwcm9tb3RlIChrZWVwIGluIG1pbmQgdGhhdCB0aGUKKyAgICBSRVZJU0lPTiBpc24ndCB0aGUgdmVyc2lvbiB5b3UgYXJlIHJlbGVhc2luZy4gc25hcGNyYWZ0IHVzZXMgaXRzIG93biBzZXBhcmF0ZSBpbnRlZ2VyCisgICAgdmFsdWUgZm9yIHRoZSBSRVZJU0lPTiBhbmQgdGhpcyB2YWx1ZSBpcyBsaXN0ZWQgYXMgdGhlIG91dHB1dCBvZiB0aGUgcHJldmlvdXMKKyAgICAic25hcGNyYWZ0IHN0YXR1cyBhbnQiIGNvbW1hbmQpCiAKLTI1LiB3YWl0IGEgZmV3IGhvdXJzIGZvciB0aGUgbWlycm9ycyB0byBjYXRjaCB1cAorMjQuIHdhaXQgYSBmZXcgaG91cnMgZm9yIHRoZSBtaXJyb3JzIHRvIGNhdGNoIHVwCiAKLTI2LiBVcGRhdGUgdGhlIGFudC5hcGFjaGUub3JnIHNpdGUgOgorMjUuIFVwZGF0ZSB0aGUgYW50LmFwYWNoZS5vcmcgc2l0ZSA6CiAKICAgICBUaGUgd2Vic2l0ZSBpcyBtYW5hZ2VkIGhlcmU6IGh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC9zaXRlL2FudC8KIApAQCAtMzE2LDYgKzMzNywxMCBAQAogICAgIHRoZSBzaXRlIHN0aWxsIHVzZXMgc3ZuIGFuZCBBbnQgcHJvcGVyIHVzZXMgZ2l0IHRoZXJlIGN1cnJlbnRseSBpcwogICAgIG5vIHdheSB0byB1c2UgdGhlIHNjbSBmb3IgdGhpcy4KIAorICAgIFtUT0RPIG9uY2UgdGhlcmUgaXMgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgMS4xMC4wLCB3ZSdsbCBsaWtlbHkgbmVlZAorICAgIHRvIHJlc3RydWN0dXJlIHRoZSBzaXRlIHRvIGFsbG93IHR3byB2ZXJzaW9ucyBvZiB0aGUgbWFudWFsIHRvCisgICAgZXhpc3QgaW4gcGFyYWxsZWxdCisKICAgICBVcGRhdGUgdGhlIGZvbGxvd2luZyBmaWxlcyBmb3IgdmVyc2lvbiBudW1iZXI6CiAKICAgICAqIHNvdXJjZS9hbnRuZXdzLnhtbCAoQW5ub3VuY2VtZW50KQpAQCAtMzMwLDE3ICszNTUsMjAgQEAKICAgICBDb21taXQgdGhlIG1vZGlmaWVkL2dlbmVyYXRlZCBmaWxlcyBpbiB0aGUgJ3Byb2R1Y3Rpb24nIGZvbGRlciwgaXQgd2lsbCBnbwogICAgIGxpdmUgb24gYW50LmFwYWNoZS5vcmcgaW4gYSBtYXR0ZXIgb24gc2Vjb25kcy4KIAotMjcuIEF0IHRoaXMgcG9pbnQgaW4gdGltZSwgdGhlIHJlbGVhc2UgaXMgZG9uZSBhbmQgYW5ub3VuY2VtZW50cyBhcmUgbWFkZS4KKzI2LiBBdCB0aGlzIHBvaW50IGluIHRpbWUsIHRoZSByZWxlYXNlIGlzIGRvbmUgYW5kIGFubm91bmNlbWVudHMgYXJlIG1hZGUuCiAgICAgUEdQLXNpZ24geW91ciBhbm5vdW5jZW1lbnQgcG9zdHMuCiAKICAgICBBcGFjaGUgbWFpbGluZyBsaXN0cyB0aGF0IHNob3VsZCBnZXQgdGhlIGFubm91bmNlbWVudHM6CiAgICAgYW5ub3VuY2VAYXBhY2hlLm9yZywgZGV2QGFudCBhbmQgdXNlckBhbnQuCiAKLTI4LiBZb3UgY2FuIG5vdyByZWFjcXVhaW50IHlvdXJzZWxmIHdpdGggeW91ciBmYW1pbHkgYW5kIGZyaWVuZHMuCisyNy4gWW91IGNhbiBub3cgcmVhY3F1YWludCB5b3Vyc2VsZiB3aXRoIHlvdXIgZmFtaWx5IGFuZCBmcmllbmRzLgogCi0yOS4gQWZ0ZXIgYSBmZXcgZGF5cyAic3ZuIHJtIiB0aGUgb2xkZXIgcmVsZWFzZSBhcnRpZmFjdHMgYW5kIHJlbGVhc2UKKzI4LiBBZnRlciBhIGZldyBkYXlzICJzdm4gcm0iIHRoZSBvbGRlciByZWxlYXNlIGFydGlmYWN0cyBhbmQgcmVsZWFzZQogICAgIG5vdGVzIGZyb20gaHR0cHM6Ly9kaXN0LmFwYWNoZS5vcmcvcmVwb3MvZGlzdC9yZWxlYXNlL2FudC8KIAorICAgICJvbGRlciIgaGVyZSBtZWFucyBhbnkgb2xkZXIgMS4xMC54IHJlbGVhc2UgYnV0IG5vdCB0aGUgbGF0ZXN0CisgICAgMS45LnggcmVsZWFzZS4KKwogUmVsYXRlZCBJbmZvcm1hdGlvbgogCiBodHRwczovL3d3dy5hcGFjaGUub3JnL2Rldi8jcmVsZWFzZXMKQEAgLTM1Nyw3ICszODUsNyBAQAogICAgKiBpdnkueG1sIGluIHJlbGVhc2Ugc3ViZGlyZWN0b3J5CiAgICAqIFdIQVRTTkVXCiAgICAqIHNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvYW50dmVyc2lvbi54bWwKLSAgICogc25hcC9zbmFwY3JhZnQueW1sCisgICAqIHNuYXAvc25hcGNyYWZ0LnlhbWwKIAogY292ZXIuaHRtbCwgY3JlZGl0cy5odG1sLCBQT00gZmlsZXMsIGFudHZlcnNpb24ueG1sIHNob3VsZCBiZSAKIGFkanVzdGVkIGZvciB0aGUgW25ld3ZlcnNpb25dIHJpZ2h0IGFmdGVyIHRoZSBidWlsZCBhbmQgdGFnZ2luZyAKZGlmZiAtLWdpdCBhL1NUQVRVUyBiL1NUQVRVUwppbmRleCA4NzQzOTZkLi44YjZiNzEwIDEwMDY0NAotLS0gYS9TVEFUVVMKKysrIGIvU1RBVFVTCkBAIC0xLDEwICsxLDEwIEBACiBBcGFjaGUgQW50IFN0YXR1cwotTGFzdCBtb2RpZmllZCBhdCAyMDE2LTAyLTI0CitMYXN0IG1vZGlmaWVkIGF0IDIwMTYtMDQtMDkKIAogUmVsZWFzZToKLSAgICBDdXJyZW50OiAgICAgICAgMS45LjYgIChpbiBHSVQgVGFnOiBBTlRfMTk2KQotICAgIE1haW50ZW5hbmNlOiAgICAxLjkueCAgKGluIEdJVCBCcmFuY2g6IG1hc3RlcikKLSAgICBEZXZlbG9wbWVudDogICAgMS45LjcgIChpbiBHSVQgQnJhbmNoOiBtYXN0ZXIpCisgICAgQ3VycmVudDogICAgICAgIDEuOS42ICAoaW4gR0lUIFRhZzogcmVsLzEuOS42KQorICAgIE1haW50ZW5hbmNlOiAgICAxLjkueCAgKGluIEdJVCBCcmFuY2g6IDEuOS54KQorICAgIERldmVsb3BtZW50OiAgICAxLjEwLnggKGluIEdJVCBCcmFuY2g6IG1hc3RlcikKIAogQXNzZXRzOgogICAgIEROUzogICAgICAgICAgICAgICAgYW50LmFwYWNoZS5vcmcKQEAgLTE3LDcgKzE3LDcgQEAKICAgICBSZXBvc2l0b3JpZXM6ICAgICAgIGFudC5naXQKIAogUE1DIE1lbWJlcnMKLSBzZWUgaHR0cDovL2FudC5hcGFjaGUub3JnL2NvbnRyaWJ1dG9ycy5odG1sCisgc2VlIGh0dHBzOi8vYW50LmFwYWNoZS5vcmcvY29udHJpYnV0b3JzLmh0bWwKIAogQ29tbWl0dGVyczoKLSBzZWUgaHR0cDovL2FudC5hcGFjaGUub3JnL2NvbnRyaWJ1dG9ycy5odG1sCisgc2VlIGh0dHBzOi8vYW50LmFwYWNoZS5vcmcvY29udHJpYnV0b3JzLmh0bWwKZGlmZiAtLWdpdCBhL1dIQVRTTkVXIGIvV0hBVFNORVcKaW5kZXggNGY3ODQxYS4uNmE3NDE2MyAxMDA2NDQKLS0tIGEvV0hBVFNORVcKKysrIGIvV0hBVFNORVcKQEAgLTEsMjQgKzEsMTI3IEBACi1DaGFuZ2VzIGZyb20gQW50IDEuOS4xNCBUTyBBbnQgMS45LjE1CitDaGFuZ2VzIGZyb20gQW50IDEuMTAuNyBUTyBBbnQgMS4xMC44CiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisgKiAibGVnYWN5LXhtbCIgZm9ybWF0dGVyIG9mIGp1bml0bGF1bmNoZXIgdGFzayB3YXNuJ3Qgd3JpdGluZyBvdXQKKyAgIHRoZSBzdGFja3RyYWNlIGZvciBmYWlsdXJlcy4gVGhpcyBpcyBub3cgZml4ZWQuCisgICBCdWd6aWxsYSBSZXBvcnQgNjM4MjcKKworICogc3NoZXhlYyBmYWlsZWQgdG8gd3JpdGUgb3V0cHV0IHRvIGEgZmlsZSBpZiB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QKKworICogRml4ZXMgYSByZWdyZXNzaW9uIGluIGphdmFjIHRhc2sgaW52b2x2aW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgZmlsZXMuCisgICBCdWd6aWxsYSBSZXBvcnQgNjM4NzQKKworICogc3NoZXhlYywgc3Noc2Vzc2lvbiBhbmQgc2NwIG5vdyBzdXBwb3J0IGEgbmV3IHNzaENvbmZpZyBwYXJhbWV0ZXIuCisgICBJdCBzcGVjaWZpZWQgdGhlIFNTSCBjb25maWd1cmF0aW9uIGZpbGUgKHR5cGljYWxseSAke3VzZXIuaG9tZX0vLnNzaC9jb25maWcpCisgICBkZWZpbmluZyB0aGUgdXNlcm5hbWUgYW5kIGtleWZpbGUgdG8gYmUgdXNlZCBwZXIgaG9zdC4KKworICogImxlZ2FjeS14bWwiIGZvcm1hdHRlciBvZiBqdW5pdGxhdW5jaGVyIHRhc2sgd2Fzbid0IHdyaXRpbmcgb3V0CisgICBleGNlcHRpb25zIHRoYXQgaGFwcGVuIGluIEBCZWZvcmVBbGwgbWV0aG9kIG9mIGEgdGVzdC4gVGhpcyBpcyBub3cgZml4ZWQuCisgICBCdWd6aWxsYSBSZXBvcnQgNjM4NTAKKworICogQnVpbGRpbmcgQW50IGZyb20gc291cmNlIGNvdWxkIHJlc3VsdCBpbiB0aGUgamF2YWRvY3MgdGFyZ2V0IGZhaWxpbmcgaWYgdGhlCisgICBvcHRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBtaXNzaW5nLiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZC4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MzQzOAorCisgKiBGaXhlcyBhIHBvdGVudGlhbCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIFhNTExvZ2dlci4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MzkyMQorCisgKiBGaXhlcyBhIGJ1ZyBpbiBqdW5pdGxhdW5jaGVyIHRhc2sgaW4gZm9ya2VkIG1vZGUsIHdoZXJlIGlmIGEgbGlzdGVuZXIgZWxlbWVudAorICAgd2FzIHVzZWQgYXMgYSBzaWJsaW5nIGVsZW1lbnQgZm9yIGVpdGhlciB0aGUgdGVzdCBvciB0ZXN0Y2xhc3NlcyBlbGVtZW50LAorICAgdGhlbiB0aGUgZm9ya2VkIG1vZGUgbGF1bmNoIHdvdWxkIGZhaWwuCisgICBCdWd6aWxsYSBSZXBvcnQgNjM5NTgKKworICogRml4ZXMgYW4gaXNzdWUgaW4gQW50U3RydWN0dXJlIHdoZXJlIGFuIGluY29ycmVjdCBEVEQgd2FzIGJlaW5nIGdlbmVyYXRlZC4KKyAgIEdpdGh1YiBQdWxsIFJlcXVlc3QgIzExNgorCisgKiBGaXhlcyBhbiBpbmNvcnJlY3QgdmFyaWFibGUgbmFtZSB1c2FnZSBpbiBqdW5pdC1mcmFtZXMteGFsYW4xLnhzbC4KKyAgIEdpdGh1YiBQdWxsIFJlcXVlc3QgIzExNworCiBPdGhlciBjaGFuZ2VzOgogLS0tLS0tLS0tLS0tLS0KIAorICogb3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlIHdpbGwgbm93IHNlbmQgYSBmdWxseSBxdWFsaWZpZWQKKyAgIGRvbWFpbiBuYW1lIGluIGl0cyBIRUxPIG1lc3NhZ2UuCisgICBHaXRodWIgUHVsbCBSZXF1ZXN0ICMxMDEKKwogICogVGhlIHJ1bmFudC5weSBzY3JpcHQgc2hvdWxkIG5vdyB3b3JrIHdpdGggUHl0aG9uIDMuCiAgICBHaXRodWIgUHVsbCBSZXF1ZXN0ICM5NgogCisgKiB0c3RhbXAgdGFzayBub3cgaG9ub3JzIFNPVVJDRV9EQVRFX0VQT0NIIGVudmlyb25tZW50IHZhcmlhYmxlIGZvcgorICAgcmVwcm9kdWNpYmxlIGJ1aWxkcyAoaHR0cHM6Ly9yZXByb2R1Y2libGUtYnVpbGRzLm9yZy9zcGVjcy9zb3VyY2UtZGF0ZS1lcG9jaC8jaWRtNTUpCisgICBCdWd6aWxsYSBSZXBvcnQgNjI2MTcKKwogICogcm1pYyBoYXMgYmVlbiByZW1vdmVkIGZyb20gSmF2YSAxNS4gVGhlIHRhc2sgd2lsbCBub3cgdGhyb3cgYW4KICAgIGV4Y2VwdGlvbiBpZiB5b3UgdHJ5IHRvIHVzZSBpdCB3aGlsZSBydW5uaW5nIEphdmEgMTUgb3IgbmV3ZXIuCiAKICAqIGEgbmV3IHByb3BlcnR5IGFudC50bXBkaXIgcHJvdmlkZXMgaW1wcm92ZWQgY29udHJvbCBvdmVyIHRoZQogICAgbG9jYXRpb24gQW50IHVzZXMgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlcwogCi1DaGFuZ2VzIGZyb20gQW50IDEuOS4xMyBUTyBBbnQgMS45LjE0CitDaGFuZ2VzIGZyb20gQW50IDEuMTAuNiBUTyBBbnQgMS4xMC43Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ZpeGVkIGJ1Z3M6CistLS0tLS0tLS0tLQorCisgKiBGVFAgc3RpbGwgdHJpZXMgY2hlY2tpbmcgb3IgZW50ZXJpbmcgZGlyZWN0b3JpZXMgYWZ0ZXIgYSB0aW1lb3V0CisgICBCdWd6aWxsYSBSZXBvcnQgNjM0NTQKKworICoganVuaXRsYXVuY2hlciAtIGRvZXMgbm90IGRldGVjdCBmYWlsdXJlIGluIEBCZWZvcmVBbGwKKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MzQ3OQorCisgKiBFcnJvciB1c2luZyBhbnQtMS4xMC42IHdpdGggamRrOAorICAgQnVnemlsbGEgUmVwb3J0IDYzNDU3CisKKyAqIEZUUCB0YXNrIG5vIGxvbmdlciBkdXBsaWNhdGVzIGEgY2hlY2sgZm9yIGEgZmlsZSBiZWluZyBhIHN5bWxpbmsuCisgICBCdWd6aWxsYSBSZXBvcnQgNjMyNTkKKworICoganVuaXRsYXVuY2hlciB0YXNrLCB3aGVuIHVzZWQgaW4gZm9yayBtb2RlIHdpdGggIjx0ZXN0Y2xhc3Nlcz4iLAorICAgdXNlZCB0byBjcmVhdGUgdGhlIHdyb25nIG51bWJlciBvZiBsaXN0ZW5lcnMgcGVyIHRlc3QgY2xhc3MuIFRoaXMKKyAgIGhhcyBub3cgYmVlbiBmaXhlZC4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MzQ0NgorCisgKiBUaGUgImxlZ2FjeS14bWwiIGp1bml0bGF1bmNoZXIgdGFzaydzIGxpc3RlbmVyIHdvdWxkIG5vdCBpbmNsdWRlCisgICBAUGFyYW1ldGVyaXplZFRlc3QgdGVzdGNhc2VzIGluIGl0cyBYTUwgcmVwb3J0IGZpbGUuIFRoaXMgaGFzIG5vdworICAgYmVlbiBmaXhlZC4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MzY4MAorCitPdGhlciBjaGFuZ2VzOgorLS0tLS0tLS0tLS0tLS0KKworICogRlRQIHRhc2sgdGltZW91dCBpbXByb3ZlbWVudHMuCisgICBCdWd6aWxsYSBSZXBvcnRzIDYzMjUyIGFuZCA0NzQxNAorCisgKiBqdW5pdGxhdW5jaGVyIHRhc2sgbm93IHN1cHBvcnRzIHNlbGVjdGluZyB0ZXN0IGNsYXNzZXMgZm9yIGV4ZWN1dGlvbiwKKyAgIGJhc2VkIG9uIHRoZSBKVW5pdCA1IHRhZ3MsIHRocm91Z2ggdGhlIG5ldyAiaW5jbHVkZVRhZ3MiIGFuZAorICAgImV4Y2x1ZGVUYWdzIiBhdHRyaWJ1dGVzLgorCisgKiBwcmVmZXIgaHR0cHMgb3ZlciBodHRwIHdoZW4gYnVpbGRpbmcgYW50IGl0c2VsZiwgYW5kIGluIHRoZSBhbnQgCisgICBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2VzCisKKyAqIGNoYW5nZWQgdGhlIHJlZmVyZW5jZXMgYW5kIE1hdmVuIGNvb3JkaW5hdGVzIG9mIEphdmFNYWlsIGRlcGVuZGVuY3kKKyAgIHRvIEpha2FydGEgTWFpbCBhbmQgdGh1cyBqYXZheC5tYWlsIHRvIGpha2FydGEubWFpbCAtIGFuZCB1cGdyYWRlZAorICAgdGhlIGRlcGVuZGVuY3kgdG8gMS42LjMuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS4xMC41IFRPIEFudCAxLjEwLjYKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICogaW1hZ2UgdGFzayBubyBsb25nZXIgd29ya3Mgb24gSmF2YSA5KyBiZWNhdXNlIGludGVybmFsIGNsYXNzZXMKKyAgIHN1cHBvcnRpbmcgSmF2YSBBZHZhbmNlZCBJbWFnaW5nIGFyZSByZW1vdmVkOyBpbWFnZWlvIHRhc2sgKGJhc2VkIG9uCisgICBJbWFnZUlPIGFuZCBBV1QpIGlzIHByb3ZpZGVkIGFzIGEgcmVwbGFjZW1lbnQuCisKKyAqIGp1bml0bGF1bmNoZXIgdGFzayBoYXMgY2hhbmdlZCB0aGUgY2xhc3MgbmFtZXMgYW5kIHBhY2thZ2UgbmFtZXMgb2YKKyAgIHRoZSB0YXNrIGFzIHdlbGwgYXMgc29tZSBvZiB0aGUgc3VwcG9ydGluZyBjbGFzc2VzIG9mIHRoYXQgdGFzay4gSWYKKyAgIGFueSBjb2RlIGRlcGVuZGVkIG9uIHRoZXNlIGNsYXNzIG9yIHBhY2thZ2UgbmFtZXMsIHRoZXkgd2lsbCBoYXZlIHRvCisgICBiZSB1cGRhdGVkIHRvIHJlZmVyZW5jZSB0aGVzZSBuZXdseSBuYW1lZCBjbGFzc2VzLiBUaGlzIGhvd2V2ZXIsCisgICBkb2Vzbid0IGltcGFjdCBidWlsZCBzY3JpcHRzIGlmIHRoZWlyIHJlZmVyZW5jZSB0byBqdW5pdGxhdW5jaGVyIHRhc2sKKyAgIHdhcyBtZXJlbHkgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSA8anVuaXRsYXVuY2hlcj4gZWxlbWVudC4KKwogICogQ2xlYXJDYXNlI3J1blMgaGFzIGJlZW4gYXVnbWVudGVkIGJ5IGEgdHdvIGFyZy12ZXJzaW9uIGFuZCB0aGUKICAgIG9uZS1hcmcgdmVyc2lvbiB3aWxsIG5vIGxvbmdlciBiZSBjYWxsZWQuIFRoaXMgbWF5IGFmZmVjdAogICAgc3ViY2xhc3NlcyB0aGF0IGhhdmUgb3ZlcnJpZGRlbiBydW5TLgpAQCAtMzAsNiArMTMzLDEwIEBACiAgICBtYWlsIHRhc2suCiAgICBCdWd6aWxsYSBSZXBvcnQgNjI2MjEKIAorICogRml4ZXMgYW4gaXNzdWUgaW4ganVuaXRyZXBvcnQgdGFzaywgd2hpY2ggdXNlZCB0byB0aHJvdyBhCisgICBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gd2hlbiBzYXhvbiB3YXMgdXNlZCBvbiBXaW5kb3dzIE9TLgorICAgQnVnemlsbGEgUmVwb3J0IDYyNTk0CisKICAqIGF1Z21lbnQgdGFzayBub3cgdGhyb3dzIGEgQnVpbGRFeGNlcHRpb24gKGFzIG5vdGVkIGluIGl0cyBtYW51YWwpCiAgICBpbnN0ZWFkIG9mIGEgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIHRoZSBhYnNlbmNlIG9mIHRoZSAiaWQiIGF0dHJpYnV0ZS4KICAgIEJ1Z3ppbGxhIFJlcG9ydCA2MjY1NQpAQCAtMzgsMTAgKzE0NSwyOSBAQAogICAgYW4gaW5jb3JyZWN0IGNvbXByZXNzaW9uIGxldmVsIGZvciBhIHppcCBlbnRyeS4gVGhpcyBpcyBub3cgZml4ZWQuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjI2ODYKIAorICogc3luYyB0YXNrLCBpbiBzb21lIGNhc2VzIG9uIGNhc2UgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW1zLCB3b3VsZCBjb25zaWRlcgorICAgYSBmaWxlIGluIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IHRvIGJlIG9ycGhhbmVkIGFuZCB3b3VsZCBkZWxldGUgaXQuCisgICBUaGlzIHRhc2sgaGFzIG5vdyBiZWVuIGZpeGVkIHRvIGluZmVyIHRoZSBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBmaWxlc3lzdGVtCisgICBvZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgorICAgQnVnemlsbGEgUmVwb3J0IDYyODkwCisKKyAqIEZpeGVzIGEgcG90ZW50aWFsIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluCisgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0I2dldENvcHlPZlJlZmVyZW5jZXMuCisgICBHaXRodWIgUHVsbCBSZXF1ZXN0ICM4MQorCiAgKiBjY2NoZWNrb3V0IHdvdWxkIGlnbm9yZSBhbiBlcnJvciBvZiB0aGUgImxzIGNoZWNrb3V0IiBjb21tYW5kIGV2ZW4KICAgIGlmIGZhaWxPbkVycm9yIHdhcyBzZXQgdG8gZmFsc2UuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjMwNzEKIAorICogVGhlIGlzcmVhY2hhYmxlIGNvbmRpdGlvbiBjb3VsZCBpbiBzb21lIGNhc2VzIHJldHVybiB0cnVlIGV2ZW4gaWYgdGhlCisgICBhY3R1YWwgYWRkcmVzcyBjb3VsZCBwb3RlbnRpYWxseSBiZSB1bnJlYWNoYWJsZS4gVGhpcyBpcyBub3cgZml4ZWQKKyAgIGFuZCB0aGUgcmVzb2x2ZWQgYWRkcmVzcyBpcyBhY3R1YWxseSBjaGVja2VkIGZvciByZWFjaGFiaWxpdHkuCisKKyAqIEZpeGVzIGFuIGlzc3VlIHdoZXJlIHNjcCB0cmFuc2ZlciBjb21wbGV0aW9uIHRyYWNraW5nIHdhc24ndCBiZWluZworICAgdHJpZ2dlcmVkIGZvciAxMDAlIGNvbXBsZXRpb24uCisgICBHaXRodWIgUHVsbCBSZXF1ZXN0ICM5MQorCisKIE90aGVyIGNoYW5nZXM6CiAtLS0tLS0tLS0tLS0tLQogICogZ2VuZXJhdGVrZXkgdGFzayBub3cgc3VwcG9ydHMgU3ViamVjdEFsdGVybmF0aXZlTmFtZSBkdXJpbmcga2V5CkBAIC01MCw2ICsxNzYsOSBAQAogICogdGhlIDxtb2RpZmllZD4gc2VsZWN0b3IgaGFzIGEgbmV3IGJ1aWx0LWluIGFsZ29yaXRobSAnbGFzdG1vZGlmaWVkJwogICAgd2hpY2ggY29tcHV0ZXMgYSB2YWx1ZSBiYXNlZCB1cG9uIHRoZSBsYXN0bW9kaWZpZWQgdGltZSBvZiB0aGUgZmlsZS4KIAorICoganVuaXRsYXVuY2hlciB0YXNrIG5vdyBzdXBwb3J0cyBydW5uaW5nIHRlc3RzIGluIGEgZm9ya2VkIEpWTS4gTW9yZQorICAgZGV0YWlscyBhdmFpbGFibGUgaW4gdGhlIGp1bml0bGF1bmNoZXIgdGFzayBtYW51YWwuCisKICAqIHNpZ25qYXIgYW5kIHZlcmlmeWphciBub3cgc3VwcG9ydCB0aGUgLXByb3ZpZGVyTmFtZSwgLXByb3ZpZGVyQ2xhc3MKICAgIGFuZCAtcHJvdmlkZXJBcmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgb2Yga2V5dG9vbCB2aWEgbmV3IGF0dHJpYnV0ZXMuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjUyMzQKQEAgLTYxLDE2ICsxOTAsMzggQEAKICAqIGFkZGVkIHNldmVyYWwgYXR0cmlidXRlcyB0byA8amF2YWRvYz4gdGhhdCBzdXBwb3J0IG1vZHVsZXMuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjI0MjQKIAorICogcHJvcGVydGllcyB1c2VkIG9yIHNldCBieSBCdWlsZEZpbGVUYXNrL0J1aWxkRmlsZVJ1bGUgYXJlIGRvY3VtZW50ZWQKKyAgIGluIE1hZ2ljVGVzdE5hbWVzLiBBIG5ldyBtYWdpYyBwcm9wZXJ0eSwgYW50LnRlc3QuYmFzZWRpci5pZ25vcmUsIGlzCisgICBpbnRyb2R1Y2VkIGZvciBjYXNlcyB3aGVyZSBBbnQgcHJvamVjdHMgc2V0IHVwIGZvciB0ZXN0IHB1cnBvc2VzCisgICBtdXN0IGlnbm9yZSBiYXNlZGlyIHNldCBleHRlcm5hbGx5IGJ5IHRlc3QgaGFybmVzcy4KKworICogYSBuZXcgQ2hhclNldCB0eXBlIGlzIHByb3ZpZGVkIGZvciBlbmNvZGluZyBvciBjaGFyc2V0IGF0dHJpYnV0ZXMgaW4KKyAgIHRhc2tzIHRoYXQgbXVzdCBkZWFsIHdpdGggZGlmZmVyZW50IGNoYXJhY3RlciBlbmNvZGluZ3MgaW4gZmlsZXMsCisgICBmaWxlIG5hbWVzIGFuZCBvdGhlciBzdHJpbmcgcmVzb3VyY2VzLgorCisgKiBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlciBpcyBub3cgbXVsdGktcmVsZWFzZSBqYXIgYXdhcmUuCisgICBTdGFydGluZyBKYXZhIDksIGphciBmaWxlcyBjYW4gYmUgcGFja2FnZWQgYXMgbXVsdGktcmVsZWFzZSBqYXJzLAorICAgQW50Q2xhc3NMb2FkZXIgbm93IHJlY29nbml6ZXMgc3VjaCBtdWx0aS1yZWxlYXNlIGphciBmaWxlcyB3aGlsZQorICAgbG9hZGluZyByZXNvdXJjZXMgYXQgcnVudGltZSBpbiBKYXZhIDkrIHJ1bnRpbWUgZW52aXJvbm1lbnRzLgorICAgQnVnemlsbGEgUmVwb3J0IDYyOTUyCisKKyAqIEFkZGVkIGptb2QgYW5kIGxpbmsgdGFza3MsIHRvIHN1cHBvcnQgam1vZCBhbmQgamxpbmsgdG9vbHMgb2YgSkRLIDkrLgorICAgR2l0aHViIFB1bGwgUmVxdWVzdCAjODAKKwogICogSnNjaCBsaWJyYXJ5IGRlcGVuZGVuY3kgaGFzIG5vdyBiZWVuIHVwZ3JhZGVkIHRvIDAuMS41NS4gSnNjaCBpcwogICAgdGhlIGxpYnJhcnkgYmVoaW5kIHRoZSBzc2hleGVjIGFuZCBzY3AgQW50IHRhc2tzLgogICAgR2l0aHViIFB1bGwgUmVxdWVzdCAjODQKIAorICogVGhlICJodHRwIiBjb25kaXRpb24sIG5vdyBoYXMgYSAicmVhZFRpbWVvdXQiIGF0dHJpYnV0ZSB3aGljaCBjYW4gYmUKKyAgIHVzZWQgdG8gY29udHJvbCB0aGUgYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgdGhlIHJlYWQgdG8gY29tcGxldGUuCisgICBCdWd6aWxsYSBSZXBvcnQgNjMxOTMKKwogICogZnRwIHRhc2sgbWFudWFsIGhhcyBiZWVuIHVwZGF0ZWQgdG8gbWVudGlvbiB0aGF0IHRoZSByZW1vdGUgbGlzdGluZyBvZgogICAgZmlsZXMgaG9ub3VycyB0aGUgZm9sbG93c3ltbGlua3MgYXR0cmlidXRlLgogICAgQnVnemlsbGEgUmVwb3J0IDYzMjI2CiAKIAotQ2hhbmdlcyBmcm9tIEFudCAxLjkuMTIgVE8gQW50IDEuOS4xMworQ2hhbmdlcyBmcm9tIEFudCAxLjEwLjQgVE8gQW50IDEuMTAuNQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBGaXhlZCBidWdzOgpAQCAtODcsNyArMjM4LDEyIEBACiAgICByb290LgogICAgQnVnemlsbGEgUmVwb3J0IDYyNTAyCiAKLUNoYW5nZXMgZnJvbSBBbnQgMS45LjExIFRPIEFudCAxLjkuMTIKK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorICogSmF2YSB0YXNrIG5vdyBhY2NlcHRzIGEgInNvdXJjZWZpbGUiIGF0dHJpYnV0ZSB0byBhbGxvdyBzaW5nbGUgZmlsZQorICAgc291cmNlIHByb2dyYW0gZXhlY3V0aW9uLCBhIGZlYXR1cmUgdGhhdCBpcyBpbnRyb2R1Y2VkIGluIEphdmEgMTEuCisKK0NoYW5nZXMgZnJvbSBBbnQgMS4xMC4zIFRPIEFudCAxLjEwLjQKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKQEAgLTExNyw2ICsyNzMsMTUgQEAKICAqIFRoZSBqdW5pdCB0YXNrIHdoZW4gdXNlZCB3aXRoIGluY2x1ZGVhbnRydW50aW1lPSJubyIgd2FzIGluY29ycmVjdGx5CiAgICBwcmludGluZyBhIHdhcm5pbmcgYWJvdXQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgYW50IGRldGVjdGVkIGluIHBhdGgKIAorICogPGNhYj4gZGllZCB3aXRoIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gc2luY2UgQW50IDEuMTAuMi4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MjMzNQorCisgKiBUaGUgPGRlcGVuZD4gdGFzayB3b3VsZCBmYWlsIHdpdGgKKyAgICJqYXZhLmxhbmcuQ2xhc3NGb3JtYXRFcnJvcjogSW52YWxpZCBDb25zdGFudCBQb29sIGVudHJ5IFR5cGUgMTkiIHdoaWxlCisgICBwYXJzaW5nIGEgbW9kdWxlLWluZm8uY2xhc3MuIFRoZSB0YXNrIGlzIGNvbXBhdGlibGUgd2l0aAorICAgSmF2YSBieXRlY29kZSB2ZXJzaW9uIDUzIG5vdy4KKyAgIEJ1ZyByZXBvcnRlZCBieSBTaW1vbiBJSnNrZXMgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9ORVRCRUFOUy03ODEKKwogICogRGVmYXVsdCBhbmQgU2VjdXJlSW5wdXRIYW5kbGVyIHdpbGwgbm93IHJhaXNlIGFuIGVycm9yIHdoZW4gdGhlbgogICAgZW5kIG9mIHRoZSBpbnB1dCBzdHJlYW0gKHVzdWFsbHkgU3lzdGVtLmluIG9yIFN5c3RlbS5jb25zb2xlKSBhcmUKICAgIHJlYWNoZWQgYmVmb3JlIGEgdmFsaWQgaW5wdXQgaGFzIGJlZW4gcmVhZC4KQEAgLTEyOCw2ICsyOTMsOSBAQAogT3RoZXIgY2hhbmdlczoKIC0tLS0tLS0tLS0tLS0tCiAKKyAqIEFudEFzc2VydCBpcyBkZXByZWNhdGVkLCBhc3NlcnRUaGF0IGZyb20gSlVuaXQgNC40KywgSGFtY3Jlc3QgbWF0Y2hlcnMgYW5kL29yCisgICBFeHBlY3RlZEV4Y2VwdGlvbiBydWxlIHByb3ZpZGUgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5CisKICAqIFB1bXBTdHJlYW1IYW5kbGVyIG5vdyBleHBsaWNpdGx5IHZlcmlmaWVzIHRoZSBzdHJlYW1zIGZvciBvdXRwdXQKICAgIGFuZCBlcnJvciBhcmUgbm90IG51bGwgYW5kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXkKICAgIGFyZS4gVGhpcyB3YXkgY3JlYXRpbmcgYSBQdW1wU3RyZWFtSGFuZGxlciB3aWxsIGZhaWwgZWFybHkgYXMKQEAgLTE0MCw2ICszMDgsMTEgQEAKICAgIGF2YWlsYWJsZVByb2Nlc3NvcnMsIGZyZWVNZW1vcnksIG1heE1lbW9yeSBhbmQgdG90YWxNZW1vcnkgbWV0aG9kcwogICAgb2YgdGhlIEphdmEgUnVudGltZSBjbGFzcy4KIAorICogbGluZWNvbnRhaW5zIGZpbHRlciBub3cgaGFzIGEgbmV3ICJtYXRjaEFueSIgYXR0cmlidXRlIHdoaWNoIHdoZW4KKyAgIHNldCB0byAidHJ1ZSIgYWxsb3dzIGFueSAoaW5zdGVhZCBvZiBhbGwpIG9mIHRoZSB1c2VyLXNwZWNpZmllZAorICAgc3RyaW5ncyB0byBiZSBwcmVzZW50IGluIHRoZSBsaW5lLgorICAgQnVnemlsbGEgUmVwb3J0IDYyMzEzCisKICAqIDxyZXNvdXJjZWxpc3Q+IGhhcyBhIG5ldyBiYXNlZGlyIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICByZXNvbHZlIHJlbGF0aXZlIG5hbWVzIGFuZCBwcm92aWRlcyBhIHJvb3QgZm9yIHRoZSBGaWxlUmVzb3VyY2VzCiAgICBnZW5lcmF0ZWQuCkBAIC0xNTAsNyArMzIzLDE1IEBACiAgICBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlJ3MgZW5jb2RpbmcuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjIzNzkKIAotQ2hhbmdlcyBmcm9tIEFudCAxLjkuMTAgVE8gQW50IDEuOS4xMQorICogTmV3IGZpbGUgc2VsZWN0b3JzLCBwb3NpeEdyb3VwIGFuZCBwb3NpeFBlcm1pc3Npb25zLCBhcmUgYXZhaWxhYmxlLgorICAgVGhlIG5ldyBzZWxlY3RvcnMgYW5kIHJlbGF0ZWQgb3duZWRCeSBzZWxlY3RvciBoYXZlICJmb2xsb3dTeW1saW5rcyIKKyAgIGF0dHJpYnV0ZSB0aGF0IGRlZmF1bHRzIHRvICJ0cnVlIiBmb3IgY29uc2lzdGVuY3kuCisgICBCdWd6aWxsYSBSZXBvcnQgMjIzNzAKKworICogVGhlIGp1bml0bGF1bmNoZXIgdGFzayBub3cgaGFzIGEgInByaW50U3VtbWFyeSIgYXR0cmlidXRlIHdoaWNoIHdoZW4KKyAgIHNldCB0byAidHJ1ZSIgd2lsbCBwcmludCB0aGUgdGVzdCBleGVjdXRpb24gc3VtbWFyeSB0byBTeXN0ZW0ub3V0LgorCitDaGFuZ2VzIGZyb20gQW50IDEuMTAuMiBUTyBBbnQgMS4xMC4zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIENoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM6CkBAIC0xNjIsMTIgKzM0MywyMyBAQAogICAgYW5kIG5vIGxvbmdlciB0aHJvd3MgYW4gZXhjZXB0aW9uLgogICAgYW50LWRldiBsaXN0IGh0dHBzOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vZGV2QGFudC5hcGFjaGUub3JnL21zZzQ2NjM0Lmh0bWwKIAorICogUmV2ZXJ0ZWQgdGhlIHNpZ25hdHVyZSBjaGFuZ2Ugb2YgdmFyaW91cyBjbG9uZSBtZXRob2QKKyAgIGltcGxlbWVudGF0aW9uIGluIEFudCdzIGRhdGEtdHlwZXMgaW50cm9kdWNlZCB3aXRoIDEuMTAuMiBhcyB0aGV5CisgICBicm9rZSBzdWJjbGFzc2VzIG9mIHNhaWQgZGF0YS10eXBlcyB3aGljaCB0cmllZCB0byBvdmVycmlkZSBjbG9uZS4KKwogRml4ZWQgYnVnczoKIC0tLS0tLS0tLS0tCiAKKyAqIEZpeGVkIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIENoYWluZWRNYXBwZXIKKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MjA4NgorCiAgKiBGaXhlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIGEgbWFwcGVkcmVzb3VyY2UgaXMgdXNlZCBpbiBwYXRoY29udmVydAogICAgQnVnemlsbGEgUmVwb3J0IDYyMDc2CiAKKyAqIEZpeGVkIGFuIGlzc3VlIHdoZXJlIGEgc3RyaW5nLCB3aGVuIHVzZWQgYXMgYSByZXNvdXJjZSBjb2xsZWN0aW9uLCB3aXRoaW4KKyAgIHRva2Vucywgd291bGQgYmUgcmVwbGFjZWQgYnkgcHJvcGVydHkgdmFsdWVzCisgICBCdWd6aWxsYSBSZXBvcnQgNjIxNDcKKwogICogQWRkZWQgYSB3b3JrYXJvdW5kIGZvciBhIGJ1ZyBpbiB0aGUgamFyc2lnbmVyIHRvb2wgdG8gPHZlcmlmeWphcj4KICAgIHdoaWNoIHJlcXVpcmVzIHRoZSAtc3RvcmVwYXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aGVuIHZlcmlmeWluZwogICAgc2lnbmF0dXJlcyB1c2luZyAtc3RyaWN0IHRvZ2V0aGVyIHdpdGggYSBQS0NTMTIga2V5c3RvcmUuIFVubGlrZQpAQCAtMTgxLDE2ICszNzMsNDggQEAKIE90aGVyIGNoYW5nZXM6CiAtLS0tLS0tLS0tLS0tLQogCisgKiBBbGxvdyBTYXhvbiB0byBiZSB1c2VkIGZvciBqdW5pdHJlcG9ydCBYU0wgdHJhbnNmb3JtYXRpb24KKyAgIEdpdGh1YiBQdWxsIFJlcXVlc3QgIzU3CisKICAqIHdoZW4gcnVubmluZyBvbiBKYXZhIDExKyBybWljIHdpbGwgZmFpbCBlYXJseSBpZiBpaW9wIG9yIGlkbCBhcmUKLSAgIHJlcXVlc3RlZC4gSmF2YTExIHJlbW92ZXMgc3VwcG9ydCBmb3IgQ09SQkEgYW5kIHRoZSBzd2l0Y2hlcyBoYXZlCisgICByZXF1ZXN0ZWQuIEphdmEgMTEgcmVtb3ZlcyBzdXBwb3J0IGZvciBDT1JCQSBhbmQgdGhlIHN3aXRjaGVzIGhhdmUKICAgIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBybWljIHRvb2wuCiAKLUNoYW5nZXMgZnJvbSBBbnQgMS45LjkgVE8gQW50IDEuOS4xMAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBBIG5ldyBqdW5pdGxhdW5jaGVyIHRhc2sgd2hpY2ggc3VwcG9ydCBKVW5pdCA1IHRlc3QgZnJhbWV3b3JrLgorICAgQnVnemlsbGEgUmVwb3J0IDYxNzk2CisKK0NoYW5nZXMgZnJvbSBBbnQgMS4xMC4xIFRPIEFudCAxLjEwLjIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogdXBkYXRlZCB0aGUgZGVwZW5kZW5jeSBvZiBCQ0VMIHRvIDYuMi4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MTE5NgorCisgKiBkZWxldGUgdGFzayBwcmV2aW91c2x5IHdvdWxkIHNpbGVudGx5IGFjY2VwdCB3aWxkY2FyZCAoKikKKyAgIHZhbHVlIGZvciB0aGUgImZpbGUiIGF0dHJpYnV0ZS4gVGhhdCdzIG5vIGxvbmdlciB0aGUgY2FzZQorICAgYW5kIGFuIGV4Y2VwdGlvbiBjb3VsZCBnZXQgdGhyb3duIGJ5IHRoZSB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0KKyAgIGZvciBzdWNoIHVzZS4gVXNhZ2UgbGlrZToKKworICAgPGRlbGV0ZSBmaWxlPSIvZm9vL2Jhci8qLnNvbWV0aGluZyIvPgorCisgICBzaG91bGQgaW5zdGVhZCBiZSBjaGFuZ2VkIHRvIHVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucyBsaWtlOgorCisgICA8ZGVsZXRlPgorICAgCSA8ZmlsZXNldCBkaXI9Ii9mb28vYmFyLyIgaW5jbHVkZXM9Iiouc29tZXRoaW5nIi8+CisgICA8L2RlbGV0ZT4KKworICogQ29tbW9ucyBOZXQgMy42IGlzIGJpbmFyeS1jb2RlLCBidXQgbm90IHNvdXJjZSBjb21wYXRpYmxlOworICAgc2VlIGNoYW5nZSBsaXN0IG9mIENvbW1vbnMgTmV0IDMuMCBmb3IgZGV0YWlscwogCiAgKiBUaGUgTG9nNGpMaXN0ZW5lciBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhcyB0aGUgcmVxdWlyZWQgbG9nNGogbGlicmFyeQogICAgKGluIHZlcnNpb24gMS54KSBpcyBub3QgbWFpbnRhaW5lZCBhbnkgbW9yZS4KIAorICogSW1hZ2UgdGFzayBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhcyB0aGUgcmVxdWlyZWQgSkFJIGxpYnJhcnkgaXMgbm90CisgICBtYWludGFpbmVkIGFueSBtb3JlIGFuZCBpbnRlcm5hbCBBUElzIHRoYXQgSkFJIGRlcGVuZGVkIG9uIGFyZSBubyBsb25nZXIKKyAgIGF2YWlsYWJsZSBpbiBKYXZhIDkuCisKIEZpeGVkIGJ1Z3M6CiAtLS0tLS0tLS0tLQogCkBAIC0xOTgsNiArNDIyLDkgQEAKICAgIHZhbHVlLgogICAgQnVnemlsbGEgUmVwb3J0IDYwNzY3CiAKKyAqIGJvb3RzdHJhcHBpbmcgQW50IG9uIFdpbmRvd3MgZmFpbGVkCisgICBCdWd6aWxsYSBSZXBvcnQgNjEwMjcKKwogICogRml4ZWQgdGhlIGlzc3VlIHdoZXJlIHRoZSBTQ1AgYmFzZWQgdGFza3Mgd291bGQgdHJ5IHRvIGNoYW5nZQogICAgdGhlIHBlcm1pc3Npb25zIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGEgdHJhbnNmZXJyZWQgZmlsZSwKICAgIGluc3RlYWQgb2YgY2hhbmdpbmcgaXQgb24gdGhlIHRyYW5zZmVycmVkIGZpbGUgaXRzZWxmLgpAQCAtMjA4LDYgKzQzNSwxMSBAQAogICAgdGhlIHNhbWUgc291cmNlIGZpbGUgKHN5bWxpbmtlZCBiYWNrIHRvIGl0c2VsZikuCiAgICBCdWd6aWxsYSBSZXBvcnQgNjA2NDQKIAorICogRml4ZWQgdGhlIGlzc3VlIHdoZXJlIHN5bWxpbmsgY3JlYXRpb24gd2l0aCAib3ZlcndyaXRlPWZhbHNlIiwKKyAgIG9uIGV4aXN0aW5nIHN5bWxpbmsgd2hvc2UgdGFyZ2V0IHdhcyBhIGRpcmVjdG9yeSwgd291bGQgZW5kCisgICB1cCBjcmVhdGluZyBhIG5ldyBzeW1saW5rIHVuZGVyIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgorICAgQnVnemlsbGEgUmVwb3J0IDU4NjgzCisKICAqIEltcHJvdmVtZW50IHRvIHRoZSBaaXAgdGFzayBmb3IgcmVkdWNlZCBtZW1vcnkgdXNhZ2UgaW4gY2VydGFpbgogICAgY2FzZXMuIFRoYW5rcyB0byBHbGVuIExld2lzIGZvciByZXBvcnRpbmcgdGhlIGlzc3VlIGFuZAogICAgc3VnZ2VzdGluZyB0aGUgZml4LgpAQCAtMjI5LDkgKzQ2MSwyMyBAQAogICAgdmFsdWVzIGFsd2F5cyBnZXQgcXVvdGVkLgogICAgR2l0aHViIFB1bGwgUmVxdWVzdCAjMzIKIAorICogQWRkZWQgPGVuY29kaW5nPiBhdHRyaWJ1dGVzIHRvIHZhcmlvdXMgc2NyaXB0IHJlbGF0ZWQgdGFza3MgYW5kIGEKKyAgIGNvbXBpbGVkIGF0dHJpYnV0ZSB0byBzY3JpcHRkZWYuCisgICBHaXRodWIgUHVsbCBSZXF1ZXN0ICMzMAorCisgKiBBZGRlZCBzdXBwb3J0IGZvciBqYXJzaWduZXIncyAtdHNhZGlnZXN0YWxnIHRvIDxzaWduamFyPi4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MDY2NQorCiAgKiBhZGRlZCAicmVnZXhwIiBhdHRyaWJ1dGUgdG8gPGxpbmVjb250YWluc3JlZ2V4cD4KICAgIEJ1Z3ppbGxhIFJlcG9ydCA2MDk2OAogCisgKiByZWR1Y2VkIEdDIHByZXNzdXJlIGJ5IHJlcGxhY2luZyBhbGwgdXNhZ2Ugb2YgRmlsZUlucHV0U3RyZWFtIGFuZAorICAgRmlsZU91dHB1dFN0cmVhbS4KKworICogVGFzayBjYW4gbm93IGFsc28gdXNlIGF0dHJpYnV0ZSBzZXR0ZXJzIHRoYXQgZXhwZWN0IGEKKyAgIGphdmEubmlvLmZpbGUuUGF0aCBhcmd1bWVudC4KKyAgIEJ1Z3ppbGxhIFJlcG9ydCA2MTA0MgorCiAgKiBhZGRlZCBhIG5ldyBtYWdpYyBwcm9wZXJ0eSBhbnQudHN0YW1wLm5vdyB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICBvdmVycmlkZSB0aGUgY3VycmVudCB0aW1lL2RhdGUgdXNlZCBieSA8dHN0YW1wPi4KICAgIEJ1Z3ppbGxhIFJlcG9ydCA2MTA3OQpAQCAtMjYxLDIwICs1MDcsMjEgQEAKIAogICogVXBkYXRlZCBNYXZlbiBBbnQgVGFza3MsIEpha2FydGEgUmVnZXhwIGFuZCBKVW5pdCA0IHRvIHRoZSBsYXRlc3QKICAgIHN0YWJsZSB2ZXJzaW9uICgyLjEuMywgMS40LCBhbmQgNC4xMiByZXNwZWN0aXZlbHkpOyB1cGRhdGVkCi0gICBKYXZhIE1haWwgQVBJLCBKUnVieSBhbmQgSnl0aG9uIHRvIHRoZSBsYXRlc3QgSmF2YSA1IGNvbXBhdGlibGUKLSAgIHZlcnNpb24gKDEuNS42LCAxLjYuOCBhbmQgMi41LjMsIHJlc3BlY3RpdmVseSk7IGFkZGVkIHJlc29sdmUgdGFyZ2V0cwotICAgZm9yIEl2eSBhbmQgQW50VW5pdCB0byBmYWNpbGl0YXRlIHJlbGVhc2VzIGFuZCB1cGRhdGVzLCByZXNwZWN0aXZlbHkuCisgICBKUnVieSB0byB0aGUgbGF0ZXN0IEphdmEgNSBjb21wYXRpYmxlIHZlcnNpb24gKDEuNi44KTsgYWRkZWQKKyAgIHJlc29sdmUgdGFyZ2V0IGZvciBBbnRVbml0IHRvIGZhY2lsaXRhdGUgdXBkYXRlcy4KICAgIEdpdGh1YiBQdWxsIFJlcXVlc3QgIzUwCiAKLSogVXBkYXRlZCBDb21tb25zIE5ldCB0byB0aGUgbGF0ZXN0IEphdmEgNSBjb21wYXRpYmxlIHZlcnNpb24gKDIuMikuCisgKiBVcGRhdGVkIEphdmEgTWFpbCBBUEksIEp5dGhvbiwgUmhpbm8gYW5kIENvbW1vbnMgTmV0IHRvIHRoZSBsYXRlc3QKKyAgIHN0YWJsZSB2ZXJzaW9uICgxLjYuMCwgMi43LjAsIDEuNy43LjIgYW5kIDMuNiwgcmVzcGVjdGl2ZWx5KS4KKyAgIEdpdGh1YiBQdWxsIFJlcXVlc3QgIzUzCiAKLUNoYW5nZXMgZnJvbSBBbnQgMS45LjggVE8gQW50IDEuOS45Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorQ2hhbmdlcyBmcm9tIEFudCAxLjEwLjAgVE8gQW50IDEuMTAuMQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBGaXhlZCBidWdzOgogLS0tLS0tLS0tLS0KIAotICogQW50IDEuOS44IG1hZGUgUGF0aCNzeXN0ZW1DbGFzc3BhdGggZmluYWwgd2hpY2ggYnJva2UgdGhlIEVjbGlwc2UKKyAqIEFudCAxLjEwLjAgbWFkZSBQYXRoI3N5c3RlbUNsYXNzcGF0aCBmaW5hbCB3aGljaCBicm9rZSB0aGUgRWNsaXBzZQogICAgaW50ZWdyYXRpb24uCiAgICBCdWd6aWxsYSBSZXBvcnQgNjA1ODIKIApAQCAtMjg0LDE3ICs1MzEsMzYgQEAKICAgIG5ld2xpbmVzIHByZXNlbnQgaW4gY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KICAgIEJ1Z3ppbGxhIFJlcG9ydCA2MDU2MgogCi1DaGFuZ2VzIGZyb20gQW50IDEuOS43IFRPIEFudCAxLjkuOAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK090aGVyIGNoYW5nZXM6CistLS0tLS0tLS0tLS0tLQorCisgKiBuZXcgdGFza3MgPHh6PiBhbmQgPHVueHo+IGFuZCByZXNvdXJjZSA8eHpyZXNvdXJjZT4gZm9yIFhaCisgICBjb21wcmVzc2lvbi4gQWxzbyB0aGUgY29tcHJlc3Npb24gYXR0cmlidXRlIG9mIDx0YXI+Lzx1bnRhcj4gbm93CisgICBhY2NlcHRzICJ4eiIgYXMgdmFsaWQgdmFsdWUuCisgICBUaGUgdGFza3MgYW5kIHR5cGUgYXJlIGNvbnRhaW5lZCBpbiB0aGUgbmV3IGFudC14ei5qYXIgYW5kIHJlcXVpcmUKKyAgIHRoZSBsaWJyYXJ5IFhaIGZvciBKYXZhIHRvIGJlIG9uIHRoZSBDTEFTU1BBVEguCisgICBCdWd6aWxsYSBSZXBvcnQgNjAzNTAKKworQ2hhbmdlcyBmcm9tIEFudCAxLjkuNyBUTyBBbnQgMS4xMC4wCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogQ2hhbmdlcyB0aGF0IGNvdWxkIGJyZWFrIG9sZGVyIGVudmlyb25tZW50czoKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICogQW50IDEuMTAueCByZXF1aXJlcyBKYXZhOCBvciBuZXdlciBhdCBjb21waWxlIG9yIGJ1aWxkIHRpbWUuCisgICBUaGUgMS45Lnggc2VyaWVzIHdpbCBzdGF5IGNvbXBhdGlibGUgd2l0aCBKYXZhNS4KKworICogVGhlIDxhcHQ+IHRhc2sgaGFzIGJlZW4gcmVtb3ZlZCBzaW5jZSBhcHQgaXRzZWxmIGhhcyBiZWVuIHJlbW92ZWQKKyAgIHdpdGggSmF2YTguCisKICAqIDxmaWxlc2V0Pi88emlwZmlsZXNldD4vPHRhcmZpbGVzZXQ+IGV4aGliaXRlZCB1bmRlZmluZWQKICAgIGJlaGF2aW9yIHdoZW4gYm90aCB0aGUgZGlyIGFuZCBmaWxlIGF0dHJpYnV0ZSBoYXZlIGJlZW4gdXNlZCBvbiB0aGUKICAgIHNhbWUgaW5zdGFuY2UuIFRoaXMgd2lsbCBub3cgY2F1c2UgdGhlIGJ1aWxkIHRvIGZhaWwuCiAgICBCdWd6aWxsYSBSZXBvcnQgNTk0MDIKIAorICogPG5hdGl2ZTJhc2NpaT4gd2lsbCBkZWZhdWx0IHRvIHRoZSBidWlsdGluIGltcGxlbWVudGF0aW9uIG9uIEphdmE4CisgICBhcyB3ZWxsIChzdW4gaXNuJ3QgYXZhaWxhYmxlIGZvciBKYXZhOSsgYW55d2F5KS4KKwogICogVGhlIGFudC5qYXZhLnZlcnNpb24gcHJvcGVydHkgd2lsbCBub3cgaG9sZCB0aGUgdmFsdWUgIjkiIHJhdGhlcgogICAgdGhhbiAiMS45IiBpZiBydW5uaW5nIG9uIEphdmEgOS4KIApAQCAtMzAyLDYgKzU2OCw5IEBACiAgICBiZSB1c2VkIHdoZW4gcnVubmluZyBvbiBKYXZhIDkgc2luY2UgdGhpcyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4KICAgIEJ1Z3ppbGxhIFJlcG9ydCA1OTkwNgogCisgKiA8amF2YWg+IHdpbGwgZGVmYXVsdCB0byB0aGUgImZvcmtpbmciIGltcGxlbWVudGF0aW9uIG9uIEphdmE4CisgICBhcyB3ZWxsLgorCiBGaXhlZCBidWdzOgogLS0tLS0tLS0tLS0KIApAQCAtMzQ5LDYgKzYxOCwxMSBAQAogT3RoZXIgY2hhbmdlczoKIC0tLS0tLS0tLS0tLS0tCiAKKyAqIE5ldyBmaWxlIHNlbGVjdG9ycyA8ZXhlY3V0YWJsZT4sIDxzeW1saW5rPiBhbmQgPG93bmVkQnk+LgorCisgKiBOZXcgdGFzayA8c2V0cGVybWlzc2lvbnM+IHRoYXQgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gc2V0IFBPU0lYCisgICBjb21wYXRpYmxlIHBlcm1zc2lvbnMgdmlhIE5JTydzIFBvc2l4RmlsZVBlcm1pc3Npb24KKwogICogPGp1bml0PiBub3cgaW5pdGlhbGl6ZXMgdGhlIGNhdXNlIG9mIHRoZSBBc3NlcnRpb25GYWlsZWRFcnJvciB3aGVuCiAgICBjb252ZXJ0aW5nIGZyb20gQXNzZXJ0aW9uRXJyb3IuCiAgICBCdWd6aWxsYSBSZXBvcnQgNTg5ODIKQEAgLTM4Niw2ICs2NjAsOSBAQAogICogaXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSByZWZlcmVuY2VzIHRvIEFudCB0eXBlcyBhbmQgY2xhc3Nsb2FkZXJzCiAgICBidWlsdCBhcm91bmQgQW50IDxwYXRoPnMgYXMgdmFsdWVzIGZvciBUcmFYIGZhY3RvcnkgYXR0cmlidXRlcy4KIAorICogQW50Q2xhc3NMb2FkZXIgYW5kIGl0cyBzdWJjbGFzc2VzIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgYXMgcGFyYWxsZWwKKyAgIGNhcGFibGUuCisKICAqIDxqdW5pdHJlcG9ydD4gbm93IGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgIGh0dHA6Ly93d3cub3JhY2xlLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL2VuYWJsZUV4dGVuc2lvbkZ1bmN0aW9ucwogICAgd2hlbiBydW4gb24gSmF2YSA5IHNvIHRoZSByZWRpcmVjdCBleHRlbnNpb24gZnVuY3Rpb24gY2FuIGJlIHVzZWQKZGlmZiAtLWdpdCBhL2FudC5wcm9wZXJ0aWVzLnNhbXBsZSBiL2FudC5wcm9wZXJ0aWVzLnNhbXBsZQppbmRleCAxOTMwY2E3Li4zMTI2ZmNjIDEwMDY0NAotLS0gYS9hbnQucHJvcGVydGllcy5zYW1wbGUKKysrIGIvYW50LnByb3BlcnRpZXMuc2FtcGxlCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL2Jvb3RzdHJhcC5iYXQgYi9ib290c3RyYXAuYmF0CmluZGV4IGJlMmVjMGIuLjZjZWMwMjkgMTAwNzU1Ci0tLSBhL2Jvb3RzdHJhcC5iYXQKKysrIGIvYm9vdHN0cmFwLmJhdApAQCAtMTAsNyArMTAsNyBAQAogUkVNICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogUkVNICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogUkVNCi1SRU0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFJFTQogUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBSRU0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02MSwxMCArNjEsMjAgQEAKIGlmIG5vdCBleGlzdCBidWlsZFxudWwgbWtkaXIgYnVpbGQKIGlmIG5vdCBleGlzdCBidWlsZFxjbGFzc2VzXG51bCBta2RpciBidWlsZFxjbGFzc2VzCiAKK3JlbSBDaGVjayBpZiBqYXZhYyB0b29sIHN1cHBvcnRzIHRoZSAtLXJlbGVhc2UgcGFyYW0KK1NFVCBKQVZBQ19SRUxFQVNFX1ZFUlNJT049IiIKK2VjaG8gInB1YmxpYyBjbGFzcyBKYXZhY1ZlcnNpb25DaGVjayB7fSIgPiAlQ0xBU1NESVIlXEphdmFjVmVyc2lvbkNoZWNrLmphdmEKKyIlSkFWQUMlIiAtLXJlbGVhc2UgOCAtZCAlQ0xBU1NESVIlICVDTEFTU0RJUiVcSmF2YWNWZXJzaW9uQ2hlY2suamF2YSA+bnVsIDI+JjEKK0lGICVFUlJPUkxFVkVMJSBFUVUgMCBTRVQgSkFWQUNfUkVMRUFTRV9WRVJTSU9OPSItLXJlbGVhc2UgOCIKK0RFTCAlQ0xBU1NESVIlXEphdmFjVmVyc2lvbkNoZWNrLmphdmEgJUNMQVNTRElSJVxKYXZhY1ZlcnNpb25DaGVjay5jbGFzcyA+bnVsIDI+JjEKIGVjaG8uCi1lY2hvIC4uLiBDb21waWxpbmcgQW50IENsYXNzZXMKLQotIiVKQVZBQyUiICVCT09USkFWQUNfT1BUUyUgLWQgJUNMQVNTRElSJSAlVE9PTFMlXGJ6aXAyXCouamF2YSAlVE9PTFMlXHRhclwqLmphdmEgJVRPT0xTJVx6aXBcKi5qYXZhICVUT09MUyVcYW50XCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1wqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5qYXZhICVUT09MUyVcYW50XHV0aWxccmVnZXhwXFJlZ2V4cE1hdGNoZXIuamF2YSAlVE9PTFMlXGFudFx1dGlsXHJlZ2V4cFxSZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhICVUT09MUyVcYW50XHRhc2tkZWZzXGNvbmRpdGlvblwqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcY29tcGlsZXJzXCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1xyZXNvdXJjZXNcKi5qYXZhICVUT09MUyVcYW50XHByb3BlcnR5XCouamF2YQorSUYgJUpBVkFDX1JFTEVBU0VfVkVSU0lPTiUgPT0gIiIgKAorICBlY2hvIC4uLiBDb21waWxpbmcgQW50IENsYXNzZXMKKyAgIiVKQVZBQyUiICVCT09USkFWQUNfT1BUUyUgLWQgJUNMQVNTRElSJSAlVE9PTFMlXGJ6aXAyXCouamF2YSAlVE9PTFMlXHRhclwqLmphdmEgJVRPT0xTJVx6aXBcKi5qYXZhICVUT09MUyVcYW50XCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1wqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5qYXZhICVUT09MUyVcYW50XHV0aWxccmVnZXhwXFJlZ2V4cE1hdGNoZXIuamF2YSAlVE9PTFMlXGFudFx1dGlsXHJlZ2V4cFxSZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhICVUT09MUyVcYW50XHRhc2tkZWZzXGNvbmRpdGlvblwqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcY29tcGlsZXJzXCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1xyZXNvdXJjZXNcKi5qYXZhICVUT09MUyVcYW50XHByb3BlcnR5XCouamF2YQorKSBFTFNFICgKKyAgZWNobyAuLi4gQ29tcGlsaW5nIEFudCBDbGFzc2VzIHdpdGggJUpBVkFDX1JFTEVBU0VfVkVSU0lPTiUKKyAgIiVKQVZBQyUiICVCT09USkFWQUNfT1BUUyUgLWQgJUNMQVNTRElSJSAlSkFWQUNfUkVMRUFTRV9WRVJTSU9OJSAlVE9PTFMlXGJ6aXAyXCouamF2YSAlVE9PTFMlXHRhclwqLmphdmEgJVRPT0xTJVx6aXBcKi5qYXZhICVUT09MUyVcYW50XCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1wqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcKi5qYXZhICVUT09MUyVcYW50XHV0aWxccmVnZXhwXFJlZ2V4cE1hdGNoZXIuamF2YSAlVE9PTFMlXGFudFx1dGlsXHJlZ2V4cFxSZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhICVUT09MUyVcYW50XHRhc2tkZWZzXGNvbmRpdGlvblwqLmphdmEgJVRPT0xTJVxhbnRcdGFza2RlZnNcY29tcGlsZXJzXCouamF2YSAlVE9PTFMlXGFudFx0eXBlc1xyZXNvdXJjZXNcKi5qYXZhICVUT09MUyVcYW50XHByb3BlcnR5XCouamF2YQorKQogCiBpZiBFUlJPUkxFVkVMIDEgZ290byBtYWluZW5kCiAKZGlmZiAtLWdpdCBhL2Jvb3RzdHJhcC5zaCBiL2Jvb3RzdHJhcC5zaAppbmRleCBkMTAxM2QxLi5jOTdhYmIzIDEwMDc1NQotLS0gYS9ib290c3RyYXAuc2gKKysrIGIvYm9vdHN0cmFwLnNoCkBAIC03LDcgKzcsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEyNyw5ICsxMjcsMjQgQEAKIG1rZGlyIC1wICR7Q0xBU1NESVJ9CiBta2RpciAtcCBiaW4KIAotZWNobyAuLi4gQ29tcGlsaW5nIEFudCBDbGFzc2VzCisjIENoZWNrIGlmIGphdmFjIHRvb2wgc3VwcG9ydHMgdGhlIC0tcmVsZWFzZSBwYXJhbQorZWNobyAicHVibGljIGNsYXNzIEphdmFjVmVyc2lvbkNoZWNrIHt9IiA+ICR7Q0xBU1NESVJ9L0phdmFjVmVyc2lvbkNoZWNrLmphdmEKKyIke0pBVkFDfSIgLS1yZWxlYXNlIDggLWQgJHtDTEFTU0RJUn0gJHtDTEFTU0RJUn0vSmF2YWNWZXJzaW9uQ2hlY2suamF2YSAxPiYyIDI+L2Rldi9udWxsCityZXQ9JD8KK3JtICR7Q0xBU1NESVJ9L0phdmFjVmVyc2lvbkNoZWNrLmphdmEgJHtDTEFTU0RJUn0vSmF2YWNWZXJzaW9uQ2hlY2suY2xhc3MgMT4mMiAyPi9kZXYvbnVsbAorSkFWQUNfUkVMRUFTRV9WRVJTSU9OPQoraWYgWyAkcmV0IC1lcSAwIF07IHRoZW4KKyAgIyBzZXQgLS1yZWxlYXNlIHRvIDgKKyAgSkFWQUNfUkVMRUFTRV9WRVJTSU9OPSItLXJlbGVhc2UgOCIKK2ZpCitpZiBbICIke0pBVkFDX1JFTEVBU0VfVkVSU0lPTn0iID0gIiIgXTsgdGhlbgorICBlY2hvIC4uLiBDb21waWxpbmcgQW50IENsYXNzZXMKK2Vsc2UKKyAgZWNobyAuLi4gQ29tcGlsaW5nIEFudCBDbGFzc2VzIHdpdGggJHtKQVZBQ19SRUxFQVNFX1ZFUlNJT059CitmaQogCi0iJHtKQVZBQ30iICRCT09USkFWQUNfT1BUUyAtZCAke0NMQVNTRElSfSAke1RPT0xTfS9iemlwMi8qLmphdmEgJHtUT09MU30vdGFyLyouamF2YSAke1RPT0xTfS96aXAvKi5qYXZhIFwKKyIke0pBVkFDfSIgJEJPT1RKQVZBQ19PUFRTIC1kICR7Q0xBU1NESVJ9ICR7SkFWQUNfUkVMRUFTRV9WRVJTSU9OfSBcCisgICAgICAgICAgICR7VE9PTFN9L2J6aXAyLyouamF2YSAke1RPT0xTfS90YXIvKi5qYXZhICR7VE9PTFN9L3ppcC8qLmphdmEgXAogICAgICAgICAgICAke1RPT0xTfS9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlci5qYXZhIFwKICAgICAgICAgICAgJHtUT09MU30vYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJGYWN0b3J5LmphdmEgXAogICAgICAgICAgICAke1RPT0xTfS9hbnQvcHJvcGVydHkvKi5qYXZhIFwKZGlmZiAtLWdpdCBhL2J1aWxkLmJhdCBiL2J1aWxkLmJhdAppbmRleCAwZjFhNTJkLi5kYzZlNDQ3IDEwMDc1NQotLS0gYS9idWlsZC5iYXQKKysrIGIvYnVpbGQuYmF0CkBAIC03LDcgKzcsNyBAQAogUkVNICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogUkVNICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogUkVNIAotUkVNICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCitSRU0gICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBSRU0gCiBSRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIFJFTSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL2J1aWxkLnNoIGIvYnVpbGQuc2gKaW5kZXggZWU4ZTU3MS4uMzRiNDg3NSAxMDA3NTUKLS0tIGEvYnVpbGQuc2gKKysrIGIvYnVpbGQuc2gKQEAgLTcsNyArNyw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmluZGV4IDU0MTM2MTIuLjA0N2Q0NTkgMTAwNjQ0Ci0tLSBhL2J1aWxkLnhtbAorKysgYi9idWlsZC54bWwKQEAgLTgsNyArOCw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMzLDE1ICszMywxNiBAQAogICA8cHJvcGVydHkgbmFtZT0ibmFtZSIgdmFsdWU9ImFudCIvPgogICA8IS0tIHRoaXMgaXMgdGhlIGRpcmVjdG9yeSBjb3JyZXNwb25kaW5nIHRvIGdyb3VwSWQgb2YgQW50IGluIHRoZSBNYXZlbiByZXBvc2l0b3J5IC0tPgogICA8cHJvcGVydHkgbmFtZT0iZ3JvdXBpZCIgdmFsdWU9Im9yZy9hcGFjaGUvYW50Ii8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwcm9qZWN0LnZlcnNpb24iIHZhbHVlPSIxLjkuMTVhbHBoYSIvPgorICA8cHJvcGVydHkgbmFtZT0icHJvamVjdC52ZXJzaW9uIiB2YWx1ZT0iMS4xMC44YWxwaGEiLz4KICAgPCEtLSBwb20udmVyc2lvbiBpcyB1c2VkIHdoZW4gZG9pbmcgYSBkaXN0cmlidXRpb24gYW5kIG11c3QgbWF0Y2ggd2l0aCB3aGF0IGlzIGNoZWNrZWQgaW4gdW5kZXIgc3JjL2V0Yy9wb21zIC0tPgotICA8cHJvcGVydHkgbmFtZT0icG9tLnZlcnNpb24iIHZhbHVlPSIxLjkuMTUtU05BUFNIT1QiLz4KLSAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LXZlcnNpb24iIHZhbHVlPSIxLjkuMTUiLz4KKyAgPHByb3BlcnR5IG5hbWU9InBvbS52ZXJzaW9uIiB2YWx1ZT0iMS4xMC44LVNOQVBTSE9UIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJtYW5pZmVzdC12ZXJzaW9uIiB2YWx1ZT0iMS4xMC44Ii8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJib290c3RyYXAuamFyIiB2YWx1ZT0iYW50LWJvb3RzdHJhcC5qYXIiLz4KIAogICA8cHJvcGVydHkgbmFtZT0iYW50LnBhY2thZ2UiIHZhbHVlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudCIvPgogICA8cHJvcGVydHkgbmFtZT0idGFza2RlZnMucGFja2FnZSIgdmFsdWU9IiR7YW50LnBhY2thZ2V9L3Rhc2tkZWZzIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJjb25kaXRpb24ucGFja2FnZSIgdmFsdWU9IiR7dGFza2RlZnMucGFja2FnZX0vY29uZGl0aW9uIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJtb2R1bGVzLnBhY2thZ2UiIHZhbHVlPSIke3Rhc2tkZWZzLnBhY2thZ2V9L21vZHVsZXMiLz4KICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbmFsLnBhY2thZ2UiIHZhbHVlPSIke3Rhc2tkZWZzLnBhY2thZ2V9L29wdGlvbmFsIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlLnBhY2thZ2UiIHZhbHVlPSIke2FudC5wYWNrYWdlfS90eXBlcyIvPgogICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uYWwudHlwZS5wYWNrYWdlIiB2YWx1ZT0iJHt0eXBlLnBhY2thZ2V9L29wdGlvbmFsIi8+CkBAIC02NSw3ICs2Niw2IEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuYW50dW5pdCIgdmFsdWU9IiR7c3JjLmRpcn0vdGVzdHMvYW50dW5pdCIvPgogICA8cHJvcGVydHkgbmFtZT0iZXRjLmRpciIgdmFsdWU9IiR7c3JjLmRpcn0vZXRjIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0cy5ldGMuZGlyIiB2YWx1ZT0iJHtldGMuZGlyfS90ZXN0Y2FzZXMiLz4KLSAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0IiB2YWx1ZT0iJHtldGMuZGlyfS9tYW5pZmVzdCIvPgogICA8cHJvcGVydHkgbmFtZT0ibGliLmRpciIgdmFsdWU9ImxpYiIvPgogICA8cHJvcGVydHkgbmFtZT0ibWFudWFsLmRpciIgdmFsdWU9Im1hbnVhbCIvPgogCkBAIC04NSwxMiArODUsMTMgQEAKICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmp1bml0LnhtbCIgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9L3htbCIvPgogICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuanVuaXQudG1wZGlyIiBsb2NhdGlvbj0iJHtidWlsZC50ZXN0c30vdG1wIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5qdW5pdC5yZXBvcnRzIiBsb2NhdGlvbj0iJHtidWlsZC50ZXN0c30vcmVwb3J0cyIvPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQucGtnLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9wa2ciLz4KICAgPHByb3BlcnR5IG5hbWU9ImFudHVuaXQueG1sIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2FudHVuaXQveG1sIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJhbnR1bml0LnRtcGRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9hbnR1bml0L3RtcCIvPgogICA8cHJvcGVydHkgbmFtZT0iYW50dW5pdC5yZXBvcnRzIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L2FudHVuaXQvcmVwb3J0cyIvPgogICA8cHJvcGVydHkgbmFtZT0iYW50dW5pdC5sb2dsZXZlbCIgdmFsdWU9Im5vbmUiLz4KLSAgPHByb3BlcnR5IG5hbWU9Im1hbmlmZXN0LnRtcCIgdmFsdWU9IiR7YnVpbGQuZGlyfS9vcHRpb25hbC5tYW5pZmVzdCIvPgogICA8IS0tIHRoZSBhYnNvbHV0ZSBwYXRoIC0tPgorICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3Nlcy52YWx1ZSIgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iLz4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnRlc3RzLnZhbHVlIiBsb2NhdGlvbj0iJHtidWlsZC50ZXN0c30iLz4KIAogICA8IS0tCkBAIC05OSwxMiArMTAwLDEzIEBACiAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAtLT4KICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotICA8cHJvcGVydHkgbmFtZT0iY2htb2QuZmFpbCIgdmFsdWU9InRydWUiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNobW9kLm1heHBhcmFsbGVsIiB2YWx1ZT0iMjUwIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzZXRwZXJtaXNzaW9ucy5mYWlsIiB2YWx1ZT0idHJ1ZSIvPgorICA8cHJvcGVydHkgbmFtZT0ic2V0cGVybWlzc2lvbnMubm9ucG9zaXhtb2RlIiB2YWx1ZT0idHJ5RG9zT3JQYXNzIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJkZXByZWNhdGlvbiIgdmFsdWU9ImZhbHNlIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpbWl6ZSIgdmFsdWU9InRydWUiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImphdmFjLnRhcmdldCIgdmFsdWU9IjEuNSIvPgotICA8cHJvcGVydHkgbmFtZT0iamF2YWMuc291cmNlIiB2YWx1ZT0iMS41Ii8+CisgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhYy50YXJnZXQiIHZhbHVlPSIxLjgiLz4KKyAgPHByb3BlcnR5IG5hbWU9ImphdmFjLnNvdXJjZSIgdmFsdWU9IjEuOCIvPgorICA8cHJvcGVydHkgbmFtZT0iamF2YWMucmVsZWFzZSIgdmFsdWU9IjgiLz4KICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmZpbHRlcnRyYWNlIiB2YWx1ZT0ib2ZmIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5zdW1tYXJ5IiB2YWx1ZT0ibm8iLz4KICAgPHByb3BlcnR5IG5hbWU9InRlc3QuaGFsdG9uZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+CkBAIC0xMjEsNyArMTIzLDYgQEAKICAgPHByb3BlcnR5IG5hbWU9Imp1bml0LmNvbGxlY3Rvci5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vZmFpbGluZ1Rlc3RzIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdC5jb2xsZWN0b3IuY2xhc3MiIHZhbHVlPSJGYWlsZWRUZXN0cyIvPgogCi0KICAgPCEtLQogICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgIFNldCB0aGUgcGF0aHMgdXNlZCBpbiB0aGUgYnVpbGQKQEAgLTE3OSw2ICsxODAsMTAgQEAKICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC0tPgogCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuamRrOSsiPgorICAgIDxmaWxlbmFtZSBuYW1lPSIke21vZHVsZXMucGFja2FnZX0vIi8+CisgIDwvc2VsZWN0b3I+CisKICAgPCEtLSBLYWZmZSBoYXMgc29tZSBKREsgMS41IGZlYXR1cmVzIGluY2x1ZGluZyBqYXZhLmxhbmcuUmVhZGFibGUsCiAgICAgICAgYnV0IG5vdCBhbGwgb2YgdGhlbSAtLT4KICAgPHNlbGVjdG9yIGlkPSJub3QuaW4ua2FmZmUiPgpAQCAtMjEwLDYgKzIxNSwyOSBAQAogICAgICAgPC9vcj4KICAgPC9zZWxlY3Rvcj4KIAorICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmp1bml0bGF1bmNoZXIiPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0bGF1bmNoZXIvIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9UcmFja2VyLmphdmEiLz4KKyAgICA8L29yPgorICA8L3NlbGVjdG9yPgorCisgIDxzZWxlY3RvciBpZD0ibmVlZHMuanVuaXQuZW5naW5lLnZpbnRhZ2UiPgorICAgIDxvcj4KKyAgICAgIDwhLS0gd2UgbmVlZCBKVW5pdCB2aW50YWdlIGVuZ2luZSBvbmx5IGluIHRlc3RzIHdoZXJlIHdlIHRlc3QgdGhlIGp1bml0bGF1bmNoZXIgdGFzayAtLT4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0bGF1bmNoZXIvKiovSlVuaXRMYXVuY2hlclRhc2tUZXN0LmphdmEiLz4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSJvcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL3ZpbnRhZ2UvKiovKiIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qdW5pdC5lbmdpbmUuanVwaXRlciI+CisgICAgPG9yPgorICAgICAgPCEtLSB3ZSBuZWVkIEpVbml0IGp1cGl0ZXIgZW5naW5lIG9ubHkgaW4gdGVzdHMgd2hlcmUgd2UgdGVzdCB0aGUganVuaXRsYXVuY2hlciB0YXNrIC0tPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXRsYXVuY2hlci8qKi9KVW5pdExhdW5jaGVyVGFza1Rlc3QuamF2YSIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9Im9yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvanVwaXRlci8qKi8qIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKwogICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmFwYWNoZS1yZWdleHAiPgogICAgIDxmaWxlbmFtZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9KYWthcnRhUmVnZXhwKiIvPgogICA8L3NlbGVjdG9yPgpAQCAtMjY1LDEzICsyOTMsMjEgQEAKICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9BTlRMUioiLz4KICAgPC9zZWxlY3Rvcj4KIAorICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmltYWdlaW8iPgorICAgIDxvcj4KKyAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2ltYWdlL0ltYWdlSU8qIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC50eXBlLnBhY2thZ2V9L2ltYWdlaW8vIi8+CisgICAgPC9vcj4KKyAgPC9zZWxlY3Rvcj4KKwogICA8c2VsZWN0b3IgaWQ9Im5lZWRzLmptZiI+CiAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc291bmQvIi8+CiAgIDwvc2VsZWN0b3I+CiAKICAgPHNlbGVjdG9yIGlkPSJuZWVkcy5qYWkiPgogICAgIDxvcj4KLSAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2ltYWdlLyIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vaW1hZ2UvSW1hZ2UuKiIvPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vaW1hZ2UvSW1hZ2VUZXN0LioiLz4KICAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnR5cGUucGFja2FnZX0vaW1hZ2UvIi8+CiAgICAgPC9vcj4KICAgPC9zZWxlY3Rvcj4KQEAgLTI5Myw2ICszMjksMTMgQEAKICAgICA8ZmlsZW5hbWUgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9YYWxhbjJUcmFjZVN1cHBvcnQqIi8+CiAgIDwvc2VsZWN0b3I+CiAKKyAgPHNlbGVjdG9yIGlkPSJuZWVkcy54eiI+CisgICAgPG9yPgorICAgICAgPGZpbGVuYW1lIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0veHovIi8+CisgICAgICA8ZmlsZW5hbWUgbmFtZT0iJHt0eXBlLnBhY2thZ2V9L29wdGlvbmFsL3h6LyIvPgorICAgIDwvb3I+CisgIDwvc2VsZWN0b3I+CisKICAgPHNlbGVjdG9yIGlkPSJhbnQubGF1bmNoZXIiPgogICAgIDxmaWxlbmFtZSBuYW1lPSIke2FudC5wYWNrYWdlfS9sYXVuY2gvIi8+CiAgIDwvc2VsZWN0b3I+CkBAIC0zMTAsNiArMzUzLDcgQEAKICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUteGFsYW4yIi8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1sb2dnaW5nIi8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1uZXQiLz4KKyAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5pbWFnZWlvIi8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamFpIi8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamF2YW1haWwiLz4KICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGVwZW5kIi8+CkBAIC0zMTcsOCArMzYxLDEwIEBACiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanNjaCIvPgogICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmp1bml0Ii8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXQ0Ii8+CisgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXRsYXVuY2hlciIvPgogICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLm5ldHJleHgiLz4KICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5zd2luZyIvPgorICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnh6Ii8+CiAgICAgICAgIDxzZWxlY3RvciByZWZpZD0iYW50LmxhdW5jaGVyIi8+CiAgICAgICA8L29yPgogICAgIDwvbm90PgpAQCAtMzM3LDcgKzM4Myw3IEBACiAgICAgPGV4Y2x1ZGUgdW5sZXNzPSJydW4uZmFpbGluZy50ZXN0cyIgbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS9qZGVwZW5kL0pEZXBlbmRUZXN0LmphdmEiLz4KICAgPC9wYXR0ZXJuc2V0PgogCi0gIDwhLS10ZXN0cyB0aGF0IG5lZWQgYW4gWE1MIFNjaGVtYS1zdXBwb3J0aW5nIHBhcnNlciB0byB3b3JrLS0+CisgIDwhLS0gdGVzdHMgdGhhdCBuZWVkIGFuIFhNTCBTY2hlbWEtc3VwcG9ydGluZyBwYXJzZXIgdG8gd29yayAtLT4KICAgPHNlbGVjdG9yIGlkPSJuZWVkcy54bWxzY2hlbWEiPgogICAgIDxvcj4KICAgICAgIDxmaWxlbmFtZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L1NjaGVtYVZhbGlkYXRlVGVzdC4qIi8+CkBAIC0zNTYsNiArNDAyLDcgQEAKICAgICA8aW5jbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9CdWlsZEZpbGVUZXN0KiIvPgogICAgIDxpbmNsdWRlIG5hbWU9IiR7YW50LnBhY2thZ2V9L0J1aWxkRmlsZVJ1bGUqIi8+CiAgICAgPGluY2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vRmlsZVV0aWxpdGllcyoiLz4KKyAgICA8aW5jbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9NYWdpY1Rlc3ROYW1lcyoiLz4KICAgICA8aW5jbHVkZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9SZWdleHBNYXRjaGVyVGVzdCoiLz4KICAgICA8aW5jbHVkZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9SZWdleHBUZXN0KiIvPgogICAgIDxpbmNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QqIi8+CkBAIC0zNzQsOSArNDIxLDYgQEAKICAgICAgIDwvbm90PgogICAgIDwvY29uZGl0aW9uPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVzeXN0ZW1jbGFzc2VzIiB2YWx1ZT0iZmFsc2UiLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjYrIiBjbGFzc25hbWU9ImphdmEubmV0LkNvb2tpZVN0b3JlIi8+Ci0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS43KyIgY2xhc3NuYW1lPSJqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW0iLz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjgrIiBjbGFzc25hbWU9ImphdmEubGFuZy5yZWZsZWN0LkV4ZWN1dGFibGUiLz4KICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGs5KyIgY2xhc3NuYW1lPSJqYXZhLmxhbmcubW9kdWxlLk1vZHVsZURlc2NyaXB0b3IiLz4KICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqZGsxMCsiPgogICAgICAgPGphdmF2ZXJzaW9uIGF0bGVhc3Q9IjEwIi8+CkBAIC00MDIsNiArNDQ2LDE1IEBACiAgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianVuaXQ0LnByZXNlbnQiCiAgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5qdW5pdC5UZXN0IgogICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIGlnbm9yZXN5c3RlbWNsYXNzZXM9IiR7aWdub3Jlc3lzdGVtY2xhc3Nlc30iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdW5pdGxhdW5jaGVyLnByZXNlbnQiCisgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5MYXVuY2hlciIKKyAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiBpZ25vcmVzeXN0ZW1jbGFzc2VzPSIke2lnbm9yZXN5c3RlbWNsYXNzZXN9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianVuaXQuZW5naW5lLnZpbnRhZ2UucHJlc2VudCIKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmp1bml0LnZpbnRhZ2UuZW5naW5lLlZpbnRhZ2VUZXN0RW5naW5lIgorICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIGlnbm9yZXN5c3RlbWNsYXNzZXM9IiR7aWdub3Jlc3lzdGVtY2xhc3Nlc30iLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqdW5pdC5lbmdpbmUuanVwaXRlci5wcmVzZW50IgorICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuanVuaXQuanVwaXRlci5lbmdpbmUuSnVwaXRlclRlc3RFbmdpbmUiCisgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0iJHtpZ25vcmVzeXN0ZW1jbGFzc2VzfSIvPgogICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFudHVuaXQucHJlc2VudCIKICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5hbnQuYW50dW5pdC5BbnRVbml0IgogICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiIGlnbm9yZXN5c3RlbWNsYXNzZXM9IiR7aWdub3Jlc3lzdGVtY2xhc3Nlc30iLz4KQEAgLTQxNyw2ICs0NzAsOSBAQAogICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImFwYWNoZS5vcm8ucHJlc2VudCIKICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS5vcm8udGV4dC5yZWdleC5QZXJsNU1hdGNoZXIiCiAgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0iJHtpZ25vcmVzeXN0ZW1jbGFzc2VzfSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9ImltYWdlaW8ucHJlc2VudCIKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iamF2YXguaW1hZ2Vpby5JbWFnZUlPIgorICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqbWYucHJlc2VudCIKICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0iamF2YXguc291bmQuc2FtcGxlZC5DbGlwIgogICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KQEAgLTQ0NCwxNSArNTAwLDkgQEAKICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJiY2VsLnByZXNlbnQiCiAgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUuYmNlbC5Db25zdGFudHMiCiAgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0iJHtpZ25vcmVzeXN0ZW1jbGFzc2VzfSIvPgotCi0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YW1haWwuY29tcGxldGUiPgotICAgICAgPGFuZD4KLSAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXIiCi0gICAgICAgICAgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KLSAgICAgICAgPGF2YWlsYWJsZSBjbGFzc25hbWU9ImphdmF4Lm1haWwuVHJhbnNwb3J0IgotICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiBpZ25vcmVzeXN0ZW1jbGFzc2VzPSIke2lnbm9yZXN5c3RlbWNsYXNzZXN9Ii8+Ci0gICAgICA8L2FuZD4KLSAgICA8L2NvbmRpdGlvbj4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqYXZhbWFpbC5wcmVzZW50IgorICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJqYXZheC5tYWlsLlRyYW5zcG9ydCIKKyAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiBpZ25vcmVzeXN0ZW1jbGFzc2VzPSIke2lnbm9yZXN5c3RlbWNsYXNzZXN9Ii8+CiAKICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0cy5hbmQuYW50LnNoYXJlLmNsYXNzbG9hZGVyIj4KICAgICAgIDxvcj4KQEAgLTUxMSwxMCArNTYxLDEzIEBACiAgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ianNjaC5wcmVzZW50IgogICAgICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20uamNyYWZ0LmpzY2guU2Vzc2lvbiIKICAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2xhc3NwYXRoIiBpZ25vcmVzeXN0ZW1jbGFzc2VzPSIke2lnbm9yZXN5c3RlbWNsYXNzZXN9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieHoucHJlc2VudCIKKyAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLnR1a2FhbmkueHouWFpPdXRwdXRTdHJlYW0iCisgICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIgaWdub3Jlc3lzdGVtY2xhc3Nlcz0iJHtpZ25vcmVzeXN0ZW1jbGFzc2VzfSIvPgogCiAgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ibW9kZXJuIi8+CiAKLSAgICA8IS0tY2hlY2sgZm9yIFhTRCBzdXBwb3J0IGluIHRoZSBwYXJzZXItLT4KKyAgICA8IS0tIGNoZWNrIGZvciBYU0Qgc3VwcG9ydCBpbiB0aGUgcGFyc2VyIC0tPgogICAgIDxjb25kaXRpb24gcHJvcGVydHk9InhtbHNjaGVtYS5wcmVzZW50Ij4KICAgICAgIDxvcj4KICAgICAgICAgPHBhcnNlcnN1cHBvcnRzIGZlYXR1cmU9Imh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIvPgpAQCAtNTIyLDE4ICs1NzUsMTUgQEAKICAgICAgIDwvb3I+CiAgICAgPC9jb25kaXRpb24+CiAKLSAgICA8IS0tIAotICAgIEphdmE4IGludHJvZHVjZWQgYSBIVE1MIGNoZWNrZXIgJ2RvY2xpbnQnIHdoaWNoIGlzIHZlcnkgc3RyaWN0IGFuZCBicmVha3MgCisgICAgPCEtLQorICAgIEphdmE4IGludHJvZHVjZWQgYSBIVE1MIGNoZWNrZXIgJ2RvY2xpbnQnIHdoaWNoIGlzIHZlcnkgc3RyaWN0IGFuZCBicmVha3MKICAgICB0aGUgYnVpbGQgaWYgdGhlcmUgaXMgYSBIVE1MIGVycm9yIGluIHRoZSBKYXZhRG9jLgogICAgIC0tPgotICAgIDxjb25kaXRpb24gCi0gICAgICBwcm9wZXJ0eT0iamF2YWRvYy5kb2NsaW50Lm5vbmUiIAotICAgICAgdmFsdWU9Ii1YZG9jbGludDpub25lIiAKLSAgICAgIGVsc2U9IiI+Ci0gICAgICA8YW5kPgotICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImpkazEuOCsiLz4KLSAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9IndpdGhEb2NsaW50Ii8+PC9ub3Q+Ci0gICAgICA8L2FuZD4KKyAgICA8Y29uZGl0aW9uCisgICAgICAgICAgICBwcm9wZXJ0eT0iamF2YWRvYy5kb2NsaW50Lm5vbmUiCisgICAgICAgICAgICB2YWx1ZT0iLVhkb2NsaW50Om5vbmUiCisgICAgICAgICAgICBlbHNlPSIiPgorICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9IndpdGhEb2NsaW50Ii8+PC9ub3Q+CiAgICAgPC9jb25kaXRpb24+CiAgIDwvdGFyZ2V0PgogCkBAIC01NDIsNyArNTkyLDcgQEAKICAgICAgICAgIFByZXBhcmUgdGhlIGJ1aWxkCiAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAtLT4KLSAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIj4KKyAgPHRhcmdldCBuYW1lPSJwcmVwYXJlIiBkZXBlbmRzPSJjaGVjay1vcHRpb25hbC1wYWNrYWdlcyI+CiAgICAgPHRzdGFtcD4KICAgICAgIDxmb3JtYXQgcHJvcGVydHk9InllYXIiIHBhdHRlcm49Inl5eXkiLz4KICAgICA8L3RzdGFtcD4KQEAgLTU1Niw1MCArNjA2LDM1IEBACiAgICAgICAgICBCdWlsZCB0aGUgY29kZQogICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUsY2hlY2stb3B0aW9uYWwtcGFja2FnZXMiCisgIDx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUsIGNvbXBpbGUsIGNvbXBpbGUtamRrOSsiIHVubGVzcz0ic2tpcC5idWlsZCIKICAgICAgICAgICBkZXNjcmlwdGlvbj0iLS0+IGNvbXBpbGVzIHRoZSBzb3VyY2UgY29kZSI+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5kaXJ9Ii8+Ci0gICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgotICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifSIvPgogCisgICAgPCEtLSBCdWlsZHMgYW5kIHZlcmlmaWVzIHRoYXQgdGhlIGNsYXNzZXMgYmVsb25naW5nIGluIHRoZSBjb25maW5lZCBwYWNrYWdlIG9mCisgICAganVuaXRsYXVuY2hlciB0YXNrIGRvIG5vdCBkZXBlbmQgb24gY2xhc3NlcyB0aGV5IGFyZW4ndCBtZWFudCB0byAtLT4KKyAgICA8IS0tIGZpcnN0IHdpcGUgb3V0IHRoZSAiY29uZmluZWQiIHBhY2thZ2UgdGhhdCBtaWdodCBoYXZlIGJlZW4gYnVpbHQgYWxyZWFkeQorICAgICBkdWUgdG8gdGhlIGphdmFjIGFib3ZlIC0tPgorICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmNsYXNzZXN9LyR7b3B0aW9uYWwucGFja2FnZX0vanVuaXRsYXVuY2hlci9jb25maW5lZC8iLz4KICAgICA8amF2YWMgc3JjZGlyPSIke2phdmEuZGlyfSIKICAgICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIgogICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IgogICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCiAgICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgaW5jbHVkZXM9IiR7b3B0aW9uYWwucGFja2FnZX0vanVuaXRsYXVuY2hlci9jb25maW5lZC8qKiIKICAgICAgICAgICAgdGFyZ2V0PSIke2phdmFjLnRhcmdldH0iCiAgICAgICAgICAgIHNvdXJjZT0iJHtqYXZhYy5zb3VyY2V9IgorICAgICAgICAgICByZWxlYXNlPSIke2phdmFjLnJlbGVhc2V9IgogICAgICAgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+CisgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICA8IS0tIEEgdmVyeSBsaW1pdGVkIGNsYXNzcGF0aCB3aGljaCBvbmx5IGRvZXNuJ3QgaW5jbHVkZSBvcHRpb25hbCBsaWJyYXJpZXMsCisgICAgICAgICB3aGljaCB0aGUgY2xhc3NlcyBpbiBjb25maW5lZCBwYWNrYWdlIGFyZW4ndCBtZWFudCB0byBkZXBlbmQgb24gLS0+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzfSI+CisgICAgICAgICAgPCEtLSBleGNsdWRlIHRoZSBvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyIHBhY2thZ2UKKyAgICAgICAgICBmcm9tIHRoZSBjbGFzc3BhdGgsIHNpbmNlIHRoZSBjb25maW5lZCBwYWNrYWdlIGlzbid0IG1lYW50IHRvIGRlcGVuZCBvbgorICAgICAgICAgIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIC0tPgorICAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvKiIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2NsYXNzcGF0aD4KIAotICAgICAgPHNlbGVjdG9yIGlkPSJjb25kaXRpb25hbC1wYXR0ZXJucyI+Ci0gICAgICAgIDxub3Q+Ci0gICAgICAgICAgPG9yPgotICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJub3QuaW4ua2FmZmUiIGlmPSJrYWZmZSIvPgotCi0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1yZXNvbHZlciIgdW5sZXNzPSJhcGFjaGUucmVzb2x2ZXIucHJlc2VudCIvPgotICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qdW5pdCIgdW5sZXNzPSJqdW5pdC5wcmVzZW50Ii8+IDwhLS0gVE9ETyBzaG91bGQgcGVyaGFwcyB1c2UgLXNvdXJjZSAxLjQ/IC0tPgotICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qdW5pdDQiIHVubGVzcz0ianVuaXQ0LnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLXJlZ2V4cCIgdW5sZXNzPSJhcGFjaGUucmVnZXhwLnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLW9ybyIgdW5sZXNzPSJhcGFjaGUub3JvLnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLWJjZWwiIHVubGVzcz0iYmNlbC5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1sb2c0aiIgdW5sZXNzPSJsb2c0ai5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmNvbW1vbnMtbG9nZ2luZyIgdW5sZXNzPSJjb21tb25zLmxvZ2dpbmcucHJlc2VudCIvPgotICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtYnNmIiB1bmxlc3M9ImJzZi5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmphdmFtYWlsIiB1bmxlc3M9ImphdmFtYWlsLmNvbXBsZXRlIi8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLm5ldHJleHgiIHVubGVzcz0ibmV0cmV4eC5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmNvbW1vbnMtbmV0IiB1bmxlc3M9ImNvbW1vbnMubmV0LnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYW50bHIiIHVubGVzcz0iYW50bHIucHJlc2VudCIvPgotICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qbWYiIHVubGVzcz0iam1mLnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamFpIiB1bmxlc3M9ImphaS5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpkZXBlbmQiIHVubGVzcz0iamRlcGVuZC5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnN3aW5nIiB1bmxlc3M9InN3aW5nLnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanNjaCIgdW5sZXNzPSJqc2NoLnByZXNlbnQiLz4KLSAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMueG1sc2NoZW1hIiB1bmxlc3M9InhtbHNjaGVtYS5wcmVzZW50Ii8+Ci0gICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS14YWxhbjIiIHVubGVzcz0icmVjZW50LnhhbGFuMi5wcmVzZW50Ii8+Ci0gICAgICAgICAgPC9vcj4KLSAgICAgICAgPC9ub3Q+Ci0gICAgICA8L3NlbGVjdG9yPgogICAgIDwvamF2YWM+CiAKICAgICA8Y29weSB0b2Rpcj0iJHtidWlsZC5jbGFzc2VzfSI+CkBAIC02MjQsMTAgKzY1OSw4MyBAQAogICAgICAgPGZpbGVzZXQgZGlyPSIke2V0Yy5kaXJ9Ij4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtZnJhbWVzLnhzbCIvPgogICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1ub2ZyYW1lcy54c2wiLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtZnJhbWVzLXNheG9uLnhzbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1ub2ZyYW1lcy1zYXhvbi54c2wiLz4KICAgICAgIDwvZmlsZXNldD4KICAgICA8L2NvcHk+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVwZW5kcz0icHJlcGFyZSI+CisgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7amF2YS5kaXJ9IgorICAgICAgICAgICBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiCisgICAgICAgICAgIGRlc3RkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCisgICAgICAgICAgIGRlYnVnPSIke2RlYnVnfSIKKyAgICAgICAgICAgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259IgorICAgICAgICAgICBleGNsdWRlcz0iJHtvcHRpb25hbC5wYWNrYWdlfS9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkLyoqIgorICAgICAgICAgICB0YXJnZXQ9IiR7amF2YWMudGFyZ2V0fSIKKyAgICAgICAgICAgc291cmNlPSIke2phdmFjLnNvdXJjZX0iCisgICAgICAgICAgIHJlbGVhc2U9IiR7amF2YWMucmVsZWFzZX0iCisgICAgICAgICAgIG9wdGltaXplPSIke29wdGltaXplfSI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KKworICAgICAgPHNlbGVjdG9yIGlkPSJjb25kaXRpb25hbC1wYXR0ZXJucyI+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPG9yPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGs5KyIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJub3QuaW4ua2FmZmUiIGlmPSJrYWZmZSIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtcmVzb2x2ZXIiIHVubGVzcz0iYXBhY2hlLnJlc29sdmVyLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXQiIHVubGVzcz0ianVuaXQucHJlc2VudCIvPiA8IS0tIFRPRE8gc2hvdWxkIHBlcmhhcHMgdXNlIC1zb3VyY2UgMS40PyAtLT4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXQ0IiB1bmxlc3M9Imp1bml0NC5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmp1bml0bGF1bmNoZXIiIHVubGVzcz0ianVuaXRsYXVuY2hlci5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmp1bml0LmVuZ2luZS52aW50YWdlIiB1bmxlc3M9Imp1bml0LmVuZ2luZS52aW50YWdlLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuanVuaXQuZW5naW5lLmp1cGl0ZXIiIHVubGVzcz0ianVuaXQuZW5naW5lLmp1cGl0ZXIucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtcmVnZXhwIiB1bmxlc3M9ImFwYWNoZS5yZWdleHAucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtb3JvIiB1bmxlc3M9ImFwYWNoZS5vcm8ucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5hcGFjaGUtYmNlbCIgdW5sZXNzPSJiY2VsLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuYXBhY2hlLWxvZzRqIiB1bmxlc3M9ImxvZzRqLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuY29tbW9ucy1sb2dnaW5nIiB1bmxlc3M9ImNvbW1vbnMubG9nZ2luZy5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS1ic2YiIHVubGVzcz0iYnNmLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamF2YW1haWwiIHVubGVzcz0iamF2YW1haWwucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5uZXRyZXh4IiB1bmxlc3M9Im5ldHJleHgucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5jb21tb25zLW5ldCIgdW5sZXNzPSJjb21tb25zLm5ldC5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFudGxyIiB1bmxlc3M9ImFudGxyLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuaW1hZ2VpbyIgdW5sZXNzPSJpbWFnZWlvLnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuam1mIiB1bmxlc3M9ImptZi5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmphaSIgdW5sZXNzPSJqYWkucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5qZGVwZW5kIiB1bmxlc3M9ImpkZXBlbmQucHJlc2VudCIvPgorICAgICAgICAgICAgPHNlbGVjdG9yIHJlZmlkPSJuZWVkcy5zd2luZyIgdW5sZXNzPSJzd2luZy5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmpzY2giIHVubGVzcz0ianNjaC5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLnh6IiB1bmxlc3M9Inh6LnByZXNlbnQiLz4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMueG1sc2NoZW1hIiB1bmxlc3M9InhtbHNjaGVtYS5wcmVzZW50Ii8+CisgICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9Im5lZWRzLmFwYWNoZS14YWxhbjIiIHVubGVzcz0icmVjZW50LnhhbGFuMi5wcmVzZW50Ii8+CisgICAgICAgICAgPC9vcj4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L3NlbGVjdG9yPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tcGlsZS1qZGs5KyIgZGVwZW5kcz0icHJlcGFyZSIgaWY9ImpkazkrIj4KKyAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmNsYXNzZXN9Ii8+CisKKyAgICA8amF2YWMgc3JjZGlyPSIke2phdmEuZGlyfSIKKyAgICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIgorICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXN9IgorICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCisgICAgICAgICAgIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKKyAgICAgICAgICAgdGFyZ2V0PSIke2phdmFjLnRhcmdldH0iCisgICAgICAgICAgIHNvdXJjZT0iJHtqYXZhYy5zb3VyY2V9IgorICAgICAgICAgICBvcHRpbWl6ZT0iJHtvcHRpbWl6ZX0iPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+CisKKyAgICAgIDxzZWxlY3RvciBpZD0iY29uZGl0aW9uYWwtcGF0dGVybnMtamRrOSsiPgorICAgICAgICAgIDxvcj4KKyAgICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuamRrOSsiLz4KKyAgICAgICAgICA8L29yPgorICAgICAgPC9zZWxlY3Rvcj4KKyAgICA8L2phdmFjPgorICA8L3RhcmdldD4KKwogICA8IS0tCiAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgQ3JlYXRlIHRoZSBhbGwgb2YgdGhlIEFwYWNoZSBBbnQgamFycwpAQCAtNjQ3LDI4ICs3NTUsOCBAQAogICAgICAgPG1hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSIqIiB0bz0iKi50eHQiLz4KICAgICA8L2NvcHk+CiAKLSAgICA8Y29weSBmaWxlPSIke21hbmlmZXN0fSIgdG9maWxlPSIke21hbmlmZXN0LnRtcH0iLz4KLSAgICA8bWFuaWZlc3QgZmlsZT0iJHttYW5pZmVzdC50bXB9Ij4KLSAgICAgIDxzZWN0aW9uIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vIj4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHRlbnNpb24tbmFtZSIKLSAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLz4KLSAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVRpdGxlIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSJBcGFjaGUgQW50Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iU3BlY2lmaWNhdGlvbi1WZW5kb3IiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIi8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVGl0bGUiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Ii8+Ci0gICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICB2YWx1ZT0iJHttYW5pZmVzdC12ZXJzaW9ufSIvPgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIKLSAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICA8L21hbmlmZXN0PgotCiAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7bmFtZX0tbGF1bmNoZXIuamFyIgotICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iIGluZGV4PSJ0cnVlIgogICAgICAgICAgd2hlbm1hbmlmZXN0b25seT0iZmFpbCI+CiAgICAgICA8c2VsZWN0b3IgcmVmaWQ9ImFudC5sYXVuY2hlciIvPgogICAgICAgPG1ldGFpbmYgZGlyPSIke2J1aWxkLmRpcn0iPgpAQCAtNjgxLDggKzc2OSw3IEBACiAgICAgPC9qYXI+CiAKICAgICA8amFyIGRlc3RmaWxlPSIke2J1aWxkLmxpYn0vJHtuYW1lfS5qYXIiCi0gICAgICAgICBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3R9IgorICAgICAgICAgYmFzZWRpcj0iJHtidWlsZC5jbGFzc2VzfSIgaW5kZXg9InRydWUiCiAgICAgICAgICB3aGVubWFuaWZlc3Rvbmx5PSJmYWlsIj4KICAgICAgIDwhLS0gVmVyaWZpY2F0aW9uOiAoY2QgZGlzdC9saWI7IGZvciBqIGluICouamFyOyBkbyBqYXIgdGYgJGo7IGRvbmUpIHwgZWdyZXAgLXYgJy8kfE1FVEEtSU5GL01BTklGRVNUXC5NRicgfCBzb3J0IHwgdW5pcSAtZCAtLT4KICAgICAgIDxzZWxlY3RvciByZWZpZD0iYW50LmNvcmUiLz4KQEAgLTY5MCwxMCArNzc3LDEwIEBACiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IkxJQ0VOU0UudHh0Ii8+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiLz4KICAgICAgIDwvbWV0YWluZj4KLQogICAgICAgPG1hbmlmZXN0PgorICAgICAgICA8YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIi8+CiAgICAgICAgIDxzZWN0aW9uIG5hbWU9IiR7YW50LnBhY2thZ2V9LyI+Ci0gICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJFeHRlbnNpb24tbmFtZSIKKyAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkV4dGVuc2lvbi1OYW1lIgogICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Ii8+CiAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVRpdGxlIgogICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkFwYWNoZSBBbnQiLz4KQEAgLTcxNyw3ICs4MDQsNiBAQAogCiAgICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7Ym9vdHN0cmFwLmphcn0iCiAgICAgICAgICBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3R9IgogICAgICAgICAgd2hlbm1hbmlmZXN0b25seT0iZmFpbCI+CiAgICAgICA8aW5jbHVkZSBuYW1lPSIke2FudC5wYWNrYWdlfS9NYWluLmNsYXNzIi8+CiAgICAgICA8bWV0YWluZiBkaXI9IiR7YnVpbGQuZGlyfSI+CkBAIC03MjUsOCArODExLDggQEAKICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTk9USUNFLnR4dCIvPgogICAgICAgPC9tZXRhaW5mPgogICAgICAgPG1hbmlmZXN0PgotICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkNsYXNzLVBhdGgiCi0gICAgICAgICAgICAgICAgICAgdmFsdWU9ImFudC5qYXIgeGFsYW4uamFyIi8+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4iLz4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iYW50LmphciB4YWxhbi5qYXIiLz4KICAgICAgIDwvbWFuaWZlc3Q+CiAgICAgPC9qYXI+CiAKQEAgLTczNCwxNCArODIwLDMxIEBACiAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlcCIvPgogICAgICAgPHNlcXVlbnRpYWw+CiAgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQubGlifS8ke29wdGlvbmFsLmphcnMucHJlZml4fS1Ae2RlcH0uamFyIgotICAgICAgICAgICAgIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgICAgbWFuaWZlc3Q9IiR7bWFuaWZlc3QudG1wfSIKKyAgICAgICAgICAgICBiYXNlZGlyPSIke2J1aWxkLmNsYXNzZXN9IiBpbmRleD0idHJ1ZSIKICAgICAgICAgICAgICB3aGVubWFuaWZlc3Rvbmx5PSIke29wdGlvbmFsLmphcnMud2hlbm1hbmlmZXN0b25seX0iPgogICAgICAgICAgIDxzZWxlY3RvciByZWZpZD0ibmVlZHMuQHtkZXB9Ii8+CiAgICAgICAgICAgPG1ldGFpbmYgZGlyPSIke2J1aWxkLmRpcn0iPgogICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiLz4KICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiLz4KICAgICAgICAgICA8L21ldGFpbmY+CisgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgPHNlY3Rpb24gbmFtZT0iJHtvcHRpb25hbC5wYWNrYWdlfS8iPgorICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkV4dGVuc2lvbi1OYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudCIvPgorICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkFwYWNoZSBBbnQiLz4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7bWFuaWZlc3QtdmVyc2lvbn0iLz4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVZlbmRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1UaXRsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLz4KKyAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke21hbmlmZXN0LXZlcnNpb259Ii8+CisgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVuZG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIvPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgIDwvbWFuaWZlc3Q+CiAgICAgICAgIDwvamFyPgogICAgICAgPC9zZXF1ZW50aWFsPgogICAgIDwvbWFjcm9kZWY+CkBAIC03NDksNiArODUyLDcgQEAKICAgICA8b3B0aW9uYWwtamFyIGRlcD0iYXBhY2hlLXJlc29sdmVyIi8+CiAgICAgPG9wdGlvbmFsLWphciBkZXA9Imp1bml0Ii8+CiAgICAgPG9wdGlvbmFsLWphciBkZXA9Imp1bml0NCIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqdW5pdGxhdW5jaGVyIi8+CiAgICAgPG9wdGlvbmFsLWphciBkZXA9ImFwYWNoZS1yZWdleHAiLz4KICAgICA8b3B0aW9uYWwtamFyIGRlcD0iYXBhY2hlLW9ybyIvPgogICAgIDxvcHRpb25hbC1qYXIgZGVwPSJhcGFjaGUtYmNlbCIvPgpAQCAtNzU5LDEyICs4NjMsMTQgQEAKICAgICA8b3B0aW9uYWwtamFyIGRlcD0ibmV0cmV4eCIvPgogICAgIDxvcHRpb25hbC1qYXIgZGVwPSJjb21tb25zLW5ldCIvPgogICAgIDxvcHRpb25hbC1qYXIgZGVwPSJhbnRsciIvPgorICAgIDxvcHRpb25hbC1qYXIgZGVwPSJpbWFnZWlvIi8+CiAgICAgPG9wdGlvbmFsLWphciBkZXA9ImptZiIvPgogICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqYWkiLz4KICAgICA8b3B0aW9uYWwtamFyIGRlcD0ic3dpbmciLz4KICAgICA8b3B0aW9uYWwtamFyIGRlcD0ianNjaCIvPgogICAgIDxvcHRpb25hbC1qYXIgZGVwPSJqZGVwZW5kIi8+CiAgICAgPG9wdGlvbmFsLWphciBkZXA9ImFwYWNoZS14YWxhbjIiLz4KKyAgICA8b3B0aW9uYWwtamFyIGRlcD0ieHoiLz4KIAogICA8L3RhcmdldD4KIApAQCAtNzc2LDcgKzg4Miw3IEBACiAgICAgICBXZSBjYW5ub3QgYnVpbGQgdGhlIHRlc3QgamFyIHVubGVzcyBKVW5pdCBpcyBwcmVzZW50LAogICAgICAgYXMgSlVuaXQgaXMgbmVlZGVkIHRvIGNvbXBpbGUgdGhlIHRlc3QgY2xhc3Nlcy4KICAgICA8L2ZhaWw+Ci0gICAgPGphciBkZXN0ZmlsZT0iJHtidWlsZC5saWJ9LyR7bmFtZX0tdGVzdHV0aWwuamFyIgorICAgIDxqYXIgZGVzdGZpbGU9IiR7YnVpbGQubGlifS8ke25hbWV9LXRlc3R1dGlsLmphciIgaW5kZXg9InRydWUiCiAgICAgICAgICBiYXNlZGlyPSIke2J1aWxkLnRlc3RzfSI+CiAgICAgICA8cGF0dGVybnNldCByZWZpZD0idXNlZnVsLnRlc3RzIi8+CiAgICAgICA8bWV0YWluZiBkaXI9IiR7YnVpbGQuZGlyfSI+CkBAIC04NDEsNiArOTQ3LDcgQEAKICAgICA8b3B0aW9uYWwtc3JjLWphciBkZXA9ImFwYWNoZS1yZXNvbHZlciIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0ianVuaXQiLz4KICAgICA8b3B0aW9uYWwtc3JjLWphciBkZXA9Imp1bml0NCIvPgorICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0ianVuaXRsYXVuY2hlciIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iYXBhY2hlLXJlZ2V4cCIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iYXBhY2hlLW9ybyIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iYXBhY2hlLWJjZWwiLz4KQEAgLTg1MSwxMiArOTU4LDE0IEBACiAgICAgPG9wdGlvbmFsLXNyYy1qYXIgZGVwPSJuZXRyZXh4Ii8+CiAgICAgPG9wdGlvbmFsLXNyYy1qYXIgZGVwPSJjb21tb25zLW5ldCIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iYW50bHIiLz4KKyAgICA8b3B0aW9uYWwtc3JjLWphciBkZXA9ImltYWdlaW8iLz4KICAgICA8b3B0aW9uYWwtc3JjLWphciBkZXA9ImptZiIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iamFpIi8+CiAgICAgPG9wdGlvbmFsLXNyYy1qYXIgZGVwPSJzd2luZyIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0ianNjaCIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iamRlcGVuZCIvPgogICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0iYXBhY2hlLXhhbGFuMiIvPgorICAgIDxvcHRpb25hbC1zcmMtamFyIGRlcD0ieHoiLz4KIAogICA8L3RhcmdldD4KIApAQCAtODc4LDcgKzk4Nyw3IEBACiAgICAgICAgICBDcmVhdGUgdGhlIGVzc2VudGlhbCBkaXN0cmlidXRpb24gdGhhdCBjYW4gcnVuIEFwYWNoZSBBbnQKICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC0tPgotICA8dGFyZ2V0IG5hbWU9ImRpc3QtbGl0ZSIgZGVwZW5kcz0iamFycyx0ZXN0LWphciIKKyAgPHRhcmdldCBuYW1lPSJkaXN0LWxpdGUiIGRlcGVuZHM9ImphcnMsdGVzdC1qYXIsLWFudC1kaXN0LXdhcm4tamRrOSsiCiAgICAgICAgICAgZGVzY3JpcHRpb249Ii0tPiBjcmVhdGVzIGEgbWluaW11bSBkaXN0cmlidXRpb24gdG8gcnVuIEFwYWNoZSBBbnQiPgogCiAgICAgPG1rZGlyIGRpcj0iJHtkaXN0LmRpcn0iLz4KQEAgLTkwOSwxOCArMTAxOCwyMyBAQAogICAgICAgPGluY2x1ZGUgbmFtZT0iKi5wbCIvPgogICAgIDwvZml4Y3JsZj4KIAotICAgIDxjaG1vZCBwZXJtPSJ1Z28rcngiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImRpciIgaW5jbHVkZXM9IioqIgotICAgICAgZmFpbG9uZXJyb3I9IiR7Y2htb2QuZmFpbH0iLz4KLSAgICA8Y2htb2QgcGVybT0idWdvK3IiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImZpbGUiIGluY2x1ZGVzPSIqKiIKLSAgICAgIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9IiBtYXhwYXJhbGxlbD0iJHtjaG1vZC5tYXhwYXJhbGxlbH0iLz4KLSAgICA8Y2htb2QgcGVybT0idWdvK3giIHR5cGU9ImZpbGUiIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9Ij4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNzU1IiBmYWlsb25lcnJvcj0iJHtzZXRwZXJtaXNzaW9ucy5mYWlsfSIKKyAgICAgICAgICAgICAgICAgICAgbm9uUG9zaXhNb2RlPSIke3NldHBlcm1pc3Npb25zLm5vbnBvc2l4bW9kZX0iPgorICAgICAgPGRpcnNldCBkaXI9IiR7ZGlzdC5kaXJ9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNjQ0IiBmYWlsb25lcnJvcj0iJHtzZXRwZXJtaXNzaW9ucy5mYWlsfSIKKyAgICAgICAgICAgICAgICAgICAgbm9uUG9zaXhNb2RlPSIke3NldHBlcm1pc3Npb25zLm5vbnBvc2l4bW9kZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuZGlyfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc1NSIgZmFpbG9uZXJyb3I9IiR7c2V0cGVybWlzc2lvbnMuZmFpbH0iCisgICAgICAgICAgICAgICAgICAgIG5vblBvc2l4TW9kZT0iJHtzZXRwZXJtaXNzaW9ucy5ub25wb3NpeG1vZGV9Ij4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LmJpbn0iPgogICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnQiLz4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50UnVuIi8+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucGwiLz4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5weSIvPgogICAgICAgPC9maWxlc2V0PgotICAgIDwvY2htb2Q+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KIAogICA8L3RhcmdldD4KIApAQCAtMTAwNSwxOCArMTExOSwyMyBAQAogICAgICAgPC9maWxlc2V0PgogICAgIDwvY29weT4KIAotICAgIDxjaG1vZCBwZXJtPSJ1Z28rcngiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImRpciIgaW5jbHVkZXM9IioqIgotICAgICAgZmFpbG9uZXJyb3I9IiR7Y2htb2QuZmFpbH0iLz4KLSAgICA8Y2htb2QgcGVybT0idWdvK3IiIGRpcj0iJHtkaXN0LmRpcn0iIHR5cGU9ImZpbGUiIGluY2x1ZGVzPSIqKiIKLSAgICAgIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9IiBtYXhwYXJhbGxlbD0iJHtjaG1vZC5tYXhwYXJhbGxlbH0iLz4KLSAgICA8Y2htb2QgcGVybT0idWdvK3giIHR5cGU9ImZpbGUiIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9Ij4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNzU1IiBmYWlsb25lcnJvcj0iJHtzZXRwZXJtaXNzaW9ucy5mYWlsfSIKKyAgICAgICAgICAgICAgICAgICAgbm9uUG9zaXhNb2RlPSIke3NldHBlcm1pc3Npb25zLm5vbnBvc2l4bW9kZX0iPgorICAgICAgPGRpcnNldCBkaXI9IiR7ZGlzdC5kaXJ9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNjQ0IiBmYWlsb25lcnJvcj0iJHtzZXRwZXJtaXNzaW9ucy5mYWlsfSIKKyAgICAgICAgICAgICAgICAgICAgbm9uUG9zaXhNb2RlPSIke3NldHBlcm1pc3Npb25zLm5vbnBvc2l4bW9kZX0iPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2Rpc3QuZGlyfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc1NSIgZmFpbG9uZXJyb3I9IiR7c2V0cGVybWlzc2lvbnMuZmFpbH0iCisgICAgICAgICAgICAgICAgICAgIG5vblBvc2l4TW9kZT0iJHtzZXRwZXJtaXNzaW9ucy5ub25wb3NpeG1vZGV9Ij4KICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkaXN0LmJpbn0iPgogICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnQiLz4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovYW50UnVuIi8+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyoucGwiLz4KICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5weSIvPgogICAgICAgPC9maWxlc2V0PgotICAgIDwvY2htb2Q+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KIAogICAgIDwhLS0gcHVibGlzaCBzb21lIHVzZWZ1bCBzdHlsZXNoZWV0cyAtLT4KICAgICA8Y29weSB0b2Rpcj0iJHtkaXN0LmV0Y30iPgpAQCAtMTEyMCwxOCArMTIzOSwyNiBAQAogICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHt0ZXN0cy5ldGMuZGlyfS90YXNrZGVmcy9maXhjcmxmL2lucHV0L0p1bms/LmphdmEiLz4KICAgICA8L2ZpeGNybGY+CiAKLSAgICA8Y2htb2QgcGVybT0idWdvK3giIGRpcj0iJHtzcmMuZGlzdC5kaXJ9IiB0eXBlPSJkaXIiCi0gICAgICBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSIvPgotICAgIDxjaG1vZCBwZXJtPSJ1Z28rciIgZGlyPSIke3NyYy5kaXN0LmRpcn0iIGZhaWxvbmVycm9yPSIke2NobW9kLmZhaWx9Ii8+Ci0gICAgPGNobW9kIHBlcm09InVnbyt4IiBmYWlsb25lcnJvcj0iJHtjaG1vZC5mYWlsfSI+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc1NSIgZmFpbG9uZXJyb3I9IiR7c2V0cGVybWlzc2lvbnMuZmFpbH0iCisgICAgICAgICAgICAgICAgICAgIG5vblBvc2l4TW9kZT0iJHtzZXRwZXJtaXNzaW9ucy5ub25wb3NpeG1vZGV9Ij4KKyAgICAgIDxkaXJzZXQgZGlyPSIke3NyYy5kaXN0LmRpcn0iLz4KKyAgICA8L3NldHBlcm1pc3Npb25zPgorCisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9IjY0NCIgZmFpbG9uZXJyb3I9IiR7c2V0cGVybWlzc2lvbnMuZmFpbH0iCisgICAgICAgICAgICAgICAgICAgIG5vblBvc2l4TW9kZT0iJHtzZXRwZXJtaXNzaW9ucy5ub25wb3NpeG1vZGV9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlzdC5kaXJ9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKworICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI3NTUiIGZhaWxvbmVycm9yPSIke3NldHBlcm1pc3Npb25zLmZhaWx9IgorICAgICAgICAgICAgICAgICAgICBub25Qb3NpeE1vZGU9IiR7c2V0cGVybWlzc2lvbnMubm9ucG9zaXhtb2RlfSI+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpc3QuZGlyfSI+Ci0gICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLy5zaCIvPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8ucGwiLz4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovLnB5Ii8+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqLyouc2giLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5wbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLnB5Ii8+CiAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2FudCIvPgogICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi9hbnRSdW4iLz4KICAgICAgIDwvZmlsZXNldD4KLSAgICA8L2NobW9kPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CiAKICAgPC90YXJnZXQ+CiAKQEAgLTExODEsMTAgKzEzMDgsMjggQEAKICAgPC9jb25kaXRpb24+CiAKICAgPHRhcmdldCBuYW1lPSJwa2ctZGlzdHJpYnV0aW9uIiBkZXBlbmRzPSJ6aXAtZGlzdHJpYnV0aW9uIiBpZj0iYnVpbGRvc3hwYWNrYWdlIj4KLSAgICA8ZXhlYyBleGVjdXRhYmxlPSJyZWxlYXNlL2J1aWxkLW9zeC1wa2cucHkiPgotICAgICAgPGFyZyB2YWx1ZT0iLS1vdXRwdXQtZGlyIi8+Ci0gICAgICA8YXJnIHZhbHVlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30iLz4KLSAgICAgIDxhcmcgdmFsdWU9IiR7ZGlzdC5iYXNlLmJpbmFyaWVzfS8ke2Rpc3QubmFtZX0tYmluLnppcCIvPgorICAgIDxta2RpciBkaXI9IiR7YnVpbGQucGtnLmRpcn0iLz4KKyAgICA8dW56aXAgc3JjPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi56aXAiIGRlc3Q9IiR7YnVpbGQucGtnLmRpcn0iPgorICAgICAgPG1hcHBlciB0eXBlPSJyZWdleHAiIGZyb209Il4oW14vXSopLyguKikkJCIgdG89IlwyIi8+CisgICAgPC91bnppcD4KKyAgICA8Y2htb2QgcGVybT0iK3giIHR5cGU9ImZpbGUiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLnBrZy5kaXJ9L2JpbiI+CisgICAgICAgIDxpbmNsdWRlIG5hbWU9ImFudCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJhbnRSdW4iLz4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi5wbCIvPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnB5Ii8+CisgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9jaG1vZD4KKyAgICA8ZXhlYyBleGVjdXRhYmxlPSIvdXNyL2Jpbi9wa2didWlsZCI+CisgICAgICA8YXJnIHZhbHVlPSItLXJvb3QiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7YnVpbGQucGtnLmRpcn0iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii0taWRlbnRpZmllciIvPgorICAgICAgPGFyZyB2YWx1ZT0ib3JnLmFwYWNoZS5hbnQiLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii0tdmVyc2lvbiIvPgorICAgICAgPGFyZyB2YWx1ZT0iJHtwcm9qZWN0LnZlcnNpb259Ii8+CisgICAgICA8YXJnIHZhbHVlPSItLWluc3RhbGwtbG9jYXRpb24iLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii91c3IvbG9jYWwvYW50Ii8+CisgICAgICA8YXJnIHZhbHVlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LnBrZyIvPgogICAgIDwvZXhlYz4KICAgPC90YXJnZXQ+CiAKQEAgLTEyMTQsNiArMTM1OSw4IEBACiAgICAgICAgICAgc3JjPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIiLz4KICAgICA8YnppcDIgZGVzdGZpbGU9IiR7ZGlzdC5iYXNlLmJpbmFyaWVzfS8ke2Rpc3QubmFtZX0tYmluLnRhci5iejIiCiAgICAgICAgICAgIHNyYz0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyR7ZGlzdC5uYW1lfS1iaW4udGFyIi8+CisgICAgPHh6IGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIueHoiCisgICAgICAgIHNyYz0iJHtkaXN0LmJhc2UuYmluYXJpZXN9LyR7ZGlzdC5uYW1lfS1iaW4udGFyIi8+CiAgICAgPGRlbGV0ZSBmaWxlPSIke2Rpc3QuYmFzZS5iaW5hcmllc30vJHtkaXN0Lm5hbWV9LWJpbi50YXIiLz4KICAgPC90YXJnZXQ+CiAKQEAgLTEyNjEsNiArMTQwOCw4IEBACiAgICAgICAgICAgc3JjPSIke2Rpc3QuYmFzZS5tYW51YWx9LyR7ZGlzdC5uYW1lfS1tYW51YWwudGFyIi8+CiAgICAgPGJ6aXAyIGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5tYW51YWx9LyR7ZGlzdC5uYW1lfS1tYW51YWwudGFyLmJ6MiIKICAgICAgICAgICAgc3JjPSIke2Rpc3QuYmFzZS5tYW51YWx9LyR7ZGlzdC5uYW1lfS1tYW51YWwudGFyIi8+CisgICAgPHh6IGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5tYW51YWx9LyR7ZGlzdC5uYW1lfS1tYW51YWwudGFyLnh6IgorICAgICAgICBzcmM9IiR7ZGlzdC5iYXNlLm1hbnVhbH0vJHtkaXN0Lm5hbWV9LW1hbnVhbC50YXIiLz4KICAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlzdC5iYXNlLm1hbnVhbH0vJHtkaXN0Lm5hbWV9LW1hbnVhbC50YXIiLz4KIAogICAgIDxkZWxldGUgZGlyPSIke2Rpc3QubmFtZX0iLz4KQEAgLTEzMDgsNiArMTQ1Nyw4IEBACiAgICAgICAgICAgc3JjPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyIi8+CiAgICAgPGJ6aXAyIGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyLmJ6MiIKICAgICAgICAgICAgc3JjPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyIi8+CisgICAgPHh6IGRlc3RmaWxlPSIke2Rpc3QuYmFzZS5zb3VyY2V9LyR7ZGlzdC5uYW1lfS1zcmMudGFyLnh6IgorICAgICAgICBzcmM9IiR7ZGlzdC5iYXNlLnNvdXJjZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXIiLz4KICAgICA8ZGVsZXRlIGZpbGU9IiR7ZGlzdC5iYXNlLnNvdXJjZX0vJHtkaXN0Lm5hbWV9LXNyYy50YXIiLz4KICAgICA8ZGVsZXRlIGRpcj0iJHtkaXN0Lm5hbWV9Ii8+CiAgICAgPGNoZWNrc3Vtcz4KQEAgLTEzNDYsOCArMTQ5NywxMCBAQAogICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY2xlYW5zIHVwIGV2ZXJ5dGhpbmciPgogICAgIDxkZWxldGUgZmlsZT0iJHtib290c3RyYXAuZGlyfS9iaW4vYW50UnVuIi8+CiAgICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi9hbnRSdW4uYmF0Ii8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi8qLnBsIi8+Ci0gICAgPGRlbGV0ZSBmaWxlPSIke2Jvb3RzdHJhcC5kaXJ9L2Jpbi8qLnB5Ii8+CisgICAgPGRlbGV0ZT4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHtib290c3RyYXAuZGlyfS9iaW4iIGluY2x1ZGVzPSIqLnBsIi8+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7Ym9vdHN0cmFwLmRpcn0vYmluIiBpbmNsdWRlcz0iKi5weSIvPgorICAgIDwvZGVsZXRlPgogICA8L3RhcmdldD4KIAogICA8IS0tCkBAIC0xMzc0LDIwICsxNTI3LDIwIEBACiAgICAgICAgICBDcmVhdGVzIHRoZSBBUEkgZG9jdW1lbnRhdGlvbgogICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2hlY2stamF2YWRvYyI+CisgIDx0YXJnZXQgbmFtZT0iY2hlY2stamF2YWRvYyIgZGVwZW5kcz0icHJlcGFyZSI+CiAgICAgPHVwdG9kYXRlIHByb3BlcnR5PSJqYXZhZG9jLm5vdHJlcXVpcmVkIgotICAgICAgdGFyZ2V0ZmlsZT0iJHtidWlsZC5qYXZhZG9jc30vcGFja2FnZXMuaHRtbCI+CisgICAgICAgICAgICAgIHRhcmdldGZpbGU9IiR7YnVpbGQuamF2YWRvY3N9L3BhY2thZ2VzLmh0bWwiPgogICAgICAgPHNyY2ZpbGVzIGRpcj0iJHtqYXZhLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmphdmEiLz4KICAgICA8L3VwdG9kYXRlPgogICAgIDx1cHRvZGF0ZSBwcm9wZXJ0eT0idGVzdHMuamF2YWRvYy5ub3RyZXF1aXJlZCIKLSAgICAgIHRhcmdldGZpbGU9IiR7YnVpbGQudGVzdHMuamF2YWRvY3N9L3BhY2thZ2VzLmh0bWwiPgorICAgICAgICAgICAgICB0YXJnZXRmaWxlPSIke2J1aWxkLnRlc3RzLmphdmFkb2NzfS9wYWNrYWdlcy5odG1sIj4KICAgICAgIDxzcmNmaWxlcyBkaXI9IiR7c3JjLmp1bml0fSI+CiAgICAgICAgIDxwYXR0ZXJuc2V0IHJlZmlkPSJ1c2VmdWwudGVzdHMiLz4KICAgICAgIDwvc3JjZmlsZXM+CiAgICAgPC91cHRvZGF0ZT4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqYXZhZG9jcyIgZGVwZW5kcz0icHJlcGFyZSxjaGVjay1qYXZhZG9jLGNoZWNrLW9wdGlvbmFsLXBhY2thZ2VzIgorICA8dGFyZ2V0IG5hbWU9ImphdmFkb2NzIiBkZXBlbmRzPSJjaGVjay1qYXZhZG9jIgogICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24iIHVubGVzcz0iamF2YWRvYy5ub3RyZXF1aXJlZCI+CiAgICAgPG1rZGlyIGRpcj0iJHtidWlsZC5qYXZhZG9jc30iLz4KICAgICA8amF2YWRvYyB1c2VleHRlcm5hbGZpbGU9InllcyIKQEAgLTEzOTksNyArMTU1Miw4IEBACiAgICAgICAgICAgICAgd2luZG93dGl0bGU9IiR7TmFtZX0gQVBJIgogICAgICAgICAgICAgIGRvY3RpdGxlPSIke05hbWV9IgogICAgICAgICAgICAgIG1heG1lbW9yeT0iMTAwME0iCi0gICAgICAgICAgICAgdmVyYm9zZT0iJHtqYXZhZG9jLnZlcmJvc2V9Ij4KKyAgICAgICAgICAgICB2ZXJib3NlPSIke2phdmFkb2MudmVyYm9zZX0iCisgICAgICAgICAgICAgYWRkaXRpb25hbHBhcmFtPSIke2phdmFkb2MuZG9jbGludC5ub25lfSI+CiAKICAgICAgIDxwYWNrYWdlc2V0IGRpcj0iJHtqYXZhLmRpcn0iLz4KIApAQCAtMTQyMCw3ICsxNTc0LDcgQEAKICAgICA8L2phdmFkb2M+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idGVzdC1qYXZhZG9jcyIgZGVwZW5kcz0icHJlcGFyZSxjaGVjay1qYXZhZG9jIiB1bmxlc3M9InRlc3RzLmphdmFkb2Mubm90cmVxdWlyZWQiCisgIDx0YXJnZXQgbmFtZT0idGVzdC1qYXZhZG9jcyIgZGVwZW5kcz0iY2hlY2stamF2YWRvYyIgdW5sZXNzPSJ0ZXN0cy5qYXZhZG9jLm5vdHJlcXVpcmVkIgogICAgICAgICAgIGRlc2NyaXB0aW9uPSItLT4gY3JlYXRlcyB0aGUgQVBJIGRvY3VtZW50YXRpb24gZm9yIHRlc3QgdXRpbGl0aWVzIj4KICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLnRlc3RzLmphdmFkb2NzfSIvPgogICAgIDxqYXZhZG9jIHVzZWV4dGVybmFsZmlsZT0ieWVzIgpAQCAtMTQzMCw3ICsxNTg0LDggQEAKICAgICAgICAgICAgICB2ZXJzaW9uPSJ0cnVlIgogICAgICAgICAgICAgIGxvY2FsZT0iZW4iCiAgICAgICAgICAgICAgd2luZG93dGl0bGU9IiR7TmFtZX0gVGVzdCBVdGlsaXRpZXMiCi0gICAgICAgICAgICAgZG9jdGl0bGU9IiR7TmFtZX0iPgorICAgICAgICAgICAgIGRvY3RpdGxlPSIke05hbWV9IgorICAgICAgICAgICAgIGFkZGl0aW9uYWxwYXJhbT0iJHtqYXZhZG9jLmRvY2xpbnQubm9uZX0iPgogCiAgICAgICA8IS0tIGhpZGUgc29tZSBtZXRhIGluZm9ybWF0aW9uIGZvciBqYXZhZG9jIC0tPgogICAgICAgPHRhZyBuYW1lPSJwcmUiIGRlc2NyaXB0aW9uPSJQcmVjb25kaXRpb246IiBzY29wZT0iYWxsIi8+CkBAIC0xNDU2LDYgKzE2MTEsNyBAQAogICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iCiAgICAgICAgICAgIHRhcmdldD0iJHtqYXZhYy50YXJnZXR9IgogICAgICAgICAgICBzb3VyY2U9IiR7amF2YWMuc291cmNlfSIKKyAgICAgICAgICAgcmVsZWFzZT0iJHtqYXZhYy5yZWxlYXNlfSIKICAgICAgICAgICAgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259Ij4KICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RzLWNsYXNzcGF0aCIvPgogCkBAIC0xNTU0LDYgKzE3MTAsMTEgQEAKIAogICA8dGFyZ2V0IG5hbWU9InRlc3QtaW5pdCIgZGVwZW5kcz0icHJvYmUtb2ZmbGluZSxjaGVjay1vcHRpb25hbC1wYWNrYWdlcyxkdW1wLWluZm8iPgogICAgIDxta2RpciBkaXI9IiR7YnVpbGQuanVuaXQudG1wZGlyfSIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InN1bi5pby51c2VDYW5vbkNhY2hlcyIgdmFsdWU9ImZhbHNlIj4KKyAgICAgIDxub3Q+CisgICAgICAgIDxqYXZhdmVyc2lvbiBhdGxlYXN0PSI5Ii8+CisgICAgICA8L25vdD4KKyAgICA8L2NvbmRpdGlvbj4KICAgICA8bWFjcm9kZWYgbmFtZT0idGVzdC1qdW5pdCI+CiAgICAgICA8ZWxlbWVudCBuYW1lPSJqdW5pdC1uZXN0ZWQiIGltcGxpY2l0PSJ0cnVlIi8+CiAgICAgICA8c2VxdWVudGlhbD4KQEAgLTE1ODksNyArMTc1MCw3IEBACiAgICAgICAgICAgICAgICBlcnJvcnByb3BlcnR5PSJqdW5pdC5mYWlsZWQiCiAgICAgICAgICAgICAgICBmaWx0ZXJ0cmFjZT0iJHtqdW5pdC5maWx0ZXJ0cmFjZX0iPgogICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImFudC5ob21lIiB2YWx1ZT0iJHthbnQuaG9tZX0iLz4KLSAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJidWlsZC50ZXN0cyIgZmlsZT0iJHtidWlsZC50ZXN0c30iLz4KKyAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJidWlsZC5jbGFzc2VzLnZhbHVlIiB2YWx1ZT0iJHtidWlsZC5jbGFzc2VzLnZhbHVlfSIvPgogICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImJ1aWxkLnRlc3RzLnZhbHVlIiB2YWx1ZT0iJHtidWlsZC50ZXN0cy52YWx1ZX0iLz4KICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJvZmZsaW5lIiB2YWx1ZT0iJHtvZmZsaW5lfSIvPgogICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InRlc3RzLWNsYXNzcGF0aC52YWx1ZSIKQEAgLTE1OTksNiArMTc2MCwxMSBAQAogICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9InRlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSIke3Rlc3RzLmFuZC5hbnQuc2hhcmUuY2xhc3Nsb2FkZXJ9Ii8+CiAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iamF2YS5pby50bXBkaXIiIGZpbGU9IiR7YnVpbGQuanVuaXQudG1wZGlyfSIvPgorICAgICAgICAgIDwhLS0gaW4gSmF2YTggdGhlIGNhbm9uaWNhbCBjYWNoZSBzZWVtcyB0byBpbnRlcmZlcmUgd2l0aAorICAgICAgICAgICAgICAgb3VyIHN5bWxpbmsgdGVzdHMgLS0+CisgICAgICAgICAgPHN5c3Byb3BlcnR5c2V0PgorICAgICAgICAgICAgPHByb3BlcnR5cmVmIG5hbWU9InN1bi5pby51c2VDYW5vbkNhY2hlcyIvPgorICAgICAgICAgIDwvc3lzcHJvcGVydHlzZXQ+CiAgICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJ0ZXN0cy1ydW50aW1lLWNsYXNzcGF0aCIvPgogICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2p1bml0LmNvbGxlY3Rvci5kaXJ9Ii8+CkBAIC0xNzIxLDYgKzE4ODcsNyBAQAogICAgICAgICAgIDwhLS0gYWJzdHJhY3QgY2xhc3Nlcywgbm90IHRlc3RjYXNlcyAtLT4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3Rhc2tkZWZzLnBhY2thZ2V9L1Rhc2tkZWZzVGVzdC5qYXZhIi8+CiAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vQnVpbGRGaWxlVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iJHthbnQucGFja2FnZX0vTWFnaWNUZXN0TmFtZXMuamF2YSIvPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7cmVnZXhwLnBhY2thZ2V9L1JlZ2V4cE1hdGNoZXJUZXN0LmphdmEiLz4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke3JlZ2V4cC5wYWNrYWdlfS9SZWdleHBUZXN0LmphdmEiLz4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L0Fic3RyYWN0WFNMVExpYWlzb25UZXN0LmphdmEiLz4KQEAgLTE3MzMsMTIgKzE5MDAsMTQgQEAKICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0L1Rlc3RGb3JtYXR0ZXIuamF2YSIvPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7YW50LnBhY2thZ2V9L1Rlc3RIZWxwZXIuamF2YSIvPgogCisgICAgICAgICAgPCEtLSBKVW5pdCA1IC8ganVuaXRsYXVuY2hlciB0ZXN0cyB0aGF0IGFyZW4ndCBtZWFudCB0byBydW4gYnkganVuaXQgdGFzayAtLT4KKyAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIke29wdGlvbmFsLnBhY2thZ2V9L2p1bml0bGF1bmNoZXIvIi8+CisKICAgICAgICAgICA8IS0tIGludGVyYWN0aXZlIHRlc3RzIC0tPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7dGFza2RlZnMucGFja2FnZX0vVGVzdFByb2Nlc3MuamF2YSIvPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IiR7b3B0aW9uYWwucGFja2FnZX0vc3BsYXNoL1NwbGFzaFNjcmVlblRlc3QuamF2YSIvPgogCi0gICAgICAgICAgPCEtLSBvbmx5IHJ1biB0aGVzZSB0ZXN0cyBpZiB0aGVpciByZXF1aXJlZCBsaWJyYXJpZXMgYXJlCi0gICAgICAgICAgICAgICBpbnN0YWxsZWQgLS0+CisgICAgICAgICAgPCEtLSBvbmx5IHJ1biB0aGVzZSB0ZXN0cyBpZiB0aGVpciByZXF1aXJlZCBsaWJyYXJpZXMgYXJlIGluc3RhbGxlZCAtLT4KICAgICAgICAgICA8c2VsZWN0b3IgcmVmaWQ9ImNvbmRpdGlvbmFsLXBhdHRlcm5zIi8+CiAKICAgICAgICAgICA8IS0tIHRlc3RzIGV4Y2x1ZGVkIGlmIHRoZSB0ZXN0IGlzIHJ1biBpbiBvZmZsaW5lIG1vZGUgLS0+CkBAIC0xODczLDYgKzIwNDIsMTAgQEAKICAgICAgIDxlY2hvPkFudFVuaXQgdGVzdHMgbXVzdCBiZSBydW4gd2l0aCAke2Jvb3RzdHJhcC5kaXJ9IChvciAke2Rpc3QuZGlyfSksIG5vdCAke2FudC5ob21lfS4gVHJ5ICcuL2J1aWxkLnNoIGFudHVuaXQtdGVzdHMnIGZvciBleGFtcGxlLjwvZWNobz4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSItYW50LWRpc3Qtd2Fybi1qZGs5KyIgdW5sZXNzPSJqZGs5KyI+CisgICAgICA8ZWNobz5KYXZhIDkrIGZlYXR1cmVzIHdvbid0IGJlIGF2YWlsYWJsZSBpbiB0aGUgZGlzdHJpYnV0aW9uPC9lY2hvPgorICA8L3RhcmdldD4KKwogICA8dGFyZ2V0IG5hbWU9ImFudHVuaXQtdGVzdHMiIGRlcGVuZHM9ImJ1aWxkLHRlc3QtaW5pdCwtYW50dW5pdC13YXJuLWxvY2F0aW9uIiBpZj0icnVuLmFudHVuaXQiCiAgICAgICAgICAgZGVzY3JpcHRpb249Ii0tPiBydW4gdGhlIGFudHVuaXQgdGVzdHMiPgogICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImFudHVuaXQuaW5jbHVkZXMiIHZhbHVlPSIke2FudHVuaXQudGVzdGNhc2V9IgpkaWZmIC0tZ2l0IGEvY2hlY2sueG1sIGIvY2hlY2sueG1sCmluZGV4IGI1YTY1ODYuLmZlM2JhY2MgMTAwNjQ0Ci0tLSBhL2NoZWNrLnhtbAorKysgYi9jaGVjay54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDQzICsxOCw2NSBAQAogPHByb2plY3QgZGVmYXVsdD0iY2hlY2tzdHlsZSIgbmFtZT0iQ2hlY2tBbnQiIHhtbG5zOml2eT0iYW50bGliOm9yZy5hcGFjaGUuaXZ5LmFudCIgeG1sbnM6aWY9ImFudDppZiIgeG1sbnM6dW5sZXNzPSJhbnQ6dW5sZXNzIj4KIAogICA8ZGVzY3JpcHRpb24+Ci0gICAgQ2hlY2sgQW50cyBjb2RlYmFzZSBhZ2FpbnN0IGNlcnRhaW4gY29kZSBzdHlsZWd1aWRlIHJ1bGVzIHVzaW5nCi0gICAgY2hlY2tzdHlsZSBhbmQgc2ltaWFuLgorICAgIENoZWNrIEFudCBjb2RlYmFzZSBhZ2FpbnN0IGNlcnRhaW4gY29kZSBzdHlsZSBndWlkZWxpbmVzIHVzaW5nCisgICAgQ2hlY2tzdHlsZSwgQXBhY2hlIFJhdCwgU3BvdEJ1Z3MsIE9XQVNQIERlcGVuZGVuY3kgQ2hlY2ssIFNpbWlhbgorICAgIGFuZCBOdSBIdG1sIENoZWNrZXIgKHYuTnUpLgogCiAgICAgQ2hlY2tzdHlsZSB1c2VzIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIChBU1QpIGZvciBkb2luZyBjaGVja3MKLSAgICBhZ2FpbnN0IGphdmEgc291cmNlcy4gSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9jaGVja3N0eWxlLnNvdXJjZWZvcmdlLm5ldC8KKyAgICBhZ2FpbnN0IEphdmEgc291cmNlcy4gSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vY2hlY2tzdHlsZS5vcmcvCiAgICAgdW5kZXIgR1BMIDIuMSBsaWNlbnNlLgogCi0gICAgIlNpbWlhbiAoU2ltaWxhcml0eSBBbmFseXNlcikgaWRlbnRpZmllcyBkdXBsaWNhdGlvbiBpbiBKYXZhLCBDIywgQywKLSAgICBDUFAsIENPQk9MLCBKU1AsIEhUTUwgc291cmNlIGNvZGUgYW5kIGV2ZW4gcGxhaW4gdGV4dCBmaWxlcy4iCi0gICAgSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cucmVkaGlsbGNvbnN1bHRpbmcuY29tLmF1L3Byb2R1Y3RzL3NpbWlhbi8KKyAgICAiQXBhY2hlIFJhdCBpcyBhIHJlbGVhc2UgYXVkaXQgdG9vbCwgZm9jdXNlZCBvbiBsaWNlbnNlcy4iIEl0IGlzIGF2YWlsYWJsZQorICAgIGF0IGh0dHBzOi8vY3JlYWR1ci5hcGFjaGUub3JnL3JhdC8gdW5kZXIgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLgorCisgICAgIlNwb3RCdWdzIGlzIGEgcHJvZ3JhbSB3aGljaCB1c2VzIHN0YXRpYyBhbmFseXNpcyB0byBsb29rIGZvciBidWdzIGluIEphdmEKKyAgICBjb2RlLiIgSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vc3BvdGJ1Z3MuZ2l0aHViLmlvLyB1bmRlciBMR1BMIDMgbGljZW5zZS4KKworICAgICJEZXBlbmRlbmN5LUNoZWNrIGlzIGEgdXRpbGl0eSB0aGF0IGlkZW50aWZpZXMgcHJvamVjdCBkZXBlbmRlbmNpZXMgYW5kCisgICAgY2hlY2tzIGlmIHRoZXJlIGFyZSBhbnkga25vd24sIHB1YmxpY2x5IGRpc2Nsb3NlZCwgdnVsbmVyYWJpbGl0aWVzLiIgSXQgaXMKKyAgICBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cub3dhc3Aub3JnL2luZGV4LnBocC9PV0FTUF9EZXBlbmRlbmN5X0NoZWNrIHVuZGVyCisgICAgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLgorCisgICAgIlNpbWlhbiAoU2ltaWxhcml0eSBBbmFseXNlcikgaWRlbnRpZmllcyBkdXBsaWNhdGlvbiBpbiBKYXZhLCBDIywgQywgQ1BQLAorICAgIENPQk9MLCBSdWJ5LCBKU1AsIEFTUCwgSFRNTCwgWE1MLCBWaXN1YWwgQmFzaWMsIEdyb292eSBzb3VyY2UgY29kZSBhbmQgZXZlbgorICAgIHBsYWluIHRleHQgZmlsZXMuIiAgSXQgaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmhhcnVraXphZW1vbi5jb20vc2ltaWFuLwogICAgIGFuZCBpcyBmb3IgZnJlZSB1c2UgaW4gb3BlbiBzb3VyY2UgcHJvamVjdHMuCiAKKyAgICAiVGhlIE51IEh0bWwgQ2hlY2tlciAodi5OdSkgaXMgdGhlIGJhY2tlbmQgb2YgY2hlY2tlci5odG1sNS5vcmcsCisgICAgaHRtbDUudmFsaWRhdG9yLm51LCBhbmQgdmFsaWRhdG9yLnczLm9yZy9udS4iIEl0IGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vdmFsaWRhdG9yLmdpdGh1Yi5pby92YWxpZGF0b3IvIHVuZGVyIE1JVCBsaWNlbnNlLgorCiAgICAgU2VlIGV4dGVybmFsIHRhc2sgcGFnZSBhbmQgaG9tZXBhZ2VzIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICA8L2Rlc2NyaXB0aW9uPgogCiAgIDxpbXBvcnQgZmlsZT0iYnVpbGQueG1sIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnRzLmRpciIKKyAgICAgICAgICAgIHZhbHVlPSIke2J1aWxkLmRpcn0vcmVwb3J0cyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJCYXNlIGRpcmVjdG9yeSBmb3IgZ2VuZXJhdGVkIHJlcG9ydHMiLz4KIAotICA8cHJvcGVydHkgbmFtZT0iY29uZmlnLmRpciIgbG9jYXRpb249IiR7ZXRjLmRpcn0vY2hlY2tzdHlsZSIvPgogCi0gIDwhLS0gQW50IENoZWNrc3R5bGUgcmVwb3J0IC0tPgorICA8IS0tIEFudCBDaGVja3N0eWxlIC0tPgorICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5zcmMuZGlyIiBsb2NhdGlvbj0iJHtldGMuZGlyfS9jaGVja3N0eWxlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLnZlcnNpb24iCisgICAgICAgICAgICB2YWx1ZT0iNi4xOSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGljaCB2ZXJzaW9uIG9mIENoZWNrc3R5bGUgdG8gdXNlIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLnJlcG9ydGRpciIKLSAgICAgICAgICAgIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vcmVwb3J0cy9jaGVja3N0eWxlIgorICAgICAgICAgICAgbG9jYXRpb249IiR7cmVwb3J0cy5kaXJ9L2NoZWNrc3R5bGUiCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgQ2hlY2tzdHlsZSByZXBvcnRzIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLnJhdyIKICAgICAgICAgICAgIGxvY2F0aW9uPSIke2NoZWNrc3R5bGUucmVwb3J0ZGlyfS9yYXcueG1sIgotICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgQ2hlY2tzdHlsZSBYTUwtUmVwb3J0Ii8+CisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiBDaGVja3N0eWxlIFhNTCByZXBvcnQiLz4KICAgPHByb3BlcnR5IG5hbWU9InN0eWxlc2hlZXQuaHRtbCIKLSAgICAgICAgICAgIGxvY2F0aW9uPSIke2NvbmZpZy5kaXJ9L2NoZWNrc3R5bGUtZnJhbWVzLnhzbCIKKyAgICAgICAgICAgIGxvY2F0aW9uPSIke2NoZWNrc3R5bGUuc3JjLmRpcn0vY2hlY2tzdHlsZS1mcmFtZXMueHNsIgogICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgQ2hlY2tzdHlsZSBYU0xUIGZvciBnZW5lcmF0aW5nIEhUTUwiLz4KICAgPHByb3BlcnR5IG5hbWU9InN0eWxlc2hlZXQuaHRtbC5zb3J0ZWQiCi0gICAgICAgICAgICBsb2NhdGlvbj0iJHtjb25maWcuZGlyfS9jaGVja3N0eWxlLWZyYW1lcy1zb3J0YnktY2hlY2sueHNsIgorICAgICAgICAgICAgbG9jYXRpb249IiR7Y2hlY2tzdHlsZS5zcmMuZGlyfS9jaGVja3N0eWxlLWZyYW1lcy1zb3J0YnktY2hlY2sueHNsIgogICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgQ2hlY2tzdHlsZSBYU0xUIGZvciBnZW5lcmF0aW5nIDJuZCBIVE1MIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJzdHlsZXNoZWV0LnRleHQiCi0gICAgICAgICAgICBsb2NhdGlvbj0iJHtjb25maWcuZGlyfS9jaGVja3N0eWxlLXRleHQueHNsIgorICAgICAgICAgICAgbG9jYXRpb249IiR7Y2hlY2tzdHlsZS5zcmMuZGlyfS9jaGVja3N0eWxlLXRleHQueHNsIgogICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgQ2hlY2tzdHlsZSBYU0xUIGZvciBnZW5lcmF0aW5nIHBsYWluIHRleHQiLz4KICAgPHByb3BlcnR5IG5hbWU9InN0eWxlc2hlZXQueGRvYyIKLSAgICAgICAgICAgIGxvY2F0aW9uPSIke2NvbmZpZy5kaXJ9L2NoZWNrc3R5bGUteGRvYy54c2wiCisgICAgICAgICAgICBsb2NhdGlvbj0iJHtjaGVja3N0eWxlLnNyYy5kaXJ9L2NoZWNrc3R5bGUteGRvYy54c2wiCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iTmFtZSBvZiBDaGVja3N0eWxlIFhTTFQgZm9yIGdlbmVyYXRpbmcgWERPQyIvPgogCiAgIDxwcm9wZXJ0eSBuYW1lPSJjaGVja3N0eWxlLmJhc2VkaXIiCkBAIC02NCwzNSArODYsMzggQEAKICAgICAgICAgICAgIHZhbHVlPSIqKi8qLmphdmEiCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5jbHVkZSBwYXR0ZXJuIG9mIHRoZSBmaWxlcyB0byBjaGVjayIvPgogCi0gIDwhLS0gRmluZGJ1Z3M6IFJ1bm5pbmcgRmluZGJ1Z3MgLS0+CisgIDwhLS0gRmluZGJ1Z3M6IFJ1bm5pbmcgU3BvdEJ1Z3MgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzcG90YnVncy52ZXJzaW9uIgorICAgICAgICAgICAgdmFsdWU9IjMuMS40IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IldoaWNoIHZlcnNpb24gb2YgU3BvdEJ1Z3MgdG8gdXNlIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJmaW5kYnVncy5yZXBvcnRkaXIiCi0gICAgICAgICAgICBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3JlcG9ydHMvZmluZGJ1Z3MiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgRmluZGJ1Z3MgcmVzdWx0cyIvPgorICAgICAgICAgICAgbG9jYXRpb249IiR7cmVwb3J0cy5kaXJ9L2ZpbmRidWdzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IldoZXJlIHRvIHN0b3JlIFNwb3RCdWdzIHJlc3VsdHMiLz4KICAgPHByb3BlcnR5IG5hbWU9ImZpbmRidWdzLnJhdyIKICAgICAgICAgICAgIHZhbHVlPSJyYXcueG1sIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkZpbmRidWdzIE91dHB1dCB4bWwtZmlsZSIvPgorICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgU3BvdEJ1Z3MgWE1MIHJlcG9ydCIvPgogICA8cHJvcGVydHkgbmFtZT0iZmluZGJ1Z3MueHNsIgogICAgICAgICAgICAgdmFsdWU9ImZhbmN5LnhzbCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGljaCBYU0wgdG8gdXNlIGZvciBnZW5lcmF0aW5nIE91dHB1dDogZGVmYXVsdCwgZmFuY3ksIHBsYWluLCBzdW1tYXJ5Ii8+CisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hpY2ggWFNMIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyBvdXRwdXQ6IGRlZmF1bHQsIGZhbmN5LCBwbGFpbiwgc3VtbWFyeSIvPgogICA8cHJvcGVydHkgbmFtZT0iZmluZGJ1Z3MuanZtYXJncyIKICAgICAgICAgICAgIHZhbHVlPSItWG1zMTI4bSAtWG14NTEybSIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJKVk1BcmdzIGZvciBpbnZva2luZyBGaW5kYnVncyIvPgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkpWTSBhcmd1bWVudHMgd2hlbiBpbnZva2luZyBTcG90QnVncyIvPgogCi0gIDwhLS0gUkFUIFJlbGVhc2UgQXVkaXRpbmcgVG9vbCAtLT4KKyAgPCEtLSBBcGFjaGUgUmF0OiBSZWxlYXNlIEF1ZGl0aW5nIFRvb2wgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJyYXQudmVyc2lvbiIKKyAgICAgICAgICAgIHZhbHVlPSIwLjEzIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IldoaWNoIHZlcnNpb24gb2YgQXBhY2hlIFJhdCB0byB1c2UiLz4KICAgPHByb3BlcnR5IG5hbWU9InJhdC5yZXBvcnQuZGlyIgotICAgICAgICAgICAgdmFsdWU9IiR7YnVpbGQuZGlyfS9yZXBvcnRzL3JhdCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGVyZSB0byBzdG9yZSB0aGUgUkFUIHJlcG9ydHMiLz4KKyAgICAgICAgICAgIHZhbHVlPSIke3JlcG9ydHMuZGlyfS9yYXQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgQXBhY2hlIFJhdCByZXBvcnRzIi8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJyYXQucmVwb3J0LmZpbGUiCiAgICAgICAgICAgICB2YWx1ZT0iJHtyYXQucmVwb3J0LmRpcn0vcmVwb3J0Lmh0bWwiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iUkFULVJlcG9ydCBmaWxlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJyYXQudmVyc2lvbiIKLSAgICAgICAgICAgIHZhbHVlPSIwLjExIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IldoaWNoIFZlcnNpb24gb2YgUkFUIHRvIHVzZSIvPgorICAgICAgICAgICAgZGVzY3JpcHRpb249Ik5hbWUgb2YgQXBhY2hlIFJhdCByZXBvcnQiLz4KIAogICA8IS0tIFNpbWlhbiAtLT4KICAgPHByb3BlcnR5IG5hbWU9InNpbWlhbi52ZXJzaW9uIgotICAgICAgICAgICAgdmFsdWU9IjIuNS45IgotICAgICAgICAgICAgZGVzY3JpcHRpb249IldoaWNoIFZlcnNpb24gb2YgU2ltaWFuIHRvIHVzZSIvPgorICAgICAgICAgICAgdmFsdWU9IjIuNS4xMCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGljaCB2ZXJzaW9uIG9mIFNpbWlhbiB0byB1c2UiLz4KICAgPHByb3BlcnR5IG5hbWU9InNpbWlhbi51cmkiCiAgICAgICAgICAgICB2YWx1ZT0iaHR0cDovL3d3dy5oYXJ1a2l6YWVtb24uY29tL3NpbWlhbi9zaW1pYW4tJHtzaW1pYW4udmVyc2lvbn0udGFyLmd6IgogICAgICAgICAgICAgZGVzY3JpcHRpb249IldoZXJlIHRvIGdldCBTaW1pYW4iLz4KQEAgLTEwMCwxMyArMTI1LDMyIEBACiAgICAgICAgICAgICB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NpbWlhbi1saWIiCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgU2ltaWFuIHJlc291cmNlcyIvPgogICA8cHJvcGVydHkgbmFtZT0ic2ltaWFuLnJlcG9ydC5kaXIiCi0gICAgICAgICAgICB2YWx1ZT0iJHtidWlsZC5kaXJ9L3NpbWlhbiIKKyAgICAgICAgICAgIHZhbHVlPSIke3JlcG9ydHMuZGlyfS9zaW1pYW4iCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgU2ltaWFuIHJlcG9ydHMiLz4KIAorICA8IS0tIE9XQVNQIERlcGVuZGVuY3kgQ2hlY2sgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJvd2FzcC5kYy52ZXJzaW9uIgorICAgICAgICAgICAgdmFsdWU9IjMuMi4xIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IldoaWNoIHZlcnNpb24gb2YgT1dBU1AgRGVwZW5kZW5jeSBDaGVjayB0byB1c2UiLz4KKyAgPHByb3BlcnR5IG5hbWU9Im93YXNwLmRjLnJlcG9ydC5kaXIiCisgICAgICAgICAgICB2YWx1ZT0iJHtyZXBvcnRzLmRpcn0vb3dhc3AtZGMiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iV2hlcmUgdG8gc3RvcmUgdGhlIE9XQVNQIERlcGVuZGVuY3kgQ2hlY2sgcmVwb3J0cyIvPgorCisgIDwhLS0gTnUgSHRtbCBDaGVja2VyIC0tPgorICA8cHJvcGVydHkgbmFtZT0iaHRtbGNoZWNrLm51LnZlcnNpb24iCisgICAgICAgICAgICB2YWx1ZT0iMTguMTEuNSIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJXaGljaCB2ZXJzaW9uIG9mIE51IEh0bWwgQ2hlY2tlciB0byB1c2UiLz4KKyAgPHByb3BlcnR5IG5hbWU9Imh0bWxjaGVjay5yZXBvcnQuZGlyIgorICAgICAgICAgICAgdmFsdWU9IiR7cmVwb3J0cy5kaXJ9L2h0bWwtY2hlY2siCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iRGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIHRoZSBIVE1MLUNoZWNrIHJlcG9ydCIvPgorICA8cHJvcGVydHkgbmFtZT0iaHRtbGNoZWNrLnJlcG9ydC5maWxlIgorICAgICAgICAgICAgdmFsdWU9IiR7aHRtbGNoZWNrLnJlcG9ydC5kaXJ9L3JlcG9ydC50eHQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUmVwb3J0IGZpbGUgb2YgdGhlIEhUTUwtQ2hlY2siLz4KKwogCiAgIDx0YXJnZXQgbmFtZT0iaW5pdC1pdnkiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkudmVyc2lvbiIgIHZhbHVlPSIyLjQuMCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuamFyLnVybCIgIHZhbHVlPSJodHRwOi8vcmVwbzEubWF2ZW4ub3JnL21hdmVuMi9vcmcvYXBhY2hlL2l2eS9pdnkvJHtpdnkudmVyc2lvbn0vaXZ5LSR7aXZ5LnZlcnNpb259LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkudmVyc2lvbiIgIHZhbHVlPSIyLjUuMCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuamFyLnVybCIgIHZhbHVlPSJodHRwczovL3JlcG8xLm1hdmVuLm9yZy9tYXZlbjIvb3JnL2FwYWNoZS9pdnkvaXZ5LyR7aXZ5LnZlcnNpb259L2l2eS0ke2l2eS52ZXJzaW9ufS5qYXIiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iaXZ5Lmphci5kaXIiICB2YWx1ZT0iJHtidWlsZC5kaXJ9L2l2eSIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJpdnkuamFyLmZpbGUiIHZhbHVlPSIke2l2eS5qYXIuZGlyfS9pdnkuamFyIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtpdnkuamFyLmRpcn0iLz4KQEAgLTExNyw3ICsxNjEsNyBAQAogICAgIDx0YXNrZGVmIHJlc291cmNlPSJvcmcvYXBhY2hlL2l2eS9hbnQvYW50bGliLnhtbCIgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5pdnkuYW50IiBjbGFzc3BhdGhyZWY9Iml2eS5saWIucGF0aCIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUiIGRlc2NyaXB0aW9uPSItLT4gY2hlY2tzIEFudCBjb2RlYmFzZSBhY2NvcmRpbmcgdG8gJHtjb25maWcuZGlyfS9jaGVja3N0eWxlLWNvbmZpZyIgZGVwZW5kcz0iaW5pdC1pdnkiPgorICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUiIGRlc2NyaXB0aW9uPSItLT4gY2hlY2tzIEFudCBjb2RlYmFzZSBhY2NvcmRpbmcgdG8gJHtjaGVja3N0eWxlLnNyYy5kaXJ9L2NoZWNrc3R5bGUtY29uZmlnIiBkZXBlbmRzPSJpbml0LWl2eSI+CiAgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iYW50bHIucHJlc2VudCIgY2xhc3NuYW1lPSJhbnRsci5Db21tb25BU1QiLz4KICAgICA8ZWNobyBpZjpzZXQ9ImFudGxyLnByZXNlbnQiPgogICAgICAgICBGb3VuZCBhbnRsciBvbiB0aGUgY2xhc3NwYXRoLgpAQCAtMTI2LDExICsxNzAsMTEgQEAKICAgICAgICAgU2tpcCBydW5uaW5nIENoZWNrc3R5bGUuCiAgICAgPC9lY2hvPgogICAgIDxzZXF1ZW50aWFsIHVubGVzczpzZXQ9ImFudGxyLnByZXNlbnQiPgotICAgICAgPGl2eTpjYWNoZXBhdGggb3JnYW5pc2F0aW9uPSJjb20ucHVwcHljcmF3bC50b29scyIgbW9kdWxlPSJjaGVja3N0eWxlIiByZXZpc2lvbj0iNi4xOCIKLSAgICAgICAgICAgICAgICAgICAgIGlubGluZT0idHJ1ZSIgY29uZj0iZGVmYXVsdCIgcGF0aGlkPSJjaGVja3N0eWxlLmNsYXNzcGF0aCIgdHJhbnNpdGl2ZT0idHJ1ZSIvPgotICAgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImNvbS9wdXBweWNyYXdsL3Rvb2xzL2NoZWNrc3R5bGUvYW50L2NoZWNrc3R5bGUtYW50LXRhc2sucHJvcGVydGllcyIgY2xhc3NwYXRocmVmPSJjaGVja3N0eWxlLmNsYXNzcGF0aCIgLz4KKyAgICAgIDxpdnk6Y2FjaGVwYXRoIG9yZ2FuaXNhdGlvbj0iY29tLnB1cHB5Y3Jhd2wudG9vbHMiIG1vZHVsZT0iY2hlY2tzdHlsZSIgcmV2aXNpb249IiR7Y2hlY2tzdHlsZS52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgICAgICAgIGlubGluZT0idHJ1ZSIgY29uZj0iZGVmYXVsdCIgcGF0aGlkPSJjaGVja3N0eWxlLmNsYXNzcGF0aCIvPgorICAgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImNvbS9wdXBweWNyYXdsL3Rvb2xzL2NoZWNrc3R5bGUvYW50L2NoZWNrc3R5bGUtYW50LXRhc2sucHJvcGVydGllcyIgY2xhc3NwYXRocmVmPSJjaGVja3N0eWxlLmNsYXNzcGF0aCIvPgogICAgICAgPG1rZGlyIGRpcj0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0iLz4KLSAgICAgIDxjaGVja3N0eWxlIGNvbmZpZz0iJHtjb25maWcuZGlyfS9jaGVja3N0eWxlLWNvbmZpZyIgZmFpbE9uVmlvbGF0aW9uPSJmYWxzZSI+CisgICAgICA8Y2hlY2tzdHlsZSBjb25maWc9IiR7Y2hlY2tzdHlsZS5zcmMuZGlyfS9jaGVja3N0eWxlLWNvbmZpZyIgZmFpbE9uVmlvbGF0aW9uPSJmYWxzZSI+CiAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB0b0ZpbGU9IiR7Y2hlY2tzdHlsZS5yYXd9Ii8+CiAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqYXZhLmRpcn0iPgogICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IiR7dG9jaGVja30iLz4KQEAgLTE2Nyw3ICsyMTEsNyBAQAogCiAgIDx0YXJnZXQgbmFtZT0ieGRvY3JlcG9ydCIgZGVzY3JpcHRpb249Ii0tPiBnZW5lcmF0ZXMgYSB4ZG9jIGNoZWNrc3R5bGUgcmVwb3J0IiB1bmxlc3M9ImFudGxyLnByZXNlbnQiPgogICAgIDx4c2x0IGluPSIke2NoZWNrc3R5bGUucmF3fSIgc3R5bGU9IiR7c3R5bGVzaGVldC54ZG9jfSIKLSAgICAgICAgICAgb3V0PSIke2NoZWNrc3R5bGUucmVwb3J0ZGlyfS94ZG9jcy9pbmRleC54bWwiPgorICAgICAgICAgIG91dD0iJHtjaGVja3N0eWxlLnJlcG9ydGRpcn0veGRvY3MvaW5kZXgueG1sIj4KICAgICAgIDxwYXJhbSBuYW1lPSJiYXNlZGlyIiBleHByZXNzaW9uPSIke2NoZWNrc3R5bGUuYmFzZWRpcn0iLz4KICAgICA8L3hzbHQ+CiAgIDwvdGFyZ2V0PgpAQCAtMjAzLDcgKzI0Nyw3IEBACiAgICAgPC90YXNrZGVmPgogICAgIDxta2RpciBkaXI9IiR7c2ltaWFuLnJlcG9ydC5kaXJ9Ii8+CiAgICAgPHNpbWlhbiBmYWlsdXJlUHJvcGVydHk9InNpbWlhbi5kdXBsaWNhdGVzLmZvdW5kIj4KLSAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuZGlyfSIgLz4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2phdmEuZGlyfSIvPgogICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InBsYWluIiB0b0ZpbGU9IiR7c2ltaWFuLnJlcG9ydC5kaXJ9L3NpbWlhbi1sb2cudHh0Ii8+CiAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIiB0b0ZpbGU9IiR7c2ltaWFuLnJlcG9ydC5kaXJ9L3NpbWlhbi1sb2cueG1sIi8+CiAgICAgPC9zaW1pYW4+CkBAIC0yMjYsNDAgKzI3MCw2NiBAQAogICAgIDxmaXhjcmxmIHNyY2Rpcj0ic3JjL21haW4iIGluY2x1ZGVzPSIke3BhdGh9IiBqYXZhZmlsZXM9InllcyIgdGFiPSJyZW1vdmUiIHRhYmxlbmd0aD0iNCIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImZpbmRidWdzIiBkZXNjcmlwdGlvbj0iLS0+IGNoZWNrcyBBbnQgY29kZWJhc2Ugd2l0aCBGaW5kYnVncyIgZGVwZW5kcz0iaW5pdC1pdnksYnVpbGQiIHhtbG5zOmZiPSJodHRwOi8vZmluZGJ1Z3Muc291cmNlZm9yZ2UubmV0LyI+Ci0gICAgPGl2eTpjYWNoZXBhdGggb3JnYW5pc2F0aW9uPSJjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3MiIG1vZHVsZT0iZmluZGJ1Z3MtYW50IiByZXZpc2lvbj0iMy4wLjAiCi0gICAgICAgICAgICAgICAgICAgaW5saW5lPSJ0cnVlIiBjb25mPSJkZWZhdWx0IiBwYXRoaWQ9ImZpbmRidWdzLnJlYWwuY2xhc3NwYXRoIiB0cmFuc2l0aXZlPSJ0cnVlIi8+Ci0gICAgPCEtLSBMb2FkIHRoZSBGaW5kYnVncyBBbnRUYXNrcyAtLT4gICAgICAgICAgICAgICAKLSAgICA8dGFza2RlZiB1cmk9Imh0dHA6Ly9maW5kYnVncy5zb3VyY2Vmb3JnZS5uZXQvIiByZXNvdXJjZT0iZWR1L3VtZC9jcy9maW5kYnVncy9hbnR0YXNrL3Rhc2tzLnByb3BlcnRpZXMiIGNsYXNzcGF0aHJlZj0iZmluZGJ1Z3MucmVhbC5jbGFzc3BhdGgiIC8+CisgIDx0YXJnZXQgbmFtZT0iZmluZGJ1Z3MiIGRlc2NyaXB0aW9uPSItLT4gY2hlY2tzIEFudCBjb2RlYmFzZSB3aXRoIFNwb3RCdWdzIiBkZXBlbmRzPSJpbml0LWl2eSxidWlsZCIKKyAgICAgICAgICB4bWxuczpmYj0iaHR0cDovL2ZpbmRidWdzLnNvdXJjZWZvcmdlLm5ldC8iPgorICAgIDwhLS0gUGF0aCBvZiBvcHRpb25hbCBsaWJzIGlzIHByb3ZpZGVkIHRocm91Z2ggQ0xJIHRvIGZvcmtlZCBKVk0gLS0+CisgICAgPHBhdGggaWQ9Im9wdGlvbmFsLmxpYnMiPgorICAgICAgPGZpbGVzZXQgZGlyPSJsaWIvb3B0aW9uYWwiIGluY2x1ZGVzPSIqLmphciIvPgorICAgIDwvcGF0aD4KIAotICAgIDwhLS0gU3RhcnQgRmluZGJ1Z3MgLS0+CisgICAgPGl2eTpjYWNoZXBhdGggb3JnYW5pc2F0aW9uPSJjb20uZ2l0aHViLnNwb3RidWdzIiBtb2R1bGU9InNwb3RidWdzLWFudCIgcmV2aXNpb249IiR7c3BvdGJ1Z3MudmVyc2lvbn0iCisgICAgICAgICAgICAgICAgICAgaW5saW5lPSJ0cnVlIiBjb25mPSJkZWZhdWx0IiBwYXRoaWQ9InNwb3RidWdzLmNsYXNzcGF0aCIvPgorICAgIDwhLS0gTG9hZCB0aGUgU3BvdEJ1Z3MgQW50VGFza3MgLS0+CisgICAgPHRhc2tkZWYgdXJpPSJodHRwOi8vZmluZGJ1Z3Muc291cmNlZm9yZ2UubmV0LyIgcmVzb3VyY2U9ImVkdS91bWQvY3MvZmluZGJ1Z3MvYW50dGFzay90YXNrcy5wcm9wZXJ0aWVzIgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0ic3BvdGJ1Z3MuY2xhc3NwYXRoIi8+CisKKyAgICA8IS0tIFN0YXJ0IFNwb3RCdWdzIC0tPgogICAgIDxta2RpciBkaXI9IiR7ZmluZGJ1Z3MucmVwb3J0ZGlyfSIvPgotICAgIDxmYjpmaW5kYnVncyBwbHVnaW5saXN0cmVmPSJmaW5kYnVncy5yZWFsLmNsYXNzcGF0aCIKLSAgICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJmaW5kYnVncy5yZWFsLmNsYXNzcGF0aCIKKyAgICA8ZmI6c3BvdGJ1Z3MgY2xhc3NwYXRocmVmPSJzcG90YnVncy5jbGFzc3BhdGgiCiAgICAgICAgICAgICAgICAgIG91dHB1dD0ieG1sOndpdGhNZXNzYWdlcyIKICAgICAgICAgICAgICAgICAgb3V0cHV0RmlsZT0iJHtmaW5kYnVncy5yZXBvcnRkaXJ9LyR7ZmluZGJ1Z3MucmF3fSIKICAgICAgICAgICAgICAgICAganZtYXJncz0iJHtmaW5kYnVncy5qdm1hcmdzfSIKICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWU9IiR7TmFtZX0gJHtwcm9qZWN0LnZlcnNpb259Ij4KLSAgICAgIDxjbGFzcyBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIgLz4KLSAgICAgIDxzb3VyY2VQYXRoIHBhdGg9IiR7amF2YS5kaXJ9IiAvPgotICAgIDwvZmI6ZmluZGJ1Z3M+CisgICAgICA8Y2xhc3MgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iLz4KKyAgICAgIDxzb3VyY2VQYXRoIHBhdGg9IiR7amF2YS5kaXJ9Ii8+CisgICAgICA8YXV4Q2xhc3NwYXRoIHJlZmlkPSJvcHRpb25hbC5saWJzIi8+CisgICAgPC9mYjpzcG90YnVncz4KIAogICAgIDwhLS0gR2VuZXJhdGUgKGh1bWFuKSByZWFkYWJsZSBvdXRwdXQgLS0+CiAgICAgPHhzbHQgYmFzZWRpcj0iJHtmaW5kYnVncy5yZXBvcnRkaXJ9IiBpbmNsdWRlcz0iJHtmaW5kYnVncy5yYXd9IiBkZXN0ZGlyPSIke2ZpbmRidWdzLnJlcG9ydGRpcn0iPgogICAgICAgPHN0eWxlPgotICAgICAgICA8amF2YXJlc291cmNlIG5hbWU9IiR7ZmluZGJ1Z3MueHNsfSIgY2xhc3NwYXRocmVmPSJmaW5kYnVncy5yZWFsLmNsYXNzcGF0aCIvPgorICAgICAgICA8amF2YXJlc291cmNlIG5hbWU9IiR7ZmluZGJ1Z3MueHNsfSIgY2xhc3NwYXRocmVmPSJzcG90YnVncy5jbGFzc3BhdGgiLz4KICAgICAgIDwvc3R5bGU+ICAKICAgICA8L3hzbHQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0icmF0IiBkZXNjcmlwdGlvbj0iLS0+IFJ1bnMgdGhlIFJlbGVhc2VBdWRpdGluZ1Rvb2wiIGRlcGVuZHM9ImluaXQtaXZ5Ij4KICAgICA8aXZ5OmNhY2hlcGF0aCBvcmdhbmlzYXRpb249Im9yZy5hcGFjaGUucmF0IiBtb2R1bGU9ImFwYWNoZS1yYXQtdGFza3MiIHJldmlzaW9uPSIke3JhdC52ZXJzaW9ufSIKLSAgICAgICAgICAgICAgICAgICBpbmxpbmU9InRydWUiIGNvbmY9ImRlZmF1bHQiIHBhdGhpZD0icmF0LmNsYXNzcGF0aCIgdHJhbnNpdGl2ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgICAgIGlubGluZT0idHJ1ZSIgY29uZj0iZGVmYXVsdCIgcGF0aGlkPSJyYXQuY2xhc3NwYXRoIi8+CiAgICAgPHR5cGVkZWYgcmVzb3VyY2U9Im9yZy9hcGFjaGUvcmF0L2FudHRhc2tzL2FudGxpYi54bWwiCiAgICAgICAgICAgICAgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5yYXQuYW50dGFza3MiCiAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJyYXQuY2xhc3NwYXRoIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtyYXQucmVwb3J0LmRpcn0iLz4KLSAgICA8cmF0OnJlcG9ydCB4bWxuczpyYXQ9ImFudGxpYjpvcmcuYXBhY2hlLnJhdC5hbnR0YXNrcyIgcmVwb3J0ZmlsZT0iJHtidWlsZC5kaXJ9L3JlcG9ydHMvcmF0L3JlcG9ydC50eHQiPgorICAgIDxyYXQ6cmVwb3J0IHhtbG5zOnJhdD0iYW50bGliOm9yZy5hcGFjaGUucmF0LmFudHRhc2tzIiByZXBvcnRmaWxlPSIke3JhdC5yZXBvcnQuZGlyfS9yZXBvcnQudHh0Ij4KKyAgICAgIDxyYXQ6ZnVsbFRleHRNYXRjaGVyIGxpY2Vuc2VGYW1pbHlDYXRlZ29yeT0iQUwgICAiCisgICAgICAgICAgICAgbGljZW5zZUZhbWlseU5hbWU9IkFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHdpdGggSFRUUFMgcmVmZXJlbmNlIj4KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgICA8L3JhdDpmdWxsVGV4dE1hdGNoZXI+CisgICAgICA8cmF0OmFwcHJvdmVkTGljZW5zZQorICAgICAgICAgICAgIGZhbWlseU5hbWU9IkFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHdpdGggSFRUUFMgcmVmZXJlbmNlIi8+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YS5kaXJ9Ij4KICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mIi8+CiAgICAgICAgIDxleGNsdWRlIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3ZlcnNpb24udHh0Ii8+CkBAIC0yNjcsNDIgKzMzNywzNSBAQAogICAgIDwvcmF0OnJlcG9ydD4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJkZXBlbmRlbmN5LWNoZWNrIiBkZXNjcmlwdGlvbj0iLS0+IFJ1bnMgdGhlIE9XQVNQIGRlcGVuZGVuY3kgY2hlY2siPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXBlbmRlbmN5LWNoZWNrLnVybCIgdmFsdWU9Imh0dHA6Ly9kbC5iaW50cmF5LmNvbS9qZXJlbXktbG9uZy9vd2FzcC9kZXBlbmRlbmN5LWNoZWNrLWFudC0zLjEuMC1yZWxlYXNlLnppcCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29scy5kaXIiIHZhbHVlPSJ0b29scyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJkZXBlbmRlbmN5LWNoZWNrLmRpciIgdmFsdWU9IiR7dG9vbHMuZGlyfS9kZXBlbmRlbmN5LWNoZWNrIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImRlcGVuZGVuY3ktY2hlY2suaG9tZSIgdmFsdWU9IiR7ZGVwZW5kZW5jeS1jaGVjay5kaXJ9L2RlcGVuZGVuY3ktY2hlY2stYW50Ii8+Ci0KLSAgICA8IS0tYXZhaWxhYmxlIHByb3BlcnR5PSJkZXBlbmRlbmN5LWNoZWNrLnByZXNlbnQiIGZpbGU9IiR7ZGVwZW5kZW5jeS1jaGVjay5ob21lfS9kZXBlbmRlbmN5LWNoZWNrLWFudC9kZXBlbmRlbmN5LWNoZWNrLWFudC5qYXIiLy0tPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImRlcGVuZGVuY3ktY2hlY2sucHJlc2VudCI+Ci0gICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJncmVhdGVyIiBjb3VudD0iMCI+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iJHtkZXBlbmRlbmN5LWNoZWNrLmhvbWV9IiBpbmNsdWRlcz0iKiovZGVwZW5kZW5jeS1jaGVjay1hbnQuamFyIi8+Ci0gICAgICA8L3Jlc291cmNlY291bnQ+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgCi0gICAgPHNlcXVlbnRpYWwgdW5sZXNzOnNldD0iZGVwZW5kZW5jeS1jaGVjay5wcmVzZW50Ij4KLSAgICAgIDxta2RpciBkaXI9IiR7ZGVwZW5kZW5jeS1jaGVjay5ob21lfSIvPgotICAgICAgPGdldCBzcmM9IiR7ZGVwZW5kZW5jeS1jaGVjay51cmx9IiBkZXN0PSIke2RlcGVuZGVuY3ktY2hlY2suZGlyfS9kZXBlbmRlbmN5LWNoZWNrLWFudC56aXAiLz4KLSAgICAgIDx1bnppcCBzcmM9IiR7ZGVwZW5kZW5jeS1jaGVjay5kaXJ9L2RlcGVuZGVuY3ktY2hlY2stYW50LnppcCIgZGVzdD0iJHtkZXBlbmRlbmN5LWNoZWNrLmRpcn0vZGVwZW5kZW5jeS1jaGVjay1hbnQiLz4KLSAgICA8L3NlcXVlbnRpYWw+Ci0KLSAgICA8cGF0aCBpZD0iZGVwZW5kZW5jeS1jaGVjay5wYXRoIj4KLSAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtkZXBlbmRlbmN5LWNoZWNrLmhvbWV9L2RlcGVuZGVuY3ktY2hlY2stYW50LmphciIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2RlcGVuZGVuY3ktY2hlY2suaG9tZX0iPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvcGF0aD4KLSAgICA8dGFza2RlZiByZXNvdXJjZT0iZGVwZW5kZW5jeS1jaGVjay10YXNrZGVmcy5wcm9wZXJ0aWVzIiB1cmk9Imh0dHBzOi8vamVyZW15bG9uZy5naXRodWIuaW8vIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImRlcGVuZGVuY3ktY2hlY2sucGF0aCIvPgotICAgIDwvdGFza2RlZj4KLQotICAgIDxvd2FzcDpkZXBlbmRlbmN5LWNoZWNrCi0gICAgICAgIHhtbG5zOm93YXNwPSJodHRwczovL2plcmVteWxvbmcuZ2l0aHViLmlvLyIKLSAgICAgICAgcHJvamVjdE5hbWU9IiR7YW50LnByb2plY3QubmFtZX0iCi0gICAgPgorICA8dGFyZ2V0IG5hbWU9ImRlcGVuZGVuY3ktY2hlY2siIGRlc2NyaXB0aW9uPSItLT4gUnVucyB0aGUgT1dBU1AgRGVwZW5kZW5jeSBDaGVjayIgZGVwZW5kcz0iaW5pdC1pdnkiPgorICAgIDxpdnk6Y2FjaGVwYXRoIG9yZ2FuaXNhdGlvbj0ib3JnLm93YXNwIiBtb2R1bGU9ImRlcGVuZGVuY3ktY2hlY2stYW50IiByZXZpc2lvbj0iJHtvd2FzcC5kYy52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgICAgICBpbmxpbmU9InRydWUiIGNvbmY9ImRlZmF1bHQiIHBhdGhpZD0ib3dhc3AuZGMuY2xhc3NwYXRoIi8+CisgICAgPHRhc2tkZWYgcmVzb3VyY2U9ImRlcGVuZGVuY3ktY2hlY2stdGFza2RlZnMucHJvcGVydGllcyIgdXJpPSJodHRwczovL2plcmVteWxvbmcuZ2l0aHViLmlvLyIKKyAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9Im93YXNwLmRjLmNsYXNzcGF0aCIvPgorICAgIDxta2RpciBkaXI9IiR7b3dhc3AuZGMucmVwb3J0LmRpcn0iLz4KKyAgICA8b3dhc3A6ZGVwZW5kZW5jeS1jaGVjayB4bWxuczpvd2FzcD0iaHR0cHM6Ly9qZXJlbXlsb25nLmdpdGh1Yi5pby8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdE5hbWU9IiR7YW50LnByb2plY3QubmFtZX0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0T3V0cHV0RGlyZWN0b3J5PSIke293YXNwLmRjLnJlcG9ydC5kaXJ9Ij4KICAgICAgIDxmaWxlc2V0IGRpcj0ibGliIiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9ImRpc3QvKiovKi5qYXIiLz4KICAgICA8L293YXNwOmRlcGVuZGVuY3ktY2hlY2s+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0iaHRtbC1jaGVjayIgZGVzY3JpcHRpb249Ii0tPiBSdW5zIHRoZSBOdSBIdG1sIENoZWNrZXIiIGRlcGVuZHM9ImluaXQtaXZ5Ij4KKyAgICA8aXZ5OmNhY2hlcGF0aCBvcmdhbmlzYXRpb249Im51LnZhbGlkYXRvciIgbW9kdWxlPSJ2YWxpZGF0b3IiIHJldmlzaW9uPSIke2h0bWxjaGVjay5udS52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgICAgICBpbmxpbmU9InRydWUiIGNvbmY9ImRlZmF1bHQiIHBhdGhpZD0ibnUuY2xhc3NwYXRoIi8+CisgICAgPGZpbGVzZXQgZGlyPSIuIiBpZD0iaHRtbC5maWxlcyI+CisgICAgICA8aW5jbHVkZSBuYW1lPSIke3NyYy5kaXJ9LyoqLyouaHRtbCIvPgorICAgICAgPGluY2x1ZGUgbmFtZT0iJHttYW51YWwuZGlyfS8qKi8qLmh0bWwiLz4KKyAgICAgIDxleGNsdWRlIG5hbWU9IiR7bWFudWFsLmRpcn0vaW5kZXguaHRtbCIvPgorICAgIDwvZmlsZXNldD4KKyAgICA8cGF0aGNvbnZlcnQgcGF0aHNlcD0iICIgcHJvcGVydHk9Imh0bWwubGlzdCIgcmVmaWQ9Imh0bWwuZmlsZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2h0bWxjaGVjay5yZXBvcnQuZGlyfSIvPgorICAgIDxqYXZhIGNsYXNzbmFtZT0ibnUudmFsaWRhdG9yLmNsaWVudC5TaW1wbGVDb21tYW5kTGluZVZhbGlkYXRvciIgY2xhc3NwYXRocmVmPSJudS5jbGFzc3BhdGgiCisgICAgICAgICAgdGFza25hbWU9Imh0bWwtY2hlY2siIG91dHB1dD0iJHtodG1sY2hlY2sucmVwb3J0LmZpbGV9Ij4KKyAgICAgIDxhcmcgbGluZT0iLS1odG1sIC0tZm9ybWF0IHRleHQiLz4KKyAgICAgIDxhcmcgbGluZT0iJHtodG1sLmxpc3R9Ii8+CisgICAgPC9qYXZhPgorICAgIDxjb25jYXQ+PGZpbGUgbmFtZT0iJHtodG1sY2hlY2sucmVwb3J0LmZpbGV9Ii8+PC9jb25jYXQ+CisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udHJpYnV0b3JzLnhtbCBiL2NvbnRyaWJ1dG9ycy54bWwKaW5kZXggYTYyYjFkNC4uOGRlMWI4NiAxMDA2NDQKLS0tIGEvY29udHJpYnV0b3JzLnhtbAorKysgYi9jb250cmlidXRvcnMueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MCw2ICs0MCwxNCBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5BZGFtPC9maXJzdD4KKyAgICA8bGFzdD5NdXJkb2NoPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5BZGFtPC9maXJzdD4KKyAgICA8bGFzdD5SZXR0ZXI8L2xhc3Q+CisgIDwvbmFtZT4gCisgIDxuYW1lPgorICAgIDxmaXJzdD5BZGFtPC9maXJzdD4KICAgICA8bGFzdD5Tb3RvbmE8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CkBAIC00Nyw2ICs1NSwxMCBAQAogICAgIDxsYXN0Pk5pc3RvcjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+QWRyaWVuPC9maXJzdD4KKyAgICA8bGFzdD5HcmFuZDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+QWxla3NhbmRyPC9maXJzdD4KICAgICA8bGFzdD5Jc2h1dGluPC9sYXN0PgogICA8L25hbWU+CkBAIC01NSw2ICs2NywxMCBAQAogICAgIDxsYXN0PlJvc2VuPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5BbGV4YW5kZXI8L2ZpcnN0PgorICAgIDxsYXN0PkdydW5kPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5BbGV4ZWk8L2ZpcnN0PgogICAgIDxsYXN0Pll1ZGljaGV2PC9sYXN0PgogICA8L25hbWU+CkBAIC03OSw2ICs5NSwxMCBAQAogICAgIDxsYXN0PkFtZXM8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkFuZHJlYXM8L2ZpcnN0PgorICAgIDxsYXN0Pk1yb3NzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5BbmRyZXc8L2ZpcnN0PgogICAgIDxsYXN0PkVpc2VuYmVyZzwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMTMyLDYgKzE1MiwxMCBAQAogICAgIDxsYXN0Pk1hemtvdm9pPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5BcmNhZGl1czwvZmlyc3Q+CisgICAgPGxhc3Q+QWhvdWFuc291PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5BcmphbjwvZmlyc3Q+CiAgICAgPGxhc3Q+VmVlbnN0cmE8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTE0NSw4ICsxNjksMTIgQEAKICAgICA8bGFzdD5LdWlwZXI8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkFydW48L2ZpcnN0PgorICAgIDxsYXN0PkphbXdhbDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+QXNsYWs8L2ZpcnN0PgotICAgIDxsYXN0PkhlbGxlcyYjMjQ0O3k8L2xhc3Q+CisgICAgPGxhc3Q+SGVsbGVzw7R5PC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5BdHN1aGlrbzwvZmlyc3Q+CkBAIC0xNjEsNiArMTg5LDkgQEAKICAgICA8bGFzdD5GZWplcyAyPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxsYXN0PmJhcm5leTJrNzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+QmFydDwvZmlyc3Q+CiAgICAgPGxhc3Q+VmFuaGF1dGU8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTIxOCw2ICsyNDksMTQgQEAKICAgICA8bGFzdD5BdGhlcnRvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+Q2Vkb21pcjwvZmlyc3Q+CisgICAgPGxhc3Q+SWdhbHk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkNoYXJsZXM8L2ZpcnN0PgorICAgIDxsYXN0PkR1ZmZ5PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5DaGFybGVzPC9maXJzdD4KICAgICA8bGFzdD5IdWRhazwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMjgzLDYgKzMyMiwxMCBAQAogICAgIDxsYXN0Pk1hY05laWxsPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5Db3N0aW48L2ZpcnN0PgorICAgIDxsYXN0Pk1hbm9sYWNoZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+Q3JhZWc8L2ZpcnN0PgogICAgIDxsYXN0PlN0cm9uZzwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMjkyLDE2ICszMzUsMjAgQEAKICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgorICAgIDxsYXN0PlBlbGw8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PkNyYWlnPC9maXJzdD4KICAgICA8bWlkZGxlPlIuPC9taWRkbGU+CiAgICAgPGxhc3Q+TWNDbGFuYWhhbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgotICAgIDxsYXN0PlJ5YW48L2xhc3Q+CisgICAgPGxhc3Q+UmljaGFyZHNvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgotICAgIDxsYXN0PlJpY2hhcmRzb248L2xhc3Q+CisgICAgPGxhc3Q+UnlhbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+Q3JhaWc8L2ZpcnN0PgpAQCAtMzY4LDYgKzQxNSwxMCBAQAogICAgIDxsYXN0PkJyaW9uZXM8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkRhcnJlbGw8L2ZpcnN0PgorICAgIDxsYXN0PkRlQm9lcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+RGF2YW51bTwvZmlyc3Q+CiAgICAgPGxhc3Q+U3Jpbml2YXM8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTM4MSw3ICs0MzIsOCBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5EYXZpZDwvZmlyc3Q+Ci0gICAgPGxhc3Q+QS48L2xhc3Q+CisgICAgPG1pZGRsZT5BLjwvbWlkZGxlPgorICAgIDxsYXN0Pkhlcm1hbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+RGF2aWQ8L2ZpcnN0PgpAQCAtMzg5LDcgKzQ0MSw3IEBACiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KLSAgICA8bGFzdD5HJiMyMjg7cnRuZXI8L2xhc3Q+CisgICAgPGxhc3Q+R8OkcnRuZXI8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PkRhdmlkPC9maXJzdD4KQEAgLTQ1MiwxMiArNTA0LDggQEAKICAgICA8bGFzdD5EZXZpZW5uZTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8Zmlyc3Q+RG9uYWw8L2ZpcnN0PgotICAgIDxsYXN0PlF1aW5sYW48L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+CiAgICAgPGZpcnN0PkRvbjwvZmlyc3Q+Ci0gICAgPGxhc3Q+Qm5hbWVuPC9sYXN0PgorICAgIDxsYXN0PkJyb3duPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5Eb248L2ZpcnN0PgpAQCAtNDY4LDYgKzUxNiwxNCBAQAogICAgIDxsYXN0PkplZmZlcnk8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkRvbmFsPC9maXJzdD4KKyAgICA8bGFzdD5RdWlubGFuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5Eb25hbGQ8L2ZpcnN0PgorICAgIDxsYXN0Pkxlc2xpZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+RHJldzwvZmlyc3Q+CiAgICAgPGxhc3Q+U3VkZWxsPC9sYXN0PgogICA8L25hbWU+CkBAIC00OTYsNiArNTUyLDEwIEBACiAgICAgPGxhc3Q+Qm91cmc8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkV1Z8OobmU8L2ZpcnN0PgorICAgIDxsYXN0PkFkZWxsPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5FcmljPC9maXJzdD4KICAgICA8bGFzdD5PbHNlbjwvbGFzdD4KICAgPC9uYW1lPgpAQCAtNTUyLDYgKzYxMiwxMCBAQAogICAgIDxsYXN0PkxhdmlnbmU8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkdhbDwvZmlyc3Q+CisgICAgPGxhc3Q+U2hhY2hvcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+R2FyeTwvZmlyc3Q+CiAgICAgPG1pZGRsZT5TLjwvbWlkZGxlPgogICAgIDxsYXN0PldlYXZlcjwvbGFzdD4KQEAgLTY3MywxMSArNzM3LDIwIEBACiAgICAgPGxhc3Q+QmxlaWplbmJlcmdoPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5KQzwvZmlyc3Q+CisgICAgPGxhc3Q+TWFubjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+SmFjazwvZmlyc3Q+CiAgICAgPG1pZGRsZT5KLjwvbWlkZGxlPgogICAgIDxsYXN0PldvZWhyPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5KYWNvYnVzPC9maXJzdD4KKyAgICA8bWlkZGxlPk1hcnRpbnVzPC9taWRkbGU+CisgICAgPGxhc3Q+S3J1aXRob2Y8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PkphaWtpcmFuPC9maXJzdD4KICAgICA8bGFzdD5QYWk8L2xhc3Q+CiAgIDwvbmFtZT4gIApAQCAtNjg3LDEyICs3NjAsMTYgQEAKICAgICA8bGFzdD5EYXZpZHNvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+SmFtZXM8L2ZpcnN0PgorICAgIDxsYXN0PlRvZGQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PkphbjwvZmlyc3Q+CiAgICAgPGxhc3Q+Q3VtcHM8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PkphbjwvZmlyc3Q+Ci0gICAgPGxhc3Q+TWF0JiMyMzI7cm5lPC9sYXN0PgorICAgIDxsYXN0Pk1hdMOocm5lPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5KYW48L2ZpcnN0PgpAQCAtNzMyLDE4ICs4MDksMTQgQEAKICAgICA8bGFzdD52YW4gZGVyIE1lZXI8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0PkpDPC9maXJzdD4KLSAgICA8bGFzdD5NYW5uPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgotICAgIDxmaXJzdD5KPC9maXJzdD4KLSAgICA8bGFzdD5EPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgogICAgIDxmaXJzdD5KZWFuLUZyYW5jb2lzPC9maXJzdD4KICAgICA8bGFzdD5Ccm91c3NlYXU8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkplYW4tTG91aXM8L2ZpcnN0PgorICAgIDxsYXN0PkJvdWRhcnQ8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PkplZmY8L2ZpcnN0PgogICAgIDxsYXN0PkdldHRsZTwvbGFzdD4KICAgPC9uYW1lPgpAQCAtNzkyLDE0ICs4NjUsMTQgQEAKICAgICA8bGFzdD5DYXNleTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8Zmlyc3Q+Sm9lcmc8L2ZpcnN0PgotICAgIDxsYXN0Pldhc3NtZXI8L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+CiAgICAgPGZpcnN0PkpvZWw8L2ZpcnN0PgogICAgIDxsYXN0PlR1Y2NpPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5Kb2VyZzwvZmlyc3Q+CisgICAgPGxhc3Q+V2Fzc21lcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+Sm9leTwvZmlyc3Q+CiAgICAgPGxhc3Q+UmljaGV5PC9sYXN0PgogICA8L25hbWU+CkBAIC04MjksMTkgKzkwMiwyNCBAQAogICAgIDxsYXN0PlN0ZXZlbnM8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PkpvbmF0aGFuPC9maXJzdD4KKyAgICA8bWlkZGxlPksuPC9taWRkbGU+CisgICAgPGxhc3Q+U2NobmVpZGVyPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5Kb3NlPC9maXJzdD4KICAgICA8bWlkZGxlPkFsYmVydG88L21pZGRsZT4KICAgICA8bGFzdD5GZXJuYW5kZXo8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0Pkpvc2g8L2ZpcnN0PgotICAgIDxsYXN0Pkx1Y2FzPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgogICAgIDxmaXJzdD5Kb3NlcGg8L2ZpcnN0PgogICAgIDxsYXN0PldhbHRvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+Sm9zaDwvZmlyc3Q+CisgICAgPGxhc3Q+THVjYXM8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0Pkp1ZXJnPC9maXJzdD4KICAgICA8bGFzdD5XYW5uZXI8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTg1MCwxMCArOTI4LDIyIEBACiAgICAgPGxhc3Q+U2ltcHNvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+SnVsaWVuPC9maXJzdD4KKyAgICA8bGFzdD5MZXBpbGxlcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+SnVzdGluPC9maXJzdD4KICAgICA8bGFzdD5WYWxsb248L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0Pkp1c3R5bmE8L2ZpcnN0PgorICAgIDxsYXN0PkhvcndhdDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+S2FybDwvZmlyc3Q+CisgICAgPGxhc3Q+SmFuc2VuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5LZWlyb248L2ZpcnN0PgogICAgIDxsYXN0PkxpZGRsZTwvbGFzdD4KICAgPC9uYW1lPgpAQCAtODgwLDcgKzk3MCw3IEBACiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PktldmluPC9maXJzdD4KLSAgICA8bWlkZGxlPlo8L21pZGRsZT4KKyAgICA8bWlkZGxlPlouPC9taWRkbGU+CiAgICAgPGxhc3Q+R3JleTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KQEAgLTkzNSw2ICsxMDI1LDEwIEBACiAgICAgPGxhc3Q+Q2xhdWRlPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5NYWFydGVuPC9maXJzdD4KKyAgICA8bGFzdD5Db2VuZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+TWFnZXNoPC9maXJzdD4KICAgICA8bGFzdD5VbWFzYW5rYXI8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTk0Myw2ICsxMDM3LDEwIEBACiAgICAgPGxhc3Q+U2FodTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWFyYzwvZmlyc3Q+CisgICAgPGxhc3Q+R3VpbGxlbW90PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5NYXJjZWw8L2ZpcnN0PgogICAgIDxsYXN0PlNjaHV0dGU8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTk2MCwxNSArMTA1OCwyNCBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5NYXJrPC9maXJzdD4KKyAgICA8bWlkZGxlPkEuPC9taWRkbGU+CisgICAgPGxhc3Q+Wmllc2VtZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hcms8L2ZpcnN0PgogICAgIDxsYXN0PkRlTGFGcmFuaWVyPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5NYXJrPC9maXJzdD4KKyAgICA8bGFzdD5IYXJtZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0Pk1hcms8L2ZpcnN0PgogICAgIDxsYXN0PkhlY2tlcjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+TWFyazwvZmlyc3Q+Ci0gICAgPGxhc3Q+U2FsdGVyPC9sYXN0PgorICAgIDxsYXN0Pk5pZ2dlbWFubjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+TWFyazwvZmlyc3Q+CkBAIC05NzcsMTIgKzEwODQsNyBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5NYXJrPC9maXJzdD4KLSAgICA8bGFzdD5OaWdnZW1hbm48L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+Ci0gICAgPGZpcnN0Pk1hcms8L2ZpcnN0PgotICAgIDxtaWRkbGU+QS48L21pZGRsZT4KLSAgICA8bGFzdD5aaWVzZW1lcjwvbGFzdD4KKyAgICA8bGFzdD5TYWx0ZXI8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0Pk1hcmt1czwvZmlyc3Q+CkBAIC0xMDA5LDYgKzExMTEsMTQgQEAKICAgICA8bGFzdD52b24gR2FnZXJuPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5NYXRoaWV1PC9maXJzdD4KKyAgICA8bGFzdD5DaGFtcGxvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWF0aGlldTwvZmlyc3Q+CisgICAgPGxhc3Q+UGVsdGllcjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+TWF0dDwvZmlyc3Q+CiAgICAgPGxhc3Q+QWxicmVjaHQ8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTEwNDEsMTggKzExNTEsNiBAQAogICAgIDxsYXN0PldpbGRpZzwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8Zmlyc3Q+TWF0aGlldTwvZmlyc3Q+Ci0gICAgPGxhc3Q+Q2hhbXBsb248L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+Ci0gICAgPGZpcnN0Pk1hdGhpZXU8L2ZpcnN0PgotICAgIDxsYXN0PlBlbHRpZXI8L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+Ci0gICAgPGZpcnN0Pk1hdHRoaWFzPC9maXJzdD4KLSAgICA8bGFzdD5CaGVuZDwvbGFzdD4KLSAgPC9uYW1lPgotICA8bmFtZT4KICAgICA8Zmlyc3Q+TWF0dGhldzwvZmlyc3Q+CiAgICAgPGxhc3Q+SGF3dGhvcm5lPC9sYXN0PgogICA8L25hbWU+CkBAIC0xMDY3LDYgKzExNjUsMTAgQEAKICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+TWF0dGhldzwvZmlyc3Q+CisgICAgPGxhc3Q+V2FybWFuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0aGV3PC9maXJzdD4KICAgICA8bGFzdD5XYXRzb248L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CkBAIC0xMDc0LDYgKzExNzYsMTQgQEAKICAgICA8bGFzdD5ZYW5vczwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWF0dGhpYXM8L2ZpcnN0PgorICAgIDxsYXN0PkJoZW5kPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5NYXR0aGlhczwvZmlyc3Q+CisgICAgPGxhc3Q+R3V0aGVpbDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+TWljaGFlbDwvZmlyc3Q+CiAgICAgPGxhc3Q+QmF5bmU8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTEwOTYsNiArMTIwNiwxMCBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5NaWNoYWVsPC9maXJzdD4KKyAgICA8bGFzdD5Nb250dW9yaTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWljaGFlbDwvZmlyc3Q+CiAgICAgPGxhc3Q+TmV3Y29tYjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KQEAgLTExMDcsNiArMTIyMSwxNCBAQAogICAgIDxsYXN0PlNhdW5kZXJzPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5NaWNoYWVsPC9maXJzdD4KKyAgICA8bGFzdD5TZWVsZTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TWlja2HDq2w8L2ZpcnN0PgorICAgIDxsYXN0Pkd1ZXNzYW50PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxsYXN0Pk1paGE8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CkBAIC0xMTI2LDkgKzEyNDgsNiBAQAogICAgIDxsYXN0PlphxaVrbzwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8bGFzdD5tbm93b3N0YXdza2k8L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+CiAgICAgPGZpcnN0Pk1vdW5pcjwvZmlyc3Q+CiAgICAgPGxhc3Q+RWwgSGFqajwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMTE0NiwyMSArMTI2NSwzNCBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5OaWNrPC9maXJzdD4KKyAgICA8bGFzdD5EYXZpczwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+TmljazwvZmlyc3Q+CiAgICAgPGxhc3Q+Rm9ydGVzY3VlPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5OaWNrPC9maXJzdD4KKyAgICA8bGFzdD5LaW5nPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5OaWNrPC9maXJzdD4KICAgICA8bGFzdD5QZWxsb3c8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0Pk5pY29sYTwvZmlyc3Q+Ci0gICAgPGxhc3Q+S2VuPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgogICAgIDxmaXJzdD5OaWNvPC9maXJzdD4KICAgICA8bGFzdD5TZWVzc2xlPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5OaWNvbGE8L2ZpcnN0PgorICAgIDxtaWRkbGU+S2VuPC9taWRkbGU+CisgICAgPGxhc3Q+QmFyb3p6aTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+Tmljb2xhczwvZmlyc3Q+CisgICAgPGxhc3Q+TGFsZXZlzIFlPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5OaWdlbDwvZmlyc3Q+CiAgICAgPGxhc3Q+TWFnbmF5PC9sYXN0PgogICA8L25hbWU+CkBAIC0xMTczLDYgKzEzMDUsMTAgQEAKICAgICA8bGFzdD5Sb3NzbXVlbGxlcjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+T2xpdmllcjwvZmlyc3Q+CisgICAgPGxhc3Q+UGFyZW50PC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5PbWVyPC9maXJzdD4KICAgICA8bGFzdD5TaGFwaXJhPC9sYXN0PgogICA8L25hbWU+CkBAIC0xMTgxLDE2ICsxMzE3LDEzIEBACiAgICAgPGxhc3Q+TWVkZWs8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0PiYjMjE2O3lzdGVpbjwvZmlyc3Q+Ci0gICAgPGxhc3Q+R2lzbiYjMjI5O3M8L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+CiAgICAgPGZpcnN0PlBhdHJpY2s8L2ZpcnN0PgogICAgIDxsYXN0PkFsdGFpZTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+UGF0cmljazwvZmlyc3Q+Ci0gICAgPGxhc3Q+Qy48L2xhc3Q+CisgICAgPG1pZGRsZT5DLjwvbWlkZGxlPgorICAgIDxsYXN0PkJlYXJkPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5QYXRyaWNrPC9maXJzdD4KQEAgLTExOTgsNyArMTMzMSwxMiBAQAogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5QYXRyaWNrPC9maXJzdD4KLSAgICA8bGFzdD5HdXM8L2xhc3Q+CisgICAgPG1pZGRsZT5HdXM8L21pZGRsZT4KKyAgICA8bGFzdD5IZWNrPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5QYXRyaWNrPC9maXJzdD4KKyAgICA8bGFzdD5NYXJ0aW48L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PlBhdWw8L2ZpcnN0PgpAQCAtMTI4Miw4ICsxNDIwLDggQEAKICAgICA8bGFzdD5EaXR0Z2VuPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgotICAgIDxmaXJzdD5SPC9maXJzdD4KLSAgICA8bGFzdD5IYW5kZXJzb248L2xhc3Q+CisgICAgPGZpcnN0PlByZXN0b248L2ZpcnN0PgorICAgIDxsYXN0PkJhbm5pc3RlcjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+UmFsZjwvZmlyc3Q+CkBAIC0xMzA2LDYgKzE0NDQsMTAgQEAKICAgICA8bGFzdD5XYWxkaW48L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PlJhenppPC9maXJzdD4KKyAgICA8bGFzdD5BYnVpc3NhPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5SZWluaGFyZDwvZmlyc3Q+CiAgICAgPGxhc3Q+UG9pbnRuZXI8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTEzMzQsMTEgKzE0NzYsMjQgQEAKICAgICA8bGFzdD5CZXRvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+Um9iPC9maXJzdD4KKyAgICA8bGFzdD5SaWFzb2w8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYjwvZmlyc3Q+CisgICAgPGxhc3Q+T3hzcHJpbmc8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CisgICAgPGZpcnN0PlJvYjwvZmlyc3Q+CisgICAgPGxhc3Q+dmFuIE9vc3RydW08L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PlJvYmJpZTwvZmlyc3Q+CiAgICAgPGxhc3Q+R2lic29uPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5Sb2JlcnQ8L2ZpcnN0PgorICAgIDxtaWRkbGU+SC48L21pZGRsZT4KICAgICA8bGFzdD5BbmRlcnNvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KQEAgLTEzNzgsMTQgKzE1MzMsNiBAQAogICAgIDxsYXN0PlZlcmR1aWpuPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgotICAgIDxmaXJzdD5Sb2I8L2ZpcnN0PgotICAgIDxsYXN0Pk94c3ByaW5nPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgotICAgIDxmaXJzdD5Sb2I8L2ZpcnN0PgotICAgIDxsYXN0PnZhbiBPb3N0cnVtPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgogICAgIDxmaXJzdD5Sb2RyaWdvPC9maXJzdD4KICAgICA8bGFzdD5TY2htaWR0PC9sYXN0PgogICA8L25hbWU+CkBAIC0xNDQ4LDYgKzE1OTUsMTAgQEAKICAgICA8bGFzdD5LYW5lPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5TZWJhc3RpYW48L2ZpcnN0PgorICAgIDxsYXN0PkthbnRoYTwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+U2ViYXN0aWVuPC9maXJzdD4KICAgICA8bGFzdD5Bcm9kPC9sYXN0PgogICA8L25hbWU+CkBAIC0xNDU2LDEyICsxNjA3LDEyIEBACiAgICAgPGxhc3Q+S2FuZ2E8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0PlNlYmFzdGlhbjwvZmlyc3Q+Ci0gICAgPGxhc3Q+S2FudGhhPC9sYXN0PgorICAgIDxmaXJzdD5TaW1lb248L2ZpcnN0PgorICAgIDxsYXN0PkZpdGNoPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgotICAgICAgPGZpcnN0PlNpbW9uPC9maXJzdD4KLSAgICAgIDxsYXN0PkxhdzwvbGFzdD4KKyAgICA8Zmlyc3Q+U2ltb248L2ZpcnN0PgorICAgIDxsYXN0PkxhdzwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+U2ltb25lPC9maXJzdD4KQEAgLTE0ODAsNiArMTYzMSwxMyBAQAogICAgIDxsYXN0Pk1henpvY2NoaTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8bGFzdD5zdGVwaGFuPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgorICAgIDxmaXJzdD5TdGVwaGFuPC9maXJzdD4KKyAgICA8bGFzdD5NaWNoZWxzPC9sYXN0PgorICA8L25hbWU+CisgIDxuYW1lPgogICAgIDxmaXJzdD5TdGVwaGFuPC9maXJzdD4KICAgICA8bGFzdD5TdHJpdHRtYXR0ZXI8L2xhc3Q+CiAgIDwvbmFtZT4KQEAgLTE0ODgsMTUgKzE2NDYsMTIgQEAKICAgICA8bGFzdD5CYWlsbGllejwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8bGFzdD5zdGVwaGFuPC9sYXN0PgotICA8L25hbWU+Ci0gIDxuYW1lPgotICAgIDxmaXJzdD5TdGVwaGFuPC9maXJzdD4KLSAgICA8bGFzdD5NaWNoZWxzPC9sYXN0PgorICAgIDxmaXJzdD5TdGVwaGVuPC9maXJzdD4KKyAgICA8bGFzdD5DaGluPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5TdGVwaGVuPC9maXJzdD4KLSAgICA8bGFzdD5DaGluPC9sYXN0PgorICAgIDxsYXN0PkdvZXR6ZTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+U3RldmU8L2ZpcnN0PgpAQCAtMTU4MSw2ICsxNzM2LDEwIEBACiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PlRpbTwvZmlyc3Q+CisgICAgPGxhc3Q+U3RlcGhlbnNvbjwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VGltPC9maXJzdD4KICAgICA8bGFzdD5XaGl0dGluZ3RvbjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KQEAgLTE1OTMsMTIgKzE3NTIsMTIgQEAKICAgICA8bGFzdD5FbmRyZXM8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0PlRpbTwvZmlyc3Q+Ci0gICAgPGxhc3Q+U3RlcGhlbnNvbjwvbGFzdD4KKyAgICA8Zmlyc3Q+VG9tPC9maXJzdD4KKyAgICA8bGFzdD5CYWxsPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgogICAgIDxmaXJzdD5Ub208L2ZpcnN0PgotICAgIDxsYXN0PkJhbGw8L2xhc3Q+CisgICAgPGxhc3Q+QnJ1czwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KICAgICA8Zmlyc3Q+VG9tPC9maXJzdD4KQEAgLTE2MjUsOCArMTc4NCwxMiBAQAogICAgIDxsYXN0PlplenVsYTwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+VG9ueTwvZmlyc3Q+CisgICAgPGxhc3Q+R3JhdmFnbm88L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PlRyZWprYXo8L2ZpcnN0PgotICAgIDxsYXN0Plhhb3o8L2xhc3Q+CisgICAgPGxhc3Q+WGFvemE8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CiAgICAgPGZpcnN0PlVscmljaDwvZmlyc3Q+CkBAIC0xNjQ1LDYgKzE4MDgsMTQgQEAKICAgICA8bGFzdD5Ub25pPC9sYXN0PgogICA8L25hbWU+CiAgIDxuYW1lPgorICAgIDxmaXJzdD5WaWxsZTwvZmlyc3Q+CisgICAgPGxhc3Q+U2t5dHTDpDwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KKyAgICA8Zmlyc3Q+VmltaWw8L2ZpcnN0PgorICAgIDxsYXN0PlNhanU8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PlZpbmNlbnQ8L2ZpcnN0PgogICAgIDxsYXN0PkxlZ29sbDwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMTY1MywyMiArMTgyNCwzMCBAQAogICAgIDxsYXN0PlByaXZhdDwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KLSAgICA8Zmlyc3Q+VmltaWw8L2ZpcnN0PgotICAgIDxsYXN0PlNhanU8L2xhc3Q+Ci0gIDwvbmFtZT4KLSAgPG5hbWU+CiAgICAgPGZpcnN0PlZpdG9sZDwvZmlyc3Q+CiAgICAgPGxhc3Q+U2VkeXNoZXY8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PlZsYWRpc2xhdjwvZmlyc3Q+CisgICAgPGxhc3Q+QmF1ZXI8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PlZvbGtlcjwvZmlyc3Q+CiAgICAgPGxhc3Q+TGVpZGw8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PldhbGRlazwvZmlyc3Q+CisgICAgPGxhc3Q+SGVya2E8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0Pldhbmc8L2ZpcnN0PgogICAgIDxsYXN0PldlaWp1bjwvbGFzdD4KICAgPC9uYW1lPgogICA8bmFtZT4KKyAgICA8Zmlyc3Q+V2VuamluZzwvZmlyc3Q+CisgICAgPGxhc3Q+V2FuZzwvbGFzdD4KKyAgPC9uYW1lPgorICA8bmFtZT4KICAgICA8Zmlyc3Q+V2lsbDwvZmlyc3Q+CiAgICAgPGxhc3Q+V2FuZzwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMTcxMyw2ICsxODkyLDEwIEBACiAgICAgPGxhc3Q+V2l0ZG91Y2s8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+CisgICAgPGZpcnN0PlhpYTwvZmlyc3Q+CisgICAgPGxhc3Q+TGk8L2xhc3Q+CisgIDwvbmFtZT4KKyAgPG5hbWU+CiAgICAgPGZpcnN0PllvaGFubjwvZmlyc3Q+CiAgICAgPGxhc3Q+Um91c3NlbDwvbGFzdD4KICAgPC9uYW1lPgpAQCAtMTczMyw3ICsxOTE2LDcgQEAKICAgICA8bGFzdD5XYWduZXI8L2xhc3Q+CiAgIDwvbmFtZT4KICAgPG5hbWU+Ci0gICAgPGZpcnN0Lz4KLSAgICA8bGFzdD5yaWFzb2w8L2xhc3Q+CisgICAgPGZpcnN0PsOYeXN0ZWluPC9maXJzdD4KKyAgICA8bGFzdD5HaXNuw6VzPC9sYXN0PgogICA8L25hbWU+CiA8L2NvbnRyaWJ1dG9ycz4KZGlmZiAtLWdpdCBhL2RvY3MueG1sIGIvZG9jcy54bWwKaW5kZXggM2Y4MGIyNi4uY2NjZDJjYiAxMDA2NDQKLS0tIGEvZG9jcy54bWwKKysrIGIvZG9jcy54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDkgKzE3LDcgQEAKIC0tPgogPHByb2plY3QgbmFtZT0iZG9jcyIgZGVmYXVsdD0idHh0Mmh0bWwiPgogCi0gICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS41KyIgY2xhc3NuYW1lPSJqYXZhLm5ldC5Qcm94eSIvPgogICAgIDx0YXJnZXQgbmFtZT0idHh0Mmh0bWwiPgotICAgICAgICA8ZmFpbCB1bmxlc3M9ImpkazEuNSsiIG1lc3NhZ2U9IlRvbWNhdCBCdWlsZFV0aWxzIHJlcXVpcmVzIEphdmE1KyIvPgogICAgICAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iYnVpbGQiLz4KICAgICAgICAgPHRlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmRpciIvPgogICAgICAgICA8bWtkaXIgZGlyPSIke3RlbXAuZGlyfS9vcmcvYXBhY2hlL3RvbWNhdC9idWlsZHV0aWwiLz4KZGlmZiAtLWdpdCBhL2ZldGNoLnhtbCBiL2ZldGNoLnhtbAppbmRleCAxMDYyMzdkLi40NDIzMGFhIDEwMDY0NAotLS0gYS9mZXRjaC54bWwKKysrIGIvZmV0Y2gueG1sCkBAIC04LDcgKzgsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMzIsNiArMjMyLDI0IEBACiAgICAgPGYyIHByb2plY3Q9Im9yZy5oYW1jcmVzdCIgYXJjaGl2ZT0iaGFtY3Jlc3QtbGlicmFyeSIvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9Imp1bml0bGF1bmNoZXIiCisgICAgZGVzY3JpcHRpb249ImxvYWQganVuaXRsYXVuY2hlciBsaWJyYXJpZXMiCisgICAgZGVwZW5kcz0iaW5pdCI+CisgICAgPGYyIHByb2plY3Q9Im9yZy5qdW5pdC5wbGF0Zm9ybSIgYXJjaGl2ZT0ianVuaXQtcGxhdGZvcm0tbGF1bmNoZXIiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtZW5naW5lLWp1cGl0ZXIiCisgICAgICAgICAgZGVzY3JpcHRpb249ImxvYWQganVuaXQganVwaXRlciBlbmdpbmUgbGlicmFyaWVzIChuZWNlc3Nhcnkgb25seSBmb3IgaW50ZXJuYWwgQW50IHByb2plY3QgdGVzdHMpIgorICAgICAgICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJvcmcuanVuaXQuanVwaXRlciIgYXJjaGl2ZT0ianVuaXQtanVwaXRlci1lbmdpbmUiIC8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ianVuaXQtZW5naW5lLXZpbnRhZ2UiCisgICAgICAgICAgZGVzY3JpcHRpb249ImxvYWQganVuaXQgdmludGFnZSBlbmdpbmUgbGlicmFyaWVzIChuZWNlc3Nhcnkgb25seSBmb3IgaW50ZXJuYWwgQW50IHByb2plY3QgdGVzdHMpIgorICAgICAgICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJvcmcuanVuaXQudmludGFnZSIgYXJjaGl2ZT0ianVuaXQtdmludGFnZS1lbmdpbmUiIC8+CisgIDwvdGFyZ2V0PgorCiAgIDx0YXJnZXQgbmFtZT0ieG1sIgogICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIGZ1bGwgWE1MIGxpYnJhcmllcyAoWGFsYW4gYW5kIHhtbC1yZXNvbHZlcikiCiAgICAgICAgICAgZGVwZW5kcz0iaW5pdCI+CkBAIC0yNjIsNyArMjgwLDcgQEAKICAgPHRhcmdldCBuYW1lPSJiY2VsIgogICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIEJ5dGUgQ29kZSBFbmdpbmVlcmluZyBMaWJyYXJ5IChCQ0VMKSIKICAgICAgICAgICBkZXBlbmRzPSJpbml0Ij4KLSAgICA8ZjIgcHJvamVjdD0iYmNlbCIvPgorICAgIDxmMiBwcm9qZWN0PSJvcmcuYXBhY2hlLmJjZWwiIGFyY2hpdmU9ImJjZWwiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJqZGVwZW5kIgpAQCAtMjg3LDcgKzMwNSw2IEBACiAgICAgICAgICAgZGVzY3JpcHRpb249ImxvYWQgQmVhblNoZWxsIHN1cHBvcnQiCiAgICAgICAgICAgZGVwZW5kcz0iYnNmIj4KICAgICA8ZjIgcHJvamVjdD0ib3JnLmJlYW5zaGVsbCIgYXJjaGl2ZT0iYnNoIi8+Ci0gICAgPGYyIHByb2plY3Q9Im9yZy5iZWFuc2hlbGwiIGFyY2hpdmU9ImJzaC1jb3JlIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0ianl0aG9uIgpAQCAtMzEyLDE0ICszMjksMTQgQEAKICAgICA8ZjIgcHJvamVjdD0id2hpY2giLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJqYXZhbWFpbCIKLSAgICAgICAgICBkZXNjcmlwdGlvbj0ibG9hZCBKYXZhIE1haWwiCisgIDx0YXJnZXQgbmFtZT0iamFrYXJ0YW1haWwiCisgICAgICAgICAgZGVzY3JpcHRpb249ImxvYWQgSmFrYXJ0YSBNYWlsIgogICAgICAgICAgIGRlcGVuZHM9ImluaXQiPgogICAgIDwhLS0gV2Ugb25seSBuZWVkIHRoaXMgb25lIGRlcGVuZGVuY3kgYXMgcGVyCi0gICAgICB0aGUgcHJvamVjdCBkb2MgaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2phdmFtYWlsLyNEb3dubG9hZF9KYXZhTWFpbF9SZWxlYXNlCisgICAgICB0aGUgcHJvamVjdCBkb2MgaHR0cHM6Ly9lY2xpcHNlLWVlNGouZ2l0aHViLmlvL21haWwvCiAgICAgICBUaGlzIGFsb25lIHNob3VsZCBicmluZyBpbiBhbGwgbmVjZXNzYXJ5IGRlcGVuZGVuY2llcyAoaW5jbHVkaW5nIHRoZSBBUEkKICAgICAgICBqYXJzIGFuZCB0aGUgYWN0aXZhdGlvbiBqYXJzIC0tPgotICAgIDxmMiBwcm9qZWN0PSJjb20uc3VuLm1haWwiIGFyY2hpdmU9ImphdmF4Lm1haWwiLz4KKyAgICA8ZjIgcHJvamVjdD0iY29tLnN1bi5tYWlsIiBhcmNoaXZlPSJqYWthcnRhLm1haWwiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJqc3BjIgpAQCAtMzcxLDggKzM4OCwxNCBAQAogICAgICAgICAgZGVzdD0iJHt0ZW1wLmRpcn0vTmV0UmV4eC56aXAiIHNraXBleGlzdGluZz0idHJ1ZSIvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9Inh6IgorICAgICAgICAgIGRlc2NyaXB0aW9uPSJsb2FkIFhaIGZvciBKYXZhIgorICAgICAgICAgIGRlcGVuZHM9ImluaXQiPgorICAgIDxmMiBwcm9qZWN0PSJvcmcudHVrYWFuaSIgYXJjaGl2ZT0ieHoiLz4KKyAgPC90YXJnZXQ+CisKICAgPHRhcmdldCBuYW1lPSJhbGwiCiAgICAgZGVzY3JpcHRpb249ImxvYWQgYWxsIHRoZSBsaWJyYXJpZXMgKGV4Y2VwdCBqeXRob24pIgotICAgIGRlcGVuZHM9ImFudHVuaXQsaXZ5LGxvZ2dpbmcsanVuaXQseG1sLG5ldHdvcmtpbmcscmVnZXhwLGFudGxyLGJjZWwsamRlcGVuZCxic2YsZGVidWdnaW5nLHNjcmlwdCxqYXZhbWFpbCxqc3BjLGphaSxuZXRyZXh4Ii8+Ci0KKyAgICBkZXBlbmRzPSJhbnR1bml0LGl2eSxsb2dnaW5nLGp1bml0LGp1bml0bGF1bmNoZXIseG1sLG5ldHdvcmtpbmcscmVnZXhwLGFudGxyLGJjZWwsamRlcGVuZCxic2YsZGVidWdnaW5nLHNjcmlwdCwKKyAgICAgIGpha2FydGFtYWlsLGpzcGMsamFpLHh6LG5ldHJleHgsanVuaXQtZW5naW5lLXZpbnRhZ2UsanVuaXQtZW5naW5lLWp1cGl0ZXIiLz4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2dldC1tMi54bWwgYi9nZXQtbTIueG1sCmluZGV4IDQxMTFlODEuLmRlMzBlZjIgMTAwNjQ0Ci0tLSBhL2dldC1tMi54bWwKKysrIGIvZ2V0LW0yLnhtbApAQCAtOCw3ICs4LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvbGF1bmNoLWJ1aWxkLnhtbCBiL2xhdW5jaC1idWlsZC54bWwKaW5kZXggNzUzZWYyYi4uMGM1ZmVlYSAxMDA2NDQKLS0tIGEvbGF1bmNoLWJ1aWxkLnhtbAorKysgYi9sYXVuY2gtYnVpbGQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9saWIvbGlicmFyaWVzLnByb3BlcnRpZXMgYi9saWIvbGlicmFyaWVzLnByb3BlcnRpZXMKaW5kZXggZmNlZDdmYi4uODdmZTNjYyAxMDA2NDQKLS0tIGEvbGliL2xpYnJhcmllcy5wcm9wZXJ0aWVzCisrKyBiL2xpYi9saWJyYXJpZXMucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMywzNiArMzMsMzUgQEAKIAogIyBWZXJzaW9ucyBvZiBkaWZmZXJlbnQgbGlicmFyaWVzLiBQbGVhc2Uga2VlcCBpbiBhbHBoYWJldGljYWwgb3JkZXIsIGV4Y2VwdAogIyB3aGVuIGEgc3BlY2lmaWMgZGVwZW5kZW5jeSBmb3JjZXMgdGhlbSB0byBiZSBvdXQtb2Ytb3JkZXIKLWl2eS52ZXJzaW9uPTIuNC4wCi1hY3RpdmF0aW9uLnZlcnNpb249MS4xLjEKK2l2eS52ZXJzaW9uPTIuNS4wCiBhbnQtYW50dW5pdC52ZXJzaW9uPTEuNAogYW50bHIudmVyc2lvbj0yLjcuNwotYmNlbC52ZXJzaW9uPTUuMQorYmNlbC52ZXJzaW9uPTYuNC4xCiBic2YudmVyc2lvbj0yLjQuMAotYnNoLnZlcnNpb249Mi4wYjQKLWJzaC1jb3JlLnZlcnNpb249JHtic2gudmVyc2lvbn0KLSMgTGF0ZXIgdmVyc2lvbnMgYXJlIGJ1aWx0IHdpdGggSmF2YSA2Ci1jb21tb25zLW5ldC52ZXJzaW9uPTIuMgorYnNoLnZlcnNpb249Mi4wYjUKK2NvbW1vbnMtbmV0LnZlcnNpb249My42CiBjb21tb25zLWxvZ2dpbmcudmVyc2lvbj0xLjEKIGNvbW1vbnMtbG9nZ2luZy1hcGkudmVyc2lvbj0ke2NvbW1vbnMtbG9nZ2luZy52ZXJzaW9ufQogaGFtY3Jlc3QtY29yZS52ZXJzaW9uPTEuMwogaGFtY3Jlc3QtbGlicmFyeS52ZXJzaW9uPSR7aGFtY3Jlc3QtY29yZS52ZXJzaW9ufQogamFpLWNvcmUudmVyc2lvbj0xLjEuMwogamFpLWNvZGVjLnZlcnNpb249MS4xLjMKK2pha2FydGEubWFpbC52ZXJzaW9uPTEuNi40CiBqYWthcnRhLXJlZ2V4cC52ZXJzaW9uPTEuNAogIyBMYXRlciB2ZXJzaW9ucyBvZiBUb21jYXQgcHJvdmlkZSBhIGpzcGMgdGFzawogamFzcGVyLWNvbXBpbGVyLnZlcnNpb249NC4xLjM2CiBqYXNwZXItcnVudGltZS52ZXJzaW9uPSR7amFzcGVyLWNvbXBpbGVyLnZlcnNpb259Ci0jIExhdGVyIHZlcnNpb25zIGFyZSBidWlsdCB3aXRoIEphdmEgNwotamF2YXgubWFpbC52ZXJzaW9uPTEuNS42CiBqZGVwZW5kLnZlcnNpb249Mi45LjEKLSMgTGF0ZXIgdmVyc2lvbnMgYXJlIGJ1aWx0IHdpdGggSmF2YSA3CiBqcnVieS52ZXJzaW9uPTEuNi44Ci1qdW5pdC52ZXJzaW9uPTQuMTIKLSMgTGF0ZXIgdmVyc2lvbnMgYXJlIGJ1aWx0IHdpdGggSmF2YSA2Ci1yaGluby52ZXJzaW9uPTEuN1I1CitqdW5pdC52ZXJzaW9uPTQuMTMKK3JoaW5vLnZlcnNpb249MS43LjExCitqdW5pdC1wbGF0Zm9ybS1sYXVuY2hlci52ZXJzaW9uPTEuMi4wCisjIE9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgdGVzdHMgaW4gQW50IHByb2plY3QKK2p1bml0LXZpbnRhZ2UtZW5naW5lLnZlcnNpb249NS4yLjAKKyMgT25seSB1c2VkIGZvciBpbnRlcm5hbCB0ZXN0cyBpbiBBbnQgcHJvamVjdAoranVuaXQtanVwaXRlci1lbmdpbmUudmVyc2lvbj01LjIuMAoganNjaC52ZXJzaW9uPTAuMS41NQotanl0aG9uLnZlcnNpb249Mi41LjMKK2p5dGhvbi52ZXJzaW9uPTIuNy4wCiAjIGxvZzRqIDEuMi4xNSByZXF1aXJlcyBKTVMgYW5kIGEgZmV3IG90aGVyIFN1biBqYXJzIHRoYXQgYXJlIG5vdCBpbiB0aGUgbTIgcmVwbwogbG9nNGoudmVyc2lvbj0xLjIuMTQKIG9yby52ZXJzaW9uPTIuMC44CkBAIC03MCw2ICs2OSw3IEBACiB3aGljaC52ZXJzaW9uPTEuMAogeGFsYW4udmVyc2lvbj0yLjcuMgogeG1sLXJlc29sdmVyLnZlcnNpb249MS4yCit4ei52ZXJzaW9uPTEuOAogIyBwYWlyZWQKIGphY2wudmVyc2lvbj0xLjIuNgogdGNsamF2YS52ZXJzaW9uPSR7amFjbC52ZXJzaW9ufQpkaWZmIC0tZ2l0IGEvbGliL29wdGlvbmFsL2p1bml0LTQuMTIuamFyIGIvbGliL29wdGlvbmFsL2p1bml0LTQuMTIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTdmYzI2Li4wMDAwMDAwCi0tLSBhL2xpYi9vcHRpb25hbC9qdW5pdC00LjEyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9vcHRpb25hbC9qdW5pdC00LjEzLmphciBiL2xpYi9vcHRpb25hbC9qdW5pdC00LjEzLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2MzYzQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL29wdGlvbmFsL2p1bml0LTQuMTMuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hbnVhbC9JbnRlZ3JhdGlvbi9qZXh0LXBsdWdpbi5odG1sIGIvbWFudWFsL0ludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwKaW5kZXggODRlODhjMC4uZGFkZTgzMiAxMDA2NDQKLS0tIGEvbWFudWFsL0ludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwKKysrIGIvbWFudWFsL0ludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0MyArMTUsMzkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+QXBhY2hlIEFudFdvcmsgUGx1Z2luIGZvciB0aGUgSmV4dCBKYXZhIFRleHQgRWRpdG9yPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgogCi08aDE+QW50V29yayBQbHVnaW4gZm9yIHRoZSBKZXh0IEphdmEgVGV4dCBFZGl0b3I8L2gxPgotIDxhIG5hbWU9ImF1dGhvcnMiPjwvYT5ieTx1bD4KLSAgPGxpPktsYXVzIEhhcnRsYWdlCi0gICAgICAoPGEgaHJlZj0ibWFpbHRvOktIYXJ0bGFnZUB0LW9ubGluZS5kZSI+S0hhcnRsYWdlQHQtb25saW5lLmRlPC9hPik8L2xpPgorPGgxIGlkPSJhdXRob3JzIj5BbnRXb3JrIFBsdWdpbiBmb3IgdGhlIEpleHQgSmF2YSBUZXh0IEVkaXRvcjwvaDE+CitieQorPHVsPgorICA8bGk+S2xhdXMgSGFydGxhZ2UgKDxhIGhyZWY9Im1haWx0bzpLSGFydGxhZ2VAdC1vbmxpbmUuZGUiPktIYXJ0bGFnZUB0LW9ubGluZS5kZTwvYT4pPC9saT4KIDwvdWw+Ci08aHI+Cis8aHIvPgogCi08cD5Zb3UgY2FuIGRvd25sb2FkIHRoZSBwbHVnaW4gYXQ6IDxhCi1ocmVmPSJmdHA6Ly9qZXh0LnNvdXJjZWZvcmdlLm5ldC9wdWIvamV4dC9wbHVnaW5zL0FudFdvcmsuemlwIj5mdHA6Ly9qZXh0LnNvdXJjZWZvcmdlLm5ldC9wdWIvamV4dC9wbHVnaW5zL0FudFdvcmsuemlwPC9hPjwvcD4KKzxwPllvdSBjYW4gZG93bmxvYWQgdGhlIHBsdWdpbgorYXQ6IDxhIGhyZWY9Imh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2pleHQvZmlsZXMvT2xkRmlsZXMvYW50d29ya19wbHVnaW4uemlwL2Rvd25sb2FkIgordGFyZ2V0PSJfdG9wIj5odHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9qZXh0L2ZpbGVzL09sZEZpbGVzL2FudHdvcmtfcGx1Z2luLnppcC9kb3dubG9hZDwvYT48L3A+CiAKLTxoMj5JbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFJlYWRtZS50eHQ6PC9oMj4KKzxoMj5JbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFJlYWRtZS50eHQ8L2gyPgogCiA8cD5Zb3UgaGF2ZSB0byBlbmFibGUgdGhlIEpleHQgQ29uc29sZSB0byBzZWUgdGhlIEFwYWNoZSBBbnQgb3V0cHV0IChtZW51OgotRWRpdC0mZ3Q7T3B0aW9ucy4uLiAtIEdlbmVyYWwgUGFuZWwpLCBiZWNhdXNlIHRoZSBBbnQgbWVzc2FnZXMgYXJlCi1yZWRpcmVjdGVkIHRvIHRoZSBKZXh0IGNvbnNvbGUuPC9wPgorRWRpdCZyYXJyO09wdGlvbnMmaGVsbGlwOyZuZGFzaDtHZW5lcmFsIFBhbmVsKSwgYmVjYXVzZSBBbnQgbWVzc2FnZXMgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIEpleHQKK2NvbnNvbGUuPC9wPgogCi08cD5Zb3UgY2FuIGNvbmZpZ3VyZSB0aGUgQW50IGNhbGwgaW4gdGhlIEpleHQgbWVudTogRWRpdC0mZ3Q7T3B0aW9ucy4uLiAtCi1QbHVnaW4gT3B0aW9ucyAtIEFudHdvcmsgUGx1Z2luIFBhbmVsOyBoZXJlIHlvdSBjYW4gc2V0IHRoZSBhbnQgaG9tZQotZGlyZWN0b3J5IGFuZCB0aGUgcGF0aCB0byB5b3VyIGJ1aWxkIGZpbGUuPC9wPgorPHA+WW91IGNhbiBjb25maWd1cmUgdGhlIEFudCBjYWxsIGluIHRoZSBKZXh0IG1lbnU6IEVkaXQmcmFycjtPcHRpb25zJmhlbGxpcDsmbmRhc2g7IFBsdWdpbgorT3B0aW9ucyZuZGFzaDtBbnR3b3JrIFBsdWdpbiBQYW5lbDsgaGVyZSB5b3UgY2FuIHNldCBBbnQgaG9tZSBkaXJlY3RvcnkgYW5kIHRoZSBwYXRoIHRvIHlvdXIgYnVpbGQKK2ZpbGUuPC9wPgogCi08cD5Zb3UgY2FuIHN0YXJ0IEFudFdvcmsgaW4gdGhlIG1lbnU6IFBsdWdpbnMtJmd0O0FudC0mZ3Q7V29yayBOb3chICBJbiB0aGUKLWFwcGVhcmluZyBkaWFsb2cgYm94IHlvdSBjYW4gZW50ZXIgdGhlIHRhcmdldCB3aGljaCB5b3Ugd2FudCB0bwotY29tcGlsZS48L3A+Cis8cD5Zb3UgY2FuIHN0YXJ0IEFudFdvcmsgaW4gdGhlIG1lbnU6IFBsdWdpbnMmcmFycjtBbnQmcmFycjtXb3JrIE5vdyEgIEluIHRoZSBhcHBlYXJpbmcgZGlhbG9nIGJveAoreW91IGNhbiBlbnRlciB0aGUgdGFyZ2V0IHdoaWNoIHlvdSB3YW50IHRvIGNvbXBpbGUuPC9wPgogCi08cD5JZiBhIGphdmFjIGVycm9yIG9jY3VycyBpbiB0aGUgYW50IHJ1biBhbiBlcnJvci1saXN0IG9wZW5zIHdpdGhpbgotSmV4dC4gV2l0aCBhIGRvdWJsZS1jbGljayBvbiB0aGUgZXJyb3ItbWVzc2FnZSB5b3UganVtcCB0byB0aGUgZXJyb3IKLWluIHRoZSBzcGVjaWZpZWQgamF2YSB0ZXh0IGZpbGUuPC9wPgorPHA+SWYgYSA8Y29kZT5qYXZhYzwvY29kZT4gZXJyb3Igb2NjdXJzIGluIHRoZSBBbnQgcnVuLCBhbiBlcnJvciBsaXN0IG9wZW5zIHdpdGhpbiBKZXh0LiBXaXRoIGEKK2RvdWJsZSBjbGljayBvbiB0aGUgZXJyb3IgbWVzc2FnZSB5b3UganVtcCB0byB0aGUgZXJyb3IgaW4gdGhlIHNwZWNpZmllZCBKYXZhIHNvdXJjZSBmaWxlLjwvcD4KIAotCi08L2JvZHk+PC9odG1sPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL0xJQ0VOU0UgYi9tYW51YWwvTElDRU5TRQppbmRleCBmODIwZDRiLi4yMzllYzk0IDEwMDY0NAotLS0gYS9tYW51YWwvTElDRU5TRQorKysgYi9tYW51YWwvTElDRU5TRQpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLworICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwogICoKICAqICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCiAgKgpAQCAtMTkzLDcgKzE5Myw3IEBACiAgKiAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAqICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvQm9ybGFuZEVKQlRhc2tzLmh0bWwgYi9tYW51YWwvVGFza3MvQm9ybGFuZEVKQlRhc2tzLmh0bWwKaW5kZXggMTI2ZmU1Yy4uYTYwZDNkMiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL0JvcmxhbmRFSkJUYXNrcy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9Cb3JsYW5kRUpCVGFza3MuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEzMCArMTUsMTIyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Cb3JsYW5kIEVKQiBUYXNrczwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ibG9nIj5Cb3JsYW5kRGVwbG95PC9hPlRvb2w8L2gyPgorPGgyIGlkPSJsb2ciPkJvcmxhbmREZXBsb3lUb29sPC9oMj4KIDxwPmJ5IEJlbm9pdCBNb3Vzc2F1ZCAoPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20iPmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb208L2E+KTwvcD4KIAogCiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+VGhlIEJvcmxhbmREZXBsb3lUb29sIGlzIGEgdmVuZG9yIHNwZWNpZmljIG5lc3RlZCBlbGVtZW50IGZvciB0aGUgRWpiamFyIG9wdGlvbmFsIHRhc2suPC9wPgotPHA+Qm9ybGFuZERlcGxveW1lbnRUb29sIGlzIGRlZGljYXRlZCB0byB0aGUgQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41LnggYW5kIEJvcmxhbmQKLSAgRW50ZXJwcmlzZSBTZXJ2ZXIgNS54LiBJdCAgZ2VuZXJhdGVzIGFuZCBjb21waWxlcyB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgYWxsIGVqYiBkZXNjcmliZWQgaW50byB0aGUKLSAgRGVwbG95bWVudCBEZXNjcmlwdG9yLCBidWlsZHMgdGhlIGphciBmaWxlIGluY2x1ZGluZyB0aGUgc3VwcG9ydCBmaWxlcyBhbmQKLSAgdmVyaWZ5IHdoZXRoZXIgdGhlIHByb2R1Y2VkIGphciBpcyB2YWxpZCBvciBub3QuPC9wPgorPHA+Qm9ybGFuZERlcGxveVRvb2wgaXMgZGVkaWNhdGVkIHRvIHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUueCBhbmQgQm9ybGFuZCBFbnRlcnByaXNlCitTZXJ2ZXIgNS54LiBJdCBnZW5lcmF0ZXMgYW5kIGNvbXBpbGVzIHRoZSBzdHVicyBhbmQgc2tlbGV0b25zIGZvciBhbGwgRUpCcyBkZXNjcmliZWQgaW4gdGhlCitEZXBsb3ltZW50IERlc2NyaXB0b3IsIGJ1aWxkcyB0aGUgamFyIGZpbGUgaW5jbHVkaW5nIHRoZSBzdXBwb3J0IGZpbGVzIGFuZCB2ZXJpZmllcyB3aGV0aGVyIHRoZQorcHJvZHVjZWQgamFyIGlzIHZhbGlkIG9yIG5vdC48L3A+CiAKLTxwPkJlbm9pdCBNb3Vzc2F1ZCBtYWludGFpbnMgYSBzZXBhcmF0ZSA8YQotaHJlZj0iaHR0cDovL3d3dy5tb3Vzc2F1ZC5vcmcvZWpiamFyLmh0bWwiPkZBUTwvYT4gZm9yIHRoaXMgdGFzayBhdAotaGlzIGhvbWVwYWdlLjwvcD4KKzxwPkJlbm9pdCBNb3Vzc2F1ZCBtYWludGFpbnMgYQorc2VwYXJhdGUgPGEgaHJlZj0iaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTQxMTIyMDgzMjE1L2h0dHA6Ly93d3cubW91c3NhdWQub3JnL2VqYmphci5odG1sIgordGFyZ2V0PSJfdG9wIj5GQVE8L2E+IGZvciB0aGlzIHRhc2sgYXQgaGlzIGhvbWVwYWdlLjwvcD4KIAogPGgzPkJvcmxhbmQgZWxlbWVudDwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iNjIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBib3JsYW5kCi0gICAgICByZWFkeSBqYXIgZmlsZXMgYXJlIGRlcG9zaXRlZDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPnllczwvdGQ+CisgICAgPHRkPmRlc3RkaXI8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBCb3JsYW5kIHJlYWR5IGphciBmaWxlcyBhcmUgc3RvcmVkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5kZWJ1ZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij5JZiB0cnVlLCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIGJvcmxhbmQKLSAgICAgIHRvb2xzIChqYXZhMmlpb3AsIGlhc3Rvb2wgLi4uKSBkZWZhdWx0ID0gZmFsc2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj5ubzwvdGQ+CisgICAgPHRkPmRlYnVnPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIHR1cm4gb24gdGhlIGRlYnVnIG1vZGUgZm9yIGVhY2ggQm9ybGFuZCB0b29scworICAgICAgKDxjb2RlPmphdmEyaWlvcDwvY29kZT4sIDxjb2RlPmlhc3Rvb2w8L2NvZGU+LCAuLi4pPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj52ZXJpZnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+SWYgdHJ1ZSwgdHVybiBvbiB0aGUgdmVyaWZpY2F0aW9uIGF0IHRoZSBlbmQKLSAgICAgIG9mIHRoZSBqYXIgcHJvZHVjdGlvbiAoZGVmYXVsdCA9IGZhbHNlKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgICA8dGQ+dmVyaWZ5PC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIHR1cm4gb24gdGhlIHZlcmlmaWNhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBqYXIgcHJvZHVjdGlvbi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPnZlcmlmeWFyZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+ZXh0cmEgcGFyYW1ldGVyIGZvciB2ZXJpZnkgY29tbWFuZDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgICA8dGQ+dmVyaWZ5YXJnczwvdGQ+CisgICAgPHRkPmV4dHJhIHBhcmFtZXRlciBmb3IgdmVyaWZ5IGNvbW1hbmQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+c3VmZml4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgYmFzZW5hbWUgb2YgdGhlCi0gICAgICBkZXBsb3ltZW50IGRlc2NyaXB0b3IgdG8gY3JlYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgQm9ybGFuZCBFSkIgamFyIGZpbGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+Tm8sIGRlZmF1bHRzIHRvICctZWpiLmphcicuPC90ZD4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YKKyAgICAgIHRoZSBCb3JsYW5kIEVKQiBqYXIgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHEgY2xhc3M9Im5vLWJyZWFrIj4tZWpiLmphcjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmJhc2R0ZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij48Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAgICBEVEQgd2hpY2ggY292ZXJzIHRoZSBCb3JsYW5kIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0gICAgICBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIGJvcmxhbmQgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdQotICAgICAgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZAorICAgIDx0ZD5iYXNkdGQ8L3RkPgorICAgIDx0ZD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIERURCB3aGljaCBjb3ZlcnMgdGhlIEJvcmxhbmQKKyAgICAgIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIGJvcmxhbmQgaW4geW91cgorICAgICAgY2xhc3NwYXRoLiBJZiB5b3UgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZAogICAgICAgPGEgaHJlZj0iZWpiLmh0bWwjZWpiamFyLWR0ZCI+PGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+PC9hPiBlbGVtZW50LCBkZXNjcmliZWQKICAgICAgIGluIHRoZSBlamJqYXIgdGFzayBkb2N1bWVudGF0aW9uLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPm5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmVqYmR0ZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij48Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlCi0gICAgICBlamItamFyIERURCBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5Ci0gICAgICBpZiB5b3UgaGF2ZSBib3JsYW5kIGluIHlvdXIgY2xhc3NwYXRoLiBJZiB5b3UgZG8gbm90LCB5b3Ugc2hvdWxkIHVzZSBhCi0gICAgICBuZXN0ZWQgPGEgaHJlZj0iZWpiLmh0bWwjZWpiamFyLWR0ZCI+PGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+PC9hPiBlbGVtZW50LAotICAgICAgZGVzY3JpYmVkIGluIHRoZSBlamJqYXIgdGFzawotICAgICAgZG9jdW1lbnRhdGlvbi4gPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICAgIDx0ZD5lamJkdGQ8L3RkPgorICAgIDx0ZD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYi1qYXIgRFREIGluIHRoZSBjbGFzcworICAgICAgaGllcmFyY2h5LiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIGJvcmxhbmQgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdSBkbyBub3QsCisgICAgICB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZCA8YSBocmVmPSJlamIuaHRtbCNlamJqYXItZHRkIj48Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT48L2E+IGVsZW1lbnQsCisgICAgICBkZXNjcmliZWQgaW4gdGhlIGVqYmphciB0YXNrIGRvY3VtZW50YXRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPmdlbmVyYXRlY2xpZW50IDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iOTE1Ij5JZiB0cnVlLCB0dXJuIG9uIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgICBlamJqYXIgKGRlZmF1bHQgPSBmYWxzZSk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgd2lkdGg9IjYyIj5ubzwvdGQ+CisgICAgPHRkPmdlbmVyYXRlY2xpZW50PC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIHR1cm4gb24gdGhlIGdlbmVyYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgRUpCIGphci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPnZlcnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+c2V0IHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFZlcnNpb24uCi0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT40IG1lYW5zIEIuQS5TIChCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlcikgNC54LCB0YXJnZXQgd2lsbCBhZGQgZWpiLWlucHJpc2UueG1sIGZpbGU8L2xpPgotICAgICAgICAgICAgICA8bGk+NSBtZWFucyBCLkUuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIpIDUueCwgdGFyZ2V0IHdpbGwgYWRkIGVqYi1ib3JsYW5kLnhtbCBmaWxlPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+Tm8sIGRlZmF1bHRzIHRvIDQ8L3RkPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+c2V0IHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFZlcnNpb24uCisgICAgICA8dWw+CisgICAgICAgIDxsaT40IG1lYW5zIEIuQS5TIChCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlcikgNC54LCB0YXJnZXQgd2lsbCBhZGQgZWpiLWlucHJpc2UueG1sIGZpbGU8L2xpPgorICAgICAgICA8bGk+NSBtZWFucyBCLkUuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIpIDUueCwgdGFyZ2V0IHdpbGwgYWRkIGVqYi1ib3JsYW5kLnhtbCBmaWxlPC9saT4KKyAgICAgIDwvdWw+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5qYXZhMmlpb3BQYXJhbXMgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPklmIGZpbGxlZCwgdGhlIHBhcmFtcyBhcmUgYWRkZWQgdG8gdGhlIGphdmEyaWlvcCBjb21tYW5kIChleDogLW5vX3dhcm5fbWlzc2luZ19kZWZpbmUpPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICAgIDx0ZD5qYXZhMmlpb3BQYXJhbXM8L3RkPgorICAgIDx0ZD5JZiBmaWxsZWQsIHRoZSBwYXJhbXMgYXJlIGFkZGVkIHRvIHRoZSA8a2JkPmphdmEyaWlvcDwva2JkPiBjb21tYW5kCisgICAgKGV4OiA8a2JkPi1ub193YXJuX21pc3NpbmdfZGVmaW5lPC9rYmQ+KTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIAogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPlRoZSBmb2xsb3dpbmcgYnVpbGQueG1sIHNuaXBwZXQgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIEJvcmxhbmQgZWxlbWVudAotICBpbnRvIHRoZSBlamJqYXIgdGFzazwvcD4KLTxwcmU+ICAgICZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsgYmFzZWphcm5hbWU9JnF1b3Q7dnNtcCZxdW90OyBkZXNjcmlwdG9yZGlyPSZxdW90OyR7cnNjLmRpcn0vaHJtYW5hZ2VyJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7Ym9ybGFuZCBkZXN0ZGlyPSZxdW90O2xpYiZxdW90OyB2ZXJpZnk9JnF1b3Q7b24mcXVvdDsgZ2VuZXJhdGVjbGllbnQ9JnF1b3Q7b24mcXVvdDsgdmVyc2lvbj0mcXVvdDs1JnF1b3Q7Jmd0OwotICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9JnF1b3Q7Y2xhc3NwYXRoJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0Oy9ib3JsYW5kJmd0OwotICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqXGVqYi1qYXIueG1sJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O3N1cHBvcnQgZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsmZ3Q7Ci0gICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkZW1vXCouY2xhc3MmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7ZGVtb1xoZWxwZXJcKi5jbGFzcyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3N1cHBvcnQmZ3Q7Ci0gICAgICZsdDsvZWpiamFyJmd0OzwvcHJlPgotPHByZT5UaGUgYm9ybGFuZCBlbGVtZW50IHdpbGwgZ2VuZXJhdGUgaW50byB0aGUgbGliIGRpciBhbiBlamIgamFyIGZpbGUgdXNpbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBwbGFjZWQgaW50byB0aGUgJHtyc2MuZGlyfS9ocm1hbmFnZXIgZGlyZWN0b3J5LgotVGhlIHZlcmlmeSBwaGFzZSBpcyB0dXJuZWQgb24gYW5kIHRoZSBnZW5lcmF0ZSBjbGllbnQgcGhhc2UgYXMgd2VsbC4KLTwvcHJlPgotCi08aDM+Jm5ic3A7PC9oMz4KKzxwPlRoZSBmb2xsb3dpbmcgPHNhbXA+YnVpbGQueG1sPC9zYW1wPiBzbmlwcGV0IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBCb3JsYW5kIGVsZW1lbnQgaW4KK3RoZSA8Y29kZT5lamJqYXI8L2NvZGU+IHRhc2s8L3A+Cis8cHJlPgorJmx0O2VqYmphciBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyBiYXNlamFybmFtZT0mcXVvdDt2c21wJnF1b3Q7IGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtyc2MuZGlyfS9ocm1hbmFnZXImcXVvdDsmZ3Q7CisgICAgJmx0O2JvcmxhbmQgZGVzdGRpcj0mcXVvdDtsaWImcXVvdDsgdmVyaWZ5PSZxdW90O29uJnF1b3Q7IGdlbmVyYXRlY2xpZW50PSZxdW90O29uJnF1b3Q7IHZlcnNpb249JnF1b3Q7NSZxdW90OyZndDsKKyAgICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0mcXVvdDtjbGFzc3BhdGgmcXVvdDsvJmd0OworICAgICZsdDsvYm9ybGFuZCZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqXGVqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgICAmbHQ7c3VwcG9ydCBkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkZW1vXCouY2xhc3MmcXVvdDsvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2RlbW9caGVscGVyXCouY2xhc3MmcXVvdDsvJmd0OworICAgICZsdDsvc3VwcG9ydCZndDsKKyZsdDsvZWpiamFyJmd0OzwvcHJlPgorPHA+VGhlIDxjb2RlPmJvcmxhbmQ8L2NvZGU+IGVsZW1lbnQgd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSA8c2FtcD5saWI8L3NhbXA+IGRpcmVjdG9yeSBhbiBFSkIgamFyCitmaWxlIHVzaW5nIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgcGxhY2VkIGludG8gdGhlIDxzYW1wPiR7cnNjLmRpcn0vaHJtYW5hZ2VyPC9zYW1wPiBkaXJlY3RvcnkuCitUaGUgdmVyaWZ5IHBoYXNlIGlzIHR1cm5lZCBvbiBhbmQgdGhlIGdlbmVyYXRlIGNsaWVudCBwaGFzZSBhcyB3ZWxsLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvQm9ybGFuZEdlbmVyYXRlQ2xpZW50Lmh0bWwgYi9tYW51YWwvVGFza3MvQm9ybGFuZEdlbmVyYXRlQ2xpZW50Lmh0bWwKaW5kZXggMDE5NTZiMi4uM2E0Mzg2MSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL0JvcmxhbmRHZW5lcmF0ZUNsaWVudC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9Cb3JsYW5kR2VuZXJhdGVDbGllbnQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDc3ICsxNSw3MyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+Qm9ybGFuZEdlbmVyYXRlQ2xpZW50IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImxvZyI+Qm9ybGFuZEdlbmVyYXRlQ2xpZW50PC9hPjwvaDI+Cis8aDIgaWQ9ImxvZyI+Qm9ybGFuZEdlbmVyYXRlQ2xpZW50PC9oMj4KIDxwPmJ5IEJlbm9pdCBNb3Vzc2F1ZCAoPGEgaHJlZj0ibWFpbHRvOmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb20iPmJlbm9pdC5tb3Vzc2F1ZEBjcmlsdGVsZWNvbS5jb208L2E+KTwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5UaGUgQm9ybGFuZEdlbmVyYXRlQ2xpZW50IGlzIGEgdGFzayBkZWRpY2F0ZWQgdG8gQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIKLSAgdiA0LjUuIEl0IG9mZmVycyB0byBnZW5lcmF0ZSB0aGUgY2xpZW50IGphciBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYW4gZWpiIGphcgotICBmaWxlLjwvcD4KKzxwPlRoZSBCb3JsYW5kR2VuZXJhdGVDbGllbnQgaXMgYSB0YXNrIGRlZGljYXRlZCB0byBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciB2IDQuNS4gSXQgb2ZmZXJzIHRvCitnZW5lcmF0ZSB0aGUgY2xpZW50IGphciBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYW4gRUpCIGphciBmaWxlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MiI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+ZWpiamFyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPmVqYiBqYXIgZmlsZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiB3aWR0aD0iNjIiPnllczwvdGQ+CisgICAgPHRkPmVqYmphcjwvdGQ+CisgICAgPHRkPkVKQiBqYXIgZmlsZTwvdGQ+CisgICAgPHRkPnllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2MyI+ZGVidWc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+SWYgdHJ1ZSwgdHVybiBvbiB0aGUgZGVidWcgbW9kZSBmb3IgZWFjaCBib3JsYW5kCi0gICAgICB0b29scyAoamF2YTJpaW9wLCBpYXN0b29sIC4uLikgZGVmYXVsdCA9IGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICAgIDx0ZD5kZWJ1ZzwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+LCB0dXJuIG9uIHRoZSBkZWJ1ZyBtb2RlIGZvciBlYWNoIEJvcmxhbmQgdG9vbAorICAgICAgKDxjb2RlPmphdmEyaWlvcDwvY29kZT4sIDxjb2RlPmlhc3Rvb2w8L2NvZGU+LCAuLi4pPC90ZD4KKyAgICA8dGQ+bm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5jbGllbnRqYXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjkxNSI+Y2xpZW50IGphciBmaWxlIG5hbWUuIElmIG1pc3NpbmcgdGhlIGNsaWVudCBqYXIKLSAgICAgIGZpbGUgbmFtZSBpcyBidWlsZCB1c2luZyB0aGUgZWpiamFyIGZpbGUgbmFtZTogZWpiamFyID0gaGVsbG9iZWFuLWVqYi5qYXIKLSAgICAgID0mZ3Q7IGhlbGxvYmVhbi1lamJjbGllbnQuamFyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICAgIDx0ZD5jbGllbnRqYXI8L3RkPgorICAgIDx0ZD5jbGllbnQgamFyIGZpbGUgbmFtZS4gSWYgbWlzc2luZyB0aGUgY2xpZW50IGphciBmaWxlIG5hbWUgaXMgYnVpbGQgdXNpbmcKKyAgICAgIHRoZSA8dmFyPmVqYmphcjwvdmFyPiBmaWxlIG5hbWU6IDx2YXI+ZWpiamFyPC92YXI+PTxxPmhlbGxvYmVhbi1lamIuamFyPC9xPgorICAgICAgJnJBcnI7IDxxPmhlbGxvYmVhbi1lamJjbGllbnQuamFyPC9xPjwvdGQ+CisgICAgPHRkPm5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj5tb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPmNob29zZSB0aGUgY29tbWFuZCBsYXVuY2hpbmcgbW9kZS4gVHdvIHZhbHVlczoKLSAgICAgIGphdmEgb3IgZm9yay4gZGVmYXVsdCA9IGZvcmsuIGphdmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgdmVyc2lvbj01LlBvc3NpYmlsaXR5IHRvIHNwZWNpZnkgYSBjbGFzc3BhdGguPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+bm88L3RkPgorICAgIDx0ZD5tb2RlPC90ZD4KKyAgICA8dGQ+Y2hvb3NlIHRoZSBjb21tYW5kIGxhdW5jaGluZyBtb2RlLiBUd28gdmFsdWVzOiA8cT5qYXZhPC9xPiBvciA8cT5mb3JrPC9xPgorICAgICAgKGRlZmF1bHQpLiA8cT5qYXZhPC9xPiBpcyBub3Qgc3VwcG9ydGVkIGZvciA8dmFyPnZlcnNpb248L3Zhcj49PHE+NTwvcT4uIFBvc3NpYmlsaXR5IHRvCisgICAgICBzcGVjaWZ5IGEgY2xhc3NwYXRoLjwvdGQ+CisgICAgPHRkPm5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzIj52ZXJzaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI5MTUiPnNldCB0aGUgQm9ybGFuZCBBcHBsaWNhdGlvbiBWZXJzaW9uLgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+NCBtZWFucyBCLkEuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC54KTwvbGk+Ci0gICAgICAgICAgICAgIDxsaT41IG1lYW5zIEIuRS5TIChCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA1LngpPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHdpZHRoPSI2MiI+Tm8sIGRlZmF1bHRzIHRvIDQ8L3RkPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+c2V0IHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFZlcnNpb24uCisgICAgICA8dWw+CisgICAgICAgIDxsaT48cT40PC9xPiBtZWFucyBCLkEuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC54KTwvbGk+CisgICAgICAgIDxsaT48cT41PC9xPiBtZWFucyBCLkUuUyAoQm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNS54KTwvbGk+CisgICAgICA8L3VsPgorICAgIDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT40PC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+VGhlIGZvbGxvd2luZyBidWlsZC54bWwgc25pcHBldCBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgQm9ybGFuZCBlbGVtZW50Ci0gICBpbnRvIHRoZSBlamJqYXIgdGFzayB1c2luZyB0aGUgamF2YSBtb2RlLjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgPHNhbXA+YnVpbGQueG1sPC9zYW1wPiBzbmlwcGV0IGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBCb3JsYW5kIGVsZW1lbnQgaW4KK3RoZSA8Y29kZT5lamJqYXI8L2NvZGU+IHRhc2sgdXNpbmcgdGhlIDxxPmZvcms8L3E+IDx2YXI+bW9kZTwvdmFyPi48L3A+CiA8cHJlPgotJmx0O2JsZ2VuY2xpZW50IGVqYmphcj0mcXVvdDtsaWIvc2VjdXRlc3QtZWpiLmphciZxdW90OyBjbGllbnRqYXI9JnF1b3Q7bGliL2NsaWVudC5qYXImcXVvdDsgZGVidWc9JnF1b3Q7dHJ1ZSZxdW90OyBtb2RlPSZxdW90O2ZvcmsmcXVvdDsmZ3Q7IHZlcnNpb249JnF1b3Q7NSZxdW90OyZndDsKKyZsdDtibGdlbmNsaWVudCBlamJqYXI9JnF1b3Q7bGliL3NlY3V0ZXN0LWVqYi5qYXImcXVvdDsgY2xpZW50amFyPSZxdW90O2xpYi9jbGllbnQuamFyJnF1b3Q7IGRlYnVnPSZxdW90O3RydWUmcXVvdDsgbW9kZT0mcXVvdDtmb3JrJnF1b3Q7IHZlcnNpb249JnF1b3Q7NSZxdW90OyZndDsKICAgICAmbHQ7Y2xhc3NwYXRoJmd0OwogICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7bXltb2R1bGUuamFyJnF1b3Q7LyZndDsKICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLSZsdDsvYmxnZW5jbGllbnQmZ3Q7Ci08L3ByZT4KLTxwcmU+Jm5ic3A7PC9wcmU+CismbHQ7L2JsZ2VuY2xpZW50Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9hbnQuaHRtbCBiL21hbnVhbC9UYXNrcy9hbnQuaHRtbAppbmRleCA4N2I3OGJiLi5mODY3NzAxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYW50Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2FudC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzIzICsxNSwyODYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFudCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJhbnQiPkFudDwvYT48L2gyPgorPGgyIGlkPSJhbnQiPkFudDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD5SdW5zIEFwYWNoZSBBbnQgb24gYSBzdXBwbGllZCBidWlsZGZpbGUuIFRoaXMgY2FuIGJlIHVzZWQgdG8gYnVpbGQKLXN1YnByb2plY3RzLiAgPHN0cm9uZz5UaGlzIHRhc2sgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEKLTxjb2RlPnRhcmdldDwvY29kZT4gaWYgaXQgaW52b2tlcyB0aGUgc2FtZSBidWlsZCBmaWxlIGl0IGlzIHBhcnQKKzxwPlJ1bnMgQXBhY2hlIEFudCBvbiBhIHN1cHBsaWVkIGJ1aWxkZmlsZS4gVGhpcyBjYW4gYmUgdXNlZCB0byBidWlsZCBzdWJwcm9qZWN0cy4gIDxzdHJvbmc+VGhpcwordGFzayBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYSA8Y29kZT50YXJnZXQ8L2NvZGU+IGlmIGl0IGludm9rZXMgdGhlIHNhbWUgYnVpbGQgZmlsZSBpdCBpcyBwYXJ0CiBvZi48L3N0cm9uZz48L3A+CiAKLTxwPldoZW4gdGhlIDxpPmFudGZpbGU8L2k+IGF0dHJpYnV0ZSBpcyBvbWl0dGVkLCB0aGUgZmlsZSAmcXVvdDtidWlsZC54bWwmcXVvdDsKLWluIHRoZSBzdXBwbGllZCBkaXJlY3RvcnkgKDxpPmRpcjwvaT4gYXR0cmlidXRlKSBpcyB1c2VkLjwvcD4KLTxwPklmIG5vIHRhcmdldCBhdHRyaWJ1dGUgaXMgc3VwcGxpZWQsIHRoZSBkZWZhdWx0IHRhcmdldCBvZiB0aGUgbmV3IHByb2plY3QgaXMKLXVzZWQuPC9wPgotPHA+QnkgZGVmYXVsdCwgYWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjdXJyZW50IHByb2plY3Qgd2lsbCBiZQotYXZhaWxhYmxlIGluIHRoZSBuZXcgcHJvamVjdC4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IHRoZQotPGk+aW5oZXJpdEFsbDwvaT4gYXR0cmlidXRlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgb25seQotJnF1b3Q7dXNlciZxdW90OyBwcm9wZXJ0aWVzIChpLmUuLCB0aG9zZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSkKLXdpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdC4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2V0IG9mCi1wcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3Qgd2lsbCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0Ci1hcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoU2VlIGFsc28gdGhlIDxhCi1ocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eSB0YXNrPC9hPikuPC9wPgorPHA+V2hlbiB0aGUgPHZhcj5hbnRmaWxlPC92YXI+IGF0dHJpYnV0ZSBpcyBvbWl0dGVkLCB0aGUgZmlsZSA8c2FtcD5idWlsZC54bWw8L3NhbXA+IGluIHRoZSBzdXBwbGllZAorZGlyZWN0b3J5ICg8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUpIGlzIHVzZWQuPC9wPgorPHA+SWYgbm8gdGFyZ2V0IGF0dHJpYnV0ZSBpcyBzdXBwbGllZCwgdGhlIGRlZmF1bHQgdGFyZ2V0IG9mIHRoZSBuZXcgcHJvamVjdCBpcyB1c2VkLjwvcD4KKzxwPkJ5IGRlZmF1bHQsIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBwcm9qZWN0IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBuZXcgcHJvamVjdC4KK0FsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IHRoZSA8dmFyPmluaGVyaXRBbGw8L3Zhcj4gYXR0cmlidXRlIHRvIDxxPmZhbHNlPC9xPiBhbmQgb25seQorJnF1b3Q7dXNlciZxdW90OyBwcm9wZXJ0aWVzIChpLmUuLCB0aG9zZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG5ldworcHJvamVjdC4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2V0IG9mIHByb3BlcnRpZXMgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdCB3aWxsIG92ZXJyaWRlIHRoZQorcHJvcGVydGllcyB0aGF0IGFyZSBzZXQgaW4gdGhlIG5ldyBwcm9qZWN0IChTZWUgYWxzbyB0aGUgPGEgaHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHk8L2E+Cit0YXNrKS48L3A+CiAKLTxwPllvdSBjYW4gYWxzbyBzZXQgcHJvcGVydGllcyBpbiB0aGUgbmV3IHByb2plY3QgZnJvbSB0aGUgb2xkIHByb2plY3QKLWJ5IHVzaW5nIG5lc3RlZCBwcm9wZXJ0eSB0YWdzLiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSBhbHdheXMgcGFzc2VkCi10byB0aGUgbmV3IHByb2plY3QgYW5kIGFueSBwcm9qZWN0IGNyZWF0ZWQgaW4gdGhhdCBwcm9qZWN0Ci1yZWdhcmRsZXNzIG9mIHRoZSBzZXR0aW5nIG9mIDxpPmluaGVyaXRBbGw8L2k+LiAgVGhpcyBhbGxvd3MgeW91IHRvCi1wYXJhbWV0ZXJpemUgeW91ciBzdWJwcm9qZWN0cy48L3A+Cis8cD5Zb3UgY2FuIGFsc28gc2V0IHByb3BlcnRpZXMgaW4gdGhlIG5ldyBwcm9qZWN0IGZyb20gdGhlIG9sZCBwcm9qZWN0IGJ5IHVzaW5nCituZXN0ZWQgPGNvZGU+cHJvcGVydHk8L2NvZGU+IHRhZ3MuIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0IGFuZCBhbnkKK3Byb2plY3QgY3JlYXRlZCBpbiB0aGF0IHByb2plY3QgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiA8dmFyPmluaGVyaXRBbGw8L3Zhcj4uICBUaGlzIGFsbG93cyB5b3UKK3RvIHBhcmFtZXRlcml6ZSB5b3VyIHN1YnByb2plY3RzLjwvcD4KIAotPHA+V2hlbiBtb3JlIHRoYW4gb25lIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50Ci0gIHdvdWxkIHNldCBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUsIHRoZSBvbmUgZGVjbGFyZWQgbGFzdCB3aWxsCi0gIHdpbi4gIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMgZXZlbiBzbyBpdCBpcwotICBkaWZmZXJlbnQgZnJvbSB0aGUgd2F5IDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IHRhc2tzIGluIGJ1aWxkCi0gIGZpbGVzIGJlaGF2ZS48L3A+Cis8cD5XaGVuIG1vcmUgdGhhbiBvbmUgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQgd291bGQgc2V0IGEgcHJvcGVydHkgb2YgdGhlIHNhbWUKK25hbWUsIHRoZSBvbmUgZGVjbGFyZWQgbGFzdCB3aWxsIHdpbi4gIFRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMgZXZlbiB0aG91Z2ggaXQgaXMKK2RpZmZlcmVudCBmcm9tIHRoZSB3YXkgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFza3MgaW4gYnVpbGQgZmlsZXMgYmVoYXZlLjwvcD4KIAogPHA+UHJvcGVydGllcyBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2Fubm90IGJlIG92ZXJyaWRkZW4gYnkKLSAgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzLiAgPGVtPlNpbmNlIEFudAotICAxLjguMC48L2VtPiB0aGUgc2FtZSBpcyB0cnVlIGZvciBuZXN0ZWQgc3RydWN0dXJlcwotICBvZiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFza3M6IGlmIGEgYnVpbGQgZmlsZSA8ZW0+QTwvZW0+Ci0gIGludm9rZXMgPGVtPkI8L2VtPiB2aWEgYW4gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2sgc2V0dGluZyBhCi0gIHByb3BlcnR5IHdpdGggYSBuZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudAotICBhbmQgPGVtPkI8L2VtPiBjb250YWlucyBhbiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFza3MKLSAgaW52b2tpbmcgPGVtPkM8L2VtPiwgPGVtPkM8L2VtPiB3aWxsIHNlZSB0aGUgdmFsdWUgc2V0Ci0gIGluIDxlbT5BPC9lbT4sIGV2ZW4gaWYgPGVtPkI8L2VtPiB1c2VkIGEKLSAgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQgYXMgd2VsbC48L3A+CituZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudHMuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4sIHRoZSBzYW1lIGlzIHRydWUgZm9yCituZXN0ZWQgc3RydWN0dXJlcyBvZiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFza3M6IGlmIGEgYnVpbGQgZmlsZSA8dmFyPkE8L3Zhcj4KK2ludm9rZXMgPHZhcj5CPC92YXI+IHZpYSBhbiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayBzZXR0aW5nIGEgcHJvcGVydHkgd2l0aCBhCituZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudCBhbmQgPHZhcj5CPC92YXI+IGNvbnRhaW5zIGFuIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPgordGFza3MgaW52b2tpbmcgPHZhcj5DPC92YXI+LCA8dmFyPkM8L3Zhcj4gd2lsbCBzZWUgdGhlIHZhbHVlIHNldCBpbiA8dmFyPkE8L3Zhcj4sIGV2ZW4KK2lmIDx2YXI+QjwvdmFyPiB1c2VkIGEgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQgYXMgd2VsbC48L3A+CiAKLTxwPlJlZmVyZW5jZXMgdG8gZGF0YSB0eXBlcyBjYW4gYWxzbyBiZSBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0LCBidXQKLWJ5IGRlZmF1bHQgdGhleSBhcmUgbm90LiAgSWYgeW91IHNldCB0aGUgaW5oZXJpdHJlZnMgYXR0cmlidXRlIHRvCi10cnVlLCBhbGwgcmVmZXJlbmNlcyB3aWxsIGJlIGNvcGllZCwgYnV0IHRoZXkgd2lsbCBub3Qgb3ZlcnJpZGUKLXJlZmVyZW5jZXMgZGVmaW5lZCBpbiB0aGUgbmV3IHByb2plY3QuPC9wPgorPHA+UmVmZXJlbmNlcyB0byBkYXRhIHR5cGVzIGNhbiBhbHNvIGJlIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3QsIGJ1dCBieSBkZWZhdWx0IHRoZXkgYXJlIG5vdC4gIElmCit5b3Ugc2V0IHRoZSA8dmFyPmluaGVyaXRyZWZzPC92YXI+IGF0dHJpYnV0ZSB0byA8cT50cnVlPC9xPiwgYWxsIHJlZmVyZW5jZXMgd2lsbCBiZSBjb3BpZWQsIGJ1dCB0aGV5Cit3aWxsIG5vdCBvdmVycmlkZSByZWZlcmVuY2VzIGRlZmluZWQgaW4gdGhlIG5ldyBwcm9qZWN0LjwvcD4KIAotPHA+TmVzdGVkIDxhIGhyZWY9IiNyZWZlcmVuY2UiPjxpPjxjb2RlPiZsdDtyZWZlcmVuY2UmZ3Q7PC9jb2RlPjwvaT48L2E+IGVsZW1lbnRzCi1jYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkgcmVmZXJlbmNlcyBmcm9tIHRoZSBjYWxsaW5nIHByb2plY3QgdG8gdGhlCi1uZXcgcHJvamVjdCwgb3B0aW9uYWxseSB1bmRlciBhIGRpZmZlcmVudCBpZC4gIFJlZmVyZW5jZXMgdGFrZW4gZnJvbQotbmVzdGVkIGVsZW1lbnRzIHdpbGwgb3ZlcnJpZGUgZXhpc3RpbmcgcmVmZXJlbmNlcyB0aGF0IGhhdmUgYmVlbgotZGVmaW5lZCBvdXRzaWRlIG9mIHRhcmdldHMgaW4gdGhlIG5ldyBwcm9qZWN0IC0gYnV0IG5vdCB0aG9zZSBkZWZpbmVkCi1pbnNpZGUgb2YgdGFyZ2V0cy48L3A+Cis8cD5OZXN0ZWQgPGEgaHJlZj0iI3JlZmVyZW5jZSI+PGNvZGU+Jmx0O3JlZmVyZW5jZSZndDs8L2NvZGU+PC9hPiBlbGVtZW50cyBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvcHkKK3JlZmVyZW5jZXMgZnJvbSB0aGUgY2FsbGluZyBwcm9qZWN0IHRvIHRoZSBuZXcgcHJvamVjdCwgb3B0aW9uYWxseSB1bmRlciBhIGRpZmZlcmVudCA8dmFyPmlkPC92YXI+LgorUmVmZXJlbmNlcyB0YWtlbiBmcm9tIG5lc3RlZCBlbGVtZW50cyB3aWxsIG92ZXJyaWRlIGV4aXN0aW5nIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZAorb3V0c2lkZSBvZiB0YXJnZXRzIGluIHRoZSBuZXcgcHJvamVjdCZtZGFzaDtidXQgbm90IHRob3NlIGRlZmluZWQgaW5zaWRlIG9mIHRhcmdldHMuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFudGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGJ1aWxkZmlsZSB0byB1c2UuIERlZmF1bHRzIHRvCi0gICAgICAmcXVvdDtidWlsZC54bWwmcXVvdDsuICBUaGlzIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlbmFtZQotICAgICAgcmVsYXRpdmUgdG8gdGhlIGRpciBhdHRyaWJ1dGUgZ2l2ZW4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YW50ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBidWlsZGZpbGUgdG8gdXNlLiBUaGlzIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgYSBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgPHZhcj5kaXI8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSBnaXZlbi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+YnVpbGQueG1sPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRvIHVzZSBhcyBhIGJhc2VkaXIgZm9yIHRoZSBuZXcgQW50Ci0gICAgICBwcm9qZWN0ICh1bmxlc3MgdXNlTmF0aXZlQmFzZWRpciBpcyBzZXQgdG8gdHJ1ZSkuCi0gICAgICBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBwcm9qZWN0J3MgYmFzZWRpciwgdW5sZXNzCi0gICAgICBpbmhlcml0YWxsIGhhcyBiZWVuIHNldCB0byBmYWxzZSwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0Ci0gICAgICBoYXZlIGEgZGVmYXVsdCB2YWx1ZS4gIFRoaXMgd2lsbCBvdmVycmlkZSB0aGUgYmFzZWRpcgotICAgICAgc2V0dGluZyBvZiB0aGUgY2FsbGVkIHByb2plY3QuPGJyLz4KLSAgICAgIEFsc28gc2VydmVzIGFzIHRoZSBkaXJlY3RvcnkgdG8gcmVzb2x2ZSB0aGUgYW50ZmlsZSBhbmQgb3V0cHV0Ci0gICAgICBhdHRyaWJ1dGUncyB2YWx1ZXMgKGlmIGFueSkuCisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgdG8gdXNlIGFzIGEgPHZhcj5iYXNlZGlyPC92YXI+IGZvciB0aGUgbmV3IEFudCBwcm9qZWN0CisgICAgICAodW5sZXNzIDx2YXI+dXNlTmF0aXZlQmFzZWRpcjwvdmFyPiBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4pLiAgVGhpcyB3aWxsIG92ZXJyaWRlCisgICAgICB0aGUgPHZhcj5iYXNlZGlyPC92YXI+IHNldHRpbmcgb2YgdGhlIGNhbGxlZCBwcm9qZWN0Ljxici8+ICBBbHNvIHNlcnZlcyBhcyB0aGUgZGlyZWN0b3J5IHRvCisgICAgICByZXNvbHZlIHRoZSA8dmFyPmFudGZpbGU8L3Zhcj4gYW5kIDx2YXI+b3V0cHV0PC92YXI+IGF0dHJpYnV0ZSdzIHZhbHVlcyAoaWYgYW55KS4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPiwgdW5sZXNzIDx2YXI+aW5oZXJpdGFsbDwvdmFyPiBoYXMKKyAgICAgIGJlZW4gc2V0IHRvIDxxPmZhbHNlPC9xPiwgaW4gd2hpY2ggY2FzZSBpdCBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IHZhbHVlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB0YXJnZXQgb2YgdGhlIG5ldyBBbnQgcHJvamVjdCB0aGF0IHNob3VsZCBiZSBleGVjdXRlZC4KLSAgICAgIERlZmF1bHRzIHRvIHRoZSBuZXcgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRhcmdldDwvdGQ+CisgICAgPHRkPnRoZSB0YXJnZXQgb2YgdGhlIG5ldyBBbnQgcHJvamVjdCB0aGF0IHNob3VsZCBiZSBleGVjdXRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIG5ldyBwcm9qZWN0J3MgZGVmYXVsdCB0YXJnZXQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsZW5hbWUgdG8gd3JpdGUgdGhlIGFudCBvdXRwdXQgdG8uICBUaGlzIGlzCi0gICAgcmVsYXRpdmUgdG8gdGhlIHZhbHVlIG9mIHRoZSBkaXIgYXR0cmlidXRlIGlmIGl0IGhhcyBiZWVuIHNldCBvcgotICAgIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBwcm9qZWN0IG90aGVyd2lzZS4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+RmlsZW5hbWUgdG8gd3JpdGUgdGhlIEFudCBvdXRwdXQgdG8uICBUaGlzIGlzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZSBvZiB0aGUgPHZhcj5kaXI8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSBpZiBpdCBoYXMgYmVlbiBzZXQgb3IgdG8gdGhlIDx2YXI+YmFzZWRpcjwvdmFyPiBvZiB0aGUgY3VycmVudCBwcm9qZWN0IG90aGVyd2lzZS4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluaGVyaXRBbGw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlCi0gICAgICBuZXcgQW50IHByb2plY3QuICBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbmhlcml0QWxsPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBbnQgcHJvamVjdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmhlcml0UmVmczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiA8Y29kZT50cnVlPC9jb2RlPiwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgIG5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbmhlcml0UmVmczwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+LCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZU5hdGl2ZUJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc2V0IHRvIHRydWUsIHRoZSBjaGlsZCBidWlsZCB3aWxsIHVzZSB0aGUgc2FtZQotICAgICAgYmFzZWRpciBhcyBpdCB3b3VsZCBoYXZlIHVzZWQgd2hlbiBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0gICAgICAoaS5lLiB0aGUgYmFzZWRpciBvbmUgd291bGQgZXhwZWN0IHdoZW4gbG9va2luZyBhdCB0aGUgY2hpbGQKLSAgICAgIGJ1aWxkJ3MgYnVpbGRmaWxlKS4gIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gIDxlbT5zaW5jZQotICAgICAgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51c2VOYXRpdmVCYXNlZGlyPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCB0aGUgY2hpbGQgYnVpbGQgd2lsbCB1c2UgdGhlIHNhbWUgPHZhcj5iYXNlZGlyPC92YXI+IGFzIGl0IHdvdWxkIGhhdmUKKyAgICAgIHVzZWQgd2hlbiBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIChpLmUuIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gb25lIHdvdWxkIGV4cGVjdCB3aGVuIGxvb2tpbmcKKyAgICAgIGF0IHRoZSBjaGlsZCBidWlsZCdzIGJ1aWxkZmlsZSkuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+cHJvcGVydHk8L2g0PgotPHA+U2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPGEgaHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHkKLXRhc2s8L2E+LiA8YnI+Ci1UaGVzZSBwcm9wZXJ0aWVzIGJlY29tZSBlcXVpdmFsZW50IHRvIHByb3BlcnRpZXMgeW91IGRlZmluZSBvbgotdGhlIGNvbW1hbmQgbGluZS4gVGhlc2UgYXJlIHNwZWNpYWwgcHJvcGVydGllcyBhbmQgdGhleSB3aWxsIGFsd2F5cyBnZXQgcGFzc2VkCi1kb3duLCBldmVuIHRocm91Z2ggYWRkaXRpb25hbCA8Y29kZT4mbHQ7KmFudComZ3Q7PC9jb2RlPiB0YXNrcyB3aXRoIGluaGVyaXRhbGwgc2V0IHRvCi1mYWxzZSAoc2VlIGFib3ZlKS4gPGJyPgotTm90ZSB0aGF0IHRoZSA8Y29kZT5yZWZpZDwvY29kZT4gYXR0cmlidXRlIHBvaW50cyB0byBhCi1yZWZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgcHJvamVjdCwgbm90IGluIHRoZSBuZXcgb25lLjwvcD4KKzxwPlNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPiB0YXNrLjxici8+ICBUaGVzZSBwcm9wZXJ0aWVzCitiZWNvbWUgZXF1aXZhbGVudCB0byBwcm9wZXJ0aWVzIHlvdSBkZWZpbmUgb24gdGhlIGNvbW1hbmQgbGluZS4gVGhlc2UgYXJlIHNwZWNpYWwgcHJvcGVydGllcyBhbmQKK3RoZXkgd2lsbCBhbHdheXMgZ2V0IHBhc3NlZCBkb3duLCBldmVuIHRocm91Z2ggYWRkaXRpb25hbCA8Y29kZT4mbHQ7KmFudComZ3Q7PC9jb2RlPiB0YXNrcword2l0aCA8dmFyPmluaGVyaXRBbGw8L3Zhcj4gc2V0IHRvIDxxPmZhbHNlPC9xPiAoc2VlIGFib3ZlKS48YnIvPiAgTm90ZSB0aGF0IHRoZSA8dmFyPnJlZmlkPC92YXI+CithdHRyaWJ1dGUgcG9pbnRzIHRvIGEgcmVmZXJlbmNlIGluIHRoZSBjYWxsaW5nIHByb2plY3QsIG5vdCBpbiB0aGUgbmV3IG9uZS48L3A+CiAKLTxoND48YSBuYW1lPSJyZWZlcmVuY2UiPnJlZmVyZW5jZTwvYT48L2g0PgotPHA+VXNlZCB0byBjaG9vc2UgcmVmZXJlbmNlcyB0aGF0IHNoYWxsIGJlIGNvcGllZCBpbnRvIHRoZSBuZXcgcHJvamVjdCwKLW9wdGlvbmFsbHkgY2hhbmdpbmcgdGhlaXIgaWQuPC9wPgorPGg0IGlkPSJyZWZlcmVuY2UiPnJlZmVyZW5jZTwvaDQ+Cis8cD5Vc2VkIHRvIGNob29zZSByZWZlcmVuY2VzIHRoYXQgc2hhbGwgYmUgY29waWVkIGludG8gdGhlIG5ldyBwcm9qZWN0LCBvcHRpb25hbGx5IGNoYW5naW5nCit0aGVpciA8dmFyPmlkPC92YXI+LjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWZpZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaWQgb2YgdGhlIHJlZmVyZW5jZSBpbiB0aGUgY2FsbGluZyBwcm9qZWN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5yZWZpZDwvdGQ+CisgICAgPHRkPlRoZSA8dmFyPmlkPC92YXI+IG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgcHJvamVjdC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b3JlZmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpZCBvZiB0aGUgcmVmZXJlbmNlIGluIHRoZSBuZXcgcHJvamVjdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiByZWZpZC48L3RkPgorICAgIDx0ZD50b3JlZmlkPC90ZD4KKyAgICA8dGQ+VGhlIDx2YXI+aWQ8L3Zhcj4gb2YgdGhlIHJlZmVyZW5jZSBpbiB0aGUgbmV3IHByb2plY3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiA8dmFyPnJlZmlkPC92YXI+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5wcm9wZXJ0eXNldDwvaDQ+CiAKLTxwPllvdSBjYW4gc3BlY2lmeSBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBuZXcKLXByb2plY3Qgd2l0aCA8YQotaHJlZj0iLi4vVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+cHJvcGVydHlzZXQ8L2E+cy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvcD4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+Cis8cD5Zb3UgY2FuIHNwZWNpZnkgYSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSBjb3BpZWQgaW50byB0aGUgbmV3IHByb2plY3QKK3dpdGggPGEgaHJlZj0iLi4vVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+cHJvcGVydHlzZXQ8L2E+cy48L3A+CiAKIDxoND50YXJnZXQ8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+LjwvcD4KIAotPHA+WW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHRhcmdldHMgdXNpbmcgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cwotaW5zdGVhZCBvZiB1c2luZyB0aGUgdGFyZ2V0IGF0dHJpYnV0ZS4gIFRoZXNlIHdpbGwgYmUgZXhlY3V0ZWQgYXMgaWYKLUFudCBoYWQgYmVlbiBpbnZva2VkIHdpdGggYSBzaW5nbGUgdGFyZ2V0IHdob3NlIGRlcGVuZGVuY2llcyBhcmUgdGhlCi10YXJnZXRzIHNvIHNwZWNpZmllZCwgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHA+WW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHRhcmdldHMgdXNpbmcgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbnN0ZWFkIG9mCit1c2luZyB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gYXR0cmlidXRlLiAgVGhlc2Ugd2lsbCBiZSBleGVjdXRlZCBhcyBpZiBBbnQgaGFkIGJlZW4gaW52b2tlZCB3aXRoIGEKK3NpbmdsZSB0YXJnZXQgd2hvc2UgZGVwZW5kZW5jaWVzIGFyZSB0aGUgdGFyZ2V0cyBzbyBzcGVjaWZpZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGNhbGxlZCB0YXJnZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxwPjxlbT5zaW5jZSBBbnQgMS42LjM8L2VtPi48L3A+CiAKIDxoMz5CYXNlZGlyIG9mIHRoZSBuZXcgcHJvamVjdDwvaDM+CiAKLTxwPklmIHlvdSBzZXQgPGNvZGU+dXNlTmF0aXZlQmFzZWRpcjwvY29kZT4gdG8gdHJ1ZSwgdGhlIGJhc2VkaXIgb2YKLSAgdGhlIG5ldyBwcm9qZWN0IHdpbGwgYmUgd2hhdGV2ZXIgdGhlIGJhc2VkaXIgYXR0cmlidXRlIG9mCi0gIHRoZSA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIG5ldyBwcm9qZWN0IHNheXMgKG9yCi0gIHRoZSBuZXcgcHJvamVjdCdzIGRpcmVjdG9yeSBpZiB0aGUgdGhlcmUgaXMgbm8gYmFzZWRpciBhdHRyaWJ1dGUpIC0KLSAgbm8gbWF0dGVyIHdoYXQgYW55IG90aGVyIGF0dHJpYnV0ZSBvZiB0aGlzIHRhc2sgc2F5cyBhbmQgbm8gbWF0dGVyCi0gIGhvdyBkZWVwbHkgbmVzdGVkIGludG8gbGV2ZWxzIG9mCi0gIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiBpbnZvY2F0aW9ucyB0aGlzIHRhc2sgbGl2ZXMuPC9wPgotIAotPHA+SWYgeW91IGhhdmVuJ3Qgc2V0IDxjb2RlPnVzZU5hdGl2ZUJhc2VkaXI8L2NvZGU+IG9yIHNldCBpdCB0bwotICBmYWxzZSwgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseTo8L3A+Cis8cD5JZiB5b3Ugc2V0IDx2YXI+dXNlTmF0aXZlQmFzZWRpcjwvdmFyPiB0byB0cnVlLCB0aGUgPHZhcj5iYXNlZGlyPC92YXI+IG9mIHRoZSBuZXcgcHJvamVjdCB3aWxsIGJlCit3aGF0ZXZlciB0aGUgPHZhcj5iYXNlZGlyPC92YXI+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiBlbGVtZW50IG9mIHRoZSBuZXcKK3Byb2plY3Qgc2F5cyAob3IgdGhlIG5ldyBwcm9qZWN0J3MgZGlyZWN0b3J5IGlmIHRoZSB0aGVyZSBpcyBubyA8dmFyPmJhc2VkaXI8L3Zhcj4KK2F0dHJpYnV0ZSkmbWRhc2g7bm8gbWF0dGVyIHdoYXQgYW55IG90aGVyIGF0dHJpYnV0ZSBvZiB0aGlzIHRhc2sgc2F5cyBhbmQgbm8gbWF0dGVyIGhvdyBkZWVwbHkKK25lc3RlZCBpbnRvIGxldmVscyBvZiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gaW52b2NhdGlvbnMgdGhpcyB0YXNrIGxpdmVzLjwvcD4KIAotPHA+VGhlIGJhc2VkaXIgdmFsdWUgb2YgdGhlIG5ldyBwcm9qZWN0IGlzIGFmZmVjdGVkIGJ5IHRoZSB0d28KLSAgYXR0cmlidXRlcyBkaXIgYW5kIGluaGVyaXRhbGwgYXMgd2VsbCBhcwotICB0aGUgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2sncyBoaXN0b3J5LiAgVGhlIGN1cnJlbnQgYmVoYXZpb3VyCi0gIGlzIGtub3duIHRvIGJlIGNvbmZ1c2luZyBidXQgY2Fubm90IGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZwotICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBpbiBzdWJ0bGUgd2F5cy48L3A+Cis8cD5JZiB5b3UgaGF2ZW4ndCBzZXQgPHZhcj51c2VOYXRpdmVCYXNlZGlyPC92YXI+IG9yIHNldCBpdCB0byA8cT5mYWxzZTwvcT4sIHRoZSBmb2xsb3dpbmcgcnVsZXMKK2FwcGx5OjwvcD4KIAotPHA+SWYgdGhlIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrIGlzIGluIGEgInRvcCBsZXZlbCIgYnVpbGQKLSAgZmlsZSwgaS5lLiB0aGUgcHJvamVjdCBjb250YWluaW5nIHRoZSA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzawotICBoYXMgbm90IGl0c2VsZiBiZWVuIGludm9rZWQgYXMgcGFydCBvZiBhCi0gIGRpZmZlcmVudCA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gKG9yIDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4pCi0gIHRhc2sgImhpZ2hlciB1cCIsIHRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIGRldGFpbHM6PC9wPgorPHA+VGhlIDx2YXI+YmFzZWRpcjwvdmFyPiB2YWx1ZSBvZiB0aGUgbmV3IHByb2plY3QgaXMgYWZmZWN0ZWQgYnkgdGhlIHR3byBhdHRyaWJ1dGVzLCA8dmFyPmRpcjwvdmFyPgorYW5kIDx2YXI+aW5oZXJpdGFsbDwvdmFyPiwgYXMgd2VsbCBhcyB0aGUgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2sncyBoaXN0b3J5LiAgVGhlIGN1cnJlbnQKK2JlaGF2aW91ciBpcyBrbm93biB0byBiZSBjb25mdXNpbmcgYnV0IGNhbm5vdCBiZSBjaGFuZ2VkIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaW4KK3N1YnRsZSB3YXlzLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPklmIHRoZSA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayBpcyBpbiBhICJ0b3AgbGV2ZWwiIGJ1aWxkIGZpbGUsIGkuZS4gdGhlIHByb2plY3QgY29udGFpbmluZwordGhlIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrIGhhcyBub3QgaXRzZWxmIGJlZW4gaW52b2tlZCBhcyBwYXJ0IG9mIGEKK2RpZmZlcmVudCA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gKG9yIDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4pIHRhc2sgImhpZ2hlciB1cCIsIHRoZSBmb2xsb3dpbmcKK3RhYmxlIHNob3dzIHRoZSBkZXRhaWxzOjwvcD4KKworPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5kaXIgYXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5pbmhlcml0QWxsIGF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+bmV3IHByb2plY3QncyBiYXNlZGlyPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPjx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPjx2YXI+aW5oZXJpdEFsbDwvdmFyPiBhdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5uZXcgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPjwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlIHByb3ZpZGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgZGlyIGF0dHJpYnV0ZTwvdGQ+CisgICAgPHRkPnZhbHVlIHByb3ZpZGVkPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT48L3RkPgorICAgIDx0ZD52YWx1ZSBvZiA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSBwcm92aWRlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWxzZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSBvZiBkaXIgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+dmFsdWUgcHJvdmlkZWQ8L3RkPgorICAgIDx0ZD48cT5mYWxzZTwvcT48L3RkPgorICAgIDx0ZD52YWx1ZSBvZiA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbWl0dGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpciBvZiBjYWxsaW5nIHByb2plY3QgKHRoZSBvbmUgd2hvc2UgYnVpbGQKLSAgICAgICAgZmlsZSBjb250YWlucyB0aGUgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2spLjwvdGQ+CisgICAgPHRkPm9taXR0ZWQ8L3RkPgorICAgIDx0ZD48cT50cnVlPC9xPjwvdGQ+CisgICAgPHRkPjx2YXI+YmFzZWRpcjwvdmFyPiBvZiBjYWxsaW5nIHByb2plY3QgKHRoZSBvbmUgd2hvc2UgYnVpbGQKKyAgICAgIGZpbGUgY29udGFpbnMgdGhlIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrKS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbWl0dGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXIgYXR0cmlidXRlIG9mIHRoZSA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+IGVsZW1lbnQKLSAgICAgICAgb2YgdGhlIG5ldyBwcm9qZWN0PC90ZD4KKyAgICA8dGQ+b21pdHRlZDwvdGQ+CisgICAgPHRkPjxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPjx2YXI+YmFzZWRpcjwvdmFyPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudAorICAgICAgb2YgdGhlIG5ldyBwcm9qZWN0PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPklmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayBpcyBhbHJlYWR5Ci0gIG5lc3RlZCBpbnRvIGFub3RoZXIgaW52b2NhdGlvbiwgdGhlIHBhcmVudCBpbnZvY2F0aW9uJ3Mgc2V0dGluZ3MKLSAgYWZmZWN0IHRoZSBvdXRjb21lIG9mIHRoZSBiYXNlZGlyIHZhbHVlLiAgVGhlIGN1cnJlbnQgdGFzaydzIGRpcgotICBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgd2luLCBidXQgaWYgdGhlIGRpciBhdHRyaWJ1dGUgaGFzIGJlZW4gb21pdHRlZAotICBhbiBldmVuIG1vcmUgY29tcGxleCBzaXR1YXRpb24gYXJpc2VzOjwvcD4KKzxwPklmIG9uIHRoZSBvdGhlciBoYW5kIHRoZSA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzayBpcyBhbHJlYWR5IG5lc3RlZCBpbnRvIGFub3RoZXIgaW52b2NhdGlvbiwKK3RoZSBwYXJlbnQgaW52b2NhdGlvbidzIHNldHRpbmdzIGFmZmVjdCB0aGUgb3V0Y29tZSBvZiB0aGUgPHZhcj5iYXNlZGlyPC92YXI+IHZhbHVlLiAgVGhlIGN1cnJlbnQKK3Rhc2sncyA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUgd2lsbCBhbHdheXMgd2luLCBidXQgaWYgdGhlIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSBoYXMgYmVlbgorb21pdHRlZCBhbiBldmVuIG1vcmUgY29tcGxleCBzaXR1YXRpb24gYXJpc2VzOjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+cGFyZW50IGRpciBhdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPnBhcmVudCBpbmhlcml0QWxsIGF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+Y3VycmVudCBpbmhlcml0QWxsIGF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+bmV3IHByb2plY3QncyBiYXNlZGlyPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPnBhcmVudCA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5wYXJlbnQgPHZhcj5pbmhlcml0QWxsPC92YXI+IGF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPmN1cnJlbnQgPHZhcj5pbmhlcml0QWxsPC92YXI+IGF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPm5ldyBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+PC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgcHJvdmlkZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YW55PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFueTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSBvZiBwYXJlbnQncyBkaXIgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+dmFsdWUgcHJvdmlkZWQ8L3RkPgorICAgIDx0ZD5hbnk8L3RkPgorICAgIDx0ZD5hbnk8L3RkPgorICAgIDx0ZD52YWx1ZSBvZiBwYXJlbnQncyA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbWl0dGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyIG9mIHBhcmVudCBwcm9qZWN0ICh0aGUgb25lIHdob3NlIGJ1aWxkCi0gICAgICAgIGZpbGUgY2FsbGVkIHRoZSBidWlsZCBmaWxlIHRoYXQgY29udGFpbnMKLSAgICAgICAgdGhlIGN1cnJlbnQgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2spLjwvdGQ+CisgICAgPHRkPm9taXR0ZWQ8L3RkPgorICAgIDx0ZD48cT50cnVlPC9xPjwvdGQ+CisgICAgPHRkPjxxPnRydWU8L3E+PC90ZD4KKyAgICA8dGQ+PHZhcj5iYXNlZGlyPC92YXI+IG9mIHBhcmVudCBwcm9qZWN0ICh0aGUgb25lIHdob3NlIGJ1aWxkIGZpbGUgY2FsbGVkIHRoZSBidWlsZCBmaWxlIHRoYXQKKyAgICAgIGNvbnRhaW5zIHRoZSBjdXJyZW50IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrKS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbWl0dGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFsc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpciBvZiBwYXJlbnQgcHJvamVjdCAodGhlIG9uZSB3aG9zZSBidWlsZAotICAgICAgICBmaWxlIGNhbGxlZCB0aGUgYnVpbGQgZmlsZSB0aGF0IGNvbnRhaW5zCi0gICAgICAgIHRoZSBjdXJyZW50IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrKS48L3RkPgorICAgIDx0ZD5vbWl0dGVkPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT48L3RkPgorICAgIDx0ZD48cT5mYWxzZTwvcT48L3RkPgorICAgIDx0ZD48dmFyPmJhc2VkaXI8L3Zhcj4gb2YgcGFyZW50IHByb2plY3QgKHRoZSBvbmUgd2hvc2UgYnVpbGQgZmlsZSBjYWxsZWQgdGhlIGJ1aWxkIGZpbGUgdGhhdAorICAgICAgY29udGFpbnMgdGhlIGN1cnJlbnQgPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+IHRhc2spLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9taXR0ZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFsc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyIG9mIGNhbGxpbmcgcHJvamVjdCAodGhlIG9uZSB3aG9zZSBidWlsZAotICAgICAgICBmaWxlIGNvbnRhaW5zIHRoZSBjdXJyZW50IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrKS48L3RkPgorICAgIDx0ZD5vbWl0dGVkPC90ZD4KKyAgICA8dGQ+PHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT48L3RkPgorICAgIDx0ZD48dmFyPmJhc2VkaXI8L3Zhcj4gb2YgY2FsbGluZyBwcm9qZWN0ICh0aGUgb25lIHdob3NlIGJ1aWxkIGZpbGUgY29udGFpbnMgdGhlCisgICAgICBjdXJyZW50IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrKS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbWl0dGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXIgYXR0cmlidXRlIG9mIHRoZSA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+IGVsZW1lbnQKLSAgICAgICAgb2YgdGhlIG5ldyBwcm9qZWN0PC90ZD4KKyAgICA8dGQ+b21pdHRlZDwvdGQ+CisgICAgPHRkPjxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPjxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPjx2YXI+YmFzZWRpcjwvdmFyPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudCBvZiB0aGUgbmV3CisgICAgICBwcm9qZWN0PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPklmIHlvdSBhZGQgZXZlbiBkZWVwZXIgbGV2ZWxzIG9mIG5lc3RpbmcsIHRoaW5ncyBnZXQgZXZlbiBtb3JlCi0gIGNvbXBsaWNhdGVkIGFuZCB5b3UgbmVlZCB0byBhcHBseSB0aGUgYWJvdmUgdGFibGUgcmVjdXJzaXZlbHkuPC9wPgorPHA+SWYgeW91IGFkZCBldmVuIGRlZXBlciBsZXZlbHMgb2YgbmVzdGluZywgdGhpbmdzIGdldCBldmVuIG1vcmUgY29tcGxpY2F0ZWQgYW5kIHlvdSBuZWVkIHRvIGFwcGx5Cit0aGUgYWJvdmUgdGFibGUgcmVjdXJzaXZlbHkuPC9wPgogCi08cD5JZiB0aGUgYmFzZWRpciBvZiB0aGUgb3V0ZXIgbW9zdCBidWlsZCBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYQotICBwcm9wZXJ0eSBvbiB0aGUgY29tbWFuZCBsaW5lIChpLmUuIDxjb2RlPi1EYmFzZWRpcj1zb21lLXZhbHVlPC9jb2RlPgotICBvciBhIDxjb2RlPi1wcm9wZXJ0eWZpbGU8L2NvZGU+IGFyZ3VtZW50KSB0aGUgdmFsdWUgcHJvdmlkZWQgd2lsbAotICBnZXQgYW4gZXZlbiBoaWdoZXIgcHJpb3JpdHkuICBGb3IgYW55IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrCi0gIHRoYXQgZG9lc24ndCBzcGVjaWZ5IGEgZGlyIGF0dHJpYnV0ZSwgdGhlIG5ldyBwcm9qZWN0J3MgYmFzZWRpciB3aWxsCi0gIGJlIHRoZSB2YWx1ZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSAtIG5vIG1hdHRlciBob3cgZGVlcGx5Ci0gIG5lc3RlZCBpbnRvIGxheWVycyBvZiBidWlsZCBmaWxlcyB0aGUgdGFzayBtYXkgYmUuPC9wPgorPHA+SWYgdGhlIDx2YXI+YmFzZWRpcjwvdmFyPiBvZiB0aGUgb3V0ZXJtb3N0IGJ1aWxkIGhhcyBiZWVuIHNwZWNpZmllZCBhcyBhIHByb3BlcnR5IG9uIHRoZSBjb21tYW5kCitsaW5lIChpLmUuIDxrYmQ+LURiYXNlZGlyPXNvbWUtdmFsdWU8L2tiZD4gb3IgYSA8a2JkPi1wcm9wZXJ0eWZpbGU8L2tiZD4gYXJndW1lbnQpIHRoZSB2YWx1ZQorcHJvdmlkZWQgd2lsbCBnZXQgYW4gZXZlbiBoaWdoZXIgcHJpb3JpdHkuICBGb3IgYW55IDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrIHRoYXQgZG9lc24ndAorc3BlY2lmeSBhIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSwgdGhlIG5ldyBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+IHdpbGwgYmUgdGhlIHZhbHVlIHNwZWNpZmllZAorb24gdGhlIGNvbW1hbmQgbGluZSZtZGFzaDtubyBtYXR0ZXIgaG93IGRlZXBseSBuZXN0ZWQgaW50byBsYXllcnMgb2YgYnVpbGQgZmlsZXMgdGhlIHRhc2sgbWF5CitiZS48L3A+CiAKLTxwPlRoZSBzYW1lIGhhcHBlbnMgaWYgdGhlIGJhc2VkaXIgaXMgc3BlY2lmaWVkIGFzIGEKLSAgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IG9mIGFuIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPgotICB0YXNrLiAgVGhlIGJhc2VkaXIgb2YgYnVpbGQgZmlsZXMgc3RhcnRlZCBhdCBkZWVwZXIgbGV2ZWxzIHdpbGwgYmUKLSAgc2V0IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGVsZW1lbnQgdW5sZXNzIHRoZQotICBjb3JyZXNwb25kaW5nIEFudCB0YXNrcyBzZXQgdGhlIGRpciBhdHRyaWJ1dGUgZXhwbGljaXRseS48L3A+Cis8cD5UaGUgc2FtZSBoYXBwZW5zIGlmIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gaXMgc3BlY2lmaWVkIGFzIGEgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+CitvZiBhbiA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4gdGFzay4gIFRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gb2YgYnVpbGQgZmlsZXMgc3RhcnRlZCBhdCBkZWVwZXIgbGV2ZWxzCit3aWxsIGJlIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBlbGVtZW50IHVubGVzcyB0aGUgY29ycmVzcG9uZGluZyBBbnQgdGFza3Mgc2V0Cit0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIGV4cGxpY2l0bHkuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZXNlIGFyZSBkaWZmZXJlbnQgd2F5cyBvZiB1c2luZyB0aGUgdGFzazo8L3A+Cis8cHJlPgogJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YnByb2plY3Qvc3ViYnVpbGQueG1sJnF1b3Q7IHRhcmdldD0mcXVvdDtjb21waWxlJnF1b3Q7LyZndDsKIAogJmx0O2FudCBkaXI9JnF1b3Q7c3VicHJvamVjdCZxdW90Oy8mZ3Q7CkBAIC0zNDIsNzIgKzMwNiw1NSBAQAogCiAmbHQ7YW50IGluaGVyaXRBbGw9JnF1b3Q7ZmFsc2UmcXVvdDsgYW50ZmlsZT0mcXVvdDtzdWJwcm9qZWN0L3N1YmJ1aWxkLnhtbCZxdW90OyZndDsKICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7b3V0cHV0LnR5cGUmcXVvdDsgdmFsdWU9JnF1b3Q7aHRtbCZxdW90Oy8mZ3Q7Ci0mbHQ7L2FudCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvYW50Jmd0OzwvcHJlPgogCiA8cD5UaGVzZSBsaW5lcyBpbnZva2UgdGhlIHNhbWUgYnVpbGQgZmlsZTo8L3A+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YjEvc3ViMi9idWlsZC54bWwmcXVvdDsgLyZndDsKLSZsdDthbnQgYW50ZmlsZT0mcXVvdDtzdWIyL2J1aWxkLnhtbCZxdW90OyBkaXI9JnF1b3Q7c3ViMSZxdW90OyAvJmd0OwotJmx0O2FudCBhbnRmaWxlPSZxdW90O2J1aWxkLnhtbCZxdW90OyBkaXI9JnF1b3Q7c3ViMS9zdWIyJnF1b3Q7IC8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8cHJlPgorJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YjEvc3ViMi9idWlsZC54bWwmcXVvdDsvJmd0OworJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YjIvYnVpbGQueG1sJnF1b3Q7IGRpcj0mcXVvdDtzdWIxJnF1b3Q7LyZndDsKKyZsdDthbnQgYW50ZmlsZT0mcXVvdDtidWlsZC54bWwmcXVvdDsgZGlyPSZxdW90O3N1YjEvc3ViMiZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPlRoZSBidWlsZCBmaWxlIG9mIHRoZSBjYWxsaW5nIHByb2plY3QgZGVmaW5lcyBzb21lCi08Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzIGxpa2UgdGhpczo8L3A+Cis8cD5UaGUgYnVpbGQgZmlsZSBvZiB0aGUgY2FsbGluZyBwcm9qZWN0IGRlZmluZXMgc29tZSA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzIGxpa2UKK3RoaXM6PC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwYXRoIGlkPSJwYXRoMSImZ3Q7CiAgICAgLi4uCiAmbHQ7L3BhdGgmZ3Q7CiAmbHQ7cGF0aCBpZD0icGF0aDIiJmd0OwogICAgIC4uLgotJmx0Oy9wYXRoJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9wYXRoJmd0OzwvcHJlPgogCi08cD5hbmQgdGhlIGNhbGxlZCBidWlsZCBmaWxlICg8Y29kZT5zdWJidWlsZC54bWw8L2NvZGU+KSBhbHNvIGRlZmluZXMKLWEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiB3aXRoIHRoZSBpZCA8Y29kZT5wYXRoMTwvY29kZT4sIGJ1dAotPGNvZGU+cGF0aDI8L2NvZGU+IGlzIG5vdCBkZWZpbmVkOjwvcD4KKzxwPmFuZCB0aGUgY2FsbGVkIGJ1aWxkIGZpbGUgKDxzYW1wPnN1YmJ1aWxkLnhtbDwvc2FtcD4pIGFsc28gZGVmaW5lcyBhIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4KK3dpdGggdGhlIDx2YXI+aWQ8L3Zhcj4gPHNhbXA+cGF0aDE8L3NhbXA+LCBidXQgPHNhbXA+cGF0aDI8L3NhbXA+IGlzIG5vdCBkZWZpbmVkOyB0aGVuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgotJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+d2lsbCBub3Qgb3ZlcnJpZGUgPGNvZGU+c3ViYnVpbGQ8L2NvZGU+J3MgZGVmaW5pdGlvbiBvZgotPGNvZGU+cGF0aDE8L2NvZGU+LCBidXQgbWFrZSB0aGUgcGFyZW50J3MgZGVmaW5pdGlvbiBvZgotPGNvZGU+cGF0aDI8L2NvZGU+IGF2YWlsYWJsZSBpbiB0aGUgc3ViYnVpbGQuPC9wPgorPHA+d2lsbCBub3Qgb3ZlcnJpZGUgPHNhbXA+c3ViYnVpbGQ8L3NhbXA+J3MgZGVmaW5pdGlvbiBvZiA8c2FtcD5wYXRoMTwvc2FtcD4sIGJ1dCBtYWtlIHRoZSBwYXJlbnQncworZGVmaW5pdGlvbiBvZiA8c2FtcD5wYXRoMjwvc2FtcD4gYXZhaWxhYmxlIGluIHRoZSA8c2FtcD5zdWJidWlsZDwvc2FtcD4sIHdoZXJlYXM8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDxwPmFzIHdlbGwgYXM8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YW50IGFudGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7IGluaGVyaXRyZWZzPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPndpbGwgbmVpdGhlciBvdmVycmlkZSA8Y29kZT5wYXRoMTwvY29kZT4gbm9yIGNvcHkKLTxjb2RlPnBhdGgyPC9jb2RlPi48L3A+Cis8cD53aWxsIG5laXRoZXIgb3ZlcnJpZGUgPHNhbXA+cGF0aDE8L3NhbXA+IG5vciBjb3B5IDxzYW1wPnBhdGgyPC9zYW1wPiwgd2hpbGU8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDtmYWxzZSZxdW90OyZndDsKICAgJmx0O3JlZmVyZW5jZSByZWZpZD0mcXVvdDtwYXRoMSZxdW90Oy8mZ3Q7Ci0mbHQ7L2FudCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvYW50Jmd0OzwvcHJlPgogCi08cD53aWxsIG92ZXJyaWRlIDxjb2RlPnN1YmJ1aWxkPC9jb2RlPidzIGRlZmluaXRpb24gb2YKLTxjb2RlPnBhdGgxPC9jb2RlPi48L3A+Cis8cD53aWxsIG92ZXJyaWRlIDxzYW1wPnN1YmJ1aWxkPC9zYW1wPidzIGRlZmluaXRpb24gb2YgPHNhbXA+cGF0aDE8L3NhbXA+LCBhbmQ8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2FudCBhbnRmaWxlPSZxdW90O3N1YmJ1aWxkLnhtbCZxdW90OyBpbmhlcml0cmVmcz0mcXVvdDtmYWxzZSZxdW90OyZndDsKICAgJmx0O3JlZmVyZW5jZSByZWZpZD0mcXVvdDtwYXRoMSZxdW90OyB0b3JlZmlkPSZxdW90O3BhdGgyJnF1b3Q7LyZndDsKLSZsdDsvYW50Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9hbnQmZ3Q7PC9wcmU+CiAKLTxwPndpbGwgY29weSB0aGUgcGFyZW50J3MgZGVmaW5pdGlvbiBvZiA8Y29kZT5wYXRoMTwvY29kZT4gaW50byB0aGUKLW5ldyBwcm9qZWN0IHVzaW5nIHRoZSBpZCA8Y29kZT5wYXRoMjwvY29kZT4uPC9wPgotCi0KKzxwPndpbGwgY29weSB0aGUgcGFyZW50J3MgZGVmaW5pdGlvbiBvZiA8c2FtcD5wYXRoMTwvc2FtcD4gaW50byB0aGUgbmV3IHByb2plY3QgdXNpbmcKK3RoZSA8dmFyPmlkPC92YXI+IDxzYW1wPnBhdGgyPC9zYW1wPi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9hbnRjYWxsLmh0bWwgYi9tYW51YWwvVGFza3MvYW50Y2FsbC5odG1sCmluZGV4IDAwY2Y2MTUuLjQ3YzgzMzcgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9hbnRjYWxsLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2FudGNhbGwuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE2NiArMTUsMTQ3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5BbnRDYWxsIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImFudGNhbGwiPkFudENhbGw8L2E+PC9oMj4KKzxoMiBpZD0iYW50Y2FsbCI+QW50Q2FsbDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD5DYWxsIGFub3RoZXIgdGFyZ2V0IHdpdGhpbiB0aGUgc2FtZSBidWlsZGZpbGUgb3B0aW9uYWxseQotc3BlY2lmeWluZyBzb21lIHByb3BlcnRpZXMgKHBhcmFtcyBpbiB0aGlzIGNvbnRleHQpLiAgPHN0cm9uZz5UaGlzCi10YXNrIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIDxjb2RlPnRhcmdldDwvY29kZT4uPC9zdHJvbmc+PC9wPgorPHA+Q2FsbCBhbm90aGVyIHRhcmdldCB3aXRoaW4gdGhlIHNhbWUgYnVpbGRmaWxlIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBzb21lIHByb3BlcnRpZXMgKHBhcmFtcyBpbgordGhpcyBjb250ZXh0KS4gIDxzdHJvbmc+VGhpcyB0YXNrIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBhIDxjb2RlPnRhcmdldDwvY29kZT4uPC9zdHJvbmc+PC9wPgogCi08cD5CeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlCi1hdmFpbGFibGUgaW4gdGhlIG5ldyBwcm9qZWN0LiAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4KLXNldCB0aGUgPGk+aW5oZXJpdEFsbDwvaT4gYXR0cmlidXRlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgb25seQotJnF1b3Q7dXNlciZxdW90OyBwcm9wZXJ0aWVzIChpLmUuLCB0aG9zZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQtbGluZSkKLXdpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXcgcHJvamVjdC4gIEluIGVpdGhlciBjYXNlLCB0aGUgc2V0IG9mCi1wcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3Qgd2lsbCBvdmVycmlkZSB0aGUgcHJvcGVydGllcyB0aGF0Ci1hcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoU2VlIGFsc28gdGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5IHRhc2s8L2E+KS48L3A+Ci08cD5Zb3UgY2FuIGFsc28gc2V0IHByb3BlcnRpZXMgaW4gdGhlIG5ldyBwcm9qZWN0IGZyb20gdGhlIG9sZCBwcm9qZWN0Ci1ieSB1c2luZyBuZXN0ZWQgcGFyYW0gdGFncy4gVGhlc2UgcHJvcGVydGllcyBhcmUgYWx3YXlzIHBhc3NlZAotdG8gdGhlIG5ldyBwcm9qZWN0IGFuZCBhbnkgcHJvamVjdCBjcmVhdGVkIGluIHRoYXQgcHJvamVjdAotcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiA8aT5pbmhlcml0QWxsPC9pPi4gIFRoaXMgYWxsb3dzIHlvdSB0bwotcGFyYW1ldGVyaXplIHlvdXIgc3VicHJvamVjdHMuICBQcm9wZXJ0aWVzIGRlZmluZWQgb24gdGhlIGNvbW1hbmQgbGluZQotY2FuIG5vdCBiZSBvdmVycmlkZGVuIGJ5IG5lc3RlZCA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8cD5CeSBkZWZhdWx0LCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgbmV3IHByb2plY3QuCitBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldCB0aGUgPHZhcj5pbmhlcml0QWxsPC92YXI+IGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4gYW5kIG9ubHkKKyZxdW90O3VzZXImcXVvdDsgcHJvcGVydGllcyAoaS5lLiwgdGhvc2UgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUpIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBuZXcKK3Byb2plY3QuICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHBhc3NlZCB0byB0aGUgbmV3IHByb2plY3Qgd2lsbCBvdmVycmlkZSB0aGUKK3Byb3BlcnRpZXMgdGhhdCBhcmUgc2V0IGluIHRoZSBuZXcgcHJvamVjdCAoc2VlIGFsc28gdGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPgordGFzaykuPC9wPgorPHA+WW91IGNhbiBhbHNvIHNldCBwcm9wZXJ0aWVzIGluIHRoZSBuZXcgcHJvamVjdCBmcm9tIHRoZSBvbGQgcHJvamVjdCBieSB1c2luZworbmVzdGVkIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IHRhZ3MuIFRoZXNlIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBwYXNzZWQgdG8gdGhlIG5ldyBwcm9qZWN0IGFuZAorYW55IHByb2plY3QgY3JlYXRlZCBpbiB0aGF0IHByb2plY3QgcmVnYXJkbGVzcyBvZiB0aGUgc2V0dGluZyBvZiA8dmFyPmluaGVyaXRBbGw8L3Zhcj4uICBUaGlzIGFsbG93cworeW91IHRvIHBhcmFtZXRlcml6ZSB5b3VyIHN1YnByb2plY3RzLiAgUHJvcGVydGllcyBkZWZpbmVkIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIG5vdCBiZSBvdmVycmlkZGVuCitieSBuZXN0ZWQgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogCi08cD5XaGVuIG1vcmUgdGhhbiBvbmUgbmVzdGVkIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IGVsZW1lbnQKLSAgd291bGQgc2V0IGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZSwgdGhlIG9uZSBkZWNsYXJlZCBsYXN0IHdpbGwKLSAgd2luLiAgVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucyBldmVuIHNvIGl0IGlzCi0gIGRpZmZlcmVudCBmcm9tIHRoZSB3YXkgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFza3MgaW4gYnVpbGQKLSAgZmlsZXMgYmVoYXZlLjwvcD4KKzxwPldoZW4gbW9yZSB0aGFuIG9uZSBuZXN0ZWQgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudCB3b3VsZCBzZXQgYSBwcm9wZXJ0eSBvZiB0aGUgc2FtZQorbmFtZSwgdGhlIG9uZSBkZWNsYXJlZCBsYXN0IHdpbGwgd2luLiAgVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucyBldmVuIHNvIGl0IGlzCitkaWZmZXJlbnQgZnJvbSB0aGUgd2F5IDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IHRhc2tzIGluIGJ1aWxkIGZpbGVzIGJlaGF2ZS48L3A+CiAKLTxwPk5lc3RlZCA8YSBocmVmPSIjcmVmZXJlbmNlIj48aT48Y29kZT4mbHQ7cmVmZXJlbmNlJmd0PC9jb2RlPjs8L2k+PC9hPiBlbGVtZW50cyBjYW4KLWJlIHVzZWQgdG8gY29weSByZWZlcmVuY2VzIGZyb20gdGhlIGNhbGxpbmcgcHJvamVjdCB0byB0aGUgbmV3Ci1wcm9qZWN0LCBvcHRpb25hbGx5IHVuZGVyIGEgZGlmZmVyZW50IGlkLiAgUmVmZXJlbmNlcyB0YWtlbiBmcm9tCi1uZXN0ZWQgZWxlbWVudHMgd2lsbCBvdmVycmlkZSBleGlzdGluZyByZWZlcmVuY2VzIHRoYXQgaGF2ZSBiZWVuCi1kZWZpbmVkIG91dHNpZGUgb2YgdGFyZ2V0cyBpbiB0aGUgbmV3IHByb2plY3QgLSBidXQgbm90IHRob3NlIGRlZmluZWQKLWluc2lkZSBvZiB0YXJnZXRzLjwvcD4KKzxwPk5lc3RlZCA8YSBocmVmPSIjcmVmZXJlbmNlIj48Y29kZT4mbHQ7cmVmZXJlbmNlJmd0OzwvY29kZT48L2E+IGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvIGNvcHkKK3JlZmVyZW5jZXMgZnJvbSB0aGUgY2FsbGluZyBwcm9qZWN0IHRvIHRoZSBuZXcgcHJvamVjdCwgb3B0aW9uYWxseSB1bmRlciBhIGRpZmZlcmVudCA8dmFyPmlkPC92YXI+LgorUmVmZXJlbmNlcyB0YWtlbiBmcm9tIG5lc3RlZCBlbGVtZW50cyB3aWxsIG92ZXJyaWRlIGV4aXN0aW5nIHJlZmVyZW5jZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZAorb3V0c2lkZSBvZiB0YXJnZXRzIGluIHRoZSBuZXcgcHJvamVjdCZtZGFzaDtidXQgbm90IHRob3NlIGRlZmluZWQgaW5zaWRlIG9mIHRhcmdldHMuPC9wPgogCi08cD4KLVdoZW4gYSB0YXJnZXQgaXMgaW52b2tlZCBieSBhbnRjYWxsLCBhbGwgb2YgaXRzIGRlcGVuZGVudCB0YXJnZXRzIHdpbGwKLWFsc28gYmUgY2FsbGVkIHdpdGhpbiB0aGUgY29udGV4dCBvZiBhbnkgbmV3IHBhcmFtZXRlcnMuIEZvciBleGFtcGxlLiBpZgotdGhlIHRhcmdldCAmcXVvdDtkb1NvbWV0aGluZ0Vsc2UmcXVvdDsgZGVwZW5kZWQgb24gdGhlIHRhcmdldCAmcXVvdDtpbml0JnF1b3Q7LCB0aGVuIHRoZQotPGk+YW50Y2FsbDwvaT4gb2YgJnF1b3Q7ZG9Tb21ldGhpbmdFbHNlJnF1b3Q7IHdpbGwgY2FsbCAmcXVvdDtpbml0JnF1b3Q7IGR1cmluZyB0aGUgY2FsbC4KLU9mIGNvdXJzZSwgYW55IHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGUgYW50Y2FsbCB0YXNrIG9yIGluaGVyaXRlZCBmcm9tIHRoZSBjYWxsaW5nIHRhcmdldAotd2lsbCBiZSBmaXhlZCBhbmQgbm90IG92ZXJyaWRhYmxlIGluIHRoZSBpbml0IHRhc2stLW9yIGluZGVlZCBpbiB0aGUgJnF1b3Q7ZG9Tb21ldGhpbmdFbHNlJnF1b3Q7IHRhc2suCi08L3A+Cis8cD5XaGVuIGEgdGFyZ2V0IGlzIGludm9rZWQgYnkgPGNvZGU+YW50Y2FsbDwvY29kZT4sIGFsbCBvZiBpdHMgZGVwZW5kZW50IHRhcmdldHMgd2lsbCBhbHNvIGJlCitjYWxsZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIGFueSBuZXcgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGUuIGlmIHRoZSB0YXJnZXQgPHE+ZG9Tb21ldGhpbmdFbHNlPC9xPjsKK2RlcGVuZGVkIG9uIHRoZSB0YXJnZXQgPHE+aW5pdDwvcT4sIHRoZW4gdGhlIDxjb2RlPmFudGNhbGw8L2NvZGU+IG9mIDxxPmRvU29tZXRoaW5nRWxzZTwvcT4gd2lsbAorY2FsbCA8cT5pbml0PC9xPiBkdXJpbmcgdGhlIGNhbGwuICBPZiBjb3Vyc2UsIGFueSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIDxjb2RlPmFudGNhbGw8L2NvZGU+Cit0YXNrIG9yIGluaGVyaXRlZCBmcm9tIHRoZSBjYWxsaW5nIHRhcmdldCB3aWxsIGJlIGZpeGVkIGFuZCBub3Qgb3ZlcnJpZGFibGUgaW4gdGhlIDxxPmluaXQ8L3E+Cit0YXJnZXQmbWRhc2g7b3IgaW5kZWVkIGluIHRoZSA8cT5kb1NvbWV0aGluZ0Vsc2U8L3E+IHRhcmdldC48L3A+CiAKLTxwPlRoZSBjYWxsZWQgdGFyZ2V0KHMpIGFyZSBydW4gaW4gYSBuZXcgcHJvamVjdDsgYmUgYXdhcmUgdGhhdCB0aGlzCi1tZWFucyBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzLCBldGMuICBzZXQgYnkgY2FsbGVkIHRhcmdldHMgd2lsbCBub3QKLXBlcnNpc3QgYmFjayB0byB0aGUgY2FsbGluZyBwcm9qZWN0LjwvcD4KKzxwPlRoZSBjYWxsZWQgdGFyZ2V0KHMpIGFyZSBydW4gaW4gYSBuZXcgcHJvamVjdDsgYmUgYXdhcmUgdGhhdCB0aGlzIG1lYW5zIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMsCitldGMuIHNldCBieSBjYWxsZWQgdGFyZ2V0cyB3aWxsIG5vdCBwZXJzaXN0IGJhY2sgdG8gdGhlIGNhbGxpbmcgcHJvamVjdC48L3A+CiAKLTxwPklmIHRoZSBidWlsZCBmaWxlIGNoYW5nZXMgYWZ0ZXIgeW91J3ZlIHN0YXJ0ZWQgdGhlIGJ1aWxkLCB0aGUKLWJlaGF2aW9yIG9mIHRoaXMgdGFzayBpcyB1bmRlZmluZWQuPC9wPgorPHA+SWYgdGhlIGJ1aWxkIGZpbGUgY2hhbmdlcyBhZnRlciB5b3UndmUgc3RhcnRlZCB0aGUgYnVpbGQsIHRoZSBiZWhhdmlvciBvZiB0aGlzIHRhc2sgaXMKK3VuZGVmaW5lZC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0YXJnZXQgdG8gZXhlY3V0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dGFyZ2V0PC90ZD4KKyAgICA8dGQ+VGhlIHRhcmdldCB0byBleGVjdXRlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluaGVyaXRBbGw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHBhc3MgYWxsIHByb3BlcnRpZXMgdG8gdGhlIG5ldyBBcGFjaGUgQW50Ci0gICAgcHJvamVjdC4gIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmluaGVyaXRBbGw8L3RkPgorICAgIDx0ZD5JZiA8cT50cnVlPC9xPiwgcGFzcyBhbGwgcHJvcGVydGllcyB0byB0aGUgbmV3IEFwYWNoZSBBbnQgcHJvamVjdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmhlcml0UmVmczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiA8Y29kZT50cnVlPC9jb2RlPiwgcGFzcyBhbGwgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgIG5ldyBBbnQgcHJvamVjdC4gIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbmhlcml0UmVmczwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+LCBwYXNzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBuZXcgQW50IHByb2plY3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+Tm90ZSBvbiA8Y29kZT5pbmhlcml0UmVmczwvY29kZT48L2gzPgogCi08cD48Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+IHdpbGwgbm90IG92ZXJyaWRlIGV4aXN0aW5nIHJlZmVyZW5jZXMsCi1ldmVuIGlmIHlvdSBzZXQgPGNvZGU+aW5oZXJpdFJlZnM8L2NvZGU+IHRvIHRydWUuICBBcyB0aGUgY2FsbGVkIGJ1aWxkCi1maWxlcyBpcyB0aGUgc2FtZSBidWlsZCBmaWxlIGFzIHRoZSBjYWxsaW5nIG9uZSwgdGhpcyBtZWFucyBpdCB3aWxsCi1ub3Qgb3ZlcnJpZGUgYW55IHJlZmVyZW5jZSBzZXQgdmlhIGFuIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgYXQKLWFsbC4gIFRoZSBvbmx5IHJlZmVyZW5jZXMgdGhhdCBjYW4gYmUgaW5oZXJpdGVkIGJ5IHRoZSBjaGlsZCBwcm9qZWN0Ci1hcmUgdGhvc2UgZGVmaW5lZCBieSBuZXN0ZWQgPGNvZGU+Jmx0O3JlZmVyZW5jZSZndDs8L2NvZGU+IGVsZW1lbnRzIG9yCi1yZWZlcmVuY2VzIGRlZmluZWQgYnkgdGFza3MgZGlyZWN0bHkgKG5vdCB1c2luZyB0aGUgPGNvZGU+aWQ8L2NvZGU+Ci1hdHRyaWJ1dGUpLjwvcD4KKzxwPjxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gd2lsbCBub3Qgb3ZlcnJpZGUgZXhpc3RpbmcgcmVmZXJlbmNlcywgZXZlbiBpZiB5b3UKK3NldCA8dmFyPmluaGVyaXRSZWZzPC92YXI+IHRvIHRydWUuICBBcyB0aGUgY2FsbGVkIGJ1aWxkIGZpbGVzIGlzIHRoZSBzYW1lIGJ1aWxkIGZpbGUgYXMgdGhlIGNhbGxpbmcKK29uZSwgdGhpcyBtZWFucyBpdCB3aWxsIG5vdCBvdmVycmlkZSBhbnkgcmVmZXJlbmNlIHNldCB2aWEgYW4gPHZhcj5pZDwvdmFyPiBhdHRyaWJ1dGUgYXQgYWxsLiAgVGhlCitvbmx5IHJlZmVyZW5jZXMgdGhhdCBjYW4gYmUgaW5oZXJpdGVkIGJ5IHRoZSBjaGlsZCBwcm9qZWN0IGFyZSB0aG9zZSBkZWZpbmVkIGJ5CituZXN0ZWQgPGNvZGU+Jmx0O3JlZmVyZW5jZSZndDs8L2NvZGU+IGVsZW1lbnRzIG9yIHJlZmVyZW5jZXMgZGVmaW5lZCBieSB0YXNrcyBkaXJlY3RseSAobm90IHVzaW5nCit0aGUgPHZhcj5pZDwvdmFyPiBhdHRyaWJ1dGUpLjwvcD4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+cGFyYW08L2g0PgotPHA+U3BlY2lmaWVzIHRoZSBwcm9wZXJ0aWVzIHRvIHNldCBiZWZvcmUgcnVubmluZyB0aGUgc3BlY2lmaWVkIHRhcmdldC4gU2VlIDxhCi1ocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gZm9yIHVzYWdlIGd1aWRlbGluZXMuPGJyPgotVGhlc2UgcHJvcGVydGllcyBiZWNvbWUgZXF1aXZhbGVudCB0byBwcm9wZXJ0aWVzIHlvdSBkZWZpbmUgb24KLXRoZSBjb21tYW5kIGxpbmUuIFRoZXNlIGFyZSBzcGVjaWFsIHByb3BlcnRpZXMgYW5kIHRoZXkgd2lsbCBhbHdheXMgZ2V0IHBhc3NlZAotZG93biwgZXZlbiB0aHJvdWdoIGFkZGl0aW9uYWwgPGNvZGU+Jmx0OyphbnQqJmd0OzwvY29kZT4gdGFza3Mgd2l0aCBpbmhlcml0YWxsIHNldCB0bwotZmFsc2UgKHNlZSBhYm92ZSkuCi08L3A+Cis8cD5TcGVjaWZpZXMgdGhlIHByb3BlcnRpZXMgdG8gc2V0IGJlZm9yZSBydW5uaW5nIHRoZSBzcGVjaWZpZWQKK3RhcmdldC4gU2VlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPiBmb3IgdXNhZ2UgZ3VpZGVsaW5lcy48YnIvPiAgVGhlc2UgcHJvcGVydGllcyBiZWNvbWUKK2VxdWl2YWxlbnQgdG8gcHJvcGVydGllcyB5b3UgZGVmaW5lIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRoZXNlIGFyZSBzcGVjaWFsIHByb3BlcnRpZXMgYW5kIHRoZXkgd2lsbAorYWx3YXlzIGdldCBwYXNzZWQgZG93biwgZXZlbiB0aHJvdWdoIGFkZGl0aW9uYWwgPGNvZGU+Jmx0OyphbnQqJmd0OzwvY29kZT4gdGFza3MKK3dpdGggPHZhcj5pbmhlcml0QWxsPC92YXI+IHNldCB0byA8cT5mYWxzZTwvcT4gKHNlZSBhYm92ZSkuPC9wPgogCi08aDQ+PGEgbmFtZT0icmVmZXJlbmNlIj5yZWZlcmVuY2U8L2E+PC9oND4KLTxwPlVzZWQgdG8gY2hvb3NlIHJlZmVyZW5jZXMgdGhhdCBzaGFsbCBiZSBjb3BpZWQgaW50byB0aGUgbmV3IHByb2plY3QsCi1vcHRpb25hbGx5IGNoYW5naW5nIHRoZWlyIGlkLjwvcD4KKzxoNCBpZD0icmVmZXJlbmNlIj5yZWZlcmVuY2U8L2g0PgorPHA+VXNlZCB0byBjaG9vc2UgcmVmZXJlbmNlcyB0aGF0IHNoYWxsIGJlIGNvcGllZCBpbnRvIHRoZSBuZXcgcHJvamVjdCwgb3B0aW9uYWxseSBjaGFuZ2luZwordGhlaXIgPHZhcj5pZDwvdmFyPi48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGlkIG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIGNhbGxpbmcgcHJvamVjdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cmVmaWQ8L3RkPgorICAgIDx0ZD5UaGUgPHZhcj5pZDwvdmFyPiBvZiB0aGUgcmVmZXJlbmNlIGluIHRoZSBjYWxsaW5nIHByb2plY3QuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9yZWZpZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaWQgb2YgdGhlIHJlZmVyZW5jZSBpbiB0aGUgbmV3IHByb2plY3QuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgcmVmaWQuPC90ZD4KKyAgICA8dGQ+dG9yZWZpZDwvdGQ+CisgICAgPHRkPlRoZSA8dmFyPmlkPC92YXI+IG9mIHRoZSByZWZlcmVuY2UgaW4gdGhlIG5ldyBwcm9qZWN0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgPHZhcj5yZWZpZDwvdmFyPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+cHJvcGVydHlzZXQ8L2g0PgogCi08cD5Zb3UgY2FuIHNwZWNpZnkgYSBzZXQgb2YgcHJvcGVydGllcyB0byBiZSBjb3BpZWQgaW50byB0aGUgbmV3Ci1wcm9qZWN0IHdpdGggPGEKLWhyZWY9Ii4uL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwiPnByb3BlcnR5c2V0PC9hPnMuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorPHA+WW91IGNhbiBzcGVjaWZ5IGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgY29waWVkIGludG8gdGhlIG5ldyBwcm9qZWN0Cit3aXRoIDxhIGhyZWY9Ii4uL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwiPnByb3BlcnR5c2V0PC9hPnMuPC9wPgogCiA8aDQ+dGFyZ2V0PC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPi48L3A+CiAKLTxwPllvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YXJnZXRzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7dGFyZ2V0Jmd0OzwvY29kZT4gZWxlbWVudHMKLWluc3RlYWQgb2YgdXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmCi1BbnQgaGFkIGJlZW4gaW52b2tlZCB3aXRoIGEgc2luZ2xlIHRhcmdldCB3aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHRoZQotdGFyZ2V0cyBzbyBzcGVjaWZpZWQsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPllvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YXJnZXRzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7dGFyZ2V0Jmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZCBvZgordXNpbmcgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IGF0dHJpYnV0ZS4gIFRoZXNlIHdpbGwgYmUgZXhlY3V0ZWQgYXMgaWYgQW50IGhhZCBiZWVuIGludm9rZWQgd2l0aCBhCitzaW5nbGUgdGFyZ2V0IHdob3NlIGRlcGVuZGVuY2llcyBhcmUgdGhlIHRhcmdldHMgc28gc3BlY2lmaWVkLCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBjYWxsZWQgdGFyZ2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGNhbGxlZCB0YXJnZXQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD48ZW0+c2luY2UgQW50IDEuNi4zPC9lbT4uPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZSBmb2xsb3dpbmc8L3A+Cis8cHJlPgogJmx0O3RhcmdldCBuYW1lPSZxdW90O2RlZmF1bHQmcXVvdDsmZ3Q7CiAgICZsdDthbnRjYWxsIHRhcmdldD0mcXVvdDtkb1NvbWV0aGluZ0Vsc2UmcXVvdDsmZ3Q7CiAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7cGFyYW0xJnF1b3Q7IHZhbHVlPSZxdW90O3ZhbHVlJnF1b3Q7LyZndDsKQEAgLTE4MiwyMCArMTY0LDE0IEBACiAKICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtkb1NvbWV0aGluZ0Vsc2UmcXVvdDsmZ3Q7CiAgICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7cGFyYW0xPSR7cGFyYW0xfSZxdW90Oy8mZ3Q7Ci0mbHQ7L3RhcmdldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPldpbGwgcnVuIHRoZSB0YXJnZXQgJ2RvU29tZXRoaW5nRWxzZScgYW5kIGVjaG8gJ3BhcmFtMT12YWx1ZScuPC9wPgotCi08YmxvY2txdW90ZT48cHJlPgorJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+Cis8cD53aWxsIHJ1biB0aGUgdGFyZ2V0IDx2YXI+ZG9Tb21ldGhpbmdFbHNlPC92YXI+IGFuZCBlY2hvIDxjb2RlPnBhcmFtMT12YWx1ZTwvY29kZT4sIHdoZXJlYXM8L3A+Cis8cHJlPgogJmx0O2FudGNhbGwgLi4uICZndDsKICAgJmx0O3JlZmVyZW5jZSByZWZpZD0mcXVvdDtwYXRoMSZxdW90OyB0b3JlZmlkPSZxdW90O3BhdGgyJnF1b3Q7LyZndDsKLSZsdDsvYW50Y2FsbCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+d2lsbCBjb3B5IHRoZSBwYXJlbnQncyBkZWZpbml0aW9uIG9mIDxjb2RlPnBhdGgxPC9jb2RlPiBpbnRvIHRoZQotbmV3IHByb2plY3QgdXNpbmcgdGhlIGlkIDxjb2RlPnBhdGgyPC9jb2RlPi48L3A+Ci0KLQorJmx0Oy9hbnRjYWxsJmd0OzwvcHJlPgorPHA+d2lsbCBjb3B5IHRoZSBwYXJlbnQncyBkZWZpbml0aW9uIG9mIDxzYW1wPnBhdGgxPC9zYW1wPiBpbnRvIHRoZSBuZXcgcHJvamVjdCB1c2luZwordGhlIDx2YXI+aWQ8L3Zhcj4gPHNhbXA+cGF0aDI8L3NhbXA+LjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2FudGxyLmh0bWwgYi9tYW51YWwvVGFza3MvYW50bHIuaHRtbAppbmRleCBjYTBiY2RlLi44YWRkNWMwIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYW50bHIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvYW50bHIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE5MCArMTUsMTM0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5BTlRMUiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJhbnRsciI+QU5UTFI8L2E+PC9oMj4KKzxoMiBpZD0iYW50bHIiPkFOVExSPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD4KLSAgSW52b2tlcyB0aGUgPGEgSFJFRj0iaHR0cDovL3d3dy5hbnRsci5vcmcvIiB0YXJnZXQ9Il90b3AiPkFOVExSPC9hPiBUcmFuc2xhdG9yIGdlbmVyYXRvcgotICBvbiBhIGdyYW1tYXIgZmlsZS4KLTwvcD4KLTxwPgotICBUbyB1c2UgdGhlIEFOVExSIHRhc2ssIHNldCB0aGUgPGk+dGFyZ2V0PC9pPiBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlCi0gIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUKLSAgPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnkuCi0gIE90aGVyd2lzZSBBTlRMUiB3cml0ZXMgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLSAgdGhlIGdyYW1tYXIgZmlsZS4KLTwvcD4KLTxwPgotICBUaGlzIHRhc2sgb25seSBpbnZva2VzIEFOVExSIGlmIHRoZSBncmFtbWFyIGZpbGUgKG9yIHRoZQotICBzdXBlcmdyYW1tYXIgc3BlY2lmaWVkIGJ5IHRoZSBnbGliIGF0dHJpYnV0ZSkgaXMgbmV3ZXIgdGhhbiB0aGUKLSAgZ2VuZXJhdGVkIGZpbGVzLgotPC9wPgotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90Ci1pbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08cD5BbnRsciAyLjcuMSBOb3RlOgotPGk+Ci0gIFRvIHN1Y2Nlc3NmdWxseSBydW4gQU5UTFIsIHlvdXIgYmVzdCBvcHRpb24gaXMgcHJvYmFibHkgdG8gYnVpbGQgdGhlIHdob2xlCi0gIGphciB3aXRoIHRoZSBwcm92aWRlZCBzY3JpcHQgPGI+bWthbGxqYXI8L2I+IGFuZCBkcm9wIHRoZSByZXN1bHRpbmcgamFyIChhYm91dCAzMDBLQikKLSAgaW50byAke2FudC5ob21lfS9saWIuIERyb3BwaW5nIHRoZSBkZWZhdWx0IGphciAoNzBLQikgaXMgcHJvYmFibHkgbm90IGVub3VnaAotICBmb3IgbW9zdCBuZWVkcyBhbmQgeW91ciBvbmx5IG9wdGlvbiB3aWxsIGJlIHRvIGFkZCBBTlRMUiBob21lIGRpcmVjdG9yeQotICB0byB5b3VyIGNsYXNzcGF0aCBhcyBkZXNjcmliZWQgaW4gQU5UTFIgPHR0Pmluc3RhbGwuaHRtbDwvdHQ+IGRvY3VtZW50LgotPC9pPgotPC9wPgotPHA+QW50bHIgMi43LjIgTm90ZToKLTxpPgotICBJbnN0ZWFkIG9mIHRoZSBhYm92ZSwgeW91IHdpbGwgbmVlZCBhbnRscmFsbC5qYXIgdGhhdCBjYW4gYmUgY3JlYXRlZAotICBieSB0aGUgPGI+YW50bHItYWxsLmphcjwvYj4gdGFyZ2V0IG9mIHRoZSBNYWtlZmlsZSBwcm92aWRlZCB3aXRoIHRoZQotICBkb3dubG9hZC4KLTwvaT4KLTwvcD4KKzxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+QU5UTFI8L2E+IFRyYW5zbGF0b3IgZ2VuZXJhdG9yIG9uIGEKK2dyYW1tYXIgZmlsZS48L3A+Cis8cD5UbyB1c2UgdGhlIEFOVExSIHRhc2ssIHNldCB0aGUgPHZhcj50YXJnZXQ8L3Zhcj4gYXR0cmlidXRlIHRvIHRoZSBuYW1lIG9mIHRoZSBncmFtbWFyIGZpbGUgdG8KK3Byb2Nlc3MuICBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZSA8dmFyPm91dHB1dGRpcmVjdG9yeTwvdmFyPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8KK2Egc3BlY2lmaWMgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlIEFOVExSIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKK2dyYW1tYXIgZmlsZS48L3A+Cis8cD5UaGlzIHRhc2sgb25seSBpbnZva2VzIEFOVExSIGlmIHRoZSBncmFtbWFyIGZpbGUgKG9yIHRoZSBzdXBlcmdyYW1tYXIgc3BlY2lmaWVkIGJ5Cit0aGUgPHZhcj5nbGliPC92YXI+IGF0dHJpYnV0ZSkgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIGZpbGVzLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudAorZGlzdHJpYnV0aW9uLiBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uPC9wPgorPHA+QW50bHIgMi43LjIgTm90ZTogPGVtPllvdSB3aWxsIG5lZWQgPHNhbXA+YW50bHJhbGwuamFyPC9zYW1wPiB0aGF0IGNhbiBiZSBjcmVhdGVkIGJ5Cit0aGUgPHE+YW50bHItYWxsLmphcjwvcT4gdGFyZ2V0IG9mIHRoZSBNYWtlZmlsZSBwcm92aWRlZCB3aXRoIHRoZSBkb3dubG9hZC48L2VtPjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD50YXJnZXQ8L3RkPgorICAgIDx0ZD5UaGUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZGlyZWN0b3J5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiAgSWYgbm90IHNldCwgdGhlIGZpbGVzCi0gICAgICBhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5vdXRwdXRkaXJlY3Rvcnk8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZ3JhbW1hciBmaWxlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Z2xpYjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIEFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZSB0aGF0IHRoZSB0YXJnZXQgZ3JhbW1hciBvdmVycmlkZXMuICBUaGlzCi0gICAgICBmZWF0dXJlIGlzIG9ubHkgbmVlZGVkIGZvciBhZHZhbmNlZCB2b2NhYnVsYXJpZXMuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Z2xpYjwvdGQ+CisgICAgPHRkPkFuIG9wdGlvbmFsIHN1cGVyIGdyYW1tYXIgZmlsZSB0aGF0IHRoZSB0YXJnZXQgZ3JhbW1hciBvdmVycmlkZXMuICBUaGlzIGZlYXR1cmUgaXMgb25seQorICAgICAgbmVlZGVkIGZvciBhZHZhbmNlZCB2b2NhYnVsYXJpZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFdoZW4gc2V0IHRvICJ5ZXMiLCB0aGlzIGZsYWcgYWRkcyBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIHRoYXQgd2lsbAotICAgICAgbGF1bmNoIHRoZSBQYXJzZVZpZXcgZGVidWdnZXIgdXBvbiBpbnZvY2F0aW9uLiAgVGhlIGRlZmF1bHQgaXMgIm5vIi4KLSAgICAgIDxicj4KLSAgICAgIE5vdGU6IFBhcnNlVmlldyBpcyBhIHNlcGFyYXRlIGNvbXBvbmVudCB0aGF0IG5lZWRzIHRvIGJlIGluc3RhbGxlZCBvciB5b3VyCi0gICAgICBncmFtbWFyIHdpbGwgaGF2ZSBjb21waWxhdGlvbiBlcnJvcnMuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVidWc8L3RkPgorICAgIDx0ZD5XaGVuIHNldCB0byA8cT55ZXM8L3E+LCB0aGlzIGZsYWcgYWRkcyBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIHRoYXQgd2lsbCBsYXVuY2ggdGhlCisgICAgICBQYXJzZVZpZXcgZGVidWdnZXIgdXBvbiBpbnZvY2F0aW9uLjxici8+ICBOb3RlOiBQYXJzZVZpZXcgaXMgYSBzZXBhcmF0ZSBjb21wb25lbnQgdGhhdCBuZWVkcworICAgICAgdG8gYmUgaW5zdGFsbGVkIG9yIHlvdXIgZ3JhbW1hciB3aWxsIGhhdmUgY29tcGlsYXRpb24gZXJyb3JzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmh0bWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBFbWl0IGFuIGh0bWwgdmVyc2lvbiBvZiB0aGUgZ3JhbW1hciB3aXRoIGh5cGVybGlua2VkIGFjdGlvbnMuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aHRtbDwvdGQ+CisgICAgPHRkPkVtaXQgYW4gSFRNTCB2ZXJzaW9uIG9mIHRoZSBncmFtbWFyIHdpdGggaHlwZXJsaW5rZWQgYWN0aW9ucyBpZiBzZXQgdG8gPHE+eWVzPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaWFnbm9zdGljPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgR2VuZXJhdGVzIGEgdGV4dCBmaWxlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSB0YXJnZXQgZ3JhbW1hci4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kaWFnbm9zdGljPC90ZD4KKyAgICA8dGQ+R2VuZXJhdGUgYSB0ZXh0IGZpbGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIHRhcmdldCBncmFtbWFyIGlmIHNldAorICAgICAgdG8gPHE+eWVzPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50cmFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIEZvcmNlcyA8Yj5hbGw8L2I+IHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8gInllcyIuCi0gICAgICBUaGUgZGVmYXVsdCBpcyAibm8iLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRyYWNlPC90ZD4KKyAgICA8dGQ+Rm9yY2UgPHN0cm9uZz5hbGw8L3N0cm9uZz4gcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byA8cT55ZXM8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRyYWNlUGFyc2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgT25seSBmb3JjZXMgcGFyc2VyIHJ1bGVzIHRvIGNhbGwgdHJhY2VJbi90cmFjZU91dCBpZiBzZXQgdG8gInllcyIuCi0gICAgICBUaGUgZGVmYXVsdCBpcyAibm8iLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRyYWNlUGFyc2VyPC90ZD4KKyAgICA8dGQ+T25seSBmb3JjZSBwYXJzZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byA8cT55ZXM8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRyYWNlTGV4ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBPbmx5IGZvcmNlcyBsZXhlciBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvICJ5ZXMiLgotICAgICAgVGhlIGRlZmF1bHQgaXMgIm5vIi4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50cmFjZUxleGVyPC90ZD4KKyAgICA8dGQ+T25seSBmb3JjZSBsZXhlciBydWxlcyB0byBjYWxsIHRyYWNlSW4vdHJhY2VPdXQgaWYgc2V0IHRvIDxxPnllczwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJhY2VUcmVlV2Fsa2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgT25seSBmb3JjZXMgdHJlZSB3YWxrZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0bwotICAgICAgInllcyIuICBUaGUgZGVmYXVsdCBpcyAibm8iLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRyYWNlVHJlZVdhbGtlcjwvdGQ+CisgICAgPHRkPk9ubHkgZm9yY2UgdHJlZSB3YWxrZXIgcnVsZXMgdG8gY2FsbCB0cmFjZUluL3RyYWNlT3V0IGlmIHNldCB0byA8cT55ZXM8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDwhLS10cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UnVuIEFOVExSIGluIGEgc2VwYXJhdGUgVk0uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICZxdW90O29mZiZxdW90OzwvdGQ+CisgICAgPHRkPmZvcms8L3RkPgorICAgIDx0ZD5SdW4gQU5UTFIgaW4gYSBzZXBhcmF0ZSBKVk0uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b2ZmPC9xPjwvdGQ+CiAgIDwvdHItLT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIHRoZSBWTSBpbi4gPCEtLShpZ25vcmVkIGlmCi0gICAgICBmb3JrIGlzIGRpc2FibGVkKS0tPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPlRoZSBkaXJlY3RvcnkgdG8gaW52b2tlIEpWTSBpbi48IS0tKGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCktLT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKzxoMyBpZD0ibmVzdGVkIj5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08cD48Y29kZT5BTlRMUjwvY29kZT4gc3VwcG9ydHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+Ci1lbGVtZW50LCB0aGF0IHJlcHJlc2VudHMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZQotc3RydWN0dXJlPC9hPi4gSXQgaXMgZ2l2ZW4gYXMgYSBjb252ZW5pZW5jZSBpZiB5b3UgaGF2ZSB0byBzcGVjaWZ5Ci10aGUgb3JpZ2luYWwgQU5UTFIgZGlyZWN0b3J5LiBJbiBtb3N0IGNhc2VzLCBkcm9wcGluZyB0aGUgYXBwcm9wcmlhdGUKLUFOVExSIGphciBpbiB0aGUgbm9ybWFsIEFudCBsaWIgcmVwb3NpdG9yeSB3aWxsIGJlIGVub3VnaC48L3A+Cis8cD5UaGUgdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudCwgdGhhdCByZXByZXNlbnRzCithIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4uIEl0IGlzIGdpdmVuIGFzIGEgY29udmVuaWVuY2UgaWYgeW91IGhhdmUgdG8KK3NwZWNpZnkgdGhlIG9yaWdpbmFsIEFOVExSIGRpcmVjdG9yeS4gSW4gbW9zdCBjYXNlcywgZHJvcHBpbmcgdGhlIGFwcHJvcHJpYXRlIEFOVExSIGphciBpbiB0aGUKK25vcm1hbCBBbnQgbGliIHJlcG9zaXRvcnkgd2lsbCBiZSBlbm91Z2guPC9wPgogCiA8aDQ+anZtYXJnPC9oND4KIAotPHA+PCEtLUlmIGZvcmsgaXMgZW5hYmxlZCwgLS0+QWRkaXRpb25hbCBwYXJhbWV0ZXJzIG1heSBiZSBwYXNzZWQgdG8gdGhlIG5ldwotVk0gdmlhIG5lc3RlZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gYXR0cmlidXRlcywgZm9yIGV4YW1wbGU6PC9wPgorPHA+PCEtLUlmIGZvcmsgaXMgZW5hYmxlZCwgLS0+QWRkaXRpb25hbCBwYXJhbWV0ZXJzIG1heSBiZSBwYXNzZWQgdG8gdGhlIG5ldyBKVk0gdmlhCituZXN0ZWQgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGF0dHJpYnV0ZXMsIGZvciBleGFtcGxlOjwvcD4KIAogPHByZT4KICZsdDthbnRsciB0YXJnZXQ9Ii4uLiImZ3Q7CiAgICZsdDtqdm1hcmcgdmFsdWU9JnF1b3Q7LURqYXZhLmNvbXBpbGVyPU5PTkUmcXVvdDsvJmd0OwogICAuLi4KLSZsdDsvYW50bHImZ3Q7Ci08L3ByZT4KKyZsdDsvYW50bHImZ3Q7PC9wcmU+CiAKLTxwPndvdWxkIHJ1biBBTlRMUiBpbiBhIFZNIHdpdGhvdXQgSklULjwvcD4KKzxwPndvdWxkIHJ1biBBTlRMUiBpbiBhIEpWTSB3aXRob3V0IEpJVC48L3A+CiAKLTxwPjxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBhbGxvd3MgYWxsIGF0dHJpYnV0ZXMgZGVzY3JpYmVkIGluIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lIGFyZ3VtZW50czwvYT4uPC9wPgorPHA+PGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGFsbG93cyBhbGwgYXR0cmlidXRlcyBkZXNjcmliZWQKK2luIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kIGxpbmUgYXJndW1lbnRzPC9hPi48L3A+CiAKIDxoMz5FeGFtcGxlPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5JbnZva2UgQU5UTFIgb24gZ3JhbW1hciBmaWxlIDxzYW1wPmV0Yy9qYXZhLmc8L3NhbXA+LCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQgZmlsZXMKK3RvIDxzYW1wPmJ1aWxkL3NyYzwvc2FtcD46PC9wPgorPHByZT4KICZsdDthbnRscgogICAgIHRhcmdldD0mcXVvdDtldGMvamF2YS5nJnF1b3Q7Ci0gICAgb3V0cHV0ZGlyZWN0b3J5PSZxdW90O2J1aWxkL3NyYyZxdW90OwotLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotICBUaGlzIGludm9rZXMgQU5UTFIgb24gZ3JhbW1hciBmaWxlIGV0Yy9qYXZhLmcsIHdyaXRpbmcgdGhlIGdlbmVyYXRlZAotICBmaWxlcyB0byBidWlsZC9zcmMuCi08L3A+Ci0KKyAgICBvdXRwdXRkaXJlY3Rvcnk9JnF1b3Q7YnVpbGQvc3JjJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvYW50c3RydWN0dXJlLmh0bWwgYi9tYW51YWwvVGFza3MvYW50c3RydWN0dXJlLmh0bWwKaW5kZXggYWI3YWNjMS4uOGNkYTdmZSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2FudHN0cnVjdHVyZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9hbnRzdHJ1Y3R1cmUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDg2ICsxNSw3NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+QW50U3RydWN0dXJlIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImFudHN0cnVjdHVyZSI+QW50U3RydWN0dXJlPC9hPjwvaDI+Ci08aDM+RGVzY3JpcHRpb248L2gzPiAKKzxoMiBpZD0iYW50c3RydWN0dXJlIj5BbnRTdHJ1Y3R1cmU8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+R2VuZXJhdGVzIGFuIERURCBmb3IgQXBhY2hlIEFudCBidWlsZGZpbGVzIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCi1hYm91dCBhbGwgdGFza3MgY3VycmVudGx5IGtub3duIHRvIEFudC48L3A+Cis8cD5HZW5lcmF0ZXMgYW4gRFREIGZvciBBcGFjaGUgQW50IGJ1aWxkZmlsZXMgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRhc2tzIGN1cnJlbnRseQora25vd24gdG8gQW50LjwvcD4KIAotPHA+QWN0dWFsbHkgdGhlIERURCB3aWxsIG5vdCBiZSBhIHJlYWwgRFREIGZvciBidWlsZGZpbGVzIHNpbmNlIEFudCdzCi11c2FnZSBvZiBYTUwgY2Fubm90IGJlIGNhcHR1cmVkIHdpdGggYSBEVEQuICBTZXZlcmFsIGVsZW1lbnRzIGluIEFudAotY2FuIGhhdmUgZGlmZmVyZW50IGF0dHJpYnV0ZSBsaXN0cyBkZXBlbmRpbmcgb24gdGhlIGVsZW1lbnQgdGhhdAotY29udGFpbnMgdGhlbS4gICZxdW90O2ZhaWwmcXVvdDsgZm9yIGV4YW1wbGUgY2FuIGJlIDxhCi1ocmVmPSJmYWlsLmh0bWwiPnRoZSB0YXNrPC9hPiBvciB0aGUgbmVzdGVkIGNoaWxkIGVsZW1lbnQgb2YgdGhlIDxhCi1ocmVmPSIuLi9UYXNrcy9zb3VuZC5odG1sIj5zb3VuZDwvYT4gdGFzay4gIERvbid0IGNvbnNpZGVyIHRoZQotZ2VuZXJhdGVkIERURCBzb21ldGhpbmcgdG8gcmVseSB1cG9uLjwvcD4KKzxwPkFjdHVhbGx5IHRoZSBEVEQgd2lsbCBub3QgYmUgYSByZWFsIERURCBmb3IgYnVpbGRmaWxlcyBzaW5jZSBBbnQncyB1c2FnZSBvZiBYTUwgY2Fubm90IGJlCitjYXB0dXJlZCB3aXRoIGEgRFRELiAgU2V2ZXJhbCBlbGVtZW50cyBpbiBBbnQgY2FuIGhhdmUgZGlmZmVyZW50IGF0dHJpYnV0ZSBsaXN0cyBkZXBlbmRpbmcgb24gdGhlCitlbGVtZW50IHRoYXQgY29udGFpbnMgdGhlbS4gPGEgaHJlZj0iZmFpbC5odG1sIj48Y29kZT4mbHQ7ZmFpbCZndDs8L2NvZGU+PC9hPiBmb3IgZXhhbXBsZSBjYW4gYmUgYQordGFzayBvciBhIG5lc3RlZCBjaGlsZCBlbGVtZW50IG9mIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zb3VuZC5odG1sIj48Y29kZT4mbHQ7c291bmQmZ3Q7PC9jb2RlPjwvYT4KK3Rhc2suICBEb24ndCBjb25zaWRlciB0aGUgZ2VuZXJhdGVkIERURCBzb21ldGhpbmcgdG8gcmVseSB1cG9uLjwvcD4KIAotPHA+QWxzbyBub3RlIHRoYXQgdGhlIERURCBnZW5lcmF0ZWQgYnkgdGhpcyB0YXNrIGlzIGluY29tcGxldGUsIHlvdSBjYW4KLWFsd2F5cyBhZGQgWE1MIGVudGl0aWVzIHVzaW5nIDxhCi1ocmVmPSJ0YXNrZGVmLmh0bWwiPjxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT48L2E+IG9yIDxhCi1ocmVmPSJ0eXBlZGVmLmh0bWwiPjxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT48L2E+LiBTZWUgPGEKLWhyZWY9Imh0dHA6Ly93d3cuc2R2LmZyL3BhZ2VzL2Nhc2EvaHRtbC9hbnQtZHRkLmVuLmh0bWwiCis8cD5BbHNvIG5vdGUgdGhhdCB0aGUgRFREIGdlbmVyYXRlZCBieSB0aGlzIHRhc2sgaXMgaW5jb21wbGV0ZSwgeW91IGNhbiBhbHdheXMgYWRkIFhNTCBlbnRpdGllcwordXNpbmcgPGEgaHJlZj0idGFza2RlZi5odG1sIj48Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+PC9hPgorb3IgPGEgaHJlZj0idHlwZWRlZi5odG1sIj48Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+PC9hPi4KK1NlZSA8YSBocmVmPSJodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwNzEyMzEwNjEyNDMvaHR0cDovL3d3dy5zZHYuZnIvcGFnZXMvY2FzYS9odG1sL2FudC1kdGQuZW4uaHRtbCIKIHRhcmdldD0iX3RvcCI+aGVyZTwvYT4gZm9yIGEgd2F5IHRvIGdldCBhcm91bmQgdGhpcyBwcm9ibGVtLjwvcD4KLTxwPlRoaXMgdGFzayBkb2Vzbid0IGtub3cgYWJvdXQgcmVxdWlyZWQgYXR0cmlidXRlcywgYWxsIHdpbGwgYmUKLWxpc3RlZCBhcyA8Y29kZT4jSU1QTElFRDwvY29kZT4uPC9wPgorPHA+VGhpcyB0YXNrIGRvZXNuJ3Qga25vdyBhYm91dCByZXF1aXJlZCBhdHRyaWJ1dGVzLCBhbGwgd2lsbCBiZSBsaXN0ZWQKK2FzIDxjb2RlPiNJTVBMSUVEPC9jb2RlPi48L3A+CiAKLTxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4gY3VzdG9tIHN0cnVjdHVyZSBwcmludGVycyBjYW4gYmUgdXNlZAotaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgZW1pdHMgYSBEVEQuICBJbiBvcmRlciB0byBwbHVnIGluIHlvdXIgb3duCi1zdHJ1Y3R1cmUsIHlvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlCi08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRTdHJ1Y3R1cmUuU3RydWN0dXJlUHJpbnRlcjwvY29kZT4KLWFuZCA8Y29kZT4mbHQ7dHlwZWRlZiZndDsgeW91ciBjbGFzcyBhbmQgdXNlIHRoZSBuZXcgdHlwZSBhcyBhIG5lc3RlZAotZWxlbWVudCBvZiB0aGlzIHRhc2sgLSBzZWUgdGhlIGV4YW1wbGUgYmVsb3cuPC9jb2RlPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiBjdXN0b20gc3RydWN0dXJlIHByaW50ZXJzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IGVtaXRzIGEgRFRELgorSW4gb3JkZXIgdG8gcGx1ZyBpbiB5b3VyIG93biBzdHJ1Y3R1cmUsIHlvdSBoYXZlIHRvIGltcGxlbWVudCB0aGUKK2ludGVyZmFjZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50U3RydWN0dXJlLlN0cnVjdHVyZVByaW50ZXI8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiB5b3VyIGNsYXNzIGFuZCB1c2UgdGhlIG5ldyB0eXBlIGFzIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhpcwordGFzayZtZGFzaDtzZWUgdGhlIGV4YW1wbGUgYmVsb3cuCiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgdG8gd3JpdGUgdGhlIERURCB0by48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+ZmlsZSB0byB3cml0ZSB0aGUgRFREIHRvLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YW50c3RydWN0dXJlIG91dHB1dD0mcXVvdDtwcm9qZWN0LmR0ZCZxdW90OyAvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+QmFzaWMgdXNhZ2U8L3A+CiAKLTxwPjxiPkVtaXR0aW5nIHlvdXIgb3duIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIGEgRFREPC9iPjwvcD4KKzxwcmU+Jmx0O2FudHN0cnVjdHVyZSBvdXRwdXQ9JnF1b3Q7cHJvamVjdC5kdGQmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5GaXJzdCB5b3UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZTwvcD4KKzxwPkVtaXQgeW91ciBvd24gc3RydWN0dXJlIGluc3RlYWQgb2YgYSBEVEQ6IGZpcnN0IHlvdSBuZWVkIHRvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlPC9wPgogCiA8cHJlPgogcGFja2FnZSBvcmcuZXhhbXBsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRTdHJ1Y3R1cmU7CiBwdWJsaWMgY2xhc3MgTXlQcmludGVyIGltcGxlbWVudHMgQW50U3RydWN0dXJlLlN0cnVjdHVyZVByaW50ZXIgewogICAgIC4uLgotfQotPC9wcmU+Cit9PC9wcmU+CiAKIDxwPmFuZCB0aGVuIHVzZSBpdCB2aWEgdHlwZWRlZjwvcD4KIAogPHByZT4KLSAgJmx0O3R5cGVkZWYgbmFtZT0ibXlwcmludGVyIiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLk15UHJpbnRlciIgLyZndDsKLSAgJmx0O2FudHN0cnVjdHVyZSBvdXRwdXQ9InByb2plY3QubXkiJmd0OwotICAgICZsdDtteXByaW50ZXIgLyZndDsKLSAgJmx0Oy9hbnRzdHJ1Y3R1cmUmZ3Q7Ci08L3ByZT4KKyZsdDt0eXBlZGVmIG5hbWU9Im15cHJpbnRlciIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5NeVByaW50ZXIiLyZndDsKKyZsdDthbnRzdHJ1Y3R1cmUgb3V0cHV0PSJwcm9qZWN0Lm15IiZndDsKKyAgJmx0O215cHJpbnRlci8mZ3Q7CismbHQ7L2FudHN0cnVjdHVyZSZndDs8L3ByZT4KIAotPHA+WW91ciBvd24gU3RydWN0dXJlUHJpbnRlciBjYW4gYWNjZXB0IGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cworPHA+WW91ciBvd24gPGNvZGUgY2xhc3M9ImNvZGUiPlN0cnVjdHVyZVByaW50ZXI8L2NvZGU+IGNhbiBhY2NlcHQgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzCiBqdXN0IGxpa2UgYW55IG90aGVyIEFudCB0eXBlIG9yIHRhc2suPC9wPgogCiA8L2JvZHk+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvYW50dmVyc2lvbi5odG1sIGIvbWFudWFsL1Rhc2tzL2FudHZlcnNpb24uaHRtbAppbmRleCBjZDlmODM4Li43ZjAzMmI1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYW50dmVyc2lvbi5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9hbnR2ZXJzaW9uLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw4MiArMTUsNzMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFudHZlcnNpb24gVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iYW50dmVyc2lvbiI+QW50dmVyc2lvbjwvYT48L2gyPgorPGgyIGlkPSJhbnR2ZXJzaW9uIj5BbnR2ZXJzaW9uPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD4KLVN0b3JlcyB0aGUgQXBhY2hlIEFudCB2ZXJzaW9uICh3aGVuIHVzZWQgYXMgdGFzaykgb3IgY2hlY2tzIGZvciBhIHNwZWNpZmljIEFudCB2ZXJzaW9uIAotKHdoZW4gdXNlZCBhcyBjb25kaXRpb24pLgotPGI+U2luY2UgQW50IDEuNy4wPC9iPgotPC9wPgorPHA+U3RvcmVzIHRoZSBBcGFjaGUgQW50IHZlcnNpb24gKHdoZW4gdXNlZCBhcyB0YXNrKSBvciBjaGVja3MgZm9yIGEgc3BlY2lmaWMgQW50IHZlcnNpb24gKHdoZW4gdXNlZAorYXMgY29uZGl0aW9uKS48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZCAoVGFzayk8L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkIChDb25kaXRpb24pPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCIgY29sc3Bhbj0iMiI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hdGxlYXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBhdCBsZWFzdC4KLSAgICAgIFRoZSBmb3JtYXQgaXMgbWFqb3IubWlub3IucG9pbnQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiPk9uZSBvZiB0aGVzZS48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXNrPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+Q29uZGl0aW9uPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhhY3RseTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiB0aGF0IHRoaXMgYW50IGlzIGV4YWN0bHkuCi0gICAgICBUaGUgZm9ybWF0IGlzIDx0dD5tYWpvci5taW5vci5wb2ludDwvdHQ+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmF0bGVhc3Q8L3RkPgorICAgIDx0ZD5UaGUgdmVyc2lvbiB0aGF0IHRoaXMgQW50IGlzIG9mIGF0IGxlYXN0LiAgVGhlIGZvcm1hdAorICAgICAgaXMgPGNvZGU+bWFqb3IubWlub3IucG9pbnQ8L2NvZGU+LjwvdGQ+CisgICAgPHRkIGNsYXNzPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gKGlnbm9yZWQpPC90ZD4KKyAgICA8dGQ+ZXhhY3RseTwvdGQ+CisgICAgPHRkPlRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBBbnQgaXMgb2YgZXhhY3RseS4gIFRoZSBmb3JtYXQgaXMgPGNvZGU+bWFqb3IubWlub3IucG9pbnQ8L2NvZGU+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+SWdub3JlZDwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YW50dmVyc2lvbiBwcm9wZXJ0eT0mcXVvdDthbnR2ZXJzaW9uJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlN0b3JlcyB0aGUgY3VycmVudCBBbnQgdmVyc2lvbiBpbiB0aGUgcHJvcGVydHkgPGk+YW50dmVyc2lvbjwvaT4uPC9wPgorPHA+U3RvcmUgdGhlIGN1cnJlbnQgQW50IHZlcnNpb24gaW4gdGhlIHByb3BlcnR5IDxjb2RlPmFudHZlcnNpb248L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O2FudHZlcnNpb24gcHJvcGVydHk9JnF1b3Q7YW50dmVyc2lvbiZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YW50dmVyc2lvbiBwcm9wZXJ0eT0mcXVvdDthbnR2ZXJzaW9uJnF1b3Q7IGF0bGVhc3Q9JnF1b3Q7MS42JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlN0b3JlcyB0aGUgQW50IHZlcnNpb24gaW4gdGhlIHByb3BlcnR5IDxpPmFudHZlcnNpb248L2k+IGlmIHRoZSBjdXJyZW50IEFudCB2ZXJzaW9uIGlzIDEuNi4wCis8cD5TdG9yZSB0aGUgQW50IHZlcnNpb24gaW4gdGhlIHByb3BlcnR5IDxjb2RlPmFudHZlcnNpb248L2NvZGU+IGlmIHRoZSBjdXJyZW50IEFudCB2ZXJzaW9uIGlzIDEuNi4wCiBvciBoaWdoZXIuIE90aGVyd2lzZSB0aGUgcHJvcGVydHkgcmVtYWlucyB1bnNldC48L3A+Cis8cHJlPiZsdDthbnR2ZXJzaW9uIHByb3BlcnR5PSZxdW90O2FudHZlcnNpb24mcXVvdDsgYXRsZWFzdD0mcXVvdDsxLjYmcXVvdDsvJmd0OzwvcHJlPgogCi08YmxvY2txdW90ZT48cHJlPgotJmx0O2FudHZlcnNpb24gcHJvcGVydHk9JnF1b3Q7YW50LWlzLWV4YWN0LTcmcXVvdDsgZXhhY3RseT0mcXVvdDsxLjcuMCZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5TZXRzIHRoZSBwcm9wZXJ0eSA8aT5hbnQtaXMtZXhhY3QtNzwvaT4gaWYgQW50IDEuNy4wIGlzIHJ1bm5pbmcuIE5laXRoZXIgMS42LjUgbm9yIDEuNy4wCis8cD5TZXQgdGhlIHByb3BlcnR5IDxjb2RlPmFudC1pcy1leGFjdC03PC9jb2RlPiBpZiBBbnQgMS43LjAgaXMgcnVubmluZy4gTmVpdGhlciAxLjYuNSBub3IgMS43LjEKIHdvdWxkIG1hdGNoLjwvcD4KKzxwcmU+Jmx0O2FudHZlcnNpb24gcHJvcGVydHk9JnF1b3Q7YW50LWlzLWV4YWN0LTcmcXVvdDsgZXhhY3RseT0mcXVvdDsxLjcuMCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5TZXQgPGNvZGU+QW50MTdpc09ubGluZTwvY29kZT4gaWYgQW50IDEuNy4wIGlzIHJ1bm5pbmcgYW5kIGNhbiBnZXQgYSBub24tZXJyb3ItcmVzcG9uc2UgZnJvbSB0aGUKK0FudCBob21lcGFnZS48L3A+Cis8cHJlPgogJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0mcXVvdDtBbnQxN2lzT25saW5lJnF1b3Q7Jmd0OwogICAmbHQ7YW5kJmd0OwogICAgICZsdDthbnR2ZXJzaW9uIGV4YWN0bHk9JnF1b3Q7MS43LjAmcXVvdDsvJmd0OwotICAgICZsdDtodHRwIHVybD0mcXVvdDtodHRwOi8vYW50LmFwYWNoZS5vcmcmcXVvdDsvJmd0OworICAgICZsdDtodHRwIHVybD0mcXVvdDtodHRwczovL2FudC5hcGFjaGUub3JnJnF1b3Q7LyZndDsKICAgJmx0Oy9hbmQmZ3Q7Ci0mbHQ7L2NvbmRpdGlvbiZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlNldHMgPGk+QW50MTdpc09ubGluZTwvaT4gaWYgQW50IDEuNy4wIGlzIHJ1bm5pbmcgYW5kIGNhbiBnZXQgYSBub24tZXJyb3ItcmVzcG9uc2UgZnJvbQotdGhlIEFudCBob21lcGFnZS48L3A+CismbHQ7L2NvbmRpdGlvbiZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2FwcGx5Lmh0bWwgYi9tYW51YWwvVGFza3MvYXBwbHkuaHRtbAppbmRleCA1NDQ0YTY0Li5iNzdjZDc2IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYXBwbHkuaHRtbAorKysgYi9tYW51YWwvVGFza3MvYXBwbHkuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDM5MyArMTUsMzQ1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgIDx0aXRsZT5BcHBseSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJhcHBseSI+QXBwbHkvPGk+RXhlY09uPC9pPjwvYT48L2gyPgotPHA+PGk+VGhlIG5hbWUgPGNvZGU+ZXhlY29uPC9jb2RlPiBpcyBkZXByZWNhdGVkIGFuZCBvbmx5IGtlcHQgZm9yIGJhY2t3YXJkcwotY29tcGF0aWJpbGl0eS48L2k+PC9wPgorPGgyIGlkPSJhcHBseSI+QXBwbHk8L2gyPgorPHA+PGVtPlRoZSBuYW1lIDxjb2RlPmV4ZWNvbjwvY29kZT4gaXMgPHU+ZGVwcmVjYXRlZDwvdT4gYW5kIG9ubHkga2VwdCBmb3IgYmFja3dhcmRzCitjb21wYXRpYmlsaXR5LjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkV4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlIDxpPm9zPC9pPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuCi10aGUgY29tbWFuZCBpcyBvbmx5IGV4ZWN1dGVkIHdoZW4gQXBhY2hlIEFudCBpcyBydW4gb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nCi1zeXN0ZW1zLjwvcD4KKzxwPkV4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlIDx2YXI+b3M8L3Zhcj4gYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgY29tbWFuZCBpcworb25seSBleGVjdXRlZCB3aGVuIEFwYWNoZSBBbnQgaXMgcnVuIG9uIG9uZSBvZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW1zLjwvcD4KIAotPHA+VGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyBvZiBhIG51bWJlciBvZiA8YQotaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCi0mbmRhc2g7IGluY2x1ZGluZyBidXQgbm90IHJlc3RyaWN0ZWQgdG8KLSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywKLSA8YSBocmVmPSIuLi9UeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPnMKLSAoPGVtPnNpbmNlJm5ic3A7QW50Jm5ic3A7MS42PC9lbT4pIG9yCi0gPGEgaHJlZj0iLi4vVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cwotICg8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPikKLSZuZGFzaDsKLSBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byB0aGUgc3lzdGVtIGNvbW1hbmQuPC9wPgotPHA+SWYgeW91IHNwZWNpZnkgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4sCi10aGUgdGltZXN0YW1wIG9mIGVhY2ggc291cmNlIGZpbGUgaXMgY29tcGFyZWQgdG8gdGhlIHRpbWVzdGFtcCBvZiBhCi10YXJnZXQgZmlsZSB3aGljaCBpcyBkZWZpbmVkIGJ5IHRoZSBuZXN0ZWQgbWFwcGVyIGVsZW1lbnQgYW5kIHNlYXJjaGVkCi1mb3IgaW4gdGhlIGdpdmVuIDxpPmRlc3Q8L2k+LCBpZiBzcGVjaWZpZWQuPC9wPgotPHA+QXQgbGVhc3Qgb25lIGZpbGVzZXQgb3IgZmlsZWxpc3QgaXMgcmVxdWlyZWQsCi1hbmQgeW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBtYXBwZXIuPC9wPgorPHA+VGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyBvZiBhIG51bWJlciBvZiA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQorQ29sbGVjdGlvbjwvYT5zICZuZGFzaDstIGluY2x1ZGluZyBidXQgbm90IHJlc3RyaWN0ZWQKK3RvIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLCA8YSBocmVmPSIuLi9UeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPnMKKyg8ZW0+c2luY2UgQW50IDEuNjwvZW0+KSBvciA8YSBocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT5zICg8ZW0+c2luY2UgQW50IDEuNjwvZW0+KQorJm5kYXNoOy0gYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIHN5c3RlbSBjb21tYW5kLjwvcD4KKzxwPklmIHlvdSBzcGVjaWZ5IGEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+LCB0aGUgdGltZXN0YW1wIG9mIGVhY2ggc291cmNlCitmaWxlIGlzIGNvbXBhcmVkIHRvIHRoZSB0aW1lc3RhbXAgb2YgYSB0YXJnZXQgZmlsZSB3aGljaCBpcyBkZWZpbmVkIGJ5IHRoZQorbmVzdGVkIDxjb2RlPm1hcHBlcjwvY29kZT4gZWxlbWVudCBhbmQgc2VhcmNoZWQgZm9yIGluIHRoZSBnaXZlbiA8dmFyPmRlc3Q8L3Zhcj4sIGlmIHNwZWNpZmllZC48L3A+Cis8cD5BdCBsZWFzdCBvbmUgPGNvZGU+ZmlsZXNldDwvY29kZT4gb3IgPGNvZGU+ZmlsZWxpc3Q8L2NvZGU+IGlzIHJlcXVpcmVkLCBhbmQgeW91IG11c3Qgbm90IHNwZWNpZnkKK21vcmUgdGhhbiBvbmUgPGNvZGU+bWFwcGVyPC9jb2RlPi48L3A+CiAKLTxwPk5vdGUgdGhhdCB5b3UgY2Fubm90IGludGVyYWN0IHdpdGggdGhlIGZvcmtlZCBwcm9ncmFtLCB0aGUgb25seSB3YXkKLXRvIHNlbmQgaW5wdXQgdG8gaXQgaXMgdmlhIHRoZSBpbnB1dCBhbmQgaW5wdXRzdHJpbmcgYXR0cmlidXRlcy48L3A+Cis8cD5Ob3RlIHRoYXQgeW91IGNhbm5vdCBpbnRlcmFjdCB3aXRoIHRoZSBmb3JrZWQgcHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHRvIHNlbmQgaW5wdXQgdG8gaXQgaXMgdmlhCit0aGUgPHZhcj5pbnB1dDwvdmFyPiBhbmQgPHZhcj5pbnB1dHN0cmluZzwvdmFyPiBhdHRyaWJ1dGVzLjwvcD4KIAotPGg0PjxhIG5hbWU9ImJhY2tncm91bmQiPlJ1bm5pbmcgQW50IGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIG9uCi0gICAgVW5peCgtbGlrZSkgc3lzdGVtczwvYT48L2g0PgorPGg0IGlkPSJiYWNrZ3JvdW5kIj5SdW5uaW5nIEFudCBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyBvbiBVbml4KC1saWtlKSBzeXN0ZW1zPC9oND4KIAotPHA+SWYgeW91IHJ1biBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgKGxpa2UgPGNvZGU+YW50ICY8L2NvZGU+KQotICBhbmQgdXNlIHRoZSA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPiB0YXNrIHdpdGggPGNvZGU+c3Bhd248L2NvZGU+Ci0gIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgaW5wdXQgdG8gdGhlCi0gIGZvcmtlZCBwcm9jZXNzIG9yIEFudCB3aWxsIGJlIHN1c3BlbmRlZCBiZWNhdXNlIGl0IHRyaWVzIHRvIHJlYWQKLSAgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuPC9wPgorPHA+SWYgeW91IHJ1biBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgKGxpa2UgPGtiZD5hbnQgJmFtcDs8L2tiZD4pIGFuZCB1c2UKK3RoZSA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPiB0YXNrIHdpdGggPHZhcj5zcGF3bjwvdmFyPiBzZXQgdG8gPHE+ZmFsc2U8L3E+LCB5b3UgbXVzdCBwcm92aWRlCitleHBsaWNpdCBpbnB1dCB0byB0aGUgZm9ya2VkIHByb2Nlc3Mgb3IgQW50IHdpbGwgYmUgc3VzcGVuZGVkIGJlY2F1c2UgaXQgdHJpZXMgdG8gcmVhZCBmcm9tIHRoZQorc3RhbmRhcmQgaW5wdXQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRob3V0IGFueSBjb21tYW5kIGxpbmUKLSAgICAgIGFyZ3VtZW50cy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPnRoZSBjb21tYW5kIHRvIGV4ZWN1dGUgd2l0aG91dCBhbnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UKLSAgICB0YXJnZXQgZmlsZXMgd2hlbiBpdCBpcyBleGVjdXRlZC4gVGhpcyBhdHRyaWJ1dGUgaXMgdmFsaWQgb25seSB3aGVuIHVzZWQKLSAgICBpbiBjb25qdW5jdGlvbiB3aXRoIGEgbmVzdGVkIG1hcHBlcjsgaWYgb21pdHRlZCwgdGhlIHRhcmdldCBmaWxlbmFtZXMKLSAgICByZXR1cm5lZCBieSB0aGUgbWFwcGVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYWJzb2x1dGUgcGF0aHMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGVzdDwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNvbW1hbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UgdGFyZ2V0IGZpbGVzIHdoZW4gaXQgaXMgZXhlY3V0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGlnbm9yZWQgdW5sZXNzIGEgbmVzdGVkIG1hcHBlciBpcyBzcGVjaWZpZWQ7IGJ5IGRlZmF1bHQsIHRoZSB0YXJnZXQgZmlsZW5hbWVzIHJldHVybmVkCisgICAgICBieSB0aGUgbWFwcGVyIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYWJzb2x1dGUgcGF0aHM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcGF3bjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0aGUgY29tbWFuZHMgdG8gYmUgc3Bhd25lZC48YnI+Ci0gICAgSWYgeW91IHNwYXduIGEgY29tbWFuZCwgaXRzIG91dHB1dCB3aWxsIG5vdCBiZSBsb2dnZWQgYnkgYW50Ljxicj4KLSAgICBUaGUgaW5wdXQsIG91dHB1dCwgZXJyb3IsIGFuZCByZXN1bHQgcHJvcGVydHkgc2V0dGluZ3MgYXJlIG5vdCBhY3RpdmUgd2hlbiBzcGF3bmluZyBhIHByb2Nlc3MuPGJyPgotICAgIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+Ci0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+Ci0gIDwvdHI+Ci0KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby48YnIvPgotICAgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB0aGUgZGVmYXVsdCB1c2VkIHdoZW4gZGlyIGhhcyBub3QgYmVlbgotICAgICAgc3BlY2lmaWVkIGRlcGVuZHMgb24gdGhlIDxjb2RlPnZtbGF1bmNoZXI8L2NvZGU+IGF0dHJpYnV0ZS4gIElmCi0gICAgICA8Y29kZT52bWxhdW5jaGVyPC9jb2RlPiBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGUgdGFzayB3aWxsIHVzZQotICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIG90aGVyd2lzZSBpdCB1c2VzIHRoZSBwcm9qZWN0J3MgYmFzZWRpci4KLSAgICA8L3RkPgorICAgIDx0ZD5zcGF3bjwvdGQ+CisgICAgPHRkPndoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRoZSBjb21tYW5kcyB0byBiZSBzcGF3bmVkLjxici8+ICBJZiB5b3Ugc3Bhd24gYSBjb21tYW5kLCBpdHMgb3V0cHV0CisgICAgd2lsbCBub3QgYmUgbG9nZ2VkIGJ5IEFudC48YnIvPiAgVGhlIGlucHV0LCBvdXRwdXQsIGVycm9yLCBhbmQgcmVzdWx0IHByb3BlcnR5IHNldHRpbmdzIGFyZSBub3QKKyAgICBhY3RpdmUgd2hlbiBzcGF3bmluZyBhIHByb2Nlc3MuPGJyLz4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWxhdGl2ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRoZSBmaWxlbmFtZXMgc2hvdWxkIGJlIHBhc3NlZCBvbiB0aGUKLSAgICAgIGNvbW1hbmQgbGluZSBhcyByZWxhdGl2ZSBwYXRobmFtZXMgKHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeQotICAgICAgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldC9saXN0IGZvciBzb3VyY2UgZmlsZXMgb3IgdGhlCi0gICAgICA8aT5kZXN0PC9pPiBhdHRyaWJ1dGUgZm9yIHRhcmdldCBmaWxlcykuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGV4ZWN1dGVkLjwvdGQ+CisgICAgPHRkPk5vOyBpZiA8dmFyPnZtbGF1bmNoZXI8L3Zhcj4gaXMgPHE+dHJ1ZTwvcT4sIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAorICAgICAgb3RoZXJ3aXNlIHRoZSBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yd2FyZHNsYXNoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdGhlIGZpbGUgbmFtZXMgc2hvdWxkIGJlIHBhc3NlZAotICAgICAgd2l0aCBmb3J3YXJkIHNsYXNoZXMgZXZlbiBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXF1aXJlcyBvdGhlcgotICAgICAgZmlsZSBzZXBhcmF0b3IuIFRoZSBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgc3lzdGVtIGZpbGUgc2VwYXJhdG9yCi0gICAgICBpcyBhIGZvcndhcmQgc2xhc2guPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPnJlbGF0aXZlPC90ZD4KKyAgICA8dGQ+d2hldGhlciB0aGUgZmlsZW5hbWVzIHNob3VsZCBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcyByZWxhdGl2ZSBwYXRobmFtZXMgKHJlbGF0aXZlCisgICAgICB0byB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmlsZXNldC9saXN0IGZvciBzb3VyY2UgZmlsZXMgb3IKKyAgICAgIHRoZSA8dmFyPmRlc3Q8L3Zhcj4gYXR0cmlidXRlIGZvciB0YXJnZXQgZmlsZXMpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlCi0gICAgICBleGVjdXRlZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mb3J3YXJkc2xhc2g8L3RkPgorICAgIDx0ZD53aGV0aGVyIHRoZSBmaWxlIG5hbWVzIHNob3VsZCBiZSBwYXNzZWQgd2l0aCBmb3J3YXJkIHNsYXNoZXMgZXZlbiBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbQorICAgICAgcmVxdWlyZXMgb3RoZXIgZmlsZSBzZXBhcmF0b3IuIFRoZSBvcHRpb24gaXMgaWdub3JlZCBpZiB0aGUgc3lzdGVtIGZpbGUgc2VwYXJhdG9yIGlzIGEgZm9yd2FyZAorICAgICAgc2xhc2guPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3NmYW1pbHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T1MgZmFtaWx5IGFzIHVzZWQgaW4gdGhlICZsdDtvcyZndDsgY29uZGl0aW9uLgorICAgIDx0ZD5vczwvdGQ+CisgICAgPHRkPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vc2ZhbWlseTwvdGQ+CisgICAgPHRkPk9TIGZhbWlseSBhcyB1c2VkIGluIHRoZSA8Y29kZT4mbHQ7b3MmZ3Q7PC9jb2RlPiBjb25kaXRpb24uCiAgICAgPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQKLSAgICBzaG91bGQgYmUgcmVkaXJlY3RlZC4gIElmIHRoZSBlcnJvciBzdHJlYW0gaXMgbm90IGFsc28gcmVkaXJlY3RlZAotICAgIHRvIGEgZmlsZSBvciBwcm9wZXJ0eSwgaXQgd2lsbCBhcHBlYXIgaW4gdGhpcyBvdXRwdXQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdG8gd2hpY2ggdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgcmVkaXJlY3RlZC4gIElmIHRoZSBlcnJvciBzdHJlYW0gaXMKKyAgICBub3QgYWxzbyByZWRpcmVjdGVkIHRvIGEgZmlsZSBvciBwcm9wZXJ0eSwgaXQgd2lsbCBhcHBlYXIgaW4gdGhpcyBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlCi0gICAgY29tbWFuZCBzaG91bGQgYmUgcmVkaXJlY3RlZC4gIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3I8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuICA8ZW0+c2luY2UgQW50CisgICAgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ0Vycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB5b3Ugd2lzaCB0byBzZWUgZXJyb3IKLSAgICBvdXRwdXQgaW4gQW50J3MgbG9nIGFuZCB5b3UgYXJlIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhCi0gICAgZmlsZS9wcm9wZXJ0eS4gVGhlIGVycm9yIG91dHB1dCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0Ci0gICAgZmlsZS9wcm9wZXJ0eS4gSWYgeW91IHJlZGlyZWN0IGVycm9yIHdpdGggdGhlICZxdW90O2Vycm9yJnF1b3Q7IG9yCi0gICAgJnF1b3Q7ZXJyb3JQcm9wZXJ0eSZxdW90OyBhdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuCi0gICAgPGVtPnNpbmNlJm5ic3A7QW50Jm5ic3A7MS42PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5sb2dFcnJvcjwvdGQ+CisgICAgPHRkPlRoaXMgYXR0cmlidXRlIGlzIHVzZWQgd2hlbiB5b3Ugd2lzaCB0byBzZWUgZXJyb3Igb3V0cHV0IGluIEFudCdzIGxvZyBhbmQgeW91IGFyZQorICAgIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvciBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICAgIGZpbGUvcHJvcGVydHkuIElmIHlvdSByZWRpcmVjdCBlcnJvciB3aXRoIHRoZSA8dmFyPmVycm9yPC92YXI+IG9yIDx2YXI+ZXJyb3JQcm9wZXJ0eTwvdmFyPgorICAgIGF0dHJpYnV0ZXMsIHRoaXMgd2lsbCBoYXZlIG5vIGVmZmVjdC4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCi0gICAgICBhbiBleGlzdGluZyBmaWxlLiAgSWYgeW91IHNldCBwYXJhbGxlbCB0byBmYWxzZSwgeW91IHdpbGwgcHJvYmFibHkKLSAgICAgIHdhbnQgdG8gc2V0IHRoaXMgb25lIHRvIHRydWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPmFwcGVuZDwvdGQ+CisgICAgPHRkPndoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS4gIElmIHlvdQorICAgICAgc2V0IDx2YXI+cGFyYWxsZWw8L3Zhcj4gdG8gPHE+ZmFsc2U8L3E+LCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIHNldCB0aGlzIG9uZQorICAgICAgdG8gPHE+dHJ1ZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZQotICAgIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gIFVubGVzcyB0aGUgZXJyb3Igc3RyZWFtIGlzIHJlZGlyZWN0ZWQKLSAgICB0byBhIHNlcGFyYXRlIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUgZXJyb3IKKyAgICA8dGQ+b3V0cHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gIFVubGVzcyB0aGUKKyAgICBlcnJvciBzdHJlYW0gaXMgcmVkaXJlY3RlZCB0byBhIHNlcGFyYXRlIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUgZXJyb3IKICAgICBvdXRwdXQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiAgPGVtPnNpbmNlJm5ic3A7QW50Jm5ic3A7MS42PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lcnJvcnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlCisgICAgICBzdG9yZWQuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkCi0gICAgaW5wdXQgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZQotICAgIGlucHV0c3RyaW5nIGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5wdXQ8L3RkPgorICAgIDx0ZD5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkIGlucHV0IGlzIHRha2VuLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseQorICAgIGV4Y2x1c2l2ZSB3aXRoIHRoZSA8dmFyPmlucHV0c3RyaW5nPC92YXI+IGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlucHV0c3RyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgc3RyaW5nIHdoaWNoIHNlcnZlcyBhcyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUKLSAgICBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKLSAgICBpbnB1dCBhdHRyaWJ1dGUuICA8ZW0+c2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlucHV0c3RyaW5nPC90ZD4KKyAgICA8dGQ+QSBzdHJpbmcgd2hpY2ggc2VydmVzIGFzIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcworICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSA8dmFyPmlucHV0PC92YXI+IGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc3VsdHByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlCi0gICAgICBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mIGludGVyZXN0IGlmCi0gICAgICBmYWlsb25lcnJvcj1mYWxzZS4gSWYgeW91IHNldCBwYXJhbGxlbCB0byBmYWxzZSwgb25seSB0aGUgcmVzdWx0Ci0gICAgICBvZiB0aGUgZmlyc3QgZXhlY3V0aW9uIHdpbGwgYmUgc3RvcmVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnJlc3VsdHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZgorICAgICAgaW50ZXJlc3QgaWYgPHZhcj5mYWlsb25lcnJvcjwvdmFyPiBpcyA8cT5mYWxzZTwvcT4uIElmIHlvdSBzZXQgPHZhcj5wYXJhbGxlbDwvdmFyPgorICAgICAgdG8gPHE+ZmFsc2U8L3E+LCBvbmx5IHRoZSByZXN1bHQgb2YgdGhlIGZpcnN0IGV4ZWN1dGlvbiB3aWxsIGJlIHN0b3JlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlCi0gICAgICBzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD50aW1lb3V0PC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIChnaXZlbiBpbgorICAgICAgbWlsbGlzZWNvbmRzKS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKLSAgICAgIHJldHVybmNvZGUgb3RoZXIgdGhhbiAwLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEgcmV0dXJuIGNvZGUgb3RoZXIgdGhhbiA8cT4wPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbGlmZXhlY3V0aW9uZmFpbHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgaWYgd2UgY2FuJ3Qgc3RhcnQgdGhlIHByb2dyYW0uCi0gICAgICBEZWZhdWx0cyB0byB0cnVlLiA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsaWZleGVjdXRpb25mYWlsczwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIGlmIHdlIGNhbid0IHN0YXJ0IHRoZSBwcm9ncmFtLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNraXBlbXB0eWZpbGVzZXRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRvbid0IHJ1biB0aGUgY29tbWFuZCwgaWYgbm8gc291cmNlIGZpbGVzIGhhdmUKLSAgICAgIGJlZW4gZm91bmQgb3IgYXJlIG5ld2VyIHRoYW4gdGhlaXIgY29ycmVzcG9uZGluZyB0YXJnZXQKLSAgICAgIGZpbGVzLiAgRGVzcGl0ZSBpdHMgbmFtZSwgdGhpcyBhdHRyaWJ1dGUgYXBwbGllcyB0byBmaWxlbGlzdHMgYXMKKyAgICA8dGQ+c2tpcGVtcHR5ZmlsZXNldHM8L3RkPgorICAgIDx0ZD5Eb24ndCBydW4gdGhlIGNvbW1hbmQsIGlmIG5vIHNvdXJjZSBmaWxlcyBoYXZlIGJlZW4gZm91bmQgb3IgYXJlIG5ld2VyIHRoYW4gdGhlaXIKKyAgICAgIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGVzLiAgRGVzcGl0ZSBpdHMgbmFtZSwgdGhpcyBhdHRyaWJ1dGUgYXBwbGllcyB0byBmaWxlbGlzdHMgYXMKICAgICAgIHdlbGwuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcmFsbGVsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXMKLSAgICAgIGFyZ3VtZW50cy4gSWYgZmFsc2UsIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCBvbmNlIGZvciBldmVyeSBmaWxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICAgIDx0ZD5wYXJhbGxlbDwvdGQ+CisgICAgPHRkPlJ1biB0aGUgY29tbWFuZCBvbmx5IG9uY2UsIGFwcGVuZGluZyBhbGwgZmlsZXMgYXMgYXJndW1lbnRzLiBJZiA8cT5mYWxzZTwvcT4sIGNvbW1hbmQgd2lsbAorICAgICAgYmUgZXhlY3V0ZWQgb25jZSBmb3IgZXZlcnkgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiA8aT5maWxlPC9pPiwgPGk+ZGlyPC9pPiBvcgotICAgICAgPGk+Ym90aDwvaT4uIElmIHNldCB0byA8aT5maWxlPC9pPiwgb25seSB0aGUgbmFtZXMgb2YgcGxhaW4KLSAgICAgIGZpbGVzIHdpbGwgYmUgc2VudCB0byB0aGUgY29tbWFuZC4gSWYgc2V0IHRvIDxpPmRpcjwvaT4sIG9ubHkKLSAgICAgIHRoZSBuYW1lcyBvZiBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bwotICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKLSAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8cT5maWxlPC9xPiwgPHE+ZGlyPC9xPiBvciA8cT5ib3RoPC9xPi4gSWYgc2V0IHRvIDxxPmZpbGU8L3E+LCBvbmx5IHRoZSBuYW1lcyBvZgorICAgICAgcGxhaW4gZmlsZXMgd2lsbCBiZSBzZW50IHRvIHRoZSBjb21tYW5kLiBJZiBzZXQgdG8gPHE+ZGlyPC9xPiwgb25seSB0aGUgbmFtZXMgb2YgZGlyZWN0b3JpZXMKKyAgICAgIGFyZSBjb25zaWRlcmVkLjxici8+CisgICAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSA8dmFyPnR5cGU8L3Zhcj4gYXR0cmlidXRlIGRvZXMgbm90IGFwcGx5IHRvCisgICAgICBuZXN0ZWQgPGNvZGU+ZGlyc2V0PC9jb2RlPnMmbWRhc2g7PGNvZGU+ZGlyc2V0PC9jb2RlPnMgYWx3YXlzIGltcGxpY2l0bHkgYXNzdW1lIHR5cGUgdG8KKyAgICAgIGJlIDxxPmRpcjwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmlsZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uZXdlbnZpcm9ubWVudDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgcHJvcGFnYXRlIG9sZCBlbnZpcm9ubWVudCB3aGVuIG5ldyBlbnZpcm9ubWVudAotICAgICAgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQ+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dm1sYXVuY2hlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5SdW4gY29tbWFuZCB1c2luZyB0aGUgSmF2YSBWTSdzIGV4ZWN1dGlvbiBmYWNpbGl0aWVzCi0gICAgICAgIHdoZXJlIGF2YWlsYWJsZS4gSWYgc2V0IHRvIGZhbHNlIHRoZSB1bmRlcmx5aW5nIE9TJ3Mgc2hlbGwsCi0gICAgICAgIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSBhbnRSdW4gc2NyaXB0cywgd2lsbCBiZSB1c2VkLgotICAgICAgICBVbmRlciBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIGdpdmVzIGFjY2VzcyB0byBmYWNpbGl0aWVzCi0gICAgICAgIG5vdCBub3JtYWxseSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgVk0gaW5jbHVkaW5nLCB1bmRlciBXaW5kb3dzLAotICAgICAgICBiZWluZyBhYmxlIHRvIGV4ZWN1dGUgc2NyaXB0cywgcmF0aGVyIHRoYW4gdGhlaXIgYXNzb2NpYXRlZAotICAgICAgICBpbnRlcnByZXRlci4gIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlCi0gICAgICAgIGV4ZWN1dGFibGUgYXMgYSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgdGhlCi0gICAgICAgIGRpciBhdHRyaWJ1dGUsIGl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvIHNldCB2bWxhdW5jaGVyIHRvCi0gICAgICAgIGZhbHNlIGFzIHdlbGwuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPnRydWU8L2k+PC90ZD4KKyAgICA8dGQ+dm1sYXVuY2hlcjwvdGQ+CisgICAgPHRkPlJ1biBjb21tYW5kIHVzaW5nIHRoZSBKVk0ncyBleGVjdXRpb24gZmFjaWxpdGllcyB3aGVyZSBhdmFpbGFibGUuIElmIHNldCB0byA8cT5mYWxzZTwvcT4gdGhlCisgICAgICB1bmRlcmx5aW5nIE9TJ3Mgc2hlbGwsIGVpdGhlciBkaXJlY3RseSBvciB0aHJvdWdoIHRoZSA8a2JkPmFudFJ1bjwva2JkPiBzY3JpcHRzLCB3aWxsIGJlCisgICAgICB1c2VkLiAgVW5kZXIgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgdGhpcyBnaXZlcyBhY2Nlc3MgdG8gZmFjaWxpdGllcyBub3Qgbm9ybWFsbHkgYXZhaWxhYmxlCisgICAgICB0aHJvdWdoIEpWTSBpbmNsdWRpbmcsIHVuZGVyIFdpbmRvd3MsIGJlaW5nIGFibGUgdG8gZXhlY3V0ZSBzY3JpcHRzLCByYXRoZXIgdGhhbiB0aGVpcgorICAgICAgYXNzb2NpYXRlZCBpbnRlcnByZXRlci4gIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgYXMgYSByZWxhdGl2ZSBwYXRoCisgICAgICB0byB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHRoZSA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUsIGl0IG1heSBiZWNvbWUgbmVjZXNzYXJ5IHRvCisgICAgICBzZXQgPHZhcj52bWxhdW5jaGVyPC92YXI+IHRvIDxxPmZhbHNlPC9xPiBhcyB3ZWxsLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb2x2ZUV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgbmFtZSBvZiB0aGUKLSAgICBleGVjdXRhYmxlIGlmIHJlc29sdmVkIGZpcnN0bHkgYWdhaW5zdCB0aGUgcHJvamVjdCBiYXNlZGlyIGFuZCBpZgotICAgIHRoYXQgZG9lcyBub3QgZXhpc3QsIGFnYWluc3QgdGhlIGV4ZWN1dGlvbiBkaXJlY3RvcnkgaWYKLSAgICBzcGVjaWZpZWQuIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IG9ubHkgd2FudCB0byBhbGxvdyBleGVjdXRpb24gb2YKLSAgICBjb21tYW5kcyBpbiB0aGUgdXNlcidzIHBhdGgsIHNldCB0aGlzIHRvIGZhbHNlLgotICAgIDxlbT5zaW5jZSZuYnNwO0FudCZuYnNwOzEuNjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPnJlc29sdmVFeGVjdXRhYmxlPC90ZD4KKyAgICA8dGQ+V2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyA8cT50cnVlPC9xPiwgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgaWYgcmVzb2x2ZWQgZmlyc3RseSBhZ2FpbnN0CisgICAgICB0aGUgcHJvamVjdCA8dmFyPmJhc2VkaXI8L3Zhcj4gYW5kIGlmIHRoYXQgZG9lcyBub3QgZXhpc3QsIGFnYWluc3QgdGhlIGV4ZWN1dGlvbiBkaXJlY3RvcnkgaWYKKyAgICAgIHNwZWNpZmllZC4gT24gVW5peCBzeXN0ZW1zLCBpZiB5b3Ugb25seSB3YW50IHRvIGFsbG93IGV4ZWN1dGlvbiBvZiBjb21tYW5kcyBpbiB0aGUgdXNlcidzCisgICAgICBwYXRoLCBzZXQgdGhpcyB0byA8cT5mYWxzZTwvcT4uCisgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1heHBhcmFsbGVsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkxpbWl0IHRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gYnkgcGFzc2luZyBhdAotICAgICAgbW9zdCB0aGlzIG1hbnkgc291cmNlZmlsZXMgYXQgb25jZS4gIFNldCBpdCB0byAmbHQ7PSAwIGZvcgotICAgICAgdW5saW1pdGVkLiA8ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjYuPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIHVubGltaXRlZCBieSBkZWZhdWx0PC90ZD4KKyAgICA8dGQ+bWF4cGFyYWxsZWw8L3RkPgorICAgIDx0ZD5MaW1pdCB0aGUgYW1vdW50IG9mIHBhcmFsbGVsaXNtIGJ5IHBhc3NpbmcgYXQgbW9zdCB0aGlzIG1hbnkgc291cmNlZmlsZXMgYXQgb25jZS4gIFNldCBpdCB0bworICAgICAgbmVnYXRpdmUgaW50ZWdlciBmb3IgdW5saW1pdGVkLiA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vLCB1bmxpbWl0ZWQgYnkgZGVmYXVsdDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZHNvdXJjZWZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBzb3VyY2UgZmlsZSBuYW1lcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCi0gICAgICBjb21tYW5kIGF1dG9tYXRpY2FsbHkuIDxlbT5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNi48L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPjwvdGQ+CisgICAgPHRkPmFkZHNvdXJjZWZpbGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHNvdXJjZSBmaWxlIG5hbWVzIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY29tbWFuZCBhdXRvbWF0aWNhbGx5LiA8ZW0+U2luY2UgQW50CisgICAgICAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4KLSAgICAgIDxlbT5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNi48L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT5mYWxzZTwvaT48L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4gIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlbWlzc2luZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGlnbm9yZSBub25leGlzdGVudCBmaWxlcyBzcGVjaWZpZWQKLSAgICAgIHZpYSBmaWxlbGlzdHMuICA8ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjYuMi48L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPjwvdGQ+CisgICAgPHRkPmlnbm9yZW1pc3Npbmc8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGlnbm9yZSBub25leGlzdGVudCBmaWxlcyBzcGVjaWZpZWQgdmlhIGZpbGVsaXN0cy4gIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gYnlwYXNzIHRpbWVzdGFtcCBjb21wYXJpc29ucwotICAgICAgZm9yIHRhcmdldCBmaWxlcy4gIDxlbT5TaW5jZSZuYnNwO0FudCZuYnNwOzEuNi4zLjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgPHRkPmZvcmNlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBieXBhc3MgdGltZXN0YW1wIGNvbXBhcmlzb25zIGZvciB0YXJnZXQgZmlsZXMuICA8ZW0+U2luY2UgQW50IDEuNi4zPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5maWxlc2V0PC9oND4KLTxwPllvdSBjYW4gdXNlIGFueSBudW1iZXIgb2YgbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLWVsZW1lbnRzIHRvIGRlZmluZSB0aGUgZmlsZXMgZm9yIHRoaXMgdGFzayBhbmQgcmVmZXIgdG8KLTxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT5zIGRlZmluZWQgZWxzZXdoZXJlLjwvcD4KLTxoND5maWxlbGlzdDwvaDQ+Ci08cD48ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPjwvcD4KLTxwPllvdSBjYW4gdXNlIGFueSBudW1iZXIgb2YgbmVzdGVkIDxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+Ci1lbGVtZW50cyB0byBkZWZpbmUgdGhlIGZpbGVzIGZvciB0aGlzIHRhc2sgYW5kIHJlZmVyIHRvCi08Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPnMgZGVmaW5lZCBlbHNld2hlcmUuPC9wPgotPGg0PmRpcnNldDwvaDQ+Ci08cD48ZW0+U2luY2UmbmJzcDtBbnQmbmJzcDsxLjY8L2VtPjwvcD4KLTxwPllvdSBjYW4gdXNlIGFueSBudW1iZXIgb2YgbmVzdGVkIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPgotZWxlbWVudHMgdG8gZGVmaW5lIHRoZSBkaXJlY3RvcmllcyBmb3IgdGhpcyB0YXNrIGFuZCByZWZlciB0bwotPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+cyBkZWZpbmVkIGVsc2V3aGVyZS48L3A+Cis8cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIGRlZmluZSB0aGUgZmlsZXMgZm9yCit0aGlzIHRhc2sgYW5kIHJlZmVyIHRvIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT5zIGRlZmluZWQgZWxzZXdoZXJlLjwvcD4KIAotPGg0PkFueSBvdGhlciA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQotQ29sbGVjdGlvbjwvYT48L2g0PgotPHA+PGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKzxoND5maWxlbGlzdDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+PC9wPgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gZWxlbWVudHMgdG8gZGVmaW5lIHRoZSBmaWxlcyBmb3IKK3RoaXMgdGFzayBhbmQgcmVmZXIgdG8gPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT5zIGRlZmluZWQgZWxzZXdoZXJlLjwvcD4KKworPGg0PmRpcnNldDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+PC9wPgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIGRlZmluZSB0aGUgZGlyZWN0b3JpZXMKK2ZvciB0aGlzIHRhc2sgYW5kIHJlZmVyIHRvIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPnMgZGVmaW5lZCBlbHNld2hlcmUuPC9wPgorCis8aDQ+QW55IG90aGVyIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+PC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CiA8cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+CiAKIDxoND5tYXBwZXI8L2g0PgotPHA+QSBzaW5nbGUgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGZpbGVzIHJlbGF0aXZlCi10byB0aGUgPGNvZGU+ZGVzdDwvY29kZT4gYXR0cmlidXRlIGZvciBkZXBlbmRlbmN5IGNoZWNraW5nLiBJZiB0aGUKLTxjb2RlPmRlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSBkaXJlY3RvcnkKLWZvciByZXNvbHZpbmcgcmVsYXRpdmUgcGF0aG5hbWVzIHJldHVybmVkIGJ5IHRoZSBtYXBwZXIuIEF0IGxlYXN0IG9uZQorPHA+QSBzaW5nbGUgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGZpbGVzIHJlbGF0aXZlIHRvIHRoZSA8dmFyPmRlc3Q8L3Zhcj4KK2F0dHJpYnV0ZSBmb3IgZGVwZW5kZW5jeSBjaGVja2luZy4gSWYgdGhlIDx2YXI+ZGVzdDwvdmFyPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGl0IHdpbGwgYmUgdXNlZCBhcworYSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIHBhdGhuYW1lcyByZXR1cm5lZCBieSB0aGUgbWFwcGVyLiBBdCBsZWFzdCBvbmUKIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gaXMgcmVxdWlyZWQuPC9wPgorCiA8aDQ+YXJnPC9oND4KLTxwPkNvbW1hbmQgbGluZSBhcmd1bWVudHMgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKLTxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gU2VlIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lIGFyZ3VtZW50czwvYT4uPC9wPgorPHA+Q29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4KK2VsZW1lbnRzLiBTZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQgbGluZSBhcmd1bWVudHM8L2E+LjwvcD4KKwogPGg0PnNyY2ZpbGU8L2g0PgotPHA+QnkgZGVmYXVsdCB0aGUgZmlsZSBuYW1lcyBvZiB0aGUgc291cmNlIGZpbGVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlCi1lbmQgb2YgdGhlIGNvbW1hbmQgbGluZSAodW5sZXNzIHlvdSBzZXQgYWRkc291cmNlZmlsZSB0bwotPGNvZGU+ZmFsc2U8L2NvZGU+KS4gSWYgeW91IG5lZWQgdG8gcGxhY2UgaXQgc29tZXdoZXJlIGRpZmZlcmVudCwKLXVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZSZndDs8L2NvZGU+IGVsZW1lbnQgYmV0d2VlbiB5b3VyCi08Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gbWFyayB0aGUgaW5zZXJ0aW9uIHBvaW50LjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5CeSBkZWZhdWx0IHRoZSBmaWxlIG5hbWVzIG9mIHRoZSBzb3VyY2UgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBjb21tYW5kIGxpbmUKKyh1bmxlc3MgeW91IHNldCA8dmFyPmFkZHNvdXJjZWZpbGU8L3Zhcj4gdG8gPHE+ZmFsc2U8L3E+KS4gSWYgeW91IG5lZWQgdG8gcGxhY2UgaXQgc29tZXdoZXJlCitkaWZmZXJlbnQsIHVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZSZndDs8L2NvZGU+IGVsZW1lbnQgYmV0d2VlbiB5b3VyIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPgorZWxlbWVudHMgdG8gbWFyayB0aGUgaW5zZXJ0aW9uIHBvaW50LjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSBwcmVmaXggdG8gcGxhY2UgaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZSB3aGVuCi0gICAgYnVpbGRpbmcgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby48L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5hIHByZWZpeCB0byBwbGFjZSBpbiBmcm9udCBvZiB0aGUgZmlsZSBuYW1lIHdoZW4gYnVpbGRpbmcgdGhlIGNvbW1hbmQgbGluZQorICAgIGFyZ3VtZW50LiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBmaWxlIG5hbWUgd2hlbgotICAgIGJ1aWxkaW5nIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uPC90ZD4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+YSBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBmaWxlIG5hbWUgd2hlbiBidWlsZGluZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAgPGVtPlNpbmNlIEFudAorICAgIDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGg0PnRhcmdldGZpbGU8L2g0PgotPHA+PGNvZGU+Jmx0O3RhcmdldGZpbGUmZ3Q7PC9jb2RlPiBpcyBzaW1pbGFyIHRvCi08Y29kZT4mbHQ7c3JjZmlsZSZndDs8L2NvZGU+IGFuZCBtYXJrcyB0aGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldAotZmlsZW5hbWUgb24gdGhlIGNvbW1hbmQgbGluZS4gSWYgb21pdHRlZCwgdGhlIHRhcmdldCBmaWxlbmFtZXMgd2lsbAotbm90IGJlIGFkZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUgYXQgYWxsLiBUaGlzIGVsZW1lbnQgY2FuIG9ubHkgYmUKLXNwZWNpZmllZCBpZiB5b3UgYWxzbyBkZWZpbmUgYSBuZXN0ZWQgbWFwcGVyLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD48Y29kZT4mbHQ7dGFyZ2V0ZmlsZSZndDs8L2NvZGU+IGlzIHNpbWlsYXIgdG8gPGNvZGU+Jmx0O3NyY2ZpbGUmZ3Q7PC9jb2RlPiBhbmQgbWFya3MgdGhlIHBvc2l0aW9uCitvZiB0aGUgdGFyZ2V0IGZpbGVuYW1lIG9uIHRoZSBjb21tYW5kIGxpbmUuIElmIG9taXR0ZWQsIHRoZSB0YXJnZXQgZmlsZW5hbWVzIHdpbGwgbm90IGJlIGFkZGVkIHRvCit0aGUgY29tbWFuZCBsaW5lIGF0IGFsbC4gVGhpcyBlbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpZiB5b3UgYWxzbyBkZWZpbmUgYSBuZXN0ZWQgbWFwcGVyLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSBwcmVmaXggdG8gcGxhY2UgaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZSB3aGVuCi0gICAgYnVpbGRpbmcgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby48L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5hIHByZWZpeCB0byBwbGFjZSBpbiBmcm9udCBvZiB0aGUgZmlsZSBuYW1lIHdoZW4gYnVpbGRpbmcgdGhlIGNvbW1hbmQgbGluZQorICAgIGFyZ3VtZW50LiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBmaWxlIG5hbWUgd2hlbgotICAgIGJ1aWxkaW5nIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uPC90ZD4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+YSBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBmaWxlIG5hbWUgd2hlbiBidWlsZGluZyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LiAgPGVtPlNpbmNlIEFudAorICAgIDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGg0PmVudjwvaDQ+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZQotc3lzdGVtIGNvbW1hbmQgdmlhIG5lc3RlZCA8Y29kZT4mbHQ7ZW52Jmd0OzwvY29kZT4gZWxlbWVudHMuIFNlZSB0aGUKLWRlc2NyaXB0aW9uIGluIHRoZSBzZWN0aW9uIGFib3V0IDxhIGhyZWY9ImV4ZWMuaHRtbCNlbnYiPmV4ZWM8L2E+PC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgc3lzdGVtIGNvbW1hbmQgdmlhCituZXN0ZWQgPGNvZGU+Jmx0O2VudiZndDs8L2NvZGU+IGVsZW1lbnRzLiBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzZWN0aW9uCithYm91dCA8YSBocmVmPSJleGVjLmh0bWwjZW52Ij5leGVjPC9hPjwvcD4KIDxoND5yZWRpcmVjdG9yPC9oND4KLTxpPjxiPlNpbmNlJm5ic3A7QW50Jm5ic3A7MS42LjI8L2I+PC9pPgotPHA+QSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVkaXJlY3Rvci5odG1sIj5JL08gUmVkaXJlY3RvcjwvYT4KLWNhbiBiZSBzcGVjaWZpZWQuICAmbHQ7YXBwbHkmZ3Q7J3MgYmVoYXZpb3IgaXMgbGlrZSB0aGF0IG9mCi08YSBocmVmPSJleGVjLmh0bWwjcmVkaXJlY3RvciI+ZXhlYzwvYT4gd2l0aCByZWdhcmQgdG8KLXJlZGlyZWN0b3JzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCwgaW4gbm9uLTxpPnBhcmFsbGVsPC9pPiBtb2RlLAotZmlsZSBtYXBwaW5nIHdpbGwgdGFrZSBwbGFjZSB3aXRoIGVhY2ggaXRlcmF0aW9uLiAgVGhpcyBncmFudHMgdGhlCi11c2VyIHRoZSBjYXBhY2l0eSB0byByZWNlaXZlIGlucHV0IGZyb20sIGFuZCBzZW5kIG91dHB1dCB0bywgZGlmZmVyZW50Ci1maWxlcyBmb3IgZWFjaCBzb3VyY2VmaWxlLgotPC9wPgotPHA+SW4gPGk+cGFyYWxsZWw8L2k+LW1vZGUgdGhlIHJlZGlyZWN0b3Igd2lsbCBiZSByZXNldCBmb3IgZWFjaCBiYXRjaAotICBvZiBleGVjdXRpb25zICh3aXRoIDxpPm1heHBhcmFsbGVsPC9pPiAmZ3Q7IDApIGFuZCBudWxsIHdpbGwgYmUgdXNlZAotICBhIHNvdXJjZSBmaWxlIGp1c3QgbGlrZSBpdCBpcyBpbiB0aGUgY2FzZSBvZiA8Y29kZT5leGVjPC9jb2RlPi48L3A+Cis8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT4KKzxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3JlZGlyZWN0b3IuaHRtbCI+SS9PIFJlZGlyZWN0b3I8L2E+IGNhbiBiZSBzcGVjaWZpZWQuICAmbHQ7YXBwbHkmZ3Q7J3MKK2JlaGF2aW9yIGlzIGxpa2UgdGhhdCBvZiA8YSBocmVmPSJleGVjLmh0bWwjcmVkaXJlY3RvciI+ZXhlYzwvYT4gd2l0aCByZWdhcmQgdG8gcmVkaXJlY3RvcnMsIHdpdGgKK3RoZSBleGNlcHRpb24gdGhhdCwgaW4gbm9uLTx2YXI+cGFyYWxsZWw8L3Zhcj4gbW9kZSwgZmlsZSBtYXBwaW5nIHdpbGwgdGFrZSBwbGFjZSB3aXRoIGVhY2gKK2l0ZXJhdGlvbi4gIFRoaXMgZ3JhbnRzIHRoZSB1c2VyIHRoZSBjYXBhY2l0eSB0byByZWNlaXZlIGlucHV0IGZyb20sIGFuZCBzZW5kIG91dHB1dCB0bywgZGlmZmVyZW50CitmaWxlcyBmb3IgZWFjaCBzb3VyY2VmaWxlLjwvcD4KKzxwPkluIDx2YXI+cGFyYWxsZWw8L3Zhcj4gbW9kZSB0aGUgcmVkaXJlY3RvciB3aWxsIGJlIHJlc2V0IGZvciBlYWNoIGJhdGNoIG9mIGV4ZWN1dGlvbnMKKyh3aXRoIDx2YXI+bWF4cGFyYWxsZWw8L3Zhcj4gJmd0OyAwKSBhbmQgbnVsbCB3aWxsIGJlIHVzZWQgYSBzb3VyY2UgZmlsZSBqdXN0IGxpa2UgaXQgaXMgaW4gdGhlIGNhc2UKK29mIDxjb2RlPmV4ZWM8L2NvZGU+LjwvcD4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgorPHA+SW52b2tlIDxrYmQ+bHMgLWw8L2tiZD4sIGFkZGluZyB0aGUgYWJzb2x1dGUgZmlsZW5hbWVzIG9mIGFsbCBmaWxlcyBiZWxvdyA8c2FtcD4vdG1wPC9zYW1wPiBub3QKK2VuZGluZyBpbiA8c2FtcD4udHh0PC9zYW1wPiBhbmQgYWxsIGZpbGVzIG9mIHRoZSBGaWxlU2V0IHdpdGggPHZhcj5pZDwvdmFyPiA8c2FtcD5vdGhlci5maWxlczwvc2FtcD4KK3RvIHRoZSBjb21tYW5kIGxpbmUuPC9wPgorPHByZT4KICZsdDthcHBseSBleGVjdXRhYmxlPSZxdW90O2xzJnF1b3Q7Jmd0OwogICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1sJnF1b3Q7LyZndDsKICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy90bXAmcXVvdDsmZ3Q7CkBAIC00MDksMjYgKzM2MiwyNiBAQAogICAgICZsdDsvcGF0dGVybnNldCZndDsKICAgJmx0Oy9maWxlc2V0Jmd0OwogICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtvdGhlci5maWxlcyZxdW90Oy8mZ3Q7Ci0mbHQ7L2FwcGx5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+aW52b2tlcyA8Y29kZT5scyAtbDwvY29kZT4sIGFkZGluZyB0aGUgYWJzb2x1dGUgZmlsZW5hbWVzIG9mIGFsbAotZmlsZXMgYmVsb3cgPGNvZGU+L3RtcDwvY29kZT4gbm90IGVuZGluZyBpbiA8Y29kZT4udHh0PC9jb2RlPiBhbmQgYWxsCi1maWxlcyBvZiB0aGUgRmlsZVNldCB3aXRoIDxjb2RlPmlkPC9jb2RlPiA8Y29kZT5vdGhlci5maWxlczwvY29kZT4gdG8KLXRoZSBjb21tYW5kIGxpbmUuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvYXBwbHkmZ3Q7PC9wcmU+CisKKzxwPkludm9rZSA8a2JkPnNvbWVjb21tYW5kIGFyZzEgU09VUkNFRklMRU5BTUUgYXJnMjwva2JkPiBmb3IgZWFjaCBmaWxlIGluIDxzYW1wPi90bXA8L3NhbXA+CityZXBsYWNpbmcgPGNvZGU+U09VUkNFRklMRU5BTUU8L2NvZGU+IHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIGVhY2ggZmlsZSBpbgordHVybi4gSWYgPHZhcj5wYXJhbGxlbDwvdmFyPiBoYWQgYmVlbiBzZXQgdG8gPHE+dHJ1ZTwvcT4sIDxjb2RlPlNPVVJDRUZJTEVOQU1FPC9jb2RlPiB3b3VsZCBiZQorcmVwbGFjZWQgd2l0aCB0aGUgYWJzb2x1dGUgZmlsZW5hbWVzIG9mIGFsbCBmaWxlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzLjwvcD4KKzxwcmU+CiAmbHQ7YXBwbHkgZXhlY3V0YWJsZT0mcXVvdDtzb21lY29tbWFuZCZxdW90OyBwYXJhbGxlbD0mcXVvdDtmYWxzZSZxdW90OyZndDsKICAgJmx0O2FyZyB2YWx1ZT0mcXVvdDthcmcxJnF1b3Q7LyZndDsKICAgJmx0O3NyY2ZpbGUvJmd0OwogICAmbHQ7YXJnIHZhbHVlPSZxdW90O2FyZzImcXVvdDsvJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7L3RtcCZxdW90Oy8mZ3Q7CiAmbHQ7L2FwcGx5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+aW52b2tlcyA8Y29kZT5zb21lY29tbWFuZCBhcmcxIFNPVVJDRUZJTEVOQU1FIGFyZzI8L2NvZGU+IGZvciBlYWNoCi1maWxlIGluIDxjb2RlPi90bXA8L2NvZGU+IHJlcGxhY2luZyBTT1VSQ0VGSUxFTkFNRSB3aXRoIHRoZSBhYnNvbHV0ZQotZmlsZW5hbWUgb2YgZWFjaCBmaWxlIGluIHR1cm4uIElmIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiBoYWQgYmVlbiBzZXQKLXRvIHRydWUsIFNPVVJDRUZJTEVOQU1FIHdvdWxkIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lcwotb2YgYWxsIGZpbGVzIHNlcGFyYXRlZCBieSBzcGFjZXMuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzwvcHJlPgorCis8cD5JbnZva2UgPGtiZD5jYyAtYyAtbyBUQVJHRVRGSUxFIFNPVVJDRUZJTEU8L2tiZD4gZm9yIGVhY2ggPHNhbXA+LmM8L3NhbXA+IGZpbGUgdGhhdCBpcyBuZXdlciB0aGFuCit0aGUgY29ycmVzcG9uZGluZyA8c2FtcD4ubzwvc2FtcD4sIHJlcGxhY2luZyA8Y29kZT5UQVJHRVRGSUxFPC9jb2RlPiB3aXRoIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZgordGhlIDxzYW1wPi5vPC9zYW1wPiBhbmQgPGNvZGU+U09VUkNFRklMRTwvY29kZT4gd2l0aCB0aGUgYWJzb2x1dGUgbmFtZSBvZiB0aGUgPHNhbXA+LmM8L3NhbXA+CitmaWxlLjwvcD4KKzxwcmU+CiAmbHQ7YXBwbHkgZXhlY3V0YWJsZT0mcXVvdDtjYyZxdW90OyBkZXN0PSZxdW90O3NyYy9DJnF1b3Q7IHBhcmFsbGVsPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OwogICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1jJnF1b3Q7LyZndDsKICAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstbyZxdW90Oy8mZ3Q7CkBAIC00MzYsMTQgKzM4OSwxNyBAQAogICAmbHQ7c3JjZmlsZS8mZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMvQyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqLmMmcXVvdDsvJmd0OwogICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyouYyZxdW90OyB0bz0mcXVvdDsqLm8mcXVvdDsvJmd0OwotJmx0Oy9hcHBseSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmludm9rZXMgPGNvZGU+Y2MgLWMgLW8gVEFSR0VURklMRSBTT1VSQ0VGSUxFPC9jb2RlPiBmb3IgZWFjaAotPGNvZGU+LmM8L2NvZGU+IGZpbGUgdGhhdCBpcyBuZXdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCi08Y29kZT4ubzwvY29kZT4sIHJlcGxhY2luZyBUQVJHRVRGSUxFIHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mCi10aGUgPGNvZGU+Lm88L2NvZGU+IGFuZCBTT1VSQ0VGSUxFIHdpdGggdGhlIGFic29sdXRlIG5hbWUgb2YgdGhlCi08Y29kZT4uYzwvY29kZT4gZmlsZS48L3A+Ci08YmxvY2txdW90ZT48cHJlPgorJmx0Oy9hcHBseSZndDs8L3ByZT4KKworPHA+QXBwbHkgdGhlIGZpY3RpdGlvdXMgPGtiZD5wcm9jZXNzZmlsZTwva2JkPiBleGVjdXRhYmxlIHRvIGFsbCBmaWxlcyBtYXRjaGluZyA8c2FtcD4qLmZpbGU8L3NhbXA+CitpbiB0aGUgPHNhbXA+c3JjPC9zYW1wPiBkaXJlY3RvcnkuICBUaGUgPHNhbXA+b3V0PC9zYW1wPiA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gaGFzIGJlZW4gc2V0IHVwCit0byBtYXAgPHNhbXA+Ki5maWxlPC9zYW1wPiB0byA8c2FtcD4qLm91dDwvc2FtcD4sIHRoZW4gdGhpcyA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gaXMgdXNlZCB0bworc3BlY2lmeSA8Y29kZT50YXJnZXRmaWxlPC9jb2RlPnMgZm9yIHRoaXMgPGNvZGU+Jmx0O2FwcGx5Jmd0OzwvY29kZT4gdGFzay4gIEEgcmVmZXJlbmNlCit0byA8c2FtcD5vdXQ8L3NhbXA+IGlzIHRoZW4gdXNlZCBhcyBhbiA8Y29kZT4mbHQ7b3V0cHV0bWFwcGVyJmd0OzwvY29kZT4gbmVzdGVkIGluCithIDxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4sIHdoaWNoIGluIHR1cm4gaXMgbmVzdGVkIGJlbmVhdGggdGhpcyA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPgoraW5zdGFuY2UuICBUaGlzIGFsbG93cyB1cyB0byBwZXJmb3JtIGRlcGVuZGVuY3kgY2hlY2tpbmcgYWdhaW5zdCBvdXRwdXQgZmlsZXMmbWRhc2g7dGhlIHRhcmdldCBmaWxlcworaW4gdGhpcyBjYXNlLjwvcD4KKzxwcmU+CiAmbHQ7bWFwcGVyIGlkPSZxdW90O291dCZxdW90OyB0eXBlPSZxdW90O2dsb2ImcXVvdDsKICAgICAgICAgICAgZnJvbT0mcXVvdDtzcmMke2ZpbGUuc2VwYXJhdG9yfSouZmlsZSZxdW90OwogICAgICAgICAgICB0bz0mcXVvdDtkZXN0JHtmaWxlLnNlcGFyYXRvcn0qLm91dCZxdW90Oy8mZ3Q7CkBAIC00NTQsMzAgKzQxMCwyMyBAQAogICAmbHQ7cmVkaXJlY3RvciZndDsKICAgICAmbHQ7b3V0cHV0bWFwcGVyIHJlZmlkPSZxdW90O291dCZxdW90Oy8mZ3Q7CiAgICZsdDsvcmVkaXJlY3RvciZndDsKLSZsdDsvYXBwbHkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BcHBsaWVzIHRoZSBmaWN0aXRpb3VzICZxdW90O3Byb2Nlc3NmaWxlJnF1b3Q7IGV4ZWN1dGFibGUgdG8gYWxsCi1maWxlcyBtYXRjaGluZyA8Y29kZT4qLmZpbGU8L2NvZGU+IGluIHRoZSA8Y29kZT5zcmM8L2NvZGU+IGRpcmVjdG9yeS4KLVRoZSA8Y29kZT5vdXQ8L2NvZGU+IDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzZXQgdXAgdG8gbWFwCi08Y29kZT4qLmZpbGU8L2NvZGU+IHRvIDxjb2RlPioub3V0PC9jb2RlPiwgdGhlbiB0aGlzIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPgotaXMgdXNlZCB0byBzcGVjaWZ5IDxjb2RlPnRhcmdldGZpbGU8L2NvZGU+cyBmb3IgdGhpcyAmbHQ7YXBwbHkmZ3Q7Ci10YXNrLiAgQSByZWZlcmVuY2UgdG8gPGNvZGU+b3V0PC9jb2RlPiBpcyB0aGVuIHVzZWQgYXMgYW4KLTxjb2RlPiZsdDtvdXRwdXRtYXBwZXImZ3Q7PC9jb2RlPiBuZXN0ZWQgaW4gYSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+LCB3aGljaCBpbiB0dXJuIGlzCi1uZXN0ZWQgYmVuZWF0aCB0aGlzIDxjb2RlPiZsdDthcHBseSZndDs8L2NvZGU+IGluc3RhbmNlLiAgVGhpcyBhbGxvd3MgdXMgdG8gcGVyZm9ybQotZGVwZW5kZW5jeSBjaGVja2luZyBhZ2FpbnN0IG91dHB1dCBmaWxlcy0tdGhlIHRhcmdldCBmaWxlcyBpbiB0aGlzIGNhc2UuCi08YmxvY2txdW90ZT48cHJlPgorJmx0Oy9hcHBseSZndDs8L3ByZT4KKworPHA+QXBwbHkgdGhlIDxrYmQ+bHM8L2tiZD4gZXhlY3V0YWJsZSB0byBhbGwgZGlyZWN0b3JpZXMgaW4gdGhlIDxjb2RlPlBBVEg8L2NvZGU+LCBlZmZlY3RpdmVseQorbGlzdGluZyBhbGwgZXhlY3V0YWJsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSA8Y29kZT5QQVRIPC9jb2RlPi48L3A+Cis8cHJlPgogJmx0O2FwcGx5IGV4ZWN1dGFibGU9ImxzIiBwYXJhbGxlbD0idHJ1ZSIKICAgICAgICBmb3JjZT0idHJ1ZSIgZGVzdD0iJHtiYXNlZGlyfSIgYXBwZW5kPSJ0cnVlIiB0eXBlPSJib3RoIiZndDsKICAgJmx0O3BhdGgmZ3Q7CiAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7ZW52LlBBVEh9Ii8mZ3Q7CiAgICZsdDsvcGF0aCZndDsKICAgJmx0O2lkZW50aXR5bWFwcGVyLyZndDsKLSZsdDsvYXBwbHkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1BcHBsaWVzIHRoZSAibHMiIGV4ZWN1dGFibGUgdG8gYWxsIGRpcmVjdG9yaWVzIGluIHRoZSBQQVRILCBlZmZlY3RpdmVseQotbGlzdGluZyBhbGwgZXhlY3V0YWJsZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uIHRoZSBQQVRILgorJmx0Oy9hcHBseSZndDs8L3ByZT4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkNvbnZlcnQgYWxsIEphdmFTY3JpcHQgZmlsZXMgaW4gdGhlIDxzYW1wPnNyYzwvc2FtcD4gZGlyZWN0b3J5IHVzaW5nIHRoZSBjb21tYW5kIDxrYmQ+anNtaW4gJmx0Oworc3JjL2EuanMgJmd0OyBkZXN0L2EuanM8L2tiZD4uIEJlY2F1c2UgdGhlIGZpbGVuYW1lIGl0c2VsZiBzaG91bGQgbm90IGJlIHBhc3NlZCB0bwordGhlIDxjb2RlPmpzbWluPC9jb2RlPiBwcm9ncmFtLCB0aGUgPHZhcj5hZGRzb3VyY2VmaWxlPC92YXI+IGlzIHNldCB0byA8cT5mYWxzZTwvcT4uPC9wPgorPHByZT4KICZsdDthcHBseSBleGVjdXRhYmxlPSJqc21pbiIgYWRkc291cmNlZmlsZT0iZmFsc2UiJmd0OwogICAgICZsdDshLS0gQ29sbGVjdCB0aGUgSlMtZmlsZXMgLS0mZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiIGluY2x1ZGVzPSIqLmpzIi8mZ3Q7CkBAIC00ODgsMTcgKzQzNyw3IEBACiAgICAgICAgICZsdDshLS0gcmVkaXJlY3QgU1RET1VUIHRvIGZpbGUgaW4gZGVzdC1kaXIgLS0mZ3Q7CiAgICAgICAgICZsdDtvdXRwdXRtYXBwZXIgaWQ9Im91dCIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5qcyIgdG89ImRlc3QvKi5qcyIvJmd0OwogICAgICZsdDsvcmVkaXJlY3RvciZndDsKLSZsdDsvYXBwbHkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Db252ZXJzaW9uIG9mIHRoZSBjb21tYW5kIDxjb2RlPmpzbWluICZsdDsgc3JjL2EuanMgJmd0OyBkZXN0L2EuanM8L2NvZGU+IGJ1dCBmb3IKLWFsbCBmaWxlcyBpbiB0aGUgc3JjLWRpcmVjdG9yeS4gQmVjYXVzZSB0aGUgZmlsZW5hbWUgaXRzZWxmIHNob3VsZCBub3QgYmUgcGFzc2VkCi10byB0aGUgPGNvZGU+anNtaW48L2NvZGU+IHByb2dyYW0sIHRoZSA8Y29kZT5hZGRzb3VyY2VmaWxlPC9jb2RlPiBpcyBzZXQgdG8KLTxjb2RlPmZhbHNlPC9jb2RlPi4KLQotCi0KLQotCismbHQ7L2FwcGx5Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvYXB0Lmh0bWwgYi9tYW51YWwvVGFza3MvYXB0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGQ5YTkuLjAwMDAwMDAKLS0tIGEvbWFudWFsL1Rhc2tzL2FwdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLTwhLS0KLSAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxodG1sIGxhbmc9ImVuLXVzIj48aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPkFwdCBUYXNrPC90aXRsZT48L2hlYWQ+Ci0KLTxib2R5PgotCi08aDI+PGEgbmFtZT0iQXB0Ij5BcHQ8L2E+PC9oMj4KLTxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5SdW5zIHRoZSBhbm5vdGF0aW9uIHByb2Nlc3NvciB0b29sIChhcHQpLCBhbmQgdGhlbiBvcHRpb25hbGx5IGNvbXBpbGVzCi0gICB0aGUgb3JpZ2luYWwgY29kZSwgYW5kIGFueSBnZW5lcmF0ZWQgc291cmNlIGNvZGUuCi0gICA8cD5UaGlzIHRhc2sgcnVucyBvbiBKYXZhIDEuNSB0byBKYXZhIDEuNy48L3A+Ci0gICA8cD5BcHQgaXMgZGVwcmVjYXRlZCBpbiBKYXZhIDEuNiwgd2hpY2ggY2FuIHJ1biBhbm5vdGF0aW9uCi0gICBwcm9jZXNzb3JzIGFzIHBhcnQgb2YgamF2YWMsIGFuZCByZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBpbiBKYXZhIDEuOC4KLSAgIFRoZSB0YXNrIHdpbGwgZmlyZSBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHJ1biB1bmRlciBKYXZhIDEuOC48L3A+Ci0KLQotPHA+VGhpcyB0YXNrIGluaGVyaXRzIGZyb20gdGhlIDxhIGhyZWY9ImphdmFjLmh0bWwiPkphdmFjIFRhc2s8L2E+LCBhbmQgdGh1cwotICAgc3VwcG9ydHMgbmVhcmx5IGFsbCBvZiB0aGUgc2FtZSBhdHRyaWJ1dGVzLCBhbmQgc3ViZWxlbWVudHMuICAKLSAgIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGNhc2UsIHRoZSA8dHQ+Zm9yazwvdHQ+IGF0dHJpYnV0ZSwgd2hpY2ggaXMgcHJlc2VudAotICAgYnV0IHdoaWNoIGNhbiBvbmx5IGJlIHNldCB0byA8dHQ+dHJ1ZTwvdHQ+LiBUaGF0IGlzLCBhcHQgb25seSB3b3JrcyBhcwotICAgYSBmb3JrZWQgcHJvY2Vzcy4KLSA8L3A+Ci0gPHA+Ci0gICBJbiBhZGRpdGlvbiwgaXQgc3VwcG9ydHMKLSAgIHRoZSBmb2xsb3dpbmcgYWRkaXRpb24gaXRlbXM6PC9wPgotCi08aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICA8dGJvZHk+PHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BZnRlciBydW5uaW5nIHRoZSBBcHQsIHNob3VsZCB0aGUgY29kZSBiZSBjb21waWxlZC4gIChzZWUgdGhlCi0gICAgICAgICAgICAgICAgICAgICA8Y29kZT4tbm9jb21waWxlPC9jb2RlPiBmbGFnIG9uIHRoZSBBcHQgZXhlY3V0YWJsZSk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhY3Rvcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIEFubm90YXRpb25Qcm9jZXNzRmFjdG9yeSB0byBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICB0byBjb25zdHJ1Y3QgYW5ub3RhdGlvbiBwcm9jZXNzb3JzLiAgVGhpcyByZXByZXNlbnRzIHRoZSA8Y29kZT4tZmFjdG9yeTwvY29kZT4KLSAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgbGluZSBmbGFnIG9mIHRoZSBBcHQgZXhlY3V0YWJsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWN0b3J5cGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVmZXJlbmNlIGlkIG9mIHRoZSBwYXRoIHVzZWQgdG8gZmluZCB0aGUgY2xhc3NlcyBuZWVkZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSAoYW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmFjdG9yeSBpdHNlbGYpLgotICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXByZXNlbnRzIHRoZSA8Y29kZT4tZmFjdG9yeXBhdGg8L2NvZGU+IGZsYWcgb24gdGhlIEFwdCBleGVjdXRhYmxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXByb2Nlc3NkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB1c2VkIGZvciBwcmVwcm9jZXNzaW5nLiAgVGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHdpbGwgYmUgcGxhY2UuICBUaGlzIHJlcHJlc2VudHMgdGhlIDxjb2RlPi1zPC9jb2RlPiBmbGFnIG9uCi0gICAgICAgICAgICAgICAgICAgICB0aGUgQXB0IGV4ZWN1dGFibGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLTwvdGJvZHk+PC90YWJsZT4KLQotPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci0KLQotPGg0PmZhY3RvcnlwYXRoPC9oND4KLQotPHA+WW91IGNhbiBzcGVjaWZ5IHRoZSBwYXRoIHVzZWQgdG8gZmluZCB0aGUgY2xhc3NlcyBuZWVkZWQgYnkgdGhlIEFubm90YXRpb25Qcm9jZXNzb3JGYWN0b3J5Ci0gICBhdCBydW50aW1lLCB1c2luZyB0aGlzIGVsZW1lbnQuICBJdCBpcyByZXByZXNlbnRzIGFzIGEgZ2VuZXJpYyBwYXRoIGxpa2Ugc3RydWN0dXJlLiAgVGhpcwotICAgcmVwcmVzZW50cyB0aGUgPGNvZGU+LWZhY3RvcnlwYXRoPC9jb2RlPiBmbGFnIG9uIHRoZSBBcHQgZXhlY3V0YWJsZS48L3A+Ci0KLQotPGg0Pm9wdGlvbjwvaDQ+Ci0KLTxwPlVzZWQgdG8gcmVwcmVzZW50IGEgZ2VuZXJpYyBvcHRpb24gdG8gcGFzcyB0byBBcHQuICBUaGlzIHJlcHJlc2VudHMgdGhlIDxjb2RlPi1BPC9jb2RlPiBmbGFnIG9uIHRoZQotICAgQXB0IGV4ZWN1dGFibGUuICBZb3UgY2FuIHNwZWNpZnkgemVybyBvciBtb3JlIDxjb2RlPiZsdDtvcHRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+PHRyPgotICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxMiUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI3OCUiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjEwJSI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5UaGUgbmFtZSBvZiB0aGUgb3B0aW9uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+VGhlIHZhbHVlIHRvIHNldCB0aGUgb3B0aW9uIHRvPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+Ci0gIDwvdHI+Ci08L3Rib2R5PjwvdGFibGU+Ci0KLTxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2FwdCBzcmNkaXI9IiR7c3JjfSIKLSAgICAgZGVzdGRpcj0iJHtidWlsZH0iCi0gICAgIGNsYXNzcGF0aD0ieHl6LmphciIKLSAgICAgZGVidWc9Im9uIgotICAgICBjb21waWxlPSJ0cnVlIgotICAgICBmYWN0b3J5PSJjb20ubXljb20uTXlBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSIKLSAgICAgZmFjdG9yeXBhdGhyZWY9Im15LmZhY3RvcnlwYXRoLmlkIgotICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSImZ3Q7Ci0mbHQ7L2FwdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcwotdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCi1UaGUgY2xhc3NwYXRoIHVzZWQgaW5jbHVkZXMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBjb21waWxpbmcgd2l0aAotZGVidWcgaW5mb3JtYXRpb24gaXMgb24uICBJdCBhbHNvIGZvcmNlcyB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIHRvCi1iZSBjb21waWxlZC4gIFRoZSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgd2lsbCBiZSBwbGFjZWQgaW4KLTxjb2RlPiR7cHJlcHJvY2Vzcy5kaXJ9PC9jb2RlPiBkaXJlY3RvcnksIHVzaW5nIHRoZSBjbGFzcwotPGNvZGU+Y29tLm15Y29tLk15QW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk8L2NvZGU+IHRvIHN1cHBseQotQW5ub3RhdGlvblByb2Nlc3NvciBpbnN0YW5jZXMuPC9wPgotCi0KLTxoMz5Ob3RlczwvaDM+Ci0KLTxwPgotVGhlIGluaGVyaXRlZCAiZm9yayIgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlIGJ5IGRlZmF1bHQ7IHBsZWFzZSBkbyBub3QgY2hhbmdlIGl0LgotPC9wPgotCi08cD4KLVRoZSBpbmhlcml0ZWQgImNvbXBpbGVyIiBhdHRyaWJ1dGUgaXMgaWdub3JlZCwgYXMgaXQgaXMgZm9yY2VkIHRvIHVzZSB0aGUgQXB0IGNvbXBpbGVyCi08L3A+Ci0KLTxwPlVzaW5nIHRoZSBBcHQgY29tcGlsZXIgd2l0aCB0aGUgImNvbXBpbGUiIG9wdGlvbiBzZXQgdG8gInRydWUiCi0gICBmb3JjZXMgeW91IHRvIHVzZSBTdW4ncyBBcHQgY29tcGlsZXIsIHdoaWNoIHdpbGwgdXNlIHRoZSBKREsncyBKYXZhYyBjb21waWxlci4KLSAgIElmIHlvdSB3aXNoIHRvIHVzZSBhbm90aGVyIGNvbXBpbGVyLCB5b3Ugd2lsbCBmaXJzdCBuZWVkIHJ1biB0aGUgQXB0IHByb2Nlc3NvcgotICAgd2l0aCB0aGUgImNvbXBpbGUiIGZsYWcgc2V0IHRvICJmYWxzZSIsIGFuZCB0aGVuIHVzZSBhCi0gICA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrIHRvIGNvbXBpbGUgZmlyc3QgeW91ciBvcmlnaW5hbCBzb3VyY2UgY29kZSwgYW5kIHRoZW4gdGhlCi0gICBnZW5lcmF0ZWQgc291cmNlIGNvZGU6PC9wPgotCi08YmxvY2txdW90ZT48cHJlPgotJmx0O2FwdCBzcmNkaXI9IiR7c3JjfSIKLSAgICAgZGVzdGRpcj0iJHtidWlsZH0iCi0gICAgIGNsYXNzcGF0aD0ieHl6LmphciIKLSAgICAgZGVidWc9InRydWUiCi0gICAgIGNvbXBpbGU9ImZhbHNlIgotICAgICBmYWN0b3J5PSJjb20ubXljb20uTXlBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSIKLSAgICAgZmFjdG9yeXBhdGhyZWY9Im15LmZhY3RvcnlwYXRoLmlkIgotICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSImZ3Q7Ci0mbHQ7L2FwdCZndDsKLQotJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmN9IgotICAgICAgIGRlc3RkaXI9IiR7YnVpbGR9IgotICAgICAgIGNsYXNzcGF0aD0ieHl6LmphciIKLSAgICAgICBkZWJ1Zz0ib24iLyZndDsKLQotJmx0O2phdmFjIHNyY2Rpcj0iJHtwcmVwcm9jZXNzLmRpcn0iCi0gICAgICAgZGVzdGRpcj0iJHtidWlsZH0iCi0gICAgICAgY2xhc3NwYXRoPSJ4eXouamFyIgotICAgICAgIGRlYnVnPSJ0cnVlIi8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLVRoaXMgbWF5IGludm9sdmUgbW9yZSBidWlsZCBmaWxlIGNvZGluZywgYnV0IHRoZSBzcGVlZHVwIGdhaW5lZCBmcm9tIHN3aXRjaGluZwotdG8gamlrZXMgbWF5IGp1c3RpZnkgdGhlIGVmZm9ydC4KLTxwPgotPC9wPgotCi08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2F0dHJpYi5odG1sIGIvbWFudWFsL1Rhc2tzL2F0dHJpYi5odG1sCmluZGV4IGEyNmYwYzUuLmFiZjBhYWMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9hdHRyaWIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvYXR0cmliLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzNCArMTUsMzEgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImF0dHJpYiI+QXR0cmliPC9hPjwvaDI+Ci08cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuPC9lbT48L3A+Cis8aDIgaWQ9ImF0dHJpYiI+QXR0cmliPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+LjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPkNoYW5nZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkCi1kaXJlY3Rvcmllcy4gIFJpZ2h0IG5vdyBpdCBoYXMgZWZmZWN0IG9ubHkgdW5kZXIgV2luZG93cy4gRWFjaCBvZiB0aGUKLTQgcG9zc2libGUgcGVybWlzc2lvbnMgaGFzIGl0cyBvd24gYXR0cmlidXRlLCBtYXRjaGluZyB0aGUgYXJndW1lbnRzCi1mb3IgdGhlIGF0dHJpYiBjb21tYW5kLjwvcD4KKzxwPkNoYW5nZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiAgUmlnaHQgbm93IGl0IGhhcworZWZmZWN0IG9ubHkgdW5kZXIgV2luZG93cy4gRWFjaCBvZiB0aGUgNCBwb3NzaWJsZSBwZXJtaXNzaW9ucyBoYXMgaXRzIG93biBhdHRyaWJ1dGUsIG1hdGNoaW5nIHRoZQorYXJndW1lbnRzIGZvciB0aGUgYXR0cmliIGNvbW1hbmQuPC9wPgogCi08cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgCi08YSBocmVmPSIuLi9UeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPnMgb3IgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVMaXN0PC9hPnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZwotbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiBhbmQgCi08Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgPGEgaHJlZj0iLi4vVHlwZXMvZGlyc2V0Lmh0bWwiPkRpclNldDwvYT5zCitvciA8YSBocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT5zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcKK25lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+CitlbGVtZW50cy48L3A+CiAKLTxwPlN0YXJ0aW5nIHdpdGggQW50IDEuNywgdGhpcyB0YXNrIHN1cHBvcnRzIGFyYml0cmFyeSA8YQotaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCi1hcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiwgdGhpcyB0YXNrIHN1cHBvcnRzCithcmJpdHJhcnkgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFzIG5lc3RlZAorZWxlbWVudHMuPC9wPgogCiA8IS0tcD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3aWxsIHVzZSBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCiBhdHRyaWIgY29tbWFuZC4gIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyB0aGlzCkBAIC01MSwxMTcgKzQ5LDEwNCBAQAogdXNlIGhpZ2hseSBkZXBlbmRzIG9uIHRoZSBsZW5ndGggb2YgeW91ciBmaWxlIG5hbWVzICh0aGUgZGVwdGggb2YgeW91cgogZGlyZWN0b3J5IHRyZWUpLCBzbyB5b3UnbGwgaGF2ZSB0byBleHBlcmltZW50IGEgbGl0dGxlLjwvcC0tPgogCi08cD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3b24ndCBkbyBhbnl0aGluZyB1bmxlc3MgaXQgZGV0ZWN0cyBpdCBpcwotICBydW5uaW5nIG9uIGEgV2luZG93cyBzeXN0ZW0uICBJZiB5b3Uga25vdyBmb3Igc3VyZSB0aGF0IHlvdSBoYXZlIGEKLSAgImF0dHJpYiIgZXhlY3V0YWJsZSBvbiB5b3VyIFBBVEggdGhhdCBpcyBjb21tYW5kIGxpbmUgY29tcGF0aWJsZSB3aXRoCi0gIHRoZSBXaW5kb3dzIGNvbW1hbmQsIHlvdSBjYW4gdXNlIHRoZSB0YXNrJ3Mgb3MgYXR0cmlidXRlIGFuZCBzZXQgaXRzCi0gIHZhbHVlIHRvIHlvdXIgY3VycmVudCBvcy48L3A+Cis8cD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3b24ndCBkbyBhbnl0aGluZyB1bmxlc3MgaXQgZGV0ZWN0cyBpdCBpcyBydW5uaW5nIG9uIGEgV2luZG93cyBzeXN0ZW0uICBJZgoreW91IGtub3cgZm9yIHN1cmUgdGhhdCB5b3UgaGF2ZSBhIDxjb2RlPmF0dHJpYjwvY29kZT4gZXhlY3V0YWJsZSBvbiB5b3VyIDxjb2RlPlBBVEg8L2NvZGU+IHRoYXQgaXMKK2NvbW1hbmQgbGluZSBjb21wYXRpYmxlIHdpdGggdGhlIFdpbmRvd3MgY29tbWFuZCwgeW91IGNhbiB1c2UgdGhlIHRhc2sncyA8dmFyPm9zPC92YXI+IGF0dHJpYnV0ZSBhbmQKK3NldCBpdHMgdmFsdWUgdG8geW91ciBjdXJyZW50IE9TLjwvcD4KKworPHA+U2VlIHRoZSA8YSBocmVmPSJzZXRwZXJtaXNzaW9ucy5odG1sIj5zZXRwZXJtaXNzaW9uczwvYT4gdGFzayBmb3IgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudAorYWx0ZXJuYXRpdmUuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBwZXJtaXNzaW9ucyBtdXN0IGJlCi0gICAgY2hhbmdlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgdmFsaWduPSJtaWRkbGUiPlllcyBvciBuZXN0ZWQKLSAgICA8Y29kZT4mbHQ7ZmlsZXNldC9saXN0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBmaWxlIG9yIGRpcmVjdG9yeSBvZiB3aGljaCB0aGUgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLjwvdGQ+CisgICAgPHRkPlllcywgb3IgbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0L2xpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50czwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlYWRvbmx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSByZWFkb25seSBwZXJtaXNzaW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSI0Ij5hdCBsZWFzdCBvbmUgb2YgdGhlIGZvdXIuIDwvdGQ+CisgICAgPHRkPnJlYWRvbmx5PC90ZD4KKyAgICA8dGQ+dGhlIHJlYWRvbmx5IHBlcm1pc3Npb24uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iNCI+QXQgbGVhc3Qgb25lIG9mIHRoZSBmb3VyPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXJjaGl2ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYXJjaGl2ZSBwZXJtaXNzaW9uLjwvdGQ+CisgICAgPHRkPmFyY2hpdmU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGFyY2hpdmUgcGVybWlzc2lvbi48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zeXN0ZW08L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHN5c3RlbSBwZXJtaXNzaW9uLjwvdGQ+CisgICAgPHRkPnN5c3RlbTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij50aGUgc3lzdGVtIHBlcm1pc3Npb24uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aGlkZGVuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBoaWRkZW4gcGVybWlzc2lvbi48L3RkPgorICAgIDx0ZD5oaWRkZW48L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGhpZGRlbiBwZXJtaXNzaW9uLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25lIG9mIDxpPmZpbGU8L2k+LCA8aT5kaXI8L2k+IG9yIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8KLSAgICAgIDxpPmZpbGU8L2k+LCBvbmx5IHRoZSBwZXJtaXNzaW9ucyBvZiBwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4KLSAgICAgIElmIHNldCB0byA8aT5kaXI8L2k+LCBvbmx5IHRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bwotICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKLSAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8cT5maWxlPC9xPiwgPHE+ZGlyPC9xPiBvciA8cT5ib3RoPC9xPi4gSWYgc2V0IHRvIDxxPmZpbGU8L3E+LCBvbmx5IHRoZSBwZXJtaXNzaW9ucworICAgICAgb2YgcGxhaW4gZmlsZXMgYXJlIGdvaW5nIHRvIGJlIGNoYW5nZWQuICBJZiBzZXQgdG8gPHE+ZGlyPC9xPiwgb25seSB0aGUgZGlyZWN0b3JpZXMgYXJlCisgICAgICBjb25zaWRlcmVkLjxici8+CisgICAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxjb2RlPmRpcnNldDwvY29kZT5zJm1kYXNoOzxjb2RlPmRpcnNldDwvY29kZT5zIGFsd2F5cyBpbXBsaWNpdGx5IGFzc3VtZSB0eXBlIHRvCisgICAgICBiZSA8cT5kaXI8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZpbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHByaW50IGEgc3VtbWFyeSBhZnRlciBleGVjdXRpb24gb3Igbm90LgotICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHByaW50IGEgc3VtbWFyeSBhZnRlciBleGVjdXRpb24gb3Igbm90LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8IS0tdHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXJhbGxlbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9jZXNzIGFsbCBzcGVjaWZpZWQgZmlsZXMgdXNpbmcgYSBzaW5nbGUKLSAgICAgIDxjb2RlPmNobW9kPC9jb2RlPiBjb21tYW5kLiBEZWZhdWx0cyB0byB0cnVlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnBhcmFsbGVsPC90ZD4KKyAgICA8dGQ+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlCisgICAgICA8a2JkPmNobW9kPC9rYmQ+IGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0Ci0gICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCi0gICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuICA8ZW0+U2luY2UgQW50IDEuNi48L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1heHBhcmFsbGVsPC90ZD4KKyAgICA8dGQ+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0CisgICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvIG5lZ2F0aXZlIGludGVnZXIgZm9yCisgICAgICB1bmxpbWl0ZWQuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vLCBkZWZhdWx0cyB0byB1bmxpbWl0ZWQ8L3RkPgogICA8L3RyLS0+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlCi0gICAgICBleGVjdXRlZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5vczwvdGQ+CisgICAgPHRkPmxpc3Qgb2YgT3BlcmF0aW5nIFN5c3RlbXMgb24gd2hpY2ggdGhlIGNvbW1hbmQgbWF5IGJlIGV4ZWN1dGVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3NmYW1pbHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T1MgZmFtaWx5IGFzIHVzZWQgaW4KLSAgICAgIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9jb25kaXRpb25zLmh0bWwjb3MiPiZsdDtvcyZndDs8L2E+CisgICAgPHRkPm9zZmFtaWx5PC90ZD4KKyAgICA8dGQ+T1MgZmFtaWx5IGFzIHVzZWQgaW4gdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL2NvbmRpdGlvbnMuaHRtbCNvcyI+Jmx0O29zJmd0OzwvYT4KICAgICAgIGNvbmRpdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gLSBkZWZhdWx0cyB0byAid2luZG93cyI8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+d2luZG93czwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLSAgPGJsb2NrcXVvdGU+CisKKzxwPk1ha2UgdGhlIDxjb2RlPnJ1bi5iYXQ8L2NvZGU+IGZpbGUgcmVhZC1vbmx5IGFuZCBoaWRkZW4uPC9wPgogPHByZT4mbHQ7YXR0cmliIGZpbGU9JnF1b3Q7JHtkaXN0fS9ydW4uYmF0JnF1b3Q7IHJlYWRvbmx5PSZxdW90O3RydWUmcXVvdDsgaGlkZGVuPSZxdW90O3RydWUmcXVvdDsvJmd0OzwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgdGhlICZxdW90O3J1bi5iYXQmcXVvdDsgZmlsZSByZWFkLW9ubHkgYW5kIGhpZGRlbi48L3A+CiAKLTxibG9ja3F1b3RlPgotICA8cHJlPiZsdDthdHRyaWIgcmVhZG9ubHk9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7Cis8cD5NYWtlIGFsbCA8c2FtcD4ueG1sPC9zYW1wPiBmaWxlcyBiZWxvdyA8c2FtcD4ke21ldGEuaW5mfTwvc2FtcD4gcmVhZGFibGUuPC9wPgorPHByZT4mbHQ7YXR0cmliIHJlYWRvbmx5PSZxdW90O2ZhbHNlJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHttZXRhLmluZn0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi54bWwmcXVvdDsvJmd0OwotJmx0Oy9hdHRyaWImZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPm1ha2VzIGFsbCAmcXVvdDsueG1sJnF1b3Q7IGZpbGVzIGJlbG93IDxjb2RlPiR7bWV0YS5pbmZ9PC9jb2RlPiByZWFkYWJsZS48L3A+CismbHQ7L2F0dHJpYiZndDs8L3ByZT4KIAotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Cis8cD5NYWtlIGFsbCBmaWxlcyBiZWxvdyA8c2FtcD5zaGFyZWQvc291cmNlczE8L3NhbXA+IChleGNlcHQgdGhvc2UgYmVsb3cgYW55IGRpcmVjdG9yeQorbmFtZWQgPHNhbXA+dHJpYWw8L3NhbXA+KSByZWFkLW9ubHkgYW5kIGFyY2hpdmVkLiBJbiBhZGRpdGlvbiBhbGwgZmlsZXMgYmVsb25naW5nIHRvIGEgRmlsZVNldAord2l0aCA8dmFyPmlkPC92YXI+IDxzYW1wPm90aGVyLnNoYXJlZC5zb3VyY2VzPC9zYW1wPiBnZXQgdGhlIHNhbWUgYXR0cmlidXRlcy48L3A+Cis8cHJlPgogJmx0O2F0dHJpYiByZWFkb25seT0mcXVvdDt0cnVlJnF1b3Q7IGFyY2hpdmU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NoYXJlZC9zb3VyY2VzMSZxdW90OyZndDsKICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL3RyaWFsLyoqJnF1b3Q7LyZndDsKICAgJmx0Oy9maWxlc2V0Jmd0OwogICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtvdGhlci5zaGFyZWQuc291cmNlcyZxdW90Oy8mZ3Q7Ci0mbHQ7L2F0dHJpYiZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgYWxsIGZpbGVzIGJlbG93IDxjb2RlPnNoYXJlZC9zb3VyY2VzMTwvY29kZT4gKGV4Y2VwdCB0aG9zZSBiZWxvdyBhbnkKLSAgZGlyZWN0b3J5IG5hbWVkIHRyaWFsKSByZWFkLW9ubHkgYW5kIGFyY2hpdmVkLiBJbiBhZGRpdGlvbiBhbGwgZmlsZXMgYmVsb25naW5nCi0gIHRvIGEgRmlsZVNldCB3aXRoIDxjb2RlPmlkPC9jb2RlPiA8Y29kZT5vdGhlci5zaGFyZWQuc291cmNlczwvY29kZT4gZ2V0IHRoZQotICBzYW1lIGF0dHJpYnV0ZXMuPC9wPgotCismbHQ7L2F0dHJpYiZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvYXVnbWVudC5odG1sIGIvbWFudWFsL1Rhc2tzL2F1Z21lbnQuaHRtbAppbmRleCAzMDVlMzlhLi5iOTM0Yzc1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYXVnbWVudC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9hdWdtZW50Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+QXVnbWVudCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDU5ICsyNSw1MSBAQAogPGJvZHk+CiAKIDxoMj5BdWdtZW50PC9oMj4KLQorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjE8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5Nb2RpZnkgYW4gZXhpc3RpbmcgcmVmZXJlbmNlIGJ5IGFkZGluZyBuZXN0ZWQgZWxlbWVudHMgb3IgKHJlLSlhc3NpZ25pbmcgcHJvcGVydGllcwotbWFwcGVkIGFzIFhNTCBhdHRyaWJ1dGVzLiBUaGlzIGlzIGFuIHVudXN1YWwgdGFzayB0aGF0IG1ha2VzIHVzZSBvZiBBbnQncyBpbnRlcm5hbAotcHJvY2Vzc2luZyBtZWNoYW5pc21zIHRvIHJlbG9hZCBhIHByZXZpb3VzbHkgZGVjbGFyZWQgcmVmZXJlbmNlIGJ5IG1lYW5zIG9mIHRoZSAnaWQnCi1hdHRyaWJ1dGUsIHRoZW4gdHJlYXRzIHRoZSBkZWNsYXJlZCA8Y29kZT5hdWdtZW50PC9jb2RlPiBlbGVtZW50IGFzIHRob3VnaCBpdCB3ZXJlIHRoZQotb3JpZ2luYWwgZWxlbWVudC4KLTxiPlNpbmNlIEFwYWNoZSBBbnQgMS44LjE8L2I+PC9wPgorPHA+TW9kaWZ5IGFuIGV4aXN0aW5nIHJlZmVyZW5jZSBieSBhZGRpbmcgbmVzdGVkIGVsZW1lbnRzIG9yIChyZS0pYXNzaWduaW5nIHByb3BlcnRpZXMgbWFwcGVkIGFzIFhNTAorYXR0cmlidXRlcy4gVGhpcyBpcyBhbiB1bnVzdWFsIHRhc2sgdGhhdCBtYWtlcyB1c2Ugb2YgQW50J3MgaW50ZXJuYWwgcHJvY2Vzc2luZyBtZWNoYW5pc21zIHRvIHJlbG9hZAorYSBwcmV2aW91c2x5IGRlY2xhcmVkIHJlZmVyZW5jZSBieSBtZWFucyBvZiB0aGUgPHZhcj5pZDwvdmFyPiBhdHRyaWJ1dGUsIHRoZW4gdHJlYXRzIHRoZQorZGVjbGFyZWQgPGNvZGU+YXVnbWVudDwvY29kZT4gZWxlbWVudCBhcyB0aG91Z2ggaXQgd2VyZSB0aGUgb3JpZ2luYWwgZWxlbWVudC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGlkIG9mIHRoZSByZWZlcmVuY2UgdG8gYXVnbWVudC4gSWYgbm8gc3VjaCByZWZlcmVuY2UgaGFzCi0gICAgICBiZWVuIGRlY2xhcmVkIGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+IGlzIGdlbmVyYXRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+aWQ8L3RkPgorICAgIDx0ZD5UaGUgPHZhcj5pZDwvdmFyPiBvZiB0aGUgcmVmZXJlbmNlIHRvIGF1Z21lbnQuIElmIG5vIHN1Y2ggcmVmZXJlbmNlIGhhcyBiZWVuIGRlY2xhcmVkCisgICAgICBhIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPiBpcyB0aHJvd24uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4KLUFkZGl0aW9uYWwgcGVybWlzc2libGUgYXR0cmlidXRlcyBhcmUgZGVwZW5kZW50IG9uIHRoZSByZWZlcmVuY2UgdG8gYmUgbW9kaWZpZWQuCi08L3A+Cis8cD5BZGRpdGlvbmFsIHBlcm1pc3NpYmxlIGF0dHJpYnV0ZXMgYXJlIGRlcGVuZGVudCBvbiB0aGUgcmVmZXJlbmNlIHRvIGJlIG1vZGlmaWVkLjwvcD4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxwPgotUGVybWlzc2libGUgbmVzdGVkIGVsZW1lbnRzIGFyZSBkZXBlbmRlbnQgb24gdGhlIHJlZmVyZW5jZSB0byBiZSBtb2RpZmllZC4KLTwvcD4KKzxwPlBlcm1pc3NpYmxlIG5lc3RlZCBlbGVtZW50cyBhcmUgZGVwZW5kZW50IG9uIHRoZSByZWZlcmVuY2UgdG8gYmUgbW9kaWZpZWQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi1HaXZlbgotPHByZT4KLSAgJmx0O2ZpbGVzZXQgaWQ9ImlucHV0LWZzIiBkaXI9IiR7YmFzZWRpcn0iIC8mZ3Q7Ci08L3ByZT4KKzxwPkdpdmVuPC9wPgorCis8cHJlPiZsdDtmaWxlc2V0IGlkPSJpbnB1dC1mcyIgZGlyPSIke2Jhc2VkaXJ9Ii8mZ3Q7PC9wcmU+CisKKzxwPmludm9jYXRpb248L3A+CisKKzxwcmU+Jmx0O2F1Z21lbnQgaWQ9ImlucHV0LWZzIiBleGNsdWRlcz0iZm9vIi8mZ3Q7PC9wcmU+CisKKzxwPm1vZGlmaWVzIHRoZSA8dmFyPmV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZSBvZiA8c2FtcD5pbnB1dC1mczwvc2FtcD4sIHdoZXJlYXM8L3A+CiAKIDxwcmU+Ci0gICZsdDthdWdtZW50IGlkPSJpbnB1dC1mcyIgZXhjbHVkZXM9ImZvbyIgLyZndDsKLTwvcHJlPgorJmx0O2F1Z21lbnQgaWQ9ImlucHV0LWZzIiZndDsKKyAgJmx0O2ZpbGVuYW1lIG5hbWU9ImJhciIvJmd0OworJmx0Oy9hdWdtZW50Jmd0OzwvcHJlPgogCi08cD5Nb2RpZmllcyB0aGUgPGNvZGU+ZXhjbHVkZXM8L2NvZGU+IGF0dHJpYnV0ZSBvZiA8Y29kZT5pbnB1dC1mczwvY29kZT4uPC9wPgotCi08cHJlPgotICAmbHQ7YXVnbWVudCBpZD0iaW5wdXQtZnMiJmd0OwotICAgICZsdDtmaWxlbmFtZSBuYW1lPSJiYXIiIC8mZ3Q7Ci0gICZsdDsvYXVnbWVudCZndDsKLTwvcHJlPgotCi08cD5BZGRzIGEgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IHNlbGVjdG9yIHRvIDxjb2RlPmlucHV0LWZzPC9jb2RlPi48L3A+Cis8cD5hZGRzIGEgPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IHNlbGVjdG9yIHRvIDxzYW1wPmlucHV0LWZzPC9zYW1wPi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9hdmFpbGFibGUuaHRtbCBiL21hbnVhbC9UYXNrcy9hdmFpbGFibGUuaHRtbAppbmRleCA2ZTRhMTcxLi43YjI0NmUwIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYXZhaWxhYmxlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2F2YWlsYWJsZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTQ3ICsxNSwxNDAgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkF2YWlsYWJsZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJhdmFpbGFibGUiPkF2YWlsYWJsZTwvYT48L2gyPgorPGgyIGlkPSJhdmFpbGFibGUiPkF2YWlsYWJsZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1bnRpbWUuIFRoaXMgcmVzb3VyY2UgY2FuIGJlIGEKLWZpbGUsIGEgZGlyZWN0b3J5LCBhIGNsYXNzIGluIHRoZSBjbGFzc3BhdGgsIG9yIGEgSlZNIHN5c3RlbSByZXNvdXJjZS48L3A+Ci08cD5JZiB0aGUgcmVzb3VyY2UgaXMgcHJlc2VudCwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCB0byB0cnVlIGJ5Ci1kZWZhdWx0OyBvdGhlcndpc2UsIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8KLXNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJ5IHNwZWNpZnlpbmcgdGhlIDxjb2RlPnZhbHVlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgotPHA+Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZCB0YXJnZXQKLWV4ZWN1dGlvbiBkZXBlbmRpbmcgb24gc3lzdGVtIHBhcmFtZXRlcnMuPC9wPgorPHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0IHJ1biB0aW1lLiBUaGlzIHJlc291cmNlIGNhbiBiZSBhIGZpbGUsIGEgZGlyZWN0b3J5LAorYSBjbGFzcyBpbiB0aGUgY2xhc3NwYXRoLCBvciBhIEpWTSBzeXN0ZW0gcmVzb3VyY2UuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBhIGNsYXNzIGlzIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoIHdoZW4gaXQgY2FuIGJlIGxvYWRlZDsgaS5lLiwgYWxsCitjbGFzc2VzIGl0IGRlcGVuZHMgb24gbXVzdCBiZSBpbiB0aGUgY2xhc3NwYXRoLCB0b28uPC9wPgorPHA+SWYgdGhlIHJlc291cmNlIGlzIHByZXNlbnQsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4gYnkgZGVmYXVsdDsgb3RoZXJ3aXNlLCB0aGUKK3Byb3BlcnR5IGlzIG5vdCBzZXQuIFlvdSBjYW4gc2V0IHRoZSB2YWx1ZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nCit0aGUgPHZhcj52YWx1ZTwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorPHA+Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZCB0YXJnZXQgZXhlY3V0aW9uIGRlcGVuZGluZworb24gc3lzdGVtIHBhcmFtZXRlcnMuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uIERlZmF1bHRzIHRvICZxdW90O3RydWUmcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzIHRvIGxvb2sgZm9yIGluIHRoZSBjbGFzc3BhdGguPC90ZD4KLSAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjMiPlllczwvdGQ+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkPlRoZSBjbGFzcyB0byBsb29rIGZvciBpbiB0aGUgY2xhc3NwYXRoLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPkV4YWN0bHkgb25lIG9mIHRoZSB0aHJlZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gbG9vayBmb3IuPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgZmlsZSB0byBsb29rIGZvci48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgaW4gdGhlIEpWTS48L3RkPgorICAgIDx0ZD5yZXNvdXJjZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgaW4gdGhlIEpWTS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIDxjb2RlPmNsYXNzbmFtZTwvY29kZT4gb3IgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8dmFyPmNsYXNzbmFtZTwvdmFyPiBvciA8dmFyPnJlc291cmNlPC92YXI+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8Y29kZT5maWxlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5maWxlcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgPHZhcj5maWxlPC92YXI+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aAorICAgIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdHlwZSBvZiA8Y29kZT5maWxlPC9jb2RlPiB0byBsb29rIGZvciwgZWl0aGVyIGEgZGlyZWN0b3J5ICg8Y29kZT50eXBlPSZxdW90O2RpciZxdW90OzwvY29kZT4pIG9yIGEgZmlsZQotICAgICAgKDxjb2RlPnR5cGU9JnF1b3Q7ZmlsZSZxdW90OzwvY29kZT4pLiBJZiBub3Qgc2V0LCB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgaWYgdGhlIG5hbWUgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5maWxlPC9jb2RlPgotICAgICAgYXR0cmlidXRlIGV4aXN0cyBhcyBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5UaGUgdHlwZSBvZiA8dmFyPmZpbGU8L3Zhcj4gdG8gbG9vayBmb3IsIGVpdGhlciBhIGRpcmVjdG9yeSAoPHZhcj50eXBlPC92YXI+PTxxPmRpcjwvcT4pIG9yCisgICAgYSBmaWxlICg8dmFyPnR5cGU8L3Zhcj49PHE+ZmlsZTwvcT4pLiBJZiBub3Qgc2V0LCB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgaWYgdGhlIG5hbWUgc3BlY2lmaWVkCisgICAgaW4gdGhlIDx2YXI+ZmlsZTwvdmFyPiBhdHRyaWJ1dGUgZXhpc3RzIGFzIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVzeXN0ZW1jbGFzc2VzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklnbm9yZSBBbnQncyBydW50aW1lIGNsYXNzZXMsIHVzaW5nIG9ubHkgdGhlIHNwZWNpZmllZAotICAgICAgY2xhc3NwYXRoLiAgT25seSBhZmZlY3RzIHRoZSAiY2xhc3NuYW1lIiBhdHRyaWJ1dGUuICBEZWZhdWx0cyB0byAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlnbm9yZXN5c3RlbWNsYXNzZXM8L3RkPgorICAgIDx0ZD5JZ25vcmUgQW50J3MgcnVudGltZSBjbGFzc2VzLCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoLiAgT25seSBhZmZlY3RzCisgICAgdGhlIDx2YXI+Y2xhc3NuYW1lPC92YXI+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VhcmNocGFyZW50czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNvbnRhaW5zIHRoZSBiZWhhdmlvdXIgb2YgdGhlICJmaWxlIiB0eXBlLgotICAgICAgSWYgdHJ1ZSwgdGhlIGF2YWlsYWJsZSB0YXNrIHdpbGwsIHdoZW4KLSAgICAgIHNlYXJjaGluZyBmb3IgYSBmaWxlLCBzZWFyY2ggbm90IG9ubHkgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBidXQKLSAgICAgIHdpbGwgYWxzbyBzZWFyY2ggdGhlIHBhcmVudCBkaXJlY3RvcmllcyBvZiB0aG9zZQotICAgICAgc3BlY2lmaWVkLgotICAgICAgSWYgZmFsc2UsIG9ubHkgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCB3aWxsIGJlIHNlYXJjaGVkLgotICAgICAgRGVmYXVsdHMgdG8gImZhbHNlIi4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zZWFyY2hwYXJlbnRzPC90ZD4KKyAgICA8dGQ+VGhpcyBjb250YWlucyB0aGUgYmVoYXZpb3VyIG9mIHRoZSA8cT5maWxlPC9xPiA8dmFyPnR5cGU8L3Zhcj4uICBJZiA8cT50cnVlPC9xPiwgdGhlIHRhc2sKKyAgICB3aWxsLCB3aGVuIHNlYXJjaGluZyBmb3IgYSBmaWxlLCBzZWFyY2ggbm90IG9ubHkgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBidXQgd2lsbCBhbHNvIHNlYXJjaAorICAgIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgb2YgdGhvc2Ugc3BlY2lmaWVkLiAgSWYgPHE+ZmFsc2U8L3E+LCBvbmx5IHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgd2lsbAorICAgIGJlIHNlYXJjaGVkLiAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PmNsYXNzcGF0aDwvaDQ+Ci08cD48Y29kZT5BdmFpbGFibGU8L2NvZGU+J3MgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAorPHA+PGNvZGU+QXZhaWxhYmxlPC9jb2RlPidzIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGF0dHJpYnV0ZSBpcworYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCiA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CiA8aDQ+ZmlsZXBhdGg8L2g0PgotPHA+PGNvZGU+QXZhaWxhYmxlPC9jb2RlPidzIDxjb2RlPmZpbGVwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAotPGNvZGU+Jmx0O2ZpbGVwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Cis8cD48Y29kZT5BdmFpbGFibGU8L2NvZGU+J3MgPHZhcj5maWxlcGF0aDwvdmFyPiBhdHRyaWJ1dGUgaXMKK2EgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhCituZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CisKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2F2YWlsYWJsZSBjbGFzc25hbWU9JnF1b3Q7b3JnLndoYXRldmVyLk15Y2xhc3MmcXVvdDsgcHJvcGVydHk9JnF1b3Q7TXljbGFzcy5wcmVzZW50JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnNldHMgdGhlIDxjb2RlPk15Y2xhc3MucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlICZxdW90O3RydWUmcXVvdDsKLWlmIHRoZSBjbGFzcyA8Y29kZT5vcmcud2hhdGV2ZXIuTXljbGFzczwvY29kZT4gaXMgZm91bmQgaW4gQW50J3MgY2xhc3NwYXRoLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5TZXQgdGhlIDxjb2RlPk15Y2xhc3MucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlIDxxPnRydWU8L3E+IGlmIHRoZQorY2xhc3MgPGNvZGU+b3JnLndoYXRldmVyLk15Y2xhc3M8L2NvZGU+IGlzIGZvdW5kIGluIEFudCdzIGNsYXNzcGF0aC48L3A+Cis8cHJlPiZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O29yZy53aGF0ZXZlci5NeWNsYXNzJnF1b3Q7IHByb3BlcnR5PSZxdW90O015Y2xhc3MucHJlc2VudCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlNldCB0aGUgPGNvZGU+amF4cC5qYXIucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlIDxxPnRydWU8L3E+IGlmIHRoZQorZmlsZSA8c2FtcD4uL2xpYi9qYXhwMTEvamF4cC5qYXI8L3NhbXA+IGlzIGZvdW5kLjwvcD4KKzxwcmU+CiAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtqYXhwLmphciZxdW90OyB2YWx1ZT0mcXVvdDsuL2xpYi9qYXhwMTEvamF4cC5qYXImcXVvdDsvJmd0OwotJmx0O2F2YWlsYWJsZSBmaWxlPSZxdW90OyR7amF4cC5qYXJ9JnF1b3Q7IHByb3BlcnR5PSZxdW90O2pheHAuamFyLnByZXNlbnQmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+c2V0cyB0aGUgPGNvZGU+amF4cC5qYXIucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlICZxdW90O3RydWUmcXVvdDsKLWlmIHRoZSBmaWxlIDxjb2RlPi4vbGliL2pheHAxMS9qYXhwLmphcjwvY29kZT4gaXMgZm91bmQuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDthdmFpbGFibGUgZmlsZT0mcXVvdDske2pheHAuamFyfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXhwLmphci5wcmVzZW50JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+U2V0IHRoZSA8Y29kZT5sb2NhbC5saWIucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlIDxxPnRydWU8L3E+IGlmIHRoZQorZGlyZWN0b3J5IDxzYW1wPi91c3IvbG9jYWwvbGliPC9zYW1wPiBpcyBmb3VuZC48L3A+Cis8cHJlPgogJmx0O2F2YWlsYWJsZSBmaWxlPSZxdW90Oy91c3IvbG9jYWwvbGliJnF1b3Q7IHR5cGU9JnF1b3Q7ZGlyJnF1b3Q7Ci0gICAgICAgICAgIHByb3BlcnR5PSZxdW90O2xvY2FsLmxpYi5wcmVzZW50JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnNldHMgdGhlIDxjb2RlPmxvY2FsLmxpYi5wcmVzZW50PC9jb2RlPiBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgJnF1b3Q7dHJ1ZSZxdW90OwotaWYgdGhlIGRpcmVjdG9yeSA8Y29kZT4vdXNyL2xvY2FsL2xpYjwvY29kZT4gaXMgZm91bmQuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgICAgICAgcHJvcGVydHk9JnF1b3Q7bG9jYWwubGliLnByZXNlbnQmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TZXQgdGhlIDxjb2RlPmpheHAxMS5wcmVzZW50PC9jb2RlPiBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgPHE+dHJ1ZTwvcT4gaWYgdGhlCitjbGFzcyA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyPC9jb2RlPiBpcyBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoIHJlZmVyZW5jZWQKK2J5IDxzYW1wPmpheHA8L3NhbXA+IChpbiB0aGlzIGNhc2UsIDxzYW1wPi4vbGliL2pheHAxMS9qYXhwLmphcjwvc2FtcD4pLjwvcD4KKzxwcmU+CiAuLi5pbiBwcm9qZWN0IC4uLgogJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7amF4cC5qYXImcXVvdDsgdmFsdWU9JnF1b3Q7Li9saWIvamF4cDExL2pheHAuamFyJnF1b3Q7LyZndDsKICZsdDtwYXRoIGlkPSZxdW90O2pheHAmcXVvdDsgbG9jYXRpb249JnF1b3Q7JHtqYXhwLmphcn0mcXVvdDsvJmd0OwogLi4uaW4gdGFyZ2V0IC4uLgogJmx0O2F2YWlsYWJsZSBjbGFzc25hbWU9JnF1b3Q7amF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciZxdW90OwotICAgICAgICAgICBjbGFzc3BhdGhyZWY9JnF1b3Q7amF4cCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXhwMTEucHJlc2VudCZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5zZXRzIHRoZSA8Y29kZT5qYXhwMTEucHJlc2VudDwvY29kZT4gcHJvcGVydHkgdG8gdGhlIHZhbHVlICZxdW90O3RydWUmcXVvdDsKLWlmIHRoZSBjbGFzcyA8Y29kZT5qYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyPC9jb2RlPiBpcyBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoIHJlZmVyZW5jZWQgYnkgPGNvZGU+amF4cDwvY29kZT4gKGluIHRoaXMgY2FzZSwgPGNvZGU+Li9saWIvamF4cDExL2pheHAuamFyPC9jb2RlPikuCi08L3A+Ci08YmxvY2txdW90ZT48cHJlPgorICAgICAgICAgICBjbGFzc3BhdGhyZWY9JnF1b3Q7amF4cCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXhwMTEucHJlc2VudCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlNldCB0aGUgPGNvZGU+aGF2ZS5leHRyYXM8L2NvZGU+IHByb3BlcnR5IHRvIHRoZSB2YWx1ZSA8cT50cnVlPC9xPiBpZiB0aGUgcmVzb3VyY2UKK2ZpbGUgPHNhbXA+ZXh0cmF0YXNrcy5wcm9wZXJ0aWVzPC9zYW1wPiBpcyBmb3VuZC48L3A+Cis8cHJlPgogJmx0O2F2YWlsYWJsZSBwcm9wZXJ0eT0mcXVvdDtoYXZlLmV4dHJhcyZxdW90OyByZXNvdXJjZT0mcXVvdDtleHRyYXRhc2tzLnByb3BlcnRpZXMmcXVvdDsmZ3Q7CiAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90Oy91c3IvbG9jYWwvYW50L2V4dHJhLmphciZxdW90OyAvJmd0OwotJm5ic3A7Jm5ic3A7Jmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0mbHQ7L2F2YWlsYWJsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnNldHMgdGhlIDxjb2RlPmhhdmUuZXh0cmFzPC9jb2RlPiBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgJnF1b3Q7dHJ1ZSZxdW90OwotaWYgdGhlIHJlc291cmNlLWZpbGUgPGNvZGU+ZXh0cmF0YXNrcy5wcm9wZXJ0aWVzPC9jb2RlPiBpcyBmb3VuZC4KLTwvcD4KLQorICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDsvdXNyL2xvY2FsL2FudC9leHRyYS5qYXImcXVvdDsvJmd0OworICAmbHQ7L2NsYXNzcGF0aCZndDsKKyZsdDsvYXZhaWxhYmxlJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9iYXNlbmFtZS5odG1sIGIvbWFudWFsL1Rhc2tzL2Jhc2VuYW1lLmh0bWwKaW5kZXggMDgyMmQ4Zi4uYWM1YTJkMyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2Jhc2VuYW1lLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2Jhc2VuYW1lLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw3OSArMTUsNjYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkJhc2VuYW1lIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImVjaG8iPkJhc2VuYW1lPC9hPjwvaDI+Cis8aDIgaWQ9ImVjaG8iPkJhc2VuYW1lPC9oMj4KKwogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPgotVGFzayB0byBkZXRlcm1pbmUgdGhlIGJhc2VuYW1lIG9mIGEgc3BlY2lmaWVkIGZpbGUsIG9wdGlvbmFsbHkgbWludXMgYQotc3BlY2lmaWVkIHN1ZmZpeC4KLTwvcD4KLTxwPgotV2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlCi12YWx1ZSBvZiB0aGUgbGFzdCBwYXRoIGVsZW1lbnQgb2YgdGhlIHNwZWNpZmllZCBmaWxlLiBJZiA8Y29kZT5maWxlPC9jb2RlPiBpcyBhCi1kaXJlY3RvcnksIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBsYXN0IGRpcmVjdG9yeSBlbGVtZW50LiBJZgotPGNvZGU+ZmlsZTwvY29kZT4gaXMgYSBmdWxsLXBhdGgsIHJlbGF0aXZlLXBhdGgsIG9yIHNpbXBsZSBmaWxlbmFtZSwKLXRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBzaW1wbGUgZmlsZSBuYW1lLCB3aXRob3V0IGFueSBkaXJlY3RvcnkgZWxlbWVudHMuCi08L3A+Ci08cD4gCis8cD5UYXNrIHRvIGRldGVybWluZSB0aGUgYmFzZW5hbWUgb2YgYSBzcGVjaWZpZWQgZmlsZSwgb3B0aW9uYWxseSBtaW51cyBhIHNwZWNpZmllZCBzdWZmaXguPC9wPgorPHA+V2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlIHZhbHVlIG9mIHRoZSBsYXN0IHBhdGggZWxlbWVudAorb2YgdGhlIHNwZWNpZmllZCBmaWxlLiBJZiA8dmFyPmZpbGU8L3Zhcj4gaXMgYSBkaXJlY3RvcnksIHRoZSBiYXNlbmFtZSB3aWxsIGJlIHRoZSBsYXN0IGRpcmVjdG9yeQorZWxlbWVudC4gSWYgPHZhcj5maWxlPC92YXI+IGlzIGEgZnVsbC1wYXRoLCByZWxhdGl2ZS1wYXRoLCBvciBzaW1wbGUgZmlsZW5hbWUsIHRoZSBiYXNlbmFtZSB3aWxsIGJlCit0aGUgc2ltcGxlIGZpbGUgbmFtZSwgd2l0aG91dCBhbnkgZGlyZWN0b3J5IGVsZW1lbnRzLjwvcD4KKwogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXRoIHRvIHRha2UgdGhlIGJhc2VuYW1lIG9mLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+VGhlIHBhdGggdG8gdGFrZSB0aGUgYmFzZW5hbWUgb2YuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3VmZml4IHRvIHJlbW92ZSBmcm9tIHRoZSByZXN1bHRpbmcgYmFzZW5hbWUKLSAgICAgIChzcGVjaWZpZWQgZWl0aGVyIHdpdGggb3Igd2l0aG91dCB0aGUgJnF1b3Q7PGNvZGU+LjwvY29kZT4mcXVvdDspLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN1ZmZpeDwvdGQ+CisgICAgPHRkPlRoZSBzdWZmaXggdG8gcmVtb3ZlIGZyb20gdGhlIHJlc3VsdGluZyBiYXNlbmFtZSAoc3BlY2lmaWVkIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQKKyAgICB0aGUgPHE+LjwvcT4pLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2Jhc2VuYW1lIHByb3BlcnR5PSZxdW90O2phci5maWxlbmFtZSZxdW90OyBmaWxlPSZxdW90OyR7bGliLmphcmZpbGV9JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdpbGwgc2V0IDxjb2RlPmphci5maWxlbmFtZTwvY29kZT4gdG8KLTxjb2RlPm15amFyLmphcjwvY29kZT4sIGlmIDxjb2RlPmxpYi5qYXJmaWxlPC9jb2RlPiBpcyBkZWZpbmVkIGFzIGVpdGhlciBhCi1mdWxsLXBhdGggZmlsZW5hbWUgKGVnLiwgPGNvZGU+L3Vzci9sb2NhbC9saWIvbXlqYXIuamFyPC9jb2RlPiksCi1hIHJlbGF0aXZlLXBhdGggZmlsZW5hbWUgKGVnLiwgPGNvZGU+bGliL215amFyLmphcjwvY29kZT4pLAotb3IgYSBzaW1wbGUgZmlsZW5hbWUgKGVnLiwgPGNvZGU+bXlqYXIuamFyPC9jb2RlPikuCi08YmxvY2txdW90ZT48cHJlPgorPHA+U2V0IDxjb2RlPmphci5maWxlbmFtZTwvY29kZT4gdG8gPHNhbXA+bXlqYXIuamFyPC9zYW1wPiwgaWYgPGNvZGU+bGliLmphcmZpbGU8L2NvZGU+IGlzIGRlZmluZWQKK2FzIGVpdGhlciBhIGZ1bGwtcGF0aCBmaWxlbmFtZSAoZWcuLCA8c2FtcD4vdXNyL2xvY2FsL2xpYi9teWphci5qYXI8L3NhbXA+KSwgYSByZWxhdGl2ZS1wYXRoCitmaWxlbmFtZSAoZWcuLCA8c2FtcD5saWIvbXlqYXIuamFyPC9zYW1wPiksIG9yIGEgc2ltcGxlIGZpbGVuYW1lIChlZy4sIDxzYW1wPm15amFyLmphcjwvc2FtcD4pLjwvcD4KKzxwcmU+Jmx0O2Jhc2VuYW1lIHByb3BlcnR5PSZxdW90O2phci5maWxlbmFtZSZxdW90OyBmaWxlPSZxdW90OyR7bGliLmphcmZpbGV9JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+U2V0IDxjb2RlPmNtZG5hbWU8L2NvZGU+IHRvIDxzYW1wPmZvbzwvc2FtcD4uPC9wPgorPHByZT4KICZsdDtiYXNlbmFtZSBwcm9wZXJ0eT0mcXVvdDtjbWRuYW1lJnF1b3Q7IGZpbGU9JnF1b3Q7RDovdXNyL2xvY2FsL2Zvby5leGUmcXVvdDsKLSAgICAgICAgICBzdWZmaXg9JnF1b3Q7LmV4ZSZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci13aWxsIHNldCA8Y29kZT5jbWRuYW1lPC9jb2RlPiB0byA8Y29kZT5mb288L2NvZGU+LgotPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgICAgICBzdWZmaXg9JnF1b3Q7LmV4ZSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlNldCA8Y29kZT50ZW1wLmRpcm5hbWU8L2NvZGU+IHRvIHRoZSBsYXN0IGRpcmVjdG9yeSBlbGVtZW50IG9mIHRoZSBwYXRoIGRlZmluZWQgZm9yCit0aGUgPGNvZGU+VEVNUDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuPC9wPgorPHByZT4KICZsdDtwcm9wZXJ0eSBlbnZpcm9ubWVudD0mcXVvdDtlbnYmcXVvdDsvJmd0OwogJmx0O2Jhc2VuYW1lIHByb3BlcnR5PSZxdW90O3RlbXAuZGlybmFtZSZxdW90OyBmaWxlPSZxdW90OyR7ZW52LlRFTVB9JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotd2lsbCBzZXQgPGNvZGU+dGVtcC5kaXJuYW1lPC9jb2RlPiB0byB0aGUgbGFzdCBkaXJlY3RvcnkgZWxlbWVudCBvZgotdGhlIHBhdGggZGVmaW5lZCBmb3IgdGhlIDxjb2RlPlRFTVA8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLjwvcD4KLQotCis8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvYmluZHRhcmdldHMuaHRtbCBiL21hbnVhbC9UYXNrcy9iaW5kdGFyZ2V0cy5odG1sCmluZGV4IGQ4Mzc0YTQuLmYxMzhmNzUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9iaW5kdGFyZ2V0cy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9iaW5kdGFyZ2V0cy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNzkgKzE1LDY4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5CaW5kdGFyZ2V0cyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJhbnQiPkJpbmR0YXJnZXRzPC9hPjwvaDI+Cis8aDIgaWQ9ImFudCI+QmluZHRhcmdldHM8L2gyPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjI8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPk1ha2Ugc29tZSB0YXJnZXQgdGhlIGV4dGVuc2lvbiBvZiBzb21lIGRlZmluZWQKLTxhIGhyZWY9Ii4uL3RhcmdldHMuaHRtbCNleHRlbnNpb24tcG9pbnRzIj5leHRlbnNpb24gcG9pbnQ8L2E+LiBJdCB3aWxsIG1ha2UgdGhlCi1saXN0IG9mIHRhcmdldHMgZGVwZW5kZW5jaWVzIG9mIHRoZSBleHRlbnNpb24gcG9pbnQuPC9wPgorPHA+TWFrZSBzb21lIHRhcmdldCB0aGUgZXh0ZW5zaW9uIG9mIHNvbWUKK2RlZmluZWQgPGEgaHJlZj0iLi4vdGFyZ2V0cy5odG1sI2V4dGVuc2lvbi1wb2ludHMiPmV4dGVuc2lvbiBwb2ludDwvYT4uIEl0IHdpbGwgbWFrZSB0aGUgbGlzdCBvZgordGFyZ2V0cyBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dGVuc2lvbiBwb2ludC48L3A+CiAKLTxwPlRoaXMgdGFyZ2V0IGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGhhdmUgYSB0YXJnZXQgcGFydGljaXBhdGUgdG8gYW5vdGhlcgotYnVpbGQgd29ya2Zsb3csIGJ1aWxkIHdvcmtmbG93IHdoaWNoIGV4cGxpY2l0bHkgZXhwb3NlIGFuIGV4dGVuc2lvbiBwb2ludCBmb3IKLXRoYXQga2luZCBvZiBpbnNlcnRpb24uIEJ1dCB0aGUgdGFyZ2V0IHRvIGJpbmQgYW5kIHRoZSBleHRlbnNpb24gcG9pbnQgdG8KLWJpbmQgdG8gYXJlIGJvdGggZGVjbGFyZWQgaW4gc29tZSBpbXBvcnRlZCBidWlsZCBmaWxlcy4gTW9kaWZ5aW5nIGRpcmVjdGx5IHRoZQotdGFyZ2V0IGRlcGVuZGVuY3kgZ3JhcGggb2YgdGhlc2UgZXh0ZXJuYWwgYnVpbGQgZmlsZXMgbWF5IGhhdmUgYSBzaWRlIGVmZmVjdAotb24gc29tZSBvdGhlciBwcm9qZWN0IHdoaWNoIGltcG9ydCB0aGVtLiBUaGlzIHRhc2sgaGVscHMgdGhlbiB0byBtb2RpZnkgdGhlCi10YXJnZXQgZGVwZW5kZW5jaWVzIGJ1dCBvbmx5IGluIHlvdXIgY29udGV4dC4KLTwvcD4KKzxwPlRoaXMgdGFyZ2V0IGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGhhdmUgYSB0YXJnZXQgdG8gcGFydGljaXBhdGUgaW4gYW5vdGhlciBidWlsZCB3b3JrZmxvdword2hpY2ggZXhwbGljaXRseSBleHBvc2VzIGFuIGV4dGVuc2lvbiBwb2ludCBmb3IgdGhhdCBraW5kIG9mIGluc2VydGlvbi4gVGh1cyB0aGUgdGFyZ2V0IHRvIGJpbmQgYW5kCit0aGUgZXh0ZW5zaW9uIHBvaW50IHRvIGJpbmQgdG8gYXJlIGJvdGggZGVjbGFyZWQgaW4gc29tZSBpbXBvcnRlZCBidWlsZCBmaWxlcy4gQnV0IGRpcmVjdGx5Cittb2RpZnlpbmcgdGhlIHRhcmdldCBkZXBlbmRlbmN5IGdyYXBoIG9mIHRoZXNlIGV4dGVybmFsIGJ1aWxkIGZpbGVzIG1heSBoYXZlIGEgc2lkZSBlZmZlY3Qgb24gc29tZQorb3RoZXIgcHJvamVjdCB3aGljaCBpbXBvcnRzIHRoZW0uIFRoaXMgdGFzayBoZWxwcyB0byBtb2RpZnkgdGhlIHRhcmdldCBkZXBlbmRlbmNpZXMgYnV0IG9ubHkgaW4geW91cgorY29udGV4dC48L3A+CiAKLTxwPk5vdGU6IHRoaXMgdGFzayBpcyBxdWl0ZSBlcXVpdmFsZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGFuIGludGVybWVkaWF0ZQotdGFyZ2V0IHdoaWNoIHdpbGwgYmUgdGhlIGJyaWRnZSBiZXR3ZWVuIHRoZSB0YXJnZXQgdG8gYmluZCBhbmQgdGhlIGV4dGVuc2lvbgotcG9pbnQuIEZvciBpbnN0YW5jZToKLTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Jmx0O2JpbmR0YXJnZXRzIHRhcmdldHM9ImphcixqYXZhZG9jIiBleHRlbnNpb25Qb2ludD0iZGlzdCIgLyZndDs8L3ByZT48L2Jsb2NrcXVvdGU+Ci1pcyBxdWl0ZSBlcXVpdmFsZW50IHRvOgotPGJsb2NrcXVvdGU+PHByZT4mbHQ7dGFyZ2V0IG5hbWU9ImJpbmQtdG8tZGlzdCIgZGVwZW5kcz0iamFyLGphdmFkb2MiIGV4dGVuc2lvbk9mPSJkaXN0IiAvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVGhpcyB0YXNrIGJhc2ljYWxseSBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSB0YXJnZXQuCi08L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoaXMgdGFzayBpcyBxdWl0ZSBlcXVpdmFsZW50IHRvIHRoZSBkZWZpbml0aW9uIG9mIGFuIGludGVybWVkaWF0ZSB0YXJnZXQKK3doaWNoIHdpbGwgYmUgdGhlIGJyaWRnZSBiZXR3ZWVuIHRoZSB0YXJnZXQgdG8gYmluZCBhbmQgdGhlIGV4dGVuc2lvbiBwb2ludC4gRm9yIGluc3RhbmNlOjwvcD4KKzxwcmU+Jmx0O2JpbmR0YXJnZXRzIHRhcmdldHM9ImphcixqYXZhZG9jIiBleHRlbnNpb25Qb2ludD0iZGlzdCIvJmd0OzwvcHJlPgorPHA+aXMgcXVpdGUgZXF1aXZhbGVudCB0bzo8L3A+Cis8cHJlPiZsdDt0YXJnZXQgbmFtZT0iYmluZC10by1kaXN0IiBkZXBlbmRzPSJqYXIsamF2YWRvYyIgZXh0ZW5zaW9uT2Y9ImRpc3QiLyZndDs8L3ByZT4KKzxwPlRoaXMgdGFzayBiYXNpY2FsbHkgYXZvaWRzIHRoZSBjcmVhdGlvbiBvZiBhIHRhcmdldC48L3A+CiAKLTxwPlRoZSBiaW5kdGFyZ2V0cyB0YXNrIG1heSBvbmx5IGJlIHVzZWQgYXMgYSB0b3AtbGV2ZWwgdGFzay4gVGhpcyBtZWFucyB0aGF0Ci1pdCBtYXkgbm90IGJlIHVzZWQgaW4gYSB0YXJnZXQuIFRoaXMgaXMgbWFraW5nIHRoZSB0YXJnZXQgZGVwZW5kZW5jeSBncmFwaCBzdGF0aWMKLWFuZCBwcmVkaWN0YWJsZSBhcyBzb29uIGFzIGV2ZXJ5IGJ1aWxkIGZpbGUgaXMgbG9hZGVkLjwvcD4KLQotPHA+PGI+U2luY2UgQXBhY2hlIEFudCAxLjguMjwvYj48L3A+Cis8cD5UaGUgPGNvZGU+YmluZHRhcmdldHM8L2NvZGU+IHRhc2sgbWF5IG9ubHkgYmUgdXNlZCBhcyBhIHRvcC1sZXZlbCB0YXNrLiBUaGlzIG1lYW5zIHRoYXQgaXQgbWF5Citub3QgYmUgdXNlZCBpbiBhIHRhcmdldC4gVGhpcyBpcyBtYWtpbmcgdGhlIHRhcmdldCBkZXBlbmRlbmN5IGdyYXBoIHN0YXRpYyBhbmQgcHJlZGljdGFibGUgYXMgc29vbgorYXMgZXZlcnkgYnVpbGQgZmlsZSBpcyBsb2FkZWQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRhcmdldHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXQgbmFtZXMgdG8gYmluZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dGFyZ2V0czwvdGQ+CisgICAgPHRkPmEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0IG5hbWVzIHRvIGJpbmQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZW5zaW9uUG9pbnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBwb2ludCB0byBiaW5kIHRoZSB0YXJnZXRzIHRvLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5leHRlbnNpb25Qb2ludDwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gcG9pbnQgdG8gYmluZCB0aGUgdGFyZ2V0cyB0by48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vbk1pc3NpbmdFeHRlbnNpb25Qb2ludDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGF0IHRvIGRvIGlmIHRoaXMgdGFyZ2V0IHRyaWVzIHRvIGV4dGVuZCBhIG1pc3NpbmcKLSAgICAgICAgPGEgaHJlZj0iLi4vdGFyZ2V0cy5odG1sI2V4dGVuc2lvbi1wb2ludHMiPmV4dGVuc2lvbi1wb2ludDwvYT4uICgiZmFpbCIsCi0gICAgICAgICJ3YXJuIiwgImlnbm9yZSIpLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT48L3RkPgorICAgIDx0ZD5vbk1pc3NpbmdFeHRlbnNpb25Qb2ludDwvdGQ+CisgICAgPHRkPldoYXQgdG8gZG8gaWYgdGhpcyB0YXJnZXQgdHJpZXMgdG8gZXh0ZW5kIGEKKyAgICBtaXNzaW5nIDxhIGhyZWY9Ii4uL3RhcmdldHMuaHRtbCNleHRlbnNpb24tcG9pbnRzIj5leHRlbnNpb24tcG9pbnQ8L2E+OiA8cT5mYWlsPC9xPiwgPHE+d2FybjwvcT4sIDxxPmlnbm9yZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhaWw8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2JpbmR0YXJnZXRzIHRhcmdldHM9JnF1b3Q7YnVpbGQtamFyLGJ1aWxkLXNyYy1qYXImcXVvdDsgZXh0ZW5zaW9uUG9pbnQ9JnF1b3Q7ZGlzdCZxdW90OyAvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHByZT4mbHQ7YmluZHRhcmdldHMgdGFyZ2V0cz0mcXVvdDtidWlsZC1qYXIsYnVpbGQtc3JjLWphciZxdW90OyBleHRlbnNpb25Qb2ludD0mcXVvdDtkaXN0JnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2J1aWxkbnVtYmVyLmh0bWwgYi9tYW51YWwvVGFza3MvYnVpbGRudW1iZXIuaHRtbAppbmRleCBhYWFhMTRjLi5jMTNiNDhkIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvYnVpbGRudW1iZXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvYnVpbGRudW1iZXIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDYxICsxNSw0NCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+QnVpbGROdW1iZXIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iYnVpbGRudW1iZXIiPkJ1aWxkTnVtYmVyPC9hPjwvaDI+Cis8aDIgaWQ9ImJ1aWxkbnVtYmVyIj5CdWlsZE51bWJlcjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+VGhpcyBpcyBhIGJhc2ljIHRhc2sgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBidWlsZCBudW1iZXJzLjwvcD4KLTxwPkl0IHdpbGwgZmlyc3QgYXR0ZW1wdCB0byByZWFkIGEgYnVpbGQgbnVtYmVyIGZyb20gYSBmaWxlIChieSBkZWZhdWx0LAotPGNvZGU+YnVpbGQubnVtYmVyPC9jb2RlPiBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLCB0aGVuCi1zZXQgdGhlIHByb3BlcnR5IDxjb2RlPmJ1aWxkLm51bWJlcjwvY29kZT4gdG8gdGhlIHZhbHVlIHRoYXQgd2FzIHJlYWQgaW4KLShvciB0byA8Y29kZT4wPC9jb2RlPiwgaWYgbm8gc3VjaCB2YWx1ZSkuIEl0IHdpbGwgdGhlbiBpbmNyZW1lbnQgdGhlCi1udW1iZXIgYnkgb25lIGFuZCB3cml0ZSBpdCBiYWNrIG91dCB0byB0aGUgZmlsZS4KLShTZWUgdGhlCi08YSBocmVmPSIuLi9UYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbCI+UHJvcGVydHlGaWxlPC9hPiB0YXNrCi1pZiB5b3UgbmVlZCBmaW5lciBjb250cm9sIG92ZXIgdGhpbmdzIHN1Y2ggYXMgdGhlIHByb3BlcnR5IG5hbWUgb3IKLXRoZSBudW1iZXIgZm9ybWF0LikKLTwvcD4KKzxwPkl0IHdpbGwgZmlyc3QgYXR0ZW1wdCB0byByZWFkIGEgYnVpbGQgbnVtYmVyIGZyb20gYSBmaWxlIChieSBkZWZhdWx0LCA8c2FtcD5idWlsZC5udW1iZXI8L3NhbXA+CitpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLCB0aGVuIHNldCB0aGUgcHJvcGVydHkgPGNvZGU+YnVpbGQubnVtYmVyPC9jb2RlPiB0byB0aGUgdmFsdWUgdGhhdCB3YXMKK3JlYWQgaW4gKG9yIHRvIDxxPjA8L3E+LCBpZiBubyBzdWNoIHZhbHVlKS4gSXQgd2lsbCB0aGVuIGluY3JlbWVudCB0aGUgbnVtYmVyIGJ5IG9uZSBhbmQgd3JpdGUgaXQKK2JhY2sgb3V0IHRvIHRoZSBmaWxlLiAgKFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3MvcHJvcGVydHlmaWxlLmh0bWwiPlByb3BlcnR5RmlsZTwvYT4gdGFzayBpZiB5b3UKK25lZWQgZmluZXIgY29udHJvbCBvdmVyIHRoaW5ncyBzdWNoIGFzIHRoZSBwcm9wZXJ0eSBuYW1lIG9yIHRoZSBudW1iZXIgZm9ybWF0Lik8L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byByZWFkIGFuZCB3cml0ZSB0aGUgYnVpbGQgbnVtYmVyIGZyb20vdG8uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0cyB0byAmcXVvdDtidWlsZC5udW1iZXImcXVvdDs8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgdG8gcmVhZCBhbmQgd3JpdGUgdGhlIGJ1aWxkIG51bWJlciBmcm9tL3RvLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5idWlsZC5udW1iZXI8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2J1aWxkbnVtYmVyLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlJlYWQsIGluY3JlbWVudCwgYW5kIHdyaXRlIGEgYnVpbGQgbnVtYmVyIHRvIHRoZSBkZWZhdWx0IGZpbGUsIDxzYW1wPmJ1aWxkLm51bWJlcjwvc2FtcD4uPC9wPgorPHByZT4mbHQ7YnVpbGRudW1iZXIvJmd0OzwvcHJlPgogCi08cD5SZWFkLCBpbmNyZW1lbnQsIGFuZCB3cml0ZSBhIGJ1aWxkIG51bWJlciB0byB0aGUgZGVmYXVsdCBmaWxlLAotPGNvZGU+YnVpbGQubnVtYmVyPC9jb2RlPi48L3A+Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7YnVpbGRudW1iZXIgZmlsZT0mcXVvdDtteWJ1aWxkLm51bWJlciZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlJlYWQsIGluY3JlbWVudCwgYW5kIHdyaXRlIGEgYnVpbGQgbnVtYmVyIHRvIHRoZSBmaWxlCi08Y29kZT5teWJ1aWxkLm51bWJlcjwvY29kZT4uPC9wPgotCi0KKzxwPlJlYWQsIGluY3JlbWVudCwgYW5kIHdyaXRlIGEgYnVpbGQgbnVtYmVyIHRvIHRoZSBmaWxlIDxzYW1wPm15YnVpbGQubnVtYmVyPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtidWlsZG51bWJlciBmaWxlPSZxdW90O215YnVpbGQubnVtYmVyJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2FiLmh0bWwgYi9tYW51YWwvVGFza3MvY2FiLmh0bWwKaW5kZXggNDIzMTJmNS4uYTc3M2IwNCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NhYi5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jYWIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE1OCArMTUsMTM1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5DYWIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iY2FiIj5DYWI8L2E+PC9oMj4KKzxoMiBpZD0iY2FiIj5DYWI8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlRoZSBjYWIgdGFzayBjcmVhdGVzIE1pY3Jvc29mdCBjYWIgYXJjaGl2ZSBmaWxlcy4gIEl0IGlzIGludm9rZWQKLXNpbWlsYXIgdG8gdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL2phci5odG1sIj5qYXI8L2E+IG9yIDxhIGhyZWY9Ii4uL1Rhc2tzL3ppcC5odG1sIj56aXA8L2E+IHRhc2tzLgotVGhpcyB0YXNrIHdpbGwgd29yayBvbiBXaW5kb3dzIHVzaW5nIHRoZSBleHRlcm5hbCBjYWJhcmMgdG9vbCAocHJvdmlkZWQgYnkgTWljcm9zb2Z0KQotd2hpY2ggbXVzdCBiZSBsb2NhdGVkIGluIHlvdXIgZXhlY3V0YWJsZSBwYXRoLjwvcD4KLTxwPlRvIHVzZSB0aGlzIHRhc2sgb24gb3RoZXIgcGxhdGZvcm1zIHlvdSBuZWVkIHRvIGRvd25sb2FkIGFuZCBjb21waWxlIGxpYmNhYmluZXQgZnJvbQotPGEgaHJlZj0iaHR0cDovL3RyaWxsLmNpcy5mb3JkaGFtLmVkdS9+YmFyYmFjaGEvY2FiaW5ldF9saWJyYXJ5LyI+Ci1odHRwOi8vdHJpbGwuY2lzLmZvcmRoYW0uZWR1L35iYXJiYWNoYS9jYWJpbmV0X2xpYnJhcnkvPC9hPi48L3A+Ci08cD5TZWUgdGhlIHNlY3Rpb24gb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQKLXRhc2tzPC9hPiwgb24gaG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvCi13cml0ZSBwYXR0ZXJucy48L3A+Ci08cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQKLXN1cHBvcnRzIG1vc3QgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+Ci0oPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLTxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPlRoZSBjYWIgdGFzayBjcmVhdGVzIE1pY3Jvc29mdCBjYWJpbmV0IGFyY2hpdmUgZmlsZXMuICBJdCBpcyBpbnZva2VkIHNpbWlsYXIgdG8KK3RoZSA8YSBocmVmPSIuLi9UYXNrcy9qYXIuaHRtbCI+amFyPC9hPiBvciA8YSBocmVmPSIuLi9UYXNrcy96aXAuaHRtbCI+emlwPC9hPiB0YXNrcy4gIFRoaXMgdGFzaword2lsbCB3b3JrIG9uIFdpbmRvd3MgdXNpbmcgdGhlIGV4dGVybmFsIDxrYmQ+Y2FiYXJjPC9rYmQ+IHRvb2wgKHByb3ZpZGVkIGJ5IE1pY3Jvc29mdCkgd2hpY2ggbXVzdAorYmUgbG9jYXRlZCBpbiB5b3VyIGV4ZWN1dGFibGUgcGF0aC48L3A+Cis8cD5UbyB1c2UgdGhpcyB0YXNrIG9uIG90aGVyIHBsYXRmb3JtcyB5b3UgbmVlZCB0byBkb3dubG9hZCBhbmQgY29tcGlsZSA8Y29kZT5saWJjYWJpbmV0PC9jb2RlPgorZnJvbSA8YSBocmVmPSJodHRwczovL3d3dy5mcmVzaHBvcnRzLm9yZy9hcmNoaXZlcnMvbGliY2FiaW5ldC8iCit0YXJnZXQ9Il90b3AiPmh0dHBzOi8vd3d3LmZyZXNocG9ydHMub3JnL2FyY2hpdmVycy9saWJjYWJpbmV0LzwvYT4uPC9wPgorPHA+U2VlIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24KK2hvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQgc3VwcG9ydHMgbW9zdAorYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8dmFyPmRpcjwvdmFyPiBiZWNvbWVzIDx2YXI+YmFzZWRpcjwvdmFyPikgYXMgd2VsbCBhcwordGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiAKIDxwPk9uIG5vbi1Vbml4IHBsYXRmb3JtcyB0aGlzIHRhc2sgd3JpdGVzIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGFyY2hpdmUKICAgdG8gdGhlIDxhIGhyZWY9Ii4uL3J1bm5pbmcuaHRtbCN0bXBkaXIiPnRlbXBvcmFyeSBkaXJlY3Rvcnk8L2E+LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYWJmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBjYWIgZmlsZSB0byBjcmVhdGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmNhYmZpbGU8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgY2FiIGZpbGUgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBzdGFydCBhcmNoaXZpbmcgZmlsZXMgZnJvbS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSB0byBzdGFydCBhcmNoaXZpbmcgZmlsZXMgZnJvbS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0IHRvICZxdW90O3llcyZxdW90OyBpZiB5b3Ugd2FudCB0byBzZWUgdGhlIG91dHB1dCBmcm9tCi0gICAgICB0aGUgY2FiYXJjIHRvb2wuICBkZWZhdWx0cyB0byAmcXVvdDtubyZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+c2V0IHRvIDxxPnllczwvcT4gaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBvdXRwdXQgZnJvbSB0aGUgPGNvZGU+Y2FiYXJjPC9jb2RlPiB0b29sLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXQgdG8gJnF1b3Q7bm8mcXVvdDsgdG8gc3RvcmUgZmlsZXMgd2l0aG91dCBjb21wcmVzc2luZy4KLSAgICAgIGRlZmF1bHRzIHRvICZxdW90O3llcyZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jb21wcmVzczwvdGQ+CisgICAgPHRkPnNldCB0byA8cT5ubzwvcT4gdG8gc3RvcmUgZmlsZXMgd2l0aG91dCBjb21wcmVzc2luZy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9wdGlvbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlIHRvIHNldCBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvcgotICAgICAgdGhlIGNhYmFyYyB0b29sLiAgc2hvdWxkIG5vdCBub3JtYWxseSBiZSBuZWNlc3NhcnkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+b3B0aW9uczwvdGQ+CisgICAgPHRkPnNldCBhZGRpdGlvbmFsIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciB0aGUgPGNvZGU+Y2FiYXJjPC9jb2RlPiB0b29sLiAgU2hvdWxkIG5vdAorICAgICAgbm9ybWFsbHkgYmUgbmVjZXNzYXJ5LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQKLSAgICAgIG11c3QgYmUgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsICg8cT4qKjwvcT4pPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdAotICAgICAgbXVzdCBiZSBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQKLSAgICAgIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkCi0gICAgICBvciBub3QgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90ICg8cT55ZXN8bm88L3E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+ZmlsZXNldDwvaDQ+CiAKLTxwPlRoZSBjYWIgdGFzayBzdXBwb3J0cyBvbmUgbmVzdGVkIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+Ci1lbGVtZW50IHRvIHNwZWNpZnkgdGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhcmNoaXZlLgotICBJZiB0aGlzIGlzIHNwZWNpZmllZCwgdGhlICJiYXNlZGlyIiBhdHRyaWJ1dGUgY2Fubm90IGJlIHVzZWQuCi08L3A+Cis8cD5UaGUgY2FiIHRhc2sgc3VwcG9ydHMgb25lIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+CitlbGVtZW50IHRvIHNwZWNpZnkgdGhlIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhcmNoaXZlLiAgSWYgdGhpcyBpcyBzcGVjaWZpZWQsCit0aGUgPHZhcj5iYXNlZGlyPC92YXI+IGF0dHJpYnV0ZSBjYW5ub3QgYmUgdXNlZC48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgorPHA+Q2FiIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IGludG8gYSBmaWxlCitjYWxsZWQgPHNhbXA+bWFudWFsLmNhYjwvc2FtcD4gaW4gdGhlIDxzYW1wPiR7ZGlzdH08L3NhbXA+IGRpcmVjdG9yeS48L3A+Cis8cHJlPgorJmx0O2NhYiBjYWJmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLmNhYiZxdW90OworICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5DYWIgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8c2FtcD5tYW51YWwuY2FiPC9zYW1wPiBpbiB0aGUgPHNhbXA+JHtkaXN0fTwvc2FtcD4gZGlyZWN0b3J5LiBGaWxlcyBpbiB0aGUKK2RpcmVjdG9yeSA8c2FtcD5teWRvY3M8L3NhbXA+LCBvciBmaWxlcyB3aXRoIHRoZSBuYW1lIDxzYW1wPnRvZG8uaHRtbDwvc2FtcD4gYXJlIGV4Y2x1ZGVkLjwvcD4KKzxwcmU+CiAmbHQ7Y2FiIGNhYmZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuY2FiJnF1b3Q7CiAgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OwotICAvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Y2FicyBhbGwgZmlsZXMgaW4gdGhlIGh0ZG9jcy9tYW51YWwgZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZAotbWFudWFsLmNhYiBpbiB0aGUgJHtkaXN0fSBkaXJlY3RvcnkuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtjYWIgY2FiZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC5jYWImcXVvdDsKLSAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7Ci0gICAgIGV4Y2x1ZGVzPSZxdW90O215ZG9jcy8qKiwgKiovdG9kby5odG1sJnF1b3Q7Ci0gIC8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5jYWJzIGFsbCBmaWxlcyBpbiB0aGUgaHRkb2NzL21hbnVhbCBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkCi1tYW51YWwuY2FiIGluIHRoZSAke2Rpc3R9IGRpcmVjdG9yeS4gRmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBteWRvY3MsCi1vciBmaWxlcyB3aXRoIHRoZSBuYW1lIHRvZG8uaHRtbCBhcmUgZXhjbHVkZWQuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgZXhjbHVkZXM9JnF1b3Q7bXlkb2NzLyoqLCAqKi90b2RvLmh0bWwmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5DYWIgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8c2FtcD5tYW51YWwuY2FiPC9zYW1wPiBpbiB0aGUgPHNhbXA+JHtkaXN0fTwvc2FtcD4gZGlyZWN0b3J5LiBPbmx5IDxzYW1wPi5odG1sPC9zYW1wPiBmaWxlcwordW5kZXIgdGhlIGRpcmVjdG9yeSA8c2FtcD5hcGk8L3NhbXA+IGFyZSBhcmNoaXZlZCwgYW5kIGZpbGVzIHdpdGggdGhlIG5hbWUgPHNhbXA+dG9kby5odG1sPC9zYW1wPgorYXJlIGV4Y2x1ZGVkLiBPdXRwdXQgZnJvbSB0aGUgPGtiZD5jYWJhcmM8L2tiZD4gdG9vbCBpcyBkaXNwbGF5ZWQgaW4gdGhlIGJ1aWxkIG91dHB1dC48L3A+Cis8cHJlPgogJmx0O2NhYiBjYWJmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLmNhYiZxdW90OwogICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKICAgICAgaW5jbHVkZXM9JnF1b3Q7YXBpLyoqLyouaHRtbCZxdW90OwogICAgICBleGNsdWRlcz0mcXVvdDsqKi90b2RvLmh0bWwmcXVvdDsKLSAgICAgdmVyYm9zZT0mcXVvdDt5ZXMmcXVvdDsKLSAgLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkNhYiBhbGwgZmlsZXMgaW4gdGhlIGh0ZG9jcy9tYW51YWwgZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZAotbWFudWFsLmNhYiBpbiB0aGUgJHtkaXN0fSBkaXJlY3RvcnkuIE9ubHkgaHRtbCBmaWxlcyB1bmRlciB0aGUKLWRpcmVjdG9yeSBhcGkgYXJlIGFyY2hpdmVkLCBhbmQgZmlsZXMgd2l0aCB0aGUgbmFtZSB0b2RvLmh0bWwgYXJlCi1leGNsdWRlZC4gT3V0cHV0IGZyb20gdGhlIGNhYmFyYyB0b29sIGlzIGRpc3BsYXllZCBpbiB0aGUgYnVpbGQKLW91dHB1dC48L3A+CisgICAgIHZlcmJvc2U9JnF1b3Q7eWVzJnF1b3Q7LyZndDs8L3ByZT4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZSBmb2xsb3dpbmcgaXMgZXF1aXZhbGVudCB0byB0aGUgZXhhbXBsZSBhYm92ZS48L3A+Cis8cHJlPgogJmx0O2NhYiBjYWJmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLmNhYiZxdW90OwogICAgICB2ZXJib3NlPSZxdW90O3llcyZxdW90OyZndDsKICAgJmx0O2ZpbGVzZXQKICAgICAgICBkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OwogICAgICAgIGluY2x1ZGVzPSZxdW90O2FwaS8qKi8qLmh0bWwmcXVvdDsKLSAgICAgICBleGNsdWRlcz0mcXVvdDsqKi90b2RvLmh0bWwmcXVvdDsKLSAgLyZndDsKLSZsdDsvY2FiJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+aXMgZXF1aXZhbGVudCB0byB0aGUgZXhhbXBsZSBhYm92ZS48L3A+Ci0KLQorICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL3RvZG8uaHRtbCZxdW90Oy8mZ3Q7CismbHQ7L2NhYiZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2NtLmh0bWwgYi9tYW51YWwvVGFza3MvY2NtLmh0bWwKaW5kZXggOWY0NzI1Zi4uYzFmY2FmOCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NjbS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jY20uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Db250aW51dXMgVGFza3M8L3RpdGxlPgogPC9oZWFkPgpAQCAtMzMsMTggKzMzLDIyIEBACiAgIDxsaT48YSBocmVmPSIjY2NtY3JlYXRldGFzayI+Q0NNQ3JlYXRlVGFzazwvYT48L2xpPgogPC91bD4KIAotPHA+VGhlc2UgQXBhY2hlIEFudCB0YXNrcyBhcmUgd3JhcHBlcnMgYXJvdW5kIENvbnRpbnV1cyBTb3VyY2UgTWFuYWdlci4gVGhleSBoYXZlIGJlZW4gdGVzdGVkCi0gIGFnYWluc3QgdmVyc2lvbnMgNS4xLzYuMiBvbiBXaW5kb3dzIDIwMDAsIGJ1dCBzaG91bGQgd29yayBvbiBvdGhlciBwbGF0Zm9ybXMgd2l0aCBjY20gaW5zdGFsbGVkLjwvcD4KLTxocj4KLTxoMj48YSBuYW1lPSJjY21jaGVja2luIj5DQ01DaGVja2luPC9hPjwvaDI+Cis8cD5UaGVzZSBBcGFjaGUgQW50IHRhc2tzIGFyZSB3cmFwcGVycworYXJvdW5kIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JhdGlvbmFsX1N5bmVyZ3kiIHRhcmdldD0iX3RvcCI+Q29udGludXVzIFNvdXJjZQorTWFuYWdlcjwvYT4uIFRoZXkgaGF2ZSBiZWVuIHRlc3RlZCBhZ2FpbnN0IHZlcnNpb25zIDUuMS82LjIgb24gV2luZG93cyAyMDAwLCBidXQgc2hvdWxkIHdvcmsgb24KK290aGVyIHBsYXRmb3JtcyB3aXRoIDxrYmQ+Y2NtPC9rYmQ+IGluc3RhbGxlZC48L3A+CisKKzxoci8+CisKKzxoMiBpZD0iY2NtY2hlY2tpbiI+Q0NNQ2hlY2tpbjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBjaGVja2luIGEgZmlsZQorPHA+Q2hlY2sgaW4gYSBmaWxlIHRvIENvbnRpbnV1czwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjU5OCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmZpbGU8L3RkPgpAQCAtNTMsMTAwICs1Nyw5NyBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gRGVmYXVsdCBpcyAmcXVvdDtDaGVja2luJnF1b3Q7IHBsdXMgdGhlIGRhdGU8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPkNoZWNraW48L3E+IHBsdXMgdGhlIGRhdGU8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnRhc2s8L3RkPgotICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlIDxxPmRlZmF1bHQ8L3E+KTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jY21kaXI8L3RkPgotICAgIDx0ZD5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5wYXRoIHRvIHRoZSA8a2JkPmNjbTwva2JkPiBleGVjdXRhYmxlIGZpbGUsIHJlcXVpcmVkIGlmIGl0IGlzIG5vdCBvbgorICAgIHRoZSA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Jmx0O2NjbWNoZWNraW4gZmlsZT0mcXVvdDtjOi93YS9jb20vZm9vL015RmlsZS5qYXZhJnF1b3Q7Ci0gICAgICAgIGNvbW1lbnQ9JnF1b3Q7bXljb21tZW50JnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+Q2hlY2tzIGluIHRoZSBmaWxlIDxpPmM6L3dhL2NvbS9mb28vTXlGaWxlLmphdmE8L2k+LgotICBDb21tZW50IGF0dHJpYnV0ZSA8aT5teWNvbW1lbnQ8L2k+IGlzIGFkZGVkIGFzIGEgdGFzayBjb21tZW50LiBUaGUgdGFzawotICB1c2VkIGlzIHRoZSBvbmUgc2V0IGFzIHRoZSBkZWZhdWx0LjwvcD4KLTxocj4KLTxoMj48YSBuYW1lPSJjY21jaGVja291dCI+Q0NNQ2hlY2tvdXQ8L2E+PC9oMj4KKworPHA+Q2hlY2sgaW4gdGhlIGZpbGUgPHNhbXA+Yzovd2EvY29tL2Zvby9NeUZpbGUuamF2YTwvc2FtcD4uICBUZXh0IDxzYW1wPm15Y29tbWVudDwvc2FtcD4gaXMgYWRkZWQKK2FzIGEgY29tbWVudC4gVGhlIHRhc2sgdXNlZCBpcyB0aGUgb25lIHNldCBhcyB0aGUgZGVmYXVsdC48L3A+Cis8cHJlPgorJmx0O2NjbWNoZWNraW4gZmlsZT0mcXVvdDtjOi93YS9jb20vZm9vL015RmlsZS5qYXZhJnF1b3Q7CisgICAgICAgICAgICBjb21tZW50PSZxdW90O215Y29tbWVudCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxoci8+CisKKzxoMiBpZD0iY2NtY2hlY2tvdXQiPkNDTUNoZWNrb3V0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSBDaGVja291dCBjb21tYW5kIHRvIENvbnRpbnV1cworPHA+UnVuIGEgQ29udGludXVzIGNoZWNrb3V0IGNvbW1hbmQ8L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSI2MTQiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5maWxlPC90ZD4KICAgICA8dGQ+UGF0aCB0byB0aGUgZmlsZSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+Ci0gICAgPHRkIHJvd3NwYW49MiI+WWVzIChmaWxlfGZpbGVzZXQpPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZmlsZXNldDwvdGQ+Ci0gICAgPHRkPmZpbGVzZXQgY29udGFpbmluZyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIG91dDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5maWxlc2V0IGNvbnRhaW5pbmcgdGhlIGZpbGUgdG8gYmUgY2hlY2tlZCBvdXQ8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC48L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD50YXNrPC90ZD4KLSAgICA8dGQ+U3BlY2lmeSB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luIHRoZSBmaWxlIChtYXkgdXNlCi0gICAgICAnZGVmYXVsdCcpPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luIHRoZSBmaWxlIChtYXkgdXNlIDxxPmRlZmF1bHQ8L3E+KTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jY21kaXI8L3RkPgotICAgIDx0ZD5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5wYXRoIHRvIHRoZSA8a2JkPmNjbTwva2JkPiBleGVjdXRhYmxlIGZpbGUsIHJlcXVpcmVkIGlmIGl0IGlzIG5vdCBvbgorICAgIHRoZSA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Jmx0O2NjbWNoZWNrb3V0IGZpbGU9JnF1b3Q7Yzovd2EvY29tL2Zvby9NeUZpbGUuamF2YSZxdW90OwotICAgICAgICBjb21tZW50PSZxdW90O215Y29tbWVudCZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkNoZWNrIG91dCB0aGUgZmlsZSA8aT5jOi93YS9jb20vZm9vL015RmlsZS5qYXZhPC9pPi4KLSAgQ29tbWVudCBhdHRyaWJ1dGUgPGk+bXljb21tZW50PC9pPiBpcyBhZGRlZCBhcyBhIHRhc2sgY29tbWVudAotICAgVGhlIHVzZWQgdGFzayBpcyB0aGUgb25lIHNldCBhcyB0aGUgZGVmYXVsdC48L3A+Ci08YmxvY2txdW90ZT4KLSAgPHByZT4mbHQ7Y2NtY2hlY2tvdXQgIGNvbW1lbnQ9JnF1b3Q7bXljb21tZW50JnF1b3Q7Jmd0OworCis8cD5DaGVjayBvdXQgdGhlIGZpbGUgPHNhbXA+Yzovd2EvY29tL2Zvby9NeUZpbGUuamF2YTwvc2FtcD4uICBDb21tZW50CithdHRyaWJ1dGUgPHNhbXA+bXljb21tZW50PC9zYW1wPiBpcyBhZGRlZCBhcyBhIHRhc2sgY29tbWVudC4gVGhlIHRhc2sgdXNlZCBpcyB0aGUgb25lIHNldCBhcyB0aGUKK2RlZmF1bHQuPC9wPgorPHByZT4KKyZsdDtjY21jaGVja291dCBmaWxlPSZxdW90O2M6L3dhL2NvbS9mb28vTXlGaWxlLmphdmEmcXVvdDsKKyAgICAgICAgICAgICBjb21tZW50PSZxdW90O215Y29tbWVudCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNoZWNrIG91dCBhbGwgdGhlIGZpbGVzIGluIHRoZSA8c2FtcD5saWI8L3NhbXA+IGRpcmVjdG9yeSBoYXZpbmcgdGhlIDxzYW1wPi5qYXI8L3NhbXA+CitleHRlbnNpb24uIENvbW1lbnQgYXR0cmlidXRlIDxzYW1wPm15Y29tbWVudDwvc2FtcD4gaXMgYWRkZWQgYXMgYSB0YXNrIGNvbW1lbnQgVGhlIHVzZWQgdGFzayBpcyB0aGUKK29uZSBzZXQgYXMgdGhlIGRlZmF1bHQuPC9wPgorPHByZT4KKyZsdDtjY21jaGVja291dCBjb21tZW50PSZxdW90O215Y29tbWVudCZxdW90OyZndDsKICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2xpYiZxdW90OyAmZ3Q7CiAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsZXNldCZndDsKLSZsdDsvY2NtY2hlY2tvdXQgJmd0OwotICA8L3ByZT4KLTwvYmxvY2txdW90ZT4KKyZsdDsvY2NtY2hlY2tvdXQgJmd0OzwvcHJlPgogCi08cD5DaGVjayBvdXQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgPGk+bGliPC9pPiBkaXJlY3RvcnkgaGF2aW5nIHRoZSA8aT4uamFyPC9pPiBleHRlbnNpb24uCi0gIENvbW1lbnQgYXR0cmlidXRlIDxpPm15Y29tbWVudDwvaT4gaXMgYWRkZWQgYXMgYSB0YXNrIGNvbW1lbnQKLSAgIFRoZSB1c2VkIHRhc2sgaXMgdGhlIG9uZSBzZXQgYXMgdGhlIGRlZmF1bHQuPC9wPgorPGhyLz4KIAotCi0KLTxocj4KLTxoMj48YSBuYW1lPSJjY21jaGVja2ludGFzayI+Q0NNQ2hlY2tpblRhc2s8L2E+PC9oMj4KKzxoMiBpZD0iY2NtY2hlY2tpbnRhc2siPkNDTUNoZWNraW5UYXNrPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSBjaGVjayBpbiBkZWZhdWx0IHRhc2sgY29tbWFuZCB0byBDb250aW51dXMKKzxwPlJ1biBhIENvbnRpbnV1cyBjb21tYW5kIHRvIGNoZWNraW4gZGVmYXVsdCB0YXNrPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+Y29tbWVudDwvdGQ+CkBAIC0xNTUsNDEgKzE1Niw0MiBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnRhc2s8L3RkPgotICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNrIGluIHRoZSBmaWxlIChtYXkgdXNlIDxxPmRlZmF1bHQ8L3E+KTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jY21kaXI8L3RkPgotICAgIDx0ZCA+cGF0aCB0byB0aGUgY2NtIGV4ZWN1dGFibGUgZmlsZSwgcmVxdWlyZWQgaWYgaXQgaXMgbm90IG9uIHRoZSBQQVRIPC90ZD4KKyAgICA8dGQ+cGF0aCB0byB0aGUgPGtiZD5jY208L2tiZD4gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24KKyAgICB0aGUgPGNvZGU+UEFUSDwvY29kZT48L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGgzPkV4YW1wbGVzIDwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHByZT4mbHQ7Y2NtY2hlY2tpbnRhc2sgY29tbWVudD0mcXVvdDtibGFoYmxhaC8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkRvZXMgYSBDaGVja2luIGRlZmF1bHQgdGFzayBvbiBhbGwgdGhlIGNoZWNrZWQgb3V0IGZpbGVzIGluIHRoZSBjdXJyZW50IHRhc2suPC9wPgotPGhyPgotPGgyPjxhIG5hbWU9ImNjbXJlY29uZmlndXJlIj5DQ01SZWNvbmZpZ3VyZTwvYT48L2gyPgorPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+UGVyZm9ybSBhIENoZWNraW4gZGVmYXVsdCB0YXNrIG9uIGFsbCB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgaW4gdGhlIGN1cnJlbnQgdGFzay48L3A+Cis8cHJlPiZsdDtjY21jaGVja2ludGFzayBjb21tZW50PSZxdW90O2JsYWhibGFoLyZndDs8L3ByZT4KKworPGhyLz4KKworPGgyIGlkPSJjY21yZWNvbmZpZ3VyZSI+Q0NNUmVjb25maWd1cmU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhbiByZWNvbmZpZ3VyZSBjb21tYW5kIHRvIENvbnRpbnV1cy4KKzxwPlJ1biBhIENvbnRpbnV1cyByZWNvbmZpZ3VyZS91cGRhdGUgY29tbWFuZDwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnJlY3Vyc2U8L3RkPgotICAgIDx0ZD5yZWN1cnNlIG9uIHN1YnByb2plY3QgKGRlZmF1bHQgZmFsc2UpPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5yZWN1cnNlIG9uIHN1YnByb2plY3Q8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnZlcmJvc2U8L3RkPgotICAgIDx0ZD5kbyBhIHZlcmJvc2UgcmVjb25maWd1cmUgb3BlcmF0aW9uIChkZWZhdWx0IGZhbHNlKTwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+ZG8gYSB2ZXJib3NlIHJlY29uZmlndXJlIG9wZXJhdGlvbjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+Y2NtcHJvamVjdDwvdGQ+CkBAIC0xOTgsMzIgKzIwMCwzMyBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNjbWRpcjwvdGQ+Ci0gICAgPHRkID5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5wYXRoIHRvIHRoZSA8a2JkPmNjbTwva2JkPiBleGVjdXRhYmxlIGZpbGUsIHJlcXVpcmVkIGlmIGl0IGlzIG5vdCBvbgorICAgIHRoZSA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci0gPHByZT4mbHQ7Y2NtcmVjb25maWd1cmUgY2NtcHJvamVjdD0mcXVvdDtBTlRDQ01fVEVTVCNCTU9fMSZxdW90OwotICAgICAgICAgdmVyYm9zZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIENvbnRpbnV1cyA8aT5yZWNvbmZpZ3VyZTwvaT4gb24gdGhlIHByb2plY3QgPGk+QU5UQ0NNX1RFU1QjQk1PXzE8L2k+LgotPC9wPgotPGhyPgotPGgyPjxhIG5hbWU9ImNjbWNyZWF0ZXRhc2siPkNDTUNyZWF0ZVRhc2s8L2E+PC9oMj4KKworPHA+UGVyZm9ybSBhIENvbnRpbnV1cyA8Y29kZT5yZWNvbmZpZ3VyZTwvY29kZT4gb24gdGhlIHByb2plY3QgPHNhbXA+QU5UQ0NNX1RFU1QjQk1PXzE8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y2NtcmVjb25maWd1cmUgY2NtcHJvamVjdD0mcXVvdDtBTlRDQ01fVEVTVCNCTU9fMSZxdW90OworICAgICAgICAgICAgICAgIHZlcmJvc2U9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxoci8+CisKKzxoMiBpZD0iY2NtY3JlYXRldGFzayI+Q0NNQ3JlYXRlVGFzazwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotQ3JlYXRlIGEgQ29udGludXVzIHRhc2suCis8cD5DcmVhdGUgYSBDb250aW51dXMgdGFzay48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQ8L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KQEAgLTIzMyw3ICsyMzYsOCBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNjbWRpcjwvdGQ+Ci0gICAgPHRkID5wYXRoIHRvIHRoZSBjY20gZXhlY3V0YWJsZSBmaWxlLCByZXF1aXJlZCBpZiBpdCBpcyBub3Qgb24gdGhlIFBBVEg8L3RkPgorICAgIDx0ZD5wYXRoIHRvIHRoZSA8a2JkPmNjbTwva2JkPiBleGVjdXRhYmxlIGZpbGUsIHJlcXVpcmVkIGlmIGl0IGlzIG5vdCBvbgorICAgIHRoZSA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgpAQCAtMjUzLDIwICsyNTcsMTcgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD50YXNrPC90ZD4KLSAgICA8dGQ+U3BlY2lmeSB0aGUgdGFzayBudW1iZXIgdXNlZCB0byBjaGVja2luIHRoZSBmaWxlIChtYXkgdXNlICdkZWZhdWx0Jyk8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB0YXNrIG51bWJlciB1c2VkIHRvIGNoZWNraW4gdGhlIGZpbGUgKG1heSB1c2UgPHE+ZGVmYXVsdDwvcT4pPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHByZT4mbHQ7Y2NtY3JlYXRldGFzayByZXNvbHZlcj0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsKLSAgICAgICAgICAgIHJlbGVhc2U9JnF1b3Q7QU5UQ0NNX1RFU1QmcXVvdDsgY29tbWVudD0mcXVvdDtibGFoYmxhaCZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkNyZWF0ZXMgYSB0YXNrIGZvciB0aGUgcmVsZWFzZSA8aT5BTlRDQ01fVEVTVDwvaT4gd2l0aCB0aGUKLSAgY3VycmVudCB1c2VyIGFzIHRoZSByZXNvbHZlciBmb3IgdGhpcyB0YXNrLjwvcD4KIAorPHA+Q3JlYXRlIGEgdGFzayBmb3IgdGhlIHJlbGVhc2UgPHNhbXA+QU5UQ0NNX1RFU1Q8L3NhbXA+IHdpdGggdGhlIGN1cnJlbnQgdXNlciBhcyB0aGUgcmVzb2x2ZXIgZm9yCit0aGlzIHRhc2suPC9wPgorPHByZT4KKyZsdDtjY21jcmVhdGV0YXNrIHJlc29sdmVyPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OworICAgICAgICAgICAgICAgcmVsZWFzZT0mcXVvdDtBTlRDQ01fVEVTVCZxdW90OyBjb21tZW50PSZxdW90O2JsYWhibGFoJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgotCiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2hhbmdlbG9nLmh0bWwgYi9tYW51YWwvVGFza3MvY2hhbmdlbG9nLmh0bWwKaW5kZXggOGQ5YTcwYi4uMmI1NDExYiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NoYW5nZWxvZy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jaGFuZ2Vsb2cuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI1OSArMTUsMjMyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5DaGFuZ2VMb2cgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iY2hhbmdlbG9nIj5DdnNDaGFuZ2VMb2c8L2E+PC9oMj4KKzxoMiBpZD0iY2hhbmdlbG9nIj5DdnNDaGFuZ2VMb2c8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkdlbmVyYXRlcyBhbiBYTUwtZm9ybWF0dGVkIHJlcG9ydCBmaWxlIG9mIHRoZSBjaGFuZ2UgbG9ncyByZWNvcmRlZCBpbiBhCi08YSBocmVmPSJodHRwOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+IHJlcG9zaXRvcnkuIDwvcD4KLTxwPjxiPkltcG9ydGFudDo8L2I+IFRoaXMgdGFzayBuZWVkcyAmcXVvdDs8Y29kZT5jdnM8L2NvZGU+JnF1b3Q7IG9uIHRoZSBwYXRoLiBJZiBpdCBpc24ndCwgeW91IHdpbGwgZ2V0Ci1hbiBlcnJvciAoc3VjaCBhcyBlcnJvciA8Y29kZT4yPC9jb2RlPiBvbiB3aW5kb3dzKS4gSWYgPGNvZGU+Jmx0O2N2cyZndDs8L2NvZGU+IGRvZXNuJ3Qgd29yaywgdHJ5IHRvIGV4ZWN1dGUgPGNvZGU+Y3ZzLmV4ZTwvY29kZT4KLWZyb20gdGhlIGNvbW1hbmQgbGluZSBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgYXJlIHdvcmtpbmcuCi1BbHNvIG5vdGUgdGhhdCB0aGlzIHRhc2sgYXNzdW1lcyB0aGF0IHRoZSBjdnMgZXhlY3V0YWJsZSBpcyBjb21wYXRpYmxlCi13aXRoIHRoZSBVbml4IHZlcnNpb24gZnJvbSBjdnNob21lLm9yZywgdGhpcyBpcyBub3QgY29tcGxldGVseSB0cnVlCi1mb3IgY2VydGFpbiBvdGhlciBjdnMgY2xpZW50cyAtIGxpa2UgQ1ZTTlQgZm9yIGV4YW1wbGUgLSBhbmQgc29tZQotb3BlcmF0aW9uIG1heSBmYWlsIHdoZW4gdXNpbmcgc3VjaCBhbiBpbmNvbXBhdGlibGUgY2xpZW50LgotPC9wPgorPHA+R2VuZXJhdGVzIGFuIFhNTC1mb3JtYXR0ZWQgcmVwb3J0IGZpbGUgb2YgdGhlIGNoYW5nZSBsb2dzIHJlY29yZGVkIGluCithIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+IHJlcG9zaXRvcnkuPC9wPgorPHA+PHN0cm9uZz5JbXBvcnRhbnQ8L3N0cm9uZz46IFRoaXMgdGFzayBuZWVkcyA8a2JkPmN2czwva2JkPiBvbiB0aGUgcGF0aC4gSWYgaXQgaXNuJ3QsIHlvdSB3aWxsIGdldAorYW4gZXJyb3IgKHN1Y2ggYXMgPGNvZGU+ZXJyb3I9MjwvY29kZT4gb24gV2luZG93cykuIElmIDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiBkb2Vzbid0IHdvcmssIHRyeSB0bworZXhlY3V0ZSA8a2JkPmN2cy5leGU8L2tiZD4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBhcmUgd29ya2luZy4KK0Fsc28gbm90ZSB0aGF0IHRoaXMgdGFzayBhc3N1bWVzIHRoYXQgdGhlIDxrYmQ+Y3ZzPC9rYmQ+IGV4ZWN1dGFibGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBVbml4Cit2ZXJzaW9uLCB0aGlzIGlzIG5vdCBjb21wbGV0ZWx5IHRydWUgZm9yIGNlcnRhaW4gb3RoZXIgQ1ZTIGNsaWVudHMmbWRhc2g7bGlrZSBDVlNOVCBmb3IKK2V4YW1wbGUmbWRhc2g7YW5kIHNvbWUgb3BlcmF0aW9uIG1heSBmYWlsIHdoZW4gdXNpbmcgc3VjaCBhbiBpbmNvbXBhdGlibGUgY2xpZW50LjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCBjb2xzcGFuPSIzIj5BdHRyaWJ1dGVzIGZyb20gcGFyZW50IEN2cyB0YXNrIHdoaWNoIGFyZSBtZWFuaW5nZnVsIGhlcmU8YnI+Ci0gICAgU2luY2UgQXBhY2hlIEFudCAxLjYuMTwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJsZWZ0Ij5BdHRyaWJ1dGVzIGZyb20gcGFyZW50IDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiB0YXNrIHdoaWNoIGFyZQorICAgIG1lYW5pbmdmdWwgaGVyZTxici8+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42LjE8L2VtPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmN2c1Jvb3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxjb2RlPkNWU1JPT1Q8L2NvZGU+IHZhcmlhYmxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmN2c1Jvb3Q8L3RkPgorICAgIDx0ZD50aGUgPGNvZGU+Q1ZTUk9PVDwvY29kZT4gdmFyaWFibGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jdnNSc2g8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxjb2RlPkNWU19SU0g8L2NvZGU+IHZhcmlhYmxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmN2c1JzaDwvdGQ+CisgICAgPHRkPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhY2thZ2UvbW9kdWxlIHRvIGNoZWNrIG91dC4gIDxiPk5vdGU6PC9iPgotICAgICAgbXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BsaXQgdXNpbmcgc3BhY2VzLiAgVXNlIGEgbmVzdGVkCi0gICAgICAmbHQ7bW9kdWxlJmd0OyBlbGVtZW50IGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBtb2R1bGUgd2l0aAotICAgICAgc3BhY2VzIGluIGl0cyBuYW1lLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnBhY2thZ2U8L3RkPgorICAgIDx0ZD50aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LiAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBtdWx0aXBsZSBhdHRyaWJ1dGVzIGNhbiBiZSBzcGxpdAorICAgICAgdXNpbmcgc3BhY2VzLiAgVXNlIGEgbmVzdGVkIDxjb2RlPiZsdDttb2R1bGUmZ3Q7PC9jb2RlPiBlbGVtZW50IGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgYQorICAgICAgbW9kdWxlIHdpdGggc3BhY2VzIGluIGl0cyBuYW1lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgcG9ydCAyNDAxLjwvdGQ+CisgICAgPHRkPnBvcnQ8L3RkPgorICAgIDx0ZD5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MjQwMTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGZpbGUgPGNvZGU+fi8uY3ZzcGFzczwvY29kZT4uPC90ZD4KKyAgICA8dGQ+cGFzc2ZpbGU8L3RkPgorICAgIDx0ZD5QYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPn4vLmN2c3Bhc3M8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKLSAgICAgIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSBvdGhlciB0aGFuIDxxPjA8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRhZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5xdWVyeSB0aGUgY2hhbmdlbG9nIGZvciBhIHNwZWNpZmljIGJyYW5jaC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD50YWc8L3RkPgorICAgIDx0ZD5xdWVyeSB0aGUgY2hhbmdlbG9nIGZvciBhIHNwZWNpZmljIGJyYW5jaC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0iMyI+U3BlY2lmaWMgYXR0cmlidXRlczwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJsZWZ0Ij5TcGVjaWZpYyBhdHRyaWJ1dGVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBydW4gdGhlIENWUyA8ZW0+bG9nPC9lbT4KLSAgICAgY29tbWFuZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHRzIHRvICR7YmFzZWRpcn0uPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHJ1biB0aGUgPGtiZD5jdnMgbG9nPC9rYmQ+IGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPiR7YmFzZWRpcn08L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGNoYW5nZSBsb2cgcmVwb3J0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIGluIHdoaWNoIHRvIHdyaXRlIHRoZSBjaGFuZ2UgbG9nIHJlcG9ydC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51c2Vyc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UHJvcGVydHkgZmlsZSB0aGF0IGNvbnRhaW5zIG5hbWUtdmFsdWUgcGFpcnMgbWFwcGluZwotICAgICB1c2VyIElEcyBhbmQgbmFtZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcmVwb3J0IGluIHBsYWNlIG9mCi0gICAgIHRoZSB1c2VyIElELjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnVzZXJzZmlsZTwvdGQ+CisgICAgPHRkPlByb3BlcnR5IGZpbGUgdGhhdCBjb250YWlucyBuYW1lLXZhbHVlIHBhaXJzIG1hcHBpbmcgdXNlciBJRHMgYW5kIG5hbWVzIHRoYXQgc2hvdWxkIGJlIHVzZWQKKyAgICAgIGluIHRoZSByZXBvcnQgaW4gcGxhY2Ugb2YgdGhlIHVzZXIgSUQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kYXlzaW5wYXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIG51bWJlciBvZiBkYXlzIGludG8gdGhlIHBhc3QgZm9yIHdoaWNoIHRoZQotICAgICBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHNob3VsZCBiZSByZXRyaWV2ZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGF5c2lucGFzdDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIG51bWJlciBvZiBkYXlzIGludG8gdGhlIHBhc3QgZm9yIHdoaWNoIHRoZSBjaGFuZ2UgbG9nIGluZm9ybWF0aW9uIHNob3VsZCBiZQorICAgICAgcmV0cmlldmVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RhcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVhcmxpZXN0IGRhdGUgZnJvbSB3aGljaCBjaGFuZ2UgbG9ncyBhcmUgdG8gYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zdGFydDwvdGQ+CisgICAgPHRkPlRoZSBlYXJsaWVzdCBkYXRlIGZyb20gd2hpY2ggY2hhbmdlIGxvZ3MgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxhdGVzdCBkYXRlIHRvIHdoaWNoIGNoYW5nZSBsb2dzIGFyZSB0byBiZQotICAgICBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuZDwvdGQ+CisgICAgPHRkPlRoZSBsYXRlc3QgZGF0ZSB0byB3aGljaCBjaGFuZ2UgbG9ncyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW90ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSwgd29ya3MgYWdhaW5zdCB0aGUgcmVwb3NpdG9yeQotICAgICAgKHVzaW5nIHJsb2cpIHdpdGhvdXQgYSB3b3JraW5nIGNvcHkuICBEZWZhdWx0IGlzCi0gICAgICBmYWxzZS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnJlbW90ZTwvdGQ+CisgICAgPHRkPklmIHNldCB0byB0cnVlLCB3b3JrcyBhZ2FpbnN0IHRoZSByZXBvc2l0b3J5ICh1c2luZyA8a2JkPmN2cyBybG9nPC9rYmQ+KSB3aXRob3V0IGEgd29ya2luZworICAgICAgY29weS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0YXJ0VGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdGFydCBvZiBhIHRhZyByYW5nZS4gSWYgZW5kVGFnIGlzIGFsc28KLSAgICAgIHNwZWNpZmllZCwgdGhleSBtdXN0IGJvdGggYmUgb24gdGhlIHNhbWUgYnJhbmNoLiBJZiBlbmRUYWcgaXMgbm90Ci0gICAgICBzcGVjaWZpZWQsIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHdpbGwgYmUgdGhlIGxhdGVzdCBvbiB0aGUgc2FtZQotICAgICAgYnJhbmNoIG9uIHdoaWNoIHN0YXJ0VGFnIGxpdmVzLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c3RhcnRUYWc8L3RkPgorICAgIDx0ZD5UaGUgc3RhcnQgb2YgYSB0YWcgcmFuZ2UuIElmIDx2YXI+ZW5kVGFnPC92YXI+IGlzIGFsc28gc3BlY2lmaWVkLCB0aGV5IG11c3QgYm90aCBiZSBvbiB0aGUKKyAgICAgIHNhbWUgYnJhbmNoLiBJZiA8dmFyPmVuZFRhZzwvdmFyPiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgZW5kIG9mIHRoZSByYW5nZSB3aWxsIGJlIHRoZSBsYXRlc3Qgb24KKyAgICAgIHRoZSBzYW1lIGJyYW5jaCBvbiB3aGljaCA8dmFyPnN0YXJ0VGFnPC92YXI+IGxpdmVzLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZFRhZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5kIG9mIGEgdGFnIHJhbmdlLiBJZiBzdGFydFRhZyBpcyBhbHNvCi0gICAgIHNwZWNpZmllZCwgdGhleSBtdXN0IGJvdGggYmUgb24gdGhlIHNhbWUgYnJhbmNoLiBJZiBzdGFydFRhZyBpcwotICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHdpbGwgYmUgdGhlIHRvcCBvZiB0aGUKLSAgICAgYnJhbmNoIG9uIHdoaWNoIGVuZFRhZyBsaXZlcy48L3RkPiAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC4KLSAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lbmRUYWc8L3RkPgorICAgIDx0ZD5UaGUgZW5kIG9mIGEgdGFnIHJhbmdlLiBJZiA8dmFyPnN0YXJ0VGFnPC92YXI+IGlzIGFsc28gc3BlY2lmaWVkLCB0aGV5IG11c3QgYm90aCBiZSBvbiB0aGUKKyAgICAgIHNhbWUgYnJhbmNoLiBJZiA8dmFyPnN0YXJ0VGFnPC92YXI+IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2Ugd2lsbCBiZSB0aGUgdG9wCisgICAgICBvZiB0aGUgYnJhbmNoIG9uIHdoaWNoIDx2YXI+ZW5kVGFnPC92YXI+IGxpdmVzLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KLTxoND48YSBuYW1lPSJ1c2VyIj51c2VyPC9hPjwvaDQ+Ci08cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDt1c2VyJmd0OzwvY29kZT4gZWxlbWVudCBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYQotbWFwcGluZyBiZXR3ZWVuIGEgdXNlciBJRCBhcyBpdCBhcHBlYXJzIG9uIHRoZSBDVlMgc2VydmVyIGFuZCBhIG5hbWUgdG8KLWluY2x1ZGUgaW4gdGhlIGZvcm1hdHRlZCByZXBvcnQuCi1Bbnl0aW1lIHRoZSBzcGVjaWZpZWQgdXNlciBJRCBoYXMgbWFkZSBhIGNoYW5nZSBpbiB0aGUgcmVwb3NpdG9yeSwgdGhlCi08Y29kZT4mbHQ7YXV0aG9yJmd0OzwvY29kZT4gdGFnIGluIHRoZSByZXBvcnQgZmlsZSB3aWxsIGluY2x1ZGUKLXRoZSBuYW1lIHNwZWNpZmllZCBpbiA8Y29kZT5kaXNwbGF5bmFtZTwvY29kZT4gcmF0aGVyIHRoYW4gdGhlIHVzZXIgSUQuCi08L3A+Cis8aDQgaWQ9InVzZXIiPnVzZXI8L2g0PgorPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7dXNlciZndDs8L2NvZGU+IGVsZW1lbnQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgbWFwcGluZyBiZXR3ZWVuIGEgdXNlciBJRCBhcworaXQgYXBwZWFycyBvbiB0aGUgQ1ZTIHNlcnZlciBhbmQgYSBuYW1lIHRvIGluY2x1ZGUgaW4gdGhlIGZvcm1hdHRlZCByZXBvcnQuICBBbnl0aW1lIHRoZSBzcGVjaWZpZWQKK3VzZXIgSUQgaGFzIG1hZGUgYSBjaGFuZ2UgaW4gdGhlIHJlcG9zaXRvcnksIHRoZSA8Y29kZT4mbHQ7YXV0aG9yJmd0OzwvY29kZT4gdGFnIGluIHRoZSByZXBvcnQgZmlsZQord2lsbCBpbmNsdWRlIHRoZSBuYW1lIHNwZWNpZmllZCBpbiA8dmFyPmRpc3BsYXluYW1lPC92YXI+IHJhdGhlciB0aGFuIHRoZSB1c2VyIElELjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXNwbGF5bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSB0byBiZSB1c2VkIGluIHRoZSBDVlMgY2hhbmdlIGxvZyByZXBvcnQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRpc3BsYXluYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgdG8gYmUgdXNlZCBpbiB0aGUgQ1ZTIGNoYW5nZSBsb2cgcmVwb3J0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJpZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlcmlkIG9mIHRoZSBwZXJzb24gYXMgaXQgZXhpc3RzIG9uIHRoZSBDVlMgc2VydmVyLgorICAgIDx0ZD51c2VyaWQ8L3RkPgorICAgIDx0ZD5UaGUgdXNlciBJRCBvZiB0aGUgcGVyc29uIGFzIGl0IGV4aXN0cyBvbiB0aGUgQ1ZTIHNlcnZlci4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5tb2R1bGU8L2g0PgogCi08cD5TcGVjaWZpZXMgYSBwYWNrYWdlL21vZHVsZSB0byB3b3JrIG9uLCB1bmxpa2UgdGhlIHBhY2thZ2UgYXR0cmlidXRlCi0gIG1vZHVsZXMgc3BlY2lmaWVkIHVzaW5nIHRoaXMgYXR0cmlidXRlIGNhbiBjb250YWluIHNwYWNlcyBpbiB0aGVpcgotICBuYW1lLjwvcD4KKzxwPlNwZWNpZmllcyBhIHBhY2thZ2UvbW9kdWxlIHRvIHdvcmsgb24sIHVubGlrZSB0aGUgcGFja2FnZSBhdHRyaWJ1dGUgbW9kdWxlcyBzcGVjaWZpZWQgdXNpbmcgdGhpcworYXR0cmlidXRlIGNhbiBjb250YWluIHNwYWNlcyBpbiB0aGVpciBuYW1lLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBtb2R1bGUncy9wYWNrYWdlJ3MgbmFtZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLjwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbW9kdWxlJ3MvcGFja2FnZSdzIG5hbWUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgJmx0O2N2c2NoYW5nZWxvZyBkaXI9JnF1b3Q7ZHZlL25ldHdvcmsmcXVvdDsKLSAgICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+Ci0KLTxwPkdlbmVyYXRlcyBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbGwgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZQotdW5kZXIgdGhlIDxjb2RlPmR2ZS9uZXR3b3JrPC9jb2RlPiBkaXJlY3RvcnkuCi1JdCB3cml0ZXMgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxjb2RlPmNoYW5nZWxvZy54bWw8L2NvZGU+LjwvcD4KLQotPHByZT4gICZsdDtjdnNjaGFuZ2Vsb2cgZGlyPSZxdW90O2R2ZS9uZXR3b3JrJnF1b3Q7Ci0gICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7Y2hhbmdlbG9nLnhtbCZxdW90OwotICAgICAgICAgICAgICAgIGRheXNpbnBhc3Q9JnF1b3Q7MTAmcXVvdDsKLSAgLyZndDs8L3ByZT4KLQotPHA+R2VuZXJhdGVzIGEgY2hhbmdlIGxvZyByZXBvcnQgZm9yIGFueSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlCi11bmRlciB0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeSBpbiB0aGUgcGFzdCAxMCBkYXlzLgotSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT5jaGFuZ2Vsb2cueG1sPC9jb2RlPi48L3A+Ci0KLTxwcmU+ICAmbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OwotICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsKLSAgICAgICAgICAgICAgICBzdGFydD0mcXVvdDsyMCBGZWIgMjAwMiZxdW90OwotICAgICAgICAgICAgICAgIGVuZD0mcXVvdDsyMCBNYXIgMjAwMiZxdW90OwotICAvJmd0OzwvcHJlPgotCi08cD5HZW5lcmF0ZXMgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUKLWJldHdlZW4gRmVicnVhcnkgMjAsIDIwMDIgYW5kIE1hcmNoIDIwLCAyMDAyCi11bmRlciB0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeS4KLUl0IHdyaXRlcyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPGNvZGU+Y2hhbmdlbG9nLnhtbDwvY29kZT4uPC9wPgotCi08cHJlPiAgJmx0O2N2c2NoYW5nZWxvZyBkaXI9JnF1b3Q7ZHZlL25ldHdvcmsmcXVvdDsKLSAgICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7Ci0gICAgICAgICAgICAgICAgc3RhcnQ9JnF1b3Q7MjAgRmViIDIwMDImcXVvdDsKLSAgLyZndDs8L3ByZT4KLQotPHA+R2VuZXJhdGVzIGEgY2hhbmdlIGxvZyByZXBvcnQgZm9yIGFueSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlCi1hZnRlciBGZWJydWFyeSAyMCwgMjAwMiB1bmRlciB0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeS4KLUl0IHdyaXRlcyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPGNvZGU+Y2hhbmdlbG9nLnhtbDwvY29kZT4uPC9wPgotCi08cHJlPiAgJmx0O2N2c2NoYW5nZWxvZyBkaXI9JnF1b3Q7ZHZlL25ldHdvcmsmcXVvdDsKLSAgICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7Jmd0OwotICAgICAgICZsdDt1c2VyIGRpc3BsYXluYW1lPSZxdW90O1BldGVyIERvbmFsZCZxdW90OyB1c2VyaWQ9JnF1b3Q7ZG9uYWxkcCZxdW90Oy8mZ3Q7Ci0gICZsdDsvY3ZzY2hhbmdlbG9nJmd0OzwvcHJlPgotCi08cD5HZW5lcmF0ZXMgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlCi11bmRlciB0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeSwgc3Vic3RpdHV0aW5nIHRoZSBuYW1lCi0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsgaW4gdGhlIDxjb2RlPiZsdDthdXRob3ImZ3Q7PC9jb2RlPiB0YWdzCi1hbnl0aW1lIGl0IGVuY291bnRlcnMgYSBjaGFuZ2UgbWFkZSBieSB0aGUgdXNlciBJRCAmcXVvdDtkb25hbGRwJnF1b3Q7LgotSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT5jaGFuZ2Vsb2cueG1sPC9jb2RlPi48L3A+Ci0KLTxwPkdlbmVyYXRlcyBhIGNoYW5nZSBsb2cgcmVwb3J0IG9uIHRoZSA8Y29kZT5BTlRfMTZfQlJBTkNIPC9jb2RlPi48L3A+Cis8cD5HZW5lcmF0ZSBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbGwgdGhlIGNoYW5nZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSB1bmRlcgordGhlIDxzYW1wPmR2ZS9uZXR3b3JrPC9zYW1wPiBkaXJlY3RvcnkuIFdyaXRlIHRoZXNlIGNoYW5nZXMgaW50byB0aGUKK2ZpbGUgPHNhbXA+Y2hhbmdlbG9nLnhtbDwvc2FtcD4uPC9wPgogPHByZT4KLSAmbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtjOi9kZXYvYXNmL2FudC5oZWFkJnF1b3Q7IHBhc3NmaWxlPSZxdW90O2M6L2hvbWUvbXlzZWxmLy5jdnNwYXNzJnF1b3Q7Ci0gICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7Y2hhbmdlbG9nYW50LnhtbCZxdW90OyB0YWc9JnF1b3Q7QU5UXzE2X0JSQU5DSCZxdW90Oy8mZ3Q7Ci08L3ByZT4KKyZsdDtjdnNjaGFuZ2Vsb2cgZGlyPSZxdW90O2R2ZS9uZXR3b3JrJnF1b3Q7CisgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZSBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbnkgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZSB1bmRlciB0aGUgPHNhbXA+ZHZlL25ldHdvcms8L3NhbXA+CitkaXJlY3RvcnkgaW4gdGhlIHBhc3QgMTAgZGF5cy4gV3JpdGUgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxzYW1wPmNoYW5nZWxvZy54bWw8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7CisgICAgICAgICAgICAgIGRheXNpbnBhc3Q9JnF1b3Q7MTAmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5HZW5lcmF0ZSBhIGNoYW5nZSBsb2cgcmVwb3J0IGZvciBhbnkgY2hhbmdlcyB0aGF0IHdlcmUgbWFkZSBiZXR3ZWVuIEZlYnJ1YXJ5IDIwLCAyMDAyIGFuZCBNYXJjaAorMjAsIDIwMDIgdW5kZXIgdGhlIDxzYW1wPmR2ZS9uZXR3b3JrPC9zYW1wPiBkaXJlY3RvcnkuIFdyaXRlIHRoZXNlIGNoYW5nZXMgaW50byB0aGUKK2ZpbGUgPHNhbXA+Y2hhbmdlbG9nLnhtbDwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtjdnNjaGFuZ2Vsb2cgZGlyPSZxdW90O2R2ZS9uZXR3b3JrJnF1b3Q7CisgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O2NoYW5nZWxvZy54bWwmcXVvdDsKKyAgICAgICAgICAgICAgc3RhcnQ9JnF1b3Q7MjAgRmViIDIwMDImcXVvdDsKKyAgICAgICAgICAgICAgZW5kPSZxdW90OzIwIE1hciAyMDAyJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+R2VuZXJhdGUgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYW55IGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgYWZ0ZXIgRmVicnVhcnkgMjAsIDIwMDIgdW5kZXIKK3RoZSA8c2FtcD5kdmUvbmV0d29yazwvc2FtcD4gZGlyZWN0b3J5LiBXcml0ZSB0aGVzZSBjaGFuZ2VzIGludG8gdGhlCitmaWxlIDxzYW1wPmNoYW5nZWxvZy54bWw8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7CisgICAgICAgICAgICAgIHN0YXJ0PSZxdW90OzIwIEZlYiAyMDAyJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+R2VuZXJhdGUgYSBjaGFuZ2UgbG9nIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgd2VyZSBtYWRlIHVuZGVyCit0aGUgPGNvZGU+ZHZlL25ldHdvcms8L2NvZGU+IGRpcmVjdG9yeSwgc3Vic3RpdHV0aW5nIHRoZSBuYW1lIDxzYW1wPlBldGVyIERvbmFsZDwvc2FtcD4gaW4KK3RoZSA8Y29kZT4mbHQ7YXV0aG9yJmd0OzwvY29kZT4gdGFncyBhbnl0aW1lIGEgY2hhbmdlIG1hZGUgYnkgdGhlIHVzZXIgSUQgPHNhbXA+ZG9uYWxkcDwvc2FtcD4gaXMKK2VuY291bnRlcmVkLiAgV3JpdGUgdGhlc2UgY2hhbmdlcyBpbnRvIHRoZSBmaWxlIDxzYW1wPmNoYW5nZWxvZy54bWw8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y3ZzY2hhbmdlbG9nIGRpcj0mcXVvdDtkdmUvbmV0d29yayZxdW90OworICAgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDtjaGFuZ2Vsb2cueG1sJnF1b3Q7Jmd0OworICAgICZsdDt1c2VyIGRpc3BsYXluYW1lPSZxdW90O1BldGVyIERvbmFsZCZxdW90OyB1c2VyaWQ9JnF1b3Q7ZG9uYWxkcCZxdW90Oy8mZ3Q7CismbHQ7L2N2c2NoYW5nZWxvZyZndDs8L3ByZT4KKworPHA+R2VuZXJhdGUgYSBjaGFuZ2UgbG9nIHJlcG9ydCBvbiB0aGUgPGNvZGU+QU5UXzE2X0JSQU5DSDwvY29kZT4uPC9wPgorPHByZT4KKyZsdDtjdnNjaGFuZ2Vsb2cgZGlyPSZxdW90O2M6L2Rldi9hc2YvYW50LmhlYWQmcXVvdDsgcGFzc2ZpbGU9JnF1b3Q7YzovaG9tZS9teXNlbGYvLmN2c3Bhc3MmcXVvdDsKKyAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7Y2hhbmdlbG9nYW50LnhtbCZxdW90OyB0YWc9JnF1b3Q7QU5UXzE2X0JSQU5DSCZxdW90Oy8mZ3Q7PC9wcmU+CiA8aDQ+R2VuZXJhdGUgUmVwb3J0PC9oND4KLTxwPkFudCBpbmNsdWRlcyBhIGJhc2ljIFhTTFQgc3R5bGVzaGVldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGdlbmVyYXRlIAotYSBIVE1MIHJlcG9ydCBiYXNlZCBvbiB0aGUgeG1sIG91dHB1dC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzCi1ob3cgdG8gZ2VuZXJhdGUgYSBIVE1MIHJlcG9ydCBmcm9tIHRoZSBYTUwgcmVwb3J0LjwvcD4KKzxwPkFudCBpbmNsdWRlcyBhIGJhc2ljIFhTTFQgc3R5bGVzaGVldCB0aGF0IHlvdSBjYW4gdXNlIHRvIGdlbmVyYXRlIGEgSFRNTCByZXBvcnQgYmFzZWQgb24gdGhlIFhNTAorb3V0cHV0LiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgaG93IHRvIGdlbmVyYXRlIGEgSFRNTCByZXBvcnQgZnJvbSB0aGUgWE1MIHJlcG9ydC48L3A+CiAKIDxwcmU+Ci0gICAgICAgICZsdDtzdHlsZSBpbj0iY2hhbmdlbG9nLnhtbCIgCi0gICAgICAgICAgICAgICBvdXQ9ImNoYW5nZWxvZy5odG1sIiAKLSAgICAgICAgICAgICAgIHN0eWxlPSIke2FudC5ob21lfS9ldGMvY2hhbmdlbG9nLnhzbCImZ3Q7Ci0gICAgICAgICAgJmx0O3BhcmFtIG5hbWU9InRpdGxlIiBleHByZXNzaW9uPSJBbnQgQ2hhbmdlTG9nIi8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iYW50Ii8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImN2c3dlYiIgZXhwcmVzc2lvbj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvIi8mZ3Q7Ci0gICAgICAgICZsdDsvc3R5bGUmZ3Q7Ci08L3ByZT4KKyZsdDtzdHlsZSBpbj0iY2hhbmdlbG9nLnhtbCIKKyAgICAgIG91dD0iY2hhbmdlbG9nLmh0bWwiCisgICAgICBzdHlsZT0iJHthbnQuaG9tZX0vZXRjL2NoYW5nZWxvZy54c2wiJmd0OworICAmbHQ7cGFyYW0gbmFtZT0idGl0bGUiIGV4cHJlc3Npb249IkFudCBDaGFuZ2VMb2ciLyZndDsKKyAgJmx0O3BhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iYW50Ii8mZ3Q7CisgICZsdDtwYXJhbSBuYW1lPSJjdnN3ZWIiIGV4cHJlc3Npb249Imh0dHBzOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy8iLyZndDsKKyZsdDsvc3R5bGUmZ3Q7PC9wcmU+CiAKIDxoND5TYW1wbGUgT3V0cHV0PC9oND4KIDxwcmU+CkBAIC0yODQsMTEgKzI1OCw3IEBACiAKIFRoaXMgYWxsb3dzIHRlbXBsYXRlcyB0byBiZSBzdG9yZWQgaW5zaWRlIGphcl1dJmd0OyZsdDsvbXNnJmd0OwogICAmbHQ7L2VudHJ5Jmd0OwotJmx0Oy9jaGFuZ2Vsb2cmZ3Q7Ci08L3ByZT4KLQotCismbHQ7L2NoYW5nZWxvZyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2hlY2tzdW0uaHRtbCBiL21hbnVhbC9UYXNrcy9jaGVja3N1bS5odG1sCmluZGV4IDI5ZjQ4ZGQuLjA2NDA4MTQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jaGVja3N1bS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jaGVja3N1bS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjU2ICsxNSwyMjQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkNoZWNrc3VtIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImNoZWNrc3VtIj5DaGVja3N1bTwvYT48L2gyPgorPGgyIGlkPSJjaGVja3N1bSI+Q2hlY2tzdW08L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPgotR2VuZXJhdGVzIGNoZWNrc3VtIGZvciBmaWxlcy4gIFRoaXMgdGFzayBjYW4gYWxzbyBiZSB1c2VkIHRvCi1wZXJmb3JtIGNoZWNrc3VtIHZlcmlmaWNhdGlvbnMuCi08L3A+Cis8cD5HZW5lcmF0ZXMgY2hlY2tzdW0gZm9yIGZpbGVzLiAgVGhpcyB0YXNrIGNhbiBhbHNvIGJlIHVzZWQgdG8gcGVyZm9ybSBjaGVja3N1bSB2ZXJpZmljYXRpb25zLjwvcD4KIAotPHA+Tm90ZSB0aGF0IG1hbnkgcG9wdWxhciBtZXNzYWdlIGRpZ2VzdCBmdW5jdGlvbnMgLSBpbmNsdWRpbmcgTUQ1IGFuZAotU0hBLTEgLSBoYXZlIGJlZW4gYnJva2VuIHJlY2VudGx5LiAgSWYgeW91IGFyZSBnb2luZyB0byB1c2UgdGhlIHRhc2sKLXRvIGNyZWF0ZSBjaGVja3N1bXMgdXNlZCBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBzZWN1cml0eSBpcwotaW1wb3J0YW50LCBwbGVhc2UgdGFrZSBzb21lIHRpbWUgdG8gaW52ZXN0aWdhdGUgdGhlIGFsZ29yaXRobXMgb2ZmZXJlZAotYnkgeW91ciBKQ0UgcHJvdmlkZXIuICBOb3RlIGFsc28gdGhhdCBzb21lIEpDRSBwcm92aWRlcnMgbGlrZSB0aGUgb25lCi1ieSA8YSBocmVmPSJodHRwOi8vd3d3LmJvdW5jeWNhc3RsZS5vcmcvIj5UaGUgTGVnaW9uIG9mIHRoZSBCb3VuY3kKLUNhc3RsZTwvYT4sIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ251LWNyeXB0by8iPkdOVQotcHJvamVjdDwvYT4gb3IgPGEKLWhyZWY9Imh0dHA6Ly9qY2UuaWFpay50dWdyYXouYXQvcHJvZHVjdHMvMDFfamNlL2luZGV4LnBocCI+dGhlCi1UZWNobmljYWwgVW5pdmVyc2l0eSBHcmF6PC9hPiBvZmZlciBtb3JlIGRpZ2VzdCBhbGdvcml0aG1zIHRoYW4gdGhvc2UKLWJ1aWx0LWluIGludG8geW91ciBKREsuPC9wPgorPHA+Tm90ZSB0aGF0IG1hbnkgcG9wdWxhciBtZXNzYWdlIGRpZ2VzdCBmdW5jdGlvbnMmbWRhc2g7aW5jbHVkaW5nIE1ENSBhbmQgU0hBLTEmbWRhc2g7aGF2ZSBiZWVuCiticm9rZW4gcmVjZW50bHkuICBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSB0aGUgdGFzayB0byBjcmVhdGUgY2hlY2tzdW1zIHVzZWQgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUKK3NlY3VyaXR5IGlzIGltcG9ydGFudCwgcGxlYXNlIHRha2Ugc29tZSB0aW1lIHRvIGludmVzdGlnYXRlIHRoZSBhbGdvcml0aG1zIG9mZmVyZWQgYnkgeW91ciBKQ0UKK3Byb3ZpZGVyLiAgTm90ZSBhbHNvIHRoYXQgc29tZSBKQ0UgcHJvdmlkZXJzIGxpa2UgdGhlIG9uZSBieSA8YSBocmVmPSJodHRwczovL3d3dy5ib3VuY3ljYXN0bGUub3JnLyIKK3RhcmdldD0iX3RvcCI+VGhlIExlZ2lvbiBvZiB0aGUgQm91bmN5IENhc3RsZTwvYT4sCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbnUtY3J5cHRvLyIgdGFyZ2V0PSJfdG9wIj5HTlUgQ3J5cHRvIHByb2plY3Q8L2E+CitvciA8YSBocmVmPSJodHRwczovL2pjZS5pYWlrLnR1Z3Jhei5hdC9zaWMvUHJvZHVjdHMiIHRhcmdldD0iX3RvcCI+dGhlIFRlY2huaWNhbCBVbml2ZXJzaXR5IEdyYXo8L2E+CitvZmZlciBtb3JlIGRpZ2VzdCBhbGdvcml0aG1zIHRoYW4gdGhvc2UgYnVpbHQtaW4gaW50byB5b3VyIEpESy48L3A+CiAKLTxwPgotV2FybmluZzogdGhlIGNhc2Ugb2YgdGhlIGV4dGVuc2lvbiBpcyB0aGF0IG9mIHRoZSBhbGdvcml0aG0gdXNlZC4KLUlmIHlvdSBhc2sgZm9yICJTSEExIiwgeW91IGdldCBhIC5TSEExIGV4dGVuc2lvbjsgaWYgeW91IGFzayBmb3IgInNoYTEiLCB5b3UKLWdldCBhIGZpbGUgZW5kaW5nIGluIC5zaGExLiBUaGUgSmF2YSBDcnlwdG8gRW5naW5lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZQotaW4gbWF0Y2hpbmcgYWxnb3JpdGhtcywgc28gY2hvb3NlIGEgbmFtZSB0byBtYXRjaCB5b3VyIGRlc2lyZWQgb3V0cHV0IGV4dGVuc2lvbiwKLW9yIHNldCB0aGUgPHR0PmZpbGVleHQ8L3R0PiBhdHRyaWJ1dGUuIFRoZSBuYW1lcyBvZiBjb21tb24gaGFzaGluZyBhbGdvcml0aG1zIGNhbiBiZSBsb2NhdGVkIG9uIHRoZQotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3NlY3VyaXR5L1N0YW5kYXJkTmFtZXMuaHRtbCNNZXNzYWdlRGlnZXN0Ij5DcnlwdG9ncmFwaHkgQXJjaGl0ZWN0dXJlIFN0YW5kYXJkIEFsZ29yaXRobSBOYW1lIERvY3VtZW50YXRpb248L2E+Ci08L3A+Cis8cD5XYXJuaW5nOiB0aGUgY2FzZSBvZiB0aGUgZXh0ZW5zaW9uIGlzIHRoYXQgb2YgdGhlIGFsZ29yaXRobSB1c2VkLiAgSWYgeW91IGFzaworZm9yIDxzYW1wPlNIQTE8L3NhbXA+LCB5b3UgZ2V0IGEgPHNhbXA+LlNIQTE8L3NhbXA+IGV4dGVuc2lvbjsgaWYgeW91IGFzayBmb3IgPHNhbXA+c2hhMTwvc2FtcD4sIHlvdQorZ2V0IGEgZmlsZSBlbmRpbmcgaW4gPHNhbXA+LnNoYTE8L3NhbXA+LiBUaGUgSmF2YSBDcnlwdG8gRW5naW5lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSBpbiBtYXRjaGluZworYWxnb3JpdGhtcywgc28gY2hvb3NlIGEgbmFtZSB0byBtYXRjaCB5b3VyIGRlc2lyZWQgb3V0cHV0IGV4dGVuc2lvbiwgb3Igc2V0IHRoZSA8dmFyPmZpbGVleHQ8L3Zhcj4KK2F0dHJpYnV0ZS4gVGhlIG5hbWVzIG9mIGNvbW1vbiBoYXNoaW5nIGFsZ29yaXRobXMgY2FuIGJlIGxvY2F0ZWQgb24KK3RoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvU3RhbmRhcmROYW1lcy5odG1sI01lc3NhZ2VEaWdlc3QiCit0YXJnZXQ9Il90b3AiPkNyeXB0b2dyYXBoeSBBcmNoaXRlY3R1cmUgU3RhbmRhcmQgQWxnb3JpdGhtIE5hbWUgRG9jdW1lbnRhdGlvbjwvYT48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBnZW5lcmF0ZSBjaGVja3N1bSBmb3IuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk9uZSBvZiBlaXRoZXIgPHZhcj5maWxlPC92YXI+IG9yCi0gICAgYXQgbGVhc3Qgb25lIG5lc3RlZCAoZmlsZXN5c3RlbS1vbmx5KSByZXNvdXJjZSBjb2xsZWN0aW9uLjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBnZW5lcmF0ZSBjaGVja3N1bSBmb3IuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYXQgbGVhc3Qgb25lIG5lc3RlZCAoZmlsZXN5c3RlbS1vbmx5KSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHNwZWNpZmllZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcm9vdCBkaXJlY3Rvcnkgd2hlcmUgY2hlY2tzdW1zIHNob3VsZCBiZSB3cml0dGVuLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby4gSWYgbm90IHNwZWNpZmllZCwgY2hlY2tzdW0gZmlsZXMKLSAgICAgIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuCi0gICAgICA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPgorICAgIDx0ZD50b2RpcjwvdGQ+CisgICAgPHRkPlRoZSByb290IGRpcmVjdG9yeSB3aGVyZSBjaGVja3N1bXMgc2hvdWxkIGJlIHdyaXR0ZW4uPC90ZD4KKyAgICA8dGQ+Tm87IGJ5IGRlZmF1bHQsIGNoZWNrc3VtIGZpbGVzIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIG9yaWdpbmFsCisgICAgICBmaWxlcy4gIDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+CiAgICAgPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWxnb3JpdGhtPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgYWxnb3JpdGhtIHRvIGJlIHVzZWQgdG8KLSAgICAgIGNvbXB1dGUgdGhlIGNoZWNrc3VtLiBEZWZhdWx0cyB0byAmcXVvdDtNRDUmcXVvdDsuCi0gICAgICBPdGhlciA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvc2VjdXJpdHkvU3RhbmRhcmROYW1lcy5odG1sI01lc3NhZ2VEaWdlc3QiPnBvcHVsYXIgYWxnb3JpdGhtczwvYT4gbGlrZSAmcXVvdDtTSEEmcXVvdDsgb3IgJnF1b3Q7U0hBLTUxMiZxdW90OyBtYXkgYmUgdXNlZAotICAgICAgYXMgd2VsbC4KKyAgICA8dGQ+YWxnb3JpdGhtPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBhbGdvcml0aG0gdG8gYmUgdXNlZCB0byBjb21wdXRlIHRoZSBjaGVja3N1bS4gUGxlYXNlIGNoZWNrCisgICAgICB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3NlY3VyaXR5L1N0YW5kYXJkTmFtZXMuaHRtbCNNZXNzYWdlRGlnZXN0IgorICAgICAgdGFyZ2V0PSJfdG9wIj5kb2N1bWVudGF0aW9uPC9hPiBmb3IgYXZhaWxhYmxlIGFsZ29yaXRobSBuYW1lcywgbGlrZSA8cT5TSEEtMTwvcT4KKyAgICAgIG9yIDxxPlNIQS01MTI8L3E+LgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5NRDU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvdmlkZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBwcm92aWRlciBvZiB0aGUgYWxnb3JpdGhtLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnByb3ZpZGVyPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBwcm92aWRlciBvZiB0aGUgYWxnb3JpdGhtLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZWV4dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZ2VuZXJhdGVkIGNoZWNrc3VtIGZpbGUncyBuYW1lIHdpbGwgYmUgdGhlCi0gICAgb3JpZ2luYWwgZmlsZW5hbWUgd2l0aCB0aGUgZmlsZWV4dCBhZGRlZCB0byBpdC4KLSAgICBEZWZhdWx0cyB0byBhICIuIiBhbmQgdGhlIGFsZ29yaXRobSBuYW1lIGJlaW5nIHVzZWQuCisgICAgPHRkPmZpbGVleHQ8L3RkPgorICAgIDx0ZD5UaGUgZ2VuZXJhdGVkIGNoZWNrc3VtIGZpbGUncyBuYW1lIHdpbGwgYmUgdGhlIG9yaWdpbmFsIGZpbGVuYW1lIHdpdGggdGhlIDx2YXI+ZmlsZWV4dDwvdmFyPgorICAgICAgYWRkZWQgdG8gaXQuCiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGEgPHE+LjwvcT4gYW5kIHRoZSBhbGdvcml0aG0gbmFtZSBiZWluZyB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgY2FuIG1lYW4gdHdvIGRpZmZlcmVudCB0aGluZ3MsIGl0Ci0gICAgZGVwZW5kcyBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIHZlcmlmeXByb3BlcnR5IGF0dHJpYnV0ZS48YnI+Ci0gICAgPGI+SWYgeW91IGRvbid0IHNldCB0aGUgdmVyaWZ5cHJvcGVydHkgYXR0cmlidXRlPC9iPiwgcHJvcGVydHkKLSAgICBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldCB3aXRoIHRoZSBnZW5lcmF0ZWQKLSAgICBjaGVja3N1bSB2YWx1ZS48YnI+Ci0gICAgPGI+SWYgeW91IHNldCB0aGUgdmVyaWZ5cHJvcGVydHkgYXR0cmlidXRlPC9iPiwgcHJvcGVydHkgc3BlY2lmaWVzCi0gICAgdGhlIGNoZWNrc3VtIHlvdSBleHBlY3QgdG8gYmUgZ2VuZXJhdGVkICh0aGUgY2hlY2tzdW0gaXRzZWxmLCBub3QKLSAgICBhIG5hbWUgb2YgYSBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBjaGVja3N1bSkuPGJyPgotICAgIFRoaXMgY2Fubm90IGJlIHNwZWNpZmllZCB3aGVuIGZpbGVleHQgaXMgYmVpbmcgdXNlZCBvciB3aGVuIHRoZQotICAgIG51bWJlciBvZiBmaWxlcyBmb3Igd2hpY2ggY2hlY2tzdW1zIGlzIHRvIGJlIGdlbmVyYXRlZCBpcyBncmVhdGVyCi0gICAgdGhhbiAxLgorICAgIDx0ZD5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoaXMgYXR0cmlidXRlIGNhbiBtZWFuIHR3byBkaWZmZXJlbnQgdGhpbmdzLCBpdCBkZXBlbmRzIG9uIHRoZSBwcmVzZW5jZSBvZgorICAgICAgdGhlIDx2YXI+dmVyaWZ5cHJvcGVydHk8L3Zhcj4gYXR0cmlidXRlLjxici8+PHN0cm9uZz5JZiB5b3UgZG9uJ3Qgc2V0PC9zdHJvbmc+CisgICAgICB0aGUgPHZhcj52ZXJpZnlwcm9wZXJ0eTwvdmFyPiBhdHRyaWJ1dGUsIHByb3BlcnR5IHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0CisgICAgICB3aXRoIHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0gdmFsdWUuPGJyLz48c3Ryb25nPklmIHlvdSBzZXQ8L3N0cm9uZz4KKyAgICAgIHRoZSA8dmFyPnZlcmlmeXByb3BlcnR5PC92YXI+IGF0dHJpYnV0ZSwgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBjaGVja3N1bSB5b3UgZXhwZWN0IHRvIGJlCisgICAgICBnZW5lcmF0ZWQgKHRoZSBjaGVja3N1bSBpdHNlbGYsIG5vdCBhIG5hbWUgb2YgYSBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBjaGVja3N1bSkuPGJyLz4gIFRoaXMKKyAgICAgIGNhbm5vdCBiZSBzcGVjaWZpZWQgd2hlbiA8dmFyPmZpbGVleHQ8L3Zhcj4gaXMgYmVpbmcgdXNlZCBvciB3aGVuIHRoZSBudW1iZXIgb2YgZmlsZXMgZm9yCisgICAgICB3aGljaCBjaGVja3N1bXMgYXJlIHRvIGJlIGdlbmVyYXRlZCBpcyBncmVhdGVyIHRoYW4gMS4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBwYXR0ZXJuIHRvIHVzZSBhcyBhIHBhdHRlcm4KLSAgICBzdWl0YWJsZQotICAgIGZvciA8YSBocmVmPSJodHRwOi8vZG93bmxvYWQub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL2FwaS9qYXZhL3RleHQvTWVzc2FnZUZvcm1hdC5odG1sIj5NZXNzYWdlRm9ybWF0PC9hPgotICAgIHdoZXJlIDxjb2RlPnswfTwvY29kZT4gaXMgcmVwbGFjZWQgd2l0aCB0aGUgY2hlY2tzdW0gYW5kCi0gICAgICA8Y29kZT57MX08L2NvZGU+IHdpdGggdGhlIGZpbGUgbmFtZS4gPGVtPlNpbmNlIEFudAotICAgICAgMS43LjA8L2VtPjxici8+Ci0gICAgICA8ZW0+c3RhcnRpbmcgd2l0aCBBbnQgMS44LjI8L2VtPiA8Y29kZT57Mn08L2NvZGU+IGlzIHJlcGxhY2VkIGJ5Ci0gICAgICB0aGUgcGF0aCBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgY2hlY2tzdW0gZmlsZSBiZWluZwotICAgICAgd3JpdHRlbiwgPGNvZGU+ezN9PC9jb2RlPiB3aXRoIHRoYSBwYXRoIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvCi0gICAgICB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIDxjb2RlPns0fTwvY29kZT4gd2l0aCB0aGUgYWJzb2x1dGUKLSAgICAgIHBhdGggb2YgdGhlIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAmcXVvdDt7MH0mcXVvdDsuPC90ZD4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgcGF0dGVybiB0byB1c2UgYXMgYSBwYXR0ZXJuIHN1aXRhYmxlCisgICAgZm9yIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdGV4dC9NZXNzYWdlRm9ybWF0Lmh0bWwiCisgICAgdGFyZ2V0PSJfdG9wIj5NZXNzYWdlRm9ybWF0PC9hPiB3aGVyZSA8Y29kZT57MH08L2NvZGU+IGlzIHJlcGxhY2VkIHdpdGggdGhlIGNoZWNrc3VtCisgICAgYW5kIDxjb2RlPnsxfTwvY29kZT4gd2l0aCB0aGUgZmlsZSBuYW1lLiA8ZW0+U2luY2UgQW50IDEuNy4wPC9lbT48YnIvPjxlbT5TaW5jZSBBbnQKKyAgICAxLjguMjwvZW0+IDxjb2RlPnsyfTwvY29kZT4gaXMgcmVwbGFjZWQgYnkgdGhlIHBhdGggb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGNoZWNrc3VtIGZpbGUKKyAgICBiZWluZyB3cml0dGVuLCA8Y29kZT57M308L2NvZGU+IHdpdGggdGhlIHBhdGggb2YgdGhlIGZpbGUgcmVsYXRpdmUgdG8gdGhlCisgICAgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPiBhbmQgPGNvZGU+ezR9PC9jb2RlPiB3aXRoIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnswfTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JtYXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBwYXR0ZXJuIHRvIHVzZSBhcyBvbmUgb2YgYQotICAgIHdlbGwta25vd24gZm9ybWF0LiAgU3VwcG9ydGVkIHZhbHVlcyBhcmUgCi0gICAgICA8dGFibGUgYm9yZGVyPSIxIj4KKyAgICA8dGQ+Zm9ybWF0PC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBwYXR0ZXJuIHRvIHVzZSBhcyBvbmUgb2YgYSB3ZWxsLWtub3duIGZvcm1hdC4gIFN1cHBvcnRlZCB2YWx1ZXMgYXJlCisgICAgICA8dGFibGU+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0aD5uYW1lPC90aD4KLSAgICAgICAgPHRoPnBhdHRlcm48L3RoPgotICAgICAgICA8dGg+ZGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+bmFtZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5wYXR0ZXJuPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPmRlc2NyaXB0aW9uPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD5DSEVDS1NVTSA8L3RkPgotICAgICAgICA8dGQ+PHR0PnswfTwvdHQ+PC90ZD4KLSAgICAgICAgPHRkPm9ubHkgdGhlIGNoZWNrc3VtIGl0c2VsZiA8L3RkPgorICAgICAgICA8dGQ+Q0hFQ0tTVU08L3RkPgorICAgICAgICA8dGQ+PGNvZGU+ezB9PC9jb2RlPjwvdGQ+CisgICAgICAgIDx0ZD5vbmx5IHRoZSBjaGVja3N1bSBpdHNlbGY8L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkPk1ENVNVTSA8L3RkPgotICAgICAgICA8dGQ+PHR0PnswfSAqezF9PC90dD48L3RkPgotICAgICAgICA8dGQ+dGhlIGZvcm1hdCBvZiBHTlUgdGV4dHV0aWxzIG1kNXN1bTwvdGQ+CisgICAgICAgIDx0ZD5NRDVTVU08L3RkPgorICAgICAgICA8dGQ+PGNvZGU+ezB9ICp7MX08L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPnRoZSBmb3JtYXQgb2YgR05VIHRleHR1dGlscyA8Y29kZT5tZDVzdW08L2NvZGU+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD5TVkYgPC90ZD4KLSAgICAgICAgPHRkPjx0dD5NRDUgKHsxfSkgPSB7MH08L3R0PjwvdGQ+Ci0gICAgICAgIDx0ZD50aGUgZm9ybWF0IG9mIEJTRHMgbWQ1IGNvbW1hbmQgPC90ZD4KKyAgICAgICAgPHRkPlNWRjwvdGQ+CisgICAgICAgIDx0ZD48Y29kZT5NRDUgKHsxfSkgPSB7MH08L2NvZGU+PC90ZD4KKyAgICAgICAgPHRkPnRoZSBmb3JtYXQgb2YgQlNEIDxjb2RlPm1kNTwvY29kZT4gY29tbWFuZDwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPC90YWJsZT4KLSAgICAgICA8ZW0+U2luY2UgQW50IDEuNy4wPC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IGlzICZxdW90O0NIRUNLU1VNJnF1b3Q7LjwvdGQ+CisgICAgICA8ZW0+U2luY2UgQW50IDEuNy4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5DSEVDS1NVTTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b3RhbHByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNwZWNpZmllZCwgdGhpcyBhdHRyaWJ1dGUgc3BlY2lmaWVzIHRoZSBuYW1lIG9mCi0gICAgICB0aGUgcHJvcGVydHkgdGhhdCB3aWxsIGhvbGQgYSBjaGVja3N1bSBvZiBhbGwgdGhlIGNoZWNrc3VtcyBhbmQKLSAgICAgIGZpbGUgcGF0aHMuIFRoZSBpbmRpdmlkdWFsIGNoZWNrc3VtcyBhbmQgdGhlIHJlbGF0aXZlIHBhdGhzIHRvIHRoZSBmaWxlcwotICAgICAgd2l0aGluIHRoZSByZXNvdXJjZSBjb2xsZWN0aW9ucyBpbiB3aGljaCB0aGV5IGFyZSBkZWZpbmVkIHdpbGwgYmUgdXNlZCB0bwotICAgICAgY29tcHV0ZSB0aGlzIGNoZWNrc3VtLiAoVGhlIGZpbGUgc2VwYXJhdG9ycyBpbiB0aGUgcGF0aHMgd2lsbCBiZQotICAgICAgY29udmVydGVkIHRvICcvJyBiZWZvcmUgY29tcHV0YXRpb24gdG8gZW5zdXJlIHBsYXRmb3JtIHBvcnRhYmlsaXR5KS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50b3RhbHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+SWYgc3BlY2lmaWVkLCB0aGlzIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2lsbCBob2xkIGEgY2hlY2tzdW0gb2YKKyAgICAgIGFsbCB0aGUgY2hlY2tzdW1zIGFuZCBmaWxlIHBhdGhzLiBUaGUgaW5kaXZpZHVhbCBjaGVja3N1bXMgYW5kIHRoZSByZWxhdGl2ZSBwYXRocyB0byB0aGUgZmlsZXMKKyAgICAgIHdpdGhpbiB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbnMgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCB3aWxsIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGlzCisgICAgICBjaGVja3N1bS4gKFRoZSBmaWxlIHNlcGFyYXRvcnMgaW4gdGhlIHBhdGhzIHdpbGwgYmUgY29udmVydGVkIHRvIDxxPi88L3E+IGJlZm9yZSBjb21wdXRhdGlvbgorICAgICAgdG8gZW5zdXJlIHBsYXRmb3JtIHBvcnRhYmlsaXR5KS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlb3ZlcndyaXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgotICAgICAgZmlsZXMgYXJlIG5ld2VyLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mb3JjZW92ZXJ3cml0ZTwvdGQ+CisgICAgPHRkPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlcyBhcmUgbmV3ZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmlmeXByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0Ci0gICAgd2l0aCAmcXVvdDt0cnVlJnF1b3Q7IG9yICZxdW90O2ZhbHNlJnF1b3Q7IGRlcGVuZGluZyB1cG9uIHdoZXRoZXIKLSAgICB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtIG1hdGNoZXMgdGhlIGV4aXN0aW5nIGNoZWNrc3VtLiAgV2hlbgotICAgIHRoaXMgaXMgc2V0LCB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtIGlzIG5vdCB3cml0dGVuIHRvIGEgZmlsZSBvcgotICAgIHByb3BlcnR5LCBidXQgcmF0aGVyLCB0aGUgY29udGVudCBvZiB0aGUgZmlsZSBvciBwcm9wZXJ0eSBpcyB1c2VkIHRvCi0gICAgY2hlY2sgYWdhaW5zdCB0aGUgZ2VuZXJhdGVkIGNoZWNrc3VtLgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD52ZXJpZnlwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgc2V0IHdpdGggPHE+dHJ1ZTwvcT4gb3IgPHE+ZmFsc2U8L3E+IGRlcGVuZGluZyB1cG9uCisgICAgICB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0gbWF0Y2hlcyB0aGUgZXhpc3RpbmcgY2hlY2tzdW0uICBXaGVuIHRoaXMgaXMgc2V0LCB0aGUgZ2VuZXJhdGVkCisgICAgICBjaGVja3N1bSBpcyBub3Qgd3JpdHRlbiB0byBhIGZpbGUgb3IgcHJvcGVydHksIGJ1dCByYXRoZXIsIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIHByb3BlcnR5CisgICAgICBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgdGhlIGdlbmVyYXRlZCBjaGVja3N1bS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlYWRidWZmZXJzaXplPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzaXplIG9mIHRoZSBidWZmZXIgKGluIGJ5dGVzKSB0byB1c2Ugd2hlbgotICAgIHJlYWRpbmcgYSBmaWxlLiBEZWZhdWx0cyB0byAmcXVvdDs4MTkyJnF1b3Q7IC0geW91IG1heSBnZXQgYQotICAgIGJldHRlciBwZXJmb3JtYW5jZSBvbiBiaWcgZmlsZXMgaWYgeW91IGluY3JlYXNlIHRoaXMgdmFsdWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVhZGJ1ZmZlcnNpemU8L3RkPgorICAgIDx0ZD5UaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIChpbiBieXRlcykgdG8gdXNlIHdoZW4gcmVhZGluZyBhIGZpbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjgxOTI8L3E+Jm1kYXNoO3lvdSBtYXkgZ2V0IGEgYmV0dGVyIHBlcmZvcm1hbmNlIG9uIGJpZyBmaWxlcyBpZiB5b3UKKyAgICAgIGluY3JlYXNlIHRoaXMgdmFsdWU8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08aDQ+cmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Ci0gPHA+Ci0gPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZQotIHVzZWQgdG8gc2VsZWN0IGZpbGVzIGZvciB3aGljaCBjaGVja3N1bXMgc2hvdWxkIGJlIGdlbmVyYXRlZC4KLSA8L3A+Cis8aDQ+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2g0PgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcworZm9yIHdoaWNoIGNoZWNrc3VtcyBzaG91bGQgYmUgZ2VuZXJhdGVkLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPkV4YW1wbGUgMTwvYj48L3A+Ci08YmxvY2txdW90ZT48cHJlPiZsdDtjaGVja3N1bSBmaWxlPSZxdW90O2Zvby5iYXImcXVvdDsvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLUdlbmVyYXRlcyBhIE1ENSBjaGVja3N1bSBmb3IgZm9vLmJhciBhbmQgc3RvcmVzIHRoZSBjaGVja3N1bSBpbiB0aGUgZGVzdGluYXRpb24gZmlsZQotZm9vLmJhci5NRDUuICBmb28uYmFyLk1ENSBpcyBvdmVyd3JpdHRlbiBvbmx5IGlmIGZvby5iYXIgaXMgbmV3ZXIgdGhhbiBpdHNlbGYuCiAKLTxwPjxiPkV4YW1wbGUgMjwvYj48L3A+Ci08YmxvY2txdW90ZT48cHJlPiZsdDtjaGVja3N1bSBmaWxlPSZxdW90O2Zvby5iYXImcXVvdDsgZm9yY2VPdmVyd3JpdGU9JnF1b3Q7eWVzJnF1b3Q7LyZndDs8L3ByZT48L2Jsb2NrcXVvdGU+Ci1HZW5lcmF0ZXMgYSBNRDUgY2hlY2tzdW0gZm9yIGZvby5iYXIgYW5kIHN0b3JlcyB0aGUgY2hlY2tzdW0gaW4gZm9vLmJhci5NRDUuCi1JZiBmb28uYmFyLk1ENSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgb3ZlcndyaXR0ZW4uCis8cD48c3Ryb25nPkV4YW1wbGUgMTwvc3Ryb25nPjwvcD4KKzxwPkdlbmVyYXRlIGEgTUQ1IGNoZWNrc3VtIGZvciA8c2FtcD5mb28uYmFyPC9zYW1wPiBhbmQgc3RvcmUgdGhlIGNoZWNrc3VtIGluIHRoZSBkZXN0aW5hdGlvbgorZmlsZSA8c2FtcD5mb28uYmFyLk1ENTwvc2FtcD4uICA8c2FtcD5mb28uYmFyLk1ENTwvc2FtcD4gaXMgb3ZlcndyaXR0ZW4gb25seSBpZiA8c2FtcD5mb28uYmFyPC9zYW1wPgoraXMgbmV3ZXIgdGhhbiBpdHNlbGYuPC9wPgorPHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+PGI+RXhhbXBsZSAzPC9iPjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90OyBwcm9wZXJ0eT0mcXVvdDtmb29iYXJNRDUmcXVvdDsvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLUdlbmVyYXRlcyBhIE1ENSBjaGVja3N1bSBmb3IgZm9vLmJhciBhbmQgc3RvcmVzIGl0IGluIHRoZSBQcm9qZWN0IFByb3BlcnR5IGZvb2Jhck1ENS4KKzxwPjxzdHJvbmc+RXhhbXBsZSAyPC9zdHJvbmc+PC9wPgorPHA+R2VuZXJhdGUgYSBNRDUgY2hlY2tzdW0gZm9yIDxzYW1wPmZvby5iYXI8L3NhbXA+IGFuZCBzdG9yZSB0aGUgY2hlY2tzdW0KK2luIDxzYW1wPmZvby5iYXIuTUQ1PC9zYW1wPi4gIElmIDxzYW1wPmZvby5iYXIuTUQ1PC9zYW1wPiBhbHJlYWR5IGV4aXN0cywgaXQgaXMgb3ZlcndyaXR0ZW4uPC9wPgorPHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IGZvcmNlT3ZlcndyaXRlPSZxdW90O3llcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPjxiPkV4YW1wbGUgNDwvYj48L3A+Ci08YmxvY2txdW90ZT48cHJlPiZsdDtjaGVja3N1bSBmaWxlPSZxdW90O2Zvby5iYXImcXVvdDsgdmVyaWZ5UHJvcGVydHk9JnF1b3Q7aXNNRDVvayZxdW90Oy8mZ3Q7PC9wcmU+PC9ibG9ja3F1b3RlPgotR2VuZXJhdGVzIGEgTUQ1IGNoZWNrc3VtIGZvciBmb28uYmFyLCBjb21wYXJlcyBpdCBhZ2FpbnN0IGZvby5iYXIuTUQ1IGFuZCBzZXRzCi1pc01ENW9rIHRvIGVpdGhlciB0cnVlIG9yIGZhbHNlLCBkZXBlbmRpbmcgdXBvbiB0aGUgcmVzdWx0LgorPHA+PHN0cm9uZz5FeGFtcGxlIDM8L3N0cm9uZz48L3A+Cis8cD5HZW5lcmF0ZSBhIE1ENSBjaGVja3N1bSBmb3IgPHNhbXA+Zm9vLmJhcjwvc2FtcD4gYW5kIHN0b3JlIGl0IGluIHRoZSBwcm9qZWN0Citwcm9wZXJ0eSA8Y29kZT5mb29iYXJNRDU8L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O2NoZWNrc3VtIGZpbGU9JnF1b3Q7Zm9vLmJhciZxdW90OyBwcm9wZXJ0eT0mcXVvdDtmb29iYXJNRDUmcXVvdDsvJmd0OzwvcHJlPgogCi08cD48Yj5FeGFtcGxlIDU8L2I+PC9wPgotPGJsb2NrcXVvdGU+PHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IGFsZ29yaXRobT0mcXVvdDtTSEEtNTEyJnF1b3Q7IGZpbGVleHQ9JnF1b3Q7YXNjJnF1b3Q7LyZndDs8L3ByZT48L2Jsb2NrcXVvdGU+Ci1HZW5lcmF0ZXMgYSBTSEEtNTEyIGNoZWNrc3VtIGZvciBmb28uYmFyIGFuZCBzdG9yZXMgdGhlIGNoZWNrc3VtIGluIHRoZSBkZXN0aW5hdGlvbiBmaWxlCi1mb28uYmFyLmFzYy4gIGZvby5iYXIuYXNjIGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYgZm9vLmJhciBpcyBuZXdlciB0aGFuIGl0c2VsZi4KKzxwPjxzdHJvbmc+RXhhbXBsZSA0PC9zdHJvbmc+PC9wPgorPHA+R2VuZXJhdGUgYSBNRDUgY2hlY2tzdW0gZm9yIDxzYW1wPmZvby5iYXI8L3NhbXA+LCBjb21wYXJlIGl0IGFnYWluc3QgPHNhbXA+Zm9vLmJhci5NRDU8L3NhbXA+IGFuZAorc2V0IDxjb2RlPmlzTUQ1b2s8L2NvZGU+IHRvIGVpdGhlciA8cT50cnVlPC9xPiBvciA8cT5mYWxzZTwvcT4sIGRlcGVuZGluZyB1cG9uIHRoZSByZXN1bHQuPC9wPgorPHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IHZlcmlmeVByb3BlcnR5PSZxdW90O2lzTUQ1b2smcXVvdDsvJmd0OzwvcHJlPgogCi08cD48Yj5FeGFtcGxlIDY8L2I+PC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtjaGVja3N1bSBmaWxlPSZxdW90O2Zvby5iYXImcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHttZDV9JnF1b3Q7IHZlcmlmeVByb3BlcnR5PSZxdW90O2lzRXF1YWwmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotR2VuZXJhdGVzIGEgTUQ1IGNoZWNrc3VtIGZvciBmb28uYmFyLCBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLW1kNSwgYW5kIHNldHMgaXNFcXVhbCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZSwgZGVwZW5kaW5nIHVwb24gdGhlIHJlc3VsdC4KKzxwPjxzdHJvbmc+RXhhbXBsZSA1PC9zdHJvbmc+PC9wPgorPHA+R2VuZXJhdGUgYSBTSEEtNTEyIGNoZWNrc3VtIGZvciA8c2FtcD5mb28uYmFyPC9zYW1wPiBhbmQgc3RvcmUgdGhlIGNoZWNrc3VtIGluIHRoZSBkZXN0aW5hdGlvbgorZmlsZSA8c2FtcD5mb28uYmFyLmFzYzwvc2FtcD4uICA8c2FtcD5mb28uYmFyLmFzYzwvc2FtcD4gaXMgb3ZlcndyaXR0ZW4gb25seSBpZiA8c2FtcD5mb28uYmFyPC9zYW1wPgoraXMgbmV3ZXIgdGhhbiBpdHNlbGYuPC9wPgorPHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IGFsZ29yaXRobT0mcXVvdDtTSEEtNTEyJnF1b3Q7IGZpbGVleHQ9JnF1b3Q7YXNjJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+PGI+RXhhbXBsZSA3PC9iPjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD48c3Ryb25nPkV4YW1wbGUgNjwvc3Ryb25nPjwvcD4KKzxwPkdlbmVyYXRlIGEgTUQ1IGNoZWNrc3VtIGZvciA8c2FtcD5mb28uYmFyPC9zYW1wPiwgY29tcGFyZSBpdCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiB0aGUKK3Byb3BlcnR5IDxjb2RlPm1kNTwvY29kZT4sIGFuZCBzZXQgPGNvZGU+aXNFcXVhbDwvY29kZT4gdG8gZWl0aGVyIDxxPnRydWU8L3E+IG9yIDxxPmZhbHNlPC9xPiwKK2RlcGVuZGluZyB1cG9uIHRoZSByZXN1bHQuPC9wPgorPHByZT4mbHQ7Y2hlY2tzdW0gZmlsZT0mcXVvdDtmb28uYmFyJnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7bWQ1fSZxdW90OyB2ZXJpZnlQcm9wZXJ0eT0mcXVvdDtpc0VxdWFsJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+PHN0cm9uZz5FeGFtcGxlIDc8L3N0cm9uZz48L3A+Cis8cD5KdXN0IGxpa2UgRXhhbXBsZSAxLCBidXQgZ2VuZXJhdGVzIGEgPHNhbXA+Lk1ENTwvc2FtcD4gZmlsZSBmb3IgZXZlcnkgZmlsZSB0aGF0IGJlZ2lucyB3aXRoIHRoZQorbmFtZSA8c2FtcD5mb288L3NhbXA+LjwvcD4KKzxwcmU+CiAmbHQ7Y2hlY2tzdW0mZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OwogICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Zm9vKiZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsZXNldCZndDsKLSZsdDsvY2hlY2tzdW0mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1Xb3JrcyBqdXN0IGxpa2UgRXhhbXBsZSAxLCBidXQgZ2VuZXJhdGVzIGEgLk1ENSBmaWxlIGZvciBldmVyeSBmaWxlIHRoYXQgYmVnaW5zIHdpdGggdGhlIG5hbWUgZm9vLgorJmx0Oy9jaGVja3N1bSZndDs8L3ByZT4KIAotPHA+PGI+RXhhbXBsZSA4PC9iPjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD48c3Ryb25nPkV4YW1wbGUgODwvc3Ryb25nPjwvcD4KKzxwPkp1c3QgbGlrZSBFeGFtcGxlIDQsIGJ1dCBvbmx5IHNldHMgPGNvZGU+aXNDaGVja3N1bUVxdWFsPC9jb2RlPiB0byA8cT50cnVlPC9xPiwgaWYgdGhlIGNoZWNrc3VtCittYXRjaGVzJm1kYXNoO2l0IHdpbGwgbmV2ZXIgYmUgc2V0IHRvIDxxPmZhbHNlPC9xPi4gIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdXNlIHdpdGgKK3RoZSA8Y29kZT5jb25kaXRpb248L2NvZGU+IHRhc2suPC9wPgorPHByZT4KICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7aXNDaGVja3N1bUVxdWFsJnF1b3Q7Jmd0OwogICAmbHQ7Y2hlY2tzdW0mZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CiAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2Zvby5iYXImcXVvdDsvJmd0OwogICAgICZsdDsvZmlsZXNldCZndDsKICAgJmx0Oy9jaGVja3N1bSZndDsKLSZsdDsvY29uZGl0aW9uJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotV29ya3MgbGlrZSBFeGFtcGxlIDQsIGJ1dCBvbmx5IHNldHMgaXNDaGVja3N1bUVxdWFsIHRvIHRydWUsIGlmIHRoZQotY2hlY2tzdW0gbWF0Y2hlcyAtIGl0IHdpbGwgbmV2ZXIgYmUgc2V0IHRvIGZhbHNlLiAgVGhpcyBleGFtcGxlCi1kZW1vbnN0cmF0ZXMgdXNlIHdpdGggdGhlIENvbmRpdGlvbiB0YXNrLgorJmx0Oy9jb25kaXRpb24mZ3Q7PC9wcmU+CiAKLQotPGgzPk5vdGU6PC9oMz4KLVdoZW4gd29ya2luZyB3aXRoIG1vcmUgdGhhbiBvbmUgZmlsZSwgaWYgY29uZGl0aW9uIGFuZC9vciB2ZXJpZnlwcm9wZXJ0eSBpcyB1c2VkLAotdGhlIHJlc3VsdCB3aWxsIGJlIHRydWUgb25seSBpZiB0aGUgY2hlY2tzdW1zIG1hdGNoZWQgY29ycmVjdGx5IGZvciBhbGwgZmlsZXMgYmVpbmcKLWNvbnNpZGVyZWQuCi0KLQorPGgzPk5vdGU8L2gzPgorPHA+V2hlbiB3b3JraW5nIHdpdGggbW9yZSB0aGFuIG9uZSBmaWxlLCBpZiBjb25kaXRpb24gYW5kL29yIDx2YXI+dmVyaWZ5cHJvcGVydHk8L3Zhcj4gaXMgdXNlZCwgdGhlCityZXN1bHQgd2lsbCBiZSB0cnVlIG9ubHkgaWYgdGhlIGNoZWNrc3VtcyBtYXRjaGVkIGNvcnJlY3RseSBmb3IgYWxsIGZpbGVzIGJlaW5nIGNvbnNpZGVyZWQuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jaGdycC5odG1sIGIvbWFudWFsL1Rhc2tzL2NoZ3JwLmh0bWwKaW5kZXggMjEyNmZiNy4uOWIwNTU2OCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NoZ3JwLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2NoZ3JwLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMzUgKzE1LDExNiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+Q2hncnAgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iQ2hncnAiPkNoZ3JwPC9hPjwvaDI+Ci08cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuPC9lbT48L3A+Cis8aDIgaWQ9ImNoZ3JwIj5DaGdycDwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPi48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD5DaGFuZ2VzIHRoZSBncm91cCBvZiBhIGZpbGUgb3IgYWxsIGZpbGVzIGluc2lkZSBzcGVjaWZpZWQKLWRpcmVjdG9yaWVzLiBSaWdodCBub3cgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyIFVuaXguICBUaGUgZ3JvdXAKLWF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGZvciB0aGUgY2hncnAKLWNvbW1hbmQuPC9wPgorPHA+Q2hhbmdlcyB0aGUgZ3JvdXAgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBSaWdodCBub3cgaXQgaGFzIGVmZmVjdAorb25seSB1bmRlciBVbml4LiAgVGhlIGdyb3VwIGF0dHJpYnV0ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IGZvcgordGhlIDxrYmQ+Y2hncnA8L2tiZD4gY29tbWFuZC48L3A+CiAKLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLCAKLTxhIGhyZWY9Ii4uL1R5cGVzL2RpcnNldC5odG1sIj5EaXJTZXQ8L2E+cyBvciA8YQotaHJlZj0iLi4vVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nCi1uZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+IGFuZCAKLTxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLCA8YSBocmVmPSIuLi9UeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPnMKK29yIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVMaXN0PC9hPnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZworbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4KK2VsZW1lbnRzLjwvcD4KIAotPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS43LCB0aGlzIHRhc2sgc3VwcG9ydHMgYXJiaXRyYXJ5IDxhCi1ocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMKLWFzIG5lc3RlZCBlbGVtZW50cy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+LCB0aGlzIHRhc2sgc3VwcG9ydHMKK2FyYml0cmFyeSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4gYXMgbmVzdGVkCitlbGVtZW50cy48L3A+CiAKLTxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdpbGwgdXNlIGEgc2luZ2xlIGludm9jYXRpb24gb2YgdGhlIHVuZGVybHlpbmcKLWNoZ3JwIGNvbW1hbmQuICBJZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdGhpcyBtYXkKLXJlc3VsdCBpbiBhIGNvbW1hbmQgbGluZSB0aGF0IGlzIHRvbyBsb25nIGZvciB5b3VyIG9wZXJhdGluZyBzeXN0ZW0uCi1JZiB5b3UgZW5jb3VudGVyIHN1Y2ggcHJvYmxlbXMsIHlvdSBzaG91bGQgc2V0IHRoZSBtYXhwYXJhbGxlbAotYXR0cmlidXRlIG9mIHRoaXMgdGFzayB0byBhIG5vbi16ZXJvIHZhbHVlLiAgVGhlIG51bWJlciB0byB1c2UgaGlnaGx5Ci1kZXBlbmRzIG9uIHRoZSBsZW5ndGggb2YgeW91ciBmaWxlIG5hbWVzICh0aGUgZGVwdGggb2YgeW91ciBkaXJlY3RvcnkKLXRyZWUpIGFuZCB5b3VyIG9wZXJhdGluZyBzeXN0ZW0sIHNvIHlvdSdsbCBoYXZlIHRvIGV4cGVyaW1lbnQgYQotbGl0dGxlLiAgUE9TSVggcmVjb21tZW5kcyBjb21tYW5kIGxpbmUgbGVuZ3RoIGxpbWl0cyBvZiBhdCBsZWFzdCA0MDk2Ci1jaGFyYWN0ZXJzLCB0aGlzIG1heSBnaXZlIHlvdSBhbiBhcHByb3hpbWF0aW9uIGZvciB0aGUgbnVtYmVyIHlvdQotY291bGQgdXNlIGFzIGluaXRpYWwgdmFsdWUgZm9yIHRoZXNlIGV4cGVyaW1lbnRzLjwvcD4KKzxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdpbGwgdXNlIGEgc2luZ2xlIGludm9jYXRpb24gb2YgdGhlIHVuZGVybHlpbmcgPGtiZD5jaGdycDwva2JkPiBjb21tYW5kLgorSWYgeW91IGFyZSB3b3JraW5nIG9uIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIHRoaXMgbWF5IHJlc3VsdCBpbiBhIGNvbW1hbmQgbGluZSB0aGF0IGlzIHRvbyBsb25nIGZvcgoreW91ciBvcGVyYXRpbmcgc3lzdGVtLiAgSWYgeW91IGVuY291bnRlciBzdWNoIHByb2JsZW1zLCB5b3Ugc2hvdWxkIHNldCB0aGUgPHZhcj5tYXhwYXJhbGxlbDwvdmFyPgorYXR0cmlidXRlIG9mIHRoaXMgdGFzayB0byBhIG5vbi16ZXJvIHZhbHVlLiAgVGhlIG51bWJlciB0byB1c2UgaGlnaGx5IGRlcGVuZHMgb24gdGhlIGxlbmd0aCBvZiB5b3VyCitmaWxlIG5hbWVzICh0aGUgZGVwdGggb2YgeW91ciBkaXJlY3RvcnkgdHJlZSkgYW5kIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgc28geW91J2xsIGhhdmUgdG8KK2V4cGVyaW1lbnQgYSBsaXR0bGUuICBQT1NJWCByZWNvbW1lbmRzIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIG9mIGF0IGxlYXN0IDQwOTYgY2hhcmFjdGVycywgdGhpcworbWF5IGdpdmUgeW91IGFuIGFwcHJveGltYXRpb24gZm9yIHRoZSBudW1iZXIgeW91IGNvdWxkIHVzZSBhcyBpbml0aWFsIHZhbHVlIGZvciB0aGVzZQorZXhwZXJpbWVudHMuPC9wPgogCi08cD5CeSBkZWZhdWx0IHRoaXMgdGFzayB3b24ndCBkbyBhbnl0aGluZyB1bmxlc3MgaXQgZGV0ZWN0cyBpdCBpcwotICBydW5uaW5nIG9uIGEgVW5peCBzeXN0ZW0uICBJZiB5b3Uga25vdyBmb3Igc3VyZSB0aGF0IHlvdSBoYXZlIGEKLSAgImNoZ3JwIiBleGVjdXRhYmxlIG9uIHlvdXIgUEFUSCB0aGF0IGlzIGNvbW1hbmQgbGluZSBjb21wYXRpYmxlIHdpdGgKLSAgdGhlIFVuaXggY29tbWFuZCwgeW91IGNhbiB1c2UgdGhlIHRhc2sncyBvcyBhdHRyaWJ1dGUgYW5kIHNldCBpdHMKLSAgdmFsdWUgdG8geW91ciBjdXJyZW50IG9zLjwvcD4KKzxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdvbid0IGRvIGFueXRoaW5nIHVubGVzcyBpdCBkZXRlY3RzIGl0IGlzIHJ1bm5pbmcgb24gYSBVbml4IHN5c3RlbS4gIElmIHlvdQora25vdyBmb3Igc3VyZSB0aGF0IHlvdSBoYXZlIGEgPGtiZD5jaGdycDwva2JkPiBleGVjdXRhYmxlIG9uIHlvdXIgPGNvZGU+UEFUSDwvY29kZT4gdGhhdCBpcworY29tbWFuZCBsaW5lIGNvbXBhdGlibGUgd2l0aCB0aGUgVW5peCBjb21tYW5kLCB5b3UgY2FuIHVzZSB0aGUgdGFzaydzIDx2YXI+b3M8L3Zhcj4gYXR0cmlidXRlIGFuZAorc2V0IGl0cyB2YWx1ZSB0byB5b3VyIGN1cnJlbnQgT1MuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBncm91cCBtdXN0IGJlCi0gICAgY2hhbmdlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgdmFsaWduPSJtaWRkbGUiPlllcywgdW5sZXNzIG5lc3RlZAotICAgICAgPGNvZGU+Jmx0O2ZpbGVzZXR8ZmlsZWxpc3R8ZGlyc2V0Jmd0OzwvY29kZT4KLSAgICAgIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQ8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBncm91cCBtdXN0IGJlIGNoYW5nZWQuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0fGZpbGVsaXN0fGRpcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ncm91cDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmV3IGdyb3VwLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5ncm91cDwvdGQ+CisgICAgPHRkPnRoZSBuZXcgZ3JvdXAuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlCi0gICAgICA8Y29kZT5jaGdycDwvY29kZT4gY29tbWFuZC4gRGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wYXJhbGxlbDwvdGQ+CisgICAgPHRkPnByb2Nlc3MgYWxsIHNwZWNpZmllZCBmaWxlcyB1c2luZyBhIHNpbmdsZSA8a2JkPmNoZ3JwPC9rYmQ+IGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGk+ZmlsZTwvaT4sIDxpPmRpcjwvaT4gb3IKLSAgICAgIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8gPGk+ZmlsZTwvaT4sIG9ubHkgdGhlIGdyb3VwIG9mCi0gICAgICBwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4gSWYgc2V0IHRvIDxpPmRpcjwvaT4sIG9ubHkKLSAgICAgIHRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bwotICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKLSAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8cT5maWxlPC9xPiwgPHE+ZGlyPC9xPiBvciA8cT5ib3RoPC9xPi4gSWYgc2V0IHRvIDxxPmZpbGU8L3E+LCBvbmx5IHRoZSBncm91cCBvZgorICAgICAgcGxhaW4gZmlsZXMgYXJlIGdvaW5nIHRvIGJlIGNoYW5nZWQuIElmIHNldCB0byA8cT5kaXI8L3E+LCBvbmx5IHRoZSBkaXJlY3RvcmllcyBhcmUKKyAgICAgIGNvbnNpZGVyZWQuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxjb2RlPmRpcnNldDwvY29kZT5zJm1kYXNoOzxjb2RlPmRpcnNldDwvY29kZT5zIGFsd2F5cyBpbXBsaWNpdGx5IGFzc3VtZSB0eXBlIHRvCisgICAgICBiZSA8cT5kaXI8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZpbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0Ci0gICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCi0gICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLQorICAgIDx0ZD5tYXhwYXJhbGxlbDwvdGQ+CisgICAgPHRkPkxpbWl0IHRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gYnkgcGFzc2luZyBhdCBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvCisgICAgICBuZWdhdGl2ZSBpbnRlZ2VyIGZvciB1bmxpbWl0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHVubGltaXRlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4KLSAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUKLSAgICAgIGV4ZWN1dGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm9zPC90ZD4KKyAgICA8dGQ+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vc2ZhbWlseTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PUyBmYW1pbHkgYXMgdXNlZCBpbgotICAgICAgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL2NvbmRpdGlvbnMuaHRtbCNvcyI+Jmx0O29zJmd0OzwvYT4KKyAgICA8dGQ+b3NmYW1pbHk8L3RkPgorICAgIDx0ZD5PUyBmYW1pbHkgYXMgdXNlZCBpbiB0aGUgPGEgaHJlZj0iLi4vVGFza3MvY29uZGl0aW9ucy5odG1sI29zIj4mbHQ7b3MmZ3Q7PC9hPgogICAgICAgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObyAtIGRlZmF1bHRzIHRvICJ1bml4IjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT51bml4PC9xPjwvdGQ+CiAgIDwvdHI+Ci0KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotICA8YmxvY2txdW90ZT48cHJlPgotJmx0O2NoZ3JwIGZpbGU9JnF1b3Q7JHtkaXN0fS9zdGFydC5zaCZxdW90OyBncm91cD0mcXVvdDtjb2RlcnMmcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5tYWtlcyB0aGUgJnF1b3Q7c3RhcnQuc2gmcXVvdDsgZmlsZSBiZWxvbmcgdG8gdGhlIGNvZGVycyBncm91cCBvbiBhCi1VTklYIHN5c3RlbS48L3A+Ci08YmxvY2txdW90ZT4KKworPHA+TWFrZSB0aGUgPHNhbXA+c3RhcnQuc2g8L3NhbXA+IGZpbGUgYmVsb25nIHRvIHRoZSA8c2FtcD5jb2RlcnM8L3NhbXA+IGdyb3VwIG9uIGEgVU5JWCBzeXN0ZW0uPC9wPgorPHByZT4mbHQ7Y2hncnAgZmlsZT0mcXVvdDske2Rpc3R9L3N0YXJ0LnNoJnF1b3Q7IGdyb3VwPSZxdW90O2NvZGVycyZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPk1ha2UgYWxsIDxzYW1wPi5zaDwvc2FtcD4gZmlsZXMgYmVsb3cgPHNhbXA+JHtkaXN0fS9iaW48L3NhbXA+IGJlbG9uZyB0byB0aGUgPHNhbXA+Y29kZXJzPC9zYW1wPgorZ3JvdXAgb24gYSBVTklYIHN5c3RlbS48L3A+CiA8cHJlPgogJmx0O2NoZ3JwIGdyb3VwPSZxdW90O2NvZGVycyZxdW90OyZndDsKICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdH0vYmluJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouc2gmcXVvdDsvJmd0OwotJmx0Oy9jaGdycCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgYWxsICZxdW90Oy5zaCZxdW90OyBmaWxlcyBiZWxvdyA8Y29kZT4ke2Rpc3R9L2JpbjwvY29kZT4KLWJlbG9uZyB0byB0aGUgY29kZXJzIGdyb3VwIG9uIGEgVU5JWCBzeXN0ZW0uPC9wPgotPGJsb2NrcXVvdGU+CismbHQ7L2NoZ3JwJmd0OzwvcHJlPgorCis8cD5NYWtlIGFsbCBmaWxlcyBiZWxvdyA8c2FtcD5zaGFyZWQvc291cmNlczE8L3NhbXA+IChleGNlcHQgdGhvc2UgYmVsb3cgYW55IGRpcmVjdG9yeQorbmFtZWQgPHNhbXA+dHJpYWw8L3NhbXA+KSBiZWxvbmcgdG8gdGhlIDxzYW1wPmNvZGVyczwvc2FtcD4gZ3JvdXAgb24gYSBVTklYIHN5c3RlbS4gSW4gYWRkaXRpb24sIGFsbAorZmlsZXMgYmVsb25naW5nIHRvIGEgRmlsZVNldCB3aXRoIDx2YXI+aWQ8L3Zhcj49PHNhbXA+b3RoZXIuc2hhcmVkLnNvdXJjZXM8L3NhbXA+IGdldCB0aGUgc2FtZQorZ3JvdXAuPC9wPgogPHByZT4KICZsdDtjaGdycCBncm91cD0mcXVvdDtjb2RlcnMmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzaGFyZWQvc291cmNlczEmcXVvdDsmZ3Q7CkBAIC0xNTEsMTQgKzEzMywxMSBAQAogICAmbHQ7ZmlsZXNldCByZWZpZD0mcXVvdDtvdGhlci5zaGFyZWQuc291cmNlcyZxdW90Oy8mZ3Q7CiAmbHQ7L2NoZ3JwJmd0OwogPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5tYWtlcyBhbGwgZmlsZXMgYmVsb3cgPGNvZGU+c2hhcmVkL3NvdXJjZXMxPC9jb2RlPiAoZXhjZXB0IHRob3NlCi1iZWxvdyBhbnkgZGlyZWN0b3J5IG5hbWVkIHRyaWFsKSBiZWxvbmcgdG8gdGhlIGNvZGVycyBncm91cCBvbiBhIFVOSVggCi1zeXN0ZW0uIEluIGFkZGl0aW9uIGFsbCBmaWxlcyBiZWxvbmdpbmcgdG8gYSBGaWxlU2V0Ci13aXRoIDxjb2RlPmlkPC9jb2RlPiA8Y29kZT5vdGhlci5zaGFyZWQuc291cmNlczwvY29kZT4gZ2V0IHRoZSBzYW1lCi1ncm91cC48L3A+CiAKLTxibG9ja3F1b3RlPgorPHA+TWFrZSBhbGwgPHNhbXA+LnRlc3QuanNwPC9zYW1wPiwgYW5kIDxzYW1wPi5uZXc8L3NhbXA+IGZpbGVzIGJlbG9uZyB0bworZ3JvdXAgPHNhbXA+d2ViZGV2PC9zYW1wPi4gRGlyZWN0b3JpZXMgd2l0aCBuYW1lcyBiZWdpbm5pbmcgd2l0aCA8c2FtcD50ZXN0Xzwvc2FtcD4gYWxzbyB3aWxsIGJlbG9uZwordG8gPHNhbXA+d2ViZGV2PC9zYW1wPiwgYnV0IGlmIHRoZXJlIGlzIGEgZGlyZWN0b3J5IG5hbWUgdGhhdCBlbmRzIGluIDxzYW1wPi5uZXc8L3NhbXA+IG9yIGEgZmlsZQorbmFtZSB0aGF0IGJlZ2lucyB3aXRoIDxzYW1wPnRlc3RfPC9zYW1wPiBpdCB3aWxsIGJlIHVuYWZmZWN0ZWQuPC9wPgogPHByZT4KICZsdDtjaGdycCBncm91cD0mcXVvdDt3ZWJkZXYmcXVvdDsgdHlwZT0mcXVvdDtmaWxlJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7L3dlYiZxdW90OyZndDsKQEAgLTE2OCwxOCArMTQ3LDcgQEAKICAgJmx0O2RpcnNldCBkaXI9JnF1b3Q7L3dlYiZxdW90OyZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL3Rlc3RfKiZxdW90Oy8mZ3Q7CiAgICZsdDsvZGlyc2V0Jmd0OwotJmx0Oy9jaG1vZCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08cD5tYWtlcyBhbGwgPGNvZGU+LnRlc3QuanNwPC9jb2RlPiwgYW5kIDxjb2RlPi5uZXc8L2NvZGU+IGZpbGVzIGJlbG9uZyB0byAKLWdyb3VwIHdlYmRldi4gRGlyZWN0b3JpZXMgYmVnaW5uaW5nIHdpdGggPGNvZGU+dGVzdF88L2NvZGU+IGFsc28gd2lsbCBiZWxvbmcgCi10byB3ZWJkZXYsIGJ1dCBpZiB0aGVyZSBpcyBhIGRpcmVjdG9yeSB0aGF0IGVuZHMgaW4gPGNvZGU+Lm5ldzwvY29kZT4gb3IgYSBmaWxlCi10aGF0IGJlZ2lucyB3aXRoIDxjb2RlPnRlc3RfPC9jb2RlPiBpdCB3aWxsIGJlIHVuYWZmZWN0ZWQuPC9wPgotCi0KLQorJmx0Oy9jaG1vZCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2htb2QuaHRtbCBiL21hbnVhbC9UYXNrcy9jaG1vZC5odG1sCmluZGV4IDc0ZTcxZDAuLjEzMzcxZGQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jaG1vZC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jaG1vZC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTc5ICsxNSwxNTggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkNobW9kIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImNobW9kIj5DaG1vZDwvYT48L2gyPgorPGgyIGlkPSJjaG1vZCI+Q2htb2Q8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkNoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIGEgZmlsZSBvciBhbGwgZmlsZXMgaW5zaWRlIHNwZWNpZmllZAotZGlyZWN0b3JpZXMuIFJpZ2h0IG5vdyBpdCBoYXMgZWZmZWN0IG9ubHkgdW5kZXIgVW5peCBvciBOb25TdG9wIEtlcm5lbCAoVGFuZGVtKS4KLVRoZSBwZXJtaXNzaW9ucyBhcmUgYWxzbyBVTklYIHN0eWxlLCBsaWtlIHRoZSBhcmd1bWVudCBmb3IgdGhlIGNobW9kIGNvbW1hbmQuPC9wPgotPHA+U2VlIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkCi10YXNrczwvYT4sIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0bwotd3JpdGUgcGF0dGVybnMuPC9wPgorPHA+Q2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBSaWdodCBub3cgaXQgaGFzCitlZmZlY3Qgb25seSB1bmRlciBVbml4IG9yIE5vblN0b3AgS2VybmVsIChUYW5kZW0pLiAgVGhlIHBlcm1pc3Npb25zIGFyZSBhbHNvIFVOSVggc3R5bGUsIGxpa2UgdGhlCithcmd1bWVudCBmb3IgdGhlIDxrYmQ+Y2htb2Q8L2tiZD4gY29tbWFuZC48L3A+Cis8cD5TZWUgdGhlIHNlY3Rpb24gb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbgoraG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KIAotPHA+VGhpcyB0YXNrIGhvbGRzIGFuIGltcGxpY2l0IDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBhbGwgb2YKLUZpbGVTZXQncyBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgZGlyZWN0bHkuIE1vcmUgc2V0cyBjYW4gYmUKLXNwZWNpZmllZCB1c2luZyBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBvcgotPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+ICg8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPikgZWxlbWVudHMuIDwvcD4KKzxwPlRoaXMgdGFzayBob2xkcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBhbGwgb2YKK0ZpbGVTZXQncyBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgZGlyZWN0bHkuIE1vcmUgc2V0cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nCituZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gKDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+KQorZWxlbWVudHMuPC9wPgogCi08cD5TdGFydGluZyB3aXRoIEFudCAxLjYsIHRoaXMgdGFzayBhbHNvIHN1cHBvcnRzIG5lc3RlZCA8YQotaHJlZj0iLi4vVHlwZXMvZmlsZWxpc3QuaHRtbCI+ZmlsZWxpc3Q8L2E+cy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LCB0aGlzIHRhc2sgYWxzbyBzdXBwb3J0cworbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPmZpbGVsaXN0PC9hPnMuPC9wPgogCi08cD5TdGFydGluZyB3aXRoIEFudCAxLjcsIHRoaXMgdGFzayBzdXBwb3J0cyBhcmJpdHJhcnkgPGEKLWhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cwotYXMgbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4sIHRoaXMgdGFzayBzdXBwb3J0cworYXJiaXRyYXJ5IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcyBuZXN0ZWQKK2VsZW1lbnRzLjwvcD4KIAotPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZwotY2htb2QgY29tbWFuZC4gIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyB0aGlzIG1heQotcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KLUlmIHlvdSBlbmNvdW50ZXIgc3VjaCBwcm9ibGVtcywgeW91IHNob3VsZCBzZXQgdGhlIG1heHBhcmFsbGVsCi1hdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgbnVtYmVyIHRvIHVzZSBoaWdobHkKLWRlcGVuZHMgb24gdGhlIGxlbmd0aCBvZiB5b3VyIGZpbGUgbmFtZXMgKHRoZSBkZXB0aCBvZiB5b3VyIGRpcmVjdG9yeQotdHJlZSkgYW5kIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgc28geW91J2xsIGhhdmUgdG8gZXhwZXJpbWVudCBhCi1saXR0bGUuICBQT1NJWCByZWNvbW1lbmRzIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIG9mIGF0IGxlYXN0IDQwOTYKLWNoYXJhY3RlcnMsIHRoaXMgbWF5IGdpdmUgeW91IGFuIGFwcHJveGltYXRpb24gZm9yIHRoZSBudW1iZXIgeW91Ci1jb3VsZCB1c2UgYXMgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlc2UgZXhwZXJpbWVudHMuPC9wPgorPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZyA8a2JkPmNobW9kPC9rYmQ+IGNvbW1hbmQuCitJZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdGhpcyBtYXkgcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yCit5b3VyIG9wZXJhdGluZyBzeXN0ZW0uICBJZiB5b3UgZW5jb3VudGVyIHN1Y2ggcHJvYmxlbXMsIHlvdSBzaG91bGQgc2V0IHRoZSA8dmFyPm1heHBhcmFsbGVsPC92YXI+CithdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgbnVtYmVyIHRvIHVzZSBoaWdobHkgZGVwZW5kcyBvbiB0aGUgbGVuZ3RoIG9mIHlvdXIKK2ZpbGUgbmFtZXMgKHRoZSBkZXB0aCBvZiB5b3VyIGRpcmVjdG9yeSB0cmVlKSBhbmQgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCBzbyB5b3UnbGwgaGF2ZSB0bworZXhwZXJpbWVudCBhIGxpdHRsZS4gIFBPU0lYIHJlY29tbWVuZHMgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgb2YgYXQgbGVhc3QgNDA5NiBjaGFyYWN0ZXJzLCB0aGlzCittYXkgZ2l2ZSB5b3UgYW4gYXBwcm94aW1hdGlvbiBmb3IgdGhlIG51bWJlciB5b3UgY291bGQgdXNlIGFzIGluaXRpYWwgdmFsdWUgZm9yIHRoZXNlCitleHBlcmltZW50cy48L3A+CiAKLTxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdvbid0IGRvIGFueXRoaW5nIHVubGVzcyBpdCBkZXRlY3RzIGl0IGlzCi0gIHJ1bm5pbmcgb24gYSBVbml4IHN5c3RlbS4gIElmIHlvdSBrbm93IGZvciBzdXJlIHRoYXQgeW91IGhhdmUgYQotICAiY2htb2QiIGV4ZWN1dGFibGUgb24geW91ciBQQVRIIHRoYXQgaXMgY29tbWFuZCBsaW5lIGNvbXBhdGlibGUgd2l0aAotICB0aGUgVW5peCBjb21tYW5kLCB5b3UgY2FuIHVzZSB0aGUgdGFzaydzIG9zIGF0dHJpYnV0ZSBhbmQgc2V0IGl0cwotICB2YWx1ZSB0byB5b3VyIGN1cnJlbnQgb3MuPC9wPgorPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd29uJ3QgZG8gYW55dGhpbmcgdW5sZXNzIGl0IGRldGVjdHMgaXQgaXMgcnVubmluZyBvbiBhIFVuaXggc3lzdGVtLiAgSWYgeW91Citrbm93IGZvciBzdXJlIHRoYXQgeW91IGhhdmUgYSA8a2JkPmNobW9kPC9rYmQ+IGV4ZWN1dGFibGUgb24geW91ciA8Y29kZT5QQVRIPC9jb2RlPiB0aGF0IGlzCitjb21tYW5kIGxpbmUgY29tcGF0aWJsZSB3aXRoIHRoZSBVbml4IGNvbW1hbmQsIHlvdSBjYW4gdXNlIHRoZSB0YXNrJ3MgPHZhcj5vczwvdmFyPiBhdHRyaWJ1dGUgYW5kCitzZXQgaXRzIHZhbHVlIHRvIHlvdXIgY3VycmVudCBPUy48L3A+CisKKzxwPlNlZSB0aGUgPGEgaHJlZj0ic2V0cGVybWlzc2lvbnMuaHRtbCI+c2V0cGVybWlzc2lvbnM8L2E+IHRhc2sgZm9yIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQKK2FsdGVybmF0aXZlLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIG9yIHNpbmdsZSBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIHBlcm1pc3Npb25zIAotICAgICAgbXVzdCBiZSBjaGFuZ2VkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMiI+ZXhhY3RseSBvbmUgb2YgdGhlIHR3byBvciBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQvbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD50aGUgZmlsZSBvciBzaW5nbGUgZGlyZWN0b3J5IG9mIHdoaWNoIHRoZSBwZXJtaXNzaW9ucyBtdXN0IGJlIGNoYW5nZWQuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bywgdW5sZXNzCisgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXR8ZmlsZWxpc3R8ZGlyc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHdoaWNoIGhvbGRzIHRoZSBmaWxlcyB3aG9zZSBwZXJtaXNzaW9ucyAKLSAgICAgIG11c3QgYmUgY2hhbmdlZC48YnIvPgotICAgICAgPGI+Tm90ZTo8L2I+IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICAgICAgcmVhc29ucyA8Y29kZT4mbHQ7Y2htb2QmbmJzcDtkaXI9InNvbWUtZGlyIi8mZ3Q7PC9jb2RlPiB3aWxsCi0gICAgICBvbmx5IGNoYW5nZSB0aGUgcGVybWlzc2lvbnMgb24gInNvbWUtZGlyIiBidXQgbm90IHJlY3Vyc2UgaW50bwotICAgICAgaXQsIHVubGVzcyB5b3UgYWxzbyBzcGVjaWZ5IGFueSBwYXR0ZXJucy48L3RkPgorICAgIDx0ZD5kaXI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGRpcmVjdG9yeSB3aGljaCBob2xkcyB0aGUgZmlsZXMgd2hvc2UgcGVybWlzc2lvbnMgbXVzdCBiZQorICAgICAgY2hhbmdlZC48YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMgPGNvZGU+Jmx0O2NobW9kCisgICAgICBkaXI9InNvbWUtZGlyIi8mZ3Q7PC9jb2RlPiB3aWxsIG9ubHkgY2hhbmdlIHRoZSBwZXJtaXNzaW9ucyBvbiA8c2FtcD5zb21lLWRpcjwvc2FtcD4gYnV0IG5vdAorICAgICAgcmVjdXJzZSBpbnRvIGl0LCB1bmxlc3MgeW91IGFsc28gc3BlY2lmeSBhbnkgcGF0dGVybnMuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGVybTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmV3IHBlcm1pc3Npb25zLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5wZXJtPC90ZD4KKyAgICA8dGQ+dGhlIG5ldyBwZXJtaXNzaW9ucy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGFsbCAoPHE+Kio8L3E+KTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvY2VzcyBhbGwgc3BlY2lmaWVkIGZpbGVzIHVzaW5nIGEgc2luZ2xlCi0gICAgICA8Y29kZT5jaG1vZDwvY29kZT4gY29tbWFuZC4gRGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wYXJhbGxlbDwvdGQ+CisgICAgPHRkPnByb2Nlc3MgYWxsIHNwZWNpZmllZCBmaWxlcyB1c2luZyBhIHNpbmdsZSA8a2JkPmNobW9kPC9rYmQ+IGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGk+ZmlsZTwvaT4sIDxpPmRpcjwvaT4gb3IKLSAgICAgIDxpPmJvdGg8L2k+LiBJZiBzZXQgdG8gPGk+ZmlsZTwvaT4sIG9ubHkgdGhlIHBlcm1pc3Npb25zIG9mCi0gICAgICBwbGFpbiBmaWxlcyBhcmUgZ29pbmcgdG8gYmUgY2hhbmdlZC4gSWYgc2V0IHRvIDxpPmRpcjwvaT4sIG9ubHkKLSAgICAgIHRoZSBkaXJlY3RvcmllcyBhcmUgY29uc2lkZXJlZC48YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bwotICAgICAgbmVzdGVkIDxpPmRpcnNldDwvaT5zIC0gPGk+ZGlyc2V0PC9pPnMgYWx3YXlzIGltcGxpY2l0bHkKLSAgICAgIGFzc3VtZSB0eXBlIHRvIGJlIDxpPmRpcjwvaT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxpPmZpbGU8L2k+PC90ZD4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8cT5maWxlPC9xPiwgPHE+ZGlyPC9xPiBvciA8cT5ib3RoPC9xPi4gSWYgc2V0IHRvIDxxPmZpbGU8L3E+LCBvbmx5IHRoZSBwZXJtaXNzaW9ucworICAgICAgb2YgcGxhaW4gZmlsZXMgYXJlIGdvaW5nIHRvIGJlIGNoYW5nZWQuIElmIHNldCB0byA8cT5kaXI8L3E+LCBvbmx5IHRoZSBkaXJlY3RvcmllcyBhcmUKKyAgICAgIGNvbnNpZGVyZWQuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSB0eXBlIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxjb2RlPmRpcnNldDwvY29kZT5zJm1kYXNoOzxjb2RlPmRpcnNldDwvY29kZT5zIGFsd2F5cyBpbXBsaWNpdGx5IGFzc3VtZSB0eXBlIHRvCisgICAgICBiZSA8cT5kaXI8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZpbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0Ci0gICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCi0gICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuICA8ZW0+U2luY2UgQW50IDEuNi48L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1heHBhcmFsbGVsPC90ZD4KKyAgICA8dGQ+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0IG1vc3QgdGhpcyBtYW55IHNvdXJjZWZpbGVzIGF0IG9uY2UuICBTZXQgaXQgdG8KKyAgICAgIG5lZ2F0aXZlIGludGVnZXIgZm9yIHVubGltaXRlZC4gIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHVubGltaXRlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4KLSAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gIDxlbT5TaW5jZSBBbnQgMS42LjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gcHJpbnQgYSBzdW1tYXJ5IGFmdGVyIGV4ZWN1dGlvbiBvciBub3QuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZQotICAgICAgZXhlY3V0ZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3M8L3RkPgorICAgIDx0ZD5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZSBleGVjdXRlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9zZmFtaWx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk9TIGZhbWlseSBhcyB1c2VkIGluCi0gICAgICB0aGUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sI29zIj4mbHQ7b3MmZ3Q7PC9hPiBjb25kaXRpb24uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIC0gZGVmYXVsdHMgdG8gInVuaXgiPC90ZD4KKyAgICA8dGQ+b3NmYW1pbHk8L3RkPgorICAgIDx0ZD5PUyBmYW1pbHkgYXMgdXNlZCBpbiB0aGUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sI29zIj4mbHQ7b3MmZ3Q7PC9hPiBjb25kaXRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnVuaXg8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotICA8YmxvY2txdW90ZT48cHJlPgotJmx0O2NobW9kIGZpbGU9JnF1b3Q7JHtkaXN0fS9zdGFydC5zaCZxdW90OyBwZXJtPSZxdW90O3VnbytyeCZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5tYWtlcyB0aGUgJnF1b3Q7c3RhcnQuc2gmcXVvdDsgZmlsZSByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBmb3IgYW55b25lIG9uIGEKKworPHA+TWFrZSB0aGUgPHNhbXA+c3RhcnQuc2g8L3NhbXA+IGZpbGUgcmVhZGFibGUgYW5kIGV4ZWN1dGFibGUgZm9yIGFueW9uZSBvbiBhIFVOSVggc3lzdGVtLjwvcD4KKzxwcmU+Jmx0O2NobW9kIGZpbGU9JnF1b3Q7JHtkaXN0fS9zdGFydC5zaCZxdW90OyBwZXJtPSZxdW90O3VnbytyeCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPk1ha2UgdGhlIDxzYW1wPnN0YXJ0LnNoPC9zYW1wPiBmaWxlIHJlYWRhYmxlLCB3cml0YWJsZSBhbmQgZXhlY3V0YWJsZSBvbmx5IGZvciB0aGUgb3duZXIgb24gYQogVU5JWCBzeXN0ZW0uPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtjaG1vZCBmaWxlPSZxdW90OyR7ZGlzdH0vc3RhcnQuc2gmcXVvdDsgcGVybT0mcXVvdDs3MDAmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgdGhlICZxdW90O3N0YXJ0LnNoJnF1b3Q7IGZpbGUgcmVhZGFibGUsIHdyaXRhYmxlIGFuZCBleGVjdXRhYmxlIG9ubHkgZm9yIHRoZSBvd25lciBvbiBhCi1VTklYIHN5c3RlbS48L3A+Ci08YmxvY2txdW90ZT4KKzxwcmU+Jmx0O2NobW9kIGZpbGU9JnF1b3Q7JHtkaXN0fS9zdGFydC5zaCZxdW90OyBwZXJtPSZxdW90OzcwMCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPk1ha2UgYWxsIDxzYW1wPi5zaDwvc2FtcD4gZmlsZXMgYmVsb3cgPHNhbXA+JHtkaXN0fS9iaW48L3NhbXA+IHJlYWRhYmxlIGFuZCBleGVjdXRhYmxlIGZvciBhbnlvbmUKK29uIGEgVU5JWCBzeXN0ZW0uPC9wPgogPHByZT4KLSZsdDtjaG1vZCBkaXI9JnF1b3Q7JHtkaXN0fS9iaW4mcXVvdDsgcGVybT0mcXVvdDt1Z28rcngmcXVvdDsgCi0gICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5zaCZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPm1ha2VzIGFsbCAmcXVvdDsuc2gmcXVvdDsgZmlsZXMgYmVsb3cgPGNvZGU+JHtkaXN0fS9iaW48L2NvZGU+Ci1yZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBmb3IgYW55b25lIG9uIGEgVU5JWCBzeXN0ZW0uPC9wPgotPGJsb2NrcXVvdGU+CismbHQ7Y2htb2QgZGlyPSZxdW90OyR7ZGlzdH0vYmluJnF1b3Q7IHBlcm09JnF1b3Q7dWdvK3J4JnF1b3Q7CisgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5zaCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPk1ha2UgYWxsIGZpbGVzIGJlbG93IDxzYW1wPnNoYXJlZC9zb3VyY2VzMTwvc2FtcD4gKGV4Y2VwdCB0aG9zZSBiZWxvdyBhbnkgZGlyZWN0b3J5CituYW1lZCA8c2FtcD50cmlhbDwvc2FtcD4pIHdyaXRhYmxlIGZvciBtZW1iZXJzIG9mIHRoZSBzYW1lIGdyb3VwIG9uIGEgVU5JWCBzeXN0ZW0uIEluIGFkZGl0aW9uLCBhbGwKK2ZpbGVzIGJlbG9uZ2luZyB0byBhIEZpbGVTZXQgd2l0aCA8dmFyPmlkPC92YXI+IDxzYW1wPm90aGVyLnNoYXJlZC5zb3VyY2VzPC9zYW1wPiBnZXQgdGhlIHNhbWUKK3Blcm1pc3Npb25zLjwvcD4KIDxwcmU+CiAmbHQ7Y2htb2QgcGVybT0mcXVvdDtnK3cmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzaGFyZWQvc291cmNlczEmcXVvdDsmZ3Q7CiAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi90cmlhbC8qKiZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsZXNldCZndDsKICAgJmx0O2ZpbGVzZXQgcmVmaWQ9JnF1b3Q7b3RoZXIuc2hhcmVkLnNvdXJjZXMmcXVvdDsvJmd0OwotJmx0Oy9jaG1vZCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgYWxsIGZpbGVzIGJlbG93IDxjb2RlPnNoYXJlZC9zb3VyY2VzMTwvY29kZT4gKGV4Y2VwdCB0aG9zZQotYmVsb3cgYW55IGRpcmVjdG9yeSBuYW1lZCB0cmlhbCkgd3JpdGFibGUgZm9yIG1lbWJlcnMgb2YgdGhlIHNhbWUKLWdyb3VwIG9uIGEgVU5JWCBzeXN0ZW0uIEluIGFkZGl0aW9uIGFsbCBmaWxlcyBiZWxvbmdpbmcgdG8gYSBGaWxlU2V0Ci13aXRoIDxjb2RlPmlkPC9jb2RlPiA8Y29kZT5vdGhlci5zaGFyZWQuc291cmNlczwvY29kZT4gZ2V0IHRoZSBzYW1lCi1wZXJtaXNzaW9ucy48L3A+CismbHQ7L2NobW9kJmd0OzwvcHJlPgogCi08YmxvY2txdW90ZT4KKzxwPktlZXAgbm9uLW93bmVycyBmcm9tIHRvdWNoaW5nIDxjb2RlPmNnaTwvY29kZT4gc2NyaXB0cywgZmlsZXMgd2l0aCBhIDxzYW1wPi5vbGQ8L3NhbXA+IGV4dGVuc2lvbgorb3IgZGlyZWN0b3JpZXMgYmVnaW5uaW5nIHdpdGggPHNhbXA+cHJpdmF0ZV88L3NhbXA+LiBBIGRpcmVjdG9yeSBlbmRpbmcgaW4gPHNhbXA+Lm9sZDwvc2FtcD4gb3IgYQorZmlsZSBiZWdpbm5pbmcgd2l0aCA8c2FtcD5wcml2YXRlXzwvc2FtcD4gd291bGQgcmVtYWluIHVuYWZmZWN0ZWQuPC9wPgogPHByZT4KICZsdDtjaG1vZCBwZXJtPSZxdW90O2dvLXJ3eCZxdW90OyB0eXBlPSZxdW90O2ZpbGUmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsvd2ViJnF1b3Q7Jmd0OwpAQCAtMTk2LDMwICsxNzYsMTQgQEAKICAgJmx0O2RpcnNldCBkaXI9JnF1b3Q7L3dlYiZxdW90OyZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL3ByaXZhdGVfKiZxdW90Oy8mZ3Q7CiAgICZsdDsvZGlyc2V0Jmd0OwotJmx0Oy9jaG1vZCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgorJmx0Oy9jaG1vZCZndDs8L3ByZT4KIAotPHA+a2VlcHMgbm9uLW93bmVycyBmcm9tIHRvdWNoaW5nIGNnaSBzY3JpcHRzLCBmaWxlcyB3aXRoIGEgPGNvZGU+Lm9sZDwvY29kZT4KLWV4dGVuc2lvbiBvciBkaXJlY3RvcmllcyBiZWdpbm5pbmcgd2l0aCA8Y29kZT5wcml2YXRlXzwvY29kZT4uIEEgZGlyZWN0b3J5IAotZW5kaW5nIGluIDxjb2RlPi5vbGQ8L2NvZGU+IG9yIGEgZmlsZSBiZWdpbm5pbmcgd2l0aCBwcml2YXRlXyB3b3VsZCByZW1haW4KLXVuYWZmZWN0ZWQuPC9wPgotCi0KLSAgPGgzPk5vdGUgb24gbWF4cGFyYWxsZWwgYXR0cmlidXRlPC9oMz4KLSAgPHA+Ci0gICAgU29tZSBzaGVsbHMgaGF2ZSBhIGxpbWl0IG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0Ci0gICAgYSBjb21tYW5kIGxpbmUgbWF5IGNvbnRhaW4uIAotICAgIFRoaXMgbWF4aW11bSBsaW1pdCB2YXJpZXMgZnJvbSBzaGVsbCB0byBzaGVsbCBhbmQgZnJvbSBvcGVyYXRpbmcKLSAgICBzeXN0ZW0gdG8gb3BlcmF0aW5nIHN5c3RlbS4KLSAgICBJZiBvbmUgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIHRvIGNoYW5nZSBtb2RlIG9uLCBjb25zaWRlcgotICAgIHVzaW5nIHRoZSA8ZW0+bWF4cGFyYWxsZWw8L2VtPiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlCi0gICAgd2hlbiB1c2luZyBBSVggYW5kIHRoZSBsaW1pdCBpcyByZWFjaGVkLCB0aGUgc3lzdGVtIHJlc3BvbmRzCi0gICAgd2l0aCBhIHdhcm5pbmc6ICJXYXJuaW5nOiAKLSAgICBVTklYUHJvY2Vzcy5mb3JrQW5kRXhlYyBuYXRpdmUgZXJyb3I6IFRoZSBwYXJhbWV0ZXIgb3IgZW52aXJvbm1lbnQgbGlzdHMKLSAgICBhcmUgdG9vIGxvbmciLiBBIHZhbHVlIG9mIGFib3V0IDMwMCBzZWVtcyB0byByZXN1bHQgaW4gYQotICAgIGNvbW1hbmQgbGluZSB0aGF0IGlzIGFjY2VwdGFibGUuCi0gIDwvcD4KKzxoMz5Ob3RlIG9uIDx2YXI+bWF4cGFyYWxsZWw8L3Zhcj4gYXR0cmlidXRlPC9oMz4KKzxwPlNvbWUgc2hlbGxzIGhhdmUgYSBsaW1pdCBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCBhIGNvbW1hbmQgbGluZSBtYXkgY29udGFpbi4gIFRoaXMKK21heGltdW0gbGltaXQgdmFyaWVzIGZyb20gc2hlbGwgdG8gc2hlbGwgYW5kIGZyb20gb3BlcmF0aW5nIHN5c3RlbSB0byBvcGVyYXRpbmcgc3lzdGVtLiAgSWYgb25lIGhhcworYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdG8gY2hhbmdlIG1vZGUgb24sIGNvbnNpZGVyIHVzaW5nIHRoZSA8dmFyPm1heHBhcmFsbGVsPC92YXI+IGF0dHJpYnV0ZS4gRm9yCitleGFtcGxlIHdoZW4gdXNpbmcgQUlYIGFuZCB0aGUgbGltaXQgaXMgcmVhY2hlZCwgdGhlIHN5c3RlbSByZXNwb25kcyB3aXRoIGEgd2FybmluZzogPGNvZGU+Ildhcm5pbmc6CitVTklYUHJvY2Vzcy5mb3JrQW5kRXhlYyBuYXRpdmUgZXJyb3I6IFRoZSBwYXJhbWV0ZXIgb3IgZW52aXJvbm1lbnQgbGlzdHMgYXJlIHRvbyBsb25nIjwvY29kZT4uIEEKK3ZhbHVlIG9mIGFib3V0IDMwMCBzZWVtcyB0byByZXN1bHQgaW4gYSBjb21tYW5kIGxpbmUgdGhhdCBpcyBhY2NlcHRhYmxlLjwvcD4KIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2Nob3duLmh0bWwgYi9tYW51YWwvVGFza3MvY2hvd24uaHRtbAppbmRleCAzM2E5ZjQ0Li41YmQ4Zjk0IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvY2hvd24uaHRtbAorKysgYi9tYW51YWwvVGFza3MvY2hvd24uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE1MCArMTUsMTI3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5DaG93biBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJDaG93biI+Q2hvd248L2E+PC9oMj4KLTxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNi48L2VtPjwvcD4KKzxoMiBpZD0iY2hvd24iPkNob3duPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+LjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPkNoYW5nZXMgdGhlIG93bmVyIG9mIGEgZmlsZSBvciBhbGwgZmlsZXMgaW5zaWRlIHNwZWNpZmllZAotZGlyZWN0b3JpZXMuIFJpZ2h0IG5vdyBpdCBoYXMgZWZmZWN0IG9ubHkgdW5kZXIgVW5peC4gIFRoZSBvd25lcgotYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgZm9yIHRoZSBjaG93bgotY29tbWFuZC48L3A+Cis8cD5DaGFuZ2VzIHRoZSBvd25lciBvZiBhIGZpbGUgb3IgYWxsIGZpbGVzIGluc2lkZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIFJpZ2h0IG5vdyBpdCBoYXMgZWZmZWN0Citvbmx5IHVuZGVyIFVuaXguICBUaGUgb3duZXIgYXR0cmlidXRlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgZm9yCit0aGUgPGtiZD5jaG93bjwva2JkPiBjb21tYW5kLjwvcD4KIAotPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMsIAotPGEgaHJlZj0iLi4vVHlwZXMvZGlyc2V0Lmh0bWwiPkRpclNldDwvYT5zIG9yIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT5zIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcKLW5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gYW5kIAotPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMsIDxhIGhyZWY9Ii4uL1R5cGVzL2RpcnNldC5odG1sIj5EaXJTZXQ8L2E+cworb3IgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+cyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nCituZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2RpcnNldCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPgorZWxlbWVudHMuPC9wPgogCi08cD5TdGFydGluZyB3aXRoIEFudCAxLjcsIHRoaXMgdGFzayBzdXBwb3J0cyBhcmJpdHJhcnkgPGEKLWhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cwotYXMgbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4sIHRoaXMgdGFzayBzdXBwb3J0cworYXJiaXRyYXJ5IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcyBuZXN0ZWQKK2VsZW1lbnRzLjwvcD4KIAotPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZwotY2hvd24gY29tbWFuZC4gIElmIHlvdSBhcmUgd29ya2luZyBvbiBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyB0aGlzIG1heQotcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KLUlmIHlvdSBlbmNvdW50ZXIgc3VjaCBwcm9ibGVtcywgeW91IHNob3VsZCBzZXQgdGhlIG1heHBhcmFsbGVsCi1hdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgbnVtYmVyIHRvIHVzZSBoaWdobHkKLWRlcGVuZHMgb24gdGhlIGxlbmd0aCBvZiB5b3VyIGZpbGUgbmFtZXMgKHRoZSBkZXB0aCBvZiB5b3VyIGRpcmVjdG9yeQotdHJlZSkgYW5kIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSwgc28geW91J2xsIGhhdmUgdG8gZXhwZXJpbWVudCBhCi1saXR0bGUuICBQT1NJWCByZWNvbW1lbmRzIGNvbW1hbmQgbGluZSBsZW5ndGggbGltaXRzIG9mIGF0IGxlYXN0IDQwOTYKLWNoYXJhY3RlcnMsIHRoaXMgbWF5IGdpdmUgeW91IGFuIGFwcHJveGltYXRpb24gZm9yIHRoZSBudW1iZXIgeW91Ci1jb3VsZCB1c2UgYXMgaW5pdGlhbCB2YWx1ZSBmb3IgdGhlc2UgZXhwZXJpbWVudHMuPC9wPgorPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgYSBzaW5nbGUgaW52b2NhdGlvbiBvZiB0aGUgdW5kZXJseWluZyA8a2JkPmNob3duPC9rYmQ+IGNvbW1hbmQuCitJZiB5b3UgYXJlIHdvcmtpbmcgb24gYSBsYXJnZSBudW1iZXIgb2YgZmlsZXMgdGhpcyBtYXkgcmVzdWx0IGluIGEgY29tbWFuZCBsaW5lIHRoYXQgaXMgdG9vIGxvbmcgZm9yCit5b3VyIG9wZXJhdGluZyBzeXN0ZW0uICBJZiB5b3UgZW5jb3VudGVyIHN1Y2ggcHJvYmxlbXMsIHlvdSBzaG91bGQgc2V0IHRoZSA8dmFyPm1heHBhcmFsbGVsPC92YXI+CithdHRyaWJ1dGUgb2YgdGhpcyB0YXNrIHRvIGEgbm9uLXplcm8gdmFsdWUuICBUaGUgbnVtYmVyIHRvIHVzZSBoaWdobHkgZGVwZW5kcyBvbiB0aGUgbGVuZ3RoIG9mIHlvdXIKK2ZpbGUgbmFtZXMgKHRoZSBkZXB0aCBvZiB5b3VyIGRpcmVjdG9yeSB0cmVlKSBhbmQgeW91ciBvcGVyYXRpbmcgc3lzdGVtLCBzbyB5b3UnbGwgaGF2ZSB0bworZXhwZXJpbWVudCBhIGxpdHRsZS4gIFBPU0lYIHJlY29tbWVuZHMgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdHMgb2YgYXQgbGVhc3QgNDA5NiBjaGFyYWN0ZXJzLCB0aGlzCittYXkgZ2l2ZSB5b3UgYW4gYXBwcm94aW1hdGlvbiBmb3IgdGhlIG51bWJlciB5b3UgY291bGQgdXNlIGFzIGluaXRpYWwgdmFsdWUgZm9yIHRoZXNlCitleHBlcmltZW50cy48L3A+CiAKLTxwPkJ5IGRlZmF1bHQgdGhpcyB0YXNrIHdvbid0IGRvIGFueXRoaW5nIHVubGVzcyBpdCBkZXRlY3RzIGl0IGlzCi0gIHJ1bm5pbmcgb24gYSBVbml4IHN5c3RlbS4gIElmIHlvdSBrbm93IGZvciBzdXJlIHRoYXQgeW91IGhhdmUgYQotICAiY2hvd24iIGV4ZWN1dGFibGUgb24geW91ciBQQVRIIHRoYXQgaXMgY29tbWFuZCBsaW5lIGNvbXBhdGlibGUgd2l0aAotICB0aGUgVW5peCBjb21tYW5kLCB5b3UgY2FuIHVzZSB0aGUgdGFzaydzIG9zIGF0dHJpYnV0ZSBhbmQgc2V0IGl0cwotICB2YWx1ZSB0byB5b3VyIGN1cnJlbnQgb3MuPC9wPgorPHA+QnkgZGVmYXVsdCB0aGlzIHRhc2sgd29uJ3QgZG8gYW55dGhpbmcgdW5sZXNzIGl0IGRldGVjdHMgaXQgaXMgcnVubmluZyBvbiBhIFVuaXggc3lzdGVtLiAgSWYgeW91Citrbm93IGZvciBzdXJlIHRoYXQgeW91IGhhdmUgYSA8a2JkPmNob3duPC9rYmQ+IGV4ZWN1dGFibGUgb24geW91ciA8Y29kZT5QQVRIPC9jb2RlPiB0aGF0IGlzIGNvbW1hbmQKK2xpbmUgY29tcGF0aWJsZSB3aXRoIHRoZSBVbml4IGNvbW1hbmQsIHlvdSBjYW4gdXNlIHRoZSB0YXNrJ3MgPHZhcj5vczwvdmFyPiBhdHRyaWJ1dGUgYW5kIHNldCBpdHMKK3ZhbHVlIHRvIHlvdXIgY3VycmVudCBPUy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBvciBkaXJlY3Rvcnkgb2Ygd2hpY2ggdGhlIG93bmVyIG11c3QgYmUKKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBmaWxlIG9yIGRpcmVjdG9yeSBvZiB3aGljaCB0aGUgb3duZXIgbXVzdCBiZQogICAgIGNoYW5nZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHZhbGlnbj0ibWlkZGxlIj5ZZXMgb3IgbmVzdGVkCi0gICAgPGNvZGU+Jmx0O2ZpbGVzZXQvbGlzdCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldHxmaWxlbGlzdHxkaXJzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3duZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5ldyBvd25lci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+b3duZXI8L3RkPgorICAgIDx0ZD50aGUgbmV3IG93bmVyLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcmFsbGVsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb2Nlc3MgYWxsIHNwZWNpZmllZCBmaWxlcyB1c2luZyBhIHNpbmdsZQotICAgICAgPGNvZGU+Y2hvd248L2NvZGU+IGNvbW1hbmQuIERlZmF1bHRzIHRvIHRydWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cGFyYWxsZWw8L3RkPgorICAgIDx0ZD5wcm9jZXNzIGFsbCBzcGVjaWZpZWQgZmlsZXMgdXNpbmcgYSBzaW5nbGUgPGtiZD5jaG93bjwva2JkPiBjb21tYW5kLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25lIG9mIDxpPmZpbGU8L2k+LCA8aT5kaXI8L2k+IG9yCi0gICAgICA8aT5ib3RoPC9pPi4gSWYgc2V0IHRvIDxpPmZpbGU8L2k+LCBvbmx5IHRoZSBvd25lciBvZgotICAgICAgcGxhaW4gZmlsZXMgYXJlIGdvaW5nIHRvIGJlIGNoYW5nZWQuIElmIHNldCB0byA8aT5kaXI8L2k+LCBvbmx5Ci0gICAgICB0aGUgZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQuPGJyPgotICAgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgdHlwZSBhdHRyaWJ1dGUgZG9lcyBub3QgYXBwbHkgdG8KLSAgICAgIG5lc3RlZCA8aT5kaXJzZXQ8L2k+cyAtIDxpPmRpcnNldDwvaT5zIGFsd2F5cyBpbXBsaWNpdGx5Ci0gICAgICBhc3N1bWUgdHlwZSB0byBiZSA8aT5kaXI8L2k+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5maWxlPC9pPjwvdGQ+CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5PbmUgb2YgPHE+ZmlsZTwvcT4sIDxxPmRpcjwvcT4gb3IgPHE+Ym90aDwvcT4uIElmIHNldCB0byA8cT5maWxlPC9xPiwgb25seSB0aGUgb3duZXIgb2YKKyAgICAgIHBsYWluIGZpbGVzIGFyZSBnb2luZyB0byBiZSBjaGFuZ2VkLiBJZiBzZXQgdG8gPHE+ZGlyPC9xPiwgb25seSB0aGUgZGlyZWN0b3JpZXMgYXJlCisgICAgICBjb25zaWRlcmVkLjxici8+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGUgPHZhcj50eXBlPC92YXI+IGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0bworICAgICAgbmVzdGVkIDxjb2RlPmRpcnNldDwvY29kZT5zJm1kYXNoOzxjb2RlPmRpcnNldDwvY29kZT5zIGFsd2F5cyBpbXBsaWNpdGx5IGFzc3VtZSB0eXBlIHRvCisgICAgICBiZSA8cT5kaXI8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZpbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4cGFyYWxsZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGltaXQgdGhlIGFtb3VudCBvZiBwYXJhbGxlbGlzbSBieSBwYXNzaW5nIGF0Ci0gICAgICBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvICZsdDs9IDAgZm9yCi0gICAgICB1bmxpbWl0ZWQuICBEZWZhdWx0cyB0byB1bmxpbWl0ZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLQorICAgIDx0ZD5tYXhwYXJhbGxlbDwvdGQ+CisgICAgPHRkPkxpbWl0IHRoZSBhbW91bnQgb2YgcGFyYWxsZWxpc20gYnkgcGFzc2luZyBhdCBtb3N0IHRoaXMgbWFueSBzb3VyY2VmaWxlcyBhdCBvbmNlLiAgU2V0IGl0IHRvCisgICAgICBuZWdhdGl2ZSBpbnRlZ2VyIGZvciB1bmxpbWl0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHVubGltaXRlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC4KLSAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwcmludCBhIHN1bW1hcnkgYWZ0ZXIgZXhlY3V0aW9uIG9yIG5vdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUKLSAgICAgIGV4ZWN1dGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm9zPC90ZD4KKyAgICA8dGQ+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vc2ZhbWlseTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PUyBmYW1pbHkgYXMgdXNlZCBpbgotICAgICAgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL2NvbmRpdGlvbnMuaHRtbCNvcyI+Jmx0O29zJmd0OzwvYT4KKyAgICA8dGQ+b3NmYW1pbHk8L3RkPgorICAgIDx0ZD5PUyBmYW1pbHkgYXMgdXNlZCBpbiB0aGUgPGEgaHJlZj0iLi4vVGFza3MvY29uZGl0aW9ucy5odG1sI29zIj4mbHQ7b3MmZ3Q7PC9hPgogICAgICAgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObyAtIGRlZmF1bHRzIHRvICJ1bml4IjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT51bml4PC9xPjwvdGQ+CiAgIDwvdHI+Ci0KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtjaG93biBmaWxlPSIke2Rpc3R9L3N0YXJ0LnNoIiBvd25lcj0iY29kZXJqb2UiLyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+bWFrZXMgdGhlICJzdGFydC5zaCIgZmlsZSBiZWxvbmcgdG8gY29kZXJqb2Ugb24gYQotVU5JWCBzeXN0ZW0uPC9wPgotPGJsb2NrcXVvdGU+CisKKzxwPk1ha2UgdGhlIDxzYW1wPnN0YXJ0LnNoPC9zYW1wPiBmaWxlIGJlbG9uZyB0byA8c2FtcD5jb2RlcmpvZTwvc2FtcD4gb24gYSBVTklYIHN5c3RlbS48L3A+Cis8cHJlPiZsdDtjaG93biBmaWxlPSIke2Rpc3R9L3N0YXJ0LnNoIiBvd25lcj0iY29kZXJqb2UiLyZndDs8L3ByZT4KKworPHA+TWFrZSBhbGwgPHNhbXA+LnNoPC9zYW1wPiBmaWxlcyBiZWxvdyA8c2FtcD4ke2Rpc3R9L2Jpbjwvc2FtcD4gYmVsb25nIHRvIDxzYW1wPmNvZGVyam9lPC9zYW1wPiBvbgorYSBVTklYIHN5c3RlbS48L3A+CiA8cHJlPgotICAgICZsdDtjaG93biBvd25lcj0iY29kZXJqb2UiJmd0OwotICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpc3R9L2JpbiIgaW5jbHVkZXM9IioqLyouc2giLyZndDsKLSAgICAmbHQ7L2Nob3duJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5tYWtlcyBhbGwgIi5zaCIgZmlsZXMgYmVsb3cgPGNvZGU+JHtkaXN0fS9iaW48L2NvZGU+Ci1iZWxvbmcgdG8gY29kZXJqb2Ugb24gYSBVTklYIHN5c3RlbS48L3A+Ci08YmxvY2txdW90ZT4KKyZsdDtjaG93biBvd25lcj0iY29kZXJqb2UiJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9IiR7ZGlzdH0vYmluIiBpbmNsdWRlcz0iKiovKi5zaCIvJmd0OworJmx0Oy9jaG93biZndDs8L3ByZT4KKworPHA+TWFrZSBhbGwgZmlsZXMgYmVsb3cgPHNhbXA+c2hhcmVkL3NvdXJjZXMxPC9zYW1wPiAoZXhjZXB0IHRob3NlIGJlbG93IGFueSBkaXJlY3RvcnkKK25hbWVkIDxzYW1wPnRyaWFsPC9zYW1wPikgYmVsb25nIHRvIDxzYW1wPmNvZGVyam9lPC9zYW1wPiBvbiBhIFVOSVggc3lzdGVtLiBJbiBhZGRpdGlvbiwgYWxsIGZpbGVzCitiZWxvbmdpbmcgdG8gYSBGaWxlU2V0IHdpdGggPHZhcj5pZDwvdmFyPj08Y29kZT5vdGhlci5zaGFyZWQuc291cmNlczwvY29kZT4gZ2V0IHRoZSBzYW1lIG93bmVyLjwvcD4KIDxwcmU+CiAmbHQ7Y2hvd24gb3duZXI9ImNvZGVyam9lIiZndDsKICAgJmx0O2ZpbGVzZXQgZGlyPSJzaGFyZWQvc291cmNlczEiJmd0OwogICAgICZsdDtleGNsdWRlIG5hbWU9IioqL3RyaWFsLyoqIi8mZ3Q7CiAgICZsdDsvZmlsZXNldCZndDsKICAgJmx0O2ZpbGVzZXQgcmVmaWQ9Im90aGVyLnNoYXJlZC5zb3VyY2VzIi8mZ3Q7Ci0mbHQ7L2Nob3duJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5tYWtlcyBhbGwgZmlsZXMgYmVsb3cgPGNvZGU+c2hhcmVkL3NvdXJjZXMxPC9jb2RlPiAoZXhjZXB0IHRob3NlCi1iZWxvdyBhbnkgZGlyZWN0b3J5IG5hbWVkIHRyaWFsKSBiZWxvbmcgdG8gY29kZXJqb2Ugb24gYSBVTklYIAotc3lzdGVtLiBJbiBhZGRpdGlvbiBhbGwgZmlsZXMgYmVsb25naW5nIHRvIGEgRmlsZVNldAotd2l0aCA8Y29kZT5pZDwvY29kZT4gPGNvZGU+b3RoZXIuc2hhcmVkLnNvdXJjZXM8L2NvZGU+IGdldCB0aGUgc2FtZQotb3duZXIuPC9wPgorJmx0Oy9jaG93biZndDs8L3ByZT4KIAotPGJsb2NrcXVvdGU+Cis8cD5NYWtlIDxzYW1wPmNnaTwvc2FtcD4gc2NyaXB0cywgZmlsZXMgd2l0aCBhIDxzYW1wPi5vbGQ8L3NhbXA+IGV4dGVuc2lvbiBvciBkaXJlY3RvcmllcyBiZWdpbm5pbmcKK3dpdGggPHNhbXA+cHJpdmF0ZV88L3NhbXA+IGJlbG9uZyB0byB0aGUgdXNlciBuYW1lZCA8c2FtcD53ZWJhZG1pbjwvc2FtcD4uIEEgZGlyZWN0b3J5IGVuZGluZworaW4gPHNhbXA+Lm9sZDwvc2FtcD4gb3IgYSBmaWxlIGJlZ2lubmluZyB3aXRoIDxzYW1wPnByaXZhdGVfPC9zYW1wPiB3b3VsZCByZW1haW4gdW5hZmZlY3RlZC48L3A+CiA8cHJlPgogJmx0O2Nob3duIG93bmVyPSJ3ZWJhZG1pbiIgdHlwZT0iZmlsZSImZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0iL3dlYiImZ3Q7CkBAIC0xNjcsMTcgKzE0NSw3IEBACiAgICZsdDtkaXJzZXQgZGlyPSIvd2ViIiZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9wcml2YXRlXyoiLyZndDsKICAgJmx0Oy9kaXJzZXQmZ3Q7Ci0mbHQ7L2NobW9kJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxwPm1ha2VzIGNnaSBzY3JpcHRzLCBmaWxlcyB3aXRoIGEgPGNvZGU+Lm9sZDwvY29kZT4gZXh0ZW5zaW9uIG9yCi1kaXJlY3RvcmllcyBiZWdpbm5pbmcgd2l0aCA8Y29kZT5wcml2YXRlXzwvY29kZT4gYmVsb25nIHRvIHRoZSB1c2VyIG5hbWVkCi13ZWJhZG1pbi4gQSBkaXJlY3RvcnkgZW5kaW5nIGluIDxjb2RlPi5vbGQ8L2NvZGU+IG9yIGEgZmlsZSBiZWdpbm5pbmcgd2l0aCAKLTxjb2RlPnByaXZhdGVfPC9jb2RlPiB3b3VsZCByZW1haW4gdW5hZmZlY3RlZC48L3A+Ci0KLQorJmx0Oy9jaG1vZCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY2xlYXJjYXNlLmh0bWwgYi9tYW51YWwvVGFza3MvY2xlYXJjYXNlLmh0bWwKaW5kZXggOTAyZDVlZi4uYzNjYTQxZiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NsZWFyY2FzZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jbGVhcmNhc2UuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDg2ICsxNSw4MCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotICA8dGl0bGU+Q2xlYXJjYXNlIFRhc2tzPC90aXRsZT4KKyAgPHRpdGxlPkNsZWFyQ2FzZSBUYXNrczwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogPGgxPkFwYWNoZSBBbnQgQ2xlYXJDYXNlIFRhc2tzPC9oMT4KLTxwPmJ5Ojxicj4KLUN1cnRpcyBXaGl0ZSAoY3doaXRlIGF0IGFyYWNuZXQgZG90IGNvbSksPGJyPgotU2VhbiBQLiBLYW5lIChzcGthbmUgYXQgZ2Vub21hdGljYSBkb3QgY29tKSw8YnI+Ci1Sb2IgQW5kZXJzb24gKEFuZGVyc29uLlJvYiBhdCB2ZWN0b3JzY20gZG90IGNvbSksIGFuZDxicj4KKzxwPmJ5Ojxici8+CitDdXJ0aXMgV2hpdGUgKGN3aGl0ZSBhdCBhcmFjbmV0IGRvdCBjb20pLDxici8+CitTZWFuIFAuIEthbmUgKHNwa2FuZSBhdCBnZW5vbWF0aWNhIGRvdCBjb20pLDxici8+CitSb2IgQW5kZXJzb24gKEFuZGVyc29uLlJvYiBhdCB2ZWN0b3JzY20gZG90IGNvbSksIGFuZDxici8+CiBTZWFuIEVnYW4gICAgKHNlYW4gYXQgY20tbG9naWMgZG90IGNvbSk8L3A+CiAKLTxwPlZlcnNpb24gMS42IC0gMDIvMjUvMjAwMzwvcD4KKzxwPlZlcnNpb24gMS42Jm1kYXNoOzAyLzI1LzIwMDM8L3A+CiAKIDxoMT5DbGVhckNhc2UgU3VwcG9ydDwvaDE+CiA8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgogPHVsPgotICA8bGk+PEEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPgotICA8bGk+PEEgaHJlZj0iI2NjY2hlY2tpbiI+Q0NDaGVja2luPC9hPgotICA8bGk+PEEgaHJlZj0iI2NjY2hlY2tvdXQiPkNDQ2hlY2tvdXQ8L2E+Ci0gIDxsaT48QSBocmVmPSIjY2N1bmNoZWNrb3V0Ij5DQ1VuQ2hlY2tvdXQ8L2E+Ci0gIDxsaT48QSBocmVmPSIjY2N1cGRhdGUiPkNDVXBkYXRlPC9hPgotICA8bGk+PEEgaHJlZj0iI2NjbWtsYnR5cGUiPkNDTWtsYnR5cGU8L2E+Ci0gIDxsaT48QSBocmVmPSIjY2Nta2xhYmVsIj5DQ01rbGFiZWw8L2E+Ci0gIDxsaT48QSBocmVmPSIjY2NybXR5cGUiPkNDUm10eXBlPC9hPgotICA8bGk+PEEgaHJlZj0iI2NjbG9jayI+Q0NMb2NrPC9hPgotICA8bGk+PEEgaHJlZj0iI2NjdW5sb2NrIj5DQ1VubG9jazwvYT4KLSAgPGxpPjxBIGhyZWY9IiNjY21rYmwiPkNDTWtibDwvYT4KLSAgPGxpPjxBIGhyZWY9IiNjY21rYXR0ciI+Q0NNa2F0dHI8L2E+Ci0gIDxsaT48QSBocmVmPSIjY2Nta2RpciI+Q0NNa2RpcjwvYT4KLSAgPGxpPjxBIGhyZWY9IiNjY21rZWxlbSI+Q0NNa2VsZW08L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT4KKyAgPGxpPjxhIGhyZWY9IiNjY2NoZWNraW4iPkNDQ2hlY2tpbjwvYT4KKyAgPGxpPjxhIGhyZWY9IiNjY2NoZWNrb3V0Ij5DQ0NoZWNrb3V0PC9hPgorICA8bGk+PGEgaHJlZj0iI2NjdW5jaGVja291dCI+Q0NVbkNoZWNrb3V0PC9hPgorICA8bGk+PGEgaHJlZj0iI2NjdXBkYXRlIj5DQ1VwZGF0ZTwvYT4KKyAgPGxpPjxhIGhyZWY9IiNjY21rbGJ0eXBlIj5DQ01rbGJ0eXBlPC9hPgorICA8bGk+PGEgaHJlZj0iI2NjbWtsYWJlbCI+Q0NNa2xhYmVsPC9hPgorICA8bGk+PGEgaHJlZj0iI2Njcm10eXBlIj5DQ1JtdHlwZTwvYT4KKyAgPGxpPjxhIGhyZWY9IiNjY2xvY2siPkNDTG9jazwvYT4KKyAgPGxpPjxhIGhyZWY9IiNjY3VubG9jayI+Q0NVbmxvY2s8L2E+CisgIDxsaT48YSBocmVmPSIjY2Nta2JsIj5DQ01rYmw8L2E+CisgIDxsaT48YSBocmVmPSIjY2Nta2F0dHIiPkNDTWthdHRyPC9hPgorICA8bGk+PGEgaHJlZj0iI2NjbWtkaXIiPkNDTWtkaXI8L2E+CisgIDxsaT48YSBocmVmPSIjY2Nta2VsZW0iPkNDTWtlbGVtPC9hPjwvbGk+CiAKIDwvdWw+CiAKLTxocj4KLTxoMj48YSBuYW1lPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgotPHA+QXBhY2hlIEFudCBwcm92aWRlcyBzZXZlcmFsIG9wdGlvbmFsIHRhc2tzIGZvciB3b3JraW5nIHdpdGggQ2xlYXJDYXNlLiBUaGVzZSB0YXNrcyBjb3JyZXNwb25kIHRvIHZhcmlvdXMKLUNsZWFyQ2FzZSBjb21tYW5kcyB1c2luZyB0aGUgQ2xlYXJ0b29sIHByb2dyYW0uIFRoZSBjdXJyZW50IHRhc2tzIGF2YWlsYWJsZSBmb3IgQW50IGNvcnJlc3BvbmQgdG8gb25seQotYSBmZXcgb2YgdGhlIHNpZ25pZmljYW50IENsZWFyQ2FzZSBjb21tYW5kcy48L3A+Cis8aHIvPgorPGgyIGlkPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvaDI+Cis8cD5BcGFjaGUgQW50IHByb3ZpZGVzIHNldmVyYWwgb3B0aW9uYWwgdGFza3MgZm9yIHdvcmtpbmcgd2l0aCBDbGVhckNhc2UuIFRoZXNlIHRhc2tzIGNvcnJlc3BvbmQgdG8KK3ZhcmlvdXMgQ2xlYXJDYXNlIGNvbW1hbmRzIHVzaW5nIHRoZSA8a2JkPmNsZWFydG9vbDwva2JkPiBwcm9ncmFtLiBUaGUgY3VycmVudCB0YXNrcyBhdmFpbGFibGUgZm9yCitBbnQgY29ycmVzcG9uZCB0byBvbmx5IGEgZmV3IG9mIHRoZSBzaWduaWZpY2FudCBDbGVhckNhc2UgY29tbWFuZHMuPC9wPgogCi08cD5Nb3JlIHRhc2tzIGNhbiBiZSBlYXNpbHkgYWRkZWQgYnkgZGVyaXZpbmcgZnJvbSB0aGUgQ2xlYXJDYXNlIGNsYXNzIGFuZCB0aGVuIGFkZGluZwotZnVuY3Rpb25hbGl0eSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoYXQgQ2xlYXJDYXNlIGNvbW1hbmQuPC9wPgotPHA+Ci0gICAgSW1wb3J0YW50OiB0aGVzZSB0YXNrcyBhbGwgcmVxdWlyZSA8Y29kZT5jbGVhcnRvb2w8L2NvZGU+IG9uIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgSWYgYSB0YXNrIGZhaWxzIHdpdGggYW4gSU9FeGNlcHRpb24sIGVzcGVjaWFsbHkgZXJyb3IgY29kZSAyIG9uIFdpbmRvd3MsCi0gICAgdGhpcyBpcyB5b3VyIHByb2JsZW0uCi08L3A+Cis8cD5Nb3JlIHRhc2tzIGNhbiBiZSBlYXNpbHkgYWRkZWQgYnkgZGVyaXZpbmcgZnJvbSB0aGUgQ2xlYXJDYXNlIGNsYXNzIGFuZCB0aGVuIGFkZGluZyBmdW5jdGlvbmFsaXR5Cit0aGF0IGlzIHNwZWNpZmljIHRvIHRoYXQgQ2xlYXJDYXNlIGNvbW1hbmQuPC9wPgorPHA+SW1wb3J0YW50OiB0aGVzZSB0YXNrcyBhbGwgcmVxdWlyZSA8a2JkPmNsZWFydG9vbDwva2JkPiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgSWYgYSB0YXNrIGZhaWxzCit3aXRoIGFuIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiwgZXNwZWNpYWxseSA8Y29kZT5lcnJvcj0yPC9jb2RlPiBvbiBXaW5kb3dzLCB0aGlzIGlzIHlvdXIKK3Byb2JsZW0uPC9wPgogCis8aHIvPgogCi08aHI+Ci08aDI+PGEgbmFtZT0iY2NjaGVja2luIj5DQ0NoZWNraW48L2E+PC9oMj4KKzxoMiBpZD0iY2NjaGVja2luIj5DQ0NoZWNraW48L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhICJjbGVhcnRvb2wgY2hlY2tpbiIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8cD5UYXNrIHRvIHBlcmZvcm0gYSA8a2JkPmNsZWFydG9vbCBjaGVja2luPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnZpZXdwYXRoPC90ZD4KLSAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZAotICAgICAgICB3aWxsIG9wZXJhdGUgb248L3RkPgorICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY29tbWVudGZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNvbW1lbnRmaWxlCi0gICAgICAgIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5ub3dhcm48L3RkPgpAQCAtMTA3LDQ5ICsxMDIsNDcgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5rZWVwY29weTwvdGQ+Ci0gICAgPHRkPktlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+S2VlcHMgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSA8c2FtcD4ua2VlcDwvc2FtcD4gZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmlkZW50aWNhbDwvdGQ+Ci0gICAgPHRkPkFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsCi0gICAgICAgIHRvIHRoZSBvcmlnaW5hbDwvdGQ+CisgICAgPHRkPkFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbDwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsb25lcnI8L3RkPgotICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KKworPHA+UGVyZm9ybSBhIENsZWFyQ2FzZSA8Y29kZT5jaGVja2luPC9jb2RlPiBvbiB0aGUgZmlsZSA8c2FtcD5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9zYW1wPi4gQ29tbWVudAordGV4dCBmcm9tIHRoZSBmaWxlIDxzYW1wPmFjb21tZW50LnR4dDwvc2FtcD4gaXMgYWRkZWQgdG8gQ2xlYXJDYXNlIGFzIGEgY29tbWVudC4gQWxsIHdhcm5pbmcKK21lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkLiBUaGUgZmlsZSBpcyBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgPGVtPmlkZW50aWNhbDwvZW0+IHRvIHRoZQorb3JpZ2luYWwuPC9wPgogPHByZT4KICZsdDtjY2NoZWNraW4gdmlld3BhdGg9ImM6L3ZpZXdzL3ZpZXdkaXIvYWZpbGUiCi0gICAgICAgIGNvbW1lbnRmaWxlPSJhY29tbWVudC50eHQiCi0gICAgICAgIG5vd2Fybj0idHJ1ZSIKLSAgICAgICAgaWRlbnRpY2FsPSJ0cnVlIi8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkRvZXMgYSBDbGVhckNhc2UgPGk+Y2hlY2tpbjwvaT4gb24gdGhlIGZpbGUgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvaT4uCi1Db21tZW50IHRleHQgZnJvbSB0aGUgZmlsZSA8aT5hY29tbWVudC50eHQ8L2k+IGlzIGFkZGVkIHRvIENsZWFyQ2FzZSBhcyBhIGNvbW1lbnQuCi1BbGwgd2FybmluZyBtZXNzYWdlcyBhcmUgc3VwcHJlc3NlZC4gVGhlIGZpbGUgaXMgY2hlY2tlZCBpbiBldmVuIGlmIGl0IGlzCi08aT5pZGVudGljYWw8L2k+IHRvIHRoZSBvcmlnaW5hbC48L3A+Ci08aHI+Ci08aDI+PGEgbmFtZT0iY2NjaGVja291dCI+Q0NDaGVja291dDwvYT48L2gyPgorICAgICAgICAgICBjb21tZW50ZmlsZT0iYWNvbW1lbnQudHh0IgorICAgICAgICAgICBub3dhcm49InRydWUiCisgICAgICAgICAgIGlkZW50aWNhbD0idHJ1ZSIvJmd0OzwvcHJlPgorCis8aHIvPgorCis8aDIgaWQ9ImNjY2hlY2tvdXQiPkNDQ2hlY2tvdXQ8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhICJjbGVhcnRvb2wgY2hlY2tvdXQiIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgY2hlY2tvdXQ8L2tiZD4gY29tbWFuZCB0byBDbGVhckNhc2UuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kCi0gICAgICAgIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CkBAIC0xNjQsOCArMTU3LDcgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5ub2RhdGE8L3RkPgotICAgIDx0ZD5DaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4gZWRpdGFibGUgZmlsZQotICAgICAgICBjb250YWluaW5nIGl0cyBkYXRhPC90ZD4KKyAgICA8dGQ+Q2hlY2tzIG91dCB0aGUgZmlsZSBidXQgZG9lcyBub3QgY3JlYXRlIGFuIGVkaXRhYmxlIGZpbGUgY29udGFpbmluZyBpdHMgZGF0YTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgpAQCAtMTc1LDcgKzE2Nyw4IEBACiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+dmVyc2lvbjwvdGQ+Ci0gICAgPHRkPkFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiBtYWluIGxhdGVzdDwvdGQ+CisgICAgPHRkPkFsbG93cyBjaGVja291dCBvZiBhIHZlcnNpb24gb3RoZXIgdGhhbiA8Y29kZT4vbWFpbi9MQVRFU1Q8L2NvZGU+IChvciB3aGF0ZXZlciBpcyBzZWxlY3RlZAorICAgIGJ5IGEgY29uZmlnIHNwZWMpPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CkBAIC0xODUsOTYgKzE3OCw4NiBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjb21tZW50ZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm87IG9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KLSAgICA8dGQ+U3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IKLSAgICAgICAgY29tbWVudGZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQ8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPm5vdGNvPC90ZD4KLSAgICA8dGQ+RmFpbCBpZiBpdCdzIGFscmVhZHkgY2hlY2tlZCBvdXQgdG8gdGhlIGN1cnJlbnQgdmlldy4gU2V0IHRvIGZhbHNlIHRvIGlnbm9yZSBpdC48YnI+Ci0gICAgU2luY2UgYW50IDEuNi4xPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5GYWlsIGlmIGl0J3MgYWxyZWFkeSBjaGVja2VkIG91dCB0byB0aGUgY3VycmVudCB2aWV3LiBTZXQgdG8gPHE+ZmFsc2U8L3E+IHRvIGlnbm9yZQorICAgIGl0Ljxici8+PGVtPlNpbmNlIEFudCAxLjYuMTwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmZhaWxvbmVycjwvdGQ+Ci0gICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlLjxicj4KLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CisKKzxwPlBlcmZvcm0gYSBDbGVhckNhc2UgPGNvZGU+Y2hlY2tvdXQ8L2NvZGU+IG9uIHRoZSBmaWxlIDxzYW1wPmM6L3ZpZXdzL3ZpZXdkaXIvYWZpbGU8L3NhbXA+LiBJdCBpcworY2hlY2tlZCBvdXQgYXMgPGVtPnJlc2VydmVkPC9lbT4gb24gYnJhbmNoIGNhbGxlZCA8c2FtcD5hYnJhbmNoPC9zYW1wPi4gQWxsIHdhcm5pbmcgbWVzc2FnZXMgYXJlCitzdXBwcmVzc2VkLiBBICZxdW90OzxzYW1wPlNvbWUgY29tbWVudCB0ZXh0PC9zYW1wPiZxdW90OyBpcyBhZGRlZCB0byBDbGVhckNhc2UgYXMgYSBjb21tZW50LjwvcD4KIDxwcmU+CiAmbHQ7Y2NjaGVja291dCB2aWV3cGF0aD0iYzovdmlld3Mvdmlld2Rpci9hZmlsZSIKLSAgICAgICAgcmVzZXJ2ZWQ9InRydWUiCi0gICAgICAgIGJyYW5jaD0iYWJyYW5jaCIKLSAgICAgICAgbm93YXJuPSJ0cnVlIgotICAgICAgICBjb21tZW50PSJTb21lIGNvbW1lbnQgdGV4dCIvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPmNoZWNrb3V0PC9pPiBvbiB0aGUgZmlsZSA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9pPi4KLUl0IGlzIGNoZWNrZWQgb3V0IGFzIDxpPnJlc2VydmVkPC9pPiBvbiBicmFuY2ggY2FsbGVkIDxpPmFicmFuY2g8L2k+LiBBbGwKLXdhcm5pbmcgbWVzc2FnZXMgYXJlIHN1cHByZXNzZWQuIEEgPGk+U29tZSBjb21tZW50IHRleHQ8L2k+IGlzIGFkZGVkIHRvCi1DbGVhckNhc2UgYXMgYSBjb21tZW50LjwvcD4KLTxocj4KLTxoMj48YSBuYW1lPSJjY3VuY2hlY2tvdXQiPkNDVW5DaGVja291dDwvYT48L2gyPgorICAgICAgICAgICAgcmVzZXJ2ZWQ9InRydWUiCisgICAgICAgICAgICBicmFuY2g9ImFicmFuY2giCisgICAgICAgICAgICBub3dhcm49InRydWUiCisgICAgICAgICAgICBjb21tZW50PSJTb21lIGNvbW1lbnQgdGV4dCIvJmd0OzwvcHJlPgorCis8aHIvPgorCis8aDIgaWQ9ImNjdW5jaGVja291dCI+Q0NVbkNoZWNrb3V0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSBVbkNoZWNrb3V0IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgdW5jaGVja291dDwva2JkPiBjb21tYW5kIHRvIENsZWFyQ2FzZS48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD52aWV3cGF0aDwvdGQ+Ci0gICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQKLSAgICAgICAgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+UGF0aCB0byB0aGUgQ2xlYXJDYXNlIHZpZXcgZmlsZSBvciBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+a2VlcGNvcHk8L3RkPgotICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciB0byBrZWVwIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAKLSAgICAgICAgZXh0ZW5zaW9uIG9yIG5vdDwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB3aGV0aGVyIHRvIGtlZXAgYSBjb3B5IG9mIHRoZSBmaWxlIHdpdGggYSA8c2FtcD4ua2VlcDwvc2FtcD4gZXh0ZW5zaW9uIG9yIG5vdDwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsb25lcnI8L3RkPgotICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTxicj4KLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci08cHJlPgotJmx0O2NjdW5jaGVja291dCB2aWV3cGF0aD0iYzovdmlld3Mvdmlld2Rpci9hZmlsZSIKLSAgICAgICAga2VlcGNvcHk9InRydWUiLyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT51bmNoZWNrb3V0PC9pPiBvbiB0aGUgZmlsZSA8aT5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9pPi4KLUEgY29weSBvZiB0aGUgZmlsZSBjYWxsZWQgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZS5rZWVwPC9pPiBpcyBrZXB0LjwvcD4KLTxocj4KLTxoMj48YSBuYW1lPSJjY3VwZGF0ZSI+Q0NVcGRhdGU8L2E+PC9oMj4KKworPHA+UGVyZm9ybSBhIENsZWFyQ2FzZSA8Y29kZT51bmNoZWNrb3V0PC9jb2RlPiBvbiB0aGUgZmlsZSA8c2FtcD5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9zYW1wPi4gQQorY29weSBvZiB0aGUgZmlsZSBuYW1lZCA8c2FtcD5jOi92aWV3cy92aWV3ZGlyL2FmaWxlLmtlZXA8L3NhbXA+IGlzIGtlcHQuPC9wPgorPHByZT4mbHQ7Y2N1bmNoZWNrb3V0IHZpZXdwYXRoPSJjOi92aWV3cy92aWV3ZGlyL2FmaWxlIiBrZWVwY29weT0idHJ1ZSIvJmd0OzwvcHJlPgorCis8aHIvPgorCis8aDIgaWQ9ImNjdXBkYXRlIj5DQ1VwZGF0ZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBwZXJmb3JtIGFuICJjbGVhcnRvb2wgdXBkYXRlIiBjb21tYW5kIHRvIENsZWFyQ2FzZS4KKzxwPlRhc2sgdG8gcGVyZm9ybSBhbiA8a2JkPmNsZWFydG9vbCB1cGRhdGU8L2tiZD4gY29tbWFuZCB0byBDbGVhckNhc2UuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2Ugc25hcHNob3QgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kCi0gICAgICAgIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSBzbmFwc2hvdCB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CkBAIC0yOTQsNjY1ICsyNzcsNjI5IEBACiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+cmVuYW1lPC90ZD4KLSAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgaGlqYWNrZWQgZmlsZXMgc2hvdWxkIGJlIHJlbmFtZWQgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbjwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGF0IGhpamFja2VkIGZpbGVzIHNob3VsZCBiZSByZW5hbWVkIHdpdGggYSA8c2FtcD4ua2VlcDwvc2FtcD4gZXh0ZW5zaW9uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmN1cnJlbnR0aW1lPC90ZD4KLSAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgbW9kaWZpY2F0aW9uIHRpbWUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhlCi0gICAgICAgIGN1cnJlbnQgdGltZS4gRWl0aGVyIGN1cnJlbnR0aW1lIG9yIHByZXNlcnZldGltZSBjYW4gYmUKLSAgICAgICAgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoZSBjdXJyZW50IHRpbWUuIE11dHVhbGx5IGV4Y2x1c2l2ZQorICAgIHdpdGggPHZhcj5wcmVzZXJ2ZXRpbWU8L3Zhcj4uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+Ci0gICAgPHRkPlNwZWNpZmllcyB0aGF0IG1vZGlmaWNhdGlvbiB0aW1lIHNob3VsZCBwcmVzZXJ2ZWQgZnJvbSB0aGUKLSAgICAgICAgVk9CIHRpbWUuIEVpdGhlciBjdXJyZW50dGltZSBvciBwcmVzZXJ2ZXRpbWUgY2FuIGJlCi0gICAgICAgIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhhdCBtb2RpZmljYXRpb24gdGltZSBzaG91bGQgcHJlc2VydmVkIGZyb20gdGhlIFZPQiB0aW1lLiBNdXR1YWxseSBleGNsdXNpdmUKKyAgICB3aXRoIDx2YXI+Y3VycmVudHRpbWU8L3Zhcj4uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmZhaWxvbmVycjwvdGQ+Ci0gICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlLjxicj4KLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy48YnIvPiAgPGVtPlNpbmNlIEFudCAxLjYuMTwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KKworPHA+UGVyZm9ybSBhIENsZWFyQ2FzZSA8Y29kZT51cGRhdGU8L2NvZGU+IG9uIHRoZSBzbmFwc2hvdCB2aWV3CitkaXJlY3RvcnkgPHNhbXA+Yzovdmlld3Mvdmlld2Rpcjwvc2FtcD4uIEEgZ3JhcGhpY2FsIGRpYWxvZyB3aWxsIGJlIGRpc3BsYXllZC4gVGhlIG91dHB1dCB3aWxsIGJlCitsb2dnZWQgdG8gPHNhbXA+bG9nLmxvZzwvc2FtcD4gYW5kIGl0IHdpbGwgb3ZlcndyaXRlIGFueSBoaWphY2tlZCBmaWxlcy4gVGhlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZQorc2V0IHRvIHRoZSBjdXJyZW50IHRpbWUuPC9wPgogPHByZT4KICZsdDtjY3VwZGF0ZSB2aWV3cGF0aD0iYzovdmlld3Mvdmlld2RpciIKLSAgICAgICAgZ3JhcGhpY2FsPSJmYWxzZSIKLSAgICAgICAgbG9nPSJsb2cubG9nIgotICAgICAgICBvdmVyd3JpdGU9InRydWUiCi0gICAgICAgIGN1cnJlbnR0aW1lPSJ0cnVlIgotICAgICAgICByZW5hbWU9ImZhbHNlIi8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkRvZXMgYSBDbGVhckNhc2UgPGk+dXBkYXRlPC9pPiBvbiB0aGUgc25hcHNob3QgdmlldyBkaXJlY3RvcnkgPGk+Yzovdmlld3Mvdmlld2RpcjwvaT4uCi1BIGdyYXBoaWNhbCBkaWFsb2cgd2lsbCBiZSBkaXNwbGF5ZWQuIFRoZSBvdXRwdXQgd2lsbCBiZSBsb2dnZWQgdG8KLTxpPmxvZy5sb2c8L2k+IGFuZCBpdCB3aWxsIG92ZXJ3cml0ZSBhbnkgaGlqYWNrZWQgZmlsZXMuIFRoZSBtb2RpZmllZAotdGltZSB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCB0aW1lLjwvcD4KKyAgICAgICAgICBncmFwaGljYWw9ImZhbHNlIgorICAgICAgICAgIGxvZz0ibG9nLmxvZyIKKyAgICAgICAgICBvdmVyd3JpdGU9InRydWUiCisgICAgICAgICAgY3VycmVudHRpbWU9InRydWUiCisgICAgICAgICAgcmVuYW1lPSJmYWxzZSIvJmd0OzwvcHJlPgogCis8aHIvPgogCi0KLTxocj4KLTxoMj48YSBuYW1lPSJjY21rbGJ0eXBlIj5DQ01rbGJ0eXBlPC9hPjwvaDI+Cis8aDIgaWQ9ImNjbWtsYnR5cGUiPkNDTWtsYnR5cGU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhICJta2xidHlwZSIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8cD5UYXNrIHRvIHBlcmZvcm0gYSA8a2JkPmNsZWFydG9vbCBta2xidHlwZTwva2JkPiBjb21tYW5kIHRvIENsZWFyQ2FzZS48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgIDx0aD5SZXF1aXJlZDwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD50eXBlbmFtZTwvdGQ+CiAgICAgPHRkPk5hbWUgb2YgdGhlIGxhYmVsIHR5cGUgdG8gY3JlYXRlPC90ZD4KICAgICA8dGQ+WWVzPC90ZD4KLSAgPHRyPgorICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnZvYjwvdGQ+CiAgICAgPHRkPk5hbWUgb2YgdGhlIFZPQjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnJlcGxhY2U8L3RkPgogICAgIDx0ZD5SZXBsYWNlIGFuIGV4aXN0aW5nIGxhYmVsIGRlZmluaXRpb24gb2YgdGhlIHNhbWUgdHlwZTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmdsb2JhbDwvdGQ+Ci0gICAgPHRkPkVpdGhlciBnbG9iYWwgb3Igb3JkaW5hcnkgY2FuIGJlIHNwZWNpZmllZCwgbm90IGJvdGguIENyZWF0ZXMgYSBsYWJlbCB0eXBlIHRoYXQgaXMgZ2xvYmFsIHRvIHRoZSBWT0Igb3IgdG8gVk9CcyB0aGF0IHVzZSB0aGlzIFZPQjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICAgIDx0ZD5DcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGlzIGdsb2JhbCB0byB0aGUgVk9CIG9yIHRvIFZPQnMgdGhhdCB1c2UgdGhpcyBWT0IuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm87IG9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHVzZWQsCisgICAgZGVmYXVsdCA8dmFyPm9yZGluYXJ5PC92YXI+PTxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5vcmRpbmFyeTwvdGQ+Ci0gICAgPHRkPkVpdGhlciBnbG9iYWwgb3Igb3JkaW5hcnkgY2FuIGJlIHNwZWNpZmllZCwgbm90IGJvdGguIENyZWF0ZXMgYSBsYWJlbCB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgb25seSBpbiB0aGUgY3VycmVudCBWT0IuIDxCPkRlZmF1bHQ8L0I+PC90ZD4KLSAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5DcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIGN1cnJlbnQgVk9CLjwvdGQ+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+cGJyYW5jaDwvdGQ+CiAgICAgPHRkPkFsbG93cyB0aGUgbGFiZWwgdHlwZSB0byBiZSB1c2VkIG9uY2UgcGVyIGJyYW5jaCBpbiBhIGdpdmVuIGVsZW1lbnQncyB2ZXJzaW9uIHRyZWU8L3RkPgogICAgIDx0ZD5ObzwvdGQ+Ci0gIDx0cj4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5zaGFyZWQ8L3RkPgotICAgIDx0ZD5TZXRzIHRoZSB3YXkgbWFzdGVyc2hpcCBpcyBjaGVja2VkIGJ5IENsZWFyQ2FzZS4gU2VlIENsZWFyQ2FzZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgd2F5IG1hc3RlcnNoaXAgaXMgY2hlY2tlZCBieSBDbGVhckNhc2UuIFNlZSBDbGVhckNhc2UgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICBkZXRhaWxzPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPjwvdHI+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudDwvdGQ+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8YnI+Ci0gICAgU2luY2UgYW50IDEuNi4xPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuPGJyLz48ZW0+U2luY2UgQW50IDEuNi4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CisKKzxwPlBlcmZvcm0gYSBDbGVhckNhc2UgPGNvZGU+bWtsYnR5cGU8L2NvZGU+IHRvIGNyZWF0ZSBhIGxhYmVsIHR5cGUgbmFtZWQgPHNhbXA+VkVSU0lPTl8xPC9zYW1wPi4gSXQKK2lzIGNyZWF0ZWQgYXMgPGVtPm9yZGluYXJ5PC9lbT4gc28gaXQgaXMgYXZhaWxhYmxlIG9ubHkgdG8gdGhlIGN1cnJlbnQgVk9CLiBUaGUgdGV4dCA8cT5EZXZlbG9wbWVudAordmVyc2lvbiAxPC9xPiBpcyBhZGRlZCBhcyBhIGNvbW1lbnQuPC9wPgogPHByZT4KICZsdDtjY21rbGJ0eXBlIHR5cGVuYW1lPSJWRVJTSU9OXzEiCi0gICAgICAgIG9yZGluYXJ5PSJ0cnVlIgotICAgICAgICBjb21tZW50PSJEZXZlbG9wbWVudCB2ZXJzaW9uIDEiLyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT5ta2xidHlwZTwvaT4gdG8gY3JlYXRlIGEgbGFiZWwgdHlwZSBuYW1lZCA8aT5WRVJTSU9OXzE8L2k+LgotSXQgaXMgY3JlYXRlZCBhcyA8aT5vcmRpbmFyeTwvaT4gc28gaXQgaXMgYXZhaWxhYmxlIG9ubHkgdG8gdGhlIGN1cnJlbnQgVk9CLgotVGhlIHRleHQgPGk+RGV2ZWxvcG1lbnQgdmVyc2lvbiAxPC9pPiBpcyBhZGRlZCBhcyBhIGNvbW1lbnQuPC9wPgorICAgICAgICAgICAgb3JkaW5hcnk9InRydWUiCisgICAgICAgICAgICBjb21tZW50PSJEZXZlbG9wbWVudCB2ZXJzaW9uIDEiLyZndDs8L3ByZT4KIAorPGhyLz4KIAotPGhyPgotPGgyPjxhIG5hbWU9ImNjbWtsYWJlbCI+Q0NNa2xhYmVsPC9hPjwvaDI+Cis8aDIgaWQ9ImNjbWtsYWJlbCI+Q0NNa2xhYmVsPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSAibWtsYWJlbCIgY29tbWFuZCB0byBDbGVhckNhc2UuCis8cD5UYXNrIHRvIHBlcmZvcm0gYSA8a2JkPmNsZWFydG9vbCBta2xhYmVsPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnR5cGVuYW1lPC90ZD4KICAgICA8dGQ+TmFtZSBvZiB0aGUgbGFiZWwgdHlwZTwvdGQ+CiAgICAgPHRkPlllczwvdGQ+Ci0gIDx0cj4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD52aWV3cGF0aDwvdGQ+CiAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+cmVwbGFjZTwvdGQ+CiAgICAgPHRkPlJlcGxhY2UgYSBsYWJlbCBvZiB0aGUgc2FtZSB0eXBlIG9uIHRoZSBzYW1lIGJyYW5jaDwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnJlY3Vyc2U8L3RkPgotICAgIDx0ZD5Qcm9jZXNzIGVhY2ggc3ViZGlyZWN0b3J5IHVuZGVyIHZpZXdwYXRoPC90ZD4KKyAgICA8dGQ+UHJvY2VzcyBlYWNoIHN1YmRpcmVjdG9yeSB1bmRlciA8dmFyPnZpZXdwYXRoPC92YXI+PC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+dmVyc2lvbjwvdGQ+CiAgICAgPHRkPklkZW50aWZ5IGEgc3BlY2lmaWMgdmVyc2lvbiB0byBhdHRhY2ggdGhlIGxhYmVsIHRvPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+dm9iPC90ZD4KICAgICA8dGQ+TmFtZSBvZiB0aGUgVk9CPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPjwvdHI+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudDwvdGQ+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWU8YnI+Ci0gICAgU2luY2UgYW50IDEuNi4xPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuPGJyLz48ZW0+U2luY2UgQW50IDEuNi4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CisKKzxwPlBlcmZvcm0gYSBDbGVhckNhc2UgPGNvZGU+bWtsYWJlbDwvY29kZT4gb24gdGhlIGZpbGUgPHNhbXA+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvc2FtcD4gdW5kZXIKK3RoZSA8c2FtcD5tYWluPC9zYW1wPiBicmFuY2ggZm9yIHZlcnNpb24gMiAoPHNhbXA+XG1haW5cMjwvc2FtcD4pLiBUZXh0ICZxdW90OzxzYW1wPlNvbWUgY29tbWVudAordGV4dDwvc2FtcD4mcXVvdDsgaXMgYWRkZWQgYXMgYSBjb21tZW50LiBJdCB3aWxsIDxlbT5yZWN1cnNlPC9lbT4gYWxsIHN1YmRpcmVjdG9yaWVzLjwvcD4KIDxwcmU+CiAmbHQ7Y2Nta2xhYmVsIHZpZXdwYXRoPSJjOi92aWV3cy92aWV3ZGlyL2FmaWxlIgotICAgICAgICBjb21tZW50PSJTb21lIGNvbW1lbnQgdGV4dCIKLSAgICAgICAgcmVjdXJzZT0idHJ1ZSIKLSAgICAgICAgdmVyc2lvbj0iXG1haW5cMiIKLSAgICAgICAgdHlwZW5hbWU9IlZFUlNJT05fMSIvJmd0OworICAgICAgICAgICBjb21tZW50PSJTb21lIGNvbW1lbnQgdGV4dCIKKyAgICAgICAgICAgcmVjdXJzZT0idHJ1ZSIKKyAgICAgICAgICAgdmVyc2lvbj0iXG1haW5cMiIKKyAgICAgICAgICAgdHlwZW5hbWU9IlZFUlNJT05fMSIvJmd0OwogPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPm1rbGFiZWw8L2k+IG9uIHRoZSBmaWxlIDxpPmM6L3ZpZXdzL3ZpZXdkaXIvYWZpbGU8L2k+IHVuZGVyCi10aGUgbWFpbiBicmFuY2ggZm9yIHZlcnNpb24gMiAoPGk+XG1haW5cMjwvaT4pLiBUZXh0IDxpPlNvbWUgY29tbWVudCB0ZXh0PC9pPiBpcyBhZGRlZAotYXMgYSBjb21tZW50LiBJdCB3aWxsIDxpPnJlY3Vyc2U8L2k+IGFsbCBzdWJkaXJlY3Rvcmllcy4KIAorPGhyLz4KIAotPGhyPgotPGgyPjxhIG5hbWU9ImNjcm10eXBlIj5DQ1JtdHlwZTwvYT48L2gyPgorPGgyIGlkPSJjY3JtdHlwZSI+Q0NSbXR5cGU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhICJybXR5cGUiIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgcm10eXBlPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnR5cGVraW5kPC90ZD4KICAgICA8dGQ+VGhlIGtpbmQgb2YgdHlwZSB0byBjcmVhdGUuIFZhbGlkIHR5cGVzIGFyZToKLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI0MCUiPgorICAgICAgPHRhYmxlPgogICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHdpZHRoPSIxNSUiPiA8L3RkPgotICAgICAgICAgIDx0ZD48Yj5hdHR5cGU8L2I+PGJyPgotICAgICAgICAgICAgICA8Yj5icnR5cGU8L2I+PGJyPgotICAgICAgICAgICAgICA8Yj5lbHR5cGU8L2I+PGJyPgotICAgICAgICAgICAgICA8Yj5obHR5cGU8L2I+PGJyPgotICAgICAgICAgICAgICA8Yj5sYnR5cGU8L2I+PGJyPgotICAgICAgICAgICAgICA8Yj50cnR5cGU8L2I+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+LSA8YnI+Ci0gICAgICAgICAgICAgIC0gPGJyPgotICAgICAgICAgICAgICAtIDxicj4KLSAgICAgICAgICAgICAgLSA8YnI+Ci0gICAgICAgICAgICAgIC0gPGJyPgotICAgICAgICAgICAgICAtCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+YXR0cmlidXRlIHR5cGU8YnI+Ci0gICAgICAgICAgICAgIGJyYW5jaCB0eXBlPGJyPgotICAgICAgICAgICAgICBlbGVtZW50IHR5cGU8YnI+Ci0gICAgICAgICAgICAgIGh5cGVybGluayB0eXBlPGJyPgotICAgICAgICAgICAgICBsYWJlbCB0eXBlPGJyPgotICAgICAgICAgICAgICB0cmlnZ2VyIHR5cGUKLSAgICAgICAgICA8L3RkPgorICAgICAgICAgIDx0aCBzY29wZT0iY29sIj5LaW5kPC90aD4KKyAgICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgICA8L3RkPgorICAgICAgICA8dHI+CisgICAgICAgICAgPHRkPjxxPmF0dHlwZTwvcT48L3RkPgorICAgICAgICAgIDx0ZD5hdHRyaWJ1dGUgdHlwZTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PHE+YnJ0eXBlPC9xPjwvdGQ+CisgICAgICAgICAgPHRkPmJyYW5jaCB0eXBlPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48cT5lbHR5cGU8L3E+PC90ZD4KKyAgICAgICAgICA8dGQ+ZWxlbWVudCB0eXBlPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48cT5obHR5cGU8L3E+PC90ZD4KKyAgICAgICAgICAgPHRkPmh5cGVybGluayB0eXBlPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0ZD48cT5sYnR5cGU8L3E+PC90ZD4KKyAgICAgICAgICA8dGQ+bGFiZWwgdHlwZTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGQ+PHE+dHJ0eXBlPC9xPjwvdGQ+CisgICAgICAgICAgPHRkPnRyaWdnZXIgdHlwZTwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RhYmxlPjwvdGQ+CiAgICAgPHRkPlllczwvdGQ+Ci0gIDx0cj4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD50eXBlbmFtZTwvdGQ+CiAgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIHJlbW92ZTwvdGQ+CiAgICAgPHRkPlllczwvdGQ+Ci0gIDx0cj4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5pZ25vcmU8L3RkPgotICAgIDx0ZD5Vc2VkIHdpdGggdHJpZ2dlciB0eXBlcyBvbmx5LiBGb3JjZXMgcmVtb3ZhbCBvZiB0cmlnZ2VyIHR5cGUgZXZlbiBpZiBhIHByZS1vcGVyYXRpb24gdHJpZ2dlciB3b3VsZCBwcmV2ZW50IGl0cyByZW1vdmFsPC90ZD4KKyAgICA8dGQ+VXNlZCB3aXRoIHRyaWdnZXIgdHlwZXMgb25seS4gRm9yY2VzIHJlbW92YWwgb2YgdHJpZ2dlciB0eXBlIGV2ZW4gaWYgYSBwcmUtb3BlcmF0aW9uIHRyaWdnZXIKKyAgICB3b3VsZCBwcmV2ZW50IGl0cyByZW1vdmFsPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+cm1hbGw8L3RkPgogICAgIDx0ZD5SZW1vdmVzIGFsbCBpbnN0YW5jZXMgb2YgYSB0eXBlIGFuZCB0aGUgdHlwZSBvYmplY3QgaXRzZWxmPC90ZD4KICAgICA8dGQ+Tm88L3RkPgotICA8dHI+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+Ci0gICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgPHRyPjwvdHI+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudDwvdGQ+CisgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUKLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gIDxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KKworPHA+UGVyZm9ybSBhIENsZWFyQ2FzZSA8Y29kZT5ybXR5cGU8L2NvZGU+IHRvIHJlbW92ZSBhIGxhYmVsIHR5cGUgKDxxPmxidHlwZTwvcT4pCituYW1lZCA8c2FtcD5WRVJTSU9OXzE8L3NhbXA+LiBDb21tZW50IHRleHQgZnJvbSB0aGUgZmlsZSA8c2FtcD5hY29tbWVudC50eHQ8L3NhbXA+IGlzIGFkZGVkIGFzIGEKK2NvbW1lbnQuIEFsbCBpbnN0YW5jZXMgb2YgdGhlIHR5cGUgYXJlIHJlbW92ZWQsIGluY2x1ZGluZyB0aGUgdHlwZSBvYmplY3QgaXRzZWxmLjwvcD4KIDxwcmU+CiAmbHQ7Y2NybXR5cGUgdHlwZWtpbmQ9ImxidHlwZSIKLSAgICAgICAgdHlwZW5hbWU9IlZFUlNJT05fMSIKLSAgICAgICAgY29tbWVudGZpbGU9ImFjb21tZW50LnR4dCIKLSAgICAgICAgcm1hbGw9InRydWUiLyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT5ybXR5cGU8L2k+IHRvIHJlbW92ZSBhIGxhYmVsIHR5cGUgKDxpPmxidHlwZTwvaT4pIG5hbWVkIDxpPlZFUlNJT05fMTwvaT4uCi1Db21tZW50IHRleHQgZnJvbSB0aGUgZmlsZSA8aT5hY29tbWVudC50eHQ8L2k+IGlzIGFkZGVkIGFzIGEgY29tbWVudC4gQWxsIGluc3RhbmNlcyBvZiB0aGUgdHlwZQotYXJlIHJlbW92ZWQsIGluY2x1ZGluZyB0aGUgdHlwZSBvYmplY3QgaXRzZWxmLjwvcD4KLTxocj4KKyAgICAgICAgICB0eXBlbmFtZT0iVkVSU0lPTl8xIgorICAgICAgICAgIGNvbW1lbnRmaWxlPSJhY29tbWVudC50eHQiCisgICAgICAgICAgcm1hbGw9InRydWUiLyZndDs8L3ByZT4KIAotPGgyPjxhIG5hbWU9ImNjbG9jayI+Q0NMb2NrPC9hPjwvaDI+Cis8aHIvPgorCis8aDIgaWQ9ImNjbG9jayI+Q0NMb2NrPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSAiY2xlYXJ0b29sIGxvY2siIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgbG9jazwva2JkPiBjb21tYW5kIHRvIENsZWFyQ2FzZS48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci0gPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgcmVwbGFjaW5nIGFuIGV4aXN0aW5nIGxvY2s8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5udXNlcnM8L3RkPgotICAgICAgPHRkPlNwZWNpZmllcyB1c2VyKHMpIHdobyBjYW4gc3RpbGwgbW9kaWZ5IHRoZSBvYmplY3Q8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5vYnNvbGV0ZTwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIHRoYXQgdGhlIG9iamVjdCBzaG91bGQgYmUgbWFya2VkIG9ic29sZXRlPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIGhvdyB0byBwb3B1bGF0ZSBjb21tZW50cyBmaWVsZHM8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5wbmFtZTwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBvYmplY3QgcGF0aG5hbWUgdG8gYmUgbG9ja2VkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgICAgPHRkPm9ianNlbGVjdDwvdGQ+Ci0gICAgICA8dGQ+VGhpcyB2YXJpYWJsZSBpcyBvYnNvbGV0ZS4gU2hvdWxkIHVzZSA8aT5vYmpzZWw8L2k+IGluc3RlYWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+b2Jqc2VsPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdChzKSB0byBiZSBsb2NrZWQuPGJyPgotICAgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkPmZhaWxvbmVycjwvdGQ+Ci0gICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlLjxicj4KLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVwbGFjZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyByZXBsYWNpbmcgYW4gZXhpc3RpbmcgbG9jazwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KLQotIDwvdGFibGU+Ci08aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci08cHJlPgotJmx0O2NjbG9jawotICAgIG9ianNlbD0ic3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQiIKLSAgICAvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPmxvY2s8L2k+IG9uIHRoZSBvYmplY3QgPGk+c3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQjwvaT4uPC9wPgotPGhyPgotCi08aDI+PGEgbmFtZT0iY2N1bmxvY2siPkNDVW5sb2NrPC9hPjwvaDI+Ci08aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBwZXJmb3JtIGEgImNsZWFydG9vbCB1bmxvY2siIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgotPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgaG93IHRvIHBvcHVsYXRlIGNvbW1lbnRzIGZpZWxkczwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPnBuYW1lPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdCBwYXRobmFtZSB0byBiZSB1bmxvY2tlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgICAgIDx0ZD5vYmpzZWxlY3Q8L3RkPgotICAgICAgPHRkPlRoaXMgdmFyaWFibGUgaXMgb2Jzb2xldGUuIFNob3VsZCB1c2UgPGk+b2Jqc2VsPC9pPiBpbnN0ZWFkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPm9ianNlbDwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBvYmplY3QocykgdG8gYmUgdW5sb2NrZWQuPGJyPgotICAgICAgU2luY2UgYW50IDEuNi4xPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+CiAgIDx0cj4KLSAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLiBEZWZhdWx0IGlzIHRydWUuPGJyPgotICAgIFNpbmNlIGFudCAxLjYuMTwvdGQ+CisgICAgPHRkPm51c2VyczwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB1c2VyKHMpIHdobyBjYW4gc3RpbGwgbW9kaWZ5IHRoZSBvYmplY3Q8L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+Ci0KLSA8L3RhYmxlPgotIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci0mbHQ7Y2N1bmxvY2sKLSAgICBvYmpzZWw9InN0cmVhbTpBcHBsaWNhdGlvbl9JbnRlZ3JhdGlvbkBcTXlQcm9qZWN0X1BWT0IiCi0gICAgLyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIENsZWFyQ2FzZSA8aT51bmxvY2s8L2k+IG9uIHRoZSBvYmplY3QgPGk+c3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQjwvaT4uPC9wPgotPGhyPgotCi08aDI+PGEgbmFtZT0iY2Nta2JsIj5DQ01rYmw8L2E+PC9oMj4KLTxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSAiY2xlYXJ0b29sIG1rYmwiIGNvbW1hbmQgdG8gQ2xlYXJDYXNlLgotPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgIDx0cj4KLSAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICA8dGg+UmVxdWlyZWQ8L3RoPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUKLXVzZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvcgotY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmJhc2VsaW5lcm9vdG5hbWU8L3RkPgotICAgICAgPHRkPlNwZWNpZnkgdGhlIG5hbWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYXNlbGluZS48L3RkPgotICAgICAgPHRkPlllczwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPm5vd2FybjwvdGQ+Ci0gICAgICA8dGQ+U3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlczwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmlkZW50aWNhbDwvdGQ+Ci0gICAgICA8dGQ+QWxsb3dzIHRoZSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZQotcHJldmlvdXMgYmFzZWxpbmUuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmZ1bGw8L3RkPgotICAgICAgPHRkPkNyZWF0ZXMgYSBmdWxsIGJhc2VsaW5lLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ubGFiZWw8L3RkPgotICAgICAgPHRkPkFsbG93cyB0aGUgYmFzZWxpbmUgdG8gYmUgY3JlYXRlZCB3aXRob3V0IGEgbGFiZWwuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgogICA8dHI+Ci0gICAgPHRkPmZhaWxvbmVycjwvdGQ+Ci0gICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlLjxicj4KLSAgICBTaW5jZSBhbnQgMS42LjE8L3RkPgorICAgIDx0ZD5vYnNvbGV0ZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGF0IHRoZSBvYmplY3Qgc2hvdWxkIGJlIG1hcmtlZCBvYnNvbGV0ZTwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KLSA8L3RhYmxlPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgaG93IHRvIHBvcHVsYXRlIGNvbW1lbnRzIGZpZWxkczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wbmFtZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgb2JqZWN0IHBhdGhuYW1lIHRvIGJlIGxvY2tlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b2Jqc2VsZWN0PC90ZD4KKyAgICA8dGQ+PGVtPk9ic29sZXRlPC9lbT4uIFVzZSA8dmFyPm9ianNlbDwvdmFyPiBpbnN0ZWFkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vYmpzZWw8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdChzKSB0byBiZSBsb2NrZWQuPGJyLz48ZW0+U2luY2UgQW50IDEuNi4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLjxici8+PGVtPlNpbmNlIEFudCAxLjYuMTwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLTxwcmU+Ci0mbHQ7Y2Nta2JsCi0gICAgYmFzZWxpbmVyb290bmFtZT0iQXBwbGljYXRpb25fQmFzZWxpbmVfQVVUTyIKLSAgICBpZGVudGljYWw9InllcyIKLSAgICBmdWxsPSJubyIKLSAgICB2aWV3cGF0aD0idjpcQXBwbGljYXRpb25DQyIKLSAgICAvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPm1rYmw8L2k+IG9uIHRoZSBJbnRlZ3JhdGlvbiB2aWV3IGF0IDxpPnY6XEFwcGxpY2F0aW9uQ0M8L2k+Ci1ldmVuIGlmIGl0IGlzIDxpPmlkZW50aWNhbDwvaT4gdG8gYSBwcmV2aW91cyBiYXNlbGluZS4gVGhlIG5ldyBiYXNlbGluZSB3aXRoIGJlCi1pbmNyZW1lbnRhbCBhbmQgbmFtZWQgIkFwcGxpY2F0aW9uX0Jhc2VsaW5lX0FVVE8iLjwvcD4KLTxocj4KIAotPGgyPjxhIG5hbWU9ImNjbWthdHRyIj5DQ01rYXR0cjwvYT48L2gyPgorPHA+UGVyZm9ybSBhIENsZWFyQ2FzZSA8Y29kZT5sb2NrPC9jb2RlPiBvbiB0aGUKK29iamVjdCA8c2FtcD5zdHJlYW06QXBwbGljYXRpb25fSW50ZWdyYXRpb25AXE15UHJvamVjdF9QVk9CPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtjY2xvY2sgb2Jqc2VsPSJzdHJlYW06QXBwbGljYXRpb25fSW50ZWdyYXRpb25AXE15UHJvamVjdF9QVk9CIi8mZ3Q7PC9wcmU+CisKKzxoci8+CisKKzxoMiBpZD0iY2N1bmxvY2siPkNDVW5sb2NrPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSAmcXVvdDtjbGVhcnRvb2wgbWthdHRyJnF1b3Q7IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjxicj4KLVNpbmNlIGFudCAxLjYuMQorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgdW5sb2NrPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICA8dHI+Ci0gICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICA8dGg+VmFsdWVzPC90aD4KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5yZXBsYWNlPC90ZD4KLSAgICAgIDx0ZD5SZXBsYWNlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnJlY3Vyc2U8L3RkPgotICAgICAgPHRkPlByb2Nlc3MgZWFjaCBzdWJkaXJlY3RvcnkgdW5kZXIgdmlld3BhdGg8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmVyc2lvbjwvdGQ+Ci0gICAgICA8dGQ+SWRlbnRpZnkgYSBzcGVjaWZpYyB2ZXJzaW9uIHRvIGF0dGFjaCB0aGUgYXR0cmlidXRlIHRvPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPnR5cGVuYW1lPC90ZD4KLSAgICAgIDx0ZD5OYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZTwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dHlwZXZhbHVlPC90ZD4KLSAgICAgIDx0ZD5WYWx1ZSB0byBhdHRhY2ggdG8gdGhlIGF0dHJpYnV0ZSB0eXBlPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgotICAgICAgPHRkPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5mYWlsb25lcnI8L3RkPgotICAgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy4gRGVmYXVsdCBpcyB0cnVlPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotIDwvdGFibGU+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIGhvdyB0byBwb3B1bGF0ZSBjb21tZW50cyBmaWVsZHM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cG5hbWU8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdCBwYXRobmFtZSB0byBiZSB1bmxvY2tlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b2Jqc2VsZWN0PC90ZD4KKyAgICA8dGQ+PGVtPk9ic29sZXRlPC9lbT4uIFVzZSA8dmFyPm9ianNlbDwvdmFyPiBpbnN0ZWFkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vYmpzZWw8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG9iamVjdChzKSB0byBiZSB1bmxvY2tlZC48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuPGJyLz48ZW0+U2luY2UgQW50IDEuNi4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgorCis8cD5QZXJmb3JtIGEgQ2xlYXJDYXNlIDxjb2RlPnVubG9jazwvY29kZT4gb24gdGhlCitvYmplY3QgPHNhbXA+c3RyZWFtOkFwcGxpY2F0aW9uX0ludGVncmF0aW9uQFxNeVByb2plY3RfUFZPQjwvc2FtcD4uPC9wPgorPHByZT4mbHQ7Y2N1bmxvY2sgb2Jqc2VsPSJzdHJlYW06QXBwbGljYXRpb25fSW50ZWdyYXRpb25AXE15UHJvamVjdF9QVk9CIi8mZ3Q7PC9wcmU+CisKKzxoci8+CisKKzxoMiBpZD0iY2Nta2JsIj5DQ01rYmw8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlRhc2sgdG8gcGVyZm9ybSBhIDxrYmQ+Y2xlYXJ0b29sIG1rYmw8L2tiZD4gY29tbWFuZCB0byBDbGVhckNhc2UuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm87IG9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHVzZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5iYXNlbGluZXJvb3RuYW1lPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhc2VsaW5lLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bm93YXJuPC90ZD4KKyAgICA8dGQ+U3VwcHJlc3Mgd2FybmluZyBtZXNzYWdlczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5pZGVudGljYWw8L3RkPgorICAgIDx0ZD5BbGxvd3MgdGhlIGJhc2VsaW5lIHRvIGJlIGNyZWF0ZWQgZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIGJhc2VsaW5lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mdWxsPC90ZD4KKyAgICA8dGQ+Q3JlYXRlcyBhIGZ1bGwgYmFzZWxpbmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5sYWJlbDwvdGQ+CisgICAgPHRkPkFsbG93cyB0aGUgYmFzZWxpbmUgdG8gYmUgY3JlYXRlZCB3aXRob3V0IGEgbGFiZWwuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5QZXJmb3JtIGEgQ2xlYXJDYXNlIDxjb2RlPm1rYmw8L2NvZGU+IG9uIHRoZSBJbnRlZ3JhdGlvbiB2aWV3IGF0IDxzYW1wPnY6XEFwcGxpY2F0aW9uQ0M8L3NhbXA+CitldmVuIGlmIGl0IGlzIDxlbT5pZGVudGljYWw8L2VtPiB0byBhIHByZXZpb3VzIGJhc2VsaW5lLiBUaGUgbmV3IGJhc2VsaW5lIHdpdGggYmUgaW5jcmVtZW50YWwgYW5kCituYW1lZCA8c2FtcD5BcHBsaWNhdGlvbl9CYXNlbGluZV9BVVRPPC9zYW1wPi48L3A+Cis8cHJlPgorJmx0O2NjbWtibCBiYXNlbGluZXJvb3RuYW1lPSJBcHBsaWNhdGlvbl9CYXNlbGluZV9BVVRPIgorICAgICAgICBpZGVudGljYWw9InllcyIKKyAgICAgICAgZnVsbD0ibm8iCisgICAgICAgIHZpZXdwYXRoPSJ2OlxBcHBsaWNhdGlvbkNDIi8mZ3Q7PC9wcmU+CisKKzxoci8+CisKKzxoMiBpZD0iY2Nta2F0dHIiPkNDTWthdHRyPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UYXNrIHRvIHBlcmZvcm0gYSA8a2JkPmNsZWFydG9vbCBta2F0dHI8L2tiZD4gY29tbWFuZCB0byBDbGVhckNhc2UuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVwbGFjZTwvdGQ+CisgICAgPHRkPlJlcGxhY2UgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaWYgaXQgYWxyZWFkeSBleGlzdHM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVjdXJzZTwvdGQ+CisgICAgPHRkPlByb2Nlc3MgZWFjaCBzdWJkaXJlY3RvcnkgdW5kZXIgPHZhcj52aWV3cGF0aDwvdmFyPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+SWRlbnRpZnkgYSBzcGVjaWZpYyB2ZXJzaW9uIHRvIGF0dGFjaCB0aGUgYXR0cmlidXRlIHRvPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnR5cGVuYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnR5cGV2YWx1ZTwvdGQ+CisgICAgPHRkPlZhbHVlIHRvIGF0dGFjaCB0byB0aGUgYXR0cmlidXRlIHR5cGU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KKyAgICA8dGQ+VGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5QZXJmb3JtIGEgQ2xlYXJDYXNlIDxjb2RlPm1rYXR0cjwvY29kZT4gb24gdGhlIGZpbGUgPHNhbXA+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvc2FtcD4gYW5kCithdHRhY2ggdGhlIGF0dHJpYnV0ZSA8c2FtcD5CdWdGaXg8L3NhbXA+IHdpdGggYSB2YWx1ZSBvZiA8c2FtcD4zNDQ0NTwvc2FtcD4gdG8gaXQuPC9wPgogPHByZT4KICZsdDtjY21rYXR0ciB2aWV3cGF0aD0mcXVvdDtjOi92aWV3cy92aWV3ZGlyL2FmaWxlJnF1b3Q7Ci0gICAgdHlwZW5hbWU9JnF1b3Q7QnVnRml4JnF1b3Q7Ci0gICAgdHlwZXZhbHVlPSZxdW90OzM0NDQ1JnF1b3Q7Ci0gICAgLyZndDsKKyAgICAgICAgICB0eXBlbmFtZT0mcXVvdDtCdWdGaXgmcXVvdDsKKyAgICAgICAgICB0eXBldmFsdWU9JnF1b3Q7MzQ0NDUmcXVvdDsvJmd0OwogPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPm1rYXR0cjwvaT4gb24gdGhlIGZpbGUgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvaT4gYW5kCi1hdHRhY2hlcyB0aGUgYXR0cmlidXRlIDxpPkJ1Z0ZpeDwvaT4gd2l0aCBhIHZhbHVlIG9mIDxpPjM0NDQ1PC9pPiB0byBpdC48L3A+Ci08aHI+CiAKLTxoMj48YSBuYW1lPSJjY21rZGlyIj5DQ01rZGlyPC9hPjwvaDI+Cis8aHIvPgorCis8aDIgaWQ9ImNjbWtkaXIiPkNDTWtkaXI8L2gyPgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMTwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBhICZxdW90O2NsZWFydG9vbCBta2RpciZxdW90OyBjb21tYW5kIHRvIENsZWFyQ2FzZS48YnI+Ci1TaW5jZSBhbnQgMS42LjEKKzxwPlRhc2sgdG8gcGVyZm9ybSBhIDxrYmQ+Y2xlYXJ0b29sIG1rZGlyPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICA8dHI+Ci0gICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICA8dGg+VmFsdWVzPC90aD4KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGRpcmVjdG9yeSB0aGF0IHRoZSBjb21tYW5kIHdpbGwgb3BlcmF0ZSBvbjwvdGQ+Ci0gICAgICA8dGQ+WWVzPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQuIE9ubHkgb25lIG9mIGNvbW1lbnQgb3IgY2ZpbGUgbWF5IGJlIHVzZWQuPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8L3RyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+bm9jaGVja291dDwvdGQ+Ci0gICAgICA8dGQ+RG8gbm90IGNoZWNrb3V0IGFmdGVyIGVsZW1lbnQgY3JlYXRpb248L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSA8L3RhYmxlPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmlld3BhdGg8L3RkPgorICAgIDx0ZD5QYXRoIHRvIHRoZSBDbGVhckNhc2UgdmlldyBkaXJlY3RvcnkgdGhhdCB0aGUgY29tbWFuZCB3aWxsIG9wZXJhdGUgb248L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IGEgY29tbWVudDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk5vOyBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZSB1c2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50ZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bm9jaGVja291dDwvdGQ+CisgICAgPHRkPkRvIG5vdCBjaGVja291dCBhZnRlciBlbGVtZW50IGNyZWF0aW9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycjwvdGQ+CisgICAgPHRkPlRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgorCis8cD5QZXJmb3JtIGEgQ2xlYXJDYXNlIDxjb2RlPm1rZGlyPC9jb2RlPiBvbiB0aGUgZGlyIDxzYW1wPmM6L3ZpZXdzL3ZpZXdkaXIvYWRpcjwvc2FtcD4gYW5kIGRvIG5vdAorYXV0b21hdGljYWxseSBjaGVjayBpdCBvdXQuPC9wPgogPHByZT4KICZsdDtjY21rZGlyIHZpZXdwYXRoPSZxdW90O2M6L3ZpZXdzL3ZpZXdkaXIvYWRpciZxdW90OwotICAgICAgICBub2NoZWNrb3V0PSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgY29tbWVudD0mcXVvdDtTb21lIGNvbW1lbnQgdGV4dCZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkRvZXMgYSBDbGVhckNhc2UgPGk+bWtkaXI8L2k+IG9uIHRoZSBkaXIgPGk+Yzovdmlld3Mvdmlld2Rpci9hZGlyPC9pPiBhbmQKLWRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY2hlY2sgaXQgb3V0LjwvcD4KLTxocj4KKyAgICAgICAgIG5vY2hlY2tvdXQ9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgY29tbWVudD0mcXVvdDtTb21lIGNvbW1lbnQgdGV4dCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxoMj48YSBuYW1lPSJjY21rZWxlbSI+Q0NNa2VsZW08L2E+PC9oMj4KKzxoci8+CisKKzxoMiBpZD0iY2Nta2VsZW0iPkNDTWtlbGVtPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci1UYXNrIHRvIHBlcmZvcm0gYSAmcXVvdDtjbGVhcnRvb2wgbWtlbGVtJnF1b3Q7IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjxicj4KLVNpbmNlIGFudCAxLjYuMQorPHA+VGFzayB0byBwZXJmb3JtIGEgPGtiZD5jbGVhcnRvb2wgbWtlbGVtPC9rYmQ+IGNvbW1hbmQgdG8gQ2xlYXJDYXNlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICA8dHI+Ci0gICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICA8dGg+VmFsdWVzPC90aD4KLSAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgIDwvdHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+dmlld3BhdGg8L3RkPgotICAgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnQ8L3RkPgotICAgICAgPHRkPlNwZWNpZnkgYSBjb21tZW50LiBPbmx5IG9uZSBvZiBjb21tZW50IG9yIGNmaWxlIG1heSBiZSB1c2VkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmNvbW1lbnRmaWxlPC90ZD4KLSAgICAgIDx0ZD5TcGVjaWZ5IGEgZmlsZSBjb250YWluaW5nIGEgY29tbWVudC4gT25seSBvbmUgb2YgY29tbWVudCBvciBjZmlsZSBtYXkgYmUgdXNlZC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ub3dhcm48L3RkPgotICAgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5ub2NoZWNrb3V0PC90ZD4KLSAgICAgIDx0ZD5EbyBub3QgY2hlY2tvdXQgYWZ0ZXIgZWxlbWVudCBjcmVhdGlvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPmNoZWNraW48L3RkPgotICAgICAgPHRkPkNoZWNraW4gZWxlbWVudCBhZnRlciBjcmVhdGlvbjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotICAgPHRyPgotICAgICAgPHRkPnByZXNlcnZldGltZTwvdGQ+Ci0gICAgICA8dGQ+UHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIChmb3IgY2hlY2tpbik8L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDx0cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5tYXN0ZXI8L3RkPgotICAgICAgPHRkPkFzc2lnbiBtYXN0ZXJzaGlwIG9mIHRoZSBtYWluIGJyYW5jaCB0byB0aGUgY3VycmVudCBzaXRlPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZWx0eXBlPC90ZD4KLSAgICAgIDx0ZD5FbGVtZW50IHR5cGUgdG8gdXNlIGR1cmluZyBlbGVtZW50IGNyZWF0aW9uPC90ZD4KLSAgICAgIDx0ZD5ObzwvdGQ+Ci0gICA8dHI+Ci0gICA8dHI+Ci0gICAgICA8dGQ+ZmFpbG9uZXJyPC90ZD4KLSAgICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuIERlZmF1bHQgaXMgdHJ1ZTwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPHRyPgotIDwvdGFibGU+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52aWV3cGF0aDwvdGQ+CisgICAgPHRkPlBhdGggdG8gdGhlIENsZWFyQ2FzZSB2aWV3IGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgdGhlIGNvbW1hbmQgd2lsbCBvcGVyYXRlIG9uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIGNvbW1lbnQ8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5Obzsgb25seSBvbmUgb2YgdGhlIHR3byBtYXkgYmUgdXNlZDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudGZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U3BlY2lmeSBhIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5vd2FybjwvdGQ+CisgICAgPHRkPlN1cHByZXNzIHdhcm5pbmcgbWVzc2FnZXM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bm9jaGVja291dDwvdGQ+CisgICAgPHRkPkRvIG5vdCBjaGVja291dCBhZnRlciBlbGVtZW50IGNyZWF0aW9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNoZWNraW48L3RkPgorICAgIDx0ZD5DaGVja2luIGVsZW1lbnQgYWZ0ZXIgY3JlYXRpb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cHJlc2VydmV0aW1lPC90ZD4KKyAgICA8dGQ+UHJlc2VydmUgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIChmb3IgY2hlY2tpbik8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bWFzdGVyPC90ZD4KKyAgICA8dGQ+QXNzaWduIG1hc3RlcnNoaXAgb2YgdGhlIG1haW4gYnJhbmNoIHRvIHRoZSBjdXJyZW50IHNpdGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZWx0eXBlPC90ZD4KKyAgICA8dGQ+RWxlbWVudCB0eXBlIHRvIHVzZSBkdXJpbmcgZWxlbWVudCBjcmVhdGlvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnI8L3RkPgorICAgIDx0ZD5UaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KKworPHA+UGVyZm9ybSBDbGVhckNhc2UgPGNvZGU+bWtlbGVtPC9jb2RlPiBvbiB0aGUgZmlsZSA8c2FtcD5jOi92aWV3cy92aWV3ZGlyL2FmaWxlPC9zYW1wPiB3aXRoCitlbGVtZW50IHR5cGUgPHNhbXA+dGV4dF9maWxlPC9zYW1wPiwgY2hlY2sgaW4gdGhlIGZpbGUgYWZ0ZXIgY3JlYXRpb24uPC9wPgogPHByZT4KICZsdDtjY21rZWxlbSB2aWV3cGF0aD0mcXVvdDtjOi92aWV3cy92aWV3ZGlyL2FmaWxlJnF1b3Q7Ci0gICAgICAgIGVsdHlwZT0mcXVvdDt0ZXh0X2ZpbGUmcXVvdDsKLSAgICAgICAgY2hlY2tpbj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgIGNvbW1lbnQ9JnF1b3Q7U29tZSBjb21tZW50IHRleHQmcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5Eb2VzIGEgQ2xlYXJDYXNlIDxpPm1rZWxlbTwvaT4gb24gdGhlIGZpbGUgPGk+Yzovdmlld3Mvdmlld2Rpci9hZmlsZTwvaT4gd2l0aAotZWxlbWVudCB0eXBlIDxpPnRleHRfZmlsZTwvaT4uIEl0IGFsc28gY2hlY2tzIGluIHRoZSBmaWxlIGFmdGVyIGNyZWF0aW9uLjwvcD4KKyAgICAgICAgICBlbHR5cGU9JnF1b3Q7dGV4dF9maWxlJnF1b3Q7CisgICAgICAgICAgY2hlY2tpbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgY29tbWVudD0mcXVvdDtTb21lIGNvbW1lbnQgdGV4dCZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jb21tb24uaHRtbCBiL21hbnVhbC9UYXNrcy9jb21tb24uaHRtbAppbmRleCA2ZmEzNDE4Li4xYWQ1ZjYyIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvY29tbW9uLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2NvbW1vbi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNDYgKzE1LDQyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Db21tb248L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphdmFjIj5Db21tb24gQXR0cmlidXRlcyBvZiBhbGwgVGFza3M8L2E+PC9oMj4KKzxoMiBpZD0iamF2YWMiPkNvbW1vbiBBdHRyaWJ1dGVzIG9mIGFsbCBUYXNrczwvaDI+CiA8cD5BbGwgdGFza3Mgc2hhcmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5VbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBjYW4gYmUKKyAgICA8dGQ+aWQ8L3RkPgorICAgIDx0ZD5VbmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCBjYW4gYmUKICAgICAgICB1c2VkIHRvIHJlZmVyZW5jZSB0aGlzIHRhc2sgaW4gc2NyaXB0cy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRhc2tuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZGlmZmVyZW50IG5hbWUgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSAtIHdpbGwKKyAgICA8dGQ+dGFza25hbWU8L3RkPgorICAgIDx0ZD5BIGRpZmZlcmVudCBuYW1lIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UmbWRhc2g7d2lsbAogICAgICAgc2hvdyB1cCBpbiB0aGUgbG9nZ2luZyBvdXRwdXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Sb29tIGZvciB5b3VyIGNvbW1lbnRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGVzY3JpcHRpb248L3RkPgorICAgIDx0ZD5Sb29tIGZvciB5b3VyIGNvbW1lbnRzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotCi0KIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2NvbXBvbmVudGRlZi5odG1sIGIvbWFudWFsL1Rhc2tzL2NvbXBvbmVudGRlZi5odG1sCmluZGV4IGUyOGU2ODEuLjI3ZmQxZjQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jb21wb25lbnRkZWYuaHRtbAorKysgYi9tYW51YWwvVGFza3MvY29tcG9uZW50ZGVmLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0OSArMTUsMzYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkNvbXBvbmVudGRlZiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJjb21wb25lbnRkZWYiPmNvbXBvbmVudGRlZjwvYT48L2gyPgorPGgyIGlkPSJjb21wb25lbnRkZWYiPmNvbXBvbmVudGRlZjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotICA8cD4KLSAgICBBZGRzIGEgY29tcG9uZW50IGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgICBBIGNvbXBvbmVudCBkZWZpbml0aW9uIGlzIHRoZSBzYW1lIGFzIGEKLSAgICA8YSBocmVmPSJ0eXBlZGVmLmh0bWwiPnR5cGVkZWY8L2E+IGV4Y2VwdDoKLSAgPC9wPgotICAgIDxvbD4KLSAgICAgIDxsaT4KLSAgICAgICAgdGhhdCBpdCBjYW4gb25seSBiZSB1c2VkIGluIG90aGVyIHR5cGVzIG9yIHRhc2tzIHRoYXQKLSAgICAgICAgYWNjZXB0IGNvbXBvbmVudHMgKGJ5IGhhdmluZyBhbiA8aT5hZGQoKTwvaT4gbWV0aG9kKS4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIG11bHRpcGxlIGNvbXBvbmVudHMgbWF5IGhhdmUgdGhlIHNhbWUgbmFtZSwgcHJvdmlkZWQgdGhleQotICAgICAgICBpbXBsZW1lbnQgZGlmZmVyZW50IGludGVyZmFjZXMuCi0gICAgICA8L2xpPgotICAgIDwvb2w+Ci0gIDxwPgotICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gYWxsb3cgaW50ZXJuYWwgQXBhY2hlIEFudCBkZWZpbml0aW9ucyB0byBiZQotICAgIG1hZGUgZm9yIHRhZ3MgbGlrZSAiYW5kIiBvciAib3IiLgotICA8L3A+Cis8cD5BZGRzIGEgY29tcG9uZW50IGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4gIEEgY29tcG9uZW50IGRlZmluaXRpb24gaXMgdGhlIHNhbWUgYXMKK2EgPGEgaHJlZj0idHlwZWRlZi5odG1sIj50eXBlZGVmPC9hPiBleGNlcHQ6PC9wPgorPG9sPgorICA8bGk+dGhhdCBpdCBjYW4gb25seSBiZSB1c2VkIGluIG90aGVyIHR5cGVzIG9yIHRhc2tzIHRoYXQgYWNjZXB0IGNvbXBvbmVudHMgKGJ5IGhhdmluZworICAgIGFuIDxjb2RlPmFkZCgpPC9jb2RlPiBtZXRob2QpLjwvbGk+CisgIDxsaT5tdWx0aXBsZSBjb21wb25lbnRzIG1heSBoYXZlIHRoZSBzYW1lIG5hbWUsIHByb3ZpZGVkIHRoZXkgaW1wbGVtZW50IGRpZmZlcmVudCBpbnRlcmZhY2VzLjwvbGk+Cis8L29sPgorPHA+VGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBpbnRlcm5hbCBBcGFjaGUgQW50IGRlZmluaXRpb25zIHRvIGJlIG1hZGUgZm9yIHRhZ3MKK2xpa2UgPHNhbXA+YW5kPC9zYW1wPiBvciA8c2FtcD5vcjwvc2FtcD4uPC9wPgogCi0gIDxoMz5FeGFtcGxlczwvaDM+Cis8aDM+RXhhbXBsZXM8L2gzPgogCi08cHJlPiAmbHQ7Y29tcG9uZW50ZGVmIG5hbWU9Im9yIiBvbmVycm9yPSJpZ25vcmUiCi0gICAgY2xhc3NuYW1lPSJjb20uYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb25zLk9yIi8mZ3Q7Ci0gICZsdDtjb21wb25lbnRkZWYgbmFtZT0ib3IiIG9uZXJyb3I9Imlnbm9yZSIKLSAgICBjbGFzc25hbWU9ImNvbS5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuT3IiLyZndDs8L3ByZT4KLSAgPHA+Ci0gICAgZGVmaW5lcyB0d28gY29tcG9uZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgIm9yIjsgb25lIGlzIGEgY29uZGl0aW9uCi0gICAgKHNlZSA8YSBocmVmPSJjb25kaXRpb25zLmh0bWwiPmNvbmRpdGlvbnM8L2E+KSBhbmQgb25lIGlzIAotICAgIGEgc2VsZWN0b3IgKHNlZSA8YSBocmVmPSIuLi9UeXBlcy9zZWxlY3RvcnMuaHRtbCI+c2VsZWN0b3JzPC9hPikuCi0gIDwvcD4KKzxwPkRlZmluZSB0d28gY29tcG9uZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgPHNhbXA+b3I8L3NhbXA+OyBvbmUgaXMgYQorY29uZGl0aW9uIChzZWUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5jb25kaXRpb25zPC9hPikgYW5kIG9uZSBpcyBhCitzZWxlY3RvciAoc2VlIDxhIGhyZWY9Ii4uL1R5cGVzL3NlbGVjdG9ycy5odG1sIj5zZWxlY3RvcnM8L2E+KS48L3A+Cis8cHJlPgorJmx0O2NvbXBvbmVudGRlZiBuYW1lPSJvciIgb25lcnJvcj0iaWdub3JlIgorICAgICAgICAgICAgICBjbGFzc25hbWU9ImNvbS5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbnMuT3IiLyZndDsKKyZsdDtjb21wb25lbnRkZWYgbmFtZT0ib3IiIG9uZXJyb3I9Imlnbm9yZSIKKyAgICAgICAgICAgICAgY2xhc3NuYW1lPSJjb20uYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLk9yIi8mZ3Q7PC9wcmU+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jb25jYXQuaHRtbCBiL21hbnVhbC9UYXNrcy9jb25jYXQuaHRtbAppbmRleCAxMTM3MmQwLi41MTM3OTdjIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvY29uY2F0Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2NvbmNhdC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzI0ICsxNSwyMzcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgotICAgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KLTx0aXRsZT5Db25jYXQ8L3RpdGxlPgotICAgIDwvaGVhZD4KKyAgPGhlYWQ+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgICA8dGl0bGU+Q29uY2F0PC90aXRsZT4KKyAgPC9oZWFkPgogCi0gICAgPGJvZHk+CisgIDxib2R5PgogCi0gICAgICA8aDI+PGEgbmFtZT0iQ29uY2F0Ij5Db25jYXQ8L2E+PC9oMj4KKyAgICA8aDIgaWQ9ImNvbmNhdCI+Q29uY2F0PC9oMj4KIAotICAgICAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KKyAgICA8aDM+RGVzY3JpcHRpb248L2gzPgogCi0gICAgICA8cD4KLSAgICAgICAgQ29uY2F0ZW5hdGVzIG9uZSBvciBtb3JlIAotICAgICAgICA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+cwotICAgICAgICB0byBhIHNpbmdsZSBmaWxlIG9yIHRvIHRoZSBjb25zb2xlLiBUaGUgZGVzdGluYXRpb24KLSAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QgdW5sZXNzIHRoZSByZXNvdXJjZQotICAgICAgICBsaXN0IGlzIGVtcHR5IGFuZCBpZ25vcmVlbXB0eSBpcyB0cnVlLgotICAgICAgPC9wPgorICAgIDxwPkNvbmNhdGVuYXRlcyBvbmUgb3IgbW9yZSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+cyB0byBhIHNpbmdsZSBmaWxlIG9yCisgICAgICB0byB0aGUgY29uc29sZS4gVGhlIGRlc3RpbmF0aW9uIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0IHVubGVzcyB0aGUgcmVzb3VyY2UKKyAgICAgIGxpc3QgaXMgZW1wdHkgYW5kIDx2YXI+aWdub3JlZW1wdHk8L3Zhcj4gaXMgPHE+dHJ1ZTwvcT4uPC9wPgogCi0gICAgICA8cD48c3Ryb25nPlNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L3N0cm9uZz4sIHRoaXMgdGFzayBjYW4gYmUgdXNlZCBhcyBhCi0gICAgICAgIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+Ci0gICAgICAgIHRoYXQgd2lsbCByZXR1cm4gZXhhY3RseSBvbmUgCi0gICAgICAgIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4uCi0gICAgICA8L3A+CisgICAgPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L2VtPiwgdGhpcyB0YXNrIGNhbiBiZSB1c2VkIGFzCisgICAgICBhIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+IHRoYXQgd2lsbCByZXR1cm4KKyAgICAgIGV4YWN0bHkgb25lIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4uPC9wPgogCi0gICAgICA8cD4KLSAgICAgICAgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+Ci1SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8KLSAgICAgICAgc2VsZWN0IHdoaWNoIHJlc291cmNlcyBhcmUgdG8gYmUgY29uY2F0ZW5hdGVkLiBUaGVyZSBpcyBubwotICAgICAgICBzaW5ndWxhciBhdHRyaWJ1dGUgdG8gc3BlY2lmeSBhIHNpbmdsZSByZXNvdXJjZSB0byBjYXQuCi0gICAgICA8L3A+CisgICAgPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdAorICAgICAgd2hpY2ggcmVzb3VyY2VzIGFyZSB0byBiZSBjb25jYXRlbmF0ZWQuIFRoZXJlIGlzIG5vIHNpbmd1bGFyIGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGEgc2luZ2xlCisgICAgICByZXNvdXJjZSB0byA8Y29kZT5jb25jYXQ8L2NvZGU+LjwvcD4KIAotICAgICAgPGgzPlBhcmFtZXRlcnM8L2gzPgorICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KIAotICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgorICAgICAgPHRyPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgZGVzdGluYXRpb24gZmlsZSBmb3IgdGhlIGNvbmNhdGVuYXRlZCBzdHJlYW0uICBJZiBub3Qgc3BlY2lmaWVkIHRoZSBjb25zb2xlIHdpbGwgYmUKKyAgICAgICAgICB1c2VkIGluc3RlYWQuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5hcHBlbmQ8L3RkPgorICAgICAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHNwZWNpZmllZCBieSA8dmFyPmRlc3RmaWxlPC92YXI+IHNob3VsZCBiZQorICAgICAgICAgIGFwcGVuZGVkLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IDx2YXI+ZGVzdGZpbGU8L3Zhcj4gc2hvdWxkIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgICBldmVuIGlmIGl0IGlzIG5ld2VyIHRoYW4gYWxsIHNvdXJjZSBmaWxlcy4gPGVtPjx1PkRlcHJlY2F0ZWQ8L3U+LCB1c2UKKyAgICAgICAgICB0aGUgPHZhcj5vdmVyd3JpdGU8L3Zhcj4gYXR0cmlidXRlIGluc3RlYWQuPC9lbT48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPm92ZXJ3cml0ZTwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IDx2YXI+ZGVzdGZpbGU8L3Zhcj4gc2hvdWxkIGJlIHdyaXR0ZW4gdG8KKyAgICAgICAgICBldmVuIGlmIGl0IGlzIG5ld2VyIHRoYW4gYWxsIHNvdXJjZSBmaWxlcy4gIDxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPi48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmZvcmNlUmVhZE9ubHk8L3RkPgorICAgICAgICA8dGQ+T3ZlcndyaXRlIHJlYWQtb25seSBkZXN0aW5hdGlvbiBmaWxlcy4gIDxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIGVuY29kaW5nIGZvciB0aGUgaW5wdXQgZmlsZXMuIFBsZWFzZQorICAgICAgICAgIHNlZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCIKKyAgICAgICAgICB0YXJnZXQ9Il90b3AiPlN1cHBvcnRlZCBFbmNvZGluZ3M8L2E+IGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5vdXRwdXRlbmNvZGluZzwvdGQ+CisgICAgICAgIDx0ZD5UaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0aGUgb3V0cHV0IGZpbGUuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHZhcj5lbmNvZGluZzwvdmFyPiBpZiBzZXQgb3IgZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICAgICAgb3RoZXJ3aXNlPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5maXhsYXN0bGluZTwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gY2hlY2sgaWYgZWFjaCBmaWxlIGNvbmNhdGVuYXRlZCBpcyB0ZXJtaW5hdGVkIGJ5IGEgbmV3CisgICAgICAgICAgbGluZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgPHE+eWVzPC9xPiBhIG5ldyBsaW5lIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHN0cmVhbSBpZiB0aGUKKyAgICAgICAgICBmaWxlIGRpZCBub3QgZW5kIGluIGEgbmV3IGxpbmUuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LiAgVGhpcyBhdHRyaWJ1dGUgZG9lcyBub3QgYXBwbHkgdG8KKyAgICAgICAgICBlbWJlZGRlZCB0ZXh0LjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5lb2w8L3RkPgorICAgICAgICA8dGQ+U3BlY2lmaWVzIHdoYXQgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3RlciBhcmUgZm9yIHVzZSBieSB0aGUgZml4bGFzdGxpbmUKKyAgICAgICAgICBhdHRyaWJ1dGUuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+IFZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxxPmNyPC9xPjogYSBzaW5nbGUgQ1I8L2xpPgorICAgICAgICAgICAgPGxpPjxxPmxmPC9xPjogYSBzaW5nbGUgTEY8L2xpPgorICAgICAgICAgICAgPGxpPjxxPmNybGY8L3E+OiB0aGUgcGFpciBDUkxGPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5tYWM8L3E+OiBhIHNpbmdsZSBDUjwvbGk+CisgICAgICAgICAgICA8bGk+PHE+dW5peDwvcT46IGEgc2luZ2xlIExGPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5kb3M8L3E+OiB0aGUgcGFpciBDUkxGPC9saT4KKyAgICAgICAgICA8L3VsPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQ6IDxxPmxmPC9xPiBmb3IgVW5peCwgPHE+Y3JsZjwvcT4gZm9yIERPUyBmYW1pbHkKKyAgICAgICAgKGluY2x1ZGluZyBXaW5kb3dzKSwgPHE+Y3I8L3E+IGZvciBNYWMgT1MgOSBvciBlYXJsaWVyPC90ZD48L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+YmluYXJ5PC90ZD4KKyAgICAgICAgPHRkPjxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4sIHRoZSB0YXNrIGNvbmNhdGVuYXRlcworICAgICAgICAgIHRoZSBmaWxlcyBpbiBhIGJ5dGUgYnkgYnl0ZSBmYXNoaW9uLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyA8cT5mYWxzZTwvcT4sIGNvbmNhdCB3aWxsIG5vdAorICAgICAgICAgIG5vcm1hbGx5IHdvcmsgZm9yIGJpbmFyeSBmaWxlcyBkdWUgdG8gY2hhcmFjdGVyIGVuY29kaW5nIGlzc3Vlcy4gIElmIHRoaXMgb3B0aW9uIGlzIHNldAorICAgICAgICAgIHRvIDxxPnRydWU8L3E+LCB0aGUgPHZhcj5kZXN0ZmlsZTwvdmFyPiBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQsIGFuZCB0aGUgdGFzayBjYW5ub3QgdXNlZAorICAgICAgICAgIG5lc3RlZCB0ZXh0LiAgQWxzbyB0aGUKKyAgICAgICAgICBhdHRyaWJ1dGVzIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4sIDx2YXI+b3V0cHV0ZW5jb2Rpbmc8L3Zhcj4sIDx2YXI+ZmlsZWxhc3RsaW5lPC92YXI+IGNhbm5vdAorICAgICAgICAgIGJlIHVzZWQuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+aWdub3JlZW1wdHk8L3RkPgorICAgICAgICA8dGQ+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+IFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBzcGVjaWZpZWQKKyAgICAgICAgICBieSA8dmFyPmRlc3RmaWxlPC92YXI+IHNob3VsZCBiZSBjcmVhdGVkIGlmIHRoZSBzb3VyY2UgcmVzb3VyY2UgbGlzdCBpcyBlbXB0eS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+cmVzb3VyY2VuYW1lPC90ZD4KKyAgICAgICAgPHRkPjxlbT5TaW5jZSBBbnQgMS44LjM8L2VtPiBTcGVjaWZpZXMgdGhlIG5hbWUgcmVwb3J0ZWQgaWYgdGhpcyB0YXNrIGlzIGV4cG9zZWQgYXMKKyAgICAgICAgICBhIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4uCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CiAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICAgICAgPC90cj4KKyAgICA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKyAgICA8aDQ+cmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+CisgICAgPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPi48L3A+CiAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gZmlsZSBmb3IgdGhlIGNvbmNhdGVuYXRlZCBzdHJlYW0uCi0gICAgICAgIElmIG5vdCBzcGVjaWZpZWQgdGhlIGNvbnNvbGUgd2lsbCBiZSB1c2VkIGluc3RlYWQuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPgotICAgICAgICAgICAgTm8KLSAgICAgICAgICA8L3RkPgotICAgICAgICA8L3RyPgorICAgIDxwPkFueSBvZiB0aGUgdmFyaW91cyA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uPC9hPiB0eXBlcworICAgICAgY2FuIHNwZWNpZnkgdGhlIHJlc291cmNlcyB0byBiZSBjb25jYXRlbmF0ZWQuPC9wPgogCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgJ2Rlc3RmaWxlJwotICAgICAgICAgICAgc2hvdWxkIGJlIGFwcGVuZGVkLiBEZWZhdWx0cyB0byAmcXVvdDtubyZxdW90Oy4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgJ2Rlc3RmaWxlJwotICAgICAgICAgICAgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gZXZlbiBpZiBpdCBpcyBuZXdlciB0aGFuIGFsbCBzb3VyY2UgZmlsZXMuCi0gICAgICAgICAgICA8c3Ryb25nPmRlcHJlY2F0ZWQsIHVzZSB0aGUgb3ZlcndyaXRlIGF0dHJpYnV0ZSBpbnN0ZWFkPC9zdHJvbmc+Ci0gICAgICAgICAgICBEZWZhdWx0cyB0byAmcXVvdDt5ZXMmcXVvdDsuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHNwZWNpZmllZCBieSAnZGVzdGZpbGUnCi0gICAgICAgICAgICBzaG91bGQgYmUgd3JpdHRlbiB0byBldmVuIGlmIGl0IGlzIG5ld2VyIHRoYW4gYWxsIHNvdXJjZSBmaWxlcy4KLSAgICAgICAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjI8L2VtPi4KLSAgICAgICAgICAgIERlZmF1bHRzIHRvICZxdW90O3llcyZxdW90Oy4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgorICAgIDxoND5maWx0ZXJjaGFpbjwvaDQ+CisgICAgPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisgICAgPHA+VGhlIHRhc2sgc3VwcG9ydHMgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPnMuPC9wPgogCi0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlUmVhZE9ubHk8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcndyaXRlIHJlYWQtb25seSBkZXN0aW5hdGlvbgotICAgICAgICAgICAgZmlsZXMuICA8ZW0+c2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+Ci0gICAgICAgIDwvdHI+CisgICAgPGg0PmhlYWRlciwgZm9vdGVyPC9oND4KKyAgICA8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKyAgICA8cD5Vc2VkIHRvIHByZXBlbmQgb3IgcG9zdHBlbmQgdGV4dCBpbnRvIHRoZSBjb25jYXRlbmF0ZWQgc3RyZWFtLjwvcD4KKyAgICA8cD5UaGUgdGV4dCBtYXkgYmUgaW4tbGluZSBvciBiZSBpbiBhIGZpbGUuPC9wPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CisgICAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmZpbHRlcmluZzwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIGZpbHRlciB0aGUgdGV4dCBwcm92aWRlZCBieSB0aGlzIHN1YiBlbGVtZW50LjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT55ZXM8L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgICAgPHRkPkEgZmlsZSB0byBwbGFjZSBhdCB0aGUgaGVhZCBvciB0YWlsIG9mIHRoZSBjb25jYXRlbmF0ZWQgdGV4dC48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPnRyaW08L3RkPgorICAgICAgICA8dGQ+V2hldGhlciB0byB0cmltIHRoZSB2YWx1ZS48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bm88L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD50cmltbGVhZGluZzwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIHRyaW0gbGVhZGluZyB3aGl0ZSBzcGFjZSBvbiBlYWNoIGxpbmUuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5vPC9xPjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CiAKLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIGZvciB0aGUgaW5wdXQgZmlsZXMuIFBsZWFzZSBzZWUgPGEKLSAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPgotICAgICAgICAgICAgU3VwcG9ydGVkIEVuY29kaW5nczwvYT4KLSAgICAgICAgICAgIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncwotICAgICAgICAgICAgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZW5jb2Rpbmc8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0aGUgb3V0cHV0IGZpbGUKLSAgICAgICAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uCi0gICAgICAgICAgICBEZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZQotICAgICAgICAgICAgaWYgZ2l2ZW4gb3IgdGhlIGRlZmF1bHQgSlZNIGVuY29kaW5nIG90aGVyd2lzZS4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maXhsYXN0bGluZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGNoZWNrIGlmCi0gICAgICAgICAgICBlYWNoIGZpbGUgY29uY2F0ZW5hdGVkIGlzIHRlcm1pbmF0ZWQgYnkKLSAgICAgICAgICAgIGEgbmV3IGxpbmUuIElmIHRoaXMgYXR0cmlidXRlIGlzICZxdW90O3llcyZxdW90OwotICAgICAgICAgICAgYSBuZXcgbGluZSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBzdHJlYW0gaWYKLSAgICAgICAgICAgIHRoZSBmaWxlIGRpZCBub3QgZW5kIGluIGEgbmV3IGxpbmUuCi0gICAgICAgICAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LgotICAgICAgICAgICAgRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuCi0gICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBkb2VzIG5vdCBhcHBseSB0byBlbWJlZGRlZCB0ZXh0LgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmVvbDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGF0IHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgYXJlCi0gICAgICAgICAgICBmb3IgdXNlIGJ5IHRoZSBmaXhsYXN0bGluZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+Ci0gICAgICAgICAgICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+Y3I6IGEgc2luZ2xlIENSPC9saT4KLSAgICAgICAgICAgICAgPGxpPmxmOiBhIHNpbmdsZSBMRjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT5jcmxmOiB0aGUgcGFpciBDUkxGPC9saT4KLSAgICAgICAgICAgICAgPGxpPm1hYzogYSBzaW5nbGUgQ1I8L2xpPgotICAgICAgICAgICAgICA8bGk+dW5peDogYSBzaW5nbGUgTEY8L2xpPgotICAgICAgICAgICAgICA8bGk+ZG9zOiB0aGUgcGFpciBDUkxGPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQuCi0gICAgICAgICAgICBGb3IgVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGlzICZxdW90O2xmJnF1b3Q7LgotICAgICAgICAgICAgRm9yIERPUyBiYXNlZCBzeXN0ZW1zIChpbmNsdWRpbmcgV2luZG93cyksCi0gICAgICAgICAgICB0aGUgZGVmYXVsdCBpcyAmcXVvdDtjcmxmJnF1b3Q7LgotICAgICAgICAgICAgRm9yIE1hYyBPUywgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7Y3ImcXVvdDsuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+YmluYXJ5PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+Ci0gICAgICAgICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHRhc2sgY29uY2F0ZW5hdGVzIHRoZSBmaWxlcwotICAgICAgICAgICAgaW4gYSBieXRlIGJ5IGJ5dGUgZmFzaGlvbi4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgZmFsc2UsIGNvbmNhdCB3aWxsCi0gICAgICAgICAgICBub3Qgbm9ybWFsbHkgd29yayBmb3IgYmluYXJ5IGZpbGVzIGR1ZSB0byBjaGFyYWN0ZXIgZW5jb2RpbmcKLSAgICAgICAgICAgIGlzc3Vlcy4KLSAgICAgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byB0cnVlLCB0aGUgZGVzdGZpbGUgYXR0cmlidXRlIG11c3QgYmUKLSAgICAgICAgICAgIHNldCwgYW5kIHRoZSB0YXNrIGNhbm5vdCB1c2VkIG5lc3RlZCB0ZXh0LgotICAgICAgICAgICAgQWxzbyB0aGUgYXR0cmlidXRlcyBlbmNvZGluZywgb3V0cHV0ZW5jb2RpbmcsIGZpbGVsYXN0bGluZQotICAgICAgICAgICAgY2Fubm90IGJlIHVzZWQuCi0gICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVlbXB0eTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4KLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgZmlsZSBzcGVjaWZpZWQgYnkgJ2Rlc3RmaWxlJwotICAgICAgICAgICAgc2hvdWxkIGJlIGNyZWF0ZWQgaWYgdGhlIHNvdXJjZSByZXNvdXJjZSBsaXN0IGlzCi0gICAgICAgICAgICBlbXB0eS4gRGVmYXVsdHMgdG8gJnF1b3Q7dHJ1ZSZxdW90Oy4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZW5hbWU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgPGVtPlNpbmNlIEFudCAxLjguMzwvZW0+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgcmVwb3J0ZWQgaWYgdGhpcyB0YXNrIGlzIGV4cG9zZWQKLSAgICAgICAgICAgIGFzIGEgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPi4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgorICAgIDxoMz5FeGFtcGxlczwvaDM+CiAKLSAgICAgIDwvdGFibGU+CisgICAgPHA+Q29uY2F0ZW5hdGUgYSBzdHJpbmcgdG8gYSBmaWxlOjwvcD4KKyAgICA8cHJlPiZsdDtjb25jYXQgZGVzdGZpbGU9JnF1b3Q7UkVBRE1FJnF1b3Q7Jmd0O0hlbGxvLCBXb3JsZCEmbHQ7L2NvbmNhdCZndDs8L3ByZT4KIAotICAgICAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci0gICAgICAgIDxoND5SZXNvdXJjZSBDb2xsZWN0aW9uPC9oND4KLSAgICAgICAgPHA+PGVtPnNpbmNlIEFudCAxLjc8L2VtPi48L3A+CisgICAgPHA+Q29uY2F0ZW5hdGUgYSBzZXJpZXMgb2YgZmlsZXMgdG8gdGhlIGNvbnNvbGU6PC9wPgorICAgIDxwcmU+CismbHQ7Y29uY2F0Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7bWVzc2FnZXMmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KmltcG9ydGFudComcXVvdDsvJmd0OworJmx0Oy9jb25jYXQmZ3Q7PC9wcmU+CiAKLSAgICAgIDxwPgotICAgICAgICBBbnkgb2YgdGhlIHZhcmlvdXMgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+Ci0gICAgICAgIFJlc291cmNlIENvbGxlY3Rpb248L2E+IHR5cGVzIGNhbiBzcGVjaWZ5IHRoZSByZXNvdXJjZXMgdG8gYmUKLSAgICAgICAgY29uY2F0ZW5hdGVkLgotICAgICAgPC9wPgorICAgIDxwPkNvbmNhdGVuYXRlIGEgc2luZ2xlIGZpbGUsIGFwcGVuZGluZyBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBleGlzdHM6PC9wPgorICAgIDxwcmU+CismbHQ7Y29uY2F0IGRlc3RmaWxlPSZxdW90O05PVEVTJnF1b3Q7IGFwcGVuZD0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZWxpc3QgZGlyPSZxdW90O25vdGVzJnF1b3Q7IGZpbGVzPSZxdW90O25vdGUudHh0JnF1b3Q7LyZndDsKKyZsdDsvY29uY2F0Jmd0OzwvcHJlPgogCi0gICAgICA8aDQ+ZmlsdGVyY2hhaW48L2g0PgotICAgICAgICA8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KLSAgICAgIDxwPlRoZSBjb25jYXQgdGFzayBzdXBwb3J0cyBuZXN0ZWQKLSAgICAgICAgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+IEZpbHRlckNoYWluPC9hPnMuPC9wPgorICAgIDxwPkNvbmNhdGVuYXRlIGEgc2VyaWVzIG9mIGZpbGVzLCB1cGRhdGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUgb25seSBpZiBpcyBvbGRlciB0aGF0IGFsbCB0aGUKKyAgICAgIHNvdXJjZSBmaWxlczo8L3A+CisgICAgPHByZT4KKyZsdDtjb25jYXQgZGVzdGZpbGU9JnF1b3Q7JHtkb2Nib29rLmRpcn0vYWxsLXNlY3Rpb25zLnhtbCZxdW90OworICAgICAgICBmb3JjZT0mcXVvdDtubyZxdW90OyZndDsKKyAgJmx0O2ZpbGVsaXN0IGRpcj0mcXVvdDske2RvY2Jvb2suZGlyfS9zZWN0aW9ucyZxdW90OworICAgICAgICAgICAgZmlsZXM9JnF1b3Q7aW50cm9kdWN0aW9uLnhtbCxvdmVydmlldy54bWwmcXVvdDsvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkb2Nib29rLmRpcn0mcXVvdDsKKyAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7c2VjdGlvbnMvKi54bWwmcXVvdDsKKyAgICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7aW50cm9kdWN0aW9uLnhtbCxvdmVydmlldy54bWwmcXVvdDsvJmd0OworJmx0Oy9jb25jYXQmZ3Q7PC9wcmU+CiAKLSAgICAgIDxoND5oZWFkZXIsIGZvb3RlcjwvaDQ+Ci0gICAgICAgIDxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgotICAgICAgPHA+VXNlZCB0byBwcmVwZW5kIG9yIHBvc3RwZW5kIHRleHQgaW50byB0aGUgY29uY2F0ZW5hdGVkIHN0cmVhbS48L3A+Ci0gICAgICA8cD5UaGUgdGV4dCBtYXkgYmUgaW4tbGluZSBvciBiZSBpbiBhIGZpbGUuPC9wPgotICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgV2hldGhlciB0byBmaWx0ZXIgdGhlIHRleHQgcHJvdmlkZWQgYnkgdGhpcyBzdWIgZWxlbWVudCwKLSAgICAgICAgICAgIGRlZmF1bHQgaXMgInllcyIuCi0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbiA9ICJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgdG8gcGxhY2UgYXQgdGhlIGhlYWQgb3IgdGFpbCBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRlZCB0ZXh0LgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ24gPSAiY2VudGVyIj5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRyaW08L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byB0cmltIHRoZSB2YWx1ZSwgZGVmYXVsdCBpcyAibm8iPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduID0gImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50cmltbGVhZGluZzwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIFdoZXRoZXIgdG8gdHJpbSBsZWFkaW5nIHdoaXRlIHNwYWNlIG9uIGVhY2ggbGluZSwgZGVmYXVsdCBpcyAibm8iCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduID0gImNlbnRlciI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KKyAgICA8cD5Db25jYXRlbmF0ZSBhIHNlcmllcyBvZiBmaWxlcywgZXhwYW5kaW5nIEFudCBwcm9wZXJ0aWVzLjwvcD4KKyAgICA8cHJlPgorJmx0O2NvbmNhdCBkZXN0ZmlsZT0iJHtidWlsZC5kaXJ9L3N1YnMiJmd0OworICAmbHQ7cGF0aCZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqLnhtbCIvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQueG1sIi8mZ3Q7CisgICZsdDsvcGF0aCZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDtleHBhbmRwcm9wZXJ0aWVzLyZndDsKKyAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvY29uY2F0Jmd0OzwvcHJlPgogCi0gICAgICA8aDM+RXhhbXBsZXM8L2gzPgorICAgIDxwPkZpbHRlciB0aGUgbGluZXMgY29udGFpbmluZyBwcm9qZWN0IGZyb20gPHNhbXA+YnVpbGQueG1sPC9zYW1wPiBhbmQgb3V0cHV0IHRoZW0KKyAgICAgIHRvIDxzYW1wPnJlcG9ydC5vdXRwdXQ8L3NhbXA+LCBwcmVwZW5kaW5nIHdpdGggYSBoZWFkZXIuPC9wPgorICAgIDxwcmU+CismbHQ7Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vcmVwb3J0Lm91dHB1dCImZ3Q7CisgICZsdDtoZWFkZXIgZmlsdGVyaW5nPSJubyIgdHJpbWxlYWRpbmc9InllcyImZ3Q7CisgICAgICBMaW5lcyB0aGF0IGNvbnRhaW4gcHJvamVjdAorICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgJmx0Oy9oZWFkZXImZ3Q7CisgICZsdDtwYXRoIHBhdGg9ImJ1aWxkLnhtbCIvJmd0OworICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgJmx0O2xpbmVjb250YWlucyZndDsKKyAgICAgICZsdDtjb250YWlucyB2YWx1ZT0icHJvamVjdCIvJmd0OworICAgICZsdDsvbGluZWNvbnRhaW5zJmd0OworICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9jb25jYXQmZ3Q7PC9wcmU+CiAKLSAgICAgIDxwPjxiPkNvbmNhdGVuYXRlIGEgc3RyaW5nIHRvIGEgZmlsZTo8L2I+PC9wPgorICAgIDxwPkNvbmNhdGVuYXRlIGEgbnVtYmVyIG9mIGJpbmFyeSBmaWxlcy48L3A+CisgICAgPHByZT4KKyZsdDtjb25jYXQgZGVzdGZpbGU9IiR7YnVpbGQuZGlyfS9kaXN0LmJpbiIgYmluYXJ5PSJ5ZXMiJmd0OworICAmbHQ7ZmlsZXNldCBmaWxlPSIke3NyYy5kaXJ9L3NjcmlwdHMvZGlzdC5zaCIvJmd0OworICAmbHQ7ZmlsZXNldCBmaWxlPSIke2J1aWxkLmRpcn0vZGlzdC50YXIuYnoyIi8mZ3Q7CismbHQ7L2NvbmNhdCZndDs8L3ByZT4KIAotICAgICAgPHByZT4KLSAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0mcXVvdDtSRUFETUUmcXVvdDsmZ3Q7SGVsbG8sIFdvcmxkISZsdDsvY29uY2F0Jmd0OwotICAgICAgPC9wcmU+Ci0KLSAgICAgIDxwPjxiPkNvbmNhdGVuYXRlIGEgc2VyaWVzIG9mIGZpbGVzIHRvIHRoZSBjb25zb2xlOjwvYj48L3A+Ci0KLSAgICAgIDxwcmU+Ci0gICZsdDtjb25jYXQmZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O21lc3NhZ2VzJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyppbXBvcnRhbnQqJnF1b3Q7LyZndDsKLSAgJmx0Oy9jb25jYXQmZ3Q7Ci0gICAgICA8L3ByZT4KLQotICAgICAgPHA+PGI+Q29uY2F0ZW5hdGUgYSBzaW5nbGUgZmlsZSwgYXBwZW5kaW5nIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGV4aXN0czo8L2I+PC9wPgotCi0gICAgICA8cHJlPgotICAmbHQ7Y29uY2F0IGRlc3RmaWxlPSZxdW90O05PVEVTJnF1b3Q7IGFwcGVuZD0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlbGlzdCBkaXI9JnF1b3Q7bm90ZXMmcXVvdDsgZmlsZXM9JnF1b3Q7bm90ZS50eHQmcXVvdDsvJmd0OwotICAmbHQ7L2NvbmNhdCZndDsKLSAgICAgIDwvcHJlPgotCi0gICAgICA8cD48Yj5Db25jYXRlbmF0ZSBhIHNlcmllcyBvZiBmaWxlcywgdXBkYXRlIHRoZSBkZXN0aW5hdGlvbgotICAgICAgZmlsZSBvbmx5IGlmIGlzIG9sZGVyIHRoYXQgYWxsIHRoZSBzb3VyY2UgZmlsZXM6PC9iPjwvcD4KLQotICAgICAgPHByZT4KLSAgJmx0O2NvbmNhdCBkZXN0ZmlsZT0mcXVvdDske2RvY2Jvb2suZGlyfS9hbGwtc2VjdGlvbnMueG1sJnF1b3Q7Ci0gICAgICAgICAgZm9yY2U9JnF1b3Q7bm8mcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZpbGVsaXN0IGRpcj0mcXVvdDske2RvY2Jvb2suZGlyfS9zZWN0aW9ucyZxdW90OwotICAgICAgICAgZmlsZXM9JnF1b3Q7aW50cm9kdWN0aW9uLnhtbCxvdmVydmlldy54bWwmcXVvdDsvJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2RvY2Jvb2suZGlyfSZxdW90OwotICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7c2VjdGlvbnMvKi54bWwmcXVvdDsKLSAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O2ludHJvZHVjdGlvbi54bWwsb3ZlcnZpZXcueG1sJnF1b3Q7LyZndDsKLSAgJmx0Oy9jb25jYXQmZ3Q7Ci0gICAgICA8L3ByZT4KLQotICAgICAgPHA+PGI+Q29uY2F0ZW5hdGUgYSBzZXJpZXMgb2YgZmlsZXMsIGV4cGFuZGluZyBhbnQgcHJvcGVydGllczwvYj48L3A+Ci0gICAgICAgIDxwcmU+Ci0gICAmbHQ7Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vc3VicyImZ3Q7Ci0gICAgICAmbHQ7cGF0aCZndDsKLSAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKi54bWwiLyZndDsKLSAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZC54bWwiLyZndDsKLSAgICAgICZsdDsvcGF0aCZndDsKLSAgICAgICZsdDtmaWx0ZXJjaGFpbiZndDsKLSAgICAgICAgJmx0O2V4cGFuZHByb3BlcnRpZXMvJmd0OwotICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSAgICZsdDsvY29uY2F0Jmd0OwotICAgICAgICA8L3ByZT4KLQotICAgICAgPHA+PGI+RmlsdGVyIHRoZSBsaW5lcyBjb250YWluaW5nIHByb2plY3QgZnJvbSBidWlsZC54bWwgYW5kIG91dHB1dAotICAgICAgICAgICB0aGVtIHRvIHJlcG9ydC5vdXRwdXQsIHByZXBlbmRpbmcgd2l0aCBhIGhlYWRlcjwvYj48L3A+Ci0gICAgICAgIDxwcmU+Ci0gICAmbHQ7Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vcmVwb3J0Lm91dHB1dCImZ3Q7Ci0gICAgICAmbHQ7aGVhZGVyIGZpbHRlcmluZz0ibm8iIHRyaW1sZWFkaW5nPSJ5ZXMiJmd0OwotICAgICAgICAgIExpbmVzIHRoYXQgY29udGFpbiBwcm9qZWN0Ci0gICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICZsdDsvaGVhZGVyJmd0OwotICAgICAgJmx0O3BhdGggcGF0aD0iYnVpbGQueG1sIi8mZ3Q7Ci0gICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7Ci0gICAgICAgICAmbHQ7bGluZWNvbnRhaW5zJmd0OwotICAgICAgICAgICAmbHQ7Y29udGFpbnMgdmFsdWU9InByb2plY3QiLyZndDsKLSAgICAgICAgICZsdDsvbGluZWNvbnRhaW5zJmd0OwotICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSAgICZsdDsvY29uY2F0Jmd0OwotICAgICAgICA8L3ByZT4KLQotICAgICAgPHA+PGI+Q29uY2F0ZW5hdGUgYSBudW1iZXIgb2YgYmluYXJ5IGZpbGVzLjwvYj48L3A+Ci0gICAgICAgIDxwcmU+Ci0gICAmbHQ7Y29uY2F0IGRlc3RmaWxlPSIke2J1aWxkLmRpcn0vZGlzdC5iaW4iIGJpbmFyeT0ieWVzIiZndDsKLSAgICAgJmx0O2ZpbGVzZXQgZmlsZT0iJHtzcmMuZGlyfS9zY3JpcHRzL2Rpc3Quc2giIC8mZ3Q7Ci0gICAgICZsdDtmaWxlc2V0IGZpbGU9IiR7YnVpbGQuZGlyfS9kaXN0LnRhci5iejIiIC8mZ3Q7Ci0gICAmbHQ7L2NvbmNhdCZndDsKLSAgICAgICAgPC9wcmU+Ci0KLSAgICAgIAotCi0gICAgPC9ib2R5PgotCi0gIDwvaHRtbD4KKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2NvbmRpdGlvbi5odG1sIGIvbWFudWFsL1Rhc2tzL2NvbmRpdGlvbi5odG1sCmluZGV4IDQwNWY5NWUuLmNjMDRiMTMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jb25kaXRpb24uaHRtbAorKysgYi9tYW51YWwvVGFza3MvY29uZGl0aW9uLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw5NyArMTUsODMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkNvbmRpdGlvbiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJDb25kaXRpb24iPkNvbmRpdGlvbjwvYT48L2gyPgorPGgyIGlkPSJjb25kaXRpb24iPkNvbmRpdGlvbjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgY2VydGFpbiBjb25kaXRpb24gaG9sZHMgdHJ1ZSAtIHRoaXMgaXMgYQotZ2VuZXJhbGl6YXRpb24gb2YgPGEgaHJlZj0iYXZhaWxhYmxlLmh0bWwiPkF2YWlsYWJsZTwvYT4gYW5kIDxhCi1ocmVmPSJ1cHRvZGF0ZS5odG1sIj5VcHRvZGF0ZTwvYT4uPC9wPgotPHA+SWYgdGhlIGNvbmRpdGlvbiBob2xkcyB0cnVlLCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgc2V0IHRvIHRydWUgYnkKLWRlZmF1bHQ7IG90aGVyd2lzZSwgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQuIFlvdSBjYW4gc2V0IHRoZSB2YWx1ZSB0bwotc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgYnkgc3BlY2lmeWluZyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+Ci1hdHRyaWJ1dGUuPC9wPgotPHA+Q29uZGl0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIDxhIGhyZWY9IiNuZXN0ZWQiPm5lc3RlZCBlbGVtZW50czwvYT4sCi15b3UgbXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGNvbmRpdGlvbi48L3A+Cis8cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBjZXJ0YWluIGNvbmRpdGlvbiBob2xkcyB0cnVlJm1kYXNoO3RoaXMgaXMgYSBnZW5lcmFsaXphdGlvbgorb2YgPGEgaHJlZj0iYXZhaWxhYmxlLmh0bWwiPkF2YWlsYWJsZTwvYT4gYW5kIDxhIGhyZWY9InVwdG9kYXRlLmh0bWwiPlVwdG9kYXRlPC9hPi48L3A+Cis8cD5JZiB0aGUgY29uZGl0aW9uIGhvbGRzIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4gYnkgZGVmYXVsdDsgb3RoZXJ3aXNlLCB0aGUKK3Byb3BlcnR5IGlzIG5vdCBzZXQuIFlvdSBjYW4gc2V0IHRoZSB2YWx1ZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nCit0aGUgPHZhcj52YWx1ZTwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorPHA+Q29uZGl0aW9ucyBhcmUgc3BlY2lmaWVkIGFzIDxhIGhyZWY9IiNuZXN0ZWQiPm5lc3RlZCBlbGVtZW50czwvYT4sIHlvdSBtdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUKK2NvbmRpdGlvbi48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by4gRGVmYXVsdHMgdG8KLSAgICAgICZxdW90O3RydWUmcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvIGlmIHRoZSBjb25kaXRpb24KLSAgICAgIGV2YWx1YXRlcyB0byA8aT5mYWxzZTwvaT4uIEJ5IGRlZmF1bHQgdGhlIHByb3BlcnR5IHdpbGwgcmVtYWluIHVuc2V0LgotICAgICAgPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42LjM8L2VtPgorICAgIDx0ZD5lbHNlPC90ZD4KKyAgICA8dGQ+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8gaWYgdGhlIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gPHE+ZmFsc2U8L3E+LiA8ZW0+U2luY2UKKyAgICAgIEFwYWNoZSBBbnQgMS42LjM8L2VtPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IHRoZSBwcm9wZXJ0eSB3aWxsIHJlbWFpbiB1bnNldDwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGgzPjxhIG5hbWU9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9hPjwvaDM+Ci08cD5BbGwgY29uZGl0aW9ucyB0byB0ZXN0IGFyZSBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzLCBmb3IgYQotY29tcGxldGUgbGlzdCBzZWUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5oZXJlPC9hPi48L3A+Cis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxwPkFsbCBjb25kaXRpb25zIHRvIHRlc3QgYXJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHMsIGZvciBhIGNvbXBsZXRlIGxpc3QKK3NlZSA8YSBocmVmPSJjb25kaXRpb25zLmh0bWwiPmhlcmU8L2E+LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+U2V0IHRoZSBwcm9wZXJ0eSA8Y29kZT5qYXZhbWFpbC5jb21wbGV0ZTwvY29kZT4gaWYgYm90aCB0aGUgSmF2YUJlYW5zIEFjdGl2YXRpb24gRnJhbWV3b3JrIGFuZAorSmF2YU1haWwgYXJlIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLjwvcD4KIDxwcmU+Ci0gICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7amF2YW1haWwuY29tcGxldGUmcXVvdDsmZ3Q7Ci0gICAgJmx0O2FuZCZndDsKLSAgICAgICZsdDthdmFpbGFibGUgY2xhc3NuYW1lPSZxdW90O2phdmF4LmFjdGl2YXRpb24uRGF0YUhhbmRsZXImcXVvdDsvJmd0OwotICAgICAgJmx0O2F2YWlsYWJsZSBjbGFzc25hbWU9JnF1b3Q7amF2YXgubWFpbC5UcmFuc3BvcnQmcXVvdDsvJmd0OwotICAgICZsdDsvYW5kJmd0OwotICAmbHQ7L2NvbmRpdGlvbiZndDsKLTwvcHJlPgotPHA+c2V0cyB0aGUgcHJvcGVydHkgPGNvZGU+amF2YW1haWwuY29tcGxldGU8L2NvZGU+IGlmIGJvdGggdGhlCi1KYXZhQmVhbnMgQWN0aXZhdGlvbiBGcmFtZXdvcmsgYW5kIEphdmFNYWlsIGFyZSBhdmFpbGFibGUgaW4gdGhlCi1jbGFzc3BhdGguPC9wPgorJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0mcXVvdDtqYXZhbWFpbC5jb21wbGV0ZSZxdW90OyZndDsKKyAgJmx0O2FuZCZndDsKKyAgICAmbHQ7YXZhaWxhYmxlIGNsYXNzbmFtZT0mcXVvdDtqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyJnF1b3Q7LyZndDsKKyAgICAmbHQ7YXZhaWxhYmxlIGNsYXNzbmFtZT0mcXVvdDtqYXZheC5tYWlsLlRyYW5zcG9ydCZxdW90Oy8mZ3Q7CisgICZsdDsvYW5kJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7PC9wcmU+CiAKKzxwPlNldCB0aGUgcHJvcGVydHkgPGNvZGU+aXNNYWNPc0J1dE5vdE1hY09zWDwvY29kZT4gaWYgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWNPUywgYnV0Citub3QgTWFjT1MgWC9tYWNPUyZtZGFzaDt3aGljaCBBbnQgY29uc2lkZXJzIHRvIGJlIGluIHRoZSBVbml4IGZhbWlseSBhcyB3ZWxsLjwvcD4KIDxwcmU+Ci0gICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7aXNNYWNPc0J1dE5vdE1hY09zWCZxdW90OyZndDsKLSAgICAmbHQ7YW5kJmd0OwotICAgICAgJmx0O29zIGZhbWlseT0mcXVvdDttYWMmcXVvdDsvJmd0OworJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0mcXVvdDtpc01hY09zQnV0Tm90TWFjT3NYJnF1b3Q7Jmd0OworICAmbHQ7YW5kJmd0OworICAgICZsdDtvcyBmYW1pbHk9JnF1b3Q7bWFjJnF1b3Q7LyZndDsKKyAgICAmbHQ7bm90Jmd0OworICAgICAgJmx0O29zIGZhbWlseT0mcXVvdDt1bml4JnF1b3Q7LyZndDsKKyAgICAmbHQ7L25vdCZndDsKKyAgJmx0Oy9hbmQmZ3Q7CismbHQ7L2NvbmRpdGlvbiZndDs8L3ByZT4KIAotICAgICAgJmx0O25vdCZndDsKLSAgICAgICAgJmx0O29zIGZhbWlseT0mcXVvdDt1bml4JnF1b3Q7LyZndDsKLQotICAgICAgJmx0Oy9ub3QmZ3Q7Ci0gICAgJmx0Oy9hbmQmZ3Q7Ci0gICZsdDsvY29uZGl0aW9uJmd0OwotPC9wcmU+Ci08cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc01hY09zQnV0Tm90TWFjT3NYPC9jb2RlPiBpZiB0aGUgY3VycmVudAotb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWNPUywgYnV0IG5vdCBNYWNPUyBYIC0gd2hpY2ggQW50IGNvbnNpZGVycyB0byBiZQotaW4gdGhlIFVuaXggZmFtaWx5IGFzIHdlbGwuPC9wPgotCis8cD5TZXQgdGhlIHByb3BlcnR5IDxjb2RlPmlzU3VuT1NvblNwYXJjPC9jb2RlPiBpZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIFN1bk9TIGFuZCBpZiBpdAoraXMgcnVubmluZyBvbiBhIFNQQVJDIGFyY2hpdGVjdHVyZS48L3A+CiA8cHJlPgotICAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSZxdW90O2lzU3VuT1NvblNwYXJjJnF1b3Q7Jmd0OwotICAgICZsdDtvcyBuYW1lPSZxdW90O1N1bk9TJnF1b3Q7IGFyY2g9JnF1b3Q7c3BhcmMmcXVvdDsvJmd0OwotCi0gICZsdDsvY29uZGl0aW9uJmd0OwotPC9wcmU+Ci08cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc1N1bk9Tb25TcGFyYzwvY29kZT4gaWYgdGhlIGN1cnJlbnQKLW9wZXJhdGluZyBzeXN0ZW0gaXMgU3VuT1MgYW5kIGlmIGl0IGlzIHJ1bm5pbmcgb24gYSBzcGFyYyBhcmNoaXRlY3R1cmUuPC9wPgotCi0KKyZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7aXNTdW5PU29uU3BhcmMmcXVvdDsmZ3Q7CisgICZsdDtvcyBuYW1lPSZxdW90O1N1bk9TJnF1b3Q7IGFyY2g9JnF1b3Q7c3BhcmMmcXVvdDsvJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jb25kaXRpb25zLmh0bWwgYi9tYW51YWwvVGFza3MvY29uZGl0aW9ucy5odG1sCmluZGV4IDJhZjdiMzAuLjg0NjczM2YgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jb25kaXRpb25zLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2NvbmRpdGlvbnMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDk1OCArMTUsODI0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Db25kaXRpb25zIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9IkNvbmRpdGlvbnMiPkNvbmRpdGlvbnM8L2E+PC9oMj4KLSAgPHA+Q29uZGl0aW9ucyBhcmUgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSAKLTxhIGhyZWY9ImNvbmRpdGlvbi5odG1sIj48Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT48L2E+IGFuZAotPGEgaHJlZj0id2FpdGZvci5odG1sIj48Y29kZT4mbHQ7d2FpdGZvciZndDs8L2NvZGU+PC9hPiB0YXNrcy4KLSAgICBUaGVyZSBhcmUgY29yZSBjb25kaXRpb25zIGFuZCBjdXN0b20gY29uZGl0aW9ucy4gQ3VzdG9tCi0gICAgY29uZGl0aW9ucyBhcmUgZGVzY3JpYmVkIGluCi0gICAgPGEgaHJlZj0iLi4vVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwjY3VzdG9tY29uZGl0aW9ucyI+Ci0gICAgICBDdXN0b20gQ29uZGl0aW9uczwvYT4uCi0gICAgQ29yZSBDb25kaXRpb25zIGFyZSBkZXNjcmliZWQgYmVsb3cuCi0gIDwvcD4KLSAgPGgzPjxhIG5hbWU9ImNvcmVjb25kaXRpb25zIj5Db3JlIENvbmRpdGlvbnM8L2E+PC9oMz4KKzxoMiBpZD0iY29uZGl0aW9ucyI+Q29uZGl0aW9uczwvaDI+Cis8cD5Db25kaXRpb25zIGFyZSBuZXN0ZWQgZWxlbWVudHMgb2YgdGhlIDxhIGhyZWY9ImNvbmRpdGlvbi5odG1sIj48Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT48L2E+CithbmQgPGEgaHJlZj0id2FpdGZvci5odG1sIj48Y29kZT4mbHQ7d2FpdGZvciZndDs8L2NvZGU+PC9hPiB0YXNrcy4gIFRoZXJlIGFyZSBjb3JlIGNvbmRpdGlvbnMgYW5kCitjdXN0b20gY29uZGl0aW9ucy4gQ3VzdG9tIGNvbmRpdGlvbnMgYXJlIGRlc2NyaWJlZAoraW4gPGEgaHJlZj0iLi4vVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwjY3VzdG9tY29uZGl0aW9ucyI+Q3VzdG9tIENvbmRpdGlvbnM8L2E+LiAgQ29yZQorQ29uZGl0aW9ucyBhcmUgZGVzY3JpYmVkIGJlbG93LjwvcD4KKzxoMyBpZD0iY29yZWNvbmRpdGlvbnMiPkNvcmUgQ29uZGl0aW9uczwvaDM+CiAKLTxwPlRoZXNlIGFyZSB0aGUgbmVzdGVkIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgYXMgY29uZGl0aW9ucyBpbiB0aGUKLTxhIGhyZWY9ImNvbmRpdGlvbi5odG1sIj48Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT48L2E+IGFuZAotPGEgaHJlZj0id2FpdGZvci5odG1sIj48Y29kZT4mbHQ7d2FpdGZvciZndDs8L2NvZGU+PC9hPiB0YXNrcy48L3A+Cis8cD5UaGVzZSBhcmUgdGhlIG5lc3RlZCBlbGVtZW50cyB0aGF0IGNhbiBiZSB1c2VkIGFzIGNvbmRpdGlvbnMgaW4KK3RoZSA8YSBocmVmPSJjb25kaXRpb24uaHRtbCI+PGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+PC9hPgorYW5kIDxhIGhyZWY9IndhaXRmb3IuaHRtbCI+PGNvZGU+Jmx0O3dhaXRmb3ImZ3Q7PC9jb2RlPjwvYT4gdGFza3MuPC9wPgogCi08aDQ+PGEgbmFtZT0ibm90Ij5ub3Q8L2E+PC9oND4KLTxwPlRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gZWxlbWVudCBleHBlY3RzIGV4YWN0bHkgb25lIG90aGVyCi1jb25kaXRpb24gdG8gYmUgbmVzdGVkIGludG8gdGhpcyBlbGVtZW50LCBuZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZQotY29uZGl0aW9uLiAgSXQgZG9lc24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzIGFuZCBhY2NlcHRzIGFsbCBuZXN0ZWQKLWVsZW1lbnRzIG9mIHRoZSBjb25kaXRpb24gdGFzayBhcyBuZXN0ZWQgZWxlbWVudHMgYXMgd2VsbC48L3A+Cis8aDQgaWQ9Im5vdCI+bm90PC9oND4KKzxwPlRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gZWxlbWVudCBleHBlY3RzIGV4YWN0bHkgb25lIG90aGVyIGNvbmRpdGlvbiB0byBiZSBuZXN0ZWQgaW50byB0aGlzCitlbGVtZW50LCBuZWdhdGluZyB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24uICBJdCBkb2Vzbid0IGhhdmUgYW55IGF0dHJpYnV0ZXMgYW5kIGFjY2VwdHMgYWxsCituZXN0ZWQgZWxlbWVudHMgb2YgdGhlIGNvbmRpdGlvbiB0YXNrIGFzIG5lc3RlZCBlbGVtZW50cyBhcyB3ZWxsLjwvcD4KIAotPGg0PjxhIG5hbWU9ImFuZCI+YW5kPC9hPjwvaDQ+IDxwPgotVGhlIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgYXR0cmlidXRlcyBhbmQKLWFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBjb25kaXRpb25zIGFzIG5lc3RlZCBlbGVtZW50cyAtIGFsbAotbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSBjb25kaXRpb24gdGFzayBhcmUgc3VwcG9ydGVkLiAgVGhpcyBjb25kaXRpb24KLWlzIHRydWUgaWYgYWxsIG9mIGl0cyBjb250YWluZWQgY29uZGl0aW9ucyBhcmUsIGNvbmRpdGlvbnMgd2lsbCBiZQotZXZhbHVhdGVkIGluIHRoZSBvcmRlciB0aGV5IGhhdmUgYmVlbiBzcGVjaWZpZWQgaW4gdGhlIGJ1aWxkIGZpbGUuPC9wPgotPHA+VGhlIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBjb25kaXRpb24gaGFzIHRoZSBzYW1lIHNob3J0Y3V0Ci1zZW1hbnRpY3MgYXMgdGhlIEphdmEgJmFtcDsmYW1wOyBvcGVyYXRvciwgYXMgc29vbiBhcyBvbmUgb2YgdGhlCi1uZXN0ZWQgY29uZGl0aW9ucyBpcyBmYWxzZSwgbm8gb3RoZXIgY29uZGl0aW9uIHdpbGwgYmUgZXZhbHVhdGVkLjwvcD4KKzxoNCBpZD0iYW5kIj5hbmQ8L2g0PgorPHA+VGhlIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgYXR0cmlidXRlcyBhbmQgYWNjZXB0cyBhbiBhcmJpdHJhcnkgbnVtYmVyCitvZiBjb25kaXRpb25zIGFzIG5lc3RlZCBlbGVtZW50cyZtZGFzaDthbGwgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSBjb25kaXRpb24gdGFzayBhcmUgc3VwcG9ydGVkLgorVGhpcyBjb25kaXRpb24gaXMgdHJ1ZSBpZiBhbGwgb2YgaXRzIGNvbnRhaW5lZCBjb25kaXRpb25zIGFyZSwgY29uZGl0aW9ucyB3aWxsIGJlIGV2YWx1YXRlZCBpbiB0aGUKK29yZGVyIHRoZXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZS48L3A+Cis8cD5UaGUgPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IGNvbmRpdGlvbiBoYXMgdGhlIHNhbWUgc2hvcnRjdXQgc2VtYW50aWNzIGFzIHRoZQorSmF2YSA8Y29kZT4mYW1wOyZhbXA7PC9jb2RlPiBvcGVyYXRvciwgYXMgc29vbiBhcyBvbmUgb2YgdGhlIG5lc3RlZCBjb25kaXRpb25zIGlzIGZhbHNlLCBubyBvdGhlcgorY29uZGl0aW9uIHdpbGwgYmUgZXZhbHVhdGVkLjwvcD4KIAotPGg0PjxhIG5hbWU9Im9yIj5vcjwvYT48L2g0PiA8cD4KLVRoZSA8Y29kZT4mbHQ7b3ImZ3Q7PC9jb2RlPiBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgYXR0cmlidXRlcyBhbmQKLWFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBjb25kaXRpb25zIGFzIG5lc3RlZCBlbGVtZW50cyAtIGFsbAotbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSBjb25kaXRpb24gdGFzayBhcmUgc3VwcG9ydGVkLiAgVGhpcyBjb25kaXRpb24KLWlzIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBjb250YWluZWQgY29uZGl0aW9ucyBpcywgY29uZGl0aW9ucwotd2lsbCBiZSBldmFsdWF0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQKLWZpbGUuPC9wPiA8cD5UaGUgPGNvZGU+Jmx0O29yJmd0OzwvY29kZT4gY29uZGl0aW9uIGhhcyB0aGUgc2FtZQotc2hvcnRjdXQgc2VtYW50aWNzIGFzIHRoZSBKYXZhIHx8IG9wZXJhdG9yLCBhcyBzb29uIGFzIG9uZSBvZiB0aGUKLW5lc3RlZCBjb25kaXRpb25zIGlzIHRydWUsIG5vIG90aGVyIGNvbmRpdGlvbiB3aWxsIGJlIGV2YWx1YXRlZC48L3A+Cis8aDQgaWQ9Im9yIj5vcjwvaDQ+Cis8cD5UaGUgPGNvZGU+Jmx0O29yJmd0OzwvY29kZT4gZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGF0dHJpYnV0ZXMgYW5kIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlcgorb2YgY29uZGl0aW9ucyBhcyBuZXN0ZWQgZWxlbWVudHMmbWRhc2g7YWxsIG5lc3RlZCBlbGVtZW50cyBvZiB0aGUgY29uZGl0aW9uIHRhc2sgYXJlIHN1cHBvcnRlZC4KK1RoaXMgY29uZGl0aW9uIGlzIHRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBjb250YWluZWQgY29uZGl0aW9ucyBpcywgY29uZGl0aW9ucyB3aWxsIGJlIGV2YWx1YXRlZAoraW4gdGhlIG9yZGVyIHRoZXkgaGF2ZSBiZWVuIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZS48L3A+Cis8cD5UaGUgPGNvZGU+Jmx0O29yJmd0OzwvY29kZT4gY29uZGl0aW9uIGhhcyB0aGUgc2FtZSBzaG9ydGN1dCBzZW1hbnRpY3MgYXMgdGhlIEphdmEgPGNvZGU+fHw8L2NvZGU+CitvcGVyYXRvciwgYXMgc29vbiBhcyBvbmUgb2YgdGhlIG5lc3RlZCBjb25kaXRpb25zIGlzIHRydWUsIG5vIG90aGVyIGNvbmRpdGlvbiB3aWxsIGJlIGV2YWx1YXRlZC48L3A+CiAKLTxoND48YSBuYW1lPSJ4b3IiPnhvcjwvYT48L2g0PgotPHA+VGhlIDxjb2RlPiZsdDt4b3ImZ3Q7PC9jb2RlPiBlbGVtZW50IHBlcmZvcm1zIGFuIGV4Y2x1c2l2ZQotb3Igb24gYWxsIG5lc3RlZCBlbGVtZW50cywgc2ltaWxhciB0byB0aGUgPGNvZGU+XjwvY29kZT4gb3BlcmF0b3IKLWluIEphdmEuIEl0IG9ubHkgZXZhbHVhdGVzIHRvIHRydWUgaWYgYW4gb2RkIG51bWJlciBvZiBuZXN0ZWQgY29uZGl0aW9ucworPGg0IGlkPSJ4b3IiPnhvcjwvaDQ+Cis8cD5UaGUgPGNvZGU+Jmx0O3hvciZndDs8L2NvZGU+IGVsZW1lbnQgcGVyZm9ybXMgYW4gZXhjbHVzaXZlIG9yIG9uIGFsbCBuZXN0ZWQgZWxlbWVudHMsIHNpbWlsYXIgdG8KK3RoZSA8Y29kZT5ePC9jb2RlPiBvcGVyYXRvciBpbiBKYXZhLiBJdCBvbmx5IGV2YWx1YXRlcyB0byB0cnVlIGlmIGFuIG9kZCBudW1iZXIgb2YgbmVzdGVkIGNvbmRpdGlvbnMKIGFyZSB0cnVlLiBUaGVyZSBpcyBubyBzaG9ydGN1dHRpbmcgb2YgZXZhbHVhdGlvbiwgdW5saWtlIHRoZSA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4KLWFuZCA8Y29kZT4mbHQ7b3ImZ3Q7PC9jb2RlPiB0ZXN0cy4KLUl0IGRvZXNuJ3QgaGF2ZSBhbnkgYXR0cmlidXRlcyBhbmQgYWNjZXB0cyBhbGwgbmVzdGVkCi1lbGVtZW50cyBvZiB0aGUgY29uZGl0aW9uIHRhc2sgYXMgbmVzdGVkIGVsZW1lbnRzIGFzIHdlbGwuPC9wPgorYW5kIDxjb2RlPiZsdDtvciZndDs8L2NvZGU+IHRlc3RzLiAgSXQgZG9lc24ndCBoYXZlIGFueSBhdHRyaWJ1dGVzIGFuZCBhY2NlcHRzIGFsbCBuZXN0ZWQgZWxlbWVudHMKK29mIHRoZSBjb25kaXRpb24gdGFzayBhcyBuZXN0ZWQgZWxlbWVudHMgYXMgd2VsbC48L3A+CiAKLTxoND48YSBuYW1lPSJhdmFpbGFibGUiPmF2YWlsYWJsZTwvYT48L2g0PgotPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YQotaHJlZj0iYXZhaWxhYmxlLmh0bWwiPkF2YWlsYWJsZTwvYT4gdGFzaywgYWxsIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZAotZWxlbWVudHMgb2YgdGhhdCB0YXNrIGFyZSBzdXBwb3J0ZWQsIHRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUgYXR0cmlidXRlcwotYXJlIHJlZHVuZGFudCBhbmQgd2lsbCBiZSBpZ25vcmVkLjwvcD4KKzxoNCBpZD0iYXZhaWxhYmxlIj5hdmFpbGFibGU8L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YSBocmVmPSJhdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPiB0YXNrLCBhbGwgYXR0cmlidXRlcworYW5kIG5lc3RlZCBlbGVtZW50cyBvZiB0aGF0IHRhc2sgYXJlIHN1cHBvcnRlZCwgdGhlIHByb3BlcnR5IGFuZCB2YWx1ZSBhdHRyaWJ1dGVzIGFyZSByZWR1bmRhbnQgYW5kCit3aWxsIGJlIGlnbm9yZWQuPC9wPgogCi08aDQ+PGEgbmFtZT0idXB0b2RhdGUiPnVwdG9kYXRlPC9hPjwvaDQ+Ci08cD5UaGlzIGNvbmRpdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIDxhCi1ocmVmPSJ1cHRvZGF0ZS5odG1sIj5VcHRvZGF0ZTwvYT4gdGFzaywgYWxsIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZAotZWxlbWVudHMgb2YgdGhhdCB0YXNrIGFyZSBzdXBwb3J0ZWQsIHRoZSBwcm9wZXJ0eSBhbmQgdmFsdWUgYXR0cmlidXRlcwotYXJlIHJlZHVuZGFudCBhbmQgd2lsbCBiZSBpZ25vcmVkLjwvcD4KKzxoNCBpZD0idXB0b2RhdGUiPnVwdG9kYXRlPC9oND4KKzxwPlRoaXMgY29uZGl0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgPGEgaHJlZj0idXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+IHRhc2ssIGFsbCBhdHRyaWJ1dGVzIGFuZAorbmVzdGVkIGVsZW1lbnRzIG9mIHRoYXQgdGFzayBhcmUgc3VwcG9ydGVkLCB0aGUgcHJvcGVydHkgYW5kIHZhbHVlIGF0dHJpYnV0ZXMgYXJlIHJlZHVuZGFudCBhbmQgd2lsbAorYmUgaWdub3JlZC48L3A+CiAKLTxoND48YSBuYW1lPSJvcyI+b3M8L2E+PC9oND4KLTxwPlRlc3Qgd2hldGhlciB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtIGlzIG9mIGEgZ2l2ZW4gdHlwZS4gIEVhY2gKLWRlZmluZWQgYXR0cmlidXRlIGlzIHRlc3RlZCBhbmQgdGhlIHJlc3VsdCBpcyB0cnVlIG9ubHkgaWYgPGk+YWxsPC9pPgotdGhlIHRlc3RzIHN1Y2NlZWQuCis8aDQgaWQ9Im9zIj5vczwvaDQ+Cis8cD5UZXN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBvZiBhIGdpdmVuIHR5cGUuICBFYWNoIGRlZmluZWQgYXR0cmlidXRlIGlzIHRlc3RlZAorYW5kIHRoZSByZXN1bHQgaXMgdHJ1ZSBvbmx5IGlmIDxlbT5hbGw8L2VtPiB0aGUgdGVzdHMgc3VjY2VlZC4KIDwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFtaWx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGZhbWlseSB0byBleHBlY3QuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmFtaWx5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZmFtaWx5IHRvIGV4cGVjdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gZXhwZWN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBleHBlY3QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hcmNoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBhcmNoaXRlY3R1cmUgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gZXhwZWN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmFyY2g8L3RkPgorICAgIDx0ZD5UaGUgYXJjaGl0ZWN0dXJlIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRvIGV4cGVjdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZlcnNpb24gb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdG8gZXhwZWN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnZlcnNpb248L3RkPgorICAgIDx0ZD5UaGUgdmVyc2lvbiBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byBleHBlY3QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxwPlN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmYW1pbHkgYXR0cmlidXRlIGFyZToKIDx1bD4KLSAgPGxpPndpbmRvd3MgKGZvciBhbGwgdmVyc2lvbnMgb2YgTWljcm9zb2Z0IFdpbmRvd3MpPC9saT4KLSAgPGxpPmRvcyAoZm9yIGFsbCBNaWNyb3NvZnQgRE9TIGJhc2VkIG9wZXJhdGluZyBzeXN0ZW1zIGluY2x1ZGluZwotICAgIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBPUy8yKTwvbGk+Ci0gIDxsaT5tYWMgKGZvciBhbGwgQXBwbGUgTWFjaW50b3NoIHN5c3RlbXMpPC9saT4KLSAgPGxpPnVuaXggKGZvciBhbGwgVW5peCBhbmQgVW5peC1saWtlIG9wZXJhdGluZyBzeXN0ZW1zKTwvbGk+Ci0gIDxsaT5uZXR3YXJlIChmb3IgTm92ZWxsIE5ldFdhcmUpPC9saT4KLSAgPGxpPm9zLzIgKGZvciBPUy8yKTwvbGk+Ci0gIDxsaT50YW5kZW0gKGZvciBIUCdzIE5vblN0b3AgS2VybmVsIC0gZm9ybWVybHkgVGFuZGVtKTwvbGk+Ci0gIDxsaT53aW45eCBmb3IgTWljcm9zb2Z0IFdpbmRvd3MgOTUgYW5kIDk4LCBNRSBhbmQgQ0U8L2xpPgotICA8bGk+d2lubnQgZm9yIE1pY3Jvc29mdCBXaW5kb3dzIE5ULWJhc2VkIHN5c3RlbXMsIGluY2x1ZGluZyBXaW5kb3dzIDIwMDAsIFhQIGFuZAorICA8bGk+PHE+d2luZG93czwvcT4mbWRhc2g7Zm9yIGFsbCB2ZXJzaW9ucyBvZiBNaWNyb3NvZnQgV2luZG93czwvbGk+CisgIDxsaT48cT5kb3M8L3E+Jm1kYXNoO2ZvciBhbGwgTWljcm9zb2Z0IERPUyBiYXNlZCBvcGVyYXRpbmcgc3lzdGVtcyBpbmNsdWRpbmcgTWljcm9zb2Z0IFdpbmRvd3MgYW5kCisgICAgT1MvMjwvbGk+CisgIDxsaT48cT5tYWM8L3E+Jm1kYXNoO2ZvciBhbGwgQXBwbGUgTWFjaW50b3NoIHN5c3RlbXMgcHJpb3IgdG8gTWFjIE9TIFg8L2xpPgorICA8bGk+PHE+dW5peDwvcT4mbWRhc2g7Zm9yIGFsbCBVbml4KC1saWtlKSBvcGVyYXRpbmcgc3lzdGVtcywgaW5jbHVkaW5nIExpbnV4IGFuZCBNYWMgT1MKKyAgICAgIFgvbWFjT1M8L2xpPgorICA8bGk+PHE+bmV0d2FyZTwvcT4mbWRhc2g7Zm9yIE5vdmVsbCBOZXRXYXJlPC9saT4KKyAgPGxpPjxxPm9zLzI8L3E+Jm1kYXNoO2ZvciBPUy8yPC9saT4KKyAgPGxpPjxxPnRhbmRlbTwvcT4mbWRhc2g7Zm9yIEhQJ3MgTm9uU3RvcCBLZXJuZWwsIGZvcm1lcmx5IFRhbmRlbTwvbGk+CisgIDxsaT48cT53aW45eDwvcT4mbWRhc2g7Zm9yIE1pY3Jvc29mdCBXaW5kb3dzIDk1IGFuZCA5OCwgTUUgYW5kIENFPC9saT4KKyAgPGxpPjxxPndpbm50PC9xPiZtZGFzaDtmb3IgTWljcm9zb2Z0IFdpbmRvd3MgTlQtYmFzZWQgc3lzdGVtcywgaW5jbHVkaW5nIFdpbmRvd3MgMjAwMCwgWFAgYW5kCiAgICAgICBzdWNjZXNzb3JzPC9saT4KLSAgPGxpPnovb3MgZm9yIHovT1MgYW5kIE9TLzM5MDwvbGk+Ci0gIDxsaT5vcy80MDAgZm9yIE9TLzQwMDwvbGk+Ci0gIDxsaT5vcGVudm1zIGZvciBPcGVuVk1TPC9saT4KKyAgPGxpPjxxPnovb3M8L3E+Jm1kYXNoO2ZvciB6L09TIGFuZCBPUy8zOTA8L2xpPgorICA8bGk+PHE+b3MvNDAwPC9xPiZtZGFzaDtmb3IgT1MvNDAwPC9saT4KKyAgPGxpPjxxPm9wZW52bXM8L3E+Jm1kYXNoO2ZvciBPcGVuVk1TPC9saT4KIDwvdWw+CiAKLTxoND48YSBuYW1lPSJlcXVhbHMiPmVxdWFsczwvYT48L2g0PgorPGg0IGlkPSJlcXVhbHMiPmVxdWFsczwvaDQ+CiA8cD5UZXN0cyB3aGV0aGVyIHRoZSB0d28gZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFyZzE8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Rmlyc3QgdmFsdWUgdG8gdGVzdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+YXJnMTwvdGQ+CisgICAgPHRkPkZpcnN0IHZhbHVlIHRvIHRlc3QuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnMjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZWNvbmQgdmFsdWUgdG8gdGVzdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+YXJnMjwvdGQ+CisgICAgPHRkPlNlY29uZCB2YWx1ZSB0byB0ZXN0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24uICBEZWZhdWx0IGlzCi0gICAgICAgIHRydWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgPHRkPlBlcmZvcm0gYSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJpbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UcmltIHdoaXRlc3BhY2UgZnJvbSBhcmd1bWVudHMgYmVmb3JlIGNvbXBhcmluZwotICAgICAgICB0aGVtLiAgRGVmYXVsdCBpcyBmYWxzZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50cmltPC90ZD4KKyAgICA8dGQ+VHJpbSB3aGl0ZXNwYWNlIGZyb20gYXJndW1lbnRzIGJlZm9yZSBjb21wYXJpbmcgdGhlbS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZXN0cmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Gb3JjZSBzdHJpbmcgY29tcGFyaXNvbiBvZiA8Y29kZT5hcmcxL2FyZzI8L2NvZGU+LgotICAgICAgICBEZWZhdWx0IGlzIGZhbHNlLiAgPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjE8L2VtPgorICAgIDx0ZD5mb3JjZXN0cmluZzwvdGQ+CisgICAgPHRkPkZvcmNlIHN0cmluZyBjb21wYXJpc29uIG9mIDx2YXI+YXJnMTwvdmFyPi88dmFyPmFyZzI8L3Zhcj4uICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjguMTwvZW0+CiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJpc3NldCI+aXNzZXQ8L2E+PC9oND4KKzxoNCBpZD0iaXNzZXQiPmlzc2V0PC9oND4KIDxwPlRlc3Qgd2hldGhlciBhIGdpdmVuIHByb3BlcnR5IGhhcyBiZWVuIHNldCBpbiB0aGlzIHByb2plY3QuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdGVzdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdGVzdC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9ImNoZWNrc3VtIj5jaGVja3N1bTwvYT48L2g0PgotPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YSBocmVmPSJjaGVja3N1bS5odG1sIj5DaGVja3N1bTwvYT4KLXRhc2ssIGFsbCBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgb2YgdGhhdCB0YXNrIGFyZSBzdXBwb3J0ZWQsCi10aGUgcHJvcGVydHkgYW5kIG92ZXJ3cml0ZSBhdHRyaWJ1dGVzIGFyZSByZWR1bmRhbnQgYW5kIHdpbGwgYmUKLWlnbm9yZWQuPC9wPgorPGg0IGlkPSJjaGVja3N1bSI+Y2hlY2tzdW08L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YSBocmVmPSJjaGVja3N1bS5odG1sIj5DaGVja3N1bTwvYT4gdGFzaywgYWxsIGF0dHJpYnV0ZXMgYW5kCituZXN0ZWQgZWxlbWVudHMgb2YgdGhhdCB0YXNrIGFyZSBzdXBwb3J0ZWQsIHRoZSBwcm9wZXJ0eSBhbmQgb3ZlcndyaXRlIGF0dHJpYnV0ZXMgYXJlIHJlZHVuZGFudCBhbmQKK3dpbGwgYmUgaWdub3JlZC48L3A+CiAKLTxoND48YSBuYW1lPSJodHRwIj5odHRwPC9hPjwvaDQ+Ci08cD5UaGUgPGNvZGU+aHR0cDwvY29kZT4gY29uZGl0aW9uIGNoZWNrcyBmb3IgYSB2YWxpZCByZXNwb25zZSBmcm9tIGEKLXdlYiBzZXJ2ZXIgb2YgdGhlIHNwZWNpZmllZCB1cmwuIEJ5IGRlZmF1bHQsIEhUVFAgcmVzcG9uc2VzIGVycm9ycwotb2YgNDAwIG9yIGdyZWF0ZXIgYXJlIHZpZXdlZCBhcyBpbnZhbGlkLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDQgaWQ9Imh0dHAiPmh0dHA8L2g0PgorPHA+VGhlIDxjb2RlPmh0dHA8L2NvZGU+IGNvbmRpdGlvbiBjaGVja3MgZm9yIGEgdmFsaWQgcmVzcG9uc2UgZnJvbSBhIHdlYiBzZXJ2ZXIgb2YgdGhlIHNwZWNpZmllZAorVVJMLiBCeSBkZWZhdWx0LCBIVFRQIHJlc3BvbnNlcyBlcnJvcnMgb2YgNDAwIG9yIGdyZWF0ZXIgYXJlIHZpZXdlZCBhcyBpbnZhbGlkLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGwgVVJMIG9mIHRoZSBwYWdlIHRvIHJlcXVlc3QuIFRoZSB3ZWIgc2VydmVyIG11c3QKLSAgICAgIHJldHVybiBhIHN0YXR1cyBjb2RlIGJlbG93IHRoZSB2YWx1ZSBvZiA8dHQ+ZXJyb3JzQmVnaW5BdDwvdHQ+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgICAgPHRkPnVybDwvdGQ+CisgICAgPHRkPlRoZSBmdWxsIFVSTCBvZiB0aGUgcGFnZSB0byByZXF1ZXN0LiBUaGUgd2ViIHNlcnZlciBtdXN0IHJldHVybiBhIHN0YXR1cyBjb2RlIGJlbG93IHRoZQorICAgICAgdmFsdWUgb2YgPHZhcj5lcnJvcnNCZWdpbkF0PC92YXI+PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3JzQmVnaW5BdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG93ZXN0IEhUVFAgcmVzcG9uc2UgY29kZSB0aGF0IHNpZ25hbHMgYW4gZXJyb3I7Ci0gICAgYnkgZGVmYXVsdCAnNDAwJzsgc2VydmVyIGVycm9ycywgbm90LWF1dGhvcml6ZWQsIG5vdC1mb3VuZCBhbmQgdGhlIGxpa2UKLSAgICBhcmUgZGV0ZWN0ZWQ8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmVycm9yc0JlZ2luQXQ8L3RkPgorICAgIDx0ZD5UaGUgbG93ZXN0IEhUVFAgcmVzcG9uc2UgY29kZSB0aGF0IHNpZ25hbHMgYW4gZXJyb3I7IHNlcnZlciBlcnJvcnMsIG5vdC1hdXRob3JpemVkLAorICAgICAgbm90LWZvdW5kIGFuZCB0aGUgbGlrZSBhcmUgZGV0ZWN0ZWQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT40MDA8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVxdWVzdE1ldGhvZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgSFRUUCBtZXRob2QgdG8gYmUgdXNlZCB3aGVuIGlzc3VpbmcgdGhlIHJlcXVlc3QuCi0gICAgQW55IG9mIEdFVCwgUE9TVCwgSEVBRCwgT1BUSU9OUywgUFVULCBERUxFVEVtIGFuZCBUUkFDRQotICAgIGFyZSB2YWxpZCwgc3ViamVjdCB0byBwcm90b2NvbCByZXN0cmljdGlvbnMuIFRoZSBkZWZhdWx0IGlmIG5vdAotICAgIHNwZWNpZmllZCBpcyAmcXVvdDtHRVQmcXVvdDsuPGJyLz4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVxdWVzdE1ldGhvZDwvdGQ+CisgICAgPHRkPlRoZSBIVFRQIG1ldGhvZCB0byBiZSB1c2VkIHdoZW4gaXNzdWluZyB0aGUgcmVxdWVzdC4gIEFueQorICAgICAgb2YgPHE+R0VUPC9xPiwgPHE+UE9TVDwvcT4sIDxxPkhFQUQ8L3E+LCA8cT5PUFRJT05TPC9xPiwgPHE+UFVUPC9xPiwgPHE+REVMRVRFPC9xPgorICAgICAgYW5kIDxxPlRSQUNFPC9xPiBhcmUgdmFsaWQsIHN1YmplY3QgdG8gcHJvdG9jb2wgcmVzdHJpY3Rpb25zLjxici8+PGVtPnNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPkdFVDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb2xsb3dSZWRpcmVjdHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciByZWRpcmVjdHMgc2hvdWxkIGJlIGZvbGxvd2VkLiBUaGUgZGVmYXVsdAotICAgICAgaXMgPGNvZGU+dHJ1ZTwvY29kZT48YnIvPgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mb2xsb3dSZWRpcmVjdHM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHJlZGlyZWN0cyBzaG91bGQgYmUgZm9sbG93ZWQuPGJyLz48ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVhZFRpbWVvdXQ8L3RkPgorICAgIDx0ZD5SZWFkIHRpbWVvdXQsIGluIG1pbGxpc2Vjb25kcywgdGhhdCB3aWxsIGJlIHVzZWQgd2hpbGUgcmVhZGluZyBmcm9tIHRoZSB0YXJnZXQgVVJMLgorICAgICAgQWNjZXB0cyBhbnkgdmFsdWUgJmdlOyAwLiBWYWx1ZSBvZiAwIGltcGxpZXMgd2FpdCBpbmRlZmluaXRlbHkuIFZhbHVlICZsdDsgMCB3aWxsIGJlIHNpbGVudGx5CisgICAgICBpZ25vcmVkLjxici8+CisgICAgICA8ZW0+c2luY2UgQW50IDEuMTAuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJzb2NrZXQiPnNvY2tldDwvYT48L2g0PgotPHA+VGhlIDxjb2RlPnNvY2tldDwvY29kZT4gY29uZGl0aW9uIGNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhCi1UQ1AvSVAgbGlzdGVuZXIgYXQgdGhlIHNwZWNpZmllZCBob3N0IGFuZCBwb3J0LjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDQgaWQ9InNvY2tldCI+c29ja2V0PC9oND4KKzxwPlRoZSA8Y29kZT5zb2NrZXQ8L2NvZGU+IGNvbmRpdGlvbiBjaGVja3MgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBUQ1AvSVAgbGlzdGVuZXIgYXQgdGhlIHNwZWNpZmllZAoraG9zdCBhbmQgcG9ydC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBETlMgbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgICAgPHRkPnNlcnZlcjwvdGQ+CisgICAgPHRkPlRoZSBETlMgbmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcG9ydCBudW1iZXIgdG8gY29ubmVjdCB0by48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgICA8dGQ+cG9ydDwvdGQ+CisgICAgPHRkPlRoZSBwb3J0IG51bWJlciB0byBjb25uZWN0IHRvLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+PGEgbmFtZT0iZmlsZXNtYXRjaCI+ZmlsZXNtYXRjaDwvYT48L2g0PgotPHA+VGVzdCB0d28gZmlsZXMgZm9yIG1hdGNoaW5nLiBOb25leGlzdGVuY2Ugb2Ygb25lIGZpbGUgcmVzdWx0cyBpbiAiZmFsc2UiLAotYWx0aG91Z2ggaWYgbmVpdGhlciBleGlzdHMgdGhleSBhcmUgY29uc2lkZXJlZCBlcXVhbCBpbiB0ZXJtcyBvZiBjb250ZW50LgotVGhpcyB0ZXN0IGRvZXMgYSBieXRlIGZvciBieXRlIGNvbXBhcmlzb24sIHNvIHRlc3QgdGltZSBzY2FsZXMgd2l0aAotYnl0ZSBzaXplLiBOQjogaWYgdGhlIGZpbGVzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIG9uZSBvZiB0aGVtIGlzIG1pc3NpbmcKLW9yIHRoZSBmaWxlbmFtZXMgbWF0Y2ggdGhlIGFuc3dlciBpcyBzbyBvYnZpb3VzIHRoZSBkZXRhaWxlZCB0ZXN0IGlzIG9taXR0ZWQuCi0KKzxoNCBpZD0iZmlsZXNtYXRjaCI+ZmlsZXNtYXRjaDwvaDQ+Cis8cD5UZXN0IHR3byBmaWxlcyBmb3IgbWF0Y2hpbmcuIE5vbmV4aXN0ZW5jZSBvZiBvbmUgZmlsZSByZXN1bHRzIGluIDxxPmZhbHNlPC9xPiwgYWx0aG91Z2ggaWYKK25laXRoZXIgZXhpc3RzIHRoZXkgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaW4gdGVybXMgb2YgY29udGVudC4gIFRoaXMgdGVzdCBkb2VzIGEgYnl0ZSBmb3IgYnl0ZQorY29tcGFyaXNvbiwgc28gdGVzdCB0aW1lIHNjYWxlcyB3aXRoIGJ5dGUgc2l6ZS4gPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBpZiB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudAorc2l6ZXMsIG9uZSBvZiB0aGVtIGlzIG1pc3Npbmcgb3IgdGhlIGZpbGVuYW1lcyBtYXRjaCB0aGUgYW5zd2VyIGlzIHNvIG9idmlvdXMgdGhlIGRldGFpbGVkIHRlc3QgaXMKK29taXR0ZWQuCiA8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUxPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZpcnN0IGZpbGUgdG8gdGVzdDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGUxPC90ZD4KKyAgICA8dGQ+Rmlyc3QgZmlsZSB0byB0ZXN0PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2Vjb25kIGZpbGUgdG8gdGVzdDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGUyPC90ZD4KKyAgICA8dGQ+U2Vjb25kIGZpbGUgdG8gdGVzdDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRleHRmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaWdub3JlIGxpbmUgZW5kaW5ncyB3aGVuIGNvbXBhcmluZwotICAgICAgICBmaWxlczsgZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+IHdoaWNoIHRyaWdnZXJzIGEgYmluYXJ5Ci0gICAgICAgIGNvbXBhcmlzb24uIDxiPlNpbmNlIEFudCAxLjc8L2I+CisgICAgPHRkPnRleHRmaWxlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBpZ25vcmUgbGluZSBlbmRpbmdzIHdoZW4gY29tcGFyaW5nIGZpbGVzLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+CiAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+IHdoaWNoIHRyaWdnZXJzIGEgYmluYXJ5IGNvbXBhcmlzb248L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9ImNvbnRhaW5zIj5jb250YWluczwvYT48L2g0PgorPGg0IGlkPSJjb250YWlucyI+Y29udGFpbnM8L2g0PgogPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBjb250YWlucyBhbm90aGVyIG9uZS48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3RyaW5nIHRvIHNlYXJjaCBpbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3RyaW5nPC90ZD4KKyAgICA8dGQ+VGhlIHN0cmluZyB0byBzZWFyY2ggaW4uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3Vic3RyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3Vic3RyaW5nPC90ZD4KKyAgICA8dGQ+VGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24uICBEZWZhdWx0IGlzCi0gICAgICAgIHRydWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgPHRkPlBlcmZvcm0gYSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJpc3RydWUiPmlzdHJ1ZTwvYT48L2g0PgotPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBlcXVhbHMgYW55IG9mIHRoZSBhbnQgZGVmaW5pdGlvbnMgb2YgdHJ1ZSwKLXRoYXQgaXMgInRydWUiLCJ5ZXMiLCBvciAib24iPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoNCBpZD0iaXN0cnVlIj5pc3RydWU8L2g0PgorPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBlcXVhbHMgYW55IG9mIHRoZSBBbnQgZGVmaW5pdGlvbnMgb2YgdHJ1ZSwgdGhhdAoraXMgPHE+dHJ1ZTwvcT4sIDxxPnllczwvcT4sIG9yIDxxPm9uPC9xPjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSB0byB0ZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+dmFsdWUgdG8gdGVzdDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7aXN0cnVlIHZhbHVlPSZxdW90OyR7c29tZXByb3BlcnR5fSZxdW90Oy8mZ3Q7Ci0mbHQ7aXN0cnVlIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDtpc3RydWUgdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0iaXNmYWxzZSI+aXNmYWxzZTwvYT48L2g0PgotPHA+VGVzdHMgd2hldGhlciBhIHN0cmluZyBpcyBub3QgdHJ1ZSwgdGhlIG5lZ2F0aW9uIG9mICZsdDtpc3RydWUmZ3Q7Ci08L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGg0IGlkPSJpc2ZhbHNlIj5pc2ZhbHNlPC9oND4KKzxwPlRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgaXMgbm90IHRydWUsIHRoZSBuZWdhdGlvbiBvZiA8Y29kZT4mbHQ7aXN0cnVlJmd0OzwvY29kZT48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgdG8gdGVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPnZhbHVlIHRvIHRlc3Q8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2lzZmFsc2UgdmFsdWU9JnF1b3Q7JHtzb21lcHJvcGVydHl9JnF1b3Q7LyZndDsKLSZsdDtpc2ZhbHNlIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDtpc2ZhbHNlIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDs8L3ByZT4KIAotPGg0PjxhIG5hbWU9ImlzcmVmZXJlbmNlIj5pc3JlZmVyZW5jZTwvYT48L2g0PgorPGg0IGlkPSJpc3JlZmVyZW5jZSI+aXNyZWZlcmVuY2U8L2g0PgorPHA+VGVzdCB3aGV0aGVyIGEgZ2l2ZW4gcmVmZXJlbmNlIGhhcyBiZWVuIGRlZmluZWQgaW4gdGhpcyBwcm9qZWN0IGFuZCZtZGFzaDtvcHRpb25hbGx5Jm1kYXNoO2lzIG9mCithbiBleHBlY3RlZCB0eXBlLjwvcD4KIAotPHA+VGVzdCB3aGV0aGVyIGEgZ2l2ZW4gcmVmZXJlbmNlIGhhcyBiZWVuIGRlZmluZWQgaW4gdGhpcyBwcm9qZWN0IGFuZAotLSBvcHRpb25hbGx5IC0gaXMgb2YgYW4gZXhwZWN0ZWQgdHlwZS48L3A+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPi48L3A+CiAKLTxwPlRoaXMgY29uZGl0aW9uIGhhcyBiZWVuIGFkZGVkIGluIEFwYWNoZSBBbnQgMS42LjwvcD4KLQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWZpZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaWQgb2YgdGhlIHJlZmVyZW5jZSB0byB0ZXN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5yZWZpZDwvdGQ+CisgICAgPHRkPlRoZSA8dmFyPmlkPC92YXI+IG9mIHRoZSByZWZlcmVuY2UgdG8gdGVzdC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIGRhdGEgdHlwZSBvciB0YXNrIHRoaXMgcmVmZXJlbmNlIGlzCi0gICAgICAgZXhwZWN0ZWQgdG8gYmUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGRhdGEgdHlwZSBvciB0YXNrIHRoaXMgcmVmZXJlbmNlIGlzIGV4cGVjdGVkIHRvIGJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJpc3NpZ25lZCI+aXNzaWduZWQ8L2E+PC9oND4KLSAgPHA+Ci0gICAgVGVzdCB3aGV0aGVyIGEgamFyZmlsZSBpcyBzaWduZWQuCi0gICAgSWYgdGhlIG5hbWUgb2YgdGhlCi0gICAgc2lnbmF0dXJlIGlzIHBhc3NlZCwgdGhlIGZpbGUgaXMgY2hlY2tlZCBmb3IgcHJlc2VuY2Ugb2YgdGhhdAotICAgIHBhcnRpY3VsYXIgc2lnbmF0dXJlOyBvdGhlcndpc2UgdGhlIGZpbGUgaXMgY2hlY2tlZCBmb3IgdGhlCi0gICAgZXhpc3RlbmNlIG9mIGFueSBzaWduYXR1cmUuIEl0IGRvZXMgbm90IHBlcmZvcm0gcmlnb3JvdXMKLSAgICBzaWduYXR1cmUgdmFsaWRhdGlvbjsgaXQgb25seSBsb29rcyBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlLgotICA8L3A+Ci0gIDxwPgotICAgIFRoaXMgY29uZGl0aW9uIHdhcyBhZGRlZCBpbiBBcGFjaGUgQW50IDEuNy4KLSAgPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGg0IGlkPSJpc3NpZ25lZCI+aXNzaWduZWQ8L2g0PgorPHA+VGVzdCB3aGV0aGVyIGEgamFyZmlsZSBpcyBzaWduZWQuICBJZiB0aGUgbmFtZSBvZiB0aGUgc2lnbmF0dXJlIGlzIHBhc3NlZCwgdGhlIGZpbGUgaXMgY2hlY2tlZAorZm9yIHByZXNlbmNlIG9mIHRoYXQgcGFydGljdWxhciBzaWduYXR1cmU7IG90aGVyd2lzZSB0aGUgZmlsZSBpcyBjaGVja2VkIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueQorc2lnbmF0dXJlLiBJdCBkb2VzIG5vdCBwZXJmb3JtIHJpZ29yb3VzIHNpZ25hdHVyZSB2YWxpZGF0aW9uOyBpdCBvbmx5IGxvb2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgYQorc2lnbmF0dXJlLjwvcD4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+LjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIGphcmZpbGUgdGhhdCBpcyB0byBiZSB0ZXN0ZWQgZm9yIHRoZSBwcmVzZW5jZQotICAgICAgb2YgYSBzaWduYXR1cmUuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgamFyZmlsZSB0aGF0IGlzIHRvIGJlIHRlc3RlZCBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc2lnbmF0dXJlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IFRoZSBzaWduYXR1cmUgbmFtZSB0byBjaGVjayBmb3IuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBzaWduYXR1cmUgbmFtZSB0byBjaGVjayBmb3IuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8L3RhYmxlPgorPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9ImlzZmlsZXNlbGVjdGVkIj5pc2ZpbGVzZWxlY3RlZDwvYT48L2g0PgotICA8cD4KLSAgICBUZXN0IHdoZXRoZXIgYSBmaWxlIHBhc3NlcyBhbiBlbWJlZGRlZAotICAgIDxhIGhyZWY9Ii4uL1R5cGVzL3NlbGVjdG9ycy5odG1sIj5zZWxlY3RvcjwvYT4uCi0gIDwvcD4KLSAgPHA+Ci0gICAgVGhpcyBjb25kaXRpb24gd2FzIGFkZGVkIGluIEFwYWNoZSBBbnQgMS42LjMuCi0gIDwvcD4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoNCBpZD0iaXNmaWxlc2VsZWN0ZWQiPmlzZmlsZXNlbGVjdGVkPC9oND4KKzxwPlRlc3Qgd2hldGhlciBhIGZpbGUgcGFzc2VzIGFuIGVtYmVkZGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3NlbGVjdG9ycy5odG1sIj5zZWxlY3RvcjwvYT4uPC9wPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42LjM8L2VtPi48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSBmaWxlIHRvIGNoZWNrIGlmIGlzIHBhc3NlcyB0aGUgZW1iZWRkZWQgc2VsZWN0b3IuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBjaGVjayBpZiBpcyBwYXNzZXMgdGhlIGVtYmVkZGVkIHNlbGVjdG9yLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSBmb3IgbmFtZSBiYXNlZCBzZWxlY3RvcnMuIEl0IHRoaXMgaXMgbm90IHNldCwKLSAgICAgIHRoZSBwcm9qZWN0J3MgYmFzZWRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YmFzZWRpcjwvdGQ+CisgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSB0byB1c2UgZm9yIG5hbWUgYmFzZWQgc2VsZWN0b3JzLiBJdCB0aGlzIGlzIG5vdCBzZXQsIHRoZQorICAgICAgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPiB3aWxsIGJlIHVzZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8L3RhYmxlPgotICA8cD4KLSAgICBFeGFtcGxlIHVzYWdlOgotICA8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPC90YWJsZT4KKzxwPkV4YW1wbGUgdXNhZ2U6PC9wPgorPHByZT4KICZsdDtpc2ZpbGVzZWxlY3RlZCBmaWxlPSJhLnhtbCImZ3Q7CiAgICZsdDtkYXRlIGRhdGV0aW1lPSIwNi8yOC8yMDAwIDI6MDIgcG0iIHdoZW49ImVxdWFsIi8mZ3Q7Ci0mbHQ7L2lzZmlsZXNlbGVjdGVkJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9pc2ZpbGVzZWxlY3RlZCZndDs8L3ByZT4KIAotPGg0PjxhIG5hbWU9InR5cGVmb3VuZCI+dHlwZWZvdW5kPC9hPjwvaDQ+Cis8aDQgaWQ9InR5cGVmb3VuZCI+dHlwZWZvdW5kPC9oND4KIAotPHA+VGVzdCB3aGV0aGVyIGEgZ2l2ZW4gdHlwZSBpcyBkZWZpbmVkLCBhbmQgdGhhdAotaXRzIGltcGxlbWVudGF0aW9uIGNsYXNzIGNhbiBiZSBsb2FkZWQuIFR5cGVzIGluY2x1ZGUKLXRhc2tzLCBkYXRhdHlwZXMsIHNjcmlwdGRlZnMsIG1hY3JvZGVmcyBhbmQgcHJlc2V0ZGVmcy48L3A+Cis8cD5UZXN0IHdoZXRoZXIgYSBnaXZlbiB0eXBlIGlzIGRlZmluZWQsIGFuZCB0aGF0IGl0cyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBjYW4gYmUgbG9hZGVkLiBUeXBlcworaW5jbHVkZSB0YXNrcywgZGF0YXR5cGVzLCBzY3JpcHRkZWZzLCBtYWNyb2RlZnMgYW5kIHByZXNldGRlZnMuPC9wPgogCi08cD5UaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuPC9wPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT4uPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiB0aGUgdHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgdHlwZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIHR5cGUgbGl2ZXMgaW4uCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dXJpPC90ZD4KKyAgICA8dGQ+VGhlIFVSSSB0aGF0IHRoaXMgdHlwZSBsaXZlcyBpbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0gIDxwPgotICAgIEV4YW1wbGUgdXNhZ2VzOgotICA8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHA+RXhhbXBsZSB1c2FnZXM6PC9wPgorPHByZT4KICZsdDt0eXBlZm91bmQgbmFtZT0ianVuaXQiLyZndDsKLSZsdDt0eXBlZm91bmQgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIG5hbWU9ImFydGlmYWN0Ii8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7dHlwZWZvdW5kIHVyaT0iYW50bGliOm9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuYW50IiBuYW1lPSJhcnRpZmFjdCIvJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0ic2NyaXB0Y29uZGl0aW9uIj5zY3JpcHRjb25kaXRpb248L2E+PC9oND4KKzxoNCBpZD0ic2NyaXB0Y29uZGl0aW9uIj5zY3JpcHRjb25kaXRpb248L2g0PgogCi08cD5FdmFsdWF0ZSBhIGNvbmRpdGlvbiBiYXNlZCBvbiBhIHNjcmlwdCBpbiBhbnkKLTxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIiB0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+Ci0gIG9yCi0gIDxhIGhyZWY9Imh0dHBzOi8vc2NyaXB0aW5nLmRldi5qYXZhLm5ldCI+SlNSIDIyMzwvYT4KLXN1cHBvcnRlZCBsYW5ndWFnZS4KLTwvcD4KLTxwPgotU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+U2NyaXB0PC9hPiB0YXNrIGZvcgotYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzLgotPC9wPgorPHA+RXZhbHVhdGUgYSBjb25kaXRpb24gYmFzZWQgb24gYSBzY3JpcHQgaW4gYW55IDxhIGhyZWY9Imh0dHBzOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZiIKK3RhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KK29yIDxhIGhyZWY9Imh0dHBzOi8vamNwLm9yZy9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9tYWludGVuYW5jZS9qc3IyMjMvMjIzQ2hhbmdlTG9nLmh0bWwiCit0YXJnZXQ9Il90b3AiPkpTUiAyMjM8L2E+IHN1cHBvcnRlZCBsYW5ndWFnZS48L3A+Cis8cD5TZWUgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+IHRhc2sgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHNjcmlwdHMgYW5kCitkZXBlbmRlbmNpZXMuPC9wPgogCi08cD5UaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuPC9wPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT4uPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxhbmd1YWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNjcmlwdCBsYW5ndWFnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5sYW5ndWFnZTwvdGQ+CisgICAgPHRkPnNjcmlwdCBsYW5ndWFnZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgICAgZm9yIHVzaW5nIHRoaXMgYXR0cmlidXRlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgaXMgImF1dG8iPC90ZD4KKyAgICA8dGQ+bWFuYWdlcjwvdGQ+CisgICAgPHRkPlRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLiAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+YXV0bzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0IGJvb2xlYW4gdmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLWRlZmF1bHQgaXMgImZhbHNlIjwvdGQ+Ci0gIDwvdHI+ICAKLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVuYW1lIG9mIHNjcmlwdCBzb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPmRlZmF1bHQgYm9vbGVhbiB2YWx1ZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNldGJlYW5zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdG8gaGF2ZSBhbGwgcHJvcGVydGllcywgcmVmZXJlbmNlcyBhbmQgdGFyZ2V0cyBhcwotICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc2NyaXB0LiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzICJ0cnVlIi48L3RkPgorICAgIDx0ZD5zcmM8L3RkPgorICAgIDx0ZD5maWxlbmFtZSBvZiBzY3JpcHQgc291cmNlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgc291cmNlLiA8ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEKLSAgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zZXRiZWFuczwvdGQ+CisgICAgPHRkPndoZXRoZXIgdG8gaGF2ZSBhbGwgcHJvcGVydGllcywgcmVmZXJlbmNlcyBhbmQgdGFyZ2V0cyBhcyBnbG9iYWwgdmFyaWFibGVzIGluIHRoZQorICAgICAgc2NyaXB0LiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gcGFzcyBpbnRvIHRoZSBzY3JpcHQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGgKKyAgICBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+CiA8aDY+Y2xhc3NwYXRoPC9oNj4KLSAgPHA+Ci0gICAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCi0gICAgZm9yIHVzaW5nIHRoaXMgbmVzdGVkIGVsZW1lbnQuCi0gIDwvcD4KKzxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzayBmb3IgdXNpbmcgdGhpcyBuZXN0ZWQgZWxlbWVudC48L3A+CiA8aDU+RGVzY3JpcHRpb248L2g1PgotPHA+Ci1UaGUgc2NyaXB0IHN1cHBvcnRzIHNjcmlwdCBsYW5ndWFnZSBpbmxpbmUsIHRoaXMgc2NyaXB0IGhhcyBhY2Nlc3MgdG8gdGhlCi1zYW1lIGJlYW5zIGFzIHRoZSA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4gdGFzaywgYW5kIHRvIHRoZSA8Y29kZT5zZWxmPC9jb2RlPiBiZWFuLAotd2hpY2ggcmVmZXJzIGJhY2sgdG8gdGhlIGNvbmRpdGlvbiBpdHNlbGYuIElmIHRoZSBzY3JpcHQgZXZhbHVhdGVzIHRvIGEgYm9vbGVhbiByZXN1bHQsCi10aGlzIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvbmRpdGlvbidzIGV2YWx1YXRpb24gKDxlbT5zaW5jZSBBbnQgMS43LjE8L2VtPikuCi1BbHRlcm5hdGl2ZWx5LCA8Y29kZT5zZWxmLnZhbHVlPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGV2YWx1YXRpb24gcmVzdWx0LgotPC9wPgotPHA+Ci1FeGFtcGxlOgotPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZSBzY3JpcHQgc3VwcG9ydHMgc2NyaXB0IGxhbmd1YWdlIGlubGluZSwgdGhpcyBzY3JpcHQgaGFzIGFjY2VzcyB0byB0aGUgc2FtZSBiZWFucyBhcwordGhlIDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPiB0YXNrLCBhbmQgdG8gdGhlIDxjb2RlPnNlbGY8L2NvZGU+IGJlYW4sIHdoaWNoIHJlZmVycyBiYWNrIHRvIHRoZQorY29uZGl0aW9uIGl0c2VsZi4gSWYgdGhlIHNjcmlwdCBldmFsdWF0ZXMgdG8gYSBib29sZWFuIHJlc3VsdCwgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24ncworZXZhbHVhdGlvbiAoPGVtPnNpbmNlIEFudCAxLjcuMTwvZW0+KS4gIEFsdGVybmF0aXZlbHksIDxjb2RlPnNlbGYudmFsdWU8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHNldAordGhlIGV2YWx1YXRpb24gcmVzdWx0LjwvcD4KKzxwPkV4YW1wbGU6PC9wPgorPHByZT4KICZsdDtzY3JpcHRjb25kaXRpb24gbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OwogICAgICAgICB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwogICAgIHNlbGYuc2V0VmFsdWUoZmFsc2UpOwotJmx0Oy9zY3JpcHRjb25kaXRpb24mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3NjcmlwdGNvbmRpdGlvbiZndDs8L3ByZT4KIAotU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29uZGl0aW9uIHRvIHRydWUsIHRoZW4gaW4gdGhlIHNjcmlwdCwgCi1zZXRzIHRoZSB2YWx1ZSB0byBmYWxzZS4gVGhpcyBjb25kaXRpb24gYWx3YXlzIGV2YWx1YXRlcyB0byAiZmFsc2UiCis8cD5TZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb25kaXRpb24gdG8gPHE+dHJ1ZTwvcT4sIHRoZW4gaW4gdGhlIHNjcmlwdCwgc2V0cyB0aGUgdmFsdWUKK3RvIDxxPmZhbHNlPC9xPi4gVGhpcyBjb25kaXRpb24gYWx3YXlzIGV2YWx1YXRlcyB0byA8cT5mYWxzZTwvcT4uPC9wPgogCi08aDQ+PGEgbmFtZT0icGFyc2Vyc3VwcG9ydHMiPnBhcnNlcnN1cHBvcnRzPC9hPjwvaDQ+Cis8aDQgaWQ9InBhcnNlcnN1cHBvcnRzIj5wYXJzZXJzdXBwb3J0czwvaDQ+CiAKLTxwPlRlc3RzIHdoZXRoZXIgQW50J3MgWE1MIHBhcnNlciBzdXBwb3J0cyBhIGdpdmVuCi1mZWF0dXJlIG9yIHByb3BlcnR5LCBhcyBwZXIgdGhlIFNBWC9KQVhQIHNwZWNpZmljYXRpb25zLCBieQotYXR0ZW1wdGluZyB0byBzZXQgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5L2ZlYXR1cmUvPC9wPgorPHA+VGVzdHMgd2hldGhlciBBbnQncyBYTUwgcGFyc2VyIHN1cHBvcnRzIGEgZ2l2ZW4gZmVhdHVyZSBvciBwcm9wZXJ0eSwgYXMgcGVyIHRoZSBTQVgvSkFYUAorc3BlY2lmaWNhdGlvbnMsIGJ5IGF0dGVtcHRpbmcgdG8gc2V0IHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0eS9mZWF0dXJlPC9wPgogCi08cD5UaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuPC9wPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT4uPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5IHRvIHNldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5vbmUgb2YgcHJvcGVydHkgb3IgZmVhdHVyZTwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+cHJvcGVydHkgdG8gc2V0PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZlYXR1cmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmVhdHVyZSB0byBzZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+b25lIG9mIHByb3BlcnR5IG9yIGZlYXR1cmU8L3RkPgorICAgIDx0ZD5mZWF0dXJlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmZlYXR1cmUgdG8gc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaW5nIChwcm9wZXJ0eSkgb3IgYm9vbGVhbiAoZmVhdHVyZSk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Rm9yIHByb3BlcnR5IHRlc3RzLCBidXQgbm90IGZvciBmZWF0dXJlIHRlc3RzPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5zdHJpbmcgKHByb3BlcnR5KSBvciBib29sZWFuIChmZWF0dXJlKTwvdGQ+CisgICAgPHRkPkZvciBwcm9wZXJ0eSB0ZXN0cywgYnV0IG5vdCBmb3IgZmVhdHVyZSB0ZXN0czwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08YmxvY2txdW90ZT48cHJlPgotJmx0O3BhcnNlcnN1cHBvcnRzIGZlYXR1cmU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIi8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1DaGVjayBmb3IgbmFtZXNwYWNlIHN1cHBvcnQuIEFsbCBTQVgyIHBhcnNlcnMgc2hvdWxkIGhhdmUgdGhpcy4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPiZsdDtwYXJzZXJzdXBwb3J0cyBmZWF0dXJlPSJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIvJmd0OzwvcHJlPgorPHA+Q2hlY2sgZm9yIG5hbWVzcGFjZSBzdXBwb3J0LiBBbGwgU0FYMiBwYXJzZXJzIHNob3VsZCBoYXZlIHRoaXMuPC9wPgorCis8cHJlPgogJmx0O29yJmd0OwogICAmbHQ7cGFyc2Vyc3VwcG9ydHMKICAgICBmZWF0dXJlPSJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLyZndDsKICAgJmx0O3BhcnNlcnN1cHBvcnRzCiAgICAgZmVhdHVyZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL3NjaGVtYVNvdXJjZSIvJmd0OwotJmx0Oy9vciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotQ2hlY2sgZm9yIFhNTCBTY2hlbWEgc3VwcG9ydC4KKyZsdDsvb3ImZ3Q7PC9wcmU+Cis8cD5DaGVjayBmb3IgWE1MIFNjaGVtYSBzdXBwb3J0LjwvcD4KIAogPHByZT4KICZsdDtwYXJzZXJzdXBwb3J0cwogICBwcm9wZXJ0eT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCi0gIHZhbHVlPSJkb2N1bWVudC54c2QiLyZndDsKLTwvcHJlPgorICB2YWx1ZT0iZG9jdW1lbnQueHNkIi8mZ3Q7PC9wcmU+Cis8cD5DaGVjayBmb3IgWGVyY2VzLXNwZWNpZmljIGRlZmluaXRpb24gb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBubyBuYW1lc3BhY2Ugc2NoZW1hLjwvcD4KIAotQ2hlY2sgZm9yIFhlcmNlcy1zcGVjaWZpYyBkZWZpbml0aW9uIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgbm8gbmFtZXNwYWNlIHNjaGVtYS4KKzxoNCBpZD0iaXNyZWFjaGFibGUiPmlzcmVhY2hhYmxlPC9oND4KIAotPGg0PjxhIG5hbWU9ImlzcmVhY2hhYmxlIj5pc3JlYWNoYWJsZTwvYT48L2g0PgorPHA+VXNlcyBKYXZhIDUrIG5ldHdvcmtpbmcgQVBJcyB0byBwcm9iZSBmb3IgYSAocmVtb3RlKSBzeXN0ZW0gYmVpbmcgcmVhY2hhYmxlLiBFeGFjdGx5IHdoYXQgcHJvYmUKK21lY2hhbmlzbXMgYXJlIHVzZWQgaXMgYW4gaW1wbGVtZW50YXRpb24gZmVhdHVyZSBvZiB0aGUgSlZNLiBUaGV5IG1heSBpbmNsdWRlIElDTVAgInBpbmciIHBhY2tldHMsCitVRFAgb3IgVENQIGNvbm5lY3Rpb25zIHRvIHBvcnQgNyAiZWNobyBzZXJ2aWNlIiBvciBvdGhlciBtZWFucy48L3A+Cis8cD5UaGlzIGNvbmRpdGlvbiB0dXJucyB1bmtub3duIGhvc3QgZXhjZXB0aW9ucyBpbnRvIGZhbHNlIGNvbmRpdGlvbnMuIFRoaXMgaXMgYmVjYXVzZSBvbiBhIGxhcHRvcCwKK0ROUyBpcyBvbmUgb2YgdGhlIGZpcnN0IHNlcnZpY2VzIHdoZW4gdGhlIG5ldHdvcmsgZ29lczsgeW91IGFyZSBpbXBsaWNpdGx5IG9mZmxpbmUuPC9wPgorPHA+SWYgYSBVUkwgaXMgc3VwcGxpZWQgaW5zdGVhZCBvZiBhIDx2YXI+aG9zdDwvdmFyPiwgdGhlIGhvc3RuYW1lIGlzIGV4dHJhY3RlZCBhbmQgdXNlZCBpbiB0aGUKK3Rlc3QmbWRhc2g7YWxsIG90aGVyIHBhcnRzIG9mIHRoZSBVUkwgYXJlIGRpc2NhcmRlZC48L3A+Cis8cD5UaGUgdGVzdCBtYXkgbm90IHdvcmsgdGhyb3VnaCBmaXJld2FsbHMsIHRoYXQgaXMsIHNvbWV0aGluZyBtYXkgYmUgcmVhY2hhYmxlIHVzaW5nIGEgcHJvdG9jb2wKK3N1Y2ggYXMgSFRUUCwgd2hpbGUgdGhlIGxvd2VyIGxldmVsIElDTVAgcGFja2V0cyBnZXQgZHJvcHBlZCBvbiB0aGUgZmxvb3IuIFNpbWlsYXJseSwgYSBob3N0IG1heQorZGV0ZWN0ZWQgYXMgcmVhY2hhYmxlIHdpdGggSUNNUCwgYnV0IG5vdCByZWFjaGFibGUgb24gb3RoZXIgcG9ydHMgKGkuZS4gcG9ydCA4MCksIGJlY2F1c2Ugb2YKK2ZpcmV3YWxscy48L3A+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPi48L3A+CiAKLTxwPlVzZXMgSmF2YTEuNSsgbmV0d29ya2luZyBBUElzIHRvIHByb2JlIGZvciBhIChyZW1vdGUpIHN5c3RlbSBiZWluZwotcmVhY2hhYmxlLiBFeGFjdGx5IHdoYXQgcHJvYmUgbWVjaGFuaXNtcyBhcmUgdXNlZCBpcyBhbiBpbXBsZW1lbnRhdGlvbgotZmVhdHVyZSBvZiB0aGUgSlZNLiBUaGV5IG1heSBpbmNsdWRlIElDTVAgInBpbmciIHBhY2tldHMsIFVEUCBvciBUQ1AgY29ubmVjdGlvbnMKLXRvIHBvcnQgNyAiZWNobyBzZXJ2aWNlIiBvciBvdGhlciBtZWFucy4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAKLTwvcD4KLTxwPgotVGhpcyBjb25kaXRpb24gdHVybnMgdW5rbm93biBob3N0IGV4Y2VwdGlvbnMgaW50byBmYWxzZSBjb25kaXRpb25zLiBUaGlzIGlzCi1iZWNhdXNlIG9uIGEgbGFwdG9wLCBETlMgaXMgb25lIG9mIHRoZSBmaXJzdCBzZXJ2aWNlcyB3aGVuIHRoZSBuZXR3b3JrIGdvZXM7IHlvdQotYXJlIGltcGxpY2l0bHkgb2ZmbGluZS4KLTwvcD4KLTxwPgotIElmIGEgVVJMIGlzIHN1cHBsaWVkIGluc3RlYWQgb2YgYSBob3N0LCB0aGUgaG9zdG5hbWUgaXMgZXh0cmFjdGVkCi0gYW5kIHVzZWQgaW4gdGhlIHRlc3QgLSBhbGwgb3RoZXIgcGFydHMgb2YgdGhlIFVSTCBhcmUgZGlzY2FyZGVkLgotPC9wPgotPHA+Ci1UaGUgdGVzdCBtYXkgbm90IHdvcmsgdGhyb3VnaCBmaXJld2FsbHMsIHRoYXQgaXMsIHNvbWV0aGluZyBtYXkgYmUgcmVhY2hhYmxlCi11c2luZyBhIHByb3RvY29sIHN1Y2ggYXMgSFRUUCwgd2hpbGUgdGhlIGxvd2VyIGxldmVsIElDTVAgcGFja2V0cyBnZXQgZHJvcHBlZAotb24gdGhlIGZsb29yLiBTaW1pbGFybHksIGEgaG9zdCBtYXkgZGV0ZWN0ZWQgYXMgcmVhY2hhYmxlIHdpdGggSUNNUCwgYnV0Ci1ub3QgcmVhY2hhYmxlIG9uIG90aGVyIHBvcnRzIChpLmUuIHBvcnQgODApLCBiZWNhdXNlIG9mIGZpcmV3YWxscy4KLTwvcD4KLTxwPgotCi1UaGlzIGNvbmRpdGlvbiB3YXMgYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aG9zdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ob3N0IHRvIGNoZWNrIGZvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5vbmUgb2YgdXJsIG9yIGhvc3Q8L3RkPgorICAgIDx0ZD5ob3N0PC90ZD4KKyAgICA8dGQ+aG9zdCB0byBjaGVjayBmb3I8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVSTCBjb250YWluaW5nIGhvc3RuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm9uZSBvZiB1cmwgb3IgaG9zdDwvdGQ+CisgICAgPHRkPnVybDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5VUkwgY29udGFpbmluZyBob3N0bmFtZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dCBpbiBzZWNvbmRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPm5vLCBkZWZhdWx0IGlzIDMwczwvdGQ+CisgICAgPHRkPnRpbWVvdXQ8L3RkPgorICAgIDx0ZD50aW1lb3V0IGluIHNlY29uZHM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4zMDwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7Y29uZGl0aW9uIHByb3BlcnR5PSJvZmZsaW5lIiZndDsKLSAgJmx0O2lzcmVhY2hhYmxlIHVybD0iaHR0cDovL2liaWJsaW8ub3JnL21hdmVuLyIgLyZndDsKLSZsdDsvY29uZGl0aW9uJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorICAmbHQ7aXNyZWFjaGFibGUgdXJsPSJodHRwczovL2liaWJsaW8ub3JnL21hdmVuLyIvJmd0OworJmx0Oy9jb25kaXRpb24mZ3Q7PC9wcmU+CiAKLTxwPgotUHJvYmUgZm9yIHRoZSBtYXZlbiByZXBvc2l0b3J5IGJlaW5nIHJlYWNoYWJsZS4KLTwvcD4KKzxwPlByb2JlIGZvciB0aGUgTWF2ZW4gcmVwb3NpdG9yeSBiZWluZyByZWFjaGFibGUuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtjb25kaXRpb24gcHJvcGVydHk9Im9mZmxpbmUiJmd0OwotICAmbHQ7aXNyZWFjaGFibGUgaG9zdD0iaWJpYmxpby5vcmciIHRpbWVvdXQ9IjEwIiAvJmd0OwotJmx0Oy9jb25kaXRpb24mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CisgICZsdDtpc3JlYWNoYWJsZSBob3N0PSJpYmlibGlvLm9yZyIgdGltZW91dD0iMTAiLyZndDsKKyZsdDsvY29uZGl0aW9uJmd0OzwvcHJlPgogCi08cD4KLVByb2JlIGZvciB0aGUgbWF2ZW4gcmVwb3NpdG9yeSBiZWluZyByZWFjaGFibGUgdXNpbmcgdGhlIGhvc3RuYW1lLCB0ZW4gc2Vjb25kIHRpbWVvdXQuLgotPC9wPgorPHA+UHJvYmUgZm9yIHRoZSBNYXZlbiByZXBvc2l0b3J5IGJlaW5nIHJlYWNoYWJsZSB1c2luZyB0aGUgaG9zdG5hbWUsIHRlbiBzZWNvbmQgdGltZW91dC48L3A+CiAKLTxoND48YSBuYW1lPSJsZW5ndGgiPmxlbmd0aDwvYT48L2g0PgotPHA+VGhpcyBjb25kaXRpb24gaXMgYSBmYWNldCBvZiB0aGUgPGEgaHJlZj0ibGVuZ3RoLmh0bWwiPkxlbmd0aDwvYT4gdGFzay4KLSAgSXQgaXMgdXNlZCB0byB0ZXN0IHRoZSBsZW5ndGggb2YgYSBzdHJpbmcgb3Igb25lIG9yIG1vcmUgZmlsZXMuCi0gIDxiPlNpbmNlIEFudCAxLjYuMzwvYj4KLTwvcD4KKzxoNCBpZD0ibGVuZ3RoIj5sZW5ndGg8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+PC9wPgorPHA+VGhpcyBjb25kaXRpb24gaXMgYSBmYWNldCBvZiB0aGUgPGEgaHJlZj0ibGVuZ3RoLmh0bWwiPkxlbmd0aDwvYT4gdGFzay4gSXQgaXMgdXNlZCB0byB0ZXN0IHRoZQorbGVuZ3RoIG9mIGEgc3RyaW5nIG9yIG9uZSBvciBtb3JlIGZpbGVzLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtsZW5ndGggc3RyaW5nPSIgZm9vICIgdHJpbT0idHJ1ZSIgbGVuZ3RoPSIzIiAvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHByZT4mbHQ7bGVuZ3RoIHN0cmluZz0iIGZvbyAiIHRyaW09InRydWUiIGxlbmd0aD0iMyIvJmd0OzwvcHJlPgogPHA+VmVyaWZ5IGEgc3RyaW5nIGlzIG9mIGEgY2VydGFpbiBsZW5ndGguPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgotJmx0O2xlbmd0aCBmaWxlPSZxdW90O2ZvbyZxdW90OyB3aGVuPSZxdW90O2dyZWF0ZXImcXVvdDsgbGVuZ3RoPSZxdW90OzAmcXVvdDsgLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlZlcmlmeSB0aGF0IGZpbGUgPGk+Zm9vPC9pPiBpcyBub3QgZW1wdHkuPC9wPgorPHByZT4mbHQ7bGVuZ3RoIGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7IHdoZW49JnF1b3Q7Z3JlYXRlciZxdW90OyBsZW5ndGg9JnF1b3Q7MCZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5WZXJpZnkgdGhhdCBmaWxlIDxzYW1wPmZvbzwvc2FtcD4gaXMgbm90IGVtcHR5LjwvcD4KIAotPGg0PjxhIG5hbWU9ImlzZmFpbHVyZSI+aXNmYWlsdXJlPC9hPjwvaDQ+Cis8aDQgaWQ9ImlzZmFpbHVyZSI+aXNmYWlsdXJlPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+Cis8cD5UZXN0IHRoZSByZXR1cm4gY29kZSBvZiBhbiBleGVjdXRhYmxlIChzZWUgdGhlIDxhIGhyZWY9ImV4ZWMuaHRtbCI+RXhlYzwvYT4gdGFzaykgZm9yCitmYWlsdXJlLjwvcD4KIAotPHA+VGVzdCB0aGUgcmV0dXJuIGNvZGUgb2YgYW4gZXhlY3V0YWJsZSAoc2VlIHRoZQotPGEgaHJlZj0iZXhlYy5odG1sIj5FeGVjPC9hPiB0YXNrKSBmb3IgZmFpbHVyZS4gPGI+U2luY2UgQW50IDEuNzwvYj48L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29kZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmV0dXJuIGNvZGUgdG8gdGVzdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+Y29kZTwvdGQ+CisgICAgPHRkPlRoZSByZXR1cm4gY29kZSB0byB0ZXN0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+PGEgbmFtZT0icmVzb3VyY2Vjb3VudCI+cmVzb3VyY2Vjb3VudDwvYT48L2g0PgotPHA+VGhpcyBjb25kaXRpb24gaXMgYSBmYWNldCBvZiB0aGUKLSAgPGEgaHJlZj0icmVzb3VyY2Vjb3VudC5odG1sIj5SZXNvdXJjZUNvdW50PC9hPiB0YXNrLgotICBJdCBpcyB1c2VkIHRvIHRlc3QgdGhlIHNpemUgb2YgYSAKLSAgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT4uCi0gIDxiPlNpbmNlIEFudCAxLjc8L2I+Ci08L3A+Cis8aDQgaWQ9InJlc291cmNlY291bnQiPnJlc291cmNlY291bnQ8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKzxwPlRoaXMgY29uZGl0aW9uIGlzIGEgZmFjZXQgb2YgdGhlIDxhIGhyZWY9InJlc291cmNlY291bnQuaHRtbCI+UmVzb3VyY2VDb3VudDwvYT4gdGFzay4gIEl0IGlzIHVzZWQKK3RvIHRlc3QgdGhlIHNpemUgb2YgYSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZQorY29sbGVjdGlvbjwvYT4uPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgotJmx0O3Jlc291cmNlY291bnQgcmVmaWQ9JnF1b3Q7bXlyZXNvdXJjZWNvbGxlY3Rpb24mcXVvdDsgd2hlbj0mcXVvdDtncmVhdGVyJnF1b3Q7IGNvdW50PSZxdW90OzAmcXVvdDsgLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O3Jlc291cmNlY291bnQgcmVmaWQ9JnF1b3Q7bXlyZXNvdXJjZWNvbGxlY3Rpb24mcXVvdDsgd2hlbj0mcXVvdDtncmVhdGVyJnF1b3Q7IGNvdW50PSZxdW90OzAmcXVvdDsvJmd0OzwvcHJlPgogPHA+VmVyaWZ5IHRoYXQgYSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eS48L3A+CiAKLTxoND48YSBuYW1lPSJyZXNvdXJjZXNtYXRjaCI+cmVzb3VyY2VzbWF0Y2g8L2E+PC9oND4KLTxwPlRlc3QgcmVzb3VyY2VzIGZvciBtYXRjaGluZy4gTm9uZXhpc3RlbmNlIG9mIG9uZSBvciBtb3JlIHJlc291cmNlcyByZXN1bHRzIGluCi0iZmFsc2UiLCBhbHRob3VnaCBpZiBub25lIGV4aXN0cyB0aGV5IGFyZSBjb25zaWRlcmVkIGVxdWFsIGluIHRlcm1zIG9mIGNvbnRlbnQuCi1CeSBkZWZhdWx0IHRoaXMgdGVzdCBkb2VzIGEgYnl0ZSBmb3IgYnl0ZSBjb21wYXJpc29uLCBzbyB0ZXN0IHRpbWUgc2NhbGVzIHdpdGgKLWJ5dGUgc2l6ZS4gTkI6IGlmIHRoZSBmaWxlcyBhcmUgZGlmZmVyZW50IHNpemVzLCBvbmUgb2YgdGhlbSBpcyBtaXNzaW5nCi1vciB0aGUgZmlsZW5hbWVzIG1hdGNoIHRoZSBhbnN3ZXIgaXMgc28gb2J2aW91cyB0aGUgZGV0YWlsZWQgdGVzdCBpcyBvbWl0dGVkLgotVGhlIHJlc291cmNlcyB0byBjaGVjayBhcmUgc3BlY2lmaWVkIGFzIG5lc3RlZAotPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+LAotbWVhbmluZyB0aGF0IG1vcmUgdGhhbiB0d28gcmVzb3VyY2VzIGNhbiBiZSBjaGVja2VkOyBpbiB0aGlzIGNhc2UgYWxsIHJlc291cmNlcwotbXVzdCBtYXRjaC4gPGI+U2luY2UgQW50IDEuNzwvYj4KLTwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDQgaWQ9InJlc291cmNlc21hdGNoIj5yZXNvdXJjZXNtYXRjaDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorPHA+VGVzdCByZXNvdXJjZXMgZm9yIG1hdGNoaW5nLiBOb25leGlzdGVuY2Ugb2Ygb25lIG9yIG1vcmUgcmVzb3VyY2VzIHJlc3VsdHMgaW4gPHE+ZmFsc2U8L3E+LAorYWx0aG91Z2ggaWYgbm9uZSBleGlzdHMgdGhleSBhcmUgY29uc2lkZXJlZCBlcXVhbCBpbiB0ZXJtcyBvZiBjb250ZW50LiAgQnkgZGVmYXVsdCwgdGhpcyB0ZXN0IGRvZXMgYQorYnl0ZSBmb3IgYnl0ZSBjb21wYXJpc29uLCBzbyB0ZXN0IHRpbWUgc2NhbGVzIHdpdGggYnl0ZSBzaXplLiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IGlmIHRoZSBmaWxlcworYXJlIGRpZmZlcmVudCBzaXplcywgb25lIG9mIHRoZW0gaXMgbWlzc2luZyBvciB0aGUgZmlsZW5hbWVzIG1hdGNoIHRoZSBhbnN3ZXIgaXMgc28gb2J2aW91cyB0aGUKK2RldGFpbGVkIHRlc3QgaXMgb21pdHRlZC4gIFRoZSByZXNvdXJjZXMgdG8gY2hlY2sgYXJlIHNwZWNpZmllZCBhcworbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiwgbWVhbmluZyB0aGF0IG1vcmUgdGhhbgordHdvIHJlc291cmNlcyBjYW4gYmUgY2hlY2tlZDsgaW4gdGhpcyBjYXNlIGFsbCByZXNvdXJjZXMgbXVzdCBtYXRjaC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXN0ZXh0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaWdub3JlIGxpbmUgZW5kaW5ncwotICAgICAgICB3aGVuIGNvbXBhcmluZyByZXNvdXJjZSBjb250ZW50OyBkZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4sCi0gICAgICAgIHdoaWxlIDxpPnRydWU8L2k+IHRyaWdnZXJzIGEgYmluYXJ5IGNvbXBhcmlzb24uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5hc3RleHQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGlnbm9yZSBsaW5lIGVuZGluZ3Mgd2hlbiBjb21wYXJpbmcgcmVzb3VyY2UgY29udGVudDsgPHE+dHJ1ZTwvcT4gdHJpZ2dlcnMgYQorICAgICAgYmluYXJ5IGNvbXBhcmlzb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+PGEgbmFtZT0icmVzb3VyY2Vjb250YWlucyI+cmVzb3VyY2Vjb250YWluczwvYT48L2g0PgorPGg0IGlkPSJyZXNvdXJjZWNvbnRhaW5zIj5yZXNvdXJjZWNvbnRhaW5zPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPjwvcD4KIDxwPlRlc3RzIHdoZXRoZXIgYSByZXNvdXJjZSBjb250YWlucyBhIGdpdmVuIChzdWIpc3RyaW5nLjwvcD4KLTxwPlRoZSByZXNvdXJjZXMgdG8gY2hlY2sgYXJlIHNwZWNpZmllZCB2aWEgcmVmZXJlbmNlcyBvciAtIGluIHRoZQotICBjYXNlIG9mIGZpbGUgcmVzb3VyY2VzIHZpYSB0aGUgcmVzb3VyY2UgYXR0cmlidXRlLiAgPGI+U2luY2UgQW50IDEuNy4xPC9iPgotPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSByZXNvdXJjZXMgdG8gY2hlY2sgYXJlIHNwZWNpZmllZCB2aWEgcmVmZXJlbmNlcyBvciZtZGFzaDtpbiB0aGUgY2FzZSBvZiBmaWxlCityZXNvdXJjZXMmbWRhc2g7dmlhIHRoZSA8dmFyPnJlc291cmNlPC92YXI+IGF0dHJpYnV0ZS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdGhhdCBpcyB0aGUgcmVzb3VyY2UgdG8gdGVzdC4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5PbmUgb2YgdGhlIHR3bzwvdGQ+CisgICAgPHRkPnJlc291cmNlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIGZpbGUgdGhhdCBpcyB0aGUgcmVzb3VyY2UgdG8gdGVzdC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UmVmZXJlbmNlIHRvIGEgcmVzb3VyY2UgZGVmaW5lZCBpbnNpZGUgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8dGQ+cmVmaWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+UmVmZXJlbmNlIHRvIGEgcmVzb3VyY2UgZGVmaW5lZCBpbnNpZGUgdGhlIHByb2plY3QuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3Vic3RyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3Vic3RyaW5nPC90ZD4KKyAgICA8dGQ+VGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24uICBEZWZhdWx0IGlzCi0gICAgICAgIHRydWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgPHRkPlBlcmZvcm0gYSBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJoYXNtZXRob2QiPmhhc21ldGhvZDwvYT48L2g0PgorPGg0IGlkPSJoYXNtZXRob2QiPmhhc21ldGhvZDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorPHA+VGVzdHMgZm9yIGEgY2xhc3MgaGF2aW5nIGEgbWV0aG9kIG9yIGZpZWxkLiBJZiB0aGUgY2xhc3MgaXMgbm90IGZvdW5kIG9yIGZhaWxzIHRvIGxvYWQsIHRoZSBidWlsZAorZmFpbHMuPC9wPgogCi08cD4gVGVzdHMgZm9yIGEgY2xhc3MgaGF2aW5nIGEgbWV0aG9kIG9yIGZpZWxkLiBJZiB0aGUgY2xhc3MgaXMgbm90IGZvdW5kIAotICAgIG9yIGZhaWxzIHRvIGxvYWQsIHRoZSBidWlsZCBmYWlscy4gCi0gICAgCi0gICAgPGI+U2luY2UgQW50IDEuNzwvYj4KLTwvcD4KLQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9hZDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj55ZXM8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpZWxkPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIGEgZmllbGQgdG8gbG9vayBmb3I8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+b25lIG9mIGZpZWxkIG9yIG1ldGhvZDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWV0aG9kPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIGEgbWV0aG9kIHRvIGxvb2sgZm9yPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPm9uZSBvZiBmaWVsZCBvciBtZXRob2Q8L3RkPgotICAgIDwvdHI+Ci0gICAgCi0gICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZVN5c3RlbUNsYXNzZXM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3VsZCBzeXN0ZW0gY2xhc3NlcyBiZSBpZ25vcmVkPzwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtZGVmYXVsdCBpcyBmYWxzZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5hIGNsYXNzIHBhdGg8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmZXJlbmNlIHRvIGEgY2xhc3MgcGF0aDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPC90cj4KLTwvdGFibGU+Ci0KLTxwPgotICAgIFRoZXJlIGlzIGFsc28gYSBuZXN0ZWQgJmx0O2NsYXNzcGF0aCZndDsgZWxlbWVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSAKLSAgICBhIGNsYXNzcGF0aC4KLTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7aGFzbWV0aG9kIGNsYXNzbmFtZT0iamF2YS51dGlsLkFycmF5TGlzdCIgbWV0aG9kPSJ0cmltVG9TaXplIiAgLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+TG9va3MgZm9yIHRoZSBtZXRob2QgdHJpbVRvU2l6ZSBpbiB0aGUgQXJyYXlMaXN0IGNsYXNzLjwvcD4KLQotPGg0PjxhIG5hbWU9Im1hdGNoZXMiPm1hdGNoZXM8L2E+PC9oND4KLQotPHA+Ci0gIFRlc3QgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIKLSAgZXhwcmVzc2lvbiBwYXR0ZXJuLgotICA8Yj5TaW5jZSBBbnQgMS43PC9iPjwvcD4KLQotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB0byB0ZXN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5jbGFzc25hbWU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIHRoZSBjbGFzcyB0byBsb2FkPC90ZD4KKyAgICA8dGQ+eWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdXNlZCB0byB0ZXN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIHVubGVzcyB0aGVyZSBpcyBhIG5lc3RlZAotICAgICAgPGNvZGU+Jmx0O3JlZ2V4cCZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQ+ZmllbGQ8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmllbGQgdG8gbG9vayBmb3I8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5QZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgbWF0Y2guICBEZWZhdWx0IGlzCi0gICAgICAgIHRydWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bWV0aG9kPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPm5hbWUgb2YgYSBtZXRob2QgdG8gbG9vayBmb3I8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tdWx0aWxpbmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBQZXJmb3JtIGEgbXVsdGkgbGluZSBtYXRjaC4KLSAgICAgIERlZmF1bHQgaXMgZmFsc2UuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aWdub3JlU3lzdGVtQ2xhc3NlczwvdGQ+CisgICAgPHRkPnNob3VsZCBzeXN0ZW0gY2xhc3NlcyBiZSBpZ25vcmVkPzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNpbmdsZWxpbmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGlzIGFsbG93cyAnLicgdG8gbWF0Y2ggbmV3IGxpbmVzLgotICAgICAgU2luZ2xlTGluZSBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBtdWx0aWxpbmUsIFNpbmdsZUxpbmUgaXMgYSBwZXJsCi0gICAgICByZWdleCB0ZXJtLCBpdCBjb3JyZXNwb25kcyB0byBkb3RhbGwgaW4gamF2YSByZWdleC4KLSAgICAgIERlZmF1bHQgaXMgZmFsc2UuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+YSBjbGFzcyBwYXRoPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPnJlZmVyZW5jZSB0byBhIGNsYXNzIHBhdGg8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0gIDxwPgotICAgIFRoZXJlIGlzIGFsc28gYW4gb3B0aW9uYWwgJmx0O3JlZ2V4cCZndDsgZWxlbWVudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQotICAgIGEgcmVndWxhciBleHByZXNzaW9uIGluc3RlYWQgb2YgdGhlICJwYXR0ZXJuIiBhdHRyaWJ1dGUuCi0gICAgU2VlIDxhIGhyZWY9Ii4uL1R5cGVzL3JlZ2V4cC5odG1sIj5SZWdleHAgVHlwZTwvYT4gZm9yIHRoZSBkZXNjcmlwdGlvbgotICAgIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCByZWdleHAgYW5kIG9mCi0gICAgdGhlIGNob2ljZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uCi0gIDwvcD4KLSAgPHA+Ci0gICAgQW4gZXhhbXBsZToKLSAgPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZXJlIGlzIGFsc28gYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYQorY2xhc3NwYXRoLjwvcD4KKzxwcmU+Jmx0O2hhc21ldGhvZCBjbGFzc25hbWU9ImphdmEudXRpbC5BcnJheUxpc3QiIG1ldGhvZD0idHJpbVRvU2l6ZSIvJmd0OzwvcHJlPgorPHA+TG9va3MgZm9yIHRoZSBtZXRob2QgPGNvZGUgY2xhc3M9ImNvZGUiPnRyaW1Ub1NpemUoKTwvY29kZT4gaW4KK3RoZSA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLkFycmF5TGlzdDwvY29kZT4gY2xhc3MuPC9wPgorCis8aDQgaWQ9Im1hdGNoZXMiPm1hdGNoZXM8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKzxwPlRlc3QgaWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuPC9wPgorCis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnN0cmluZzwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgdG8gdGVzdC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnBhdHRlcm48L3RkPgorICAgIDx0ZD5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdXNlZCB0byB0ZXN0LjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkIDxjb2RlPiZsdDtyZWdleHAmZ3Q7PC9jb2RlPiBlbGVtZW50PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tdWx0aWxpbmU8L3RkPgorICAgIDx0ZD5QZXJmb3JtIGEgbXVsdGkgbGluZSBtYXRjaC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNpbmdsZWxpbmU8L3RkPgorICAgIDx0ZD5UaGlzIGFsbG93cyA8cT4uPC9xPiB0byBtYXRjaCBuZXcgbGluZXMuIDx2YXI+U2luZ2xlTGluZTwvdmFyPiBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aAorICAgICAgbXVsdGlsaW5lLCA8dmFyPlNpbmdsZUxpbmU8L3Zhcj4gaXMgYSBwZXJsIHJlZ2V4IHRlcm0sIGl0IGNvcnJlc3BvbmRzIHRvIDx2YXI+ZG90YWxsPC92YXI+IGluCisgICAgICBKYXZhIHJlZ2V4LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5UaGVyZSBpcyBhbHNvIGFuIG9wdGlvbmFsIDxjb2RlPiZsdDtyZWdleHAmZ3Q7PC9jb2RlPiBlbGVtZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEKK3JlZ3VsYXIgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIHRoZSA8dmFyPnBhdHRlcm48L3Zhcj4gYXR0cmlidXRlLgorU2VlIDxhIGhyZWY9Ii4uL1R5cGVzL3JlZ2V4cC5odG1sIj5SZWdleHAgVHlwZTwvYT4gZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgbmVzdGVkIGVsZW1lbnQgcmVnZXhwCithbmQgb2YgdGhlIGNob2ljZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uPC9wPgorPHA+QW4gZXhhbXBsZTo8L3A+Cis8cHJlPgogJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0ibGVnYWwtcGFzc3dvcmQiJmd0OwogICAmbHQ7bWF0Y2hlcyBwYXR0ZXJuPSJbMS05XSIgc3RyaW5nPSIke3VzZXItaW5wdXR9Ii8mZ3Q7CiAmbHQ7L2NvbmRpdGlvbiZndDsKICZsdDtmYWlsIG1lc3NhZ2U9IllvdXIgcGFzc3dvcmQgc2hvdWxkIGF0IGxlYXN0IGNvbnRhaW4gb25lIG51bWJlciIKLSAgICAgIHVubGVzcz0ibGVnYWwtcGFzc3dvcmQiLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLSAgPHA+Ci0gICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgdGhlIHByb3BlcnR5ICJvayIgaWYKLSAgICB0aGUgcHJvcGVydHkgImlucHV0IiBpcyB0aHJlZSBjaGFyYWN0ZXJzIGxvbmcsIHN0YXJ0aW5nCi0gICAgd2l0aCAnYScgYW5kIGVuZGluZyB3aXRoICdiJy4KLSAgPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyAgICAgIHVubGVzcz0ibGVnYWwtcGFzc3dvcmQiLyZndDs8L3ByZT4KKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5vazwvY29kZT4gaWYgdGhlIHByb3BlcnR5IDxjb2RlPmlucHV0PC9jb2RlPiBpcwordGhyZWUgY2hhcmFjdGVycyBsb25nLCBzdGFydGluZyB3aXRoIDxxPmE8L3E+IGFuZCBlbmRpbmcgd2l0aCA8cT5iPC9xPi48L3A+Cis8cHJlPgogJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0ib2siJmd0OwogICAmbHQ7bWF0Y2hlcyBzdHJpbmc9IiR7aW5wdXR9IiBwYXR0ZXJuPSJeYS5iJCIvJmd0OwotJmx0Oy9jb25kaXRpb24mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhIHJlZmVyZW5jZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yCi0gICAgbWF0Y2hpbmcgZGF0ZXMgYW5kIHRoZW4gdXNlcyBhbnR1bml0IHRvIGNoZWNrIGlmIHRoZQotICAgIHByb3BlcnR5ICJ0b2RheSIgaXMgaW4gdGhlIGNvcnJlY3QgZm9ybWF0OgotICA8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorJmx0Oy9jb25kaXRpb24mZ3Q7PC9wcmU+Cis8cD5UaGUgZm9sbG93aW5nIGRlZmluZXMgYSByZWZlcmVuY2UgcmVndWxhciBleHByZXNzaW9uIGZvciBtYXRjaGluZyBkYXRlcyBhbmQgdGhlbiB1c2VzIGFudHVuaXQgdG8KK2NoZWNrIGlmIHRoZSBwcm9wZXJ0eSA8Y29kZT50b2RheTwvY29kZT4gaXMgaW4gdGhlIGNvcnJlY3QgZm9ybWF0OjwvcD4KKzxwcmU+CiAmbHQ7cmVnZXhwIGlkPSJkYXRlLnBhdHRlcm4iIHBhdHRlcm49Il5bMDEyM11cZC1bMDFdXGQtWzEyXVxkXGRcZCQiLyZndDsKIAogJmx0O2F1OmFzc2VydFRydWUgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0IiZndDsKICAgJmx0O21hdGNoZXMgc3RyaW5nPSIke3RvZGF5fSImZ3Q7CiAgICAgJmx0O3JlZ2V4cCByZWZpZD0iZGF0ZS5wYXR0ZXJuIi8mZ3Q7CiAgICZsdDsvbWF0Y2hlcyZndDsKLSZsdDsvYXU6YXNzZXJ0VHJ1ZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLSAgPHA+Ci0gICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSB1c2Ugb2YgdGhlIHNpbmdsZWxpbmUgYW5kIHRoZSBjYXNlc2Vuc2l0aXZlCi0gICAgZmxhZ3MuCi0gIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+CismbHQ7L2F1OmFzc2VydFRydWUmZ3Q7PC9wcmU+Cis8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiB0aGUgPHZhcj5zaW5nbGVsaW5lPC92YXI+IGFuZCB0aGUgPHZhcj5jYXNlc2Vuc2l0aXZlPC92YXI+CitmbGFncy48L3A+Cis8cHJlPgogJmx0O2F1OmFzc2VydFRydWUmZ3Q7CiAgICZsdDttYXRjaGVzIHN0cmluZz0iQUIke2xpbmUuc2VwYXJhdG9yfUMiIHBhdHRlcm49Il5hYi4qQyQiCiAgICAgICAgICAgIGNhc2VzZW5zaXRpdmU9ImZhbHNlIgpAQCAtOTc1LDE1NiArODQyLDEyOCBAQAogICAmbHQ7bWF0Y2hlcyBzdHJpbmc9IkFCJHtsaW5lLnNlcGFyYXRvcn1DIiBwYXR0ZXJuPSJeYWIuKkMkIgogICAgICAgICAgICBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIKICAgICAgICAgICAgc2luZ2xlbGluZT0iZmFsc2UiLyZndDsKLSZsdDsvYXU6YXNzZXJ0RmFsc2UmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2F1OmFzc2VydEZhbHNlJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0iYW50dmVyc2lvbiI+YW50dmVyc2lvbjwvYT48L2g0PgotPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YQotaHJlZj0iYW50dmVyc2lvbi5odG1sIj5BbnR2ZXJzaW9uPC9hPiB0YXNrLCBhbGwgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkLCB0aGUgcHJvcGVydHkgYXR0cmlidXRlCi1pcyByZWR1bmRhbnQgYW5kIHdpbGwgYmUgaWdub3JlZC48L3A+Cis8aDQgaWQ9ImFudHZlcnNpb24iPmFudHZlcnNpb248L2g0PgorPHA+VGhpcyBjb25kaXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSA8YSBocmVmPSJhbnR2ZXJzaW9uLmh0bWwiPkFudHZlcnNpb248L2E+IHRhc2ssIGFsbCBhdHRyaWJ1dGVzCithcmUgc3VwcG9ydGVkLCB0aGUgPHZhcj5wcm9wZXJ0eTwvdmFyPiBhdHRyaWJ1dGUgaXMgcmVkdW5kYW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuPC9wPgogCis8aDQgaWQ9Imhhc2ZyZWVzcGFjZSI+aGFzZnJlZXNwYWNlPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KKzxwPlRlc3RzIGEgcGFydGl0aW9uIHRvIHNlZSBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuPC9wPgorPHA+TmVlZGVkIGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHN0YW5kYXJkIGNvbXB1dGluZyB0ZXJtczo8L3A+Cis8dWw+CisgIDxsaT5LIDogS2lsb2J5dGVzICgxMDI0IGJ5dGVzKTwvbGk+CisgIDxsaT5NIDogTWVnYWJ5dGVzICgxMDI0IEspPC9saT4KKyAgPGxpPkcgOiBHaWdhYnl0ZXMgKDEwMjQgTSk8L2xpPgorICA8bGk+VCA6IFRlcmFieXRlcyAoMTAyNCBHKTwvbGk+CisgIDxsaT5QIDogUGV0YWJ5dGVzICgxMDI0IFQpPC9saT4KKzwvdWw+CiAKLTxoND48YSBuYW1lPSJoYXNmcmVlc3BhY2UiPmhhc2ZyZWVzcGFjZTwvYT48L2g0PgotCi08cD4KLSAgVGVzdHMgYSBwYXJ0aXRpb24gdG8gc2VlIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZS4KLSAgPGI+U2luY2UgQW50IDEuNy4wPC9iPjwvcD4KLSAgPHA+TmVlZGVkIGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHN0YW5kYXJkIGNvbXB1dGluZyB0ZXJtczo8YnIvPgotICAgIDx1bD4KLSAgICAgIDxsaT5LIDogS2lsb2J5dGVzICgxMDI0IGJ5dGVzKTwvbGk+Ci0gICAgICA8bGk+TSA6IE1lZ2FieXRlcyAoMTAyNCBLKTwvbGk+Ci0gICAgICA8bGk+RyA6IEdpZ2FieXRlcyAoMTAyNCBNKTwvbGk+Ci0gICAgICA8bGk+VCA6IFRlcmFieXRlcyAoMTAyNCBHKTwvbGk+Ci0gICAgICA8bGk+UCA6IFBldGFieXRlcyAoMTAyNCBUKTwvbGk+Ci0gICAgPC91bD4KLSAgPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcnRpdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFydGl0aW9uIG9yIGZpbGVzeXN0ZW0gdG8gY2hlY2sgZm9yIGZyZWVzcGFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5wYXJ0aXRpb248L3RkPgorICAgIDx0ZD5UaGUgcGFydGl0aW9uIG9yIGZpbGVzeXN0ZW0gdG8gY2hlY2sgZm9yIGZyZWUgc3BhY2U8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uZWVkZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGFtb3VudCBvZiBmcmVlc3BhY2UgbmVlZGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5uZWVkZWQ8L3RkPgorICAgIDx0ZD5UaGUgYW1vdW50IG9mIGZyZWUgc3BhY2UgbmVlZGVkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotICA8cD4KLSAgICBBbiBleGFtcGxlOgotICA8L3A+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2hhc2ZyZWVzcGFjZSBwYXJ0aXRpb249ImM6IiBuZWVkZWQ9IjEwME0iLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkFuIGV4YW1wbGU6PC9wPgorPHByZT4mbHQ7aGFzZnJlZXNwYWNlIHBhcnRpdGlvbj0iYzoiIG5lZWRlZD0iMTAwTSIvJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0iaXNsYXN0bW9kaWZpZWQiPmlzbGFzdG1vZGlmaWVkPC9hPjwvaDQ+Cis8aDQgaWQ9ImlzbGFzdG1vZGlmaWVkIj5pc2xhc3Rtb2RpZmllZDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5UZXN0cyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIGEgcmVzb3VyY2UuPC9wPgogCi08cD5UZXN0cyB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIG9mIGEgcmVzb3VyY2UuICA8ZW0+U2luY2UgQW50Ci0xLjguMDwvZW0+PC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbGxpczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIGV4cGVjdGVkIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0IEphbiAxIDE5NzAuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZQotICAgICAgdHdvLjwvdGQ+CisgICAgPHRkPm1pbGxpczwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIHJlc291cmNlIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCBKYW4KKyAgICAgIDEgMTk3MC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZXRpbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBleHBlY3RlZCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUKLSAgICAgICByZXNvdXJjZS4gVGhlIHNwZWNpYWwgdmFsdWUgJnF1b3Q7bm93JnF1b3Q7IGluZGljYXRlcyB0aGUKLSAgICAgICBjdXJyZW50IHRpbWUuPC90ZD4KKyAgICA8dGQ+ZGF0ZXRpbWU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U3BlY2lmaWVzIHRoZSBleHBlY3RlZCBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgcmVzb3VyY2UuIFRoZSBzcGVjaWFsCisgICAgICB2YWx1ZSA8cT5ub3c8L3E+IGluZGljYXRlcyB0aGUgY3VycmVudCB0aW1lLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2ltcGxlRGF0ZUZvcm1hdC1jb21wYXRpYmxlIHBhdHRlcm4gc3RyaW5nLgotICAgICAgIERlZmF1bHRzIHRvIE1NL0REL1lZWVkgSEg6TU0gQU1fb3JfUE0gb3IgTU0vREQvWVlZWSBISDpNTTpTUyBBTV9vcl9QTS4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wYXR0ZXJuPC90ZD4KKyAgICA8dGQ+U2ltcGxlRGF0ZUZvcm1hdC1jb21wYXRpYmxlIHBhdHRlcm4gc3RyaW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5NTS9kZC9ZWVlZIGhoOm1tIGE8L3E+IG9yIDxxPk1NL2RkL1lZWVkgaGg6bW06c3MgYTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkhvdyB0byBjb21wYXJlIHRoZSB0aW1lc3RhbXAuICBBY2NlcHRlZCB2YWx1ZXMKLSAgICAgIGFyZSAiZXF1YWxzIiwgImJlZm9yZSIsICJub3QtYmVmb3JlIiwgImFmdGVyIiBhbmQgIm5vdC1hZnRlciIuCi0gICAgPHRkIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdHMgdG8gImVxdWFscyIuPC90ZD4KKyAgICA8dGQ+bW9kZTwvdGQ+CisgICAgPHRkPkhvdyB0byBjb21wYXJlIHRoZSB0aW1lc3RhbXAuICBBY2NlcHRlZCB2YWx1ZXMKKyAgICAgIGFyZSA8cT5lcXVhbHM8L3E+LCA8cT5iZWZvcmU8L3E+LCA8cT5ub3QtYmVmb3JlPC9xPiwgPHE+YWZ0ZXI8L3E+IGFuZCA8cT5ub3QtYWZ0ZXI8L3E+LgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZXF1YWxzPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8cD5UaGUgYWN0dWFsIHJlc291cmNlIHRvIHRlc3QgaXMgc3BlY2lmaWVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCi0gIDxwPgotICAgIEFuIGV4YW1wbGU6Ci0gIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5BbiBleGFtcGxlOjwvcD4KKzxwcmU+CiAmbHQ7aXNsYXN0bW9kaWZpZWQgZGF0ZVRpbWU9IjA4LzE4LzIwMDkgMDQ6NDE6MTkgQU0iIG1vZGU9Im5vdC1iZWZvcmUiJmd0OwogICAmbHQ7ZmlsZSBmaWxlPSIke2ZpbGV9Ii8mZ3Q7Ci0mbHQ7L2lzbGFzdG1vZGlmaWVkJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9pc2xhc3Rtb2RpZmllZCZndDs8L3ByZT4KIAotPGg0PjxhIG5hbWU9InJlc291cmNlZXhpc3RzIj5yZXNvdXJjZWV4aXN0czwvYT48L2g0PgotCi08cD5UZXN0cyBhIHJlc291cmNlIGZvciBleGlzdGVuY2UuICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8aDQgaWQ9InJlc291cmNlZXhpc3RzIj5yZXNvdXJjZWV4aXN0czwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5UZXN0cyBhIHJlc291cmNlIGZvciBleGlzdGVuY2UuPC9wPgogCiA8cD5UaGUgYWN0dWFsIHJlc291cmNlIHRvIHRlc3QgaXMgc3BlY2lmaWVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCi0gIDxwPgotICAgIEFuIGV4YW1wbGU6Ci0gIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5BbiBleGFtcGxlOjwvcD4KKzxwcmU+CiAmbHQ7cmVzb3VyY2VleGlzdHMmZ3Q7CiAgICZsdDtmaWxlIGZpbGU9IiR7ZmlsZX0iLyZndDsKLSZsdDsvcmVzb3VyY2VleGlzdHMmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3Jlc291cmNlZXhpc3RzJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0iamF2YXZlcnNpb24iPmphdmF2ZXJzaW9uPC9hPjwvaDQ+Cis8aDQgaWQ9ImphdmF2ZXJzaW9uIj5qYXZhdmVyc2lvbjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+PC9wPgorPHA+VGVzdHMgdGhlIHZlcnNpb24gb2YgdGhlIEpWTSBleGVjdXRpbmcgQW50LjwvcD4KIAotPHA+VGVzdHMgdGhlIHZlcnNpb24gb2YgdGhlIEpWTSBleGVjdXRpbmcgQW50LiAgPGVtPlNpbmNlIEFudAotMS45LjEwPC9lbT48L3A+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXRsZWFzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiB0aGF0IHRoaXMgSlZNIGlzIGF0IGxlYXN0LgotICAgICAgVGhlIGZvcm1hdCBpcyBtYWpvci5taW5vci5wb2ludC4gU3RhcnRpbmcgd2l0aCBKYXZhOSByZWFsbHkKLSAgICAgIG9ubHkgdGhlIG1ham9yIG51bWJlciBpcyBkZXRlcm1pbmVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIiBhbGlnbj0iY2VudGVyIj5PbmUgb2YgdGhlc2UuPC90ZD4KKyAgICA8dGQ+YXRsZWFzdDwvdGQ+CisgICAgPHRkPlRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBKVk0gaXMgb2YgYXQgbGVhc3QuIFRoZSBmb3JtYXQKKyAgICAgIGlzIDxjb2RlPm1ham9yLm1pbm9yLnBvaW50PC9jb2RlPi4gU3RhcnRpbmcgd2l0aCBKYXZhIDkgcmVhbGx5IG9ubHkgdGhlIG1ham9yIG51bWJlciBpcworICAgICAgZGV0ZXJtaW5lZC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhhY3RseTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiB0aGF0IHRoaXMgSlZNIGlzIGV4YWN0bHkuCi0gICAgICBUaGUgZm9ybWF0IGlzIDx0dD5tYWpvci5taW5vci5wb2ludDwvdHQ+LiBTdGFydGluZyB3aXRoIEphdmE5IHJlYWxseQotICAgICAgb25seSB0aGUgbWFqb3IgbnVtYmVyIGlzIGRldGVybWluZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhhY3RseTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgdmVyc2lvbiB0aGF0IHRoaXMgSlZNIGlzIG9mIGV4YWN0bHkuIFRoZSBmb3JtYXQKKyAgICAgIGlzIDxjb2RlPm1ham9yLm1pbm9yLnBvaW50PC9jb2RlPi4gU3RhcnRpbmcgd2l0aCBKYXZhIDkgcmVhbGx5IG9ubHkgdGhlIG1ham9yIG51bWJlciBpcworICAgICAgZGV0ZXJtaW5lZC48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotICA8cD4KLSAgICBBbiBleGFtcGxlOgotICA8L3A+Cis8cD5BbiBleGFtcGxlOjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtqYXZhdmVyc2lvbiBhdGxlYXN0PSZxdW90OzkmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHByZT4mbHQ7amF2YXZlcnNpb24gYXRsZWFzdD0mcXVvdDs5JnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+d2lsbCBldmFsdWF0ZSB0byB0cnVlIGlmIHRoZSBjdXJyZW50IEpWTSBpcyBKYXZhOSBvciBhYm92ZS48L3A+Cis8cD53aWxsIGV2YWx1YXRlIHRvIHRydWUgaWYgdGhlIGN1cnJlbnQgSlZNIGlzIEphdmEgOSBvciBhYm92ZS48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jb3B5Lmh0bWwgYi9tYW51YWwvVGFza3MvY29weS5odG1sCmluZGV4IGQxYjhmZjIuLjQ4ZjA3ZDkgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jb3B5Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2NvcHkuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDM2MyArMTUsMjg4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Db3B5IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImNvcHkiPkNvcHk8L2E+PC9oMj4KKzxoMiBpZD0iY29weSI+Q29weTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Q29waWVzIGEgZmlsZSBvciByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwgZmlsZXMgYXJlCi1vbmx5IGNvcGllZCBpZiB0aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwKLW9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QuICBIb3dldmVyLCB5b3UgY2FuIGV4cGxpY2l0bHkKLW92ZXJ3cml0ZSBmaWxlcyB3aXRoIHRoZSA8Y29kZT5vdmVyd3JpdGU8L2NvZGU+IGF0dHJpYnV0ZS48L3A+Cis8cD5Db3BpZXMgYSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24gdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCBmaWxlcyBhcmUgb25seQorY29waWVkIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90CitleGlzdC4gIEhvd2V2ZXIsIHlvdSBjYW4gZXhwbGljaXRseSBvdmVyd3JpdGUgZmlsZXMgd2l0aCB0aGUgPHZhcj5vdmVyd3JpdGU8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAotPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKLUNvbGxlY3Rpb248L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgYSBncm91cCBvZiBmaWxlcyB0byBjb3B5LiAgVG8gdXNlIGEKLXJlc291cmNlIGNvbGxlY3Rpb24sIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlIG11c3QgYmUgc2V0LgotPHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoYXQgc29tZSByZXNvdXJjZXMgKGZvciBleGFtcGxlCi10aGUgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZSI+ZmlsZTwvYT4gcmVzb3VyY2UpCi1yZXR1cm4gYWJzb2x1dGUgcGF0aHMgYXMgbmFtZXMgYW5kIHRoZSByZXN1bHQgb2YgdXNpbmcgdGhlbSB3aXRob3V0Ci11c2luZyBhIG5lc3RlZCBtYXBwZXIgKG9yIHRoZSBmbGF0dGVuIGF0dHJpYnV0ZSkgbWF5IG5vdCBiZSB3aGF0IHlvdQorPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdyb3VwCitvZiBmaWxlcyB0byBjb3B5LiAgVG8gdXNlIGEgcmVzb3VyY2UgY29sbGVjdGlvbiwgdGhlIDx2YXI+dG9kaXI8L3Zhcj4gYXR0cmlidXRlIG11c3QgYmUKK3NldC4gPHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoYXQgc29tZSByZXNvdXJjZXMgKGZvciBleGFtcGxlCit0aGUgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZSI+ZmlsZTwvYT4gcmVzb3VyY2UpIHJldHVybiBhYnNvbHV0ZSBwYXRocyBhcyBuYW1lcyBhbmQgdGhlCityZXN1bHQgb2YgdXNpbmcgdGhlbSB3aXRob3V0IHVzaW5nIGEgbmVzdGVkIG1hcHBlciAob3IgdGhlIGZsYXR0ZW4gYXR0cmlidXRlKSBtYXkgbm90IGJlIHdoYXQgeW91CiBleHBlY3QuPC9wPgogCi08cD4KLTxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+SWYgeW91IGVtcGxveSBmaWx0ZXJzIGluIHlvdXIgY29weSBvcGVyYXRpb24sCi15b3Ugc2hvdWxkIGxpbWl0IHRoZSBjb3B5IHRvIHRleHQgZmlsZXMuIEJpbmFyeSBmaWxlcyB3aWxsIGJlIGNvcnJ1cHRlZAotYnkgdGhlIGNvcHkgb3BlcmF0aW9uLgotVGhpcyBhcHBsaWVzIHdoZXRoZXIgdGhlIGZpbHRlcnMgYXJlIGltcGxpY2l0bHkgZGVmaW5lZCBieSB0aGUKLTxhIGhyZWY9ImZpbHRlci5odG1sIj5maWx0ZXI8L2E+IHRhc2sgb3IgZXhwbGljaXRseSBwcm92aWRlZCB0byB0aGUgY29weQotb3BlcmF0aW9uIGFzIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcnNldC5odG1sIj5maWx0ZXJzZXRzPC9hPi4KLSAgPGVtPlNlZSA8YSBocmVmPSIjZW5jb2RpbmciPmVuY29kaW5nIG5vdGU8L2E+PC9lbT4uCi08L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBlbXBsb3kgZmlsdGVycyBpbiB5b3VyIGNvcHkgb3BlcmF0aW9uLCB5b3Ugc2hvdWxkIGxpbWl0IHRoZSBjb3B5IHRvCit0ZXh0IGZpbGVzLiBCaW5hcnkgZmlsZXMgd2lsbCBiZSBjb3JydXB0ZWQgYnkgdGhlIGNvcHkgb3BlcmF0aW9uLiAgVGhpcyBhcHBsaWVzIHdoZXRoZXIgdGhlIGZpbHRlcnMKK2FyZSBpbXBsaWNpdGx5IGRlZmluZWQgYnkgdGhlIDxhIGhyZWY9ImZpbHRlci5odG1sIj5maWx0ZXI8L2E+IHRhc2sgb3IgZXhwbGljaXRseSBwcm92aWRlZCB0byB0aGUKK2NvcHkgb3BlcmF0aW9uCithcyA8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJzZXQuaHRtbCI+ZmlsdGVyc2V0czwvYT4uICA8ZW0+U2VlIDxhIGhyZWY9IiNlbmNvZGluZyI+ZW5jb2RpbmcKK25vdGU8L2E+PC9lbT4uPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGNvcHkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIGEgbmVzdGVkCi0gICAgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQuPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIHRvIGNvcHkuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50IGlzIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5HaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZAotICAgICAgdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+cHJlc2VydmVsYXN0bW9kaWZpZWQ8L3RkPgorICAgIDx0ZD5HaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZCB0aW1lIGFzIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBjb3B5IHRvLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5XaXRoIHRoZSA8Y29kZT5maWxlPC9jb2RlPgotICAgICAgYXR0cmlidXRlLCBlaXRoZXIgPGNvZGU+dG9maWxlPC9jb2RlPiBvciA8Y29kZT50b2RpcjwvY29kZT4gY2FuIGJlIHVzZWQuPGJyLz4KLQotICAgICAgV2l0aCBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50cywgaWYgdGhlIG51bWJlciBvZgotICAgICAgaW5jbHVkZWQgcmVzb3VyY2VzCi0gICAgICBpcyBncmVhdGVyIHRoYW4gMSwgb3IgaWYgb25seSB0aGUgPGNvZGU+ZGlyPC9jb2RlPiBhdHRyaWJ1dGUgaXMKLSAgICAgIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiwgb3IgaWYgdGhlCi0gICAgICA8Y29kZT5maWxlPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gb25seQotICAgICAgPGNvZGU+dG9kaXI8L2NvZGU+IGlzIGFsbG93ZWQuPGJyLz4KLSAgICAgIDxlbT5QcmlvciB0byBBcGFjaGUgQW50IDEuOC4yPC9lbT4gdGhlIDxjb2RlPnRvZmlsZTwvY29kZT4gYXR0cmlidXRlCi0gICAgICBvbmx5IHN1cHBvcnRlZCBmaWxlc3lzdGVtIHJlc291cmNlcyB0b3AgY29weSBmcm9tLjwvdGQ+CisgICAgPHRkPnRvZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIHRvIGNvcHkgdG8uIFByaW9yIHRvIEFwYWNoZSBBbnQgMS44LjIsIHRoZSA8dmFyPnRvZmlsZTwvdmFyPiBhdHRyaWJ1dGUgb25seQorICAgICAgc3VwcG9ydGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2ZpbGUiPmZpbGUgcmVzb3VyY2VzPC9hPiB0byBjb3B5IGZyb20uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+V2l0aCB0aGUgPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZSwgZWl0aGVyIDx2YXI+dG9maWxlPC92YXI+IG9yIDx2YXI+dG9kaXI8L3Zhcj4KKyAgICAgIGNhbiBiZSB1c2VkLjxici8+ICBXaXRoIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnRzLCBpZiB0aGUgbnVtYmVyIG9mIGluY2x1ZGVkCisgICAgICByZXNvdXJjZXMgaXMgZ3JlYXRlciB0aGFuIDEsIG9yIGlmIG9ubHkgdGhlIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgaW4KKyAgICAgIHRoZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCBvciBpZiB0aGUgPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZSBpcyBhbHNvIHNwZWNpZmllZCwgdGhlbgorICAgICAgb25seSA8dmFyPnRvZGlyPC92YXI+IGlzIGFsbG93ZWQuPGJyLz48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHRvIGNvcHkgdG8uPC90ZD4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb24KLSAgICAgIGZpbGVzIGFyZSBuZXdlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkPm92ZXJ3cml0ZTwvdGQ+CisgICAgPHRkPk92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlcyBhcmUgbmV3ZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24KLSAgICAgIGZpbGVzLiAgPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgPHRkPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24gZmlsZXMuICA8ZW0+c2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyB1c2luZyB0aGUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNmaWx0ZXJzIj5nbG9iYWwKLSAgICAgICAgYnVpbGQtZmlsZSBmaWx0ZXJzPC9hPiBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcgdGhlIGNvcHkuCi0gICAgICA8ZW0+Tm90ZTwvZW0+OiBOZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzIHdpbGwKLSAgICAgIGFsd2F5cyBiZSB1c2VkLCBldmVuIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGl0cyB2YWx1ZSBpcwotICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+ICg8Y29kZT5ubzwvY29kZT4sIG9yIDxjb2RlPm9mZjwvY29kZT4pLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+ZmlsdGVyaW5nPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHVzaW5nIHRoZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2ZpbHRlcnMiPmdsb2JhbAorICAgICAgYnVpbGQtZmlsZSBmaWx0ZXJzPC9hPiBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcgdGhlIGNvcHkuICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46CisgICAgICBOZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzIHdpbGwgYWx3YXlzIGJlIHVzZWQsIGV2ZW4gaWYgdGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgIG5vdCBzcGVjaWZpZWQsIG9yIGl0cyB2YWx1ZSBpcyA8cT5mYWxzZTwvcT4sIDxxPm5vPC9xPiwgb3IgPHE+b2ZmPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhdHRlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZ25vcmUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgdGhlIHNvdXJjZSBmaWxlcywKLSAgICAgIGFuZCBjb3B5IGFsbCBmaWxlcyBpbnRvIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT50b2RpcjwvY29kZT4KLSAgICAgIGF0dHJpYnV0ZS4gIE5vdGUgdGhhdCB5b3UgY2FuIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0IGJ5IHVzaW5nIGEKLSAgICAgIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2ZsYXR0ZW4tbWFwcGVyIj5mbGF0dGVuIG1hcHBlcjwvYT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5mbGF0dGVuPC90ZD4KKyAgICA8dGQ+SWdub3JlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgZmlsZXMsIGFuZCBjb3B5IGFsbCBmaWxlcyBpbnRvIHRoZSBkaXJlY3RvcnkKKyAgICAgIHNwZWNpZmllZCBieSB0aGUgPHZhcj50b2RpcjwvdmFyPiBhdHRyaWJ1dGUuICBOb3RlIHRoYXQgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieQorICAgICAgdXNpbmcgYSA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNmbGF0dGVuLW1hcHBlciI+ZmxhdHRlbiBtYXBwZXI8L2E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlRW1wdHlEaXJzPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5Db3B5IGFueSBlbXB0eSBkaXJlY3RvcmllcyBpbmNsdWRlZCBpbiB0aGUgRmlsZVNldChzKS4KLSAgICAgPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZD5pbmNsdWRlRW1wdHlEaXJzPC90ZD4KKyAgICAgPHRkPkNvcHkgYW55IGVtcHR5IGRpcmVjdG9yaWVzIGluY2x1ZGVkIGluIHRoZSBGaWxlU2V0KHMpLjwvdGQ+CisgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgZmFsc2UsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZQotICAgICAgIGJ1aWxkLCB3aGVuIHRoZSBmaWxlIHRvIGNvcHkgZG9lcyBub3QgZXhpc3Qgb3Igb25lIG9mIHRoZSBuZXN0ZWQKLSAgICAgICBmaWxlc2V0cyBwb2ludHMgdG8gYSBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IGV4aXN0IG9yIGFuIGVycm9yIG9jY3VycwotICAgICAgIHdoaWxlIGNvcHlpbmcuCi0gICAgIDwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgICA8dGQ+SWYgPHE+ZmFsc2U8L3E+LCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQsIHdoZW4gdGhlIGZpbGUgdG8gY29weQorICAgICAgIGRvZXMgbm90IGV4aXN0IG9yIG9uZSBvZiB0aGUgbmVzdGVkIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgYW4KKyAgICAgICBlcnJvciBvY2N1cnMgd2hpbGUgY29weWluZy48L3RkPgorICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cXVpZXQ8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0cnVlIGFuZCBmYWlsb25lcnJvciBpcyBmYWxzZSwgdGhlbiBkbyBub3QgbG9nIGEKLSAgICAgICB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB0aGUgZmlsZSB0byBjb3B5IGRvZXMgbm90IGV4aXN0IG9yIG9uZSBvZiB0aGUgbmVzdGVkCi0gICAgICAgZmlsZXNldHMgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRoYXQgZG9lc24ndCBleGlzdCBvciBhbiBlcnJvciBvY2N1cnMKLSAgICAgICB3aGlsZSBjb3B5aW5nLiA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT4uCi0gICAgIDwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkPnF1aWV0PC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4gYW5kIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+LCB0aGVuIGRvIG5vdCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UKKyAgICAgICB3aGVuIHRoZSBmaWxlIHRvIGNvcHkgZG9lcyBub3QgZXhpc3Qgb3Igb25lIG9mIHRoZSBuZXN0ZWQgZmlsZXNldHMgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRoYXQKKyAgICAgICBkb2Vzbid0IGV4aXN0IG9yIGFuIGVycm9yIG9jY3VycyB3aGlsZSBjb3B5aW5nLiA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT4uPC90ZD4KKyAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2cgdGhlIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvcGllZC48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgPHRkPkxvZyB0aGUgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29waWVkLjwvdGQ+CisgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVuY29kaW5nIHRvIGFzc3VtZSB3aGVuIGZpbHRlci1jb3B5aW5nIHRoZQotICAgIGZpbGVzLiA8ZW0+c2luY2UgQW50IDEuNTwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyB0byBhc3N1bWUgd2hlbiBmaWx0ZXItY29weWluZyB0aGUgZmlsZXMuIDxlbT5zaW5jZSBBbnQgMS41PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlcy4KKyAgICA8dGQ+b3V0cHV0ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0aGUgZmlsZXMuCiAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZW5jb2RpbmcKLSAgICBhdHRyaWJ1dGUgaWYgZ2l2ZW4gb3IgdGhlIGRlZmF1bHQgSlZNIGVuY29kaW5nIG90aGVyd2lzZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHZhcj5lbmNvZGluZzwvdmFyPiBpZiBzZXQgb3IgZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nIG90aGVyd2lzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZW11bHRpcGxlbWFwcGluZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBJZiB0cnVlIHRoZSB0YXNrIHdpbGwgcHJvY2VzcyB0byBhbGwgdGhlIG1hcHBpbmdzIGZvciBhCi0gICAgICBnaXZlbiBzb3VyY2UgcGF0aC4gSWYgZmFsc2UgdGhlIHRhc2sgd2lsbCBvbmx5IHByb2Nlc3MKLSAgICAgIHRoZSBmaXJzdCBmaWxlIG9yIGRpcmVjdG9yeS4gVGhpcyBhdHRyaWJ1dGUgaXMgb25seSByZWxldmFudAotICAgICAgaWYgdGhlcmUgaXMgYSBtYXBwZXIgc3ViZWxlbWVudC4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5lbmFibGVtdWx0aXBsZW1hcHBpbmdzPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4gdGhlIHRhc2sgd2lsbCBwcm9jZXNzIHRvIGFsbCB0aGUgbWFwcGluZ3MgZm9yIGEgZ2l2ZW4gc291cmNlCisgICAgICBwYXRoLiBJZiA8cT5mYWxzZTwvcT4gdGhlIHRhc2sgd2lsbCBvbmx5IHByb2Nlc3MgdGhlIGZpcnN0IGZpbGUgb3IgZGlyZWN0b3J5LiBUaGlzIGF0dHJpYnV0ZQorICAgICAgaXMgb25seSByZWxldmFudCBpZiB0aGVyZSBpcyBhIDxjb2RlPm1hcHBlcjwvY29kZT4gc3ViZWxlbWVudC4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmdyYW51bGFyaXR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZQotICAgIGRlY2lkaW5nIGEgZmlsZSBpcyBvdXQgb2YgZGF0ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkKLSAgICBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQotICAgIG1pbGxpc2Vjb25kIGxldmVsLiBEZWZhdWx0IGlzIDEgc2Vjb25kLCBvciAyIHNlY29uZHMgb24gRE9TCi0gICAgc3lzdGVtcy4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZnVsIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IGZpbGVzIGxpdmUKLSAgICBvbiBzZXBhcmF0ZSBtYWNoaW5lcyB3aXRoIGNsb2NrcyBiZWluZyBvdXQgb2Ygc3luYy4gIDxlbT5zaW5jZSBBbnQKLSAgICAxLjYuMjwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Z3JhbnVsYXJpdHk8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzCisgICAgICBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiBUaGlzIGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiBzb3VyY2UgYW5kIHRhcmdldCBmaWxlcyBsaXZlIG9uIHNlcGFyYXRlCisgICAgICBtYWNoaW5lcyB3aXRoIGNsb2NrcyBiZWluZyBvdXQgb2Ygc3luYy4gPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDEgc2Vjb25kLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08aDQ+ZmlsZXNldCBvciBhbnkgb3RoZXIgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Ci08cD48YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQotQ29sbGVjdGlvbjwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBncm91cHMgb2YgZmlsZXMgdG8gY29weS4gIFRvIHVzZSBhCi1yZXNvdXJjZSBjb2xsZWN0aW9uLCB0aGUgPGNvZGU+dG9kaXI8L2NvZGU+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC48L3A+Ci08cD5QcmlvciB0byBBbnQgMS43IG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbgotc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgorPGg0PmFueSBmaWxlc3lzdGVtIGJhc2VkIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdCBncm91cHMKK29mIGZpbGVzIHRvIGNvcHkuICBUbyB1c2UgYSByZXNvdXJjZSBjb2xsZWN0aW9uLCB0aGUgPHZhcj50b2RpcjwvdmFyPiBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuPC9wPgorPHA+UHJpb3IgdG8gQW50IDEuNywgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuIHN1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KIAogPGg0Pm1hcHBlcjwvaDQ+Ci0gPHA+WW91IGNhbiBkZWZpbmUgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhCi0gaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4gZWxlbWVudC4gVGhlIGRlZmF1bHQgbWFwcGVyIHVzZWQgYnkKLSA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IGlzIHRoZSA8YQotIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2lkZW50aXR5LW1hcHBlciI+aWRlbnRpdHkgbWFwcGVyPC9hPi48L3A+Ci0gIDxwPgotICAgIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPiwKLSAgICBvbmUgY2FuIHVzZSBhIGZpbGVuYW1lbWFwcGVyIHR5cGUgaW4gcGxhY2Ugb2YgdGhlIG1hcHBlciBlbGVtZW50LgotICA8L3A+Cis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlbmFtZSB0cmFuc2Zvcm1hdGlvbnMgYnkgdXNpbmcgYQorbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+IGVsZW1lbnQuIFRoZSBkZWZhdWx0IG1hcHBlciB1c2VkCitieSA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IGlzIHRoZSA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNpZGVudGl0eS1tYXBwZXIiPmlkZW50aXR5CittYXBwZXI8L2E+LjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPiwgb25lIGNhbiB1c2UgYSBmaWxlbmFtZW1hcHBlciB0eXBlIGluIHBsYWNlIG9mIHRoZSBtYXBwZXIgZWxlbWVudC48L3A+CiAKLTxwPk5vdGUgdGhhdCB0aGUgc291cmNlIG5hbWUgaGFuZGVkIHRvIHRoZSBtYXBwZXIgZGVwZW5kcyBvbiB0aGUKLXJlc291cmNlIGNvbGxlY3Rpb24geW91IHVzZS4gIElmIHlvdSB1c2UgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgotb3IgYW55IG90aGVyIGNvbGxlY3Rpb24gdGhhdCBwcm92aWRlcyBhIGJhc2UgZGlyZWN0b3J5LCB0aGUgbmFtZQotcGFzc2VkIHRvIHRoZSBtYXBwZXIgd2lsbCBiZSBhIHJlbGF0aXZlIGZpbGVuYW1lLCByZWxhdGl2ZSB0byB0aGUgYmFzZQotZGlyZWN0b3J5LiAgSW4gYW55IG90aGVyIGNhc2UgdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2Ugd2lsbAotYmUgdXNlZC48L3A+Cis8cD5Ob3RlIHRoYXQgdGhlIHNvdXJjZSBuYW1lIGhhbmRlZCB0byB0aGUgbWFwcGVyIGRlcGVuZHMgb24gdGhlIHJlc291cmNlIGNvbGxlY3Rpb24geW91IHVzZS4gIElmCit5b3UgdXNlIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gb3IgYW55IG90aGVyIGNvbGxlY3Rpb24gdGhhdCBwcm92aWRlcyBhIGJhc2UgZGlyZWN0b3J5LCB0aGUKK25hbWUgcGFzc2VkIHRvIHRoZSBtYXBwZXIgd2lsbCBiZSBhIHJlbGF0aXZlIGZpbGVuYW1lLCByZWxhdGl2ZSB0byB0aGUgYmFzZSBkaXJlY3RvcnkuICBJbiBhbnkgb3RoZXIKK2Nhc2UgdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2Ugd2lsbCBiZSB1c2VkLjwvcD4KIAogPGg0PmZpbHRlcnNldDwvaDQ+Ci0gPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyc2V0Lmh0bWwiPkZpbHRlclNldDwvYT5zIGFyZSB1c2VkIHRvIHJlcGxhY2UKLXRva2VucyBpbiBmaWxlcyB0aGF0IGFyZSBjb3BpZWQuCi0gVG8gdXNlIGEgRmlsdGVyU2V0LCB1c2UgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gZWxlbWVudC48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJzZXQuaHRtbCI+RmlsdGVyU2V0PC9hPnMgYXJlIHVzZWQgdG8gcmVwbGFjZSB0b2tlbnMgaW4gZmlsZXMgdGhhdCBhcmUKK2NvcGllZC4gIFRvIHVzZSBhIEZpbHRlclNldCwgdXNlIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgogCiA8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgbW9yZSB0aGFuIG9uZSBmaWx0ZXJzZXQuPC9wPgogCiA8aDQ+ZmlsdGVyY2hhaW48L2g0PgotPHA+VGhlIENvcHkgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+Ci1GaWx0ZXJDaGFpbjwvYT5zLjwvcD4KKzxwPlRoZSBDb3B5IHRhc2sgc3VwcG9ydHMgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPnMuPC9wPgogCi08cD4KLUlmIDxjb2RlPiZsdDtmaWx0ZXJzZXQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHVzZWQgaW5zaWRlIHRoZQotc2FtZSA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IHRhc2ssIGFsbCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgcHJvY2Vzc2VkIGZpcnN0Ci1mb2xsb3dlZCBieSA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuCi08L3A+Cis8cD5JZiA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSB1c2VkIGluc2lkZQordGhlIHNhbWUgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrLCBhbGwgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZAorZmlyc3QgZm9sbG93ZWQgYnkgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPkNvcHkgYSBzaW5nbGUgZmlsZTwvYj48L3A+Ci08cHJlPgotICAmbHQ7Y29weSBmaWxlPSZxdW90O215ZmlsZS50eHQmcXVvdDsgdG9maWxlPSZxdW90O215Y29weS50eHQmcXVvdDsvJmd0OwotPC9wcmU+Ci08cD48Yj5Db3B5IGEgc2luZ2xlIGZpbGUgdG8gYSBkaXJlY3Rvcnk8L2I+PC9wPgotPHByZT4KLSAgJmx0O2NvcHkgZmlsZT0mcXVvdDtteWZpbGUudHh0JnF1b3Q7IHRvZGlyPSZxdW90Oy4uL3NvbWUvb3RoZXIvZGlyJnF1b3Q7LyZndDsKLTwvcHJlPgotPHA+PGI+Q29weSBhIGRpcmVjdG9yeSB0byBhbm90aGVyIGRpcmVjdG9yeTwvYj48L3A+Ci08cHJlPgotICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9uZXcvZGlyJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKLSAgJmx0Oy9jb3B5Jmd0OwotPC9wcmU+Ci08cD48Yj5Db3B5IGEgc2V0IG9mIGZpbGVzIHRvIGEgZGlyZWN0b3J5PC9iPjwvcD4KLTxwcmU+Ci0gICZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2Rlc3QvZGlyJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7Jmd0OwotICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9jb3B5Jmd0OwogCi0gICZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2Rlc3QvZGlyJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7IGV4Y2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7Ci0gICZsdDsvY29weSZndDsKLTwvcHJlPgotPHA+PGI+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeSwgYXBwZW5kaW5nCi08Y29kZT4uYmFrPC9jb2RlPiB0byB0aGUgZmlsZSBuYW1lIG9uIHRoZSBmbHk8L2I+PC9wPgorPHA+Q29weSBhIHNpbmdsZSBmaWxlPC9wPgorPHByZT4mbHQ7Y29weSBmaWxlPSZxdW90O215ZmlsZS50eHQmcXVvdDsgdG9maWxlPSZxdW90O215Y29weS50eHQmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5Db3B5IGEgc2luZ2xlIGZpbGUgdG8gYSBkaXJlY3Rvcnk8L3A+Cis8cHJlPiZsdDtjb3B5IGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OyB0b2Rpcj0mcXVvdDsuLi9zb21lL290aGVyL2RpciZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNvcHkgYSBkaXJlY3RvcnkgdG8gYW5vdGhlciBkaXJlY3Rvcnk8L3A+CiA8cHJlPgotICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9iYWNrdXAvZGlyJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKLSAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSZxdW90OyomcXVvdDsgdG89JnF1b3Q7Ki5iYWsmcXVvdDsvJmd0OwotICAmbHQ7L2NvcHkmZ3Q7CismbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9uZXcvZGlyJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjX2RpciZxdW90Oy8mZ3Q7CismbHQ7L2NvcHkmZ3Q7CiA8L3ByZT4KIAotPHA+PGI+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeSwgcmVwbGFjaW5nIEBUSVRMRUAgd2l0aCBGb28gQmFyCi1pbiBhbGwgZmlsZXMuPC9iPjwvcD4KKzxwPkNvcHkgYSBzZXQgb2YgZmlsZXMgdG8gYSBkaXJlY3Rvcnk8L3A+CiA8cHJlPgotICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9iYWNrdXAvZGlyJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmlsdGVyc2V0Jmd0OwotICAgICAgJmx0O2ZpbHRlciB0b2tlbj0mcXVvdDtUSVRMRSZxdW90OyB2YWx1ZT0mcXVvdDtGb28gQmFyJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2ZpbHRlcnNldCZndDsKLSAgJmx0Oy9jb3B5Jmd0OwotPC9wcmU+CismbHQ7Y29weSB0b2Rpcj0mcXVvdDsuLi9kZXN0L2RpciZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsmZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NvcHkmZ3Q7CiAKLTxwPjxiPkNvbGxlY3QgYWxsIGl0ZW1zIGZyb20gdGhlIGN1cnJlbnQgQ0xBU1NQQVRIIHNldHRpbmcgaW50byBhCi1kZXN0aW5hdGlvbiBkaXJlY3RvcnksIGZsYXR0ZW5pbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuPC9iPjwvcD4KKyZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2Rlc3QvZGlyJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjX2RpciZxdW90OyBleGNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgorCis8cD5Db3B5IGEgc2V0IG9mIGZpbGVzIHRvIGEgZGlyZWN0b3J5LCBhcHBlbmRpbmcgPHNhbXA+LmJhazwvc2FtcD4gdG8gdGhlIGZpbGUgbmFtZSBvbiB0aGUKK2ZseTwvcD4KIDxwcmU+Ci0gICZsdDtjb3B5IHRvZGlyPSZxdW90O2Rlc3QmcXVvdDsgZmxhdHRlbj0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwotICAgICZsdDtwYXRoJmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKLSAgICAmbHQ7L3BhdGgmZ3Q7Ci0gICZsdDsvY29weSZndDsKLTwvcHJlPgorJmx0O2NvcHkgdG9kaXI9JnF1b3Q7Li4vYmFja3VwL2RpciZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsvJmd0OworICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSZxdW90OyomcXVvdDsgdG89JnF1b3Q7Ki5iYWsmcXVvdDsvJmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCi08cD48Yj5Db3BpZXMgc29tZSByZXNvdXJjZXMgdG8gYSBnaXZlbiBkaXJlY3RvcnkuPC9iPjwvcD4KKzxwPkNvcHkgYSBzZXQgb2YgZmlsZXMgdG8gYSBkaXJlY3RvcnksIHJlcGxhY2luZyA8Y29kZT5AVElUTEVAPC9jb2RlPiB3aXRoIDxzYW1wPkZvbworQmFyPC9zYW1wPiBpbiBhbGwgZmlsZXMuPC9wPgogPHByZT4KLSAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7ZGVzdCZxdW90OyBmbGF0dGVuPSZxdW90O3RydWUmcXVvdDsmZ3Q7Ci0gICAgJmx0O3Jlc291cmNlcyZndDsKLSAgICAgICZsdDtmaWxlIGZpbGU9JnF1b3Q7c3JjX2Rpci9maWxlMS50eHQmcXVvdDsvJmd0OwotICAgICAgJmx0O3VybCB1cmw9JnF1b3Q7aHR0cDovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwmcXVvdDsvJmd0OwotICAgICZsdDsvcmVzb3VyY2VzJmd0OwotICAmbHQ7L2NvcHkmZ3Q7Ci08L3ByZT4KKyZsdDtjb3B5IHRvZGlyPSZxdW90Oy4uL2JhY2t1cC9kaXImcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7LyZndDsKKyAgJmx0O2ZpbHRlcnNldCZndDsKKyAgICAmbHQ7ZmlsdGVyIHRva2VuPSZxdW90O1RJVExFJnF1b3Q7IHZhbHVlPSZxdW90O0ZvbyBCYXImcXVvdDsvJmd0OworICAmbHQ7L2ZpbHRlcnNldCZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KIAotPHA+SWYgdGhlIGV4YW1wbGUgYWJvdmUgZGlkbid0IHVzZSB0aGUgZmxhdHRlbiBhdHRyaWJ1dGUsCi0gIHRoZSA8Y29kZT4mbHQ7ZmlsZSZndDs8L2NvZGU+IHJlc291cmNlIHdvdWxkIGhhdmUgcmV0dXJuZWQgaXRzIGZ1bGwKLSAgcGF0aCBhcyBzb3VyY2UgYW5kIHRhcmdldCBuYW1lIGFuZCB3b3VsZCBub3QgaGF2ZSBiZWVuIGNvcGllZCBhdAotICBhbGwuICBJbiBnZW5lcmFsIGl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byB1c2UgYW4gZXhwbGljaXQgbWFwcGVyCi0gIHRvZ2V0aGVyIHdpdGggcmVzb3VyY2VzIHRoYXQgdXNlIGFuIGFic29sdXRlIHBhdGggYXMgdGhlaXIKLSAgbmFtZXMuPC9wPgotCi08cD48Yj5Db3BpZXMgdGhlIHR3byBuZXdlc3QgcmVzb3VyY2VzIGludG8gYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuPC9iPjwvcD4KKzxwPkNvbGxlY3QgYWxsIGl0ZW1zIGZyb20gdGhlIGN1cnJlbnQgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBzZXR0aW5nIGludG8gYSBkZXN0aW5hdGlvbgorZGlyZWN0b3J5LCBmbGF0dGVuaW5nIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlLjwvcD4KIDxwcmU+Ci0gICZsdDtjb3B5IHRvZGlyPSZxdW90O2Rlc3QmcXVvdDsgZmxhdHRlbj0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwotICAgICZsdDtmaXJzdCBjb3VudD0mcXVvdDsyJnF1b3Q7Jmd0OwotICAgICAgJmx0O3NvcnQmZ3Q7Ci0gICAgICAgICZsdDtkYXRlIHhtbG5zPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7cmVzb3VyY2VzJmd0OwotICAgICAgICAgICZsdDtmaWxlIGZpbGU9JnF1b3Q7c3JjX2Rpci9maWxlMS50eHQmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDtmaWxlIGZpbGU9JnF1b3Q7c3JjX2Rpci9maWxlMi50eHQmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDtmaWxlIGZpbGU9JnF1b3Q7c3JjX2Rpci9maWxlMy50eHQmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDt1cmwgdXJsPSZxdW90O2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0Oy9yZXNvdXJjZXMmZ3Q7Ci0gICAgICAmbHQ7L3NvcnQmZ3Q7Ci0gICAgJmx0Oy9maXJzdCZndDsKLSAgJmx0Oy9jb3B5Jmd0OwotPC9wcmU+CismbHQ7Y29weSB0b2Rpcj0mcXVvdDtkZXN0JnF1b3Q7IGZsYXR0ZW49JnF1b3Q7dHJ1ZSZxdW90OyZndDsKKyAgJmx0O3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKKyAgJmx0Oy9wYXRoJmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCi08cD5UaGUgcGFyYWdyYXBoIGZvbGxvd2luZyB0aGUgcHJldmlvdXMgZXhhbXBsZSBhcHBsaWVzIHRvIHRoaXMKLSAgZXhhbXBsZSBhcyB3ZWxsLjwvcD4KKzxwPkNvcGllcyBzb21lIHJlc291cmNlcyB0byBhIGdpdmVuIGRpcmVjdG9yeS48L3A+Cis8cHJlPgorJmx0O2NvcHkgdG9kaXI9JnF1b3Q7ZGVzdCZxdW90OyBmbGF0dGVuPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICZsdDtyZXNvdXJjZXMmZ3Q7CisgICAgJmx0O2ZpbGUgZmlsZT0mcXVvdDtzcmNfZGlyL2ZpbGUxLnR4dCZxdW90Oy8mZ3Q7CisgICAgJmx0O3VybCB1cmw9JnF1b3Q7aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7LyZndDsKKyAgJmx0Oy9yZXNvdXJjZXMmZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLTxwPjxzdHJvbmc+VW5peCBOb3RlOjwvc3Ryb25nPiBGaWxlIHBlcm1pc3Npb25zIGFyZSBub3QgcmV0YWluZWQgd2hlbiBmaWxlcwotYXJlIGNvcGllZDsgdGhleSBlbmQgdXAgd2l0aCB0aGUgZGVmYXVsdCA8Y29kZT5VTUFTSzwvY29kZT4gcGVybWlzc2lvbnMKLWluc3RlYWQuIFRoaXMKLWlzIGNhdXNlZCBieSB0aGUgbGFjayBvZiBhbnkgbWVhbnMgdG8gcXVlcnkgb3Igc2V0IGZpbGUgcGVybWlzc2lvbnMgaW4gdGhlCi1jdXJyZW50IEphdmEgcnVudGltZXMuIElmIHlvdSBuZWVkIGEgcGVybWlzc2lvbi1wcmVzZXJ2aW5nIGNvcHkgZnVuY3Rpb24sCi11c2UgPGNvZGU+Jmx0O2V4ZWMgZXhlY3V0YWJsZT0iY3AiIC4uLiAmZ3Q7PC9jb2RlPiBpbnN0ZWFkLgotPC9wPgorPHA+SWYgdGhlIGV4YW1wbGUgYWJvdmUgZGlkbid0IHVzZSB0aGUgPHZhcj5mbGF0dGVuPC92YXI+IGF0dHJpYnV0ZSwgdGhlIDxjb2RlPiZsdDtmaWxlJmd0OzwvY29kZT4KK3Jlc291cmNlIHdvdWxkIGhhdmUgcmV0dXJuZWQgaXRzIGZ1bGwgcGF0aCBhcyBzb3VyY2UgYW5kIHRhcmdldCBuYW1lIGFuZCB3b3VsZCBub3QgaGF2ZSBiZWVuIGNvcGllZAorYXQgYWxsLiAgSW4gZ2VuZXJhbCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gdXNlIGFuIGV4cGxpY2l0IG1hcHBlciB0b2dldGhlciB3aXRoIHJlc291cmNlcyB0aGF0IHVzZQorYW4gYWJzb2x1dGUgcGF0aCBhcyB0aGVpciBuYW1lcy48L3A+CiAKLTxwPjxzdHJvbmc+V2luZG93cyBOb3RlOjwvc3Ryb25nPiBJZiB5b3UgY29weSBhIGZpbGUgdG8gYSBkaXJlY3RvcnkKLXdoZXJlIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cywgYnV0IHdpdGggZGlmZmVyZW50IGNhc2luZywKLXRoZSBjb3BpZWQgZmlsZSB0YWtlcyBvbiB0aGUgY2FzZSBvZiB0aGUgb3JpZ2luYWwuIFRoZSB3b3JrYXJvdW5kIGlzIHRvCi08YSBocmVmPSJkZWxldGUuaHRtbCI+ZGVsZXRlPC9hPgotdGhlIGZpbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBiZWZvcmUgeW91IGNvcHkgaXQuCi08L3A+Ci0gIDxwPgotICAgIDxzdHJvbmc+PGEgbmFtZT0iZW5jb2RpbmciPkltcG9ydGFudCBFbmNvZGluZyBOb3RlOjwvYT48L3N0cm9uZz4KLSAgICBUaGUgcmVhc29uIHRoYXQgYmluYXJ5IGZpbGVzIHdoZW4gZmlsdGVyZWQgZ2V0IGNvcnJ1cHRlZCBpcyB0aGF0Ci0gICAgZmlsdGVyaW5nIGludm9sdmVzIHJlYWRpbmcgaW4gdGhlIGZpbGUgdXNpbmcgYSBSZWFkZXIgY2xhc3MuIFRoaXMKLSAgICBoYXMgYW4gZW5jb2Rpbmcgc3BlY2lmeWluZyBob3cgZmlsZXMgYXJlIGVuY29kZWQuIFRoZXJlIGFyZSBhIG51bWJlcgotICAgIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBlbmNvZGluZyAtIFVURi04LCBVVEYtMTYsIENwMTI1MiwgSVNPLTg4NTktMSwKLSAgICBVUy1BU0NJSSBhbmQgKGxvdHMpIG90aGVycy4gT24gV2luZG93cyB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcKLSAgICBpcyBDcDEyNTIsIG9uIFVuaXggaXQgaXMgdXN1YWxseSBVVEYtOC4gRm9yIGJvdGggb2YgdGhlc2UgZW5jb2RpbmcKLSAgICB0aGVyZSBhcmUgaWxsZWdhbCBieXRlIHNlcXVlbmNlcyAobW9yZSBpbiBVVEYtOCB0aGFuIGZvciBDcDEyNTIpLgotICA8L3A+Ci0gIDxwPgotICAgIEhvdyB0aGUgUmVhZGVyIGNsYXNzIGRlYWxzIHdpdGggdGhlc2UgaWxsZWdhbCBzZXF1ZW5jZXMgaXMgdXAgdG8gdGhlCi0gICAgaW1wbGVtZW50YXRpb24KLSAgICBvZiB0aGUgY2hhcmFjdGVyIGRlY29kZXIuIFRoZSBjdXJyZW50IFN1biBKYXZhIGltcGxlbWVudGF0aW9uIGlzIHRvCi0gICAgbWFwIHRoZW0gdG8gbGVnYWwgY2hhcmFjdGVycy4gUHJldmlvdXMgU3VuIEphdmEgKDEuMyBhbmQgbG93ZXIpIHRocmV3Ci0gICAgYSBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbi4gSUJNIEphdmEgMS40IGFsc28gdGhyb3dzIHRoaXMgZXhjZXB0aW9uLgotICAgIEl0IGlzIHRoZSBtYXBwaW5nIG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQgY2F1c2UgdGhlIGNvcnJ1cHRpb24uCi0gIDwvcD4KLSAgPHA+Ci0gICAgT24gVW5peCwgd2hlcmUgdGhlIGRlZmF1bHQgaXMgbm9ybWFsbHkgVVRGLTgsIHRoaXMgaXMgYSA8ZW0+YmlnPC9lbT4KLSAgICBwcm9ibGVtLCBhcyBpdCBpcyBlYXN5IHRvIGVkaXQgYSBmaWxlIHRvIGNvbnRhaW4gbm9uIFVTIEFzY2lpIGNoYXJhY3RlcnMKLSAgICBmcm9tIElTTy04ODU5LTEsIGZvciBleGFtcGxlIHRoZSBEYW5pc2ggb2UgY2hhcmFjdGVyLiBXaGVuIHRoaXMgaXMKLSAgICBjb3BpZWQgKHdpdGggZmlsdGVyaW5nKSBieSBBbnQsIHRoZSBjaGFyYWN0ZXIgZ2V0IGNvbnZlcnRlZCB0byBhCi0gICAgcXVlc3Rpb24gbWFyayAob3Igc29tZSBzdWNoIHRoaW5nKS4KLSAgPC9wPgotICA8cD4KLSAgICBUaGVyZSBpcyBub3QgbXVjaCB0aGF0IEFudCBjYW4gZG8uIEl0IGNhbm5vdCBmaWd1cmUgb3V0IHdoaWNoCi0gICAgZmlsZXMgYXJlIGJpbmFyeSAtIGEgVVRGLTggdmVyc2lvbiBvZiBLb3JlYW4gd2lsbCBoYXZlIGxvdHMgb2YKLSAgICBieXRlcyB3aXRoIHRoZSB0b3AgYml0IHNldC4gSXQgaXMgbm90IGluZm9ybWVkIGFib3V0IGlsbGVnYWwKLSAgICBjaGFyYWN0ZXIgc2VxdWVuY2VzIGJ5IGN1cnJlbnQgU3VuIEphdmEgaW1wbGVtZW50aW9ucy4KLSAgPC9wPgotICA8cD4KLSAgICBPbmUgdHJpY2sgZm9yIGZpbHRlcmluZyBjb250YWluaW5nIG9ubHkgVVMtQVNDSUkgaXMgdG8KLSAgICB1c2UgdGhlIElTTy04ODU5LTEgZW5jb2RpbmcuIFRoaXMgZG9lcyBub3Qgc2VlbSB0byBjb250YWluCi0gICAgaWxsZWdhbCBjaGFyYWN0ZXIgc2VxdWVuY2VzLCBhbmQgdGhlIGxvd2VyIDcgYml0cyBhcmUgVVMtQVNDSUkuCi0gICAgQW5vdGhlciB0cmljayBpcyB0byBjaGFuZ2UgdGhlIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUgZnJvbQotICAgIHNvbWV0aGluZyBsaWtlICJ1cy51dGY4IiB0byAidXMiLgotICA8L3A+Ci0gICAgCis8cD5Db3BpZXMgdGhlIHR3byBuZXdlc3QgcmVzb3VyY2VzIGludG8gYSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuPC9wPgorPHByZT4KKyZsdDtjb3B5IHRvZGlyPSZxdW90O2Rlc3QmcXVvdDsgZmxhdHRlbj0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7Zmlyc3QgY291bnQ9JnF1b3Q7MiZxdW90OyZndDsKKyAgICAmbHQ7c29ydCZndDsKKyAgICAgICZsdDtkYXRlIHhtbG5zPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMmcXVvdDsvJmd0OworICAgICAgJmx0O3Jlc291cmNlcyZndDsKKyAgICAgICAgJmx0O2ZpbGUgZmlsZT0mcXVvdDtzcmNfZGlyL2ZpbGUxLnR4dCZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtmaWxlIGZpbGU9JnF1b3Q7c3JjX2Rpci9maWxlMi50eHQmcXVvdDsvJmd0OworICAgICAgICAmbHQ7ZmlsZSBmaWxlPSZxdW90O3NyY19kaXIvZmlsZTMudHh0JnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3VybCB1cmw9JnF1b3Q7aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7LyZndDsKKyAgICAgICZsdDsvcmVzb3VyY2VzJmd0OworICAgICZsdDsvc29ydCZndDsKKyAgJmx0Oy9maXJzdCZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KIAorPHA+VGhlIHBhcmFncmFwaCBmb2xsb3dpbmcgdGhlIHByZXZpb3VzIGV4YW1wbGUgYXBwbGllcyB0byB0aGlzIGV4YW1wbGUgYXMgd2VsbC48L3A+CiAKKzxwPjxzdHJvbmc+VW5peCBOb3RlPC9zdHJvbmc+OiBGaWxlIHBlcm1pc3Npb25zIGFyZSBub3QgcmV0YWluZWQgd2hlbiBmaWxlcyBhcmUgY29waWVkOyB0aGV5IGVuZCB1cAord2l0aCB0aGUgZGVmYXVsdCA8Y29kZT5VTUFTSzwvY29kZT4gcGVybWlzc2lvbnMgaW5zdGVhZC4gVGhpcyBpcyBjYXVzZWQgYnkgdGhlIGxhY2sgb2YgYW55IG1lYW5zIHRvCitxdWVyeSBvciBzZXQgZmlsZSBwZXJtaXNzaW9ucyBpbiB0aGUgY3VycmVudCBKYXZhIHJ1bnRpbWVzLiBJZiB5b3UgbmVlZCBhIHBlcm1pc3Npb24tcHJlc2VydmluZyBjb3B5CitmdW5jdGlvbiwgdXNlIDxjb2RlPiZsdDtleGVjIGV4ZWN1dGFibGU9ImNwIiAuLi4gJmd0OzwvY29kZT4gaW5zdGVhZC48L3A+CiAKLTwvYm9keT48L2h0bWw+Cis8cD48c3Ryb25nPldpbmRvd3MgTm90ZTwvc3Ryb25nPjogSWYgeW91IGNvcHkgYSBmaWxlIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cywKK2J1dCB3aXRoIGRpZmZlcmVudCBjYXNlLCB0aGUgY29waWVkIGZpbGUgdGFrZXMgb24gdGhlIGNhc2Ugb2YgdGhlIG9yaWdpbmFsLiBUaGUgd29ya2Fyb3VuZCBpcwordG8gPGEgaHJlZj0iZGVsZXRlLmh0bWwiPmRlbGV0ZTwvYT4gdGhlIGZpbGUgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBiZWZvcmUgeW91IGNvcHkgaXQuPC9wPgorPHAgaWQ9ImVuY29kaW5nIj48c3Ryb25nPkltcG9ydGFudCBFbmNvZGluZyBOb3RlPC9zdHJvbmc+OiBUaGUgcmVhc29uIHRoYXQgYmluYXJ5IGZpbGVzIHdoZW4KK2ZpbHRlcmVkIGdldCBjb3JydXB0ZWQgaXMgdGhhdCBmaWx0ZXJpbmcgaW52b2x2ZXMgcmVhZGluZyBpbiB0aGUgZmlsZSB1c2luZyBhIFJlYWRlciBjbGFzcy4gVGhpcyBoYXMKK2FuIGVuY29kaW5nIHNwZWNpZnlpbmcgaG93IGZpbGVzIGFyZSBlbmNvZGVkLiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgZGlmZmVyZW50IHR5cGVzIG9mCitlbmNvZGluZyZtZGFzaDtVVEYtOCwgVVRGLTE2LCBDcDEyNTIsIElTTy04ODU5LTEsIFVTLUFTQ0lJIGFuZCAobG90cyBvZikgb3RoZXJzLiBPbiBXaW5kb3dzIHRoZQorZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcgaXMgQ3AxMjUyLCBvbiBVbml4IGl0IGlzIHVzdWFsbHkgVVRGLTguIEZvciBib3RoIG9mIHRoZXNlIGVuY29kaW5nIHRoZXJlCithcmUgaWxsZWdhbCBieXRlIHNlcXVlbmNlcyAobW9yZSBpbiBVVEYtOCB0aGFuIGZvciBDcDEyNTIpLjwvcD4KKzxwPkhvdyB0aGUgUmVhZGVyIGNsYXNzIGRlYWxzIHdpdGggdGhlc2UgaWxsZWdhbCBzZXF1ZW5jZXMgaXMgdXAgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQorY2hhcmFjdGVyIGRlY29kZXIuIFRoZSBjdXJyZW50IFN1biBKYXZhIGltcGxlbWVudGF0aW9uIGlzIHRvIG1hcCB0aGVtIHRvIGxlZ2FsIGNoYXJhY3RlcnMuIFByZXZpb3VzCitTdW4gSmF2YSAoMS4zIGFuZCBsb3dlcikgdGhyZXcgYSA8Y29kZT5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjwvY29kZT4uIElCTSBKYXZhIDEuNCBhbHNvIHRocm93cyB0aGlzCitleGNlcHRpb24uIEl0IGlzIHRoZSBtYXBwaW5nIG9mIHRoZSBjaGFyYWN0ZXJzIHRoYXQgY2F1c2UgdGhlIGNvcnJ1cHRpb24uPC9wPgorPHA+T24gVW5peCwgd2hlcmUgdGhlIGRlZmF1bHQgaXMgbm9ybWFsbHkgVVRGLTgsIHRoaXMgaXMgYSA8ZW0+YmlnPC9lbT4gcHJvYmxlbSwgYXMgaXQgaXMgZWFzeSB0bworZWRpdCBhIGZpbGUgdG8gY29udGFpbiBub24gVVMtQVNDSUkgY2hhcmFjdGVycyBmcm9tIElTTy04ODU5LTEsIGZvciBleGFtcGxlIHRoZSBEYW5pc2ggJm9lbGlnOworY2hhcmFjdGVyLiBXaGVuIHRoaXMgaXMgY29waWVkICh3aXRoIGZpbHRlcmluZykgYnkgQW50LCB0aGUgY2hhcmFjdGVyIGdldCBjb252ZXJ0ZWQgdG8gYSBxdWVzdGlvbgorbWFyayAob3Igc29tZSBzdWNoIHRoaW5nKS48L3A+Cis8cD5UaGVyZSBpcyBub3QgbXVjaCB0aGF0IEFudCBjYW4gZG8uIEl0IGNhbm5vdCBmaWd1cmUgb3V0IHdoaWNoIGZpbGVzIGFyZSBiaW5hcnkmbWRhc2g7YSBVVEYtOAordmVyc2lvbiBvZiBLb3JlYW4gd2lsbCBoYXZlIGxvdHMgb2YgYnl0ZXMgd2l0aCB0aGUgdG9wIGJpdCBzZXQuIEl0IGlzIG5vdCBpbmZvcm1lZCBhYm91dCBpbGxlZ2FsCitjaGFyYWN0ZXIgc2VxdWVuY2VzIGJ5IGN1cnJlbnQgU3VuIEphdmEgaW1wbGVtZW50YXRpb25zLjwvcD4KKzxwPk9uZSB0cmljayBmb3IgZmlsdGVyaW5nIGNvbnRhaW5pbmcgb25seSBVUy1BU0NJSSBpcyB0byB1c2UgdGhlIElTTy04ODU5LTEgZW5jb2RpbmcuIFRoaXMgZG9lcyBub3QKK3NlZW0gdG8gY29udGFpbiBpbGxlZ2FsIGNoYXJhY3RlciBzZXF1ZW5jZXMsIGFuZCB0aGUgbG93ZXIgNyBiaXRzIGFyZSBVUy1BU0NJSS4gIEFub3RoZXIgdHJpY2sgaXMgdG8KK2NoYW5nZSB0aGUgPGNvZGU+TEFORzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgZnJvbSBzb21ldGhpbmcgbGlrZSA8cT51cy51dGY4PC9xPgordG8gPHE+dXM8L3E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2NvcHlkaXIuaHRtbCBiL21hbnVhbC9UYXNrcy9jb3B5ZGlyLmh0bWwKaW5kZXggOWU5ZTYwZS4uOWYyYmMwYyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2NvcHlkaXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvY29weWRpci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTIzICsxNSwxMTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkNvcHlkaXIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iY29weWRpciI+Q29weWRpcjwvYT48L2gyPgotPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KLTxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSBDb3B5IHRhc2sgaW5zdGVhZC48L2k+PC9wPgorPGgyIGlkPSJjb3B5ZGlyIj5Db3B5ZGlyPC9oMj4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+VGhpcyB0YXNrIGhhcyBiZWVuIDx1PmRlcHJlY2F0ZWQ8L3U+LiAgVXNlIHRoZSA8Y29kZT5Db3B5PC9jb2RlPiB0YXNrIGluc3RlYWQuPC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+Q29waWVzIGEgZGlyZWN0b3J5IHRyZWUgZnJvbSB0aGUgc291cmNlIHRvIHRoZSBkZXN0aW5hdGlvbi48L3A+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQuIFRoaXMgY2FuIGJlCi1kb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci1hdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCi1oYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQotaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAordGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4sIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+LCA8dmFyPmV4Y2x1ZGVzPC92YXI+LCA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPgorYW5kIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4gb3IgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4KK2F0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDx2YXI+ZXhjbHVkZTwvdmFyPgorb3IgPHZhcj5leGNsdWRlc2ZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcworYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZCBmaW5hbGx5IHdpdGggdGhlIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5Cit3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24KK29uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQogaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+Ci08cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQKLXN1cHBvcnRzIG1vc3QgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+Ci0oPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPnNyYzwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAotPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kIHN1cHBvcnRzIG1vc3QKK2F0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPHZhcj5kaXI8L3Zhcj4gYmVjb21lcyA8dmFyPnNyYzwvdmFyPikgYXMgd2VsbCBhcyB0aGUKK25lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRvIGNvcHkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgdG8gY29weS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgdG8gY29weSB0by48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzdDwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgdG8gY29weSB0by48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCAoPHE+eWVzfG5vPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZwotICAgICAgdGhlIGNvcHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWx0ZXJpbmc8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5nIHRoZSBjb3B5PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhdHRlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiBzb3VyY2UgZGlyZWN0b3J5LAotICAgICAgY29weSBhbGwgZmlsZXMgaW50byBhIHNpbmdsZSBkaXJlY3RvcnksIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+ZGVzdDwvY29kZT4KLSAgICAgIGF0dHJpYnV0ZSAoZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4pLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZsYXR0ZW48L3RkPgorICAgIDx0ZD5pZ25vcmUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiBzb3VyY2UgZGlyZWN0b3J5LCBjb3B5IGFsbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeSwKKyAgICAgIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+ZGVzdDwvY29kZT4gYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlb3ZlcndyaXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgotICAgICAgZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzIGZhbHNlKS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mb3JjZW92ZXJ3cml0ZTwvdGQ+CisgICAgPHRkPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbiBmaWxlcyBhcmUgbmV3ZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtjb3B5ZGlyIHNyYz0mcXVvdDske3NyY30vcmVzb3VyY2VzJnF1b3Q7Ci0gICAgICAgICAgIGRlc3Q9JnF1b3Q7JHtkaXN0fSZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+Y29waWVzIHRoZSBkaXJlY3RvcnkgPGNvZGU+JHtzcmN9L3Jlc291cmNlczwvY29kZT4gdG8gPGNvZGU+JHtkaXN0fTwvY29kZT4uPC9wPgotPHByZT4gICZsdDtjb3B5ZGlyIHNyYz0mcXVvdDske3NyY30vcmVzb3VyY2VzJnF1b3Q7Ci0gICAgICAgICAgIGRlc3Q9JnF1b3Q7JHtkaXN0fSZxdW90OwotICAgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsKLSAgICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7KiovVGVzdC5qYXZhJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+Ci08cD5jb3BpZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT4ke3NyY30vcmVzb3VyY2VzPC9jb2RlPiB0byA8Y29kZT4ke2Rpc3R9PC9jb2RlPgotcmVjdXJzaXZlbHkuIEFsbCBqYXZhIGZpbGVzIGFyZSBjb3BpZWQsIGV4Y2VwdCBmb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSA8Y29kZT5UZXN0LmphdmE8L2NvZGU+LjwvcD4KLTxwcmU+ICAmbHQ7Y29weWRpciBzcmM9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90OwotICAgICAgICAgICBkZXN0PSZxdW90OyR7ZGlzdH0mcXVvdDsKLSAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7Ci0gICAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS90ZXN0LyoqJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmNvcGllcyB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7c3JjfS9yZXNvdXJjZXM8L2NvZGU+IHRvIDxjb2RlPiR7ZGlzdH08L2NvZGU+Ci1yZWN1cnNpdmVseS4gQWxsIGphdmEgZmlsZXMgYXJlIGNvcGllZCwgZXhjZXB0IGZvciB0aGUgZmlsZXMgdW5kZXIgdGhlIDxjb2RlPm15cGFja2FnZS90ZXN0PC9jb2RlPgotZGlyZWN0b3J5LjwvcD4KKzxwPkNvcHkgdGhlIGRpcmVjdG9yeSA8c2FtcD4ke3NyY30vcmVzb3VyY2VzPC9zYW1wPiB0byA8c2FtcD4ke2Rpc3R9PC9zYW1wPi48L3A+Cis8cHJlPgorJmx0O2NvcHlkaXIgc3JjPSZxdW90OyR7c3JjfS9yZXNvdXJjZXMmcXVvdDsKKyAgICAgICAgIGRlc3Q9JnF1b3Q7JHtkaXN0fSZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPkNvcHkgdGhlIGRpcmVjdG9yeSA8c2FtcD4ke3NyY30vcmVzb3VyY2VzPC9zYW1wPiB0byA8c2FtcD4ke2Rpc3R9PC9zYW1wPgorcmVjdXJzaXZlbHkuIEFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMgYXJlIGNvcGllZCwgZXhjZXB0IGZvciBmaWxlcyB3aXRoIHRoZQorbmFtZSA8c2FtcD5UZXN0LmphdmE8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y29weWRpciBzcmM9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90OworICAgICAgICAgZGVzdD0mcXVvdDske2Rpc3R9JnF1b3Q7CisgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsKKyAgICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL1Rlc3QuamF2YSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNvcHkgdGhlIGRpcmVjdG9yeSA8c2FtcD4ke3NyY30vcmVzb3VyY2VzPC9zYW1wPiB0byA8c2FtcD4ke2Rpc3R9PC9zYW1wPgorcmVjdXJzaXZlbHkuIEFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMgYXJlIGNvcGllZCwgZXhjZXB0IGZvciB0aGUgZmlsZXMgdW5kZXIKK3RoZSA8c2FtcD5teXBhY2thZ2UvdGVzdDwvc2FtcD4gZGlyZWN0b3J5LjwvcD4KKzxwcmU+CismbHQ7Y29weWRpciBzcmM9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90OworICAgICAgICAgZGVzdD0mcXVvdDske2Rpc3R9JnF1b3Q7CisgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsKKyAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS90ZXN0LyoqJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY29weWZpbGUuaHRtbCBiL21hbnVhbC9UYXNrcy9jb3B5ZmlsZS5odG1sCmluZGV4IGUyMDRhN2UuLjY5M2YxMGIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jb3B5ZmlsZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jb3B5ZmlsZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNjAgKzE1LDUzIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Db3B5ZmlsZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJjb3B5ZmlsZSI+Q29weWZpbGU8L2E+PC9oMj4KLTxoMz48aT5EZXByZWNhdGVkPC9pPjwvaDM+Ci08cD48aT5UaGlzIHRhc2sgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIFVzZSB0aGUgQ29weSB0YXNrIGluc3RlYWQuPC9pPjwvcD4KKzxoMiBpZD0iY29weWZpbGUiPkNvcHlmaWxlPC9oMj4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+VGhpcyB0YXNrIGhhcyBiZWVuIDxlbT5kZXByZWNhdGVkPC9lbT4uICBVc2UgdGhlIDxjb2RlPkNvcHk8L2NvZGU+IHRhc2sgaW5zdGVhZC48L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5Db3BpZXMgYSBmaWxlIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVzdGluYXRpb24uIFRoZSBmaWxlIGlzIG9ubHkgY29waWVkIGlmCi10aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZQotZG9lcyBub3QgZXhpc3QuPC9wPgorPHA+Q29waWVzIGEgZmlsZSBmcm9tIHRoZSBzb3VyY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiBUaGUgZmlsZSBpcyBvbmx5IGNvcGllZCBpZiB0aGUgc291cmNlIGZpbGUgaXMKK25ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIGNvcHkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPnRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBjb3B5LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRvIGNvcHkgdG8uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3Q8L3RkPgorICAgIDx0ZD50aGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUgd2hlcmUgdG8gY29weSB0by48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlIGR1cmluZwotICAgICAgdGhlIGNvcHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWx0ZXJpbmc8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciB0b2tlbiBmaWx0ZXJpbmcgc2hvdWxkIHRha2UgcGxhY2UgZHVyaW5nIHRoZSBjb3B5PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2VvdmVyd3JpdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uCi0gICAgICBmaWxlcyBhcmUgbmV3ZXIgKGRlZmF1bHQgaXMgZmFsc2UpLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZvcmNlb3ZlcndyaXRlPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGVzIGFyZSBuZXdlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHA+PGNvZGU+Jmx0O2NvcHlmaWxlIHNyYz0mcXVvdDt0ZXN0LmphdmEmcXVvdDsgZGVzdD0mcXVvdDtzdWJkaXIvdGVzdC5qYXZhJnF1b3Q7LyZndDs8L2NvZGU+PC9wPgotICA8cD48Y29kZT4mbHQ7Y29weWZpbGUgc3JjPSZxdW90OyR7c3JjfS9pbmRleC5odG1sJnF1b3Q7IGRlc3Q9JnF1b3Q7JHtkaXN0fS9oZWxwL2luZGV4Lmh0bWwmcXVvdDsvJmd0OzwvY29kZT48L3A+Ci08L2Jsb2NrcXVvdGU+Ci0KKzxwcmU+CismbHQ7Y29weWZpbGUgc3JjPSZxdW90O3Rlc3QuamF2YSZxdW90OyBkZXN0PSZxdW90O3N1YmRpci90ZXN0LmphdmEmcXVvdDsvJmd0OworJmx0O2NvcHlmaWxlIHNyYz0mcXVvdDske3NyY30vaW5kZXguaHRtbCZxdW90OyBkZXN0PSZxdW90OyR7ZGlzdH0vaGVscC9pbmRleC5odG1sJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvY3ZzLmh0bWwgYi9tYW51YWwvVGFza3MvY3ZzLmh0bWwKaW5kZXggZTk0MWVkNi4uZmRiMDgzMiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2N2cy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9jdnMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE0NCArMTUsMTM2IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgIDx0aXRsZT5DVlMgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iY3ZzIj5DdnM8L2E+PC9oMj4KKzxoMiBpZD0iY3ZzIj5DdnM8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkhhbmRsZXMgcGFja2FnZXMvbW9kdWxlcyByZXRyaWV2ZWQgZnJvbSBhCi08YSBocmVmPSJodHRwOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+IHJlcG9zaXRvcnkuPC9wPgotPHA+PGI+SW1wb3J0YW50OjwvYj4gVGhpcyB0YXNrIG5lZWRzICZxdW90Ozxjb2RlPmN2czwvY29kZT4mcXVvdDsgb24gdGhlIHBhdGguIElmIGl0IGlzbid0LCB5b3Ugd2lsbCBnZXQKLWFuIGVycm9yIChzdWNoIGFzIGVycm9yIDxjb2RlPjI8L2NvZGU+IG9uIHdpbmRvd3MpLiBJZiA8Y29kZT4mbHQ7Y3ZzJmd0OzwvY29kZT4gZG9lc24ndCB3b3JrLCB0cnkgdG8gZXhlY3V0ZSA8Y29kZT5jdnMuZXhlPC9jb2RlPgotZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBhcmUgd29ya2luZy4KLUFsc28gbm90ZSB0aGF0IHRoaXMgdGFzayBhc3N1bWVzIHRoYXQgdGhlIGN2cyBleGVjdXRhYmxlIGlzIGNvbXBhdGlibGUKLXdpdGggdGhlIFVuaXggdmVyc2lvbiBmcm9tIGN2c2hvbWUub3JnLCB0aGlzIGlzIG5vdCBjb21wbGV0ZWx5IHRydWUKLWZvciBjZXJ0YWluIG90aGVyIGN2cyBjbGllbnRzIC0gbGlrZSBDVlNOVCBmb3IgZXhhbXBsZSAtIGFuZCBzb21lCi1vcGVyYXRpb24gbWF5IGZhaWwgd2hlbiB1c2luZyBzdWNoIGFuIGluY29tcGF0aWJsZSBjbGllbnQuCi08L3A+Cis8cD5IYW5kbGVzIHBhY2thZ2VzL21vZHVsZXMgcmV0cmlldmVkIGZyb20gYSA8YSBocmVmPSJodHRwczovL3d3dy5ub25nbnUub3JnL2N2cy8iCit0YXJnZXQ9Il90b3AiPkNWUzwvYT4gcmVwb3NpdG9yeS48L3A+Cis8cD48c3Ryb25nPkltcG9ydGFudDo8L3N0cm9uZz4gVGhpcyB0YXNrIG5lZWRzIDxrYmQ+Y3ZzPC9rYmQ+IGJpbmFyeSBvbiB0aGUgcGF0aC4gSWYgaXQgaXNuJ3QsIHlvdQord2lsbCBnZXQgYW4gZXJyb3IgKHN1Y2ggYXMgPGNvZGU+ZXJyb3I9MjwvY29kZT4gb24gV2luZG93cykuIElmIDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiBkb2Vzbid0Cit3b3JrLCB0cnkgdG8gZXhlY3V0ZSA8a2JkPmN2cy5leGU8L2tiZD4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdQorYXJlIHdvcmtpbmcuICBBbHNvIG5vdGUgdGhhdCB0aGlzIHRhc2sgYXNzdW1lcyB0aGF0IHRoZSA8a2JkPmN2czwva2JkPiBleGVjdXRhYmxlIGlzIGNvbXBhdGlibGUgd2l0aAordGhlIFVuaXggdmVyc2lvbiwgdGhpcyBpcyBub3QgY29tcGxldGVseSB0cnVlIGZvciBjZXJ0YWluIG90aGVyIENWUyBjbGllbnRzJm1kYXNoO2xpa2UgQ1ZTTlQgZm9yCitleGFtcGxlJm1kYXNoO2FuZCBzb21lIG9wZXJhdGlvbiBtYXkgZmFpbCB3aGVuIHVzaW5nIHN1Y2ggYW4gaW5jb21wYXRpYmxlIGNsaWVudC48L3A+CiAKLTxwPjxiPkNWU05UIE5vdGU8L2I+OiBDVlNOVCBwcmVmZXJzIHVzZXJzIHRvIHN0b3JlIHRoZSBwYXNzd29yZHMKLWluc2lkZSB0aGUgcmVnaXN0cnkuICBJZiB0aGUgPGEgaHJlZj0iY3ZzcGFzcy5odG1sIj5jdnNwYXNzIHRhc2s8L2E+Ci1hbmQgdGhlIHBhc3NmaWxlIGF0dHJpYnV0ZSBkb24ndCBzZWVtIHRvIHdvcmsgZm9yIHlvdSwgdGhlIG1vc3QgbGlrZWx5Ci1yZWFzb24gaXMgdGhhdCBDVlNOVCBpZ25vcmVzIHlvdXIgLmN2c3Bhc3MgZmlsZSBjb21wbGV0ZWx5LiAgU2VlIDxhCi1ocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIxNjU3I2M1Ij5idWd6aWxsYQorPHA+PHN0cm9uZz5DVlNOVCBOb3RlPC9zdHJvbmc+OiBDVlNOVCBwcmVmZXJzIHVzZXJzIHRvIHN0b3JlIHRoZSBwYXNzd29yZHMgaW5zaWRlIHRoZSByZWdpc3RyeS4gIElmCit0aGUgPGEgaHJlZj0iY3ZzcGFzcy5odG1sIj5jdnNwYXNzIHRhc2s8L2E+IGFuZCB0aGUgPHZhcj5wYXNzZmlsZTwvdmFyPiBhdHRyaWJ1dGUgZG9uJ3Qgc2VlbSB0byB3b3JrCitmb3IgeW91LCB0aGUgbW9zdCBsaWtlbHkgcmVhc29uIGlzIHRoYXQgQ1ZTTlQgaWdub3JlcyB5b3VyIDxzYW1wPi5jdnNwYXNzPC9zYW1wPiBmaWxlIGNvbXBsZXRlbHkuCitTZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjE2NTcjYzUiIHRhcmdldD0iX3RvcCI+YnVnemlsbGEKIHJlcG9ydCAyMTY1NzwvYT4gZm9yIHJlY29tbWVuZGVkIHdvcmthcm91bmRzLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBDVlMgY29tbWFuZCB0byBleGVjdXRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtjaGVja291dCZxdW90Oy48L3RkPgorICAgIDx0ZD5jb21tYW5kPC90ZD4KKyAgICA8dGQ+dGhlIENWUyBjb21tYW5kIHRvIGV4ZWN1dGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+Y2hlY2tvdXQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3Npb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IC0gaWYgc2V0Ci0gICAgdG8gdHJ1ZSwgdGhpcyBpcyB0aGUgc2FtZSBhcyA8Y29kZT5jb21wcmVzc2lvbmxldmVsPSZxdW90OzMmcXVvdDs8L2NvZGU+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5jb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkPjxxPnRydWU8L3E+IChlcXVpdmFsZW50IHRvIDx2YXI+Y29tcHJlc3Npb25sZXZlbDwvdmFyPj08cT4zPC9xPikgb3IgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzaW9ubGV2ZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBudW1iZXIgYmV0d2VlbiAxIGFuZCA5IChjb3JyZXNwb25kaW5nIHRvCi0gICAgcG9zc2libGUgdmFsdWVzIGZvciBDVlMnIDxjb2RlPi16IzwvY29kZT4gYXJndW1lbnQpLiBBbnkKLSAgICBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIDxjb2RlPmNvbXByZXNzaW9uPSZxdW90O2ZhbHNlJnF1b3Q7PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby4gRGVmYXVsdHMgdG8gbm8gY29tcHJlc3Npb24uPC90ZD4KLSAgPC90cj4KLQotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jdnNSb290PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5DVlNST09UPC9jb2RlPiB2YXJpYWJsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jb21wcmVzc2lvbmxldmVsPC90ZD4KKyAgICA8dGQ+QSBudW1iZXIgYmV0d2VlbiA8cT4xPC9xPiBhbmQgPHE+OTwvcT4gKGNvcnJlc3BvbmRpbmcgdG8gcG9zc2libGUgdmFsdWVzIGZvcgorICAgICAgQ1ZTIDxrYmQ+LXojPC9rYmQ+IGFyZ3VtZW50KS4gQW55IG90aGVyIHZhbHVlIGlzIHRyZWF0ZWQKKyAgICAgIGFzIDx2YXI+Y29tcHJlc3Npb248L3Zhcj49PHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIG5vIGNvbXByZXNzaW9uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUnNoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jdnNSb290PC90ZD4KKyAgICA8dGQ+dGhlIDxjb2RlPkNWU1JPT1Q8L2NvZGU+IHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQKLSAgICBiZSBwbGFjZWQuICBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBDVlMncyA8Y29kZT4tZDwvY29kZT4gY29tbWFuZCBsaW5lCi0gICAgc3dpdGNoIGFzIEFwYWNoZSBBbnQgd2lsbCBuZXZlciBzaG9ydGVuIHBhdGhuYW1lcyB0byBhdm9pZCBlbXB0eQotICAgIGRpcmVjdG9yaWVzLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBwcm9qZWN0J3MgYmFzZWRpci48L3RkPgorICAgIDx0ZD5jdnNSc2g8L3RkPgorICAgIDx0ZD50aGUgPGNvZGU+Q1ZTX1JTSDwvY29kZT4gdmFyaWFibGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwYWNrYWdlL21vZHVsZSB0byBjaGVjayBvdXQuICA8Yj5Ob3RlOjwvYj4KLSAgICAgIG11bHRpcGxlIGF0dHJpYnV0ZXMgY2FuIGJlIHNwbGl0IHVzaW5nIHNwYWNlcy4gIFVzZSBhIG5lc3RlZAotICAgICAgJmx0O21vZHVsZSZndDsgZWxlbWVudCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbW9kdWxlIHdpdGgKLSAgICAgIHNwYWNlcyBpbiBpdHMgbmFtZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5kZXN0PC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2hlY2tlZCBvdXQgZmlsZXMgc2hvdWxkIGJlIHBsYWNlZC4gIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudAorICAgICAgZnJvbSBDVlMncyA8a2JkPi1kPC9rYmQ+IGNvbW1hbmQgbGluZSBzd2l0Y2ggYXMgQXBhY2hlIEFudCB3aWxsIG5ldmVyIHNob3J0ZW4gcGF0aG5hbWVzIHRvCisgICAgICBhdm9pZCBlbXB0eSBkaXJlY3Rvcmllcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB0YWcgb2YgdGhlIHBhY2thZ2UvbW9kdWxlIHRvIGNoZWNrIG91dC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5wYWNrYWdlPC90ZD4KKyAgICA8dGQ+dGhlIHBhY2thZ2UvbW9kdWxlIHRvIGNoZWNrIG91dC4gIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogbXVsdGlwbGUgYXR0cmlidXRlcyBjYW4gYmUgc3BsaXQKKyAgICAgIHVzaW5nIHNwYWNlcy4gIFVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7bW9kdWxlJmd0OzwvY29kZT4gZWxlbWVudCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEKKyAgICAgIG1vZHVsZSB3aXRoIHNwYWNlcyBpbiBpdHMgbmFtZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRhdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXRlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dGFnPC90ZD4KKyAgICA8dGQ+dGhlIHRhZyBvZiB0aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cXVpZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3MgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgc2FtZSBhcyA8Y29kZT4tcTwvY29kZT4gb24gdGhlIGNvbW1hbmQgbGluZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5kYXRlPC90ZD4KKyAgICA8dGQ+VXNlIHRoZSBtb3N0IHJlY2VudCByZXZpc2lvbiBubyBsYXRlciB0aGFuIHRoZSBnaXZlbiBkYXRlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWFsbHlxdWlldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdXBwcmVzcyBhbGwgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIHNhbWUgYXMKLSAgICAgIDxjb2RlPi1RPC9jb2RlPiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5xdWlldDwvdGQ+CisgICAgPHRkPnN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIHNhbWUgYXMgPGtiZD4tcTwva2JkPiBvbiB0aGUgY29tbWFuZAorICAgIGxpbmUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5vZXhlYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXBvcnQgb25seSwgZG9uJ3QgY2hhbmdlIGFueSBmaWxlcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgdG8gJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5yZWFsbHlxdWlldDwvdGQ+CisgICAgPHRkPnN1cHByZXNzIGFsbCBtZXNzYWdlcy4gVGhpcyBpcyB0aGUgc2FtZSBhcyA8a2JkPi1RPC9rYmQ+IG9uIHRoZSBjb21tYW5kIGxpbmUuICA8ZW0+c2luY2UKKyAgICAgIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIGRpcmVjdCBzdGFuZGFyZCBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgb3V0cHV0IHRvIEFOVCBMb2cgYXMgPGNvZGU+TVNHX0lORk88L2NvZGU+LjwvdGQ+CisgICAgPHRkPm5vZXhlYzwvdGQ+CisgICAgPHRkPnJlcG9ydCBvbmx5LCBkb24ndCBjaGFuZ2UgYW55IGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byBkaXJlY3Qgc3RhbmRhcmQgZXJyb3IgZnJvbSB0aGUgY29tbWFuZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgZXJyb3IgdG8gQU5UIExvZyBhcyA8Y29kZT5NU0dfV0FSTjwvY29kZT4uPC90ZD4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIG91dHB1dCBmcm9tIHRoZSBjb21tYW5kLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIG91dHB1dCB0byB0aGUgbG9nIGFzIDxjb2RlPk1TR19JTkZPPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGFwcGVuZCBvdXRwdXQvZXJyb3Igd2hlbiByZWRpcmVjdGluZyB0byBhIGZpbGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IHRvICZxdW90O2ZhbHNlJnF1b3Q7LjwvdGQ+CisgICAgPHRkPmVycm9yPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdG8gZGlyZWN0IHN0YW5kYXJkIGVycm9yIGZyb20gdGhlIGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgZXJyb3IgdG8gdGhlIGxvZyBhcyA8Y29kZT5NU0dfV0FSTjwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wb3J0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlBvcnQgdXNlZCBieSBDVlMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgc2VydmVyLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBwb3J0IDxjb2RlPjI0MDE8L2NvZGU+LjwvdGQ+CisgICAgPHRkPmFwcGVuZDwvdGQ+CisgICAgPHRkPndoZXRoZXIgdG8gYXBwZW5kIG91dHB1dC9lcnJvciB3aGVuIHJlZGlyZWN0aW5nIHRvIGEgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBmaWxlIDxjb2RlPn4vLmN2c3Bhc3M8L2NvZGU+LjwvdGQ+CisgICAgPHRkPnBvcnQ8L3RkPgorICAgIDx0ZD5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4yNDAxPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gICAgICByZXR1cm4gY29kZSBvdGhlciB0aGFuIDxjb2RlPjA8L2NvZGU+LiBEZWZhdWx0cyB0byAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnBhc3NmaWxlPC90ZD4KKyAgICA8dGQ+UGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPn4vLmN2c3Bhc3M8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPHE+MDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC0xNTksMzkgKzE1Miw0MCBAQAogCiA8aDQ+bW9kdWxlPC9oND4KIAotPHA+U3BlY2lmaWVzIGEgcGFja2FnZS9tb2R1bGUgdG8gd29yayBvbiwgdW5saWtlIHRoZSBwYWNrYWdlIGF0dHJpYnV0ZQotICBtb2R1bGVzIHNwZWNpZmllZCB1c2luZyB0aGlzIGF0dHJpYnV0ZSBjYW4gY29udGFpbiBzcGFjZXMgaW4gdGhlaXIKLSAgbmFtZS48L3A+Cis8cD5TcGVjaWZpZXMgYSBwYWNrYWdlL21vZHVsZSB0byB3b3JrIG9uLCB1bmxpa2UgdGhlIHBhY2thZ2UgYXR0cmlidXRlIG1vZHVsZXMgc3BlY2lmaWVkIHVzaW5nIHRoaXMKK2F0dHJpYnV0ZSBjYW4gY29udGFpbiBzcGFjZXMgaW4gdGhlaXIgbmFtZS48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbW9kdWxlJ3MvcGFja2FnZSdzIG5hbWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcy48L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG1vZHVsZSdzL3BhY2thZ2UncyBuYW1lLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtjdnMgY3ZzUm9vdD0mcXVvdDs6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyZxdW90OwotICAgICAgIHBhY2thZ2U9JnF1b3Q7YW50JnF1b3Q7Ci0gICAgICAgZGVzdD0mcXVvdDske3dzLmRpcn0mcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNoZWNrcyBvdXQgdGhlIHBhY2thZ2UvbW9kdWxlICZxdW90O2FudCZxdW90OyBmcm9tIHRoZSBDVlMKLXJlcG9zaXRvcnkgcG9pbnRlZCB0byBieSB0aGUgPGNvZGU+Y3ZzUm9vdDwvY29kZT4gYXR0cmlidXRlLCBhbmQgc3RvcmVzIHRoZSBmaWxlcyBpbiAmcXVvdDs8Y29kZT4ke3dzLmRpcn08L2NvZGU+JnF1b3Q7LjwvcD4KLTxwcmU+ICAmbHQ7Y3ZzIGRlc3Q9JnF1b3Q7JHt3cy5kaXJ9JnF1b3Q7IGNvbW1hbmQ9JnF1b3Q7dXBkYXRlJnF1b3Q7LyZndDs8L3ByZT4KLTxwPnVwZGF0ZXMgdGhlIHBhY2thZ2UvbW9kdWxlIHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiBjaGVja2VkIG91dCBpbnRvCi0mcXVvdDs8Y29kZT4ke3dzLmRpcn08L2NvZGU+JnF1b3Q7LjwvcD4KIAotPHByZT4gICZsdDtjdnMgY29tbWFuZD0mcXVvdDstcSBkaWZmIC11IC1OJnF1b3Q7IG91dHB1dD0mcXVvdDtwYXRjaC50eHQmcXVvdDsvJmd0OzwvcHJlPgorPHA+Q2hlY2sgb3V0IHRoZSBwYWNrYWdlL21vZHVsZSA8c2FtcD5hbnQ8L3NhbXA+IGZyb20gdGhlIENWUyByZXBvc2l0b3J5IHBvaW50ZWQgdG8gYnkKK3RoZSA8dmFyPmN2c1Jvb3Q8L3Zhcj4gYXR0cmlidXRlLCBhbmQgc3RvcmUgdGhlIGZpbGVzIGluIDxzYW1wPiR7d3MuZGlyfTwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtjdnMgY3ZzUm9vdD0mcXVvdDs6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyZxdW90OworICAgICBwYWNrYWdlPSZxdW90O2FudCZxdW90OworICAgICBkZXN0PSZxdW90OyR7d3MuZGlyfSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPnNpbGVudGx5ICg8Y29kZT4tcTwvY29kZT4pIGNyZWF0ZXMgYSBmaWxlIGNhbGxlZCA8Y29kZT5wYXRjaC50eHQ8L2NvZGU+IHdoaWNoIGNvbnRhaW5zIGEgdW5pZmllZCAoPGNvZGU+LXU8L2NvZGU+KSBkaWZmIHdoaWNoIGluY2x1ZGVzIG5ldyBmaWxlcyBhZGRlZCB2aWEgJnF1b3Q7Y3ZzIGFkZCZxdW90OyAoPGNvZGU+LU48L2NvZGU+KSBhbmQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgdG8gcGF0Y2guCi1UaGUgZXF1aXZhbGVudCwgdXNpbmcgIDxjb2RlPiZsdDtjb21tYW5kbGluZSZndDs8L2NvZGU+IGVsZW1lbnRzLCBpczoKLTwvcD4KKzxwPlVwZGF0ZSB0aGUgcGFja2FnZS9tb2R1bGUgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIGNoZWNrZWQgb3V0IGludG8gPHNhbXA+JHt3cy5kaXJ9PC9zYW1wPi48L3A+Cis8cHJlPiZsdDtjdnMgZGVzdD0mcXVvdDske3dzLmRpcn0mcXVvdDsgY29tbWFuZD0mcXVvdDt1cGRhdGUmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TaWxlbnRseSAoPGtiZD4tcTwva2JkPikgY3JlYXRlIGEgZmlsZSBjYWxsZWQgPHNhbXA+cGF0Y2gudHh0PC9zYW1wPiBjb250YWluaW5nIGEgdW5pZmllZAorKDxrYmQ+LXU8L2tiZD4pIGRpZmYgd2hpY2ggaW5jbHVkZXMgbmV3IGZpbGVzIGFkZGVkIHZpYSA8a2JkPmN2cyBhZGQ8L2tiZD4gKDxrYmQ+LU48L2tiZD4pIGFuZCBjYW4KK2JlIHVzZWQgYXMgaW5wdXQgdG8gPGtiZD5wYXRjaDwva2JkPi48L3A+Cis8cHJlPiZsdDtjdnMgY29tbWFuZD0mcXVvdDstcSBkaWZmIC11IC1OJnF1b3Q7IG91dHB1dD0mcXVvdDtwYXRjaC50eHQmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5UaGUgZXF1aXZhbGVudCwgdXNpbmcgPGNvZGU+Jmx0O2NvbW1hbmRsaW5lJmd0OzwvY29kZT4gZWxlbWVudHMsIGlzOjwvcD4KIDxwcmU+CiAmbHQ7Y3ZzIG91dHB1dD0mcXVvdDtwYXRjaCZxdW90OyZndDsKICAgICAmbHQ7Y29tbWFuZGxpbmUmZ3Q7CkBAIC0yMDAsMzEgKzE5NCwyNyBAQAogICAgICAgICAmbHQ7YXJndW1lbnQgdmFsdWU9JnF1b3Q7LXUmcXVvdDsvJmd0OwogICAgICAgICAmbHQ7YXJndW1lbnQgdmFsdWU9JnF1b3Q7LU4mcXVvdDsvJmd0OwogICAgICZsdDsvY29tbWFuZGxpbmUmZ3Q7Ci0mbHQ7L2N2cyZndDsKLTwvcHJlPgotb3I6CismbHQ7L2N2cyZndDs8L3ByZT4KKzxwPm9yOjwvcD4KIDxwcmU+CiAmbHQ7Y3ZzIG91dHB1dD0mcXVvdDtwYXRjaCZxdW90OyZndDsKICAgICAmbHQ7Y29tbWFuZGxpbmUmZ3Q7CiAgICAgICAgICZsdDthcmd1bWVudCBsaW5lPSZxdW90Oy1xIGRpZmYgLXUgLU4mcXVvdDsvJmd0OwogICAgICZsdDsvY29tbWFuZGxpbmUmZ3Q7Ci0mbHQ7L2N2cyZndDsKLTwvcHJlPgotPHA+Ci1Zb3UgbWF5IGluY2x1ZGUgYXMgbWFueSA8Y29kZT4mbHQ7Y29tbWFuZGxpbmUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcyB5b3UgbGlrZS4gCi1FYWNoIHdpbGwgaW5oZXJpdCB0aGUgPGNvZGU+ZmFpbG9uZXJyb3I8L2NvZGU+LCA8Y29kZT5jb21wcmVzc2lvbjwvY29kZT4sIGFuZCBvdGhlciAmcXVvdDtnbG9iYWwmcXVvdDsgcGFyYW1ldGVycwotZnJvbSB0aGUgPGNvZGU+Jmx0O2N2cyZndDs8L2NvZGU+IGVsZW1lbnQuCi08L3A+CismbHQ7L2N2cyZndDs8L3ByZT4KKzxwPllvdSBtYXkgaW5jbHVkZSBhcyBtYW55IDxjb2RlPiZsdDtjb21tYW5kbGluZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIHlvdSBsaWtlLiAgRWFjaCB3aWxsIGluaGVyaXQKK3RoZSA8dmFyPmZhaWxvbmVycm9yPC92YXI+LCA8dmFyPmNvbXByZXNzaW9uPC92YXI+LCBhbmQgb3RoZXIgJnF1b3Q7Z2xvYmFsJnF1b3Q7IHBhcmFtZXRlcnMgZnJvbQordGhlIDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KIAotCi08cHJlPiAgJmx0O2N2cyBjb21tYW5kPSZxdW90O3VwZGF0ZSAtQSAtZCZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5VcGRhdGVzIGZyb20gdGhlIGhlYWQgb2YgcmVwb3NpdG9yeSBpZ25vcmluZyBzdGlja3kgYml0cyAoPGNvZGU+LUE8L2NvZGU+KSBhbmQgY3JlYXRpbmcgYW55IG5ldyBkaXJlY3RvcmllcyBhcyBuZWNlc3NhcnkgKDxjb2RlPi1kPC9jb2RlPikuPC9wPgotPHA+Tm90ZTogdGhlIHRleHQgb2YgdGhlIGNvbW1hbmQgaXMgcGFzc2VkIHRvIGN2cyAmcXVvdDthcy1pcyZxdW90OyBzbyBhbnkgY3ZzIG9wdGlvbnMgc2hvdWxkIGFwcGVhcgotYmVmb3JlIHRoZSBjb21tYW5kLCBhbmQgYW55IGNvbW1hbmQgb3B0aW9ucyBzaG91bGQgYXBwZWFyIGFmdGVyIHRoZSBjb21tYW5kIGFzIGluIHRoZSBkaWZmIGV4YW1wbGUKLWFib3ZlLiBTZWUgPGEgaHJlZj0iaHR0cDovL3hpbWJpb3QuY29tL2N2cy93aWtpL2luZGV4LnBocD90aXRsZT1DYXRlZ29yeTpVc2VyX0RvY3VtZW50YXRpb24iIHRhcmdldD0iX3RvcCI+dGhlIGN2cyBtYW51YWw8L2E+IGZvciBkZXRhaWxzLAotc3BlY2lmaWNhbGx5IHRoZSA8YSBocmVmPSJodHRwOi8veGltYmlvdC5jb20vY3ZzL3dpa2kvaW5kZXgucGhwP3RpdGxlPUNWUy0tQ29uY3VycmVudF9WZXJzaW9uc19TeXN0ZW1fdjEuMTIuMTIuMTpfR3VpZGVfdG9fQ1ZTX2NvbW1hbmRzI1NFQzExNiIgdGFyZ2V0PSJfdG9wIj5HdWlkZSB0byBDVlMgY29tbWFuZHM8L2E+PC9wPgotCis8cD5VcGRhdGUgZnJvbSB0aGUgaGVhZCBvZiByZXBvc2l0b3J5IGlnbm9yaW5nIHN0aWNreSBiaXRzICg8a2JkPi1BPC9rYmQ+KSBhbmQgY3JlYXRpbmcgYW55IG5ldworZGlyZWN0b3JpZXMgYXMgbmVjZXNzYXJ5ICg8a2JkPi1kPC9rYmQ+KS48L3A+Cis8cHJlPiZsdDtjdnMgY29tbWFuZD0mcXVvdDt1cGRhdGUgLUEgLWQmcXVvdDsvJmd0OzwvcHJlPgorPHA+Tm90ZTogdGhlIHRleHQgb2YgdGhlIGNvbW1hbmQgaXMgcGFzc2VkIHRvIDxrYmQ+Y3ZzPC9rYmQ+ICZxdW90O2FzLWlzJnF1b3Q7IHNvIGFueSA8a2JkPmN2czwva2JkPgorb3B0aW9ucyBzaG91bGQgYXBwZWFyIGJlZm9yZSB0aGUgY29tbWFuZCwgYW5kIGFueSBjb21tYW5kIG9wdGlvbnMgc2hvdWxkIGFwcGVhciBhZnRlciB0aGUgY29tbWFuZCBhcworaW4gdGhlIDxjb2RlPmRpZmY8L2NvZGU+IGV4YW1wbGUgYWJvdmUuIFNlZSA8YSBocmVmPSJodHRwOi8vY3ZzYm9vay5yZWQtYmVhbi5jb20vY3ZzYm9vay5odG1sIgordGFyZ2V0PSJfdG9wIj50aGUgQ1ZTIGJvb2s8L2E+IGZvciBkZXRhaWxzLCBzcGVjaWZpY2FsbHkKK3RoZSA8YSBocmVmPSJodHRwOi8vY3ZzYm9vay5yZWQtYmVhbi5jb20vY3ZzYm9vay5odG1sI0NvbW1hbmRzJTIwQW5kJTIwT3B0aW9ucyIgdGFyZ2V0PSJfdG9wIj5HdWlkZQordG8gQ1ZTIGNvbW1hbmRzPC9hPi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2N2c3Bhc3MuaHRtbCBiL21hbnVhbC9UYXNrcy9jdnNwYXNzLmh0bWwKaW5kZXggMTg1ZGRlNy4uNWMzYTEwNiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2N2c3Bhc3MuaHRtbAorKysgYi9tYW51YWwvVGFza3MvY3ZzcGFzcy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTcgKzE1LDU0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5DVlNQYXNzIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImN2cyI+Y3ZzcGFzczwvYT48L2gyPgorPGgyIGlkPSJjdnMiPmN2c3Bhc3M8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkFkZHMgZW50cmllcyB0byBhIC5jdnNwYXNzIGZpbGUuIEFkZGluZyBlbnRyaWVzIHRvIHRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgYWZmZWN0IGFzIGEgY3ZzIGxvZ2luIGNvbW1hbmQuPC9wPgorPHA+QWRkcyBlbnRyaWVzIHRvIGEgPHNhbXA+LmN2c3Bhc3M8L3NhbXA+IGZpbGUuIEFkZGluZyBlbnRyaWVzIHRvIHRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgYWZmZWN0IGFzCithIDxrYmQ+Y3ZzIGxvZ2luPC9rYmQ+IGNvbW1hbmQuPC9wPgogCi08cD48Yj5DVlNOVCBOb3RlPC9iPjogQ1ZTTlQgcHJlZmVycyB1c2VycyB0byBzdG9yZSB0aGUgcGFzc3dvcmRzCi1pbnNpZGUgdGhlIHJlZ2lzdHJ5LiAgSWYgdGhlIHRhc2sgZG9lc24ndCBzZWVtIHRvIHdvcmsgZm9yIHlvdSwgdGhlCi1tb3N0IGxpa2VseSByZWFzb24gaXMgdGhhdCBDVlNOVCBpZ25vcmVzIHlvdXIgLmN2c3Bhc3MgZmlsZQotY29tcGxldGVseS4gIFNlZSA8YQotaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMTY1NyNjNSI+YnVnCi16aWxsYSByZXBvcnQgMjE2NTc8L2E+IGZvciByZWNvbW1lbmRlZCB3b3JrYXJvdW5kcy48L3A+Cis8cD48c3Ryb25nPkNWU05UIE5vdGU8L3N0cm9uZz46IENWU05UIHByZWZlcnMgdXNlcnMgdG8gc3RvcmUgdGhlIHBhc3N3b3JkcyBpbnNpZGUgdGhlIHJlZ2lzdHJ5LiAgSWYKK3RoZSB0YXNrIGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGZvciB5b3UsIHRoZSBtb3N0IGxpa2VseSByZWFzb24gaXMgdGhhdCBDVlNOVCBpZ25vcmVzCit5b3VyIDxzYW1wPi5jdnNwYXNzPC9zYW1wPiBmaWxlCitjb21wbGV0ZWx5LiBTZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjE2NTcjYzUiCit0YXJnZXQ9Il90b3AiPmJ1Z3ppbGxhIHJlcG9ydCAyMTY1NzwvYT4gZm9yIHJlY29tbWVuZGVkIHdvcmthcm91bmRzLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jdnNyb290PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBDVlMgcmVwb3NpdG9yeSB0byBhZGQgYW4gZW50cnkgZm9yLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5jdnNyb290PC90ZD4KKyAgICA8dGQ+dGhlIENWUyByZXBvc2l0b3J5IHRvIGFkZCBhbiBlbnRyeSBmb3IuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgdG8gYmUgYWRkZWQgdG8gdGhlIHBhc3N3b3JkIGZpbGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+UGFzc3dvcmQgdG8gYmUgYWRkZWQgdG8gdGhlIHBhc3N3b3JkIGZpbGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UGFzc3dvcmQgZmlsZSB0byBhZGQgdGhlIGVudHJ5IHRvLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8Y29kZT5+Ly5jdnNwYXNzPC9jb2RlPi48L3RkPgorICAgIDx0ZD5wYXNzZmlsZTwvdGQ+CisgICAgPHRkPlBhc3N3b3JkIGZpbGUgdG8gYWRkIHRoZSBlbnRyeSB0by48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5+Ly5jdnNwYXNzPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7Y3ZzcGFzcyBjdnNyb290PSZxdW90Ozpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljJnF1b3Q7Ci0gICAgICAgcGFzc3dvcmQ9JnF1b3Q7YW5vbmN2cyZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+QWRkcyBhbiBlbnRyeSBpbnRvIHRoZSB+Ly5jdnNwYXNzIHBhc3N3b3JkIGZpbGUuPC9wPgotCis8cD5BZGQgYW4gZW50cnkgaW50byB0aGUgPHNhbXA+fi8uY3ZzcGFzczwvc2FtcD4gcGFzc3dvcmQgZmlsZS48L3A+Cis8cHJlPgorJmx0O2N2c3Bhc3MgY3Zzcm9vdD0mcXVvdDs6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyZxdW90OworICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7YW5vbmN2cyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2N2c3RhZ2RpZmYuaHRtbCBiL21hbnVhbC9UYXNrcy9jdnN0YWdkaWZmLmh0bWwKaW5kZXggZjQwODNhOS4uYWQxYzY3ZSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2N2c3RhZ2RpZmYuaHRtbAorKysgYi9tYW51YWwvVGFza3MvY3ZzdGFnZGlmZi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTI0ICsxNSwxMTYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5DdnNUYWdEaWZmIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogPGJvZHk+Ci08aDI+PGEgbmFtZT0iY3ZzdGFnZGlmZiI+Q3ZzVGFnRGlmZjwvYT48L2gyPgorPGgyIGlkPSJjdnN0YWdkaWZmIj5DdnNUYWdEaWZmPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5HZW5lcmF0ZXMgYW4gWE1MLWZvcm1hdHRlZCByZXBvcnQgZmlsZSBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byB0YWdzIG9yIGRhdGVzIHJlY29yZGVkIGluIGEKLTxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4gcmVwb3NpdG9yeS4gPC9wPgotPHA+PGI+SW1wb3J0YW50OjwvYj4gVGhpcyB0YXNrIG5lZWRzICZxdW90Ozxjb2RlPmN2czwvY29kZT4mcXVvdDsgb24gdGhlIHBhdGguIElmIGl0IGlzbid0LCB5b3Ugd2lsbCBnZXQKLWFuIGVycm9yIChzdWNoIGFzIGVycm9yIDxjb2RlPjI8L2NvZGU+IG9uIHdpbmRvd3MpLiBJZiA8Y29kZT4mbHQ7Y3ZzJmd0OzwvY29kZT4gZG9lc24ndCB3b3JrLCB0cnkgdG8gZXhlY3V0ZSA8Y29kZT5jdnMuZXhlPC9jb2RlPgotZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBhcmUgd29ya2luZy4KLUFsc28gbm90ZSB0aGF0IHRoaXMgdGFzayBhc3N1bWVzIHRoYXQgdGhlIGN2cyBleGVjdXRhYmxlIGlzIGNvbXBhdGlibGUKLXdpdGggdGhlIFVuaXggdmVyc2lvbiBmcm9tIGN2c2hvbWUub3JnLCB0aGlzIGlzIG5vdCBjb21wbGV0ZWx5IHRydWUKLWZvciBjZXJ0YWluIG90aGVyIGN2cyBjbGllbnRzIC0gbGlrZSBDVlNOVCBmb3IgZXhhbXBsZSAtIGFuZCBzb21lCi1vcGVyYXRpb24gbWF5IGZhaWwgd2hlbiB1c2luZyBzdWNoIGFuIGluY29tcGF0aWJsZSBjbGllbnQuCi08L3A+Cis8cD5HZW5lcmF0ZXMgYW4gWE1MLWZvcm1hdHRlZCByZXBvcnQgZmlsZSBvZiB0aGUgY2hhbmdlcyBiZXR3ZWVuIHR3byB0YWdzIG9yIGRhdGVzIHJlY29yZGVkIGluCithIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+IHJlcG9zaXRvcnkuPC9wPgorPHA+PHN0cm9uZz5JbXBvcnRhbnQ8L3N0cm9uZz46IFRoaXMgdGFzayBuZWVkcyA8a2JkPmN2czwva2JkPiBvbiB0aGUgcGF0aC4gSWYgaXQgaXNuJ3QsIHlvdSB3aWxsIGdldAorYW4gZXJyb3IgKHN1Y2ggYXMgPGNvZGU+ZXJyb3I9MjwvY29kZT4gb24gV2luZG93cykuIElmIDxjb2RlPiZsdDtjdnMmZ3Q7PC9jb2RlPiBkb2Vzbid0IHdvcmssIHRyeSB0bworZXhlY3V0ZSA8a2JkPmN2cy5leGU8L2tiZD4gZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHlvdSBhcmUgd29ya2luZy4KK0Fsc28gbm90ZSB0aGF0IHRoaXMgdGFzayBhc3N1bWVzIHRoYXQgdGhlIDxrYmQ+Y3ZzPC9rYmQ+IGV4ZWN1dGFibGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBVbml4Cit2ZXJzaW9uLCB0aGlzIGlzIG5vdCBjb21wbGV0ZWx5IHRydWUgZm9yIGNlcnRhaW4gb3RoZXIgQ1ZTIGNsaWVudHMmbWRhc2g7bGlrZSBDVlNOVCBmb3IKK2V4YW1wbGUmbWRhc2g7YW5kIHNvbWUgb3BlcmF0aW9uIG1heSBmYWlsIHdoZW4gdXNpbmcgc3VjaCBhbiBpbmNvbXBhdGlibGUgY2xpZW50LjwvcD4KIDxwPlRoaXMgdGFzayBjYXB0dXJlcyB0aGUgb3V0cHV0IG9mIHRoZSBDVlMgY29tbWFuZCBpbiBhIGZpbGUgaW5zaWRlIG9mCiAgIHRoZSA8YSBocmVmPSIuLi9ydW5uaW5nLmh0bWwjdG1wZGlyIj50ZW1wb3JhcnkgZGlyZWN0b3J5PC9hPi48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0YXJ0VGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlYXJsaWVzdCB0YWcgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUKLSAgICAgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+ZXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICAgIDx0ZD5zdGFydFRhZzwvdGQ+CisgICAgPHRkPlRoZSBlYXJsaWVzdCB0YWcgZnJvbSB3aGljaCBkaWZmcyBhcmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RhcnREYXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlYXJsaWVzdCBkYXRlIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPGJyPgotICAgICBhY2NlcHRzIGFsbCBmb3JtYXRzIGFjY2VwdGVkIGJ5IHRoZSBjdnMgY29tbWFuZCBmb3IgLUQgZGF0ZV9zcGVjIGFyZ3VtZW50czwvdGQ+CisgICAgPHRkPnN0YXJ0RGF0ZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgZWFybGllc3QgZGF0ZSBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgcmVwb3J0Ljxici8+QWNjZXB0cyBhbGwgZm9ybWF0cyBhY2NlcHRlZCBieSB0aGUgPGtiZD5jdnM8L2tiZD4gY29tbWFuZCBmb3IgPGtiZD4tRAorICAgICBkYXRlX3NwZWM8L2tiZD4gYXJndW1lbnRzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZFRhZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGF0ZXN0IHRhZyBmcm9tIHdoaWNoIGRpZmZzIGFyZSB0byBiZQotICAgICBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj5leGFjdGx5IG9uZSBvZiB0aGUgdHdvLjwvdGQ+CisgICAgPHRkPmVuZFRhZzwvdGQ+CisgICAgPHRkPlRoZSBsYXRlc3QgdGFnIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZERhdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxhdGVzdCBkYXRlIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlCi0gICAgIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPGJyPgotICAgICBhY2NlcHRzIGFsbCBmb3JtYXRzIGFjY2VwdGVkIGJ5IHRoZSBjdnMgY29tbWFuZCBmb3IgLUQgZGF0ZV9zcGVjIGFyZ3VtZW50czwvdGQ+CisgICAgPHRkPmVuZERhdGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGxhdGVzdCBkYXRlIGZyb20gd2hpY2ggZGlmZnMgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSByZXBvcnQuPGJyLz5BY2NlcHRzCisgICAgIGFsbCBmb3JtYXRzIGFjY2VwdGVkIGJ5IHRoZSA8a2JkPmN2czwva2JkPiBjb21tYW5kIGZvciA8a2JkPi1EIGRhdGVfc3BlYzwva2JkPgorICAgICBhcmd1bWVudHMuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIGRpZmYgcmVwb3J0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIGluIHdoaWNoIHRvIHdyaXRlIHRoZSBkaWZmIHJlcG9ydC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVSZW1vdmVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gc2V0IHRvIHRydWUsIHRoZSByZXBvcnQgd2lsbCBub3QgaW5jbHVkZSBhbnkKLSAgICAgIHJlbW92ZWQgZmlsZXMuICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5pZ25vcmVSZW1vdmVkPC90ZD4KKyAgICA8dGQ+V2hlbiBzZXQgdG8gPHE+dHJ1ZTwvcT4sIHRoZSByZXBvcnQgd2lsbCBub3QgaW5jbHVkZSBhbnkgcmVtb3ZlZCBmaWxlcy4gIDxlbT5TaW5jZSBBcGFjaGUKKyAgICAgIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBpbmhlcml0ZWQgZnJvbSB0aGUgPGNvZGU+Y3ZzPC9jb2RlPiB0YXNrPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3Npb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPmZhbHNlPC9jb2RlPiwgb3IgdGhlIG51bWJlciAxLTkgKGNvcnJlc3BvbmRpbmcgdG8gcG9zc2libGUgdmFsdWVzIGZvciBDVlMgPGNvZGU+LXojPC9jb2RlPiBhcmd1bWVudCkuIEFueSBvdGhlciB2YWx1ZSBpcyB0cmVhdGVkIGFzIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0cyB0byBubyBjb21wcmVzc2lvbi4gaWYgcGFzc2VkIDxjb2RlPnRydWU8L2NvZGU+LCBsZXZlbCAzIGNvbXByZXNzaW9uIGlzIGFzc3VtZWQuPC90ZD4KKyAgICA8dGQ+Y29tcHJlc3Npb248L3RkPgorICAgIDx0ZD48cT50cnVlPC9xPiAoZXF1aXZhbGVudCB0byA8cT4zPC9xPiksIDxxPmZhbHNlPC9xPiwgb3IgYSBudW1iZXIgYmV0d2VlbiA8cT4xPC9xPgorICAgIGFuZCA8cT45PC9xPiAoY29ycmVzcG9uZGluZyB0byBwb3NzaWJsZSB2YWx1ZXMgZm9yIENWUyA8a2JkPi16Izwva2JkPiBhcmd1bWVudCkuIEFueSBvdGhlcgorICAgIHZhbHVlIGlzIHRyZWF0ZWQgYXMgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIG5vIGNvbXByZXNzaW9uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUm9vdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgQ1ZTUk9PVCB2YXJpYWJsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jdnNSb290PC90ZD4KKyAgICA8dGQ+dGhlIDxjb2RlPkNWU1JPT1Q8L2NvZGU+IHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUnNoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBDVlNfUlNIIHZhcmlhYmxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmN2c1JzaDwvdGQ+CisgICAgPHRkPnRoZSA8Y29kZT5DVlNfUlNIPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhY2thZ2UvbW9kdWxlIHRvIGFuYWx5emUuPGJyPgotICAgIFNpbmNlIEFudCAxLjYKLSAgICBtdWx0aXBsZSBwYWNrYWdlcyBzZXBhcmF0ZWQgYnkgc3BhY2VzIGFyZSBwb3NzaWJsZS4KLSAgICBhbGlhc2VzIGNvcnJlc3BvbmRpbmcgdG8gZGlmZmVyZW50IG1vZHVsZXMgYXJlIGFsc28gcG9zc2libGUKLSAgICBVc2UgYSBuZXN0ZWQgJmx0O21vZHVsZSZndDsgZWxlbWVudCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbW9kdWxlIHdpdGgKLSAgICBzcGFjZXMgaW4gaXRzIG5hbWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPnBhY2thZ2U8L3RkPgorICAgIDx0ZD50aGUgcGFja2FnZS9tb2R1bGUgdG8gYW5hbHl6ZS48YnIvPjxlbT5TaW5jZSBBbnQgMS42PC9lbT4gbXVsdGlwbGUgcGFja2FnZXMgc2VwYXJhdGVkIGJ5CisgICAgICBzcGFjZXMgYXJlIHBvc3NpYmxlLiAgYWxpYXNlcyBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudCBtb2R1bGVzIGFyZSBhbHNvIHBvc3NpYmxlLiAgVXNlIGEKKyAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7bW9kdWxlJmd0OzwvY29kZT4gZWxlbWVudCBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgbW9kdWxlIHdpdGggc3BhY2VzIGluIGl0cworICAgICAgbmFtZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzIGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7PC90ZD4KKyAgICA8dGQ+cXVpZXQ8L3RkPgorICAgIDx0ZD5zdXBwcmVzcyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IHBvcnQgMjQwMS48L3RkPgorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+UG9ydCB1c2VkIGJ5IENWUyB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+MjQwMTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGZpbGUgPGNvZGU+fi8uY3ZzcGFzczwvY29kZT4uPC90ZD4KKyAgICA8dGQ+cGFzc2ZpbGU8L3RkPgorICAgIDx0ZD5QYXNzd29yZCBmaWxlIHRvIHJlYWQgcGFzc3dvcmRzIGZyb20uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+fi8uY3ZzcGFzczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gICAgICByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC4gRGVmYXVsdHMgdG8gZmFsc2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPHE+MDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC0xMzksOTMgKzEzMiw5OCBAQAogCiA8aDQ+bW9kdWxlPC9oND4KIAotPHA+U3BlY2lmaWVzIGEgcGFja2FnZS9tb2R1bGUgdG8gd29yayBvbiwgdW5saWtlIHRoZSBwYWNrYWdlIGF0dHJpYnV0ZQotICBtb2R1bGVzIHNwZWNpZmllZCB1c2luZyB0aGlzIGF0dHJpYnV0ZSBjYW4gY29udGFpbiBzcGFjZXMgaW4gdGhlaXIKLSAgbmFtZS48L3A+Cis8cD5TcGVjaWZpZXMgYSBwYWNrYWdlL21vZHVsZSB0byB3b3JrIG9uLCB1bmxpa2UgdGhlIHBhY2thZ2UgYXR0cmlidXRlIG1vZHVsZXMgc3BlY2lmaWVkIHVzaW5nIHRoaXMKK2F0dHJpYnV0ZSBjYW4gY29udGFpbiBzcGFjZXMgaW4gdGhlaXIgbmFtZS48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbW9kdWxlJ3MvcGFja2FnZSdzIG5hbWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcy48L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgbW9kdWxlL3BhY2thZ2UuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgJmx0O2N2c3RhZ2RpZmYgY3ZzUm9vdD0mcXVvdDs6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyZxdW90OwotICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O3RhZ2RpZmYueG1sJnF1b3Q7Ci0gICAgICAgICAgICAgICAgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsKLSAgICAgICAgICAgICAgICBzdGFydFRhZz0mcXVvdDtBTlRfMTQmcXVvdDsKLSAgICAgICAgICAgICAgICBlbmRUYWc9JnF1b3Q7QU5UXzE0MSZxdW90OwotICAvJmd0OzwvcHJlPgorPHA+R2VuZXJhdGUgYSA8Y29kZT50YWdkaWZmPC9jb2RlPiByZXBvcnQgZm9yIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluCisgIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IG1vZHVsZSBiZXR3ZWVuIHRoZSB0YWdzIDxzYW1wPkFOVF8xNDwvc2FtcD4KKyAgYW5kIDxzYW1wPkFOVF8xNDE8L3NhbXA+LiBXcml0ZSB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPHNhbXA+dGFnZGlmZi54bWw8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7Y3ZzdGFnZGlmZiBjdnNSb290PSZxdW90Ozpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljJnF1b3Q7CisgICAgICAgICAgICBkZXN0ZmlsZT0mcXVvdDt0YWdkaWZmLnhtbCZxdW90OworICAgICAgICAgICAgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsKKyAgICAgICAgICAgIHN0YXJ0VGFnPSZxdW90O0FOVF8xNCZxdW90OworICAgICAgICAgICAgZW5kVGFnPSZxdW90O0FOVF8xNDEmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5HZW5lcmF0ZXMgYSB0YWdkaWZmIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUKLWluIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IG1vZHVsZSBiZXR3ZWVuIHRoZSB0YWdzIDxjb2RlPkFOVF8xNDwvY29kZT4gYW5kIDxjb2RlPkFOVF8xNDE8L2NvZGU+LgotSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT50YWdkaWZmLnhtbDwvY29kZT4uPC9wPgorPHA+R2VuZXJhdGUgYSA8Y29kZT50YWdkaWZmPC9jb2RlPiByZXBvcnQgZm9yIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluCisgIHRoZSA8c2FtcD5hbnQ8L3NhbXA+IG1vZHVsZSBpbiBKYW51YXJ5IDIwMDIuIFdyaXRlIHRoZSBjaGFuZ2VzIGludG8gdGhlCisgIGZpbGUgPHNhbXA+dGFnZGlmZi54bWw8L3NhbXA+LiBJbiB0aGlzIGV4YW1wbGUsIDx2YXI+Y3ZzUm9vdDwvdmFyPiBoYXMgbm90IGJlZW4KKyAgc2V0LiBUaGUgY3VycmVudCA8dmFyPmN2c1Jvb3Q8L3Zhcj4gd2lsbCBiZSB1c2VkIChhc3N1bWluZyB0aGUgYnVpbGQgaXMgc3RhcnRlZCBmcm9tIGEgZm9sZGVyIHN0b3JlZAorICBpbiBDVlMuPC9wPgorPHByZT4KKyZsdDtjdnN0YWdkaWZmIGRlc3RmaWxlPSZxdW90O3RhZ2RpZmYueG1sJnF1b3Q7CisgICAgICAgICAgICBwYWNrYWdlPSZxdW90O2FudCZxdW90OworICAgICAgICAgICAgc3RhcnREYXRlPSZxdW90OzIwMDItMDEtMDEmcXVvdDsKKyAgICAgICAgICAgIGVuZERhdGU9JnF1b3Q7MjAwMi0zMS0wMSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7Y3ZzdGFnZGlmZgotICAgICAgICAgICAgICAgIGRlc3RmaWxlPSZxdW90O3RhZ2RpZmYueG1sJnF1b3Q7Ci0gICAgICAgICAgICAgICAgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsKLSAgICAgICAgICAgICAgICBzdGFydERhdGU9JnF1b3Q7MjAwMi0wMS0wMSZxdW90OwotICAgICAgICAgICAgICAgIGVuZERhdGU9JnF1b3Q7MjAwMi0zMS0wMSZxdW90OwotICAvJmd0OzwvcHJlPgotCi08cD5HZW5lcmF0ZXMgYSB0YWdkaWZmIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUKLWluIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IG1vZHVsZSBpbiBqYW51YXJ5IDIwMDIuIEluIHRoaXMgZXhhbXBsZSA8Y29kZT5jdnNSb290PC9jb2RlPgotaGFzIG5vdCBiZWVuIHNldC4gVGhlIGN1cnJlbnQgPGNvZGU+Y3ZzUm9vdDwvY29kZT4gd2lsbCBiZSB1c2VkIChhc3N1bWluZyB0aGUgYnVpbGQgaXMgc3RhcnRlZAotZnJvbSBhIGZvbGRlciBzdG9yZWQgaW4gPGNvZGU+Y3ZzPC9jb2RlPi4KLUl0IHdyaXRlcyB0aGVzZSBjaGFuZ2VzIGludG8gdGhlIGZpbGUgPGNvZGU+dGFnZGlmZi54bWw8L2NvZGU+LjwvcD4KLQotPHByZT4gICZsdDtjdnN0YWdkaWZmCi0gICAgICAgICAgICAgICAgZGVzdGZpbGU9JnF1b3Q7dGFnZGlmZi54bWwmcXVvdDsKLSAgICAgICAgICAgICAgICBwYWNrYWdlPSZxdW90O2FudCBqYWthcnRhLWd1bXAmcXVvdDsKLSAgICAgICAgICAgICAgICBzdGFydERhdGU9JnF1b3Q7MjAwMy0wMS0wMSZxdW90OwotICAgICAgICAgICAgICAgIGVuZERhdGU9JnF1b3Q7MjAwMy0zMS0wMSZxdW90OwotICAvJmd0OzwvcHJlPgotCi08cD5HZW5lcmF0ZXMgYSB0YWdkaWZmIHJlcG9ydCBmb3IgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUKLWluIHRoZSA8Y29kZT5hbnQ8L2NvZGU+IGFuZCA8Y29kZT5qYWthcnRhLWd1bXA8L2NvZGU+IG1vZHVsZXMgaW4gamFudWFyeSAyMDAzLgotSW4gdGhpcyBleGFtcGxlIDxjb2RlPmN2c1Jvb3Q8L2NvZGU+Ci1oYXMgbm90IGJlZW4gc2V0LiBUaGUgY3VycmVudCA8Y29kZT5jdnNSb290PC9jb2RlPiB3aWxsIGJlIHVzZWQgKGFzc3VtaW5nIHRoZSBidWlsZCBpcyBzdGFydGVkCi1mcm9tIGEgZm9sZGVyIHN0b3JlZCBpbiA8Y29kZT5jdnM8L2NvZGU+LgotSXQgd3JpdGVzIHRoZXNlIGNoYW5nZXMgaW50byB0aGUgZmlsZSA8Y29kZT50YWdkaWZmLnhtbDwvY29kZT4uPC9wPgorPHA+R2VuZXJhdGUgYSA8Y29kZT50YWdkaWZmPC9jb2RlPiByZXBvcnQgZm9yIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluCisgIHRoZSA8c2FtcD5hbnQ8L3NhbXA+IGFuZCA8c2FtcD5qYWthcnRhLWd1bXA8L3NhbXA+IG1vZHVsZXMgaW4gSmFudWFyeSAyMDAzLiBXcml0ZSB0aGUgY2hhbmdlcyBpbnRvCisgIHRoZSBmaWxlIDxzYW1wPnRhZ2RpZmYueG1sPC9zYW1wPi4gSW4gdGhpcworICBleGFtcGxlLCA8dmFyPmN2c1Jvb3Q8L3Zhcj4gaGFzIG5vdCBiZWVuIHNldC4gVGhlIGN1cnJlbnQgPHZhcj5jdnNSb290PC92YXI+IHdpbGwgYmUgdXNlZCAoYXNzdW1pbmcKKyAgdGhlIGJ1aWxkIGlzIHN0YXJ0ZWQgZnJvbSBhIGZvbGRlciBzdG9yZWQgaW4gQ1ZTLjwvcD4KKzxwcmU+CismbHQ7Y3ZzdGFnZGlmZiBkZXN0ZmlsZT0mcXVvdDt0YWdkaWZmLnhtbCZxdW90OworICAgICAgICAgICAgcGFja2FnZT0mcXVvdDthbnQgamFrYXJ0YS1ndW1wJnF1b3Q7CisgICAgICAgICAgICBzdGFydERhdGU9JnF1b3Q7MjAwMy0wMS0wMSZxdW90OworICAgICAgICAgICAgZW5kRGF0ZT0mcXVvdDsyMDAzLTMxLTAxJnF1b3Q7LyZndDs8L3ByZT4KIAogPGg0PkdlbmVyYXRlIFJlcG9ydDwvaDQ+Ci08cD5BbnQgaW5jbHVkZXMgYSBiYXNpYyBYU0xUIHN0eWxlc2hlZXQgdGhhdCB5b3UgY2FuIHVzZSB0byBnZW5lcmF0ZSAKLWEgSFRNTCByZXBvcnQgYmFzZWQgb24gdGhlIHhtbCBvdXRwdXQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcwotaG93IHRvIGdlbmVyYXRlIGEgSFRNTCByZXBvcnQgZnJvbSB0aGUgWE1MIHJlcG9ydC48L3A+Cis8cD5BbnQgaW5jbHVkZXMgYSBiYXNpYyBYU0xUIHN0eWxlc2hlZXQgdGhhdCB5b3UgY2FuIHVzZSB0byBnZW5lcmF0ZSBhIEhUTUwgcmVwb3J0IGJhc2VkIG9uIHRoZSBYTUwKK291dHB1dC4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byBnZW5lcmF0ZSBhbiBIVE1MIHJlcG9ydCBmcm9tIHRoZSBYTUwgcmVwb3J0LjwvcD4KIAogPHByZT4KLSAgICAgICAgJmx0O3N0eWxlIGluPSJ0YWdkaWZmLnhtbCIgCi0gICAgICAgICAgICAgICBvdXQ9InRhZ2RpZmYuaHRtbCIgCi0gICAgICAgICAgICAgICBzdHlsZT0iJHthbnQuaG9tZX0vZXRjL3RhZ2RpZmYueHNsIiZndDsKLSAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0idGl0bGUiIGV4cHJlc3Npb249IkFudCBEaWZmIi8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iYW50Ii8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImN2c3dlYiIgZXhwcmVzc2lvbj0iaHR0cDovL2N2cy5hcGFjaGUub3JnL3ZpZXdjdnMvIi8mZ3Q7Ci0gICAgICAgICZsdDsvc3R5bGUmZ3Q7Ci08L3ByZT4KKyZsdDtzdHlsZSBpbj0idGFnZGlmZi54bWwiCisgICAgICAgb3V0PSJ0YWdkaWZmLmh0bWwiCisgICAgICAgc3R5bGU9IiR7YW50LmhvbWV9L2V0Yy90YWdkaWZmLnhzbCImZ3Q7CisgICZsdDtwYXJhbSBuYW1lPSJ0aXRsZSIgZXhwcmVzc2lvbj0iQW50IERpZmYiLyZndDsKKyAgJmx0O3BhcmFtIG5hbWU9Im1vZHVsZSIgZXhwcmVzc2lvbj0iYW50Ii8mZ3Q7CisgICZsdDtwYXJhbSBuYW1lPSJjdnN3ZWIiIGV4cHJlc3Npb249Imh0dHBzOi8vY3ZzLmFwYWNoZS5vcmcvdmlld2N2cy8iLyZndDsKKyZsdDsvc3R5bGUmZ3Q7PC9wcmU+CiAKIDxoND5PdXRwdXQ8L2g0PgotPHA+Ci1UaGUgY3Zzcm9vdCBhbmQgcGFja2FnZSBhdHRyaWJ1dGVzIG9mIHRoZSB0YWdkaWZmIGVsZW1lbnQgYXJlIG5ldyBpbiBhbnQgMS42Ljxicj4KLU5vdGVzIG9uIGVudHJ5IGF0dHJpYnV0ZXMgOgotPHRhYmxlIGJvcmRlcj0iMSI+Ci08dHI+PHRoPkF0dHJpYnV0ZTwvdGg+PHRoPkNvbW1lbnQ8L3RoPjwvdHI+Ci08dHI+PHRkPm5hbWU8L3RkPjx0ZD53aGVuIHJlcG9ydGluZyBvbiBvbmUgcGFja2FnZSwgdGhlIHBhY2thZ2UgbmFtZSBpcyByZW1vdmVkIGZyb20gdGhlIG91dHB1dDwvdGQ+PC90cj4KLTx0cj48dGQ+cmV2aXNpb248L3RkPjx0ZD5zdXBwbGllZCBmb3IgZmlsZXMgd2hpY2ggZXhpc3QgYXQgdGhlIGVuZCBvZiB0aGUgcmVwb3J0aW5nIHBlcmlvZDwvdGQ+PC90cj4KLTx0cj48dGQ+cHJldnJldmlzaW9uPC90ZD48dGQ+c3VwcGxpZWQgZm9yIGZpbGVzIHdoaWNoIGV4aXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcG9ydGluZyBwZXJpb2QuPGJyPgotT2xkIENWUyBzZXJ2ZXJzIGRvIG5vdCBzdXBwbHkgaXQgZm9yIGRlbGV0ZWQgZmlsZXMuIENWUyAxLjEyLjIgc3VwcGxpZXMgaXQuPC90ZD48L3RyPgorPHA+VGhlIDx2YXI+Y3Zzcm9vdDwvdmFyPiBhbmQgPHZhcj5wYWNrYWdlPC92YXI+IGF0dHJpYnV0ZXMgb2YgdGhlIDxjb2RlPiZsdDt0YWdkaWZmJmd0OzwvY29kZT4gZWxlbWVudCBhcmUKKyAgYWRkZWQgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisKKzxwPkRlc2NyaXB0aW9uIG9mIDxjb2RlPiZsdDtlbnRyeSZndDs8L2NvZGU+IGF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkNvbW1lbnQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjx2YXI+bmFtZTwvdmFyPjwvdGQ+CisgICAgPHRkPndoZW4gcmVwb3J0aW5nIG9uIG9uZSBwYWNrYWdlLCB0aGUgcGFja2FnZSBuYW1lIGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48dmFyPnJldmlzaW9uPC92YXI+PC90ZD4KKyAgICA8dGQ+c3VwcGxpZWQgZm9yIGZpbGVzIHdoaWNoIGV4aXN0IGF0IHRoZSBlbmQgb2YgdGhlIHJlcG9ydGluZyBwZXJpb2Q8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjx2YXI+cHJldnJldmlzaW9uPC92YXI+PC90ZD4KKyAgICA8dGQ+c3VwcGxpZWQgZm9yIGZpbGVzIHdoaWNoIGV4aXN0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcG9ydGluZyBwZXJpb2QuPGJyLz5PbGQgQ1ZTIHNlcnZlcnMKKyAgICAgIGRvIG5vdCBzdXBwbHkgaXQgZm9yIGRlbGV0ZWQgZmlsZXMuIENWUyAxLjEyLjIgc3VwcGxpZXMgaXQuPC90ZD4KKyAgPC90cj4KIDwvdGFibGU+Ci08L3A+CisKKzxwPkV4YW1wbGU6PC9wPgogPHByZT4KICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsKLSZsdDt0YWdkaWZmIHN0YXJ0VGFnPSZxdW90O0FOVF8xNCZxdW90OyBlbmRUYWc9JnF1b3Q7QU5UXzE0MSZxdW90OyAKLWN2c3Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsmZ3Q7CismbHQ7dGFnZGlmZiBzdGFydFRhZz0mcXVvdDtBTlRfMTQmcXVvdDsgZW5kVGFnPSZxdW90O0FOVF8xNDEmcXVvdDsKKyAgICAgICAgIGN2c3Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsgcGFja2FnZT0mcXVvdDthbnQmcXVvdDsmZ3Q7CiAgICZsdDtlbnRyeSZndDsKICAgICAmbHQ7ZmlsZSZndDsKICAgICAgICZsdDtuYW1lJmd0O3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YSZsdDsvbmFtZSZndDsKQEAgLTIzNiw4ICsyMzQsNSBAQAogJmx0Oy90YWdkaWZmJmd0OwogPC9wcmU+CiAKLQotCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9jdnN2ZXJzaW9uLmh0bWwgYi9tYW51YWwvVGFza3MvY3ZzdmVyc2lvbi5odG1sCmluZGV4IDA5ZTdjZWUuLmM3NTA2NGMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9jdnN2ZXJzaW9uLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2N2c3ZlcnNpb24uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDk1ICsxNSw4OCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogICA8dGl0bGU+Q1ZTVmVyc2lvbiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJjdnMiPkN2c1ZlcnNpb248L2E+PC9oMj4KKzxoMiBpZD0iY3ZzIj5DdnNWZXJzaW9uPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNi4xPC9lbT4uPC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPgotVGhpcyB0YXNrIGFsbG93cyB0byByZXRyaWV2ZSBhIENWUyBjbGllbnQgYW5kIHNlcnZlciB2ZXJzaW9uLgotICA8aT5TaW5jZSBBcGFjaGUgQW50IDEuNi4xLjwvaT4KLTwvcD4KKzxwPlRoaXMgdGFzayBhbGxvd3MgdG8gcmV0cmlldmUgYSBDVlMgY2xpZW50IGFuZCBzZXJ2ZXIgdmVyc2lvbi48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0iMyI+QXR0cmlidXRlcyBmcm9tIHBhcmVudCBDdnMgdGFzayB3aGljaCBhcmUgbWVhbmluZ2Z1bCBoZXJlPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMyIgY2xhc3M9ImxlZnQiPkF0dHJpYnV0ZXMgZnJvbSBwYXJlbnQgPGNvZGU+Jmx0O2N2cyZndDs8L2NvZGU+IHRhc2sgd2hpY2ggYXJlCisgICAgbWVhbmluZ2Z1bCBoZXJlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3ZzUm9vdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+Q1ZTUk9PVDwvY29kZT4gdmFyaWFibGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y3ZzUm9vdDwvdGQ+CisgICAgPHRkPnRoZSA8Y29kZT5DVlNST09UPC9jb2RlPiB2YXJpYWJsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmN2c1JzaDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+Q1ZTX1JTSDwvY29kZT4gdmFyaWFibGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y3ZzUnNoPC90ZD4KKyAgICA8dGQ+dGhlIDxjb2RlPkNWU19SU0g8L2NvZGU+IHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2hlY2tlZCBvdXQgdmVyc2lvbiBvZiB0aGUgcHJvamVjdDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBwcm9qZWN0J3MgYmFzZWRpci48L3RkPgorICAgIDx0ZD5kZXN0PC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNoZWNrZWQgb3V0IHZlcnNpb24gb2YgdGhlIHByb2plY3Q8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnBhY2thZ2U8L3RkPgorICAgIDx0ZD50aGUgcGFja2FnZS9tb2R1bGUgdG8gY2hlY2sgb3V0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgcG9ydCAyNDAxLjwvdGQ+CisgICAgPHRkPnBvcnQ8L3RkPgorICAgIDx0ZD5Qb3J0IHVzZWQgYnkgQ1ZTIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4yNDAxPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3NmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3N3b3JkIGZpbGUgdG8gcmVhZCBwYXNzd29yZHMgZnJvbS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgZmlsZSB+Ly5jdnNwYXNzLjwvdGQ+CisgICAgPHRkPnBhc3NmaWxlPC90ZD4KKyAgICA8dGQ+UGFzc3dvcmQgZmlsZSB0byByZWFkIHBhc3N3b3JkcyBmcm9tLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPn4vLmN2c3Bhc3M8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoIGEKLSAgICAgIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPGNvZGU+MDwvY29kZT4uIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSBvdGhlciB0aGFuIDxxPjA8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIGNvbHNwYW49IjMiPlNwZWNpZmljIGF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0ibGVmdCI+U3BlY2lmaWMgYXR0cmlidXRlczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsaWVudHZlcnNpb25wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIGEgcHJvcGVydHkgd2hlcmUgdGhlIGN2c2NsaWVudCB2ZXJzaW9uCi0gICAgICBzaG91bGQgYmUgc3RvcmVkPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xpZW50dmVyc2lvbnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIHByb3BlcnR5IHdoZXJlIHRoZSBDVlMgY2xpZW50IHZlcnNpb24gc2hvdWxkIGJlIHN0b3JlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVydmVyc2lvbnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBwcm9wZXJ0eSB3aGVyZSB0aGUgY3ZzIHNlcnZlciB2ZXJzaW9uCi0gICAgICBzaG91bGQgYmUgc3RvcmVkPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2VydmVydmVyc2lvbnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIHByb3BlcnR5IHdoZXJlIHRoZSBDVlMgc2VydmVyIHZlcnNpb24gc2hvdWxkIGJlIHN0b3JlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtjdnN2ZXJzaW9uIGN2c1Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsKLSAgICAgICBwYXNzZmlsZT0mcXVvdDsvaG9tZS9teXNlbGYvLmN2c3Bhc3MmcXVvdDsKLSAgICAgICBzZXJ2ZXJ2ZXJzaW9ucHJvcGVydHk9JnF1b3Q7YXBhY2hlY3ZzdmVyc2lvbiZxdW90OwotICAgICAgIGNsaWVudHZlcnNpb25wcm9wZXJ0eT0mcXVvdDtsb2NhbGN2c3ZlcnNpb24mcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmZpbmRzIG91dCB0aGUgY3ZzIGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIGFuZCBzdG9yZXMgdGhlIHZlcnNpb25zIGluIHRoZQotcHJvcGVydGllcyBjYWxsZWQgYXBhY2hlY3ZzdmVyc2lvbiBhbmQgbG9jYWxjdnN2ZXJzaW9uPC9wPgogCi0KKzxwPkZpbmQgb3V0IHRoZSBDVlMgY2xpZW50IGFuZCBzZXJ2ZXIgdmVyc2lvbnMgYW5kIHN0b3JlIHRoZSB2ZXJzaW9ucyBpbiB0aGUgcHJvcGVydGllcworY2FsbGVkIDxjb2RlPmFwYWNoZWN2c3ZlcnNpb248L2NvZGU+IGFuZCA8Y29kZT5sb2NhbGN2c3ZlcnNpb248L2NvZGU+PC9wPgorPHByZT4KKyZsdDtjdnN2ZXJzaW9uIGN2c1Jvb3Q9JnF1b3Q7OnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMmcXVvdDsKKyAgICAgICAgICAgIHBhc3NmaWxlPSZxdW90Oy9ob21lL215c2VsZi8uY3ZzcGFzcyZxdW90OworICAgICAgICAgICAgc2VydmVydmVyc2lvbnByb3BlcnR5PSZxdW90O2FwYWNoZWN2c3ZlcnNpb24mcXVvdDsKKyAgICAgICAgICAgIGNsaWVudHZlcnNpb25wcm9wZXJ0eT0mcXVvdDtsb2NhbGN2c3ZlcnNpb24mcXVvdDsvJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbCBiL21hbnVhbC9UYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbAppbmRleCA1NTExYjkwLi40ZWZjYmI3IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZGVmYXVsdGV4Y2x1ZGVzLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTIgKzE1LDQ5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5EZWZhdWx0RXhjbHVkZXMgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZWNobyI+RGVmYXVsdEV4Y2x1ZGVzPC9hPjwvaDI+Cis8aDIgaWQ9ImRlZmF1bHRleGNsdWRlcyI+RGVmYXVsdEV4Y2x1ZGVzPC9oMj4KIAotPHA+PGVtPnNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPjwvcD4KIAogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkFsdGVycyB0aGUgZGVmYXVsdCBleGNsdWRlcyBmb3IgYWxsIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyBpbiB0aGUKLWJ1aWxkLCBhbmQgcHJpbnRzIG91dCB0aGUgY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIGlmIGRlc2lyZWQuCis8cD5BbHRlcnMgdGhlIGRlZmF1bHQgZXhjbHVkZXMgZm9yIGFsbCBzdWJzZXF1ZW50IHByb2Nlc3NpbmcgaW4gdGhlIGJ1aWxkLCBhbmQgcHJpbnRzIG91dCB0aGUKK2N1cnJlbnQgZGVmYXVsdCBleGNsdWRlcyBpZiBkZXNpcmVkLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lY2hvPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgb3Igbm90IHRvIHByaW50IG91dCB0aGUgZGVmYXVsdCBleGNsdWRlcy4oZGVmYXVsdHMgdG8gZmFsc2UpPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPmF0dHJpYnV0ZSAidHJ1ZSIgcmVxdWlyZWQgaWYgbm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGF0dHJpYnV0ZSBzcGVjaWZpZWQ8L3RkPgorICAgIDx0ZD5lY2hvPC90ZD4KKyAgICA8dGQ+d2hldGhlciBvciBub3QgdG8gcHJpbnQgb3V0IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT4gcmVxdWlyZWQgaWYgbm8gb3RoZXIgYXR0cmlidXRlIHNwZWNpZmllZDsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5nbyBiYWNrIHRvIGhhcmQgd2lyZWQgZGVmYXVsdCBleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5hdHRyaWJ1dGUgInRydWUiIHJlcXVpcmVkIGlmIG5vCi0gICAgaWYgbm8gb3RoZXIgYXR0cmlidXRlIGlzIHNwZWNpZmllZDwvdGQ+CisgICAgPHRkPmRlZmF1bHQ8L3RkPgorICAgIDx0ZD5nbyBiYWNrIHRvIGhhcmQgd2lyZWQgZGVmYXVsdCBleGNsdWRlczwvdGQ+CisgICAgPHRkPjxxPnRydWU8L3E+IHJlcXVpcmVkIGlmIG5vIG90aGVyIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hZGQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhdHRlcm4gdG8gYWRkIHRvIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPmlmIG5vIG90aGVyIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQ8L3RkPgorICAgIDx0ZD5hZGQ8L3RkPgorICAgIDx0ZD50aGUgcGF0dGVybiB0byBhZGQgdG8gdGhlIGRlZmF1bHQgZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pZiBubyBvdGhlciBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3ZlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW92ZSB0aGUgc3BlY2lmaWVkIHBhdHRlcm4gZnJvbSB0aGUgZGVmYXVsdCBleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5pZiBubyBvdGhlciBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkPC90ZD4KKyAgICA8dGQ+cmVtb3ZlPC90ZD4KKyAgICA8dGQ+cmVtb3ZlIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBmcm9tIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aWYgbm8gb3RoZXIgYXR0cmlidXRlIGlzIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC02Nyw0MSArNjUsMzcgQEAKIAogPHA+UHJpbnQgb3V0IHRoZSBkZWZhdWx0IGV4Y2x1ZGVzPC9wPgogCi08cHJlPiAgJmx0O2RlZmF1bHRleGNsdWRlcyBlY2hvPSZxdW90O3RydWUmcXVvdDsvJmd0OzwvcHJlPgorPHByZT4mbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGVjaG89JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPlByaW50IG91dCB0aGUgZGVmYXVsdCBleGNsdWRlcyBhbmQgZXhjbHVkZSBhbGwgKi5iYWsgZmlsZXMgaW4KLTxzdHJvbmc+YWxsPC9zdHJvbmc+IGZ1cnRoZXIgcHJvY2Vzc2luZzwvcD4KKzxwPlByaW50IG91dCB0aGUgZGVmYXVsdCBleGNsdWRlcyBhbmQgZXhjbHVkZSBhbGwgPHNhbXA+Ki5iYWs8L3NhbXA+IGZpbGVzIGluIDxzdHJvbmc+YWxsPC9zdHJvbmc+CitmdXJ0aGVyIHByb2Nlc3Npbmc8L3A+CiAKLTxwcmU+ICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGVjaG89JnF1b3Q7dHJ1ZSZxdW90OyBhZGQ9JnF1b3Q7KiovKi5iYWsmcXVvdDsvJmd0OzwvcHJlPgorPHByZT4mbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGVjaG89JnF1b3Q7dHJ1ZSZxdW90OyBhZGQ9JnF1b3Q7KiovKi5iYWsmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5TaWxlbnRseSBhbGxvdyBzZXZlcmFsIGZpbGVzZXQgYmFzZWQgdGFza3MgdG8gb3BlcmF0ZSBvbiBlbWFjcwotYmFja3VwIGZpbGVzIGFuZCB0aGVuIHJlc3RvcmUgbm9ybWFsIGJlaGF2aW9yPC9wPgorPHA+U2lsZW50bHkgYWxsb3cgc2V2ZXJhbCBmaWxlc2V0IGJhc2VkIHRhc2tzIHRvIG9wZXJhdGUgb24gZW1hY3MgYmFja3VwIGZpbGVzIGFuZCB0aGVuIHJlc3RvcmUKK25vcm1hbCBiZWhhdmlvcjwvcD4KIAogPHByZT4KLSAgJmx0O2RlZmF1bHRleGNsdWRlcyByZW1vdmU9JnF1b3Q7KiovKn4mcXVvdDsvJmd0OworJmx0O2RlZmF1bHRleGNsdWRlcyByZW1vdmU9JnF1b3Q7KiovKn4mcXVvdDsvJmd0OwogCi0gIChkbyBzZXZlcmFsIGZpbGVzZXQgYmFzZWQgdGFza3MgaGVyZSkKKyhkbyBzZXZlcmFsIGZpbGVzZXQgYmFzZWQgdGFza3MgaGVyZSkKIAotICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGRlZmF1bHQ9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci08L3ByZT4KKyZsdDtkZWZhdWx0ZXhjbHVkZXMgZGVmYXVsdD0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KIAogPGgzPk5vdGVzPC9oMz4KLUJ5IGRlZmF1bHQgdGhlIHBhdHRlcm4gPHR0PioqLy5zdm48L3R0PiBhbmQgPHR0PioqLy5zdm4vKio8L3R0PiBhcmUgc2V0IGFzIGRlZmF1bHQgCi1leGNsdWRlcy4gV2l0aCB2ZXJzaW9uIDEuMyBTdWJ2ZXJzaW9uIHN1cHBvcnRzIHRoZSAKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vc3VidmVyc2lvbi5hcGFjaGUub3JnL2RvY3MvcmVsZWFzZS1ub3Rlcy8xLjMuaHRtbCNfc3ZuLWhhY2siPiZxdW90O19zdm4gaGFjayZxdW90OzwvYT4uCi1UaGF0IG1lYW5zLCB0aGF0IHRoZSBzdm4tbGlicmFyaWVzIGV2YWx1YXRlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdXNlIDxpPi5zdm48L2k+IAotb3IgPGk+X3N2bjwvaT4gZGlyZWN0b3J5IHJlZ2FyZGluZyB0byB0aGF0IHZhbHVlLiBXZSBoYWQgY2hvc2VuIG5vdCB0byBldmFsdWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8KLWdldCBhIG1vcmUgcmVsaWFibGUgYnVpbGQuIEluc3RlYWQgeW91IGhhdmUgdG8gY2hhbmdlIHRoZSBzZXR0aW5ncyBieSB5b3Vyc2VsZiBieSBjaGFuZ2luZwotdGhlIGV4Y2x1ZGUgcGF0dGVybnM6Cis8cD5CeSBkZWZhdWx0IHRoZSBwYXR0ZXJuIDxzYW1wPioqLy5zdm48L3NhbXA+IGFuZCA8c2FtcD4qKi8uc3ZuLyoqPC9zYW1wPiBhcmUgc2V0IGFzIGRlZmF1bHQKK2V4Y2x1ZGVzLiBTaW5jZSB2ZXJzaW9uIDEuMywgU3VidmVyc2lvbiBzdXBwb3J0cwordGhlIDxhIGhyZWY9Imh0dHBzOi8vc3VidmVyc2lvbi5hcGFjaGUub3JnL2RvY3MvcmVsZWFzZS1ub3Rlcy8xLjMuaHRtbCNfc3ZuLWhhY2siCit0YXJnZXQ9Il90b3AiPiZxdW90O19zdm4gaGFjayZxdW90OzwvYT4uICBUaGF0IG1lYW5zLCB0aGF0IHRoZSBzdm4tbGlicmFyaWVzIGV2YWx1YXRlIGVudmlyb25tZW50Cit2YXJpYWJsZXMgYW5kIHVzZSA8c2FtcD4uc3ZuPC9zYW1wPiBvciA8c2FtcD5fc3ZuPC9zYW1wPiBkaXJlY3RvcnkgcmVnYXJkaW5nIHRvIHRoYXQgdmFsdWUuIFdlIGhhZAorY2hvc2VuIG5vdCB0byBldmFsdWF0ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gZ2V0IGEgbW9yZSByZWxpYWJsZSBidWlsZC4gSW5zdGVhZCB5b3UgaGF2ZSB0bworY2hhbmdlIHRoZSBzZXR0aW5ncyBieSB5b3Vyc2VsZiBieSBjaGFuZ2luZyB0aGUgZXhjbHVkZSBwYXR0ZXJuczo8L3A+CiA8cHJlPgotICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIHJlbW92ZT0mcXVvdDsqKi8uc3ZuJnF1b3Q7LyZndDsKLSAgJmx0O2RlZmF1bHRleGNsdWRlcyByZW1vdmU9JnF1b3Q7KiovLnN2bi8qKiZxdW90Oy8mZ3Q7Ci0gICZsdDtkZWZhdWx0ZXhjbHVkZXMgYWRkPSZxdW90OyoqL19zdm4mcXVvdDsvJmd0OwotICAmbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGFkZD0mcXVvdDsqKi9fc3ZuLyoqJnF1b3Q7LyZndDsKKyZsdDtkZWZhdWx0ZXhjbHVkZXMgcmVtb3ZlPSZxdW90OyoqLy5zdm4mcXVvdDsvJmd0OworJmx0O2RlZmF1bHRleGNsdWRlcyByZW1vdmU9JnF1b3Q7KiovLnN2bi8qKiZxdW90Oy8mZ3Q7CismbHQ7ZGVmYXVsdGV4Y2x1ZGVzIGFkZD0mcXVvdDsqKi9fc3ZuJnF1b3Q7LyZndDsKKyZsdDtkZWZhdWx0ZXhjbHVkZXMgYWRkPSZxdW90OyoqL19zdm4vKiomcXVvdDsvJmd0OwogPC9wcmU+CiAKLQotCi0KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9kZWxldGUuaHRtbCBiL21hbnVhbC9UYXNrcy9kZWxldGUuaHRtbAppbmRleCA2MzViMTBmLi5hMDE5ZGU5IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZGVsZXRlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2RlbGV0ZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjE1ICsxNSwxODQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkRlbGV0ZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJkZWxldGUiPkRlbGV0ZTwvYT48L2gyPgorPGgyIGlkPSJkZWxldGUiPkRlbGV0ZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RGVsZXRlcyBhIHNpbmdsZSBmaWxlLCBhIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgZmlsZXMgYW5kCi1zdWJkaXJlY3Rvcmllcywgb3IgYSBzZXQgb2YgZmlsZXMgc3BlY2lmaWVkIGJ5IG9uZSBvciBtb3JlCi08YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uPC9hPnMuCi1UaGUgbGl0ZXJhbCBpbXBsaWNhdGlvbiBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGlzIHRoYXQKLWRpcmVjdG9yaWVzIGFyZSBub3QgaW5jbHVkZWQ7IGhvd2V2ZXIgdGhlIHJlbW92YWwgb2YgZW1wdHkgZGlyZWN0b3JpZXMgY2FuCi1iZSB0cmlnZ2VyZWQgd2hlbiB1c2luZyBuZXN0ZWQgZmlsZXNldHMgYnkgc2V0dGluZyB0aGUKLTxjb2RlPmluY2x1ZGVFbXB0eURpcnM8L2NvZGU+IGF0dHJpYnV0ZSB0byA8aT50cnVlPC9pPi4gTm90ZSB0aGF0IHRoaXMKLWF0dHJpYnV0ZSBpcyBtZWFuaW5nbGVzcyBpbiB0aGUgY29udGV4dCBvZiBhbnkgb2YgdGhlIHZhcmlvdXMgcmVzb3VyY2UKLWNvbGxlY3Rpb24gdHlwZXMgdGhhdCA8aT5kbzwvaT4gaW5jbHVkZSBkaXJlY3RvcmllcywgYnV0IHRoYXQgbm8gYXR0ZW1wdAotd2lsbCBiZSBtYWRlIHRvIGRlbGV0ZSBub24tZW1wdHkgZGlyZWN0b3JpZXMgaW4gYW55IGNhc2UuICBXaGV0aGVyIGEKLWRpcmVjdG9yeSBpcyBlbXB0eSBvciBub3QgaXMgZGVjaWRlZCBieSBsb29raW5nIGludG8gdGhlIGZpbGVzeXN0ZW0gLQotaW5jbHVkZSBvciBleGNsdWRlIHBhdHRlcm5zIGRvbid0IGFwcGx5IGhlcmUuPC9wPgotPHA+Ci1JZiB5b3UgdXNlIHRoaXMgdGFzayB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgYnkgZWRpdG9ycwotYW5kIGl0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCByZWFkIHVwIG9uIHRoZQotPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkZWZhdWx0ZXhjbHVkZXMiPmRlZmF1bHQgZXhjbHVzaW9uIHNldDwvYT4KLWluIDxzdHJvbmc+RGlyZWN0b3J5LWJhc2VkIFRhc2tzPC9zdHJvbmc+LCBhbmQgc2VlIHRoZQotPGNvZGU+ZGVmYXVsdGV4Y2x1ZGVzPC9jb2RlPiBhdHRyaWJ1dGUgYmVsb3cuCis8cD5EZWxldGVzIGEgc2luZ2xlIGZpbGUsIGEgc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMsIG9yIGEgc2V0IG9mCitmaWxlcyBzcGVjaWZpZWQgYnkgb25lIG9yIG1vcmUgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UKK2NvbGxlY3Rpb248L2E+cy4gIFRoZSBsaXRlcmFsIGltcGxpY2F0aW9uIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaXMgdGhhdCBkaXJlY3RvcmllcyBhcmUKK25vdCBpbmNsdWRlZDsgaG93ZXZlciB0aGUgcmVtb3ZhbCBvZiBlbXB0eSBkaXJlY3RvcmllcyBjYW4gYmUgdHJpZ2dlcmVkIHdoZW4gdXNpbmcgbmVzdGVkIGZpbGVzZXRzCitieSBzZXR0aW5nIHRoZSA8dmFyPmluY2x1ZGVFbXB0eURpcnM8L3Zhcj4gYXR0cmlidXRlIHRvIDxxPnRydWU8L3E+LiBOb3RlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaXMKK21lYW5pbmdsZXNzIGluIHRoZSBjb250ZXh0IG9mIGFueSBvZiB0aGUgdmFyaW91cyByZXNvdXJjZSBjb2xsZWN0aW9uIHR5cGVzIHRoYXQgPGVtPmRvPC9lbT4gaW5jbHVkZQorZGlyZWN0b3JpZXMsIGJ1dCB0aGF0IG5vIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGRlbGV0ZSBub24tZW1wdHkgZGlyZWN0b3JpZXMgaW4gYW55IGNhc2UuICBXaGV0aGVyCithIGRpcmVjdG9yeSBpcyBlbXB0eSBvciBub3QgaXMgZGVjaWRlZCBieSBsb29raW5nIGludG8gdGhlIGZpbGVzeXN0ZW0mbWRhc2g7aW5jbHVkZSBvciBleGNsdWRlCitwYXR0ZXJucyBkb24ndCBhcHBseSBoZXJlLjwvcD4KKzxwPklmIHlvdSB1c2UgdGhpcyB0YXNrIHRvIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZCBieSBlZGl0b3JzIGFuZCBpdCBkb2Vzbid0IHNlZW0gdG8gd29yaywKK3JlYWQgdXAgb24gdGhlIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj5kZWZhdWx0IGV4Y2x1c2lvbiBzZXQ8L2E+CitpbiA8c3Ryb25nPkRpcmVjdG9yeS1iYXNlZCBUYXNrczwvc3Ryb25nPiwgYW5kIHNlZSB0aGUgPGNvZGU+ZGVmYXVsdGV4Y2x1ZGVzPC9jb2RlPiBhdHRyaWJ1dGUKK2JlbG93LjwvcD4KIAotPHA+Rm9yIGhpc3RvcmljYWwgcmVhc29ucyA8Y29kZT4mbHQ7ZGVsZXRlIGRpcj0ieCIvJmd0OzwvY29kZT4gaXMKLSAgZGlmZmVyZW50IGZyb20gPGNvZGU+Jmx0O2RlbGV0ZSZndDsmbHQ7ZmlsZXNldAotICBkaXI9IngiLyZndDsmbHQ7L2RlbGV0ZSZndDs8L2NvZGU+LCBpdCB3aWxsIHRyeSB0byByZW1vdmUgZXZlcnl0aGluZwotICBpbnNpZGUgIngiIGluY2x1ZGluZyAieCIgaXRzZWxmLCBub3QgdGFraW5nIGRlZmF1bHQgZXhjbHVkZXMgaW50bwotICBhY2NvdW50LCBibGluZGx5IGZvbGxvd2luZyBhbGwgc3ltYm9saWMgbGlua3MuICBJZiB5b3UgbmVlZCBtb3JlCi0gIGNvbnRyb2wsIHVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LjwvcD4KKzxwPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgPGNvZGU+Jmx0O2RlbGV0ZSBkaXI9IngiLyZndDs8L2NvZGU+IGlzIGRpZmZlcmVudAorZnJvbSA8Y29kZT4mbHQ7ZGVsZXRlJmd0OyZsdDtmaWxlc2V0IGRpcj0ieCIvJmd0OyZsdDsvZGVsZXRlJmd0OzwvY29kZT47IGl0IHdpbGwgdHJ5IHRvIHJlbW92ZQorZXZlcnl0aGluZyBpbnNpZGUgPHE+eDwvcT4gaW5jbHVkaW5nIDxxPng8L3E+IGl0c2VsZiwgbm90IHRha2luZyBkZWZhdWx0IGV4Y2x1ZGVzIGludG8gYWNjb3VudCwKK2JsaW5kbHkgZm9sbG93aW5nIGFsbCBzeW1ib2xpYyBsaW5rcy4gIElmIHlvdSBuZWVkIG1vcmUgY29udHJvbCwgdXNlIGEKK25lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGRlbGV0ZSwgc3BlY2lmaWVkIGFzIGVpdGhlciB0aGUgc2ltcGxlCi0gICAgIGZpbGVuYW1lIChpZiB0aGUgZmlsZSBleGlzdHMgaW4gdGhlIGN1cnJlbnQgYmFzZSBkaXJlY3RvcnkpLCBhCi0gICAgIHJlbGF0aXZlLXBhdGggZmlsZW5hbWUsIG9yIGEgZnVsbC1wYXRoIGZpbGVuYW1lLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiByb3dzcGFuPSIyIj5BdCBsZWFzdCBvbmUgb2YgdGhlIHR3bywKLSAgICAgdW5sZXNzIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3BlY2lmaWVkCisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBkZWxldGUsIHNwZWNpZmllZCBhcyBlaXRoZXIgdGhlIHNpbXBsZSBmaWxlbmFtZSAoaWYgdGhlIGZpbGUgZXhpc3RzIGluIHRoZQorICAgICAgY3VycmVudCBiYXNlIGRpcmVjdG9yeSksIGEgcmVsYXRpdmUtcGF0aCBmaWxlbmFtZSwgb3IgYSBmdWxsLXBhdGggZmlsZW5hbWUuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0d28sIHVubGVzcyBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHRvIGRlbGV0ZSwgaW5jbHVkaW5nIGFsbCBpdHMgZmlsZXMgYW5kCi0gICAgIHN1YmRpcmVjdG9yaWVzLjxicj4KLSAgICAgPGI+Tm90ZTo8L2I+IDxjb2RlPmRpcjwvY29kZT4gaXMgPGVtPm5vdDwvZW0+IHVzZWQKLSAgICAgdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSBuYW1lIGZvciA8Y29kZT5maWxlPC9jb2RlPjsgPGNvZGU+ZmlsZTwvY29kZT4KLSAgICAgYW5kIDxjb2RlPmRpcjwvY29kZT4gYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuPGJyPgotICAgICA8Yj5XQVJOSU5HOjwvYj4gRG8gPGI+bm90PC9iPiBzZXQgPGNvZGU+ZGlyPC9jb2RlPiB0bwotICAgICA8Y29kZT4mcXVvdDsuJnF1b3Q7PC9jb2RlPiwgPGNvZGU+JnF1b3Q7JHtiYXNlZGlyfSZxdW90OzwvY29kZT4sCi0gICAgIG9yIHRoZSBmdWxsLXBhdGhuYW1lIGVxdWl2YWxlbnQgdW5sZXNzIHlvdSB0cnVseSA8ZW0+aW50ZW5kPC9lbT4gdG8KLSAgICAgcmVjdXJzaXZlbHkgcmVtb3ZlIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgYmFzZSBkaXJlY3RvcnkKLSAgICAgKGFuZCB0aGUgYmFzZSBkaXJlY3RvcnkgaXRzZWxmLCBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCB3b3JraW5nCi0gICAgIGRpcmVjdG9yeSkuPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBkaXJlY3RvcnkgdG8gZGVsZXRlLCBpbmNsdWRpbmcgYWxsIGl0cyBmaWxlcyBhbmQKKyAgICAgc3ViZGlyZWN0b3JpZXMuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IDx2YXI+ZGlyPC92YXI+IGlzIDxlbT5ub3Q8L2VtPiB1c2VkIHRvIHNwZWNpZnkgYQorICAgICBkaXJlY3RvcnkgbmFtZSBmb3IgPHZhcj5maWxlPC92YXI+OyA8dmFyPmZpbGU8L3Zhcj4gYW5kIDx2YXI+ZGlyPC92YXI+IGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoCisgICAgIG90aGVyLjxici8+PHN0cm9uZz5XYXJuaW5nPC9zdHJvbmc+OiBEbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzZXQgPHZhcj5kaXI8L3Zhcj4KKyAgICAgdG8gPHE+LjwvcT4sIDxxPiR7YmFzZWRpcn08L3E+LCBvciB0aGUgZnVsbC1wYXRobmFtZSBlcXVpdmFsZW50IHVubGVzcyB5b3UKKyAgICAgdHJ1bHkgPGVtPmludGVuZDwvZW0+IHRvIHJlY3Vyc2l2ZWx5IHJlbW92ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGJhc2UgZGlyZWN0b3J5CisgICAgIChhbmQgdGhlIGJhc2UgZGlyZWN0b3J5IGl0c2VsZiwgaWYgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBzaG93IHRoZSBuYW1lIG9mIGVhY2ggZGVsZXRlZCBmaWxlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OzwvaT48L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBzaG93IHRoZSBuYW1lIG9mIGVhY2ggZGVsZXRlZCBmaWxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsCi0gICAgIGRvIG5vdCBkaXNwbGF5IGEgZGlhZ25vc3RpYyBtZXNzYWdlICh1bmxlc3MgQXBhY2hlIEFudAotICAgICBoYXMgYmVlbiBpbnZva2VkIHdpdGggdGhlIDxjb2RlPi12ZXJib3NlPC9jb2RlPiBvcgotICAgICA8Y29kZT4tZGVidWc8L2NvZGU+IHN3aXRjaGVzKSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvCi0gICAgIHJlZmxlY3QgYW4gZXJyb3IuCi0gICAgIFdoZW4gc2V0IHRvICZxdW90O3RydWUmcXVvdDssIGlmIGEgZmlsZSBvciBkaXJlY3RvcnkgY2Fubm90IGJlIGRlbGV0ZWQsCi0gICAgIG5vIGVycm9yIGlzIHJlcG9ydGVkLiBUaGlzIHNldHRpbmcgZW11bGF0ZXMgdGhlCi0gICAgIDxjb2RlPi1mPC9jb2RlPiBvcHRpb24gdG8gdGhlIFVuaXggPGVtPnJtPC9lbT4gY29tbWFuZC4KLSAgICAgU2V0dGluZyB0aGlzIHRvICZxdW90O3RydWUmcXVvdDsgaW1wbGllcyBzZXR0aW5nCi0gICAgIDxjb2RlPmZhaWxvbmVycm9yPC9jb2RlPiB0byAmcXVvdDtmYWxzZSZxdW90Oy4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5xdWlldDwvdGQ+CisgICAgPHRkPklmIHRoZSBzcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsIGRvIG5vdCBkaXNwbGF5IGEgZGlhZ25vc3RpYyBtZXNzYWdlCisgICAgICAodW5sZXNzIEFwYWNoZSBBbnQgaGFzIGJlZW4gaW52b2tlZCB3aXRoIHRoZSA8a2JkPi12ZXJib3NlPC9rYmQ+IG9yIDxrYmQ+LWRlYnVnPC9rYmQ+CisgICAgICBzd2l0Y2hlcykgb3IgbW9kaWZ5IHRoZSBleGl0IHN0YXR1cyB0byByZWZsZWN0IGFuIGVycm9yLiAgV2hlbiBzZXQgdG8gPHE+dHJ1ZTwvcT4sIGlmIGEgZmlsZQorICAgICAgb3IgZGlyZWN0b3J5IGNhbm5vdCBiZSBkZWxldGVkLCBubyBlcnJvciBpcyByZXBvcnRlZC4gVGhpcyBzZXR0aW5nIGVtdWxhdGVzCisgICAgICB0aGUgPGtiZD4tZjwva2JkPiBvcHRpb24gdG8gdGhlIFVuaXggPGVtPnJtPC9lbT4gY29tbWFuZC4gIFNldHRpbmcgdGhpcyB0byA8cT50cnVlPC9xPgorICAgICAgaW1wbGllcyBzZXR0aW5nIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4gdG8gPHE+ZmFsc2U8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHdoZXRoZXIgYW4gZXJyb3IgKHN1Y2ggYXMgYSBmYWlsdXJlIHRvCi0gICAgZGVsZXRlIGEgZmlsZSkgc3RvcHMgdGhlIGJ1aWxkIG9yIGlzIG1lcmVseSByZXBvcnRlZCB0byB0aGUgc2NyZWVuLgotICAgIE9ubHkgcmVsZXZhbnQgaWYgPGNvZGU+cXVpZXQ8L2NvZGU+IGlzICZxdW90O2ZhbHNlJnF1b3Q7LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5Db250cm9scyB3aGV0aGVyIGFuIGVycm9yIChzdWNoIGFzIGEgZmFpbHVyZSB0byBkZWxldGUgYSBmaWxlKSBzdG9wcyB0aGUgYnVpbGQgb3IgaXMgbWVyZWx5CisgICAgICByZXBvcnRlZCB0byB0aGUgc2NyZWVuLiAgT25seSByZWxldmFudCBpZiA8Y29kZT5xdWlldDwvY29kZT4gaXMgPHE+ZmFsc2U8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZWVtcHR5ZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGRlbGV0ZSBlbXB0eSBkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgICAgICAgd2hlbiB1c2luZyBmaWxlc2V0cy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5pbmNsdWRlZW1wdHlkaXJzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBkZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMgd2hlbiB1c2luZyBmaWxlc2V0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48ZW0+RGVwcmVjYXRlZC48L2VtPiAgVXNlIHJlc291cmNlIGNvbGxlY3Rpb25zLgotICAgICAgQ29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mCi0gICAgICBmaWxlcyB0aGF0IG11c3QgYmUgZGVsZXRlZC4gQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5Ci0gICAgICBzcGVjaWZpZWQgaW4gPGNvZGU+ZGlyPC9jb2RlPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+LiAgVXNlIHJlc291cmNlIGNvbGxlY3Rpb25zLiAgQ29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZGVsZXRlZC4gQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZAorICAgICAgaW4gPHZhcj5kaXI8L3Zhcj4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gIFVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KLSAgICAgIFRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mCi0gICAgICB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+LiAgVXNlIHJlc291cmNlIGNvbGxlY3Rpb25zLiAgTmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzCisgICAgICBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxlbT5EZXByZWNhdGVkLjwvZW0+ICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuCi0gICAgICBDb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YKLSAgICAgIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZCBmcm9tIHRoZSBkZWxldGlvbiBsaXN0LgotICAgICAgQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiA8Y29kZT5kaXI8L2NvZGU+LgotICAgICAgTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuICBDb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKKyAgICAgIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZCBmcm9tIHRoZSBkZWxldGlvbiBsaXN0LiAgQWxsIGZpbGVzIGFyZSByZWxhdGl2ZSB0byB0aGUKKyAgICAgIGRpcmVjdG9yeSBzcGVjaWZpZWQgaW4gPHZhcj5kaXI8L3Zhcj4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gIFVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KLSAgICAgIFRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mCi0gICAgICB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuICBOYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMKKyAgICAgIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGVtPkRlcHJlY2F0ZWQuPC9lbT4gIFVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucy4KLSAgICAgIFdoZXRoZXIgdG8gdXNlIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj4KLSAgICAgIGRlZmF1bHQgZXhjbHVkZXMuPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uICBVc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMuICBXaGV0aGVyIHRvCisgICAgICB1c2UgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkZWZhdWx0ZXhjbHVkZXMiPmRlZmF1bHQgZXhjbHVkZXMuPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVsZXRlb25leGl0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdG8gdXNlIEZpbGUjZGVsZXRlT25FeGl0KCkgaWYgdGhlcmUgaXMgYQotICAgICAgZmFpbHVyZSB0byBkZWxldGUgYSBmaWxlLCB0aGlzIGNhdXNlcyB0aGUganZtIHRvIGF0dGVtcHQKLSAgICAgIHRvIGRlbGV0ZSB0aGUgZmlsZSB3aGVuIHRoZSBqdm0gcHJvY2VzcyBpcyB0ZXJtaW5hdGluZy4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90OzwvdGQ+CisgICAgPHRkPmRlbGV0ZW9uZXhpdDwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHRvIHVzZSA8Y29kZT5GaWxlI2RlbGV0ZU9uRXhpdCgpPC9jb2RlPiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gZGVsZXRlIGEKKyAgICAgIGZpbGUuIFRoaXMgY2F1c2VzIHRoZSBKVk0gdG8gYXR0ZW1wdCB0byBkZWxldGUgdGhlIGZpbGUgd2hlbiB0aGUgSlZNIHByb2Nlc3MgaXMKKyAgICAgIHRlcm1pbmF0aW5nLiAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3ZlTm90Rm9sbG93ZWRTeW1saW5rczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFdoZXRoZXIgc3ltYm9saWMgbGlua3MgKG5vdCB0aGUgZmlsZXMvZGlyZWN0b3JpZXMgdGhleSBsaW5rIHRvKQotICAgICAgc2hvdWxkIGJlIHJlbW92ZWQgaWYgdGhleSBoYXZlbid0IGJlZW4gZm9sbG93ZWQgYmVjYXVzZQotICAgICAgZm9sbG93U3ltbGlua3Mgd2FzIGZhbHNlIG9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xpYyBsaW5rcwotICAgICAgd2FzIHRvbyBiaWcuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgorICAgIDx0ZD5yZW1vdmVOb3RGb2xsb3dlZFN5bWxpbmtzPC90ZD4KKyAgICA8dGQ+V2hldGhlciBzeW1ib2xpYyBsaW5rcyAobm90IHRoZSBmaWxlcy9kaXJlY3RvcmllcyB0aGV5IGxpbmsgdG8pIHNob3VsZCBiZSByZW1vdmVkIGlmIHRoZXkKKyAgICAgIGhhdmVuJ3QgYmVlbiBmb2xsb3dlZCBiZWNhdXNlIDx2YXI+Zm9sbG93U3ltbGlua3M8L3Zhcj4gd2FzIDxxPmZhbHNlPC9xPiBvciB0aGUgbWF4aW11bSBudW1iZXIKKyAgICAgIG9mIHN5bWJvbGljIGxpbmtzIHdhcyB0b28gYmlnLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGVyZm9ybUdDT25GYWlsZWREZWxldGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBJZiBBbnQgZmFpbHMgdG8gZGVsZXRlIGEgZmlsZSBvciBkaXJlY3RvcnkgaXQgd2lsbCByZXRyeSB0aGUKLSAgICAgIG9wZXJhdGlvbiBvbmNlLiAgSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlIGl0IHdpbGwgcGVyZm9ybSBhCi0gICAgICBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIHJldHJ5aW5nIHRoZSBkZWxldGUuPGJyLz4KLSAgICAgIFNldHRpbmcgdGhpcyBmbGFnIHRvIHRydWUgaXMga25vd24gdG8gcmVzb2x2ZSBzb21lIHByb2JsZW1zIG9uCi0gICAgICBXaW5kb3dzICh3aGVyZSBpdCBkZWZhdWx0cyB0byB0cnVlKSBidXQgYWxzbyBmb3IgZGlyZWN0b3J5IHRyZWVzCi0gICAgICByZXNpZGluZyBvbiBhbiBORlMgc2hhcmUuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4zPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7dHJ1ZSZxdW90OyBvbgotICAgICAgV2luZG93cyBhbmQgJnF1b3Q7dHJ1ZSZxdW90OyBvbiBhbnkgb3RoZXIgT1MuPC90ZD4KKyAgICA8dGQ+cGVyZm9ybUdDT25GYWlsZWREZWxldGU8L3RkPgorICAgIDx0ZD5JZiBBbnQgZmFpbHMgdG8gZGVsZXRlIGEgZmlsZSBvciBkaXJlY3RvcnkgaXQgd2lsbCByZXRyeSB0aGUgb3BlcmF0aW9uIG9uY2UuICBJZiB0aGlzIGZsYWcKKyAgICAgIGlzIHNldCB0byA8cT50cnVlPC9xPiBpdCB3aWxsIHBlcmZvcm0gYSBnYXJiYWdlIGNvbGxlY3Rpb24gYmVmb3JlIHJldHJ5aW5nIHRoZQorICAgICAgZGVsZXRlLjxici8+U2V0dGluZyB0aGlzIGZsYWcgdG8gdHJ1ZSBpcyBrbm93biB0byByZXNvbHZlIHNvbWUgcHJvYmxlbXMgb24gV2luZG93cyAod2hlcmUgaXQKKyAgICAgIGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+KSBidXQgYWxzbyBmb3IgZGlyZWN0b3J5IHRyZWVzIHJlc2lkaW5nIG9uIGFuIE5GUyBzaGFyZS4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4zPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPiBvbiBXaW5kb3dzIGFuZCA8cT50cnVlPC9xPiBvbiBhbnkgb3RoZXIgT1M8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7ZGVsZXRlIGZpbGU9JnF1b3Q7L2xpYi9hbnQuamFyJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmRlbGV0ZXMgdGhlIGZpbGUgPGNvZGU+L2xpYi9hbnQuamFyPC9jb2RlPi48L3A+Ci08cHJlPiAgJmx0O2RlbGV0ZSBkaXI9JnF1b3Q7bGliJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmRlbGV0ZXMgdGhlIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIGZpbGVzCi1hbmQgc3ViZGlyZWN0b3JpZXMgb2YgPGNvZGU+bGliPC9jb2RlPi48L3A+CiAKLTxwcmU+ICAmbHQ7ZGVsZXRlJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouYmFrJnF1b3Q7LyZndDsKLSAgJmx0Oy9kZWxldGUmZ3Q7Cis8cD5EZWxldGUgdGhlIGZpbGUgPHNhbXA+L2xpYi9hbnQuamFyPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtkZWxldGUgZmlsZT0mcXVvdDsvbGliL2FudC5qYXImcXVvdDsvJmd0OzwvcHJlPgorCis8cD5EZWxldGUgdGhlIDxzYW1wPmxpYjwvc2FtcD4gZGlyZWN0b3J5LCBpbmNsdWRpbmcgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllcworb2YgPHNhbXA+bGliPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtkZWxldGUgZGlyPSZxdW90O2xpYiZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkRlbGV0ZSBhbGwgZmlsZXMgd2l0aCB0aGUgZXh0ZW5zaW9uIDxzYW1wPi5iYWs8L3NhbXA+IGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhbnkKK3N1YmRpcmVjdG9yaWVzLjwvcD4KKzxwcmU+CismbHQ7ZGVsZXRlJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmJhayZxdW90Oy8mZ3Q7CismbHQ7L2RlbGV0ZSZndDsKIDwvcHJlPgotPHA+ZGVsZXRlcyBhbGwgZmlsZXMgd2l0aCB0aGUgZXh0ZW5zaW9uIDxjb2RlPi5iYWs8L2NvZGU+IGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5Ci1hbmQgYW55IHN1YmRpcmVjdG9yaWVzLjwvcD4KIAotPHByZT4gICZsdDtkZWxldGUgaW5jbHVkZUVtcHR5RGlycz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtidWlsZCZxdW90Oy8mZ3Q7Ci0gICZsdDsvZGVsZXRlJmd0OworPHA+RGVsZXRlIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgb2YgPHNhbXA+YnVpbGQ8L3NhbXA+LCBpbmNsdWRpbmcgPHNhbXA+YnVpbGQ8L3NhbXA+CitpdHNlbGYuPC9wPgorPHByZT4KKyZsdDtkZWxldGUgaW5jbHVkZUVtcHR5RGlycz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7YnVpbGQmcXVvdDsvJmd0OworJmx0Oy9kZWxldGUmZ3Q7CiA8L3ByZT4KLTxwPmRlbGV0ZXMgYWxsIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBvZiA8Y29kZT5idWlsZDwvY29kZT4sIGluY2x1ZGluZwotPGNvZGU+YnVpbGQ8L2NvZGU+IGl0c2VsZi48L3A+CiAKLTxwcmU+ICAmbHQ7ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7YnVpbGQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKiZxdW90Oy8mZ3Q7Ci0gICZsdDsvZGVsZXRlJmd0OworPHA+RGVsZXRlIGFsbCBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgb2YgPHNhbXA+YnVpbGQ8L3NhbXA+LCB3aXRob3V0IDxzYW1wPmJ1aWxkPC9zYW1wPiBpdHNlbGYuPC9wPgorPHByZT4KKyZsdDtkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7YnVpbGQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKiZxdW90Oy8mZ3Q7CismbHQ7L2RlbGV0ZSZndDsKIDwvcHJlPgotPHA+ZGVsZXRlcyBhbGwgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIG9mIDxjb2RlPmJ1aWxkPC9jb2RlPiwgd2l0aG91dAotPGNvZGU+YnVpbGQ8L2NvZGU+IGl0c2VsZi48L3A+CiAKLTxwcmU+ICAmbHQ7ZGVsZXRlIGluY2x1ZGVlbXB0eWRpcnM9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLy5zdm4vJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvZGVsZXRlJmd0OworPHA+RGVsZXRlIHRoZSBTdWJ2ZXJzaW9uIG1ldGFkYXRhIGRpcmVjdG9yaWVzIHVuZGVyIDxzYW1wPnNyYzwvc2FtcD4uIEJlY2F1c2UgPHNhbXA+LnN2bjwvc2FtcD4gaXMKK29uIG9mIHRoZSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+ZGVmYXVsdCBleGNsdWRlczwvYT4geW91IGhhdmUgdG8gdXNlCit0aGUgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gZmxhZywgb3RoZXJ3aXNlIEFudCB3b24ndCBkZWxldGUgdGhlc2UgZGlyZWN0b3JpZXMgYW5kIHRoZSBmaWxlcyBpbgoraXQuPC9wPgorPHByZT4KKyZsdDtkZWxldGUgaW5jbHVkZWVtcHR5ZGlycz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLy5zdm4vJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CismbHQ7L2RlbGV0ZSZndDsKIDwvcHJlPgotPHA+ZGVsZXRlcyB0aGUgc3VidmVyc2lvbiBtZXRhZGF0YSBkaXJlY3RvcmllcyB1bmRlciA8Y29kZT5zcmM8L2NvZGU+LiBCZWNhdXNlIDxjb2RlPi5zdm48L2NvZGU+Ci1pcyBvbiBvZiB0aGUgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkZWZhdWx0ZXhjbHVkZXMiPmRlZmF1bHQgZXhjbHVkZXM8L2E+IHlvdSBoYXZlIHRvIHVzZSB0aGUgCi08Y29kZT5kZWZhdWx0ZXhjbHVkZXM8L2NvZGU+IGZsYWcsIG90aGVyd2lzZSBBbnQgd29udCBkZWxldGUgdGhlc2UgZGlyZWN0b3JpZXMgYW5kIHRoZSBmaWxlcyBpbiBpdC48L3A+Ci0KLQogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvZGVsdHJlZS5odG1sIGIvbWFudWFsL1Rhc2tzL2RlbHRyZWUuaHRtbAppbmRleCA5OGFkZjRmLi5hNjA1NzdlIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZGVsdHJlZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9kZWx0cmVlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0MyArMTUsNDAgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkRlbHRyZWUgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZGVsdHJlZSI+RGVsdHJlZTwvYT48L2gyPgotPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KLTxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiAgVXNlIHRoZSBEZWxldGUgdGFzayBpbnN0ZWFkLjwvaT48L3A+Cis8aDIgaWQ9ImRlbHRyZWUiPkRlbHRyZWU8L2gyPgorPGgzPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+PC9oMz4KKzxwPjxlbT5UaGlzIHRhc2sgaGFzIGJlZW4gPHU+ZGVwcmVjYXRlZDwvdT4uICBVc2UgdGhlIDxjb2RlPkRlbGV0ZTwvY29kZT4gdGFzayBpbnN0ZWFkLjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIDxwPkRlbGV0ZXMgYSBkaXJlY3Rvcnkgd2l0aCBhbGwgaXRzIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllcy48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IHRvIGRlbGV0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSB0byBkZWxldGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtkZWx0cmVlIGRpcj0mcXVvdDtkaXN0JnF1b3Q7LyZndDs8L3ByZT4KLTxwPmRlbGV0ZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT5kaXN0PC9jb2RlPiwgaW5jbHVkaW5nIGl0cyBmaWxlcyBhbmQKLXN1YmRpcmVjdG9yaWVzLjwvcD4KLTxwcmU+ICAmbHQ7ZGVsdHJlZSBkaXI9JnF1b3Q7JHtkaXN0fSZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5kZWxldGVzIHRoZSBkaXJlY3RvcnkgPGNvZGU+JHtkaXN0fTwvY29kZT4sIGluY2x1ZGluZyBpdHMgZmlsZXMgYW5kCi1zdWJkaXJlY3Rvcmllcy48L3A+CiAKKzxwPkRlbGV0ZSB0aGUgZGlyZWN0b3J5IDxzYW1wPmRpc3Q8L3NhbXA+LCBpbmNsdWRpbmcgaXRzIGZpbGVzIGFuZCBzdWJkaXJlY3Rvcmllcy48L3A+Cis8cHJlPiZsdDtkZWx0cmVlIGRpcj0mcXVvdDtkaXN0JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+RGVsZXRlIHRoZSBkaXJlY3RvcnkgPHNhbXA+JHtkaXN0fTwvc2FtcD4sIGluY2x1ZGluZyBpdHMgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzLjwvcD4KKzxwcmU+Jmx0O2RlbHRyZWUgZGlyPSZxdW90OyR7ZGlzdH0mcXVvdDsvJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9kZXBlbmQuaHRtbCBiL21hbnVhbC9UYXNrcy9kZXBlbmQuaHRtbAppbmRleCBhMDk0MzE5Li5jOGRmYjliIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZGVwZW5kLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2RlcGVuZC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkRlcGVuZCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI2LDE5MSArMjYsMTY5IEBACiAKIDxoMj5EZXBlbmQ8L2gyPgogCi1BIHRhc2sgdG8gbWFuYWdlIEphdmEgY2xhc3MgZmlsZSBkZXBlbmRlbmNpZXMuCis8cD5BIHRhc2sgdG8gbWFuYWdlIEphdmEgY2xhc3MgZmlsZSBkZXBlbmRlbmNpZXMuPC9wPgogCiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD4KLVRoZSBkZXBlbmQgdGFzayB3b3JrcyBieSBkZXRlcm1pbmluZyB3aGljaCBjbGFzc2VzIGFyZSBvdXQgb2YgZGF0ZSB3aXRoCi1yZXNwZWN0IHRvIHRoZWlyIHNvdXJjZSBhbmQgdGhlbiByZW1vdmluZyB0aGUgY2xhc3MgZmlsZXMgb2YgYW55IG90aGVyCi1jbGFzc2VzIHdoaWNoIGRlcGVuZCBvbiB0aGUgb3V0LW9mLWRhdGUgY2xhc3Nlcy4KLTwvcD4KKzxwPlRoZSA8Y29kZT5kZXBlbmQ8L2NvZGU+IHRhc2sgd29ya3MgYnkgZGV0ZXJtaW5pbmcgd2hpY2ggY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvCit0aGVpciBzb3VyY2UgYW5kIHRoZW4gcmVtb3ZpbmcgdGhlIGNsYXNzIGZpbGVzIG9mIGFueSBvdGhlciBjbGFzc2VzIHdoaWNoIGRlcGVuZCBvbiB0aGUgb3V0LW9mLWRhdGUKK2NsYXNzZXMuPC9wPgogCi08cD4gVG8gZGV0ZXJtaW5lIHRoZSBjbGFzcyBkZXBlbmRlbmNpZXMsIHRoZSBkZXBlbmQgdGFzayBhbmFseXplcyB0aGUgY2xhc3MgCi1maWxlcyBvZiBhbGwgY2xhc3MgZmlsZXMgcGFzc2VkIHRvIGl0LiBEZXBlbmQgZG9lcyBub3QgcGFyc2UgeW91ciBzb3VyY2UgY29kZSBpbiAKLWFueSB3YXkgYnV0IHJlbGllcyB1cG9uIHRoZSBjbGFzcyByZWZlcmVuY2VzIGVuY29kZWQgaW50byB0aGUgY2xhc3MgZmlsZXMgYnkgdGhlIAotY29tcGlsZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IGZhc3RlciB0aGFuIHBhcnNpbmcgdGhlIEphdmEgc291cmNlLjwvcD4KKzxwPlRvIGRldGVybWluZSB0aGUgY2xhc3MgZGVwZW5kZW5jaWVzLCB0aGUgPGNvZGU+ZGVwZW5kPC9jb2RlPiB0YXNrIGFuYWx5emVzIHRoZSBjbGFzcyBmaWxlcyBvZiBhbGwKK2NsYXNzIGZpbGVzIHBhc3NlZCB0byBpdC4gVGhlIHRhc2sgZG9lcyBub3QgcGFyc2UgeW91ciBzb3VyY2UgY29kZSBpbiBhbnkgd2F5IGJ1dCByZWxpZXMgdXBvbiB0aGUKK2NsYXNzIHJlZmVyZW5jZXMgZW5jb2RlZCBpbnRvIHRoZSBjbGFzcyBmaWxlcyBieSB0aGUgY29tcGlsZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IGZhc3RlciB0aGFuIHBhcnNpbmcKK3RoZSBKYXZhIHNvdXJjZSBmaWxlcy48L3A+CiAKLTxwPgotVG8gbGVhcm4gbW9yZSBhYm91dCBob3cgdGhpcyBpbmZvcm1hdGlvbiBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjbGFzcyBmaWxlcywgCi1wbGVhc2UgcmVmZXIgdG8gPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvIj50aGUgSmF2YQotVmlydHVhbCBNYWNoaW5lIFNwZWNpZmljYXRpb248L2E+Ci08L3A+Cis8cD5UbyBsZWFybiBtb3JlIGFib3V0IGhvdyB0aGlzIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gdGhlIGNsYXNzIGZpbGVzLCBwbGVhc2UgcmVmZXIKK3RvIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy8iIHRhcmdldD0iX3RvcCI+dGhlIEphdmEgVmlydHVhbCBNYWNoaW5lCitTcGVjaWZpY2F0aW9uPC9hPjwvcD4KIAotPHA+IFNpbmNlIGEgY2xhc3MnIGRlcGVuZGVuY2llcyBvbmx5IGNoYW5nZSB3aGVuIHRoZSBjbGFzcyBpdHNlbGYgY2hhbmdlcywgdGhlIAotZGVwZW5kIHRhc2sgaXMgYWJsZSB0byBjYWNoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBPbmx5IHRob3NlIGNsYXNzIGZpbGVzIAotd2hpY2ggaGF2ZSBjaGFuZ2VkIHdpbGwgaGF2ZSB0aGVpciBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHJlLWFuYWx5c2VkLiBOb3RlIHRoYXQgCi1pZiB5b3UgY2hhbmdlIGEgY2xhc3MnIGRlcGVuZGVuY2llcyBieSBjaGFuZ2luZyB0aGUgc291cmNlLCBpdCB3aWxsIGJlIAotcmVjb21waWxlZCBhbnl3YXkuIFlvdSBjYW4gZXhhbWluZSB0aGUgZGVwZW5kZW5jeSBmaWxlcyBjcmVhdGVkIHRvIHVuZGVyc3RhbmQgCi10aGUgIGRlcGVuZGVuY2llcyBvZiB5b3VyIGNsYXNzZXMuIFBsZWFzZSBkbyBub3QgcmVseSwgaG93ZXZlciwgb24gdGhlIGZvcm1hdCBvZiAKLXRoZSBpbmZvcm1hdGlvbiwgYXMgaXQgbWF5IGNoYW5nZSBpbiBhIGxhdGVyIHJlbGVhc2UuIDwvcD4KKzxwPlNpbmNlIGEgY2xhc3MnIGRlcGVuZGVuY2llcyBvbmx5IGNoYW5nZSB3aGVuIHRoZSBjbGFzcyBpdHNlbGYgY2hhbmdlcywgdGhlCis8Y29kZT5kZXBlbmQ8L2NvZGU+IHRhc2sgaXMgYWJsZSB0byBjYWNoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBPbmx5IHRob3NlIGNsYXNzIGZpbGVzIHdoaWNoIGhhdmUKK2NoYW5nZWQgd2lsbCBoYXZlIHRoZWlyIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gcmUtYW5hbHlzZWQuIE5vdGUgdGhhdCBpZiB5b3UgY2hhbmdlIGEgY2xhc3MnCitkZXBlbmRlbmNpZXMgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSwgaXQgd2lsbCBiZSByZWNvbXBpbGVkIGFueXdheS4gWW91IGNhbiBleGFtaW5lIHRoZSBkZXBlbmRlbmN5CitmaWxlcyBjcmVhdGVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBvZiB5b3VyIGNsYXNzZXMuIFBsZWFzZSBkbyBub3QgcmVseSwgaG93ZXZlciwgb24gdGhlCitmb3JtYXQgb2YgdGhlIGluZm9ybWF0aW9uLCBhcyBpdCBtYXkgY2hhbmdlIGluIGEgbGF0ZXIgcmVsZWFzZS48L3A+CiAKLTxwPiBPbmNlIGRlcGVuZCBkaXNjb3ZlcnMgYWxsIG9mIHRoZSBjbGFzcyBkZXBlbmRlbmNpZXMsIGl0ICZxdW90O2ludmVydHMmcXVvdDsgCi10aGlzIHJlbGF0aW9uIHRvIGRldGVybWluZSwgZm9yIGVhY2ggY2xhc3MsIHdoaWNoIG90aGVyIGNsYXNzZXMgYXJlIGRlcGVuZGVudCAKLXVwb24gaXQuIFRoaXMgJnF1b3Q7YWZmZWN0cyZxdW90OyBsaXN0IGlzIHVzZWQgdG8gZGlzY292ZXIgd2hpY2ggY2xhc3NlcyBhcmUgCi1pbnZhbGlkYXRlZCBieSB0aGUgb3V0IG9mIGRhdGUgY2xhc3MuIFRoZSBjbGFzcyBmaWxlcyBvZiB0aGUgaW52YWxpZGF0ZWQgCi1jbGFzc2VzIGFyZSByZW1vdmVkLCB0cmlnZ2VyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUgYWZmZWN0ZWQgY2xhc3Nlcy4gPC9wPgorPHA+T25jZSA8Y29kZT5kZXBlbmQ8L2NvZGU+IGRpc2NvdmVycyBhbGwgb2YgdGhlIGNsYXNzIGRlcGVuZGVuY2llcywgaXQgJnF1b3Q7aW52ZXJ0cyZxdW90OyB0aGlzCityZWxhdGlvbiB0byBkZXRlcm1pbmUsIGZvciBlYWNoIGNsYXNzLCB3aGljaCBvdGhlciBjbGFzc2VzIGFyZSBkZXBlbmRlbnQgdXBvbiBpdC4gVGhpcworJnF1b3Q7YWZmZWN0cyZxdW90OyBsaXN0IGlzIHVzZWQgdG8gZGlzY292ZXIgd2hpY2ggY2xhc3NlcyBhcmUgaW52YWxpZGF0ZWQgYnkgdGhlIG91dCBvZiBkYXRlCitjbGFzcy4gVGhlIGNsYXNzIGZpbGVzIG9mIHRoZSBpbnZhbGlkYXRlZCBjbGFzc2VzIGFyZSByZW1vdmVkLCB0cmlnZ2VyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUKK2FmZmVjdGVkIGNsYXNzZXMuPC9wPgogCi08cD4gVGhlIGRlcGVuZCB0YXNrIHN1cHBvcnRzIGFuIGF0dHJpYnV0ZSwgJnF1b3Q7Y2xvc3VyZSZxdW90OyB3aGljaCBjb250cm9scyAKLXdoZXRoZXIgZGVwZW5kIHdpbGwgb25seSBjb25zaWRlciBkaXJlY3QgY2xhc3MtY2xhc3MgcmVsYXRpb25zaGlwcyBvciB3aGV0aGVyIGl0IAotd2lsbCBhbHNvIGNvbnNpZGVyIHRyYW5zaXRpdmUsIGluZGlyZWN0IHJlbGF0aW9uc2hpcHMuIEZvciBleGFtcGxlLCBzYXkgdGhlcmUgCi1hcmUgdGhyZWUgY2xhc3NlcywgQSwgd2hpY2ggZGVwZW5kcyBvbiBCLCB3aGljaCBpbi10dXJuIGRlcGVuZCBvbiBDLiBOb3cgc2F5IAotdGhhdCBjbGFzcyBDIGlzIG91dCBvZiBkYXRlLiBXaXRob3V0IGNsb3N1cmUsIG9ubHkgY2xhc3MgQiB3b3VsZCBiZSByZW1vdmVkIGJ5IAotZGVwZW5kLiBXaXRoIGNsb3N1cmUgc2V0LCBjbGFzcyBBIHdvdWxkIGFsc28gYmUgcmVtb3ZlZC4gTm9ybWFsbHkgZGlyZWN0IAotcmVsYXRpb25zaGlwcyBhcmUgc3VmZmljaWVudCAtIGl0IGlzIHVudXN1YWwgZm9yIGEgY2xhc3MgdG8gZGVwZW5kIG9uIGFub3RoZXIgCi13aXRob3V0IGhhdmluZyBhIGRpcmVjdCByZWxhdGlvbnNoaXAuIFdpdGggY2xvc3VyZSBzZXQsIHlvdSB3aWxsIG5vdGljZSB0aGF0IAotZGVwZW5kIHR5cGljYWxseSByZW1vdmVzIGZhciBtb3JlIGNsYXNzIGZpbGVzLiA8L3A+Cis8cD5UaGUgPGNvZGU+ZGVwZW5kPC9jb2RlPiB0YXNrIHN1cHBvcnRzIGFuIGF0dHJpYnV0ZSwgPHZhcj5jbG9zdXJlPC92YXI+LCB3aGljaCBjb250cm9scword2hldGhlciA8Y29kZT5kZXBlbmQ8L2NvZGU+IHdpbGwgb25seSBjb25zaWRlciBkaXJlY3QgY2xhc3MtY2xhc3MgcmVsYXRpb25zaGlwcyBvciB3aGV0aGVyIGl0IHdpbGwKK2Fsc28gY29uc2lkZXIgdHJhbnNpdGl2ZSwgaW5kaXJlY3QgcmVsYXRpb25zaGlwcy4gRm9yIGV4YW1wbGUsIHNheSB0aGVyZSBhcmUgdGhyZWUgY2xhc3NlcywgQSwgd2hpY2gKK2RlcGVuZHMgb24gQiwgd2hpY2ggaW4tdHVybiBkZXBlbmRzIG9uIEMuIE5vdyBzYXkgdGhhdCBjbGFzcyBDIGlzIG91dCBvZgorZGF0ZS4gV2l0aG91dCA8dmFyPmNsb3N1cmU8L3Zhcj4sIG9ubHkgY2xhc3MgQiB3b3VsZCBiZSByZW1vdmVkCitieSA8Y29kZT5kZXBlbmQ8L2NvZGU+LiBXaXRoIDx2YXI+Y2xvc3VyZTwvdmFyPiBzZXQsIGNsYXNzIEEgd291bGQgYWxzbyBiZSByZW1vdmVkLiBOb3JtYWxseSBkaXJlY3QKK3JlbGF0aW9uc2hpcHMgYXJlIHN1ZmZpY2llbnQmbWRhc2g7aXQgaXMgdW51c3VhbCBmb3IgYSBjbGFzcyB0byBkZXBlbmQgb24gYW5vdGhlciB3aXRob3V0IGhhdmluZyBhCitkaXJlY3QgcmVsYXRpb25zaGlwLiBXaXRoIDx2YXI+Y2xvc3VyZTwvdmFyPiBzZXQsIHlvdSB3aWxsIG5vdGljZSB0aGF0IDxjb2RlPmRlcGVuZDwvY29kZT4gdHlwaWNhbGx5CityZW1vdmVzIGZhciBtb3JlIGNsYXNzIGZpbGVzLjwvcD4KIAotPHA+VGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUgZm9yIDxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiBpcyBvcHRpb25hbC4gSWYgaXQgaXMgcHJlc2VudCwgCi1kZXBlbmQgd2lsbCBjaGVjayBjbGFzcyBkZXBlbmRlbmNpZXMgYWdhaW5zdCBjbGFzc2VzIGFuZCBqYXJzIG9uIHRoaXMgY2xhc3NwYXRoLgotQW55IGNsYXNzZXMgd2hpY2ggZGVwZW5kIG9uIGFuIGVsZW1lbnQgZnJvbSB0aGlzIGNsYXNzcGF0aCBhbmQgd2hpY2ggYXJlIG9sZGVyIAotdGhhbiB0aGF0IGVsZW1lbnQgd2lsbCBiZSBkZWxldGVkLiBBIHR5cGljYWwgZXhhbXBsZSB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgCi1mYWNpbGl0eSB3b3VsZCBiZSB3aGVyZSB5b3UgYXJlIGJ1aWxkaW5nIGEgdXRpbGl0eSBqYXIgYW5kIHdhbnQgdG8gbWFrZSBzdXJlIAotY2xhc3NlcyB3aGljaCBhcmUgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgamFyIGFyZSByZWJ1aWx0LiBZb3Ugc2hvdWxkCi08Yj5ub3Q8L2I+IGluY2x1ZGUgamFycyBpbiB0aGlzIGNsYXNzcGF0aCB3aGljaCB5b3UgZG8gbm90IGV4cGVjdCB0byBjaGFuZ2UsIAotc3VjaCBhcyB0aGUgSkRLIHJ1bnRpbWUgamFyIG9yIHRoaXJkIHBhcnR5IGphcnMsIHNpbmNlIGRvaW5nIHNvIHdpbGwganVzdCBzbG93IAotZG93biB0aGUgZGVwZW5kZW5jeSBjaGVjay4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBkbyB1c2UgYSBjbGFzc3BhdGggZm9yIHRoZSAKLWRlcGVuZCB0YXNrIGl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgY2xhc3NwYXRoIG5lY2Vzc2FyeSB0byBhY3R1YWxseSAKLWNvbXBpbGUgeW91ciBjb2RlLjwvcD4KKzxwPlRoZSA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhdHRyaWJ1dGUgZm9yIDxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiBpcyBvcHRpb25hbC4gSWYgaXQgaXMKK3ByZXNlbnQsIDxjb2RlPmRlcGVuZDwvY29kZT4gd2lsbCBjaGVjayBjbGFzcyBkZXBlbmRlbmNpZXMgYWdhaW5zdCBjbGFzc2VzIGFuZCBqYXJzIG9uIHRoaXMKK2NsYXNzcGF0aC4gIEFueSBjbGFzc2VzIHdoaWNoIGRlcGVuZCBvbiBhbiBlbGVtZW50IGZyb20gdGhpcyBjbGFzc3BhdGggYW5kIHdoaWNoIGFyZSBvbGRlciB0aGFuIHRoYXQKK2VsZW1lbnQgd2lsbCBiZSBkZWxldGVkLiBBIHR5cGljYWwgZXhhbXBsZSB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgZmFjaWxpdHkgd291bGQgYmUgd2hlcmUgeW91IGFyZQorYnVpbGRpbmcgYSB1dGlsaXR5IGphciBhbmQgd2FudCB0byBtYWtlIHN1cmUgY2xhc3NlcyB3aGljaCBhcmUgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIHRoaXMgamFyCithcmUgcmVidWlsdC4gSW4gdGhpcyBjbGFzc3BhdGgsIHlvdSBzaG91bGQgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gaW5jbHVkZSBqYXJzIHRoYXQgeW91IGRvIG5vdCBleHBlY3QKK3RvIGNoYW5nZSwgc3VjaCBhcyB0aGUgSkRLIHJ1bnRpbWUgamFyIG9yIHRoaXJkIHBhcnR5IGphcnMsIHNpbmNlIGRvaW5nIHNvIHdpbGwganVzdCBzbG93IGRvd24gdGhlCitkZXBlbmRlbmN5IGNoZWNrLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IGRvIHVzZSBhIGNsYXNzcGF0aCBmb3IgdGhlIDxjb2RlPmRlcGVuZDwvY29kZT4gdGFzayBpdCBtYXkKK2JlIGRpZmZlcmVudCBmcm9tIHRoZSBjbGFzc3BhdGggbmVjZXNzYXJ5IHRvIGFjdHVhbGx5IGNvbXBpbGUgeW91ciBjb2RlLjwvcD4KIAotPGgzPlBlcmZvcm1hbmNlPC9oMz4gCis8aDM+UGVyZm9ybWFuY2U8L2gzPgogCi08cD4gVGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBkZXBlbmQgdGFzayBpcyBkZXBlbmRlbnQgb24gYSAKLW51bWJlciBvZiBmYWN0b3JzIHN1Y2ggYXMgY2xhc3MgcmVsYXRpb25zaGlwIGNvbXBsZXhpdHkgYW5kIGhvdyBtYW55IGNsYXNzIGZpbGVzIAotYXJlIG91dCBvZiBkYXRlLiBUaGUgZGVjaXNpb24gYWJvdXQgd2hldGhlciBpdCBpcyBjaGVhcGVyIHRvIGp1c3QgcmVjb21waWxlIGFsbCAKLWNsYXNzZXMgb3IgdG8gdXNlIHRoZSBkZXBlbmQgdGFzayB3aWxsIGRlcGVuZCBvbiB0aGUgc2l6ZSBvZiB5b3VyIHByb2plY3QgYW5kIAotaG93IGludGVycmVsYXRlZCB5b3VyIGNsYXNzZXMgYXJlLiA8L3A+Ci0KKzxwPlRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgPGNvZGU+ZGVwZW5kPC9jb2RlPiB0YXNrIGlzIGRlcGVuZGVudCBvbiBhIG51bWJlciBvZiBmYWN0b3JzIHN1Y2ggYXMgY2xhc3MKK3JlbGF0aW9uc2hpcCBjb21wbGV4aXR5IGFuZCBob3cgbWFueSBjbGFzcyBmaWxlcyBhcmUgb3V0IG9mIGRhdGUuIFRoZSBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIGl0IGlzCitjaGVhcGVyIHRvIGp1c3QgcmVjb21waWxlIGFsbCBjbGFzc2VzIG9yIHRvIHVzZSB0aGUgPGNvZGU+ZGVwZW5kPC9jb2RlPiB0YXNrIHdpbGwgZGVwZW5kIG9uIHRoZSBzaXplCitvZiB5b3VyIHByb2plY3QgYW5kIGhvdyBpbnRlcnJlbGF0ZWQgeW91ciBjbGFzc2VzIGFyZS48L3A+CiAKIDxoMz5MaW1pdGF0aW9uczwvaDM+CiAKLTxwPiBUaGVyZSBhcmUgc29tZSBzb3VyY2UgZGVwZW5kZW5jaWVzIHdoaWNoIGRlcGVuZCB3aWxsIG5vdCBkZXRlY3QuIDwvcD4KKzxwPlRoZXJlIGFyZSBzb21lIHNvdXJjZSBkZXBlbmRlbmNpZXMgd2hpY2ggPGNvZGU+ZGVwZW5kPC9jb2RlPiB3aWxsIG5vdCBkZXRlY3Q6PC9wPgogCiA8dWw+Ci08bGk+SWYgdGhlIEphdmEgY29tcGlsZXIgb3B0aW1pemVzIGF3YXkgYSBjbGFzcyByZWxhdGlvbnNoaXAsIAotICAgIHRoZXJlIGNhbiBiZSBhIHNvdXJjZSBkZXBlbmRlbmN5IHdpdGhvdXQgYSBjbGFzcyBkZXBlbmRlbmN5LiA8L2xpPgotICAgIAotPGxpPk5vbiBwdWJsaWMgY2xhc3NlcyBjYXVzZSB0d28gcHJvYmxlbXMuIEZpcnN0bHkgZGVwZW5kIGNhbm5vdCByZWxhdGUKLSAgICB0aGUgY2xhc3MgZmlsZSB0byBhIHNvdXJjZSBmaWxlLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWF5IGJlIGFkZHJlc3NlZAotICAgIHVzaW5nIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUgaW4gdGhlIGNsYXNzZmlsZS4gU2Vjb25kbHksIG5laXRoZXIgCi0gICAgZGVwZW5kIG5vciB0aGUgY29tcGlsZXIgdGFza3MgY2FuIGRldGVjdCB3aGVuIGEgbm9uIHB1YmxpYyBjbGFzcyBpcwotICAgIG1pc3NpbmcuIElubmVyIGNsYXNzZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGRlcGVuZCB0YXNrLjwvbGk+Cis8bGk+SWYgdGhlIEphdmEgY29tcGlsZXIgb3B0aW1pemVzIGF3YXkgYSBjbGFzcyByZWxhdGlvbnNoaXAsIHRoZXJlIGNhbiBiZSBhIHNvdXJjZSBkZXBlbmRlbmN5Cit3aXRob3V0IGEgY2xhc3MgZGVwZW5kZW5jeS48L2xpPgorCis8bGk+Tm9uLXB1YmxpYyBjbGFzc2VzIGNhdXNlIHR3byBwcm9ibGVtcy4gRmlyc3RseSwgZGVwZW5kIGNhbm5vdCByZWxhdGUgdGhlIGNsYXNzIGZpbGUgdG8gYSBzb3VyY2UKK2ZpbGUuIEluIHRoZSBmdXR1cmUgdGhpcyBtYXkgYmUgYWRkcmVzc2VkIHVzaW5nIHRoZSBzb3VyY2UgZmlsZSBhdHRyaWJ1dGUgaW4gdGhlCitjbGFzc2ZpbGUuIFNlY29uZGx5LCBuZWl0aGVyIDxjb2RlPmRlcGVuZDwvY29kZT4gbm9yIHRoZSBjb21waWxlciB0YXNrcyBjYW4gZGV0ZWN0IHdoZW4gYSBub24tcHVibGljCitjbGFzcyBpcyBtaXNzaW5nLiBJbm5lciBjbGFzc2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSA8Y29kZT5kZXBlbmQ8L2NvZGU+IHRhc2suPC9saT4KIDwvdWw+CiAKLVRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBvZiB0aGVzZSBsaW1pdGF0aW9ucyBpcyB0aGF0IHRoZSB0YXNrIGNhbid0IHRlbGwKLXdoaWNoIGNsYXNzZXMgdG8gcmVjb21waWxlIHdoZW4gYSBjb25zdGFudCBwcmltaXRpdmUgZGF0YSB0eXBlIGV4cG9ydGVkIAotYnkgb3RoZXIgY2xhc3NlcyBpcyBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgYSBjaGFuZ2UgaW4gdGhlIGRlZmluaXRpb24gb2YKLXNvbWV0aGluZyBsaWtlCis8cD5UaGUgbW9zdCBvYnZpb3VzIGV4YW1wbGUgb2YgdGhlc2UgbGltaXRhdGlvbnMgaXMgdGhhdCB0aGUgdGFzayBjYW4ndCB0ZWxsIHdoaWNoIGNsYXNzZXMgdG8KK3JlY29tcGlsZSB3aGVuIGEgY29uc3RhbnQgcHJpbWl0aXZlIGRhdGEgdHlwZSBleHBvcnRlZCBieSBvdGhlciBjbGFzc2VzIGlzIGNoYW5nZWQuIEZvciBleGFtcGxlLCBhCitjaGFuZ2UgaW4gdGhlIGRlZmluaXRpb24gb2Ygc29tZXRoaW5nIGxpa2U8L3A+CiA8cHJlPgogcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7Ci0gIHB1YmxpYyBmaW5hbCBzdGF0aWMgYm9vbGVhbiBERUJVRz1mYWxzZTsKLX0KLTwvcHJlPiB3aWxsIG5vdCBiZSBwaWNrZWQgdXAgYnkgb3RoZXIgY2xhc3Nlcy4KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUc9ZmFsc2U7Cit9PC9wcmU+Cis8cD53aWxsIG5vdCBiZSBwaWNrZWQgdXAgYnkgb3RoZXIgY2xhc3Nlcy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjRGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc291cmNlIGV4aXN0cy4gZGVwZW5kCi13aWxsIGV4YW1pbmUgdGhpcyB0byBkZXRlcm1pbmUgd2hpY2ggY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUuIElmIHlvdSB1c2UgbXVsdGlwbGUKLXNvdXJjZSBkaXJlY3RvcmllcyB5b3UgY2FuIHBhc3MgdGhpcyBhdHRyaWJ1dGUgYSBwYXRoIG9mIHNvdXJjZSBkaXJlY3Rvcmllcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3JjRGlyPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzb3VyY2UgZXhpc3RzLiA8Y29kZT5kZXBlbmQ8L2NvZGU+IHdpbGwgZXhhbWluZSB0aGlzIHRvCisgICAgICBkZXRlcm1pbmUgd2hpY2ggY2xhc3NlcyBhcmUgb3V0IG9mIGRhdGUuIElmIHlvdSB1c2UgbXVsdGlwbGUgc291cmNlIGRpcmVjdG9yaWVzIHlvdSBjYW4gcGFzcworICAgICAgdGhpcyBhdHRyaWJ1dGUgYSBwYXRoIG9mIHNvdXJjZSBkaXJlY3Rvcmllcy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0RGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBjbGFzcyBmaWxlcyB3aGljaAotd2lsbCBiZSBhbmFseXNlZC4gSWYgdGhpcyBpcyBub3QgcHJlc2VudCwgdGhlIHNyY2RpciBpcyB1c2VkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlc3REaXI8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgY2xhc3MgZmlsZXMgd2hpY2ggd2lsbCBiZSBhbmFseXNlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHZhcj5zcmNkaXI8L3Zhcj48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIGEgZGlyZWN0b3J5IGluIHdoaWNoIGRlcGVuZCBjYW4gc3RvcmUgYW5kCi1yZXRyaWV2ZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLiBJZiB0aGlzIGlzIG5vdCBwcmVzZW50LCBkZXBlbmQgd2lsbCBub3QKLXVzZSBhIGNhY2hlIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNhY2hlPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyBhIGRpcmVjdG9yeSBpbiB3aGljaCA8Y29kZT5kZXBlbmQ8L2NvZGU+IGNhbiBzdG9yZSBhbmQgcmV0cmlldmUgZGVwZW5kZW5jeQorICAgICAgaW5mb3JtYXRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIG5vIGNhY2hlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xvc3VyZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIGRlcGVuZCBvbmx5IHJlbW92ZXMKLWNsYXNzZXMgd2hpY2ggZGlyZWN0bHkgZGVwZW5kIG9uIG91dCBvZiBkYXRlIGNsYXNzZXMuIElmIHRoaXMgaXMgc2V0IHRvIHRydWUsCi1kZXBlbmQgd2lsbCB0cmF2ZXJzZSB0aGUgY2xhc3MgZGVwZW5kZW5jeSBncmFwaCBkZWxldGluZyBhbGwgYWZmZWN0ZWQKLWNsYXNzZXMuIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xvc3VyZTwvdGQ+CisgICAgPHRkPlRoaXMgYXR0cmlidXRlIGNvbnRyb2xzIHdoZXRoZXIgPGNvZGU+ZGVwZW5kPC9jb2RlPiBvbmx5IHJlbW92ZXMgY2xhc3NlcyB3aGljaCBkaXJlY3RseQorICAgICAgZGVwZW5kIG9uIG91dCBvZiBkYXRlIGNsYXNzZXMuIElmIHRoaXMgaXMgc2V0IHRvIDxxPnRydWU8L3E+LCA8Y29kZT5kZXBlbmQ8L2NvZGU+IHdpbGwKKyAgICAgIHRyYXZlcnNlIHRoZSBjbGFzcyBkZXBlbmRlbmN5IGdyYXBoIGRlbGV0aW5nIGFsbCBhZmZlY3RlZCBjbGFzc2VzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kdW1wPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRydWUgdGhlIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBkZWJ1ZyBsZXZlbCBsb2cKLSAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmR1bXA8L3RkPgorICAgIDx0ZD5JZiB0cnVlIHRoZSBkZXBlbmRlbmN5IGluZm9ybWF0aW9uIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgZGVidWcgbGV2ZWwgbG9nPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggY29udGFpbmluZyBqYXJzIGFuZCBjbGFzc2VzIGZvciB3aGljaCA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gc2hvdWxkIGFsc28KLSAgICAgICAgICAgICAgICAgICAgIGNoZWNrIGRlcGVuZGVuY2llczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggY29udGFpbmluZyBqYXJzIGFuZCBjbGFzc2VzIGZvciB3aGljaCA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gc2hvdWxkIGFsc28KKyAgICAgIGNoZWNrIGRlcGVuZGVuY2llczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2Fybk9uUm1pU3R1YnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RmxhZyB0byBkaXNhYmxlIHdhcm5pbmdzIGFib3V0IGZpbGVzIHRoYXQgbG9vayBsaWtlIHJtaWMgZ2VuZXJhdGVkIHN0dWIvc2tlbGV0b24KLSAgICBjbGFzc2VzLCBhbmQgd2hpY2ggaGF2ZSBubyAuamF2YSBzb3VyY2UuIFVzZWZ1bCB3aGVuIGRvaW5nIHJtaSBkZXZlbG9wbWVudC4gPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0PXRydWU8L3RkPgorICAgIDx0ZD53YXJuT25SbWlTdHViczwvdGQ+CisgICAgPHRkPkZsYWcgdG8gZGlzYWJsZSB3YXJuaW5ncyBhYm91dCBmaWxlcyB0aGF0IGxvb2sgbGlrZSA8a2JkPnJtaWM8L2tiZD4gZ2VuZXJhdGVkCisgICAgICBzdHViL3NrZWxldG9uIGNsYXNzZXMgYW5kIGhhdmUgbm8gPHNhbXA+LmphdmE8L3NhbXA+IHNvdXJjZS4gVXNlZnVsIHdoZW4gZG9pbmcgUk1JCisgICAgICBkZXZlbG9wbWVudC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KLTxwPlRoZSA8Y29kZT5kZXBlbmQ8L2NvZGU+IHRhc2sncyA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGF0dHJpYnV0ZSBpcyBhIAotPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRILWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0Ci12aWEgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorPHA+VGhlIDxjb2RlPmRlcGVuZDwvY29kZT4gdGFzaydzIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGF0dHJpYnV0ZSBpcworYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEKK25lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CiAKLTxwPkFkZGl0aW9uYWxseSwKLXRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdAotPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPgotYW5kIHN1cHBvcnRzIG1vc3QgYXR0cmlidXRlcyBvZgotPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPnNyY2RpcjwvY29kZT4pLAotYXMgd2VsbCBhcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sCi08Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+LCBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy4KKzxwPkFkZGl0aW9uYWxseSwgdGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCitzdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPHZhcj5kaXI8L3Zhcj4gYmVjb21lcyA8dmFyPnNyY2RpcjwvdmFyPiksCithcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiwKK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+Jmx0O2RlcGVuZCBzcmNkaXI9JnF1b3Q7JHtqYXZhLmRpcn0mcXVvdDsKKworPHA+UmVtb3ZlIGFueSBjbGFzc2VzIGluIHRoZSA8c2FtcD4ke2J1aWxkLmNsYXNzZXN9PC9zYW1wPiBkaXJlY3RvcnkgdGhhdCBkZXBlbmQgb24gb3V0LW9mLWRhdGUKK2NsYXNzZXMuIENsYXNzZXMgYXJlIGNvbnNpZGVyZWQgb3V0LW9mLWRhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBzb3VyY2UgaW4KK3RoZSA8c2FtcD4ke2phdmEuZGlyfTwvc2FtcD4gZGlyZWN0b3J5LCB1c2luZyB0aGUgc2FtZSBtZWNoYW5pc20gYXMgdGhlIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+Cit0YXNrLiBJbiB0aGlzIGV4YW1wbGUsIHRoZSA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gdGFzayBjYWNoZXMgaXRzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaW4KK3RoZSA8c2FtcD5kZXBjYWNoZTwvc2FtcD4gZGlyZWN0b3J5LjwvcD4KKzxwcmU+CismbHQ7ZGVwZW5kIHNyY2Rpcj0mcXVvdDske2phdmEuZGlyfSZxdW90OwogICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsKICAgICAgICAgY2FjaGU9JnF1b3Q7ZGVwY2FjaGUmcXVvdDsKICAgICAgICAgY2xvc3VyZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5yZW1vdmVzIGFueSBjbGFzc2VzIGluIHRoZSA8Y29kZT4ke2J1aWxkLmNsYXNzZXN9PC9jb2RlPiBkaXJlY3RvcnkKLXRoYXQgZGVwZW5kIG9uIG91dC1vZi1kYXRlIGNsYXNzZXMuIENsYXNzZXMgYXJlIGNvbnNpZGVyZWQgb3V0LW9mLWRhdGUgd2l0aCAKLXJlc3BlY3QgdG8gdGhlIHNvdXJjZSBpbiB0aGUgPGNvZGU+JHtqYXZhLmRpcn08L2NvZGU+IGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUKLW1lY2hhbmlzbSBhcyB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzay4gSW4gdGhpcyBleGFtcGxlLCB0aGUKLTxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiB0YXNrIGNhY2hlcyBpdHMgZGVwZW5kZW5jeSAKLWluZm9ybWF0aW9uIGluIHRoZSA8Y29kZT5kZXBjYWNoZTwvY29kZT4gZGlyZWN0b3J5LiA8L3A+Ci0KKzxwPkRvIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlLCBidXQgZXhwbGljaXRseSBpbmNsdWRlIGFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMsIGV4Y2VwdAordGhvc2UgdGhhdCBtYXRjaCB0aGUgbGlzdCBnaXZlbiBpbiA8c2FtcD4ke2phdmEuZGlyfS9idWlsZF9leGNsdWRlczwvc2FtcD4uPC9wPgogPHByZT4KICZsdDtkZXBlbmQgc3JjZGlyPSZxdW90OyR7amF2YS5kaXJ9JnF1b3Q7IGRlc3RkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OwogICAgICAgICBjYWNoZT0mcXVvdDtkZXBjYWNoZSZxdW90OyBjbG9zdXJlPSZxdW90O3llcyZxdW90OyZndDsKICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OwogICAmbHQ7ZXhjbHVkZXNmaWxlIG5hbWU9JnF1b3Q7JHtqYXZhLmRpcn0vYnVpbGRfZXhjbHVkZXMmcXVvdDsvJmd0OwotJmx0Oy9kZXBlbmQmZ3Q7Ci08L3ByZT4KLTxwPmRvZXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBleHBsaWNpdGx5IGluY2x1ZGVzIGFsbAotPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzLCBleGNlcHQgdGhvc2UgdGhhdCBtYXRjaCB0aGUgbGlzdCBnaXZlbgotaW4gPGNvZGU+JHtqYXZhLmRpcn0vYnVpbGRfZXhjbHVkZXM8L2NvZGU+LjwvcD4KLQotCismbHQ7L2RlcGVuZCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvZGVwZW5kc2V0Lmh0bWwgYi9tYW51YWwvVGFza3MvZGVwZW5kc2V0Lmh0bWwKaW5kZXggMzRlYzIzOC4uNzM0Njc2NyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2RlcGVuZHNldC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9kZXBlbmRzZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5EZXBlbmRTZXQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0zMCwxNDIgKzMwLDExMyBAQAogCiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD4KLVRoZSBkZXBlbmRzZXQgdGFzayBjb21wYXJlcyBhIHNldCBvZiBzb3VyY2VzIHdpdGggYSBzZXQgb2YgdGFyZ2V0Ci1maWxlcy4gIElmIGFueSBvZiB0aGUgc291cmNlcyBoYXMgYmVlbiBtb2RpZmllZCBtb3JlIHJlY2VudGx5IHRoYW4KLWFueSBvZiB0aGUgdGFyZ2V0IGZpbGVzLCBhbGwgb2YgdGhlIHRhcmdldCBmaWxlcyBhcmUgcmVtb3ZlZC4KLTwvcD4KLTxwPgotU291cmNlcyBhbmQgdGFyZ2V0IGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIG5lc3RlZAotPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zOwotc291cmNlcyBjYW4gYmUgcmVzb3VyY2VzIG9mIGFueSB0eXBlLCB3aGlsZSB0YXJnZXRzIGFyZSByZXN0cmljdGVkIHRvIGZpbGVzCi1vbmx5LiBBdCBsZWFzdCBvbmUgc2V0IG9mIHNvdXJjZXMgYW5kIG9uZSBzZXQgb2YgdGFyZ2V0cyBpcyByZXF1aXJlZC4KLTwvcD4KLTxwPgotVXNlIGEgRmlsZVNldCB3aGVuIHlvdSB3YW50IHRvIHVzZSB3aWxkY2FyZCBpbmNsdWRlIG9yIGV4Y2x1ZGUKLXBhdHRlcm5zIGFuZCBkb24ndCBjYXJlIGFib3V0IG1pc3NpbmcgZmlsZXMuICBVc2UgYSBGaWxlTGlzdCB3aGVuIHlvdQotd2FudCB0byBjb25zaWRlciB0aGUgbm9uLWV4aXN0ZW5jZSBvZiBhIGZpbGUgYXMgaWYgaXQgd2VyZSBvdXQgb2YKLWRhdGUuICBJZiB0aGVyZSBhcmUgYW55IG5vbi1leGlzdGluZyBmaWxlcyBpbiBhbnkgc291cmNlIG9yIHRhcmdldAotRmlsZUxpc3QsIGFsbCB0YXJnZXQgZmlsZXMgd2lsbCBiZSByZW1vdmVkLgotPC9wPgotPHA+Ci1EZXBlbmRTZXQgaXMgdXNlZnVsIHRvIGNhcHR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBvciBjYW5ub3QgYmUKLWRldGVybWluZWQgYWxnb3JpdGhtaWNhbGx5LiAgRm9yIGV4YW1wbGUsIHRoZSA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPiB0YXNrIG9ubHkKLWNvbXBhcmVzIHRoZSBzb3VyY2UgWE1MIGZpbGUgYW5kIFhTTFQgc3R5bGVzaGVldCBhZ2FpbnN0IHRoZSB0YXJnZXQKLWZpbGUgdG8gZGV0ZXJtaW5lZCB3aGV0aGVyIHRvIHJlc3R5bGUgdGhlIHNvdXJjZS4gIFVzaW5nIGRlcGVuZHNldCB5b3UKLWNhbiBleHRlbmQgdGhpcyBkZXBlbmRlbmN5IGNoZWNraW5nIHRvIGluY2x1ZGUgYSBEVEQgb3IgWFNEIGZpbGUgYXMKLXdlbGwgYXMgb3RoZXIgc3R5bGVzaGVldHMgaW1wb3J0ZWQgYnkgdGhlIG1haW4gc3R5bGVzaGVldC4KLTwvcD4KKzxwPlRoZSA8Y29kZT5kZXBlbmRzZXQ8L2NvZGU+IHRhc2sgY29tcGFyZXMgYSBzZXQgb2Ygc291cmNlcyB3aXRoIGEgc2V0IG9mIHRhcmdldCBmaWxlcy4gIElmIGFueSBvZgordGhlIHNvdXJjZXMgaGFzIGJlZW4gbW9kaWZpZWQgbW9yZSByZWNlbnRseSB0aGFuIGFueSBvZiB0aGUgdGFyZ2V0IGZpbGVzLCBhbGwgb2YgdGhlIHRhcmdldCBmaWxlcworYXJlIHJlbW92ZWQuPC9wPgorPHA+U291cmNlcyBhbmQgdGFyZ2V0IGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhCituZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+OyBzb3VyY2VzIGNhbiBiZQorcmVzb3VyY2VzIG9mIGFueSB0eXBlLCB3aGlsZSB0YXJnZXRzIGFyZSByZXN0cmljdGVkIHRvIGZpbGVzIG9ubHkuIEF0IGxlYXN0IG9uZSBzZXQgb2Ygc291cmNlcyBhbmQKK29uZSBzZXQgb2YgdGFyZ2V0cyBpcyByZXF1aXJlZC48L3A+Cis8cD5Vc2UgYSBGaWxlU2V0IHdoZW4geW91IHdhbnQgdG8gdXNlIHdpbGRjYXJkIGluY2x1ZGUgb3IgZXhjbHVkZSBwYXR0ZXJucyBhbmQgZG9uJ3QgY2FyZSBhYm91dAorbWlzc2luZyBmaWxlcy4gIFVzZSBhIEZpbGVMaXN0IHdoZW4geW91IHdhbnQgdG8gY29uc2lkZXIgdGhlIG5vbi1leGlzdGVuY2Ugb2YgYSBmaWxlIGFzIGlmIGl0IHdlcmUKK291dCBvZiBkYXRlLiAgSWYgdGhlcmUgYXJlIGFueSBub24tZXhpc3RpbmcgZmlsZXMgaW4gYW55IHNvdXJjZSBvciB0YXJnZXQgRmlsZUxpc3QsIGFsbCB0YXJnZXQgZmlsZXMKK3dpbGwgYmUgcmVtb3ZlZC48L3A+Cis8cD5EZXBlbmRTZXQgaXMgdXNlZnVsIHRvIGNhcHR1cmUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBvciBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhbGdvcml0aG1pY2FsbHkuCitGb3IgZXhhbXBsZSwgdGhlIDxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IHRhc2sgb25seSBjb21wYXJlcyB0aGUgc291cmNlIFhNTCBmaWxlIGFuZCBYU0xUCitzdHlsZXNoZWV0IGFnYWluc3QgdGhlIHRhcmdldCBmaWxlIHRvIGRldGVybWluZWQgd2hldGhlciB0byByZXN0eWxlIHRoZSBzb3VyY2UuCitVc2luZyA8Y29kZT5kZXBlbmRzZXQ8L2NvZGU+IHlvdSBjYW4gZXh0ZW5kIHRoaXMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBpbmNsdWRlIGEgRFREIG9yIFhTRCBmaWxlIGFzCit3ZWxsIGFzIG90aGVyIHN0eWxlc2hlZXRzIGltcG9ydGVkIGJ5IHRoZSBtYWluIHN0eWxlc2hlZXQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5NYWtlcyB0aGUgdGFzayBsaXN0IGFsbCBkZWxldGVkIHRhcmdldHMgZmlsZXMKLSAgICAgIGFuZCB0aGUgcmVhc29uIHdoeSB0aGV5IGdldCBkZWxldGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5NYWtlcyB0aGUgdGFzayBsaXN0IGFsbCBkZWxldGVkIHRhcmdldHMgZmlsZXMgYW5kIHRoZSByZWFzb24gd2h5IHRoZXkgZ2V0IGRlbGV0ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPlBhcmFtZXRlcnMgU3BlY2lmaWVkIGFzIE5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PnNvdXJjZXM8L2g0PgogCi08cD5UaGUgPGNvZGU+Jmx0O3NvdXJjZXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIGEKLTxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI3VuaW9uIj5VbmlvbjwvYT4gaW50byB3aGljaAotYXJiaXRyYXJ5IHJlc291cmNlIGNvbGxlY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIDxiPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9iPgorPHA+VGhlIDxjb2RlPiZsdDtzb3VyY2VzJmd0OzwvY29kZT4gZWxlbWVudCBpcyBhIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI3VuaW9uIj5VbmlvbjwvYT4KK2ludG8gd2hpY2ggYXJiaXRyYXJ5IHJlc291cmNlIGNvbGxlY3Rpb25zIGNhbiBiZSBuZXN0ZWQuIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+CiA8L3A+CiAKIDxoND5zcmNmaWxlc2V0PC9oND4KIAotPHA+Ci1UaGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQotaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gQWxsIGZpbGVzIGluY2x1ZGVkIGluCi10aGlzIGZpbGVzZXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IGFsbCBmaWxlcyBpbmNsdWRlZCBpbiBhbGwgb2YgdGhlCi08Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIGFuZCA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZWxpc3QmZ3Q7PC9jb2RlPgotZmlsZWxpc3RzLiAgTXVsdGlwbGUgPGNvZGU+Jmx0O3NyY2ZpbGVzZXQmZ3Q7PC9jb2RlPiBmaWxlc2V0cyBtYXkgYmUgc3BlY2lmaWVkLgotPC9wPgorPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBiZSBjb21wYXJlZAorYWdhaW5zdCBhbGwgZmlsZXMgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZSA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzCithbmQgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzLiAgTXVsdGlwbGUgPGNvZGU+Jmx0O3NyY2ZpbGVzZXQmZ3Q7PC9jb2RlPgorZmlsZXNldHMgbWF5IGJlIHNwZWNpZmllZC48L3A+CiAKIDxoND5zcmNmaWxlbGlzdDwvaDQ+CiAKLTxwPgotVGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZWxpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlTGlzdDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbgotdGhpcyBmaWxlbGlzdCB3aWxsIGJlIGNvbXBhcmVkIGFnYWluc3QgYWxsIGZpbGVzIGluY2x1ZGVkIGluIGFsbCBvZiB0aGUgCi08Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIGFuZCA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZWxpc3QmZ3Q7PC9jb2RlPgotZmlsZWxpc3RzLiAgTXVsdGlwbGUgPGNvZGU+Jmx0O3NyY2ZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzIG1heSBiZSBzcGVjaWZpZWQuCi08L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVMaXN0PC9hPi4gQWxsIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgZmlsZWxpc3Qgd2lsbCBiZQorY29tcGFyZWQgYWdhaW5zdCBhbGwgZmlsZXMgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZSA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzCithbmQgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzLiAgTXVsdGlwbGUgPGNvZGU+Jmx0O3NyY2ZpbGVsaXN0Jmd0OzwvY29kZT4KK2ZpbGVsaXN0cyBtYXkgYmUgc3BlY2lmaWVkLjwvcD4KIAogPGg0PnRhcmdldHM8L2g0PgogCi08cD5UaGUgPGNvZGU+Jmx0O3RhcmdldHMmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIGEKLTxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aDwvYT4gYW5kIHRodXMgY2FuCi1pbmNsdWRlIGFueSBmaWxlc3lzdGVtLWJhc2VkIHJlc291cmNlLiA8Yj5TaW5jZSBBbnQgMS43PC9iPgotPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKworPHA+VGhlIDxjb2RlPiZsdDt0YXJnZXRzJmd0OzwvY29kZT4gZWxlbWVudCBpcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aDwvYT4gYW5kIHRodXMgY2FuCitpbmNsdWRlIGFueSBmaWxlc3lzdGVtLWJhc2VkIHJlc291cmNlLjwvcD4KIAogPGg0PnRhcmdldGZpbGVzZXQ8L2g0PgogCi08cD4KLVRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3RhcmdldGZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiAgQWxsIGZpbGVzIGluY2x1ZGVkIGluCi10aGlzIGZpbGVzZXQgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IGFsbCBmaWxlcyBpbmNsdWRlZCBpbiBhbGwgb2YgdGhlCi08Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIGFuZCA8Y29kZT4mbHQ7c291cmNlZmlsZWxpc3QmZ3Q7PC9jb2RlPgotZmlsZWxpc3RzLCBhbmQgaWYgYW55IGFyZSBvbGRlciwgdGhleSBhcmUgYWxsIGRlbGV0ZWQuCi1NdWx0aXBsZSA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIG1heSBiZSBzcGVjaWZpZWQuCi08L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXRmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMKK2EgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBiZSBjb21wYXJlZAorYWdhaW5zdCBhbGwgZmlsZXMgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZSA8Y29kZT4mbHQ7c3JjZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzCithbmQgPGNvZGU+Jmx0O3NvdXJjZWZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzLCBhbmQgaWYgYW55IGFyZSBvbGRlciwgdGhleSBhcmUgYWxsIGRlbGV0ZWQuCitNdWx0aXBsZSA8Y29kZT4mbHQ7dGFyZ2V0ZmlsZXNldCZndDs8L2NvZGU+IGZpbGVzZXRzIG1heSBiZSBzcGVjaWZpZWQuPC9wPgogCiA8aDQ+dGFyZ2V0ZmlsZWxpc3Q8L2g0PgogCi08cD4KLVRoZSBuZXN0ZWQgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQotaHJlZj0iLi4vVHlwZXMvZmlsZWxpc3QuaHRtbCI+RmlsZUxpc3Q8L2E+LiAgQWxsIGZpbGVzIGluY2x1ZGVkIGluCi10aGlzIGZpbGVsaXN0IHdpbGwgYmUgY29tcGFyZWQgYWdhaW5zdCBhbGwgZmlsZXMgaW5jbHVkZWQgaW4gYWxsIG9mIHRoZQotPGNvZGU+Jmx0O3NyY2ZpbGVzZXQmZ3Q7PC9jb2RlPiBmaWxlc2V0cyBhbmQgPGNvZGU+Jmx0O3NvdXJjZWZpbGVsaXN0Jmd0OzwvY29kZT4KLWZpbGVsaXN0cywgYW5kIGlmIGFueSBhcmUgb2xkZXIsIHRoZXkgYXJlIGFsbCBkZWxldGVkLgotTXVsdGlwbGUgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzIG1heSBiZSBzcGVjaWZpZWQuCi08L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDt0YXJnZXRmaWxlbGlzdCZndDs8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVMaXN0PC9hPi4gIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVsaXN0IHdpbGwgYmUKK2NvbXBhcmVkIGFnYWluc3QgYWxsIGZpbGVzIGluY2x1ZGVkIGluIGFsbCBvZiB0aGUgPGNvZGU+Jmx0O3NyY2ZpbGVzZXQmZ3Q7PC9jb2RlPiBmaWxlc2V0cworYW5kIDxjb2RlPiZsdDtzb3VyY2VmaWxlbGlzdCZndDs8L2NvZGU+IGZpbGVsaXN0cywgYW5kIGlmIGFueSBhcmUgb2xkZXIsIHRoZXkgYXJlIGFsbCBkZWxldGVkLgorTXVsdGlwbGUgPGNvZGU+Jmx0O3RhcmdldGZpbGVsaXN0Jmd0OzwvY29kZT4gZmlsZWxpc3RzIG1heSBiZSBzcGVjaWZpZWQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+IDxwcmU+Ci0gICAgJmx0O2RlcGVuZHNldCZndDsKLSAgICAgICAmbHQ7c3JjZmlsZWxpc3QKLSAgICAgICAgICAgZGlyICAgPSAmcXVvdDske2R0ZC5kaXJ9JnF1b3Q7Ci0gICAgICAgICAgIGZpbGVzID0gJnF1b3Q7cGFwZXIuZHRkLGNvbW1vbi5kdGQmcXVvdDsvJmd0OwotICAgICAgICZsdDtzcmNmaWxlbGlzdAotICAgICAgICAgICBkaXIgICA9ICZxdW90OyR7eHNsLmRpcn0mcXVvdDsKLSAgICAgICAgICAgZmlsZXMgPSAmcXVvdDtjb21tb24ueHNsJnF1b3Q7LyZndDsKLSAgICAgICAmbHQ7c3JjZmlsZWxpc3QKLSAgICAgICAgICAgZGlyICAgPSAmcXVvdDske2Jhc2VkaXJ9JnF1b3Q7Ci0gICAgICAgICAgIGZpbGVzID0gJnF1b3Q7YnVpbGQueG1sJnF1b3Q7LyZndDsKLSAgICAgICAmbHQ7dGFyZ2V0ZmlsZXNldAotICAgICAgICAgICBkaXIgICAgICA9ICZxdW90OyR7b3V0cHV0LmRpcn0mcXVvdDsKLSAgICAgICAgICAgaW5jbHVkZXMgPSAmcXVvdDsqKi8qLmh0bWwmcXVvdDsvJmd0OwotICAgICZsdDsvZGVwZW5kc2V0Jmd0OyAgPC9wcmU+Ci08L2Jsb2NrcXVvdGU+CiAKLTxwPiAKLUluIHRoaXMgZXhhbXBsZSBkZXJpdmVkIEhUTUwgZmlsZXMgaW4gdGhlICR7b3V0cHV0LmRpcn0gZGlyZWN0b3J5IAotd2lsbCBiZSByZW1vdmVkIGlmIGFueSBhcmUgb3V0LW9mLWRhdGUgd2l0aCByZXNwZWN0IHRvOjwvcD4KKzxwPlJlbW92ZSBkZXJpdmVkIEhUTUwgZmlsZXMgaW4gdGhlICR7b3V0cHV0LmRpcn0gZGlyZWN0b3J5IGlmIHRoZXkgYXJlIG91dC1vZi1kYXRlIHdpdGggcmVzcGVjdAordG86PC9wPgogPG9sPgotPGxpPnRoZSBEVEQgb2YgdGhlaXIgc291cmNlIFhNTCBmaWxlczwvbGk+Ci08bGk+YSBjb21tb24gRFREIChpbXBvcnRlZCBieSB0aGUgbWFpbiBEVEQpPC9saT4KLTxsaT5hIHN1Ym9yZGluYXRlIFhTTFQgc3R5bGVzaGVldCAoaW1wb3J0ZWQgYnkgdGhlIG1haW4gc3R5bGVzaGVldCksIG9yPC9saT4KLTxsaT50aGUgYnVpbGRmaWxlPC9saT4KKyAgICA8bGk+dGhlIERURCBvZiB0aGVpciBzb3VyY2UgWE1MIGZpbGVzPC9saT4KKyAgICA8bGk+YSBjb21tb24gRFREIChpbXBvcnRlZCBieSB0aGUgbWFpbiBEVEQpPC9saT4KKyAgICA8bGk+YSBzdWJvcmRpbmF0ZSBYU0xUIHN0eWxlc2hlZXQgKGltcG9ydGVkIGJ5IHRoZSBtYWluIHN0eWxlc2hlZXQpLCBvcjwvbGk+CisgICAgPGxpPnRoZSBidWlsZGZpbGU8L2xpPgogPC9vbD4KKzxwcmU+CismbHQ7ZGVwZW5kc2V0Jmd0OworICAmbHQ7c3JjZmlsZWxpc3QKKyAgICAgIGRpciAgID0gJnF1b3Q7JHtkdGQuZGlyfSZxdW90OworICAgICAgZmlsZXMgPSAmcXVvdDtwYXBlci5kdGQsY29tbW9uLmR0ZCZxdW90Oy8mZ3Q7CisgICZsdDtzcmNmaWxlbGlzdAorICAgICAgZGlyICAgPSAmcXVvdDske3hzbC5kaXJ9JnF1b3Q7CisgICAgICBmaWxlcyA9ICZxdW90O2NvbW1vbi54c2wmcXVvdDsvJmd0OworICAmbHQ7c3JjZmlsZWxpc3QKKyAgICAgIGRpciAgID0gJnF1b3Q7JHtiYXNlZGlyfSZxdW90OworICAgICAgZmlsZXMgPSAmcXVvdDtidWlsZC54bWwmcXVvdDsvJmd0OworICAmbHQ7dGFyZ2V0ZmlsZXNldAorICAgICAgZGlyICAgICAgPSAmcXVvdDske291dHB1dC5kaXJ9JnF1b3Q7CisgICAgICBpbmNsdWRlcyA9ICZxdW90OyoqLyouaHRtbCZxdW90Oy8mZ3Q7CismbHQ7L2RlcGVuZHNldCZndDs8L3ByZT4KIAotPHA+Ci1JZiBhbnkgb2YgdGhlIHNvdXJjZXMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgZG9lcyBub3QgZXhpc3QsIGFsbAotdGFyZ2V0IGZpbGVzIHdpbGwgYWxzbyBiZSByZW1vdmVkLiAgVG8gaWdub3JlIG1pc3Npbmcgc291cmNlcyBpbnN0ZWFkLAotdXNlIGZpbGVzZXRzIGluc3RlYWQgb2YgZmlsZWxpc3RzIGZvciB0aGUgc291cmNlcy4KLTwvcD4KLQotCis8cD5JZiBhbnkgb2YgdGhlIHNvdXJjZXMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgZG9lcyBub3QgZXhpc3QsIGFsbCB0YXJnZXQgZmlsZXMgd2lsbCBhbHNvIGJlCityZW1vdmVkLiBUbyBpZ25vcmUgbWlzc2luZyBzb3VyY2VzIGluc3RlYWQsIHVzZSBmaWxlc2V0cyBpbnN0ZWFkIG9mIGZpbGVsaXN0cyBmb3IgdGhlIHNvdXJjZXMuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvZGlhZ25vc3RpY3MuaHRtbCBiL21hbnVhbC9UYXNrcy9kaWFnbm9zdGljcy5odG1sCmluZGV4IGNkYjE2OTMuLjY4ZDA4ZDEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9kaWFnbm9zdGljcy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9kaWFnbm9zdGljcy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzYgKzE1LDI4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5EaWFnbm9zdGljcyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJkaWFnbm9zdGljcyI+RGlhZ25vc3RpY3M8L2E+PC9oMj4KLTxoMz5EaWFnbm9zdGljczwvaDM+Ci08cD4KLVJ1bnMgQXBhY2hlIEFudCdzIDxjb2RlPi1kaWFnbm9zdGljczwvY29kZT4gY29kZSBpbnNpZGUgQW50IGl0c2VsZi4gVGhpcyBpcyBnb29kIGZvciAKLWRlYnVnZ2luZyBBbnQncyBjb25maWd1cmF0aW9uIHVuZGVyIGFuIElERS4gCi08Yj5TaW5jZSBBbnQgMS43LjA8L2I+Ci08L3A+Ci0KKzxoMiBpZD0iZGlhZ25vc3RpY3MiPkRpYWdub3N0aWNzPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5SdW5zIEFwYWNoZSBBbnQncyA8a2JkPi1kaWFnbm9zdGljczwva2JkPiBjb2RlIGluc2lkZSBBbnQgaXRzZWxmLiBUaGlzIGlzIGdvb2QgZm9yIGRlYnVnZ2luZworQW50J3MgY29uZmlndXJhdGlvbiB1bmRlciBhbiBJREUuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCis8cD5QcmludCBvdXQgdGhlIGN1cnJlbnQgZGlhZ25vc3RpY3MgZHVtcC48L3A+CiA8cHJlPgotICAgICZsdDt0YXJnZXQgbmFtZT0iZGlhZ25vc3RpY3MiIGRlc2NyaXB0aW9uPSJkaWFnbm9zdGljcyImZ3Q7Ci0gICAgICAgICZsdDtkaWFnbm9zdGljcy8mZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7Ci08L3ByZT4KLTxwPgotICAgIFByaW50cyBvdXQgdGhlIGN1cnJlbnQgZGlhZ25vc3RpY3MgZHVtcC4KLTwvcD4KLQorJmx0O3RhcmdldCBuYW1lPSJkaWFnbm9zdGljcyIgZGVzY3JpcHRpb249ImRpYWdub3N0aWNzIiZndDsKKyAgICAmbHQ7ZGlhZ25vc3RpY3MvJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9kaXJuYW1lLmh0bWwgYi9tYW51YWwvVGFza3MvZGlybmFtZS5odG1sCmluZGV4IDAzMjI3YjQuLjhkOTg3OWMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9kaXJuYW1lLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2Rpcm5hbWUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDYxICsxNSw1MSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RGlybmFtZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJlY2hvIj5EaXJuYW1lPC9hPjwvaDI+Cis8aDIgaWQ9ImVjaG8iPkRpcm5hbWU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPgotVGFzayB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgc3BlY2lmaWVkIGZpbGUuCi08L3A+Ci08cD4gCi1XaGVuIHRoaXMgdGFzayBleGVjdXRlcywgaXQgd2lsbCBzZXQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB0byB0aGUKLXZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSAob3IgZGlyZWN0b3J5KSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsCi10aGUgbGFzdCBwYXRoIGVsZW1lbnQuIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhIHBhdGggdGhhdCBlbmRzIGluIGEKLWZpbGVuYW1lLCB0aGUgZmlsZW5hbWUgd2lsbCBiZSBkcm9wcGVkLiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgaXMganVzdAotYSBmaWxlbmFtZSwgdGhlIGRpcmVjdG9yeSB3aWxsIGJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLTwvcD4KLSAgPHA+Ci0gICAgPGVtPk5vdGU6PC9lbT4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIFVOSVggZGlybmFtZSBjb21tYW5kLCB3aGljaCBpcwotICAgIGRlZmluZWQgYXMgInN0cmlwIG5vbi1kaXJlY3Rvcnkgc3VmZml4IGZyb20gZmlsZW5hbWUiLiAmbHQ7ZGlybmFtZSZndDsKLSAgICBkZXRlcm1pbmVzIHRoZSBmdWxsIGRpcmVjdG9yeSBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KLSAgPC9wPgorPHA+VGFzayB0byBkZXRlcm1pbmUgdGhlIGRpcmVjdG9yeSBwYXRoIG9mIGEgc3BlY2lmaWVkIGZpbGUuPC9wPgorPHA+V2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgc2V0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdG8gdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZQorKG9yIGRpcmVjdG9yeSkgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgbGFzdCBwYXRoIGVsZW1lbnQuIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBhIHBhdGggdGhhdAorZW5kcyBpbiBhIGZpbGVuYW1lLCB0aGUgZmlsZW5hbWUgd2lsbCBiZSBkcm9wcGVkLiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgaXMganVzdCBhIGZpbGVuYW1lLCB0aGUKK2RpcmVjdG9yeSB3aWxsIGJlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBVTklYIDxjb2RlPmRpcm5hbWU8L2NvZGU+IGNvbW1hbmQsIHdoaWNoIGlzCitkZWZpbmVkIGFzICJzdHJpcCBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tIGZpbGVuYW1lIi4gPGNvZGU+Jmx0O2Rpcm5hbWUmZ3Q7PC9jb2RlPiBkZXRlcm1pbmVzIHRoZQorZnVsbCBkaXJlY3RvcnkgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXRoIHRvIHRha2UgdGhlIGRpcm5hbWUgb2YuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgcGF0aCB0byB0YWtlIHRoZSBkaXJuYW1lIG9mLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0mcXVvdDthbnRmaWxlLmRpciZxdW90OyBmaWxlPSZxdW90OyR7YW50LmZpbGV9JnF1b3Q7LyZndDs8L3ByZT4KLXdpbGwgc2V0IDxjb2RlPmFudGZpbGUuZGlyPC9jb2RlPiB0byB0aGUgZGlyZWN0b3J5IHBhdGggZm9yCi08Y29kZT4ke2FudC5maWxlfTwvY29kZT4uCi08cHJlPiAgJmx0O2Rpcm5hbWUgcHJvcGVydHk9JnF1b3Q7Zm9vLmRpcm5hbWUmcXVvdDsgZmlsZT0mcXVvdDtmb28udHh0JnF1b3Q7LyZndDs8L3ByZT4KLXdpbGwgc2V0IDxjb2RlPmZvby5kaXJuYW1lPC9jb2RlPiB0byB0aGUgcHJvamVjdCdzIGJhc2VkaXIuPC9wPgogCis8cD5TZXQgPGNvZGU+YW50ZmlsZS5kaXI8L2NvZGU+IHRvIHRoZSBkaXJlY3RvcnkgcGF0aCBmb3IgPHNhbXA+JHthbnQuZmlsZX08L3NhbXA+LjwvcD4KKzxwcmU+Jmx0O2Rpcm5hbWUgcHJvcGVydHk9JnF1b3Q7YW50ZmlsZS5kaXImcXVvdDsgZmlsZT0mcXVvdDske2FudC5maWxlfSZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPlNldCA8Y29kZT5mb28uZGlybmFtZTwvY29kZT4gdG8gdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj4uPC9wPgorPHByZT4mbHQ7ZGlybmFtZSBwcm9wZXJ0eT0mcXVvdDtmb28uZGlybmFtZSZxdW90OyBmaWxlPSZxdW90O2Zvby50eHQmcXVvdDsvJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9lYXIuaHRtbCBiL21hbnVhbC9UYXNrcy9lYXIuaHRtbAppbmRleCBkZTRhOTYyLi44Mzk2YzZhIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZWFyLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2Vhci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjg4ICsxNSwyNTMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkVBUiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJlYXIiPkVhcjwvYT48L2gyPgorPGgyIGlkPSJlYXIiPkVhcjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+QW4gZXh0ZW5zaW9uIG9mIHRoZSA8YSBocmVmPSJqYXIuaHRtbCI+SmFyPC9hPiB0YXNrIHdpdGggc3BlY2lhbAotdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gYW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBhcmNoaXZlLjwvcD4KLTxwPihUaGUgRWFyIHRhc2sgaXMgYSBzaG9ydGN1dCBmb3Igc3BlY2lmeWluZyB0aGUgcGFydGljdWxhciBsYXlvdXQgb2YgYSBFQVIgZmlsZS4gCi1UaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KLWF0dHJpYnV0ZXMgb2YgemlwZmlsZXNldHMgaW4gYSBaaXAgb3IgSmFyIHRhc2suKTwvcD4KLTxwPlRoZSBleHRlbmRlZCB6aXBmaWxlc2V0IGVsZW1lbnQgZnJvbSB0aGUgemlwIHRhc2sgKHdpdGggYXR0cmlidXRlcyA8aT5wcmVmaXg8L2k+LCA8aT5mdWxscGF0aDwvaT4sIGFuZCA8aT5zcmM8L2k+KSBpcyBhdmFpbGFibGUgaW4gdGhlIEVhciB0YXNrLjwvcD4KKzxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iamFyLmh0bWwiPkphcjwvYT4gdGFzayB3aXRoIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZAorZW5kIHVwIGluIGFuIEVudGVycHJpc2UgQXBwbGljYXRpb24gYXJjaGl2ZS48L3A+Cis8cD4oVGhlIDxjb2RlPkVhcjwvY29kZT4gdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGxheW91dCBvZiBhIEVBUiBmaWxlLiAgVGhlCitzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIDx2YXI+cHJlZml4PC92YXI+IGFuZCA8dmFyPmZ1bGxwYXRoPC92YXI+IGF0dHJpYnV0ZXMgb2YKK3ppcGZpbGVzZXRzIGluIGEgPGNvZGU+WmlwPC9jb2RlPiBvciA8Y29kZT5KYXI8L2NvZGU+IHRhc2suKTwvcD4KKzxwPlRoZSBleHRlbmRlZCB6aXBmaWxlc2V0IGVsZW1lbnQgZnJvbSB0aGUgPGNvZGU+WmlwPC9jb2RlPiB0YXNrICh3aXRoCithdHRyaWJ1dGVzIDx2YXI+cHJlZml4PC92YXI+LCA8dmFyPmZ1bGxwYXRoPC92YXI+LCBhbmQgPHZhcj5zcmM8L3Zhcj4pIGlzIGF2YWlsYWJsZSBpbgordGhlIDxjb2RlPkVhcjwvY29kZT4gdGFzay48L3A+CiAKLTxwPjxiPlBsZWFzZSBub3RlIHRoYXQgdGhlIHppcCBmb3JtYXQgYWxsb3dzIG11bHRpcGxlIGZpbGVzIG9mIHRoZSBzYW1lCi1mdWxseS1xdWFsaWZpZWQgbmFtZSB0byBleGlzdCB3aXRoaW4gYSBzaW5nbGUgYXJjaGl2ZS4gIFRoaXMgaGFzIGJlZW4KLWRvY3VtZW50ZWQgYXMgY2F1c2luZyB2YXJpb3VzIHByb2JsZW1zIGZvciB1bnN1c3BlY3RpbmcgdXNlcnMuICBJZiB5b3Ugd2lzaAotdG8gYXZvaWQgdGhpcyBiZWhhdmlvciB5b3UgbXVzdCBzZXQgdGhlIDxjb2RlPmR1cGxpY2F0ZTwvY29kZT4gYXR0cmlidXRlCi10byBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIDxjb2RlPiZxdW90O2FkZCZxdW90OzwvY29kZT4uPC9iPjwvcD4KKzxwPjxzdHJvbmc+UGxlYXNlIG5vdGUgdGhhdCB0aGUgemlwIGZvcm1hdCBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgb2YgdGhlIHNhbWUgZnVsbHktcXVhbGlmaWVkIG5hbWUgdG8KK2V4aXN0IHdpdGhpbiBhIHNpbmdsZSBhcmNoaXZlLiAgVGhpcyBoYXMgYmVlbiBkb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IKK3Vuc3VzcGVjdGluZyB1c2Vycy4gIElmIHlvdSB3aXNoIHRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IG11c3Qgc2V0IHRoZSA8dmFyPmR1cGxpY2F0ZTwvdmFyPgorYXR0cmlidXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdCwgPHE+YWRkPC9xPi48L3N0cm9uZz48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIEVBUiBmaWxlIHRvIGNyZWF0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZD50aGUgRUFSIGZpbGUgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcHhtbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIHVzZSAoTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sKS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgdXBkYXRlIGlzIHNldCB0byB0cnVlPC90ZD4KKyAgICA8dGQ+YXBweG1sPC90ZD4KKyAgICA8dGQ+VGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB1c2UgKDxzYW1wPk1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbDwvc2FtcD4pLjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIDx2YXI+dXBkYXRlPC92YXI+IGlzIHNldCB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YmFzZWRpcjwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Tm90IG9ubHkgc3RvcmUgZGF0YSBidXQgYWxzbyBjb21wcmVzcyB0aGVtLAotICAgIGRlZmF1bHRzIHRvIHRydWUuICBVbmxlc3MgeW91IHNldCB0aGUgPGVtPmtlZXBjb21wcmVzc2lvbjwvZW0+Ci0gICAgYXR0cmlidXRlIHRvIGZhbHNlLCB0aGlzIHdpbGwgYXBwbHkgdG8gdGhlIGVudGlyZSBhcmNoaXZlLCBub3QKLSAgICBvbmx5IHRoZSBmaWxlcyB5b3UndmUgYWRkZWQgd2hpbGUgdXBkYXRpbmcuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y29tcHJlc3M8L3RkPgorICAgIDx0ZD5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0uICBVbmxlc3MgeW91IHNldCB0aGUgPHZhcj5rZWVwY29tcHJlc3Npb248L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4sIHRoaXMgd2lsbCBhcHBseSB0byB0aGUgZW50aXJlIGFyY2hpdmUsIG5vdCBvbmx5IHRoZSBmaWxlcyB5b3UndmUKKyAgICAgIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBjb21wcmVzc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZQotICAgIG5lc3RlZCA8ZW0+emlwZmlsZXNldDwvZW0+cyBvciB3aGlsZSB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAKLSAgICB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotICAgIDxlbT5jb21wcmVzczwvZW0+IGF0dHJpYnV0ZS4gIERlZmF1bHRzIGZhbHNlLiAgPGVtPlNpbmNlIEFwYWNoZSBBbnQKLSAgICAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmtlZXBjb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkPkZvciBlbnRyaWVzIGNvbWluZyBmcm9tIGV4aXN0aW5nIGFyY2hpdmVzIChsaWtlIG5lc3RlZCA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPnMgb3Igd2hpbGUKKyAgICB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAgdGhlIGNvbXByZXNzaW9uIGFzIGl0IGhhcyBiZWVuIG9yaWdpbmFsbHkgaW5zdGVhZCBvZiB1c2luZyB0aGUKKyAgICA8dmFyPmNvbXByZXNzPC92YXI+IGF0dHJpYnV0ZS4gIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMKLSAgICAgIGluc2lkZSB0aGUgYXJjaGl2ZS4gIERlZmF1bHRzIHRvIFVURjguIDxzdHJvbmc+SXQgaXMgbm90Ci0gICAgICByZWNvbW1lbmRlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZSBhcyB0aGUgY3JlYXRlZCBhcmNoaXZlIHdpbGwgbW9zdAotICAgICAgbGlrZWx5IGJlIHVucmVhZGFibGUgZm9yIEphdmEgb3RoZXJ3aXNlLjwvc3Ryb25nPgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBpbnNpZGUgdGhlIGFyY2hpdmUuIDxzdHJvbmc+SXQgaXMgbm90CisgICAgICByZWNvbW1lbmRlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZSBhcyB0aGUgY3JlYXRlZCBhcmNoaXZlIHdpbGwgbW9zdCBsaWtlbHkgYmUgdW5yZWFkYWJsZSBmb3IKKyAgICAgIEphdmEgb3RoZXJ3aXNlLjwvc3Ryb25nPiAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlIHppcAorICAgICAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5VVEY4PC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVzb25seTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9yZSBvbmx5IGZpbGUgZW50cmllcywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5maWxlc29ubHk8L3RkPgorICAgIDx0ZD5TdG9yZSBvbmx5IGZpbGUgZW50cmllcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsICg8cT4qKjwvcT4pPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCAoPHE+eWVzfG5vPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYW5pZmVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bWFuaWZlc3Q8L3RkPgorICAgIDx0ZD50aGUgbWFuaWZlc3QgZmlsZSB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc2V0bWFuaWZlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIE1hbmlmZXN0IGlzIGZvdW5kIGluIGEgemlwZmlsZXNldCBvciB6aXBncm91cGZpbGVzZXQgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7bWVyZ2UmcXVvdDssIGFuZCAmcXVvdDttZXJnZXdpdGhvdXRtYWluJnF1b3Q7LiAgJnF1b3Q7bWVyZ2UmcXVvdDsgd2lsbCBtZXJnZSBhbGwgb2YgdGhlIG1hbmlmZXN0cyB0b2dldGhlciwgYW5kIG1lcmdlIHRoaXMgaW50byBhbnkgb3RoZXIgc3BlY2lmaWVkIG1hbmlmZXN0cy4gICZxdW90O21lcmdld2l0aG91dG1haW4mcXVvdDsgbWVyZ2VzIGV2ZXJ5dGhpbmcgYnV0IHRoZSBNYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0cy4gIERlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7c2tpcCZxdW90Oy4KKyAgICA8dGQ+ZmlsZXNldG1hbmlmZXN0PC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBhIG1hbmlmZXN0IGZpbGUgaXMgZm91bmQgaW4gYSA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPgorICAgICAgb3IgPGNvZGU+emlwZ3JvdXBmaWxlc2V0PC9jb2RlPiBmaWxlLiAgVmFsaWQgdmFsdWVzIGFyZSA8cT5za2lwPC9xPiwgPHE+bWVyZ2U8L3E+LAorICAgICAgYW5kIDxxPm1lcmdld2l0aG91dG1haW48L3E+LiAgPHE+bWVyZ2U8L3E+IHdpbGwgbWVyZ2UgYWxsIG9mIHRoZSBtYW5pZmVzdHMgdG9nZXRoZXIsIGFuZCBtZXJnZQorICAgICAgdGhpcyBpbnRvIGFueSBvdGhlciBzcGVjaWZpZWQgbWFuaWZlc3RzLiAgPHE+bWVyZ2V3aXRob3V0bWFpbjwvcT4gbWVyZ2VzIGV2ZXJ5dGhpbmcgYnV0IHRoZQorICAgICAgTWFpbiBzZWN0aW9uIG9mIHRoZSBtYW5pZmVzdHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnNraXA8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aGVubWFuaWZlc3Rvbmx5PC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+ZmFpbDwvcT4sIDxxPnNraXA8L3E+LAorICAgIGFuZCA8cT5jcmVhdGU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5jcmVhdGU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tYW5pZmVzdGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCB0aGUgSkFSIG1hbmlmZXN0LCB3aGVuIGEgbWFuaWZlc3QgZmlsZSBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aW5kZXg8L3RkPgorICAgIDx0ZD53aGV0aGVyIHRvIGNyZWF0ZQorICAgICAgYW4gPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phci9qYXIuaHRtbCNKQVJfSW5kZXgiCisgICAgICB0YXJnZXQ9Il90b3AiPmluZGV4IGxpc3Q8L2E+IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4gIFRoaXMgaXMgYSBKREsgMS4zKyBzcGVjaWZpYyBmZWF0dXJlLgorICAgICAgVW5sZXNzIHlvdSBzcGVjaWZ5IGFkZGl0aW9uYWwgamFycyB3aXRoCisgICAgICBuZXN0ZWQgPGEgaHJlZj0iamFyLmh0bWwjaW5kZXhqYXJzIj48Y29kZT5pbmRleGphcnM8L2NvZGU+PC9hPiBlbGVtZW50cywgb25seSB0aGUgY29udGVudHMgb2YKKyAgICAgIHRoaXMgamFyIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGluZGV4LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmluZGV4TWV0YUluZjwvdGQ+CisgICAgPHRkPndoZXRoZXIgdG8gaW5jbHVkZSA8c2FtcD5NRVRBLUlORjwvc2FtcD4gYW5kIGl0cyBjaGlsZHJlbiBpbiB0aGUgaW5kZXguICBEb2Vzbid0IGhhdmUgYW55CisgICAgICBlZmZlY3QgaWYgPHZhcj5pbmRleDwvdmFyPiBpcyBmYWxzZS48YnIvPk9yYWNsZSdzIGphciBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHNraXAKKyAgICAgIHRoZSA8c2FtcD5NRVRBLUlORjwvc2FtcD4gZGlyZWN0b3J5IGFuZCBBbnQgZm9sbG93ZWQgdGhhdCBleGFtcGxlLiAgVGhlIGJlaGF2aW9yIGhhcyBiZWVuCisgICAgICBjaGFuZ2VkIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy00NDA4NTI2IiB0YXJnZXQ9Il90b3AiPkphdmEKKyAgICAgIDU8L2E+LiAgSW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBBbnQgZ2VuZXJhdGVkIGphcnMgb24gSmF2YSAxLjQgb3IgZWFybGllciwgQW50IHdpbGwKKyAgICAgIG5vdCBpbmNsdWRlIDxzYW1wPk1FVEEtSU5GPC9zYW1wPiB1bmxlc3MgZXhwbGljaXRseSBhc2tlZCB0by48YnIvPjxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dXBkYXRlPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZSB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmR1cGxpY2F0ZTwvdGQ+CisgICAgPHRkPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+YWRkPC9xPiwgPHE+cHJlc2VydmU8L3E+LAorICAgIGFuZCA8cT5mYWlsPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5hZGQ8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yb3VuZHVwPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIG9mCisgICAgICBzZWNvbmRzLjxici8+WmlwIGFyY2hpdmVzIHN0b3JlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpdGggYSBncmFudWxhcml0eSBvZiAyIHNlY29uZHMsIHNvCisgICAgICB0aGUgdGltZXMgd2lsbCBlaXRoZXIgYmUgcm91bmRlZCB1cCBvciBkb3duLiAgSWYgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0KKyAgICAgIG91dC1vZi1kYXRlIHdoZW4geW91IHJlcnVuIHRoZSB0YXNrLCBzbyB0aGUgZGVmYXVsdCBpcyB0byByb3VuZCB1cC4gIFJvdW5kaW5nIHVwIG1heSBsZWFkIHRvIGEKKyAgICAgIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIgYXJjaGl2ZSB0aGF0IHNlZW0gdG8gYmUgc2xpZ2h0bHkgbW9yZSByZWNlbnQKKyAgICAgIHRoYW4gcHJlY29tcGlsZWQgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLjxici8+PGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sZXZlbDwvdGQ+CisgICAgPHRkPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlCisgICAgZnJvbSA8cT4wPC9xPiAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gPHE+OTwvcT4gKG1heGltdW0gY29tcHJlc3Npb24vc2xvd2VzdCkuIDxlbT5TaW5jZSBBbnQKKyAgICAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcmVzZXJ2ZTBwZXJtaXNzaW9uczwvdGQ+CisgICAgPHRkPndoZW4gdXBkYXRpbmcgYW4gYXJjaGl2ZSBvciBhZGRpbmcgZW50cmllcyBmcm9tIGEgZGlmZmVyZW50IGFyY2hpdmUgQW50IHdpbGwgYXNzdW1lIHRoYXQgYQorICAgICAgVW5peCBwZXJtaXNzaW9ucyB2YWx1ZSBvZiAwIChub2JvZHkgaXMgYWxsb3dlZCB0byBkbyBhbnl0aGluZyB0byB0aGUgZmlsZS9kaXJlY3RvcnkpIG1lYW5zCisgICAgICB0aGF0IHRoZSBwZXJtaXNzaW9ucyBoYXZlbid0IGJlZW4gc3RvcmVkIGF0IGFsbCByYXRoZXIgdGhhbiByZWFsIHBlcm1pc3Npb25zIGFuZCB3aWxsIGluc3RlYWQKKyAgICAgIGFwcGx5IGl0cyBvd24gZGVmYXVsdCB2YWx1ZXMuPGJyLz4gIFNldCB0aGlzIGF0dHJpYnV0ZSB0byA8cT50cnVlPC9xPiBpZiB5b3UgcmVhbGx5IHdhbnQgdG8KKyAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBwZXJtaXNzaW9uIGZpZWxkLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVubWFuaWZlc3Rvbmx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssIGFuZCAmcXVvdDtjcmVhdGUmcXVvdDsuICBEZWZhdWx0IGlzICZxdW90O2NyZWF0ZSZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51c2VMYW5ndWFnZUVuY29kaW5nRmxhZzwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZSBlbmNvZGluZyBpcyBVVEYtOC4gIFRoaXMgc2V0dGluZyBkb2Vzbid0CisgICAgICBoYXZlIGFueSBlZmZlY3QgaWYgdGhlIGVuY29kaW5nIGlzIG5vdCBVVEYtOC4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ljxici8+U2VlIGFsc28KKyAgICAgIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUgemlwIHRhc2sgcGFnZTwvYT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCB0aGUgSkFSIG1hbmlmZXN0LCB3aGVuIGEgbWFuaWZlc3QgZmlsZSBpcyBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0gZW5jb2RpbmcuPC90ZD4KKyAgICA8dGQ+Y3JlYXRlVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjcmVhdGUgVW5pY29kZSBleHRyYSBmaWVsZHMgdG8gc3RvcmUgdGhlIGZpbGUgbmFtZXMgYSBzZWNvbmQgdGltZSBpbnNpZGUgdGhlCisgICAgICBlbnRyeSdzIG1ldGFkYXRhLjxici8+UG9zc2libGUgdmFsdWVzIGFyZSA8cT5uZXZlcjwvcT4sIDxxPmFsd2F5czwvcT4KKyAgICAgIGFuZCA8cT5ub3QtZW5jb2RlYWJsZTwvcT4gd2hpY2ggd2lsbCBvbmx5IGFkZCBVbmljb2RlIGV4dHJhIGZpZWxkcyBpZiB0aGUgZmlsZSBuYW1lIGNhbm5vdCBiZQorICAgICAgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uICA8YnIvPlNlZSBhbHNvCisgICAgICB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bmV2ZXI8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kZXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBjcmVhdGUgYW4gPEEKLSAgICBIUkVGPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjSkFSX0luZGV4Ij5pbmRleAotICAgIGxpc3Q8L0E+IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4gIFRoaXMgaXMgYSBKREsgMS4zKyBzcGVjaWZpYwotICAgIGZlYXR1cmUuICBVbmxlc3MgeW91IHNwZWNpZnkgYWRkaXRpb25hbCBqYXJzIHdpdGggbmVzdGVkIDxhCi0gICAgaHJlZj0iamFyLmh0bWwjaW5kZXhqYXJzIj48Y29kZT5pbmRleGphcnM8L2NvZGU+PC9hPiBlbGVtZW50cywgb25seSB0aGUKLSAgICBjb250ZW50cyBvZiB0aGlzIGphciB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBpbmRleC4gIERlZmF1bHRzIHRvCi0gICAgZmFsc2UuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmFsbGJhY2t0b1VURjg8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHVzZSBVVEYtOCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlmIGEKKyAgICAgIGZpbGUgbmFtZSBjYW5ub3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPGJyLz5TZWUKKyAgICAgIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGV4TWV0YUluZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGluY2x1ZGUgTUVUQS1JTkYgYW5kIGl0cyBjaGlsZHJlbiBpbgotICAgICAgdGhlIGluZGV4LiAgRG9lc24ndCBoYXZlIGFueSBlZmZlY3QgaWYgPGVtPmluZGV4PC9lbT4gaXMKLSAgICAgIGZhbHNlLjxici8+Ci0gICAgICBPcmFjbGUncyBqYXIgaW1wbGVtZW50YXRpb24gdXNlZCB0byBza2lwIHRoZSBNRVRBLUlORiBkaXJlY3RvcnkgYW5kCi0gICAgICBBbnQgZm9sbG93ZWQgdGhhdCBleGFtcGxlLiAgVGhlIGJlaGF2aW9yIGhhcyBiZWVuIGNoYW5nZWQgd2l0aAotICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy00NDA4NTI2Ij5KYXZhCi0gICAgICA1PC9hPi4gIEluIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggQW50IGdlbmVyYXRlZCBqYXJzIG9uCi0gICAgICBKYXZhIDEuNCBvciBlYXJsaWVyIEFudCB3aWxsIG5vdCBpbmNsdWRlIE1FVEEtSU5GIHVubGVzcwotICAgICAgZXhwbGljaXRseSBhc2tlZCB0by48YnIvPgotICAgICAgPGVtPkFudCAxLjguMDwvZW0+IC0gRGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bWVyZ2VDbGFzc1BhdGhBdHRyaWJ1dGVzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBtZXJnZSB0aGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4gYXR0cmlidXRlcyBmb3VuZCBpbiBkaWZmZXJlbnQgbWFuaWZlc3RzIChpZgorICAgICAgbWVyZ2luZyBtYW5pZmVzdHMpLiAgSWYgPHE+ZmFsc2U8L3E+LCBvbmx5IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGxhc3QgbWVyZ2VkIG1hbmlmZXN0IHdpbGwgYmUKKyAgICAgIHByZXNlcnZlZC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48YnIvPnVubGVzcyB5b3UgYWxzbyBzZXQgPHZhcj5mbGF0dGVuQXR0cmlidXRlczwvdmFyPgorICAgICAgdG8gPHE+dHJ1ZTwvcT4gdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0cyBjb250YWluaW5nIG11bHRpcGxlIDxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+CisgICAgICBhdHRyaWJ1dGVzIHdoaWNoIHZpb2xhdGVzIHRoZSBtYW5pZmVzdCBzcGVjaWZpY2F0aW9uLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZGF0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRlCi0gICAgICB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmxhdHRlbkF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIG1lcmdlIGF0dHJpYnV0ZXMgb2NjdXJyaW5nIG1vcmUgdGhhbiBvbmNlIGluIGEgc2VjdGlvbiAodGhpcyBjYW4gb25seSBoYXBwZW4gZm9yCisgICAgICB0aGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4gYXR0cmlidXRlKSBpbnRvIGEgc2luZ2xlIGF0dHJpYnV0ZS4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZHVwbGljYXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7YWRkJnF1b3Q7LCAmcXVvdDtwcmVzZXJ2ZSZxdW90OywgYW5kICZxdW90O2ZhaWwmcXVvdDsuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yb3VuZHVwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpbGwgYmUKLSAgICByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIG9mIHNlY29uZHMuPGJyPgotICAgIFppcCBhcmNoaXZlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YKLSAgICB0d28gc2Vjb25kcywgc28gdGhlIHRpbWVzIHdpbGwgZWl0aGVyIGJlIHJvdW5kZWQgdXAgb3IgZG93bi4gIElmCi0gICAgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0gb3V0LW9mLWRhdGUgd2hlbiB5b3UKLSAgICByZXJ1biB0aGUgdGFzaywgc28gdGhlIGRlZmF1bHQgaXMgdG8gcm91bmQgdXAuICBSb3VuZGluZyB1cCBtYXkKLSAgICBsZWFkIHRvIGEgZGlmZmVyZW50IHR5cGUgb2YgcHJvYmxlbXMgbGlrZSBKU1BzIGluc2lkZSBhIHdlYgotICAgIGFyY2hpdmUgdGhhdCBzZWVtIHRvIGJlIHNsaWdodGx5IG1vcmUgcmVjZW50IHRoYW4gcHJlY29tcGlsZWQKLSAgICBwYWdlcywgcmVuZGVyaW5nIHByZWNvbXBpbGF0aW9uIHVzZWxlc3MuPGJyPgotICAgIERlZmF1bHRzIHRvIHRydWUuICA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sZXZlbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Ob24tZGVmYXVsdCBsZXZlbCBhdCB3aGljaCBmaWxlIGNvbXByZXNzaW9uIHNob3VsZCBiZQotICAgIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gOQotICAgIChtYXhpbXVtIGNvbXByZXNzaW9uL3Nsb3dlc3QpLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmUwcGVybWlzc2lvbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbiB1cGRhdGluZyBhbiBhcmNoaXZlIG9yIGFkZGluZyBlbnRyaWVzIGZyb20gYQotICAgIGRpZmZlcmVudCBhcmNoaXZlIEFudCB3aWxsIGFzc3VtZSB0aGF0IGEgVW5peCBwZXJtaXNzaW9ucyB2YWx1ZSBvZgotICAgIDAgKG5vYm9keSBpcyBhbGxvd2VkIHRvIGRvIGFueXRoaW5nIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSkgbWVhbnMKLSAgICB0aGF0IHRoZSBwZXJtaXNzaW9ucyBoYXZlbid0IGJlZW4gc3RvcmVkIGF0IGFsbCByYXRoZXIgdGhhbiByZWFsCi0gICAgcGVybWlzc2lvbnMgYW5kIHdpbGwgaW5zdGVhZCBhcHBseSBpdHMgb3duIGRlZmF1bHQgdmFsdWVzLjxici8+Ci0gICAgU2V0IHRoaXMgYXR0cmlidXRlIHRvIHRydWUgaWYgeW91IHJlYWxseSB3YW50IHRvIHByZXNlcnZlIHRoZQotICAgICAgb3JpZ2luYWwgcGVybWlzc2lvbiBmaWVsZC48ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51c2VMYW5ndWFnZUVuY29kaW5nRmxhZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHNldCB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcgZmxhZyBpZiB0aGUKLSAgICAgIGVuY29kaW5nIGlzIFVURi04LiAgVGhpcyBzZXR0aW5nIGRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IGlmIHRoZQotICAgICAgZW5jb2RpbmcgaXMgbm90IFVURi04LgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3JlYXRlVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY3JlYXRlIHVuaWNvZGUgZXh0cmEgZmllbGRzIHRvIHN0b3JlCi0gICAgICB0aGUgZmlsZSBuYW1lcyBhIHNlY29uZCB0aW1lIGluc2lkZSB0aGUgZW50cnkncyBtZXRhZGF0YS4KLSAgICAgIDxicj5Qb3NzaWJsZSB2YWx1ZXMgYXJlICJuZXZlciIsICJhbHdheXMiIGFuZCAibm90LWVuY29kZWFibGUiCi0gICAgICB3aGljaCB3aWxsIG9ubHkgYWRkIFVuaWNvZGUgZXh0cmEgZmllbGRzIGlmIHRoZSBmaWxlIG5hbWUgY2Fubm90Ci0gICAgICBiZSBlbmNvZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJuZXZlciI8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWxsYmFja3RvVVRGODwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHVzZSBVVEYtOCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nCi0gICAgICBmbGFnIGluc3RlYWQgb2YgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpZiBhIGZpbGUgbmFtZSBjYW5ub3QgYmUKLSAgICAgIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZQotICAgICAgemlwIHRhc2sgcGFnZTwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tZXJnZUNsYXNzUGF0aEF0dHJpYnV0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBtZXJnZSB0aGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzIGZvdW5kCi0gICAgICBpbiBkaWZmZXJlbnQgbWFuaWZlc3RzIChpZiBtZXJnaW5nIG1hbmlmZXN0cykuICBJZiBmYWxzZSwgb25seQotICAgICAgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgbGFzdCBtZXJnZWQgbWFuaWZlc3Qgd2lsbCBiZSBwcmVzZXJ2ZWQuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPnVubGVzcyB5b3UgYWxzbyBzZXQgZmxhdHRlbkF0dHJpYnV0ZXMgdG8gdHJ1ZSB0aGlzIG1heQotICAgICAgcmVzdWx0IGluIG1hbmlmZXN0cyBjb250YWluaW5nIG11bHRpcGxlIENsYXNzLVBhdGggYXR0cmlidXRlcwotICAgICAgd2hpY2ggdmlvbGF0ZXMgdGhlIG1hbmlmZXN0IHNwZWNpZmljYXRpb24uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhdHRlbkF0dHJpYnV0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBtZXJnZSBhdHRyaWJ1dGVzIG9jY3VycmluZyBtb3JlIHRoYW4KLSAgICAgIG9uY2UgaW4gYSBzZWN0aW9uICh0aGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IgdGhlIENsYXNzLVBhdGgKLSAgICAgIGF0dHJpYnV0ZSkgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+emlwNjRNb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gdG8gdXNlIFppcDY0IGV4dGVuc2lvbnMgZm9yIGVudHJpZXMuICBUaGUKLSAgICAgIHBvc3NpYmxlIHZhbHVlcyBhcmUgIm5ldmVyIiwgImFsd2F5cyIgYW5kICJhcy1uZWVkZWQiLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjkuMTwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjemlwNjQiPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAibmV2ZXIiPC90ZD4KKyAgICA8dGQ+emlwNjRNb2RlPC90ZD4KKyAgICA8dGQ+V2hlbiB0byB1c2UgWmlwNjQgZXh0ZW5zaW9ucyBmb3IgZW50cmllcy4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgIGFyZSA8cT5uZXZlcjwvcT4sIDxxPmFsd2F5czwvcT4gYW5kIDxxPmFzLW5lZWRlZDwvcT4uICA8ZW0+U2luY2UgQW50IDEuOS4xPC9lbT4uPGJyLz5TZWUgYWxzbworICAgICAgdGhlIDxhIGhyZWY9InppcC5odG1sI3ppcDY0Ij5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5ldmVyPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+bWV0YWluZjwvaDQ+Ci08cD5UaGUgbmVzdGVkIDxjb2RlPm1ldGFpbmY8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAotZW5kIHVwIGluIHRoZSA8Y29kZT5NRVRBLUlORjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSBlYXIgZmlsZS4gSWYgdGhpcwotZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUgbmFtZWQgPGNvZGU+TUFOSUZFU1QuTUY8L2NvZGU+LCB0aGUgZmlsZSBpcwotaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPm1ldGFpbmY8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBlbmQgdXAgaW4KK3RoZSA8c2FtcD5NRVRBLUlORjwvc2FtcD4gZGlyZWN0b3J5IG9mIHRoZSBlYXIgZmlsZS4gSWYgdGhpcyBmaWxlc2V0IGluY2x1ZGVzIGEgZmlsZQorbmFtZWQgPHNhbXA+TUFOSUZFU1QuTUY8L3NhbXA+LCB0aGUgZmlsZSBpcyBpZ25vcmVkIGFuZCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nLjwvcD4KIAogPGg0Pm1hbmlmZXN0LCBpbmRleGphcnMsIHNlcnZpY2U8L2g0PgotVGhlc2UgYXJlIGluaGVyaXRlZCBmcm9tIDxhIGhyZWY9Imphci5odG1sIj4mbHQ7amFyJmd0OzwvYT4KKzxwPlRoZXNlIGFyZSBpbmhlcml0ZWQgZnJvbSA8YSBocmVmPSJqYXIuaHRtbCI+Jmx0O2phciZndDs8L2E+PC9wPgogCi08aDI+RXhhbXBsZTwvaDI+Cis8aDM+RXhhbXBsZTwvaDM+CiA8cHJlPgotICAgICZsdDtlYXIgZGVzdGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L215YXBwLmVhciZxdW90OyBhcHB4bWw9JnF1b3Q7JHtzcmMuZGlyfS9tZXRhZGF0YS9hcHBsaWNhdGlvbi54bWwmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5kaXJ9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyouamFyLCoud2FyJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2VhciZndDsKLTwvcHJlPgotCismbHQ7ZWFyIGRlc3RmaWxlPSZxdW90OyR7YnVpbGQuZGlyfS9teWFwcC5lYXImcXVvdDsgYXBweG1sPSZxdW90OyR7c3JjLmRpcn0vbWV0YWRhdGEvYXBwbGljYXRpb24ueG1sJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5kaXJ9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyouamFyLCoud2FyJnF1b3Q7LyZndDsKKyZsdDsvZWFyJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2VjaG8uaHRtbCBiL21hbnVhbC9UYXNrcy9lY2hvLmh0bWwKaW5kZXggYmNmODA0ZS4uODhhYWNkZSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2VjaG8uaHRtbAorKysgYi9tYW51YWwvVGFza3MvZWNoby5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTgwICsxNSwxNjAgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkVjaG8gVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZWNobyI+RWNobzwvYT48L2gyPgorPGgyIGlkPSJlY2hvIj5FY2hvPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5FY2hvZXMgYSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50IGxvZ2dlcnMgYW5kIGxpc3RlbmVycyB3aGljaAotbWVhbnMgPHR0PlN5c3RlbS5vdXQ8L3R0PiB1bmxlc3Mgb3ZlcnJpZGRlbi4gQSA8dHQ+bGV2ZWw8L3R0PgotY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggY29udHJvbHMgYXQgd2hhdCBsb2dnaW5nIGxldmVsIHRoZSBtZXNzYWdlIGlzCi1maWx0ZXJlZCBhdC4KLTxwPgotVGhlIHRhc2sgY2FuIGFsc28gZWNobyB0byBhIGZpbGUsIGluIHdoaWNoIGNhc2UgdGhlIG9wdGlvbiB0byBhcHBlbmQgcmF0aGVyCi10aGFuIG92ZXJ3cml0ZSB0aGUgZmlsZSBpcyBhdmFpbGFibGUsIGFuZCB0aGUgPHR0PmxldmVsPC90dD4gb3B0aW9uIGlzCi1pZ25vcmVkPC9wPgorPHA+RWNob2VzIGEgbWVzc2FnZSB0byB0aGUgY3VycmVudCBsb2dnZXJzIGFuZCBsaXN0ZW5lcnMgd2hpY2ggbWVhbnMgPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gdW5sZXNzCitvdmVycmlkZGVuLiBBIDx2YXI+bGV2ZWw8L3Zhcj4gY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggY29udHJvbHMgYXQgd2hhdCBsb2dnaW5nIGxldmVsIHRoZSBtZXNzYWdlIGlzCitmaWx0ZXJlZCBhdC48L3A+Cis8cD5UaGUgdGFzayBjYW4gYWxzbyBlY2hvIHRvIGEgZmlsZSwgaW4gd2hpY2ggY2FzZSB0aGUgb3B0aW9uIHRvIGFwcGVuZCByYXRoZXIgdGhhbiBvdmVyd3JpdGUgdGhlCitmaWxlIGlzIGF2YWlsYWJsZSwgYW5kIHRoZSA8dmFyPmxldmVsPC92YXI+IG9wdGlvbiBpcyBpZ25vcmVkPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tZXNzYWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBtZXNzYWdlIHRvIGVjaG8uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLiAgVGV4dCBtYXkgYWxzbyBiZSBpbmNsdWRlZCBpbiBhCi0gICAgICBjaGFyYWN0ZXIgc2VjdGlvbiB3aXRoaW4gdGhpcyBlbGVtZW50LiAgSWYgbmVpdGhlciBpcyBpbmNsdWRlZCBhIAotICAgICAgYmxhbmsgbGluZSB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlIG91dHB1dC48L3RkPgorICAgIDx0ZD5tZXNzYWdlPC90ZD4KKyAgICA8dGQ+dGhlIG1lc3NhZ2UgdG8gZWNoby48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYSBibGFuayBsaW5lIHVubGVzcyB0ZXh0IGlzIGluY2x1ZGVkIGluIGEgY2hhcmFjdGVyIHNlY3Rpb24gd2l0aGluIHRoaXMKKyAgICAgIGVsZW1lbnQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIHdyaXRlIHRoZSBtZXNzYWdlIHRvLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5PcHRpb25hbGx5IG9uZSBvZiB0aGVzZSBtYXkgYmUgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD50aGUgZmlsZSB0byB3cml0ZSB0aGUgbWVzc2FnZSB0by48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5Obzsgb25seSBvbmUgb2YgdGhlc2UgbWF5IGJlIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5SZXNvdXJjZTwvYT4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPnRoZSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+UmVzb3VyY2U8L2E+CiAgICAgICB0byB3cml0ZSB0aGUgbWVzc2FnZSB0byAoc2VlIDxhIGhyZWY9Ii4uL2RldmVsb3AuaHRtbCNzZXQtbWFnaWMiPm5vdGU8L2E+KS4KLSAgICAgIDxiPlNpbmNlIEFwYWNoZSBBbnQgMS44PC9iPjwvdGQ+CisgICAgICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjg8L2VtPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZSAob3IKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvL2phdmEvaW8vRmlsZVdyaXRlci5odG1sI0ZpbGVXcml0ZXIlMjhqYXZhLmxhbmcuU3RyaW5nLCUyMGJvb2xlYW4lMjkiIHRhcmdldD0iX2JsYW5rIj4KLSAgICAgIG9wZW4gYSBuZXcgZmlsZSAvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlPC9hPik/IERlZmF1bHQgPGk+ZmFsc2U8L2k+LgorICAgIDx0ZD5hcHBlbmQ8L3RkPgorICAgIDx0ZD5BcHBlbmQgdG8gYW4gZXhpc3RpbmcgZmlsZQorICAgICAgKG9yIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpLy9qYXZhL2lvL0ZpbGVXcml0ZXIuaHRtbCNGaWxlV3JpdGVyLWphdmEubGFuZy5TdHJpbmctYm9vbGVhbi0iCisgICAgICB0YXJnZXQ9Il90b3AiPiBvcGVuIGEgbmV3IGZpbGUgLyBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZTwvYT4pPwogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgaWdub3JlZCB1bmxlc3MgPGk+b3V0cHV0PC9pPiBpbmRpY2F0ZXMgYQotICAgICAgZmlsZXN5c3RlbSBkZXN0aW5hdGlvbi48L3RkPgorICAgIDx0ZD5ObzsgaWdub3JlZCB1bmxlc3MgPHZhcj5vdXRwdXQ8L3Zhcj4gaW5kaWNhdGVzIGEgZmlsZXN5c3RlbSBkZXN0aW5hdGlvbiwgZGVmYXVsdAorICAgICAgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGV2ZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbCB0aGUgbGV2ZWwgYXQgd2hpY2ggdGhpcyBtZXNzYWdlIGlzIHJlcG9ydGVkLgotICAgICAgICAgICAgT25lIG9mICJlcnJvciIsICJ3YXJuaW5nIiwgImluZm8iLCAidmVyYm9zZSIsICJkZWJ1ZyIgKGRlY3JlYXNpbmcgb3JkZXIpPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAid2FybmluZyIuPC90ZD4KKyAgICA8dGQ+bGV2ZWw8L3RkPgorICAgIDx0ZD5Db250cm9sIHRoZSBsZXZlbCBhdCB3aGljaCB0aGlzIG1lc3NhZ2UgaXMgcmVwb3J0ZWQuICBPbmUKKyAgICAgIG9mIDxxPmVycm9yPC9xPiwgPHE+d2FybmluZzwvcT4sIDxxPmluZm88L3E+LCA8cT52ZXJib3NlPC9xPiwgPHE+ZGVidWc8L3E+IChkZWNyZWFzaW5nCisgICAgICBvcmRlcik8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT53YXJuaW5nPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nIHRvIHVzZSwgZGVmYXVsdCBpcyAiIjsgdGhlIGxvY2FsIHN5c3RlbSBlbmNvZGluZy4gPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+ZW5jb2RpbmcgdG8gdXNlLiA8ZW0+c2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24KLSAgICAgIGZpbGVzLiAgPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgPHRkPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24gZmlsZXMuICA8ZW0+c2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPgotJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtIZWxsbywgd29ybGQmcXVvdDsvJmd0OwotPC9wcmU+Ci08cHJlPgotJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtFbWJlZCBhIGxpbmUgYnJlYWs6JHtsaW5lLnNlcGFyYXRvcn0mcXVvdDsvJmd0OwotPC9wcmU+Ci08cHJlPgotJmx0O2VjaG8mZ3Q7RW1iZWQgYW5vdGhlcjoke2xpbmUuc2VwYXJhdG9yfSZsdDsvZWNobyZndDsKLTwvcHJlPgotPHByZT4KLSZsdDtlY2hvJmd0O1RoaXMgaXMgYSBsb25nZXIgbWVzc2FnZSBzdHJldGNoaW5nIG92ZXIKKworPHA+QmFzaWMgdXNlOjwvcD4KKzxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtIZWxsbywgd29ybGQmcXVvdDsvJmd0OzwvcHJlPgorPHByZT4mbHQ7ZWNobyBtZXNzYWdlPSZxdW90O0VtYmVkIGEgbGluZSBicmVhazoke2xpbmUuc2VwYXJhdG9yfSZxdW90Oy8mZ3Q7PC9wcmU+Cis8cHJlPiZsdDtlY2hvJmd0O0VtYmVkIGFub3RoZXI6JHtsaW5lLnNlcGFyYXRvcn0mbHQ7L2VjaG8mZ3Q7PC9wcmU+Cis8cHJlPiZsdDtlY2hvJmd0O1RoaXMgaXMgYSBsb25nZXIgbWVzc2FnZSBzdHJldGNoaW5nIG92ZXIKIHR3byBsaW5lcy4KLSZsdDsvZWNobyZndDsKLTwvcHJlPgotPHByZT4KLSZsdDtlY2hvJmd0OworJmx0Oy9lY2hvJmd0OzwvcHJlPgorCis8cD5UaGUgbmV3bGluZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIDxjb2RlPiZsdDtlY2hvJmd0OzwvY29kZT4gdGFnIGlzIHBhcnQgb2YgdGhlCitvdXRwdXQuIE5ld2xpbmVzIGluIGNoYXJhY3RlciBkYXRhIHdpdGhpbiB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50IGFyZSBub3QgZGlzY2FyZGVkIGJ5IFhNTAorcGFyc2Vycy48YnIvPlNlZSA8YSBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIveG1sLyNzZWMtbGluZS1lbmRzIiB0YXJnZXQ9Il90b3AiPlczQyBSZWNvbW1lbmRhdGlvbgorMjYgTm92ZW1iZXIgMjAwOCAvIEVuZCBvZiBMaW5lIGhhbmRsaW5nPC9hPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KKzxwcmU+Jmx0O2VjaG8mZ3Q7CiBUaGlzIGlzIGEgbG9uZ2VyIG1lc3NhZ2Ugc3RyZXRjaGluZyBvdmVyCiB0aHJlZSBsaW5lczsgdGhlIGZpcnN0IGxpbmUgaXMgYSBibGFuawotJmx0Oy9lY2hvJmd0OwotPC9wcmU+Ci1UaGUgbmV3bGluZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlICZsdDtlY2hvJmd0OyB0YWcgd2lsbCBiZSBwYXJ0IG9mIHRoZSBvdXRwdXQuPGJyPgotTmV3bGluZXMgaW4gY2hhcmFjdGVyIGRhdGEgd2l0aGluIHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgYXJlIG5vdCBkaXNjYXJkZWQgYnkgWE1MIHBhcnNlcnMuPGJyPgotU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLXhtbC0yMDA0MDIwNC8jc2VjLWxpbmUtZW5kcyI+Ci1XM0MgUmVjb21tZW5kYXRpb24gMDQgRmVicnVhcnkgMjAwNCAvIEVuZCBvZiBMaW5lIGhhbmRsaW5nCi08L2E+IGZvciBtb3JlIGRldGFpbHMuCismbHQ7L2VjaG8mZ3Q7PC9wcmU+CiAKKzxwPkEgbWVzc2FnZSB3aGljaCBvbmx5IGFwcGVhcnMgaW4gPGtiZD4tZGVidWc8L2tiZD4gbW9kZS48L3A+CiA8cHJlPiZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7RGVsZXRpbmcgZHJpdmUgQzomcXVvdDsgbGV2ZWw9JnF1b3Q7ZGVidWcmcXVvdDsvJmd0OzwvcHJlPgotQSBtZXNzYWdlIHdoaWNoIG9ubHkgYXBwZWFycyBpbiA8dHQ+LWRlYnVnPC90dD4gbW9kZS4KKworPHA+QSBtZXNzYWdlIHdoaWNoIGFwcGVhcnMgZXZlbiBpbiA8a2JkPi1xdWlldDwva2JkPiBtb2RlLjwvcD4KIDxwcmU+Jmx0O2VjaG8gbGV2ZWw9JnF1b3Q7ZXJyb3ImcXVvdDsmZ3Q7CiBJbW1pbmVudCBmYWlsdXJlIGluIHRoZSBhbnRpbWF0dGVyIGNvbnRhaW5tZW50IGZhY2lsaXR5LgogUGxlYXNlIHdpdGhkcmF3IHRvIHNhZmUgbG9jYXRpb24gYXQgbGVhc3QgNTBrbSBhd2F5LgotJmx0Oy9lY2hvJmd0OwotPC9wcmU+Ci1BIG1lc3NhZ2Ugd2hpY2ggYXBwZWFycyBldmVuIGluIDx0dD4tcXVpZXQ8L3R0PiBtb2RlLgorJmx0Oy9lY2hvJmd0OzwvcHJlPgogCis8cD5HZW5lcmF0ZSBhIHNoZWxsIHNjcmlwdCBieSBlY2hvaW5nIHRvIGEgZmlsZS4gIE5vdGUgdGhlIHVzZSBvZiBhIGRvdWJsZSA8cT4kPC9xPiBzeW1ib2wgdG8gc3RvcAorQW50IGZpbHRlcmluZyBvdXQgdGhlIHNpbmdsZSA8cT4kPC9xPiBkdXJpbmcgdmFyaWFibGUgZXhwYW5zaW9uLjwvcD4KIDxwcmU+Jmx0O2VjaG8gZmlsZT0icnVubmVyLmNzaCIgYXBwZW5kPSJmYWxzZSImZ3Q7I1whL2Jpbi90Y3NoCiBqYXZhLTEuMy4xIC1teDEwMjRtICR7cHJvamVjdC5lbnRyeXBvaW50fSAkJCoKICZsdDsvZWNobyZndDs8L3ByZT4KLUdlbmVyYXRlIGEgc2hlbGwgc2NyaXB0IGJ5IGVjaG9pbmcgdG8gYSBmaWxlLgotTm90ZSB0aGUgdXNlIG9mIGEgZG91YmxlICQgc3ltYm9sIHRvIHN0b3AgQW50Ci1maWx0ZXJpbmcgb3V0IHRoZSBzaW5nbGUgJCBkdXJpbmcgdmFyaWFibGUgZXhwYW5zaW9uCiAKLTxwPkRlcGVuZGluZyBvbiB0aGUgbG9nbGV2ZWwgQW50IHJ1bnMsIG1lc3NhZ2VzIGFyZSBwcmludCBvdXQgb3Igc2lsZW50bHkKLWlnbm9yZWQ6Cis8cD5EZXBlbmRpbmcgb24gdGhlIGxvZyBsZXZlbCBBbnQgcnVucyBhdCwgbWVzc2FnZXMgYXJlIHByaW50IG91dCBvciBzaWxlbnRseSBpZ25vcmVkOjwvcD4KIDx0YWJsZT4KIDx0cj4KLSAgPHRoPkFudC1TdGF0ZW1lbnQ8L3RoPgotICA8dGg+LXF1aWV0LCAtcTwvdGg+Ci0gIDx0aD48aT5ubyBzdGF0ZW1lbnQ8L3RoPgotICA8dGg+LXZlcmJvc2UsIC12PC90aD4KLSAgPHRoPi1kZWJ1ZywgLWQ8L3RoPgorICA8dGggc2NvcGU9ImNvbCI+QW50IGNvbW1hbmQgbGluZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj48a2JkPi1xdWlldDwva2JkPiwgPGtiZD4tcTwva2JkPjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj48ZW0+bm8gc3dpdGNoPC9lbT48L3RoPgorICA8dGggc2NvcGU9ImNvbCI+PGtiZD4tdmVyYm9zZTwva2JkPiwgPGtiZD4tdjwva2JkPjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj48a2JkPi1kZWJ1Zzwva2JkPiwgPGtiZD4tZDwva2JkPjwvdGg+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT4mbHQ7ZWNobyBtZXNzYWdlPSJUaGlzIGlzIGVycm9yIG1lc3NhZ2UuIiBsZXZlbD0iZXJyb3IiIC8mZ3Q7PC9wcmU+PC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyBlcnJvciBtZXNzYWdlLiIgbGV2ZWw9ImVycm9yIi8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgd2FybmluZyBtZXNzYWdlLiIgLyZndDs8L3ByZT48L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorICA8dGQ+PHByZT4mbHQ7ZWNobyBtZXNzYWdlPSJUaGlzIGlzIHdhcm5pbmcgbWVzc2FnZS4iLyZndDs8L3ByZT48L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyB3YXJuaW5nIG1lc3NhZ2UuIiBsZXZlbD0id2FybmluZyIgLyZndDs8L3ByZT48L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorICA8dGQ+PHByZT4mbHQ7ZWNobyBtZXNzYWdlPSJUaGlzIGlzIHdhcm5pbmcgbWVzc2FnZS4iIGxldmVsPSJ3YXJuaW5nIi8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KKyAgPHRkPm9rPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgaW5mbyBtZXNzYWdlLiIgbGV2ZWw9ImluZm8iIC8mZ3Q7PC9wcmU+PC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm5vdCBsb2dnZWQ8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+b2s8L3RkPgorICA8dGQ+PHByZT4mbHQ7ZWNobyBtZXNzYWdlPSJUaGlzIGlzIGluZm8gbWVzc2FnZS4iIGxldmVsPSJpbmZvIi8mZ3Q7PC9wcmU+PC90ZD4KKyAgPHRkPm5vdCBsb2dnZWQ8L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyB2ZXJib3NlIG1lc3NhZ2UuIiBsZXZlbD0idmVyYm9zZSIgLyZndDs8L3ByZT48L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+bm90IGxvZ2dlZDwvdGQ+Ci0gIDx0ZCBhbGlnbj0iY2VudGVyIj5ub3QgbG9nZ2VkPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm9rPC90ZD4KKyAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyB2ZXJib3NlIG1lc3NhZ2UuIiBsZXZlbD0idmVyYm9zZSIvJmd0OzwvcHJlPjwvdGQ+CisgIDx0ZD5ub3QgbG9nZ2VkPC90ZD4KKyAgPHRkPm5vdCBsb2dnZWQ8L3RkPgorICA8dGQ+b2s8L3RkPgorICA8dGQ+b2s8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+Jmx0O2VjaG8gbWVzc2FnZT0iVGhpcyBpcyBkZWJ1ZyBtZXNzYWdlLiIgbGV2ZWw9ImRlYnVnIiAvJmd0OzwvcHJlPjwvdGQ+Ci0gIDx0ZCBhbGlnbj0iY2VudGVyIj5ub3QgbG9nZ2VkPC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiPm5vdCBsb2dnZWQ8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+bm90IGxvZ2dlZDwvdGQ+Ci0gIDx0ZCBhbGlnbj0iY2VudGVyIj5vazwvdGQ+CisgIDx0ZD48cHJlPiZsdDtlY2hvIG1lc3NhZ2U9IlRoaXMgaXMgZGVidWcgbWVzc2FnZS4iIGxldmVsPSJkZWJ1ZyIvJmd0OzwvcHJlPjwvdGQ+CisgIDx0ZD5ub3QgbG9nZ2VkPC90ZD4KKyAgPHRkPm5vdCBsb2dnZWQ8L3RkPgorICA8dGQ+bm90IGxvZ2dlZDwvdGQ+CisgIDx0ZD5vazwvdGQ+CiA8L3RyPgogPC90YWJsZT4KIAotCi0KLQotCi0KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9lY2hvcHJvcGVydGllcy5odG1sIGIvbWFudWFsL1Rhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwKaW5kZXggZWMxZTRiNC4uZWRmMjk4MSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw3MyArMTUsNjIgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkVjaG9wcm9wZXJ0aWVzIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImVjaG9wcm9wZXJ0aWVzIj5lY2hvcHJvcGVydGllczwvYT48L2gyPgorPGgyIGlkPSJlY2hvcHJvcGVydGllcyI+ZWNob3Byb3BlcnRpZXM8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+RGlzcGxheXMgYWxsIHRoZSBjdXJyZW50IHByb3BlcnRpZXMgKG9yIGEgc3Vic2V0IG9mIHRoZW0gc3BlY2lmaWVkCi1ieSBhIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHlzZXQmZ3Q7PC9jb2RlPikgaW4gdGhlIHByb2plY3QuICBUaGUKLW91dHB1dCBjYW4gYmUgc2VudCB0byBhIGZpbGUgaWYgZGVzaXJlZC4gIFRoaXMgdGFzayBjYW4gYmUgdXNlZCBhcyBhCi1zb21ld2hhdCBjb250cml2ZWQgbWVhbnMgb2YgcmV0dXJuaW5nIGRhdGEgZnJvbSBhbgotPHR0PiZsdDthbnQmZ3Q7PC90dD4gaW52b2NhdGlvbiwgYnV0IGlzIHJlYWxseSBmb3IgZGVidWdnaW5nIGJ1aWxkCis8cD5EaXNwbGF5cyBhbGwgdGhlIGN1cnJlbnQgcHJvcGVydGllcyAob3IgYSBzdWJzZXQgb2YgdGhlbSBzcGVjaWZpZWQgYnkgYQorbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eXNldCZndDs8L2NvZGU+KSBpbiB0aGUgcHJvamVjdC4gIFRoZSBvdXRwdXQgY2FuIGJlIHNlbnQgdG8gYSBmaWxlIGlmCitkZXNpcmVkLiAgVGhpcyB0YXNrIGNhbiBiZSB1c2VkIGFzIGEgc29tZXdoYXQgY29udHJpdmVkIG1lYW5zIG9mIHJldHVybmluZyBkYXRhIGZyb20gYW4KKzxrYmQ+YW50PC9rYmQ+IGludm9jYXRpb24sIGJ1dCBpcyByZWFsbHkgZm9yIGRlYnVnZ2luZyBidWlsZAogZmlsZXMuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNwZWNpZmllZCwgdGhlIHZhbHVlIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUKLSAgICBmaWxlIHRvIHNlbmQgdGhlIG91dHB1dCBvZiB0aGUgc3RhdGVtZW50IHRvLiAgVGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZQotICAgIGlzIGNvbXBhdGlibGUgZm9yIGxvYWRpbmcgYnkgYW55IEphdmEgYXBwbGljYXRpb24gYXMgYSBwcm9wZXJ0eSBmaWxlLgotICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIG91dHB1dCB3aWxsIGdvIHRvIHRoZSBBcGFjaGUgQW50IGxvZy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPklmIHNwZWNpZmllZCwgdGhlIHZhbHVlIGluZGljYXRlcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBzZW5kIHRoZSBvdXRwdXQgb2YgdGhlIHN0YXRlbWVudAorICAgICAgdG8uICBUaGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlIGlzIGNvbXBhdGlibGUgZm9yIGxvYWRpbmcgYnkgYW55IEphdmEgYXBwbGljYXRpb24gYXMgYSBwcm9wZXJ0eQorICAgICAgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgb3V0cHV0IHRvIHRoZSBsb2c8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIGEgcHJlZml4IHdoaWNoIGlzIHVzZWQgdG8gZmlsdGVyIHRoZSBwcm9wZXJ0aWVzCi0gICAgICAgIG9ubHkgdGhvc2UgcHJvcGVydGllcyBzdGFydGluZyB3aXRoIHRoaXMgcHJlZml4IHdpbGwgYmUgZWNob2VkLgotICAgICAgICA8UD4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5hIHByZWZpeCB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcHJvcGVydGllczogb25seSBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggdGhpcworICAgICAgcHJlZml4IHdpbGwgYmUgZWNob2VkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVnZXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIGlzIHVzZWQgdG8gZmlsdGVyIHRoZQotICAgICAgICBwcm9wZXJ0aWVzCi0gICAgICAgIG9ubHkgdGhvc2UgcHJvcGVydGllcyB3aG9zZSBuYW1lcyBtYXRjaCBpdCB3aWxsIGJlIGVjaG9lZC4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICA8L3RyPiAgIAotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5CeSBkZWZhdWx0LCB0aGUgImZhaWxvbmVycm9yIiBhdHRyaWJ1dGUgaXMgZW5hYmxlZC4KLSAgICBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0aGUgcHJvcGVydGllcyB0byBhIGZpbGUsIGFuZCB0aGlzCi0gICAgYXR0cmlidXRlIGlzIGVuYWJsZWQsIHRoZW4gYSBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biwgY2F1c2luZyB0aGUKLSAgICBidWlsZCB0byBmYWlsLiAgSWYgZGlzYWJsZWQsIHRoZW4gSU8gZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWQgYXMgYSBsb2cKLSAgICBzdGF0ZW1lbnQsIGFuZCB0aGUgYnVpbGQgd2lsbCBjb250aW51ZSB3aXRob3V0IGZhaWx1cmUgZnJvbSB0aGlzIHRhc2suPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVnZXg8L3RkPgorICAgIDx0ZD5hIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB1c2VkIHRvIGZpbHRlciB0aGUgcHJvcGVydGllczogb25seSB0aG9zZSBwcm9wZXJ0aWVzIHdob3NlCisgICAgICBuYW1lcyBtYXRjaCBpdCB3aWxsIGJlIGVjaG9lZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgPGNvZGU+dGV4dDwvY29kZT4gb3IgPGNvZGU+eG1sPC9jb2RlPi4KLSAgICBEZXRlcm1pbmVzIHRoZSBvdXRwdXQgZm9ybWF0LiAgRGVmYXVsdHMgdG8gPGNvZGU+dGV4dDwvY29kZT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5JZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0aGUgcHJvcGVydGllcyB0byBhIGZpbGUsIGFuZCB0aGlzIGF0dHJpYnV0ZSBpcyBlbmFibGVkLAorICAgICAgdGhlbiBhIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPiB3aWxsIGJlIHRocm93biwgY2F1c2luZyB0aGUgYnVpbGQgdG8gZmFpbC4gIElmIGRpc2FibGVkLAorICAgICAgdGhlbiBJTyBlcnJvcnMgd2lsbCBiZSByZXBvcnRlZCBhcyBhIGxvZyBzdGF0ZW1lbnQsIGFuZCB0aGUgYnVpbGQgd2lsbCBjb250aW51ZSB3aXRob3V0CisgICAgICBmYWlsdXJlIGZyb20gdGhpcyB0YXNrLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mb3JtYXQ8L3RkPgorICAgIDx0ZD5PbmUgb2YgPHE+dGV4dDwvcT4gb3IgPHE+eG1sPC9xPi4gIERldGVybWluZXMgdGhlIG91dHB1dCBmb3JtYXQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRleHQ8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKQEAgLTg4LDU5ICs3OCw0NyBAQAogCiA8aDQ+cHJvcGVydHlzZXQ8L2g0PgogCi08cD5Zb3UgY2FuIHNwZWNpZnkgc3Vic2V0cyBvZiBwcm9wZXJ0aWVzIHRvIGJlIGVjaG9lZCB3aXRoIDxhCi1ocmVmPSIuLi9UeXBlcy9wcm9wZXJ0eXNldC5odG1sIj5wcm9wZXJ0eXNldDwvYT5zLiBVc2luZwotPHR0PnByb3BlcnR5c2V0PC90dD5zIGdpdmVzIG1vcmUgY29udHJvbCBvbiB3aGljaCBwcm9wZXJ0aWVzIHdpbGwgYmUKLXBpY2tlZCB1cC4gVGhlIGF0dHJpYnV0ZXMgPHR0PnByZWZpeDwvdHQ+IGFuZCA8dHQ+cmVnZXg8L3R0PiBhcmUganVzdAotc2hvcnRjdXRzIHRoYXQgdXNlIDx0dD5wcm9wZXJ0eXNldDwvdHQ+cyBpbnRlcm5hbGx5LgotPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorPHA+WW91IGNhbiBzcGVjaWZ5IHN1YnNldHMgb2YgcHJvcGVydGllcyB0byBiZSBlY2hvZWQKK3dpdGggPGEgaHJlZj0iLi4vVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+cHJvcGVydHlzZXQ8L2E+cy4gVXNpbmcgPGNvZGU+cHJvcGVydHlzZXQ8L2NvZGU+cyBnaXZlcworbW9yZSBjb250cm9sIG9uIHdoaWNoIHByb3BlcnRpZXMgd2lsbCBiZSBwaWNrZWQgdXAuIFRoZSBhdHRyaWJ1dGVzIDx2YXI+cHJlZml4PC92YXI+CithbmQgPHZhcj5yZWdleDwvdmFyPiBhcmUganVzdCBzaG9ydGN1dHMgdGhhdCB1c2UgPGNvZGU+cHJvcGVydHlzZXQ8L2NvZGU+cyBpbnRlcm5hbGx5LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CiA8cD5SZXBvcnQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgbG9nLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+UmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGZpbGUgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbAotZmFpbCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQgb3Igd3JpdHRlbiB0by48L3A+Ci08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7ZWNob3Byb3BlcnRpZXMgZGVzdGZpbGU9Im15LnByb3BlcnRpZXMiIGZhaWxvbmVycm9yPSJmYWxzZSIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+UmVwb3J0IHRoZSBjdXJyZW50IHByb3BlcnRpZXMgdG8gdGhlIGZpbGUgIm15LnByb3BlcnRpZXMiLCBhbmQgd2lsbAotbG9nIGEgbWVzc2FnZSBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB3cml0dGVuIHRvLCBidXQgd2lsbCBzdGlsbAotYWxsb3cgdGhlIGJ1aWxkIHRvIGNvbnRpbnVlLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcyBwcmVmaXg9ImphdmEuIi8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5MaXN0IGFsbCBwcm9wZXJ0aWVzIGJlZ2lubmluZyB3aXRoICJqYXZhLiI8L3A+Ci08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7ZWNob3Byb3BlcnRpZXMmZ3Q7Ci0gICAgJmx0O3Byb3BlcnR5c2V0Jmd0OwotICAgICAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iamF2YS4iLyZndDsKLSAgICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OwotICAmbHQ7L2VjaG9wcm9wZXJ0aWVzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+VGhpcyBhZ2FpbiBsaXN0cyBhbGwgcHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCAiamF2YS4iIHVzaW5nIGEgbmVzdGVkCi08dHQ+Jmx0Oy9wcm9wZXJ0eXNldCZndDs8L3R0PiB3aGljaCBpcyBhbiBlcXVpdmFsZW50IGJ1dCBsb25nZXIgd2F5LjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcyByZWdleD0iLiphbnQuKiIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+TGlzdHMgYWxsIHByb3BlcnRpZXMgdGhhdCBjb250YWluICJhbnQiIGluIHRoZWlyIG5hbWVzLgotVGhlIGVxdWl2YWxlbnQgc25pcHBldCB3aXRoIDx0dD4mbHQ7L3Byb3BlcnR5c2V0Jmd0OzwvdHQ+IGlzOjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtlY2hvcHJvcGVydGllcyZndDsKLSAgICAmbHQ7cHJvcGVydHlzZXQmZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHlyZWYgcmVnZXg9Ii4qYW50LioiLyZndDsKLSAgICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OwotICAmbHQ7L2VjaG9wcm9wZXJ0aWVzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHByZT4mbHQ7ZWNob3Byb3BlcnRpZXMvJmd0OzwvcHJlPgogCis8cD5SZXBvcnQgdGhlIGN1cnJlbnQgcHJvcGVydGllcyB0byB0aGUgZmlsZSA8c2FtcD5teS5wcm9wZXJ0aWVzPC9zYW1wPiwgYW5kIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZQorZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZCBvciB3cml0dGVuIHRvLjwvcD4KKzxwcmU+Jmx0O2VjaG9wcm9wZXJ0aWVzIGRlc3RmaWxlPSJteS5wcm9wZXJ0aWVzIi8mZ3Q7PC9wcmU+CiAKKzxwPlJlcG9ydCB0aGUgY3VycmVudCBwcm9wZXJ0aWVzIHRvIHRoZSBmaWxlIDxzYW1wPm15LnByb3BlcnRpZXM8L3NhbXA+LCBhbmQgbG9nIGEgbWVzc2FnZSBpZiB0aGUKK2ZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQgb3Igd3JpdHRlbiB0bywgYnV0IHN0aWxsIGFsbG93IHRoZSBidWlsZCB0byBjb250aW51ZS48L3A+Cis8cHJlPiZsdDtlY2hvcHJvcGVydGllcyBkZXN0ZmlsZT0ibXkucHJvcGVydGllcyIgZmFpbG9uZXJyb3I9ImZhbHNlIi8mZ3Q7PC9wcmU+CisKKzxwPkxpc3QgYWxsIHByb3BlcnRpZXMgYmVnaW5uaW5nIHdpdGggPHNhbXA+amF2YS48L3NhbXA+PC9wPgorPHByZT4mbHQ7ZWNob3Byb3BlcnRpZXMgcHJlZml4PSJqYXZhLiIvJmd0OzwvcHJlPgorCis8cD5MaXN0cyBhbGwgcHJvcGVydGllcyBiZWdpbm5pbmcgd2l0aCA8c2FtcD5qYXZhLjwvc2FtcD4gdXNpbmcgYQorbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eXNldC8mZ3Q7PC9jb2RlPiB3aGljaCBpcyBhbiBlcXVpdmFsZW50IGJ1dCBsb25nZXIgd2F5LjwvcD4KKzxwcmU+CismbHQ7ZWNob3Byb3BlcnRpZXMmZ3Q7CisgICZsdDtwcm9wZXJ0eXNldCZndDsKKyAgICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJqYXZhLiIvJmd0OworICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OworJmx0Oy9lY2hvcHJvcGVydGllcyZndDs8L3ByZT4KKworPHA+TGlzdHMgYWxsIHByb3BlcnRpZXMgdGhhdCBjb250YWluIDxzYW1wPmFudDwvc2FtcD4gaW4gdGhlaXIgbmFtZXMuPC9wPgorPHByZT4mbHQ7ZWNob3Byb3BlcnRpZXMgcmVnZXg9Ii4qYW50LioiLyZndDs8L3ByZT4KKworPHA+VGhlIGVxdWl2YWxlbnQgc25pcHBldCB3aXRoIDxjb2RlPiZsdDtwcm9wZXJ0eXNldC8mZ3Q7PC9jb2RlPiBpczo8L3A+Cis8cHJlPgorJmx0O2VjaG9wcm9wZXJ0aWVzJmd0OworICAmbHQ7cHJvcGVydHlzZXQmZ3Q7CisgICAgJmx0O3Byb3BlcnR5cmVmIHJlZ2V4PSIuKmFudC4qIi8mZ3Q7CisgICZsdDsvcHJvcGVydHlzZXQmZ3Q7CismbHQ7L2VjaG9wcm9wZXJ0aWVzJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9lY2hveG1sLmh0bWwgYi9tYW51YWwvVGFza3MvZWNob3htbC5odG1sCmluZGV4IDc0Y2JmN2YuLjE2YjA3YjkgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9lY2hveG1sLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2VjaG94bWwuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5FY2hvWE1MIFRhc2s8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjUsNTAgKzI1LDQ3IEBACiA8Ym9keT4KIAogPGgyPkVjaG9YTUw8L2gyPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RWNobyBuZXN0ZWQgWE1MIHRvIHRoZSBjb25zb2xlIG9yIGEgZmlsZS4gPGI+U2luY2UgQXBhY2hlIEFudCAxLjc8L2I+PC9wPgorPHA+RWNobyBuZXN0ZWQgWE1MIHRvIHRoZSBjb25zb2xlIG9yIGEgZmlsZS48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gcmVjZWl2ZSB0aGUgWE1MLiBJZiBvbWl0dGVkIG5lc3RlZAotICAgICAgWE1MIHdpbGwgYmUgZWNob2VkIHRvIHRoZSBsb2cuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIHRvIHJlY2VpdmUgdGhlIFhNTC48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCBuZXN0ZWQgWE1MIGlzIGVjaG9lZCB0byB0aGUgbG9nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXBwZW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gYXBwZW5kIDxjb2RlPmZpbGU8L2NvZGU+LCBpZiBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YXBwZW5kPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBhcHBlbmQgPHZhcj5maWxlPC92YXI+LCBpZiBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZXNwYWNlUG9saWN5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIG5hbWVzcGFjZSBwb2xpY3kgYXMgZGVmaW5lZAotICAgICAgYnkgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeTwvY29kZT4uCi0gICAgICBWYWxpZCB2YWx1ZXMgYXJlIDxjb2RlPmlnbm9yZTwvY29kZT4sIDxjb2RlPmVsZW1lbnRzT25seTwvY29kZT4sIG9yIDxjb2RlPmFsbDwvY29kZT4uCi0gICAgICA8c3Ryb25nPlNpbmNlIEFwYWNoZSBBbnQgMS44PC9zdHJvbmc+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxjb2RlPmlnbm9yZTwvY29kZT48L3RkPgorICAgIDx0ZD5uYW1lc3BhY2VQb2xpY3k8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBuYW1lc3BhY2UgcG9saWN5IGFzIGRlZmluZWQKKyAgICAgIGJ5IDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3k8L2NvZGU+LiAgVmFsaWQgdmFsdWVzCisgICAgICBhcmUgPHE+aWdub3JlPC9xPiwgPHE+ZWxlbWVudHNPbmx5PC9xPiwgb3IgPHE+YWxsPC9xPi4gIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuODwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+aWdub3JlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci1OZXN0ZWQgWE1MIGNvbnRlbnQgaXMgcmVxdWlyZWQuCis8cD5OZXN0ZWQgWE1MIGNvbnRlbnQgaXMgcmVxdWlyZWQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5DcmVhdGUgYW4gQW50IGJ1aWxkZmlsZSwgPHNhbXA+c3ViYnVpbGQueG1sPC9zYW1wPi48L3A+CiA8cHJlPiZsdDtlY2hveG1sIGZpbGU9JnF1b3Q7c3ViYnVpbGQueG1sJnF1b3Q7Jmd0OwogICAmbHQ7cHJvamVjdCBkZWZhdWx0PSZxdW90O2ZvbyZxdW90OyZndDsKICAgICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Zm9vJnF1b3Q7Jmd0OwogICAgICAgJmx0O2VjaG8mZ3Q7Zm9vJmx0Oy9lY2hvJmd0OwogICAgICZsdDsvdGFyZ2V0Jmd0OwogICAmbHQ7L3Byb2plY3QmZ3Q7Ci0mbHQ7L2VjaG94bWwmZ3Q7Ci08L3ByZT4KLTxwPkNyZWF0ZXMgYW4gQW50IGJ1aWxkZmlsZSwgPGNvZGU+c3ViYnVpbGQueG1sPC9jb2RlPi48L3A+CismbHQ7L2VjaG94bWwmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2VqYi5odG1sIGIvbWFudWFsL1Rhc2tzL2VqYi5odG1sCmluZGV4IDM3YTM0YTkuLjBlNzhiZGUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9lamIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvZWpiLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RUpCIFRhc2tzPC90aXRsZT4KIApAQCAtMzYsOTQgKzM2LDkzIEBACiAgIDxsaT5Db25vciBNYWNOZWlsbDwvbGk+CiAgIDxsaT5DeXJpbGxlIE1vcnZhbiAoPGEgaHJlZj0ibWFpbHRvOmNtb3J2YW5AaW5nZW5vc3lhLmNvbSI+Y21vcnZhbkBpbmdlbm9zeWEuY29tPC9hPik8L2xpPgogICA8bGk+R3JlZyBOZWxzb24gKDxhIGhyZWY9Im1haWx0bzpnbkBzdW4uY29tIj5nbkBzdW4uY29tPC9hPik8L2xpPgotICA8bGk+Um9iIHZhbiBPb3N0cnVtKDxhIGhyZWY9Im1haWx0bzpyb2JAc3ByaW5nd2VsbGZhcm1zLmNhIj5yb2JAc3ByaW5nd2VsbGZhcm1zLmNhPC9hPik8L2xpPgorICA8bGk+Um9iIHZhbiBPb3N0cnVtICg8YSBocmVmPSJtYWlsdG86cm9iQHNwcmluZ3dlbGxmYXJtcy5jYSI+cm9iQHNwcmluZ3dlbGxmYXJtcy5jYTwvYT4pPC9saT4KIDwvdWw+CiAKLTxocj4KKzxoci8+CiA8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgogPHVsPgogICA8bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSIjZWpidGFza3MiPkVKQiBUYXNrczwvYT48L2xpPgogPC91bD4KIAotPGhyPgotPGgyPjxhIG5hbWU9ImludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvaDI+Ci08cD5BbnQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygb3B0aW9uYWwgdGFza3MgZm9yIGRldmVsb3BpbmcgMS54IGFuZCAyLngKLTxhIGhyZWY9Imh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2luZGV4LWpzcC0xNDAyMDMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5FbnRlcnByaXNlIEphdmEgQmVhbnMgKEVKQnMpPC9hPi4KLUluIGdlbmVyYWwgdGhlc2UgdGFza3MgYXJlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIHZlbmRvcidzIEVKQiBTZXJ2ZXIuPC9wPgorPGhyLz4KKzxoMiBpZD0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2gyPgorPHA+QW50IHByb3ZpZGVzIGEgbnVtYmVyIG9mIG9wdGlvbmFsIHRhc2tzIGZvciBkZXZlbG9waW5nIDEueCBhbmQKKzIueCA8YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvaW5kZXgtanNwLTE0MDIwMy5odG1sIiB0YXJnZXQ9Il90b3AiPkVudGVycHJpc2UKK0phdmEgQmVhbnMgKEVKQnMpPC9hPi4gIEluIGdlbmVyYWwgdGhlc2UgdGFza3MgYXJlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIHZlbmRvcidzIEVKQgorU2VydmVyLjwvcD4KIAotPHA+IFRoZSB0YXNrcyBzdXBwb3J0Ojxicj4KKzxwPlRoZSB0YXNrcyBzdXBwb3J0OjwvcD4KIAogPHVsPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5ib3JsYW5kLmNvbSI+Qm9ybGFuZCA8L2E+Ci0gIEFwcGxpY2F0aW9uIFNlcnZlciA0LjU8L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5pcGxhbmV0LmNvbSI+aVBsYW5ldCA8L2E+Ci0gIEFwcGxpY2F0aW9uIFNlcnZlciA2LjA8L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qYm9zcy5vcmcvIiB0YXJnZXQ9Il90b3AiPgotICBKQm9zcyAyLjE8L2E+IGFuZCBhYm92ZSBFSkIgc2VydmVyczwvbGk+Ci0gIDxsaT48YSBocmVmPSJodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDA4MDUxNjIxMDUwNi9odHRwOi8vd3d3Lmlyb25mbGFyZS5jb20vIj4KLSAgT3Jpb24gQXBwbGljYXRpb24gU2VydmVyPC9hPiAyLjAgPGVtPnNpbmNlIDEuOS4xMDwvZW0+PC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuYmVhLmNvbSIgdGFyZ2V0PSJfdG9wIj5XZWJsb2dpYzwvYT4KLSAgIDQuNS4xIHRocm91Z2ggdG8gNy4wIEVKQiBzZXJ2ZXJzPC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub2JqZWN0d2ViLm9yZy9qb25hcy8iIHRhcmdldD0iX3RvcCI+Sk9uQVM8L2E+Ci0gICAyLjQueCBhbmQgMi41IE9wZW4gU291cmNlIEVKQiBzZXJ2ZXI8L2xpPgotICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZSI+SUJNIFdlYlNwaGVyZTwvYT4gNC4wPC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmJvcmxhbmQuY29tIiB0YXJnZXQ9Il90b3AiPkJvcmxhbmQ8L2E+QXBwbGljYXRpb24gU2VydmVyIDQuNTwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwMjAyMDIwODI4NDEvaHR0cDovL3d3dy5pcGxhbmV0LmNvbS9wcm9kdWN0cy9pcGxhbmV0X2FwcGxpY2F0aW9uL2hvbWVfaWFzLmh0bWwiCisgICAgICAgICB0YXJnZXQ9Il90b3AiPmlQbGFuZXQ8L2E+IEFwcGxpY2F0aW9uIFNlcnZlciA2LjA8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuamJvc3Mub3JnLyIgdGFyZ2V0PSJfdG9wIj5KQm9zcyAyLjE8L2E+IGFuZCBhYm92ZSBFSkIgc2VydmVyczwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwODA1MTYyMTA1MDYvaHR0cDovL3d3dy5pcm9uZmxhcmUuY29tLyIKKyAgICAgICAgIHRhcmdldD0iX3RvcCI+T3Jpb24gQXBwbGljYXRpb24gU2VydmVyPC9hPiAyLjAgKDxlbT5zaW5jZSBBbnQgMS4xMC4yPC9lbT4pPC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9yYWNsZS5jb20vY29ycG9yYXRlL2FjcXVpc2l0aW9ucy9iZWEvIiB0YXJnZXQ9Il90b3AiPldlYkxvZ2ljPC9hPiA0LjUuMSB0aHJvdWdoIHRvIDcuMCBFSkIgc2VydmVyczwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwczovL2pvbmFzLm93Mi5vcmcvIiB0YXJnZXQ9Il90b3AiPkpPbkFTPC9hPiAyLjQueCBhbmQgMi41IE9wZW4gU291cmNlIEVKQiBzZXJ2ZXI8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUiIHRhcmdldD0iX3RvcCI+SUJNIFdlYlNwaGVyZTwvYT4gNC4wPC9saT4KIDwvdWw+Ci0gICAgVmVuZG9ycyBzdWNoIGFzIEJFQSBhbmQgSUJNIG5vdyBwcm92aWRlIGN1c3RvbSBBbnQgdGFza3MgdG8gd29yayB3aXRoIHRoZWlyCi0gICAgcGFydGljdWxhciBwcm9kdWN0cy4gTW9yZSBpbXBvcnRhbnRseSwgRUpCMy4wIHJlbmRlcnMgdGhpcyB3aG9sZSBwcm9jZXNzIG9ic29sZXRlLgotICAgIEFjY29yZGluZ2x5LCBkZXZlbG9wbWVudCBvZiB0aGVzZSB0YXNrcyBpcyBlZmZlY3RpdmVseSBmcm96ZW4uIEJ1ZyByZXBvcnRzCi0gICAgYW5kIGVzcGVjaWFsbHkgcGF0Y2hlcyBhcmUgd2VsY29tZSwgYnV0IHRoZXJlIGlzIG5vIHByZXNzaW5nIG5lZWQgdG8gYWRkCi0gICAgc3VwcG9ydCBmb3IgbmV3IGFwcGxpY2F0aW9uIHNlcnZlcnMuIE5vYm9keSBzaG91bGQgYmUgd3JpdGluZyBuZXcgRUpCMi54IGFwcGxpY2F0aW9ucwotICAgIGFuZCBkZWZpbml0ZWx5IG5vdCBuZXcgRUpCMi54IHNlcnZlcnMuCi08L3A+Cis8cD5WZW5kb3JzIHN1Y2ggYXMgQkVBIGFuZCBJQk0gbm93IHByb3ZpZGUgY3VzdG9tIEFudCB0YXNrcyB0byB3b3JrIHdpdGggdGhlaXIgcGFydGljdWxhcgorcHJvZHVjdHMuIE1vcmUgaW1wb3J0YW50bHksIEVKQiAzLjAgcmVuZGVycyB0aGlzIHdob2xlIHByb2Nlc3Mgb2Jzb2xldGUuICBBY2NvcmRpbmdseSwgZGV2ZWxvcG1lbnQKK29mIHRoZXNlIHRhc2tzIGlzIGVmZmVjdGl2ZWx5IGZyb3plbi4gQnVnIHJlcG9ydHMgYW5kIGVzcGVjaWFsbHkgcGF0Y2hlcyBhcmUgd2VsY29tZSwgYnV0IHRoZXJlIGlzCitubyBwcmVzc2luZyBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBuZXcgYXBwbGljYXRpb24gc2VydmVycy4gTm9ib2R5IHNob3VsZCBiZSB3cml0aW5nIG5ldyBFSkIgMi54CithcHBsaWNhdGlvbnMgYW5kIGRlZmluaXRlbHkgbm90IG5ldyBFSkIgMi54IHNlcnZlcnMuPC9wPgogCi08aHI+Ci08aDI+PGEgbmFtZT0iZWpidGFza3MiPkVKQiBUYXNrczwvYT48L2gyPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgotIDx0cj48dGQ+VGFzazwvdGQ+PHRkIGNvbHNwYW49IjIiPkFwcGxpY2F0aW9uIFNlcnZlcnM8L3RkPjwvdHI+Ci0gPHRyPjx0ZD48YSBocmVmPSJCb3JsYW5kR2VuZXJhdGVDbGllbnQuaHRtbCI+YmxnZW5jbGllbnQ8L2E+PC90ZD48dGQgY29sc3Bhbj0iMiI+Qm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGFuZCA1Lng8L3RkPjwvdHI+Ci0gPHRyPjx0ZD48YSBocmVmPSIjaXBsYW5ldC1lamJjIj5pcGxhbmV0LWVqYmM8L2E+PC90ZD48dGQgY29sc3Bhbj0iMiI+aVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNi4wPC90ZD48L3RyPgotIDx0cj48dGQgcm93c3Bhbj0iOCI+PGEgaHJlZj0iI2VqYmphciI+ZWpiamFyPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiIGFsaWduPSJjZW50ZXIiPjxiPk5lc3RlZCBFbGVtZW50czwvYj48L3RkPjwvdHI+Ci0gPHRyPjx0ZD48YSBocmVmPSJCb3JsYW5kRUpCVGFza3MuaHRtbCI+Ym9ybGFuZDwvYT48L3RkPjx0ZD5Cb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUgYW5kIDUueDwvdGQ+PC90cj4KLSA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfaXBsYW5ldCI+aVBsYW5ldDwvYT48L3RkPjx0ZD5pUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciA2LjA8L3RkPjwvdHI+Ci0gPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX2pib3NzIj5qYm9zczwvYT48L3RkPjx0ZD5KQm9zczwvdGQ+PC90cj4KLSA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfam9uYXMiPmpvbmFzPC9hPjwvdGQ+PHRkPkpPbkFTIDIuNC54IGFuZCAyLjU8L3RkPjwvdHI+Ci0gPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX3dlYmxvZ2ljIj53ZWJsb2dpYzwvYT48L3RkPjx0ZD5XZWJsb2dpYyA1LjEgdG8gNy4wPC90ZD48L3RyPgotIDx0cj48dGQ+PGEgaHJlZj0iI2VqYmphcl93ZWJzcGhlcmUiPndlYnNwaGVyZTwvYT48L3RkPjx0ZD5JQk0gV2ViU3BoZXJlIDQuMDwvdGQ+PC90cj4KLSA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfb3Jpb24iPm9yaW9uPC9hPjwvdGQ+PHRkPklyb25GbGFyZShPcmFjbGUpIE9yaW9uIEFwcGxpY2F0aW9uIFNlcnZlciAyLjAuNjwvdGQ+PC90cj4KLQorPGhyLz4KKzxoMiBpZD0iZWpidGFza3MiPkVKQiBUYXNrczwvaDI+Cis8dGFibGU+CisgIDx0cj48dGggc2NvcGU9ImNvbCI+VGFzazwvdGg+PHRoIHNjb3BlPSJjb2wiIGNvbHNwYW49IjIiPkFwcGxpY2F0aW9uIFNlcnZlcnM8L3RoPjwvdHI+CisgIDx0cj48dGQ+PGEgaHJlZj0iQm9ybGFuZEdlbmVyYXRlQ2xpZW50Lmh0bWwiPmJsZ2VuY2xpZW50PC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiPkJvcmxhbmQKKyAgICBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGFuZCA1Lng8L3RkPjwvdHI+CisgIDx0cj48dGQ+PGEgaHJlZj0iI2lwbGFuZXQtZWpiYyI+aXBsYW5ldC1lamJjPC9hPjwvdGQ+PHRkIGNvbHNwYW49IjIiPmlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyCisgICAgNi4wPC90ZD48L3RyPgorICA8dHI+PHRkIHJvd3NwYW49IjgiPjxhIGhyZWY9IiNlamJqYXIiPmVqYmphcjwvYT48L3RkPjx0aCBzY29wZT0iY29sIiBjb2xzcGFuPSIyIj5OZXN0ZWQgRWxlbWVudHM8L3RoPjwvdHI+CisgIDx0cj48dGQ+PGEgaHJlZj0iQm9ybGFuZEVKQlRhc2tzLmh0bWwiPmJvcmxhbmQ8L2E+PC90ZD48dGQ+Qm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41IGFuZAorICAgIDUueDwvdGQ+PC90cj4KKyAgPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX2lwbGFuZXQiPmlQbGFuZXQ8L2E+PC90ZD48dGQ+aVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNi4wPC90ZD48L3RyPgorICA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfamJvc3MiPmpib3NzPC9hPjwvdGQ+PHRkPkpCb3NzPC90ZD48L3RyPgorICA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfam9uYXMiPmpvbmFzPC9hPjwvdGQ+PHRkPkpPbkFTIDIuNC54IGFuZCAyLjU8L3RkPjwvdHI+CisgIDx0cj48dGQ+PGEgaHJlZj0iI2VqYmphcl93ZWJsb2dpYyI+d2VibG9naWM8L2E+PC90ZD48dGQ+V2ViTG9naWMgNS4xIHRvIDcuMDwvdGQ+PC90cj4KKyAgPHRyPjx0ZD48YSBocmVmPSIjZWpiamFyX3dlYnNwaGVyZSI+d2Vic3BoZXJlPC9hPjwvdGQ+PHRkPklCTSBXZWJTcGhlcmUgNC4wPC90ZD48L3RyPgorICA8dHI+PHRkPjxhIGhyZWY9IiNlamJqYXJfb3Jpb24iPm9yaW9uPC9hPjwvdGQ+PHRkPklyb25GbGFyZSAoT3JhY2xlKSBPcmlvbiBBcHBsaWNhdGlvbiBTZXJ2ZXIKKyAgICAyLjAuNjwvdGQ+PC90cj4KIDwvdGFibGU+CiAKLTxocj4KLTxoMj48YSBuYW1lPSJkZGNyZWF0b3IiPmRkY3JlYXRvcjwvYT48L2gyPgotPGgzPjxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgotPHA+ZGRjcmVhdG9yIHdpbGwgY29tcGlsZSBhIHNldCBvZiBXZWJsb2dpYyB0ZXh0LWJhc2VkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgaW50byBhIHNlcmlhbGl6ZWQKLUVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIFRoZSBzZWxlY3Rpb24gb2Ygd2hpY2ggb2YgdGhlIHRleHQtYmFzZWQgZGVzY3JpcHRvcnMgYXJlIHRvIGJlIGNvbXBpbGVkCi1pcyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgQW50IGluY2x1ZGUgYW5kIGV4Y2x1ZGUgc2VsZWN0aW9uIG1lY2hhbmlzbXMuCi08L3A+Cis8aHIvPgogCi08aDM+UGFyYW1ldGVyczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMiBpZD0iZGRjcmVhdG9yIj5kZGNyZWF0b3I8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPjxjb2RlPmRkY3JlYXRvcjwvY29kZT4gd2lsbCBjb21waWxlIGEgc2V0IG9mIFdlYkxvZ2ljIHRleHQtYmFzZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBpbnRvIGEKK3NlcmlhbGl6ZWQgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhlIHNlbGVjdGlvbiBvZiB3aGljaCBvZiB0aGUgdGV4dC1iYXNlZCBkZXNjcmlwdG9ycyBhcmUgdG8gYmUKK2NvbXBpbGVkIGlzIGJhc2VkIG9uIHRoZSBzdGFuZGFyZCBBbnQgPGNvZGU+aW5jbHVkZTwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGU8L2NvZGU+IHNlbGVjdGlvbgorbWVjaGFuaXNtcy48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdG9yczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRlc2NyaXB0b3JzIGFyZSBzZWxlY3RlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzY3JpcHRvcnM8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRlc2NyaXB0b3JzIGFyZSBzZWxlY3RlZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB3aWxsIGJlIHdyaXR0ZW48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzdDwvdGQ+CisgICAgPHRkPlRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB3aWxsIGJlIHdyaXR0ZW48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgY2xhc3NwYXRoIHRvIHVzZSB0byBydW4gdGhlIHVuZGVybHlpbmcgd2VibG9naWMgZGRjcmVhdG9yIHRvb2wuCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+d2VibG9naWMuZWpiLnV0aWxzLkREQ3JlYXRvcjwvY29kZT4gY2xhc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIHJ1biB0aGUgdW5kZXJseWluZyBXZWJMb2dpYyA8Y29kZT5kZGNyZWF0b3I8L2NvZGU+IHRvb2wuCisgICAgICBUaGlzIG11c3QgaW5jbHVkZSB0aGUgPGNvZGU+d2VibG9naWMuZWpiLnV0aWxzLkREQ3JlYXRvcjwvY29kZT4gY2xhc3M8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KQEAgLTEzMiw2OSArMTMxLDY3IEBACiAgICAgICAgICAgIGRlc3Q9JnF1b3Q7JHtnZW4uY2xhc3Nlc30mcXVvdDsKICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7ZGVzY3JpcHRvcmJ1aWxkLmNsYXNzcGF0aH0mcXVvdDsmZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OwotJmx0Oy9kZGNyZWF0b3ImZ3Q7Ci08L3ByZT4KKyZsdDsvZGRjcmVhdG9yJmd0OzwvcHJlPgogCi08aHI+Ci08aDI+PGEgbmFtZT0iZWpiYyI+ZWpiYzwvYT48L2gyPgotPGgzPjxiPkRlc2NyaXB0aW9uOjwvYj48L2gzPgotPHA+VGhlIGVqYmMgdGFzayB3aWxsIHJ1biBXZWJsb2dpYydzIGVqYmMgdG9vbC4gVGhpcyB0b29sIHdpbGwgdGFrZSBhIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9yLAotZXhhbWluZSB0aGUgdmFyaW91cyBFSkIgaW50ZXJmYWNlcyBhbmQgYmVhbiBjbGFzc2VzIGFuZCB0aGVuIGdlbmVyYXRlIHRoZSByZXF1aXJlZCBzdXBwb3J0IGNsYXNzZXMKLW5lY2Vzc2FyeSB0byBkZXBsb3kgdGhlIGJlYW4gaW4gYSBXZWJsb2dpYyBFSkIgY29udGFpbmVyLiBUaGlzIHdpbGwgaW5jbHVkZSB0aGUgUk1JIHN0dWJzIGFuZCBza2VsZXRvbnMKLWFzIHdlbGwgYXMgdGhlIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoZSBiZWFuJ3MgaG9tZSBhbmQgcmVtb3RlIGludGVyZmFjZXMuPC9wPgotPHA+Ci1UaGUgYW50IHRhc2sgd2hpY2ggcnVucyB0aGlzIHRvb2wgaXMgYWJsZSB0byBjb21waWxlIHNldmVyYWwgYmVhbnMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBUaGUgYmVhbnMgdG8gYmUKLWNvbXBpbGVkIGFyZSBzZWxlY3RlZCBieSBpbmNsdWRpbmcgdGhlaXIgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBUaGUgc3RhbmRhcmQgYW50Ci08Y29kZT5pbmNsdWRlPC9jb2RlPiBhbmQgPGNvZGU+ZXhjbHVkZTwvY29kZT4gY29uc3RydWN0cyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLXRvIGJlIGluY2x1ZGVkLiA8L3A+Ci08cD4KLUVhY2ggZGVzY3JpcHRvciBpcyBleGFtaW5lZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYXJlIG91dCBvZiBkYXRlIGFuZCBuZWVkIHRvIGJlCi1yZWdlbmVyYXRlZC4gVGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciBpcyBkZS1zZXJpYWxpemVkIHRvIGRpc2NvdmVyIHRoZSBob21lLCByZW1vdGUgYW5kCis8aHIvPgorPGgyIGlkPSJlamJjIj5lamJjPC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGUgPGNvZGU+ZWpiYzwvY29kZT4gdGFzayB3aWxsIHJ1biBXZWJMb2dpYydzIDxrYmQ+ZWpiYzwva2JkPiB0b29sLiBUaGlzIHRvb2wgd2lsbCB0YWtlIGEKK3NlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9yLCBleGFtaW5lIHRoZSB2YXJpb3VzIEVKQiBpbnRlcmZhY2VzIGFuZCBiZWFuIGNsYXNzZXMgYW5kIHRoZW4KK2dlbmVyYXRlIHRoZSByZXF1aXJlZCBzdXBwb3J0IGNsYXNzZXMgbmVjZXNzYXJ5IHRvIGRlcGxveSB0aGUgYmVhbiBpbiBhIFdlYkxvZ2ljIEVKQiBjb250YWluZXIuIFRoaXMKK3dpbGwgaW5jbHVkZSB0aGUgUk1JIHN0dWJzIGFuZCBza2VsZXRvbnMgYXMgd2VsbCBhcyB0aGUgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGJlYW4ncyBob21lIGFuZAorcmVtb3RlIGludGVyZmFjZXMuPC9wPgorPHA+VGhlIEFudCB0YXNrIHdoaWNoIHJ1bnMgdGhpcyB0b29sIGlzIGFibGUgdG8gY29tcGlsZSBzZXZlcmFsIGJlYW5zIGluIGEgc2luZ2xlIG9wZXJhdGlvbi4gVGhlCitiZWFucyB0byBiZSBjb21waWxlZCBhcmUgc2VsZWN0ZWQgYnkgaW5jbHVkaW5nIHRoZWlyIHNlcmlhbGl6ZWQgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVGhlIHN0YW5kYXJkCitBbnQgPGNvZGU+aW5jbHVkZTwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGU8L2NvZGU+IGNvbnN0cnVjdHMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXBsb3ltZW50CitkZXNjcmlwdG9ycyB0byBiZSBpbmNsdWRlZC48L3A+Cis8cD5FYWNoIGRlc2NyaXB0b3IgaXMgZXhhbWluZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSBvdXQgb2YgZGF0ZSBhbmQgbmVlZAordG8gYmUgcmVnZW5lcmF0ZWQuIFRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgZGUtc2VyaWFsaXplZCB0byBkaXNjb3ZlciB0aGUgaG9tZSwgcmVtb3RlIGFuZAogaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4gVGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIGFyZSBkZXRlcm1pbmVkIGFuZCBjaGVja2VkIHRvIHNlZSB0aGVpcgogbW9kaWZpY2F0aW9uIHRpbWVzLiBUaGVzZSB0aW1lcyBhbmQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBzZXJpYWxpemVkIGRlc2NyaXB0b3IgaXRzZWxmIGFyZQotY29tcGFyZWQgd2l0aCB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLiBJZiB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgYXJlIG5vdCBwcmVzZW50Ci1vciBhcmUgb3V0IG9mIGRhdGUsIHRoZSBlamJjIHRvb2wgaXMgcnVuIHRvIGdlbmVyYXRlIG5ldyB2ZXJzaW9ucy48L3A+Ci08aDM+UGFyYW1ldGVyczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KK2NvbXBhcmVkIHdpdGggdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4gSWYgdGhlIGdlbmVyYXRlZCBjbGFzc2VzIGFyZSBub3QKK3ByZXNlbnQgb3IgYXJlIG91dCBvZiBkYXRlLCB0aGUgPGtiZD5lamJjPC9rYmQ+IHRvb2wgaXMgcnVuIHRvIGdlbmVyYXRlIG5ldyB2ZXJzaW9ucy48L3A+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzY3JpcHRvcnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgYmFzZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0aGUgc2VyaWFsaXplZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFyZSBzZWxlY3RlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzY3JpcHRvcnM8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRoZSBzZXJpYWxpemVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYXJlCisgICAgICBzZWxlY3RlZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMsIFJJTSBzdHVicyBhbmQgUk1JIHNrZWxldG9ucyBhcmUgd3JpdHRlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5kZXN0PC90ZD4KKyAgICA8dGQ+VGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcywgUklNIHN0dWJzIGFuZCBSTUkgc2tlbGV0b25zIGFyZSB3cml0dGVuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuaWZlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBtYW5pZmVzdCBmaWxlIHRvIGJlIHdyaXR0ZW4uIFRoaXMgbWFuaWZlc3Qgd2lsbCBjb250YWluIGFuIGVudHJ5IGZvciBlYWNoIEVKQiBwcm9jZXNzZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+bWFuaWZlc3Q8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIG1hbmlmZXN0IGZpbGUgdG8gYmUgd3JpdHRlbi4gVGhpcyBtYW5pZmVzdCB3aWxsIGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggRUpCCisgICAgICBwcm9jZXNzZWQ8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBzb3VyY2UgdHJlZSBjb250YWluaW5nIHRoZSBzb3VyY2UgZmlsZXMgb2YgdGhlIGhvbWUgaW50ZXJmYWNlLAotICAgICAgICAgICAgICAgICAgICAgcmVtb3RlIGludGVyZmFjZSBhbmQgYmVhbiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zcmM8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHNvdXJjZSB0cmVlIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBmaWxlcyBvZiB0aGUgaG9tZSBpbnRlcmZhY2UsCisgICAgICByZW1vdGUgaW50ZXJmYWNlIGFuZCBiZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgY2xhc3NwYXRoIG11c3QgaW5jbHVkZSBib3RoIHRoZSA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPiBjbGFzcyBhbmQgdGhlCi0gICAgICAgICAgICAgICAgICAgICBjbGFzcyBmaWxlcyBvZiB0aGUgYmVhbiwgaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGV0YyBvZiB0aGUgYmVhbiBiZWluZwotICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoaXMgY2xhc3NwYXRoIG11c3QgaW5jbHVkZSBib3RoIHRoZSA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPiBjbGFzcyBhbmQgdGhlIGNsYXNzIGZpbGVzIG9mCisgICAgICB0aGUgYmVhbiwgaG9tZSBpbnRlcmZhY2UsIHJlbW90ZSBpbnRlcmZhY2UsIGV0YyBvZiB0aGUgYmVhbiBiZWluZyBwcm9jZXNzZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KLSAgICA8dGQ+Q29udHJvbHMgd2hldGhlciBlamJjIHdpbGwga2VlcCB0aGUKLSAgICAgICAgaW50ZXJtZWRpYXRlIEphdmEgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMuIFRoaXMgY2FuIGJlCi0gICAgICAgIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZy48L3RkPgotICAgIDx0ZD5ObywgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+a2VlcGdlbmVyYXRlZDwvdGQ+CisgICAgPHRkPkNvbnRyb2xzIHdoZXRoZXIgPGtiZD5lamJjPC9rYmQ+IHdpbGwga2VlcCB0aGUgaW50ZXJtZWRpYXRlIGphdmEgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUKKyAgICAgIGNsYXNzIGZpbGVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KQEAgLTIwNSwxMTMgKzIwMiw4MyBAQAogICAgICAgICAgICBtYW5pZmVzdD0mcXVvdDske2J1aWxkLm1hbmlmZXN0fSZxdW90OwogICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtkZXNjcmlwdG9yYnVpbGQuY2xhc3NwYXRofSZxdW90OyZndDsKICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLnNlciZxdW90Oy8mZ3Q7Ci0mbHQ7L2VqYmMmZ3Q7Ci08L3ByZT4KKyZsdDsvZWpiYyZndDs8L3ByZT4KIAotPGhyPgotPGgyPgotPGEgTkFNRT0iaXBsYW5ldC1lamJjIj48L2E+aXBsYW5ldC1lamJjPC9oMj4KKzxoci8+Cis8aDIgaWQ9ImlwbGFuZXQtZWpiYyI+aXBsYW5ldC1lamJjPC9oMj4KIAotPGgzPgotPGI+RGVzY3JpcHRpb246PC9iPjwvaDM+Ci1UYXNrIHRvIGNvbXBpbGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlcgotNi4wLiAgR2l2ZW4gYSBzdGFuZGFyZCBFSkIgMS4xIFhNTCBkZXNjcmlwdG9yIGFzIHdlbGwgYXMgYW4gaUFTLXNwZWNpZmljCi1FSkIgZGVzY3JpcHRvciwgdGhpcyB0YXNrIHdpbGwgZ2VuZXJhdGUgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgcmVxdWlyZWQKLXRvIGRlcGxveSB0aGUgRUpCIHRvIGlBUy4gIFNpbmNlIHRoZSBYTUwgZGVzY3JpcHRvcnMgY2FuIGluY2x1ZGUgbXVsdGlwbGUKLUVKQnMsIHRoaXMgaXMgYSBjb252ZW5pZW50IHdheSBvZiBzcGVjaWZ5aW5nIG1hbnkgRUpCcyBpbiBhIHNpbmdsZSBBbnQKLXRhc2suCi08cD5Gb3IgZWFjaCBFSkIgc3BlY2lmaWVkLCB0aGUgdGFzayB3aWxsIGxvY2F0ZSB0aGUgdGhyZWUgY2xhc3NlcyB0aGF0Ci1jb21wcmlzZSB0aGUgRUpCIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuICBJZiB0aGVzZSBjbGFzcyBmaWxlcwotY2Fubm90IGJlIGxvY2F0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgdGhlIHRhc2sgd2lsbCBmYWlsLiBUaGUKLXRhc2sgd2lsbCBhbHNvIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucyBpbiB0aGlzIGRpcmVjdG9yeS4KLUlmIGZvdW5kLCB0aGUgdGltZXN0YW1wcyBvbiB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyB3aWxsIGJlIGNoZWNrZWQgdG8KLWVuc3VyZSB0aGV5IGFyZSB1cCB0byBkYXRlLiBPbmx5IGlmIHRoZXNlIGZpbGVzIGNhbm5vdCBiZSBmb3VuZCBvciBpZiB0aGV5Ci1hcmUgb3V0IG9mIGRhdGUgd2lsbCB0aGUgaUFTIGVqYmMgdXRpbGl0eSBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3IHN0dWJzCi1hbmQgc2tlbGV0b25zLjwvcD4KLTxoMz4KLVBhcmFtZXRlcnM6PC9oMz4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UYXNrIHRvIGNvbXBpbGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciA2LjAuICBHaXZlbiBhIHN0YW5kYXJkCitFSkIgMS4xIFhNTCBkZXNjcmlwdG9yIGFzIHdlbGwgYXMgYW4gaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yLCB0aGlzIHRhc2sgd2lsbCBnZW5lcmF0ZSB0aGUgc3R1YnMKK2FuZCBza2VsZXRvbnMgcmVxdWlyZWQgdG8gZGVwbG95IHRoZSBFSkIgdG8gaUFTLiAgU2luY2UgdGhlIFhNTCBkZXNjcmlwdG9ycyBjYW4gaW5jbHVkZSBtdWx0aXBsZQorRUpCcywgdGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IG9mIHNwZWNpZnlpbmcgbWFueSBFSkJzIGluIGEgc2luZ2xlIEFudCB0YXNrLjwvcD4KKzxwPkZvciBlYWNoIEVKQiBzcGVjaWZpZWQsIHRoZSB0YXNrIHdpbGwgbG9jYXRlIHRoZSB0aHJlZSBjbGFzc2VzIHRoYXQgY29tcHJpc2UgdGhlIEVKQiBpbiB0aGUKK2Rlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIElmIHRoZXNlIGNsYXNzIGZpbGVzIGNhbm5vdCBiZSBsb2NhdGVkIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHRoZQordGFzayB3aWxsIGZhaWwuIFRoZSB0YXNrIHdpbGwgYWxzbyBhdHRlbXB0IHRvIGxvY2F0ZSB0aGUgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgaW4gdGhpcyBkaXJlY3RvcnkuCitJZiBmb3VuZCwgdGhlIHRpbWVzdGFtcHMgb24gdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMgd2lsbCBiZSBjaGVja2VkIHRvIGVuc3VyZSB0aGV5IGFyZSB1cCB0bworZGF0ZS4gT25seSBpZiB0aGVzZSBmaWxlcyBjYW5ub3QgYmUgZm91bmQgb3IgaWYgdGhleSBhcmUgb3V0IG9mIGRhdGUgd2lsbCB0aGUgaUFTIDxrYmQ+ZWpiYzwva2JkPgordXRpbGl0eSBiZSBjYWxsZWQgdG8gZ2VuZXJhdGUgbmV3IHN0dWJzIGFuZCBza2VsZXRvbnMuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiPgotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CiAKLTx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD5lamJkZXNjcmlwdG9yPC90ZD4KKyAgICA8dGQ+U3RhbmRhcmQgRUpCIDEuMSBYTUwgZGVzY3JpcHRvciAodHlwaWNhbGx5IHRpdGxlZCA8cT5lamItamFyLnhtbDwvcT4pLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CiAKLTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aWFzZGVzY3JpcHRvcjwvdGQ+CisgICAgPHRkPmlBUy1zcGVjaWZpYyBFSkIgWE1MIGRlc2NyaXB0b3IgKHR5cGljYWxseSB0aXRsZWQgPHE+aWFzLWVqYi1qYXIueG1sPC9xPikuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KIAotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5lamJkZXNjcmlwdG9yPC90ZD4KKyAgPHRyPgorICAgIDx0ZD5kZXN0PC90ZD4KKyAgICA8dGQ+VGhlIGlzIHRoZSBiYXNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgUk1JIHN0dWJzIGFuZCBza2VsZXRvbnMgYXJlIHdyaXR0ZW4uIEluIGFkZGl0aW9uLCB0aGUKKyAgICAgIGNsYXNzIGZpbGVzIGZvciBlYWNoIGJlYW4gKGhvbWUgaW50ZXJmYWNlLCByZW1vdGUgaW50ZXJmYWNlLCBhbmQgRUpCIGltcGxlbWVudGF0aW9uKSBtdXN0IGJlCisgICAgICBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgogCi08dGQgdmFsaWduPSJ0b3AiPlN0YW5kYXJkIEVKQiAxLjEgWE1MIGRlc2NyaXB0b3IgKHR5cGljYWxseSB0aXRsZWQgImVqYi1qYXIueG1sIikuPC90ZD4KKyAgPHRyPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBnZW5lcmF0aW5nIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLiAgTmVzdGVkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4KKyAgICAgIGVsZW1lbnRzIG1heSBhbHNvIGJlIHVzZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIHdoZW4gQW50IHdhcyBzdGFydGVkPC90ZD4KKyAgPC90cj4KIAotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KKyAgPHRyPgorICAgIDx0ZD5rZWVwZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IDxrYmQ+ZWpiYzwva2JkPiB3aWxsCisgICAgICBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIElmIDxxPnllczwvcT4sIHRoZSBzb3VyY2UgZmlsZXMgd2lsbCBiZSByZXRhaW5lZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KKyAgPC90cj4KIAotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5pYXNkZXNjcmlwdG9yPC90ZD4KKyAgPHRyPgorICAgIDx0ZD5kZWJ1ZzwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgPGtiZD5lamJjPC9rYmQ+IHV0aWxpdHkgc2hvdWxkIGxvZyBhZGRpdGlvbmFsIGRlYnVnZ2luZworICAgICAgc3RhdGVtZW50cyB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiBJZiA8cT55ZXM8L3E+LCB0aGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cyB3aWxsIGJlCisgICAgICBnZW5lcmF0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CisgIDwvdHI+CiAKLTx0ZCB2YWxpZ249InRvcCI+aUFTLXNwZWNpZmljIEVKQiBYTUwgZGVzY3JpcHRvciAodHlwaWNhbGx5IHRpdGxlZCAiaWFzLWVqYi1qYXIueG1sIikuPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5UaGUgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IHdoZXJlIHRoZSBSTUkgc3R1YnMgYW5kIHNrZWxldG9ucwotYXJlIHdyaXR0ZW4uIEluIGFkZGl0aW9uLCB0aGUgY2xhc3MgZmlsZXMgZm9yIGVhY2ggYmVhbiAoaG9tZSBpbnRlcmZhY2UsCi1yZW1vdGUgaW50ZXJmYWNlLCBhbmQgRUpCIGltcGxlbWVudGF0aW9uKSBtdXN0IGJlIGZvdW5kIGluIHRoaXMgZGlyZWN0b3J5LjwvdGQ+Ci0KLTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBnZW5lcmF0aW5nIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLgotSWYgb21pdHRlZCwgdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgd2hlbiBBbnQgd2FzIHN0YXJ0ZWQgd2lsbCBiZSB1c2VkLgotTmVzdGVkICJjbGFzc3BhdGgiIGVsZW1lbnRzIG1heSBhbHNvIGJlIHVzZWQuPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPmtlZXBnZW5lcmF0ZWQ8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMgd2hpY2ggYXJlCi1nZW5lcmF0ZWQgYnkgZWpiYyB3aWxsIGJlIHNhdmVkIG9yIGF1dG9tYXRpY2FsbHkgZGVsZXRlZC4gSWYgInllcyIsIHRoZQotc291cmNlIGZpbGVzIHdpbGwgYmUgcmV0YWluZWQuIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICJubyIuIDwvdGQ+Ci0KLTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5kZWJ1ZzwvdGQ+Ci0KLTx0ZD5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGVqYmMgdXRpbGl0eSBzaG91bGQgbG9nIGFkZGl0aW9uYWwgZGVidWdnaW5nCi1zdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuIElmICJ5ZXMiLCB0aGUgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgc3RhdGVtZW50cwotd2lsbCBiZSBnZW5lcmF0ZWQuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAibm8iLiA8L3RkPgotCi08dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPgotPGNlbnRlcj5ObzwvY2VudGVyPgotPC90ZD4KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+aWFzaG9tZTwvdGQ+Ci0KLTx0ZD5NYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvciB0aGlzIGlBUyBpbnN0YWxsYXRpb24uCi1UaGlzIGlzIHVzZWQgdG8gZmluZCB0aGUgZWpiYyB1dGlsaXR5IGlmIGl0IGlzbid0IGluY2x1ZGVkIGluIHRoZSB1c2VyJ3MKLXN5c3RlbSBwYXRoLiBJZiBzcGVjaWZpZWQsIGl0IHNob3VsZCByZWZlciB0byB0aGUgIltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzIgotZGlyZWN0b3J5LiBJZiBvbWl0dGVkLCB0aGUgZWpiYyB1dGlsaXR5IG11c3QgYmUgb24gdGhlIHVzZXIncyBzeXN0ZW0gcGF0aC4gPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgorICA8dHI+CisgICAgPHRkPmlhc2hvbWU8L3RkPgorICAgIDx0ZD5NYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvciB0aGlzIGlBUyBpbnN0YWxsYXRpb24uICBUaGlzIGlzIHVzZWQgdG8gZmluZAorICAgICAgdGhlIDxrYmQ+ZWpiYzwva2JkPiB1dGlsaXR5IGlmIGl0IGlzbid0IGluY2x1ZGVkIGluIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguIElmIHNwZWNpZmllZCwgaXQKKyAgICAgIHNob3VsZCByZWZlciB0byB0aGUgPHNhbXA+W2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXM8L3NhbXA+IGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCB0aGUgPGtiZD5lamJjPC9rYmQ+IHV0aWxpdHkgbXVzdCBiZSBvbiB0aGUgdXNlcidzIHN5c3RlbSBwYXRoPC90ZD4KKyAgPC90cj4KIDwvdGFibGU+CiAKLTxoMz4KLUV4YW1wbGVzPC9oMz4KKzxoMz5FeGFtcGxlczwvaDM+CiAKIDxwcmU+CiAmbHQ7aXBsYW5ldC1lamJjIGVqYmRlc2NyaXB0b3I9ImVqYi1qYXIueG1sIgpAQCAtMzMwLDEyOSArMjk3LDExMSBAQAogICAgICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9Ii4iLyZndDsKICAgICAgICAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLmNsYXNzcGF0aH0iLyZndDsKICAgICAgICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0mbHQ7L2lwbGFuZXQtZWpiYyZndDsKKyZsdDsvaXBsYW5ldC1lamJjJmd0OzwvcHJlPgogCis8aHIvPgorPGgyIGlkPSJ3bHJ1biI+d2xydW48L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPC9wcmU+Cis8cD5UaGUgPGNvZGU+d2xydW48L2NvZGU+IHRhc2sgaXMgdXNlZCB0byBzdGFydCBhIFdlYkxvZ2ljIHNlcnZlci4gVGhlIHRhc2sgcnVucyBhIFdlYkxvZ2ljIGluc3RhbmNlCitpbiBhIHNlcGFyYXRlIEpWTS4gQSBudW1iZXIgb2YgcGFyYW1ldGVycyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhlIFdlYkxvZ2ljCitpbnN0YW5jZS4gTm90ZSB0aGF0IHRoZSB0YXNrLCBhbmQgaGVuY2UgQW50LCB3aWxsIG5vdCBjb21wbGV0ZSB1bnRpbCB0aGUgV2ViTG9naWMgaW5zdGFuY2UgaXMKK3N0b3BwZWQuPC9wPgogCi08aHI+Ci08aDI+PGEgbmFtZT0id2xydW4iPndscnVuPC9hPjwvaDI+Ci08aDM+PGI+RGVzY3JpcHRpb246PC9iPjwvaDM+Ci0KLTxwPlRoZSA8Y29kZT53bHJ1bjwvY29kZT4gdGFzayBpcyB1c2VkIHRvIHN0YXJ0IGEgd2VibG9naWMgc2VydmVyLiBUaGUgdGFzayBydW5zCi1hIHdlYmxvZ2ljIGluc3RhbmNlIGluIGEgc2VwYXJhdGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuIEEgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLWFyZSB1c2VkIHRvIGNvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGUgd2VibG9naWMgaW5zdGFuY2UuIE5vdGUgdGhhdCB0aGUgdGFzaywKLWFuZCBoZW5jZSBhbnQsIHdpbGwgbm90IGNvbXBsZXRlIHVudGlsIHRoZSB3ZWJsb2dpYyBpbnN0YW5jZSBpcyBzdG9wcGVkLjwvcD4KLQotPGgzPlBhcmFtZXRlcnM6PC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZCBmb3IgNC41LjEgYW5kIDUuMTwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQgZm9yIDYuMDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkIGZvciA0LjUuMSBhbmQgNS4xPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQgZm9yIDYuMDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkJFQSBIb21lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgQkVBIEhvbWUgd2hlcmUgdGhlIHNlcnZlcidzIGNvbmZpZyBpcyBkZWZpbmVkLgotICAgICAgICAgICAgICAgICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgd2xydW4gYXNzdW1lcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbAotICAgICAgICAgICAgICAgICAgICAgYmUgcnVubmluZyB1bmRlciBXZWJsb2dpYyA2LjA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPkJFQWhvbWU8L3RkPgorICAgIDx0ZD5UaGUgbG9jYXRpb24gb2YgdGhlIDx2YXI+QkVBaG9tZTwvdmFyPiB3aGVyZSB0aGUgc2VydmVyJ3MgY29uZmlnIGlzIHN0b3JlZC4gIElmIHRoaXMKKyAgICAgIGF0dHJpYnV0ZSBpcyBwcmVzZW50LCA8Y29kZT53bHJ1bjwvY29kZT4gYXNzdW1lcyB0aGF0IHRoZSBzZXJ2ZXIgd2lsbCBiZSBydW5uaW5nIHVuZGVyCisgICAgICBXZWJMb2dpYyA2LjA8L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5OL0E8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ob21lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgd2VibG9naWMgaG9tZSB0aGF0IGlzIHRvIGJlIHVzZWQuIFRoaXMgaXMgdGhlIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgICB3aGVyZSB3ZWJsb2dpYyBpcyBpbnN0YWxsZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuIE5vdGUgdGhpcyBpcyB0aGUgYWJzb2x1dGUgbG9jYXRpb24sIG5vdCByZWxhdGl2ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVBIGhvbWUuPC90ZD4KKyAgICA8dGQ+aG9tZTwvdGQ+CisgICAgPHRkPlRoZSBsb2NhdGlvbiBvZiB0aGUgV2ViTG9naWMgImhvbWUiIHdoZXJlIFdlYkxvZ2ljIGlzIGluc3RhbGxlZC48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5ZZXMuIE5vdGUgdGhpcyBpcyB0aGUgYWJzb2x1dGUgbG9jYXRpb24sIG5vdCByZWxhdGl2ZSB0byA8dmFyPkJFQWhvbWU8L3Zhcj4uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG9tYWluPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkb21haW4gdG8gd2hpY2ggdGhlIHNlcnZlciBiZWxvbmdzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+RG9tYWluPC90ZD4KKyAgICA8dGQ+VGhlIGRvbWFpbiB0byB3aGljaCB0aGUgc2VydmVyIGJlbG9uZ3MuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImNlbnRlciI+Ti9BPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aXRoIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB0aGF0IHJ1bnMgdGhlIFdlYmxvZ2ljCi0gICAgICAgICAgICAgICAgICAgICBTZXJ2ZXIuIFByaW9yIHRvIFdlYmxvZ2ljIDYuMCwgdGhpcyBpcyB0eXBpY2FsbHkgc2V0IHRvIHRoZSBXZWJsb2dpYwotICAgICAgICAgICAgICAgICAgICAgYm9vdCBjbGFzc3BhdGguIFVuZGVyIFdlYmxvZ2ljIDYuMCB0aGlzIHNob3VsZCBpbmNsdWRlIGFsbCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIHdlYmxvZ2ljIGphcnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aXRoIHRoZSBKVk0gdGhhdCBydW5zIHRoZSBXZWJMb2dpYyBTZXJ2ZXIuIFByaW9yIHRvIFdlYkxvZ2ljIDYuMCwKKyAgICAgIHRoaXMgaXMgdHlwaWNhbGx5IHNldCB0byB0aGUgV2ViTG9naWMgYm9vdCBjbGFzc3BhdGguIFVuZGVyIFdlYkxvZ2ljIDYuMCB0aGlzIHNob3VsZCBpbmNsdWRlCisgICAgICBhbGwgdGhlIFdlYkxvZ2ljIGphcnM8L3RkPgorICAgIDx0ZCBjb2xzcGFuPSIyIj5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53bGNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgd2VibG9naWMgY2xhc3NwYXRoIHVzZWQgYnkgdGhlIFdlYmxvZ2ljIFNlcnZlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KKyAgICA8dGQ+d2xjbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGUgV2ViTG9naWMgY2xhc3NwYXRoIHVzZWQgYnkgdGhlIFdlYkxvZ2ljIFNlcnZlci48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk4vQTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnRpZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHNlcnZlcidzIHByb3BlcnRpZXMgZmlsZSB3aXRoaW4gdGhlIHdlYmxvZ2ljIGhvbWUgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbnRyb2wgdGhlIHdlYmxvZ2ljIGluc3RhbmNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ti9BPC90ZD4KKyAgICA8dGQ+cHJvcGVydGllczwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIncyBwcm9wZXJ0aWVzIGZpbGUgd2l0aGluIHRoZSBXZWJMb2dpYyBob21lIGRpcmVjdG9yeSB1c2VkIHRvIGNvbnRyb2wKKyAgICAgIHRoZSBXZWJMb2dpYyBpbnN0YW5jZS48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSB3ZWJsb2dpYyBzZXJ2ZXIgd2l0aGluIHRoZSB3ZWJsb2dpYyBob21lIHdoaWNoIGlzIHRvIGJlIHJ1bi4KLSAgICAgICAgICAgICAgICAgICAgIFRoaXMgZGVmYXVsdHMgdG8gJnF1b3Q7bXlzZXJ2ZXImcXVvdDs8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIFdlYkxvZ2ljIHNlcnZlciB3aXRoaW4gdGhlIFdlYkxvZ2ljIGhvbWUgd2hpY2ggaXMgdG8gYmUgcnVuLjwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjIiPk5vOyBkZWZhdWx0cyB0byA8cT5teXNlcnZlcjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wb2xpY3k8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHNlY3VyaXR5IHBvbGljeSBmaWxlIHdpdGhpbiB0aGUgd2VibG9naWMgaG9tZSBkaXJlY3RvcnkgdGhhdAotICAgICAgICAgICAgICAgICAgICAgaXMgdG8gYmUgdXNlZC4gSWYgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgcG9saWN5IGZpbGUgPGNvZGU+d2VibG9naWMucG9saWN5PC9jb2RlPgotICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wb2xpY3k8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgc2VjdXJpdHkgcG9saWN5IGZpbGUgd2l0aGluIHRoZSBXZWJMb2dpYyBob21lIGRpcmVjdG9yeSB0aGF0IGlzIHRvIGJlCisgICAgICB1c2VkLjwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjIiPk5vOyBkZWZhdWx0cyB0byA8cT53ZWJsb2dpYy5wb2xpY3k8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1hbmFnZW1lbnQgdXNlcm5hbWUgdXNlZCB0byBtYW5hZ2UgdGhlIHNlcnZlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5OL0E8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgPHRkPlRoZSBtYW5hZ2VtZW50IHVzZXJuYW1lIHVzZWQgdG8gbWFuYWdlIHRoZSBzZXJ2ZXI8L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIiByb3dzcGFuPSIzIj5OL0E8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzZXJ2ZXIncyBtYW5hZ2VtZW50IHBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgPHRkPlRoZSBzZXJ2ZXIncyBtYW5hZ2VtZW50IHBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGtQYXNzd29yZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMCi0gICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGtleSBmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk4vQTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnBrUGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5UaGUgcHJpdmF0ZSBrZXkgcGFzc3dvcmQgc28gdGhlIHNlcnZlciBjYW4gZGVjcnlwdCB0aGUgU1NMIHByaXZhdGUga2V5IGZpbGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmp2bWFyZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QWRkaXRpb25hbCBhcmd1bWVudCBzdHJpbmcgcGFzc2VkIHRvIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSB1c2VkIHRvIHJ1biB0aGUKLSAgICAgICAgICAgICAgICAgICAgIFdlYmxvZ2ljIGluc3RhbmNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmp2bWFyZ3M8L3RkPgorICAgIDx0ZD5BZGRpdGlvbmFsIGFyZ3VtZW50IHN0cmluZyBwYXNzZWQgdG8gdGhlIEpWTSB1c2VkIHRvIHJ1biB0aGUgV2ViTG9naWMgaW5zdGFuY2UuPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53ZWJsb2dpY01haW5DbGFzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIHRoZSBtYWluIGNsYXNzIGZvciB3ZWJsb2dpYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPndlYmxvZ2ljTWFpbkNsYXNzPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIG1haW4gY2xhc3MgZm9yIFdlYkxvZ2ljPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+VGhlIHdscnVuIHRhc2sgc3VwcG9ydHMgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3dsY2xhc3NwYXRoJmd0OzwvY29kZT4KLWVsZW1lbnRzIHRvIHNldCB0aGUgcmVzcGVjdGl2ZSBjbGFzc3BhdGhzLjwvcD4KKzxwPlRoZSA8Y29kZT53bHJ1bjwvY29kZT4gdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3dsY2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gc2V0IHRoZSByZXNwZWN0aXZlIGNsYXNzcGF0aHMuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiB3bHJ1biB0byBydW4gYSBzZXJ2ZXIgdW5kZXIgV2VibG9naWMgNS4xPC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIHRoZSB1c2Ugb2YgPGNvZGU+d2xydW48L2NvZGU+IHRvIHJ1biBhIHNlcnZlciB1bmRlciBXZWJMb2dpYyA1LjE8L3A+CiAKIDxwcmU+CiAgICAgJmx0O3dscnVuIHRhc2tuYW1lPSZxdW90O215c2VydmVyJnF1b3Q7CkBAIC00NjMsMTM1NyArNDEyLDExOTYgQEAKICAgICAgICAgICAgcHJvcGVydGllcz0mcXVvdDtteXNlcnZlci9teXNlcnZlci5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKIDwvcHJlPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3Mgd2xydW4gYmVpbmcgdXNlZCB0byBydW4gdGhlIHBldHN0b3JlIHNlcnZlciB1bmRlcgotV2VibG9naWMgNi4wPC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIDxjb2RlPndscnVuPC9jb2RlPiBiZWluZyB1c2VkIHRvIHJ1biB0aGUgPHNhbXA+cGV0c3RvcmU8L3NhbXA+IHNlcnZlciB1bmRlcgorV2ViTG9naWMgNi4wPC9wPgogCiA8cHJlPgotICAgICZsdDt3bHJ1biB0YXNrbmFtZT0mcXVvdDtwZXRzdG9yZSZxdW90OwotICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5jbGFzc2VzfSZxdW90OwotICAgICAgICAgICBuYW1lPSZxdW90O3BldHN0b3JlU2VydmVyJnF1b3Q7Ci0gICAgICAgICAgIGRvbWFpbj0mcXVvdDtwZXRzdG9yZSZxdW90OwotICAgICAgICAgICBob21lPSZxdW90OyR7d2VibG9naWMuaG9tZX0mcXVvdDsKLSAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7cGV0c3RvcmVQYXNzd29yZCZxdW90OwotICAgICAgICAgICBiZWFob21lPSZxdW90OyR7YmVhLmhvbWV9JnF1b3Q7LyZndDsKLTwvcHJlPgorJmx0O3dscnVuIHRhc2tuYW1lPSZxdW90O3BldHN0b3JlJnF1b3Q7CisgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7d2VibG9naWMuY2xhc3Nlc30mcXVvdDsKKyAgICAgICBuYW1lPSZxdW90O3BldHN0b3JlU2VydmVyJnF1b3Q7CisgICAgICAgZG9tYWluPSZxdW90O3BldHN0b3JlJnF1b3Q7CisgICAgICAgaG9tZT0mcXVvdDske3dlYmxvZ2ljLmhvbWV9JnF1b3Q7CisgICAgICAgcGFzc3dvcmQ9JnF1b3Q7cGV0c3RvcmVQYXNzd29yZCZxdW90OworICAgICAgIGJlYWhvbWU9JnF1b3Q7JHtiZWEuaG9tZX0mcXVvdDsvJmd0OzwvcHJlPgogCi08aHI+Ci08aDI+PGEgbmFtZT0id2xzdG9wIj53bHN0b3A8L2E+PC9oMj4KLTxoMz48Yj5EZXNjcmlwdGlvbjo8L2I+PC9oMz4KKzxoci8+Cis8aDIgaWQ9Indsc3RvcCI+d2xzdG9wPC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPlRoZSA8Y29kZT53bHN0b3A8L2NvZGU+IHRhc2sgaXMgdXNlZCB0byBzdG9wIGEgd2VibG9naWMgaW5zdGFuY2Ugd2hpY2ggaXMKLWN1cnJlbnRseSBydW5uaW5nLiBUbyBzaHV0IGRvd24gYW4gaW5zdGFuY2UgeW91IG11c3Qgc3VwcGx5IGJvdGggYSB1c2VybmFtZSBhbmQKLWEgcGFzc3dvcmQuIFRoZXNlIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBjbGVhciBpbiB0aGUgYnVpbGQgc2NyaXB0IHVzZWQgdG8gc3RvcAotdGhlIGluc3RhbmNlLiBGb3Igc2VjdXJpdHkgcmVhc29ucywgdGhpcyB0YXNrIGlzIHRoZXJlZm9yZSBvbmx5IGFwcHJvcHJpYXRlIGluIGEKLWRldmVsb3BtZW50IGVudmlyb25tZW50LiA8L3A+Cis8cD5UaGUgPGNvZGU+d2xzdG9wPC9jb2RlPiB0YXNrIGlzIHVzZWQgdG8gc3RvcCBhIFdlYkxvZ2ljIGluc3RhbmNlIHdoaWNoIGlzIGN1cnJlbnRseSBydW5uaW5nLiBUbworc2h1dCBkb3duIGFuIGluc3RhbmNlIHlvdSBtdXN0IHN1cHBseSBib3RoIGEgdXNlcm5hbWUgYW5kIGEgcGFzc3dvcmQuIFRoZXNlIHdpbGwgYmUgc3RvcmVkIGluIHRoZQorY2xlYXIgaW4gdGhlIGJ1aWxkIHNjcmlwdCB1c2VkIHRvIHN0b3AgdGhlIGluc3RhbmNlLiBGb3Igc2VjdXJpdHkgcmVhc29ucywgdGhpcyB0YXNrIGlzIHRoZXJlZm9yZQorb25seSBhcHByb3ByaWF0ZSBpbiBhIGRldmVsb3BtZW50IGVudmlyb25tZW50LjwvcD4KIAotPHA+VGhpcyB0YXNrIHdvcmtzIGZvciBtb3N0IHZlcnNpb24gb2YgV2VibG9naWMsIGluY2x1ZGluZyA2LjAuIFlvdSBuZWVkIHRvCi1zcGVjaWZ5IHRoZSBCRUEgSG9tZSB0byBoYXZlIHRoaXMgdGFzayB3b3JrIGNvcnJlY3RseSB1bmRlciA2LjA8L3A+Cis8cD5UaGlzIHRhc2sgd29ya3MgZm9yIG1vc3QgdmVyc2lvbnMgb2YgV2ViTG9naWMsIGluY2x1ZGluZyA2LjAuIFlvdSBuZWVkIHRvIHNwZWNpZnkKK3RoZSA8dmFyPkJFQUhvbWU8L3Zhcj4gdG8gaGF2ZSB0aGlzIHRhc2sgd29yayBjb3JyZWN0bHkgdW5kZXIgNi4wPC9wPgogCi08aDM+UGFyYW1ldGVyczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5CRUFIb21lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgYXR0cmlidXRlIHNlbGVjdHMgV2VibG9naWMgNi4wIHNodXRkb3duLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPkJFQUhvbWU8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBzZWxlY3RzIFdlYkxvZ2ljIDYuMCBzaHV0ZG93bi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgd2l0aCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgdGhhdCBydW5zIHRoZSBXZWJsb2dpYwotICAgICAgICAgICAgICAgICAgICAgU2h1dGRvd24gY29tbWFuZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdpdGggdGhlIEpWTSB0aGF0IHJ1bnMgdGhlIFdlYkxvZ2ljIFNodXRkb3duIGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlcm5hbWUgb2YgdGhlIGFjY291bnQgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHNodXRkb3duIHRoZSBzZXJ2ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dXNlcjwvdGQ+CisgICAgPHRkPlRoZSB1c2VybmFtZSBvZiB0aGUgYWNjb3VudCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc2h1dGRvd24gdGhlIHNlcnZlcjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZCBmb3IgdGhlIGFjY291bnQgc3BlY2lmaWVkIGluIHRoZSB1c2VyIHBhcmFtZXRlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5UaGUgcGFzc3dvcmQgZm9yIHRoZSBhY2NvdW50IHNwZWNpZmllZCBpbiB0aGUgdXNlciBwYXJhbWV0ZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXJsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBVUkwgd2hpY2ggZGVzY3JpYmVzIHRoZSBwb3J0IHRvIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGZvciBUMyBjb25uZWN0aW9ucy4KLSAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0MzovL2xvY2FsaG9zdDo3MDAxPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnVybDwvdGQ+CisgICAgPHRkPlRoZSBVUkwgd2hpY2ggZGVzY3JpYmVzIHRoZSBwb3J0IHRvIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIGZvciBUMyBjb25uZWN0aW9ucy4gIEZvcgorICAgICAgZXhhbXBsZSwgPHNhbXA+dDM6Ly9sb2NhbGhvc3Q6NzAwMTwvc2FtcD48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWxheTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGVsYXkgaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aGUgc2VydmVyIHdpbGwgc3RvcC4gVGhpcyBkZWZhdWx0cyB0byBhbgotICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIHNodXRkb3duLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlbGF5PC90ZD4KKyAgICA8dGQ+VGhlIGRlbGF5IGluIHNlY29uZHMgYWZ0ZXIgd2hpY2ggdGhlIHNlcnZlciB3aWxsIHN0b3AuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+MDwvcT4gKGltbWVkaWF0ZSBzaHV0ZG93bik8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50PC9oMz4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08cD5UaGUgY2xhc3NwYXRoIG9mIHRoZSB3bHN0b3AgdGFzayBjYW4gYmUgc2V0IGJ5IGEgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50LjwvcD4KKzxwPlRoZSBjbGFzc3BhdGggb2YgdGhlIDxjb2RlPndsc3RvcDwvY29kZT4gdGFzayBjYW4gYmUgc2V0IGJ5IGEgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CituZXN0ZWQgZWxlbWVudC48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxwPlRoaXMgZXhhbXBsZSBzaG93IHRoZSBzaHV0ZG93biBmb3IgYSBXZWJsb2dpYyA2LjAgc2VydmVyPC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3cgdGhlIHNodXRkb3duIGZvciBhIFdlYkxvZ2ljIDYuMCBzZXJ2ZXI8L3A+CiAKIDxwcmU+Ci0gICAgJmx0O3dsc3RvcCBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5jbGFzc2VzfSZxdW90OwotICAgICAgICAgICAgdXNlcj0mcXVvdDtzeXN0ZW0mcXVvdDsKLSAgICAgICAgICAgIHVybD0mcXVvdDt0MzovL2xvY2FsaG9zdDo3MDAxJnF1b3Q7Ci0gICAgICAgICAgICBwYXNzd29yZD0mcXVvdDtmb29iYXImcXVvdDsKLSAgICAgICAgICAgIGJlYWhvbWU9JnF1b3Q7JHtiZWEuaG9tZX0mcXVvdDsvJmd0OwotPC9wcmU+CismbHQ7d2xzdG9wIGNsYXNzcGF0aD0mcXVvdDske3dlYmxvZ2ljLmNsYXNzZXN9JnF1b3Q7CisgICAgICAgIHVzZXI9JnF1b3Q7c3lzdGVtJnF1b3Q7CisgICAgICAgIHVybD0mcXVvdDt0MzovL2xvY2FsaG9zdDo3MDAxJnF1b3Q7CisgICAgICAgIHBhc3N3b3JkPSZxdW90O2Zvb2JhciZxdW90OworICAgICAgICBiZWFob21lPSZxdW90OyR7YmVhLmhvbWV9JnF1b3Q7LyZndDs8L3ByZT4KIAotPGhyPgorPGhyLz4KKzxoMiBpZD0iZWpiamFyIj5lamJqYXI8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPGgyPjxhIG5hbWU9ImVqYmphciI+ZWpiamFyPC9hPjwvaDI+Ci08aDM+PGI+RGVzY3JpcHRpb246PC9iPjwvaDM+Ci0KLTxwPlRoaXMgdGFzayBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGJ1aWxkaW5nIG9mIEVKQiBqYXIgZmlsZXMgKEVKQiAxLjEgJmFtcDsgMi4wKS4KLVN1cHBvcnQgaXMgY3VycmVudGx5IHByb3ZpZGVkIGZvciAndmFuaWxsYScgRUpCIGphciBmaWxlcyAtIGkuZS4gdGhvc2UgY29udGFpbmluZyBvbmx5Ci10aGUgdXNlciBnZW5lcmF0ZWQgY2xhc3MgZmlsZXMgYW5kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIE5lc3RlZAotZWxlbWVudHMgcHJvdmlkZSBzdXBwb3J0IGZvciB2ZW5kb3Igc3BlY2lmaWMgZGVwbG95bWVudCB0b29scy4gVGhlc2UgY3VycmVudGx5Ci1pbmNsdWRlOiA8L3A+Cis8cD5UaGlzIHRhc2sgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBidWlsZGluZyBvZiBFSkIgamFyIGZpbGVzIChFSkIgMS4xICZhbXA7IDIuMCkuICBTdXBwb3J0IGlzCitjdXJyZW50bHkgcHJvdmlkZWQgZm9yICd2YW5pbGxhJyBFSkIgamFyIGZpbGVzJm1kYXNoO2kuZS4gdGhvc2UgY29udGFpbmluZyBvbmx5IHRoZSB1c2VyIGdlbmVyYXRlZAorY2xhc3MgZmlsZXMgYW5kIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIE5lc3RlZCBlbGVtZW50cyBwcm92aWRlIHN1cHBvcnQgZm9yIHZlbmRvcgorc3BlY2lmaWMgZGVwbG95bWVudCB0b29scy4gVGhlc2UgY3VycmVudGx5IGluY2x1ZGU6PC9wPgogPHVsPgogICA8bGk+Qm9ybGFuZCBBcHBsaWNhdGlvbiBTZXJ2ZXIgNC41PC9saT4KICAgPGxpPmlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIDYuMDwvbGk+CiAgIDxsaT5KQm9zcyAyLjEgYW5kIGFib3ZlPC9saT4KLSAgPGxpPldlYmxvZ2ljIDUuMS82LjAgc2Vzc2lvbi9lbnRpdHkgYmVhbnMgdXNpbmcgdGhlIHdlYmxvZ2ljLmVqYmMgdG9vbDwvbGk+CisgIDxsaT5XZWJMb2dpYyA1LjEvNi4wIHNlc3Npb24vZW50aXR5IGJlYW5zIHVzaW5nIHRoZSA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPiB0b29sPC9saT4KICAgPGxpPklCTSBXZWJTcGhlcmUgNC4wPC9saT4KICAgPGxpPlRPUExpbmsgZm9yIFdlYkxvZ2ljIDIuNS4xLWVuYWJsZWQgZW50aXR5IGJlYW5zPC9saT4KLSAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cub2JqZWN0d2ViLm9yZy9qb25hcy8iPkpPbkFTPC9hPiAyLjQueCBhbmQgMi41IE9wZW4gU291cmNlIEVKQiBzZXJ2ZXI8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9qb25hcy5vdzIub3JnLyIgdGFyZ2V0PSJfdG9wIj5KT25BUzwvYT4gMi40LnggYW5kIDIuNSBPcGVuIFNvdXJjZSBFSkIKKyAgICBzZXJ2ZXI8L2xpPgogICA8bGk+SXJvbkZsYXJlIE9yaW9uIEFwcGxpY2F0aW9uIFNlcnZlciAyLjA8L2xpPgogPC91bD4KIAotCi08cD5UaGUgdGFzayB3b3JrcyBhcyBhIGRpcmVjdG9yeSBzY2FubmluZyB0YXNrLCBhbmQgcGVyZm9ybXMgYW4gYWN0aW9uIGZvciBlYWNoCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IgZm91bmQuIEFzIHN1Y2ggdGhlIGluY2x1ZGVzIGFuZCBleGNsdWRlcyBzaG91bGQgYmUgc2V0Ci10byBlbnN1cmUgdGhhdCBhbGwgZGVzaXJlZCBFSkIgZGVzY3JpcHRvcnMgYXJlIGZvdW5kLCBidXQgbm8gYXBwbGljYXRpb24KLXNlcnZlciBkZXNjcmlwdG9ycyBhcmUgZm91bmQuIEZvciBlYWNoIGRlc2NyaXB0b3IgZm91bmQsIGVqYmphciB3aWxsIHBhcnNlIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGRldGVybWluZSB0aGUgbmVjZXNzYXJ5IGNsYXNzIGZpbGVzIHdoaWNoIGltcGxlbWVudCB0aGUKLWJlYW4uIFRoZXNlIGZpbGVzIGFyZSBhc3NlbWJsZWQgYWxvbmcgd2l0aCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBpbnRvIGEKLXdlbGwgZm9ybWVkIEVKQiBqYXIgZmlsZS4gQW55IHN1cHBvcnQgZmlsZXMgd2hpY2ggbmVlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLWdlbmVyYXRlZCBqYXIgY2FuIGJlIGFkZGVkIHdpdGggdGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIEZvciBlYWNoCi1jbGFzcyBpbmNsdWRlZCBpbiB0aGUgamFyLCBlamJqYXIgd2lsbCBzY2FuIGZvciBhbnkgc3VwZXIgY2xhc3NlcyBvciBzdXBlcgorPHA+VGhlIHRhc2sgd29ya3MgYXMgYSBkaXJlY3Rvcnkgc2Nhbm5pbmcgdGFzaywgYW5kIHBlcmZvcm1zIGFuIGFjdGlvbiBmb3IgZWFjaCBkZXBsb3ltZW50CitkZXNjcmlwdG9yIGZvdW5kLiBBcyBzdWNoIHRoZSA8Y29kZT5pbmNsdWRlczwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiBzaG91bGQgYmUgc2V0IHRvCitlbnN1cmUgdGhhdCBhbGwgZGVzaXJlZCBFSkIgZGVzY3JpcHRvcnMgYXJlIGZvdW5kLCBidXQgbm8gYXBwbGljYXRpb24gc2VydmVyIGRlc2NyaXB0b3JzIGFyZQorZm91bmQuIEZvciBlYWNoIGRlc2NyaXB0b3IgZm91bmQsIDxjb2RlPmVqYmphcjwvY29kZT4gd2lsbCBwYXJzZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvCitkZXRlcm1pbmUgdGhlIG5lY2Vzc2FyeSBjbGFzcyBmaWxlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGJlYW4uIFRoZXNlIGZpbGVzIGFyZSBhc3NlbWJsZWQgYWxvbmcgd2l0aAordGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgaW50byBhIHdlbGwgZm9ybWVkIEVKQiBqYXIgZmlsZS4gQW55IHN1cHBvcnQgZmlsZXMgd2hpY2ggbmVlZCB0byBiZQoraW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBqYXIgY2FuIGJlIGFkZGVkIHdpdGggdGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIEZvcgorZWFjaCBjbGFzcyBpbmNsdWRlZCBpbiB0aGUgamFyLCA8Y29kZT5lamJqYXI8L2NvZGU+IHdpbGwgc2NhbiBmb3IgYW55IHN1cGVyIGNsYXNzZXMgb3Igc3VwZXIKIGludGVyZmFjZXMuIFRoZXNlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBqYXIuPC9wPgogCi08cD5JZiBubyBuZXN0ZWQgdmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZSB0YXNrIHdpbGwKLXNpbXBseSBnZW5lcmF0ZSBhIGdlbmVyaWMgRUpCIGphci4gU3VjaCBqYXJzIGFyZSB0eXBpY2FsbHkgdXNlZCBhcyB0aGUgaW5wdXQgdG8KLXZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IHRvb2xzLiBGb3IgZWFjaCBuZXN0ZWQgZGVwbG95bWVudCBlbGVtZW50LCBhIHZlbmRvcgotc3BlY2lmaWMgZGVwbG95bWVudCB0b29sIGlzIHJ1biB0byBnZW5lcmF0ZSBhIGphciBmaWxlIHJlYWR5IGZvciBkZXBsb3ltZW50IGluCi10aGF0IHZlbmRvcidzIEVKQiBjb250YWluZXIuIDwvcD4KKzxwPklmIG5vIG5lc3RlZCB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhlIHRhc2sgd2lsbCBzaW1wbHkgZ2VuZXJhdGUgYQorZ2VuZXJpYyBFSkIgamFyLiBTdWNoIGphcnMgYXJlIHR5cGljYWxseSB1c2VkIGFzIHRoZSBpbnB1dCB0byB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCB0b29scy4gRm9yCitlYWNoIG5lc3RlZCBkZXBsb3ltZW50IGVsZW1lbnQsIGEgdmVuZG9yIHNwZWNpZmljIGRlcGxveW1lbnQgdG9vbCBpcyBydW4gdG8gZ2VuZXJhdGUgYSBqYXIgZmlsZQorcmVhZHkgZm9yIGRlcGxveW1lbnQgaW4gdGhhdCB2ZW5kb3IncyBFSkIgY29udGFpbmVyLjwvcD4KIAotPHA+VGhlIGphciBmaWxlcyBhcmUgb25seSBidWlsdCBpZiB0aGV5IGFyZSBvdXQgb2YgZGF0ZS4gIEVhY2ggZGVwbG95bWVudCB0b29sCi1lbGVtZW50IHdpbGwgZXhhbWluZSBpdHMgdGFyZ2V0IGphciBmaWxlIGFuZCBkZXRlcm1pbmUgaWYgaXQgaXMgb3V0IG9mIGRhdGUgd2l0aAotcmVzcGVjdCB0byB0aGUgY2xhc3MgZmlsZXMgYW5kIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgdGhhdCBtYWtlIHVwIHRoZSBiZWFuLiBJZgotYW55IG9mIHRoZXNlIGZpbGVzIGFyZSBuZXdlciB0aGFuIHRoZSBqYXIgZmlsZSB0aGUgamFyIHdpbGwgYmUgcmVidWlsdCBvdGhlcndpc2UKLWEgbWVzc2FnZSBpcyBsb2dnZWQgdGhhdCB0aGUgamFyIGZpbGUgaXMgdXAgdG8gZGF0ZS48L3A+Cis8cD5UaGUgamFyIGZpbGVzIGFyZSBvbmx5IGJ1aWx0IGlmIHRoZXkgYXJlIG91dCBvZiBkYXRlLiAgRWFjaCBkZXBsb3ltZW50IHRvb2wgZWxlbWVudCB3aWxsIGV4YW1pbmUKK2l0cyB0YXJnZXQgamFyIGZpbGUgYW5kIGRldGVybWluZSBpZiBpdCBpcyBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gdGhlIGNsYXNzIGZpbGVzIGFuZAorZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0aGF0IG1ha2UgdXAgdGhlIGJlYW4uIElmIGFueSBvZiB0aGVzZSBmaWxlcyBhcmUgbmV3ZXIgdGhhbiB0aGUgamFyIGZpbGUgdGhlCitqYXIgd2lsbCBiZSByZWJ1aWx0IG90aGVyd2lzZSBhIG1lc3NhZ2UgaXMgbG9nZ2VkIHRoYXQgdGhlIGphciBmaWxlIGlzIHVwIHRvIGRhdGUuPC9wPgogCi08cD5UaGUgdGFzayB1c2VzIHRoZQotPGEgaHJlZj0iaHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9iY2VsLyI+QkNFTDwvYT4gPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmxpYnJhcnk8L2E+Ci10byBleHRyYWN0IGFsbCBkZXBlbmRlbnQgY2xhc3Nlcy4gVGhpcwotbWVhbnMgdGhhdCwgaW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzZXMgdGhhdCBhcmUgbWVudGlvbmVkIGluIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9yLCBhbnkgY2xhc3NlcyB0aGF0IHRoZXNlIGRlcGVuZCBvbiBhcmUgYWxzbwotYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgamFyIGZpbGUuPC9wPgorPHA+VGhlIHRhc2sgdXNlcyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvYmNlbC8iCit0YXJnZXQ9Il90b3AiPkJDRUw8L2E+IDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5saWJyYXJ5PC9hPiB0byBleHRyYWN0IGFsbAorZGVwZW5kZW50IGNsYXNzZXMuIFRoaXMgbWVhbnMgdGhhdCwgaW4gYWRkaXRpb24gdG8gdGhlIGNsYXNzZXMgdGhhdCBhcmUgbWVudGlvbmVkIGluIHRoZSBkZXBsb3ltZW50CitkZXNjcmlwdG9yLCBhbnkgY2xhc3NlcyB0aGF0IHRoZXNlIGRlcGVuZCBvbiBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBqYXIgZmlsZS48L3A+CiAKKzxoMyBpZD0ibmFtaW5nIj5OYW1pbmcgY29udmVudGlvbjwvaDM+CiAKLTxoMz5OYW1pbmcgQ29udmVudGlvbjwvaDM+Ci0KLUVqYmphciBoYW5kbGVzIHRoZSBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGJlYW5zLCBhbmQgaXQgdXNlcyBhIHNldCBvZiBuYW1pbmcKLWNvbnZlbnRpb25zIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIEVKQiBqYXJzLiBUaGUgbmFtaW5nIGNvbnZlbnRpb24KLXRoYXQgaXMgdXNlZCBpcyBjb250cm9sbGVkIGJ5IHRoZSAmcXVvdDtuYW1pbmcmcXVvdDsgYXR0cmlidXRlLiBJdCBzdXBwb3J0cyB0aGUKLWZvbGxvd2luZyB2YWx1ZXMKLTx1bD4KLQotPGxpPmRlc2NyaXB0b3I8L2xpPgotPHA+VGhpcyBpcyB0aGUgZGVmYXVsdCBuYW1pbmcgc2NoZW1lLiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGJlYW4gaXMgZGVyaXZlZCBmcm9tIHRoZQotbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAgRm9yIGFuIEFjY291bnQgYmVhbiwgZm9yIGV4YW1wbGUsIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9yIHdvdWxkIGJlIG5hbWVkIDxjb2RlPkFjY291bnQtZWpiLWphci54bWw8L2NvZGU+LiBWZW5kb3Igc3BlY2lmaWMgZGVzY3JpcHRvcnMgYXJlCi1sb2NhdGVkIHVzaW5nIHRoZSBzYW1lIG5hbWluZyBjb252ZW50aW9uLiBUaGUgd2VibG9naWMgYmVhbiwgZm9yIGV4YW1wbGUsIHdvdWxkIGJlIG5hbWVkCi08Y29kZT5BY2NvdW50LXdlYmxvZ2ljLWVqYi1qYXIueG1sPC9jb2RlPi4gVW5kZXIgdGhpcyBhcnJhbmdlbWVudCwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKKzxjb2RlPkVqYmphcjwvY29kZT4gaGFuZGxlcyB0aGUgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBiZWFucywgYW5kIGl0IHVzZXMgYSBzZXQgb2YgbmFtaW5nCitjb252ZW50aW9ucyB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBFSkIgamFycy4gVGhlIG5hbWluZyBjb252ZW50aW9uIHRoYXQgaXMgdXNlZCBpcworY29udHJvbGxlZCBieSB0aGUgPHZhcj5uYW1pbmc8L3Zhcj4gYXR0cmlidXRlLiBJdCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHZhbHVlcworPGRsPgorPGR0PjxxPmRlc2NyaXB0b3I8L3E+PC9kdD4KKzxkZD48cD5UaGlzIGlzIHRoZSBkZWZhdWx0IG5hbWluZyBzY2hlbWUuIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYmVhbiBpcyBkZXJpdmVkIGZyb20gdGhlIG5hbWUgb2YKK3RoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IuICBGb3IgYW4gPHNhbXA+QWNjb3VudDwvc2FtcD4gYmVhbiwgZm9yIGV4YW1wbGUsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKK3dvdWxkIGJlIG5hbWVkIDxzYW1wPkFjY291bnQtZWpiLWphci54bWw8L3NhbXA+LiBWZW5kb3Igc3BlY2lmaWMgZGVzY3JpcHRvcnMgYXJlIGxvY2F0ZWQgdXNpbmcgdGhlCitzYW1lIG5hbWluZyBjb252ZW50aW9uLiBUaGUgV2ViTG9naWMgYmVhbiwgZm9yIGV4YW1wbGUsIHdvdWxkIGJlCituYW1lZCA8c2FtcD5BY2NvdW50LXdlYmxvZ2ljLWVqYi1qYXIueG1sPC9zYW1wPi4gVW5kZXIgdGhpcyBhcnJhbmdlbWVudCwgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKIGNhbiBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgY29kZSBpbXBsZW1lbnRpbmcgdGhlIGJlYW5zLCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHNhbWUgYmVhbiBjb2RlCi1pcyBkZXBsb3llZCBpbiBzZXBhcmF0ZSBiZWFucy4KLTwvcD4KK2lzIGRlcGxveWVkIGluIHNlcGFyYXRlIGJlYW5zLjwvcD4KKzxwPlRoaXMgc2NoZW1lIGlzIHVzZWZ1bCB3aGVuIHlvdSBhcmUgdXNpbmcgb25lIGJlYW4gcGVyIEVKQiBqYXIgYW5kIHdoZXJlIHlvdSBtYXkgYmUgZGVwbG95aW5nIHRoZQorc2FtZSBiZWFuIGNsYXNzZXMgaW4gZGlmZmVyZW50IGJlYW5zLCB3aXRoIGRpZmZlcmVudCBkZXBsb3ltZW50IGNoYXJhY3RlcmlzdGljcy48L3A+PC9kZD4KIAotPHA+VGhpcyBzY2hlbWUgaXMgdXNlZnVsIHdoZW4geW91IGFyZSB1c2luZyBvbmUgYmVhbiBwZXIgRUpCIGphciBhbmQgd2hlcmUgeW91IG1heSBiZQotZGVwbG95aW5nIHRoZSBzYW1lIGJlYW4gY2xhc3NlcyBpbiBkaWZmZXJlbnQgYmVhbnMsIHdpdGggZGlmZmVyZW50IGRlcGxveW1lbnQgY2hhcmFjdGVyaXN0aWNzLgotCi08bGk+ZWpiLW5hbWU8L2xpPgotPHA+IFRoaXMgbmFtaW5nIHNjaGVtZSB1c2VzIHRoZSA8Y29kZT4mbHQ7ZWpiLW5hbWUmZ3Q7PC9jb2RlPiBlbGVtZW50IGZyb20gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0bwotZGV0ZXJtaW5lIHRoZSBiZWFuIG5hbWUuIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgZGVzY3JpcHRvcnMgbm9ybWFsbHkgdXNlIHRoZSBnZW5lcmljCi1kZXNjcmlwdG9yIG5hbWVzLCBzdWNoIGFzIDxjb2RlPmVqYi1qYXIueG1sPC9jb2RlPiBhbG9uZyB3aXRoIGFueSBhc3NvY2lhdGVkIHZlbmRvciBzcGVjaWZpYyBkZXNjcmlwdG9yCi1uYW1lcy4gRm9yIGV4YW1wbGUsIElmIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+Jmx0O2VqYi1uYW1lJmd0OzwvY29kZT4gd2VyZSB0byBiZSBnaXZlbiBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yCi1hcyBmb2xsb3dzOgorPGR0PjxxPmVqYi1uYW1lPC9xPjwvZHQ+Cis8ZGQ+PHA+VGhpcyBuYW1pbmcgc2NoZW1lIHVzZXMgdGhlIDxjb2RlPiZsdDtlamItbmFtZSZndDs8L2NvZGU+IGVsZW1lbnQgZnJvbSB0aGUgZGVwbG95bWVudAorZGVzY3JpcHRvciB0byBkZXRlcm1pbmUgdGhlIGJlYW4gbmFtZS4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBkZXNjcmlwdG9ycyBub3JtYWxseSB1c2UgdGhlIGdlbmVyaWMKK2Rlc2NyaXB0b3IgbmFtZXMsIHN1Y2ggYXMgPHNhbXA+ZWpiLWphci54bWw8L3NhbXA+IGFsb25nIHdpdGggYW55IGFzc29jaWF0ZWQgdmVuZG9yIHNwZWNpZmljCitkZXNjcmlwdG9yIG5hbWVzLiBGb3IgZXhhbXBsZSwgSWYgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT4mbHQ7ZWpiLW5hbWUmZ3Q7PC9jb2RlPiB3ZXJlIHRvIGJlIGdpdmVuIGluCit0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGFzIGZvbGxvd3M6PC9wPgogPHByZT4KICZsdDtlamItamFyJmd0OwogICAgICZsdDtlbnRlcnByaXNlLWJlYW5zJmd0OwogICAgICAgICAmbHQ7ZW50aXR5Jmd0OwogICAgICAgICAgICAgJmx0O2VqYi1uYW1lJmd0O1NhbXBsZSZsdDsvZWpiLW5hbWUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7aG9tZSZndDtvcmcuYXBhY2hlLmFudC5lamJzYW1wbGUuU2FtcGxlSG9tZSZsdDsvaG9tZSZndDsKLTwvcHJlPgorICAgICAgICAgICAgJmx0O2hvbWUmZ3Q7b3JnLmFwYWNoZS5hbnQuZWpic2FtcGxlLlNhbXBsZUhvbWUmbHQ7L2hvbWUmZ3Q7PC9wcmU+Cis8cD50aGVuIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYmVhbiB3b3VsZCBiZSA8c2FtcD5TYW1wbGUuamFyPC9zYW1wPjwvcD4KKzxwPlRoaXMgc2NoZW1lIGlzIHVzZWZ1bCB3aGVyZSB5b3Ugd2FudCB0byB1c2UgdGhlIHN0YW5kYXJkIGRlcGxveW1lbnQgZGVzY3JpcHRvciBuYW1lcywgd2hpY2ggbWF5CitiZSBtb3JlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBFSkIgdG9vbHMuIFRoaXMgc2NoZW1lIG11c3QgaGF2ZSBvbmUgYmVhbiBwZXIgamFyLjwvcD48L2RkPgorPGR0PjxxPmRpcmVjdG9yeTwvcT48L2R0PgorPGRkPjxwPkluIHRoaXMgbW9kZSwgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBiZWFuIGphciBpcyBkZXJpdmVkIGZyb20gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gQWdhaW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgdHlwaWNhbGx5IHVzZSB0aGUgc3RhbmRhcmQgZmlsZW5hbWVzLiBGb3IKK2V4YW1wbGUsIGlmIHRoZSBwYXRoIHRvIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKK2lzIDxzYW1wPi9ob21lL3VzZXIvZGV2L2FwcHNlcnZlci9kZC9zYW1wbGU8L3NhbXA+LCB0aGVuIHRoZSBnZW5lcmF0ZWQgYmVhbiB3aWxsIGJlCituYW1lZCA8c2FtcD5zYW1wbGUuamFyPC9zYW1wPjwvcD4KKzxwPlRoaXMgc2NoZW1lIGlzIGFsc28gdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gdXNlIHN0YW5kYXJkIHN0eWxlIGRlc2NyaXB0b3IgbmFtZXMuIEl0IGlzIG9mdGVuIG1vc3QKK3VzZWZ1bCB3aGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgbG9jYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGJlYW4gc291cmNlIGNvZGUsIGFsdGhvdWdoIHRoYXQKK2lzIG5vdCBtYW5kYXRvcnkuIFRoaXMgc2NoZW1lIGNhbiBoYW5kbGUgbXVsdGlwbGUgYmVhbnMgcGVyIGphci48L3A+PC9kZD4KIAotdGhlbiB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGJlYW4gd291bGQgYmUgPGNvZGU+U2FtcGxlLmphcjwvY29kZT4KLTwvcD4KLTxwPiBUaGlzIHNjaGVtZSBpcyB1c2VmdWwgd2hlcmUgeW91IHdhbnQgdG8gdXNlIHRoZSBzdGFuZGFyZCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgbmFtZXMsIHdoaWNoIG1heSBiZSBtb3JlCi1jb21wYXRpYmxlIHdpdGggb3RoZXIgRUpCIHRvb2xzLiBUaGlzIHNjaGVtZSBtdXN0IGhhdmUgb25lIGJlYW4gcGVyIGphci4KLTwvcD4KLTxsaT5kaXJlY3Rvcnk8L2xpPgotPHA+Ci1JbiB0aGlzIG1vZGUsIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYmVhbiBqYXIgaXMgZGVyaXZlZCBmcm9tIHRoZSBkaXJlY3RvcnkKLWNvbnRhaW5pbmcgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuIEFnYWluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIHR5cGljYWxseSB1c2UKLXRoZSBzdGFuZGFyZCBmaWxlbmFtZXMuIEZvciBleGFtcGxlLCBpZiB0aGUgcGF0aCB0byB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzCi08Y29kZT4vaG9tZS91c2VyL2Rldi9hcHBzZXJ2ZXIvZGQvc2FtcGxlPC9jb2RlPiwgdGhlbiB0aGUgZ2VuZXJhdGVkCi1iZWFuIHdpbGwgYmUgbmFtZWQgPGNvZGU+c2FtcGxlLmphcjwvY29kZT4KLTwvcD4KLTxwPgotVGhpcyBzY2hlbWUgaXMgYWxzbyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB1c2Ugc3RhbmRhcmQgc3R5bGUgZGVzY3JpcHRvciBuYW1lcy4gSXQgaXMgb2Z0ZW4KLW1vc3QgdXNlZnVsIHdoZW4gdGhlICBkZXNjcmlwdG9ycyBhcmUgbG9jYXRlZCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGJlYW4gc291cmNlIGNvZGUsCi1hbHRob3VnaCB0aGF0IGlzIG5vdCBtYW5kYXRvcnkuIFRoaXMgc2NoZW1lIGNhbiBoYW5kbGUgbXVsdGlwbGUgYmVhbnMgcGVyIGphci4KLTwvcD4KKzxkdD48cT5iYXNlamFybmFtZTwvcT48L2R0PgorPGRkPjxwPlRoZSBmaW5hbCBzY2hlbWUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT4mbHQ7ZWpiamFyJmd0OzwvY29kZT4gdGFzayBpcyB1c2VkIHdoZW4geW91IHdhbnQgdG8KK3NwZWNpZnkgdGhlIGdlbmVyYXRlZCBiZWFuIGphciBuYW1lIGRpcmVjdGx5LiBJbiB0aGlzIGNhc2UgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXIgaXMKK3NwZWNpZmllZCBieSB0aGUgPHZhcj5iYXNlamFybmFtZTwvdmFyPiBhdHRyaWJ1dGUuIFNpbmNlIGFsbCBnZW5lcmF0ZWQgYmVhbnMgd2lsbCBoYXZlIHRoZSBzYW1lCituYW1lLCB0aGlzIHRhc2sgc2hvdWxkIGJlIG9ubHkgdXNlZCB3aGVuIGVhY2ggZGVzY3JpcHRvciBpcyBpbiBpdHMgb3duIGRpcmVjdG9yeS48L3A+CiAKLTxsaT5iYXNlamFybmFtZTwvbGk+Ci08cD4KLVRoZSBmaW5hbCBzY2hlbWUgc3VwcG9ydGVkIGJ5IHRoZSA8Y29kZT4mbHQ7ZWpiamFyJmd0OzwvY29kZT4gdGFzayBpcyB1c2VkIHdoZW4geW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgZ2VuZXJhdGVkCi1iZWFuIGphciBuYW1lIGRpcmVjdGx5LiBJbiB0aGlzIGNhc2UgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBqYXIgaXMgc3BlY2lmaWVkIGJ5IHRoZQotJnF1b3Q7YmFzZWphcm5hbWUmcXVvdDsgYXR0cmlidXRlLiBTaW5jZSBhbGwgZ2VuZXJhdGVkIGJlYW5zIHdpbGwgaGF2ZSB0aGUgc2FtZSBuYW1lLCB0aGlzIHRhc2sgc2hvdWxkCi1iZSBvbmx5IHVzZWQgd2hlbiBlYWNoIGRlc2NyaXB0b3IgaXMgaW4gaXRzIG93biBkaXJlY3RvcnkuCi08L3A+Cis8cD5UaGlzIHNjaGVtZSBpcyBtb3N0IGFwcHJvcHJpYXRlIHdoZW4geW91IGFyZSB1c2luZyBtdWx0aXBsZSBiZWFucyBwZXIgamFyIGFuZCBvbmx5IHByb2Nlc3MgYQorc2luZ2xlIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gWW91IHR5cGljYWxseSB3YW50IHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGphciBhbmQgbm90IGRlcml2ZSBpdAorZnJvbSB0aGUgYmVhbnMgaW4gdGhlIGphci48L3A+PC9kZD4KKzwvZGw+CiAKLTxwPgotVGhpcyBzY2hlbWUgaXMgbW9zdCBhcHByb3ByaWF0ZSB3aGVuIHlvdSBhcmUgdXNpbmcgbXVsdGlwbGUgYmVhbnMgcGVyIGphciBhbmQgb25seSBwcm9jZXNzIGEgc2luZ2xlCi1kZXBsb3ltZW50IGRlc2NyaXB0b3IuIFlvdSB0eXBpY2FsbHkgd2FudCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBqYXIgYW5kIG5vdCBkZXJpdmUgaXQgZnJvbSB0aGUKLWJlYW5zIGluIHRoZSBqYXIuCi08L3A+Cis8aDMgaWQ9ImVqYmphcl9kZXBzIj5EZXBlbmRlbmNpZXM8L2gzPgorPHA+SW4gYWRkaXRpb24gdG8gdGhlIGJlYW4gY2xhc3NlcywgPGNvZGU+ZWpiamFyPC9jb2RlPiBpcyBhYmxlIHRvIGFkIGFkZGl0aW9uYWwgY2xhc3NlcyB0byB0aGUKK2dlbmVyYXRlZCBFSkIgamFyLiBUaGVzZSBjbGFzc2VzIGFyZSB0eXBpY2FsbHkgdGhlIHN1cHBvcnQgY2xhc3NlcyB3aGljaCBhcmUgdXNlZCBieSB0aGUgYmVhbidzCitjbGFzc2VzIG9yIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGJlYW4ncyBtZXRob2RzLjwvcD4KIAotPC91bD4KKzxwPkluIHZlcnNpb25zIG9mIEFudCBwcmlvciB0byAxLjUsIDxjb2RlPmVqYmphcjwvY29kZT4gdXNlZCByZWZsZWN0aW9uIGFuZCBhdHRlbXB0ZWQgdG8gYWRkIHRoZQorc3VwZXIgY2xhc3NlcyBhbmQgc3VwZXIgaW50ZXJmYWNlcyBvZiB0aGUgYmVhbiBjbGFzc2VzLiBGb3IgdGhpcyB0ZWNobmlxdWUgdG8gd29yayB0aGUgYmVhbiBjbGFzc2VzCitoYWQgdG8gYmUgbG9hZGVkIGludG8gQW50J3MgSlZNLiBUaGlzIHdhcyBub3QgYWx3YXlzIHBvc3NpYmxlIGR1ZSB0byBjbGFzcyBkZXBlbmRlbmNpZXMuPC9wPgogCi08YSBuYW1lPSJlamJqYXJfZGVwcyI+PGgzPkRlcGVuZGVuY2llczwvaDM+PC9hPgotPHA+SW4gYWRkaXRpb24gdG8gdGhlIGJlYW4gY2xhc3NlcywgZWpiamFyIGlzIGFibGUgdG8gYWQgYWRkaXRpb25hbCBjbGFzc2VzIHRvIHRoZSBnZW5lcmF0ZWQKLWVqYmphci4gVGhlc2UgY2xhc3NlcyBhcmUgdHlwaWNhbGx5IHRoZSBzdXBwb3J0IGNsYXNzZXMgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIGJlYW4ncyBjbGFzc2VzIG9yIGFzCi1wYXJhbWV0ZXJzIHRvIHRoZSBiZWFuJ3MgbWV0aG9kcy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNTwvZW0+IHRoZSB0YXNrIHVzZXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL2JjZWwvIgordGFyZ2V0PSJfdG9wIj5CQ0VMPC9hPiBsaWJyYXJ5IHRvIGFuYWx5emUgdGhlIGJlYW4ncyBjbGFzcyBmaWxlcyBkaXJlY3RseSwgcmF0aGVyIHRoYW4gbG9hZGluZyB0aGVtCitpbnRvIHRoZSBKVk0uIFRoaXMgYWxzbyBhbGxvd3MgPGNvZGU+ZWpiamFyPC9jb2RlPiB0byBhZGQgYWxsIG9mIHRoZSByZXF1aXJlZCBzdXBwb3J0IGNsYXNzZXMgZm9yIGEKK2JlYW4gYW5kIG5vdCBqdXN0IHN1cGVyIGNsYXNzZXMuPC9wPgogCi08cD5JbiB2ZXJzaW9ucyBvZiBBbnQgcHJpb3IgdG8gMS41LCBlamJqYXIgdXNlZCByZWZsZWN0aW9uIGFuZCBhdHRlbXB0ZWQgdG8gYWRkIHRoZSBzdXBlcgotY2xhc3NlcyBhbmQgc3VwZXIgaW50ZXJmYWNlcyBvZiB0aGUgYmVhbiBjbGFzc2VzLiBGb3IgdGhpcyB0ZWNobmlxdWUgdG8gd29yayB0aGUgYmVhbgotY2xhc3NlcyBoYWQgdG8gYmUgbG9hZGVkIGludG8gQW50J3MgSlZNLiBUaGlzIHdhcyBub3QgYWx3YXlzIHBvc3NpYmxlIGR1ZSB0byBjbGFzcyBkZXBlbmRlbmNpZXMuCi08L3A+Ci0KLTxwPlRoZSBlamJqYXIgdGFzayBpbiBBbnQgcmVsZWFzZXMgMS41IGFuZCBsYXRlciB1c2VzIHRoZQotPGEgaHJlZj0iaHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9iY2VsLyI+IEJDRUwgPC9hPiBsaWJyYXJ5Ci10byBhbmFseXplIHRoZSBiZWFuJ3MgY2xhc3MKLWZpbGVzIGRpcmVjdGx5LCByYXRoZXIgdGhhbiBsb2FkaW5nIHRoZW0gaW50byB0aGUgSlZNLiBUaGlzIGFsc28gYWxsb3dzIGVqYmphciB0byBhZGQgYWxsCi1vZiB0aGUgcmVxdWlyZWQgc3VwcG9ydCBjbGFzc2VzIGZvciBhIGJlYW4gYW5kIG5vdCBqdXN0IHN1cGVyIGNsYXNzZXMuCi08L3A+Ci0KLTxwPkluIEFudCAxLjUsIGEgbmV3IGF0dHJpYnV0ZSwgPGNvZGU+ZGVwZW5kZW5jeTwvY29kZT4gaGFzIGJlZW4gaW50cm9kdWNlZCB0byBhbGxvdyB0aGUKLWJ1aWxkZmlsZSB0byBjb250cm9sIHdoYXQgYWRkaXRpb25hbCBjbGFzc2VzIGFyZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIGphci4gSXQgdGFrZXMgdGhyZWUKLXBvc3NpYmxlIHZhbHVlczwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS41PC9lbT4sIGEgPHZhcj5kZXBlbmRlbmN5PC92YXI+IGF0dHJpYnV0ZSBhbGxvd3MgdGhlIGJ1aWxkZmlsZSB0byBjb250cm9sIHdoYXQKK2FkZGl0aW9uYWwgY2xhc3NlcyBhcmUgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZCBqYXIuIEl0IHRha2VzIHRocmVlIHBvc3NpYmxlIHZhbHVlczwvcD4KIDx1bD4KLTxsaT48Y29kZT5ub25lPC9jb2RlPiAtIG9ubHkgdGhlIGJlYW4gY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBkZXNjcmliZWQgaW4gdGhlIGJlYW4ncwotZGVzY3JpcHRvciBhcmUgYWRkZWQgdG8gdGhlIGphci48L2xpPgotPGxpPjxjb2RlPnN1cGVyPC9jb2RlPiAtIHRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUgYW5kIHJlcGxpY2F0ZXMgdGhlIG9yaWdpbmFsIGVqYmphcgotYmVoYXZpb3VyIHdoZXJlIHN1cGVyIGNsYXNzZXMgYW5kIHN1cGVyIGludGVyZmFjZXMgYXJlIGFkZGVkIHRvIHRoZSBqYXI8L2xpPgotPGxpPjxjb2RlPmZ1bGw8L2NvZGU+IC0gSW4gdGhpcyBtb2RlIGFsbCBjbGFzc2VzIHVzZWQgYnkgdGhlIGJlYW4ncyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCi1hcmUgYWRkZWQgdG8gdGhlIGphcjwvbGk+CisgIDxsaT48cT5ub25lPC9xPiZtZGFzaDtvbmx5IHRoZSBiZWFuIGNsYXNzZXMgYW5kIGludGVyZmFjZXMgZGVzY3JpYmVkIGluIHRoZSBiZWFuJ3MgZGVzY3JpcHRvciBhcmUKKyAgICBhZGRlZCB0byB0aGUgamFyLjwvbGk+CisgIDxsaT48cT5zdXBlcjwvcT4mbWRhc2g7dGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSBhbmQgcmVwbGljYXRlcyB0aGUgb3JpZ2luYWwgPGNvZGU+ZWpiamFyPC9jb2RlPgorICAgIGJlaGF2aW91ciB3aGVyZSBzdXBlciBjbGFzc2VzIGFuZCBzdXBlciBpbnRlcmZhY2VzIGFyZSBhZGRlZCB0byB0aGUgamFyPC9saT4KKyAgPGxpPjxxPmZ1bGw8L3E+Jm1kYXNoO0luIHRoaXMgbW9kZSBhbGwgY2xhc3NlcyB1c2VkIGJ5IHRoZSBiZWFuJ3MgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBhcmUgYWRkZWQKKyAgICB0byB0aGUgamFyPC9saT4KIDwvdWw+Ci08cD5UaGUgPGNvZGU+c3VwZXI8L2NvZGU+IGFuZCA8Y29kZT5mdWxsPC9jb2RlPiB2YWx1ZXMgcmVxdWlyZSB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9jb21tb25zLmFwYWNoZS5vcmcvYmNlbC8iPiBCQ0VMIDwvYT4gbGlicmFyeQotdG8gYmUgYXZhaWxhYmxlLiBJZiBpdCBpcyBub3QsIGVqYmphciB3aWxsIGRyb3AgYmFjayB0byB0aGUgYmVoYXZpb3VyIGNvcnJlc3BvbmRpbmcgdG8KLXRoZSB2YWx1ZSA8Y29kZT5ub25lPC9jb2RlPi48L3A+Cis8cD5UaGUgPHE+c3VwZXI8L3E+IGFuZCA8cT5mdWxsPC9xPiB2YWx1ZXMgcmVxdWlyZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvYmNlbC8iCit0YXJnZXQ9Il90b3AiPkJDRUw8L2E+IGxpYnJhcnkgdG8gYmUgYXZhaWxhYmxlLiBJZiBpdCBpcyBub3QsIDxjb2RlPmVqYmphcjwvY29kZT4gd2lsbCBkcm9wIGJhY2sgdG8KK3RoZSBiZWhhdmlvdXIgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgPHE+bm9uZTwvcT4uPC9wPgogCi08aDM+UGFyYW1ldGVyczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdG9yZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSB1bmRlciB3aGljaCB0byBzY2FuIGZvciBFSkIKLSAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QgYmUKLSAgICAgICAgICAgICAgICAgICAgIGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhlICdzcmNkaXInCi0gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVzY3JpcHRvcmRpcjwvdGQ+CisgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSB1bmRlciB3aGljaCB0byBzY2FuIGZvciBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBiZSBsb2NhdGVkIGluIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisgICAgICB0aGUgPHZhcj5zcmNkaXI8L3Zhcj4gYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSAuY2xhc3MgZmlsZXMgdGhhdAotICAgICAgICAgICAgICAgICAgICAgbWFrZSB1cCB0aGUgYmVhbi4gSW5jbHVkZWQgYXJlIHRoZSBob21lLSByZW1vdGUtIHBrLQotICAgICAgICAgICAgICAgICAgICAgYW5kIGltcGxlbWVudGF0aW9uLSBjbGFzc2VzIGFuZCBhbGwgY2xhc3NlcywgdGhhdCB0aGVzZQotICAgICAgICAgICAgICAgICAgICAgZGVwZW5kIG9uLiBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yZGlyIGlmIGFsbCBmaWxlcyBhcmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5Ci0gICAgICAgICAgICAgICAgICAgICB0cmVlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zcmNkaXI8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLmNsYXNzIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYmVhbi4gSW5jbHVkZWQgYXJlCisgICAgICB0aGUgPHNhbXA+aG9tZS08L3NhbXA+LCA8c2FtcD5yZW1vdGUtPC9zYW1wPiwgPHNhbXA+cGstPC9zYW1wPgorICAgICAgYW5kIDxzYW1wPmltcGxlbWVudGF0aW9uLTwvc2FtcD4gY2xhc3NlcyBhbmQgYWxsIGNsYXNzZXMgdGhhdCB0aGVzZSBkZXBlbmQgb24uIE5vdGUgdGhhdCB0aGlzCisgICAgICBjYW4gYmUgdGhlIHNhbWUgYXMgdGhlIDx2YXI+ZGVzY3JpcHRvcmRpcjwvdmFyPiBpZiBhbGwgZmlsZXMgYXJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAgICAgdHJlZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIGdlbmVyYXRlZCBqYXIgZmlsZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICBkZXBvc2l0ZWQuIEphciBmaWxlcyBhcmUgZGVwb3NpdGVkIGluIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGxvY2F0aW9uIHdpdGhpbiB0aGUgZGVzY3JpcHRvcmRpcgotICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLiBOb3RlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaXMgb25seSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgdGFzayBpcyBnZW5lcmF0aW5nIGdlbmVyaWMgamFycyAoaS5lLiBubyB2ZW5kb3Itc3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQgZWxlbWVudHMgaGF2ZSBiZWVuIHNwZWNpZmllZCkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGVsZW1lbnRzCi0gICAgaGF2ZSBiZWVuIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5kZXN0ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggZ2VuZXJhdGVkIGphciBmaWxlcyBhcmUgZGVwb3NpdGVkLiBKYXIgZmlsZXMgYXJlIGRlcG9zaXRlZCBpbgorICAgICAgZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlIDx2YXI+ZGVzY3JpcHRvcmRpcjwvdmFyPgorICAgICAgbmFtZXNwYWNlLiBOb3RlIHRoYXQgdGhpcyBhdHRyaWJ1dGUgaXMgb25seSB1c2VkIGlmIHRoZSB0YXNrIGlzIGdlbmVyYXRpbmcgZ2VuZXJpYyBqYXJzCisgICAgICAoaS5lLiBubyB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBlbGVtZW50cyBoYXZlIGJlZW4gc3BlY2lmaWVkKS48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCBlbGVtZW50cyBoYXZlIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNtcHZlcnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RWl0aGVyIDxjb2RlPjEuMDwvY29kZT4gb3IgPGNvZGU+Mi4wPC9jb2RlPi48YnI+Ci0gICAgRGVmYXVsdCBpcyA8Y29kZT4xLjA8L2NvZGU+Ljxicj4KLSAgICBBIENNUCAyLjAgaW1wbGVtZW50YXRpb24gZXhpc3RzIGN1cnJlbnRseSBvbmx5IGZvciBKQm9zcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jbXB2ZXJzaW9uPC90ZD4KKyAgICA8dGQ+RWl0aGVyIDxxPjEuMDwvcT4gb3IgPHE+Mi4wPC9xPi48YnIvPkEgQ01QIDIuMCBpbXBsZW1lbnRhdGlvbiBleGlzdHMgY3VycmVudGx5IG9ubHkgZm9yCisgICAgSkJvc3MuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+MS4wPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db250cm9scyB0aGUgbmFtaW5nIGNvbnZlbnRpb24gdXNlZCB0byBuYW1lIGdlbmVyYXRlZAotICAgICAgICAgICAgICAgICAgICAgRUpCIGphcnMuIFBsZWFzZSByZWZlciB0byB0aGUgZGVzY3JpcHRpb24gYWJvdmUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bmFtaW5nPC90ZD4KKyAgICA8dGQ+Q29udHJvbHMgdGhlIG5hbWluZyBjb252ZW50aW9uIHVzZWQgdG8gbmFtZSBnZW5lcmF0ZWQgRUpCIGphcnMuIFBsZWFzZSByZWZlciB0byB0aGUKKyAgICAgIGRlc2NyaXB0aW9uIDxhIGhyZWY9IiNuYW1pbmciPmFib3ZlPC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VqYXJuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIG5hbWUgdGhhdCBpcyB1c2VkIGZvciB0aGUgZ2VuZXJhdGVkIGphciBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhlIGdlbmVyaWMgamFyIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgd2lsbCB1c2UgdGhpcyB2YWx1ZSBhcyB0aGUgcHJlZml4IChmb2xsb3dlZCBieSB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGUgJ2dlbmVyaWNqYXJzdWZmaXgnIGF0dHJpYnV0ZSkgYW5kIHRoZQotICAgICAgICAgICAgICAgICAgICAgcmVzdWx0YW50IGVqYiBqYXIgZmlsZSAoZm9sbG93ZWQgYnkgYW55IHN1ZmZpeCBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBuZXN0ZWQgZWxlbWVudCkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YmFzZWphcm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBuYW1lIHRoYXQgaXMgdXNlZCBmb3IgdGhlIGdlbmVyYXRlZCBqYXIgZmlsZXMuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZQorICAgICAgZ2VuZXJpYyBqYXIgZmlsZSBuYW1lIHdpbGwgdXNlIHRoaXMgdmFsdWUgYXMgdGhlIHByZWZpeCAoZm9sbG93ZWQgYnkgdGhlIHZhbHVlIHNwZWNpZmllZCBpbgorICAgICAgdGhlIDx2YXI+Z2VuZXJpY2phcnN1ZmZpeDwvdmFyPiBhdHRyaWJ1dGUpIGFuZCB0aGUgcmVzdWx0YW50IEVKQiBqYXIgZmlsZSAoZm9sbG93ZWQgYnkgYW55CisgICAgICBzdWZmaXggc3BlY2lmaWVkIGluIHRoZSBuZXN0ZWQgZWxlbWVudCkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlbmFtZXRlcm1pbmF0b3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIHVzZWQgdG8gc3Vic3RyaW5nIG91dCBhIHN0cmluZyBmcm9tIHRoZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmb3VuZCwgd2hpY2ggaXMgdGhlbiB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICBsb2NhdGUgcmVsYXRlZCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIChlLmcuIHRoZSBXZWJMb2dpYwotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMpLiBGb3IgZXhhbXBsZSwgYSBiYXNlbmFtZSBvZiAnLicgYW5kIGEKLSAgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvciBjYWxsZWQgJ0Zvb0JlYW4uZWpiLWphci54bWwnIHdvdWxkCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQgaW4gYSBiYXNlbmFtZSBvZiAnRm9vQmVhbicgd2hpY2ggd291bGQgdGhlbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICB0byBmaW5kIEZvb0JlYW4ud2VibG9naWMtZWpiLWphci54bWwgYW5kCi0gICAgICAgICAgICAgICAgICAgICBGb29CZWFuLndlYmxvZ2ljLWNtcC1yZGJtcy1qYXIueG1sLCBhcyB3ZWxsIGFzIHRvIGNyZWF0ZQotICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGVuYW1lcyBvZiB0aGUgamFyIGZpbGVzIGFzIEZvb0JlYW4tZ2VuZXJpYy5qYXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICBGb29CZWFuLXdsLmphci4gVGhpcyBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAnYmFzZWphcm5hbWUnIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLScuPC90ZD4KKyAgICA8dGQ+YmFzZW5hbWV0ZXJtaW5hdG9yPC90ZD4KKyAgICA8dGQ+U3RyaW5nIHZhbHVlIHVzZWQgdG8gc3Vic3RyaW5nIG91dCBhIHN0cmluZyBmcm9tIHRoZSBuYW1lIG9mIGVhY2ggZGVwbG95bWVudCBkZXNjcmlwdG9yCisgICAgICBmb3VuZCwgd2hpY2ggaXMgdGhlbiB1c2VkIHRvIGxvY2F0ZSByZWxhdGVkIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgKGUuZy4gdGhlIFdlYkxvZ2ljCisgICAgICBkZXNjcmlwdG9ycykuIEZvciBleGFtcGxlLCBhIGJhc2VuYW1lIG9mIDxxPi48L3E+IGFuZCBhIGRlcGxveW1lbnQgZGVzY3JpcHRvcgorICAgICAgY2FsbGVkIDxzYW1wPkZvb0JlYW4uZWpiLWphci54bWw8L3NhbXA+IHdvdWxkIHJlc3VsdCBpbiBhIGJhc2VuYW1lIG9mIDxxPkZvb0JlYW48L3E+IHdoaWNoCisgICAgICB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gZmluZCA8c2FtcD5Gb29CZWFuLndlYmxvZ2ljLWVqYi1qYXIueG1sPC9zYW1wPgorICAgICAgYW5kIDxzYW1wPkZvb0JlYW4ud2VibG9naWMtY21wLXJkYm1zLWphci54bWw8L3NhbXA+LCBhcyB3ZWxsIGFzIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWVzIG9mIHRoZQorICAgICAgamFyIGZpbGVzIGFzIDxzYW1wPkZvb0JlYW4tZ2VuZXJpYy5qYXI8L3NhbXA+IGFuZCA8c2FtcD5Gb29CZWFuLXdsLmphcjwvc2FtcD4uIFRoaXMgYXR0cmlidXRlCisgICAgICBpcyBub3QgdXNlZCBpZiB0aGUgPHZhcj5iYXNlamFybmFtZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4tPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmdlbmVyaWNqYXJzdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBnZW5lcmljIEVKQiBqYXIKLSAgICAgICAgICAgICAgICAgICAgIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLWdlbmVyaWMuamFyJy48L3RkPgorICAgIDx0ZD5nZW5lcmljamFyc3VmZml4PC90ZD4KKyAgICA8dGQ+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YKKyAgICAgIHRoZSBnZW5lcmljIEVKQiBqYXIgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHEgY2xhc3M9Im5vLWJyZWFrIj4tZ2VuZXJpYy5qYXI8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgY2xhc3NwYXRoIGlzIHVzZWQgd2hlbiByZXNvbHZpbmcgY2xhc3NlcyB3aGljaAotICAgICAgICAgICAgICAgICAgICAgYXJlIHRvIGJlIGFkZGVkIHRvIHRoZSBqYXIuIFR5cGljYWxseSBuZXN0ZWQgZGVwbG95bWVudAotICAgICAgICAgICAgICAgICAgICAgdG9vbCBlbGVtZW50cyB3aWxsIGFsc28gc3VwcG9ydCBhIGNsYXNzcGF0aCB3aGljaAotICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBjb21iaW5lZCB3aXRoIHRoaXMgY2xhc3NwYXRoIHdoZW4gcmVzb2x2aW5nCi0gICAgICAgICAgICAgICAgICAgICBjbGFzc2VzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoaXMgY2xhc3NwYXRoIGlzIHVzZWQgd2hlbiByZXNvbHZpbmcgY2xhc3NlcyB3aGljaCBhcmUgdG8gYmUgYWRkZWQgdG8gdGhlIGphci4gVHlwaWNhbGx5CisgICAgICBuZXN0ZWQgZGVwbG95bWVudCB0b29sIGVsZW1lbnRzIHdpbGwgYWxzbyBzdXBwb3J0IGEgY2xhc3NwYXRoIHdoaWNoIHdpbGwgYmUgY29tYmluZWQgd2l0aCB0aGlzCisgICAgICBjbGFzc3BhdGggd2hlbiByZXNvbHZpbmcgY2xhc3NlczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhdGRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRoaXMgYXR0cmlidXRlIHRvIHRydWUgaWYgeW91IHdhbnQgYWxsIGdlbmVyYXRlZCBqYXJzCi0gICAgICAgICAgICAgICAgICAgICB0byBiZSBwbGFjZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlc3RkaXIsIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGUgZGVzY3JpcHRvciBkaXIgaGllcmFyY2h5LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICAgIDx0ZD5mbGF0ZGVzdGRpcjwvdGQ+CisgICAgICA8dGQ+U2V0IHRoaXMgYXR0cmlidXRlIHRvIDxxPnRydWU8L3E+IGlmIHlvdSB3YW50IGFsbCBnZW5lcmF0ZWQgamFycyB0byBiZSBwbGFjZWQgaW4gdGhlIHJvb3QKKyAgICAgICAgb2YgdGhlIDx2YXI+ZGVzdGRpcjwvdmFyPiwgcmF0aGVyIHRoYW4gYWNjb3JkaW5nIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgZGVwbG95bWVudAorICAgICAgICBkZXNjcmlwdG9yIHdpdGhpbiB0aGUgPHZhcj5kZXNjcmlwdG9yZGlyPC92YXI+IGhpZXJhcmNoeS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZGVuY3k8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgY29udHJvbHMgd2hpY2ggYWRkaXRpb25hbCBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzCi0gICAgICAgICAgICAgICAgICAgICBhcmUgYWRkZWQgdG8gdGhlIGphci4gUGxlYXNlIHJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iI2VqYmphcl9kZXBzIj5hYm92ZTwvYT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+ZGVwZW5kZW5jeTwvdGQ+CisgICAgPHRkPlRoaXMgYXR0cmlidXRlIGNvbnRyb2xzIHdoaWNoIGFkZGl0aW9uYWwgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBhcmUgYWRkZWQgdG8gdGhlIGphci4gUGxlYXNlCisgICAgICByZWZlciB0byB0aGUgZGVzY3JpcHRpb24gPGEgaHJlZj0iI2VqYmphcl9kZXBzIj5hYm92ZTwvYT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmlmZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZSwgaWYgYW55LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm1hbmlmZXN0PC90ZD4KKyAgICA8dGQ+dGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLCBpZiBhbnkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+SW4gYWRkaXRpb24gdG8gdGhlIHZlbmRvciBzcGVjaWZpYyBuZXN0ZWQgZWxlbWVudHMsIHRoZSBlamJqYXIgdGFzayBwcm92aWRlcwotdGhyZWUgbmVzdGVkIGVsZW1lbnRzLiA8L3A+Cis8cD5JbiBhZGRpdGlvbiB0byB0aGUgdmVuZG9yIHNwZWNpZmljIG5lc3RlZCBlbGVtZW50cywgdGhlIDxjb2RlPmVqYmphcjwvY29kZT4gdGFzayBwcm92aWRlcyB0aHJlZQorbmVzdGVkIGVsZW1lbnRzLjwvcD4KIAotPGg0PkNsYXNzcGF0aDwvaDQ+Cis8aDQ+Y2xhc3NwYXRoPC9oND4KIAotPHA+VGhlIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudCBhbGxvd3MgdGhlIGNsYXNzcGF0aAotdG8gYmUgc2V0LiBJdCBpcyB1c2VmdWwgd2hlbiBzZXR0aW5nIHRoZSBjbGFzc3BhdGggZnJvbSBhIHJlZmVyZW5jZSBwYXRoLiBJbiBhbGwKLW90aGVyIHJlc3BlY3RzIHRoZSBiZWhhdmlvdXIgaXMgdGhlIHNhbWUgYXMgdGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUuPC9wPgorPHA+VGhlIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudCBhbGxvd3MgdGhlIGNsYXNzcGF0aCB0byBiZSBzZXQuIEl0IGlzIHVzZWZ1bAord2hlbiBzZXR0aW5nIHRoZSBjbGFzc3BhdGggZnJvbSBhIHJlZmVyZW5jZSBwYXRoLiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMgdGhlIGJlaGF2aW91ciBpcyB0aGUgc2FtZSBhcwordGhlIGNsYXNzcGF0aCBhdHRyaWJ1dGUuPC9wPgogCi08YSBuYW1lPSJlamJqYXItZHRkIj48aDQ+ZHRkPC9oND48L2E+Cis8aDQgaWQ9ImVqYmphci1kdGQiPmR0ZDwvaDQ+CiAKLTxwPlRoZSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2FsIGxvY2F0aW9uIG9mIERURHMgdG8gYmUKLXVzZWQgd2hlbiBwYXJzaW5nIHRoZSBFSkIgZGVwbG95bWVudCBkZXNjcmlwdG9yLiBVc2luZyBhIGxvY2FsIERURCBpcyBtdWNoCi1mYXN0ZXIgdGhhbiBsb2FkaW5nIHRoZSBEVEQgYWNyb3NzIHRoZSBuZXQuIElmIHlvdSBhcmUgcnVubmluZyBlamJqYXIgYmVoaW5kIGEKLWZpcmV3YWxsIHlvdSBtYXkgbm90IGV2ZW4gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHJlbW90ZSBEVEQuIFRoZSBzdXBwb3J0ZWQKLXZlbmRvci1zcGVjaWZpYyBuZXN0ZWQgZWxlbWVudHMga25vdyB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcXVpcmVkIERURHMgd2l0aGluCi10aGUgdmVuZG9yIGNsYXNzIGhpZXJhcmNoeSBhbmQsIGluIGdlbmVyYWwsIHRoaXMgbWVhbnMgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZQotbm90IHJlcXVpcmVkLiBJdCBkb2VzIG1lYW4sIGhvd2V2ZXIsIHRoYXQgdGhlIHZlbmRvcidzIGNsYXNzIGhpZXJhcmNoeSBtdXN0IGJlCi1hdmFpbGFibGUgaW4gdGhlIGNsYXNzcGF0aCB3aGVuIEFudCBpcyBzdGFydGVkLiBJZiB5b3VyIHdhbnQgdG8gcnVuIEFudCB3aXRob3V0Ci1yZXF1aXJpbmcgdGhlIHZlbmRvciBjbGFzc2VzIGluIHRoZSBjbGFzc3BhdGgsIHlvdSB3b3VsZCBuZWVkIHRvIHVzZSBhCi08Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Cis8cD5UaGUgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhbCBsb2NhdGlvbiBvZiBEVERzIHRvIGJlIHVzZWQKK3doZW4gcGFyc2luZyB0aGUgRUpCIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVXNpbmcgYSBsb2NhbCBEVEQgaXMgbXVjaCBmYXN0ZXIgdGhhbiBsb2FkaW5nIHRoZSBEVEQKK2Fjcm9zcyB0aGUgbmV0LiBJZiB5b3UgYXJlIHJ1bm5pbmcgPGNvZGU+ZWpiamFyPC9jb2RlPiBiZWhpbmQgYSBmaXJld2FsbCB5b3UgbWF5IG5vdCBldmVuIGJlIGFibGUgdG8KK2FjY2VzcyB0aGUgcmVtb3RlIERURC4gVGhlIHN1cHBvcnRlZCB2ZW5kb3Itc3BlY2lmaWMgbmVzdGVkIGVsZW1lbnRzIGtub3cgdGhlIGxvY2F0aW9uIG9mIHRoZQorcmVxdWlyZWQgRFREcyB3aXRoaW4gdGhlIHZlbmRvciBjbGFzcyBoaWVyYXJjaHkgYW5kLCBpbiBnZW5lcmFsLCB0aGlzIG1lYW5zIDxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPgorZWxlbWVudHMgYXJlIG5vdCByZXF1aXJlZC4gSXQgZG9lcyBtZWFuLCBob3dldmVyLCB0aGF0IHRoZSB2ZW5kb3IncyBjbGFzcyBoaWVyYXJjaHkgbXVzdCBiZQorYXZhaWxhYmxlIGluIHRoZSBjbGFzc3BhdGggd2hlbiBBbnQgaXMgc3RhcnRlZC4gSWYgeW91ciB3YW50IHRvIHJ1biBBbnQgd2l0aG91dCByZXF1aXJpbmcgdGhlIHZlbmRvcgorY2xhc3NlcyBpbiB0aGUgY2xhc3NwYXRoLCB5b3Ugd291bGQgbmVlZCB0byB1c2UgYSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudC48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHVibGljSWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHB1YmxpYyBJZCBvZiB0aGUgRFREIGZvciB3aGljaCB0aGUgbG9jYXRpb24gaXMgYmVpbmcgcHJvdmlkZWQ8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+cHVibGljSWQ8L3RkPgorICAgIDx0ZD5UaGUgcHVibGljIElkIG9mIHRoZSBEVEQgZm9yIHdoaWNoIHRoZSBsb2NhdGlvbiBpcyBiZWluZyBwcm92aWRlZDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgbG9jYWwgY29weSBvZiB0aGUgRFRELiBUaGlzIGNhbiBlaXRoZXIgYmUgYQotICAgICAgICAgICAgICAgICAgICAgZmlsZSBvciBhIHJlc291cmNlIGxvYWRhYmxlIGZyb20gdGhlIGNsYXNzcGF0aC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bG9jYXRpb248L3RkPgorICAgIDx0ZD5UaGUgbG9jYXRpb24gb2YgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIERURC4gVGhpcyBjYW4gZWl0aGVyIGJlIGEgZmlsZSBvciBhIHJlc291cmNlIGxvYWRhYmxlCisgICAgICBmcm9tIHRoZSBjbGFzc3BhdGguPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5zdXBwb3J0PC9oND4KIAotPHA+VGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgaXMgdXNlZCB0byBzdXBwbHkgYWRkaXRpb25hbCBjbGFzc2VzCi0oZmlsZXMpIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgamFycy4gVGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gZWxlbWVudCBpcyBhCi08YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LCBzbyBpdCBjYW4gZWl0aGVyIHJlZmVyZW5jZSBhIGZpbGVzZXQgZGVjbGFyZWQgZWxzZXdoZXJlIG9yIGl0IGNhbiBiZQotZGVmaW5lZCBpbi1wbGFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IG5lc3RlZAotZWxlbWVudHMuIFRoZSBmaWxlcyBpbiB0aGUgc3VwcG9ydCBmaWxlc2V0IGFyZSBhZGRlZCBpbnRvIHRoZSBnZW5lcmF0ZWQgRUpCIGphcgotaW4gdGhlIHNhbWUgcmVsYXRpdmUgbG9jYXRpb24gYXMgdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSBzdXBwb3J0IGZpbGVzZXQuIE5vdGUKLXRoYXQgd2hlbiBlamJqYXIgZ2VuZXJhdGVzIG1vcmUgdGhhbiBvbmUgamFyIGZpbGUsIHRoZSBzdXBwb3J0IGZpbGVzIGFyZSBhZGRlZAotdG8gZWFjaCBvbmUuPC9wPgorPHA+VGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgaXMgdXNlZCB0byBzdXBwbHkgYWRkaXRpb25hbCBjbGFzc2VzIChmaWxlcykgdG8KK2JlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgamFycy4gVGhlIDxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gZWxlbWVudCBpcworYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LCBzbyBpdCBjYW4gZWl0aGVyIHJlZmVyZW5jZSBhIGZpbGVzZXQgZGVjbGFyZWQKK2Vsc2V3aGVyZSBvciBpdCBjYW4gYmUgZGVmaW5lZCBpbi1wbGFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudHMuIFRoZSBmaWxlcyBpbiB0aGUgc3VwcG9ydCBmaWxlc2V0IGFyZSBhZGRlZCBpbnRvCit0aGUgZ2VuZXJhdGVkIEVKQiBqYXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgbG9jYXRpb24gYXMgdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSBzdXBwb3J0CitmaWxlc2V0LiBOb3RlIHRoYXQgd2hlbiA8Y29kZT5lamJqYXI8L2NvZGU+IGdlbmVyYXRlcyBtb3JlIHRoYW4gb25lIGphciBmaWxlLCB0aGUgc3VwcG9ydCBmaWxlcyBhcmUKK2FkZGVkIHRvIGVhY2ggb25lLjwvcD4KIAogPGgzPlZlbmRvci1zcGVjaWZpYyBkZXBsb3ltZW50IGVsZW1lbnRzPC9oMz4KIAotRWFjaCB2ZW5kb3Itc3BlY2lmaWMgbmVzdGVkIGVsZW1lbnQgY29udHJvbHMgdGhlIGdlbmVyYXRpb24gb2YgYSBkZXBsb3lhYmxlIGphcgotc3BlY2lmaWMgdG8gdGhhdCB2ZW5kb3IncyBFSkIgY29udGFpbmVyLiBUaGUgcGFyYW1ldGVycyBmb3IgZWFjaCBzdXBwb3J0ZWQKLWRlcGxveW1lbnQgZWxlbWVudCBhcmUgZGV0YWlsZWQgaGVyZS4KKzxwPkVhY2ggdmVuZG9yLXNwZWNpZmljIG5lc3RlZCBlbGVtZW50IGNvbnRyb2xzIHRoZSBnZW5lcmF0aW9uIG9mIGEgZGVwbG95YWJsZSBqYXIgc3BlY2lmaWMgdG8gdGhhdAordmVuZG9yJ3MgRUpCIGNvbnRhaW5lci4gVGhlIHBhcmFtZXRlcnMgZm9yIGVhY2ggc3VwcG9ydGVkIGRlcGxveW1lbnQgZWxlbWVudCBhcmUgZGV0YWlsZWQgaGVyZS48L3A+CiAKKzxoMyBpZD0iZWpiamFyX2pib3NzIj5KYm9zcyBlbGVtZW50PC9oMz4KIAotPGgzPjxhIG5hbWU9ImVqYmphcl9qYm9zcyI+SmJvc3MgZWxlbWVudDwvYT48L2gzPgotCi08cD5UaGUgamJvc3MgZWxlbWVudCBzZWFyY2hlcyBmb3IgdGhlIEpCb3NzIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIGFkZHMgdGhlbQotdG8gdGhlIGZpbmFsIGVqYiBqYXIgZmlsZS4gSkJvc3MgaGFzIHR3byBkZXBsb3ltZW50IGRlc2NyaXB0b3JzOgotPHVsPjxsaT5qYm9zcy54bWw8L2xpPgotPGxpPmZvciBjb250YWluZXIgbWFuYWdlciBwZXJzaXN0ZW5jZTo8YnI+Ci08dGFibGUgYm9yZGVyPSIxIj4KLTx0cj48dGQ+PGI+Q01QIHZlcnNpb248L2I+PC90ZD48dGQ+PGI+RmlsZSBuYW1lPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+Q01QIDEuMDwvdGQ+PHRkPmphd3MueG1sPC90ZD48L3RyPgotPHRyPjx0ZD5DTVAgMi4wPC90ZD48dGQ+amJvc3NjbXAtamRiYy54bWw8L3RkPjwvdHI+Ci08L3RhYmxlPgotPC9saT4KKzxwPlRoZSA8Y29kZT5qYm9zczwvY29kZT4gZWxlbWVudCBzZWFyY2hlcyBmb3IgdGhlIEpCb3NzIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kIGFkZHMKK3RoZW0gdG8gdGhlIGZpbmFsIEVKQiBqYXIgZmlsZS4gSkJvc3MgaGFzIHR3byBkZXBsb3ltZW50IGRlc2NyaXB0b3JzOjwvcD4KKzx1bD4KKyAgPGxpPjxzYW1wPmpib3NzLnhtbDwvc2FtcD48L2xpPgorICA8bGk+Zm9yIGNvbnRhaW5lciBtYW5hZ2VyIHBlcnNpc3RlbmNlOgorICAgIDx0YWJsZT4KKyAgICAgIDx0cj48dGggc2NvcGU9ImNvbCI+Q01QIHZlcnNpb248L3RoPjx0aCBzY29wZT0iY29sIj5GaWxlIG5hbWU8L3RoPjwvdHI+CisgICAgICA8dHI+PHRkPkNNUCAxLjA8L3RkPjx0ZD48c2FtcD5qYXdzLnhtbDwvc2FtcD48L3RkPjwvdHI+CisgICAgICA8dHI+PHRkPkNNUCAyLjA8L3RkPjx0ZD48c2FtcD5qYm9zc2NtcC1qZGJjLnhtbDwvc2FtcD48L3RkPjwvdHI+CisgICAgPC90YWJsZT4KKyAgPC9saT4KIDwvdWw+Ci08YnI+Ci0uIFRoZSBKQm9zcyBzZXJ2ZXIgdXNlcyBob3QgZGVwbG95bWVudCBhbmQgZG9lcwotbm90IHJlcXVpcmUgY29tcGlsYXRpb24gb2YgYWRkaXRpb25hbCBzdHVicyBhbmQgc2tlbGV0b25zLjwvcD4KKzxwPlRoZSBKQm9zcyBzZXJ2ZXIgdXNlcyBob3QgZGVwbG95bWVudCBhbmQgZG9lcyBub3QgcmVxdWlyZSBjb21waWxhdGlvbiBvZiBhZGRpdGlvbmFsIHN0dWJzIGFuZAorc2tlbGV0b25zLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgd2VibG9naWMgcmVhZHkKLSAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlcyBhcmUgZGVwb3NpdGVkLiBKYXIgZmlsZXMgYXJlIGRlcG9zaXRlZCBpbgotICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yZGlyIG5hbWVzcGFjZS4gPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3RkaXI8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIEpCb3NzIHJlYWR5IGphciBmaWxlcyBhcmUgZGVwb3NpdGVkLiBKYXIgZmlsZXMKKyAgICAgIGFyZSBkZXBvc2l0ZWQgaW4gZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4KKyAgICAgIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj4gbmFtZXNwYWNlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmdlbmVyaWNqYXJzdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBnZW5lcmljIGphciBpcyBnZW5lcmF0ZWQgYXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgaW4KLSAgICAgICAgICAgICAgICAgICAgIGJ1aWxkIHRoZSB3ZWJsb2dpYyBkZXBsb3ltZW50IGphci4gVGhlIHN1ZmZpeCB1c2VkIHRvCi0gICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSB0aGUgZ2VuZXJpYyBqYXIgZmlsZSBpcyBub3QgcGFydGljdWxhcmx5Ci0gICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdW5sZXNzIGl0IGlzIGRlc2lyZWQgdG8ga2VlcCB0aGUgZ2VuZXJpYwotICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGUuIEl0IHNob3VsZCBub3QsIGhvd2V2ZXIsIGJlIHRoZSBzYW1lCi0gICAgICAgICAgICAgICAgICAgICBhcyB0aGUgc3VmZml4IHNldHRpbmcuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLWdlbmVyaWMuamFyJy48L3RkPgorICAgIDx0ZD5nZW5lcmljamFyc3VmZml4PC90ZD4KKyAgICA8dGQ+QSBnZW5lcmljIGphciBpcyBnZW5lcmF0ZWQgYXMgYW4gaW50ZXJtZWRpYXRlIHN0ZXAgaW4gYnVpbGQgdGhlIEpCb3NzIGRlcGxveW1lbnQgamFyLiBUaGUKKyAgICAgIHN1ZmZpeCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBnZW5lcmljIGphciBmaWxlIGlzIG5vdCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHVubGVzcyBpdCBpcworICAgICAgZGVzaXJlZCB0byBrZWVwIHRoZSBnZW5lcmljIGphciBmaWxlLiBJdCBzaG91bGQgbm90LCBob3dldmVyLCBiZSB0aGUgc2FtZSBhcyB0aGUgc3VmZml4CisgICAgICBzZXR0aW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cSBjbGFzcz0ibm8tYnJlYWsiPi1nZW5lcmljLmphcjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBKQm9zcyBFSkIKLSAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gJy5qYXInLjwvdGQ+CisgICAgPHRkPnN1ZmZpeDwvdGQ+CisgICAgPHRkPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgYmFzZW5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mCisgICAgICB0aGUgSkJvc3MgRUpCIGphciBmaWxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4uamFyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBnZW5lcmljPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgZ2VuZXJpYyBmaWxlIHVzZWQgYXMgaW5wdXQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGVqYmMgaXMgcmV0YWluZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPmtlZXBnZW5lcmljPC90ZD4KKyAgICA8dGQ+VGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSBnZW5lcmljIGZpbGUgdXNlZCBhcyBpbnB1dCB0byA8a2JkPmVqYmM8L2tiZD4gaXMgcmV0YWluZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCis8aDMgaWQ9ImVqYmphcl93ZWJsb2dpYyI+V2ViTG9naWMgZWxlbWVudDwvaDM+CiAKLTxoMz48YSBuYW1lPSJlamJqYXJfd2VibG9naWMiPldlYmxvZ2ljIGVsZW1lbnQ8L2E+PC9oMz4KKzxwPlRoZSA8Y29kZT53ZWJsb2dpYzwvY29kZT4gZWxlbWVudCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIDxjb2RlPndlYmxvZ2ljLmVqYmM8L2NvZGU+IGNvbXBpbGVyIGZvcgorZ2VuZXJhdGluZyBXZWJMb2dpYyBFSkIgamFycy4gUHJpb3IgdG8gQW50IDEuMywgdGhlIG1ldGhvZCBvZiBsb2NhdGluZyBDTVAgZGVzY3JpcHRvcnMgd2FzIHRvIHVzZQordGhlIDxjb2RlPmVqYmphcjwvY29kZT4gbmFtaW5nIGNvbnZlbnRpb24uIFNvIGlmIHlvdXIgRUpCIGphciB3YXMKK2NhbGxlZCwgPHNhbXA+Q3VzdG9tZXItZWpiLWphci54bWw8L3NhbXA+LCB5b3VyIFdlYkxvZ2ljIGRlc2NyaXB0b3Igd2FzCitjYWxsZWQgPHNhbXA+Q3VzdG9tZXItd2VibG9naWMtZWpiLWphci54bWw8L3NhbXA+IGFuZCB5b3VyIENNUCBkZXNjcmlwdG9yIGhhZCB0bworYmUgPHNhbXA+Q3VzdG9tZXItd2VibG9naWMtY21wLXJkYm1zLWphci54bWw8L3NhbXA+LiBJbiBhZGRpdGlvbiwKK3RoZSA8Y29kZT4mbHQ7dHlwZS1zdG9yYWdlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgV2ViTG9naWMgZGVzY3JpcHRvciBoYWQgdG8gYmUgc2V0IHRvIHRoZQorc3RhbmRhcmQgbmFtZSA8c2FtcD5NRVRBLUlORi93ZWJsb2dpYy1jbXAtcmRibXMtamFyLnhtbDwvc2FtcD4sIGFzIHRoYXQgaXMgd2hlcmUgdGhlIENNUCBkZXNjcmlwdG9yCit3YXMgbWFwcGVkIHRvIGluIHRoZSBnZW5lcmF0ZWQgamFyLjwvcD4KIAotPHA+VGhlIHdlYmxvZ2ljIGVsZW1lbnQgaXMgdXNlZCB0byBjb250cm9sIHRoZSB3ZWJsb2dpYy5lamJjIGNvbXBpbGVyIGZvcgotZ2VuZXJhdGluZyB3ZWJsb2dpYyBFSkIgamFycy4gUHJpb3IgdG8gQW50IDEuMywgdGhlIG1ldGhvZCBvZiBsb2NhdGluZyBDTVAKLWRlc2NyaXB0b3JzIHdhcyB0byB1c2UgdGhlIGVqYmphciBuYW1pbmcgY29udmVudGlvbi4gU28gaWYgeW91ciBlamItamFyIHdhcwotY2FsbGVkLCBDdXN0b21lci1lamItamFyLnhtbCwgeW91ciB3ZWJsb2dpYyBkZXNjcmlwdG9yIHdhcyBjYWxsZWQgQ3VzdG9tZXItCi13ZWJsb2dpYy1lamItamFyLnhtbCBhbmQgeW91ciBDTVAgZGVzY3JpcHRvciBoYWQgdG8gYmUgQ3VzdG9tZXItd2VibG9naWMtY21wLQotcmRibXMtamFyLnhtbC4gSW4gYWRkaXRpb24sIHRoZSA8Y29kZT4mbHQ7dHlwZS1zdG9yYWdlJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgd2VibG9naWMKLWRlc2NyaXB0b3IgaGFkIHRvIGJlIHNldCB0byB0aGUgc3RhbmRhcmQgbmFtZSBNRVRBLUlORi93ZWJsb2dpYy1jbXAtcmRibXMtCi1qYXIueG1sLCBhcyB0aGF0IGlzIHdoZXJlIHRoZSBDTVAgZGVzY3JpcHRvciB3YXMgbWFwcGVkIHRvIGluIHRoZSBnZW5lcmF0ZWQKLWphci48L3A+Cis8cD5UaGVyZSBhcmUgYSBmZXcgcHJvYmxlbXMgd2l0aCB0aGlzIHNjaGVtZS4gSXQgZG9lcyBub3QgYWxsb3cgZm9yIG1vcmUgdGhhbiBvbmUgQ01QIGRlc2NyaXB0b3IgdG8KK2JlIGRlZmluZWQgaW4gYSBqYXIgYW5kIGl0IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgZ2VuZXJhdGVkIGJ5IHNvbWUKK3Rvb2xzLjwvcD4KIAotPHA+VGhlcmUgYXJlIGEgZmV3IHByb2JsZW1zIHdpdGggdGhpcyBzY2hlbWUuIEl0IGRvZXMgbm90IGFsbG93IGZvciBtb3JlIHRoYW4KLW9uZSBDTVAgZGVzY3JpcHRvciB0byBiZSBkZWZpbmVkIGluIGEgamFyIGFuZCBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZQotZGVwbG95bWVudCBkZXNjcmlwdG9ycyBnZW5lcmF0ZWQgYnkgc29tZSB0b29scy48L3A+Cis8cD5JbiBBbnQgMS4zLCA8Y29kZT5lamJqYXI8L2NvZGU+IHBhcnNlcyB0aGUgV2ViTG9naWMgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGRpc2NvdmVyIHRoZSBDTVAKK2Rlc2NyaXB0b3JzLCB3aGljaCBhcmUgdGhlbiBpbmNsdWRlZCBhdXRvbWF0aWNhbGx5LiBUaGlzIGJlaGF2aW91ciBpcyBjb250cm9sbGVkIGJ5Cit0aGUgPHZhcj5uZXdDTVA8L3Zhcj4gYXR0cmlidXRlLiBOb3RlIHRoYXQgaWYgeW91IG1vdmUgdG8gdGhlIG5ldyBtZXRob2Qgb2YgZGV0ZXJtaW5pbmcgQ01QCitkZXNjcmlwdG9ycywgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgeW91ciBXZWJMb2dpYyBkZXBsb3ltZW50CitkZXNjcmlwdG9yJ3MgPGNvZGU+Jmx0O3R5cGUtc3RvcmFnZSZndDs8L2NvZGU+IGVsZW1lbnQuIEluIHRoZSBhYm92ZSBleGFtcGxlLCB5b3Ugd291bGQgZGVmaW5lIHRoaXMKK2FzIDxzYW1wPk1FVEEtSU5GL0N1c3RvbWVyLXdlYmxvZ2ljLWNtcC1yZGJtcy1qYXIueG1sPC9zYW1wPi48L3A+CiAKLTxwPkluIEFudCAxLjMsIGVqYmphciBwYXJzZXMgdGhlIHdlYmxvZ2ljIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBkaXNjb3ZlciB0aGUKLUNNUCBkZXNjcmlwdG9ycywgd2hpY2ggYXJlIHRoZW4gaW5jbHVkZWQgYXV0b21hdGljYWxseS4gVGhpcyBiZWhhdmlvdXIgaXMKLWNvbnRyb2xsZWQgYnkgdGhlIG5ld0NNUCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCBpZiB5b3UgbW92ZSB0byB0aGUgbmV3IG1ldGhvZCBvZgotZGV0ZXJtaW5pbmcgQ01QIGRlc2NyaXB0b3JzLCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyIHdlYmxvZ2ljIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IncyA8Y29kZT4mbHQ7dHlwZS1zdG9yYWdlJmd0OzwvY29kZT4gZWxlbWVudC4gSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHlvdSB3b3VsZAotZGVmaW5lIHRoaXMgYXMgTUVUQS1JTkYvQ3VzdG9tZXItd2VibG9naWMtY21wLXJkYm1zLWphci54bWwuPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCB3ZWJsb2dpYyByZWFkeQotICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQuIEphciBmaWxlcyBhcmUgZGVwb3NpdGVkIGluCi0gICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGxvY2F0aW9uIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JkaXIgbmFtZXNwYWNlLiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgV2ViTG9naWMgcmVhZHkgamFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQuIEphcgorICAgICAgZmlsZXMgYXJlIGRlcG9zaXRlZCBpbiBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGxvY2F0aW9uIHdpdGhpbgorICAgICAgdGhlIDx2YXI+ZGVzY3JpcHRvcmRpcjwvdmFyPiBuYW1lc3BhY2UuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Z2VuZXJpY2phcnN1ZmZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIGdlbmVyaWMgamFyIGlzIGdlbmVyYXRlZCBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCBpbgotICAgICAgICAgICAgICAgICAgICAgYnVpbGQgdGhlIHdlYmxvZ2ljIGRlcGxveW1lbnQgamFyLiBUaGUgc3VmZml4IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIHRoZSBnZW5lcmljIGphciBmaWxlIGlzIG5vdCBwYXJ0aWN1bGFybHkKLSAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFudCB1bmxlc3MgaXQgaXMgZGVzaXJlZCB0byBrZWVwIHRoZSBnZW5lcmljCi0gICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZS4gSXQgc2hvdWxkIG5vdCwgaG93ZXZlciwgYmUgdGhlIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBzdWZmaXggc2V0dGluZy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICctZ2VuZXJpYy5qYXInLjwvdGQ+CisgICAgPHRkPmdlbmVyaWNqYXJzdWZmaXg8L3RkPgorICAgIDx0ZD5BIGdlbmVyaWMgamFyIGlzIGdlbmVyYXRlZCBhcyBhbiBpbnRlcm1lZGlhdGUgc3RlcCBpbiBidWlsZCB0aGUgV2ViTG9naWMgZGVwbG95bWVudCBqYXIuIFRoZQorICAgICAgc3VmZml4IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdlbmVyaWMgamFyIGZpbGUgaXMgbm90IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgdW5sZXNzIGl0IGlzCisgICAgICBkZXNpcmVkIHRvIGtlZXAgdGhlIGdlbmVyaWMgamFyIGZpbGUuIEl0IHNob3VsZCBub3QsIGhvd2V2ZXIsIGJlIHRoZSBzYW1lIGFzIHRoZSBzdWZmaXgKKyAgICAgIHNldHRpbmcuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxIGNsYXNzPSJuby1icmVhayI+LWdlbmVyaWMuamFyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIGJhc2VuYW1lIG9mIHRoZSBkZXBsb3ltZW50Ci0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YgdGhlIFdlYkxvZ2ljIEVKQgotICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAnLmphcicuPC90ZD4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGUgZmlsZW5hbWUgb2YKKyAgICAgIHRoZSBXZWJMb2dpYyBFSkIgamFyIGZpbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPi5qYXI8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHJ1bm5pbmcgdGhlIHdlYmxvZ2ljIGVqYmMKLSAgICAgICAgICAgICAgICAgICAgIHRvb2wuIE5vdGUgdGhhdCB0aGlzIHRvb2wgdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSBjbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgICB0aGF0IG1ha2UgdXAgdGhlIGJlYW4gdG8gYmUgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHksIGhvd2V2ZXIsIHRoaXMgd2lsbCBjYXVzZSB0aGUgZWpiYyB0b29sIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICBydW4gaW4gYSBzZXBhcmF0ZSBWTTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIHdoZW4gcnVubmluZyB0aGUgV2ViTG9naWMgPGtiZD5lamJjPC9rYmQ+IHRvb2wuIE5vdGUgdGhhdCB0aGlzCisgICAgICAgIHRvb2wgdHlwaWNhbGx5IHJlcXVpcmVzIHRoZSBjbGFzc2VzIHRoYXQgbWFrZSB1cCB0aGUgYmVhbiB0byBiZSBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgQ3VycmVudGx5LCBob3dldmVyLCB0aGlzIHdpbGwgY2F1c2UgdGhlIDxrYmQ+ZWpiYzwva2JkPiB0b29sIHRvIGJlIHJ1biBpbiBhIHNlcGFyYXRlCisgICAgICAgIEpWTTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2xjbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2VibG9naWMgNi4wIHdpbGwgZ2l2ZSBhIHdhcm5pbmcgaWYgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzCi0gICAgICAgICAgICAgICAgICAgICBvZiBhIGJlYW4gYXJlIG9uIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIHVzZWQgdG8gcnVuIHdlYmxvZ2ljLmVqYmMuCi0gICAgICAgICAgICAgICAgICAgICBJbiB0aGF0IGNhc2UsIHRoZSBzdGFuZGFyZCB3ZWJsb2dpYyBjbGFzc2VzIHNob3VsZCBiZSBzZXQgd2l0aAotICAgICAgICAgICAgICAgICAgICAgdGhpcyBhdHRyaWJ1dGUgKG9yIGVxdWl2YWxlbnQgbmVzdGVkIGVsZW1lbnQpIGFuZCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGxvY2F0ZWQgd2l0aCB0aGUgc3RhbmRhcmQgY2xhc3NwYXRoCi0gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD53bGNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPldlYkxvZ2ljIDYuMCB3aWxsIGdpdmUgYSB3YXJuaW5nIGlmIHRoZSBob21lIGFuZCByZW1vdGUgaW50ZXJmYWNlcyBvZiBhIGJlYW4gYXJlIG9uIHRoZQorICAgICAgc3lzdGVtIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPi4gIEluIHRoYXQgY2FzZSwgdGhlIHN0YW5kYXJkIFdlYkxvZ2ljCisgICAgICBjbGFzc2VzIHNob3VsZCBiZSBzZXQgd2l0aCB0aGlzIGF0dHJpYnV0ZSAob3IgZXF1aXZhbGVudCBuZXN0ZWQgZWxlbWVudCkgYW5kIHRoZSBob21lIGFuZAorICAgICAgcmVtb3RlIGludGVyZmFjZXMgbG9jYXRlZCB3aXRoIHRoZSBzdGFuZGFyZCBjbGFzc3BhdGggYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJpYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGdlbmVyaWMgZmlsZSB1c2VkIGFzIGlucHV0IHRvCi0gICAgICAgICAgICAgICAgICAgICBlamJjIGlzIHJldGFpbmVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZD5rZWVwZ2VuZXJpYzwvdGQ+CisgICAgPHRkPlRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgZ2VuZXJpYyBmaWxlIHVzZWQgYXMgaW5wdXQgdG8gPGtiZD5lamJjPC9rYmQ+IGlzIHJldGFpbmVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGFsbG93cyBmb3IgdGhlIHNlbGVjdGlvbiBvZiBhIGRpZmZlcmVudCBjb21waWxlcgotICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBnZW5lcmF0ZWQgSmF2YQotICAgICAgICAgICAgICAgICAgICAgZmlsZXMuIFRoaXMgY291bGQgYmUgc2V0LCBmb3IgZXhhbXBsZSwgdG8gSmlrZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUgd2l0aCB0aGUgSmlrZXMgY29tcGlsZXIuIElmIHRoaXMgaXMgbm90IHNldAotICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgaXMgc2V0Ci0gICAgICAgICAgICAgICAgICAgICB0byBqaWtlcywgdGhlIEppa2VzIGNvbXBpbGVyIHdpbGwgYmUgdXNlZC4gSWYgdGhpcwotICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGRlc2lyZWQsIHRoZSB2YWx1ZSAmcXVvdDs8Y29kZT5kZWZhdWx0PC9jb2RlPiZxdW90OwotICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGdpdmVuIHRvIHVzZSB0aGUgZGVmYXVsdCBjb21waWxlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbXBpbGVyPC90ZD4KKyAgICA8dGQ+VGhpcyBhbGxvd3MgZm9yIHRoZSBzZWxlY3Rpb24gb2YgYSBkaWZmZXJlbnQgY29tcGlsZXIgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZQorICAgICAgZ2VuZXJhdGVkIEphdmEgZmlsZXMuIFRoaXMgY291bGQgYmUgc2V0LCBmb3IgZXhhbXBsZSwgdG8gPHE+amlrZXM8L3E+IHRvIGNvbXBpbGUgd2l0aCB0aGUKKyAgICAgIEppa2VzIGNvbXBpbGVyLiBJZiB0aGlzIGlzIG5vdCBzZXQgYW5kIHRoZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgaXMgc2V0CisgICAgICB0byA8cT5qaWtlczwvcT4sIHRoZSBKaWtlcyBjb21waWxlciB3aWxsIGJlIHVzZWQuIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHRoZQorICAgICAgdmFsdWUgPHE+ZGVmYXVsdDwvcT4gbWF5IGJlIGdpdmVuIHRvIHVzZSB0aGUgZGVmYXVsdCBjb21waWxlcjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVidWlsZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciB3ZWJsb2dpYy5lamJjIGlzIGFsd2F5cwotICAgICAgICAgICAgICAgICAgICAgaW52b2tlZCB0byBidWlsZCB0aGUgamFyIGZpbGUuIEluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywKLSAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgd2hlbiBvbmx5IGEgYmVhbiBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkLCB0aGUgamFyCi0gICAgICAgICAgICAgICAgICAgICBjYW4gYmUgZ2VuZXJhdGVkIGJ5IG1lcmVseSByZXBsYWNpbmcgdGhlIGNoYW5nZWQgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCByZXJ1bm5pbmcgZWpiYy4gU2V0dGluZyB0aGlzIHRvIGZhbHNlIHdpbGwgcmVkdWNlCi0gICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSB0byBydW4gZWpiamFyLgotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPnJlYnVpbGQ8L3RkPgorICAgIDx0ZD5UaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPiBpcyBhbHdheXMgaW52b2tlZCB0byBidWlsZCB0aGUgamFyCisgICAgICBmaWxlLiBJbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIHN1Y2ggYXMgd2hlbiBvbmx5IGEgYmVhbiBjbGFzcyBoYXMgYmVlbiBjaGFuZ2VkLCB0aGUgamFyIGNhbgorICAgICAgYmUgZ2VuZXJhdGVkIGJ5IG1lcmVseSByZXBsYWNpbmcgdGhlIGNoYW5nZWQgY2xhc3NlcyBhbmQgbm90CisgICAgICByZXJ1bm5pbmcgPGtiZD5lamJjPC9rYmQ+LiBTZXR0aW5nIHRoaXMgdG8gPHE+ZmFsc2U8L3E+IHdpbGwgcmVkdWNlIHRoZSB0aW1lIHRvCisgICAgICBydW4gPGNvZGU+ZWpiamFyPC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHdoZXRoZXIgd2VibG9naWMgd2lsbCBrZWVwIHRoZSBnZW5lcmF0ZWQgSmF2YQotICAgICAgICAgICAgICAgICAgICAgZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgICBqYXIuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZwotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5rZWVwZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Q29udHJvbHMgd2hldGhlciBXZWJMb2dpYyB3aWxsIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhIGZpbGVzIHVzZWQgdG8gYnVpbGQgdGhlIGNsYXNzIGZpbGVzCisgICAgICBhZGRlZCB0byB0aGUgamFyLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSB3ZWJsb2dpYy5lamJjCi0gICAgICAgICAgICAgICAgICAgICB0b29sLgotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPmFyZ3M8L3RkPgorICAgIDx0ZD5BbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSA8Y29kZT53ZWJsb2dpYy5lamJjPC9jb2RlPiB0b29sLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2VibG9naWNkdGQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVwcmVjYXRlZDwvYj4uIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlamItamFyIERURCBpbgotICAgICAgICAgICAgICAgICAgICAgdGhlIHdlYmxvZ2ljIGNsYXNzIGhpZXJhcmNoeS4gVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgIGhhdmUgd2VibG9naWMgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdSBkbyBub3QsIHlvdSBzaG91bGQgdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudCwgZGVzY3JpYmVkIGFib3ZlLiBJZiB5b3UgZG8gY2hvb3NlCi0gICAgICAgICAgICAgICAgICAgICB0byB1c2UgYW4gYXR0cmlidXRlLCB5b3Ugc2hvdWxkIHVzZSBhCi0gICAgICAgICAgICAgICAgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+d2VibG9naWNkdGQ8L3RkPgorICAgIDx0ZD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYi1qYXIgRFREIGluIHRoZSBXZWJMb2dpYyBjbGFzcworICAgICAgaGllcmFyY2h5LiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIFdlYkxvZ2ljIGluIHlvdXIgY2xhc3NwYXRoLiBJZiB5b3UgZG8gbm90LAorICAgICAgeW91IHNob3VsZCB1c2UgYSBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQsIGRlc2NyaWJlZCBhYm92ZS4gSWYgeW91IGRvIGNob29zZSB0bworICAgICAgdXNlIGFuIGF0dHJpYnV0ZSwgeW91IHNob3VsZCB1c2UgYSBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53bGR0ZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYmxvZ2ljLWVqYi1qYXIKLSAgICAgICAgICAgICAgICAgICAgIERURCB3aGljaCBjb3ZlcnMgdGhlIFdlYmxvZ2ljIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlIHdlYmxvZ2ljIGluIHlvdXIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aC4gSWYgeW91IGRvIG5vdCwgeW91IHNob3VsZCB1c2UgYSBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+Ci0gICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCBkZXNjcmliZWQgYWJvdmUuCi0gICAgICAgICAgICAgICAgICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+d2xkdGQ8L3RkPgorICAgIDx0ZD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIHdlYmxvZ2ljLWVqYi1qYXIgRFREIHdoaWNoIGNvdmVycworICAgICAgdGhlIFdlYkxvZ2ljIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMuICBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGlmIHlvdSBoYXZlCisgICAgICBXZWJMb2dpYyBpbiB5b3VyIGNsYXNzcGF0aC4gSWYgeW91IGRvIG5vdCwgeW91IHNob3VsZCB1c2UgYSBuZXN0ZWQgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+CisgICAgICBlbGVtZW50LCBkZXNjcmliZWQgYWJvdmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lamJkdGQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVwcmVjYXRlZDwvYj4uIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBlamItamFyIERURCBpbgotICAgICAgICAgICAgICAgICAgICAgdGhlIHdlYmxvZ2ljIGNsYXNzIGhpZXJhcmNoeS4gVGhpcyBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBpZiB5b3UKLSAgICAgICAgICAgICAgICAgICAgIGhhdmUgd2VibG9naWMgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdSBkbyBub3QsIHlvdSBzaG91bGQgdXNlIGEKLSAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudCwgZGVzY3JpYmVkIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPmVqYmR0ZDwvdGQ+CisgICAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZWpiLWphciBEVEQgaW4gdGhlIFdlYkxvZ2ljIGNsYXNzCisgICAgICBoaWVyYXJjaHkuIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgaWYgeW91IGhhdmUgV2ViTG9naWMgaW4geW91ciBjbGFzc3BhdGguIElmIHlvdSBkbyBub3QsCisgICAgICB5b3Ugc2hvdWxkIHVzZSBhIG5lc3RlZCA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudCwgZGVzY3JpYmVkIGFib3ZlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmV3Q01QPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBuZXcgbWV0aG9kIGZvciBsb2NhdGluZwotICAgICAgICAgICAgICAgICAgICAgQ01QIGRlc2NyaXB0b3JzIHdpbGwgYmUgdXNlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQ+bmV3Q01QPC90ZD4KKyAgICA8dGQ+SWYgdGhpcyBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4sIHRoZSBuZXcgbWV0aG9kIGZvciBsb2NhdGluZyBDTVAgZGVzY3JpcHRvcnMgd2lsbCBiZQorICAgICAgdXNlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b2xkQ01QPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlcHJlY2F0ZWQ8L2I+IFRoaXMgaXMgYW4gYW50b255bSBmb3IgbmV3Q01QIHdoaWNoIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPm9sZENNUDwvdGQ+CisgICAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+IFRoaXMgaXMgYW4gYW50b255bSBmb3IgPHZhcj5uZXdDTVA8L3Zhcj4gd2hpY2ggc2hvdWxkIGJlIHVzZWQKKyAgICAgIGluc3RlYWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ub0VKQkM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHRydWUsIFdlYmxvZ2ljJ3MgZWpiYyB3aWxsIG5vdCBiZSBydW4gb24gdGhlIEVKQiBqYXIuCi0gICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBpZiB5b3UgcHJlZmVyIHRvIHJ1biBlamJjIGF0IGRlcGxveW1lbnQgdGltZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+bm9FSkJDPC90ZD4KKyAgICA8dGQ+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPnRydWU8L3E+LCBXZWJMb2dpYydzIDxrYmQ+ZWpiYzwva2JkPiB3aWxsIG5vdCBiZSBydW4gb24gdGhlCisgICAgICBFSkIgamFyLiAgVXNlIHRoaXMgaWYgeW91IHByZWZlciB0byBydW4gPGtiZD5lamJjPC9rYmQ+IGF0IGRlcGxveW1lbnQgdGltZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVqYmNjbGFzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIGNsYXNzbmFtZSBvZiB0aGUgZWpiYyBjb21waWxlci4gTm9ybWFsbHkgZWpiamFyIGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBiYXNlZCBvbiB0aGUgRFREIHVzZWQgZm9yIHRoZSBFSkIuIFRoZSBFSkIgMi4wIGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgICAgICBmZWF0dXJlZCBpbiB3ZWJsb2dpYyA2IGhhcywgaG93ZXZlciwgYmVlbiBkZXByZWNhdGVkIGluIHZlcnNpb24gNy4gV2hlbgotICAgICAgICAgICAgICAgICAgICAgdXNpbmcgd2l0aCB2ZXJzaW9uIDcgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0bwotICAgICAgICAgICAgICAgICAgICAgJnF1b3Q7d2VibG9naWMuZWpiYyZxdW90OyB0byBhdm9pZCB0aGUgZGVwcmVjYXRpb24gd2FybmluZy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+ZWpiY2NsYXNzPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBjbGFzc25hbWUgb2YgdGhlIDxrYmQ+ZWpiYzwva2JkPiBjb21waWxlci4gTm9ybWFsbHkgPGNvZGU+ZWpiamFyPC9jb2RlPgorICAgICAgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgY2xhc3MgYmFzZWQgb24gdGhlIERURCB1c2VkIGZvciB0aGUgRUpCLiBUaGUgRUpCIDIuMCBjb21waWxlcgorICAgICAgZmVhdHVyZWQgaW4gV2ViTG9naWMgNiBoYXMsIGhvd2V2ZXIsIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDcuIFdoZW4gdXNpbmcgd2l0aCB2ZXJzaW9uIDcKKyAgICAgIHRoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gPHE+d2VibG9naWMuZWpiYzwvcT4gdG8gYXZvaWQgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5qdm1hcmdzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIFZpcnR1YWwgTWFjaGluZQotICAgICAgICAgICAgICAgICAgICAgcnVubmluZyB3ZWJsb2dpYy5lamJjIHRvb2wuIEZvciBleGFtcGxlIHRvIHNldCB0aGUgbWVtb3J5IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICB0aGlzIGNvdWxkIGJlIGp2bWFyZ3M9JnF1b3Q7LVhteDEyOG0mcXVvdDsKLSAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICAgIDx0ZD5qdm1hcmdzPC90ZD4KKyAgICA8dGQ+QW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgSlZNIHJ1bm5pbmcgPGNvZGU+d2VibG9naWMuZWpiYzwvY29kZT4KKyAgICAgIHRvb2wuIEZvciBleGFtcGxlIHRvIHNldCB0aGUgbWVtb3J5IHNpemUsIHRoaXMgY291bGQKKyAgICAgIGJlIDx2YXI+anZtYXJnczwvdmFyPj08cT4tWG14MTI4bTwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmp2bWRlYnVnbGV2ZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgd2VibG9naWMuU3Rkb3V0U2V2ZXJpdHlMZXZlbCB0byB1c2Ugd2hlbiBydW5uaW5nCi0gICAgICAgICAgICAgICAgICAgICB0aGUgVmlydHVhbCBNYWNoaW5lIHRoYXQgZXhlY3V0ZXMgZWpiYy4gU2V0IHRvIDE2IHRvIGF2b2lkCi0gICAgICAgICAgICAgICAgICAgICB0aGUgd2FybmluZ3MgYWJvdXQgRUpCIEhvbWUgYW5kIFJlbW90ZXMgYmVpbmcgaW4gdGhlIGNsYXNzcGF0aAotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPmp2bWRlYnVnbGV2ZWw8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSA8Y29kZT53ZWJsb2dpYy5TdGRvdXRTZXZlcml0eUxldmVsPC9jb2RlPiB0byB1c2Ugd2hlbiBydW5uaW5nIHRoZSBKVk0gdGhhdAorICAgICAgZXhlY3V0ZXMgPGtiZD5lamJjPC9rYmQ+LiBTZXQgdG8gPHE+MTY8L3E+IHRvIGF2b2lkIHRoZSB3YXJuaW5ncyBhYm91dCBFSkIgSG9tZSBhbmQgUmVtb3RlcworICAgICAgYmVpbmcgaW4gdGhlIGNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNldCBlamJjIHdpbGwgYmUgZ2l2ZW4gdGhpcyBkaXJlY3RvcnkgYXMgdGhlIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gcmF0aGVyIHRoYW4gYSBqYXIgZmlsZS4gVGhpcyBhbGxvd3MgZm9yIHRoZQotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiBvZiAmcXVvdDtleHBsb2RlZCZxdW90OyBqYXJzLgotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLjwvdGQ+CisgICAgPHRkPm91dHB1dGRpcjwvdGQ+CisgICAgPHRkPklmIHNldCA8a2JkPmVqYmM8L2tiZD4gd2lsbCBiZSBnaXZlbiB0aGlzIGRpcmVjdG9yeSBhcyB0aGUgb3V0cHV0IGRlc3RpbmF0aW9uIHJhdGhlciB0aGFuIGEKKyAgICAgIGphciBmaWxlLiBUaGlzIGFsbG93cyBmb3IgdGhlIGdlbmVyYXRpb24gb2YgJnF1b3Q7ZXhwbG9kZWQmcXVvdDsgamFycy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD5UaGUgd2VibG9naWMgbmVzdGVkIGVsZW1lbnQgc3VwcG9ydHMgdGhyZWUgbmVzdGVkIGVsZW1lbnRzLiBUaGUKLWZpcnN0IHR3bywgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7d2xjbGFzc3BhdGgmZ3Q7PC9jb2RlPiwgYXJlIHVzZWQgdG8gc2V0IHRoZQotcmVzcGVjdGl2ZSBjbGFzc3BhdGhzLiBUaGVzZSBuZXN0ZWQgZWxlbWVudHMgYXJlIHVzZWZ1bCB3aGVuIHNldHRpbmcgdXAKLWNsYXNzIHBhdGhzIHVzaW5nIHJlZmVyZW5jZSBJZHMuIFRoZSBsYXN0LCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiwgYWxsb3dzCi1KYXZhIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIGJlIHNldCBkdXJpbmcgdGhlIGNvbXBpbGVyIHJ1bi4gVGhpcyB0dXJucyBvdXQKLXRvIGJlIG5lY2Vzc2FyeSBmb3Igc3VwcG9ydGluZyBDTVAgRUpCIGNvbXBpbGF0aW9uIGluIGFsbCBlbnZpcm9ubWVudHMuCi08L3A+Cis8cD5UaGUgPGNvZGU+d2VibG9naWM8L2NvZGU+IG5lc3RlZCBlbGVtZW50IHN1cHBvcnRzIHRocmVlIG5lc3RlZCBlbGVtZW50cy4gVGhlIGZpcnN0Cit0d28sIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3dsY2xhc3NwYXRoJmd0OzwvY29kZT4sIGFyZSB1c2VkIHRvIHNldCB0aGUKK3Jlc3BlY3RpdmUgY2xhc3NwYXRocy4gVGhlc2UgbmVzdGVkIGVsZW1lbnRzIGFyZSB1c2VmdWwgd2hlbiBzZXR0aW5nIHVwIGNsYXNzcGF0aHMgdXNpbmcgcmVmZXJlbmNlCitJZHMuIFRoZSBsYXN0LCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiwgYWxsb3dzIEphdmEgc3lzdGVtIHByb3BlcnRpZXMgdG8gYmUgc2V0IGR1cmluZyB0aGUKK2NvbXBpbGVyIHJ1bi4gVGhpcyB0dXJucyBvdXQgdG8gYmUgbmVjZXNzYXJ5IGZvciBzdXBwb3J0aW5nIENNUCBFSkIgY29tcGlsYXRpb24gaW4gYWxsCitlbnZpcm9ubWVudHMuPC9wPgogCi08aDM+VE9QTGluayBmb3IgV2VibG9naWMgZWxlbWVudDwvaDM+Cis8aDM+VE9QTGluayBmb3IgV2ViTG9naWMgZWxlbWVudDwvaDM+CiAKLTxwPjxiPjxpPkRlcHJlY2F0ZWQ8L2k+PC9iPjwvcD4KKzxwPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+PC9wPgogCi08cD5UaGUgdG9wbGluayBlbGVtZW50IGlzIG5vIGxvbmdlciByZXF1aXJlZC4gVG9wbGluayBiZWFucyBjYW4gbm93IGJlIGJ1aWx0IHdpdGggdGhlIHN0YW5kYXJkCi13ZWJsb2dpYyBlbGVtZW50LCBhcyBsb25nIGFzIHRoZSBuZXdDTVAgYXR0cmlidXRlIGlzIHNldCB0byAmcXVvdDt0cnVlJnF1b3Q7Ci08L3A+Cis8cD5UaGUgPGNvZGU+dG9wbGluazwvY29kZT4gZWxlbWVudCBpcyBubyBsb25nZXIgcmVxdWlyZWQuIFRvcGxpbmsgYmVhbnMgY2FuIG5vdyBiZSBidWlsdCB3aXRoIHRoZQorc3RhbmRhcmQgPGNvZGU+d2VibG9naWM8L2NvZGU+IGVsZW1lbnQsIGFzIGxvbmcgYXMgdGhlIDx2YXI+bmV3Q01QPC92YXI+IGF0dHJpYnV0ZSBpcyBzZXQKK3RvIDxxPnRydWU8L3E+PC9wPgogCi08cD5UaGUgVG9wTGluayBlbGVtZW50IGlzIHVzZWQgdG8gaGFuZGxlIGJlYW5zIHdoaWNoIHVzZSBUb3BsaW5rIGZvciB0aGUgQ01QIG9wZXJhdGlvbnMuIEl0Ci1pcyBkZXJpdmVkIGZyb20gdGhlIHN0YW5kYXJkIHdlYmxvZ2ljIGVsZW1lbnQgc28gaXQgc3VwcG9ydHMgdGhlIHNhbWUgc2V0IG9mIGF0dHJpYnV0ZXMgcGx1cyB0aGVzZQotYWRkaXRpb25hbCBhdHRyaWJ1dGVzPC9wPgorPHA+VGhlIDxjb2RlPlRvcExpbms8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBoYW5kbGUgYmVhbnMgd2hpY2ggdXNlIFRvcGxpbmsgZm9yIHRoZSBDTVAKK29wZXJhdGlvbnMuIEl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgc3RhbmRhcmQgPGNvZGU+d2VibG9naWM8L2NvZGU+IGVsZW1lbnQgc28gaXQgc3VwcG9ydHMgdGhlIHNhbWUKK3NldCBvZiBhdHRyaWJ1dGVzIHBsdXMgdGhlc2UgYWRkaXRpb25hbCBhdHRyaWJ1dGVzPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvcGxpbmtkZXNjcmlwdG9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBUT1BMaW5rIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlIGNvbnRhaW5lZCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yZGlyJyBkaXJlY3RvcnkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnRvcGxpbmtkZXNjcmlwdG9yPC90ZD4KKyAgICA8dGQ+VGhpcyBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIFRPUExpbmsgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgY29udGFpbmVkIGluCisgICAgdGhlIDx2YXI+ZGVzY3JpcHRvcmRpcjwvdmFyPiBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9wbGlua2R0ZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFRPUExpbmsgRFREIGZpbGUuIFRoaXMgY2FuIGJlIGEgZmlsZSBwYXRoIG9yCi0gICAgICAgICAgICAgICAgICAgICBhIGZpbGUgVVJMLiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCB1c2luZyBhIGxvY2FsIERURCBpcyByZWNvbW1lbmRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGR0ZCBmaWxlIGF0IHd3dy5vYmplY3RwZW9wbGUuY29tLjwvdGQ+CisgICAgPHRkPnRvcGxpbmtkdGQ8L3RkPgorICAgIDx0ZD5UaGlzIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhlIFRPUExpbmsgRFREIGZpbGUuIFRoaXMgY2FuIGJlIGEgZmlsZSBwYXRoIG9yIGEgZmlsZQorICAgICAgVVJMLiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCB1c2luZyBhIGxvY2FsIERURCBpcyByZWNvbW1lbmRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gRFREIGZpbGUgYXQgPHNhbXA+d3d3Lm9iamVjdHBlb3BsZS5jb208L3NhbXA+LjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxwPlRoaXMgZXhhbXBsZSBzaG93cyBlamJqYXIgYmVpbmcgdXNlZCB0byBnZW5lcmF0ZSBkZXBsb3ltZW50IGphcnMgdXNpbmcgYQotV2VibG9naWMgRUpCIGNvbnRhaW5lci4gVGhpcyBleGFtcGxlIHJlcXVpcmVzIHRoZSBuYW1pbmcgc3RhbmRhcmQgdG8gYmUgdXNlZCBmb3IKLXRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiBVc2luZyB0aGlzIGZvcm1hdCB3aWxsIGNyZWF0ZSBhIGVqYiBqYXIgZmlsZSBmb3IKLWVhY2ggdmFyaWF0aW9uIG9mICcqLWVqYi1qYXIueG1sJyB0aGF0IGlzIGZvdW5kIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWRpcmVjdG9yeS48L3A+Cis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgPGNvZGU+ZWpiamFyPC9jb2RlPiBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGRlcGxveW1lbnQgamFycyB1c2luZyBhIFdlYkxvZ2ljCitFSkIgY29udGFpbmVyLiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgdGhlIG5hbWluZyBzdGFuZGFyZCB0byBiZSB1c2VkIGZvciB0aGUgZGVwbG95bWVudAorZGVzY3JpcHRvcnMuIFVzaW5nIHRoaXMgZm9ybWF0IHdpbGwgY3JlYXRlIGEgRUpCIGphciBmaWxlIGZvciBlYWNoIHZhcmlhdGlvbgorb2YgPHNhbXA+Ki1lamItamFyLnhtbDwvc2FtcD4gdGhhdCBpcyBmb3VuZCBpbiB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGRpcmVjdG9yeS48L3A+CiAKIDxwcmU+Ci0gICAgJmx0O2VqYmphciBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OwotICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0mcXVvdDske2Rlc2NyaXB0b3IuZGlyfSZxdW90OyZndDsKLSAgICAgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudGphcnMuZGlyfSZxdW90OwotICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9JnF1b3Q7LyZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi1lamItamFyLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyp3ZWJsb2dpYyoueG1sJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2VqYmphciZndDsKLTwvcHJlPgorJmx0O2VqYmphciBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OworICAgICAgICBkZXNjcmlwdG9yZGlyPSZxdW90OyR7ZGVzY3JpcHRvci5kaXJ9JnF1b3Q7Jmd0OworICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnRqYXJzLmRpcn0mcXVvdDsKKyAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLWVqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qd2VibG9naWMqLnhtbCZxdW90Oy8mZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KIAotPHA+SWYgd2VibG9naWMgaXMgbm90IGluIHRoZSBBbnQgY2xhc3NwYXRoLCB0aGUgZm9sbG93aW5nIGV4YW1wbGUKLXNob3dzIGhvdyB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgd2VibG9naWMgRFREcy4gVGhpcwotZXhhbXBsZSBhbHNvIHNob3cgdGhlIHVzZSBvZiBhIG5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC48L3A+Cis8cD5JZiBXZWJMb2dpYyBpcyBub3QgaW4gdGhlIEFudCBjbGFzc3BhdGgsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24KK29mIHRoZSBXZWJMb2dpYyBEVERzLiBUaGlzIGV4YW1wbGUgYWxzbyBzaG93IHRoZSB1c2Ugb2YgYSBuZXN0ZWQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBlbGVtZW50LjwvcD4KIAogPHByZT4KLSAgICAmbHQ7ZWpiamFyIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtzcmMuZGlyfSZxdW90OyBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyZndDsKLSAgICAgICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnQud2Vic2hvcC5kaXJ9JnF1b3Q7Ci0gICAgICAgICAgICAgICAgIGtlZXBnZW5lcmljPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgICAgICAgYXJncz0mcXVvdDstZyAta2VlcGdlbmVyYXRlZCAke2VqYmMuY29tcGlsZXJ9JnF1b3Q7Ci0gICAgICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7Ci0gICAgICAgICAgICAgICAgIG9sZENNUD0mcXVvdDtmYWxzZSZxdW90OyZndDsKLSAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7ZGVzY3JpcHRvcmJ1aWxkLmNsYXNzcGF0aH0mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgICAgJmx0Oy93ZWJsb2dpYyZndDsKLSAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyotZWpiLWphci54bWwmcXVvdDsvJmd0OwotICAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi13ZWJsb2dpYy1lamItamFyLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiZxdW90OwotICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9jbGFzc2VzL3dlYmxvZ2ljL2VqYi9kZXBsb3ltZW50L3htbC9lamItamFyLmR0ZCZxdW90Oy8mZ3Q7Ci0gICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9CRUEgU3lzdGVtcywgSW5jLi8vRFREIFdlYkxvZ2ljIDUuMS4wIEVKQi8vRU4mcXVvdDsKLSAgICAgICAgICAgIGxvY2F0aW9uPSZxdW90OyR7d2VibG9naWMuaG9tZX0vY2xhc3Nlcy93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvd2VibG9naWMtZWpiLWphci5kdGQmcXVvdDsvJmd0OwotICAgICZsdDsvZWpiamFyJmd0OwotPC9wcmU+CismbHQ7ZWpiamFyIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtzcmMuZGlyfSZxdW90OyBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzfSZxdW90OyZndDsKKyAgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudC53ZWJzaG9wLmRpcn0mcXVvdDsKKyAgICAgICAgICAgICBrZWVwZ2VuZXJpYz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgICAgYXJncz0mcXVvdDstZyAta2VlcGdlbmVyYXRlZCAke2VqYmMuY29tcGlsZXJ9JnF1b3Q7CisgICAgICAgICAgICAgc3VmZml4PSZxdW90Oy5qYXImcXVvdDsKKyAgICAgICAgICAgICBvbGRDTVA9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7CisgICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtkZXNjcmlwdG9yYnVpbGQuY2xhc3NwYXRofSZxdW90Oy8mZ3Q7CisgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgJmx0Oy93ZWJsb2dpYyZndDsKKyAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi1lamItamFyLnhtbCZxdW90Oy8mZ3Q7CisgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyotd2VibG9naWMtZWpiLWphci54bWwmcXVvdDsvJmd0OworICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiZxdW90OworICAgICAgICBsb2NhdGlvbj0mcXVvdDske3dlYmxvZ2ljLmhvbWV9L2NsYXNzZXMvd2VibG9naWMvZWpiL2RlcGxveW1lbnQveG1sL2VqYi1qYXIuZHRkJnF1b3Q7LyZndDsKKyAgICZsdDtkdGQgcHVibGljSWQ9JnF1b3Q7LS8vQkVBIFN5c3RlbXMsIEluYy4vL0RURCBXZWJMb2dpYyA1LjEuMCBFSkIvL0VOJnF1b3Q7CisgICAgICAgIGxvY2F0aW9uPSZxdW90OyR7d2VibG9naWMuaG9tZX0vY2xhc3Nlcy93ZWJsb2dpYy9lamIvZGVwbG95bWVudC94bWwvd2VibG9naWMtZWpiLWphci5kdGQmcXVvdDsvJmd0OworJmx0Oy9lamJqYXImZ3Q7PC9wcmU+CiAKLQotPHA+VGhpcyBleGFtcGxlIHNob3dzIGVqYmphciBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGRlcGxveW1lbnQgamFyCi11c2luZyBhIFdlYmxvZ2ljIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCByZXF1aXJlIHRoZSBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZyBzdGFuZGFyZC4gVGhpcyB3aWxsIGNyZWF0ZSBvbmx5IG9uZSBlamIgamFyIGZpbGUgLQotJ1RoZUVKQkphci5qYXInLjwvcD4KLQorPHA+VGhpcyBleGFtcGxlIHNob3dzIDxjb2RlPmVqYmphcjwvY29kZT4gYmVpbmcgdXNlZCB0byBnZW5lcmF0ZSBhIHNpbmdsZSBkZXBsb3ltZW50IGphciB1c2luZyBhCitXZWJMb2dpYyBFSkIgY29udGFpbmVyLiBUaGlzIGV4YW1wbGUgZG9lcyBub3QgcmVxdWlyZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZworc3RhbmRhcmQuIFRoaXMgd2lsbCBjcmVhdGUgb25seSBvbmUgRUpCIGphciBmaWxlJm1kYXNoOzxzYW1wPlRoZUVKQkphci5qYXI8L3NhbXA+LjwvcD4KIAogPHByZT4KLSAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0mcXVvdDske2J1aWxkLmNsYXNzZXN9JnF1b3Q7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yZGlyPSZxdW90OyR7ZGVzY3JpcHRvci5kaXJ9JnF1b3Q7Ci0gICAgICAgICAgICBiYXNlamFybmFtZT0mcXVvdDtUaGVFSkJKYXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnRqYXJzLmRpcn0mcXVvdDsKLSAgICAgICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHtkZXNjcmlwdG9yYnVpbGQuY2xhc3NwYXRofSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL2VqYi1qYXIueG1sJnF1b3Q7LyZndDsKLSAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Kiovd2VibG9naWMqLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9lamJqYXImZ3Q7Ci08L3ByZT4KKyZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlc30mcXVvdDsKKyAgICAgICAgZGVzY3JpcHRvcmRpcj0mcXVvdDske2Rlc2NyaXB0b3IuZGlyfSZxdW90OworICAgICAgICBiYXNlamFybmFtZT0mcXVvdDtUaGVFSkJKYXImcXVvdDsmZ3Q7CisgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudGphcnMuZGlyfSZxdW90OworICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7ZGVzY3JpcHRvcmJ1aWxkLmNsYXNzcGF0aH0mcXVvdDsvJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL2VqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi93ZWJsb2dpYyoueG1sJnF1b3Q7LyZndDsKKyZsdDsvZWpiamFyJmd0OzwvcHJlPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgZGVwbG95bWVudCBqYXJzIGZvciBhIFRPUExpbmstZW5hYmxlZCBlbnRpdHkgYmVhbiB1c2luZyBhCi1XZWJsb2dpYyBFSkIgY29udGFpbmVyLiBUaGlzIGV4YW1wbGUgZG9lcyBub3QgcmVxdWlyZSB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZyBzdGFuZGFyZC4KLVRoaXMgd2lsbCBjcmVhdGUgb25seSBvbmUgVE9QTGluay1lbmFibGVkIGVqYiBqYXIgZmlsZSAtICdBZGRyZXNzLmphcicuPC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIDxjb2RlPmVqYmphcjwvY29kZT4gYmVpbmcgdXNlZCB0byBnZW5lcmF0ZSBkZXBsb3ltZW50IGphcnMgZm9yIGEKK1RPUExpbmstZW5hYmxlZCBlbnRpdHkgYmVhbiB1c2luZyBhIFdlYkxvZ2ljIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSBkb2VzIG5vdCByZXF1aXJlIHRoZQorZGVwbG95bWVudCBkZXNjcmlwdG9ycyB0byB1c2UgdGhlIG5hbWluZyBzdGFuZGFyZC4gIFRoaXMgd2lsbCBjcmVhdGUgb25seSBvbmUgVE9QTGluay1lbmFibGVkIEVKQgoramFyIGZpbGUmbWRhc2g7PHNhbXA+QWRkcmVzcy5qYXI8L3NhbXA+LjwvcD4KIAogPHByZT4KLSAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsKLSAgICAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtzb2xhbnQuZWpiLmRpcn0mcXVvdDsKLSAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtkZXNjcmlwdG9yLmRpcn0mcXVvdDsKLSAgICAgICAgICAgIGJhc2VqYXJuYW1lPSZxdW90O0FkZHJlc3MmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7d2VibG9naWN0b3BsaW5rIGRlc3RkaXI9JnF1b3Q7JHtzb2xhbnQuZWpiLmRpcn0mcXVvdDsKLSAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90OwotICAgICAgICAgICAgICAgICAgICBrZWVwZ2VuZXJpYz0mcXVvdDtmYWxzZSZxdW90OwotICAgICAgICAgICAgICAgICAgICB0b3BsaW5rZGVzY3JpcHRvcj0mcXVvdDtBZGRyZXNzLnhtbCZxdW90OwotICAgICAgICAgICAgICAgICAgICB0b3BsaW5rZHRkPSZxdW90O2ZpbGU6Ly8vZHRkZmlsZXMvdG9wbGluay1jbXBfMl81XzEuZHRkJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovZWpiLWphci54bWwmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi93ZWJsb2dpYy1lamItamFyLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9lamJqYXImZ3Q7Ci08L3ByZT4KKyZsdDtlamJqYXIgc3JjZGlyPSZxdW90OyR7YnVpbGQuZGlyfSZxdW90OworICAgICAgICBkZXN0ZGlyPSZxdW90OyR7c29sYW50LmVqYi5kaXJ9JnF1b3Q7CisgICAgICAgIGRlc2NyaXB0b3JkaXI9JnF1b3Q7JHtkZXNjcmlwdG9yLmRpcn0mcXVvdDsKKyAgICAgICAgYmFzZWphcm5hbWU9JnF1b3Q7QWRkcmVzcyZxdW90OyZndDsKKyAgICAgICAgJmx0O3dlYmxvZ2ljdG9wbGluayBkZXN0ZGlyPSZxdW90OyR7c29sYW50LmVqYi5kaXJ9JnF1b3Q7CisgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90OworICAgICAgICAgICAgICAgIGtlZXBnZW5lcmljPSZxdW90O2ZhbHNlJnF1b3Q7CisgICAgICAgICAgICAgICAgdG9wbGlua2Rlc2NyaXB0b3I9JnF1b3Q7QWRkcmVzcy54bWwmcXVvdDsKKyAgICAgICAgICAgICAgICB0b3BsaW5rZHRkPSZxdW90O2ZpbGU6Ly8vZHRkZmlsZXMvdG9wbGluay1jbXBfMl81XzEuZHRkJnF1b3Q7CisgICAgICAgICAgICAgICAgc3VmZml4PSZxdW90Oy5qYXImcXVvdDsvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL2VqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi93ZWJsb2dpYy1lamItamFyLnhtbCZxdW90Oy8mZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KIAotPHA+VGhpcyBmaW5hbCBleGFtcGxlIHNob3dzIGhvdyB5b3Ugd291bGQgc2V0LXVwIGVqYmphciB1bmRlciBXZWJsb2dpYyA2LjAuIEl0IGFsc28gc2hvd3MgdGhlIHVzZSBvZiB0aGUKLTxjb2RlPiZsdDtzdXBwb3J0Jmd0OzwvY29kZT4gZWxlbWVudCB0byBhZGQgc3VwcG9ydCBmaWxlczwvcD4KKzxwPlRoaXMgZmluYWwgZXhhbXBsZSBzaG93cyBob3cgeW91IHdvdWxkIHNldC11cCA8Y29kZT5lamJqYXI8L2NvZGU+IHVuZGVyIFdlYkxvZ2ljIDYuMC4gSXQgYWxzbworc2hvd3MgdGhlIHVzZSBvZiB0aGUgPGNvZGU+Jmx0O3N1cHBvcnQmZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIGFkZCBzdXBwb3J0IGZpbGVzPC9wPgogCiA8cHJlPgotICAgICZsdDtlamJqYXIgZGVzY3JpcHRvcmRpcj0mcXVvdDske2RkLmRpcn0mcXVvdDsgc3JjZGlyPSZxdW90OyR7YnVpbGQuY2xhc3Nlcy5zZXJ2ZXJ9JnF1b3Q7Jmd0OwotICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi1lamItamFyLnhtbCZxdW90Oy8mZ3Q7Ci0gICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLXdlYmxvZ2ljLWVqYi1qYXIueG1sJnF1b3Q7LyZndDsKLSAgICAgICAmbHQ7c3VwcG9ydCBkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouY2xhc3MmcXVvdDsvJmd0OwotICAgICAgICZsdDsvc3VwcG9ydCZndDsKLSAgICAgICAmbHQ7d2VibG9naWMgZGVzdGRpcj0mcXVvdDske2RlcGxveW1lbnQuZGlyfSZxdW90OwotICAgICAgICAgICAgICAgICBrZWVwZ2VuZXJpYz0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7Ci0gICAgICAgICAgICAgICAgIHJlYnVpbGQ9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OwotICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICAmbHQ7d2xjbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske3dlYmxvZ2ljLmNsYXNzZXN9JnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDsvd2xjbGFzc3BhdGgmZ3Q7Ci0gICAgICAgJmx0Oy93ZWJsb2dpYyZndDsKLSAgICAmbHQ7L2VqYmphciZndDsKLTwvcHJlPgorJmx0O2VqYmphciBkZXNjcmlwdG9yZGlyPSZxdW90OyR7ZGQuZGlyfSZxdW90OyBzcmNkaXI9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsmZ3Q7CisgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyotZWpiLWphci54bWwmcXVvdDsvJmd0OworICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qLXdlYmxvZ2ljLWVqYi1qYXIueG1sJnF1b3Q7LyZndDsKKyAgICZsdDtzdXBwb3J0IGRpcj0mcXVvdDske2J1aWxkLmNsYXNzZXMuc2VydmVyfSZxdW90OyZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmNsYXNzJnF1b3Q7LyZndDsKKyAgICZsdDsvc3VwcG9ydCZndDsKKyAgICZsdDt3ZWJsb2dpYyBkZXN0ZGlyPSZxdW90OyR7ZGVwbG95bWVudC5kaXJ9JnF1b3Q7CisgICAgICAgICAgICAga2VlcGdlbmVyaWM9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgICAgIHN1ZmZpeD0mcXVvdDsuamFyJnF1b3Q7CisgICAgICAgICAgICAgcmVidWlsZD0mcXVvdDtmYWxzZSZxdW90OyZndDsKKyAgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtidWlsZC5jbGFzc2VzLnNlcnZlcn0mcXVvdDsvJmd0OworICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAgJmx0O3dsY2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske3dlYmxvZ2ljLmNsYXNzZXN9JnF1b3Q7LyZndDsKKyAgICAgJmx0Oy93bGNsYXNzcGF0aCZndDsKKyAgICZsdDsvd2VibG9naWMmZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KIAorPGgzIGlkPSJlamJqYXJfd2Vic3BoZXJlIj5XZWJTcGhlcmUgZWxlbWVudDwvaDM+CiAKLTxoMz48YSBuYW1lPSJlamJqYXJfd2Vic3BoZXJlIj5XZWJTcGhlcmUgZWxlbWVudDwvYT48L2gzPgotCi08cD5UaGUgd2Vic3BoZXJlIGVsZW1lbnQgc2VhcmNoZXMgZm9yIHRoZSB3ZWJzcGhlcmUgc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhbmQKLWFkZHMgdGhlbSB0byB0aGUgZmluYWwgZWpiIGphciBmaWxlLiBXZWJzcGhlcmUgaGFzIHR3byBzcGVjaWZpYyBkZXNjcmlwdG9ycyBmb3Igc2Vzc2lvbgotYmVhbnM6Cis8cD5UaGUgPGNvZGU+d2Vic3BoZXJlPC9jb2RlPiBlbGVtZW50IHNlYXJjaGVzIGZvciB0aGUgV2ViU3BoZXJlIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kCithZGRzIHRoZW0gdG8gdGhlIGZpbmFsIEVKQiBqYXIgZmlsZS4gV2ViU3BoZXJlIGhhcyB0d28gc3BlY2lmaWMgZGVzY3JpcHRvcnMgZm9yIHNlc3Npb24gYmVhbnM6PC9wPgogPHVsPgotICAgPGxpPmlibS1lamItamFyLWJuZC54bWk8L2xpPgotICAgPGxpPmlibS1lamItamFyLWV4dC54bWk8L2xpPgorICA8bGk+PHNhbXA+aWJtLWVqYi1qYXItYm5kLnhtaTwvc2FtcD48L2xpPgorICA8bGk+PHNhbXA+aWJtLWVqYi1qYXItZXh0LnhtaTwvc2FtcD48L2xpPgogPC91bD4KLWFuZCBhbm90aGVyIHR3byBmb3IgY29udGFpbmVyIG1hbmFnZWQgZW50aXR5IGJlYW5zOgorPHA+YW5kIGFub3RoZXIgdHdvIGZvciBjb250YWluZXIgbWFuYWdlZCBlbnRpdHkgYmVhbnM6PC9wPgogPHVsPgotICAgPGxpPk1hcC5tYXB4bWk8L2xpPgotICAgPGxpPlNjaGVtYS5kYnhtaTwvbGk+CisgIDxsaT48c2FtcD5NYXAubWFweG1pPC9zYW1wPjwvbGk+CisgIDxsaT48c2FtcD5TY2hlbWEuZGJ4bWk8L3NhbXA+PC9saT4KIDwvdWw+Ci1JbiB0ZXJtcyBvZiBXZWJTcGhlcmUsIHRoZSBnZW5lcmF0aW9uIG9mIGNvbnRhaW5lciBjb2RlIGFuZCBzdHVicyBpcyBjYWxsZWQgPGNvZGU+ZGVwbG95bWVudDwvY29kZT4uCi1UaGlzIHN0ZXAgY2FuIGJlIHBlcmZvcm1lZCBieSB0aGUgd2Vic3BoZXJlIGVsZW1lbnQgYXMgcGFydCBvZiB0aGUgamFyIGdlbmVyYXRpb24gcHJvY2Vzcy4gSWYgdGhlCi1zd2l0Y2ggPGNvZGU+ZWpiZGVwbG95PC9jb2RlPiBpcyBvbiwgdGhlIGVqYmRlcGxveSB0b29sIGZyb20gdGhlIHdlYnNwaGVyZSB0b29sc2V0IGlzIGNhbGxlZCBmb3IKLWV2ZXJ5IGVqYi1qYXIuIFVuZm9ydHVuYXRlbHksIHRoaXMgc3RlcCBvbmx5IHdvcmtzLCBpZiB5b3UgdXNlIHRoZSBpYm0gamRrLiBPdGhlcndpc2UsIHRoZSBybWljCi0oY2FsbGVkIGJ5IGVqYmRlcGxveSkgdGhyb3dzIGEgQ2xhc3NGb3JtYXRFcnJvci4gQmUgc3VyZSB0byBzd2l0Y2ggZWpiZGVwbG95IG9mZiwgaWYgcnVuIGFudCB3aXRoCi1PcmFjbGUgSkRLIG9yIE9wZW5KREsuCi08L3A+Cis8cD5JbiB0ZXJtcyBvZiBXZWJTcGhlcmUsIHRoZSBnZW5lcmF0aW9uIG9mIGNvbnRhaW5lciBjb2RlIGFuZCBzdHVicyBpcyBjYWxsZWQgPGVtPmRlcGxveW1lbnQ8L2VtPi4KK1RoaXMgc3RlcCBjYW4gYmUgcGVyZm9ybWVkIGJ5IHRoZSA8Y29kZT53ZWJzcGhlcmU8L2NvZGU+IGVsZW1lbnQgYXMgcGFydCBvZiB0aGUgamFyIGdlbmVyYXRpb24KK3Byb2Nlc3MuIElmIHRoZSBzd2l0Y2ggPHZhcj5lamJkZXBsb3k8L3Zhcj4gaXMgb24sIHRoZSA8a2JkPmVqYmRlcGxveTwva2JkPiB0b29sIGZyb20gdGhlCitXZWJTcGhlcmUgdG9vbHNldCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IEVKQiBqYXIuIFVuZm9ydHVuYXRlbHksIHRoaXMgc3RlcCBvbmx5IHdvcmtzLCBpZiB5b3UgdXNlIHRoZQorSUJNIEpESy4gT3RoZXJ3aXNlLCB0aGUgPGtiZD5ybWljPC9rYmQ+IChjYWxsZWQgYnkgPGtiZD5lamJkZXBsb3k8L2tiZD4pIHRocm93cworYSA8Y29kZT5DbGFzc0Zvcm1hdEVycm9yPC9jb2RlPi4gQmUgc3VyZSB0byBzd2l0Y2ggPHZhcj5lamJkZXBsb3k8L3Zhcj4gb2ZmLCBpZiBBbnQgcnVucyB3aXRoIE9yYWNsZQorSkRLIG9yIE9wZW5KREsuPC9wPgogCi08cD4KLUZvciB0aGUgd2Vic3BoZXJlIGVsZW1lbnQgdG8gd29yaywgeW91IGhhdmUgdG8gcHJvdmlkZSBhIGNvbXBsZXRlIGNsYXNzcGF0aCwgdGhhdCBjb250YWlucyBhbGwKLWNsYXNzZXMsIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHJlZmxlY3QgdGhlIGJlYW4gY2xhc3Nlcy4gRm9yIGVqYmRlcGxveSB0byB3b3JrLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUKLXRoZSBjbGFzc3BhdGggb2YgdGhlIGVqYmRlcGxveSB0b29sIGFuZCBzZXQgdGhlIDxpPndlYnNwaGVyZS5ob21lPC9pPiBwcm9wZXJ0eSAobG9vayBhdCB0aGUgZXhhbXBsZXMgYmVsb3cpLgotPC9wPgorPHA+Rm9yIHRoZSA8Y29kZT53ZWJzcGhlcmU8L2NvZGU+IGVsZW1lbnQgdG8gd29yaywgeW91IGhhdmUgdG8gcHJvdmlkZSBhIGNvbXBsZXRlIGNsYXNzcGF0aCwgdGhhdAorY29udGFpbnMgYWxsIGNsYXNzZXMsIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHJlZmxlY3QgdGhlIGJlYW4gY2xhc3Nlcy4gRm9yIDxrYmQ+ZWpiZGVwbG95PC9rYmQ+IHRvCit3b3JrLCB5b3UgbXVzdCBhbHNvIHByb3ZpZGUgdGhlIGNsYXNzcGF0aCBvZiB0aGUgPGtiZD5lamJkZXBsb3k8L2tiZD4gdG9vbCBhbmQgc2V0Cit0aGUgPGNvZGU+d2Vic3BoZXJlLmhvbWU8L2NvZGU+IHByb3BlcnR5IChsb29rIGF0IHRoZSBleGFtcGxlcyBiZWxvdykuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCB3ZWJsb2dpYyByZWFkeQotICAgICAgICAgICAgICAgICAgICAgamFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQuIEphciBmaWxlcyBhcmUgZGVwb3NpdGVkIGluCi0gICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGxvY2F0aW9uIHdpdGhpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JkaXIgbmFtZXNwYWNlLiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgV2ViU3BoZXJlIHJlYWR5IGphciBmaWxlcyBhcmUgZGVwb3NpdGVkLiBKYXIKKyAgICAgIGZpbGVzIGFyZSBkZXBvc2l0ZWQgaW4gZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byB0aGVpciBsb2NhdGlvbiB3aXRoaW4KKyAgICAgIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj4gbmFtZXNwYWNlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVqYmRlcGxveTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EZWNpZGVzIHdoZXRoZXIgZWpiZGVwbG95IGlzIGNhbGxlZC4gV2hlbiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGJlIHN1cmUsIHRvIHJ1biBhbnQgd2l0aCB0aGUgaWJtIGpkay48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRydWU8L3RkPgorICAgIDx0ZD5lamJkZXBsb3k8L3RkPgorICAgICAgPHRkPkRlY2lkZXMgd2hldGhlciA8a2JkPmVqYmRlcGxveTwva2JkPiBpcyBjYWxsZWQuIFdoZW4geW91IHNldCB0aGlzIHRvIDxxPnRydWU8L3E+LCBiZSBzdXJlCisgICAgICAgIHRvIHJ1biBBbnQgd2l0aCB0aGUgSUJNIEpESy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mIHRoZSBXZWJMb2dpYyBFSkIKLSAgICAgICAgICAgICAgICAgICAgIGphciBmaWxlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gJy5qYXInLjwvdGQ+CisgICAgPHRkPnN1ZmZpeDwvdGQ+CisgICAgPHRkPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgYmFzZW5hbWUgb2YgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byBjcmVhdGUgdGhlIGZpbGVuYW1lIG9mCisgICAgICB0aGUgV2ViU3BoZXJlIEVKQiBqYXIgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+LmphcjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJpYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGdlbmVyaWMgZmlsZSB1c2VkIGFzIGlucHV0IHRvCi0gICAgICAgICAgICAgICAgICAgICBlamJkZXBsb3kgaXMgcmV0YWluZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPmtlZXBnZW5lcmljPC90ZD4KKyAgICA8dGQ+VGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSBnZW5lcmljIGZpbGUgdXNlZCBhcyBpbnB1dCB0byA8a2JkPmVqYmRlcGxveTwva2JkPiBpcworICAgICAgcmV0YWluZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlYnVpbGQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBjb250cm9scyB3aGV0aGVyIGVqYmRlcGxveSBpcyBjYWxsZWQgYWx0aG91Z2ggbm8gY2hhbmdlcwotICAgICAgICAgICAgICAgICAgICAgaGF2ZSBvY2N1cnJlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQ+cmVidWlsZDwvdGQ+CisgICAgPHRkPlRoaXMgY29udHJvbHMgd2hldGhlciA8a2JkPmVqYmRlcGxveTwva2JkPiBpcyBjYWxsZWQgYWx0aG91Z2ggbm8gY2hhbmdlcyBoYXZlIG9jY3VycmVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50ZW1wZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZGlyZWN0b3J5LCB3aGVyZSBlamJkZXBsb3kgd2lsbCB3cml0ZSB0ZW1wb3JhcnkgZmlsZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvICdfZWpiZGVwbG95X3RlbXAnLjwvdGQ+CisgICAgPHRkPnRlbXBkaXI8L3RkPgorICAgIDx0ZD5BIGRpcmVjdG9yeSwgd2hlcmUgPGtiZD5lamJkZXBsb3k8L2tiZD4gd2lsbCB3cml0ZSB0ZW1wb3JhcnkgZmlsZXM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+X2VqYmRlcGxveV90ZW1wPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRiTmFtZTxicj5kYlNjaGVtYTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gZWpiZGVwbG95LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRiTmFtZTxici8+ZGJTY2hlbWE8L3RkPgorICAgIDx0ZD5UaGVzZSBvcHRpb25zIGFyZSBwYXNzZWQgdG8gPGtiZD5lamJkZXBsb3k8L2tiZD4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kYlZlbmRvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIG9wdGlvbiBpcyBwYXNzZWQgdG8gZWpiZGVwbG95LiAKLSAgICAgICAgICAgICAgICAgICA8cD4KLSAgICAgICAgICAgICAgICAgICBWYWxpZCBvcHRpb25zIGNhbiBiZSBvYnRhaW5lZCBieSBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKLSAgICAgICAgICAgICAgICAgICA8Y29kZT4KLSAgICAgICAgICAgICAgICAgICAmbHQ7V0FTX0hPTUUmZ3Q7L2Jpbi9FSkJEZXBsb3kuW3NoL2JhdF0gLWhlbHAKLSAgICAgICAgICAgICAgICAgICA8L2NvZGU+Ci0gICAgICAgICAgICAgICAgICAgPC9wPgotICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGFsc28gdXNlZCB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIE1hcC5tYXB4bWkgYW5kCi0gICAgICAgICAgICAgICAgICAgICBTY2hlbWEuZGJ4bWkgZmlsZXMsIGZvciBleGFtcGxlIEFjY291bnQtREIyVURCV0lOX1Y3MS1NYXAubWFweG1pCi0gICAgICAgICAgICAgICAgICAgICBhbmQgQWNjb3VudC1EQjJVREJXSU5fVjcxLVNjaGVtYS5kYnhtaS4KLSAgICAgICAgICAgICAgICAgICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRiVmVuZG9yPC90ZD4KKyAgICA8dGQ+VGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIDxrYmQ+ZWpiZGVwbG95PC9rYmQ+LiAgVmFsaWQgb3B0aW9ucyBjYW4gYmUgb2J0YWluZWQgYnkgcnVubmluZyB0aGUKKyAgICAgIGZvbGxvd2luZyBjb21tYW5kOiA8cHJlPiZsdDtXQVNfSE9NRSZndDsvYmluL0VKQkRlcGxveS5bc2gvYmF0XSAtaGVscDwvcHJlPiBUaGlzIGlzIGFsc28gdXNlZAorICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSA8Y29kZT5NYXAubWFweG1pPC9jb2RlPiBhbmQgPGNvZGU+U2NoZW1hLmRieG1pPC9jb2RlPiBmaWxlcywgZm9yCisgICAgICBleGFtcGxlIDxzYW1wPkFjY291bnQtREIyVURCV0lOX1Y3MS1NYXAubWFweG1pPC9zYW1wPgorICAgICAgYW5kIDxzYW1wPkFjY291bnQtREIyVURCV0lOX1Y3MS1TY2hlbWEuZGJ4bWk8L3NhbXA+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29kZWdlbjxicj5xdWlldDxicj5ub3ZhbGlkYXRlPGJyPm5vaW5mb3JtPGJyPnRyYWNlPGJyPgotICAgICAgICAgICAgICAgICAgICAgdXNlMzVNYXBwaW5nUnVsZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlc2Ugb3B0aW9ucyBhcmUgYWxsIHBhc3NlZCB0byBlamJkZXBsb3kuIEFsbCBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICBleGNlcHQgJ3F1aWV0JyBkZWZhdWx0IHRvIGZhbHNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvZGVnZW48YnIvPnF1aWV0PGJyLz5ub3ZhbGlkYXRlPGJyLz5ub2luZm9ybTxici8+dHJhY2U8YnIvPnVzZTM1TWFwcGluZ1J1bGVzPC90ZD4KKyAgICA8dGQ+VGhlc2Ugb3B0aW9ucyBhcmUgYWxsIHBhc3NlZCB0byA8a2JkPmVqYmRlcGxveTwva2JkPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT4gKGV4Y2VwdCBmb3IgPHZhcj5xdWlldDwvdmFyPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ybWljT3B0aW9uczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIG9wdGlvbiBpcyBwYXNzZWQgdG8gZWpiZGVwbG95IGFuZCB3aWxsIGJlIHBhc3NlZAotICAgICAgICAgICAgICAgICAgICAgb24gdG8gcm1pYy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ybWljT3B0aW9uczwvdGQ+CisgICAgICA8dGQ+VGhpcyBvcHRpb24gaXMgcGFzc2VkIHRvIDxrYmQ+ZWpiZGVwbG95PC9rYmQ+IGFuZCB3aWxsIGJlIHBhc3NlZCBvbgorICAgICAgICB0byA8a2JkPnJtaWM8L2tiZD4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+VGhpcyBleGFtcGxlIHNob3dzIGVqYmphciBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGRlcGxveW1lbnQgamFycyBmb3IgYWxsIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMKLWluIHRoZSBkZXNjcmlwdG9yIGRpcjo8L3A+Cis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgPGNvZGU+ZWpiamFyPC9jb2RlPiBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGRlcGxveW1lbnQgamFycyBmb3IgYWxsIGRlcGxveW1lbnQKK2Rlc2NyaXB0b3JzIGluIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj46PC9wPgogCiA8cHJlPgotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3dlYnNwaGVyZS5ob21lJnF1b3Q7IHZhbHVlPSZxdW90OyR7d2FzNC5ob21lfSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3N9IiBkZXNjcmlwdG9yZGlyPSJldGMvZWpiIiZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiotZWpiLWphci54bWwiLyZndDsKLSAgICAgICZsdDt3ZWJzcGhlcmUgZGJ2ZW5kb3I9IkRCMlVEQk9TMzkwX1Y2IgotICAgICAgICAgICAgICAgICBlamJkZXBsb3k9InRydWUiCi0gICAgICAgICAgICAgICAgIG9sZENNUD0iZmFsc2UiCi0gICAgICAgICAgICAgICAgIHRlbXBkaXI9Ii90bXAiCi0gICAgICAgICAgICAgICAgIGRlc3RkaXI9IiR7ZGlzdC5zZXJ2ZXJ9IiZndDsKLSAgICAgICAgJmx0O3dhc2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9kZXBsb3l0b29sL2l0cC9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUuYm9vdC9ib290LmphciIvJmd0OwotICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2RlcGxveXRvb2wvaXRwL3BsdWdpbnMvY29tLmlibS5ldG9vbHMuZWpiZGVwbG95L3J1bnRpbWUvYmF0Y2guamFyIi8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vbGliL3hlcmNlcy5qYXIiLyZndDsKLSAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9saWIvaXZqZWpiMzUuamFyIi8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vbGliL2oyZWUuamFyIi8mZ3Q7Ci0gICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vbGliL3ZhcHJ0LmphciIvJmd0OwotICAgICAgICAmbHQ7L3dhc2NsYXNzcGF0aCZndDsKKyZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O3dlYnNwaGVyZS5ob21lJnF1b3Q7IHZhbHVlPSZxdW90OyR7d2FzNC5ob21lfSZxdW90Oy8mZ3Q7CismbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc30iIGRlc2NyaXB0b3JkaXI9ImV0Yy9lamIiJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSIqLWVqYi1qYXIueG1sIi8mZ3Q7CisgICZsdDt3ZWJzcGhlcmUgZGJ2ZW5kb3I9IkRCMlVEQk9TMzkwX1Y2IgorICAgICAgICAgICAgIGVqYmRlcGxveT0idHJ1ZSIKKyAgICAgICAgICAgICBvbGRDTVA9ImZhbHNlIgorICAgICAgICAgICAgIHRlbXBkaXI9Ii90bXAiCisgICAgICAgICAgICAgZGVzdGRpcj0iJHtkaXN0LnNlcnZlcn0iJmd0OworICAgICZsdDt3YXNjbGFzc3BhdGgmZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9kZXBsb3l0b29sL2l0cC9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUuYm9vdC9ib290LmphciIvJmd0OworICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke3dhczQuaG9tZX0vZGVwbG95dG9vbC9pdHAvcGx1Z2lucy9jb20uaWJtLmV0b29scy5lamJkZXBsb3kvcnVudGltZS9iYXRjaC5qYXIiLyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2xpYi94ZXJjZXMuamFyIi8mZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9saWIvaXZqZWpiMzUuamFyIi8mZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2FzNC5ob21lfS9saWIvajJlZS5qYXIiLyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt3YXM0LmhvbWV9L2xpYi92YXBydC5qYXIiLyZndDsKKyAgICAmbHQ7L3dhc2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgJmx0O3BhdGggcmVmaWQ9ImJ1aWxkLmNsYXNzcGF0aCIvJmd0OworICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAmbHQ7L3dlYnNwaGVyZSZndDsKKyAgJmx0O2R0ZCBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCisgICAgICAgbG9jYXRpb249IiR7bGlifS9kdGQvZWpiLWphcl8xXzEuZHRkIi8mZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KKworPGgzIGlkPSJlamJqYXJfaXBsYW5ldCI+aVBsYW5ldCBBcHBsaWNhdGlvbiBTZXJ2ZXIgKGlBUykgZWxlbWVudDwvaDM+CisKKzxwPlRoZSA8Y29kZT4mbHQ7aXBsYW5ldCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgaUFTLXNwZWNpZmljIHN0dWJzIGFuZCBza2VsZXRvbnMKK2FuZCBjb25zdHJ1Y3QgYSBKQVIgZmlsZSB3aGljaCBtYXkgYmUgZGVwbG95ZWQgdG8gdGhlIGlQbGFuZXQgQXBwbGljYXRpb24gU2VydmVyIDYuMC4gIFRoZSBidWlsZAorcHJvY2VzcyB3aWxsIGFsd2F5cyBkZXRlcm1pbmUgaWYgdGhlIEVKQiBzdHVicy9za2VsZXRvbnMgYW5kIHRoZSBFSkIgamFyIGZpbGUgYXJlIHVwIHRvIGRhdGUsIGFuZCBpdAord2lsbCBkbyB0aGUgbWluaW11bSBhbW91bnQgb2Ygd29yayByZXF1aXJlZC48L3A+Cis8cD5MaWtlIHRoZSA8Y29kZT53ZWJsb2dpYzwvY29kZT4gZWxlbWVudCwgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgdGhlIEVKQiBkZXNjcmlwdG9ycyBpcyBtb3N0Citjb21tb25seSB1c2VkIHRvIHNwZWNpZnkgdGhlIG5hbWUgZm9yIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgdGhlIEVKQgorZGVzY3JpcHRvciA8c2FtcD5lamIvQWNjb3VudC1lamItamFyLnhtbDwvc2FtcD4gaXMgZm91bmQgaW4gdGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5LAordGhlIDxjb2RlPmlwbGFuZXQ8L2NvZGU+IGVsZW1lbnQgd2lsbCBzZWFyY2ggZm9yIGFuIGlBUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciBmaWxlCituYW1lZCA8c2FtcD5lamIvQWNjb3VudC1pYXMtZWpiLWphci54bWw8L3NhbXA+IChpZiBpdCBpc24ndCBmb3VuZCwgdGhlIHRhc2sgd2lsbCBmYWlsKSBhbmQgYSBKQVIKK2ZpbGUgbmFtZWQgPHNhbXA+ZWpiL0FjY291bnQuamFyPC9zYW1wPiB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIE5vdGUgdGhhdAord2hlbiB0aGUgRUpCIGRlc2NyaXB0b3JzIGFyZSBhZGRlZCB0byB0aGUgSkFSIGZpbGUsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKK3JlbmFtZWQgPHNhbXA+TUVUQS1JTkYvZWpiLWphci54bWw8L3NhbXA+IGFuZCA8c2FtcD5NRVRBLUlORi9pYXMtZWpiLWphci54bWw8L3NhbXA+LjwvcD4KKzxwPk9mIGNvdXJzZSwgdGhpcyBuYW1pbmcgYmVoYXZpb3VyIGNhbiBiZSBtb2RpZmllZCBieSBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgaW4KK3RoZSA8Y29kZT5lamJqYXI8L2NvZGU+IHRhc2sgKGZvciBleGFtcGxlLCA8dmFyPmJhc2VqYXJuYW1lPC92YXI+LCA8dmFyPmJhc2VuYW1ldGVybWluYXRvcjwvdmFyPiwKK2FuZCA8dmFyPmZsYXRkZXN0ZGlyPC92YXI+KSBhcyB3ZWxsIGFzIHRoZSA8Y29kZT5pcGxhbmV0PC9jb2RlPiBlbGVtZW50IChmb3IKK2V4YW1wbGUsIDx2YXI+c3VmZml4PC92YXI+KS4gIFJlZmVyIHRvIHRoZSBhcHByb3ByaWF0ZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+CisKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5kZXN0ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBKQVIgZmlsZXMgd2lsbCBiZSB3cml0dGVuLiBFYWNoIEpBUiBmaWxlIGlzCisgICAgICB3cml0dGVuIGluIGRpcmVjdG9yaWVzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj4KKyAgICAgIG5hbWVzcGFjZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBFSkIgc3R1YnMgYW5kIHNrZWxldG9ucy4gIElmCisgICAgICBzcGVjaWZpZWQsIDx2YXI+Y2xhc3NwYXRoPC92YXI+IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIGluIHRoZQorICAgICAgcGFyZW50IDxjb2RlPmVqYmphcjwvY29kZT4gdGFzay4gTm90ZSB0aGF0IG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnRzIG1heSBhbHNvIGJlCisgICAgICB1c2VkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+ZWpiamFyPC9jb2RlPiBwYXJlbnQgdGFzazwvdGQ+CisgIDwvdHI+CisKKyAgPHRyPgorICAgIDx0ZD5rZWVwZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBKYXZhIHNvdXJjZSBmaWxlcyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ5IDxrYmQ+ZWpiYzwva2JkPiB3aWxsCisgICAgICBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIElmIDxxPnllczwvcT4sIHRoZSBzb3VyY2UgZmlsZXMgd2lsbCBiZSByZXRhaW5lZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmRlYnVnPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSA8a2JkPmVqYmM8L2tiZD4gdXRpbGl0eSBzaG91bGQgbG9nIGFkZGl0aW9uYWwgZGVidWdnaW5nCisgICAgICBzdGF0ZW1lbnRzIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuIElmIDxxPnllczwvcT4sIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzIHdpbGwgYmUKKyAgICAgIGdlbmVyYXRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPmlhc2hvbWU8L3RkPgorICAgIDx0ZD5NYXkgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSAiaG9tZSIgZGlyZWN0b3J5IGZvciB0aGlzIGlBUyBpbnN0YWxsYXRpb24uICBUaGlzIGlzIHVzZWQgdG8gZmluZAorICAgICAgdGhlIDxrYmQ+ZWpiYzwva2JkPiB1dGlsaXR5IGlmIGl0IGlzbid0IGluY2x1ZGVkIGluIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguICBJZiBzcGVjaWZpZWQsIGl0CisgICAgICBzaG91bGQgcmVmZXIgdG8gdGhlIDxzYW1wPltpbnN0YWxsLWxvY2F0aW9uXS9pcGxhbmV0L2lhczYvaWFzPC9zYW1wPiBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+Tm87IGJ5IGRlZmF1bHQsIHRoZSA8a2JkPmVqYmM8L2tiZD4gdXRpbGl0eSBtdXN0IGJlIG9uIHRoZSB1c2VyJ3Mgc3lzdGVtIHBhdGguPC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPnN1ZmZpeDwvdGQ+CisgICAgPHRkPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgSkFSIGZpbGVuYW1lIHdoZW4gY3JlYXRpbmcgZWFjaCBKQVIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPi5qYXI8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPkFzIG5vdGVkIGFib3ZlLCB0aGUgPGNvZGU+aXBsYW5ldDwvY29kZT4gZWxlbWVudCBzdXBwb3J0cworYWRkaXRpb25hbCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzxoMz5FeGFtcGxlczwvaDM+Cis8cD5UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB0eXBpY2FsIHVzZSBvZiB0aGUgPGNvZGU+Jmx0O2lwbGFuZXQmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudC4gIEl0Cit3aWxsIG5hbWUgZWFjaCBFSkIgamFyIHVzaW5nIHRoZSAiYmFzZW5hbWUiIHByZXBlbmRlZCB0byBlYWNoIHN0YW5kYXJkIEVKQiBkZXNjcmlwdG9yLiAgRm9yIGV4YW1wbGUsCitpZiB0aGUgZGVzY3JpcHRvciBuYW1lZCA8c2FtcD5BY2NvdW50LWVqYi1qYXIueG1sPC9zYW1wPiBpcyBwcm9jZXNzZWQsIHRoZSBFSkItSkFSIHdpbGwgYmUKK25hbWVkIDxzYW1wPkFjY291bnQuamFyPC9zYW1wPjwvcD4KKzxwcmU+CismbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKKyAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtzcmN9IiZndDsKKworICAgICZsdDtpcGxhbmV0IGRlc3RkaXI9IiR7YXNzZW1ibGUuZWpiamFyfSIKKyAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7aWFzLmVqYmMuY3BhdGh9Ii8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi1lamItamFyLnhtbCIvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKKyZsdDsvZWpiamFyJmd0OzwvcHJlPgorCis8cD5UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBuZXN0ZWQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBlbGVtZW50IGFzIHdlbGwgYXMgc29tZSBvZgordGhlIG90aGVyIG9wdGlvbmFsIGF0dHJpYnV0ZXMuPC9wPgorPHByZT4KKyZsdDtlamJqYXIgc3JjZGlyPSIke2J1aWxkLmNsYXNzZXNkaXJ9IgorICAgICAgICBkZXNjcmlwdG9yZGlyPSIke3NyY30iJmd0OworCisgICAgJmx0O2lwbGFuZXQgZGVzdGRpcj0iJHthc3NlbWJsZS5lamJqYXJ9IgorICAgICAgICAgICAgIGlhc2hvbWU9IiR7aWFzLmhvbWV9IgorICAgICAgICAgICAgIGRlYnVnPSJ5ZXMiCisgICAgICAgICAgICAga2VlcGdlbmVyYXRlZD0ieWVzIiZndDsKICAgICAgICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0iYnVpbGQuY2xhc3NwYXRoIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iLiIvJmd0OworICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGQuY2xhc3NwYXRofSIvJmd0OwogICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLSAgICAgICZsdDsvd2Vic3BoZXJlJmd0OwotICAgICAgJmx0O2R0ZCBwdWJsaWNJZD0iLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iCi0gICAgICAgICAgIGxvY2F0aW9uPSIke2xpYn0vZHRkL2VqYi1qYXJfMV8xLmR0ZCIvJmd0OwotICAgICZsdDsvZWpiamFyJmd0OwotPC9wcmU+CisgICAgJmx0Oy9pcGxhbmV0Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi8qaWFzLSoueG1sIi8mZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9ImVqYmphcl9pcGxhbmV0Ij5pUGxhbmV0IEFwcGxpY2F0aW9uIFNlcnZlciAoaUFTKSBlbGVtZW50PC9hPjwvaDM+Cis8cD5UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgPHZhcj5iYXNlamFybmFtZTwvdmFyPiBhdHRyaWJ1dGUuICBJbiB0aGlzIGNhc2UsIHRoZQorY29tcGxldGVkIEVKQiBqYXIgd2lsbCBiZSBuYW1lZCA8c2FtcD5IZWxsb1dvcmxkLmphcjwvc2FtcD4uICBJZiBtdWx0aXBsZSBFSkIgZGVzY3JpcHRvcnMgbWlnaHQgYmUKK2ZvdW5kLCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlIGNvbXBsZXRlZCBKQVIgZmlsZXMgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIuPC9wPgogCi1UaGUgJmx0O2lwbGFuZXQmbHQ7IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgaUFTLXNwZWNpZmljIHN0dWJzIGFuZAotCi1za2VsZXRvbnMgYW5kIGNvbnN0cnVjdCBhIEpBUiBmaWxlIHdoaWNoIG1heSBiZSBkZXBsb3llZCB0byB0aGUgaVBsYW5ldAotQXBwbGljYXRpb24gU2VydmVyIDYuMC4gIFRoZSBidWlsZCBwcm9jZXNzIHdpbGwgYWx3YXlzIGRldGVybWluZSBpZgotdGhlIEVKQiBzdHVicy9za2VsZXRvbnMgYW5kIHRoZSBFSkItSkFSIGZpbGUgYXJlIHVwIHRvIGRhdGUsIGFuZCBpdCB3aWxsCi1kbyB0aGUgbWluaW11bSBhbW91bnQgb2Ygd29yayByZXF1aXJlZC4KLTxwPkxpa2UgdGhlIFdlYkxvZ2ljIGVsZW1lbnQsIGEgbmFtaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBFSkIgZGVzY3JpcHRvcnMKLWlzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBzcGVjaWZ5IHRoZSBuYW1lIGZvciB0aGUgY29tcGxldGVkIEpBUiBmaWxlLgotRm9yIGV4YW1wbGUsIGlmIHRoZSBFSkIgZGVzY3JpcHRvciBlamIvQWNjb3VudC1lamItamFyLnhtbCBpcyBmb3VuZCBpbgotdGhlIGRlc2NyaXB0b3IgZGlyZWN0b3J5LCB0aGUgaXBsYW5ldCBlbGVtZW50IHdpbGwgc2VhcmNoIGZvciBhbiBpQVMtc3BlY2lmaWMKLUVKQiBkZXNjcmlwdG9yIGZpbGUgbmFtZWQgZWpiL0FjY291bnQtaWFzLWVqYi1qYXIueG1sIChpZiBpdCBpc24ndCBmb3VuZCwKLXRoZSB0YXNrIHdpbGwgZmFpbCkgYW5kIGEgSkFSIGZpbGUgbmFtZWQgZWpiL0FjY291bnQuamFyIHdpbGwgYmUgd3JpdHRlbgotaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gIE5vdGUgdGhhdCB3aGVuIHRoZSBFSkIgZGVzY3JpcHRvcnMKLWFyZSBhZGRlZCB0byB0aGUgSkFSIGZpbGUsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgcmVuYW1lZCBNRVRBLUlORi9lamItamFyLnhtbAotYW5kIE1FVEEtSU5GL2lhcy1lamItamFyLnhtbC48L3A+Ci08cD5PZiBjb3Vyc2UsIHRoaXMgbmFtaW5nIGJlaGF2aW91ciBjYW4gYmUgbW9kaWZpZWQgYnkgc3BlY2lmeWluZyBhdHRyaWJ1dGVzCi1pbiB0aGUgZWpiamFyIHRhc2sgKGZvciBleGFtcGxlLCBiYXNlamFybmFtZSwgYmFzZW5hbWV0ZXJtaW5hdG9yLCBhbmQgZmxhdGRlc3RkaXIpCi1hcyB3ZWxsIGFzIHRoZSBpcGxhbmV0IGVsZW1lbnQgKGZvciBleGFtcGxlLCBzdWZmaXgpLiAgUmVmZXIgdG8gdGhlCi1hcHByb3ByaWF0ZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgotPGgzPgotUGFyYW1ldGVyczo8L2gzPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotCi08dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgSkFSIGZpbGVzIHdpbGwKLWJlIHdyaXR0ZW4uIEVhY2ggSkFSIGZpbGUgaXMgd3JpdHRlbiBpbiBkaXJlY3RvcmllcyB3aGljaCBjb3JyZXNwb25kIHRvCi10aGVpciBsb2NhdGlvbiB3aXRoaW4gdGhlICJkZXNjcmlwdG9yZGlyIiBuYW1lc3BhY2UuPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGdlbmVyYXRpbmcgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMuCi1JZiBvbWl0dGVkLCB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgImVqYmphciIgcGFyZW50IHRhc2sgd2lsbCBiZQotdXNlZC4gIElmIHNwZWNpZmllZCwgdGhlIGNsYXNzcGF0aCBlbGVtZW50cyB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUKLWNsYXNzcGF0aCBzcGVjaWZpZWQgaW4gdGhlIHBhcmVudCAiZWpiamFyIiB0YXNrLiBOb3RlIHRoYXQgbmVzdGVkICJjbGFzc3BhdGgiCi1lbGVtZW50cyBtYXkgYWxzbyBiZSB1c2VkLjwvdGQ+Ci0KLTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZQotZ2VuZXJhdGVkIGJ5IGVqYmMgd2lsbCBiZSBzYXZlZCBvciBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuIElmICJ5ZXMiLCB0aGUKLXNvdXJjZSBmaWxlcyB3aWxsIGJlIHJldGFpbmVkLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIm5vIi4gPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KLQotPHRkPkluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgZWpiYyB1dGlsaXR5IHNob3VsZCBsb2cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcKLXN0YXRlbWVudHMgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gSWYgInllcyIsIHRoZSBhZGRpdGlvbmFsIGRlYnVnZ2luZyBzdGF0ZW1lbnRzCi13aWxsIGJlIGdlbmVyYXRlZC4gIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvICJubyIuIDwvdGQ+Ci0KLTx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj5pYXNob21lPC90ZD4KLQotPHRkPk1heSBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlICJob21lIiBkaXJlY3RvcnkgZm9yIHRoaXMgaUFTIGluc3RhbGxhdGlvbi4KLVRoaXMgaXMgdXNlZCB0byBmaW5kIHRoZSBlamJjIHV0aWxpdHkgaWYgaXQgaXNuJ3QgaW5jbHVkZWQgaW4gdGhlIHVzZXIncwotc3lzdGVtIHBhdGguICBJZiBzcGVjaWZpZWQsIGl0IHNob3VsZCByZWZlciB0byB0aGUgW2luc3RhbGwtbG9jYXRpb25dL2lwbGFuZXQvaWFzNi9pYXMKLWRpcmVjdG9yeS4gIElmIG9taXR0ZWQsIHRoZSBlamJjIHV0aWxpdHkgbXVzdCBiZSBvbiB0aGUgdXNlcidzIHN5c3RlbQotcGF0aC4gPC90ZD4KLQotPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+Ci0KLTx0ZD5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIEpBUiBmaWxlbmFtZSB3aGVuIGNyZWF0aW5nIGVhY2ggSkFSLgotSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiLiA8L3RkPgotCi08dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotCi08cD5BcyBub3RlZCBhYm92ZSwgdGhlIGlwbGFuZXQgZWxlbWVudCBzdXBwb3J0cyBhZGRpdGlvbmFsIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgotbmVzdGVkIGVsZW1lbnRzLjwvcD4KLTxoMz4KLUV4YW1wbGVzPC9oMz4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHR5cGljYWwgdXNlIG9mIHRoZSA8Y29kZT4mbHQ7aXBsYW5ldCZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50LgotSXQgd2lsbCBuYW1lIGVhY2ggRUpCLUpBUiB1c2luZyB0aGUgImJhc2VuYW1lIiBwcmVwZW5kZWQgdG8gZWFjaCBzdGFuZGFyZAotRUpCIGRlc2NyaXB0b3IuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGRlc2NyaXB0b3IgbmFtZWQgIkFjY291bnQtZWpiLWphci54bWwiCi1pcyBwcm9jZXNzZWQsIHRoZSBFSkItSkFSIHdpbGwgYmUgbmFtZWQgIkFjY291bnQuamFyIgogPHByZT4KLSAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKLSAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7c3JjfSImZ3Q7CismbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKKyAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtzcmN9IgorICAgICAgICBiYXNlamFybmFtZT0iSGVsbG9Xb3JsZCImZ3Q7CiAKLSAgICAgICAgICAgICZsdDtpcGxhbmV0IGRlc3RkaXI9IiR7YXNzZW1ibGUuZWpiamFyfSIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtpYXMuZWpiYy5jcGF0aH0iLyZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKLSAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKLSAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKyAgICAmbHQ7aXBsYW5ldCBkZXN0ZGlyPSIke2Fzc2VtYmxlLmVqYmphcn0iCisgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2lhcy5lamJjLmNwYXRofSIvJmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi8qaWFzLSoueG1sIi8mZ3Q7CismbHQ7L2VqYmphciZndDs8L3ByZT4KIAotVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIGEgbmVzdGVkIGNsYXNzcGF0aCBlbGVtZW50IGFzIHdlbGwKLWFzIHNvbWUgb2YgdGhlIG90aGVyIG9wdGlvbmFsIGF0dHJpYnV0ZXMuCis8cD5UaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPmR0ZDwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIElmIHRoZSBsb2NhbCBjb3BpZXMgb2YKK3RoZSBEVERzIGFyZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3NwYXRoLCB0aGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSByZWZlcmVuY2VkIHdpdGhvdXQgdGhlIG5lc3RlZAorZWxlbWVudHMuICBJbiBpQVMgNi4wIFNQMiwgdGhlc2UgbG9jYWwgRFREcyBhcmUgZm91bmQgaW4KK3RoZSA8c2FtcD5baUFTLWluc3RhbGwtZGlyZWN0b3J5XS9BUFBTPC9zYW1wPiBkaXJlY3RvcnkuICBJbiBpQVMgNi4wIFNQMywgdGhlc2UgbG9jYWwgRFREcyBhcmUgZm91bmQKK2luIHRoZSA8c2FtcD5baUFTLWluc3RhbGwtZGlyZWN0b3J5XS9kdGQ8L3NhbXA+IGRpcmVjdG9yeS48L3A+CisKIDxwcmU+Ci0gICAgJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc2Rpcn0iCi0gICAgICAgICAgICBkZXNjcmlwdG9yZGlyPSIke3NyY30iJmd0OworJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc2Rpcn0iCisgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7c3JjfSImZ3Q7CisgICAgJmx0O2lwbGFuZXQgZGVzdGRpcj0iJHthc3NlbWJsZS5lamJqYXJ9IiZndDsKKyAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7aWFzLmVqYmMuY3BhdGh9Ii8mZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi1lamItamFyLnhtbCIvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKIAotICAgICAgICAgICAgJmx0O2lwbGFuZXQgZGVzdGRpcj0iJHthc3NlbWJsZS5lamJqYXJ9IgotICAgICAgICAgICAgICAgICAgICAgaWFzaG9tZT0iJHtpYXMuaG9tZX0iCi0gICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0ieWVzIgotICAgICAgICAgICAgICAgICAgICAga2VlcGdlbmVyYXRlZD0ieWVzIiZndDsKLSAgICAgICAgICAgICAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9Ii4iLyZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHtidWlsZC5jbGFzc3BhdGh9Ii8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAgICZsdDsvaXBsYW5ldCZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKLSAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKLSAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KKyAgICAmbHQ7ZHRkIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKKyAgICAgICAgIGxvY2F0aW9uPSIke2lhcy5ob21lfS9BUFBTL2VqYi1qYXJfMV8xLmR0ZCIvJmd0OworICAgICZsdDtkdGQgcHVibGljSWQ9Ii0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBpQVMgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4wLy9FTiIKKyAgICAgICAgIGxvY2F0aW9uPSIke2lhcy5ob21lfS9BUFBTL0lBU0VqYl9qYXJfMV8wLmR0ZCIvJmd0OworJmx0Oy9lamJqYXImZ3Q7PC9wcmU+CiAKLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBiYXNlamFybmFtZSBhdHRyaWJ1dGUuICBJbiB0aGlzCi1jYXNlLCB0aGUgY29tcGxldGVkIEVKQi1KQVIgd2lsbCBiZSBuYW1lZCAiSGVsbG9Xb3JsZC5qYXIiICBJZiBtdWx0aXBsZQotRUpCIGRlc2NyaXB0b3JzIG1pZ2h0IGJlIGZvdW5kLCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlIGNvbXBsZXRlZAotSkFSIGZpbGVzIGRvbid0IG92ZXJ3cml0ZSBlYWNoIG90aGVyLgotPHByZT4KLSAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKLSAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7c3JjfSIKLSAgICAgICAgICAgIGJhc2VqYXJuYW1lPSJIZWxsb1dvcmxkIiZndDsKKzxoMyBpZD0iZWpiamFyX2pvbmFzIj5KT25BUyAoSmF2YSBPcGVuIEFwcGxpY2F0aW9uIFNlcnZlcikgZWxlbWVudDwvaDM+CiAKLSAgICAgICAgICAgICZsdDtpcGxhbmV0IGRlc3RkaXI9IiR7YXNzZW1ibGUuZWpiamFyfSIKLSAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtpYXMuZWpiYy5jcGF0aH0iLyZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKLSAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqLyppYXMtKi54bWwiLyZndDsKLSAgICAmbHQ7L2VqYmphciZndDs8L3ByZT4KLVRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgZHRkIG5lc3RlZCBlbGVtZW50LiBJZiB0aGUgbG9jYWwKLWNvcGllcyBvZiB0aGUgRFREcyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aCwgdGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKLXJlZmVyZW5jZWQgd2l0aG91dCB0aGUgbmVzdGVkIGVsZW1lbnRzLiAgSW4gaUFTIDYuMCBTUDIsIHRoZXNlIGxvY2FsIERURHMgYXJlCi1mb3VuZCBpbiB0aGUgW2lBUy1pbnN0YWxsLWRpcmVjdG9yeV0vQVBQUyBkaXJlY3RvcnkuICBJbiBpQVMgNi4wIFNQMywgdGhlc2UKLWxvY2FsIERURHMgYXJlIGZvdW5kIGluIHRoZSBbaUFTLWluc3RhbGwtZGlyZWN0b3J5XS9kdGQgZGlyZWN0b3J5LgotPHByZT4KLSAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzZGlyfSIKLSAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7c3JjfSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aXBsYW5ldCBkZXN0ZGlyPSIke2Fzc2VtYmxlLmVqYmphcn0iJmd0OwotICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2lhcy5lamJjLmNwYXRofSIvJmd0OwotICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi1lamItamFyLnhtbCIvJmd0OwotICAgICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iKiovKmlhcy0qLnhtbCIvJmd0OworPHA+VGhlIDxjb2RlPiZsdDtqb25hcyZndDs8L2NvZGU+IG5lc3RlZCBlbGVtZW50IGlzIHVzZWQgdG8gYnVpbGQgSk9uQVMtc3BlY2lmaWMgc3R1YnMgYW5kIHNrZWxldG9ucwordGhhbmtzIHRvIHRoZSA8Y29kZT5HZW5JQzwvY29kZT4gc3BlY2lmaWMgdG9vbCwgYW5kIGNvbnN0cnVjdCBhIEpBUiBmaWxlIHdoaWNoIG1heSBiZSBkZXBsb3llZCB0bwordGhlIEpPbkFTIEFwcGxpY2F0aW9uIFNlcnZlci4gVGhlIGJ1aWxkIHByb2Nlc3Mgd2lsbCBhbHdheXMgZGV0ZXJtaW5lIGlmIHRoZSBFSkIgc3R1YnMvc2tlbGV0b25zIGFuZAordGhlIEVKQiBqYXIgZmlsZSBhcmUgdXAgdG8gZGF0ZSwgYW5kIGl0IHdpbGwgZG8gdGhlIG1pbmltdW0gYW1vdW50IG9mIHdvcmsgcmVxdWlyZWQuPC9wPgogCi0gICAgICAgICAgICAmbHQ7ZHRkIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIKLSAgICAgICAgICAgICAgICAgbG9jYXRpb249IiR7aWFzLmhvbWV9L0FQUFMvZWpiLWphcl8xXzEuZHRkIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7ZHRkIHB1YmxpY0lkPSItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgaUFTIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgIGxvY2F0aW9uPSIke2lhcy5ob21lfS9BUFBTL0lBU0VqYl9qYXJfMV8wLmR0ZCIvJmd0OwotICAgICZsdDsvZWpiamFyJmd0OzwvcHJlPgorPHA+TGlrZSB0aGUgV2ViTG9naWMgZWxlbWVudCwgYSBuYW1pbmcgY29udmVudGlvbiBmb3IgdGhlIEVKQiBkZXNjcmlwdG9ycyBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgdG8KK3NwZWNpZnkgdGhlIG5hbWUgZm9yIHRoZSBjb21wbGV0ZWQgSkFSIGZpbGUuIEZvciBleGFtcGxlLCBpZiB0aGUgRUpCCitkZXNjcmlwdG9yIDxzYW1wPmVqYi9BY2NvdW50LWVqYi1qYXIueG1sPC9zYW1wPiBpcyBmb3VuZCBpbiB0aGUgZGVzY3JpcHRvciBkaXJlY3RvcnksCit0aGUgPGNvZGU+Jmx0O2pvbmFzJmd0OzwvY29kZT4gZWxlbWVudCB3aWxsIHNlYXJjaCBmb3IgYSBKT25BUy1zcGVjaWZpYyBFSkIgZGVzY3JpcHRvciBmaWxlCituYW1lZCA8c2FtcD5lamIvQWNjb3VudC1qb25hcy1lamItamFyLnhtbDwvc2FtcD4gYW5kIGEgSkFSIGZpbGUgbmFtZWQgPHNhbXA+ZWpiL0FjY291bnQuamFyPC9zYW1wPgord2lsbCBiZSB3cml0dGVuIGluIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIEJ1dCB0aGUgPGNvZGU+Jmx0O2pvbmFzJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYWxzbwordXNlIHRoZSBKT25BUyBuYW1pbmcgY29udmVudGlvbi4gV2l0aCB0aGUgc2FtZSBleGFtcGxlIGFzIGJlbG93LCB0aGUgRUpCIGRlc2NyaXB0b3IgY2FuIGFsc28gYmUKK25hbWVkIDxzYW1wPmVqYi9BY2NvdW50LnhtbDwvc2FtcD4gKG5vIGJhc2UgbmFtZSB0ZXJtaW5hdG9yIGhlcmUpIGluIHRoZSBkZXNjcmlwdG9yIGRpcmVjdG9yeS4gVGhlbgordGhlIDxjb2RlPiZsdDtqb25hcyZndDs8L2NvZGU+IGVsZW1lbnQgd2lsbCBzZWFyY2ggZm9yIGEgSk9uQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgZmlsZQorY2FsbGVkIDxzYW1wPmVqYi9qb25hcy1BY2NvdW50LnhtbDwvc2FtcD4uIFRoaXMgY29udmVudGlvbiBkbyBub3QgZm9sbG93IHN0cmljdGx5IHRoZSBFSkIgamFyIG5hbWluZworY29udmVudGlvbiByZWNvbW1lbmRhdGlvbiBidXQgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgdmVyc2lvbiBvZgorSk9uQVMuPC9wPgogCi08aDM+PGEgbmFtZT0iZWpiamFyX2pvbmFzIj5KT25BUyAoSmF2YSBPcGVuIEFwcGxpY2F0aW9uIFNlcnZlcikgZWxlbWVudDwvYT48L2gzPgotCi08cD5UaGUgPGNvZGU+Jmx0O2pvbmFzJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgaXMgdXNlZCB0byBidWlsZCBKT25BUy1zcGVjaWZpYyBzdHVicyBhbmQKLXNrZWxldG9ucyB0aGFua3MgdG8gdGhlIDxjb2RlPkdlbklDPC9jb2RlPiBzcGVjaWZpYyB0b29sLCBhbmQgY29uc3RydWN0IGEgSkFSCi1maWxlIHdoaWNoIG1heSBiZSBkZXBsb3llZCB0byB0aGUgSk9uQVMgQXBwbGljYXRpb24gU2VydmVyLiBUaGUgYnVpbGQgcHJvY2Vzcwotd2lsbCBhbHdheXMgZGV0ZXJtaW5lIGlmIHRoZSBFSkIgc3R1YnMvc2tlbGV0b25zIGFuZCB0aGUgRUpCLUpBUiBmaWxlIGFyZSB1cCB0bwotZGF0ZSwgYW5kIGl0IHdpbGwgZG8gdGhlIG1pbmltdW0gYW1vdW50IG9mIHdvcmsgcmVxdWlyZWQuPC9wPgotCi08cD5MaWtlIHRoZSBXZWJMb2dpYyBlbGVtZW50LCBhIG5hbWluZyBjb252ZW50aW9uIGZvciB0aGUgRUpCIGRlc2NyaXB0b3JzIGlzCi1tb3N0IGNvbW1vbmx5IHVzZWQgdG8gc3BlY2lmeSB0aGUgbmFtZSBmb3IgdGhlIGNvbXBsZXRlZCBKQVIgZmlsZS4gRm9yIGV4YW1wbGUsCi1pZiB0aGUgRUpCIGRlc2NyaXB0b3IgPGNvZGU+ZWpiL0FjY291bnQtZWpiLWphci54bWw8L2NvZGU+IGlzIGZvdW5kIGluIHRoZQotZGVzY3JpcHRvciBkaXJlY3RvcnksIHRoZSA8Y29kZT4mbHQ7am9uYXMmZ3Q7PC9jb2RlPiBlbGVtZW50IHdpbGwgc2VhcmNoIGZvciBhIEpPbkFTLXNwZWNpZmljCi1FSkIgZGVzY3JpcHRvciBmaWxlIG5hbWVkIDxjb2RlPmVqYi9BY2NvdW50LWpvbmFzLWVqYi1qYXIueG1sPC9jb2RlPiBhbmQgYSBKQVIKLWZpbGUgbmFtZWQgPGNvZGU+ZWpiL0FjY291bnQuamFyPC9jb2RlPiB3aWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGRlc3RpbmF0aW9uCi1kaXJlY3RvcnkuIEJ1dCB0aGUgPGNvZGU+Jmx0O2pvbmFzJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYWxzbyB1c2UgdGhlIEpPbkFTIG5hbWluZwotY29udmVudGlvbi4gV2l0aCB0aGUgc2FtZSBleGFtcGxlIGFzIGJlbG93LCB0aGUgRUpCIGRlc2NyaXB0b3IgY2FuIGFsc28gYmUgbmFtZWQKLTxjb2RlPmVqYi9BY2NvdW50LnhtbDwvY29kZT4gKG5vIGJhc2UgbmFtZSB0ZXJtaW5hdG9yIGhlcmUpIGluIHRoZSBkZXNjcmlwdG9yCi1kaXJlY3RvcnkuIFRoZW4gdGhlIDxjb2RlPiZsdDtqb25hcyZndDs8L2NvZGU+IGVsZW1lbnQgd2lsbCBzZWFyY2ggZm9yIGEgSk9uQVMtc3BlY2lmaWMgRUpCCi1kZXNjcmlwdG9yIGZpbGUgY2FsbGVkIDxjb2RlPmVqYi9qb25hcy1BY2NvdW50LnhtbDwvY29kZT4uIFRoaXMgY29udmVudGlvbiBkbwotbm90IGZvbGxvdyBzdHJpY3RseSB0aGUgZWpiLWphciBuYW1pbmcgY29udmVudGlvbiByZWNvbW1lbmRhdGlvbiBidXQgaXMKLXN1cHBvcnRlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHZlcnNpb24gb2YgSk9uQVMuPC9wPgotCi08cD5Ob3RlIHRoYXQgd2hlbiB0aGUgRUpCIGRlc2NyaXB0b3JzIGFyZSBhZGRlZCB0byB0aGUgSkFSIGZpbGUsIHRoZXkgYXJlCi1hdXRvbWF0aWNhbGx5IHJlbmFtZWQgPGNvZGU+TUVUQS1JTkYvZWpiLWphci54bWw8L2NvZGU+IGFuZAotPGNvZGU+TUVUQS1JTkYvam9uYXMtZWpiLWphci54bWw8L2NvZGU+LjwvcD4KKzxwPk5vdGUgdGhhdCB3aGVuIHRoZSBFSkIgZGVzY3JpcHRvcnMgYXJlIGFkZGVkIHRvIHRoZSBKQVIgZmlsZSwgdGhleSBhcmUgYXV0b21hdGljYWxseQorcmVuYW1lZCA8c2FtcD5NRVRBLUlORi9lamItamFyLnhtbDwvc2FtcD4gYW5kIDxzYW1wPk1FVEEtSU5GL2pvbmFzLWVqYi1qYXIueG1sPC9zYW1wPi48L3A+CiAKIDxwPk9mIGNvdXJzZSwgdGhpcyBuYW1pbmcgYmVoYXZpb3IgY2FuIGJlIG1vZGlmaWVkIGJ5IHNwZWNpZnlpbmcgYXR0cmlidXRlcyBpbgotdGhlIGVqYmphciB0YXNrIChmb3IgZXhhbXBsZSwgYmFzZWphcm5hbWUsIGJhc2VuYW1ldGVybWluYXRvciwgYW5kIGZsYXRkZXN0ZGlyKQotYXMgd2VsbCBhcyB0aGUgaXBsYW5ldCBlbGVtZW50IChmb3IgZXhhbXBsZSwgc3VmZml4KS4gUmVmZXIgdG8gdGhlIGFwcHJvcHJpYXRlCi1kb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuPC9wPgordGhlIDxjb2RlPmVqYmphcjwvY29kZT4gdGFzayAoZm9yIGV4YW1wbGUsIDx2YXI+YmFzZWphcm5hbWU8L3Zhcj4sIDx2YXI+YmFzZW5hbWV0ZXJtaW5hdG9yPC92YXI+LAorYW5kIDx2YXI+ZmxhdGRlc3RkaXI8L3Zhcj4pIGFzIHdlbGwgYXMgdGhlIDxjb2RlPmlwbGFuZXQ8L2NvZGU+IGVsZW1lbnQgKGZvcgorZXhhbXBsZSwgPHZhcj5zdWZmaXg8L3Zhcj4pLiBSZWZlciB0byB0aGUgYXBwcm9wcmlhdGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4KIAogPHA+VGhpcyB0YXNrIGNyZWF0ZXMgYSBkaXJlY3RvcnkgZm9yIHNjcmF0Y2ggZGF0YSBpbnNpZGUgb2YKICAgdGhlIDxhIGhyZWY9Ii4uL3J1bm5pbmcuaHRtbCN0bXBkaXIiPnRlbXBvcmFyeSBkaXJlY3Rvcnk8L2E+LjwvcD4KIAotPGgzPiBQYXJhbWV0ZXJzOjwvaDM+Cis8aDM+UGFyYW1ldGVyczwvaDM+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dGJvZHk+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPmRlc3RkaXI8L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIEpBUiBmaWxlcwotICAgICAgd2lsbCBiZSB3cml0dGVuLiBFYWNoIEpBUiBmaWxlIGlzIHdyaXR0ZW4gaW4gZGlyZWN0b3JpZXMgd2hpY2ggY29ycmVzcG9uZAotICAgICAgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSAiPGNvZGU+ZGVzY3JpcHRvcmRpcjwvY29kZT4iIG5hbWVzcGFjZS48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ZZXM8L3RkPgorICAgICAgPHRkPmRlc3RkaXI8L3RkPgorICAgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgSkFSIGZpbGVzIHdpbGwgYmUgd3JpdHRlbi4gRWFjaCBKQVIgZmlsZSBpcworICAgICAgICB3cml0dGVuIGluIGRpcmVjdG9yaWVzIHdoaWNoIGNvcnJlc3BvbmQgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluCisgICAgICAgIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj4gbmFtZXNwYWNlLjwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+am9uYXNyb290PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+VGhlIHJvb3QgZGlyZWN0b3J5IGZvciBKT25BUy48L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIiBhbGlnbj0iQ2VudGVyIj5ZZXM8L3RkPgorICAgICAgPHRkPmpvbmFzcm9vdDwvdGQ+CisgICAgICA8dGQ+VGhlIHJvb3QgZGlyZWN0b3J5IGZvciBKT25BUy48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPlRoZSBjbGFzc3BhdGggdXNlZCB3aGVuIGdlbmVyYXRpbmcgRUpCIHN0dWJzIGFuZAotICAgICAgc2tlbGV0b25zLiBJZiBvbWl0dGVkLCB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgImVqYmphciIgcGFyZW50Ci0gICAgICB0YXNrIHdpbGwgYmUgdXNlZC4gSWYgc3BlY2lmaWVkLCB0aGUgY2xhc3NwYXRoIGVsZW1lbnRzIHdpbGwgYmUgcHJlcGVuZGVkCi0gICAgICB0byB0aGUgY2xhc3NwYXRoIHNwZWNpZmllZCBpbiB0aGUgcGFyZW50ICJlamJqYXIiIHRhc2sgKHNlZSBhbHNvIHRoZSBPUkIKLSAgICAgIGF0dHJpYnV0ZSBkb2N1bWVudGF0aW9uIGJlbG93KS4gTm90ZSB0aGF0IG5lc3RlZCAiY2xhc3NwYXRoIiBlbGVtZW50cyBtYXkKLSAgICAgIGFsc28gYmUgdXNlZC48L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIiBhbGlnbj0iQ2VudGVyIj5ObzwvdGQ+CisgICAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHVzZWQgd2hlbiBnZW5lcmF0aW5nIEVKQiBzdHVicyBhbmQgc2tlbGV0b25zLiBJZgorICAgICAgICBzcGVjaWZpZWQsIDx2YXI+Y2xhc3NwYXRoPC92YXI+IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIGluIHRoZQorICAgICAgICBwYXJlbnQgPGNvZGU+ZWpiamFyPC9jb2RlPiB0YXNrIChzZWUgYWxzbyB0aGUgT1JCIGF0dHJpYnV0ZSBkb2N1bWVudGF0aW9uIGJlbG93KS4gTm90ZSB0aGF0CisgICAgICAgIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnRzIG1heSBhbHNvIGJlIHVzZWQuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPmVqYmphcjwvY29kZT4gcGFyZW50IHRhc2s8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5rZWVwZ2VuZXJhdGVkPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGludGVybWVkaWF0ZSBKYXZhCi0gICAgICBzb3VyY2UgZmlsZXMgZ2VuZXJhdGVkIGJ5IEdlbklDIG11c3QgYmUgZGVsZXRlZCBvciBub3QuIElmCi0gICAgICBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgICAgPHRkPmtlZXBnZW5lcmF0ZWQ8L3RkPgorICAgICAgPHRkPjxxPnRydWU8L3E+IGlmIHRoZSBpbnRlcm1lZGlhdGUgSmF2YSBzb3VyY2UgZmlsZXMgZ2VuZXJhdGVkIGJ5IEdlbklDIG11c3QgYmUgZGVsZXRlZCBvcgorICAgICAgbm90LjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPm5vY29tcGlsPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdlbmVyYXRlZCBzb3VyY2UgZmlsZXMKLSAgICAgIG11c3Qgbm90IGJlIGNvbXBpbGVkIHZpYSB0aGUgamF2YSBhbmQgcm1pIGNvbXBpbGVycy4gSWYgb21pdHRlZCwKLSAgICAgIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+bm9jb21waWw8L3RkPgorICAgICAgPHRkPjxxPnRydWU8L3E+IGlmIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIG11c3Qgbm90IGJlIGNvbXBpbGVkIHZpYSB0aGUgSmF2YSBhbmQgUk1JCisgICAgICBjb21waWxlcnMuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+bm92YWxpZGF0aW9uPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+PGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIG11c3QKLSAgICAgIGJlIHBhcnNlZCB3aXRob3V0IHZhbGlkYXRpb24uIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+bm92YWxpZGF0aW9uPC90ZD4KKyAgICAgIDx0ZD48cT50cnVlPC9xPiBpZiB0aGUgWE1MIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgbXVzdCBiZSBwYXJzZWQgd2l0aG91dCB2YWxpZGF0aW9uLjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPmphdmFjPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+SmF2YSBjb21waWxlciB0byB1c2UuIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzCi0gICAgICB0byB0aGUgdmFsdWUgb2YgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJUb3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5qYXZhYzwvdGQ+CisgICAgICA8dGQ+SmF2YSBjb21waWxlciB0byB1c2UuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdHMKKyAgICAgIHRvIHRoZSB2YWx1ZSBvZiA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHk8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5qYXZhY29wdHM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5PcHRpb25zIHRvIHBhc3MgdG8gdGhlIGphdmEgY29tcGlsZXIuPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgICAgPHRkPmphdmFjb3B0czwvdGQ+CisgICAgICA8dGQ+T3B0aW9ucyB0byBwYXNzIHRvIHRoZSBKYXZhIGNvbXBpbGVyLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5ybWljb3B0czwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPk9wdGlvbnMgdG8gcGFzcyB0byB0aGUgcm1pIGNvbXBpbGVyLjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249IkNlbnRlciIgdmFsaWduPSJUb3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5ybWljb3B0czwvdGQ+CisgICAgICA8dGQ+T3B0aW9ucyB0byBwYXNzIHRvIHRoZSBSTUkgY29tcGlsZXIuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnNlY3Byb3BhZzwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBSTUkgU2tlbC4gYW5kCi0gICAgICBTdHViLiBtdXN0IGJlIG1vZGlmaWVkIHRvIGltcGxlbWVudCB0aGUgaW1wbGljaXQgcHJvcGFnYXRpb24gb2YKLSAgICAgIHRoZSBzZWN1cml0eSBjb250ZXh0ICh0aGUgdHJhbnNhY3Rpb25hbCBjb250ZXh0IGlzIGFsd2F5cwotICAgICAgcHJvdmlkZWQpLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPHRkPnNlY3Byb3BhZzwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZTwvcT4gaWYgdGhlIFJNSSBza2VsZXRvbnMgYW5kIHN0dWJzIG11c3QgYmUgbW9kaWZpZWQgdG8gaW1wbGVtZW50IHRoZSBpbXBsaWNpdAorICAgICAgICBwcm9wYWdhdGlvbiBvZiB0aGUgc2VjdXJpdHkgY29udGV4dCAodGhlIHRyYW5zYWN0aW9uYWwgY29udGV4dCBpcyBhbHdheXMgcHJvdmlkZWQpLjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPnZlcmJvc2U8L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5JbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gdXNlIC12ZXJib3NlIHN3aXRjaC4gSWYKLSAgICAgIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHVzZSA8a2JkPi12ZXJib3NlPC9rYmQ+IHN3aXRjaC48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5hZGRpdGlvbmFsYXJnczwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPkFkZCBhZGRpdGlvbmFsIGFyZ3MgdG8gR2VuSUMuPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iQ2VudGVyIiB2YWxpZ249IlRvcCI+Tm88L3RkPgorICAgICAgPHRkPmFkZGl0aW9uYWxhcmdzPC90ZD4KKyAgICAgIDx0ZD5BZGQgYWRkaXRpb25hbCBhcmdzIHRvIEdlbklDLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5rZWVwZ2VuZXJpYzwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPjxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnZW5lcmljIEpBUiBmaWxlIHVzZWQgYXMgaW5wdXQKLSAgICAgIHRvIEdlbklDIG11c3QgYmUgcmV0YWluZWQuIElmIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+a2VlcGdlbmVyaWM8L3RkPgorICAgICAgPHRkPjxxPnRydWU8L3E+IGlmIHRoZSBnZW5lcmljIEpBUiBmaWxlIHVzZWQgYXMgaW5wdXQgdG8gR2VuSUMgbXVzdCBiZSByZXRhaW5lZC48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5qYXJzdWZmaXg8L3RkPgotICAgICAgPHRkPlN0cmluZyB2YWx1ZSBhcHBlbmRlZCB0byB0aGUgSkFSIGZpbGVuYW1lIHdoZW4gY3JlYXRpbmcgZWFjaCBKQVIuICBJZgotICAgICAgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gIi5qYXIiLiA8L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+amFyc3VmZml4PC90ZD4KKyAgICAgIDx0ZD5TdHJpbmcgdmFsdWUgYXBwZW5kZWQgdG8gdGhlIEpBUiBmaWxlbmFtZSB3aGVuIGNyZWF0aW5nIGVhY2ggSkFSLjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPi5qYXI8L3E+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRvcCI+b3JiPC90ZD4KLSAgICAgIDx0ZD5DaG9vc2UgeW91ciBPUkIgOiBSTUksIEpFUkVNSUUsIERBVklELiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byB0aGUKLSAgICAgIG9uZSBwcmVzZW50IGluIGNsYXNzcGF0aC4gSWYgc3BlY2lmaWVkLCB0aGUgY29ycmVzcG9uZGluZyBKT25BUyBKQVIgaXMKLSAgICAgIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGNsYXNzcGF0aC48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+b3JiPC90ZD4KKyAgICAgIDx0ZD5DaG9vc2UgeW91ciBPUkI6IDxxPlJNSTwvcT4sIDxxPkpFUkVNSUU8L3E+LCA8cT5EQVZJRDwvcT4uICBJZiBzcGVjaWZpZWQsIHRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIEpPbkFTIEpBUiBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIG9uZSBwcmVzZW50IGluIGNsYXNzcGF0aDwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJUb3AiPm5vZ2VuaWM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVG9wIj5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sCi0gICAgICBKT25BUydzIEdlbklDIHdpbGwgbm90IGJlIHJ1biBvbiB0aGUgRUpCIEpBUi4gVXNlIHRoaXMgaWYgeW91Ci0gICAgICBwcmVmZXIgdG8gcnVuIEdlbklDIGF0IGRlcGxveW1lbnQgdGltZS4gSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMKLSAgICAgIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJDZW50ZXIiIHZhbGlnbj0iVG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+bm9nZW5pYzwvdGQ+CisgICAgICA8dGQ+SWYgdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPnRydWU8L3E+LCBKT25BUydzIEdlbklDIHdpbGwgbm90IGJlIHJ1biBvbiB0aGUgRUpCIGphci4gVXNlCisgICAgICB0aGlzIGlmIHlvdSBwcmVmZXIgdG8gcnVuIEdlbklDIGF0IGRlcGxveW1lbnQgdGltZS48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICAgIDwvdHI+Ci0gICAgPHRyPgogICA8L3Rib2R5PgogPC90YWJsZT4KIAotPHA+QXMgbm90ZWQgYWJvdmUsIHRoZSBqb25hcyBlbGVtZW50IHN1cHBvcnRzIGFkZGl0aW9uYWwgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+Cis8cD5BcyBub3RlZCBhYm92ZSwgdGhlIDxjb2RlPmpvbmFzPC9jb2RlPiBlbGVtZW50IHN1cHBvcnRzIGFkZGl0aW9uYWwgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CiBuZXN0ZWQgZWxlbWVudHMuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgZGVwbG95bWVudCBqYXJzIHVzaW5nIGEKLUpPbkFTIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSByZXF1aXJlcyB0aGUgbmFtaW5nIHN0YW5kYXJkIHRvIGJlIHVzZWQgZm9yCi10aGUgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gVXNpbmcgdGhpcyBmb3JtYXQgd2lsbCBjcmVhdGUgYSBFSkIgSkFSIGZpbGUgZm9yCi1lYWNoIHZhcmlhdGlvbiBvZiAmbmJzcDsnKi1qYXIueG1sJyB0aGF0IGlzIGZvdW5kIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLWRpcmVjdG9yeS4mbmJzcDs8L3A+Cis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgPGNvZGU+ZWpiamFyPC9jb2RlPiBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGRlcGxveW1lbnQgamFycyB1c2luZyBhIEpPbkFTIEVKQgorY29udGFpbmVyLiBUaGlzIGV4YW1wbGUgcmVxdWlyZXMgdGhlIG5hbWluZyBzdGFuZGFyZCB0byBiZSB1c2VkIGZvciB0aGUgZGVwbG95bWVudAorZGVzY3JpcHRvcnMuIFVzaW5nIHRoaXMgZm9ybWF0IHdpbGwgY3JlYXRlIGEgRUpCIGphciBmaWxlIGZvciBlYWNoIHZhcmlhdGlvbgorb2YgPHNhbXA+Ki1qYXIueG1sPC9zYW1wPiB0aGF0IGlzIGZvdW5kIGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZGlyZWN0b3J5LjwvcD4KIAogPHByZT4KLSAgICAgICZsdDtlamJqYXIgc3JjZGlyPSIke2J1aWxkLmNsYXNzZXN9IgotICAgICAgICAgICAgICBkZXNjcmlwdG9yZGlyPSIke2Rlc2NyaXB0b3IuZGlyfSImZ3Q7Ci0gICAgICAgICZsdDtqb25hcyBkZXN0ZGlyPSIke2RlcGxveW1lbnRqYXJzLmRpcn0iCi0gICAgICAgICAgICAgam9uYXNyb290PSIke2pvbmFzLnJvb3R9IgotICAgICAgICAgICAgIG9yYj0iUk1JIi8mZ3Q7Ci0gICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyoueG1sIi8mZ3Q7Ci0gICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqL2pvbmFzLSoueG1sIi8mZ3Q7Ci0gICAgICAgICZsdDtzdXBwb3J0IGRpcj0iJHtidWlsZC5jbGFzc2VzfSImZ3Q7Ci0gICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5jbGFzcyIvJmd0OwotICAgICAgICAmbHQ7L3N1cHBvcnQmZ3Q7Ci0gICAgICAmbHQ7L2VqYmphciZndDsKLTwvcHJlPgorJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCisgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7ZGVzY3JpcHRvci5kaXJ9IiZndDsKKyAgJmx0O2pvbmFzIGRlc3RkaXI9IiR7ZGVwbG95bWVudGphcnMuZGlyfSIKKyAgICAgICBqb25hc3Jvb3Q9IiR7am9uYXMucm9vdH0iCisgICAgICAgb3JiPSJSTUkiLyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi54bWwiLyZndDsKKyAgJmx0O2V4Y2x1ZGUgbmFtZT0iKiovam9uYXMtKi54bWwiLyZndDsKKyAgJmx0O3N1cHBvcnQgZGlyPSIke2J1aWxkLmNsYXNzZXN9IiZndDsKKyAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmNsYXNzIi8mZ3Q7CisgICZsdDsvc3VwcG9ydCZndDsKKyZsdDsvZWpiamFyJmd0OzwvcHJlPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgZWpiamFyIGJlaW5nIHVzZWQgdG8gZ2VuZXJhdGUgYSBzaW5nbGUgZGVwbG95bWVudCBqYXIKLXVzaW5nIGEgSk9uQVMgRUpCIGNvbnRhaW5lci4gVGhpcyBleGFtcGxlIGRvZXMgcmVxdWlyZSB0aGUgZGVwbG95bWVudAotZGVzY3JpcHRvcnMgdG8gdXNlIHRoZSBuYW1pbmcgc3RhbmRhcmQuIFRoaXMgd2lsbCBjcmVhdGUgb25seSBvbmUgZWpiIGphciBmaWxlIC0KLSdUaGVFSkJKYXIuamFyJy48L3A+Cis8cD5UaGlzIGV4YW1wbGUgc2hvd3MgPGNvZGU+ZWpiamFyPC9jb2RlPiBiZWluZyB1c2VkIHRvIGdlbmVyYXRlIGEgc2luZ2xlIGRlcGxveW1lbnQgamFyIHVzaW5nIGEKK0pPbkFTIEVKQiBjb250YWluZXIuIFRoaXMgZXhhbXBsZSBkb2VzIHJlcXVpcmUgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgdG8gdXNlIHRoZSBuYW1pbmcKK3N0YW5kYXJkLiBUaGlzIHdpbGwgY3JlYXRlIG9ubHkgb25lIEVKQiBqYXIgZmlsZSZtZGFzaDs8c2FtcD5UaGVFSkJKYXIuamFyPC9zYW1wPi48L3A+CiAKIDxwcmU+Ci0gICAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzfSIKLSAgICAgICAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtkZXNjcmlwdG9yLmRpcn0iCi0gICAgICAgICAgICAgIGJhc2VqYXJuYW1lPSJUaGVFSkJKYXIiJmd0OwotICAgICAgICAmbHQ7am9uYXMgZGVzdGRpcj0iJHtkZXBsb3ltZW50amFycy5kaXJ9IgotICAgICAgICAgICAgICAgICAgam9uYXNyb290PSIke2pvbmFzLnJvb3R9IgotICAgICAgICAgICAgICAgICAgc3VmZml4PSIuamFyIgotICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoPSIke2Rlc2NyaXB0b3JidWlsZC5jbGFzc3BhdGh9Ii8mZ3Q7Ci0gICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqL2VqYi1qYXIueG1sIi8mZ3Q7Ci0gICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqL2pvbmFzLWVqYi1qYXIueG1sIi8mZ3Q7Ci0gICAgICAmbHQ7L2VqYmphciZndDsKLTwvcHJlPgorJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCisgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7ZGVzY3JpcHRvci5kaXJ9IgorICAgICAgICBiYXNlamFybmFtZT0iVGhlRUpCSmFyIiZndDsKKyAgJmx0O2pvbmFzIGRlc3RkaXI9IiR7ZGVwbG95bWVudGphcnMuZGlyfSIKKyAgICAgICAgICAgIGpvbmFzcm9vdD0iJHtqb25hcy5yb290fSIKKyAgICAgICAgICAgIHN1ZmZpeD0iLmphciIKKyAgICAgICAgICAgIGNsYXNzcGF0aD0iJHtkZXNjcmlwdG9yYnVpbGQuY2xhc3NwYXRofSIvJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi9lamItamFyLnhtbCIvJmd0OworICAmbHQ7ZXhjbHVkZSBuYW1lPSIqKi9qb25hcy1lamItamFyLnhtbCIvJmd0OworJmx0Oy9lamJqYXImZ3Q7PC9wcmU+CiAKKzxoMyBpZD0iZWpiamFyX29yaW9uIj5PcmlvbiBlbGVtZW50PC9oMz4KIAotPGgzPjxhIG5hbWU9ImVqYmphcl9vcmlvbiI+T3Jpb24gZWxlbWVudDwvYT48L2gzPgotCi08cD5UaGUgb3Jpb24gZWxlbWVudCBzZWFyY2hlcyBmb3IgdGhlIE9yaW9uIEFwcGxpY2F0aW9uIFNlcnZlciBzcGVjaWZpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3JzIGFuZCBhZGRzIHRoZW0KLXRvIHRoZSBmaW5hbCBlamIgamFyIGZpbGUuIE9yaW9uIGhhcyBvbmUgZGVwbG95bWVudCBkZXNjcmlwdG9yOgotPHVsPjxsaT5vcmlvbi1lamItamFyLnhtbDwvbGk+Cis8cD5UaGUgPGNvZGU+b3Jpb248L2NvZGU+IGVsZW1lbnQgc2VhcmNoZXMgZm9yIHRoZSBPcmlvbiBBcHBsaWNhdGlvbiBTZXJ2ZXIgc3BlY2lmaWMgZGVwbG95bWVudAorZGVzY3JpcHRvcnMgYW5kIGFkZHMgdGhlbSB0byB0aGUgZmluYWwgRUpCIGphciBmaWxlLiBPcmlvbiBoYXMgb25lIGRlcGxveW1lbnQgZGVzY3JpcHRvcjo8L3A+Cis8dWw+CisgIDxsaT48c2FtcD5vcmlvbi1lamItamFyLnhtbDwvc2FtcD48L2xpPgogPC91bD4KLTxicj4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkCi0gICAgICAgICAgICAgICAgICAgICBqYXIgZmlsZXMgYXJlIGRlcG9zaXRlZC4gSmFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQgaW4KLSAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZQotICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcmRpciBuYW1lc3BhY2UuIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5kZXN0ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIGdlbmVyYXRlZCBqYXIgZmlsZXMgYXJlIGRlcG9zaXRlZC4gSmFyIGZpbGVzIGFyZSBkZXBvc2l0ZWQKKyAgICAgIGluIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgbG9jYXRpb24gd2l0aGluIHRoZSA8dmFyPmRlc2NyaXB0b3JkaXI8L3Zhcj4KKyAgICAgIG5hbWVzcGFjZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGU8L2gzPgogCiA8cHJlPgotICAgICAgJmx0O2VqYmphciBzcmNkaXI9IiR7YnVpbGQuY2xhc3Nlc30iCi0gICAgICAgICAgICAgIGRlc2NyaXB0b3JkaXI9IiR7ZGVzY3JpcHRvci5kaXJ9IgotICAgICAgICAgICAgICBiYXNlamFybmFtZT0iVGhlRUpCSmFyIgotICAgICAgICAgICAgICBmbGF0ZGVzdGRpcj0idHJ1ZSIKLSAgICAgICAgICAgICAgZGVwZW5kZW5jeT0ic3VwZXIiCi0gICAgICAgICAgICAgIGdlbmVyaWNqYXJzdWZmaXg9Ii5qYXIiJmd0OwotICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLWVqYi1qYXIueG1sIi8mZ3Q7Ci0gICAgICAgICZsdDtvcmlvbiBkZXN0ZGlyPSIke2RlcGxveW1lbnRqYXJzLmRpcn0iXCZndDsKLSAgICAgICZsdDsvZWpiamFyJmd0OwotPC9wcmU+CismbHQ7ZWpiamFyIHNyY2Rpcj0iJHtidWlsZC5jbGFzc2VzfSIKKyAgICAgICAgZGVzY3JpcHRvcmRpcj0iJHtkZXNjcmlwdG9yLmRpcn0iCisgICAgICAgIGJhc2VqYXJuYW1lPSJUaGVFSkJKYXIiCisgICAgICAgIGZsYXRkZXN0ZGlyPSJ0cnVlIgorICAgICAgICBkZXBlbmRlbmN5PSJzdXBlciIKKyAgICAgICAgZ2VuZXJpY2phcnN1ZmZpeD0iLmphciImZ3Q7CisgICZsdDtpbmNsdWRlIG5hbWU9IioqLyotZWpiLWphci54bWwiLyZndDsKKyAgJmx0O29yaW9uIGRlc3RkaXI9IiR7ZGVwbG95bWVudGphcnMuZGlyfSJcJmd0OworJmx0Oy9lamJqYXImZ3Q7PC9wcmU+CiAKIDwvYm9keT4KLQogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2V4ZWMuaHRtbCBiL21hbnVhbC9UYXNrcy9leGVjLmh0bWwKaW5kZXggODhlMGZlZC4uMWQyZWJhMiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2V4ZWMuaHRtbAorKysgYi9tYW51YWwvVGFza3MvZXhlYy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTQgKzE1LDQ0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgIDx0aXRsZT5FeGVjIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImV4ZWMiPkV4ZWM8L2E+PC9oMj4KKzxoMiBpZD0iZXhlYyI+RXhlYzwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZC4gV2hlbiB0aGUgPGk+b3M8L2k+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoZW4KLXRoZSBjb21tYW5kIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBBcGFjaGUgQW50IGlzIHJ1biBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBvcGVyYXRpbmcKLXN5c3RlbXMuPC9wPgorPHA+RXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZC4gV2hlbiB0aGUgPHZhcj5vczwvdmFyPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBjb21tYW5kIGlzCitvbmx5IGV4ZWN1dGVkIHdoZW4gQXBhY2hlIEFudCBpcyBydW4gb24gb25lIG9mIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nIHN5c3RlbXMuPC9wPgogCi08cD5Ob3RlIHRoYXQgeW91IGNhbm5vdCBpbnRlcmFjdCB3aXRoIHRoZSBmb3JrZWQgcHJvZ3JhbSwgdGhlIG9ubHkgd2F5Ci10byBzZW5kIGlucHV0IHRvIGl0IGlzIHZpYSB0aGUgaW5wdXQgYW5kIGlucHV0c3RyaW5nIGF0dHJpYnV0ZXMuIEFsc28gbm90ZSB0aGF0Ci1zaW5jZSBBbnQgMS42LCBhbnkgYXR0ZW1wdCB0byByZWFkIGlucHV0IGluIHRoZSBmb3JrZWQgcHJvZ3JhbSB3aWxsIHJlY2VpdmUgYW4KLUVPRiAoLTEpLiBUaGlzIGlzIGEgY2hhbmdlIGZyb20gQW50IDEuNSwgd2hlcmUgc3VjaCBhbiBhdHRlbXB0IHdvdWxkIGJsb2NrLjwvcD4KKzxwPk5vdGUgdGhhdCB5b3UgY2Fubm90IGludGVyYWN0IHdpdGggdGhlIGZvcmtlZCBwcm9ncmFtLCB0aGUgb25seSB3YXkgdG8gc2VuZCBpbnB1dCB0byBpdCBpcyB2aWEKK3RoZSBpbnB1dCBhbmQgaW5wdXRzdHJpbmcgYXR0cmlidXRlcy4gQWxzbyBub3RlIHRoYXQgPGVtPnNpbmNlIEFudCAxLjY8L2VtPiwgYW55IGF0dGVtcHQgdG8gcmVhZAoraW5wdXQgaW4gdGhlIGZvcmtlZCBwcm9ncmFtIHdpbGwgcmVjZWl2ZSBhbiBFT0YgKDxxPi0xPC9xPikuIFRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBBbnQgMS41LCB3aGVyZQorc3VjaCBhbiBhdHRlbXB0IHdvdWxkIGJsb2NrLjwvcD4KIAotPHA+SWYgeW91IHdhbnQgdG8gZXhlY3V0ZSBhbiBleGVjdXRhYmxlIHVzaW5nIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUKLSAgcHJvamVjdCdzIGJhc2VkaXIsIHlvdSBtYXkgbmVlZCB0bwotICB1c2UgPGNvZGU+dm1sYXVuY2hlcj0iZmFsc2UiPC9jb2RlPiBvbiBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIC0gYnV0Ci0gIGV2ZW4gdGhpcyBtYXkgZmFpbCAoU29sYXJpcyA4LzkgaGFzIGJlZW4gcmVwb3J0ZWQgYXMgcHJvYmxlbWF0aWMpLgotICBUaGUgPGNvZGU+cmVzb2x2ZWV4ZWN1dGFibGU8L2NvZGU+IGF0dHJpYnV0ZSBzaG91bGQgYmUgbW9yZQotICByZWxpYWJsZSwgYXMgd291bGQgYmUgc29tZXRoaW5nIGxpa2UKKzxwPklmIHlvdSB3YW50IHRvIGV4ZWN1dGUgYW4gZXhlY3V0YWJsZSB1c2luZyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj4sCit5b3UgbWF5IG5lZWQgdG8gdXNlIDx2YXI+dm1sYXVuY2hlcjwvdmFyPj08cT5mYWxzZTwvcT4gb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcyZtZGFzaDtidXQgZXZlbiB0aGlzCittYXkgZmFpbCAoU29sYXJpcyA4LzkgaGFzIGJlZW4gcmVwb3J0ZWQgYXMgcHJvYmxlbWF0aWMpLiAgVGhlIDx2YXI+cmVzb2x2ZWV4ZWN1dGFibGU8L3Zhcj4gYXR0cmlidXRlCitzaG91bGQgYmUgbW9yZSByZWxpYWJsZSwgYXMgd291bGQgYmUgc29tZXRoaW5nIGxpa2U8L3A+CiA8cHJlPgotICAmbHQ7cHJvcGVydHkgbmFtZT0iZXhlY3V0YWJsZS1mdWxsLXBhdGgiCi0gICAgICAgICAgICBsb2NhdGlvbj0iLi4vcmVsYXRpdmUvcGF0aC90by9leGVjdXRhYmxlIi8mZ3Q7Ci0gICZsdDtleGVjIGV4ZWN1dGFibGU9IiR7ZXhlY3V0YWJsZS1mdWxsLXBhdGh9IiAuLi4KLTwvcHJlPgotPC9wPgorJmx0O3Byb3BlcnR5IG5hbWU9ImV4ZWN1dGFibGUtZnVsbC1wYXRoIgorICAgICAgICAgIGxvY2F0aW9uPSIuLi9yZWxhdGl2ZS9wYXRoL3RvL2V4ZWN1dGFibGUiLyZndDsKKyZsdDtleGVjIGV4ZWN1dGFibGU9IiR7ZXhlY3V0YWJsZS1mdWxsLXBhdGh9IiAuLi48L3ByZT4KIAogPGg0PldpbmRvd3MgVXNlcnM8L2g0PgogPHA+VGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayBkZWxlZ2F0ZXMgdG8gPGNvZGU+UnVudGltZS5leGVjPC9jb2RlPiB3aGljaCBpbiB0dXJuCi1hcHBhcmVudGx5IGNhbGxzIDxhIGhyZWY9Imh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZGxscHJvYy9iYXNlL2NyZWF0ZXByb2Nlc3MuYXNwIj4KLTxjb2RlPjo6Q3JlYXRlUHJvY2VzczwvY29kZT48L2E+LiBJdCBpcyB0aGUgbGF0dGVyIFdpbjMyIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcwotdGhlIGV4YWN0IHNlbWFudGljcyBvZiB0aGUgY2FsbC4gSW4gcGFydGljdWxhciwgaWYgeW91IGRvIG5vdCBwdXQgYSBmaWxlIGV4dGVuc2lvbgotb24gdGhlIGV4ZWN1dGFibGUsIG9ubHkgIi5FWEUiIGZpbGVzIGFyZSBsb29rZWQgZm9yLCBub3QgIi5DT00iLCAiLkNNRCIgb3Igb3RoZXIgZmlsZQotdHlwZXMgbGlzdGVkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBQQVRIRVhULiBUaGF0IGlzIG9ubHkgdXNlZCBieSB0aGUgc2hlbGwuCi08L3A+Ci0gIDxwPgotICAgIE5vdGUgdGhhdCA8ZW0+LmJhdDwvZW0+IGZpbGVzIGNhbm5vdCBpbiBnZW5lcmFsIGJ5IGV4ZWN1dGVkIGRpcmVjdGx5LgotICAgIE9uZSBub3JtYWxseSBuZWVkcyB0byBleGVjdXRlIHRoZSBjb21tYW5kIHNoZWxsIGV4ZWN1dGFibGUgPGNvZGU+Y21kPC9jb2RlPgotICAgIHVzaW5nIHRoZSA8Y29kZT4vYzwvY29kZT4gc3dpdGNoLgotICA8L3A+Ci0gIDxibG9ja3F1b3RlPgorYXBwYXJlbnRseQorY2FsbHMgPGEgaHJlZj0iaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM2ODI0MjUodj12cy44NSkuYXNweCIKK3RhcmdldD0iX3RvcCI+PGNvZGU+OjpDcmVhdGVQcm9jZXNzPC9jb2RlPjwvYT4uIEl0IGlzIHRoZSBsYXR0ZXIgV2luMzIgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZQorZXhhY3Qgc2VtYW50aWNzIG9mIHRoZSBjYWxsLiBJbiBwYXJ0aWN1bGFyLCBpZiB5b3UgZG8gbm90IHB1dCBhIGZpbGUgZXh0ZW5zaW9uIG9uIHRoZSBleGVjdXRhYmxlLAorb25seSA8c2FtcD4uRVhFPC9zYW1wPiBmaWxlcyBhcmUgbG9va2VkIGZvciwgbm90IDxzYW1wPi5DT008L3NhbXA+LCA8c2FtcD4uQ01EPC9zYW1wPiBvciBvdGhlciBmaWxlCit0eXBlcyBsaXN0ZWQgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIDxjb2RlPlBBVEhFWFQ8L2NvZGU+LiBUaGF0IGlzIG9ubHkgdXNlZCBieSB0aGUgc2hlbGwuPC9wPgorPHA+Tm90ZSB0aGF0IDxzYW1wPi5iYXQ8L3NhbXA+IGZpbGVzIGNhbm5vdCBpbiBnZW5lcmFsIGJ5IGV4ZWN1dGVkIGRpcmVjdGx5LiAgT25lIG5vcm1hbGx5IG5lZWRzIHRvCitleGVjdXRlIHRoZSBjb21tYW5kIHNoZWxsIGV4ZWN1dGFibGUgPGtiZD5jbWQ8L2tiZD4gdXNpbmcgdGhlIDxrYmQ+L2M8L2tiZD4gc3dpdGNoLjwvcD4KIDxwcmU+CiAmbHQ7dGFyZ2V0IG5hbWU9ImhlbHAiJmd0OwogICAmbHQ7ZXhlYyBleGVjdXRhYmxlPSJjbWQiJmd0OwpAQCAtNjksMzY3ICs2MCwzMTEgQEAKICAgICAmbHQ7YXJnIHZhbHVlPSJhbnQuYmF0Ii8mZ3Q7CiAgICAgJmx0O2FyZyB2YWx1ZT0iLXAiLyZndDsKICAgJmx0Oy9leGVjJmd0OwotJmx0Oy90YXJnZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3RhcmdldCZndDs8L3ByZT4KIAotPHA+QSBjb21tb24gcHJvYmxlbSBpcyBub3QgaGF2aW5nIHRoZSBleGVjdXRhYmxlIG9uIHRoZSBQQVRILiBJbiBjYXNlIHlvdSBnZXQgYW4gZXJyb3IKLW1lc3NhZ2UgPHR0PkNhbm5vdCBydW4gcHJvZ3JhbSAiLi4uIjpDcmVhdGVQcm9jZXNzIGVycm9yPTIuIFRoZSBzeXN0ZW0gY2Fubm90IGZpbmQKLXRoZSBwYXRoIHNwZWNpZmllZC48L3R0PiBoYXZlIGEgbG9vayBhdCB5b3VyIFBBVEggdmFyaWFibGUuIEp1c3QgdHlwZSB0aGUgY29tbWFuZCBkaXJlY3RseSBvbgotdGhlIGNvbW1hbmQgbGluZSBhbmQgaWYgV2luZG93cyBmaW5kcyBpdCwgQW50IHNob3VsZCBkbyBpdCB0b28uIChPdGhlcndpc2UgYXNrIG9uIHRoZSB1c2VyIG1haWxpbmdsaXN0IGZvciBoZWxwLikgSWYgV2luZG93cyBjYW4gbm90IGV4ZWN1dGUgdGhlIHByb2dyYW0gYWRkIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2dyYW0KLXRvIHRoZSBQQVRIICg8dHQ+c2V0IFBBVEg9JVBBVEglO2Rpck9mUHJvZ3JhbTwvdHQ+KSBvciBzcGVjaWZ5IHRoZSBhYnNvbHV0ZSBwYXRoIGluIHRoZQotPHR0PmV4ZWN1dGFibGU8L3R0PiBhdHRyaWJ1dGUgaW4geW91ciBidWlsZGZpbGUuCi08L3A+Ci0KKzxwPkEgY29tbW9uIHByb2JsZW0gaXMgbm90IGhhdmluZyB0aGUgZXhlY3V0YWJsZSBvbiB0aGUgPGNvZGU+UEFUSDwvY29kZT4uIEluIGNhc2UgeW91IGdldCBhbiBlcnJvcgorbWVzc2FnZSA8Y29kZSBjbGFzcz0ib3V0cHV0Ij5DYW5ub3QgcnVuIHByb2dyYW0gIi4uLiI6Q3JlYXRlUHJvY2VzcyBlcnJvcj0yLiBUaGUgc3lzdGVtIGNhbm5vdCBmaW5kCit0aGUgcGF0aCBzcGVjaWZpZWQuPC9jb2RlPiBoYXZlIGEgbG9vayBhdCB5b3VyIDxjb2RlPlBBVEg8L2NvZGU+IHZhcmlhYmxlLiBKdXN0IHR5cGUgdGhlIGNvbW1hbmQKK2RpcmVjdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUgYW5kIGlmIFdpbmRvd3MgZmluZHMgaXQsIEFudCBzaG91bGQgZG8gaXQgdG9vLiAoT3RoZXJ3aXNlIGFzayBvbiB0aGUKK3VzZXIgbWFpbGluZ2xpc3QgZm9yIGhlbHAuKSBJZiBXaW5kb3dzIGNhbiBub3QgZXhlY3V0ZSB0aGUgcHJvZ3JhbSwgYWRkIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2dyYW0KK3RvIHRoZSA8Y29kZT5QQVRIPC9jb2RlPiAoPGNvZGU+c2V0IFBBVEg9JVBBVEglO2Rpck9mUHJvZ3JhbTwvY29kZT4pIG9yIHNwZWNpZnkgdGhlIGFic29sdXRlIHBhdGggaW4KK3RoZSA8dmFyPmV4ZWN1dGFibGU8L3Zhcj4gYXR0cmlidXRlIGluIHlvdXIgYnVpbGRmaWxlLjwvcD4KIAogPGg0PkN5Z3dpbiBVc2VyczwvaDQ+Ci08cD5UaGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIHdpbGwgbm90IHVuZGVyc3RhbmQgcGF0aHMgc3VjaCBhcyAvYmluL3NoCi1mb3IgdGhlIGV4ZWN1dGFibGUgcGFyYW1ldGVyLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBKYXZhIFZNIGluIHdoaWNoIEFudCBpcwotcnVubmluZyBpcyBhIHN0YW5kYXJkIFdpbmRvd3MgZXhlY3V0YWJsZSBhbmQgaXMgbm90IGF3YXJlIG9mIHRoZSBDeWd3aW4KLWVudmlyb25tZW50IChpLmUuLCBkb2Vzbid0IGxvYWQgPGNvZGU+Y3lnd2luMS5kbGw8L2NvZGU+KS4gIFRoZSBvbmx5Ci13b3JrLWFyb3VuZCBmb3IgdGhpcyBpcyB0byBjb21waWxlIGEgSlZNIHVuZGVyIEN5Z3dpbiAoYXQgeW91ciBvd24gcmlzaykuCi1TZWUgZm9yIGluc3RhbmNlIAotPGEgaHJlZj0iaHR0cDovL2hnLm9wZW5qZGsuamF2YS5uZXQvamRrNy9idWlsZC9yYXctZmlsZS90aXAvUkVBRE1FLWJ1aWxkcy5odG1sI2N5Z3dpbiI+Ci1PcGVuSkRLIGJ1aWxkIGluc3RydWN0aW9ucyBmb3IgY3lnd2luPC9hPi4KLTwvcD4KKzxwPlRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2sgd2lsbCBub3QgdW5kZXJzdGFuZCBwYXRocyBzdWNoIGFzIDxxPi9iaW4vc2g8L3E+IGZvcgordGhlIDx2YXI+ZXhlY3V0YWJsZTwvdmFyPiBwYXJhbWV0ZXIuICBUaGlzIGlzIGJlY2F1c2UgSlZNIGluIHdoaWNoIEFudCBpcyBydW5uaW5nIGlzIGEgc3RhbmRhcmQKK1dpbmRvd3MgZXhlY3V0YWJsZSBhbmQgaXMgbm90IGF3YXJlIG9mIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQgKGkuZS4sIGRvZXNuJ3QKK2xvYWQgPHNhbXA+Y3lnd2luMS5kbGw8L3NhbXA+KS4gIFRoZSBvbmx5IHdvcmstYXJvdW5kIGZvciB0aGlzIGlzIHRvIGNvbXBpbGUgYSBKVk0gdW5kZXIgQ3lnd2luIChhdAoreW91ciBvd24gcmlzaykuICBTZWUgZm9yCitpbnN0YW5jZSA8YSBocmVmPSJodHRwczovL2Nkbi5yYXdnaXQuY29tL0Fkb3B0T3BlbkpESy9vcGVuamRrLWpkazkvZGV2L2NvbW1vbi9kb2MvYnVpbGRpbmcuaHRtbCNjeWd3aW4iCit0YXJnZXQ9Il90b3AiPk9wZW5KREsgYnVpbGQgaW5zdHJ1Y3Rpb25zIGZvciBjeWd3aW48L2E+LjwvcD4KIAogPGg0Pk9wZW5WTVMgVXNlcnM8L2g0PgotPHA+VGhlIGNvbW1hbmQgc3BlY2lmaWVkIHVzaW5nIDxjb2RlPmV4ZWN1dGFibGU8L2NvZGU+IGFuZAotPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGVsZW1lbnRzIGlzIGV4ZWN1dGVkIGV4YWN0bHkgYXMgc3BlY2lmaWVkCi1pbnNpZGUgYSB0ZW1wb3JhcnkgRENMIHNjcmlwdC4gIFRoaXMgaGFzIHNvbWUgaW1wbGljYXRpb25zOgorPHA+VGhlIGNvbW1hbmQgc3BlY2lmaWVkIHVzaW5nIDx2YXI+ZXhlY3V0YWJsZTwvdmFyPiBhbmQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGVsZW1lbnRzIGlzCitleGVjdXRlZCBleGFjdGx5IGFzIHNwZWNpZmllZCBpbnNpZGUgYSB0ZW1wb3JhcnkgRENMIHNjcmlwdC4gIFRoaXMgaGFzIHNvbWUgaW1wbGljYXRpb25zOjwvcD4KIDx1bD4KICAgPGxpPnRoZSBEQ0wgc2NyaXB0IHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUKICAgdGhlIDxhIGhyZWY9Ii4uL3J1bm5pbmcuaHRtbCN0bXBkaXIiPnRlbXBvcmFyeSBkaXJlY3Rvcnk8L2E+LjwvbGk+Ci08bGk+cGF0aHMgaGF2ZSB0byBiZSB3cml0dGVuIGluIFZNUyBzdHlsZTwvbGk+Ci08bGk+aWYgeW91ciA8Y29kZT5leGVjdXRhYmxlPC9jb2RlPiBwb2ludHMgdG8gYSBEQ0wgc2NyaXB0IHJlbWVtYmVyIHRvCi1wcmVmaXggaXQgd2l0aCBhbiA8Y29kZT5APC9jb2RlPi1zaWduCi0oZS5nLiA8Y29kZT5leGVjdXRhYmxlPSJAW0ZPT11CQVIuQ09NIjwvY29kZT4pLCBqdXN0IGFzIHlvdSB3b3VsZCBpbiBhCi1EQ0wgc2NyaXB0PC9saT4KKyAgPGxpPnBhdGhzIGhhdmUgdG8gYmUgd3JpdHRlbiBpbiBWTVMgc3R5bGU8L2xpPgorICA8bGk+aWYgeW91ciA8dmFyPmV4ZWN1dGFibGU8L3Zhcj4gcG9pbnRzIHRvIGEgRENMIHNjcmlwdCByZW1lbWJlciB0byBwcmVmaXggaXQgd2l0aAorICAgIGFuIDxxPkA8L3E+LXNpZ24gKGUuZy4gPHZhcj5leGVjdXRhYmxlPC92YXI+PTxxPkBbRk9PXUJBUi5DT008L3E+KSwganVzdCBhcyB5b3Ugd291bGQgaW4gYSBEQ0wKKyAgICBzY3JpcHQ8L2xpPgogPC91bD4KLUZvciA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRvIHdvcmsgaW4gYW4gZW52aXJvbm1lbnQgd2l0aCBhIEphdmEgVk0KLW9sZGVyIHRoYW4gdmVyc2lvbiAxLjQuMS0yIGl0IGlzIGFsc28gPGk+cmVxdWlyZWQ8L2k+IHRoYXQgdGhlIGxvZ2ljYWwKLTxjb2RlPkpBVkEkRk9SS19TVVBQT1JUX0NIRElSPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+VFJVRTwvY29kZT4gaW4KLXRoZSBqb2IgdGFibGUgKHNlZSB0aGUgPGk+SkRLIFJlbGVhc2UgTm90ZXM8L2k+KS48L3A+Cis8cD5Gb3IgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0byB3b3JrIGluIGFuIGVudmlyb25tZW50IHdpdGggYSBKVk0gb2xkZXIgdGhhbiB2ZXJzaW9uIDEuNC4xLTIgaXQKK2lzIGFsc28gPGVtPnJlcXVpcmVkPC9lbT4gdGhhdCB0aGUgbG9naWNhbCA8Y29kZT5KQVZBJEZPUktfU1VQUE9SVF9DSERJUjwvY29kZT4gaXMgc2V0Cit0byA8Y29kZT5UUlVFPC9jb2RlPiBpbiB0aGUgam9iIHRhYmxlIChzZWUgdGhlIDxlbT5KREsgUmVsZWFzZSBOb3RlczwvZW0+KS48L3A+CiAKLTxwPlBsZWFzZSBub3RlIHRoYXQgdGhlIEphdmEgVk0gcHJvdmlkZWQgYnkgSFAgZG9lc24ndCBmb2xsb3cgT3BlblZNUycKLWNvbnZlbnRpb25zIG9mIGV4aXQgY29kZXMuICBJZiB5b3UgcnVuIGEgSmF2YSBWTSB3aXRoIHRoaXMgdGFzaywgdGhlCi10YXNrIG1heSBmYWxzZWx5IGNsYWltIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgKG9yIHNpbGVudGx5IGlnbm9yZSBhbgotZXJyb3IpLiAgRG9uJ3QgdXNlIHRoaXMgdGFzayB0byBydW4gPGNvZGU+SkFWQS5FWEU8L2NvZGU+LCB1c2UgYQotPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiB0YXNrIHdpdGggdGhlIDxjb2RlPmZvcms8L2NvZGU+IGF0dHJpYnV0ZQotc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGluc3RlYWQgYXMgdGhpcyB0YXNrIHdpbGwgZm9sbG93IHRoZSBWTSdzCis8cD5QbGVhc2Ugbm90ZSB0aGF0IEpWTSBwcm92aWRlZCBieSBIUCBkb2Vzbid0IGZvbGxvdyBPcGVuVk1TJyBjb252ZW50aW9ucyBvZiBleGl0IGNvZGVzLiAgSWYgeW91CitydW4gYSBKVk0gd2l0aCB0aGlzIHRhc2ssIHRoZSB0YXNrIG1heSBmYWxzZWx5IGNsYWltIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgKG9yIHNpbGVudGx5IGlnbm9yZSBhbgorZXJyb3IpLiAgRG9uJ3QgdXNlIHRoaXMgdGFzayB0byBydW4gPGtiZD5KQVZBLkVYRTwva2JkPiwgdXNlIGEgPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiB0YXNrIHdpdGgKK3RoZSA8dmFyPmZvcms8L3Zhcj4gYXR0cmlidXRlIHNldCB0byA8cT50cnVlPC9xPiBpbnN0ZWFkIGFzIHRoaXMgdGFzayB3aWxsIGZvbGxvdyB0aGUgSlZNJ3MKIGludGVycHJldGF0aW9uIG9mIGV4aXQgY29kZXMuPC9wPgogCiA8aDQ+UmVkSGF0IFMvMzkwIFVzZXJzPC9oND4KKzxwPkl0IGhhcyBiZWVuIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm1haWwtYXJjaGl2ZS5jb20vbGludXgtMzkwQHZtLm1hcmlzdC5lZHUvbXNnMjIyMjMuaHRtbCIKK3RhcmdldD0iX3RvcCI+cmVwb3J0ZWQgb24gbGludXgtMzkwPC9hPiB0aGF0IHNoZWxsIHNjcmlwdHMgaW52b2tlZCB2aWEgdGhlIEFudCBFeGVjIHRhc2sgbXVzdCBoYXZlCit0aGVpciBpbnRlcnByZXRlciBzcGVjaWZpZWQsIGkuZS4sIHRoZSBzY3JpcHRzIG11c3Qgc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZTo8L3A+CiAKLTxwPkl0IGhhcyBiZWVuIDxhCi1ocmVmPSJodHRwOi8vbGlzdHNlcnYudWFyay5lZHUvc2NyaXB0cy93YS5leGU/QTE9aW5kMDQwNCZMPXZtZXNhLWwjMzMiPnJlcG9ydGVkCi1vbiB0aGUgVk1FU0EtTElTVFNFUlY8L2E+IHRoYXQgc2hlbGwgc2NyaXB0cyBpbnZva2VkIHZpYSB0aGUgQW50IEV4ZWMKLXRhc2sgbXVzdCBoYXZlIHRoZWlyIGludGVycHJldGVyIHNwZWNpZmllZCwgaS5lLiwgdGhlIHNjcmlwdHMgbXVzdAotc3RhcnQgd2l0aCBzb21ldGhpbmcgbGlrZToKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgotIyEvYmluL2Jhc2gKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi1vciB0aGUgdGFzayB3aWxsIGZhaWwgYXMgZm9sbG93czoKLQotPGJsb2NrcXVvdGU+Ci08cHJlPgorPHByZT4jIS9iaW4vYmFzaDwvcHJlPgorPHA+b3IgdGhlIHRhc2sgd2lsbCBmYWlsIGFzIGZvbGxvd3M6PC9wPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KIFtleGVjXSBXYXJuaW5nOiBVTklYUHJvY2Vzcy5mb3JrQW5kRXhlYyBuYXRpdmUgZXJyb3I6IEV4ZWMgZm9ybWF0IGVycm9yCi1bZXhlY10gUmVzdWx0OiAyNTUKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPC9wPgorW2V4ZWNdIFJlc3VsdDogMjU1PC9wcmU+CiAKLTxoND48YSBuYW1lPSJiYWNrZ3JvdW5kIj5SdW5uaW5nIEFudCBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyBvbgotICAgIFVuaXgoLWxpa2UpIHN5c3RlbXM8L2E+PC9oND4KKzxoNCBpZD0iYmFja2dyb3VuZCI+UnVubmluZyBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgb24gVW5peCgtbGlrZSkgc3lzdGVtczwvaDQ+CiAKLTxwPklmIHlvdSBydW4gQW50IGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIChsaWtlIDxjb2RlPmFudCAmPC9jb2RlPikKLSAgYW5kIHVzZSB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIHdpdGggPGNvZGU+c3Bhd248L2NvZGU+Ci0gIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgaW5wdXQgdG8gdGhlCi0gIGZvcmtlZCBwcm9jZXNzIG9yIEFudCB3aWxsIGJlIHN1c3BlbmRlZCBiZWNhdXNlIGl0IHRyaWVzIHRvIHJlYWQKLSAgZnJvbSB0aGUgc3RhbmRhcmQgaW5wdXQuPC9wPgorPHA+SWYgeW91IHJ1biBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgKGxpa2UgPGtiZD5hbnQgJmFtcDs8L2tiZD4pIGFuZCB1c2UKK3RoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2sgd2l0aCA8dmFyPnNwYXduPC92YXI+IHNldCB0byA8cT5mYWxzZTwvcT4sIHlvdSBtdXN0IHByb3ZpZGUKK2V4cGxpY2l0IGlucHV0IHRvIHRoZSBmb3JrZWQgcHJvY2VzcyBvciBBbnQgd2lsbCBiZSBzdXNwZW5kZWQgYmVjYXVzZSBpdCB0cmllcyB0byByZWFkIGZyb20gdGhlCitzdGFuZGFyZCBpbnB1dC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY29tbWFuZCB0byBleGVjdXRlIHdpdGggYWxsIGNvbW1hbmQgbGluZQotICAgICAgYXJndW1lbnRzLiA8Yj5kZXByZWNhdGVkLCB1c2UgZXhlY3V0YWJsZSBhbmQgbmVzdGVkCi0gICAgICA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZDwvYj4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICAgIDx0ZD5jb21tYW5kPC90ZD4KKyAgICA8dGQ+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRoIGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiA8ZW0+PHU+RGVwcmVjYXRlZDwvdT4sCisgICAgICB1c2UgPHZhcj5leGVjdXRhYmxlPC92YXI+IGFuZCBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGVsZW1lbnRzIGluc3RlYWQ8L2VtPi48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY29tbWFuZCB0byBleGVjdXRlIHdpdGhvdXQgYW55IGNvbW1hbmQgbGluZQotICAgICAgYXJndW1lbnRzLjwvdGQ+CisgICAgPHRkPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSB3aXRob3V0IGFueSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHNob3VsZCBiZSBleGVjdXRlZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uPGJyLz4KLSAgICAgIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gdGhlIGRlZmF1bHQgdXNlZCB3aGVuIGRpciBoYXMgbm90IGJlZW4KLSAgICAgIHNwZWNpZmllZCBkZXBlbmRzIG9uIHRoZSA8Y29kZT52bWxhdW5jaGVyPC9jb2RlPiBhdHRyaWJ1dGUuICBJZgotICAgICAgPGNvZGU+dm1sYXVuY2hlcjwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIHRhc2sgd2lsbCB1c2UKLSAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LCBvdGhlcndpc2UgaXQgdXNlcyB0aGUgcHJvamVjdCdzIGJhc2VkaXIuCi0gICAgPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgY29tbWFuZCBzaG91bGQgYmUgZXhlY3V0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGlmIDx2YXI+dm1sYXVuY2hlcjwvdmFyPiBpcyA8cT50cnVlPC9xPiwgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCisgICAgICBvdGhlcndpc2UgdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saXN0IG9mIE9wZXJhdGluZyBTeXN0ZW1zIG9uIHdoaWNoIHRoZSBjb21tYW5kIG1heSBiZQotICAgICAgZXhlY3V0ZWQuIElmIHRoZSBjdXJyZW50IE9TJ3MgbmFtZSBpcyBjb250YWluZWQgaW4gdGhpcyBsaXN0LCB0aGUgY29tbWFuZCB3aWxsCi0gICAgICBiZSBleGVjdXRlZC4gVGhlIE9TJ3MgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBKYXZhIFZpcnR1YWwgbWFjaGluZSBhbmQgaXMgc2V0Ci0gICAgICBpbiB0aGUgJnF1b3Q7b3MubmFtZSZxdW90OyBzeXN0ZW0gcHJvcGVydHkuCisgICAgPHRkPm9zPC90ZD4KKyAgICA8dGQ+bGlzdCBvZiBPcGVyYXRpbmcgU3lzdGVtcyBvbiB3aGljaCB0aGUgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQuIElmIHRoZSBjdXJyZW50IE9TJ3MgbmFtZSBpcworICAgICAgY29udGFpbmVkIGluIHRoaXMgbGlzdCwgdGhlIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZC4gVGhlIE9TJ3MgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IEpWTSBhbmQKKyAgICAgIGlzIHNldCBpbiB0aGUgPGNvZGU+b3MubmFtZTwvY29kZT4gc3lzdGVtIHByb3BlcnR5LgogICAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vc2ZhbWlseTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PUyBmYW1pbHkgYXMgdXNlZCBpbiB0aGUgJmx0O29zJmd0OyBjb25kaXRpb24uCi0gICAgPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm9zZmFtaWx5PC90ZD4KKyAgICA8dGQ+T1MgZmFtaWx5IGFzIHVzZWQgaW4gdGhlIDxjb2RlPiZsdDtvcyZndDs8L2NvZGU+IGNvbmRpdGlvbi4gIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNwYXduPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgb3Igbm90IHlvdSB3YW50IHRoZSBjb21tYW5kIHRvIGJlIHNwYXduZWQ8YnI+Ci0gICAgRGVmYXVsdCBpcyBmYWxzZS48YnI+Ci0gICAgSWYgeW91IHNwYXduIGEgY29tbWFuZCwgaXRzIG91dHB1dCB3aWxsIG5vdCBiZSBsb2dnZWQgYnkgYW50Ljxicj4KLSAgICBUaGUgaW5wdXQsIG91dHB1dCwgZXJyb3IsIGFuZCByZXN1bHQgcHJvcGVydHkgc2V0dGluZ3MgYXJlIG5vdCBhY3RpdmUgd2hlbiBzcGF3bmluZyBhIHByb2Nlc3MuPGJyPgotICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4KKyAgICA8dGQ+c3Bhd248L3RkPgorICAgIDx0ZD53aGV0aGVyIG9yIG5vdCB5b3Ugd2FudCB0aGUgY29tbWFuZCB0byBiZSBzcGF3bmVkPGJyLz5JZiB5b3Ugc3Bhd24gYSBjb21tYW5kLCBpdHMgb3V0cHV0CisgICAgd2lsbCBub3QgYmUgbG9nZ2VkIGJ5IEFudC48YnIvPlRoZSA8dmFyPmlucHV0PC92YXI+LCA8dmFyPm91dHB1dDwvdmFyPiwgPHZhcj5lcnJvcjwvdmFyPiwKKyAgICBhbmQgPHZhcj5yZXN1bHQ8L3Zhcj4gcHJvcGVydHkgc2V0dGluZ3MgYXJlIG5vdCBhY3RpdmUgd2hlbiBzcGF3bmluZyBhIHByb2Nlc3MuPGJyLz48ZW0+c2luY2UKKyAgICBBbnQgMS42PC9lbT4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG91dHB1dC4gSWYgdGhlIGVycm9yIHN0cmVhbQotICAgICAgaXMgbm90IGFsc28gcmVkaXJlY3RlZCB0byBhIGZpbGUgb3IgcHJvcGVydHksIGl0IHdpbGwgYXBwZWFyIGluIHRoaXMgb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm91dHB1dDwvdGQ+CisgICAgPHRkPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBvdXRwdXQuIElmIHRoZSBlcnJvciBzdHJlYW0gaXMgbm90IGFsc28gcmVkaXJlY3RlZCB0byBhCisgICAgICBmaWxlIG9yIHByb3BlcnR5LCBpdCB3aWxsIGFwcGVhciBpbiB0aGlzIG91dHB1dC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUKLSAgICBjb21tYW5kIHNob3VsZCBiZSByZWRpcmVjdGVkLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9yPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgdG8gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZSByZWRpcmVjdGVkLiAgPGVtPnNpbmNlIEFudAorICAgIDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2dFcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlIGVycm9yIG91dHB1dCBpbiBBbnQncwotICAgICAgICAgICAgICAgICAgICAgbG9nIGFuZCB5b3UgYXJlIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZS9wcm9wZXJ0eS4gSWYgeW91Ci0gICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCBlcnJvciB3aXRoIHRoZSAmcXVvdDtlcnJvciZxdW90OyBvciAmcXVvdDtlcnJvclByb3BlcnR5JnF1b3Q7Ci0gICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bG9nRXJyb3I8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlIGVycm9yIG91dHB1dCBpbiBBbnQncyBsb2cgYW5kIHlvdSBhcmUKKyAgICAgIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvciBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICAgICAgZmlsZS9wcm9wZXJ0eS4gSWYgeW91IHJlZGlyZWN0IGVycm9yIHdpdGggdGhlIDx2YXI+ZXJyb3I8L3Zhcj4gb3IgPHZhcj5lcnJvclByb3BlcnR5PC92YXI+CisgICAgICBhdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hcHBlbmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvdXRwdXQgYW5kIGVycm9yIGZpbGVzIHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdHRlbi4KLSAgICBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5hcHBlbmQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIG91dHB1dCBhbmQgZXJyb3IgZmlsZXMgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0dGVuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlCi0gICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIFVubGVzcyB0aGUgZXJyb3Igc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gYSBzZXBhcmF0ZQotICAgICAgZmlsZSBvciBzdHJlYW0sIHRoaXMgcHJvcGVydHkgd2lsbCBpbmNsdWRlIHRoZSBlcnJvciBvdXRwdXQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3V0cHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gVW5sZXNzIHRoZSBlcnJvcgorICAgICAgc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlIG9yIHN0cmVhbSwgdGhpcyBwcm9wZXJ0eSB3aWxsIGluY2x1ZGUgdGhlIGVycm9yCisgICAgICBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUKKyAgICAgIHN0b3JlZC4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlucHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZmlsZSBmcm9tIHdoaWNoIHRoZSBleGVjdXRlZCBjb21tYW5kJ3Mgc3RhbmRhcmQgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgIGlzIHRha2VuLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGlucHV0c3RyaW5nIGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbnB1dDwvdGQ+CisgICAgPHRkPkEgZmlsZSBmcm9tIHdoaWNoIHRoZSBleGVjdXRlZCBjb21tYW5kJ3Mgc3RhbmRhcmQgaW5wdXQgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5CisgICAgICBleGNsdXNpdmUgd2l0aCB0aGUgPHZhcj5pbnB1dHN0cmluZzwvdmFyPiBhdHRyaWJ1dGUuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dHN0cmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGlucHV0IGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbnB1dHN0cmluZzwvdGQ+CisgICAgPHRkPkEgc3RyaW5nIHdoaWNoIHNlcnZlcyBhcyB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgZXhlY3V0ZWQgY29tbWFuZC4gVGhpcyBhdHRyaWJ1dGUgaXMKKyAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZSA8dmFyPmlucHV0PC92YXI+IGF0dHJpYnV0ZS4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc3VsdHByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mIGludGVyZXN0IGlmIGZhaWxvbmVycm9yPWZhbHNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnJlc3VsdHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZgorICAgICAgaW50ZXJlc3QgaWYgPHZhcj5mYWlsb25lcnJvcjwvdmFyPj08cT5mYWxzZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZQotICAgICAgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dGltZW91dDwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4KKyAgICAgIG1pbGxpc2Vjb25kcykuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gICAgICByZXR1cm4gY29kZSBzaWduYWxpbmcgZmFpbHVyZS4gRGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSBzaWduYWxpbmcgZmFpbHVyZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbGlmZXhlY3V0aW9uZmFpbHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGQgaWYgd2UgY2FuJ3Qgc3RhcnQgdGhlIHByb2dyYW0uCi0gICAgICBEZWZhdWx0cyB0byB0cnVlLiA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPiAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmV3ZW52aXJvbm1lbnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQKLSAgICAgIHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICAgIDx0ZD5mYWlsaWZleGVjdXRpb25mYWlsczwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIGlmIHdlIGNhbid0IHN0YXJ0IHRoZSBwcm9ncmFtLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZtbGF1bmNoZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UnVuIGNvbW1hbmQgdXNpbmcgdGhlIEphdmEgVk0ncyBleGVjdXRpb24gZmFjaWxpdGllcwotICAgICAgICB3aGVyZSBhdmFpbGFibGUuIElmIHNldCB0byBmYWxzZSB0aGUgdW5kZXJseWluZyBPUydzIHNoZWxsLAotICAgICAgICBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgYW50UnVuIHNjcmlwdHMsIHdpbGwgYmUgdXNlZC4KLSAgICAgICAgVW5kZXIgc29tZSBvcGVyYXRpbmcgc3lzdGVtcywgdGhpcyBnaXZlcyBhY2Nlc3MgdG8gZmFjaWxpdGllcwotICAgICAgICBub3Qgbm9ybWFsbHkgYXZhaWxhYmxlIHRocm91Z2ggdGhlIFZNIGluY2x1ZGluZywgdW5kZXIgV2luZG93cywKLSAgICAgICAgYmVpbmcgYWJsZSB0byBleGVjdXRlIHNjcmlwdHMsIHJhdGhlciB0aGFuIHRoZWlyIGFzc29jaWF0ZWQKLSAgICAgICAgaW50ZXJwcmV0ZXIuICBJZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZQotICAgICAgICBleGVjdXRhYmxlIGFzIGEgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5IHRoZQotICAgICAgICBkaXIgYXR0cmlidXRlLCBpdCBtYXkgYmVjb21lIG5lY2Vzc2FyeSB0byBzZXQgdm1sYXVuY2hlciB0bwotICAgICAgICBmYWxzZSBhcyB3ZWxsLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPjwvdGQ+CisgICAgPHRkPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQ+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb2x2ZWV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZQotICAgICAgICAgICAgICAgICAgICAgaXMgcmVzb2x2ZWQgZmlyc3RseSBhZ2FpbnN0IHRoZSBwcm9qZWN0IGJhc2VkaXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LCBhZ2FpbnN0IHRoZSBleGVjdXRpb24KLSAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBpZiBzcGVjaWZpZWQuIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IG9ubHkKLSAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYWxsb3cgZXhlY3V0aW9uIG9mIGNvbW1hbmRzIGluIHRoZSB1c2VyJ3MgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgIHNldCB0aGlzIHRvIGZhbHNlLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICAgIDx0ZD52bWxhdW5jaGVyPC90ZD4KKyAgICA8dGQ+UnVuIGNvbW1hbmQgdXNpbmcgdGhlIEpWTSdzIGV4ZWN1dGlvbiBmYWNpbGl0aWVzIHdoZXJlIGF2YWlsYWJsZS4gSWYgc2V0IHRvIDxxPmZhbHNlPC9xPiB0aGUKKyAgICAgIHVuZGVybHlpbmcgT1MncyBzaGVsbCwgZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlIDxrYmQ+YW50UnVuPC9rYmQ+IHNjcmlwdHMsIHdpbGwgYmUKKyAgICAgIHVzZWQuICBVbmRlciBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIGdpdmVzIGFjY2VzcyB0byBmYWNpbGl0aWVzIG5vdCBub3JtYWxseSBhdmFpbGFibGUKKyAgICAgIHRocm91Z2ggSlZNIGluY2x1ZGluZywgdW5kZXIgV2luZG93cywgYmVpbmcgYWJsZSB0byBleGVjdXRlIHNjcmlwdHMsIHJhdGhlciB0aGFuIHRoZWlyCisgICAgICBhc3NvY2lhdGVkIGludGVycHJldGVyLiAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBhcyBhIHJlbGF0aXZlIHBhdGgKKyAgICAgIHRvIHRoZSBkaXJlY3RvcnkgZ2l2ZW4gYnkgdGhlIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSwgaXQgbWF5IGJlY29tZSBuZWNlc3NhcnkgdG8KKyAgICAgIHNldCA8dmFyPnZtbGF1bmNoZXI8L3Zhcj4gdG8gPHE+ZmFsc2U8L3E+IGFzIHdlbGwuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZWFyY2hwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlbgotICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgIGJlIHNlYXJjaGVkIHdoZW4gcmVzb2x2aW5nIHRoZSBsb2NhdGlvbgotICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGV4ZWN1dGFibGUuIDxlbT5zaW5jZSBBbnQgMS42LjM8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgorICAgIDx0ZD5yZXNvbHZlZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPldoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgPHE+dHJ1ZTwvcT4sIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGlzIHJlc29sdmVkIGZpcnN0bHkgYWdhaW5zdAorICAgICAgdGhlIHByb2plY3QgPHZhcj5iYXNlZGlyPC92YXI+IGFuZCBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LCBhZ2FpbnN0IHRoZSBleGVjdXRpb24gZGlyZWN0b3J5IGlmCisgICAgICBzcGVjaWZpZWQuIE9uIFVuaXggc3lzdGVtcywgaWYgeW91IG9ubHkgd2FudCB0byBhbGxvdyBleGVjdXRpb24gb2YgY29tbWFuZHMgaW4gdGhlIHVzZXIncworICAgICAgcGF0aCwgc2V0IHRoaXMgdG8gPHE+ZmFsc2U8L3E+LiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2VhcmNocGF0aDwvdGQ+CisgICAgPHRkPldoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgPHE+dHJ1ZTwvcT4sIHRoZW4gc3lzdGVtIHBhdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpbGwgYmUgc2VhcmNoZWQKKyAgICAgIHdoZW4gcmVzb2x2aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhlY3V0YWJsZS4gPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CiA8cHJlPgogJmx0O2V4ZWMgZGlyPSZxdW90OyR7c3JjfSZxdW90OyBleGVjdXRhYmxlPSZxdW90O2NtZC5leGUmcXVvdDsgb3M9JnF1b3Q7V2luZG93cyAyMDAwJnF1b3Q7IG91dHB1dD0mcXVvdDtkaXIudHh0JnF1b3Q7Jmd0OwogICAmbHQ7YXJnIGxpbmU9JnF1b3Q7L2MgZGlyJnF1b3Q7LyZndDsKICZsdDsvZXhlYyZndDs8L3ByZT4KLTwvYmxvY2txdW90ZT4KKwogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+YXJnPC9oND4KLTxwPkNvbW1hbmQgbGluZSBhcmd1bWVudHMgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKLTxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gU2VlIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lIGFyZ3VtZW50czwvYT4uPC9wPgotPGg0PjxhIG5hbWU9ImVudiI+ZW52PC9hPjwvaDQ+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZQotc3lzdGVtIGNvbW1hbmQgdmlhIG5lc3RlZCA8Y29kZT4mbHQ7ZW52Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPkNvbW1hbmQgbGluZSBhcmd1bWVudHMgc2hvdWxkIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+CitlbGVtZW50cy4gU2VlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kIGxpbmUgYXJndW1lbnRzPC9hPi48L3A+Cis8aDQgaWQ9ImVudiI+ZW52PC9oND4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIHN5c3RlbSBjb21tYW5kIHZpYQorbmVzdGVkIDxjb2RlPiZsdDtlbnYmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgotICAgICAgPGJyLz4KLSAgICAgIDxlbT5Ob3RlOiAoU2luY2UgQW50IDEuNyk8L2VtPgotICAgICAgRm9yIHdpbmRvd3MsIHRoZSBuYW1lIGlzIGNhc2UtaW5zZW5zaXRpdmUuCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPmtleTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS48YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogPGVtPnNpbmNlIEFudCAxLjc8L2VtPiwgZm9yCisgICAgICBXaW5kb3dzLCB0aGUgbmFtZSBpcyBjYXNlLWluc2Vuc2l0aXZlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsaXRlcmFsIHZhbHVlIGZvciB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMyI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgbGl0ZXJhbCB2YWx1ZSBmb3IgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPkV4YWN0bHkgb25lIG9mIHRoZXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgZm9yIGEgUEFUSCBsaWtlIGVudmlyb25tZW50Ci0gICAgICB2YXJpYWJsZS4gWW91IGNhbiB1c2UgOyBvciA6IGFzIHBhdGggc2VwYXJhdG9ycyBhbmQgQW50IHdpbGwKLSAgICAgIGNvbnZlcnQgaXQgdG8gdGhlIHBsYXRmb3JtJ3MgbG9jYWwgY29udmVudGlvbnMuPC90ZD4KKyAgICA8dGQ+cGF0aDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgdmFsdWUgZm9yIGEgPGNvZGU+UEFUSDwvY29kZT4tbGlrZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gWW91IGNhbgorICAgICAgdXNlIDxxPjs8L3E+IG9yIDxxPjo8L3E+IGFzIHBhdGggc2VwYXJhdG9ycyBhbmQgQW50IHdpbGwgY29udmVydCBpdCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbAorICAgICAgY29udmVudGlvbnMuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gV2lsbCBiZQotICAgICAgcmVwbGFjZWQgYnkgdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIGJ5IEFudC48L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSB2YWx1ZSBmb3IgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLiBXaWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBhYnNvbHV0ZQorICAgICAgZmlsZW5hbWUgb2YgdGhlIGZpbGUgYnkgQW50LjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGEgbmFtZT0icmVkaXJlY3RvciI+PGg0PnJlZGlyZWN0b3I8L2g0PjwvYT4KLTxpPjxiPlNpbmNlIEFudCAxLjYuMjwvYj48L2k+Ci08cD5BIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yPC9hPgotY2FuIGJlIHNwZWNpZmllZC4gIEluIGdlbmVyYWwsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWRpcmVjdG9yIGJlaGF2ZQotYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyBhdmFpbGFibGUgYXQgdGhlIHRhc2sgbGV2ZWwuICBUaGUgbW9zdAotbm90YWJsZSBwZWN1bGlhcml0eSBzdGVtcyBmcm9tIHRoZSByZXRlbnRpb24gb2YgdGhlICZsdDtleGVjJmd0OwotYXR0cmlidXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBBbnkgZmlsZSBtYXBwaW5nIGlzIGRvbmUKLXVzaW5nIGEgPENPREU+bnVsbDwvQ09ERT4gc291cmNlZmlsZTsgdGhlcmVmb3JlIG5vdCBhbGwKLTxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5NYXBwZXI8L2E+IHR5cGVzIHdpbGwgcmV0dXJuCi1yZXN1bHRzLiAgV2hlbiBubyByZXN1bHRzIGFyZSByZXR1cm5lZCwgcmVkaXJlY3Rpb24gc3BlY2lmaWNhdGlvbnMKLXdpbGwgZmFsbCBiYWNrIHRvIHRoZSB0YXNrIGxldmVsIGF0dHJpYnV0ZXMuICBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQKLWRlZmF1bHRzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGlucHV0LCBvdXRwdXQsIGFuZCBlcnJvciBvdXRwdXQgZmlsZXMuCi08L3A+Cis8aDQgaWQ9InJlZGlyZWN0b3IiPnJlZGlyZWN0b3I8L2g0PgorPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+Cis8cD5BIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZWRpcmVjdG9yLmh0bWwiPkkvTyBSZWRpcmVjdG9yPC9hPiBjYW4gYmUgc3BlY2lmaWVkLiAgSW4gZ2VuZXJhbCwgdGhlCithdHRyaWJ1dGVzIG9mIHRoZSByZWRpcmVjdG9yIGJlaGF2ZSBhcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIGF2YWlsYWJsZSBhdCB0aGUgdGFzayBsZXZlbC4KK1RoZSBtb3N0IG5vdGFibGUgcGVjdWxpYXJpdHkgc3RlbXMgZnJvbSB0aGUgcmV0ZW50aW9uIG9mIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IGF0dHJpYnV0ZXMKK2ZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEFueSBmaWxlIG1hcHBpbmcgaXMgZG9uZSB1c2luZyBhIDxjb2RlPm51bGw8L2NvZGU+IHNvdXJjZWZpbGU7Cit0aGVyZWZvcmUgbm90IGFsbDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5NYXBwZXI8L2E+IHR5cGVzIHdpbGwgcmV0dXJuIHJlc3VsdHMuICBXaGVuIG5vCityZXN1bHRzIGFyZSByZXR1cm5lZCwgcmVkaXJlY3Rpb24gc3BlY2lmaWNhdGlvbnMgd2lsbCBmYWxsIGJhY2sgdG8gdGhlIHRhc2sgbGV2ZWwgYXR0cmlidXRlcy4gIEluCitwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgZGVmYXVsdHMgY2FuIGJlIHNwZWNpZmllZCBmb3IgaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIG91dHB1dCBmaWxlcy48L3A+CiA8aDM+RXJyb3JzIGFuZCByZXR1cm4gY29kZXM8L2gzPgotQnkgZGVmYXVsdCB0aGUgcmV0dXJuIGNvZGUgb2YgYSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IGlzIGlnbm9yZWQ7IHdoZW4geW91IHNldAotPGNvZGU+ZmFpbG9uZXJyb3I9InRydWUiPC9jb2RlPiB0aGVuIGFueSByZXR1cm4gY29kZSBzaWduYWxpbmcgZmFpbHVyZQotKE9TIHNwZWNpZmljKSBjYXVzZXMgdGhlIGJ1aWxkIHRvIGZhaWwuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0Ci08Y29kZT5yZXN1bHRwcm9wZXJ0eTwvY29kZT4gdG8gdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBhbmQgaGF2ZSBpdCBhc3NpZ25lZCB0bwotdGhlIHJlc3VsdCBjb2RlIChiYXJyaW5nIGltbXV0YWJpbGl0eSwgb2YgY291cnNlKS4KLTxwPgotSWYgdGhlIGF0dGVtcHQgdG8gc3RhcnQgdGhlIHByb2dyYW0gZmFpbHMgd2l0aCBhbiBPUyBkZXBlbmRlbnQgZXJyb3IgY29kZSwKLXRoZW4gPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiBoYWx0cyB0aGUgYnVpbGQgdW5sZXNzIDxjb2RlPmZhaWxpZmV4ZWN1dGlvbmZhaWxzPC9jb2RlPgotaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gWW91IGNhbiB1c2UgdGhhdCB0byBydW4gYSBwcm9ncmFtIGlmIGl0IGV4aXN0cywgYnV0Ci1vdGhlcndpc2UgZG8gbm90aGluZy4KLTxwPgotV2hhdCBkbyB0aG9zZSBlcnJvciBjb2RlcyBtZWFuPyBXZWxsLCB0aGV5IGFyZSBPUyBkZXBlbmRlbnQuIE9uIFdpbmRvd3MKLWJveGVzIHlvdSBoYXZlIHRvIGxvb2sgYXQKLTxhIGhyZWY9Imh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvZGVidWcvYmFzZS9zeXN0ZW1fZXJyb3JfY29kZXNfXzAtNDk5Xy5hc3AiPgotdGhlIGRvY3VtZW50YXRpb248L2E+OyBlcnJvciBjb2RlIDIgbWVhbnMgJ25vIHN1Y2ggcHJvZ3JhbScsIHdoaWNoIHVzdWFsbHkgbWVhbnMKLWl0IGlzIG5vdCBvbiB0aGUgcGF0aC4gQW55IHRpbWUgeW91IHNlZSBzdWNoIGFuIGVycm9yIGZyb20gYW55IEFudCB0YXNrLCBpdCBpcwotdXN1YWxseSBub3QgYW4gQW50IGJ1ZywgYnV0IHNvbWUgY29uZmlndXJhdGlvbiBwcm9ibGVtIG9uIHlvdXIgbWFjaGluZS4KKzxwPkJ5IGRlZmF1bHQgdGhlIHJldHVybiBjb2RlIG9mIGEgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiBpcyBpZ25vcmVkOyB3aGVuIHlvdQorc2V0IDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4gdG8gPHE+dHJ1ZTwvcT4gdGhlbiBhbnkgcmV0dXJuIGNvZGUgc2lnbmFsaW5nIGZhaWx1cmUgKE9TIHNwZWNpZmljKQorY2F1c2VzIHRoZSBidWlsZCB0byBmYWlsLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHNldCA8dmFyPnJlc3VsdHByb3BlcnR5PC92YXI+IHRvIHRoZSBuYW1lIG9mIGEKK3Byb3BlcnR5IGFuZCBoYXZlIGl0IGFzc2lnbmVkIHRvIHRoZSByZXN1bHQgY29kZSAoYmFycmluZyBpbW11dGFiaWxpdHksIG9mIGNvdXJzZSkuPC9wPgorPHA+SWYgdGhlIGF0dGVtcHQgdG8gc3RhcnQgdGhlIHByb2dyYW0gZmFpbHMgd2l0aCBhbiBPUyBkZXBlbmRlbnQgZXJyb3IgY29kZSwKK3RoZW4gPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiBoYWx0cyB0aGUgYnVpbGQgdW5sZXNzIDx2YXI+ZmFpbGlmZXhlY3V0aW9uZmFpbHM8L3Zhcj4gaXMgc2V0Cit0byA8cT5mYWxzZTwvcT4uIFlvdSBjYW4gdXNlIHRoYXQgdG8gcnVuIGEgcHJvZ3JhbSBpZiBpdCBleGlzdHMsIGJ1dCBvdGhlcndpc2UgZG8gbm90aGluZy48L3A+Cis8cD5XaGF0IGRvIHRob3NlIGVycm9yIGNvZGVzIG1lYW4/IFdlbGwsIHRoZXkgYXJlIE9TIGRlcGVuZGVudC4gT24gV2luZG93cyBib3hlcyB5b3UgaGF2ZSB0byBsb29rCithdCA8YSBocmVmPSJodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY4MTM4Mih2PXZzLjg1KS5hc3B4IgordGFyZ2V0PSJfdG9wIj50aGUgZG9jdW1lbnRhdGlvbjwvYT47IDxjb2RlPmVycm9yPTI8L2NvZGU+IG1lYW5zICdubyBzdWNoIHByb2dyYW0nLCB3aGljaCB1c3VhbGx5CittZWFucyBpdCBpcyBub3Qgb24gdGhlIHBhdGguIEFueSB0aW1lIHlvdSBzZWUgc3VjaCBhbiBlcnJvciBmcm9tIGFueSBBbnQgdGFzaywgaXQgaXMgdXN1YWxseSBub3QgYW4KK0FudCBidWcsIGJ1dCBzb21lIGNvbmZpZ3VyYXRpb24gcHJvYmxlbSBvbiB5b3VyIG1hY2hpbmUuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KKworPHA+U3RhcnQgPGtiZD5lbWFjczwva2JkPiBvbiBkaXNwbGF5IDEgb2YgdGhlIFggV2luZG93IFN5c3RlbS48L3A+Cis8cHJlPgogJmx0O2V4ZWMgZXhlY3V0YWJsZT0mcXVvdDtlbWFjcyZxdW90OyZndDsKICAgJmx0O2VudiBrZXk9JnF1b3Q7RElTUExBWSZxdW90OyB2YWx1ZT0mcXVvdDs6MS4wJnF1b3Q7LyZndDsKICZsdDsvZXhlYyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnN0YXJ0cyA8Y29kZT5lbWFjczwvY29kZT4gb24gZGlzcGxheSAxIG9mIHRoZSBYIFdpbmRvdyBTeXN0ZW0uPC9wPgorPC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5BZGQgPHNhbXA+JHtiYXNlZGlyfS9iaW48L3NhbXA+IHRvIHRoZSA8Y29kZT5QQVRIPC9jb2RlPiBvZiB0aGUgc3lzdGVtIGNvbW1hbmQuPC9wPgorPHByZT4KICZsdDtwcm9wZXJ0eSBlbnZpcm9ubWVudD0mcXVvdDtlbnYmcXVvdDsvJmd0OwogJmx0O2V4ZWMgLi4uICZndDsKICAgJmx0O2VudiBrZXk9JnF1b3Q7UEFUSCZxdW90OyBwYXRoPSZxdW90OyR7ZW52LlBBVEh9OiR7YmFzZWRpcn0vYmluJnF1b3Q7LyZndDsKICZsdDsvZXhlYyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmFkZHMgPGNvZGU+JHtiYXNlZGlyfS9iaW48L2NvZGU+IHRvIHRoZSA8Y29kZT5QQVRIPC9jb2RlPiBvZiB0aGUKLXN5c3RlbSBjb21tYW5kLjwvcD4KKzwvcHJlPgogCi08YmxvY2txdW90ZT48cHJlPgorPHA+U3RhcnQgdGhlIDxzYW1wPiR7YnJvd3Nlcn08L3NhbXA+IHdpdGggdGhlIHNwZWNpZmllZCA8c2FtcD4ke2ZpbGV9PC9zYW1wPiBhbmQgZW5kIHRoZSBBbnQKK3Byb2Nlc3MuIFRoZSBicm93c2VyIHdpbGwgcmVtYWluLjwvcD4KKzxwcmU+CiAmbHQ7cHJvcGVydHkgbmFtZT0iYnJvd3NlciIgbG9jYXRpb249IkM6L1Byb2dyYW0gRmlsZXMvSW50ZXJuZXQgRXhwbG9yZXIvaWV4cGxvcmUuZXhlIi8mZ3Q7CiAmbHQ7cHJvcGVydHkgbmFtZT0iZmlsZSIgbG9jYXRpb249ImFudC9kb2NzL21hbnVhbC9pbmRleC5odG1sIi8mZ3Q7CiAKICZsdDtleGVjIGV4ZWN1dGFibGU9IiR7YnJvd3Nlcn0iIHNwYXduPSJ0cnVlIiZndDsKICAgICAmbHQ7YXJnIHZhbHVlPSIke2ZpbGV9Ii8mZ3Q7CiAmbHQ7L2V4ZWMmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5TdGFydHMgdGhlIDxpPiR7YnJvd3Nlcn08L2k+IHdpdGggdGhlIHNwZWNpZmllZCA8aT4ke2ZpbGV9PC9pPiBhbmQgZW5kIHRoZQotQW50IHByb2Nlc3MuIFRoZSBicm93c2VyIHdpbGwgcmVtYWluLjwvcD4KKzwvcHJlPgogCi08YmxvY2txdW90ZT48cHJlPgorPHA+U2VuZCB0aGUgc3RyaW5nIDxxPmJsYWggYmVmb3JlIGJsYWg8L3E+IHRvIHRoZSA8a2JkPmNhdDwva2JkPiBleGVjdXRhYmxlLCB1c2luZworYW4gPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+Jmx0O2lucHV0ZmlsdGVyY2hhaW4mZ3Q7PC9hPiB0byByZXBsYWNlIDxxPmJlZm9yZTwvcT4KK3dpdGggPHE+YWZ0ZXI8L3E+IG9uIHRoZSB3YXkgaW4uIE91dHB1dCBpcyBzZW50IHRvIHRoZSBmaWxlIDxzYW1wPnJlZGlyZWN0b3Iub3V0PC9zYW1wPiBhbmQgc3RvcmVkCitpbiBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuIFNpbWlsYXJseSwgZXJyb3Igb3V0cHV0IGlzIHNlbnQgdG8gYSBmaWxlIGFuZCBhIHByb3BlcnR5LCBib3RoCituYW1lZCA8c2FtcD5yZWRpcmVjdG9yLmVycjwvc2FtcD4uPC9wPgorPHByZT4KICZsdDtleGVjIGV4ZWN1dGFibGU9JnF1b3Q7Y2F0JnF1b3Q7Jmd0OwogICAgICZsdDtyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSZxdW90O3JlZGlyZWN0b3Iub3V0JnF1b3Q7CiAgICAgICAgICAgICAgICAgZXJyb3Jwcm9wZXJ0eT0mcXVvdDtyZWRpcmVjdG9yLmVyciZxdW90OwpAQCAtNDQxLDI3ICszNzYsMTMgQEAKICAgICAgICAgJmx0O2Vycm9ybWFwcGVyIHR5cGU9JnF1b3Q7bWVyZ2UmcXVvdDsgdG89JnF1b3Q7cmVkaXJlY3Rvci5lcnImcXVvdDsvJmd0OwogICAgICZsdDsvcmVkaXJlY3RvciZndDsKICZsdDsvZXhlYyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzwvcHJlPgogCi1TZW5kcyB0aGUgc3RyaW5nICZxdW90O2JsYWggYmVmb3JlIGJsYWgmcXVvdDsgdG8gdGhlICZxdW90O2NhdCZxdW90OyBleGVjdXRhYmxlLAotdXNpbmcgYW4gPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+Jmx0O2lucHV0ZmlsdGVyY2hhaW4mZ3Q7PC9hPgotdG8gcmVwbGFjZSAmcXVvdDtiZWZvcmUmcXVvdDsgd2l0aCAmcXVvdDthZnRlciZxdW90OyBvbiB0aGUgd2F5IGluLgotT3V0cHV0IGlzIHNlbnQgdG8gdGhlIGZpbGUgJnF1b3Q7cmVkaXJlY3Rvci5vdXQmcXVvdDsgYW5kIHN0b3JlZAotaW4gYSBwcm9wZXJ0eSBvZiB0aGUgc2FtZSBuYW1lLiAgU2ltaWxhcmx5LCBlcnJvciBvdXRwdXQgaXMgc2VudCB0bwotYSBmaWxlIGFuZCBhIHByb3BlcnR5LCBib3RoIG5hbWVkICZxdW90O3JlZGlyZWN0b3IuZXJyJnF1b3Q7LgotCi0KLTxwPjxiPk5vdGU6PC9iPiBkbyBub3QgdHJ5IHRvIHNwZWNpZnkgYXJndW1lbnRzIHVzaW5nCi1hIHNpbXBsZSBhcmctZWxlbWVudCBhbmQgc2VwYXJhdGUgdGhlbSBieSBzcGFjZXMuIFRoaXMgcmVzdWx0cyBpbgotb25seSBhIHNpbmdsZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBlbnRpcmUgc3RyaW5nLjwvcD4KLTxwPgotPGI+VGltZW91dHM6IDwvYj4gSWYgYSB0aW1lb3V0IGlzIHNwZWNpZmllZCwgd2hlbiBpdCBpcyByZWFjaGVkIHRoZQotc3ViIHByb2Nlc3MgaXMga2lsbGVkIGFuZCBhIG1lc3NhZ2UgcHJpbnRlZCB0byB0aGUgbG9nLiBUaGUgcmV0dXJuCi12YWx1ZSBvZiB0aGUgZXhlY3V0aW9uIHdpbGwgYmUgIi0xIiwgd2hpY2ggd2lsbCBoYWx0IHRoZSBidWlsZCBpZgotPHR0PmZhaWxvbmVycm9yPXRydWU8L3R0PiwgYnV0IGJlIGlnbm9yZWQgb3RoZXJ3aXNlLgotCi0KLQorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBkbyBub3QgdHJ5IHRvIHNwZWNpZnkgYXJndW1lbnRzIHVzaW5nIGEgc2ltcGxlIDxjb2RlPmFyZzwvY29kZT4tZWxlbWVudAorYW5kIHNlcGFyYXRlIHRoZW0gYnkgc3BhY2VzLiBUaGlzIHJlc3VsdHMgaW4gb25seSBhIHNpbmdsZSBhcmd1bWVudCBjb250YWluaW5nIHRoZSBlbnRpcmUKK3N0cmluZy48L3A+Cis8cD48c3Ryb25nPlRpbWVvdXRzPC9zdHJvbmc+OiBJZiBhIHRpbWVvdXQgaXMgc3BlY2lmaWVkLCB3aGVuIGl0IGlzIHJlYWNoZWQgdGhlIHN1YiBwcm9jZXNzIGlzCitraWxsZWQgYW5kIGEgbWVzc2FnZSBwcmludGVkIHRvIHRoZSBsb2cuIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGV4ZWN1dGlvbiB3aWxsIGJlIDxxPi0xPC9xPiwgd2hpY2gKK3dpbGwgaGFsdCB0aGUgYnVpbGQgaWYgPHZhcj5mYWlsb25lcnJvcjwvdmFyPj08cT50cnVlPC9xPiwgYnV0IGJlIGlnbm9yZWQgb3RoZXJ3aXNlLjwvcD4KIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2ZhaWwuaHRtbCBiL21hbnVhbC9UYXNrcy9mYWlsLmh0bWwKaW5kZXggZWFiZTMwYi4uZWRiZjc2YSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2ZhaWwuaHRtbAorKysgYi9tYW51YWwvVGFza3MvZmFpbC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTE2ICsxNSwxMDggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkZhaWwgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZmFpbCI+RmFpbDwvYT48L2gyPgorPGgyIGlkPSJmYWlsIj5GYWlsPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5FeGl0cyB0aGUgY3VycmVudCBidWlsZCAoanVzdCB0aHJvd2luZyBhIEJ1aWxkRXhjZXB0aW9uKSwgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPlRoZSBtZXNzYWdlIG9mIHRoZSBFeGNlcHRpb24gY2FuIGJlIHNldCB2aWEgdGhlIG1lc3NhZ2UgYXR0cmlidXRlCi1vciBjaGFyYWN0ZXIgZGF0YSBuZXN0ZWQgaW50byB0aGUgZWxlbWVudC48L3A+Cis8cD5FeGl0cyB0aGUgY3VycmVudCBidWlsZCAoanVzdCB0aHJvd2luZyBhIEJ1aWxkRXhjZXB0aW9uKSwgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi48L3A+Cis8cD5UaGUgbWVzc2FnZSBvZiB0aGUgRXhjZXB0aW9uIGNhbiBiZSBzZXQgdmlhIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvciBjaGFyYWN0ZXIgZGF0YSBuZXN0ZWQgaW50bwordGhlIGVsZW1lbnQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1lc3NhZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBtZXNzYWdlIGdpdmluZyBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHdoeSB0aGUgYnVpbGQgZXhpdGVkPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bWVzc2FnZTwvdGQ+CisgICAgPHRkPkEgbWVzc2FnZSBnaXZpbmcgZnVydGhlciBpbmZvcm1hdGlvbiBvbiB3aHkgdGhlIGJ1aWxkIGV4aXRlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSBmYWlsIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIG5hbWUgZXhpc3RzPC9hPgorICAgIDx0ZD5pZjwvdGQ+CisgICAgPHRkPk9ubHkgZmFpbCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGV4aXN0czwvYT4KICAgICAgIGluIHRoZSBjdXJyZW50IHByb2plY3Q8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IGZhaWwgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgYSBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gbmFtZSBkb2Vzbid0CisgICAgPHRkPnVubGVzczwvdGQ+CisgICAgPHRkPk9ubHkgZmFpbCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiBhIHByb3BlcnR5IG9mIHRoZSBnaXZlbiBuYW1lIGRvZXNuJ3QKICAgICAgIGV4aXN0PC9hPiBpbiB0aGUgY3VycmVudCBwcm9qZWN0PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdGF0dXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RXhpdCB1c2luZyB0aGUgc3BlY2lmaWVkIHN0YXR1cyBjb2RlOwotICAgICAgYXNzdW1pbmcgdGhlIGdlbmVyYXRlZCBFeGNlcHRpb24gaXMgbm90IGNhdWdodCwgdGhlCisgICAgPHRkPnN0YXR1czwvdGQ+CisgICAgPHRkPkV4aXQgdXNpbmcgdGhlIHNwZWNpZmllZCBzdGF0dXMgY29kZTsgYXNzdW1pbmcgdGhlIGdlbmVyYXRlZCBFeGNlcHRpb24gaXMgbm90IGNhdWdodCwgdGhlCiAgICAgICBKVk0gd2lsbCBleGl0IHdpdGggdGhpcyBzdGF0dXMuIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNi4yPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+QXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIDxpPmlmPC9pPi88aT51bmxlc3M8L2k+IGF0dHJpYnV0ZXMsCi0gIGNvbmRpdGlvbmFsIGZhaWx1cmUgY2FuIGJlIGFjaGlldmVkIHVzaW5nIGEgc2luZ2xlIG5lc3RlZAotICA8Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT4gZWxlbWVudCwgd2hpY2ggc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUKLSAgY29yZSBvciBjdXN0b20gY29uZGl0aW9uLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IGNvbmRpdGlvbnMsIHNlZQotICA8YSBocmVmPSJjb25kaXRpb25zLmh0bWwiPmhlcmU8L2E+Ljxicj48Yj5TaW5jZSBBbnQgMS42LjI8L2I+Cis8cD5BcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj5pZjwvdmFyPi88dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGVzLCBjb25kaXRpb25hbCBmYWlsdXJlIGNhbiBiZQorYWNoaWV2ZWQgdXNpbmcgYSBzaW5nbGUgbmVzdGVkIDxjb2RlPiZsdDtjb25kaXRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50LCB3aGljaCBzaG91bGQgY29udGFpbiBleGFjdGx5CitvbmUgY29yZSBvciBjdXN0b20gY29uZGl0aW9uLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0IGNvbmRpdGlvbnMsCitzZWUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5oZXJlPC9hPi48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPgogPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cHJlPiAgJmx0O2ZhaWwvJmd0OzwvcHJlPgotPHA+d2lsbCBleGl0IHRoZSBjdXJyZW50IGJ1aWxkIHdpdGggbm8gZnVydGhlciBpbmZvcm1hdGlvbiBnaXZlbi48L3A+Ci08cHJlPgorPHA+RXhpdCB0aGUgY3VycmVudCBidWlsZCB3aXRoIG5vIGZ1cnRoZXIgaW5mb3JtYXRpb24gZ2l2ZW4uPC9wPgorPHByZT4mbHQ7ZmFpbC8mZ3Q7PC9wcmU+CisKKzxwcmUgY2xhc3M9Im91dHB1dCI+CiBCVUlMRCBGQUlMRUQKIAotYnVpbGQueG1sOjQ6IE5vIG1lc3NhZ2UKLTwvcHJlPgorYnVpbGQueG1sOjQ6IE5vIG1lc3NhZ2U8L3ByZT4KIAotPHByZT4gICZsdDtmYWlsIG1lc3NhZ2U9JnF1b3Q7U29tZXRoaW5nIHdyb25nIGhlcmUuJnF1b3Q7LyZndDs8L3ByZT4KLTxwPndpbGwgZXhpdCB0aGUgY3VycmVudCBidWlsZCBhbmQgcHJpbnQgc29tZXRoaW5nCi0gIGxpa2UgdGhlIGZvbGxvd2luZyB0byB3aGVyZXZlciB5b3VyIG91dHB1dCBnb2VzOgotPC9wPgotPHByZT4KKzxwPkV4aXQgdGhlIGN1cnJlbnQgYnVpbGQgYW5kIHByaW50IGEgbWVzc2FnZSB0byB3aGVyZXZlciB5b3VyIG91dHB1dCBnb2VzOjwvcD4KKzxwcmU+Jmx0O2ZhaWwgbWVzc2FnZT0mcXVvdDtTb21ldGhpbmcgd3JvbmcgaGVyZS4mcXVvdDsvJmd0OzwvcHJlPgorCis8cHJlIGNsYXNzPSJvdXRwdXQiPgogQlVJTEQgRkFJTEVECiAKLWJ1aWxkLnhtbDo0OiBTb21ldGhpbmcgd3JvbmcgaGVyZS4KLTwvcHJlPgorYnVpbGQueG1sOjQ6IFNvbWV0aGluZyB3cm9uZyBoZXJlLjwvcHJlPgogCi08cHJlPiAgJmx0O2ZhaWwmZ3Q7U29tZXRoaW5nIHdyb25nIGhlcmUuJmx0Oy9mYWlsJmd0OzwvcHJlPgotPHA+d2lsbCBnaXZlIHRoZSBzYW1lIHJlc3VsdCBhcyBhYm92ZS48L3A+Cis8cD5BIGRpZmZlcmVudCB3YXkgdG8gYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQgYXMgYWJvdmUuPC9wPgorPHByZT4mbHQ7ZmFpbCZndDtTb21ldGhpbmcgd3JvbmcgaGVyZS4mbHQ7L2ZhaWwmZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7ZmFpbCB1bmxlc3M9JnF1b3Q7dGhpc2RvZXNub3RleGlzdCZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD53aWxsIGV4aXQgdGhlIGN1cnJlbnQgYnVpbGQgYW5kIHByaW50IHNvbWV0aGluZwotICBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gd2hlcmV2ZXIgeW91ciBvdXRwdXQgZ29lczoKLTwvcD4KLTxwcmU+Cis8cD5FeGl0IHRoZSBjdXJyZW50IGJ1aWxkIGFuZCBwcmludCBhbiBleHBsYW5hdGlvbiB0byB3aGVyZXZlciB5b3VyIG91dHB1dCBnb2VzOjwvcD4KKzxwcmU+Jmx0O2ZhaWwgdW5sZXNzPSZxdW90O3RoaXNkb2Vzbm90ZXhpc3QmcXVvdDsvJmd0OzwvcHJlPgorCis8cHJlIGNsYXNzPSJvdXRwdXQiPgogQlVJTEQgRkFJTEVECiAKLWJ1aWxkLnhtbDoyOiB1bmxlc3M9dGhpc2RvZXNub3RleGlzdAotPC9wcmU+CitidWlsZC54bWw6MjogdW5sZXNzPXRoaXNkb2Vzbm90ZXhpc3Q8L3ByZT4KIAotVXNpbmcgYSBjb25kaXRpb24gdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3Q6Ci0KKzxwPlVzZSBhIGNvbmRpdGlvbiB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdDo8L3A+CiA8cHJlPgotICAmbHQ7ZmFpbCZndDsKLSAgICAgJmx0O2NvbmRpdGlvbiZndDsKLSAgICAgICAmbHQ7bm90Jmd0OwotICAgICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSZxdW90O3RoaXNkb2Vzbm90ZXhpc3QmcXVvdDsvJmd0OwotICAgICAgICZsdDsvbm90Jmd0OwotICAgICAmbHQ7L2NvbmRpdGlvbiZndDsKLSAgICZsdDsvZmFpbCZndDsKLTwvcHJlPgorJmx0O2ZhaWwmZ3Q7CisgICAgJmx0O2NvbmRpdGlvbiZndDsKKyAgICAgICAgJmx0O25vdCZndDsKKyAgICAgICAgICAgICZsdDtpc3NldCBwcm9wZXJ0eT0mcXVvdDt0aGlzZG9lc25vdGV4aXN0JnF1b3Q7LyZndDsKKyAgICAgICAgJmx0Oy9ub3QmZ3Q7CisgICAgJmx0Oy9jb25kaXRpb24mZ3Q7CismbHQ7L2ZhaWwmZ3Q7PC9wcmU+CiAKLTxwPk91dHB1dDo8L3A+Ci08cHJlPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KIEJVSUxEIEZBSUxFRAogCi1idWlsZC54bWw6MjogY29uZGl0aW9uIHNhdGlzZmllZAotPC9wcmU+CitidWlsZC54bWw6MjogY29uZGl0aW9uIHNhdGlzZmllZDwvcHJlPgogCis8cD5DaGVjayB0aGF0IGJvdGggZmlsZXMgPHNhbXA+b25lLnR4dDwvc2FtcD4gYW5kIDxzYW1wPnR3by50eHQ8L3NhbXA+IGFyZSBwcmVzZW50IG90aGVyd2lzZSB0aGUKK2J1aWxkIHdpbGwgZmFpbC48L3A+CiA8cHJlPgogJmx0O2ZhaWwgbWVzc2FnZT0mcXVvdDtGaWxlcyBhcmUgbWlzc2luZy4mcXVvdDsmZ3Q7CiAgICAgJmx0O2NvbmRpdGlvbiZndDsKQEAgLTEzMywxMSArMTI2LDcgQEAKICAgICAgICAgICAgICZsdDsvcmVzb3VyY2Vjb3VudCZndDsKICAgICAgICAgJmx0Oy9ub3QmZ3Q7CiAgICAgJmx0Oy9jb25kaXRpb24mZ3Q7Ci0mbHQ7L2ZhaWwmZ3Q7Ci08L3ByZT4KLTxwPldpbGwgY2hlY2sgdGhhdCBib3RoIGZpbGVzIDxpPm9uZS50eHQ8L2k+IGFuZCA8aT50d28udHh0PC9pPiBhcmUgcHJlc2VudCBvdGhlcndpc2UgdGhlIGJ1aWxkCi13aWxsIGZhaWwuPC9wPgorJmx0Oy9mYWlsJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9maWx0ZXIuaHRtbCBiL21hbnVhbC9UYXNrcy9maWx0ZXIuaHRtbAppbmRleCAxNmJhODhjLi5hNmQ1YTQ5IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZmlsdGVyLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2ZpbHRlci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNjYgKzE1LDYxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5GaWx0ZXIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZmlsdGVyIj5GaWx0ZXI8L2E+PC9oMj4KKzxoMiBpZD0iZmlsdGVyIj5GaWx0ZXI8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlNldHMgYSB0b2tlbiBmaWx0ZXIgZm9yIHRoaXMgcHJvamVjdCBvciByZWFkIG11bHRpcGxlIHRva2VuIGZpbHRlciBmcm9tCi1hbiBpbnB1dCBmaWxlIGFuZCBzZXRzIHRoZXNlIGFzIGZpbHRlcnMuCi1Ub2tlbiBmaWx0ZXJzIGFyZSB1c2VkIGJ5IGFsbCB0YXNrcyB0aGF0IHBlcmZvcm0gZmlsZSBjb3B5aW5nIG9wZXJhdGlvbnMKLXRocm91Z2ggdGhlIFByb2plY3QgY29tbW9kaXR5IG1ldGhvZHMuIFNlZSB0aGUgd2FybmluZwotPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNmaWx0ZXJzIj48ZW0+aGVyZTwvZW0+PC9hPiBiZWZvcmUgdXNpbmcuPC9wPgotPHA+Tm90ZSAxOiB0aGUgdG9rZW4gc3RyaW5nIG11c3Qgbm90IGNvbnRhaW4gdGhlIHNlcGFyYXRvcnMgY2hhcnMgKEApLjxicj4KLU5vdGUgMjogRWl0aGVyIHRva2VuIGFuZCB2YWx1ZSBhdHRyaWJ1dGVzIG11c3QgYmUgcHJvdmlkZWQsIG9yIG9ubHkgdGhlCi1maWx0ZXJzZmlsZSBhdHRyaWJ1dGUuPC9wPgorPHA+U2V0cyBhIHRva2VuIGZpbHRlciBmb3IgdGhpcyBwcm9qZWN0IG9yIHJlYWRzIGEgcHJvcGVydGllcyBmaWxlIGFzIG11bHRpcGxlIHRva2VuIGZpbHRlcgorZGVmaW5pdGlvbnMgYW5kIHNldHMgdGhlbS4gIFRva2VuIGZpbHRlcnMgYXJlIHVzZWQgYnkgYWxsIHRhc2tzIHRoYXQgcGVyZm9ybSBmaWxlIGNvcHlpbmcgb3BlcmF0aW9ucwordGhyb3VnaCB0aGUgUHJvamVjdCBjb21tb2RpdHkgbWV0aG9kcy4gU2VlIHRoZQord2FybmluZyA8YSBocmVmPSIuLi91c2luZy5odG1sI2ZpbHRlcnMiPjxlbT5oZXJlPC9lbT48L2E+IGJlZm9yZSB1c2luZy48L3A+Cis8cD5UaGUgdGFzayB1c2VzIDxxPkA8L3E+IGFzIHRva2VuIHNlcGFyYXRvci4gVG9rZW4gc3RyaW5ncyBjYW5ub3QgY29udGFpbiBzZXBhcmF0b3IgY2hhcmFjdGVyczsKK2luY29ycmVjdCB0b2tlbnMgYXJlIGlnbm9yZWQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRva2VuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB0b2tlbiBzdHJpbmcgd2l0aG91dCBAPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcyo8L3RkPgorICAgIDx0ZD50b2tlbjwvdGQ+CisgICAgPHRkPnRoZSB0b2tlbiBzdHJpbmcgd2l0aG91dCB0aGUgc2VwYXJhdG9yIGNoYXJzICg8cT5APC9xPik8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIzIj5ZZXM7IGVpdGhlciBib3RoIDx2YXI+dG9rZW48L3Zhcj4gYW5kIDx2YXI+dmFsdWU8L3Zhcj4sIG9yCisgICAgICBvbmx5IDx2YXI+ZmlsdGVyc2ZpbGU8L3Zhcj48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHB1dCB0byByZXBsYWNlIHRoZSB0b2tlbiB3aGVuIHRoZSAKLSAgICAgIGZpbGUgaXMgY29waWVkPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcyo8L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij50aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIHB1dCB0byByZXBsYWNlIHRoZSB0b2tlbiB3aGVuIHRoZSBmaWxlIGlzIGNvcGllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcnNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIGZyb20gd2hpY2ggdGhlIGZpbHRlcnMgbXVzdCBiZSByZWFkLiBUaGlzIGZpbGUgbXVzdCBiZSBhIGZvcm1hdHRlZCBhcyBhIHByb3BlcnR5IGZpbGUuIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMqPC90ZD4KKyAgICA8dGQ+ZmlsdGVyc2ZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgZmlsdGVycyBtdXN0IGJlIHJlYWQuIFRoaXMgZmlsZSBtdXN0IGJlIGEgZm9ybWF0dGVkIGFzCisgICAgICBhIHByb3BlcnR5IGZpbGUuPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4qIHNlZSBub3RlcyAxIGFuZCAyIGFib3ZlIHBhcmFtZXRlcnMgdGFibGUuPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7ZmlsdGVyIHRva2VuPSZxdW90O3llYXImcXVvdDsgdmFsdWU9JnF1b3Q7MjAwMCZxdW90Oy8mZ3Q7Ci0gICZsdDtjb3B5IHRvZGlyPSZxdW90OyR7ZGVzdC5kaXJ9JnF1b3Q7IGZpbHRlcmluZz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyYy5kaXJ9JnF1b3Q7LyZndDsKLSAgJmx0Oy9jb3B5Jmd0OzwvcHJlPiAKLTxwPndpbGwgY29weSByZWN1cnNpdmVseSBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIDxpPnNyYy5kaXI8L2k+IGRpcmVjdG9yeSBpbnRvCi10aGUgPGk+ZGVzdC5kaXI8L2k+IGRpcmVjdG9yeSByZXBsYWNpbmcgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIDxpPkB5ZWFyQDwvaT4KLXdpdGggPGk+MjAwMC48L2k+PC9wPgotPHByZT4gICZsdDtmaWx0ZXIgZmlsdGVyc2ZpbGU9JnF1b3Q7ZGVwbG95X2Vudi5wcm9wZXJ0aWVzJnF1b3Q7LyZndDs8L3ByZT4KLXdpbGwgcmVhZCBhbGwgcHJvcGVydHkgZW50cmllcyBmcm9tIHRoZSA8aT5kZXBsb3lfZW52LnByb3BlcnRpZXM8L2k+IGZpbGUKLWFuZCBzZXQgdGhlc2UgYXMgZmlsdGVycy4KIAorPHA+Q29weSByZWN1cnNpdmVseSBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIDxzYW1wPnNyYy5kaXI8L3NhbXA+IGRpcmVjdG9yeSBpbnRvCit0aGUgPHNhbXA+ZGVzdC5kaXI8L3NhbXA+IGRpcmVjdG9yeSByZXBsYWNpbmcgYWxsIHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIDxjb2RlPkB5ZWFyQDwvY29kZT4KK3dpdGggPHE+MjAwMDwvcT4uPC9wPgorPHByZT4KKyZsdDtmaWx0ZXIgdG9rZW49JnF1b3Q7eWVhciZxdW90OyB2YWx1ZT0mcXVvdDsyMDAwJnF1b3Q7LyZndDsKKyZsdDtjb3B5IHRvZGlyPSZxdW90OyR7ZGVzdC5kaXJ9JnF1b3Q7IGZpbHRlcmluZz0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmMuZGlyfSZxdW90Oy8mZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKKzxwPlJlYWQgYWxsIHByb3BlcnR5IGVudHJpZXMgZnJvbSB0aGUgPHNhbXA+ZGVwbG95X2Vudi5wcm9wZXJ0aWVzPC9zYW1wPiBmaWxlIGFuZCBzZXQgdGhlc2UgYXMKK2ZpbHRlcnMuPC9wPgorPHByZT4mbHQ7ZmlsdGVyIGZpbHRlcnNmaWxlPSZxdW90O2RlcGxveV9lbnYucHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2ZpeGNybGYuaHRtbCBiL21hbnVhbC9UYXNrcy9maXhjcmxmLmh0bWwKaW5kZXggYTYxNmFlNy4uMzBlM2NlYyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2ZpeGNybGYuaHRtbAorKysgYi9tYW51YWwvVGFza3MvZml4Y3JsZi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNDUgKzE1LDMyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5GaXhDUkxGIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImZpeGNybGYiPkZpeENSTEY8L2E+PC9oMj4KKzxoMiBpZD0iZml4Y3JsZiI+Rml4Q1JMRjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotICA8cD4KLSAgICBBZGp1c3RzIGEgdGV4dCBmaWxlIHRvIGxvY2FsIGNvbnZlbnRpb25zLgotICA8L3A+CisgIDxwPkFkanVzdHMgYSB0ZXh0IGZpbGUgdG8gbG9jYWwgY29udmVudGlvbnMuPC9wPgogCi0gIDxwPgotICAgIFRoZSBzZXQgb2YgZmlsZXMgdG8gYmUgYWRqdXN0ZWQgY2FuIGJlIHJlZmluZWQgd2l0aCB0aGUKLSAgICA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwKLSAgICA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci0gICAgYXR0cmlidXRlcy4gUGF0dGVybnMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yCi0gICAgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGVzIHNwZWNpZnkgZmlsZXMgdG8gYmUKLSAgICBpbmNsdWRlZC4gUGF0dGVybnMgcHJvdmlkZWQgdGhyb3VnaCB0aGUgPGk+ZXhjbHVkZTwvaT4gb3IKLSAgICA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBzcGVjaWZ5IGZpbGVzIHRvIGJlCi0gICAgZXhjbHVkZWQuIEFkZGl0aW9uYWxseSwgZGVmYXVsdCBleGNsdXNpb25zIGNhbiBiZSBzcGVjaWZpZWQgd2l0aAotICAgIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZS4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCi0gICAgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnktYmFzZWQKLSAgICB0YXNrczwvYT4sIGZvciBkZXRhaWxzIG9mIGZpbGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBwYXR0ZXJucwotICAgIGFuZCB0aGVpciB1c2FnZS4KLSAgPC9wPgorICA8cD5UaGUgc2V0IG9mIGZpbGVzIHRvIGJlIGFkanVzdGVkIGNhbiBiZSByZWZpbmVkIHdpdGgKKyAgICB0aGUgPHZhcj5pbmNsdWRlczwvdmFyPiwgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4sIDx2YXI+ZXhjbHVkZXM8L3Zhcj4sIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+CisgICAgYW5kIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZXMuIFBhdHRlcm5zIHByb3ZpZGVkIHRocm91Z2ggdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4KKyAgICBvciA8dmFyPmluY2x1ZGVzZmlsZTwvdmFyPiBhdHRyaWJ1dGVzIHNwZWNpZnkgZmlsZXMgdG8gYmUgaW5jbHVkZWQuIFBhdHRlcm5zIHByb3ZpZGVkIHRocm91Z2gKKyAgICB0aGUgPHZhcj5leGNsdWRlPC92YXI+IG9yIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+IGF0dHJpYnV0ZSBzcGVjaWZ5IGZpbGVzIHRvIGJlCisgICAgZXhjbHVkZWQuIEFkZGl0aW9uYWxseSwgZGVmYXVsdCBleGNsdXNpb25zIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4KKyAgICBhdHRyaWJ1dGUuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeS1iYXNlZAorICAgIHRhc2tzPC9hPiwgZm9yIGRldGFpbHMgb2YgZmlsZSBpbmNsdXNpb24vZXhjbHVzaW9uIHBhdHRlcm5zIGFuZCB0aGVpciB1c2FnZS48L3A+CiAKLSAgPHA+Ci0gICAgVGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0Ci0gICAgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQKLSAgICBzdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgotICAgICg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+c3JjZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi0gICAgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLSAgICA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgotICA8L3A+CisgIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0CisgICAgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8dmFyPmRpcjwvdmFyPiBiZWNvbWVzIDx2YXI+c3JjZGlyPC92YXI+KSBhcyB3ZWxsIGFzCisgICAgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CisgICAgYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogCiAgIDxwPgogICAgIFRoZSBvdXRwdXQgZmlsZSBpcyBvbmx5IHdyaXR0ZW4gaWYgaXQgaXMgYSBuZXcgZmlsZSwgb3IgaWYgaXQKQEAgLTYzLDI2NyArNTEsMjA0IEBACiAgICAgdGhlIDxhIGhyZWY9Ii4uL3J1bm5pbmcuaHRtbCN0bXBkaXIiPnRlbXBvcmFyeSBkaXJlY3Rvcnk8L2E+LgogICA8L3A+CiAKLSAgPHA+Ci0gICAgU2luY2UgPGI+QXBhY2hlIEFudCAxLjc8L2I+LCB0aGlzIHRhc2sgY2FuIGJlIHVzZWQgaW4gYQotICAgIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmNoYWluPC9hPi4KLSAgPC9wPgorICA8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPiwgdGhpcyB0YXNrIGNhbiBiZSB1c2VkIGluCisgICAgYSA8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJjaGFpbi5odG1sIj5maWx0ZXJjaGFpbjwvYT4uPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgY29sc3Bhbj0iMiI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCIgcm93c3Bhbj0iMiI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCIgcm93c3Bhbj0iMiI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIiBjb2xzcGFuPSIyIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiPjxiPkFzIFRhc2s8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiPjxiPkFzIEZpbHRlcjwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BcyBUYXNrPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXMgRmlsdGVyPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjRGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXJlIHRvIGZpbmQgdGhlIGZpbGVzIHRvIGJlIGZpeGVkIHVwLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5PbmUgb2YgdGhlc2U8L3RkPgotICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj4mbmJzcDs8L3RkPgorICAgIDx0ZD5zcmNEaXI8L3RkPgorICAgIDx0ZD5XaGVyZSB0byBmaW5kIHRoZSBmaWxlcyB0byBiZSBmaXhlZCB1cC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIiBjbGFzcz0iY2VudGVyIj5PbmUgb2YgdGhlc2U8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIxMSI+Ti9BPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIGEgc2luZ2xlIGZpbGUgdG8gZml4LiA8Yj5TaW5jZSBBbnQgMS43PC9iPjwvdGQ+Ci0gICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+TmFtZSBvZiBhIHNpbmdsZSBmaWxlIHRvIGZpeC4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3REaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlcmUgdG8gcGxhY2UgdGhlIGNvcnJlY3RlZCBmaWxlcy4gIERlZmF1bHRzIHRvCi0gICAgICBzcmNEaXIgKHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgZmlsZSkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgICA8dGQ+ZGVzdERpcjwvdGQ+CisgICAgPHRkPldoZXJlIHRvIHBsYWNlIHRoZSBjb3JyZWN0ZWQgZmlsZXMuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIDx2YXI+c3JjRGlyPC92YXI+IChyZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlcyk8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkIGNsYXNzPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkIGNsYXNzPSJjZW50ZXIiPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj4mbmJzcDs8L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPgorICAgICAgaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAotICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90ICg8cT55ZXN8bm88L3E+KS48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nLjwvdGQ+Ci0gICAgPHRkIGJnY29sb3I9IiNDQ0NDQ0MiPiZuYnNwOzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlcy48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVuY29kaW5nIHRvIHVzZSB3aGVuIHdyaXRpbmcgdGhlIGZpbGVzLgotICAgICAgICAgICAgICAgICAgICAgPGI+U2luY2UgQW50IDEuNzwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUuPC90ZD4KLSAgICA8dGQgYmdjb2xvcj0iI0NDQ0NDQyI+Jm5ic3A7PC90ZD4KKyAgICA8dGQ+b3V0cHV0ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0aGUgZmlsZXMuICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQgY2xhc3M9ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gaWYgc2V0IG9yIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZworICAgICAgb3RoZXJ3aXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmVsYXN0bW9kaWZpZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmVzZXJ2ZSB0aGUgbGFzdCBtb2RpZmllZAotICAgICAgICAgICAgICAgICAgICAgZGF0ZSBvZiBzb3VyY2UgZmlsZXMuIDxiPlNpbmNlIEFudCAxLjYuMzwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT48L3RkPgotICAgIDx0ZCBiZ2NvbG9yPSIjQ0NDQ0NDIj4mbmJzcDs8L3RkPgorICAgIDx0ZD5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gcHJlc2VydmUgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiBzb3VyY2UgZmlsZXMuIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPjwvdGQ+CisgICAgPHRkIGNsYXNzPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVvbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFNwZWNpZmllcyBob3cgZW5kLW9mLWxpbmUgKEVPTCkgY2hhcmFjdGVycyBhcmUgdG8gYmUKLSAgICAgIGhhbmRsZWQuICBUaGUgRU9MIGNoYXJhY3RlcnMgYXJlIENSLCBMRiBhbmQgdGhlIHBhaXIgQ1JMRi4KLSAgICAgIFZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6CisgICAgPHRkPmVvbDwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyBob3cgZW5kLW9mLWxpbmUgKEVPTCkgY2hhcmFjdGVycyBhcmUgdG8gYmUgaGFuZGxlZC4gIFRoZSBFT0wgY2hhcmFjdGVycyBhcmUgQ1IsIExGCisgICAgICBhbmQgdGhlIHBhaXIgQ1JMRi4gIFZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6CiAgICAgICA8dWw+Ci0gICAgICAgIDxsaT5hc2lzOiBsZWF2ZSBFT0wgY2hhcmFjdGVycyBhbG9uZTwvbGk+Ci0gICAgICAgIDxsaT5jcjogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBDUjwvbGk+Ci0gICAgICAgIDxsaT5sZjogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBMRjwvbGk+Ci0gICAgICAgIDxsaT5jcmxmOiBjb252ZXJ0IGFsbCBFT0xzIHRvIHRoZSBwYWlyIENSTEY8L2xpPgotICAgICAgICA8bGk+bWFjOiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIENSPC9saT4KLSAgICAgICAgPGxpPnVuaXg6IGNvbnZlcnQgYWxsIEVPTHMgdG8gYSBzaW5nbGUgTEY8L2xpPgotICAgICAgICA8bGk+ZG9zOiBjb252ZXJ0IGFsbCBFT0xzIHRvIHRoZSBwYWlyIENSTEY8L2xpPgorICAgICAgICA8bGk+PHE+YXNpczwvcT46IGxlYXZlIEVPTCBjaGFyYWN0ZXJzIGFsb25lPC9saT4KKyAgICAgICAgPGxpPjxxPmNyPC9xPjogY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBDUjwvbGk+CisgICAgICAgIDxsaT48cT5sZjwvcT46IGNvbnZlcnQgYWxsIEVPTHMgdG8gYSBzaW5nbGUgTEY8L2xpPgorICAgICAgICA8bGk+PHE+Y3JsZjwvcT46IGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRjwvbGk+CisgICAgICAgIDxsaT48cT5tYWM8L3E+OiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIENSPC9saT4KKyAgICAgICAgPGxpPjxxPnVuaXg8L3E+OiBjb252ZXJ0IGFsbCBFT0xzIHRvIGEgc2luZ2xlIExGPC9saT4KKyAgICAgICAgPGxpPjxxPmRvczwvcT46IGNvbnZlcnQgYWxsIEVPTHMgdG8gdGhlIHBhaXIgQ1JMRjwvbGk+CiAgICAgICA8L3VsPgotICAgICAgRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5nIHRoaXMgdGFzay4KLSAgICAgIEZvciBVbml4IHBsYXRmb3JtcyAoaW5jbHVkaW5nIE1hYyBPUyBYKSwgdGhlIGRlZmF1bHQgaXMgJnF1b3Q7bGYmcXVvdDsuCi0gICAgICBGb3IgRE9TLWJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMKLSAgICAgICZxdW90O2NybGYmcXVvdDsuCi0gICAgICBGb3IgTWFjIGVudmlyb25tZW50cyBvdGhlciB0aGFuIE9TIFgsIHRoZSBkZWZhdWx0IGlzICZxdW90O2NyJnF1b3Q7LgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNwZWNpZnlpbmcgRU9MLiAgVGhlCi0gICAgICAgICZxdW90OzxpPjxiPmNyPC9iPjwvaT4mcXVvdDsgYXR0cmlidXRlIChzZWUgYmVsb3cpIGlzCi0gICAgICAgIG5vdyBkZXByZWNhdGVkLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIDxpPk4uQi48L2k+OiBPbmUgc3BlY2lhbCBjYXNlIGlzIHJlY29nbml6ZWQuIFRoZSB0aHJlZQotICAgICAgICBjaGFyYWN0ZXJzIENSLUNSLUxGIGFyZSByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wuCi0gICAgICAgIFVubGVzcyB0aGlzIHByb3BlcnR5IGlzIHNwZWNpZmllZCBhcyAmcXVvdDthc2lzJnF1b3Q7LAotICAgICAgICB0aGlzIHNlcXVlbmNlIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0wKLSAgICAgICAgdHlwZS4KLSAgICAgIDwvcD4KKyAgICAgIDxwPlRoaXMgaXMgdGhlIHByZWZlcnJlZCBtZXRob2QgZm9yIHNwZWNpZnlpbmcgRU9MLiAgVGhlIDx2YXI+Y3I8L3Zhcj4gYXR0cmlidXRlIChzZWUgYmVsb3cpCisgICAgICBpcyBub3cgZGVwcmVjYXRlZC48L3A+CisgICAgICA8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IE9uZSBzcGVjaWFsIGNhc2UgaXMgcmVjb2duaXplZC4gVGhlIHRocmVlIGNoYXJhY3RlcnMgQ1ItQ1ItTEYgYXJlCisgICAgICAgIHJlZ2FyZGVkIGFzIGEgc2luZ2xlIEVPTC4gIFVubGVzcyB0aGlzIHByb3BlcnR5IGlzIHNwZWNpZmllZCBhcyA8cT5hc2lzPC9xPiwgdGhpcyBzZXF1ZW5jZQorICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgRU9MIHR5cGUuPC9wPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj5ObzwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjIiPk5vOyBkZWZhdWx0IGlzIHBsYXRmb3JtLXNwZWNpZmljOiA8cT5sZjwvcT4gZm9yIFVuaXggcGxhdGZvcm1zIChpbmNsdWRpbmcgTWFjIE9TCisgICAgWC9tYWNPUyksIDxxPmNybGY8L3E+IGZvciBET1MtYmFzZWQgc3lzdGVtcyAoaW5jbHVkaW5nIFdpbmRvd3MpLCA8cT5jcjwvcT4gZm9yIE1hYyBlbnZpcm9ubWVudHMKKyAgICBvdGhlciB0aGFuIE9TIFg8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxpPjxiPkRlcHJlY2F0ZWQuPC9iPjwvaT4gU3BlY2lmaWVzIGhvdyBDUiBjaGFyYWN0ZXJzIGFyZQotICAgICAgdG8gYmUgaGFuZGxlZCBhdCBlbmQtb2YtbGluZSAoRU9MKS4gIFZhbGlkIHZhbHVlcyBmb3IgdGhpcwotICAgICAgcHJvcGVydHkgYXJlOgorICAgIDx0ZD5jcjwvdGQ+CisgICAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+LiBTcGVjaWZpZXMgaG93IENSIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQgYXQgZW5kLW9mLWxpbmUKKyAgICAgIChFT0wpLiAgVmFsaWQgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5IGFyZToKICAgICAgIDx1bD4KLSAgICAgICAgPGxpPmFzaXM6IGxlYXZlIEVPTCBjaGFyYWN0ZXJzIGFsb25lLjwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICBhZGQ6IGFkZCBhIENSIGJlZm9yZSBhbnkgc2luZ2xlIExGIGNoYXJhY3RlcnMuIFRoZQotICAgICAgICAgIGludGVudCBpcyB0byBjb252ZXJ0IGFsbCBFT0xzIHRvIHRoZSBwYWlyIENSTEYuCi0gICAgICAgIDwvbGk+Ci0gICAgICAgIDxsaT4KLSAgICAgICAgICByZW1vdmU6IHJlbW92ZSBhbGwgQ1JzIGZyb20gdGhlIGZpbGUuICBUaGUgaW50ZW50IGlzCi0gICAgICAgICAgdG8gY29udmVydCBhbGwgRU9McyB0byBhIHNpbmdsZSBMRi4KLSAgICAgICAgPC9saT4KKyAgICAgICAgPGxpPjxxPmFzaXM8L3E+OiBsZWF2ZSBFT0wgY2hhcmFjdGVycyBhbG9uZS48L2xpPgorICAgICAgICA8bGk+PHE+YWRkPC9xPjogYWRkIGEgQ1IgYmVmb3JlIGFueSBzaW5nbGUgTEYgY2hhcmFjdGVycy4gVGhlIGludGVudCBpcyB0byBjb252ZXJ0IGFsbCBFT0xzCisgICAgICAgICAgdG8gdGhlIHBhaXIgQ1JMRi48L2xpPgorICAgICAgICA8bGk+PHE+cmVtb3ZlPC9xPjogcmVtb3ZlIGFsbCBDUnMgZnJvbSB0aGUgZmlsZS4gIFRoZSBpbnRlbnQgaXMgdG8gY29udmVydCBhbGwgRU9McyB0byBhCisgICAgICAgICAgc2luZ2xlIExGLjwvbGk+CiAgICAgICA8L3VsPgotICAgICAgRGVmYXVsdCBpcyBiYXNlZCBvbiB0aGUgcGxhdGZvcm0gb24gd2hpY2ggeW91IGFyZSBydW5uaW5nCi0gICAgICB0aGlzIHRhc2suICBGb3IgVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGlzICZxdW90O3JlbW92ZSZxdW90Oy4KLSAgICAgIEZvciBET1MgYmFzZWQgc3lzdGVtcyAoaW5jbHVkaW5nIFdpbmRvd3MpLCB0aGUgZGVmYXVsdCBpcwotICAgICAgJnF1b3Q7YWRkJnF1b3Q7LgotICAgICAgPHA+Ci0gICAgICAgIDxpPk4uQi48L2k+OiBPbmUgc3BlY2lhbCBjYXNlIGlzIHJlY29nbml6ZWQuIFRoZSB0aHJlZQotICAgICAgICBjaGFyYWN0ZXJzIENSLUNSLUxGIGFyZSByZWdhcmRlZCBhcyBhIHNpbmdsZSBFT0wuCi0gICAgICAgIFVubGVzcyB0aGlzIHByb3BlcnR5IGlzIHNwZWNpZmllZCBhcyAmcXVvdDthc2lzJnF1b3Q7LAotICAgICAgICB0aGlzIHNlcXVlbmNlIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0wKLSAgICAgICAgdHlwZS4KLSAgICAgIDwvcD4KKyAgICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogT25lIHNwZWNpYWwgY2FzZSBpcyByZWNvZ25pemVkLiBUaGUgdGhyZWUgY2hhcmFjdGVycyBDUi1DUi1MRiBhcmUKKyAgICAgICAgcmVnYXJkZWQgYXMgYSBzaW5nbGUgRU9MLiAgVW5sZXNzIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWVkIGFzIDxxPmFzaXM8L3E+LCB0aGlzIHNlcXVlbmNlCisgICAgICAgIHdpbGwgYmUgY29udmVydGVkIGludG8gdGhlIHNwZWNpZmllZCBFT0wgdHlwZS48L3A+CiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPk5vPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHQgaXMgcGxhdGZvcm0tc3BlY2lmaWM6IDxxPnJlbW92ZTwvcT4gZm9yIFVuaXggcGxhdGZvcm1zLCA8cT5hZGQ8L3E+CisgICAgICBmb3IgRE9TIGJhc2VkIHN5c3RlbXMgKGluY2x1ZGluZyBXaW5kb3dzKTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmphdmFmaWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFVzZWQgb25seSBpbiBhc3NvY2lhdGlvbiB3aXRoIHRoZQotICAgICAgJnF1b3Q7PGk+PGI+dGFiPC9iPjwvaT4mcXVvdDsgYXR0cmlidXRlIChzZWUgYmVsb3cpLCB0aGlzCi0gICAgICBib29sZWFuIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZXNldCBpcyBhIHNldAotICAgICAgb2YgamF2YSBzb3VyY2UgZmlsZXMKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0cyB0bwotICAgICAgJnF1b3Q7bm8mcXVvdDsuICBTZWUgbm90ZXMgaW4gc2VjdGlvbiBvbiAmcXVvdDt0YWImcXVvdDsuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPk5vPC90ZD4KKyAgICA8dGQ+amF2YWZpbGVzPC90ZD4KKyAgICA8dGQ+VXNlZCBvbmx5IGluIGFzc29jaWF0aW9uIHdpdGggdGhlIDx2YXI+dGFiPC92YXI+IGF0dHJpYnV0ZSAoc2VlIGJlbG93KSwgdGhpcyBib29sZWFuCisgICAgICBhdHRyaWJ1dGUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpbGVzZXQgaXMgYSBzZXQgb2YgSmF2YSBzb3VyY2UgZmlsZXMgKDxxPnllc3xubzwvcT4pLiBTZWUKKyAgICAgIG5vdGVzIGluIHNlY3Rpb24gb24gPHZhcj50YWI8L3Zhcj4uPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRhYjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgaG93IHRhYiBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLiAgVmFsaWQKLSAgICAgIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6CisgICAgPHRkPnRhYjwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyBob3cgdGFiIGNoYXJhY3RlcnMgYXJlIHRvIGJlIGhhbmRsZWQuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOgogICAgICAgPHVsPgotICAgICAgPGxpPmFkZDogY29udmVydCBzZXF1ZW5jZXMgb2Ygc3BhY2VzIHdoaWNoIHNwYW4gYSB0YWIgc3RvcCB0byB0YWJzPC9saT4KLSAgICAgIDxsaT5hc2lzOiBsZWF2ZSB0YWIgYW5kIHNwYWNlIGNoYXJhY3RlcnMgYWxvbmU8L2xpPgotICAgICAgPGxpPnJlbW92ZTogY29udmVydCB0YWJzIHRvIHNwYWNlczwvbGk+CisgICAgICAgIDxsaT48cT5hZGQ8L3E+OiBjb252ZXJ0IHNlcXVlbmNlcyBvZiBzcGFjZXMgd2hpY2ggc3BhbiBhIHRhYiBzdG9wIHRvIHRhYnM8L2xpPgorICAgICAgICA8bGk+PHE+YXNpczwvcT46IGxlYXZlIHRhYiBhbmQgc3BhY2UgY2hhcmFjdGVycyBhbG9uZTwvbGk+CisgICAgICAgIDxsaT48cT5yZW1vdmU8L3E+OiBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzPC9saT4KICAgICAgIDwvdWw+Ci0gICAgICBEZWZhdWx0IGZvciB0aGlzIHBhcmFtZXRlciBpcyAmcXVvdDthc2lzJnF1b3Q7LgotICAgICAgPHA+Ci0gICAgICAgIDxpPk4uQi48L2k+OiBXaGVuIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgJnF1b3Q7PGk+PGI+amF2YWZpbGVzPC9iPjwvaT4mcXVvdDsgKHNlZSBhYm92ZSkgaXMKLSAgICAgICAgJnF1b3Q7dHJ1ZSZxdW90OywgbGl0ZXJhbCBUQUIgY2hhcmFjdGVycyBvY2N1cnJpbmcKLSAgICAgICAgd2l0aGluIEphdmEgc3RyaW5nIG9yIGNoYXJhY3RlciBjb25zdGFudHMgYXJlIG5ldmVyCi0gICAgICAgIG1vZGlmaWVkLiAgVGhpcyBmdW5jdGlvbmFsaXR5IGFsc28gcmVxdWlyZXMgdGhlCi0gICAgICAgIHJlY29nbml0aW9uIG9mIEphdmEtc3R5bGUgY29tbWVudHMuCi0gICAgICA8L3A+Ci0gICAgICA8cD4KLSAgCTxpPk4uQi48L2k+OiBUaGVyZSBpcyBhbiBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGlzCi0gIAlhbmQgdGhlIHByZXZpb3VzIHZlcnNpb24gaW4gdGhlIGhhbmRsaW5nIG9mIHdoaXRlCi0gIAlzcGFjZSBhdCB0aGUgZW5kIG9mIGxpbmVzLiAgVGhpcyB2ZXJzaW9uIGRvZXMKLSAgCTxpPjxiPm5vdDwvYj48L2k+IHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIG9uIGxpbmVzLgotICAgICAgPC9wPgorICAgICAgPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBXaGVuIHRoZSBhdHRyaWJ1dGUgPHZhcj5qYXZhZmlsZXM8L3Zhcj4gKHNlZSBhYm92ZSkgaXMgPHE+dHJ1ZTwvcT4sCisgICAgICAgIGxpdGVyYWwgVEFCIGNoYXJhY3RlcnMgb2NjdXJyaW5nIHdpdGhpbiBKYXZhIHN0cmluZyBvciBjaGFyYWN0ZXIgY29uc3RhbnRzIGFyZSBuZXZlcgorICAgICAgICBtb2RpZmllZC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBhbHNvIHJlcXVpcmVzIHRoZSByZWNvZ25pdGlvbiBvZiBKYXZhLXN0eWxlIGNvbW1lbnRzLjwvcD4KKyAgICAgIDxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gdGhpcyBhbmQgdGhlIHByZXZpb3VzIHZlcnNpb24gaW4KKyAgICAgICAgdGhlIGhhbmRsaW5nIG9mIHdoaXRlIHNwYWNlIGF0IHRoZSBlbmQgb2YgbGluZXMuICBUaGlzIHZlcnNpb24KKyAgICAgICAgZG9lcyA8ZW0+PHN0cm9uZz5ub3Q8L3N0cm9uZz48L2VtPiByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiBsaW5lcy48L3A+CiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIGNvbHNwYW49IjIiPk5vPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHQgaXMgPHE+YXNpczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50YWJsZW5ndGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VEFCIGNoYXJhY3RlciBpbnRlcnZhbC4gVmFsaWQgdmFsdWVzIGFyZSBiZXR3ZWVuCi0gICAgICAyIGFuZCA4MCBpbmNsdXNpdmUuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgOC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm88L3RkPgorICAgIDx0ZD50YWJsZW5ndGg8L3RkPgorICAgIDx0ZD5UQUIgY2hhcmFjdGVyIGludGVydmFsLiBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gPHE+MjwvcT4gYW5kIDxxPjgwPC9xPiBpbmNsdXNpdmUuPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHQgaXMgPHE+ODwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lb2Y8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGhvdyBET1MgZW5kIG9mIGZpbGUgKGNvbnRyb2wtWikgY2hhcmFjdGVycyBhcmUKLSAgICAgIHRvIGJlIGhhbmRsZWQuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHkgYXJlOgorICAgIDx0ZD5lb2Y8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgaG93IERPUyBlbmQgb2YgZmlsZSAoY29udHJvbC1aKSBjaGFyYWN0ZXJzIGFyZSB0byBiZSBoYW5kbGVkLiAgVmFsaWQgdmFsdWVzIGZvcgorICAgICAgdGhpcyBwcm9wZXJ0eSBhcmU6CiAgICAgICA8dWw+Ci0gICAgICA8bGk+YWRkOiBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhbiBFT0YgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU8L2xpPgotICAgICAgPGxpPmFzaXM6IGxlYXZlIEVPRiBjaGFyYWN0ZXJzIGFsb25lPC9saT4KLSAgICAgIDxsaT5yZW1vdmU6IHJlbW92ZSBhbnkgRU9GIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZW5kPC9saT4KKyAgICAgICAgPGxpPjxxPmFkZDwvcT46IGVuc3VyZSB0aGF0IHRoZXJlIGlzIGFuIEVPRiBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZTwvbGk+CisgICAgICAgIDxsaT48cT5hc2lzPC9xPjogbGVhdmUgRU9GIGNoYXJhY3RlcnMgYWxvbmU8L2xpPgorICAgICAgICA8bGk+PHE+cmVtb3ZlPC9xPjogcmVtb3ZlIGFueSBFT0YgY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQ8L2xpPgogICAgICAgPC91bD4KLSAgICAgIERlZmF1bHQgaXMgYmFzZWQgb24gdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHlvdSBhcmUgcnVubmluZyB0aGlzIHRhc2suCi0gICAgICBGb3IgVW5peCBwbGF0Zm9ybXMsIHRoZSBkZWZhdWx0IGlzIHJlbW92ZS4gIEZvciBET1MgYmFzZWQgc3lzdGVtcwotICAgICAgKGluY2x1ZGluZyBXaW5kb3dzKSwgdGhlIGRlZmF1bHQgaXMgYXNpcy4KLSAgICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiBjb2xzcGFuPSIyIj5ObzwvdGQ+CisgICAgPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHQgaXMgcGxhdGZvcm0tc3BlY2lmaWM6IDxxPnJlbW92ZTwvcT4gZm9yIFVuaXggcGxhdGZvcm1zLCA8cT5hc2lzPC9xPgorICAgICAgZm9yIERPUyBiYXNlZCBzeXN0ZW1zIChpbmNsdWRpbmcgV2luZG93cyk8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maXhsYXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gYWRkIGEgbWlzc2luZyBFT0wgdG8gdGhlIGxhc3QgbGluZQotICAgICAgICAgICAgICAgICAgICAgb2YgYSBwcm9jZXNzZWQgZmlsZS48YnIvPklnbm9yZWQgaWYgRU9MIGlzIGFzaXMuPGJyLz48Yj5TaW5jZSBBbnQgMS42LjE8L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgY29sc3Bhbj0iMiI+Tm87IGRlZmF1bHQgaXMgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZD5maXhsYXN0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBhZGQgYSBtaXNzaW5nIEVPTCB0byB0aGUgbGFzdCBsaW5lIG9mIGEgcHJvY2Vzc2VkIGZpbGUuPGJyLz5JZ25vcmVkCisgICAgICBpZiA8dmFyPmVvZjwvdmFyPiBpcyA8cT5hc2lzPC9xPi48YnIvPjxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjIiPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4mbHQ7Zml4Y3JsZiBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouc2gmcXVvdDsKLSAgICAgICAgIGVvbD0mcXVvdDtsZiZxdW90OyBlb2Y9JnF1b3Q7cmVtb3ZlJnF1b3Q7IC8mZ3Q7PC9wcmU+Ci08cD5SZXBsYWNlcyBFT0xzIHdpdGggTEYgY2hhcmFjdGVycyBhbmQgcmVtb3ZlcyBlb2YgY2hhcmFjdGVycyBmcm9tCi0gIHRoZSBzaGVsbCBzY3JpcHRzLiAgVGFicyBhbmQgc3BhY2VzIGFyZSBsZWZ0IGFzIGlzLjwvcD4KLTxwcmU+Jmx0O2ZpeGNybGYgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OwotICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5iYXQmcXVvdDsgZW9sPSZxdW90O2NybGYmcXVvdDsgLyZndDs8L3ByZT4KLTxwPlJlcGxhY2VzIGFsbCBFT0xzIHdpdGggY3ItbGYgcGFpcnMgaW4gdGhlIGJhdGNoIGZpbGVzLgotICBUYWJzIGFuZCBzcGFjZXMgYXJlIGxlZnQgYXMgaXMuCi0gIEVPRiBjaGFyYWN0ZXJzIGFyZSBsZWZ0IGFsb25lIGlmIHJ1biBvbgotICBET1Mgc3lzdGVtcywgYW5kIGFyZSByZW1vdmVkIGlmIHJ1biBvbiBVbml4IHN5c3RlbXMuPC9wPgotPHByZT4mbHQ7Zml4Y3JsZiBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Ci0gICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi9NYWtlZmlsZSZxdW90OyB0YWI9JnF1b3Q7YWRkJnF1b3Q7IC8mZ3Q7PC9wcmU+Ci08cD5TZXRzIEVPTHMgYWNjb3JkaW5nIHRvIGxvY2FsIE9TIGNvbnZlbnRpb25zLCBhbmQKLSAgY29udmVydHMgc2VxdWVuY2VzIG9mIHNwYWNlcyBhbmQgdGFicyB0byB0aGUgbWluaW1hbCBzZXQgb2Ygc3BhY2VzIGFuZAotICB0YWJzIHdoaWNoIHdpbGwgbWFpbnRhaW4gc3BhY2luZyB3aXRoaW4gdGhlIGxpbmUuICBUYWJzIGFyZQotICBzZXQgYXQgOCBjaGFyYWN0ZXIgaW50ZXJ2YWxzLiAgRU9GIGNoYXJhY3RlcnMgYXJlIGxlZnQgYWxvbmUgaWYKLSAgcnVuIG9uIERPUyBzeXN0ZW1zLCBhbmQgYXJlIHJlbW92ZWQgaWYgcnVuIG9uIFVuaXggc3lzdGVtcy4KLSAgTWFueSB2ZXJzaW9ucyBvZiBtYWtlIHJlcXVpcmUgdGFicyBwcmlvciB0byBjb21tYW5kcy48L3A+Ci0gIDxwcmU+Jmx0O2ZpeGNybGYgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsKLSAgICAgICAgIHRhYj0mcXVvdDtyZW1vdmUmcXVvdDsgdGFibGVuZ3RoPSZxdW90OzMmcXVvdDsKLSAgICAgICAgIGVvbD0mcXVvdDtsZiZxdW90OyBqYXZhZmlsZXM9JnF1b3Q7eWVzJnF1b3Q7IC8mZ3Q7PC9wcmU+Ci08cD4KLSAgQ29udmVydHMgYWxsIEVPTHMgaW4gdGhlIGluY2x1ZGVkIGphdmEgc291cmNlIGZpbGVzIHRvIGEKLSAgc2luZ2xlIExGLiAgUmVwbGFjZSBhbGwgVEFCIGNoYXJhY3RlcnMgZXhjZXB0IHRob3NlIGluIHN0cmluZwotICBvciBjaGFyYWN0ZXIgY29uc3RhbnRzIHdpdGggc3BhY2VzLCBhc3N1bWluZyBhIHRhYiB3aWR0aCBvZiAzLgotICBJZiBydW4gb24gYSB1bml4IHN5c3RlbSwgYW55IENUUkwtWiBFT0YgY2hhcmFjdGVycyBhdCB0aGUgZW5kCi0gIG9mIHRoZSBmaWxlIGFyZSByZW1vdmVkLiAgT24gRE9TL1dpbmRvd3MsIGFueSBzdWNoIEVPRgotICBjaGFyYWN0ZXJzIHdpbGwgYmUgbGVmdCB1bnRvdWNoZWQuCi08L3A+Ci08cHJlPiZsdDtmaXhjcmxmIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqL1JFQURNRSomcXVvdDsgdGFiPSZxdW90O3JlbW92ZSZxdW90OyAvJmd0OzwvcHJlPgotPHA+U2V0cyBFT0xzIGFjY29yZGluZyB0byBsb2NhbCBPUyBjb252ZW50aW9ucywgYW5kCi0gIGNvbnZlcnRzIGFsbCB0YWJzIHRvIHNwYWNlcywgYXNzdW1pbmcgYSB0YWIgd2lkdGggb2YgOC4KLSAgRU9GIGNoYXJhY3RlcnMgYXJlIGxlZnQgYWxvbmUgaWYgcnVuIG9uCi0gIERPUyBzeXN0ZW1zLCBhbmQgYXJlIHJlbW92ZWQgaWYgcnVuIG9uIFVuaXggc3lzdGVtcy4KLSAgWW91IG5ldmVyIGtub3cgd2hhdCBlZGl0b3IgYSB1c2VyIHdpbGwgdXNlIHRvIGJyb3dzZSBSRUFETUVzLjwvcD4KKzxwPlJlcGxhY2UgRU9McyB3aXRoIExGIGNoYXJhY3RlcnMgYW5kIHJlbW92ZSBFT0YgY2hhcmFjdGVycyBmcm9tIHRoZSBzaGVsbCBzY3JpcHRzLiBUYWJzIGFuZCBzcGFjZXMKK2FyZSBsZWZ0IGFzIGlzLjwvcD4KKzxwcmU+CismbHQ7Zml4Y3JsZiBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouc2gmcXVvdDsKKyAgICAgICAgIGVvbD0mcXVvdDtsZiZxdW90OyBlb2Y9JnF1b3Q7cmVtb3ZlJnF1b3Q7LyZndDs8L3ByZT4KIAorPHA+UmVwbGFjZSBhbGwgRU9McyB3aXRoIGNyLWxmIHBhaXJzIGluIHRoZSBiYXRjaCBmaWxlcy4gVGFicyBhbmQgc3BhY2VzIGFyZSBsZWZ0IGFzIGlzLiBFT0YKK2NoYXJhY3RlcnMgYXJlIGxlZnQgYWxvbmUgaWYgcnVuIG9uIERPUyBzeXN0ZW1zLCBhbmQgYXJlIHJlbW92ZWQgaWYgcnVuIG9uIFVuaXggc3lzdGVtcy48L3A+Cis8cHJlPgorJmx0O2ZpeGNybGYgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovKi5iYXQmcXVvdDsgZW9sPSZxdW90O2NybGYmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TZXQgRU9McyBhY2NvcmRpbmcgdG8gbG9jYWwgT1MgY29udmVudGlvbnMsIGFuZCBjb252ZXJ0IHNlcXVlbmNlcyBvZiBzcGFjZXMgYW5kIHRhYnMgaW50byB0aGUKK21pbmltYWwgc2V0IG9mIHNwYWNlcyBhbmQgdGFicyB3aGljaCB3aWxsIHByZXNlcnZlIHNwYWNpbmcgd2l0aGluIHRoZSBsaW5lLiBUYWJzIGFyZSBzZXQgYXQgOAorY2hhcmFjdGVyIGludGVydmFscy4gRU9GIGNoYXJhY3RlcnMgYXJlIGxlZnQgYWxvbmUgaWYgcnVuIG9uIERPUyBzeXN0ZW1zLCBhbmQgYXJlIHJlbW92ZWQgaWYgcnVuIG9uCitVbml4IHN5c3RlbXMuIE1hbnkgdmVyc2lvbnMgb2YgbWFrZSByZXF1aXJlIHRhYnMgcHJpb3IgdG8gY29tbWFuZHMuPC9wPgorPHByZT4KKyZsdDtmaXhjcmxmIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqL01ha2VmaWxlJnF1b3Q7IHRhYj0mcXVvdDthZGQmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5Db252ZXJ0IGFsbCBFT0xzIGluIHRoZSBpbmNsdWRlZCBKYXZhIHNvdXJjZSBmaWxlcyB0byBhIHNpbmdsZSBMRi4gUmVwbGFjZSBhbGwgdGFiIGNoYXJhY3RlcnMKK2V4Y2VwdCB0aG9zZSBpbiBzdHJpbmcgb3IgY2hhcmFjdGVyIGNvbnN0YW50cyB3aXRoIHNwYWNlcywgYXNzdW1pbmcgYSB0YWIgd2lkdGggb2YgMy4gSWYgcnVuIG9uIGEKK1VuaXggc3lzdGVtLCBhbnkgQ1RSTC1aIEVPRiBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYXJlIHJlbW92ZWQuIE9uIERPUy9XaW5kb3dzLCBhbnkgc3VjaAorRU9GIGNoYXJhY3RlcnMgd2lsbCBiZSBsZWZ0IHVudG91Y2hlZC4KKzwvcD4KKzxwcmU+CismbHQ7Zml4Y3JsZiBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OworICAgICAgICAgdGFiPSZxdW90O3JlbW92ZSZxdW90OyB0YWJsZW5ndGg9JnF1b3Q7MyZxdW90OworICAgICAgICAgZW9sPSZxdW90O2xmJnF1b3Q7IGphdmFmaWxlcz0mcXVvdDt5ZXMmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TZXQgRU9McyBhY2NvcmRpbmcgdG8gbG9jYWwgT1MgY29udmVudGlvbnMsIGFuZCBjb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcywgYXNzdW1pbmcgYSB0YWIgd2lkdGgKK29mIDguIEVPRiBjaGFyYWN0ZXJzIGFyZSBsZWZ0IGFsb25lIGlmIHJ1biBvbiBET1Mgc3lzdGVtcywgYW5kIGFyZSByZW1vdmVkIGlmIHJ1biBvbiBVbml4CitzeXN0ZW1zLiBZb3UgbmV2ZXIga25vdyB3aGF0IGVkaXRvciBhIHVzZXIgd2lsbCB1c2UgdG8gYnJvd3NlIFJFQURNRXMuPC9wPgorPHByZT4KKyZsdDtmaXhjcmxmIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqL1JFQURNRSomcXVvdDsgdGFiPSZxdW90O3JlbW92ZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9mdHAuaHRtbCBiL21hbnVhbC9UYXNrcy9mdHAuaHRtbAppbmRleCA2YWQ1M2FmLi4wZTM4NzIzIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZnRwLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2Z0cC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNzE2ICsxNSw2MTMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkZUUCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJmdHAiPkZUUDwvYT48L2gyPgorPGgyIGlkPSJmdHAiPkZUUDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+VGhlIGZ0cCB0YXNrIGltcGxlbWVudHMgYSBiYXNpYyBGVFAgY2xpZW50IHRoYXQgY2FuIHNlbmQsIHJlY2VpdmUsCi1saXN0LCBkZWxldGUgZmlsZXMsIGFuZCBjcmVhdGUgZGlyZWN0b3JpZXMuICBTZWUgYmVsb3cgZm9yIGRlc2NyaXB0aW9ucyBhbmQgZXhhbXBsZXMgb2YgaG93Ci10byBwZXJmb3JtIGVhY2ggdGFzay48L3A+Ci08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uCi1TZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2NvbW1vbnMtbmV0Ij5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCi08aT5HZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbGlicmFyeSwgZm9yIHRoZSBiZXN0IHN1cHBvcnQgaW4gQW50PC9pPgotCi08L3A+Ci08cD5UaGUgZnRwIHRhc2sgYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIHdoYXQgZmlsZSBzeXN0ZW0gaXMgaW4gcGxhY2Ugb24gdGhlIEZUUCBzZXJ2ZXIuCi1TdXBwb3J0ZWQgc2VydmVyIHR5cGVzIGFyZSBVbml4LCBOVCwgT1MyLCBWTVMsIGFuZCBPUzQwMC4gIEluIGFkZGl0aW9uLCBOVCBhbmQgT1M0MDAgc2VydmVycwotd2hpY2ggaGF2ZSBiZWVuIGNvbmZpZ3VyZWQgdG8gZGlzcGxheSB0aGUgZGlyZWN0b3J5IGluIFVuaXggc3R5bGUgYXJlIGFsc28gc3VwcG9ydGVkIGNvcnJlY3RseS4KLU90aGVyd2lzZSwgdGhlIHN5c3RlbSB3aWxsIGRlZmF1bHQgdG8gVW5peCBzdGFuZGFyZHMuCi08aT5yZW1vdGVkaXI8L2k+IG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBleGFjdCBzeW50YXggcmVxdWlyZWQgYnkgdGhlIGZ0cAotc2VydmVyLiBJZiB0aGUgdXN1YWwgVW5peCBjb252ZW50aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyLAotPGk+c2VwYXJhdG9yPC9pPiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGZpbGUgc2VwYXJhdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQKLWluc3RlYWQuPC9wPgotPHA+U2VlIHRoZSBzZWN0aW9uIG9uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkCi10YXNrczwvYT4sIG9uIGhvdyB0aGUgaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0bwotd3JpdGUgcGF0dGVybnMuPC9wPgotPHA+Ci1UaGlzIHRhc2sgZG9lcyBub3QgY3VycmVudGx5IHVzZSB0aGUgcHJveHkgaW5mb3JtYXRpb24gc2V0IGJ5IHRoZQotPGEgaHJlZj0ic2V0cHJveHkuaHRtbCI+PGNvZGU+Jmx0O3NldHByb3h5Jmd0OzwvY29kZT48L2E+IHRhc2ssIGFuZCBjYW5ub3QgZ28gdGhyb3VnaAotYSBmaXJld2FsbCB2aWEgc29ja3MuIAotPHA+Ci08Yj5XYXJuaW5nOiA8L2I+IHRoZXJlIGhhdmUgYmVlbiBwcm9ibGVtcyByZXBvcnRlZCBjb25jZXJuaW5nIHRoZSBmdHAgZ2V0IHdpdGggdGhlIDxjb2RlPm5ld2VyPC9jb2RlPiBhdHRyaWJ1dGUuCi1Qcm9ibGVtcyBtaWdodCBiZSBkdWUgdG8gZm9ybWF0IG9mIGxzIC1sIGRpZmZlcmluZyBmcm9tIHdoYXQgaXMgZXhwZWN0ZWQgYnkgY29tbW9ucy1uZXQsCi1mb3IgaW5zdGFuY2UgZHVlIHRvIHNwZWNpZmljaXRpZXMgb2YgbGFuZ3VhZ2UgdXNlZCBieSB0aGUgZnRwIHNlcnZlciBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcuCi1JZiB5b3UgZW5jb3VudGVyIHN1Y2ggYSBwcm9ibGVtLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbCBpbmNsdWRpbmcgYSBzYW1wbGUgZGlyZWN0b3J5IGxpc3RpbmcKLWNvbWluZyBmcm9tIHlvdXIgZnRwIHNlcnZlciAobHMgLWwgb24gdGhlIGZ0cCBwcm9tcHQpLgotPC9wPgotPHA+Ci1JZiB5b3UgY2FuIGNvbm5lY3QgYnV0IG5vdCB1cGxvYWQgb3IgZG93bmxvYWQsIHRyeSBzZXR0aW5nIHRoZSA8Y29kZT5wYXNzaXZlPC9jb2RlPgotYXR0cmlidXRlIHRvIHRydWUgdG8gdXNlIHRoZSBleGlzdGluZyAob3BlbikgY2hhbm5lbCwgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIHNlcnZlcgotdHJ5IHRvIHNldCB1cCBhIG5ldyBjb25uZWN0aW9uLjwvcD4KKzxwPlRoZSA8Y29kZT5mdHA8L2NvZGU+IHRhc2sgaW1wbGVtZW50cyBhIGJhc2ljIEZUUCBjbGllbnQgdGhhdCBjYW4gc2VuZCwgcmVjZWl2ZSwgbGlzdCwgZGVsZXRlCitmaWxlcywgYW5kIGNyZWF0ZSBkaXJlY3Rvcmllcy4gIFNlZSBiZWxvdyBmb3IgZGVzY3JpcHRpb25zIGFuZCBleGFtcGxlcyBvZiBob3cgdG8gcGVyZm9ybSBlYWNoCit0YXNrLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudAorZGlzdHJpYnV0aW9uLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNjb21tb25zLW5ldCI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlCitpbmZvcm1hdGlvbi4gPGVtPkdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBsaWJyYXJ5LCBmb3IgdGhlIGJlc3Qgc3VwcG9ydCBpbiBBbnQuPC9lbT48L3A+Cis8cD5UaGUgPGNvZGU+ZnRwPC9jb2RlPiB0YXNrIGF0dGVtcHRzIHRvIGRldGVybWluZSB3aGF0IGZpbGUgc3lzdGVtIGlzIGluIHBsYWNlIG9uIHRoZSBGVFAgc2VydmVyLgorU3VwcG9ydGVkIHNlcnZlciB0eXBlcyBhcmUgVW5peCwgTlQsIE9TMiwgVk1TLCBhbmQgT1M0MDAuICBJbiBhZGRpdGlvbiwgTlQgYW5kIE9TNDAwIHNlcnZlcnMgd2hpY2gKK2hhdmUgYmVlbiBjb25maWd1cmVkIHRvIGRpc3BsYXkgdGhlIGRpcmVjdG9yeSBpbiBVbml4IHN0eWxlIGFyZSBhbHNvIHN1cHBvcnRlZCBjb3JyZWN0bHkuCitPdGhlcndpc2UsIHRoZSBzeXN0ZW0gd2lsbCBkZWZhdWx0IHRvIFVuaXggc3RhbmRhcmRzLiA8dmFyPnJlbW90ZWRpcjwvdmFyPiBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUKK2V4YWN0IHN5bnRheCByZXF1aXJlZCBieSB0aGUgRlRQIHNlcnZlci4gSWYgdGhlIHVzdWFsIFVuaXggY29udmVudGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCitzZXJ2ZXIsIDx2YXI+c2VwYXJhdG9yPC92YXI+IGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgZmlsZSBzZXBhcmF0b3IgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLjwvcD4KKzxwPlNlZSB0aGUgc2VjdGlvbiBvbiA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uCitob3cgdGhlIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgorPHA+VGhpcyB0YXNrIGRvZXMgbm90IGN1cnJlbnRseSB1c2UgdGhlIHByb3h5IGluZm9ybWF0aW9uIHNldCBieQordGhlIDxhIGhyZWY9InNldHByb3h5Lmh0bWwiPjxjb2RlPiZsdDtzZXRwcm94eSZndDs8L2NvZGU+PC9hPiB0YXNrLCBhbmQgY2Fubm90IGdvIHRocm91Z2ggYSBmaXJld2FsbAordmlhIHNvY2tzLjwvcD4KKzxwPjxzdHJvbmc+V2FybmluZzwvc3Ryb25nPjogdGhlcmUgaGF2ZSBiZWVuIHByb2JsZW1zIHJlcG9ydGVkIGNvbmNlcm5pbmcKK3RoZSA8Y29kZT5mdHA8L2NvZGU+IDxxPmdldDwvcT4gd2l0aCB0aGUgPHZhcj5uZXdlcjwvdmFyPiBhdHRyaWJ1dGUuICBQcm9ibGVtcyBtaWdodCBiZSBkdWUgdG8KK2Zvcm1hdCBvZiA8a2JkPmxzIC1sPC9rYmQ+IGRpZmZlcmluZyBmcm9tIHdoYXQgaXMgZXhwZWN0ZWQgYnkgY29tbW9ucy1uZXQsIGZvciBpbnN0YW5jZSBkdWUgdG8KK3NwZWNpZmljcyBvZiBsYW5ndWFnZSB1c2VkIGJ5IHRoZSBGVFAgc2VydmVyIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4gIElmIHlvdSBlbmNvdW50ZXIgc3VjaCBhCitwcm9ibGVtLCBwbGVhc2Ugc2VuZCBhbiBlbWFpbCBpbmNsdWRpbmcgYSBzYW1wbGUgZGlyZWN0b3J5IGxpc3RpbmcgY29taW5nIGZyb20geW91ciBGVFAgc2VydmVyCisoPGtiZD5scyAtbDwva2JkPiBvbiB0aGUgRlRQIHByb21wdCkuPC9wPgorPHA+SWYgeW91IGNhbiBjb25uZWN0IGJ1dCBub3QgdXBsb2FkIG9yIGRvd25sb2FkLCB0cnkgc2V0dGluZyB0aGUgPHZhcj5wYXNzaXZlPC92YXI+IGF0dHJpYnV0ZQordG8gPHE+dHJ1ZTwvcT4gdG8gdXNlIHRoZSBleGlzdGluZyAob3BlbikgY2hhbm5lbCwgaW5zdGVhZCBvZiBoYXZpbmcgdGhlIHNlcnZlciB0cnkgdG8gc2V0IHVwIGEgbmV3Citjb25uZWN0aW9uLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNSUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjY1JSI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMCUiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBmdHAgc2VydmVyLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zZXJ2ZXI8L3RkPgorICAgIDx0ZD50aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSBmdHAgc2VydmVyLgotICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gcG9ydCAyMS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+dGhlIHBvcnQgbnVtYmVyIG9mIHRoZSByZW1vdGUgRlRQIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MjE8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIGZ0cCBzZXJ2ZXIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnVzZXJpZDwvdGQ+CisgICAgPHRkPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIEZUUCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZSBvbiB0aGUgZnRwIHNlcnZlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD50aGUgbG9naW4gcGFzc3dvcmQgdG8gdXNlIG9uIHRoZSBGVFAgc2VydmVyLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFjY291bnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFjY291bnQgdG8gdXNlIG9uIHRoZSBmdHAgc2VydmVyLgotICAgICAgICA8ZW0+c2luY2UgQW50IDEuNzwvZW0+LgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmFjY291bnQ8L3RkPgorICAgIDx0ZD50aGUgYWNjb3VudCB0byB1c2Ugb24gdGhlIEZUUCBzZXJ2ZXIuCisgICAgPGVtPnNpbmNlIEFudCAxLjc8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW90ZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdGUgZGlyZWN0b3J5IG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgZnRwIHNlcnZlcgotICAgICAgICAgICAgICAgICAgICAgc2VlIHRhYmxlIGJlbG93IGZvciBkZXRhaWxlZCB1c2FnZQotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVtb3RlZGlyPC90ZD4KKyAgICA8dGQ+cmVtb3RlIGRpcmVjdG9yeSBvbiB0aGUgRlRQIHNlcnZlciBzZWUgdGFibGUgYmVsb3cgZm9yIGRldGFpbGVkIHVzYWdlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZ0cCBhY3Rpb24gdG8gcGVyZm9ybSwgZGVmYXVsdGluZyB0byAic2VuZCIuCi0gICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgInB1dCIsICJnZXQiLAotICAgICAgICAgICAgICAgICAgICAgImRlbCIsICJsaXN0IiwgImNobW9kIiwKLSAgICAgICAgICAgICAgICAgICAgICJta2RpciIsICJybWRpciIsIGFuZCAic2l0ZSIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YWN0aW9uPC90ZD4KKyAgICA8dGQ+RlRQIGFjdGlvbiB0byBwZXJmb3JtLiAgQ3VycmVudGx5CisgICAgc3VwcG9ydHMgPHE+cHV0PC9xPiwgPHE+Z2V0PC9xPiwgPHE+ZGVsPC9xPiwgPHE+bGlzdDwvcT4sIDxxPmNobW9kPC9xPiwgPHE+bWtkaXI8L3E+LCA8cT5ybWRpcjwvcT4sCisgICAgYW5kIDxxPnNpdGU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5zZW5kPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJpbmFyeTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZWxlY3RzIGJpbmFyeS1tb2RlICgieWVzIikgb3IgdGV4dC1tb2RlCi0gICAgICAgICAgICAgICAgICAgICAoIm5vIikgdHJhbnNmZXJzLgotICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gInllcyI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5iaW5hcnk8L3RkPgorICAgIDx0ZD5zZWxlY3RzIGJpbmFyeS1tb2RlICg8cT55ZXM8L3E+KSBvciB0ZXh0LW1vZGUgKDxxPm5vPC9xPikgdHJhbnNmZXJzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc2l2ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZWxlY3RzIHBhc3NpdmUtbW9kZSAoInllcyIpIHRyYW5zZmVycywgZm9yCi0gICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgdGhyb3VnaC1maXJld2FsbCBjb25uZWN0aXZpdHksIGF0IHRoZSBwcmljZQotICAgICAgICAgICAgICAgICAgICAgb2YgcGVyZm9ybWFuY2UuCi0gICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAibm8iPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cGFzc2l2ZTwvdGQ+CisgICAgPHRkPnNlbGVjdHMgcGFzc2l2ZS1tb2RlICg8cT55ZXM8L3E+KSB0cmFuc2ZlcnMsIGZvciBiZXR0ZXIgdGhyb3VnaC1maXJld2FsbCBjb25uZWN0aXZpdHksIGF0CisgICAgICB0aGUgcHJpY2Ugb2YgcGVyZm9ybWFuY2UuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlzcGxheXMgaW5mb3JtYXRpb24gb24gZWFjaCBmaWxlIHRyYW5zZmVycmVkIGlmIHNldCAKLSAgICAgICAgICAgICAgICAgICAgIHRvICJ5ZXMiLiBEZWZhdWx0cyB0byAibm8iLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5kaXNwbGF5cyBpbmZvcm1hdGlvbiBvbiBlYWNoIGZpbGUgdHJhbnNmZXJyZWQgaWYgc2V0IHRvIDxxPnllczwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJhbnNmZXJzIG9ubHkgbmV3IG9yIGNoYW5nZWQgZmlsZXMgaWYgc2V0IHRvIAotICAgICAgICAgICAgICAgICAgICAgInllcyIuIERlZmF1bHRzIHRvICJubyIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVwZW5kczwvdGQ+CisgICAgPHRkPnRyYW5zZmVycyBvbmx5IG5ldyBvciBjaGFuZ2VkIGZpbGVzIGlmIHNldCB0byA8cT55ZXM8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uZXdlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hIHN5bm9ueW0gZm9yIDxpPmRlcGVuZHM8L2k+LgotICAgIHNlZSB0aW1lZGlmZmF1dG8gYW5kIHRpbWVkaWZmbWlsbGlzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bmV3ZXI8L3RkPgorICAgIDx0ZD5hIHN5bm9ueW0gZm9yIDx2YXI+ZGVwZW5kczwvdmFyPi4gIFNlZSA8dmFyPnRpbWVkaWZmYXV0bzwvdmFyPgorICAgICAgICBhbmQgPHZhcj50aW1lZGlmZm1pbGxpczwvdmFyPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZWRpZmZhdXRvPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNldCB0byA8Y29kZT4idHJ1ZSI8L2NvZGU+Ci0gICAgdG8gbWFrZSBhbnQgY2FsY3VsYXRlIHRoZSB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlci48YnI+Ci0gICAgPGVtPnJlcXVpcmVzIHdyaXRlIGFjY2VzcyBpbiB0aGUgcmVtb3RlIGRpcmVjdG9yeTwvZW0+PGJyPgotICAgIFNpbmNlIGFudCAxLjY8YnIvPgorICAgIDx0ZD50aW1lZGlmZmF1dG88L3RkPgorICAgIDx0ZD5zZXQgdG8gPHE+dHJ1ZTwvcT4gdG8gbWFrZSBBbnQgY2FsY3VsYXRlIHRoZSB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiBjbGllbnQgYW5kCisgICAgc2VydmVyLjxici8+PGVtPnJlcXVpcmVzIHdyaXRlIGFjY2VzcyBpbiB0aGUgcmVtb3RlIGRpcmVjdG9yeTwvZW0+PGJyLz48ZW0+U2luY2UgQW50CisgICAgMS42PC9lbT48YnIvPgogICAgIElmIHRoaXMgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gQW50IHdpbGwgY3JlYXRlIGFuIGVtcHR5CiAgICAgZmlsZSBpbnNpZGUgb2YgdGhlIDxhIGhyZWY9Ii4uL3J1bm5pbmcuaHRtbCN0bXBkaXIiPnRlbXBvcmFyeQogICAgIGRpcmVjdG9yeTwvYT4gYW5kIHRyYW5zZmVyIGl0IHRvIHRoZSByZW1vdGUgc2VydmVyIC0gZGVsZXRpbmcgaXQgb24KICAgICBib3RoIHNpZGVzIG9uY2UgdGhlIGRpZmZlcmVuY2UgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDxhIG5hbWU9InRpbWVzdGFtcEdyYW51bGFyaXR5Ii8+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVzdGFtcEdyYW51bGFyaXR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgZWl0aGVyIDxjb2RlPk1JTlVURTwvY29kZT4sIDxjb2RlPk5PTkU8L2NvZGU+LAotICAgICAob3IgeW91IG1heSBzcGVjaWZ5IDxjb2RlPiIiPC9jb2RlPiB3aGljaCBpcyBlcXVpdmFsZW50IHRvIG5vdCBzcGVjaWZ5aW5nIGEgdmFsdWUsCi0gICAgIHVzZWZ1bCBmb3IgcHJvcGVydHktZmlsZSBkcml2ZW4gc2NyaXB0cykuICBBbGxvd3Mgb3ZlcnJpZGUgb2YgdGhlIHR5cGljYWwgc2l0dWF0aW9uIAotICAgICBpbiBQVVQgYW5kIEdFVCB3aGVyZSBsb2NhbCBmaWxlc3lzdGVtIHRpbWVzdGFtcHMgYXJlIDxjb2RlPkhIOm1tOnNzPC9jb2RlPiAKLSAgICAgYW5kIHRoZSB0eXBpY2FsIEZUUCBzZXJ2ZXIncyB0aW1lc3RhbXBzIGFyZSA8Y29kZT5ISDptbTwvY29kZT4uICBUaGlzIGNhbiB0aHJvdyAKLSAgICAgb2ZmIHVwdG9kYXRlIGNhbGN1bGF0aW9ucy4gIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQgc3VmZmljZSBmb3IgbW9zdAotICAgICBhcHBsaWNhdGlvbnMuPGJyPgotICAgIFNpbmNlIGFudCAxLjcKLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uICBPbmx5IGFwcGxpZXMgaW4gInB1dHMiIGFuZCAiZ2V0cyIgd2hlcmUgdGhlCi0gICAgZGVmYXVsdCB2YWx1ZXMgYXJlIDxjb2RlPk1JTlVURTwvY29kZT4gZm9yIFBVVCBhbmQgPGNvZGU+Tk9ORTwvY29kZT4gZm9yIEdFVC4gIAotICAgIChJdCBpcyBub3QgYXMgbmVjZXNzYXJ5IGluIEdFVCBiZWNhdXNlIHdlIGhhdmUgdGhlIDxiPnByZXNlcnZlbGFzdG1vZGlmaWVkPC9iPiBvcHRpb24uKTwvdGQ+CisgIDx0ciBpZD0idGltZXN0YW1wR3JhbnVsYXJpdHkiPgorICAgIDx0ZD50aW1lc3RhbXBHcmFudWxhcml0eTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgZWl0aGVyIDxxPk1JTlVURTwvcT4gb3IgPHE+Tk9ORTwvcT4gKHlvdSBtYXkgc3BlY2lmeSA8cT48L3E+IHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgIG5vdCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHVzZWZ1bCBmb3IgcHJvcGVydHktZmlsZSBkcml2ZW4gc2NyaXB0cykuICBBbGxvd3Mgb3ZlcnJpZGUgb2YgdGhlCisgICAgICB0eXBpY2FsIHNpdHVhdGlvbiBpbiA8cT5wdXQ8L3E+IGFuZCA8cT5nZXQ8L3E+IHdoZXJlIGxvY2FsIGZpbGVzeXN0ZW0gdGltZXN0YW1wcworICAgICAgYXJlIDxjb2RlPkhIOm1tOnNzPC9jb2RlPiBhbmQgdGhlIHR5cGljYWwgRlRQIHNlcnZlcidzIHRpbWVzdGFtcHMgYXJlIDxjb2RlPkhIOm1tPC9jb2RlPi4KKyAgICAgIFRoaXMgY2FuIHRocm93IG9mZiA8dmFyPnVwdG9kYXRlPC92YXI+IGNhbGN1bGF0aW9ucy4gIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQKKyAgICAgIHN1ZmZpY2UgZm9yIG1vc3QgYXBwbGljYXRpb25zLjxici8+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBvbmx5IGFwcGxpZXMgZm9yIDxxPnB1dDwvcT4gKGRlZmF1bHQgaXMgPHE+TUlOVVRFPC9xPikgYW5kIDxxPmdldDwvcT4gKGRlZmF1bHQKKyAgICAgIGlzIDxxPk5PTkU8L3E+OyBub3QgYXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgaGF2ZSB0aGUgPHZhcj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdmFyPgorICAgICAgb3B0aW9uKTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVkaWZmbWlsbGlzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlcHJlY2F0ZWQ8L2I+LiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGFkZCB0byB0aGUgdGltZSBvbiAKLSAgICB0aGUgcmVtb3RlIG1hY2hpbmUgdG8gZ2V0IHRoZSB0aW1lIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgVGhlIDxiPnRpbWVzdGFtcEdyYW51bGFyaXR5PC9iPiAKLSAgICBhdHRyaWJ1dGUgKGZvciB3aGljaCB0aGUgZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIHN1ZmZpY2UgaW4gbW9zdCBzaXR1YXRpb25zKSwgYW5kIHRoZSAKLSAgICA8Yj5zZXJ2ZXJUaW1lWm9uZUNvbmZpZzwvYj4gb3B0aW9uLCBzaG91bGQgbWFrZSB0aGlzIHVubmVjZXNzYXJ5LiAKLSAgICA8Yj5zZXJ2ZXJUaW1lWm9uZUNvbmZpZzwvYj4gZG9lcyB0aGUgbWF0aCBmb3IgeW91IGFuZCBhbHNvIGtub3dzIGFib3V0IAotICAgIERheWxpZ2h0IFNhdmluZ3MgVGltZS48YnI+Ci0gICAgU2luY2UgYW50IDEuNgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRpbWVkaWZmbWlsbGlzPC90ZD4KKyAgICA8dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gYWRkIHRvIHRoZSB0aW1lIG9uIHRoZSByZW1vdGUgbWFjaGluZQorICAgICAgdG8gZ2V0IHRoZSB0aW1lIG9uIHRoZSBsb2NhbCBtYWNoaW5lLiAgVGhlIDx2YXI+dGltZXN0YW1wR3JhbnVsYXJpdHk8L3Zhcj4gYXR0cmlidXRlIChmb3IKKyAgICAgIHdoaWNoIHRoZSBkZWZhdWx0IHZhbHVlcyBzaG91bGQgc3VmZmljZSBpbiBtb3N0IHNpdHVhdGlvbnMpLCBhbmQKKyAgICAgIHRoZSA8dmFyPnNlcnZlclRpbWVab25lQ29uZmlnPC92YXI+IG9wdGlvbiwgc2hvdWxkIG1ha2UgdGhpcworICAgICAgdW5uZWNlc3NhcnkuICA8dmFyPnNlcnZlclRpbWVab25lQ29uZmlnPC92YXI+IGRvZXMgdGhlIG1hdGggZm9yIHlvdSBhbmQgYWxzbyBrbm93cyBhYm91dAorICAgICAgRGF5bGlnaHQgU2F2aW5ncyBUaW1lLjxici8+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VwYXJhdG9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNldHMgdGhlIGZpbGUgc2VwYXJhdG9yIHVzZWQgb24gdGhlIGZ0cCBzZXJ2ZXIuCi0gICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAiLyIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2VwYXJhdG9yPC90ZD4KKyAgICA8dGQ+c2V0cyB0aGUgZmlsZSBzZXBhcmF0b3IgdXNlZCBvbiB0aGUgRlRQIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+LzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bWFzazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXRzIHRoZSBkZWZhdWx0IGZpbGUgcGVybWlzc2lvbnMgZm9yIG5ldyBmaWxlcywKLSAgICAgICAgICAgICAgICAgICAgIHVuaXggb25seS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51bWFzazwvdGQ+CisgICAgPHRkPnNldHMgdGhlIGRlZmF1bHQgZmlsZSBwZXJtaXNzaW9ucyBmb3IgbmV3IGZpbGVzLCBVbml4IG9ubHkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jaG1vZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXRzIG9yIGNoYW5nZXMgZmlsZSBwZXJtaXNzaW9ucyBmb3IgbmV3IG9yIGV4aXN0aW5nIGZpbGVzLAotICAgICAgdW5peCBvbmx5LiBJZiB1c2VkIHdpdGggYSBwdXQgYWN0aW9uLCBjaG1vZCB3aWxsIGJlIGlzc3VlZCBmb3IgZWFjaCBmaWxlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNobW9kPC90ZD4KKyAgICA8dGQ+c2V0cyBvciBjaGFuZ2VzIGZpbGUgcGVybWlzc2lvbnMgZm9yIG5ldyBvciBleGlzdGluZyBmaWxlcywgVW5peCBvbmx5LiBJZiB1c2VkIHdpdGgKKyAgICAgIGEgPHE+cHV0PC9xPiBhY3Rpb24sIDxxPmNobW9kPC9xPiB3aWxsIGJlIGlzc3VlZCBmb3IgZWFjaCBmaWxlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGlzdGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byB3cml0ZSByZXN1bHRzIG9mIHRoZSAibGlzdCIgYWN0aW9uLgotICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgZm9yIHRoZSAibGlzdCIgYWN0aW9uLCBpZ25vcmVkIG90aGVyd2lzZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5saXN0aW5nPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdG8gd3JpdGUgcmVzdWx0cyBvZiB0aGUgPHE+bGlzdDwvcT4gYWN0aW9uLjwvdGQ+CisgICAgPHRkPlllcywgZm9yIHRoZSA8cT5saXN0PC9xPiBhY3Rpb247IGlnbm9yZWQgb3RoZXJ3aXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlTm9uY3JpdGljYWxFcnJvcnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB3aGljaCBwZXJtaXRzIHRoZSB0YXNrIHRvIGlnbm9yZSBzb21lIG5vbi1mYXRhbCBlcnJvcgotICAgICAgY29kZXMgc2VudCBieSBzb21lIHNlcnZlcnMgZHVyaW5nIGRpcmVjdG9yeSBjcmVhdGlvbjogd3UtZnRwIGluIHBhcnRpY3VsYXIuCi0gICAgICBEZWZhdWx0OiBmYWxzZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzPC90ZD4KKyAgICA8dGQ+ZmxhZyB3aGljaCBwZXJtaXRzIHRoZSB0YXNrIHRvIGlnbm9yZSBzb21lIG5vbi1mYXRhbCBlcnJvciBjb2RlcyBzZW50IGJ5IHNvbWUgc2VydmVycyBkdXJpbmcKKyAgICAgIGRpcmVjdG9yeSBjcmVhdGlvbjogd3UtZnRwIGluIHBhcnRpY3VsYXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNraXBGYWlsZWRUcmFuc2ZlcnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB3aGljaCBlbmFibGVzIHVuc3VjY2Vzc2Z1bCBmaWxlIHB1dCwgZGVsZXRlCi0gICAgYW5kIGdldCBvcGVyYXRpb25zIHRvIGJlIHNraXBwZWQgd2l0aCBhIHdhcm5pbmcgYW5kIHRoZQotICAgIHJlbWFpbmRlciBvZiB0aGUgZmlsZXMgc3RpbGwgdHJhbnNmZXJyZWQuIERlZmF1bHQ6IGZhbHNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgPC90cj4gIAotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5HaXZlIHRoZSBjb3BpZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZAotICAgICAgdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzIChhcHBsaWVzIHRvIGdldHRpbmcgZmlsZXMgb25seSkuCi0gICAgICAoPGVtPk5vdGU8L2VtPjogSWdub3JlZCBvbiBKYXZhIDEuMSk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkPnNraXBGYWlsZWRUcmFuc2ZlcnM8L3RkPgorICAgIDx0ZD5mbGFnIHdoaWNoIGVuYWJsZXMgdW5zdWNjZXNzZnVsIGZpbGUgPHE+cHV0PC9xPiwgPHE+ZGVsZXRlPC9xPiBhbmQgPHE+Z2V0PC9xPiBvcGVyYXRpb25zIHRvCisgICAgICBiZSBza2lwcGVkIHdpdGggYSB3YXJuaW5nIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBmaWxlcyBzdGlsbCB0cmFuc2ZlcnJlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXRyaWVzQWxsb3dlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdGhlIG51bWJlciBvZiByZXRyaWVzIGFsbG93ZWQgb24gYW4gZmlsZS10cmFuc2ZlciBvcGVyYXRpb24uCi0gICAgSWYgYSBudW1iZXIgPiAwIHNwZWNpZmllZCwgZWFjaCBmaWxlIHRyYW5zZmVyIGNhbiBmYWlsIHVwIHRvIHRoYXQKLSAgICBtYW55IHRpbWVzIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGlzIGZhaWxlZC4gIElmIC0xIG9yICJmb3JldmVyIiBzcGVjaWZpZWQsIHRoZQotICAgIG9wZXJhdGlvbiB3aWxsIGtlZXAgdHJ5aW5nIHVudGlsIGl0IHN1Y2NlZWRzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gMDwvdGQ+CisgICAgPHRkPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KKyAgICA8dGQ+R2l2ZSB0aGUgY29waWVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzIChhcHBsaWVzIHRvCisgICAgICBnZXR0aW5nIGZpbGVzIG9ubHkpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zaXRlQ29tbWFuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXQgdGhlIHNlcnZlci1zcGVjaWZpYyBTSVRFIGNvbW1hbmQgdG8gZXhlY3V0ZSBpZgotICAgIHRoZSA8Y29kZT5hY3Rpb248L2NvZGU+IGF0dHJpYnV0ZSBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgPGNvZGU+InNpdGUiPC9jb2RlPi4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmV0cmllc0FsbG93ZWQ8L3RkPgorICAgIDx0ZD5TZXQgdGhlIG51bWJlciBvZiByZXRyaWVzIGFsbG93ZWQgb24gYW4gZmlsZS10cmFuc2ZlciBvcGVyYXRpb24uICBJZiBhIHBvc2l0aXZlIG51bWJlciBpcworICAgICAgc3BlY2lmaWVkLCBlYWNoIGZpbGUgdHJhbnNmZXIgY2FuIGZhaWwgdXAgdG8gdGhhdCBtYW55IHRpbWVzIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGlzIGZhaWxlZC4KKyAgICAgIElmIDxxPi0xPC9xPiBvciA8cT5mb3JldmVyPC9xPiBzcGVjaWZpZWQsIHRoZSBvcGVyYXRpb24gd2lsbCBrZWVwIHRyeWluZyB1bnRpbCBpdAorICAgICAgc3VjY2VlZHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5pdGlhbFNpdGVDb21tYW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldCBhIHNlcnZlci1zcGVjaWZpYyBTSVRFIGNvbW1hbmQgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseQotICAgICAgYWZ0ZXIgbG9naW4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2l0ZUNvbW1hbmQ8L3RkPgorICAgIDx0ZD5TZXQgdGhlIHNlcnZlci1zcGVjaWZpYyA8Y29kZT5TSVRFPC9jb2RlPiBjb21tYW5kIHRvIGV4ZWN1dGUgaWYgdGhlIDx2YXI+YWN0aW9uPC92YXI+CisgICAgICBhdHRyaWJ1dGUgaGFzIGJlZW4gc3BlY2lmaWVkIGFzIDxxPnNpdGU8L3E+LgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZVJlbW90ZVZlcmlmaWNhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGRhdGEgY29ubmVjdGlvbiBzaG91bGQgYmUgdmVyaWZpZWQgdG8KLSAgICBjb25uZWN0IHRvIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gIFRoaXMgaXMgYQotICAgIHNlY3VyaXR5IG1lYXN1cmUgdGhhdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBpdCBtYXkgYmUgdXNlZnVsCi0gICAgdG8gZGlzYWJsZSBpdCBpbiBjZXJ0YWluIGZpcmV3YWxsIHNjZW5hcmlvcy4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyB0cnVlPC90ZD4KLSAgPC90cj4KLQotICAgIDx0cj4KLSAgICA8dGQgY29sc3Bhbj0iMyI+Ci0gICAgPHA+PGI+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIHJlcXVpcmUgPGEgaHJlZj0KLSAgICAiaHR0cDovL2NvbW1vbnMuYXBhY2hlLm9yZy9uZXQvZG93bmxvYWRfbmV0LmNnaSI+Ci0gICAgamFrYXJ0YS1jb21tb25zLW5ldC0xLjQuMCBvciBncmVhdGVyPC9hPi48L2I+PC9wPgotICAgIDxwPgotICAgIFVzZSB0aGVzZSBvcHRpb25zIHdoZW4gdGhlIHN0YW5kYXJkIG9wdGlvbnMgZG9uJ3Qgd29yaywgYmVjYXVzZQotICAgIDx1bD48bGk+dGhlIHNlcnZlciBpcyBpbiBhIGRpZmZlcmVudCB0aW1lem9uZSBhbmQgeW91IG5lZWQgdGltZXN0YW1wCi0gICAgZGVwZW5kZW5jeSBjaGVja2luZzwvbGk+Ci0gICAgPGxpPnRoZSBkZWZhdWx0IHRpbWVzdGFtcCBmb3JtYXR0aW5nIGRvZXNuJ3QgbWF0Y2ggdGhlIHNlcnZlciBkaXNwbGF5IGFuZAotICAgIGxpc3QgcGFyc2luZyB0aGVyZWZvcmUgZmFpbHM8L2xpPjwvdWw+Ci0gICAgPC9wPjxwPgotICAgIElmIG5vbmUgb2YgdGhlc2UgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBtZWNoYW5pc20gb2YgbGV0dGluZyB0aGUgc3lzdGVtCi0gICAgYXV0by1kZXRlY3QgdGhlIHNlcnZlciBPUyB0eXBlIGJhc2VkIG9uIHRoZSBGVFAgU1lTVCBjb21tYW5kIGFuZCBhc3N1bWluZwotICAgIHN0YW5kYXJkIGZvcm1hdHRpbmcgZm9yIHRoYXQgT1MgdHlwZSB3aWxsIGJlIHVzZWQuCi0gICAgPC9wPjxwPgotICAgIFRvIGFpZCBpbiBwcm9wZXJ0eS1maWxlLWJhc2VkIGRldmVsb3BtZW50IHdoZXJlIGEgYnVpbGQgc2NyaXB0IGlzIGNvbmZpZ3VyZWQKLSAgICB3aXRoIHByb3BlcnR5IGZpbGVzLCBmb3IgYW55IG9mIHRoZXNlIGF0dHJpYnV0ZXMsIGEgdmFsdWUgb2YgPGNvZGU+IiI8L2NvZGU+Ci0gICAgaXMgZXF1aXZhbGVudCB0byBub3Qgc3BlY2lmeWluZyBpdC4KLSAgICA8L3A+PHA+Ci0gICAgUGxlYXNlIHVuZGVyc3RhbmQgdGhhdCB0aGVzZSBvcHRpb25zIGFyZSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYXV0b2RldGVjdGlvbgotICAgIHNjaGVtZS4gIElmIGFueSBvZiB0aGVzZSBvcHRpb25zIGlzIHNwZWNpZmllZCwgKG90aGVyIHRoYW4gd2l0aCBhIHZhbHVlIG9mCi0gICAgPGNvZGU+IiI8L2NvZGU+ICkgYSBzeXN0ZW0gdHlwZSBtdXN0IGJlIGNob3NlbiBhbmQgaWYgc3lzdGVtVHlwZUtleSBpcyBub3QKLSAgICBzcGVjaWZpZWQsIFVOSVggd2lsbCBiZSBhc3N1bWVkLiBUaGUgcGhpbG9zb3BoeSBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZXNlCi0gICAgb3B0aW9ucyBhcmUgZm9yIHNldHRpbmcgbm9uLXN0YW5kYXJkIGZvcm1hdHMsIGFuZCBhIGJ1aWxkLXNjcmlwdCBhdXRob3Igd2hvCi0gICAga25vd3Mgd2hhdCBzeXN0ZW0gaGUgaXMgZGVhbGluZyB3aXRoIHdpbGwga25vdyB3aGF0IG9wdGlvbnMgdG8gbmVlZCB0byBiZQotICAgIHNldC4gT3RoZXJ3aXNlLCB0aGVzZSBvcHRpb25zIHNob3VsZCBiZSBsZWZ0IGFsb25lIGFuZCB0aGUgZGVmYXVsdAotICAgIGF1dG9kZXRlY3Rpb24gc2NoZW1lIGNhbiBiZSB1c2VkIGFuZCB3aWxsIHdvcmsgaW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzLgotICAgIDwvcD48L3RkPgotICAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN5c3RlbVR5cGVLZXk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIHN5c3RlbSBpbiB1c2Ugb24gdGhlIHNlcnZlci4KLSAgICAgIFN1cHBvcnRlZCB2YWx1ZXMgYXJlIDxjb2RlPiJVTklYIiwgIlZNUyIsICJXSU5ET1dTIiwgIk9TLzIiLCAiT1MvNDAwIiwKLSAgICAgICJNVlMiLjwvY29kZT4gIElmIG5vdCBzcGVjaWZpZWQsIChvciBzcGVjaWZpZWQgYXMgPGNvZGU+IiI8L2NvZGU+KSBhbmQgaWYKLSAgICAgIG5vIG90aGVyIHh4eENvbmZpZyBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWQsIHRoZSBhdXRvZGV0ZWN0aW9uIG1lY2hhbmlzbQotICAgICAgYmFzZWQgb24gdGhlIEZUUCBTWVNUIGNvbW1hbmQgd2lsbCBiZSB1c2VkLjxicj4KLSAgICAgIFNpbmNlIGFudCAxLjcKLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGJ1dCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyB4eHhDb25maWcKLSAgICAgICAgYXR0cmlidXRlcyBpcyBzcGVjaWZpZWQsIFVOSVggd2lsbCBiZSBhc3N1bWVkLCBldmVuIGlmIDxjb2RlPiIiPC9jb2RlPgotICAgICAgICBpcyBzcGVjaWZpZWQgaGVyZS4KLSAgICA8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNlcnZlclRpbWVab25lQ29uZmlnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgYXMgYSBKYXZhCi0gICAgIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvL2phdmEvdXRpbC9UaW1lWm9uZS5odG1sIj4KLSAgICAgVGltZVpvbmU8L2E+IGlkZW50aWZpZXIsIChlLmcuIDxjb2RlPkdNVDwvY29kZT4sIDxjb2RlPkFtZXJpY2EvQ2hpY2FnbzwvY29kZT4gb3IKLSAgICA8Y29kZT5Bc2lhL0pha2FydGE8L2NvZGU+KSB0aGUgdGltZXpvbmUgdXNlZCBieSB0aGUgc2VydmVyIGZvciB0aW1lc3RhbXBzLiAgVGhpcyAKLSAgICAgIGVuYWJsZXMgdGltZXN0YW1wIGRlcGVuZGVuY3kgY2hlY2tpbmcgZXZlbiB3aGVuIHRoZSBzZXJ2ZXIgaXMgaW4gYSBkaWZmZXJlbnQgCi0gICAgICB0aW1lIHpvbmUgZnJvbSB0aGUgY2xpZW50LiBUaW1lIFpvbmVzIGtub3csIGFsc28sIGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSwgCi0gICAgICBhbmQgZG8gbm90IHJlcXVpcmUgeW91IHRvIGNhbGN1bGF0ZSBtaWxsaXNlY29uZHMgb2YgZGlmZmVyZW5jZS4gIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgKG9yIHNwZWNpZmllZCBhcyA8Y29kZT4iIjwvY29kZT4pLCB0aGUgdGltZSB6b25lIG9mIHRoZSBjbGllbnQgaXMgYXNzdW1lZC48YnI+Ci0gICAgICBTaW5jZSBhbnQgMS43Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5pdGlhbFNpdGVDb21tYW5kPC90ZD4KKyAgICA8dGQ+U2V0IGEgc2VydmVyLXNwZWNpZmljIDxjb2RlPlNJVEU8L2NvZGU+IGNvbW1hbmQgdG8gZXhlY3V0ZSBpbW1lZGlhdGVseSBhZnRlciBsb2dpbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgaW4gSmF2YSAKLSAgICA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0Lmh0bWwiPgotICAgICBTaW1wbGVEYXRlRm9ybWF0PC9hPiBub3RhdGlvbiwgKGUuZy4KLSAgICAgPGNvZGU+eXl5eS1NTS1kZDwvY29kZT4pLCB0aGUgZGF0ZSBmb3JtYXQgZ2VuZXJhbGx5IHVzZWQgYnkgdGhlIEZUUCBzZXJ2ZXIKLSAgICAgIHRvIHBhcnNlIGRhdGVzLiAgSW4gc29tZSBjYXNlcyB0aGlzIHdpbGwgYmUgdGhlIG9ubHkgZGF0ZSBmb3JtYXQgdXNlZC4KLSAgICAgIEluIG90aGVycywgKHVuaXggZm9yIGV4YW1wbGUpIHRoaXMgd2lsbCBiZSB1c2VkIGZvciBkYXRlcwotICAgICAgb2xkZXIgdGhhbiBhIHllYXIgb2xkLiAoU2VlIDxiPnJlY2VudERhdGVGb3JtYXRDb25maWc8L2I+KS4gIElmIG5vdCBzcGVjaWZpZWQsCi0gICAgICAob3Igc3BlY2lmaWVkIGFzIDxjb2RlPiIiPC9jb2RlPiksIHRoZSBkZWZhdWx0IGRhdGUgZm9ybWF0IGZvciB0aGUgc3lzdGVtCi0gICAgICB0eXBlIGluZGljYXRlZCBieSB0aGUgPGI+c3lzdGVtVHlwZUtleTwvYj4gYXR0cmlidXRlIHdpbGwgYmUgdXNlZC48YnI+Ci0gICAgICBTaW5jZSBhbnQgMS43Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPgotICAgIE5vLgotICAgIDwvdGQ+CisgICAgPHRkPmVuYWJsZVJlbW90ZVZlcmlmaWNhdGlvbjwvdGQ+CisgICAgPHRkPldoZXRoZXIgZGF0YSBjb25uZWN0aW9uIHNob3VsZCBiZSB2ZXJpZmllZCB0byBjb25uZWN0IHRvIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGNvbnRyb2wKKyAgICAgIGNvbm5lY3Rpb24uICBUaGlzIGlzIGEgc2VjdXJpdHkgbWVhc3VyZSB0aGF0IGlzIGVuYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGl0IG1heSBiZSB1c2VmdWwgdG8KKyAgICAgIGRpc2FibGUgaXQgaW4gY2VydGFpbiBmaXJld2FsbCBzY2VuYXJpb3MuICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlY2VudERhdGVGb3JtYXRDb25maWc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBpbiBKYXZhIAotICAgIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbCI+Ci0gICAgIFNpbXBsZURhdGVGb3JtYXQ8L2E+IG5vdGF0aW9uLAotICAgICAgKGUuZy4gPGNvZGU+TU1NIGRkIGhoOm1tPC9jb2RlPikgdGhlIGRhdGUgZm9ybWF0IHVzZWQgYnkgdGhlIEZUUCBzZXJ2ZXIKLSAgICAgIHRvIHBhcnNlIGRhdGVzIGxlc3MgdGhhbiBhIHllYXIgb2xkLiAgSWYgbm90IHNwZWNpZmllZCAob3Igc3BlY2lmaWVkIGFzCi0gICAgICA8Y29kZT4iIjwvY29kZT4pLCBhbmQgaWYgdGhlIHN5c3RlbSB0eXBlIGluZGljYXRlZCBieSB0aGUgc3lzdGVtIGtleSB1c2VzCi0gICAgICBhIHJlY2VudCBkYXRlIGZvcm1hdCwgaXRzIHN0YW5kYXJkIGZvcm1hdCB3aWxsIGJlIHVzZWQuPGJyPgotICAgICAgU2luY2UgYW50IDEuNwotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRhdGFUaW1lb3V0PC90ZD4KKyAgICA8dGQ+U2V0cyBhIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHVzZWQgd2hlbiB3YWl0aW5nIGZvciBkYXRhIG9uIHRoZSBkYXRhIGNvbm5lY3Rpb24uCisgICAgICBBIHZhbHVlIG9mIDAgbWVhbnMgYW4gaW5maW5pdGUgdGltZW91dC48ZW0+c2luY2UgQW50IDEuMTAuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSA8YSBocmVmPSJodHRwOi8vd3d3Lmljcy51Y2kuZWR1L3B1Yi9pZXRmL2h0dHAvcmVsYXRlZC9pc282MzkudHh0Ij4KLSAgICAgIHR3by1sZXR0ZXIgSVNPLTYzOSBsYW5ndWFnZSBjb2RlPC9hPiB1c2VkIHRvIHNwZWNpZnkgdGhlCi0gICAgICBsYW5ndWFnZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgdG8gZm9ybWF0IG1vbnRoIG5hbWVzLiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlCi0gICAgICBzcGVjaWZpZWQgd2hlbiB0aGUgc2VydmVyIHVzZXMgbm9uLW51bWVyaWMgYWJicmV2aWF0aW9ucyBmb3IgbW9udGhzIGluIGl0cwotICAgICAgZGF0ZSBsaXN0aW5ncyBpbiBhIGxhbmd1YWdlIG90aGVyIHRoYW4gRW5nbGlzaC4gIFRoaXMgYXBwZWFycyB0byBiZQotICAgICAgYmVjb21pbmcgcmFyZXIgYW5kIHJhcmVyLCBhcyBjb21tb25seSBkaXN0cmlidXRlZCBmdHAgc2VydmVycyBzZWVtCi0gICAgICBpbmNyZWFzaW5nbHkgdG8gdXNlIEVuZ2xpc2ggb3IgYWxsLW51bWVyaWMgZm9ybWF0cy4KLSAgICAgIExhbmd1YWdlcyBzdXBwb3J0ZWQgYXJlOgorICAgIDx0ZD53YWtlVXBUcmFuc2ZlckludGVydmFsPC90ZD4KKyAgICA8dGQ+T25seSB1c2UgaWYgcHJvdmVkIHRvIGJlIG5lY2Vzc2FyeSwgaW50ZXJ2YWwgaW4gc2Vjb25kcyBvbiB3aGljaCBhIExJU1QgY29tbWFuZCBpcyB0cmlnZ2VyZWQKKyAgICAgIHRyaWdnZXIgYSBkYXRhIGNvbm5lY3Rpb24gKHRvIGF2b2lkIHRpbWVvdXRzIGJ5IHRoZSBmdHAgc2VydmVyIG9uIG5vIGRhdGEgY29ubmVjdGlvbikuCisgICAgICA8ZW0+c2luY2UgQW50IDEuMTAuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJsZWZ0Ij4KKyAgICAgIDxwPjxzdHJvbmc+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzCisgICAgICByZXF1aXJlIDxhIGhyZWY9Imh0dHBzOi8vY29tbW9ucy5hcGFjaGUub3JnL25ldC9kb3dubG9hZF9uZXQuY2dpIgorICAgICAgdGFyZ2V0PSJfdG9wIj5qYWthcnRhLWNvbW1vbnMtbmV0LTEuNC4wIG9yIGdyZWF0ZXI8L2E+Ljwvc3Ryb25nPjwvcD4KKyAgICAgIDxwPlVzZSB0aGVzZSBvcHRpb25zIHdoZW4gdGhlIHN0YW5kYXJkIG9wdGlvbnMgZG9uJ3Qgd29yaywgYmVjYXVzZTwvcD4KICAgICAgIDx1bD4KLSAgICAgIAk8bGk+ZW4gLSBFbmdsaXNoPC9saT4KLSAgICAgIAk8bGk+ZnIgLSBGcmVuY2g8L2xpPgotICAgICAgCTxsaT5kZSAtIEdlcm1hbjwvbGk+Ci0gICAgICAJPGxpPml0IC0gSXRhbGlhbjwvbGk+Ci0gICAgICAJPGxpPmVzIC0gU3BhbmlzaDwvbGk+Ci0gICAgICAJPGxpPnB0IC0gUG9ydHVndWVzZTwvbGk+Ci0gICAgICAJPGxpPmRhIC0gRGFuaXNoPC9saT4KLSAgICAgIAk8bGk+c3YgLSBTd2VkaXNoPC9saT4KLSAgICAgIAk8bGk+bm8gLSBOb3J3ZWdpYW48L2xpPgotICAgICAgCTxsaT5ubCAtIER1dGNoPC9saT4KLSAgICAgIAk8bGk+cm8gLSBSb21hbmlhbjwvbGk+Ci0gICAgICAJPGxpPnNxIC0gQWxiYW5pYW48L2xpPgotICAgICAgCTxsaT5zaCAtIFNlcmJvLWNyb2F0aWFuPC9saT4KLSAgICAgIAk8bGk+c2sgLSBTbG92YWs8L2xpPgotICAgICAgCTxsaT5zbCAtIFNsb3ZlbmlhbjwvbGk+CisgICAgICAgIDxsaT50aGUgc2VydmVyIGlzIGluIGEgZGlmZmVyZW50IHRpbWV6b25lIGFuZCB5b3UgbmVlZCB0aW1lc3RhbXAgZGVwZW5kZW5jeSBjaGVja2luZzwvbGk+CisgICAgICAgIDxsaT50aGUgZGVmYXVsdCB0aW1lc3RhbXAgZm9ybWF0dGluZyBkb2Vzbid0IG1hdGNoIHRoZSBzZXJ2ZXIgZGlzcGxheSBhbmQgbGlzdCBwYXJzaW5nCisgICAgICAgICAgdGhlcmVmb3JlIGZhaWxzPC9saT4KICAgICAgIDwvdWw+Ci0gICAgICBJZiB5b3UgcmVxdWlyZSBhIGxhbmd1YWdlIG90aGVyIHRoYW4gdGhlIGFib3ZlLCBzZWUgYWxzbyB0aGUKLSAgICAgIDxiPnNob3J0TW9udGhOYW1lc0NvbmZpZzwvYj4gYXR0cmlidXRlLjxicj4KLSAgICAgIFNpbmNlIGFudCAxLjcKKyAgICAgIDxwPklmIG5vbmUgb2YgdGhlc2UgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBtZWNoYW5pc20gb2YgbGV0dGluZyB0aGUgc3lzdGVtIGF1dG8tZGV0ZWN0IHRoZQorICAgICAgc2VydmVyIE9TIHR5cGUgYmFzZWQgb24gdGhlIEZUUCA8Y29kZT5TWVNUPC9jb2RlPiBjb21tYW5kIGFuZCBhc3N1bWluZyBzdGFuZGFyZCBmb3JtYXR0aW5nCisgICAgICBmb3IgdGhhdCBPUyB0eXBlIHdpbGwgYmUgdXNlZC48L3A+CisgICAgICA8cD5UbyBhaWQgaW4gcHJvcGVydHktZmlsZS1iYXNlZCBkZXZlbG9wbWVudCB3aGVyZSBhIGJ1aWxkIHNjcmlwdCBpcyBjb25maWd1cmVkIHdpdGggcHJvcGVydHkKKyAgICAgIGZpbGVzLCBmb3IgYW55IG9mIHRoZXNlIGF0dHJpYnV0ZXMsIGEgdmFsdWUgb2YgPHE+PC9xPiBpcyBlcXVpdmFsZW50IHRvIG5vdCBzcGVjaWZ5aW5nIGl0LjwvcD4KKyAgICAgIDxwPlBsZWFzZSB1bmRlcnN0YW5kIHRoYXQgdGhlc2Ugb3B0aW9ucyBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIGF1dG9kZXRlY3Rpb24gc2NoZW1lLiAgSWYKKyAgICAgIGFueSBvZiB0aGVzZSBvcHRpb25zIGlzIHNwZWNpZmllZCwgKG90aGVyIHRoYW4gd2l0aCBhIHZhbHVlIG9mIDxxPjwvcT4pIGEgc3lzdGVtIHR5cGUgbXVzdCBiZQorICAgICAgY2hvc2VuIGFuZCBpZiA8dmFyPnN5c3RlbVR5cGVLZXk8L3Zhcj4gaXMgbm90IHNwZWNpZmllZCwgVU5JWCB3aWxsIGJlIGFzc3VtZWQuIFRoZSBwaGlsb3NvcGh5CisgICAgICBiZWhpbmQgdGhpcyBpcyB0aGF0IHRoZXNlIG9wdGlvbnMgYXJlIGZvciBzZXR0aW5nIG5vbi1zdGFuZGFyZCBmb3JtYXRzLCBhbmQgYSBidWlsZC1zY3JpcHQKKyAgICAgIGF1dGhvciB3aG8ga25vd3Mgd2hhdCBzeXN0ZW0gaGUgaXMgZGVhbGluZyB3aXRoIHdpbGwga25vdyB3aGF0IG9wdGlvbnMgdG8gbmVlZCB0byBiZQorICAgICAgc2V0LiBPdGhlcndpc2UsIHRoZXNlIG9wdGlvbnMgc2hvdWxkIGJlIGxlZnQgYWxvbmUgYW5kIHRoZSBkZWZhdWx0IGF1dG9kZXRlY3Rpb24gc2NoZW1lIGNhbiBiZQorICAgICAgdXNlZCBhbmQgd2lsbCB3b3JrIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcy48L3A+CiAgICAgPC90ZD4KLQotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zaG9ydE1vbnRoTmFtZXNDb25maWc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmeSB0aGUgbW9udGggYWJicmV2aWF0aW9ucyB1c2VkIG9uIHRoZSBzZXJ2ZXIgaW4gZmlsZQotICAgICAgdGltZXN0YW1wIGRhdGVzIGFzIGEgcGlwZS1kZWxpbWl0ZWQgc3RyaW5nIGZvciBlYWNoIG1vbnRoLiBGb3IgZXhhbXBsZSwKLSAgICAgIGEgc2V0IG9mIG1vbnRoIG5hbWVzIHVzZWQgYnkgYSBoeXBvdGhldGljYWwKLSAgICAgIEljZWxhbmRpYyBGVFAgc2VydmVyIG1pZ2h0IGNvbmNlaXZhYmx5IGJlIHNwZWNpZmllZCBhcwotICAgICAgPGNvZGU+ImphbnxmZWJ8bWFyfGFwcnxtYSYjeEVEO3xqJiN4RkE7bnxqJiN4RkE7bHwmI3hFMTtnJiN4RkE7fHNlcHxva3R8biYjeEYzO3Z8ZGVzIjwvY29kZT4uCi0gICAgICBUaGlzIGF0dHJpYnV0ZSBleGlzdHMgcHJpbWFyaWx5IHRvIHN1cHBvcnQgbGFuZ3VhZ2VzIG5vdCBzdXBwb3J0ZWQgYnkKLSAgICAgIHRoZSA8Yj5zZXJ2ZXJMYW5ndWFnZUNvZGU8L2I+IGF0dHJpYnV0ZS48YnI+Ci0gICAgICBTaW5jZSBhbnQgMS43CisgICAgPHRkPnN5c3RlbVR5cGVLZXk8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc3lzdGVtIGluIHVzZSBvbiB0aGUgc2VydmVyLiAgU3VwcG9ydGVkIHZhbHVlcworICAgICAgYXJlIDxxPlVOSVg8L3E+LCA8cT5WTVM8L3E+LCA8cT5XSU5ET1dTPC9xPiwgPHE+T1MvMjwvcT4sIDxxPk9TLzQwMDwvcT4sIDxxPk1WUzwvcT4uIElmIG5vdAorICAgICAgc3BlY2lmaWVkLCAob3Igc3BlY2lmaWVkIGFzIDxxPjwvcT4pIGFuZCBpZiBubyBvdGhlciA8dmFyPnh4eENvbmZpZzwvdmFyPiBhdHRyaWJ1dGVzIGFyZQorICAgICAgc3BlY2lmaWVkLCB0aGUgYXV0b2RldGVjdGlvbiBtZWNoYW5pc20gYmFzZWQgb24gdGhlIEZUUCA8Y29kZT5TWVNUPC9jb2RlPiBjb21tYW5kIHdpbGwgYmUKKyAgICAgIHVzZWQuPGJyLz48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm8sIGJ1dCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyA8dmFyPnh4eENvbmZpZzwvdmFyPiBhdHRyaWJ1dGVzIGlzIHNwZWNpZmllZCwgVU5JWCB3aWxsIGJlCisgICAgICBhc3N1bWVkLCBldmVuIGlmIDxxPjwvcT4gaXMgc3BlY2lmaWVkIGhlcmUuCiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zZXJ2ZXJUaW1lWm9uZUNvbmZpZzwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYXMgYQorICAgICAgSmF2YSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvVGltZVpvbmUuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+VGltZVpvbmU8L2E+IGlkZW50aWZpZXIsIChlLmcuIDxxPkdNVDwvcT4sIDxxPkFtZXJpY2EvQ2hpY2FnbzwvcT4KKyAgICAgIG9yIDxxPkFzaWEvSmFrYXJ0YTwvcT4pIHRoZSB0aW1lem9uZSB1c2VkIGJ5IHRoZSBzZXJ2ZXIgZm9yIHRpbWVzdGFtcHMuICBUaGlzIGVuYWJsZXMKKyAgICAgIHRpbWVzdGFtcCBkZXBlbmRlbmN5IGNoZWNraW5nIGV2ZW4gd2hlbiB0aGUgc2VydmVyIGlzIGluIGEgZGlmZmVyZW50IHRpbWUgem9uZSBmcm9tIHRoZQorICAgICAgY2xpZW50LiBUaW1lIFpvbmVzIGtub3csIGFsc28sIGFib3V0IGRheWxpZ2h0IHNhdmluZ3MgdGltZSwgYW5kIGRvIG5vdCByZXF1aXJlIHlvdSB0bworICAgICAgY2FsY3VsYXRlIG1pbGxpc2Vjb25kcyBvZiBkaWZmZXJlbmNlLiAgSWYgbm90IHNwZWNpZmllZCwgKG9yIHNwZWNpZmllZCBhcyA8cT48L3E+KSwgdGhlIHRpbWUKKyAgICAgIHpvbmUgb2YgdGhlIGNsaWVudCBpcyBhc3N1bWVkLjxici8+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kZWZhdWx0RGF0ZUZvcm1hdENvbmZpZzwvdGQ+CisgICAgPHRkPlNwZWNpZnkgaW4KKyAgICAgIEphdmEgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+U2ltcGxlRGF0ZUZvcm1hdDwvYT4gbm90YXRpb24sIChlLmcuIDxxPnl5eXktTU0tZGQ8L3E+KSwgdGhlIGRhdGUgZm9ybWF0CisgICAgICBnZW5lcmFsbHkgdXNlZCBieSB0aGUgRlRQIHNlcnZlciB0byBwYXJzZSBkYXRlcy4gIEluIHNvbWUgY2FzZXMgdGhpcyB3aWxsIGJlIHRoZSBvbmx5IGRhdGUKKyAgICAgIGZvcm1hdCB1c2VkLiAgSW4gb3RoZXJzLCAoPHE+dW5peDwvcT4gZm9yIGV4YW1wbGUpIHRoaXMgd2lsbCBiZSB1c2VkIGZvciBkYXRlcyBvbGRlciB0aGFuIGEKKyAgICAgIHllYXIgb2xkLiAoU2VlIDx2YXI+cmVjZW50RGF0ZUZvcm1hdENvbmZpZzwvdmFyPikuICBXaGVuIHNwZWNpZmllZCBhcyA8cT48L3E+LCBkZWZhdWx0IHZhbHVlCisgICAgICB3aWxsIGJlIHVzZWQuPGJyLz48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZGF0ZSBmb3JtYXQgZm9yIHRoZSBzeXN0ZW0gdHlwZSBpbmRpY2F0ZWQKKyAgICAgIGJ5IDx2YXI+c3lzdGVtVHlwZUtleTwvdmFyPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVjZW50RGF0ZUZvcm1hdENvbmZpZzwvdGQ+CisgICAgPHRkPlNwZWNpZnkgaW4KKyAgICAgIEphdmEgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS90ZXh0L1NpbXBsZURhdGVGb3JtYXQuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+U2ltcGxlRGF0ZUZvcm1hdDwvYT4gbm90YXRpb24sIChlLmcuIDxxPk1NTSBkZCBoaDptbTwvcT4pIHRoZSBkYXRlIGZvcm1hdCB1c2VkCisgICAgICBieSB0aGUgRlRQIHNlcnZlciB0byBwYXJzZSBkYXRlcyBsZXNzIHRoYW4gYSB5ZWFyIG9sZC4gIElmIG5vdCBzcGVjaWZpZWQgKG9yIHNwZWNpZmllZAorICAgICAgYXMgPHE+PC9xPiksIGFuZCBpZiB0aGUgc3lzdGVtIHR5cGUgaW5kaWNhdGVkIGJ5IHRoZSA8dmFyPnN5c3RlbVR5cGVLZXk8L3Zhcj4gdXNlcyBhIHJlY2VudAorICAgICAgZGF0ZSBmb3JtYXQsIGl0cyBzdGFuZGFyZCBmb3JtYXQgd2lsbCBiZSB1c2VkLjxici8+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWc8L3RkPgorICAgIDx0ZD5hIDxhIGhyZWY9Imh0dHA6Ly93d3cubWF0aGd1aWRlLmRlL2luZm8vdG9vbHMvbGFuZ3VhZ2Vjb2RlLmh0bWwiIHRhcmdldD0iX3RvcCI+dHdvLWxldHRlcgorICAgICAgSVNPLTYzOSBsYW5ndWFnZSBjb2RlPC9hPiB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIHVzZWQgYnkgdGhlIHNlcnZlciB0byBmb3JtYXQgbW9udGgKKyAgICAgIG5hbWVzLiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIHNwZWNpZmllZCB3aGVuIHRoZSBzZXJ2ZXIgdXNlcyBub24tbnVtZXJpYyBhYmJyZXZpYXRpb25zIGZvcgorICAgICAgbW9udGhzIGluIGl0cyBkYXRlIGxpc3RpbmdzIGluIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiBFbmdsaXNoLiAgVGhpcyBhcHBlYXJzIHRvIGJlIGJlY29taW5nCisgICAgICByYXJlciBhbmQgcmFyZXIsIGFzIGNvbW1vbmx5IGRpc3RyaWJ1dGVkIEZUUCBzZXJ2ZXJzIHNlZW0gaW5jcmVhc2luZ2x5IHRvIHVzZSBFbmdsaXNoIG9yCisgICAgICBhbGwtbnVtZXJpYyBmb3JtYXRzLiAgTGFuZ3VhZ2VzIHN1cHBvcnRlZCBhcmU6CisgICAgICA8dWw+CisgICAgICAgIDxsaT48cT5lbjwvcT4mbWRhc2g7RW5nbGlzaDwvbGk+CisgICAgICAgIDxsaT48cT5mcjwvcT4mbWRhc2g7RnJlbmNoPC9saT4KKyAgICAgICAgPGxpPjxxPmRlPC9xPiZtZGFzaDtHZXJtYW48L2xpPgorICAgICAgICA8bGk+PHE+aXQ8L3E+Jm1kYXNoO0l0YWxpYW48L2xpPgorICAgICAgICA8bGk+PHE+ZXM8L3E+Jm1kYXNoO1NwYW5pc2g8L2xpPgorICAgICAgICA8bGk+PHE+cHQ8L3E+Jm1kYXNoO1BvcnR1Z3Vlc2U8L2xpPgorICAgICAgICA8bGk+PHE+ZGE8L3E+Jm1kYXNoO0RhbmlzaDwvbGk+CisgICAgICAgIDxsaT48cT5zdjwvcT4mbWRhc2g7U3dlZGlzaDwvbGk+CisgICAgICAgIDxsaT48cT5ubzwvcT4mbWRhc2g7Tm9yd2VnaWFuPC9saT4KKyAgICAgICAgPGxpPjxxPm5sPC9xPiZtZGFzaDtEdXRjaDwvbGk+CisgICAgICAgIDxsaT48cT5ybzwvcT4mbWRhc2g7Um9tYW5pYW48L2xpPgorICAgICAgICA8bGk+PHE+c3E8L3E+Jm1kYXNoO0FsYmFuaWFuPC9saT4KKyAgICAgICAgPGxpPjxxPnNoPC9xPiZtZGFzaDtTZXJiby1Dcm9hdGlhbjwvbGk+CisgICAgICAgIDxsaT48cT5zazwvcT4mbWRhc2g7U2xvdmFrPC9saT4KKyAgICAgICAgPGxpPjxxPnNsPC9xPiZtZGFzaDtTbG92ZW5pYW48L2xpPgorICAgICAgPC91bD4KKyAgICAgIElmIHlvdSByZXF1aXJlIGEgbGFuZ3VhZ2Ugb3RoZXIgdGhhbiB0aGUgYWJvdmUsIHNlZSBhbHNvIHRoZSA8dmFyPnNob3J0TW9udGhOYW1lc0NvbmZpZzwvdmFyPgorICAgICAgYXR0cmlidXRlLjxici8+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zaG9ydE1vbnRoTmFtZXNDb25maWc8L3RkPgorICAgIDx0ZD5zcGVjaWZ5IHRoZSBtb250aCBhYmJyZXZpYXRpb25zIHVzZWQgb24gdGhlIHNlcnZlciBpbiBmaWxlIHRpbWVzdGFtcCBkYXRlcyBhcyBhCisgICAgICBwaXBlLWRlbGltaXRlZCBzdHJpbmcgZm9yIGVhY2ggbW9udGguIEZvciBleGFtcGxlLCBhIHNldCBvZiBtb250aCBuYW1lcyB1c2VkIGJ5IGEgaHlwb3RoZXRpY2FsCisgICAgICBJY2VsYW5kaWMgRlRQIHNlcnZlciBtaWdodCBjb25jZWl2YWJseSBiZSBzcGVjaWZpZWQKKyAgICAgIGFzIDxxPmphbnxmZWJ8bWFyfGFwcnxtYSZpYWN1dGU7fGomdWFjdXRlO258aiZ1YWN1dGU7bHwmYWFjdXRlO2cmdWFjdXRlO3xzZXB8b2t0fG4mb2FjdXRlO3Z8ZGVzPC9xPi4KKyAgICAgIFRoaXMgYXR0cmlidXRlIGV4aXN0cyBwcmltYXJpbHkgdG8gc3VwcG9ydCBsYW5ndWFnZXMgbm90IHN1cHBvcnRlZCBieQorICAgICAgdGhlIDx2YXI+c2VydmVyTGFuZ3VhZ2VDb2RlPC92YXI+IGF0dHJpYnV0ZS48YnIvPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGgzPk5vdGUgYWJvdXQgcmVtb3RlZGlyIGF0dHJpYnV0ZTwvaDM+Ci08dGFibGUgIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIgotID4KKzxoMz5Ob3RlIGFib3V0IDx2YXI+cmVtb3RlZGlyPC92YXI+IGF0dHJpYnV0ZTwvaDM+Cis8dGFibGU+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGggc2NvcGU9ImNvbCI+QWN0aW9uPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5tZWFuaW5nIG9mIDx2YXI+cmVtb3RlZGlyPC92YXI+PC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj51c2Ugb2YgbmVzdGVkIDx2YXI+ZmlsZXNldDwvdmFyPihzKTwvdGg+CisgICAgPC90cj4KKyAgPC90aGVhZD4KICAgPHRib2R5PgogICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPkFjdGlvbjxicj4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iNDAlIj5tZWFuaW5nIG9mIDxjb2RlPnJlbW90ZWRpcjwvY29kZT48YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dXNlIG9mIG5lc3RlZCA8Y29kZT5maWxlc2V0PC9jb2RlPgotKHMpPGJyPgotICAgICAgPC90ZD4KKyAgICAgIDx0ZD48cT5zZW5kPC9xPi88cT5wdXQ8L3E+PC90ZD4KKyAgICAgIDx0ZD5iYXNlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgZmlsZXMgYXJlIHNlbnQ8L3RkPgorICAgICAgPHRkPnRoZXkgYXJlIHVzZWQgbm9ybWFsbHkgYW5kIGV2YWx1YXRlZCBvbiB0aGUgbG9jYWwgbWFjaGluZTwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iMjAlIj5zZW5kL3B1dDxicj4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iNDAlIj5iYXNlIGRpcmVjdG9yeSB0bwotd2hpY2ggdGhlIGZpbGVzIGFyZSBzZW50PGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnRoZXkgYXJlIHVzZWQgbm9ybWFsbHkgYW5kCi1ldmFsdWF0ZWQgb24gdGhlIGxvY2FsIG1hY2hpbmU8YnI+Ci0gICAgICA8L3RkPgorICAgICAgPHRkPjxxPnJlY3Y8L3E+LzxxPmdldDwvcT48L3RkPgorICAgICAgPHRkPmJhc2UgZGlyZWN0b3J5IGZyb20gd2hpY2ggdGhlIGZpbGVzIGFyZSByZXRyaWV2ZWQ8L3RkPgorICAgICAgPHRkPnRoZSByZW1vdGUgZmlsZXMgbG9jYXRlZCB1bmRlciB0aGUgPHZhcj5yZW1vdGVkaXI8L3Zhcj4gbWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZQorICAgICAgICBwYXR0ZXJucyBvZiB0aGUgPHZhcj5maWxlc2V0PC92YXI+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPnJlY3YvZ2V0PGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KLXdoaWNoIHRoZSBmaWxlcyBhcmUgcmV0cmlldmVkPGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnRoZSByZW1vdGUgZmlsZXMgbG9jYXRlZCB1bmRlcgotdGhlIDxjb2RlPnJlbW90ZWRpciA8L2NvZGU+bWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyBvZgotdGhlIDxjb2RlPmZpbGVzZXQmbmJzcDs8L2NvZGU+PC90ZD4KKyAgICAgIDx0ZD48cT5kZWw8L3E+LzxxPmRlbGV0ZTwvcT48L3RkPgorICAgICAgPHRkPmJhc2UgZGlyZWN0b3J5IGZyb20gd2hpY2ggZmlsZXMgZ2V0IGRlbGV0ZWQ8L3RkPgorICAgICAgPHRkPnRoZSByZW1vdGUgZmlsZXMgbG9jYXRlZCB1bmRlciB0aGUgPHZhcj5yZW1vdGVkaXI8L3Zhcj4gbWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZQorICAgICAgICBwYXR0ZXJucyBvZiB0aGUgPHZhcj5maWxlc2V0PC92YXI+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPmRlbC9kZWxldGU8YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgd2lkdGg9IjQwJSI+YmFzZSBkaXJlY3RvcnkgZnJvbQotd2hpY2ggZmlsZXMgZ2V0IGRlbGV0ZWQ8YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyCi10aGUgPGNvZGU+cmVtb3RlZGlyIDwvY29kZT5tYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIG9mCi10aGUgPGNvZGU+ZmlsZXNldCA8YnI+Ci0gICAgICA8L2NvZGU+PC90ZD4KKyAgICAgIDx0ZD48cT5saXN0PC9xPjwvdGQ+CisgICAgICA8dGQ+YmFzZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBmaWxlcyBhcmUgbGlzdGVkPC90ZD4KKyAgICAgIDx0ZD50aGUgcmVtb3RlIGZpbGVzIGxvY2F0ZWQgdW5kZXIgdGhlIDx2YXI+cmVtb3RlZGlyPC92YXI+IG1hdGNoaW5nIHRoZSBpbmNsdWRlL2V4Y2x1ZGUKKyAgICAgICAgcGF0dGVybnMgb2YgdGhlIDx2YXI+ZmlsZXNldDwvdmFyPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOiB0b3A7IiB3aWR0aD0iMjAlIj5saXN0PGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KLXdoaWNoIGZpbGVzIGFyZSBsaXN0ZWQ8YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyCi10aGUgPGNvZGU+cmVtb3RlZGlyIDwvY29kZT5tYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIG9mCi10aGUgPGNvZGU+ZmlsZXNldCA8YnI+Ci0gICAgICA8L2NvZGU+PC90ZD4KKyAgICAgIDx0ZD48cT5ta2RpcjwvcT48L3RkPgorICAgICAgPHRkPmRpcmVjdG9yeSB0byBjcmVhdGU8L3RkPgorICAgICAgPHRkPjxlbT5ub3QgdXNlZDwvZW0+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPm1rZGlyPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmRpcmVjdG9yeSB0byBjcmVhdGU8YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+bm90IHVzZWQ8YnI+Ci0gICAgICA8L3RkPgorICAgICAgPHRkPjxxPmNobW9kPC9xPjwvdGQ+CisgICAgICA8dGQ+YmFzZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0aGUgbW9kZSBvZiBmaWxlcyBnZXQgY2hhbmdlZDwvdGQ+CisgICAgICA8dGQ+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyIHRoZSA8dmFyPnJlbW90ZWRpcjwvdmFyPiBtYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlCisgICAgICAgIHBhdHRlcm5zIG9mIHRoZSA8dmFyPmZpbGVzZXQ8L3Zhcj48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgd2lkdGg9IjIwJSI+Y2htb2Q8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyIgd2lkdGg9IjQwJSI+YmFzZSBkaXJlY3RvcnkgZnJvbQotd2hpY2ggdGhlIG1vZGUgb2YgZmlsZXMgZ2V0IGNoYW5nZWQ8YnI+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogdG9wOyI+dGhlIHJlbW90ZSBmaWxlcyBsb2NhdGVkIHVuZGVyCi10aGUgPGNvZGU+cmVtb3RlZGlyIDwvY29kZT5tYXRjaGluZyB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIG9mCi10aGUgPGNvZGU+ZmlsZXNldCA8YnI+Ci0gICAgICA8L2NvZGU+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSIyMCUiPnJtZGlyPGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiIHdpZHRoPSI0MCUiPmJhc2UgZGlyZWN0b3J5IGZyb20KLXdoaWNoIGRpcmVjdG9yaWVzIGdldCByZW1vdmVkPGJyPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246IHRvcDsiPnRoZSByZW1vdGUgZGlyZWN0b3JpZXMgbG9jYXRlZAotdW5kZXIgdGhlIDxjb2RlPnJlbW90ZWRpciA8L2NvZGU+bWF0Y2hpbmcgdGhlIGluY2x1ZGUvZXhjbHVkZQotcGF0dGVybnMgb2YgdGhlIDxjb2RlPmZpbGVzZXQgPGJyPgotICAgICAgPC9jb2RlPjwvdGQ+CisgICAgICA8dGQ+PHE+cm1kaXI8L3E+PC90ZD4KKyAgICAgIDx0ZD5iYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRpcmVjdG9yaWVzIGdldCByZW1vdmVkPC90ZD4KKyAgICAgIDx0ZD50aGUgcmVtb3RlIGRpcmVjdG9yaWVzIGxvY2F0ZWQgdW5kZXIgdGhlIDx2YXI+cmVtb3RlZGlyPC92YXI+IG1hdGNoaW5nIHRoZSBpbmNsdWRlL2V4Y2x1ZGUKKyAgICAgICAgcGF0dGVybnMgb2YgdGhlIDx2YXI+ZmlsZXNldDwvdmFyPjwvdGQ+CiAgICAgPC90cj4KICAgPC90Ym9keT4KLTwvdGFibGU+PGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8L3RhYmxlPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+ZmlsZXNldDwvaDQ+Ci08cD5UaGUgZnRwIHRhc2sgc3VwcG9ydHMgYW55IG51bWJlciBvZiBuZXN0ZWQgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+PGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudHMgdG8gc3BlY2lmeQotdGhlIGZpbGVzIHRvIGJlIHJldHJpZXZlZCwgb3IgZGVsZXRlZCwgb3IgbGlzdGVkLCBvciB3aG9zZSBtb2RlIHlvdSB3YW50IHRvIGNoYW5nZS48L3A+Ci08cD4KLVRoZSBhdHRyaWJ1dGUgPGNvZGU+Zm9sbG93c3ltbGlua3M8L2NvZGU+IG9mIDxjb2RlPmZpbGVzZXQ8L2NvZGU+IGlzIHN1cHBvcnRlZCBvbgotbG9jYWwgKHB1dCkgYXMgd2VsbCBhcyByZW1vdGUgKGdldCwgY2htb2QsIGRlbGV0ZSwgbGlzdCkgZmlsZXNldHMuCi08ZW0+QmVmb3JlIGFudCAxLjYgdGhlcmUgd2FzIG5vIHN1cHBvcnQgb2Ygc3ltYm9saWMgbGlua3MgaW4gcmVtb3RlIGZpbGVzZXRzLgotSW4gb3JkZXIgdG8gZXhjbHVkZSBzeW1ib2xpYyBsaW5rcyAocHJlc2VydmUgdGhlIGJlaGF2aW9yIG9mIGFudCAxLjUueCBhbmQgb2xkZXIpLAoteW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgPGNvZGU+Zm9sbG93c3ltbGlua3M8L2NvZGU+IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48L2VtPgotT24gcmVtb3RlIGZpbGVzZXRzIGhpZGRlbiBmaWxlcyBhcmUgbm90IGNoZWNrZWQgZm9yIGJlaW5nIHN5bWJvbGljIGxpbmtzLiBIaWRkZW4KLWZpbGVzIGFyZSBjdXJyZW50bHkgYXNzdW1lZCB0byBub3QgYmUgc3ltYm9saWMgbGlua3MuCi08L3A+Cis8cD5UaGUgPGNvZGU+ZnRwPC9jb2RlPiB0YXNrIHN1cHBvcnRzIGFueSBudW1iZXIgb2YKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+IGVsZW1lbnRzIHRvIHNwZWNpZnkgdGhlCitmaWxlcyB0byBiZSByZXRyaWV2ZWQsIG9yIGRlbGV0ZWQsIG9yIGxpc3RlZCwgb3Igd2hvc2UgbW9kZSB5b3Ugd2FudCB0byBjaGFuZ2UuPC9wPgorPHA+VGhlIGF0dHJpYnV0ZSA8dmFyPmZvbGxvd3N5bWxpbmtzPC92YXI+IG9mIDxjb2RlPmZpbGVzZXQ8L2NvZGU+IGlzIHN1cHBvcnRlZCBvbiBsb2NhbAorKDxxPnB1dDwvcT4pIGFzIHdlbGwgYXMgcmVtb3RlICg8cT5nZXQ8L3E+LCA8cT5jaG1vZDwvcT4sIDxxPmRlbGV0ZTwvcT4sIDxxPmxpc3Q8L3E+KSBmaWxlc2V0cy4gIDxlbT5CZWZvcmUgQW50CisxLjYgdGhlcmUgd2FzIG5vIHN1cHBvcnQgb2Ygc3ltYm9saWMgbGlua3MgaW4gcmVtb3RlIGZpbGVzZXRzLiAgSW4gb3JkZXIgdG8gZXhjbHVkZSBzeW1ib2xpYyBsaW5rcworKHByZXNlcnZlIHRoZSBiZWhhdmlvciBvZiBBbnQgMS41LnggYW5kIG9sZGVyKSwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgPHZhcj5mb2xsb3dzeW1saW5rczwvdmFyPgordG8gPHE+ZmFsc2U8L3E+LjwvZW0+ICBPbiByZW1vdGUgZmlsZXNldHMgaGlkZGVuIGZpbGVzIGFyZSBub3QgY2hlY2tlZCBmb3IgYmVpbmcgc3ltYm9saWMgbGlua3MuCitIaWRkZW4gZmlsZXMgYXJlIGN1cnJlbnRseSBhc3N1bWVkIHRvIG5vdCBiZSBzeW1ib2xpYyBsaW5rcy48L3A+CiAKLTxoMz5TZW5kaW5nIEZpbGVzPC9oMz4KLTxwPlRoZSBlYXNpZXN0IHdheSB0byBkZXNjcmliZSBob3cgdG8gc2VuZCBmaWxlcyBpcyB3aXRoIGEgY291cGxlIG9mIGV4YW1wbGVzOjwvcD4KKzxoMz5TZW5kaW5nIGZpbGVzPC9oMz4KKzxwPlRoZSBlYXNpZXN0IHdheSB0byBkZXNjcmliZSBob3cgdG8gc2VuZCBmaWxlcyBpcyB3aXRoIGEgY291cGxlIG9mIGV4YW1wbGVzLjwvcD4KKzxwPkxvZyBpbiB0byA8c2FtcD5mdHAuYXBhY2hlLm9yZzwvc2FtcD4gYXMgPHNhbXA+YW5vbnltb3VzPC9zYW1wPiBhbmQgdXBsb2FkIGFsbCBmaWxlcyBpbgordGhlIDxzYW1wPmh0ZG9jcy9tYW51YWw8L3NhbXA+IGRpcmVjdG9yeSB0byB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIHRoYXQgdXNlci48L3A+CiA8cHJlPgotICAmbHQ7ZnRwIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCi0gICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCi0gICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSImZ3Q7CismbHQ7ZnRwIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCisgICAgIHVzZXJpZD0iYW5vbnltb3VzIgorICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIiZndDsKICAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiLyZndDsKLSAgJmx0Oy9mdHAmZ3Q7Ci08L3ByZT4KLTxwPkxvZ3MgaW4gdG8gPGNvZGU+ZnRwLmFwYWNoZS5vcmc8L2NvZGU+IGFzIDxjb2RlPmFub255bW91czwvY29kZT4gYW5kIAotdXBsb2FkcyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSAKLXRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgdGhhdCB1c2VyLjwvcD4KLTxwcmU+ICAmbHQ7ZnRwIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCi0gICAgICAgcmVtb3RlZGlyPSJpbmNvbWluZyIKLSAgICAgICB1c2VyaWQ9ImFub255bW91cyIKLSAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgotICAgICAgIGRlcGVuZHM9InllcyImZ3Q7CismbHQ7L2Z0cCZndDs8L3ByZT4KKworPHA+TG9nIGluIHRvIDxzYW1wPmZ0cC5hcGFjaGUub3JnPC9zYW1wPiBhcyA8c2FtcD5hbm9ueW1vdXM8L3NhbXA+IGFuZCB1cGxvYWQgYWxsIG5ldyBvciBjaGFuZ2VkCitmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IHRvIHRoZSA8c2FtcD5pbmNvbWluZzwvc2FtcD4gZGlyZWN0b3J5IHJlbGF0aXZlIHRvCit0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIDxzYW1wPmFub255bW91czwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtmdHAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgcmVtb3RlZGlyPSJpbmNvbWluZyIKKyAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCisgICAgIGRlcGVuZHM9InllcyImZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIi8mZ3Q7Ci0gICZsdDsvZnRwJmd0OzwvcHJlPgotPHA+TG9ncyBpbiB0byA8Y29kZT5mdHAuYXBhY2hlLm9yZzwvY29kZT4gYXMgPGNvZGU+YW5vbnltb3VzPC9jb2RlPiBhbmQKLXVwbG9hZHMgYWxsIG5ldyBvciBjaGFuZ2VkIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgCi10byB0aGUgPGNvZGU+aW5jb21pbmc8L2NvZGU+IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgZGVmYXVsdCBkaXJlY3RvcnkKLWZvciA8Y29kZT5hbm9ueW1vdXM8L2NvZGU+LjwvcD4KLTxwcmU+ICAmbHQ7ZnRwIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCi0gICAgICAgcG9ydD0iMjEyMSIKLSAgICAgICByZW1vdGVkaXI9Ii9wdWIvaW5jb21pbmciCi0gICAgICAgdXNlcmlkPSJjb2RlciIKLSAgICAgICBwYXNzd29yZD0iamF2YTEiCi0gICAgICAgcGFzc2l2ZT0ieWVzIgotICAgICAgIGRlcGVuZHM9InllcyIKLSAgICAgICBiaW5hcnk9Im5vIiZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OwotICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7Ci0gICAgJmx0Oy9maWxlc2V0Jmd0OwotICAmbHQ7L2Z0cCZndDs8L3ByZT4KLTxwPkxvZ3MgaW4gdG8gPGNvZGU+ZnRwLmFwYWNoZS5vcmc8L2NvZGU+IGF0IHBvcnQgPGNvZGU+MjEyMTwvY29kZT4gYXMKLTxjb2RlPmNvZGVyPC9jb2RlPiB3aXRoIHBhc3N3b3JkIDxjb2RlPmphdmExPC9jb2RlPiBhbmQgdXBsb2FkcyBhbGwgbmV3IG9yCi1jaGFuZ2VkIEhUTUwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSB0byB0aGUKLTxjb2RlPi9wdWIvaW5jb21pbmc8L2NvZGU+IGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSB0cmFuc2ZlcnJlZCBpbiB0ZXh0IG1vZGUuCi1QYXNzaXZlIG1vZGUgaGFzIGJlZW4gc3dpdGNoZWQgb24gdG8gc2VuZCBmaWxlcyBmcm9tIGJlaGluZCBhIGZpcmV3YWxsLjwvcD4KLTxwcmU+ICAmbHQ7ZnRwIHNlcnZlcj0iZnRwLmh5cG90aGV0aWNhbC5pbmRpYS5vcmciCi0gICAgICAgcG9ydD0iMjEyMSIKLSAgICAgICByZW1vdGVkaXI9Ii9wdWIvaW5jb21pbmciCi0gICAgICAgdXNlcmlkPSJjb2RlciIKLSAgICAgICBwYXNzd29yZD0iamF2YTEiCi0gICAgICAgZGVwZW5kcz0ieWVzIgotICAgICAgIGJpbmFyeT0ibm8iCi0gICAgICAgc3lzdGVtVHlwZUtleT0iV2luZG93cyIKLSAgICAgICBzZXJ2ZXJUaW1lWm9uZUNvbmZpZz0iSW5kaWEvQ2FsY3V0dGEiJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICZsdDsvZnRwJmd0OzwvcHJlPgotPHA+TG9ncyBpbiB0byBhIFdpbmRvd3Mgc2VydmVyIGF0IDxjb2RlPmZ0cC5oeXBvdGhldGljYWwuaW5kaWEub3JnPC9jb2RlPgotYXQgcG9ydCA8Y29kZT4yMTIxPC9jb2RlPiBhcyA8Y29kZT5jb2RlcjwvY29kZT4gd2l0aCBwYXNzd29yZCA8Y29kZT5qYXZhMTwvY29kZT4KLWFuZCB1cGxvYWRzIGFsbCBuZXcgb3IgY2hhbmdlZCAoYWNjb3VudGluZyBmb3IgdGltZXpvbmUgZGlmZmVyZW5jZXMpCi1IVE1MIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPgotZGlyZWN0b3J5IHRvIHRoZSA8Y29kZT4vcHViL2luY29taW5nPC9jb2RlPiBkaXJlY3RvcnkuIFRoZSBmaWxlcyBhcmUgdHJhbnNmZXJyZWQKLWluIHRleHQgbW9kZS48L3A+Ci08cHJlPiAgJmx0O2Z0cCBzZXJ2ZXI9ImZ0cC5udC5vcmciCi0gICAgICAgcmVtb3RlZGlyPSJjOlx1cGxvYWRzIgotICAgICAgIHVzZXJpZD0iY29kZXIiCi0gICAgICAgcGFzc3dvcmQ9ImphdmExIgotICAgICAgIHNlcGFyYXRvcj0iXCIKLSAgICAgICB2ZXJib3NlPSJ5ZXMiJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICZsdDsvZnRwJmd0OzwvcHJlPjxwPkxvZ3MgaW4gdG8gdGhlIFdpbmRvd3MtYmFzZWQgPGNvZGU+ZnRwLm50Lm9yZzwvY29kZT4gYXMgCi08Y29kZT5jb2RlcjwvY29kZT4gd2l0aCBwYXNzd29yZCA8Y29kZT5qYXZhMTwvY29kZT4gYW5kIHVwbG9hZHMgYWxsIAotSFRNTCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IHRvIHRoZSAKLTxjb2RlPmM6XHVwbG9hZHM8L2NvZGU+IGRpcmVjdG9yeS4gIFByb2dyZXNzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQgYXMgZWFjaAotZmlsZSBpcyB1cGxvYWRlZC48L3A+Ci08aDM+R2V0dGluZyBGaWxlczwvaDM+Ci08cD5HZXR0aW5nIGZpbGVzIGZyb20gYW4gRlRQIHNlcnZlciB3b3JrcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSB3YXkgYXMgCi1zZW5kaW5nIHRoZW0gZG9lcy4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgbmVzdGVkIGZpbGVzZXRzCi11c2UgdGhlIHJlbW90ZWRpciBhdHRyaWJ1dGUgYXMgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgZmlsZXMgb24gdGhlCi1GVFAgc2VydmVyLCBhbmQgdGhlIGRpciBhdHRyaWJ1dGUgYXMgdGhlIGxvY2FsIGRpcmVjdG9yeSB0byBwdXQgdGhlIGZpbGVzCi1pbnRvLiAgVGhlIGZpbGUgc3RydWN0dXJlIGZyb20gdGhlIEZUUCBzaXRlIGlzIHByZXNlcnZlZCBvbiB0aGUgbG9jYWwgbWFjaGluZS48L3A+Ci08cHJlPgotICAmbHQ7ZnRwIGFjdGlvbj0iZ2V0IgotICAgICAgIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCi0gICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCi0gICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSImZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9mdHAmZ3Q7Ci08L3ByZT4KLTxwPkxvZ3MgaW4gdG8gPGNvZGU+ZnRwLmFwYWNoZS5vcmc8L2NvZGU+IGFzIDxjb2RlPmFub255bW91czwvY29kZT4gYW5kIAotcmVjdXJzaXZlbHkgZG93bmxvYWRzIGFsbCAuaHRtbCBmaWxlcyBmcm9tIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGF0IHVzZXIgCi1pbnRvIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIG1hY2hpbmUuPC9wPgotPHByZT4KLSAgJmx0O2Z0cCBhY3Rpb249ImdldCIKLSAgICAgICBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgotICAgICAgIHVzZXJpZD0iYW5vbnltb3VzIgotICAgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCi0gICAgICAgc3lzdGVtVHlwZUtleT0iVU5JWCIKLSAgICAgICBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZz0ieXl5eS1NTS1kZCBISDptbSImZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9mdHAmZ3Q7Ci08L3ByZT4KLTxwPklmIGFwYWNoZS5vcmcgZXZlciBzd2l0Y2hlcyB0byBhIHVuaXggRlRQIHNlcnZlciB0aGF0IHVzZXMgdGhlIG5ldyBhbGwtbnVtZXJpYwotZm9ybWF0IGZvciB0aW1lc3RhbXBzLCB0aGlzIHZlcnNpb24gd291bGQgYmVjb21lIG5lY2Vzc2FyeS4gIEl0IHdvdWxkIGFjY29tcGxpc2gKLXRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgYnV0IHdvdWxkIHN1Y2Nlc3NmdWxseSBoYW5kbGUgdGhlCi1udW1lcmljIHRpbWVzdGFtcHMuCi1UaGUgPGNvZGU+c3lzdGVtVHlwZUtleTwvY29kZT4gaXMgbm90IG5lY2Vzc2FyeSBoZXJlIGJ1dCBoZWxwcyBjbGFyaWZ5IHdoYXQgaXMKLWdvaW5nIG9uLjwvcD4KLTxwcmU+Ci0gICZsdDtmdHAgYWN0aW9uPSJnZXQiCi0gICAgICAgc2VydmVyPSJmdHAuaHlwdGhldGljYWwuZnIiCi0gICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCi0gICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSIKLSAgICAgICBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZz0iZCBNTU0geXl5eSIKLSAgICAgICByZWNlbnREYXRlRm9ybWF0Q29uZmlnPSJkIE1NTSBISDptbSIKLSAgICAgICBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWc9ImZyIiZndDsKLSAgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9mdHAmZ3Q7Ci08L3ByZT4KLTxwPkxvZ3MgaW50byBhIFVOSVggRlRQIHNlcnZlciBhdCA8Y29kZT5mdHAuaHlwb3RoZXRpY2FsLmZyPC9jb2RlPiB3aGljaCBkaXNwbGF5cwotZGF0ZXMgd2l0aCBGcmVuY2ggbmFtZXMgaW4gU3RhbmRhcmQgRXVyb3BlYW4gZm9ybWF0LCBhcyA8Y29kZT5hbm9ueW1vdXM8L2NvZGU+LCBhbmQKLXJlY3Vyc2l2ZWx5IGRvd25sb2FkcyBhbGwgLmh0bWwgZmlsZXMgZnJvbSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgdGhhdCB1c2VyCi1pbnRvIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3Rvcnkgb24gdGhlIGxvY2FsIG1hY2hpbmUuPC9wPgorJmx0Oy9mdHAmZ3Q7PC9wcmU+CiAKLTxoMz5EZWxldGluZyBGaWxlczwvaDM+Ci1BcyB5b3UndmUgcHJvYmFibHkgZ3Vlc3NlZCBieSBub3csIHlvdSB1c2UgbmVzdGVkIGZpbGVzZXQgZWxlbWVudHMgdG8gCi1zZWxlY3QgdGhlIGZpbGVzIHRvIGRlbGV0ZSBmcm9tIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gIEFnYWluLCB0aGUgCi1maWxlc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBkaXJlY3RvcnksIG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4gIEluCi1mYWN0LCB0aGUgZGlyIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZXNldCBpcyBpZ25vcmVkIGNvbXBsZXRlbHkuCi0KKzxwPkxvZyBpbiB0byA8c2FtcD5mdHAuYXBhY2hlLm9yZzwvc2FtcD4gYXQgcG9ydCA8c2FtcD4yMTIxPC9zYW1wPiBhcyA8c2FtcD5jb2Rlcjwvc2FtcD4gd2l0aAorcGFzc3dvcmQgPHNhbXA+amF2YTE8L3NhbXA+IGFuZCB1cGxvYWQgYWxsIG5ldyBvciBjaGFuZ2VkIEhUTUwgZmlsZXMgaW4KK3RoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgdG8gdGhlIDxzYW1wPi9wdWIvaW5jb21pbmc8L3NhbXA+IGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZQordHJhbnNmZXJyZWQgaW4gdGV4dCBtb2RlLiAgUGFzc2l2ZSBtb2RlIGhhcyBiZWVuIHN3aXRjaGVkIG9uIHRvIHNlbmQgZmlsZXMgZnJvbSBiZWhpbmQgYQorZmlyZXdhbGwuPC9wPgogPHByZT4KLSAgJmx0O2Z0cCBhY3Rpb249ImRlbCIKLSAgICAgICBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgotICAgICAgIHVzZXJpZD0iYW5vbnltb3VzIgotICAgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iJmd0OworJmx0O2Z0cCBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgorICAgICBwb3J0PSIyMTIxIgorICAgICByZW1vdGVkaXI9Ii9wdWIvaW5jb21pbmciCisgICAgIHVzZXJpZD0iY29kZXIiCisgICAgIHBhc3N3b3JkPSJqYXZhMSIKKyAgICAgcGFzc2l2ZT0ieWVzIgorICAgICBkZXBlbmRzPSJ5ZXMiCisgICAgIGJpbmFyeT0ibm8iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvZnRwJmd0OzwvcHJlPgorCis8cD5Mb2cgaW4gdG8gYSBXaW5kb3dzIHNlcnZlciBhdCA8c2FtcD5mdHAuaHlwb3RoZXRpY2FsLmluZGlhLm9yZzwvc2FtcD4gYXQgcG9ydCA8c2FtcD4yMTIxPC9zYW1wPgorYXMgPHNhbXA+Y29kZXI8L3NhbXA+IHdpdGggcGFzc3dvcmQgPHNhbXA+amF2YTE8L3NhbXA+IGFuZCB1cGxvYWQgYWxsIG5ldyBvciBjaGFuZ2VkIChhY2NvdW50aW5nIGZvcgordGltZXpvbmUgZGlmZmVyZW5jZXMpIEhUTUwgZmlsZXMgaW4gdGhlIDxzYW1wPmh0ZG9jcy9tYW51YWw8L3NhbXA+IGRpcmVjdG9yeSB0bwordGhlIDxzYW1wPi9wdWIvaW5jb21pbmc8L3NhbXA+IGRpcmVjdG9yeS4gVGhlIGZpbGVzIGFyZSB0cmFuc2ZlcnJlZCBpbiB0ZXh0IG1vZGUuPC9wPgorPHByZT4KKyZsdDtmdHAgc2VydmVyPSJmdHAuaHlwb3RoZXRpY2FsLmluZGlhLm9yZyIKKyAgICAgcG9ydD0iMjEyMSIKKyAgICAgcmVtb3RlZGlyPSIvcHViL2luY29taW5nIgorICAgICB1c2VyaWQ9ImNvZGVyIgorICAgICBwYXNzd29yZD0iamF2YTEiCisgICAgIGRlcGVuZHM9InllcyIKKyAgICAgYmluYXJ5PSJubyIKKyAgICAgc3lzdGVtVHlwZUtleT0iV2luZG93cyIKKyAgICAgc2VydmVyVGltZVpvbmVDb25maWc9IkluZGlhL0NhbGN1dHRhIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2Z0cCZndDs8L3ByZT4KKworPHA+TG9nIGluIHRvIHRoZSBXaW5kb3dzLWJhc2VkIDxzYW1wPmZ0cC5udC5vcmc8L3NhbXA+IGFzIDxzYW1wPmNvZGVyPC9zYW1wPiB3aXRoCitwYXNzd29yZCA8c2FtcD5qYXZhMTwvc2FtcD4gYW5kIHVwbG9hZCBhbGwgSFRNTCBmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IHRvCit0aGUgPHNhbXA+YzpcdXBsb2Fkczwvc2FtcD4gZGlyZWN0b3J5LiBQcm9ncmVzcyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkIGFzIGVhY2ggZmlsZSBpcyB1cGxvYWRlZC48L3A+Cis8cHJlPgorJmx0O2Z0cCBzZXJ2ZXI9ImZ0cC5udC5vcmciCisgICAgIHJlbW90ZWRpcj0iYzpcdXBsb2FkcyIKKyAgICAgdXNlcmlkPSJjb2RlciIKKyAgICAgcGFzc3dvcmQ9ImphdmExIgorICAgICBzZXBhcmF0b3I9IlwiCisgICAgIHZlcmJvc2U9InllcyImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9mdHAmZ3Q7PC9wcmU+CisKKzxoMz5HZXR0aW5nIGZpbGVzPC9oMz4KKzxwPkdldHRpbmcgZmlsZXMgZnJvbSBhbiBGVFAgc2VydmVyIHdvcmtzIHByZXR0eSBtdWNoIHRoZSBzYW1lIHdheSBhcyBzZW5kaW5nIHRoZW0gZG9lcy4gVGhlIG9ubHkKK2RpZmZlcmVuY2UgaXMgdGhhdCB0aGUgbmVzdGVkIGZpbGVzZXRzIHVzZSB0aGUgPHZhcj5yZW1vdGVkaXI8L3Zhcj4gYXR0cmlidXRlIGFzIHRoZSBiYXNlIGRpcmVjdG9yeQorZm9yIHRoZSBmaWxlcyBvbiB0aGUgRlRQIHNlcnZlciwgYW5kIHRoZSA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUgYXMgdGhlIGxvY2FsIGRpcmVjdG9yeSB0byBwdXQgdGhlCitmaWxlcyBpbnRvLiBUaGUgZmlsZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgRlRQIHNpdGUgaXMgcHJlc2VydmVkIG9uIHRoZSBsb2NhbCBtYWNoaW5lLjwvcD4KKworPHA+TG9nIGluIHRvIDxzYW1wPmZ0cC5hcGFjaGUub3JnPC9zYW1wPiBhcyA8c2FtcD5hbm9ueW1vdXM8L3NhbXA+IGFuZCByZWN1cnNpdmVseSBkb3dubG9hZAorYWxsIDxzYW1wPi5odG1sPC9zYW1wPiBmaWxlcyBmcm9tIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGF0IHVzZXIgaW50bwordGhlIDxzYW1wPmh0ZG9jcy9tYW51YWw8L3NhbXA+IGRpcmVjdG9yeSBvbiB0aGUgbG9jYWwgbWFjaGluZS48L3A+Cis8cHJlPgorJmx0O2Z0cCBhY3Rpb249ImdldCIKKyAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iaHRkb2NzL21hbnVhbCImZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouaHRtbCIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvZnRwJmd0OzwvcHJlPgorCis8cD5JZiA8c2FtcD5hcGFjaGUub3JnPC9zYW1wPiBldmVyIHN3aXRjaGVzIHRvIGEgVW5peCBGVFAgc2VydmVyIHRoYXQgdXNlcyB0aGUgbmV3IGFsbC1udW1lcmljCitmb3JtYXQgZm9yIHRpbWVzdGFtcHMsIHRoaXMgdmVyc2lvbiB3b3VsZCBiZWNvbWUgbmVjZXNzYXJ5LiBJdCB3b3VsZCBhY2NvbXBsaXNoIHRoZSBzYW1lCitmdW5jdGlvbmFsaXR5IGFzIHRoZSBwcmV2aW91cyBleGFtcGxlIGJ1dCB3b3VsZCBzdWNjZXNzZnVsbHkgaGFuZGxlIHRoZSBudW1lcmljCit0aW1lc3RhbXBzLiBUaGUgPHZhcj5zeXN0ZW1UeXBlS2V5PC92YXI+IGlzIG5vdCBuZWNlc3NhcnkgaGVyZSBidXQgaGVscHMgY2xhcmlmeSB3aGF0IGlzIGdvaW5nCitvbi48L3A+Cis8cHJlPgorJmx0O2Z0cCBhY3Rpb249ImdldCIKKyAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCisgICAgIHN5c3RlbVR5cGVLZXk9IlVOSVgiCisgICAgIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPSJ5eXl5LU1NLWRkIEhIOm1tIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmh0bWwiLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2Z0cCZndDs8L3ByZT4KKworPHA+TG9nIGludG8gYSBVTklYIEZUUCBzZXJ2ZXIgYXQgPHNhbXA+ZnRwLmh5cG90aGV0aWNhbC5mcjwvc2FtcD4gd2hpY2ggZGlzcGxheXMgZGF0ZXMgd2l0aCBGcmVuY2gKK25hbWVzIGluIFN0YW5kYXJkIEV1cm9wZWFuIGZvcm1hdCwgYXMgPHNhbXA+YW5vbnltb3VzPC9zYW1wPiwgYW5kIHJlY3Vyc2l2ZWx5IGRvd25sb2FkCithbGwgPHNhbXA+Lmh0bWw8L3NhbXA+IGZpbGVzIGZyb20gZGVmYXVsdCBkaXJlY3RvcnkgZm9yIHRoYXQgdXNlciBpbnRvCit0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBtYWNoaW5lLjwvcD4KKzxwcmU+CismbHQ7ZnRwIGFjdGlvbj0iZ2V0IgorICAgICBzZXJ2ZXI9ImZ0cC5oeXB0aGV0aWNhbC5mciIKKyAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCisgICAgIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnPSJkIE1NTSB5eXl5IgorICAgICByZWNlbnREYXRlRm9ybWF0Q29uZmlnPSJkIE1NTSBISDptbSIKKyAgICAgc2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnPSJmciImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKi5odG1sIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9mdHAmZ3Q7PC9wcmU+CisKKzxoMz5EZWxldGluZyBmaWxlczwvaDM+Cis8cD5BcyB5b3UndmUgcHJvYmFibHkgZ3Vlc3NlZCBieSBub3csIHlvdSB1c2UgbmVzdGVkIGZpbGVzZXQgZWxlbWVudHMgdG8gc2VsZWN0IHRoZSBmaWxlcyB0byBkZWxldGUKK2Zyb20gdGhlIHJlbW90ZSBGVFAgc2VydmVyLiAgQWdhaW4sIHRoZSBmaWxlc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBkaXJlY3RvcnksIG5vdCBhIGxvY2FsCitkaXJlY3RvcnkuICBJbiBmYWN0LCB0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIG9mIHRoZSBmaWxlc2V0IGlzIGlnbm9yZWQgY29tcGxldGVseS48L3A+CisKKzxwPkxvZyBpbiB0byA8c2FtcD5mdHAuYXBhY2hlLm9yZzwvc2FtcD4gYXMgPHNhbXA+YW5vbnltb3VzPC9zYW1wPiBhbmQgdHJ5IHRvIGRlbGV0ZQorYWxsIDxzYW1wPioudG1wPC9zYW1wPiBmaWxlcyBmcm9tIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgdGhhdCB1c2VyLiAgSWYgeW91IGRvbid0IGhhdmUgcGVybWlzc2lvbgordG8gZGVsZXRlIGEgZmlsZSwgYSA8Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLjwvcD4KKzxwcmU+CismbHQ7ZnRwIGFjdGlvbj0iZGVsIgorICAgICBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgorICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSImZ3Q7CiAgICAgJmx0O2ZpbGVzZXQmZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLnRtcCIvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLnRtcCIvJmd0OwogICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9mdHAmZ3Q7Ci08L3ByZT4KLTxwPkxvZ3MgaW4gdG8gPGNvZGU+ZnRwLmFwYWNoZS5vcmc8L2NvZGU+IGFzIDxjb2RlPmFub255bW91czwvY29kZT4gYW5kCi10cmllcyB0byBkZWxldGUgYWxsICoudG1wIGZpbGVzIGZyb20gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciB0aGF0IHVzZXIuCi1JZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGRlbGV0ZSBhIGZpbGUsIGEgQnVpbGRFeGNlcHRpb24gaXMgdGhyb3duLjwvcD4KKyZsdDsvZnRwJmd0OzwvcHJlPgorCiA8aDM+TGlzdGluZyBGaWxlczwvaDM+Cis8cD5HZXQgYSBmaWxlIGxpc3RpbmcgaW4gPHNhbXA+ZGF0YS9mdHAubGlzdGluZzwvc2FtcD4gb2YgYWxsIHRoZSBmaWxlcyBvbiB0aGUgRlRQIHNlcnZlciByZWxhdGl2ZQordG8gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IG9mIHRoZSA8c2FtcD5hbm9ueW1vdXM8L3NhbXA+IHVzZXIuIFRoZSBsaXN0aW5nIGlzIGluIHdoYXRldmVyIGZvcm1hdCB0aGUKK0ZUUCBzZXJ2ZXIgbm9ybWFsbHkgbGlzdHMgZmlsZXMuPC9wPgogPHByZT4KLSAgJmx0O2Z0cCBhY3Rpb249Imxpc3QiCi0gICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKLSAgICAgICB1c2VyaWQ9ImFub255bW91cyIKLSAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgotICAgICAgIGxpc3Rpbmc9ImRhdGEvZnRwLmxpc3RpbmciJmd0OwotICAgICZsdDtmaWxlc2V0Jmd0OwotICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKioiLyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICZsdDsvZnRwJmd0OwotPC9wcmU+Ci08cD5UaGlzIHByb3ZpZGVzIGEgZmlsZSBsaXN0aW5nIGluIDxjb2RlPmRhdGEvZnRwLmxpc3Rpbmc8L2NvZGU+IG9mIGFsbCB0aGUgZmlsZXMgb24KLXRoZSBGVFAgc2VydmVyIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBvZiB0aGUgPGNvZGU+YW5vbnltb3VzPC9jb2RlPgotdXNlci4gVGhlIGxpc3RpbmcgaXMgaW4gd2hhdGV2ZXIgZm9ybWF0IHRoZSBGVFAgc2VydmVyIG5vcm1hbGx5IGxpc3RzIGZpbGVzLjwvcD4KLQotPGgzPkNyZWF0aW5nIERpcmVjdG9yaWVzPC9oMz4KLTxwPk5vdGUgdGhhdCB3aXRoIHRoZSBta2RpciBhY3Rpb24sIHRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUKLXJlbW90ZWRpciBhdHRyaWJ1dGUuPC9wPgotPHByZT4KLSAgJmx0O2Z0cCBhY3Rpb249Im1rZGlyIgotICAgICAgIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCi0gICAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCi0gICAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSIKLSAgICAgICByZW1vdGVkaXI9InNvbWUvcmVtb3RlL2RpciIvJmd0OwotPC9wcmU+Ci08cD5UaGlzIGNyZWF0ZXMgdGhlIGRpcmVjdG9yeSA8Y29kZT5zb21lL3JlbW90ZS9kaXI8L2NvZGU+IGJlbmVhdGggdGhlIGRlZmF1bHQgcm9vdAotZGlyZWN0b3J5LiAgQXMgd2l0aCBhbGwgb3RoZXIgYWN0aW9ucywgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgY2hhcmFjdGVyIG11c3QgYmUgY29ycmVjdAotYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVzIG9mIHRoZSBGVFAgc2VydmVyLjwvcD4KLTxoMz5SZW1vdmluZyBEaXJlY3RvcmllczwvaDM+Ci1UaGlzIGFjdGlvbiB1c2VzIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnRzIHRvIAotc2VsZWN0IHRoZSBkaXJlY3RvcmllcyB0byByZW1vdmUgZnJvbSB0aGUgcmVtb3RlIEZUUCBzZXJ2ZXIuICBUaGUgCi1maWxlc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBkaXJlY3RvcnksIG5vdCBhIGxvY2FsIGRpcmVjdG9yeS4gCi1UaGUgZGlyIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZXNldCBpcyBpZ25vcmVkIGNvbXBsZXRlbHkuCi1UaGUgZGlyZWN0b3JpZXMgdG8gYmUgcmVtb3ZlZCBtdXN0IGJlIGVtcHR5LCBvciBjb250YWluIG9ubHkKLW90aGVyIGRpcmVjdG9yaWVzIHRoYXQgaGF2ZSBiZWVuIGFsc28gc2VsZWN0ZWQgdG8gYmUgcmVtb3ZlZCBieSB0aGUgZmlsZXNldHMKLXBhdHRlcm5zLCBvdGhlcndpc2UgYSBCdWlsZEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLUFsc28sIGlmIHlvdSBkb24ndCBoYXZlIHBlcm1pc3Npb24gdG8gcmVtb3ZlIGEgZGlyZWN0b3J5LCBhIEJ1aWxkRXhjZXB0aW9uIGlzIAotdGhyb3duLgotCi08cHJlPgotICAmbHQ7ZnRwIGFjdGlvbj0icm1kaXIiCi0gICAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKLSAgICAgICB1c2VyaWQ9ImFub255bW91cyIKLSAgICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgotICAgICAgIHJlbW90ZWRpcj0iL3NvbWVkaXIiICZndDsKLSAgICAmbHQ7ZmlsZXNldCZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImRpcmEiLyZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9ImRpcmIvKioiLyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICZsdDsvZnRwJmd0OwotPC9wcmU+Ci08cD5Mb2dzIGluIHRvIDxjb2RlPmZ0cC5hcGFjaGUub3JnPC9jb2RlPiBhcyA8Y29kZT5hbm9ueW1vdXM8L2NvZGU+IGFuZAotdHJpZXMgdG8gcmVtb3ZlIDxjb2RlPi9zb21lZGlyL2RpcmE8L2NvZGU+IGRpcmVjdG9yeSBhbmQKLWFsbCB0aGUgZGlyZWN0b3JpZXMgdHJlZSBzdGFydGluZyBhdCwgYW5kIGluY2x1ZGluZywgPGNvZGU+L3NvbWVkaXIvZGlyYjwvY29kZT4uCi1XaGVuIHJlbW92aW5nIHRoZSA8Y29kZT4vc29tZWRpci9kaXJiPC9jb2RlPiB0cmVlLAotaXQgd2lsbCBzdGFydCBhdCB0aGUgbGVhdmVzIG1vdmluZyB1cCB0byB0aGUgcm9vdCwgc28gdGhhdCB3aGVuCi1pdCB0cmllcyB0byByZW1vdmUgYSBkaXJlY3RvcnkgaXQgaXMgc3VyZSBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIGl0IGFyZQotYWxyZWFkeSByZW1vdmVkLgotT2J2aW91c2x5IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHRyZWUgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBkZWxldGVkLgotPC9wPgotPHA+QXMgYW4gZXhhbXBsZSBzdXBwb3NlIHlvdSB3YW50IHRvIGRlbGV0ZSBldmVyeXRoaW5nIGNvbnRhaW5lZCBpbnRvIAotPGNvZGU+L3NvbWVkaXI8L2NvZGU+LCBzbyBpbnZva2UgZmlyc3QgdGhlIDxjb2RlPiZsdDtmdHAmZ3Q7PC9jb2RlPiB0YXNrIHdpdGgKLTxjb2RlPmFjdGlvbj0iZGVsZXRlIjwvY29kZT4sIHRoZW4gd2l0aAotPGNvZGU+YWN0aW9uPSJybWRpciI8L2NvZGU+IHNwZWNpZnlpbmcgaW4gYm90aCBjYXNlcwotPGNvZGU+cmVtb3RlZGlyPSIvc29tZWRpciI8L2NvZGU+IGFuZAotCi08cHJlPgorJmx0O2Z0cCBhY3Rpb249Imxpc3QiCisgICAgIHNlcnZlcj0iZnRwLmFwYWNoZS5vcmciCisgICAgIHVzZXJpZD0iYW5vbnltb3VzIgorICAgICBwYXNzd29yZD0ibWVAbXlvcmcuY29tIgorICAgICBsaXN0aW5nPSJkYXRhL2Z0cC5saXN0aW5nIiZndDsKICAgICAmbHQ7ZmlsZXNldCZndDsKICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKioiLyZndDsKICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT4KKyZsdDsvZnRwJmd0OzwvcHJlPgogCi1UaGUgZGlyZWN0b3J5IHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+cmVtb3RlZGlyPC9jb2RlPiBwYXJhbWV0ZXIgaXMgbmV2ZXIKLXNlbGVjdGVkIGZvciByZW1vdmUsIHNvIGlmIHlvdSBuZWVkIHRvIHJlbW92ZSBpdCwgc3BlY2lmeSBpdHMgcGFyZW50IGluCi08Y29kZT5yZW1vdGVkaXI8L2NvZGU+IHBhcmFtZXRlciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgCi08Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IHBhdHRlcm4sIGxpa2UgPGNvZGU+InNvbWVkaXIvKioiPC9jb2RlPi4KLTwvcD4KKzxoMz5DcmVhdGluZyBkaXJlY3RvcmllczwvaDM+Cis8cD5Ob3RlIHRoYXQgd2l0aCB0aGUgPHE+bWtkaXI8L3E+IGFjdGlvbiwgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUgaXMgc3BlY2lmaWVkIHVzaW5nCit0aGUgPHZhcj5yZW1vdGVkaXI8L3Zhcj4gYXR0cmlidXRlLjwvcD4KKzxwPkNyZWF0ZSB0aGUgZGlyZWN0b3J5IDxzYW1wPnNvbWUvcmVtb3RlL2Rpcjwvc2FtcD4gYmVuZWF0aCB0aGUgZGVmYXVsdCByb290IGRpcmVjdG9yeS4gQXMgd2l0aCBhbGwKK290aGVyIGFjdGlvbnMsIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNoYXJhY3RlciBtdXN0IGJlIGNvcnJlY3QgYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVzIG9mIHRoZSBGVFAKK3NlcnZlci48L3A+Cis8cHJlPgorJmx0O2Z0cCBhY3Rpb249Im1rZGlyIgorICAgICBzZXJ2ZXI9ImZ0cC5hcGFjaGUub3JnIgorICAgICB1c2VyaWQ9ImFub255bW91cyIKKyAgICAgcGFzc3dvcmQ9Im1lQG15b3JnLmNvbSIKKyAgICAgcmVtb3RlZGlyPSJzb21lL3JlbW90ZS9kaXIiLyZndDs8L3ByZT4KIAorPGgzPlJlbW92aW5nIGRpcmVjdG9yaWVzPC9oMz4KKzxwPlRoaXMgYWN0aW9uIHVzZXMgbmVzdGVkIGZpbGVzZXQgZWxlbWVudHMgdG8gc2VsZWN0IHRoZSBkaXJlY3RvcmllcyB0byByZW1vdmUgZnJvbSB0aGUgcmVtb3RlIEZUUAorc2VydmVyLiBUaGUgZmlsZXNldHMgYXJlIHJlbGF0aXZlIHRvIHRoZSByZW1vdGUgZGlyZWN0b3J5LCBub3QgYSBsb2NhbCBkaXJlY3RvcnkuIFRoZSA8dmFyPmRpcjwvdmFyPgorYXR0cmlidXRlIG9mIHRoZSBmaWxlc2V0IGlzIGlnbm9yZWQgY29tcGxldGVseS4gVGhlIGRpcmVjdG9yaWVzIHRvIGJlIHJlbW92ZWQgbXVzdCBiZSBlbXB0eSwgb3IKK2NvbnRhaW4gb25seSBvdGhlciBkaXJlY3RvcmllcyB0aGF0IGhhdmUgYmVlbiBhbHNvIHNlbGVjdGVkIHRvIGJlIHJlbW92ZWQgYnkgdGhlIGZpbGVzZXRzIHBhdHRlcm5zLAorb3RoZXJ3aXNlIGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgdGhyb3duLiBBbHNvLCBpZiB5b3UgZG9uJ3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlbW92ZQorYSBkaXJlY3RvcnksIGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+IGlzIHRocm93bi48L3A+CisKKzxwPkxvZyBpbiB0byA8c2FtcD5mdHAuYXBhY2hlLm9yZzwvc2FtcD4gYXMgPHNhbXA+YW5vbnltb3VzPC9zYW1wPiBhbmQgdHJ5IHRvCityZW1vdmUgPHNhbXA+L3NvbWVkaXIvZGlyYTwvc2FtcD4gZGlyZWN0b3J5IGFuZCBhbGwgdGhlIGRpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGF0LCBhbmQKK2luY2x1ZGluZywgPHNhbXA+L3NvbWVkaXIvZGlyYjwvc2FtcD4uICBXaGVuIHJlbW92aW5nIHRoZSA8c2FtcD4vc29tZWRpci9kaXJiPC9zYW1wPiB0cmVlLCB0aGUgdGFzaworc3RhcnRzIGF0IHRoZSBsZWF2ZXMgbW92aW5nIHVwIHRvIHRoZSByb290LCBzbyB0aGF0IHdoZW4gaXQgdHJpZXMgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IGl0IGlzIHN1cmUKK2FsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgaXQgYXJlIGFscmVhZHkgcmVtb3ZlZC4gIE9idmlvdXNseSBhbGwgdGhlIGZpbGVzIGluIHRoZSB0cmVlIG11c3QgaGF2ZQorYmVlbiBhbHJlYWR5IGRlbGV0ZWQuPC9wPgorPHByZT4KKyZsdDtmdHAgYWN0aW9uPSJybWRpciIKKyAgICAgc2VydmVyPSJmdHAuYXBhY2hlLm9yZyIKKyAgICAgdXNlcmlkPSJhbm9ueW1vdXMiCisgICAgIHBhc3N3b3JkPSJtZUBteW9yZy5jb20iCisgICAgIHJlbW90ZWRpcj0iL3NvbWVkaXIiICZndDsKKyAgICAmbHQ7ZmlsZXNldCZndDsKKyAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iZGlyYSIvJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJkaXJiLyoqIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9mdHAmZ3Q7PC9wcmU+Cis8cD5BcyBhbiBleGFtcGxlIHN1cHBvc2UgeW91IHdhbnQgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgY29udGFpbmVkIGluIDxzYW1wPi9zb21lZGlyPC9zYW1wPiwgc28gaW52b2tlCitmaXJzdCB0aGUgPGNvZGU+Jmx0O2Z0cCZndDs8L2NvZGU+IHRhc2sgd2l0aCA8dmFyPmFjdGlvbjwvdmFyPj08cT5kZWxldGU8L3E+LCB0aGVuCit3aXRoIDx2YXI+YWN0aW9uPC92YXI+PTxxPnJtZGlyPC9xPiBzcGVjaWZ5aW5nIGluIGJvdGggY2FzZXMgPHZhcj5yZW1vdGVkaXI8L3Zhcj49PHE+L3NvbWVkaXI8L3E+CithbmQ8L3A+Cis8cHJlPgorJmx0O2ZpbGVzZXQmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKioiLyZndDsKKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KKzxwPlRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGluIHRoZSA8dmFyPnJlbW90ZWRpcjwvdmFyPiBwYXJhbWV0ZXIgaXMgbmV2ZXIgc2VsZWN0ZWQgZm9yIHJlbW92ZSwgc28gaWYKK3lvdSBuZWVkIHRvIHJlbW92ZSBpdCwgc3BlY2lmeSBpdHMgcGFyZW50IGluIDx2YXI+cmVtb3RlZGlyPC92YXI+IHBhcmFtZXRlciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUKKzxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gcGF0dGVybiwgbGlrZSA8c2FtcD5zb21lZGlyLyoqPC9zYW1wPi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2dlbmtleS5odG1sIGIvbWFudWFsL1Rhc2tzL2dlbmtleS5odG1sCmluZGV4IGUwNTJiNDMuLmFkNmU0NTEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9nZW5rZXkuaHRtbAorKysgYi9tYW51YWwvVGFza3MvZ2Vua2V5Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDggKzE1LDEwMiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+R2VuS2V5IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImdlbmtleSI+R2VuS2V5PC9hPjwvaDI+Cis8aDIgaWQ9ImdlbmtleSI+R2VuS2V5PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5HZW5lcmF0ZXMgYSBrZXkgaW4gYSBrZXlzdG9yZS4gPC9wPgorPHA+R2VuZXJhdGVzIGEga2V5IGluIGEga2V5c3RvcmUuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFsaWFzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBhbGlhcyB0byBhZGQgdW5kZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLjwvdGQ+CisgICAgPHRkPmFsaWFzPC90ZD4KKyAgICA8dGQ+dGhlIGFsaWFzIHRvIGFkZCB1bmRlcjwvdGQ+CisgICAgPHRkPlllcy48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdG9yZXBhc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQgZm9yIGtleXN0b3JlIGludGVncml0eS4gTXVzdAotCWJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyBsb25nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcy48L3RkPgorICAgIDx0ZD5zdG9yZXBhc3M8L3RkPgorICAgIDx0ZD5wYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5LiBNdXN0IGJlIGF0IGxlYXN0IDYgY2hhcmFjdGVycyBsb25nPC90ZD4KKyAgICA8dGQ+WWVzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtleXN0b3JlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtleXN0b3JlIGxvY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+a2V5c3RvcmU8L3RkPgorICAgIDx0ZD5rZXlzdG9yZSBsb2NhdGlvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RvcmV0eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtleXN0b3JlIHR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdG9yZXR5cGU8L3RkPgorICAgIDx0ZD5rZXlzdG9yZSB0eXBlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZXlwYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50KTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmtleXBhc3M8L3RkPgorICAgIDx0ZD5wYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNpZ2FsZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYWxnb3JpdGhtIHRvIHVzZSBpbiBzaWduaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2lnYWxnPC90ZD4KKyAgICA8dGQ+dGhlIGFsZ29yaXRobSB0byB1c2UgaW4gc2lnbmluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5YWxnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBtZXRob2QgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBuYW1lLXZhbHVlIHBhaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5rZXlhbGc8L3RkPgorICAgIDx0ZD50aGUgbWV0aG9kIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgbmFtZS12YWx1ZSBwYWlyPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPih0cnVlIHwgZmFsc2UpIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZG5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBmb3IgZW50aXR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcyBpZiBkbmFtZSBlbGVtZW50IHVuc3BlY2lmaWVkPC90ZD4KKyAgICA8dGQ+ZG5hbWU8L3RkPgorICAgIDx0ZD5UaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGZvciBlbnRpdHk8L3RkPgorICAgIDx0ZD5ZZXMgdW5sZXNzIDxjb2RlPiZsdDtkbmFtZSZndDs8L2NvZGU+IGVsZW1lbnQgaXMgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2FuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdWJqZWN0IGFsdGVybmF0aXZlIG5hbWUgZm9yIGVudGl0eS4gUmVxdWlyZXMKKyAgICA8dGQ+c2FuYW1lPC90ZD4KKyAgICA8dGQ+VGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSBmb3IgZW50aXR5LiBSZXF1aXJlcwogIEphdmEgNyBvciBoaWdoZXIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWxpZGl0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4oaW50ZWdlcikgaW5kaWNhdGVzIGhvdyBtYW55IGRheXMgY2VydGlmaWNhdGUgaXMgdmFsaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD52YWxpZGl0eTwvdGQ+CisgICAgPHRkPihpbnRlZ2VyKSBpbmRpY2F0ZXMgaG93IG1hbnkgZGF5cyBjZXJ0aWZpY2F0ZSBpcyB2YWxpZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c2l6ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4oaW50ZWdlcikgaW5kaWNhdGVzIHRoZSBzaXplIG9mIGtleSBnZW5lcmF0ZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5rZXlzaXplPC90ZD4KKyAgICA8dGQ+KGludGVnZXIpIGluZGljYXRlcyB0aGUgc2l6ZSBvZiBrZXkgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+QWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNwZWNpZnkgdGhlIGRpc3Rpbmd1aXNoZWQgbmFtZSBieSBjcmVhdGluZyBhCi1zdWItZWxlbWVudCBuYW1lZCBkbmFtZSBhbmQgcG9wdWxhdGluZyBpdCB3aXRoIHBhcmFtIGVsZW1lbnRzIHRoYXQKLWhhdmUgYSBuYW1lIGFuZCBhIHZhbHVlLiBXaGVuIHVzaW5nIHRoZSBzdWJlbGVtZW50IGl0IGlzIGF1dG9tYXRpY2FsbHkKLWVuY29kZWQgcHJvcGVybHkgYW5kIGNvbW1hcyAoJnF1b3Q7PGNvZGU+LDwvY29kZT4mcXVvdDspIGFyZSByZXBsYWNlZAotd2l0aCAmcXVvdDs8Y29kZT5cLDwvY29kZT4mcXVvdDsuPC9wPgotCi08cD5UaGUgZm9sbG93aW5nIHR3byBleGFtcGxlcyBhcmUgaWRlbnRpY2FsOiA8L3A+Cis8cD5BbHRlcm5hdGl2ZWx5IHlvdSBjYW4gc3BlY2lmeSB0aGUgZGlzdGluZ3Vpc2hlZCBuYW1lIGJ5IGNyZWF0aW5nIGEgPGNvZGU+Jmx0O2RuYW1lJmd0OzwvY29kZT4KK3N1Yi1lbGVtZW50IGFuZCBwb3B1bGF0aW5nIGl0IHdpdGggPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudHMgdGhhdCBoYXZlIGEgPHZhcj5uYW1lPC92YXI+CithbmQgYSA8dmFyPnZhbHVlPC92YXI+LiBXaGVuIHVzaW5nIHRoZSBzdWJlbGVtZW50LCBpdCBpcyBhdXRvbWF0aWNhbGx5IGVuY29kZWQgcHJvcGVybHkgYW5kIGNvbW1hcworKDxxPiw8L3E+KSBhcmUgcmVwbGFjZWQgd2l0aCA8cT5cLDwvcT4uPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtnZW5rZXkgYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsgCi0gIGRuYW1lPSZxdW90O0NOPUFudCBHcm91cCwgT1U9SmFrYXJ0YSBEaXZpc2lvbiwgTz1BcGFjaGUub3JnLCBDPVVTJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlRoZSBmb2xsb3dpbmcgdHdvIGV4YW1wbGVzIGFyZSBpZGVudGljYWw6PC9wPgorPHByZT4KKyZsdDtnZW5rZXkgYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsKKyAgICAgICAgZG5hbWU9JnF1b3Q7Q049QW50IEdyb3VwLCBPVT1KYWthcnRhIERpdmlzaW9uLCBPPUFwYWNoZS5vcmcsIEM9VVMmcXVvdDsvJmd0OzwvcHJlPgogCi08YmxvY2txdW90ZT4KLSAgPHByZT4KLSZsdDtnZW5rZXkgYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsgJmd0OworPHByZT4KKyZsdDtnZW5rZXkgYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsmZ3Q7CiAgICZsdDtkbmFtZSZndDsKICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtDTiZxdW90OyB2YWx1ZT0mcXVvdDtBbnQgR3JvdXAmcXVvdDsvJmd0OwogICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O09VJnF1b3Q7IHZhbHVlPSZxdW90O0pha2FydGEgRGl2aXNpb24mcXVvdDsvJmd0OwpAQCAtMTIzLDkgKzExOCw2IEBACiAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7QyZxdW90OyAgdmFsdWU9JnF1b3Q7VVMmcXVvdDsvJmd0OwogICAmbHQ7L2RuYW1lJmd0OwogJmx0Oy9nZW5rZXkmZ3Q7PC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvZ2V0Lmh0bWwgYi9tYW51YWwvVGFza3MvZ2V0Lmh0bWwKaW5kZXggYTJjOWI3ZS4uMjhhNjgyNiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2dldC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9nZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDIyOSArMTUsMjM1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5HZXQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZ2V0Ij5HZXQ8L2E+PC9oMj4KKzxoMiBpZD0iZ2V0Ij5HZXQ8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkdldHMgZmlsZXMgZnJvbSBVUkxzLiAgV2hlbiB0aGUgdmVyYm9zZSBvcHRpb24gaXMgJnF1b3Q7b24mcXVvdDssIHRoaXMgdGFzawotZGlzcGxheXMgYSAnLicgZm9yIGV2ZXJ5IDEwMCBLYiByZXRyaWV2ZWQuIEFueSBVUkwgc2NoZW1hIHN1cHBvcnRlZCBieQotdGhlIHJ1bnRpbWUgaXMgdmFsaWQgaGVyZSwgaW5jbHVkaW5nIGh0dHA6LCBmdHA6IGFuZCBqYXI6OyAKLTwvcD4KLVRoZSA8aT51c2V0aW1lc3RhbXA8L2k+IG9wdGlvbiBlbmFibGVzIHlvdSB0byBjb250cm9sIGRvd25sb2FkcyBzbyB0aGF0IHRoZSByZW1vdGUgZmlsZSBpcwotb25seSBmZXRjaGVkIGlmIG5ld2VyIHRoYW4gdGhlIGxvY2FsIGNvcHkuIElmIHRoZXJlIGlzIG5vIGxvY2FsIGNvcHksIHRoZSBkb3dubG9hZCBhbHdheXMgdGFrZXMgCi1wbGFjZS4gV2hlbiBhIGZpbGUgaXMgZG93bmxvYWRlZCwgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIGlzIHNldCB0byB0aGUgcmVtb3RlIHRpbWVzdGFtcC4gCi1OQjogVGhpcyB0aW1lc3RhbXAgZmFjaWxpdHkgb25seSB3b3JrcyBvbiBkb3dubG9hZHMgdXNpbmcgdGhlIEhUVFAgcHJvdG9jb2wuIAotPHA+Ci1BIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBjYW4gYmUgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGJhc2ljICdzbGlnaHRseSBlbmNvZGVkCi1wbGFpbiB0ZXh0JyBhdXRoZW50aWNhdGlvbiBpcyB1c2VkLiBUaGlzIGlzIG9ubHkgc2VjdXJlIG92ZXIgYW4gSFRUUFMgbGluay4KLTwvcD4KKzxwPkdldHMgZmlsZXMgZnJvbSBVUkxzLiAgV2hlbiB0aGUgPHZhcj52ZXJib3NlPC92YXI+IG9wdGlvbiBpcyA8cT5vbjwvcT4sIHRoaXMgdGFzayBkaXNwbGF5cworYSA8cT4uPC9xPiBmb3IgZXZlcnkgMTAwIEtiIHJldHJpZXZlZC4gQW55IFVSTCBzY2hlbWEgc3VwcG9ydGVkIGJ5IHRoZSBydW50aW1lIGlzIHZhbGlkIGhlcmUsCitpbmNsdWRpbmcgPHE+aHR0cDo8L3E+LCA8cT5odHRwczo8L3E+LCA8cT5mdHA6PC9xPiBhbmQgPHE+amFyOjwvcT4uPC9wPgorPHA+VGhlIDx2YXI+dXNldGltZXN0YW1wPC92YXI+IG9wdGlvbiBlbmFibGVzIHlvdSB0byBjb250cm9sIGRvd25sb2FkcyBzbyB0aGF0IHRoZSByZW1vdGUgZmlsZSBpcworb25seSBmZXRjaGVkIGlmIG5ld2VyIHRoYW4gdGhlIGxvY2FsIGNvcHkuIElmIHRoZXJlIGlzIG5vIGxvY2FsIGNvcHksIHRoZSBkb3dubG9hZCBhbHdheXMgdGFrZXMKK3BsYWNlLiBXaGVuIGEgZmlsZSBpcyBkb3dubG9hZGVkLCB0aGUgdGltZXN0YW1wIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUgaXMgc2V0IHRvIHRoZSByZW1vdGUKK3RpbWVzdGFtcC4gIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0aW1lc3RhbXAgZmFjaWxpdHkgb25seSB3b3JrcyBvbiBkb3dubG9hZHMgdXNpbmcgdGhlIEhUVFAKK3Byb3RvY29sLjwvcD4KKzxwPkEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGNhbiBiZSBzcGVjaWZpZWQsIGluIHdoaWNoIGNhc2UgYmFzaWMgKCdzbGlnaHRseSBlbmNvZGVkIHBsYWluIHRleHQnKQorYXV0aGVudGljYXRpb24gaXMgdXNlZC4gVGhpcyBpcyBvbmx5IHNlY3VyZSBvdmVyIGFuIEhUVFBTIGxpbmsuPC9wPgogCi08cD48Yj5Qcm94aWVzPC9iPi4gU2luY2UgQXBhY2hlIEFudCAxLjcuMCwgQW50IHJ1bm5pbmcgb24gSmF2YTEuNSBvciBsYXRlciBjYW4KLSAgPGEgaHJlZj0iLi4vcHJveHkuaHRtbCI+dXNlIHRoZSBwcm94eSBzZXR0aW5ncyBvZiB0aGUgb3BlcmF0aW5nCi0gICAgc3lzdGVtPC9hPiBpZiBlbmFibGVkIHdpdGggdGhlCi0gIDxjb2RlPi1hdXRvcHJveHk8L2NvZGU+IG9wdGlvbi4gVGhlcmUgaXMgYWxzbyB0aGUKLSAgPGEgaHJlZj0iLi4vVGFza3Mvc2V0cHJveHkuaHRtbCI+Jmx0O3NldHByb3h5Jmd0OzwvYT4gdGFzawotICBmb3IgZWFybGllciBKYXZhIHZlcnNpb25zLiBXaXRoIHByb3hpZXMgdHVybmVkCi0gIG9uLCA8Y29kZT4mbHQ7Z2V0Jmd0OzwvY29kZT4gcmVxdWVzdHMgYWdhaW5zdCBsb2NhbGhvc3QgbWF5IG5vdCB3b3JrCi0gIGFzIGV4cGVjdGVkLCBpZiB0aGUgcmVxdWVzdCBpcyByZWxheWVkIHRvIHRoZSBwcm94eS48L3A+Ci0gCis8cD48c3Ryb25nPlByb3hpZXM8L3N0cm9uZz4uIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4wPC9lbT4sIEFudCBydW5uaW5nIG9uIEphdmEgNSBvciBsYXRlcgorY2FuIDxhIGhyZWY9Ii4uL3Byb3h5Lmh0bWwiPnVzZSB0aGUgcHJveHkgc2V0dGluZ3Mgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW08L2E+IGlmIGVuYWJsZWQgd2l0aAordGhlIDxrYmQ+LWF1dG9wcm94eTwva2JkPiBjb21tYW5kIGxpbmUgb3B0aW9uLiBUaGVyZSBpcyBhbHNvCit0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2V0cHJveHkuaHRtbCI+Jmx0O3NldHByb3h5Jmd0OzwvYT4gdGFzayBmb3IgZWFybGllciBKYXZhIHZlcnNpb25zLiBXaXRoCitwcm94aWVzIHR1cm5lZCBvbiwgPGNvZGU+Jmx0O2dldCZndDs8L2NvZGU+IHJlcXVlc3RzIGFnYWluc3QgbG9jYWxob3N0IG1heSBub3Qgd29yayBhcyBleHBlY3RlZCwgaWYKK3RoZSByZXF1ZXN0IGlzIHJlbGF5ZWQgdG8gdGhlIHByb3h5LjwvcD4KKwogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIFVSTCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGEgZmlsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb248L3RkPgorICAgIDx0ZD5zcmM8L3RkPgorICAgIDx0ZD50aGUgVVJMIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgYSBmaWxlLjwvdGQ+CisgICAgPHRkPlllcywgb3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IHdoZXJlIHRvIHN0b3JlIHRoZQotICAgICAgcmV0cmlldmVkIGZpbGUocykuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPmRlc3Q8L3RkPgorICAgIDx0ZD50aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgdGhlIHJldHJpZXZlZCBmaWxlKHMpLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2hvdyB2ZXJib3NlIHByb2dyZXNzIGluZm9ybWF0aW9uICgmcXVvdDtvbiZxdW90Oy8mcXVvdDtvZmYmcXVvdDspLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCAiZmFsc2UiPC90ZD4KKyAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgPHRkPnNob3cgdmVyYm9zZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiAoPHE+b258b2ZmPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b2ZmPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkxvZyBlcnJvcnMgb25seS4oJnF1b3Q7dHJ1ZSZxdW90Oy8mcXVvdDtmYWxzZSZxdW90OykuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0ICJmYWxzZSI8L3RkPgorICAgIDx0ZD5xdWlldDwvdGQ+CisgICAgPHRkPkxvZyBlcnJvcnMgb25seS4oPHE+dHJ1ZXxmYWxzZTwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWVycm9yczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2cgZXJyb3JzIGJ1dCBkb24ndCB0cmVhdCBhcyBmYXRhbC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgImZhbHNlIjwvdGQ+CisgICAgPHRkPmlnbm9yZWVycm9yczwvdGQ+CisgICAgPHRkPkxvZyBlcnJvcnMgYnV0IGRvbid0IHRyZWF0IGFzIGZhdGFsLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXRpbWVzdGFtcDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb25kaXRpb25hbGx5IGRvd25sb2FkIGEgZmlsZSBiYXNlZCBvbiB0aGUgdGltZXN0YW1wIG9mIHRoZQotICAgIGxvY2FsIGNvcHkuIEhUVFAgb25seTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCAiZmFsc2UiPC90ZD4KKyAgICA8dGQ+dXNldGltZXN0YW1wPC90ZD4KKyAgICA8dGQ+Y29uZGl0aW9uYWxseSBkb3dubG9hZCBhIGZpbGUgYmFzZWQgb24gdGhlIHRpbWVzdGFtcCBvZiB0aGUgbG9jYWwgY29weS4gSFRUUCBvbmx5PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWUgZm9yICdCQVNJQycgaHR0cCBhdXRoZW50aWNhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5pZiBwYXNzd29yZCBpcyBzZXQ8L3RkPgotICA8L3RyPiAgCi0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkOiByZXF1aXJlZCA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+aWYgdXNlcm5hbWUgaXMgc2V0PC90ZD4KLSAgPC90cj4gIAotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXh0aW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1heGltdW0gdGltZSBpbiBzZWNvbmRzIGEgc2luZ2xlIGRvd25sb2FkIG1heSB0YWtlLAotICAgICAgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaW50ZXJydXB0ZWQgYW5kIHRyZWF0ZWQgbGlrZSBhIGRvd25sb2FkCi0gICAgICBlcnJvci4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzogZGVmYXVsdCAwIHdoaWNoIG1lYW5zIG5vCi0gICAgICBtYXhpbXVtIHRpbWU8L3RkPgotICA8L3RyPiAgCi0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJldHJpZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiBhdHRlbXB0cyB0byBtYWtlIGZvciBvcGVuaW5nIHRoZSBVUkkuPGJyLz4KLSAgICAgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgbWlzbGVhZGluZyBhcyBhIHZhbHVlIG9mIDEgbWVhbnMKLSAgICAgICJkb24ndCByZXRyeSBvbiBlcnJvciIgYW5kIGEgdmFsdWUgb2YgMCBtZWFudCBkb24ndCBldmVuIHRyeSB0bwotICAgICAgcmVhY2ggdGhlIFVSSSBhdCBhbGwuPGJyLz4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCAiMyI8L3RkPgorICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgPHRkPnVzZXJuYW1lIGZvciBiYXNpYyBIVFRQIGF1dGhlbnRpY2F0aW9uPC90ZD4KKyAgICA8dGQ+WWVzLCBpZiA8dmFyPnBhc3N3b3JkPC92YXI+IGlzIHNldDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNraXBleGlzdGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5za2lwIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbTxici8+Ci0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgImZhbHNlIjwvdGQ+CisgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQgZm9yIGJhc2ljIEhUVFAgYXV0aGVudGljYXRpb248L3RkPgorICAgIDx0ZD5ZZXMgaWYgPHZhcj51c2VybmFtZTwvdmFyPiBpcyBzZXQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1heHRpbWU8L3RkPgorICAgIDx0ZD5NYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyBhIHNpbmdsZSBkb3dubG9hZCBtYXkgdGFrZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgaW50ZXJydXB0ZWQgYW5kCisgICAgICB0cmVhdGVkIGxpa2UgYSBkb3dubG9hZCBlcnJvci4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjA8L3E+IHdoaWNoIG1lYW5zCisgICAgICB1bmxpbWl0ZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnJldHJpZXM8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIGF0dGVtcHRzIHRvIG1ha2UgZm9yIG9wZW5pbmcgdGhlIFVSSS48YnIvPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMKKyAgICAgIG1pc2xlYWRpbmcgYXMgYSB2YWx1ZSBvZiA8cT4xPC9xPiBtZWFucyAiZG9uJ3QgcmV0cnkgb24gZXJyb3IiIGFuZCBhIHZhbHVlIG9mIDxxPjA8L3E+IG1lYW50CisgICAgICBkb24ndCBldmVuIHRyeSB0byByZWFjaCB0aGUgVVJJIGF0IGFsbC48YnIvPjxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjM8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5za2lwZXhpc3Rpbmc8L3RkPgorICAgIDx0ZD5za2lwIGZpbGVzIHRoYXQgYWxyZWFkeSBleGlzdCBvbiB0aGUgbG9jYWwgZmlsZXN5c3RlbTxici8+PGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmh0dHB1c2VjYWNoZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SFRUUCBvbmx5IC0gaWYgdHJ1ZSwgYWxsb3cgY2FjaGluZyBhdCB0aGUKLSAgICAgIEh0dHBVcmxDb25uZWN0aW9uIGxldmVsLiAgaWYgZmFsc2UsIHR1cm4gY2FjaGluZyBvZmYuPGJyLz4KLSAgICAgIDxiPk5vdGU8L2I+IHRoaXMgaXMgb25seSBhIGhpbnQgdG8gdGhlIHVuZGVybHlpbmcgVXJsQ29ubmVjdGlvbgotICAgICAgY2xhc3MsIGltcGxlbWVudGF0aW9ucyBhbmQgcHJveGllcyBhcmUgZnJlZSB0byBpZ25vcmUgdGhlCi0gICAgICBzZXR0aW5nLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCAidHJ1ZSI8L3RkPgorICAgIDx0ZD5odHRwdXNlY2FjaGVzPC90ZD4KKyAgICA8dGQ+SFRUUCBvbmx5Jm1kYXNoO2lmIDxxPnRydWU8L3E+LCBhbGxvdyBjYWNoaW5nIGF0IHRoZSA8Y29kZT5IdHRwVXJsQ29ubmVjdGlvbjwvY29kZT4gbGV2ZWwsCisgICAgaWYgPHE+ZmFsc2U8L3E+LCB0dXJuIGNhY2hpbmcgb2ZmLjxici8+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoaXMgaXMgb25seSBhIGhpbnQgdG8gdGhlCisgICAgdW5kZXJseWluZyA8Y29kZT5VcmxDb25uZWN0aW9uPC9jb2RlPiBjbGFzcywgaW1wbGVtZW50YXRpb25zIGFuZCBwcm94aWVzIGFyZSBmcmVlIHRvIGlnbm9yZSB0aGUKKyAgICBzZXR0aW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcmFnZW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVzZXItQWdlbnQgSFRUUCBoZWFkZXIgdG8gc2VuZCwgc3RhcnRpbmcgd2l0aCBBbnQKLSAgICAgIDEuOS4zIEFudCB3aWxsIHNwZWNpZnkgYSBVc2VyLUFnZW50IGhlYWRlciBvZiAiQXBhY2hlIEFudCBWRVJTSU9OIgotICAgICAgdW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhpcyBhdHRyaWJ1dGU8YnIvPgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dXNlcmFnZW50PC90ZD4KKyAgICA8dGQ+PGNvZGU+VXNlci1BZ2VudDwvY29kZT4gSFRUUCBoZWFkZXIgdG8gc2VuZC48YnIvPjxlbT5zaW5jZSBBbnQgMS45LjM8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5BcGFjaGUgQW50IFZFUlNJT048L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ5R3ppcEVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gc2V0IHRvIHRydWUgQW50IHdpbGwgdGVsbCB0aGUgc2VydmVyIGl0IGlzCi0gICAgICB3aWxsaW5nIHRvIGFjY2VwdCBnemlwIGVuY29kaW5nIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGRhdGEgdG8KLSAgICAgIHRyYW5zZmVyIGFuZCB1bmNvbXByZXNzIHRoZSBjb250ZW50IHRyYW5zcGFyZW50bHkuPGJyLz4KLSAgICAgIFNldHRpbmcgdGhpcyB0byB0cnVlIGFsc28gbWVhbnMgQW50IHdpbGwgdW5jb21wcmVzcwotICAgICAgPGNvZGU+LnRhci5nejwvY29kZT4gYW5kIHNpbWlsYXIgZmlsZXMgYXV0b21hdGljYWxseS48YnIvPgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNTwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0ICJmYWxzZSI8L3RkPgorICAgIDx0ZD50cnlHemlwRW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5XaGVuIHNldCB0byA8cT50cnVlPC9xPiwgQW50IHdpbGwgdGVsbCB0aGUgc2VydmVyIGl0IGlzIHdpbGxpbmcgdG8gYWNjZXB0IGd6aXAgZW5jb2RpbmcgdG8KKyAgICAgIHJlZHVjZSB0aGUgYW1vdW50IG9mIGRhdGEgdG8gdHJhbnNmZXIgYW5kIHVuY29tcHJlc3MgdGhlIGNvbnRlbnQgdHJhbnNwYXJlbnRseS48YnIvPlNldHRpbmcKKyAgICAgIHRoaXMgdG8gPHE+dHJ1ZTwvcT4gYWxzbyBtZWFucyBBbnQgd2lsbCB1bmNvbXByZXNzIDxjb2RlPi50YXIuZ3o8L2NvZGU+IGFuZCBzaW1pbGFyIGZpbGVzCisgICAgICBhdXRvbWF0aWNhbGx5Ljxici8+PGVtPnNpbmNlIEFudCAxLjkuNTwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5hbnkgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+CiAKLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCi0gICAgQ29sbGVjdGlvbjwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBncm91cHMgb2YgVVJMcyB0byBkb3dubG9hZC4gIElmCi0gICAgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSByZXNvdXJjZSwgdGhlIGRlc3QgYXR0cmlidXRlCi0gICAgbXVzdCBwb2ludCB0byBhIGRpcmVjdG9yeSBpZiBpdCBleGlzdHMgb3IgYSBkaXJlY3Rvcnkgd2lsbCBiZQotICAgIGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBleGlzdC4gIFRoZSBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgdXNlIHRoZQotICAgIGxhc3QgcGFydCBvZiB0aGUgcGF0aCBvZiB0aGUgc291cmNlIFVSTCB1bmxlc3MgeW91IGFsc28gc3BlY2lmeSBhCi0gICAgbWFwcGVyLjwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcmUgdXNlZCB0byBzZWxlY3QgZ3JvdXBzCitvZiBVUkxzIHRvIGRvd25sb2FkLiAgSWYgdGhlIGNvbGxlY3Rpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSByZXNvdXJjZSwgdGhlIDx2YXI+ZGVzdDwvdmFyPgorYXR0cmlidXRlIG11c3QgcG9pbnQgdG8gYSBkaXJlY3RvcnkgaWYgaXQgZXhpc3RzIG9yIGEgZGlyZWN0b3J5IHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorVGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZSB1c2UgdGhlIGxhc3QgcGFydCBvZiB0aGUgcGF0aCBvZiB0aGUgc291cmNlIFVSTCB1bmxlc3MgeW91IGFsc28gc3BlY2lmeSBhCittYXBwZXIuPC9wPgogCiA8aDQ+bWFwcGVyPC9oND4KIAotPHA+WW91IGNhbiBkZWZpbmUgbmFtZSB0cmFuc2Zvcm1hdGlvbnMgYnkgdXNpbmcgYQotICBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4gZWxlbWVudC4gIFlvdQotICBjYW4gYWxzbyB1c2UgYW55IGZpbGVuYW1lbWFwcGVyIHR5cGUgaW4gcGxhY2Ugb2YgdGhlIG1hcHBlcgotICBlbGVtZW50LjwvcD4KKzxwPllvdSBjYW4gZGVmaW5lIG5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+CitlbGVtZW50LiAgWW91IGNhbiBhbHNvIHVzZSBhbnkgZmlsZW5hbWVtYXBwZXIgdHlwZSBpbiBwbGFjZSBvZiB0aGUgbWFwcGVyIGVsZW1lbnQuPC9wPgogCi08cD5UaGUgbWFwcGVyIHdpbGwgcmVjZWl2ZSB0aGUgcmVzb3VyY2UncyBuYW1lIGFzIGFyZ3VtZW50LiAgQW55Ci0gIHJlc291cmNlIGZvciB3aGljaCB0aGUgbWFwcGVyIHJldHVybnMgbm8gb3IgbW9yZSB0aGFuIG9uZSBtYXBwZWQKLSAgbmFtZSB3aWxsIGJlIHNraXBwZWQuICBJZiB0aGUgcmV0dXJuZWQgbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGgsIGl0Ci0gIHdpbGwgYmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgPGVtPmRlc3Q8L2VtPiBhdHRyaWJ1dGUuPC9wPgorPHA+VGhlIG1hcHBlciB3aWxsIHJlY2VpdmUgdGhlIHJlc291cmNlJ3MgbmFtZSBhcyBhcmd1bWVudC4gIEFueSByZXNvdXJjZSBmb3Igd2hpY2ggdGhlIG1hcHBlcgorcmV0dXJucyBubyBvciBtb3JlIHRoYW4gb25lIG1hcHBlZCBuYW1lIHdpbGwgYmUgc2tpcHBlZC4gIElmIHRoZSByZXR1cm5lZCBuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCwKK2l0IHdpbGwgYmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgPHZhcj5kZXN0PC92YXI+IGF0dHJpYnV0ZS48L3A+CisKKzxoND5oZWFkZXI8L2g0PgorPHA+QW55IGFyYml0cmFyeSBudW1iZXIgb2YgSFRUUCBoZWFkZXJzIGNhbiBiZSBhZGRlZCB0byBhIHJlcXVlc3QuPGJyLz5UaGUgYXR0cmlidXRlcyBvZiBhCituZXN0ZWQgPGNvZGU+Jmx0O2hlYWRlci8mZ3Q7PC9jb2RlPiBub2RlIGFyZSBhcyBmb2xsb3dzOjwvcD4KKworPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb3Iga2V5IG9mIHRoaXMgaGVhZGVyLiBDYW5ub3QgYmUgbnVsbCBvciBlbXB0eS4gTGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZQorICAgIHJlbW92ZWQ8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+VGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGUgaGVhZGVyLiBDYW5ub3QgYmUgbnVsbCBvciBlbXB0eS4gTGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZQorICAgIHJlbW92ZWQ8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7Z2V0IHNyYz0mcXVvdDtodHRwOi8vYW50LmFwYWNoZS5vcmcvJnF1b3Q7IGRlc3Q9JnF1b3Q7aGVscC9pbmRleC5odG1sJnF1b3Q7LyZndDs8L3ByZT4KLTxwPkdldHMgdGhlIGluZGV4IHBhZ2Ugb2YgaHR0cDovL2FudC5hcGFjaGUub3JnLywgYW5kIHN0b3JlcyBpdCBpbiB0aGUgZmlsZSA8Y29kZT5oZWxwL2luZGV4Lmh0bWw8L2NvZGU+LjwvcD4KIAotPHByZT4gICZsdDtnZXQgc3JjPSZxdW90O2h0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2FudC9LRVlTJnF1b3Q7IAotICAgIGRlc3Q9JnF1b3Q7S0VZUyZxdW90OyAKLSAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKLSAgICB1c2V0aW1lc3RhbXA9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD4KLUdldHMgdGhlIFBHUCBrZXlzIG9mIEFudCdzIChjdXJyZW50IGFuZCBwYXN0KSByZWxlYXNlIG1hbmFnZXJzLCBpZiB0aGUgbG9jYWwgY29weQotaXMgbWlzc2luZyBvciBvdXQgb2YgZGF0ZS4gVXNlcyB0aGUgdmVyYm9zZSBvcHRpb24gCi1mb3IgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uCi08L3A+Cis8cD5HZXQgdGhlIGluZGV4IHBhZ2Ugb2YgPHNhbXA+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3NhbXA+LCBhbmQgc3RvcmUgaXQgaW4gdGhlCitmaWxlIDxzYW1wPmhlbHAvaW5kZXguaHRtbDwvc2FtcD4uPC9wPgorPHByZT4mbHQ7Z2V0IHNyYz0mcXVvdDtodHRwczovL2FudC5hcGFjaGUub3JnLyZxdW90OyBkZXN0PSZxdW90O2hlbHAvaW5kZXguaHRtbCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7Z2V0IHNyYz0mcXVvdDtodHRwczovL2luc2VjdXJlLWJhbmsub3JnL3N0YXRlbWVudC91c2VyPTEyMTQmcXVvdDsgCi0gICAgZGVzdD0mcXVvdDtzdGF0ZW1lbnQuaHRtbCZxdW90OyAKLSAgICB1c2VybmFtZT0iMTIxNCI7Ci0gICAgcGFzc3dvcmQ9InNlY3JldCIvJmd0OzwvcHJlPgotPHA+Ci1GZXRjaGVzIHNvbWUgZmlsZSBmcm9tIGEgc2VydmVyIHdpdGggYWNjZXNzIGNvbnRyb2wuIEJlY2F1c2UgaHR0cHMgaXMgYmVpbmcgdXNlZCB0aGUKLWZhY3QgdGhhdCBiYXNpYyBhdXRoIHNlbmRzIHBhc3N3b3JkcyBpbiBwbGFpbnRleHQgaXMgbW9vdCBpZiB5b3UKLWlnbm9yZSB0aGUgZmFjdCB0aGF0IGl0IGlzIHBhcnQgb2YgeW91ciBidWlsZCBmaWxlIHdoaWNoIG1heSBiZQotcmVhZGFibGUgYnkgdGhpcmQgcGFydGllcy4gIElmIHlvdSBuZWVkIG1vcmUgc2VjdXJpdHksIGNvbnNpZGVyIHVzaW5nCi10aGUgPGEgaHJlZj0iaW5wdXQuaHRtbCI+aW5wdXQgdGFzazwvYT4gdG8gcXVlcnkgZm9yIGEgcGFzc3dvcmQuPC9wPgorPHA+R2V0IHRoZSBQR1Aga2V5cyBvZiBBbnQncyAoY3VycmVudCBhbmQgcGFzdCkgcmVsZWFzZSBtYW5hZ2VycywgaWYgdGhlIGxvY2FsIGNvcHkgaXMgbWlzc2luZyBvcgorb3V0IG9mIGRhdGUuIFVzZSB0aGUgPHZhcj52ZXJib3NlPC92YXI+IG9wdGlvbiBmb3IgcHJvZ3Jlc3MgaW5mb3JtYXRpb24uPC9wPgorPHByZT4KKyZsdDtnZXQgc3JjPSZxdW90O2h0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9hbnQvS0VZUyZxdW90OworICAgICBkZXN0PSZxdW90O0tFWVMmcXVvdDsKKyAgICAgdmVyYm9zZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgIHVzZXRpbWVzdGFtcD0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+RmV0Y2ggc29tZSBmaWxlIGZyb20gYSBzZXJ2ZXIgd2l0aCBhY2Nlc3MgY29udHJvbC4gQmVjYXVzZSBIVFRQUyBpcyBiZWluZyB1c2VkLCB0aGUgZmFjdCB0aGF0CitiYXNpYyBhdXRoIHNlbmRzIHBhc3N3b3JkcyBpbiBwbGFpbnRleHQgaXMgbW9vdCBpZiB5b3UgaWdub3JlIHRoZSBmYWN0IHRoYXQgaXQgaXMgcGFydCBvZiB5b3VyIGJ1aWxkCitmaWxlIHdoaWNoIG1heSBiZSByZWFkYWJsZSBieSB0aGlyZCBwYXJ0aWVzLiAgSWYgeW91IG5lZWQgbW9yZSBzZWN1cml0eSwgY29uc2lkZXIgdXNpbmcKK3RoZSA8YSBocmVmPSJpbnB1dC5odG1sIj5pbnB1dDwvYT4gdGFzayB0byBxdWVyeSBmb3IgYSBwYXNzd29yZC48L3A+Cis8cHJlPgorJmx0O2dldCBzcmM9JnF1b3Q7aHR0cHM6Ly9pbnNlY3VyZS1iYW5rLm9yZy9zdGF0ZW1lbnQvdXNlcj0xMjE0JnF1b3Q7CisgICAgIGRlc3Q9JnF1b3Q7c3RhdGVtZW50Lmh0bWwmcXVvdDsKKyAgICAgdXNlcm5hbWU9JnF1b3Q7MTIxNCZxdW90OworICAgICBwYXNzd29yZD0mcXVvdDtzZWNyZXQmcXVvdDsvJmd0OzwvcHJlPgogCiA8cD5Vc2luZyBhIG1hY3JvIGxpa2UgdGhlIGZvbGxvd2luZzwvcD4KIAogPHByZT4KLSAgJmx0O21hY3JvZGVmIG5hbWU9ImdldC1hbmQtY2hlY2tzdW0iPgotICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idXJsIi8+Ci0gICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJkZXN0Ii8+Ci0gICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7bG9jYWwgbmFtZT0iZGVzdGRpciIvJmd0OwotICAgICAgJmx0O2Rpcm5hbWUgcHJvcGVydHk9ImRlc3RkaXIiIGZpbGU9IkB7ZGVzdH0iLyZndDsKLSAgICAgICZsdDtnZXQgZGVzdD0iJHtkZXN0ZGlyfSImZ3Q7Ci0gICAgICAgICZsdDt1cmwgdXJsPSJAe3VybH0iLyZndDsKLSAgICAgICAgJmx0O3VybCB1cmw9IkB7dXJsfS5zaGExIi8mZ3Q7Ci0gICAgICAgICZsdDtmaXJzdG1hdGNobWFwcGVyJmd0OwotICAgICAgICAgICZsdDtnbG9ibWFwcGVyIGZyb209IkB7dXJsfS5zaGExIiB0bz0iQHtkZXN0fS5zaGEiLyZndDsKLSAgICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSJAe3VybH0iIHRvPSJAe2Rlc3R9Ii8mZ3Q7Ci0gICAgICAgICZsdDsvZmlyc3RtYXRjaG1hcHBlciZndDsKLSAgICAgICZsdDsvZ2V0Jmd0OwotICAgICAgJmx0O2xvY2FsIG5hbWU9ImNoZWNrc3VtLm1hdGNoZXMiLz4KLSAgICAgICZsdDtsb2NhbCBuYW1lPSJjaGVja3N1bS5tYXRjaGVzLmZhaWwiLz4KLSAgICAgICZsdDtjaGVja3N1bSBmaWxlPSJAe2Rlc3R9IiBhbGdvcml0aG09InNoYSIgZmlsZWV4dD0iLnNoYSIKLSAgICAgICAgICAgICAgICB2ZXJpZnlwcm9wZXJ0eT0iY2hlY2tzdW0ubWF0Y2hlcyIvPgotICAgICAgJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0iY2hlY2tzdW0ubWF0Y2hlcy5mYWlsIj4KLSAgICAgICAgJmx0O2VxdWFscyBhcmcxPSIke2NoZWNrc3VtLm1hdGNoZXN9IiBhcmcyPSJmYWxzZSIvPgotICAgICAgJmx0Oy9jb25kaXRpb24+Ci0gICAgICAmbHQ7ZmFpbCBpZj0iY2hlY2tzdW0ubWF0Y2hlcy5mYWlsIj5DaGVja3N1bSBlcnJvciZsdDsvZmFpbD4KLSAgICAmbHQ7L3NlcXVlbnRpYWw+Ci0gICZsdDsvbWFjcm9kZWY+Ci08L3ByZT4KKyZsdDttYWNyb2RlZiBuYW1lPSJnZXQtYW5kLWNoZWNrc3VtIiZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ1cmwiLyZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJkZXN0Ii8mZ3Q7CisgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICZsdDtsb2NhbCBuYW1lPSJkZXN0ZGlyIi8mZ3Q7CisgICAgJmx0O2Rpcm5hbWUgcHJvcGVydHk9ImRlc3RkaXIiIGZpbGU9IkB7ZGVzdH0iLyZndDsKKyAgICAmbHQ7Z2V0IGRlc3Q9IiR7ZGVzdGRpcn0iJmd0OworICAgICAgJmx0O3VybCB1cmw9IkB7dXJsfSIvJmd0OworICAgICAgJmx0O3VybCB1cmw9IkB7dXJsfS5zaGExIi8mZ3Q7CisgICAgICAmbHQ7Zmlyc3RtYXRjaG1hcHBlciZndDsKKyAgICAgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iQHt1cmx9LnNoYTEiIHRvPSJAe2Rlc3R9LnNoYSIvJmd0OworICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSJAe3VybH0iIHRvPSJAe2Rlc3R9Ii8mZ3Q7CisgICAgICAmbHQ7L2ZpcnN0bWF0Y2htYXBwZXImZ3Q7CisgICAgJmx0Oy9nZXQmZ3Q7CisgICAgJmx0O2xvY2FsIG5hbWU9ImNoZWNrc3VtLm1hdGNoZXMiLyZndDsKKyAgICAmbHQ7bG9jYWwgbmFtZT0iY2hlY2tzdW0ubWF0Y2hlcy5mYWlsIi8mZ3Q7CisgICAgJmx0O2NoZWNrc3VtIGZpbGU9IkB7ZGVzdH0iIGFsZ29yaXRobT0ic2hhIiBmaWxlZXh0PSIuc2hhIgorICAgICAgICAgICAgICB2ZXJpZnlwcm9wZXJ0eT0iY2hlY2tzdW0ubWF0Y2hlcyIvJmd0OworICAgICZsdDtjb25kaXRpb24gcHJvcGVydHk9ImNoZWNrc3VtLm1hdGNoZXMuZmFpbCImZ3Q7CisgICAgICAmbHQ7ZXF1YWxzIGFyZzE9IiR7Y2hlY2tzdW0ubWF0Y2hlc30iIGFyZzI9ImZhbHNlIi8mZ3Q7CisgICAgJmx0Oy9jb25kaXRpb24mZ3Q7CisgICAgJmx0O2ZhaWwgaWY9ImNoZWNrc3VtLm1hdGNoZXMuZmFpbCImZ3Q7Q2hlY2tzdW0gZXJyb3ImbHQ7L2ZhaWwmZ3Q7CisgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7PC9wcmU+CiAKLTxwPml0IGlzIHBvc3NpYmxlIHRvIGRvd25sb2FkIGFuIGFydGlmYWN0cyB0b2dldGhlciB3aXRoIGl0cyBTSEExCi0gIGNoZWNrc3VtIChhc3N1bWluZyBhIGNlcnRhaW4gbmFtaW5nIGNvbnZlbnRpb24gZm9yIHRoZSBjaGVja3N1bQotICBmaWxlLCBvZiBjb3Vyc2UpIGFuZCB2YWxpZGF0ZSB0aGUgY2hlY2tzdW0gb24gdGhlIGZseS48L3A+Cis8cD5pdCBpcyBwb3NzaWJsZSB0byBkb3dubG9hZCBhbiBhcnRpZmFjdHMgdG9nZXRoZXIgd2l0aCBpdHMgU0hBMSBjaGVja3N1bSAoYXNzdW1pbmcgYSBjZXJ0YWluCituYW1pbmcgY29udmVudGlvbiBmb3IgdGhlIGNoZWNrc3VtIGZpbGUsIG9mIGNvdXJzZSkgYW5kIHZhbGlkYXRlIHRoZSBjaGVja3N1bSBvbiB0aGUgZmx5LjwvcD4KIAogPHByZT4KICZsdDtnZXQgZGVzdD0mcXVvdDtkb3dubG9hZHMmcXVvdDsmZ3Q7Ci0gICZsdDt1cmwgdXJsPSZxdW90O2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7LyZndDsgCi0gICZsdDt1cmwgdXJsPSZxdW90O2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCZxdW90Oy8mZ3Q7Ci0mbHQ7L2dldCZndDsKLTwvcHJlPgotPHA+R2V0cyB0aGUgaW5kZXggYW5kIEZBUSBwYWdlcyBvZiBodHRwOi8vYW50LmFwYWNoZS5vcmcvLCBhbmQgc3RvcmVzCi0gIHRoZW0gaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5kb3dubG9hZHM8L2NvZGU+IHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZgotICBuZWNlc3NhcnkuPC9wPgorICAmbHQ7dXJsIHVybD0mcXVvdDtodHRwczovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwmcXVvdDsvJmd0OworICAmbHQ7dXJsIHVybD0mcXVvdDtodHRwczovL2FudC5hcGFjaGUub3JnL2ZhcS5odG1sJnF1b3Q7LyZndDsKKyZsdDsvZ2V0Jmd0OzwvcHJlPgorCis8cD5Vc2luZyBjdXN0b20gSFRUUCBoZWFkZXJzPC9wPgorCis8cHJlPgorJmx0O2dldCBzcmM9JnF1b3Q7aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sJnF1b3Q7IGRlc3Q9JnF1b3Q7ZG93bmxvYWRzJnF1b3Q7Jmd0OworICAmbHQ7aGVhZGVyIG5hbWU9JnF1b3Q7aGVhZGVyMSZxdW90OyB2YWx1ZT0mcXVvdDtoZWFkZXJWYWx1ZTEmcXVvdDsvJmd0OworICAmbHQ7aGVhZGVyIG5hbWU9JnF1b3Q7aGVhZGVyMiZxdW90OyB2YWx1ZT0mcXVvdDtoZWFkZXJWYWx1ZTImcXVvdDsvJmd0OworICAmbHQ7aGVhZGVyIG5hbWU9JnF1b3Q7aGVhZGVyMyZxdW90OyB2YWx1ZT0mcXVvdDtoZWFkZXJWYWx1ZTMmcXVvdDsvJmd0OworJmx0Oy9nZXQmZ3Q7PC9wcmU+CisKKzxwPmdldCB0aGUgaW5kZXggYW5kIEZBUSBwYWdlcyBvZiA8c2FtcD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvc2FtcD4sIGFuZCBzdG9yZSB0aGVtIGluIHRoZQorZGlyZWN0b3J5IDxzYW1wPmRvd25sb2Fkczwvc2FtcD4gd2hpY2ggd2lsbCBiZSBjcmVhdGVkIGlmIG5lY2Vzc2FyeS48L3A+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9ndW56aXAuaHRtbCBiL21hbnVhbC9UYXNrcy9ndW56aXAuaHRtbAppbmRleCAzMmUyY2YyLi40MzljZmZkIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZ3VuemlwLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2d1bnppcC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTYgKzE1LDE0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5HVW5aaXAgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgotVGhpcyBkb2N1bWVudCdzIG5ldyBob21lIGlzIDxBIEhSRUY9InVucGFjay5odG1sIj5oZXJlPC9BPgorVGhpcyBkb2N1bWVudCdzIG5ldyBob21lIGlzIDxhIGhyZWY9InVucGFjay5odG1sIj5oZXJlPC9hPgogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvZ3ppcC5odG1sIGIvbWFudWFsL1Rhc2tzL2d6aXAuaHRtbAppbmRleCA2MDU0ZDMxLi40ODFmMjg1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvZ3ppcC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9nemlwLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNiArMTUsMTQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkdaaXAgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgotVGhpcyBkb2N1bWVudCdzIG5ldyBob21lIGlzIDxBIEhSRUY9InBhY2suaHRtbCI+aGVyZTwvQT4KK1RoaXMgZG9jdW1lbnQncyBuZXcgaG9tZSBpcyA8YSBocmVmPSJwYWNrLmh0bWwiPmhlcmU8L2E+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9ob3N0aW5mby5odG1sIGIvbWFudWFsL1Rhc2tzL2hvc3RpbmZvLmh0bWwKaW5kZXggODUxYjQwMy4uNzQ5NjJkMSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2hvc3RpbmZvLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2hvc3RpbmZvLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw4NSArMTUsNjkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkhvc3RJbmZvIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9Imhvc3RpbmZvIj5Ib3N0SW5mbzwvYT48L2gyPgorPGgyIGlkPSJob3N0aW5mbyI+SG9zdEluZm88L2gyPgogCiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+U2V0cyB0aGUgPGNvZGU+TkFNRTwvY29kZT4sIDxjb2RlPkRPTUFJTjwvY29kZT4sIDxjb2RlPkFERFI0PC9jb2RlPiwgYW5kIDxjb2RlPkFERFI2PC9jb2RlPgogcHJvcGVydGllcyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LjwvcD4KIDxwPgotVGhlIDxjb2RlPk5BTUU8L2NvZGU+IGNvbnRhaW5zIHRoZSBob3N0IHBhcnQgb2YgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0Ljxici8+Ci1JZiB0aGUgaG9zdCBpcyBub3QgZm91bmQsIHRoZSBob3N0IHdpbGwgY29udGFpbiB0aGUgbmFtZSBhcyBwcm92aWRlZCB0byB0aGUgdGFzaywKLW9yIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4gaWYgbm8gaG9zdCB3YXMgcHJvdmlkZWQsIGFuZCBubyBuYW1lIGZvciB0aGUgbG9jYWwKLWhvc3Qgd2FzIGZvdW5kLjxici8+Ci1UaGUgPGNvZGU+RE9NQUlOPC9jb2RlPiBjb250YWlucyB0aGUgZG9tYWluIHBhcnQgb2YgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0Ljxici8+Ci0gSWYgdGhlIGhvc3QgaXMgbm90IGZvdW5kLCB0aGUgZG9tYWluIHdpbGwgY29udGFpbiB0aGUgZG9tYWluIGFzIHByb3ZpZGVkIHRvIHRoZSB0YXNrLAotIG9yIDxjb2RlPmxvY2FsZG9tYWluPC9jb2RlPiBpZiBubyBob3N0IC8gZG9tYWluIHdhcyBwcm92aWRlZC48YnIvPgotVGhlIDxjb2RlPkFERFI0PC9jb2RlPiBjb250YWlucyB0aGUgSVB2NCBhZGRyZXNzIG9mIHRoZSBob3N0IHdpdGggdGhlIHdpZGVzdCBtZWFuaW5nLjxici8+Ci1JZiBubyBJUHY0IGFkZHJlc3MgaXMgZm91bmQgYW5kIGEgaG9zdCBoYXMgYmVlbiBwcm92aWRlZCB0aGUgYWRkcmVzcyA8Y29kZT4wLjAuMC4wPC9jb2RlPiAKLWlzIHJldHVybmVkLCB3aGVuIG5vIGhvc3Qgd2FzIHByb3ZpZGVkIHRoZSBhZGRyZXNzIDxjb2RlPjEyNy4wLjAuMTwvY29kZT4gaXMgcmV0dXJuZWQuPGJyLz4KLVRoZSA8Y29kZT5BRERSNjwvY29kZT4gY29udGFpbnMgdGhlIElQdjYgYWRkcmVzcyBvZiB0aGUgaG9zdCB3aXRoIHRoZSB3aWRlc3QgbWVhbmluZy48YnIvPiAKLUlmIG5vIElQdjYgYWRkcmVzcyBpcyBmb3VuZCBhbmQgYSBob3N0IGhhcyBiZWVuIHByb3ZpZGVkIHRoZSBhZGRyZXNzIDxjb2RlPjo6PC9jb2RlPiAKLWlzIHJldHVybmVkLCB3aGVuIG5vIGhvc3Qgd2FzIHByb3ZpZGVkIHRoZSBhZGRyZXNzIDxjb2RlPjo6MTwvY29kZT4gaXMgcmV0dXJuZWQuPGJyLz4KLTwvcD4KK1RoZSA8Y29kZT5OQU1FPC9jb2RlPiBjb250YWlucyB0aGUgaG9zdCBwYXJ0IG9mIHRoZSBjYW5vbmljYWwgbmFtZSBvZiB0aGUgaG9zdC48YnIvPiAgSWYgdGhlIGhvc3QgaXMKK25vdCBmb3VuZCwgdGhlIGhvc3Qgd2lsbCBjb250YWluIHRoZSBuYW1lIGFzIHByb3ZpZGVkIHRvIHRoZSB0YXNrLCBvciA8Y29kZT5sb2NhbGhvc3Q8L2NvZGU+IGlmIG5vCitob3N0IHdhcyBwcm92aWRlZCwgYW5kIG5vIG5hbWUgZm9yIHRoZSBsb2NhbCBob3N0IHdhcyBmb3VuZC48YnIvPlRoZSA8Y29kZT5ET01BSU48L2NvZGU+IGNvbnRhaW5zCit0aGUgZG9tYWluIHBhcnQgb2YgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIHRoZSBob3N0Ljxici8+SWYgdGhlIGhvc3QgaXMgbm90IGZvdW5kLCB0aGUgZG9tYWluIHdpbGwKK2NvbnRhaW4gdGhlIGRvbWFpbiBhcyBwcm92aWRlZCB0byB0aGUgdGFzaywgb3IgPGNvZGU+bG9jYWxkb21haW48L2NvZGU+IGlmIG5vIGhvc3QgLyBkb21haW4gd2FzCitwcm92aWRlZC48YnIvPlRoZSA8Y29kZT5BRERSNDwvY29kZT4gY29udGFpbnMgdGhlIElQdjQgYWRkcmVzcyBvZiB0aGUgaG9zdCB3aXRoIHRoZSB3aWRlc3QKK21lYW5pbmcuPGJyLz5JZiBubyBJUHY0IGFkZHJlc3MgaXMgZm91bmQgYW5kIGEgaG9zdCBoYXMgYmVlbiBwcm92aWRlZCB0aGUKK2FkZHJlc3MgPGNvZGU+MC4wLjAuMDwvY29kZT4gaXMgcmV0dXJuZWQsIHdoZW4gbm8gaG9zdCB3YXMgcHJvdmlkZWQgdGhlCithZGRyZXNzIDxjb2RlPjEyNy4wLjAuMTwvY29kZT4gaXMgcmV0dXJuZWQuPGJyLz5UaGUgPGNvZGU+QUREUjY8L2NvZGU+IGNvbnRhaW5zIHRoZSBJUHY2IGFkZHJlc3Mgb2YKK3RoZSBob3N0IHdpdGggdGhlIHdpZGVzdCBtZWFuaW5nLjxici8+SWYgbm8gSVB2NiBhZGRyZXNzIGlzIGZvdW5kIGFuZCBhIGhvc3QgaGFzIGJlZW4gcHJvdmlkZWQgdGhlCithZGRyZXNzIDxjb2RlPjo6PC9jb2RlPiBpcyByZXR1cm5lZCwgd2hlbiBubyBob3N0IHdhcyBwcm92aWRlZCB0aGUgYWRkcmVzcyA8Y29kZT46OjE8L2NvZGU+IGlzCityZXR1cm5lZC48L3A+CiAKLTxwPlRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgaW4gdGhlIGJ1aWxkLWZpbGUsIGZvciBpbnN0YW5jZSwgdG8gY3JlYXRlCi1ob3N0LXN0YW1wZWQgZmlsZW5hbWVzLCBvciB1c2VkIHRvIHJlcGxhY2UgcGxhY2Vob2xkZXIgdGFncyBpbnNpZGUgZG9jdW1lbnRzCi10byBpbmRpY2F0ZSwgZm9yIGV4YW1wbGUsIHRoZSBob3N0IHdoZXJlIHRoZSBidWlsZCB3YXMgcGVyZm9ybWVkIG9uLgotVGhlIGJlc3QgcGxhY2UgZm9yIHRoaXMgdGFzayBpcyBwcm9iYWJseSBpbiBhbiBpbml0aWFsaXphdGlvbiB0YXJnZXQuPC9wPgorPHA+VGhlc2UgcHJvcGVydGllcyBjYW4gYmUgdXNlZCBpbiB0aGUgYnVpbGQtZmlsZSwgZm9yIGluc3RhbmNlLCB0byBjcmVhdGUgaG9zdC1zdGFtcGVkIGZpbGVuYW1lcywKK29yIHVzZWQgdG8gcmVwbGFjZSBwbGFjZWhvbGRlciB0YWdzIGluc2lkZSBkb2N1bWVudHMgdG8gaW5kaWNhdGUsIGZvciBleGFtcGxlLCB0aGUgaG9zdCB3aGVyZSB0aGUKK2J1aWxkIHdhcyBwZXJmb3JtZWQgb24uICBUaGUgYmVzdCBwbGFjZSBmb3IgdGhpcyB0YXNrIGlzIHByb2JhYmx5IGluIGFuIGluaXRpYWxpemF0aW9uIHRhcmdldC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlByZWZpeCB1c2VkIGZvciBhbGwgcHJvcGVydGllcyBzZXQuIFRoZSBkZWZhdWx0IGlzIG5vIHByZWZpeC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5QcmVmaXggdXNlZCBmb3IgYWxsIHByb3BlcnRpZXMgc2V0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBubyBwcmVmaXg8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ob3N0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBUaGUgaG9zdCB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZm9yLCBkZWZhdWx0IGlzIHRvIHJldHJpZXZlCi0gICAgICAgIGluZm9ybWF0aW9uIGZvciB0aGUgaG9zdCB0aGUgdGFzayBpcyBydW5uaW5nIG9uLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmhvc3Q8L3RkPgorICAgIDx0ZD5UaGUgaG9zdCB0byByZXRyaWV2ZSB0aGUgaW5mb3JtYXRpb24gZm9yLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgaG9zdCB0aGUgdGFzayBpcyBydW5uaW5nIG9uPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxwcmU+Ci0gICZsdDtob3N0aW5mby8mZ3Q7Ci08L3ByZT4KKzxwPlNldCB0aGUgPGNvZGU+TkFNRTwvY29kZT4sIDxjb2RlPkRPTUFJTjwvY29kZT4sIDxjb2RlPkFERFI0PC9jb2RlPiwgYW5kIDxjb2RlPkFERFI2PC9jb2RlPiBmb3IKK3RoZSBsb2NhbCBob3N0LCB1c2luZyB0aGUgbW9zdCAmcXVvdDtnbG9iYWwmcXVvdDsgYWRkcmVzcyBhdmFpbGFibGUuPC9wPgorPHByZT4mbHQ7aG9zdGluZm8vJmd0OzwvcHJlPgogCi08cD4KLVNldHMgdGhlIDxjb2RlPk5BTUU8L2NvZGU+LCA8Y29kZT5ET01BSU48L2NvZGU+LCA8Y29kZT5BRERSNDwvY29kZT4sIGFuZCAKLTxjb2RlPkFERFI2PC9jb2RlPiBmb3IgdGhlIGxvY2FsIGhvc3QsIHVzaW5nIHRoZSBtb3N0ICZxdW90O2dsb2JhbCZxdW90OyBhZGRyZXNzCi1hdmFpbGFibGUuPC9wPgotPHByZT4KLSAgJmx0O2hvc3RpbmZvIHByZWZpeD0mcXVvdDtyZW1vdGVob3N0JnF1b3Q7IGhvc3Q9JnF1b3Q7d3d3LmFwYWNoZS5vcmcmcXVvdDsvJmd0OwotPC9wcmU+Ci08cD4KLVNldHMgdGhlIHByb3BlcnRpZXMgPGNvZGU+cmVtb3RlaG9zdC5OQU1FPC9jb2RlPiB0byA8Y29kZT5lb3M8L2NvZGU+LCAKLTxjb2RlPnJlbW90ZWhvc3QuRE9NQUlOPC9jb2RlPiB0byA8Y29kZT5hcGFjaGUub3JnPC9jb2RlPiwgCi08Y29kZT5yZW1vdGVob3N0LkFERFI0PC9jb2RlPiB0byA8Y29kZT4xNDAuMjExLjExLjEzMDwvY29kZT4gYW5kIAotPGNvZGU+cmVtb3RlaG9zdC5BRERSNjwvY29kZT4gdG8gPGNvZGU+Ojo8L2NvZGU+Ci1mb3IgdGhlIGhvc3Qgd2l0aCB0aGUgbmFtZSB3d3cuYXBhY2hlLm9yZyAocHJvdmlkZWQgdGhlIGNhbm9uaWNhbCBuYW1lIGFuZCBpcCAKLWFkZHJlc3NlcyBkbyBub3QgY2hhbmdlKS4KLTwvcD4KKzxwPlNldCB0aGUgcHJvcGVydGllcyA8Y29kZT5yZW1vdGVob3N0Lk5BTUU8L2NvZGU+Cit0byA8c2FtcD5lb3M8L3NhbXA+LCA8Y29kZT5yZW1vdGVob3N0LkRPTUFJTjwvY29kZT4KK3RvIDxzYW1wPmFwYWNoZS5vcmc8L3NhbXA+LCA8Y29kZT5yZW1vdGVob3N0LkFERFI0PC9jb2RlPiB0byA8c2FtcD4xNDAuMjExLjExLjEzMDwvc2FtcD4KK2FuZCA8Y29kZT5yZW1vdGVob3N0LkFERFI2PC9jb2RlPiB0byA8c2FtcD46Ojwvc2FtcD4gZm9yIHRoZSBob3N0IHdpdGggdGhlCituYW1lIDxzYW1wPnd3dy5hcGFjaGUub3JnPC9zYW1wPiAocHJvdmlkZWQgdGhlIGNhbm9uaWNhbCBuYW1lIGFuZCBJUCBhZGRyZXNzZXMgZG8gbm90IGNoYW5nZSkuPC9wPgorPHByZT4mbHQ7aG9zdGluZm8gcHJlZml4PSZxdW90O3JlbW90ZWhvc3QmcXVvdDsgaG9zdD0mcXVvdDt3d3cuYXBhY2hlLm9yZyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9pbWFnZS5ncmFwaG1sIGIvbWFudWFsL1Rhc2tzL2ltYWdlLmdyYXBobWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjMjUyMQotLS0gL2Rldi9udWxsCisrKyBiL21hbnVhbC9UYXNrcy9pbWFnZS5ncmFwaG1sCkBAIC0wLDAgKzEsNTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Z3JhcGhtbCB4bWxucz0iaHR0cDovL2dyYXBobWwuZ3JhcGhkcmF3aW5nLm9yZy94bWxucyIgeG1sbnM6amF2YT0iaHR0cDovL3d3dy55d29ya3MuY29tL3htbC95ZmlsZXMtY29tbW9uLzEuMC9qYXZhIiB4bWxuczpzeXM9Imh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwveWZpbGVzLWNvbW1vbi9tYXJrdXAvcHJpbWl0aXZlcy8yLjAiIHhtbG5zOng9Imh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwveWZpbGVzLWNvbW1vbi9tYXJrdXAvMi4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp5PSJodHRwOi8vd3d3Lnl3b3Jrcy5jb20veG1sL2dyYXBobWwiIHhtbG5zOnllZD0iaHR0cDovL3d3dy55d29ya3MuY29tL3htbC95ZWQvMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZ3JhcGhtbC5ncmFwaGRyYXdpbmcub3JnL3htbG5zIGh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwvc2NoZW1hL2dyYXBobWwvMS4xL3lncmFwaG1sLnhzZCI+CisgIDxrZXkgYXR0ci5uYW1lPSJEZXNjcmlwdGlvbiIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZ3JhcGgiIGlkPSJkMCIvPgorICA8a2V5IGZvcj0icG9ydCIgaWQ9ImQxIiB5ZmlsZXMudHlwZT0icG9ydGdyYXBoaWNzIi8+CisgIDxrZXkgZm9yPSJwb3J0IiBpZD0iZDIiIHlmaWxlcy50eXBlPSJwb3J0Z2VvbWV0cnkiLz4KKyAgPGtleSBmb3I9InBvcnQiIGlkPSJkMyIgeWZpbGVzLnR5cGU9InBvcnR1c2VyZGF0YSIvPgorICA8a2V5IGF0dHIubmFtZT0idXJsIiBhdHRyLnR5cGU9InN0cmluZyIgZm9yPSJub2RlIiBpZD0iZDQiLz4KKyAgPGtleSBhdHRyLm5hbWU9ImRlc2NyaXB0aW9uIiBhdHRyLnR5cGU9InN0cmluZyIgZm9yPSJub2RlIiBpZD0iZDUiLz4KKyAgPGtleSBmb3I9Im5vZGUiIGlkPSJkNiIgeWZpbGVzLnR5cGU9Im5vZGVncmFwaGljcyIvPgorICA8a2V5IGZvcj0iZ3JhcGhtbCIgaWQ9ImQ3IiB5ZmlsZXMudHlwZT0icmVzb3VyY2VzIi8+CisgIDxrZXkgZm9yPSJlZGdlIiBpZD0iZDgiIHlmaWxlcy50eXBlPSJwb3J0Y29uc3RyYWludHMiLz4KKyAgPGtleSBhdHRyLm5hbWU9InVybCIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZWRnZSIgaWQ9ImQ5Ii8+CisgIDxrZXkgYXR0ci5uYW1lPSJkZXNjcmlwdGlvbiIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZWRnZSIgaWQ9ImQxMCIvPgorICA8a2V5IGZvcj0iZWRnZSIgaWQ9ImQxMSIgeWZpbGVzLnR5cGU9ImVkZ2VncmFwaGljcyIvPgorICA8Z3JhcGggZWRnZWRlZmF1bHQ9ImRpcmVjdGVkIiBpZD0iRyI+CisgICAgPGRhdGEga2V5PSJkMCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgIDxub2RlIGlkPSJuMCI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iNDcuMCIgd2lkdGg9IjI0NS4wIiB4PSIyMDcuNSIgeT0iLTExMy4xMjE2MjE2MjE2MjE2MyIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjM0LjkxNTAzOTA2MjUiIHg9IjUuMDQyNDgwNDY4NzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8L3k6TWV0aG9kTGFiZWw+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xIj4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMTkuNTEzNTEzNTEzNTEzNTQiIHdpZHRoPSIxNTUuODU1NDY4NzUiIHg9IjI1Mi4wIiB5PSIwLjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9Iml0YWxpYyIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSIxMDUuMTA1NDY4NzUiIHg9IjI1LjM3NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMy4wIj5JbWFnZU9wZXJhdGlvbjx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aW5zdHJ1Y3Rpb25zIDogVmVjdG9yPC95OkF0dHJpYnV0ZUxhYmVsPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkUm90YXRlKFJvdGF0ZSA6IGluc3RyKQorYWRkRHJhdyhEcmF3IDogaW5zdHIpCithZGRUZXh0KFRleHQgOiBpbnN0cikKK2FkZFNjYWxlKFNjYWxlIDogaW5zdHIpPC95Ok1ldGhvZExhYmVsPgorICAgICAgICAgIDwveTpVTUw+CisgICAgICAgIDwveTpVTUxDbGFzc05vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxub2RlIGlkPSJuMiI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MTm90ZU5vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMDUuMCIgd2lkdGg9IjI2MC41NTA3ODEyNSIgeD0iLTQxOS4xMDUxMDU2ODYwNTg0IiB5PSI0NjkuNTkyOTQ0MzY5MDYzNzMiLz4KKyAgICAgICAgICA8eTpGaWxsIGhhc0NvbG9yPSJmYWxzZSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJsZWZ0IiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iODguNzk2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjUwLjU1MDc4MTI1IiB4PSI1LjAiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjguMTAxNTYyNSI+VGhlIHNldFR5cGUoKSBtZXRob2QgZm9yY2VzIHR5cGUgdG8KK29uZSBvZiB0aGUgdmFsdWVzIG9mIGphdmEuYXd0Lmdlb20uQXJjMkQ6CitvcGVuID0gQXJjMkQuT1BFTgorcGllID0gQXJjMkQuUElFCitjaG9yZCA9IEFyYzJELkNIT1JECitQYXJhbWV0ZXIgaXMgbm90IGNhc2Utc2Vuc2l0aXZlLjx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9IjAuMCIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgPC95OlVNTE5vdGVOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjMiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTENsYXNzTm9kZT4KKyAgICAgICAgICA8eTpHZW9tZXRyeSBoZWlnaHQ9Ijg4LjAiIHdpZHRoPSIxNjguMCIgeD0iLTI0LjAiIHk9IjEwNi4wIi8+CisgICAgICAgICAgPHk6RmlsbCBjb2xvcj0iI0ZGQ0M5OSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGF1dG9TaXplUG9saWN5PSJjb250ZW50IiBmb250RmFtaWx5PSJTYW5zU2VyaWYiIGZvbnRTaXplPSIxMyIgZm9udFN0eWxlPSJpdGFsaWMiIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9InNpZGVzIiBtb2RlbFBvc2l0aW9uPSJuIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3My4zNzM1MzUxNTYyNSIgeD0iNDcuMzEzMjMyNDIxODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPkJhc2ljU2hhcGU8L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3Ryb2tlX3dpZHRoIDogaW50ID0gMAorZmlsbCA6IFN0cmluZyA9ICJ0cmFuc3BhcmVudCIKK3N0cm9rZSA6IFN0cmluZyA9ICJibGFjayI8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im40Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI3Ni4wIiB3aWR0aD0iMzY2LjAiIHg9IjUzNy4wIiB5PSIxMDUuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0iaXRhbGljIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJzaWRlcyIgbW9kZWxQb3NpdGlvbj0ibiIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMTMyLjMzMDU2NjQwNjI1IiB4PSIxMTYuODM0NzE2Nzk2ODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlRyYW5zZm9ybU9wZXJhdGlvbjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlIGltZykgOiBQbGFuYXJJbWFnZQorYWRkUmVjdGFuZ2xlKFJlY3RhbmdsZSBpbnN0cik8L3k6TWV0aG9kTGFiZWw+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im41Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI4My45NDA1NDA1NDA1NDA1NSIgd2lkdGg9IjIzNy41MDU4NTkzNzUiIHg9IjIwOS41OTUxMDI4NzY5NTA0OCIgeT0iNDc4LjIwNjEyMDUwMzEzNTUiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9Iml0YWxpYyIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI5OC45NDgyNDIxODc1IiB4PSI2OS4yNzg4MDg1OTM3NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjYuMTMyODEyNSI+RHJhd09wZXJhdGlvbjx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9ImludGVyZmFjZSIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ZXhlY3V0ZURyYXdPcGVyYXRpb24oKSA6IFBsYW5hckltYWdlPC95Ok1ldGhvZExhYmVsPgorICAgICAgICAgIDwveTpVTUw+CisgICAgICAgIDwveTpVTUxDbGFzc05vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxub2RlIGlkPSJuNiI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MTm90ZU5vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI3NS43NTY3NTY3NTY3NTY3NyIgd2lkdGg9IjIxNi4wNjA1NDY4NzUiIHg9IjIyMC4zMTc3NTkxMjY5NTA0OCIgeT0iNjM1Ljg2NjUzMzQyNjIzNDkiLz4KKyAgICAgICAgICA8eTpGaWxsIGhhc0NvbG9yPSJmYWxzZSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJsZWZ0IiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iNjAuNTMxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSIyMDYuMDYwNTQ2ODc1IiB4PSI1LjAiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjcuNjEyNzUzMzc4Mzc4NDQzIj5UaGUgaW1wbGVtZW50aW5nIGNsYXNzIHVzZXMKK0NvbG9yTWFwcGVyIHRvIGV2YWx1YXRlIHRoZSBjb2xvci4KK09ubHkgdGhlIHZhbHVlcyBkZWZpbmVkIGluCitDb2xvck1hcHBlciBhcmUgdXNlZC48eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSIwLjAiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgIDwveTpVTUxOb3RlTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im43Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIyNzEuNDIzNDIzNDIzNDIzMyIgd2lkdGg9IjI1MS4yNzUzOTA2MjUiIHg9IjU2Mi43MTAzMzcyNTE5NTA1IiB5PSI1NDEuMzM3MTM0OTY0MDAwOCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iODUuMzQ1MjE0ODQzNzUiIHg9IjgyLjk2NTA4Nzg5MDYyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMy4wIj5Db2xvck1hcHBlcjx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfQkxBQ0sgOiBTdHJpbmcgPSAiYmxhY2siCitDT0xPUl9CTFVFIDogU3RyaW5nID0gImJsdWUiCitDT0xPUl9DWUFOIDogU3RyaW5nID0gImN5YW4iCitDT0xPUl9EQVJLR1JBWSA6IFN0cmluZyA9ICJkYXJrZ3JheSIKK0NPTE9SX0dSQVkgOiBTdHJpbmcgPSAiZ3JheSIKK0NPTE9SX0xJR0hUR1JBWSA6IFN0cmluZyA9ICJsaWdodGdyYXkiCitDT0xPUl9EQVJLR1JFWSA6IFN0cmluZyA9ICJkYXJrZ3JleSIKK0NPTE9SX0dSRVkgOiBTdHJpbmcgPSAiZ3JleSIKK0NPTE9SX0xJR0hUR1JFWSA6IFN0cmluZyA9ICJsaWdodGdyZXkiCitDT0xPUl9HUkVFTiA6IFN0cmluZyA9ICJncmVlbiIKK0NPTE9SX01BR0VOVEEgOiBTdHJpbmcgPSAibWFnZW50YSIKK0NPTE9SX09SQU5HRSA6IFN0cmluZyA9ICJvcmFuZ2UiCitDT0xPUl9QSU5LIDogU3RyaW5nID0gInBpbmsiCitDT0xPUl9SRUQgOiBTdHJpbmcgPSAicmVkIgorQ09MT1JfV0hJVEUgOiBTdHJpbmcgPSAid2hpdGUiCitDT0xPUl9ZRUxMT1cgOiBTdHJpbmcgPSAieWVsbG93IjwveTpBdHRyaWJ1dGVMYWJlbD4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjgiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTENsYXNzTm9kZT4KKyAgICAgICAgICA8eTpHZW9tZXRyeSBoZWlnaHQ9IjEzMC4wIiB3aWR0aD0iMTQ2LjAiIHg9IjI1Ny4wIiB5PSIyNzIuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMzIuMjk3ODUxNTYyNSIgeD0iNTYuODUxMDc0MjE4NzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+VGV4dDx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RyaW5nIDogU3RyaW5nID0gIiIKK2ZvbnQgOiBTdHJpbmcgPSAiQXJpYWwiCitwb2ludCA6IGludCA9IDEwCitib2xkIDogYm9vbGVhbiA9IGZhbHNlCitjb2xvciA6IFN0cmluZyA9ICJibGFjayIKK2l0YWxpYyA6IGJvb2xlYW4gPSBmYWxzZTwveTpBdHRyaWJ1dGVMYWJlbD4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjkiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTENsYXNzTm9kZT4KKyAgICAgICAgICA8eTpHZW9tZXRyeSBoZWlnaHQ9IjU5LjAiIHdpZHRoPSIxMjYuMCIgeD0iNDQ3LjAiIHk9IjI3MS4wIi8+CisgICAgICAgICAgPHk6RmlsbCBjb2xvcj0iI0ZGQ0M5OSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGF1dG9TaXplUG9saWN5PSJjb250ZW50IiBmb250RmFtaWx5PSJTYW5zU2VyaWYiIGZvbnRTaXplPSIxMyIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI0NC4zNTIwNTA3ODEyNSIgeD0iNDAuODIzOTc0NjA5Mzc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlJvdGF0ZTx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YW5nbGUgOiBmbG9hdCA9IDAuMEY8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xMCI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iODguMCIgd2lkdGg9IjIxMi4wIiB4PSI2MTQuMCIgeT0iMjcxLjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjM1LjgzOTg0Mzc1IiB4PSI4OC4wODAwNzgxMjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+U2NhbGU8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPndpZHRoIDogU3RyaW5nID0gIjEwMCUiCitoZWlnaHQgOiBTdHJpbmcgPSAiMTAwJSIKK2tlZXBQcm9wb3J0aW9ucyA6IGJvb2xlYW4gPSBmYWxzZTwveTpBdHRyaWJ1dGVMYWJlbD4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjExIj4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMDQuMCIgd2lkdGg9IjE0Mi4wIiB4PSI4NzQuMCIgeT0iMjcwLjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjM2LjI1MjQ0MTQwNjI1IiB4PSI1Mi44NzM3NzkyOTY4NzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+RHJhdzx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+eGxvYyA6IGludCA9IDAKK3lsb2MgOiBpbnQgPSAwPC95OkF0dHJpYnV0ZUxhYmVsPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkRWxsaXBzZShFbGxpcHNlIGVsaXApCithZGRBcmMoQXJjIGFyYyk8L3k6TWV0aG9kTGFiZWw+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xMiI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iMTAyLjAiIHdpZHRoPSIxMjAuMCIgeD0iMy4xNjgyNDk2NjA3ODcwMTIiIHk9IjI3Mi41Ii8+CisgICAgICAgICAgPHk6RmlsbCBjb2xvcj0iI0ZGQ0M5OSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGF1dG9TaXplUG9saWN5PSJjb250ZW50IiBmb250RmFtaWx5PSJTYW5zU2VyaWYiIGZvbnRTaXplPSIxMyIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI2NS4zMzc0MDIzNDM3NSIgeD0iMjcuMzMxMjk4ODI4MTI1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlJlY3RhbmdsZTx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aGVpZ2h0IDogaW50ID0gMAord2lkdGggOiBpbnQgPSAwCithcmNoZWlnaHQgOiBpbnQgPSAwCithcmN3aWR0aCA6IGludCA9IDA8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xMyI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iNzQuMCIgd2lkdGg9IjEyMC4wIiB4PSItMTY1LjEzMjI5MzA4MDA1NDI0IiB5PSIyNzAuODc4Mzc4Mzc4Mzc4NCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNDQuMzcxMDkzNzUiIHg9IjM3LjgxNDQ1MzEyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMy4wIj5FbGxpcHNlPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5oZWlnaHQgOiBpbnQgPSAwCit3aWR0aCA6IGludCA9IDA8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xNCI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iMTE1LjAiIHdpZHRoPSIxNjcuMCIgeD0iLTM3NS4zNjkwNjM3NzIwNDg5IiB5PSIyNzAuNSIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjQuOTQ3MjY1NjI1IiB4PSI3MS4wMjYzNjcxODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPkFyYzx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aGVpZ2h0IDogaW50ID0gMAord2lkdGggOiBpbnQgPSAwCitzdGFydCA6IGludCA9IDAKK3N0b3AgOiBpbnQgPSAwCit0eXBlIDogZW51bWVyYXRlZCA9IG9wZW48L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPGVkZ2UgaWQ9ImUwIiBzb3VyY2U9Im4xIiB0YXJnZXQ9Im4wIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIyNi4xMTc1MzgyMjc0MDY2NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTQyLjExMDc0MDg2NzM2Nzg3Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImUxIiBzb3VyY2U9Im4zIiB0YXJnZXQ9Im4xIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSI1MC40MTg0Nzg5MjI1OTIwNyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNC40MDYzNDM2OTMxMTA2MTQiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTIiIHNvdXJjZT0ibjQiIHRhcmdldD0ibjEiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMzAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSItNjAuMDcxNzA0ODQ4MDQ0ODc0IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItNTYuNjEyOTEwMzgxOTcxNjYiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTMiIHNvdXJjZT0ibjUiIHRhcmdldD0ibjMiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJub25lIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iLTcxLjE1MTc0MTE4ODQ4NTYzIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItMTUyLjk1Mzc3MTU5MDUwMDA4Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU0IiBzb3VyY2U9Im41IiB0YXJnZXQ9Im45Ij4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0ibm9uZSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9Ijk0LjIyMDI0NDg1MjM2NTY4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItODAuNjQ3MTA1MDI3NzM1ODUiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTUiIHNvdXJjZT0ibjUiIHRhcmdldD0ibjEwIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0ibm9uZSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjE0MC42MTUwODUyNjA3OTM2NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTUwLjkwNTk0NjM0MTcwNDk3NiI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlNiIgc291cmNlPSJuOSIgdGFyZ2V0PSJuNCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iODEuMzY4MDgyNjgyMjkxNzQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0zNS41MTYyOTYzODY3MTg3NSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlNyIgc291cmNlPSJuMTAiIHRhcmdldD0ibjQiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJ3aGl0ZV9kZWx0YSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjI2LjEwMTU2MjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii01NC4xMDA1ODU5Mzc1Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU4IiBzb3VyY2U9Im4xMSIgdGFyZ2V0PSJuNCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iLTE3LjU4MzMzNTg2OTI3OTgzNiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTU4LjI4OTA5NzMxMTEyNDAxIj4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU5IiBzb3VyY2U9Im44IiB0YXJnZXQ9Im4xIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIyNi4wODE2ODQ2MTYyNjcyNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTg1LjI5NjkyMzY2MzE2NTEiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTEwIiBzb3VyY2U9Im41IiB0YXJnZXQ9Im44Ij4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0ibm9uZSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjI2LjQ0NjIwNjg4NjIzMDkyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTQ3LjE0NjkwOTIzMDg1NDEzNSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMTEiIHNvdXJjZT0ibjYiIHRhcmdldD0ibjUiPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjODA4MDgwIiB0eXBlPSJkYXNoZWQiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIyNi4xMDE1NzI2MDM1MTI5NzciIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii00NS45MDAwMTg5NzU5ODE5OSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMTIiIHNvdXJjZT0ibjciIHRhcmdldD0ibjYiPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjODA4MDgwIiB0eXBlPSJkYXNoZWQiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSItNjcuMDYyNDg5ODk2NDg3MDIiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0zOS42NDczMzkyNzA1MTUzMiI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMTMiIHNvdXJjZT0ibjIiIHRhcmdldD0ibjE0Ij4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzgwODA4MCIgdHlwZT0iZGFzaGVkIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJub25lIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iMjUuNDQ2MTUyNzEwMzEwOTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItNTEuMTU2NTkxNzgwMzExODg1Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImUxNCIgc291cmNlPSJuMTQiIHRhcmdldD0ibjMiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iLTUwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iMTYwLjcwMjg1MDY5ODY5Mjk0IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItMzcuMDIwNDAxMjc4MjE3NTgiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTE1IiBzb3VyY2U9Im4xMyIgdGFyZ2V0PSJuMyI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iNjEuNzg5MTgxMTkzNjIzNjYiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0zMC4zNjM0ODAwNzMzMjgzOSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMTYiIHNvdXJjZT0ibjEyIiB0YXJnZXQ9Im4zIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIyNS4zOTA1OTI3ODQ1ODYxNzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii00OC4yNzQ1MzYxMzI4MTI1Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgIDwvZ3JhcGg+CisgIDxkYXRhIGtleT0iZDciPgorICAgIDx5OlJlc291cmNlcy8+CisgIDwvZGF0YT4KKzwvZ3JhcGhtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9pbWFnZS5odG1sIGIvbWFudWFsL1Rhc2tzL2ltYWdlLmh0bWwKaW5kZXggMDc3YjM3Mi4uNThiMGJjMCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2ltYWdlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2ltYWdlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyNDggKzE1LDU3MCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SW1hZ2UgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iaW1hZ2UiPkltYWdlPC9hPjwvaDI+Cis8aDIgaWQ9ImltYWdlIj5JbWFnZTwvaDI+Cis8aDM+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT48L2gzPgorPHA+PGVtPlRoaXMgdGFzayBoYXMgYmVlbiA8dT5kZXByZWNhdGVkPC91PiwgYmVjYXVzZSBKYXZhIEFkdmFuY2VkIEltYWdlIEFQSSBkZXBlbmRzIG9uIGludGVybmFsCitjbGFzc2VzIHdoaWNoIHdlcmUgcmVtb3ZlZCBpbiBKYXZhIDkuIFVzZSB0aGUgPGNvZGU+SW1hZ2VJTzwvY29kZT4gdGFzayBpbnN0ZWFkLjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIDxwPkFwcGxpZXMgYSBjaGFpbiBvZiBpbWFnZSBvcGVyYXRpb25zIG9uIGEgc2V0IG9mIGZpbGVzLjwvcD4KIDxwPlJlcXVpcmVzIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5KYXZhIEFkdmFuY2VkIEltYWdlIEFQSTwvYT4gZnJvbSBTdW4uPC9wPgogCiA8aDU+T3ZlcnZpZXcgb2YgdXNlZCBkYXRhdHlwZXM8L2g1PgotPGltZyBzcmM9ImltYWdlLWNsYXNzZGlhZ3JhbS5naWYiIGJvcmRlcj0iMCIgYWx0PSJDbGFzcy1EaWFncmFtIj4KLQorPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsLW9wYWNpdHk9IjEiCisgICAgIGNvbG9yLXJlbmRlcmluZz0iYXV0byIgY29sb3ItaW50ZXJwb2xhdGlvbj0iYXV0byIgdGV4dC1yZW5kZXJpbmc9ImF1dG8iIHN0cm9rZT0iYmxhY2siCisgICAgIHN0cm9rZS1saW5lY2FwPSJzcXVhcmUiIHZpZXdCb3g9IjAgMCAxNDQ2IDkzNyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzaGFwZS1yZW5kZXJpbmc9ImF1dG8iCisgICAgIHN0cm9rZS1vcGFjaXR5PSIxIiBmaWxsPSJibGFjayIgc3Ryb2tlLWRhc2hhcnJheT0ibm9uZSIgZm9udC13ZWlnaHQ9Im5vcm1hbCIgc3Ryb2tlLXdpZHRoPSIxIgorICAgICBmb250LWZhbWlseT0iU2Fucy1TZXJpZiIgZm9udC1zdHlsZT0ibm9ybWFsIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIiBmb250LXNpemU9IjEycHgiIHJvbGU9ImltZyIKKyAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGltYWdlLXJlbmRlcmluZz0iYXV0byIgYXJpYS1sYWJlbGxlZGJ5PSJkaWFncmFtVGl0bGUgZGlhZ3JhbURlc2NyaXB0aW9uIj4KKyAgPHRpdGxlIGlkPSJkaWFncmFtVGl0bGUiPkltYWdlT3BlcmF0aW9uIGNsYXNzIGRpYWdyYW08L3RpdGxlPgorICA8ZGVzYyBpZD0iZGlhZ3JhbURlc2NyaXB0aW9uIj5BIGRpYWdyYW0gb2YgQW50IERhdGFUeXBlIGNsYXNzZXMgdXNlZCBieSBJbWFnZSB0YXNrLjwvZGVzYz4KKyAgPGRlZnMgaWQ9ImdlbmVyaWNEZWZzIi8+CisgIDxnPgorICAgIDxkZWZzIGlkPSJkZWZzMSI+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDEiPgorICAgICAgICA8cGF0aCBkPSJNMCAwIEwxNDQ2IDAgTDE0NDYgOTM3IEwwIDkzNyBMMCAwIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDIiPgorICAgICAgICA8cGF0aCBkPSJNLTQyNSAtMTE5IEwxMDIxIC0xMTkgTDEwMjEgODE4IEwtNDI1IDgxOCBMLTQyNSAtMTE5IFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDMiPgorICAgICAgICA8cGF0aCBkPSJNMjA3IC0xMTMgTDIwNyAtNjYgTDQ1MiAtNjYgTDQ1MiAtMTEzIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQiPgorICAgICAgICA8cGF0aCBkPSJNMjUyIDAgTDI1MiAxMTkgTDQwNyAxMTkgTDQwNyAwIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDUiPgorICAgICAgICA8cGF0aCBkPSJNLTI0IDEwNiBMLTI0IDE5NCBMMTQ0IDE5NCBMMTQ0IDEwNiBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGg2Ij4KKyAgICAgICAgPHBhdGggZD0iTTUzNyAxMDUgTDUzNyAxODEgTDkwMyAxODEgTDkwMyAxMDUgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNyI+CisgICAgICAgIDxwYXRoIGQ9Ik0yMDkgNDc4IEwyMDkgNTYxIEw0NDYgNTYxIEw0NDYgNDc4IFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDgiPgorICAgICAgICA8cGF0aCBkPSJNNTYyIDU0MSBMNTYyIDgxMiBMODEzIDgxMiBMODEzIDU0MSBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGg5Ij4KKyAgICAgICAgPHBhdGggZD0iTTI1NyAyNzIgTDI1NyA0MDIgTDQwMyA0MDIgTDQwMyAyNzIgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoMTAiPgorICAgICAgICA8cGF0aCBkPSJNNDQ3IDI3MSBMNDQ3IDMzMCBMNTczIDMzMCBMNTczIDI3MSBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGgxMSI+CisgICAgICAgIDxwYXRoIGQ9Ik02MTQgMjcxIEw2MTQgMzU5IEw4MjYgMzU5IEw4MjYgMjcxIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDEyIj4KKyAgICAgICAgPHBhdGggZD0iTTg3NCAyNzAgTDg3NCAzNzQgTDEwMTYgMzc0IEwxMDE2IDI3MCBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGgxMyI+CisgICAgICAgIDxwYXRoIGQ9Ik0zIDI3MiBMMyAzNzQgTDEyMyAzNzQgTDEyMyAyNzIgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoMTQiPgorICAgICAgICA8cGF0aCBkPSJNLTE2NSAyNzAgTC0xNjUgMzQ0IEwtNDUgMzQ0IEwtNDUgMjcwIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDE1Ij4KKyAgICAgICAgPHBhdGggZD0iTS0zNzUgMjcwIEwtMzc1IDM4NSBMLTIwOCAzODUgTC0yMDggMjcwIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgPC9kZWZzPgorICAgIDxnIGZpbGw9InJnYigyNTUsMjA0LDE1MykiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiBzdHJva2U9InJnYigyNTUsMjA0LDE1MykiPgorICAgICAgPHJlY3QgeD0iMjA4IiB3aWR0aD0iMjQzIiBoZWlnaHQ9IjQ1IiB5PSItMTEyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiBzdHJva2U9InJnYigyNTUsMjU1LDIxOCkiPgorICAgICAgPHJlY3QgeD0iMjA3IiB3aWR0aD0iMSIgaGVpZ2h0PSI0NyIgeT0iLTExMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMjA4IiB3aWR0aD0iMjQzIiBoZWlnaHQ9IjEiIHk9Ii0xMTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIwOCIgeT0iLTY3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjI0NCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ1MSIgeT0iLTExMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjQ2IiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSIyMTQuNTQyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTk1LjU1MzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMpIiBzdHJva2U9Im5vbmUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iLTg3IiBmaWxsPSJub25lIiB4MT0iMjA4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzKSIgeDI9IjQ1MSIgeTE9Ii04NyIvPgorICAgICAgPGxpbmUgeTI9Ii03NyIgZmlsbD0ibm9uZSIgeDE9IjIwOCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMykiIHgyPSI0NTEiIHkxPSItNzciLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMTIuNSIgeT0iLTYxLjIwOTUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+IDwvdGV4dD4KKyAgICAgIDxyZWN0IHg9IjI1MyIgeT0iMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjA0LDE1MykiIHdpZHRoPSIxNTMiIGhlaWdodD0iMTE3IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjI1MiIgeT0iMCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjExOSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTMiIHk9IjAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTUzIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMjUzIiB5PSIxMTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMTU0IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNDA2IiB5PSIwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iMTE4IiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LXN0eWxlPSJpdGFsaWMiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9IjI3OS4zNzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjE3LjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBzdHJva2U9Im5vbmUiPkltYWdlT3BlcmF0aW9uPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iMjUiIGZpbGw9Im5vbmUiIHgxPSIyNTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiB4Mj0iNDA2IiB5MT0iMjUiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyNTciIHk9IjQxLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aW5zdHJ1Y3Rpb25zIDogVmVjdG9yPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjQ5IiBmaWxsPSJub25lIiB4MT0iMjUzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg0KSIgeDI9IjQwNiIgeTE9IjQ5Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjU3IiB5PSI2Ni4wNDQ5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg0KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFkZFJvdGF0ZShSb3RhdGUgOiBpbnN0cik8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjU3IiB5PSI4MC4xNzc3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg0KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFkZERyYXcoRHJhdyA6IGluc3RyKTwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyNTciIHk9Ijk0LjMxMDUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkVGV4dChUZXh0IDogaW5zdHIpPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI1NyIgeT0iMTA4LjQ0MzQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkU2NhbGUoU2NhbGUgOiBpbnN0cik8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTS00MTkuMTA1MSA0NjkuNTkzIEwtMTczLjU1NDMgNDY5LjU5MyBMLTE3My41NTQzIDQ4NC41OTMgTC0xNTguNTU0MyA0ODQuNTkzIEwtMTU4LjU1NDMgNTc0LjU5MyBMLTQxOS4xMDUxIDU3NC41OTMgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTS0xNzMuNTU0MyA0NjkuNTkzIEwtMTczLjU1NDMgNDg0LjU5MyBMLTE1OC41NTQzIDQ4NC41OTMgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjQ5MS4yOTYxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPlRoZSBzZXRUeXBlKCkgbWV0aG9kIGZvcmNlcyB0eXBlIHRvPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii00MTIuMTA1MSIgeT0iNTA1LjQyODkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+b25lIG9mIHRoZSB2YWx1ZXMgb2YgamF2YS5hd3QuZ2VvbS5BcmMyRDo8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTQxMi4xMDUxIiB5PSI1MTkuNTYxNyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5vcGVuID0gQXJjMkQuT1BFTjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjUzMy42OTQ1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPnBpZSA9IEFyYzJELlBJRTwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjU0Ny44MjczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmNob3JkID0gQXJjMkQuQ0hPUkQ8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTQxMi4xMDUxIiB5PSI1NjEuOTYwMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5QYXJhbWV0ZXIgaXMgbm90IGNhc2Utc2Vuc2l0aXZlLjwvdGV4dD4KKyAgICAgIDxyZWN0IHg9Ii0yMyIgeT0iMTA3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjE2NiIgaGVpZ2h0PSI4NiIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMjQiIHk9IjEwNiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9Ijg4IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0yMyIgeT0iMTA2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjE2NiIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0yMyIgeT0iMTkzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjE2NyIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjE0MyIgeT0iMTA2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iODciIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMjUuMzEzMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMTIzLjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBzdHJva2U9Im5vbmUiPkJhc2ljU2hhcGU8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIj4KKyAgICAgIDxsaW5lIHkyPSIxMzEiIGZpbGw9Im5vbmUiIHgxPSItMjMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiB4Mj0iMTQzIiB5MT0iMTMxIi8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTE5IiB5PSIxNDcuOTEyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5zdHJva2Vfd2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0xOSIgeT0iMTYyLjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ZmlsbCA6IFN0cmluZyA9ICJ0cmFuc3BhcmVudCI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTE5IiB5PSIxNzYuMTc3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5zdHJva2UgOiBTdHJpbmcgPSAiYmxhY2siPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjE4MyIgZmlsbD0ibm9uZSIgeDE9Ii0yMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNSkiIHgyPSIxNDMiIHkxPSIxODMiLz4KKyAgICAgIDxyZWN0IHg9IjUzOCIgeT0iMTA2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjM2NCIgaGVpZ2h0PSI3NCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1MzciIHk9IjEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9Ijc2IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjUzOCIgeT0iMTA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjM2NCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjUzOCIgeT0iMTgwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjM2NSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjkwMiIgeT0iMTA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNzUiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNjU1LjgzNDciIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjEyMi41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg2KSIgc3Ryb2tlPSJub25lIj5UcmFuc2Zvcm1PcGVyYXRpb248L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIj4KKyAgICAgIDxsaW5lIHkyPSIxMzAiIGZpbGw9Im5vbmUiIHgxPSI1MzgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiB4Mj0iOTAyIiB5MT0iMTMwIi8+CisgICAgICA8bGluZSB5Mj0iMTQwIiBmaWxsPSJub25lIiB4MT0iNTM4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg2KSIgeDI9IjkwMiIgeTE9IjE0MCIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU0MiIgeT0iMTU2LjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZSBpbWcpIDogUGxhbmFySW1hZ2U8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTQyIiB5PSIxNzEuMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIGluc3RyKTwvdGV4dD4KKyAgICAgIDxyZWN0IHg9IjIxMCIgeT0iNDc5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjIzNSIgaGVpZ2h0PSI4MSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyMDkiIHk9IjQ3OCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjgzIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIxMCIgeT0iNDc4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjIzNSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIxMCIgeT0iNTYwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjIzNiIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ0NSIgeT0iNDc4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iODIiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI4My44MzQ0IiB5PSI0OTQuODA3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNykiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj4mbHQ7Jmx0O2ludGVyZmFjZSZndDsmZ3Q7PC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMjgwLjg3MzkiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjUxOC45MDczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg3KSIgc3Ryb2tlPSJub25lIj5EcmF3T3BlcmF0aW9uPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iNTI2IiBmaWxsPSJub25lIiB4MT0iMjEwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg3KSIgeDI9IjQ0NiIgeTE9IjUyNiIvPgorICAgICAgPGxpbmUgeTI9IjUzNiIgZmlsbD0ibm9uZSIgeDE9IjIxMCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNykiIHgyPSI0NDYiIHkxPSI1MzYiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMTQuNTk1MSIgeT0iNTUzLjI1MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNykiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5leGVjdXRlRHJhd09wZXJhdGlvbigpIDogUGxhbmFySW1hZ2U8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTTIyMC4zMTc4IDYzNS44NjY1IEw0MjEuMzc4MyA2MzUuODY2NSBMNDIxLjM3ODMgNjUwLjg2NjUgTDQzNi4zNzgzIDY1MC44NjY1IEw0MzYuMzc4MyA3MTEuNjIzMyBMMjIwLjMxNzggNzExLjYyMzMgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTTQyMS4zNzgzIDYzNS44NjY1IEw0MjEuMzc4MyA2NTAuODY2NSBMNDM2LjM3ODMgNjUwLjg2NjUgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMjcuMzE3OCIgeT0iNjU3LjA4MDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+VGhlIGltcGxlbWVudGluZyBjbGFzcyB1c2VzPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjIyNy4zMTc4IiB5PSI2NzEuMjEzNyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5Db2xvck1hcHBlciB0byBldmFsdWF0ZSB0aGUgY29sb3IuPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjIyNy4zMTc4IiB5PSI2ODUuMzQ2NSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5Pbmx5IHRoZSB2YWx1ZXMgZGVmaW5lZCBpbjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMjcuMzE3OCIgeT0iNjk5LjQ3OTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q29sb3JNYXBwZXIgYXJlIHVzZWQuPC90ZXh0PgorICAgICAgPHJlY3QgeD0iNTYzIiB5PSI1NDIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMjQ5IiBoZWlnaHQ9IjI2OSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjIiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjI3MSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjMiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIyNDkiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjMiIHk9IjgxMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIyNTAiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI4MTIiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjI3MCIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDI1LDExOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNjQ3LjY3NTQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjU1OC45MDU1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgc3Ryb2tlPSJub25lIj5Db2xvck1hcHBlcjwvdGV4dD4KKyAgICA8L2c+CisgICAgPGcgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDI1LDExOSkiPgorICAgICAgPGxpbmUgeTI9IjU2NiIgZmlsbD0ibm9uZSIgeDE9IjU2MyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIHgyPSI4MTIiIHkxPSI1NjYiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNTgzLjI0OTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfQkxBQ0sgOiBTdHJpbmcgPSAiYmxhY2siPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI1OTcuMzgyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9CTFVFIDogU3RyaW5nID0gImJsdWUiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2MTEuNTE0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9DWUFOIDogU3RyaW5nID0gImN5YW4iPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2MjUuNjQ3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9EQVJLR1JBWSA6IFN0cmluZyA9ICJkYXJrZ3JheSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjYzOS43ODA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0dSQVkgOiBTdHJpbmcgPSAiZ3JheSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjY1My45MTMzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0xJR0hUR1JBWSA6IFN0cmluZyA9ICJsaWdodGdyYXkiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2NjguMDQ2MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9EQVJLR1JFWSA6IFN0cmluZyA9ICJkYXJrZ3JleSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjY4Mi4xNzkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfR1JFWSA6IFN0cmluZyA9ICJncmV5IjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNjk2LjMxMTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfTElHSFRHUkVZIDogU3RyaW5nID0gImxpZ2h0Z3JleSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjcxMC40NDQ2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0dSRUVOIDogU3RyaW5nID0gImdyZWVuIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzI0LjU3NzQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfTUFHRU5UQSA6IFN0cmluZyA9ICJtYWdlbnRhIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzM4LjcxMDIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfT1JBTkdFIDogU3RyaW5nID0gIm9yYW5nZSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9Ijc1Mi44NDMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfUElOSyA6IFN0cmluZyA9ICJwaW5rIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzY2Ljk3NTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfUkVEIDogU3RyaW5nID0gInJlZCI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9Ijc4MS4xMDg2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX1dISVRFIDogU3RyaW5nID0gIndoaXRlIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzk1LjI0MTUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfWUVMTE9XIDogU3RyaW5nID0gInllbGxvdyI8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iODAyIiBmaWxsPSJub25lIiB4MT0iNTYzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgeDI9IjgxMiIgeTE9IjgwMiIvPgorICAgICAgPHJlY3QgeD0iMjU4IiB5PSIyNzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMTQ0IiBoZWlnaHQ9IjEyOCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTciIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjEzMCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTgiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxNDQiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTgiIHk9IjQwMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxNDUiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0MDIiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjEyOSIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDI1LDExOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMzE1Ljg1MTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgc3Ryb2tlPSJub25lIj5UZXh0PC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iMjk3IiBmaWxsPSJub25lIiB4MT0iMjU4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgeDI9IjQwMiIgeTE9IjI5NyIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzEzLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RyaW5nIDogU3RyaW5nID0gIiI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjYyIiB5PSIzMjguMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5mb250IDogU3RyaW5nID0gIkFyaWFsIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyNjIiIHk9IjM0Mi4xNzc3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPnBvaW50IDogaW50ID0gMTA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjYyIiB5PSIzNTYuMzEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5ib2xkIDogYm9vbGVhbiA9IGZhbHNlPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzcwLjQ0MzQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Y29sb3IgOiBTdHJpbmcgPSAiYmxhY2siPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzg0LjU3NjIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aXRhbGljIDogYm9vbGVhbiA9IGZhbHNlPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjM5MiIgZmlsbD0ibm9uZSIgeDE9IjI1OCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIHgyPSI0MDIiIHkxPSIzOTIiLz4KKyAgICAgIDxyZWN0IHg9IjQ0OCIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjEyNCIgaGVpZ2h0PSI1NyIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0NDciIHk9IjI3MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjU5IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ0OCIgeT0iMjcxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEyNCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ0OCIgeT0iMzI5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEyNSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjU3MiIgeT0iMjcxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNTgiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9IjQ4OS44MjQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OC41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIHN0cm9rZT0ibm9uZSI+Um90YXRlPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iMjk2IiBmaWxsPSJub25lIiB4MT0iNDQ4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIHgyPSI1NzIiIHkxPSIyOTYiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI0NTIiIHk9IjMxMi45MTIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hbmdsZSA6IGZsb2F0ID0gMC4wRjwvdGV4dD4KKyAgICAgIDxsaW5lIHkyPSIzMjAiIGZpbGw9Im5vbmUiIHgxPSI0NDgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEwKSIgeDI9IjU3MiIgeTE9IjMyMCIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijg2IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjYxNCIgeT0iMjcxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEiIGhlaWdodD0iODgiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIyNzEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIzNTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMjExIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODI1IiB5PSIyNzEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSI4NyIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDI1LDExOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNzA0LjA4MDEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OC41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIHN0cm9rZT0ibm9uZSI+U2NhbGU8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIj4KKyAgICAgIDxsaW5lIHkyPSIyOTYiIGZpbGw9Im5vbmUiIHgxPSI2MTUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgeDI9IjgyNSIgeTE9IjI5NiIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjYxOSIgeT0iMzEyLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPndpZHRoIDogU3RyaW5nID0gIjEwMCUiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjYxOSIgeT0iMzI3LjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmhlaWdodCA6IFN0cmluZyA9ICIxMDAlIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI2MTkiIHk9IjM0MS4xNzc3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5rZWVwUHJvcG9ydGlvbnMgOiBib29sZWFuID0gZmFsc2U8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzQ4IiBmaWxsPSJub25lIiB4MT0iNjE1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIHgyPSI4MjUiIHkxPSIzNDgiLz4KKyAgICAgIDxyZWN0IHg9Ijg3NSIgeT0iMjcxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjE0MCIgaGVpZ2h0PSIxMDIiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc0IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMDQiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc1IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc1IiB5PSIzNzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMTQxIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMTAxNSIgeT0iMjcwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iMTAzIiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSI5MjguODczOCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjg3LjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEyKSIgc3Ryb2tlPSJub25lIj5EcmF3PC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iMjk1IiBmaWxsPSJub25lIiB4MT0iODc1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMikiIHgyPSIxMDE1IiB5MT0iMjk1Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzMTEuOTEyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+eGxvYyA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzMjYuMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+eWxvYyA6IGludCA9IDA8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzMzIiBmaWxsPSJub25lIiB4MT0iODc1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMikiIHgyPSIxMDE1IiB5MT0iMzMzIi8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzNTAuMTc3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkRWxsaXBzZShFbGxpcHNlIGVsaXApPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ijg3OSIgeT0iMzY0LjMxMDUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFkZEFyYyhBcmMgYXJjKTwvdGV4dD4KKyAgICAgIDxyZWN0IHg9IjQiIHk9IjI3MyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjA0LDE1MykiIHdpZHRoPSIxMTgiIGhlaWdodD0iMTAwIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjMiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjEwMiIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTE4IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNCIgeT0iMzczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjExOSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjEyMiIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iMTAxIiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSIzMi40OTk1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyOTAuMDY4NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTMpIiBzdHJva2U9Im5vbmUiPlJlY3RhbmdsZTwvdGV4dD4KKyAgICA8L2c+CisgICAgPGcgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDI1LDExOSkiPgorICAgICAgPGxpbmUgeTI9IjI5NyIgZmlsbD0ibm9uZSIgeDE9IjQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgeDI9IjEyMiIgeTE9IjI5NyIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjguMTY4MyIgeT0iMzE0LjQxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmhlaWdodCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iOC4xNjgzIiB5PSIzMjguNTQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTMpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+d2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjguMTY4MyIgeT0iMzQyLjY3NzciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFyY2hlaWdodCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iOC4xNjgzIiB5PSIzNTYuODEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTMpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YXJjd2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjM2NCIgZmlsbD0ibm9uZSIgeDE9IjQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgeDI9IjEyMiIgeTE9IjM2NCIvPgorICAgICAgPHJlY3QgeD0iLTE2NCIgeT0iMjcxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjExOCIgaGVpZ2h0PSI3MiIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMTY1IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSI3NCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMTY0IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTE4IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTE2NCIgeT0iMzQzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjExOSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii00NiIgeT0iMjcwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNzMiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9Ii0xMjUuMzE3OCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjg4LjQ0NjciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE0KSIgc3Ryb2tlPSJub25lIj5FbGxpcHNlPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MjUsMTE5KSI+CisgICAgICA8bGluZSB5Mj0iMjk2IiBmaWxsPSJub25lIiB4MT0iLTE2NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTQpIiB4Mj0iLTQ2IiB5MT0iMjk2Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTE2MC4xMzIzIiB5PSIzMTIuNzkwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aGVpZ2h0IDogaW50ID0gMDwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItMTYwLjEzMjMiIHk9IjMyNi45MjMzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj53aWR0aCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzM0IiBmaWxsPSJub25lIiB4MT0iLTE2NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTQpIiB4Mj0iLTQ2IiB5MT0iMzM0Ii8+CisgICAgICA8cmVjdCB4PSItMzc0IiB5PSIyNzEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMTY1IiBoZWlnaHQ9IjExMyIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMzc1IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMTUiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTM3NCIgeT0iMjcwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjE2NSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0zNzQiIHk9IjM4NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxNjYiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMjA5IiB5PSIyNzAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMTQiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9Ii0zMDIuMzQyNyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjg4LjA2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE1KSIgc3Ryb2tlPSJub25lIj5BcmM8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIj4KKyAgICAgIDxsaW5lIHkyPSIyOTUiIGZpbGw9Im5vbmUiIHgxPSItMzc0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIHgyPSItMjA5IiB5MT0iMjk1Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTM3MC4zNjkiIHk9IjMxMi40MTIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5oZWlnaHQgOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0zNzAuMzY5IiB5PSIzMjYuNTQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+d2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0zNzAuMzY5IiB5PSIzNDAuNjc3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RhcnQgOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0zNzAuMzY5IiB5PSIzNTQuODEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RvcCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTM3MC4zNjkiIHk9IjM2OC45NDM0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj50eXBlIDogZW51bWVyYXRlZCA9IG9wZW48L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzc2IiBmaWxsPSJub25lIiB4MT0iLTM3NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTUpIiB4Mj0iLTIwOSIgeTE9IjM3NiIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIGQ9Ik0zMjkuOTU2NyAtMC4wMTY1IEwzMjkuOTgxNCAtNTEuMTI2NSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+CisgICAgPC9nPgorICAgIDxnIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQyNSwxMTkpIiBmaWxsPSJ3aGl0ZSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZT0id2hpdGUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDxwYXRoIGQ9Ik0zMjkuOTg4NiAtNjYuMTI2NSBMMzIzLjk4MDkgLTUwLjEyOTQgTDMzNS45ODA5IC01MC4xMjM2IFoiIHN0cm9rZT0ibm9uZSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiLz4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zMjkuOTg4NiAtNjYuMTI2NSBMMzIzLjk4MDkgLTUwLjEyOTQgTDMzNS45ODA5IC01MC4xMjM2IFoiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8dGV4dCBmaWxsPSJibGFjayIgeD0iMzU4LjA3NDIiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0yOC41MjU3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTE0My45OSAxMjEuOTIwMiBMMjM3Ljc1ODYgOTAuNTcxMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDxwYXRoIGQ9Ik0yNTEuOTg0NiA4NS44MTUgTDIzNC45MDc3IDg1LjE5NzggTDIzOC43MTI2IDk2LjU3ODYgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTI1MS45ODQ2IDg1LjgxNSBMMjM0LjkwNzcgODUuMTk3OCBMMjM4LjcxMjYgOTYuNTc4NiBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjE5Ni40MDg0IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxMzkuOTI4MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik01MzcuMDEwOCAxMTkuODc1OCBMNDIyLjI2NzIgODYuNTY0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDxwYXRoIGQ9Ik00MDcuODYxOSA4Mi4zODIxIEw0MjEuNTU0NyA5Mi42MDUgTDQyNC45MDAzIDgxLjA4MDggWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTQwNy44NjE5IDgyLjM4MjEgTDQyMS41NTQ3IDkyLjYwNSBMNDI0LjkwMDMgODEuMDgwOCBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjQ3OC45MzkxIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSI3Ni44NjQ0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTI5Ny45MzI5IDQ3OC4yMTk4IEw5MS45MTk5IDE5NC4wMzI0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjIyOC43ODExIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzMzguODY3NiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZS1kYXNoYXJyYXk9IjYsMiIgZD0iTTMyOC4zNDggNjM1Ljg0MDIgTDMyOC4zNDggNTYyLjE2NjYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSIzNTYuNDQ5NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNjAzLjU0MTciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtZGFzaGFycmF5PSI2LDIiIGQ9Ik01NjIuNzA4NCA2NzUuODk1OCBMNDM2LjQwMjEgNjc0LjczNjYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI0OTcuNjQ1OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNjQ5Ljg1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTMyOC43MjY3IDQ3OC4xODM2IEwzMjkuNDE0IDQwMS45NzM0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjM1Ny4xNzI5IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSI0NDQuNjM4MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zMjkuOTgzMSAyNzEuOTg3MyBMMzI5Ljk0NzIgMTM0LjUyNDMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNMzI5Ljk0MzMgMTE5LjUyNDMgTDMyMy45NDc1IDEzNS41MjU5IEwzMzUuOTQ3NSAxMzUuNTIyNyBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMzI5Ljk0MzMgMTE5LjUyNDMgTDMyMy45NDc1IDEzNS41MjU5IEwzMzUuOTQ3NSAxMzUuNTIyNyBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjM1OC4wNjQ4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyMDAuMjkxOSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zNjMuMDUwOCA0NzguMjA5NCBMNDg1LjYyMjEgMzI5Ljk4MDgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8dGV4dCBmaWxsPSJibGFjayIgeD0iNDU5LjI3MTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjQxMS4xNjM5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTU0OS4zNDk0IDI3MC45ODggTDY1Ny4zMTczIDE5MC4wMTIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTTY2OS4zMTczIDE4MS4wMTIxIEw2NTIuOTE3MiAxODUuODEyMSBMNjYwLjExNzIgMTk1LjQxMiBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNjY5LjMxNzMgMTgxLjAxMjEgTDY1Mi45MTcyIDE4NS44MTIxIEw2NjAuMTE3MiAxOTUuNDEyIFoiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8dGV4dCBmaWxsPSJibGFjayIgeD0iNjMyLjcxNzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI0OS4wNzMyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTQwOC40NTIxIDQ3OC4yMTE5IEw2MzUuOTkwMSAzNTkuMDEwNiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI1NTEuMDY3MyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNDQwLjkwNzUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNzIwIDI3MS4wMzQyIEw3MjAgMTk1Ljk3ODkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNNzIwIDE4MC45Nzg5IEw3MTQgMTk2Ljk3ODkgTDcyNiAxOTYuOTc4OSBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNzIwIDE4MC45Nzg5IEw3MTQgMTk2Ljk3ODkgTDcyNiAxOTYuOTc4OSBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9Ijc0OC4xMDE2IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyMzAuNTM1MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik04NzkuNjU4OCAyNzAuMDE3NSBMNzc5LjQ4OCAxOTAuMzI2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTTc2Ny43NDk1IDE4MC45ODc0IEw3NzYuNTM1MSAxOTUuNjQzOSBMNzg0LjAwNTkgMTg2LjI1MzIgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTc2Ny43NDk1IDE4MC45ODc0IEw3NzYuNTM1MSAxOTUuNjQzOSBMNzg0LjAwNTkgMTg2LjI1MzIgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI4NjQuMDc1NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjI1LjMyOTkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNjIuMjM2MiAyNzIuNDU4MSBMNjEuMDc3IDIwOC45NzYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNNjAuODAzMSAxOTMuOTc4NSBMNTUuMDk2MiAyMTAuMDg1NCBMNjcuMDk0MiAyMDkuODY2MyBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNjAuODAzMSAxOTMuOTc4NSBMNTUuMDk2MiAyMTAuMDg1NCBMNjcuMDk0MiAyMDkuODY2MyBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9Ijg5LjYyNjgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjIzNy43ODUyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS02Ni40NDk2IDI3MC44OTQ5IEwzLjEyODYgMjA0LjM3MzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNMTMuOTcwNiAxOTQuMDA3NCBMLTEuNzQwNiAyMDAuNzI3NCBMNi41NTIxIDIwOS40MDExIFoiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0xMy45NzA2IDE5NC4wMDc0IEwtMS43NDA2IDIwMC43Mjc0IEw2LjU1MjEgMjA5LjQwMTEgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSItMi42NjA0IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyNTQuMTMzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlLWRhc2hhcnJheT0iNiwyIiBkPSJNLTI4OS42NTEyIDQ2OS42MzY3IEwtMjkwLjk2ODYgMzg1LjUwNTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSItMjYyLjIwNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNDMyLjA4MTYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNLTI3MS4yMDg4IDI3MC40ODQ0IEwtMzguMDcxIDE4NS42NzU0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTS0yMy45NzQ3IDE4MC41NDc2IEwtNDEuMDYxOSAxODAuMzc4OCBMLTM2Ljk1OTYgMTkxLjY1NTggWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS0yMy45NzQ3IDE4MC41NDc2IEwtNDEuMDYxOSAxODAuMzc4OCBMLTM2Ljk1OTYgMTkxLjY1NTggWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSItMTA4LjUwNTkiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI0Ny4wNjU1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgIDwvZz4KKyAgPC9nPgorPC9zdmc+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBmYWlsb25lcnJvciA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IEJvb2xlYW4gdmFsdWUuIElmIGZhbHNlLCBub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLiA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4gbm8gKGRlZmF1bHRzIHRvIDxpPnRydWU8L2k+KSA8L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPkJvb2xlYW4gdmFsdWUuIElmIDxxPmZhbHNlPC9xPiwgbm90ZSBlcnJvcnMgdG8gdGhlIG91dHB1dCBidXQga2VlcCBnb2luZy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gc3JjZGlyIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcy4gPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+IHllcywgdW5sZXNzIG5lc3RlZCBmaWxlc2V0IGlzIHVzZWQgPC90ZD4KKyAgICA8dGQ+c3JjZGlyPC90ZD4KKyAgICA8dGQ+RGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcy48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBuZXN0ZWQgZmlsZXNldCBpcyB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IGVuY29kaW5nIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gSW1hZ2UgZW5jb2RpbmcgdHlwZS4gPGJyPgotICAgICAgVmFsaWQgKGNhc2VpbnNlbnNpdGl2ZSkgYXJlOiBqcGcsIGpwZWcsIHRpZiwgdGlmZgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPkltYWdlIGVuY29kaW5nIHR5cGUuPGJyLz5WYWxpZCAoY2FzZSBpbnNlbnNpdGl2ZSkKKyAgICAgIGFyZTogPHE+anBnPC9xPiwgPHE+anBlZzwvcT4sIDxxPnRpZjwvcT4sIDxxPnRpZmY8L3E+CiAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT5KUEVHPC9pPikgPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmpwZWc8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IG92ZXJ3cml0ZSA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IEJvb2xlYW4gdmFsdWUuIFNldHMgd2hldGhlciBvciBub3QgdG8gb3ZlcndyaXRlCi0gICAgICBhIGZpbGUgaWYgdGhlcmUgaXMgbmFtaW5nIGNvbmZsaWN0LgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+KSA8L3RkPgorICAgIDx0ZD5vdmVyd3JpdGU8L3RkPgorICAgIDx0ZD5Cb29sZWFuIHZhbHVlLiBTZXRzIHdoZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSBhIGZpbGUgaWYgdGhlcmUgaXMgbmFtaW5nIGNvbmZsaWN0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gZ2MgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBCb29sZWFuIHZhbHVlLiBFbmFibGVzIGdhcmJhZ2UgY29sbGVjdGlvbiBhZnRlcgotICAgICAgZWFjaCBpbWFnZSBwcm9jZXNzZWQuCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4pIDwvdGQ+CisgICAgPHRkPmdjPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gRW5hYmxlcyBnYXJiYWdlIGNvbGxlY3Rpb24gYWZ0ZXIgZWFjaCBpbWFnZSBwcm9jZXNzZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBkZXN0ZGlyIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gRGlyZWN0b3J5IHdoZXJlIHRoZSByZXN1bHQgaW1hZ2VzIGFyZSBzdG9yZWQuIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gdmFsdWUgb2YgPGk+c3JjZGlyPC9pPikgPC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPkRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzdWx0IGltYWdlcyBhcmUgc3RvcmVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB2YWx1ZSBvZiA8dmFyPnNyY2RpcjwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDwhLS0gYXR0cmlidXRlcyBpbmhlcml0ZWQgZnJvbSBNYXRjaGluZ1Rhc2sgLS0+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGFsbCAoPHE+Kio8L3E+KTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCAoPHE+eWVzfG5vPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gY2FzZVNlbnNpdGl2ZSA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IEJvb2xlYW4gdmFsdWUuIFNldHMgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgZmlsZSBzeXN0ZW0uIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+ZmFsc2U8L2k+KSA8L3RkPgorICAgIDx0ZD5jYXNlU2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gU2V0cyBjYXNlIHNlbnNpdGl2aXR5IG9mIHRoZSBmaWxlIHN5c3RlbS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IGZvbGxvd1N5bWxpbmtzIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gQm9vbGVhbiB2YWx1ZS4gU2V0cyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+dHJ1ZTwvaT4pIDwvdGQ+CisgICAgPHRkPmZvbGxvd1N5bWxpbmtzPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gU2V0cyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgotPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCi1zdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBhcyB3ZWxsIGFzIHRoZQotbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0CithdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gYXMgd2VsbCBhcyB0aGUKK25lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiAKLQotPGg0PkltYWdlT3BlcmF0aW9uPC9oND4KLTxwPkFkZHMgYW4gSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uPC9wPgotPGg1Pk5lc3RlZCBFbGVtZW50czwvaDU+Ci1JbWFnZU9wZXJhdGlvbiBjYW4gaGFuZGxlIG5lc3RlZCBSb3RhdGUsIERyYXcsIFJlY3RhbmdsZSwgVGV4dCBhbmQgU2NhbGUgb2JqZWN0cy4KKzxwPlRoZSBmb2xsb3dpbmcgSW1hZ2VPcGVyYXRpb24gb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkIGFzIG5lc3RlZAorZWxlbWVudHM6IDxjb2RlPlJvdGF0ZTwvY29kZT4sIDxjb2RlPlNjYWxlPC9jb2RlPiBhbmQgPGNvZGU+RHJhdzwvY29kZT4uPC9wPgogCiA8aDQ+Um90YXRlPC9oND4KIDxwPkFkZHMgYSBSb3RhdGUgSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uPC9wPgogPGg1PlBhcmFtZXRlcnM8L2g1PgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gYW5nbGUgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBGbG9hdCB2YWx1ZS4gU2V0cyB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gZGVncmVlcy4gPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+IG5vIChkZWZhdWx0cyB0byA8aT4wLjBGPC9pPikgPC90ZD4KKyAgICA8dGQ+YW5nbGU8L3RkPgorICAgIDx0ZD5GbG9hdCB2YWx1ZS4gU2V0cyB0aGUgYW5nbGUgb2Ygcm90YXRpb24gaW4gZGVncmVlcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MC4wRjwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGg0PlNjYWxlPC9oND4KIDxwPkFkZHMgYSBTY2FsZSBJbWFnZU9wZXJhdGlvbiB0byBjaGFpbi48L3A+CiA8aDU+UGFyYW1ldGVyczwvaDU+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgPC90cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBwcm9wb3J0aW9ucyA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IFNldHMgd2hpY2ggZGltZW5zaW9uIHRvIGNvbnRyb2wgcHJvcG9ydGlvbnMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZTo8dWw+Ci0gICAgICAgIDxsaT4mcXVvdDtpZ25vcmUmcXVvdDsgLSAgdHJlYXQgdGhlIGRpbWVuc2lvbnMgaW5kZXBlbmRlbnRseS48L2xpPgotICAgICAgICA8bGk+JnF1b3Q7aGVpZ2h0JnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBiYXNlZCBvbiB0aGUgd2lkdGguPC9saT4KLSAgICAgICAgPGxpPiZxdW90O3dpZHRoJnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBiYXNlZCBvbiB0aGUgaGVpZ2h0LjwvbGk+Ci0gICAgICAgIDxsaT4mcXVvdDtjb3ZlciZxdW90OyAtIGtlZXAgcHJvcG9ydGlvbnMgYW5kIGZpdCBpbiB0aGUgc3VwcGxpZWQgZGltZW5zaW9ucy48L2xpPgotICAgICAgICA8bGk+JnF1b3Q7Zml0JnF1b3Q7IC0ga2VlcCBwcm9wb3J0aW9ucyBhbmQgY292ZXIgdGhlIHN1cHBsaWVkIGRpbWVuc2lvbnMuPC9saT4KLSAgICA8L3VsPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+aWdub3JlPC9pPikgPC90ZD4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IHdpZHRoIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gU2V0cyB0aGUgd2lkdGggb2YgdGhlIGltYWdlLCBlaXRoZXIgYXMgYW4gaW50ZWdlciBvciBhICUuIDwvdGQ+Ci0gICAgICAgIDwhLS0gdG9kbzogaWYgaW50ZWdlciwgd2hhdCBraW5kPyBjbSwgcHgsIGluY2hlcywgLi4uIC0tPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4gbm8gKGRlZmF1bHRzIHRvIDxpPjEwMCU8L2k+KSA8L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IGhlaWdodCA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IFNldHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGVpdGhlciBhcyBhbiBpbnRlZ2VyIG9yIGEgJS4gPC90ZD4KLSAgICAgICAgPCEtLSB0b2RvOiBpZiBpbnRlZ2VyLCB3aGF0IGtpbmQ/IGNtLCBweCwgaW5jaGVzLCAuLi4gLS0+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+MTAwJTwvaT4pIDwvdGQ+CisgICAgPHRkPnByb3BvcnRpb25zPC90ZD4KKyAgICA8dGQ+U2V0cyB3aGljaCBkaW1lbnNpb24gdG8gY29udHJvbCBwcm9wb3J0aW9ucyBmcm9tLiBWYWxpZCB2YWx1ZXMgYXJlOgorICAgICAgPHVsPgorICAgICAgICA8bGk+PHE+aWdub3JlPC9xPiZtZGFzaDt0cmVhdCB0aGUgZGltZW5zaW9ucyBpbmRlcGVuZGVudGx5LjwvbGk+CisgICAgICAgIDxsaT48cT5oZWlnaHQ8L3E+Jm1kYXNoO2tlZXAgcHJvcG9ydGlvbnMgYmFzZWQgb24gdGhlIHdpZHRoLjwvbGk+CisgICAgICAgIDxsaT48cT53aWR0aDwvcT4mbWRhc2g7a2VlcCBwcm9wb3J0aW9ucyBiYXNlZCBvbiB0aGUgaGVpZ2h0LjwvbGk+CisgICAgICAgIDxsaT48cT5jb3ZlcjwvcT4mbWRhc2g7a2VlcCBwcm9wb3J0aW9ucyBhbmQgZml0IGluIHRoZSBzdXBwbGllZCBkaW1lbnNpb25zLjwvbGk+CisgICAgICAgIDxsaT48cT5maXQ8L3E+Jm1kYXNoO2tlZXAgcHJvcG9ydGlvbnMgYW5kIGNvdmVyIHRoZSBzdXBwbGllZCBkaW1lbnNpb25zLjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5pZ25vcmU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aWR0aDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSwgZWl0aGVyIGFzIGFuIGludGVnZXIgKHBpeGVscykgb3IgYSAlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4xMDAlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aGVpZ2h0PC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSwgZWl0aGVyIGFzIGFuIGludGVnZXIgKHBpeGVscykgb3IgYSAlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4xMDAlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+RHJhdzwvaDQ+Ci08cD5BZGRzIGEgRHJhdyBJbWFnZU9wZXJhdGlvbiB0byBjaGFpbi4gRHJhd09wZXJhdGlvbiBEYXRhVHlwZSBvYmplY3RzIGNhbiBiZQotbmVzdGVkIGluc2lkZSB0aGUgRHJhdyBvYmplY3QuPC9wPgorPHA+QWRkcyBhIERyYXcgSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uIERyYXdPcGVyYXRpb24gRGF0YVR5cGUgb2JqZWN0cyBjYW4gYmUgbmVzdGVkIGluc2lkZSB0aGUgRHJhdworb2JqZWN0LjwvcD4KIDxoNT5QYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IHhsb2MgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBYLVBvc2l0aW9uIHdoZXJlIHRvIGRyYXcgbmVzdGVkIGltYWdlIGVsZW1lbnRzLiA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj4gbm8gKGRlZmF1bHRzIHRvIDxpPjA8L2k+KSA8L3RkPgorICAgIDx0ZD54bG9jPC90ZD4KKyAgICA8dGQ+WC1Qb3NpdGlvbiB3aGVyZSB0byBkcmF3IG5lc3RlZCBpbWFnZSBlbGVtZW50cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4geWxvYyA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+IFktUG9zaXRpb24gd2hlcmUgdG8gZHJhdyBuZXN0ZWQgaW1hZ2UgZWxlbWVudHMuIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPiBubyAoZGVmYXVsdHMgdG8gPGk+MDwvaT4pIDwvdGQ+CisgICAgPHRkPnlsb2M8L3RkPgorICAgIDx0ZD5ZLVBvc2l0aW9uIHdoZXJlIHRvIGRyYXcgbmVzdGVkIGltYWdlIGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgorPHA+Rm9yIGRlc2NyaXB0aW9uIG9mIG5lc3RlZCBlbGVtZW50cywgcGxlYXNlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbgorb2YgPGEgaHJlZj0iaW1hZ2Vpby5odG1sI2RyYXciPkltYWdlSU8gdGFzazwvYT4uPC9wPgogCiA8aDQ+bWFwcGVyPC9oND4KIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuOC4wPC9lbT48L3A+CiAKIDxwPllvdSBjYW4gZGVmaW5lIGZpbGVuYW1lIHRyYW5zZm9ybWF0aW9ucyBieSB1c2luZyBhCi0gIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUKLSAgZGVmYXVsdCBtYXBwZXIgdXNlZCBieQotICA8Y29kZT4mbHQ7aW1hZ2UmZ3Q7PC9jb2RlPiBpcwotICB0aGUgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eQotICBtYXBwZXI8L2E+LjwvcD4KK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUgZGVmYXVsdCBtYXBwZXIgdXNlZAorYnkgPGNvZGU+Jmx0O2ltYWdlJmd0OzwvY29kZT4gaXMgdGhlIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2lkZW50aXR5LW1hcHBlciI+aWRlbnRpdHkKK21hcHBlcjwvYT4uPC9wPgogCi08cD5Zb3UgY2FuIGFsc28gdXNlIGEgZmlsZW5hbWVtYXBwZXIgdHlwZSBpbiBwbGFjZSBvZiB0aGUgbWFwcGVyCi0gIGVsZW1lbnQuPC9wPgorPHA+WW91IGNhbiBhbHNvIHVzZSBhIDxjb2RlPmZpbGVuYW1lbWFwcGVyPC9jb2RlPiB0eXBlIGluIHBsYWNlIG9mIHRoZSA8Y29kZT5tYXBwZXI8L2NvZGU+CitlbGVtZW50LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPGJsb2NrcXVvdGU+PHByZT4KLSZuYnNwOyZsdDtpbWFnZSBkZXN0ZGlyPSJzYW1wbGVzL2xvdyIgb3ZlcndyaXRlPSJ5ZXMiJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtmaWxlc2V0IGRpcj0ic2FtcGxlcy9mdWxsIiZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmpwZyIvJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvZmlsZXNldCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7c2NhbGUgd2lkdGg9IjE2MCIgaGVpZ2h0PSIxNjAiIHByb3BvcnRpb25zPSJmaXQiLyZndDsKLSZuYnNwOyZsdDsvaW1hZ2UmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5DcmVhdGUgdGh1bWJuYWlscyBvZiBteSBpbWFnZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFsbCBmaXQgd2l0aGluIHRoZSAxNjB4MTYwIHNpemUgd2hldGhlciB0aGUKLWltYWdlIGlzIHBvcnRyYWl0IG9yIGxhbmRzY2FwZS48L3A+Cis8cD5DcmVhdGUgdGh1bWJuYWlscyBvZiBteSBpbWFnZXMgYW5kIG1ha2Ugc3VyZSB0aGV5IGFsbCBmaXQgd2l0aGluIHRoZSAxNjAmdGltZXM7MTYwIHBpeGVsIHNpemUKK3doZXRoZXIgdGhlIGltYWdlIGlzIHBvcnRyYWl0IG9yIGxhbmRzY2FwZS48L3A+Cis8cHJlPgorJmx0O2ltYWdlIGRlc3RkaXI9InNhbXBsZXMvbG93IiBvdmVyd3JpdGU9InllcyImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJzYW1wbGVzL2Z1bGwiJmd0OworICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmpwZyIvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyAgICAmbHQ7c2NhbGUgd2lkdGg9IjE2MCIgaGVpZ2h0PSIxNjAiIHByb3BvcnRpb25zPSJmaXQiLyZndDsKKyZsdDsvaW1hZ2UmZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5DcmVhdGUgYSB0aHVtYm5haWwgZm9yIGFsbCBQTkcgZmlsZXMgaW4gPHNhbXA+c3JjPC9zYW1wPiBvZiB0aGUgc2l6ZSBvZiA0MCBwaXhlbHMga2VlcGluZyB0aGUKK3Byb3BvcnRpb25zIGFuZCBzdG9yZSB0aGUgPHNhbXA+c3JjPC9zYW1wPi48L3A+Cis8cHJlPgogJmx0O2ltYWdlIHNyY2Rpcj0ic3JjIiBpbmNsdWRlcz0iKi5wbmciJmd0OwogICAgICZsdDtzY2FsZSBwcm9wb3J0aW9ucz0id2lkdGgiIHdpZHRoPSI0MCIvJmd0OwotJmx0Oy9pbWFnZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkNyZWF0ZXMgYSB0aHVtYm5haWwgZm9yIGFsbCBQTkctZmlsZXMgaW4gPGk+c3JjPC9pPiBpbiB0aGUgc2l6ZSBvZiA0MCBwaXhlbCBrZWVwaW5nIHRoZSBwcm9wb3J0aW9ucwotYW5kIHN0b3JlcyB0aGUgPGk+c3JjPC9pPi48L3A+CismbHQ7L2ltYWdlJmd0OzwvcHJlPgogCi08YmxvY2txdW90ZT48cHJlPgorPHA+U2FtZSBhcyBhYm92ZSBidXQgc3RvcmUgdGhlIHJlc3VsdCBpbiA8c2FtcD5kZXN0PC9zYW1wPi48L3A+Cis8cHJlPgogJmx0O2ltYWdlIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSJkZXN0IiBpbmNsdWRlcz0iKi5wbmciJmd0OwogICAgICZsdDtzY2FsZSBwcm9wb3J0aW9ucz0id2lkdGgiIHdpZHRoPSI0MCIvJmd0OwotJmx0Oy9pbWFnZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlNhbWUgYXMgYWJvdmUgYnV0IHN0b3JlcyB0aGUgcmVzdWx0IGluIDxpPmRlc3Q8L2k+LjwvcD4KKyZsdDsvaW1hZ2UmZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5TYW1lIGFzIGFib3ZlIGJ1dCBzdG9yZSB0aGUgcmVzdWx0IHRvIGZpbGVzIHdpdGggb3JpZ2luYWwgbmFtZXMgcHJlZml4ZWQKK2J5IDxzYW1wPnNjYWxlZC08L3NhbXA+LjwvcD4KKzxwcmU+CiAmbHQ7aW1hZ2Ugc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImRlc3QiIGluY2x1ZGVzPSIqLnBuZyImZ3Q7CiAgICAgJmx0O3NjYWxlIHByb3BvcnRpb25zPSJ3aWR0aCIgd2lkdGg9IjQwIi8mZ3Q7CiAgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKiIgdG89InNjYWxlZC0qIi8mZ3Q7Ci0mbHQ7L2ltYWdlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+U2FtZSBhcyBhYm92ZSBidXQgc3RvcmVzIHRoZSByZXN1bHRpbmcgZmlsZSBuYW1lcyB3aWxsIGJlIHByZWZpeGVkCi0gIGJ5ICJzY2FsZWQtIi48L3A+Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLQorJmx0Oy9pbWFnZSZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCi0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9pbWFnZWlvLmdyYXBobWwgYi9tYW51YWwvVGFza3MvaW1hZ2Vpby5ncmFwaG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjYzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tYW51YWwvVGFza3MvaW1hZ2Vpby5ncmFwaG1sCkBAIC0wLDAgKzEsNDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Z3JhcGhtbCB4bWxucz0iaHR0cDovL2dyYXBobWwuZ3JhcGhkcmF3aW5nLm9yZy94bWxucyIgeG1sbnM6amF2YT0iaHR0cDovL3d3dy55d29ya3MuY29tL3htbC95ZmlsZXMtY29tbW9uLzEuMC9qYXZhIiB4bWxuczpzeXM9Imh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwveWZpbGVzLWNvbW1vbi9tYXJrdXAvcHJpbWl0aXZlcy8yLjAiIHhtbG5zOng9Imh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwveWZpbGVzLWNvbW1vbi9tYXJrdXAvMi4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczp5PSJodHRwOi8vd3d3Lnl3b3Jrcy5jb20veG1sL2dyYXBobWwiIHhtbG5zOnllZD0iaHR0cDovL3d3dy55d29ya3MuY29tL3htbC95ZWQvMyIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZ3JhcGhtbC5ncmFwaGRyYXdpbmcub3JnL3htbG5zIGh0dHA6Ly93d3cueXdvcmtzLmNvbS94bWwvc2NoZW1hL2dyYXBobWwvMS4xL3lncmFwaG1sLnhzZCI+CisgIDxrZXkgYXR0ci5uYW1lPSJEZXNjcmlwdGlvbiIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZ3JhcGgiIGlkPSJkMCIvPgorICA8a2V5IGZvcj0icG9ydCIgaWQ9ImQxIiB5ZmlsZXMudHlwZT0icG9ydGdyYXBoaWNzIi8+CisgIDxrZXkgZm9yPSJwb3J0IiBpZD0iZDIiIHlmaWxlcy50eXBlPSJwb3J0Z2VvbWV0cnkiLz4KKyAgPGtleSBmb3I9InBvcnQiIGlkPSJkMyIgeWZpbGVzLnR5cGU9InBvcnR1c2VyZGF0YSIvPgorICA8a2V5IGF0dHIubmFtZT0idXJsIiBhdHRyLnR5cGU9InN0cmluZyIgZm9yPSJub2RlIiBpZD0iZDQiLz4KKyAgPGtleSBhdHRyLm5hbWU9ImRlc2NyaXB0aW9uIiBhdHRyLnR5cGU9InN0cmluZyIgZm9yPSJub2RlIiBpZD0iZDUiLz4KKyAgPGtleSBmb3I9Im5vZGUiIGlkPSJkNiIgeWZpbGVzLnR5cGU9Im5vZGVncmFwaGljcyIvPgorICA8a2V5IGZvcj0iZ3JhcGhtbCIgaWQ9ImQ3IiB5ZmlsZXMudHlwZT0icmVzb3VyY2VzIi8+CisgIDxrZXkgZm9yPSJlZGdlIiBpZD0iZDgiIHlmaWxlcy50eXBlPSJwb3J0Y29uc3RyYWludHMiLz4KKyAgPGtleSBhdHRyLm5hbWU9InVybCIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZWRnZSIgaWQ9ImQ5Ii8+CisgIDxrZXkgYXR0ci5uYW1lPSJkZXNjcmlwdGlvbiIgYXR0ci50eXBlPSJzdHJpbmciIGZvcj0iZWRnZSIgaWQ9ImQxMCIvPgorICA8a2V5IGZvcj0iZWRnZSIgaWQ9ImQxMSIgeWZpbGVzLnR5cGU9ImVkZ2VncmFwaGljcyIvPgorICA8Z3JhcGggZWRnZWRlZmF1bHQ9ImRpcmVjdGVkIiBpZD0iRyI+CisgICAgPGRhdGEga2V5PSJkMCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgIDxub2RlIGlkPSJuMCI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iNDcuMCIgd2lkdGg9IjI0NS4wIiB4PSIyMDcuNSIgeT0iLTExMy4xMjE2MjE2MjE2MjE2MyIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjM0LjkxNTAzOTA2MjUiIHg9IjUuMDQyNDgwNDY4NzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8L3k6TWV0aG9kTGFiZWw+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xIj4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMDQuMCIgd2lkdGg9IjE4Mi4wIiB4PSIyMzkuMCIgeT0iMjYuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0iaXRhbGljIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjEwNS4xMDU0Njg3NSIgeD0iMzguNDQ3MjY1NjI1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPkltYWdlT3BlcmF0aW9uPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5pbnN0cnVjdGlvbnMgOiBMaXN0PC95OkF0dHJpYnV0ZUxhYmVsPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkRHJhdyhEcmF3IDogaW5zdHIpCithZGRSb3RhdGUoUm90YXRlIDogaW5zdHIpCithZGRTY2FsZShTY2FsZSA6IGluc3RyKTwveTpNZXRob2RMYWJlbD4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjIiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTE5vdGVOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iMTA1LjAiIHdpZHRoPSIyNjAuNTUwNzgxMjUiIHg9Ii00MTkuMTA1MTA1Njg2MDU4NCIgeT0iNDY5LjU5Mjk0NDM2OTA2MzczIi8+CisgICAgICAgICAgPHk6RmlsbCBoYXNDb2xvcj0iZmFsc2UiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0ibGVmdCIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9Ijg4Ljc5Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjI1MC41NTA3ODEyNSIgeD0iNS4wIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSI4LjEwMTU2MjUiPlRoZSBzZXRUeXBlKCkgbWV0aG9kIGZvcmNlcyB0eXBlIHRvCitvbmUgb2YgdGhlIHZhbHVlcyBvZiBqYXZhLmF3dC5nZW9tLkFyYzJEOgorb3BlbiA9IEFyYzJELk9QRU4KK3BpZSA9IEFyYzJELlBJRQorY2hvcmQgPSBBcmMyRC5DSE9SRAorUGFyYW1ldGVyIGlzIG5vdCBjYXNlLXNlbnNpdGl2ZS48eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSIwLjAiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgIDwveTpVTUxOb3RlTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4zIj4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMTUuMCIgd2lkdGg9IjE2OC4wIiB4PSItMjQuMCIgeT0iMTA2LjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9Iml0YWxpYyIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0ic2lkZXMiIG1vZGVsUG9zaXRpb249Im4iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjczLjM3MzUzNTE1NjI1IiB4PSI0Ny4zMTMyMzI0MjE4NzUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+QmFzaWNTaGFwZTwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5oZWlnaHQgOiBpbnQgPSAwCit3aWR0aCA6IGludCA9IDAKK3N0cm9rZVdpZHRoIDogaW50ID0gMAorc3Ryb2tlIDogU3RyaW5nID0gImJsYWNrIgorZmlsbCA6IFN0cmluZyA9ICJ0cmFuc3BhcmVudCI8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im40Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI2MS4wIiB3aWR0aD0iMzg2LjAiIHg9IjUyNy4wIiB5PSIxMDUuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0iaXRhbGljIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJzaWRlcyIgbW9kZWxQb3NpdGlvbj0ibiIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMTMyLjMzMDU2NjQwNjI1IiB4PSIxMjYuODM0NzE2Nzk2ODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlRyYW5zZm9ybU9wZXJhdGlvbjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKEJ1ZmZlcmVkSW1hZ2UgaW1nKSA6IEJ1ZmZlcmVkSW1hZ2U8L3k6TWV0aG9kTGFiZWw+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im41Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI4NC4wIiB3aWR0aD0iMjQ2LjAiIHg9IjIwNi4wIiB5PSI0NzguMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0iaXRhbGljIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9Ijk4Ljk0ODI0MjE4NzUiIHg9IjczLjUyNTg3ODkwNjI1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyNi4xMzI4MTI1Ij5EcmF3T3BlcmF0aW9uPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iaW50ZXJmYWNlIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5leGVjdXRlRHJhd09wZXJhdGlvbigpIDogQnVmZmVyZWRJbWFnZTwveTpNZXRob2RMYWJlbD4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjYiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTE5vdGVOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iNzUuNzU2NzU2NzU2NzU2NzciIHdpZHRoPSIyMTYuMDYwNTQ2ODc1IiB4PSIyMjAuMzE3NzU5MTI2OTUwNDgiIHk9IjYzNS44NjY1MzM0MjYyMzQ5Ii8+CisgICAgICAgICAgPHk6RmlsbCBoYXNDb2xvcj0iZmFsc2UiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0ibGVmdCIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjYwLjUzMTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjA2LjA2MDU0Njg3NSIgeD0iNS4wIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSI3LjYxMjc1MzM3ODM3ODQ0MyI+VGhlIGltcGxlbWVudGluZyBjbGFzcyB1c2VzCitDb2xvck1hcHBlciB0byBldmFsdWF0ZSB0aGUgY29sb3IuCitPbmx5IHRoZSB2YWx1ZXMgZGVmaW5lZCBpbgorQ29sb3JNYXBwZXIgYXJlIHVzZWQuPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iMC4wIiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICA8L3k6VU1MTm90ZU5vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxub2RlIGlkPSJuNyI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iMjcxLjQyMzQyMzQyMzQyMzMiIHdpZHRoPSIyNTEuMjc1MzkwNjI1IiB4PSI1NjIuNzEwMzM3MjUxOTUwNSIgeT0iNTQxLjMzNzEzNDk2NDAwMDgiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9Ijg1LjM0NTIxNDg0Mzc1IiB4PSI4Mi45NjUwODc4OTA2MjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+Q29sb3JNYXBwZXI8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0JMQUNLIDogU3RyaW5nID0gImJsYWNrIgorQ09MT1JfQkxVRSA6IFN0cmluZyA9ICJibHVlIgorQ09MT1JfQ1lBTiA6IFN0cmluZyA9ICJjeWFuIgorQ09MT1JfREFSS0dSQVkgOiBTdHJpbmcgPSAiZGFya2dyYXkiCitDT0xPUl9HUkFZIDogU3RyaW5nID0gImdyYXkiCitDT0xPUl9MSUdIVEdSQVkgOiBTdHJpbmcgPSAibGlnaHRncmF5IgorQ09MT1JfREFSS0dSRVkgOiBTdHJpbmcgPSAiZGFya2dyZXkiCitDT0xPUl9HUkVZIDogU3RyaW5nID0gImdyZXkiCitDT0xPUl9MSUdIVEdSRVkgOiBTdHJpbmcgPSAibGlnaHRncmV5IgorQ09MT1JfR1JFRU4gOiBTdHJpbmcgPSAiZ3JlZW4iCitDT0xPUl9NQUdFTlRBIDogU3RyaW5nID0gIm1hZ2VudGEiCitDT0xPUl9PUkFOR0UgOiBTdHJpbmcgPSAib3JhbmdlIgorQ09MT1JfUElOSyA6IFN0cmluZyA9ICJwaW5rIgorQ09MT1JfUkVEIDogU3RyaW5nID0gInJlZCIKK0NPTE9SX1dISVRFIDogU3RyaW5nID0gIndoaXRlIgorQ09MT1JfWUVMTE9XIDogU3RyaW5nID0gInllbGxvdyI8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im44Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSIxMzAuMCIgd2lkdGg9IjE0Ni4wIiB4PSIyNTcuMCIgeT0iMjcyLjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjMyLjI5Nzg1MTU2MjUiIHg9IjU2Ljg1MTA3NDIxODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlRleHQ8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPnN0cmluZyA6IFN0cmluZyA9ICIiCitmb250IDogU3RyaW5nID0gIkFyaWFsIgorcG9pbnQgOiBpbnQgPSAxMAorYm9sZCA6IGJvb2xlYW4gPSBmYWxzZQorY29sb3IgOiBTdHJpbmcgPSAiYmxhY2siCitpdGFsaWMgOiBib29sZWFuID0gZmFsc2U8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im45Ij4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI1OS4wIiB3aWR0aD0iMTIyLjAiIHg9IjQ0OS4wIiB5PSIyNzIuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNDQuMzUyMDUwNzgxMjUiIHg9IjM4LjgyMzk3NDYwOTM3NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMy4wIj5Sb3RhdGU8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPmFuZ2xlIDogZmxvYXQgPSAwLjBGPC95OkF0dHJpYnV0ZUxhYmVsPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgICAgIDwveTpVTUw+CisgICAgICAgIDwveTpVTUxDbGFzc05vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxub2RlIGlkPSJuMTAiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTENsYXNzTm9kZT4KKyAgICAgICAgICA8eTpHZW9tZXRyeSBoZWlnaHQ9Ijg4LjAiIHdpZHRoPSIyMTIuMCIgeD0iNjE0LjAiIHk9IjI3Mi4wIi8+CisgICAgICAgICAgPHk6RmlsbCBjb2xvcj0iI0ZGQ0M5OSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGF1dG9TaXplUG9saWN5PSJjb250ZW50IiBmb250RmFtaWx5PSJTYW5zU2VyaWYiIGZvbnRTaXplPSIxMyIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSIzNS44Mzk4NDM3NSIgeD0iODguMDgwMDc4MTI1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPlNjYWxlPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj53aWR0aCA6IFN0cmluZyA9ICIxMDAlIgoraGVpZ2h0IDogU3RyaW5nID0gIjEwMCUiCitrZWVwUHJvcG9ydGlvbnMgOiBib29sZWFuID0gZmFsc2U8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xMSI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iMTMwLjAiIHdpZHRoPSIxODAuMCIgeD0iODc0LjAiIHk9IjI3Mi4wIi8+CisgICAgICAgICAgPHk6RmlsbCBjb2xvcj0iI0ZGQ0M5OSIgdHJhbnNwYXJlbnQ9ImZhbHNlIi8+CisgICAgICAgICAgPHk6Qm9yZGVyU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpOb2RlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGF1dG9TaXplUG9saWN5PSJjb250ZW50IiBmb250RmFtaWx5PSJTYW5zU2VyaWYiIGZvbnRTaXplPSIxMyIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOS4zMTA1NDY4NzUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSIzNi4yNTI0NDE0MDYyNSIgeD0iNzEuODczNzc5Mjk2ODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPkRyYXc8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWwgZGlzdGFuY2U9IjQuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0Tm9kZUxhYmVsTW9kZWxQYXJhbWV0ZXIgbGFiZWxSYXRpb1g9IjAuMCIgbGFiZWxSYXRpb1k9IjAuMCIgbm9kZVJhdGlvWD0iMC4wIiBub2RlUmF0aW9ZPSItMC4wMzcwMzA5MDEyMjc2Nzg1NSIgb2Zmc2V0WD0iMC4wIiBvZmZzZXRZPSIwLjAiIHVwWD0iMC4wIiB1cFk9Ii0xLjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PC95Ok5vZGVMYWJlbD4KKyAgICAgICAgICA8eTpVTUwgY2xpcENvbnRlbnQ9InRydWUiIGNvbnN0cmFpbnQ9IiIgaGFzRGV0YWlsc0NvbG9yPSJmYWxzZSIgb21pdERldGFpbHM9ImZhbHNlIiBzdGVyZW90eXBlPSIiIHVzZTNERWZmZWN0PSJ0cnVlIj4KKyAgICAgICAgICAgIDx5OkF0dHJpYnV0ZUxhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPnhsb2MgOiBpbnQgPSAwCit5bG9jIDogaW50ID0gMDwveTpBdHRyaWJ1dGVMYWJlbD4KKyAgICAgICAgICAgIDx5Ok1ldGhvZExhYmVsIHhtbDpzcGFjZT0icHJlc2VydmUiPmFkZFRleHQoVGV4dCA6IHRleHQpCithZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QpCithZGRFbGxpcHNlKEVsbGlwc2UgZWxpcCkKK2FkZEFyYyhBcmMgYXJjKTwveTpNZXRob2RMYWJlbD4KKyAgICAgICAgICA8L3k6VU1MPgorICAgICAgICA8L3k6VU1MQ2xhc3NOb2RlPgorICAgICAgPC9kYXRhPgorICAgIDwvbm9kZT4KKyAgICA8bm9kZSBpZD0ibjEyIj4KKyAgICAgIDxkYXRhIGtleT0iZDQiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDYiPgorICAgICAgICA8eTpVTUxDbGFzc05vZGU+CisgICAgICAgICAgPHk6R2VvbWV0cnkgaGVpZ2h0PSI3NC4wIiB3aWR0aD0iMTIyLjAiIHg9IjAuMCIgeT0iMjcyLjAiLz4KKyAgICAgICAgICA8eTpGaWxsIGNvbG9yPSIjRkZDQzk5IiB0cmFuc3BhcmVudD0iZmFsc2UiLz4KKyAgICAgICAgICA8eTpCb3JkZXJTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5Ok5vZGVMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgYXV0b1NpemVQb2xpY3k9ImNvbnRlbnQiIGZvbnRGYW1pbHk9IlNhbnNTZXJpZiIgZm9udFNpemU9IjEzIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE5LjMxMDU0Njg3NSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjY1LjMzNzQwMjM0Mzc1IiB4PSIyOC4zMzEyOTg4MjgxMjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjMuMCI+UmVjdGFuZ2xlPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj5hcmNoZWlnaHQgOiBpbnQgPSAwCithcmN3aWR0aCA6IGludCA9IDA8L3k6QXR0cmlidXRlTGFiZWw+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgPC95OlVNTD4KKyAgICAgICAgPC95OlVNTENsYXNzTm9kZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L25vZGU+CisgICAgPG5vZGUgaWQ9Im4xMyI+CisgICAgICA8ZGF0YSBrZXk9ImQ0IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQ2Ij4KKyAgICAgICAgPHk6VU1MQ2xhc3NOb2RlPgorICAgICAgICAgIDx5Okdlb21ldHJ5IGhlaWdodD0iNDUuMCIgd2lkdGg9IjEyMi4wIiB4PSItMTY2LjEzMjI5MzA4MDA1NDI0IiB5PSIyNzIuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNDQuMzcxMDkzNzUiIHg9IjM4LjgxNDQ1MzEyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMy4wIj5FbGxpcHNlPHk6TGFiZWxNb2RlbD48eTpTbWFydE5vZGVMYWJlbE1vZGVsIGRpc3RhbmNlPSI0LjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydE5vZGVMYWJlbE1vZGVsUGFyYW1ldGVyIGxhYmVsUmF0aW9YPSIwLjAiIGxhYmVsUmF0aW9ZPSIwLjAiIG5vZGVSYXRpb1g9IjAuMCIgbm9kZVJhdGlvWT0iLTAuMDM3MDMwOTAxMjI3Njc4NTUiIG9mZnNldFg9IjAuMCIgb2Zmc2V0WT0iMC4wIiB1cFg9IjAuMCIgdXBZPSItMS4wIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjwveTpOb2RlTGFiZWw+CisgICAgICAgICAgPHk6VU1MIGNsaXBDb250ZW50PSJ0cnVlIiBjb25zdHJhaW50PSIiIGhhc0RldGFpbHNDb2xvcj0iZmFsc2UiIG9taXREZXRhaWxzPSJmYWxzZSIgc3RlcmVvdHlwZT0iIiB1c2UzREVmZmVjdD0idHJ1ZSI+CisgICAgICAgICAgICA8eTpBdHRyaWJ1dGVMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICAgICAgICA8eTpNZXRob2RMYWJlbCB4bWw6c3BhY2U9InByZXNlcnZlIj4gPC95Ok1ldGhvZExhYmVsPgorICAgICAgICAgIDwveTpVTUw+CisgICAgICAgIDwveTpVTUxDbGFzc05vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxub2RlIGlkPSJuMTQiPgorICAgICAgPGRhdGEga2V5PSJkNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkNiI+CisgICAgICAgIDx5OlVNTENsYXNzTm9kZT4KKyAgICAgICAgICA8eTpHZW9tZXRyeSBoZWlnaHQ9Ijg4LjAiIHdpZHRoPSIxNjcuMCIgeD0iLTM3NS4zNjkwNjM3NzIwNDg5IiB5PSIyNzIuMCIvPgorICAgICAgICAgIDx5OkZpbGwgY29sb3I9IiNGRkNDOTkiIHRyYW5zcGFyZW50PSJmYWxzZSIvPgorICAgICAgICAgIDx5OkJvcmRlclN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6Tm9kZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBhdXRvU2l6ZVBvbGljeT0iY29udGVudCIgZm9udEZhbWlseT0iU2Fuc1NlcmlmIiBmb250U2l6ZT0iMTMiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTkuMzEwNTQ2ODc1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iMjQuOTQ3MjY1NjI1IiB4PSI3MS4wMjYzNjcxODc1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIzLjAiPkFyYzx5OkxhYmVsTW9kZWw+PHk6U21hcnROb2RlTGFiZWxNb2RlbCBkaXN0YW5jZT0iNC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnROb2RlTGFiZWxNb2RlbFBhcmFtZXRlciBsYWJlbFJhdGlvWD0iMC4wIiBsYWJlbFJhdGlvWT0iMC4wIiBub2RlUmF0aW9YPSIwLjAiIG5vZGVSYXRpb1k9Ii0wLjAzNzAzMDkwMTIyNzY3ODU1IiBvZmZzZXRYPSIwLjAiIG9mZnNldFk9IjAuMCIgdXBYPSIwLjAiIHVwWT0iLTEuMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48L3k6Tm9kZUxhYmVsPgorICAgICAgICAgIDx5OlVNTCBjbGlwQ29udGVudD0idHJ1ZSIgY29uc3RyYWludD0iIiBoYXNEZXRhaWxzQ29sb3I9ImZhbHNlIiBvbWl0RGV0YWlscz0iZmFsc2UiIHN0ZXJlb3R5cGU9IiIgdXNlM0RFZmZlY3Q9InRydWUiPgorICAgICAgICAgICAgPHk6QXR0cmlidXRlTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RhcnQgOiBpbnQgPSAwCitzdG9wIDogaW50ID0gMAordHlwZSA6IGVudW1lcmF0ZWQgPSBvcGVuPC95OkF0dHJpYnV0ZUxhYmVsPgorICAgICAgICAgICAgPHk6TWV0aG9kTGFiZWwgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgICAgIDwveTpVTUw+CisgICAgICAgIDwveTpVTUxDbGFzc05vZGU+CisgICAgICA8L2RhdGE+CisgICAgPC9ub2RlPgorICAgIDxlZGdlIGlkPSJlMCIgc291cmNlPSJuMSIgdGFyZ2V0PSJuMCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iMjYuMTAxNTYyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTU1LjExMzc3MDI1Mjk0OTQ4NiI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMSIgc291cmNlPSJuMyIgdGFyZ2V0PSJuMSI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iNDMuNjY4MjY4MTQ4NTQxMDIiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjcuMzM5MDQxNTgzMDgxMTI2Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImUyIiBzb3VyY2U9Im40IiB0YXJnZXQ9Im4xIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjI0LjU0MTE2OTc0OTMzOTQyNCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSItNDkuNDA4NDkwNjY2MzQyNjMiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii00OS4yOTY1ODQ2ODMwNjgxOSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMyIgc291cmNlPSJuNSIgdGFyZ2V0PSJuMyI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSItNjQuNzc0NzU0OTc2ODg0ODUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0xMzkuNTUxNDAyMzE5MTE3MiI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlNCIgc291cmNlPSJuNSIgdGFyZ2V0PSJuOSI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSI5My44MzUzNzg4MjUxMDc1NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTgwLjAyMTcxMjcyNTg1ODY2Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU1IiBzb3VyY2U9Im41IiB0YXJnZXQ9Im4xMCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIxNDEuODI2ODE2MTA5NTM5OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTUxLjI1OTI2NDM4MjYxMzQyIj4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU2IiBzb3VyY2U9Im45IiB0YXJnZXQ9Im40Ij4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSI4OC43NjE5NTg1ODA0MjQ1NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTQ0LjA3MTMzMTE5OTQzMTU0Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImU3IiBzb3VyY2U9Im4xMCIgdGFyZ2V0PSJuNCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iMjYuMTAxNTYyNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTYyLjA0MzA5MDgyMDMxMjUiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTgiIHNvdXJjZT0ibjExIiB0YXJnZXQ9Im40Ij4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSItMjYuNDM5Nzk0NTY0MDg3NjA2IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItNjYuNTg4ODMyMjIyMzQyNDMiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTkiIHNvdXJjZT0ibjgiIHRhcmdldD0ibjEiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJ3aGl0ZV9kZWx0YSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjI2LjEwMTU2MjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii04MC4wOTUwOTI3NzM0Mzc1Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImUxMCIgc291cmNlPSJuNSIgdGFyZ2V0PSJuOCI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9Im5vbmUiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIyNi4zMDk0MzI1NDY3NDUwODYiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii00Ny4wMjQ2NTgyMDMxMjUiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTExIiBzb3VyY2U9Im42IiB0YXJnZXQ9Im41Ij4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzgwODA4MCIgdHlwZT0iZGFzaGVkIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJub25lIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iMjYuMjU4NDczMDEzMTIwNDY1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItNDYuMDA0ODQzNjM4NDQ0OTgiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTEyIiBzb3VyY2U9Im43IiB0YXJnZXQ9Im42Ij4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9IjAuMCIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzgwODA4MCIgdHlwZT0iZGFzaGVkIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJub25lIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iLTY3LjA2MjQ4OTg5NjQ4NzAyIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItMzkuNjQ3MzM5MjcwNTE1MzIiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTEzIiBzb3VyY2U9Im4yIiB0YXJnZXQ9Im4xNCI+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiM4MDgwODAiIHR5cGU9ImRhc2hlZCIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0ibm9uZSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjI1LjI5Njc5MjkxNTMyNzM4NyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTYzLjg1ODQ5NjA3NzE4Njg4NSI+IDx5OkxhYmVsTW9kZWw+PHk6U21hcnRFZGdlTGFiZWxNb2RlbCBhdXRvUm90YXRpb25FbmFibGVkPSJmYWxzZSIgZGVmYXVsdEFuZ2xlPSIwLjAiIGRlZmF1bHREaXN0YW5jZT0iMTAuMCIvPjwveTpMYWJlbE1vZGVsPjx5Ok1vZGVsUGFyYW1ldGVyPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWxQYXJhbWV0ZXIgYW5nbGU9IjAuMCIgZGlzdGFuY2U9IjMwLjAiIGRpc3RhbmNlVG9DZW50ZXI9InRydWUiIHBvc2l0aW9uPSJyaWdodCIgcmF0aW89IjAuNSIgc2VnbWVudD0iMCIvPjwveTpNb2RlbFBhcmFtZXRlcj48eTpQcmVmZXJyZWRQbGFjZW1lbnREZXNjcmlwdG9yIGFuZ2xlPSIwLjAiIGFuZ2xlT2Zmc2V0T25SaWdodFNpZGU9IjAiIGFuZ2xlUmVmZXJlbmNlPSJhYnNvbHV0ZSIgYW5nbGVSb3RhdGlvbk9uUmlnaHRTaWRlPSJjbyIgZGlzdGFuY2U9Ii0xLjAiIGZyb3plbj0idHJ1ZSIgcGxhY2VtZW50PSJhbnl3aGVyZSIgc2lkZT0iYW55d2hlcmUiIHNpZGVSZWZlcmVuY2U9InJlbGF0aXZlX3RvX2VkZ2VfZmxvdyIvPjwveTpFZGdlTGFiZWw+CisgICAgICAgICAgPHk6QmVuZFN0eWxlIHNtb290aGVkPSJ0cnVlIi8+CisgICAgICAgIDwveTpQb2x5TGluZUVkZ2U+CisgICAgICA8L2RhdGE+CisgICAgPC9lZGdlPgorICAgIDxlZGdlIGlkPSJlMTQiIHNvdXJjZT0ibjE0IiB0YXJnZXQ9Im4zIj4KKyAgICAgIDxkYXRhIGtleT0iZDkiIHhtbDpzcGFjZT0icHJlc2VydmUiLz4KKyAgICAgIDxkYXRhIGtleT0iZDExIj4KKyAgICAgICAgPHk6UG9seUxpbmVFZGdlPgorICAgICAgICAgIDx5OlBhdGggc3g9IjAuMCIgc3k9Ii0zOS42OTI2NDM1MDE4NTgzMiIgdHg9IjAuMCIgdHk9IjAuMCIvPgorICAgICAgICAgIDx5OkxpbmVTdHlsZSBjb2xvcj0iIzAwMDAwMCIgdHlwZT0ibGluZSIgd2lkdGg9IjEuMCIvPgorICAgICAgICAgIDx5OkFycm93cyBzb3VyY2U9Im5vbmUiIHRhcmdldD0id2hpdGVfZGVsdGEiLz4KKyAgICAgICAgICA8eTpFZGdlTGFiZWwgYWxpZ25tZW50PSJjZW50ZXIiIGNvbmZpZ3VyYXRpb249IkF1dG9GbGlwcGluZ0xhYmVsIiBkaXN0YW5jZT0iMi4wIiBmb250RmFtaWx5PSJEZWphVnUgU2FucyBNb25vIiBmb250U2l6ZT0iMTIiIGZvbnRTdHlsZT0icGxhaW4iIGhhc0JhY2tncm91bmRDb2xvcj0iZmFsc2UiIGhhc0xpbmVDb2xvcj0iZmFsc2UiIGhlaWdodD0iMTguMTMyODEyNSIgaG9yaXpvbnRhbFRleHRQb3NpdGlvbj0iY2VudGVyIiBpY29uVGV4dEdhcD0iNCIgbW9kZWxOYW1lPSJjdXN0b20iIHByZWZlcnJlZFBsYWNlbWVudD0iYW55d2hlcmUiIHJhdGlvPSIwLjUiIHRleHRDb2xvcj0iIzAwMDAwMCIgdmVydGljYWxUZXh0UG9zaXRpb249ImJvdHRvbSIgdmlzaWJsZT0idHJ1ZSIgd2lkdGg9IjcuNzk2ODc1IiB4PSIxNTguMzQxODY1ODE5MDUzNjgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii0yOS41NzU3ODg3NTU2ODMxMDciPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgICA8ZWRnZSBpZD0iZTE1IiBzb3VyY2U9Im4xMyIgdGFyZ2V0PSJuMyI+CisgICAgICA8ZGF0YSBrZXk9ImQ5IiB4bWw6c3BhY2U9InByZXNlcnZlIi8+CisgICAgICA8ZGF0YSBrZXk9ImQxMSI+CisgICAgICAgIDx5OlBvbHlMaW5lRWRnZT4KKyAgICAgICAgICA8eTpQYXRoIHN4PSIwLjAiIHN5PSIwLjAiIHR4PSIwLjAiIHR5PSIwLjAiLz4KKyAgICAgICAgICA8eTpMaW5lU3R5bGUgY29sb3I9IiMwMDAwMDAiIHR5cGU9ImxpbmUiIHdpZHRoPSIxLjAiLz4KKyAgICAgICAgICA8eTpBcnJvd3Mgc291cmNlPSJub25lIiB0YXJnZXQ9IndoaXRlX2RlbHRhIi8+CisgICAgICAgICAgPHk6RWRnZUxhYmVsIGFsaWdubWVudD0iY2VudGVyIiBjb25maWd1cmF0aW9uPSJBdXRvRmxpcHBpbmdMYWJlbCIgZGlzdGFuY2U9IjIuMCIgZm9udEZhbWlseT0iRGVqYVZ1IFNhbnMgTW9ubyIgZm9udFNpemU9IjEyIiBmb250U3R5bGU9InBsYWluIiBoYXNCYWNrZ3JvdW5kQ29sb3I9ImZhbHNlIiBoYXNMaW5lQ29sb3I9ImZhbHNlIiBoZWlnaHQ9IjE4LjEzMjgxMjUiIGhvcml6b250YWxUZXh0UG9zaXRpb249ImNlbnRlciIgaWNvblRleHRHYXA9IjQiIG1vZGVsTmFtZT0iY3VzdG9tIiBwcmVmZXJyZWRQbGFjZW1lbnQ9ImFueXdoZXJlIiByYXRpbz0iMC41IiB0ZXh0Q29sb3I9IiMwMDAwMDAiIHZlcnRpY2FsVGV4dFBvc2l0aW9uPSJib3R0b20iIHZpc2libGU9InRydWUiIHdpZHRoPSI3Ljc5Njg3NSIgeD0iNTguMzM2NDcxNDEwOTcyNDE1IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItMjAuMTQ0MDAwMjAzMTE0MjE3Ij4gPHk6TGFiZWxNb2RlbD48eTpTbWFydEVkZ2VMYWJlbE1vZGVsIGF1dG9Sb3RhdGlvbkVuYWJsZWQ9ImZhbHNlIiBkZWZhdWx0QW5nbGU9IjAuMCIgZGVmYXVsdERpc3RhbmNlPSIxMC4wIi8+PC95OkxhYmVsTW9kZWw+PHk6TW9kZWxQYXJhbWV0ZXI+PHk6U21hcnRFZGdlTGFiZWxNb2RlbFBhcmFtZXRlciBhbmdsZT0iMC4wIiBkaXN0YW5jZT0iMzAuMCIgZGlzdGFuY2VUb0NlbnRlcj0idHJ1ZSIgcG9zaXRpb249InJpZ2h0IiByYXRpbz0iMC41IiBzZWdtZW50PSIwIi8+PC95Ok1vZGVsUGFyYW1ldGVyPjx5OlByZWZlcnJlZFBsYWNlbWVudERlc2NyaXB0b3IgYW5nbGU9IjAuMCIgYW5nbGVPZmZzZXRPblJpZ2h0U2lkZT0iMCIgYW5nbGVSZWZlcmVuY2U9ImFic29sdXRlIiBhbmdsZVJvdGF0aW9uT25SaWdodFNpZGU9ImNvIiBkaXN0YW5jZT0iLTEuMCIgZnJvemVuPSJ0cnVlIiBwbGFjZW1lbnQ9ImFueXdoZXJlIiBzaWRlPSJhbnl3aGVyZSIgc2lkZVJlZmVyZW5jZT0icmVsYXRpdmVfdG9fZWRnZV9mbG93Ii8+PC95OkVkZ2VMYWJlbD4KKyAgICAgICAgICA8eTpCZW5kU3R5bGUgc21vb3RoZWQ9InRydWUiLz4KKyAgICAgICAgPC95OlBvbHlMaW5lRWRnZT4KKyAgICAgIDwvZGF0YT4KKyAgICA8L2VkZ2U+CisgICAgPGVkZ2UgaWQ9ImUxNiIgc291cmNlPSJuMTIiIHRhcmdldD0ibjMiPgorICAgICAgPGRhdGEga2V5PSJkOSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIvPgorICAgICAgPGRhdGEga2V5PSJkMTEiPgorICAgICAgICA8eTpQb2x5TGluZUVkZ2U+CisgICAgICAgICAgPHk6UGF0aCBzeD0iMC4wIiBzeT0iMC4wIiB0eD0iMC4wIiB0eT0iMC4wIi8+CisgICAgICAgICAgPHk6TGluZVN0eWxlIGNvbG9yPSIjMDAwMDAwIiB0eXBlPSJsaW5lIiB3aWR0aD0iMS4wIi8+CisgICAgICAgICAgPHk6QXJyb3dzIHNvdXJjZT0ibm9uZSIgdGFyZ2V0PSJ3aGl0ZV9kZWx0YSIvPgorICAgICAgICAgIDx5OkVkZ2VMYWJlbCBhbGlnbm1lbnQ9ImNlbnRlciIgY29uZmlndXJhdGlvbj0iQXV0b0ZsaXBwaW5nTGFiZWwiIGRpc3RhbmNlPSIyLjAiIGZvbnRGYW1pbHk9IkRlamFWdSBTYW5zIE1vbm8iIGZvbnRTaXplPSIxMiIgZm9udFN0eWxlPSJwbGFpbiIgaGFzQmFja2dyb3VuZENvbG9yPSJmYWxzZSIgaGFzTGluZUNvbG9yPSJmYWxzZSIgaGVpZ2h0PSIxOC4xMzI4MTI1IiBob3Jpem9udGFsVGV4dFBvc2l0aW9uPSJjZW50ZXIiIGljb25UZXh0R2FwPSI0IiBtb2RlbE5hbWU9ImN1c3RvbSIgcHJlZmVycmVkUGxhY2VtZW50PSJhbnl3aGVyZSIgcmF0aW89IjAuNSIgdGV4dENvbG9yPSIjMDAwMDAwIiB2ZXJ0aWNhbFRleHRQb3NpdGlvbj0iYm90dG9tIiB2aXNpYmxlPSJ0cnVlIiB3aWR0aD0iNy43OTY4NzUiIHg9IjI1LjkyNjg2ODE1OTEyMDU4OCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iLTM0LjU4NzUyNDQxNDA2MjUiPiA8eTpMYWJlbE1vZGVsPjx5OlNtYXJ0RWRnZUxhYmVsTW9kZWwgYXV0b1JvdGF0aW9uRW5hYmxlZD0iZmFsc2UiIGRlZmF1bHRBbmdsZT0iMC4wIiBkZWZhdWx0RGlzdGFuY2U9IjEwLjAiLz48L3k6TGFiZWxNb2RlbD48eTpNb2RlbFBhcmFtZXRlcj48eTpTbWFydEVkZ2VMYWJlbE1vZGVsUGFyYW1ldGVyIGFuZ2xlPSIwLjAiIGRpc3RhbmNlPSIzMC4wIiBkaXN0YW5jZVRvQ2VudGVyPSJ0cnVlIiBwb3NpdGlvbj0icmlnaHQiIHJhdGlvPSIwLjUiIHNlZ21lbnQ9IjAiLz48L3k6TW9kZWxQYXJhbWV0ZXI+PHk6UHJlZmVycmVkUGxhY2VtZW50RGVzY3JpcHRvciBhbmdsZT0iMC4wIiBhbmdsZU9mZnNldE9uUmlnaHRTaWRlPSIwIiBhbmdsZVJlZmVyZW5jZT0iYWJzb2x1dGUiIGFuZ2xlUm90YXRpb25PblJpZ2h0U2lkZT0iY28iIGRpc3RhbmNlPSItMS4wIiBmcm96ZW49InRydWUiIHBsYWNlbWVudD0iYW55d2hlcmUiIHNpZGU9ImFueXdoZXJlIiBzaWRlUmVmZXJlbmNlPSJyZWxhdGl2ZV90b19lZGdlX2Zsb3ciLz48L3k6RWRnZUxhYmVsPgorICAgICAgICAgIDx5OkJlbmRTdHlsZSBzbW9vdGhlZD0idHJ1ZSIvPgorICAgICAgICA8L3k6UG9seUxpbmVFZGdlPgorICAgICAgPC9kYXRhPgorICAgIDwvZWRnZT4KKyAgPC9ncmFwaD4KKyAgPGRhdGEga2V5PSJkNyI+CisgICAgPHk6UmVzb3VyY2VzLz4KKyAgPC9kYXRhPgorPC9ncmFwaG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2ltYWdlaW8uaHRtbCBiL21hbnVhbC9UYXNrcy9pbWFnZWlvLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxMGFhNwotLS0gL2Rldi9udWxsCisrKyBiL21hbnVhbC9UYXNrcy9pbWFnZWlvLmh0bWwKQEAgLTAsMCArMSw2OTggQEAKKzwhRE9DVFlQRSBodG1sPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxodG1sIGxhbmc9ImVuIj4KKworPGhlYWQ+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorPHRpdGxlPkltYWdlIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyIGlkPSJpbWFnZWlvIj5JbWFnZUlPPC9oMj4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5BcHBsaWVzIGEgY2hhaW4gb2YgaW1hZ2Ugb3BlcmF0aW9ucyBvbiBhIHNldCBvZiBmaWxlcy48L3A+Cis8cD5Vc2VzIEFXVCBhbmQgSW1hZ2VJTzsgcmVwbGFjZXMgPGEgaHJlZj0iaW1hZ2UuaHRtbCI+aW1hZ2U8L2E+IHRhc2sgZm9yIEphdmEgOSsuIFRoZSB0YXNrIGNhbiBiZQordXNlZCB3aXRoIEphdmEgOCBhcyB3ZWxsLCBzZWUgcGFyYW1ldGVyIHRhYmxlIGZvciBsaW1pdGF0aW9ucy48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoaXMgdGFzayB0cmllcyB0byBzdGF5IGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHN5bnRheCBhbmQgc2VtYW50aWNzCitvZiA8Y29kZT5pbWFnZTwvY29kZT4gdGFzay4gSG93ZXZlciwgaXQgdXNlcyA8dmFyPmZvcm1hdDwvdmFyPiBhdHRyaWJ1dGUgcmF0aGVyCit0aGFuIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gYXR0cmlidXRlLCBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgYSBtaXNub21lcjogYWxtb3N0IGFsbCB0YXNrcyB1c2Ugc2ltaWxhcgorYXR0cmlidXRlcyBmb3IgY2hhcmFjdGVyIGVuY29kaW5ncyBpbiBmaWxlcywgZmlsZSBuYW1lcyBvciBvdGhlciBzdHJpbmdzLiBBbHNvLAord2hlbiA8dmFyPmZvcm1hdDwvdmFyPiBpcyBub3Qgc3BlY2lmaWVkLCBpdHMgdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IG9mIHRoZSBmaXJzdCBwcm9jZXNzZWQKK2ltYWdlIGZpbGUuPC9wPgorPGg1Pk92ZXJ2aWV3IG9mIHVzZWQgZGF0YXR5cGVzPC9oNT4KKzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgZmlsbC1vcGFjaXR5PSIxIgorICAgICBjb2xvci1yZW5kZXJpbmc9ImF1dG8iIGNvbG9yLWludGVycG9sYXRpb249ImF1dG8iIHRleHQtcmVuZGVyaW5nPSJhdXRvIiBzdHJva2U9ImJsYWNrIgorICAgICBzdHJva2UtbGluZWNhcD0ic3F1YXJlIiB2aWV3Qm94PSIwIDAgMTUwNCA5NTciIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc2hhcGUtcmVuZGVyaW5nPSJhdXRvIgorICAgICBzdHJva2Utb3BhY2l0eT0iMSIgZmlsbD0iYmxhY2siIHN0cm9rZS1kYXNoYXJyYXk9Im5vbmUiIGZvbnQtd2VpZ2h0PSJub3JtYWwiIHN0cm9rZS13aWR0aD0iMSIKKyAgICAgZm9udC1mYW1pbHk9IlNhbnMtU2VyaWYiIGZvbnQtc3R5bGU9Im5vcm1hbCIgc3Ryb2tlLWxpbmVqb2luPSJtaXRlciIgZm9udC1zaXplPSIxMnB4IiByb2xlPSJpbWciCisgICAgIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBpbWFnZS1yZW5kZXJpbmc9ImF1dG8iIGFyaWEtbGFiZWxsZWRieT0iZGlhZ3JhbVRpdGxlIGRpYWdyYW1EZXNjcmlwdGlvbiI+CisgIDx0aXRsZSBpZD0iZGlhZ3JhbVRpdGxlIj5JbWFnZU9wZXJhdGlvbiBjbGFzcyBkaWFncmFtPC90aXRsZT4KKyAgPGRlc2MgaWQ9ImRpYWdyYW1EZXNjcmlwdGlvbiI+QSBkaWFncmFtIG9mIEFudCBEYXRhVHlwZSBjbGFzc2VzIHVzZWQgYnkgSW1hZ2VJTyB0YXNrLjwvZGVzYz4KKyAgPGRlZnMgaWQ9ImdlbmVyaWNEZWZzIi8+CisgIDxnPgorICAgIDxkZWZzIGlkPSJkZWZzMSI+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDEiPgorICAgICAgICA8cGF0aCBkPSJNMCAwIEwxNTA0IDAgTDE1MDQgOTU3IEwwIDk1NyBMMCAwIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDIiPgorICAgICAgICA8cGF0aCBkPSJNLTQzNSAtMTI5IEwxMDY5IC0xMjkgTDEwNjkgODI4IEwtNDM1IDgyOCBMLTQzNSAtMTI5IFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDMiPgorICAgICAgICA8cGF0aCBkPSJNMjA3IC0xMTMgTDIwNyAtNjYgTDQ1MiAtNjYgTDQ1MiAtMTEzIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDQiPgorICAgICAgICA8cGF0aCBkPSJNMjM5IDI2IEwyMzkgMTMwIEw0MjEgMTMwIEw0MjEgMjYgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoNSI+CisgICAgICAgIDxwYXRoIGQ9Ik0tMjQgMTA2IEwtMjQgMjIxIEwxNDQgMjIxIEwxNDQgMTA2IFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDYiPgorICAgICAgICA8cGF0aCBkPSJNNTI3IDEwNSBMNTI3IDE2NiBMOTEzIDE2NiBMOTEzIDEwNSBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGg3Ij4KKyAgICAgICAgPHBhdGggZD0iTTIwNiA0NzggTDIwNiA1NjIgTDQ1MiA1NjIgTDQ1MiA0NzggWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoOCI+CisgICAgICAgIDxwYXRoIGQ9Ik01NjIgNTQxIEw1NjIgODEyIEw4MTMgODEyIEw4MTMgNTQxIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDkiPgorICAgICAgICA8cGF0aCBkPSJNMjU3IDI3MiBMMjU3IDQwMiBMNDAzIDQwMiBMNDAzIDI3MiBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGgxMCI+CisgICAgICAgIDxwYXRoIGQ9Ik00NDkgMjcyIEw0NDkgMzMxIEw1NzEgMzMxIEw1NzEgMjcyIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDExIj4KKyAgICAgICAgPHBhdGggZD0iTTYxNCAyNzIgTDYxNCAzNjAgTDgyNiAzNjAgTDgyNiAyNzIgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoMTIiPgorICAgICAgICA8cGF0aCBkPSJNODc0IDI3MiBMODc0IDQwMiBMMTA1NCA0MDIgTDEwNTQgMjcyIFoiLz4KKyAgICAgIDwvY2xpcFBhdGg+CisgICAgICA8Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDEzIj4KKyAgICAgICAgPHBhdGggZD0iTTAgMjcyIEwwIDM0NiBMMTIyIDM0NiBMMTIyIDI3MiBaIi8+CisgICAgICA8L2NsaXBQYXRoPgorICAgICAgPGNsaXBQYXRoIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBpZD0iY2xpcFBhdGgxNCI+CisgICAgICAgIDxwYXRoIGQ9Ik0tMTY2IDI3MiBMLTE2NiAzMTcgTC00NCAzMTcgTC00NCAyNzIgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICAgIDxjbGlwUGF0aCBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgaWQ9ImNsaXBQYXRoMTUiPgorICAgICAgICA8cGF0aCBkPSJNLTM3NSAyNzIgTC0zNzUgMzYwIEwtMjA4IDM2MCBMLTIwOCAyNzIgWiIvPgorICAgICAgPC9jbGlwUGF0aD4KKyAgICA8L2RlZnM+CisgICAgPGcgZmlsbD0id2hpdGUiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0MzUsMTI5KSIgc3Ryb2tlPSJ3aGl0ZSI+CisgICAgICA8cmVjdCB4PSItNDM1IiB3aWR0aD0iMTUwNCIgaGVpZ2h0PSI5NTciIHk9Ii0xMjkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHN0cm9rZT0icmdiKDI1NSwyMDQsMTUzKSI+CisgICAgICA8cmVjdCB4PSIyMDgiIHdpZHRoPSIyNDMiIGhlaWdodD0iNDUiIHk9Ii0xMTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIwNyIgeT0iLTExMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjQ3IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIwOCIgeT0iLTExMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIyNDMiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyMDgiIHk9Ii02NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIyNDQiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0NTEiIHk9Ii0xMTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSI0NiIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMjE0LjU0MjUiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9Ii05NS41NTMzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzKSIgc3Ryb2tlPSJub25lIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTwvdGV4dD4KKyAgICA8L2c+CisgICAgPGcgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiPgorICAgICAgPGxpbmUgeTI9Ii04NyIgZmlsbD0ibm9uZSIgeDE9IjIwOCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMykiIHgyPSI0NTEiIHkxPSItODciLz4KKyAgICAgIDxsaW5lIHkyPSItNzciIGZpbGw9Im5vbmUiIHgxPSIyMDgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDMpIiB4Mj0iNDUxIiB5MT0iLTc3Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjEyLjUiIHk9Ii02MS4yMDk1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgzKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8L3RleHQ+CisgICAgICA8cmVjdCB4PSIyNDAiIHk9IjI3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjE4MCIgaGVpZ2h0PSIxMDIiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMjM5IiB5PSIyNiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjEwNCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNDAiIHk9IjI2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjE4MCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjI0MCIgeT0iMTI5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjE4MSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQyMCIgeT0iMjYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMDMiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMjc5LjQ0NzMiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjQzLjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBzdHJva2U9Im5vbmUiPkltYWdlT3BlcmF0aW9uPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSI+CisgICAgICA8bGluZSB5Mj0iNTEiIGZpbGw9Im5vbmUiIHgxPSIyNDAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiB4Mj0iNDIwIiB5MT0iNTEiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyNDQiIHk9IjY3LjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aW5zdHJ1Y3Rpb25zIDogTGlzdDwvdGV4dD4KKyAgICAgIDxsaW5lIHkyPSI3NSIgZmlsbD0ibm9uZSIgeDE9IjI0MCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNCkiIHgyPSI0MjAiIHkxPSI3NSIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI0NCIgeT0iOTIuMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hZGREcmF3KERyYXcgOiBpbnN0cik8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjQ0IiB5PSIxMDYuMTc3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hZGRSb3RhdGUoUm90YXRlIDogaW5zdHIpPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI0NCIgeT0iMTIwLjMxMDUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDQpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkU2NhbGUoU2NhbGUgOiBpbnN0cik8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTS00MTkuMTA1MSA0NjkuNTkzIEwtMTczLjU1NDMgNDY5LjU5MyBMLTE3My41NTQzIDQ4NC41OTMgTC0xNTguNTU0MyA0ODQuNTkzIEwtMTU4LjU1NDMgNTc0LjU5MyBMLTQxOS4xMDUxIDU3NC41OTMgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTS0xNzMuNTU0MyA0NjkuNTkzIEwtMTczLjU1NDMgNDg0LjU5MyBMLTE1OC41NTQzIDQ4NC41OTMgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjQ5MS4yOTYxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPlRoZSBzZXRUeXBlKCkgbWV0aG9kIGZvcmNlcyB0eXBlIHRvPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii00MTIuMTA1MSIgeT0iNTA1LjQyODkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+b25lIG9mIHRoZSB2YWx1ZXMgb2YgamF2YS5hd3QuZ2VvbS5BcmMyRDo8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTQxMi4xMDUxIiB5PSI1MTkuNTYxNyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5vcGVuID0gQXJjMkQuT1BFTjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjUzMy42OTQ1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPnBpZSA9IEFyYzJELlBJRTwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItNDEyLjEwNTEiIHk9IjU0Ny44MjczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmNob3JkID0gQXJjMkQuQ0hPUkQ8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTQxMi4xMDUxIiB5PSI1NjEuOTYwMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5QYXJhbWV0ZXIgaXMgbm90IGNhc2Utc2Vuc2l0aXZlLjwvdGV4dD4KKyAgICAgIDxyZWN0IHg9Ii0yMyIgeT0iMTA3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjE2NiIgaGVpZ2h0PSIxMTMiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTI0IiB5PSIxMDYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMTUiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTIzIiB5PSIxMDYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTY2IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTIzIiB5PSIyMjAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMTY3IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMTQzIiB5PSIxMDYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMTQiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMjUuMzEzMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMTIzLjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBzdHJva2U9Im5vbmUiPkJhc2ljU2hhcGU8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIj4KKyAgICAgIDxsaW5lIHkyPSIxMzEiIGZpbGw9Im5vbmUiIHgxPSItMjMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiB4Mj0iMTQzIiB5MT0iMTMxIi8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTE5IiB5PSIxNDcuOTEyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5oZWlnaHQgOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0xOSIgeT0iMTYyLjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+d2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0xOSIgeT0iMTc2LjE3NzciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3Ryb2tlV2lkdGggOiBpbnQgPSAwPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0xOSIgeT0iMTkwLjMxMDUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDUpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3Ryb2tlIDogU3RyaW5nID0gImJsYWNrIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItMTkiIHk9IjIwNC40NDM0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg1KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmZpbGwgOiBTdHJpbmcgPSAidHJhbnNwYXJlbnQiPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjIxMSIgZmlsbD0ibm9uZSIgeDE9Ii0yMyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNSkiIHgyPSIxNDMiIHkxPSIyMTEiLz4KKyAgICAgIDxyZWN0IHg9IjUyOCIgeT0iMTA2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjM4NCIgaGVpZ2h0PSI1OSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1MjciIHk9IjEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjYxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjUyOCIgeT0iMTA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjM4NCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjUyOCIgeT0iMTY1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjM4NSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjkxMiIgeT0iMTA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNjAiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtc3R5bGU9Iml0YWxpYyIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNjU1LjgzNDciIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjEyMi41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg2KSIgc3Ryb2tlPSJub25lIj5UcmFuc2Zvcm1PcGVyYXRpb248L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIj4KKyAgICAgIDxsaW5lIHkyPSIxMzAiIGZpbGw9Im5vbmUiIHgxPSI1MjgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiB4Mj0iOTEyIiB5MT0iMTMwIi8+CisgICAgICA8bGluZSB5Mj0iMTQwIiBmaWxsPSJub25lIiB4MT0iNTI4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg2KSIgeDI9IjkxMiIgeTE9IjE0MCIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjUzMiIgeT0iMTU2LjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDYpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihCdWZmZXJlZEltYWdlIGltZykgOiBCdWZmZXJlZEltYWdlPC90ZXh0PgorICAgICAgPHJlY3QgeD0iMjA3IiB5PSI0NzkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjgyIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjIwNiIgeT0iNDc4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEiIGhlaWdodD0iODQiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMjA3IiB5PSI0NzgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMjQ0IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMjA3IiB5PSI1NjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMjQ1IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNDUxIiB5PSI0NzgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSI4MyIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjg0LjQ4NjMiIHk9IjQ5NC42MDE2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg3KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPiZsdDsmbHQ7aW50ZXJmYWNlJmd0OyZndDs8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1zdHlsZT0iaXRhbGljIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSIyODEuNTI1OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNTE4LjcwMTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDcpIiBzdHJva2U9Im5vbmUiPkRyYXdPcGVyYXRpb248L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIj4KKyAgICAgIDxsaW5lIHkyPSI1MjYiIGZpbGw9Im5vbmUiIHgxPSIyMDciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDcpIiB4Mj0iNDUxIiB5MT0iNTI2Ii8+CisgICAgICA8bGluZSB5Mj0iNTM2IiBmaWxsPSJub25lIiB4MT0iMjA3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg3KSIgeDI9IjQ1MSIgeTE9IjUzNiIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjIxMSIgeT0iNTUzLjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDcpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+ZXhlY3V0ZURyYXdPcGVyYXRpb24oKSA6IEJ1ZmZlcmVkSW1hZ2U8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTTIyMC4zMTc4IDYzNS44NjY1IEw0MjEuMzc4MyA2MzUuODY2NSBMNDIxLjM3ODMgNjUwLjg2NjUgTDQzNi4zNzgzIDY1MC44NjY1IEw0MzYuMzc4MyA3MTEuNjIzMyBMMjIwLjMxNzggNzExLjYyMzMgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTTQyMS4zNzgzIDYzNS44NjY1IEw0MjEuMzc4MyA2NTAuODY2NSBMNDM2LjM3ODMgNjUwLjg2NjUgWiIgZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMjcuMzE3OCIgeT0iNjU3LjA4MDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+VGhlIGltcGxlbWVudGluZyBjbGFzcyB1c2VzPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjIyNy4zMTc4IiB5PSI2NzEuMjEzNyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5Db2xvck1hcHBlciB0byBldmFsdWF0ZSB0aGUgY29sb3IuPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjIyNy4zMTc4IiB5PSI2ODUuMzQ2NSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5Pbmx5IHRoZSB2YWx1ZXMgZGVmaW5lZCBpbjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyMjcuMzE3OCIgeT0iNjk5LjQ3OTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q29sb3JNYXBwZXIgYXJlIHVzZWQuPC90ZXh0PgorICAgICAgPHJlY3QgeD0iNTYzIiB5PSI1NDIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMjQ5IiBoZWlnaHQ9IjI2OSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjIiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjI3MSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjMiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIyNDkiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI1NjMiIHk9IjgxMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIyNTAiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI4MTIiIHk9IjU0MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjI3MCIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNjQ3LjY3NTQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjU1OC45MDU1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgc3Ryb2tlPSJub25lIj5Db2xvck1hcHBlcjwvdGV4dD4KKyAgICA8L2c+CisgICAgPGcgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiPgorICAgICAgPGxpbmUgeTI9IjU2NiIgZmlsbD0ibm9uZSIgeDE9IjU2MyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIHgyPSI4MTIiIHkxPSI1NjYiLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNTgzLjI0OTMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfQkxBQ0sgOiBTdHJpbmcgPSAiYmxhY2siPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI1OTcuMzgyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9CTFVFIDogU3RyaW5nID0gImJsdWUiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2MTEuNTE0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9DWUFOIDogU3RyaW5nID0gImN5YW4iPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2MjUuNjQ3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9EQVJLR1JBWSA6IFN0cmluZyA9ICJkYXJrZ3JheSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjYzOS43ODA1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0dSQVkgOiBTdHJpbmcgPSAiZ3JheSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjY1My45MTMzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0xJR0hUR1JBWSA6IFN0cmluZyA9ICJsaWdodGdyYXkiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjU2Ny43MTAzIiB5PSI2NjguMDQ2MSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5DT0xPUl9EQVJLR1JFWSA6IFN0cmluZyA9ICJkYXJrZ3JleSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjY4Mi4xNzkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfR1JFWSA6IFN0cmluZyA9ICJncmV5IjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNjk2LjMxMTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfTElHSFRHUkVZIDogU3RyaW5nID0gImxpZ2h0Z3JleSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9IjcxMC40NDQ2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX0dSRUVOIDogU3RyaW5nID0gImdyZWVuIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzI0LjU3NzQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfTUFHRU5UQSA6IFN0cmluZyA9ICJtYWdlbnRhIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzM4LjcxMDIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfT1JBTkdFIDogU3RyaW5nID0gIm9yYW5nZSI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9Ijc1Mi44NDMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfUElOSyA6IFN0cmluZyA9ICJwaW5rIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzY2Ljk3NTgiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfUkVEIDogU3RyaW5nID0gInJlZCI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNTY3LjcxMDMiIHk9Ijc4MS4xMDg2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPkNPTE9SX1dISVRFIDogU3RyaW5nID0gIndoaXRlIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI1NjcuNzEwMyIgeT0iNzk1LjI0MTUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDgpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Q09MT1JfWUVMTE9XIDogU3RyaW5nID0gInllbGxvdyI8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iODAyIiBmaWxsPSJub25lIiB4MT0iNTYzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg4KSIgeDI9IjgxMiIgeTE9IjgwMiIvPgorICAgICAgPHJlY3QgeD0iMjU4IiB5PSIyNzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMTQ0IiBoZWlnaHQ9IjEyOCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTciIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjEzMCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTgiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxNDQiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIyNTgiIHk9IjQwMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxNDUiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0MDIiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjEyOSIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iMzE1Ljg1MTEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgc3Ryb2tlPSJub25lIj5UZXh0PC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSI+CisgICAgICA8bGluZSB5Mj0iMjk3IiBmaWxsPSJub25lIiB4MT0iMjU4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgeDI9IjQwMiIgeTE9IjI5NyIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzEzLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+c3RyaW5nIDogU3RyaW5nID0gIiI8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjYyIiB5PSIzMjguMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5mb250IDogU3RyaW5nID0gIkFyaWFsIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSIyNjIiIHk9IjM0Mi4xNzc3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg5KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPnBvaW50IDogaW50ID0gMTA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iMjYyIiB5PSIzNTYuMzEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5ib2xkIDogYm9vbGVhbiA9IGZhbHNlPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzcwLjQ0MzQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+Y29sb3IgOiBTdHJpbmcgPSAiYmxhY2siPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjI2MiIgeT0iMzg0LjU3NjIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDkpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+aXRhbGljIDogYm9vbGVhbiA9IGZhbHNlPC90ZXh0PgorICAgICAgPGxpbmUgeTI9IjM5MiIgZmlsbD0ibm9uZSIgeDE9IjI1OCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoOSkiIHgyPSI0MDIiIHkxPSIzOTIiLz4KKyAgICAgIDxyZWN0IHg9IjQ1MCIgeT0iMjczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI1NyIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSI0NDkiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9IjU5IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ1MCIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjQ1MCIgeT0iMzMwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEyMSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjU3MCIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNTgiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9IjQ4OS44MjQiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIHN0cm9rZT0ibm9uZSI+Um90YXRlPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSI+CisgICAgICA8bGluZSB5Mj0iMjk3IiBmaWxsPSJub25lIiB4MT0iNDUwIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIHgyPSI1NzAiIHkxPSIyOTciLz4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI0NTQiIHk9IjMxMy45MTIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMCkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hbmdsZSA6IGZsb2F0ID0gMC4wRjwvdGV4dD4KKyAgICAgIDxsaW5lIHkyPSIzMjEiIGZpbGw9Im5vbmUiIHgxPSI0NTAiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEwKSIgeDI9IjU3MCIgeTE9IjMyMSIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIyNzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMjEwIiBoZWlnaHQ9Ijg2IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjYxNCIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEiIGhlaWdodD0iODgiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iNjE1IiB5PSIzNTkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMjExIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODI1IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMSIgaGVpZ2h0PSI4NyIgc3Ryb2tlPSJub25lIi8+CisgICAgPC9nPgorICAgIDxnIGZvbnQtc2l6ZT0iMTNweCIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiPgorICAgICAgPHRleHQgeD0iNzA0LjA4MDEiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIHN0cm9rZT0ibm9uZSI+U2NhbGU8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIj4KKyAgICAgIDxsaW5lIHkyPSIyOTciIGZpbGw9Im5vbmUiIHgxPSI2MTUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgeDI9IjgyNSIgeTE9IjI5NyIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjYxOSIgeT0iMzEzLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPndpZHRoIDogU3RyaW5nID0gIjEwMCUiPC90ZXh0PgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9IjYxOSIgeT0iMzI4LjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDExKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmhlaWdodCA6IFN0cmluZyA9ICIxMDAlIjwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI2MTkiIHk9IjM0Mi4xNzc3IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5rZWVwUHJvcG9ydGlvbnMgOiBib29sZWFuID0gZmFsc2U8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzQ5IiBmaWxsPSJub25lIiB4MT0iNjE1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMSkiIHgyPSI4MjUiIHkxPSIzNDkiLz4KKyAgICAgIDxyZWN0IHg9Ijg3NSIgeT0iMjczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjE3OCIgaGVpZ2h0PSIxMjgiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc0IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSIxMzAiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc1IiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTc4IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iODc1IiB5PSI0MDEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMTc5IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMTA1MyIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iMTI5IiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSI5NDcuODczOCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjg5LjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEyKSIgc3Ryb2tlPSJub25lIj5EcmF3PC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSI+CisgICAgICA8bGluZSB5Mj0iMjk3IiBmaWxsPSJub25lIiB4MT0iODc1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMikiIHgyPSIxMDUzIiB5MT0iMjk3Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzMTMuOTEyMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+eGxvYyA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzMjguMDQ0OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+eWxvYyA6IGludCA9IDA8L3RleHQ+CisgICAgICA8bGluZSB5Mj0iMzM1IiBmaWxsPSJub25lIiB4MT0iODc1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMikiIHgyPSIxMDUzIiB5MT0iMzM1Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzNTIuMTc3NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkVGV4dChUZXh0IDogdGV4dCk8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzNjYuMzEwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkUmVjdGFuZ2xlKFJlY3RhbmdsZSByZWN0KTwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSI4NzkiIHk9IjM4MC40NDM0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMikiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5hZGRFbGxpcHNlKEVsbGlwc2UgZWxpcCk8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iODc5IiB5PSIzOTQuNTc2MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTIpIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc3Ryb2tlPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+YWRkQXJjKEFyYyBhcmMpPC90ZXh0PgorICAgICAgPHJlY3QgeD0iMSIgeT0iMjczIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyMDQsMTUzKSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI3MiIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIwIiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMSIgaGVpZ2h0PSI3NCIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSIxIiB5PSIyNzIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDI1NSwyMTgpIiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iMSIgeT0iMzQ1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEyMSIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9IjEyMSIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iNzMiIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9IjMwLjMzMTMiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMykiIHN0cm9rZT0ibm9uZSI+UmVjdGFuZ2xlPC90ZXh0PgorICAgIDwvZz4KKyAgICA8ZyB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSI+CisgICAgICA8bGluZSB5Mj0iMjk3IiBmaWxsPSJub25lIiB4MT0iMSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTMpIiB4Mj0iMTIxIiB5MT0iMjk3Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNSIgeT0iMzEzLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFyY2hlaWdodCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iNSIgeT0iMzI4LjA0NDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDEzKSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPmFyY3dpZHRoIDogaW50ID0gMDwvdGV4dD4KKyAgICAgIDxsaW5lIHkyPSIzMzUiIGZpbGw9Im5vbmUiIHgxPSIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxMykiIHgyPSIxMjEiIHkxPSIzMzUiLz4KKyAgICAgIDxyZWN0IHg9Ii0xNjUiIHk9IjI3MyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjA0LDE1MykiIHdpZHRoPSIxMjAiIGhlaWdodD0iNDMiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTE2NiIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEiIGhlaWdodD0iNDUiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTE2NSIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDI1NSwyNTUsMjE4KSIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIxIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0xNjUiIHk9IjMxNiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxMjEiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItNDUiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigxNzgsMTQyLDEwNykiIHdpZHRoPSIxIiBoZWlnaHQ9IjQ0IiBzdHJva2U9Im5vbmUiLz4KKyAgICA8L2c+CisgICAgPGcgZm9udC1zaXplPSIxM3B4IiBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSIgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8dGV4dCB4PSItMTI1LjMxNzgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI4OS41Njg0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNCkiIHN0cm9rZT0ibm9uZSI+RWxsaXBzZTwvdGV4dD4KKyAgICA8L2c+CisgICAgPGcgdGV4dC1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDM1LDEyOSkiPgorICAgICAgPGxpbmUgeTI9IjI5NyIgZmlsbD0ibm9uZSIgeDE9Ii0xNjUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE0KSIgeDI9Ii00NSIgeTE9IjI5NyIvPgorICAgICAgPGxpbmUgeTI9IjMwNyIgZmlsbD0ibm9uZSIgeDE9Ii0xNjUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE0KSIgeDI9Ii00NSIgeTE9IjMwNyIvPgorICAgICAgPHRleHQgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiIHg9Ii0xNjEuMTMyMyIgeT0iMzIzLjkxMjEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE0KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPiA8L3RleHQ+CisgICAgICA8cmVjdCB4PSItMzc0IiB5PSIyNzMiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMjU1LDIwNCwxNTMpIiB3aWR0aD0iMTY1IiBoZWlnaHQ9Ijg2IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0zNzUiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxIiBoZWlnaHQ9Ijg4IiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxyZWN0IHg9Ii0zNzQiIHk9IjI3MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIGZpbGw9InJnYigyNTUsMjU1LDIxOCkiIHdpZHRoPSIxNjUiIGhlaWdodD0iMSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cmVjdCB4PSItMzc0IiB5PSIzNTkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBmaWxsPSJyZ2IoMTc4LDE0MiwxMDcpIiB3aWR0aD0iMTY2IiBoZWlnaHQ9IjEiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHJlY3QgeD0iLTIwOSIgeT0iMjcyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgZmlsbD0icmdiKDE3OCwxNDIsMTA3KSIgd2lkdGg9IjEiIGhlaWdodD0iODciIHN0cm9rZT0ibm9uZSIvPgorICAgIDwvZz4KKyAgICA8ZyBmb250LXNpemU9IjEzcHgiIHN0cm9rZS1saW5lY2FwPSJidXR0IiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIiB0ZXh0LXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBmb250LWZhbWlseT0ic2Fucy1zZXJpZiIgc2hhcGUtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1Ij4KKyAgICAgIDx0ZXh0IHg9Ii0zMDIuMzQyNyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjg5LjU2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE1KSIgc3Ryb2tlPSJub25lIj5BcmM8L3RleHQ+CisgICAgPC9nPgorICAgIDxnIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQzNSwxMjkpIj4KKyAgICAgIDxsaW5lIHkyPSIyOTciIGZpbGw9Im5vbmUiIHgxPSItMzc0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIHgyPSItMjA5IiB5MT0iMjk3Ii8+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTM3MC4zNjkiIHk9IjMxMy45MTIxIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5zdGFydCA6IGludCA9IDA8L3RleHQ+CisgICAgICA8dGV4dCBzdHJva2UtbGluZWNhcD0iYnV0dCIgeD0iLTM3MC4zNjkiIHk9IjMyOC4wNDQ5IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIGZvbnQtZmFtaWx5PSJzYW5zLXNlcmlmIiBzdHJva2U9Im5vbmUiIHN0cm9rZS1taXRlcmxpbWl0PSIxLjQ1IiB4bWw6c3BhY2U9InByZXNlcnZlIj5zdG9wIDogaW50ID0gMDwvdGV4dD4KKyAgICAgIDx0ZXh0IHN0cm9rZS1saW5lY2FwPSJidXR0IiB4PSItMzcwLjM2OSIgeT0iMzQyLjE3NzciIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDE1KSIgZm9udC1mYW1pbHk9InNhbnMtc2VyaWYiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLW1pdGVybGltaXQ9IjEuNDUiIHhtbDpzcGFjZT0icHJlc2VydmUiPnR5cGUgOiBlbnVtZXJhdGVkID0gb3BlbjwvdGV4dD4KKyAgICAgIDxsaW5lIHkyPSIzNDkiIGZpbGw9Im5vbmUiIHgxPSItMzc0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxNSkiIHgyPSItMjA5IiB5MT0iMzQ5Ii8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSIgZD0iTTMzMCAyNS45ODY2IEwzMzAgLTUxLjExMDUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2UtbGluZWNhcD0iYnV0dCIvPgorICAgIDwvZz4KKyAgICA8ZyBzdHJva2UtbGluZWNhcD0iYnV0dCIgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MzUsMTI5KSIgZmlsbD0id2hpdGUiIHRleHQtcmVuZGVyaW5nPSJnZW9tZXRyaWNQcmVjaXNpb24iIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIiBzdHJva2U9IndoaXRlIiBzdHJva2UtbWl0ZXJsaW1pdD0iMS40NSI+CisgICAgICA8cGF0aCBkPSJNMzMwIC02Ni4xMTA1IEwzMjQgLTUwLjExMDUgTDMzNiAtNTAuMTEwNSBaIiBzdHJva2U9Im5vbmUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMzMwIC02Ni4xMTA1IEwzMjQgLTUwLjExMDUgTDMzNiAtNTAuMTEwNSBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjM1OC4xMDE2IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSItMTUuNTI1NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0xNDQuMDEyNSAxMzYuODk2MSBMMjI0LjY1ODYgMTExLjM1ODEiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNMjM4Ljk1ODcgMTA2LjgyOTcgTDIyMS44OTM5IDEwNS45Mzk5IEwyMjUuNTE2NiAxMTcuMzgwMSBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMjM4Ljk1ODcgMTA2LjgyOTcgTDIyMS44OTM5IDEwNS45Mzk5IEwyMjUuNTE2NiAxMTcuMzgwMSBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjE4OS42ODA3IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIxNTcuODM2NyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik01MjcuMDQ3MSAxMTkuNDUxMiBMNDM1LjY0OTUgMTAwLjIyNDYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNNDIwLjk3MDcgOTcuMTM2OCBMNDM1LjM5MjkgMTA2LjMwMiBMNDM3Ljg2MzIgOTQuNTU5IFoiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiLz4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik00MjAuOTcwNyA5Ny4xMzY4IEw0MzUuMzkyOSAxMDYuMzAyIEw0MzcuODYzMiA5NC41NTkgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI0NzkuNjM4NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iODMuNzU2MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0yOTcuMjk2IDQ3Ny45ODMzIEwxMDMuMzYzMyAyMjAuOTY4NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSIyMzQuNTIxMiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMzUyLjAzMzUiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtZGFzaGFycmF5PSI2LDIiIGQ9Ik0zMjguNTA4NiA2MzUuODcxNyBMMzI4LjgyMTkgNTYyLjAwOTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSIzNTYuNzY3MSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNjAzLjQ2ODQiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2UtZGFzaGFycmF5PSI2LDIiIGQ9Ik01NjIuNzA4NCA2NzUuODk1OCBMNDM2LjQwMjEgNjc0LjczNjYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI0OTcuNjQ1OSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNjQ5Ljg1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTMyOS4yMjk3IDQ3Ny45NTgzIEwzMjkuNjQ0OCA0MDIuMDA3NCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSIzNTcuNTM5MiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNDQ0LjUzNTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMzMwIDI3Mi4wMjg3IEwzMzAgMTQ0Ljk2NTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNMzMwIDEyOS45NjUyIEwzMjQgMTQ1Ljk2NTIgTDMzNiAxNDUuOTY1MiBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNMzMwIDEyOS45NjUyIEwzMjQgMTQ1Ljk2NTIgTDMzNiAxNDUuOTY1MiBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9IjM1OC4xMDE2IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyMDUuNTM1MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik0zNjMuNzk5MiA0NzcuOTkxIEw0ODUuNTY3NyAzMzAuOTk0MiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI0NTkuNjM0NiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iNDExLjU3MDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNTQ3LjI5ODYgMjcyLjAxNjQgTDY2OS42MzE5IDE3NS4zMTQ4IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTTY4MS4zOTk0IDE2Ni4wMTI4IEw2NjUuMTI2NiAxNzEuMjI3OSBMNjcyLjU2ODIgMTgwLjY0MTkgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTY4MS4zOTk0IDE2Ni4wMTI4IEw2NjUuMTI2NiAxNzEuMjI3OSBMNjcyLjU2ODIgMTgwLjY0MTkgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI2MzguMDYwNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjQxLjU0NjYiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNDA5LjQ5NTggNDc4LjAwMjIgTDYzNS42NjUgMzYwLjAwMDkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8dGV4dCBmaWxsPSJibGFjayIgeD0iNTUzLjMyMjYiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjQ0MC4zNDQ1IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTcyMCAyNzEuOTc2NyBMNzIwIDE4MC45ODc0IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTTcyMCAxNjUuOTg3NCBMNzE0IDE4MS45ODc0IEw3MjYgMTgxLjk4NzQgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTcyMCAxNjUuOTg3NCBMNzE0IDE4MS45ODc0IEw3MjYgMTgxLjk4NzQgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI3NDguMTAxNiIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgeT0iMjIzLjUzNTIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9Im5vbmUiPiA8L3RleHQ+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNODg1LjI3NzggMjcxLjk4OTcgTDc2OC41MDczIDE3NS41NTgzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHBhdGggZD0iTTc1Ni45NDEzIDE2Ni4wMDY5IEw3NjUuNDU3OCAxODAuODIxNCBMNzczLjA5ODkgMTcxLjU2ODcgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTc1Ni45NDEzIDE2Ni4wMDY5IEw3NjUuNDU3OCAxODAuODIxNCBMNzczLjA5ODkgMTcxLjU2ODcgWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSI4NjAuODM4IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyMTkuMDAyNCIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIGQ9Ik02MC43NDU4IDI3Mi4wMjExIEw2MC40OTg0IDIzNi4wMTkiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImJsYWNrIi8+CisgICAgICA8cGF0aCBkPSJNNjAuMzk1MyAyMjEuMDE5NCBMNTQuNTA1NCAyMzcuMDYwMiBMNjYuNTA1MSAyMzYuOTc3OCBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIi8+CisgICAgICA8cGF0aCBmaWxsPSJub25lIiBkPSJNNjAuMzk1MyAyMjEuMDE5NCBMNTQuNTA1NCAyMzcuMDYwMiBMNjYuNTA1MSAyMzYuOTc3OCBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9Ijg4LjY3MjciIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjI1MS4wMzUyIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS03Ni43NzAzIDI3Mi4wMDA0IEwtMjQuMjQzNiAyMzAuMzMwNyIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDxwYXRoIGQ9Ik0tMTIuNDkyMyAyMjEuMDA4NCBMLTI4Ljc1NiAyMjYuMjUxNyBMLTIxLjI5ODEgMjM1LjY1MjggWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS0xMi40OTIzIDIyMS4wMDg0IEwtMjguNzU2IDIyNi4yNTE3IEwtMjEuMjk4MSAyMzUuNjUyOCBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9Ii0xNi40MzM5IiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyNjUuNDU3OSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSI+IDwvdGV4dD4KKyAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZS1kYXNoYXJyYXk9IjYsMiIgZD0iTS0yODkuNjA0IDQ2OS41ODg2IEwtMjkxLjIyMDQgMzU5Ljk4NDIiIGNsaXAtcGF0aD0idXJsKCNjbGlwUGF0aDIpIiBzdHJva2U9ImdyYXkiLz4KKyAgICAgIDx0ZXh0IGZpbGw9ImJsYWNrIiB4PSItMjYyLjMwNzMiIHhtbDpzcGFjZT0icHJlc2VydmUiIHk9IjQxOS4zMzE2IiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS0yNzguNDI0OCAyNzEuOTk3MiBMLTM4LjI3MDQgMTk1LjAwNSIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0iYmxhY2siLz4KKyAgICAgIDxwYXRoIGQ9Ik0tMjMuOTg2NSAxOTAuNDI1NiBMLTQxLjA1NDQgMTg5LjU5NjcgTC0zNy4zOTEgMjAxLjAyMzggWiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMikiIHN0cm9rZT0ibm9uZSIvPgorICAgICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTS0yMy45ODY1IDE5MC40MjU2IEwtNDEuMDU0NCAxODkuNTk2NyBMLTM3LjM5MSAyMDEuMDIzOCBaIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJibGFjayIvPgorICAgICAgPHRleHQgZmlsbD0iYmxhY2siIHg9Ii0xMTguMDgzIiB4bWw6c3BhY2U9InByZXNlcnZlIiB5PSIyNTYuMDIzIiBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgyKSIgc3Ryb2tlPSJub25lIj4gPC90ZXh0PgorICAgIDwvZz4KKyAgPC9nPgorPC9zdmc+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gSWYgPHE+ZmFsc2U8L3E+LCBub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3JjZGlyPC90ZD4KKyAgICA8dGQ+RGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGltYWdlcy48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBuZXN0ZWQgZmlsZXNldCBpcyB1c2VkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mb3JtYXQ8L3RkPgorICAgIDx0ZD5JbWFnZSBmb3JtYXQuPGJyLz5WYWxpZCAoY2FzZSBpbnNlbnNpdGl2ZSkKKyAgICAgIGFyZTogPHE+Ym1wPC9xPiwgPHE+Z2lmPC9xPiwgPHE+anBlZzwvcT4sIDxxPmpwZzwvcT4sIDxxPnBuZzwvcT4sIDxxPnRpZjwvcT4sIDxxPnRpZmY8L3E+LCA8cT53Ym1wPC9xPgorICAgICAgKEphdmEgOCBWTSBsYWNrcyBzdXBwb3J0IGZvciBUSUZGLCB3aGljaCBjYW4gYmUgcHJvdmlkZWQKKyAgICAgIGJ5IDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5leHRlcm5hbCBsaWJyYXJpZXM8L2E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIGZvcm1hdCBvZiB0aGUgKGZpcnN0KSBvcmlnaW5hbCBmaWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vdmVyd3JpdGU8L3RkPgorICAgIDx0ZD5Cb29sZWFuIHZhbHVlLiBTZXRzIHdoZXRoZXIgb3Igbm90IHRvIG92ZXJ3cml0ZSBhIGZpbGUgaWYgdGhlcmUgaXMgbmFtaW5nIGNvbmZsaWN0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmdjPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gRW5hYmxlcyBnYXJiYWdlIGNvbGxlY3Rpb24gYWZ0ZXIgZWFjaCBpbWFnZSBwcm9jZXNzZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPkRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzdWx0IGltYWdlcyBhcmUgc3RvcmVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB2YWx1ZSBvZiA8dmFyPnNyY2RpcjwvdmFyPjwvdGQ+CisgIDwvdHI+CisgIDwhLS0gYXR0cmlidXRlcyBpbmhlcml0ZWQgZnJvbSBNYXRjaGluZ1Rhc2sgLS0+CisgIDx0cj4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCAoPHE+eWVzfG5vPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhc2VTZW5zaXRpdmU8L3RkPgorICAgIDx0ZD5Cb29sZWFuIHZhbHVlLiBTZXRzIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGZpbGUgc3lzdGVtLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZvbGxvd1N5bWxpbmtzPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB2YWx1ZS4gU2V0cyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kIHN1cHBvcnRzIG1vc3QKK2F0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBhcyB3ZWxsIGFzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBJbWFnZU9wZXJhdGlvbiBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkCitlbGVtZW50czogPGNvZGU+Um90YXRlPC9jb2RlPiwgPGNvZGU+U2NhbGU8L2NvZGU+IGFuZCA8Y29kZT5EcmF3PC9jb2RlPi48L3A+CisKKzxoND5Sb3RhdGU8L2g0PgorPHA+QWRkcyBhIFJvdGF0ZSBJbWFnZU9wZXJhdGlvbiB0byBjaGFpbi48L3A+Cis8aDU+UGFyYW1ldGVyczwvaDU+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmFuZ2xlPC90ZD4KKyAgICA8dGQ+RmxvYXQgdmFsdWUuIFNldHMgdGhlIGFuZ2xlIG9mIHJvdGF0aW9uIGluIGRlZ3JlZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjAuMEY8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoND5TY2FsZTwvaDQ+Cis8cD5BZGRzIGEgU2NhbGUgSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uPC9wPgorPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcm9wb3J0aW9uczwvdGQ+CisgICAgPHRkPlNldHMgd2hpY2ggZGltZW5zaW9uIHRvIGNvbnRyb2wgcHJvcG9ydGlvbnMgZnJvbS4gVmFsaWQgdmFsdWVzIGFyZToKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPmlnbm9yZTwvcT4mbWRhc2g7dHJlYXQgdGhlIGRpbWVuc2lvbnMgaW5kZXBlbmRlbnRseS48L2xpPgorICAgICAgICA8bGk+PHE+aGVpZ2h0PC9xPiZtZGFzaDtrZWVwIHByb3BvcnRpb25zIGJhc2VkIG9uIHRoZSB3aWR0aC48L2xpPgorICAgICAgICA8bGk+PHE+d2lkdGg8L3E+Jm1kYXNoO2tlZXAgcHJvcG9ydGlvbnMgYmFzZWQgb24gdGhlIGhlaWdodC48L2xpPgorICAgICAgICA8bGk+PHE+Y292ZXI8L3E+Jm1kYXNoO2tlZXAgcHJvcG9ydGlvbnMgYW5kIGZpdCBpbiB0aGUgc3VwcGxpZWQgZGltZW5zaW9ucy48L2xpPgorICAgICAgICA8bGk+PHE+Zml0PC9xPiZtZGFzaDtrZWVwIHByb3BvcnRpb25zIGFuZCBjb3ZlciB0aGUgc3VwcGxpZWQgZGltZW5zaW9ucy48L2xpPgorICAgICAgPC91bD4KKyAgICA8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+aWdub3JlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+d2lkdGg8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UsIGVpdGhlciBhcyBhbiBpbnRlZ2VyIChwaXhlbHMpIG9yIGEgJS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MTAwJTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhlaWdodDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGVpdGhlciBhcyBhbiBpbnRlZ2VyIChwaXhlbHMpIG9yIGEgJS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MTAwJTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0IGlkPSJkcmF3Ij5EcmF3PC9oND4KKzxwPkFkZHMgYSBEcmF3IEltYWdlT3BlcmF0aW9uIHRvIGNoYWluLiBEcmF3T3BlcmF0aW9uIERhdGFUeXBlIG9iamVjdHMgY2FuIGJlIG5lc3RlZCBpbnNpZGUgdGhlIERyYXcKK29iamVjdC48L3A+Cis8aDU+UGFyYW1ldGVyczwvaDU+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnhsb2M8L3RkPgorICAgIDx0ZD5YLVBvc2l0aW9uIHdoZXJlIHRvIGRyYXcgbmVzdGVkIGltYWdlIGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+eWxvYzwvdGQ+CisgICAgPHRkPlktUG9zaXRpb24gd2hlcmUgdG8gZHJhdyBuZXN0ZWQgaW1hZ2UgZWxlbWVudHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDU+TmVzdGVkIGVsZW1lbnRzPC9oNT4KKzxwPkJvdGggVGV4dCBhbmQgQmFzaWNTaGFwZSBvYmplY3RzIGNhbiBiZSBuZXN0ZWQuIEN1cnJlbnRseSBzdXBwb3J0ZWQgQmFzaWNTaGFwZSBvYmplY3RzIGFyZSBBcmMsCitFbGxpcHNlIGFuZCBSZWN0YW5nbGUuPC9wPgorPGg2PkNvbW1vbiBwYXJhbWV0ZXJzIG9mIEJhc2ljU2hhcGUgb2JqZWN0czwvaDY+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhlaWdodDwvdGQ+CisgICAgPHRkPkhlaWdodCBvZiBhIEJhc2ljU2hhcGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aWR0aDwvdGQ+CisgICAgPHRkPldpZHRoIG9mIGEgQmFzaWNTaGFwZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MDwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnN0cm9rZXdpZHRoPC90ZD4KKyAgICA8dGQ+U3Ryb2tlIHdpZHRoIG9mIGEgQmFzaWNTaGFwZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MDwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbG9yPC90ZD4KKyAgICA8dGQ+Q29sb3Igb2YgYSBCYXNpY1NoYXBlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ibGFjazwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZpbGw8L3RkPgorICAgIDx0ZD5GaWxsIG9mIGEgQmFzaWNTaGFwZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJhbnNwYXJlbnQ8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDY+UGFyYW1ldGVycyBzcGVjaWZpYyB0byBBcmMgb2JqZWN0czwvaDY+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnN0YXJ0PC90ZD4KKyAgICA8dGQ+U3RhcnQgYW5nbGUgb2YgYW4gYXJjIGluIGRlZ3JlZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zdG9wPC90ZD4KKyAgICA8dGQ+QW5nbGUgZXh0ZW50IG9mIGFuIGFyYyBpbiBkZWdyZWVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8cT5jaG9yZDwvcT4sIDxxPm9wZW48L3E+LCA8cT5waWU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5vcGVuPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg2PlBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gRWxsaXBzZSBvYmplY3RzPC9oNj4KKzxwPk5vbmUuPC9wPgorPGg2PlBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gUmVjdGFuZ2xlIG9iamVjdHM8L2g2PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5hcmNoZWlnaHQ8L3RkPgorICAgIDx0ZD5WZXJ0aWNhbCBkaWFtZXRlciBvZiB0aGUgYXJjIGF0IHRoZSBjb3JuZXJzIG9mIHRoZSByZWN0YW5nbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjA8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5hcmN3aWR0aDwvdGQ+CisgICAgPHRkPkhvcmlzb250YWwgZGlhbWV0ZXIgb2YgdGhlIGFyYyBhdCB0aGUgY29ybmVycyBvZiB0aGUgcmVjdGFuZ2xlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg2PlBhcmFtZXRlcnMgb2YgVGV4dDwvaDY+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5zdHJpbmc8L3RkPgorICAgICAgICA8dGQ+VGhlIHRleHQgc3RyaW5nLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+PC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5mb250PC90ZD4KKyAgICAgICAgPHRkPlRoZSBmb250IHRvIHNldCB0aGUgdGV4dCBpbi48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPkFyaWFsPC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5wb2ludDwvdGQ+CisgICAgICAgIDx0ZD5TaXplIG9mIHRoZSBmb250IGluIHBvaW50cy48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjEwPC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5ib2xkPC90ZD4KKyAgICAgICAgPHRkPldoZXRoZXIgdGhlIGZvbnQgaXMgYm9sZC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5jb2xvcjwvdGQ+CisgICAgICAgIDx0ZD5Db2xvciBvZiB0aGUgdGV4dC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmJsYWNrPC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5pdGFsaWM8L3RkPgorICAgICAgICA8dGQ+V2hldGhlciB0aGUgZm9udCBpcyBpdGFsaWMuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorPGg0Pm1hcHBlcjwvaDQ+Cis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlbmFtZSB0cmFuc2Zvcm1hdGlvbnMgYnkgdXNpbmcgYQorbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+IGVsZW1lbnQuIFRoZSBkZWZhdWx0IG1hcHBlciB1c2VkCitieSA8Y29kZT4mbHQ7aW1hZ2UmZ3Q7PC9jb2RlPiBpcyB0aGUgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eQorbWFwcGVyPC9hPi48L3A+CisKKzxwPllvdSBjYW4gYWxzbyB1c2UgYSA8Y29kZT5maWxlbmFtZW1hcHBlcjwvY29kZT4gdHlwZSBpbiBwbGFjZSBvZiB0aGUgPGNvZGU+bWFwcGVyPC9jb2RlPgorZWxlbWVudC48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPkNyZWF0ZSB0aHVtYm5haWxzIG9mIG15IGltYWdlcyBhbmQgbWFrZSBzdXJlIHRoZXkgYWxsIGZpdCB3aXRoaW4gdGhlIDE2MCZ0aW1lczsxNjAgcGl4ZWwgc2l6ZQord2hldGhlciB0aGUgaW1hZ2UgaXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLjwvcD4KKzxwcmU+CismbHQ7aW1hZ2UgZGVzdGRpcj0ic2FtcGxlcy9sb3ciIG92ZXJ3cml0ZT0ieWVzIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9InNhbXBsZXMvZnVsbCImZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouanBnIi8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDtzY2FsZSB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgcHJvcG9ydGlvbnM9ImZpdCIvJmd0OworJmx0Oy9pbWFnZSZndDs8L3ByZT4KKworPHA+Q3JlYXRlIGEgdGh1bWJuYWlsIGZvciBhbGwgUE5HIGZpbGVzIGluIDxzYW1wPnNyYzwvc2FtcD4gb2YgdGhlIHNpemUgb2YgNDAgcGl4ZWxzIGtlZXBpbmcgdGhlCitwcm9wb3J0aW9ucyBhbmQgc3RvcmUgdGhlIDxzYW1wPnNyYzwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtpbWFnZSBzcmNkaXI9InNyYyIgaW5jbHVkZXM9IioucG5nIiZndDsKKyAgICAmbHQ7c2NhbGUgcHJvcG9ydGlvbnM9IndpZHRoIiB3aWR0aD0iNDAiLyZndDsKKyZsdDsvaW1hZ2UmZ3Q7PC9wcmU+CisKKzxwPlNhbWUgYXMgYWJvdmUgYnV0IHN0b3JlIHRoZSByZXN1bHQgaW4gPHNhbXA+ZGVzdDwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtpbWFnZSBzcmNkaXI9InNyYyIgZGVzdGRpcj0iZGVzdCIgaW5jbHVkZXM9IioucG5nIiZndDsKKyAgICAmbHQ7c2NhbGUgcHJvcG9ydGlvbnM9IndpZHRoIiB3aWR0aD0iNDAiLyZndDsKKyZsdDsvaW1hZ2UmZ3Q7PC9wcmU+CisKKzxwPlNhbWUgYXMgYWJvdmUgYnV0IHN0b3JlIHRoZSByZXN1bHQgdG8gZmlsZXMgd2l0aCBvcmlnaW5hbCBuYW1lcyBwcmVmaXhlZAorYnkgPHNhbXA+c2NhbGVkLTwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtpbWFnZSBzcmNkaXI9InNyYyIgZGVzdGRpcj0iZGVzdCIgaW5jbHVkZXM9IioucG5nIiZndDsKKyAgICAmbHQ7c2NhbGUgcHJvcG9ydGlvbnM9IndpZHRoIiB3aWR0aD0iNDAiLyZndDsKKyAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0ic2NhbGVkLSoiLyZndDsKKyZsdDsvaW1hZ2UmZ3Q7PC9wcmU+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9pbXBvcnQuaHRtbCBiL21hbnVhbC9UYXNrcy9pbXBvcnQuaHRtbAppbmRleCA0Y2Y4ZGUwLi43NWYzMTUzIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvaW1wb3J0Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2ltcG9ydC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjcwICsxNSwyMTEgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KICAgPHRpdGxlPkltcG9ydCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgotICA8aDI+PGEgbmFtZT0iaW1wb3J0Ij5JbXBvcnQ8L2E+PC9oMj4KKyAgPGgyIGlkPSJpbXBvcnQiPkltcG9ydDwvaDI+CiAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gIDxwPgotICAgIEltcG9ydHMgYW5vdGhlciBidWlsZCBmaWxlIGludG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KLSAgPC9wPgorICA8cD5JbXBvcnRzIGFub3RoZXIgYnVpbGQgZmlsZSBpbnRvIHRoZSBjdXJyZW50IHByb2plY3QuPC9wPgogCi0gIDxwPgotICAgIE9uIGV4ZWN1dGlvbiBpdCB3aWxsIHNlbGVjdCB0aGUgcHJvcGVyIFByb2plY3RIZWxwZXIgdG8gcGFyc2UgdGhlIGltcG9ydGVkCi0gICAgZmlsZSwgdXNpbmcgdGhlIHNhbWUgYWxnb3JpdGhtIGFzIHRoZSBvbmUgZXhlY3V0ZWQgYXQKLSAgICA8YSBocmVmPSIuLi9wcm9qZWN0aGVscGVyLmh0bWwiPnN0YXJ0dXA8L2E+LiBUaGUgc2VsZWN0ZWQgUHJvamVjdEhlbHBlcgotICAgIGluc3RhbmNlIHdpbGwgdGhlbiBiZSByZXNwb25zaWJsZSB0byBhY3R1YWxseSBwYXJzZSB0aGUgaW1wb3J0ZWQgZmlsZS4KLSAgPC9wPgorICA8cD5PbiBleGVjdXRpb24gaXQgd2lsbCBzZWxlY3QgdGhlIHByb3BlciBQcm9qZWN0SGVscGVyIHRvIHBhcnNlIHRoZSBpbXBvcnRlZCBmaWxlLCB1c2luZyB0aGUgc2FtZQorICAgIGFsZ29yaXRobSBhcyB0aGUgb25lIGV4ZWN1dGVkIGF0IDxhIGhyZWY9Ii4uL3Byb2plY3RoZWxwZXIuaHRtbCI+c3RhcnR1cDwvYT4uIFRoZSBzZWxlY3RlZAorICAgIFByb2plY3RIZWxwZXIgaW5zdGFuY2Ugd2lsbCB0aGVuIGJlIHJlc3BvbnNpYmxlIHRvIGFjdHVhbGx5IHBhcnNlIHRoZSBpbXBvcnRlZCBmaWxlLjwvcD4KIAotICA8cD4KLSAgICA8Yj5Ob3RlPC9iPiBhcyBzZWVuIGFib3ZlLCB0aGlzIHRhc2sgaGVhdmlseSByZWxpZXMgb24gdGhlIFByb2plY3RIZWxwZXIKLSAgICBpbXBsZW1lbnRhdGlvbiBhbmQgZG9lc24ndCByZWFsbHkgcGVyZm9ybSBhbnkgd29yayBvZiBpdHMgb3duLiAgSWYKLSAgICB5b3UgaGF2ZSBjb25maWd1cmVkIEFwYWNoZSBBbnQgdG8gdXNlIGEgUHJvamVjdEhlbHBlciBvdGhlciB0aGFuIEFudCdzCi0gICAgZGVmYXVsdCwgdGhpcyB0YXNrIG1heSBvciBtYXkgbm90IHdvcmsuCi0gIDwvcD4KKyAgPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+IGFzIHNlZW4gYWJvdmUsIHRoaXMgdGFzayBoZWF2aWx5IHJlbGllcyBvbiB0aGUgUHJvamVjdEhlbHBlcgorICAgIGltcGxlbWVudGF0aW9uIGFuZCBkb2Vzbid0IHJlYWxseSBwZXJmb3JtIGFueSB3b3JrIG9mIGl0cyBvd24uICBJZiB5b3UgaGF2ZSBjb25maWd1cmVkIEFwYWNoZQorICAgIEFudCB0byB1c2UgYSBQcm9qZWN0SGVscGVyIG90aGVyIHRoYW4gQW50J3MgZGVmYXVsdCwgdGhpcyB0YXNrIG1heSBvciBtYXkgbm90IHdvcmsuPC9wPgogCi0gIDxwPgotICAgIEluIHRoZSBjb21tb24gdXNlIGNhc2Ugd2hlcmUgb25seSBBbnQncyBkZWZhdWx0IHByb2plY3QgaGVscGVyIGlzCi0gICAgdXNlZCwgaXQgYmFzaWNhbGx5IHdvcmtzIGxpa2UgdGhlIAotICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCN4bWwtZW50aXR5LWluY2x1ZGUiPkVudGl0eQotICAgICAgSW5jbHVkZXMgYXMgZXhwbGFpbmVkIGluIHRoZSBBbnQgRkFRPC9hPiwgYXMgaWYgdGhlIGltcG9ydGVkIGZpbGUgd2FzCi0gICAgY29udGFpbmVkIGluIHRoZSBpbXBvcnRpbmcgZmlsZSwgbWludXMgdGhlIHRvcCA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+Ci0gICAgdGFnLgotICA8L3A+CisgIDxwPkluIHRoZSBjb21tb24gdXNlIGNhc2Ugd2hlcmUgb25seSBBbnQncyBkZWZhdWx0IHByb2plY3QgaGVscGVyIGlzIHVzZWQsIGl0IGJhc2ljYWxseSB3b3JrcyBsaWtlCisgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjeG1sLWVudGl0eS1pbmNsdWRlIiB0YXJnZXQ9Il90b3AiPkVudGl0eSBJbmNsdWRlcworICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgQW50IEZBUTwvYT4sIGFzIGlmIHRoZSBpbXBvcnRlZCBmaWxlIHdhcyBjb250YWluZWQgaW4gdGhlIGltcG9ydGluZyBmaWxlLAorICAgIG1pbnVzIHRoZSB0b3AgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiB0YWcuPC9wPgogCi0gIDxwPgotICAgIFRoZSBpbXBvcnQgdGFzayBtYXkgb25seSBiZSB1c2VkIGFzIGEgdG9wLWxldmVsIHRhc2suIFRoaXMgbWVhbnMgdGhhdAotICAgIGl0IG1heSBub3QgYmUgdXNlZCBpbiBhIHRhcmdldC4KLSAgPC9wPgotICA8cD4KLVRoZXJlIGFyZSB0d28gZnVydGhlciBmdW5jdGlvbmFsIGFzcGVjdHMgdGhhdCBwZXJ0YWluIHRvIHRoaXMgdGFzayBhbmQKLXRoYXQgYXJlIG5vdCBwb3NzaWJsZSB3aXRoIGVudGl0eSBpbmNsdWRlczoKLTx1bD4KLSAgPGxpPnRhcmdldCBvdmVycmlkaW5nPC9saT4KLSAgPGxpPnNwZWNpYWwgcHJvcGVydGllczwvbGk+Ci08L3VsPgotICA8L3A+Ci08aDQ+VGFyZ2V0IG92ZXJyaWRpbmc8L2g0PgorICA8cD5UaGUgPGNvZGU+aW1wb3J0PC9jb2RlPiB0YXNrIG1heSBvbmx5IGJlIHVzZWQgYXMgYSB0b3AtbGV2ZWwgdGFzay4gVGhpcyBtZWFucyB0aGF0IGl0IG1heSBub3QKKyAgICBiZSB1c2VkIGluIGEgdGFyZ2V0LjwvcD4KIAotPHA+SWYgYSB0YXJnZXQgaW4gdGhlIG1haW4gZmlsZSBpcyBhbHNvIHByZXNlbnQgaW4gYXQgbGVhc3Qgb25lIG9mIHRoZQotaW1wb3J0ZWQgZmlsZXMsIHRoZSBvbmUgZnJvbSB0aGUgbWFpbiBmaWxlIHRha2VzIHByZWNlZGVuY2UuPC9wPgorICA8cD5UaGVyZSBhcmUgdHdvIGZ1cnRoZXIgZnVuY3Rpb25hbCBhc3BlY3RzIHRoYXQgcGVydGFpbiB0byB0aGlzIHRhc2sgYW5kIHRoYXQgYXJlIG5vdCBwb3NzaWJsZQorICAgIHdpdGggZW50aXR5IGluY2x1ZGVzOjwvcD4KKyAgPHVsPgorICAgIDxsaT50YXJnZXQgb3ZlcnJpZGluZzwvbGk+CisgICAgPGxpPnNwZWNpYWwgcHJvcGVydGllczwvbGk+CisgIDwvdWw+CisgIDxoND5UYXJnZXQgb3ZlcnJpZGluZzwvaDQ+CiAKLTxwPlNvIGlmIEkgaW1wb3J0IGZvciBleGFtcGxlIGEgPGk+ZG9jc2J1aWxkLnhtbDwvaT4gZmlsZSBuYW1lZCA8Yj5idWlsZGRvY3M8L2I+LAotdGhhdCBjb250YWlucyBhICZxdW90OzxiPmRvY3M8L2I+JnF1b3Q7IHRhcmdldCwgSSBjYW4gcmVkZWZpbmUgaXQgaW4gbXkgbWFpbgotYnVpbGRmaWxlIGFuZCB0aGF0IGlzIHRoZSBvbmUgdGhhdCB3aWxsIGJlIGNhbGxlZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvCi1rZWVwIHRoZSBzYW1lIHRhcmdldCBuYW1lLCBzbyB0aGF0IHRoZSBvdmVycmlkaW5nIHRhcmdldCBpcyBzdGlsbCBjYWxsZWQKLWJ5IGFueSBvdGhlciB0YXJnZXRzLS1pbiBlaXRoZXIgdGhlIG1haW4gb3IgaW1wb3J0ZWQgYnVpbGRmaWxlKHMpLS1mb3Igd2hpY2gKLWl0IGlzIGEgZGVwZW5kZW5jeSwgd2l0aCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4gVGhlIHRhcmdldCBmcm9tIDxpPmRvY3NidWlsZC54bWw8L2k+IGlzCi1tYWRlIGF2YWlsYWJsZSBieSB0aGUgbmFtZSAmcXVvdDs8Yj5idWlsZGRvY3M8L2I+PGI+LmRvY3M8L2I+JnF1b3Q7LgotVGhpcyBlbmFibGVzIHRoZSBuZXcgaW1wbGVtZW50YXRpb24gdG8gY2FsbCB0aGUgb2xkIHRhcmdldCwgdGh1cwotPGk+ZW5oYW5jaW5nPC9pPiBpdCB3aXRoIHRhc2tzIGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgaXQuPC9wPgorICA8cD5JZiBhIHRhcmdldCBpbiB0aGUgbWFpbiBmaWxlIGlzIGFsc28gcHJlc2VudCBpbiBhdCBsZWFzdCBvbmUgb2YgdGhlIGltcG9ydGVkIGZpbGVzLCB0aGUgb25lCisgICAgZnJvbSB0aGUgbWFpbiBmaWxlIHRha2VzIHByZWNlZGVuY2UuPC9wPgogCi08cD5JZiB5b3UgdXNlIHRoZSA8aT5hczwvaT4gYXR0cmlidXRlIG9mIHRoZSB0YXNrLCBpdHMgdmFsdWUgd2lsbCBiZQotICB1c2VkIHRvIHByZWZpeCB0aGUgb3ZlcnJpZGRlbiB0YXJnZXQncyBuYW1lIGluc3RlYWQgb2YgdGhlIG5hbWUKLSAgYXR0cmlidXRlIG9mIHRoZSBwcm9qZWN0IHRhZy48L3A+CisgIDxwPlNvIGlmIEkgaW1wb3J0IGZvciBleGFtcGxlIGEgPHNhbXA+ZG9jc2J1aWxkLnhtbDwvc2FtcD4gZmlsZSBjb250YWluaW5nIGEgcHJvamVjdAorICAgIG5hbWVkIDxxPmJ1aWxkZG9jczwvcT4gdGhhdCBjb250YWlucyBhIDxxPmRvY3M8L3E+IHRhcmdldCwgSSBjYW4gZGVmaW5lIGEgPHE+ZG9jczwvcT4gdGFyZ2V0IGluCisgICAgbXkgbWFpbiBidWlsZGZpbGUgYW5kIHRoYXQgaXMgdGhlIG9uZSB0aGF0IHdpbGwgYmUgY2FsbGVkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8ga2VlcCB0aGUgc2FtZQorICAgIHRhcmdldCBuYW1lLCBzbyB0aGF0IHRoZSBvdmVycmlkaW5nIHRhcmdldCBpcyBzdGlsbCBjYWxsZWQgYnkgYW55IG90aGVyIHRhcmdldHMmbWRhc2g7aW4gZWl0aGVyCisgICAgdGhlIG1haW4gb3IgaW1wb3J0ZWQgYnVpbGRmaWxlKHMpJm1kYXNoO2ZvciB3aGljaCBpdCBpcyBhIGRlcGVuZGVuY3ksIHdpdGggYSBkaWZmZXJlbnQKKyAgICBpbXBsZW1lbnRhdGlvbi4gVGhlIHRhcmdldCBmcm9tIDxzYW1wPmRvY3NidWlsZC54bWw8L3NhbXA+IGlzIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZQorICAgIG5hbWUgPHE+YnVpbGRkb2NzLmRvY3M8L3E+LiBUaGlzIGVuYWJsZXMgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiB0byBjYWxsIHRoZSBvbGQgdGFyZ2V0LAorICAgIHRodXMgPGVtPmVuaGFuY2luZzwvZW0+IGl0IHdpdGggdGFza3MgY2FsbGVkIGJlZm9yZSBvciBhZnRlciBpdC48L3A+CiAKLTxoND5TcGVjaWFsIFByb3BlcnRpZXM8L2g0PgorICA8cD5JZiB5b3UgdXNlIHRoZSA8dmFyPmFzPC92YXI+IGF0dHJpYnV0ZSBvZiB0aGUgdGFzaywgaXRzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBwcmVmaXggdGhlCisgICAgb3ZlcnJpZGRlbiB0YXJnZXQncyBuYW1lIGluc3RlYWQgb2YgdGhlIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+CisgICAgdGFnLjwvcD4KIAotPHA+SW1wb3J0ZWQgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgbWFpbgotYnVpbGRmaWxlLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdW5kZXJzdGFuZCwgYnV0IGl0IG1ha2VzIGl0IGltcG9zc2libGUKLWZvciB0aGVtIHRvIHJlZmVyZW5jZSBmaWxlcyBhbmQgcmVzb3VyY2VzIHJlbGF0aXZlIHRvIHRoZWlyIHBhdGguCi1CZWNhdXNlIG9mIHRoaXMsIGZvciBldmVyeSBpbXBvcnRlZCBmaWxlLCBBbnQgYWRkcyBhIHByb3BlcnR5IHRoYXQKLWNvbnRhaW5zIHRoZSBwYXRoIHRvIHRoZSBpbXBvcnRlZCBidWlsZGZpbGUuIFdpdGggdGhpcyBwYXRoLCB0aGUKLWltcG9ydGVkIGJ1aWxkZmlsZSBjYW4ga2VlcCByZXNvdXJjZXMgYW5kIGJlIGFibGUgdG8gcmVmZXJlbmNlIHRoZW0KLXJlbGF0aXZlIHRvIGl0cyBwb3NpdGlvbi48L3A+CisgIDxoND5TcGVjaWFsIHByb3BlcnRpZXM8L2g0PgogCi08cD5TbyBpZiBJIGltcG9ydCBmb3IgZXhhbXBsZSBhIDxpPmRvY3NidWlsZC54bWw8L2k+IGZpbGUgbmFtZWQgPGI+YnVpbGRkb2NzPC9iPiwKLUkgY2FuIGdldCBpdHMgcGF0aCBhcyA8Yj5hbnQuZmlsZS5idWlsZGRvY3M8L2I+LCBzaW1pbGFybHkgdG8gdGhlIDxiPmFudC5maWxlPC9iPgotcHJvcGVydHkgb2YgdGhlIG1haW4gYnVpbGRmaWxlLjwvcD4KKyAgPHA+SW1wb3J0ZWQgZmlsZXMgYXJlIHRyZWF0ZWQgYXMgdGhleSBhcmUgcHJlc2VudCBpbiB0aGUgbWFpbiBidWlsZGZpbGUuIFRoaXMgbWFrZXMgaXQgZWFzeSB0bworICAgIHVuZGVyc3RhbmQsIGJ1dCBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlIGZvciB0aGVtIHRvIHJlZmVyZW5jZSBmaWxlcyBhbmQgcmVzb3VyY2VzIHJlbGF0aXZlIHRvCisgICAgdGhlaXIgcGF0aC4gIEJlY2F1c2Ugb2YgdGhpcywgZm9yIGV2ZXJ5IGltcG9ydGVkIGZpbGUsIEFudCBhZGRzIGEgcHJvcGVydHkgdGhhdCBjb250YWlucyB0aGUKKyAgICBwYXRoIHRvIHRoZSBpbXBvcnRlZCBidWlsZGZpbGUuIFdpdGggdGhpcyBwYXRoLCB0aGUgaW1wb3J0ZWQgYnVpbGRmaWxlIGNhbiBrZWVwIHJlc291cmNlcyBhbmQgYmUKKyAgICBhYmxlIHRvIHJlZmVyZW5jZSB0aGVtIHJlbGF0aXZlIHRvIGl0cyBwb3NpdGlvbi48L3A+CiAKLTxwPk5vdGUgdGhhdCAmcXVvdDtidWlsZGRvY3MmcXVvdDsgaXMgbm90IHRoZSBmaWxlbmFtZSwgYnV0IHRoZSBuYW1lIGF0dHJpYnV0ZQotcHJlc2VudCBpbiB0aGUgaW1wb3J0ZWQgcHJvamVjdCB0YWcuPC9wPgotICA8cD4KLSAgICBJZiB0aGUgaW1wb3J0ZWQgZmlsZSBkb2VzIG5vdCBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUsIHRoZSBhbnQuZmlsZS5wcm9qZWN0bmFtZQotICAgIHByb3BlcnR5IHdpbGwgbm90IGJlIHNldC4KLSAgPC9wPgorICA8cD5TbyBpZiBJIGltcG9ydCBmb3IgZXhhbXBsZSBhIDxzYW1wPmRvY3NidWlsZC54bWw8L3NhbXA+IGZpbGUgbmFtZWQgPHE+YnVpbGRkb2NzPC9xPiwgSSBjYW4gZ2V0CisgICAgaXRzIHBhdGggYXMgPGNvZGU+YW50LmZpbGUuYnVpbGRkb2NzPC9jb2RlPiwgc2ltaWxhcmx5IHRvIHRoZSA8Y29kZT5hbnQuZmlsZTwvY29kZT4gcHJvcGVydHkgb2YKKyAgICB0aGUgbWFpbiBidWlsZGZpbGUuPC9wPgogCi08cD5TaW5jZSBBbnQgMS44LjAgdGhlIHRhc2sgY2FuIGFsc28gaW1wb3J0IHJlc291cmNlcyBmcm9tIFVSTHMgb3IKLSAgY2xhc3NwYXRoIHJlc291cmNlcyAod2hpY2ggYXJlIFVSTHMsIHJlYWxseSkuICBJZiB5b3UgbmVlZCB0byBrbm93Ci0gIHdoZXRoZXIgdGhlIGN1cnJlbnQgYnVpbGQgZmlsZSdzIHNvdXJjZSBoYXMgYmVlbiBhIGZpbGUgb3IgYW4gVVJMCi0gIHlvdSBjYW4gY29uc3VsdCB0aGUKLSAgcHJvcGVydHkgPGI+YW50LmZpbGUudHlwZS48ZW0+cHJvamVjdG5hbWU8L2VtPjwvYj4gKHVzaW5nIHRoZSBzYW1lCi0gIGV4YW1wbGUgYXMgYWJvdmUgPGI+YW50LmZpbGUudHlwZS5idWlsZGRvY3M8L2I+KSB3aGljaCBlaXRoZXIgaGF2ZQotICB0aGUgdmFsdWUgImZpbGUiIG9yICJ1cmwiLjwvcD4KKyAgPHA+Tm90ZSB0aGF0IDxxPmJ1aWxkZG9jczwvcT4gaXMgbm90IHRoZSBmaWxlbmFtZSwgYnV0IHRoZSA8dmFyPm5hbWU8L3Zhcj4gYXR0cmlidXRlIHByZXNlbnQgaW4KKyAgICB0aGUgaW1wb3J0ZWQgPGNvZGU+cHJvamVjdDwvY29kZT4gdGFnLjwvcD4KIAotPGg0PlJlc29sdmluZyBmaWxlcyBhZ2FpbnN0IHRoZSBpbXBvcnRlZCBmaWxlPC9oND4KKyAgPHA+SWYgdGhlIGltcG9ydGVkIGZpbGUgZG9lcyBub3QgaGF2ZSBhIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUsCisgICAgdGhlIDxjb2RlPmFudC5maWxlLjxpPnByb2plY3RuYW1lPC9pPjwvY29kZT4gcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LjwvcD4KIAotPHA+U3VwcG9zZSB5b3VyIG1haW4gYnVpbGQgZmlsZSBjYWxsZWQgPGNvZGU+aW1wb3J0aW5nLnhtbDwvY29kZT4KLWltcG9ydHMgYSBidWlsZCBmaWxlIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4sIGxvY2F0ZWQgYW55d2hlcmUgb24KLXRoZSBmaWxlIHN5c3RlbSwgYW5kIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4gcmVhZHMgYSBzZXQgb2YKLXByb3BlcnRpZXMgZnJvbSA8Y29kZT5pbXBvcnRlZC5wcm9wZXJ0aWVzPC9jb2RlPjo8L3A+CisgIDxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPiwgdGhlIHRhc2sgY2FuIGFsc28gaW1wb3J0IHJlc291cmNlcyBmcm9tIFVSTHMgb3IgY2xhc3NwYXRoIHJlc291cmNlcworICAgICh3aGljaCBhcmUgVVJMcywgcmVhbGx5KS4gIElmIHlvdSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgY3VycmVudCBidWlsZCBmaWxlJ3Mgc291cmNlIGhhcyBiZWVuCisgICAgYSBmaWxlIG9yIGFuIFVSTCB5b3UgY2FuIGNvbnN1bHQgdGhlIHByb3BlcnR5IDxjb2RlPmFudC5maWxlLnR5cGUuPGk+cHJvamVjdG5hbWU8L2k+PC9jb2RlPgorICAgICh1c2luZyB0aGUgc2FtZSBleGFtcGxlIGFzIGFib3ZlIDxjb2RlPmFudC5maWxlLnR5cGUuYnVpbGRkb2NzPC9jb2RlPikgd2hpY2ggZWl0aGVyIGhhdmUgdGhlCisgICAgdmFsdWUgPHE+ZmlsZTwvcT4gb3IgPHE+dXJsPC9xPi48L3A+CiAKLTxwcmU+Jmx0OyEtLSBpbXBvcnRpbmcueG1sIC0tJmd0OworICA8aDQ+UmVzb2x2aW5nIGZpbGVzIGFnYWluc3QgdGhlIGltcG9ydGVkIGZpbGU8L2g0PgorCisgIDxwPlN1cHBvc2UgeW91ciBtYWluIGJ1aWxkIGZpbGUgY2FsbGVkIDxzYW1wPmltcG9ydGluZy54bWw8L3NhbXA+IGltcG9ydHMgYSBidWlsZAorICAgIGZpbGUgPHNhbXA+aW1wb3J0ZWQueG1sPC9zYW1wPiwgbG9jYXRlZCBhbnl3aGVyZSBvbiB0aGUgZmlsZSBzeXN0ZW0sCisgICAgYW5kIDxzYW1wPmltcG9ydGVkLnhtbDwvc2FtcD4gcmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcworICAgIGZyb20gPHNhbXA+aW1wb3J0ZWQucHJvcGVydGllczwvc2FtcD46PC9wPgorCisgIDxwcmU+CismbHQ7IS0tIGltcG9ydGluZy54bWwgLS0mZ3Q7CiAmbHQ7cHJvamVjdCBuYW1lPSJpbXBvcnRpbmciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Ii4uLiImZ3Q7Ci0mbmJzcDsgJmx0O2ltcG9ydCBmaWxlPSIke3BhdGhfdG9faW1wb3J0ZWR9L2ltcG9ydGVkLnhtbCIvJmd0OworICAmbHQ7aW1wb3J0IGZpbGU9IiR7cGF0aF90b19pbXBvcnRlZH0vaW1wb3J0ZWQueG1sIi8mZ3Q7CiAmbHQ7L3Byb2plY3QmZ3Q7CiAKICZsdDshLS0gaW1wb3J0ZWQueG1sIC0tJmd0OwogJmx0O3Byb2plY3QgbmFtZT0iaW1wb3J0ZWQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Ii4uLiImZ3Q7Ci0mbmJzcDsgJmx0O3Byb3BlcnR5IGZpbGU9ImltcG9ydGVkLnByb3BlcnRpZXMiLyZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorICAmbHQ7cHJvcGVydHkgZmlsZT0iaW1wb3J0ZWQucHJvcGVydGllcyIvJmd0OworJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5UaGlzIHNuaXBwZXQgaG93ZXZlciB3aWxsIHJlc29sdmUgPGNvZGU+aW1wb3J0ZWQucHJvcGVydGllczwvY29kZT4KLWFnYWluc3QgdGhlIGJhc2VkaXIgb2YgPGNvZGU+aW1wb3J0aW5nLnhtbDwvY29kZT4sIGJlY2F1c2UgdGhlIGJhc2VkaXIKLW9mIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4gaXMgaWdub3JlZCBieSBBbnQuIFRoZSByaWdodCB3YXkgdG8gdXNlCi08Y29kZT5pbXBvcnRlZC5wcm9wZXJ0aWVzPC9jb2RlPiBpczo8L3A+CisgIDxwPlRoaXMgc25pcHBldCBob3dldmVyIHdpbGwgcmVzb2x2ZSA8c2FtcD5pbXBvcnRlZC5wcm9wZXJ0aWVzPC9zYW1wPiBhZ2FpbnN0CisgIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gb2YgPHNhbXA+aW1wb3J0aW5nLnhtbDwvc2FtcD4sIGJlY2F1c2UgdGhlIDx2YXI+YmFzZWRpcjwvdmFyPgorICBvZiA8c2FtcD5pbXBvcnRlZC54bWw8L3NhbXA+IGlzIGlnbm9yZWQgYnkgQW50LiBUaGUgcmlnaHQgd2F5IHRvCisgIHVzZSA8c2FtcD5pbXBvcnRlZC5wcm9wZXJ0aWVzPC9zYW1wPiBpczo8L3A+CiAKLTxwcmU+CisgIDxwcmU+CiAmbHQ7IS0tIGltcG9ydGVkLnhtbCAtLSZndDsKICZsdDtwcm9qZWN0IG5hbWU9ImltcG9ydGVkIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSIuLi4iJmd0OwotJm5ic3A7ICZsdDtkaXJuYW1lIHByb3BlcnR5PSJpbXBvcnRlZC5iYXNlZGlyIiBmaWxlPSIke2FudC5maWxlLmltcG9ydGVkfSIvJmd0OwotJm5ic3A7ICZsdDtwcm9wZXJ0eSBmaWxlPSIke2ltcG9ydGVkLmJhc2VkaXJ9L2ltcG9ydGVkLnByb3BlcnRpZXMiLyZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0iaW1wb3J0ZWQuYmFzZWRpciIgZmlsZT0iJHthbnQuZmlsZS5pbXBvcnRlZH0iLyZndDsKKyAgJmx0O3Byb3BlcnR5IGZpbGU9IiR7aW1wb3J0ZWQuYmFzZWRpcn0vaW1wb3J0ZWQucHJvcGVydGllcyIvJmd0OworJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5BcyBleHBsYWluZWQgYWJvdmUgPGNvZGU+JHthbnQuZmlsZS5pbXBvcnRlZH08L2NvZGU+IHN0b3JlcyB0aGUKLXBhdGggb2YgdGhlIGJ1aWxkIHNjcmlwdCwgdGhhdCBkZWZpbmVzIHRoZSBwcm9qZWN0IGNhbGxlZAotPGNvZGU+aW1wb3J0ZWQ8L2NvZGU+LCAoaW4gc2hvcnQgaXQgc3RvcmVzIHRoZSBwYXRoIHRvCi08Y29kZT5pbXBvcnRlZC54bWw8L2NvZGU+KSBhbmQgPGEKLWhyZWY9ImRpcm5hbWUuaHRtbCI+PGNvZGU+Jmx0O2Rpcm5hbWUmZ3Q7PC9jb2RlPjwvYT4gdGFrZXMgaXRzCi1kaXJlY3RvcnkuIFRoaXMgdGVjaG5pcXVlIGFsc28gYWxsb3dzIDxjb2RlPmltcG9ydGVkLnhtbDwvY29kZT4gdG8gYmUKLXVzZWQgYXMgYSBzdGFuZGFsb25lIGZpbGUgKHdpdGhvdXQgYmVpbmcgaW1wb3J0ZWQgaW4gb3RoZXIKLXByb2plY3QpLjwvcD4KKyAgPHA+QXMgZXhwbGFpbmVkIGFib3ZlIDxjb2RlPmFudC5maWxlLmltcG9ydGVkPC9jb2RlPiBzdG9yZXMgdGhlIHBhdGggb2YgdGhlIGJ1aWxkIHNjcmlwdCwgdGhhdAorICAgIGRlZmluZXMgdGhlIHByb2plY3QgY2FsbGVkIDxxPmltcG9ydGVkPC9xPiwgKGluIHNob3J0IGl0IHN0b3JlcyB0aGUgcGF0aAorICAgIHRvIDxzYW1wPmltcG9ydGVkLnhtbDwvc2FtcD4pIGFuZCA8YSBocmVmPSJkaXJuYW1lLmh0bWwiPjxjb2RlPiZsdDtkaXJuYW1lJmd0OzwvY29kZT48L2E+IHRha2VzCisgICAgaXRzIGRpcmVjdG9yeS4gVGhpcyB0ZWNobmlxdWUgYWxzbyBhbGxvd3MgPHNhbXA+aW1wb3J0ZWQueG1sPC9zYW1wPiB0byBiZSB1c2VkIGFzIGEgc3RhbmRhbG9uZQorICAgIGZpbGUgKHdpdGhvdXQgYmVpbmcgaW1wb3J0ZWQgaW4gb3RoZXIgcHJvamVjdCkuPC9wPgogCi08cD5UaGUgYWJvdmUgZGVzY3JpcHRpb24gb25seSB3b3JrcyBmb3IgaW1wb3J0ZWQgZmlsZXMgdGhhdCBhY3R1YWxseQotICBhcmUgaW1wb3J0ZWQgZnJvbSBmaWxlcyBhbmQgbm90IGZyb20gVVJMcy4gIEZvciBmaWxlcyBpbXBvcnRlZCBmcm9tCi0gIFVSTHMgdXNpbmcgcmVzb3VyY2VzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnRlZCBmaWxlIHJlcXVpcmVzIHlvdSB0bwotICB1c2UgdGFza3MgdGhhdCBjYW4gd29yayBvbiBub24tZmlsZSByZXNvdXJjZXMgaW4gdGhlIGZpcnN0IHBsYWNlLgotICBUbyBjcmVhdGUgYSByZWxhdGl2ZSByZXNvdXJjZSB5b3UnZCB1c2Ugc29tZXRoaW5nIGxpa2U6PC9wPgorICA8cD5UaGUgYWJvdmUgZGVzY3JpcHRpb24gb25seSB3b3JrcyBmb3IgaW1wb3J0ZWQgZmlsZXMgdGhhdCBhY3R1YWxseSBhcmUgaW1wb3J0ZWQgZnJvbSBmaWxlcyBhbmQKKyAgICBub3QgZnJvbSBVUkxzLiAgRm9yIGZpbGVzIGltcG9ydGVkIGZyb20gVVJMcyB1c2luZyByZXNvdXJjZXMgcmVsYXRpdmUgdG8gdGhlIGltcG9ydGVkIGZpbGUKKyAgICByZXF1aXJlcyB5b3UgdG8gdXNlIHRhc2tzIHRoYXQgY2FuIHdvcmsgb24gbm9uLWZpbGUgcmVzb3VyY2VzIGluIHRoZSBmaXJzdCBwbGFjZS4gIFRvIGNyZWF0ZSBhCisgICAgcmVsYXRpdmUgcmVzb3VyY2UgeW91J2QgdXNlIHNvbWV0aGluZyBsaWtlOjwvcD4KIAotPHByZT4KLSAgJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OwotICAgICZsdDt1cmwgYmFzZVVybD0iJHthbnQuZmlsZS5pbXBvcnRlZH0iCi0gICAgICAgICByZWxhdGl2ZVBhdGg9ImltcG9ydGVkLnByb3BlcnRpZXMiLyZndDsKLSAgJmx0Oy9sb2FkcHJvcGVydGllcyZndDsKLTwvcHJlPgorICA8cHJlPgorJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OworICAmbHQ7dXJsIGJhc2VVcmw9IiR7YW50LmZpbGUuaW1wb3J0ZWR9IgorICAgICAgIHJlbGF0aXZlUGF0aD0iaW1wb3J0ZWQucHJvcGVydGllcyIvJmd0OworJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0Ym9keT4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIGZpbGUKLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBUaGUgZmlsZSB0byBpbXBvcnQuIElmIHRoaXMgaXMgYSByZWxhdGl2ZSBmaWxlIG5hbWUsIHRoZSBmaWxlIG5hbWUgd2lsbCBiZSByZXNvbHZlZAotICAgICAgICByZWxhdGl2ZSB0byB0aGUgPGk+aW1wb3J0aW5nPC9pPiBmaWxlLiA8Yj5Ob3RlPC9iPiwgdGhpcyBpcyB1bmxpa2UgbW9zdCBvdGhlcgotICAgICAgICBhbnQgZmlsZSBhdHRyaWJ1dGVzLCB3aGVyZSByZWxhdGl2ZSBmaWxlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gJHtiYXNlZGlyfS4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcyBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uPC90ZD4KKyAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgIDx0ZD5UaGUgZmlsZSB0byBpbXBvcnQuIElmIHRoaXMgaXMgYSByZWxhdGl2ZSBmaWxlIG5hbWUsIHRoZSBmaWxlIG5hbWUgd2lsbCBiZSByZXNvbHZlZAorICAgICAgICByZWxhdGl2ZSB0byB0aGUgPGVtPmltcG9ydGluZzwvZW0+IGZpbGUuIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogdGhpcyBpcyB1bmxpa2UgbW9zdCBvdGhlcgorICAgICAgICBBbnQgZmlsZSBhdHRyaWJ1dGVzLCB3aGVyZSByZWxhdGl2ZSBmaWxlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gPHZhcj5iYXNlZGlyPC92YXI+LjwvdGQ+CisgICAgICA8dGQ+WWVzIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb248L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgb3B0aW9uYWwKLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBJZiB0cnVlLCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsCi0gICAgICAgIGRlZmF1bHQgaXMgZmFsc2UuCi0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8dGQ+b3B0aW9uYWw8L3RkPgorICAgICAgPHRkPklmIDxxPnRydWU8L3E+LCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgYXMKLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBTcGVjaWZpZXMgdGhlIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIHRhcmdldCBuYW1lcy4gIElmCi0gICAgICAgIG9taXR0ZWQsIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgcHJvamVjdCB0YWcgb2YgdGhlCi0gICAgICAgIGltcG9ydGVkIGZpbGUgd2lsbCBiZSB1c2VkLgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPHRkPmFzPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIHByZWZpeCBwcmVwZW5kZWQgdG8gdGhlIHRhcmdldCBuYW1lcy48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8dmFyPm5hbWU8L3Zhcj4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPiB0YWcgb2YgdGhlIGltcG9ydGVkCisgICAgICAgIGZpbGU8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgcHJlZml4U2VwYXJhdG9yCi0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgU3BlY2lmaWVzIHRoZSBzZXBhcmF0b3IgdG8gYmUgdXNlZCBiZXR3ZWVuIHRoZSBwcmVmaXggYW5kIHRoZQotICAgICAgICB0YXJnZXQgbmFtZS4gIERlZmF1bHRzIHRvICIuIi4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDx0ZD5wcmVmaXhTZXBhcmF0b3I8L3RkPgorICAgICAgPHRkPlNwZWNpZmllcyB0aGUgc2VwYXJhdG9yIHRvIGJlIHVzZWQgYmV0d2VlbiB0aGUgcHJlZml4IGFuZCB0aGUgdGFyZ2V0IG5hbWUuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+LjwvcT48L3RkPgogICAgIDwvdHI+CiAgIDwvdGJvZHk+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHJlc291cmNlCi1jb2xsZWN0aW9uPC9oND4KLQotPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZXMgd2lsbCBiZSBpbXBvcnRlZC4gIDxlbT5TaW5jZSBBbnQKLSAgICAxLjguMDwvZW0+PC9wPgorPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC9wPgorPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZXMgd2lsbCBiZSBpbXBvcnRlZC48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiZuYnNwOyAmbHQ7aW1wb3J0IGZpbGU9JnF1b3Q7Li4vY29tbW9uLXRhcmdldHMueG1sJnF1b3Q7LyZndDsKLTwvcHJlPgorPHByZT4mbHQ7aW1wb3J0IGZpbGU9JnF1b3Q7Li4vY29tbW9uLXRhcmdldHMueG1sJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+SW1wb3J0cyB0YXJnZXRzIGZyb20gdGhlIGNvbW1vbi10YXJnZXRzLnhtbCBmaWxlIHRoYXQgaXMgaW4gYSBwYXJlbnQKLWRpcmVjdG9yeS48L3A+Cis8cD5JbXBvcnRzIHRhcmdldHMgZnJvbSB0aGUgPHNhbXA+Y29tbW9uLXRhcmdldHMueG1sPC9zYW1wPiBmaWxlIHRoYXQgaXMgaW4gYSBwYXJlbnQgZGlyZWN0b3J5LjwvcD4KIAotPHByZT4mbmJzcDsgJmx0O2ltcG9ydCBmaWxlPSZxdW90OyR7ZGVwbG95LXBsYXRmb3JtfS54bWwmcXVvdDsvJmd0OwotPC9wcmU+Cis8cHJlPiZsdDtpbXBvcnQgZmlsZT0mcXVvdDske2RlcGxveS1wbGF0Zm9ybX0ueG1sJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+SW1wb3J0cyB0aGUgcHJvamVjdCBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eSBkZXBsb3ktcGxhdGZvcm08L3A+Cis8cD5JbXBvcnRzIHRoZSBwcm9qZWN0IGRlZmluZWQgYnkgdGhlIHByb3BlcnR5IDxjb2RlPmRlcGxveS1wbGF0Zm9ybTwvY29kZT48L3A+CiAKIDxwcmU+Ci0gICZsdDtpbXBvcnQmZ3Q7Ci0gICAgJmx0O2phdmFyZXNvdXJjZSBuYW1lPSJjb21tb24vdGFyZ2V0cy54bWwiJmd0OwotICAgICAgJmx0O2NsYXNzcGF0aCBsb2NhdGlvbj0iY29tbW9uLmphciIvJmd0OwotICAgICZsdDsvamF2YXJlc291cmNlJmd0OwotICAmbHQ7L2ltcG9ydCZndDsKLTwvcHJlPgorJmx0O2ltcG9ydCZndDsKKyAgJmx0O2phdmFyZXNvdXJjZSBuYW1lPSJjb21tb24vdGFyZ2V0cy54bWwiJmd0OworICAgICZsdDtjbGFzc3BhdGggbG9jYXRpb249ImNvbW1vbi5qYXIiLyZndDsKKyAgJmx0Oy9qYXZhcmVzb3VyY2UmZ3Q7CismbHQ7L2ltcG9ydCZndDs8L3ByZT4KIAotPHA+SW1wb3J0cyB0YXJnZXRzIGZyb20gdGhlIHRhcmdldHMueG1sIGZpbGUgdGhhdCBpcyBpbnNpZGUgdGhlCi0gIGRpcmVjdG9yeSBjb21tb24gaW5zaWRlIHRoZSBqYXIgZmlsZSBjb21tb24uamFyLjwvcD4KKzxwPkltcG9ydHMgdGFyZ2V0cyBmcm9tIHRoZSA8c2FtcD50YXJnZXRzLnhtbDwvc2FtcD4gZmlsZSB0aGF0IGlzIGluc2lkZSB0aGUKK2RpcmVjdG9yeSA8c2FtcD5jb21tb248L3NhbXA+IGluc2lkZSB0aGUgamFyIGZpbGUgPHNhbXA+Y29tbW9uLmphcjwvc2FtcD4uPC9wPgogCi08aDM+SG93IGlzICZsdDtpbXBvcnQmZ3Q7IGRpZmZlcmVudAotICBmcm9tIDxhIGhyZWY9ImluY2x1ZGUuaHRtbCI+Jmx0O2luY2x1ZGUmZ3Q7PC9hPj88L2gzPgorPGgzPkhvdyBpcyAmbHQ7aW1wb3J0Jmd0OyBkaWZmZXJlbnQgZnJvbSA8YSBocmVmPSJpbmNsdWRlLmh0bWwiPiZsdDtpbmNsdWRlJmd0OzwvYT4/PC9oMz4KIAotPHA+VGhlIHNob3J0IHZlcnNpb246IFVzZSBpbXBvcnQgaWYgeW91IGludGVuZCB0byBvdmVycmlkZSBhIHRhcmdldCwKLSAgb3RoZXJ3aXNlIHVzZSBpbmNsdWRlLjwvcD4KKzxwPlRoZSBzaG9ydCB2ZXJzaW9uOiBVc2UgPGNvZGU+aW1wb3J0PC9jb2RlPiBpZiB5b3UgaW50ZW5kIHRvIG92ZXJyaWRlIGEgdGFyZ2V0LCBvdGhlcndpc2UKK3VzZSA8Y29kZT5pbmNsdWRlPC9jb2RlPi48L3A+CiAKLTxwPldoZW4gdXNpbmcgaW1wb3J0IHRoZSBpbXBvcnRlZCB0YXJnZXRzIGFyZSBhdmFpbGFibGUgYnkgdXAgdG8gdHdvCi0gIG5hbWVzLiAgVGhlaXIgIm5vcm1hbCIgbmFtZSB3aXRob3V0IGFueSBwcmVmaXggYW5kIHBvdGVudGlhbGx5IHdpdGgKLSAgYSBwcmVmaXhlZCBuYW1lICh0aGUgdmFsdWUgb2YgdGhlIGFzIGF0dHJpYnV0ZSBvciB0aGUgaW1wb3J0ZWQKLSAgcHJvamVjdCdzIG5hbWUgYXR0cmlidXRlLCBpZiBhbnkpLjwvcD4KKzxwPldoZW4gPGNvZGU+aW1wb3J0PC9jb2RlPiBpcyB1c2VkLCB0aGUgaW1wb3J0ZWQgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlIGJ5IHVwIHRvIHR3byBuYW1lczogdGhlaXIKKyJub3JtYWwiIG5hbWUgd2l0aG91dCBhbnkgcHJlZml4IGFuZCBwb3RlbnRpYWxseSB3aXRoIGEgcHJlZml4ZWQgbmFtZSAodGhlIHZhbHVlIG9mCit0aGUgPHZhcj5hczwvdmFyPiBhdHRyaWJ1dGUgb3IgdGhlIGltcG9ydGVkIHByb2plY3QncyA8dmFyPm5hbWU8L3Zhcj4gYXR0cmlidXRlLCBpZiBhbnkpLjwvcD4KIAotPHA+V2hlbiB1c2luZyBpbmNsdWRlIHRoZSBpbmNsdWRlZCB0YXJnZXRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUKLSAgcHJlZml4ZWQgZm9ybS48L3A+Cis8cD5XaGVuIDxjb2RlPmluY2x1ZGU8L2NvZGU+IGlzIHVzZWQsIHRoZSBpbmNsdWRlZCB0YXJnZXRzIGFyZSBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgcHJlZml4ZWQgZm9ybS48L3A+CiAKLTxwPldoZW4gdXNpbmcgaW1wb3J0LCB0aGUgaW1wb3J0ZWQgdGFyZ2V0J3MgZGVwZW5kcyBhdHRyaWJ1dGUKLSAgcmVtYWlucyB1bmNoYW5nZWQsIGkuZS4gaXQgdXNlcyAibm9ybWFsIiBuYW1lcyBhbmQgYWxsb3dzIHlvdSB0bwotICBvdmVycmlkZSB0YXJnZXRzIGluIHRoZSBkZXBlbmRlbmN5IGxpc3QuPC9wPgorPHA+V2hlbiA8Y29kZT5pbXBvcnQ8L2NvZGU+IGlzIHVzZWQsIHRoZSBpbXBvcnRlZCB0YXJnZXQncyA8dmFyPmRlcGVuZHM8L3Zhcj4gYXR0cmlidXRlIHJlbWFpbnMKK3VuY2hhbmdlZCwgaS5lLiBpdCB1c2VzICJub3JtYWwiIG5hbWVzIGFuZCBhbGxvd3MgeW91IHRvIG92ZXJyaWRlIHRhcmdldHMgaW4gdGhlIGRlcGVuZGVuY3kKK2xpc3QuPC9wPgogCi08cD5XaGVuIHVzaW5nIGluY2x1ZGUsIHRoZSBpbmNsdWRlZCB0YXJnZXRzIGNhbm5vdCBiZSBvdmVycmlkZGVuIGFuZAotICB0aGVpciBkZXBlbmRzIGF0dHJpYnV0ZXMgYXJlIHJld3JpdHRlbiBzbyB0aGF0IHByZWZpeGVkIG5hbWVzIGFyZQotICB1c2VkLiAgVGhpcyBhbGxvd3Mgd3JpdGVycyBvZiB0aGUgaW5jbHVkZWQgZmlsZSB0byBjb250cm9sIHdoaWNoCi0gIHRhcmdldCBpcyBpbnZva2VkIGFzIHBhcnQgb2YgdGhlIGRlcGVuZGVuY2llcy48L3A+Cis8cD5XaGVuIDxjb2RlPmluY2x1ZGU8L2NvZGU+IGlzIHVzZWQsIHRoZSBpbmNsdWRlZCB0YXJnZXRzIGNhbm5vdCBiZSBvdmVycmlkZGVuIGFuZAordGhlaXIgPHZhcj5kZXBlbmRzPC92YXI+IGF0dHJpYnV0ZXMgYXJlIHJld3JpdHRlbiBzbyB0aGF0IHByZWZpeGVkIG5hbWVzIGFyZSB1c2VkLiAgVGhpcyBhbGxvd3MKK3dyaXRlcnMgb2YgdGhlIGluY2x1ZGVkIGZpbGUgdG8gY29udHJvbCB3aGljaCB0YXJnZXQgaXMgaW52b2tlZCBhcyBwYXJ0IG9mIHRoZSBkZXBlbmRlbmNpZXMuPC9wPgogCi08cD5JdCBpcyBwb3NzaWJsZSB0byBpbmNsdWRlIHRoZSBzYW1lIGZpbGUgbW9yZSB0aGFuIG9uY2UgYnkgdXNpbmcKLSAgZGlmZmVyZW50IHByZWZpeGVzLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wb3J0IHRoZSBzYW1lIGZpbGUgbW9yZQotICB0aGFuIG9uY2UuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gPGNvZGU+aW5jbHVkZTwvY29kZT4gdGhlIHNhbWUgZmlsZSBtb3JlIHRoYW4gb25jZSBieSB1c2luZyBkaWZmZXJlbnQgcHJlZml4ZXM7CitpdCBpcyBub3QgcG9zc2libGUgdG8gPGNvZGU+aW1wb3J0PC9jb2RlPiB0aGUgc2FtZSBmaWxlIG1vcmUgdGhhbiBvbmNlLjwvcD4KIAogPGg0PkV4YW1wbGVzPC9oND4KIAotPHA+PGk+bmVzdGVkLnhtbDwvaT4gc2hhbGwgYmU6PC9wPgorPHA+PHNhbXA+bmVzdGVkLnhtbDwvc2FtcD4gc2hhbGwgYmU6PC9wPgogCiA8cHJlPgogJmx0O3Byb2plY3QmZ3Q7CkBAIC0yODgsMTAgKzIzMCw5IEBACiAgICZsdDt0YXJnZXQgbmFtZT0iZWNobyIgZGVwZW5kcz0ic2V0VXAiJmd0OwogICAgICZsdDtlY2hvJmd0O3Byb3AgaGFzIHRoZSB2YWx1ZSAke3Byb3B9Jmx0Oy9lY2hvJmd0OwogICAmbHQ7L3RhcmdldCZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5XaGVuIHVzaW5nIGltcG9ydCBsaWtlIGluPC9wPgorPHA+V2hlbiB1c2luZyA8Y29kZT5pbXBvcnQ8L2NvZGU+IGxpa2UgaW48L3A+CiAKIDxwcmU+CiAmbHQ7cHJvamVjdCBkZWZhdWx0PSJ0ZXN0IiZndDsKQEAgLTMwMiwxMiArMjQzLDExIEBACiAgICZsdDtpbXBvcnQgZmlsZT0ibmVzdGVkLnhtbCIgYXM9Im5lc3RlZCIvJmd0OwogCiAgICZsdDt0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0ibmVzdGVkLmVjaG8iLyZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5SdW5uaW5nIHRoZSBidWlsZCBmaWxlIHdpbGwgZW1pdDoKKzxwPlJ1bm5pbmcgdGhlIGJ1aWxkIGZpbGUgd2lsbCBlbWl0OjwvcD4KIAotPHByZT4KKzxwcmUgY2xhc3M9Im91dHB1dCI+CiBzZXRVcDoKIAogbmVzdGVkLmVjaG86CkBAIC0zMTcsNyArMjU3LDcgQEAKIAogPC9wcmU+CiAKLTxwPldoZW4gdXNpbmcgaW5jbHVkZSBsaWtlIGluPC9wPgorPHA+V2hlbiB1c2luZyA8Y29kZT5pbmNsdWRlPC9jb2RlPiBsaWtlIGluPC9wPgogCiA8cHJlPgogJmx0O3Byb2plY3QgZGVmYXVsdD0idGVzdCImZ3Q7CkBAIC0zMjgsMTIgKzI2OCwxMSBAQAogICAmbHQ7aW5jbHVkZSBmaWxlPSJuZXN0ZWQueG1sIiBhcz0ibmVzdGVkIi8mZ3Q7CiAKICAgJmx0O3RhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJuZXN0ZWQuZWNobyIvJmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLTxwPlJ1bm5pbmcgdGhlIHRhcmdldCBidWlsZCBmaWxlIHdpbGwgZW1pdDoKKzxwPlJ1bm5pbmcgdGhlIHRhcmdldCBidWlsZCBmaWxlIHdpbGwgZW1pdDo8L3A+CiAKLTxwcmU+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgogbmVzdGVkLnNldFVwOgogCiBuZXN0ZWQuZWNobzoKQEAgLTM0Myw3ICsyODIsNyBAQAogCiA8L3ByZT4KIAotPHA+YW5kIHRoZXJlIHdvbid0IGJlIGFueSB0YXJnZXQgbmFtZWQgImVjaG8iIG9uIHRoZSBpbmNsdWRpbmcgYnVpbGQgZmlsZS48L3A+Cis8cD5hbmQgdGhlcmUgd29uJ3QgYmUgYW55IHRhcmdldCBuYW1lZCA8cT5lY2hvPC9xPiBvbiB0aGUgaW5jbHVkaW5nIGJ1aWxkIGZpbGUuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvaW5jbHVkZS5odG1sIGIvbWFudWFsL1Rhc2tzL2luY2x1ZGUuaHRtbAppbmRleCBlMjEwOTIzLi44MTRiZTYxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvaW5jbHVkZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9pbmNsdWRlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyNjUgKzE1LDIwNiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogICA8dGl0bGU+SW5jbHVkZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgotICA8aDI+PGEgbmFtZT0iaW5jbHVkZSI+SW5jbHVkZTwvYT48L2gyPgorICA8aDIgaWQ9ImluY2x1ZGUiPkluY2x1ZGU8L2gyPgorICA8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjguMDwvZW0+PC9wPgogICA8aDM+RGVzY3JpcHRpb248L2gzPgotICA8cD4KLSAgICBJbmNsdWRlIGFub3RoZXIgYnVpbGQgZmlsZSBpbnRvIHRoZSBjdXJyZW50IHByb2plY3QuCi0gIDwvcD4KKyAgPHA+SW5jbHVkZSBhbm90aGVyIGJ1aWxkIGZpbGUgaW50byB0aGUgY3VycmVudCBwcm9qZWN0LjwvcD4KIAotICA8cD48ZW0+c2luY2UgQXBhY2hlIEFudCAxLjguMDwvZW0+PC9wPgorICA8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz4gdGhpcyB0YXNrIGhlYXZpbHkgcmVsaWVzIG9uIHRoZSBQcm9qZWN0SGVscGVyIGltcGxlbWVudGF0aW9uIGFuZCBkb2Vzbid0CisgICAgcmVhbGx5IHBlcmZvcm0gYW55IHdvcmsgb2YgaXRzIG93bi4gIElmIHlvdSBoYXZlIGNvbmZpZ3VyZWQgQW50IHRvIHVzZSBhIFByb2plY3RIZWxwZXIgb3RoZXIKKyAgICB0aGFuIEFudCdzIGRlZmF1bHQsIHRoaXMgdGFzayBtYXkgb3IgbWF5IG5vdCB3b3JrLjwvcD4KIAotICA8cD4KLSAgICA8Yj5Ob3RlPC9iPiB0aGlzIHRhc2sgaGVhdmlseSByZWxpZXMgb24gdGhlIFByb2plY3RIZWxwZXIKLSAgICBpbXBsZW1lbnRhdGlvbiBhbmQgZG9lc24ndCByZWFsbHkgcGVyZm9ybSBhbnkgd29yayBvZiBpdHMgb3duLiAgSWYKLSAgICB5b3UgaGF2ZSBjb25maWd1cmVkIEFudCB0byB1c2UgYSBQcm9qZWN0SGVscGVyIG90aGVyIHRoYW4gQW50J3MKLSAgICBkZWZhdWx0LCB0aGlzIHRhc2sgbWF5IG9yIG1heSBub3Qgd29yay4KLSAgPC9wPgorICA8cD5PbiBleGVjdXRpb24gaXQgd2lsbCByZWFkIGFub3RoZXIgQW50IGZpbGUgaW50byB0aGUgc2FtZSBwcm9qZWN0IHJld3JpdGluZyB0aGUgaW5jbHVkZWQKKyAgICB0YXJnZXQgPHZhcj5uYW1lPC92YXI+cyBhbmQgPHZhcj5kZXBlbmRzPC92YXI+IGxpc3RzLiAgVGhpcyBpcyBkaWZmZXJlbnQKKyAgICBmcm9tIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjeG1sLWVudGl0eS1pbmNsdWRlIiB0YXJnZXQ9Il90b3AiPkVudGl0eSBJbmNsdWRlcworICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgQW50IEZBUTwvYT4gaW5zb2ZhciBhcyB0aGUgdGFyZ2V0IG5hbWVzIGdldCBwcmVmaXhlZCBieSB0aGUgaW5jbHVkZWQKKyAgICBwcm9qZWN0J3MgPHZhcj5uYW1lPC92YXI+IG9yIDx2YXI+YXM8L3Zhcj4gYXR0cmlidXRlIGFuZCBkbyBub3QgYXBwZWFyIGFzIGlmIHRoZSBmaWxlIHdhcworICAgIGNvbnRhaW5lZCBpbiB0aGUgaW5jbHVkaW5nIGZpbGUuPC9wPgogCi0gIDxwPgotICAgIE9uIGV4ZWN1dGlvbiBpdCB3aWxsIHJlYWQgYW5vdGhlciBBbnQgZmlsZSBpbnRvIHRoZSBzYW1lIFByb2plY3QKLSAgICByZXdyaXRpbmcgdGhlIGluY2x1ZGVkIHRhcmdldCBuYW1lcyBhbmQgZGVwZW5kcyBsaXN0cy4gIFRoaXMgaXMKLSAgICBkaWZmZXJlbnQKLSAgICBmcm9tIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCN4bWwtZW50aXR5LWluY2x1ZGUiPkVudGl0eQotICAgIEluY2x1ZGVzIGFzIGV4cGxhaW5lZCBpbiB0aGUgQW50IEZBUTwvYT4gaW5zb2ZhciBhcyB0aGUgdGFyZ2V0Ci0gICAgbmFtZXMgZ2V0IHByZWZpeGVkIGJ5IHRoZSBpbmNsdWRlZCBwcm9qZWN0J3MgbmFtZSBvciB0aGUgYXMKLSAgICBhdHRyaWJ1dGUgYW5kIGRvIG5vdCBhcHBlYXIgYXMgaWYgdGhlIGZpbGUgd2FzIGNvbnRhaW5lZCBpbiB0aGUKLSAgICBpbmNsdWRpbmcgZmlsZS4KLSAgPC9wPgotICA8cD4KLSAgICBUaGUgaW5jbHVkZSB0YXNrIG1heSBvbmx5IGJlIHVzZWQgYXMgYSB0b3AtbGV2ZWwgdGFzay4gVGhpcyBtZWFucyB0aGF0Ci0gICAgaXQgbWF5IG5vdCBiZSB1c2VkIGluIGEgdGFyZ2V0LgotICA8L3A+Ci0gIDxwPgotVGhlcmUgYXJlIHR3byBmdXJ0aGVyIGZ1bmN0aW9uYWwgYXNwZWN0cyB0aGF0IHBlcnRhaW4gdG8gdGhpcyB0YXNrIGFuZAotdGhhdCBhcmUgbm90IHBvc3NpYmxlIHdpdGggZW50aXR5IGluY2x1ZGVzOgotPHVsPgotICA8bGk+dGFyZ2V0IHJld3JpdGluZzwvbGk+Ci0gIDxsaT5zcGVjaWFsIHByb3BlcnRpZXM8L2xpPgotPC91bD4KLSAgPC9wPgotPGg0PlRhcmdldCByZXdyaXRpbmc8L2g0PgorICA8cD5UaGUgPGNvZGU+aW5jbHVkZTwvY29kZT4gdGFzayBtYXkgb25seSBiZSB1c2VkIGFzIGEgdG9wLWxldmVsIHRhc2suIFRoaXMgbWVhbnMgdGhhdAorICAgIGl0IG1heSBub3QgYmUgdXNlZCBpbiBhIHRhcmdldC48L3A+CiAKLTxwPkFueSB0YXJnZXQgaW4gdGhlIGluY2x1ZGVkIGZpbGUgd2lsbCBiZSByZW5hbWVkCi0gIHRvIDxpPnByZWZpeC5uYW1lPC9pPiB3aGVyZSA8aT5uYW1lPC9pPiBpcyB0aGUgb3JpZ2luYWwgdGFyZ2V0J3MKLSAgbmFtZSBhbmQgPGk+cHJlZml4PC9pPiBpcyBlaXRoZXIgdGhlIHZhbHVlIG9mIHRoZSA8aT5hczwvaT4KLSAgYXR0cmlidXRlIG9yIHRoZSA8aT5uYW1lPC9pPiBhdHRyaWJ1dGUgb2YgdGhlIDxpPnByb2plY3Q8L2k+IHRhZyBvZgotICB0aGUgaW5jbHVkZWQgZmlsZS48L3A+CisgIDxwPlRoZXJlIGFyZSB0d28gZnVydGhlciBmdW5jdGlvbmFsIGFzcGVjdHMgdGhhdCBwZXJ0YWluIHRvIHRoaXMgdGFzayBhbmQgdGhhdCBhcmUgbm90IHBvc3NpYmxlCisgICAgd2l0aCBlbnRpdHkgaW5jbHVkZXM6PC9wPgorICA8dWw+CisgICAgPGxpPnRhcmdldCByZXdyaXRpbmc8L2xpPgorICAgIDxsaT5zcGVjaWFsIHByb3BlcnRpZXM8L2xpPgorICA8L3VsPgorICA8aDQ+VGFyZ2V0IHJld3JpdGluZzwvaDQ+CiAKLTxwPlRoZSBkZXBlbmRzIGF0dHJpYnV0ZSBvZiBhbGwgaW5jbHVkZWQgdGFyZ2V0cyBpcyByZXdyaXR0ZW4gc28gdGhhdAotICBhbGwgdGFyZ2V0IG5hbWVzIGFyZSBwcmVmaXhlZCBhcyB3ZWxsLiAgVGhpcyBtYWtlcyB0aGUgaW5jbHVkZWQgZmlsZQotICBzZWxmLWNvbnRhaW5lZC48L3A+CisgIDxwPkFueSB0YXJnZXQgaW4gdGhlIGluY2x1ZGVkIGZpbGUgd2lsbCBiZSByZW5hbWVkIHRvIDxxPnByZWZpeC5uYW1lPC9xPiB3aGVyZSA8cT5uYW1lPC9xPiBpcyB0aGUKKyAgICBvcmlnaW5hbCB0YXJnZXQncyBuYW1lIGFuZCA8cT5wcmVmaXg8L3E+IGlzIGVpdGhlciB0aGUgdmFsdWUgb2YgdGhlIDx2YXI+YXM8L3Zhcj4gYXR0cmlidXRlIG9yCisgICAgdGhlIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUgb2YgdGhlIDxjb2RlPnByb2plY3Q8L2NvZGU+IHRhZyBvZiB0aGUgaW5jbHVkZWQgZmlsZS48L3A+CiAKLTxwPk5vdGUgdGhhdCBwcmVmaXhlcyBuZXN0LCBzbyBpZiBhIGJ1aWxkIGZpbGUgaW5jbHVkZXMgYSBmaWxlIHdpdGgKLSAgcHJlZml4ICJhIiBhbmQgdGhlIGluY2x1ZGVkIGZpbGUgaW5jbHVkZXMgYW5vdGhlciBmaWxlIHdpdGggcHJlZml4Ci0gICJiIiwgdGhlbiB0aGUgdGFyZ2V0cyBvZiB0aGF0IGxhc3QgYnVpbGQgZmlsZSB3aWxsIGJlIHByZWZpeGVkIGJ5Ci0gICJhLmIuIi48L3A+CisgIDxwPlRoZSA8dmFyPmRlcGVuZHM8L3Zhcj4gYXR0cmlidXRlIG9mIGFsbCBpbmNsdWRlZCB0YXJnZXRzIGlzIHJld3JpdHRlbiBzbyB0aGF0IGFsbCB0YXJnZXQgbmFtZXMKKyAgICBhcmUgcHJlZml4ZWQgYXMgd2VsbC4gIFRoaXMgbWFrZXMgdGhlIGluY2x1ZGVkIGZpbGUgc2VsZi1jb250YWluZWQuPC9wPgogCi08cD48Y29kZT4mbHQ7aW1wb3J0Jmd0OzwvY29kZT4gY29udHJpYnV0ZSB0byB0aGUgcHJlZml4IGFzIHdlbGwsIGJ1dAotICBvbmx5IGlmIHRoZWlyIDxjb2RlPmFzPC9jb2RlPiBhdHRyaWJ1dGUgaGFzIGJlZW4gc3BlY2lmaWVkLgorICA8cD5Ob3RlIHRoYXQgcHJlZml4ZXMgbmVzdCwgc28gaWYgYSBidWlsZCBmaWxlIGluY2x1ZGVzIGEgZmlsZSB3aXRoIHByZWZpeCA8cT5xPC9xPiBhbmQgdGhlCisgICAgaW5jbHVkZWQgZmlsZSBpbmNsdWRlcyBhbm90aGVyIGZpbGUgd2l0aCBwcmVmaXggPHE+YjwvcT4sIHRoZW4gdGhlIHRhcmdldHMgb2YgdGhhdCBsYXN0IGJ1aWxkCisgICAgZmlsZSB3aWxsIGJlIHByZWZpeGVkIGJ5IDxxPmEuYi48L3E+LjwvcD4KIAotPGg0PlNwZWNpYWwgUHJvcGVydGllczwvaDQ+CisgIDxwPjxjb2RlPiZsdDtpbXBvcnQmZ3Q7PC9jb2RlPiBjb250cmlidXRlIHRvIHRoZSBwcmVmaXggYXMgd2VsbCwgYnV0IG9ubHkgaWYgdGhlaXIgPHZhcj5hczwvdmFyPgorICAgIGF0dHJpYnV0ZSBoYXMgYmVlbiBzcGVjaWZpZWQuCiAKLTxwPkluY2x1ZGVkIGZpbGVzIGFyZSB0cmVhdGVkIGFzIHRoZXkgYXJlIHByZXNlbnQgaW4gdGhlIG1haW4KLWJ1aWxkZmlsZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHVuZGVyc3RhbmQsIGJ1dCBpdCBtYWtlcyBpdCBpbXBvc3NpYmxlCi1mb3IgdGhlbSB0byByZWZlcmVuY2UgZmlsZXMgYW5kIHJlc291cmNlcyByZWxhdGl2ZSB0byB0aGVpciBwYXRoLgotQmVjYXVzZSBvZiB0aGlzLCBmb3IgZXZlcnkgaW5jbHVkZWQgZmlsZSwgQW50IGFkZHMgYSBwcm9wZXJ0eSB0aGF0Ci1jb250YWlucyB0aGUgcGF0aCB0byB0aGUgaW5jbHVkZWQgYnVpbGRmaWxlLiBXaXRoIHRoaXMgcGF0aCwgdGhlCi1pbmNsdWRlZCBidWlsZGZpbGUgY2FuIGtlZXAgcmVzb3VyY2VzIGFuZCBiZSBhYmxlIHRvIHJlZmVyZW5jZSB0aGVtCi1yZWxhdGl2ZSB0byBpdHMgcG9zaXRpb24uPC9wPgorICA8aDQ+U3BlY2lhbCBwcm9wZXJ0aWVzPC9oND4KIAotPHA+U28gaWYgSSBpbmNsdWRlIGZvciBleGFtcGxlIGEgPGk+ZG9jc2J1aWxkLnhtbDwvaT4gZmlsZSBuYW1lZCA8Yj5idWlsZGRvY3M8L2I+LAotSSBjYW4gZ2V0IGl0cyBwYXRoIGFzIDxiPmFudC5maWxlLmJ1aWxkZG9jczwvYj4sIHNpbWlsYXJseSB0byB0aGUgPGI+YW50LmZpbGU8L2I+Ci1wcm9wZXJ0eSBvZiB0aGUgbWFpbiBidWlsZGZpbGUuPC9wPgorICA8cD5JbmNsdWRlZCBmaWxlcyBhcmUgdHJlYXRlZCBhcyB0aGV5IGFyZSBwcmVzZW50IGluIHRoZSBtYWluIGJ1aWxkZmlsZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvCisgICAgdW5kZXJzdGFuZCwgYnV0IGl0IG1ha2VzIGl0IGltcG9zc2libGUgZm9yIHRoZW0gdG8gcmVmZXJlbmNlIGZpbGVzIGFuZCByZXNvdXJjZXMgcmVsYXRpdmUgdG8KKyAgICB0aGVpciBwYXRoLiAgQmVjYXVzZSBvZiB0aGlzLCBmb3IgZXZlcnkgaW5jbHVkZWQgZmlsZSwgQW50IGFkZHMgYSBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRoZQorICAgIHBhdGggdG8gdGhlIGluY2x1ZGVkIGJ1aWxkZmlsZS4gV2l0aCB0aGlzIHBhdGgsIHRoZSBpbmNsdWRlZCBidWlsZGZpbGUgY2FuIGtlZXAgcmVzb3VyY2VzIGFuZCBiZQorICAgIGFibGUgdG8gcmVmZXJlbmNlIHRoZW0gcmVsYXRpdmUgdG8gaXRzIHBvc2l0aW9uLjwvcD4KIAotPHA+Tm90ZSB0aGF0ICZxdW90O2J1aWxkZG9jcyZxdW90OyBpcyBub3QgdGhlIGZpbGVuYW1lLCBidXQgdGhlIG5hbWUgYXR0cmlidXRlCi1wcmVzZW50IGluIHRoZSBpbmNsdWRlZCBwcm9qZWN0IHRhZy48L3A+Ci0gIDxwPgotICAgIElmIHRoZSBpbmNsdWRlZCBmaWxlIGRvZXMgbm90IGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSwgdGhlIGFudC5maWxlLnByb2plY3RuYW1lCi0gICAgcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LgotICA8L3A+CisgIDxwPlNvIGlmIEkgaW5jbHVkZSBmb3IgZXhhbXBsZSBhIDxzYW1wPmRvY3NidWlsZC54bWw8L3NhbXA+IGZpbGUgbmFtZWQgPHE+YnVpbGRkb2NzPC9xPiwgSSBjYW4gZ2V0CisgICAgaXRzIHBhdGggYXMgPGNvZGU+YW50LmZpbGUuYnVpbGRkb2NzPC9jb2RlPiwgc2ltaWxhcmx5IHRvIHRoZSA8Y29kZT5hbnQuZmlsZTwvY29kZT4gcHJvcGVydHkgb2YKKyAgICB0aGUgbWFpbiBidWlsZGZpbGUuPC9wPgogCi08cD5JZiB5b3UgbmVlZCB0byBrbm93IHdoZXRoZXIgdGhlIGN1cnJlbnQgYnVpbGQgZmlsZSdzIHNvdXJjZSBoYXMKLSAgYmVlbiBhIGZpbGUgb3IgYW4gVVJMIHlvdSBjYW4gY29uc3VsdCB0aGUKLSAgcHJvcGVydHkgPGI+YW50LmZpbGUudHlwZS48ZW0+cHJvamVjdG5hbWU8L2VtPjwvYj4gKHVzaW5nIHRoZSBzYW1lCi0gIGV4YW1wbGUgYXMgYWJvdmUgPGI+YW50LmZpbGUudHlwZS5idWlsZGRvY3M8L2I+KSB3aGljaCBlaXRoZXIgaGF2ZQotICB0aGUgdmFsdWUgImZpbGUiIG9yICJ1cmwiLjwvcD4KKyAgPHA+Tm90ZSB0aGF0IDxxPmJ1aWxkZG9jczwvcT4gaXMgbm90IHRoZSBmaWxlbmFtZSwgYnV0IHRoZSA8dmFyPm5hbWU8L3Zhcj4gYXR0cmlidXRlIHByZXNlbnQgaW4KKyAgICB0aGUgaW5jbHVkZWQgPGNvZGU+cHJvamVjdDwvY29kZT4gdGFnLjwvcD4KKyAgPHA+SWYgdGhlIGluY2x1ZGVkIGZpbGUgZG9lcyBub3QgaGF2ZSBhIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUsCisgICAgdGhlIDxjb2RlPmFudC5maWxlLjxpPnByb2plY3RuYW1lPC9pPjwvY29kZT4gcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0LjwvcD4KIAotPGg0PlJlc29sdmluZyBmaWxlcyBhZ2FpbnN0IHRoZSBpbmNsdWRlZCBmaWxlPC9oND4KKyAgPHA+SWYgeW91IG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoZSBjdXJyZW50IGJ1aWxkIGZpbGUncyBzb3VyY2UgaGFzIGJlZW4gYSBmaWxlIG9yIGFuIFVSTCB5b3UgY2FuCisgICAgY29uc3VsdCB0aGUgcHJvcGVydHkgPGNvZGU+YW50LmZpbGUudHlwZS48aT5wcm9qZWN0bmFtZTwvaT48L2NvZGU+ICh1c2luZyB0aGUgc2FtZSBleGFtcGxlIGFzCisgICAgYWJvdmUgPGNvZGU+YW50LmZpbGUudHlwZS5idWlsZGRvY3M8L2NvZGU+KSB3aGljaCBlaXRoZXIgaGF2ZSB0aGUgdmFsdWUgPHE+ZmlsZTwvcT4KKyAgICBvciA8cT51cmw8L3E+LjwvcD4KIAotPHA+U3VwcG9zZSB5b3VyIG1haW4gYnVpbGQgZmlsZSBjYWxsZWQgPGNvZGU+aW5jbHVkaW5nLnhtbDwvY29kZT4KLWluY2x1ZGVzIGEgYnVpbGQgZmlsZSA8Y29kZT5pbmNsdWRlZC54bWw8L2NvZGU+LCBsb2NhdGVkIGFueXdoZXJlIG9uCi10aGUgZmlsZSBzeXN0ZW0sIGFuZCA8Y29kZT5pbmNsdWRlZC54bWw8L2NvZGU+IHJlYWRzIGEgc2V0IG9mCi1wcm9wZXJ0aWVzIGZyb20gPGNvZGU+aW5jbHVkZWQucHJvcGVydGllczwvY29kZT46PC9wPgorICA8aDQ+UmVzb2x2aW5nIGZpbGVzIGFnYWluc3QgdGhlIGluY2x1ZGVkIGZpbGU8L2g0PgogCi08cHJlPiZsdDshLS0gaW5jbHVkaW5nLnhtbCAtLSZndDsKKyAgPHA+U3VwcG9zZSB5b3VyIG1haW4gYnVpbGQgZmlsZSBjYWxsZWQgPHNhbXA+aW5jbHVkaW5nLnhtbDwvc2FtcD4gaW5jbHVkZXMgYSBidWlsZAorICAgIGZpbGUgPHNhbXA+aW5jbHVkZWQueG1sPC9zYW1wPiwgbG9jYXRlZCBhbnl3aGVyZSBvbiB0aGUgZmlsZSBzeXN0ZW0sCisgICAgYW5kIDxzYW1wPmluY2x1ZGVkLnhtbDwvc2FtcD4gcmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcworICAgIGZyb20gPHNhbXA+aW5jbHVkZWQucHJvcGVydGllczwvc2FtcD46PC9wPgorCisgIDxwcmU+CismbHQ7IS0tIGluY2x1ZGluZy54bWwgLS0mZ3Q7CiAmbHQ7cHJvamVjdCBuYW1lPSJpbmNsdWRpbmciIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Ii4uLiImZ3Q7Ci0mbmJzcDsgJmx0O2luY2x1ZGUgZmlsZT0iJHtwYXRoX3RvX2luY2x1ZGVkfS9pbmNsdWRlZC54bWwiLyZndDsKKyAgJmx0O2luY2x1ZGUgZmlsZT0iJHtwYXRoX3RvX2luY2x1ZGVkfS9pbmNsdWRlZC54bWwiLyZndDsKICZsdDsvcHJvamVjdCZndDsKIAogJmx0OyEtLSBpbmNsdWRlZC54bWwgLS0mZ3Q7CiAmbHQ7cHJvamVjdCBuYW1lPSJpbmNsdWRlZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iLi4uIiZndDsKLSZuYnNwOyAmbHQ7cHJvcGVydHkgZmlsZT0iaW5jbHVkZWQucHJvcGVydGllcyIvJmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+CisgICZsdDtwcm9wZXJ0eSBmaWxlPSJpbmNsdWRlZC5wcm9wZXJ0aWVzIi8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLTxwPlRoaXMgc25pcHBldCBob3dldmVyIHdpbGwgcmVzb2x2ZSA8Y29kZT5pbmNsdWRlZC5wcm9wZXJ0aWVzPC9jb2RlPgotYWdhaW5zdCB0aGUgYmFzZWRpciBvZiA8Y29kZT5pbmNsdWRpbmcueG1sPC9jb2RlPiwgYmVjYXVzZSB0aGUgYmFzZWRpcgotb2YgPGNvZGU+aW5jbHVkZWQueG1sPC9jb2RlPiBpcyBpZ25vcmVkIGJ5IEFudC4gVGhlIHJpZ2h0IHdheSB0byB1c2UKLTxjb2RlPmluY2x1ZGVkLnByb3BlcnRpZXM8L2NvZGU+IGlzOjwvcD4KKyAgPHA+VGhpcyBzbmlwcGV0IGhvd2V2ZXIgd2lsbCByZXNvbHZlIDxzYW1wPmluY2x1ZGVkLnByb3BlcnRpZXM8L3NhbXA+IGFnYWluc3QKKyAgICB0aGUgPHZhcj5iYXNlZGlyPC92YXI+IG9mIDxzYW1wPmluY2x1ZGluZy54bWw8L3NhbXA+LCBiZWNhdXNlIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4KKyAgICBvZiA8c2FtcD5pbmNsdWRlZC54bWw8L3NhbXA+IGlzIGlnbm9yZWQgYnkgQW50LiBUaGUgcmlnaHQgd2F5IHRvCisgICAgdXNlIDxzYW1wPmluY2x1ZGVkLnByb3BlcnRpZXM8L3NhbXA+IGlzOjwvcD4KIAotPHByZT4KKyAgPHByZT4KICZsdDshLS0gaW5jbHVkZWQueG1sIC0tJmd0OwogJmx0O3Byb2plY3QgbmFtZT0iaW5jbHVkZWQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Ii4uLiImZ3Q7Ci0mbmJzcDsgJmx0O2Rpcm5hbWUgcHJvcGVydHk9ImluY2x1ZGVkLmJhc2VkaXIiIGZpbGU9IiR7YW50LmZpbGUuaW5jbHVkZWR9Ii8mZ3Q7Ci0mbmJzcDsgJmx0O3Byb3BlcnR5IGZpbGU9IiR7aW5jbHVkZWQuYmFzZWRpcn0vaW5jbHVkZWQucHJvcGVydGllcyIvJmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+CisgICZsdDtkaXJuYW1lIHByb3BlcnR5PSJpbmNsdWRlZC5iYXNlZGlyIiBmaWxlPSIke2FudC5maWxlLmluY2x1ZGVkfSIvJmd0OworICAmbHQ7cHJvcGVydHkgZmlsZT0iJHtpbmNsdWRlZC5iYXNlZGlyfS9pbmNsdWRlZC5wcm9wZXJ0aWVzIi8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLTxwPkFzIGV4cGxhaW5lZCBhYm92ZSA8Y29kZT4ke2FudC5maWxlLmluY2x1ZGVkfTwvY29kZT4gc3RvcmVzIHRoZQotcGF0aCBvZiB0aGUgYnVpbGQgc2NyaXB0LCB0aGF0IGRlZmluZXMgdGhlIHByb2plY3QgY2FsbGVkCi08Y29kZT5pbmNsdWRlZDwvY29kZT4sIChpbiBzaG9ydCBpdCBzdG9yZXMgdGhlIHBhdGggdG8KLTxjb2RlPmluY2x1ZGVkLnhtbDwvY29kZT4pIGFuZCA8YQotaHJlZj0iZGlybmFtZS5odG1sIj48Y29kZT4mbHQ7ZGlybmFtZSZndDs8L2NvZGU+PC9hPiB0YWtlcyBpdHMKLWRpcmVjdG9yeS4gVGhpcyB0ZWNobmlxdWUgYWxzbyBhbGxvd3MgPGNvZGU+aW5jbHVkZWQueG1sPC9jb2RlPiB0byBiZQotdXNlZCBhcyBhIHN0YW5kYWxvbmUgZmlsZSAod2l0aG91dCBiZWluZyBpbmNsdWRlZCBpbiBvdGhlcgotcHJvamVjdCkuPC9wPgorICA8cD5BcyBleHBsYWluZWQgYWJvdmUgPGNvZGU+YW50LmZpbGUuaW5jbHVkZWQ8L2NvZGU+IHN0b3JlcyB0aGUgcGF0aCBvZiB0aGUgYnVpbGQgc2NyaXB0LCB0aGF0CisgICAgZGVmaW5lcyB0aGUgcHJvamVjdCBjYWxsZWQgPHE+aW5jbHVkZWQ8L3E+LCAoaW4gc2hvcnQgaXQgc3RvcmVzIHRoZSBwYXRoCisgICAgdG8gPHNhbXA+aW5jbHVkZWQueG1sPC9zYW1wPikgYW5kIDxhIGhyZWY9ImRpcm5hbWUuaHRtbCI+PGNvZGU+Jmx0O2Rpcm5hbWUmZ3Q7PC9jb2RlPjwvYT4gdGFrZXMKKyAgICBpdHMgZGlyZWN0b3J5LiBUaGlzIHRlY2huaXF1ZSBhbHNvIGFsbG93cyA8c2FtcD5pbmNsdWRlZC54bWw8L3NhbXA+IHRvIGJlIHVzZWQgYXMgYSBzdGFuZGFsb25lCisgICAgZmlsZSAod2l0aG91dCBiZWluZyBpbmNsdWRlZCBpbiBvdGhlciBwcm9qZWN0KS48L3A+CiAKLTxwPlRoZSBhYm92ZSBkZXNjcmlwdGlvbiBvbmx5IHdvcmtzIGZvciBpbmNsdWRlZCBmaWxlcyB0aGF0IGFjdHVhbGx5Ci0gIGFyZSBpbmNsdWRlZCBmcm9tIGZpbGVzIGFuZCBub3QgZnJvbSBVUkxzLiAgRm9yIGZpbGVzIGluY2x1ZGVkIGZyb20KLSAgVVJMcyB1c2luZyByZXNvdXJjZXMgcmVsYXRpdmUgdG8gdGhlIGluY2x1ZGVkIGZpbGUgcmVxdWlyZXMgeW91IHRvCi0gIHVzZSB0YXNrcyB0aGF0IGNhbiB3b3JrIG9uIG5vbi1maWxlIHJlc291cmNlcyBpbiB0aGUgZmlyc3QgcGxhY2UuCi0gIFRvIGNyZWF0ZSBhIHJlbGF0aXZlIHJlc291cmNlIHlvdSdkIHVzZSBzb21ldGhpbmcgbGlrZTo8L3A+CisgIDxwPlRoZSBhYm92ZSBkZXNjcmlwdGlvbiBvbmx5IHdvcmtzIGZvciBpbmNsdWRlZCBmaWxlcyB0aGF0IGFjdHVhbGx5IGFyZSBpbmNsdWRlZCBmcm9tIGZpbGVzIGFuZAorICAgIG5vdCBmcm9tIFVSTHMuICBGb3IgZmlsZXMgaW5jbHVkZWQgZnJvbSBVUkxzIHVzaW5nIHJlc291cmNlcyByZWxhdGl2ZSB0byB0aGUgaW5jbHVkZWQgZmlsZQorICAgIHJlcXVpcmVzIHlvdSB0byB1c2UgdGFza3MgdGhhdCBjYW4gd29yayBvbiBub24tZmlsZSByZXNvdXJjZXMgaW4gdGhlIGZpcnN0IHBsYWNlLiAgVG8gY3JlYXRlIGEKKyAgICByZWxhdGl2ZSByZXNvdXJjZSB5b3UnZCB1c2Ugc29tZXRoaW5nIGxpa2U6PC9wPgogCi08cHJlPgotICAmbHQ7bG9hZHByb3BlcnRpZXMmZ3Q7Ci0gICAgJmx0O3VybCBiYXNlVXJsPSIke2FudC5maWxlLmluY2x1ZGVkfSIKLSAgICAgICAgIHJlbGF0aXZlUGF0aD0iaW5jbHVkZWQucHJvcGVydGllcyIvJmd0OwotICAmbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+CisgIDxwcmU+CismbHQ7bG9hZHByb3BlcnRpZXMmZ3Q7CisgICZsdDt1cmwgYmFzZVVybD0iJHthbnQuZmlsZS5pbmNsdWRlZH0iCisgICAgICAgcmVsYXRpdmVQYXRoPSJpbmNsdWRlZC5wcm9wZXJ0aWVzIi8mZ3Q7CismbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OzwvcHJlPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRib2R5PgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgZmlsZQotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFRoZSBmaWxlIHRvIGluY2x1ZGUuIElmIHRoaXMgaXMgYSByZWxhdGl2ZSBmaWxlIG5hbWUsIHRoZSBmaWxlIG5hbWUgd2lsbCBiZSByZXNvbHZlZAotICAgICAgICByZWxhdGl2ZSB0byB0aGUgPGk+aW5jbHVkaW5nPC9pPiBmaWxlLiA8Yj5Ob3RlPC9iPiwgdGhpcyBpcyB1bmxpa2UgbW9zdCBvdGhlcgotICAgICAgICBhbnQgZmlsZSBhdHRyaWJ1dGVzLCB3aGVyZSByZWxhdGl2ZSBmaWxlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gJHtiYXNlZGlyfS4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcyBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uPC90ZD4KKyAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgIDx0ZD5UaGUgZmlsZSB0byBpbmNsdWRlLiBJZiB0aGlzIGlzIGEgcmVsYXRpdmUgZmlsZSBuYW1lLCB0aGUgZmlsZSBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQKKyAgICAgICAgcmVsYXRpdmUgdG8gdGhlIDxlbT5pbmNsdWRpbmc8L2VtPiBmaWxlLiA8c3Ryb25nPk5vdGU8L3N0cm9uZz4sIHRoaXMgaXMgdW5saWtlIG1vc3Qgb3RoZXIKKyAgICAgICAgYW50IGZpbGUgYXR0cmlidXRlcywgd2hlcmUgcmVsYXRpdmUgZmlsZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvICR7YmFzZWRpcn0uPC90ZD4KKyAgICAgIDx0ZD5ZZXMgb3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBvcHRpb25hbAotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIElmIHRydWUsIGRvIG5vdCBzdG9wIHRoZSBidWlsZCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwKLSAgICAgICAgZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDx0ZD5vcHRpb25hbDwvdGQ+CisgICAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIGRvIG5vdCBzdG9wIHRoZSBidWlsZCBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBhcwotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFNwZWNpZmllcyB0aGUgcHJlZml4IHByZXBlbmRlZCB0byB0aGUgdGFyZ2V0IG5hbWVzLiAgSWYKLSAgICAgICAgb21pdHRlZCwgdGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBwcm9qZWN0IHRhZyBvZiB0aGUKLSAgICAgICAgaW5jbHVkZWQgZmlsZSB3aWxsIGJlIHVzZWQuCi0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIGlmIHRoZSBpbmNsdWRlZCBmaWxlJ3MKLSAgICAgICAgcHJvamVjdCB0YWcgZG9lc24ndCBzcGVjaWZ5IGEgbmFtZSBhdHRyaWJ1dGUuPC90ZD4KKyAgICAgIDx0ZD5hczwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBwcmVmaXggcHJlcGVuZGVkIHRvIHRoZSB0YXJnZXQgbmFtZXMuPC90ZD4KKyAgICAgIDx0ZD5ZZXMsIGlmIHRoZSBpbmNsdWRlZCBmaWxlJ3MgPGNvZGU+cHJvamVjdDwvY29kZT4gdGFnIGRvZXNuJ3Qgc3BlY2lmeSBhIDx2YXI+bmFtZTwvdmFyPgorICAgICAgICBhdHRyaWJ1dGUgKHdoaWNoIGlzIG90aGVyd2lzZSB0YWtlbiBhcyBkZWZhdWx0KTwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBwcmVmaXhTZXBhcmF0b3IKLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBTcGVjaWZpZXMgdGhlIHNlcGFyYXRvciB0byBiZSB1c2VkIGJldHdlZW4gdGhlIHByZWZpeCBhbmQgdGhlCi0gICAgICAgIHRhcmdldCBuYW1lLiAgRGVmYXVsdHMgdG8gIi4iLgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPHRkPnByZWZpeFNlcGFyYXRvcjwvdGQ+CisgICAgICA8dGQ+U3BlY2lmaWVzIHRoZSBzZXBhcmF0b3IgdG8gYmUgdXNlZCBiZXR3ZWVuIHRoZSBwcmVmaXggYW5kIHRoZSB0YXJnZXQgbmFtZS48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4uPC9xPjwvdGQ+CiAgICAgPC90cj4KICAgPC90Ym9keT4KIDwvdGFibGU+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08aDQ+YW55IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3IgcmVzb3VyY2UKLWNvbGxlY3Rpb248L2g0PgorPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgogCiA8cD5UaGUgc3BlY2lmaWVkIHJlc291cmNlcyB3aWxsIGJlIGluY2x1ZGVkLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+Jm5ic3A7ICZsdDtpbmNsdWRlIGZpbGU9JnF1b3Q7Li4vY29tbW9uLXRhcmdldHMueG1sJnF1b3Q7LyZndDsKLTwvcHJlPgorPHByZT4mbHQ7aW5jbHVkZSBmaWxlPSZxdW90Oy4uL2NvbW1vbi10YXJnZXRzLnhtbCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPkluY2x1ZGVzIHRhcmdldHMgZnJvbSB0aGUgY29tbW9uLXRhcmdldHMueG1sIGZpbGUgdGhhdCBpcyBpbiBhIHBhcmVudAotZGlyZWN0b3J5LjwvcD4KKzxwPkluY2x1ZGVzIHRhcmdldHMgZnJvbSB0aGUgPHNhbXA+Y29tbW9uLXRhcmdldHMueG1sPC9zYW1wPiBmaWxlIHRoYXQgaXMgaW4gYSBwYXJlbnQgZGlyZWN0b3J5LjwvcD4KIAotPHByZT4mbmJzcDsgJmx0O2luY2x1ZGUgZmlsZT0mcXVvdDske2RlcGxveS1wbGF0Zm9ybX0ueG1sJnF1b3Q7LyZndDsKLTwvcHJlPgorPHByZT4mbHQ7aW5jbHVkZSBmaWxlPSZxdW90OyR7ZGVwbG95LXBsYXRmb3JtfS54bWwmcXVvdDsvJmd0OzwvcHJlPgogCiA8cD5JbmNsdWRlcyB0aGUgcHJvamVjdCBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eSBkZXBsb3ktcGxhdGZvcm08L3A+CiAKIDxwcmU+Ci0gICZsdDtpbmNsdWRlJmd0OwotICAgICZsdDtqYXZhcmVzb3VyY2UgbmFtZT0iY29tbW9uL3RhcmdldHMueG1sIiZndDsKLSAgICAgICZsdDtjbGFzc3BhdGggbG9jYXRpb249ImNvbW1vbi5qYXIiLyZndDsKLSAgICAmbHQ7L2phdmFyZXNvdXJjZSZndDsKLSAgJmx0Oy9pbmNsdWRlJmd0OwotPC9wcmU+CismbHQ7aW5jbHVkZSZndDsKKyAgJmx0O2phdmFyZXNvdXJjZSBuYW1lPSJjb21tb24vdGFyZ2V0cy54bWwiJmd0OworICAgICZsdDtjbGFzc3BhdGggbG9jYXRpb249ImNvbW1vbi5qYXIiLyZndDsKKyAgJmx0Oy9qYXZhcmVzb3VyY2UmZ3Q7CismbHQ7L2luY2x1ZGUmZ3Q7PC9wcmU+CiAKLTxwPkluY2x1ZGVzIHRhcmdldHMgZnJvbSB0aGUgdGFyZ2V0cy54bWwgZmlsZSB0aGF0IGlzIGluc2lkZSB0aGUKLSAgZGlyZWN0b3J5IGNvbW1vbiBpbnNpZGUgdGhlIGphciBmaWxlIGNvbW1vbi5qYXIuPC9wPgorPHA+SW5jbHVkZXMgdGFyZ2V0cyBmcm9tIHRoZSA8c2FtcD50YXJnZXRzLnhtbDwvc2FtcD4gZmlsZSB0aGF0IGlzIGluc2lkZSB0aGUKK2RpcmVjdG9yeSA8c2FtcD5jb21tb248L3NhbXA+IGluc2lkZSB0aGUgamFyIGZpbGUgPHNhbXA+Y29tbW9uLmphcjwvc2FtcD4uPC9wPgogCi08aDM+SG93IGlzIDxhIGhyZWY9ImltcG9ydC5odG1sIj4mbHQ7aW1wb3J0Jmd0OzwvYT4gZGlmZmVyZW50Ci0gIGZyb20gJmx0O2luY2x1ZGUmZ3Q7PzwvaDM+Cis8aDM+SG93IGlzIDxhIGhyZWY9ImltcG9ydC5odG1sIj4mbHQ7aW1wb3J0Jmd0OzwvYT4gZGlmZmVyZW50IGZyb20gJmx0O2luY2x1ZGUmZ3Q7PzwvaDM+CiAKLTxwPlRoZSBzaG9ydCB2ZXJzaW9uOiBVc2UgaW1wb3J0IGlmIHlvdSBpbnRlbmQgdG8gb3ZlcnJpZGUgYSB0YXJnZXQsCi0gIG90aGVyd2lzZSB1c2UgaW5jbHVkZS48L3A+Cis8cD5UaGUgc2hvcnQgdmVyc2lvbjogVXNlIDxjb2RlPmltcG9ydDwvY29kZT4gaWYgeW91IGludGVuZCB0byBvdmVycmlkZSBhIHRhcmdldCwgb3RoZXJ3aXNlCit1c2UgPGNvZGU+aW5jbHVkZTwvY29kZT4uPC9wPgogCi08cD5XaGVuIHVzaW5nIGltcG9ydCB0aGUgaW1wb3J0ZWQgdGFyZ2V0cyBhcmUgYXZhaWxhYmxlIGJ5IHVwIHRvIHR3bwotICBuYW1lcy4gIFRoZWlyICJub3JtYWwiIG5hbWUgd2l0aG91dCBhbnkgcHJlZml4IGFuZCBwb3RlbnRpYWxseSB3aXRoCi0gIGEgcHJlZml4ZWQgbmFtZSAodGhlIHZhbHVlIG9mIHRoZSBhcyBhdHRyaWJ1dGUgb3IgdGhlIGltcG9ydGVkCi0gIHByb2plY3QncyBuYW1lIGF0dHJpYnV0ZSwgaWYgYW55KS48L3A+Cis8cD5XaGVuIDxjb2RlPmltcG9ydDwvY29kZT4gaXMgdXNlZCwgdGhlIGltcG9ydGVkIHRhcmdldHMgYXJlIGF2YWlsYWJsZSBieSB1cCB0byB0d28gbmFtZXM6IHRoZWlyCisibm9ybWFsIiBuYW1lIHdpdGhvdXQgYW55IHByZWZpeCBhbmQgcG90ZW50aWFsbHkgd2l0aCBhIHByZWZpeGVkIG5hbWUgKHRoZSB2YWx1ZSBvZgordGhlIDx2YXI+YXM8L3Zhcj4gYXR0cmlidXRlIG9yIHRoZSBpbXBvcnRlZCBwcm9qZWN0J3MgPHZhcj5uYW1lPC92YXI+IGF0dHJpYnV0ZSwgaWYgYW55KS48L3A+CiAKLTxwPldoZW4gdXNpbmcgaW5jbHVkZSB0aGUgaW5jbHVkZWQgdGFyZ2V0cyBhcmUgb25seSBhdmFpbGFibGUgaW4gdGhlCi0gIHByZWZpeGVkIGZvcm0uPC9wPgorPHA+V2hlbiA8Y29kZT5pbmNsdWRlPC9jb2RlPiBpcyB1c2VkLCB0aGUgaW5jbHVkZWQgdGFyZ2V0cyBhcmUgb25seSBhdmFpbGFibGUgaW4gdGhlIHByZWZpeGVkIGZvcm0uPC9wPgogCi08cD5XaGVuIHVzaW5nIGltcG9ydCwgdGhlIGltcG9ydGVkIHRhcmdldCdzIGRlcGVuZHMgYXR0cmlidXRlCi0gIHJlbWFpbnMgdW5jaGFuZ2VkLCBpLmUuIGl0IHVzZXMgIm5vcm1hbCIgbmFtZXMgYW5kIGFsbG93cyB5b3UgdG8KLSAgb3ZlcnJpZGUgdGFyZ2V0cyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LjwvcD4KKzxwPldoZW4gPGNvZGU+aW1wb3J0PC9jb2RlPiBpcyB1c2VkLCB0aGUgaW1wb3J0ZWQgdGFyZ2V0J3MgPHZhcj5kZXBlbmRzPC92YXI+IGF0dHJpYnV0ZSByZW1haW5zCit1bmNoYW5nZWQsIGkuZS4gaXQgdXNlcyAibm9ybWFsIiBuYW1lcyBhbmQgYWxsb3dzIHlvdSB0byBvdmVycmlkZSB0YXJnZXRzIGluIHRoZSBkZXBlbmRlbmN5CitsaXN0LjwvcD4KIAotPHA+V2hlbiB1c2luZyBpbmNsdWRlLCB0aGUgaW5jbHVkZWQgdGFyZ2V0cyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBhbmQKLSAgdGhlaXIgZGVwZW5kcyBhdHRyaWJ1dGVzIGFyZSByZXdyaXR0ZW4gc28gdGhhdCBwcmVmaXhlZCBuYW1lcyBhcmUKLSAgdXNlZC4gIFRoaXMgYWxsb3dzIHdyaXRlcnMgb2YgdGhlIGluY2x1ZGVkIGZpbGUgdG8gY29udHJvbCB3aGljaAotICB0YXJnZXQgaXMgaW52b2tlZCBhcyBwYXJ0IG9mIHRoZSBkZXBlbmRlbmNpZXMuPC9wPgorPHA+V2hlbiA8Y29kZT5pbmNsdWRlPC9jb2RlPiBpcyB1c2VkLCB0aGUgaW5jbHVkZWQgdGFyZ2V0cyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBhbmQKK3RoZWlyIDx2YXI+ZGVwZW5kczwvdmFyPiBhdHRyaWJ1dGVzIGFyZSByZXdyaXR0ZW4gc28gdGhhdCBwcmVmaXhlZCBuYW1lcyBhcmUgdXNlZC4gIFRoaXMgYWxsb3dzCit3cml0ZXJzIG9mIHRoZSBpbmNsdWRlZCBmaWxlIHRvIGNvbnRyb2wgd2hpY2ggdGFyZ2V0IGlzIGludm9rZWQgYXMgcGFydCBvZiB0aGUgZGVwZW5kZW5jaWVzLjwvcD4KIAotPHA+SXQgaXMgcG9zc2libGUgdG8gaW5jbHVkZSB0aGUgc2FtZSBmaWxlIG1vcmUgdGhhbiBvbmNlIGJ5IHVzaW5nCi0gIGRpZmZlcmVudCBwcmVmaXhlcywgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGltcG9ydCB0aGUgc2FtZSBmaWxlIG1vcmUKLSAgdGhhbiBvbmNlLjwvcD4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIDxjb2RlPmluY2x1ZGU8L2NvZGU+IHRoZSBzYW1lIGZpbGUgbW9yZSB0aGFuIG9uY2UgYnkgdXNpbmcgZGlmZmVyZW50IHByZWZpeGVzOworaXQgaXMgbm90IHBvc3NpYmxlIHRvIDxjb2RlPmltcG9ydDwvY29kZT4gdGhlIHNhbWUgZmlsZSBtb3JlIHRoYW4gb25jZS48L3A+CiAKIDxoND5FeGFtcGxlczwvaDQ+CiAKLTxwPjxpPm5lc3RlZC54bWw8L2k+IHNoYWxsIGJlOjwvcD4KKzxwPjxzYW1wPm5lc3RlZC54bWw8L3NhbXA+IHNoYWxsIGJlOjwvcD4KIAogPHByZT4KICZsdDtwcm9qZWN0Jmd0OwpAQCAtMjgzLDEwICsyMjUsOSBAQAogICAmbHQ7dGFyZ2V0IG5hbWU9ImVjaG8iIGRlcGVuZHM9InNldFVwIiZndDsKICAgICAmbHQ7ZWNobyZndDtwcm9wIGhhcyB0aGUgdmFsdWUgJHtwcm9wfSZsdDsvZWNobyZndDsKICAgJmx0Oy90YXJnZXQmZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAotPHA+V2hlbiB1c2luZyBpbXBvcnQgbGlrZSBpbjwvcD4KKzxwPldoZW4gdXNpbmcgPGNvZGU+aW1wb3J0PC9jb2RlPiBsaWtlIGluPC9wPgogCiA8cHJlPgogJmx0O3Byb2plY3QgZGVmYXVsdD0idGVzdCImZ3Q7CkBAIC0yOTcsMTIgKzIzOCwxMSBAQAogICAmbHQ7aW1wb3J0IGZpbGU9Im5lc3RlZC54bWwiIGFzPSJuZXN0ZWQiLyZndDsKIAogICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9Im5lc3RlZC5lY2hvIi8mZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAotPHA+UnVubmluZyB0aGUgYnVpbGQgZmlsZSB3aWxsIGVtaXQ6Cis8cD5SdW5uaW5nIHRoZSBidWlsZCBmaWxlIHdpbGwgZW1pdDo8L3A+CiAKLTxwcmU+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgogc2V0VXA6CiAKIG5lc3RlZC5lY2hvOgpAQCAtMzEyLDcgKzI1Miw3IEBACiAKIDwvcHJlPgogCi08cD5XaGVuIHVzaW5nIGluY2x1ZGUgbGlrZSBpbjwvcD4KKzxwPldoZW4gdXNpbmcgPGNvZGU+aW5jbHVkZTwvY29kZT4gbGlrZSBpbjwvcD4KIAogPHByZT4KICZsdDtwcm9qZWN0IGRlZmF1bHQ9InRlc3QiJmd0OwpAQCAtMzIzLDEyICsyNjMsMTEgQEAKICAgJmx0O2luY2x1ZGUgZmlsZT0ibmVzdGVkLnhtbCIgYXM9Im5lc3RlZCIvJmd0OwogCiAgICZsdDt0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0ibmVzdGVkLmVjaG8iLyZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5SdW5uaW5nIHRoZSB0YXJnZXQgYnVpbGQgZmlsZSB3aWxsIGVtaXQ6Cis8cD5SdW5uaW5nIHRoZSB0YXJnZXQgYnVpbGQgZmlsZSB3aWxsIGVtaXQ6PC9wPgogCi08cHJlPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KIG5lc3RlZC5zZXRVcDoKIAogbmVzdGVkLmVjaG86CkBAIC0zMzgsNyArMjc3LDcgQEAKIAogPC9wcmU+CiAKLTxwPmFuZCB0aGVyZSB3b24ndCBiZSBhbnkgdGFyZ2V0IG5hbWVkICJlY2hvIiBvbiB0aGUgaW5jbHVkaW5nIGJ1aWxkIGZpbGUuPC9wPgorPHA+YW5kIHRoZXJlIHdvbid0IGJlIGFueSB0YXJnZXQgbmFtZWQgPHE+ZWNobzwvcT4gb24gdGhlIGluY2x1ZGluZyBidWlsZCBmaWxlLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2lucHV0Lmh0bWwgYi9tYW51YWwvVGFza3MvaW5wdXQuaHRtbAppbmRleCBiMDRhZmZjLi42ZGVkYjdjIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvaW5wdXQuaHRtbAorKysgYi9tYW51YWwvVGFza3MvaW5wdXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE4NSArMTUsMTY2IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5JbnB1dCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJpbnB1dCI+SW5wdXQ8L2E+PC9oMj4KKzxoMiBpZD0iaW5wdXQiPklucHV0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPkFsbG93cyB1c2VyIGludGVyYWN0aW9uIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyBieSBwcm9tcHRpbmcgZm9yCi1pbnB1dC4gIFRvIGRvIHNvLCBpdCB1c2VzIHRoZSBjb25maWd1cmVkIAotPGEgaHJlZj0iLi4vaW5wdXRoYW5kbGVyLmh0bWwiPklucHV0SGFuZGxlcjwvYT4uPC9wPgorPHA+QWxsb3dzIHVzZXIgaW50ZXJhY3Rpb24gZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGJ5IHByb21wdGluZyBmb3IgaW5wdXQuICBUbyBkbyBzbywgaXQgdXNlcyB0aGUKK2NvbmZpZ3VyZWQgPGEgaHJlZj0iLi4vaW5wdXRoYW5kbGVyLmh0bWwiPklucHV0SGFuZGxlcjwvYT4uPC9wPgogCi08cD5UaGUgcHJvbXB0IGNhbiBiZSBzZXQgdmlhIHRoZSBtZXNzYWdlIGF0dHJpYnV0ZSBvciBhcyBjaGFyYWN0ZXIKLWRhdGEgbmVzdGVkIGludG8gdGhlIGVsZW1lbnQuPC9wPgorPHA+VGhlIHByb21wdCBjYW4gYmUgc2V0IHZpYSB0aGUgPHZhcj5tZXNzYWdlPC92YXI+IGF0dHJpYnV0ZSBvciBhcyBjaGFyYWN0ZXIgZGF0YSBuZXN0ZWQgaW50byB0aGUKK2VsZW1lbnQuPC9wPgogCi08cD5PcHRpb25hbGx5IGEgc2V0IG9mIHZhbGlkIGlucHV0IGFyZ3VtZW50cyBjYW4gYmUgZGVmaW5lZCB2aWEgdGhlCi12YWxpZGFyZ3MgYXR0cmlidXRlLiBJbnB1dCB0YXNrIHdpbGwgbm90IGFjY2VwdCBhIHZhbHVlIHRoYXQgZG9lc24ndCBtYXRjaAotb25lIG9mIHRoZSBwcmVkZWZpbmVkLjwvcD4KKzxwPk9wdGlvbmFsbHkgYSBzZXQgb2YgdmFsaWQgaW5wdXQgYXJndW1lbnRzIGNhbiBiZSBkZWZpbmVkIHZpYSB0aGUgPHZhcj52YWxpZGFyZ3M8L3Zhcj4KK2F0dHJpYnV0ZS4gPGNvZGU+SW5wdXQ8L2NvZGU+IHRhc2sgd2lsbCBub3QgYWNjZXB0IGEgdmFsdWUgdGhhdCBkb2Vzbid0IG1hdGNoIG9uZSBvZiB0aGUKK3ByZWRlZmluZWQuPC9wPgogCi08cD5PcHRpb25hbGx5IGEgcHJvcGVydHkgY2FuIGJlIGNyZWF0ZWQgZnJvbSB0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUKLXVzZXIuIFRoaXMgcHJvcGVydHkgY2FuIHRoZW4gYmUgdXNlZCBkdXJpbmcgdGhlIGZvbGxvd2luZyBidWlsZAotcnVuLiBJbnB1dCBiZWhhdmVzIGFjY29yZGluZyB0byA8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eQotdGFzazwvYT4gd2hpY2ggbWVhbnMgdGhhdCBleGlzdGluZyBwcm9wZXJ0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuLgotU2luY2UgQXBhY2hlIEFudCAxLjYsIDxjb2RlPiZsdDtpbnB1dCZndDs8L2NvZGU+IHdpbGwgbm90IHByb21wdCBmb3IgaW5wdXQgaWYKLWEgcHJvcGVydHkgc2hvdWxkIGJlIHNldCBieSB0aGUgdGFzayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZQotcHJvamVjdCAoYW5kIHRoZSB0YXNrIHdvdWxkbid0IGhhdmUgYW55IGVmZmVjdCkuPC9wPgorPHA+T3B0aW9uYWxseSBhIHByb3BlcnR5IGNhbiBiZSBjcmVhdGVkIGZyb20gdGhlIHZhbHVlIGVudGVyZWQgYnkgdGhlIHVzZXIuIFRoaXMgcHJvcGVydHkgY2FuIHRoZW4KK2JlIHVzZWQgZHVyaW5nIHRoZSBmb2xsb3dpbmcgYnVpbGQgcnVuLiA8Y29kZT5JbnB1dDwvY29kZT4gdGhlbiBiZWhhdmVzCithcyA8YSBocmVmPSJwcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eSB0YXNrPC9hPiB3aGljaCBtZWFucyB0aGF0IGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlCitvdmVycmlkZGVuLiAgPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT4sIDxjb2RlPiZsdDtpbnB1dCZndDs8L2NvZGU+IHdpbGwgbm90IHByb21wdCBmb3IgaW5wdXQgaWYKK2EgcHJvcGVydHkgc2hvdWxkIGJlIHNldCBieSB0aGUgdGFzayB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIHRoZSBwcm9qZWN0IChhbmQgdGhlIHRhc2sgd291bGRuJ3QKK2hhdmUgYW55IGVmZmVjdCkuPC9wPgogCi08cD5IaXN0b3JpY2FsbHksIGEgcmVndWxhciBjb21wbGFpbnQgYWJvdXQgdGhpcyB0YXNrIGhhcyBiZWVuIHRoYXQgaXQgZWNob2VzCi1jaGFyYWN0ZXJzIHRvIHRoZSBjb25zb2xlLCB0aGlzIGlzIGEgY3JpdGljYWwgc2VjdXJpdHkgZGVmZWN0LCB3ZSBtdXN0IGZpeCBpdAotaW1tZWRpYXRlbHksIGV0YywgZXRjLiAgVGhpcyBwcm9ibGVtIHdhcyBkdWUgdG8gdGhlIGxhY2sgaW4gZWFybHkgdmVyc2lvbnMgb2YKLUphdmEgb2YgYSAoZnVsbHkgZnVuY3Rpb25hbCkgZmFjaWxpdHkgZm9yIGhhbmRsaW5nIHNlY3VyZSBjb25zb2xlIGlucHV0LgotSW4gSmF2YSAxLjYgdGhhdCBzaG9ydGNvbWluZyBpbiBKYXZhJ3MgQVBJIHdhcyBhZGRyZXNzZWQgYW5kIEFudCB2ZXJzaW9ucyAxLjcuMQotYW5kIDEuOCBoYXZlIGFkZGVkIHN1cHBvcnQgZm9yIEphdmEgMS42J3Mgc2VjdXJlIGNvbnNvbGUgaW5wdXQgZmVhdHVyZQotKHNlZSA8YSBocmVmPSIjaGFuZGxlci50eXBlIj5oYW5kbGVyIHR5cGU8L2E+KS48L3A+Cis8cD5IaXN0b3JpY2FsbHksIGEgcmVndWxhciBjb21wbGFpbnQgYWJvdXQgdGhpcyB0YXNrIGhhcyBiZWVuIHRoYXQgaXQgZWNob2VzIGNoYXJhY3RlcnMgdG8gdGhlCitjb25zb2xlLCB0aGlzIGlzIGEgY3JpdGljYWwgc2VjdXJpdHkgZGVmZWN0LCB3ZSBtdXN0IGZpeCBpdCBpbW1lZGlhdGVseSwgZXRjLCBldGMuICBUaGlzIHByb2JsZW0gd2FzCitkdWUgdG8gdGhlIGxhY2sgaW4gZWFybHkgdmVyc2lvbnMgb2YgSmF2YSBvZiBhIChmdWxseSBmdW5jdGlvbmFsKSBmYWNpbGl0eSBmb3IgaGFuZGxpbmcgc2VjdXJlCitjb25zb2xlIGlucHV0LiAgSW4gSmF2YSA2IHRoYXQgc2hvcnRjb21pbmcgaW4gSmF2YSdzIEFQSSB3YXMgYWRkcmVzc2VkIGFuZCBBbnQgdmVyc2lvbnMgMS43LjEgYW5kCisxLjggaGF2ZSBhZGRlZCBzdXBwb3J0IGZvciBKYXZhIDYgc2VjdXJlIGNvbnNvbGUgaW5wdXQgZmVhdHVyZSAoc2VlIDxhIGhyZWY9IiNoYW5kbGVyLnR5cGUiPmhhbmRsZXIKK3R5cGU8L2E+KS48L3A+CiAKLTxwPgotSURFIGJlaGF2aW91ciBkZXBlbmRzIHVwb24gdGhlIElERTogc29tZSBoYW5nIHdhaXRpbmcgZm9yIGlucHV0LCBzb21lIGxldCB5b3UKLXR5cGUgaXQgaW4uIEZvciB0aGlzIHNpdHVhdGlvbiwgcGxhY2UgdGhlIHBhc3N3b3JkIGluIGEgKHNlY3VyZWQpIHByb3BlcnR5Ci1maWxlIGFuZCBsb2FkIGluIGJlZm9yZSB0aGUgaW5wdXQgdGFzay48L3A+Cis8cD5JREUgYmVoYXZpb3VyIGRlcGVuZHMgdXBvbiB0aGUgSURFOiBzb21lIGhhbmcgd2FpdGluZyBmb3IgaW5wdXQsIHNvbWUgbGV0IHlvdSB0eXBlIGl0IGluLiBGb3IKK3RoaXMgc2l0dWF0aW9uLCBwbGFjZSB0aGUgcGFzc3dvcmQgaW4gYSAoc2VjdXJlZCkgcHJvcGVydHkgZmlsZSBhbmQgbG9hZCBpbiBiZWZvcmUKK3RoZSA8Y29kZT5pbnB1dDwvY29kZT4gdGFzay48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgTWVzc2FnZSB3aGljaCBnZXRzIGRpc3BsYXllZCB0byB0aGUgdXNlcgotICAgIGR1cmluZyB0aGUgYnVpbGQgcnVuLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm1lc3NhZ2U8L3RkPgorICAgIDx0ZD50aGUgTWVzc2FnZSB3aGljaCBnZXRzIGRpc3BsYXllZCB0byB0aGUgdXNlciBkdXJpbmcgdGhlIGJ1aWxkIHJ1bi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbGlkYXJnczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYSBzZXBhcmF0ZWQgU3RyaW5nIGNvbnRhaW5pbmcgdmFsaWQgaW5wdXQKLSAgICBhcmd1bWVudHMuIElmIHNldCwgaW5wdXQgdGFzayB3aWxsIHJlamVjdCBhbnkgaW5wdXQgbm90IGRlZmluZWQKLSAgICBoZXJlLiAgVmFsaWRhcmdzIGFyZSBjb21wYXJlZCBjYXNlIHNlbnNpdGl2ZS4gSWYgeW91IHdhbnQgJ2EnIGFuZAotICAgICdBJyB0byBiZSBhY2NlcHRlZCB5b3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBib3RoIGFyZ3VtZW50cyB3aXRoaW4KLSAgICB2YWxpZGFyZ3MuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dmFsaWRhcmdzPC90ZD4KKyAgICA8dGQ+Y29tbWEgc2VwYXJhdGVkIFN0cmluZyBjb250YWluaW5nIHZhbGlkIGlucHV0IGFyZ3VtZW50cy4gSWYgc2V0LCA8Y29kZT5pbnB1dDwvY29kZT4gdGFzaworICAgICAgd2lsbCByZWplY3QgYW55IGlucHV0IG5vdCBkZWZpbmVkIGhlcmUuIENvbXBhcmlzb24gb2YgaW5wdXQgdG8gPHZhcj52YWxpZGFyZ3M8L3Zhcj4gaXMgY2FzZQorICAgICAgc2Vuc2l0aXZlLiBJZiB5b3Ugd2FudCA8cT5hPC9xPiBhbmQKKyAgICA8cT5BPC9xPiB0byBiZSBhY2NlcHRlZCB5b3Ugd2lsbCBuZWVkIHRvIGRlZmluZSBib3RoIGFyZ3VtZW50cyB3aXRoaW4gPHZhcj52YWxpZGFyZ3M8L3Zhcj4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hZGRwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIGJlIGNyZWF0ZWQgZnJvbQotICAgIGlucHV0LiBCZWhhdmlvdXIgaXMgZXF1YWwgdG8gPGEgaHJlZj0icHJvcGVydHkuaHRtbCI+cHJvcGVydHkKLSAgICB0YXNrPC9hPiB3aGljaCBtZWFucyB0aGF0IGV4aXN0aW5nIHByb3BlcnRpZXMgY2Fubm90IGJlCi0gICAgb3ZlcnJpZGRlbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5hZGRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCBmcm9tIGlucHV0LiBCZWhhdmlvdXIgaXMgZXF1YWwKKyAgICAgIHRvIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPnByb3BlcnR5IHRhc2s8L2E+IHdoaWNoIG1lYW5zIHRoYXQgZXhpc3RpbmcgcHJvcGVydGllcyBjYW5ub3QgYmUKKyAgICAgIG92ZXJyaWRkZW4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUKLSAgICBjcmVhdGVkIGZyb20gaW5wdXQuICBQcm9wZXJ0eSB2YWx1ZSB3aWxsIGJlIHNldCB0byBkZWZhdWx0IGlmIG5vCi0gICAgaW5wdXQgaXMgcmVjZWl2ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdHZhbHVlPC90ZD4KKyAgICA8dGQ+RGVmaW5lcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgY3JlYXRlZCBmcm9tIGlucHV0LiAgUHJvcGVydHkgdmFsdWUgd2lsbCBiZQorICAgICAgc2V0IHRvIGRlZmF1bHQgaWYgbm8gaW5wdXQgaXMgcmVjZWl2ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoMz5QYXJhbWV0ZXJzIFNwZWNpZmllZCBhcyBOZXN0ZWQgRWxlbWVudHM8L2gzPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+SGFuZGxlcjwvaDQ+Ci08cD5TaW5jZSA8Yj5BbnQgMS43PC9iPiwgYSBuZXN0ZWQgJmx0O2hhbmRsZXImZ3Q7IGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8KLXNwZWNpZnkgYW4gSW5wdXRIYW5kbGVyLCBzbyB0aGF0IGRpZmZlcmVudCBJbnB1dEhhbmRsZXJzIG1heSBiZSB1c2VkCi1hbW9uZyBkaWZmZXJlbnQgSW5wdXQgdGFza3MuCis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+LCBhIG5lc3RlZCA8Y29kZT4mbHQ7aGFuZGxlciZndDs8L2NvZGU+IGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorYW4gPGNvZGU+SW5wdXRIYW5kbGVyPC9jb2RlPiwgc28gdGhhdCBkaWZmZXJlbnQgPGNvZGU+SW5wdXRIYW5kbGVyPC9jb2RlPnMgbWF5IGJlIHVzZWQgYW1vbmcKK2RpZmZlcmVudCA8Y29kZT5JbnB1dDwvY29kZT4gdGFza3MuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0ciBpZD0iaGFuZGxlci50eXBlIj4KKyAgICA8dGQ+dHlwZTwvdGQ+CisgICAgPHRkPm9uZSBvZiA8cT5kZWZhdWx0PC9xPiwgPHE+cHJvcGVydHlmaWxlPC9xPiwgPHE+Z3JlZWR5PC9xPiwgb3IgPHE+c2VjdXJlPC9xPiAoPGVtPnNpbmNlIEFudAorICAgICAgMS44PC9lbT4pLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPk9uZSBvZiB0aGVzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxhIG5hbWU9ImhhbmRsZXIudHlwZSIgLz50eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9uZSBvZiAiZGVmYXVsdCIsInByb3BlcnR5ZmlsZSIsICJncmVlZHkiLCBvciAic2VjdXJlIiAoc2luY2UgQW50IDEuOCkuCisgICAgPHRkPnJlZmlkPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlJlZmVyZW5jZSB0byBhbiA8Y29kZT5JbnB1dEhhbmRsZXI8L2NvZGU+IGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZQorICAgICAgcHJvamVjdC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgbmFtZSBvZiBhbiA8Y29kZT5JbnB1dEhhbmRsZXI8L2NvZGU+IHN1YmNsYXNzLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2Ugd2l0aCA8dmFyPmNsYXNzbmFtZTwvdmFyPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIHJlZmlkIG9mIGEgY2xhc3NwYXRoIHRvIHVzZSB3aXRoIDx2YXI+Y2xhc3NuYW1lPC92YXI+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2FkZXJyZWY8L3RkPgorICAgIDx0ZD5UaGUgcmVmaWQgb2YgYSBjbGFzc2xvYWRlciB0byB1c2Ugd2l0aCA8dmFyPmNsYXNzbmFtZTwvdmFyPi4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMyI+T25lIG9mIHRoZXNlPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UmVmZXJlbmNlIHRvIGFuIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4KLSAgICAgICAgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIHByb2plY3QuCi0gICAgPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGFuIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4gc3ViY2xhc3MuPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIHdpdGggPGk+Y2xhc3NuYW1lPC9pPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlZmlkIG9mIGEgY2xhc3NwYXRoIHRvIHVzZSB3aXRoIDxpPmNsYXNzbmFtZTwvaT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9hZGVycmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZWZpZCBvZiBhIGNsYXNzbG9hZGVyIHRvIHVzZSB3aXRoIDxpPmNsYXNzbmFtZTwvaT4uCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxiciAvPgotVGhlIGNsYXNzcGF0aCBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgbWVhbnMgb2Ygb25lIG9yIG1vcmUgbmVzdGVkCi0mbHQ7Y2xhc3NwYXRoJmd0OyBlbGVtZW50cy48L3A+Cis8cD5UaGUgY2xhc3NwYXRoIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBieSBtZWFucyBvZiBvbmUgb3IgbW9yZSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+CitlbGVtZW50cy48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgJmx0O2lucHV0LyZndDs8L3ByZT4KLTxwPldpbGwgcGF1c2UgdGhlIGJ1aWxkIHJ1biB1bnRpbCByZXR1cm4ga2V5IGlzIHByZXNzZWQgd2hlbiB1c2luZyB0aGUKLTxhIGhyZWY9Ii4uL2lucHV0aGFuZGxlci5odG1sI2RlZmF1bHRoYW5kbGVyIj5kZWZhdWx0Ci1JbnB1dEhhbmRsZXI8L2E+LCB0aGUgY29uY3JldGUgYmVoYXZpb3IgaXMgZGVmaW5lZCBieSB0aGUgSW5wdXRIYW5kbGVyCi1pbXBsZW1lbnRhdGlvbiB5b3UgdXNlLjwvcD4KLTxwcmU+ICAmbHQ7aW5wdXQmZ3Q7UHJlc3MgUmV0dXJuIGtleSB0byBjb250aW51ZS4uLiZsdDsvaW5wdXQmZ3Q7PC9wcmU+Ci08cD5XaWxsIGRpc3BsYXkgdGhlIG1lc3NhZ2UgJnF1b3Q7UHJlc3MgUmV0dXJuIGtleSB0bwotY29udGludWUuLi4mcXVvdDsgYW5kIHBhdXNlIHRoZSBidWlsZCBydW4gdW50aWwgcmV0dXJuIGtleSBpcyBwcmVzc2VkCi0oYWdhaW4sIHRoZSBjb25jcmV0ZSBiZWhhdmlvciBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLjwvcD4KLTxwcmU+ICAmbHQ7aW5wdXQKLSAgICBtZXNzYWdlPSZxdW90O1ByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4mcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPldpbGwgZGlzcGxheSB0aGUgbWVzc2FnZSAmcXVvdDtQcmVzcyBSZXR1cm4ga2V5IHRvCi1jb250aW51ZS4uLiZxdW90OyBhbmQgcGF1c2UgdGhlIGJ1aWxkIHJ1biB1bnRpbCByZXR1cm4ga2V5IGlzIHByZXNzZWQKLShzZWUgYWJvdmUpLjwvcD4KKzxwPlBhdXNlIHRoZSBidWlsZCBydW4gdW50aWwgcmV0dXJuIGtleSBpcyBwcmVzc2VkIHdoZW4gdXNpbmcKK3RoZSA8YSBocmVmPSIuLi9pbnB1dGhhbmRsZXIuaHRtbCNkZWZhdWx0aGFuZGxlciI+ZGVmYXVsdCBJbnB1dEhhbmRsZXI8L2E+LCB0aGUgY29uY3JldGUgYmVoYXZpb3IgaXMKK2RlZmluZWQgYnkgdGhlIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4gaW1wbGVtZW50YXRpb24geW91IHVzZS48L3A+Cis8cHJlPiZsdDtpbnB1dC8mZ3Q7PC9wcmU+CisKKzxwPkRpc3BsYXkgdGhlIG1lc3NhZ2UgPHE+UHJlc3MgUmV0dXJuIGtleSB0byBjb250aW51ZS4uLjwvcT4gYW5kIHBhdXNlIHRoZSBidWlsZCBydW4gdW50aWwgcmV0dXJuCitrZXkgaXMgcHJlc3NlZCAoYWdhaW4sIHRoZSBjb25jcmV0ZSBiZWhhdmlvciBpcyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQpLjwvcD4KKzxwcmU+Jmx0O2lucHV0Jmd0O1ByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi4mbHQ7L2lucHV0Jmd0OzwvcHJlPgorCis8cD5EaXNwbGF5IHRoZSBtZXNzYWdlIDxxPlByZXNzIFJldHVybiBrZXkgdG8gY29udGludWUuLi48L3E+IGFuZCBwYXVzZSB0aGUgYnVpbGQgcnVuIHVudGlsIHJldHVybgora2V5IGlzIHByZXNzZWQgKHNlZSBhYm92ZSkuPC9wPgorPHByZT4mbHQ7aW5wdXQgbWVzc2FnZT0mcXVvdDtQcmVzcyBSZXR1cm4ga2V5IHRvIGNvbnRpbnVlLi4uJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+RGlzcGxheSB0aGUgbWVzc2FnZSA8cT5BbGwgZGF0YSBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gREIgY29udGludWUgKHkvbik/PC9xPiBhbmQKK3JlcXVpcmUgPHE+eTwvcT4gdG8gY29udGludWUgYnVpbGQgb3IgPHE+bjwvcT4gdG8gZXhpdCBidWlsZCB3aXRoIGZvbGxvd2luZyBtZXNzYWdlIDxxPkJ1aWxkIGFib3J0ZWQKK2J5IHVzZXIuPC9xPi48L3A+CiA8cHJlPgotICAmbHQ7aW5wdXQKLSAgICBtZXNzYWdlPSZxdW90O0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSBEQiBjb250aW51ZSAoeS9uKT8mcXVvdDsKLSAgICB2YWxpZGFyZ3M9JnF1b3Q7eSxuJnF1b3Q7Ci0gICAgYWRkcHJvcGVydHk9JnF1b3Q7ZG8uZGVsZXRlJnF1b3Q7Ci0gIC8mZ3Q7Ci0gICZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7Ci0gICAgJmx0O2VxdWFscyBhcmcxPSZxdW90O24mcXVvdDsgYXJnMj0mcXVvdDske2RvLmRlbGV0ZX0mcXVvdDsvJmd0OwotICAmbHQ7L2NvbmRpdGlvbiZndDsKLSAgJmx0O2ZhaWwgaWY9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7QnVpbGQgYWJvcnRlZCBieSB1c2VyLiZsdDsvZmFpbCZndDsKKyZsdDtpbnB1dCBtZXNzYWdlPSZxdW90O0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSBEQiBjb250aW51ZSAoeS9uKT8mcXVvdDsKKyAgICAgICB2YWxpZGFyZ3M9JnF1b3Q7eSxuJnF1b3Q7CisgICAgICAgYWRkcHJvcGVydHk9JnF1b3Q7ZG8uZGVsZXRlJnF1b3Q7LyZndDsKKyZsdDtjb25kaXRpb24gcHJvcGVydHk9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7CisgICZsdDtlcXVhbHMgYXJnMT0mcXVvdDtuJnF1b3Q7IGFyZzI9JnF1b3Q7JHtkby5kZWxldGV9JnF1b3Q7LyZndDsKKyZsdDsvY29uZGl0aW9uJmd0OworJmx0O2ZhaWwgaWY9JnF1b3Q7ZG8uYWJvcnQmcXVvdDsmZ3Q7QnVpbGQgYWJvcnRlZCBieSB1c2VyLiZsdDsvZmFpbCZndDsKIDwvcHJlPgotPHA+V2lsbCBkaXNwbGF5IHRoZSBtZXNzYWdlICZxdW90O0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbQotREIgY29udGludWUgKHkvbik/JnF1b3Q7IGFuZCByZXF1aXJlICd5JyB0byBjb250aW51ZSBidWlsZCBvciAnbicgdG8KLWV4aXQgYnVpbGQgd2l0aCBmb2xsb3dpbmcgbWVzc2FnZSAmcXVvdDtCdWlsZCBhYm9ydGVkIGJ5Ci11c2VyLiZxdW90Oy48L3A+Ci08cHJlPiAgJmx0O2lucHV0Ci0gICAgbWVzc2FnZT0mcXVvdDtQbGVhc2UgZW50ZXIgZGItdXNlcm5hbWU6JnF1b3Q7Ci0gICAgYWRkcHJvcGVydHk9JnF1b3Q7ZGIudXNlciZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+V2lsbCBkaXNwbGF5IHRoZSBtZXNzYWdlICZxdW90O1BsZWFzZSBlbnRlciBkYi11c2VybmFtZTomcXVvdDsgYW5kIHNldCB0aGUKLXByb3BlcnR5IDxjb2RlPmRiLnVzZXI8L2NvZGU+IHRvIHRoZSB2YWx1ZSBlbnRlcmVkIGJ5IHRoZSB1c2VyLjwvcD4KIAotPHByZT4gICZsdDtpbnB1dAotICAgIG1lc3NhZ2U9JnF1b3Q7UGxlYXNlIGVudGVyIGRiLXVzZXJuYW1lOiZxdW90OwotICAgIGFkZHByb3BlcnR5PSZxdW90O2RiLnVzZXImcXVvdDsKLSAgICBkZWZhdWx0dmFsdWU9JnF1b3Q7U2NvdHQtVGlnZXImcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPlNhbWUgYXMgYWJvdmUsIGJ1dCB3aWxsIHNldCA8Y29kZT5kYi51c2VyPC9jb2RlPiB0byB0aGUgdmFsdWUKLTxpPlNjb3R0LSBUaWdlcjwvaT4gaWYgdGhlIHVzZXIgZW50ZXJzIG5vIHZhbHVlIChzaW1wbHkgdHlwZXMKLSZsdDtyZXR1cm4mZ3Q7KS48L3A+Cis8cD5EaXNwbGF5IHRoZSBtZXNzYWdlIDxxPlBsZWFzZSBlbnRlciBkYi11c2VybmFtZTo8L3E+IGFuZCBzZXQgdGhlIHByb3BlcnR5IDxjb2RlPmRiLnVzZXI8L2NvZGU+IHRvCit0aGUgdmFsdWUgZW50ZXJlZCBieSB0aGUgdXNlci48L3A+Cis8cHJlPgorJmx0O2lucHV0IG1lc3NhZ2U9JnF1b3Q7UGxlYXNlIGVudGVyIGRiLXVzZXJuYW1lOiZxdW90OworICAgICAgIGFkZHByb3BlcnR5PSZxdW90O2RiLnVzZXImcXVvdDsvJmd0OzwvcHJlPgogCis8cD5TYW1lIGFzIGFib3ZlLCBidXQgc2V0IDxjb2RlPmRiLnVzZXI8L2NvZGU+IHRvIHRoZSB2YWx1ZSA8cT5TY290dC1UaWdlcjwvcT4gaWYgdGhlIHVzZXIgZW50ZXJzIG5vCit2YWx1ZSAoc2ltcGx5IHByZXNzZXMgPHE+cmV0dXJuPC9xPikuPC9wPgorPHByZT4KKyZsdDtpbnB1dCBtZXNzYWdlPSZxdW90O1BsZWFzZSBlbnRlciBkYi11c2VybmFtZTomcXVvdDsKKyAgICAgICBhZGRwcm9wZXJ0eT0mcXVvdDtkYi51c2VyJnF1b3Q7CisgICAgICAgZGVmYXVsdHZhbHVlPSZxdW90O1Njb3R0LVRpZ2VyJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2phci5odG1sIGIvbWFudWFsL1Rhc2tzL2phci5odG1sCmluZGV4IDFkZjJlZTAuLjU4MWFlNGIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9qYXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvamFyLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw1MzQgKzE1LDQ3NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SmFyIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphciI+SmFyPC9hPjwvaDI+Cis8aDIgaWQ9ImphciI+SmFyPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiA8cD5KYXJzIGEgc2V0IG9mIGZpbGVzLjwvcD4KLTxwPlRoZSA8aT5iYXNlZGlyPC9pPiBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byBqYXIuPC9wPgorPHA+VGhlIDx2YXI+YmFzZWRpcjwvdmFyPiBhdHRyaWJ1dGUgaXMgdGhlIHJlZmVyZW5jZSBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0byBqYXIuPC9wPgogPHA+Tm90ZSB0aGF0IGZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSByZXN1bHRpbmcgamFyZmlsZS48L3A+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBqYXJyZWQuIFRoaXMgY2FuIGJlCi1kb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci1hdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCi1oYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQotaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAotc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLSg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+YmFzZWRpcjwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAotPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgotPHA+WW91IGNhbiBhbHNvIHVzZSBuZXN0ZWQgZmlsZSBzZXRzIGZvciBtb3JlIGZsZXhpYmlsaXR5LCBhbmQgc3BlY2lmeQotbXVsdGlwbGUgb25lcyB0byBtZXJnZSB0b2dldGhlciBkaWZmZXJlbnQgdHJlZXMgb2YgZmlsZXMgaW50byBvbmUgSkFSLgotVGhlIGV4dGVuZGVkIGZpbGVzZXQgYW5kIGdyb3VwZmlsZXNldCBjaGlsZCBlbGVtZW50cyBmcm9tIHRoZSB6aXAgdGFzayBhcmUKLWFsc28gYXZhaWxhYmxlIGluIHRoZSBqYXIgdGFzay4KLVNlZSB0aGUgPGEgaHJlZj0iemlwLmh0bWwiPlppcDwvYT4gdGFzayBmb3IgbW9yZSBkZXRhaWxzIGFuZCBleGFtcGxlcy48L3A+CiAKLTxwPlRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgaWYgdGhlIEpBUgotZmlsZSBhbHJlYWR5IGV4aXN0cy4gV2hlbiBzZXQgdG8gPGNvZGU+eWVzPC9jb2RlPiwgdGhlIEpBUiBmaWxlIGlzCi11cGRhdGVkIHdpdGggdGhlIGZpbGVzIHNwZWNpZmllZC4gV2hlbiBzZXQgdG8gPGNvZGU+bm88L2NvZGU+ICh0aGUKLWRlZmF1bHQpIHRoZSBKQVIgZmlsZSBpcyBvdmVyd3JpdHRlbi4gQW4gZXhhbXBsZSB1c2Ugb2YgdGhpcyBpcwotcHJvdmlkZWQgaW4gdGhlIDxhIGhyZWY9InppcC5odG1sIj5aaXAgdGFzayBkb2N1bWVudGF0aW9uPC9hPi4gIFBsZWFzZQotbm90ZSB0aGF0IFpJUCBmaWxlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkKLW9mIHR3byBzZWNvbmRzLiAgSWYgYSBmaWxlIGlzIGxlc3MgdGhhbiB0d28gc2Vjb25kcyBuZXdlciB0aGFuIHRoZQotZW50cnkgaW4gdGhlIGFyY2hpdmUsIEFudCB3aWxsIG5vdCBjb25zaWRlciBpdCBuZXdlci48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBqYXJyZWQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAordGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4sIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+LCA8dmFyPmV4Y2x1ZGVzPC92YXI+LCA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPgorYW5kIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4gb3IgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4KK2F0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDx2YXI+ZXhjbHVkZTwvdmFyPgorb3IgPHZhcj5leGNsdWRlc2ZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcworYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZCBmaW5hbGx5IHdpdGggdGhlIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5Cit3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24KK29uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+CisKKzxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0CithdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDx2YXI+ZGlyPC92YXI+IGJlY29tZXMgPHZhcj5iYXNlZGlyPC92YXI+KSBhcyB3ZWxsIGFzCit0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPllvdSBjYW4gYWxzbyB1c2UgbmVzdGVkIGZpbGUgc2V0cyBmb3IgbW9yZSBmbGV4aWJpbGl0eSwgYW5kIHNwZWNpZnkgbXVsdGlwbGUgb25lcyB0byBtZXJnZQordG9nZXRoZXIgZGlmZmVyZW50IHRyZWVzIG9mIGZpbGVzIGludG8gb25lIEpBUi4gIFRoZSBleHRlbmRlZCA8Y29kZT5maWxlc2V0PC9jb2RlPgorYW5kIDxjb2RlPmdyb3VwZmlsZXNldDwvY29kZT4gY2hpbGQgZWxlbWVudHMgZnJvbSB0aGUgPGNvZGU+emlwPC9jb2RlPiB0YXNrIGFyZSBhbHNvIGF2YWlsYWJsZSBpbgordGhlIDxjb2RlPmphcjwvY29kZT4gdGFzay4gIFNlZSB0aGUgPGEgaHJlZj0iemlwLmh0bWwiPlppcDwvYT4gdGFzayBmb3IgbW9yZSBkZXRhaWxzIGFuZAorZXhhbXBsZXMuPC9wPgorCis8cD5UaGUgPHZhcj51cGRhdGU8L3Zhcj4gcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyBpZiB0aGUgSkFSIGZpbGUgYWxyZWFkeSBleGlzdHMuIFdoZW4gc2V0Cit0byA8cT55ZXM8L3E+LCB0aGUgSkFSIGZpbGUgaXMgdXBkYXRlZCB3aXRoIHRoZSBmaWxlcyBzcGVjaWZpZWQuIFdoZW4gc2V0IHRvIDxxPm5vPC9xPiAodGhlIGRlZmF1bHQpCit0aGUgSkFSIGZpbGUgaXMgb3ZlcndyaXR0ZW4uIEFuIGV4YW1wbGUgdXNlIG9mIHRoaXMgaXMgcHJvdmlkZWQgaW4gdGhlIDxhIGhyZWY9InppcC5odG1sIj5aaXAgdGFzaworZG9jdW1lbnRhdGlvbjwvYT4uICBQbGVhc2Ugbm90ZSB0aGF0IFpJUCBmaWxlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YgMgorc2Vjb25kcy4gIElmIGEgZmlsZSBpcyBsZXNzIHRoYW4gMiBzZWNvbmRzIG5ld2VyIHRoYW4gdGhlIGVudHJ5IGluIHRoZSBhcmNoaXZlLCBBbnQgd2lsbCBub3QKK2NvbnNpZGVyIGl0IG5ld2VyLjwvcD4KIAogPHA+SWYgdGhlIG1hbmlmZXN0IGlzIG9taXR0ZWQsIGEgc2ltcGxlIG9uZSB3aWxsIGJlIHN1cHBsaWVkIGJ5IEFwYWNoZSBBbnQuPC9wPgogCi08cD5UaGUgPGNvZGU+d2hlbm1hbmlmZXN0b25seTwvY29kZT4gcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyB3aGVuIG5vCi1maWxlcywgYXBhcnQgZnJvbSB0aGUgbWFuaWZlc3QgZmlsZSwgb3IgbmVzdGVkIHNlcnZpY2VzLCBtYXRjaC4KLUlmIDxjb2RlPnNraXA8L2NvZGU+LCB0aGUgSkFSIGlzIG5vdCBjcmVhdGVkIGFuZCBhIHdhcm5pbmcgaXMgaXNzdWVkLgotSWYgPGNvZGU+ZmFpbDwvY29kZT4sIHRoZSBKQVIgaXMgbm90IGNyZWF0ZWQgYW5kIHRoZSBidWlsZCBpcyBoYWx0ZWQgd2l0aCBhbiBlcnJvci4KLUlmIDxjb2RlPmNyZWF0ZTwvY29kZT4sIChkZWZhdWx0KSBhbiBlbXB0eSBKQVIgZmlsZSAob25seSBjb250YWluaW5nIGEgbWFuaWZlc3QgYW5kIHNlcnZpY2VzKQotaXMgY3JlYXRlZC48L3A+Cis8cD5UaGUgPHZhcj53aGVubWFuaWZlc3Rvbmx5PC92YXI+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgd2hlbiBubyBmaWxlcywgYXBhcnQgZnJvbSB0aGUKK21hbmlmZXN0IGZpbGUsIG9yIG5lc3RlZCBzZXJ2aWNlcywgbWF0Y2guICBJZiA8cT5za2lwPC9xPiwgdGhlIEpBUiBpcyBub3QgY3JlYXRlZCBhbmQgYSB3YXJuaW5nIGlzCitpc3N1ZWQuICBJZiA8cT5mYWlsPC9xPiwgdGhlIEpBUiBpcyBub3QgY3JlYXRlZCBhbmQgdGhlIGJ1aWxkIGlzIGhhbHRlZCB3aXRoIGFuIGVycm9yLgorSWYgPHE+Y3JlYXRlPC9xPiAoZGVmYXVsdCksIGFuIGVtcHR5IEpBUiBmaWxlIChvbmx5IGNvbnRhaW5pbmcgYSBtYW5pZmVzdCBhbmQgc2VydmljZXMpIGlzCitjcmVhdGVkLjwvcD4KIAotPHA+KFRoZSBKYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBtYW5pZmVzdCBmaWxlIG9mIGEgSkFSIGZpbGUuCi1UaGUgc2FtZSB0aGluZyBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5IHVzaW5nIHRoZSA8aT5mdWxscGF0aDwvaT4KLWF0dHJpYnV0ZSBvZiBhIHppcGZpbGVzZXQgaW4gYSBaaXAgdGFzay4gVGhlIG9uZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgdGhlCi08aT5tYW5pZmVzdDwvaT4gYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBKYXIgdGFzayB3aWxsCi1pbmNsdWRlIGFuIGVtcHR5IG9uZSBmb3IgeW91Lik8L3A+Cis8cD4oVGhlIDxjb2RlPkphcjwvY29kZT4gdGFzayBoYXMgYSBzaG9ydGN1dCBmb3Igc3BlY2lmeWluZyB0aGUgbWFuaWZlc3QgZmlsZSBvZiBhIEpBUiBmaWxlLiAgVGhlCitzYW1lIHRoaW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgdGhlIDx2YXI+ZnVsbHBhdGg8L3Zhcj4gYXR0cmlidXRlIG9mCithIDxjb2RlPnppcGZpbGVzZXQ8L2NvZGU+IGluIGEgPGNvZGU+WmlwPC9jb2RlPiB0YXNrLiBUaGUgb25lIGRpZmZlcmVuY2UgaXMgdGhhdCBpZgordGhlIDx2YXI+bWFuaWZlc3Q8L3Zhcj4gYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSA8Y29kZT5KYXI8L2NvZGU+IHRhc2sgd2lsbCBpbmNsdWRlIGFuIGVtcHR5CitvbmUgZm9yIHlvdS4pPC9wPgogCi08cD5NYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgSmFyIHRhc2sgYWNjb3JkaW5nIHRvIHRoZQotPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phci9qYXIuaHRtbCI+SmFyIGZpbGUgc3BlY2lmaWNhdGlvbi48L2E+Ci1Ob3RlIGluIHBhcnRpY3VsYXIgdGhhdCB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3QgbGluZXMgZ3JlYXRlciB0aGFuIDcyIGJ5dGVzCi1iZWluZyB3cmFwcGVkIGFuZCBjb250aW51ZWQgb24gdGhlIG5leHQgbGluZS48L3A+Cis8cD5NYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgPGNvZGU+SmFyPC9jb2RlPiB0YXNrIGFjY29yZGluZyB0bwordGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwiIHRhcmdldD0iX3RvcCI+SmFyCitmaWxlIHNwZWNpZmljYXRpb24uPC9hPiAgTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0IGxpbmVzIGdyZWF0ZXIgdGhhbiA3MgorYnl0ZXMgYmVpbmcgd3JhcHBlZCBhbmQgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmUuPC9wPgogCi08cD5UaGUgSmFyIHRhc2sgY2hlY2tzIHdoZXRoZXIgeW91IHNwZWNpZmllZCBwYWNrYWdlIGluZm9ybWF0aW9uIGFjY29yZGluZyB0byB0aGUKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy92ZXJzaW9uaW5nL3NwZWMvdmVyc2lvbmluZzIuaHRtbCN3cDkwNzc5Ij4KLXZlcnNpb25pbmcgc3BlY2lmaWNhdGlvbjwvYT4uPC9wPgorPHA+VGhlIDxjb2RlPkphcjwvY29kZT4gdGFzayBjaGVja3Mgd2hldGhlciB5b3Ugc3BlY2lmaWVkIHBhY2thZ2UgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3ZlcnNpb25pbmcvc3BlYy92ZXJzaW9uaW5nMi5odG1sI3dwOTA3NzkiCit0YXJnZXQ9Il90b3AiPnZlcnNpb25pbmcgc3BlY2lmaWNhdGlvbjwvYT4uPC9wPgogCi08cD48Yj5QbGVhc2Ugbm90ZSB0aGF0IHRoZSB6aXAgZm9ybWF0IGFsbG93cyBtdWx0aXBsZSBmaWxlcyBvZiB0aGUgc2FtZQotZnVsbHktcXVhbGlmaWVkIG5hbWUgdG8gZXhpc3Qgd2l0aGluIGEgc2luZ2xlIGFyY2hpdmUuIFRoaXMgaGFzIGJlZW4KLWRvY3VtZW50ZWQgYXMgY2F1c2luZyB2YXJpb3VzIHByb2JsZW1zIGZvciB1bnN1c3BlY3RpbmcgdXNlcnMuIElmIHlvdSB3aXNoCi10byBhdm9pZCB0aGlzIGJlaGF2aW9yIHlvdSBtdXN0IHNldCB0aGUgPGNvZGU+ZHVwbGljYXRlPC9jb2RlPiBhdHRyaWJ1dGUKLXRvIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdCwgPGNvZGU+ImFkZCI8L2NvZGU+LjwvYj48L3A+Cis8cD48c3Ryb25nPlBsZWFzZSBub3RlIHRoYXQgdGhlIFpJUCBmb3JtYXQgYWxsb3dzIG11bHRpcGxlIGZpbGVzIG9mIHRoZSBzYW1lIGZ1bGx5LXF1YWxpZmllZCBuYW1lIHRvCitleGlzdCB3aXRoaW4gYSBzaW5nbGUgYXJjaGl2ZS4gVGhpcyBoYXMgYmVlbiBkb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IgdW5zdXNwZWN0aW5nCit1c2Vycy4gSWYgeW91IHdpc2ggdG8gYXZvaWQgdGhpcyBiZWhhdmlvciB5b3UgbXVzdCBzZXQgdGhlIDx2YXI+ZHVwbGljYXRlPC92YXI+IGF0dHJpYnV0ZSB0byBhIHZhbHVlCitvdGhlciB0aGFuIGl0cyBkZWZhdWx0LCA8cT5hZGQ8L3E+Ljwvc3Ryb25nPjwvcD4KIAotPHA+VG8gY3J5cHRvZ3JhcGhpY2FsbHkgc2lnbiB5b3VyIEpBUiBmaWxlLCB1c2UgdGhlIDxhIGhyZWY9InNpZ25qYXIuaHRtbCI+U2lnbkphciB0YXNrPC9hPiBvbiB0aGUgSkFSIHRoYXQgeW91IGNyZWF0ZSBmcm9tIHRoaXMgdGFzay48L3A+Cis8cD5UbyBjcnlwdG9ncmFwaGljYWxseSBzaWduIHlvdXIgSkFSIGZpbGUsIHVzZSB0aGUgPGEgaHJlZj0ic2lnbmphci5odG1sIj5TaWduSmFyIHRhc2s8L2E+IG9uIHRoZQorSkFSIHRoYXQgeW91IGNyZWF0ZSBmcm9tIHRoaXMgdGFzay48L3A+CisKKzxwPkZvciBjcmVhdGluZyBhIHNpbXBsZSB2ZXJzaW9uIG9mIGEgPGEgaHJlZj0iaHR0cHM6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMjM4IiB0YXJnZXQ9Il90b3AiPkpFUAorMjM4IG11bHRpLXJlbGVhc2UgamFyPC9hPiwgeW91IGRvbid0IG5lZWQgYW55IHNwZWNpYWwgdG9vbHMuIEp1c3Qgc2V0IHRoZQorcmVxdWlyZWQgPGNvZGU+bWFuaWZlc3Q8L2NvZGU+IGVudHJ5IGFuZCBwbGFjZSB0aGUgZmlsZXMgd2hlcmUgcmVxdWlyZWQsIGFzIHlvdSBjb3VsZCBzZWUgaW4KK3RoZSA8YSBocmVmPSIjamVwMjM4LWV4YW1wbGUiPkpFUCAyMzggZXhhbXBsZTwvYT4uIElmIHlvdSB3YW50IHRvIHR1bmUgdGhpcyBraW5kIG9mIGphciwKK2UuZy4gZGVjcmVhc2luZyB0aGUgc2l6ZSBieSBkZWxldGluZyAnc2FtZScgY2xhc3NlcyBmcm9tIHRoZSB2ZXJzaW9ucy1icmFuY2hlcywgeW91IGhhdmUgdG8gZG8gbW9yZQorLi4uPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBKQVIgZmlsZSB0byBjcmVhdGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQ+dGhlIEpBUiBmaWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byBqYXIgdGhlIGZpbGVzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmJhc2VkaXI8L3RkPgorICAgIDx0ZD50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gamFyIHRoZSBmaWxlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbSwKLSAgICBkZWZhdWx0cyB0byB0cnVlLiAgVW5sZXNzIHlvdSBzZXQgdGhlIDxlbT5rZWVwY29tcHJlc3Npb248L2VtPgotICAgIGF0dHJpYnV0ZSB0byBmYWxzZSwgdGhpcyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgYXJjaGl2ZSwgbm90Ci0gICAgb25seSB0aGUgZmlsZXMgeW91J3ZlIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNvbXByZXNzPC90ZD4KKyAgICA8dGQ+Tm90IG9ubHkgc3RvcmUgZGF0YSBidXQgYWxzbyBjb21wcmVzcyB0aGVtLiAgVW5sZXNzIHlvdSBzZXQgdGhlIDx2YXI+a2VlcGNvbXByZXNzaW9uPC92YXI+CisgICAgICBhdHRyaWJ1dGUgdG8gPHE+ZmFsc2U8L3E+LCB0aGlzIHdpbGwgYXBwbHkgdG8gdGhlIGVudGlyZSBhcmNoaXZlLCBub3Qgb25seSB0aGUgZmlsZXMgeW91J3ZlCisgICAgICBhZGRlZCB3aGlsZSB1cGRhdGluZy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwY29tcHJlc3Npb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Rm9yIGVudHJpZXMgY29taW5nIGZyb20gZXhpc3RpbmcgYXJjaGl2ZXMgKGxpa2UKLSAgICBuZXN0ZWQgPGVtPnppcGZpbGVzZXQ8L2VtPnMgb3Igd2hpbGUgdXBkYXRpbmcgdGhlIGFyY2hpdmUpLCBrZWVwCi0gICAgdGhlIGNvbXByZXNzaW9uIGFzIGl0IGhhcyBiZWVuIG9yaWdpbmFsbHkgaW5zdGVhZCBvZiB1c2luZyB0aGUKLSAgICA8ZW0+Y29tcHJlc3M8L2VtPiBhdHRyaWJ1dGUuICBEZWZhdWx0cyBmYWxzZS4gIDxlbT5TaW5jZSBBbnQKLSAgICAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmtlZXBjb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkPkZvciBlbnRyaWVzIGNvbWluZyBmcm9tIGV4aXN0aW5nIGFyY2hpdmVzIChsaWtlIG5lc3RlZCA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPnMgb3Igd2hpbGUKKyAgICAgIHVwZGF0aW5nIHRoZSBhcmNoaXZlKSwga2VlcCB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIDx2YXI+Y29tcHJlc3M8L3Zhcj4gYXR0cmlidXRlLiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCi0gICAgICBpbnNpZGUgdGhlIGFyY2hpdmUuICBEZWZhdWx0cyB0byBVVEY4LiA8c3Ryb25nPkl0IGlzIG5vdAotICAgICAgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsCi0gICAgICBtb3N0IGxpa2VseSBiZSB1bnJlYWRhYmxlIGZvciBKYXZhIG90aGVyd2lzZS48L3N0cm9uZz4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZQotICAgICAgemlwIHRhc2sgcGFnZTwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgaW5zaWRlIHRoZSBhcmNoaXZlLiA8c3Ryb25nPkl0IGlzIG5vdAorICAgICAgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3QgbGlrZWx5IGJlIHVucmVhZGFibGUgZm9yCisgICAgICBKYXZhIG90aGVyd2lzZS48L3N0cm9uZz4gIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAKKyAgICAgIHRhc2sgcGFnZTwvYT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+VVRGODwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc29ubHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmlsZXNvbmx5PC90ZD4KKyAgICA8dGQ+U3RvcmUgb25seSBmaWxlIGVudHJpZXM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAotICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90ICg8cT55ZXN8bm88L3E+KTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuaWZlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLiAgVGhpcyBjYW4gYmUgZWl0aGVyIHRoZSBsb2NhdGlvbiBvZiBhIG1hbmlmZXN0LCBvciB0aGUgbmFtZSBvZiBhIGphciBhZGRlZCB0aHJvdWdoIGEgZmlsZXNldC4gIElmIGl0cyB0aGUgbmFtZSBvZiBhbiBhZGRlZCBqYXIsIHRoZSB0YXNrIGV4cGVjdHMgdGhlIG1hbmlmZXN0IHRvIGJlIGluIHRoZSBqYXIgYXQgTUVUQS1JTkYvTUFOSUZFU1QuTUY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYW5pZmVzdDwvdGQ+CisgICAgPHRkPnRoZSBtYW5pZmVzdCBmaWxlIHRvIHVzZS4gIFRoaXMgY2FuIGJlIGVpdGhlciB0aGUgbG9jYXRpb24gb2YgYSBtYW5pZmVzdCwgb3IgdGhlIG5hbWUgb2YgYQorICAgICAgamFyIGFkZGVkIHRocm91Z2ggYSBmaWxlc2V0LiAgSWYgaXRzIHRoZSBuYW1lIG9mIGFuIGFkZGVkIGphciwgdGhlIHRhc2sgZXhwZWN0cyB0aGUgbWFuaWZlc3QKKyAgICAgIHRvIGJlIGluIHRoZSBqYXIgYXQgPHNhbXA+TUVUQS1JTkYvTUFOSUZFU1QuTUY8L3NhbXA+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc2V0bWFuaWZlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIE1hbmlmZXN0IGlzIGZvdW5kIGluIGEgemlwZmlsZXNldCBvciB6aXBncm91cGZpbGVzZXQgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7c2tpcCZxdW90OywgJnF1b3Q7bWVyZ2UmcXVvdDssIGFuZCAmcXVvdDttZXJnZXdpdGhvdXRtYWluJnF1b3Q7LiAgJnF1b3Q7bWVyZ2UmcXVvdDsgd2lsbCBtZXJnZSBhbGwgb2YgdGhlIG1hbmlmZXN0cyB0b2dldGhlciwgYW5kIG1lcmdlIHRoaXMgaW50byBhbnkgb3RoZXIgc3BlY2lmaWVkIG1hbmlmZXN0cy4gICZxdW90O21lcmdld2l0aG91dG1haW4mcXVvdDsgbWVyZ2VzIGV2ZXJ5dGhpbmcgYnV0IHRoZSBNYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0cy4gIERlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7c2tpcCZxdW90Oy4KKyAgICA8dGQ+ZmlsZXNldG1hbmlmZXN0PC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBhIG1hbmlmZXN0IGlzIGZvdW5kIGluIGEgPGNvZGU+emlwZmlsZXNldDwvY29kZT4KKyAgICAgIG9yIDxjb2RlPnppcGdyb3VwZmlsZXNldDwvY29kZT4gZmlsZS4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+c2tpcDwvcT4sIDxxPm1lcmdlPC9xPiwKKyAgICAgIGFuZCA8cT5tZXJnZXdpdGhvdXRtYWluPC9xPi4gIDxxPm1lcmdlPC9xPiB3aWxsIG1lcmdlIGFsbCBvZiB0aGUgbWFuaWZlc3RzIHRvZ2V0aGVyLCBhbmQgbWVyZ2UKKyAgICAgIHRoaXMgaW50byBhbnkgb3RoZXIgc3BlY2lmaWVkIG1hbmlmZXN0cy4gIDxxPm1lcmdld2l0aG91dG1haW48L3E+IG1lcmdlcyBldmVyeXRoaW5nIGJ1dCB0aGUKKyAgICAgIE1haW4gc2VjdGlvbiBvZiB0aGUgbWFuaWZlc3RzLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5za2lwPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZGF0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRlCi0gICAgICB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dXBkYXRlPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZSB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0czwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVubWFuaWZlc3Rvbmx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssIGFuZCAmcXVvdDtjcmVhdGUmcXVvdDsuICBEZWZhdWx0IGlzICZxdW90O2NyZWF0ZSZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD53aGVubWFuaWZlc3Rvbmx5PC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+ZmFpbDwvcT4sIDxxPnNraXA8L3E+LAorICAgICAgYW5kIDxxPmNyZWF0ZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmNyZWF0ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kdXBsaWNhdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSAmcXVvdDthZGQmcXVvdDssICZxdW90O3ByZXNlcnZlJnF1b3Q7LCBhbmQgJnF1b3Q7ZmFpbCZxdW90Oy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzICZxdW90O2FkZCZxdW90Oy4gIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmR1cGxpY2F0ZTwvdGQ+CisgICAgPHRkPmJlaGF2aW9yIHdoZW4gYSBkdXBsaWNhdGUgZmlsZSBpcyBmb3VuZC4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+YWRkPC9xPiwgPHE+cHJlc2VydmU8L3E+LAorICAgICAgYW5kIDxxPmZhaWw8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5hZGQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kZXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBjcmVhdGUgYW4gPEEKLSAgICBIUkVGPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjSkFSX0luZGV4Ij5pbmRleAotICAgIGxpc3Q8L0E+IHRvIHNwZWVkIHVwIGNsYXNzbG9hZGluZy4gIFRoaXMgaXMgYSBKREsgMS4zKyBzcGVjaWZpYwotICAgIGZlYXR1cmUuICBVbmxlc3MgeW91IHNwZWNpZnkgYWRkaXRpb25hbCBqYXJzIHdpdGggbmVzdGVkIDxhCi0gICAgaHJlZj0iI2luZGV4amFycyI+PGNvZGU+aW5kZXhqYXJzPC9jb2RlPjwvYT4gZWxlbWVudHMsIG9ubHkgdGhlCi0gICAgY29udGVudHMgb2YgdGhpcyBqYXIgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgaW5kZXguICBEZWZhdWx0cyB0bwotICAgIGZhbHNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluZGV4PC90ZD4KKyAgICA8dGQ+d2hldGhlciB0byBjcmVhdGUKKyAgICAgIGFuIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjSkFSX0luZGV4IgorICAgICAgdGFyZ2V0PSJfdG9wIj5pbmRleCBsaXN0PC9hPiB0byBzcGVlZCB1cCBjbGFzc2xvYWRpbmcuICBUaGlzIGlzIGEgSkRLIDEuMysgc3BlY2lmaWMgZmVhdHVyZS4KKyAgICAgIFVubGVzcyB5b3Ugc3BlY2lmeSBhZGRpdGlvbmFsIGphcnMgd2l0aCBuZXN0ZWQgPGEgaHJlZj0iI2luZGV4amFycyI+PGNvZGU+aW5kZXhqYXJzPC9jb2RlPjwvYT4KKyAgICAgIGVsZW1lbnRzLCBvbmx5IHRoZSBjb250ZW50cyBvZiB0aGlzIGphciB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBpbmRleC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kZXhNZXRhSW5mPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdG8gaW5jbHVkZSBNRVRBLUlORiBhbmQgaXRzIGNoaWxkcmVuIGluCi0gICAgICB0aGUgaW5kZXguICBEb2Vzbid0IGhhdmUgYW55IGVmZmVjdCBpZiA8ZW0+aW5kZXg8L2VtPiBpcwotICAgICAgZmFsc2UuPGJyLz4KLSAgICAgIFN1bidzIGphciBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIHNraXAgdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSBhbmQKLSAgICAgIEFudCBmb2xsb3dlZCB0aGF0IGV4YW1wbGUuICBUaGUgYmVoYXZpb3IgaGFzIGJlZW4gY2hhbmdlZCB3aXRoCi0gICAgICA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTQ0MDg1MjYiPkphdmEKLSAgICAgIDU8L2E+LiAgSW4gb3JkZXIgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBBbnQgZ2VuZXJhdGVkIGphcnMgb24KLSAgICAgIEphdmEgMS40IG9yIGVhcmxpZXIgQW50IHdpbGwgbm90IGluY2x1ZGUgTUVUQS1JTkYgdW5sZXNzCi0gICAgICBleHBsaWNpdGx5IGFza2VkIHRvLjxici8+Ci0gICAgICA8ZW0+QW50IDEuOC4wPC9lbT4gLSBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmRleE1ldGFJbmY8L3RkPgorICAgIDx0ZD53aGV0aGVyIHRvIGluY2x1ZGUgPHNhbXA+TUVUQS1JTkY8L3NhbXA+IGFuZCBpdHMgY2hpbGRyZW4gaW4gdGhlIGluZGV4LiAgRG9lc24ndCBoYXZlIGFueQorICAgICAgZWZmZWN0IGlmIDx2YXI+aW5kZXg8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+Ljxici8+U3VuJ3MgamFyIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gc2tpcAorICAgICAgdGhlIDxzYW1wPk1FVEEtSU5GPC9zYW1wPiBkaXJlY3RvcnkgYW5kIEFudCBmb2xsb3dlZCB0aGF0IGV4YW1wbGUuICBUaGUgYmVoYXZpb3IgaGFzIGJlZW4KKyAgICAgIGNoYW5nZWQgd2l0aCA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTQ0MDg1MjYiIHRhcmdldD0iX3RvcCI+SmF2YQorICAgICAgNTwvYT4uICBJbiBvcmRlciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIEFudCBnZW5lcmF0ZWQgamFycyBvbiBKYXZhIDEuNCBvciBlYXJsaWVyIEFudCB3aWxsIG5vdAorICAgICAgaW5jbHVkZSA8c2FtcD5NRVRBLUlORjwvc2FtcD4gdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgdG8uIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYW5pZmVzdGVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgdGhlIEpBUiBtYW5pZmVzdCwgd2hlbgotICAgICAgYSBtYW5pZmVzdCBmaWxlIGlzIHNwZWNpZmllZC4gIFRoZSB0YXNrIHdpbGwgYWx3YXlzIHVzZSBVVEYtOAotICAgICAgd2hlbiB3cml0aW5nIHRoZSBtYW5pZmVzdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSBlbmNvZGluZy48L3RkPgorICAgIDx0ZD5tYW5pZmVzdGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIHVzZWQgdG8gcmVhZCB0aGUgSkFSIG1hbmlmZXN0LCB3aGVuIGEgbWFuaWZlc3QgZmlsZSBpcyBzcGVjaWZpZWQuICBUaGUgdGFzaworICAgICAgd2lsbCBhbHdheXMgdXNlIFVURi04IHdoZW4gd3JpdGluZyB0aGUgbWFuaWZlc3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJvdW5kdXA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2lsbCBiZQotICAgIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZXZlbiBudW1iZXIgb2Ygc2Vjb25kcy48YnI+Ci0gICAgWmlwIGFyY2hpdmVzIHN0b3JlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpdGggYSBncmFudWxhcml0eSBvZgotICAgIHR3byBzZWNvbmRzLCBzbyB0aGUgdGltZXMgd2lsbCBlaXRoZXIgYmUgcm91bmRlZCB1cCBvciBkb3duLiAgSWYKLSAgICB5b3Ugcm91bmQgZG93biwgdGhlIGFyY2hpdmUgd2lsbCBhbHdheXMgc2VlbSBvdXQtb2YtZGF0ZSB3aGVuIHlvdQotICAgIHJlcnVuIHRoZSB0YXNrLCBzbyB0aGUgZGVmYXVsdCBpcyB0byByb3VuZCB1cC4gIFJvdW5kaW5nIHVwIG1heQotICAgIGxlYWQgdG8gYSBkaWZmZXJlbnQgdHlwZSBvZiBwcm9ibGVtcyBsaWtlIEpTUHMgaW5zaWRlIGEgd2ViCi0gICAgYXJjaGl2ZSB0aGF0IHNlZW0gdG8gYmUgc2xpZ2h0bHkgbW9yZSByZWNlbnQgdGhhbiBwcmVjb21waWxlZAotICAgIHBhZ2VzLCByZW5kZXJpbmcgcHJlY29tcGlsYXRpb24gdXNlbGVzcy48YnI+Ci0gICAgRGVmYXVsdHMgdG8gdHJ1ZS4gIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnJvdW5kdXA8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgZXZlbiBudW1iZXIgb2YKKyAgICAgIHNlY29uZHMuPGJyLz5aaXAgYXJjaGl2ZXMgc3RvcmUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aCBhIGdyYW51bGFyaXR5IG9mIDIgc2Vjb25kcywgc28KKyAgICAgIHRoZSB0aW1lcyB3aWxsIGVpdGhlciBiZSByb3VuZGVkIHVwIG9yIGRvd24uICBJZiB5b3Ugcm91bmQgZG93biwgdGhlIGFyY2hpdmUgd2lsbCBhbHdheXMgc2VlbQorICAgICAgb3V0LW9mLWRhdGUgd2hlbiB5b3UgcmVydW4gdGhlIHRhc2ssIHNvIHRoZSBkZWZhdWx0IGlzIHRvIHJvdW5kIHVwLiAgUm91bmRpbmcgdXAgbWF5IGxlYWQgdG8gYQorICAgICAgZGlmZmVyZW50IHR5cGUgb2YgcHJvYmxlbXMgbGlrZSBKU1BzIGluc2lkZSBhIHdlYiBhcmNoaXZlIHRoYXQgc2VlbSB0byBiZSBzbGlnaHRseSBtb3JlIHJlY2VudAorICAgICAgdGhhbiBwcmVjb21waWxlZCBwYWdlcywgcmVuZGVyaW5nIHByZWNvbXBpbGF0aW9uIHVzZWxlc3MuIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxldmVsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlCi0gICAgcGVyZm9ybWVkLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChubyBjb21wcmVzc2lvbi9mYXN0ZXN0KSB0byA5Ci0gICAgKG1heGltdW0gY29tcHJlc3Npb24vc2xvd2VzdCkuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5sZXZlbDwvdGQ+CisgICAgPHRkPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlCisgICAgICBmcm9tIDxxPjA8L3E+IChubyBjb21wcmVzc2lvbi9mYXN0ZXN0KSB0byA8cT45PC9xPiAobWF4aW11bSBjb21wcmVzc2lvbi9zbG93ZXN0KS4gPGVtPlNpbmNlCisgICAgICBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmljdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db25maWd1cmVzIGhvdyB0byBoYW5kbGUgYnJlYWtzIG9mIHRoZSBwYWNrYWdpbmcgdmVyc2lvbgotICAgIHNwZWNpZmljYXRpb246IDx1bD4KLSAgICA8bGk+PGI+ZmFpbDwvYj4gPSB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbjwvbGk+Ci0gICAgPGxpPjxiPndhcm48L2I+ID0gbG9ncyBhIG1lc3NhZ2Ugb24gd2FybiBsZXZlbDwvbGk+Ci0gICAgPGxpPjxiPmlnbm9yZTwvYj4gPSBsb2dzIGEgbWVzc2FnZSBvbiB2ZXJib3NlIGxldmVsIChkZWZhdWx0KTwvbGk+Ci0gICAgPC91bD4KLSAgICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIDx0dD5pZ25vcmU8L3R0Pi4gPC90ZD4KKyAgICA8dGQ+c3RyaWN0PC90ZD4KKyAgICA8dGQ+Q29uZmlndXJlcyBob3cgdG8gaGFuZGxlIGJyZWFrcyBvZiB0aGUgcGFja2FnaW5nIHZlcnNpb24gc3BlY2lmaWNhdGlvbjoKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPmZhaWw8L3E+ID0gdGhyb3dzIGEgQnVpbGRFeGNlcHRpb248L2xpPgorICAgICAgICA8bGk+PHE+d2FybjwvcT4gPSBsb2dzIGEgbWVzc2FnZSBvbiB3YXJuIGxldmVsPC9saT4KKyAgICAgICAgPGxpPjxxPmlnbm9yZTwvcT4gPSBsb2dzIGEgbWVzc2FnZSBvbiB2ZXJib3NlIGxldmVsIChkZWZhdWx0KTwvbGk+CisgICAgICA8L3VsPjxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5pZ25vcmU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmUwcGVybWlzc2lvbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbiB1cGRhdGluZyBhbiBhcmNoaXZlIG9yIGFkZGluZyBlbnRyaWVzIGZyb20gYQotICAgIGRpZmZlcmVudCBhcmNoaXZlIEFudCB3aWxsIGFzc3VtZSB0aGF0IGEgVW5peCBwZXJtaXNzaW9ucyB2YWx1ZSBvZgotICAgIDAgKG5vYm9keSBpcyBhbGxvd2VkIHRvIGRvIGFueXRoaW5nIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSkgbWVhbnMKLSAgICB0aGF0IHRoZSBwZXJtaXNzaW9ucyBoYXZlbid0IGJlZW4gc3RvcmVkIGF0IGFsbCByYXRoZXIgdGhhbiByZWFsCi0gICAgcGVybWlzc2lvbnMgYW5kIHdpbGwgaW5zdGVhZCBhcHBseSBpdHMgb3duIGRlZmF1bHQgdmFsdWVzLjxici8+Ci0gICAgU2V0IHRoaXMgYXR0cmlidXRlIHRvIHRydWUgaWYgeW91IHJlYWxseSB3YW50IHRvIHByZXNlcnZlIHRoZQotICAgICAgb3JpZ2luYWwgcGVybWlzc2lvbiBmaWVsZC48ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4KKyAgICA8dGQ+cHJlc2VydmUwcGVybWlzc2lvbnM8L3RkPgorICAgIDx0ZD53aGVuIHVwZGF0aW5nIGFuIGFyY2hpdmUgb3IgYWRkaW5nIGVudHJpZXMgZnJvbSBhIGRpZmZlcmVudCBhcmNoaXZlIEFudCB3aWxsIGFzc3VtZSB0aGF0IGEKKyAgICAgIFVuaXggcGVybWlzc2lvbnMgdmFsdWUgb2YgMCAobm9ib2R5IGlzIGFsbG93ZWQgdG8gZG8gYW55dGhpbmcgdG8gdGhlIGZpbGUvZGlyZWN0b3J5KSBtZWFucworICAgICAgdGhhdCB0aGUgcGVybWlzc2lvbnMgaGF2ZW4ndCBiZWVuIHN0b3JlZCBhdCBhbGwgcmF0aGVyIHRoYW4gcmVhbCBwZXJtaXNzaW9ucyBhbmQgd2lsbCBpbnN0ZWFkCisgICAgICBhcHBseSBpdHMgb3duIGRlZmF1bHQgdmFsdWVzLjxici8+ICBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gPHE+dHJ1ZTwvcT4gaWYgeW91IHJlYWxseSB3YW50IHRvCisgICAgICBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcGVybWlzc2lvbiBmaWVsZC4gPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+CiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZUxhbmd1YWdlRW5jb2RpbmdGbGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZQotICAgICAgZW5jb2RpbmcgaXMgVVRGLTguICBUaGlzIHNldHRpbmcgZG9lc24ndCBoYXZlIGFueSBlZmZlY3QgaWYgdGhlCi0gICAgICBlbmNvZGluZyBpcyBub3QgVVRGLTguCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgorICAgIDx0ZD51c2VMYW5ndWFnZUVuY29kaW5nRmxhZzwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZSBlbmNvZGluZyBpcyBVVEYtOC4gIFRoaXMgc2V0dGluZyBkb2Vzbid0CisgICAgICBoYXZlIGFueSBlZmZlY3QgaWYgdGhlIGVuY29kaW5nIGlzIG5vdCBVVEYtOC4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LiAgPGJyLz5TZWUgYWxzbworICAgICAgdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNyZWF0ZVVuaWNvZGVFeHRyYUZpZWxkczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNyZWF0ZSB1bmljb2RlIGV4dHJhIGZpZWxkcyB0byBzdG9yZQotICAgICAgdGhlIGZpbGUgbmFtZXMgYSBzZWNvbmQgdGltZSBpbnNpZGUgdGhlIGVudHJ5J3MgbWV0YWRhdGEuCi0gICAgICA8YnI+UG9zc2libGUgdmFsdWVzIGFyZSAibmV2ZXIiLCAiYWx3YXlzIiBhbmQgIm5vdC1lbmNvZGVhYmxlIgotICAgICAgd2hpY2ggd2lsbCBvbmx5IGFkZCBVbmljb2RlIGV4dHJhIGZpZWxkcyBpZiB0aGUgZmlsZSBuYW1lIGNhbm5vdAotICAgICAgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAibmV2ZXIiPC90ZD4KKyAgICA8dGQ+Y3JlYXRlVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjcmVhdGUgVW5pY29kZSBleHRyYSBmaWVsZHMgdG8gc3RvcmUgdGhlIGZpbGUgbmFtZXMgYSBzZWNvbmQgdGltZSBpbnNpZGUgdGhlCisgICAgICBlbnRyeSdzIG1ldGFkYXRhLjxici8+UG9zc2libGUgdmFsdWVzIGFyZSA8cT5uZXZlcjwvcT4sIDxxPmFsd2F5czwvcT4KKyAgICAgIGFuZCA8cT5ub3QtZW5jb2RlYWJsZTwvcT4gd2hpY2ggd2lsbCBvbmx5IGFkZCBVbmljb2RlIGV4dHJhIGZpZWxkcyBpZiB0aGUgZmlsZSBuYW1lCisgICAgICBjYW5ub3QuPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5ldmVyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhbGxiYWNrdG9VVEY4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gdXNlIFVURi04IGFuZCB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcKLSAgICAgIGZsYWcgaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlmIGEgZmlsZSBuYW1lIGNhbm5vdCBiZQotICAgICAgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPmZhbGxiYWNrdG9VVEY4PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byB1c2UgVVRGLTggYW5kIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGluc3RlYWQgb2YgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpZiBhCisgICAgICBmaWxlIG5hbWUgY2Fubm90IGJlIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ljxici8+U2VlCisgICAgICBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUgemlwIHRhc2sgcGFnZTwvYT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVyZ2VDbGFzc1BhdGhBdHRyaWJ1dGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gbWVyZ2UgdGhlIENsYXNzLVBhdGggYXR0cmlidXRlcyBmb3VuZAotICAgICAgaW4gZGlmZmVyZW50IG1hbmlmZXN0cyAoaWYgbWVyZ2luZyBtYW5pZmVzdHMpLiAgSWYgZmFsc2UsIG9ubHkKLSAgICAgIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGxhc3QgbWVyZ2VkIG1hbmlmZXN0IHdpbGwgYmUgcHJlc2VydmVkLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LgotICAgICAgPGJyLz51bmxlc3MgeW91IGFsc28gc2V0IGZsYXR0ZW5BdHRyaWJ1dGVzIHRvIHRydWUgdGhpcyBtYXkKLSAgICAgIHJlc3VsdCBpbiBtYW5pZmVzdHMgY29udGFpbmluZyBtdWx0aXBsZSBDbGFzcy1QYXRoIGF0dHJpYnV0ZXMKLSAgICAgIHdoaWNoIHZpb2xhdGVzIHRoZSBtYW5pZmVzdCBzcGVjaWZpY2F0aW9uLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPm1lcmdlQ2xhc3NQYXRoQXR0cmlidXRlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gbWVyZ2UgdGhlIDxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+IGF0dHJpYnV0ZXMgZm91bmQgaW4gZGlmZmVyZW50IG1hbmlmZXN0cyAoaWYKKyAgICAgIG1lcmdpbmcgbWFuaWZlc3RzKS4gIElmIDxxPmZhbHNlPC9xPiwgb25seSB0aGUgYXR0cmlidXRlIG9mIHRoZSBsYXN0IG1lcmdlZCBtYW5pZmVzdCB3aWxsIGJlCisgICAgICBwcmVzZXJ2ZWQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPGJyLz5Vbmxlc3MgeW91IGFsc28gc2V0IDx2YXI+ZmxhdHRlbkF0dHJpYnV0ZXM8L3Zhcj4KKyAgICAgIHRvIDxxPnRydWU8L3E+LCB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3RzIGNvbnRhaW5pbmcgbXVsdGlwbGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4KKyAgICAgIGF0dHJpYnV0ZXMgd2hpY2ggdmlvbGF0ZXMgdGhlIG1hbmlmZXN0IHNwZWNpZmljYXRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZsYXR0ZW5BdHRyaWJ1dGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gbWVyZ2UgYXR0cmlidXRlcyBvY2N1cnJpbmcgbW9yZSB0aGFuCi0gICAgICBvbmNlIGluIGEgc2VjdGlvbiAodGhpcyBjYW4gb25seSBoYXBwZW4gZm9yIHRoZSBDbGFzcy1QYXRoCi0gICAgICBhdHRyaWJ1dGUpIGludG8gYSBzaW5nbGUgYXR0cmlidXRlLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPmZsYXR0ZW5BdHRyaWJ1dGVzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBtZXJnZSBhdHRyaWJ1dGVzIG9jY3VycmluZyBtb3JlIHRoYW4gb25jZSBpbiBhIHNlY3Rpb24gKHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvcgorICAgICAgdGhlIDxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+IGF0dHJpYnV0ZSkgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj56aXA2NE1vZGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlbiB0byB1c2UgWmlwNjQgZXh0ZW5zaW9ucyBmb3IgZW50cmllcy4gIFRoZQotICAgICAgcG9zc2libGUgdmFsdWVzIGFyZSAibmV2ZXIiLCAiYWx3YXlzIiBhbmQgImFzLW5lZWRlZCIuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOS4xPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCN6aXA2NCI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJuZXZlciI8L3RkPgorICAgIDx0ZD56aXA2NE1vZGU8L3RkPgorICAgIDx0ZD5XaGVuIHRvIHVzZSBaaXA2NCBleHRlbnNpb25zIGZvciBlbnRyaWVzLiAgVGhlIHBvc3NpYmxlIHZhbHVlcworICAgICAgYXJlIDxxPm5ldmVyPC9xPiwgPHE+YWx3YXlzPC9xPiBhbmQgPHE+YXMtbmVlZGVkPC9xPi4gIDxlbT5TaW5jZSBBbnQgMS45LjE8L2VtPi48YnIvPlNlZSBhbHNvCisgICAgICB0aGUgPGEgaHJlZj0iemlwLmh0bWwjemlwNjQiPmRpc2N1c3Npb24gaW4gdGhlIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5ldmVyPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0Pm1ldGFpbmY8L2g0PgotPHA+VGhlIG5lc3RlZCA8Y29kZT5tZXRhaW5mPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwKLWVuZCB1cCBpbiB0aGUgPGNvZGU+TUVUQS1JTkY8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgamFyIGZpbGUuIElmIHRoaXMKLWZpbGVzZXQgaW5jbHVkZXMgYSBmaWxlIG5hbWVkIDxjb2RlPk1BTklGRVNULk1GPC9jb2RlPiwgdGhlIGZpbGUgaXMKLWlnbm9yZWQgYW5kIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcuPC9wPgorPHA+VGhlIG5lc3RlZCA8Y29kZT5tZXRhaW5mPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcworYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwgZW5kIHVwIGluCit0aGUgPHNhbXA+TUVUQS1JTkY8L3NhbXA+IGRpcmVjdG9yeSBvZiB0aGUgamFyIGZpbGUuIElmIHRoaXMgZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUKK25hbWVkIDxzYW1wPk1BTklGRVNULk1GPC9zYW1wPiwgdGhlIGZpbGUgaXMgaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+CiAKIDxoND5tYW5pZmVzdDwvaDQ+Ci08cD5UaGUgbWFuaWZlc3QgbmVzdGVkIGVsZW1lbnQgYWxsb3dzIHRoZSBtYW5pZmVzdCBmb3IgdGhlIEphciBmaWxlIHRvCi1iZSBwcm92aWRlZCBpbmxpbmUgaW4gdGhlIGJ1aWxkIGZpbGUgcmF0aGVyIHRoYW4gaW4gYW4gZXh0ZXJuYWwKLWZpbGUuIFRoaXMgZWxlbWVudCBpcyBpZGVudGljYWwgdG8gdGhlCi08YSBocmVmPSJtYW5pZmVzdC5odG1sIj5tYW5pZmVzdDwvYT4gdGFzaywgYnV0IHRoZSBmaWxlIGFuZCBtb2RlCis8cD5UaGUgbmVzdGVkIDxjb2RlPm1hbmlmZXN0PC9jb2RlPiBlbGVtZW50IGFsbG93cyB0aGUgbWFuaWZlc3QgZm9yIHRoZSBKYXIgZmlsZSB0byBiZSBwcm92aWRlZAoraW5saW5lIGluIHRoZSBidWlsZCBmaWxlIHJhdGhlciB0aGFuIGluIGFuIGV4dGVybmFsIGZpbGUuIFRoaXMgZWxlbWVudCBpcyBpZGVudGljYWwgdG8gdGhlCis8YSBocmVmPSJtYW5pZmVzdC5odG1sIj5tYW5pZmVzdDwvYT4gdGFzaywgYnV0IHRoZSA8dmFyPmZpbGU8L3Zhcj4gYW5kIDx2YXI+bW9kZTwvdmFyPgogYXR0cmlidXRlcyBtdXN0IGJlIG9taXR0ZWQuPC9wPgotPHA+Ci1JZiBib3RoIGFuIGlubGluZSBtYW5pZmVzdCBhbmQgYW4gZXh0ZXJuYWwgZmlsZSBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZQotbWFuaWZlc3RzIGFyZSBtZXJnZWQuCi08L3A+Cis8cD5JZiBib3RoIGFuIGlubGluZSBtYW5pZmVzdCBhbmQgYW4gZXh0ZXJuYWwgZmlsZSBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZSBtYW5pZmVzdHMgYXJlIG1lcmdlZC48L3A+CiAKLTxwPldoZW4gdXNpbmcgaW5saW5lIG1hbmlmZXN0cywgdGhlIEphciB0YXNrIHdpbGwgY2hlY2sgd2hldGhlciB0aGUgbWFuaWZlc3QKLWNvbnRlbnRzIGhhdmUgY2hhbmdlZCAoaS5lLiB0aGUgbWFuaWZlc3QgYXMgc3BlY2lmaWVkIGlzIGRpZmZlcmVudCBpbiBhbnkgd2F5Ci1mcm9tIHRoZSBtYW5pZmVzdCB0aGF0IGV4aXN0cyBpbiB0aGUgSmFyLCBpZiBpdCBleGlzdHMuCi1JZiB0aGUgbWFuaWZlc3QgdmFsdWVzIGhhdmUgY2hhbmdlZCB0aGUgamFyIHdpbGwgYmUgdXBkYXRlZCBvciByZWJ1aWx0LCBhcwotYXBwcm9wcmlhdGUuCi08L3A+Cis8cD5XaGVuIHVzaW5nIGlubGluZSBtYW5pZmVzdHMsIHRoZSA8Y29kZT5KYXI8L2NvZGU+IHRhc2sgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBtYW5pZmVzdCBjb250ZW50cworaGF2ZSBjaGFuZ2VkIChpLmUuIHRoZSBtYW5pZmVzdCBhcyBzcGVjaWZpZWQgaXMgZGlmZmVyZW50IGluIGFueSB3YXkgZnJvbSB0aGUgbWFuaWZlc3QgdGhhdCBleGlzdHMKK2luIHRoZSBqYXIsIGlmIGl0IGV4aXN0cy4gIElmIHRoZSBtYW5pZmVzdCB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCB0aGUgamFyIHdpbGwgYmUgdXBkYXRlZCBvciByZWJ1aWx0LAorYXMgYXBwcm9wcmlhdGUuPC9wPgogCi08YSBuYW1lPSJpbmRleGphcnMiPjxoND5pbmRleGphcnM8L2g0PjwvYT4KKzxoNCBpZD0iaW5kZXhqYXJzIj5pbmRleGphcnM8L2g0PgogCi08cD48ZW0+c2luY2UgYW50IDEuNi4yPC9lbT48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3A+CiAKLTxwPlRoZSBuZXN0ZWQgPGNvZGU+aW5kZXhqYXJzPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+LiAgSXRzIGNvbnRlbnQgaXMKLWNvbXBsZXRlbHkgaWdub3JlZCB1bmxlc3MgeW91IHNldCB0aGUgaW5kZXggYXR0cmlidXRlIG9mIHRoZSB0YXNrIHRvCi10cnVlLjwvcD4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+aW5kZXhqYXJzPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlCitzdHJ1Y3R1cmU8L2E+LiAgSXRzIGNvbnRlbnQgaXMgY29tcGxldGVseSBpZ25vcmVkIHVubGVzcyB5b3Ugc2V0IHRoZSA8dmFyPmluZGV4PC92YXI+IGF0dHJpYnV0ZSBvZgordGhlIHRhc2sgdG8gPHE+dHJ1ZTwvcT4uPC9wPgogCi08cD5UaGUgaW5kZXggY3JlYXRlZCBieSB0aGlzIHRhc2sgd2lsbCBjb250YWluIGluZGljZXMgZm9yIHRoZQotYXJjaGl2ZXMgY29udGFpbmVkIGluIHRoaXMgcGF0aCwgdGhlIG5hbWVzIHVzZWQgZm9yIHRoZSBhcmNoaXZlcwotZGVwZW5kIG9uIHlvdXIgbWFuaWZlc3Q6PC9wPgorPHA+VGhlIGluZGV4IGNyZWF0ZWQgYnkgdGhpcyB0YXNrIHdpbGwgY29udGFpbiBpbmRpY2VzIGZvciB0aGUgYXJjaGl2ZXMgY29udGFpbmVkIGluIHRoaXMgcGF0aCwgdGhlCituYW1lcyB1c2VkIGZvciB0aGUgYXJjaGl2ZXMgZGVwZW5kIG9uIHlvdXIgbWFuaWZlc3Q6PC9wPgogPHVsPgotICA8bGk+SWYgdGhlIGdlbmVyYXRlZCBqYXIncyBtYW5pZmVzdCBjb250YWlucyBubyBDbGFzcy1QYXRoCi0gIGF0dHJpYnV0ZSwgdGhlIGZpbGUgbmFtZSB3aXRob3V0IGFueSBsZWFkaW5nIGRpcmVjdG9yeSBwYXRoIHdpbGwgYmUKLSAgdXNlZCBhbmQgYWxsIHBhcnRzIG9mIHRoZSBwYXRoIHdpbGwgZ2V0IGluZGV4ZWQuPC9saT4KLSAgPGxpPklmIHRoZSBtYW5pZmVzdCBjb250YWlucyBhIENsYXNzLVBhdGggYXR0cmlidXRlLCB0aGlzIHRhc2sgd2lsbAotICB0cnkgdG8gZ3Vlc3Mgd2hpY2ggcGFydCBvZiB0aGUgQ2xhc3MtUGF0aCBiZWxvbmdzIHRvIGEgZ2l2ZW4KLSAgYXJjaGl2ZS4gIElmIGl0IGNhbm5vdCBndWVzcyBhIG5hbWUsIHRoZSBhcmNoaXZlIHdpbGwgYmUgc2tpcHBlZCwKLSAgb3RoZXJ3aXNlIHRoZSBuYW1lIGxpc3RlZCBpbnNpZGUgdGhlIENsYXNzLVBhdGggYXR0cmlidXRlIHdpbGwgYmUKLSAgdXNlZC48L2xpPgorICA8bGk+SWYgdGhlIGdlbmVyYXRlZCBqYXIncyBtYW5pZmVzdCBjb250YWlucyBubyA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGUsIHRoZSBmaWxlIG5hbWUKKyAgd2l0aG91dCBhbnkgbGVhZGluZyBkaXJlY3RvcnkgcGF0aCB3aWxsIGJlIHVzZWQgYW5kIGFsbCBwYXJ0cyBvZiB0aGUgcGF0aCB3aWxsIGdldCBpbmRleGVkLjwvbGk+CisgIDxsaT5JZiB0aGUgbWFuaWZlc3QgY29udGFpbnMgYSA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGUsIHRoaXMgdGFzayB3aWxsIHRyeSB0byBndWVzcworICB3aGljaCBwYXJ0IG9mIHRoZSA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBiZWxvbmdzIHRvIGEgZ2l2ZW4gYXJjaGl2ZS4gIElmIGl0IGNhbm5vdCBndWVzcyBhIG5hbWUsCisgIHRoZSBhcmNoaXZlIHdpbGwgYmUgc2tpcHBlZCwgb3RoZXJ3aXNlIHRoZSBuYW1lIGxpc3RlZCBpbnNpZGUgdGhlIDxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+CisgIGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQuPC9saT4KIDwvdWw+CiAKLTxwPlRoaXMgdGFzayB3aWxsIG5vdCBjcmVhdGUgYW55IGluZGV4IGVudHJpZXMgZm9yIGFyY2hpdmVzIHRoYXQgYXJlCi0gIGVtcHR5IG9yIG9ubHkgY29udGFpbiBmaWxlcyBpbnNpZGUgdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSB1bmxlc3MKLSAgdGhlIDxjb2RlPmluZGV4bWV0YWluZjwvY29kZT4gYXR0cmlidXRlIGhhcyBiZWVuIHNldAotICB0byA8Y29kZT50cnVlPC9jb2RlPi48L3A+Cis8cD5UaGlzIHRhc2sgd2lsbCBub3QgY3JlYXRlIGFueSBpbmRleCBlbnRyaWVzIGZvciBhcmNoaXZlcyB0aGF0IGFyZSBlbXB0eSBvciBvbmx5IGNvbnRhaW4gZmlsZXMKK2luc2lkZSB0aGUgPHNhbXA+TUVUQS1JTkY8L3NhbXA+IGRpcmVjdG9yeSB1bmxlc3MgdGhlIDx2YXI+aW5kZXhtZXRhaW5mPC92YXI+IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQKK3RvIDxxPnRydWU8L3E+LjwvcD4KIAotPGEgbmFtZT0ic2VydmljZSI+PGg0PnNlcnZpY2U8L2g0PjwvYT4KKzxoNCBpZD0ic2VydmljZSI+c2VydmljZTwvaDQ+CiAKLTxwPjxlbT5zaW5jZSBhbnQgMS43LjA8L2VtPjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KIAotPHA+Ci0gIFRoZSBuZXN0ZWQgPGNvZGU+c2VydmljZTwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSBzZXJ2aWNlLgotICBTZXJ2aWNlcyBhcmUgZGVzY3JpYmVkIGluIHRoZQotICA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwjU2VydmljZV9Qcm92aWRlciI+c2VydmljZSBwcm92aWRlciBvdmVydmlldzwvYT4uCi0gIFRoZSBhcHByb2FjaCBpcyB0byBoYXZlIHByb3ZpZGVycyBKQVJzIGluY2x1ZGUgZmlsZXMgbmFtZWQgYnkgdGhlIHNlcnZpY2UKLSAgcHJvdmlkZWQsIGZvciBleGFtcGxlLAotICBNRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lRmFjdG9yeQotICB3aGljaCBjYW4gaW5jbHVkZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lcywgb25lIHBlciBsaW5lICh1c3VhbGx5IGp1c3Qgb25lIHBlciBKQVIpLgorPHA+VGhlIG5lc3RlZCA8Y29kZT5zZXJ2aWNlPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIHNlcnZpY2UuICBTZXJ2aWNlcyBhcmUgZGVzY3JpYmVkIGluCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phci9qYXIuaHRtbCNTZXJ2aWNlX1Byb3ZpZGVyIgordGFyZ2V0PSJfdG9wIj5zZXJ2aWNlIHByb3ZpZGVyIG92ZXJ2aWV3PC9hPi4gIFRoZSBhcHByb2FjaCBpcyB0byBoYXZlIHByb3ZpZGVycyBKQVJzIGluY2x1ZGUgZmlsZXMKK25hbWVkIGJ5IHRoZSBzZXJ2aWNlIHByb3ZpZGVkLCBmb3IKK2V4YW1wbGUsIDxzYW1wPk1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5PC9zYW1wPiB3aGljaCBjYW4gaW5jbHVkZQoraW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZXMsIG9uZSBwZXIgbGluZSAodXN1YWxseSBqdXN0IG9uZSBwZXIgSkFSKS48L3A+CiAKLSAgVGhlIG5hbWUgb2YgdGhlCi0gIHNlcnZpY2UgaXMgc2V0IGJ5IHRoZSAidHlwZSIgYXR0cmlidXRlLiBUaGUgY2xhc3NuYW1lIGltcGxlbWVudGluZwotICB0aGUgc2VydmljZSBpcyB0aGUgdGhlICJwcm92aWRlciIgYXR0cmlidXRlLCBvciBpdCBvbmUgd2FudHMgdG8KLSAgc3BlY2lmeSBhIG51bWJlciBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBzZXJ2aWNlLCBieQotICAicHJvdmlkZXIiIG5lc3RlZCBlbGVtZW50cy4KLTwvcD4KLTxwPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIGlzIHNldCBieSB0aGUgPHZhcj50eXBlPC92YXI+IGF0dHJpYnV0ZS4gVGhlIGNsYXNzbmFtZSBpbXBsZW1lbnRpbmcgdGhlCitzZXJ2aWNlIGlzIHRoZSB0aGUgPHZhcj5wcm92aWRlcjwvdmFyPiBhdHRyaWJ1dGUsIG9yIGlmIG9uZSB3YW50cyB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGNsYXNzZXMKK3RoYXQgaW1wbGVtZW50IHRoZSBzZXJ2aWNlLCBieSA8Y29kZT5wcm92aWRlcjwvY29kZT4gbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvdmlkZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgY2xhc3NuYW1lIG9mIHRoZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIHNlcnZpY2UuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkCi0gICAgICA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgPHRkPnByb3ZpZGVyPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBzZXJ2aWNlLjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci0gIDxwPgotICAgIFRoZSBwcm92aWRlciBjbGFzc25hbWUgaXMgc3BlY2lmaWVkIGVpdGhlciBieSB0aGUgInByb3ZpZGVyIiBhdHRyaWJ1dGUsIG9yCi0gICAgYnkgYSBuZXN0ZWQgJmx0O3Byb3ZpZGVyJmd0OyBlbGVtZW50LCB3aGljaCBoYXMgYSBzaW5nbGUgImNsYXNzbmFtZSIgYXR0cmlidXRlLgotICAgIElmIGEgSkFSIGZpbGUgaGFzIG1vcmUgdGhhdCBvbmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UsIGEgbnVtYmVyIG9mCi0gICAgbmVzdGVkICZsdDtwcm92aWRlciZndDsgZWxlbWVudHMgbWF5IGJlIHVzZWQuCi0gIDwvcD4KLSAgCi0gIAorPHA+VGhlIHByb3ZpZGVyIGNsYXNzbmFtZSBpcyBzcGVjaWZpZWQgZWl0aGVyIGJ5IHRoZSA8dmFyPnByb3ZpZGVyPC92YXI+IGF0dHJpYnV0ZSwgb3IgYnkgYQorbmVzdGVkIDxjb2RlPiZsdDtwcm92aWRlciZndDs8L2NvZGU+IGVsZW1lbnQsIHdoaWNoIGhhcyBhIHNpbmdsZSA8dmFyPmNsYXNzbmFtZTwvdmFyPiBhdHRyaWJ1dGUuICBJZgorYSBKQVIgZmlsZSBoYXMgbW9yZSB0aGF0IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VydmljZSwgYSBudW1iZXIgb2YKK25lc3RlZCA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyBtYXkgYmUgdXNlZC48L3A+CisKIDxoMz5FeGFtcGxlczwvaDM+CiAKIDxoND5TaW1wbGU8L2g0PgotPGJsb2NrcXVvdGU+PHByZT4gICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvYXBwLmphciZxdW90OyBiYXNlZGlyPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmphcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfS9jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKLWNhbGxlZCA8Y29kZT5hcHAuamFyPC9jb2RlPiBpbiB0aGUgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+IGRpcmVjdG9yeS48L3A+Ci0KKzxwPkphciBhbGwgZmlsZXMgaW4gdGhlIDxzYW1wPiR7YnVpbGR9L2NsYXNzZXM8L3NhbXA+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZQorY2FsbGVkIDxzYW1wPmFwcC5qYXI8L3NhbXA+IGluIHRoZSA8c2FtcD4ke2Rpc3R9L2xpYjwvc2FtcD4gZGlyZWN0b3J5LjwvcD4KKzxwcmU+Jmx0O2phciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L2xpYi9hcHAuamFyJnF1b3Q7IGJhc2VkaXI9JnF1b3Q7JHtidWlsZH0vY2xhc3NlcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDxoND5XaXRoIGZpbHRlcnM8L2g0PgogCi08YmxvY2txdW90ZT48cHJlPiAgJmx0O2phciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L2xpYi9hcHAuamFyJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDske2J1aWxkfS9jbGFzc2VzJnF1b3Q7Ci0gICAgICAgZXhjbHVkZXM9JnF1b3Q7KiovVGVzdC5jbGFzcyZxdW90OwotICAvJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmphcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfS9jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKLWNhbGxlZCA8Y29kZT5hcHAuamFyPC9jb2RlPiBpbiB0aGUgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+IGRpcmVjdG9yeS4gRmlsZXMKLXdpdGggdGhlIG5hbWUgPGNvZGU+VGVzdC5jbGFzczwvY29kZT4gYXJlIGV4Y2x1ZGVkLjwvcD4KKzxwPkphciBhbGwgZmlsZXMgaW4gdGhlIDxzYW1wPiR7YnVpbGR9L2NsYXNzZXM8L3NhbXA+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZQorY2FsbGVkIDxzYW1wPmFwcC5qYXI8L3NhbXA+IGluIHRoZSA8c2FtcD4ke2Rpc3R9L2xpYjwvc2FtcD4gZGlyZWN0b3J5LiBGaWxlcyB3aXRoIHRoZQorbmFtZSA8c2FtcD5UZXN0LmNsYXNzPC9zYW1wPiBhcmUgZXhjbHVkZWQuPC9wPgorPHByZT4mbHQ7amFyIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbGliL2FwcC5qYXImcXVvdDsKKyAgICAgYmFzZWRpcj0mcXVvdDske2J1aWxkfS9jbGFzc2VzJnF1b3Q7CisgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL1Rlc3QuY2xhc3MmcXVvdDsvJmd0OzwvcHJlPgogCi08YmxvY2txdW90ZT48cHJlPiAgJmx0O2phciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L2xpYi9hcHAuamFyJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDske2J1aWxkfS9jbGFzc2VzJnF1b3Q7Ci0gICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3Rlc3QvKiomcXVvdDsKLSAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9UZXN0LmNsYXNzJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+amFycyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZQotY2FsbGVkIDxjb2RlPmFwcC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4ke2Rpc3R9L2xpYjwvY29kZT4gZGlyZWN0b3J5LiBPbmx5Ci1maWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5IDxjb2RlPm15cGFja2FnZS90ZXN0PC9jb2RlPiBhcmUgdXNlZCwgYW5kIGZpbGVzIHdpdGgKLXRoZSBuYW1lIDxjb2RlPlRlc3QuY2xhc3M8L2NvZGU+IGFyZSBleGNsdWRlZC48L3A+Cis8cD5KYXIgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD4ke2J1aWxkfS9jbGFzc2VzPC9zYW1wPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8c2FtcD5hcHAuamFyPC9zYW1wPiBpbiB0aGUgPHNhbXA+JHtkaXN0fS9saWI8L3NhbXA+IGRpcmVjdG9yeS4gT25seSBmaWxlcyB1bmRlciB0aGUKK2RpcmVjdG9yeSA8c2FtcD5teXBhY2thZ2UvdGVzdDwvc2FtcD4gYXJlIHVzZWQsIGFuZCBmaWxlcyB3aXRoIHRoZSBuYW1lIDxzYW1wPlRlc3QuY2xhc3M8L3NhbXA+IGFyZQorZXhjbHVkZWQuPC9wPgorPHByZT4KKyZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9saWIvYXBwLmphciZxdW90OworICAgICBiYXNlZGlyPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsKKyAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3Rlc3QvKiomcXVvdDsKKyAgICAgZXhjbHVkZXM9JnF1b3Q7KiovVGVzdC5jbGFzcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDxoND5NdWx0aXBsZSBmaWxlc2V0czwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPiAgJmx0O2phciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L2xpYi9hcHAuamFyJnF1b3Q7Jmd0OworPHA+SmFyIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+JHtidWlsZH0vY2xhc3Nlczwvc2FtcD4gZGlyZWN0b3J5IGFuZCBhbHNvIGluCit0aGUgPHNhbXA+JHtzcmN9L3Jlc291cmNlczwvc2FtcD4gZGlyZWN0b3J5IHRvZ2V0aGVyIGludG8gYSBmaWxlIGNhbGxlZCA8c2FtcD5hcHAuamFyPC9zYW1wPiBpbgordGhlIDxzYW1wPiR7ZGlzdH0vbGliPC9zYW1wPiBkaXJlY3RvcnkuIEZpbGVzIHdpdGggdGhlIG5hbWUgPHNhbXA+VGVzdC5jbGFzczwvc2FtcD4gYXJlIGV4Y2x1ZGVkLiBJZgordGhlcmUgYXJlIGZpbGVzIHN1Y2ggYXMgPHNhbXA+JHtidWlsZH0vY2xhc3Nlcy9teXBhY2thZ2UvTXlDbGFzcy5jbGFzczwvc2FtcD4KK2FuZCA8c2FtcD4ke3NyY30vcmVzb3VyY2VzL215cGFja2FnZS9pbWFnZS5naWY8L3NhbXA+LCB0aGV5IHdpbGwgYXBwZWFyIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBpbiB0aGUKK2phciAoYW5kIHRodXMgYmUgY29uc2lkZXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlIGJ5IEphdmEpLjwvcD4KKzxwcmU+CismbHQ7amFyIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbGliL2FwcC5qYXImcXVvdDsmZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsKLSAgICAgICAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9UZXN0LmNsYXNzJnF1b3Q7Ci0gICAgLyZndDsKKyAgICAgICAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9UZXN0LmNsYXNzJnF1b3Q7LyZndDsKICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9L3Jlc291cmNlcyZxdW90Oy8mZ3Q7Ci0gICZsdDsvamFyJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmphcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfS9jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnkgYW5kIGFsc28KLWluIHRoZSA8Y29kZT4ke3NyY30vcmVzb3VyY2VzPC9jb2RlPiBkaXJlY3RvcnkgdG9nZXRoZXIgaW50byBhIGZpbGUKLWNhbGxlZCA8Y29kZT5hcHAuamFyPC9jb2RlPiBpbiB0aGUgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+IGRpcmVjdG9yeS4KLUZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+VGVzdC5jbGFzczwvY29kZT4gYXJlIGV4Y2x1ZGVkLgotSWYgdGhlcmUgYXJlIGZpbGVzIHN1Y2ggYXMgPGNvZGU+JHtidWlsZH0vY2xhc3Nlcy9teXBhY2thZ2UvTXlDbGFzcy5jbGFzczwvY29kZT4KLWFuZCA8Y29kZT4ke3NyY30vcmVzb3VyY2VzL215cGFja2FnZS9pbWFnZS5naWY8L2NvZGU+LCB0aGV5IHdpbGwgYXBwZWFyCi1pbiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gdGhlIEpBUiAoYW5kIHRodXMgYmUgY29uc2lkZXJlZCBpbiB0aGUgc2FtZSBwYWNrYWdlCi1ieSBKYXZhKS48L3A+CismbHQ7L2phciZndDs8L3ByZT4KIAogPGg0Pk1lcmdpbmcgYXJjaGl2ZXM8L2g0PgogCi08YmxvY2txdW90ZT48cHJlPiAmbHQ7amFyIGRlc3RmaWxlPSJidWlsZC9tYWluL2NoZWNrc2l0ZXMuamFyIiZndDsKKzxwPkNyZWF0ZSBhbiBleGVjdXRhYmxlIGphciBmaWxlIHdpdGggYSBtYWluIGNsYXNzIDxzYW1wPmNvbS5hY21lLmNoZWNrc2l0ZXMuTWFpbjwvc2FtcD4sIGFuZCBlbWJlZAorYWxsIHRoZSBjbGFzc2VzIGZyb20gdGhlIGphciA8c2FtcD5saWIvbWFpbi9zb21lLmphcjwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtqYXIgZGVzdGZpbGU9ImJ1aWxkL21haW4vY2hlY2tzaXRlcy5qYXIiJmd0OwogICAgICZsdDtmaWxlc2V0IGRpcj0iYnVpbGQvbWFpbi9jbGFzc2VzIi8mZ3Q7CiAgICAgJmx0O3ppcGZpbGVzZXQgaW5jbHVkZXM9IioqLyouY2xhc3MiIHNyYz0ibGliL21haW4vc29tZS5qYXIiLyZndDsKICAgICAmbHQ7bWFuaWZlc3QmZ3Q7CiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiCi0gICAgICAgICAgICB2YWx1ZT0iY29tLmFjbWUuY2hlY2tzaXRlcy5NYWluIi8mZ3Q7CisgICAgICAgICAgICAgICAgIHZhbHVlPSJjb20uYWNtZS5jaGVja3NpdGVzLk1haW4iLyZndDsKICAgICAmbHQ7L21hbmlmZXN0Jmd0OwotICAmbHQ7L2phciZndDs8L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLSAgQ3JlYXRlcyBhbiBleGVjdXRhYmxlIGphciBmaWxlIHdpdGggYSBtYWluIGNsYXNzICJjb20uYWNtZS5jaGVja3NpdGVzLk1haW4iLCBhbmQKLSAgZW1iZWRzIGFsbCB0aGUgY2xhc3NlcyBmcm9tIHRoZSBqYXIgPGNvZGU+bGliL21haW4vc29tZS5qYXI8L2NvZGU+LgotPC9wPgorJmx0Oy9qYXImZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+ICZsdDtqYXIgZGVzdGZpbGU9ImJ1aWxkL21haW4vY2hlY2tzaXRlcy5qYXIiJmd0OworPHA+Q3JlYXRlIGFuIGV4ZWN1dGFibGUgamFyIGZpbGUgd2l0aCBhIG1haW4gY2xhc3MgPHNhbXA+Y29tLmFjbWUuY2hlY2tzaXRlcy5NYWluPC9zYW1wPiwgYW5kIGVtYmVkCithbGwgdGhlIGNsYXNzZXMgZnJvbSBhbGwgdGhlIGphcnMgaW4gPHNhbXA+bGliL21haW48L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7amFyIGRlc3RmaWxlPSJidWlsZC9tYWluL2NoZWNrc2l0ZXMuamFyIiZndDsKICAgICAmbHQ7ZmlsZXNldCBkaXI9ImJ1aWxkL21haW4vY2xhc3NlcyIvJmd0OwogICAgICZsdDtyZXN0cmljdCZndDsKLSAgICAgJmx0O25hbWUgbmFtZT0iKiovKi5jbGFzcyIvJmd0OwotICAgICAmbHQ7YXJjaGl2ZXMmZ3Q7Ci0gICAgICAgJmx0O3ppcHMmZ3Q7Ci0gICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYi9tYWluIiBpbmNsdWRlcz0iKiovKi5qYXIiLyZndDsKLSAgICAgICAmbHQ7L3ppcHMmZ3Q7Ci0gICAgICZsdDsvYXJjaGl2ZXMmZ3Q7CisgICAgICAgJmx0O25hbWUgbmFtZT0iKiovKi5jbGFzcyIvJmd0OworICAgICAgICZsdDthcmNoaXZlcyZndDsKKyAgICAgICAgICAgJmx0O3ppcHMmZ3Q7CisgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYi9tYWluIiBpbmNsdWRlcz0iKiovKi5qYXIiLyZndDsKKyAgICAgICAgICAgJmx0Oy96aXBzJmd0OworICAgICAgICZsdDsvYXJjaGl2ZXMmZ3Q7CiAgICAgJmx0Oy9yZXN0cmljdCZndDsKICAgICAmbHQ7bWFuaWZlc3QmZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiCi0gICAgICAgICAgICB2YWx1ZT0iY29tLmFjbWUuY2hlY2tzaXRlcy5NYWluIi8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIKKyAgICAgICAgICAgICAgdmFsdWU9ImNvbS5hY21lLmNoZWNrc2l0ZXMuTWFpbiIvJmd0OwogICAgICZsdDsvbWFuaWZlc3QmZ3Q7Ci0gICZsdDsvamFyJmd0OzwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotICBDcmVhdGVzIGFuIGV4ZWN1dGFibGUgamFyIGZpbGUgd2l0aCBhIG1haW4gY2xhc3MgImNvbS5hY21lLmNoZWNrc2l0ZXMuTWFpbiIsIGFuZAotICBlbWJlZHMgYWxsIHRoZSBjbGFzc2VzIGZyb20gYWxsIHRoZSBqYXJzIGluIDxjb2RlPmxpYi9tYWluPC9jb2RlPi4KLTwvcD4KKyZsdDsvamFyJmd0OzwvcHJlPgogCiA8aDQ+SW5saW5lIG1hbmlmZXN0PC9oND4KLTxibG9ja3F1b3RlPjxwcmU+ICAmbHQ7amFyIGRlc3RmaWxlPSZxdW90O3Rlc3QuamFyJnF1b3Q7IGJhc2VkaXI9JnF1b3Q7LiZxdW90OyZndDsKKzxwcmU+CismbHQ7amFyIGRlc3RmaWxlPSZxdW90O3Rlc3QuamFyJnF1b3Q7IGJhc2VkaXI9JnF1b3Q7LiZxdW90OyZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2J1aWxkJnF1b3Q7LyZndDsKICAgICAmbHQ7bWFuaWZlc3QmZ3Q7Ci0gICAgICAmbHQ7IS0tIElmIHRoaXMgaXMgYW4gQXBwbGV0IG9yIFdlYiBTdGFydCBhcHBsaWNhdGlvbiwgaW5jbHVkZQotICAgICAgICAgICB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgZnJvbSA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qd2ViL2luZGV4Lmh0bWwiPmh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2p3ZWIvaW5kZXguaHRtbDwvYT4gLS0mZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7UGVybWlzc2lvbnMmcXVvdDsgdmFsdWU9JnF1b3Q7c2FuZGJveCZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7Q29kZWJhc2UmcXVvdDsgdmFsdWU9JnF1b3Q7ZXhhbXBsZS5jb20mcXVvdDsvJmd0OwotICAgICAgJmx0OyEtLSBXaG8gaXMgYnVpbGRpbmcgdGhpcyBqYXI/IC0tJmd0OwotICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0J1aWx0LUJ5JnF1b3Q7IHZhbHVlPSZxdW90OyR7dXNlci5uYW1lfSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7IS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIGl0c2VsZiAtLSZndDsKLSAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtJbXBsZW1lbnRhdGlvbi1WZW5kb3ImcXVvdDsgdmFsdWU9JnF1b3Q7QUNNRSBpbmMuJnF1b3Q7LyZndDsKLSAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtJbXBsZW1lbnRhdGlvbi1UaXRsZSZxdW90OyB2YWx1ZT0mcXVvdDtHcmVhdFByb2R1Y3QmcXVvdDsvJmd0OwotICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0ltcGxlbWVudGF0aW9uLVZlcnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7MS4wLjBiZXRhMiZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7IS0tIGRldGFpbHMgLS0mZ3Q7Ci0gICAgICAmbHQ7c2VjdGlvbiBuYW1lPSZxdW90O2NvbW1vbi9NeUNsYXNzLmNsYXNzJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U2VhbGVkJnF1b3Q7IHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvc2VjdGlvbiZndDsKKyAgICAgICAgJmx0OyEtLSBJZiB0aGlzIGlzIGFuIEFwcGxldCBvciBXZWIgU3RhcnQgYXBwbGljYXRpb24sIGluY2x1ZGUKKyAgICAgICAgICAgICB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgZnJvbSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvandlYi9pbmRleC5odG1sIiB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qd2ViL2luZGV4Lmh0bWw8L2E+IC0tJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7UGVybWlzc2lvbnMmcXVvdDsgdmFsdWU9JnF1b3Q7c2FuZGJveCZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtDb2RlYmFzZSZxdW90OyB2YWx1ZT0mcXVvdDtleGFtcGxlLmNvbSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDshLS0gV2hvIGlzIGJ1aWxkaW5nIHRoaXMgamFyPyAtLSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0J1aWx0LUJ5JnF1b3Q7IHZhbHVlPSZxdW90OyR7dXNlci5uYW1lfSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDshLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2dyYW0gaXRzZWxmIC0tJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0FDTUUgaW5jLiZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtJbXBsZW1lbnRhdGlvbi1UaXRsZSZxdW90OyB2YWx1ZT0mcXVvdDtHcmVhdFByb2R1Y3QmcXVvdDsvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVyc2lvbiZxdW90OyB2YWx1ZT0mcXVvdDsxLjAuMGJldGEyJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0OyEtLSBkZXRhaWxzIC0tJmd0OworICAgICAgICAmbHQ7c2VjdGlvbiBuYW1lPSZxdW90O2NvbW1vbi9NeUNsYXNzLmNsYXNzJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O1NlYWxlZCZxdW90OyB2YWx1ZT0mcXVvdDtmYWxzZSZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDsvc2VjdGlvbiZndDsKICAgICAmbHQ7L21hbmlmZXN0Jmd0OwotICAmbHQ7L2phciZndDs8L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhbiBpbmxpbmUgbWFuaWZlc3Qgc3BlY2lmaWNhdGlvbiBpbmNsdWRpbmcgdGhlIHZlcnNpb24gb2YgdGhlIGJ1aWxkCi1wcm9ncmFtIChJbXBsZW1lbnRhdGlvbi1WZXJzaW9uKS4gTm90ZSB0aGF0IHRoZSBCdWlsdC1CeSBhdHRyaWJ1dGUgd2lsbCB0YWtlIHRoZSB2YWx1ZSBvZiB0aGUgQW50IAotcHJvcGVydHkgJHt1c2VyLm5hbWV9LiBUaGUgbWFuaWZlc3QgcHJvZHVjZWQgYnkgdGhlIGFib3ZlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgotPC9wPgorJmx0Oy9qYXImZ3Q7PC9wcmU+Cis8cD5UaGlzIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW5saW5lIG1hbmlmZXN0IHNwZWNpZmljYXRpb24gaW5jbHVkaW5nIHRoZSB2ZXJzaW9uIG9mIHRoZSBidWlsZCBwcm9ncmFtCisoPGNvZGU+SW1wbGVtZW50YXRpb24tVmVyc2lvbjwvY29kZT4pLiBOb3RlIHRoYXQgdGhlIDxjb2RlPkJ1aWx0LUJ5PC9jb2RlPiBhdHRyaWJ1dGUgd2lsbCB0YWtlIHRoZQordmFsdWUgb2YgdGhlIEFudCBwcm9wZXJ0eSA8Y29kZT51c2VyLm5hbWU8L2NvZGU+LiBUaGUgbWFuaWZlc3QgcHJvZHVjZWQgYnkgdGhlIGFib3ZlIHdvdWxkIGxvb2sgbGlrZQordGhpczo8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+PGNvZGU+TWFuaWZlc3QtVmVyc2lvbjogMS4wCis8cHJlPgorTWFuaWZlc3QtVmVyc2lvbjogMS4wCiBQZXJtaXNzaW9uczogc2FuZGJveAogQ29kZWJhc2U6IGV4YW1wbGUuY29tCiBCdWlsdC1CeTogY29ub3IKQEAgLTU1MSwzOCArNDk1LDUyIEBACiBDcmVhdGVkLUJ5OiBBcGFjaGUgQW50IDEuOS4yCiAKIE5hbWU6IGNvbW1vbi9NeUNsYXNzLmNsYXNzCi1TZWFsZWQ6IGZhbHNlPC9jb2RlPjwvcHJlPjwvYmxvY2txdW90ZT4KK1NlYWxlZDogZmFsc2U8L3ByZT4KIAogPGg0PlNlcnZpY2UgUHJvdmlkZXI8L2g0PgogCi08cD4KLSAgVGhlIGZvbGxvd2luZyBzaG93cyBob3cgdG8gY3JlYXRlIGEgamFyIGZpbGUgc3BlY2lmeWluZyBhIHNlcnZpY2UKLSAgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkRLNiBzY3JpcHRpbmcgaW50ZXJmYWNlOgotPC9wPgotPGJsb2NrcXVvdGU+PHByZT4mbHQ7amFyIGRlc3RmaWxlPSJwaW5reS5qYXIiJmd0OwotICAmbHQ7ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKLSAgJmx0O3NlcnZpY2UgdHlwZT0iamF2YXguc2NyaXB0LlNjcmlwdEVuZ2luZUZhY3RvcnkiCi0gICAgICAgICAgIHByb3ZpZGVyPSJvcmcuYWNtZS5QaW5reUxhbmd1YWdlIi8mZ3Q7Ci0mbHQ7L2phciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPlRoZSBmb2xsb3dpbmcgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIGphciBmaWxlIHNwZWNpZnlpbmcgYSBzZXJ2aWNlIHdpdGggYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlCitKREsgNiBzY3JpcHRpbmcgaW50ZXJmYWNlOjwvcD4KKzxwcmU+CismbHQ7amFyIGRlc3RmaWxlPSJwaW5reS5qYXIiJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iYnVpbGQvY2xhc3NlcyIvJmd0OworICAgICZsdDtzZXJ2aWNlIHR5cGU9ImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5IgorICAgICAgICAgICAgIHByb3ZpZGVyPSJvcmcuYWNtZS5QaW5reUxhbmd1YWdlIi8mZ3Q7CismbHQ7L2phciZndDs8L3ByZT4KIAotCi0KLTxwPgotICBUaGUgZm9sbG93aW5nIHNob3dzIGhvdyB0byBjcmVhdGUgYSBqYXIgZmlsZSBzcGVjaWZpbmcgYSBzZXJ2aWNlCi0gIHdpdGggdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgSkRLNiBzY3JpcHRpbmcgaW50ZXJmYWNlOgotPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZSBmb2xsb3dpbmcgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIGphciBmaWxlIHNwZWNpZnlpbmcgYSBzZXJ2aWNlIHdpdGggdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUKK0pESyA2IHNjcmlwdGluZyBpbnRlcmZhY2U6PC9wPgorPHByZT4KICZsdDtqYXIgZGVzdGZpbGU9InBpbmt5YW5kYnJhaW4uamFyIiZndDsKLSAgJmx0O2ZpbGVzZXQgZGlyPSJjbGFzc2VzIi8mZ3Q7Ci0gICZsdDtzZXJ2aWNlIHR5cGU9ImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVGYWN0b3J5IiZndDsKLSAgICAmbHQ7cHJvdmlkZXIgY2xhc3NuYW1lPSJvcmcuYWNtZS5QaW5reUxhbmd1YWdlIi8mZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyIGNsYXNzbmFtZT0ib3JnLmFjbWUuQnJhaW5MYW5ndWFnZSIvJmd0OwotICAmbHQ7L3NlcnZpY2UmZ3Q7Ci0mbHQ7L2phciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImNsYXNzZXMiLyZndDsKKyAgICAmbHQ7c2VydmljZSB0eXBlPSJqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lRmFjdG9yeSImZ3Q7CisgICAgICAgICZsdDtwcm92aWRlciBjbGFzc25hbWU9Im9yZy5hY21lLlBpbmt5TGFuZ3VhZ2UiLyZndDsKKyAgICAgICAgJmx0O3Byb3ZpZGVyIGNsYXNzbmFtZT0ib3JnLmFjbWUuQnJhaW5MYW5ndWFnZSIvJmd0OworICAgICZsdDsvc2VydmljZSZndDsKKyZsdDsvamFyJmd0OzwvcHJlPgogCi0KKzxoNCBpZD0iamVwMjM4LWV4YW1wbGUiPkpFUCAyMzggZXhhbXBsZTogYSBNdWx0aS1SZWxlYXNlIEpBUiBGaWxlczwvaDQ+Cis8cD5IZXJlIHdlIHdhbnQgdG8gY3JlYXRlIGEgPGVtPk11bHRpLVJlbGVhc2UgSkFSIEZpbGU8L2VtPiBhY2NvcmRpbmcgdGhlCitzcGVjaWZpY2F0aW9uIDxhIGhyZWY9Imh0dHBzOi8vb3Blbmpkay5qYXZhLm5ldC9qZXBzLzIzOCIgdGFyZ2V0PSJfdG9wIj5KRVAgMjM4PC9hPi4gSXQgZGVmaW5lcyBvbgordG9wIG9mIGEgSkFSIHRoZSBwb3NzaWJpbGl0eSB0byBwbGFjZSBhZGRpdGlvbmFsIG9yIG92ZXJ3cml0aW5nIGNsYXNzZXMgaW4gYSBqYXIsIHdoaWNoIGFyZQorYXZhaWxhYmxlIGFjY29yZGluZyB0byB0aGUgSmF2YSB2ZXJzaW9uIHlvdSBydW4uPGJyLz5CYXNpY2FsbHkgaXQgc2F5cywgdGhhdCB5b3UgaGF2ZSB0byBzZXQgdGhlCittYW5pZmVzdCBlbnRyeSA8Y29kZT5NdWx0aS1SZWxlYXNlOiB0cnVlPC9jb2RlPiBhbmQgcGxhY2UgYWxsIGFkZGl0aW9uYWwgb3Igb3ZlcndyaXRpbmcgY2xhc3NlcworaW4gPHNhbXA+TUVUQS1JTkYvdmVyc2lvbnMvPGk+bnVtYmVyPC9pPi9wYWNrYWdlLXN0cnVjdHVyZTwvc2FtcD4sCitlLmcuIDxzYW1wPk1FVEEtSU5GL3ZlcnNpb25zLzkvb3JnL2FwYWNoZS9hbnQvTXlDbGFzcy5jbGFzczwvc2FtcD48L3A+Cis8cD5JbiB0aGlzIGV4YW1wbGUgd2UgZXhwZWN0IHRoYXQgdGhlIG5vcm1hbCBjbGFzc2VzIGFyZSBjb21waWxlZCBpbnRvIDxzYW1wPiR7amF2YS5jbGFzc2VzfTwvc2FtcD4KK2FuZCB0aGUgSmF2YSA5IGNsYXNzZXMgYXJlIGNvbXBpbGVkIGludG8gPHNhbXA+JHtqYXZhOS5jbGFzc2VzfTwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7bXJqYXIuamFyJnF1b3Q7Jmd0OworICAgICZsdDttYW5pZmVzdCZndDsKKyAgICAgICAgJmx0OyEtLSBzcGVjaWFsIG1mLWVudHJ5IGFjY29yZGluZyB0byB0aGUgc3BlYyAtLSZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O011bHRpLVJlbGVhc2UmcXVvdDsgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9tYW5pZmVzdCZndDsKKyAgICAmbHQ7IS0tIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjIC4uLiAtLSZndDsKKyAgICAmbHQ7IS0tIC4uLiBkZWZhdWx0IGNsYXNzZXMgbG9hZGFibGUgYnkgb2xkICgmbHQ7SmF2YSA5KSB2ZXJzaW9ucyAtLSZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtqYXZhLmNsYXNzZXN9JnF1b3Q7LyZndDsKKyAgICAmbHQ7IS0tIC4uLiBwZXIgcmVsZWFzZSBjbGFzc2VzLCByZXF1aXJlIEphdmEgOSsgZm9yIGxvYWRhYmxlIHZpYSBzdGFuZGFyZCBDbGFzc0xvYWRlciAtLSZndDsKKyAgICAmbHQ7emlwZmlsZXNldCBwcmVmaXg9JnF1b3Q7TUVUQS1JTkYvdmVyc2lvbnMvOS8mcXVvdDsgZGlyPSZxdW90OyR7amF2YTkuY2xhc3Nlc30mcXVvdDsvJmd0OworJmx0Oy9qYXImZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwgYi9tYW51YWwvVGFza3MvamFybGliLWF2YWlsYWJsZS5odG1sCmluZGV4IGFkYjczMmYuLjZjMDcyYTEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2phcmxpYi1hdmFpbGFibGUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEyMSArMTUsMTExIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5qYXJsaWItYXZhaWxhYmxlIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphcmxpYi1hdmFpbGFibGUiPmphcmxpYi1hdmFpbGFibGU8L2E+PC9oMj4KKzxoMiBpZD0iamFybGliLWF2YWlsYWJsZSI+amFybGliLWF2YWlsYWJsZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Q2hlY2sgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIGZpbGVzZXQgb3IgYW4gZXh0ZW5zaW9uU2V0LgorPHA+Q2hlY2sgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIDxjb2RlPmZpbGVzZXQ8L2NvZGU+IG9yIGFuIDxjb2RlPmV4dGVuc2lvblNldDwvY29kZT4uCiBJZiB0aGUgZXh0ZW5zaW9uIGlzIHByZXNlbnQgdGhlbiBhIHByb3BlcnR5IGlzIHNldC48L3A+CiAKLTxwPk5vdGUgdGhhdCB0aGlzIHRhc2sKLXdvcmtzIHdpdGggZXh0ZW5zaW9ucyBhcyBkZWZpbmVkIGJ5IHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgc3BlY2lmaWNhdGlvbi4KLSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudAotPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+IGluIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91cgotSmF2YSBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKLTxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPiBvciB0aGUgb25saW5lCi08YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgotRXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlsczwvcD4KKzxwPk5vdGUgdGhhdCB0aGlzIHRhc2sgd29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQgPGVtPk9wdGlvbmFsIFBhY2thZ2UgVmVyc2lvbmluZzwvZW0+CitpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIgSmF2YSBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluCitmaWxlIDxzYW1wPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9zYW1wPiBvciB0aGUKK29ubGluZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiCit0YXJnZXQ9Il90b3AiPkV4dGVuc2lvbiBhbmQgRXh0ZW5zaW9uU2V0IGRvY3VtZW50YXRpb248L2E+IGZvciBmdXJ0aGVyIGRldGFpbHMuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHByb3BlcnR5IHRvIHNldCBpZiBleHRlbnNpb25zIGlzIGF2YWlsYWJsZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBwcm9wZXJ0eSB0byBzZXQgaWYgZXh0ZW5zaW9ucyBpcyBhdmFpbGFibGU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIGNoZWNrIGZvciBleHRlbnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIG9uZSBvZiBmaWxlLCBuZXN0ZWQKLSAgICBFeHRlbnNpb25TZXQgb3IgbmVzdGVkIGZpbGVzZXQgbXVzdCBiZSBwcmVzZW50LjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBjaGVjayBmb3IgZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICA8Y29kZT4mbHQ7ZXh0ZW5zaW9uU2V0Jmd0OzwvY29kZT4gb3IgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+ZXh0ZW5zaW9uPC9oND4KLSA8cD48YSBocmVmPSIuLi9UeXBlcy9leHRlbnNpb24uaHRtbCI+RXh0ZW5zaW9uPC9hPiB0aGUgZXh0ZW5zaW9uCi0gdG8gc2VhcmNoIGZvci48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9leHRlbnNpb24uaHRtbCI+RXh0ZW5zaW9uPC9hPiB0aGUgZXh0ZW5zaW9uIHRvIHNlYXJjaCBmb3IuPC9wPgogCiA8aDQ+ZmlsZXNldDwvaDQ+Ci0gPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0Ci1zZXRzIG9mIGZpbGVzIHRvIGNoZWNrIGZvciBleHRlbnNpb24uPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IHNldHMgb2YgZmlsZXMgdG8gY2hlY2sgZm9yCitleHRlbnNpb24uPC9wPgogCiA8aDQ+ZXh0ZW5zaW9uU2V0PC9oND4KLSA8cD48YSBocmVmPSIuLi9UeXBlcy9leHRlbnNpb25zZXQuaHRtbCI+RXh0ZW5zaW9uU2V0PC9hPnMgaXMgdGhlIHNldAotIG9mIGV4dGVuc2lvbnMgdG8gc2VhcmNoIGZvciBleHRlbnNpb24gaW4uPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZXh0ZW5zaW9uc2V0Lmh0bWwiPkV4dGVuc2lvblNldDwvYT5zIGlzIHRoZSBzZXQgb2YgZXh0ZW5zaW9ucyB0byBzZWFyY2ggZm9yCitleHRlbnNpb24gaW4uPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+PGI+U2VhcmNoIGZvciBleHRlbnNpb24gaW4gc2luZ2xlIGZpbGU8L2I+PC9wPgorPHA+U2VhcmNoIGZvciBleHRlbnNpb24gaW4gc2luZ2xlIGZpbGU8L3A+CiA8cHJlPgotICAmbHQ7amFybGliLWF2YWlsYWJsZSBwcm9wZXJ0eT0mcXVvdDtteWV4dC5wcmVzZW50JnF1b3Q7IGZpbGU9JnF1b3Q7bXlmaWxlLmphciZxdW90OyZndDsKLSAgICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICBleHRlbnNpb25OYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50JnF1b3Q7Ci0gICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjQuOSZxdW90OwotICAgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7Ci0gICZsdDsvamFybGliLWF2YWlsYWJsZSZndDsKKyZsdDtqYXJsaWItYXZhaWxhYmxlIHByb3BlcnR5PSZxdW90O215ZXh0LnByZXNlbnQmcXVvdDsgZmlsZT0mcXVvdDtteWZpbGUuamFyJnF1b3Q7Jmd0OworICAmbHQ7ZXh0ZW5zaW9uIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQmcXVvdDsKKyAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjQuOSZxdW90OworICAgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24mcXVvdDsvJmd0OworJmx0Oy9qYXJsaWItYXZhaWxhYmxlJmd0OwogPC9wcmU+CiAKLTxwPjxiPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIHNpbmdsZSBmaWxlIHJlZmVyZW5jaW5nIGV4dGVybmFsIEV4dGVuc2lvbjwvYj48L3A+Cis8cD5TZWFyY2ggZm9yIGV4dGVuc2lvbiBpbiBzaW5nbGUgZmlsZSByZWZlcmVuY2luZyBleHRlcm5hbCBFeHRlbnNpb248L3A+CiA8cHJlPgotICAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7Ci0gICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudCZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuNC45JnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CismbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7CisgICAgICAgICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS40LjkmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CiAKLSAgJmx0O2phcmxpYi1hdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7bXlleHQucHJlc2VudCZxdW90OyBmaWxlPSZxdW90O215ZmlsZS5qYXImcXVvdDsmZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtteWV4dCZxdW90Oy8mZ3Q7Ci0gICZsdDsvamFybGliLWF2YWlsYWJsZSZndDsKLTwvcHJlPgotPHA+PGI+U2VhcmNoIGZvciBleHRlbnNpb24gaW4gZmlsZXNldDwvYj48L3A+CismbHQ7amFybGliLWF2YWlsYWJsZSBwcm9wZXJ0eT0mcXVvdDtteWV4dC5wcmVzZW50JnF1b3Q7IGZpbGU9JnF1b3Q7bXlmaWxlLmphciZxdW90OyZndDsKKyAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtteWV4dCZxdW90Oy8mZ3Q7CismbHQ7L2phcmxpYi1hdmFpbGFibGUmZ3Q7PC9wcmU+CisKKzxwPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIGZpbGVzZXQ8L3A+CiA8cHJlPgotICAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7Ci0gICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudCZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuNC45JnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CismbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O215ZXh0JnF1b3Q7CisgICAgICAgICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS40LjkmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiZxdW90Oy8mZ3Q7CiAKLSAgJmx0O2phcmxpYi1hdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7bXlleHQucHJlc2VudCZxdW90OyZndDsKLSAgICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSZxdW90O215ZXh0JnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiImZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9qYXJsaWItYXZhaWxhYmxlJmd0OwotPC9wcmU+Ci08cD48Yj5TZWFyY2ggZm9yIGV4dGVuc2lvbiBpbiBleHRlbnNpb25TZXQ8L2I+PC9wPgorJmx0O2phcmxpYi1hdmFpbGFibGUgcHJvcGVydHk9JnF1b3Q7bXlleHQucHJlc2VudCZxdW90OyZndDsKKyAgJmx0O2V4dGVuc2lvbiByZWZpZD0mcXVvdDtteWV4dCZxdW90Oy8mZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0ibGliIiZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqLmphciIvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2phcmxpYi1hdmFpbGFibGUmZ3Q7PC9wcmU+CisKKzxwPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIGV4dGVuc2lvblNldDwvcD4KIDxwcmU+Ci0gICZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7bXlleHQmcXVvdDsKLSAgICBleHRlbnNpb25OYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50JnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS40LjkmcXVvdDsKLSAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7LyZndDsKKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7bXlleHQmcXVvdDsKKyAgICAgICAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudCZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjQuOSZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uJnF1b3Q7LyZndDsKIAotICAmbHQ7amFybGliLWF2YWlsYWJsZSBwcm9wZXJ0eT0mcXVvdDtteWV4dC5wcmVzZW50JnF1b3Q7Jmd0OwotICAgICZsdDtleHRlbnNpb24gcmVmaWQ9JnF1b3Q7bXlleHQmcXVvdDsvJmd0OwotICAgICZsdDtleHRlbnNpb25TZXQgaWQ9JnF1b3Q7ZXh0czMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7bGliZmlsZXNldAotICAgICAgICBpbmNsdWRlVXJsPSZxdW90O2ZhbHNlJnF1b3Q7Ci0gICAgICAgIGluY2x1ZGVJbXBsPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgZGlyPSZxdW90O2xpYiZxdW90OyZndDsKLSAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLmphciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L2xpYmZpbGVzZXQmZ3Q7Ci0gICAgJmx0Oy9leHRlbnNpb25TZXQmZ3Q7Ci0gICZsdDsvamFybGliLWF2YWlsYWJsZSZndDsKLTwvcHJlPgotCi0KKyZsdDtqYXJsaWItYXZhaWxhYmxlIHByb3BlcnR5PSZxdW90O215ZXh0LnByZXNlbnQmcXVvdDsmZ3Q7CisgICZsdDtleHRlbnNpb24gcmVmaWQ9JnF1b3Q7bXlleHQmcXVvdDsvJmd0OworICAmbHQ7ZXh0ZW5zaW9uU2V0IGlkPSZxdW90O2V4dHMzJnF1b3Q7Jmd0OworICAgICZsdDtsaWJmaWxlc2V0IGluY2x1ZGVVcmw9JnF1b3Q7ZmFsc2UmcXVvdDsKKyAgICAgICAgICAgICAgICBpbmNsdWRlSW1wbD0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgICAgICAgZGlyPSZxdW90O2xpYiZxdW90OyZndDsKKyAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki5qYXImcXVvdDsvJmd0OworICAgICZsdDsvbGliZmlsZXNldCZndDsKKyAgJmx0Oy9leHRlbnNpb25TZXQmZ3Q7CismbHQ7L2phcmxpYi1hdmFpbGFibGUmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2phcmxpYi1kaXNwbGF5Lmh0bWwgYi9tYW51YWwvVGFza3MvamFybGliLWRpc3BsYXkuaHRtbAppbmRleCAwZGRiYWEzLi5iNTc3YjVhIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvamFybGliLWRpc3BsYXkuaHRtbAorKysgYi9tYW51YWwvVGFza3MvamFybGliLWRpc3BsYXkuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDY3ICsxNSw1NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+amFybGliLWRpc3BsYXkgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iamFybGliLWRpc3BsYXkiPmphcmxpYi1kaXNwbGF5PC9hPjwvaDI+Cis8aDIgaWQ9ImphcmxpYi1kaXNwbGF5Ij5qYXJsaWItZGlzcGxheTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RGlzcGxheSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIGFuZCAiUGFja2FnZSBTcGVjaWZpY2F0aW9uIiBpbmZvcm1hdGlvbgotIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBqYXJzLjwvcD4KKzxwPkRpc3BsYXkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBhbmQgIlBhY2thZ2UgU3BlY2lmaWNhdGlvbiIgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiB0aGUKK3NwZWNpZmllZCBqYXJzLjwvcD4KIAotPHA+Tm90ZSB0aGF0IHRoaXMgdGFzawotd29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgotIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50Ci08ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCi1KYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIHRoZSBvbmxpbmUKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+Ci1FeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uPC9hPiBmb3IgZnVydGhlciBkZXRhaWxzPC9wPgorPHA+Tm90ZSB0aGF0IHRoaXMgdGFzayB3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudCA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4KK2luIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91ciBKYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4KK2ZpbGUgPHNhbXA+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L3NhbXA+IG9yIHRoZQorb25saW5lIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCIKK3RhcmdldD0iX3RvcCI+RXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlscy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBkaXNwbGF5IGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBhYm91dC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGJ1dCBvbmUgb2YgZmlsZSBvciBmaWxlc2V0IG11c3QgYmUKLSAgICBwcmVzZW50LjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBkaXNwbGF5IGV4dGVuc2lvbiBpbmZvcm1hdGlvbiBhYm91dDwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIGEgbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaXMgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmZpbGVzZXQ8L2g0PgotIDxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zIGNvbnRhaW4gbGlzdCBvZiBmaWxlcyB0bwotIGRpc3BsYXkgRXh0ZW5zaW9uIGluZm9ybWF0aW9uICBhYm91dC48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBjb250YWluIGxpc3Qgb2YgZmlsZXMgdG8gZGlzcGxheSBFeHRlbnNpb24KK2luZm9ybWF0aW9uIGFib3V0LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPkRpc3BsYXkgRXh0ZW5zaW9uIGluZm8gZm9yIGEgc2luZ2xlIGZpbGU8L2I+PC9wPgorPHA+RGlzcGxheSBFeHRlbnNpb24gaW5mbyBmb3IgYSBzaW5nbGUgZmlsZTwvcD4KKzxwcmU+Jmx0O2phcmxpYi1kaXNwbGF5IGZpbGU9JnF1b3Q7bXlmaWxlLmphciZxdW90OyZndDs8L3ByZT4KKworPHA+RGlzcGxheSBFeHRlbnNpb24gaW5mbyBmb3IgYSBmaWxlc2V0PC9wPgogPHByZT4KLSAgJmx0O2phcmxpYi1kaXNwbGF5IGZpbGU9JnF1b3Q7bXlmaWxlLmphciZxdW90OyZndDsKLTwvcHJlPgotCi08cD48Yj5EaXNwbGF5IEV4dGVuc2lvbiBpbmZvIGZvciBhIGZpbGVzZXQ8L2I+PC9wPgotPHByZT4KLSAgJmx0O2phcmxpYi1kaXNwbGF5Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0ibGliIiZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9IiouamFyIi8mZ3Q7Ci0gICAgJmx0Oy9maWxlc2V0Jmd0OwotICAmbHQ7L2phcmxpYi1kaXNwbGF5Jmd0OwotPC9wcmU+Ci0KLQorJmx0O2phcmxpYi1kaXNwbGF5Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiImZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0iKi5qYXIiLyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9qYXJsaWItZGlzcGxheSZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvamFybGliLW1hbmlmZXN0Lmh0bWwgYi9tYW51YWwvVGFza3MvamFybGliLW1hbmlmZXN0Lmh0bWwKaW5kZXggMDE5YjU1NC4uZWU2OTc5MCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2phcmxpYi1tYW5pZmVzdC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9qYXJsaWItbWFuaWZlc3QuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDg4ICsxNSw3OSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+amFybGliLW1hbmlmZXN0IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphcmxpYi1tYW5pZmVzdCI+amFybGliLW1hbmlmZXN0PC9hPjwvaDI+Cis8aDIgaWQ9ImphcmxpYi1tYW5pZmVzdCI+amFybGliLW1hbmlmZXN0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5UYXNrIHRvIGdlbmVyYXRlIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcwotIGluIG1hbmlmZXN0LiBUaGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgaW4gdGhlCi0gc3BlY2lmaWVkIHBhdGggYW5kIHNlYXJjaGluZyBmb3IgRXh0ZW5zaW9uIC8gIk9wdGlvbmFsIFBhY2thZ2UiCi0gc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy48L3A+Cis8cD5UYXNrIHRvIGdlbmVyYXRlIGEgbWFuaWZlc3QgdGhhdCBkZWNsYXJlcyBhbGwgdGhlIGRlcGVuZGVuY2llcyBpbiBtYW5pZmVzdC4gVGhlIGRlcGVuZGVuY2llcyBhcmUKK2RldGVybWluZWQgYnkgbG9va2luZyBpbiB0aGUgc3BlY2lmaWVkIHBhdGggYW5kIHNlYXJjaGluZyBmb3IgRXh0ZW5zaW9uIC8gIk9wdGlvbmFsIFBhY2thZ2UiCitzcGVjaWZpY2F0aW9ucyBpbiB0aGUgbWFuaWZlc3RzIG9mIHRoZSBqYXJzLjwvcD4KIAotPHA+Tm90ZSB0aGF0IHRoaXMgdGFzawotd29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgotIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50Ci08ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCi1KYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIHRoZSBvbmxpbmUKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+Ci1FeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uPC9hPiBmb3IgZnVydGhlciBkZXRhaWxzPC9wPgorPHA+Tm90ZSB0aGF0IHRoaXMgdGFzayB3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudCA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4KK2luIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91ciBKYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4KK2ZpbGUgPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIHRoZQorb25saW5lIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCIKK3RhcmdldD0iX3RvcCI+RXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlscy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gZ2VuZXJhdGUgTWFuaWZlc3QgaW50bzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgICA8dGQ+ZGVzdGZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBnZW5lcmF0ZSBNYW5pZmVzdCBpbnRvPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmV4dGVuc2lvbjwvaDQ+Ci0gPHA+PGEgaHJlZj0iLi4vVHlwZXMvZXh0ZW5zaW9uLmh0bWwiPkV4dGVuc2lvbjwvYT4gdGhlIGV4dGVuc2lvbgotIHRoYXQgdGhpcyBsaWJyYXJ5IGltcGxlbWVudHMuPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZXh0ZW5zaW9uLmh0bWwiPkV4dGVuc2lvbjwvYT4gdGhlIGV4dGVuc2lvbiB0aGF0IHRoaXMgbGlicmFyeSBpbXBsZW1lbnRzLjwvcD4KIAogPGg0PmRlcGVuZHM8L2g0PgotIDxwPjxhIGhyZWY9Ii4uL1R5cGVzL2V4dGVuc2lvbnNldC5odG1sIj5FeHRlbnNpb25TZXQ8L2E+cyBjb250YWluaW5nCi0gYWxsIGRlcGVuZGVuY2llcyBmb3IgamFyLjwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL2V4dGVuc2lvbnNldC5odG1sIj5FeHRlbnNpb25TZXQ8L2E+cyBjb250YWluaW5nIGFsbCBkZXBlbmRlbmNpZXMgZm9yIGphci48L3A+CiAKIDxoND5vcHRpb25zPC9oND4KLSA8cD48YSBocmVmPSIuLi9UeXBlcy9leHRlbnNpb25zZXQuaHRtbCI+RXh0ZW5zaW9uU2V0PC9hPnMgY29udGFpbmluZwotIGFsbCBvcHRpb25hbCBkZXBlbmRlbmNpZXMgZm9yIGphci4gKE9wdGlvbmFsIGRlcGVuZGVuY2llcyB3aWxsIGJlIHVzZWQgaWYKLSBwcmVzZW50IGVsc2UgdGhleSB3aWxsIGJlIGlnbm9yZWQpPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZXh0ZW5zaW9uc2V0Lmh0bWwiPkV4dGVuc2lvblNldDwvYT5zIGNvbnRhaW5pbmcgYWxsIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBmb3IKK2phci4gKE9wdGlvbmFsIGRlcGVuZGVuY2llcyB3aWxsIGJlIHVzZWQgaWYgcHJlc2VudCBlbHNlIHRoZXkgd2lsbCBiZSBpZ25vcmVkKTwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPkJhc2ljIE1hbmlmZXN0IGdlbmVyYXRlZCBmb3Igc2luZ2xlIEV4dGVuc2lvbjwvYj48L3A+Cis8cD5CYXNpYyBNYW5pZmVzdCBnZW5lcmF0ZWQgZm9yIHNpbmdsZSBFeHRlbnNpb248L3A+CiA8cHJlPgogJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtlMSZxdW90OwotICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7TXlFeHRlbnNpb25zJnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsKLSAgICBpbXBsZW1lbnRhdGlvblZlbmRvcklEPSZxdW90O3Z2JnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25WZXJzaW9uPSZxdW90OzIuMCZxdW90OwotICAgIGltcGxlbWVudGF0aW9uVVJMPSZxdW90O2h0dHA6Ly9zb21ld2hlcmUuY29tJnF1b3Q7LyZndDsKKyAgICAgICAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtNeUV4dGVuc2lvbnMmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7CisgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQ9JnF1b3Q7dnYmcXVvdDsKKyAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7CisgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsKKyAgICAgICAgICAgaW1wbGVtZW50YXRpb25VUkw9JnF1b3Q7aHR0cHM6Ly9zb21ld2hlcmUuY29tJnF1b3Q7LyZndDsKIAogJmx0O2phcmxpYi1tYW5pZmVzdCBkZXN0ZmlsZT0mcXVvdDtteU1hbmlmZXN0LnR4dCZxdW90OyZndDsKICAgICAmbHQ7ZXh0ZW5zaW9uIHJlZmlkPSZxdW90O2UxJnF1b3Q7LyZndDsKLSZsdDsvamFybGliLW1hbmlmZXN0Jmd0OwotPC9wcmU+CismbHQ7L2phcmxpYi1tYW5pZmVzdCZndDs8L3ByZT4KIAotPHA+PGI+U2VhcmNoIGZvciBleHRlbnNpb24gaW4gZmlsZXNldDwvYj48L3A+Ci08cD48Yj5BIGxhcmdlIGV4YW1wbGUgd2l0aCByZXF1aXJlZCBhbmQgb3B0aW9uYWwgZGVwZW5kZW5jaWVzPC9iPjwvcD4KKzxwPlNlYXJjaCBmb3IgZXh0ZW5zaW9uIGluIGZpbGVzZXQ6IGEgbGFyZ2UgZXhhbXBsZSB3aXRoIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBkZXBlbmRlbmNpZXM8L3A+CiA8cHJlPgogJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtlMSZxdW90OwotICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7TXlFeHRlbnNpb25zJnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7Ci0gICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsKLSAgICBpbXBsZW1lbnRhdGlvblZlbmRvcklEPSZxdW90O3Z2JnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25WZXJzaW9uPSZxdW90OzIuMCZxdW90OwotICAgIGltcGxlbWVudGF0aW9uVVJMPSZxdW90O2h0dHA6Ly9zb21ld2hlcmUuY29tJnF1b3Q7LyZndDsKKyAgICAgICAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtNeUV4dGVuc2lvbnMmcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgICAgICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7CisgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQ9JnF1b3Q7dnYmcXVvdDsKKyAgICAgICAgICAgaW1wbGVtZW50YXRpb25WZW5kb3I9JnF1b3Q7QXBhY2hlJnF1b3Q7CisgICAgICAgICAgIGltcGxlbWVudGF0aW9uVmVyc2lvbj0mcXVvdDsyLjAmcXVvdDsKKyAgICAgICAgICAgaW1wbGVtZW50YXRpb25VUkw9JnF1b3Q7aHR0cHM6Ly9zb21ld2hlcmUuY29tJnF1b3Q7LyZndDsKIAogJmx0O2V4dGVuc2lvblNldCBpZD0mcXVvdDtvcHRpb24uZXh0JnF1b3Q7Jmd0OwogICAgICZsdDtsaWJmaWxlc2V0IGRpcj0mcXVvdDtsaWIvb3B0aW9uJnF1b3Q7Jmd0OwpAQCAtMTEzLDExICsxMDUsNyBAQAogICAgICZsdDtleHRlbnNpb24gcmVmaWQ9JnF1b3Q7ZTEmcXVvdDsvJmd0OwogICAgICZsdDtkZXBlbmRzIHJlZmlkPSZxdW90O2RlcGVuZHMuZXh0JnF1b3Q7LyZndDsKICAgICAmbHQ7b3B0aW9ucyByZWZpZD0mcXVvdDtvcHRpb24uZXh0JnF1b3Q7LyZndDsKLSZsdDsvamFybGliLW1hbmlmZXN0Jmd0OwotPC9wcmU+Ci0KLQorJmx0Oy9qYXJsaWItbWFuaWZlc3QmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2phcmxpYi1yZXNvbHZlLmh0bWwgYi9tYW51YWwvVGFza3MvamFybGliLXJlc29sdmUuaHRtbAppbmRleCAyZWY0Zjg3Li4zMWMzYWNkIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvamFybGliLXJlc29sdmUuaHRtbAorKysgYi9tYW51YWwvVGFza3MvamFybGliLXJlc29sdmUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE5OCArMTUsMTgxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5qYXJsaWItcmVzb2x2ZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJqYXJsaWItcmVzb2x2ZSI+amFybGliLXJlc29sdmU8L2E+PC9oMj4KKzxoMiBpZD0iamFybGliLXJlc29sdmUiPmphcmxpYi1yZXNvbHZlPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5UcnkgdG8gbG9jYXRlIGEgamFyIHRvIHNhdGlzZnkgYW4gZXh0ZW5zaW9uIGFuZCBwbGFjZQotIGxvY2F0aW9uIG9mIGphciBpbnRvIHByb3BlcnR5LiBUaGUgdGFzayBhbGxvd3MgeW91IHRvCi0gYWRkIGEgbnVtYmVyIG9mIHJlc29sdmVycyB0aGF0IGFyZSBjYXBhYmxlIG9mIGxvY2F0aW5nIGEKLSBsaWJyYXJ5IGZvciBhIHNwZWNpZmljIGV4dGVuc2lvbi4gRWFjaCByZXNvbHZlciB3aWxsIGJlIGF0dGVtcHRlZAotIGluIHNwZWNpZmllZCBvcmRlciB1bnRpbCBsaWJyYXJ5IGlzIGZvdW5kIG9yIG5vIHJlc29sdmVycyBhcmUgbGVmdC4KLSBJZiBubyByZXNvbHZlcnMgYXJlIGxlZnQgYW5kIGZhaWxPbkVycm9yIGlzIHRydWUgdGhlbiBhIEJ1aWxkRXhjZXB0aW9uCi0gd2lsbCBiZSB0aHJvd24uPC9wPgorPHA+VHJ5IHRvIGxvY2F0ZSBhIGphciB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiBhbmQgcGxhY2UgbG9jYXRpb24gb2YgamFyIGludG8gcHJvcGVydHkuIFRoZSB0YXNrCithbGxvd3MgeW91IHRvIGFkZCBhIG51bWJlciBvZiByZXNvbHZlcnMgdGhhdCBhcmUgY2FwYWJsZSBvZiBsb2NhdGluZyBhIGxpYnJhcnkgZm9yIGEgc3BlY2lmaWMKK2V4dGVuc2lvbi4gRWFjaCByZXNvbHZlciB3aWxsIGJlIGF0dGVtcHRlZCBpbiBzcGVjaWZpZWQgb3JkZXIgdW50aWwgbGlicmFyeSBpcyBmb3VuZCBvciBubyByZXNvbHZlcnMKK2FyZSBsZWZ0LiAgSWYgbm8gcmVzb2x2ZXJzIGFyZSBsZWZ0IGFuZCA8dmFyPmZhaWxPbkVycm9yPC92YXI+IGlzIHRydWUgdGhlbgorYSA8Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24uPC9wPgogCi08cD5Ob3RlIHRoYXQgdGhpcyB0YXNrCi13b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCi0gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKLTxlbT5PcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmc8L2VtPiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKLUphdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIHRoZSBvbmxpbmUKLTxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCI+Ci1FeHRlbnNpb24gYW5kIEV4dGVuc2lvblNldCBkb2N1bWVudGF0aW9uPC9hPiBmb3IgZnVydGhlciBkZXRhaWxzPC9wPgorPHA+Tm90ZSB0aGF0IHRoaXMgdGFzayB3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudCA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4KK2luIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91ciBKYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4KK2ZpbGUgPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIHRoZQorb25saW5lIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbCIKK3RhcmdldD0iX3RvcCI+RXh0ZW5zaW9uIGFuZCBFeHRlbnNpb25TZXQgZG9jdW1lbnRhdGlvbjwvYT4gZm9yIGZ1cnRoZXIgZGV0YWlscy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IHRvIGxpYnJhcnkgbG9jYXRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgcHJvcGVydHkgdG8gc2V0IHRvIGxpYnJhcnkgbG9jYXRpb24uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbE9uRXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VHJ1ZSBpZiBmYWlsdXJlIHRvIGxvY2F0ZSBsaWJyYXJ5IHNob3VsZCByZXN1bHQgaW4gYnVpbGQgZXhjZXB0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZD5mYWlsT25FcnJvcjwvdGQ+CisgICAgPHRkPjxxPnRydWU8L3E+IGlmIGZhaWx1cmUgdG8gbG9jYXRlIGxpYnJhcnkgc2hvdWxkIHJlc3VsdCBpbiBidWlsZCBleGNlcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hlY2tFeHRlbnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VHJ1ZSBpZiBsaWJyYXJpZXMgcmV0dXJuZWQgYnkgbmVzdGVkIHJlc29sdmVycyBzaG91bGQgYmUgY2hlY2tlZCB0byBzZWUgaWYKLSAgICB0aGV5IHN1cHBseSBleHRlbnNpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPmNoZWNrRXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT4gaWYgbGlicmFyaWVzIHJldHVybmVkIGJ5IG5lc3RlZCByZXNvbHZlcnMgc2hvdWxkIGJlIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkKKyAgICAgIHN1cHBseSBleHRlbnNpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmV4dGVuc2lvbjwvaDQ+Ci0gPHA+PGEgaHJlZj0iLi4vVHlwZXMvZXh0ZW5zaW9uLmh0bWwiPkV4dGVuc2lvbjwvYT4gdGhlIGV4dGVuc2lvbgotIHRvIHJlc29sdmUuIE11c3QgYmUgcHJlc2VudDwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL2V4dGVuc2lvbi5odG1sIj5FeHRlbnNpb248L2E+IHRoZSBleHRlbnNpb24gdG8gcmVzb2x2ZS4gTXVzdCBiZSBwcmVzZW50PC9wPgogCiA8aDQ+bG9jYXRpb248L2g0PgotIDxwPlRoZSBsb2NhdGlvbiBzdWIgZWxlbWVudCBhbGxvd3MgeW91IHRvIGxvb2sgZm9yIGEgbGlicmFyeSBpbiBhCi0gbG9jYXRpb24gcmVsYXRpdmUgdG8gcHJvamVjdCBkaXJlY3RvcnkuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gbmVzdGVkIGVsZW1lbnQgYWxsb3dzIHlvdSB0byBsb29rIGZvciBhIGxpYnJhcnkgaW4gYSBsb2NhdGlvbiByZWxhdGl2ZQordG8gcHJvamVjdCBkaXJlY3RvcnkuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXRobmFtZSBvZiBsaWJyYXJ5LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5sb2NhdGlvbjwvdGQ+CisgICAgPHRkPlRoZSBwYXRobmFtZSBvZiBsaWJyYXJ5LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+dXJsPC9oND4KLSA8cD5UaGUgdXJsIHJlc29sdmVyIGFsbG93cyB5b3UgdG8gZG93bmxvYWQgYSBsaWJyYXJ5IGZyb20gYSBVUkwgdG8gYQotIGxvY2FsIGZpbGUuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSA8Y29kZT51cmw8L2NvZGU+IHJlc29sdmVyIGFsbG93cyB5b3UgdG8gZG93bmxvYWQgYSBsaWJyYXJ5IGZyb20gYSBVUkwgdG8gYSBsb2NhbCBmaWxlLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIFVSTCB0byBkb3dubG9hZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dXJsPC90ZD4KKyAgICA8dGQ+VGhlIFVSTCB0byBkb3dubG9hZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBkb3dubG9hZCBVUkwgaW50by48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIEJ1dCBvbmUgb2YgZGVzdGZpbGUgb3IKLSAgICBkZXN0ZGlyIG11c3QgYmUgcHJlc2VudDwvdGQ+CisgICAgPHRkPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgdG8gZG93bmxvYWQgVVJMIGludG8uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBwbGFjZSBkb3dubG9hZGVkIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBCdXQgb25lIG9mIGRlc3RmaWxlIG9yCi0gICAgZGVzdGRpciBtdXN0IGJlIHByZXNlbnQ8L3RkPgorICAgIDx0ZD5kZXN0ZGlyPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcGxhY2UgZG93bmxvYWRlZCBmaWxlLjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+YW50PC9oND4KLSA8cD5UaGUgYW50IHJlc29sdmVyIGFsbG93cyB5b3UgdG8gcnVuIGFuIEFwYWNoZSBBbnQgYnVpbGQgZmlsZSB0byBnZW5lcmF0ZSBhIGxpYnJhcnkuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSA8Y29kZT5hbnQ8L2NvZGU+IHJlc29sdmVyIGFsbG93cyB5b3UgdG8gcnVuIGFuIEFwYWNoZSBBbnQgYnVpbGQgZmlsZSB0byBnZW5lcmF0ZSBhCitsaWJyYXJ5LjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hbnRmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBidWlsZCBmaWxlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5hbnRmaWxlPC90ZD4KKyAgICA8dGQ+VGhlIGJ1aWxkIGZpbGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdGhhdCB0aGUgYW50IGJ1aWxkIGNyZWF0ZXMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgdGhhdCB0aGUgYW50IGJ1aWxkIGNyZWF0ZXMuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0YXJnZXQgdG8gcnVuIGluIGJ1aWxkIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dGFyZ2V0PC90ZD4KKyAgICA8dGQ+VGhlIHRhcmdldCB0byBydW4gaW4gYnVpbGQgZmlsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+PGI+UmVzb2x2ZSBFeHRlbnNpb24gdG8gZmlsZS48L2I+IElmIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgZmlsZQotICAgZG9lcyBub3QgaW1wbGVtZW50IGV4dGVuc2lvbiB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbi48L3A+Cis8cD5SZXNvbHZlIEV4dGVuc2lvbiB0byBmaWxlLiBJZiBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGZpbGUgZG9lcyBub3QgaW1wbGVtZW50IGV4dGVuc2lvbiB0aGVuIHRocm93CithbiBleGNlcHRpb24uPC9wPgogPHByZT4KLSAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7Ci0gICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZHZlLmV4dCZxdW90OworICAgICAgICAgICBleHRlbnNpb25OYW1lPSZxdW90O29yZy5yZWFsaXR5Zm9yZ2UuZHZlJnF1b3Q7CisgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7CiAKLSAgJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OwotICAgICZsdDtsb2NhdGlvbiBsb2NhdGlvbj0iL29wdC9qYXJzL2R2ZS5qYXIiLyZndDsKLSAgJmx0Oy9qYXJsaWItcmVzb2x2ZSZndDsKLTwvcHJlPgorJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7CisgICZsdDtleHRlbnNpb24gcmVmaWQ9ImR2ZS5leHQiLyZndDsKKyAgJmx0O2xvY2F0aW9uIGxvY2F0aW9uPSIvb3B0L2phcnMvZHZlLmphciIvJmd0OworJmx0Oy9qYXJsaWItcmVzb2x2ZSZndDs8L3ByZT4KIAotPHA+PGI+UmVzb2x2ZSBFeHRlbnNpb24gdG8gdXJsLjwvYj4gSWYgdXJsIGRvZXMgbm90IGV4aXN0IG9yIGNhbiBub3Qgd3JpdGUKLSAgIHRvIGRlc3RmaWxlIG9yIGZpbGVzIGRvZXMgbm90IGltcGxlbWVudCBleHRlbnNpb24gdGhlbiB0aHJvdyBhbiBleGNlcHRpb24uPC9wPgorPHA+UmVzb2x2ZSBFeHRlbnNpb24gdG8gVVJMLiBJZiBVUkwgZG9lcyBub3QgZXhpc3Qgb3IgY2FuIG5vdCB3cml0ZSB0byA8dmFyPmRlc3RmaWxlPC92YXI+IG9yIGZpbGUKK2RvZXMgbm90IGltcGxlbWVudCBleHRlbnNpb24gdGhlbiB0aHJvdyBhbiBleGNlcHRpb24uPC9wPgogPHByZT4KLSAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7Ci0gICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZHZlLmV4dCZxdW90OworICAgICAgICAgICBleHRlbnNpb25OYW1lPSZxdW90O29yZy5yZWFsaXR5Zm9yZ2UuZHZlJnF1b3Q7CisgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7CiAKLSAgJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OwotICAgICZsdDt1cmwgdXJsPSJodHRwOi8vd3d3LnJlYWxpdHlmb3JnZS5uZXQvamFycy9kdmUuamFyIiBkZXN0ZmlsZT0ibGliL2R2ZS5qYXIiLyZndDsKLSAgJmx0Oy9qYXJsaWItcmVzb2x2ZSZndDsKLTwvcHJlPgorJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7CisgICZsdDtleHRlbnNpb24gcmVmaWQ9ImR2ZS5leHQiLyZndDsKKyAgJmx0O3VybCB1cmw9Imh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL2phcnMvZHZlLmphciIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CismbHQ7L2phcmxpYi1yZXNvbHZlJmd0OzwvcHJlPgogCi08cD48Yj5SZXNvbHZlIEV4dGVuc2lvbiB0byBmaWxlIHByb2R1Y2UgYnkgYW50IGJ1aWxkLjwvYj4gSWYgZmlsZSBkb2VzIG5vdCBnZXQgcHJvZHVjZWQKLSAgIG9yIGFudCBmaWxlIGlzIG1pc3Npbmcgb3IgYnVpbGQgZmFpbHMgdGhlbiB0aHJvdyBhbiBleGNlcHRpb24gKE5vdGUgZG9lcyBub3QgY2hlY2sKLSAgIHRoYXQgbGlicmFyeSBpbXBsZW1lbnRzIGV4dGVuc2lvbikuPC9wPgorPHA+UmVzb2x2ZSBFeHRlbnNpb24gdG8gZmlsZSBwcm9kdWNlIGJ5IEFudCBidWlsZC4gSWYgZmlsZSBkb2VzIG5vdCBnZXQgcHJvZHVjZWQgb3IgQW50IGZpbGUgaXMKK21pc3Npbmcgb3IgYnVpbGQgZmFpbHMgdGhlbiB0aHJvdyBhbiBleGNlcHRpb24uICg8c3Ryb25nPk5vdGU8L3N0cm9uZz46IGRvZXMgbm90IGNoZWNrIHRoYXQgbGlicmFyeQoraW1wbGVtZW50cyBleHRlbnNpb24uKTwvcD4KIDxwcmU+Ci0gICZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZHZlLmV4dCZxdW90OwotICAgIGV4dGVuc2lvbk5hbWU9JnF1b3Q7b3JnLnJlYWxpdHlmb3JnZS5kdmUmcXVvdDsKLSAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjImcXVvdDsKLSAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7CismbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O2R2ZS5leHQmcXVvdDsKKyAgICAgICAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjImcXVvdDsKKyAgICAgICAgICAgc3BlY2lmaWNhdGlvblZlbmRvcj0mcXVvdDtQZXRlciBEb25hbGQmcXVvdDsvJmd0OwogCi0gICZsdDtqYXJsaWItcmVzb2x2ZSBwcm9wZXJ0eT0iZHZlLmxpYnJhcnkiIGNoZWNrRXh0ZW5zaW9uPSJmYWxzZSImZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OwotICAgICZsdDthbnQgYW50ZmlsZT0iLi4vZHZlL2J1aWxkLnhtbCIgdGFyZ2V0PSJtYWluIiBkZXN0ZmlsZT0ibGliL2R2ZS5qYXIiLyZndDsKLSAgJmx0Oy9qYXJsaWItcmVzb2x2ZSZndDsKLTwvcHJlPgorJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSIgY2hlY2tFeHRlbnNpb249ImZhbHNlIiZndDsKKyAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OworICAmbHQ7YW50IGFudGZpbGU9Ii4uL2R2ZS9idWlsZC54bWwiIHRhcmdldD0ibWFpbiIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CismbHQ7L2phcmxpYi1yZXNvbHZlJmd0OzwvcHJlPgogCi08cD48Yj5SZXNvbHZlIEV4dGVuc2lvbiB2aWEgbXVsdGlwbGUgbWV0aG9kcy48L2I+IEZpcnN0IGNoZWNrIGxvY2FsIGZpbGUgdG8gc2VlIGlmIGl0IGltcGxlbWVudHMKLSAgZXh0ZW5zaW9uLiBJZiBpdCBkb2VzIG5vdCB0aGVuIHRyeSB0byBidWlsZCBpdCBmcm9tIHNvdXJjZSBpbiBwYXJhbGxlbCBkaXJlY3RvcnkuIElmIHRoYXQKLSAgZmFpbHMgdGhlbiBmaW5hbGx5IHRyeSB0byBkb3dubG9hZCBpdCBmcm9tIGEgd2Vic2l0ZS4gSWYgYWxsIHN0ZXBzIGZhaWwgdGhlbiB0aHJvdyBhIGJ1aWxkCi0gIGV4Y2VwdGlvbi48L3A+Cis8cD5SZXNvbHZlIEV4dGVuc2lvbiB2aWEgbXVsdGlwbGUgbWV0aG9kcy4gRmlyc3QgY2hlY2sgbG9jYWwgZmlsZSB0byBzZWUgaWYgaXQgaW1wbGVtZW50cworZXh0ZW5zaW9uLiBJZiBpdCBkb2VzIG5vdCB0aGVuIHRyeSB0byBidWlsZCBpdCBmcm9tIHNvdXJjZSBpbiBwYXJhbGxlbCBkaXJlY3RvcnkuIElmIHRoYXQgZmFpbHMgdGhlbgorZmluYWxseSB0cnkgdG8gZG93bmxvYWQgaXQgZnJvbSBhIHdlYnNpdGUuIElmIGFsbCBzdGVwcyBmYWlsIHRoZW4gdGhyb3cgYSBidWlsZCBleGNlcHRpb24uPC9wPgogPHByZT4KLSAgJmx0O2V4dGVuc2lvbiBpZD0mcXVvdDtkdmUuZXh0JnF1b3Q7Ci0gICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtvcmcucmVhbGl0eWZvcmdlLmR2ZSZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OwotICAgIHNwZWNpZmljYXRpb25WZW5kb3I9JnF1b3Q7UGV0ZXIgRG9uYWxkJnF1b3Q7LyZndDsKKyZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZHZlLmV4dCZxdW90OworICAgICAgICAgICBleHRlbnNpb25OYW1lPSZxdW90O29yZy5yZWFsaXR5Zm9yZ2UuZHZlJnF1b3Q7CisgICAgICAgICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMiZxdW90OworICAgICAgICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7CiAKLSAgJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7Ci0gICAgJmx0O2V4dGVuc2lvbiByZWZpZD0iZHZlLmV4dCIvJmd0OwotICAgICZsdDtsb2NhdGlvbiBsb2NhdGlvbj0iL29wdC9qYXJzL2R2ZS5qYXIiLyZndDsKLSAgICAmbHQ7YW50IGFudGZpbGU9Ii4uL2R2ZS9idWlsZC54bWwiIHRhcmdldD0ibWFpbiIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7Ci0gICAgJmx0O3VybCB1cmw9Imh0dHA6Ly93d3cucmVhbGl0eWZvcmdlLm5ldC9qYXJzL2R2ZS5qYXIiIGRlc3RmaWxlPSJsaWIvZHZlLmphciIvJmd0OwotICAmbHQ7L2phcmxpYi1yZXNvbHZlJmd0OwotPC9wcmU+Ci0KLQorJmx0O2phcmxpYi1yZXNvbHZlIHByb3BlcnR5PSJkdmUubGlicmFyeSImZ3Q7CisgICZsdDtleHRlbnNpb24gcmVmaWQ9ImR2ZS5leHQiLyZndDsKKyAgJmx0O2xvY2F0aW9uIGxvY2F0aW9uPSIvb3B0L2phcnMvZHZlLmphciIvJmd0OworICAmbHQ7YW50IGFudGZpbGU9Ii4uL2R2ZS9idWlsZC54bWwiIHRhcmdldD0ibWFpbiIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CisgICZsdDt1cmwgdXJsPSJodHRwczovL2V4YW1wbGUuY29tL2phcnMvZHZlLmphciIgZGVzdGZpbGU9ImxpYi9kdmUuamFyIi8mZ3Q7CismbHQ7L2phcmxpYi1yZXNvbHZlJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qYXZhLmh0bWwgYi9tYW51YWwvVGFza3MvamF2YS5odG1sCmluZGV4IDM2ZDUwY2UuLjk4YzRiZDMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9qYXZhLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2phdmEuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDQ0OCArMTUsNDAwIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5KYXZhIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphdmEiPkphdmE8L2E+PC9oMj4KKzxoMiBpZD0iamF2YSI+SmF2YTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RXhlY3V0ZXMgYSBKYXZhIGNsYXNzIHdpdGhpbiB0aGUgcnVubmluZyAoQXBhY2hlIEFudCkgVk0gb3IgZm9ya3MgYW5vdGhlciBWTSBpZgotc3BlY2lmaWVkLjwvcD4KLTxwPgotSWYgb2RkIHRoaW5ncyBnbyB3cm9uZyB3aGVuIHlvdSBydW4gdGhpcyB0YXNrLCBzZXQgZm9yaz0idHJ1ZSIgdG8gdXNlIGEgbmV3Ci1KVk0uCis8cD5FeGVjdXRlcyBhIEphdmEgY2xhc3Mgd2l0aGluIHRoZSBydW5uaW5nIChBcGFjaGUgQW50KSBKVk0gb3IgZm9ya3MgYW5vdGhlciBKVk0gaWYgc3BlY2lmaWVkLjwvcD4KKzxwPklmIG9kZCB0aGluZ3MgZ28gd3Jvbmcgd2hlbiB5b3UgcnVuIHRoaXMgdGFzaywgc2V0IDx2YXI+Zm9yazwvdmFyPj08cT50cnVlPC9xPiB0byB1c2UgYSBuZXcKK0pWTS48L3A+CiAKLTxwPkFzIG9mIEFudCAxLjYuMywgeW91IGNhbiBpbnRlcmFjdCB3aXRoIGEgZm9ya2VkIFZNLCBhcyB3ZWxsIGFzCi1zZW5kaW5nIGlucHV0IHRvIGl0IHZpYSB0aGUgPGNvZGU+aW5wdXQ8L2NvZGU+IGFuZCA8Y29kZT5pbnB1dHN0cmluZzwvY29kZT4KLWF0dHJpYnV0ZXMuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+LCB5b3UgY2FuIGludGVyYWN0IHdpdGggYSBmb3JrZWQgSlZNLCBhcyB3ZWxsIGFzIHNlbmRpbmcgaW5wdXQgdG8gaXQgdmlhCit0aGUgPHZhcj5pbnB1dDwvdmFyPiBhbmQgPHZhcj5pbnB1dHN0cmluZzwvdmFyPiBhdHRyaWJ1dGVzLjwvcD4KIAotPGg0PjxhIG5hbWU9ImJhY2tncm91bmQiPlJ1bm5pbmcgQW50IGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIG9uCi0gICAgVW5peCgtbGlrZSkgc3lzdGVtczwvYT48L2g0PgorPGg0IGlkPSJiYWNrZ3JvdW5kIj5SdW5uaW5nIEFudCBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyBvbiBVbml4KC1saWtlKSBzeXN0ZW1zPC9oND4KIAotPHA+SWYgeW91IHJ1biBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgKGxpa2UgPGNvZGU+YW50ICY8L2NvZGU+KQotICBhbmQgdXNlIHRoZSA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IHRhc2sgd2l0aCA8Y29kZT5zcGF3bjwvY29kZT4KLSAgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBhbmQgPGNvZGU+Zm9yazwvY29kZT4KLSAgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgaW5wdXQgdG8gdGhlIGZvcmtlZAotICBwcm9jZXNzIG9yIEFudCB3aWxsIGJlIHN1c3BlbmRlZCBiZWNhdXNlIGl0IHRyaWVzIHRvIHJlYWQgZnJvbSB0aGUKLSAgc3RhbmRhcmQgaW5wdXQuPC9wPgorPHA+SWYgeW91IHJ1biBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3MgKGxpa2UgPGtiZD5hbnQgJmFtcDs8L2tiZD4pIGFuZCB1c2UKK3RoZSA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IHRhc2sgd2l0aCA8dmFyPnNwYXduPC92YXI+IHNldCB0byA8cT5mYWxzZTwvcT4gYW5kIDx2YXI+Zm9yazwvdmFyPgordG8gPHE+dHJ1ZTwvcT4sIHlvdSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgaW5wdXQgdG8gdGhlIGZvcmtlZCBwcm9jZXNzIG9yIEFudCB3aWxsIGJlIHN1c3BlbmRlZAorYmVjYXVzZSBpdCB0cmllcyB0byByZWFkIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHIgaWQ9ImNsYXNzbmFtZSI+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkPnRoZSBKYXZhIGNsYXNzIHRvIGV4ZWN1dGUuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlIGZvdXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48YSBuYW1lPSJjbGFzc25hbWUiPmNsYXNzbmFtZTwvYT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIEphdmEgY2xhc3MgdG8gZXhlY3V0ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+RWl0aGVyIDx0dD5qYXI8L3R0PiwgPHR0PmNsYXNzbmFtZTwvdHQ+IG9yIDx0dD5tb2R1bGU8L3R0PjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmphcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbG9jYXRpb24gb2YgdGhlIGphciBmaWxlIHRvIGV4ZWN1dGUgKG11c3QgaGF2ZSBhCi0gICAgTWFpbi1DbGFzcyBlbnRyeSBpbiB0aGUgbWFuaWZlc3QpLiBGb3JrIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuCi0gICAgU2VlIG5vdGVzIGJlbG93IGZvciBtb3JlIGRldGFpbHMuCisgICAgPHRkPmphcjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij50aGUgbG9jYXRpb24gb2YgdGhlIGphciBmaWxlIHRvIGV4ZWN1dGUgKG11c3QgaGF2ZSBhIDxjb2RlPk1haW4tQ2xhc3M8L2NvZGU+CisgICAgICBlbnRyeSBpbiB0aGUgbWFuaWZlc3QpLiA8dmFyPmZvcms8L3Zhcj4gbXVzdCBiZSBzZXQgdG8gPHE+dHJ1ZTwvcT4gaWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuCisgICAgICBTZWUgbm90ZXMgPGEgaHJlZj0iI2phci1leGVjdXRlIj5iZWxvdzwvYT4gZm9yIG1vcmUgZGV0YWlscy4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+RWl0aGVyIDx0dD5qYXI8L3R0PiwgPHR0PmNsYXNzbmFtZTwvdHQ+IG9yIDx0dD5tb2R1bGU8L3R0PjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFyZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFyZ3VtZW50cyBmb3IgdGhlIGNsYXNzIHRoYXQgaXMKLSAgICAgIGV4ZWN1dGVkLiA8Yj5kZXByZWNhdGVkLCB1c2UgbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPgotICAgICAgZWxlbWVudHMgaW5zdGVhZC48L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bW9kdWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBpbml0aWFsIG9yIG1haW4gbW9kdWxlIHRvIHJlc29sdmUgKG11c3QgaGF2ZSBhIDxjb2RlPk1haW4tQ2xhc3M8L2NvZGU+CisgICAgICBlbnRyeSBpbiB0aGUgbWFuaWZlc3QpLiAgPHZhcj5mb3JrPC92YXI+IG11c3QgYmUgc2V0IHRvIDxxPnRydWU8L3E+IGlmIHRoaXMgb3B0aW9uIGlzCisgICAgICBzZWxlY3RlZC4gPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnNvdXJjZWZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGxvY2F0aW9uIG9mIGEgIi5qYXZhIiBmaWxlIG9yIGEgZmlsZSBjb250YWluaW5nIHNoZWJhbmcgd2l0aCBKYXZhIHNvdXJjZSBjb2RlLgorICAgICAgU2V0IHRoaXMgYXR0cmlidXRlIHRvIHJ1biBKYXZhIHNpbmdsZSBmaWxlIHNvdXJjZSBwcm9ncmFtcywgYSBmZWF0dXJlIGludHJvZHVjZWQgaW4gSmF2YSAxMS4KKyAgICAgIDx2YXI+Zm9yazwvdmFyPiBtdXN0IGJlIHNldCB0byA8cT50cnVlPC9xPiBpZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZC4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS4xMC41PC9lbT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhCi0gICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmFyZ3M8L3RkPgorICAgIDx0ZD50aGUgYXJndW1lbnRzIGZvciB0aGUgY2xhc3MgdGhhdCBpcyBleGVjdXRlZC4gPGVtPjx1PkRlcHJlY2F0ZWQ8L3U+LCB1c2UKKyAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZC48L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZiBlbmFibGVkIHRyaWdnZXJzIHRoZSBjbGFzcyBleGVjdXRpb24gaW4gYW5vdGhlciBWTQotICAgICAgKGRpc2FibGVkIGJ5IGRlZmF1bHQpPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+dGhlIGNsYXNzcGF0aCB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcGF3bjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZiBlbmFibGVkIGFsbG93cyB0byBzdGFydCBhIHByb2Nlc3Mgd2hpY2ggd2lsbCBvdXRsaXZlIGFudC48YnI+Ci0gICAgUmVxdWlyZXMgZm9yaz10cnVlLCBhbmQgbm90IGNvbXBhdGlibGUKLSAgICB3aXRoIHRpbWVvdXQsIGlucHV0LCBvdXRwdXQsIGVycm9yLCByZXN1bHQgYXR0cmlidXRlcy48YnI+Ci0gICAgICAoZGlzYWJsZWQgYnkgZGVmYXVsdCk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZD50aGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvCisgICAgICBhIDxjb2RlPlBhdGg8L2NvZGU+IGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+anZtPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSwKLSAgICAgIGRlZmF1bHQgaXMgJ2phdmEnLiAgVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQgYnkgamF2YS5sYW5nLlJ1bnRpbWUuZXhlYygpLgotICAgICAgSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLgorICAgIDx0ZD5tb2R1bGVwYXRoPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBmaW5kIGFwcGxpY2F0aW9uIG1vZHVsZXMuIEEgbGlzdCBvZiBkaXJlY3RvcmllcyBvZiBtb2R1bGVzLCBtb2R1bGUgZmlsZXMgb3IKKyAgICAgIGV4cGxvZGVkIG1vZHVsZXMuICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bW9kdWxlcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSBtb2R1bGVwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvCisgICAgICBhIDxjb2RlPlBhdGg8L2NvZGU+IGRlZmluZWQgZWxzZXdoZXJlLiAgPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZvcms8L3RkPgorICAgIDx0ZD5pZiBlbmFibGVkIHRyaWdnZXJzIHRoZSBjbGFzcyBleGVjdXRpb24gaW4gYW5vdGhlciBKVk0uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zcGF3bjwvdGQ+CisgICAgPHRkPmlmIGVuYWJsZWQgYWxsb3dzIHRvIHN0YXJ0IGEgcHJvY2VzcyB3aGljaCB3aWxsIG91dGxpdmUgQW50Ljxici8+UmVxdWlyZXMKKyAgICAgIHRoYXQgPHZhcj5mb3JrPC92YXI+IGlzIDxxPnRydWU8L3E+LCBhbmQgbm90IGNvbXBhdGlibGUKKyAgICAgIHdpdGggPHZhcj50aW1lb3V0PC92YXI+LCA8dmFyPmlucHV0PC92YXI+LCA8dmFyPm91dHB1dDwvdmFyPiwgPHZhcj5lcnJvcjwvdmFyPiwgPHZhcj5yZXN1bHQ8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmp2bTwvdGQ+CisgICAgPHRkPnRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIEpWTS4gIFRoZSBjb21tYW5kIGlzIHJlc29sdmVkCisgICAgICBieSA8Y29kZT5qYXZhLmxhbmcuUnVudGltZS5leGVjKCk8L2NvZGU+LiAgSWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+LgogICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPk5vLCBkZWZhdWx0IGlzIDxrYmQ+amF2YTwva2JkPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmp2bWFyZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmb3JrZWQgVk0gKGlnbm9yZWQKLSAgICAgIGlmIGZvcmsgaXMgZGlzYWJsZWQpLiA8Yj5kZXByZWNhdGVkLCB1c2UgbmVzdGVkCi0gICAgICA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZC48L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+anZtYXJnczwvdGQ+CisgICAgPHRkPnRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZm9ya2VkIEpWTSwgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMKKyAgICAgIGRpc2FibGVkLiA8ZW0+PHU+RGVwcmVjYXRlZDwvdT4sIHVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGVsZW1lbnRzCisgICAgICBpbnN0ZWFkLjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZCBWTQotICAgICAgKGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZD5NYXggYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSB0byB0aGUgZm9ya2VkIEpWTSwgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4KKyAgICAgIGlzIDxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bW9kdWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIG9yIG1haW4gbW9kdWxlIHRvIHJlc29sdmUuIFRvIHNwZWNpZnkKLSAgICB0aGUgbW9kdWxlIG1haW4gY2xhc3MgdXNlIHRoZSA8YSBocmVmPSIjY2xhc3NuYW1lIj5jbGFzc25hbWU8L2E+IGF0dHJpYnV0ZS4KLSAgICBGb3JrIG11c3QgYmUgc2V0IHRvIHRydWUgaWYgdGhpcyBvcHRpb24gaXMgc2VsZWN0ZWQuPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPkVpdGhlciA8dHQ+amFyPC90dD4sIDx0dD5jbGFzc25hbWU8L3R0PiBvciA8dHQ+bW9kdWxlPC90dD48L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIG90aGVyIHRoYW4gPHE+MDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+IChzZWUgPGEgaHJlZj0iI2ZhaWxvbmVycm9yIj5ub3RlPC9hPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2R1bGVwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBhcHBsaWNhdGlvbiBtb2R1bGVzLiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb2YgbW9kdWxlcywgbW9kdWxlIGZpbGVzIG9yIGV4cGxvZGVkIG1vZHVsZXMuPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cmVzdWx0cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBPbmx5IG9mCisgICAgICBpbnRlcmVzdCBpZiA8dmFyPmZhaWxvbmVycm9yPC92YXI+IGlzIDxxPmZhbHNlPC9xPiBhbmQgaWYgPHZhcj5mb3JrPC92YXI+IGlzIDxxPnRydWU8L3E+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bW9kdWxlcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbW9kdWxlcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhCi0gICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIEpWTSBpbiwgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQotICAgICAgcmV0dXJuY29kZSBvdGhlciB0aGFuIDAuIERlZmF1bHQgaXMgImZhbHNlIiAoc2VlIDxhIGhyZWY9IiNmYWlsb25lcnJvciI+bm90ZTwvYT4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3V0cHV0PC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG91dHB1dC4gSWYgdGhlIGVycm9yIHN0cmVhbSBpcyBub3QgYWxzbyByZWRpcmVjdGVkIHRvIGEKKyAgICAgIGZpbGUgb3IgcHJvcGVydHksIGl0IHdpbGwgYXBwZWFyIGluIHRoaXMgb3V0cHV0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzdWx0cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgcmV0dXJuIGNvZGUgb2YgdGhlCi0gICAgICBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YgaW50ZXJlc3QgaWYgZmFpbG9uZXJyb3I9ZmFsc2UKLSAgICAgIGFuZCBpZiBmb3JrPXRydWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3I8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBpbnZva2UgdGhlIFZNIGluLiAgKGlnbm9yZWQgaWYKLSAgICAgIGZvcmsgaXMgZGlzYWJsZWQpPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bG9nRXJyb3I8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlIGVycm9yIG91dHB1dCBpbiBBbnQncyBsb2cgYW5kIHlvdSBhcmUKKyAgICAgIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvciBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICAgICAgZmlsZS9wcm9wZXJ0eS4gSWYgeW91IHJlZGlyZWN0IGVycm9yIHdpdGggdGhlIDx2YXI+ZXJyb3I8L3Zhcj4gb3IgPHZhcj5lcnJvclByb3BlcnR5PC92YXI+CisgICAgICBhdHRyaWJ1dGVzLCB0aGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG91dHB1dC4gSWYgdGhlIGVycm9yIHN0cmVhbQotICAgICAgaXMgbm90IGFsc28gcmVkaXJlY3RlZCB0byBhIGZpbGUgb3IgcHJvcGVydHksIGl0IHdpbGwgYXBwZWFyIGluIHRoaXMgb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmFwcGVuZDwvdGQ+CisgICAgPHRkPldoZXRoZXIgb3V0cHV0IGFuZCBlcnJvciBmaWxlcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUKLSAgICAgIHJlZGlyZWN0ZWQuIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm91dHB1dHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIFVubGVzcyB0aGUgZXJyb3IKKyAgICAgIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvIGEgc2VwYXJhdGUgZmlsZSBvciBzdHJlYW0sIHRoaXMgcHJvcGVydHkgd2lsbCBpbmNsdWRlIHRoZSBlcnJvcgorICAgICAgb3V0cHV0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9nRXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB3aGVuIHlvdSB3aXNoIHRvIHNlZSBlcnJvciBvdXRwdXQgaW4gQW50J3MKLSAgICAgICAgICAgICAgICAgICAgIGxvZyBhbmQgeW91IGFyZSByZWRpcmVjdGluZyBvdXRwdXQgdG8gYSBmaWxlL3Byb3BlcnR5LiBUaGUgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgIG91dHB1dCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUvcHJvcGVydHkuIElmIHlvdQotICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3QgZXJyb3Igd2l0aCB0aGUgJnF1b3Q7ZXJyb3ImcXVvdDsgb3IgJnF1b3Q7ZXJyb3JQcm9wZXJ0eSZxdW90OwotICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcywgdGhpcyB3aWxsIGhhdmUgbm8gZWZmZWN0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXBwZW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgb3V0cHV0IGFuZCBlcnJvciBmaWxlcyBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uCi0gICAgRGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5wdXQ8L3RkPgorICAgIDx0ZD5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkIGlucHV0IGlzIHRha2VuLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseQorICAgICAgZXhjbHVzaXZlIHdpdGggdGhlIDx2YXI+aW5wdXRzdHJpbmc8L3Zhcj4gYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgdG8gdGFrZSBzdGFuZGFyZCBpbnB1dCBmcm9tIGNvbnNvbGUKKyAgICAgIHVubGVzcyA8dmFyPnNwYXduPC92YXI+IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBVbmxlc3MgdGhlIGVycm9yIHN0cmVhbSBpcyByZWRpcmVjdGVkIHRvIGEgc2VwYXJhdGUKLSAgICAgIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUgZXJyb3Igb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlucHV0c3RyaW5nPC90ZD4KKyAgICA8dGQ+QSBzdHJpbmcgd2hpY2ggc2VydmVzIGFzIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcworICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIDx2YXI+aW5wdXQ8L3Zhcj4gYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHRvIHRha2Ugc3RhbmRhcmQgaW5wdXQgZnJvbSBjb25zb2xlIHVubGVzcyA8dmFyPnNwYXduPC92YXI+CisgICAgICBpcyA8cT50cnVlPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQ+RG8gbm90IHByb3BhZ2F0ZSBvbGQgZW52aXJvbm1lbnQgd2hlbiBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+LCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIGZpbGUgZnJvbSB3aGljaCB0aGUgZXhlY3V0ZWQgY29tbWFuZCdzIHN0YW5kYXJkIGlucHV0Ci0gICAgICAgICAgICAgICAgICAgICBpcyB0YWtlbi4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCi0gICAgICAgICAgICAgICAgICAgICBpbnB1dHN0cmluZyBhdHRyaWJ1dGU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgdG8gdGFrZSBzdGFuZGFyZCBpbnB1dCBmcm9tIGNvbnNvbGUKLSAgICAgICAgKHVubGVzcyA8Y29kZT5zcGF3bj0idHJ1ZSI8L2NvZGU+KTwvdGQ+CisgICAgPHRkPnRpbWVvdXQ8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluCisgICAgICBtaWxsaXNlY29uZHMpLiAgPHN0cm9uZz5JdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IGlmIDx2YXI+Zm9yazwvdmFyPgorICAgICAgaXMgPHE+dHJ1ZTwvcT4uPC9zdHJvbmc+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dHN0cmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGlucHV0IGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgdG8gdGFrZSBzdGFuZGFyZCBpbnB1dCBmcm9tIGNvbnNvbGUKLSAgICAgICAgKHVubGVzcyA8Y29kZT5zcGF3bj0idHJ1ZSI8L2NvZGU+KTwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5ld2Vudmlyb25tZW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBwcm9wYWdhdGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3Ci0gICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gRGVmYXVsdCBpcyAmcXVvdDtmYWxzZSZxdW90OwotICAgICAgKGlnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCkuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBjb21tYW5kIGlmIGl0IGRvZXNuJ3QgZmluaXNoIHdpdGhpbiB0aGUKLSAgICBzcGVjaWZpZWQgdGltZSAoZ2l2ZW4gaW4gbWlsbGlzZWNvbmRzKS4gIDxzdHJvbmc+SXQgaXMgaGlnaGx5Ci0gICAgcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgZmVhdHVyZSBvbmx5IGlmIGZvcmsgaXMgZW5hYmxlZC48L3N0cm9uZz48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbG9uZXZtPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNldCB0byB0cnVlLCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcwotICAgICAgYW5kIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgd2lsbCBiZQotICAgICAgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIEphdmEgVk0gcnVubmluZyBBbnQuICBEZWZhdWx0IGlzCi0gICAgICAmcXVvdDtmYWxzZSZxdW90OyAoaWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkKS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbG9uZXZtPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcyBhbmQgdGhlIDx2YXI+Ym9vdGNsYXNzcGF0aDwvdmFyPiBvZiB0aGUKKyAgICAgIGZvcmtlZCBKVk0gd2lsbCBiZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUgSlZNIHJ1bm5pbmcgQW50LiA8ZW0+c2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+LCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PmFyZyBhbmQganZtYXJnPC9oND4KLTxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4KLWVsZW1lbnRzIHRvIHNwZWNpZnkgYXJndW1lbnRzIGZvciB0aGUgSmF2YSBjbGFzcyBhbmQgdGhlIGZvcmtlZCBWTSByZXNwZWN0aXZlbHkuCi1TZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQgbGluZSBhcmd1bWVudHM8L2E+LjwvcD4KKzxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gZWxlbWVudHMgdG8gc3BlY2lmeSBhcmd1bWVudHMKK2ZvciB0aGUgSmF2YSBjbGFzcyBhbmQgdGhlIGZvcmtlZCBKVk0gcmVzcGVjdGl2ZWx5LiAgU2VlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kIGxpbmUKK2FyZ3VtZW50czwvYT4uPC9wPgogPGg0PnN5c3Byb3BlcnR5PC9oND4KLTxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O3N5c3Byb3BlcnR5Jmd0OzwvY29kZT4KLWVsZW1lbnRzIHRvIHNwZWNpZnkgc3lzdGVtIHByb3BlcnRpZXMgcmVxdWlyZWQgYnkgdGhlIGNsYXNzLgotVGhlc2UgcHJvcGVydGllcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBWTSBkdXJpbmcgdGhlIGV4ZWN1dGlvbgotb2YgdGhlIGNsYXNzIChlaXRoZXIgQU5UJ3MgVk0gb3IgdGhlIGZvcmtlZCBWTSkuIFRoZSBhdHRyaWJ1dGVzCi1mb3IgdGhpcyBlbGVtZW50IGFyZSB0aGUgc2FtZSBhcyBmb3IgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZW52aXJvbm1lbnQKLXZhcmlhYmxlczwvYT4uPC9wPgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIHJlcXVpcmVkIGJ5IHRoZQorY2xhc3MuICBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gSlZNIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjbGFzcyAoZWl0aGVyCitBbnQncyBKVk0gb3IgdGhlIGZvcmtlZCBKVk0pLiBUaGUgYXR0cmlidXRlcyBmb3IgdGhpcyBlbGVtZW50IGFyZSB0aGUgc2FtZSBhcworZm9yIDxhIGhyZWY9ImV4ZWMuaHRtbCNlbnYiPmVudmlyb25tZW50IHZhcmlhYmxlczwvYT4uPC9wPgogCiA8aDQ+c3lzcHJvcGVydHlzZXQ8L2g0PgogCis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKwogPHA+WW91IGNhbiBzcGVjaWZ5IGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBhcyBzeXN0ZW0gcHJvcGVydGllcwogd2l0aCA8YSBocmVmPSIuLi9UeXBlcy9wcm9wZXJ0eXNldC5odG1sIj5zeXNwcm9wZXJ0eXNldDwvYT5zLjwvcD4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+Ci0KIDxoND5jbGFzc3BhdGg8L2g0PgotPHA+PGNvZGU+SmF2YTwvY29kZT4ncyA8aT5jbGFzc3BhdGg8L2k+IGF0dHJpYnV0ZSBpcyBhIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCi08aT5jbGFzc3BhdGg8L2k+IGVsZW1lbnQuPC9wPgorPHA+PGNvZGU+SmF2YTwvY29kZT4ncyA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhdHRyaWJ1dGUgaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnQuPC9wPgogCiA8aDQ+Ym9vdGNsYXNzcGF0aDwvaDQ+CiAKLTxwPlRoZSBsb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGlzCi08YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+IC0gd2lsbCBiZSBpZ25vcmVkCi1pZiA8aT5mb3JrPC9pPiBpcyBub3QgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgdGhlIHRhcmdldCBWTSBkb2Vzbid0Ci1zdXBwb3J0IGl0IChpLmUuIEphdmEgMS4xKS48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvcD4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3A+Cis8cD5UaGUgbG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcKK3RoaXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiZtZGFzaDt3aWxsIGJlIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+CitpcyBub3QgPHE+dHJ1ZTwvcT4gb3IgdGhlIHRhcmdldCBKVk0gZG9lc24ndCBzdXBwb3J0IGl0IChpLmUuIEphdmEgMS4xKS48L3A+CiAKIDxoND5lbnY8L2g0PgotPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUKLWZvcmtlZCBWTSB2aWEgbmVzdGVkIDxpPmVudjwvaT4gZWxlbWVudHMuIFNlZSB0aGUgZGVzY3JpcHRpb24gaW4gdGhlCi1zZWN0aW9uIGFib3V0IDxhIGhyZWY9ImV4ZWMuaHRtbCNlbnYiPmV4ZWM8L2E+PC9wPgotPHA+U2V0dGluZ3Mgd2lsbCBiZSBpZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUgZm9ya2VkIEpWTSB2aWEKK25lc3RlZCA8Y29kZT5lbnY8L2NvZGU+IGVsZW1lbnRzLiBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBzZWN0aW9uCithYm91dCA8YSBocmVmPSJleGVjLmh0bWwjZW52Ij5leGVjPC9hPjwvcD4KKzxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+LjwvcD4KIAogPGg0PnBlcm1pc3Npb25zPC9oND4KLTxwPlNlY3VyaXR5IHBlcm1pc3Npb25zIGNhbiBiZSByZXZva2VkIGFuZCBncmFudGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZQotY2xhc3MgdmlhIGEgbmVzdGVkIDxpPnBlcm1pc3Npb25zPC9pPiBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UKLXNlZSA8YSBocmVmPSIuLi9UeXBlcy9wZXJtaXNzaW9ucy5odG1sIj5wZXJtaXNzaW9uczwvYT48L3A+Ci08cD5XaGVuIHRoZSBwZXJtaXNzaW9uIFJ1bnRpbWVQZXJtaXNzaW9uIGV4aXRWTSBoYXMgbm90IGJlZW4gZ3JhbnRlZCAob3IgaGFzCi1iZWVuIHJldm9rZWQpIHRoZSBTeXN0ZW0uZXhpdCgpIGNhbGwgd2lsbCBiZSBpbnRlcmNlcHRlZAotYW5kIHRyZWF0ZWQgbGlrZSBpbmRpY2F0ZWQgaW4gPGk+ZmFpbG9uZXJyb3I8L2k+LjwvcD4KLTxwPk5vdGU6PGJyPgotSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHBlcm1pc3Npb25zLAotYSBzZXQgb2YgZGVmYXVsdCBwZXJtaXNzaW9ucyB3aWxsIGJlIGFkZGVkIHRvIHlvdXIgSmF2YSBpbnZvY2F0aW9uIHRvIG1ha2UKLXN1cmUgdGhhdCB0aGUgYW50IHJ1biB3aWxsIGNvbnRpbnVlIG9yIHRlcm1pbmF0ZWQgYXMgaW5kaWNhdGVkIGJ5Ci08aT5mYWlsb25lcnJvcjwvaT4uIEFsbCBwZXJtaXNzaW9ucyBub3QgZ3JhbnRlZCBwZXIgZGVmYXVsdCB3aWxsIGJlCi1jaGVja2VkIGJ5IHdoYXRldmVyIHNlY3VyaXR5IG1hbmFnZXIgd2FzIGFscmVhZHkgaW4gcGxhY2UuIGV4aXRWTSB3aWxsIGJlCi1kaXNhbGxvd2VkLgotPC9wPgotPHA+U2V0dGluZ3Mgd2lsbCBiZSBpZ25vcmVkIGlmIGZvcmsgaXMgZW5hYmxlZC48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3A+CisKKzxwPlNlY3VyaXR5IHBlcm1pc3Npb25zIGNhbiBiZSByZXZva2VkIGFuZCBncmFudGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjbGFzcyB2aWEgYQorbmVzdGVkIDxjb2RlPnBlcm1pc3Npb25zPC9jb2RlPiBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UKK3NlZSA8YSBocmVmPSIuLi9UeXBlcy9wZXJtaXNzaW9ucy5odG1sIj5wZXJtaXNzaW9uczwvYT4uPC9wPgorPHA+V2hlbiB0aGUgcGVybWlzc2lvbiA8Y29kZT5SdW50aW1lUGVybWlzc2lvbiBleGl0Vk08L2NvZGU+IGhhcyBub3QgYmVlbiBncmFudGVkIChvciBoYXMgYmVlbgorcmV2b2tlZCkgdGhlIDxjb2RlPlN5c3RlbS5leGl0KCk8L2NvZGU+IGNhbGwgd2lsbCBiZSBpbnRlcmNlcHRlZCBhbmQgdHJlYXRlZCBsaWtlIGluZGljYXRlZAoraW4gPHZhcj5mYWlsb25lcnJvcjwvdmFyPi48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46PGJyLz4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHBlcm1pc3Npb25zLCBhIHNldCBvZiBkZWZhdWx0IHBlcm1pc3Npb25zIHdpbGwKK2JlIGFkZGVkIHRvIHlvdXIgSmF2YSBpbnZvY2F0aW9uIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBBbnQgcnVuIHdpbGwgY29udGludWUgb3IgdGVybWluYXRlZCBhcworaW5kaWNhdGVkIGJ5IDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4uIEFsbCBwZXJtaXNzaW9ucyBub3QgZ3JhbnRlZCBwZXIgZGVmYXVsdCB3aWxsIGJlIGNoZWNrZWQgYnkKK3doYXRldmVyIHNlY3VyaXR5IG1hbmFnZXIgd2FzIGFscmVhZHkgaW4gcGxhY2UuIDxjb2RlPmV4aXRWTTwvY29kZT4gd2lsbCBiZSBkaXNhbGxvd2VkLjwvcD4KKzxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+dHJ1ZTwvcT4uPC9wPgogCiA8aDQ+YXNzZXJ0aW9uczwvaDQ+CiAKLTxwPllvdSBjYW4gY29udHJvbCBlbmFibGVtZW50IG9mIEphdmEgMS40IGFzc2VydGlvbnMgd2l0aCBhbgotPGEgaHJlZj0iLi4vVHlwZXMvYXNzZXJ0aW9ucy5odG1sIj48dHQ+Jmx0O2Fzc2VydGlvbnMmZ3Q7PC90dD48L2E+Ci1zdWJlbGVtZW50LjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorCis8cD5Zb3UgY2FuIGNvbnRyb2wgZW5hYmxlbWVudCBvZiBKYXZhIDEuNCBhc3NlcnRpb25zIHdpdGgKK2FuIDxhIGhyZWY9Ii4uL1R5cGVzL2Fzc2VydGlvbnMuaHRtbCI+PGNvZGU+Jmx0O2Fzc2VydGlvbnMmZ3Q7PC9jb2RlPjwvYT4gc3ViZWxlbWVudC48L3A+CiAKIDxwPkFzc2VydGlvbiBzdGF0ZW1lbnRzIGFyZSBjdXJyZW50bHkgaWdub3JlZCBpbiBub24tZm9ya2VkIG1vZGUuPC9wPgogCi08cD48ZW0+c2luY2UgQW50IDEuNi48L2VtPjwvcD4KKzxoNCBpZD0icmVkaXJlY3RvciI+cmVkaXJlY3RvcjwvaDQ+Cis8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT4KKzxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3JlZGlyZWN0b3IuaHRtbCI+SS9PIFJlZGlyZWN0b3I8L2E+IGNhbiBiZSBzcGVjaWZpZWQuICBJbiBnZW5lcmFsLCB0aGUKK2F0dHJpYnV0ZXMgb2YgdGhlIHJlZGlyZWN0b3IgYmVoYXZlIGFzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMgYXZhaWxhYmxlIGF0IHRoZSB0YXNrIGxldmVsLgorVGhlIG1vc3Qgbm90YWJsZSBwZWN1bGlhcml0eSBzdGVtcyBmcm9tIHRoZSByZXRlbnRpb24gb2YgdGhlIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gYXR0cmlidXRlcworZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgQW55IGZpbGUgbWFwcGluZyBpcyBkb25lIHVzaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gc291cmNlZmlsZTsKK3RoZXJlZm9yZSBub3QgYWxsIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5NYXBwZXI8L2E+IHR5cGVzIHdpbGwgcmV0dXJuIHJlc3VsdHMuICBXaGVuIG5vCityZXN1bHRzIGFyZSByZXR1cm5lZCwgcmVkaXJlY3Rpb24gc3BlY2lmaWNhdGlvbnMgd2lsbCBmYWxsIGJhY2sgdG8gdGhlIHRhc2sgbGV2ZWwgYXR0cmlidXRlcy4gIEluCitwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQgZGVmYXVsdHMgY2FuIGJlIHNwZWNpZmllZCBmb3IgPHZhcj5pbnB1dDwvdmFyPiwgPHZhcj5vdXRwdXQ8L3Zhcj4sCithbmQgPHZhcj5lcnJvcjwvdmFyPiBvdXRwdXQgZmlsZXMuPC9wPgorPGgzIGlkPSJmYWlsb25lcnJvciI+RXJyb3JzIGFuZCByZXR1cm4gY29kZXM8L2gzPgorPHA+QnkgZGVmYXVsdCwgdGhlIHJldHVybiBjb2RlIG9mIGEgPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiBpcyBpZ25vcmVkLiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbgorc2V0IDx2YXI+cmVzdWx0cHJvcGVydHk8L3Zhcj4gdG8gdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBhbmQgaGF2ZSBpdCBhc3NpZ25lZCB0byB0aGUgcmVzdWx0IGNvZGUKKyhiYXJyaW5nIGltbXV0YWJpbGl0eSwgb2YgY291cnNlKS4gIFdoZW4geW91IHNldCA8dmFyPmZhaWxvbmVycm9yPC92YXI+PTxxPnRydWU8L3E+LCB0aGUgb25seQorcG9zc2libGUgdmFsdWUgZm9yIDx2YXI+cmVzdWx0cHJvcGVydHk8L3Zhcj4gaXMgPHE+MDwvcT4uIEFueSBub24temVybyByZXNwb25zZSBpcyB0cmVhdGVkIGFzIGFuCitlcnJvciBhbmQgd291bGQgbWVhbiB0aGUgYnVpbGQgZXhpdHMuPC9wPgorPHA+U2ltaWxhcmx5LCBpZiA8dmFyPmZhaWxvbmVycm9yPC92YXI+PTxxPmZhbHNlPC9xPiBhbmQgPHZhcj5mb3JrPC92YXI+PTxxPmZhbHNlPC9xPiwKK3RoZW4gPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiA8ZW0+bXVzdDwvZW0+IHJldHVybiA8cT4wPC9xPiBvdGhlcndpc2UgdGhlIGJ1aWxkIHdpbGwgZXhpdCwgYXMgdGhlCitjbGFzcyB3YXMgcnVuIGJ5IHRoZSBidWlsZCBKVk0uPC9wPgogCi08YSBuYW1lPSJyZWRpcmVjdG9yIj48aDQ+cmVkaXJlY3RvcjwvaDQ+PC9hPgotPGk+PGI+U2luY2UgQW50IDEuNi4yPC9iPjwvaT4KLTxwPkEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3JlZGlyZWN0b3IuaHRtbCI+SS9PIFJlZGlyZWN0b3I8L2E+Ci1jYW4gYmUgc3BlY2lmaWVkLiAgSW4gZ2VuZXJhbCwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlZGlyZWN0b3IgYmVoYXZlCi1hcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIGF2YWlsYWJsZSBhdCB0aGUgdGFzayBsZXZlbC4gIFRoZSBtb3N0Ci1ub3RhYmxlIHBlY3VsaWFyaXR5IHN0ZW1zIGZyb20gdGhlIHJldGVudGlvbiBvZiB0aGUgPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPgotYXR0cmlidXRlcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBBbnkgZmlsZSBtYXBwaW5nIGlzIGRvbmUKLXVzaW5nIGEgPENPREU+bnVsbDwvQ09ERT4gc291cmNlZmlsZTsgdGhlcmVmb3JlIG5vdCBhbGwKLTxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5NYXBwZXI8L2E+IHR5cGVzIHdpbGwgcmV0dXJuCi1yZXN1bHRzLiAgV2hlbiBubyByZXN1bHRzIGFyZSByZXR1cm5lZCwgcmVkaXJlY3Rpb24gc3BlY2lmaWNhdGlvbnMKLXdpbGwgZmFsbCBiYWNrIHRvIHRoZSB0YXNrIGxldmVsIGF0dHJpYnV0ZXMuICBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQKLWRlZmF1bHRzIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGlucHV0LCBvdXRwdXQsIGFuZCBlcnJvciBvdXRwdXQgZmlsZXMuCi08L3A+Ci08YSBuYW1lPSJmYWlsb25lcnJvciI+PGgzPkVycm9ycyBhbmQgcmV0dXJuIGNvZGVzPC9oMz48L2E+Ci1CeSBkZWZhdWx0IHRoZSByZXR1cm4gY29kZSBvZiBhIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gaXMgaWdub3JlZC4KLUFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2V0IDxjb2RlPnJlc3VsdHByb3BlcnR5PC9jb2RlPiB0byB0aGUgbmFtZQotb2YgYSBwcm9wZXJ0eSBhbmQgaGF2ZSBpdCBhc3NpZ25lZCB0byB0aGUgcmVzdWx0IGNvZGUgKGJhcnJpbmcgaW1tdXRhYmlsaXR5LAotb2YgY291cnNlKS4KLVdoZW4geW91IHNldCA8Y29kZT5mYWlsb25lcnJvcj0idHJ1ZSI8L2NvZGU+LCB0aGUgb25seSBwb3NzaWJsZSB2YWx1ZSBmb3IKLTxjb2RlPnJlc3VsdHByb3BlcnR5PC9jb2RlPiBpcyAwLiBBbnkgbm9uLXplcm8gcmVzcG9uc2UgaXMgdHJlYXRlZCBhcyBhbgotZXJyb3IgYW5kIHdvdWxkIG1lYW4gdGhlIGJ1aWxkIGV4aXRzLgotPHA+IFNpbWlsYXJseSwgaWYgPGNvZGU+ZmFpbG9uZXJyb3I9ImZhbHNlIjwvY29kZT4gYW5kIDxjb2RlPmZvcms9ImZhbHNlIjwvY29kZT4KLSwgdGhlbiA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IDxiPm11c3Q8L2I+IHJldHVybiAwIG90aGVyd2lzZSB0aGUgYnVpbGQgd2lsbAotZXhpdCwgYXMgdGhlIGNsYXNzIHdhcyBydW4gYnkgdGhlIGJ1aWxkIEpWTS48L3A+Cis8aDQgaWQ9Im1vZHVsZXBhdGgiPm1vZHVsZXBhdGg8L2g0PgorPGVtPlNpbmNlIEFudCAxLjkuNzwvZW0+Cis8cD48Y29kZT5KYXZhPC9jb2RlPidzIDx2YXI+bW9kdWxlcGF0aDwvdmFyPiBhdHRyaWJ1dGUgaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZCA8Y29kZT5tb2R1bGVwYXRoPC9jb2RlPiBlbGVtZW50LjwvcD4KIAotPGEgbmFtZT0ibW9kdWxlcGF0aCI+PGg0Pm1vZHVsZXBhdGg8L2g0PgotPGk+PGI+U2luY2UgQW50IDEuOS43PC9iPjwvaT4KLTxwPjxjb2RlPkphdmE8L2NvZGU+J3MgPGk+bW9kdWxlcGF0aDwvaT4gYXR0cmlidXRlIGlzIGEgPGEKLWhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQKLTxpPm1vZHVsZXBhdGg8L2k+IGVsZW1lbnQuPC9wPgorPGg0IGlkPSJ1cGdyYWRlbW9kdWxlcGF0aCI+dXBncmFkZW1vZHVsZXBhdGg8L2g0PgorPGVtPlNpbmNlIEFudCAxLjkuNzwvZW0+Cis8cD5UaGUgbG9jYXRpb24gb2YgbW9kdWxlcyB0aGF0IHJlcGxhY2UgdXBncmFkZWFibGUgbW9kdWxlcyBpbiB0aGUgcnVudGltZSBpbWFnZSBjYW4gYmUgc3BlY2lmaWVkCit1c2luZyB0aGlzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4uPC9wPgogCi08YSBuYW1lPSJ1cGdyYWRlbW9kdWxlcGF0aCI+PGg0PnVwZ3JhZGVtb2R1bGVwYXRoPC9oND4KLTxpPjxiPlNpbmNlIEFudCAxLjkuNzwvYj48L2k+Ci08cD5UaGUgbG9jYXRpb24gb2YgbW9kdWxlcyB0aGF0IHJlcGxhY2UgdXBncmFkZWFibGUgbW9kdWxlcyBpbiB0aGUgcnVudGltZSBpbWFnZQotY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGlzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4uPC9wPgorPGgzIGlkPSJqYXItZXhlY3V0ZSI+SkFSIGZpbGUgZXhlY3V0aW9uPC9oMz4KIAotCi08aDM+SkFSIGZpbGUgZXhlY3V0aW9uPC9oMz4KLQotPHA+VGhlIHBhcmFtZXRlciBvZiB0aGUgPHR0PmphcjwvdHQ+IGF0dHJpYnV0ZSBpcyBvZiB0eXBlIDx0dD5GaWxlPC90dD47Ci10aGF0IGlzLCB0aGUgcGFyYW1ldGVyIGlzIHJlc29sdmVkIHRvIGFuIGFic29sdXRlIGZpbGUgcmVsYXRpdmUgdG8gdGhlCi1iYXNlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCwgPGk+bm90PC9pPiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBKYXZhCi10YXNrIGlzIHJ1bi4gSWYgeW91IG5lZWQgdG8gbG9jYXRlIGEgSkFSIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeQotdGhlIHRhc2sgd2lsbCBiZSBydW4gaW4sIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBmdWxsIHBhdGgKLXRvIHRoZSBKQVIgZmlsZS48L3A+Ci08cD5XaGVuIHVzaW5nIHRoZSA8dHQ+amFyPC90dD4gYXR0cmlidXRlLCBhbGwgY2xhc3NwYXRoIHNldHRpbmdzIGFyZSAKLWlnbm9yZWQgYWNjb3JkaW5nIHRvIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXZhLmh0bWwiPk9yYWNsZSdzCi1zcGVjaWZpY2F0aW9uPC9hPi4gCi0KKzxwPlRoZSBwYXJhbWV0ZXIgb2YgdGhlIDx2YXI+amFyPC92YXI+IGF0dHJpYnV0ZSBpcyBvZiB0eXBlIDxjb2RlPkZpbGU8L2NvZGU+OyB0aGF0IGlzLCB0aGUKK3BhcmFtZXRlciBpcyByZXNvbHZlZCB0byBhbiBhYnNvbHV0ZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUKK3Byb2plY3QsIDxlbT5ub3Q8L2VtPiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBKYXZhIHRhc2sgaXMgcnVuLiBJZiB5b3UgbmVlZCB0byBsb2NhdGUgYSBKQVIgZmlsZQorcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSB0aGUgdGFzayB3aWxsIGJlIHJ1biBpbiwgeW91IG5lZWQgdG8gZXhwbGljaXRseSBjcmVhdGUgdGhlIGZ1bGwgcGF0aCB0bwordGhlIEpBUiBmaWxlLjwvcD4KKzxwPldoZW4gdXNpbmcgdGhlIDx2YXI+amFyPC92YXI+IGF0dHJpYnV0ZSwgYWxsIGNsYXNzcGF0aCBzZXR0aW5ncyBhcmUgaWdub3JlZCBhY2NvcmRpbmcKK3RvIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL3Rvb2xzL3dpbmRvd3MvamF2YS5odG1sIgordGFyZ2V0PSJfdG9wIj5PcmFjbGUncyBzcGVjaWZpY2F0aW9uPC9hPi4KIAogPGgzPkV4YW1wbGVzPC9oMz4KKzxwPlJ1biBhIGNsYXNzIGluIHRoaXMgSlZNIHdpdGggYSBuZXcgamFyIG9uIHRoZSBjbGFzc3BhdGg8L3A+CiA8cHJlPgotICAgICAgICZsdDtqYXZhIGNsYXNzbmFtZT0mcXVvdDt0ZXN0Lk1haW4mcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1oJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtkaXN0L3Rlc3QuamFyJnF1b3Q7LyZndDsKLSAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqYXZhLmNsYXNzLnBhdGh9JnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OwotICAgICAgICZsdDsvamF2YSZndDsKLTwvcHJlPgotUnVuIGEgY2xhc3MgaW4gdGhpcyBKVk0gd2l0aCBhIG5ldyBqYXIgb24gdGhlIGNsYXNzcGF0aAorJmx0O2phdmEgY2xhc3NuYW1lPSZxdW90O3Rlc3QuTWFpbiZxdW90OyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstaCZxdW90Oy8mZ3Q7CisgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90Oy8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9qYXZhJmd0OzwvcHJlPgogCis8cD5SdW4gdGhlIEpBUiA8c2FtcD50ZXN0Lmphcjwvc2FtcD4gaW4gdGhpcyBwcm9qZWN0J3MgPHNhbXA+ZGlzdC9saWI8L3NhbXA+IGRpcmVjdG9yeSwgdXNpbmcgdGhlCittYW5pZmVzdCBzdXBwbGllZCBlbnRyeSBwb2ludCwgZm9ya2luZyAoYXMgcmVxdWlyZWQpLCBhbmQgd2l0aCBhIG1heGltdW0gbWVtb3J5IG9mIDEyOCBNQi4gQW55IG5vbgoremVybyByZXR1cm4gY29kZSBicmVha3MgdGhlIGJ1aWxkLjwvcD4KIDxwcmU+Ci0gICAgICAgJmx0O2phdmEgamFyPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsKLSAgICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiCi0gICAgICAgICAgIG1heG1lbW9yeT0iMTI4bSIKLSAgICAgICAgICAgJmd0OwotICAgICAgICAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstaCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OwotICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7ZGlzdC90ZXN0LmphciZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLSAgICAgICAmbHQ7L2phdmEmZ3Q7Ci08L3ByZT4KLVJ1biB0aGUgSkFSIHRlc3QuamFyIGluIHRoaXMgcHJvamVjdCdzIGRpc3QvbGliIGRpcmVjdG9yeS4KLXVzaW5nIHRoZSBtYW5pZmVzdCBzdXBwbGllZCBlbnRyeSBwb2ludCwgZm9ya2luZyAoYXMgcmVxdWlyZWQpLAotYW5kIHdpdGggYSBtYXhpbXVtIG1lbW9yeSBvZiAxMjhNQi4gQW55IG5vbiB6ZXJvIHJldHVybiBjb2RlIGJyZWFrcyB0aGUgYnVpbGQuCismbHQ7amF2YSBqYXI9JnF1b3Q7ZGlzdC90ZXN0LmphciZxdW90OworICAgICAgZm9yaz0idHJ1ZSIKKyAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgorICAgICAgbWF4bWVtb3J5PSIxMjhtIiZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstaCZxdW90Oy8mZ3Q7CisgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90Oy8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9qYXZhJmd0OzwvcHJlPgogCis8cD5SdW4gdGhlIEpBUiA8c2FtcD5kaXN0L3Rlc3QuamFyPC9zYW1wPiByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7ZXhlYy5kaXJ9PC9jb2RlPiwgdGhpcworYmVpbmcgdGhlIHNhbWUgZGlyZWN0b3J5IGluIHdoaWNoIEpWTSBpcyB0byBzdGFydCB1cC48L3A+CiA8cHJlPgotICAgICAgICZsdDtqYXZhCi0gICAgICAgICAgIGRpcj0iJHtleGVjLmRpcn0iCi0gICAgICAgICAgIGphcj0mcXVvdDske2V4ZWMuZGlyfS9kaXN0L3Rlc3QuamFyJnF1b3Q7Ci0gICAgICAgICAgIGZvcms9InRydWUiCi0gICAgICAgICAgIGZhaWxvbmVycm9yPSJ0cnVlIgotICAgICAgICAgICBtYXhtZW1vcnk9IjEyOG0iCi0gICAgICAgICAgICZndDsKLSAgICAgICAgICZsdDthcmcgdmFsdWU9JnF1b3Q7LWgmcXVvdDsvJmd0OwotICAgICAgICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsvJmd0OwotICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2phdmEuY2xhc3MucGF0aH0mcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgICAgJmx0Oy9qYXZhJmd0OwotPC9wcmU+Ci1SdW4gdGhlIEpBUiBkaXN0L3Rlc3QuamFyIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkKLTx0dD4ke2V4ZWMuZGlyfTwvdHQ+LCB0aGlzIGJlaW5nIHRoZSBzYW1lIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBKVk0KLWlzIHRvIHN0YXJ0IHVwLgorJmx0O2phdmEgZGlyPSZxdW90OyR7ZXhlYy5kaXJ9JnF1b3Q7CisgICAgICBqYXI9JnF1b3Q7JHtleGVjLmRpcn0vZGlzdC90ZXN0LmphciZxdW90OworICAgICAgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICBmYWlsb25lcnJvcj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICBtYXhtZW1vcnk9JnF1b3Q7MTI4bSZxdW90OyZndDsKKyAgJmx0O2FyZyB2YWx1ZT0mcXVvdDstaCZxdW90Oy8mZ3Q7CisgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsvJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7amF2YS5jbGFzcy5wYXRofSZxdW90Oy8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9qYXZhJmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O2phdmEgY2xhc3NuYW1lPSZxdW90O3Rlc3QuTWFpbiZxdW90Oy8mZ3Q7PC9wcmU+Ci1SdW5zIGEgZ2l2ZW4gY2xhc3Mgd2l0aCB0aGUgY3VycmVudCBjbGFzc3BhdGguCis8cD5SdW4gYSBnaXZlbiBjbGFzcyB3aXRoIHRoZSBjdXJyZW50IGNsYXNzcGF0aC48L3A+Cis8cHJlPiZsdDtqYXZhIGNsYXNzbmFtZT0mcXVvdDt0ZXN0Lk1haW4mcXVvdDsvJmd0OzwvcHJlPgogCis8cD5BZGQgc3lzdGVtIHByb3BlcnRpZXMgYW5kIEpWTSBwcm9wZXJ0aWVzIHRvIEpWTSBhcyBpbiA8Y29kZT5qYXZhCistWHJ1bmhwcm9mOmNwdT1zYW1wbGVzLGZpbGU9bG9nLnR4dCxkZXB0aD0zIC1EREVCVUc9dHJ1ZSB0ZXN0Lk1haW48L2NvZGU+CiA8cHJlPgotICAmbHQ7amF2YSBjbGFzc25hbWU9JnF1b3Q7dGVzdC5NYWluJnF1b3Q7Ci0gICAgICAgIGZvcms9JnF1b3Q7eWVzJnF1b3Q7ICZndDsKLSAgICAmbHQ7c3lzcHJvcGVydHkga2V5PSZxdW90O0RFQlVHJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OwotICAgICZsdDthcmcgdmFsdWU9JnF1b3Q7LWgmcXVvdDsvJmd0OwotICAgICZsdDtqdm1hcmcgdmFsdWU9JnF1b3Q7LVhydW5ocHJvZjpjcHU9c2FtcGxlcyxmaWxlPWxvZy50eHQsZGVwdGg9MyZxdW90Oy8mZ3Q7Ci0gICZsdDsvamF2YSZndDsKLTwvcHJlPgotQWRkIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZCBKVk0tcHJvcGVydGllcyB0byB0aGUgSlZNIGFzIGluCi08Y29kZT5qYXZhID0iLVhydW5ocHJvZjpjcHU9c2FtcGxlcyxmaWxlPWxvZy50eHQsZGVwdGg9MyAtRERFQlVHPXRydWUgdGVzdC5NYWluPC9jb2RlPgorJmx0O2phdmEgY2xhc3NuYW1lPSZxdW90O3Rlc3QuTWFpbiZxdW90OworICAgICAgZm9yaz0mcXVvdDt5ZXMmcXVvdDsgJmd0OworICAmbHQ7c3lzcHJvcGVydHkga2V5PSZxdW90O0RFQlVHJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OworICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1oJnF1b3Q7LyZndDsKKyAgJmx0O2p2bWFyZyB2YWx1ZT0mcXVvdDstWHJ1bmhwcm9mOmNwdT1zYW1wbGVzLGZpbGU9bG9nLnR4dCxkZXB0aD0zJnF1b3Q7LyZndDsKKyZsdDsvamF2YSZndDs8L3ByZT4KIAotPHByZT4gICZsdDtqYXZhIGNsYXNzbmFtZT0mcXVvdDtTaG93SmF2YVZlcnNpb24mcXVvdDsgY2xhc3NwYXRoPSZxdW90Oy4mcXVvdDsKLSAgICAgICAganZtPSZxdW90O3BhdGgtdG8tamF2YTE0LWhvbWUvYmluL2phdmEmcXVvdDsgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgIHRhc2tuYW1lPSZxdW90O2phdmExLjQmcXVvdDsgJmd0OwotPC9wcmU+Ci1Vc2UgYSBnaXZlbiBKYXZhIGltcGxlbWVudGF0aW9uIChhbm90aGVyIHRoZSBvbmUgQW50IGlzIGN1cnJlbnRseSB1c2luZykgdG8gcnVuIHRoZSBjbGFzcy4KLUZvciBkb2N1bWVudGF0aW9uIGluIHRoZSBsb2cgPGNvZGU+dGFza25hbWU8L2NvZGU+IGlzIHVzZWQgdG8gY2hhbmdlIHRoZSA8Y29kZT5bamF2YV08L2NvZGU+Ci1sb2ctcHJlZml4IHRvIDxjb2RlPltqYXZhMS40XTwvY29kZT4uCis8cD5Vc2UgYSBnaXZlbiBKYXZhIGltcGxlbWVudGF0aW9uIChvdGhlciB0aGFuIHRoZSBvbmUgQW50IGlzIGN1cnJlbnRseSB1c2luZykgdG8gcnVuIHRoZSBjbGFzcy4gRm9yCitkb2N1bWVudGF0aW9uIGluIHRoZSBsb2cgPHZhcj50YXNrbmFtZTwvdmFyPiBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgPHE+W2phdmFdPC9xPiBsb2ctcHJlZml4Cit0byA8cT5bamF2YTEuNF08L3E+LjwvcD4KKzxwcmU+CismbHQ7amF2YSBjbGFzc25hbWU9JnF1b3Q7U2hvd0phdmFWZXJzaW9uJnF1b3Q7IGNsYXNzcGF0aD0mcXVvdDsuJnF1b3Q7CisgICAgICBqdm09JnF1b3Q7cGF0aC10by1qYXZhMTQtaG9tZS9iaW4vamF2YSZxdW90OyBmb3JrPSZxdW90O3RydWUmcXVvdDsKKyAgICAgIHRhc2tuYW1lPSZxdW90O2phdmExLjQmcXVvdDsvJmd0OzwvcHJlPgogCi0KLTxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogeW91IGNhbiBub3Qgc3BlY2lmeSB0aGUgKGhpZ2hseSBkZXByZWNhdGVkKSBNU0pWTSwgImp2aWV3LmV4ZSIgYXMgdGhlCi1KVk0sIGFzIGl0IHRha2VzIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciBvdGhlciBKVk1zLAorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiB5b3UgY2FuIG5vdCBzcGVjaWZ5IHRoZSAoaGlnaGx5IGRlcHJlY2F0ZWQpIE1TCitKVk0sIDxzYW1wPmp2aWV3LmV4ZTwvc2FtcD4sIGFzIDx2YXI+anZtPC92YXI+LCBzaW5jZSBpdCB0YWtlcyBkaWZmZXJlbnQgcGFyYW1ldGVycyB0aGFuIG90aGVyIEpWTXMuCiBUaGF0IEpWTSBjYW4gYmUgc3RhcnRlZCBmcm9tIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gaWYgcmVxdWlyZWQuPC9wPgogCis8cD5SdW4gdGhlIG1vZHVsZSA8c2FtcD5UZXN0TW9kdWxlPC9zYW1wPiByZXNvbHZlZCBvbiB0aGUgbW9kdWxlcGF0aCA8c2FtcD5saWIvOmRpc3QvdGVzdC5qYXI8L3NhbXA+Cit3aXRoIGEgbWF4aW11bSBtZW1vcnkgb2YgMTI4IE1CLiBBbnkgbm9uIHplcm8gcmV0dXJuIGNvZGUgYnJlYWtzIHRoZSBidWlsZC48L3A+CiA8cHJlPgotICAgICAgICZsdDtqYXZhCi0gICAgICAgICAgIGZvcms9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICBmYWlsb25lcnJvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIG1heG1lbW9yeT0mcXVvdDsxMjhtJnF1b3Q7Ci0gICAgICAgICAgIG1vZHVsZT0mcXVvdDtUZXN0TW9kdWxlJnF1b3Q7Ci0gICAgICAgICAgIG1vZHVsZXBhdGg9JnF1b3Q7bGliOmRpc3QvdGVzdC5qYXImcXVvdDsvJmd0OwotPC9wcmU+Ci1SdW5zIHRoZSBtb2R1bGUgVGVzdE1vZHVsZSByZXNvbHZlZCBvbiB0aGUgbW9kdWxlcGF0aCA8dHQ+bGliLzpkaXN0L3Rlc3QuamFyPC90dD4KLXdpdGggYSBtYXhpbXVtIG1lbW9yeSBvZiAxMjhNQi4gQW55IG5vbiB6ZXJvIHJldHVybiBjb2RlIGJyZWFrcyB0aGUgYnVpbGQuCismbHQ7amF2YSBmb3JrPSZxdW90O3RydWUmcXVvdDsKKyAgICAgIGZhaWxvbmVycm9yPSZxdW90O3RydWUmcXVvdDsKKyAgICAgIG1heG1lbW9yeT0mcXVvdDsxMjhtJnF1b3Q7CisgICAgICBtb2R1bGU9JnF1b3Q7VGVzdE1vZHVsZSZxdW90OworICAgICAgbW9kdWxlcGF0aD0mcXVvdDtsaWI6ZGlzdC90ZXN0LmphciZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPlJ1biB0aGUgY2xhc3MgPHNhbXA+TWFpbjwvc2FtcD4gaW4gbW9kdWxlIDxzYW1wPlRlc3RNb2R1bGU8L3NhbXA+IHJlc29sdmVkIG9uIHRoZQorbW9kdWxlcGF0aCA8c2FtcD5saWIvOmRpc3QvdGVzdC5qYXI8L3NhbXA+IHdpdGggYSBtYXhpbXVtIG1lbW9yeSBvZiAxMjggTUIuIEFueSBub24gemVybyByZXR1cm4gY29kZQorYnJlYWtzIHRoZSBidWlsZC48L3A+CiA8cHJlPgotICAgICAgICZsdDtqYXZhCi0gICAgICAgICAgIGZvcms9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICBmYWlsb25lcnJvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIG1heG1lbW9yeT0mcXVvdDsxMjhtJnF1b3Q7Ci0gICAgICAgICAgIG1vZHVsZT0mcXVvdDtUZXN0TW9kdWxlJnF1b3Q7Ci0gICAgICAgICAgIGNsYXNzbmFtZT0mcXVvdDtNYWluJnF1b3Q7Jmd0OwotICAgICAgICAgJmx0O21vZHVsZXBhdGgmZ3Q7Ci0gICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtsaWImcXVvdDsvJmd0OwotICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7ZGlzdC90ZXN0LmphciZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L21vZHVsZXBhdGgmZ3Q7Ci0gICAgICAgJmx0Oy9qYXZhJmd0OwotPC9wcmU+Ci1SdW5zIHRoZSBjbGFzcyBNYWluIGluIG1vZHVsZSBUZXN0TW9kdWxlIHJlc29sdmVkIG9uIHRoZSBtb2R1bGVwYXRoIDx0dD5saWIvOmRpc3QvdGVzdC5qYXI8L3R0Pgotd2l0aCBhIG1heGltdW0gbWVtb3J5IG9mIDEyOE1CLiBBbnkgbm9uIHplcm8gcmV0dXJuIGNvZGUgYnJlYWtzIHRoZSBidWlsZC4KKyZsdDtqYXZhIGZvcms9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgZmFpbG9uZXJyb3I9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgbWF4bWVtb3J5PSZxdW90OzEyOG0mcXVvdDsKKyAgICAgIG1vZHVsZT0mcXVvdDtUZXN0TW9kdWxlJnF1b3Q7CisgICAgICBjbGFzc25hbWU9JnF1b3Q7TWFpbiZxdW90OyZndDsKKyAgJmx0O21vZHVsZXBhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2xpYiZxdW90Oy8mZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2Rpc3QvdGVzdC5qYXImcXVvdDsvJmd0OworICAmbHQ7L21vZHVsZXBhdGgmZ3Q7CismbHQ7L2phdmEmZ3Q7PC9wcmU+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvamF2YWMuaHRtbCBiL21hbnVhbC9UYXNrcy9qYXZhYy5odG1sCmluZGV4IDg5ZWMwNTQuLjMwY2YzYjcgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9qYXZhYy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9qYXZhYy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsOTUyICsxNSw3NDIgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbCBsYW5nPSJlbi11cyI+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5KYXZhYyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJqYXZhYyI+SmF2YWM8L2E+PC9oMj4KKzxoMiBpZD0iamF2YWMiPkphdmFjPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiA8cD5Db21waWxlcyBhIEphdmEgc291cmNlIHRyZWUuPC9wPgotPHA+VGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgSmF2YQotc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIE9ubHkgSmF2YSBmaWxlcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZwotPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlCi1vciB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBvbGRlciB0aGFuIHRoZQotPGNvZGU+LmphdmE8L2NvZGU+IGZpbGUgd2lsbCBiZSBjb21waWxlZC48L3A+Ci08cD5Ob3RlOiBBcGFjaGUgQW50IHVzZXMgb25seSB0aGUgbmFtZXMgb2YgdGhlIHNvdXJjZSBhbmQgY2xhc3MgZmlsZXMgdG8gZmluZAotdGhlIGNsYXNzZXMgdGhhdCBuZWVkIGEgcmVidWlsZC4gSXQgd2lsbCBub3Qgc2NhbiB0aGUgc291cmNlIGFuZCB0aGVyZWZvcmUKLXdpbGwgaGF2ZSBubyBrbm93bGVkZ2UgYWJvdXQgbmVzdGVkIGNsYXNzZXMsIGNsYXNzZXMgdGhhdCBhcmUgbmFtZWQgZGlmZmVyZW50Ci1mcm9tIHRoZSBzb3VyY2UgZmlsZSwgYW5kIHNvIG9uLiBTZWUgdGhlCi08YSBocmVmPSIuLi9UYXNrcy9kZXBlbmQuaHRtbCI+PGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+PC9hPiB0YXNrCi1mb3IgZGVwZW5kZW5jeSBjaGVja2luZyBiYXNlZCBvbiBvdGhlciB0aGFuIGp1c3QKLWV4aXN0ZW5jZS9tb2RpZmljYXRpb24gdGltZXMuPC9wPgotPHA+V2hlbiB0aGUgc291cmNlIGZpbGVzIGFyZSBwYXJ0IG9mIGEgcGFja2FnZSwgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YKLXRoZSBzb3VyY2UgdHJlZSBzaG91bGQgZm9sbG93IHRoZSBwYWNrYWdlCi1oaWVyYXJjaHkuPC9wPgotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQuCi1UaGlzIGNhbiBiZSBkb25lIHdpdGggdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiwgPGNvZGU+aW5jbHVkZXNmaWxlPC9jb2RlPiwKLTxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiwgYW5kIDxjb2RlPmV4Y2x1ZGVzZmlsZTwvY29kZT4KLWF0dHJpYnV0ZXMuIFdpdGggdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBvcgotPGNvZGU+aW5jbHVkZXNmaWxlPC9jb2RlPiBhdHRyaWJ1dGUsIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bwotaGF2ZSBpbmNsdWRlZC4KLVRoZSA8Y29kZT5leGNsdWRlPC9jb2RlPiBvciA8Y29kZT5leGNsdWRlc2ZpbGU8L2NvZGU+IGF0dHJpYnV0ZSBpcyB1c2VkCi10byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gSW4gYm90aCBjYXNlcywgdGhlIGxpc3Qgb2YgZmlsZXMKLWNhbiBiZSBzcGVjaWZpZWQgYnkgZWl0aGVyIHRoZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeShzKSBzcGVjaWZpZWQKLWluIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZSBvciBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+Ci1lbGVtZW50KHMpLCBvciBieSB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucy4gU2VlIHRoZSBzZWN0aW9uIG9uCi08YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeS1iYXNlZCB0YXNrczwvYT4sCi1mb3IgaW5mb3JtYXRpb24gb24gaG93IHRoZQotaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSB3aWxkY2FyZCBwYXR0ZXJucy48L3A+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbXBpbGVycy4gVGhpcyBjYW4gYmUgc3BlY2lmaWVkIGJ5Ci1laXRoZXIgc2V0dGluZyB0aGUgZ2xvYmFsIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgd2hpY2ggd2lsbAotYWZmZWN0IGFsbCA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrcyB0aHJvdWdob3V0IHRoZSBidWlsZCwgYnkKLXNldHRpbmcgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiBhdHRyaWJ1dGUsIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50Ci08Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrIG9yIGJ5IHVzaW5nIGEgbmVzdGVkIGVsZW1lbnQgb2YgYW55Ci08YSBocmVmPSJ0eXBlZGVmLmh0bWwiPnR5cGVkZWY8L2E+ZmVkIG9yCi08YSBocmVmPSJjb21wb25lbnRkZWYuaHRtbCI+Y29tcG9uZW50ZGVmPC9hPmZlZCB0eXBlIHRoYXQgaW1wbGVtZW50cwotPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkNvbXBpbGVyQWRhcHRlcjwvY29kZT4uCi08YSBuYW1lPSJjb21waWxlcnZhbHVlcyI+VmFsaWQgdmFsdWVzIGZvciBlaXRoZXIgdGhlCi08Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgb3IgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPgotYXR0cmlidXRlIGFyZTo8L2E+PC9wPgorPHA+VGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgSmF2YSBzb3VyY2UgZmlsZXMgdG8KK2NvbXBpbGUuIE9ubHkgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzIHRoYXQgaGF2ZSBubyBjb3JyZXNwb25kaW5nIDxzYW1wPi5jbGFzczwvc2FtcD4gZmlsZSBvciB3aGVyZQordGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZSBpcyBvbGRlciB0aGFuIHRoZSA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZSB3aWxsIGJlIGNvbXBpbGVkLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogQXBhY2hlIEFudCB1c2VzIG9ubHkgdGhlIG5hbWVzIG9mIHRoZSBzb3VyY2UgYW5kIGNsYXNzIGZpbGVzIHRvIGZpbmQgdGhlCitjbGFzc2VzIHRoYXQgbmVlZCBhIHJlYnVpbGQuIEl0IHdpbGwgbm90IHNjYW4gdGhlIHNvdXJjZSBhbmQgdGhlcmVmb3JlIHdpbGwgaGF2ZSBubyBrbm93bGVkZ2UgYWJvdXQKK25lc3RlZCBjbGFzc2VzLCBjbGFzc2VzIHRoYXQgYXJlIG5hbWVkIGRpZmZlcmVudGx5IGZyb20gdGhlIHNvdXJjZSBmaWxlLCBhbmQgc28gb24uIFNlZQordGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL2RlcGVuZC5odG1sIj48Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT48L2E+IHRhc2sgZm9yIGRlcGVuZGVuY3kgY2hlY2tpbmcKK2Jhc2VkIG9uIG90aGVyIHRoYW4ganVzdCBleGlzdGVuY2UvbW9kaWZpY2F0aW9uIHRpbWVzLjwvcD4KKzxwPldoZW4gdGhlIHNvdXJjZSBmaWxlcyBhcmUgcGFydCBvZiBhIHBhY2thZ2UsIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgdHJlZSBzaG91bGQKK2ZvbGxvdyB0aGUgcGFja2FnZSBoaWVyYXJjaHkuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQuICBUaGlzIGNhbiBiZSBkb25lIHdpdGgKK3RoZSA8dmFyPmluY2x1ZGVzPC92YXI+LCA8dmFyPmluY2x1ZGVzZmlsZTwvdmFyPiwgPHZhcj5leGNsdWRlczwvdmFyPiwgYW5kIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+CithdHRyaWJ1dGVzLiBXaXRoIHRoZSA8dmFyPmluY2x1ZGVzPC92YXI+IG9yIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+IGF0dHJpYnV0ZSwgeW91IHNwZWNpZnkgdGhlIGZpbGVzCit5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkLiAgVGhlIDx2YXI+ZXhjbHVkZTwvdmFyPiBvciA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCB0bworc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gSW4gYm90aCBjYXNlcywgdGhlIGxpc3Qgb2YgZmlsZXMgY2FuIGJlIHNwZWNpZmllZCBieQorZWl0aGVyIHRoZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeShzKSBzcGVjaWZpZWQgaW4gdGhlIDx2YXI+c3JjZGlyPC92YXI+IGF0dHJpYnV0ZSBvcgorbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50KHMpLCBvciBieSB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucy4gU2VlIHRoZSBzZWN0aW9uCitvbiA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeS1iYXNlZCB0YXNrczwvYT4sIGZvciBpbmZvcm1hdGlvbiBvbiBob3cKK3RoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHdpbGRjYXJkIHBhdHRlcm5zLjwvcD4KKzxwIGlkPSJjb21waWxlcnZhbHVlcyI+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBieSBlaXRoZXIKK3NldHRpbmcgdGhlIGdsb2JhbCA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHksIHdoaWNoIHdpbGwgYWZmZWN0CithbGwgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFza3MgdGhyb3VnaG91dCB0aGUgYnVpbGQsIGJ5IHNldHRpbmcgdGhlIDx2YXI+Y29tcGlsZXI8L3Zhcj4KK2F0dHJpYnV0ZSwgc3BlY2lmaWMgdG8gdGhlIGN1cnJlbnQgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzayBvciBieSB1c2luZyBhIG5lc3RlZCBlbGVtZW50IG9mCithbnkgPGEgaHJlZj0idHlwZWRlZi5odG1sIj50eXBlZGVmPC9hPmZlZCBvciA8YSBocmVmPSJjb21wb25lbnRkZWYuaHRtbCI+Y29tcG9uZW50ZGVmPC9hPmZlZCB0eXBlCit0aGF0IGltcGxlbWVudHMgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkNvbXBpbGVyQWRhcHRlcjwvY29kZT4uICBWYWxpZCB2YWx1ZXMKK2ZvciBlaXRoZXIgdGhlIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSBvciB0aGUgPHZhcj5jb21waWxlcjwvdmFyPiBhdHRyaWJ1dGUgYXJlOjwvcD4KIDx1bD4KLSAgPGxpPjxjb2RlPmNsYXNzaWM8L2NvZGU+ICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMS8xLjIpICZuZGFzaDsKLSAgICAgIDxjb2RlPmphdmFjMS4xPC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS4yPC9jb2RlPiBjYW4gYmUgdXNlZCBhcyBhbGlhc2VzLjwvbGk+Ci0gIDxsaT48Y29kZT5tb2Rlcm48L2NvZGU+ICh0aGUgc3RhbmRhcmQgY29tcGlsZXIgb2YgSkRLIDEuMyBhbmQgbGF0ZXIpICZuZGFzaDsKLSAgICAgIDxjb2RlPmphdmFjMS4zPC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS40PC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS41PC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS42PC9jb2RlPiBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS43PC9jb2RlPiAoPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+KSBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS44PC9jb2RlPiAoPGVtPnNpbmNlIEFudCAxLjguMzwvZW0+KSBhbmQKLSAgICAgIDxjb2RlPmphdmFjMS45PC9jb2RlPiAoPGVtPnNpbmNlIEFudCAxLjkuNTwvZW0+KSBhbmQKLSAgICAgIDxjb2RlPmphdmFjOTwvY29kZT4gKDxlbT5zaW5jZSBBbnQgMS45Ljg8L2VtPikgYW5kCi0gICAgICA8Y29kZT5qYXZhYzEwKzwvY29kZT4gKDxlbT5zaW5jZSBBbnQgMS45LjEwPC9lbT4pIGNhbiBiZSB1c2VkIGFzIGFsaWFzZXMuPC9saT4KLSAgPGxpPjxjb2RlPmppa2VzPC9jb2RlPiAodGhlIDxhCi0gICAgaHJlZj0iaHR0cDovL2ppa2VzLnNvdXJjZWZvcmdlLm5ldC8iIHRhcmdldD0iX3RvcCI+SmlrZXM8L2E+CisgIDxsaT48cT5jbGFzc2ljPC9xPiAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjEvMS4yKSAmbmRhc2g7IDxxPmphdmFjMS4xPC9xPgorICAgIGFuZCA8cT5qYXZhYzEuMjwvcT4gY2FuIGJlIHVzZWQgYXMgYWxpYXNlcy48L2xpPgorICA8bGk+PHE+bW9kZXJuPC9xPiAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIEpESyAxLjMgYW5kIGxhdGVyKQorICAgICZuZGFzaDsgPHE+amF2YWMxLjM8L3E+LCA8cT5qYXZhYzEuNDwvcT4sIDxxPmphdmFjMS41PC9xPiBhbmQgPHE+amF2YWMxLjY8L3E+LCA8cT5qYXZhYzEuNzwvcT4KKyAgICAoPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+KSwgPHE+amF2YWMxLjg8L3E+ICg8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT4pLCA8cT5qYXZhYzEuOTwvcT4KKyAgICAoPGVtPnNpbmNlIEFudCAxLjkuNTwvZW0+KSwgPHE+amF2YWM5PC9xPiAoPGVtPnNpbmNlIEFudCAxLjkuODwvZW0+KSBhbmQgPHE+amF2YWMxMCs8L3E+CisgICAgKDxlbT5zaW5jZSBBbnQgMS4xMC4yPC9lbT4pIGNhbiBiZSB1c2VkIGFzIGFsaWFzZXMuPC9saT4KKyAgPGxpPjxxPmppa2VzPC9xPiAodGhlIDxhIGhyZWY9Imh0dHA6Ly9qaWtlcy5zb3VyY2Vmb3JnZS5uZXQvIiB0YXJnZXQ9Il90b3AiPkppa2VzPC9hPgogICAgIGNvbXBpbGVyKS48L2xpPgotICA8bGk+PGNvZGU+anZjPC9jb2RlPiAodGhlIENvbW1hbmQtTGluZSBDb21waWxlciBmcm9tIE1pY3Jvc29mdCdzIFNESwotICAgICAgZm9yIEphdmEgLyBWaXN1YWwgSisrKSAmbmRhc2g7IDxjb2RlPm1pY3Jvc29mdDwvY29kZT4gY2FuIGJlIHVzZWQKLSAgICAgIGFzIGFuIGFsaWFzLjwvbGk+Ci0gIDxsaT48Y29kZT5ramM8L2NvZGU+ICh0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5kbXMuYXQva29waS8iIHRhcmdldD0iX3RvcCI+a29waTwvYT4KLSAgICBjb21waWxlcikuPC9saT4KLSAgPGxpPjxjb2RlPmdjajwvY29kZT4gKHRoZSBnY2ogY29tcGlsZXIgZnJvbSBnY2MpLjwvbGk+Ci0gIDxsaT48Y29kZT5zajwvY29kZT4gKFN5bWFudGVjIGphdmEgY29tcGlsZXIpICZuZGFzaDsKLSAgICAgIDxjb2RlPnN5bWFudGVjPC9jb2RlPiBjYW4gYmUgdXNlZCBhcyBhbiBhbGlhcy48L2xpPgotICA8bGk+PGNvZGU+ZXh0SmF2YWM8L2NvZGU+IChydW4gZWl0aGVyIG1vZGVybiBvciBjbGFzc2ljIGluIGEgSlZNIG9mCi0gICAgICBpdHMgb3duKS48L2xpPgorICA8bGk+PHE+anZjPC9xPiAodGhlIENvbW1hbmQtTGluZSBDb21waWxlciBmcm9tIE1pY3Jvc29mdCdzIFNESyBmb3IgSmF2YSAvIFZpc3VhbCBKKyspCisgICAgJm5kYXNoOyA8cT5taWNyb3NvZnQ8L3E+IGNhbiBiZSB1c2VkIGFzIGFuIGFsaWFzLjwvbGk+CisgIDxsaT48cT5ramM8L3E+CisgICAgKHRoZSA8YSBocmVmPSJodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAwNTAyMTIwMjU1MDcvaHR0cDovL3d3dy5kbXMuYXQva29waS9pbmRleC5odG1sIgorICAgIHRhcmdldD0iX3RvcCI+a29waTwvYT4gY29tcGlsZXIpLjwvbGk+CisgIDxsaT48cT5nY2o8L3E+ICh0aGUgPGNvZGU+Z2NqPC9jb2RlPiBjb21waWxlcgorICAgIGZyb20gPGEgaHJlZj0iaHR0cHM6Ly9nY2MuZ251Lm9yZy9nY2MtNy9jaGFuZ2VzLmh0bWwjamF2YSIgdGFyZ2V0PSJfdG9wIj5HQ0M8L2E+KS48L2xpPgorICA8bGk+PHE+c2o8L3E+IChTeW1hbnRlYyBKYXZhIGNvbXBpbGVyKSAmbmRhc2g7IDxxPnN5bWFudGVjPC9xPiBjYW4gYmUgdXNlZCBhcyBhbiBhbGlhcy48L2xpPgorICA8bGk+PHE+ZXh0SmF2YWM8L3E+IChydW4gZWl0aGVyIG1vZGVybiBvciBjbGFzc2ljIGluIGEgSlZNIG9mIGl0cyBvd24pLjwvbGk+CiA8L3VsPgotPHA+VGhlIGRlZmF1bHQgaXMgPGNvZGU+amF2YWMxLng8L2NvZGU+IHdpdGggPGNvZGU+eDwvY29kZT4gZGVwZW5kaW5nCi1vbiB0aGUgSkRLIHZlcnNpb24geW91IHVzZSB3aGlsZSB5b3UgYXJlIHJ1bm5pbmcgQW50LgotSWYgeW91IHdpc2ggdG8gdXNlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGludGVyZmFjZSB0aGFuIHRob3NlCi1zdXBwbGllZCwgeW91IGNhbiB3cml0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQotKDxjb2RlPnBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzPC9jb2RlPikuIFN1cHBseSB0aGUgZnVsbAotY2xhc3NuYW1lIGluIHRoZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgb3IgdGhlCi08Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlLgotPC9wPgotPHA+VGhlIGZvcmsgYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5Ci1vciA8Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlIHNldHRpbmcgYW5kCi1leHBlY3RzIGEgSkRLMS4xIG9yIGhpZ2hlciB0byBiZSBzZXQgaW4gPGNvZGU+SkFWQV9IT01FPC9jb2RlPi4KLTwvcD4KLTxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPmNvbXBpbGVyPC9jb2RlPiBhdHRyaWJ1dGUgdG8gdGVsbCBBbnQKLXdoaWNoIEpESyB2ZXJzaW9uIGl0IHNoYWxsIGFzc3VtZSB3aGVuIGl0IHB1dHMgdG9nZXRoZXIgdGhlIGNvbW1hbmQKLWxpbmUgc3dpdGNoZXMgLSBldmVuIGlmIHlvdSBzZXQgPGNvZGU+Zm9yaz0mcXVvdDt0cnVlJnF1b3Q7PC9jb2RlPi4KLVRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biB0aGUgY29tcGlsZXIgb2YgSkRLIDEuMSB3aGlsZSB5b3UKLWN1cnJlbnQgSkRLIGlzIDEuMisuICBJZiB5b3UgdXNlCi08Y29kZT5jb21waWxlcj0mcXVvdDtqYXZhYzEuMSZxdW90OzwvY29kZT4gYW5kIChmb3IgZXhhbXBsZSkKLTxjb2RlPmRlcGVuZD0mcXVvdDt0cnVlJnF1b3Q7PC9jb2RlPiBBbnQgd2lsbCB1c2UgdGhlIGNvbW1hbmQgbGluZQotc3dpdGNoIDxjb2RlPi1kZXBlbmQ8L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+LVhkZXBlbmQ8L2NvZGU+LjwvcD4KLTxwPlRoaXMgdGFzayB3aWxsIGRyb3AgYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBub24tZXhpc3RlbnQKLWZpbGVzL2RpcmVjdG9yaWVzIGZyb20gdGhlIGNsYXNzcGF0aCBpdCBwYXNzZXMgdG8gdGhlIGNvbXBpbGVyLjwvcD4KLTxwPlRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYSBmb3JrZWQgZXhlY3V0YWJsZSAoaWYgYW55KSBpcyB0aGUKLSAgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5LjwvcD4KLTxwPjxzdHJvbmc+V2luZG93cyBOb3RlOjwvc3Ryb25nPldoZW4gdGhlIG1vZGVybiBjb21waWxlciBpcyB1c2VkCi1pbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0IGxvY2tzIHVwIHRoZSBmaWxlcyBwcmVzZW50IGluIHRoZQotY2xhc3NwYXRoIG9mIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLCBhbmQgZG9lcyBub3QgcmVsZWFzZSB0aGVtLgotVGhlIHNpZGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgb3IgbW92ZQotdGhvc2UgZmlsZXMgbGF0ZXIgb24gaW4gdGhlIGJ1aWxkLiAgVGhlIHdvcmthcm91bmQgaXMgdG8gZm9yayB3aGVuCi1pbnZva2luZyB0aGUgY29tcGlsZXIuPC9wPgotPHA+SWYgeW91IGFyZSB1c2luZyBKYXZhIDggb3IgYWJvdmUgYW5kIHlvdXIgc291cmNlIGNvbnRhaW5zIG5hdGl2ZQotICBtZXRob2RzIG9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aCB0aGUgPGNvZGU+QE5hdGl2ZTwvY29kZT4gYW5ub3RhdGlvbgotICB5b3UgY2FuIHNldCB0aGUgPGNvZGU+bmF0aXZlaGVhZGVyZGlyPC9jb2RlPiBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8KLSAgdXNlIHRoZSA8Y29kZT4taDwvY29kZT4gc3dpdGNoIG9mIDxjb2RlPmphdmFjPC9jb2RlPiB0byBnZW5lcmF0ZSB0aGUKLSAgbmF0aXZlIGhlYWRlciBmaWxlcy4gTm90ZSB0aGF0IHRoZSBsb2dpYyBBbnQgdXNlcyB0byBkZXRlcm1pbmUgd2hpY2gKLSAgZmlsZXMgdG8gY29tcGlsZSBkb2VzIG5vdCB0YWtlIG5hdGl2ZSBoZWFkZXJzIGludG8gYWNjb3VudCwgaS5lLiBpZgotICB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZQotICBjb3JyZXNwb25kaW5nIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlIHRoZSBmaWxlIHdpbGwgbm90IGdldCBjb21waWxlZAotICBldmVuIGlmIGEgbmF0aXZlIGhlYWRlciBmaWxlIGdlbmVyYXRlZCBmb3IgaXQgd291bGQgYmUgb3V0ZGF0ZWQuPC9wPgorPHA+VGhlIGRlZmF1bHQgaXMgPHE+amF2YWMxLng8L3E+IHdpdGggPHE+eDwvcT4gZGVwZW5kaW5nIG9uIHRoZSBKREsgdmVyc2lvbiB5b3UgdXNlIHdoaWxlIHlvdSBhcmUKK3J1bm5pbmcgQW50LiAgSWYgeW91IHdpc2ggdG8gdXNlIGEgZGlmZmVyZW50IGNvbXBpbGVyIGludGVyZmFjZSB0aGFuIHRob3NlIHN1cHBsaWVkLCB5b3UgY2FuIHdyaXRlIGEKK2NsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgQ29tcGlsZXJBZGFwdGVyIGludGVyZmFjZQorKHBhY2thZ2UgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzPC9jb2RlPikuIFN1cHBseSB0aGUgZnVsbCBjbGFzc25hbWUgaW4KK3RoZSA8Y29kZT5idWlsZC5jb21waWxlcjwvY29kZT4gcHJvcGVydHkgb3IgdGhlIDx2YXI+Y29tcGlsZXI8L3Zhcj4gYXR0cmlidXRlLjwvcD4KKzxwPlRoZSA8dmFyPmZvcms8L3Zhcj4gYXR0cmlidXRlIG92ZXJyaWRlcyB0aGUgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5CitvciA8dmFyPmNvbXBpbGVyPC92YXI+IGF0dHJpYnV0ZSBzZXR0aW5nIGFuZCBleHBlY3RzIGEgSkRLIDEuMSBvciBoaWdoZXIgdG8gYmUgc2V0CitpbiA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+LjwvcD4KKzxwPllvdSBjYW4gYWxzbyB1c2UgdGhlIDx2YXI+Y29tcGlsZXI8L3Zhcj4gYXR0cmlidXRlIHRvIHRlbGwgQW50IHdoaWNoIEpESyB2ZXJzaW9uIGl0IHNoYWxsIGFzc3VtZQord2hlbiBpdCBwdXRzIHRvZ2V0aGVyIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoZXMmbWRhc2g7ZXZlbiBpZiB5b3Ugc2V0IDx2YXI+Zm9yazwvdmFyPj08cT50cnVlPC9xPi4KK1RoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIHJ1biB0aGUgY29tcGlsZXIgb2YgSkRLIDEuMSB3aGlsZSB5b3VyIGN1cnJlbnQgSkRLIGlzIDEuMisuICBJZiB5b3UKK3VzZSA8dmFyPmNvbXBpbGVyPC92YXI+PTxxPmphdmFjMS4xPC9xPiBhbmQgKGZvciBleGFtcGxlKSA8dmFyPmRlcGVuZDwvdmFyPj08cT50cnVlPC9xPiwgQW50IHdpbGwKK3VzZSB0aGUgY29tbWFuZCBsaW5lIHN3aXRjaCA8a2JkPi1kZXBlbmQ8L2tiZD4gaW5zdGVhZCBvZiA8a2JkPi1YZGVwZW5kPC9rYmQ+LjwvcD4KKzxwPlRoaXMgdGFzayB3aWxsIGRyb3AgYWxsIGVudHJpZXMgdGhhdCBwb2ludCB0byBub24tZXhpc3RlbnQgZmlsZXMvZGlyZWN0b3JpZXMgZnJvbSB0aGUgY2xhc3NwYXRoCitpdCBwYXNzZXMgdG8gdGhlIGNvbXBpbGVyLjwvcD4KKzxwPlRoZSB3b3JraW5nIGRpcmVjdG9yeSBmb3IgYSBmb3JrZWQgZXhlY3V0YWJsZSAoaWYgYW55KSBpcyB0aGUgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5LjwvcD4KKzxwPjxzdHJvbmc+V2luZG93cyBOb3RlPC9zdHJvbmc+OiBXaGVuIHRoZSBtb2Rlcm4gY29tcGlsZXIgaXMgdXNlZCBpbiB1bmZvcmtlZCBtb2RlIG9uIFdpbmRvd3MsIGl0Citsb2NrcyB1cCB0aGUgZmlsZXMgcHJlc2VudCBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLCBhbmQgZG9lcyBub3QKK3JlbGVhc2UgdGhlbS4gIFRoZSBzaWRlIGVmZmVjdCBvZiB0aGlzIGlzIHRoYXQgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gZGVsZXRlIG9yIG1vdmUgdGhvc2UgZmlsZXMKK2xhdGVyIG9uIGluIHRoZSBidWlsZC4gIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGZvcmsgd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIuPC9wPgorPHA+SWYgeW91IGFyZSB1c2luZyBKYXZhIDggb3IgYWJvdmUgYW5kIHlvdXIgc291cmNlIGNvbnRhaW5zIG5hdGl2ZSBtZXRob2RzIG9yIGZpZWxkcyBhbm5vdGF0ZWQgd2l0aAordGhlIDxjb2RlPkBOYXRpdmU8L2NvZGU+IGFubm90YXRpb24geW91IGNhbiBzZXQgdGhlIDx2YXI+bmF0aXZlaGVhZGVyZGlyPC92YXI+IGF0dHJpYnV0ZSBpbiBvcmRlciB0bwordXNlIHRoZSA8a2JkPi1oPC9rYmQ+IHN3aXRjaCBvZiA8a2JkPmphdmFjPC9rYmQ+IHRvIGdlbmVyYXRlIHRoZSBuYXRpdmUgaGVhZGVyIGZpbGVzLiBOb3RlIHRoYXQKK3RoZSBsb2dpYyBBbnQgdXNlcyB0byBkZXRlcm1pbmUgd2hpY2ggZmlsZXMgdG8gY29tcGlsZSBkb2VzIG5vdCB0YWtlIG5hdGl2ZSBoZWFkZXJzIGludG8gYWNjb3VudCwKK2kuZS4gaWYgdGhlIDxzYW1wPi5jbGFzczwvc2FtcD4gaXMgbW9yZSByZWNlbnQgdGhhbiB0aGUgY29ycmVzcG9uZGluZyA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZSB0aGUKK2ZpbGUgd2lsbCBub3QgZ2V0IGNvbXBpbGVkIGV2ZW4gaWYgYSBuYXRpdmUgaGVhZGVyIGZpbGUgZ2VuZXJhdGVkIGZvciBpdCB3b3VsZCBiZSBvdXRkYXRlZC48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiB0aGUgamF2YSBmaWxlcy4gKFNlZSB0aGUKLSAgICAgPGEgaHJlZj0iI3NyY2Rpcm5vdGUiPm5vdGU8L2E+IGJlbG93Lik8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3MgbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvciA8Y29kZT5tb2R1bGVzb3VyY2VwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgb3IgZWxlbWVudHMgYXJlIHByZXNlbnQuPC90ZD4KKyAgICA8dGQ+c3JjZGlyPC90ZD4KKyAgICA8dGQ+TG9jYXRpb24gb2YgdGhlIGphdmEgZmlsZXMuIChTZWUgdGhlIDxhIGhyZWY9IiNzcmNkaXJub3RlIj5ub3RlPC9hPiBiZWxvdy4pPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvciA8dmFyPm1vZHVsZXNvdXJjZXBhdGg8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSBvciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGFyZSBwcmVzZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjbGFzcyBmaWxlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBmaWxlcyAobWF5IGJlIHNwZWNpZmllZCB1c2luZwotICAgICAgd2lsZGNhcmQgcGF0dGVybnMpIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQ7IGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGZpbGVzIHRvCi0gICAgICBpbmNsdWRlIChtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHdpbGRjYXJkIHBhdHRlcm5zKS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZXMgKG1heSBiZSBzcGVjaWZpZWQgdXNpbmcKLSAgICAgIHdpbGRjYXJkIHBhdHRlcm5zKSB0aGF0IG11c3QgYmUgZXhjbHVkZWQ7IG5vIGZpbGVzIChleGNlcHQgZGVmYXVsdAotICAgICAgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBmaWxlcyB0bwotICAgICAgZXhjbHVkZSAobWF5IGJlIHNwZWNpZmllZCB1c2luZyB3aWxkY2FyZCBwYXR0ZXJucykuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90ICg8cT55ZXN8bm88L3E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZXBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNvdXJjZXBhdGggdG8gdXNlOyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIHNyY2RpciBhdHRyaWJ1dGUgKG9yIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMpLgotICAgICAgICBUbyBzdXBwcmVzcyB0aGUgc291cmNlcGF0aCBzd2l0Y2gsIHVzZSA8Y29kZT5zb3VyY2VwYXRoPSZxdW90OyZxdW90OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ib290Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgTG9jYXRpb24gb2YgYm9vdHN0cmFwIGNsYXNzIGZpbGVzLiAoU2VlIDxhIGhyZWY9IiNib290c3RyYXAiPmJlbG93PC9hPgotICAgICAgZm9yIHVzaW5nIHRoZSAtWCBhbmQgLUotWCBwYXJhbWV0ZXJzIGZvciBzcGVjaWZ5aW5nCi0gICAgICB0aGUgYm9vdHN0cmFwIGNsYXNzcGF0aCkuCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c291cmNlcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBzb3VyY2VwYXRoIHRvIHVzZS4gIFRvIHN1cHByZXNzIHRoZSA8Y29kZT5zb3VyY2VwYXRoPC9jb2RlPiBzd2l0Y2gsCisgICAgICB1c2UgPHZhcj5zb3VyY2VwYXRoPC92YXI+PTxxPjwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDx2YXI+c3JjZGlyPC92YXI+IHVubGVzcyBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZQorICAgICAgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCi0gICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmJvb3RjbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5Mb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMuIChTZWUgPGEgaHJlZj0iI2Jvb3RzdHJhcCI+YmVsb3c8L2E+IGZvciB1c2luZworICAgICAgdGhlIDxrYmQ+LVg8L2tiZD4gYW5kIDxrYmQ+LUotWDwva2JkPiBwYXJhbWV0ZXJzIGZvciBzcGVjaWZ5aW5nIHRoZSBib290c3RyYXAKKyAgICAgIGNsYXNzcGF0aCkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2VwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzb3VyY2VwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYQotICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZD5UaGUgPHZhcj5jbGFzc3BhdGg8L3Zhcj4gdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgorICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vdGNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMsIGdpdmVuIGFzIGEKLSAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c291cmNlcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSA8dmFyPnNvdXJjZXBhdGg8L3Zhcj4gdG8gdXNlLCBnaXZlbiBhcworICAgICAgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9ucy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ib290Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIDx2YXI+Ym9vdHN0cmFwY2xhc3NwYXRoPC92YXI+IHRvIHVzZSwgZ2l2ZW4gYXMKKyAgICAgIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVuY29kaW5nIG9mIHNvdXJjZSBmaWxlcy4gKE5vdGU6IGdjaiBkb2Vzbid0IHN1cHBvcnQKLSAgICAgIHRoaXMgb3B0aW9uIHlldC4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXh0ZGlyczwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bm93YXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHRoZSA8Y29kZT4tbm93YXJuPC9jb2RlPiBzd2l0Y2gKLSAgICAgIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+RW5jb2Rpbmcgb2Ygc291cmNlIGZpbGVzLiAoPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiA8Y29kZT5nY2o8L2NvZGU+IGRvZXNuJ3Qgc3VwcG9ydCB0aGlzCisgICAgICBvcHRpb24geWV0Lik8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aAotICAgIGRlYnVnIGluZm9ybWF0aW9uOyBkZWZhdWx0cyB0byA8Y29kZT5vZmY8L2NvZGU+LiAgSWYgc2V0IHRvCi0gICAgPGNvZGU+b2ZmPC9jb2RlPiwgPGNvZGU+LWc6bm9uZTwvY29kZT4gd2lsbCBiZSBwYXNzZWQgb24gdGhlCi0gICAgY29tbWFuZCBsaW5lIGZvciBjb21waWxlcnMgdGhhdCBzdXBwb3J0IGl0IChmb3Igb3RoZXIgY29tcGlsZXJzLCBubwotICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aWxsIGJlIHVzZWQpLiAgSWYgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LAotICAgIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ZGVidWdsZXZlbDwvY29kZT4gYXR0cmlidXRlIGRldGVybWluZXMgdGhlCi0gICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm5vd2FybjwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHRoZSA8a2JkPi1ub3dhcm48L2tiZD4gc3dpdGNoIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5vZmY8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdsZXZlbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxjb2RlPi1nPC9jb2RlPgotICAgICAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoaXMgd2lsbCBiZSBpZ25vcmVkIGJ5IGFsbCBpbXBsZW1lbnRhdGlvbnMgZXhjZXB0Ci0gICAgICA8Y29kZT5tb2Rlcm48L2NvZGU+LCA8Y29kZT5jbGFzc2ljKHZlciAmZ3Q7PSAxLjIpPC9jb2RlPiBhbmQgPGNvZGU+amlrZXM8L2NvZGU+LgotICAgICAgTGVnYWwgdmFsdWVzIGFyZSA8Y29kZT5ub25lPC9jb2RlPiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZQotICAgICAgZm9sbG93aW5nIGtleXdvcmRzOgotICAgICAgPGNvZGU+bGluZXM8L2NvZGU+LCA8Y29kZT52YXJzPC9jb2RlPiwgYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4uCi0gICAgICBJZiA8Y29kZT5kZWJ1Z2xldmVsPC9jb2RlPiBpcyBub3Qgc3BlY2lmaWVkLCBieSBkZWZhdWx0LAotICAgICAgbm90aGluZyB3aWxsIGJlCi0gICAgICBhcHBlbmRlZCB0byA8Y29kZT4tZzwvY29kZT4uICBJZiA8Y29kZT5kZWJ1ZzwvY29kZT4gaXMgbm90IHR1cm5lZCBvbiwKLSAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5kZWJ1ZzwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbi4gIElmIHNldAorICAgICAgdG8gPHE+b2ZmPC9xPiwgPGtiZD4tZzpub25lPC9rYmQ+IHdpbGwgYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIGNvbXBpbGVycyB0aGF0CisgICAgICBzdXBwb3J0IGl0IChmb3Igb3RoZXIgY29tcGlsZXJzLCBubyBjb21tYW5kIGxpbmUgYXJndW1lbnQgd2lsbCBiZSB1c2VkKS4gIElmIHNldAorICAgICAgdG8gPHE+dHJ1ZTwvcT4sIHRoZSB2YWx1ZSBvZiB0aGUgPHZhcj5kZWJ1Z2xldmVsPC92YXI+IGF0dHJpYnV0ZSBkZXRlcm1pbmVzIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgIGFyZ3VtZW50LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5vZmY8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW1pemU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBJbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGgKLSAgICAgIG9wdGltaXphdGlvbjsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPi4gPHN0cm9uZz5Ob3RlPC9zdHJvbmc+Ci0gICAgICB0aGF0IHRoaXMgZmxhZyBpcyBqdXN0IGlnbm9yZWQgYnkgU3VuJ3MgPGNvZGU+amF2YWM8L2NvZGU+IHN0YXJ0aW5nCi0gICAgICB3aXRoIEpESyAxLjMgKHNpbmNlIGNvbXBpbGUtdGltZSBvcHRpbWl6YXRpb24gaXMgdW5uZWNlc3NhcnkpLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRlYnVnbGV2ZWw8L3RkPgorICAgIDx0ZD5LZXl3b3JkIGxpc3QgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIDxrYmQ+LWc8L2tiZD4gY29tbWFuZC1saW5lIHN3aXRjaC4gTGVnYWwgdmFsdWVzCisgICAgICBhcmUgPHE+bm9uZTwvcT4gb3IgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nCisgICAgICBrZXl3b3JkczogPHE+bGluZXM8L3E+LCA8cT52YXJzPC9xPiwgYW5kIDxxPnNvdXJjZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGlnbm9yZWQgd2hlbiA8dmFyPmRlYnVnPC92YXI+IGlzIDxxPmZhbHNlPC9xPiBvciBhbnkgaW1wbGVtZW50YXRpb24gb3RoZXIKKyAgICAgIHRoYW4gPHE+bW9kZXJuPC9xPiwgPHE+amF2YWMxLjI8L3E+IGFuZCA8cT5qaWtlczwvcT47IGJ5IGRlZmF1bHQsIG5vdGhpbmcgd2lsbCBiZSBhcHBlbmRlZAorICAgICAgdG8gPGtiZD4tZzwva2JkPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcHJlY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aAotICAgICAgZGVwcmVjYXRpb24gaW5mb3JtYXRpb247IGRlZmF1bHRzIHRvIDxjb2RlPm9mZjwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3B0aW1pemU8L3RkPgorICAgIDx0ZD5JbmRpY2F0ZXMgd2hldGhlciBzb3VyY2Ugc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9uLiA8c3Ryb25nPk5vdGU8L3N0cm9uZz4gdGhhdAorICAgICAgdGhpcyBmbGFnIGlzIGp1c3QgaWdub3JlZCBieSBTdW4ncyA8a2JkPmphdmFjPC9rYmQ+IHNpbmNlIEpESyAxLjMgKGJlY2F1c2UgY29tcGlsZS10aW1lCisgICAgICBvcHRpbWl6YXRpb24gaXMgdW5uZWNlc3NhcnkpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5vZmY8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkdlbmVyYXRlIGNsYXNzIGZpbGVzIGZvciBzcGVjaWZpYyBWTSB2ZXJzaW9uCi0gICAgKGUuZy4sIDxjb2RlPjEuMTwvY29kZT4gb3IgPGNvZGU+MS4yPC9jb2RlPikuIDxiPk5vdGUgdGhhdCB0aGUKLSAgICBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gdGhlIEpWTSB0aGF0IGlzIHJ1bm5pbmcgQW50LiAgSW4KLSAgICBwYXJ0aWN1bGFyLCBpZiB5b3UgdXNlIEpESyAxLjQrIHRoZSBnZW5lcmF0ZWQgY2xhc3NlcyB3aWxsIG5vdCBiZQotICAgIHVzYWJsZSBmb3IgYSAxLjEgSmF2YSBWTSB1bmxlc3MgeW91IGV4cGxpY2l0bHkgc2V0IHRoaXMgYXR0cmlidXRlCi0gICAgdG8gdGhlIHZhbHVlIDEuMSAod2hpY2ggaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIEpESyAxLjEgdG8KLSAgICAxLjMpLiAgV2UgaGlnaGx5IHJlY29tbWVuZCB0byBhbHdheXMgc3BlY2lmeSB0aGlzCi0gICAgYXR0cmlidXRlLjwvYj48YnI+Ci0gICAgQSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSBjYW4gYmUgcHJvdmlkZWQgdXNpbmcgdGhlIG1hZ2ljCi0gICAgPGEKLSAgICBocmVmPSIuLi9qYXZhY3Byb3BzLmh0bWwjdGFyZ2V0Ij48Y29kZT5hbnQuYnVpbGQuamF2YWMudGFyZ2V0PC9jb2RlPjwvYT4KLSAgICBwcm9wZXJ0eS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5kZXByZWNhdGlvbjwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHNvdXJjZSBzaG91bGQgYmUgY29tcGlsZWQgd2l0aCBkZXByZWNhdGlvbiBpbmZvcm1hdGlvbi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPGNvZGU+b2ZmPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QXNrcyB0aGUgY29tcGlsZXIgZm9yIHZlcmJvc2Ugb3V0cHV0OyBkZWZhdWx0cyB0bwotICAgICAgPGNvZGU+bm88L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5Bc2tzIHRoZSBjb21waWxlciBmb3IgdmVyYm9zZSBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZDwvdGQ+IDx0ZCB2YWxpZ249InRvcCI+RW5hYmxlcyBkZXBlbmRlbmN5LXRyYWNraW5nCi0gICAgICBmb3IgY29tcGlsZXJzIHRoYXQgc3VwcG9ydCB0aGlzICg8Y29kZT5qaWtlczwvY29kZT4gYW5kCi0gICAgICA8Y29kZT5jbGFzc2ljPC9jb2RlPikuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZGVwZW5kPC90ZD4KKyAgICA8dGQ+RW5hYmxlcyBkZXBlbmRlbmN5IHRyYWNraW5nIGZvciBjb21waWxlcnMgdGhhdCBzdXBwb3J0IHRoaXMgKDxxPmppa2VzPC9xPgorICAgICAgYW5kIDxxPmNsYXNzaWM8L3E+KS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVBbnRSdW50aW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllcyBpbiB0aGUKLSAgICAgIGNsYXNzcGF0aDsgZGVmYXVsdHMgdG8gPGNvZGU+eWVzPC9jb2RlPiwgdW5sZXNzCi0gICAgICA8YSBocmVmPSIuLi9zeXNjbGFzc3BhdGguaHRtbCI+PGNvZGU+YnVpbGQuc3lzY2xhc3NwYXRoPC9jb2RlPjwvYT4gaXMgc2V0LgotICAgICAgPGVtPkl0IGlzIHVzdWFsbHkgYmVzdCB0byBzZXQgdGhpcyB0byBmYWxzZTwvZW0+IHNvIHRoZSBzY3JpcHQncyBiZWhhdmlvciBpcyBub3QKLSAgICAgIHNlbnNpdGl2ZSB0byB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggaXQgaXMgcnVuLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVBbnRSdW50aW1lPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBpbmNsdWRlIHRoZSBBbnQgcnVuLXRpbWUgbGlicmFyaWVzIGluIHRoZSBjbGFzc3BhdGguIDxlbT5JdCBpcyB1c3VhbGx5IGJlc3Q8L2VtPgorICAgICAgdG8gc2V0IHRoaXMgdG8gPHE+ZmFsc2U8L3E+IHNvIHRoZSBzY3JpcHQncyBiZWhhdmlvciBpcyBub3Qgc2Vuc2l0aXZlIHRvIHRoZSBlbnZpcm9ubWVudCBpbgorICAgICAgd2hpY2ggaXQgaXMgcnVuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+LAorICAgICAgdW5sZXNzIDxhIGhyZWY9Ii4uL3N5c2NsYXNzcGF0aC5odG1sIj48Y29kZT5idWlsZC5zeXNjbGFzc3BhdGg8L2NvZGU+PC9hPiBwcm9wZXJ0eSBpcyBzZXQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlSmF2YVJ1bnRpbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lCi0gICAgICBsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNIGluIHRoZSBjbGFzc3BhdGg7Ci0gICAgICBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPGJyLz4KLSAgICAgIDxiPk5vdGU6PC9iPiBJbiBzb21lIHNldHVwcyB0aGUgcnVuLXRpbWUgbGlicmFyaWVzIG1heSBiZSBwYXJ0Ci0gICAgICBvZiB0aGUgIkFudCBydW4tdGltZSBsaWJyYXJpZXMiIHNvIHlvdSBtYXkgbmVlZCB0byBleHBsaWNpdGx5Ci0gICAgICBzZXQgaW5jbHVkZUFudFJ1bnRpbWUgdG8gZmFsc2UgdG8gZW5zdXJlIHRoYXQgdGhlIEphdmEKLSAgICAgIHJ1bi10aW1lIGxpYnJhcmllcyBhcmUgbm90IGluY2x1ZGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gaW5jbHVkZSB0aGUgZGVmYXVsdCBydW4tdGltZSBsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIEpWTSBpbiB0aGUKKyAgICAgIGNsYXNzcGF0aC48YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogSW4gc29tZSBzZXR1cHMgdGhlIHJ1bi10aW1lIGxpYnJhcmllcyBtYXkgYmUgcGFydCBvZiB0aGUKKyAgICAgICJBbnQgcnVuLXRpbWUgbGlicmFyaWVzIiBzbyB5b3UgbWF5IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgPHZhcj5pbmNsdWRlQW50UnVudGltZTwvdmFyPgorICAgICAgdG8gPHE+ZmFsc2U8L3E+IHRvIGVuc3VyZSB0aGF0IHRoZSBKYXZhIHJ1bi10aW1lIGxpYnJhcmllcyBhcmUgbm90IGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZXhlY3V0ZSA8Y29kZT5qYXZhYzwvY29kZT4gdXNpbmcgdGhlCi0gICAgICBKREsgY29tcGlsZXIgZXh0ZXJuYWxseTsgZGVmYXVsdHMgdG8gPGNvZGU+bm88L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmZvcms8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGV4ZWN1dGUgPGNvZGU+amF2YWM8L2NvZGU+IHVzaW5nIHRoZSBKREsgY29tcGlsZXIgZXh0ZXJuYWxseS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5qYXZhYzwvY29kZT4KLSAgICAgIGV4ZWN1dGFibGUgdG8gdXNlIGluIGNhc2Ugb2YgPGNvZGU+Zm9yaz0mcXVvdDt5ZXMmcXVvdDs8L2NvZGU+LgotICAgICAgRGVmYXVsdHMgdG8gdGhlIGNvbXBpbGVyIG9mIHRoZSBKYXZhIHZlcnNpb24gdGhhdCBpcyBjdXJyZW50bHkKLSAgICAgIHJ1bm5pbmcgQW50LiAgSWdub3JlZCBpZiA8Y29kZT5mb3JrPSZxdW90O25vJnF1b3Q7PC9jb2RlPi48YnI+Ci0gICAgICBTaW5jZSBBbnQgMS42IHRoaXMgYXR0cmlidXRlIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUKLSAgICAgIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUgd2hlbiB1c2luZyBqaWtlcywganZjLCBnY2ogb3Igc2ouPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPkNvbXBsZXRlIHBhdGggdG8gdGhlIDxrYmQ+amF2YWM8L2tiZD4gZXhlY3V0YWJsZSB0byB1c2UgaW4gY2FzZSBvZiA8dmFyPmZvcms8L3Zhcj4KKyAgICAgIGlzIDxxPnllczwvcT4uPGJyLz48ZW0+U2luY2UgQW50IDEuNjwvZW0+IHRoaXMgYXR0cmlidXRlIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aAorICAgICAgdG8gdGhlIGV4ZWN1dGFibGUgd2hlbiB1c2luZyA8cT5qaWtlczwvcT4sIDxxPmp2YzwvcT4sIDxxPmdjajwvcT4gb3IgPHE+c2o8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB0aGUgY29tcGlsZXIgb2YgY3VycmVudCBKREssIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1lbW9yeUluaXRpYWxTaXplPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgVk0sCi0gICAgICBpZiA8Y29kZT5qYXZhYzwvY29kZT4gaXMgcnVuIGV4dGVybmFsbHk7IGlnbm9yZWQgb3RoZXJ3aXNlLiBEZWZhdWx0cwotICAgICAgdG8gdGhlIHN0YW5kYXJkIFZNIG1lbW9yeSBzZXR0aW5nLgotICAgICAgKEV4YW1wbGVzOiA8Y29kZT44Mzg4NjA4MDwvY29kZT4sIDxjb2RlPjgxOTIwazwvY29kZT4sIG9yCi0gICAgICA8Y29kZT44MG08L2NvZGU+KTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1lbW9yeUluaXRpYWxTaXplPC90ZD4KKyAgICA8dGQ+VGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciB0aGUgdW5kZXJseWluZyBKVk0sIGlmIDxrYmQ+amF2YWM8L2tiZD4gaXMgcnVuCisgICAgICBleHRlcm5hbGx5LiAgKEV4YW1wbGVzOiA8cT44Mzg4NjA4MDwvcT4sIDxxPjgxOTIwazwvcT4sIG9yIDxxPjgwbTwvcT4pPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCBKVk0gbWVtb3J5IHNldHRpbmcsIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+CisgICAgICBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tZW1vcnlNYXhpbXVtU2l6ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWF4aW11bSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHRoZSB1bmRlcmx5aW5nIFZNLAotICAgICAgaWYgPGNvZGU+amF2YWM8L2NvZGU+IGlzIHJ1biBleHRlcm5hbGx5OyBpZ25vcmVkIG90aGVyd2lzZS4gRGVmYXVsdHMKLSAgICAgIHRvIHRoZSBzdGFuZGFyZCBWTSBtZW1vcnkgc2V0dGluZy4KLSAgICAgIChFeGFtcGxlczogPGNvZGU+ODM4ODYwODA8L2NvZGU+LCA8Y29kZT44MTkyMGs8L2NvZGU+LCBvcgotICAgICAgPGNvZGU+ODBtPC9jb2RlPik8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5tZW1vcnlNYXhpbXVtU2l6ZTwvdGQ+CisgICAgPHRkPlRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lbW9yeSBmb3IgdGhlIHVuZGVybHlpbmcgSlZNLCBpZiA8a2JkPmphdmFjPC9rYmQ+IGlzIHJ1bgorICAgICAgZXh0ZXJuYWxseTsgaWdub3JlZCBvdGhlcndpc2UuICAoRXhhbXBsZXM6IDxxPjgzODg2MDgwPC9xPiwgPHE+ODE5MjBrPC9xPiwgb3IgPHE+ODBtPC9xPik8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIHN0YW5kYXJkIEpWTSBtZW1vcnkgc2V0dGluZywgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4KKyAgICAgIGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGNvbXBpbGF0aW9uIGVycm9ycwotICAgICAgICB3aWxsIGZhaWwgdGhlIGJ1aWxkOyBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIGNvbXBpbGF0aW9uIGVycm9ycyB3aWxsIGZhaWwgdGhlIGJ1aWxkPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvclByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIHByb3BlcnR5IHRvIHNldCAodG8gdGhlIHZhbHVlICJ0cnVlIikgaWYgY29tcGlsYXRpb24gZmFpbHMuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3JQcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBwcm9wZXJ0eSB0byBzZXQgdG8gPHE+dHJ1ZTwvcT4gaWYgY29tcGlsYXRpb24gZmFpbHMuICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2U8L3RkPgotCi0gICAgPHRkIHZhbGlnbj0idG9wIj5WYWx1ZSBvZiB0aGUgPGNvZGU+LXNvdXJjZTwvY29kZT4gY29tbWFuZC1saW5lCi0gICAgc3dpdGNoOyB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBwcmlvciB0bwotICAgIDxjb2RlPmphdmFjMS40PC9jb2RlPiAob3IgPGNvZGU+bW9kZXJuPC9jb2RlPiB3aGVuIEFudCBpcyBub3QKLSAgICBydW5uaW5nIGluIGEgMS4zIFZNKSwgPGNvZGU+Z2NqPC9jb2RlPiBhbmQgPGNvZGU+amlrZXM8L2NvZGU+Ljxicj4KLSAgICBJZiB5b3UgdXNlIHRoaXMgYXR0cmlidXRlIHRvZ2V0aGVyIHdpdGggPGNvZGU+Z2NqPC9jb2RlPgotICAgIG9yIDxjb2RlPmppa2VzPC9jb2RlPiwgeW91IG11c3QgbWFrZSBzdXJlIHRoYXQgeW91ciB2ZXJzaW9uCi0gICAgc3VwcG9ydHMgdGhlIDxjb2RlPi1zb3VyY2U8L2NvZGU+IChvciA8Y29kZT4tZnNvdXJjZTwvY29kZT4gZm9yCi0gICAgZ2NqKQotICAgIHN3aXRjaC4gIEJ5IGRlZmF1bHQsIG5vIDxjb2RlPi1zb3VyY2U8L2NvZGU+IGFyZ3VtZW50IHdpbGwgYmUgdXNlZAotICAgIGF0IGFsbC48YnI+Ci0gICAgPGI+Tm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gdGhlIEpWTSB0aGF0IGlzIHJ1bm5pbmcKLSAgICBBbnQuICBXZSBoaWdobHkgcmVjb21tZW5kIHRvIGFsd2F5cyBzcGVjaWZ5IHRoaXMKLSAgICBhdHRyaWJ1dGUuPC9iPjxicj4KLSAgICBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBwcm92aWRlZCB1c2luZyB0aGUgbWFnaWMKLSAgICA8YQotICAgIGhyZWY9Ii4uL2phdmFjcHJvcHMuaHRtbCNzb3VyY2UiPjxjb2RlPmFudC5idWlsZC5qYXZhYy5zb3VyY2U8L2NvZGU+PC9hPgotICAgIHByb3BlcnR5LjwvdGQ+Ci0KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c291cmNlPC90ZD4KKyAgICA8dGQ+SmF2YSBsYW5ndWFnZSBmZWF0dXJlcyBhY2NlcHRlZCBieSBjb21waWxlciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSA8a2JkPi1zb3VyY2U8L2tiZD4KKyAgICAgIGNvbW1hbmQtbGluZSBzd2l0Y2guICBWYWxpZCBmZWF0dXJlIHZlcnNpb25zIGFyZSA8cT4xLjM8L3E+LCA8cT4xLjQ8L3E+LCA8cT4xLjU8L3E+CisgICAgICBvciA8cT41PC9xPiwgZXRjLiAgVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucyBwcmlvcgorICAgICAgdG8gPHE+amF2YWMxLjQ8L3E+IChvciA8cT5tb2Rlcm48L3E+IHdoZW4gQW50IGlzIG5vdCBydW5uaW5nIGluIGEgSlZNIDEuMyksIDxxPmdjajwvcT4KKyAgICAgIGFuZCA8cT5qaWtlczwvcT4uPGJyLz4gIElmIHlvdSB1c2UgdGhpcyBhdHRyaWJ1dGUgdG9nZXRoZXIgd2l0aCA8cT5nY2o8L3E+IG9yIDxxPmppa2VzPC9xPiwgeW91CisgICAgICBtdXN0IG1ha2Ugc3VyZSB0aGF0IHlvdXIgdmVyc2lvbiBzdXBwb3J0cyB0aGUgPGtiZD4tc291cmNlPC9rYmQ+IChvciA8a2JkPi1mc291cmNlPC9rYmQ+CisgICAgICBmb3IgPGtiZD5nY2o8L2tiZD4pIHN3aXRjaC48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgbm8gPGtiZD4tc291cmNlPC9rYmQ+IGFyZ3VtZW50IHdpbGwgYmUgdXNlZCBhdCBhbGwgdW5sZXNzIHRoZSBtYWdpYworICAgICAgPGEgaHJlZj0iLi4vamF2YWNwcm9wcy5odG1sI3NvdXJjZSI+PGNvZGU+YW50LmJ1aWxkLmphdmFjLnNvdXJjZTwvY29kZT48L2E+IHByb3BlcnR5IGlzCisgICAgICBzZXQ8YnIvPjxzdHJvbmc+Tm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gSkRLIHRoYXQgaXMgcnVubmluZyBBbnQuICBXZSBoaWdobHkKKyAgICAgIHJlY29tbWVuZCB0byBhbHdheXMgc3BlY2lmeSB0aGlzIGF0dHJpYnV0ZS48L3N0cm9uZz48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLgotICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCwgdGhlIHZhbHVlIG9mIHRoZQotICAgICAgPGNvZGU+YnVpbGQuY29tcGlsZXI8L2NvZGU+IHByb3BlcnR5LCBpZiBzZXQsIHdpbGwgYmUgdXNlZC4KLSAgICAgIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IFZNIHdpbGwgYmUgdXNlZC4KLSAgICAgIChTZWUgdGhlIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQKLSAgICAgIGNvbXBpbGVycy4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dGFyZ2V0PC90ZD4KKyAgICA8dGQ+R2VuZXJhdGUgY2xhc3MgZmlsZXMgZm9yIHNwZWNpZmljIEpWTSB2ZXJzaW9uIChjcm9zcy1jb21waWxlKS48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgbm8gPGtiZD4tdGFyZ2V0PC9rYmQ+IGFyZ3VtZW50IHdpbGwgYmUgdXNlZCBhdCBhbGwgdW5sZXNzIHRoZQorICAgICAgbWFnaWMgPGEgaHJlZj0iLi4vamF2YWNwcm9wcy5odG1sI3RhcmdldCI+PGNvZGU+YW50LmJ1aWxkLmphdmFjLnRhcmdldDwvY29kZT48L2E+IHByb3BlcnR5IGlzCisgICAgICBzZXQ8YnIvPjxzdHJvbmc+Tm90ZSB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlIGRlcGVuZHMgb24gSkRLIHRoYXQgaXMgcnVubmluZyBBbnQgYW5kCisgICAgICBvbiA8dmFyPnNvdXJjZTwvdmFyPgorICAgICAgKHNlZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy90b29scy93aW5kb3dzL2phdmFjLmh0bWwjQkhDSkRDSUQiCisgICAgICB0YXJnZXQ9Il90b3AiPkNyb3NzLUNvbXBpbGF0aW9uIE9wdGlvbnM8L2E+KS4gIFdlIGhpZ2hseSByZWNvbW1lbmQgdG8gYWx3YXlzIHNwZWNpZnkgdGhpcworICAgICAgYXR0cmlidXRlLjwvc3Ryb25nPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxpc3RmaWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgc291cmNlIGZpbGVzIHRvIGJlIGNvbXBpbGVkIHdpbGwKLSAgICAgIGJlIGxpc3RlZDsgZGVmYXVsdHMgdG8gPGNvZGU+bm88L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNvbXBpbGVyPC90ZD4KKyAgICA8dGQ+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIFNlZSB0aGUgYWJvdmUgPGEgaHJlZj0iI2NvbXBpbGVydmFsdWVzIj5saXN0PC9hPiBvZgorICAgICAgdmFsaWQgY29tcGlsZXJzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPiBwcm9wZXJ0eSwgaWYgc2V0LCBvciBkZWZhdWx0CisgICAgICBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgSkRLIG90aGVyd2lzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRlbXBkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlcmUgQW50IHNob3VsZCBwbGFjZSB0ZW1wb3JhcnkgZmlsZXMuCi0gICAgICBUaGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgdGFzayBpcyBmb3JrZWQgYW5kIHRoZQotICAgICAgY29tbWFuZCBsaW5lIGFyZ3MgbGVuZ3RoIGV4Y2VlZHMgNGsuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4KLSAgICAgIE5vOyBkZWZhdWx0IGlzIDxpPmphdmEuaW8udG1wZGlyPC9pPi4KLSAgICA8L3RkPgorICAgIDx0ZD5saXN0ZmlsZXM8L3RkPgorICAgIDx0ZD5JbmRpY2F0ZXMgd2hldGhlciB0aGUgc291cmNlIGZpbGVzIHRvIGJlIGNvbXBpbGVkIHdpbGwgYmUgbGlzdGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cGRhdGVkUHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgcHJvcGVydHkgdG8gc2V0ICh0byB0aGUgdmFsdWUgInRydWUiKSAKLSAgICAgIGlmIGNvbXBpbGF0aW9uIGhhcyB0YWtlbiBwbGFjZQotICAgICAgYW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWwuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dGVtcGRpcjwvdGQ+CisgICAgPHRkPldoZXJlIEFudCBzaG91bGQgcGxhY2UgdGVtcG9yYXJ5IGZpbGVzLiAgVGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIHRhc2sgaXMgZm9ya2VkIGFuZCB0aGUKKyAgICAgIGNvbW1hbmQgbGluZSBhcmdzIGxlbmd0aCBleGNlZWRzIDQga0IuICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxjb2RlPmphdmEuaW8udG1wZGlyPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVEZXN0Q2xhc3NlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoaXMgYXR0cmlidXRlIGNvbnRyb2xzIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUKLSAgICAgIGRlc3RpbmF0aW9uIGNsYXNzZXMgZGlyZWN0b3J5IGluIHRoZSBjbGFzc3BhdGgKLSAgICAgIGdpdmVuIHRvIHRoZSBjb21waWxlci4KLSAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgaXMgInRydWUiIGFuZCB0aGlzCi0gICAgICBtZWFucyB0aGF0IHByZXZpb3VzbHkgY29tcGlsZWQgY2xhc3NlcyBhcmUgb24KLSAgICAgIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBjb21waWxlci4gVGhpcyBtZWFucyB0aGF0ICJncmVlZHkiIGNvbXBpbGVycwotICAgICAgd2lsbCBub3QgcmVjb21waWxlIGRlcGVuZGVudCBjbGFzc2VzIHRoYXQgYXJlIGFscmVhZHkgY29tcGlsZWQuCi0gICAgICBJbiBnZW5lcmFsIHRoaXMgaXMgYSBnb29kIHRoaW5nIGFzIGl0IHN0b3BzIHRoZSBjb21waWxlcgotICAgICAgZm9yIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmsuIEhvd2V2ZXIsIGZvciBzb21lIGVkZ2UgY2FzZXMsCi0gICAgICBpbnZvbHZpbmcgZ2VuZXJpY3MsIHRoZSBqYXZhYyBjb21waWxlcgotICAgICAgbmVlZHMgdG8gY29tcGlsZSB0aGUgZGVwZW5kZW50IGNsYXNzZXMgdG8gZ2V0IHRoZSBnZW5lcmljcwotICAgICAgaW5mb3JtYXRpb24uIE9uZSBleGFtcGxlIGlzIGRvY3VtZW50ZWQgaW4gdGhlIGJ1ZyByZXBvcnQ6Ci0gICAgICA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQwNzc2Ij4KLSAgICAgICAgQnVnIDQwNzc2IC0gYSBwcm9ibGVtIGNvbXBpbGluZyBhIEphdmEgNSBwcm9qZWN0IHdpdGggZ2VuZXJpY3M8L2E+LgotICAgICAgU2V0dGluZyB0aGUgYXR0cmlidXRlIHRvICJmYWxzZSIgd2lsbCBjYXVzZSB0aGUgY29tcGlsZXIKLSAgICAgIHRvIHJlY29tcGlsZSBkZXBlbmRlbnQgY2xhc3Nlcy4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPi4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gLSBkZWZhdWx0IGlzICJ0cnVlIjwvdGQ+CisgICAgPHRkPnVwZGF0ZWRQcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBwcm9wZXJ0eSB0byBzZXQgdG8gPHE+dHJ1ZTwvcT4gaWYgY29tcGlsYXRpb24gaGFzIHRha2VuIHBsYWNlIGFuZCBoYXMgYmVlbgorICAgICAgc3VjY2Vzc2Z1bC4gIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNyZWF0ZU1pc3NpbmdQYWNrYWdlSW5mb0NsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU29tZSBwYWNrYWdlIGxldmVsIGFubm90YXRpb25zIGluIDxjb2RlPnBhY2thZ2UtaW5mby5qYXZhPC9jb2RlPgotICAgICAgZmlsZXMgZG9uJ3QgY3JlYXRlIGFueSA8Y29kZT5wYWNrYWdlLWluZm8uY2xhc3M8L2NvZGU+IGZpbGVzIHNvCi0gICAgICBBbnQgd291bGQgcmVjb21waWxlIHRoZSBzYW1lIGZpbGUgZXZlcnkgdGltZS48YnIvPgotICAgICAgU3RhcnRpbmcgd2l0aCBBbnQgMS44IEFudCB3aWxsIGNyZWF0ZSBhbgotICAgICAgZW1wdHkgPGNvZGU+cGFja2FnZS1pbmZvLmNsYXNzPC9jb2RlPiBmb3IKLSAgICAgIGVhY2ggPGNvZGU+cGFja2FnZS1pbmZvLmphdmE8L2NvZGU+IGlmIHRoZXJlIGlzbid0IG9uZSBjcmVhdGVkCi0gICAgICBieSB0aGUgY29tcGlsZXIuPGJyLz4KLSAgICAgIEluIHNvbWUgc2V0dXBzIHRoaXMgYWRkaXRpb25hbCBjbGFzcyBjYXVzZXMgcHJvYmxlbXMgYW5kIGl0IGNhbgotICAgICAgYmUgc3VwcHJlc3NlZCBieSBzZXR0aW5nIHRoaXMgYXR0cmlidXRlIHRvICJmYWxzZSIuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4zPC9lbT4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIC0gZGVmYXVsdCBpcyAidHJ1ZSI8L3RkPgorICAgIDx0ZD5pbmNsdWRlRGVzdENsYXNzZXM8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIGRlc3RpbmF0aW9uIGNsYXNzZXMgZGlyZWN0b3J5IGluIHRoZQorICAgICAgY2xhc3NwYXRoIGdpdmVuIHRvIHRoZSBjb21waWxlci4gIElmIHNldCB0byA8cT50cnVlPC9xPiAoZGVmYXVsdCksIHByZXZpb3VzbHkgY29tcGlsZWQgY2xhc3NlcworICAgICAgYXJlIG9uIHRoZSBjbGFzc3BhdGggZm9yIHRoZSBjb21waWxlci4gVGhpcyBtZWFucyB0aGF0ICJncmVlZHkiIGNvbXBpbGVycyB3aWxsIG5vdCByZWNvbXBpbGUKKyAgICAgIGRlcGVuZGVudCBjbGFzc2VzIHRoYXQgYXJlIGFscmVhZHkgY29tcGlsZWQuICBJbiBnZW5lcmFsIHRoaXMgaXMgYSBnb29kIHRoaW5nIGFzIGl0IHN0b3BzIHRoZQorICAgICAgY29tcGlsZXIgZm9yIGRvaW5nIHVubmVjZXNzYXJ5IHdvcmsuIEhvd2V2ZXIsIGZvciBzb21lIGVkZ2UgY2FzZXMsIGludm9sdmluZyBnZW5lcmljcywKKyAgICAgIHRoZSA8a2JkPmphdmFjPC9rYmQ+IGNvbXBpbGVyIG5lZWRzIHRvIGNvbXBpbGUgdGhlIGRlcGVuZGVudCBjbGFzc2VzIHRvIGdldCB0aGUgZ2VuZXJpY3MKKyAgICAgIGluZm9ybWF0aW9uLiBPbmUgZXhhbXBsZSBpcyBkb2N1bWVudGVkIGluIHRoZSBidWcKKyAgICAgIHJlcG9ydDogPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDA3NzYiIHRhcmdldD0iX3RvcCI+QnVnCisgICAgICA0MDc3NiAtIGEgcHJvYmxlbSBjb21waWxpbmcgYSBKYXZhIDUgcHJvamVjdCB3aXRoIGdlbmVyaWNzPC9hPi4gIFNldHRpbmcgdGhlIGF0dHJpYnV0ZQorICAgICAgdG8gPHE+ZmFsc2U8L3E+IHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIHJlY29tcGlsZSBkZXBlbmRlbnQgY2xhc3Nlcy4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuNy4xPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2R1bGVwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU3BlY2lmeSB3aGVyZSB0byBmaW5kIGFwcGxpY2F0aW9uIG1vZHVsZXMuIEEgbGlzdCBvZiBkaXJlY3RvcmllcyBvZiBtb2R1bGVzLCBtb2R1bGUgZmlsZXMgb3IgZXhwbG9kZWQgbW9kdWxlcy4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNyZWF0ZU1pc3NpbmdQYWNrYWdlSW5mb0NsYXNzPC90ZD4KKyAgICA8dGQ+U29tZSBwYWNrYWdlIGxldmVsIGFubm90YXRpb25zIGluIDxzYW1wPnBhY2thZ2UtaW5mby5qYXZhPC9zYW1wPiBmaWxlcyBkb24ndCBjcmVhdGUKKyAgICAgIGFueSA8c2FtcD5wYWNrYWdlLWluZm8uY2xhc3M8L3NhbXA+IGZpbGVzIHNvIEFudCB3b3VsZCByZWNvbXBpbGUgdGhlIHNhbWUgZmlsZSBldmVyeQorICAgICAgdGltZS48YnIvPjxlbT5TaW5jZSBBbnQgMS44PC9lbT4sIGFuIGVtcHR5IDxzYW1wPnBhY2thZ2UtaW5mby5jbGFzczwvc2FtcD4gaXMgY3JlYXRlZCBmb3IKKyAgICAgIGVhY2ggPHNhbXA+cGFja2FnZS1pbmZvLmphdmE8L3NhbXA+IGlmIHRoZXJlIGlzbid0IG9uZSBjcmVhdGVkIGJ5IHRoZSBjb21waWxlci48YnIvPkluIHNvbWUKKyAgICAgIHNldHVwcyB0aGlzIGFkZGl0aW9uYWwgY2xhc3MgY2F1c2VzIHByb2JsZW1zIGFuZCBpdCBjYW4gYmUgc3VwcHJlc3NlZCBieSBzZXR0aW5nIHRoaXMKKyAgICAgIGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4uICA8ZW0+U2luY2UgQW50IDEuOC4zPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2R1bGVwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIG1vZHVsZXBhdGggdG8gdXNlLCBnaXZlbiBhcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bW9kdWxlcGF0aDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBhcHBsaWNhdGlvbiBtb2R1bGVzLiBBIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb2YgbW9kdWxlcywgbW9kdWxlIGZpbGVzIG9yCisgICAgZXhwbG9kZWQgbW9kdWxlcy4gIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bW9kdWxlc291cmNlcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFNwZWNpZnkgd2hlcmUgdG8gZmluZCBpbnB1dCBzb3VyY2UgZmlsZXMgZm9yIG11bHRpcGxlIG1vZHVsZSBjb21waWxhdGlvbi4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZSBvciBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBwcmVzZW50PC90ZD4KKyAgICA8dGQ+bW9kdWxlcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSA8dmFyPm1vZHVsZXBhdGg8L3Zhcj4gdG8gdXNlLCBnaXZlbiBhcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KKyAgICB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1vZHVsZXNvdXJjZXBhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgbW9kdWxlc291cmNlcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5tb2R1bGVzb3VyY2VwYXRoPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBmaW5kIGlucHV0IHNvdXJjZSBmaWxlcyBmb3IgbXVsdGlwbGUgbW9kdWxlIGNvbXBpbGF0aW9uLiAgPGVtPnNpbmNlIEFudAorICAgICAgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIDx2YXI+c3JjZGlyPC92YXI+IGF0dHJpYnV0ZSBvciBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZQorICAgICAgcHJlc2VudDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZ3JhZGVtb2R1bGVwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgbW9kdWxlcyB0aGF0IHJlcGxhY2UgdXBncmFkZWFibGUgbW9kdWxlcyBpbiB0aGUgcnVudGltZSBpbWFnZS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1vZHVsZXNvdXJjZXBhdGhyZWY8L3RkPgorICAgIDx0ZD5UaGUgPHZhcj5tb2R1bGVzb3VyY2VwYXRoPC92YXI+IHRvIHVzZSwgZ2l2ZW4KKyAgICAgIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuICA8ZW0+c2luY2UKKyAgICAgIEFudCAxLjkuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cGdyYWRlbW9kdWxlcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSB1cGdyYWRlbW9kdWxlcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD51cGdyYWRlbW9kdWxlcGF0aDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIG1vZHVsZXMgdGhhdCByZXBsYWNlIHVwZ3JhZGVhYmxlIG1vZHVsZXMgaW4gdGhlIHJ1bnRpbWUKKyAgICBpbWFnZS4gIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmF0aXZlaGVhZGVyZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU3BlY2lmeSB3aGVyZSB0byBwbGFjZSBnZW5lcmF0ZWQgbmF0aXZlIGhlYWRlciBmaWxlcy4gSWdub3JlZAotICAgICAgd2hlbiBydW5uaW5nIG9uIEpESyAmbHQ7IDguCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOS44PC9lbT4uCi0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnVwZ3JhZGVtb2R1bGVwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIDx2YXI+dXBncmFkZW1vZHVsZXBhdGg8L3Zhcj4gdG8gdXNlLCBnaXZlbgorICAgIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuICA8ZW0+c2luY2UgQW50CisgICAgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVsZWFzZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFNwZWNpZnkgdGhlIHZhbHVlIGZvciB0aGUgPGNvZGU+LS1yZWxlYXNlPC9jb2RlPiBzd2l0Y2guIElnbm9yZWQKLSAgICAgIHdoZW4gcnVubmluZyBvbiBKREsgJmx0OyA5Ljxicj4KLSAgICAgIFdoZW4gc2V0IGFuZCBydW5uaW5nIG9uIEpESyAmZ3Q7PSA5IHRoZSBzb3VyY2UgYW5kIHRhcmdldAotICAgICAgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSBib290Y2xhc3NwYXRoIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS45Ljg8L2VtPi4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bmF0aXZlaGVhZGVyZGlyPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBwbGFjZSBnZW5lcmF0ZWQgbmF0aXZlIGhlYWRlciBmaWxlcy4gIDxlbT5TaW5jZSBBbnQgMS45Ljg8L2VtPi4KKyAgICA8dGQ+Tm8sIGlnbm9yZWQgd2hlbiBydW5uaW5nIG9uIEpESyA3IG9yIGVhcmxpZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnJlbGVhc2U8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgdGhlIDxrYmQ+LS1yZWxlYXNlPC9rYmQ+IHN3aXRjaC48YnIvPldoZW4gc2V0IGFuZCBydW5uaW5nIG9uIEpESyA5KworICAgICAgdGhlIDx2YXI+c291cmNlPC92YXI+IGFuZCA8dmFyPnRhcmdldDwvdmFyPiBhdHRyaWJ1dGVzIGFzIHdlbGwgYXMgdGhlIDx2YXI+Ym9vdGNsYXNzcGF0aDwvdmFyPgorICAgICAgd2lsbCBiZSBpZ25vcmVkLiAgPGVtPlNpbmNlIEFudCAxLjkuODwvZW0+LgorICAgIDx0ZD5ObywgaWdub3JlZCB3aGVuIHJ1bm5pbmcgb24gSkRLIDggb3IgZWFybGllcjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAotc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLSg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+c3JjZGlyPC9jb2RlPikgYXMgd2VsbCBhcyB0aGUgbmVzdGVkCi08Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZAotPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci08aDQ+PGNvZGU+c3JjZGlyPC9jb2RlPiwgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiwgPGNvZGU+c291cmNlcGF0aDwvY29kZT4sCi08Y29kZT5ib290Y2xhc3NwYXRoPC9jb2RlPiwgPGNvZGU+bW9kdWxlcGF0aDwvY29kZT4sIDxjb2RlPm1vZHVsZXNvdXJjZXBhdGg8L2NvZGU+LAotPGNvZGU+dXBncmFkZW1vZHVsZXBhdGg8L2NvZGU+IGFuZCA8Y29kZT5leHRkaXJzPC9jb2RlPjwvaDQ+Ci08cD48Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPidzIDxjb2RlPnNyY2RpcjwvY29kZT4sIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4sCi08Y29kZT5zb3VyY2VwYXRoPC9jb2RlPiwgPGNvZGU+Ym9vdGNsYXNzcGF0aDwvY29kZT4sCi08Y29kZT5leHRkaXJzPC9jb2RlPiwgPGNvZGU+bW9kdWxlcGF0aDwvY29kZT4sIDxjb2RlPm1vZHVsZXNvdXJjZXBhdGg8L2NvZGU+LAotYW5kIDxjb2RlPnVwZ3JhZGVtb2R1bGVwYXRoPC9jb2RlPiBhdHRyaWJ1dGVzIGFyZQotPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlczwvYT4KLWFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIG5lc3RlZAotPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IChub3RlIHRoZSBkaWZmZXJlbnQgbmFtZSEpLAotPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LAotPGNvZGU+Jmx0O3NvdXJjZXBhdGgmZ3Q7PC9jb2RlPiwKLTxjb2RlPiZsdDtib290Y2xhc3NwYXRoJmd0OzwvY29kZT4sCi08Y29kZT4mbHQ7ZXh0ZGlycyZndDs8L2NvZGU+LAotPGNvZGU+Jmx0O21vZHVsZXBhdGgmZ3Q7PC9jb2RlPiwKLTxjb2RlPiZsdDttb2R1bGVzb3VyY2VwYXRoJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7dXBncmFkZW1vZHVsZXBhdGgmZ3Q7PC9jb2RlPgotZWxlbWVudHMsIHJlc3BlY3RpdmVseS48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQgc3VwcG9ydHMgbW9zdAorYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8dmFyPmRpcjwvdmFyPiBiZWNvbWVzIDx2YXI+c3JjZGlyPC92YXI+KSBhcyB3ZWxsIGFzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxoND48Y29kZT5zcmNkaXI8L2NvZGU+LCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+LCA8Y29kZT5zb3VyY2VwYXRoPC9jb2RlPiwgPGNvZGU+Ym9vdGNsYXNzcGF0aDwvY29kZT4sCis8Y29kZT5tb2R1bGVwYXRoPC9jb2RlPiwgPGNvZGU+bW9kdWxlc291cmNlcGF0aDwvY29kZT4sIDxjb2RlPnVwZ3JhZGVtb2R1bGVwYXRoPC9jb2RlPiBhbmQgPGNvZGU+ZXh0ZGlyczwvY29kZT48L2g0PgorPHA+PGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncyA8dmFyPnNyY2RpcjwvdmFyPiwgPHZhcj5jbGFzc3BhdGg8L3Zhcj4sIDx2YXI+c291cmNlcGF0aDwvdmFyPiwKKzx2YXI+Ym9vdGNsYXNzcGF0aDwvdmFyPiwgPHZhcj5leHRkaXJzPC92YXI+LCA8dmFyPm1vZHVsZXBhdGg8L3Zhcj4sIDx2YXI+bW9kdWxlc291cmNlcGF0aDwvdmFyPiwKK2FuZCA8dmFyPnVwZ3JhZGVtb2R1bGVwYXRoPC92YXI+IGF0dHJpYnV0ZXMgYXJlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlCitzdHJ1Y3R1cmVzPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBuZXN0ZWQgPGNvZGU+Jmx0O3NyYyZndDs8L2NvZGU+IChub3RlIHRoZSBkaWZmZXJlbnQKK25hbWUhKSwgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7c291cmNlcGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7Ym9vdGNsYXNzcGF0aCZndDs8L2NvZGU+LAorPGNvZGU+Jmx0O2V4dGRpcnMmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O21vZHVsZXBhdGgmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O21vZHVsZXNvdXJjZXBhdGgmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDt1cGdyYWRlbW9kdWxlcGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzLCByZXNwZWN0aXZlbHkuPC9wPgogCiA8aDQ+Y29tcGlsZXJhcmc8L2g0PgogCi08cD5Zb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIKLXdpdGggbmVzdGVkIDxjb2RlPiZsdDtjb21waWxlcmFyZyZndDs8L2NvZGU+IGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMKLWFyZSBzcGVjaWZpZWQgbGlrZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lCi1Bcmd1bWVudHM8L2E+IGJ1dCBoYXZlIGFuIGFkZGl0aW9uYWwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8KLWVuYWJsZSBhcmd1bWVudHMgb25seSBpZiBhIGdpdmVuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUKLXVzZWQuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPllvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlciB3aXRoCituZXN0ZWQgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyBhcmUgc3BlY2lmaWVkCitsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPiBidXQgaGF2ZSBhbiBhZGRpdGlvbmFsIGF0dHJpYnV0ZSB0aGF0CitjYW4gYmUgdXNlZCB0byBlbmFibGUgYXJndW1lbnRzIG9ubHkgaWYgYSBnaXZlbiBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIHVzZWQuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KIDx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5TZWUKLSAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZCByb3dzcGFuPSI0Ij5TZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjQiPkV4YWN0bHkgb25lIG9mIHRoZXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGluZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJ2YXIiPmxpbmU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9InZhciI+ZmlsZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGg8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFyIj5wYXRoPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+U2VlCi0gICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LgotICAgIDxlbT5TaW5jZSBBbnQgMS44LjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+U2VlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi4gIDxlbT5TaW5jZSBBbnQKKyAgICAxLjg8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1ZmZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN1ZmZpeDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcGlsZXI8L3RkPgotICAgIDx0ZD5Pbmx5IHBhc3MgdGhlIHNwZWNpZmllZCBhcmd1bWVudCBpZiB0aGUgY2hvc2VuCi0gICAgICBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgIExlZ2FsIHZhbHVlcyBhcmUgdGhlCi0gICAgICBzYW1lIGFzIHRob3NlIGluIHRoZSBhYm92ZSA8YSBocmVmPSIjY29tcGlsZXJ2YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkCi0gICAgICBjb21waWxlcnMuKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y29tcGlsZXI8L3RkPgorICAgIDx0ZD5Pbmx5IHBhc3MgdGhlIHNwZWNpZmllZCBhcmd1bWVudCBpZiB0aGUgY2hvc2VuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlIHZhbHVlIG9mCisgICAgICB0aGlzIGF0dHJpYnV0ZS4gIExlZ2FsIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgaW4gdGhlCisgICAgICBhYm92ZSA8YSBocmVmPSIjY29tcGlsZXJ2YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PmNvbXBpbGVyY2xhc3NwYXRoIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvaDQ+Cis8aDQ+Y29tcGlsZXJjbGFzc3BhdGg8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC9wPgorPHA+QSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGhvbGRpbmcgdGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nCit0aGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gaWYgYSBjdXN0b20gY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkLiAgRG9lc24ndCBoYXZlIGFueSBlZmZlY3Qgd2hlbgordXNpbmcgb25lIG9mIHRoZSBidWlsdC1pbiBjb21waWxlcnMuPC9wPgogCi08cD5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gaG9sZGluZyB0aGUKLSAgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGlmIGEKLSAgY3VzdG9tIGNsYXNzIGhhcyBiZWVuIHNwZWNpZmllZC4gIERvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IHdoZW4KLSAgdXNpbmcgb25lIG9mIHRoZSBidWlsdC1pbiBjb21waWxlcnMuPC9wPgotCi08aDQ+QW55IG5lc3RlZCBlbGVtZW50IG9mIGEgdHlwZSB0aGF0IGltcGxlbWVudHMgQ29tcGlsZXJBZGFwdGVyCi0gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvaDQ+Ci0KLTxwPklmIGEgZGVmaW5lZCB0eXBlIGltcGxlbWVudHMgdGhlIDxjb2RlPkNvbXBpbGVyQWRhcHRlcjwvY29kZT4KLSAgaW50ZXJmYWNlIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhhdCB0eXBlIGNhbiBiZSB1c2VkIGFzIGFuCi0gIGFsdGVybmF0aXZlIHRvIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlLjwvcD4KKzxoND5BbnkgbmVzdGVkIGVsZW1lbnQgb2YgYSB0eXBlIHRoYXQgaW1wbGVtZW50cyA8Y29kZT5Db21waWxlckFkYXB0ZXI8L2NvZGU+PC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KKzxwPklmIGEgZGVmaW5lZCB0eXBlIGltcGxlbWVudHMgdGhlIDxjb2RlPkNvbXBpbGVyQWRhcHRlcjwvY29kZT4gaW50ZXJmYWNlIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhhdAordHlwZSBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj5jb21waWxlcjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Ci0gICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7Ci0gICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OwotICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKLSAgICAgICAgIHNvdXJjZT0mcXVvdDsxLjQmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcwotdGhlIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCi1UaGUgY2xhc3NwYXRoIHVzZWQgaW5jbHVkZXMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBjb21waWxpbmcgd2l0aAotZGVidWcgaW5mb3JtYXRpb24gaXMgb24uIFRoZSBzb3VyY2UgbGV2ZWwgaXMgMS40LAotc28geW91IGNhbiB1c2UgPGNvZGU+YXNzZXJ0PC9jb2RlPiBzdGF0ZW1lbnRzLjwvcD4KIAotPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Ci0gICAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7Ci0gICAgICAgICBmb3JrPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgIHNvdXJjZT0mcXVvdDsxLjImcXVvdDsKLSAgICAgICAgIHRhcmdldD0mcXVvdDsxLjImcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUKLTxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuICBUaGlzIHdpbGwgZm9yayBvZmYgdGhlIGphdmFjCi1jb21waWxlciB1c2luZyB0aGUgZGVmYXVsdCA8Y29kZT5qYXZhYzwvY29kZT4gZXhlY3V0YWJsZS4KLVRoZSBzb3VyY2UgbGV2ZWwgaXMgMS4yIChzaW1pbGFyIHRvIDEuMSBvciAxLjMpIGFuZAotdGhlIGNsYXNzIGZpbGVzIHNob3VsZCBiZSBydW5uYWJsZSB1bmRlciBKREsgMS4yKyBhcyB3ZWxsLjwvcD4KKzxwPkNvbXBpbGUgYWxsIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyB1bmRlciB0aGUgPHNhbXA+JHtzcmN9PC9zYW1wPiBkaXJlY3RvcnksIGFuZCBzdG9yZQordGhlIDxzYW1wPi5jbGFzczwvc2FtcD4gZmlsZXMgaW4gdGhlIDxzYW1wPiR7YnVpbGR9PC9zYW1wPiBkaXJlY3RvcnkuIFRoZSBjbGFzc3BhdGggdXNlZAoraW5jbHVkZXMgPHNhbXA+eHl6Lmphcjwvc2FtcD4sIGFuZCBjb21waWxpbmcgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBvbi4gVGhlIHNvdXJjZSBsZXZlbAoraXMgPHE+MS40PC9xPiwgc28geW91IGNhbiB1c2UgPGNvZGU+YXNzZXJ0PC9jb2RlPiBzdGF0ZW1lbnRzLjwvcD4KKzxwcmU+CismbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OworICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7CisgICAgICAgc291cmNlPSZxdW90OzEuNCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OwotICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgZm9yaz0mcXVvdDtqYXZhJCRqYXZhYy5leGUmcXVvdDsKLSAgICAgICAgIHNvdXJjZT0mcXVvdDsxLjUmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUKLTxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuICBUaGlzIHdpbGwgZm9yayBvZmYgdGhlIGphdmFjCi1jb21waWxlciwgdXNpbmcgdGhlIGV4ZWN1dGFibGUgbmFtZWQgPGNvZGU+amF2YSRqYXZhYy5leGU8L2NvZGU+LiAgTm90ZQotdGhhdCB0aGUgPGNvZGU+JDwvY29kZT4gc2lnbiBuZWVkcyB0byBiZSBlc2NhcGVkIGJ5IGEgc2Vjb25kIG9uZS4KLVRoZSBzb3VyY2UgbGV2ZWwgaXMgMS41LCBzbyB5b3UgY2FuIHVzZSBnZW5lcmljcy48L3A+Cis8cD5Db21waWxlIGFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMgdW5kZXIgdGhlIDxzYW1wPiR7c3JjfTwvc2FtcD4gZGlyZWN0b3J5LCBhbmQgc3RvcmUKK3RoZSA8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzIGluIHRoZSA8c2FtcD4ke2J1aWxkfTwvc2FtcD4gZGlyZWN0b3J5LiBKYXZhIGNvbXBpbGVyIGlzIGZvcmtlZCB1c2luZwordGhlIGRlZmF1bHQgPGtiZD5qYXZhYzwva2JkPiBleGVjdXRhYmxlLiBUaGUgc291cmNlIGxldmVsIGlzIDxxPjEuMjwvcT4gKHNpbWlsYXIgdG8gPHE+MS4xPC9xPgorb3IgPHE+MS4zPC9xPikgYW5kIHRoZSBjbGFzcyBmaWxlcyBzaG91bGQgYmUgcnVubmFibGUgdW5kZXIgSkRLIDEuMisgYXMgd2VsbC48L3A+Cis8cHJlPgorJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgZm9yaz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgc291cmNlPSZxdW90OzEuMiZxdW90OworICAgICAgIHRhcmdldD0mcXVvdDsxLjImcXVvdDsvJmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKLSAgICAgICAgIGluY2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS8qKixteXBhY2thZ2UvcDIvKiomcXVvdDsKLSAgICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90OwotICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKLSAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+Ci08cD5jb21waWxlcyA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgdW5kZXIgdGhlIDxjb2RlPiR7c3JjfTwvY29kZT4KLWRpcmVjdG9yeSwgYW5kIHN0b3JlcyB0aGUKLTxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgaW4gdGhlIDxjb2RlPiR7YnVpbGR9PC9jb2RlPiBkaXJlY3RvcnkuCi1UaGUgY2xhc3NwYXRoIHVzZWQgaW5jbHVkZXMgPGNvZGU+eHl6LmphcjwvY29kZT4sIGFuZCBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBvbi4KLU9ubHkgZmlsZXMgdW5kZXIgPGNvZGU+bXlwYWNrYWdlL3AxPC9jb2RlPiBhbmQgPGNvZGU+bXlwYWNrYWdlL3AyPC9jb2RlPiBhcmUKLXVzZWQuIEFsbCBmaWxlcyBpbiBhbmQgYmVsb3cgdGhlIDxjb2RlPm15cGFja2FnZS9wMS90ZXN0cGFja2FnZTwvY29kZT4KLWRpcmVjdG9yeSBhcmUgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbi4KLVlvdSBkaWRuJ3Qgc3BlY2lmeSBhIHNvdXJjZSBvciB0YXJnZXQgbGV2ZWwsCi1zbyB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIHdpbGwgZGVwZW5kIG9uIHdoaWNoIEpESyB5b3UgcmFuIEFudCB3aXRoLjwvcD4KKzxwPkNvbXBpbGUgYWxsIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyB1bmRlciB0aGUgPHNhbXA+JHtzcmN9PC9zYW1wPiBkaXJlY3RvcnksIGFuZCBzdG9yZQordGhlIDxzYW1wPi5jbGFzczwvc2FtcD4gZmlsZXMgaW4gdGhlIDxzYW1wPiR7YnVpbGR9PC9zYW1wPiBkaXJlY3RvcnkuIEphdmEgY29tcGlsZXIgaXMgZm9ya2VkIHVzaW5nCit0aGUgZXhlY3V0YWJsZSBuYW1lZCA8a2JkPmphdmEkamF2YWMuZXhlPC9rYmQ+LiBOb3RlIHRoYXQgdGhlIDxxPiQ8L3E+IHNpZ24gbmVlZHMgdG8gYmUgZXNjYXBlZCBieSBhCitzZWNvbmQgb25lLiBUaGUgc291cmNlIGxldmVsIGlzIDxxPjEuNTwvcT4sIHNvIHlvdSBjYW4gdXNlIGdlbmVyaWNzLjwvcD4KKzxwcmU+CismbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICBmb3JrPSZxdW90O2phdmEkJGphdmFjLmV4ZSZxdW90OworICAgICAgIHNvdXJjZT0mcXVvdDsxLjUmcXVvdDsvJmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY306JHtzcmMyfSZxdW90OwotICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OwotICAgICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7Ci0gICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7eHl6LmphciZxdW90OwotICAgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsKLSAgLyZndDs8L3ByZT4KKzxwPkNvbXBpbGUgPHNhbXA+LmphdmE8L3NhbXA+IGZpbGVzIHVuZGVyIHRoZSA8c2FtcD4ke3NyY308L3NhbXA+IGRpcmVjdG9yeSwgYW5kIHN0b3JlCit0aGUgPHNhbXA+LmNsYXNzPC9zYW1wPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gVGhlIGNsYXNzcGF0aCB1c2VkCitpbmNsdWRlcyA8c2FtcD54eXouamFyPC9zYW1wPiwgYW5kIGRlYnVnIGluZm9ybWF0aW9uIGlzIG9uLiBPbmx5IGZpbGVzCit1bmRlciA8c2FtcD5teXBhY2thZ2UvcDE8L3NhbXA+IGFuZCA8c2FtcD5teXBhY2thZ2UvcDI8L3NhbXA+IGFyZSB1c2VkLiBBbGwgZmlsZXMgaW4gYW5kIGJlbG93Cit0aGUgPHNhbXA+bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlPC9zYW1wPiBkaXJlY3RvcnkgYXJlIGV4Y2x1ZGVkIGZyb20gY29tcGlsYXRpb24uIFlvdSBkaWRuJ3QKK3NwZWNpZnkgYSBzb3VyY2Ugb3IgdGFyZ2V0IGxldmVsLCBzbyB0aGUgYWN0dWFsIHZhbHVlcyB1c2VkIHdpbGwgZGVwZW5kIG9uIHdoaWNoIEpESyB5b3UgcmFuIEFudAord2l0aC48L3A+Cis8cHJlPgorJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKKyAgICAgICBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgaW5jbHVkZXM9JnF1b3Q7bXlwYWNrYWdlL3AxLyoqLG15cGFja2FnZS9wMi8qKiZxdW90OworICAgICAgIGV4Y2x1ZGVzPSZxdW90O215cGFja2FnZS9wMS90ZXN0cGFja2FnZS8qKiZxdW90OworICAgICAgIGNsYXNzcGF0aD0mcXVvdDt4eXouamFyJnF1b3Q7CisgICAgICAgZGVidWc9JnF1b3Q7b24mcXVvdDsvJmd0OzwvcHJlPgogCi08cD5pcyB0aGUgc2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgd2l0aCB0aGUgYWRkaXRpb24gb2YgYSBzZWNvbmQKLXNvdXJjZSBwYXRoLCBkZWZpbmVkIGJ5Ci10aGUgcHJvcGVydHkgPGNvZGU+c3JjMjwvY29kZT4uIFRoaXMgY2FuIGFsc28gYmUgcmVwcmVzZW50ZWQgdXNpbmcgbmVzdGVkCi08Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+Cis8cD5UaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cyBleGFtcGxlLCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIHNlY29uZCBzb3VyY2UgcGF0aCwgZGVmaW5lZCBieQordGhlIHByb3BlcnR5IDxzYW1wPnNyYzI8L3NhbXA+LiBUaGlzIGNhbiBhbHNvIGJlIHJlcHJlc2VudGVkIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4KK2VsZW1lbnRzIGFzIGZvbGxvd3M6PC9wPgorPHByZT4KKyZsdDtqYXZhYyBkZXN0ZGlyPSZxdW90OyR7YnVpbGR9JnF1b3Q7CisgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKKyAgICAgICBkZWJ1Zz0mcXVvdDtvbiZxdW90OyZndDsKKyAgJmx0O3NyYyBwYXRoPSZxdW90OyR7c3JjfSZxdW90Oy8mZ3Q7CisgICZsdDtzcmMgcGF0aD0mcXVvdDske3NyYzJ9JnF1b3Q7LyZndDsKKyAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDEvKiomcXVvdDsvJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMi8qKiZxdW90Oy8mZ3Q7CisgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7LyZndDsKKyZsdDsvamF2YWMmZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7amF2YWMgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgY2xhc3NwYXRoPSZxdW90O3h5ei5qYXImcXVvdDsKLSAgICAgICAgIGRlYnVnPSZxdW90O29uJnF1b3Q7Jmd0OwotICAgICZsdDtzcmMgcGF0aD0mcXVvdDske3NyY30mcXVvdDsvJmd0OwotICAgICZsdDtzcmMgcGF0aD0mcXVvdDske3NyYzJ9JnF1b3Q7LyZndDsKLSAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O215cGFja2FnZS9wMS8qKiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtteXBhY2thZ2UvcDIvKiomcXVvdDsvJmd0OwotICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7bXlwYWNrYWdlL3AxL3Rlc3RwYWNrYWdlLyoqJnF1b3Q7LyZndDsKLSAgJmx0Oy9qYXZhYyZndDs8L3ByZT4KKzxwPklmIHlvdSB3YW50IHRvIHJ1biB0aGUgPGtiZD5qYXZhYzwva2JkPiBjb21waWxlciBvZiBhIGRpZmZlcmVudCBKREssIHlvdSBzaG91bGQgdGVsbCBBbnQgd2hlcmUgdG8KK2ZpbmQgdGhlIGNvbXBpbGVyIGFuZCB3aGljaCB2ZXJzaW9uIG9mIEpESyB5b3Ugd2lsbCBiZSB1c2luZyBzbyBpdCBjYW4gY2hvb3NlIHRoZSBjb3JyZWN0IGNvbW1hbmQKK2xpbmUgc3dpdGNoZXMuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBleGVjdXRlcyBhIEpESyAxLjEgPGtiZD5qYXZhYzwva2JkPiBpbiBhIG5ldyBwcm9jZXNzIGFuZCB1c2VzCit0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZXZlbiB3aGVuIEFudCBpcyBydW5uaW5nIGluIGEgSlZNIG9mIGEgZGlmZmVyZW50IHZlcnNpb246PC9wPgorPHByZT4KKyZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgIGZvcms9JnF1b3Q7eWVzJnF1b3Q7CisgICAgICAgZXhlY3V0YWJsZT0mcXVvdDsvb3B0L2phdmEvamRrMS4xL2Jpbi9qYXZhYyZxdW90OworICAgICAgIGNvbXBpbGVyPSZxdW90O2phdmFjMS4xJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+SWYgeW91IHdhbnQgdG8gcnVuIHRoZSBqYXZhYyBjb21waWxlciBvZiBhIGRpZmZlcmVudCBKREssIHlvdQotc2hvdWxkIHRlbGwgQW50LCB3aGVyZSB0byBmaW5kIHRoZSBjb21waWxlciBhbmQgd2hpY2ggdmVyc2lvbiBvZiBKREsKLXlvdSB3aWxsIGJlIHVzaW5nIHNvIGl0IGNhbiBjaG9vc2UgdGhlIGNvcnJlY3QgY29tbWFuZCBsaW5lIHN3aXRjaGVzLgotVGhlIGZvbGxvd2luZyBleGFtcGxlIGV4ZWN1dGVzIGEgSkRLIDEuMSBqYXZhYyBpbiBhIG5ldyBwcm9jZXNzIGFuZAotdXNlcyB0aGUgY29ycmVjdCBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZXZlbiB3aGVuIEFudCBpcyBydW5uaW5nIGluIGEKLUphdmEgVk0gb2YgYSBkaWZmZXJlbnQgdmVyc2lvbjo8L3A+Cis8cCBpZD0ic3JjZGlybm90ZSI+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJZiB5b3Ugd2lzaCB0byBjb21waWxlIG9ubHkgc291cmNlIGZpbGVzIGxvY2F0ZWQgaW4KK2NlcnRhaW4gcGFja2FnZXMgYmVsb3cgYSBjb21tb24gcm9vdCwgdXNlIHRoZSA8dmFyPmluY2x1ZGU8L3Zhcj4vPHZhcj5leGNsdWRlPC92YXI+IGF0dHJpYnV0ZXMKK29yIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4vPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudHMgdG8gZmlsdGVyIGZvciB0aGVzZQorcGFja2FnZXMuIERvIG5vdCBpbmNsdWRlIHBhcnQgb2YgeW91ciBwYWNrYWdlIHN0cnVjdHVyZSBpbiB0aGUgPHZhcj5zcmNkaXI8L3Zhcj4gYXR0cmlidXRlIChvcgorbmVzdGVkIDxjb2RlPiZsdDtzcmMmZ3Q7PC9jb2RlPiBlbGVtZW50cyksIG9yIEFudCB3aWxsIHJlY29tcGlsZSB5b3VyIHNvdXJjZSBmaWxlcyBldmVyeSB0aW1lIHlvdQorcnVuIHlvdXIgY29tcGlsZSB0YXJnZXQuIFNlZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCNhbHdheXMtcmVjb21waWxlcyIKK3RhcmdldD0iX3RvcCI+QW50IEZBUTwvYT4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uPC9wPgogCi08cHJlPiAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKLSAgICAgICAgIGZvcms9JnF1b3Q7eWVzJnF1b3Q7Ci0gICAgICAgICBleGVjdXRhYmxlPSZxdW90Oy9vcHQvamF2YS9qZGsxLjEvYmluL2phdmFjJnF1b3Q7Ci0gICAgICAgICBjb21waWxlcj0mcXVvdDtqYXZhYzEuMSZxdW90OwotICAvJmd0OzwvcHJlPgorPHA+SWYgeW91IHdpc2ggdG8gY29tcGlsZSBvbmx5IGZpbGVzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFuZCBkaXNhYmxlIDxjb2RlPmphdmFjPC9jb2RlPidzIGRlZmF1bHQKK3NlYXJjaGluZyBtZWNoYW5pc20gdGhlbiB5b3UgY2FuIHVuc2V0IHRoZSA8dmFyPnNvdXJjZXBhdGg8L3Zhcj4gYXR0cmlidXRlOjwvcD4KKzxwcmU+CismbHQ7amF2YWMgc291cmNlcGF0aD0mcXVvdDsmcXVvdDsgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OworICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsgJmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmphdmEiLyZndDsKKyAgJmx0O2V4Y2x1ZGUgbmFtZT0iKiovRXhhbXBsZS5qYXZhIi8mZ3Q7CismbHQ7L2phdmFjJmd0OzwvcHJlPgogCi08cD48YSBuYW1lPSJzcmNkaXJub3RlIj48Yj5Ob3RlOjwvYj48L2E+Ci1JZiB5b3Ugd2lzaCB0byBjb21waWxlIG9ubHkgc291cmNlIGZpbGVzIGxvY2F0ZWQgaW4gY2VydGFpbiBwYWNrYWdlcyBiZWxvdyBhCi1jb21tb24gcm9vdCwgdXNlIHRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPi88Y29kZT5leGNsdWRlPC9jb2RlPiBhdHRyaWJ1dGVzCi1vciA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+Lzxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnRzCi10byBmaWx0ZXIgZm9yIHRoZXNlIHBhY2thZ2VzLiBEbyBub3QgaW5jbHVkZSBwYXJ0IG9mIHlvdXIgcGFja2FnZSBzdHJ1Y3R1cmUKLWluIHRoZSA8Y29kZT5zcmNkaXI8L2NvZGU+IGF0dHJpYnV0ZQotKG9yIG5lc3RlZCA8Y29kZT4mbHQ7c3JjJmd0OzwvY29kZT4gZWxlbWVudHMpLCBvciBBbnQgd2lsbCByZWNvbXBpbGUgeW91cgotc291cmNlIGZpbGVzIGV2ZXJ5IHRpbWUgeW91IHJ1biB5b3VyIGNvbXBpbGUgdGFyZ2V0LiBTZWUgdGhlCi08YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjYWx3YXlzLXJlY29tcGlsZXMiPkFudCBGQVE8L2E+Ci1mb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Cis8cD5UaGF0IHdheSB0aGUgPGNvZGU+amF2YWM8L2NvZGU+IHdpbGwgY29tcGlsZSBhbGwgSmF2YSBzb3VyY2UgZmlsZXMgdW5kZXIgPHNhbXA+JHtzcmN9PC9zYW1wPgorZGlyZWN0b3J5IGJ1dCBza2lwIHRoZSBleGFtcGxlcy4gVGhlIGNvbXBpbGVyIHdpbGwgZXZlbiBwcm9kdWNlIGVycm9ycyBpZiBzb21lIG9mIHRoZSBub24tZXhhbXBsZQorZmlsZXMgcmVmZXJzIHRvIHRoZW0uPC9wPgogCi08cD4KLUlmIHlvdSB3aXNoIHRvIGNvbXBpbGUgb25seSBmaWxlcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhbmQgZGlzYWJsZQotamF2YWMncyBkZWZhdWx0IHNlYXJjaGluZyBtZWNoYW5pc20gdGhlbiB5b3UgY2FuIHVuc2V0IHRoZSBzb3VyY2VwYXRoCi1hdHRyaWJ1dGU6Ci08cHJlPiAgJmx0O2phdmFjIHNvdXJjZXBhdGg9JnF1b3Q7JnF1b3Q7IHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsKLSAgICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsgJmd0OwotICAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouamF2YSIvJmd0OwotICAgICZsdDtleGNsdWRlIG5hbWU9IioqL0V4YW1wbGUuamF2YSIvJmd0OwotICAmbHQ7L2phdmFjJmd0OzwvcHJlPgotVGhhdCB3YXkgdGhlIGphdmFjIHdpbGwgY29tcGlsZSBhbGwgamF2YSBzb3VyY2UgZmlsZXMgdW5kZXIgJnF1b3Q7JHtzcmN9JnF1b3Q7Ci1kaXJlY3RvcnkgYnV0IHNraXAgdGhlIGV4YW1wbGVzLiBUaGUgY29tcGlsZXIgd2lsbCBldmVuIHByb2R1Y2UgZXJyb3JzIGlmIHNvbWUgb2YKLXRoZSBub24tZXhhbXBsZSBmaWxlcyByZWZlcnMgdG8gdGhlbS4KLTwvcD4KKzxwPklmIHlvdSB3aXNoIHRvIGNvbXBpbGUgd2l0aCBhIHNwZWNpYWwgSkRLIChhbm90aGVyIHRoYW4gdGhlIG9uZSBBbnQgaXMgY3VycmVudGx5IHVzaW5nKSwgc2V0Cit0aGUgPHZhcj5leGVjdXRhYmxlPC92YXI+IGFuZCA8dmFyPmZvcms8L3Zhcj4gYXR0cmlidXRlLiBVc2luZyA8dmFyPnRhc2tuYW1lPC92YXI+IGNvdWxkIHNob3cgaW4gdGhlCitsb2csIHRoYXQgdGhlc2Ugc2V0dGluZ3MgYXJlIGZpeC48L3A+Cis8cHJlPgorJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDsmcXVvdDsKKyAgICAgICBkZXN0ZGlyPSZxdW90OyZxdW90OworICAgICAgIGV4ZWN1dGFibGU9JnF1b3Q7cGF0aC10by1qYXZhMTQtaG9tZS9iaW4vamF2YWMmcXVvdDsKKyAgICAgICBmb3JrPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICB0YXNrbmFtZT0mcXVvdDtqYXZhYzEuNCZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPgotSWYgeW91IHdpc2ggdG8gY29tcGlsZSB3aXRoIGEgc3BlY2lhbCBKREsgKGFub3RoZXIgdGhhbiB0aGUgb25lIEFudCBpcyBjdXJyZW50bHkgdXNpbmcpLAotc2V0IHRoZSA8Y29kZT5leGVjdXRhYmxlPC9jb2RlPiBhbmQgPGNvZGU+Zm9yazwvY29kZT4gYXR0cmlidXRlLiBVc2luZyA8Y29kZT50YXNrbmFtZTwvY29kZT4KLWNvdWxkIHNob3cgaW4gdGhlIGxvZywgdGhhdCB0aGVzZSBzZXR0aW5ncyBhcmUgZml4LgotPHByZT4gICZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JnF1b3Q7IAotICAgICAgICAgZGVzdGRpcj0mcXVvdDsmcXVvdDsKLSAgICAgICAgIGV4ZWN1dGFibGU9JnF1b3Q7cGF0aC10by1qYXZhMTQtaG9tZS9iaW4vamF2YWMmcXVvdDsgCi0gICAgICAgICBmb3JrPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgIHRhc2tuYW1lPSZxdW90O2phdmFjMS40JnF1b3Q7IC8mZ3Q7PC9wcmU+Ci08L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBhcmUgdXNpbmcgQW50IG9uIFdpbmRvd3MgYW5kIGEgbmV3IERPUyB3aW5kb3cgcG9wcyB1cCBmb3IgZXZlcnkgdXNlCitvZiBhbiBleHRlcm5hbCBjb21waWxlciwgdGhpcyBtYXkgYmUgYSBwcm9ibGVtIG9mIHRoZSBKREsgeW91IGFyZSB1c2luZy4gIFRoaXMgcHJvYmxlbSBtYXkgb2NjdXIKK3dpdGggYWxsIEpES3MgcHJpb3IgdG8gMS4yLjwvcD4KIAotCi08cD48Yj5Ob3RlOjwvYj4gSWYgeW91IGFyZSB1c2luZyBBbnQgb24gV2luZG93cyBhbmQgYSBuZXcgRE9TIHdpbmRvdyBwb3BzIHVwCi1mb3IgZXZlcnkgdXNlIG9mIGFuIGV4dGVybmFsIGNvbXBpbGVyLCB0aGlzIG1heSBiZSBhIHByb2JsZW0gb2YgdGhlIEpESyB5b3UgYXJlCi11c2luZy4gIFRoaXMgcHJvYmxlbSBtYXkgb2NjdXIgd2l0aCBhbGwgSkRLcyAmbHQ7IDEuMi48L3A+Ci0KLQotPHA+Ci1JZiB5b3Ugd2FudCB0byBhY3RpdmF0ZSBvdGhlciBjb21waWxlciBvcHRpb25zIGxpa2UgPGk+bGludDwvaT4geW91IGNvdWxkIHVzZQotdGhlIDx0dD4mbHQ7Y29tcGlsZXJhcmcmZ3Q7PC90dD4gZWxlbWVudDoKLTxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IgotICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCi0gICAgICAgICBjbGFzc3BhdGhyZWY9ImxpYnJhcmllcyImZ3Q7Ci0gICAgJmx0O2NvbXBpbGVyYXJnIHZhbHVlPSItWGxpbnQiLyZndDsKLSAgJmx0Oy9qYXZhYyZndDsgPC9wcmU+Ci08L3A+ICAKLQotPHA+SWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tCi0gIENvbXBpbGVyQWRhcHRlciA8Y29kZT5vcmcuZXhhbXBsZS5NeUFkYXB0ZXI8L2NvZGU+IHlvdSBjYW4gZWl0aGVyCi0gIHVzZSB0aGUgY29tcGlsZXIgYXR0cmlidXRlOjwvcD4KKzxwPklmIHlvdSB3YW50IHRvIGFjdGl2YXRlIG90aGVyIGNvbXBpbGVyIG9wdGlvbnMgbGlrZSA8Y29kZT5saW50PC9jb2RlPiB5b3UgY291bGQgdXNlCit0aGUgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudDo8L3A+CiA8cHJlPgogJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIKICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKLSAgICAgICBjb21waWxlcj0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIi8mZ3Q7Ci08L3ByZT4KKyAgICAgICBjbGFzc3BhdGhyZWY9ImxpYnJhcmllcyImZ3Q7CisgICZsdDtjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50Ii8mZ3Q7CismbHQ7L2phdmFjJmd0OzwvcHJlPgorCis8cD5JZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20gQ29tcGlsZXJBZGFwdGVyIDxjb2RlPm9yZy5leGFtcGxlLk15QWRhcHRlcjwvY29kZT4geW91IGNhbiBlaXRoZXIgdXNlCit0aGUgPHZhcj5jb21waWxlcjwvdmFyPiBhdHRyaWJ1dGU6PC9wPgorCis8cHJlPgorJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIKKyAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKKyAgICAgICBjb21waWxlcj0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIi8mZ3Q7PC9wcmU+CisKIDxwPm9yIGEgZGVmaW5lIGEgdHlwZSBhbmQgbmVzdCB0aGlzIGludG8gdGhlIHRhc2sgbGlrZSBpbjo8L3A+CisKIDxwcmU+CiAmbHQ7Y29tcG9uZW50ZGVmIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIgogICAgICAgICAgICAgICBuYW1lPSJteWFkYXB0ZXIiLyZndDsKICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iCiAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iJmd0OwogICAmbHQ7bXlhZGFwdGVyLyZndDsKLSZsdDsvamF2YWMmZ3Q7Ci08L3ByZT4KLTxwPmluIHdoaWNoIGNhc2UgeW91ciBjb21waWxlciBhZGFwdGVyIGNhbiBzdXBwb3J0IGF0dHJpYnV0ZXMgYW5kCi0gIG5lc3RlZCBlbGVtZW50cyBvZiBpdHMgb3duLjwvcD4KKyZsdDsvamF2YWMmZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7amF2YWMgc3JjZGlyPSZxdW90OyR7c3JjfSZxdW90OwotICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9JnF1b3Q7ZmFsc2UmcXVvdDsKLSAgICAgICAgIG1vZHVsZXBhdGg9JnF1b3Q7bW9kdWxlcyZxdW90OwotICAgICAgICAgc291cmNlPSZxdW90OzkmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgaW4gYSBzaW5nbGUgbW9kdWxlIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+IGRpcmVjdG9yeSwKLSAgYW5kIHN0b3JlcyB0aGUgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gVGhlIGNvbXBpbGF0aW9uIHVzZXMKLSAgYXBwbGljYXRpb24gbW9kdWxlcyBsb2NhdGVkIGluIDxjb2RlPm1vZHVsZXM8L2NvZGU+IGZvbGRlci5UaGUgc291cmNlIGxldmVsIGlzIDxjb2RlPjk8L2NvZGU+IHRvIGVuYWJsZSBtb2R1bGVzLjwvcD4KKzxwPmluIHdoaWNoIGNhc2UgeW91ciBjb21waWxlciBhZGFwdGVyIGNhbiBzdXBwb3J0IGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBvZiBpdHMgb3duLjwvcD4KIAotPHByZT4gICZsdDtqYXZhYyBtb2R1bGVzb3VyY2VwYXRoPSZxdW90OyR7c3JjfS8qL3tnZW4sbGluezMyLDY0fX0vY2xhc3NlcyZxdW90OwotICAgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OwotICAgICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9JnF1b3Q7ZmFsc2UmcXVvdDsKLSAgICAgICAgIG1vZHVsZXBhdGg9JnF1b3Q7bW9kdWxlcyZxdW90OwotICAgICAgICAgc291cmNlPSZxdW90OzkmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPmNvbXBpbGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgaW4gPGNvZGU+Z2VuL2NsYXNzZXM8L2NvZGU+LCA8Y29kZT5saW4zMi9jbGFzc2VzPC9jb2RlPiBhbmQKLSAgPGNvZGU+bGluNjQvY2xhc3NlczwvY29kZT4gaW4gYWxsIHNvdXJjZSBtb2R1bGVzIHVuZGVyIHRoZSA8Y29kZT4ke3NyY308L2NvZGU+IGRpcmVjdG9yeS4KLSAgR2VuZXJhdGVzIG1vZHVsZSBkaXJlY3RvcmllcyBpbiB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeS4gRWFjaCBnZW5lcmF0ZWQgbW9kdWxlIGRpcmVjdG9yeSB1bmRlcgotICB0aGUgPGNvZGU+JHtidWlsZH08L2NvZGU+IGRpcmVjdG9yeSBjb250YWlucyA8Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGZyb20gY29ycmVzcG9uZGluZyBzb3VyY2UgbW9kdWxlLgotICBUaGUgPGNvZGU+KjwvY29kZT4gaXMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgYW55IG9mIHRoZSBtb2R1bGVzIGluIHRoZSBjb21waWxhdGlvbiBtb2R1bGUgc2V0LgotICBUaGUgPGNvZGU+eyAuLi4gLCAuLi4gfTwvY29kZT4gZXhwcmVzcyBhbHRlcm5hdGVzIGZvciBleHBhbnNpb24uCi0gIFRoZSBjb21waWxhdGlvbiB1c2VzIGFwcGxpY2F0aW9uIG1vZHVsZXMgbG9jYXRlZCBpbiA8Y29kZT5tb2R1bGVzPC9jb2RlPiBmb2xkZXIuVGhlIHNvdXJjZSBsZXZlbCBpcwotICA8Y29kZT45PC9jb2RlPiB0byBlbmFibGUgbW9kdWxlcy48L3A+Cis8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGVzIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgSmF2YSA5KyBtb2R1bGVzLjwvcD4KIAotPGgzPkppa2VzIE5vdGVzPC9oMz4KKzxwPkNvbXBpbGUgYWxsIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBpbiBhIHNpbmdsZSBtb2R1bGUgdW5kZXIgdGhlIDxzYW1wPiR7c3JjfTwvc2FtcD4gZGlyZWN0b3J5LAorYW5kIHN0b3JlIHRoZSA8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzIGluIHRoZSA8Y29kZT4ke2J1aWxkfTwvY29kZT4gZGlyZWN0b3J5LiBUaGUgY29tcGlsYXRpb24gdXNlcworYXBwbGljYXRpb24gbW9kdWxlcyBsb2NhdGVkIGluIDxzYW1wPm1vZHVsZXM8L3NhbXA+IGZvbGRlci4gVGhlIHNvdXJjZSBsZXZlbCBpcyA8cT45PC9xPiB0byBlbmFibGUKK21vZHVsZXMuPC9wPgorPHByZT4KKyZsdDtqYXZhYyBzcmNkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CisgICAgICAgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90OworICAgICAgIGluY2x1ZGVhbnRydW50aW1lPSZxdW90O2ZhbHNlJnF1b3Q7CisgICAgICAgbW9kdWxlcGF0aD0mcXVvdDttb2R1bGVzJnF1b3Q7CisgICAgICAgc291cmNlPSZxdW90OzkmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5Db21waWxlIGFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMgaW4gPHNhbXA+Z2VuL2NsYXNzZXM8L3NhbXA+LCA8c2FtcD5saW4zMi9jbGFzc2VzPC9zYW1wPgorYW5kIDxjb2RlPmxpbjY0L2NsYXNzZXM8L2NvZGU+IGluIGFsbCBzb3VyY2UgbW9kdWxlcyB1bmRlciB0aGUgPGNvZGU+JHtzcmN9PC9jb2RlPgorZGlyZWN0b3J5LiBHZW5lcmF0ZSBtb2R1bGUgZGlyZWN0b3JpZXMgaW4gdGhlIDxzYW1wPiR7YnVpbGR9PC9zYW1wPiBkaXJlY3RvcnkuIEVhY2ggZ2VuZXJhdGVkIG1vZHVsZQorZGlyZWN0b3J5IHVuZGVyIHRoZSA8c2FtcD4ke2J1aWxkfTwvc2FtcD4gZGlyZWN0b3J5IGNvbnRhaW5zIDxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMgZnJvbQorY29ycmVzcG9uZGluZyBzb3VyY2UgbW9kdWxlLiBUaGUgPHNhbXA+Kjwvc2FtcD4gaXMgYSB0b2tlbiByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgYW55IG9mIHRoZQorbW9kdWxlcyBpbiB0aGUgY29tcGlsYXRpb24gbW9kdWxlIHNldC4gVGhlIDxjb2RlPnsgLi4uICwgLi4uIH08L2NvZGU+IGV4cHJlc3MgYWx0ZXJuYXRlcyBmb3IKK2V4cGFuc2lvbi4gVGhlIGNvbXBpbGF0aW9uIHVzZXMgYXBwbGljYXRpb24gbW9kdWxlcyBsb2NhdGVkIGluIDxjb2RlPm1vZHVsZXM8L2NvZGU+IGZvbGRlci4gVGhlCitzb3VyY2UgbGV2ZWwgaXMgPHE+OTwvcT4gdG8gZW5hYmxlIG1vZHVsZXMuPC9wPgorPHByZT4KKyZsdDtqYXZhYyBtb2R1bGVzb3VyY2VwYXRoPSZxdW90OyR7c3JjfS8qL3tnZW4sbGluezMyLDY0fX0vY2xhc3NlcyZxdW90OworICAgICAgIGRlc3RkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsKKyAgICAgICBpbmNsdWRlYW50cnVudGltZT0mcXVvdDtmYWxzZSZxdW90OworICAgICAgIG1vZHVsZXBhdGg9JnF1b3Q7bW9kdWxlcyZxdW90OworICAgICAgIHNvdXJjZT0mcXVvdDs5JnF1b3Q7LyZndDs8L3ByZT4KKworPGgzIGlkPSJqaWtlcyI+SmlrZXMgbm90ZXM8L2gzPgogCiA8cD5Zb3UgbmVlZCBKaWtlcyAxLjE1IG9yIGxhdGVyLjwvcD4KIAotPHA+SmlrZXMgc3VwcG9ydHMgc29tZSBleHRyYSBvcHRpb25zLCB3aGljaCBjYW4gYmUgc2V0IGJlIGRlZmluaW5nCi10aGUgcHJvcGVydGllcyBzaG93biBiZWxvdyBwcmlvciB0byBpbnZva2luZyB0aGUgdGFzay4gVGhlIHNldHRpbmcKLWZvciBlYWNoIHByb3BlcnR5IHdpbGwgYmUgaW4gYWZmZWN0IGZvciBhbGwgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4KLXRhc2tzIHRocm91Z2hvdXQgdGhlIGJ1aWxkLgotVGhlIEFudCBkZXZlbG9wZXJzIGFyZSBhd2FyZSB0aGF0Ci10aGlzIGlzIHVnbHkgYW5kIGluZmxleGlibGUgJm5kYXNoOyBleHBlY3QgYSBiZXR0ZXIgc29sdXRpb24gaW4gdGhlIGZ1dHVyZS4KLUFsbCB0aGUgb3B0aW9ucyBhcmUgYm9vbGVhbiwgYW5kIG11c3QgYmUgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yCi08Y29kZT55ZXM8L2NvZGU+IHRvIGJlCi1pbnRlcnByZXRlZCBhcyBhbnl0aGluZyBvdGhlciB0aGFuIGZhbHNlLiBCeSBkZWZhdWx0LAotPGNvZGU+YnVpbGQuY29tcGlsZXIud2FybmluZ3M8L2NvZGU+IGlzIDxjb2RlPnRydWU8L2NvZGU+LAotd2hpbGUgYWxsIG90aGVycyBhcmUgPGNvZGU+ZmFsc2U8L2NvZGU+LjwvcD4KKzxwPkppa2VzIHN1cHBvcnRzIHNvbWUgZXh0cmEgb3B0aW9ucywgd2hpY2ggY2FuIGJlIHNldCBiZSBkZWZpbmluZyB0aGUgcHJvcGVydGllcyBzaG93biBiZWxvdyBwcmlvcgordG8gaW52b2tpbmcgdGhlIHRhc2suIFRoZSBzZXR0aW5nIGZvciBlYWNoIHByb3BlcnR5IHdpbGwgYmUgaW4gZWZmZWN0IGZvcgorYWxsIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2tzIHRocm91Z2hvdXQgdGhlIGJ1aWxkLiAgVGhlIEFudCBkZXZlbG9wZXJzIGFyZSBhd2FyZSB0aGF0IHRoaXMKK2lzIHVnbHkgYW5kIGluZmxleGlibGUgJm5kYXNoOyBleHBlY3QgYSBiZXR0ZXIgc29sdXRpb24gaW4gdGhlIGZ1dHVyZS4gIEFsbCB0aGUgb3B0aW9ucyBhcmUgYm9vbGVhbiwKK2FuZCBtdXN0IGJlIHNldCB0byA8cT50cnVlPC9xPiBvciA8cT55ZXM8L3E+IHRvIGJlIGludGVycHJldGVkIGFzIGFueXRoaW5nIG90aGVyCit0aGFuIDxxPmZhbHNlPC9xPi4gQnkgZGVmYXVsdCwgPGNvZGU+YnVpbGQuY29tcGlsZXIud2FybmluZ3M8L2NvZGU+IGlzIDxxPnRydWU8L3E+LCB3aGlsZSBhbGwgb3RoZXJzCithcmUgPHE+ZmFsc2U8L3E+LjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+UHJvcGVydHk8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5EZWZhdWx0PC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlByb3BlcnR5PC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZWZhdWx0PC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0JYnVpbGQuY29tcGlsZXIuZW1hY3MKLQk8L3RkPgotCTx0ZCB2YWxpZ249InRvcCI+Ci0JRW5hYmxlIGVtYWNzLWNvbXBhdGlibGUgZXJyb3IgbWVzc2FnZXMuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotCTxjb2RlPmZhbHNlPC9jb2RlPgotCTwvdGQ+CisgICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLmVtYWNzPC9jb2RlPjwvdGQ+CisgICAgPHRkPkVuYWJsZSBlbWFjcy1jb21wYXRpYmxlIGVycm9yIG1lc3NhZ2VzLjwvdGQ+CisgICAgPHRkPjxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotCWJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQKLQk8L3RkPgotCTx0ZCB2YWxpZ249InRvcCI+Ci0JRW5hYmxlIGZ1bGwgZGVwZW5kZW5jeSBjaGVja2luZzsgc2VlPGJyPgotCXRoZSA8Y29kZT4rRjwvY29kZT4gc3dpdGNoIGluIHRoZSBKaWtlcyBtYW51YWwuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotCTxjb2RlPmZhbHNlPC9jb2RlPgotCTwvdGQ+CisgICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQ8L2NvZGU+PC90ZD4KKyAgICA8dGQ+RW5hYmxlIGZ1bGwgZGVwZW5kZW5jeSBjaGVja2luZzsgc2VlPGJyLz4gdGhlIDxjb2RlPitGPC9jb2RlPiBzd2l0Y2ggaW4gdGhlIEppa2VzCisgICAgICBtYW51YWwuPC90ZD4KKyAgICA8dGQ+PHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0JYnVpbGQuY29tcGlsZXIucGVkYW50aWMKLQk8L3RkPgotCTx0ZCB2YWxpZ249InRvcCI+Ci0JRW5hYmxlIHBlZGFudGljIHdhcm5pbmdzLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLQk8Y29kZT5mYWxzZTwvY29kZT4KLQk8L3RkPgorICAgIDx0ZD48Y29kZT5idWlsZC5jb21waWxlci5wZWRhbnRpYzwvY29kZT48L3RkPgorICAgIDx0ZD5FbmFibGUgcGVkYW50aWMgd2FybmluZ3MuPC90ZD4KKyAgICA8dGQ+PHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0JYnVpbGQuY29tcGlsZXIud2FybmluZ3M8YnI+Ci0gICAgICAgIDxzdHJvbmc+RGVwcmVjYXRlZDwvc3Ryb25nPi4gVXNlCi0gIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+J3MgPGNvZGU+bm93YXJuPC9jb2RlPgotICBhdHRyaWJ1dGUgaW5zdGVhZC4KLQk8L3RkPgotCTx0ZCB2YWxpZ249InRvcCI+Ci0JRG9uJ3QgZGlzYWJsZSB3YXJuaW5nIG1lc3NhZ2VzLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLQk8Y29kZT50cnVlPC9jb2RlPgotCTwvdGQ+CisgICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzPC9jb2RlPjxici8+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uCisgICAgICBVc2UgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncyA8dmFyPm5vd2FybjwvdmFyPiBhdHRyaWJ1dGUgaW5zdGVhZC48L3RkPgorICAgIDx0ZD5Eb24ndCBkaXNhYmxlIHdhcm5pbmcgbWVzc2FnZXMuPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPkp2YyBOb3RlczwvaDM+Cis8aDMgaWQ9Imp2YyI+SnZjIG5vdGVzPC9oMz4KIAotPHA+SnZjIHdpbGwgZW5hYmxlIE1pY3Jvc29mdCBleHRlbnNpb25zIHVubGVzcyB5b3Ugc2V0IHRoZSBwcm9wZXJ0eQotPGNvZGU+YnVpbGQuY29tcGlsZXIuanZjLmV4dGVuc2lvbnM8L2NvZGU+IHRvIGZhbHNlIGJlZm9yZSBpbnZva2luZwotPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4uPC9wPgorPHA+PHE+SnZjPC9xPiB3aWxsIGVuYWJsZSBNaWNyb3NvZnQgZXh0ZW5zaW9ucyB1bmxlc3MgeW91IHNldCB0aGUKK3Byb3BlcnR5IDxjb2RlPmJ1aWxkLmNvbXBpbGVyLmp2Yy5leHRlbnNpb25zPC9jb2RlPiB0byA8cT5mYWxzZTwvcT4gYmVmb3JlCitpbnZva2luZyA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPi48L3A+CiAKLTxoMz48YSBuYW1lPSJib290c3RyYXAiPkJvb3RzdHJhcCBPcHRpb25zPC9oMz4KLTxwPgotICBUaGUgU3VuIGphdmFjIGNvbXBpbGVyIGhhcyBhIDxlbT5ib290Y2xhc3NwYXRoPC9lbT4gY29tbWFuZAotICBsaW5lIG9wdGlvbiAtIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlICJib290Y2xhc3NwYXRoIiBhdHRyaWJ1dGUvZWxlbWVudAotICBvZiB0aGUgJmx0O2phdmFjJmd0OyB0YXNrLiBUaGUgU3VuIGNvbXBpbGVyIGFsc28gYWxsb3dzIG1vcmUKLSAgY29udHJvbCBvdmVyIHRoZSBib290IGNsYXNzcGF0aCB1c2luZyB0aGUgLVggYW5kIC1KLVggYXR0cmlidXRlcy4KLSAgT25lIGNhbiBzZXQgdGhlc2UgYnkgdXNpbmcgdGhlICZsdDtjb21waWxlcmFyZyZndDsuIFNpbmNlIEFudCAxLjYuMCwKLSAgdGhlcmUgaXMgYSBzaG9ydGN1dCB0byBjb252ZXJ0IHBhdGggcmVmZXJlbmNlcyB0byBzdHJpbmdzIHRoYXQKLSAgY2FuIGJ5IHVzZWQgaW4gYW4gT1MgaW5kZXBlbmRlbnQgZmFzaGlvbiAoc2VlCi0gIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aHNob3J0Y3V0Ij5wYXRoc2hvcnRjdXQ8L2E+KS4gRm9yIGV4YW1wbGU6Ci08L3A+Cis8aDMgaWQ9ImJvb3RzdHJhcCI+Qm9vdHN0cmFwIG9wdGlvbnM8L2gzPgorPHA+VGhlIFN1biA8a2JkPmphdmFjPC9rYmQ+IGNvbXBpbGVyIGhhcyBhIDxrYmQ+LWJvb3RjbGFzc3BhdGg8L2tiZD4gY29tbWFuZCBsaW5lCitvcHRpb24mbWRhc2g7dGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPHZhcj5ib290Y2xhc3NwYXRoPC92YXI+IGF0dHJpYnV0ZS9lbGVtZW50IG9mCit0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzay4gVGhlIFN1biBjb21waWxlciBhbHNvIGFsbG93cyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgYm9vdAorY2xhc3NwYXRoIHVzaW5nIHRoZSA8a2JkPi1YPC9rYmQ+IGFuZCA8a2JkPi1KLVg8L2tiZD4gYXR0cmlidXRlcy4gIE9uZSBjYW4gc2V0IHRoZXNlIGJ5IHVzaW5nCit0aGUgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4uIDxlbT5TaW5jZSBBbnQgMS42LjA8L2VtPiwgdGhlcmUgaXMgYSBzaG9ydGN1dCB0byBjb252ZXJ0IHBhdGgKK3JlZmVyZW5jZXMgdG8gc3RyaW5ncyB0aGF0IGNhbiBieSB1c2VkIGluIGFuIE9TIGluZGVwZW5kZW50IGZhc2hpb24KKyhzZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoc2hvcnRjdXQiPnBhdGhzaG9ydGN1dDwvYT4pLiBGb3IgZXhhbXBsZTo8L3A+CisKIDxwcmU+Ci0gICZsdDtwYXRoIGlkPSJsaWIucGF0aC5yZWYiJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0ibGliIiBpbmNsdWRlcz0iKi5qYXIiLyZndDsKLSAgJmx0Oy9wYXRoJmd0OwotICAmbHQ7amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImNsYXNzZXMiJmd0OwotICAgICZsdDtjb21waWxlcmFyZyBhcmc9Ii1YYm9vdGNsYXNzcGF0aC9wOiR7dG9TdHJpbmc6bGliLnBhdGgucmVmfSIvJmd0OworJmx0O3BhdGggaWQ9ImxpYi5wYXRoLnJlZiImZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0ibGliIiBpbmNsdWRlcz0iKi5qYXIiLyZndDsKKyZsdDsvcGF0aCZndDsKKyZsdDtqYXZhYyBzcmNkaXI9InNyYyIgZGVzdGRpcj0iY2xhc3NlcyImZ3Q7CisgICZsdDtjb21waWxlcmFyZyBhcmc9Ii1YYm9vdGNsYXNzcGF0aC9wOiR7dG9TdHJpbmc6bGliLnBhdGgucmVmfSIvJmd0OworJmx0Oy9qYXZhYyZndDs8L3ByZT4KKworPGgzPk9wZW5KREsgbm90ZXM8L2gzPgorPHA+VGhlIDxhIGhyZWY9Imh0dHBzOi8vb3Blbmpkay5qYXZhLm5ldC8iIHRhcmdldD0iX3RvcCI+T3BlbkpESzwvYT4gcHJvamVjdCBoYXMgcHJvdmlkZWQKK3RoZSA8Y29kZT5qYXZhYzwvY29kZT4gPGEgaHJlZj0iaHR0cHM6Ly9vcGVuamRrLmphdmEubmV0L2dyb3Vwcy9jb21waWxlci8iIHRhcmdldD0iX3RvcCI+Y29tcGlsZXI8L2E+CithcyBhbiBvcGVuIHNvdXJjZSBwcm9qZWN0LiBUaGUgb3V0cHV0IG9mIHRoaXMgcHJvamVjdCBpcyBhIDxjb2RlPmphdmFjLmphcjwvY29kZT4gd2hpY2ggY29udGFpbnMKK3RoZSA8a2JkPmphdmFjPC9rYmQ+IGNvbXBpbGVyLiAgVGhpcyBjb21waWxlciBtYXkgYmUgdXNlZCB3aXRoIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrCit3aXRoIHRoZSB1c2Ugb2YgYSA8a2JkPi1YYm9vdGNsYXNzcGF0aC9wPC9rYmQ+IEphdmEgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBuZWVkcyB0byBiZSBnaXZlbiB0byB0aGUKK3J1bnRpbWUgc3lzdGVtIG9mIHRoZSA8a2JkPmphdmFjPC9rYmQ+IGV4ZWN1dGFibGUsIHNvIGl0IG5lZWRzIHRvIGJlIHByZXBlbmRlZCB3aXRoIGEgPGtiZD4tSjwva2JkPiwKK2ZvciBleGFtcGxlOjwvcD4KKworPHByZT4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJwYXRjaGVkLmphdmFjLmphciIKKyAgICAgICAgICBsb2NhdGlvbj0iJHtteS5wYXRjaGVkLmNvbXBpbGVyfS9kaXN0L2xpYi9qYXZhYy5qYXIiLyZndDsKKworJmx0O3ByZXNldGRlZiBuYW1lPSJwYXRjaGVkLmphdmFjIiZndDsKKyAgJmx0O2phdmFjIGZvcms9InllcyImZ3Q7CisgICAgJmx0O2NvbXBpbGVyYXJnIHZhbHVlPSItSi1YYm9vdGNsYXNzcGF0aC9wOiR7cGF0Y2hlZC5qYXZhYy5qYXJ9Ii8mZ3Q7CiAgICZsdDsvamF2YWMmZ3Q7Ci08L3ByZT4KLQotICAKLTwvcD4KLQotPGgzPk9wZW5KREsgTm90ZXM8L2gzPgotPHA+Ci0gIFRoZSA8YSBocmVmPSJodHRwczovL29wZW5qZGsuZGV2LmphdmEubmV0LyI+b3BlbmpkazwvYT4KLSAgcHJvamVjdCBoYXMgcHJvdmlkZWQgdGhlIGphdmFjCi0gIDxhIGhyZWY9Imh0dHBzOi8vb3Blbmpkay5kZXYuamF2YS5uZXQvY29tcGlsZXIvIj5jb21waWxlcjwvYT4KLSAgYXMgYW4gb3BlbnNvdXJjZSBwcm9qZWN0LiBUaGUgb3V0cHV0IG9mIHRoaXMgcHJvamVjdCBpcyBhCi0gIDxjb2RlPmphdmFjLmphcjwvY29kZT4gd2hpY2ggY29udGFpbnMgdGhlIGphdmFjIGNvbXBpbGVyLgotICBUaGlzIGNvbXBpbGVyIG1heSBiZSB1c2VkIHdpdGggdGhlIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2sgd2l0aAotICB0aGUgdXNlIG9mIGEgPGNvZGU+LVhib290Y2xhc3NwYXRoL3A8L2NvZGU+IGphdmEgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBuZWVkcwotICB0byBiZSBnaXZlbiB0byB0aGUgcnVudGltZSBzeXN0ZW0gb2YgdGhlIGphdmFjIGV4ZWN1dGFibGUsIHNvIGl0IG5lZWRzCi0gIHRvIGJlIHByZXBlbmRlZCB3aXRoIGEgIi1KIi4gRm9yIGV4YW1wbGU6Ci0KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJwYXRjaGVkLmphdmFjLmphciIKLSAgICAgICAgICAgIGxvY2F0aW9uPSIke215LnBhdGNoZWQuY29tcGlsZXJ9L2Rpc3QvbGliL2phdmFjLmphciIvJmd0OwotCi0gICZsdDtwcmVzZXRkZWYgbmFtZT0icGF0Y2hlZC5qYXZhYyImZ3Q7Ci0gICAgJmx0O2phdmFjIGZvcms9InllcyImZ3Q7Ci0gICAgICAmbHQ7Y29tcGlsZXJhcmcgdmFsdWU9Ii1KLVhib290Y2xhc3NwYXRoL3A6JHtwYXRjaGVkLmphdmFjLmphcn0iLyZndDsKLSAgICAmbHQ7L2phdmFjJmd0OwotICAmbHQ7L3ByZXNldGRlZiZndDsKKyZsdDsvcHJlc2V0ZGVmJmd0OwogCiAKLSAgJmx0O3BhdGNoZWQuamF2YWMgc3JjZGlyPSJzcmMvamF2YSIgZGVzdGRpcj0iYnVpbGQvY2xhc3NlcyIKLSAgICAgICAgICAgICAgICAgZGVidWc9InllcyIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0O3BhdGNoZWQuamF2YWMgc3JjZGlyPSJzcmMvamF2YSIgZGVzdGRpcj0iYnVpbGQvY2xhc3NlcyIKKyAgICAgICAgICAgICAgIGRlYnVnPSJ5ZXMiLyZndDs8L3ByZT4KIAotICA8aDM+Tm90ZSBvbiBwYWNrYWdlLWluZm8uamF2YTwvaDM+Ci0gIDxwPgotICAgIDxjb2RlPnBhY2thZ2UtaW5mby5qYXZhPC9jb2RlPiBmaWxlcyB3ZXJlIGludHJvZHVjZWQgaW4gSmF2YTUgdG8KLSAgICBhbGxvdyBwYWNrYWdlIGxldmVsIGFubm90YXRpb25zLiBPbiBjb21waWxhdGlvbiwgaWYgdGhlIGphdmEgZmlsZQotICAgIGRvZXMgbm90IGNvbnRhaW4gcnVudGltZSBhbm5vdGF0aW9ucywgdGhlcmUgd2lsbCBiZSBubyAuY2xhc3MgZmlsZQotICAgIGZvciB0aGUgamF2YSBmaWxlLiBVcCB0byA8Yj5BbnQgMS43LjE8L2I+LCB3aGVuIHRoZSAmbHQ7amF2YWMmZ3Q7Ci0gICAgdGFzayBpcyBydW4gYWdhaW4sIHRoZQotICAgIHRhc2sgd2lsbCB0cnkgdG8gY29tcGlsZSB0aGUgcGFja2FnZS1pbmZvIGphdmEgZmlsZXMgYWdhaW4uCi0gIDwvcD4KLSAgPHA+V2l0aCBBbnQgMS43LjEgYSBkaWZmZXJlbnQga2luZCBvZiBsb2dpYyB3YXMgaW50cm9kdWNlZCB0aGF0Ci0gICAgaW52b2x2ZWQgdGhlIHRpbWVzdGFtcCBvZiB0aGUgZGlyZWN0b3J5IHRoYXQgd291bGQgbm9ybWFsbHkKLSAgICBjb250YWluIHRoZSAuY2xhc3MgZmlsZS4gIFRoaXMgbG9naWMgdHVybmVkIG91dCB0byBsZWFkIHRvIEFudCBub3QKLSAgICByZWNvbXBpbGluZyA8Y29kZT5wYWNrYWdlLWluZm8uamF2YTwvY29kZT4gaW4gY2VydGFpbiBzZXR1cC48L3A+Ci0gIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuOC4wIEFudCB3aWxsIGNyZWF0ZQotICAgICJlbXB0eSIgPGNvZGU+cGFja2FnZS1pbmZvLmNsYXNzPC9jb2RlPiBmaWxlcyBpZiBpdCBjb21waWxlcwotICAgIGEgPGNvZGU+cGFja2FnZS1pbmZvLmphdmE8L2NvZGU+IGFuZAotICAgIG5vIDxjb2RlPnBhY2thZ2UtaW5mby5jbGFzczwvY29kZT4gZmlsZSBoYXMgYmVlbiBjcmVhdGVkIGJ5IHRoZQotICAgIGNvbXBpbGVyIGl0c2VsZi48L3A+Cis8aDM+Tm90ZSBvbiBwYWNrYWdlLWluZm8uamF2YTwvaDM+Cis8cD48c2FtcD5wYWNrYWdlLWluZm8uamF2YTwvc2FtcD4gZmlsZXMgd2VyZSBpbnRyb2R1Y2VkIGluIEphdmEgNSB0byBhbGxvdyBwYWNrYWdlIGxldmVsCithbm5vdGF0aW9ucy4gT24gY29tcGlsYXRpb24sIGlmIHRoZSA8Y29kZT4uamF2YTwvY29kZT4gZmlsZSBkb2VzIG5vdCBjb250YWluIHJ1bnRpbWUgYW5ub3RhdGlvbnMsCit0aGVyZSB3aWxsIGJlIG5vIGNvcnJlc3BvbmRpbmcgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlLiAgUHJpb3IgdG8gQW50IDEuNy4xLCB3aGVuCit0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzayBpcyBydW4gYWdhaW4sIHRoZSB0YXNrIHdpbGwgdHJ5IHRvIGNvbXBpbGUKK3RoZSA8c2FtcD5wYWNrYWdlLWluZm8uamF2YTwvc2FtcD4gZmlsZXMgYWdhaW4uPC9wPgorPHA+V2l0aCBBbnQgMS43LjEsIGEgZGlmZmVyZW50IGtpbmQgb2YgbG9naWMgd2FzIGludHJvZHVjZWQgdGhhdCBpbnZvbHZlZCB0aGUgdGltZXN0YW1wIG9mIHRoZQorZGlyZWN0b3J5IHRoYXQgd291bGQgbm9ybWFsbHkgY29udGFpbiB0aGUgPHNhbXA+LmNsYXNzPC9zYW1wPiBmaWxlLiAgVGhpcyBsb2dpYyB0dXJuZWQgb3V0IHRvIGxlYWQKK3RvIEFudCBub3QgcmVjb21waWxpbmcgPHNhbXA+cGFja2FnZS1pbmZvLmphdmE8L3NhbXA+IGluIGNlcnRhaW4gc2V0dXAuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LCBhbiAiZW1wdHkiIDxzYW1wPnBhY2thZ2UtaW5mby5jbGFzczwvc2FtcD4gZmlsZSBpcyBjcmVhdGVkIGlmIEFudAorY29tcGlsZXMgYSA8c2FtcD5wYWNrYWdlLWluZm8uamF2YTwvc2FtcD4gYW5kIG5vIDxzYW1wPnBhY2thZ2UtaW5mby5jbGFzczwvc2FtcD4gZmlsZSBoYXMgYmVlbgorY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgaXRzZWxmLjwvcD4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qYXZhY2MuaHRtbCBiL21hbnVhbC9UYXNrcy9qYXZhY2MuaHRtbAppbmRleCAzYzBkY2ZhLi5lNDBjN2U4IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvamF2YWNjLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2phdmFjYy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTk3ICsxNSwxNzggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkphdmFDQyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJqYXZhY2MiPkphdmFDQzwvYT48L2gyPgorPGgyIGlkPSJqYXZhY2MiPkphdmFDQzwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Ci0gIEludm9rZXMgdGhlIDxhIEhSRUY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyIgdGFyZ2V0PSJfdG9wIj5KYXZhQ0M8L2E+IGNvbXBpbGVyCi0gIGNvbXBpbGVyIG9uIGEgZ3JhbW1hciBmaWxlLgotPC9wPgotPHA+Ci0gIFRvIHVzZSB0aGUgamF2YWNjIHRhc2ssIHNldCB0aGUgPGk+dGFyZ2V0PC9pPiBhdHRyaWJ1dGUgdG8gdGhlIG5hbWUgb2YgdGhlCi0gIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZwotICB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgPGk+amF2YWNjaG9tZTwvaT4gYXR0cmlidXRlLCBzbyB0aGF0IEFwYWNoZSBBbnQKLSAgY2FuIGZpbmQgdGhlIEphdmFDQyBjbGFzc2VzLiAgT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUKLSAgPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gYSBzcGVjaWZpYyBkaXJlY3RvcnkuCi0gIE90aGVyd2lzZSBqYXZhY2Mgd3JpdGVzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCi0gIHRoZSBncmFtbWFyIGZpbGUuCi08L3A+Ci08cD4KLSAgVGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKYXZhQ0MgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBnZW5lcmF0ZWQKLSAgSmF2YSBmaWxlcy4gIGphdmFjYyBhc3N1bWVzIHRoYXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHBhcnNlcgotICBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiB0aGUgZ3JhbW1hciBmaWxlLCBpZ25vcmluZyB0aGUgLmpqLgotICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIGphdmFjYyB0YXNrIHdpbGwgc3RpbGwgd29yaywgYnV0IGl0IHdpbGwgYWx3YXlzCi0gIGdlbmVyYXRlIHRoZSBvdXRwdXQgZmlsZXMuCi08L3A+Cis8cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwczovL2phdmFjYy5vcmcvIiB0YXJnZXQ9Il90b3AiPkphdmFDQzwvYT4gY29tcGlsZXIgY29tcGlsZXIgb24gYSBncmFtbWFyCitmaWxlLjwvcD4KKzxwPlRvIHVzZSB0aGUgPGNvZGU+amF2YWNjPC9jb2RlPiB0YXNrLCBzZXQgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUKK2dyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiAgWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbgordXNpbmcgdGhlIDx2YXI+amF2YWNjaG9tZTwvdmFyPiBhdHRyaWJ1dGUsIHNvIHRoYXQgQXBhY2hlIEFudCBjYW4gZmluZCB0aGUgSmF2YUNDIGNsYXNzZXMuCitPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZSA8dmFyPm91dHB1dGRpcmVjdG9yeTwvdmFyPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgdG8gYQorc3BlY2lmaWMgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlIEphdmFDQyB3cml0ZXMgdGhlIGdlbmVyYXRlZCBmaWxlcyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCitncmFtbWFyIGZpbGUuPC9wPgorPHA+VGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKYXZhQ0MgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBnZW5lcmF0ZWQgPHNhbXA+LmphdmE8L3NhbXA+CitmaWxlcy4gIEphdmFDQyBhc3N1bWVzIHRoYXQgdGhlIEphdmEgY2xhc3MgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHBhcnNlciBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZgordGhlIGdyYW1tYXIgZmlsZSwgaWdub3JpbmcgdGhlIDxzYW1wPi5qajwvc2FtcD4uICBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgdGhlIDxjb2RlPmphdmFjYzwvY29kZT4KK3Rhc2sgd2lsbCBzdGlsbCB3b3JrLCBidXQgaXQgd2lsbCBhbHdheXMgZ2VuZXJhdGUgdGhlIG91dHB1dCBmaWxlcy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dGFyZ2V0PC90ZD4KKyAgICA8dGQ+VGhlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmphdmFjY2hvbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5qYXZhY2Nob21lPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGRpcmVjdG9yeTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSBkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBmaWxlcyB0by4gIElmIG5vdCBzZXQsIHRoZSBmaWxlcwotICAgICAgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+b3V0cHV0ZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIHRvLiAgSWYgbm90IHNldCwgdGhlIGZpbGVzIGFyZSB3cml0dGVuIHRvIHRoZQorICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWxkcGFyc2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIEJVSUxEX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5idWlsZHBhcnNlcjwvdGQ+CisgICAgPHRkPlNldHMgdGhlIEJVSUxEX1BBUlNFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWxkdG9rZW5tYW5hZ2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIEJVSUxEX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YnVpbGR0b2tlbm1hbmFnZXI8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBCVUlMRF9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGV0b2tlbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgQ0FDSEVfVE9LRU5TIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNhY2hldG9rZW5zPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgQ0FDSEVfVE9LRU5TIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hvaWNlYW1iaWd1aXR5Y2hlY2s8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgQ0hPSUNFX0FNQklHVUlUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYW4gaW50ZWdlciBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2hvaWNlYW1iaWd1aXR5Y2hlY2s8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG9wdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1vbnRva2VuYWN0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIENPTU1PTl9UT0tFTl9BQ1RJT04gZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y29tbW9udG9rZW5hY3Rpb248L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBDT01NT05fVE9LRU5fQUNUSU9OIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdsb29rYWhlYWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgREVCVUdfTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlYnVnbG9va2FoZWFkPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgREVCVUdfTE9PS0FIRUFEIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWdwYXJzZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlYnVncGFyc2VyPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgREVCVUdfUEFSU0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWd0b2tlbm1hbmFnZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgREVCVUdfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWJ1Z3Rva2VubWFuYWdlcjwvdGQ+CisgICAgPHRkPlNldHMgdGhlIERFQlVHX1RPS0VOX01BTkFHRVIgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnJlcG9ydGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3JyZXBvcnRpbmc8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBFUlJPUl9SRVBPUlRJTkcgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZWxhY2hlY2s8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgRk9SQ0VfTEFfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Zm9yY2VsYWNoZWNrPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgRk9SQ0VfTEFfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVjYXNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIElHTk9SRV9DQVNFIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmlnbm9yZWNhc2U8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBJR05PUkVfQ0FTRSBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmphdmF1bmljb2RlZXNjYXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIEpBVkFfVU5JQ09ERV9FU0NBUEUgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+amF2YXVuaWNvZGVlc2NhcGU8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBKQVZBX1VOSUNPREVfRVNDQVBFIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+amRrdmVyc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBKREtfVkVSU0lPTiBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+ICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZWVwbGluZWNvbHVtbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBLRUVQX0xJTkVfQ09MVU1OIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmpka3ZlcnNpb248L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBKREtfVkVSU0lPTiBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9va2FoZWFkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIExPT0tBSEVBRCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYW4gaW50ZWdlciBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+a2VlcGxpbmVjb2x1bW48L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBLRUVQX0xJTkVfQ09MVU1OIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3B0aW1pemV0b2tlbm1hbmFnZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5sb29rYWhlYWQ8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBMT09LQUhFQUQgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGFuIGludGVnZXIgb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3RoZXJhbWJpZ3VpdHljaGVjazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBPVEhFUl9BTUJJR1VJVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGFuIGludGVnZXIgb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm9wdGltaXpldG9rZW5tYW5hZ2VyPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNhbml0eWNoZWNrPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIFNBTklUWV9DSEVDSyBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5vdGhlcmFtYmlndWl0eWNoZWNrPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgT1RIRVJfQU1CSUdVSVRZX0NIRUNLIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG9wdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0YXRpYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBTVEFUSUMgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2FuaXR5Y2hlY2s8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBTQU5JVFlfQ0hFQ0sgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bmljb2RlaW5wdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyB0aGUgVU5JQ09ERV9JTlBVVCBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdGF0aWM8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBTVEFUSUMgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51c2VyY2hhcnN0cmVhbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBVU0VSX0NIQVJfU1RSRUFNIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnVuaWNvZGVpbnB1dDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIFVOSUNPREVfSU5QVVQgZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51c2VydG9rZW5tYW5hZ2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNldHMgdGhlIFVTRVJfVE9LRU5fTUFOQUdFUiBncmFtbWFyIG9wdGlvbi4gIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51c2VyY2hhcnN0cmVhbTwvdGQ+CisgICAgPHRkPlNldHMgdGhlIFVTRVJfQ0hBUl9TVFJFQU0gZ3JhbW1hciBvcHRpb24uICBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZAotICAgICAgVk0uICA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD51c2VydG9rZW5tYW5hZ2VyPC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgVVNFUl9UT0tFTl9NQU5BR0VSIGdyYW1tYXIgb3B0aW9uLiAgVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZD5NYXggYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSB0byB0aGUgZm9ya2VkIEpWTS4gIDxlbT5zaW5jZSBBbnQgMS44LjM8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZTwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2phdmFjYwotICAgIHRhcmdldD0mcXVvdDtzcmMvUGFyc2VyLmpqJnF1b3Q7Ci0gICAgb3V0cHV0ZGlyZWN0b3J5PSZxdW90O2J1aWxkL3NyYyZxdW90OwotICAgIGphdmFjY2hvbWU9JnF1b3Q7YzovcHJvZ3JhbSBmaWxlcy9KYXZhQ0MmcXVvdDsKLSAgICBzdGF0aWM9JnF1b3Q7dHJ1ZSZxdW90OwotLyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotICBUaGlzIGludm9rZXMgSmF2YUNDIG9uIGdyYW1tYXIgZmlsZSBzcmMvUGFyc2VyLmpqLCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQKLSAgZmlsZXMgdG8gYnVpbGQvc3JjLiAgVGhlIGdyYW1tYXIgb3B0aW9uIFNUQVRJQyBpcyBzZXQgdG8gdHJ1ZSB3aGVuCi0gIGludm9raW5nIEphdmFDQy4KLTwvcD4KIAorPHA+SW52b2tlIEphdmFDQyBvbiBncmFtbWFyIGZpbGUgPHNhbXA+c3JjL1BhcnNlci5qajwvc2FtcD4sIHdyaXRpbmcgdGhlIGdlbmVyYXRlZCBmaWxlcwordG8gPHNhbXA+YnVpbGQvc3JjPC9zYW1wPi4gVGhlIGdyYW1tYXIgb3B0aW9uIFNUQVRJQyBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4gd2hlbiBpbnZva2luZyBKYXZhQ0MuPC9wPgorPHByZT4KKyZsdDtqYXZhY2MgdGFyZ2V0PSZxdW90O3NyYy9QYXJzZXIuamomcXVvdDsKKyAgICAgICAgb3V0cHV0ZGlyZWN0b3J5PSZxdW90O2J1aWxkL3NyYyZxdW90OworICAgICAgICBqYXZhY2Nob21lPSZxdW90O2M6L3Byb2dyYW0gZmlsZXMvSmF2YUNDJnF1b3Q7CisgICAgICAgIHN0YXRpYz0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCi0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qYXZhZG9jLmh0bWwgYi9tYW51YWwvVGFza3MvamF2YWRvYy5odG1sCmluZGV4IGZlOWQ4ZWYuLjQ1MjIzM2MgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9qYXZhZG9jLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2phdmFkb2MuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDY4MSArMTUsNjM4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5KYXZhZG9jIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImphdmFkb2MiPkphdmFkb2MvPGk+SmF2YWRvYzI8L2k+PC9hPjwvaDI+Cis8aDIgaWQ9ImphdmFkb2MiPkphdmFkb2MvPGVtPkphdmFkb2MyPC9lbT48L2gyPgorPHA+PGVtPjx1PkRlcHJlY2F0aW9uPC91PjogdGhlIDxjb2RlPmphdmFkb2MyPC9jb2RlPiB0YXNrIHNpbXBseSBwb2ludHMgdG8gdGhlIDxjb2RlPmphdmFkb2M8L2NvZGU+Cit0YXNrIGFuZCBpdCdzIHRoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLiBTaW5jZSB0aGlzIHRhc2sgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZQordmVyc2lvbnMsIHlvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgPGEgaHJlZj0iamF2YWRvYy5odG1sIj5qYXZhZG9jPC9hPiBpbnN0ZWFkLjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkdlbmVyYXRlcyBjb2RlIGRvY3VtZW50YXRpb24gdXNpbmcgdGhlIGphdmFkb2MgdG9vbC48L3A+Ci08cD5UaGUgc291cmNlIGRpcmVjdG9yeSB3aWxsIGJlIHJlY3Vyc2l2ZWx5IHNjYW5uZWQgZm9yIEphdmEgc291cmNlIGZpbGVzIHRvIHByb2Nlc3MKLWJ1dCBvbmx5IHRob3NlIG1hdGNoaW5nIHRoZSBpbmNsdXNpb24gcnVsZXMsIGFuZCBub3QgbWF0Y2hpbmcgdGhlIGV4Y2x1c2lvbnMgcnVsZXMKLXdpbGwgYmUgcGFzc2VkIHRvIHRoZSBqYXZhZG9jIHRvb2wuIFRoaXMKLWFsbG93cyB3aWxkY2FyZHMgdG8gYmUgdXNlZCB0byBjaG9vc2UgYmV0d2VlbiBwYWNrYWdlIG5hbWVzLCByZWR1Y2luZyB2ZXJib3NpdHkKLWFuZCBtYW5hZ2VtZW50IGNvc3RzIG92ZXIgdGltZS4gVGhpcyB0YXNrLCBob3dldmVyLCBoYXMgbm8gbm90aW9uIG9mCi0mcXVvdDtjaGFuZ2VkJnF1b3Q7IGZpbGVzLCB1bmxpa2UgdGhlIDxhIGhyZWY9ImphdmFjLmh0bWwiPmphdmFjPC9hPiB0YXNrLiBUaGlzIG1lYW5zCi1hbGwgcGFja2FnZXMgd2lsbCBiZSBwcm9jZXNzZWQgZWFjaCB0aW1lIHRoaXMgdGFzayBpcyBydW4uIEluIGdlbmVyYWwsIGhvd2V2ZXIsCi10aGlzIHRhc2sgaXMgdXNlZCBtdWNoIGxlc3MgZnJlcXVlbnRseS48L3A+Ci08cD5OT1RFOiBzaW5jZSBqYXZhZG9jIGNhbGxzIFN5c3RlbS5leGl0KCksIGphdmFkb2MgY2Fubm90IGJlIHJ1biBpbnNpZGUgdGhlCi1zYW1lIFZNIGFzIEFwYWNoZSBBbnQgd2l0aG91dCBicmVha2luZyBmdW5jdGlvbmFsaXR5LiBGb3IgdGhpcyByZWFzb24sIHRoaXMgdGFzawotYWx3YXlzIGZvcmtzIHRoZSBWTS4gVGhpcyBvdmVyaGVhZCBpcyBub3Qgc2lnbmlmaWNhbnQgc2luY2UgamF2YWRvYyBpcyBub3JtYWxseSBhIGhlYXZ5Ci1hcHBsaWNhdGlvbiBhbmQgd2lsbCBiZSBjYWxsZWQgaW5mcmVxdWVudGx5LjwvcD4KLTxwPk5PVEU6IHRoZSBwYWNrYWdlbGlzdCBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsaXN0IG9mIHBhY2thZ2VzIHRvCi1kb2N1bWVudCBvdXRzaWRlIG9mIHRoZSBBbnQgZmlsZS4gSXQncyBhIG11Y2ggYmV0dGVyIHByYWN0aWNlIHRvIGluY2x1ZGUgZXZlcnl0aGluZwotaW5zaWRlIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUuIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciB0bwotbWlncmF0ZSBmcm9tIHJlZ3VsYXIgbWFrZWZpbGVzLCB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgb3B0aW9uIG9mIGphdmFkb2MuCi1UaGUgcGFja2FnZXMgbGlzdGVkIGluIHBhY2thZ2VsaXN0IGFyZSBub3QgY2hlY2tlZCwgc28gdGhlIHRhc2sgcGVyZm9ybXMgZXZlbgotaWYgc29tZSBwYWNrYWdlcyBhcmUgbWlzc2luZyBvciBicm9rZW4uIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBjb252ZXJ0IGZyb20KLWFuIGV4aXN0aW5nIG1ha2VmaWxlLiBPbmNlIHRoaW5ncyBhcmUgcnVubmluZyB5b3Ugc2hvdWxkIHRoZW4gc3dpdGNoIHRvIHRoZSByZWd1bGFyCi1ub3RhdGlvbi4gPC9wPgorPHA+R2VuZXJhdGVzIGNvZGUgZG9jdW1lbnRhdGlvbiB1c2luZyB0aGUgPGtiZD5qYXZhZG9jPC9rYmQ+IHRvb2wuPC9wPgorPHA+VGhlIHNvdXJjZSBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvciBKYXZhIHNvdXJjZSBmaWxlcyB0byBwcm9jZXNzIGJ1dCBvbmx5IHRob3NlCittYXRjaGluZyB0aGUgaW5jbHVzaW9uIHJ1bGVzLCBhbmQgbm90IG1hdGNoaW5nIHRoZSBleGNsdXNpb25zIHJ1bGVzIHdpbGwgYmUgcGFzc2VkIHRvCit0aGUgPGtiZD5qYXZhZG9jPC9rYmQ+IHRvb2wuIFRoaXMgYWxsb3dzIHdpbGRjYXJkcyB0byBiZSB1c2VkIHRvIGNob29zZSBiZXR3ZWVuIHBhY2thZ2UgbmFtZXMsCityZWR1Y2luZyB2ZXJib3NpdHkgYW5kIG1hbmFnZW1lbnQgY29zdHMgb3ZlciB0aW1lLiBUaGlzIHRhc2ssIGhvd2V2ZXIsIGhhcyBubyBub3Rpb24gb2YKKyZxdW90O2NoYW5nZWQmcXVvdDsgZmlsZXMsIHVubGlrZSB0aGUgPGEgaHJlZj0iamF2YWMuaHRtbCI+amF2YWM8L2E+IHRhc2suIFRoaXMgbWVhbnMgYWxsIHBhY2thZ2VzCit3aWxsIGJlIHByb2Nlc3NlZCBlYWNoIHRpbWUgdGhpcyB0YXNrIGlzIHJ1bi4gSW4gZ2VuZXJhbCwgaG93ZXZlciwgdGhpcyB0YXNrIGlzIHVzZWQgbXVjaCBsZXNzCitmcmVxdWVudGx5LjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogc2luY2UgPGtiZD5qYXZhZG9jPC9rYmQ+CitjYWxscyA8Y29kZSBjbGFzcz0iY29kZSI+U3lzdGVtLmV4aXQoKTwvY29kZT4sIDxrYmQ+amF2YWRvYzwva2JkPiBjYW5ub3QgYmUgcnVuIGluc2lkZSB0aGUgc2FtZQorSlZNIGFzIEFwYWNoZSBBbnQgd2l0aG91dCBicmVha2luZyBmdW5jdGlvbmFsaXR5LiBGb3IgdGhpcyByZWFzb24sIHRoaXMgdGFzayBhbHdheXMgZm9ya3MgSlZNLiBUaGlzCitvdmVyaGVhZCBpcyBub3Qgc2lnbmlmaWNhbnQgc2luY2UgPGtiZD5qYXZhZG9jPC9rYmQ+IGlzIG5vcm1hbGx5IGEgaGVhdnkgYXBwbGljYXRpb24gYW5kIHdpbGwgYmUKK2NhbGxlZCBpbmZyZXF1ZW50bHkuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiB0aGUgPHZhcj5wYWNrYWdlbGlzdDwvdmFyPiBhdHRyaWJ1dGUgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBsaXN0IG9mCitwYWNrYWdlcyB0byBkb2N1bWVudCBvdXRzaWRlIG9mIHRoZSBBbnQgZmlsZS4gSXQncyBhIG11Y2ggYmV0dGVyIHByYWN0aWNlIHRvIGluY2x1ZGUgZXZlcnl0aGluZworaW5zaWRlIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUuIFRoaXMgb3B0aW9uIHdhcyBhZGRlZCBpbiBvcmRlciB0byBtYWtlIGl0IGVhc2llciB0byBtaWdyYXRlCitmcm9tIHJlZ3VsYXIgbWFrZWZpbGVzLCB3aGVyZSB5b3Ugd291bGQgdXNlIHRoaXMgb3B0aW9uIG9mIDxrYmQ+amF2YWRvYzwva2JkPi4gIFRoZSBwYWNrYWdlcworbGlzdGVkIGluIDx2YXI+cGFja2FnZWxpc3Q8L3Zhcj4gYXJlIG5vdCBjaGVja2VkLCBzbyB0aGUgdGFzayBwZXJmb3JtcyBldmVuIGlmIHNvbWUgcGFja2FnZXMgYXJlCittaXNzaW5nIG9yIGJyb2tlbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHlvdSB3aXNoIHRvIGNvbnZlcnQgZnJvbSBhbiBleGlzdGluZyBtYWtlZmlsZS4gT25jZSB0aGluZ3MgYXJlCitydW5uaW5nIHlvdSBzaG91bGQgdGhlbiBzd2l0Y2ggdG8gdGhlIHJlZ3VsYXIgbm90YXRpb24uPC9wPgogCi08cD48aT48Yj5ERVBSRUNBVElPTjo8L2I+IHRoZSBqYXZhZG9jMiB0YXNrIHNpbXBseSBwb2ludHMgdG8gdGhlIGphdmFkb2MgdGFzayBhbmQgaXQncwotdGhlcmUgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSByZWFzb25zLiBTaW5jZSB0aGlzIHRhc2sgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZQotdmVyc2lvbnMsIHlvdSBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgPGEgaHJlZj0iamF2YWRvYy5odG1sIj5qYXZhZG9jPC9hPgotaW5zdGVhZC48L2k+PC9wPgorPHA+SW4gdGhlIHRhYmxlIGJlbG93LCAxLjIgbWVhbnMgYXZhaWxhYmxlIGlmIHlvdXIgY3VycmVudCBKVk0gaXMgZXhhY3RseSBvZiB2ZXJzaW9uIDEuMiAobm90IDEuMyBvcgorbGF0ZXIpLCAxLjQrIGZvciBhbnkgSlZNIG9mIGF0IGxlYXN0IHZlcnNpb24gMS40LCBvdGhlcndpc2UgYW55IEpWTSBvZiBhdCBsZWFzdCB2ZXJzaW9uIDEuMiBpcworYWNjZXB0YWJsZS4gPGVtPkpES3MgcHJpb3IgdG8gMS40IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLjwvZW0+ICBJZiB5b3Ugc3BlY2lmeQordGhlIDx2YXI+ZXhlY3V0YWJsZTwvdmFyPiBhdHRyaWJ1dGUgaXQgaXMgdXAgdG8geW91IHRvIGVuc3VyZSB0aGF0IHRoaXMgY29tbWFuZCBzdXBwb3J0cyB0aGUKK2F0dHJpYnV0ZXMgeW91IHdpc2ggdG8gdXNlLjwvcD4KIAotPHA+SW4gdGhlIHRhYmxlIGJlbG93LCAxLjIgbWVhbnMgYXZhaWxhYmxlIGlmIHlvdXIgY3VycmVudCBKYXZhIFZNIGlzCi1hIDEuMiBWTSAoYnV0IG5vdCAxLjMgb3IgbGF0ZXIpLCAxLjQrIGZvciBhbnkgVk0gb2YgYXQgbGVhc3QgdmVyc2lvbiAxLjQsIG90aGVyd2lzZQotYW55IFZNIG9mIGF0IGxlYXN0IHZlcnNpb24gMS4yIGlzIGFjY2VwdGFibGUuIEpES3MgJmx0OzEuNCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLUlmIHlvdSBzcGVjaWZ5IHRoZSA8Y29kZT5leGVjdXRhYmxlPC9jb2RlPiBhdHRyaWJ1dGUgaXQgaXMgdXAgdG8geW91Ci10byBlbnN1cmUgdGhhdCB0aGlzIGNvbW1hbmQgc3VwcG9ydHMgdGhlIGF0dHJpYnV0ZXMgeW91IHdpc2ggdG8gdXNlLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogV2hlbiBnZW5lcmF0aW5nIHRoZSBKYXZhRG9jcyBmb3IgY2xhc3NlcyB3aGljaCBjb250YWlucyBhbm5vdGF0aW9ucyB5b3UKK21heWJlIGdldCBhIDxjb2RlIGNsYXNzPSJvdXRwdXQiPmphdmEubGFuZy5DbGFzc0Nhc3RFeGNlcHRpb246Citjb20uc3VuLnRvb2xzLmphdmFkb2MuQ2xhc3NEb2NJbXBsPC9jb2RlPi4gIFRoaXMgaXMKK2R1ZSA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTY0NDI5ODIiIHRhcmdldD0iX3RvcCI+YnVnIDY0NDI5ODI8L2E+LiBUaGUKK2NhdXNlIGlzIHRoYXQgPGtiZD5qYXZhZG9jPC9rYmQ+IGNhbm5vdCBmaW5kIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdXNlZCBhbm5vdGF0aW9ucy4gIFRoZQord29ya2Fyb3VuZCBpcyBwcm92aWRpbmcgdGhlIGphcnMgd2l0aCB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgKGxpa2UKK0pBWEJzIDxjb2RlIGNsYXNzPSJjb2RlIj5AWG1sVHlwZTwvY29kZT4sIC4uLikgIHRvIDxjb2RlPiZsdDtqYXZhZG9jJmd0OzwvY29kZT4KK3VzaW5nIDx2YXI+Y2xhc3NwYXRoPC92YXI+LCA8dmFyPmNsYXNzcGF0aHJlZjwvdmFyPiBhdHRyaWJ1dGVzIG9yCituZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgogCi08cD48Yj5Ob3RlOjwvYj48YnI+V2hlbiBnZW5lcmF0aW5nIHRoZSBKYXZhRG9jcyBmb3IgY2xhc3NlcyB3aGljaCBjb250YWlucyBhbm5vdGF0aW9ucwoteW91IG1heWJlIGdldCBhIDx0dD5qYXZhLmxhbmcuQ2xhc3NDYXN0RXhjZXB0aW9uOiBjb20uc3VuLnRvb2xzLmphdmFkb2MuQ2xhc3NEb2NJbXBsPC90dD4uCi1UaGlzIGlzIGR1ZSA8YSBocmVmPSJodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTY0NDI5ODIiIHRhcmdldD0iX2JsYW5rIj5idWctNjQ0Mjk4MjwvYT4uIFRoZSBjYXVzZSBpcyB0aGF0IEphdmFEb2MgY2Fubm90IGZpbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB1c2VkIGFubm90YXRpb25zLgotVGhlIHdvcmthcm91bmQgaXMgcHJvdmlkaW5nIHRoZSBqYXJzIHdpdGggdGhlc2UgaW1wbGVtZW50YXRpb25zIChsaWtlIEpBWEJzIDx0dD5AWG1sVHlwZTwvdHQ+LCAuLi4pCi10byAmbHQ7amF2YWRvYyZndDsgdXNpbmcgPHR0PmNsYXNzcGF0aDwvdHQ+LCA8dHQ+Y2xhc3NwYXRocmVmPC90dD4gYXR0cmlidXRlcyBvciBuZXN0ZWQKLSZsdDtjbGFzc3BhdGgmZ3Q7IGVsZW1lbnQuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBtYW55IHByb2JsZW1zIHdpdGggcnVubmluZyA8a2JkPmphdmFkb2M8L2tiZD4gc3RlbSBmcm9tIGNvbW1hbmQgbGluZXMKK3RoYXQgaGF2ZSBiZWNvbWUgdG9vIGxvbmcmbWRhc2g7ZXZlbiB0aG91Z2ggdGhlIGVycm9yIG1lc3NhZ2UgZG9lc24ndCBnaXZlIHRoZSBzbGlnaHRlc3QgaGludCB0aGlzCittYXkgYmUgdGhlIHByb2JsZW0uICBJZiB5b3UgZW5jb3VudGVyIHByb2JsZW1zIHdpdGggdGhlIHRhc2ssIHRyeSB0byBzZXQKK3RoZSA8dmFyPnVzZWV4dGVybmFsZmlsZTwvdmFyPiBhdHRyaWJ1dGUgdG8gPHE+dHJ1ZTwvcT4gZmlyc3QuPC9wPgogCi08cD48Yj5Ob3RlOjwvYj4gbWFueSBwcm9ibGVtcyB3aXRoIHJ1bm5pbmcgamF2YWRvYyBzdGVtIGZyb20gY29tbWFuZAotICBsaW5lcyB0aGF0IGhhdmUgYmVjb21lIHRvbyBsb25nIC0gZXZlbiB0aG91Z2ggdGhlIGVycm9yIG1lc3NhZ2UKLSAgZG9lc24ndCBnaXZlIHRoZSBzbGlnaHRlc3QgaGludCB0aGlzIG1heSBiZSB0aGUgcHJvYmxlbS4gIElmIHlvdQotICBlbmNvdW50ZXIgcHJvYmxlbXMgd2l0aCB0aGUgdGFzaywgdHJ5IHRvIHNldAotICB0aGUgPGNvZGU+dXNlZXh0ZXJuYWxmaWxlPC9jb2RlPiBhdHRyaWJ1dGUgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KLSAgZmlyc3QuPC9wPgotCi08cD5JZiB5b3UgdXNlIG11bHRpcGxlIHdheXMgdG8gc3BlY2lmeSB3aGVyZSBqYXZhZG9jIHNob3VsZCBiZSBsb29raW5nCi0gIGZvciBzb3VyY2VzIHlvdXIgcmVzdWx0IHdpbGwgYmUgdGhlIHVuaW9uIG9mIGFsbCBzcGVjaWZpZWQKLSAgZG9jdW1lbnRhdGlvbnMuICBJZiB5b3UsIGUuZy4sIHNwZWNpZnkgYSBzb3VyY2VwYXRoIGF0dHJpYnV0ZSBhbmQKLSAgYWxzbyBhIG5lc3RlZCBwYWNrYWdlc2V0IGJvdGggcG9pbnRpbmcgYXQgdGhlIHNhbWUgZGlyZWN0b3J5IHlvdXIKLSAgZXhjbHVkZXBhY2thZ2VuYW1lcyBhdHRyaWJ1dGUgd29uJ3QgaGF2ZSBhbnkgZWZmZWN0IHVubGVzcyBpdCBhZ3JlZXMKLSAgd2l0aCB0aGUgZXhjbHVkZSBwYXR0ZXJucyBvZiB0aGUgcGFja2FnZXNldCAoYW5kIHZpY2UgdmVyc2EpLjwvcD4KKzxwPklmIHlvdSB1c2UgbXVsdGlwbGUgd2F5cyB0byBzcGVjaWZ5IHdoZXJlIDxrYmQ+amF2YWRvYzwva2JkPiBzaG91bGQgYmUgbG9va2luZyBmb3Igc291cmNlcywgeW91cgorcmVzdWx0IHdpbGwgYmUgdGhlIHVuaW9uIG9mIGFsbCBzcGVjaWZpZWQgZG9jdW1lbnRhdGlvbnMuICBJZiB5b3UsIGUuZy4sIHNwZWNpZnkKK2EgPHZhcj5zb3VyY2VwYXRoPC92YXI+IGF0dHJpYnV0ZSBhbmQgYWxzbyBhIG5lc3RlZCA8Y29kZT5wYWNrYWdlc2V0PC9jb2RlPiBib3RoIHBvaW50aW5nIGF0IHRoZQorc2FtZSBkaXJlY3RvcnkgeW91ciA8dmFyPmV4Y2x1ZGVwYWNrYWdlbmFtZXM8L3Zhcj4gYXR0cmlidXRlIHdvbid0IGhhdmUgYW55IGVmZmVjdCB1bmxlc3MgaXQgYWdyZWVzCit3aXRoIHRoZSA8dmFyPmV4Y2x1ZGU8L3Zhcj4gcGF0dGVybnMgb2YgdGhlIDxjb2RlPnBhY2thZ2VzZXQ8L2NvZGU+IChhbmQgdmljZSB2ZXJzYSkuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+QXZhaWxhYmlsaXR5IG9uIEphdmE8L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXZhaWxhYmlsaXR5IG9uIEphdmE8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZXBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5BdCBsZWFzdCBvbmUgb2YgdGhlIGZvdXIgb3IgbmVzdGVkCi0gICAgICA8Y29kZT4mbHQ7c291cmNlcGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LgorICAgIDx0ZD5zb3VyY2VwYXRoPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBmaW5kIHNvdXJjZSBmaWxlczwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjQiPkF0IGxlYXN0IG9uZSBvZiB0aGUgZm91ciBvcgorICAgICAgbmVzdGVkIDxjb2RlPiZsdDtzb3VyY2VwYXRoJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sCiAgICAgICA8Y29kZT5tb2R1bGU8L2NvZGU+IG9yIDxjb2RlPiZsdDtwYWNrYWdlc2V0Jmd0OzwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2VwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBzb3VyY2UgZmlsZXMgYnkgPGEKLSAgICAgIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIFBBVEggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkPnNvdXJjZXBhdGhyZWY8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgc291cmNlIGZpbGVzIGJ5IDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhCisgICAgICA8dmFyPnNvdXJjZXBhdGg8L3Zhcj4gZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmFsbDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZWZpbGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNvdXJjZSBmaWxlcyAtLSBzZWUgYWxzbwotICAgIHRoZSBuZXN0ZWQgPGNvZGU+c291cmNlPC9jb2RlPiBlbGVtZW50LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgorICAgIDx0ZD5zb3VyY2VmaWxlczwvdGQ+CisgICAgPHRkPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHNvdXJjZSBmaWxlcyZtZGFzaDtzZWUgYWxzbyB0aGUgbmVzdGVkIDxjb2RlPnNvdXJjZTwvY29kZT4KKyAgICAgIGVsZW1lbnQuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmFsbDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1vZHVsZW5hbWVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcyAtLSBzZWUgYWxzbwotICAgIHRoZSBuZXN0ZWQgPGNvZGU+bW9kdWxlPC9jb2RlPiBlbGVtZW50LiA8ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+CisgICAgPHRkPm1vZHVsZW5hbWVzPC90ZD4KKyAgICA8dGQ+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIC0tIHNlZSBhbHNvCisgICAgdGhlIG5lc3RlZCA8Y29kZT5tb2R1bGU8L2NvZGU+IGVsZW1lbnQuIDxlbT5zaW5jZSBBbnQgMS4xMC42PC9lbT48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3Igb3V0cHV0IGZpbGVzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIGRvY2xldCBoYXMgYmVlbiBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPkRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3Igb3V0cHV0IGZpbGVzPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSA8dmFyPmRvY2xldDwvdmFyPiBoYXMgYmVlbiBzcGVjaWZpZWQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4bWVtb3J5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1heCBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBqYXZhZG9jIFZNPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1heG1lbW9yeTwvdGQ+CisgICAgPHRkPk1heCBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSA8a2JkPmphdmFkb2M8L2tiZD4gSlZNPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlbmFtZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBmaWxlcyAod2l0aCB0ZXJtaW5hdGluZwotICAgICAgd2lsZGNhcmQpIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQgPGNvZGU+cGFja2FnZTwvY29kZT4gZWxlbWVudC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cGFja2FnZW5hbWVzPC90ZD4KKyAgICA8dGQ+Q29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBmaWxlcyAod2l0aCB0ZXJtaW5hdGluZyB3aWxkY2FyZCkmbWRhc2g7c2VlIGFsc28gdGhlCisgICAgICBuZXN0ZWQgPGNvZGU+cGFja2FnZTwvY29kZT4gZWxlbWVudC48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2VMaXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBwYWNrYWdlcyB0byBwcm9jZXNzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnBhY2thZ2VMaXN0PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBhY2thZ2VzIHRvIHByb2Nlc3M8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlczwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Qm9vdGNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVycmlkZSBsb2NhdGlvbiBvZiBjbGFzcyBmaWxlcyBsb2FkZWQgYnkgdGhlIGJvb3RzdHJhcAotICAgICAgY2xhc3MgbG9hZGVyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPkJvb3RjbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5PdmVycmlkZSBsb2NhdGlvbiBvZiBjbGFzcyBmaWxlcyBsb2FkZWQgYnkgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXI8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgdXNlciBjbGFzcyBmaWxlcyBieSA8YQotICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBmaW5kIHVzZXIgY2xhc3MgZmlsZXMgYnkgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICB0byBhIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vdGNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVycmlkZSBsb2NhdGlvbiBvZiBjbGFzcyBmaWxlcyBsb2FkZWQgYnkgdGhlCi0gICAgICBib290c3RyYXAgY2xhc3MgbG9hZGVyIGJ5IDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhCi0gICAgICBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ib290Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+T3ZlcnJpZGUgbG9jYXRpb24gb2YgY2xhc3MgZmlsZXMgbG9hZGVkIGJ5IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyCisgICAgICBieSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSA8dmFyPmJvb3RjbGFzc3BhdGg8L3Zhcj4gZGVmaW5lZAorICAgICAgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RXh0ZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVycmlkZSBsb2NhdGlvbiBvZiBpbnN0YWxsZWQgZXh0ZW5zaW9uczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5FeHRkaXJzPC90ZD4KKyAgICA8dGQ+T3ZlcnJpZGUgbG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnM8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ2aWV3PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJlYWQgb3ZlcnZpZXcgZG9jdW1lbnRhdGlvbiBmcm9tIEhUTUwgZmlsZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5PdmVydmlldzwvdGQ+CisgICAgPHRkPlJlYWQgb3ZlcnZpZXcgZG9jdW1lbnRhdGlvbiBmcm9tIEhUTUwgZmlsZTwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWNjZXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkFjY2VzcyBtb2RlOiBvbmUgb2YgPGNvZGU+cHVibGljPC9jb2RlPiwgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPiwKLSAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnBhY2thZ2U8L2NvZGU+LCBvciA8Y29kZT5wcml2YXRlPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQgPGNvZGU+cHJvdGVjdGVkPC9jb2RlPik8L3RkPgorICAgIDx0ZD5hY2Nlc3M8L3RkPgorICAgIDx0ZD5BY2Nlc3MgbW9kZTogb25lIG9mIDxxPnB1YmxpYzwvcT4sIDxxPnByb3RlY3RlZDwvcT4sIDxxPnBhY2thZ2U8L3E+LCBvciA8cT5wcml2YXRlPC9xPjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnByb3RlY3RlZDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5QdWJsaWM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2hvdyBvbmx5IHB1YmxpYyBjbGFzc2VzIGFuZCBtZW1iZXJzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPlB1YmxpYzwvdGQ+CisgICAgPHRkPlNob3cgb25seSBwdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyczwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UHJvdGVjdGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNob3cgcHJvdGVjdGVkL3B1YmxpYyBjbGFzc2VzIGFuZCBtZW1iZXJzIChkZWZhdWx0KTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5Qcm90ZWN0ZWQ8L3RkPgorICAgIDx0ZD5TaG93IHByb3RlY3RlZC9wdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVycyAoZGVmYXVsdCk8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlBhY2thZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2hvdyBwYWNrYWdlL3Byb3RlY3RlZC9wdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5QYWNrYWdlPC90ZD4KKyAgICA8dGQ+U2hvdyBwYWNrYWdlL3Byb3RlY3RlZC9wdWJsaWMgY2xhc3NlcyBhbmQgbWVtYmVyczwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UHJpdmF0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TaG93IGFsbCBjbGFzc2VzIGFuZCBtZW1iZXJzPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPlByaXZhdGU8L3RkPgorICAgIDx0ZD5TaG93IGFsbCBjbGFzc2VzIGFuZCBtZW1iZXJzPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PbGQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+R2VuZXJhdGUgb3V0cHV0IHVzaW5nIEpESyAxLjEgZW11bGF0aW5nCi0gICAgICBkb2NsZXQuPGJyPgotICAgICAgPGI+Tm90ZTo8L2I+IGFzIG9mIEFudCAxLjguMCB0aGlzIGF0dHJpYnV0ZSBkb2Vzbid0IGhhdmUgYW55Ci0gICAgICBlZmZlY3Qgc2luY2UgdGhlIGphdmFkb2Mgb2YgSmF2YSAxLjQgKHJlcXVpcmVkIGJ5IEFudCAxLjguMCkKLSAgICAgIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgLTEuMSBzd2l0Y2ggYW55bW9yZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS4yPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+T2xkPC90ZD4KKyAgICA8dGQ+R2VuZXJhdGUgb3V0cHV0IHVzaW5nIEpESyAxLjEgZW11bGF0aW5nIGRvY2xldC48YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogPGVtPlNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPiB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8gZWZmZWN0IGJlY2F1c2UgPGtiZD5qYXZhZG9jPC9rYmQ+IG9mIEphdmEgMS40IGFuZCBsYXRlcgorICAgICAgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPGtiZD4tMS4xPC9rYmQ+IHN3aXRjaCBhbnltb3JlLjwvdGQ+CisgICAgPHRkPjEuMjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdXRwdXQgbWVzc2FnZXMgYWJvdXQgd2hhdCBKYXZhZG9jIGlzIGRvaW5nPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPlZlcmJvc2U8L3RkPgorICAgIDx0ZD5PdXRwdXQgbWVzc2FnZXMgYWJvdXQgd2hhdCA8a2JkPmphdmFkb2M8L2tiZD4gaXMgZG9pbmc8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2FsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhbGUgdG8gYmUgdXNlZCwgZS5nLiBlbl9VUyBvciBlbl9VU19XSU48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+TG9jYWxlPC90ZD4KKyAgICA8dGQ+TG9jYWxlIHRvIGJlIHVzZWQsIGUuZy4gPHE+ZW5fVVM8L3E+IG9yIDxxPmVuX1VTX1dJTjwvcT48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNvdXJjZSBmaWxlIGVuY29kaW5nIG5hbWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+RW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5Tb3VyY2UgZmlsZSBlbmNvZGluZyBuYW1lPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5WZXJzaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluY2x1ZGUgQHZlcnNpb24gcGFyYWdyYXBoczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5WZXJzaW9uPC90ZD4KKyAgICA8dGQ+SW5jbHVkZSA8Y29kZT5AdmVyc2lvbjwvY29kZT4gcGFyYWdyYXBoczwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VXNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNyZWF0ZSBjbGFzcyBhbmQgcGFja2FnZSB1c2FnZSBwYWdlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5Vc2U8L3RkPgorICAgIDx0ZD5DcmVhdGUgY2xhc3MgYW5kIHBhY2thZ2UgdXNhZ2UgcGFnZXM8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkF1dGhvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JbmNsdWRlIEBhdXRob3IgcGFyYWdyYXBoczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5BdXRob3I8L3RkPgorICAgIDx0ZD5JbmNsdWRlIDxjb2RlPkBhdXRob3I8L2NvZGU+IHBhcmFncmFwaHM8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwbGl0aW5kZXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BsaXQgaW5kZXggaW50byBvbmUgZmlsZSBwZXIgbGV0dGVyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPlNwbGl0aW5kZXg8L3RkPgorICAgIDx0ZD5TcGxpdCBpbmRleCBpbnRvIG9uZSBmaWxlIHBlciBsZXR0ZXI8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldpbmRvd3RpdGxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkJyb3dzZXIgd2luZG93IHRpdGxlIGZvciB0aGUgZG9jdW1lbnRhdGlvbiAodGV4dCk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+V2luZG93dGl0bGU8L3RkPgorICAgIDx0ZD5Ccm93c2VyIHdpbmRvdyB0aXRsZSBmb3IgdGhlIGRvY3VtZW50YXRpb24gKHRleHQpPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Eb2N0aXRsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JbmNsdWRlIHRpdGxlIGZvciB0aGUgcGFja2FnZSBpbmRleChmaXJzdCkgcGFnZSAoaHRtbC1jb2RlKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5Eb2N0aXRsZTwvdGQ+CisgICAgPHRkPkluY2x1ZGUgdGl0bGUgZm9yIHRoZSBwYWNrYWdlIGluZGV4IChmaXJzdCkgcGFnZSAoSFRNTCBjb2RlKTwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SGVhZGVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluY2x1ZGUgaGVhZGVyIHRleHQgZm9yIGVhY2ggcGFnZSAoaHRtbC1jb2RlKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5IZWFkZXI8L3RkPgorICAgIDx0ZD5JbmNsdWRlIGhlYWRlciB0ZXh0IGZvciBlYWNoIHBhZ2UgKEhUTUwgY29kZSk8L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZvb3RlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JbmNsdWRlIGZvb3RlciB0ZXh0IGZvciBlYWNoIHBhZ2UgKGh0bWwtY29kZSk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Rm9vdGVyPC90ZD4KKyAgICA8dGQ+SW5jbHVkZSBmb290ZXIgdGV4dCBmb3IgZWFjaCBwYWdlIChIVE1MIGNvZGUpPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ib3R0b208L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSBib3R0b20gdGV4dCBmb3IgZWFjaCBwYWdlIChodG1sLWNvZGUpPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmJvdHRvbTwvdGQ+CisgICAgPHRkPkluY2x1ZGUgYm90dG9tIHRleHQgZm9yIGVhY2ggcGFnZSAoSFRNTCBjb2RlKTwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGluazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5DcmVhdGUgbGlua3MgdG8gamF2YWRvYyBvdXRwdXQgYXQgdGhlIGdpdmVuIFVSTAotICAgIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQgPGNvZGU+bGluazwvY29kZT4gZWxlbWVudC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bGluazwvdGQ+CisgICAgPHRkPkNyZWF0ZSBsaW5rcyB0byA8Y29kZT5qYXZhZG9jPC9jb2RlPiBvdXRwdXQgYXQgdGhlIGdpdmVuIFVSTCZtZGFzaDtzZWUgYWxzbyB0aGUKKyAgICAgIG5lc3RlZCA8Y29kZT5saW5rPC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGlua29mZmxpbmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGluayB0byBkb2NzIGF0IDxjb2RlPiZsdDt1cmwmZ3Q7PC9jb2RlPiB1c2luZyBwYWNrYWdlIGxpc3QgYXQKLSAgICA8Y29kZT4mbHQ7dXJsMiZndDs8L2NvZGU+IC0gc2VwYXJhdGUgdGhlIFVSTHMgYnkgdXNpbmcgYSBzcGFjZSBjaGFyYWN0ZXIgLS0gc2VlCi0gICAgYWxzbyB0aGUgbmVzdGVkIDxjb2RlPmxpbms8L2NvZGU+IGVsZW1lbnQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmxpbmtvZmZsaW5lPC90ZD4KKyAgICA8dGQ+TGluayB0byBkb2NzIGF0IDxzYW1wPjxlbT51cmw8L2VtPjwvc2FtcD4gdXNpbmcgcGFja2FnZSBsaXN0CisgICAgICBhdCA8c2FtcD48ZW0+YWx0LXVybDwvZW0+PC9zYW1wPiBieSBzcGVjaWZ5aW5nIGEKKyAgICAgIHZhbHVlIDxxPjxlbT51cmw8L2VtPiZuYnNwOzxlbT5hbHQtdXJsPC9lbT48L3E+IChzcGFjZSBhcyBzZXBhcmF0b3IpLiBBIHNob3J0aGFuZCBmb3IgdGhlCisgICAgICBuZXN0ZWQgPGNvZGU+bGluazwvY29kZT4gZWxlbWVudCB3aXRoIDx2YXI+b2ZmbGluZTwvdmFyPj08cT50cnVlPC9xPi48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmdyb3VwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkdyb3VwIHNwZWNpZmllZCBwYWNrYWdlcyB0b2dldGhlciBpbiBvdmVydmlldwotICAgIHBhZ2UuICBUaGUgZm9ybWF0IGlzIGFzIGRlc2NyaWJlZCA8YQotICAgIGhyZWY9IiNncm91cGF0dHJpYnV0ZSI+YmVsb3c8L2E+IC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQKLSAgICA8Y29kZT5ncm91cDwvY29kZT4gZWxlbWVudC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Z3JvdXA8L3RkPgorICAgIDx0ZD5Hcm91cCBzcGVjaWZpZWQgcGFja2FnZXMgdG9nZXRoZXIgaW4gb3ZlcnZpZXcgcGFnZS4gIFRoZSBmb3JtYXQgaXMgYXMKKyAgICAgIGRlc2NyaWJlZCA8YSBocmVmPSIjZ3JvdXBhdHRyaWJ1dGUiPmJlbG93PC9hPiZtZGFzaDtzZWUgYWxzbyB0aGUgbmVzdGVkIDxjb2RlPmdyb3VwPC9jb2RlPgorICAgICAgZWxlbWVudC48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5vZGVwcmVjYXRlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgaW5jbHVkZSBAZGVwcmVjYXRlZCBpbmZvcm1hdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ub2RlcHJlY2F0ZWQ8L3RkPgorICAgIDx0ZD5EbyBub3QgaW5jbHVkZSA8Y29kZT5AZGVwcmVjYXRlZDwvY29kZT4gaW5mb3JtYXRpb248L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5vZGVwcmVjYXRlZGxpc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IGdlbmVyYXRlIGRlcHJlY2F0ZWQgbGlzdDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ub2RlcHJlY2F0ZWRsaXN0PC90ZD4KKyAgICA8dGQ+RG8gbm90IGdlbmVyYXRlIGRlcHJlY2F0ZWQgbGlzdDwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bm90cmVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBnZW5lcmF0ZSBjbGFzcyBoaWVyYXJjaHk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bm90cmVlPC90ZD4KKyAgICA8dGQ+RG8gbm90IGdlbmVyYXRlIGNsYXNzIGhpZXJhcmNoeTwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bm9pbmRleDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgZ2VuZXJhdGUgaW5kZXg8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bm9pbmRleDwvdGQ+CisgICAgPHRkPkRvIG5vdCBnZW5lcmF0ZSBpbmRleDwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bm9oZWxwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBnZW5lcmF0ZSBoZWxwIGxpbms8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bm9oZWxwPC90ZD4KKyAgICA8dGQ+RG8gbm90IGdlbmVyYXRlIGhlbHAgbGluazwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bm9uYXZiYXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmFyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm5vbmF2YmFyPC90ZD4KKyAgICA8dGQ+RG8gbm90IGdlbmVyYXRlIG5hdmlnYXRpb24gYmFyPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJpYWx3YXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgQHNlcmlhbCB0YWc8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2VyaWFsd2FybjwvdGQ+CisgICAgPHRkPkdlbmVyYXRlIHdhcm5pbmcgYWJvdXQgPGNvZGU+QHNlcmlhbDwvY29kZT4gdGFnPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5oZWxwZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIEhUTUwgaGVscCBmaWxlIHRvIHVzZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5oZWxwZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgSFRNTCBoZWxwIGZpbGUgdG8gdXNlPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZXNoZWV0ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIENTUyBzdHlsZXNoZWV0IHRvIHVzZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zdHlsZXNoZWV0ZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgQ1NTIHN0eWxlc2hlZXQgdG8gdXNlPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jaGFyc2V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYXJzZXQgZm9yIGNyb3NzLXBsYXRmb3JtIHZpZXdpbmcgb2YgZ2VuZXJhdGVkCi0gICAgICBkb2N1bWVudGF0aW9uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNoYXJzZXQ8L3RkPgorICAgIDx0ZD5DaGFyc2V0IGZvciBjcm9zcy1wbGF0Zm9ybSB2aWV3aW5nIG9mIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kb2NlbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdXRwdXQgZmlsZSBlbmNvZGluZyBuYW1lPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRvY2VuY29kaW5nPC90ZD4KKyAgICA8dGQ+T3V0cHV0IGZpbGUgZW5jb2RpbmcgbmFtZTwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZG9jbGV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgY2xhc3MgZmlsZSB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0Ci0gICAgdXNlZCBpbiBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQKLSAgICA8Y29kZT5kb2NsZXQ8L2NvZGU+IGVsZW1lbnQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRvY2xldDwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgY2xhc3MgZmlsZSB0aGF0IHN0YXJ0cyB0aGUgZG9jbGV0IHVzZWQgaW4gZ2VuZXJhdGluZyB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24mbWRhc2g7c2VlIGFsc28gdGhlIG5lc3RlZCA8Y29kZT5kb2NsZXQ8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kb2NsZXRwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZG9jbGV0IGNsYXNzIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWRvY2xldCBvcHRpb24uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmRvY2xldHBhdGg8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGRvY2xldCBjbGFzcyBmaWxlIHRoYXQgaXMgc3BlY2lmaWVkIHdpdGggdGhlIDxrYmQ+LWRvY2xldDwva2JkPgorICAgICAgb3B0aW9uLjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZG9jbGV0cGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGRvY2xldCBjbGFzcyBmaWxlIHRoYXQKLSAgICAgIGlzIHNwZWNpZmllZCB3aXRoIHRoZSAtZG9jbGV0IG9wdGlvbiBieSA8YQotICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZG9jbGV0cGF0aHJlZjwvdGQ+CisgICAgPHRkPlNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZG9jbGV0IGNsYXNzIGZpbGUgdGhhdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgPGtiZD4tZG9jbGV0PC9rYmQ+CisgICAgICBvcHRpb24gYnkgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZGl0aW9uYWxwYXJhbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5MZXRzIHlvdSBhZGQgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBqYXZhZG9jCi0gICAgY29tbWFuZCBsaW5lLiBVc2VmdWwgZm9yIGRvY2xldHMuIFBhcmFtZXRlcnMgY29udGFpbmluZyBzcGFjZXMKLSAgICBuZWVkIHRvIGJlIHF1b3RlZCB1c2luZyAmYW1wO3F1b3Q7IC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQKLSAgICA8Y29kZT5hcmc8L2NvZGU+IGVsZW1lbnQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmFkZGl0aW9uYWxwYXJhbTwvdGQ+CisgICAgPHRkPkxldHMgeW91IGFkZCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gdGhlIDxrYmQ+amF2YWRvYzwva2JkPiBjb21tYW5kIGxpbmUuIFVzZWZ1bCBmb3IKKyAgICAgIGRvY2xldHMuIFBhcmFtZXRlcnMgY29udGFpbmluZyBzcGFjZXMgbmVlZCB0byBiZSBxdW90ZWQgdXNpbmcgJmFtcDtxdW90OyZtZGFzaDtzZWUgYWxzbyB0aGUKKyAgICAgIG5lc3RlZCA8Y29kZT5hcmc8L2NvZGU+IGVsZW1lbnQuPC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgdGhlIGNvbW1hbmQgZXhpdHMgd2l0aCBhCi0gICAgICByZXR1cm5jb2RlIG90aGVyIHRoYW4gMC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSBvdGhlciB0aGFuIDxxPjA8L3E+LjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9ud2FybmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgYSB3YXJuaW5nIGlzIGVtaXR0ZWQgLQotICAgIGkuZS4gaWYgamF2YWRvYydzIG91dHB1dCBjb250YWlucyB0aGUgd29yZCAid2FybmluZyIuICA8ZW0+c2luY2UKLSAgICBBbnQgMS45LjQ8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsb253YXJuaW5nPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhIHdhcm5pbmcgaXMgZW1pdHRlZCZtZGFzaDtpLmUuIGlmIDxrYmQ+amF2YWRvYzwva2JkPidzIG91dHB1dAorICAgICAgY29udGFpbnMgdGhlIHdvcmQgPHE+d2FybmluZzwvcT4uICA8ZW0+c2luY2UgQW50IDEuOS40PC9lbT48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVwYWNrYWdlbmFtZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZXMgeW91IGRvbid0IHdhbnQKLSAgICAgIGRvY3MgZm9yIC0tIHNlZSBhbHNvIHRoZSBuZXN0ZWQgPGNvZGU+ZXhjbHVkZXBhY2thZ2U8L2NvZGU+IGVsZW1lbnQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPmFsbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVwYWNrYWdlbmFtZXM8L3RkPgorICAgIDx0ZD5jb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBwYWNrYWdlcyB5b3UgZG9uJ3Qgd2FudCBkb2NzIGZvciZtZGFzaDtzZWUgYWxzbyB0aGUKKyAgICAgIG5lc3RlZCA8Y29kZT5leGNsdWRlcGFja2FnZTwvY29kZT4gZWxlbWVudC48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkCi0gICAgICAoPGNvZGU+eWVzPC9jb2RlPiB8IDxjb2RlPm5vPC9jb2RlPik7IGRlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkICg8cT55ZXN8bm88L3E+KS48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZWV4dGVybmFsZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0aGUgc291cmNlZmlsZSBuYW1lIHNwZWNpZmllZAotICAgICAgaW4gc3JjZmlsZXMgb3IgYXMgbmVzdGVkIHNvdXJjZSBlbGVtZW50cyBzaG91bGQgYmUgd3JpdHRlbiB0byBhCi0gICAgICB0ZW1wb3JhcnkgZmlsZSB0byBtYWtlIHRoZSBjb21tYW5kIGxpbmUgc2hvcnRlci4gQWxzbyBhcHBsaWVzIHRvCi0gICAgICB0aGUgcGFja2FnZSBuYW1lcyBzcGVjaWZpZWQgdmlhIHRoZSBwYWNrYWdlbmFtZXMgYXR0cmlidXRlIG9yCi0gICAgICBuZXN0ZWQgcGFja2FnZSBlbGVtZW50cy4gIDxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPiwgYWxzbyBhcHBsaWVzCi0gICAgICB0byBhbGwgdGhlIG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zLgotICAgICAgKDxjb2RlPnllczwvY29kZT4gfCA8Y29kZT5ubzwvY29kZT4pLiBEZWZhdWx0IGlzIG5vLjxici8+CisgICAgPHRkPnVzZWV4dGVybmFsZmlsZTwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIHRoZSBzb3VyY2UgZmlsZSBuYW1lcyBzcGVjaWZpZWQgaW4gPHZhcj5zcmNmaWxlczwvdmFyPiBvciBhcworICAgICAgbmVzdGVkIDxjb2RlPnNvdXJjZTwvY29kZT4gZWxlbWVudHMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gYSB0ZW1wb3JhcnkgZmlsZSB0byBtYWtlIHRoZSBjb21tYW5kCisgICAgICBsaW5lIHNob3J0ZXIuIEFsc28gYXBwbGllcyB0byB0aGUgcGFja2FnZSBuYW1lcyBzcGVjaWZpZWQgdmlhIHRoZSA8dmFyPnBhY2thZ2VuYW1lczwvdmFyPgorICAgICAgYXR0cmlidXRlIG9yIG5lc3RlZCA8Y29kZT5wYWNrYWdlPC9jb2RlPiBlbGVtZW50cy4gIDxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPiwgYWxzbyBhcHBsaWVzIHRvCisgICAgICBhbGwgdGhlIG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zLiAgKDxxPnllc3xubzwvcT4pLjxici8+CiAgICAgICBJZiBlbmFibGVkLCB0aGUgZmlsZSB3aWxsIGJlIHdyaXR0ZW4gdG8KICAgICAgIHRoZSA8YSBocmVmPSIuLi9ydW5uaW5nLmh0bWwjdG1wZGlyIj50ZW1wb3JhcnkKLSAgICAgIGRpcmVjdG9yeTwvYT4uPC9wPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgZGlyZWN0b3J5PC9hPi48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmVjZXNzYXJ5IHRvIGVuYWJsZSBqYXZhZG9jIHRvIGhhbmRsZSBhc3NlcnRpb25zCi0gICAgcHJlc2VudCBpbiBKMlNFIHYgMS40IHNvdXJjZSBjb2RlLiBTZXQgdGhpcyB0byAmcXVvdDsxLjQmcXVvdDsgdG8KLSAgICBkb2N1bWVudHMgY29kZSB0aGF0IGNvbXBpbGVzIHVzaW5nIDxjb2RlPiZxdW90O2phdmFjIC1zb3VyY2UKLSAgICAxLjQmcXVvdDs8L2NvZGU+Ljxicj4KLSAgICBBIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIGNhbiBiZSBwcm92aWRlZCB1c2luZyB0aGUgbWFnaWMKLSAgICA8YQotICAgIGhyZWY9Ii4uL2phdmFjcHJvcHMuaHRtbCNzb3VyY2UiPjxjb2RlPmFudC5idWlsZC5qYXZhYy5zb3VyY2U8L2NvZGU+PC9hPgotICAgIHByb3BlcnR5LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4xLjQrPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c291cmNlPC90ZD4KKyAgICA8dGQ+RW5hYmxlIDxrYmQ+amF2YWRvYzwva2JkPiB0byBoYW5kbGUgSmF2YSBsYW5ndWFnZSBmZWF0dXJlcy4gIFNldCB0aGlzIHRvIDxxPjEuNDwvcT4gdG8KKyAgICAgIGRvY3VtZW50IGNvZGUgdGhhdCBjb21waWxlcyB1c2luZyA8a2JkPmphdmFjIC1zb3VyY2UgMS40PC9rYmQ+LCBldGMuPC90ZD4KKyAgICA8dGQ+MS40KzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGNhbiBiZSBwcm92aWRlZCB1c2luZyB0aGUgbWFnaWMKKyAgICA8YSBocmVmPSIuLi9qYXZhY3Byb3BzLmh0bWwjc291cmNlIj48Y29kZT5hbnQuYnVpbGQuamF2YWMuc291cmNlPC9jb2RlPjwvYT4gcHJvcGVydHkuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGlua3NvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5HZW5lcmF0ZSBoeXBlcmxpbmtzIHRvIHNvdXJjZSBmaWxlcy4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uCi0gICAgICAoPGNvZGU+eWVzPC9jb2RlPiB8IDxjb2RlPm5vPC9jb2RlPikuIERlZmF1bHQgaXMgbm8uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjEuNCs8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5saW5rc291cmNlPC90ZD4KKyAgICA8dGQ+R2VuZXJhdGUgaHlwZXJsaW5rcyB0byBzb3VyY2UgZmlsZXMuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LiAgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPjEuNCs8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5icmVha2l0ZXJhdG9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVzZSB0aGUgbmV3IGJyZWFraXRlcmF0b3IgYWxnb3JpdGhtLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi4KLSAgICAgICg8Y29kZT55ZXM8L2NvZGU+IHwgPGNvZGU+bm88L2NvZGU+KS4gRGVmYXVsdCBpcyBuby48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS40KzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmJyZWFraXRlcmF0b3I8L3RkPgorICAgIDx0ZD5Vc2UgdGhlIG5ldyBicmVhayBpdGVyYXRvciBhbGdvcml0aG0uICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LiAgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPjEuNCs8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ub3F1YWxpZmllcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5FbmFibGVzIHRoZSA8Y29kZT4tbm9xdWFsaWZpZXI8L2NvZGU+IGFyZ3VtZW50IC0KLSAgICAgIG11c3QgYmUgPGNvZGU+YWxsPC9jb2RlPiBvciBhIGNvbG9uIHNlcGFyYXRlZCBsaXN0IG9mIHBhY2thZ2VzLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS40KzwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm5vcXVhbGlmaWVyPC90ZD4KKyAgICA8dGQ+RW5hYmxlcyB0aGUgPGtiZD4tbm9xdWFsaWZpZXI8L2tiZD4gYXJndW1lbnQmbWRhc2g7bXVzdCBiZSA8cT5hbGw8L3E+IG9yIGEgY29sb24gc2VwYXJhdGVkCisgICAgICBsaXN0IG9mIHBhY2thZ2VzLiAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD4xLjQrPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlbm9zb3VyY2VwYWNrYWdlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSwgcGFja2FnZXMgdGhhdCBkb24ndCBjb250YWluIEphdmEKLSAgICAgIHNvdXJjZSBidXQgYSBwYWNrYWdlLmh0bWwgd2lsbCBnZXQgZG9jdW1lbnRlZCBhcyB3ZWxsLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+KTwvdGQ+CisgICAgPHRkPmluY2x1ZGVub3NvdXJjZXBhY2thZ2VzPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCBwYWNrYWdlcyB0aGF0IGRvbid0IGNvbnRhaW4gSmF2YSBzb3VyY2UgYnV0CisgICAgICBhIDxzYW1wPnBhY2thZ2UuaHRtbDwvc2FtcD4gd2lsbCBnZXQgZG9jdW1lbnRlZCBhcyB3ZWxsLiAgPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+LjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBhIHBhcnRpY3VsYXIgPGNvZGU+amF2YWRvYzwvY29kZT4gZXhlY3V0YWJsZQotICAgICAgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0IGJpbmFyeSAoZm91bmQgaW4gdGhlIHNhbWUgSkRLIGFzIEFudCBpcyBydW5uaW5nIGluKS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS42LjM8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBwYXJ0aWN1bGFyIDxrYmQ+amF2YWRvYzwva2JkPiBleGVjdXRhYmxlIHRvIHVzZSBpbiBwbGFjZSBvZiB0aGUgZGVmYXVsdCBiaW5hcnkKKyAgICAgIChmb3VuZCBpbiB0aGUgc2FtZSBKREsgYXMgQW50IGlzIHJ1bm5pbmcgaW4pLiAgPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+LjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZG9jZmlsZXNzdWJkaXJzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVuYWJsZXMgZGVlcC1jb3B5aW5nIG9mIDxjb2RlPmRvYy1maWxlczwvY29kZT4KLSAgICAgIHN1YmRpcmVjdG9yaWVzLiAgRGVmYXVsdHMgdG8gZmFsc2UuIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS40PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZG9jZmlsZXNzdWJkaXJzPC90ZD4KKyAgICA8dGQ+RW5hYmxlcyBkZWVwLWNvcHlpbmcgb2YgPHNhbXA+ZG9jLWZpbGVzPC9zYW1wPiBzdWJkaXJlY3Rvcmllcy4gPGVtPnNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD4xLjQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZWRvY2ZpbGVzc3ViZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIDxjb2RlPmRvYy1maWxlczwvY29kZT4nCi0gICAgICBzdWJkaXJlY3RvcmllcyB0byBleGNsdWRlIGlmIDxjb2RlPmRvY2ZpbGVzc3ViZGlyczwvY29kZT4gaXMKLSAgICAgIHRydWUuIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+MS40PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZWRvY2ZpbGVzc3ViZGlyPC90ZD4KKyAgICA8dGQ+Q29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgPHNhbXA+ZG9jLWZpbGVzPC9zYW1wPiBzdWJkaXJlY3RvcmllcyB0byBleGNsdWRlCisgICAgICBpZiA8dmFyPmRvY2ZpbGVzc3ViZGlyczwvdmFyPiBpcyB0cnVlLiA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+MS40PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wb3N0UHJvY2Vzc0dlbmVyYXRlZEphdmFkb2NzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcG9zdC1wcm9jZXNzIHRoZSBnZW5lcmF0ZWQgamF2YWRvY3MgaW4KLSAgICAgIG9yZGVyIHRvIG1pdGlnYXRlIENWRS0yMDEzLTE1NzEuICBEZWZhdWx0cyB0byB0cnVlLiAgPGVtPlNpbmNlIEFudAotICAgICAgMS45LjI8L2VtPjxicj4KLSAgICAgIFRoZXJlIGlzIGEgZnJhbWUgaW5qZWN0aW9uIGF0dGFjayBwb3NzaWJsZSBpbiBqYXZhZG9jcyBnZW5lcmF0ZWQgYnkgT3JhY2xlCi0gICAgICBKREtzIHByaW9yIHRvIEphdmE3IFVwZGF0ZSAyNSAoPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlLzd1MjUtcmVsbm90ZXMtMTk1NTc0MS5odG1sI2pwaS11cHQiIHRhcmdldD0iX2JsYW5rIj5kZXRhaWxzPC9hPikuICAKLSAgICAgIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLCBBbnQgd2lsbCBjaGVjayB3aGV0aGVyIHRoZSBkb2NzIGFyZSB2dWxuZXJhYmxlIAotICAgICAgYW5kIHdpbGwgdHJ5IHRvIGZpeCB0aGVtLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj4xLjQ8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5wb3N0UHJvY2Vzc0dlbmVyYXRlZEphdmFkb2NzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwb3N0LXByb2Nlc3MgdGhlIGdlbmVyYXRlZCBqYXZhZG9jcyBpbiBvcmRlciB0byBtaXRpZ2F0ZQorICAgICAgQ1ZFLTIwMTMtMTU3MS4gIDxlbT5TaW5jZSBBbnQgMS45LjI8L2VtPjxici8+IFRoZXJlIGlzIGEgZnJhbWUgaW5qZWN0aW9uIGF0dGFjayBwb3NzaWJsZSBpbgorICAgICAgamF2YWRvY3MgZ2VuZXJhdGVkIGJ5IE9yYWNsZSBKREtzIHByaW9yIHRvIEphdmEgNyB1cGRhdGUgMjUKKyAgICAgICg8YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlLzd1MjUtcmVsbm90ZXMtMTk1NTc0MS5odG1sI2pwaS11cHQiCisgICAgICB0YXJnZXQ9Il90b3AiPmRldGFpbHM8L2E+KS4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byA8cT50cnVlPC9xPiwgQW50IHdpbGwgY2hlY2sgd2hldGhlciB0aGUKKyAgICAgIGRvY3MgYXJlIHZ1bG5lcmFibGUgYW5kIHdpbGwgdHJ5IHRvIGZpeCB0aGVtLjwvdGQ+CisgICAgPHRkPjEuNDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1vZHVsZXNvdXJjZXBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSB3aGVyZSB0byBmaW5kIG1vZHVsZSBzb3VyY2UgZmlsZXMKLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45LjE0PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bW9kdWxlc291cmNlcGF0aDwvdGQ+CisgICAgPHRkPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBtb2R1bGUgc291cmNlIGZpbGVzCisgICAgICA8ZW0+c2luY2UgQW50IDEuMTAuNjwvZW0+PC90ZD4KKyAgICA8dGQ+YWxsPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2R1bGVzb3VyY2VwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZnkgd2hlcmUgdG8gZmluZCBtb2R1bGUgc291cmNlIGZpbGVzIGJ5IDxhCisgICAgPHRkPm1vZHVsZXNvdXJjZXBhdGhyZWY8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgbW9kdWxlIHNvdXJjZSBmaWxlcyBieSA8YQogICAgICAgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgUEFUSCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45LjE0PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+YWxsPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS4xMC42PC9lbT48L3RkPgorICAgIDx0ZD5hbGw8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1vZHVsZXBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSB3aGVyZSB0byBmaW5kIG1vZHVsZSBmaWxlcwotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMTQ8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5tb2R1bGVwYXRoPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGVyZSB0byBmaW5kIG1vZHVsZSBmaWxlcworICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bW9kdWxlcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgbW9kdWxlIGZpbGVzIGJ5IDxhCisgICAgPHRkPm1vZHVsZXBhdGhyZWY8L3RkPgorICAgIDx0ZD5TcGVjaWZ5IHdoZXJlIHRvIGZpbmQgbW9kdWxlIGZpbGVzIGJ5IDxhCiAgICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMTQ8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5hbGw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPjwvdGQ+CisgICAgPHRkPmFsbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND48YSBuYW1lPSJncm91cGF0dHJpYnV0ZSI+Rm9ybWF0IG9mIHRoZSBncm91cCBhdHRyaWJ1dGU8L2E+PC9oND4KLTxwPlRoZSBhcmd1bWVudHMgYXJlIGNvbW1hLWRlbGltaXRlZC4gRWFjaCBzaW5nbGUgYXJndW1lbnQgaXMgMgotc3BhY2UtZGVsaW1pdGVkIHN0cmluZ3MsIHdoZXJlIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGdyb3VwJ3MgdGl0bGUgYW5kCi10aGUgc2Vjb25kIG9uZSBhIGNvbG9uIGRlbGltaXRlZCBsaXN0IG9mIHBhY2thZ2VzLjwvcD4KLTxwPklmIHlvdSBuZWVkIHRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBncm91cCwgb3IgYSBncm91cCB3aG9zZSB0aXRsZQotY29udGFpbnMgYSBjb21tYSBvciBhIHNwYWNlIGNoYXJhY3RlciwgdXNpbmcgPGEKLWhyZWY9IiNncm91cGVsZW1lbnQiPm5lc3RlZCBncm91cCBlbGVtZW50czwvYT4gaXMgaGlnaGx5Cis8aDQgaWQ9Imdyb3VwYXR0cmlidXRlIj5Gb3JtYXQgb2YgdGhlIGdyb3VwIGF0dHJpYnV0ZTwvaDQ+Cis8cD5UaGUgYXJndW1lbnRzIGFyZSBjb21tYS1kZWxpbWl0ZWQuIEVhY2ggc2luZ2xlIGFyZ3VtZW50IGlzIDIgc3BhY2UtZGVsaW1pdGVkIHN0cmluZ3MsIHdoZXJlIHRoZQorZmlyc3Qgb25lIGlzIHRoZSBncm91cCdzIHRpdGxlIGFuZCB0aGUgc2Vjb25kIG9uZSBhIGNvbG9uIGRlbGltaXRlZCBsaXN0IG9mIHBhY2thZ2VzLjwvcD4KKzxwPklmIHlvdSBuZWVkIHRvIHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBncm91cCwgb3IgYSBncm91cCB3aG9zZSB0aXRsZSBjb250YWlucyBhIGNvbW1hIG9yIGEgc3BhY2UKK2NoYXJhY3RlciwgdXNpbmcgPGEgaHJlZj0iI2dyb3VwZWxlbWVudCI+bmVzdGVkIDxjb2RlPmdyb3VwPC9jb2RlPiBlbGVtZW50czwvYT4gaXMgaGlnaGx5CiByZWNvbW1lbmRlZC48L3A+CiA8cD5FLmcuOjwvcD4KLTxwcmU+ICAgIGdyb3VwPSZxdW90O1hTTFRfUGFja2FnZXMgb3JnLmFwYWNoZS54YWxhbi54c2x0KixYUGF0aF9QYWNrYWdlcyBvcmcuYXBhY2hlLnhhbGFuLnhwYXRoKiZxdW90OzwvcHJlPgorPHByZT5ncm91cD0mcXVvdDtYU0xUX1BhY2thZ2VzIG9yZy5hcGFjaGUueGFsYW4ueHNsdCosWFBhdGhfUGFja2FnZXMgb3JnLmFwYWNoZS54YWxhbi54cGF0aComcXVvdDs8L3ByZT4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKIDxoND5wYWNrYWdlc2V0PC9oND4KIAotPHA+QSA8YSBocmVmPSIuLi9UeXBlcy9kaXJzZXQuaHRtbCI+RGlyU2V0PC9hPi4gIEFsbCBtYXRjaGVkCi1kaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gSmF2YSBzb3VyY2UgZmlsZXMgd2lsbCBiZSBwYXNzZWQgdG8gamF2YWRvYwotYXMgcGFja2FnZSBuYW1lcy4gIFBhY2thZ2UgbmFtZXMgYXJlIGNyZWF0ZWQgZnJvbSB0aGUgZGlyZWN0b3J5IG5hbWVzCi1ieSB0cmFuc2xhdGluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbnRvIGRvdHMuICBBbnQgYXNzdW1lcyB0aGUKLWJhc2UgZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlc2V0IHBvaW50cyB0byB0aGUgcm9vdCBvZiBhIHBhY2thZ2UKLWhpZXJhcmNoeS48L3A+Cis8cD5BIDxhIGhyZWY9Ii4uL1R5cGVzL2RpcnNldC5odG1sIj5EaXJTZXQ8L2E+LiAgQWxsIG1hdGNoZWQgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIEphdmEgc291cmNlCitmaWxlcyB3aWxsIGJlIHBhc3NlZCB0byA8a2JkPmphdmFkb2M8L2tiZD4gYXMgcGFja2FnZSBuYW1lcy4gIFBhY2thZ2UgbmFtZXMgYXJlIGNyZWF0ZWQgZnJvbSB0aGUKK2RpcmVjdG9yeSBuYW1lcyBieSB0cmFuc2xhdGluZyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbnRvIGRvdHMuICBBbnQgYXNzdW1lcyB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YKK3RoZSA8Y29kZT5wYWNrYWdlc2V0PC9jb2RlPiBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgYSBwYWNrYWdlIGhpZXJhcmNoeS48L3A+CiAKLTxwPlRoZSA8Y29kZT5wYWNrYWdlbmFtZXM8L2NvZGU+LCA8Y29kZT5leGNsdWRlcGFja2FnZW5hbWVzPC9jb2RlPiBhbmQKLTxjb2RlPmRlZmF1bHRleGNsdWRlczwvY29kZT4gYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbgotdGhlIG5lc3RlZCA8Y29kZT4mbHQ7cGFja2FnZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPlRoZSA8dmFyPnBhY2thZ2VuYW1lczwvdmFyPiwgPHZhcj5leGNsdWRlcGFja2FnZW5hbWVzPC92YXI+IGFuZCA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPgorYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgbmVzdGVkIDxjb2RlPiZsdDtwYWNrYWdlc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogCiA8aDQ+ZmlsZXNldDwvaDQ+CiAKLTxwPkEgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gIEFsbCBtYXRjaGVkCi1maWxlcyB3aWxsIGJlIHBhc3NlZCB0byBqYXZhZG9jIGFzIHNvdXJjZSBmaWxlcy4gIEFudCB3aWxsCi1hdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW5jbHVkZSBwYXR0ZXJuIDxjb2RlPioqLyouamF2YTwvY29kZT4gKGFuZAotPGNvZGU+KiovcGFja2FnZS5odG1sPC9jb2RlPiBpZiBpbmNsdWRlbm9zb3VyY2VwYWNrYWdlcyBpcyB0cnVlKSB0bwotdGhlc2UgZmlsZXNldHMuPC9wPgorPHA+QSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiAgQWxsIG1hdGNoZWQgZmlsZXMgd2lsbCBiZSBwYXNzZWQKK3RvIDxrYmQ+amF2YWRvYzwva2JkPiBhcyBzb3VyY2UgZmlsZXMuICBBbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgaW5jbHVkZQorcGF0dGVybiA8c2FtcD4qKi8qLmphdmE8L3NhbXA+IChhbmQgPHNhbXA+KiovcGFja2FnZS5odG1sPC9zYW1wPgoraWYgPHZhcj5pbmNsdWRlbm9zb3VyY2VwYWNrYWdlczwvdmFyPiBpcyA8cT50cnVlPC9xPikgdG8gdGhlc2UgZmlsZXNldHMuPC9wPgogCi08cD5OZXN0ZWQgZmlsZXNldHMgY2FuIGJlIHVzZWQgdG8gZG9jdW1lbnQgc291cmNlcyB0aGF0IGFyZSBpbiB0aGUKLWRlZmF1bHQgcGFja2FnZSBvciBpZiB5b3Ugd2FudCB0byBleGNsdWRlIGNlcnRhaW4gZmlsZXMgZnJvbQotZG9jdW1lbnRhdGlvbi4gIElmIHlvdSB3YW50IHRvIGRvY3VtZW50IGFsbCBzb3VyY2UgZmlsZXMgYW5kIGRvbid0IHVzZQotdGhlIGRlZmF1bHQgcGFja2FnZSwgcGFja2FnZXNldHMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBhcyB0aGlzCi1pbmNyZWFzZXMgamF2YWRvY3MgcGVyZm9ybWFuY2UuPC9wPgorPHA+TmVzdGVkIGZpbGVzZXRzIGNhbiBiZSB1c2VkIHRvIGRvY3VtZW50IHNvdXJjZXMgdGhhdCBhcmUgaW4gdGhlIGRlZmF1bHQgcGFja2FnZSBvciBpZiB5b3Ugd2FudCB0bworZXhjbHVkZSBjZXJ0YWluIGZpbGVzIGZyb20gZG9jdW1lbnRhdGlvbi4gIElmIHlvdSB3YW50IHRvIGRvY3VtZW50IGFsbCBzb3VyY2UgZmlsZXMgYW5kIGRvbid0IHVzZQordGhlIGRlZmF1bHQgcGFja2FnZSwgPGNvZGU+cGFja2FnZXNldDwvY29kZT5zIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgYXMgdGhpcyBpbmNyZWFzZXMgcGVyZm9ybWFuY2UKK29mIDxrYmQ+amF2YWRvYzwva2JkPi48L3A+CiAKLTxwPlRoZSA8Y29kZT5wYWNrYWdlbmFtZXM8L2NvZGU+LCA8Y29kZT5leGNsdWRlcGFja2FnZW5hbWVzPC9jb2RlPiBhbmQKLTxjb2RlPmRlZmF1bHRleGNsdWRlczwvY29kZT4gYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbgotdGhlIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPlRoZSA8dmFyPnBhY2thZ2VuYW1lczwvdmFyPiwgPHZhcj5leGNsdWRlcGFja2FnZW5hbWVzPC92YXI+IGFuZCA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPgorYXR0cmlidXRlcyBvZiB0aGUgdGFzayBoYXZlIG5vIGVmZmVjdCBvbiB0aGUgbmVzdGVkIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogCiA8aDQ+c291cmNlZmlsZXM8L2g0PgogCi08cD5BIGNvbnRhaW5lciBmb3IgYXJiaXRyYXJ5IGZpbGUgc3lzdGVtIGJhc2VkIDxhCi1ocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZQotY29sbGVjdGlvbnM8L2E+LiAgQWxsIGZpbGVzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIG5lc3RlZCBjb2xsZWN0aW9ucwotKHRoaXMgaW5jbHVkZXMgbmVzdGVkIGZpbGVzZXRzLCBmaWxlbGlzdHMgb3IgcGF0aHMpIHdpbGwgYmUgcGFzc2VkIHRvCi1qYXZhZG9jIGFzIHNvdXJjZSBmaWxlcy48L3A+Cis8cD5BIGNvbnRhaW5lciBmb3IgYXJiaXRyYXJ5IGZpbGUgc3lzdGVtIGJhc2VkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCitjb2xsZWN0aW9uczwvYT4uICBBbGwgZmlsZXMgY29udGFpbmVkIGluIGFueSBvZiB0aGUgbmVzdGVkIGNvbGxlY3Rpb25zICh0aGlzIGluY2x1ZGVzIG5lc3RlZAorZmlsZXNldHMsIGZpbGVsaXN0cyBvciBwYXRocykgd2lsbCBiZSBwYXNzZWQgdG8gamF2YWRvYyBhcyBzb3VyY2UgZmlsZXMuPC9wPgogCiA8aDQ+cGFja2FnZTwvaDQ+Ci08cD5TYW1lIGFzIG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBnaXZlbiBieSA8Y29kZT5wYWNrYWdlbmFtZXM8L2NvZGU+LjwvcD4KKzxwPlNhbWUgYXMgb25lIGVudHJ5IGluIHRoZSBsaXN0IGdpdmVuIGJ5IDx2YXI+cGFja2FnZW5hbWVzPC92YXI+LjwvcD4KIAogPGg1PlBhcmFtZXRlcnM8L2g1PgotPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYWNrYWdlIG5hbWUgKG1heSBiZSBhIHdpbGRjYXJkKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIHBhY2thZ2UgbmFtZSAobWF5IGJlIGEgd2lsZGNhcmQpPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5leGNsdWRlcGFja2FnZTwvaDQ+Ci08cD5TYW1lIGFzIG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBnaXZlbiBieSA8Y29kZT5leGNsdWRlcGFja2FnZW5hbWVzPC9jb2RlPi48L3A+Cis8cD5TYW1lIGFzIG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBnaXZlbiBieSA8dmFyPmV4Y2x1ZGVwYWNrYWdlbmFtZXM8L3Zhcj4uPC9wPgogCiA8aDU+UGFyYW1ldGVyczwvaDU+CiBTYW1lIGFzIGZvciA8Y29kZT5wYWNrYWdlPC9jb2RlPi4KIAogPGg0Pm1vZHVsZTwvaDQ+Ci08cD48ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+PC9wPgorPHA+PGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPjwvcD4KIDxwPlNhbWUgYXMgb25lIGVudHJ5IGluIHRoZSBsaXN0IGdpdmVuIGJ5IDxjb2RlPm1vZHVsZW5hbWVzPC9jb2RlPi48L3A+CiAKIDxoNT5QYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbW9kdWxlIG5hbWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBtb2R1bGUgbmFtZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+c291cmNlPC9oND4KLTxwPlNhbWUgYXMgb25lIGVudHJ5IGluIHRoZSBsaXN0IGdpdmVuIGJ5IDxjb2RlPnNvdXJjZWZpbGVzPC9jb2RlPi48L3A+Cis8cD5TYW1lIGFzIG9uZSBlbnRyeSBpbiB0aGUgbGlzdCBnaXZlbiBieSA8dmFyPnNvdXJjZWZpbGVzPC92YXI+LjwvcD4KIAogPGg1PlBhcmFtZXRlcnM8L2g1PgotPHRhYmxlIHdpZHRoPSI5MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzb3VyY2UgZmlsZSB0byBkb2N1bWVudDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+VGhlIHNvdXJjZSBmaWxlIHRvIGRvY3VtZW50PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5kb2N0aXRsZTwvaDQ+CiAKLTxwPlNhbWUgYXMgdGhlIDxjb2RlPmRvY3RpdGxlPC9jb2RlPiBhdHRyaWJ1dGUsIGJ1dCB5b3UgY2FuIG5lc3QgdGV4dAotaW5zaWRlIHRoZSBlbGVtZW50IHRoaXMgd2F5LjwvcD4KKzxwPlNhbWUgYXMgdGhlIDx2YXI+ZG9jdGl0bGU8L3Zhcj4gYXR0cmlidXRlLCBidXQgeW91IGNhbiBuZXN0IHRleHQgaW5zaWRlIHRoZSBlbGVtZW50IHRoaXMgd2F5LjwvcD4KIAotPHA+SWYgdGhlIG5lc3RlZCB0ZXh0IGNvbnRhaW5zIGxpbmUgYnJlYWtzLCB5b3UgbXVzdCB1c2UgdGhlCi0gIHVzZWV4dGVybmFsZmlsZSBhdHRyaWJ1dGUgYW5kIHNldCBpdCB0byB0cnVlLjwvcD4KKzxwPklmIHRoZSBuZXN0ZWQgdGV4dCBjb250YWlucyBsaW5lIGJyZWFrcywgeW91IG11c3QgdXNlIHRoZSA8dmFyPnVzZWV4dGVybmFsZmlsZTwvdmFyPiBhdHRyaWJ1dGUKK2FuZCBzZXQgaXQgdG8gPHE+dHJ1ZTwvcT4uPC9wPgogCiA8aDQ+aGVhZGVyPC9oND4KIApAQCAtNzAzLDE4OCArNjYxLDE4NSBAQAogPHA+U2ltaWxhciB0byA8Y29kZT4mbHQ7ZG9jdGl0bGUmZ3Q7PC9jb2RlPi48L3A+CiAKIDxoND5saW5rPC9oND4KLTxwPkNyZWF0ZSBsaW5rIHRvIGphdmFkb2Mgb3V0cHV0IGF0IHRoZSBnaXZlbiBVUkwuIFRoaXMgcGVyZm9ybXMgdGhlCi1zYW1lIHJvbGUgYXMgdGhlIGxpbmsgYW5kIGxpbmtvZmZsaW5lIGF0dHJpYnV0ZXMuIFlvdSBjYW4gdXNlIGVpdGhlcgotc3ludGF4IChvciBib3RoIGF0IG9uY2UpLCBidXQgd2l0aCB0aGUgbmVzdGVkIGVsZW1lbnRzIHlvdSBjYW4gZWFzaWx5Ci1zcGVjaWZ5IG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBhcmd1bWVudHMuPC9wPgotCi08aDU+UGFyYW1ldGVyczwvaDU+Ci08dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBVUkwgZm9yIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uIHlvdSB3aXNoCi0gICAgdG8gbGluayB0by4gIFRoaXMgY2FuIGJlIGFuIGFic29sdXRlIFVSTCwgb3IgYSByZWxhdGl2ZSBmaWxlCi0gICAgbmFtZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b2ZmbGluZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UcnVlIGlmIHRoaXMgbGluayBpcyBub3QgYXZhaWxhYmxlIG9ubGluZSBhdCB0aGUgdGltZSBvZgotICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnRhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhY2thZ2VsaXN0TG9jPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UtbGlzdCBmaWxlIGZvcgotICAgICAgICAgICAgICAgICAgICAgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+T25lIG9mIHRoZSB0d28gaWYgdGhlIG9mZmxpbmUgYXR0cmlidXRlIGlzIHRydWU8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlbGlzdFVSTDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgVVJMIG9mIHRoZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UtbGlzdCBmaWxlIGZvcgotICAgICAgICAgICAgICAgICAgICAgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb248L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvbHZlTGluazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGUgbGluayBhdHRyaWJ1dGUgaXMgYSByZWxhdGl2ZSBmaWxlIG5hbWUsCi0gICAgQW50IHdpbGwgZmlyc3QgdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgY3VycmVudAotICAgIHByb2plY3QncyBiYXNlZGlyIGFuZCBpZiBpdCBmaW5kcyBhIGZpbGUgdGhlcmUgdXNlIGFuIGFic29sdXRlIFVSTAotICAgIGZvciB0aGUgbGluayBhdHRyaWJ1dGUsIG90aGVyd2lzZSBpdCB3aWxsIHBhc3MgdGhlIGZpbGUgbmFtZQotICAgIHZlcmJhdGltIHRvIHRoZSBqYXZhZG9jIGNvbW1hbmQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08aDQ+PGEgbmFtZT0iZ3JvdXBlbGVtZW50Ij5ncm91cDwvYT48L2g0PgotPHA+U2VwYXJhdGVzIHBhY2thZ2VzIG9uIHRoZSBvdmVydmlldyBwYWdlIGludG8gd2hhdGV2ZXIgZ3JvdXBzIHlvdQotc3BlY2lmeSwgb25lIGdyb3VwIHBlciB0YWJsZS4gVGhpcyBwZXJmb3JtcyB0aGUgc2FtZSByb2xlIGFzIHRoZSBncm91cAotYXR0cmlidXRlLiBZb3UgY2FuIHVzZSBlaXRoZXIgc3ludGF4IChvciBib3RoIGF0IG9uY2UpLCBidXQgd2l0aCB0aGUKLW5lc3RlZCBlbGVtZW50cyB5b3UgY2FuIGVhc2lseSBzcGVjaWZ5IG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZQorPHA+Q3JlYXRlIGxpbmsgdG8gPGtiZD5qYXZhZG9jPC9rYmQ+IG91dHB1dCBhdCB0aGUgZ2l2ZW4gVVJMLiBUaGlzIHBlcmZvcm1zIHRoZSBzYW1lIHJvbGUgYXMKK3RoZSA8dmFyPmxpbms8L3Zhcj4gYW5kIDx2YXI+bGlua29mZmxpbmU8L3Zhcj4gYXR0cmlidXRlcy4gWW91IGNhbiB1c2UgZWl0aGVyIHN5bnRheCAob3IgYm90aCBhdAorb25jZSksIGJ1dCB3aXRoIHRoZSBuZXN0ZWQgZWxlbWVudHMgeW91IGNhbiBlYXNpbHkgc3BlY2lmeSBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiB0aGUKIGFyZ3VtZW50cy48L3A+CiAKIDxoNT5QYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGl0bGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGl0bGUgb2YgdGhlIGdyb3VwPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7dGl0bGUmZ3Q7PC9jb2RlPiBnaXZlbjwvdGQ+CisgICAgPHRkPmhyZWY8L3RkPgorICAgIDx0ZD5UaGUgVVJMIGZvciB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiB5b3Ugd2lzaCB0byBsaW5rIHRvLiAgVGhpcyBjYW4gYmUgYW4gYWJzb2x1dGUgVVJMLCBvcgorICAgICAgYSByZWxhdGl2ZSBmaWxlIG5hbWUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TGlzdCBvZiBwYWNrYWdlcyB0byBpbmNsdWRlIGluIHRoYXQgZ3JvdXAuIE11bHRpcGxlIHBhY2thZ2VzIGFyZSBzZXBhcmF0ZWQgd2l0aCAnOicuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7cGFja2FnZSZndDs8L2NvZGU+cyBnaXZlbjwvdGQ+CisgICAgPHRkPm9mZmxpbmU8L3RkPgorICAgIDx0ZD48cT50cnVlPC9xPiBpZiB0aGlzIGxpbmsgaXMgbm90IGF2YWlsYWJsZSBvbmxpbmUgYXQgdGhlIHRpbWUgb2YgZ2VuZXJhdGluZyB0aGUKKyAgICAgIGRvY3VtZW50YXRpb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cGFja2FnZWxpc3RMb2M8L3RkPgorICAgIDx0ZD5UaGUgbG9jYXRpb24gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlLWxpc3QgZmlsZSBmb3IgdGhlIGV4dGVybmFsCisgICAgICBkb2N1bWVudGF0aW9uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+T25lIG9mIHRoZSB0d28gaWYgdGhlIDx2YXI+b2ZmbGluZTwvdmFyPiBhdHRyaWJ1dGUgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnBhY2thZ2VsaXN0VVJMPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBVUkwgb2YgdGhlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcGFja2FnZS1saXN0IGZpbGUgZm9yIHRoZSBleHRlcm5hbAorICAgICAgZG9jdW1lbnRhdGlvbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVzb2x2ZUxpbms8L3RkPgorICAgIDx0ZD5JZiB0aGUgPHZhcj5saW5rPC92YXI+IGF0dHJpYnV0ZSBpcyBhIHJlbGF0aXZlIGZpbGUgbmFtZSwgQW50IHdpbGwgZmlyc3QgdHJ5IHRvIGxvY2F0ZSB0aGUKKyAgICAgIGZpbGUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPiBhbmQgaWYgaXQgZmluZHMgYSBmaWxlIHRoZXJlIHVzZSBhbgorICAgICAgYWJzb2x1dGUgVVJMIGZvciB0aGUgPHZhcj5saW5rPC92YXI+IGF0dHJpYnV0ZSwgb3RoZXJ3aXNlIGl0IHdpbGwgcGFzcyB0aGUgZmlsZSBuYW1lIHZlcmJhdGltCisgICAgICB0byB0aGUgPGtiZD5qYXZhZG9jPC9rYmQ+IGNvbW1hbmQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPlRoZSB0aXRsZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgbmVzdGVkIDxjb2RlPiZsdDt0aXRsZSZndDs8L2NvZGU+IGVsZW1lbnQKLXdpdGggdGV4dCBjb250ZW50cywgYW5kIHRoZSBwYWNrYWdlcyBtYXkgYmUgbGlzdGVkIHdpdGggbmVzdGVkCi08Y29kZT4mbHQ7cGFja2FnZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvciB0aGUgbWFpbiB0YXNrLjwvcD4KKzxoNCBpZD0iZ3JvdXBlbGVtZW50Ij5ncm91cDwvaDQ+Cis8cD5TZXBhcmF0ZXMgcGFja2FnZXMgb24gdGhlIG92ZXJ2aWV3IHBhZ2UgaW50byB3aGF0ZXZlciBncm91cHMgeW91IHNwZWNpZnksIG9uZSBncm91cCBwZXIKK3RhYmxlLiBUaGlzIHBlcmZvcm1zIHRoZSBzYW1lIHJvbGUgYXMgdGhlIDx2YXI+Z3JvdXA8L3Zhcj4gYXR0cmlidXRlLiBZb3UgY2FuIHVzZSBlaXRoZXIgc3ludGF4IChvcgorYm90aCBhdCBvbmNlKSwgYnV0IHdpdGggdGhlIG5lc3RlZCBlbGVtZW50cyB5b3UgY2FuIGVhc2lseSBzcGVjaWZ5IG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZQorYXJndW1lbnRzLjwvcD4KKworPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50aXRsZTwvdGQ+CisgICAgPHRkPlRpdGxlIG9mIHRoZSBncm91cDwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7dGl0bGUmZ3Q7PC9jb2RlPiBnaXZlbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cGFja2FnZXM8L3RkPgorICAgIDx0ZD5MaXN0IG9mIHBhY2thZ2VzIHRvIGluY2x1ZGUgaW4gdGhhdCBncm91cC4gTXVsdGlwbGUgcGFja2FnZXMgYXJlIHNlcGFyYXRlZCB3aXRoIDxxPjo8L3E+LjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7cGFja2FnZSZndDs8L2NvZGU+cyBnaXZlbjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5UaGUgdGl0bGUgbWF5IGJlIHNwZWNpZmllZCBhcyBhIG5lc3RlZCA8Y29kZT4mbHQ7dGl0bGUmZ3Q7PC9jb2RlPiBlbGVtZW50IHdpdGggdGV4dCBjb250ZW50cywgYW5kCit0aGUgcGFja2FnZXMgbWF5IGJlIGxpc3RlZCB3aXRoIG5lc3RlZCA8Y29kZT4mbHQ7cGFja2FnZSZndDs8L2NvZGU+IGVsZW1lbnRzIGFzIGZvciB0aGUgbWFpbgordGFzay48L3A+CiAKIDxoND5kb2NsZXQ8L2g0PgotPHA+VGhlIGRvY2xldCBuZXN0ZWQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCi08YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXZhZG9jL2RvY2xldC9vdmVydmlldy5odG1sIj5kb2NsZXQ8L2E+Ci10aGF0IGphdmFkb2Mgd2lsbCB1c2UgdG8gcHJvY2VzcyB0aGUgaW5wdXQgc291cmNlIGZpbGVzLiBBIG51bWJlciBvZiB0aGUgc3RhbmRhcmQgamF2YWRvYyBhcmd1bWVudHMKLWFyZSBhY3R1YWxseSBhcmd1bWVudHMgb2YgdGhlIHN0YW5kYXJkIGRvY2xldC4gSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgamF2YWRvYwotdGFzaydzIGF0dHJpYnV0ZXMsIHRoZXkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGRvY2xldCBzcGVjaWZpZWQgaW4gdGhlCi08Y29kZT4mbHQ7ZG9jbGV0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIFN1Y2ggYXR0cmlidXRlcyBzaG91bGQgb25seSBiZSBzcGVjaWZpZWQsCi10aGVyZWZvcmUsIGlmIHRoZXkgY2FuIGJlIGludGVycHJldGVkIGJ5IHRoZSBkb2NsZXQgaW4gdXNlLjwvcD4KKzxwPlRoZSBkb2NsZXQgbmVzdGVkIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5Cit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phdmFkb2MvZG9jbGV0L292ZXJ2aWV3Lmh0bWwiCit0YXJnZXQ9Il90b3AiPmRvY2xldDwvYT4gdGhhdCA8a2JkPmphdmFkb2M8L2tiZD4gd2lsbCB1c2UgdG8gcHJvY2VzcyB0aGUgaW5wdXQgc291cmNlIGZpbGVzLiBBCitudW1iZXIgb2YgdGhlIHN0YW5kYXJkIDxrYmQ+amF2YWRvYzwva2JkPiBhcmd1bWVudHMgYXJlIGFjdHVhbGx5IGFyZ3VtZW50cyBvZiB0aGUgc3RhbmRhcmQKK2RvY2xldC4gSWYgdGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+amF2YWRvYzwvY29kZT4gdGFzaydzIGF0dHJpYnV0ZXMsIHRoZXkgd2lsbCBiZSBwYXNzZWQgdG8KK3RoZSBkb2NsZXQgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT4mbHQ7ZG9jbGV0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIFN1Y2ggYXR0cmlidXRlcyBzaG91bGQgb25seQorYmUgc3BlY2lmaWVkLCB0aGVyZWZvcmUsIGlmIHRoZXkgY2FuIGJlIGludGVycHJldGVkIGJ5IHRoZSBkb2NsZXQgaW4gdXNlLjwvcD4KIAotPHA+SWYgdGhlIGRvY2xldCByZXF1aXJlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMsIHRoZXNlIGNhbiBiZSBzcGVjaWZpZWQgd2l0aAotPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudHMgd2l0aGluIHRoZSA8Y29kZT4mbHQ7ZG9jbGV0Jmd0OzwvY29kZT4KLWVsZW1lbnQuIFRoZXNlIHBhcmFtZXRlcnMgYXJlIHJlc3RyaWN0ZWQgdG8gc2ltcGxlIHN0cmluZ3MuIEFuIGV4YW1wbGUgdXNhZ2UKLW9mIHRoZSBkb2NsZXQgZWxlbWVudCBpcyBzaG93biBiZWxvdzo8L3A+Cis8cD5JZiB0aGUgZG9jbGV0IHJlcXVpcmVzIGFkZGl0aW9uYWwgcGFyYW1ldGVycywgdGhlc2UgY2FuIGJlIHNwZWNpZmllZAord2l0aCA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoaW4gdGhlIDxjb2RlPiZsdDtkb2NsZXQmZ3Q7PC9jb2RlPiBlbGVtZW50LiBUaGVzZQorcGFyYW1ldGVycyBhcmUgcmVzdHJpY3RlZCB0byBzaW1wbGUgc3RyaW5ncy4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgPGNvZGU+ZG9jbGV0PC9jb2RlPiBlbGVtZW50IGlzCitzaG93biBiZWxvdzo8L3A+CiAKLTxwcmU+ICAmbHQ7amF2YWRvYyAuLi4gJmd0OwotICAgICAmbHQ7ZG9jbGV0IG5hbWU9JnF1b3Q7dGhlRG9jbGV0JnF1b3Q7Ci0gICAgICAgICAgICAgcGF0aD0mcXVvdDtwYXRoL3RvL3RoZURvY2xldCZxdW90OyZndDsKLSAgICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7LWZvbyZxdW90OyB2YWx1ZT0mcXVvdDtmb292YWx1ZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90Oy1iYXImcXVvdDsgdmFsdWU9JnF1b3Q7YmFydmFsdWUmcXVvdDsvJmd0OwotICAgICAmbHQ7L2RvY2xldCZndDsKLSAgJmx0Oy9qYXZhZG9jJmd0OwotPC9wcmU+Cis8cHJlPgorJmx0O2phdmFkb2MgLi4uICZndDsKKyAgICZsdDtkb2NsZXQgbmFtZT0mcXVvdDt0aGVEb2NsZXQmcXVvdDsKKyAgICAgICAgICAgcGF0aD0mcXVvdDtwYXRoL3RvL3RoZURvY2xldCZxdW90OyZndDsKKyAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90Oy1mb28mcXVvdDsgdmFsdWU9JnF1b3Q7Zm9vdmFsdWUmcXVvdDsvJmd0OworICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7LWJhciZxdW90OyB2YWx1ZT0mcXVvdDtiYXJ2YWx1ZSZxdW90Oy8mZ3Q7CisgICAmbHQ7L2RvY2xldCZndDsKKyZsdDsvamF2YWRvYyZndDs8L3ByZT4KIAotPGg0PjxhIG5hbWU9InRhZ2VsZW1lbnQiPnRhZzwvYT48L2g0PgorPGg0IGlkPSJ0YWdlbGVtZW50Ij50YWc8L2g0PgogCi08cD5JZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgc3RhbmRhcmQgdGFnIHVzaW5nIGEgbmVzdGVkIHRhZyBlbGVtZW50Ci1iZWNhdXNlIHlvdSB3YW50IHRvIGRldGVybWluZSB0aGUgb3JkZXIgdGhlIHRhZ3MgYXJlIG91dHB1dCwgeW91IG11c3QKLW5vdCBzZXQgdGhlIGRlc2NyaXB0aW9uIGF0dHJpYnV0ZSBmb3IgdGhvc2UgdGFncy48L3A+Cis8cD5JZiB5b3Ugd2FudCB0byBzcGVjaWZ5IGEgc3RhbmRhcmQgdGFnIHVzaW5nIGEgbmVzdGVkIDxjb2RlPnRhZzwvY29kZT4gZWxlbWVudCBiZWNhdXNlIHlvdSB3YW50IHRvCitkZXRlcm1pbmUgdGhlIG9yZGVyIHRoZSB0YWdzIGFyZSBvdXRwdXQsIHlvdSBtdXN0IG5vdCBzZXQgdGhlIDx2YXI+ZGVzY3JpcHRpb248L3Zhcj4gYXR0cmlidXRlIGZvcgordGhvc2UgdGFncy48L3A+CiAKIDxoNT5QYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSB3aWR0aD0iOTAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSB0YWcgKGUuZy4gPGNvZGU+dG9kbzwvY29kZT4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIHRoZSA8Y29kZT5kaXI8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIHRhZyAoZS5nLiA8cT50b2RvPC9xPik8L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyB0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIGlzIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRlc2NyaXB0aW9uIGZvciB0YWcgKGUuZy4gPGNvZGU+VG8gZG86PC9jb2RlPik8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICBObywgdGhlIGphdmFkb2MgZXhlY3V0YWJsZSB3aWxsIHBpY2sgYSBkZWZhdWx0IGlmIHRoaXMgaXMgbm90IHNwZWNpZmllZC4KKyAgICA8dGQ+ZGVzY3JpcHRpb248L3RkPgorICAgIDx0ZD5EZXNjcmlwdGlvbiBmb3IgdGFnIChlLmcuIDxxPlRvIGRvOjwvcT4pPC90ZD4KKyAgICA8dGQ+CisgICAgICBObywgdGhlIDxrYmQ+amF2YWRvYzwva2JkPiBleGVjdXRhYmxlIHdpbGwgcGljayBhIGRlZmF1bHQgaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkCiAgICAgPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5hYmxlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIG9yIG5vdCB0aGUgdGFnIGlzIGVuYWJsZWQgKGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+KTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuYWJsZWQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIG9yIG5vdCB0aGUgdGFnIGlzIGVuYWJsZWQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zY29wZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TY29wZSBmb3IgdGhlIHRhZyAtIHRoZSBlbGVtZW50cyBpbiB3aGljaCBpdCBjYW4gYmUgdXNlZC4gVGhpcwotICAgIGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc29tZSBvZiB0aGUgZWxlbWVudHM6IDxjb2RlPm92ZXJ2aWV3PC9jb2RlPiwKLSAgICA8Y29kZT5wYWNrYWdlczwvY29kZT4sIDxjb2RlPnR5cGVzPC9jb2RlPiwgPGNvZGU+Y29uc3RydWN0b3JzPC9jb2RlPiwKLSAgICA8Y29kZT5tZXRob2RzPC9jb2RlPiwgPGNvZGU+ZmllbGRzPC9jb2RlPiBvciB0aGUgZGVmYXVsdCwgPGNvZGU+YWxsPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zY29wZTwvdGQ+CisgICAgPHRkPlNjb3BlIGZvciB0aGUgdGFnJm1kYXNoO3RoZSBlbGVtZW50cyBpbiB3aGljaCBpdCBjYW4gYmUgdXNlZC4gVGhpcyBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0CisgICAgICBvZiBzb21lIG9mIHRoZQorICAgICAgZWxlbWVudHM6IDxxPm92ZXJ2aWV3PC9xPiwgPHE+cGFja2FnZXM8L3E+LCA8cT50eXBlczwvcT4sIDxxPmNvbnN0cnVjdG9yczwvcT4sIDxxPm1ldGhvZHM8L3E+LCA8cT5maWVsZHM8L3E+CisgICAgICBvciB0aGUgZGVmYXVsdCwgPHE+YWxsPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+YWxsPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsIHRoaXMgZWxlbWVudCB3aWxsIGJlaGF2ZSBhcyBhbiBpbXBsaWNpdAotICAgIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4uIFRoZSBmaWxlcyBpbmNsdWRlZCBieSB0aGlzIGZpbGVzZXQgc2hvdWxkCi0gICAgY29udGFpbiBlYWNoIHRhZyBkZWZpbml0aW9uIG9uIGEgc2VwYXJhdGUgbGluZSwgYXMgZGVzY3JpYmVkIGluIHRoZQotICAgIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXZhZG9jLmh0bWwjamF2YWRvY3RhZ3MiPkphdmFkb2MgcmVmZXJlbmNlIGd1aWRlPC9hPjoKLSAgICA8cHJlPmVqYi5iZWFuOnQ6WERvY2xldCBFSkIgVGFnCisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPklmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgdGhpcyBlbGVtZW50IHdpbGwgYmVoYXZlIGFzIGFuCisgICAgICBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+LiBUaGUgZmlsZXMgaW5jbHVkZWQgYnkgdGhpcyBmaWxlc2V0CisgICAgICBzaG91bGQgY29udGFpbiBlYWNoIHRhZyBkZWZpbml0aW9uIG9uIGEgc2VwYXJhdGUgbGluZSwgYXMgZGVzY3JpYmVkIGluCisgICAgICB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXZhZG9jLmh0bWwjamF2YWRvY3RhZ3MiCisgICAgICB0YXJnZXQ9Il90b3AiPkphdmFkb2MgcmVmZXJlbmNlIGd1aWRlPC9hPjoKKyAgICAgIDxwcmU+ZWpiLmJlYW46dDpYRG9jbGV0IEVKQiBUYWcKIHRvZG86YTpUbyBEbzwvcHJlPgotICAgICAgPGI+Tm90ZTo8L2I+IFRoZSAgSmF2YWRvYyByZWZlcmVuY2UgcXVpZGUgaGFzIGRvdWJsZSBxdW90ZXMgYXJvdW5kCi10aGUgZGVzY3JpcHRpb24gcGFydCBvZiB0aGUgZGVmaW5pdGlvbi4gVGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gdXNlZCBpbgotYSBmaWxlLCBhcyB0aGUgZGVmaW5pdGlvbiBpcyBxdW90ZWQgYWdhaW4gd2hlbiBnaXZlbiB0bwotdGhlIGphdmFkb2MgcHJvZ3JhbS4KLSAgICA8YnIvPgotICAgICAgPGI+Tm90ZTo8L2I+IElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgYWxsIHRoZSBvdGhlciBhdHRyaWJ1dGVzIGluIHRoaXMKLSAgICBlbGVtZW50IHdpbGwgYmUgaWdub3JlZC4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGUgSmF2YWRvYyByZWZlcmVuY2UgcXVpZGUgaGFzIGRvdWJsZSBxdW90ZXMgYXJvdW5kIHRoZSBkZXNjcmlwdGlvbgorICAgICAgcGFydCBvZiB0aGUgZGVmaW5pdGlvbi4gVGhpcyB3aWxsIG5vdCB3b3JrIHdoZW4gdXNlZCBpbiBhIGZpbGUsIGFzIHRoZSBkZWZpbml0aW9uIGlzIHF1b3RlZAorICAgICAgYWdhaW4gd2hlbiBnaXZlbiB0byB0aGUgPGtiZD5qYXZhZG9jPC9rYmQ+IHByb2dyYW0uPGJyLz4KKyAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLCBhbGwgdGhlIG90aGVyIGF0dHJpYnV0ZXMgaW4gdGhpcworICAgICAgZWxlbWVudCB3aWxsIGJlIGlnbm9yZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9InRhZ2xldGVsZW1lbnQiPnRhZ2xldDwvYT48L2g0PgotPHA+VGhlIHRhZ2xldCBuZXN0ZWQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgY3VzdG9tCi0gIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phdmFkb2MvdGFnbGV0L292ZXJ2aWV3Lmh0bWwiPnRhZ2xldHM8L2E+IGJleW9uZCA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL3Rvb2xzL3dpbmRvd3MvamF2YWRvYy5odG1sI2phdmFkb2N0YWdzIiB0YXJnZXQ9Il9ibGFuayI+dGhlIGRlZmF1bHQgdGFnbGV0czwvYT4uPC9wPgorPGg0IGlkPSJ0YWdsZXRlbGVtZW50Ij50YWdsZXQ8L2g0PgorPHA+VGhlIHRhZ2xldCBuZXN0ZWQgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkKK2N1c3RvbSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvamF2YWRvYy90YWdsZXQvb3ZlcnZpZXcuaHRtbCIKK3RhcmdldD0iX3RvcCI+dGFnbGV0czwvYT4KK2JleW9uZCA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy90b29scy93aW5kb3dzL2phdmFkb2MuaHRtbCNqYXZhZG9jdGFncyIKK3RhcmdldD0iX3RvcCI+dGhlIGRlZmF1bHQgdGFnbGV0czwvYT4uPC9wPgogCiA8aDU+UGFyYW1ldGVyczwvaDU+Ci08dGFibGUgd2lkdGg9IjkwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHRhZ2xldCBjbGFzcwotICAgICAgICAgICAgICAoZS5nLiA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXZhZG9jL3RhZ2xldC9Ub0RvVGFnbGV0LmphdmEiPgotICAgICAgICAgICAgICA8Y29kZT5jb20uc3VuLnRvb2xzLmRvY2xldHMuVG9Eb1RhZ2xldDwvY29kZT48L2E+KTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHRhZ2xldCBjbGFzcworICAgICAgKGUuZy4gPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phdmFkb2MvdGFnbGV0L1RvRG9UYWdsZXQuamF2YSIKKyAgICAgIHRhcmdldD0iX3RvcCI+PGNvZGU+Y29tLnN1bi50b29scy5kb2NsZXRzLlRvRG9UYWdsZXQ8L2NvZGU+PC9hPik8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgcGF0aCBzcGVjaWZ5aW5nIHRoZSBzZWFyY2ggcGF0aCBmb3IgdGhlIHRhZ2xldCBjbGFzcwotICAgICAgICAgICAgKGUuZy4gPGNvZGU+L2hvbWUvdGFnbGV0czwvY29kZT4pLgotICAgICAgICAgICAgVGhlIHBhdGggbWF5IGFsc28gYmUgc3BlY2lmaWVkIGJ5IGEgbmVzdGVkIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnBhdGg8L3RkPgorICAgIDx0ZD5BIHBhdGggc3BlY2lmeWluZyB0aGUgc2VhcmNoIHBhdGggZm9yIHRoZSB0YWdsZXQgY2xhc3MgKGUuZy4gPHNhbXA+L2hvbWUvdGFnbGV0czwvc2FtcD4pLgorICAgICAgVGhlIHBhdGggbWF5IGFsc28gYmUgc3BlY2lmaWVkIGJ5IGEgbmVzdGVkIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKQEAgLTg5Nyw3OCArODUyLDc1IEBACiBhbmQgPGk+bW9kdWxlc291cmNlcGF0aDwvaT4gZWxlbWVudHMgcmVzcGVjdGl2ZWx5LjwvcD4KIAogPGg0PmFyZzwvaDQ+Ci0KLTxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IHRvIHNwZWNpZnkgYWRkaXRpb25hbAotYXJndW1lbnRzLiAgU2VlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kIGxpbmUKLWFyZ3VtZW50czwvYT4uIDxlbT5TaW5jZSBBbnQgMS42PC9lbT48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+PC9wPgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gdG8gc3BlY2lmeSBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KK1NlZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZCBsaW5lIGFyZ3VtZW50czwvYT4uPC9wPgogCiA8aDM+RXhhbXBsZTwvaDM+Ci08cHJlPiAgJmx0O2phdmFkb2MgcGFja2FnZW5hbWVzPSZxdW90O2NvbS5kdW1teS50ZXN0LiomcXVvdDsKLSAgICAgICAgICAgc291cmNlcGF0aD0mcXVvdDtzcmMmcXVvdDsKLSAgICAgICAgICAgZXhjbHVkZXBhY2thZ2VuYW1lcz0mcXVvdDtjb20uZHVtbXkudGVzdC5kb2MtZmlsZXMuKiZxdW90OwotICAgICAgICAgICBkZWZhdWx0ZXhjbHVkZXM9JnF1b3Q7eWVzJnF1b3Q7Ci0gICAgICAgICAgIGRlc3RkaXI9JnF1b3Q7ZG9jcy9hcGkmcXVvdDsKLSAgICAgICAgICAgYXV0aG9yPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIHVzZT0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIHdpbmRvd3RpdGxlPSZxdW90O1Rlc3QgQVBJJnF1b3Q7Jmd0OwotICAgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKLSAgICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7Ci0gICAgJmx0O3RhZyBuYW1lPSZxdW90O3RvZG8mcXVvdDsgc2NvcGU9JnF1b3Q7YWxsJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O1RvIGRvOiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OwotICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKLSAgICAmbHQ7bGluayBvZmZsaW5lPSZxdW90O3RydWUmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OwotICAgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS8mcXVvdDsvJmd0OwotICAmbHQvamF2YWRvYyZndDs8L3ByZT4KKzxwcmU+CismbHQ7amF2YWRvYyBwYWNrYWdlbmFtZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuKiZxdW90OworICAgICAgICAgc291cmNlcGF0aD0mcXVvdDtzcmMmcXVvdDsKKyAgICAgICAgIGV4Y2x1ZGVwYWNrYWdlbmFtZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuZG9jLWZpbGVzLiomcXVvdDsKKyAgICAgICAgIGRlZmF1bHRleGNsdWRlcz0mcXVvdDt5ZXMmcXVvdDsKKyAgICAgICAgIGRlc3RkaXI9JnF1b3Q7ZG9jcy9hcGkmcXVvdDsKKyAgICAgICAgIGF1dGhvcj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICB2ZXJzaW9uPSZxdW90O3RydWUmcXVvdDsKKyAgICAgICAgIHVzZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICB3aW5kb3d0aXRsZT0mcXVvdDtUZXN0IEFQSSZxdW90OyZndDsKKyAgJmx0O2RvY3RpdGxlJmd0OyZsdDshW0NEQVRBWyZsdDtoMSZndDtUZXN0Jmx0Oy9oMSZndDtdXSZndDsmbHQ7L2RvY3RpdGxlJmd0OworICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7CisgICZsdDt0YWcgbmFtZT0mcXVvdDt0b2RvJnF1b3Q7IHNjb3BlPSZxdW90O2FsbCZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtUbyBkbzomcXVvdDsvJmd0OworICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMSBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5hKiZxdW90Oy8mZ3Q7CisgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKKyAgJmx0O2xpbmsgb2ZmbGluZT0mcXVvdDt0cnVlJnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvJnF1b3Q7IHBhY2thZ2VsaXN0TG9jPSZxdW90O0M6XHRtcCZxdW90Oy8mZ3Q7CisgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvJnF1b3Q7LyZndDsKKyZsdDsvamF2YWRvYyZndDs8L3ByZT4KIAogPHA+aXMgdGhlIHNhbWUgYXM8L3A+CiAKLTxwcmU+ICAmbHQ7amF2YWRvYwotICAgICAgICAgICBkZXN0ZGlyPSZxdW90O2RvY3MvYXBpJnF1b3Q7Ci0gICAgICAgICAgIGF1dGhvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIHZlcnNpb249JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICB1c2U9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICB3aW5kb3d0aXRsZT0mcXVvdDtUZXN0IEFQSSZxdW90OyZndDsKKzxwcmU+CismbHQ7amF2YWRvYyBkZXN0ZGlyPSZxdW90O2RvY3MvYXBpJnF1b3Q7CisgICAgICAgICBhdXRob3I9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICB1c2U9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgd2luZG93dGl0bGU9JnF1b3Q7VGVzdCBBUEkmcXVvdDsmZ3Q7CiAKLSAgICAmbHQ7cGFja2FnZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDt5ZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0LyoqJnF1b3Q7LyZndDsKLSAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Y29tL2R1bW15L3Rlc3QvZG9jLWZpbGVzLyoqJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3BhY2thZ2VzZXQmZ3Q7CisgICZsdDtwYWNrYWdlc2V0IGRpcj0mcXVvdDtzcmMmcXVvdDsgZGVmYXVsdGV4Y2x1ZGVzPSZxdW90O3llcyZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0LyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0L2RvYy1maWxlcy8qKiZxdW90Oy8mZ3Q7CisgICZsdDsvcGFja2FnZXNldCZndDsKIAotICAgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKLSAgICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7Ci0gICAgJmx0O3RhZyBuYW1lPSZxdW90O3RvZG8mcXVvdDsgc2NvcGU9JnF1b3Q7YWxsJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O1RvIGRvOiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OwotICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKLSAgICAmbHQ7bGluayBvZmZsaW5lPSZxdW90O3RydWUmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OwotICAgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS8mcXVvdDsvJmd0OwotICAmbHQvamF2YWRvYyZndDs8L3ByZT4KKyAgJmx0O2RvY3RpdGxlJmd0OyZsdDshW0NEQVRBWyZsdDtoMSZndDtUZXN0Jmx0Oy9oMSZndDtdXSZndDsmbHQ7L2RvY3RpdGxlJmd0OworICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7CisgICZsdDt0YWcgbmFtZT0mcXVvdDt0b2RvJnF1b3Q7IHNjb3BlPSZxdW90O2FsbCZxdW90OyBkZXNjcmlwdGlvbj0mcXVvdDtUbyBkbzomcXVvdDsvJmd0OworICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMSBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5hKiZxdW90Oy8mZ3Q7CisgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKKyAgJmx0O2xpbmsgb2ZmbGluZT0mcXVvdDt0cnVlJnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvJnF1b3Q7IHBhY2thZ2VsaXN0TG9jPSZxdW90O0M6XHRtcCZxdW90Oy8mZ3Q7CisgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvJnF1b3Q7LyZndDsKKyZsdDsvamF2YWRvYyZndDs8L3ByZT4KIAogPHA+b3I8L3A+CiAKLTxwcmU+ICAmbHQ7amF2YWRvYwotICAgICAgICAgICBkZXN0ZGlyPSZxdW90O2RvY3MvYXBpJnF1b3Q7Ci0gICAgICAgICAgIGF1dGhvcj0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgIHZlcnNpb249JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICB1c2U9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICB3aW5kb3d0aXRsZT0mcXVvdDtUZXN0IEFQSSZxdW90OyZndDsKKzxwcmU+CismbHQ7amF2YWRvYyBkZXN0ZGlyPSZxdW90O2RvY3MvYXBpJnF1b3Q7CisgICAgICAgICBhdXRob3I9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgdmVyc2lvbj0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICB1c2U9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICAgd2luZG93dGl0bGU9JnF1b3Q7VGVzdCBBUEkmcXVvdDsmZ3Q7CiAKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7IGRlZmF1bHRleGNsdWRlcz0mcXVvdDt5ZXMmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0LyoqJnF1b3Q7LyZndDsKLSAgICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7Y29tL2R1bW15L3Rlc3QvZG9jLWZpbGVzLyoqJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMmcXVvdDsgZGVmYXVsdGV4Y2x1ZGVzPSZxdW90O3llcyZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0LyoqJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2NvbS9kdW1teS90ZXN0L2RvYy1maWxlcy8qKiZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKIAotICAgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKLSAgICAmbHQ7Ym90dG9tJmd0OyZsdDshW0NEQVRBWyZsdDtpJmd0O0NvcHlyaWdodCAmYW1wOyMxNjk7IDIwMDAgRHVtbXkgQ29ycC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4mbHQ7L2kmZ3Q7XV0mZ3Q7Jmx0Oy9ib3R0b20mZ3Q7Ci0gICAgJmx0O3RhZyBuYW1lPSZxdW90O3RvZG8mcXVvdDsgc2NvcGU9JnF1b3Q7YWxsJnF1b3Q7IGRlc2NyaXB0aW9uPSZxdW90O1RvIGRvOiZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OwotICAgICZsdDtncm91cCB0aXRsZT0mcXVvdDtHcm91cCAyIFBhY2thZ2VzJnF1b3Q7IHBhY2thZ2VzPSZxdW90O2NvbS5kdW1teS50ZXN0LmIqOmNvbS5kdW1teS50ZXN0LmMqJnF1b3Q7LyZndDsKLSAgICAmbHQ7bGluayBvZmZsaW5lPSZxdW90O3RydWUmcXVvdDsgaHJlZj0mcXVvdDtodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OwotICAgICZsdDtsaW5rIGhyZWY9JnF1b3Q7aHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS8mcXVvdDsvJmd0OwotICAmbHQvamF2YWRvYyZndDs8L3ByZT4KLQotCisgICZsdDtkb2N0aXRsZSZndDsmbHQ7IVtDREFUQVsmbHQ7aDEmZ3Q7VGVzdCZsdDsvaDEmZ3Q7XV0mZ3Q7Jmx0Oy9kb2N0aXRsZSZndDsKKyAgJmx0O2JvdHRvbSZndDsmbHQ7IVtDREFUQVsmbHQ7aSZndDtDb3B5cmlnaHQgJmFtcDsjMTY5OyAyMDAwIER1bW15IENvcnAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuJmx0Oy9pJmd0O11dJmd0OyZsdDsvYm90dG9tJmd0OworICAmbHQ7dGFnIG5hbWU9JnF1b3Q7dG9kbyZxdW90OyBzY29wZT0mcXVvdDthbGwmcXVvdDsgZGVzY3JpcHRpb249JnF1b3Q7VG8gZG86JnF1b3Q7LyZndDsKKyAgJmx0O2dyb3VwIHRpdGxlPSZxdW90O0dyb3VwIDEgUGFja2FnZXMmcXVvdDsgcGFja2FnZXM9JnF1b3Q7Y29tLmR1bW15LnRlc3QuYSomcXVvdDsvJmd0OworICAmbHQ7Z3JvdXAgdGl0bGU9JnF1b3Q7R3JvdXAgMiBQYWNrYWdlcyZxdW90OyBwYWNrYWdlcz0mcXVvdDtjb20uZHVtbXkudGVzdC5iKjpjb20uZHVtbXkudGVzdC5jKiZxdW90Oy8mZ3Q7CisgICZsdDtsaW5rIG9mZmxpbmU9JnF1b3Q7dHJ1ZSZxdW90OyBocmVmPSZxdW90O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpLyZxdW90OyBwYWNrYWdlbGlzdExvYz0mcXVvdDtDOlx0bXAmcXVvdDsvJmd0OworICAmbHQ7bGluayBocmVmPSZxdW90O2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpLyZxdW90Oy8mZ3Q7CismbHQ7L2phdmFkb2MmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2phdmFoLmh0bWwgYi9tYW51YWwvVGFza3MvamF2YWguaHRtbAppbmRleCBkMWRhYTdjLi5iYzkyYmY5IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvamF2YWguaHRtbAorKysgYi9tYW51YWwvVGFza3MvamF2YWguaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI0MyArMTUsMjMxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5KYXZhaCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJqYXZhaCI+SmF2YWg8L2E+PC9oMj4KKzxoMiBpZD0iamF2YWgiPkphdmFoPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiA8cD5HZW5lcmF0ZXMgSk5JIGhlYWRlcnMgZnJvbSBhIEphdmEgY2xhc3MuPC9wPgotPHA+IFdoZW4gdGhpcyB0YXNrIGV4ZWN1dGVzLCBpdCB3aWxsIGdlbmVyYXRlIHRoZSBDIGhlYWRlciBhbmQgc291cmNlIGZpbGVzIHRoYXQKLWFyZSBuZWVkZWQgdG8gaW1wbGVtZW50IG5hdGl2ZSBtZXRob2RzLiBKTkkgb3BlcmF0ZXMgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uCi13aGV0aGVyIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXZhaC5odG1sIj5KREsxLjIrPC9hPgotb3IgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qZGsvMS4xL2RvY3MvdG9vbGRvY3Mvd2luMzIvamF2YWguaHRtbCI+cHJlLUpESzEuMjwvYT4KLXN5c3RlbXMgYXJlIHVzZWQuPC9wPgorPHA+V2hlbiB0aGlzIHRhc2sgZXhlY3V0ZXMsIGl0IHdpbGwgZ2VuZXJhdGUgdGhlIEMgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgbmVlZGVkIHRvCitpbXBsZW1lbnQgbmF0aXZlIG1ldGhvZHMuIEpOSSBvcGVyYXRlcyBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24KK3doZXRoZXIgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXZhaC5odG1sIgordGFyZ2V0PSJfdG9wIj5KREsgMS4yKzwvYT4KK29yIDxhIGhyZWY9Imh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAyMTAxODIzMjcxNy9odHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2pkay8xLjEvZG9jcy90b29sZG9jcy93aW4zMi9qYXZhaC5odG1sIgordGFyZ2V0PSJfdG9wIj5wcmUtMS4yIEpESzwvYT4gc3lzdGVtcyBhcmUgdXNlZC48L3A+CiAKIDxwPklmIHlvdSBhcmUgYnVpbGRpbmcgd2l0aCBKYXZhIDggb3IgYWJvdmUgY29uc2lkZXIKLSAgdXNpbmcgPGEgaHJlZj0iamF2YWMuaHRtbCI+PGNvZGU+amF2YWM8L2NvZGU+PC9hPidzIDxjb2RlPm5hdGl2ZWhlYWRlcmRpcjwvY29kZT4KLSAgYXR0cmlidXRlIGluc3RlYWQgd2hpY2ggYWxsb3dzIHlvdSB0byBjb21waWxlIHRoZSBjbGFzc2VzIGFuZAotICBnZW5lcmF0ZSB0aGUgbmF0aXZlIGhlYWRlciBmaWxlcyB3aXRoIGEgc2luZ2xlIHN0ZXAuPC9wPgordXNpbmcgPGEgaHJlZj0iamF2YWMuaHRtbCI+PGNvZGU+amF2YWM8L2NvZGU+PC9hPidzIDx2YXI+bmF0aXZlaGVhZGVyZGlyPC92YXI+IGF0dHJpYnV0ZSBpbnN0ZWFkCit3aGljaCBhbGxvd3MgeW91IHRvIGNvbXBpbGUgdGhlIGNsYXNzZXMgYW5kIGdlbmVyYXRlIHRoZSBuYXRpdmUgaGVhZGVyIGZpbGVzIGluIGEgc2luZ2xlIHN0ZXAuPC9wPgogCi08cD48Yj5Ob3RlPC9iPiB0aGUgPGNvZGU+amF2YWg8L2NvZGU+IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYXMgb2YgSmF2YSA5Ci0gIGFuZCByZW1vdmVkIGFzIG9mIEphdmEgMTAuIFRyeWluZyB0byB1c2UgaXQgd2l0aCBKYXZhMTAgd2lsbAotICBmYWlsLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogPGNvZGU+amF2YWg8L2NvZGU+IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gSmF2YSA5IGFuZCByZW1vdmVkIGluIEphdmEKKzEwLiBBdHRlbXB0cyB0byB1c2UgaXQgd2l0aCBKYXZhIDEwIHdpbGwgZmFpbC48L3A+CiAKLTxwPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29tcGlsZXJzLiBUaGlzIGNhbiBiZSBzZWxlY3RlZAotd2l0aCB0aGUgPGNvZGU+aW1wbGVtZW50YXRpb248L2NvZGU+IGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBlbGVtZW50LiAgPGEKLW5hbWU9ImltcGxlbWVudGF0aW9udmFsdWVzIj5IZXJlIGFyZSB0aGUgY2hvaWNlcyBvZiB0aGUgYXR0cmlidXRlPC9hPjo8L3A+Cis8cCBpZD0iaW1wbGVtZW50YXRpb252YWx1ZXMiPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29tcGlsZXJzLiBUaGlzIGNhbiBiZSBzZWxlY3RlZCB3aXRoCit0aGUgPHZhcj5pbXBsZW1lbnRhdGlvbjwvdmFyPiBhdHRyaWJ1dGUgb3IgYSBuZXN0ZWQgZWxlbWVudC4gSGVyZSBhcmUgdGhlIGNob2ljZXMgb2YgdGhlCithdHRyaWJ1dGU6PC9wPgogPHVsPgotICA8bGk+ZGVmYXVsdCAtIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgcGxhdGZvcm0uPC9saT4KLSAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREspIC0gZGVmYXVsdCB3aGVuIG5vdAotICAgIHJ1bm5pbmcgb24gS2FmZmVlIG9yIGdjai9naWogb3IgSmF2YTkuPC9saT4KLSAgPGxpPmthZmZlaCAodGhlIG5hdGl2ZSBzdGFuZGFyZCBjb21waWxlciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyIgdGFyZ2V0PSJfdG9wIj5LYWZmZTwvYT4pPC9saT4KLSAgPGxpPmdjamggKHRoZSBuYXRpdmUgc3RhbmRhcmQgY29tcGlsZXIKLSAgb2YgPGEgaHJlZj0iaHR0cDovL2djYy5nbnUub3JnL2phdmEvIgotICAgICAgICB0YXJnZXQ9Il90b3AiPmdjaiBhbmQgZ2lqPC9hPikgPGVtPnNpbmNlIEFwYWNoZSBBbnQgMS44LjI8L2VtPjwvbGk+Ci0gIDxsaT5mb3JraW5nIC0gcnVucyB0aGUgamF2YWggZXhlY3V0YWJsZSB2aWEgaXRzIGNvbW1hbmQgbGluZQotICAgIGludGVyZmFjZSBpbiBhIHNlcGFyYXRlIHByb2Nlc3MuIERlZmF1bHQgd2hlbiBydW5uaW5nIG9uCi0gICAgSmF2YTkuIDxlbT5zaW5jZSBBbnQgMS45Ljg8L2VtPjwvbGk+CisgIDxsaT48cT5kZWZhdWx0PC9xPiZtZGFzaDt0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIHBsYXRmb3JtLjwvbGk+CisgIDxsaT48cT5zdW48L3E+Jm1kYXNoO3RoZSBzdGFuZGFyZCBjb21waWxlciBvZiB0aGUgSkRLLjwvbGk+CisgIDxsaT48cT5rYWZmZWg8L3E+Jm1kYXNoO3RoZSBuYXRpdmUgc3RhbmRhcmQgY29tcGlsZXIgb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2thZmZlL2thZmZlIgorICAgIHRhcmdldD0iX3RvcCI+S2FmZmU8L2E+LjwvbGk+CisgIDxsaT48cT5nY2poPC9xPiZtZGFzaDt0aGUgbmF0aXZlIHN0YW5kYXJkIGNvbXBpbGVyCisgICAgb2YgPGEgaHJlZj0iaHR0cHM6Ly9nY2MuZ251Lm9yZy9nY2MtNy9jaGFuZ2VzLmh0bWwjamF2YSIgdGFyZ2V0PSJfdG9wIj5nY2ogYW5kCisgICAgZ2lqPC9hPi4gPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjI8L2VtPjwvbGk+CisgIDxsaT48cT5mb3JraW5nPC9xPiZtZGFzaDtydW5zIHRoZSA8a2JkPmphdmFoPC9rYmQ+IGV4ZWN1dGFibGUgdmlhIGl0cyBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGluCisgICAgYSBzZXBhcmF0ZSBwcm9jZXNzLiBEZWZhdWx0IHdoZW4gbm90IHJ1bm5pbmcgb24gS2FmZmUgb3IgZ2NqL2dpaiA8ZW0+c2luY2UgQW50IDEuOS44PC9lbT48L2xpPgogPC91bD4KIAotPHA+PGI+Tm90ZTo8L2I+IGlmIHlvdSBhcmUgdXNpbmcgdGhpcyB0YXNrIHRvIHdvcmsgb24gbXVsdGlwbGUgZmlsZXMKLSAgdGhlIGNvbW1hbmQgbGluZSBtYXkgYmVjb21lIHRvbyBsb25nIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMuCi0gIFVuZm9ydHVuYXRlbHkgdGhlIGphdmFoIGNvbW1hbmQgZG9lc24ndCBzdXBwb3J0IGNvbW1hbmQgYXJndW1lbnQKLSAgZmlsZXMgdGhlIHdheSBqYXZhYyAoZm9yIGV4YW1wbGUpIGRvZXMsIHNvIGFsbCB0aGF0IGNhbiBiZSBkb25lIGlzCi0gIGJyZWFraW5nIHRoZSBhbW91bnQgb2YgY2xhc3NlcyB0byBjb21waWxlIGludG8gc21hbGxlciBjaHVua3MuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBpZiB5b3UgYXJlIHVzaW5nIHRoaXMgdGFzayB0byB3b3JrIG9uIG11bHRpcGxlIGZpbGVzIHRoZSBjb21tYW5kIGxpbmUgbWF5CitiZWNvbWUgdG9vIGxvbmcgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gIFVuZm9ydHVuYXRlbHkgdGhlIDxrYmQ+amF2YWg8L2tiZD4gY29tbWFuZCBkb2Vzbid0CitzdXBwb3J0IGNvbW1hbmQgYXJndW1lbnQgZmlsZXMgdGhlIHdheSA8a2JkPmphdmFjPC9rYmQ+IChmb3IgZXhhbXBsZSkgZG9lcywgc28gYWxsIHRoYXQgY2FuIGJlCitkb25lIGlzIGJyZWFraW5nIHRoZSBhbW91bnQgb2YgY2xhc3NlcyB0byBjb21waWxlIGludG8gc21hbGxlciBjaHVua3MuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgKG9yIGNsYXNzZXMsCi0gICAgICBzZXBhcmF0ZWQgYnkgY29tbWFzKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5jbGFzczwvdGQ+CisgICAgPHRkPnRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgKG9yIGNsYXNzZXMsIHNlcGFyYXRlZCBieSBjb21tYXMpPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0RmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb25jYXRlbmF0ZXMgdGhlIHJlc3VsdGluZyBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGZvciBhbGwgdGhlIGNsYXNzZXMgbGlzdGVkIGludG8gdGhpcyBmaWxlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiIHJvd3NwYW49IjIiPlllczwvdGQ+CisgICAgPHRkPm91dHB1dEZpbGU8L3RkPgorICAgIDx0ZD5jb25jYXRlbmF0ZXMgdGhlIHJlc3VsdGluZyBoZWFkZXIgb3Igc291cmNlIGZpbGVzIGZvciBhbGwgdGhlIGNsYXNzZXMgbGlzdGVkIGludG8gdGhpcworICAgICAgZmlsZTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d288L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSBqYXZhaCBzYXZlcyB0aGUgaGVhZGVyIGZpbGVzIG9yIHRoZQotICAgICAgc3R1YiBmaWxlcy48L3RkPgorICAgIDx0ZD5kZXN0ZGlyPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPnNldHMgdGhlIGRpcmVjdG9yeSB3aGVyZSA8a2JkPmphdmFoPC9rYmQ+IHNhdmVzIHRoZSBoZWFkZXIgZmlsZXMgb3IgdGhlIHN0dWIKKyAgICAgIGZpbGVzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZmllcyB0aGF0IG91dHB1dCBmaWxlcyBzaG91bGQgYWx3YXlzIGJlIHdyaXR0ZW4gKEpESzEuMiBvbmx5KTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZvcmNlPC90ZD4KKyAgICA8dGQ+c3BlY2lmaWVzIHRoYXQgb3V0cHV0IGZpbGVzIHNob3VsZCBhbHdheXMgYmUgd3JpdHRlbiAoSkRLIDEuMiBvbmx5KTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b2xkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZmllcyB0aGF0IG9sZCBKREsxLjAtc3R5bGUgaGVhZGVyIGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQKLSAgICAgIChvdGhlcndpc2Ugb3V0cHV0IGZpbGUgY29udGFpbiBKTkktc3R5bGUgbmF0aXZlIG1ldGhvZCAgICAgIGZ1bmN0aW9uIHByb3RvdHlwZXMpIChKREsxLjIgb25seSk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5vbGQ8L3RkPgorICAgIDx0ZD5zcGVjaWZpZXMgdGhhdCBvbGQgSkRLIDEuMC1zdHlsZSBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGdlbmVyYXRlZCAob3RoZXJ3aXNlIG91dHB1dCBmaWxlCisgICAgICBjb250YWluIEpOSS1zdHlsZSBuYXRpdmUgbWV0aG9kIGZ1bmN0aW9uIHByb3RvdHlwZXMpIChKREsgMS4yIG9ubHkpPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHViczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5nZW5lcmF0ZSBDIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBKYXZhIG9iamVjdCBmaWxlICh1c2VkIHdpdGggb2xkKTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN0dWJzPC90ZD4KKyAgICA8dGQ+Z2VuZXJhdGUgQyBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgSmF2YSBvYmplY3QgZmlsZSAodXNlZCB3aXRoIDx2YXI+b2xkPC92YXI+KTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYXVzZXMgSmF2YWggdG8gcHJpbnQgYSBtZXNzYWdlIGNvbmNlcm5pbmcgdGhlIHN0YXR1cyAgICAgb2YgdGhlIGdlbmVyYXRlZCBmaWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5jYXVzZXMgPGtiZD5qYXZhaDwva2JkPiB0byBwcmludCBhIG1lc3NhZ2UgY29uY2VybmluZyB0aGUgc3RhdHVzIG9mIHRoZSBnZW5lcmF0ZWQgZmlsZXM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvIHVzZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD50aGUgY2xhc3NwYXRoIHRvIHVzZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ym9vdGNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Ym9vdGNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPmxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gbG9jYXRpb24gb2YgaW5zdGFsbGVkIGV4dGVuc2lvbnMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXh0ZGlyczwvdGQ+CisgICAgPHRkPmxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsZW1lbnRhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLiAgSWYgdGhpcwotICAgIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgZGVmYXVsdCBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgVk0KLSAgICB3aWxsIGJlIHVzZWQuICAoU2VlIHRoZSBhYm92ZSA8YQotICAgIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29tcGlsZXJzLik8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbXBsZW1lbnRhdGlvbjwvdGQ+CisgICAgPHRkPlRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuIChTZWUgdGhlIGFib3ZlIDxhIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4KKyAgICAgIG9mIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgY29tcGlsZXIgZm9yIHRoZSBjdXJyZW50IEpESzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+RWl0aGVyIG91dHB1dEZpbGUgb3IgZGVzdGRpciBtdXN0IGJlIHN1cHBsaWVkLCBidXQgbm90IGJvdGguJm5ic3A7PC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmFyZzwvaDQ+CiAKLTxwPllvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlcgotd2l0aCBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGVsZW1lbnRzLiAgVGhlc2UgZWxlbWVudHMgYXJlCi1zcGVjaWZpZWQgbGlrZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT4KLWJ1dCBoYXZlIGFuIGFkZGl0aW9uYWwgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGFyZ3VtZW50cwotb25seSBpZiBhIGdpdmVuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZC48L3A+Cis8cD5Zb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29tcGlsZXIgd2l0aAorbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQKK2xpa2UgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+IGJ1dCBoYXZlIGFuIGFkZGl0aW9uYWwgYXR0cmlidXRlIHRoYXQKK2NhbiBiZSB1c2VkIHRvIGVuYWJsZSBhcmd1bWVudHMgb25seSBpZiBhIGdpdmVuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZC48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPlNlZQotICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjQiPlNlZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT4uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saW5lPC90ZD4KKyAgICA8dGQgY2xhc3M9InZhciI+bGluZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFyIj5maWxlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aDwvdGQ+CisgICAgPHRkIGNsYXNzPSJ2YXIiPnBhdGg8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5TZWUKLSAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT4uCi0gICAgPGVtPlNpbmNlIEFudCAxLjguPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5TZWUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LiAgPGVtPlNpbmNlIEFudAorICAgICAgMS44PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdWZmaXg8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uPC90ZD4KLSAgICA8dGQ+T25seSBwYXNzIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgaWYgdGhlIGNob3NlbiBjb21waWxlcgotICAgIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLiAgTGVnYWwgdmFsdWVzCi0gICAgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGluIHRoZSBhYm92ZSA8YQotICAgIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29tcGlsZXJzLik8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmltcGxlbWVudGF0aW9uPC90ZD4KKyAgICA8dGQ+T25seSBwYXNzIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgaWYgdGhlIGNob3NlbiBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIHRoZSB2YWx1ZSBvZgorICAgICAgdGhpcyBhdHRyaWJ1dGUuICBMZWdhbCB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGluIHRoZQorICAgICAgYWJvdmUgPGEgaHJlZj0iI2ltcGxlbWVudGF0aW9udmFsdWVzIj5saXN0PC9hPiBvZiB2YWxpZCBjb21waWxlcnMuKTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND5pbXBsZW1lbnRhdGlvbmNsYXNzcGF0aCA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L2g0PgorPGg0PmltcGxlbWVudGF0aW9uY2xhc3NwYXRoPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KKzxwPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBob2xkaW5nIHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZwordGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIGlmIGEgY3VzdG9tIGNsYXNzIGhhcyBiZWVuIHNwZWNpZmllZC4gIERvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IHdoZW4KK3VzaW5nIG9uZSBvZiB0aGUgYnVpbHQtaW4gY29tcGlsZXJzLjwvcD4KIAotPHA+QSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+IGhvbGRpbmcgdGhlCi0gIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb2FkaW5nIHRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBpZiBhCi0gIGN1c3RvbSBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQuICBEb2Vzbid0IGhhdmUgYW55IGVmZmVjdCB3aGVuCi0gIHVzaW5nIG9uZSBvZiB0aGUgYnVpbHQtaW4gY29tcGlsZXJzLjwvcD4KLQotPGg0PkFueSBuZXN0ZWQgZWxlbWVudCBvZiBhIHR5cGUgdGhhdCBpbXBsZW1lbnRzIEphdmFoQWRhcHRlcgotICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L2g0PgotCi08cD5JZiBhIGRlZmluZWQgdHlwZSBpbXBsZW1lbnRzIHRoZSA8Y29kZT5KYXZhaEFkYXB0ZXI8L2NvZGU+Ci0gIGludGVyZmFjZSBhIG5lc3RlZCBlbGVtZW50IG9mIHRoYXQgdHlwZSBjYW4gYmUgdXNlZCBhcyBhbgotICBhbHRlcm5hdGl2ZSB0byB0aGUgPGNvZGU+aW1wbGVtZW50YXRpb248L2NvZGU+IGF0dHJpYnV0ZS48L3A+Cis8aDQ+QW55IG5lc3RlZCBlbGVtZW50IG9mIGEgdHlwZSB0aGF0IGltcGxlbWVudHMgSmF2YWhBZGFwdGVyPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KKzxwPklmIGEgZGVmaW5lZCB0eXBlIGltcGxlbWVudHMgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5KYXZhaEFkYXB0ZXI8L2NvZGU+IGludGVyZmFjZSBhIG5lc3RlZAorZWxlbWVudCBvZiB0aGF0IHR5cGUgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIDx2YXI+aW1wbGVtZW50YXRpb248L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IGNsYXNzPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5tYWtlcyBhIEpOSSBoZWFkZXIgb2YgdGhlIG5hbWVkIGNsYXNzLCB1c2luZyB0aGUgSkRLMS4yIEpOSSBtb2RlbC4gQXNzdW1pbmcKLXRoZSBkaXJlY3RvcnkgJ2MnIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSA8dHQ+b3JnX2Zvb19iYXJfV2liYmxlLmg8L3R0PgotaXMgY3JlYXRlZCB0aGVyZS4gSWYgdGhpcyBmaWxlIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBsZWZ0IHVuY2hhbmdlZC48L3A+Ci08cHJlPiAgJmx0O2phdmFoIG91dHB1dEZpbGU9JnF1b3Q7d2liYmxlLmgmcXVvdDsmZ3Q7Ci0gICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlLG9yZy5mb28uYmFyLkJvYmJsZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvamF2YWgmZ3Q7PC9wcmU+Ci08cD5pcyBzaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBleGFtcGxlLCBleGNlcHQgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIGEgZmlsZQotY2FsbGVkIDx0dD53aWJibGUuaDwvdHQ+Ci1pbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC9wPgotPHByZT4gICZsdDtqYXZhaCBkZXN0ZGlyPSZxdW90O2MmcXVvdDsgZm9yY2U9JnF1b3Q7eWVzJnF1b3Q7Jmd0OwotICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuQm9iYmxlJnF1b3Q7LyZndDsKLSAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5UcmliYmxlJnF1b3Q7LyZndDsKLSAgJmx0Oy9qYXZhaCZndDs8L3ByZT4KLTxwPndyaXRlcyB0aHJlZSBoZWFkZXIgZmlsZXMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgY2xhc3NlcyBuYW1lZC4gQmVjYXVzZSB0aGUKLWZvcmNlIG9wdGlvbiBpcyBzZXQsIHRoZXNlIGhlYWRlciBmaWxlcyBhcmUgYWx3YXlzIHdyaXR0ZW4gd2hlbiB0aGUgSmF2YWggdGFzawotaXMgaW52b2tlZCwgZXZlbiBpZiB0aGV5IGFscmVhZHkgZXhpc3QuPC9wPgotPHByZT4gICZsdDtqYXZhaCBkZXN0ZGlyPSZxdW90O2MmcXVvdDsgdmVyYm9zZT0mcXVvdDt5ZXMmcXVvdDsgb2xkPSZxdW90O3llcyZxdW90OyBmb3JjZT0mcXVvdDt5ZXMmcXVvdDsmZ3Q7Ci0gICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlJnF1b3Q7LyZndDsKLSAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5Cb2JibGUmcXVvdDsvJmd0OwotICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLlRyaWJibGUmcXVvdDsvJmd0OwotICAmbHQ7L2phdmFoJmd0OwotICAmbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IHZlcmJvc2U9JnF1b3Q7eWVzJnF1b3Q7IHN0dWJzPSZxdW90O3llcyZxdW90OyBvbGQ9JnF1b3Q7eWVzJnF1b3Q7IGZvcmNlPSZxdW90O3llcyZxdW90OyZndDsKLSAgICAmbHQ7Y2xhc3MgbmFtZT0mcXVvdDtvcmcuZm9vLmJhci5XaWJibGUmcXVvdDsvJmd0OwotICAgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLkJvYmJsZSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuVHJpYmJsZSZxdW90Oy8mZ3Q7Ci0gICZsdDsvamF2YWgmZ3Q7PC9wcmU+Ci08cD53cml0ZXMgdGhlIGhlYWRlcnMgZm9yIHRoZSB0aHJlZSBjbGFzc2VzIHVzaW5nIHRoZSAnb2xkJyBKTkkgZm9ybWF0LCB0aGVuCi13cml0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgLmMgc3R1YnMuIFRoZSB2ZXJib3NlIG9wdGlvbiB3aWxsIGNhdXNlIEphdmFoIHRvCi1kZXNjcmliZSBpdHMgcHJvZ3Jlc3MuPC9wPgorPHA+TWFrZSBhIEpOSSBoZWFkZXIgb2YgdGhlIG5hbWVkIGNsYXNzLCB1c2luZyB0aGUgSkRLIDEuMiBKTkkgbW9kZWwuIEFzc3VtaW5nIHRoZQorZGlyZWN0b3J5IDxzYW1wPmM8L3NhbXA+IGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSA8c2FtcD5vcmdfZm9vX2Jhcl9XaWJibGUuaDwvc2FtcD4gaXMgY3JlYXRlZAordGhlcmUuIElmIHRoaXMgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQgaXMgbGVmdCB1bmNoYW5nZWQuPC9wPgorPHByZT4mbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IGNsYXNzPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPklmIHlvdSB3YW50IHRvIHVzZSBhIGN1c3RvbQotICBKYXZhaEFkYXB0ZXIgPGNvZGU+b3JnLmV4YW1wbGUuTXlBZGFwdGVyPC9jb2RlPiB5b3UgY2FuIGVpdGhlcgotICB1c2UgdGhlIGltcGxlbWVudGF0aW9uIGF0dHJpYnV0ZTo8L3A+Cis8cD5UaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIGV4YW1wbGUsIGV4Y2VwdCB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gYSBmaWxlCitjYWxsZWQgPHNhbXA+d2liYmxlLmg8L3NhbXA+IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS48L3A+Cis8cHJlPgorJmx0O2phdmFoIG91dHB1dEZpbGU9JnF1b3Q7d2liYmxlLmgmcXVvdDsmZ3Q7CisgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSxvcmcuZm9vLmJhci5Cb2JibGUmcXVvdDsvJmd0OworJmx0Oy9qYXZhaCZndDs8L3ByZT4KKworPHA+V3JpdGUgdGhyZWUgaGVhZGVyIGZpbGVzLCBvbmUgZm9yIGVhY2ggb2YgdGhlIGNsYXNzZXMgbmFtZWQuIEJlY2F1c2UgdGhlIDx2YXI+Zm9yY2U8L3Zhcj4gb3B0aW9uCitpcyBzZXQsIHRoZXNlIGhlYWRlciBmaWxlcyBhcmUgYWx3YXlzIHdyaXR0ZW4gd2hlbiB0aGUgPGNvZGU+SmF2YWg8L2NvZGU+IHRhc2sgaXMgaW52b2tlZCwgZXZlbiBpZgordGhleSBhbHJlYWR5IGV4aXN0LjwvcD4KKzxwcmU+CismbHQ7amF2YWggZGVzdGRpcj0mcXVvdDtjJnF1b3Q7IGZvcmNlPSZxdW90O3llcyZxdW90OyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlJnF1b3Q7LyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuQm9iYmxlJnF1b3Q7LyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuVHJpYmJsZSZxdW90Oy8mZ3Q7CismbHQ7L2phdmFoJmd0OzwvcHJlPgorCis8cD5Xcml0ZSB0aGUgaGVhZGVycyBmb3IgdGhlIHRocmVlIGNsYXNzZXMgdXNpbmcgdGhlICdvbGQnIEpOSSBmb3JtYXQsIHRoZW4gd3JpdGUgdGhlCitjb3JyZXNwb25kaW5nIDxzYW1wPi5jPC9zYW1wPiBzdHVicy4gVGhlIDx2YXI+dmVyYm9zZTwvdmFyPiBvcHRpb24gd2lsbCBjYXVzZSA8Y29kZT5KYXZhaDwvY29kZT4gdG8KK2Rlc2NyaWJlIGl0cyBwcm9ncmVzcy48L3A+Cis8cHJlPgorJmx0O2phdmFoIGRlc3RkaXI9JnF1b3Q7YyZxdW90OyB2ZXJib3NlPSZxdW90O3llcyZxdW90OyBvbGQ9JnF1b3Q7eWVzJnF1b3Q7IGZvcmNlPSZxdW90O3llcyZxdW90OyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuV2liYmxlJnF1b3Q7LyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuQm9iYmxlJnF1b3Q7LyZndDsKKyAgJmx0O2NsYXNzIG5hbWU9JnF1b3Q7b3JnLmZvby5iYXIuVHJpYmJsZSZxdW90Oy8mZ3Q7CismbHQ7L2phdmFoJmd0OworJmx0O2phdmFoIGRlc3RkaXI9JnF1b3Q7YyZxdW90OyB2ZXJib3NlPSZxdW90O3llcyZxdW90OyBzdHVicz0mcXVvdDt5ZXMmcXVvdDsgb2xkPSZxdW90O3llcyZxdW90OyBmb3JjZT0mcXVvdDt5ZXMmcXVvdDsmZ3Q7CisgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLldpYmJsZSZxdW90Oy8mZ3Q7CisgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLkJvYmJsZSZxdW90Oy8mZ3Q7CisgICZsdDtjbGFzcyBuYW1lPSZxdW90O29yZy5mb28uYmFyLlRyaWJibGUmcXVvdDsvJmd0OworJmx0Oy9qYXZhaCZndDs8L3ByZT4KKworPHA+SWYgeW91IHdhbnQgdG8gdXNlIGEKK2N1c3RvbSA8Y29kZSBjbGFzcz0iY29kZSI+SmF2YWhBZGFwdGVyPC9jb2RlPiA8Y29kZT5vcmcuZXhhbXBsZS5NeUFkYXB0ZXI8L2NvZGU+IHlvdSBjYW4gZWl0aGVyIHVzZQordGhlIDx2YXI+aW1wbGVtZW50YXRpb248L3Zhcj4gYXR0cmlidXRlOjwvcD4KIDxwcmU+CiAmbHQ7amF2YWggZGVzdGRpcj0iYyIgY2xhc3M9Im9yZy5mb28uYmFyLldpYmJsZSIKLSAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIi8mZ3Q7Ci08L3ByZT4KKyAgICAgICBpbXBsZW1lbnRhdGlvbj0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIi8mZ3Q7PC9wcmU+CiA8cD5vciBhIGRlZmluZSBhIHR5cGUgYW5kIG5lc3QgdGhpcyBpbnRvIHRoZSB0YXNrIGxpa2UgaW46PC9wPgogPHByZT4KICZsdDtjb21wb25lbnRkZWYgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5NeUFkYXB0ZXIiCiAgICAgICAgICAgICAgIG5hbWU9Im15YWRhcHRlciIvJmd0OwogJmx0O2phdmFoIGRlc3RkaXI9ImMiIGNsYXNzPSJvcmcuZm9vLmJhci5XaWJibGUiJmd0OwogICAmbHQ7bXlhZGFwdGVyLyZndDsKLSZsdDsvamF2YWgmZ3Q7Ci08L3ByZT4KLTxwPmluIHdoaWNoIGNhc2UgeW91ciBqYXZhaCBhZGFwdGVyIGNhbiBzdXBwb3J0IGF0dHJpYnV0ZXMgYW5kCi0gIG5lc3RlZCBlbGVtZW50cyBvZiBpdHMgb3duLjwvcD4KKyZsdDsvamF2YWgmZ3Q7PC9wcmU+Cis8cD5pbiB3aGljaCBjYXNlIHlvdXIgPGNvZGU+amF2YWg8L2NvZGU+IGFkYXB0ZXIgY2FuIHN1cHBvcnQgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzIG9mIGl0cworb3duLjwvcD4KIAogPC9ib2R5PgotCiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvamRlcGVuZC5odG1sIGIvbWFudWFsL1Rhc2tzL2pkZXBlbmQuaHRtbAppbmRleCA3YTk2MzlkLi43YWE3ZjRlIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvamRlcGVuZC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9qZGVwZW5kLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNjQgKzE1LDE0MyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci0KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPkpEZXBlbmQgVGFzazwvdGl0bGU+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgIDx0aXRsZT5KRGVwZW5kIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIE5BTUU9IkpEZXBlbmQiPjwvYT5KRGVwZW5kPC9oMj4KKzxoMiBpZD0iamRlcGVuZCI+SkRlcGVuZDwvaDI+CiAKIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxQPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQ8L2E+IHBhcnNlci48L1A+Cis8cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQiIHRhcmdldD0iX3RvcCI+SkRlcGVuZDwvYT4KK3BhcnNlci48L3A+CiAKLTxQPlRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduIHF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UmcXVvdDsuCi1JdCBhbGxvd3MgdG8gJnF1b3Q7YXV0b21hdGljYWxseSBtZWFzdXJlIHRoZSBxdWFsaXR5IG9mIGEgZGVzaWduIGluIHRlcm1zIG9mIGl0cyBleHRlbnNpYmlsaXR5LCByZXVzYWJpbGl0eSwgYW5kIG1haW50YWluYWJpbGl0eSB0bwotZWZmZWN0aXZlbHkgbWFuYWdlIGFuZCBjb250cm9sIHBhY2thZ2UgZGVwZW5kZW5jaWVzLiZxdW90OzwvUD4KKzxwPlRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduIHF1YWxpdHkKK21ldHJpY3MgZm9yIGVhY2ggSmF2YSBwYWNrYWdlJnF1b3Q7LiAgSXQgYWxsb3dzIHRvICZxdW90O2F1dG9tYXRpY2FsbHkgbWVhc3VyZSB0aGUgcXVhbGl0eSBvZiBhCitkZXNpZ24gaW4gdGVybXMgb2YgaXRzIGV4dGVuc2liaWxpdHksIHJldXNhYmlsaXR5LCBhbmQgbWFpbnRhaW5hYmlsaXR5IHRvIGVmZmVjdGl2ZWx5IG1hbmFnZSBhbmQKK2NvbnRyb2wgcGFja2FnZSBkZXBlbmRlbmNpZXMuJnF1b3Q7PC9wPgogCi08cD5Tb3VyY2UgZmlsZSBkaXJlY3RvcmllcyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQKLTxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+OyBDbGFzcyBmaWxlIGRpcmVjdG9yaWVzIGFyZSBkZWZpbmVkCi1ieSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzZXNlc3BhdGgmZ3Q7PC9jb2RlPiwgc2VlIDxhCi1ocmVmPSIjbmVzdGVkIj5uZXN0ZWQgZWxlbWVudHM8L2E+LjwvcD4KKzxwPlNvdXJjZSBmaWxlIGRpcmVjdG9yaWVzIGFyZSBkZWZpbmVkIGJ5IG5lc3RlZCA8Y29kZT4mbHQ7c291cmNlc3BhdGgmZ3Q7PC9jb2RlPi4gQ2xhc3MgZmlsZQorZGlyZWN0b3JpZXMgYXJlIGRlZmluZWQgYnkgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc2VzcGF0aCZndDs8L2NvZGU+LiBTZWUgPGEgaHJlZj0iI25lc3RlZCI+bmVzdGVkCitlbGVtZW50czwvYT4uPC9wPgogCi08cD5PcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZSA8Y29kZT5vdXRwdXRmaWxlPC9jb2RlPiBuYW1lIHdoZXJlIHRoZSBvdXRwdXQgaXMgc3RvcmVkLiBCeSBkZWZhdWx0IHRoZSB0YXNrIHdyaXRlcyBpdHMgcmVwb3J0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuPC9QPgorPHA+T3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUgPHZhcj5vdXRwdXRmaWxlPC92YXI+IG5hbWUgd2hlcmUgdGhlIG91dHB1dCBpcyBzdG9yZWQuIEJ5CitkZWZhdWx0IHRoZSB0YXNrIHdyaXRlcyBpdHMgcmVwb3J0IHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuPC9wPgogCi08cD4gVGhlIHRhc2sgcmVxdWlyZXMgYXQgbGVhc3QgdGhlIEpEZXBlbmQgMS4yIHZlcnNpb24uIDwvcD4KKzxwPlRoZSB0YXNrIHJlcXVpcmVzIGF0IGxlYXN0IHRoZSBKRGVwZW5kIDEuMiB2ZXJzaW9uLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgogCi08dGFibGUgQk9SREVSPTEgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0yID4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgVkFMSUdOPVRPUD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgVkFMSUdOPVRPUD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCBWQUxJR049VE9QPm91dHB1dGZpbGU8L3RkPgotICAgIDx0ZCBWQUxJR049VE9QPlRoZSBvdXRwdXQgZmlsZSBuYW1lLiBJZiBub3Qgc2V0LCB0aGUgb3V0cHV0IGlzIHByaW50ZWQgb24gdGhlIHN0YW5kYXJkIG91dHB1dC48L3RkPgotICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgICAgPHRkPm91dHB1dGZpbGU8L3RkPgorICAgIDx0ZD5UaGUgb3V0cHV0IGZpbGUgbmFtZS4gSWYgbm90IHNldCwgdGhlIG91dHB1dCBpcyBwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIFZBTElHTj1UT1A+Zm9ybWF0PC90ZD4KLSAgICA8dGQgVkFMSUdOPVRPUD5UaGUgZm9ybWF0IHRvIHdyaXRlIHRoZSBvdXRwdXQgaW4uIFRoZSBkZWZhdWx0IGlzICJ0ZXh0IiwgdGhlIGFsdGVybmF0aXZlIGlzICJ4bWwiPC90ZD4KLSAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICAgIDx0ZD5mb3JtYXQ8L3RkPgorICAgIDx0ZD5UaGUgZm9ybWF0IHRvIHdyaXRlIHRoZSBvdXRwdXQgaW4sCisgICAgZWl0aGVyIDxxPnRleHQ8L3E+IChkZWZhdWx0KSBvciA8cT54bWw8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IHRoZSBkZWZhdWx0IGlzIDxxPnRleHQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCBWQUxJR049VE9QPmZvcms8L3RkPgotICAgIDx0ZCBWQUxJR049VE9QPlJ1biB0aGUgdGVzdHMgaW4gYSBzZXBhcmF0ZSBWTS48L3RkPgotICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObywgZGVmYXVsdCBpcyAib2ZmIjwvdGQ+CisgICAgPHRkPmZvcms8L3RkPgorICAgIDx0ZD5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgSlZNLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm9mZjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIFZBTElHTj1UT1A+aGFsdG9uZXJyb3I8L3RkPgotICAgIDx0ZCBWQUxJR049VE9QPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgamRlcGVuZCBhbmFseXNpcy48L3RkPgotICAgIDx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObywgZGVmYXVsdCBpcyAib2ZmIjwvdGQ+CisgICAgPHRkPmhhbHRvbmVycm9yPC90ZD4KKyAgICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIDxjb2RlPmpkZXBlbmQ8L2NvZGU+IGFuYWx5c2lzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm9mZjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIFZBTElHTj1UT1A+dGltZW91dDwvdGQ+Ci0gICAgPHRkIFZBTElHTj1UT1A+Q2FuY2VsIHRoZSBvcGVyYXRpb24gaWYgaXQgZG9lc24ndCBmaW5pc2ggaW4gdGhlIGdpdmVuIHRpbWUgKG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcykuIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuKTwvdGQ+Ci0gICAgPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgICA8dGQ+dGltZW91dDwvdGQ+CisgICAgPHRkPkNhbmNlbCB0aGUgb3BlcmF0aW9uIGlmIGl0IGRvZXNuJ3QgZmluaXNoIGluIHRoZSBnaXZlbiB0aW1lIChtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMpLjwvdGQ+CisgICAgPHRkPk5vLCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIFZBTElHTj1UT1A+anZtPC90ZD4KLSAgICA8dGQgVkFMSUdOPVRPUD5UaGUgY29tbWFuZCB1c2VkIHRvIGludm9rZSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUsIGRlZmF1bHQgaXMgJ2phdmEnLiBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieSBqYXZhLmxhbmcuUnVudGltZS5leGVjKCkuIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQuKTwvdGQ+Ci0gICAgPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vLCBkZWZhdWx0ICJqYXZhIjwvdGQ+CisgICAgPHRkPmp2bTwvdGQ+CisgICAgPHRkPlRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIEpWTS4gVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQKKyAgICAgIGJ5IDxjb2RlPmphdmEubGFuZy5SdW50aW1lLmV4ZWMoKTwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPGtiZD5qYXZhPC9rYmQ+LCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIFZBTElHTj1UT1A+ZGlyPC90ZD4KLSAgICA8dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IHRvIGludm9rZSB0aGUgVk0gaW4uIChJZ25vcmVkIGlmIGZvcmsgaXMgZGlzYWJsZWQpPC90ZD4KLSAgICA8dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICAgIDx0ZD5kaXI8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIGludm9rZSBKVk0gaW4uPC90ZD4KKyAgICA8dGQ+Tm8sIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgVkFMSUdOPVRPUD5pbmNsdWRlcnVudGltZTwvdGQ+Ci0gICAgPHRkIFZBTElHTj1UT1A+SW1wbGljaXRseSBhZGQgdGhlIGNsYXNzZXMgcmVxdWlyZWQgdG8gcnVuIGpkZXBlbmQKLSAgICBpbiBmb3JrZWQgbW9kZS4gKElnbm9yZWQgaWYgZm9yayBpcyBkaXNhYmxlZCkuIFNpbmNlIEFwYWNoZSBBbnQgMS42LjwvdGQ+Ci0gICAgPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vLCBkZWZhdWx0IGlzICJubyIuPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXJ1bnRpbWU8L3RkPgorICAgIDx0ZD5JbXBsaWNpdGx5IGFkZCB0aGUgY2xhc3NlcyByZXF1aXJlZCB0byBydW4gPGNvZGU+amRlcGVuZDwvY29kZT4gaW4gZm9ya2VkIG1vZGUuIDxlbT5TaW5jZQorICAgICAgQXBhY2hlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT4sIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgVkFMSUdOPVRPUD5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCBWQUxJR049VE9QPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyByZWZlcmVuY2UgdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+dGhlIDx2YXI+Y2xhc3NwYXRoPC92YXI+IHRvIHVzZSwgZ2l2ZW4gYXMgcmVmZXJlbmNlIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKzxoMyBpZD0ibmVzdGVkIj5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08cD48Y29kZT5qZGVwZW5kPC9jb2RlPiBzdXBwb3J0cyBmb3VyIG5lc3RlZCBlbGVtZW50czoKLTxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7LCAmbHQ7Y2xhc3Nlc3BhdGgmZ3Q7IDwvY29kZT4gYW5kCi08Y29kZT4mbHQ7c291cmNlc3BhdGgmZ3Q7PC9jb2RlPiwgdGhhdCByZXByZXNlbnQgPGEKLWhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZXM8L2E+LCBhbmQKLTxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4uPC9wPgorPHA+PGNvZGU+amRlcGVuZDwvY29kZT4gc3VwcG9ydHMgZm91ciBuZXN0ZWQKK2VsZW1lbnRzOiA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtjbGFzc2VzcGF0aCZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3NvdXJjZXNwYXRoJmd0OzwvY29kZT4sIHRoYXQgcmVwcmVzZW50IDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlCitzdHJ1Y3R1cmVzPC9hPiwgYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4uPC9wPgogCi08cD48Y29kZT4mbHQ7c291cmNlc3BhdGgmZ3Q7PC9jb2RlPiBpcyB1c2VkIHRvIGRlZmluZSB0aGUgcGF0aHMgb2YgdGhlCi1zb3VyY2UgY29kZSB0byBhbmFseXplLCBidXQgaXQgaXMgZGVwcmVjYXRlZC4gV2l0aCB2ZXJzaW9uIDIuNSBvZgotSkRlcGVuZCwgb25seSBjbGFzcyBmaWxlcyBhcmUgYW5hbHl6ZWQuIFRoZSBuZXN0ZWQgZWxlbWVudAotPGNvZGU+Jmx0O2NsYXNzZXNwYXRoJmd0OzwvY29kZT4gcmVwbGFjZXMgPGNvZGU+Jmx0O3NvdXJjZXNwYXRoJmd0OzwvY29kZT4gYW5kIGlzIHVzZWQgdG8gZGVmaW5lCi10aGUgcGF0aHMgb2YgY29tcGlsZWQgY2xhc3MgY29kZSB0byBhbmFseXplOyB0aGUgPGNvZGU+Jmx0O3NvdXJjZXNwYXRoJmd0OzwvY29kZT4KLXZhcmlhYmxlIGlzIHN0aWxsIGF2YWlsYWJsZSBpbiBjYXNlIHlvdSBhcmUgdXNpbmcgYW4gZWFybGllciB2ZXJzaW9uCi1vZiBKRGVwZW5kLiAgVGhlIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYmUgdXNlZCB0byBzZXQgcGFja2FnZXMKLXRvIGlnbm9yZSAocmVxdWlyZXMgSkRlcGVuZCAyLjUgb3IgYWJvdmUpLjwvcD4KKzxwPjxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBwYXRocyBvZiB0aGUgc291cmNlIGNvZGUgdG8gYW5hbHl6ZSwgYnV0CitpdCBpcyBkZXByZWNhdGVkLiBXaXRoIHZlcnNpb24gMi41IG9mIEpEZXBlbmQsIG9ubHkgY2xhc3MgZmlsZXMgYXJlIGFuYWx5emVkLiBUaGUgbmVzdGVkCitlbGVtZW50IDxjb2RlPiZsdDtjbGFzc2VzcGF0aCZndDs8L2NvZGU+IHJlcGxhY2VzIDxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+IGFuZCBpcyB1c2VkIHRvCitkZWZpbmUgdGhlIHBhdGhzIG9mIGNvbXBpbGVkIGNsYXNzIGNvZGUgdG8gYW5hbHl6ZTsgdGhlIDxjb2RlPiZsdDtzb3VyY2VzcGF0aCZndDs8L2NvZGU+IHZhcmlhYmxlIGlzCitzdGlsbCBhdmFpbGFibGUgaW4gY2FzZSB5b3UgYXJlIHVzaW5nIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBKRGVwZW5kLgorVGhlIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudCBjYW4gYmUgdXNlZCB0byBzZXQgcGFja2FnZXMgdG8gaWdub3JlIChyZXF1aXJlcyBKRGVwZW5kIDIuNQorb3IgYWJvdmUpLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPGJsb2NrcXVvdGU+Cis8cD5JbnZva2UgSkRlcGVuZCBvbiB0aGUgPHNhbXA+YnVpbGQ8L3NhbXA+IGRpcmVjdG9yeSwgd3JpdGluZyB0aGUgb3V0cHV0IG9uIHRoZSBzdGFuZGFyZAorb3V0cHV0LiBUaGUgY2xhc3NwYXRoIGlzIGRlZmluZWQgdXNpbmcgYSByZWZlcmVuY2UuPC9wPgogPHByZT4KICZsdDtqZGVwZW5kIGNsYXNzcGF0aHJlZj0iYmFzZS5wYXRoIiZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3Nlc3BhdGgmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQiLyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2NsYXNzZXNwYXRoJmd0OwotJmx0Oy9qZGVwZW5kJmd0OworICAgICZsdDtjbGFzc2VzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJidWlsZCIvJmd0OworICAgICZsdDsvY2xhc3Nlc3BhdGgmZ3Q7CismbHQ7L2pkZXBlbmQmZ3Q7PC9wcmU+CiAKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08cD5UaGlzIGludm9rZXMgSkRlcGVuZCBvbiB0aGUgPGNvZGU+YnVpbGQ8L2NvZGU+IGRpcmVjdG9yeSwgd3JpdGluZwotdGhlIG91dHB1dCBvbiB0aGUgc3RhbmRhcmQgb3V0cHV0LiBUaGUgY2xhc3NwYXRoIGlzIGRlZmluZWQgdXNpbmcgYQotY2xhc3NwYXRoIHJlZmVyZW5jZS48L3A+Ci0KLTxibG9ja3F1b3RlPgorPHA+VGhpcyBpbnZva2UgSkRlcGVuZCBpbiBhIHNlcGFyYXRlIEpWTSBvbiB0aGUgPHNhbXA+c3JjPC9zYW1wPiBhbmQgPHNhbXA+dGVzdHNyYzwvc2FtcD4KK2RpcmVjdG9yaWVzLCB3cml0aW5nIHRoZSBvdXRwdXQgdG8gdGhlIDxzYW1wPmRvY3MvamRlcGVuZC54bWw8L3NhbXA+IGZpbGUgaW4gWE1MIGZvcm1hdC4gVGhlCitjbGFzc3BhdGggaXMgZGVmaW5lZCB1c2luZyBuZXN0ZWQgZWxlbWVudHMuPC9wPgogPHByZT4KICZsdDtqZGVwZW5kIG91dHB1dGZpbGU9ImRvY3MvamRlcGVuZC54bWwiIGZvcms9InllcyIgZm9ybWF0PSJ4bWwiJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtzb3VyY2VzcGF0aCZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsmbmJzcDsmbmJzcDsgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJzcmMiLyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L3NvdXJjZXNwYXRoJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtjbGFzc3BhdGgmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iY2xhc3NlcyIvJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImxpYi9qZGVwZW5kLmphciIvJmd0OwotJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDsvY2xhc3NwYXRoJmd0OwotJmx0Oy9qZGVwZW5kJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+CisgICAgJmx0O3NvdXJjZXNwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249InNyYyIvJmd0OworICAgICZsdDsvc291cmNlc3BhdGgmZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCZndDsKKyAgICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJjbGFzc2VzIi8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliL2pkZXBlbmQuamFyIi8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CismbHQ7L2pkZXBlbmQmZ3Q7PC9wcmU+CiAKLTxwPlRoaXMgaW52b2tlcyBKRGVwZW5kIGluIGEgc2VwYXJhdGUgVk0gb24gdGhlIDxjb2RlPnNyYzwvY29kZT4gYW5kCi08Y29kZT50ZXN0c3JjPC9jb2RlPiBkaXJlY3Rvcmllcywgd3JpdGluZyB0aGUgb3V0cHV0IHRvIHRoZQotPGNvZGU+Jmx0O2RvY3MvamRlcGVuZC54bWwmZ3Q7PC9jb2RlPiBmaWxlIGluIHhtbCBmb3JtYXQuIFRoZQotY2xhc3NwYXRoIGlzIGRlZmluZWQgdXNpbmcgbmVzdGVkIGVsZW1lbnRzLiA8L3A+Ci0KLTxibG9ja3F1b3RlPgorPHA+SW52b2tlIEpEZXBlbmQgd2l0aCB0aGUgYnVpbGQgZGlyZWN0b3J5IGFzIHRoZSBiYXNlIGZvciBjbGFzcyBmaWxlcyB0byBhbmFseXplLCBhbmQgaWdub3JlIGFsbAorY2xhc3NlcyBpbiB0aGUgPHNhbXA+amF2YS4qPC9zYW1wPiBhbmQgPHNhbXA+amF2YXguKjwvc2FtcD4gcGFja2FnZXMuPC9wPgogPHByZT4KICZsdDtqZGVwZW5kIGNsYXNzcGF0aHJlZj0iYmFzZS5wYXRoIiZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7ZXhjbHVkZSBuYW1lPSJqYXZhLiomZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsgJmx0O2V4Y2x1ZGUgbmFtZT0iamF2YXguKiZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7Y2xhc3Nlc3BhdGgmZ3Q7Ci0mbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7ICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQiLyZndDsKLSZuYnNwOyZuYnNwOyZuYnNwOyAmbHQ7L2NsYXNzZXNwYXRoJmd0OwotJmx0Oy9qZGVwZW5kJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgaW52b2tlcyBKRGVwZW5kIHdpdGggdGhlIGJ1aWxkIGRpcmVjdG9yeSBhcyB0aGUgYmFzZSBmb3IgY2xhc3MKLWZpbGVzIHRvIGFuYWx5emUsIGFuZCB3aWxsIGlnbm9yZSBhbGwgY2xhc3NlcyBpbiB0aGUgamF2YS4qIGFuZAotamF2YXguKiBwYWNrYWdlcy48L3A+Ci0KKyAgICAmbHQ7ZXhjbHVkZSBuYW1lPSJqYXZhLiomZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iamF2YXguKiZndDsKKyAgICAmbHQ7Y2xhc3Nlc3BhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iYnVpbGQiLyZndDsKKyAgICAmbHQ7L2NsYXNzZXNwYXRoJmd0OworJmx0Oy9qZGVwZW5kJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2pqZG9jLmh0bWwgYi9tYW51YWwvVGFza3Mvampkb2MuaHRtbAppbmRleCA1MmI5MjI1Li4yYWViMTE0IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvampkb2MuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvampkb2MuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDExMCArMTUsODUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgotICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SkpEb2MgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KIAotPGgyPgotPGEgTkFNRT0iamp0cmVlIj48L2E+SkpEb2M8L2gyPgorPGgyIGlkPSJqanRyZWUiPkpKRG9jPC9oMj4KIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+SW52b2tlcyB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmFjYy5kZXYuamF2YS5uZXQvIj5KSkRvYzwvYT4gcHJlcHJvY2Vzc29yCi1mb3IgdGhlIEphdmFDQyBjb21waWxlciBjb21waWxlci4gSXQgdGFrZXMgYSBKYXZhQ0MgcGFyc2VyIHNwZWNpZmljYXRpb24KLWFuZCBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGZvciB0aGUgQk5GIGdyYW1tYXIuCi1JdCBjYW4gb3BlcmF0ZSBpbiB0aHJlZSBtb2RlcywgZGV0ZXJtaW5lZCBieSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KLTxwPlRvIHVzZSB0aGUgampkb2MgdGFzaywgc2V0IHRoZSA8aT50YXJnZXQ8L2k+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZQotb2YgdGhlIEphdmFDQyBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4gWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkKLWNvbnRhaW5pbmcgdGhlIEphdmFDQyBpbnN0YWxsYXRpb24gdXNpbmcgdGhlIDxpPmphdmFjY2hvbWU8L2k+IGF0dHJpYnV0ZSwKLXNvIHRoYXQgYW50IGNhbiBmaW5kIHRoZSBKYXZhQ0MgY2xhc3Nlcy4gT3B0aW9uYWxseSwgeW91IGNhbiBhbHNvIHNldCB0aGUKLTxpPm91dHB1dGZpbGU8L2k+IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgQk5GIGRvY3VtZW50YXRpb24gZmlsZSB0byBhIHNwZWNpZmljIChkaXJlY3RvcnkgYW5kKSBmaWxlLgotT3RoZXJ3aXNlIGpqZG9jIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgYXMgdGhlIEphdmFDQwotZ3JhbW1hciBmaWxlIHdpdGggYSBzdWZmaXggLnR4dCBvciAuaHRtbC48L3A+Ci08cD5UaGlzIHRhc2sgb25seSBpbnZva2VzIEpKRG9jIGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUKLWdlbmVyYXRlZCBCTkYgZG9jdW1lbnRhdGlvbiBmaWxlLjwvcD4KKzxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vamF2YWNjLm9yZy8iIHRhcmdldD0iX3RvcCI+SkpEb2M8L2E+IHByZXByb2Nlc3NvciBmb3IgdGhlIEphdmFDQworY29tcGlsZXIgY29tcGlsZXIuIEl0IHRha2VzIGEgSmF2YUNDIHBhcnNlciBzcGVjaWZpY2F0aW9uIGFuZCBwcm9kdWNlcyBkb2N1bWVudGF0aW9uIGZvciB0aGUgQk5GCitncmFtbWFyLiAgSXQgY2FuIG9wZXJhdGUgaW4gdGhyZWUgbW9kZXMsIGRldGVybWluZWQgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuCis8cD5UbyB1c2UgdGhlIDxjb2RlPmpqZG9jPC9jb2RlPiB0YXNrLCBzZXQgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUgSmF2YUNDCitncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4gWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbgordXNpbmcgdGhlIDx2YXI+amF2YWNjaG9tZTwvdmFyPiBhdHRyaWJ1dGUsIHNvIHRoYXQgQW50IGNhbiBmaW5kIHRoZSBKYXZhQ0MgY2xhc3Nlcy4gT3B0aW9uYWxseSwgeW91CitjYW4gYWxzbyBzZXQgdGhlIDx2YXI+b3V0cHV0ZmlsZTwvdmFyPiB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgdG8gYSBzcGVjaWZpYworKGRpcmVjdG9yeSBhbmQpIGZpbGUuICBPdGhlcndpc2UgPGNvZGU+ampkb2M8L2NvZGU+IHdyaXRlcyB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgYXMKK3RoZSBKYXZhQ0MgZ3JhbW1hciBmaWxlIHdpdGggYSBzdWZmaXggPHNhbXA+LnR4dDwvc2FtcD4gb3IgPHNhbXA+Lmh0bWw8L3NhbXA+LjwvcD4KKzxwPlRoaXMgdGFzayBvbmx5IGludm9rZXMgPGNvZGU+SkpEb2M8L2NvZGU+IGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIEJORgorZG9jdW1lbnRhdGlvbiBmaWxlLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgogCi08dGFibGUgQk9SREVSIENFTExTUEFDSU5HPTAgQ0VMTFBBRERJTkc9MiA+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogPHRyPgotPHRkIFZBTElHTj1UT1A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KIDwvdHI+CiAKIDx0cj4KLTx0ZCBWQUxJR049VE9QPnRhcmdldDwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlRoZSBqYXZhY2MgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPlllczwvdGQ+CisgICAgPHRkPnRhcmdldDwvdGQ+CisgICAgPHRkPlRoZSBKYXZhQ0MgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KIDwvdHI+CiAKIDx0cj4KLTx0ZCBWQUxJR049VE9QPmphdmFjY2hvbWU8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPlllczwvdGQ+CisgICAgPHRkPmphdmFjY2hvbWU8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KIDwvdHI+CiAKIDx0cj4KLTx0ZCBWQUxJR049VE9QPm91dHB1dGZpbGU8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5UaGUgZmlsZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uIGZpbGUgdG8uIElmIG5vdCBzZXQsCi10aGUgZmlsZSBpcyB3cml0dGVuIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgSmF2YUNDIGdyYW1tYXIgZmlsZSBidXQgd2l0aCBhIHRoZSBzdWZmaXggLmh0bWwgb3IgLnR4dC4mbmJzcDs8L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICAgIDx0ZD5vdXRwdXRmaWxlPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBCTkYgZG9jdW1lbnRhdGlvbiBmaWxlIHRvLiBJZiBub3Qgc2V0LCB0aGUgZmlsZSBpcyB3cml0dGVuCisgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIEphdmFDQyBncmFtbWFyIGZpbGUgYnV0IHdpdGggYSB0aGUgc3VmZml4IDxzYW1wPi5odG1sPC9zYW1wPgorICAgICAgb3IgPHNhbXA+LnR4dDwvc2FtcD48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD50ZXh0PC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgVEVYVCBCTkYgZG9jdW1lbnRhdGlvbiBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuCi1vcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgICA8dGQ+dGV4dDwvdGQ+CisgICAgPHRkPlNldHMgdGhlIFRFWFQgQk5GIGRvY3VtZW50YXRpb24gb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+b25ldGFibGU8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBPTkVfVEFCTEUgQk5GIGRvY3VtZW50YXRpb24gb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgICA8dGQ+b25ldGFibGU8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBPTkVfVEFCTEUgQk5GIGRvY3VtZW50YXRpb24gb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogPC90cj4KLQotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZAotICAgICAgVk0uICA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorPHRyPgorICAgIDx0ZD5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZD5NYXggYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSB0byB0aGUgZm9ya2VkIEpWTS4gIDxlbT5zaW5jZSBBbnQgMS44LjM8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMz4KLUV4YW1wbGU8L2gzPgorPGgzPkV4YW1wbGU8L2gzPgogCi08YmxvY2txdW90ZT4KLTxwcmU+Jmx0O2pqZG9jJm5ic3A7Ci0mbmJzcDsmbmJzcDsmbmJzcDsgdGFyZ2V0PSJzcmMvUGFyc2VyLmpqIiZuYnNwOwotJm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dGZpbGU9ImRvYy9QYXJzZXJCTkYuaHRtbCIKLSZuYnNwOyZuYnNwOyZuYnNwOyBqYXZhY2Nob21lPSJjOi9wcm9ncmFtIGZpbGVzL0phdmFDQyImbmJzcDsKLS8mZ3Q7PC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci1UaGlzIGludm9rZXMgSkpEb2Mgb24gZ3JhbW1hciBmaWxlIHNyYy9QYXJzZXIuamosIHdyaXRpbmcgdGhlIGdlbmVyYXRlZAotQk5GIGRvY3VtZW50YXRpb24gZmlsZSwgUGFyc2VyQk5GLmh0bWwsIGZpbGUgdG8gZG9jLgotPGJyPgorPHA+SW52b2tlIEpKRG9jIG9uIGdyYW1tYXIgZmlsZSA8c2FtcD5zcmMvUGFyc2VyLmpqPC9zYW1wPiwgd3JpdGluZyB0aGUgZ2VuZXJhdGVkIEJORiBkb2N1bWVudGF0aW9uCitmaWxlLCA8c2FtcD5QYXJzZXJCTkYuaHRtbDwvc2FtcD4sIHRvIDxzYW1wPmRvYzwvc2FtcD4uPC9wPgorCis8cHJlPgorJmx0O2pqZG9jIHRhcmdldD0ic3JjL1BhcnNlci5qaiIKKyAgICAgICBvdXRwdXRmaWxlPSJkb2MvUGFyc2VyQk5GLmh0bWwiCisgICAgICAgamF2YWNjaG9tZT0iYzovcHJvZ3JhbSBmaWxlcy9KYXZhQ0MiLyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvamp0cmVlLmh0bWwgYi9tYW51YWwvVGFza3Mvamp0cmVlLmh0bWwKaW5kZXggN2ZiYjJhOS4uNmQ0YWVkNSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2pqdHJlZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9qanRyZWUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDIxMyArMTUsMTYyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KLSAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkpKVHJlZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgogCi08aDI+Ci08YSBOQU1FPSJqanRyZWUiPjwvYT5KSlRyZWU8L2gyPgorPGgyIGlkPSJqanRyZWUiPkpKVHJlZTwvaDI+CiAKLTxoMz4KLURlc2NyaXB0aW9uPC9oMz4KLTxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyI+SkpUcmVlPC9hPiBwcmVwcm9jZXNzb3IKLWZvciB0aGUgSmF2YUNDIGNvbXBpbGVyIGNvbXBpbGVyLiBJdCBpbnNlcnRzIHBhcnNlIHRyZWUgYnVpbGRpbmcgYWN0aW9ucwotYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIEphdmFDQyBzb3VyY2UgdGhhdCBpdCBnZW5lcmF0ZXMuIFRoZSBvdXRwdXQgb2YKLUpKVHJlZSBpcyBydW4gdGhyb3VnaCBKYXZhQ0MgdG8gY3JlYXRlIHRoZSBwYXJzZXIuCi08cD5UbyB1c2UgdGhlIGpqdHJlZSB0YXNrLCBzZXQgdGhlIDxpPnRhcmdldDwvaT4gYXR0cmlidXRlIHRvIHRoZSBuYW1lCi1vZiB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeQotY29udGFpbmluZyB0aGUgSmF2YUNDIGluc3RhbGxhdGlvbiB1c2luZyB0aGUgPGk+amF2YWNjaG9tZTwvaT4gYXR0cmlidXRlLAotc28gdGhhdCBBbnQgY2FuIGZpbmQgdGhlIEphdmFDQyBjbGFzc2VzLiBPcHRpb25hbGx5LCB5b3UgY2FuIGFsc28gc2V0IHRoZQotPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPgotdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBhbmQgbm9kZSBmaWxlcyB0byBhIHNwZWNpZmljIGRpcmVjdG9yeS4KLU90aGVyd2lzZSBqanRyZWUgd3JpdGVzIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgYW5kIG5vZGUgZmlsZXMgdG8gdGhlIGRpcmVjdG9yeQotY29udGFpbmluZyB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZS4gQXMgYW4gZXh0cmEgb3B0aW9uLCB5b3UgY2FuIGFsc28gc2V0IHRoZQotPGk+b3V0cHV0ZmlsZTwvaT4gdG8gd3JpdGUgdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZ3JhbW1hciBmaWxlIHRvIGEgc3BlY2lmaWMgKGRpcmVjdG9yeSBhbmQpIGZpbGUuCi1PdGhlcndpc2Ugamp0cmVlIHdyaXRlcyB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUgYXMgdGhlIEpKVHJlZQotZ3JhbW1hciBmaWxlIHdpdGggYSBzdWZmaXggLmpqLjwvcD4KLTxwPlRoaXMgdGFzayBvbmx5IGludm9rZXMgSkpUcmVlIGlmIHRoZSBncmFtbWFyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUKLWdlbmVyYXRlZCBKYXZhQ0MgZmlsZS48L3A+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+SW52b2tlcyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9qYXZhY2Mub3JnLyIgdGFyZ2V0PSJfdG9wIj5KSlRyZWU8L2E+IHByZXByb2Nlc3NvciBmb3IgdGhlIEphdmFDQworY29tcGlsZXIgY29tcGlsZXIuIEl0IGluc2VydHMgcGFyc2UgdHJlZSBidWlsZGluZyBhY3Rpb25zIGF0IHZhcmlvdXMgcGxhY2VzIGluIHRoZSBKYXZhQ0Mgc291cmNlCit0aGF0IGl0IGdlbmVyYXRlcy4gVGhlIG91dHB1dCBvZiBKSlRyZWUgaXMgcnVuIHRocm91Z2ggSmF2YUNDIHRvIGNyZWF0ZSB0aGUgcGFyc2VyLjwvcD4KKzxwPlRvIHVzZSB0aGUgPGNvZGU+amp0cmVlPC9jb2RlPiB0YXNrLCBzZXQgdGhlIDx2YXI+dGFyZ2V0PC92YXI+IGF0dHJpYnV0ZSB0byB0aGUgbmFtZSBvZiB0aGUKK0pKVHJlZSBncmFtbWFyIGZpbGUgdG8gcHJvY2Vzcy4gWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSmF2YUNDCitpbnN0YWxsYXRpb24gdXNpbmcgdGhlIDx2YXI+amF2YWNjaG9tZTwvdmFyPiBhdHRyaWJ1dGUsIHNvIHRoYXQgQW50IGNhbiBmaW5kIHRoZSBKYXZhQ0MKK2NsYXNzZXMuIE9wdGlvbmFsbHksIHlvdSBjYW4gYWxzbyBzZXQgdGhlIDx2YXI+b3V0cHV0ZGlyZWN0b3J5PC92YXI+IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDCitncmFtbWFyIGFuZCBub2RlIGZpbGVzIHRvIGEgc3BlY2lmaWMgZGlyZWN0b3J5LiAgT3RoZXJ3aXNlIDxjb2RlPmpqdHJlZTwvY29kZT4gd3JpdGVzIHRoZSBnZW5lcmF0ZWQKK0phdmFDQyBncmFtbWFyIGFuZCBub2RlIGZpbGVzIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSkpUcmVlIGdyYW1tYXIgZmlsZS4gQXMgYW4gZXh0cmEKK29wdGlvbiwgeW91IGNhbiBhbHNvIHNldCB0aGUgPHZhcj5vdXRwdXRmaWxlPC92YXI+IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgZmlsZSB0byBhCitzcGVjaWZpYyAoZGlyZWN0b3J5IGFuZCkgZmlsZS4gIE90aGVyd2lzZSA8Y29kZT5qanRyZWU8L2NvZGU+IHdyaXRlcyB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyCitmaWxlIGFzIHRoZSBKSlRyZWUgZ3JhbW1hciBmaWxlIHdpdGggYSBzdWZmaXggPHNhbXA+LmpqPC9zYW1wPi48L3A+Cis8cD5UaGlzIHRhc2sgb25seSBpbnZva2VzIEpKVHJlZSBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGdlbmVyYXRlZCBKYXZhQ0MgZmlsZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KIAotPHRhYmxlIEJPUkRFUiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KIDx0cj4KLTx0ZCBWQUxJR049VE9QPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotCi08dGQgVkFMSUdOPVRPUD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD50YXJnZXQ8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5UaGUgamp0cmVlIGdyYW1tYXIgZmlsZSB0byBwcm9jZXNzLjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ZZXM8L3RkPgorICA8dGQ+dGFyZ2V0PC90ZD4KKyAgPHRkPlRoZSBKSlRyZWUgZ3JhbW1hciBmaWxlIHRvIHByb2Nlc3MuPC90ZD4KKyAgPHRkPlllczwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5qYXZhY2Nob21lPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+VGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKYXZhQ0MgZGlzdHJpYnV0aW9uLjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ZZXM8L3RkPgorICA8dGQ+amF2YWNjaG9tZTwvdGQ+CisgIDx0ZD5UaGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEphdmFDQyBkaXN0cmlidXRpb24uPC90ZD4KKyAgPHRkPlllczwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5vdXRwdXRkaXJlY3Rvcnk8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgYW5kIG5vZGUgZmlsZXMgdG8uCi1JZiBub3Qgc2V0LCB0aGUgZmlsZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBncmFtbWFyIGZpbGUuJm5ic3A7PC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgPHRkPm91dHB1dGRpcmVjdG9yeTwvdGQ+CisgIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgYW5kIG5vZGUgZmlsZXMgdG8uICBJZiBub3Qgc2V0LCB0aGUgZmlsZXMKKyAgICBhcmUgd3JpdHRlbiB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGdyYW1tYXIgZmlsZS48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+b3V0cHV0ZmlsZTwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlRoZSBmaWxlIHRvIHdyaXRlIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGdyYW1tYXIgZmlsZQotdG8uIElmIG5vdCBzZXQsIHRoZSBmaWxlIGlzIHdyaXR0ZW4gd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBKSlRyZWUKLWdyYW1tYXIgZmlsZSBidXQgd2l0aCBhIHRoZSBzdWZmaXggPGNvZGU+LmpqPC9jb2RlPi4gIFRoaXMgaXMgYQotZmlsZW5hbWUgcmVsYXRpdmUgdG8gPGVtPm91dHB1dGRpcmVjdG9yeTwvZW0+IGlmIHNwZWNpZmllZCwgdGhlCi1wcm9qZWN0J3MgYmFzZWRpci48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8dGQ+b3V0cHV0ZmlsZTwvdGQ+CisgIDx0ZD5UaGUgZmlsZSB0byB3cml0ZSB0aGUgZ2VuZXJhdGVkIEphdmFDQyBncmFtbWFyIGZpbGUgdG8uIElmIG5vdCBzZXQsIHRoZSBmaWxlIGlzIHdyaXR0ZW4gd2l0aAorICAgIHRoZSBzYW1lIG5hbWUgYXMgdGhlIEpKVHJlZSBncmFtbWFyIGZpbGUgYnV0IHdpdGggYSB0aGUgc3VmZml4IDxjb2RlPi5qajwvY29kZT4uICBUaGlzIGlzIGEKKyAgICBmaWxlbmFtZSByZWxhdGl2ZSB0byA8dmFyPm91dHB1dGRpcmVjdG9yeTwvdmFyPiBpZiBzcGVjaWZpZWQsIHRoZSBwcm9qZWN0J3MgYmFzZWRpci48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+YnVpbGRub2RlZmlsZXM8L3RkPgotCi08dGQgVkFMSUdOPVRPUD5TZXRzIHRoZSBCVUlMRF9OT0RFX0ZJTEVTIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbgotb3B0aW9uLjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDx0ZD5idWlsZG5vZGVmaWxlczwvdGQ+CisgIDx0ZD5TZXRzIHRoZSBCVUlMRF9OT0RFX0ZJTEVTIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgPHRkPk5vPC90ZD4KIDwvdHI+CiAKIDx0cj4KLTx0ZCBWQUxJR049VE9QPm11bHRpPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTVVMVEkgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8dGQ+bXVsdGk8L3RkPgorICA8dGQ+U2V0cyB0aGUgTVVMVEkgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+bm9kZWRlZmF1bHR2b2lkPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9ERUZBVUxUX1ZPSUQgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuCi1vcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgPHRkPm5vZGVkZWZhdWx0dm9pZDwvdGQ+CisgIDx0ZD5TZXRzIHRoZSBOT0RFX0RFRkFVTFRfVk9JRCBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgIDx0ZD5ObzwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5ub2RlZmFjdG9yeTwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlNldHMgdGhlIE5PREVfRkFDVE9SWSBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBib29sZWFuIG9wdGlvbi48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8dGQ+bm9kZWZhY3Rvcnk8L3RkPgorICA8dGQ+U2V0cyB0aGUgTk9ERV9GQUNUT1JZIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgIDx0ZD5ObzwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5ub2Rlc2NvcGVob29rPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9TQ09QRV9IT09LIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbgotb3B0aW9uLjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDx0ZD5ub2Rlc2NvcGVob29rPC90ZD4KKyAgPHRkPlNldHMgdGhlIE5PREVfU0NPUEVfSE9PSyBncmFtbWFyIG9wdGlvbi4gVGhpcyBpcyBhIGJvb2xlYW4gb3B0aW9uLjwvdGQ+CisgIDx0ZD5ObzwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5ub2RldXNlc3BhcnNlcjwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlNldHMgdGhlIE5PREVfVVNFU19QQVJTRVIgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuCi1vcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgPHRkPm5vZGV1c2VzcGFyc2VyPC90ZD4KKyAgPHRkPlNldHMgdGhlIE5PREVfVVNFU19QQVJTRVIgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+c3RhdGljPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgU1RBVElDIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgPHRkPnN0YXRpYzwvdGQ+CisgIDx0ZD5TZXRzIHRoZSBTVEFUSUMgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+dmlzaXRvcjwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlNldHMgdGhlIFZJU0lUT1IgZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBib29sZWFuIG9wdGlvbi48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8dGQ+dmlzaXRvcjwvdGQ+CisgIDx0ZD5TZXRzIHRoZSBWSVNJVE9SIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgYm9vbGVhbiBvcHRpb24uPC90ZD4KKyAgPHRkPk5vPC90ZD4KIDwvdHI+CiAKIDx0cj4KLTx0ZCBWQUxJR049VE9QPm5vZGVwYWNrYWdlPC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9QQUNLQUdFIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbi48L3RkPgotCi08dGQgQUxJR049Q0VOVEVSIFZBTElHTj1UT1A+Tm88L3RkPgorICA8dGQ+bm9kZXBhY2thZ2U8L3RkPgorICA8dGQ+U2V0cyB0aGUgTk9ERV9QQUNLQUdFIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbi48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAogPHRyPgotPHRkIFZBTElHTj1UT1A+dmlzaXRvcmV4Y2VwdGlvbjwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QPlNldHMgdGhlIFZJU0lUT1JfRVhDRVBUSU9OIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nCi1vcHRpb24uPC90ZD4KLQotPHRkIEFMSUdOPUNFTlRFUiBWQUxJR049VE9QPk5vPC90ZD4KKyAgPHRkPnZpc2l0b3JleGNlcHRpb248L3RkPgorICA8dGQ+U2V0cyB0aGUgVklTSVRPUl9FWENFUFRJT04gZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uLjwvdGQ+CisgIDx0ZD5ObzwvdGQ+CiA8L3RyPgogCiA8dHI+Ci08dGQgVkFMSUdOPVRPUD5ub2RlcHJlZml4PC90ZD4KLQotPHRkIFZBTElHTj1UT1A+U2V0cyB0aGUgTk9ERV9QUkVGSVggZ3JhbW1hciBvcHRpb24uIFRoaXMgaXMgYSBzdHJpbmcgb3B0aW9uLjwvdGQ+Ci0KLTx0ZCBBTElHTj1DRU5URVIgVkFMSUdOPVRPUD5ObzwvdGQ+CisgIDx0ZD5ub2RlcHJlZml4PC90ZD4KKyAgPHRkPlNldHMgdGhlIE5PREVfUFJFRklYIGdyYW1tYXIgb3B0aW9uLiBUaGlzIGlzIGEgc3RyaW5nIG9wdGlvbi48L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIAotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF4IGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZAotICAgICAgVk0uICA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgorPHRyPgorICA8dGQ+bWF4bWVtb3J5PC90ZD4KKyAgPHRkPk1heCBhbW91bnQgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIHRvIHRoZSBmb3JrZWQgSlZNLiAgPGVtPnNpbmNlIEFudCAxLjguMzwvZW0+PC90ZD4KKyAgPHRkPk5vPC90ZD4KKzwvdHI+CiA8L3RhYmxlPgogCi08aDM+Ci1FeGFtcGxlPC9oMz4KKzxoMz5FeGFtcGxlPC9oMz4KIAotPGJsb2NrcXVvdGU+Ci08cHJlPiZsdDtqanRyZWUmbmJzcDsKLSZuYnNwOyZuYnNwOyZuYnNwOyB0YXJnZXQ9InNyYy9QYXJzZXIuamp0IiZuYnNwOwotJm5ic3A7Jm5ic3A7Jm5ic3A7IG91dHB1dGRpcmVjdG9yeT0iYnVpbGQvc3JjIgotJm5ic3A7Jm5ic3A7Jm5ic3A7IGphdmFjY2hvbWU9ImM6L3Byb2dyYW0gZmlsZXMvSmF2YUNDIiZuYnNwOwotJm5ic3A7Jm5ic3A7Jm5ic3A7IG5vZGV1c2VzcGFyc2VyPSJ0cnVlIgotLyZndDs8L3ByZT4KLTwvYmxvY2txdW90ZT4KLVRoaXMgaW52b2tlcyBKSlRyZWUgb24gZ3JhbW1hciBmaWxlIHNyYy9QYXJzZXIuamp0LCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQKLWdyYW1tYXIgZmlsZSwgUGFyc2VyLmpqLCBmaWxlIHRvIGJ1aWxkL3NyYy4gVGhlIGdyYW1tYXIgb3B0aW9uIE5PREVfVVNFU19QQVJTRVIKLWlzIHNldCB0byB0cnVlIHdoZW4gaW52b2tpbmcgSkpUcmVlLgotPGJyPgorPHA+SW52b2tlIEpKVHJlZSBvbiBncmFtbWFyIGZpbGUgPHNhbXA+c3JjL1BhcnNlci5qanQ8L3NhbXA+LCB3cml0aW5nIHRoZSBnZW5lcmF0ZWQgZ3JhbW1hcgorZmlsZSwgPHNhbXA+UGFyc2VyLmpqPC9zYW1wPiwgdG8gPHNhbXA+YnVpbGQvc3JjPC9zYW1wPi4gVGhlIGdyYW1tYXIgb3B0aW9uIE5PREVfVVNFU19QQVJTRVIgaXMgc2V0Cit0byA8cT50cnVlPC9xPiB3aGVuIGludm9raW5nIEpKVHJlZS48L3A+Cis8cHJlPgorJmx0O2pqdHJlZSB0YXJnZXQ9InNyYy9QYXJzZXIuamp0IgorICAgICAgICBvdXRwdXRkaXJlY3Rvcnk9ImJ1aWxkL3NyYyIKKyAgICAgICAgamF2YWNjaG9tZT0iYzovcHJvZ3JhbSBmaWxlcy9KYXZhQ0MiCisgICAgICAgIG5vZGV1c2VzcGFyc2VyPSJ0cnVlIi8mZ3Q7PC9wcmU+CiAKLTxoMz5Db21wYXJpc29uIG91dHB1dCBsb2NhdGlvbnMgYmV0d2VlbiBjb21tYW5kIGxpbmUgSkpUcmVlIGFuZCBkaWZmZXJlbnQgQW50IHRhc2tkZWYgdmVyc2lvbnM8L2gzPgorPGgzPkNvbXBhcmlzb24gb2Ygb3V0cHV0IGxvY2F0aW9ucyBiZXR3ZWVuIGNvbW1hbmQgbGluZSBKSlRyZWUgYW5kIGRpZmZlcmVudCBBbnQgPGNvZGU+dGFza2RlZjwvY29kZT4KK3ZlcnNpb25zPC9oMz4KIAotPHRhYmxlIGNlbGxwYWRkaW5nPSIzIiBib3JkZXI9IjEiPgorPHRhYmxlPgorICA8dGhlYWQgY2xhc3M9Im5vLWJvbGQiPgogPHRyPgotICA8dGQ+PGI+Q29tbWFuZCBMaW5lIEpKVHJlZSBvcHRpb25zPC9iPgotICAgIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8aT5hbmQgR2VuZXJhdGVkIEZpbGVzPC9pPiAod29ya2luZyBkaXJlY3Rvcnk6IDxjb2RlPi90bXA8L2NvZGU+KTwvdGQ+Ci0gIDx0ZD48Yj5BbnQgMS41LjM8L2I+IHZlcnN1cyBjb21tYW5kIGxpbmU8L3RkPgotICA8dGQ+PGI+QW50IDEuNjwvYj4gdmVyc3VzIGNvbW1hbmQgbGluZTwvdGQ+CisgIDx0aCBzY29wZT0iY29sIj48c3Ryb25nPkNvbW1hbmQgbGluZSBKSlRyZWUgb3B0aW9uczwvc3Ryb25nPiBhbmQgPGVtPmdlbmVyYXRlZCBmaWxlczwvZW0+ICh3b3JraW5nIGRpcmVjdG9yeTogPHNhbXA+L3RtcDwvc2FtcD4pPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPjxzdHJvbmc+QW50IDEuNS4zPC9zdHJvbmc+IHZlcnN1cyBjb21tYW5kIGxpbmU8L3RoPgorICA8dGggc2NvcGU9ImNvbCI+PHN0cm9uZz5BbnQgMS42PC9zdHJvbmc+IHZlcnN1cyBjb21tYW5kIGxpbmU8L3RoPgogPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgogPHRyPgogICA8dGQ+PHByZT48Yj5qanRyZWUgIGdyYW1tYXIuamp0PC9iPgogICAgIC90bXAvZ3JhbW1hci5qagpAQCAtMjQxLDcgKzE5MSw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9ncmFtbWFyLmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0yNTIsNyArMjAyLDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSBncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3JlbGF0aXZlL2dyYW1tYXIuamoKICAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTI2MCw3ICsyMTAsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvZ3JhbW1hci5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMjY4LDcgKzIxOCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvZ3JhbW1hci5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMjc2LDcgKzIyNiw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqCiAgICAgL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0yODQsNyArMjM0LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamoKICAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTI5Miw3ICsyNDIsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamoKICAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTMwMCw3ICsyNTAsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpvdXRwdXQuamogIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiBncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL291dHB1dC5qagogICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMzA4LDcgKzI1OCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvb3V0cHV0LmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zMTYsNyArMjY2LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvb3V0cHV0LmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zMjQsNyArMjc0LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlIGdyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvb3V0cHV0LmpqCiAgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zMzIsNyArMjgyLDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvb3V0cHV0LmpqCiAgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zNDAsNyArMjkwLDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTpvdXRwdXQuamogLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3JlbGF0aXZlL291dHB1dC5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMzQ4LDcgKzI5OCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyBncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL291dHB1dC5qagogICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMzU2LDcgKzMwNiw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL291dHB1dC5qagogICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMzY0LDcgKzMxNCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOm91dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6b3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9hYnNvbHV0ZS9vdXRwdXQuamoKICAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTM3Miw3ICszMjIsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqICBncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqIGdyYW1tYXIuamp0PC9iPgogICAgIC90bXAvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtMzgwLDcgKzMzMCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zODgsNyArMzM4LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC0zOTYsNyArMzQ2LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9yZWxhdGl2ZS9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC00MDQsNyArMzU0LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9yZWxhdGl2ZS9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC9yZWxhdGl2ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC00MTIsNyArMzYyLDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6c3ViZGlyL291dHB1dC5qaiAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtNDIwLDcgKzM3MCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICBncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvIGdyYW1tYXIuamp0PC9iPgogICAgIC90bXAvYWJzb2x1dGUvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtNDI4LDcgKzM3OCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTpzdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvYWJzb2x1dGUvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtNDM2LDcgKzM4Niw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvICAvdG1wL2Fic29sdXRlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOnN1YmRpci9vdXRwdXQuamogLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTQ0NCw3ICszOTQsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiBncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTQ1Miw3ICs0MDIsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTQ2MCwzOSArNDEwLDM5IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KICAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgotPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTo8aT48dT5EOjwvdT48L2k+L3RtcC9zdWJkaXIvb3V0cHV0LmpqICBncmFtbWFyLmpqdDwvYj4KKzx0ciBpZD0iZm9vdG5vdGUtMS1iYWNrIj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTo8aT5EOjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CiAgIDx0ZD5Ob3QgU3VwcG9ydGVkPC90ZD4KLSAgPHRkPk5vdCBTdXBwb3J0ZWQgKik8L3RkPgorICA8dGQ+Tm90IFN1cHBvcnRlZDxhIGhyZWY9IiNmb290bm90ZS0xIj48c3VwPio8L3N1cD48L2E+PC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOjxpPjx1PkQ6PC91PjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOjxpPkQ6PC9pPi90bXAvc3ViZGlyL291dHB1dC5qaiByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KICAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgotICA8dGQ+Tm90IFN1cHBvcnRlZCAqKTwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPGEgaHJlZj0iI2Zvb3Rub3RlLTEiPjxzdXA+Kjwvc3VwPjwvYT48L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6PGk+PHU+RDo8L3U+PC9pPi90bXAvc3ViZGlyL291dHB1dC5qaiAgL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTo8aT5EOjwvaT4vdG1wL3N1YmRpci9vdXRwdXQuamogL3RtcC9hYnNvbHV0ZS9ncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KICAgPHRkPk5vdCBTdXBwb3J0ZWQ8L3RkPgotICA8dGQ+Tm90IFN1cHBvcnRlZCAqKTwvdGQ+CisgIDx0ZD5Ob3QgU3VwcG9ydGVkPGEgaHJlZj0iI2Zvb3Rub3RlLTEiPjxzdXA+Kjwvc3VwPjwvYT48L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTpyZWxhdGl2ZSAgZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlIGdyYW1tYXIuamp0PC9iPgogICAgIC90bXAvcmVsYXRpdmUvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wL3JlbGF0aXZlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTUwMCw3ICs0NTAsNyBAQAogICA8dGQ+U2FtZTwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+PHByZT48Yj5qanRyZWUgIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlICByZWxhdGl2ZS9ncmFtbWFyLmpqdDwvYj4KKyAgPHRkPjxwcmU+PGI+amp0cmVlIC1PVVRQVVRfRklMRTovdG1wL3N1YmRpci9vdXRwdXQuamogLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9yZWxhdGl2ZS90bXAvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtNTA4LDcgKzQ1OCw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6cmVsYXRpdmUgIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOnJlbGF0aXZlIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9yZWxhdGl2ZS90bXAvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvcmVsYXRpdmUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgpAQCAtNTE2LDcgKzQ2Niw3IEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIGdyYW1tYXIuamp0PC9iPgorICA8dGQ+PHByZT48Yj5qanRyZWUgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyBncmFtbWFyLmpqdDwvYj4KICAgICAvdG1wL2Fic29sdXRlL3RtcC9zdWJkaXIvb3V0cHV0LmpqCiAgICAgL3RtcC9hYnNvbHV0ZS8mbHQ7Z2VuZXJhdGVkJmd0Oy5qYXZhPC9wcmU+CiAgIDwvdGQ+CkBAIC01MjQsNyArNDc0LDcgQEAKICAgPHRkPlNhbWU8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPjxwcmU+PGI+amp0cmVlICAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqICAtT1VUUFVUX0RJUkVDVE9SWTovdG1wL2Fic29sdXRlLyAgcmVsYXRpdmUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvIHJlbGF0aXZlL2dyYW1tYXIuamp0PC9iPgogICAgIC90bXAvYWJzb2x1dGUvdG1wL3N1YmRpci9vdXRwdXQuamoKICAgICAvdG1wL2Fic29sdXRlLyZsdDtnZW5lcmF0ZWQmZ3Q7LmphdmE8L3ByZT4KICAgPC90ZD4KQEAgLTUzMiwzMiArNDgyLDMwIEBACiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48cHJlPjxiPmpqdHJlZSAgLU9VVFBVVF9GSUxFOi90bXAvc3ViZGlyL291dHB1dC5qaiAgLU9VVFBVVF9ESVJFQ1RPUlk6L3RtcC9hYnNvbHV0ZS8gIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CisgIDx0ZD48cHJlPjxiPmpqdHJlZSAtT1VUUFVUX0ZJTEU6L3RtcC9zdWJkaXIvb3V0cHV0LmpqIC1PVVRQVVRfRElSRUNUT1JZOi90bXAvYWJzb2x1dGUvIC90bXAvYWJzb2x1dGUvZ3JhbW1hci5qanQ8L2I+CiAgICAgL3RtcC9hYnNvbHV0ZS90bXAvc3ViZGlyL291dHB1dC5qagogICAgIC90bXAvYWJzb2x1dGUvJmx0O2dlbmVyYXRlZCZndDsuamF2YTwvcHJlPgogICA8L3RkPgogICA8dGQ+Tm90IFN1cHBvcnRlZDwvdGQ+CiAgIDx0ZD5TYW1lPC90ZD4KIDwvdHI+CisgIDwvdGJvZHk+CiA8L3RhYmxlPgogCi08cD4qKSA8dT5Gb290bm90ZTwvdT46IFdoZW4gcnVubmluZyBKSlRyZWUgd2l0aCB0aGUgQW50IHRhc2tkZWYgPGk+amp0cmVlPC9pPiB0aGUgb3B0aW9uIDxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPiBtdXN0IGFsd2F5cyAKLWJlIHNldCwgYmVjYXVzZSB0aGUgcHJvamVjdCdzIGJhc2VkaXIgYW5kIHRoZSBBbnQgd29ya2luZyBkaXJlY3RvcnkgbWlnaHQgZGlmZmVyLiBTbyBldmVuIGlmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBqanRyZWUgdGFza2RlZiAKLTxpPm91dHB1dGRpcmVjdG9yeTwvaT4gSkpUcmVlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIDxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPiBzZXQgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyZWN0b3J5LiAKLUJ1dCB3aGVuIHRoZSA8Y29kZT4tT1VUUFVUX0RJUkVDVE9SWTwvY29kZT4gaXMgc2V0LCB0aGUgPGNvZGU+LU9VVFBVVF9GSUxFPC9jb2RlPiBzZXR0aW5nIGlzIGhhbmRsZWQgYXMgaWYgcmVsYXRpdmUgdG8gdGhpcyAKLTxjb2RlPi1PVVRQVVRfRElSRUNUT1JZPC9jb2RlPi4gVGh1cyB3aGVuIHRoZSA8Y29kZT4tT1VUUFVUX0ZJTEU8L2NvZGU+IGlzIGFic29sdXRlIG9yIGNvbnRhaW5zIGEgZHJpdmUgbGV0dGVyIHdlIGhhdmUgYSAKLXByb2JsZW0uIAotVGhlcmVmb3JlIGFic29sdXRlIDxpPm91dHB1dGZpbGU8L2k+cyAod2hlbiB0aGUgPGk+b3V0cHV0ZGlyZWN0b3J5PC9pPiBpc24ndCBzcGVjaWZpZWQpIGFyZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IGRpcmVjdG9yeS4KLUFuZCBmb3IgdGhpcyByZWFzb24gPGk+b3V0cHV0ZmlsZTwvaT5zIHRoYXQgY29udGFpbiBhIGRyaXZlIGxldHRlciBjYW4ndCBiZSBzdXBwb3J0ZWQuPC9wPgorPHAgaWQ9ImZvb3Rub3RlLTEiPjxhIGhyZWY9IiNmb290bm90ZS0xLWJhY2siPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjwvYT46IFdoZW4gcnVubmluZyBKSlRyZWUgd2l0aAordGhlIEFudCA8Y29kZT50YXNrZGVmIGpqdHJlZTwvY29kZT4gdGhlIG9wdGlvbiA8a2JkPi1PVVRQVVRfRElSRUNUT1JZPC9rYmQ+IG11c3QgYWx3YXlzIGJlIHNldCwKK2JlY2F1c2UgdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj4gYW5kIHRoZSBBbnQgd29ya2luZyBkaXJlY3RvcnkgbWlnaHQgZGlmZmVyLiBTbyBldmVuIGlmIHlvdQorZG9uJ3Qgc3BlY2lmeSB0aGUgPHZhcj5vdXRwdXRkaXJlY3Rvcnk8L3Zhcj4gZm9yIDxjb2RlPnRhc2tkZWYgamp0cmVlPC9jb2RlPiwgSkpUcmVlIHdpbGwgYmUgY2FsbGVkCit3aXRoIHRoZSA8a2JkPi1PVVRQVVRfRElSRUNUT1JZPC9rYmQ+IHNldCB0byB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPi4gIEJ1dCB3aGVuCit0aGUgPGtiZD4tT1VUUFVUX0RJUkVDVE9SWTwva2JkPiBpcyBzZXQsIHRoZSA8a2JkPi1PVVRQVVRfRklMRTwva2JkPiBzZXR0aW5nIGlzIGhhbmRsZWQgYXMgaWYKK3JlbGF0aXZlIHRvIHRoaXMgPGtiZD4tT1VUUFVUX0RJUkVDVE9SWTwva2JkPi4gVGh1cyB3aGVuIHRoZSA8a2JkPi1PVVRQVVRfRklMRTwva2JkPiBpcyBhYnNvbHV0ZQorb3IgY29udGFpbnMgYSBkcml2ZSBsZXR0ZXIgd2UgaGF2ZSBhIHByb2JsZW0uICBUaGVyZWZvcmUgYWJzb2x1dGUgPHZhcj5vdXRwdXRmaWxlPC92YXI+cyAod2hlbgordGhlIDx2YXI+b3V0cHV0ZGlyZWN0b3J5PC92YXI+IGlzbid0IHNwZWNpZmllZCkgYXJlIG1hZGUgcmVsYXRpdmUgdG8gdGhlIGRlZmF1bHQgZGlyZWN0b3J5LiAgQW5kIGZvcgordGhpcyByZWFzb24gPHZhcj5vdXRwdXRmaWxlPC92YXI+cyB0aGF0IGNvbnRhaW4gYSBkcml2ZSBsZXR0ZXIgY2FuJ3QgYmUgc3VwcG9ydGVkLjwvcD4KIAotPHA+QnkgdGhlIHdheTogc3BlY2lmeWluZyBhIGRyaXZlIGxldHRlciBpbiB0aGUgPGNvZGU+LU9VVFBVVF9GSUxFPC9jb2RlPiB3aGVuIHRoZSA8Y29kZT4tT1VUUFVUX0RJUkVDVE9SWTwvY29kZT4gaXMgc2V0LCBhbHNvIAotcmVzdWx0cyBpbiBzdHJhbmdlIGJlaGF2aW9yIHdoZW4gcnVubmluZyBKSlRyZWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLjwvcD4KLQotPGJyPgotCi0KLQorPHA+QnkgdGhlIHdheTogc3BlY2lmeWluZyBhIGRyaXZlIGxldHRlciBpbiB0aGUgPGtiZD4tT1VUUFVUX0ZJTEU8L2tiZD4gd2hlbgordGhlIDxrYmQ+LU9VVFBVVF9ESVJFQ1RPUlk8L2tiZD4gaXMgc2V0LCBhbHNvIHJlc3VsdHMgaW4gc3RyYW5nZSBiZWhhdmlvciB3aGVuIHJ1bm5pbmcgSkpUcmVlIGZyb20KK3RoZSBjb21tYW5kIGxpbmUuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qbGluay5odG1sIGIvbWFudWFsL1Rhc2tzL2psaW5rLmh0bWwKaW5kZXggNDVlZjk2MS4uOWY4NDk5NCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2psaW5rLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2psaW5rLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMTMgKzE1LDkzIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SkxpbmsgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImpsaW5rIj5KbGluazwvYT48L2gyPgotPGgzPjxpPkRlcHJlY2F0ZWQ8L2k+PC9oMz4KLTxwPjxpPlRoaXMgdGFzayBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgYSA8YSBocmVmPSIuLi9UeXBlcy96aXBmaWxlc2V0Lmh0bWwiPnppcGZpbGVzZXQ8L2E+Ci0gb3IgPGEgaHJlZj0iLi4vVGFza3MvemlwLmh0bWwjemlwZ3JvdXBmaWxlc2V0Ij56aXBncm91cGZpbGVzZXQ8L2E+IHdpdGggdGhlCi0gPGEgaHJlZj0iLi4vVGFza3MvamFyLmh0bWwiPkphciB0YXNrPC9hPiBvciA8YSBocmVmPSIuLi9UYXNrcy96aXAuaHRtbCI+WmlwIHRhc2s8L2E+Ci0gaW5zdGVhZC48L2k+PC9wPgorPGgyIGlkPSJqbGluayI+Smxpbms8L2gyPgorPGgzPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+PC9oMz4KKzxwPjxlbT5UaGlzIHRhc2sgaGFzIGJlZW4gPHU+ZGVwcmVjYXRlZDwvdT4uIFVzZSBhIDxhIGhyZWY9Ii4uL1R5cGVzL3ppcGZpbGVzZXQuaHRtbCI+emlwZmlsZXNldDwvYT4KK29yIDxhIGhyZWY9Ii4uL1Rhc2tzL3ppcC5odG1sI3ppcGdyb3VwZmlsZXNldCI+emlwZ3JvdXBmaWxlc2V0PC9hPiB3aXRoCit0aGUgPGEgaHJlZj0iLi4vVGFza3MvamFyLmh0bWwiPkphciB0YXNrPC9hPiBvciA8YSBocmVmPSIuLi9UYXNrcy96aXAuaHRtbCI+WmlwIHRhc2s8L2E+CitpbnN0ZWFkLiAgRm9yIGEgdGFzayBiYXNlZCBvbiB0aGUgSkRLJ3MgamxpbmsgdG9vbCwgc2VlCis8YSBocmVmPSJsaW5rLmh0bWwiPkxpbms8L2E+LjwvZW0+PC9wPgogCi08aDM+PGI+RGVzY3JpcHRpb246PC9iPjwvaDM+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+PHN0cm9uZz5Gb3IgYSB0YXNrIGJhc2VkIG9uIHRoZSBKREsncyBqbGluayB0b29sLCBzZWUKKzxhIGhyZWY9ImxpbmsuaHRtbCI+TGluazwvYT4uICBUaGlzIHRhc2sgaXMgZm9yIHNvbWV0aGluZyBlbHNlCitlbnRpcmVseS48L3N0cm9uZz48L3A+CisKIDxwPkxpbmtzIGVudHJpZXMgZnJvbSBzdWItYnVpbGRzIGFuZCBsaWJyYXJpZXMuPC9wPgogCi08cD5UaGUgamxpbmsgdGFzayBjYW4gYmUgdXNlZCB0byBidWlsZCBqYXIgYW5kIHppcCBmaWxlcywgc2ltaWxhciB0byAKLXRoZSA8aT5qYXI8L2k+IHRhc2suCi1Ib3dldmVyLCBqbGluayBwcm92aWRlcyBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGUgd2F5IGVudHJpZXMgZnJvbSAKLWlucHV0IGZpbGVzCi1hcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLiBTcGVjaWZpY2FsbHksIGNhcGFiaWxpdGllcyBmb3IgbWVyZ2luZyAKLWVudHJpZXMgZnJvbQotbXVsdGlwbGUgemlwIG9yIGphciBmaWxlcyBpcyBhdmFpbGFibGUuPC9wPgorPHA+VGhlIDxjb2RlPmpsaW5rPC9jb2RlPiB0YXNrIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGphciBhbmQgemlwIGZpbGVzLCBzaW1pbGFyIHRvCit0aGUgPGNvZGU+amFyPC9jb2RlPiB0YXNrLiAgSG93ZXZlciwgPGNvZGU+amxpbms8L2NvZGU+IHByb3ZpZGVzIG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSB3YXkKK2VudHJpZXMgZnJvbSBpbnB1dCBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLiBTcGVjaWZpY2FsbHksIGNhcGFiaWxpdGllcyBmb3IgbWVyZ2luZworZW50cmllcyBmcm9tIG11bHRpcGxlIHppcCBvciBqYXIgZmlsZXMgaXMgYXZhaWxhYmxlLjwvcD4KIAotPHA+SWYgYSBtZXJnZWZpbGUgaXMgc3BlY2lmaWVkIGRpcmVjdGx5IChlZy4gYXQgdGhlIHRvcCBsZXZlbCBvZiBhIAotPGk+bWVyZ2VmaWxlczwvaT4KLXBhdGhlbGVtZW50KSA8aT5hbmQ8L2k+IHRoZSBtZXJnZWZpbGUgZW5kcyBpbiAmcXVvdDsuemlwJnF1b3Q7IG9yIAotJnF1b3Q7LmphciZxdW90OywKLWVudHJpZXMgaW4gdGhlIG1lcmdlZmlsZSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBvdXRmaWxlLiBBIGZpbGUgd2l0aCAKLWFueSBvdGhlciBleHRlbnNpb24KLXdpbGwgYmUgYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLCBldmVuIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgCi1tZXJnZWZpbGVzIGVsZW1lbnQuCi1EaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gZWl0aGVyIHRoZSBtZXJnZWZpbGVzIG9yIGFkZGZpbGVzIGVsZW1lbnQgCi1hcmUgYWRkZWQgdG8gdGhlCi1vdXRwdXQgZmlsZSBhcyB5b3Ugd291bGQgZXhwZWN0OiBhbGwgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMgYXJlIAotcmVjdXJzaXZlbHkgYWRkZWQgdG8KLXRoZSBvdXRwdXQgZmlsZSB3aXRoIGFwcHJvcHJpYXRlIHByZWZpeGVzIGluIHRoZSBvdXRwdXQgZmlsZSAKLSh3aXRob3V0IG1lcmdpbmcpLgotPC9wPgorPHA+SWYgYSBtZXJnZWZpbGUgaXMgc3BlY2lmaWVkIGRpcmVjdGx5IChlZy4gYXQgdGhlIHRvcCBsZXZlbCBvZiBhIDxjb2RlPm1lcmdlZmlsZXM8L2NvZGU+CitwYXRoZWxlbWVudCkgPGVtPmFuZDwvZW0+IHRoZSBtZXJnZWZpbGUgZW5kcyBpbiA8c2FtcD4uemlwPC9zYW1wPiBvciA8c2FtcD4uamFyPC9zYW1wPiwgZW50cmllcyBpbgordGhlIG1lcmdlZmlsZSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSA8dmFyPm91dGZpbGU8L3Zhcj4uIEEgZmlsZSB3aXRoIGFueSBvdGhlciBleHRlbnNpb24gd2lsbCBiZQorYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlLCBldmVuIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+bWVyZ2VmaWxlczwvY29kZT4gZWxlbWVudC4KK0RpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiBlaXRoZXIgdGhlIDxjb2RlPm1lcmdlZmlsZXM8L2NvZGU+IG9yIDxjb2RlPmFkZGZpbGVzPC9jb2RlPiBlbGVtZW50IGFyZQorYWRkZWQgdG8gdGhlIG91dHB1dCBmaWxlIGFzIHlvdSB3b3VsZCBleHBlY3Q6IGFsbCBmaWxlcyBpbiBzdWJkaXJlY3RvcmllcyBhcmUgcmVjdXJzaXZlbHkgYWRkZWQgdG8KK3RoZSBvdXRwdXQgZmlsZSB3aXRoIGFwcHJvcHJpYXRlIHByZWZpeGVzIGluIHRoZSBvdXRwdXQgZmlsZSAod2l0aG91dCBtZXJnaW5nKS48L3A+CiAKLTxwPgotSW4gdGhlIGNhc2Ugd2hlcmUgZHVwbGljYXRlIGVudHJpZXMgYW5kL29yIGZpbGVzIGFyZSBmb3VuZCBhbW9uZyB0aGUgCi1maWxlcyB0byBiZSBtZXJnZWQgb3IKLWFkZGVkLCBqbGluayBtZXJnZXMgb3IgYWRkcyB0aGUgZmlyc3QgZW50cnkgYW5kIGlnbm9yZXMgYWxsIHN1YnNlcXVlbnQgZW50cmllcy4KLTwvcD4KKzxwPkluIHRoZSBjYXNlIHdoZXJlIGR1cGxpY2F0ZSBlbnRyaWVzIGFuZC9vciBmaWxlcyBhcmUgZm91bmQgYW1vbmcgdGhlIGZpbGVzIHRvIGJlIG1lcmdlZCBvcgorYWRkZWQsIDxjb2RlPmpsaW5rPC9jb2RlPiBtZXJnZXMgb3IgYWRkcyB0aGUgZmlyc3QgZW50cnkgYW5kIGlnbm9yZXMgYWxsIHN1YnNlcXVlbnQgZW50cmllcy48L3A+CiAKLTxwPgotamxpbmsgaWdub3JlcyBNRVRBLUlORiBkaXJlY3RvcmllcyBpbiBtZXJnZWZpbGVzLiBVc2VycyBzaG91bGQgc3VwcGx5IHRoZWlyCi1vd24gbWFuaWZlc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBvdXRwdXQgZmlsZS4KLTwvcD4KKzxwPjxjb2RlPmpsaW5rPC9jb2RlPiBpZ25vcmVzIDxzYW1wPk1FVEEtSU5GPC9zYW1wPiBkaXJlY3RvcmllcyBpbiA8dmFyPm1lcmdlZmlsZXM8L3Zhcj4uIFVzZXJzCitzaG91bGQgc3VwcGx5IHRoZWlyIG93biBtYW5pZmVzdCBpbmZvcm1hdGlvbiBmb3IgdGhlIG91dHB1dCBmaWxlLjwvcD4KIAotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgamxpbmtlZC4gCi1UaGlzIGNhbiBiZQotZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgCi08aT5leGNsdWRlc2ZpbGU8L2k+LAotYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlcyBvbiB0aGUgPGk+YWRkZmlsZXM8L2k+IGFuZCAKLTxpPm1lcmdlZmlsZXM8L2k+Ci1uZXN0ZWQgZWxlbWVudHMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+Ci1hdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuCi1UaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQotaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiBUaGUgcGF0dGVybnMgYXJlCi1yZWxhdGl2ZSB0byB0aGUgPGk+YmFzZTwvaT4gZGlyZWN0b3J5LjwvcD4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGpsaW5rZWQuICBUaGlzIGNhbiBiZSBkb25lIHdpdGgKK3RoZSA8dmFyPmluY2x1ZGVzPC92YXI+LCA8dmFyPmluY2x1ZGVzZmlsZTwvdmFyPiwgPHZhcj5leGNsdWRlczwvdmFyPiwgPHZhcj5leGNsdWRlc2ZpbGU8L3Zhcj4sCithbmQgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlcyBvbiB0aGUgPGNvZGU+YWRkZmlsZXM8L2NvZGU+IGFuZCA8Y29kZT5tZXJnZWZpbGVzPC9jb2RlPgorbmVzdGVkIGVsZW1lbnRzLiBXaXRoIHRoZSA8dmFyPmluY2x1ZGVzPC92YXI+IG9yIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUKK2ZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuICBUaGUgPHZhcj5leGNsdWRlPC92YXI+CitvciA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzCithbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kIGZpbmFsbHkgd2l0aCB0aGUgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkKK3doZXRoZXIgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbgorb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCitpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiBUaGUgcGF0dGVybnMgYXJlIHJlbGF0aXZlIHRvCit0aGUgPGVtPmJhc2U8L2VtPiBkaXJlY3RvcnkuPC9wPgogCi0KLQotPGgzPlBhcmFtZXRlcnM6PC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgPHRyPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICA8L3RyPgogICAgPHRyPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPm91dGZpbGU8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwYXRoIG9mIHRoZSBvdXRwdXQgZmlsZS48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgIDx0ZD5vdXRmaWxlPC90ZD4KKyAgICAgPHRkPnRoZSBwYXRoIG9mIHRoZSBvdXRwdXQgZmlsZS48L3RkPgorICAgICA8dGQ+WWVzPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3M8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgb3Igbm90IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGNvbXByZXNzZWQuIAotPGk+dHJ1ZTwvaT4sCi0gICAgICAgICAgICAgICAgICAgICAgPGk+eWVzPC9pPiwgb3IgPGk+b248L2k+IHJlc3VsdCBpbiBjb21wcmVzc2VkIG91dHB1dC4KLSAgICAgICAgICAgICAgICAgICAgICBJZiBvbWl0dGVkLCBvdXRwdXQgd2lsbCBiZSB1bmNvbXByZXNzZWQgKGluZmxhdGVkKS48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgPHRkPmNvbXByZXNzPC90ZD4KKyAgICAgPHRkPndoZXRoZXIgb3Igbm90IHRoZSBvdXRwdXQgc2hvdWxkIGJlIGNvbXByZXNzZWQuIDxxPnRydWU8L3E+LCA8cT55ZXM8L3E+LCBvciA8cT5vbjwvcT4KKyAgICAgICByZXN1bHQgaW4gY29tcHJlc3NlZCBvdXRwdXQuPC90ZD4KKyAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB1bmNvbXByZXNzZWQgKGluZmxhdGVkKSBvdXRwdXQ8L3RkPgogICAgPC90cj4KICAgIDx0cj4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5tZXJnZWZpbGVzPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LCBpZiBwb3NzaWJsZS48L3RkPgotICAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkF0IGxlYXN0IG9uZSBvZiAKLW1lcmdlZmlsZXMgb3IgYWRkZmlsZXM8L3RkPgorICAgICA8dGQ+bWVyZ2VmaWxlczwvdGQ+CisgICAgIDx0ZD5maWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LCBpZiBwb3NzaWJsZS48L3RkPgorICAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZGZpbGVzPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlcyB0byBiZSBhZGRlZCB0byB0aGUgb3V0cHV0LjwvdGQ+CisgICAgIDx0ZD5hZGRmaWxlczwvdGQ+CisgICAgIDx0ZCBjbGFzcz0ibGVmdCI+ZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIG91dHB1dC48L3RkPgogICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxwPlRoZSBmb2xsb3dpbmcgd2lsbCBtZXJnZSB0aGUgZW50cmllcyBpbiBtZXJnZWZvby5qYXIgYW5kIG1lcmdlYmFyLmphciAKLWludG8gb3V0Lmphci4KLW1hYy5qYXIgYW5kIHBjLmphciB3aWxsIGJlIGFkZGVkIGFzIHNpbmdsZSBlbnRyaWVzIHRvIG91dC5qYXIuPC9wPgorPHA+VGhlIGZvbGxvd2luZyB3aWxsIG1lcmdlIHRoZSBlbnRyaWVzIGluIDxzYW1wPm1lcmdlZm9vLmphcjwvc2FtcD4gYW5kIDxzYW1wPm1lcmdlYmFyLmphcjwvc2FtcD4KK2ludG8gPHNhbXA+b3V0Lmphcjwvc2FtcD4uICA8c2FtcD5tYWMuamFyPC9zYW1wPiBhbmQgPHNhbXA+cGMuamFyPC9zYW1wPiB3aWxsIGJlIGFkZGVkIGFzIHNpbmdsZQorZW50cmllcyB0byA8c2FtcD5vdXQuamFyPC9zYW1wPi48L3A+CiA8cHJlPgogJmx0O2psaW5rIGNvbXByZXNzPSZxdW90O2ZhbHNlJnF1b3Q7IG91dGZpbGU9JnF1b3Q7b3V0LmphciZxdW90OyZndDsKICAgICZsdDttZXJnZWZpbGVzJmd0OwpAQCAtMTM0LDcgKzExNSw3IEBACiAmbHQ7L2psaW5rJmd0OwogPC9wcmU+CiAKLTxwPjxiPk5vbi1kZXByZWNhdGVkIGFsdGVybmF0aXZlIHRvIHRoZSBhYm92ZTo8L2I+PC9wPgorPHA+PHN0cm9uZz5Ob24tZGVwcmVjYXRlZCBhbHRlcm5hdGl2ZSB0byB0aGUgYWJvdmU6PC9zdHJvbmc+PC9wPgogPHByZT4KICZsdDtqYXIgY29tcHJlc3M9JnF1b3Q7ZmFsc2UmcXVvdDsgZGVzdGZpbGU9JnF1b3Q7b3V0LmphciZxdW90OyZndDsKICAgJmx0O3ppcGdyb3VwZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5kaXJ9JnF1b3Q7Jmd0OwpAQCAtMTQ4LDMwICsxMjksMjUgQEAKICZsdDsvamFyJmd0OwogPC9wcmU+CiAKLTxwPlN1cHBvc2UgdGhlIGZpbGUgZm9vLmphciBjb250YWlucyB0d28gZW50cmllczogYmFyLmNsYXNzIGFuZCAKLWJhcm5vbmUvbXlDbGFzcy56aXAuCi1TdXBwb3NlIHRoZSBwYXRoIGZvciBmaWxlIGZvby5qYXIgaXMgYnVpbGQvdGVtcGJ1aWxkL2Zvby5qYXIuIFRoZSAKLWZvbGxvd2luZyBleGFtcGxlCi13aWxsIHByb3ZpZGUgdGhlIGVudHJ5IHRlbXBidWlsZC9mb28uamFyIGluIHRoZSBvdXQuamFyLjwvcD4KKzxwPlN1cHBvc2UgdGhlIGZpbGUgPHNhbXA+Zm9vLmphcjwvc2FtcD4gY29udGFpbnMgdHdvIGVudHJpZXM6IDxzYW1wPmJhci5jbGFzczwvc2FtcD4KK2FuZCA8c2FtcD5iYXJub25lL215Q2xhc3MuemlwPC9zYW1wPi4gIFN1cHBvc2UgdGhlIHBhdGggZm9yIGZpbGUgPHNhbXA+Zm9vLmphcjwvc2FtcD4KK2lzIDxzYW1wPmJ1aWxkL3RlbXBidWlsZC9mb28uamFyPC9zYW1wPi4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHdpbGwgcHJvdmlkZSB0aGUKK2VudHJ5IDxzYW1wPnRlbXBidWlsZC9mb28uamFyPC9zYW1wPiBpbiB0aGUgPHNhbXA+b3V0Lmphcjwvc2FtcD4uPC9wPgogPHByZT4KICZsdDtqbGluayBjb21wcmVzcz0mcXVvdDtmYWxzZSZxdW90OyBvdXRmaWxlPSZxdW90O291dC5qYXImcXVvdDsmZ3Q7CiAgICAmbHQ7bWVyZ2VmaWxlcyZndDsKICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7YnVpbGQvdGVtcGJ1aWxkJnF1b3Q7LyZndDsKICAgICZsdDsvbWVyZ2VmaWxlcyZndDsKLSZsdDsvamxpbmsmZ3Q7Ci08L3ByZT4KKyZsdDsvamxpbmsmZ3Q7PC9wcmU+CiAKLTxwPkhvd2V2ZXIsIHRoZSBuZXh0IGV4YW1wbGUgd291bGQgcmVzdWx0IGluIHR3byB0b3AtbGV2ZWwgZW50cmllcyBpbiBvdXQuamFyLAotbmFtZWx5IGJhci5jbGFzcyBhbmQgYmFybm9uZS9teUNsYXNzLnppcDwvcD4KKzxwPkhvd2V2ZXIsIHRoZSBuZXh0IGV4YW1wbGUgd291bGQgcmVzdWx0IGluIHR3byB0b3AtbGV2ZWwgZW50cmllcyBpbiA8c2FtcD5vdXQuamFyPC9zYW1wPiwKK25hbWVseSA8c2FtcD5iYXIuY2xhc3M8L3NhbXA+IGFuZCA8c2FtcD5iYXJub25lL215Q2xhc3MuemlwPC9zYW1wPjwvcD4KIDxwcmU+CiAmbHQ7amxpbmsgY29tcHJlc3M9JnF1b3Q7ZmFsc2UmcXVvdDsgb3V0ZmlsZT0mcXVvdDtvdXQuamFyJnF1b3Q7Jmd0OwogICAgJmx0O21lcmdlZmlsZXMmZ3Q7CiAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90O2J1aWxkL3RlbXBidWlsZC9mb28uamFyJnF1b3Q7LyZndDsKICAgICZsdDsvbWVyZ2VmaWxlcyZndDsKLSZsdDsvamxpbmsmZ3Q7Ci08L3ByZT4KLQorJmx0Oy9qbGluayZndDs8L3ByZT4KIAogPC9ib2R5PgotCiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvam1vZC5odG1sIGIvbWFudWFsL1Rhc2tzL2ptb2QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU4YmNiCi0tLSAvZGV2L251bGwKKysrIGIvbWFudWFsL1Rhc2tzL2ptb2QuaHRtbApAQCAtMCwwICsxLDMzMiBAQAorPCFET0NUWVBFIGh0bWw+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgbGFuZz0iZW4iPgorCis8aGVhZD4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8dGl0bGU+Sm1vZCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMiBpZD0iam1vZCI+Sm1vZDwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjEwLjY8L2VtPjwvcD4KKworPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNyZWF0ZXMgYSBsaW5rYWJsZSBqbW9kIGZpbGUgZnJvbSBhIG1vZHVsYXIgamFyIGZpbGUsIGFuZCBvcHRpb25hbGx5IGZyb20KK290aGVyIGFwcGxpY2F0aW9uIGZpbGVzIHN1Y2ggYXMgbmF0aXZlIGxpYnJhcmllcyBhbmQgbGljZW5zZSBkb2N1bWVudHMuCitFcXVpdmFsZW50IHRvIHRoZSBKREsncworPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvdG9vbHMvam1vZC5odG1sIj5qbW9kPC9hPgordG9vbC48L3A+Cis8cD5SZXF1aXJlcyBKYXZhIDkgb3IgbGF0ZXIuPC9wPgorCis8aDM+UGFyYW1ldGVyczwvaDM+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmRlc3RGaWxlPC90ZD4KKyAgICA8dGQ+am1vZCBmaWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPkZpbGVzIHRvIGJlIHBsYWNlZCBpbiB0aGUgam1vZCBmaWxlLiAgVXN1YWxseSBhIHNpbmdsZSBtb2R1bGUuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+T25lIG9mIHRoZXNlIGlzIHJlcXVpcmVkLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGlzIHByZXNlbnQuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+RmlsZXMgdG8gYmUgcGxhY2VkIGluIHRoZSBqbW9kIGZpbGUsIGdpdmVuIGFzIGEKKyAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1vZHVsZXBhdGg8L3RkPgorICAgIDx0ZD5Mb2NhdGlvbnMgb2YgbW9kdWxlcyBvbiB3aGljaCBjbGFzc3BhdGggbW9kdWxlcyBkZXBlbmQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1vZHVsZXBhdGhyZWY8L3RkPgorICAgIDx0ZD5Mb2NhdGlvbnMgb2YgbW9kdWxlcyBvbiB3aGljaCBjbGFzc3BhdGggbW9kdWxlcyBkZXBlbmQsCisgICAgICAgIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWFuZHBhdGg8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBjb21tYW5kcyB0byBpbmNsdWRlIGluIGptb2QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbW1hbmRwYXRocmVmPC90ZD4KKyAgICA8dGQ+RGlyZWN0b3JpZXMgY29udGFpbmluZyBuYXRpdmUgY29tbWFuZHMgdG8gaW5jbHVkZSBpbiBqbW9kLAorICAgICAgICBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgorICAgICAgICB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhlYWRlcnBhdGg8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcyB0byBpbmNsdWRlIGluIGptb2QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhlYWRlcnBhdGhyZWY8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcyB0byBpbmNsdWRlIGluIGptb2QsCisgICAgICAgIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29uZmlncGF0aDwvdGQ+CisgICAgPHRkPkRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlci1lZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICAgIHRvIGluY2x1ZGUgaW4gam1vZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29uZmlncGF0aHJlZjwvdGQ+CisgICAgPHRkPkRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlci1lZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICAgIHRvIGluY2x1ZGUgaW4gam1vZCwKKyAgICAgICAgZ2l2ZW4gYXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KKyAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sZWdhbHBhdGg8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIGxlZ2FsIGxpY2Vuc2VzIGFuZCBub3RpY2VzIHRvIGluY2x1ZGUgaW4gam1vZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGVnYWxwYXRocmVmPC90ZD4KKyAgICA8dGQ+RGlyZWN0b3JpZXMgY29udGFpbmluZyBsZWdhbCBsaWNlbnNlcyBhbmQgbm90aWNlcyB0byBpbmNsdWRlIGluIGptb2QsCisgICAgICAgIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bmF0aXZlbGlicGF0aDwvdGQ+CisgICAgPHRkPkRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbmF0aXZlIGxpYnJhcmllcyB0byBpbmNsdWRlIGluIGptb2QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5hdGl2ZWxpYnBhdGhyZWY8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBsaWJyYXJpZXMgdG8gaW5jbHVkZSBpbiBqbW9kLAorICAgICAgICBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPgorICAgICAgICB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1hbnBhdGg8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG1hbiBwYWdlcyB0byBpbmNsdWRlIGluIGptb2QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1hbnBhdGhyZWY8L3RkPgorICAgIDx0ZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG1hbiBwYWdlcyB0byBpbmNsdWRlIGluIGptb2QsCisgICAgICAgIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+CisgICAgICAgIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmVyc2lvbjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sIj5Nb2R1bGUgdmVyc2lvbjwvYT4gb2Ygam1vZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bWFpbmNsYXNzPC90ZD4KKyAgICA8dGQ+Q2xhc3MgdGhhdCBhY3RzIGFzIGV4ZWN1dGFibGUgZW50cnkgcG9pbnQgb2YgbW9kdWxlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wbGF0Zm9ybTwvdGQ+CisgICAgPHRkPlRoZSB0YXJnZXQgcGxhdGZvcm0gZm9yIHRoZSBqbW9kLiAgVHlwaWNhbGx5IHRha2VzIHRoZSBmb3JtCisgICAgICAgIDx2YXI+T1M8L3Zhcj48Y29kZT4tPC9jb2RlPjx2YXI+YXJjaGl0ZWN0dXJlPC92YXI+LiAgQSBwYXJ0aWN1bGFyIEpESydzCisgICAgICAgIHBsYXRmb3JtIGNhbiBiZSBzZWVuIGJ5IHJ1bm5pbmcgYSBjb21tYW5kIGxpa2UKKyAgICAgICAgPHNhbXA+am1vZCBkZXNjcmliZSAkSkRLX0hPTUUvam1vZHMvamF2YS5iYXNlLmptb2QgfCBncmVwIC1pIHBsYXRmb3JtPC9zYW1wPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5oYXNoTW9kdWxlc1BhdHRlcm48L3RkPgorICAgIDx0ZD5SZWd1bGFyIGV4cHJlc3Npb24gZm9yIG5hbWVzIG9mIG1vZHVsZXMgaW4gdGhlIG1vZHVsZSBwYXRoCisgICAgICAgIHdoaWNoIGRlcGVuZCBvbiB0aGUgam1vZCBiZWluZyBjcmVhdGVkLCBhbmQgd2hpY2ggc2hvdWxkIGhhdmUKKyAgICAgICAgaGFzaGVzIGdlbmVyYXRlZCBmb3IgdGhlbSBhbmQgaW5jbHVkZWQgaW4gdGhlIG5ldyBqbW9kLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZXNvbHZlQnlEZWZhdWx0PC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGptb2Qgc2hvdWxkIGJlIG9uZSBvZgorICAgICAgICB0aGUgZGVmYXVsdCByZXNvbHZlZCBtb2R1bGVzIHdoZW4gaXQgaXMgaW4gYSBtb2R1bGUgcGF0aAorICAgICAgICBzZWFyY2hlZCBieSB0b29scyBhbmQgYXBwbGljYXRpb25zLjwvdGQ+CisgICAgPHRkPk5vLiAgRGVmYXVsdCBpcyB0cnVlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bW9kdWxlV2FybmluZ3M8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGVtaXQgd2FybmluZ3Mgd2hlbiByZXNvbHZpbmcgbW9kdWxlcyB3aGljaCBhcmUKKyAgICAgICAgbm90IHJlY29tbWVuZGVkIGZvciB1c2UuICBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb2YgbW9yZSBvZgorICAgICAgICB0aGUgZm9sbG93aW5nOgorICAgICAgICA8ZGw+CisgICAgICAgIDxkdD48Y29kZT5kZXByZWNhdGVkPC9jb2RlPjwvZHQ+CisgICAgICAgIDxkZD5XYXJuIGlmIG1vZHVsZSBpcyBkZXByZWNhdGVkPC9kZD4KKyAgICAgICAgPGR0Pjxjb2RlPmxlYXZpbmc8L2NvZGU+PC9kdD4KKyAgICAgICAgPGRkPldhcm4gaWYgbW9kdWxlIGlzIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWw8L2RkPgorICAgICAgICA8ZHQ+PGNvZGU+aW5jdWJhdGluZzwvY29kZT48L2R0PgorICAgICAgICA8ZGQ+V2FybiBpZiBtb2R1bGUgaXMgYW4gaW5jdWJhdGluZyAobm90IHlldCBvZmZpY2lhbCkgbW9kdWxlPC9kZD4KKyAgICAgICAgPC9kbD4KKyAgICA8L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdCBpcyBubyB3YXJuaW5ncy48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+Y2xhc3NwYXRoLCBtb2R1bGVwYXRoLCBjb21tYW5kcGF0aCwgaGVhZGVycGF0aCwgY29uZmlncGF0aCwgbGVnYWxwYXRoLCBuYXRpdmVsaWJwYXRoLCBtYW5wYXRoPC9oND4KKzxwPlRoZQorICAgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiwKKyAgIDxjb2RlPm1vZHVsZXBhdGg8L2NvZGU+LAorICAgPGNvZGU+Y29tbWFuZHBhdGg8L2NvZGU+LAorICAgPGNvZGU+aGVhZGVycGF0aDwvY29kZT4sCisgICA8Y29kZT5jb25maWdwYXRoPC9jb2RlPiwKKyAgIDxjb2RlPmxlZ2FscGF0aDwvY29kZT4sCisgICA8Y29kZT5uYXRpdmVsaWJwYXRoPC9jb2RlPiwgYW5kCisgICA8Y29kZT5tYW5wYXRoPC9jb2RlPgorICAgYXR0cmlidXRlcyBhcmUgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlczwvYT4KKyAgIGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIG5lc3RlZAorICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LAorICAgPGNvZGU+Jmx0O21vZHVsZXBhdGgmZ3Q7PC9jb2RlPiwKKyAgIDxjb2RlPiZsdDtjb21tYW5kcGF0aCZndDs8L2NvZGU+LAorICAgPGNvZGU+Jmx0O2hlYWRlcnBhdGgmZ3Q7PC9jb2RlPiwKKyAgIDxjb2RlPiZsdDtjb25maWdwYXRoJmd0OzwvY29kZT4sCisgICA8Y29kZT4mbHQ7bGVnYWxwYXRoJmd0OzwvY29kZT4sCisgICA8Y29kZT4mbHQ7bmF0aXZlbGlicGF0aCZndDs8L2NvZGU+LCBhbmQKKyAgIDxjb2RlPiZsdDttYW5wYXRoJmd0OzwvY29kZT4KKyAgIGVsZW1lbnRzLCByZXNwZWN0aXZlbHkuPC9wPgorCis8aDQ+dmVyc2lvbjwvaDQ+Cis8cD5GaW5lLWdyYWluZWQgYWx0ZXJuYXRpdmUgdG8gdGhlIDxjb2RlPnZlcnNpb248L2NvZGU+IGF0dHJpYnV0ZS4gIFRoaXMKK25lc3RlZCBlbGVtZW50IGhhcyB0aGVzZSBhdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bnVtYmVyPC90ZD4KKyAgICA8dGQ+UHJpbWFyeSB2ZXJzaW9uIG51bWJlci4gIENhbiBiZSBhbnkgdGV4dCwgYXMgbG9uZyBhcyBpdCBkb2VzIG5vdAorICAgICAgICBjb250YWluIGEgaHlwaGVuICg8Y29kZT4tPC9jb2RlPikgb3IgcGx1cyAoPGNvZGU+KzwvY29kZT4pLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cHJlUmVsZWFzZTwvdGQ+CisgICAgPHRkPlByZS1yZWxlYXNlIHZlcnNpb24uICBDYW4gYmUgYW55IHRleHQsIGFzIGxvbmcgYXMgaXQgZG9lcyBub3QKKyAgICAgICAgY29udGFpbiBhIHBsdXMgKDxjb2RlPis8L2NvZGU+KS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+YnVpbGQ8L3RkPgorICAgIDx0ZD5CdWlsZCB2ZXJzaW9uLiAgQ2FuIGJlIGFueSB0ZXh0LgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5TZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sIj5Nb2R1bGVEZXNjcmlwdG9yLlZlcnNpb24gZG9jdW1lbnRhdGlvbjwvYT4KK2ZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIG1lYW5pbmcgb2YgZWFjaCB2ZXJzaW9uIGNvbXBvbmVudC48L3A+CisKKzxoND5tb2R1bGVXYXJuaW5nPC9oND4KKzxwPkxpa2UgdGhlIDxjb2RlPm1vZHVsZVdhcm5pbmdzPC9jb2RlPiBhdHRyaWJ1dGUsIGJ1dCBvbmx5IHNwZWNpZmllcyBhIHNpbmdsZQorYmFzaXMgZm9yIGVtaXR0aW5nIHdhcm5pbmdzLiAgVGhpcyBjaGlsZCBlbGVtZW50IG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMsCit0byBzcGVjaWZ5IG11bHRpcGxlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2FybmluZ3Mgc2hvdWxkIGJlIGVtaXR0ZWQgYnkgdGhlCitqbW9kIHRvb2wuPC9wPgorCis8cD5BdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVhc29uPC90ZD4KKyAgICA8dGQ+Q29uZGl0aW9uIHdoaWNoIHdpbGwgY2F1c2Ugam1vZCB0b29sIHRvIGVtaXQgd2FybmluZ3MuICBPbmUgb2Y6CisgICAgICAgIDxkbD4KKyAgICAgICAgPGR0Pjxjb2RlPmRlcHJlY2F0ZWQ8L2NvZGU+PC9kdD4KKyAgICAgICAgPGRkPldhcm4gaWYgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ8L2RkPgorICAgICAgICA8ZHQ+PGNvZGU+bGVhdmluZzwvY29kZT48L2R0PgorICAgICAgICA8ZGQ+V2FybiBpZiBtb2R1bGUgaXMgZGVwcmVjYXRlZCBmb3IgcmVtb3ZhbDwvZGQ+CisgICAgICAgIDxkdD48Y29kZT5pbmN1YmF0aW5nPC9jb2RlPjwvZHQ+CisgICAgICAgIDxkZD5XYXJuIGlmIG1vZHVsZSBpcyBhbiBpbmN1YmF0aW5nIChub3QgeWV0IG9mZmljaWFsKSBtb2R1bGU8L2RkPgorICAgICAgICA8L2RsPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGgzPkV4YW1wbGVzPC9oMz4KKworPGg0PkJhc2ljIGptb2Q8L2g0PgorPHA+Q3JlYXRlIGEgam1vZCBmcm9tIGEgc2luZ2xlIG1vZHVsYXIgamFyIGZpbGU6PC9wPgorPHByZT4KKyZsdDtqbW9kIGRlc3RmaWxlPSJNeUFwcC5qbW9kIiBjbGFzc3BhdGg9ImJ1aWxkL215YXBwLmphciIvJmd0OworPC9wcmU+CisKKzxoND5XaXRoIGRlcGVuZGVuY2llczwvaDQ+Cis8cD5DcmVhdGUgYSBqbW9kIGZyb20gYSBtb2R1bGFyIGphciBmaWxlIHdoaWNoIGRlcGVuZHMgb24gYW5vdGhlciBtb2R1bGU6PC9wPgorPHByZT4KKyZsdDtqbW9kIGRlc3RmaWxlPSJNeUFwcC5qbW9kIiBjbGFzc3BhdGg9ImJ1aWxkL215YXBwLmphciImZ3Q7CisgICAgJmx0O21vZHVsZXBhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGlicy90aGlyZHBhcnR5dXRpbHMuamFyIi8mZ3Q7CisgICAgJmx0Oy9tb2R1bGVwYXRoJmd0OworJmx0Oy9qbW9kJmd0OworPC9wcmU+CisKKzxoND5XaXRoIHZlcnNpb248L2g0PgorPHA+Q3JlYXRlIGEgam1vZCB3aXRoIGEgbW9kdWxlIHZlcnNpb246PC9wPgorPHByZT4KKyZsdDtqbW9kIGRlc3RmaWxlPSJNeUFwcC5qbW9kIiBjbGFzc3BhdGg9ImJ1aWxkL215YXBwLmphciIKKyAgICAgIHZlcnNpb249IjEuMi4xLWVhKzI5Ii8mZ3Q7Cis8L3ByZT4KKworPHA+Q3JlYXRlIGEgdmVyc2lvbmVkIGptb2QgZnJvbSBtb2R1bGUgdmVyc2lvbiBjb21wb25lbnRzOjwvcD4KKzxwcmU+CismbHQ7cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjEuMi4xIi8mZ3Q7CismbHQ7YnVpbGRudW1iZXIvJmd0OworJmx0O2xvYWRmaWxlIHByb3BlcnR5PSJidWlsZG51bSIgc3JjRmlsZT0iYnVpbGQubnVtYmVyIi8mZ3Q7CismbHQ7am1vZCBkZXN0ZmlsZT0iTXlBcHAuam1vZCIgY2xhc3NwYXRoPSJidWlsZC9teWFwcC5qYXIiJmd0OworICAgICZsdDt2ZXJzaW9uIG51bWJlcj0iJHt2ZXJzaW9ufSIgYnVpbGQ9IiR7YnVpbGRudW19Ii8mZ3Q7CismbHQ7L2ptb2QmZ3Q7Cis8L3ByZT4KKworPGg0Pk1haW4gY2xhc3M8L2g0PgorPHA+Q3JlYXRlIGEgam1vZCB3aXRoIGEgbWFpbiBjbGFzczo8L3A+Cis8cHJlPgorJmx0O2ptb2QgZGVzdGZpbGU9Ik15QXBwLmptb2QiIGNsYXNzcGF0aD0iYnVpbGQvbXlhcHAuamFyIgorICAgICAgbWFpbmNsYXNzPSJjb20uZXhhbXBsZS5teWFwcC5NYWluV2luZG93Ii8mZ3Q7Cis8L3ByZT4KKworPGg0PlRhcmdldCBwbGF0Zm9ybTwvaDQ+Cis8cD5DcmVhdGUgYSBqbW9kIGZvciBhIHNwZWNpZmljIHBsYXRmb3JtLCBwb3NzaWJseSBkaWZmZXJlbnQgZnJvbSB0aGUKK2N1cnJlbnQgcGxhdGZvcm06PC9wPgorCis8cHJlPgorJmx0O2ptb2QgZGVzdGZpbGU9Ik15QXBwLmptb2QiIGNsYXNzcGF0aD0iYnVpbGQvbXlhcHAuamFyIgorICAgICAgcGxhdGZvcm09IndpbmRvd3MtYW1kNjQiLyZndDsKKzwvcHJlPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvanNwYy5odG1sIGIvbWFudWFsL1Rhc2tzL2pzcGMuaHRtbAppbmRleCA4ODM2MTg2Li5iYjA0MGU2IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvanNwYy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9qc3BjLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyNDIgKzE1LDIwOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SlNQQyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJqc3BjIj5qc3BjIChkZXByZWNhdGVkKTwvYT48L2gyPgorPGgyIGlkPSJqc3BjIj5qc3BjPC9oMj4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+SWYgeW91IHVzZSB0aGlzIHRhc2sgd2l0aCBUb21jYXQncyBKYXNwZXIgSlNQIGNvbXBpbGVyLCB5b3Ugc2hvdWxkIHNlcmlvdXNseSBjb25zaWRlciB1c2luZwordGhlIHRhc2sgc2hpcHBpbmcgd2l0aCBUb21jYXQgaW5zdGVhZC48L2VtPiAgVGhpcyB0YXNrIGlzIG9ubHkgdGVzdGVkIGFnYWluc3QgVG9tY2F0IDQueC4gVGhlcmUgYXJlCitrbm93biBwcm9ibGVtcyB3aXRoIFRvbWNhdCA1LnggdGhhdCB3b24ndCBnZXQgZml4ZWQgaW4gQW50LCBwbGVhc2UgdXNlIFRvbWNhdCdzIDxjb2RlPmpzcGM8L2NvZGU+Cit0YXNrIGluc3RlYWQuPGJyLz4gIEluc3RlYWQgb2YgcmVseWluZyBvbiBjb250YWluZXItc3BlY2lmaWMgSlNQIGNvbXBpbGVycyB3ZSBzdWdnZXN0IGRlcGxveWluZyB0aGUKK3JhdyBmaWxlcyAoPHNhbXA+Ki5qc3A8L3NhbXA+KSBhbmQgdXNlIHRoZSBjb250YWluZXIgYnVpbGQtaW4gZnVuY3Rpb25zOiBhZnRlciBkZXBsb3lpbmcgcnVuIGEgdGVzdAorc3VpdGUgKGUuZy4gd2l0aCA8YSBocmVmPSJodHRwczovL2F0dGljLmFwYWNoZS5vcmcvcHJvamVjdHMvamFrYXJ0YS1jYWN0dXMuaHRtbCIKK3RhcmdldD0iX3RvcCI+Q2FjdHVzPC9hPiBvciA8YSBocmVmPSJodHRwOi8vaHR0cHVuaXQuc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5IdHRwVW5pdDwvYT4pCithZ2FpbnN0IHRoZSBkZXBsb3llZCB3ZWIgYXBwbGljYXRpb24uIFNvIHlvdSdsbCBnZXQgdGhlIHRlc3QgcmVzdWx0IDxlbT5hbmQ8L2VtPiB0aGUgY29tcGlsZWQKK0pTUHMuPC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+IEFwYWNoZSBBbnQgdGFzayB0byBydW4gdGhlIEpTUCBjb21waWxlciBhbmQgdHVybiBKU1AgcGFnZXMgaW50byBKYXZhIHNvdXJjZS4KKzxwPkFwYWNoZSBBbnQgdGFzayB0byBydW4gdGhlIEpTUCBjb21waWxlciBhbmQgdHVybiBKU1AgcGFnZXMgaW50byBKYXZhIHNvdXJjZSBmaWxlcy48L3A+CiAKLTxwPjxiPkRlcHJlY2F0ZWQ8L2I+IGlmIHlvdSB1c2UgdGhpcyB0YXNrIHdpdGggVG9tY2F0J3MgSmFzcGVyIEpTUAotY29tcGlsZXIsIHlvdSBzaG91bGQgc2VyaW91c2x5IGNvbnNpZGVyIHVzaW5nIHRoZSB0YXNrIHNoaXBwaW5nIHdpdGgKLVRvbWNhdCBpbnN0ZWFkLiAgVGhpcyB0YXNrIGlzIG9ubHkgdGVzdGVkIGFnYWluc3QgVG9tY2F0IDQueC4gVGhlcmUKLWFyZSBrbm93biBwcm9ibGVtcyB3aXRoIFRvbWNhdCA1LnggdGhhdCB3b24ndCBnZXQgZml4ZWQgaW4gQW50LCBwbGVhc2UKLXVzZSBUb21jYXQncyBqc3BjIHRhc2sgaW5zdGVhZC48YnIvPgotSW5zdGVhZCBvZiByZWx5aW5nIG9uIGNvbnRhaW5lciBzcGVjaWZpYyBKU1AtY29tcGlsZXJzIHdlIHN1Z2dlc3QgZGVwbG95aW5nIAotdGhlIHJhdyBmaWxlcyAoKi5qc3ApIGFuZCB1c2UgdGhlIGNvbnRhaW5lciBidWlsZC1pbiBmdW5jdGlvbnM6IGFmdGVyIGRlcGxveWluZyBydW4KLWEgdGVzdCBzdWl0ZSAoZS5nLiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9hdHRpYy5hcGFjaGUub3JnL3Byb2plY3RzL2pha2FydGEtY2FjdHVzLmh0bWwiPkNhY3R1czwvYT4gb3IgCi08YSBocmVmPSJodHRwOi8vaHR0cHVuaXQuc291cmNlZm9yZ2UubmV0LyI+SHR0cFVuaXQ8L2E+KSBhZ2FpbnN0IHRoZSBkZXBsb3llZCB3ZWIgCi1hcHBsaWNhdGlvbi4gU28geW91J2xsIGdldCB0aGUgdGVzdCByZXN1bHQgPGk+YW5kPC9pPiB0aGUgY29tcGlsZWQgSlNQcy4KLTwvcD4KKzxwPlRoaXMgdGFzayBjYW4gYmUgdXNlZCB0byBwcmVjb21waWxlIEpTUCBwYWdlcyBmb3IgZmFzdCBpbml0aWFsIGludm9jYXRpb24gb2YgSlNQIHBhZ2VzLAorZGVwbG95bWVudCBvbiBhIHNlcnZlciB3aXRob3V0IHRoZSBmdWxsIEpESyBpbnN0YWxsZWQsIG9yIHNpbXBseSB0byBzeW50YXggY2hlY2sgdGhlIHBhZ2VzIHdpdGhvdXQKK2RlcGxveWluZyB0aGVtLiAgSW4gbW9zdCBjYXNlcywgYSA8Y29kZT5qYXZhYzwvY29kZT4gdGFzayBpcyB1c3VhbGx5IHRoZSBuZXh0IHN0YWdlIGluIHRoZSBidWlsZAorcHJvY2Vzcy4gIFRoZSB0YXNrIGRvZXMgYmFzaWMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24mbWRhc2g7dGhpcworY2hlY2tpbmcgY29tcGFyZXMgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0aW1lc3RhbXBzLCBhbmQgZG9lcyBub3QgZmFjdG9yIGluIGNsYXNzIG9yIHRhZ2xpYgorZGVwZW5kZW5jaWVzLCBvciA8Y29kZT4mbHQ7anNwOmluY2x1ZGUmZ3Q7PC9jb2RlPiByZWZlcmVuY2VzLjwvcD4KIAotPHA+Cis8cD5CeSBkZWZhdWx0IHRoZSB0YXNrIHVzZXMgdGhlIEphc3BlciBKU1AgY29tcGlsZXIuIFRoaXMgbWVhbnMgdGhlIHRhc2sKK25lZWRzIDxzYW1wPmphc3Blci5qYXI8L3NhbXA+IGFuZCA8c2FtcD5qYXNwZXItcnVudGltZS5qYXI8L3NhbXA+LCB3aGljaCBjb21lIHdpdGggYnVpbGRzIG9mIFRvbWNhdAorNC9DYXRhbGluYSBmcm9tIHRoZSA8YSBocmVmPSJodHRwczovL3RvbWNhdC5hcGFjaGUub3JnLyIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUgVG9tY2F0IHByb2plY3Q8L2E+LAorYW5kIGFueSBvdGhlciBqYXIgZmlsZXMgd2hpY2ggbWF5IGJlIG5lZWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgKGl0IGNoYW5nZXMpLjwvcD4KIAotVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHByZWNvbXBpbGUgSlNQIHBhZ2VzIGZvciBmYXN0IGluaXRpYWwgaW52b2NhdGlvbgotb2YgSlNQIHBhZ2VzLCBkZXBsb3ltZW50IG9uIGEgc2VydmVyIHdpdGhvdXQgdGhlIGZ1bGwgSkRLIGluc3RhbGxlZCwKLW9yIHNpbXBseSB0byBzeW50YXggY2hlY2sgdGhlIHBhZ2VzIHdpdGhvdXQgZGVwbG95aW5nIHRoZW0uCi1JbiBtb3N0IGNhc2VzLCBhIGphdmFjIHRhc2sgaXMgdXN1YWxseSB0aGUgbmV4dCBzdGFnZSBpbiB0aGUgYnVpbGQgcHJvY2Vzcy4KLVRoZSB0YXNrIGRvZXMgYmFzaWMgZGVwZW5kZW5jeSBjaGVja2luZyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlY29tcGlsYXRpb24gLXRoaXMKLWNoZWNraW5nIGNvbXBhcmVzIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdGltZXN0YW1wcywgYW5kIGRvZXMgbm90IGZhY3RvcgotaW4gY2xhc3Mgb3IgdGFnbGliIGRlcGVuZGVuY2llcywgb3IgPGNvZGU+Jmx0O2pzcDppbmNsdWRlJmd0OzwvY29kZT4gcmVmZXJlbmNlcy4KKzxwPldlIHJlY29tbWVuZCAoaW4gTWFyY2ggMjAwMykgVG9tY2F0IHZlcnNpb24gNC4xLnggZm9yIHRoZSBtb3N0IHJvYnVzdCB2ZXJzaW9uIG9mIEphc3Blci48L3A+CiAKLTxwPgotQnkgZGVmYXVsdCB0aGUgdGFzayB1c2VzIHRoZSBKYXNwZXIgSlNQIGNvbXBpbGVyLiBUaGlzCi1tZWFucyB0aGUgdGFzayBuZWVkcyBqYXNwZXIuamFyIGFuZCBqYXNwZXItcnVudGltZS5qYXIsIHdoaWNoIGNvbWUgd2l0aAotYnVpbGRzIG9mIFRvbWNhdCA0L0NhdGFsaW5hIGZyb20gdGhlCi08YSBocmVmPSJodHRwOi8vdG9tY2F0LmFwYWNoZS5vcmcvIj5BcGFjaGUgVG9tY2F0IHByb2plY3Q8L2E+LAotYW5kIGFueSBvdGhlciBKYXIgZmlsZXMgd2hpY2ggbWF5IGJlIG5lZWRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgKGl0IGNoYW5nZXMpCi0KLVdlIHJlY29tbWVuZCAoaW4gTWFyY2ggMjAwMykgVG9tY2F0IHZlcnNpb24gNC4xLnggZm9yIHRoZSBtb3N0IHJvYnVzdCB2ZXJzaW9uCi1vZiBKYXNwZXIuCi0KLTxwPgotVGhlcmUgYXJlIG1hbnkgbGltaXRhdGlvbnMgd2l0aCB0aGlzIHRhc2sgd2hpY2ggcGFydGlhbGx5IHN0ZW0gZnJvbSB0aGUKLW1hbnkgdmVyc2lvbnMgb2YgSmFzcGVyLCBvdGhlcnMgZnJvbSBpbXBsZW1lbnRhdGlvbiAnaXNzdWVzJyBpbiB0aGUgdGFzawotKGkuZS4gbm9ib2R5J3Mgd2lsbGluZ25lc3MgdG8gcmFkaWNhbGx5IGNoYW5nZSBsYXJnZSBiaXRzIG9mIGl0IHRvIHdvcmsKLWFyb3VuZCBqYXNwZXIpLiBCZWNhdXNlIG9mIHRoaXMgYW5kIHRoZSBmYWN0IHRoYXQgSlNQIHBhZ2VzIGRvIG5vdCBoYXZlCi10byBiZSBwb3J0YWJsZSBhY3Jvc3MgaW1wbGVtZW50YXRpb25zIC1vciB2ZXJzaW9ucyBvZiBpbXBsZW1lbnRhdGlvbnMtCi10aGlzIHRhc2sgaXMgYmV0dGVyIHVzZWQgZm9yIHZhbGlkYXRpbmcgSlNQIHBhZ2VzIGJlZm9yZSBkZXBsb3ltZW50LAotcmF0aGVyIHRoYW4gcHJlY29tcGlsaW5nIHRoZW0uIEZvciB0aGF0LCBqdXN0IGRlcGxveSBhbmQgcnVuIHlvdXIgaHR0cHVuaXQKLWp1bml0IHRlc3RzIGFmdGVyIGRlcGxveW1lbnQgdG8gY29tcGlsZSBhbmQgdGVzdCB5b3VyIHBhZ2VzLCBhbGwgaW4gb25lCi1nby4KLSAKLTwvcD4KKzxwPlRoZXJlIGFyZSBtYW55IGxpbWl0YXRpb25zIHdpdGggdGhpcyB0YXNrIHdoaWNoIHBhcnRpYWxseSBzdGVtIGZyb20gdGhlIG1hbnkgdmVyc2lvbnMgb2YgSmFzcGVyLAorb3RoZXJzIGZyb20gaW1wbGVtZW50YXRpb24gJ2lzc3VlcycgaW4gdGhlIHRhc2sgKGkuZS4gbm9ib2R5J3Mgd2lsbGluZ25lc3MgdG8gcmFkaWNhbGx5IGNoYW5nZSBsYXJnZQorYml0cyBvZiBpdCB0byB3b3JrIGFyb3VuZCBKYXNwZXIpLiBCZWNhdXNlIG9mIHRoaXMgYW5kIHRoZSBmYWN0IHRoYXQgSlNQIHBhZ2VzIGRvIG5vdCBoYXZlIHRvIGJlCitwb3J0YWJsZSBhY3Jvc3MgaW1wbGVtZW50YXRpb25zJm1kYXNoO29yIHZlcnNpb25zIG9mIGltcGxlbWVudGF0aW9ucyZtZGFzaDt0aGlzIHRhc2sgaXMgYmV0dGVyIHVzZWQKK2ZvciB2YWxpZGF0aW5nIEpTUCBwYWdlcyBiZWZvcmUgZGVwbG95bWVudCwgcmF0aGVyIHRoYW4gcHJlY29tcGlsaW5nIHRoZW0uIEZvciB0aGUgbGF0dGVyLCBqdXN0CitkZXBsb3kgYW5kIHJ1biB5b3VyIEh0dHBVbml0IEpVbml0IHRlc3RzIGFmdGVyIGRlcGxveW1lbnQgdG8gY29tcGlsZSBhbmQgdGVzdCB5b3VyIHBhZ2VzLCBhbGwgaW4gb25lCitnby48L3A+CiAKIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotVGhlIFRhc2sgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8cD4KKzxwPlRoZSBUYXNrIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hlcmUgdG8gcGxhY2UgdGhlIGdlbmVyYXRlZCBmaWxlcy4gVGhleSBhcmUgbG9jYXRlZAotICAgIHVuZGVyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3RkaXI8L3RkPgorICAgIDx0ZD5XaGVyZSB0byBwbGFjZSB0aGUgZ2VuZXJhdGVkIGZpbGVzLiBUaGV5IGFyZSBsb2NhdGVkIHVuZGVyIGhlcmUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbgorICAgICAgcGFja2FnZSBuYW1lLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSB0byBsb29rIGZvciBzb3VyY2UganNwIGZpbGVzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zcmNkaXI8L3RkPgorICAgIDx0ZD5XaGVyZSB0byBsb29rIGZvciBzb3VyY2UgSlNQIGZpbGVzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZlcmJvc2l0eSBpbnRlZ2VyIHRvIHBhc3MgdG8gdGhlIGNvbXBpbGVyLiBEZWZhdWx0PSIwIjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5UaGUgdmVyYm9zaXR5IGludGVnZXIgdG8gcGFzcyB0byB0aGUgY29tcGlsZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+MDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYWNrYWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIGRlc3RpbmF0aW9uIHBhY2thZ2UgZm9yIGdlbmVyYXRlZCBqYXZhCi0gICAgY2xhc3Nlcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wYWNrYWdlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgZGVzdGluYXRpb24gcGFja2FnZSBmb3IgZ2VuZXJhdGVkIEphdmEgY2xhc3Nlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzIG5hbWUgb2YgYSBKU1AgY29tcGlsZXIgYWRhcHRlciwKLSAgICBzdWNoIGFzICJqYXNwZXIiIG9yICJqYXNwZXI0MSI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLWRlZmF1bHRzIHRvICJqYXNwZXIiPC90ZD4KKyAgICA8dGQ+Y29tcGlsZXI8L3RkPgorICAgIDx0ZD5jbGFzcyBuYW1lIG9mIGEgSlNQIGNvbXBpbGVyIGFkYXB0ZXIsIHN1Y2ggYXMgPHE+amFzcGVyPC9xPiBvciA8cT5qYXNwZXI0MTwvcT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+amFzcGVyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmllcGx1Z2luPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkphdmEgUGx1Z2luIGNsYXNzaWQgZm9yIEludGVybmV0IEV4cGxvcmVyLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmllcGx1Z2luPC90ZD4KKyAgICA8dGQ+SmF2YSBQbHVnaW4gY2xhc3NpZCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXBwZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+KGJvb2xlYW4pIEdlbmVyYXRlIHNlcGFyYXRlIHdyaXRlKCkgY2FsbHMgZm9yIGVhY2ggSFRNTAotICAgIGxpbmUgaW4gdGhlIEpTUC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYXBwZWQ8L3RkPgorICAgIDx0ZD4oYm9vbGVhbikgR2VuZXJhdGUgc2VwYXJhdGUgPGNvZGU+d3JpdGUoKTwvY29kZT4gY2FsbHMgZm9yIGVhY2ggSFRNTCBsaW5lIGluIHRoZSBKU1AuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgdG8gcnVuIHRoZSBqc3AgY29tcGlsZXIuCi0gICAgVGhpcyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQKLSAgICBieSB0aGUgbmVzdGVkIGVsZW1lbnQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPgotICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aDwvYT4pLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgYnV0IGl0IHNlZW1zIHRvIHdvcmsgYmV0dGVyIHdoZW4gdXNlZDwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlIHRvIHJ1biB0aGUgSlNQIGNvbXBpbGVyLjwvdGQ+CisgICAgPHRkPk5vLCBidXQgaXQgc2VlbXMgdG8gd29yayBiZXR0ZXIgd2hlbiB1c2VkOyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgdGhlIG5lc3RlZAorICAgICAgZWxlbWVudCA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPjxjb2RlPmNsYXNzcGF0aDwvY29kZT48L2E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5SZWZlcmVuY2U8L2E+LiBBcwotICAgIHBlciA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+QSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPlJlZmVyZW5jZTwvYT4uIEFzIHBlciA8dmFyPmNsYXNzcGF0aDwvdmFyPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZsYWcgdG8gY29udHJvbCBhY3Rpb24gb24gY29tcGlsZSBmYWlsdXJlczogZGVmYXVsdD15ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPmZsYWcgdG8gY29udHJvbCBhY3Rpb24gb24gY29tcGlsZSBmYWlsdXJlcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXJpYmFzZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICBUaGUgdXJpIGNvbnRleHQgb2YgcmVsYXRpdmUgVVJJCi0gICAgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLiBJZiBpdCBkb2VzIG5vdAotICAgIGV4aXN0IHRoZW4gaXQgaXMgZGVyaXZlZCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZQotICAgIHJlbGF0aXZlIHRvIHRoZSBkZWNsYXJlZCBvciBkZXJpdmVkIHZhbHVlIG9mIDx0dD51cmlyb290LjwvdHQ+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dXJpYmFzZTwvdGQ+CisgICAgPHRkPlRoZSBjb250ZXh0IG9mIHJlbGF0aXZlIFVSSSByZWZlcmVuY2VzIGluIEpTUC48L3RkPgorICAgIDx0ZD5ObzsgZGVyaXZlZCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IgZGVyaXZlZCB2YWx1ZQorICAgICAgb2YgPHZhcj51cmlyb290PC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXJpcm9vdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICBUaGUgcm9vdCBkaXJlY3RvcnkgdGhhdCB1cmkgZmlsZXMgc2hvdWxkIGJlIHJlc29sdmVkCi0gICAgYWdhaW5zdC4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51cmlyb290PC90ZD4KKyAgICA8dGQ+VGhlIHJvb3QgZGlyZWN0b3J5IHRoYXQgVVJJcyBzaG91bGQgYmUgcmVzb2x2ZWQgYWdhaW5zdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgIENsYXNzIG5hbWUgb2YganNwIGNvbXBpbGVyIGFkYXB0ZXIgdG8gdXNlLiAgRGVmYXVsdHMgdG8KLSAgICB0aGUgc3RhbmRhcmQgYWRhcHRlciBmb3IgSmFzcGVyLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbXBpbGVyPC90ZD4KKyAgICA8dGQ+Q2xhc3MgbmFtZSBvZiBKU1AgY29tcGlsZXIgYWRhcHRlciB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSBzdGFuZGFyZCBhZGFwdGVyIGZvciBKYXNwZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcmNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHVzZWQgdG8gZmluZCB0aGUgY29tcGlsZXIgYWRhcHRlciBzcGVjaWZpZWQKLSAgICBieSB0aGUgPGNvZGU+Y29tcGlsZXI8L2NvZGU+IGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jb21waWxlcmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdXNlZCB0byBmaW5kIHRoZSBjb21waWxlciBhZGFwdGVyIHNwZWNpZmllZCBieSB0aGUgPHZhcj5jb21waWxlcjwvdmFyPgorICAgICAgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2ViaW5jPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBmcmFjdGlvbiBvZiB3ZWIueG1sIHRoYXQgbGlzdHMgc2VydmxldHMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgPC90cj4gICAgCisgICAgPHRkPndlYmluYzwvdGQ+CisgICAgPHRkPk91dHB1dCBmaWxlIG5hbWUgZm9yIHRoZSBmcmFjdGlvbiBvZiA8c2FtcD53ZWIueG1sPC9zYW1wPiB0aGF0IGxpc3RzIHNlcnZsZXRzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2VieG1sPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbGUgbmFtZSBmb3Igd2ViLnhtbCB0byBiZSBnZW5lcmF0ZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICA8L3RyPiAgCisgICAgPHRkPndlYnhtbDwvdGQ+CisgICAgPHRkPkZpbGUgbmFtZSBmb3IgPHNhbXA+d2ViLnhtbDwvc2FtcD4gdG8gYmUgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotICA8L3RhYmxlPgorPHA+VGhlIDx2YXI+bWFwcGVkPC92YXI+IG9wdGlvbiB3aWxsLCBpZiBzZXQgdG8gPHE+dHJ1ZTwvcT4sIHNwbGl0IHRoZSBKU1AgdGV4dCBjb250ZW50IGludG8gYSBvbmUKK2xpbmUgcGVyIGNhbGwgZm9ybWF0LiAgVGhlcmUgYXJlIGNvbW1lbnRzIGFib3ZlIGFuZCBiZWxvdyB0aGUgbWFwcGVkIHdyaXRlIGNhbGxzIHRvIGxvY2FsaXplIHdoZXJlCitpbiB0aGUgSlNQIGZpbGUgZWFjaCBsaW5lIG9mIHRleHQgY29tZXMgZnJvbS4gIFRoaXMgY2FuIGxlYWQgdG8gYSBtaW5vciBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiAoYnV0CitpdCBpcyBib3VuZCBieSBhIGxpbmVhciBjb21wbGV4aXR5KS4gIFdpdGhvdXQgdGhpcyBvcHRpb24gYWxsIGFkamFjZW50IHdyaXRlcyBhcmUgY29uY2F0ZW5hdGVkIGludG8KK2Egc2luZ2xlIHdyaXRlLjwvcD4KIAotPFA+VGhlIDx0dD5tYXBwZWQ8L3R0PiBvcHRpb24gd2lsbCwgaWYgc2V0IHRvIHRydWUsIHNwbGl0IHRoZSBKU1AgdGV4dCBjb250ZW50IGludG8gYQotb25lIGxpbmUgcGVyIGNhbGwgZm9ybWF0LiAgVGhlcmUgYXJlIGNvbW1lbnRzIGFib3ZlIGFuZCBiZWxvdyB0aGUgbWFwcGVkCi13cml0ZSBjYWxscyB0byBsb2NhbGl6ZSB3aGVyZSBpbiB0aGUgSlNQIGZpbGUgZWFjaCBsaW5lIG9mIHRleHQgY29tZXMKLWZyb20uICBUaGlzIGNhbiBsZWFkIHRvIGEgbWlub3IgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24gKGJ1dCBpdCBpcyBib3VuZAotYnkgYSBsaW5lYXIgY29tcGxleGl0eSkuICBXaXRob3V0IHRoaXMgb3B0aW9ucyBhbGwgYWRqYWNlbnQgd3JpdGVzIGFyZQotY29uY2F0ZW5hdGVkIGludG8gYSBzaW5nbGUgd3JpdGUuPC9QPgorPHA+VGhlIDx2YXI+aWVwbHVnaW48L3Zhcj4gb3B0aW9uIGlzIHVzZWQgYnkgdGhlIDxjb2RlPiZsdDtqc3A6cGx1Z2luJmd0OzwvY29kZT4gdGFncy4gIElmIHRoZSBKYXZhCitQbHVnLWluIENPTSBDbGFzcy1JRCB5b3Ugd2FudCB0byB1c2UgY2hhbmdlcyB0aGVuIGl0IGNhbiBiZSBzcGVjaWZpZWQgaGVyZS4gIFRoaXMgc2hvdWxkIG5vdCBuZWVkIHRvCitiZSBhbHRlcmVkLjwvcD4KIAotPFA+VGhlIDx0dD5pZXBsdWdpbjwvdHQ+IG9wdGlvbiBpcyB1c2VkIGJ5IHRoZSA8dHQ+Jmx0O2pzcDpwbHVnaW4mZ3Q7PC90dD4gdGFncy4KLUlmIHRoZSBKYXZhIFBsdWctaW4gQ09NIENsYXNzLUlEIHlvdSB3YW50IHRvIHVzZSBjaGFuZ2VzIHRoZW4gaXQgY2FuIGJlCi1zcGVjaWZpZWQgaGVyZS4gIFRoaXMgc2hvdWxkIG5vdCBuZWVkIHRvIGJlIGFsdGVyZWQuPC9QPgorPHA+PHZhcj51cmlyb290PC92YXI+IHNwZWNpZmllcyB0aGUgcm9vdCBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uLiAgVGhpcyBpcyB3aGVyZSBhbGwgYWJzb2x1dGUgVVJJcword2lsbCBiZSByZXNvbHZlZCBmcm9tLiAgSWYgaXQgaXMgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBKU1AgcGFnZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlIGl0LgorVG8gZGVyaXZlIGl0IGVhY2ggcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZmlyc3QgSlNQIHBhZ2UgaXMgc2VhcmNoZWQgZm9yIGEgPHNhbXA+V0VCLUlORjwvc2FtcD4KK2RpcmVjdG9yeSwgYW5kIHRoZSBkaXJlY3RvcnkgY2xvc2VzdCB0byB0aGUgSlNQIHBhZ2UgdGhhdCBoYXMgb25lIHdpbGwgYmUgdXNlZC4gIElmIG5vbmUgY2FuIGJlCitmb3VuZCB0aGVuIHRoZSBkaXJlY3RvcnkgSmFzcGVyYyB3YXMgY2FsbGVkIGZyb20gd2lsbCBiZSB1c2VkLiAgVGhpcyBvbmx5IGFmZmVjdHMgcGFnZXMgdHJhbnNsYXRlZAorZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIEpTUCBmaWxlJm1kYXNoO2luY2x1ZGluZyByZWZlcmVuY2VzIHRvIHRhZ2xpYnMuPC9wPgogCi08UD48dHQ+dXJpcm9vdDwvdHQ+IHNwZWNpZmllcyB0aGUgcm9vdCBvZiB0aGUgd2ViCi1hcHBsaWNhdGlvbi4gIFRoaXMgaXMgd2hlcmUgYWxsIGFic29sdXRlIHVyaXMgd2lsbCBiZSByZXNvbHZlZCBmcm9tLgotSWYgaXQgaXMgbm90IHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBKU1AgcGFnZSB3aWxsIGJlIHVzZWQgdG8gZGVyaXZlCi1pdC4gIFRvIGRlcml2ZSBpdCBlYWNoIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGZpcnN0IEpTUCBwYWdlIGlzCi1zZWFyY2hlZCBmb3IgYSA8dHQ+V0VCLUlORjwvdHQ+IGRpcmVjdG9yeSwgYW5kIHRoZSBkaXJlY3RvcnkgY2xvc2VzdCB0bwotdGhlIEpTUCBwYWdlIHRoYXQgaGFzIG9uZSB3aWxsIGJlIHVzZWQuICBJZiBub25lIGNhbiBiZSBmb3VuZCB0aGVuIHRoZQotZGlyZWN0b3J5IEphc3BlcmMgd2FzIGNhbGxlZCBmcm9tIHdpbGwgYmUgdXNlZC4gIFRoaXMgb25seSBhZmZlY3RzIHBhZ2VzCi10cmFuc2xhdGVkIGZyb20gYW4gZXhwbGljaXRseSBkZWNsYXJlZCBKU1AgZmlsZSAtaW5jbHVkaW5nIHJlZmVyZW5jZXMKLXRvIHRhZ2xpYnM8L1A+Ci0KLTxQPjx0dD51cmliYXNlPC90dD4gaXMgdXNlZCB0byBlc3RhYmxpc2ggdGhlIHVyaSBjb250ZXh0IG9mCi1yZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdAotaXMgZGVyaXZlZCBmcm9tIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSByZWxhdGl2ZSB0byB0aGUgZGVjbGFyZWQgb3IKLWRlcml2ZWQgdmFsdWUgb2YgPHR0PnVyaXJvb3Q8L3R0Pi4gVGhpcyBvbmx5IGFmZmVjdHMgcGFnZXMKLXRyYW5zbGF0ZWQgZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkIEpTUCBmaWxlLjwvUD4KKzxwPjx2YXI+dXJpYmFzZTwvdmFyPiBpcyB1c2VkIHRvIGVzdGFibGlzaCB0aGUgY29udGV4dCBvZiByZWxhdGl2ZSBVUkkgcmVmZXJlbmNlcyBpbiB0aGUgSlNQIHBhZ2VzLgorSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBpdCBpcyBkZXJpdmVkIGZyb20gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBkZWNsYXJlZCBvcgorZGVyaXZlZCB2YWx1ZSBvZiA8dmFyPnVyaXJvb3Q8L3Zhcj4uIFRoaXMgb25seSBhZmZlY3RzIHBhZ2VzIHRyYW5zbGF0ZWQgZnJvbSBhbiBleHBsaWNpdGx5IGRlY2xhcmVkCitKU1AgZmlsZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi1UaGlzIHRhc2sgaXMgYSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sIj5kaXJlY3RvcnkgYmFzZWQgdGFzazwvYT4sIGxpa2UKLTxzdHJvbmc+amF2YWM8L3N0cm9uZz4sIHNvIHRoZSBqc3AgZmlsZXMgdG8gYmUgY29tcGlsZWQgYXJlIGxvY2F0ZWQgYXMgamF2YQotZmlsZXMgYXJlIGJ5IDxzdHJvbmc+amF2YWM8L3N0cm9uZz4uIFRoYXQgaXMsIGVsZW1lbnRzIHN1Y2ggYXMgPHR0PmluY2x1ZGVzPC90dD4gYW5kCi08dHQ+ZXhjbHVkZXM8L3R0PiBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbnNpZGUgdGhlIHRhc2sgZGVjbGFyYXRpb24uCis8cD5UaGlzIHRhc2sgaXMgYSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sIj5kaXJlY3RvcnkgYmFzZWQgdGFzazwvYT4sIGxpa2UgPGNvZGU+amF2YWM8L2NvZGU+LCBzbwordGhlIDxzYW1wPi5qc3A8L3NhbXA+IGZpbGVzIHRvIGJlIGNvbXBpbGVkIGFyZSBsb2NhdGVkIGFzIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBhcmUKK2J5IDxjb2RlPmphdmFjPC9jb2RlPi4gVGhhdCBpcywgZWxlbWVudHMgc3VjaCBhcyA8Y29kZT5pbmNsdWRlczwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiBjYW4KK2JlIHVzZWQgZGlyZWN0bHkgaW5zaWRlIHRoZSB0YXNrIGRlY2xhcmF0aW9uLjwvcD4KIAotPHA+Ci0KLUVsZW1lbnRzIHNwZWNpZmljIHRvIHRoZSBqc3BjIHRhc2sgYXJlOi0KKzxwPkVsZW1lbnRzIHNwZWNpZmljIHRvIHRoZSA8Y29kZT5qc3BjPC9jb2RlPiB0YXNrIGFyZTo8L3A+CiAKIDxoND5jbGFzc3BhdGg8L2g0PgogCi1UaGUgY2xhc3NwYXRoIHVzZWQgdG8gY29tcGlsZSB0aGUgSlNQIHBhZ2VzLCBzcGVjaWZpZWQgYXMgZm9yIGFueSBvdGhlcgotY2xhc3NwYXRoLgorPHA+VGhlIGNsYXNzcGF0aCB1c2VkIHRvIGNvbXBpbGUgdGhlIEpTUCBwYWdlcywgc3BlY2lmaWVkIGFzIGZvciBhbnkgb3RoZXIgY2xhc3NwYXRoLjwvcD4KIAogPGg0PmNsYXNzcGF0aHJlZjwvaDQ+Ci1hIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBjbGFzc3BhdGgKKworPHA+YSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgY2xhc3NwYXRoPC9wPgogCiA8aDQ+d2ViYXBwPC9oND4KLUluc3RydWN0aW9ucyB0byBqYXNwZXIgdG8gYnVpbGQgYW4gZW50aXJlIHdlYiBhcHBsaWNhdGlvbi4KLVRoZSBiYXNlIGRpcmVjdG9yeSBtdXN0IGhhdmUgYSBXRUItSU5GIHN1YmRpcmVjdG9yeSBiZW5lYXRoIGl0LgotV2hlbiB1c2VkLCB0aGUgdGFzayBoYW5kcyBvZmYgYWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcgdG8gdGhlIGNvbXBpbGVyLgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKworPHA+SW5zdHJ1Y3Rpb25zIHRvIEphc3BlciB0byBidWlsZCBhbiBlbnRpcmUgd2ViIGFwcGxpY2F0aW9uLiAgVGhlIGJhc2UgZGlyZWN0b3J5IG11c3QgaGF2ZQorYSA8c2FtcD5XRUItSU5GPC9zYW1wPiBzdWJkaXJlY3RvcnkgYmVuZWF0aCBpdC4gIFdoZW4gdXNlZCwgdGhlIHRhc2sgaGFuZHMgb2ZmIGFsbCBkZXBlbmRlbmN5CitjaGVja2luZyB0byB0aGUgY29tcGlsZXIuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSB3ZWIgYXBwbGljYXRpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+YmFzZWRpcjwvdGQ+CisgICAgPHRkPnRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CisKIDxoMz5FeGFtcGxlPC9oMz4KKzxwPkJ1aWxkIGFsbCA8c2FtcD4uanNwPC9zYW1wPiBmaWxlcyB1bmRlciA8c2FtcD5zcmMvd2FyPC9zYW1wPiBpbnRvIHRoZQorZGVzdGluYXRpb24gPHNhbXA+L2dlbnNyYzwvc2FtcD4sIGluIGEgcGFja2FnZSBoaWVyYXJjaHkgYmVnaW5uaW5nCit3aXRoIDxzYW1wPmNvbS5pM3NwLmpzcDwvc2FtcD4uPC9wPgogPHByZT4KICZsdDtqc3BjIHNyY2Rpcj0iJHtiYXNlZGlyfS9zcmMvd2FyIgogICAgICAgZGVzdGRpcj0iJHtiYXNlZGlyfS9nZW5zcmMiCkBAIC0yNTcsNTIgKzIyNSwzNyBAQAogICAgICAgY29tcGlsZXI9Imphc3BlcjQxIgogICAgICAgdmVyYm9zZT0iOSImZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9IioqLyouanNwIi8mZ3Q7Ci0mbHQ7L2pzcGMmZ3Q7Ci08L3ByZT4KLUJ1aWxkIGFsbCBqc3AgcGFnZXMgdW5kZXIgc3JjL3dhciBpbnRvIHRoZSBkZXN0aW5hdGlvbiAvZ2Vuc3JjLCBpbiBhCi1wYWNrYWdlIGhpZXJhcmNoeSBiZWdpbm5pbmcgd2l0aCBjb20uaTNzcC5qc3AuCismbHQ7L2pzcGMmZ3Q7PC9wcmU+CisKKzxwPkdlbmVyYXRlIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBmcm9tIDxzYW1wPi5qc3A8L3NhbXA+IGZpbGVzLCB0aGVuIDxjb2RlPmphdmFjPC9jb2RlPiB0aGVtIGRvd24KK3RvIGJ5dGVjb2RlLiBJbmNsdWRlIDxzYW1wPmxpYi90YWdsaWJzLmphcjwvc2FtcD4gaW4gdGhlIEphdmEgY29tcGlsYXRpb24uIERlcGVuZGVuY3kgY2hlY2tpbmcgaXMKK3VzZWQgdG8gc2NydWIgdGhlIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBpZiBjbGFzcyBkZXBlbmRlbmNpZXMgaW5kaWNhdGUgaXQgaXMgbmVlZGVkLjwvcD4KIDxwcmU+Ci0mbHQ7anNwYwotICAgICAgZGVzdGRpcj0iaW50ZXJpbSIKKyZsdDtqc3BjIGRlc3RkaXI9ImludGVyaW0iCiAgICAgICB2ZXJib3NlPSIxIgogICAgICAgc3JjZGlyPSJzcmMiCiAgICAgICBjb21waWxlcj0iamFzcGVyNDEiCiAgICAgICBwYWNrYWdlPSJjb20uaTNzcC5qc3AiJmd0OwogICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qLmpzcCIvJmd0OwogJmx0Oy9qc3BjJmd0OwotJmx0O2RlcGVuZAotICAgICAgICAgc3JjZGlyPSJpbnRlcmltIgorJmx0O2RlcGVuZCBzcmNkaXI9ImludGVyaW0iCiAgICAgICAgICBkZXN0ZGlyPSJidWlsZCIKICAgICAgICAgIGNhY2hlPSJidWlsZC9kZXBlbmRlbmNpZXMiCiAgICAgICAgICBjbGFzc3BhdGg9ImxpYi90YWdsaWJzLmphciIvJmd0OwotJmx0O2phdmFjCi0gICAgICAgICBzcmNkaXI9ImludGVyaW0iCismbHQ7amF2YWMgc3JjZGlyPSJpbnRlcmltIgogICAgICAgICAgZGVzdGRpcj0iYnVpbGQiCiAgICAgICAgICBjbGFzc3BhdGg9ImxpYi90YWdsaWJzLmphciIKLSAgICAgICAgIGRlYnVnPSJvbiIvJmd0OwotPC9wcmU+Ci1HZW5lcmF0ZSBqc3AgcGFnZXMgdGhlbiBqYXZhYyB0aGVtIGRvd24gdG8KLWJ5dGVjb2Rlcy4gSW5jbHVkZSBsaWIvdGFnbGliIGphciBpbiB0aGUgamF2YSBjb21waWxhdGlvbi4KLSBEZXBlbmRlbmN5IGNoZWNraW5nIGlzIHVzZWQgdG8gc2NydWIgdGhlCi1qYXZhIGZpbGVzIGlmIGNsYXNzIGRlcGVuZGVuY2llcyBpbmRpY2F0ZSBpdCBpcyBuZWVkZWQuCisgICAgICAgICBkZWJ1Zz0ib24iLyZndDs8L3ByZT4KIAotPHA+PGg0Pk5vdGVzPC9oND4KLVVzaW5nIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBhdHRyaWJ1dGUgaXQgaXMgcG9zc2libGUgdG8gaWRlbnRpZnkgdGhlIHJlc3VsdGluZwotamF2YSBmaWxlcyBhbmQgdGh1cyBkbyBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcgLSB0aGlzIHRhc2sgc2hvdWxkIG9ubHkgcmVidWlsZAotamF2YSBmaWxlcyBpZiB0aGVpciBqc3AgZmlsZSBoYXMgYmVlbiBtb2RpZmllZC4gSG93ZXZlciwgdGhpcyBvbmx5IHdvcmtzCi13aXRoIHNvbWUgdmVyc2lvbnMgb2YgamFzcGVyLiBCeSBkZWZhdWx0IHRoZSBjaGVja2luZyBzdXBwb3J0cyB0b21jYXQgNC4wLngKLXdpdGggdGhlICJqYXNwZXIiIGNvbXBpbGVyLCBzZXQgdGhlIGNvbXBpbGVyIHRvICJqYXNwZXI0MSIgZm9yIHRoZSB0b21jYXQ0LjEueAotZGVwZW5kZW5jeSBjaGVja2luZy4KLUV2ZW4gd2hlbiBpdCBkb2VzIHdvcmssIGNoYW5nZXMgaW4KLS5UTEQgaW1wb3J0cyBvciBpbiBjb21waWxlIHRpbWUgaW5jbHVkZXMgZG8gbm90IGdldCBwaWNrZWQgdXAuCi0KLTxwPgotSmFzcGVyIGdlbmVyYXRlcyBKU1AgcGFnZXMgYWdhaW5zdCB0aGUgSlNQMS4yIHNwZWNpZmljYXRpb24gLWEgY29weSBvZgotdmVyc2lvbiAyLjMgb2YgdGhlIHNlcnZsZXQgc3BlY2lmaWNhdGlvbiBpcyBuZWVkZWQgb24gdGhlIGNsYXNzcGF0aCB0bwotY29tcGlsZSB0aGUgSmF2YSBjb2RlLgotCi0KLQorPGg0Pk5vdGVzPC9oND4KKzxwPlVzaW5nIHRoZSA8dmFyPnBhY2thZ2U8L3Zhcj4gYXR0cmlidXRlIGl0IGlzIHBvc3NpYmxlIHRvIGlkZW50aWZ5IHRoZQorcmVzdWx0aW5nIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBhbmQgdGh1cyBkbyBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcmbWRhc2g7dGhpcyB0YXNrIHNob3VsZCBvbmx5CityZWJ1aWxkIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBpZiB0aGVpciA8c2FtcD4uanNwPC9zYW1wPiBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkLiBIb3dldmVyLCB0aGlzCitvbmx5IHdvcmtzIHdpdGggc29tZSB2ZXJzaW9ucyBvZiBKYXNwZXIuIEJ5IGRlZmF1bHQgdGhlIGNoZWNraW5nIHN1cHBvcnRzIFRvbWNhdCA0LjAueCB3aXRoCit0aGUgPHE+amFzcGVyPC9xPiBjb21waWxlciwgc2V0IHRoZSBjb21waWxlciB0byA8cT5qYXNwZXI0MTwvcT4gZm9yIHRoZSBUb21jYXQgNC4xLnggZGVwZW5kZW5jeQorY2hlY2tpbmcuIEV2ZW4gd2hlbiBpdCBkb2VzIHdvcmssIGNoYW5nZXMgaW4gPHNhbXA+LnRsZDwvc2FtcD4gaW1wb3J0cyBvciBpbiBjb21waWxlIHRpbWUgaW5jbHVkZXMKK2RvIG5vdCBnZXQgcGlja2VkIHVwLjwvcD4KKzxwPkphc3BlciBnZW5lcmF0ZXMgSlNQIHBhZ2VzIGFnYWluc3QgdGhlIEpTUCAxLjIgc3BlY2lmaWNhdGlvbiZtZGFzaDthIGNvcHkgb2YgdmVyc2lvbiAyLjMgb2YgdGhlCitzZXJ2bGV0IHNwZWNpZmljYXRpb24gaXMgbmVlZGVkIG9uIHRoZSBjbGFzc3BhdGggdG8gY29tcGlsZSB0aGUgSmF2YSBjb2RlLjwvcD4KIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2p1bml0Lmh0bWwgYi9tYW51YWwvVGFza3MvanVuaXQuaHRtbAppbmRleCBhNjg3OWE4Li5mMGU1Yzk1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvanVuaXQuaHRtbAorKysgYi9tYW51YWwvVGFza3MvanVuaXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI4OCArMTUsMjI4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SlVuaXQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9Imp1bml0Ij5KVW5pdDwvYT48L2gyPgorPGgyIGlkPSJqdW5pdCI+SlVuaXQ8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+VGhpcyB0YXNrIHJ1bnMgdGVzdHMgZnJvbSB0aGUgSlVuaXQgdGVzdGluZyBmcmFtZXdvcmsuIFRoZSBsYXRlc3QKLXZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBjYW4gYmUgZm91bmQgYXQKLTxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5odHRwOi8vd3d3Lmp1bml0Lm9yZzwvYT4uCi1UaGlzIHRhc2sgaGFzIGJlZW4gdGVzdGVkIHdpdGggSlVuaXQgMy4wIHVwIHRvIEpVbml0IDMuOC4yOyBpdCB3b24ndAotd29yayB3aXRoIHZlcnNpb25zIHByaW9yIHRvIEpVbml0IDMuMC4gSXQgYWxzbyB3b3JrcyB3aXRoIEpVbml0IDQuMCwgaW5jbHVkaW5nCi0icHVyZSIgSlVuaXQgNCB0ZXN0cyB1c2luZyBvbmx5IGFubm90YXRpb25zIGFuZCBubyA8Y29kZT5KVW5pdDRUZXN0QWRhcHRlcjwvY29kZT4uPC9wPgotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkCis8cD5UaGlzIHRhc2sgcnVucyB0ZXN0cyBmcm9tIHRoZSBKVW5pdCB0ZXN0aW5nIGZyYW1ld29yay4gVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBmcmFtZXdvcmsgY2FuIGJlCitmb3VuZCBhdCA8YSBocmVmPSJodHRwczovL2p1bml0Lm9yZyIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2p1bml0Lm9yZzwvYT4uICBUaGlzIHRhc2sgaGFzIGJlZW4gdGVzdGVkCit3aXRoIEpVbml0IDMuMCB1cCB0byBKVW5pdCAzLjguMjsgaXQgd29uJ3Qgd29yayB3aXRoIHZlcnNpb25zIHByaW9yIHRvIEpVbml0IDMuMC4gSXQgYWxzbyB3b3JrcyB3aXRoCitKVW5pdCA0LngsIGluY2x1ZGluZyAicHVyZSIgSlVuaXQgNCB0ZXN0cyB1c2luZyBvbmx5IGFubm90YXRpb25zIGFuZAorbm8gPGNvZGU+SlVuaXQ0VGVzdEFkYXB0ZXI8L2NvZGU+LjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZAogaW4gdGhlIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj4KLUxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLTwvcD4KLTxwPgotPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OgotWW91IG11c3QgaGF2ZSA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGF2YWlsYWJsZS4KLVlvdSBjYW4gZG8gb25lIG9mOgotPC9wPgorTGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogWW91IG11c3QgaGF2ZSA8c2FtcD5qdW5pdC5qYXI8L3NhbXA+IGF2YWlsYWJsZS4gIFlvdSBjYW4gZG8gb25lIG9mOjwvcD4KIDxvbD4KLTxsaT4KLVB1dCBib3RoIDxjb2RlPmp1bml0LmphcjwvY29kZT4gYW5kIDxjb2RlPmFudC1qdW5pdC5qYXI8L2NvZGU+IGluCi08Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LgotPC9saT4KLTxsaT4KLURvIG5vdCBwdXQgZWl0aGVyIGluIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4sIGFuZCBpbnN0ZWFkCi1pbmNsdWRlIHRoZWlyIGxvY2F0aW9ucyBpbiB5b3VyIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuCi08L2xpPgotPGxpPgotQWRkIGJvdGggSkFScyB0byB5b3VyIGNsYXNzcGF0aCB1c2luZyA8Y29kZT4tbGliPC9jb2RlPi4KLTwvbGk+Ci08bGk+Ci1TcGVjaWZ5IHRoZSBsb2NhdGlvbnMgb2YgYm90aCBKQVJzIHVzaW5nCi1hIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIGEgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBpbiB0aGUgYnVpbGQgZmlsZS4KLTwvbGk+Ci08bGk+Ci1MZWF2ZSA8Y29kZT5hbnQtanVuaXQuamFyPC9jb2RlPiBpbiBpdHMgZGVmYXVsdCBsb2NhdGlvbiBpbiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+Ci1idXQgaW5jbHVkZSA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gcGFzc2VkCi10byA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi4gPGVtPihzaW5jZSBBbnQgMS43KTwvZW0+Ci08L2xpPgorICA8bGk+UHV0IGJvdGggPHNhbXA+anVuaXQuamFyPC9zYW1wPiBhbmQgPHNhbXA+YW50LWp1bml0Lmphcjwvc2FtcD4KKyAgICBpbiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LjwvbGk+CisgIDxsaT5EbyBub3QgcHV0IGVpdGhlciBpbiA8Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+LCBhbmQgaW5zdGVhZCBpbmNsdWRlIHRoZWlyIGxvY2F0aW9ucyBpbgorICAgIHlvdXIgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L2xpPgorICA8bGk+QWRkIGJvdGggSkFScyB0byB5b3VyIGNsYXNzcGF0aCB1c2luZyA8a2JkPi1saWI8L2tiZD4uPC9saT4KKyAgPGxpPlNwZWNpZnkgdGhlIGxvY2F0aW9ucyBvZiBib3RoIEpBUnMgdXNpbmcgYSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudCBpbgorICAgIGEgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiBpbiB0aGUgYnVpbGQgZmlsZS48L2xpPgorICA8bGk+TGVhdmUgPHNhbXA+YW50LWp1bml0Lmphcjwvc2FtcD4gaW4gaXRzIGRlZmF1bHQgbG9jYXRpb24gaW4gPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPiBidXQKKyAgICBpbmNsdWRlIDxzYW1wPmp1bml0Lmphcjwvc2FtcD4gaW4gdGhlIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBwYXNzZWQKKyAgICB0byA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvbGk+CiA8L29sPgotPHA+Ci1TZWUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2ZhcS5odG1sI2RlbGVnYXRpbmctY2xhc3Nsb2FkZXIiIHRhcmdldD0iX3RvcCI+dGhlCi1GQVE8L2E+IGZvciBkZXRhaWxzLgotPC9wPgorPHA+U2VlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjZGVsZWdhdGluZy1jbGFzc2xvYWRlciIgdGFyZ2V0PSJfdG9wIj50aGUgRkFRPC9hPgorZm9yIGRldGFpbHMuPC9wPgogCi08cD5UZXN0cyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgPGNvZGU+dGVzdDwvY29kZT4gb3IKLTxjb2RlPmJhdGNodGVzdDwvY29kZT4gdGFncyAoc2VlIDxhIGhyZWY9IiNuZXN0ZWQiPm5lc3RlZAotZWxlbWVudHM8L2E+KS48L3A+Cis8cD5UZXN0cyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgPGNvZGU+dGVzdDwvY29kZT4gb3IgPGNvZGU+YmF0Y2h0ZXN0PC9jb2RlPiB0YWdzCisoc2VlIDxhIGhyZWY9IiNuZXN0ZWQiPm5lc3RlZCBlbGVtZW50czwvYT4pLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci08L3RyPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJpbnRzdW1tYXJ5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlByaW50IG9uZS1saW5lIHN0YXRpc3RpY3MgZm9yIGVhY2ggdGVzdGNhc2UuIENhbgotICAgICAgdGFrZSB0aGUgdmFsdWVzIDxjb2RlPm9uPC9jb2RlPiwKLSAgICAgIDxjb2RlPm9mZjwvY29kZT4sIGFuZAotICAgICAgPGNvZGU+d2l0aE91dEFuZEVycjwvY29kZT4uCi0gICAgICA8Y29kZT53aXRoT3V0QW5kRXJyPC9jb2RlPiBpcyB0aGUgc2FtZQotICAgICAgYXMgPGNvZGU+b248L2NvZGU+IGJ1dCBhbHNvIGluY2x1ZGVzIHRoZSBvdXRwdXQgb2YgdGhlIHRlc3QKLSAgICAgIGFzIHdyaXR0ZW4gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gYW5kIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJ1biB0aGUgdGVzdHMgaW4gYSBzZXBhcmF0ZSBWTS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgPGNvZGU+b2ZmPC9jb2RlPi48L3RkPgorICAgIDx0ZD5wcmludHN1bW1hcnk8L3RkPgorICAgIDx0ZD5QcmludCBvbmUtbGluZSBzdGF0aXN0aWNzIGZvciBlYWNoIHRlc3RjYXNlLiBDYW4gdGFrZSB0aGUgdmFsdWVzIDxxPm9uPC9xPiwgPHE+b2ZmPC9xPiwKKyAgICAgIGFuZCA8cT53aXRoT3V0QW5kRXJyPC9xPi4gIDxxPndpdGhPdXRBbmRFcnI8L3E+IGlzIHRoZSBzYW1lIGFzIDxxPm9uPC9xPiBidXQgYWxzbyBpbmNsdWRlcyB0aGUKKyAgICAgIG91dHB1dCBvZiB0aGUgdGVzdCBhcyB3cml0dGVuIHRvIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IGFuZCA8Y29kZT5TeXN0ZW0uZXJyPC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5vZmY8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9ya21vZGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbHMgaG93IG1hbnkgSmF2YSBWaXJ0dWFsIE1hY2hpbmVzIGdldAotICAgIGNyZWF0ZWQgaWYgeW91IHdhbnQgdG8gZm9yayBzb21lIHRlc3RzLiAgUG9zc2libGUgdmFsdWVzIGFyZQotICAgICZxdW90O3BlclRlc3QmcXVvdDsgKHRoZSBkZWZhdWx0KSwgJnF1b3Q7cGVyQmF0Y2gmcXVvdDsgYW5kCi0gICAgJnF1b3Q7b25jZSZxdW90Oy4gICZxdW90O29uY2UmcXVvdDsgY3JlYXRlcyBvbmx5IGEgc2luZ2xlIEphdmEgVk0KLSAgICBmb3IgYWxsIHRlc3RzIHdoaWxlICZxdW90O3BlclRlc3QmcXVvdDsgY3JlYXRlcyBhIG5ldyBWTSBmb3IgZWFjaAotICAgIFRlc3RDYXNlIGNsYXNzLiAgJnF1b3Q7cGVyQmF0Y2gmcXVvdDsgY3JlYXRlcyBhIFZNIGZvciBlYWNoIG5lc3RlZAotICAgIDxjb2RlPiZsdDtiYXRjaHRlc3QmZ3Q7PC9jb2RlPiBhbmQgb25lIGNvbGxlY3RpbmcgYWxsIG5lc3RlZAotICAgIDxjb2RlPiZsdDt0ZXN0Jmd0OzwvY29kZT5zLiAgTm90ZSB0aGF0IG9ubHkgdGVzdHMgd2l0aCB0aGUgc2FtZQotICAgIHNldHRpbmdzIG9mIDxjb2RlPmZpbHRlcnRyYWNlPC9jb2RlPiwgPGNvZGU+aGFsdG9uZXJyb3I8L2NvZGU+LAotICAgIDxjb2RlPmhhbHRvbmZhaWx1cmU8L2NvZGU+LCA8Y29kZT5lcnJvcnByb3BlcnR5PC9jb2RlPiBhbmQKLSAgICA8Y29kZT5mYWlsdXJlcHJvcGVydHk8L2NvZGU+IGNhbiBzaGFyZSBhIFZNLCBzbyBldmVuIGlmIHlvdSBzZXQKLSAgICA8Y29kZT5mb3JrbW9kZTwvY29kZT4gdG8gJnF1b3Q7b25jZSZxdW90OywgQW50IG1heSBoYXZlIHRvIGNyZWF0ZQotICAgIG1vcmUgdGhhbiBhIHNpbmdsZSBKYXZhIFZNLiAgVGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZCBmb3IgdGVzdHMKLSAgICB0aGF0IGRvbid0IGdldCBmb3JrZWQgaW50byBhIG5ldyBKYXZhIFZNLiAgPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnBlclRlc3Q8L2NvZGU+LjwvdGQ+CisgICAgPHRkPmZvcms8L3RkPgorICAgIDx0ZD5SdW4gdGhlIHRlc3RzIGluIGEgc2VwYXJhdGUgSlZNLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm9mZjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHRlc3QKLSAgICAgICBydW4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPm9mZjwvY29kZT4uPC90ZD4KLSAgPC90cj4KLTx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25mYWlsdXJlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlCi0gICAgICBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vZmY8L2NvZGU+LjwvdGQ+Ci0gIDwvdHI+Ci08dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsdXJlcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZQotICAgICAgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uPC90ZD4KLTwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcnRyYWNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbHRlciBvdXQgSnVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjayB0cmFjZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPm9uPC9jb2RlPi48L3RkPgorICAgIDx0ZD5mb3JrbW9kZTwvdGQ+CisgICAgPHRkPkNvbnRyb2xzIGhvdyBtYW55IEpWTXMgZ2V0IGNyZWF0ZWQgaWYgeW91IHdhbnQgdG8gZm9yayBzb21lIHRlc3RzLiAgUG9zc2libGUgdmFsdWVzCisgICAgICBhcmUgPHE+cGVyVGVzdDwvcT4gKHRoZSBkZWZhdWx0KSwgPHE+cGVyQmF0Y2g8L3E+IGFuZCA8cT5vbmNlPC9xPi4gIDxxPm9uY2U8L3E+IGNyZWF0ZXMgb25seSBhCisgICAgICBzaW5nbGUgSlZNIGZvciBhbGwgdGVzdHMgd2hpbGUgPHE+cGVyVGVzdDwvcT4gY3JlYXRlcyBhIG5ldyBKVk0gZm9yIGVhY2ggVGVzdENhc2UKKyAgICAgIGNsYXNzLiAgPHE+cGVyQmF0Y2g8L3E+IGNyZWF0ZXMgYSBKVk0gZm9yIGVhY2ggbmVzdGVkIDxjb2RlPiZsdDtiYXRjaHRlc3QmZ3Q7PC9jb2RlPiBhbmQgb25lCisgICAgICBjb2xsZWN0aW5nIGFsbCBuZXN0ZWQgPGNvZGU+Jmx0O3Rlc3QmZ3Q7PC9jb2RlPnMuICBOb3RlIHRoYXQgb25seSB0ZXN0cyB3aXRoIHRoZSBzYW1lIHNldHRpbmdzCisgICAgICBvZiA8dmFyPmZpbHRlcnRyYWNlPC92YXI+LCA8dmFyPmhhbHRvbmVycm9yPC92YXI+LCA8dmFyPmhhbHRvbmZhaWx1cmU8L3Zhcj4sIDx2YXI+ZXJyb3Jwcm9wZXJ0eTwvdmFyPgorICAgICAgYW5kIDx2YXI+ZmFpbHVyZXByb3BlcnR5PC92YXI+IGNhbiBzaGFyZSBhIEpWTSwgc28gZXZlbiBpZiB5b3Ugc2V0IDx2YXI+Zm9ya21vZGU8L3Zhcj4KKyAgICAgIHRvIDxxPm9uY2U8L3E+LCBBbnQgbWF5IGhhdmUgdG8gY3JlYXRlIG1vcmUgdGhhbiBhIHNpbmdsZSBKVk0uICBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGZvcgorICAgICAgdGVzdHMgdGhhdCBkb24ndCBnZXQgZm9ya2VkIGludG8gYSBuZXcgSlZNLiAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+cGVyVGVzdDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNhbmNlbCB0aGUgaW5kaXZpZHVhbCB0ZXN0cyBpZiB0aGV5IGRvbid0IGZpbmlzaAotICAgICAgaW4gdGhlIGdpdmVuIHRpbWUgKG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcykuICBJZ25vcmVkIGlmCi0gICAgICA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC4gIFdoZW4gcnVubmluZyBtdWx0aXBsZSB0ZXN0cwotICAgICAgaW5zaWRlIHRoZSBzYW1lIEphdmEgVk0gKHNlZSBmb3JrTW9kZSksIHRpbWVvdXQgYXBwbGllcyB0byB0aGUKLSAgICAgIHRpbWUgdGhhdCBhbGwgdGVzdHMgdXNlIHRvZ2V0aGVyLCBub3QgdG8gYW4gaW5kaXZpZHVhbAotICAgICAgdGVzdC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5oYWx0b25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdGVzdCBydW4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b2ZmPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1heG1lbW9yeTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5NYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgdG8gdGhlIGZvcmtlZCBWTS4KLSAgICAgIElnbm9yZWQgaWYgPGNvZGU+Zm9yazwvY29kZT4gaXMgZGlzYWJsZWQuIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogCi0gICAgICBJZiB5b3UgZ2V0IDxjb2RlPmphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yOiBKYXZhIGhlYXAgc3BhY2U8L2NvZGU+Ci0gICAgICBpbiBzb21lIG9mIHlvdXIgdGVzdHMgdGhlbiB5b3UgbmVlZCB0byByYWlzZSB0aGUgc2l6ZSBsaWtlCi0gICAgICA8Y29kZT5tYXhtZW1vcnk9IjEyOG0iPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5qdm08L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLAotICAgICAgZGVmYXVsdCBpcyAnamF2YScuICBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieQotICAgICAgPGNvZGU+amF2YS5sYW5nLlJ1bnRpbWUuZXhlYygpPC9jb2RlPi4KLSAgICAgIElnbm9yZWQgaWYgPGNvZGU+Zm9yazwvY29kZT4gaXMgZGlzYWJsZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPmphdmE8L2NvZGU+LjwvdGQ+CisgICAgPHRkPmhhbHRvbmZhaWx1cmU8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgdGVzdCBmYWlscyAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm9mZjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBpbnZva2UgdGhlIFZNLiBJZ25vcmVkIGlmCi0gICAgICA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsdXJlcHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIChlcnJvcnMgYXJlIGNvbnNpZGVyZWQgZmFpbHVyZXMgYXMKKyAgICAgIHdlbGwpLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmV3ZW52aXJvbm1lbnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IHByb3BhZ2F0ZSB0aGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3Ci0gICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNwZWNpZmllZC4gSWdub3JlZCBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcwotICAgICAgZGlzYWJsZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgorICAgIDx0ZD5maWx0ZXJ0cmFjZTwvdGQ+CisgICAgPHRkPkZpbHRlciBvdXQgSlVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjayB0cmFjZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b248L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZWFudHJ1bnRpbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SW1wbGljaXRseSBhZGQgdGhlIEFudCBjbGFzc2VzIHJlcXVpcmVkIHRvIHJ1bgotICAgICAgdGhlIHRlc3RzIGFuZCBKVW5pdCB0byB0aGUgY2xhc3NwYXRoIGluIGZvcmtlZCBtb2RlLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICAgIDx0ZD50aW1lb3V0PC90ZD4KKyAgICA8dGQ+Q2FuY2VsIHRoZSBpbmRpdmlkdWFsIHRlc3RzIGlmIHRoZXkgZG9uJ3QgZmluaXNoIGluIHRoZSBnaXZlbiB0aW1lIChtZWFzdXJlZCBpbgorICAgICAgbWlsbGlzZWNvbmRzKS4gIElnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+IGlzIDxxPm9mZjwvcT4uICBXaGVuIHJ1bm5pbmcgbXVsdGlwbGUgdGVzdHMgaW5zaWRlCisgICAgICB0aGUgc2FtZSBKVk0gKHNlZSA8dmFyPmZvcmtNb2RlPC92YXI+KSwgPHZhcj50aW1lb3V0PC92YXI+IGFwcGxpZXMgdG8gdGhlIHRpbWUgdGhhdCBhbGwgdGVzdHMKKyAgICAgIHVzZSB0b2dldGhlciwgbm90IHRvIGFuIGluZGl2aWR1YWwgdGVzdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3dvdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2VuZCBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0ZXN0cyB0byBBbnQncwotICAgICAgbG9nZ2luZyBzeXN0ZW0gYXMgd2VsbCBhcyB0byB0aGUgZm9ybWF0dGVycy4gIEJ5IGRlZmF1bHQgb25seSB0aGUKLSAgICAgIGZvcm1hdHRlcnMgcmVjZWl2ZSB0aGUgb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1heG1lbW9yeTwvdGQ+CisgICAgPHRkPk1heGltdW0gYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSB0byB0aGUgZm9ya2VkIEpWTS4gIElnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+CisgICAgICBpcyA8cT5vZmY8L3E+LiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBnZXQgPGNvZGU+amF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3I6IEphdmEgaGVhcAorICAgICAgc3BhY2U8L2NvZGU+IGluIHNvbWUgb2YgeW91ciB0ZXN0cyB0aGVuIHlvdSBuZWVkIHRvIHJhaXNlIHRoZSBzaXplCisgICAgICBsaWtlIDx2YXI+bWF4bWVtb3J5PC92YXI+PTxxPjEyOG08L3E+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXR0b2Zvcm1hdHRlcnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICA8ZW0+U2luY2UgQW50IDEuNy4wLjwvZW0+PGJyLz4KLSAgICAgIFNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gdGhlIHRlc3QgZm9ybWF0dGVycy4KLSAgICAgIFRoaXMgaXMgInRydWUiIGJ5IGRlZmF1bHQuCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+anZtPC90ZD4KKyAgICA8dGQ+VGhlIGNvbW1hbmQgdXNlZCB0byBpbnZva2UgSlZNLiAgVGhlIGNvbW1hbmQgaXMgcmVzb2x2ZWQKKyAgICAgIGJ5IDxjb2RlPmphdmEubGFuZy5SdW50aW1lLmV4ZWMoKTwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPGtiZD5qYXZhPC9rYmQ+LCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50ZW1wZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXJlIEFudCBzaG91bGQgcGxhY2UgdGVtcG9yYXJ5IGZpbGVzLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgdGhlIHByb2plY3QncyBiYXNlCi0gICAgICBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBpbnZva2UgSlZNLjwvdGQ+CisgICAgPHRkPk5vLCBpZ25vcmVkIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWxvYWRpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvciBub3QgYSBuZXcgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UuPGJyPgotICAgIElnbm9yZSBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBzZXQgdG8gdHJ1ZS4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgICAgPHRkPm5ld2Vudmlyb25tZW50PC90ZD4KKyAgICA8dGQ+RG8gbm90IHByb3BhZ2F0ZSB0aGUgb2xkIGVudmlyb25tZW50IHdoZW4gbmV3IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPiwgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xvbmV2bTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JZiBzZXQgdG8gdHJ1ZSB0cnVlLCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcwotICAgICAgYW5kIHRoZSBib290Y2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgd2lsbCBiZQotICAgICAgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIEphdmEgVk0gcnVubmluZyBBbnQuICBEZWZhdWx0IGlzCi0gICAgICAmcXVvdDtmYWxzZSZxdW90OyAoaWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkKS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlYW50cnVudGltZTwvdGQ+CisgICAgPHRkPkltcGxpY2l0bHkgYWRkIHRoZSBBbnQgY2xhc3NlcyByZXF1aXJlZCB0byBydW4gdGhlIHRlc3RzIGFuZCBKVW5pdCB0byB0aGUgY2xhc3NwYXRoIGluCisgICAgICBmb3JrZWQgbW9kZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ2ZhaWxlZHRlc3RzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gQW50IGV4ZWN1dGVzIG11bHRpcGxlIHRlc3RzIGFuZCBkb2Vzbid0IHN0b3AKLSAgICAgIG9uIGVycm9ycyBvciBmYWlsdXJlcyBpdCB3aWxsIGxvZyBhICJGQUlMRUQiIG1lc3NhZ2UgZm9yIGVhY2gKLSAgICAgIGZhaWxpbmcgdGVzdCB0byBpdHMgbG9nZ2luZyBzeXN0ZW0uICBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uIHRvCi0gICAgICBmYWxzZSwgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgbG9nZ2VkIGFuZCB5b3UgaGF2ZSB0byByZWx5IG9uIHRoZQotICAgICAgZm9ybWF0dGVyIG91dHB1dCB0byBmaW5kIHRoZSBmYWlsaW5nIHRlc3RzLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4gICAgCi0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZVRlc3RMaXN0ZW5lckV2ZW50czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIEFudCBzaG91bGQgc2VuZCBmaW5lIGdyYWluZWQgaW5mb3JtYXRpb24KLSAgICAgIGFib3V0IHRoZSBydW5uaW5nIHRlc3RzIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGF0IHRoZSB2ZXJib3NlCi0gICAgICBsZXZlbC4gIFN1Y2ggZXZlbnRzIG1heSBiZSB1c2VkIGJ5IGN1c3RvbSB0ZXN0IGxpc3RlbmVycyB0byBzaG93Ci0gICAgICB0aGUgcHJvZ3Jlc3Mgb2YgdGVzdHMuPGJyLz4KLSAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi48YnIvPgotICAgICAgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgYSA8YSBocmVmPSIjZW5hYmxldGVzdGxpc3RlbmVyZXZlbnRzIj5tYWdpYwotICAgICAgICBwcm9wZXJ0eTwvYT4uPGJyLz4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjI8L2VtPiAtIDxzdHJvbmc+QW50IDEuNy4wIHRvIDEuOC4xIGJlaGF2ZSBhcwotICAgICAgICBpZiB0aGlzIGF0dHJpYnV0ZSB3YXMgdHJ1ZSBieSBkZWZhdWx0Ljwvc3Ryb25nPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnNob3dvdXRwdXQ8L3RkPgorICAgIDx0ZD5TZW5kIGFueSBvdXRwdXQgZ2VuZXJhdGVkIGJ5IHRlc3RzIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGFzIHdlbGwgYXMgdG8gdGhlCisgICAgICBmb3JtYXR0ZXJzLjwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IG9ubHkgdGhlIGZvcm1hdHRlcnMgcmVjZWl2ZSB0aGUgb3V0cHV0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhyZWFkczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hIG51bWJlciBvZiB0aHJlYWRzIHRvIHJ1biB0aGUgdGVzdHMgaW4uPGJyLz4KLSAgICAgIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIHRoZSB0ZXN0cyB3aWxsIGJlIHNwbGl0IGFyYml0cmFyaWx5IGFtb25nIHRoZSB0aHJlYWRzLjxici8+Ci0gICAgICByZXF1aXJlcyB0aGF0IHRoZSB0ZXN0cyBiZSBmb3JrZWQgd2l0aCB0aGUgPGNvZGU+cGVyVGVzdDwvY29kZT4KLSAgICAgIG9wdGlvbiB0byBiZSBvcGVyYXRpdmUuPGJyLz4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45LjQ8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm91dHB1dHRvZm9ybWF0dGVyczwvdGQ+CisgICAgPHRkPlNlbmQgYW55IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGVzdHMgdG8gdGhlIHRlc3QgZm9ybWF0dGVycy4gIDxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dGVtcGRpcjwvdGQ+CisgICAgPHRkPldoZXJlIEFudCBzaG91bGQgcGxhY2UgdGVtcG9yYXJ5IGZpbGVzLiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVsb2FkaW5nPC90ZD4KKyAgICA8dGQ+V2hldGhlciBvciBub3QgYSBuZXcgY2xhc3Nsb2FkZXIgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0ZXN0IGNhc2UuPGJyLz5JZ25vcmUKKyAgICAgIGlmIDx2YXI+Zm9yazwvdmFyPiBpcyBzZXQgdG8gPHE+dHJ1ZTwvcT4uICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jbG9uZXZtPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCB0aGVuIGFsbCBzeXN0ZW0gcHJvcGVydGllcyBhbmQgdGhlIDx2YXI+Ym9vdGNsYXNzcGF0aDwvdmFyPiBvZiB0aGUKKyAgICAgIGZvcmtlZCBKVk0gd2lsbCBiZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUgSlZNIHJ1bm5pbmcgQW50LiAgPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPiwgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2dmYWlsZWR0ZXN0czwvdGQ+CisgICAgPHRkPldoZW4gQW50IGV4ZWN1dGVzIG11bHRpcGxlIHRlc3RzIGFuZCBkb2Vzbid0IHN0b3Agb24gZXJyb3JzIG9yIGZhaWx1cmVzIGl0IHdpbGwgbG9nIGEKKyAgICAgICJGQUlMRUQiIG1lc3NhZ2UgZm9yIGVhY2ggZmFpbGluZyB0ZXN0IHRvIGl0cyBsb2dnaW5nIHN5c3RlbS4gIElmIHlvdSBzZXQgdGhpcyBvcHRpb24KKyAgICAgIHRvIDxxPmZhbHNlPC9xPiwgdGhlIG1lc3NhZ2Ugd2lsbCBub3QgYmUgbG9nZ2VkIGFuZCB5b3UgaGF2ZSB0byByZWx5IG9uIHRoZSBmb3JtYXR0ZXIgb3V0cHV0CisgICAgICB0byBmaW5kIHRoZSBmYWlsaW5nIHRlc3RzLiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVuYWJsZVRlc3RMaXN0ZW5lckV2ZW50czwvdGQ+CisgICAgPHRkPldoZXRoZXIgQW50IHNob3VsZCBzZW5kIGZpbmUgZ3JhaW5lZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcnVubmluZyB0ZXN0cyB0byBBbnQncyBsb2dnaW5nCisgICAgICBzeXN0ZW0gYXQgdGhlIHZlcmJvc2UgbGV2ZWwuICBTdWNoIGV2ZW50cyBtYXkgYmUgdXNlZCBieSBjdXN0b20gdGVzdCBsaXN0ZW5lcnMgdG8gc2hvdyB0aGUKKyAgICAgIHByb2dyZXNzIG9mIHRlc3RzLjxici8+PGVtPnNpbmNlIEFudCAxLjguMjwvZW0+Jm1kYXNoOzxzdHJvbmc+QW50IDEuNy4wIHRvIDEuOC4xIGJlaGF2ZSBhcyBpZgorICAgICAgdGhpcyBhdHRyaWJ1dGUgd2FzIDxxPnRydWU8L3E+IGJ5IGRlZmF1bHQuPC9zdHJvbmc+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPiwgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKyAgICAgIGEgPGEgaHJlZj0iI2VuYWJsZXRlc3RsaXN0ZW5lcmV2ZW50cyI+bWFnaWMgcHJvcGVydHk8L2E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50aHJlYWRzPC90ZD4KKyAgICA8dGQ+YSBudW1iZXIgb2YgdGhyZWFkcyB0byBydW4gdGhlIHRlc3RzIGluLjxici8+V2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgdGhlIHRlc3RzIHdpbGwKKyAgICAgIGJlIHNwbGl0IGFyYml0cmFyaWx5IGFtb25nIHRoZSB0aHJlYWRzLjxici8+UmVxdWlyZXMgdGhhdCB0aGUgdGVzdHMgYmUgZm9ya2VkIHdpdGgKKyAgICAgIHRoZSA8cT5wZXJUZXN0PC9xPiBvcHRpb24gdG8gYmUgb3BlcmF0aXZlLjxici8+PGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+QnkgdXNpbmcgdGhlIDxjb2RlPmVycm9ycHJvcGVydHk8L2NvZGU+IGFuZCA8Y29kZT5mYWlsdXJlcHJvcGVydHk8L2NvZGU+Ci1hdHRyaWJ1dGVzLCBpdCBpcyBwb3NzaWJsZSB0bwotcGVyZm9ybSBzZXR1cCB3b3JrIChzdWNoIGFzIHN0YXJ0aW5nIGFuIGV4dGVybmFsIHNlcnZlciksIGV4ZWN1dGUgdGhlIHRlc3QsCi1jbGVhbiB1cCwgYW5kIHN0aWxsIGZhaWwgdGhlIGJ1aWxkIGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUuPC9wPgorPHA+QnkgdXNpbmcgdGhlIDx2YXI+ZXJyb3Jwcm9wZXJ0eTwvdmFyPiBhbmQgPHZhcj5mYWlsdXJlcHJvcGVydHk8L3Zhcj4gYXR0cmlidXRlcywgaXQgaXMgcG9zc2libGUKK3RvIHBlcmZvcm0gc2V0dXAgd29yayAoc3VjaCBhcyBzdGFydGluZyBhbiBleHRlcm5hbCBzZXJ2ZXIpLCBleGVjdXRlIHRoZSB0ZXN0LCBjbGVhbiB1cCwgYW5kIHN0aWxsCitmYWlsIHRoZSBidWlsZCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlLjwvcD4KIAotPHA+VGhlIDxjb2RlPmZpbHRlcnRyYWNlPC9jb2RlPiBhdHRyaWJ1dGUgY29uZGVuc2VzIGVycm9yIGFuZCBmYWlsdXJlCi1zdGFjayB0cmFjZXMgYmVmb3JlIHJlcG9ydGluZyB0aGVtLgotSXQgd29ya3Mgd2l0aCBib3RoIHRoZSBwbGFpbiBhbmQgWE1MIGZvcm1hdHRlcnMuICBJdCBmaWx0ZXJzIG91dCBhbnkgbGluZXMKLXRoYXQgYmVnaW4gd2l0aCB0aGUgZm9sbG93aW5nIHN0cmluZyBwYXR0ZXJuczo8cHJlPgotICAgImp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSIKLSAgICJqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCIKLSAgICJqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlIgotICAgImp1bml0LmZyYW1ld29yay5Bc3NlcnQuIgotICAgImp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lciIKLSAgICJqdW5pdC5hd3R1aS5UZXN0UnVubmVyIgotICAgImp1bml0LnRleHR1aS5UZXN0UnVubmVyIgotICAgImphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZC5pbnZva2UoIgotICAgInN1bi5yZWZsZWN0LiIKLSAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC4iCi0gICAib3JnLmp1bml0LiIKLSAgICJqdW5pdC5mcmFtZXdvcmsuSlVuaXQ0VGVzdEFkYXB0ZXIiCi0gICAiIG1vcmUiPC9wcmU+Cis8cD5UaGUgPHZhcj5maWx0ZXJ0cmFjZTwvdmFyPiBhdHRyaWJ1dGUgY29uZGVuc2VzIGVycm9yIGFuZCBmYWlsdXJlIHN0YWNrIHRyYWNlcyBiZWZvcmUgcmVwb3J0aW5nCit0aGVtLiAgSXQgd29ya3Mgd2l0aCBib3RoIHRoZSBwbGFpbiBhbmQgWE1MIGZvcm1hdHRlcnMuICBJdCBmaWx0ZXJzIG91dCBhbnkgbGluZXMgdGhhdCBiZWdpbiB3aXRoCit0aGUgZm9sbG93aW5nIHN0cmluZyBwYXR0ZXJuczo8L3A+CiAKLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgorPHByZT4KKyAgICZxdW90O2p1bml0LmZyYW1ld29yay5UZXN0Q2FzZSZxdW90OworICAgJnF1b3Q7anVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQmcXVvdDsKKyAgICZxdW90O2p1bml0LmZyYW1ld29yay5UZXN0U3VpdGUmcXVvdDsKKyAgICZxdW90O2p1bml0LmZyYW1ld29yay5Bc3NlcnQuJnF1b3Q7CisgICAmcXVvdDtqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXImcXVvdDsKKyAgICZxdW90O2p1bml0LmF3dHVpLlRlc3RSdW5uZXImcXVvdDsKKyAgICZxdW90O2p1bml0LnRleHR1aS5UZXN0UnVubmVyJnF1b3Q7CisgICAmcXVvdDtqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKCZxdW90OworICAgJnF1b3Q7c3VuLnJlZmxlY3QuJnF1b3Q7CisgICAmcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC4mcXVvdDsKKyAgICZxdW90O29yZy5qdW5pdC4mcXVvdDsKKyAgICZxdW90O2p1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlciZxdW90OworICAgJnF1b3Q7IG1vcmUmcXVvdDs8L3ByZT4KIAotPHA+VGhlIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sKLXN1cHBvcnRzIGEgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgotZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZQotc3RydWN0dXJlPC9hPi48L3A+Cis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+QXMgb2YgQW50IDEuNywgdGhpcyBjbGFzc3BhdGggbWF5IGJlIHVzZWQgdG8gcmVmZXIgdG8gPGNvZGU+anVuaXQuamFyPC9jb2RlPgotYXMgd2VsbCBhcyB5b3VyIHRlc3RzIGFuZCB0aGUgdGVzdGVkIGNvZGUuCis8cD5UaGUgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudCB0aGF0CityZXByZXNlbnRzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPi48L3A+CisKKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4sIHRoaXMgY2xhc3NwYXRoIG1heSBiZSB1c2VkIHRvIHJlZmVyIHRvIDxzYW1wPmp1bml0Lmphcjwvc2FtcD4gYXMgd2VsbCBhcworeW91ciB0ZXN0cyBhbmQgdGhlIHRlc3RlZCBjb2RlLjwvcD4KIAogPGg0Pmp2bWFyZzwvaDQ+CiAKLTxwPklmIDxjb2RlPmZvcms8L2NvZGU+IGlzIGVuYWJsZWQsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgcGFzc2VkIHRvCi10aGUgbmV3IFZNIHZpYSBuZXN0ZWQgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGVsZW1lbnRzLiBGb3IgZXhhbXBsZTo8L3A+Cis8cD5JZiA8dmFyPmZvcms8L3Zhcj4gaXMgPHE+dHJ1ZTwvcT4sIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtYXkgYmUgcGFzc2VkIHRvIHRoZSBuZXcgSlZNIHZpYQorbmVzdGVkIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gRm9yIGV4YW1wbGU6PC9wPgogCiA8cHJlPgogJmx0O2p1bml0IGZvcms9JnF1b3Q7eWVzJnF1b3Q7Jmd0OwpAQCAtMzA0LDE4ICsyNDUsMTcgQEAKICZsdDsvanVuaXQmZ3Q7CiA8L3ByZT4KIAotPHA+d291bGQgcnVuIHRoZSB0ZXN0IGluIGEgVk0gd2l0aG91dCBKSVQuPC9wPgorPHA+d291bGQgcnVuIHRoZSB0ZXN0IGluIGEgSlZNIHdpdGhvdXQgSklULjwvcD4KIAotPHA+PGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGFsbG93cyBhbGwgYXR0cmlidXRlcyBkZXNjcmliZWQgaW4gPGEKLWhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3A+Cis8cD48Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4gYWxsb3dzIGFsbCBhdHRyaWJ1dGVzIGRlc2NyaWJlZAoraW4gPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LjwvcD4KIAogPGg0PnN5c3Byb3BlcnR5PC9oND4KIAotPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbQotcHJvcGVydGllcyByZXF1aXJlZCBieSB0aGUgY2xhc3MuIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZQotdG8gdGhlIFZNIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0ZXN0IChlaXRoZXIgQU5UJ3MgVk0gb3IgdGhlIGZvcmtlZCBWTSwKLWlmIDxjb2RlPmZvcms8L2NvZGU+IGlzIGVuYWJsZWQpLgotVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgdGhlIHNhbWUgYXMgZm9yIDxhIGhyZWY9Ii4uL1Rhc2tzL2V4ZWMuaHRtbCNlbnYiPmVudmlyb25tZW50IHZhcmlhYmxlczwvYT4uPC9wPgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIHJlcXVpcmVkIGJ5IHRoZQorY2xhc3MuIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byBKVk0gZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHRlc3QgKGVpdGhlciBBbnQncworSlZNIG9yIHRoZSBmb3JrZWQgSlZNLCBpZiA8dmFyPmZvcms8L3Zhcj49PHE+dHJ1ZTwvcT4pLiAgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgdGhlCitzYW1lIGFzIGZvciA8YSBocmVmPSIuLi9UYXNrcy9leGVjLmh0bWwjZW52Ij5lbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+LjwvcD4KIAogPHByZT4KICZsdDtqdW5pdCBmb3JrPSZxdW90O25vJnF1b3Q7Jmd0OwpAQCAtMzI0LDM2OSArMjY0LDM1MSBAQAogJmx0Oy9qdW5pdCZndDsKIDwvcHJlPgogCi08cD53b3VsZCBydW4gdGhlIHRlc3QgaW4gQU5UJ3MgVk0gYW5kIG1ha2UgdGhlIDxjb2RlPmJhc2VkaXI8L2NvZGU+IHByb3BlcnR5Ci1hdmFpbGFibGUgdG8gdGhlIHRlc3QuPC9wPgorPHA+d291bGQgcnVuIHRoZSB0ZXN0IGluIEFudCdzIEpWTSBhbmQgbWFrZSB0aGUgPGNvZGU+YmFzZWRpcjwvY29kZT4gcHJvcGVydHkgYXZhaWxhYmxlIHRvIHRoZQordGVzdC48L3A+CiAKIDxoND5zeXNwcm9wZXJ0eXNldDwvaDQ+CiAKKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT48L3A+CisKIDxwPllvdSBjYW4gc3BlY2lmeSBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgYXMgc3lzdGVtIHByb3BlcnRpZXMKIHdpdGggPGEgaHJlZj0iLi4vVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+c3lzcHJvcGVydHlzZXQ8L2E+cy48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC9wPgotCiA8aDQ+ZW52PC9oND4KIAotPHA+SXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gcGFzcyB0byB0aGUKLWZvcmtlZCBWTSB2aWEgbmVzdGVkIDxjb2RlPiZsdDtlbnYmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gRm9yIGEgZGVzY3JpcHRpb24KLW9mIHRoZSA8Y29kZT4mbHQ7ZW52Jmd0OzwvY29kZT4gZWxlbWVudCdzIGF0dHJpYnV0ZXMsIHNlZSB0aGUKLWRlc2NyaXB0aW9uIGluIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9leGVjLmh0bWwjZW52Ij5leGVjPC9hPiB0YXNrLjwvcD4KKzxwPkl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIGZvcmtlZCBKVk0gdmlhCituZXN0ZWQgPGNvZGU+Jmx0O2VudiZndDs8L2NvZGU+IGVsZW1lbnRzLiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+Jmx0O2VudiZndDs8L2NvZGU+CitlbGVtZW50J3MgYXR0cmlidXRlcywgc2VlIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgPGEgaHJlZj0iLi4vVGFza3MvZXhlYy5odG1sI2VudiI+ZXhlYzwvYT4gdGFzay48L3A+CiAKLTxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiA8Y29kZT5mb3JrPC9jb2RlPiBpcyBkaXNhYmxlZC48L3A+Cis8cD5TZXR0aW5ncyB3aWxsIGJlIGlnbm9yZWQgaWYgPHZhcj5mb3JrPC92YXI+PTxxPmZhbHNlPC9xPi48L3A+CiAKIDxoND5ib290Y2xhc3NwYXRoPC9oND4KIAotPHA+VGhlIGxvY2F0aW9uIG9mIGJvb3RzdHJhcCBjbGFzcyBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkIHVzaW5nIHRoaXMKLTxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gLSB3aWxsIGJlIGlnbm9yZWQKLWlmIDxpPmZvcms8L2k+IGlzIG5vdCA8Y29kZT50cnVlPC9jb2RlPiBvciB0aGUgdGFyZ2V0IFZNIGRvZXNuJ3QKLXN1cHBvcnQgaXQgKGkuZS4gSmF2YSAxLjEpLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC9wPgogCi08cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KKzxwPlRoZSBsb2NhdGlvbiBvZiBib290c3RyYXAgY2xhc3MgZmlsZXMgY2FuIGJlIHNwZWNpZmllZCB1c2luZwordGhpcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+Jm1kYXNoO3dpbGwgYmUgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj4KK2lzIDxxPmZhbHNlPC9xPiBvciB0aGUgdGFyZ2V0IEpWTSBkb2Vzbid0IHN1cHBvcnQgaXQgKGkuZS4gSmF2YSAxLjEpLjwvcD4KIAogPGg0PnBlcm1pc3Npb25zPC9oND4KLTxwPlNlY3VyaXR5IHBlcm1pc3Npb25zIGNhbiBiZSByZXZva2VkIGFuZCBncmFudGVkIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIHRoZSAKLWNsYXNzIHZpYSBhIG5lc3RlZCA8aT5wZXJtaXNzaW9uczwvaT4gZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlCisKKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT4uPC9wPgorCis8cD5TZWN1cml0eSBwZXJtaXNzaW9ucyBjYW4gYmUgcmV2b2tlZCBhbmQgZ3JhbnRlZCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgY2xhc3MgdmlhIGEKK25lc3RlZCA8Y29kZT5wZXJtaXNzaW9uczwvY29kZT4gZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlCiBzZWUgPGEgaHJlZj0iLi4vVHlwZXMvcGVybWlzc2lvbnMuaHRtbCI+cGVybWlzc2lvbnM8L2E+PC9wPgogCi08cD5TZXR0aW5ncyB3aWxsIGJlIGlnbm9yZWQgaWYgZm9yayBpcyBlbmFibGVkLjwvcD4KKzxwPlNldHRpbmdzIHdpbGwgYmUgaWdub3JlZCBpZiA8dmFyPmZvcms8L3Zhcj49PHE+dHJ1ZTwvcT4uPC9wPgogCi08cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvcD4KLSAKIDxoND5hc3NlcnRpb25zPC9oND4KIAotPHA+WW91IGNhbiBjb250cm9sIGVuYWJsZW1lbnQgb2YgSmF2YSAxLjQgYXNzZXJ0aW9ucyB3aXRoIGFuCi08YSBocmVmPSIuLi9UeXBlcy9hc3NlcnRpb25zLmh0bWwiPjx0dD4mbHQ7YXNzZXJ0aW9ucyZndDs8L3R0PjwvYT4KLXN1YmVsZW1lbnQuPC9wPgotIAotPHA+QXNzZXJ0aW9uIHN0YXRlbWVudHMgYXJlIGN1cnJlbnRseSBpZ25vcmVkIGluIG5vbi1mb3JrZWQgbW9kZS48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNjwvZW0+LjwvcD4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjYuPC9lbT48L3A+Cis8cD5Zb3UgY2FuIGNvbnRyb2wgZW5hYmxlbWVudCBvZiBKYXZhIDEuNCBhc3NlcnRpb25zIHdpdGgKK2FuIDxhIGhyZWY9Ii4uL1R5cGVzL2Fzc2VydGlvbnMuaHRtbCI+PGNvZGU+Jmx0O2Fzc2VydGlvbnMmZ3Q7PC9jb2RlPjwvYT4gc3ViZWxlbWVudC48L3A+CisKKzxwPkFzc2VydGlvbiBzdGF0ZW1lbnRzIGFyZSBjdXJyZW50bHkgaWdub3JlZCBpbiBub24tZm9ya2VkIG1vZGUuPC9wPgogCiA8aDQ+bW9kdWxlcGF0aDwvaDQ+CiAKLTxwPlRoZSBsb2NhdGlvbiBvZiBtb2R1bGVzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhpcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBBVEggbGlrZSBzdHJ1Y3R1cmU8L2E+Ljxici8+Ci1UaGUgbW9kdWxlcGF0aCByZXF1aXJlcyA8aT5mb3JrPC9pPiB0byBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCis8cD48ZW0+U2luY2UgQW50IDEuOS44PC9lbT48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS45Ljg8L2VtPjwvcD4KKzxwPlRoZSBsb2NhdGlvbiBvZiBtb2R1bGVzIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhpcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorc3RydWN0dXJlPC9hPi48YnIvPlRoZSA8Y29kZT5tb2R1bGVwYXRoPC9jb2RlPiByZXF1aXJlcyA8dmFyPmZvcms8L3Zhcj4gdG8gYmUgc2V0IHRvIDxxPnRydWU8L3E+LgogCiA8aDQ+dXBncmFkZW1vZHVsZXBhdGg8L2g0PgogCi08cD5UaGUgbG9jYXRpb24gb2YgbW9kdWxlcyB0aGF0IHJlcGxhY2UgdXBncmFkZWFibGUgbW9kdWxlcyBpbiB0aGUgcnVudGltZSBpbWFnZQotY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGlzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4uPGJyLz4KLVRoZSB1cGdyYWRlbW9kdWxlcGF0aCByZXF1aXJlcyA8aT5mb3JrPC9pPiB0byBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCis8cD48ZW0+U2luY2UgQW50IDEuOS44PC9lbT48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS45Ljg8L2VtPjwvcD4KKzxwPlRoZSBsb2NhdGlvbiBvZiBtb2R1bGVzIHRoYXQgcmVwbGFjZSB1cGdyYWRlYWJsZSBtb2R1bGVzIGluIHRoZSBydW50aW1lIGltYWdlIGNhbiBiZSBzcGVjaWZpZWQKK3VzaW5nIHRoaXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2UKK3N0cnVjdHVyZTwvYT4uPGJyLz5UaGUgPGNvZGU+dXBncmFkZW1vZHVsZXBhdGg8L2NvZGU+IHJlcXVpcmVzIDx2YXI+Zm9yazwvdmFyPiB0byBiZSBzZXQKK3RvIDxxPnRydWU8L3E+LjwvcD4KIAogPGg0PmZvcm1hdHRlcjwvaDQ+CiAKLTxwPlRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0cyBjYW4gYmUgcHJpbnRlZCBpbiBkaWZmZXJlbnQKLWZvcm1hdHMuIE91dHB1dCB3aWxsIGFsd2F5cyBiZSBzZW50IHRvIGEgZmlsZSwgdW5sZXNzIHlvdSBzZXQgdGhlCi08Y29kZT51c2VmaWxlPC9jb2RlPiBhdHRyaWJ1dGUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotVGhlIG5hbWUgb2YgdGhlIGZpbGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLW5hbWUgb2YgdGhlIHRlc3QgYW5kIGNhbiBiZSBzZXQgYnkgdGhlIDxjb2RlPm91dGZpbGU8L2NvZGU+IGF0dHJpYnV0ZQorPHA+VGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGNhbiBiZSBwcmludGVkIGluIGRpZmZlcmVudCBmb3JtYXRzLiBPdXRwdXQgd2lsbCBhbHdheXMgYmUgc2VudCB0byBhCitmaWxlLCB1bmxlc3MgeW91IHNldCB0aGUgPHZhcj51c2VmaWxlPC92YXI+IGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4uICBUaGUgbmFtZSBvZiB0aGUgZmlsZSBpcworZGV0ZXJtaW5lZCBieSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBhbmQgY2FuIGJlIHNldCBieSB0aGUgPHZhcj5vdXRmaWxlPC92YXI+IGF0dHJpYnV0ZQogb2YgPGNvZGU+Jmx0O3Rlc3QmZ3Q7PC9jb2RlPi48L3A+CiAKLTxwPlRoZXJlIGFyZSBmb3VyIHByZWRlZmluZWQgZm9ybWF0dGVycyAtIG9uZSBwcmludHMgdGhlIHRlc3QgcmVzdWx0cwotaW4gWE1MIGZvcm1hdCwgdGhlIG90aGVyIGVtaXRzIHBsYWluIHRleHQuICBUaGUgZm9ybWF0dGVyIG5hbWVkCi08Y29kZT5icmllZjwvY29kZT4gd2lsbCBvbmx5IHByaW50IGRldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0ZXN0Y2FzZXMKLXRoYXQgZmFpbGVkLCB3aGlsZSA8Y29kZT5wbGFpbjwvY29kZT4gZ2l2ZXMgYSBsaXR0bGUgc3RhdGlzdGljcyBsaW5lCi1mb3IgYWxsIHRlc3QgY2FzZXMuICBDdXN0b20gZm9ybWF0dGVycyB0aGF0IG5lZWQgdG8gaW1wbGVtZW50Ci08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4KKzxwPlRoZXJlIGFyZSBmb3VyIHByZWRlZmluZWQgZm9ybWF0dGVycyZtZGFzaDtvbmUgcHJpbnRzIHRoZSB0ZXN0IHJlc3VsdHMgaW4gWE1MIGZvcm1hdCwgdGhlIG90aGVyCitlbWl0cyBwbGFpbiB0ZXh0LiAgVGhlIGZvcm1hdHRlciBuYW1lZCA8cT5icmllZjwvcT4gd2lsbCBvbmx5IHByaW50IGRldGFpbGVkIGluZm9ybWF0aW9uIGZvciB0ZXN0CitjYXNlcyB0aGF0IGZhaWxlZCwgd2hpbGUgPHE+cGxhaW48L3E+IGdpdmVzIGEgbGl0dGxlIHN0YXRpc3RpY3MgbGluZSBmb3IgYWxsIHRlc3QgY2FzZXMuICBDdXN0b20KK2Zvcm1hdHRlcnMgdGhhdCBuZWVkIHRvCitpbXBsZW1lbnQgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPgogY2FuIGJlIHNwZWNpZmllZC48L3A+CiAKLTxwPklmIHlvdSB1c2UgdGhlIFhNTCBmb3JtYXR0ZXIsIGl0IG1heSBub3QgaW5jbHVkZSB0aGUgc2FtZSBvdXRwdXQKLXRoYXQgeW91ciB0ZXN0cyBoYXZlIHdyaXR0ZW4gYXMgc29tZSBjaGFyYWN0ZXJzIGFyZSBpbGxlZ2FsIGluIFhNTAotZG9jdW1lbnRzIGFuZCB3aWxsIGJlIGRyb3BwZWQuPC9wPgorPHA+SWYgeW91IHVzZSB0aGUgWE1MIGZvcm1hdHRlciwgaXQgbWF5IG5vdCBpbmNsdWRlIHRoZSBzYW1lIG91dHB1dCB0aGF0IHlvdXIgdGVzdHMgaGF2ZSB3cml0dGVuIGFzCitzb21lIGNoYXJhY3RlcnMgYXJlIGlsbGVnYWwgaW4gWE1MIGRvY3VtZW50cyBhbmQgd2lsbCBiZSBkcm9wcGVkLjwvcD4KIAotPHA+VGhlIGZvdXJ0aCBmb3JtYXR0ZXIgbmFtZWQgPGNvZGU+ZmFpbHVyZTwvY29kZT4gKHNpbmNlIEFudCAxLjguMCkgCi1jb2xsZWN0cyBhbGwgZmFpbGluZyA8Y29kZT50ZXN0WFhYKCk8L2NvZGU+Ci1tZXRob2RzIGFuZCBjcmVhdGVzIGEgbmV3IDxjb2RlPlRlc3RDYXNlPC9jb2RlPiB3aGljaCBkZWxlZ2F0ZXMgb25seSB0aGVzZQotZmFpbGluZyBtZXRob2RzLiBUaGUgbmFtZSBhbmQgdGhlIGxvY2F0aW9uIGNhbiBiZSBzcGVjaWZpZWQgdmlhIEphdmEgU3lzdGVtIHByb3BlcnR5IG9yIEFudCBwcm9wZXJ0eQotPGNvZGU+YW50Lmp1bml0LmZhaWx1cmVDb2xsZWN0b3I8L2NvZGU+LiBUaGUgdmFsdWUgaGFzIHRvIHBvaW50IHRvIHRoZSBkaXJlY3RvcnkgYW5kIAotdGhlIG5hbWUgb2YgdGhlIHJlc3VsdGluZyBjbGFzcyAod2l0aG91dCBzdWZmaXgpLiBJdCBkZWZhdWx0cyB0byA8aT5qYXZhLXRtcC1kaXI8L2k+L0ZhaWxlZFRlc3RzLjwvcD4KKzxwPlRoZSBmb3VydGggZm9ybWF0dGVyIG5hbWVkIDxxPmZhaWx1cmU8L3E+ICg8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4pIGNvbGxlY3RzIGFsbAorZmFpbGluZyA8Y29kZSBjbGFzcz0iY29kZSI+dGVzdFhYWCgpPC9jb2RlPiBtZXRob2RzIGFuZCBjcmVhdGVzIGEKK25ldyA8Y29kZSBjbGFzcz0iY29kZSI+VGVzdENhc2U8L2NvZGU+IHdoaWNoIGRlbGVnYXRlcyBvbmx5IHRoZXNlIGZhaWxpbmcgbWV0aG9kcy4gVGhlIG5hbWUgYW5kIHRoZQorbG9jYXRpb24gY2FuIGJlIHNwZWNpZmllZCB2aWEgSmF2YSBzeXN0ZW0gcHJvcGVydHkgb3IgQW50Citwcm9wZXJ0eSA8Y29kZT5hbnQuanVuaXQuZmFpbHVyZUNvbGxlY3RvcjwvY29kZT4uIFRoZSB2YWx1ZSBoYXMgdG8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeSBhbmQgdGhlCituYW1lIG9mIHRoZSByZXN1bHRpbmcgY2xhc3MgKHdpdGhvdXQgc3VmZml4KS4gSXQgZGVmYXVsdHMKK3RvIDxzYW1wPjxpPmphdmEtdG1wLWRpcjwvaT4vRmFpbGVkVGVzdHM8L3NhbXA+LjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VXNlIGEgcHJlZGVmaW5lZCBmb3JtYXR0ZXIgKGVpdGhlcgotICAgICAgPGNvZGU+eG1sPC9jb2RlPiwgPGNvZGU+cGxhaW48L2NvZGU+LCA8Y29kZT5icmllZjwvY29kZT4gb3IgPGNvZGU+ZmFpbHVyZTwvY29kZT4pLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5Vc2UgYSBwcmVkZWZpbmVkIGZvcm1hdHRlciAoZWl0aGVyIDxxPnhtbDwvcT4sIDxxPnBsYWluPC9xPiwgPHE+YnJpZWY8L3E+CisgICAgICBvciA8cT5mYWlsdXJlPC9xPikuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGN1c3RvbSBmb3JtYXR0ZXIgY2xhc3MuPC90ZD4KKyAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPk5hbWUgb2YgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4dGVuc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5FeHRlbnNpb24gdG8gYXBwZW5kIHRvIHRoZSBvdXRwdXQgZmlsZW5hbWUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLCBpZiA8Y29kZT5jbGFzc25hbWU8L2NvZGU+IGhhcyBiZWVuIHVzZWQuPC90ZD4KKyAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+RXh0ZW5zaW9uIHRvIGFwcGVuZCB0byB0aGUgb3V0cHV0IGZpbGVuYW1lLjwvdGQ+CisgICAgPHRkPlllcywgaWYgPHZhcj5jbGFzc25hbWU8L3Zhcj4gaGFzIGJlZW4gdXNlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZWZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Qm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvdXRwdXQgc2hvdWxkIGJlCi0gICAgICBzZW50IHRvIGEgZmlsZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICAgIDx0ZD51c2VmaWxlPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiB0aGF0IGRldGVybWluZXMgd2hldGhlciBvdXRwdXQgc2hvdWxkIGJlIHNlbnQgdG8gYSBmaWxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSB1c2UgZm9ybWF0dGVyIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+T25seSB1c2UgZm9ybWF0dGVyIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcworICAgICAgc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHVzZSBmb3JtYXR0ZXIgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIDxiPm5vdDwvYj4gc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgotICA8L3RyPiAgCisgICAgPHRkPnVubGVzczwvdGQ+CisgICAgPHRkPk9ubHkgdXNlIGZvcm1hdHRlciA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkKKyAgICAgIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNldDwvYT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgogPC90YWJsZT4KIAogPGg0PnRlc3Q8L2g0PgogCiA8cD5EZWZpbmVzIGEgc2luZ2xlIHRlc3QgY2xhc3MuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIHRlc3QgY2xhc3MuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1ldGhvZHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGVzdCBjYXNlIG1ldGhvZHMgdG8gZXhlY3V0ZS4KLSAgICAgIDxlbT5TaW5jZSAxLjguMjwvZW0+Ci0gICAgICA8cD5UaGUgPGNvZGU+bWV0aG9kczwvY29kZT4gYXR0cmlidXRlIGNhbiBiZSB1c2VmdWwgaW4gdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6PC9wPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgdGVzdCBjbGFzcy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1ldGhvZHM8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyBvZiB0ZXN0IGNhc2UgbWV0aG9kcyB0byBleGVjdXRlLiAgPGVtPlNpbmNlIDEuOC4yPC9lbT4KKyAgICAgIDxwPlRoZSA8dmFyPm1ldGhvZHM8L3Zhcj4gYXR0cmlidXRlIGNhbiBiZSB1c2VmdWwgaW4gdGhlIGZvbGxvd2lhbmcgc2NlbmFyaW9zOjwvcD4KICAgICAgIDx1bD4KLSAgICAgICAgPGxpPkEgdGVzdCBtZXRob2QgaGFzIGZhaWxlZCBhbmQgeW91IHdhbnQgdG8gcmUtcnVuIHRoZSB0ZXN0IG1ldGhvZAotICAgICAgICAgICAgdG8gdGVzdCBhIGZpeCBvciByZS1ydW4gdGhlIHRlc3QgdW5kZXIgdGhlIEphdmEgZGVidWdnZXIgd2l0aG91dAotICAgICAgICAgICAgaGF2aW5nIHRvIHdhaXQgZm9yIHRoZSBvdGhlciAocG9zc2libHkgbG9uZyBydW5uaW5nKSB0ZXN0IG1ldGhvZHMKLSAgICAgICAgICAgIHRvIGNvbXBsZXRlLjwvbGk+Ci0gICAgICAgIDxsaT5PbmUgb3IgbW9yZSB0ZXN0IG1ldGhvZHMgYXJlIHJ1bm5pbmcgc2xvd2VyIHRoYW4gZXhwZWN0ZWQgYW5kIHlvdQotICAgICAgICAgICAgd2FudCB0byByZS1ydW4gdGhlbSB1bmRlciBhIEphdmEgcHJvZmlsZXIgKHdpdGhvdXQgdGhlIG92ZXJoZWFkCi0gICAgICAgICAgICBvZiBydW5uaW5nIHRoZSBwcm9maWxlciB3aGlsc3Qgb3RoZXIgdGVzdCBtZXRob2RzIGFyZSBiZWluZwotICAgICAgICAgICAgZXhlY3V0ZWQpLjwvbGk+CisgICAgICAgIDxsaT5BIHRlc3QgbWV0aG9kIGhhcyBmYWlsZWQgYW5kIHlvdSB3YW50IHRvIHJlLXJ1biB0aGUgdGVzdCBtZXRob2QgdG8gdGVzdCBhIGZpeCBvciByZS1ydW4KKyAgICAgICAgICB0aGUgdGVzdCB1bmRlciB0aGUgSmF2YSBkZWJ1Z2dlciB3aXRob3V0IGhhdmluZyB0byB3YWl0IGZvciB0aGUgb3RoZXIgKHBvc3NpYmx5IGxvbmcKKyAgICAgICAgICBydW5uaW5nKSB0ZXN0IG1ldGhvZHMgdG8gY29tcGxldGUuPC9saT4KKyAgICAgICAgPGxpPk9uZSBvciBtb3JlIHRlc3QgbWV0aG9kcyBhcmUgcnVubmluZyBzbG93ZXIgdGhhbiBleHBlY3RlZCBhbmQgeW91IHdhbnQgdG8gcmUtcnVuIHRoZW0KKyAgICAgICAgICB1bmRlciBhIEphdmEgcHJvZmlsZXIgKHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHJ1bm5pbmcgdGhlIHByb2ZpbGVyIHdoaWxzdCBvdGhlciB0ZXN0CisgICAgICAgICAgbWV0aG9kcyBhcmUgYmVpbmcgZXhlY3V0ZWQpLjwvbGk+CiAgICAgICA8L3VsPgotICAgICAgPHA+SWYgdGhlIDxjb2RlPm1ldGhvZHM8L2NvZGU+IGF0dHJpYnV0ZSBpcyB1c2VkIGJ1dCBubyB0ZXN0IG1ldGhvZAotICAgICAgaXMgc3BlY2lmaWVkLCB0aGVuIG5vIHRlc3QgbWV0aG9kIGZyb20gdGhlIHN1aXRlIHdpbGwgYmUgZXhlY3V0ZWQuPC9wPgorICAgICAgPHA+SWYgdGhlIDx2YXI+bWV0aG9kczwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCBidXQgbm8gdGVzdCBtZXRob2QgaXMgc3BlY2lmaWVkLCB0aGVuIG5vIHRlc3QKKyAgICAgICAgbWV0aG9kIGZyb20gdGhlIHN1aXRlIHdpbGwgYmUgZXhlY3V0ZWQuPC9wPgogICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzIHRvIHJ1biBhbGwgdGVzdCBtZXRob2RzIGluIHRoZSBzdWl0ZS48L3RkPgotICA8L3RyPiAgCi0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcms8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UnVuIHRoZSB0ZXN0cyBpbiBhIHNlcGFyYXRlIFZNLgotICAgICAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyB0byBydW4gYWxsIHRlc3QgbWV0aG9kcyBpbiB0aGUgc3VpdGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHRlc3QKLSAgICAgICBydW4uIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLTx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9ycHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLgotICAgICAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aGFsdG9uZmFpbHVyZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgdGVzdCBmYWlscyAoZXJyb3JzIGFyZQotICAgICAgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS4gIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4KLSAgICAgIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gIDwvdHI+Ci08dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsdXJlcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZQotICAgICAgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS4gT3ZlcnJpZGVzIHZhbHVlIHNldCBpbgotICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLTwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbHRlcnRyYWNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbHRlciBvdXQgSnVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjawotICAgIHRyYWNlcy4gIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIDxjb2RlPm9uPC9jb2RlPi48L3RkPgorICAgIDx0ZD5mb3JrPC90ZD4KKyAgICA8dGQ+UnVuIHRoZSB0ZXN0cyBpbiBhIHNlcGFyYXRlIEpWTS4gIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EaXJlY3RvcnkgdG8gd3JpdGUgdGhlIHJlcG9ydHMgdG8uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZD5oYWx0b25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdGVzdCBydW4uIE92ZXJyaWRlcyB2YWx1ZSBzZXQKKyAgICAgICBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm91dGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QmFzZSBuYW1lIG9mIHRoZSB0ZXN0IHJlc3VsdC4gVGhlIGZ1bGwgZmlsZW5hbWUgaXMKLSAgICAgIGRldGVybWluZWQgYnkgdGhpcyBhdHRyaWJ1dGUgYW5kIHRoZSBleHRlbnNpb24gb2YKLSAgICAgIDxjb2RlPmZvcm1hdHRlcjwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGlzCi0gICAgICA8Y29kZT5URVNULTwvY29kZT48ZW0+bmFtZTwvZW0+LCB3aGVyZSA8ZW0+bmFtZTwvZW0+IGlzIHRoZSBuYW1lIG9mCi0gICAgICB0aGUgdGVzdCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5lcnJvcnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIGVycm9yLiAgT3ZlcnJpZGVzIHZhbHVlIHNldAorICAgICAgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHJ1biB0ZXN0IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmhhbHRvbmZhaWx1cmU8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgdGVzdCBmYWlscyAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiAgT3ZlcnJpZGVzCisgICAgICB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSBydW4gdGVzdCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgPGI+bm90PC9iPiBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmZhaWx1cmVwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcworICAgICAgd2VsbCkuIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5za2lwTm9uVGVzdHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RG8gbm90IHBhc3MgYW55IGNsYXNzZXMgdGhhdCBkbyBub3QgY29udGFpbiBKVW5pdCB0ZXN0cyB0byB0aGUgdGVzdCBydW5uZXIuCi0gICAgICAgICAgVGhpcyBwcmV2ZW50cyBub24gdGVzdHMgZnJvbSBhcHBlYXJpbmcgYXMgdGVzdCBlcnJvcnMgaW4gdGVzdCByZXN1bHRzLjxiciAvPgotICAgICAgICAgIFRlc3RzIGFyZSBpZGVudGlmaWVkIGJ5IGxvb2tpbmcgZm9yIHRoZSA8Y29kZT5AVGVzdDwvY29kZT4gYW5ub3RhdGlvbiBvbiBhbnkgbWV0aG9kcyBpbiBjb25jcmV0ZSBjbGFzc2VzCi0gICAgICAgICAgdGhhdCBkb24ndCBleHRlbmQgPGNvZGU+anVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlPC9jb2RlPiwgb3IgZm9yIHB1YmxpYy9wcm90ZWN0ZWQgbWV0aG9kcyB3aXRoCi0gICAgICAgICAgbmFtZXMgc3RhcnRpbmcgd2l0aCAndGVzdCcgaW4gY29uY3JldGUgY2xhc3NlcyB0aGF0IGV4dGVuZCA8Y29kZT5qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U8L2NvZGU+LgotICAgICAgICAgIENsYXNzZXMgbWFya2VkIHdpdGggdGhlIEpVbml0NCA8Y29kZT5vcmcuanVuaXQucnVubmVyLlJ1bldpdGg8L2NvZGU+IG9yCi0gICAgICAgICAgPGNvZGU+b3JnLmp1bml0LnJ1bm5lci5TdWl0ZS5TdWl0ZUNsYXNzZXM8L2NvZGU+IGFubm90YXRpb25zIGFyZSBhbHNvIHBhc3NlZCB0byBKVW5pdCBmb3IgZXhlY3V0aW9uLAotICAgICAgICAgIGFzIGlzIGFueSBjbGFzcyB3aXRoIGEgcHVibGljL3Byb3RlY3RlZCBuby1hcmd1bWVudCA8Y29kZT5zdWl0ZTwvY29kZT4gbWV0aG9kLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby4gRGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgIDx0ZD5maWx0ZXJ0cmFjZTwvdGQ+CisgICAgPHRkPkZpbHRlciBvdXQgSlVuaXQgYW5kIEFudCBzdGFjayBmcmFtZXMgZnJvbSBlcnJvciBhbmQgZmFpbHVyZSBzdGFjayB0cmFjZXMuICBPdmVycmlkZXMgdmFsdWUKKyAgICAgIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5vbjwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRvZGlyPC90ZD4KKyAgICA8dGQ+RGlyZWN0b3J5IHRvIHdyaXRlIHRoZSByZXBvcnRzIHRvLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b3V0ZmlsZTwvdGQ+CisgICAgPHRkPkJhc2UgbmFtZSBvZiB0aGUgdGVzdCByZXN1bHQuIFRoZSBmdWxsIGZpbGVuYW1lCisgICAgaXMgPHZhcj5vdXRmaWxlPC92YXI+Ljx2YXI+Zm9ybWF0dGVyPC92YXI+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxzYW1wPlRFU1QtPC9zYW1wPjx2YXI+bmFtZTwvdmFyPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aWY8L3RkPgorICAgIDx0ZD5Pbmx5IHJ1biB0ZXN0IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD51bmxlc3M8L3RkPgorICAgIDx0ZD5Pbmx5IHJ1biB0ZXN0IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eQorICAgIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNldDwvYT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNraXBOb25UZXN0czwvdGQ+CisgICAgPHRkPkRvIG5vdCBwYXNzIGFueSBjbGFzc2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gSlVuaXQgdGVzdHMgdG8gdGhlIHRlc3QgcnVubmVyLiAgVGhpcyBwcmV2ZW50cworICAgICAgbm9uIHRlc3RzIGZyb20gYXBwZWFyaW5nIGFzIHRlc3QgZXJyb3JzIGluIHRlc3QgcmVzdWx0cy48YnIvPlRlc3RzIGFyZSBpZGVudGlmaWVkIGJ5IGxvb2tpbmcKKyAgICAgIGZvciB0aGUgPGNvZGU+QFRlc3Q8L2NvZGU+IGFubm90YXRpb24gb24gYW55IG1ldGhvZHMgaW4gY29uY3JldGUgY2xhc3NlcyB0aGF0IGRvbid0CisgICAgICBleHRlbmQgPGNvZGU+anVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlPC9jb2RlPiwgb3IgZm9yIHB1YmxpYy9wcm90ZWN0ZWQgbWV0aG9kcyB3aXRoIG5hbWVzCisgICAgICBzdGFydGluZyB3aXRoIDxxPnRlc3Q8L3E+IGluIGNvbmNyZXRlIGNsYXNzZXMgdGhhdAorICAgICAgZXh0ZW5kIDxjb2RlPmp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTwvY29kZT4uICBDbGFzc2VzIG1hcmtlZCB3aXRoIHRoZSBKVW5pdAorICAgICAgNCA8Y29kZT5vcmcuanVuaXQucnVubmVyLlJ1bldpdGg8L2NvZGU+IG9yIDxjb2RlPm9yZy5qdW5pdC5ydW5uZXIuU3VpdGUuU3VpdGVDbGFzc2VzPC9jb2RlPgorICAgICAgYW5ub3RhdGlvbnMgYXJlIGFsc28gcGFzc2VkIHRvIEpVbml0IGZvciBleGVjdXRpb24sIGFzIGlzIGFueSBjbGFzcyB3aXRoIGEgcHVibGljL3Byb3RlY3RlZAorICAgICAgbm8tYXJndW1lbnQgPGNvZGU+c3VpdGUoKTwvY29kZT4gbWV0aG9kLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD5UZXN0cyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXR0ZXJzIHZpYSBuZXN0ZWQKLTxjb2RlPiZsdDtmb3JtYXR0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8cD5UZXN0cyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXR0ZXJzIHZpYSBuZXN0ZWQgPGNvZGU+Jmx0O2Zvcm1hdHRlciZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAogPGg0PmJhdGNodGVzdDwvaDQ+CiAKIDxwPkRlZmluZSBhIG51bWJlciBvZiB0ZXN0cyBiYXNlZCBvbiBwYXR0ZXJuIG1hdGNoaW5nLjwvcD4KIAotPHA+PGNvZGU+YmF0Y2h0ZXN0PC9jb2RlPiBjb2xsZWN0cyB0aGUgaW5jbHVkZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4gZnJvbSBhbnkgbnVtYmVyCi1vZiBuZXN0ZWQgPGEKLWhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy4gSXQgdGhlbgotZ2VuZXJhdGVzIGEgdGVzdCBjbGFzcyBuYW1lIGZvciBlYWNoIHJlc291cmNlIHRoYXQgZW5kcyBpbgotPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPi5jbGFzczwvY29kZT4uPC9wPgorPHA+PGNvZGU+YmF0Y2h0ZXN0PC9jb2RlPiBjb2xsZWN0cyB0aGUgaW5jbHVkZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4gZnJvbQorYW55IG51bWJlciBvZiBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+LiBJdCB0aGVuCitnZW5lcmF0ZXMgYSB0ZXN0IGNsYXNzIG5hbWUgZm9yIGVhY2ggcmVzb3VyY2UgdGhhdCBlbmRzIGluIDxzYW1wPi5qYXZhPC9zYW1wPgorb3IgPHNhbXA+LmNsYXNzPC9zYW1wPi48L3A+CiAKLTxwPkFueSB0eXBlIG9mIFJlc291cmNlIENvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQsCi1wcmlvciB0byBBbnQgMS43IG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbgotc3VwcG9ydGVkLjwvcD4KKzxwPkFueSB0eXBlIG9mIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQsIHByaW9yIHRvIEFudCAxLjcKK29ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzdXBwb3J0ZWQuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JrPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJ1biB0aGUgdGVzdHMgaW4gYSBzZXBhcmF0ZSBWTS4KLSAgICAgIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmhhbHRvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyB0aGUgdGVzdAotICAgICAgIHJ1bi4gT3ZlcnJpZGVzIHZhbHVlIHNldCBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuCi0gICAgICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5oYWx0b25mYWlsdXJlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYSB0ZXN0IGZhaWxzIChlcnJvcnMgYXJlCi0gICAgICBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiAgT3ZlcnJpZGVzIHZhbHVlIHNldCBpbgotICAgICAgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLTx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWx1cmVwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlCi0gICAgICAoZXJyb3JzIGFyZSBjb25zaWRlcmVkIGZhaWx1cmVzIGFzIHdlbGwpLiBPdmVycmlkZXMgdmFsdWUgc2V0IGluCi0gICAgICA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJ0cmFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5GaWx0ZXIgb3V0IEp1bml0IGFuZCBBbnQgc3RhY2sgZnJhbWVzIGZyb20gZXJyb3IgYW5kIGZhaWx1cmUgc3RhY2sKLSAgICB0cmFjZXMuICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vbjwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Zm9yazwvdGQ+CisgICAgPHRkPlJ1biB0aGUgdGVzdHMgaW4gYSBzZXBhcmF0ZSBKVk0uICBPdmVycmlkZXMgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RGlyZWN0b3J5IHRvIHdyaXRlIHRoZSByZXBvcnRzIHRvLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzsgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+aGFsdG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIHRlc3QgcnVuLiBPdmVycmlkZXMgdmFsdWUgc2V0CisgICAgICBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk9ubHkgcnVuIHRlc3RzIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuICBPdmVycmlkZXMgdmFsdWUgc2V0CisgICAgICBpbiA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHJ1biB0ZXN0cyA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5oYWx0b25mYWlsdXJlPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiBhIHRlc3QgZmFpbHMgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS4gIE92ZXJyaWRlcworICAgICAgdmFsdWUgc2V0IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5za2lwTm9uVGVzdHM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgcGFzcyBhbnkgY2xhc3NlcyB0aGF0IGRvIG5vdCBjb250YWluIEpVbml0IHRlc3RzIHRvIHRoZSB0ZXN0IHJ1bm5lci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcmV2ZW50cyBub24gdGVzdHMgZnJvbSBhcHBlYXJpbmcgYXMgdGVzdCBlcnJvcnMgaW4gdGVzdCByZXN1bHRzLjxiciAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0cyBhcmUgaWRlbnRpZmllZCBieSBsb29raW5nIGZvciB0aGUgPGNvZGU+QFRlc3Q8L2NvZGU+IGFubm90YXRpb24gb24gYW55IG1ldGhvZHMgaW4gY29uY3JldGUgY2xhc3NlcwotICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRvbid0IGV4dGVuZCA8Y29kZT5qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U8L2NvZGU+LCBvciBmb3IgcHVibGljL3Byb3RlY3RlZCBtZXRob2RzIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMgc3RhcnRpbmcgd2l0aCAndGVzdCcgaW4gY29uY3JldGUgY2xhc3NlcyB0aGF0IGV4dGVuZCA8Y29kZT5qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U8L2NvZGU+LgotICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2VzIG1hcmtlZCB3aXRoIHRoZSBKVW5pdDQgPGNvZGU+b3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoPC9jb2RlPiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5vcmcuanVuaXQucnVubmVyLlN1aXRlLlN1aXRlQ2xhc3NlczwvY29kZT4gYW5ub3RhdGlvbnMgYXJlIGFsc28gcGFzc2VkIHRvIEpVbml0IGZvciBleGVjdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGlzIGFueSBjbGFzcyB3aXRoIGEgcHVibGljL3Byb3RlY3RlZCBuby1hcmd1bWVudCA8Y29kZT5zdWl0ZTwvY29kZT4gbWV0aG9kLjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0IGlzIGZhbHNlLjwvdGQ+CisgICAgPHRkPmZhaWx1cmVwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IGluIHRoZSBldmVudCBvZiBhIGZhaWx1cmUgKGVycm9ycyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcworICAgICAgd2VsbCkuIE92ZXJyaWRlcyB2YWx1ZSBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmlsdGVydHJhY2U8L3RkPgorICAgIDx0ZD5GaWx0ZXIgb3V0IEpVbml0IGFuZCBBbnQgc3RhY2sgZnJhbWVzIGZyb20gZXJyb3IgYW5kIGZhaWx1cmUgc3RhY2sgdHJhY2VzLiAgT3ZlcnJpZGVzIHZhbHVlCisgICAgICBzZXQgaW4gPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b248L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50b2RpcjwvdGQ+CisgICAgPHRkPkRpcmVjdG9yeSB0byB3cml0ZSB0aGUgcmVwb3J0cyB0by48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyB0aGUgY3VycmVudCBkaXJlY3Rvcnk8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+T25seSBydW4gdGVzdHMgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzIHNldDwvYT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnVubGVzczwvdGQ+CisgICAgPHRkPk9ubHkgcnVuIHRlc3RzIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eQorICAgICAgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2tpcE5vblRlc3RzPC90ZD4KKyAgICA8dGQ+RG8gbm90IHBhc3MgYW55IGNsYXNzZXMgdGhhdCBkbyBub3QgY29udGFpbiBKVW5pdCB0ZXN0cyB0byB0aGUgdGVzdCBydW5uZXIuICBUaGlzIHByZXZlbnRzCisgICAgICBub24gdGVzdHMgZnJvbSBhcHBlYXJpbmcgYXMgdGVzdCBlcnJvcnMgaW4gdGVzdCByZXN1bHRzLjxici8+VGVzdHMgYXJlIGlkZW50aWZpZWQgYnkgbG9va2luZworICAgICAgZm9yIHRoZSA8Y29kZT5AVGVzdDwvY29kZT4gYW5ub3RhdGlvbiBvbiBhbnkgbWV0aG9kcyBpbiBjb25jcmV0ZSBjbGFzc2VzIHRoYXQgZG9uJ3QKKyAgICAgIGV4dGVuZCA8Y29kZT5qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U8L2NvZGU+LCBvciBmb3IgcHVibGljL3Byb3RlY3RlZCBtZXRob2RzIHdpdGggbmFtZXMKKyAgICAgIHN0YXJ0aW5nIHdpdGggPHE+dGVzdDwvcT4gaW4gY29uY3JldGUgY2xhc3NlcyB0aGF0CisgICAgICBleHRlbmQgPGNvZGU+anVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlPC9jb2RlPi4gIENsYXNzZXMgbWFya2VkIHdpdGggdGhlIEpVbml0CisgICAgICA0IDxjb2RlPm9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDwvY29kZT4gb3IgPGNvZGU+b3JnLmp1bml0LnJ1bm5lci5TdWl0ZS5TdWl0ZUNsYXNzZXM8L2NvZGU+CisgICAgICBhbm5vdGF0aW9ucyBhcmUgYWxzbyBwYXNzZWQgdG8gSlVuaXQgZm9yIGV4ZWN1dGlvbiwgYXMgaXMgYW55IGNsYXNzIHdpdGggYSBwdWJsaWMvcHJvdGVjdGVkCisgICAgICBuby1hcmd1bWVudCA8Y29kZT5zdWl0ZSgpPC9jb2RlPiBtZXRob2QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPkJhdGNodGVzdHMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0dGVycyB2aWEgbmVzdGVkCi08Y29kZT4mbHQ7Zm9ybWF0dGVyJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+QmF0Y2ggdGVzdHMgY2FuIGRlZmluZSB0aGVpciBvd24gZm9ybWF0dGVycyB2aWEgbmVzdGVkIDxjb2RlPiZsdDtmb3JtYXR0ZXImZ3Q7PC9jb2RlPgorZWxlbWVudHMuPC9wPgogCi08aDM+Rm9ya2VkIHRlc3RzIGFuZCA8Y29kZT50ZWFyRG93bjwvY29kZT48L2gzPgorPGgzPkZvcmtlZCB0ZXN0cyBhbmQgPGNvZGU+dGVhckRvd24oKTwvY29kZT48L2gzPgogCi08cD5JZiBhIGZvcmtlZCB0ZXN0IHJ1bnMgaW50byBhIHRpbWVvdXQsIEFudCB3aWxsIHRlcm1pbmF0ZSB0aGUgSmF2YQotICBWTSBwcm9jZXNzIGl0IGhhcyBjcmVhdGVkLCB3aGljaCBwcm9iYWJseSBtZWFucyB0aGUKLSAgdGVzdCdzIDxjb2RlPnRlYXJEb3duPC9jb2RlPiBtZXRob2Qgd2lsbCBuZXZlciBiZSBjYWxsZWQuICBUaGUgc2FtZQotICBpcyB0cnVlIGlmIHRoZSBmb3JrZWQgVk0gY3Jhc2hlcyBmb3Igc29tZSBvdGhlciByZWFzb24uPC9wPgorPHA+SWYgYSBmb3JrZWQgdGVzdCBydW5zIGludG8gYSB0aW1lb3V0LCBBbnQgd2lsbCB0ZXJtaW5hdGUgdGhlIEpWTSBwcm9jZXNzIGl0IGhhcyBjcmVhdGVkLCB3aGljaAorcHJvYmFibHkgbWVhbnMgdGhlIHRlc3QncyA8Y29kZSBjbGFzcz0iY29kZSI+dGVhckRvd24oKTwvY29kZT4gbWV0aG9kIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiAgVGhlCitzYW1lIGlzIHRydWUgaWYgdGhlIGZvcmtlZCBKVk0gY3Jhc2hlcyBmb3Igc29tZSBvdGhlciByZWFzb24uPC9wPgogCi08cD5TdGFydGluZyB3aXRoIEFudCAxLjguMCwgYSBzcGVjaWFsIGZvcm1hdHRlciBpcyBkaXN0cmlidXRlZCB3aXRoCi0gIEFudCB0aGF0IHRyaWVzIHRvIGxvYWQgdGhlIHRlc3RjYXNlIHRoYXQgd2FzIGluIHRoZSBmb3JrZWQgVk0gYW5kCi0gIGludm9rZSB0aGF0IGNsYXNzJyA8Y29kZT50ZWFyRG93bjwvY29kZT4gbWV0aG9kLiAgVGhpcyBmb3JtYXR0ZXIgaGFzCi0gIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6PC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LCBhIHNwZWNpYWwgZm9ybWF0dGVyIGlzIGRpc3RyaWJ1dGVkIHdpdGggQW50IHRoYXQgdHJpZXMgdG8gbG9hZCB0aGUKK3Rlc3RjYXNlIHRoYXQgd2FzIGluIHRoZSBmb3JrZWQgSlZNIGFuZCBpbnZva2UgdGhhdCBjbGFzcycgPGNvZGUgY2xhc3M9ImNvZGUiPnRlYXJEb3duKCk8L2NvZGU+CittZXRob2QuICBUaGlzIGZvcm1hdHRlciBoYXMgdGhlIGZvbGxvd2luZyBsaW1pdGF0aW9uczo8L3A+CiAKIDx1bD4KLSAgPGxpPkl0IHJ1bnMgaW4gdGhlIHNhbWUgSmF2YSBWTSBhcyBBbnQgaXRzZWxmLCB0aGlzIGlzIGEgZGlmZmVyZW50Ci0gICAgSmF2YSBWTSB0aGFuIHRoZSBvbmUgdGhhdCB3YXMgZXhlY3V0aW5nIHRoZSB0ZXN0IGFuZCBpdCBtYXkgc2VlIGEKLSAgICBkaWZmZXJlbnQgY2xhc3Nsb2FkZXIgKGFuZCB0aHVzIG1heSBiZSB1bmFibGUgdG8gbG9hZCB0aGUgdGVzdAorICA8bGk+SXQgcnVucyBpbiB0aGUgc2FtZSBKVk0gYXMgQW50IGl0c2VsZiwgdGhpcyBpcyBhIGRpZmZlcmVudCBKVk0gdGhhbiB0aGUgb25lIHRoYXQgd2FzIGV4ZWN1dGluZworICAgIHRoZSB0ZXN0IGFuZCBpdCBtYXkgc2VlIGEgZGlmZmVyZW50IGNsYXNzbG9hZGVyIChhbmQgdGh1cyBtYXkgYmUgdW5hYmxlIHRvIGxvYWQgdGhlIHRlc3QKICAgICBjbGFzcykuPC9saT4KLSAgPGxpPkl0IGNhbm5vdCBkZXRlcm1pbmUgd2hpY2ggdGVzdCB3YXMgcnVuIHdoZW4gdGhlIHRpbWVvdXQvY3Jhc2gKLSAgICBvY2N1cnJlZCBpZiB0aGUgZm9ya2VkIFZNIHdhcyBydW5uaW5nIG11bHRpcGxlIHRlc3QuICBJLmUuIHRoZQotICAgIGZvcm1hdHRlciBjYW5ub3Qgd29yayB3aXRoIGFueSA8Y29kZT5mb3JrTW9kZTwvY29kZT4gb3RoZXIKLSAgICB0aGFuIDxjb2RlPnBlclRlc3Q8L2NvZGU+IGFuZCBpdCB3b24ndCBkbyBhbnl0aGluZyBpZiB0aGUgdGVzdAotICAgIGNsYXNzIGNvbnRhaW5zIGEgPGNvZGU+c3VpdGUoKTwvY29kZT4gbWV0aG9kLjwvbGk+CisgIDxsaT5JdCBjYW5ub3QgZGV0ZXJtaW5lIHdoaWNoIHRlc3Qgd2FzIHJ1biB3aGVuIHRoZSB0aW1lb3V0L2NyYXNoIG9jY3VycmVkIGlmIHRoZSBmb3JrZWQgSlZNIHdhcworICAgIHJ1bm5pbmcgbXVsdGlwbGUgdGVzdHMuICBJLmUuIHRoZSBmb3JtYXR0ZXIgY2Fubm90IHdvcmsgd2l0aCBhbnkgPHZhcj5mb3JrTW9kZTwvdmFyPiBvdGhlcgorICAgIHRoYW4gPHE+cGVyVGVzdDwvcT4gYW5kIGl0IHdvbid0IGRvIGFueXRoaW5nIGlmIHRoZSB0ZXN0IGNsYXNzIGNvbnRhaW5zCisgICAgYSA8Y29kZSBjbGFzcz0iY29kZSI+c3VpdGUoKTwvY29kZT4gbWV0aG9kLjwvbGk+CiA8L3VsPgogCi08cD5JZiB0aGUgZm9ybWF0dGVyIHJlY29nbml6ZXMgYW4gaW5jb21wYXRpYmxlIDxjb2RlPmZvcmtNb2RlPC9jb2RlPgotICBvciBhIDxjb2RlPnN1aXRlPC9jb2RlPiBtZXRob2Qgb3IgZmFpbHMgdG8gbG9hZCB0aGUgdGVzdCBjbGFzcyBpdAotICB3aWxsIHNpbGVudGx5IGRvIG5vdGhpbmcuPC9wPgorPHA+SWYgdGhlIGZvcm1hdHRlciByZWNvZ25pemVzIGFuIGluY29tcGF0aWJsZSA8dmFyPmZvcmtNb2RlPC92YXI+IG9yCithIDxjb2RlIGNsYXNzPSJjb2RlIj5zdWl0ZSgpPC9jb2RlPiBtZXRob2Qgb3IgZmFpbHMgdG8gbG9hZCB0aGUgdGVzdCBjbGFzcyBpdCB3aWxsIHNpbGVudGx5IGRvCitub3RoaW5nLjwvcD4KIAotPHA+VGhlIGZvcm1hdHRlciBkb2Vzbid0IGhhdmUgYW55IGVmZmVjdCBvbiB0ZXN0cyB0aGF0IHdlcmUgbm90Ci0gIGZvcmtlZCBvciBkaWRuJ3QgY2F1c2UgdGltZW91dHMgb3IgVk0gY3Jhc2hlcy48L3A+Cis8cD5UaGUgZm9ybWF0dGVyIGRvZXNuJ3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRlc3RzIHRoYXQgd2VyZSBub3QgZm9ya2VkIG9yIGRpZG4ndCBjYXVzZSB0aW1lb3V0cyBvcgorSlZNIGNyYXNoZXMuPC9wPgogCiA8cD5UbyBlbmFibGUgdGhlIGZvcm1hdHRlciwgYWRkIGEgPGNvZGU+Zm9ybWF0dGVyPC9jb2RlPiBsaWtlPC9wPgogCkBAIC02OTcsNzcgKzYxOSw3MCBAQAogCiA8cD50byB5b3VyIDxjb2RlPmp1bml0PC9jb2RlPiB0YXNrLjwvcD4KIAotPGgzPjxhIG5hbWU9ImVuYWJsZXRlc3RsaXN0ZW5lcmV2ZW50cyI+PGNvZGU+YW50Lmp1bml0LmVuYWJsZXRlc3RsaXN0ZW5lcmV2ZW50czwvY29kZT48L2E+Ci0gIG1hZ2ljIHByb3BlcnR5PC9oMz4KKzxoMyBpZD0iZW5hYmxldGVzdGxpc3RlbmVyZXZlbnRzIj48Y29kZT5hbnQuanVuaXQuZW5hYmxldGVzdGxpc3RlbmVyZXZlbnRzPC9jb2RlPiBtYWdpYyBwcm9wZXJ0eTwvaDM+CiAKLTxwPjxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPiB0aGUgPGNvZGU+ZW5hYmxlVGVzdExpc3RlbmVyRXZlbnRzPC9jb2RlPgotICBhdHRyaWJ1dGUgb2YgdGhlIHRhc2sgY29udHJvbHMgd2hldGhlciBmaW5lIGdyYWluZWQgbG9nZ2luZyBtZXNzYWdlcwotICB3aWxsIGJlIHNlbnQgdG8gdGhlIHRhc2sncyB2ZXJib3NlIGxvZy4gIEluIGFkZGl0aW9uIHRvIHRoaXMKLSAgYXR0cmlidXRlIEFudCB3aWxsIGNvbnN1bHQgdGhlCi0gIHByb3BlcnR5IDxjb2RlPmFudC5qdW5pdC5lbmFibGV0ZXN0bGlzdGVuZXJldmVudHM8L2NvZGU+IGFuZCB0aGUKLSAgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG92ZXJyaWRlcyB0aGUgc2V0dGluZyBvZiB0aGUgYXR0cmlidXRlLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPiB0aGUgPHZhcj5lbmFibGVUZXN0TGlzdGVuZXJFdmVudHM8L3Zhcj4gYXR0cmlidXRlIG9mIHRoZSB0YXNrIGNvbnRyb2xzCit3aGV0aGVyIGZpbmUgZ3JhaW5lZCBsb2dnaW5nIG1lc3NhZ2VzIHdpbGwgYmUgc2VudCB0byB0aGUgdGFzaydzIHZlcmJvc2UgbG9nLiAgSW4gYWRkaXRpb24gdG8gdGhpcworYXR0cmlidXRlIEFudCB3aWxsIGNvbnN1bHQgdGhlIHByb3BlcnR5IDxjb2RlPmFudC5qdW5pdC5lbmFibGV0ZXN0bGlzdGVuZXJldmVudHM8L2NvZGU+IGFuZCB0aGUKK3ZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvdmVycmlkZXMgdGhlIHNldHRpbmcgb2YgdGhlIGF0dHJpYnV0ZS48L3A+CiAKLTxwPlRoaXMgcHJvcGVydHkgZXhpc3RzIHNvIHRoYXQgY29udGFpbmVycyBydW5uaW5nIEFudCB0aGF0IGRlcGVuZCBvbgotICB0aGUgYWRkaXRpb25hbCBsb2dnaW5nIGV2ZW50cyBjYW4gZW5zdXJlIHRoZXkgd2lsbCBiZSBnZW5lcmF0ZWQgZXZlbgotICBpZiB0aGUgYnVpbGQgZmlsZSBkaXNhYmxlcyB0aGVtLjwvcD4KKzxwPlRoaXMgcHJvcGVydHkgZXhpc3RzIHNvIHRoYXQgY29udGFpbmVycyBydW5uaW5nIEFudCB0aGF0IGRlcGVuZCBvbiB0aGUgYWRkaXRpb25hbCBsb2dnaW5nIGV2ZW50cworY2FuIGVuc3VyZSB0aGV5IHdpbGwgYmUgZ2VuZXJhdGVkIGV2ZW4gaWYgdGhlIGJ1aWxkIGZpbGUgZGlzYWJsZXMgdGhlbS48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKKzxwPlJ1biB0aGUgdGVzdCBkZWZpbmVkIGluIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIHRoZSBzYW1lIFZNLiBObyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQKK3VubGVzcyB0aGUgdGVzdCBmYWlscy48L3A+CiA8cHJlPgogJmx0O2p1bml0Jmd0OwotICAmbHQ7dGVzdCBuYW1lPSJteS50ZXN0LlRlc3RDYXNlIi8mZ3Q7Ci0mbHQ7L2p1bml0Jmd0OwotPC9wcmU+CisgICAgJmx0O3Rlc3QgbmFtZT0ibXkudGVzdC5UZXN0Q2FzZSIvJmd0OworJmx0Oy9qdW5pdCZndDs8L3ByZT4KIAotPHA+UnVucyB0aGUgdGVzdCBkZWZpbmVkIGluIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIHRoZSBzYW1lCi1WTS4gTm8gb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkIHVubGVzcyB0aGUgdGVzdCBmYWlscy48L3A+Ci0KKzxwPlJ1biB0aGUgdGVzdCBkZWZpbmVkIGluIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIGEgc2VwYXJhdGUgSlZNLiBBdCB0aGUgZW5kIG9mIHRoZSB0ZXN0LAorYSBvbmUtbGluZSBzdW1tYXJ5IHdpbGwgYmUgcHJpbnRlZC4gQSBkZXRhaWxlZCByZXBvcnQgb2YgdGhlIHRlc3QgY2FuIGJlIGZvdW5kCitpbiA8c2FtcD5URVNULW15LnRlc3QuVGVzdENhc2UudHh0PC9zYW1wPi4gVGhlIGJ1aWxkIHByb2Nlc3Mgd2lsbCBiZSBzdG9wcGVkIGlmIHRoZSB0ZXN0IGZhaWxzLjwvcD4KIDxwcmU+CiAmbHQ7anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGZvcms9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiZndDsKLSAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIvJmd0OwotICAmbHQ7dGVzdCBuYW1lPSJteS50ZXN0LlRlc3RDYXNlIi8mZ3Q7Ci0mbHQ7L2p1bml0Jmd0OwotPC9wcmU+CisgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIvJmd0OworICAgICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiLyZndDsKKyZsdDsvanVuaXQmZ3Q7PC9wcmU+CiAKLTxwPlJ1bnMgdGhlIHRlc3QgZGVmaW5lZCBpbiA8Y29kZT5teS50ZXN0LlRlc3RDYXNlPC9jb2RlPiBpbiBhCi1zZXBhcmF0ZSBWTS4gIEF0IHRoZSBlbmQgb2YgdGhlIHRlc3QsIGEgb25lLWxpbmUgc3VtbWFyeSB3aWxsIGJlCi1wcmludGVkLiBBIGRldGFpbGVkIHJlcG9ydCBvZiB0aGUgdGVzdCBjYW4gYmUgZm91bmQgaW4KLTxjb2RlPlRFU1QtbXkudGVzdC5UZXN0Q2FzZS50eHQ8L2NvZGU+LiBUaGUgYnVpbGQgcHJvY2VzcyB3aWxsIGJlCi1zdG9wcGVkIGlmIHRoZSB0ZXN0IGZhaWxzLjwvcD4KLQorPHA+UnVuIDxjb2RlPm15LnRlc3QuVGVzdENhc2U8L2NvZGU+IGluIHRoZSBzYW1lIEpWTSwgaWdub3JpbmcgdGhlIGdpdmVuIDxjb2RlPkNMQVNTUEFUSDwvY29kZT47Citvbmx5IGEgd2FybmluZyBpcyBwcmludGVkIGlmIHRoaXMgdGVzdCBmYWlscy4gSW4gYWRkaXRpb24gdG8gdGhlIHBsYWluIHRleHQgdGVzdCByZXN1bHRzLCBmb3IgdGhpcwordGVzdCBhIFhNTCByZXN1bHQgd2lsbCBiZSBvdXRwdXQgdG8gPHNhbXA+cmVzdWx0LnhtbDwvc2FtcD4uIFRoZW4sIGZvciBlYWNoIG1hdGNoaW5nIGZpbGUgaW4gdGhlCitkaXJlY3RvcnkgZGVmaW5lZCBmb3IgPHNhbXA+JHtzcmMudGVzdHN9PC9zYW1wPiwgYSB0ZXN0IGlzIHJ1biBpbiBhIHNlcGFyYXRlIEpWTS4gSWYgYSB0ZXN0IGZhaWxzLAordGhlIGJ1aWxkIHByb2Nlc3MgaXMgYWJvcnRlZC4gUmVzdWx0cyBhcmUgY29sbGVjdGVkIGluIGZpbGVzCituYW1lZCA8c2FtcD5URVNULTwvc2FtcD48dmFyPm5hbWU8L3Zhcj48c2FtcD4udHh0PC9zYW1wPiBhbmQgd3JpdHRlbgordG8gPHNhbXA+JHtyZXBvcnRzLnRlc3RzfTwvc2FtcD4uPC9wPgogPHByZT4KICZsdDtqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ieWVzIiZndDsKLSAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7Ci0gICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvJmd0OwotICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKIAotICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8mZ3Q7CisgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIvJmd0OwogCi0gICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiIGhhbHRvbmZhaWx1cmU9Im5vIiBvdXRmaWxlPSJyZXN1bHQiJmd0OwotICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0ieG1sIi8mZ3Q7Ci0gICZsdDsvdGVzdCZndDsKKyAgICAmbHQ7dGVzdCBuYW1lPSJteS50ZXN0LlRlc3RDYXNlIiBoYWx0b25mYWlsdXJlPSJubyIgb3V0ZmlsZT0icmVzdWx0IiZndDsKKyAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJ4bWwiLyZndDsKKyAgICAmbHQ7L3Rlc3QmZ3Q7CiAKLSAgJmx0O2JhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke3JlcG9ydHMudGVzdHN9IiZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLnRlc3RzfSImZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSIqKi8qVGVzdCouamF2YSIvJmd0OwotICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0iKiovQWxsVGVzdHMuamF2YSIvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9iYXRjaHRlc3QmZ3Q7Ci0mbHQ7L2p1bml0Jmd0OwotPC9wcmU+CisgICAgJmx0O2JhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke3JlcG9ydHMudGVzdHN9IiZndDsKKyAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyYy50ZXN0c30iJmd0OworICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iKiovKlRlc3QqLmphdmEiLyZndDsKKyAgICAgICAgICAgICZsdDtleGNsdWRlIG5hbWU9IioqL0FsbFRlc3RzLmphdmEiLyZndDsKKyAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDsvYmF0Y2h0ZXN0Jmd0OworJmx0Oy9qdW5pdCZndDs8L3ByZT4KIAotPHA+UnVucyA8Y29kZT5teS50ZXN0LlRlc3RDYXNlPC9jb2RlPiBpbiB0aGUgc2FtZSBWTSwgaWdub3JpbmcgdGhlCi1naXZlbiBDTEFTU1BBVEg7IG9ubHkgYSB3YXJuaW5nIGlzIHByaW50ZWQgaWYgdGhpcyB0ZXN0IGZhaWxzLiBJbgotYWRkaXRpb24gdG8gdGhlIHBsYWluIHRleHQgdGVzdCByZXN1bHRzLCBmb3IgdGhpcyB0ZXN0IGEgWE1MIHJlc3VsdAotd2lsbCBiZSBvdXRwdXQgdG8gPGNvZGU+cmVzdWx0LnhtbDwvY29kZT4uICAKLVRoZW4sIGZvciBlYWNoIG1hdGNoaW5nIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSBkZWZpbmVkIGZvcgotPGNvZGU+JHtzcmMudGVzdHN9PC9jb2RlPiBhCi10ZXN0IGlzIHJ1biBpbiBhIHNlcGFyYXRlIFZNLiBJZiBhIHRlc3QgZmFpbHMsIHRoZSBidWlsZCBwcm9jZXNzIGlzCi1hYm9ydGVkLiBSZXN1bHRzIGFyZSBjb2xsZWN0ZWQgaW4gZmlsZXMgbmFtZWQKLTxjb2RlPlRFU1QtPC9jb2RlPjxlbT5uYW1lPC9lbT48Y29kZT4udHh0PC9jb2RlPiBhbmQgd3JpdHRlbiB0bwotPGNvZGU+JHtyZXBvcnRzLnRlc3RzfTwvY29kZT4uPC9wPgotCis8cD5PbiB0aGUgZmlyc3QgcnVuLCBhbGwgdGVzdHMgYXJlIGNvbGxlY3RlZCB2aWEgdGhlIDxjb2RlPiZsdDtiYXRjaHRlc3QvJmd0OzwvY29kZT4KK2VsZW1lbnQuIEl0cyA8dmFyPnBsYWluPC92YXI+IGZvcm1hdHRlciBzaG93cyB0aGUgb3V0cHV0IG9uIHRoZSBjb25zb2xlLiBUaGUgPHZhcj5mYWlsdXJlPC92YXI+Citmb3JtYXR0ZXIgY3JlYXRlcyBhIEphdmEgc291cmNlIGZpbGUgaW4gPHNhbXA+JHtidWlsZC5kaXJ9L2ZhaWxpbmdUZXN0cy9GYWlsZWRUZXN0cy5qYXZhPC9zYW1wPgord2hpY2ggZXh0ZW5kcyA8Y29kZSBjbGFzcz0iY29kZSI+anVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlPC9jb2RlPiBhbmQgcmV0dXJucyBmcm9tCithIDxjb2RlIGNsYXNzPSJjb2RlIj5zdWl0ZSgpPC9jb2RlPiBtZXRob2QgYSB0ZXN0IHN1aXRlIGZvciB0aGUgZmFpbGluZyB0ZXN0cy48YnIvPk9uIGEgc2Vjb25kIHJ1bgordGhlIGNvbGxlY3RvciBjbGFzcyBleGlzdHMgYW5kIGluc3RlYWQgb2YgdGhlIDxjb2RlPiZsdDtiYXRjaHRlc3QvJmd0OzwvY29kZT4gdGhlCitzaW5nbGUgPGNvZGU+Jmx0O3Rlc3QvJmd0OzwvY29kZT4gd2lsbCBydW4uIFNvIG9ubHkgdGhlIGZhaWxpbmcgdGVzdCBjYXNlcyBhcmUgcmUtcnVuLiBUaGUgdHdvCituZXN0ZWQgZm9ybWF0dGVycyBhcmUgZm9yIGRpc3BsYXlpbmcgKGZvciB0aGUgdXNlcikgYW5kIGZvciB1cGRhdGluZyB0aGUgY29sbGVjdG9yIGNsYXNzLjwvcD4KIDxwcmU+CiAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7dGVzdCZxdW90OyZndDsKICAgICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtjb2xsZWN0b3IuZGlyJnF1b3Q7IHZhbHVlPSZxdW90OyR7YnVpbGQuZGlyfS9mYWlsaW5nVGVzdHMmcXVvdDsvJmd0OwpAQCAtNzc2LDcgKzY5MSw3IEBACiAgICAgJmx0O2RlbGV0ZSZndDsKICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7Y29sbGVjdG9yLmRpcn0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7JHtjb2xsZWN0b3IuY2xhc3N9Ki5jbGFzcyZxdW90Oy8mZ3Q7CiAgICAgJmx0Oy9kZWxldGUmZ3Q7Ci0gICAgJmx0OyEtLSBjb21waWxlIHRoZSBGYWlsZWRUZXN0cyBjbGFzcyBpZiBwcmVzZW50IC0tJmd0OyAKKyAgICAmbHQ7IS0tIGNvbXBpbGUgdGhlIEZhaWxlZFRlc3RzIGNsYXNzIGlmIHByZXNlbnQgLS0mZ3Q7CiAgICAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske2NvbGxlY3Rvci5kaXJ9JnF1b3Q7IGRlc3RkaXI9JnF1b3Q7JHtjb2xsZWN0b3IuZGlyfSZxdW90Oy8mZ3Q7CiAgICAgJmx0O2F2YWlsYWJsZSBmaWxlPSZxdW90OyR7Y29sbGVjdG9yLmRpcn0vJHtjb2xsZWN0b3IuY2xhc3N9LmNsYXNzJnF1b3Q7IHByb3BlcnR5PSZxdW90O2hhc0ZhaWxpbmdUZXN0cyZxdW90Oy8mZ3Q7CiAgICAgJmx0O2p1bml0IGhhbHRvbmVycm9yPSZxdW90O2ZhbHNlJnF1b3Q7IGhhbHRvbmZhaWx1cmU9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7CkBAIC03OTgsNjAgKzcxMyw1MiBAQAogICAgICAgICAgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSZxdW90O3BsYWluJnF1b3Q7IHVzZWZpbGU9JnF1b3Q7ZmFsc2UmcXVvdDsvJmd0OwogICAgICAgICAmbHQ7L3Rlc3QmZ3Q7CiAgICAgJmx0Oy9qdW5pdCZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+Ci08cD5PbiB0aGUgZmlyc3QgcnVuIGFsbCB0ZXN0cyBhcmUgY29sbGVjdGVkIHZpYSB0aGUgPGNvZGU+Jmx0O2JhdGNodGVzdC8mZ3Q7PC9jb2RlPgotZWxlbWVudC4gSXRzIDxjb2RlPnBsYWluPC9jb2RlPiBmb3JtYXR0ZXIgc2hvd3MgdGhlIG91dHB1dCBvbiB0aGUgY29uc29sZS4gVGhlCi08Y29kZT5mYWlsdXJlPC9jb2RlPiBmb3JtYXR0ZXIgY3JlYXRlcyBhIGphdmEgc291cmNlIGZpbGUgaW4gCi08Y29kZT4ke2J1aWxkLmRpcn0vZmFpbGluZ1Rlc3RzL0ZhaWxlZFRlc3RzLmphdmE8L2NvZGU+IHdoaWNoIGV4dGVuZHMgCi08Y29kZT5qdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U8L2NvZGU+IGFuZCByZXR1cm5zIGZyb20gYSA8Y29kZT5zdWl0ZSgpPC9jb2RlPgotbWV0aG9kIGEgdGVzdCBzdWl0ZSBmb3IgdGhlIGZhaWxpbmcgdGVzdHMuIDxici8+Ci1PbiBhIHNlY29uZCBydW4gdGhlIGNvbGxlY3RvciBjbGFzcyBleGlzdHMgYW5kIGluc3RlYWQgb2YgdGhlIDxjb2RlPiZsdDtiYXRjaHRlc3QvJmd0OzwvY29kZT4KLXRoZSBzaW5nbGUgPGNvZGU+Jmx0O3Rlc3QvJmd0OzwvY29kZT4gd2lsbCBydW4uIFNvIG9ubHkgdGhlIGZhaWxpbmcgdGVzdCBjYXNlcyBhcmUgcmUtcnVuLgotVGhlIHR3byBuZXN0ZWQgZm9ybWF0dGVycyBhcmUgZm9yIGRpc3BsYXlpbmcgKGZvciB0aGUgdXNlcikgYW5kIGZvciB1cGRhdGluZyB0aGUgY29sbGVjdG9yCi1jbGFzcy4KLTwvcD4KKyZsdDsvdGFyZ2V0Jmd0OzwvcHJlPgorCis8cD5SdW4gPGNvZGU+bXkudGVzdC5UZXN0Q2FzZTwvY29kZT4gYXMgYSB3aGl0ZS1ib3ggdGVzdCBpbiB0aGUgZm9ya2VkIEpWTSBnaXZlbiBieQordGhlIDxjb2RlPnBsYXRmb3JtLmphdmE8L2NvZGU+IHByb3BlcnR5LiBUaGUgSlVuaXQgbGlicmFyeSBpcyBhIHBhcnQgb2YgYW4gdW5uYW1lZCBtb2R1bGUgd2hpbGUgdGhlCit0ZXN0ZWQgcHJvamVjdCBhbmQgcmVxdWlyZWQgbW9kdWxlcyBhcmUgb24gdGhlIG1vZHVsZSBwYXRoLiBUaGUgdGVzdHMgZG8gbm90IGhhdmUgbW9kdWxlLWluZm8gZmlsZQorYW5kIGFyZSBleGVjdXRlZCBpbiB0aGUgcHJvamVjdCBtb2R1bGUgZ2l2ZW4gYnkgPGNvZGU+bW9kdWxlLm5hbWU8L2NvZGU+Citwcm9wZXJ0eS48YnIvPlRoZSA8a2JkPi0tcGF0Y2gtbW9kdWxlPC9rYmQ+IEphdmEgb3B0aW9uIGV4ZWN1dGVzIHRoZSB0ZXN0cyBidWlsdAoraW50byA8c2FtcD4ke2J1aWxkLnRlc3QuY2xhc3Nlc308L3NhbXA+IGluIGEgbW9kdWxlIGdpdmVuIGJ5IDxjb2RlPm1vZHVsZS5uYW1lPC9jb2RlPgorcHJvcGVydHkuPGJyLz5UaGUgPGtiZD4tLWFkZC1tb2R1bGVzPC9rYmQ+IEphdmEgb3B0aW9uIGVuYWJsZXMgdGhlIHRlc3RlZAorbW9kdWxlLjxici8+VGhlIDxrYmQ+LS1hZGQtcmVhZHM8L2tiZD4gSmF2YSBvcHRpb24gbWFrZXMgdGhlIHVubmFtZWQgbW9kdWxlIGNvbnRhaW5pbmcgSlVuaXQKK3JlYWRhYmxlIGJ5IHRlc3RlZCBtb2R1bGUuPGJyLz5UaGUgPGtiZD4tLWFkZC1leHBvcnRzPC9rYmQ+IEphdmEgb3B0aW9uIG1ha2VzIHRoZSBub24tZXhwb3J0ZWQgdGVzdAorcGFja2FnZSA8Y29kZT5teS50ZXN0PC9jb2RlPiBhY2Nlc3NpYmxlIGZyb20gdGhlIHVubmFtZWQgbW9kdWxlIGNvbnRhaW5pbmcgSlVuaXQuPC9wPgogPHByZT4KLSAgICAmbHQ7anVuaXQgZm9yaz0idHJ1ZSIKLSAgICAgICAganZtPSIke3BsYXRmb3JtLmphdmF9IiZndDsKLSAgICAgICAgJmx0O2p2bWFyZyBsaW5lPSItLXBhdGNoLW1vZHVsZSAke21vZHVsZS5uYW1lfT0ke2J1aWxkLnRlc3QuY2xhc3Nlc30iLyZndDsKLSAgICAgICAgJmx0O2p2bWFyZyBsaW5lPSItLWFkZC1tb2R1bGVzICR7bW9kdWxlLm5hbWV9Ii8mZ3Q7Ci0gICAgICAgICZsdDtqdm1hcmcgbGluZT0iLS1hZGQtcmVhZHMgJHttb2R1bGUubmFtZX09QUxMLVVOTkFNRUQiLyZndDsKLSAgICAgICAgJmx0O2p2bWFyZyBsaW5lPSItLWFkZC1leHBvcnRzICR7bW9kdWxlLm5hbWV9L215LnRlc3Q9QUxMLVVOTkFNRUQiLyZndDsKLSAgICAgICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2xpYnMuanVuaXR9Ii8mZ3Q7Ci0gICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OwotICAgICAgICAmbHQ7bW9kdWxlcGF0aCZndDsKLSAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke21vZHVsZXN9OiR7YnVpbGQuY2xhc3Nlc30iLyZndDsKLSAgICAgICAgJmx0Oy9tb2R1bGVwYXRoJmd0OwotICAgICAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8mZ3Q7Ci0gICAgICAgICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiLyZndDsKLSAgICAmbHQ7L2p1bml0Jmd0OwotPC9wcmU+Ci08cD5SdW5zIG15LnRlc3QuVGVzdENhc2UgYXMgYSB3aGl0ZS1ib3ggdGVzdCBpbiB0aGUgZm9ya2VkIFZNIGdpdmVuIGJ5IHRoZSA8Y29kZT5wbGF0Zm9ybS5qYXZhPC9jb2RlPiBwcm9wZXJ0eS4KLVRoZSBqdW5pdCBsaWJyYXJ5IGlzIGEgcGFydCBvZiBhbiB1bm5hbWVkIG1vZHVsZSB3aGlsZSB0aGUgdGVzdGVkIHByb2plY3QgYW5kIHJlcXVpcmVkIG1vZHVsZXMgYXJlIG9uIHRoZSBtb2R1bGUgcGF0aC4gVGhlIHRlc3RzCi1kbyBub3QgaGF2ZSBtb2R1bGUtaW5mbyBmaWxlIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIHByb2plY3QgbW9kdWxlIGdpdmVuIGJ5IDxjb2RlPm1vZHVsZS5uYW1lPC9jb2RlPiBwcm9wZXJ0eS48YnIvPgotVGhlIDxjb2RlPi0tcGF0Y2gtbW9kdWxlPC9jb2RlPiBqYXZhIG9wdGlvbiBleGVjdXRlcyB0aGUgdGVzdHMgYnVpbHQgaW50byA8Y29kZT4ke2J1aWxkLnRlc3QuY2xhc3Nlc308L2NvZGU+IGluIGEgbW9kdWxlIGdpdmVuCi1ieSA8Y29kZT5tb2R1bGUubmFtZTwvY29kZT4gcHJvcGVydHkuPGJyLz4KLVRoZSA8Y29kZT4tLWFkZC1tb2R1bGVzPC9jb2RlPiBqYXZhIG9wdGlvbiBlbmFibGVzIHRoZSB0ZXN0ZWQgbW9kdWxlLjxici8+Ci1UaGUgPGNvZGU+LS1hZGQtcmVhZHM8L2NvZGU+IGphdmEgb3B0aW9uIG1ha2VzIHRoZSB1bm5hbWVkIG1vZHVsZSBjb250YWluaW5nIHRoZSBqdW5pdCByZWFkYWJsZSBieSB0ZXN0ZWQgbW9kdWxlLjxici8+Ci1UaGUgPGNvZGU+LS1hZGQtZXhwb3J0czwvY29kZT4gamF2YSBvcHRpb24gbWFrZXMgdGhlIG5vbi1leHBvcnRlZCB0ZXN0IHBhY2thZ2UgPGNvZGU+bXkudGVzdDwvY29kZT4gYWNjZXNzaWJsZSBmcm9tIHRoZSB1bm5hbWVkIG1vZHVsZSBjb250YWluaW5nIHRoZSBqdW5pdC48YnIvPgorJmx0O2p1bml0IGZvcms9InRydWUiCisgICAgICAganZtPSIke3BsYXRmb3JtLmphdmF9IiZndDsKKyAgICAmbHQ7anZtYXJnIGxpbmU9Ii0tcGF0Y2gtbW9kdWxlICR7bW9kdWxlLm5hbWV9PSR7YnVpbGQudGVzdC5jbGFzc2VzfSIvJmd0OworICAgICZsdDtqdm1hcmcgbGluZT0iLS1hZGQtbW9kdWxlcyAke21vZHVsZS5uYW1lfSIvJmd0OworICAgICZsdDtqdm1hcmcgbGluZT0iLS1hZGQtcmVhZHMgJHttb2R1bGUubmFtZX09QUxMLVVOTkFNRUQiLyZndDsKKyAgICAmbHQ7anZtYXJnIGxpbmU9Ii0tYWRkLWV4cG9ydHMgJHttb2R1bGUubmFtZX0vbXkudGVzdD1BTEwtVU5OQU1FRCIvJmd0OworICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke2xpYnMuanVuaXR9Ii8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICAgJmx0O21vZHVsZXBhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke21vZHVsZXN9OiR7YnVpbGQuY2xhc3Nlc30iLyZndDsKKyAgICAmbHQ7L21vZHVsZXBhdGgmZ3Q7CisgICAgJmx0O2Zvcm1hdHRlciB0eXBlPSJwbGFpbiIvJmd0OworICAgICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiLyZndDsKKyZsdDsvanVuaXQmZ3Q7PC9wcmU+CisKKzxwPlJ1biA8Y29kZT5teS50ZXN0LlRlc3RDYXNlPC9jb2RlPiBhcyBhIGJsYWNrLWJveCB0ZXN0IGluIHRoZSBmb3JrZWQgSlZNIGdpdmVuIGJ5Cit0aGUgPGNvZGU+cGxhdGZvcm0uamF2YTwvY29kZT4gcHJvcGVydHkuIFRoZSBKVW5pdCBsaWJyYXJ5IGlzIHVzZWQgYXMgYW4gYXV0b21hdGljIG1vZHVsZS4gVGhlCit0ZXN0cycgbW9kdWxlLWluZm8gcmVxdWlyZXMgdGhlIHRlc3RlZCBtb2R1bGUgYW5kIEpVbml0Ljxici8+VGhlIDxrYmQ+LS1hZGQtbW9kdWxlczwva2JkPiBKYXZhCitvcHRpb24gZW5hYmxlcyB0aGUgdGVzdCBtb2R1bGUuPGJyLz5UaGUgPGtiZD4tLWFkZC1leHBvcnRzPC9rYmQ+IEphdmEgb3B0aW9uIG1ha2VzIHRoZSBub24tZXhwb3J0ZWQKK3Rlc3QgcGFja2FnZSA8Y29kZT5teS50ZXN0PC9jb2RlPiBhY2Nlc3NpYmxlIGZyb20gdGhlIEpVbml0IG1vZHVsZSBhbmQgQW50J3MgdGVzdCBydW5uZXIuIEFub3RoZXIKK3Bvc3NpYmlsaXR5IGlzIHRvIGV4cG9ydCB0aGUgdGVzdCBwYWNrYWdlIGluIHRoZSB0ZXN0cycgbW9kdWxlLWluZm8gYnkgPGNvZGU+ZXhwb3J0cyBteS50ZXN0PC9jb2RlPgorZGlyZWN0aXZlLjwvcD4KIDxwcmU+Ci0gICAgJmx0O2p1bml0IGZvcms9InRydWUiCi0gICAgICAgIGp2bT0iJHtwbGF0Zm9ybS5qYXZhfSImZ3Q7Ci0gICAgICAgICZsdDtqdm1hcmcgbGluZT0iLS1hZGQtbW9kdWxlcyAke3Rlc3QubW9kdWxlLm5hbWV9Ii8mZ3Q7Ci0gICAgICAgICZsdDtqdm1hcmcgbGluZT0iLS1hZGQtZXhwb3J0cyAke3Rlc3QubW9kdWxlLm5hbWV9L215LnRlc3Q9anVuaXQsQUxMLVVOTkFNRUQiLyZndDsKLSAgICAgICAgJmx0O21vZHVsZXBhdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHttb2R1bGVzfToke2J1aWxkLmNsYXNzZXN9OiR7bGlicy5qdW5pdH0iLyZndDsKLSAgICAgICAgJmx0Oy9tb2R1bGVwYXRoJmd0OwotICAgICAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8mZ3Q7Ci0gICAgICAgICZsdDt0ZXN0IG5hbWU9Im15LnRlc3QuVGVzdENhc2UiLyZndDsKLSAgICAmbHQ7L2p1bml0Jmd0OwotPC9wcmU+Ci08cD5SdW5zIG15LnRlc3QuVGVzdENhc2UgYXMgYSBibGFjay1ib3ggdGVzdCBpbiB0aGUgZm9ya2VkIFZNIGdpdmVuIGJ5IHRoZSA8Y29kZT5wbGF0Zm9ybS5qYXZhPC9jb2RlPiBwcm9wZXJ0eS4KLVRoZSBqdW5pdCBsaWJyYXJ5IGlzIHVzZWQgYXMgYW4gYXV0b21hdGljIG1vZHVsZS4gVGhlIHRlc3RzIG1vZHVsZS1pbmZvIHJlcXVpcmVzIHRoZSB0ZXN0ZWQgbW9kdWxlIGFuZCBqdW5pdC48YnIvPgotVGhlIDxjb2RlPi0tYWRkLW1vZHVsZXM8L2NvZGU+IGphdmEgb3B0aW9uIGVuYWJsZXMgdGhlIHRlc3QgbW9kdWxlLjxici8+Ci1UaGUgPGNvZGU+LS1hZGQtZXhwb3J0czwvY29kZT4gamF2YSBvcHRpb24gbWFrZXMgdGhlIG5vbi1leHBvcnRlZCB0ZXN0IHBhY2thZ2UgPGNvZGU+bXkudGVzdDwvY29kZT4gYWNjZXNzaWJsZSBmcm9tIHRoZSBqdW5pdCBtb2R1bGUgYW5kIEFudCdzIHRlc3QgcnVubmVyLgotQW5vdGhlciBwb3NzaWJpbGl0eSBpcyB0byBleHBvcnQgdGhlIHRlc3QgcGFja2FnZSBpbiB0aGUgdGVzdHMgbW9kdWxlLWluZm8gYnkgPGNvZGU+ZXhwb3J0cyBteS50ZXN0PC9jb2RlPiBkaXJlY3RpdmUuPGJyLz4KKyZsdDtqdW5pdCBmb3JrPSJ0cnVlIgorICAgICAgIGp2bT0iJHtwbGF0Zm9ybS5qYXZhfSImZ3Q7CisgICAgJmx0O2p2bWFyZyBsaW5lPSItLWFkZC1tb2R1bGVzICR7dGVzdC5tb2R1bGUubmFtZX0iLyZndDsKKyAgICAmbHQ7anZtYXJnIGxpbmU9Ii0tYWRkLWV4cG9ydHMgJHt0ZXN0Lm1vZHVsZS5uYW1lfS9teS50ZXN0PWp1bml0LEFMTC1VTk5BTUVEIi8mZ3Q7CisgICAgJmx0O21vZHVsZXBhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke21vZHVsZXN9OiR7YnVpbGQuY2xhc3Nlc306JHtsaWJzLmp1bml0fSIvJmd0OworICAgICZsdDsvbW9kdWxlcGF0aCZndDsKKyAgICAmbHQ7Zm9ybWF0dGVyIHR5cGU9InBsYWluIi8mZ3Q7CisgICAgJmx0O3Rlc3QgbmFtZT0ibXkudGVzdC5UZXN0Q2FzZSIvJmd0OworJmx0Oy9qdW5pdCZndDs8L3ByZT4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9qdW5pdGxhdW5jaGVyLmh0bWwgYi9tYW51YWwvVGFza3MvanVuaXRsYXVuY2hlci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZDlmY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tYW51YWwvVGFza3MvanVuaXRsYXVuY2hlci5odG1sCkBAIC0wLDAgKzEsNzc0IEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICAgIDx0aXRsZT5KVW5pdExhdW5jaGVyIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzxoMiBpZD0ianVuaXRsYXVuY2hlciI+SlVuaXRMYXVuY2hlcjwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorCis8cD4KKyAgICBUaGlzIHRhc2sgYWxsb3dzIHRlc3RzIHRvIGJlIGxhdW5jaGVkIGFuZCBydW4gdXNpbmcgdGhlIEpVbml0IDUgZnJhbWV3b3JrLgorPC9wPgorPHA+CisgICAgSlVuaXQgNSBpbnRyb2R1Y2VkIGEgbmV3ZXIgc2V0IG9mIEFQSXMgdG8gd3JpdGUgYW5kIGxhdW5jaCB0ZXN0cy4gSXQgYWxzbyBpbnRyb2R1Y2VkIHRoZSBjb25jZXB0CisgICAgb2YgdGVzdCBlbmdpbmVzLiBUZXN0IGVuZ2luZXMgZGVjaWRlIHdoaWNoIGNsYXNzZXMgYXJlIGNvbnNpZGVyZWQgYXMgdGVzdGNhc2VzIGFuZCBob3cgdGhleSBhcmUKKyAgICBleGVjdXRlZC4gSlVuaXQgNSBzdXBwb3J0cyBydW5uaW5nIHRlc3RzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gdXNpbmcgSlVuaXQgNCBjb25zdHJ1Y3RzIGFzIHdlbGwKKyAgICBhcyB0ZXN0cyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHVzaW5nIEpVbml0IDUgY29uc3RydWN0cy4gIEZvciBtb3JlIGRldGFpbHMgYWJvdXQgSlVuaXQgNQorICAgIGl0c2VsZiwgcGxlYXNlIHJlZmVyIHRvIHRoZSBKVW5pdCA1IHByb2plY3QncyBkb2N1bWVudGF0aW9uCisgICAgYXQgPGEgaHJlZj0iaHR0cHM6Ly9qdW5pdC5vcmcvanVuaXQ1LyI+aHR0cHM6Ly9qdW5pdC5vcmcvanVuaXQ1LzwvYT4uCis8L3A+Cis8cD4KKyAgICBUaGUgZ29hbCBvZiB0aGlzIDxjb2RlPmp1bml0bGF1bmNoZXI8L2NvZGU+IHRhc2sgaXMgdG8gYWxsb3cgbGF1bmNoaW5nIHRoZSBKVW5pdCA1IHRlc3QgbGF1bmNoZXIKKyAgICBhbmQgYnVpbGRpbmcgdGhlIHRlc3QgcmVxdWVzdHMgc28gdGhhdCB0aGUgc2VsZWN0ZWQgdGVzdHMgY2FuIHRoZW4gYmUgcGFyc2VkIGFuZCBleGVjdXRlZCBieSB0aGUKKyAgICB0ZXN0IGVuZ2luZShzKSBzdXBwb3J0ZWQgYnkgSlVuaXQgNS4gVGhpcyB0YXNrIGluIGl0c2VsZiBkb2VzIDxpPm5vdDwvaT4gdW5kZXJzdGFuZCB3aGF0IGEgdGVzdAorICAgIGNhc2UgaXMgbm9yIGRvZXMgaXQgZXhlY3V0ZSB0aGUgdGVzdHMgaXRzZWxmLgorPC9wPgorPHA+CisgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBcGFjaGUgQW50CisgICAgZGlzdHJpYnV0aW9uLiBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IKKyAgICBtb3JlIGluZm9ybWF0aW9uLgorPC9wPgorPHA+CisgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgbXVzdCBoYXZlIHRoZSBuZWNlc3NhcnkgSlVuaXQgNSBsaWJyYXJpZXMgaW4gdGhlIGNsYXNzcGF0aCBvZiB0aGUKKyAgICB0ZXN0cy4gQXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGlzIGRvY3VtZW50YXRpb24sIHRoZSBsaXN0IG9mIEpVbml0IDUgcGxhdGZvcm0gbGlicmFyaWVzIHRoYXQKKyAgICBhcmUgbmVjZXNzYXJ5IHRvIHJ1biB0aGUgdGVzdHMgYXJlOgorPC9wPgorCis8dWwgaWQ9Imp1bml0LXBsYXRmb3JtLWxpYnJhcmllcyI+CisgICAgPGxpPgorICAgICAgICA8c2FtcD5qdW5pdC1wbGF0Zm9ybS1jb21tb25zLmphcjwvc2FtcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPHNhbXA+anVuaXQtcGxhdGZvcm0tZW5naW5lLmphcjwvc2FtcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPHNhbXA+anVuaXQtcGxhdGZvcm0tbGF1bmNoZXIuamFyPC9zYW1wPgorICAgIDwvbGk+CisgICAgPGxpPgorICAgICAgICA8c2FtcD5vcGVudGVzdDRqLmphcjwvc2FtcD4KKyAgICA8L2xpPgorPC91bD4KKworPHA+CisgICAgRGVwZW5kaW5nIG9uIHRoZSB0ZXN0IGVuZ2luZShzKSB0aGF0IHlvdSB3YW50IHRvIHVzZSBpbiB5b3VyIHRlc3RzLCB5b3Ugd2lsbCBmdXJ0aGVyIG5lZWQgdGhlCisgICAgZm9sbG93aW5nIGxpYnJhcmllcyBpbiB0aGUgY2xhc3NwYXRoCis8L3A+CisKKzxwIGlkPSJqdW5pdC12aW50YWdlLWVuZ2luZS1saWJyYXJpZXMiPgorICAgIEZvciA8cT5qdW5pdC12aW50YWdlPC9xPiBlbmdpbmU6Cis8L3A+CisKKzx1bD4KKyAgICA8bGk+CisgICAgICAgIDxzYW1wPmp1bml0LXZpbnRhZ2UtZW5naW5lLmphcjwvc2FtcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPHNhbXA+anVuaXQuamFyPC9zYW1wPiAoSlVuaXQgNC54IHZlcnNpb24pCisgICAgPC9saT4KKzwvdWw+CisKKzxwIGlkPSJqdW5pdC1qdXBpdGVyLWVuZ2luZS1saWJyYXJpZXMiPgorICAgIEZvciA8cT5qdW5pdC1qdXBpdGVyPC9xPiBlbmdpbmU6Cis8L3A+CisKKzx1bD4KKyAgICA8bGk+CisgICAgICAgIDxzYW1wPmp1bml0LWp1cGl0ZXItYXBpLmphcjwvc2FtcD4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPHNhbXA+anVuaXQtanVwaXRlci1lbmdpbmUuamFyPC9zYW1wPgorICAgIDwvbGk+Cis8L3VsPgorCis8cD4KKyAgICBUbyBoYXZlIHRoZXNlIGluIHRoZSB0ZXN0IGNsYXNzcGF0aCwgeW91IGNhbiBmb2xsb3cgPGVtPmVpdGhlcjwvZW0+IG9mIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2hlczoKKzwvcD4KKworPHVsIGlkPSJzZXR1cCI+CisgICAgPGxpIGlkPSJzZXR1cC1yZWNvbW1lbmRlZCI+PGI+UmVjb21tZW5kZWQgYXBwcm9hY2ggc2luY2UgQW50IDEuMTAuNjwvYj46IFBsYWNlIHRoZSA8c2FtcD5hbnQtanVuaXRsYXVuY2hlci5qYXI8L3NhbXA+IGluIDxzYW1wPkFOVF9IT01FL2xpYjwvc2FtcD4gZGlyZWN0b3J5CisgICAgYW5kIHVzZSB0aGUgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZQorICAgIHRoZSByZXN0IG9mIHRoZSBKVW5pdCBzcGVjaWZpYyBqYXJzIChub3RlZCBhYm92ZSkuIFBsZWFzZSByZWFkIHRoZQorICAgIDxhIGhyZWY9I25lc3RlZC1jbGFzc3BhdGg+dXNpbmcgY2xhc3NwYXRoIGVsZW1lbnQ8L2E+IHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscy48L2xpPgorCisgICAgPGxpPk9SIFB1dCBhbGwgdGhlc2UgcmVsZXZhbnQgamFycyBhbG9uZyB3aXRoIHRoZSA8c2FtcD5hbnQtanVuaXRsYXVuY2hlci5qYXI8L3NhbXA+CisgICAgICAgIGluIDxzYW1wPkFOVF9IT01FL2xpYjwvc2FtcD4gZGlyZWN0b3J5PC9saT4KKworICAgIDxsaT5PUiBQdXQgPHNhbXA+YW50LWp1bml0bGF1bmNoZXIuamFyPC9zYW1wPiBpbiB0aGUgPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPiBkaXJlY3RvcnkgYW5kCisgICAgICAgIGluY2x1ZGUgYWxsIG90aGVyIHJlbGV2YW50IGphcnMgaW4gdGhlIGNsYXNzcGF0aCBieSBwYXNzaW5nIHRoZW0gYXMgYSA8a2JkPi1saWI8L2tiZD4KKyAgICAgICAgb3B0aW9uLCB3aGlsZSBpbnZva2luZyBBbnQ8L2xpPgorPC91bD4KKworPHA+CisgICAgVGVzdHMgYXJlIGRlZmluZWQgYnkgbmVzdGVkIGVsZW1lbnRzIGxpa2UgPGNvZGU+dGVzdDwvY29kZT4sIDxjb2RlPnRlc3RjbGFzc2VzPC9jb2RlPiB0YWdzCisgICAgKHNlZSA8YSBocmVmPSIjbmVzdGVkIj5uZXN0ZWQgZWxlbWVudHM8L2E+KS4KKzwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+aW5jbHVkZVRhZ3M8L3RkPgorICAgICAgICA8dGQ+QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiA8YSBocmVmPSJodHRwczovL2p1bml0Lm9yZy9qdW5pdDUvZG9jcy9jdXJyZW50L3VzZXItZ3VpZGUvI3dyaXRpbmctdGVzdHMtYW5ub3RhdGlvbnMiPkpVbml0IDUgdGFnczwvYT4sIGRlc2NyaWJpbmcgdGhlIHRlc3RzIHRvIGluY2x1ZGUuCisgICAgICAgICAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuNzwvZW0+PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+ZXhjbHVkZVRhZ3M8L3RkPgorICAgICAgICA8dGQ+QSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiA8YSBocmVmPSJodHRwczovL2p1bml0Lm9yZy9qdW5pdDUvZG9jcy9jdXJyZW50L3VzZXItZ3VpZGUvI3dyaXRpbmctdGVzdHMtYW5ub3RhdGlvbnMiPkpVbml0IDUgdGFnczwvYT4sIGRlc2NyaWJpbmcgdGhlIHRlc3RzIHRvIGV4Y2x1ZGUuCisgICAgICAgICAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuNzwvZW0+PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+aGFsdE9uRmFpbHVyZTwvdGQ+CisgICAgICAgIDx0ZD5BIHZhbHVlIG9mIDxxPnRydWU8L3E+IGltcGxpZXMgdGhhdCBidWlsZCBoYXMgdG8gc3RvcCBpZiBhbnkgZmFpbHVyZSBvY2N1cnMgaW4gYW55IG9mCisgICAgICAgICAgICB0aGUgdGVzdHMuIEpVbml0IDQrIGNsYXNzaWZpZXMgZmFpbHVyZXMgYXMgYm90aCBhc3NlcnRpb24gZmFpbHVyZXMgYXMgd2VsbCBhcyBleGNlcHRpb25zCisgICAgICAgICAgICB0aGF0IGdldCB0aHJvd24gZHVyaW5nIHRlc3QgZXhlY3V0aW9uLiBBcyBzdWNoLCB0aGlzIHRhc2sgdG9vIGNvbnNpZGVycyBib3RoIHRoZXNlIGNhc2VzCisgICAgICAgICAgICBhcyBmYWlsdXJlcyBhbmQgZG9lc24ndCBkaXN0aW5ndWlzaCBvbmUgZnJvbSBhbm90aGVyLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmZhaWx1cmVQcm9wZXJ0eTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlCisgICAgICAgICAgICAoZXhjZXB0aW9ucyBpbiB0ZXN0cyBhcmUgY29uc2lkZXJlZCBmYWlsdXJlcyBhcyB3ZWxsKS4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPnByaW50U3VtbWFyeTwvdGQ+CisgICAgICAgIDx0ZD5JZiB0aGUgdmFsdWUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IHRoZW4gdGhpcyB0YXNrLCB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIHRlc3QgZXhlY3V0aW9uLAorICAgICAgICAgICAgcHJpbnRzIHRoZSBzdW1tYXJ5IG9mIHRoZSBleGVjdXRpb24gdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4uIFRoZSBzdW1tYXJ5IGl0c2VsZiBpcyBnZW5lcmF0ZWQKKyAgICAgICAgICAgIGJ5IHRoZSBKVW5pdCA1IHBsYXRmb3JtIGFuZCBub3QgYnkgdGhpcyB0YXNrLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgICAgPC90cj4KKzwvdGFibGU+CisKKzxoMyBpZD0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2gzPgorCis8aDQgaWQ9Im5lc3RlZC1jbGFzc3BhdGgiPmNsYXNzcGF0aDwvaDQ+Cis8cD4KKyAgICBUaGUgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IHRoYXQgcmVwcmVzZW50cworICAgIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRhc2sgdG8gdXNlCisgICAgdGhpcyBjbGFzc3BhdGggZm9yIGZpbmRpbmcgYW5kIHJ1bm5pbmcgdGhlIHRlc3RzLiBUaGlzIGNsYXNzcGF0aCB3aWxsIGJlIHVzZWQgZm9yOgorPC9wPgorPHVsPgorICAgIDxsaT5GaW5kaW5nIHRoZSB0ZXN0IGNsYXNzZXMgdG8gZXhlY3V0ZTwvbGk+CisgICAgPGxpPkZpbmRpbmcgdGVzdCBlbmdpbmVzIHRoYXQgcnVuIHRoZSB0ZXN0czwvbGk+CisgICAgPGxpPklmIDxhIGhyZWY9IiNzZXR1cC1yZWNvbW1lbmRlZCI+Y29uZmlndXJlZCB0byBkbyBzbzwvYT4sIGZpbmRpbmcgYWxsIG5lY2Vzc2FyeSBKVW5pdCBsaWJyYXJpZXM8L2xpPgorPC91bD4KKzxwPgorICAgIElmIHRoZSA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnQgaXNuJ3QgY29uZmlndXJlZCBmb3IgdGhlIHRhc2ssIHRoZW4gdGhlIGNsYXNzcGF0aCBvZiBBbnQKKyAgICBpdHNlbGYgd2lsbCBiZSB1c2VkIGZvciBmaW5kaW5nIHRoZSB0ZXN0IGNsYXNzZXMgYW5kIHRoZSBKVW5pdCBsaWJyYXJpZXMuCis8L3A+CisKKzxwPgorICAgIEJlbG93IGlzIGFuIGV4YW1wbGUgb2Ygc2V0dGluZyB1cCB0aGUgY2xhc3NwYXRoIHRvIGluY2x1ZGUgdGhlIEp1cGl0ZXIgdGVzdCBlbmdpbmUgYW5kCisgICAgdGhlIEpVbml0IHBsYXRmb3JtIGxpYnJhcmllcyBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMuCis8L3A+CisgICAgPHByZT4KKyZsdDtwcm9qZWN0Jmd0OworCisgICAgJmx0O3Byb3BlcnR5IG5hbWU9Im91dHB1dC5kaXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2J1aWxkIi8mZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9InNyYy50ZXN0LmRpciIgdmFsdWU9IiR7YmFzZWRpcn0vc3JjL3Rlc3QiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3Nlcy5kaXIiIHZhbHVlPSIke291dHB1dC5kaXJ9L2NsYXNzZXMiLyZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iaW5pdCImZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7b3V0cHV0LmRpcn0iLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDtwYXRoIGlkPSJqdW5pdC5wbGF0Zm9ybS5saWJzLmNsYXNzcGF0aCImZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtiYXNlZGlyfS9zcmMvbGliL2p1bml0LXBsYXRmb3JtLyIvJmd0OworICAgICZsdDsvcGF0aCZndDsKKworICAgICZsdDtwYXRoIGlkPSJqdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGgiJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0vc3JjL2xpYi9qdXBpdGVyLyIvJmd0OworICAgICZsdDsvcGF0aCZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZS10ZXN0IiBkZXBlbmRzPSJpbml0IiZndDsKKyAgICAgICAgJmx0O21rZGlyIGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLyZndDsKKyAgICAgICAgJmx0O2phdmFjIHNyY2Rpcj0iJHtzcmMudGVzdC5kaXJ9IgorICAgICAgICAgICBkZXN0ZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSImZ3Q7CisgICAgICAgICAgICZsdDshLS0gb3VyIHRlc3RzIG9ubHkgbmVlZCBKVW5pdCBKdXBpdGVyIGVuZ2luZQorICAgICAgICAgICBsaWJyYXJpZXMgaW4gb3VyIGNvbXBpbGUgY2xhc3NwYXRoIGZvciB0aGUgdGVzdHMgLS0mZ3Q7CisgICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9Imp1bml0LmVuZ2luZS5qdXBpdGVyLmNsYXNzcGF0aCIvJmd0OworICAgICAgICAmbHQ7L2phdmFjJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJjb21waWxlLXRlc3QiJmd0OworICAgICAgICAmbHQ7anVuaXRsYXVuY2hlciZndDsKKyAgICAgICAgICAgICZsdDshLS0gaW5jbHVkZSB0aGUgSlVuaXQgcGxhdGZvcm0gcmVsYXRlZCBsaWJyYXJpZXMKKyAgICAgICAgICAgIHJlcXVpcmVkIHRvIHJ1biB0aGUgdGVzdHMgLS0mZ3Q7CisgICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJqdW5pdC5wbGF0Zm9ybS5saWJzLmNsYXNzcGF0aCIvJmd0OworCisgICAgICAgICAgICAmbHQ7IS0tIGluY2x1ZGUgdGhlIEpVbml0IEp1cGl0ZXIgZW5naW5lIGxpYnJhcmllcyAtLSZndDsKKyAgICAgICAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9Imp1bml0LmVuZ2luZS5qdXBpdGVyLmNsYXNzcGF0aCIvJmd0OworCisgICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAgICAgICAgICZsdDshLS0gdGhlIHRlc3QgY2xhc3NlcyB0aGVtc2VsdmVzIC0tJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLyZndDsKKyAgICAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OworICAgICAgICAgICAgJmx0O3Rlc3RjbGFzc2VzIG91dHB1dGRpcj0iJHtvdXRwdXQuZGlyfSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvJmd0OworICAgICAgICAgICAgICAgICZsdDtsaXN0ZW5lciB0eXBlPSJsZWdhY3ktYnJpZWYiIHNlbmRTeXNPdXQ9InRydWUiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7bGlzdGVuZXIgdHlwZT0ibGVnYWN5LXhtbCIgc2VuZFN5c0Vycj0idHJ1ZSIgc2VuZFN5c091dD0idHJ1ZSIvJmd0OworCisgICAgICAgICAgICAmbHQ7L3Rlc3RjbGFzc2VzJmd0OworICAgICAgICAmbHQ7L2p1bml0bGF1bmNoZXImZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7CisgICAgPC9wcmU+Cis8cD4KKyAgICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwKKzwvcD4KKyAgICA8dWw+CisgICAgICAgIDxsaT5UaGUgPGNvZGU+c3JjL2xpYi9qdXBpdGVyPC9jb2RlPiBkaXJlY3RvcnkgaXMgZXhwZWN0ZWQgdG8gY29udGFpbgorICAgICAgICB0aGUgSnVwaXRlciB0ZXN0IGVuZ2luZSByZWxhdGVkIGphcnMgKHdoaWNoIGhhdmUgYmVlbgorICAgICAgICA8YSBocmVmPSIjanVuaXQtanVwaXRlci1lbmdpbmUtbGlicmFyaWVzIj5saXN0ZWQgaW4gYW4gZWFybGllciBzZWN0aW9uIG9mIHRoaXMKKyAgICAgICAgZG9jdW1lbnQ8L2E+KS48L2xpPgorICAgICAgICA8bGk+VGhlIDxjb2RlPnNyYy9saWIvanVuaXQtcGxhdGZvcm08L2NvZGU+IGRpcmVjdG9yeSBpcyBleHBlY3RlZCB0bworICAgICAgICBjb250YWluIHRoZSBKVW5pdCBwbGF0Zm9ybSBqYXJzICh3aGljaCBoYXZlIGJlZW4KKyAgICAgICAgPGEgaHJlZj0iI2p1bml0LXBsYXRmb3JtLWxpYnJhcmllcyI+bGlzdGVkIGluIGFuIGVhcmxpZXIgc2VjdGlvbiBvZiB0aGlzCisgICAgICAgIGRvY3VtZW50PC9hPik8L2xpPgorICAgIDwvdWw+Cis8cD4KKyAgICBJbiB0aGUgPGNvZGU+dGVzdDwvY29kZT4gdGFyZ2V0IHdlIHVzZSB0aGUgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBuZXN0ZWQgZWxlbWVudAorICAgIHRvIHBvaW50IHRvIHRoZSA8Y29kZT5qdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGg8L2NvZGU+IGFuZCA8Y29kZT5qdW5pdC5wbGF0Zm9ybS5saWJzLmNsYXNzcGF0aDwvY29kZT4KKyAgICBjb250YWluaW5nIHRob3NlIGphcnMuCisgICAgSW4gdGhpcyA8Y29kZT50ZXN0PC9jb2RlPiB0YXJnZXQgd2UgYWxzbyB1c2UgYW5vdGhlciA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnQgdG8gcG9pbnQgdG8KKyAgICB0aGUgbG9jYXRpb24gY29udGFpbmluZyBvdXIgdGVzdCBjbGFzc2VzLiBJZiByZXF1aXJlZCwgYWxsIHRoZXNlIGNsYXNzcGF0aHMgY2FuIGJlIGNvbWJpbmVkCisgICAgaW50byBvbmUuCis8L3A+CisKKzxoND5saXN0ZW5lcjwvaDQ+CisKKzxwPgorICAgIFRoZSA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiB0YXNrIGNhbiBiZSBjb25maWd1cmVkIHdpdGggPGNvZGU+bGlzdGVuZXI8L2NvZGU+KHMpIHRvIGxpc3RlbiB0bworICAgIHRlc3QgZXhlY3V0aW9uIGV2ZW50cyAoc3VjaCBhcyBhIHRlc3QgZXhlY3V0aW9uIHN0YXJ0aW5nLCBjb21wbGV0aW5nIGV0Yy4uLikuIFRoZSBsaXN0ZW5lciBpcworICAgIGV4cGVjdGVkIHRvIGJlIGEgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cworICAgIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLlRlc3RFeGVjdXRpb25MaXN0ZW5lcjwvY29kZT4uCisgICAgVGhpcyA8Y29kZSBjbGFzcz0iY29kZSI+VGVzdEV4ZWN1dGlvbkxpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UgaXMgYW4gQVBJIGV4cG9zZWQgYnkgdGhlIEpVbml0IDUKKyAgICBwbGF0Zm9ybSBBUElzIGFuZCBpc24ndCBzcGVjaWZpYyB0byBBbnQuIEFzIHN1Y2gsIHlvdSBjYW4gdXNlIGFueSBleGlzdGluZyBpbXBsZW1lbnRhdGlvbgorICAgIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5UZXN0RXhlY3V0aW9uTGlzdGVuZXI8L2NvZGU+IGluIHRoaXMgdGFzay4KKzwvcD4KKworPGg1PlRlc3QgcmVzdWx0IGZvcm1hdHRlcjwvaDU+Cis8cD4KKyAgICA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiBwcm92aWRlcyBhIHdheSB3aGVyZSB0aGUgdGVzdCBleGVjdXRpb24gcmVzdWx0cyBjYW4gYmUgZm9ybWF0dGVkIGFuZAorICAgIHByZXNlbnRlZCBpbiBhIHdheSB0aGF0J3MgY3VzdG9taXphYmxlLiBUaGUgdGFzayBhbGxvd3MgZm9yIGNvbmZpZ3VyaW5nIHRlc3QgcmVzdWx0IGZvcm1hdHRlcnMsCisgICAgdGhyb3VnaCB0aGUgdXNlIG9mIDxjb2RlPmxpc3RlbmVyPC9jb2RlPiBlbGVtZW50LiBBcyBub3RlZCBwcmV2aW91c2x5LCB0aGUgPGNvZGU+bGlzdGVuZXI8L2NvZGU+CisgICAgZWxlbWVudCBleHBlY3RzIHRoZSBsaXN0ZW5lciB0byBpbXBsZW1lbnQKKyAgICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0RXhlY3V0aW9uTGlzdGVuZXI8L2NvZGU+CisgICAgaW50ZXJmYWNlLiBUeXBpY2FsbHksIHJlc3VsdCBmb3JtYXR0ZXJzIG5lZWQgYSBiaXQgbW9yZSBjb25maWd1cmF0aW9uIGRldGFpbHMgdG8gYmUgZmVkIHRvIHRoZW0sCisgICAgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbiZtZGFzaDtkZXRhaWxzIGxpa2Ugd2hlcmUgdG8gd3JpdGUgb3V0IHRoZSBmb3JtYXR0ZWQgcmVzdWx0LiBBbnkgc3VjaAorICAgIGxpc3RlbmVyIGNhbiBvcHRpb25hbGx5IGltcGxlbWVudAorICAgIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5UZXN0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPgorICAgIGludGVyZmFjZS4gVGhpcyBpbnRlcmZhY2UgaXMgc3BlY2lmaWMgdG8gQW50IDxjb2RlPmp1bml0bGF1bmNoZXI8L2NvZGU+IHRhc2sgYW5kIGl0IGV4dGVuZHMKKyAgICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0RXhlY3V0aW9uTGlzdGVuZXI8L2NvZGU+IGludGVyZmFjZQorPC9wPgorPHA+CisgICAgVGhlIDxjb2RlPmp1bml0bGF1bmNoZXI8L2NvZGU+IHRhc2sgY29tZXMgd2l0aCB0aGUgZm9sbG93aW5nIHByZS1kZWZpbmVkIHRlc3QgcmVzdWx0IGZvcm1hdHRlcgorICAgIHR5cGVzOgorPC9wPgorPHVsPgorICAgIDxsaT4KKyAgICAgICAgPHE+bGVnYWN5LXBsYWluPC9xPiA6IFRoaXMgZm9ybWF0dGVyIHByaW50cyBhIHNob3J0IHN0YXRpc3RpY3MgbGluZSBmb3IgYWxsIHRlc3QKKyAgICAgICAgY2FzZXMuCisgICAgPC9saT4KKyAgICA8bGk+CisgICAgICAgIDxxPmxlZ2FjeS1icmllZjwvcT4gOiBUaGlzIGZvcm1hdHRlciBwcmludHMgaW5mb3JtYXRpb24gZm9yIHRlc3RzIHRoYXQgZmFpbGVkIG9yIHdlcmUKKyAgICAgICAgc2tpcHBlZC4KKyAgICA8L2xpPgorICAgIDxsaT4KKyAgICAgICAgPHE+bGVnYWN5LXhtbDwvcT4gOiBUaGlzIGZvcm1hdHRlciBwcmludHMgc3RhdGlzdGljcyBmb3IgdGhlIHRlc3RzIGluIFhNTCBmb3JtYXQuCisgICAgPC9saT4KKzwvdWw+Cis8cD4KKyAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IEVhY2ggb2YgdGhlc2UgZm9ybWF0dGVycyBuYW1lZCA8cT5sZWdhY3k8L3E+IHRyeSB0byBmb3JtYXQgdGhlIHJlc3VsdHMKKyAgICBzaW1pbGFyIHRvIHdoYXQgdGhlIDxjb2RlPmp1bml0PC9jb2RlPiB0YXNrJ3MgZm9ybWF0dGVycyB1c2VkIHRvIGRvLiBGdXJ0aGVybW9yZSwKKyAgICB0aGUgPHE+bGVnYWN5LXhtbDwvcT4gZm9ybWF0dGVyIGdlbmVyYXRlcyB0aGUgWE1MIHRvIGNvbXBseSB3aXRoIHRoZSBzYW1lIHNjaGVtYSB0aGF0CisgICAgdGhlIDxjb2RlPmp1bml0PC9jb2RlPiB0YXNrJ3MgWE1MIGZvcm1hdHRlciB1c2VkIHRvIGZvbGxvdy4gIEFzIGEgcmVzdWx0LCB0aGUgWE1MIGdlbmVyYXRlZCBieQorICAgIHRoaXMgZm9ybWF0dGVyLCBjYW4gYmUgdXNlZCBhcy1pcyBieSB0aGUgPGNvZGU+anVuaXRyZXBvcnQ8L2NvZGU+IHRhc2suCis8L3A+Cis8cD4KKyAgICBUaGUgPGNvZGU+bGlzdGVuZXI8L2NvZGU+IGVsZW1lbnQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+dHlwZTwvdGQ+CisgICAgICAgIDx0ZD5Vc2UgYSBwcmVkZWZpbmVkIGZvcm1hdHRlciAoZWl0aGVyIDxxPmxlZ2FjeS14bWw8L3E+LCA8cT5sZWdhY3ktcGxhaW48L3E+CisgICAgICAgICAgICBvciA8cT5sZWdhY3ktYnJpZWY8L3E+KS48L3RkPgorICAgICAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICAgICAgPHRkIGNsYXNzPSJsZWZ0Ij5OYW1lIG9mIGEgbGlzdGVuZXIgY2xhc3Mgd2hpY2gKKyAgICAgICAgICAgIGltcGxlbWVudHMgPGNvZGU+b3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLlRlc3RFeGVjdXRpb25MaXN0ZW5lcjwvY29kZT4gb3IKKyAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLlRlc3RSZXN1bHRGb3JtYXR0ZXI8L2NvZGU+CisgICAgICAgICAgICBpbnRlcmZhY2UKKyAgICAgICAgPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPnJlc3VsdEZpbGU8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICBUaGUgZmlsZSBuYW1lIHRvIHdoaWNoIHRoZSBmb3JtYXR0ZWQgcmVzdWx0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8uIFRoaXMgYXR0cmlidXRlIGlzCisgICAgICAgICAgICBvbmx5IHJlbGV2YW50IHdoZW4gdGhlIGxpc3RlbmVyIGNsYXNzIGltcGxlbWVudHMKKyAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLlRlc3RSZXN1bHRGb3JtYXR0ZXI8L2NvZGU+CisgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIHRoaXMgYXR0cmlidXRlIGFuZCB0aGUgbGlzdGVuZXIgaW1wbGVtZW50cworICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLlRlc3RSZXN1bHRGb3JtYXR0ZXI8L2NvZGU+CisgICAgICAgICAgICAgICAgdGhlbiB0aGUgZmlsZSBuYW1lIHdpbGwgYmUgZGVmYXVsdGVkIHRvIGFuZCB3aWxsIGJlIG9mIHRoZQorICAgICAgICAgICAgICAgIGZvcm0gPGNvZGU+VEVTVC08aT50ZXN0bmFtZTwvaT4uPGk+Zm9ybWF0dGVyLXNwZWNpZmljLWV4dGVuc2lvbjwvaT48L2NvZGU+CisgICAgICAgICAgICAgICAgKGV4OiA8c2FtcD5URVNULW9yZy5teWFwcC5Tb21lVGVzdC54bWw8L3NhbXA+IGZvciB0aGUgPHE+bGVnYWN5LXhtbDwvcT4gdHlwZQorICAgICAgICAgICAgICAgIGZvcm1hdHRlcikKKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoaXMgZmlsZSBpcyBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZSA8Y29kZT5vdXRwdXREaXI8L2NvZGU+IGNvbmZpZ3VyZWQgb24gdGhlIGxpc3RlbmVyLgorICAgICAgICAgICAgICAgIElmIG5vIDxjb2RlPm91dHB1dERpcjwvY29kZT4gaXMgc2V0IG9uIHRoZSBsaXN0ZW5lciwgdGhlbiB0aGUgZmlsZSBpcyBjb25zaWRlcmVkIHJlbGF0aXZlIHRvIHRoZQorICAgICAgICAgICAgICAgIDxjb2RlPm91dHB1dERpcjwvY29kZT4gb2YgdGhlIHRlc3QgaW4gY29udGV4dCBvZiB3aGljaCB0aGlzIGxpc3RlbmVyIGlzIGJlaW5nIHJ1bi4KKyAgICAgICAgICAgIDwvcD4KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPm91dHB1dERpcjwvdGQ+CisgICAgICAgIDx0ZD5EaXJlY3RvcnkgaW50byB3aGljaCB0byBjcmVhdGUgdGhlIG91dHB1dCBvZiB0aGUgbGlzdGVuZXIuCisgICAgICAgICAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuNjwvZW0+PC9wPgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+c2VuZFN5c091dDwvdGQ+CisgICAgICAgIDx0ZD5JZiBzZXQgdG8gPHE+dHJ1ZTwvcT4gdGhlbiB0aGUgbGlzdGVuZXIgd2lsbCBiZSBwYXNzZWQgdGhlIDxjb2RlPnN0ZG91dDwvY29kZT4gY29udGVudAorICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IHRoZSB0ZXN0KHMpLiBUaGlzIGF0dHJpYnV0ZSBpcyByZWxldmFudCBvbmx5IGlmIHRoZSBsaXN0ZW5lciBjbGFzcworICAgICAgICAgICAgaW1wbGVtZW50cworICAgICAgICAgICAgdGhlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuVGVzdFJlc3VsdEZvcm1hdHRlcjwvY29kZT4KKyAgICAgICAgICAgIGludGVyZmFjZS48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5zZW5kU3lzRXJyPC90ZD4KKyAgICAgICAgPHRkPklmIHNldCB0byA8cT50cnVlPC9xPiB0aGVuIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHBhc3NlZCB0aGUgPGNvZGU+c3RkZXJyPC9jb2RlPiBjb250ZW50CisgICAgICAgICAgICBnZW5lcmF0ZWQgYnkgdGhlIHRlc3QocykuIFRoaXMgYXR0cmlidXRlIGlzIHJlbGV2YW50IG9ubHkgaWYgdGhlIGxpc3RlbmVyIGNsYXNzCisgICAgICAgICAgICBpbXBsZW1lbnRzCisgICAgICAgICAgICB0aGUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5UZXN0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPgorICAgICAgICAgICAgaW50ZXJmYWNlLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmlmPC90ZD4KKyAgICAgICAgPHRkPk9ubHkgdXNlIHRoaXMgbGlzdGVuZXIgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzCisgICAgICAgICAgICBzZXQ8L2E+LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD51bmxlc3M8L3RkPgorICAgICAgICA8dGQ+T25seSB1c2UgdGhpcyBsaXN0ZW5lciA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkKKyAgICAgICAgICAgIGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNldDwvYT4uPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorPC90YWJsZT4KKworPGg0PnRlc3Q8L2g0PgorCis8cD5EZWZpbmVzIGEgc2luZ2xlIHRlc3QgY2xhc3MuPC9wPgorCis8dGFibGUgY2xhc3M9ImF0dHIiPgorICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5uYW1lPC90ZD4KKyAgICAgICAgPHRkPkZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0ZXN0IGNsYXNzLjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+bWV0aG9kczwvdGQ+CisgICAgICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyBvZiB0ZXN0IGNhc2UgbWV0aG9kcyB0byBleGVjdXRlLiAgSWYgdGhpcyBpcyBzcGVjaWZpZWQsCisgICAgICAgICAgICB0aGVuIG9ubHkgdGhlc2UgdGVzdCBtZXRob2RzIGZyb20gdGhlIHRlc3QgY2xhc3Mgd2lsbCBiZSBleGVjdXRlZC48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+aGFsdE9uRmFpbHVyZTwvdGQ+CisgICAgICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgZmFpbHVyZSBvY2N1cnMgZHVyaW5nIHRoZSB0ZXN0IHJ1biAoZXhjZXB0aW9ucyBhcmUKKyAgICAgICAgICAgIGNvbnNpZGVyZWQgYXMgZmFpbHVyZXMgdG9vKS4gIE92ZXJyaWRlcyB2YWx1ZSBzZXQgb24gPGNvZGU+anVuaXRsYXVuY2hlcjwvY29kZT4KKyAgICAgICAgICAgIGVsZW1lbnQuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmZhaWx1cmVQcm9wZXJ0eTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIChleGNlcHRpb25zIGFyZSBjb25zaWRlcmVkCisgICAgICAgICAgICBmYWlsdXJlcyBhcyB3ZWxsKS4gT3ZlcnJpZGVzIHZhbHVlIHNldCBvbiA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5vdXRwdXREaXI8L3RkPgorICAgICAgICA8dGQ+RGlyZWN0b3J5IHRvIHdyaXRlIHRoZSByZXBvcnRzIHRvLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmlmPC90ZD4KKyAgICAgICAgPHRkPk9ubHkgcnVuIHRoaXMgdGVzdCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMKKyAgICAgICAgICAgIHNldDwvYT4uPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPnVubGVzczwvdGQ+CisgICAgICAgIDx0ZD5Pbmx5IHJ1biB0aGlzIHRlc3QgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICAgICAgICBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzZXQ8L2E+LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5pbmNsdWRlRW5naW5lczwvdGQ+CisgICAgICAgIDx0ZD5BIGNvbW1hIHNlcGFyYXRlZCBzZXQgb2YgdGVzdCBlbmdpbmUgaWRzLiBJZiBzcGVjaWZpZWQsIG9ubHkgdGhlc2UgdGVzdCBlbmdpbmUocykKKyAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBmb3IgcnVubmluZyB0aGUgdGVzdHMuCisgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgRm9yIGV4YW1wbGU6IDxjb2RlPmluY2x1ZGVFbmdpbmVzPSJqdW5pdC1qdXBpdGVyIjwvY29kZT4gd2lsbCBvbmx5IHVzZSB0aGUgSnVwaXRlcgorICAgICAgICAgICAgdGVzdCBlbmdpbmUgZm9yIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMgYW5kIHdpbGwgaWdub3JlIGFueSBvdGhlciBlbmdpbmVzIHRoYXQgbWlnaHQKKyAgICAgICAgICAgIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+ZXhjbHVkZUVuZ2luZXM8L3RkPgorICAgICAgICA8dGQ+QSBjb21tYSBzZXBhcmF0ZWQgc2V0IG9mIHRlc3QgZW5naW5lIGlkcy4gSWYgc3BlY2lmaWVkLCB0aGVzZSB0ZXN0IGVuZ2luZShzKQorICAgICAgICAgICAgd2lsbCBiZSBleGNsdWRlZCB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLgorICAgICAgICAgICAgPGJyLz4KKyAgICAgICAgICAgIEZvciBleGFtcGxlOiA8Y29kZT5leGNsdWRlRW5naW5lcz0ianVuaXQtdmludGFnZSI8L2NvZGU+IHdpbGwgZXhjbHVkZSB0aGUgdmludGFnZQorICAgICAgICAgICAgdGVzdCBlbmdpbmUgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMgYW5kIHdpbGwgdXNlIGFueSBvdGhlciBlbmdpbmVzIHRoYXQgbWlnaHQKKyAgICAgICAgICAgIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCis8cD4KKyAgICBUZXN0cyBjYW4gZGVmaW5lIHRoZWlyIG93biBsaXN0ZW5lcnMgdmlhIG5lc3RlZCA8Y29kZT5saXN0ZW5lcjwvY29kZT4gZWxlbWVudHMuCis8L3A+CisKKzxwPgorICAgIFRoZSA8YSBocmVmPSIjZm9yayI+Zm9yazwvYT4gbmVzdGVkIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gcnVuIHRoZSB0ZXN0IGluIGEgbmV3bHkgZm9ya2VkCisgICAgSlZNLgorPC9wPgorCis8aDQ+dGVzdGNsYXNzZXM8L2g0PgorCis8cD5EZWZpbmUgYSBudW1iZXIgb2YgdGVzdHMgYmFzZWQgb24gcGF0dGVybiBtYXRjaGluZy48L3A+CisKKzxwPgorICAgIDxjb2RlPnRlc3RjbGFzc2VzPC9jb2RlPiBjb2xsZWN0cyB0aGUgaW5jbHVkZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4KKyAgICBmcm9tIGFueSBudW1iZXIgb2YgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCisgICAgQ29sbGVjdGlvbjwvYT5zLiBJdCB0aGVuIHNlbGVjdHMgZWFjaCByZXNvdXJjZSB3aG9zZSBuYW1lIGVuZHMgaW4gPGNvZGU+LmNsYXNzPC9jb2RlPi4gVGhlc2UKKyAgICBjbGFzc2VzIGFyZSB0aGVuIHBhc3NlZCBvbiB0byB0aGUgSlVuaXQgNSBwbGF0Zm9ybSBmb3IgaXQgdG8gZGVjaWRlIGFuZCBydW4gdGhlbSBhcyB0ZXN0cy4KKzwvcD4KKworPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+aGFsdE9uRmFpbHVyZTwvdGQ+CisgICAgICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIGEgZmFpbHVyZSBvY2N1cnMgZHVyaW5nIHRoZSB0ZXN0IHJ1biAoZXhjZXB0aW9ucyBhcmUKKyAgICAgICAgICAgIGNvbnNpZGVyZWQgYXMgZmFpbHVyZXMgdG9vKS4gIE92ZXJyaWRlcyB2YWx1ZSBzZXQgb24gPGNvZGU+anVuaXRsYXVuY2hlcjwvY29kZT4KKyAgICAgICAgICAgIGVsZW1lbnQuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmZhaWx1cmVQcm9wZXJ0eTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYSBmYWlsdXJlIChleGNlcHRpb25zIGFyZSBjb25zaWRlcmVkCisgICAgICAgICAgICBmYWlsdXJlcyBhcyB3ZWxsKS4gT3ZlcnJpZGVzIHZhbHVlIHNldCBvbiA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5vdXRwdXREaXI8L3RkPgorICAgICAgICA8dGQ+RGlyZWN0b3J5IHRvIHdyaXRlIHRoZSByZXBvcnRzIHRvLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmlmPC90ZD4KKyAgICAgICAgPHRkPk9ubHkgcnVuIHRoZSB0ZXN0cyA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMKKyAgICAgICAgICAgIHNldDwvYT4uPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPnVubGVzczwvdGQ+CisgICAgICAgIDx0ZD5Pbmx5IHJ1biB0aGUgdGVzdHMgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgICAgICAgICBpcyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBzZXQ8L2E+LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICAgIDx0ZD5pbmNsdWRlRW5naW5lczwvdGQ+CisgICAgICAgIDx0ZD5BIGNvbW1hIHNlcGFyYXRlZCBzZXQgb2YgdGVzdCBlbmdpbmUgaWRzLiBJZiBzcGVjaWZpZWQsIG9ubHkgdGhlc2UgdGVzdCBlbmdpbmUocykKKyAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBmb3IgcnVubmluZyB0aGUgdGVzdHMuCisgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgRm9yIGV4YW1wbGU6IDxjb2RlPmluY2x1ZGVFbmdpbmVzPSJqdW5pdC1qdXBpdGVyIjwvY29kZT4gd2lsbCBvbmx5IHVzZSB0aGUgSnVwaXRlcgorICAgICAgICAgICAgdGVzdCBlbmdpbmUgZm9yIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMgYW5kIHdpbGwgaWdub3JlIGFueSBvdGhlciBlbmdpbmVzIHRoYXQgbWlnaHQKKyAgICAgICAgICAgIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+ZXhjbHVkZUVuZ2luZXM8L3RkPgorICAgICAgICA8dGQ+QSBjb21tYSBzZXBhcmF0ZWQgc2V0IG9mIHRlc3QgZW5naW5lIGlkcy4gSWYgc3BlY2lmaWVkLCB0aGVzZSB0ZXN0IGVuZ2luZShzKQorICAgICAgICAgICAgd2lsbCBiZSBleGNsdWRlZCB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzLgorICAgICAgICAgICAgPGJyLz4KKyAgICAgICAgICAgIEZvciBleGFtcGxlOiA8Y29kZT5leGNsdWRlRW5naW5lcz0ianVuaXQtdmludGFnZSI8L2NvZGU+IHdpbGwgZXhjbHVkZSB0aGUgdmludGFnZQorICAgICAgICAgICAgdGVzdCBlbmdpbmUgZHVyaW5nIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMgYW5kIHdpbGwgdXNlIGFueSBvdGhlciBlbmdpbmVzIHRoYXQgbWlnaHQKKyAgICAgICAgICAgIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgY2xhc3NwYXRoLgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCis8cD4KKyAgICA8Y29kZT50ZXN0Y2xhc3NlczwvY29kZT4gY2FuIGRlZmluZSB0aGVpciBvd24gbGlzdGVuZXJzIHZpYSBuZXN0ZWQgPGNvZGU+bGlzdGVuZXI8L2NvZGU+CisgICAgZWxlbWVudHMuCis8L3A+CisKKzxwPgorICAgIFRoZSA8YSBocmVmPSIjZm9yayI+Zm9yazwvYT4gbmVzdGVkIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhIG5ld2x5IGZvcmtlZAorICAgIEpWTS4gQWxsIHRlc3RzIHRoYXQgYXJlIHBhcnQgb2YgdGhpcyA8Y29kZT50ZXN0Y2xhc3NlczwvY29kZT4gZWxlbWVudCB3aWxsIHJ1biBpbiBvbmUgc2luZ2xlCisgICAgaW5zdGFuY2Ugb2YgdGhlIG5ld2x5IGZvcmtlZCBKVk0uCis8L3A+CisKKzxoNCBpZD0iZm9yayI+Zm9yazwvaDQ+CisKKzxwPjxlbT5TaW5jZSBBbnQgMS4xMC42PC9lbT48L3A+CisKK1Rlc3RzIGxhdW5jaGVkIHVzaW5nIHRoZSA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiB0YXNrLCBieSBkZWZhdWx0LCBydW4gaW4gdGhlIHNhbWUgSlZNIHRoYXQKK2luaXRpYXRlcyB0aGUgdGFzay4gVGhpcyBiZWhhdmlvdXIgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIDxjb2RlPmZvcms8L2NvZGU+IGVsZW1lbnQuCitUaGUgPGNvZGU+Zm9yazwvY29kZT4gZWxlbWVudCBhbmQgaXRzIGF0dHJpYnV0ZXMgZGVmaW5lIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKK3RoZSBuZXcgSlZNIGluc3RhbmNlIHRoYXQgd2lsbCBiZSBjcmVhdGVkIHRvIGxhdW5jaCB0aGUgdGVzdHMuCisKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgICAgPHRyPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmRpcjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgdXNlciB3b3JraW5nIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIGZvcmtlZCBKVk08L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgICA8dGQ+dGltZW91dDwvdGQ+CisgICAgICAgIDx0ZD5BIHZhbHVlIGluIG1pbGxpc2Vjb25kcywgc3BlY2lmeWluZyBhIG1heGltdW0gZHVyYXRpb24sIHRoZSB0ZXN0CisgICAgICAgICAgICBydW5uaW5nIGluIHRoaXMgZm9ya2VkIEpWTSBpcyBhbGxvd2VkIHRvIHJ1bi4gSWYgdGhlIHRlc3QgcnVucyBsb25nZXIKKyAgICAgICAgICAgIHRoYW4gdGhpcyBjb25maWd1cmVkIHZhbHVlLCB0aGVuIHRoZSBKVk0gaXMga2lsbGVkPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzPC90ZD4KKyAgICAgICAgPHRkPklmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgamFyIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAgICAgSlVuaXQgcGxhdGZvcm0sIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJ1bnRpbWUgY2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQKKyAgICAgICAgSlZNLiBJZiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGVuIHRoZSA8YSBocmVmPSIjbmVzdGVkLWNsYXNzcGF0aCI+Y29uZmlndXJlZCBjbGFzc3BhdGg8L2E+CisgICAgICAgIG9mIHRoaXMgdGFzaywgd2hpY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcnVudGltZSBjbGFzc3BhdGggb2YgdGhlIGZvcmtlZAorICAgICAgICBKVk0sIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gdGhlIEpVbml0IHBsYXRmb3JtIGxpYnJhcnkgamFyczwvdGQ+CisgICAgICAgIDx0ZD5Oby4gVmFsdWUgZGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgICAgPHRkPmluY2x1ZGVBbnRSdW50aW1lTGlicmFyaWVzPC90ZD4KKyAgICAgICAgPHRkPklmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgamFyIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUKKyAgICAgICAgICAgIEFudCBydW50aW1lLCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBydW50aW1lIGNsYXNzcGF0aCBvZiB0aGUgZm9ya2VkCisgICAgICAgICAgICBKVk0uIElmIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZW4gdGhlIDxhIGhyZWY9IiNuZXN0ZWQtY2xhc3NwYXRoIj5jb25maWd1cmVkIGNsYXNzcGF0aDwvYT4KKyAgICAgICAgICAgIG9mIHRoaXMgdGFzaywgd2hpY2ggd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcnVudGltZSBjbGFzc3BhdGggb2YgdGhlIGZvcmtlZAorICAgICAgICAgICAgSlZNLCBpcyBleHBlY3RlZCB0byBjb250YWluIHRoZSBBbnQgcnVudGltZSBqYXJzPC90ZD4KKyAgICAgICAgPHRkPk5vLiBWYWx1ZSBkZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L3RkPgorICAgIDwvdHI+Cis8L3RhYmxlPgorCitUaGUgPGNvZGU+Zm9yazwvY29kZT4gZWxlbWVudCBhbGxvd3MgdGhlIGZvbGxvd2luZyBuZXN0ZWQgZWxlbWVudHM6CisKKzxoNT5qdm1hcmc8L2g1PgorPHA+CisgICAgQWRkaXRpb25hbCBKVk0gYXJndW1lbnRzIG1heSBiZSBwYXNzZWQgdG8gdGhlIGZvcmtlZCBKVk0gdmlhIHRoZSA8Y29kZT5qdm1hcmc8L2NvZGU+IGVsZW1lbnRzLgorICAgIEZvciBleGFtcGxlOgorPC9wPgorICAgIDxwcmU+CisgICAgJmx0O2ZvcmsgLi4uJmd0OworICAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLURqYXZhLmNvbXBpbGVyPU5PTkUiLyZndDsKKyAgICAgIC4uLgorICAgICZsdDsvZm9yayZndDsKKyAgICA8L3ByZT4KKworPHA+CisgICAgPGNvZGU+anZtYXJnPC9jb2RlPiBhbGxvd3MgYWxsIGF0dHJpYnV0ZXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPgorPC9wPgorCis8aDU+c3lzcHJvcGVydHk8L2g1PgorPHA+CisgICAgVGhlIDxjb2RlPnN5c3Byb3BlcnR5PC9jb2RlPiBlbGVtZW50cyBhbGxvdyBwYXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnRpZXMgdG8gdGhlIGZvcmtlZCBKVk06Cis8L3A+CisgICAgPHByZT4KKyAgICAmbHQ7Zm9yayZndDsKKyAgICAgICAgJmx0O3N5c3Byb3BlcnR5IGtleT0iZ3JlZXRpbmciIHZhbHVlPSJoZWxsbyB3b3JsZCIvJmd0OworICAgIC4uLgorICAgICZsdDsvZm9yayZndDsKKyAgICA8L3ByZT4KKzxwPgorICAgIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIHRoZSBzYW1lIGFzIGZvciA8YSBocmVmPSIuLi9UYXNrcy9leGVjLmh0bWwjZW52Ij5lbnZpcm9ubWVudCB2YXJpYWJsZXM8L2E+Cis8L3A+CisKKzxoNT5zeXNwcm9wZXJ0eXNldDwvaDU+CisKKzxwPgorICAgIFlvdSBjYW4gc3BlY2lmeSBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgYXMgc3lzdGVtIHByb3BlcnRpZXMgd2l0aAorICAgIDxhIGhyZWY9Ii4uL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwiPnN5c3Byb3BlcnR5c2V0PC9hPihzKQorPC9wPgorCisKKzxoNT5lbnY8L2g1PgorCis8cD4KKyAgICBJdCBpcyBwb3NzaWJsZSB0byBzcGVjaWZ5IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBmb3JrZWQgSlZNIHZpYQorICAgIG5lc3RlZCA8Y29kZT5lbnY8L2NvZGU+IGVsZW1lbnRzLiBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+ZW52PC9jb2RlPgorICAgIGVsZW1lbnQncyBhdHRyaWJ1dGVzLCBzZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9leGVjLmh0bWwjZW52Ij5leGVjPC9hPiB0YXNrLgorPC9wPgorCis8aDU+bW9kdWxlcGF0aDwvaDU+CisKKzxwPgorICAgIFRoZSBsb2NhdGlvbiBvZiBKYXZhIG1vZHVsZXMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgPGNvZGU+bW9kdWxlcGF0aDwvY29kZT4gZWxlbWVudCwKKyAgICB3aGljaCBpcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4uCis8L3A+CitGb3IgZXhhbXBsZToKKzxwcmU+CismbHQ7Zm9yayZndDsKKyAgJmx0O21vZHVsZXBhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJsaWIiLyZndDsKKyAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249ImRpc3QvdGVzdC5qYXIiLyZndDsKKyAgJmx0Oy9tb2R1bGVwYXRoJmd0OworICAuLi4KKyZsdDsvZm9yayZndDsKKzwvcHJlPgorCis8aDU+dXBncmFkZW1vZHVsZXBhdGg8L2g1PgorCis8cD4KKyAgICBUaGUgbG9jYXRpb24gb2YgSmF2YSBtb2R1bGVzLCB0aGF0IHJlcGxhY2UgdXBncmFkZWFibGUgbW9kdWxlcyBpbiB0aGUgcnVudGltZSwgY2FuIGJlIHNwZWNpZmllZAorICAgIHVzaW5nIHRoZSA8Y29kZT51cGdyYWRlbW9kdWxlcGF0aDwvY29kZT4gZWxlbWVudCwgd2hpY2ggaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorICAgIHN0cnVjdHVyZTwvYT4uCis8L3A+CisKKworPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+CisgICAgTGF1bmNoIHRoZSBKVW5pdCA1IHBsYXRmb3JtIHRvIHJ1biB0aGUgPHNhbXA+b3JnLm15YXBwLlNpbXBsZVRlc3Q8L3NhbXA+IHRlc3QKKzwvcD4KKworPHByZT4KKyZsdDtwYXRoIGlkPSJ0ZXN0LmNsYXNzcGF0aCImZ3Q7CisgICAgLi4uCismbHQ7L3BhdGgmZ3Q7CisKKyZsdDtqdW5pdGxhdW5jaGVyJmd0OworICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8mZ3Q7CisgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLm15YXBwLlNpbXBsZVRlc3QiLyZndDsKKyZsdDsvanVuaXRsYXVuY2hlciZndDs8L3ByZT4KKworPHA+CisgICAgTGF1bmNoIHRoZSBKVW5pdCA1IHBsYXRmb3JtIHRvIHJ1biB0aGUgPHNhbXA+b3JnLm15YXBwLlNpbXBsZVRlc3Q8L3NhbXA+IGFuZAorICAgIHRoZSA8c2FtcD5vcmcubXlhcHAuQW5vdGhlclRlc3Q8L3NhbXA+IHRlc3RzLiBUaGUgYnVpbGQgcHJvY2VzcyB3aWxsIGJlIHN0b3BwZWQgaWYgYW55IHRlc3QsIGluCisgICAgdGhlIDxzYW1wPm9yZy5teWFwcC5TaW1wbGVUZXN0PC9zYW1wPiwgZmFpbHMuCis8L3A+CisKKzxwcmU+CismbHQ7anVuaXRsYXVuY2hlciZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvJmd0OworICAgICZsdDt0ZXN0IG5hbWU9Im9yZy5teWFwcC5TaW1wbGVUZXN0IiBoYWx0T25GYWlsdXJlPSJ0cnVlIi8mZ3Q7CisgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLm15YXBwLkFub3RoZXJUZXN0Ii8mZ3Q7CismbHQ7L2p1bml0bGF1bmNoZXImZ3Q7Cis8L3ByZT4KKworPHA+CisgICAgTGF1bmNoIHRoZSBKVW5pdCA1IHBsYXRmb3JtIHRvIHJ1biBvbmx5IHRoZSA8c2FtcD50ZXN0Rm9vPC9zYW1wPiBhbmQgPHNhbXA+dGVzdEJhcjwvc2FtcD4KKyAgICBtZXRob2RzIG9mIHRoZSA8c2FtcD5vcmcubXlhcHAuU2ltcGxlVGVzdDwvc2FtcD4gdGVzdCBjbGFzcy4KKzwvcD4KKworPHByZT4KKyZsdDtqdW5pdGxhdW5jaGVyJmd0OworICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8mZ3Q7CisgICAgJmx0O3Rlc3QgbmFtZT0ib3JnLm15YXBwLlNpbXBsZVRlc3QiIG1ldGhvZHM9InRlc3RGb28sIHRlc3RCYXIiLyZndDsKKyZsdDsvanVuaXRsYXVuY2hlciZndDs8L3ByZT4KKworPHA+CisgICAgU2VsZWN0IGFueSA8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzIHRoYXQgbWF0Y2gKKyAgICB0aGUgPHNhbXA+b3JnL2V4YW1wbGUvKiovdGVzdHMvKiovPC9zYW1wPiA8Y29kZT5maWxlc2V0PC9jb2RlPiBmaWx0ZXIsIHVuZGVyCisgICAgdGhlIDxzYW1wPiR7YnVpbGQuY2xhc3Nlcy5kaXJ9PC9zYW1wPiBhbmQgcGFzc2VzIHRob3NlIGNsYXNzZXMgdG8gdGhlIEpVbml0IDUgcGxhdGZvcm0gZm9yCisgICAgZXhlY3V0aW9uIGFzIHRlc3RzLgorPC9wPgorCis8cHJlPgorJmx0O2p1bml0bGF1bmNoZXImZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLyZndDsKKworICAgICZsdDt0ZXN0Y2xhc3NlcyBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9Im9yZy9leGFtcGxlLyoqL3Rlc3RzLyoqLyIvJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgJmx0Oy90ZXN0Y2xhc3NlcyZndDsKKyZsdDsvanVuaXRsYXVuY2hlciZndDs8L3ByZT4KKworPHA+CisgICAgU2VsZWN0IGFueSA8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzIHRoYXQgbWF0Y2gKKyAgICB0aGUgPHNhbXA+b3JnL2V4YW1wbGUvKiovdGVzdHMvKiovPC9zYW1wPiA8Y29kZT5maWxlc2V0PC9jb2RlPiBmaWx0ZXIsIHVuZGVyCisgICAgdGhlIDxzYW1wPiR7YnVpbGQuY2xhc3Nlcy5kaXJ9PC9zYW1wPiBhbmQgcGFzcyB0aG9zZSBjbGFzc2VzIHRvIHRoZSBKVW5pdCA1IHBsYXRmb3JtIGZvcgorICAgIGV4ZWN1dGlvbiBhcyB0ZXN0cy4gVGVzdCByZXN1bHRzIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gdGhlIDxzYW1wPiR7b3V0cHV0LmRpcn08L3NhbXA+IGJ5CisgICAgdGhlIDxxPmxlZ2FjeS14bWw8L3E+IGFuZCA8cT5sZWdhY3ktcGxhaW48L3E+IGZvcm1hdHRlcnMsIGluIHNlcGFyYXRlIGZpbGVzLiBGdXJ0aGVybW9yZSwgYm90aAorICAgIHRoZSA8cT5sZWdhY3kteG1sPC9xPiBhbmQgdGhlIDxxPmxlZ2FjeS1wbGFpbjwvcT4gbGlzdGVuZXJzLCBhYm92ZSwgYXJlIGNvbmZpZ3VyZWQgdG8gcmVjZWl2ZQorICAgIHRoZSBzdGFuZGFyZCBvdXRwdXQgY29udGVudCBnZW5lcmF0ZWQgYnkgdGhlIHRlc3RzLiBUaGUgPHE+bGVnYWN5LXhtbDwvcT4gbGlzdGVuZXIgaXMgY29uZmlndXJlZAorICAgIHRvIHJlY2VpdmUgc3RhbmRhcmQgZXJyb3IgY29udGVudCBhcyB3ZWxsLgorPC9wPgorCis8cHJlPgorJmx0O2p1bml0bGF1bmNoZXImZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLyZndDsKKworICAgICZsdDt0ZXN0Y2xhc3NlcyBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9IiZndDsKKyAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9Im9yZy9leGFtcGxlLyoqL3Rlc3RzLyoqLyIvJmd0OworICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICAgICAgICZsdDtsaXN0ZW5lciB0eXBlPSJsZWdhY3kteG1sIiBzZW5kU3lzT3V0PSJ0cnVlIiBzZW5kU3lzRXJyPSJ0cnVlIi8mZ3Q7CisgICAgICAgICZsdDtsaXN0ZW5lciB0eXBlPSJsZWdhY3ktcGxhaW4iIHNlbmRTeXNPdXQ9InRydWUiIC8mZ3Q7CisgICAgJmx0Oy90ZXN0Y2xhc3NlcyZndDsKKyZsdDsvanVuaXRsYXVuY2hlciZndDs8L3ByZT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2p1bml0cmVwb3J0Lmh0bWwgYi9tYW51YWwvVGFza3MvanVuaXRyZXBvcnQuaHRtbAppbmRleCA5NzEyMDE0Li5jZTAyN2Q2IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvanVuaXRyZXBvcnQuaHRtbAorKysgYi9tYW51YWwvVGFza3MvanVuaXRyZXBvcnQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5KVW5pdFJlcG9ydCBUYXNrPC90aXRsZT4KQEAgLTIyLDE5NSArMjMsMTg5IEBACiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ianVuaXRyZXBvcnQiPkpVbml0UmVwb3J0PC9hPjwvaDI+Cis8aDIgaWQ9Imp1bml0cmVwb3J0Ij5KVW5pdFJlcG9ydDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotTWVyZ2UgdGhlIGluZGl2aWR1YWwgWE1MIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUgSlVuaXQgdGFzayBhbmQgZXZlbnR1YWxseSBhcHBseQotYSBzdHlsZXNoZWV0IG9uIHRoZSByZXN1bHRpbmcgbWVyZ2VkIGRvY3VtZW50IHRvIHByb3ZpZGUgYSBicm93c2FibGUgcmVwb3J0IG9mCi10aGUgdGVzdGNhc2VzIHJlc3VsdHMuCis8cD5NZXJnZSB0aGUgaW5kaXZpZHVhbCBYTUwgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSA8Y29kZT5KVW5pdDwvY29kZT4gdGFzayBhbmQgZXZlbnR1YWxseSBhcHBseSBhCitzdHlsZXNoZWV0IG9uIHRoZSByZXN1bHRpbmcgbWVyZ2VkIGRvY3VtZW50IHRvIHByb3ZpZGUgYSBicm93c2FibGUgcmVwb3J0IG9mIHRoZSB0ZXN0Y2FzZXMKK3Jlc3VsdHMuPC9wPgogCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QKLWluY2x1ZGVkIGluIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4KLWZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudAorZGlzdHJpYnV0aW9uLiBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uPC9wPgogCiA8aDM+UmVxdWlyZW1lbnRzPC9oMz4KIAotPHA+VGhlIHRhc2sgbmVlZHMgQXBhY2hlIDxhCi1ocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iPlhhbGFuIDIuNC4xKyBvciBYYWxhbiBYU0xUQzwvYT4KLShKREsgMS40IGNvbnRhaW5zIGEgdmVyc2lvbiBvZiBYYWxhbi1KIDIueCB3aGlsZSBKREsgMS41IHNoaXBzIHdpdGggYQotdmVyc2lvbiBvZiBYU0xUQykuIFN0YXJ0aW5nIGZyb20gSkRLIDEuNC4yLTAxIGl0IHNoaXBzIHdpdGggYSBidW5kbGVkCi1YYWxhbi1KIDIuNC4xKywgbWVhbmluZyB0aGF0IEpESyB2ZXJzaW9uIHByaW9yIHRvIDEuNC4yLTAxIHdvbid0IHdvcmsKLW91dCBvZiB0aGUgYm94LiBUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplIHRoZSBjb21wYXRpYmlsaXR5IHN0YXR1cy4gCi08L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPjx0aD5YYWxhbjwvdGg+PHRoPlN1biBKREsgQnVuZGxlPC90aD48dGg+U3RhdHVzPHRoPjwvdHI+IAorPHA+VGhlIHRhc2sgbmVlZHMgQXBhY2hlIDxhIGhyZWY9Imh0dHBzOi8veG1sLmFwYWNoZS5vcmcveGFsYW4tai8iIHRhcmdldD0iX3RvcCI+WGFsYW4gMi40LjErIG9yCitYYWxhbiBYU0xUQzwvYT4gKEpESyAxLjQgY29udGFpbnMgYSB2ZXJzaW9uIG9mIFhhbGFuIDIueCwgd2hpbGUgSkRLIDEuNSBzaGlwcyB3aXRoIGEgdmVyc2lvbiBvZgorWFNMVEMpLiBKREsgMS40LjItMDEgYW5kIGxhdGVyIHNoaXBzIHdpdGggYSBidW5kbGVkIFhhbGFuIDIuNC4xKywgbWVhbmluZyB0aGF0IEpES3MgcHJpb3IgdG8gdmVyc2lvbgorMS40LjItMDEgd29uJ3Qgd29yayBvdXQgb2YgdGhlIGJveC4gVGhlIHRhYmxlIGJlbG93IHN1bW1hcml6ZSB0aGUgY29tcGF0aWJpbGl0eSBzdGF0dXMuPC9wPgorPHRhYmxlPgorPHRyPjx0aCBzY29wZT0iY29sIj5YYWxhbjwvdGg+PHRoIHNjb3BlPSJjb2wiPlN1biBKREsgQnVuZGxlPC90aD48dGggc2NvcGU9ImNvbCI+U3RhdHVzPC90aD48L3RyPgogPHRyPjx0ZD4yLjQuMSs8L3RkPjx0ZD5KREsgMS40LjItMDErPC90ZD48dGQ+T0s8L3RkPjwvdHI+CiA8dHI+PHRkPlhTTFRDPC90ZD48dGQ+SkRLIDEuNS54PC90ZD48dGQ+T0s8L3RkPjwvdHI+Ci08dHI+PHRkPjIueDwvdGQ+PHRkPkpESyAxLjQueDwvdGQ+PHRkPkRFUFJFQ0FURUQ8YnI+PGk+VXNlICR7YW50LmhvbWV9L2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbAotPGJyPiBVcGdyYWRlIFhhbGFuIHVzaW5nIHRoZSBKREsgZW5kb3JzZW1lbnQgbWVjaGFuaXNtPC9pPjwvdGQ+PC90cj4KKzx0cj48dGQ+Mi54PC90ZD48dGQ+SkRLIDEuNC54PC90ZD48dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+LAordXNlIDxzYW1wPiR7YW50LmhvbWV9L2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbDwvc2FtcD48YnIvPlVwZ3JhZGUgWGFsYW4gdXNpbmcgdGhlIEpESyBlbmRvcnNlbWVudAorbWVjaGFuaXNtPC9lbT48L3RkPjwvdHI+CiA8L3RhYmxlPgogCi08cD5XaXRoIEFudCAxLjYuMiB3ZSBoYWQgdG8gZGVjaWRlIGJldHdlZW4gc3VwcG9ydGluZyBYYWxhbi1KIDEvWGFsYW4gSiAyLjQuMS0KLWFuZCBYYWxhbiAyLjQuMSsvWFNMVEMsIHNpbmNlIHRoZXJlIHdhcyBubyB3YXkgdG8gc3VwcG9ydCBib3RoIGNvdXBsZXMgYXQgdGhlIHNhbWUKLXRpbWUuPC9wPgotPHA+V2l0aCBBbnQgMS43IHdlIGhhZCB0byBkcm9wIHN1cHBvcnQgWGFsYW4tSiAxLCBzaW5jZSBYYWxhbi1KIDEgaGFzIG5vdCAKLWF2YWlsYWJsZSBhbnltb3JlIGZvciBxdWl0ZSBzb21lIHRpbWUuPC9wPgorPHA+SW4gQW50IDEuNi4yLCB3ZSBoYWQgdG8gZGVjaWRlIGJldHdlZW4gc3VwcG9ydGluZyBYYWxhbiAxL1hhbGFuIDIuNC4xLSBhbmQgWGFsYW4gMi40LjErL1hTTFRDLAorYmVjYXVzZSB0aGVyZSB3YXMgbm8gd2F5IHRvIHN1cHBvcnQgYm90aCBjb3VwbGVzIGF0IHRoZSBzYW1lIHRpbWUuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiwgd2UgZHJvcHBlZCBzdXBwb3J0IGZvciBYYWxhbiAxLCBiZWNhdXNlIFhhbGFuIDEgd2FzIG5vdCBhdmFpbGFibGUgYW55bW9yZQorZm9yIHF1aXRlIHNvbWUgdGltZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBYTUwgZmlsZSB0aGF0IHdpbGwgYWdncmVnYXRlIGFsbCBpbmRpdmlkdWFsCi0gICAgICBYTUwgdGVzdHN1aXRlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGJ5IHRoZSBKVW5pdCB0YXNrLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby4gRGVmYXVsdCB0byBURVNUUy1UZXN0U3VpdGVzLnhtbDwvdGQ+CisgICAgPHRkPnRvZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBYTUwgZmlsZSB0aGF0IHdpbGwgYWdncmVnYXRlIGFsbCBpbmRpdmlkdWFsIFhNTCB0ZXN0c3VpdGVzIHByZXZpb3VzbHkKKyAgICAgIGdlbmVyYXRlZCBieSB0aGUgPGNvZGU+SlVuaXQ8L2NvZGU+IHRhc2suPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxzYW1wPlRFU1RTLVRlc3RTdWl0ZXMueG1sPC9zYW1wPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3Rvcnkgd2hlcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdGhlIGZpbGUgcmVzdWx0aW5nCi0gICAgICBmcm9tIHRoZSBpbmRpdmlkdWFsIFhNTCB0ZXN0c3VpdGUgYWdncmVnYXRpb24uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlIHJlc3VsdGluZyBmcm9tIHRoZSBpbmRpdmlkdWFsIFhNTCB0ZXN0c3VpdGUgYWdncmVnYXRpb24gc2hvdWxkCisgICAgICBiZSB3cml0dGVuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeTwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGgzPjxhIG5hbWU9Im5lc3RlZCI+TmVzdGVkIEVsZW1lbnRzPC9hPjwvaDM+Cis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5maWxlc2V0PC9oND4KLTxwPjxjb2RlPmp1bml0cmVwb3J0PC9jb2RlPiBjb2xsZWN0cyBpbmRpdmlkdWFsIHhtbCBmaWxlcyBnZW5lcmF0ZWQgYnkgdGhlIEpVbml0Ci10YXNrIHVzaW5nIHRoZSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj48Y29kZT4mbHQ7RmlsZVNldCZndDs8L2NvZGU+PC9hPgotZWxlbWVudC48L3A+Cis8cD48Y29kZT5qdW5pdHJlcG9ydDwvY29kZT4gY29sbGVjdHMgaW5kaXZpZHVhbCB4bWwgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSA8Y29kZT5KVW5pdDwvY29kZT4gdGFzawordXNpbmcgdGhlIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtGaWxlU2V0Jmd0OzwvY29kZT48L2E+IGVsZW1lbnQuPC9wPgogPGg0PnJlcG9ydDwvaDQ+CiA8cD5HZW5lcmF0ZSBhIGJyb3dzYWJsZSByZXBvcnQgYmFzZWQgb24gdGhlIGRvY3VtZW50IGNyZWF0ZWQgYnkgdGhlIG1lcmdlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9ybWF0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmb3JtYXQgb2YgdGhlIGdlbmVyYXRlZCByZXBvcnQuIE11c3QgYmUgJnF1b3Q7bm9mcmFtZXMmcXVvdDsKLSAgICAgIG9yICZxdW90O2ZyYW1lcyZxdW90Oy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgdG8gJnF1b3Q7ZnJhbWVzJnF1b3Q7PC90ZD4KKyAgICA8dGQ+Zm9ybWF0PC90ZD4KKyAgICA8dGQ+VGhlIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkIHJlcG9ydC4gTXVzdCBiZSBlaXRoZXIgPHE+bm9mcmFtZXM8L3E+IG9yIDxxPmZyYW1lczwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZyYW1lczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzdHlsZXNoZWV0cyBhcmUgZGVmaW5lZC4gVGhleSBtdXN0Ci0gICAgICBiZSBjb25mb3JtaW5nIHRvIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisgICAgPHRkPnN0eWxlZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgc3R5bGVzaGVldHMgYXJlIGRlZmluZWQuIFRoZXkgbXVzdCBiZSBjb25mb3JtaW5nIHRvIHRoZSBmb2xsb3dpbmcKKyAgICAgIGNvbnZlbnRpb25zOgogICAgICAgPHVsPgotICAgICAgICA8bGk+ZnJhbWVzIGZvcm1hdDogdGhlIHN0eWxlc2hlZXQgbXVzdCBiZSBuYW1lZCA8aT5qdW5pdC1mcmFtZXMueHNsPC9pPi48L2xpPgotICAgICAgICA8bGk+bm9mcmFtZXMgZm9ybWF0OiB0aGUgc3R5bGVzaGVldCBtdXN0IGJlIG5hbWVkIDxpPmp1bml0LW5vZnJhbWVzLnhzbDwvaT4uPC9saT4KKyAgICAgICAgPGxpPjxxPmZyYW1lczwvcT4gZm9ybWF0OiB0aGUgc3R5bGVzaGVldCBtdXN0IGJlIG5hbWVkIDxzYW1wPmp1bml0LWZyYW1lcy54c2w8L3NhbXA+LAorICAgICAgICAgIG9yIDxzYW1wPmp1bml0LWZyYW1lcy1zYXhvbi54c2w8L3NhbXA+IGlmIHlvdSBhcmUgdXNpbmcgU2F4b24gOSsuPC9saT4KKyAgICAgICAgPGxpPjxxPm5vZnJhbWVzPC9xPiBmb3JtYXQ6IHRoZSBzdHlsZXNoZWV0IG11c3QgYmUgbmFtZWQgPHNhbXA+anVuaXQtbm9mcmFtZXMueHNsPC9zYW1wPiwKKyAgICAgICAgICBvciA8c2FtcD5qdW5pdC1ub2ZyYW1lcy1zYXhvbi54c2w8L3NhbXA+IGlmIHlvdSBhcmUgdXNpbmcgU2F4b24gOSsuPC9saT4KICAgICAgIDwvdWw+CiAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0IHRvIGVtYmVkZGVkIHN0eWxlc2hlZXRzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBlbWJlZGRlZCBzdHlsZXNoZWV0czwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGZpbGVzIHJlc3VsdGluZyBmcm9tIHRoZQotICAgICAgdHJhbnNmb3JtYXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0IHRvIGN1cnJlbnQgZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlcyByZXN1bHRpbmcgZnJvbSB0aGUgdHJhbnNmb3JtYXRpb24gc2hvdWxkIGJlIHdyaXR0ZW4gdG8uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGN1cnJlbnQgZGlyZWN0b3J5PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4gQW50IGFzc3VtZXMgdGhlIGZvbGxvd2luZyBjb25jZXJuaW5nIHRoZSA8dHQ+ZnJhbWVzPC90dD4gYW5kIDx0dD5ub2ZyYW1lczwvdHQ+IGZvcm1hdHMgOjwvcD4KLTxwPlRoZSA8dHQ+ZnJhbWVzPC90dD4gZm9ybWF0IHVzZXMKLWEgc3R5bGVzaGVldCB3aGljaCBpcyBnZW5lcmF0aW5nIG91dHB1dCA8ZW0+b25seTwvZW0+IGJ5IHJlZGlyZWN0aW5nLjwvcD4KLTxwPlRoZQotPHR0Pm5vZnJhbWVzPC90dD4gZm9ybWF0IGRvZXMgbm90IHVzZSByZWRpcmVjdGluZyBhbmQgZ2VuZXJhdGVzIG9uZQotZmlsZSBjYWxsZWQgPHR0Pmp1bml0LW5vZnJhbWVzLmh0bWw8L3R0Pi48L3A+Ci08cD5DdXN0b20gdmVyc2lvbnMgb2YgPHR0Pmp1bml0LWZyYW1lcy54c2w8L3R0PiBvciA8dHQ+anVuaXQtbm9mcmFtZXMueHNsPC90dD4gbXVzdCBhZGhlcmUgdG8gdGhlIGFib3ZlIGNvbnZlbnRpb25zLjwvcD4KKzxwPkFudCBhc3N1bWVzIHRoZSBmb2xsb3dpbmcgY29uY2VybmluZyB0aGUgPHE+ZnJhbWVzPC9xPiBhbmQgPHE+bm9mcmFtZXM8L3E+IGZvcm1hdHM6PC9wPgorPHVsPgorICA8bGk+VGhlIDxxPmZyYW1lczwvcT4gZm9ybWF0IHVzZXMgYSBzdHlsZXNoZWV0IHdoaWNoIGlzIGdlbmVyYXRpbmcgb3V0cHV0IDxlbT5vbmx5PC9lbT4gYnkKKyAgICByZWRpcmVjdGluZy48L2xpPgorICA8bGk+VGhlIDxxPm5vZnJhbWVzPC9xPiBmb3JtYXQgZG9lcyBub3QgdXNlIHJlZGlyZWN0aW5nIGFuZCBnZW5lcmF0ZXMgb25lIGZpbGUKKyAgICBjYWxsZWQgPHNhbXA+anVuaXQtbm9mcmFtZXMuaHRtbDwvc2FtcD4uPC9saT4KKzwvdWw+Cis8cD5DdXN0b20gdmVyc2lvbnMgb2YgPHNhbXA+anVuaXQtZnJhbWVzLnhzbDwvc2FtcD4gb3IgPHNhbXA+anVuaXQtbm9mcmFtZXMueHNsPC9zYW1wPiBtdXN0IGFkaGVyZQordG8gdGhlIGFib3ZlIGNvbnZlbnRpb25zLjwvcD4KIAotPGgzPk5lc3RlZCBFbGVtZW50IG9mIHRoZSByZXBvcnQgdGFnPC9oMz4KKzxoMz5OZXN0ZWQgZWxlbWVudCBvZiB0aGUgcmVwb3J0IHRhZzwvaDM+CiA8aDQ+cGFyYW08L2g0PgotPGVtPlNpbmNlIEFudCAxLjc8L2VtPnRoZSByZXBvcnQgdGFnIHN1cHBvcnRzIG5lc3RlZCBwYXJhbSB0YWdzLgotVGhlc2UgdGFncyBjYW4gcGFzcyBYU0wgcGFyYW1ldGVycyB0byB0aGUgc3R5bGVzaGVldC4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4sIHRoZSA8dmFyPnJlcG9ydDwvdmFyPiB0YWcgc3VwcG9ydHMgbmVzdGVkIDxjb2RlPnBhcmFtPC9jb2RlPiB0YWdzLiAgVGhlc2UKK3RhZ3MgY2FuIHBhc3MgWFNMIHBhcmFtZXRlcnMgdG8gdGhlIHN0eWxlc2hlZXQuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgdGhlIFhTTCBwYXJhbWV0ZXI8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIFhTTCBwYXJhbWV0ZXI8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leHByZXNzaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRleHQgdmFsdWUgdG8gYmUgcGxhY2VkIGludG8gdGhlIHBhcmFtLjxicj4KLSAgICBXYXMgb3JpZ2luYWxseSBpbnRlbmRlZCB0byBiZSBhbiBYU0wgZXhwcmVzc2lvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+ZXhwcmVzc2lvbjwvdGQ+CisgICAgPHRkPlRleHQgdmFsdWUgdG8gYmUgcGxhY2VkIGludG8gdGhlIDxjb2RlPnBhcmFtPC9jb2RlPi48YnIvPldhcyBvcmlnaW5hbGx5IGludGVuZGVkIHRvIGJlIGFuCisgICAgICBYU0wgZXhwcmVzc2lvbi48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFyYW0gd2lsbCBvbmx5IGJlIHBhc3NlZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGlzIHByb3BlcnR5IGlzIHNldDwvYT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aWY8L3RkPgorICAgIDx0ZD5UaGUgPGNvZGU+cGFyYW08L2NvZGU+IHdpbGwgb25seSBiZSBwYXNzZWQgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhpcworICAgICAgcHJvcGVydHkgaXMgc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcGFyYW0gd2lsbCBub3QgYmUgcGFzc2VkIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoaXMgcHJvcGVydHkgaXMgc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD51bmxlc3M8L3RkPgorICAgIDx0ZD5UaGUgPGNvZGU+cGFyYW08L2NvZGU+IHdpbGwgbm90IGJlIHBhc3NlZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGlzCisgICAgICBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxwPlRoZSBidWlsdC1pbiBzdHlsZXNoZWV0cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczo8L3A+Ci08dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5YU0wtUGFyYW1ldGVyPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+WFNMIFBhcmFtZXRlcjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5USVRMRTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaXRsZSB1c2VkIGluICZsdDt0aXRsZSZndDsgYW5kICZsdDtoMSZndDsgdGFnczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby4gRGVmYXVsdHMgdG8gPGk+VW5pdCBUZXN0IFJlc3VsdHMuPC9pPjwvdGQ+CisgICAgPHRkPlRJVExFPC90ZD4KKyAgICA8dGQ+VGl0bGUgdXNlZCBpbiA8Y29kZT4mbHQ7dGl0bGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2gxJmd0OzwvY29kZT4gdGFnczwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5Vbml0IFRlc3QgUmVzdWx0czwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGg0PmNsYXNzcGF0aDwvaDQ+Ci08cD48ZW0+U2luY2UgQW50IDEuOS41LjwvZW0+Ci1MaWtlIGZvciB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc3R5bGUuaHRtbCNjbGFzc3BhdGgiPlhTTFQgdGFzazwvYT4sCi1hIG5lc3RlZCAmbHQ7Y2xhc3NwYXRoJmd0OyB3aWxsIGJlIHVzZWQgdG8gbG9hZCB0aGUgcHJvY2Vzc29yLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS45LjU8L2VtPi4gTGlrZSBmb3IgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3N0eWxlLmh0bWwjY2xhc3NwYXRoIj5YU0xUIHRhc2s8L2E+LCBhCituZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IHdpbGwgYmUgdXNlZCB0byBsb2FkIHRoZSBwcm9jZXNzb3IuPC9wPgogCiA8aDQ+ZmFjdG9yeTwvaDQ+Ci08cD48ZW0+U2luY2UgQW50IDEuOS41LjwvZW0+Ci1MaWtlIGZvciB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc3R5bGUuaHRtbCNmYWN0b3J5Ij5YU0xUIHRhc2s8L2E+LAotYSBuZXN0ZWQgJmx0O2ZhY3RvcnkmZ3Q7IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmFjdG9yeSBzZXR0aW5ncy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOS41PC9lbT4uIExpa2UgZm9yIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zdHlsZS5odG1sI2ZhY3RvcnkiPlhTTFQgdGFzazwvYT4sIGEKK25lc3RlZCA8Y29kZT4mbHQ7ZmFjdG9yeSZndDs8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmFjdG9yeSBzZXR0aW5ncy48L3A+CiAKKzxoMz5FeGFtcGxlczwvaDM+CiAKLTxoMz5FeGFtcGxlIG9mIHJlcG9ydDwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHByZT4mbHQ7anVuaXRyZXBvcnQgdG9kaXI9JnF1b3Q7Li9yZXBvcnRzJnF1b3Q7Jmd0OwotICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7Li9yZXBvcnRzJnF1b3Q7Jmd0OwotICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7VEVTVC0qLnhtbCZxdW90Oy8mZ3Q7Ci0gICZsdDsvZmlsZXNldCZndDsKLSAgJmx0O3JlcG9ydCBmb3JtYXQ9JnF1b3Q7ZnJhbWVzJnF1b3Q7IHRvZGlyPSZxdW90Oy4vcmVwb3J0L2h0bWwmcXVvdDsvJmd0OwotJmx0Oy9qdW5pdHJlcG9ydCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+d291bGQgZ2VuZXJhdGUgYSA8dHQ+VEVTVFMtVGVzdFN1aXRlcy54bWw8L3R0PiBmaWxlIGluIHRoZSBkaXJlY3RvcnkgPHR0PnJlcG9ydHM8L3R0PiBhbmQKLWdlbmVyYXRlIHRoZSBkZWZhdWx0IGZyYW1lZCByZXBvcnQgaW4gdGhlIGRpcmVjdG9yeSA8dHQ+cmVwb3J0L2h0bWw8L3R0Pi48L3A+Ci08aDM+RXhhbXBsZSBvZiByZXBvcnQgd2l0aCB4c2wgcGFyYW1zPC9oMz4KLTxibG9ja3F1b3RlPgotICA8cHJlPgorPHA+R2VuZXJhdGUgYSA8c2FtcD5URVNUUy1UZXN0U3VpdGVzLnhtbDwvc2FtcD4gZmlsZSBpbiB0aGUgZGlyZWN0b3J5IDxzYW1wPnJlcG9ydHM8L3NhbXA+IGFuZAorZ2VuZXJhdGUgdGhlIGRlZmF1bHQgZnJhbWVkIHJlcG9ydCBpbiB0aGUgZGlyZWN0b3J5IDxzYW1wPnJlcG9ydC9odG1sPC9zYW1wPi48L3A+CisKKzxwcmU+CismbHQ7anVuaXRyZXBvcnQgdG9kaXI9JnF1b3Q7Li9yZXBvcnRzJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuL3JlcG9ydHMmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7VEVTVC0qLnhtbCZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworICAgICZsdDtyZXBvcnQgZm9ybWF0PSZxdW90O2ZyYW1lcyZxdW90OyB0b2Rpcj0mcXVvdDsuL3JlcG9ydC9odG1sJnF1b3Q7LyZndDsKKyZsdDsvanVuaXRyZXBvcnQmZ3Q7PC9wcmU+CisKKzxwPlRoaXMgZXhhbXBsZSByZXF1aXJlcyBhIGZpbGUgY2FsbGVkIDxzYW1wPmp1bml0cmVwb3J0L2p1bml0LWZyYW1lcy54c2w8L3NhbXA+LiBUaGUgWFNMCitwYXJhbWV0ZXJzIDxxPmtleTE8L3E+IGFuZCA8cT5rZXkyPC9xPiB3aWxsIGJlIHBhc3NlZCB0byB0aGUgWFNMIHRyYW5zZm9ybWF0aW9uLjwvcD4KKworPHByZT4KICZsdDtqdW5pdHJlcG9ydCB0b2Rpcj0iJHtvdXRwdXRkaXJ9IiZndDsKICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7anJkaXJ9IiZndDsKICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0iVEVTVC0qLnhtbCIvJmd0OwogICAgICZsdDsvZmlsZXNldCZndDsKICAgICAmbHQ7cmVwb3J0IHRvZGlyPSIke291dHB1dGRpcn0vaHRtbCIKLSAgICAgICAgc3R5bGVkaXI9Imp1bml0cmVwb3J0IgotICAgICAgICBmb3JtYXQ9ImZyYW1lcyImZ3Q7CisgICAgICAgICAgICBzdHlsZWRpcj0ianVuaXRyZXBvcnQiCisgICAgICAgICAgICBmb3JtYXQ9ImZyYW1lcyImZ3Q7CiAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJrZXkxIiBleHByZXNzaW9uPSJ2YWx1ZTEiLyZndDsKICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImtleTIiIGV4cHJlc3Npb249InZhbHVlMiIvJmd0OwogICAgICZsdDsvcmVwb3J0Jmd0OwotJmx0Oy9qdW5pdHJlcG9ydCZndDsKLSAgPC9wcmU+Ci0gIDwvYmxvY2txdW90ZT4KLTxwPlRoaXMgZXhhbXBsZSByZXF1aXJlcyBhIGZpbGUgY2FsbGVkIDx0dD5qdW5pdHJlcG9ydC9qdW5pdC1mcmFtZXMueHNsPC90dD4uCi0gICAgVGhlIFhTTCBwYXJhbWV0ZXJzIGtleTEgYW5kIGtleTIgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIFhTTCB0cmFuc2Zvcm1hdGlvbi48L3A+CismbHQ7L2p1bml0cmVwb3J0Jmd0OzwvcHJlPgogCiA8L2JvZHk+Ci0KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9sZW5ndGguaHRtbCBiL21hbnVhbC9UYXNrcy9sZW5ndGguaHRtbAppbmRleCAxOGM2MmM3Li5hOWQxY2QxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvbGVuZ3RoLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2xlbmd0aC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkxlbmd0aCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDEwMyArMjUsMTAwIEBACiA8Ym9keT4KIAogPGgyPkxlbmd0aDwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuMzwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkRpc3BsYXkgb3Igc2V0IGEgcHJvcGVydHkgY29udGFpbmluZyBsZW5ndGggaW5mb3JtYXRpb24gZm9yCi0gICBhIHN0cmluZywgYSBmaWxlLCBvciBvbmUgb3IgbW9yZSBuZXN0ZWQKLSAgIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy4KLSAgIENhbiBhbHNvIGJlIHVzZWQgYXMgYSBjb25kaXRpb24uIDxiPlNpbmNlIEFwYWNoZSBBbnQgMS42LjM8L2I+PC9wPgorPHA+RGlzcGxheSBvciBzZXQgYSBwcm9wZXJ0eSBjb250YWluaW5nIGxlbmd0aCBpbmZvcm1hdGlvbiBmb3IgYSBzdHJpbmcsIGEgZmlsZSwgb3Igb25lIG9yIG1vcmUKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4uICBDYW4gYWxzbyBiZSB1c2VkIGFzCithIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4uPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCIgY29sc3Bhbj0iMiI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgdG8gc2V0LiAgSWYgb21pdHRlZAotICAgICAgdGhlIHJlc3VsdHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGxvZy4gSWdub3JlZCB3aGVuCi0gICAgICBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2s8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5Db25kaXRpb248L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNpbmdsZSBmaWxlIHdob3NlIGxlbmd0aCB0byByZXBvcnQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjMiPk9uZSBvZiB0aGVzZSwKLSAgICAgIG9yIG9uZSBvciBtb3JlIG5lc3RlZCBmaWxlc2V0czwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzsgYnkgZGVmYXVsdCwgb3V0cHV0IHZhbHVlIHRvIHRoZSBsb2c8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5JZ25vcmVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2luZ2xlIHJlc291cmNlIHdob3NlIGxlbmd0aCB0byByZXBvcnQgKHVzaW5nIGV4dGVuZGVkCi0gICAgICA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjcHJvcGVydHlIZWxwZXIiPnByb3BlcnRpZXMgaGFuZGxpbmc8L2E+KS4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjE8L2VtPgorICAgIDx0ZD5tb2RlPC90ZD4KKyAgICA8dGQ+RmlsZSBsZW5ndGggbW9kZTsgd2hlbiA8cT5hbGw8L3E+IHRoZSByZXN1bHRpbmcgdmFsdWUgaXMgdGhlIHN1bSBvZiBhbGwgaW5jbHVkZWQgcmVzb3VyY2VzJworICAgICAgbGVuZ3Roczsgd2hlbiA8cT5lYWNoPC9xPiB0aGUgdGFzayBvdXRwdXRzIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBsZW5ndGggb2YgZWFjaCBpbmNsdWRlZAorICAgICAgcmVzb3VyY2UsIG9uZSBwZXIgbGluZS48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyA8cT5hbGw8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+U2luZ2xlIGZpbGUgd2hvc2UgbGVuZ3RoIHRvIHJlcG9ydC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIzIiBjb2xzcGFuPSIyIj5PbmUgb2YgdGhlc2UsIG9yIG9uZSBvciBtb3JlIG5lc3RlZCBmaWxlc2V0czwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVzb3VyY2U8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U2luZ2xlIHJlc291cmNlIHdob3NlIGxlbmd0aCB0byByZXBvcnQgKHVzaW5nCisgICAgICBleHRlbmRlZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjcHJvcGVydHlIZWxwZXIiPnByb3BlcnRpZXMgaGFuZGxpbmc8L2E+KS4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4xPC9lbT4KICAgICA8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB3aG9zZSBsZW5ndGggdG8gcmVwb3J0LjwvdGQ+CisgICAgPHRkPnN0cmluZzwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgc3RyaW5nIHdob3NlIGxlbmd0aCB0byByZXBvcnQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bW9kZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlIGxlbmd0aCBtb2RlOyB3aGVuICZxdW90O2FsbCZxdW90OyB0aGUgcmVzdWx0aW5nCi0gICAgICB2YWx1ZSBpcyB0aGUgc3VtIG9mIGFsbCBpbmNsdWRlZCByZXNvdXJjZXMnIGxlbmd0aHM7IHdoZW4gJnF1b3Q7ZWFjaCZxdW90OwotICAgICAgdGhlIHRhc2sgb3V0cHV0cyB0aGUgYWJzb2x1dGUgcGF0aCBhbmQgbGVuZ3RoIG9mIGVhY2ggaW5jbHVkZWQgcmVzb3VyY2UsCi0gICAgICBvbmUgcGVyIGxpbmUuIElnbm9yZWQgd2hlbiBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyAmcXVvdDthbGwmcXVvdDs8L3RkPgorICAgIDx0ZD50cmltPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byB0cmltIHdoZW4gb3BlcmF0aW5nIG9uIGEgc3RyaW5nLjwvdGQ+CisgICAgPHRkIGNvbHNwYW49IjIiPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPiwgaWdub3JlZCB1bmxlc3MgPHZhcj5zdHJpbmc8L3Zhcj4gaXMgc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJpbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHRyaW0gd2hlbiBvcGVyYXRpbmcgb24gYSBzdHJpbmcuIERlZmF1bHQgPGk+ZmFsc2U8L2k+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Obzsgb25seSB2YWxpZCB3aGVuIHN0cmluZyBpcyBzZXQ8L3RkPgorICAgIDx0ZD5sZW5ndGg8L3RkPgorICAgIDx0ZD5Db21wYXJpc29uIGxlbmd0aC48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIiByb3dzcGFuPSIyIj5JZ25vcmVkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGVuZ3RoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbXBhcmlzb24gbGVuZ3RoIGZvciBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIGluIGNvbmRpdGlvbiBtb2RlPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21wYXJpc29uIHR5cGU6ICJlcXVhbCIsICJlcSIsICJncmVhdGVyIiwgImd0IiwgImxlc3MiLAotICAgICAgImx0IiwgImdlIiAoZ3JlYXRlciBvciBlcXVhbCksICJuZSIgKG5vdCBlcXVhbCksICJsZSIgKGxlc3Mgb3IgZXF1YWwpCi0gICAgICBmb3IgdXNlIHdoZW4gb3BlcmF0aW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyAiZXF1YWwiPC90ZD4KKyAgICA8dGQ+d2hlbjwvdGQ+CisgICAgPHRkPkNvbXBhcmlzb24KKyAgICAgIHR5cGU6IDxxPmVxdWFsPC9xPiwgPHE+ZXE8L3E+LCA8cT5ncmVhdGVyPC9xPiwgPHE+Z3Q8L3E+LCA8cT5sZXNzPC9xPiwgPHE+bHQ8L3E+LCA8cT5nZTwvcT4KKyAgICAgIChncmVhdGVyIG9yIGVxdWFsKSwgPHE+bmU8L3E+IChub3QgZXF1YWwpLCA8cT5sZTwvcT4gKGxlc3Mgb3IgZXF1YWwpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmVxdWFsPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPGg0PlJlc291cmNlIENvbGxlY3Rpb25zPC9oND4KLTxwPllvdSBjYW4gaW5jbHVkZSByZXNvdXJjZXMgdmlhIG5lc3RlZAotICA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMuPC9wPgorPGg0PnJlc291cmNlIGNvbGxlY3Rpb25zPC9oND4KKzxwPllvdSBjYW4gaW5jbHVkZSByZXNvdXJjZXMgdmlhIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZQorY29sbGVjdGlvbjwvYT5zLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPHByZT4mbHQ7bGVuZ3RoIHN0cmluZz0mcXVvdDtmb28mcXVvdDsgcHJvcGVydHk9JnF1b3Q7bGVuZ3RoLmZvbyZxdW90OyAvJmd0OwotPC9wcmU+Ci08cD5TdG9yZXMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICZxdW90O2ZvbyZxdW90OyBpbiB0aGUgcHJvcGVydHkgbmFtZWQKLTxpPmxlbmd0aC5mb288L2k+LjwvcD4KKzxwPlN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyA8cT5mb288L3E+IGluIHRoZSBwcm9wZXJ0eSBuYW1lZCA8Y29kZT5sZW5ndGguZm9vPC9jb2RlPi48L3A+Cis8cHJlPiZsdDtsZW5ndGggc3RyaW5nPSZxdW90O2ZvbyZxdW90OyBwcm9wZXJ0eT0mcXVvdDtsZW5ndGguZm9vJnF1b3Q7LyZndDs8L3ByZT4KIAotPHByZT4mbHQ7bGVuZ3RoIGZpbGU9JnF1b3Q7YmFyJnF1b3Q7IHByb3BlcnR5PSZxdW90O2xlbmd0aC5iYXImcXVvdDsgLyZndDsKLTwvcHJlPgotPHA+U3RvcmVzIHRoZSBsZW5ndGggb2YgZmlsZSAmcXVvdDtiYXImcXVvdDsgaW4gdGhlIHByb3BlcnR5IG5hbWVkCi08aT5sZW5ndGguYmFyPC9pPi48L3A+Cis8cD5TdG9yZSB0aGUgbGVuZ3RoIG9mIGZpbGUgPHNhbXA+YmFyPC9zYW1wPiBpbiB0aGUgcHJvcGVydHkgbmFtZWQgPGNvZGU+bGVuZ3RoLmJhcjwvY29kZT4uPC9wPgorPHByZT4mbHQ7bGVuZ3RoIGZpbGU9JnF1b3Q7YmFyJnF1b3Q7IHByb3BlcnR5PSZxdW90O2xlbmd0aC5iYXImcXVvdDsvJmd0OzwvcHJlPgogCis8cD5TdG9yZSB0aGUgZmlsZSBwYXRocyBvZiA8c2FtcD5mb288L3NhbXA+IGFuZCA8c2FtcD5iYXI8L3NhbXA+IGFuZCB0aGVpciBsZW5ndGggaW50byB0aGUKK3Byb3BlcnR5IDxjb2RlPmxlbmd0aDwvY29kZT4uPC9wPgogPHByZT4KICZsdDtsZW5ndGggcHJvcGVydHk9JnF1b3Q7bGVuZ3RoJnF1b3Q7IG1vZGU9JnF1b3Q7ZWFjaCZxdW90OyZndDsKICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtmb28sYmFyJnF1b3Q7LyZndDsKICZsdDsvbGVuZ3RoJmd0OwogPC9wcmU+Ci08cD5Xcml0ZXMgdGhlIGZpbGUgcGF0aHMgb2YgPGk+Zm9vPC9pPiBhbmQgPGk+YmFyPC9pPiBhbmQgdGhlaXIgbGVuZ3RoIGludG8gCi10aGUgcHJvcGVydHkgPGk+bGVuZ3RoPC9pPi48L3A+CiAKKzxwPkFkZCB0aGUgbGVuZ3RoIG9mIDxzYW1wPmZvbzwvc2FtcD4gYW5kIDxzYW1wPmJhcjwvc2FtcD4gYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4KK3Byb3BlcnR5IDxjb2RlPmxlbmd0aDwvY29kZT4uPC9wPgogPHByZT4KICZsdDtsZW5ndGggcHJvcGVydHk9JnF1b3Q7bGVuZ3RoJnF1b3Q7IG1vZGU9JnF1b3Q7YWxsJnF1b3Q7Jmd0OwogICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90O2ZvbyxiYXImcXVvdDsvJmd0OwogJmx0Oy9sZW5ndGgmZ3Q7CiA8L3ByZT4KLTxwPkFkZHMgdGhlIGxlbmd0aCBvZiA8aT5mb288L2k+IGFuZCA8aT5iYXI8L2k+IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBwcm9wZXJ0eSA8aT5sZW5ndGg8L2k+LjwvcD4KLQogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9saW5rLmh0bWwgYi9tYW51YWwvVGFza3MvbGluay5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDEzNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tYW51YWwvVGFza3MvbGluay5odG1sCkBAIC0wLDAgKzEsNTgwIEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCBsYW5nPSJlbiI+CisKKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5MaW5rIFRhc2s8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keT4KKworPGgyIGlkPSJsaW5rIj5MaW5rPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuMTAuNjwvZW0+PC9wPgorCis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+QXNzZW1ibGVzIGptb2QgZmlsZXMgaW50byBhbiBleGVjdXRhYmxlIGltYWdlLiAgRXF1aXZhbGVudCB0byB0aGUgSkRLJ3MKKzxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL3Rvb2xzL2psaW5rLmh0bWwiPmpsaW5rPC9hPgordG9vbC4KKzwvcD4KKzxwPlJlcXVpcmVzIEphdmEgOSBvciBsYXRlci48L3A+CisKKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVzdERpcjwvdGQ+CisgICAgPHRkPlJvb3QgZGlyZWN0b3J5IG9mIGNyZWF0ZWQgaW1hZ2UuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tb2R1bGVwYXRoPC90ZD4KKyAgICA8dGQ+UGF0aC1saWtlIHNlcXVlbmNlIG9mIGptb2QgZmlsZXMgdG8gbGluayBpbiBvcmRlciB0byBjcmVhdGUgaW1hZ2UuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+T25lIG9mIHRoZXNlIGlzIHJlcXVpcmVkLCB1bmxlc3MgYSBuZXN0ZWQKKyAgICAgICAgPGNvZGU+Jmx0O21vZHVsZXBhdGgmZ3Q7PC9jb2RlPiBpcyBwcmVzZW50LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bW9kdWxlcGF0aHJlZjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5QYXRoLWxpa2Ugc2VxdWVuY2Ugb2Ygam1vZCBmaWxlcyB0byBsaW5rIGluIG9yZGVyIHRvCisgICAgICAgIGNyZWF0ZSBpbWFnZSwgZ2l2ZW4gYXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KKyAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bW9kdWxlczwvdGQ+CisgICAgPHRkPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gcGxhY2UgaW4gdGhlIGxpbmtlZCBpbWFnZS48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBvbmUgb3IgbW9yZSBuZXN0ZWQgPGNvZGU+Jmx0O21vZHVsZSZndDs8L2NvZGU+IGVsZW1lbnRzCisgICAgICAgIGFyZSBwcmVzZW50LjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b2JzZXJ2YWJsZU1vZHVsZXM8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHBsaWNpdCBtb2R1bGVzIHRoYXQgY29tcHJpc2UKKyAgICAgICAgInVuaXZlcnNlIiB2aXNpYmxlIHRvIGxpbmsgdG9vbCB3aGlsZSBsaW5raW5nLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sYXVuY2hlcnM8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb21tYW5kcywgZWFjaCBvZiB0aGUgZm9ybQorICAgICAgICA8dmFyPm5hbWU8L3Zhcj48Y29kZT49PC9jb2RlPjx2YXI+bW9kdWxlPC92YXI+IG9yCisgICAgICAgIDx2YXI+bmFtZTwvdmFyPjxjb2RlPj08L2NvZGU+PHZhcj5tb2R1bGU8L3Zhcj48Y29kZT4vPC9jb2RlPjx2YXI+bWFpbmNsYXNzPC92YXI+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmxvY2FsZXM8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHRyYSBsb2NhbGVzLCBvciB3aWxkY2FyZCBwYXR0ZXJucyBtYXRjaGluZworICAgICAgICBtdWx0aXBsZSBsb2NhbGUgbmFtZXMsIHRvIGluY2x1ZGUuCisgICAgICAgIFJlcXVpcmVzIDxjb2RlPmpkay5sb2NhbGVkYXRhPC9jb2RlPiBtb2R1bGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmV4Y2x1ZGVSZXNvdXJjZXM8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBzcGVjaWZ5aW5nIHJlc291cmNlcyB0byBleGNsdWRlCisgICAgICAgIGZyb20gc291cmNlIGptb2RzLiAgRWFjaCBpcyBlaXRoZXIgYQorICAgICAgICA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBvciA8Y29kZT5APC9jb2RlPjx2YXI+ZmlsZW5hbWU8L3Zhcj4sIGluZGljYXRpbmcgYSB0ZXh0IGZpbGUgd2l0aAorICAgICAgICBvbmUgcmVzb3VyY2UgbmFtZSBwZXIgbGluZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZXhjbHVkZUZpbGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgc3BlY2lmeWluZyBmaWxlcyB0byBleGNsdWRlCisgICAgICAgIGZyb20gbGlua2VkIGltYWdlLiAgRWFjaCBpcyBlaXRoZXIgYQorICAgICAgICA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBvciA8Y29kZT5APC9jb2RlPjx2YXI+ZmlsZW5hbWU8L3Zhcj4sIGluZGljYXRpbmcgYSB0ZXh0IGZpbGUgd2l0aAorICAgICAgICBvbmUgZmlsZSBuYW1lIHBlciBsaW5lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZXNvdXJjZU9yZGVyPC90ZD4KKyAgICA8dGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgc3BlY2lmeWluZyByZXNvdXJjZSBzZWFyY2ggb3JkZXIuCisgICAgICAgIEVhY2ggaXMgZWl0aGVyIGEKKyAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbmlvL2ZpbGUvRmlsZVN5c3RlbS5odG1sI2dldFBhdGhNYXRjaGVyJTI4amF2YS5sYW5nLlN0cmluZyUyOSI+c3RhbmRhcmQgUGF0aE1hdGNoZXIgcGF0dGVybjwvYT4KKyAgICAgICAgb3IgPGNvZGU+QDwvY29kZT48dmFyPmZpbGVuYW1lPC92YXI+LCBpbmRpY2F0aW5nIGEgdGV4dCBmaWxlIHdpdGgKKyAgICAgICAgb25lIHJlc291cmNlIG5hbWUgcGVyIGxpbmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmJpbmRTZXJ2aWNlczwvdGQ+CisgICAgPHRkPkJvb2xlYW4sIHdoZXRoZXIgdG8gaW5jbHVkZSBpbiBsaW5rZWQgaW1hZ2UgYW55IHNlcnZpY2UgcHJvdmlkZXJzCisgICAgICAgIGZvdW5kIGluIG1vZHVsZSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2VzCisgICAgICAgIHVzZWQgYnkgZXhwbGljaXRseSBsaW5rZWQgbW9kdWxlcy48L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aWdub3JlU2lnbmluZzwvdGQ+CisgICAgPHRkPkJvb2xlYW4sIHdoZXRoZXIgdG8gYWxsb3cgc2lnbmVkIGphciBmaWxlcy4KKyAgICAgICAgKE5vdGU6IEFzIG9mIEphdmEgMTEsIHRoaXMgaXMgaWdub3JlZCBhbmQgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgdHJ1ZS4pPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmluY2x1ZGVIZWFkZXJzPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiwgd2hldGhlciB0byBpbmNsdWRlIGhlYWRlciBmaWxlcyBpbiBsaW5rZWQgaW1hZ2UuPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aW5jbHVkZU1hblBhZ2VzPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiwgd2hldGhlciB0byBpbmNsdWRlIG1hbiBwYWdlcyBpbiBsaW5rZWQgaW1hZ2UuPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aW5jbHVkZU5hdGl2ZUNvbW1hbmRzPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbiwgd2hldGhlciB0byBpbmNsdWRlIG5hdGl2ZSBleGVjdXRhYmxlcyBpbiBsaW5rZWQgaW1hZ2UuPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVidWc8L3RkPgorICAgIDx0ZD5Cb29sZWFuLCB3aGV0aGVyIHRvIGluY2x1ZGUgZGVidWcgaW5mb3JtYXRpb24uPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgdHJ1ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmVyYm9zZUxldmVsPC90ZD4KKyAgICA8dGQ+SWYgc2V0LCB0aGUgbGlua2VyIHdpbGwgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCwgd2hpY2ggd2lsbCBiZSBsb2dnZWQgYXQKKyAgICAgICAgdGhlIHNwZWNpZmllZCBBbnQgbG9nIGxldmVsICg8Y29kZT5ERUJVRzwvY29kZT4sIDxjb2RlPlZFUkJPU0U8L2NvZGU+LAorICAgICAgICA8Y29kZT5JTkZPPC9jb2RlPiwgPGNvZGU+V0FSTjwvY29kZT4sIG9yIDxjb2RlPkVSUjwvY29kZT4pLjwvdGQ+CisgICAgPHRkPk5vLCBkZWZhdWx0IGlzIG5vIHZlcmJvc2Ugb3V0cHV0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21wcmVzczwvdGQ+CisgICAgPHRkPkNvbXByZXNzaW9uIGxldmVsIG9mIGxpbmtlZCBpbWFnZS4gT25lIG9mOgorICAgICAgICA8ZGw+CisgICAgICAgIDxkdD48Y29kZT4wPC9jb2RlPiBvcgorICAgICAgICAgICAgPGNvZGU+bm9uZTwvY29kZT48L2R0PgorICAgICAgICA8ZGQ+bm8gY29tcHJlc3Npb24gKGRlZmF1bHQpPC9kZD4KKyAgICAgICAgPGR0Pjxjb2RlPjE8L2NvZGU+IG9yCisgICAgICAgICAgICA8Y29kZT5zdHJpbmdzPC9jb2RlPjwvZHQ+CisgICAgICAgIDxkZD5jb25zdGFudCBzdHJpbmcgc2hhcmluZzwvZGQ+CisgICAgICAgIDxkdD48Y29kZT4yPC9jb2RlPiBvcgorICAgICAgICAgICAgPGNvZGU+emlwPC9jb2RlPjwvZHQ+CisgICAgICAgIDxkZD56aXAgY29tcHJlc3Npb248L2RkPgorICAgICAgICA8L2RsPgorICAgIDwvdGQ+CisgICAgPHRkPk5vLCBkZWZhdWx0IGlzIG5vIGNvbXByZXNzaW9uPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5lbmRpYW5uZXNzPC90ZD4KKyAgICA8dGQ+Qnl0ZSBvcmRlciBvZiBsaW5rZWQgaW1hZ2UsIG11c3QgYmUgPGNvZGU+bGl0dGxlPC9jb2RlPiBvciA8Y29kZT5iaWc8L2NvZGU+CisgICAgPHRkPk5vLCBkZWZhdWx0IGlzIG5hdGl2ZSBieXRlIG9yZGVyPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jaGVja0R1cGxpY2F0ZUxlZ2FsPC90ZD4KKyAgICA8dGQ+Qm9vbGVhbi4gIFdoZW4gbWVyZ2luZyBsZWdhbCBub3RpY2VzIGZyb20gZGlmZmVyZW50IG1vZHVsZXMKKyAgICAgICAgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZSwgdmVyaWZ5IHRoYXQgdGhlaXIgY29udGVudHMKKyAgICAgICAgYXJlIGlkZW50aWNhbC48L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdCBpcyBmYWxzZSwgd2hpY2ggbWVhbnMgYW55IGxpY2Vuc2UgZmlsZXMKKyAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGFyZSBhc3N1bWVkIHRvIGhhdmUgdGhlIHNhbWUgY29udGVudCwgYW5kIG5vCisgICAgICAgIGNoZWNraW5nIGlzIGRvbmUuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52bVR5cGU8L3RkPgorICAgIDx0ZD5Ib3RzcG90IFZNIGluIGltYWdlLiBPbmUgb2Y6CisgICAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxjb2RlPmNsaWVudDwvY29kZT4KKyAgICAgICAgPGxpPjxjb2RlPnNlcnZlcjwvY29kZT4KKyAgICAgICAgPGxpPjxjb2RlPm1pbmltYWw8L2NvZGU+CisgICAgICAgIDxsaT48Y29kZT5hbGw8L2NvZGU+CisgICAgICAgIDwvdWw+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgPGNvZGU+YWxsPC9jb2RlPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPHA+PGNvZGU+Jmx0O2xpbmsmZ3Q7PC9jb2RlPiBjYW4gaGF2ZSB0aGUgZm9sbG93aW5nIG5lc3RlZCBlbGVtZW50czo8L3A+Cis8dWw+Cis8bGk+PGEgaHJlZj0iI25lc3RlZC1tb2R1bGVwYXRoIj5tb2R1bGVwYXRoPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI25lc3RlZC1tb2R1bGUiPm1vZHVsZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtb2JzZXJ2YWJsZU1vZHVsZSI+b2JzZXJ2YWJsZU1vZHVsZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtbGF1bmNoZXIiPmxhdW5jaGVyPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iI25lc3RlZC1sb2NhbGUiPmxvY2FsZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtcmVzb3VyY2VPcmRlciI+cmVzb3VyY2VPcmRlcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtZXhjbHVkZVJlc291cmNlcyI+ZXhjbHVkZVJlc291cmNlczwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtZXhjbHVkZUZpbGVzIj5leGNsdWRlRmlsZXM8L2E+PC9saT4KKzxsaT48YSBocmVmPSIjbmVzdGVkLWNvbXByZXNzIj5jb21wcmVzczwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNuZXN0ZWQtcmVsZWFzZUluZm8iPnJlbGVhc2VJbmZvPC9hPjwvbGk+Cis8L3VsPgorCis8aDQgaWQ9Im5lc3RlZC1tb2R1bGVwYXRoIj5tb2R1bGVwYXRoPC9oND4KKzxwPjxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gcG9pbnRpbmcgdG8KKyAgICBqbW9kIGZpbGVzIHRvIGxpbmsgaW50byBpbWFnZS48L3A+CisKKzxoNCBpZD0ibmVzdGVkLW1vZHVsZSI+bW9kdWxlPC9oND4KKzxwPk5hbWVzIGEgc2luZ2xlIG1vZHVsZSB0byBiZSBwbGFjZWQgaW4gdGhlIGxpbmtlZCBpbWFnZS4gIFRoaXMgbWF5IGJlCitzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuPC9wPgorPHA+QXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIG1vZHVsZSB0byBhZGQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoNCBpZD0ibmVzdGVkLW9ic2VydmFibGVNb2R1bGUiPm9ic2VydmFibGVNb2R1bGU8L2g0PgorPHA+TmFtZXMgYSBtb2R1bGUgdmlzaWJsZSB0byB0aGUgbGlua2luZyBwcm9jZXNzLCBpbnN0ZWFkIG9mIGV2ZXJ5IG1vZHVsZQoraW4gdGhlIG1vZHVsZSBwYXRoIGJlaW5nIGNvbnNpZGVyZWQuICBUaGlzIG1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCis8cD5BdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgbW9kdWxlIHRvIGFkZCB0byBsaXN0IG9mIG9ic2VydmFibGUgbW9kdWxlcy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0IGlkPSJuZXN0ZWQtbGF1bmNoZXIiPmxhdW5jaGVyPC9oND4KKzxwPlNwZWNpZmllcyBhbiBleGVjdXRhYmxlIGZpbGUgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlua2VkIGltYWdlLAord2hpY2ggZXhlY3V0ZXMgYSBwYXJ0aWN1bGFyIG1vZHVsZSdzIG1haW4gY2xhc3MuICBBdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgbGF1bmNoZXIuICBUaGlzIHR5cGljYWxseSBpcyB1c2VkIGZvciB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgZXhlY3V0YWJsZSBmaWxlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bW9kdWxlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBtb2R1bGUgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1haW5DbGFzczwvdGQ+CisgICAgPHRkPk5hbWUgb2YgZW50cnkgcG9pbnQgY2xhc3MgaW4gbW9kdWxlIHRvIGV4ZWN1dGUuPC90ZD4KKyAgICA8dGQ+UmVxdWlyZWQgdW5sZXNzIG1vZHVsZSBoYXMgaXRzIG93biBtYWluIGNsYXNzIGRlZmluZWQuPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoNCBpZD0ibmVzdGVkLWxvY2FsZSI+bG9jYWxlPC9oND4KKzxwPlNwZWNpZmllcyBsb2NhbGVzIHRvIGluY2x1ZGUgaW4gbGlua2VkIGltYWdlLiAgTWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZQordGltZXMuICBSZXF1aXJlcyA8Y29kZT5qZGsubG9jYWxlZGF0YTwvY29kZT4gbW9kdWxlLiAgQXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGxvY2FsZSwgb3Igd2lsZGNhcmQgcGF0dGVybiB3aXRoIDxxPjxjb2RlPio8L2NvZGU+PC9xPgorICAgICAgICB0aGF0IG1hdGNoZXMgbXVsdGlwbGUgbG9jYWxlIG5hbWVzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQgaWQ9Im5lc3RlZC1yZXNvdXJjZU9yZGVyIj5yZXNvdXJjZU9yZGVyPC9oND4KKzxwPkV4cGxpY2l0IHJlc291cmNlIHNlYXJjaCBvcmRlciBpbiBsaW5rZWQgaW1hZ2UuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlCit0aW1lcy4gIEF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wYXR0ZXJuPC90ZD4KKyAgICA8dGQ+QSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBmb3IgbWF0Y2hpbmcgcmVzb3VyY2VzPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmxpc3RGaWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRleHQgZmlsZSBjb250YWluaW5nIGxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgKG5vdCBwYXR0ZXJucyksCisgICAgICAgIG9uZSBwZXIgbGluZTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD5JZiB0aGUgPGNvZGU+cmVzb3VyY2VPcmRlcjwvY29kZT4gYXR0cmlidXRlIGlzIGFsc28gcHJlc2VudCBvbiB0aGUgdGFzaywgaXRzCitwYXR0ZXJucyBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IG9jY3VyIGJlZm9yZSBwYXR0ZXJucyBpbiBuZXN0ZWQKKzxjb2RlPiZsdDtyZXNvdXJjZU9yZGVyJmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorCis8aDQgaWQ9Im5lc3RlZC1leGNsdWRlUmVzb3VyY2VzIj5leGNsdWRlUmVzb3VyY2VzPC9oND4KKzxwPkV4Y2x1ZGVzIGZpbGVzIGZyb20gbGlua2VkIGltYWdlIHRyZWUuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLgorICAgQXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnBhdHRlcm48L3RkPgorICAgIDx0ZD5BIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL25pby9maWxlL0ZpbGVTeXN0ZW0uaHRtbCNnZXRQYXRoTWF0Y2hlciUyOGphdmEubGFuZy5TdHJpbmclMjkiPnN0YW5kYXJkIFBhdGhNYXRjaGVyIHBhdHRlcm48L2E+CisgICAgICAgIGZvciBtYXRjaGluZyByZXNvdXJjZXM8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGlzdEZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGV4dCBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiByZXNvdXJjZSBuYW1lcyAobm90IHBhdHRlcm5zKSwKKyAgICAgICAgb25lIHBlciBsaW5lPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoNCBpZD0ibmVzdGVkLWV4Y2x1ZGVGaWxlcyI+ZXhjbHVkZUZpbGVzPC9oND4KKzxwPkV4Y2x1ZGVzIGZpbGVzIGZyb20gbGlua2VkIGltYWdlLiAgTWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4KKyAgIEF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wYXR0ZXJuPC90ZD4KKyAgICA8dGQ+QSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBmb3IgbWF0Y2hpbmcgZmlsZXM8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGlzdEZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGV4dCBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlIG5hbWVzIChub3QgcGF0dGVybnMpLAorICAgICAgICBvbmUgcGVyIGxpbmU8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0IGlkPSJuZXN0ZWQtY29tcHJlc3MiPmNvbXByZXNzPC9oND4KKzxwPkRlc2NyaWJlcyBob3cgaW1hZ2Ugc2hvdWxkIGJlIGNvbXByZXNzZWQuICBBdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGV2ZWw8L3RkPgorICAgIDx0ZD5Db21wcmVzc2lvbiBsZXZlbCBvZiBsaW5rZWQgaW1hZ2UuIE9uZSBvZjoKKyAgICAgICAgPGRsPgorICAgICAgICA8ZHQ+PGNvZGU+MDwvY29kZT4gb3IKKyAgICAgICAgICAgIDxjb2RlPm5vbmU8L2NvZGU+PC9kdD4KKyAgICAgICAgPGRkPm5vIGNvbXByZXNzaW9uIChkZWZhdWx0KTwvZGQ+CisgICAgICAgIDxkdD48Y29kZT4xPC9jb2RlPiBvcgorICAgICAgICAgICAgPGNvZGU+c3RyaW5nczwvY29kZT48L2R0PgorICAgICAgICA8ZGQ+Y29uc3RhbnQgc3RyaW5nIHNoYXJpbmc8L2RkPgorICAgICAgICA8ZHQ+PGNvZGU+MjwvY29kZT4gb3IKKyAgICAgICAgICAgIDxjb2RlPnppcDwvY29kZT48L2R0PgorICAgICAgICA8ZGQ+emlwIGNvbXByZXNzaW9uPC9kZD4KKyAgICAgICAgPC9kbD4KKyAgICA8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZpbGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgbWF0Y2hpbmcgZmlsZXMgdG8gY29tcHJlc3MuCisgICAgICAgIEVhY2ggcGF0dGVybiBlaXRoZXIgYQorICAgICAgICA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBvciA8Y29kZT5APC9jb2RlPjx2YXI+ZmlsZW5hbWU8L3Zhcj4sIGluZGljYXRpbmcgYSB0ZXh0IGZpbGUgd2l0aAorICAgICAgICBvbmUgZmlsZSBuYW1lIHBlciBsaW5lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxwPjxjb2RlPiZsdDtjb21wcmVzcyZndDs8L2NvZGU+IGNhbiBhbHNvIGhhdmUgYW55IG51bWJlciBvZiBuZXN0ZWQKKzxjb2RlPiZsdDtmaWxlcyZndDs8L2NvZGU+IGVsZW1lbnRzLCB3aXRoIHRoZXNlIGF0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wYXR0ZXJuPC90ZD4KKyAgICA8dGQ+QSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICBmb3IgbWF0Y2hpbmcgZmlsZXM8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGlzdEZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGV4dCBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlIG5hbWVzIChub3QgcGF0dGVybnMpLAorICAgICAgICBvbmUgcGVyIGxpbmU8L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg0IGlkPSJuZXN0ZWQtcmVsZWFzZUluZm8iPnJlbGVhc2VJbmZvPC9oND4KKzxwPlJlcGxhY2VzLCBhdWdtZW50cywgb3IgdHJpbXMgdGhlIGltYWdlJ3MgcmVsZWFzZSBpbmZvIHByb3BlcnRpZXMuCitDYW4gYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiAgQXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5KYXZhIHByb3BlcnRpZXMgZmlsZSBjb250YWluaW5nIG5ldyByZWxlYXNlIGluZm8gcHJvcGVydGllcworICAgICAgICB0aGF0IHdpbGwgZW50aXJlbHkgcmVwbGFjZSB0aGUgY3VycmVudCBvbmVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kZWxldGU8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgcHJvcGVydHkga2V5cyB0byByZW1vdmUgZnJvbSBhcHBsaWNhdGlvbidzCisgICAgICAgIHJlbGVhc2UgaW5mbworICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8cD48Y29kZT4mbHQ7cmVsZWFzZUluZm8mZ3Q7PC9jb2RlPiBjYW4gYWxzbyBoYXZlIGFueSBudW1iZXIgb2YgdGhlc2UgbmVzdGVkIGVsZW1lbnRzOjwvcD4KKzxoNT5hZGQ8L2g1PgorPHA+U3BlY2lmaWVzIGFkZGl0aW9uYWwgcmVsZWFzZSBpbmZvIHByb3BlcnRpZXMuICBBdHRyaWJ1dGVzOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+a2V5PC90ZD4KKyAgICA8dGQ+S2V5IG9mIHNpbmdsZSBwcm9wZXJ0eSB0byBhZGQuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+WWVzLCB1bmxlc3MgPGNvZGU+ZmlsZTwvY29kZT4gaXMgc3BlY2lmaWVkPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5WYWx1ZSBvZiBzaW5nbGUgcHJvcGVydHkgdG8gYWRkLjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPkphdmEgcHJvcGVydHkgZmlsZSBjb250YWluaW5nIGFueSBudW1iZXIgb2YgcHJvcGVydGllcyB0byBhZGQuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgPGNvZGU+a2V5PC9jb2RlPiBhbmQgPGNvZGU+dmFsdWU8L2NvZGU+IGFyZSBzcGVjaWZpZWQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNoYXJzZXQ8L3RkPgorICAgIDx0ZD5DaGFyYWN0ZXIgc2V0IG9mIHByb3BlcnR5IGZpbGUuPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHQgaXMgPGNvZGU+SVNPXzg4NTlfMTwvY29kZT4sIGluIGFjY29yZGFuY2Ugd2l0aAorICAgICAgICBqYXZhLnV0aWwuUHJvcGVydGllcyBjbGFzcy48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPGg1PmRlbGV0ZTwvaDU+Cis8cD5Qcm9wZXJ0eSBrZXlzIHRvIHJlbW92ZSBmcm9tIGFwcGxpY2FpdG9uJ3MgcmVsZWFzZSBpbmZvLiAgQXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmtleTwvdGQ+CisgICAgPHRkPktleSBvZiBwcm9wZXJ0eSB0byByZW1vdmUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+Cis8aDQ+QmFzaWMgbGlua2luZzwvaDQ+Cis8cHJlPgorJmx0O2ptb2QgZGVzdGZpbGU9Ik15QXBwLmptb2QiIGNsYXNzcGF0aD0iYnVpbGQvbXlhcHAuamFyIi8mZ3Q7CismbHQ7bGluayBkZXN0RGlyPSJidWlsZC9pbWFnZSIgbW9kdWxlcGF0aD0iTXlBcHAuam1vZCIKKyAgICAgIG1vZHVsZXM9ImNvbS5leGFtcGxlLm15YXBwIi8mZ3Q7Cis8L3ByZT4KKworPGg0PkN1c3RvbSBiaW5hcmllczwvaDQ+Cis8cD5UaGlzIHdpbGwgY2F1c2UgYSA8c2FtcD5iaW4vTXlFZGl0b3I8L3NhbXA+IHNjcmlwdCB0byBhcHBlYXIgaW4gdGhlCitpbWFnZToKKzxwcmU+CismbHQ7am1vZCBkZXN0ZmlsZT0iTXlBcHAuam1vZCIgY2xhc3NwYXRoPSJidWlsZC9teWFwcC5qYXIiLyZndDsKKyZsdDtsaW5rIGRlc3REaXI9ImJ1aWxkL2ltYWdlIiBtb2R1bGVwYXRoPSJNeUFwcC5qbW9kIgorICAgICAgbW9kdWxlcz0iY29tLmV4YW1wbGUubXlhcHAiCisgICAgICBsYXVuY2hlcnM9Ik15RWRpdG9yPWNvbS5leGFtcGxlLm15YXBwL2NvbS5leGFtcGxlLm15YXBwLmVkaXRvcnMuRWRpdG9yTWFpbiIvJmd0OworPC9wcmU+CisKKzxwPlNhbWUgdGhpbmcsIHVzaW5nIGEgbmVzdGVkIGxhdW5jaGVyIGVsZW1lbnQ6PC9wPgorPHByZT4KKyZsdDtqbW9kIGRlc3RmaWxlPSJNeUFwcC5qbW9kIiBjbGFzc3BhdGg9ImJ1aWxkL215YXBwLmphciIvJmd0OworJmx0O2xpbmsgZGVzdERpcj0iYnVpbGQvaW1hZ2UiIG1vZHVsZXBhdGg9Ik15QXBwLmptb2QiCisgICAgICBtb2R1bGVzPSJjb20uZXhhbXBsZS5teWFwcCImZ3Q7CisKKyAgICAmbHQ7bGF1bmNoZXIgbmFtZT0iTXlFZGl0b3IiIG1vZHVsZT0iY29tLmV4YW1wbGUubXlhcHAiCisgICAgICAgICAgICAgIG1haW5DbGFzcz0iY29tLmV4YW1wbGUubXlhcHAuZWRpdG9ycy5FZGl0b3JNYWluIi8mZ3Q7CisKKyZsdDsvbGluayZndDsKKzwvcHJlPgorCis8aDQ+TGltaXRpbmcgbG9jYWxlczwvaDQ+Cis8cD5JbmNsdWRlIGp1c3QgdGhlIGxvY2FsZXMgbmVlZGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBmcm9tIHRoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qZGsubG9jYWxlZGF0YS9tb2R1bGUtc3VtbWFyeS5odG1sIj5qZGsubG9jYWxlZGF0YTwvYT4gbW9kdWxlOjwvcD4KKzxwcmU+CismbHQ7am1vZCBkZXN0ZmlsZT0iTXlBcHAuam1vZCIgY2xhc3NwYXRoPSJidWlsZC9teWFwcC5qYXIiLyZndDsKKyZsdDtsaW5rIGRlc3REaXI9ImJ1aWxkL2ltYWdlIiBtb2R1bGVwYXRoPSJNeUFwcC5qbW9kIgorICAgICAgbW9kdWxlcz0iY29tLmV4YW1wbGUubXlhcHAsamRrLmxvY2FsZWRhdGEiCisgICAgICBsb2NhbGVzPSJ6aCxqcC0qIi8mZ3Q7Cis8L3ByZT4KKworPGg0PkNvbXByZXNzZWQgaW1hZ2U8L2g0PgorPHA+Q29tcHJlc3MgZW50aXJlIGltYWdlOjwvcD4KKzxwcmU+CismbHQ7am1vZCBkZXN0ZmlsZT0iTXlBcHAuam1vZCIgY2xhc3NwYXRoPSJidWlsZC9teWFwcC5qYXIiLyZndDsKKyZsdDtsaW5rIGRlc3REaXI9ImJ1aWxkL2ltYWdlIiBtb2R1bGVwYXRoPSJNeUFwcC5qbW9kIgorICAgICAgbW9kdWxlcz0iY29tLmV4YW1wbGUubXlhcHAsamRrLmxvY2FsZWRhdGEiCisgICAgICBjb21wcmVzcz0iemlwIi8mZ3Q7Cis8L3ByZT4KKworPHA+Q29tcHJlc3Mgb25seSBzb21lIGZpbGVzIGluIHRoZSBpbWFnZTo8L3A+Cis8cHJlPgorJmx0O2ptb2QgZGVzdGZpbGU9Ik15QXBwLmptb2QiIGNsYXNzcGF0aD0iYnVpbGQvbXlhcHAuamFyIi8mZ3Q7CismbHQ7bGluayBkZXN0RGlyPSJidWlsZC9pbWFnZSIgbW9kdWxlcGF0aD0iTXlBcHAuam1vZCIKKyAgICAgIG1vZHVsZXM9ImNvbS5leGFtcGxlLm15YXBwLGpkay5sb2NhbGVkYXRhIiZndDsKKworICAgICZsdDtjb21wcmVzcyBsZXZlbD0iemlwIiBmaWxlcz0iLipcLnhtbCIvJmd0OworCismbHQ7L2xpbmsmZ3Q7Cis8L3ByZT4KKworPGg0PkNyb3NzLWNvbXBpbGluZzwvaDQ+Cis8cD5UbyBjcmVhdGUgYW4gaW1hZ2UgZm9yIGEgZGlmZmVyZW50IHBsYXRmb3JtOgorCis8dWw+Cis8bGk+RG93bmxvYWQgdGhlIEpESyBmb3IgdGhhdCBwbGF0Zm9ybSwgYW5kIGV4cGFuZCB0aGUgYXJjaGl2ZSBtYW51YWxseSBpbnRvCithIGRpcmVjdG9yeSBvZiB5b3VyIGNob2ljZS4gIChEb3dubG9hZGluZyBhIHppcCBvciB0YXIuZ3ogdmVyc2lvbiBvZiBhIEpESworaW5zdGVhZCBvZiBhbiBpbnN0YWxsZXIgd2lsbCBtYWtlIHRoaXMgZWFzaWVyLik8L2xpPgorPGxpPkRldGVybWluZSB0aGUgZm9yZWlnbiBKREsncyBwbGF0Zm9ybSBzdHJpbmcuICBUaGlzIGNhbiBiZSBkb25lIHdpdGgKK2EgY29tbWFuZCB0aGF0IGV4YW1pbmVzIHRoZSBKREsncyA8c2FtcD5qbW9kcy9qYXZhLmJhc2Uuam1vZDwvc2FtcD4gZmlsZToKKzxwcmU+CitqbW9kIGRlc2NyaWJlICIkRk9SRUlHTl9KREtfSE9NRSIvam1vZHMvamF2YS5iYXNlLmptb2QgfCBncmVwICdecGxhdGZvcm0nCis8L3ByZT4KKzwvbGk+Cis8bGk+Q3JlYXRlIHlvdXIgam1vZCB1c2luZyB0aGUgZm9yZWlnbiBKREsncyBwbGF0Zm9ybSBzdHJpbmc6Cis8cHJlPgorJmx0O2ptb2QgZGVzdGZpbGU9Ik15QXBwLmptb2QiIGNsYXNzcGF0aD0iYnVpbGQvbXlhcHAuamFyIiBwbGF0Zm9ybT0id2luZG93cy1hbWQ2NCIvJmd0OworPC9wcmU+Cis8L2xpPgorPGxpPkxpbmsgd2l0aCB0aGUgZm9yZWlnbiBKREsncyA8c2FtcD5qbW9kczwvc2FtcD4gZGlyZWN0b3J5IGluIHRoZSBtb2R1bGUgcGF0aDoKKzxwcmU+CismbHQ7bGluayBkZXN0RGlyPSJidWlsZC9pbWFnZSIKKyAgICAgIG1vZHVsZXBhdGg9Ik15QXBwLmptb2Q7JHtmb3JlaWduLWpkay1ob21lfS9qbW9kcyIKKyAgICAgIG1vZHVsZXM9ImNvbS5leGFtcGxlLm15YXBwIi8mZ3Q7Cis8L3ByZT4KKzwvbGk+Cis8L3VsPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbG9hZGZpbGUuaHRtbCBiL21hbnVhbC9UYXNrcy9sb2FkZmlsZS5odG1sCmluZGV4IDU5MjkxZWQuLjBjOGMyMTYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9sb2FkZmlsZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9sb2FkZmlsZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNyArMTUsNyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkxvYWRGaWxlIFRhc2s8L3RpdGxlPgpAQCAtMjIsMTEyICsyMyw5OCBAQAogCiA8Ym9keT4KIAotCi08aDI+PGEgbmFtZT0ibG9hZGZpbGUiPkxvYWRGaWxlPC9hPjwvaDI+Cis8aDIgaWQ9ImxvYWRmaWxlIj5Mb2FkRmlsZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Ci1TcGVjaWFsaXphdGlvbiBvZiA8YSBocmVmPSJsb2FkcmVzb3VyY2UuaHRtbCI+bG9hZHJlc291cmNlPC9hPiB0aGF0Ci13b3JrcyBvbiBmaWxlcyBleGNsdXNpdmVseSBhbmQgcHJvdmlkZXMgYSBzcmNGaWxlIGF0dHJpYnV0ZSBmb3IKLWNvbnZlbmllbmNlLiAgVW5sZXNzIGFuIGVuY29kaW5nIGlzIHNwZWNpZmllZCwgdGhlIGVuY29kaW5nIG9mIHRoZQotY3VycmVudCBsb2NhbGUgaXMgdXNlZC4KLTwvcD4KLTxwPklmIHRoZSByZXNvdXJjZSBjb250ZW50IGlzIGVtcHR5IChtYXliZSBhZnRlciBwcm9jZXNzaW5nIGEgZmlsdGVyY2hhaW4pIAotdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQuPC9wPgotCis8cD5TcGVjaWFsaXphdGlvbiBvZiA8YSBocmVmPSJsb2FkcmVzb3VyY2UuaHRtbCI+bG9hZHJlc291cmNlPC9hPiB0aGF0IHdvcmtzIG9uIGZpbGVzIGV4Y2x1c2l2ZWx5CithbmQgcHJvdmlkZXMgYSA8dmFyPnNyY0ZpbGU8L3Zhcj4gYXR0cmlidXRlIGZvciBjb252ZW5pZW5jZS4gIFVubGVzcyBhbiA8dmFyPmVuY29kaW5nPC92YXI+IGlzCitzcGVjaWZpZWQsIHRoZSBlbmNvZGluZyBvZiB0aGUgY3VycmVudCBsb2NhbGUgaXMgdXNlZC48L3A+Cis8cD5JZiB0aGUgcmVzb3VyY2UgY29udGVudCBpcyBlbXB0eSAobWF5YmUgYWZ0ZXIgcHJvY2Vzc2luZyBhIDxjb2RlPmZpbHRlcmNoYWluPC9jb2RlPikgdGhlIHByb3BlcnR5CitpcyBub3Qgc2V0LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmNGaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZSBmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNyY0ZpbGU8L3RkPgorICAgIDx0ZD5zb3VyY2UgZmlsZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5IHRvIHNhdmUgdG88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5wcm9wZXJ0eSB0byBzYXZlIHRvPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBvbiBmYWlsdXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJ0cnVlIjwvdGQ+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBvbiBmYWlsdXJlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5xdWlldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMgbWVzc2FnZSAodW5sZXNzIEFwYWNoZSBBbnQgaGFzIGJlZW4gCi0gICAgaW52b2tlZCB3aXRoIHRoZSA8Y29kZT4tdmVyYm9zZTwvY29kZT4gb3IgPGNvZGU+LWRlYnVnPC9jb2RlPgotICAgIHN3aXRjaGVzKSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvIHJlZmxlY3QgYW4gZXJyb3IuIFNldHRpbmcgdGhpcyB0byAKLSAgICAidHJ1ZSIgaW1wbGllcyBzZXR0aW5nIGZhaWxvbmVycm9yIHRvICJmYWxzZSIuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuNy4wLjwvZW0+CisgICAgPHRkPnF1aWV0PC90ZD4KKyAgICA8dGQ+RG8gbm90IGRpc3BsYXkgYSBkaWFnbm9zdGljIG1lc3NhZ2UgKHVubGVzcyBBcGFjaGUgQW50IGhhcyBiZWVuIGludm9rZWQgd2l0aAorICAgICAgdGhlIDxrYmQ+LXZlcmJvc2U8L2tiZD4gb3IgPGtiZD4tZGVidWc8L2tiZD4gc3dpdGNoZXMpIG9yIG1vZGlmeSB0aGUgZXhpdCBzdGF0dXMgdG8KKyAgICAgIHJlZmxlY3QgYW4gZXJyb3IuIFNldHRpbmcgdGhpcyB0byA8cT50cnVlPC9xPiBpbXBsaWVzIHNldHRpbmcgPHZhcj5mYWlsb25lcnJvcjwvdmFyPgorICAgICAgdG8gPHE+ZmFsc2U8L3E+LiA8ZW0+U2luY2UgQW50IDEuNy4wPC9lbT4uCiAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJmYWxzZSI8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogCiA8L3RhYmxlPgotPHA+Ci1UaGUgTG9hZEZpbGUgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+Ci1GaWx0ZXJDaGFpbjwvYT5zLgorPHA+VGhlIExvYWRGaWxlIHRhc2sgc3VwcG9ydHMgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPnMuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICAgJmx0O2xvYWRmaWxlIHByb3BlcnR5PSJtZXNzYWdlIgotICAgICAgc3JjRmlsZT0ibWVzc2FnZS50eHQiLyZndDsKLTwvcHJlPgotTG9hZCBmaWxlIG1lc3NhZ2UudHh0IGludG8gcHJvcGVydHkgIm1lc3NhZ2UiOyBhbiA8dHQ+Jmx0O2VjaG8mZ3Q7PC90dD4KLWNhbiBwcmludCB0aGlzLiAgVGhpcyBpcyBpZGVudGljYWwgdG8KLTxwcmU+ICAgICZsdDtsb2FkcmVzb3VyY2UgcHJvcGVydHk9Im1lc3NhZ2UiJmd0OwotICAgICAgICZsdDtmaWxlIGZpbGU9Im1lc3NhZ2UudHh0Ii8mZ3Q7Ci0gICAgJmx0Oy9sb2FkcmVzb3VyY2UmZ3Q7Ci08L3ByZT4KLTwvcD4KKzxwPkxvYWQgZmlsZSA8c2FtcD5tZXNzYWdlLnR4dDwvc2FtcD4gaW50byBwcm9wZXJ0eSA8Y29kZT5tZXNzYWdlPC9jb2RlPjsKK2FuIDxjb2RlPiZsdDtlY2hvJmd0OzwvY29kZT4gY2FuIHByaW50IHRoaXMuPC9wPgorPHByZT4KKyZsdDtsb2FkZmlsZSBwcm9wZXJ0eT0ibWVzc2FnZSIKKyAgICAgICAgICBzcmNGaWxlPSJtZXNzYWdlLnR4dCIvJmd0OzwvcHJlPgogCi08cHJlPiAgICAmbHQ7bG9hZGZpbGUgcHJvcGVydHk9ImVuY29kZWQtZmlsZSIKLSAgICAgIHNyY0ZpbGU9ImxvYWRmaWxlLnhtbCIKLSAgICAgIGVuY29kaW5nPSJJU08tODg1OS0xIi8mZ3Q7Ci08L3ByZT4KLUxvYWQgYSBmaWxlIHVzaW5nIHRoZSBsYXRpbi0xIGVuY29kaW5nCis8cD5UaGUgYWJvdmUgaXMgaWRlbnRpY2FsIHRvPC9wPgorPHByZT4KKyZsdDtsb2FkcmVzb3VyY2UgcHJvcGVydHk9Im1lc3NhZ2UiJmd0OworICAgICZsdDtmaWxlIGZpbGU9Im1lc3NhZ2UudHh0Ii8mZ3Q7CismbHQ7L2xvYWRyZXNvdXJjZSZndDs8L3ByZT4KIAotPHByZT4gICAgJmx0O2xvYWRmaWxlCi0gICAgICBwcm9wZXJ0eT0ib3B0aW9uYWwudmFsdWUiCi0gICAgICBzcmNGaWxlPSJvcHRpb25hbC50eHQiCi0gICAgICBmYWlsb25lcnJvcj0iZmFsc2UiLyZndDsKLTwvcHJlPgotTG9hZCBhIGZpbGUsIGRvbid0IGZhaWwgaWYgaXQgaXMgbWlzc2luZyAoYSBtZXNzYWdlIGlzIHByaW50ZWQsIHRob3VnaCkKKzxwPkxvYWQgYSBmaWxlIHVzaW5nIHRoZSBMYXRpbi0xIGVuY29kaW5nPC9wPgorPHByZT4KKyZsdDtsb2FkZmlsZSBwcm9wZXJ0eT0iZW5jb2RlZC1maWxlIgorICAgICAgICAgIHNyY0ZpbGU9ImxvYWRmaWxlLnhtbCIKKyAgICAgICAgICBlbmNvZGluZz0iSVNPLTg4NTktMSIvJmd0OzwvcHJlPgogCi08cHJlPiAgICAmbHQ7bG9hZGZpbGUKLSAgICAgIHByb3BlcnR5PSJtYWlsLnJlY2lwaWVudHMiCi0gICAgICBzcmNGaWxlPSJyZWNpcGllbnRsaXN0LnR4dCImZ3Q7Ci0gICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7Cis8cD5Mb2FkIGEgZmlsZSwgZG9uJ3QgZmFpbCBpZiBpdCBpcyBtaXNzaW5nIChhIG1lc3NhZ2UgaXMgcHJpbnRlZCwgdGhvdWdoKTwvcD4KKzxwcmU+CismbHQ7bG9hZGZpbGUgcHJvcGVydHk9Im9wdGlvbmFsLnZhbHVlIgorICAgICAgICAgIHNyY0ZpbGU9Im9wdGlvbmFsLnR4dCIKKyAgICAgICAgICBmYWlsb25lcnJvcj0iZmFsc2UiLyZndDs8L3ByZT4KKworPHA+TG9hZCBhIHByb3BlcnR5IHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEgcGFyYW1ldGVyIGZvciBhbm90aGVyIHRhc2sgKGluIHRoaXMKK2Nhc2UgPGNvZGU+bWFpbDwvY29kZT4pLCBtZXJnaW5nIGxpbmVzIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuPC9wPgorPHByZT4KKyZsdDtsb2FkZmlsZSBwcm9wZXJ0eT0ibWFpbC5yZWNpcGllbnRzIgorICAgICAgICAgIHNyY0ZpbGU9InJlY2lwaWVudGxpc3QudHh0IiZndDsKKyAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgICAgICZsdDs8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJjaGFpbi5odG1sI3N0cmlwbGluZWJyZWFrcyI+c3RyaXBsaW5lYnJlYWtzPC9hPi8mZ3Q7Ci0gICAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotICAgICZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT4KLUxvYWQgYSBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciBmb3IgYW5vdGhlciB0YXNrIChpbiB0aGlzIGNhc2UgbWFpbCksCi1tZXJnaW5nIGxpbmVzIHRvIGVuc3VyZSB0aGlzIGhhcHBlbnMuCisgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLTxwcmU+ICAgICZsdDtsb2FkZmlsZQotICAgICAgcHJvcGVydHk9InN5c3RlbS5jb25maWd1cmF0aW9uLnhtbCIKLSAgICAgIHNyY0ZpbGU9ImNvbmZpZ3VyYXRpb24ueG1sIiZndDsKLSAgICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OwotICAgICAgICAgICZsdDs8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJjaGFpbi5odG1sI2V4cGFuZHByb3BlcnRpZXMiPmV4cGFuZHByb3BlcnRpZXM8L2E+LyZndDsKLSAgICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSAgICAmbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+Ci1Mb2FkIGFuIFhNTCBmaWxlIGludG8gYSBwcm9wZXJ0eSwgZXhwYW5kaW5nIGFsbCBwcm9wZXJ0aWVzIGRlY2xhcmVkCi1pbiB0aGUgZmlsZSBpbiB0aGUgcHJvY2Vzcy4KLQotCi0KKzxwPkxvYWQgYW4gWE1MIGZpbGUgaW50byBhIHByb3BlcnR5LCBleHBhbmRpbmcgYWxsIHByb3BlcnRpZXMgZGVjbGFyZWQgaW4gdGhlIGZpbGUgaW4gdGhlCitwcm9jZXNzLjwvcD4KKzxwcmU+CismbHQ7bG9hZGZpbGUgcHJvcGVydHk9InN5c3RlbS5jb25maWd1cmF0aW9uLnhtbCIKKyAgICAgICAgICBzcmNGaWxlPSJjb25maWd1cmF0aW9uLnhtbCImZ3Q7CisgICAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICAgICAmbHQ7PGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCNleHBhbmRwcm9wZXJ0aWVzIj5leHBhbmRwcm9wZXJ0aWVzPC9hPi8mZ3Q7CisgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL2xvYWRwcm9wZXJ0aWVzLmh0bWwgYi9tYW51YWwvVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbAppbmRleCA2OWZhMjNhLi43ZDllY2NjIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbAorKysgYi9tYW51YWwvVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Mb2FkUHJvcGVydGllcyBUYXNrPC90aXRsZT4KQEAgLTIzLDY4ICsyNCw2MCBAQAogPGJvZHk+CiAKIAotPGgyPjxhIG5hbWU9ImxvYWRwcm9wZXJ0aWVzIj5Mb2FkUHJvcGVydGllczwvYT48L2gyPgorPGgyIGlkPSJsb2FkcHJvcGVydGllcyI+TG9hZFByb3BlcnRpZXM8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPgotTG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBcGFjaGUgQW50IHByb3BlcnRpZXMuICBUaGlzIGlzIGVxdWl2YWxlbnQKLXRvIDxjb2RlPiZsdDtwcm9wZXJ0eSBmaWxlfHJlc291cmNlPSZxdW90Oy4uLiZxdW90Oy8mZ3Q7PC9jb2RlPiBleGNlcHQgdGhhdCBpdAotc3VwcG9ydHMgbmVzdGVkIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzLgotQWxzbyBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nLCB0aGUgYnVpbGQgaXMgaGFsdGVkIHdpdGggYW4gZXJyb3IsIHJhdGhlcgotdGhhbiBhIHdhcm5pbmcgYmVpbmcgcHJpbnRlZC4KLTwvcD4KKzxwPkxvYWQgYSBmaWxlJ3MgY29udGVudHMgYXMgQXBhY2hlIEFudCBwcm9wZXJ0aWVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIDxjb2RlPiZsdDtwcm9wZXJ0eQorZmlsZXxyZXNvdXJjZT08cT4uLi48L3E+LyZndDs8L2NvZGU+IGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPgorZWxlbWVudHMuICBBbHNvIGlmIHRoZSBmaWxlIGlzIG1pc3NpbmcsIHRoZSBidWlsZCBpcyBoYWx0ZWQgd2l0aCBhbiBlcnJvciwgcmF0aGVyIHRoYW4gYSB3YXJuaW5nCitiZWluZyBwcmludGVkLjwvcD4KIAotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi10YXNrJ3MgPGNvZGU+cHJlZml4VmFsdWVzPC9jb2RlPiBhdHRyaWJ1dGUgaXMgZGlmZmVyZW50IGZyb20gdGhlCi1kZWZhdWx0IHZhbHVlIG9mIHRoZSBzYW1lIGF0dHJpYnV0ZSBpbgotdGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPjxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+PC9hPgotdGFzay48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgdGFzaydzIDx2YXI+cHJlZml4VmFsdWVzPC92YXI+IGF0dHJpYnV0ZSBpcworZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNhbWUgYXR0cmlidXRlIGluCit0aGUgPGEgaHJlZj0icHJvcGVydHkuaHRtbCI+PGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT48L2E+IHRhc2suPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY0ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c291cmNlIGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+T25lIG9mIHRoZXNlIG9yIGEKLSAgICAgICAgICBuZXN0ZWQgcmVzb3VyY2U8L3RkPgorICAgIDx0ZD5zcmNGaWxlPC90ZD4KKyAgICA8dGQ+c291cmNlIGZpbGU8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5PbmUgb2YgdGhlc2Ugb3IgYSBuZXN0ZWQgcmVzb3VyY2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgcHJvcGVydHkgZmlsZTwvdGQ+CisgICAgPHRkPnJlc291cmNlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPnRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgZmlsZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAotICAgICAgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+Ci0gICAgICB0byBhIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZGVmaW5lZCBlbHNld2hlcmUuLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLCBnaXZlbgorICAgICAgYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkCisgICAgICBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UHJlZml4IHRvIGFwcGx5IHRvIGxvYWRlZCBwcm9wZXJ0aWVzOwotICAgICAgYSAiLiIgaXMgYXBwZW5kZWQgdG8gdGhlIHByZWZpeCBpZiBub3Qgc3BlY2lmaWVkLiA8ZW0+U2luY2UgQW50IDEuOC4xPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5QcmVmaXggdG8gYXBwbHkgdG8gbG9hZGVkIHByb3BlcnRpZXMuIDxlbT5TaW5jZSBBbnQgMS44LjE8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPi48L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4VmFsdWVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gYXBwbHkgdGhlIHByZWZpeCB3aGVuIGV4cGFuZGluZyB0aGUKLSAgICAgIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgcHJvcGVydGllcy4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObyAoZGVmYXVsdD08dHQ+dHJ1ZTwvdHQ+KTwvdGQ+CisgICAgPHRkPnByZWZpeFZhbHVlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gYXBwbHkgdGhlIHByZWZpeCB3aGVuIGV4cGFuZGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBwcm9wZXJ0aWVzLiAgPGVtPlNpbmNlCisgICAgICBBbnQgMS44LjI8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKQEAgLTkzLDQ4ICs4Niw0NSBAQAogPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50CiByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAotPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKworPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgPHZhcj5zcmNGaWxlPC92YXI+IG9yIDx2YXI+cmVzb3VyY2U8L3Zhcj4uPC9wPgogCiA8aDQ+PGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+RmlsdGVyQ2hhaW48L2E+PC9oND4KIAogPGg0PmNsYXNzcGF0aDwvaDQ+CiAKLTxwPmZvciB1c2Ugd2l0aCB0aGUgPGk+cmVzb3VyY2U8L2k+IGF0dHJpYnV0ZS48L3A+Cis8cD5mb3IgdXNlIHdpdGggdGhlIDx2YXI+cmVzb3VyY2U8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAgICZsdDtsb2FkcHJvcGVydGllcyBzcmNGaWxlPSJmaWxlLnByb3BlcnRpZXMiLyZndDsKLTwvcHJlPgotb3IKLTxwcmU+Ci0gICAgJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OwotICAgICAgJmx0O2ZpbGUgZmlsZT0iZmlsZS5wcm9wZXJ0aWVzIi8mZ3Q7Ci0gICAgJmx0Oy9sb2FkcHJvcGVydGllcyZndDsKLTwvcHJlPgotTG9hZCBjb250ZW50cyBvZiBmaWxlLnByb3BlcnRpZXMgYXMgQW50IHByb3BlcnRpZXMuCiAKLTxwcmU+ICAgICZsdDtsb2FkcHJvcGVydGllcyBzcmNGaWxlPSJmaWxlLnByb3BlcnRpZXMiJmd0OwotICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OworPHA+TG9hZCBjb250ZW50cyBvZiA8c2FtcD5maWxlLnByb3BlcnRpZXM8L3NhbXA+IGFzIEFudCBwcm9wZXJ0aWVzLjwvcD4KKzxwcmU+Jmx0O2xvYWRwcm9wZXJ0aWVzIHNyY0ZpbGU9ImZpbGUucHJvcGVydGllcyIvJmd0OzwvcHJlPgorPHA+b3I8L3A+Cis8cHJlPgorJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OworICAgICZsdDtmaWxlIGZpbGU9ImZpbGUucHJvcGVydGllcyIvJmd0OworJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KKworPHA+UmVhZCB0aGUgbGluZXMgdGhhdCBjb250YWluIHRoZSBzdHJpbmcgPHE+aW1wb3J0LjwvcT4gZnJvbSB0aGUgZmlsZSA8c2FtcD5maWxlLnByb3BlcnRpZXM8L3NhbXA+CithbmQgbG9hZCB0aGVtIGFzIEFudCBwcm9wZXJ0aWVzLjwvcD4KKzxwcmU+CismbHQ7bG9hZHByb3BlcnRpZXMgc3JjRmlsZT0iZmlsZS5wcm9wZXJ0aWVzIiZndDsKKyAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgICAgICZsdDs8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJjaGFpbi5odG1sI2xpbmVjb250YWlucyI+bGluZWNvbnRhaW5zPC9hPiZndDsKLSAgICAgICAgICAmbHQ7Y29udGFpbnMgdmFsdWU9JnF1b3Q7aW1wb3J0LiZxdW90Oy8mZ3Q7CisgICAgICAgICAgICAmbHQ7Y29udGFpbnMgdmFsdWU9JnF1b3Q7aW1wb3J0LiZxdW90Oy8mZ3Q7CiAgICAgICAgICZsdDsvbGluZWNvbnRhaW5zJmd0OwotICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSAgICAmbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+Ci1SZWFkIHRoZSBsaW5lcyB0aGF0IGNvbnRhaW4gdGhlIHN0cmluZyAmcXVvdDtpbXBvcnQuJnF1b3Q7Ci1mcm9tIHRoZSBmaWxlICZxdW90O2ZpbGUucHJvcGVydGllcyZxdW90OyBhbmQgbG9hZCB0aGVtIGFzCi1BbnQgcHJvcGVydGllcy4KKyAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KIAorPHA+TG9hZCBjb250ZW50cyBvZiA8c2FtcD5odHRwczovL2V4YW1wbGUub3JnL3VybC5wcm9wZXJ0aWVzLmd6PC9zYW1wPiwgdW5jb21wcmVzcyBpdCBvbiB0aGUgZmx5IGFuZAorbG9hZCB0aGUgY29udGVudHMgYXMgQW50IHByb3BlcnRpZXMuPC9wPgogPHByZT4KLSAgICAmbHQ7bG9hZHByb3BlcnRpZXMmZ3Q7Ci0gICAgICAmbHQ7PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjZ3ppcHJlc291cmNlIj5nemlwcmVzb3VyY2U8L2E+Jmd0OwotICAgICAgICAmbHQ7PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjdXJsIj51cmw8L2E+IHVybD0iaHR0cDovL2V4YW1wbGUub3JnL3VybC5wcm9wZXJ0aWVzLmd6Ii8mZ3Q7Ci0gICAgICAmbHQ7L2d6aXByZXNvdXJjZSZndDsKLSAgICAmbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+Ci1Mb2FkIGNvbnRlbnRzIG9mIGh0dHA6Ly9leGFtcGxlLm9yZy91cmwucHJvcGVydGllcy5neiwgdW5jb21wcmVzcyBpdAotb24gdGhlIGZseSBhbmQgbG9hZCB0aGUgY29udGVudHMgYXMgQW50IHByb3BlcnRpZXMuCi0KLQorJmx0O2xvYWRwcm9wZXJ0aWVzJmd0OworICAgICZsdDs8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNnemlwcmVzb3VyY2UiPmd6aXByZXNvdXJjZTwvYT4mZ3Q7CisgICAgICAgICZsdDs8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCN1cmwiPnVybDwvYT4gdXJsPSJodHRwczovL2V4YW1wbGUub3JnL3VybC5wcm9wZXJ0aWVzLmd6Ii8mZ3Q7CisgICAgJmx0Oy9nemlwcmVzb3VyY2UmZ3Q7CismbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbG9hZHJlc291cmNlLmh0bWwgYi9tYW51YWwvVGFza3MvbG9hZHJlc291cmNlLmh0bWwKaW5kZXggZjJiMjBjMC4uMjhiNmE0NSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2xvYWRyZXNvdXJjZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9sb2FkcmVzb3VyY2UuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Mb2FkUmVzb3VyY2UgVGFzazwvdGl0bGU+CkBAIC0yMyw3MSArMjQsNjIgQEAKIDxib2R5PgogCiAKLTxoMj48YSBuYW1lPSJsb2FkcmVzb3VyY2UiPkxvYWRSZXNvdXJjZTwvYT48L2gyPgorPGgyIGlkPSJsb2FkcmVzb3VyY2UiPkxvYWRSZXNvdXJjZTwvaDI+CiAKIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC9wPgogCiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Ci1Mb2FkIGEgdGV4dCByZXNvdXJjZSBpbnRvIGEgc2luZ2xlIHByb3BlcnR5LiBVbmxlc3MgYW4gZW5jb2RpbmcgaXMKLXNwZWNpZmllZCwgdGhlIGVuY29kaW5nIG9mIHRoZSBjdXJyZW50IGxvY2FsZSBpcyB1c2VkLiAgUmVzb3VyY2VzIHRvCi1sb2FkIGFyZSBzcGVjaWZpZWQgYXMgbmVzdGVkIDxhCi1ocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IGVsZW1lbnRzIG9yIHNpbmdsZQotZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucy4gSWYgdGhlIHJlc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKG1heWJlIGFmdGVyCi1wcm9jZXNzaW5nIGEgZmlsdGVyY2hhaW4pIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0LgotPC9wPgorPHA+TG9hZCBhIHRleHQgcmVzb3VyY2UgaW50byBhIHNpbmdsZSBwcm9wZXJ0eS4gVW5sZXNzIGFuIGVuY29kaW5nIGlzIHNwZWNpZmllZCwgdGhlIGVuY29kaW5nIG9mIHRoZQorY3VycmVudCBsb2NhbGUgaXMgdXNlZC4gIFJlc291cmNlcyB0byBsb2FkIGFyZSBzcGVjaWZpZWQgYXMKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IGVsZW1lbnRzIG9yIHNpbmdsZSBlbGVtZW50IHJlc291cmNlCitjb2xsZWN0aW9ucy4gSWYgdGhlIHJlc291cmNlIGNvbnRlbnQgaXMgZW1wdHkgKG1heWJlIGFmdGVyIHByb2Nlc3NpbmcgYSA8Y29kZT5maWx0ZXJjaGFpbjwvY29kZT4pCit0aGUgcHJvcGVydHkgaXMgbm90IHNldC48L3A+CiAKLTxwPlNpbmNlIHByb3BlcnRpZXMgYXJlIGltbXV0YWJsZSwgdGhlIHRhc2sgd2lsbCBub3QgY2hhbmdlIHRoZSB2YWx1ZQotICBvZiBhbiBleGlzdGluZyBwcm9wZXJ0eS48L3A+Cis8cD5TaW5jZSBwcm9wZXJ0aWVzIGFyZSBpbW11dGFibGUsIHRoZSB0YXNrIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYW4gZXhpc3RpbmcgcHJvcGVydHkuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5IHRvIHNhdmUgdG88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5wcm9wZXJ0eSB0byBzYXZlIHRvPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2RpbmcgdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgcmVzb3VyY2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPmVuY29kaW5nIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIHJlc291cmNlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uIGZhaWx1cmU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgInRydWUiPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uIGZhaWx1cmU8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRvIG5vdCBkaXNwbGF5IGEgZGlhZ25vc3RpYyBtZXNzYWdlICh1bmxlc3MgQW50IGhhcyBiZWVuIAotICAgIGludm9rZWQgd2l0aCB0aGUgPGNvZGU+LXZlcmJvc2U8L2NvZGU+IG9yIDxjb2RlPi1kZWJ1ZzwvY29kZT4KLSAgICBzd2l0Y2hlcykgb3IgbW9kaWZ5IHRoZSBleGl0IHN0YXR1cyB0byByZWZsZWN0IGFuIGVycm9yLiBTZXR0aW5nIHRoaXMgdG8gCi0gICAgInRydWUiIGltcGxpZXMgc2V0dGluZyBmYWlsb25lcnJvciB0byAiZmFsc2UiLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAiZmFsc2UiPC90ZD4KKyAgICA8dGQ+cXVpZXQ8L3RkPgorICAgIDx0ZD5EbyBub3QgZGlzcGxheSBhIGRpYWdub3N0aWMgbWVzc2FnZSAodW5sZXNzIEFudCBoYXMgYmVlbiBpbnZva2VkIHdpdGgKKyAgICAgIHRoZSA8a2JkPi12ZXJib3NlPC9rYmQ+IG9yIDxrYmQ+LWRlYnVnPC9rYmQ+IHN3aXRjaGVzKSBvciBtb2RpZnkgdGhlIGV4aXQgc3RhdHVzIHRvCisgICAgICByZWZsZWN0IGFuIGVycm9yLiBTZXR0aW5nIHRoaXMgdG8gPHE+dHJ1ZTwvcT4gaW1wbGllcyBzZXR0aW5nIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4KKyAgICAgIHRvIDxxPmZhbHNlPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxwPgotVGhlIExvYWRSZXNvdXJjZSB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9maWx0ZXJjaGFpbi5odG1sIj4KLUZpbHRlckNoYWluPC9hPnMuCis8cD5UaGUgTG9hZFJlc291cmNlIHRhc2sgc3VwcG9ydHMgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPnMuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5Mb2FkIHRoZSBlbnRyeSBwb2ludCBvZiBBbnQncyBob21lcGFnZSBpbnRvIHByb3BlcnR5IDxjb2RlPmhvbWVwYWdlPC9jb2RlPjsKK2FuIDxjb2RlPiZsdDtlY2hvJmd0OzwvY29kZT4gY2FuIHByaW50IHRoaXMuPC9wPgogPHByZT4KICZsdDtsb2FkcmVzb3VyY2UgcHJvcGVydHk9ImhvbWVwYWdlIiZndDsKLSAgJmx0O3VybCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8mZ3Q7Ci0mbHQ7L2xvYWRyZXNvdXJjZSZndDsKLTwvcHJlPgotTG9hZCB0aGUgZW50cnkgcG9pbnQgb2YgQW50J3MgaG9tZXBhZ2UgaW50byBwcm9wZXJ0eSAiaG9tZXBhZ2UiOyBhbgotPHR0PiZsdDtlY2hvJmd0OzwvdHQ+IGNhbiBwcmludCB0aGlzLgorICAgICZsdDt1cmwgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLyZndDsKKyZsdDsvbG9hZHJlc291cmNlJmd0OzwvcHJlPgogCiA8cD5Gb3IgbW9yZSBleGFtcGxlcyBzZWUgdGhlIDxhIGhyZWY9ImxvYWRmaWxlLmh0bWwiPmxvYWRmaWxlPC9hPiB0YXNrLjwvcD4KIAotCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9sb2NhbC5odG1sIGIvbWFudWFsL1Rhc2tzL2xvY2FsLmh0bWwKaW5kZXggYzdlZDhmYy4uODMwY2MxOCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL2xvY2FsLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL2xvY2FsLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TG9jYWwgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yNSwzMSArMjUsMzEgQEAKIDxib2R5PgogCiA8aDI+TG9jYWw8L2gyPgorPHA+PGVtPlNpbmNlIEFudCAxLjg8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5BZGRzIGEgbG9jYWwgcHJvcGVydHkgdG8gdGhlIGN1cnJlbnQgc2NvcGUuIFByb3BlcnR5IHNjb3BlcyBleGlzdCBhdCBBcGFjaGUgQW50J3MKLXZhcmlvdXMgImJsb2NrIiBsZXZlbHMuIFRoZXNlIGluY2x1ZGUgdGFyZ2V0cyBhcyB3ZWxsIGFzIHRoZQotPGEgaHJlZj0icGFyYWxsZWwuaHRtbCI+UGFyYWxsZWw8L2E+IGFuZCA8YSBocmVmPSJzZXF1ZW50aWFsLmh0bWwiPlNlcXVlbnRpYWw8L2E+Ci10YXNrIGNvbnRhaW5lcnMgKGluY2x1ZGluZyA8YSBocmVmPSJtYWNyb2RlZi5odG1sIj5NYWNyb2RlZjwvYT4gYm9kaWVzKS4gQSBsb2NhbAotcHJvcGVydHkgYXQgYSBnaXZlbiBzY29wZSAic2hhZG93cyIgcHJvcGVydGllcyBvZiB0aGUgc2FtZSBuYW1lIGF0IGhpZ2hlciBzY29wZXMsCi1pbmNsdWRpbmcgdGhlIGdsb2JhbCBzY29wZS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBMb2NhbCB0YXNrIGF0IHRoZSBnbG9iYWwKLWxldmVsIGVmZmVjdGl2ZWx5IG1ha2VzIHRoZSBwcm9wZXJ0eSBsb2NhbCB0byB0aGUgImFub255bW91cyB0YXJnZXQiIGluIHdoaWNoCi10b3AtbGV2ZWwgb3BlcmF0aW9ucyBhcmUgY2FycmllZCBvdXQ7IGl0IHdpbGwgbm90IGJlIGRlZmluZWQgZm9yIG90aGVyIHRhcmdldHMKLWluIHRoZSBidWlsZGZpbGUuIDxiPlNpbmNlIEFudCAxLjg8L2I+PC9wPgorPHA+QWRkcyBhIGxvY2FsIHByb3BlcnR5IHRvIHRoZSBjdXJyZW50IHNjb3BlLiBQcm9wZXJ0eSBzY29wZXMgZXhpc3QgYXQgQXBhY2hlIEFudCdzIHZhcmlvdXMgImJsb2NrIgorbGV2ZWxzLiBUaGVzZSBpbmNsdWRlIHRhcmdldHMgYXMgd2VsbCBhcyB0aGUgPGEgaHJlZj0icGFyYWxsZWwuaHRtbCI+UGFyYWxsZWw8L2E+CithbmQgPGEgaHJlZj0ic2VxdWVudGlhbC5odG1sIj5TZXF1ZW50aWFsPC9hPiB0YXNrIGNvbnRhaW5lcnMKKyhpbmNsdWRpbmcgPGEgaHJlZj0ibWFjcm9kZWYuaHRtbCI+TWFjcm9kZWY8L2E+IGJvZGllcykuIEEgbG9jYWwgcHJvcGVydHkgYXQgYSBnaXZlbiBzY29wZSAic2hhZG93cyIKK3Byb3BlcnRpZXMgb2YgdGhlIHNhbWUgbmFtZSBhdCBoaWdoZXIgc2NvcGVzLCBpbmNsdWRpbmcgdGhlIGdsb2JhbCBzY29wZS4gTm90ZSB0aGF0IHVzaW5nCit0aGUgPGNvZGU+TG9jYWw8L2NvZGU+IHRhc2sgYXQgdGhlIGdsb2JhbCBsZXZlbCBlZmZlY3RpdmVseSBtYWtlcyB0aGUgcHJvcGVydHkgbG9jYWwgdG8gdGhlCisiYW5vbnltb3VzIHRhcmdldCIgaW4gd2hpY2ggdG9wLWxldmVsIG9wZXJhdGlvbnMgYXJlIGNhcnJpZWQgb3V0OyBpdCB3aWxsIG5vdCBiZSBkZWZpbmVkIGZvciBvdGhlcgordGFyZ2V0cyBpbiB0aGUgYnVpbGRmaWxlLjwvcD4KIAotPHA+QSBwcm9wZXJ0eSBpcyBtYWRlIGxvY2FsIGlmIHRoZSA8Y29kZT4mbHQ7bG9jYWwmZ3Q7PC9jb2RlPiB0YXNrCi0gIHByZWNlZGVzIGl0cyBkZWZpbml0aW9uLiAgU2VlIHRoZSBleGFtcGxlcyBzZWN0aW9uLjwvcD4KKzxwPkEgcHJvcGVydHkgaXMgbWFkZSBsb2NhbCBpZiB0aGUgPGNvZGU+Jmx0O2xvY2FsJmd0OzwvY29kZT4gdGFzayBwcmVjZWRlcyBpdHMgZGVmaW5pdGlvbi4gIFNlZSB0aGUKK2V4YW1wbGVzIHNlY3Rpb24uPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPiAKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwcm9wZXJ0eSB0byBkZWNsYXJlIGluIHRoZSBjdXJyZW50IHNjb3BlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgcHJvcGVydHkgdG8gZGVjbGFyZSBpbiB0aGUgY3VycmVudCBzY29wZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC01OCwxMjkgKzU4LDExOCBAQAogPGg0PlRlbXBvcmFyaWx5IHNoYWRvdyBhIGdsb2JhbCBwcm9wZXJ0eSdzIHZhbHVlPC9oND4KIAogPHByZT4KLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iZm9vIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iZm9vIi8mZ3Q7CiAKLSAgICAmbHQ7dGFyZ2V0IG5hbWU9InN0ZXAxIiZndDsKLSAgICAgICAgJmx0O2VjaG8mZ3Q7QmVmb3JlIGxvY2FsOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OwotICAgICAgICAmbHQ7bG9jYWwgbmFtZT0iZm9vIi8mZ3Q7Ci0gICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJmb28iIHZhbHVlPSJiYXIiLyZndDsKLSAgICAgICAgJmx0O2VjaG8mZ3Q7QWZ0ZXIgbG9jYWw6IGZvbyBpcyAke2Zvb30mbHQ7L2VjaG8mZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9InN0ZXAxIiZndDsKKyAgICAmbHQ7ZWNobyZndDtCZWZvcmUgbG9jYWw6IGZvbyBpcyAke2Zvb30mbHQ7L2VjaG8mZ3Q7CisgICAgJmx0O2xvY2FsIG5hbWU9ImZvbyIvJmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJmb28iIHZhbHVlPSJiYXIiLyZndDsKKyAgICAmbHQ7ZWNobyZndDtBZnRlciBsb2NhbDogZm9vIGlzICR7Zm9vfSZsdDsvZWNobyZndDsKKyZsdDsvdGFyZ2V0Jmd0OwogCi0gICAgJmx0O3RhcmdldCBuYW1lPSJzdGVwMiIgZGVwZW5kcz0ic3RlcDEiJmd0OwotICAgICAgICAmbHQ7ZWNobyZndDtJbiBzdGVwMjogZm9vIGlzICR7Zm9vfSZsdDsvZWNobyZndDsKLSAgICAmbHQ7L3RhcmdldCZndDsKLTwvcHJlPgorJmx0O3RhcmdldCBuYW1lPSJzdGVwMiIgZGVwZW5kcz0ic3RlcDEiJmd0OworICAgICZsdDtlY2hvJmd0O0luIHN0ZXAyOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKIDxwPm91dHB1dHM8L3A+CiAKLTxwcmU+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgogc3RlcDE6CiAgICAgIFtlY2hvXSBCZWZvcmUgbG9jYWw6IGZvbyBpcyBmb28KICAgICAgW2VjaG9dIEFmdGVyIGxvY2FsOiBmb28gaXMgYmFyCiAKIHN0ZXAyOgotICAgICBbZWNob10gSW4gc3RlcDI6IGZvbyBpcyBmb28KLTwvcHJlPgorICAgICBbZWNob10gSW4gc3RlcDI6IGZvbyBpcyBmb288L3ByZT4KIAotPHA+aGVyZSB0aGUgbG9jYWwtdGFzayBzaGFkb3dlZCB0aGUgZ2xvYmFsIGRlZmluaXRpb24KLSAgb2YgPGNvZGU+Zm9vPC9jb2RlPiBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGFyZ2V0IHN0ZXAxLjwvcD4KKzxwPmhlcmUgdGhlIDxjb2RlPmxvY2FsPC9jb2RlPiB0YXNrIHNoYWRvd2VkIHRoZSBnbG9iYWwgZGVmaW5pdGlvbiBvZiA8Y29kZT5mb288L2NvZGU+IGZvciB0aGUKK3JlbWFpbmRlciBvZiB0aGUgdGFyZ2V0IDxxPnN0ZXAxPC9xPi48L3A+CiAKIDxoND5DcmVhdGluZyB0aHJlYWQgbG9jYWwgcHJvcGVydGllczwvaDQ+CiAKIDxwcmU+Ci0gICAgJmx0O3Byb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImZvbyIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImZvbyIgdmFsdWU9ImZvbyIvJmd0OwogCi0gICAgJmx0O3BhcmFsbGVsJmd0OwotICAgICAgICAmbHQ7ZWNobyZndDtnbG9iYWwgMTogZm9vIGlzICR7Zm9vfSZsdDsvZWNobyZndDsKLSAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bG9jYWwgbmFtZT0iZm9vIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyLjEiLyZndDsKLSAgICAgICAgICAgICZsdDtlY2hvJmd0O0ZpcnN0IHNlcXVlbnRpYWw6IGZvbyBpcyAke2Zvb30mbHQ7L2VjaG8mZ3Q7Ci0gICAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMSIvJmd0OwotICAgICAgICAgICAgJmx0O2VjaG8mZ3Q7Z2xvYmFsIDI6IGZvbyBpcyAke2Zvb30mbHQ7L2VjaG8mZ3Q7Ci0gICAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bG9jYWwgbmFtZT0iZm9vIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyLjIiLyZndDsKLSAgICAgICAgICAgICZsdDtlY2hvJmd0O1NlY29uZCBzZXF1ZW50aWFsOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OwotICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICZsdDtlY2hvJmd0O2dsb2JhbCAzOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OwotICAgICZsdDsvcGFyYWxsZWwmZ3Q7Ci08L3ByZT4KKyZsdDtwYXJhbGxlbCZndDsKKyAgICAmbHQ7ZWNobyZndDtnbG9iYWwgMTogZm9vIGlzICR7Zm9vfSZsdDsvZWNobyZndDsKKyAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgJmx0O2xvY2FsIG5hbWU9ImZvbyIvJmd0OworICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyLjEiLyZndDsKKyAgICAgICAgJmx0O2VjaG8mZ3Q7Rmlyc3Qgc2VxdWVudGlhbDogZm9vIGlzICR7Zm9vfSZsdDsvZWNobyZndDsKKyAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICZsdDtzbGVlcCBzZWNvbmRzPSIxIi8mZ3Q7CisgICAgICAgICZsdDtlY2hvJmd0O2dsb2JhbCAyOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OworICAgICZsdDsvc2VxdWVudGlhbCZndDsKKyAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgJmx0O2xvY2FsIG5hbWU9ImZvbyIvJmd0OworICAgICAgICAmbHQ7cHJvcGVydHkgbmFtZT0iZm9vIiB2YWx1ZT0iYmFyLjIiLyZndDsKKyAgICAgICAgJmx0O2VjaG8mZ3Q7U2Vjb25kIHNlcXVlbnRpYWw6IGZvbyBpcyAke2Zvb30mbHQ7L2VjaG8mZ3Q7CisgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICZsdDtlY2hvJmd0O2dsb2JhbCAzOiBmb28gaXMgJHtmb299Jmx0Oy9lY2hvJmd0OworJmx0Oy9wYXJhbGxlbCZndDs8L3ByZT4KIAogPHA+b3V0cHV0cyBzb21ldGhpbmcgc2ltaWxhciB0bzwvcD4KIAotPHByZT4KLSAgICAgW2VjaG9dIGdsb2JhbCAzOiBmb28gaXMgZm9vCi0gICAgIFtlY2hvXSBnbG9iYWwgMTogZm9vIGlzIGZvbwotICAgICBbZWNob10gRmlyc3Qgc2VxdWVudGlhbDogZm9vIGlzIGJhci4xCi0gICAgIFtlY2hvXSBTZWNvbmQgc2VxdWVudGlhbDogZm9vIGlzIGJhci4yCi0gICAgIFtlY2hvXSBnbG9iYWwgMjogZm9vIGlzIGZvbwotPC9wcmU+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgorICAgIFtlY2hvXSBnbG9iYWwgMzogZm9vIGlzIGZvbworICAgIFtlY2hvXSBnbG9iYWwgMTogZm9vIGlzIGZvbworICAgIFtlY2hvXSBGaXJzdCBzZXF1ZW50aWFsOiBmb28gaXMgYmFyLjEKKyAgICBbZWNob10gU2Vjb25kIHNlcXVlbnRpYWw6IGZvbyBpcyBiYXIuMgorICAgIFtlY2hvXSBnbG9iYWwgMjogZm9vIGlzIGZvbzwvcHJlPgogCi08aDQ+VXNlIGluc2lkZSBtYWNyb2RlZjwvaDQ+Cis8aDQ+VXNlIGluc2lkZSA8Y29kZT5tYWNyb2RlZjwvY29kZT48L2g0PgogCi08cD5UaGlzIHByb2JhYmx5IGlzIHdoZXJlIGxvY2FsIGNhbiBiZSBhcHBsaWVkIGluIHRoZSBtb3N0IHVzZWZ1bAotICB3YXkuICBJZiB5b3UgbmVlZGVkIGEgInRlbXBvcmFyeSBwcm9wZXJ0eSIgaW5zaWRlIGEgbWFjcm9kZWYgaW4gQW50Ci0gIHByaW9yIHRvIEFudCAxLjguMCB5b3UgaGFkIHRvIHRyeSB0byBjb21lIHVwIHdpdGggYSBwcm9wZXJ0eSBuYW1lCi0gIHRoYXQgd291bGQgYmUgdW5pcXVlIGFjcm9zcyBtYWNybyBpbnZvY2F0aW9ucy48L3A+Cis8cD5UaGlzIHByb2JhYmx5IGlzIHdoZXJlIDxjb2RlPmxvY2FsPC9jb2RlPiBjYW4gYmUgYXBwbGllZCBpbiB0aGUgbW9zdCB1c2VmdWwgd2F5LiAgSWYgeW91IG5lZWRlZCBhCisidGVtcG9yYXJ5IHByb3BlcnR5IiBpbnNpZGUgYSA8Y29kZT5tYWNyb2RlZjwvY29kZT4gaW4gQW50IHByaW9yIHRvIEFudCAxLjguMCB5b3UgaGFkIHRvIHRyeSB0byBjb21lCit1cCB3aXRoIGEgcHJvcGVydHkgbmFtZSB0aGF0IHdvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgbWFjcm8gaW52b2NhdGlvbnMuPC9wPgogCi08cD5TYXkgeW91IHdhbnRlZCB0byB3cml0ZSBhIG1hY3JvIHRoYXQgY3JlYXRlZCB0aGUgcGFyZW50IGRpcmVjdG9yeQotICBvZiBhIGdpdmVuIGZpbGUuICBBIG5haXZlIGFwcHJvYWNoIHdvdWxkIGJlOjwvcD4KKzxwPlNheSB5b3Ugd2FudGVkIHRvIHdyaXRlIGEgbWFjcm8gdGhhdCBjcmVhdGVkIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGEgZ2l2ZW4gZmlsZS4gIEEgbmFpdmUKK2FwcHJvYWNoIHdvdWxkIGJlOjwvcD4KIAogPHByZT4KLSAgICAmbHQ7bWFjcm9kZWYgbmFtZT0ibWFrZXBhcmVudGRpciImZ3Q7Ci0gICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iZmlsZSIvJmd0OwotICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKLSAgICAgICAgICAgICZsdDtkaXJuYW1lIHByb3BlcnR5PSJwYXJlbnQiIGZpbGU9IkB7ZmlsZX0iLyZndDsKLSAgICAgICAgICAgICZsdDtta2RpciBkaXI9IiR7cGFyZW50fSIvJmd0OwotICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICAgJmx0Oy9tYWNyb2RlZiZndDsKLSAgICAmbHQ7bWFrZXBhcmVudGRpciBmaWxlPSJzb21lLWRpci9zb21lLWZpbGUiLyZndDsKLTwvcHJlPgorJmx0O21hY3JvZGVmIG5hbWU9Im1ha2VwYXJlbnRkaXIiJmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iZmlsZSIvJmd0OworICAgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICAgICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0icGFyZW50IiBmaWxlPSJAe2ZpbGV9Ii8mZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7cGFyZW50fSIvJmd0OworICAgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7CismbHQ7bWFrZXBhcmVudGRpciBmaWxlPSJzb21lLWRpci9zb21lLWZpbGUiLyZndDs8L3ByZT4KIAotPHA+YnV0IHRoaXMgd291bGQgY3JlYXRlIGEgZ2xvYmFsIHByb3BlcnR5ICJwYXJlbnQiIG9uIHRoZSBmaXJzdAotICBpbnZvY2F0aW9uIC0gYW5kIHNpbmNlIHByb3BlcnRpZXMgYXJlIG5vdCBtdXRhYmxlLCBhbnkgc3Vic2VxdWVudAotICBpbnZvY2F0aW9uIHdpbGwgc2VlIHRoZSBzYW1lIHZhbHVlIGFuZCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCi0gIGRpcmVjdG9yeSBhcyB0aGUgZmlyc3QgaW52b2NhdGlvbi48L3A+Cis8cD5idXQgdGhpcyB3b3VsZCBjcmVhdGUgYSBnbG9iYWwgcHJvcGVydHkgPGNvZGU+cGFyZW50PC9jb2RlPiBvbiB0aGUgZmlyc3QgaW52b2NhdGlvbiZtZGFzaDthbmQKK3NpbmNlIHByb3BlcnRpZXMgYXJlIG5vdCBtdXRhYmxlLCBhbnkgc3Vic2VxdWVudCBpbnZvY2F0aW9uIHdpbGwgc2VlIHRoZSBzYW1lIHZhbHVlIGFuZCB0cnkgdG8KK2NyZWF0ZSB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpcnN0IGludm9jYXRpb24uPC9wPgogCi08cD5UaGUgcmVjb21tZW5kYXRpb24gcHJpb3IgdG8gQW50IDEuOC4wIHdhcyB0byB1c2UgYSBwcm9wZXJ0eSBuYW1lCi0gIGJhc2VkIG9uIG9uZSBvZiB0aGUgbWFjcm8ncyBhdHRyaWJ1dGVzLCBsaWtlPC9wPgorPHA+VGhlIHJlY29tbWVuZGF0aW9uIHByaW9yIHRvIEFudCAxLjguMCB3YXMgdG8gdXNlIGEgcHJvcGVydHkgbmFtZSBiYXNlZCBvbiBvbmUgb2YgdGhlIG1hY3JvJ3MKK2F0dHJpYnV0ZXMsIGxpa2U8L3A+CiAKIDxwcmU+Ci0gICAgJmx0O21hY3JvZGVmIG5hbWU9Im1ha2VwYXJlbnRkaXIiJmd0OwotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImZpbGUiLyZndDsKLSAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0icGFyZW50LkB7ZmlsZX0iIGZpbGU9IkB7ZmlsZX0iLyZndDsKLSAgICAgICAgICAgICZsdDtta2RpciBkaXI9IiR7cGFyZW50LkB7ZmlsZX19Ii8mZ3Q7Ci0gICAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgICAmbHQ7L21hY3JvZGVmJmd0OwotPC9wcmU+CismbHQ7bWFjcm9kZWYgbmFtZT0ibWFrZXBhcmVudGRpciImZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJmaWxlIi8mZ3Q7CisgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICZsdDtkaXJuYW1lIHByb3BlcnR5PSJwYXJlbnQuQHtmaWxlfSIgZmlsZT0iQHtmaWxlfSIvJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke3BhcmVudC5Ae2ZpbGV9fSIvJmd0OworICAgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7PC9wcmU+CiAKLTxwPk5vdyBpbnZvY2F0aW9ucyBmb3IgZGlmZmVyZW50IGZpbGVzIHdpbGwgc2V0IGRpZmZlcmVudCBwcm9wZXJ0aWVzCi0gIGFuZCB0aGUgZGlyZWN0b3JpZXMgd2lsbCBnZXQgY3JlYXRlZC4gIFVuZm9ydHVuYXRlbHkgdGhpcyAicG9sbHV0ZXMiCi0gIHRoZSBnbG9iYWwgcHJvcGVydGllcyBzcGFjZS4gIEluIGFkZGl0aW9uIGl0IG1heSBiZSBoYXJkIHRvIGNvbWUgdXAKLSAgd2l0aCB1bmlxdWUgbmFtZXMgaW4gc29tZSBjYXNlcy48L3A+Cis8cD5Ob3cgaW52b2NhdGlvbnMgZm9yIGRpZmZlcmVudCBmaWxlcyB3aWxsIHNldCBkaWZmZXJlbnQgcHJvcGVydGllcyBhbmQgdGhlIGRpcmVjdG9yaWVzIHdpbGwgZ2V0CitjcmVhdGVkLiAgVW5mb3J0dW5hdGVseSB0aGlzICJwb2xsdXRlcyIgdGhlIGdsb2JhbCBwcm9wZXJ0aWVzIHNwYWNlLiAgSW4gYWRkaXRpb24sIGl0IG1heSBiZSBoYXJkIHRvCitjb21lIHVwIHdpdGggdW5pcXVlIG5hbWVzIGluIHNvbWUgY2FzZXMuPC9wPgogCiA8cD5FbnRlciA8Y29kZT4mbHQ7bG9jYWwmZ3Q7PC9jb2RlPjo8L3A+CiAKIDxwcmU+Ci0gICAgJmx0O21hY3JvZGVmIG5hbWU9Im1ha2VwYXJlbnRkaXIiJmd0OwotICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImZpbGUiLyZndDsKLSAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bG9jYWwgbmFtZT0icGFyZW50Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0icGFyZW50IiBmaWxlPSJAe2ZpbGV9Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke3BhcmVudH0iLyZndDsKLSAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotICAgICZsdDsvbWFjcm9kZWYmZ3Q7Ci08L3ByZT4KKyZsdDttYWNyb2RlZiBuYW1lPSJtYWtlcGFyZW50ZGlyIiZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImZpbGUiLyZndDsKKyAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgJmx0O2xvY2FsIG5hbWU9InBhcmVudCIvJmd0OworICAgICAgICAmbHQ7ZGlybmFtZSBwcm9wZXJ0eT0icGFyZW50IiBmaWxlPSJAe2ZpbGV9Ii8mZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7cGFyZW50fSIvJmd0OworICAgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvbWFjcm9kZWYmZ3Q7PC9wcmU+CiAKLTxwPkVhY2ggaW52b2NhdGlvbiBnZXRzIGl0cyBvd24gcHJvcGVydHkgbmFtZSAicGFyZW50IiBhbmQgdGhlcmUgd2lsbAotICBiZSBubyBnbG9iYWwgcHJvcGVydHkgb2YgdGhhdCBuYW1lIGF0IGFsbC48L3A+Cis8cD5FYWNoIGludm9jYXRpb24gZ2V0cyBpdHMgb3duIHByb3BlcnR5IG5hbWVkIDxjb2RlPnBhcmVudDwvY29kZT4gYW5kIHRoZXJlIHdpbGwgYmUgbm8gZ2xvYmFsCitwcm9wZXJ0eSBvZiB0aGF0IG5hbWUgYXQgYWxsLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbWFjcm9kZWYuaHRtbCBiL21hbnVhbC9UYXNrcy9tYWNyb2RlZi5odG1sCmluZGV4IDYwYjMwNzIuLmEzZjAwNjQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9tYWNyb2RlZi5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9tYWNyb2RlZi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjg0ICsxNSwyMTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PC9tZXRhPgogICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgICAgPHRpdGxlPk1hY3JvRGVmIFRhc2s8L3RpdGxlPgogICA8L2hlYWQ+CiAKICAgPGJvZHk+CiAKLSAgICA8aDI+PGEgbmFtZT0ibWFjcm9kZWYiPk1hY3JvRGVmPC9hPjwvaDI+CisgICAgPGgyIGlkPSJtYWNyb2RlZiI+TWFjcm9EZWY8L2gyPgorICAgIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+PC9wPgogICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgPHA+Ci0gICAgICBUaGlzIGRlZmluZXMgYSBuZXcgdGFzayB1c2luZyBhIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4KLSAgICAgIG5lc3RlZCB0YXNrIGFzIGEgdGVtcGxhdGUuIE5lc3RlZCBlbGVtZW50cyA8Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gYW5kCi0gICAgICA8Y29kZT4mbHQ7ZWxlbWVudCZndDs8L2NvZGU+IGFyZSB1c2VkIHRvIHNwZWNpZnkgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb2YKLSAgICAgIHRoZSBuZXcgdGFzay4gVGhlc2UgZ2V0IHN1YnN0aXR1dGVkIGludG8gdGhlIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4KLSAgICAgIHRhc2sgd2hlbiB0aGUgbmV3IHRhc2sgaXMgcnVuLgotICAgIDwvcD4KKyAgICA8cD5UaGlzIGRlZmluZXMgYSBuZXcgdGFzayB1c2luZyBhIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4gbmVzdGVkIHRhc2sgYXMgYQorICAgICAgdGVtcGxhdGUuIE5lc3RlZCBlbGVtZW50cyA8Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtlbGVtZW50Jmd0OzwvY29kZT4gYXJlCisgICAgICB1c2VkIHRvIHNwZWNpZnkgYXR0cmlidXRlcyBhbmQgZWxlbWVudHMgb2YgdGhlIG5ldyB0YXNrLiBUaGVzZSBnZXQgc3Vic3RpdHV0ZWQgaW50bworICAgICAgdGhlIDxjb2RlPiZsdDtzZXF1ZW50aWFsJmd0OzwvY29kZT4gdGFzayB3aGVuIHRoZSBuZXcgdGFzayBpcyBydW4uPC9wPgogICAgIDxoMz5Ob3RlPC9oMz4KLSAgICA8cD4KLSAgICAgIFlvdSBjYW4gYWxzbyB1c2UgPGk+cHJpb3IgZGVmaW5lZDwvaT4gYXR0cmlidXRlcyBmb3IgZGVmYXVsdC12YWx1ZXMgaW4KLSAgICAgIG90aGVyIGF0dHJpYnV0ZXMuIFNlZSB0aGUgZXhhbXBsZXMuCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgPGVtPnNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT4KLSAgICA8L3A+CisgICAgPHA+WW91IGNhbiBhbHNvIHVzZSA8ZW0+cHJpb3IgZGVmaW5lZDwvZW0+IGF0dHJpYnV0ZXMgZm9yIDx2YXI+ZGVmYXVsdDwvdmFyPiB2YWx1ZXMgaW4gb3RoZXIKKyAgICAgIGF0dHJpYnV0ZXMuIFNlZSB0aGUgZXhhbXBsZXMuPC9wPgogICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIG5ldyBkZWZpbml0aW9uLjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPm5hbWU8L3RkPgorICAgICAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIG5ldyBkZWZpbml0aW9uLjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj51cmk8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgorICAgICAgICA8dGQ+dXJpPC90ZD4KKyAgICAgICAgPHRkPgogICAgICAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uCiAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSBkZXNjcmlwdGlvbiBvZiB0aGUgbWFjcm9kZWYKKyAgICAgICAgPHRkPmRlc2NyaXB0aW9uPC90ZD4KKyAgICAgICAgPHRkPkEgZGVzY3JpcHRpb24gb2YgdGhlIG1hY3JvZGVmCiAgICAgICAgICAgKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIG9ubHkpLgogICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+YmFja3RyYWNlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBUaGlzIGNvbnRyb2xzIHRoZSBlcnJvciB0cmFjZWJhY2sgaWYgdGhlcmUgaXMgYW4KLSAgICAgICAgICBlcnJvciBkZXRlY3RlZCB3aGVuIHJ1bm5pbmcgdGhlIG1hY3JvLiBJZiB0aGlzIGlzCi0gICAgICAgICAgc2V0IHRvIHRydWUsIHRoZXJlIHdpbGwgYmUgYW4gZXJyb3IgdHJhY2tiYWNrLCBpZiBmYWxzZQotICAgICAgICAgIHRoZXJlIHdpbGwgbm90IGJlIG9uZS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPi4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCA8ZW0+dHJ1ZTwvZW0+PC90ZD4KKyAgICAgICAgPHRkPmJhY2t0cmFjZTwvdGQ+CisgICAgICAgIDx0ZD5UaGlzIGNvbnRyb2xzIHRoZSBlcnJvciB0cmFjZWJhY2sgaWYgdGhlcmUgaXMgYW4gZXJyb3IgZGV0ZWN0ZWQgd2hlbiBydW5uaW5nIHRoZQorICAgICAgICAgIG1hY3JvLiBJZiB0aGlzIGlzIHNldCB0byA8cT50cnVlPC9xPiwgdGhlcmUgd2lsbCBiZSBhbiBlcnJvciB0cmFja2JhY2ssIGlmIDxxPmZhbHNlPC9xPgorICAgICAgICAgIHRoZXJlIHdpbGwgYmUgbm9uZS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPi48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgogICAgICAgPC90cj4KICAgICA8L3RhYmxlPgotICAgICAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CisgICAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAgICAgPGg0PmF0dHJpYnV0ZTwvaDQ+Ci0gICAgPHA+Ci0gICAgICBUaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXcgdGFzay4gVGhlIHZhbHVlcwotICAgICAgb2YgdGhlIGF0dHJpYnV0ZXMgZ2V0IHN1YnN0aXR1dGVkIGludG8gdGhlIHRlbXBsYXRlZCB0YXNrLgotICAgICAgVGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSByZXF1aXJlZCBhdHRyaWJ1dGVzIHVubGVzcyBhIGRlZmF1bHQKLSAgICAgIHZhbHVlIGhhcyBiZWVuIHNldC4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBUaGlzIGF0dHJpYnV0ZSBpcyBwbGFjZWQgaW4gdGhlIGJvZHkgb2YgdGhlIHRlbXBsYXRlZAotICAgICAgdGFzayB1c2luZyBhIG5vdGF0aW9uIHNpbWlsYXIgdG8gdGhlIGFudCBwcm9wZXJ0eSBub3RhdGlvbgotICAgICAgLSBAe2F0dHJpYnV0ZSBuYW1lfS4gKE1heSBiZSByZW1lbWJlcmVkIGFzICJwdXQgdGhlIHN1YnN0aXR1dGlvbgotICAgICAgQVQgdGhpcyBsb2NhdGlvbiIpLgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIFRoZSBlc2NhcGUgc2VxdWVuY2UgQEAgaXMgdXNlZCB0byBlc2NhcGUgQC4gVGhpcyBhbGxvd3MgQHt4fSB0byBiZQotICAgICAgcGxhY2VkIGluIHRoZSB0ZXh0IHdpdGhvdXQgc3Vic3RpdHV0aW9uIG9mIHggYnkgdXNpbmcgQEB7eH0uCi0gICAgICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSAkJCBlc2NhcGUgc2VxdWVuY2UgZm9yIHByb3BlcnRpZXMuCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgVGhlIGNhc2Ugb2YgdGhlIGF0dHJpYnV0ZSBpcyBpZ25vcmVkLCBzbyBAe215QXR0cmlidXRlfSBpcyB0cmVhdGVkIHRoZQotICAgICAgc2FtZSBhcyBAe015QXR0cmlidXRlfS4KLSAgICA8L3A+Ci0gICAgPGgzPlBhcmFtZXRlcnM8L2gzPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHA+VGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgYXR0cmlidXRlcyBvZiB0aGUgbmV3IHRhc2suIFRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgZ2V0CisgICAgICBzdWJzdGl0dXRlZCBpbnRvIHRoZSB0ZW1wbGF0ZWQgdGFzay4gIFRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgcmVxdWlyZWQgYXR0cmlidXRlcyB1bmxlc3MgYQorICAgICAgZGVmYXVsdCB2YWx1ZSBoYXMgYmVlbiBzZXQuPC9wPgorICAgIDxwPlRoaXMgYXR0cmlidXRlIGlzIHBsYWNlZCBpbiB0aGUgYm9keSBvZiB0aGUgdGVtcGxhdGVkIHRhc2sgdXNpbmcgYSBub3RhdGlvbiBzaW1pbGFyIHRvIHRoZQorICAgICAgQW50IHByb3BlcnR5IG5vdGF0aW9uJm1kYXNoOzxjb2RlPkB7YXR0cmlidXRlIG5hbWV9PC9jb2RlPi4gKE1heSBiZSByZW1lbWJlcmVkIGFzICJwdXQgdGhlCisgICAgICBzdWJzdGl0dXRpb24gQVQgdGhpcyBsb2NhdGlvbiIpLjwvcD4KKyAgICA8cD5UaGUgZXNjYXBlIHNlcXVlbmNlIDxjb2RlPkBAPC9jb2RlPiBpcyB1c2VkIHRvIGVzY2FwZSA8Y29kZT5APC9jb2RlPi4gVGhpcworICAgICAgYWxsb3dzIDxjb2RlPkB7eH08L2NvZGU+IHRvIGJlIHBsYWNlZCBpbiB0aGUgdGV4dCB3aXRob3V0IHN1YnN0aXR1dGlvbiBvZiA8Y29kZT54PC9jb2RlPiBieQorICAgICAgdXNpbmcgPGNvZGU+QEB7eH08L2NvZGU+LiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+JCQ8L2NvZGU+IGVzY2FwZSBzZXF1ZW5jZSBmb3IKKyAgICAgIHByb3BlcnRpZXMuPC9wPgorICAgIDxwPlRoZSBjYXNlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgaWdub3JlZCwgc28gPGNvZGU+QHtteUF0dHJpYnV0ZX08L2NvZGU+IGlzIHRyZWF0ZWQgdGhlIHNhbWUKKyAgICAgIGFzIDxjb2RlPkB7TXlBdHRyaWJ1dGV9PC9jb2RlPi48L3A+CisgICAgPGg1PlBhcmFtZXRlcnM8L2g1PgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIG5ldyBhdHRyaWJ1dGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICAgIDx0ZD5uYW1lPC90ZD4KKyAgICAgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBuZXcgYXR0cmlidXRlPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+ZGVmYXVsdDwvdGQ+CisgICAgICAgIDx0ZD5UaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc2NyaXB0aW9uPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBUaGlzIGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgICAgICA8ZW0+c2luY2UgYW50IDEuNi4xPC9lbT4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5kZXNjcmlwdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5UaGlzIGNvbnRhaW5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZS4gIDxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmRvdWJsZWV4cGFuZGluZzwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgQ29udHJvbHMgd2hldGhlciBvciBub3QgcHJvcGVydHkgcmVmZXJlbmNlcyBpbiB0aGUgYXR0cmlidXRlIGFyZSBleHBhbmRlZCB0d2ljZSBvciBqdXN0IG9uY2UuCi0gICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjbWFjcm9kZWYtcHJvcGVydHktZXhwYW5zaW9uIj5GQVE8L2E+IGZvciBkZXRhaWxzLgotICAgICAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjM8L2VtPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IHRydWU8L3RkPgorICAgICAgICA8dGQ+ZG91YmxlZXhwYW5kaW5nPC90ZD4KKyAgICAgICAgPHRkPkNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHByb3BlcnR5IHJlZmVyZW5jZXMgaW4gdGhlIGF0dHJpYnV0ZSBhcmUgZXhwYW5kZWQgdHdpY2Ugb3IganVzdAorICAgICAgICAgIG9uY2UuICBTZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjbWFjcm9kZWYtcHJvcGVydHktZXhwYW5zaW9uIgorICAgICAgICAgIHRhcmdldD0iX3RvcCI+RkFRPC9hPiBmb3IgZGV0YWlscy4gIDxlbT5TaW5jZSBBbnQgMS44LjM8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAgICAgPGg0PmVsZW1lbnQ8L2g0PgotICAgIDxwPgotICAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSBuZXcgdGFzay4KLSAgICAgIFRoZSBjb250ZW50cyBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIG9mIHRoZSB0YXNrIGluc3RhbmNlCi0gICAgICBhcmUgcGxhY2VkIGluIHRoZSB0ZW1wbGF0ZWQgdGFzayBhdCB0aGUgdGFnIG5hbWUuCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgVGhlIGNhc2Ugb2YgdGhlIGVsZW1lbnQgbmFtZSBpcyBpZ25vcmVkLgotICAgIDwvcD4KLSAgICA8aDM+UGFyYW1ldGVyczwvaDM+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8cD5UaGlzIGlzIHVzZWQgdG8gc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgb2YgdGhlIG5ldyB0YXNrLiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBuZXN0ZWQgZWxlbWVudHMKKyAgICAgIG9mIHRoZSB0YXNrIGluc3RhbmNlIGFyZSBwbGFjZWQgaW4gdGhlIHRlbXBsYXRlZCB0YXNrIGF0IHRoZSB0YWcgbmFtZS48L3A+CisgICAgPHA+VGhlIGNhc2Ugb2YgdGhlIDxjb2RlPmVsZW1lbnQ8L2NvZGU+IG5hbWUgaXMgaWdub3JlZC48L3A+CisgICAgPGg1PlBhcmFtZXRlcnM8L2g1PgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICAgIDx0ZD5uYW1lPC90ZD4KKyAgICAgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBlbGVtZW50LjwvdGQ+CisgICAgICAgIDx0ZD5ZZXM8L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5vcHRpb25hbDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgSWYgdHJ1ZSB0aGlzIG5lc3RlZCBlbGVtZW50IGlzIG9wdGlvbmFsLiBEZWZhdWx0IGlzCi0gICAgICAgICAgZmFsc2UgLSBpLmUgdGhlIG5lc3RlZCBlbGVtZW50IGlzIHJlcXVpcmVkIGluCi0gICAgICAgICAgdGhlIG5ldyB0YXNrLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPm9wdGlvbmFsPC90ZD4KKyAgICAgICAgPHRkPklmIDxxPnRydWU8L3E+IHRoaXMgbmVzdGVkIGVsZW1lbnQgaXMgb3B0aW9uYWwuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPiZtZGFzaDt0aGUgbmVzdGVkIGVsZW1lbnQgaXMgcmVxdWlyZWQgaW4gdGhlIG5ldyB0YXNrPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW1wbGljaXQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIElmIHRydWUgdGhpcyBuZXN0ZWQgZWxlbWVudCBpcyBpbXBsaWNpdC4gVGhpcyBtZWFucyB0aGF0Ci0gICAgICAgICAgYW55IG5lc3RlZCBlbGVtZW50cyBvZiB0aGUgbWFjcm9kZWYgaW5zdGFuY2Ugd2lsbCBiZSBwbGFjZWQKLSAgICAgICAgICBpbiB0aGUgZWxlbWVudCBpbmRpY2F0ZWQgYnkgdGhlIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgICAgICAgIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBlbGVtZW50IGlmIGFuIGVsZW1lbnQgaXMgaW1wbGljaXQuCi0gICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIDxlbT5zaW5jZSBhbnQgMS42LjI8L2VtPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmltcGxpY2l0PC90ZD4KKyAgICAgICAgPHRkPklmIDxxPnRydWU8L3E+IHRoaXMgbmVzdGVkIGVsZW1lbnQgaXMgaW1wbGljaXQuIFRoaXMgbWVhbnMgdGhhdCBhbnkgbmVzdGVkIGVsZW1lbnRzIG9mCisgICAgICAgICAgdGhlIDxjb2RlPm1hY3JvZGVmPC9jb2RlPiBpbnN0YW5jZSB3aWxsIGJlIHBsYWNlZCBpbiB0aGUgZWxlbWVudCBpbmRpY2F0ZWQgYnkgdGhlIG5hbWUgb2YKKyAgICAgICAgICB0aGlzIGVsZW1lbnQuICBUaGVyZSBjYW4gb25seSBiZSBvbmUgZWxlbWVudCBpZiBhbiBlbGVtZW50IGlzIGltcGxpY2l0LiAgPGVtPlNpbmNlIEFudAorICAgICAgICAgIDEuNi4yPC9lbT48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzY3JpcHRpb248L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIFRoaXMgY29udGFpbnMgYSBkZXNjcmlwdGlvbgotICAgICAgICAgIGluZm9ybWluZyB0aGUgdXNlciB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZWxlbWVudCBhcmUgZXhwZWN0ZWQgdG8gYmUuCi0gICAgICAgICAgPGVtPnNpbmNlIGFudCAxLjYuMTwvZW0+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+ZGVzY3JpcHRpb248L3RkPgorICAgICAgICA8dGQ+VGhpcyBjb250YWlucyBhIGRlc2NyaXB0aW9uIGluZm9ybWluZyB0aGUgdXNlciB3aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgZWxlbWVudCBhcmUKKyAgICAgICAgICBleHBlY3RlZCB0byBiZS4gIDxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAgICAgPGg0PnRleHQ8L2g0PgotICAgIDxwPgotICAgICAgVGhpcyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWF0bWVudCBvZiB0ZXh0IGNvbnRlbnRzIG9mIHRoZSBtYWNybyBpbnZvY2F0aW9uLgotICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBwcmVzZW50LCB0aGVuIGFueSBuZXN0ZWQgdGV4dCBpbiB0aGUgbWFjcm8gaW52b2NhdGlvbgotICAgICAgd2lsbCBiZSBhbiBlcnJvci4gSWYgdGhlIHRleHQgZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBuYW1lCi0gICAgICBiZWNvbWVzIGFuIGF0dHJpYnV0ZSB0aGF0IGdldHMgc2V0IHRvIHRoZSBuZXN0ZWQgdGV4dCBvZiB0aGUgbWFjcm8gaW52b2NhdGlvbi4KLSAgICAgIDxlbT5TaW5jZSBhbnQgMS42LjEuPC9lbT4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBUaGUgY2FzZSBvZiB0aGUgdGV4dCBuYW1lIGlzIGlnbm9yZWQuCi0gICAgPC9wPgotICAgIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDxwPlRoaXMgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0cmVhdG1lbnQgb2YgdGV4dCBjb250ZW50cyBvZiB0aGUgbWFjcm8gaW52b2NhdGlvbi4gIElmIHRoaXMKKyAgICAgIGVsZW1lbnQgaXMgbm90IHByZXNlbnQsIHRoZW4gYW55IG5lc3RlZCB0ZXh0IGluIHRoZSBtYWNybyBpbnZvY2F0aW9uIHdpbGwgYmUgYW4gZXJyb3IuIElmCisgICAgICB0aGUgPGNvZGU+dGV4dDwvY29kZT4gZWxlbWVudCBpcyBwcmVzZW50LCB0aGVuIHRoZSBuYW1lIGJlY29tZXMgYW4gYXR0cmlidXRlIHRoYXQgZ2V0cyBzZXQgdG8KKyAgICAgIHRoZSBuZXN0ZWQgdGV4dCBvZiB0aGUgbWFjcm8gaW52b2NhdGlvbi4gIDxlbT5TaW5jZSBBbnQgMS42LjE8L2VtPi48L3A+CisgICAgPHA+VGhlIGNhc2Ugb2YgdGhlIDxjb2RlPnRleHQ8L2NvZGU+IG5hbWUgaXMgaWdub3JlZC48L3A+CisgICAgPGg1PlBhcmFtZXRlcnM8L2g1PgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHRleHQgYXR0cmlidXRlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgICA8dGQ+bmFtZTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgdGV4dCBhdHRyaWJ1dGUuPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm9wdGlvbmFsPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBJZiB0cnVlIG5lc3RlZCB0ZXh0IGluIHRoZSBtYWNybyBpcyBvcHRpb25hbCwgZGVmYXVsdCBpcyAiZmFsc2UiLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPm9wdGlvbmFsPC90ZD4KKyAgICAgICAgPHRkPklmIDxxPnRydWU8L3E+IG5lc3RlZCB0ZXh0IGluIHRoZSBtYWNybyBpcyBvcHRpb25hbC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHJpbTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgSWYgdHJ1ZSwgdGhlIG5lc3RlZCB0ZXh0IGlzIHRyaW1tZWQgb2Ygd2hpdGUgc3BhY2UsCi0gICAgICAgICAgZGVmYXVsdCBpcyAiZmFsc2UiLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPnRyaW08L3RkPgorICAgICAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIHRoZSBuZXN0ZWQgdGV4dCBpcyB0cmltbWVkIG9mIHdoaXRlIHNwYWNlLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgVGhpcyBjb250YWlucyBhIGRlc2NyaXB0aW9uCi0gICAgICAgICAgaW5mb3JtaW5nIHRoZSB1c2VyIHdoYXQgdGhlIG5lc3RlZCB0ZXh0IG9mIHRoZSBtYWNybyBpcyBleHBlY3RlZAotICAgICAgICAgIHRvIGJlLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmRlc2NyaXB0aW9uPC90ZD4KKyAgICAgICAgPHRkPlRoaXMgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBpbmZvcm1pbmcgdGhlIHVzZXIgd2hhdCB0aGUgbmVzdGVkIHRleHQgb2YgdGhlIG1hY3JvIGlzCisgICAgICAgICAgZXhwZWN0ZWQgdG8gYmUuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAogICAgIDxoMz5FeGFtcGxlczwvaDM+Ci0gICAgPHA+Ci0gICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lZCBhIHRhc2sgY2FsbGVkIHRlc3RpbmcgYW5kCi0gICAgICBydW5zIGl0LgotICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9Y29kZT4KKyAgICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lZCBhIHRhc2sgY2FsbGVkIHRlc3RpbmcgYW5kIHJ1bnMgaXQuPC9wPgorICAgIDxwcmU+CiAmbHQ7bWFjcm9kZWYgbmFtZT0idGVzdGluZyImZ3Q7Ci0gICAmbHQ7YXR0cmlidXRlIG5hbWU9InYiIGRlZmF1bHQ9Ik5PVCBTRVQiLyZndDsKLSAgICZsdDtlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiLyZndDsKLSAgICZsdDtzZXF1ZW50aWFsJmd0OwotICAgICAgJmx0O2VjaG8mZ3Q7diBpcyBAe3Z9Jmx0Oy9lY2hvJmd0OwotICAgICAgJmx0O3NvbWUtdGFza3MvJmd0OwotICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idiIgZGVmYXVsdD0iTk9UIFNFVCIvJmd0OworICAgICZsdDtlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiLyZndDsKKyAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgJmx0O2VjaG8mZ3Q7diBpcyBAe3Z9Jmx0Oy9lY2hvJmd0OworICAgICAgICAmbHQ7c29tZS10YXNrcy8mZ3Q7CisgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwogJmx0Oy9tYWNyb2RlZiZndDsKIAogJmx0O3Rlc3Rpbmcgdj0iVGhpcyBpcyB2IiZndDsKLSAgICZsdDtzb21lLXRhc2tzJmd0OwotICAgICAgJmx0O2VjaG8mZ3Q7dGhpcyBpcyBhIHRlc3QmbHQ7L2VjaG8mZ3Q7Ci0gICAmbHQ7L3NvbWUtdGFza3MmZ3Q7Ci0mbHQ7L3Rlc3RpbmcmZ3Q7Ci08L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+Ci0gICAgICBUaGUgZm9sbG93aW5nIGZyYWdtZW50IGRlZmluZXMgYSB0YXNrIGNhbGxlZCA8Y29kZT4mbHQ7Y2FsbC1jYyZndDs8L2NvZGU+IHdoaWNoCi0gICAgICB0YWtlIHRoZSBhdHRyaWJ1dGVzICJ0YXJnZXQiLCAibGluayIgYW5kICJ0YXJnZXQuZGlyIiBhbmQgdGhlCi0gICAgICBuZXN0ZWQgZWxlbWVudCAiY2MtZWxlbWVudHMiLiBUaGUgYm9keSBvZiB0aGUgdGFzawotICAgICAgdXNlcyB0aGUgPGNvZGU+Jmx0O2NjJmd0OzwvY29kZT4gdGFzayBmcm9tIHRoZQotICAgICAgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC8iPmFudC1jb250cmliPC9hPiBwcm9qZWN0LgotICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9ImNvZGUiPgorICAgICZsdDtzb21lLXRhc2tzJmd0OworICAgICAgICAmbHQ7ZWNobyZndDt0aGlzIGlzIGEgdGVzdCZsdDsvZWNobyZndDsKKyAgICAmbHQ7L3NvbWUtdGFza3MmZ3Q7CismbHQ7L3Rlc3RpbmcmZ3Q7PC9wcmU+CisgICAgPHA+VGhlIGZvbGxvd2luZyBmcmFnbWVudCBkZWZpbmVzIGEgdGFzayBjYWxsZWQgPGNvZGU+Jmx0O2NhbGwtY2MmZ3Q7PC9jb2RlPiB3aGljaCB0YWtlIHRoZQorICAgICAgYXR0cmlidXRlcyA8dmFyPnRhcmdldDwvdmFyPiwgPHZhcj5saW5rPC92YXI+IGFuZCA8dmFyPnRhcmdldC5kaXI8L3Zhcj4gYW5kIHRoZSBuZXN0ZWQKKyAgICAgIGVsZW1lbnQgPGNvZGU+Y2MtZWxlbWVudHM8L2NvZGU+LiBUaGUgYm9keSBvZiB0aGUgdGFzayB1c2VzIHRoZSA8Y29kZT4mbHQ7Y2MmZ3Q7PC9jb2RlPiB0YXNrCisgICAgICBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5hbnQtY29udHJpYjwvYT4KKyAgICAgIHByb2plY3QuPC9wPgorICAgIDxwcmU+CiAmbHQ7bWFjcm9kZWYgbmFtZT0iY2FsbC1jYyImZ3Q7Ci0gICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldCIvJmd0OwotICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJsaW5rIi8mZ3Q7Ci0gICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldC5kaXIiLyZndDsKLSAgICZsdDtlbGVtZW50IG5hbWU9ImNjLWVsZW1lbnRzIi8mZ3Q7Ci0gICAmbHQ7c2VxdWVudGlhbCZndDsKLSAgICAgICZsdDtta2RpciBkaXI9IiR7b2JqLmRpcn0vQHt0YXJnZXR9Ii8mZ3Q7Ci0gICAgICAmbHQ7bWtkaXIgZGlyPSJAe3RhcmdldC5kaXJ9Ii8mZ3Q7Ci0gICAgICAgICAmbHQ7Y2MgbGluaz0iQHtsaW5rfSIgb2JqZGlyPSIke29iai5kaXJ9L0B7dGFyZ2V0fSIKLSAgICAgICAgICAgICBvdXRmaWxlPSJAe3RhcmdldC5kaXJ9L0B7dGFyZ2V0fSImZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImxpbmsiLyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldC5kaXIiLyZndDsKKyAgICAmbHQ7ZWxlbWVudCBuYW1lPSJjYy1lbGVtZW50cyIvJmd0OworICAgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSIke29iai5kaXJ9L0B7dGFyZ2V0fSIvJmd0OworICAgICAgICAmbHQ7bWtkaXIgZGlyPSJAe3RhcmdldC5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtjYyBsaW5rPSJAe2xpbmt9IiBvYmpkaXI9IiR7b2JqLmRpcn0vQHt0YXJnZXR9IgorICAgICAgICAgICAgb3V0ZmlsZT0iQHt0YXJnZXQuZGlyfS9Ae3RhcmdldH0iJmd0OwogICAgICAgICAgICAgJmx0O2NvbXBpbGVyIHJlZmlkPSJjb21waWxlci5vcHRpb25zIi8mZ3Q7CiAgICAgICAgICAgICAmbHQ7Y2MtZWxlbWVudHMvJmd0OwotICAgICAgICAgJmx0Oy9jYyZndDsKLSAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSZsdDsvbWFjcm9kZWYmZ3Q7Ci08L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+Ci0gICAgICBUaGlzIHRoZW4gY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKLSAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKyAgICAgICAgJmx0Oy9jYyZndDsKKyAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L21hY3JvZGVmJmd0OzwvcHJlPgorICAgIDxwPlRoaXMgdGhlbiBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOjwvcD4KKyAgICA8cHJlPgogJmx0O2NhbGwtY2MgdGFyZ2V0PSJ1bml0dGVzdHMiIGxpbms9ImV4ZWN1dGFibGUiCiAgICAgICAgICB0YXJnZXQuZGlyPSIke2J1aWxkLmJpbi5kaXJ9IiZndDsKICAgICZsdDtjYy1lbGVtZW50cyZndDsKQEAgLTMwMSwxNiArMjMzLDExIEBACiAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7Z2VuLmRpcn0iIGluY2x1ZGVzID0gIiouY3BwIi8mZ3Q7CiAgICAgICAmbHQ7bGlua2VyIHJlZmlkPSJsaW5rZXItbGlicyIvJmd0OwogICAgJmx0Oy9jYy1lbGVtZW50cyZndDsKLSZsdDsvY2FsbC1jYyZndDsKLTwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4KLSAgICAgIFRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgc2hvd3MgJmx0O2NhbGwtY2MmZ3Q7LCBidXQgdGhpcyB0aW1lCi0gICAgICB1c2luZyBhbiBpbXBsaWNpdCBlbGVtZW50IGFuZCB3aXRoIHRoZSBsaW5rIGFuZCB0YXJnZXQuZGlyIGFyZ3VtZW50cwotICAgICAgaGF2aW5nIGRlZmF1bHQgdmFsdWVzLgotICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9ImNvZGUiPgorJmx0Oy9jYWxsLWNjJmd0OzwvcHJlPgorICAgIDxwPlRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgc2hvd3MgPGNvZGU+Jmx0O2NhbGwtY2MmZ3Q7PC9jb2RlPiwgYnV0IHRoaXMgdGltZSB1c2luZyBhbiBpbXBsaWNpdAorICAgICAgZWxlbWVudCBhbmQgd2l0aCB0aGUgPHZhcj5saW5rPC92YXI+IGFuZCA8dmFyPnRhcmdldC5kaXI8L3Zhcj4gYXJndW1lbnRzIGhhdmluZyBkZWZhdWx0CisgICAgICB2YWx1ZXMuPC9wPgorICAgIDxwcmU+CiAmbHQ7bWFjcm9kZWYgbmFtZT0iY2FsbC1jYyImZ3Q7CiAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldCIvJmd0OwogICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJsaW5rIiBkZWZhdWx0PSJleGVjdXRhYmxlIi8mZ3Q7CkBAIC0zMjEsMTkgKzI0OCwxNCBAQAogICAgICAgJmx0O21rZGlyIGRpcj0iQHt0YXJnZXQuZGlyfSIvJmd0OwogICAgICAgICAgJmx0O2NjIGxpbms9IkB7bGlua30iIG9iamRpcj0iJHtvYmouZGlyfS9Ae3RhcmdldH0iCiAgICAgICAgICAgICAgb3V0ZmlsZT0iQHt0YXJnZXQuZGlyfS9Ae3RhcmdldH0iJmd0OwotICAgICAgICAgICAgJmx0O2NvbXBpbGVyIHJlZmlkPSJjb21waWxlci5vcHRpb25zIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y2MtZWxlbWVudHMvJmd0OworICAgICAgICAgICAgICZsdDtjb21waWxlciByZWZpZD0iY29tcGlsZXIub3B0aW9ucyIvJmd0OworICAgICAgICAgICAgICZsdDtjYy1lbGVtZW50cy8mZ3Q7CiAgICAgICAgICAmbHQ7L2NjJmd0OwogICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotJmx0Oy9tYWNyb2RlZiZndDsKLTwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4KLSAgICAgIFRoaXMgdGhlbiBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzLCBub3RlIHRoYXQgJmx0O2NjLWVsZW1lbnRzJmd0OwotICAgICAgaXMgbm90IHNwZWNpZmllZC4KLSAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDsvbWFjcm9kZWYmZ3Q7PC9wcmU+CisgICAgPHA+VGhpcyB0aGVuIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3MsIG5vdGUgdGhhdCA8Y29kZT4mbHQ7Y2MtZWxlbWVudHMmZ3Q7PC9jb2RlPiBpcyBub3QKKyAgICBzcGVjaWZpZWQuPC9wPgorICAgIDxwcmU+CiAmbHQ7Y2FsbC1jYyB0YXJnZXQ9InVuaXR0ZXN0cyImZ3Q7CiAgICAmbHQ7aW5jbHVkZXBhdGggbG9jYXRpb249IiR7Z2VuLmRpcn0iLyZndDsKICAgICZsdDtpbmNsdWRlcGF0aCBsb2NhdGlvbj0idGVzdCIvJmd0OwpAQCAtMzQxLDEzICsyNjMsOSBAQAogICAgJmx0O2ZpbGVzZXQgZGlyPSIke2dlbi5kaXJ9IiBpbmNsdWRlcyA9ICIqLmNwcCIvJmd0OwogICAgJmx0O2xpbmtlciByZWZpZD0ibGlua2VyLWxpYnMiLyZndDsKICZsdDsvY2FsbC1jYyZndDsKLTwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICA8cD4KLSAgICAgIFRoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIHVzZSBvZiB0aGUgPGNvZGU+dGV4dDwvY29kZT4gZWxlbWVudC4KLSAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKyAgICA8L3ByZT4KKyAgICA8cD5UaGUgZm9sbG93aW5nIHNob3dzIHRoZSB1c2Ugb2YgdGhlIDxjb2RlPnRleHQ8L2NvZGU+IGVsZW1lbnQuPC9wPgorICAgIDxwcmU+CiAmbHQ7bWFjcm9kZWYgbmFtZT0iZWNob3Rlc3QiJmd0OwogICAgJmx0O3RleHQgbmFtZT0idGV4dCIvJmd0OwogICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CkBAIC0zNTcsMjkgKzI3NSwyMCBAQAogJmx0O2VjaG90ZXN0Jmd0OwogICAgSGVsbG8gd29ybGQKICZsdDsvZWNob3Rlc3QmZ3Q7Ci08L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgPHA+Ci0gICAgICBUaGUgZm9sbG93aW5nIHVzZXMgYSBwcmlvciBkZWZpbmVkIGF0dHJpYnV0ZSBmb3Igc2V0dGluZyB0aGUKLSAgICAgIGRlZmF1bHQgdmFsdWUgb2YgYW5vdGhlci4gVGhlIG91dHB1dCB3b3VsZCBiZQotICAgICAgPHR0Pm9uZT10ZXN0IHR3bz10ZXN0PC90dD4uIElmIHlvdSBjaGFuZ2UgdGhlIG9yZGVyIG9mIGxpbmVzCi0gICAgICAqMSBhbmQgKjIgdGhlIG91dHB1dCB3b3VsZCBiZSA8dHQ+b25lPXRlc3QgdHdvPUB7b25lfTwvdHQ+LAotICAgICAgYmVjYXVzZSB3aGlsZSBwcm9jZXNzaW5nIHRoZSA8aT50d288L2k+LWxpbmUgdGhlIHZhbHVlIGZvcgotICAgICAgPGk+b25lPC9pPiBpcyBub3Qgc2V0LgotICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9ImNvZGUiPgorICAgIDwvcHJlPgorICAgIDxwPlRoZSBmb2xsb3dpbmcgdXNlcyBhIHByaW9yIGRlZmluZWQgYXR0cmlidXRlIGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGFub3RoZXIuIFRoZQorICAgICAgb3V0cHV0IHdvdWxkIGJlIDxjb2RlIGNsYXNzPSJvdXRwdXQiPm9uZT10ZXN0IHR3bz10ZXN0PC9jb2RlPi4gSWYgeW91IGNoYW5nZSB0aGUgb3JkZXIgb2YKKyAgICAgIGxpbmVzICoxIGFuZCAqMiB0aGUgb3V0cHV0IHdvdWxkIGJlIDxjb2RlIGNsYXNzPSJvdXRwdXQiPm9uZT10ZXN0IHR3bz1Ae29uZX08L2NvZGU+LCBiZWNhdXNlCisgICAgICB3aGlsZSBwcm9jZXNzaW5nIHRoZSA8dmFyPnR3bzwvdmFyPi1saW5lIHRoZSB2YWx1ZSBmb3IgPHZhcj5vbmU8L3Zhcj4gaXMgbm90IHNldC48L3A+CisgICAgPHByZT4KICZsdDttYWNyb2RlZiBuYW1lPSJ0ZXN0IiZndDsKLSAgICZsdDthdHRyaWJ1dGUgbmFtZT0ib25lIi8mZ3Q7ICAgICAgICAgICAgICAgICAgICAgPGI+KjE8L2I+Ci0gICAmbHQ7YXR0cmlidXRlIG5hbWU9InR3byIgZGVmYXVsdD0iQHtvbmV9Ii8mZ3Q7ICAgIDxiPioyPC9iPgorICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJvbmUiLyZndDsgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPioxPC9zdHJvbmc+CisgICAmbHQ7YXR0cmlidXRlIG5hbWU9InR3byIgZGVmYXVsdD0iQHtvbmV9Ii8mZ3Q7ICAgIDxzdHJvbmc+KjI8L3N0cm9uZz4KICAgICZsdDtzZXF1ZW50aWFsJmd0OwogICAgICAgJmx0O2VjaG8mZ3Q7b25lPUB7b25lfSAgIHR3bz1Ae3R3b30mbHQ7L2VjaG8mZ3Q7CiAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CiAmbHQ7L21hY3JvZGVmJmd0OwotJmx0O3Rlc3Qgb25lPSJ0ZXN0Ii8mZ3Q7Ci08L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0KKyZsdDt0ZXN0IG9uZT0idGVzdCIvJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbWFpbC5odG1sIGIvbWFudWFsL1Rhc2tzL21haWwuaHRtbAppbmRleCBiNTk2MzNkLi5hMmUwODE1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvbWFpbC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9tYWlsLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzMTQgKzE1LDI4MiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TWFpbCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJtYWlsIj5NYWlsPC9hPjwvaDI+Cis8aDIgaWQ9Im1haWwiPk1haWw8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLSAgPHA+Ci0gICAgQSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbC4KLSAgPC9wPgotICA8cD4KLSAgICBUaGlzIHRhc2sgY2FuIHNlbmQgbWFpbCB1c2luZyBlaXRoZXIgcGxhaW4KLSAgICB0ZXh0LCBVVSBlbmNvZGluZywgb3IgTUlNRSBmb3JtYXQgbWFpbCwgZGVwZW5kaW5nIG9uIHdoYXQgaXMgYXZhaWxhYmxlLgotICA8L3A+Ci0gIDxwPgotICAgIFNNVFAgYXV0aCBhbmQgU1NML1RMUyByZXF1aXJlIEphdmFNYWlsIGFuZCBhcmUgb25seSBhdmFpbGFibGUgaW4gTUlNRSBmb3JtYXQuCi0gIDwvcD4KLSAgPHA+Ci0gICAgQXR0YWNobWVudHMgbWF5IGJlIHNlbnQgdXNpbmcgbmVzdGVkCi0gICAgPGNvZGU+Jmx0O2F0dGFjaG1lbnRzJmd0OzwvY29kZT4gZWxlbWVudHMsIHdoaWNoIGFyZSA8YQotICAgIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZXM8L2E+LiAgVGhpcyBtZWFucwotICAgIGFueSBmaWxlc3lzdGVtIGJhc2VkIDxhCi0gICAgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciByZXNvdXJjZQotICAgIGNvbGxlY3Rpb24gY2FuIGJlIHVzZWQgdG8gcG9pbnQgdG8gYXR0YWNobWVudHMuICBQcmlvciB0byBBcGFjaGUgQW50IDEuNwotICAgIG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQKLSAgICBlbGVtZW50LCB5b3UgY2FuIHN0aWxsIHVzZSB0aGlzIGRpcmVjdGx5IHdpdGhvdXQgYW4KLSAgICA8Y29kZT4mbHQ7YXR0YWNobWVudHMmZ3Q7PC9jb2RlPiBjb250YWluZXIuCi0gIDwvcD4KLSAgPHA+Ci0gICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgbWF5IGRlcGVuZCBvbiBleHRlcm5hbCBsaWJyYXJpZXMKLSAgICB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uIAotICAgIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Ci0gICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gIDwvcD4KKzxwPkEgdGFzayB0byBzZW5kIFNNVFAgZW1haWwuPC9wPgorPHA+VGhpcyB0YXNrIGNhbiBzZW5kIG1haWwgdXNpbmcgZWl0aGVyIHBsYWluIHRleHQsIFVVIGVuY29kaW5nLCBvciBNSU1FIGZvcm1hdCBtYWlsLCBkZXBlbmRpbmcgb24KK3doYXQgaXMgYXZhaWxhYmxlLjwvcD4KKzxwPlNNVFAgYXV0aCBhbmQgU1NML1RMUyByZXF1aXJlIEphdmFNYWlsIGFuZCBhcmUgb25seSBhdmFpbGFibGUgaW4gTUlNRSBmb3JtYXQuPC9wPgorPHA+QXR0YWNobWVudHMgbWF5IGJlIHNlbnQgdXNpbmcgbmVzdGVkIDxjb2RlPiZsdDthdHRhY2htZW50cyZndDs8L2NvZGU+IGVsZW1lbnRzLCB3aGljaAorYXJlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZXM8L2E+LiAgVGhpcyBtZWFucyBhbnkgZmlsZXN5c3RlbQorYmFzZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciByZXNvdXJjZSBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHBvaW50IHRvCithdHRhY2htZW50cy4gIFByaW9yIHRvIEFwYWNoZSBBbnQgMS43IG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXMgYmVlbiBzdXBwb3J0ZWQgYXMgYQorbmVzdGVkIGVsZW1lbnQsIHlvdSBjYW4gc3RpbGwgdXNlIHRoaXMgZGlyZWN0bHkgd2l0aG91dCBhbiA8Y29kZT4mbHQ7YXR0YWNobWVudHMmZ3Q7PC9jb2RlPgorY29udGFpbmVyLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIG1heSBkZXBlbmQgb24gZXh0ZXJuYWwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUKK0FudCBkaXN0cmlidXRpb24uICBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IKK21vcmUgaW5mb3JtYXRpb24uPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZyb208L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RW1haWwgYWRkcmVzcyBvZiBzZW5kZXIuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPkVpdGhlciBhIDxjb2RlPmZyb208L2NvZGU+IGF0dHJpYnV0ZSwgb3IgYSA8Y29kZT4mbHQ7ZnJvbSZndDs8L2NvZGU+Ci0gICAgZWxlbWVudC48L3RkPgorICAgIDx0ZD5mcm9tPC90ZD4KKyAgICA8dGQ+RW1haWwgYWRkcmVzcyBvZiBzZW5kZXIuPC90ZD4KKyAgICA8dGQ+RWl0aGVyIGEgPHZhcj5mcm9tPC92YXI+IGF0dHJpYnV0ZSwgb3IgYSA8Y29kZT4mbHQ7ZnJvbSZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVwbHl0bzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5SZXBseXRvIGVtYWlsIGFkZHJlc3MuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cmVwbHl0bzwvdGQ+CisgICAgPHRkPlJlcGx5LXRvIGVtYWlsIGFkZHJlc3MuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2xpc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50cy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMyI+QXQgbGVhc3Qgb25lIG9mIHRoZXNlLCBvciB0aGUKLSAgICAgICBlcXVpdmFsZW50IGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPnRvbGlzdDwvdGQ+CisgICAgPHRkPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlY2lwaWVudHMuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMyI+QXQgbGVhc3Qgb25lIG9mIHRoZXNlLCBvciB0aGUgZXF1aXZhbGVudCBuZXN0ZWQgZWxlbWVudHM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jY2xpc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVjaXBpZW50cyB0byBjYXJib24gY29weTwvdGQ+CisgICAgPHRkPmNjbGlzdDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWNpcGllbnRzIHRvIGNhcmJvbiBjb3B5PC90ZD4KICAgICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iY2NsaXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHJlY2lwaWVudHMgdG8gYmxpbmQgY2FyYm9uIGNvcHkKKyAgICA8dGQ+YmNjbGlzdDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWNpcGllbnRzIHRvIGJsaW5kIGNhcmJvbiBjb3B5CiAgICAgPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5NZXNzYWdlIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIiByb3dzcGFuPSIyIj5PbmUgb2YgdGhlc2Ugb3IgYQotICAgIDxjb2RlPiZsdDttZXNzYWdlJmd0OzwvY29kZT4gZWxlbWVudC48L3RkPgorICAgIDx0ZD5tZXNzYWdlPC90ZD4KKyAgICA8dGQ+TWVzc2FnZSB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSBlbWFpbC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5PbmUgb2YgdGhlc2Ugb3IgYSA8Y29kZT4mbHQ7bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZWZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RmlsZSB0byBzZW5kIGFzIHRoZSBib2R5IG9mIHRoZSBlbWFpbC4gUHJvcGVydHkKLSAgICB2YWx1ZXMgaW4gdGhlIGZpbGUgd2lsbCBiZSBleHBhbmRlZC48L3RkPgorICAgIDx0ZD5tZXNzYWdlZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5GaWxlIHRvIHNlbmQgYXMgdGhlIGJvZHkgb2YgdGhlIGVtYWlsLiBQcm9wZXJ0eSB2YWx1ZXMgaW4gdGhlIGZpbGUgd2lsbCBiZQorICAgICAgZXhwYW5kZWQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZWZpbGVpbnB1dGVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU3BlY2lmaWVzIHRoZSBlbmNvZGluZyBvZiB0aGUgaW5wdXQgZmlsZS4gUGxlYXNlIHNlZQotICAgICAgPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+Ci0gICAgICAgIFN1cHBvcnRlZCBFbmNvZGluZ3M8L2E+IGZvciBhIGxpc3Qgb2YgcG9zc2libGUKLSAgICAgIHZhbHVlcy4gRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKLSAgICAgIGVuY29kaW5nLiA8ZW0+U2luY2UgQW50IDEuOS40PC9lbT4KKyAgICA8dGQ+bWVzc2FnZWZpbGVpbnB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBlbmNvZGluZyBvZiB0aGUgaW5wdXQgZmlsZS4gUGxlYXNlCisgICAgICBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiCisgICAgICB0YXJnZXQ9Il90b3AiPlN1cHBvcnRlZCBFbmNvZGluZ3M8L2E+IGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLiA8ZW0+U2luY2UgQW50IDEuOS40PC9lbT4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZW1pbWV0eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb250ZW50IHR5cGUgb2YgdGhlIG1lc3NhZ2UuICBUaGUgZGVmYXVsdCBpcwotICAgIDxjb2RlPnRleHQvcGxhaW48L2NvZGU+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm1lc3NhZ2VtaW1ldHlwZTwvdGQ+CisgICAgPHRkPlRoZSBjb250ZW50IHR5cGUgb2YgdGhlIG1lc3NhZ2UuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dGV4dC9wbGFpbjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlcyB0byBzZW5kIGFzIGF0dGFjaG1lbnRzIHRvIHRoZSBlbWFpbC4gIFNlcGFyYXRlIG11bHRpcGxlCi0gICAgZmlsZSBuYW1lcyB1c2luZyBhIGNvbW1hIG9yIHNwYWNlLiAgWW91IGNhbiBhbHNvIHVzZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+Ci0gICAgZWxlbWVudHMgdG8gc3BlY2lmeSBmaWxlcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5maWxlczwvdGQ+CisgICAgPHRkPkZpbGVzIHRvIHNlbmQgYXMgYXR0YWNobWVudHMgdG8gdGhlIGVtYWlsLiAgU2VwYXJhdGUgbXVsdGlwbGUgZmlsZSBuYW1lcyB1c2luZyBhIGNvbW1hIG9yCisgICAgICBzcGFjZS4gIFlvdSBjYW4gYWxzbyB1c2UgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uCi0gICAgYW55IGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLjwvdGQ+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+ZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIG9uIGFueSBlcnJvci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVmaWxlbmFtZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSBmaWxlbmFtZShzKSBiZWZvcmUgZmlsZSBjb250ZW50cy4KLSAgICBWYWxpZCBvbmx5IHdoZW4gdGhlIDxjb2RlPnBsYWluPC9jb2RlPiBlbmNvZGluZyBpcyB1c2VkLiAgVGhlIGRlZmF1bHQKLSAgICB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZWZpbGVuYW1lczwvdGQ+CisgICAgPHRkPkluY2x1ZGUgZmlsZW5hbWUocykgYmVmb3JlIGZpbGUgY29udGVudHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+LCBpZ25vcmVkIHVubGVzcyA8cT5wbGFpbjwvcT4gZW5jb2RpbmcgaXMgdXNlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1haWxob3N0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkhvc3QgbmFtZSBvZiB0aGUgU01UUCBzZXJ2ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgIDxjb2RlPmxvY2FsaG9zdDwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bWFpbGhvc3Q8L3RkPgorICAgIDx0ZD5Ib3N0IG5hbWUgb2YgdGhlIFNNVFAgc2VydmVyLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmxvY2FsaG9zdDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYWlscG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UQ1AgcG9ydCBvZiB0aGUgU01UUCBzZXJ2ZXIuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyNS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5tYWlscG9ydDwvdGQ+CisgICAgPHRkPlRDUCBwb3J0IG9mIHRoZSBTTVRQIHNlcnZlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4yNTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51c2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXIgbmFtZSBmb3IgU01UUCBhdXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiPlllcywgaWYgU01UUCBhdXRoIGlzIHJlcXVpcmVkIG9uIHlvdXIgU01UUCBzZXJ2ZXI8YnI+PC9icj4KLSAgICB0aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudCB1c2luZyBNaW1lIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CisgICAgPHRkPnVzZXI8L3RkPgorICAgIDx0ZD51c2VyIG5hbWUgZm9yIFNNVFAgYXV0aDwvdGQ+CisgICAgPHRkPlllcywgaWYgU01UUCBhdXRoIGlzIHJlcXVpcmVkIG9uIHlvdXIgU01UUCBzZXJ2ZXI7PGJyLz50aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudAorICAgICAgdXNpbmcgTUlNRSBhbmQgcmVxdWlyZXMgSmF2YU1haWw8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZCBmb3IgU01UUCBhdXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiPlllcywgaWYgU01UUCBhdXRoIGlzIHJlcXVpcmVkIG9uIHlvdXIgU01UUCBzZXJ2ZXI8YnI+PC9icj4KLSAgICB0aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudCB1c2luZyBNaW1lIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CisgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQgZm9yIFNNVFAgYXV0aDwvdGQ+CisgICAgPHRkPlllcywgaWYgU01UUCBhdXRoIGlzIHJlcXVpcmVkIG9uIHlvdXIgU01UUCBzZXJ2ZXI7PGJyLz50aGUgZW1haWwgbWVzc2FnZSB3aWxsIGJlIHRoZW4gc2VudAorICAgICAgdXNpbmcgTUlNRSBhbmQgcmVxdWlyZXMgSmF2YU1haWw8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zc2w8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+InRydWUiLCAib24iIG9yICJ5ZXMiIGFjY2VwdGVkIGhlcmU8YnI+PC9icj4KLSAgICBpbmRpY2F0ZXMgd2hldGhlciB5b3UgbmVlZCBUTFMvU1NMPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c3NsPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT4sIDxxPm9uPC9xPiwgb3IgPHE+eWVzPC9xPiBhY2NlcHRlZCBoZXJlPGJyLz5pbmRpY2F0ZXMgd2hldGhlciB5b3UgbmVlZAorICAgICAgVExTL1NTTDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbWFpbC4KLSAgICBWYWx1ZXMgYXJlIDxjb2RlPm1pbWU8L2NvZGU+LCA8Y29kZT51dTwvY29kZT4sIDxjb2RlPnBsYWluPC9jb2RlPiwgb3IKLSAgICAgIDxjb2RlPmF1dG88L2NvZGU+LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+YXV0bzwvY29kZT4uCi0gICAgICA8Y29kZT51dTwvY29kZT4gb3IgPGNvZGU+cGxhaW48L2NvZGU+IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIFNNVFAgYXV0aDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBlbmNvZGluZyB0byB1c2UgZm9yIHRoZSBjb250ZW50IG9mIHRoZSBlbWFpbC4gIFZhbHVlcworICAgICAgYXJlIDxxPm1pbWU8L3E+LCA8cT51dTwvcT4sIDxxPnBsYWluPC9xPiwgb3IgPHE+YXV0bzwvcT4uIDxxPnV1PC9xPiBvciA8cT5wbGFpbjwvcT4gYXJlIG5vdAorICAgICAgY29tcGF0aWJsZSB3aXRoIFNNVFAgYXV0aDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmF1dG88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hhcnNldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5DaGFyYWN0ZXIgc2V0IG9mIHRoZSBlbWFpbC48YnI+Ci0gICAgWW91IGNhbiBhbHNvIHNldCB0aGUgY2hhcnNldCBpbiB0aGUgbWVzc2FnZSBuZXN0ZWQgZWxlbWVudC48YnI+Ci0gICAgVGhlc2Ugb3B0aW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNoYXJzZXQ8L3RkPgorICAgIDx0ZD5DaGFyYWN0ZXIgc2V0IG9mIHRoZSBlbWFpbC48YnIvPllvdSBjYW4gYWxzbyBzZXQgdGhlIDx2YXI+Y2hhcnNldDwvdmFyPiBpbgorICAgICAgdGhlIDxjb2RlPm1lc3NhZ2U8L2NvZGU+IG5lc3RlZCBlbGVtZW50Ljxici8+ICBUaGVzZSBvcHRpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWJqZWN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVtYWlsIHN1YmplY3QgbGluZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zdWJqZWN0PC90ZD4KKyAgICA8dGQ+RW1haWwgc3ViamVjdCBsaW5lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlSW52YWxpZFJlY2lwaWVudHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Qm9vbGVhbi4gIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHRyeSB0byBzZW5kCi0gICAgICB0aGUgbWVzc2FnZSB0byBhcyBtYW55IHJlY2lwaWVudHMgYXMgcG9zc2libGUgYW5kIHNob3VsZCBvbmx5Ci0gICAgICBmYWlsIGlmIG5laXRoZXIgaXMgcmVhY2hhYmxlLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPmlnbm9yZUludmFsaWRSZWNpcGllbnRzPC90ZD4KKyAgICA8dGQ+KGJvb2xlYW4pIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHRyeSB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIGFzIG1hbnkgcmVjaXBpZW50cyBhcyBwb3NzaWJsZQorICAgICAgYW5kIHNob3VsZCBvbmx5IGZhaWwgaWYgbmVpdGhlciBpcyByZWFjaGFibGUuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5hYmxlU3RhcnRUTFM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+InRydWUiLCAib24iIG9yICJ5ZXMiIGFjY2VwdGVkIGhlcmU8YnI+PC9icj4KLSAgICAgIHdoZXRoZXIgdGhlIFNUQVJUVExTIGNvbW1hbmQgdXNlZCB0byBzd2l0Y2ggdG8gYW4gZW5jcnlwdGVkCi0gICAgICBjb25uZWN0aW9uIGZvciBhdXRoZW50aWNhdGlvbiBzaG91bGQgYmUgc3VwcG9ydGVkLiAgUmVxdWlyZXMKLSAgICAgIEphdmFNYWlsLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZW5hYmxlU3RhcnRUTFM8L3RkPgorICAgIDx0ZD4oYm9vbGVhbikgV2hldGhlciB0aGUgPGNvZGU+U1RBUlRUTFM8L2NvZGU+IGNvbW1hbmQgdXNlZCB0byBzd2l0Y2ggdG8gYW4gZW5jcnlwdGVkCisgICAgICBjb25uZWN0aW9uIGZvciBhdXRoZW50aWNhdGlvbiBzaG91bGQgYmUgc3VwcG9ydGVkLiAgUmVxdWlyZXMgSmF2YU1haWwuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPk5vdGUgcmVnYXJkaW5nIHRoZSBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgZW1haWwgYWRkcmVzc2VzPC9oMz4KLVNpbmNlIEFudCAxLjYsIHRoZSBhdHRyaWJ1dGVzIGZyb20sIHJlcGx5dG8sIHRvbGlzdCwgY2NsaXN0LCBiY2NsaXN0Ci1jYW4gY29udGFpbiBlbWFpbCBhZGRyZXNzZXMgb2YgdGhlIGZvcm0gOgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPiwgdGhlCithdHRyaWJ1dGVzIDx2YXI+ZnJvbTwvdmFyPiwgPHZhcj5yZXBseXRvPC92YXI+LCA8dmFyPnRvbGlzdDwvdmFyPiwgPHZhcj5jY2xpc3Q8L3Zhcj4sIDx2YXI+YmNjbGlzdDwvdmFyPgorY2FuIGNvbnRhaW4gZW1haWwgYWRkcmVzc2VzIG9mIHRoZSBmb3JtOjwvcD4KIDx1bD4KLTxsaT5hZGRyZXNzQHh5ei5jb208L2xpPgotPGxpPm5hbWUgJmx0O2FkZHJlc3NAeHl6LmNvbSZndDs8L2xpPgotPGxpPiZsdDthZGRyZXNzQHh5ei5jb20mZ3Q7IG5hbWU8L2xpPgotPGxpPihuYW1lKSBhZGRyZXNzQHh5ei5jb208L2xpPgotPGxpPmFkZHJlc3NAeHl6LmNvbSAobmFtZSk8L2xpPgorICA8bGk+PHNhbXA+YWRkcmVzc0B4eXouY29tPC9zYW1wPjwvbGk+CisgIDxsaT48c2FtcD5uYW1lICZsdDthZGRyZXNzQHh5ei5jb20mZ3Q7PC9zYW1wPjwvbGk+CisgIDxsaT48c2FtcD4mbHQ7YWRkcmVzc0B4eXouY29tJmd0OyBuYW1lPC9zYW1wPjwvbGk+CisgIDxsaT48c2FtcD4obmFtZSkgYWRkcmVzc0B4eXouY29tPC9zYW1wPjwvbGk+CisgIDxsaT48c2FtcD5hZGRyZXNzQHh5ei5jb20gKG5hbWUpPC9zYW1wPjwvbGk+CiA8L3VsPgotPHA+WW91IG5lZWQgdG8gZW50ZXIgdGhlIGFuZ2xlIGJyYWNrZXRzIGFzIFhNTCBlbnRpdGllcwotPGNvZGU+JmFtcDtndDs8L2NvZGU+IGFuZCA8Y29kZT4mYW1wO2x0OzwvY29kZT4uPC9wPgorPHA+WW91IG5lZWQgdG8gZW50ZXIgdGhlIGFuZ2xlIGJyYWNrZXRzIGFzIFhNTCBlbnRpdGllcyA8cT4mYW1wO2d0OzwvcT4gYW5kIDxxPiZhbXA7bHQ7PC9xPi48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08aDQ+dG8gLyBjYyAvIGJjYyAvIGZyb20vIHJlcGx5dG8gPC9oND4KKzxoND50byAvIGNjIC8gYmNjIC8gZnJvbS8gcmVwbHl0bzwvaDQ+CiA8cD5BZGRzIGFuIGVtYWlsIGFkZHJlc3MgZWxlbWVudC4gIEl0IHRha2VzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+CiAKLTx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZGlzcGxheSBuYW1lIGZvciB0aGUgYWRkcmVzcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIGRpc3BsYXkgbmFtZSBmb3IgdGhlIGFkZHJlc3MuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hZGRyZXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbWFpbCBhZGRyZXNzLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5hZGRyZXNzPC90ZD4KKyAgICA8dGQ+VGhlIGVtYWlsIGFkZHJlc3MuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5tZXNzYWdlPC9oND4KIAotPHA+U3BlY2lmaWVzIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGVtYWlsIGJvZHkuICBJdCB0YWtlcyB0aGUgZm9sbG93aW5nCi1hdHRyaWJ1dGVzOjwvcD4KKzxwPlNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBlbWFpbCBib2R5LiAgSXQgdGFrZXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOjwvcD4KIAotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gdXNlIGFzIHRoZSBtZXNzYWdlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIHRvIHVzZSBhcyB0aGUgbWVzc2FnZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbWV0eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb250ZW50IHR5cGUgdG8gdXNlIGZvciB0aGUgbWVzc2FnZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5taW1ldHlwZTwvdGQ+CisgICAgPHRkPlRoZSBjb250ZW50IHR5cGUgdG8gdXNlIGZvciB0aGUgbWVzc2FnZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNoYXJzZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q2hhcmFjdGVyIHNldCBvZiB0aGUgbWVzc2FnZTxicj4KLSAgICBZb3UgY2FuIGFsc28gc2V0IHRoZSBjaGFyc2V0IGFzIGF0dHJpYnV0ZSBvZiB0aGUgZW5jbG9zaW5nIG1haWwgdGFzay48YnI+Ci0gICAgVGhlc2Ugb3B0aW9ucyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNoYXJzZXQ8L3RkPgorICAgIDx0ZD5DaGFyYWN0ZXIgc2V0IG9mIHRoZSBtZXNzYWdlPGJyLz5Zb3UgY2FuIGFsc28gc2V0IHRoZSA8dmFyPmNoYXJzZXQ8L3Zhcj4gYXMgYXR0cmlidXRlIG9mIHRoZQorICAgICAgZW5jbG9zaW5nIDxjb2RlPm1haWw8L2NvZGU+IHRhc2suPGJyLz4gIFRoZXNlIG9wdGlvbnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlucHV0ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIG9mIHRoZSBpbnB1dCBmaWxlLiBQbGVhc2Ugc2VlCi0gICAgICA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KLSAgICAgICAgU3VwcG9ydGVkIEVuY29kaW5nczwvYT4gZm9yIGEgbGlzdCBvZiBwb3NzaWJsZQotICAgICAgdmFsdWVzLiBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlcgotICAgICAgZW5jb2RpbmcuIDxlbT5TaW5jZSBBbnQgMS45LjQ8L2VtPgorICAgIDx0ZD5pbnB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+CisgICAgICBTcGVjaWZpZXMgdGhlIGVuY29kaW5nIG9mIHRoZSBpbnB1dCBmaWxlLiBQbGVhc2UKKyAgICAgIHNlZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+U3VwcG9ydGVkIEVuY29kaW5nczwvYT4gZm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMuIDxlbT5TaW5jZSBBbnQgMS45LjQ8L2VtPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+SWYgdGhlIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGV4dCBjYW4gYmUgYWRkZWQKLWluc2lkZSB0aGUgPGNvZGU+Jmx0O21lc3NhZ2UmZ3Q7PC9jb2RlPiBlbGVtZW50LiBQcm9wZXJ0eSBleHBhbnNpb24gd2lsbCBvY2N1cgotaW4gdGhlIG1lc3NhZ2UsIHdoZXRoZXIgaXQgaXMgc3BlY2lmaWVkIGFzIGFuIGV4dGVybmFsIGZpbGUgb3IgYXMgdGV4dCB3aXRoaW4KLXRoZSA8Y29kZT4mbHQ7bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorPHA+SWYgdGhlIDx2YXI+c3JjPC92YXI+IGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRleHQgY2FuIGJlIGFkZGVkIGluc2lkZQordGhlIDxjb2RlPiZsdDttZXNzYWdlJmd0OzwvY29kZT4gZWxlbWVudC4gUHJvcGVydHkgZXhwYW5zaW9uIHdpbGwgb2NjdXIgaW4gdGhlIG1lc3NhZ2UsIHdoZXRoZXIgaXQKK2lzIHNwZWNpZmllZCBhcyBhbiBleHRlcm5hbCBmaWxlIG9yIGFzIHRleHQgd2l0aGluIHRoZSA8Y29kZT4mbHQ7bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgogCiA8aDQ+aGVhZGVyPC9oND4KLTxwPjxzdHJvbmc+U2luY2UgQW50IDEuNzwvc3Ryb25nPiwgYXJiaXRyYXJ5IG1haWwgaGVhZGVycyBjYW4gYmUgYWRkZWQgYnkKLSAgc3BlY2lmeWluZyB0aGVzZSBhdHRyaWJ1dGVzIG9uIG9uZSBvciBtb3JlIG5lc3RlZCBoZWFkZXIgZWxlbWVudHM6PC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiwgYXJiaXRyYXJ5IG1haWwgaGVhZGVycyBjYW4gYmUgYWRkZWQgYnkgc3BlY2lmeWluZyB0aGVzZSBhdHRyaWJ1dGVzIG9uIG9uZQorb3IgbW9yZSBuZXN0ZWQgaGVhZGVyIGVsZW1lbnRzOjwvcD4KIAotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1haWwgaGVhZGVyLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFpbCBoZWFkZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIHRvIGFzc2lnbiB0byB0aGlzIG1haWwgaGVhZGVyLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPlRoZSB2YWx1ZSB0byBhc3NpZ24gdG8gdGhpcyBtYWlsIGhlYWRlci48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+SXQgaXMgcGVybWlzc2libGUgdG8gZHVwbGljYXRlIHRoZSBuYW1lIGF0dHJpYnV0ZSBhbW9uZ3N0IG11bHRpcGxlIGhlYWRlcnMuCi08L3A+Cis8cD5JdCBpcyBwZXJtaXNzaWJsZSB0byBkdXBsaWNhdGUgdGhlIG5hbWUgYXR0cmlidXRlIGFtb25nc3QgbXVsdGlwbGUgaGVhZGVycy48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5TZW5kIGFuIGVtYWlsIGZyb20gPHE+bWU8L3E+IHRvIDxxPnlvdTwvcT4gd2l0aCBhIHN1YmplY3Qgb2YgPHE+UmVzdWx0cyBvZiBuaWdodGx5IGJ1aWxkPC9xPiBhbmQKK2luY2x1ZGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIDxzYW1wPmJ1aWxkLmxvZzwvc2FtcD4gaW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuPC9wPgorCis8cHJlPgogJmx0O21haWwgZnJvbT0mcXVvdDttZSZxdW90OwogICAgICAgdG9saXN0PSZxdW90O3lvdSZxdW90OwogICAgICAgc3ViamVjdD0mcXVvdDtSZXN1bHRzIG9mIG5pZ2h0bHkgYnVpbGQmcXVvdDsKLSAgICAgIGZpbGVzPSZxdW90O2J1aWxkLmxvZyZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CisgICAgICBmaWxlcz0mcXVvdDtidWlsZC5sb2cmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5TZW5kcyBhbiBlbWFpbCBmcm9tIDxpPm1lPC9pPiB0byA8aT55b3U8L2k+IHdpdGggYSBzdWJqZWN0IG9mCi08aT5SZXN1bHRzIG9mIG5pZ2h0bHkgYnVpbGQ8L2k+IGFuZCBpbmNsdWRlcyB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUKLTxpPmJ1aWxkLmxvZzwvaT4gaW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuPC9wPgorPHA+U2VuZCBhbiBlbWFpbCBmcm9tIDxxPmNvbmZpZ0BteWlzcC5jb208L3E+IHRvIDxxPmFsbEB4eXouY29tPC9xPiB3aXRoIGEgc3ViamVjdCBvZiA8cT5UZXN0CitCdWlsZDwvcT4uIFJlcGxpZXMgdG8gdGhpcyBlbWFpbCB3aWxsIGdvIHRvIDxxPm1lQG15aXNwLmNvbTwvcT4uIEFueSB6aXAgZmlsZXMgZnJvbQordGhlIDxzYW1wPmRpc3Q8L3NhbXA+IGRpcmVjdG9yeSBhcmUgYXR0YWNoZWQuIFRoZSB0YXNrIHdpbGwgYXR0ZW1wdCB0byB1c2UgSmF2YU1haWwgYW5kIGZhbGwgYmFjayB0bworVVUgZW5jb2Rpbmcgb3Igbm8gZW5jb2RpbmcgaW4gdGhhdCBvcmRlciBkZXBlbmRpbmcgb24gd2hhdCBzdXBwb3J0IGNsYXNzZXMgYXJlCithdmFpbGFibGUuIDxzYW1wPiR7YnVpbGRuYW1lfTwvc2FtcD4gd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSA8Y29kZT5idWlsZG5hbWU8L2NvZGU+IHByb3BlcnR5J3MKK3ZhbHVlLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7bWFpbCBtYWlsaG9zdD0mcXVvdDtzbXRwLm15aXNwLmNvbSZxdW90OyBtYWlscG9ydD0mcXVvdDsxMDI1JnF1b3Q7IHN1YmplY3Q9JnF1b3Q7VGVzdCBidWlsZCZxdW90OyZndDsKICAgJmx0O2Zyb20gYWRkcmVzcz0mcXVvdDtjb25maWdAbXlpc3AuY29tJnF1b3Q7LyZndDsKICAgJmx0O3JlcGx5dG8gYWRkcmVzcz0mcXVvdDttZUBteWlzcC5jb20mcXVvdDsvJmd0OwpAQCAtMzMyLDE3ICszMDEsMTIgQEAKICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi56aXAmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsZXNldCZndDsKICAgJmx0Oy9hdHRhY2htZW50cyZndDsKLSZsdDsvbWFpbCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbWFpbCZndDs8L3ByZT4KIAotPHA+U2VuZHMgYW4gZU1haWwgZnJvbSA8aT5jb25maWdAbXlpc3AuY29tPC9pPiB0byA8aT5hbGxAeHl6LmNvbTwvaT4gd2l0aCBhIHN1YmplY3Qgb2YKLTxpPlRlc3QgQnVpbGQ8L2k+LiBSZXBsaWVzIHRvIHRoaXMgZW1haWwgd2lsbCBnbyB0byA8aT5tZUBteWlzcC5jb208L2k+LgotQW55IHppcCBmaWxlcyBmcm9tIHRoZSBkaXN0IGRpcmVjdG9yeSBhcmUgYXR0YWNoZWQuJm5ic3A7IFRoZQotdGFzayB3aWxsIGF0dGVtcHQgdG8gdXNlIEphdmFNYWlsIGFuZCBmYWxsIGJhY2sgdG8gVVUgZW5jb2Rpbmcgb3Igbm8gZW5jb2RpbmcgaW4KLXRoYXQgb3JkZXIgZGVwZW5kaW5nIG9uIHdoYXQgc3VwcG9ydCBjbGFzc2VzIGFyZSBhdmFpbGFibGUuIDxjb2RlPiR7YnVpbGRuYW1lfTwvY29kZT4KLXdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgPGNvZGU+YnVpbGRuYW1lPC9jb2RlPiBwcm9wZXJ0eSdzIHZhbHVlLjwvcD4KKzxwPlNlbmQgYW4gZW1haWwgZnJvbSA8cT5tZUBteWlzcC5jb208L3E+IHRvIDxxPmFsbEB4eXouY29tPC9xPiB3aXRoIGEgc3ViamVjdCBvZiA8cT5UZXN0IEJ1aWxkPC9xPiwKK3RoZSBtZXNzYWdlIGJvZHkgYmVpbmcgY29kZWQgaW4gVVRGLTguCiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7bGluZTImcXVvdDsgdmFsdWU9JnF1b3Q7c29tZV9pbnRlcm5hdGlvbmFsX21lc3NhZ2UmcXVvdDsvJmd0OwogJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDske2xpbmUyfSZxdW90Oy8mZ3Q7CiAKQEAgLTM1MCwxMyArMzE0LDcgQEAKICAgJmx0O2Zyb20gYWRkcmVzcz0mcXVvdDttZUBteWlzdC5jb20mcXVvdDsvJmd0OwogICAmbHQ7dG8gYWRkcmVzcz0mcXVvdDthbGxAeHl6LmNvbSZxdW90Oy8mZ3Q7CiAgICZsdDttZXNzYWdlJmd0O3NvbWUgaW50ZXJuYXRpb25hbCB0ZXh0OiR7bGluZTJ9Jmx0Oy9tZXNzYWdlJmd0OwotJmx0Oy9tYWlsJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08cD5TZW5kcyBhbiBlTWFpbCBmcm9tIDxpPm1lQG15aXNwLmNvbTwvaT4gdG8gPGk+YWxsQHh5ei5jb208L2k+IHdpdGggYSBzdWJqZWN0IG9mCi08aT5UZXN0IEJ1aWxkPC9pPiwgdGhlIG1lc3NhZ2UgYm9keSBiZWluZyBjb2RlZCBpbiBVVEYtOAotCi0KKyZsdDsvbWFpbCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL21ha2V1cmwuaHRtbCBiL21hbnVhbC9UYXNrcy9tYWtldXJsLmh0bWwKaW5kZXggYjIwZjk0YS4uZWEzMzk5MiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL21ha2V1cmwuaHRtbAorKysgYi9tYW51YWwvVGFza3MvbWFrZXVybC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjIxICsxNSw3MyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLSAgICAKLTxodG1sPgorCis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogICA8dGl0bGU+TWFrZXVybCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAotPGJvZHkgYmdjb2xvcj0iI2ZmZmZmZiIgdGV4dD0iIzAwMDAwMCIgbGluaz0iIzUyNUQ3NiIKLSAgICAgIGFsaW5rPSIjNTI1RDc2IiB2bGluaz0iIzUyNUQ3NiI+Cis8Ym9keT4KIAotPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI0Ij4KLQotICA8IS0tIFBBR0UgSEVBREVSIC0tPgorPGgyPk1ha2V1cmwgVGFzazwvaDI+Cis8aDMgaWQ9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGlzIHRhc2sgdGFrZXMgb25lIG9yIG1vcmUgZmlsZW5hbWVzIGFuZCB0dXJucyB0aGVtIGludG8gVVJMcywgd2hpY2ggaXQgdGhlbiBhc3NpZ25zIHRvIGEKK3Byb3BlcnR5LiAgVXNlZnVsIHdoZW4gc2V0dGluZyB1cCBSTUkgb3IgSk5MUCBjb2RlYmFzZXMsIGZvciBleGFtcGxlLiAgTmVzdGVkIGZpbGVzZXRzIGFyZQorc3VwcG9ydGVkOyBpZiBwcmVzZW50LCB0aGVzZSBhcmUgdHVybmVkIGludG8gdGhlIFVSTHMgd2l0aCB0aGUgc3VwcGxpZWQgPHZhcj5zZXBhcmF0b3I8L3Zhcj4gYmV0d2VlbgordGhlbS48L3A+Cis8aDMgaWQ9ImF0dHJpYnV0ZXMiPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+TWFrZXVybCBUYXNrPC9zdHJvbmc+PC9mb250PgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KLSAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiLz4KLSAgICAgICAgICAgIDwvYT4KLSAgICAgICAgICA8L3RkPgotICAgICAgPC90cj48L3RhYmxlPgotICAgIDwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VHlwZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KLQotICA8IS0tIFNUQVJUIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgogICA8dHI+Ci0gICAgPHRkICB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotCi0gICAgICAgICAgPCEtLSBBcHBseWluZyB0YXNrL2xvbmctZGVzY3JpcHRpb24gLS0+Ci0gICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgotICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KLSAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci1UaGlzIHRhc2sgdGFrZXMgb25lIG9yIG1vcmUgZmlsZW5hbWVzIGFuZCB0dXJucyB0aGVtIGludG8gVVJMcywgd2hpY2ggaXQgdGhlbiBhc3NpZ25zIHRvIGEgcHJvcGVydHkuCi1Vc2VmdWwgd2hlbiBzZXR0aW5nIHVwIFJNSSBvciBKTkxQIGNvZGViYXNlcywgZm9yIGV4YW1wbGUuCi1OZXN0ZWQgZmlsZXNldHMgYXJlIHN1cHBvcnRlZDsgaWYgcHJlc2VudCwgdGhlc2UgYXJlIHR1cm5lZCBpbnRvIHRoZSBVUkxzIHdpdGggdGhlIHN1cHBsaWVkIHNlcGFyYXRvciBiZXR3ZWVuIHRoZW0gKGRlZmF1bHQ6IHNwYWNlKS4KLTxwLz4KLTxwPkV4YW1wbGVzOjwvcD4KLTxwcmU+Ci0mbHQ7bWFrZXVybCBmaWxlPSIke3VzZXIuaG9tZX0vLm0yL3JlcG9zaXRvcnkiIHByb3BlcnR5PSJtMi5yZXBvc2l0b3J5LnVybCIvJmd0OwotPC9wcmU+Ci1TZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5tMi5yZXBvc2l0b3J5LnVybDwvY29kZT4gdG8gdGhlIGZpbGU6IFVSTCBvZiB0aGUgbG9jYWwgTWF2ZW4yIHJlcG9zaXRvcnkuCi08cHJlPgotJmx0O21ha2V1cmwgcHJvcGVydHk9ImNvZGViYXNlIiZndDsmbHQ7ZmlsZXNldCBkaXI9ImxpYiBpbmNsdWRlcz0iKi5qYXIiLyZndDsmbHQ7L21ha2V1cmwmZ3Q7Ci08L3ByZT4KLVNldCB0aGUgcHJvcGVydHkgPGNvZGU+Y29kZWJhc2U8L2NvZGU+IHRvIHRoZSB0aHJlZSBVUkxzIG9mIHRoZSBmaWxlcyBwcm92aWRlZCBhcyBuZXN0ZWQgZWxlbWVudHMuCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBEZXNjcmlwdGlvbiAtLT4KLQotIDwhLS0gSWdub3JlIC0tPgotCi0KLQotICAgIDwhLS0gU3RhcnQgQXR0cmlidXRlcyAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5BdHRyaWJ1dGU8L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+VHlwZTwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5SZXF1aXJlbWVudDwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCi0gICAgCi0gICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAotICAgICAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5maWxlPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZSBvZiBhIGZpbGUgdG8gYmUgY29udmVydGVkIGludG8gYSBVUkw8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5GaWxlPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3B0aW9uYWwsIGlmIGEgbmVzdGVkIGZpbGVzZXQgb3IgcGF0aCBpcyBzdXBwbGllZDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3BlcnR5PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCB0byB0aGUgVVJMPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+cmVxdWlyZWQ8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXBhcmF0b3I8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXBhcmF0b3IgZm9yIHRoZSBtdWx0aS1VUkwgb3B0aW9uPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3B0aW9uYWw8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj52YWxpZGF0ZTwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnZhbGlkYXRlIHRoYXQgZXZlcnkgbmFtZWQgZmlsZSBleGlzdHM8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+b3B0aW9uYWw7IGRlZmF1bHQ6IHRydWU8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLQotCi0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBBdHRyaWJ1dGVzIC0tPgotCi0gICAgPCEtLSBTdGFydCBFbGVtZW50cyAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgotICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KLSAgICAgICAgICA8YSBuYW1lPSJlbGVtZW50cyI+Ci0gICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzIGFzIG5lc3RlZCBlbGVtZW50czwvc3Ryb25nPjwvYT48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgotICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+Ci0gICAgICAgICAgPHN0cm9uZz5maWxlc2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0KTwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIEEgZmlsZXNldCBvZiBKQVIgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgVVJMIGxpc3QsIGVhY2ggc2VwYXJhdGVkIGJ5IHRoZSBzZXBhcmF0b3IuCi0gPCEtLSBJZ25vcmUgLS0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+cGF0aDwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aCk8L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBBZGQgYSBwYXRoIHRvIHRoZSBVUkwuIEFsbCBlbGVtZW50cyBpbiB0aGUgcGF0aCB3aWxsIGJlIGNvbnZlcnRlZCB0byBpbmRpdmlkdWFsIFVSTCBlbnRyaWVzLgotIDwhLS0gSWdub3JlIC0tPgotIDwhLS0gSWdub3JlIC0tPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KLQotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+Ci0KLQotICAgIDwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZSB0byBiZSBjb252ZXJ0ZWQgaW50byBhIFVSTDwvdGQ+CisgICAgPHRkPkZpbGU8L3RkPgorICAgIDx0ZD5ObywgaWYgYSBuZXN0ZWQgZmlsZXNldCBvciBwYXRoIGlzIHN1cHBsaWVkPC90ZD4KICAgPC90cj4KLSAgPCEtLSBFTkQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+Ci0KKyAgPHRyPgorICAgIDx0ZD5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgdG8gdGhlIFVSTDwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2VwYXJhdG9yPC90ZD4KKyAgICA8dGQ+c2VwYXJhdG9yIGZvciB0aGUgbXVsdGktVVJMIG9wdGlvbjwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHNwYWNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52YWxpZGF0ZTwvdGQ+CisgICAgPHRkPnZhbGlkYXRlIHRoYXQgZXZlcnkgbmFtZWQgZmlsZSBleGlzdHM8L3RkPgorICAgIDx0ZD5ib29sZWFuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgogPC90YWJsZT4KKzxoMyBpZD0iZWxlbWVudHMiPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND48c3Ryb25nPmZpbGVzZXQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQpPC9oND4KIAorPHA+QSBmaWxlc2V0IG9mIEpBUiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBVUkwgbGlzdCwgZWFjaCBzZXBhcmF0ZWQgYnkgdGhlIHNlcGFyYXRvci48L3A+CisKKzxoND48c3Ryb25nPnBhdGg8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgpPC9oND4KKworPHA+QWRkIGEgcGF0aCB0byB0aGUgVVJMLiBBbGwgZWxlbWVudHMgaW4gdGhlIHBhdGggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gaW5kaXZpZHVhbCBVUkwgZW50cmllcy48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlNldCB0aGUgcHJvcGVydHkgPGNvZGU+bTIucmVwb3NpdG9yeS51cmw8L2NvZGU+IHRvIHRoZSBmaWxlOiBVUkwgb2YgdGhlIGxvY2FsIE1hdmVuMgorcmVwb3NpdG9yeS48L3A+Cis8cHJlPiZsdDttYWtldXJsIGZpbGU9IiR7dXNlci5ob21lfS8ubTIvcmVwb3NpdG9yeSIgcHJvcGVydHk9Im0yLnJlcG9zaXRvcnkudXJsIi8mZ3Q7PC9wcmU+CisKKzxwPlNldCB0aGUgcHJvcGVydHkgPGNvZGU+Y29kZWJhc2U8L2NvZGU+IHRvIHRoZSB0aHJlZSBVUkxzIG9mIHRoZSBmaWxlcyBwcm92aWRlZCBhcyBuZXN0ZWQKK2VsZW1lbnRzLjwvcD4KKzxwcmU+Jmx0O21ha2V1cmwgcHJvcGVydHk9ImNvZGViYXNlIiZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIgaW5jbHVkZXM9IiouamFyIi8mZ3Q7CismbHQ7L21ha2V1cmwmZ3Q7PC9wcmU+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbWFuaWZlc3QuaHRtbCBiL21hbnVhbC9UYXNrcy9tYW5pZmVzdC5odG1sCmluZGV4IDdhNWI5OGIuLjBlODkzN2QgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9tYW5pZmVzdC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9tYW5pZmVzdC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTY3ICsxNSwxNDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPk1hbmlmZXN0IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9Im1hbmlmZXN0Ij5NYW5pZmVzdDwvYT48L2gyPgorPGgyIGlkPSJtYW5pZmVzdCI+TWFuaWZlc3Q8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIDxwPkNyZWF0ZXMgYSBtYW5pZmVzdCBmaWxlLjwvcD4KIAotPHA+VGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgTWFuaWZlc3QgZmlsZSwgb3B0aW9uYWxseQotcmVwbGFjaW5nIG9yIHVwZGF0aW5nIGFuIGV4aXN0aW5nIGZpbGUuPC9wPgorPHA+VGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgTWFuaWZlc3QgZmlsZSwgb3B0aW9uYWxseSByZXBsYWNpbmcgb3IgdXBkYXRpbmcgYW4gZXhpc3RpbmcKK2ZpbGUuPC9wPgogCis8cD5NYW5pZmVzdHMgYXJlIHByb2Nlc3NlZCBhY2NvcmRpbmcgdG8KK3RoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvamFyL2phci5odG1sIiB0YXJnZXQ9Il90b3AiPkphcgorZmlsZSBzcGVjaWZpY2F0aW9uPC9hPi4gU3BlY2lmaWNhbGx5LCBhIG1hbmlmZXN0IGVsZW1lbnQgY29uc2lzdHMgb2YgYSBzZXQgb2YgYXR0cmlidXRlcyBhbmQKK3NlY3Rpb25zLiBUaGVzZSBzZWN0aW9ucyBpbiB0dXJuIG1heSBjb250YWluIGF0dHJpYnV0ZXMuIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IHRoaXMgbWF5IHJlc3VsdCBpbgorbWFuaWZlc3QgbGluZXMgZ3JlYXRlciB0aGFuIDcyIGJ5dGVzIGJlaW5nIHdyYXBwZWQgYW5kIGNvbnRpbnVlZCBvbiB0aGUgbmV4dCBsaW5lLjwvcD4KIAorPHA+VGhlIEFwYWNoZSBBbnQgdGVhbSByZWd1bGFybHkgZ2V0cyBjb21wbGFpbnRzIHRoYXQgdGhpcyB0YXNrIGluIGdlbmVyYXRpbmcgaW52YWxpZCBtYW5pZmVzdHMuIEJ5CithbmQgbGFyZ2UsIHRoaXMgaXMgbm90IHRoZSBjYXNlOiB3ZSBiZWxpZXZlIHRoYXQgd2UgYXJlIGZvbGxvd2luZyB0aGUgc3BlY2lmaWNhdGlvbiB0byB0aGUKK2xldHRlci4gVGhlIHVzdWFsIHByb2JsZW0gaXMgdGhhdCBzb21lIHRoaXJkIHBhcnR5IG1hbmlmZXN0IHJlYWRlciBpcyBub3QgZm9sbG93aW5nIHRoZSBzYW1lCitzcGVjaWZpY2F0aW9uIGFzIHdlbGwgYXMgdGhleSB0aGluayB0aGV5IHNob3VsZDsgd2UgY2Fubm90IGdlbmVyYXRlIGludmFsaWQgbWFuaWZlc3QgZmlsZXMganVzdAorYmVjYXVzZSBvbmUgc2luZ2xlIGFwcGxpY2F0aW9uIGlzIGJyb2tlbi4gSmF2YSBNRSBydW50aW1lcyBhcHBlYXIgdG8gYmUgcGFydGljdWxhcmx5Cit0cm91Ymxlc29tZS48L3A+CiAKLTxwPk1hbmlmZXN0cyBhcmUgcHJvY2Vzc2VkIGFjY29yZGluZyB0byB0aGUgCi08YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwiPkphcgotZmlsZSBzcGVjaWZpY2F0aW9uLjwvYT4uIFNwZWNpZmljYWxseSwgYSBtYW5pZmVzdCBlbGVtZW50IGNvbnNpc3RzIG9mCi1hIHNldCBvZiBhdHRyaWJ1dGVzIGFuZCBzZWN0aW9ucy4gVGhlc2Ugc2VjdGlvbnMgaW4gdHVybiBtYXkgY29udGFpbgotYXR0cmlidXRlcy4gTm90ZSBpbiBwYXJ0aWN1bGFyIHRoYXQgdGhpcyBtYXkgcmVzdWx0IGluIG1hbmlmZXN0IGxpbmVzCi1ncmVhdGVyIHRoYW4gNzIgYnl0ZXMgYmVpbmcgd3JhcHBlZCBhbmQgY29udGludWVkIG9uIHRoZSBuZXh0Ci1saW5lLjwvcD4KLQotPHA+Ci0gIFRoZSBBcGFjaGUgQW50IHRlYW0gcmVndWxhcmx5IGdldHMgY29tcGxhaW50cyB0aGF0IHRoaXMgdGFzayBpbiBnZW5lcmF0aW5nIGludmFsaWQKLSAgbWFuaWZlc3RzLiBCeSBhbmQgbGFyZ2UsIHRoaXMgaXMgbm90IHRoZSBjYXNlOiB3ZSBiZWxpZXZlIHRoYXQgd2UgYXJlIGZvbGxvd2luZwotICB0aGUgc3BlY2lmaWNhdGlvbiB0byB0aGUgbGV0dGVyLiBUaGUgdXN1YWwgcHJvYmxlbSBpcyB0aGF0IHNvbWUgdGhpcmQgcGFydHkKLSAgbWFuaWZlc3QgcmVhZGVyIGlzIG5vdCBmb2xsb3dpbmcgdGhlIHNhbWUgc3BlY2lmaWNhdGlvbiBhcyB3ZWxsIGFzIHRoZXkgdGhpbmsKLSAgdGhleSBzaG91bGQ7IHdlIGNhbm5vdCBnZW5lcmF0ZSBpbnZhbGlkIG1hbmlmZXN0IGZpbGVzIGp1c3QgYmVjYXVzZSBvbmUKLSAgc2luZ2xlIGFwcGxpY2F0aW9uIGlzIGJyb2tlbi4gSjJNRSBydW50aW1lcyBhcHBlYXIgdG8gYmUgcGFydGljdWxhcmx5IHRyb3VibGVzb21lLgotPC9wPgotCi08cD4KLSAgSWYgeW91IGZpbmQgdGhhdCBBbnQgZ2VuZXJhdGVzIG1hbmlmZXN0cyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIHJ1bnRpbWUsIHRha2UKLSAgYSBtYW5pZmVzdCBpdCBoYXMgYnVpbHQsIGZpeCBpdCB1cCBob3dldmVyIHlvdSBuZWVkIGFuZCBzd2l0Y2ggdG8gdXNpbmcgdGhlICZsdDt6aXAmZ3QKLSAgdGFzayB0byBjcmVhdGUgdGhlIEpBUiwgZmVlZGluZyBpbiB0aGUgaGFuZC1jcmFmdGVkIG1hbmlmZXN0LgotPC9wPgotCi0KKzxwPklmIHlvdSBmaW5kIHRoYXQgQW50IGdlbmVyYXRlcyBtYW5pZmVzdHMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBydW50aW1lLCB0YWtlIGEgbWFuaWZlc3QgaXQgaGFzCitidWlsdCwgZml4IGl0IHVwIGhvd2V2ZXIgeW91IG5lZWQgYW5kIHN3aXRjaCB0byB1c2luZyB0aGUgPGEgaHJlZj0iemlwLmh0bWwiPnppcDwvYT4gdGFzayB0byBjcmVhdGUKK3RoZSBKQVIsIGZlZWRpbmcgaW4gdGhlIGhhbmQtY3JhZnRlZCBtYW5pZmVzdC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbWFuaWZlc3QtZmlsZSB0byBjcmVhdGUvdXBkYXRlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+dGhlIG1hbmlmZXN0LWZpbGUgdG8gY3JlYXRlL3VwZGF0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAidXBkYXRlIiBvciAicmVwbGFjZSIsIGRlZmF1bHQgaXMgInJlcGxhY2UiLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm1vZGU8L3RkPgorICAgIDx0ZD5PbmUgb2YgPHE+dXBkYXRlPC9xPiBvciA8cT5yZXBsYWNlPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5yZXBsYWNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB1c2VkIHRvIHJlYWQgdGhlIGV4aXN0aW5nIG1hbmlmZXN0Ci0gICAgICB3aGVuIHVwZGF0aW5nLiAgVGhlIHRhc2sgd2lsbCBhbHdheXMgdXNlIFVURi04IHdoZW4gd3JpdGluZyB0aGUKLSAgICAgIG1hbmlmZXN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gVVRGLTggZW5jb2RpbmcuPC90ZD4KKyAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2RpbmcgdXNlZCB0byByZWFkIHRoZSBleGlzdGluZyBtYW5pZmVzdCB3aGVuIHVwZGF0aW5nLiAgVGhlIHRhc2sgd2lsbCBhbHdheXMgdXNlCisgICAgICBVVEYtOCB3aGVuIHdyaXRpbmcgdGhlIG1hbmlmZXN0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBVVEYtOCBlbmNvZGluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1lcmdlQ2xhc3NQYXRoQXR0cmlidXRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIG1lcmdlIHRoZSBDbGFzcy1QYXRoIGF0dHJpYnV0ZXMgZm91bmQKLSAgICAgIGluIGRpZmZlcmVudCBtYW5pZmVzdHMgKGlmIHVwZGF0aW5nKS4gIElmIGZhbHNlLCBvbmx5IHRoZQotICAgICAgYXR0cmlidXRlIG9mIHRoZSBtb3N0IHJlY2VudCBtYW5pZmVzdCB3aWxsIGJlIHByZXNlcnZlZC4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi4KLSAgICAgIDxici8+dW5sZXNzIHlvdSBhbHNvIHNldCBmbGF0dGVuQXR0cmlidXRlcyB0byB0cnVlIHRoaXMgbWF5Ci0gICAgICByZXN1bHQgaW4gbWFuaWZlc3RzIGNvbnRhaW5pbmcgbXVsdGlwbGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzCi0gICAgICB3aGljaCB2aW9sYXRlcyB0aGUgbWFuaWZlc3Qgc3BlY2lmaWNhdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgorICAgIDx0ZD5tZXJnZUNsYXNzUGF0aEF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIG1lcmdlIHRoZSA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGVzIGZvdW5kIGluIGRpZmZlcmVudCBtYW5pZmVzdHMgKGlmCisgICAgICB1cGRhdGluZykuICBJZiA8cT5mYWxzZTwvcT4sIG9ubHkgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgbW9zdCByZWNlbnQgbWFuaWZlc3Qgd2lsbCBiZQorICAgICAgcHJlc2VydmVkLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ljxici8+VW5sZXNzIHlvdSBhbHNvIHNldCA8dmFyPmZsYXR0ZW5BdHRyaWJ1dGVzPC92YXI+CisgICAgICB0byA8cT50cnVlPC9xPiB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3RzIGNvbnRhaW5pbmcgbXVsdGlwbGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4KKyAgICAgIGF0dHJpYnV0ZXMgd2hpY2ggdmlvbGF0ZXMgdGhlIG1hbmlmZXN0IHNwZWNpZmljYXRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhdHRlbkF0dHJpYnV0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBtZXJnZSBhdHRyaWJ1dGVzIG9jY3VycmluZyBtb3JlIHRoYW4KLSAgICAgIG9uY2UgaW4gYSBzZWN0aW9uICh0aGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IgdGhlIENsYXNzLVBhdGgKLSAgICAgIGF0dHJpYnV0ZSkgaW50byBhIHNpbmdsZSBhdHRyaWJ1dGUuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KKyAgICA8dGQ+ZmxhdHRlbkF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIG1lcmdlIGF0dHJpYnV0ZXMgb2NjdXJyaW5nIG1vcmUgdGhhbiBvbmNlIGluIGEgc2VjdGlvbiAodGhpcyBjYW4gb25seSBoYXBwZW4gZm9yCisgICAgICB0aGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4gYXR0cmlidXRlKSBpbnRvIGEgc2luZ2xlIGF0dHJpYnV0ZS4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMz5OZXN0ZWQgZWxlbWVudHM8L2gzPgotPGg0PjxhIG5hbWU9ImF0dHJpYnV0ZSI+YXR0cmlidXRlPC9hPjwvaDQ+Ci08cD5PbmUgYXR0cmlidXRlIGZvciB0aGUgbWFuaWZlc3QgZmlsZS4gIFRob3NlIGF0dHJpYnV0ZXMgdGhhdCBhcmUKLW5vdCBuZXN0ZWQgaW50byBhIHNlY3Rpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgIk1haW4iIHNlY3Rpb24uPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPGg0IGlkPSJhdHRyaWJ1dGUiPmF0dHJpYnV0ZTwvaDQ+Cis8cD5PbmUgYXR0cmlidXRlIGZvciB0aGUgbWFuaWZlc3QgZmlsZS4gIFRob3NlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IG5lc3RlZCBpbnRvIGEgc2VjdGlvbiB3aWxsIGJlCithZGRlZCB0byB0aGUgbWFpbiBzZWN0aW9uLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIDxicj4KLSAgICAgICAgbXVzdCBtYXRjaCB0aGUgcmVnZXhwIDx0dD5bQS1aYS16MC05XVtBLVphLXowLTktX10qPC90dD4uCisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLCBtdXN0IG1hdGNoIHRoZSByZWdleHAgPHE+W0EtWmEtejAtOV1bQS1aYS16MC05LV9dKjwvcT4uCiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPnRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoND5zZWN0aW9uPC9oND4KLTxwPkEgbWFuaWZlc3Qgc2VjdGlvbiAtIHlvdSBjYW4gbmVzdCA8YQotaHJlZj0iI2F0dHJpYnV0ZSI+YXR0cmlidXRlPC9hPiBlbGVtZW50cyBpbnRvIHNlY3Rpb25zLjwvcD4KKzxwPkEgbWFuaWZlc3Qgc2VjdGlvbiZtZGFzaDt5b3UgY2FuIG5lc3QgPGEgaHJlZj0iI2F0dHJpYnV0ZSI+YXR0cmlidXRlPC9hPiBlbGVtZW50cyBpbnRvCitzZWN0aW9ucy48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgc2VjdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGlmIG9taXR0ZWQgaXQgd2lsbCBiZSBhc3N1bWVkCi0gICAgICAgdG8gYmUgdGhlIG1haW4gc2VjdGlvbi48L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uPC90ZD4KKyAgICA8dGQ+Tm8sIGRlZmF1bHRzIHRvIHRoZSBtYWluIHNlY3Rpb248L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPHByZT4KLSAgJmx0O21hbmlmZXN0IGZpbGU9JnF1b3Q7TUFOSUZFU1QuTUYmcXVvdDsmZ3Q7Ci0gICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0J1aWx0LUJ5JnF1b3Q7IHZhbHVlPSZxdW90OyR7dXNlci5uYW1lfSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O3NlY3Rpb24gbmFtZT0mcXVvdDtjb21tb24mcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U3BlY2lmaWNhdGlvbi1UaXRsZSZxdW90OyB2YWx1ZT0mcXVvdDtFeGFtcGxlJnF1b3Q7LyZndDsKLSAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtTcGVjaWZpY2F0aW9uLVZlcnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U3BlY2lmaWNhdGlvbi1WZW5kb3ImcXVvdDsgdmFsdWU9JnF1b3Q7RXhhbXBsZSBPcmdhbml6YXRpb24mcXVvdDsvJmd0OwotICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0ltcGxlbWVudGF0aW9uLVRpdGxlJnF1b3Q7IHZhbHVlPSZxdW90O2NvbW1vbiZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVyc2lvbiZxdW90OyB2YWx1ZT0mcXVvdDske3ZlcnNpb259ICR7VE9EQVl9JnF1b3Q7LyZndDsgCi0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0V4YW1wbGUgQ29ycC4mcXVvdDsvJmd0OwotICAgICZsdDsvc2VjdGlvbiZndDsKLSAgICAmbHQ7c2VjdGlvbiBuYW1lPSZxdW90O2NvbW1vbi9jbGFzczEuY2xhc3MmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U2VhbGVkJnF1b3Q7IHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3NlY3Rpb24mZ3Q7Ci0gICZsdDsvbWFuaWZlc3QmZ3Q7Ci08L3ByZT4KKzxwPkNyZWF0ZSBvciByZXBsYWNlIHRoZSBmaWxlIDxzYW1wPk1BTklGRVNULk1GPC9zYW1wPi4gTm90ZSB0aGF0IHRoZSA8Y29kZT5CdWlsdC1CeTwvY29kZT4KK2F0dHJpYnV0ZSB3aWxsIHRha2UgdGhlIHZhbHVlIG9mIHRoZSBBbnQgcHJvcGVydHkgPGNvZGU+JHt1c2VyLm5hbWV9PC9jb2RlPi4gVGhlIHNhbWUgaXMgdHJ1ZSBmb3IKK3RoZSA8Y29kZT4ke3ZlcnNpb259PC9jb2RlPiBhbmQgPGNvZGU+JHtUT0RBWX08L2NvZGU+IHByb3BlcnRpZXMuIFRoaXMgZXhhbXBsZSBwcm9kdWNlcworYSA8c2FtcD5NQU5JRkVTVC5NRjwvc2FtcD4gdGhhdAorY29udGFpbnMgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3ZlcnNpb25pbmcvc3BlYy92ZXJzaW9uaW5nMi5odG1sI3dwOTA3NzkiCit0YXJnZXQ9Il90b3AiPnBhY2thZ2UgdmVyc2lvbiBpZGVudGlmaWNhdGlvbjwvYT4gZm9yIHRoZSBwYWNrYWdlIDxzYW1wPmNvbW1vbjwvc2FtcD4uPC9wPgogCi08cD5DcmVhdGVzIG9yIHJlcGxhY2VzIHRoZSBmaWxlIE1BTklGRVNULk1GLiAgTm90ZSB0aGF0IHRoZSBCdWlsdC1CeQotYXR0cmlidXRlIHdpbGwgdGFrZSB0aGUgdmFsdWUgb2YgdGhlIEFudCBwcm9wZXJ0eSAke3VzZXIubmFtZX0uICBUaGUKLXNhbWUgaXMgdHJ1ZSBmb3IgdGhlICR7dmVyc2lvbn0gYW5kICR7VE9EQVl9IHByb3BlcnRpZXMuICBUaGlzIGV4YW1wbGUKLXByb2R1Y2VzIGEgTUFOSUZFU1QuTUYgdGhhdCBjb250YWlucyAKLTxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL3ZlcnNpb25pbmcvc3BlYy92ZXJzaW9uaW5nMi5odG1sI3dwOTA3NzkiPnBhY2thZ2UKLXZlcnNpb24gaWRlbnRpZmljYXRpb248L2E+IGZvciB0aGUgcGFja2FnZSA8Y29kZT5jb21tb248L2NvZGU+LjwvcD4KKzxwcmU+CismbHQ7bWFuaWZlc3QgZmlsZT0mcXVvdDtNQU5JRkVTVC5NRiZxdW90OyZndDsKKyAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O0J1aWx0LUJ5JnF1b3Q7IHZhbHVlPSZxdW90OyR7dXNlci5uYW1lfSZxdW90Oy8mZ3Q7CisgICZsdDtzZWN0aW9uIG5hbWU9JnF1b3Q7Y29tbW9uJnF1b3Q7Jmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtTcGVjaWZpY2F0aW9uLVRpdGxlJnF1b3Q7IHZhbHVlPSZxdW90O0V4YW1wbGUmcXVvdDsvJmd0OworICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDtTcGVjaWZpY2F0aW9uLVZlcnNpb24mcXVvdDsgdmFsdWU9JnF1b3Q7JHt2ZXJzaW9ufSZxdW90Oy8mZ3Q7CisgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O1NwZWNpZmljYXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0V4YW1wbGUgT3JnYW5pemF0aW9uJnF1b3Q7LyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVGl0bGUmcXVvdDsgdmFsdWU9JnF1b3Q7Y29tbW9uJnF1b3Q7LyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVyc2lvbiZxdW90OyB2YWx1ZT0mcXVvdDske3ZlcnNpb259ICR7VE9EQVl9JnF1b3Q7LyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb24tVmVuZG9yJnF1b3Q7IHZhbHVlPSZxdW90O0V4YW1wbGUgQ29ycC4mcXVvdDsvJmd0OworICAmbHQ7L3NlY3Rpb24mZ3Q7CisgICZsdDtzZWN0aW9uIG5hbWU9JnF1b3Q7Y29tbW9uL2NsYXNzMS5jbGFzcyZxdW90OyZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7U2VhbGVkJnF1b3Q7IHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKKyAgJmx0Oy9zZWN0aW9uJmd0OworJmx0Oy9tYW5pZmVzdCZndDs8L3ByZT4KIAogPHA+VGhlIG1hbmlmZXN0IHByb2R1Y2VkIGJ5IHRoZSBhYm92ZSB3b3VsZCBsb29rIGxpa2UgdGhpczo8L3A+CiAKLTxwcmU+PGNvZGU+TWFuaWZlc3QtVmVyc2lvbjogMS4wCis8cHJlPgorTWFuaWZlc3QtVmVyc2lvbjogMS4wCiBCdWlsdC1CeTogYm9kZXdpZwogQ3JlYXRlZC1CeTogQXBhY2hlIEFudCAxLjkKIApAQCAtMTg3LDExICsxNzAsNyBAQAogSW1wbGVtZW50YXRpb24tVGl0bGU6IGNvbW1vbgogCiBOYW1lOiBjb21tb24vY2xhc3MxLmNsYXNzCi1TZWFsZWQ6IGZhbHNlCi0KLTwvY29kZT48L3ByZT4KLQorU2VhbGVkOiBmYWxzZTwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9tYW5pZmVzdGNsYXNzcGF0aC5odG1sIGIvbWFudWFsL1Rhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwKaW5kZXggMmMxOTNiOC4uNzUyNzA3OCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDQgKzE1LDg2IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5NYW5pZmVzdENsYXNzUGF0aCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJtYW5pZmVzdGNsYXNzcGF0aCI+TWFuaWZlc3RjbGFzc3BhdGg8L2E+PC9oMj4KKzxoMiBpZD0ibWFuaWZlc3RjbGFzc3BhdGgiPk1hbmlmZXN0Y2xhc3NwYXRoPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC9wPgogCiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Q29udmVydHMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBhdGg8L2E+IGludG8gYSBwcm9wZXJ0eQotd2hvc2UgdmFsdWUgaXMgYXBwcm9wcmlhdGUgZm9yIGEgPGEgaHJlZj0ibWFuaWZlc3QuaHRtbCI+TWFuaWZlc3Q8L2E+J3MKLTxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+IGF0dHJpYnV0ZS48L3A+Cis8cD5Db252ZXJ0cyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aDwvYT4gaW50byBhIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGFwcHJvcHJpYXRlIGZvcgorYSA8YSBocmVmPSJtYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT4ncyA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgogCi08cD5UaGlzIHRhc2sgaXMgb2Z0ZW4gdXNlZCB0byB3b3JrIGFyb3VuZCBjb21tYW5kIGxpbmUgbGltaXRhdGlvbnMgb24gV2luZG93cwotd2hlbiB1c2luZyB2ZXJ5IGxvbmcgY2xhc3MgcGF0aHMgd2hlbiBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24uIFRoZSBsb25nIGNsYXNzCi1wYXRoIG5vcm1hbGx5IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIChwb3NzaWJseQotZW1wdHkpIGphciBmaWxlIHdoaWNoIGFuIGluLW1hbmlmZXN0IENsYXNzLVBhdGggYXR0cmlidXRlIHdob3NlIHZhbHVlIGxpc3RzCi1hbGwgdGhlIGphciBhbmQgemlwIGZpbGVzIHRoZSBjbGFzcyBwYXRoIHNob3VsZCBjb250YWluLiBUaGUgZmlsZXMgcmVmZXJlbmNlZAotZnJvbSB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlIGZvdW5kIHJlbGF0aXZlbHkgdG8gdGhlIGphciBmaWxlIGl0c2VsZiwgdXN1YWxseQotaW4gdGhlIHNhbWUgZGlyZWN0b3J5LiBUaGUgSmF2YSBWTSBhdXRvbWljYWxseSB1c2VzIGFsbCBmaWxlIGVudHJpZXMgbGlzdGVkCi1pbiB0aGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzIG9mIGEgamFyIHRvIGxvY2F0ZS9sb2FkIGNsYXNzZXMuIE5vdGUgdGhvdWdoIHRoYXQKLWl0IHNpbGVudGx5IGlnbm9yZXMgZW50cmllcyBmb3Igd2hpY2ggaXQgY2Fubm90IGZpbmQgYW55IGNvcnJlc3BvbmRpbmcgZmlsZS48L3A+Cis8cD5UaGlzIHRhc2sgaXMgb2Z0ZW4gdXNlZCB0byB3b3JrIGFyb3VuZCBjb21tYW5kIGxpbmUgbGltaXRhdGlvbnMgb24gV2luZG93cyB3aGVuIHVzaW5nIHZlcnkgbG9uZworY2xhc3MgcGF0aHMgd2hlbiBsYXVuY2hpbmcgYW4gYXBwbGljYXRpb24uIFRoZSBsb25nIGNsYXNzIHBhdGggbm9ybWFsbHkgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCitsaW5lIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIChwb3NzaWJseSBlbXB0eSkgamFyIGZpbGUgd2hpY2ggYW4gaW4tbWFuaWZlc3QgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4KK2F0dHJpYnV0ZSB3aG9zZSB2YWx1ZSBsaXN0cyBhbGwgdGhlIGphciBhbmQgemlwIGZpbGVzIHRoZSBjbGFzc3BhdGggc2hvdWxkIGNvbnRhaW4uIFRoZSBmaWxlcworcmVmZXJlbmNlZCBmcm9tIHRoaXMgYXR0cmlidXRlIG11c3QgYmUgZm91bmQgcmVsYXRpdmVseSB0byB0aGUgamFyIGZpbGUgaXRzZWxmLCB1c3VhbGx5IGluIHRoZSBzYW1lCitkaXJlY3RvcnkuIEpWTSBhdXRvbWF0aWNhbGx5IHVzZXMgYWxsIGZpbGUgZW50cmllcyBsaXN0ZWQgaW4gdGhlIDxjb2RlPkNsYXNzLVBhdGg8L2NvZGU+IGF0dHJpYnV0ZXMKK29mIGEgamFyIHRvIGxvY2F0ZS9sb2FkIGNsYXNzZXMuIE5vdGUgdGhvdWdoIHRoYXQgaXQgc2lsZW50bHkgaWdub3JlcyBlbnRyaWVzIGZvciB3aGljaCBpdCBjYW5ub3QKK2ZpbmQgYW55IGNvcnJlc3BvbmRpbmcgZmlsZS48L3A+CiAKLTxwPk5vdGUgdGhhdCB0aGUgcHJvcGVydHkgdmFsdWUgY3JlYXRlZCBtYXkgYmUgbG9uZ2VyIHRoYW4gYSBtYW5pZmVzdCdzIG1heGltdW0KLTcyIGNoYXJhY3RlcnMgcGVyIGxpbmUsIGJ1dCB3aWxsIGJlIHByb3Blcmx5IHdyYXBwZWQgYXMgcGVyIHRoZSBKYXIKLXNwZWNpZmljYXRpb24gYnkgdGhlIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQsIHdoZXJlIHRoZQotZGVmaW5lZCBwcm9wZXJ0eSBpcyByZS1yZWZlcmVuY2VkLjwvcD4KKzxwPk5vdGUgdGhhdCB0aGUgcHJvcGVydHkgdmFsdWUgY3JlYXRlZCBtYXkgYmUgbG9uZ2VyIHRoYW4gYSBtYW5pZmVzdCdzIG1heGltdW0gNzIgY2hhcmFjdGVycyBwZXIKK2xpbmUsIGJ1dCB3aWxsIGJlIHByb3Blcmx5IHdyYXBwZWQgYXMgcGVyIHRoZSBKYXIgc3BlY2lmaWNhdGlvbiBieSB0aGUgPGNvZGU+Jmx0O21hbmlmZXN0Jmd0OzwvY29kZT4KK2VsZW1lbnQsIHdoZXJlIHRoZSBkZWZpbmVkIHByb3BlcnR5IGlzIHJlLXJlZmVyZW5jZWQuPC9wPgogCi08cD5Gb3IgdGhpcyB0YXNrIHRvIHdvcmsgcHJvcGVybHkgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgZmlsZQotICBnaXZlbiBpbiB0aGUgPGNvZGU+amFyZmlsZTwvY29kZT4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUKLSAgbmVzdGVkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gbXVzdCBiZSB0aGUgc2FtZSBhcyB5b3UgZXhwZWN0IHRoZW0gdG8KLSAgYmUgd2hlbiBkZXBsb3lpbmcgdGhlIGphci48L3A+Ci0KLTxwPjxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC9wPgorPHA+Rm9yIHRoaXMgdGFzayB0byB3b3JrIHByb3Blcmx5IHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGZpbGUgZ2l2ZW4gaW4gdGhlIDxjb2RlPmphcmZpbGU8L2NvZGU+CithdHRyaWJ1dGUgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXN0ZWQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBtdXN0IGJlIHRoZSBzYW1lIGFzIHlvdSBleHBlY3QgdGhlbQordG8gYmUgd2hlbiBkZXBsb3lpbmcgdGhlIGphci48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4gVGhpcyBwcm9wZXJ0eSBtdXN0Ci0gICAgICAgICAgICAgICAgICAgICBub3QgYWxyZWFkeSBiZSBzZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC4gVGhpcyBwcm9wZXJ0eSBtdXN0IG5vdCBhbHJlYWR5IGJlIHNldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5qYXJmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgdGhlIGZpbGVuYW1lIGZvciB0aGUgSmFyIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgbWFuaWZlc3QgdGhhdCB3aWxsCi0gICAgICB1c2UgdGhlIHByb3BlcnR5IHRoaXMgdGFzayB3aWxsIHNldC4gVGhpcyBmaWxlIG5lZWQgbm90IGV4aXN0IHlldCwKLSAgICAgIGJ1dCBpdHMgcGFyZW50IGRpcmVjdG9yeSBtdXN0IGV4aXN0LgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5qYXJmaWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGVuYW1lIGZvciB0aGUgSmFyIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgbWFuaWZlc3QgdGhhdCB3aWxsIHVzZSB0aGUgcHJvcGVydHkgdGhpcworICAgICAgdGFzayB3aWxsIHNldC4gVGhpcyBmaWxlIG5lZWQgbm90IGV4aXN0IHlldCwgYnV0IGl0cyBwYXJlbnQgZGlyZWN0b3J5IG11c3QgZXhpc3QuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4UGFyZW50TGV2ZWxzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcmVudCBkaXJlY3RvcmllcyBvbmUgaXMgYWxsb3dlZCB0byB0cmF2ZXJzZQotICAgICAgdG8gbmF2aWdhdGUgZnJvbSB0aGUgamFyIGZpbGUgdG8gdGhlIHBhdGggZW50cnkuIFB1dCBkaWZmZXJlbnRseSwgdGhlCi0gICAgICBtYXhpbXVtIG51bWJlciBvZiAuLiB3aGljaCBpcyBhbGxvd2VkIGluIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlCi0gICAgICBqYXIgZmlsZSB0byBhIGdpdmVuIGNsYXNzIHBhdGggZW50cnkuIFNwZWNpZnkgMCB0byBlbmZvcmNlIGEgcGF0aAotICAgICAgZW50cnkgdG8gYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IChvciBvbmUgb2YgaXRzIHN1Yi1kaXJlY3RvcmllcykKLSAgICAgIGFzIHRoZSBqYXIgZmlsZSBpdHNlbGYuICBEZWZhdWx0cyB0byAyIGxldmVscy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYXhQYXJlbnRMZXZlbHM8L3RkPgorICAgIDx0ZD5UaGUgbWF4aW11bSBudW1iZXIgb2YgcGFyZW50IGRpcmVjdG9yaWVzIG9uZSBpcyBhbGxvd2VkIHRvIHRyYXZlcnNlIHRvIG5hdmlnYXRlIGZyb20gdGhlIGphcgorICAgICAgZmlsZSB0byB0aGUgcGF0aCBlbnRyeS4gUHV0IGRpZmZlcmVudGx5LCB0aGUgbWF4aW11bSBudW1iZXIgb2YgPHE+Li48L3E+IHdoaWNoIGlzIGFsbG93ZWQgaW4KKyAgICAgIHRoZSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGphciBmaWxlIHRvIGEgZ2l2ZW4gY2xhc3MgcGF0aCBlbnRyeS4gU3BlY2lmeSA8cT4wPC9xPiB0byBlbmZvcmNlIGEKKyAgICAgIHBhdGggZW50cnkgdG8gYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IChvciBvbmUgb2YgaXRzIHN1Yi1kaXJlY3RvcmllcykgYXMgdGhlIGphciBmaWxlCisgICAgICBpdHNlbGYuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjI8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PmNsYXNzcGF0aDwvaDQ+Ci08cD5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UGF0aC1saWtlPC9hPiBlbGVtZW50LCB3aGljaCBjYW4gYmUKLWRlZmluZWQgaW4tcGxhY2UsIG9yIHJlZmVyIHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZSB1c2luZyB0aGUKLTxjb2RlPiZsdDtjbGFzc3BhdGggcmVmaWQ9IjxlbT5wYXRoaWQ8L2VtPiIgLyZndDs8L2NvZGU+IHN5bnRheC4KKzxwPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2U8L2E+IGVsZW1lbnQsIHdoaWNoIGNhbiBiZSBkZWZpbmVkIGluLXBsYWNlLCBvciByZWZlciB0bworYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlIHVzaW5nIHRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoIHJlZmlkPSZxdW90O3BhdGhpZCZxdW90Oy8mZ3Q7PC9jb2RlPiBzeW50YXguCiBUaGlzIGNsYXNzcGF0aCBtdXN0IG5vdCBiZSBlbXB0eSwgYW5kIGlzIHJlcXVpcmVkLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxkaXYgaWQ9ImV4YW1wbGUxIj4KLSAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7bWFuaWZlc3RjbGFzc3BhdGggcHJvcGVydHk9Imphci5jbGFzc3BhdGgiCi0gICAgICAgICAgICAgICAgICAgICAgIGphcmZpbGU9ImJ1aWxkL2FjbWUuamFyIiZndDsKLSAgICAgICZsdDtjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aCIgLyZndDsKLSAgICAmbHQ7L21hbmlmZXN0Y2xhc3NwYXRoJmd0OwotICA8L3ByZT48L2Jsb2NrcXVvdGU+Ci0gIDxwPkFzc3VtaW5nIGEgcGF0aCBvZiBpZCAiY2xhc3NwYXRoIiB3YXMgYWxyZWFkeSBkZWZpbmVkLCBjb252ZXJ0IHRoaXMKLSAgcGF0aCByZWxhdGl2ZWx5IHRvIHRoZSBidWlsZC8gZGlyZWN0b3J5IHRoYXQgd2lsbCBjb250YWluIGFjbWUuamFyLCB3aGljaAotICBjYW4gbGF0ZXIgYmUgY3JlYXRlZCB3aXRoIDxjb2RlPiZsdDtqYXImZ3Q7PC9jb2RlPiB3aXRoIGEgbmVzdGVkIAotICA8Y29kZT4mbHQ7bWFuaWZlc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IHRoYXQgbGlzdHMgYW4KLSAgPGNvZGU+Jmx0O2F0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iJHtqYXIuY2xhc3NwYXRofSIgLyZndDs8L2NvZGU+LgotICA8L3A+Ci08L2Rpdj4KIAorPHA+QXNzdW1pbmcgYSBwYXRoIHdpdGggPHZhcj5pZDwvdmFyPj08cT5jbGFzc3BhdGg8L3E+IHdhcyBhbHJlYWR5IGRlZmluZWQsIGNvbnZlcnQgdGhpcyBwYXRoCityZWxhdGl2ZWx5IHRvIHRoZSA8c2FtcD5idWlsZC88L3NhbXA+IGRpcmVjdG9yeSB0aGF0IHdpbGwgY29udGFpbiA8c2FtcD5hY21lLmphcjwvc2FtcD4sIHdoaWNoIGNhbgorbGF0ZXIgYmUgY3JlYXRlZCB3aXRoIDxjb2RlPiZsdDtqYXImZ3Q7PC9jb2RlPiB3aXRoIGEgbmVzdGVkIDxjb2RlPiZsdDttYW5pZmVzdCZndDs8L2NvZGU+IGVsZW1lbnQKK3RoYXQgbGlzdHMgYW4gPGNvZGU+Jmx0O2F0dHJpYnV0ZSBuYW1lPSJDbGFzcy1QYXRoIiB2YWx1ZT0iJHtqYXIuY2xhc3NwYXRofSIvJmd0OzwvY29kZT4uPC9wPgogCis8cHJlPgorJmx0O21hbmlmZXN0Y2xhc3NwYXRoIHByb3BlcnR5PSJqYXIuY2xhc3NwYXRoIgorICAgICAgICAgICAgICAgICAgIGphcmZpbGU9ImJ1aWxkL2FjbWUuamFyIiZndDsKKyAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLyZndDsKKyZsdDsvbWFuaWZlc3RjbGFzc3BhdGgmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9taW1lbWFpbC5odG1sIGIvbWFudWFsL1Rhc2tzL21pbWVtYWlsLmh0bWwKaW5kZXggNTE4ODI3My4uM2JkNmI5OCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL21pbWVtYWlsLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL21pbWVtYWlsLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDYgKzE1LDEwMiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TWltZU1haWwgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ibWltZW1haWwiPk1pbWVNYWlsPC9hPjwvaDI+Cis8aDIgaWQ9Im1pbWVtYWlsIj5NaW1lTWFpbDwvaDI+CiAKLTxoMz48aT5EZXByZWNhdGVkPC9pPjwvaDM+Ci08cD48aT5UaGlzIHRhc2sgaGFzIGJlZW4gZGVwcmVjYXRlZC4gIFVzZSB0aGUgPGEgaHJlZj0iLi4vVGFza3MvbWFpbC5odG1sIj5tYWlsPC9hPiB0YXNrIGluc3RlYWQuPC9pPjwvcD4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+VGhpcyB0YXNrIGhhcyBiZWVuIDx1PmRlcHJlY2F0ZWQ8L3U+LiAgVXNlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9tYWlsLmh0bWwiPm1haWw8L2E+IHRhc2sgaW5zdGVhZC48L2VtPjwvcD4KIAogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlNlbmRzIFNNVFAgbWFpbCB3aXRoIE1JTUUgYXR0YWNobWVudHMuCi08YSBocmVmPSJodHRwczovL2phdmFlZS5naXRodWIuaW8vamF2YW1haWwvIj5KYXZhTWFpbDwvYT4KLWFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamF2YWVlL2FjdGl2YXRpb24iPkphdmEKLUFjdGl2YXRpb24gRnJhbWV3b3JrPC9hPiBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgdGFzay4gVGhlIEphdmEKKzxwPlNlbmRzIFNNVFAgbWFpbCB3aXRoIE1JTUUKK2F0dGFjaG1lbnRzLiAgPGEgaHJlZj0iaHR0cHM6Ly9lY2xpcHNlLWVlNGouZ2l0aHViLmlvL21haWwvIgordGFyZ2V0PSJfdG9wIj5KYWthcnRhIE1haWw8L2E+CithbmQgPGEgaHJlZj0iaHR0cHM6Ly9lY2xpcHNlLWVlNGouZ2l0aHViLmlvL2phZi8iIHRhcmdldD0iX3RvcCI+SmFrYXJ0YQorQWN0aXZhdGlvbjwvYT4gYXJlIHJlcXVpcmVkIGZvciB0aGlzIHRhc2suIFRoZSBKYXZhCiBBY3RpdmF0aW9uIEZyYW1ld29yayBpcyBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBjbGFzcyBsaWJyYXJ5IGZvciBKYXZhIDYKIHRvIEphdmEgMTAgYnV0IHRoZSA8Y29kZT5qYXZhLmFjdGl2YXRpb248L2NvZGU+IG1vZHVsZSBoYXMgYmVlbgogZGVwcmVjYXRlZCBpbiBKYXZhIDkgYW5kIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5IHdoZW4gcnVubmluZyBvbgotSmF2YSAxMC4gQWx0ZXJuYXRpdmVseSBpdCBjYW4gYmUgcHJvdmlkZWQgYXMgYW4gZXh0ZXJuYWwgbGlicmFyeS48L3A+CitKYXZhIDEwLiBBbHRlcm5hdGl2ZWx5IGl0IGNhbiBiZSBwcm92aWRlZCBhcyBhbiBleHRlcm5hbAorbGlicmFyeS4gSmF2YW1haWwgaGFzIGJlY29tZSBKYWthcnRhIE1haWwgYW5kIHRoZSBKYXZhIGFjdGl2YXRpb24KK0ZyYW1ld29yayBoYXMgYmVjb21lIEpha2FydGEgQWN0aXZhdGlvbiBhbmQgYm90aCBhcmUgcGFydCBvZiB0aGUKK0pha2FydGEgZWZmb3J0IGF0IEVjbGlwc2UuPC9wPgogPHA+TXVsdGlwbGUgZmlsZXMgY2FuIGJlIGF0dGFjaGVkIHVzaW5nIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldHMuPC9hPjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWVzc2FnZSBib2R5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPk5vLCBidXQgb25seSBvbmUgb2Ygb2YgJ21lc3NhZ2UnIG9yCi0gICAgICAnbWVzc2FnZUZpbGUnIG1heSBiZSBzcGVjaWZpZWQuJm5ic3A7IElmIG5vdCBzcGVjaWZpZWQsIGEgZmlsZXNldCBtdXN0IGJlCi0gICAgICBwcm92aWRlZC48L3RkPgorICAgIDx0ZD5tZXNzYWdlPC90ZD4KKyAgICA8dGQ+VGhlIG1lc3NhZ2UgYm9keTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZXNlLCBvciBhIG5lc3RlZCBmaWxlc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWVzc2FnZUZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlbmFtZSB0byByZWFkIGFuZCB1c2VkIGFzIHRoZSBtZXNzYWdlIGJvZHk8L3RkPgorICAgIDx0ZD5tZXNzYWdlRmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5BIGZpbGVuYW1lIHRvIHJlYWQgYW5kIHVzZWQgYXMgdGhlIG1lc3NhZ2UgYm9keTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1lc3NhZ2VNaW1lVHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5NSU1FIHR5cGUgdG8gdXNlIGZvciAnbWVzc2FnZScgb3IgJ21lc3NhZ2VGaWxlJyB3aGVuCi0gICAgICBhdHRhY2hlZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvICJ0ZXh0L3BsYWluIjwvdGQ+CisgICAgPHRkPm1lc3NhZ2VNaW1lVHlwZTwvdGQ+CisgICAgPHRkPk1JTUUgdHlwZSB0byB1c2UgZm9yIDx2YXI+bWVzc2FnZTwvdmFyPiBvciA8dmFyPm1lc3NhZ2VGaWxlPC92YXI+IHdoZW4gYXR0YWNoZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRleHQvcGxhaW48L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9saXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIFRvOiByZWNpcGllbnRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjMiPlllcywgYXQgbGVhc3Qgb25lIG9mICd0b2xpc3QnLCAnY2NsaXN0JywKLSAgICAgIG9yICdiY2NsaXN0JyBtdXN0IGJlIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD50b2xpc3Q8L3RkPgorICAgIDx0ZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8Y29kZT5Ubzo8L2NvZGU+IHJlY2lwaWVudHM8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIzIj5ZZXMsIGF0IGxlYXN0IG9uZSBvZiB0aGVzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNjbGlzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBDQzogcmVjaXBpZW50czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4mbmJzcDs8L3RkPgorICAgIDx0ZD5jY2xpc3Q8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgPGNvZGU+Q0M6PC9jb2RlPiByZWNpcGllbnRzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmNjbGlzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBCQ0M6IHJlY2lwaWVudHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Jm5ic3A7PC90ZD4KKyAgICA8dGQ+YmNjbGlzdDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8Y29kZT5CQ0M6PC9jb2RlPiByZWNpcGllbnRzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWFpbGhvc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SG9zdCBuYW1lIG9mIHRoZSBtYWlsIHNlcnZlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgdG8gJnF1b3Q7bG9jYWxob3N0JnF1b3Q7PC90ZD4KKyAgICA8dGQ+bWFpbGhvc3Q8L3RkPgorICAgIDx0ZD5Ib3N0IG5hbWUgb2YgdGhlIG1haWwgc2VydmVyLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IHRvIDxxPmxvY2FsaG9zdDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWJqZWN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVtYWlsIHN1YmplY3QgbGluZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdWJqZWN0PC90ZD4KKyAgICA8dGQ+RW1haWwgc3ViamVjdCBsaW5lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZnJvbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5FbWFpbCBhZGRyZXNzIG9mIHNlbmRlci48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZnJvbTwvdGQ+CisgICAgPHRkPkVtYWlsIGFkZHJlc3Mgb2Ygc2VuZGVyLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIHNlbmRpbmcgdGhlCi0gICAgICBlLW1haWwuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IHRvICZxdW90O3RydWUmcXVvdDs8L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgYW4gZXJyb3Igb2NjdXJzIHNlbmRpbmcgdGhlIGUtbWFpbC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPlNlbmQgYSBzaW5nbGUgSFRNTCBmaWxlIGFzIHRoZSBib2R5IG9mIGEgbWVzc2FnZTwvYj48L3A+Ci08cHJlPiAgICAmbHQ7bWltZW1haWwgbWVzc2FnZU1pbWVUeXBlPSZxdW90O3RleHQvaHRtbCZxdW90OyBtZXNzYWdlRmlsZT0mcXVvdDtvdmVydmlldy1zdW1tYXJ5Lmh0bWwmcXVvdDsKLSAgICAgICAgdG9saXN0PSZxdW90O3lvdSZxdW90OyBzdWJqZWN0PSZxdW90O0pVbml0IFRlc3QgUmVzdWx0czogJHtUT0RBWX0mcXVvdDsgZnJvbT0mcXVvdDttZSZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD48Yj5TZW5kcyBhbGwgZmlsZXMgaW4gYSBkaXJlY3RvcnkgYXMgYXR0YWNobWVudHM8L2I+PC9wPgotPHByZT4gICAgJmx0O21pbWVtYWlsIG1lc3NhZ2U9JnF1b3Q7U2VlIGF0dGFjaGVkIGZpbGVzJnF1b3Q7IHRvbGlzdD0mcXVvdDt5b3UmcXVvdDsgc3ViamVjdD0mcXVvdDtBdHRhY2htZW50cyZxdW90OyBmcm9tPSZxdW90O21lJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7ZGlzdC8qLiomcXVvdDsvJmd0OwotICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICAgJmx0Oy9taW1lbWFpbCZndDsKLTwvcHJlPgorPHA+U2VuZCBhIHNpbmdsZSBIVE1MIGZpbGUgYXMgdGhlIGJvZHkgb2YgYSBtZXNzYWdlPC9wPgorPHByZT4KKyZsdDttaW1lbWFpbCBtZXNzYWdlTWltZVR5cGU9JnF1b3Q7dGV4dC9odG1sJnF1b3Q7IG1lc3NhZ2VGaWxlPSZxdW90O292ZXJ2aWV3LXN1bW1hcnkuaHRtbCZxdW90OworICAgICAgICAgIHRvbGlzdD0mcXVvdDt5b3UmcXVvdDsgc3ViamVjdD0mcXVvdDtKVW5pdCBUZXN0IFJlc3VsdHM6ICR7VE9EQVl9JnF1b3Q7IGZyb209JnF1b3Q7bWUmcXVvdDsvJmd0OzwvcHJlPgogCis8cD5TZW5kIGFsbCBmaWxlcyBpbiBhIGRpcmVjdG9yeSBhcyBhdHRhY2htZW50czwvcD4KKzxwcmU+CismbHQ7bWltZW1haWwgbWVzc2FnZT0mcXVvdDtTZWUgYXR0YWNoZWQgZmlsZXMmcXVvdDsgdG9saXN0PSZxdW90O3lvdSZxdW90OyBzdWJqZWN0PSZxdW90O0F0dGFjaG1lbnRzJnF1b3Q7IGZyb209JnF1b3Q7bWUmcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkaXN0LyouKiZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9taW1lbWFpbCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbWtkaXIuaHRtbCBiL21hbnVhbC9UYXNrcy9ta2Rpci5odG1sCmluZGV4IDVkOTQ1YzAuLjRkYzM4NjUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9ta2Rpci5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9ta2Rpci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzkgKzE1LDQwIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Na2RpciBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJta2RpciI+TWtkaXI8L2E+PC9oMj4KKzxoMiBpZD0ibWtkaXIiPk1rZGlyPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5DcmVhdGVzIGEgZGlyZWN0b3J5LiBBbHNvIG5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQsIHdoZW4KLW5lY2Vzc2FyeS4gRG9lcyBub3RoaW5nIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdC48L3A+Cis8cD5DcmVhdGVzIGEgZGlyZWN0b3J5LiBBbHNvIG5vbi1leGlzdGVudCBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQsIHdoZW4gbmVjZXNzYXJ5LiBEb2VzCitub3RoaW5nIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBjcmVhdGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+Jmx0O21rZGlyIGRpcj0mcXVvdDske2Rpc3R9JnF1b3Q7LyZndDs8L3ByZT4KLTxwPmNyZWF0ZXMgYSBkaXJlY3RvcnkgPGNvZGU+JHtkaXN0fTwvY29kZT4uPC9wPgotPHByZT4mbHQ7bWtkaXIgZGlyPSZxdW90OyR7ZGlzdH0vbGliJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmNyZWF0ZXMgYSBkaXJlY3RvcnkgPGNvZGU+JHtkaXN0fS9saWI8L2NvZGU+LjwvcD4KIAorPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+Q3JlYXRlIGEgZGlyZWN0b3J5IDxjb2RlPiR7ZGlzdH08L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O21rZGlyIGRpcj0mcXVvdDske2Rpc3R9JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+Q3JlYXRlIGEgZGlyZWN0b3J5IDxjb2RlPiR7ZGlzdH0vbGliPC9jb2RlPi48L3A+Cis8cHJlPiZsdDtta2RpciBkaXI9JnF1b3Q7JHtkaXN0fS9saWImcXVvdDsvJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbW92ZS5odG1sIGIvbWFudWFsL1Rhc2tzL21vdmUuaHRtbAppbmRleCBjNGY5MzFhLi5kOWJhZWZlIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvbW92ZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9tb3ZlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyNDUgKzE1LDIwMCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TW92ZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJtb3ZlIj5Nb3ZlPC9hPjwvaDI+Cis8aDIgaWQ9Im1vdmUiPk1vdmU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPk1vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3IgY29sbGVjdGlvbnMgb2YgZmlsZXMgdG8KLWEgbmV3IGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoZQotZGVzdGluYXRpb24gZmlsZSBpcyBvdmVyd3JpdHRlbiBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIFdoZW4gPHZhcj5vdmVyd3JpdGU8L3Zhcj4gaXMKLXR1cm5lZCBvZmYsIHRoZW4gZmlsZXMgYXJlIG9ubHkgbW92ZWQgaWYgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4KLXRoZSBkZXN0aW5hdGlvbiBmaWxlLCBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGRvZXMgbm90IGV4aXN0LjwvcD4KKzxwPk1vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3IgY29sbGVjdGlvbnMgb2YgZmlsZXMgdG8gYSBuZXcgZGlyZWN0b3J5LiAgQnkgZGVmYXVsdCwKK3RoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIGlmIGl0IGFscmVhZHkgZXhpc3RzLiAgV2hlbiA8dmFyPm92ZXJ3cml0ZTwvdmFyPiBpcyB0dXJuZWQgb2ZmLAordGhlbiBmaWxlcyBhcmUgb25seSBtb3ZlZCBpZiB0aGUgc291cmNlIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUKK2Rlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QgZXhpc3QuPC9wPgogCi08cD48YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZQotQ29sbGVjdGlvbjwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBhIGdyb3VwIG9mIGZpbGVzIHRvIG1vdmUuICBPbmx5Ci1maWxlIHN5c3RlbSBiYXNlZCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkLCB0aGlzIGluY2x1ZGVzIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+cywgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPmZpbGVsaXN0PC9hPiBhbmQgPGEKLWhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aDwvYT4uICBQcmlvciB0byBBcGFjaGUgQW50IDEuNyBvbmx5Ci08Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuIHN1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LgotVG8gdXNlIGEgcmVzb3VyY2UgY29sbGVjdGlvbiwgdGhlIDxjb2RlPnRvZGlyPC9jb2RlPiBhdHRyaWJ1dGUgbXVzdCBiZQotc2V0LjwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcmUgdXNlZCB0byBzZWxlY3QgYSBncm91cAorb2YgZmlsZXMgdG8gbW92ZS4gIE9ubHkgZmlsZSBzeXN0ZW0gYmFzZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgdGhpcworaW5jbHVkZXMgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPnMsIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPmZpbGVsaXN0PC9hPgorYW5kIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aDwvYT4uICBQcmlvciB0byBBcGFjaGUgQW50IDEuNworb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuIHN1cHBvcnRlZCBhcyBhIG5lc3RlZCBlbGVtZW50LiAgVG8gdXNlIGEgcmVzb3VyY2UKK2NvbGxlY3Rpb24sIHRoZSA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC48L3A+CiAKLTxwPjxiPlNpbmNlIEFudCAxLjYuMzwvYj4sIHRoZSA8aT5maWxlPC9pPiBhdHRyaWJ1dGUgbWF5IGJlIHVzZWQgdG8gbW92ZQotKHJlbmFtZSkgYW4gZW50aXJlIGRpcmVjdG9yeS4gIElmIDxpPnRvZmlsZTwvaT4gZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLCBvcgotdGhlcmUgaXMgYSBkaXJlY3RvcnkgYnkgdGhlIHNhbWUgbmFtZSBpbiA8aT50b2RpcjwvaT4sIHRoZSBhY3Rpb24gd2lsbCBmYWlsLgotPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+LCB0aGUgPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZSBtYXkgYmUgdXNlZCB0byBtb3ZlIChyZW5hbWUpIGFuIGVudGlyZQorZGlyZWN0b3J5LiAgSWYgPHZhcj50b2ZpbGU8L3Zhcj4gZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLCBvciB0aGVyZSBpcyBhIGRpcmVjdG9yeSBieSB0aGUgc2FtZSBuYW1lCitpbiA8dmFyPnRvZGlyPC92YXI+LCB0aGUgYWN0aW9uIHdpbGwgZmFpbC48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIG1vdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+T25lIG9mIDx2YXI+ZmlsZTwvdmFyPiBvcgotICAgICBhdCBsZWFzdCBvbmUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gZWxlbWVudDwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD50aGUgZmlsZSBvciBkaXJlY3RvcnkgdG8gbW92ZTwvdGQ+CisgICAgPHRkPk9uZSBvZiA8dmFyPmZpbGU8L3Zhcj4gb3IgYXQgbGVhc3Qgb25lIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWxhc3Rtb2RpZmllZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5HaXZlIHRoZSBtb3ZlZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkCi0gICAgICB0aW1lIGFzIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuCi0gICAgICAoPGVtPk5vdGU8L2VtPjogSWdub3JlZCBvbiBKYXZhIDEuMSk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KKyAgICA8dGQ+R2l2ZSB0aGUgbW92ZWQgZmlsZXMgdGhlIHNhbWUgbGFzdCBtb2RpZmllZCB0aW1lIGFzIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuCisgICAgICAoPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJZ25vcmVkIG9uIEphdmEgMS4xKTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdG8gbW92ZSB0bzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5XaXRoIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlLAotICAgIGVpdGhlciA8dmFyPnRvZmlsZTwvdmFyPiBvciA8dmFyPnRvZGlyPC92YXI+IGNhbiBiZSB1c2VkLiAgV2l0aCBuZXN0ZWQgZmlsZXNldHMsCi0gICAgaWYgdGhlIGZpbGVzZXQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMSBvciBpZiB0aGUgb25seSBlbnRyeSBpbiB0aGUgZmlsZXNldCBpcyBhCi0gICAgZGlyZWN0b3J5IG9yIGlmIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIGFscmVhZHkgc3BlY2lmaWVkLCBvbmx5Ci0gICAgPHZhcj50b2RpcjwvdmFyPiBpcyBhbGxvd2VkPC90ZD4KKyAgICA8dGQ+dG9maWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdG8gbW92ZSB0bzwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPldpdGggdGhlIDx2YXI+ZmlsZTwvdmFyPiBhdHRyaWJ1dGUsIGVpdGhlciA8dmFyPnRvZmlsZTwvdmFyPiBvciA8dmFyPnRvZGlyPC92YXI+CisgICAgICBjYW4gYmUgdXNlZC4gIFdpdGggbmVzdGVkIGZpbGVzZXRzLCBpZiB0aGUgZmlsZXNldCBzaXplIGlzIGdyZWF0ZXIgdGhhbiAxIG9yIGlmIHRoZSBvbmx5IGVudHJ5CisgICAgICBpbiB0aGUgZmlsZXNldCBpcyBhIGRpcmVjdG9yeSBvciBpZiB0aGUgPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZCwKKyAgICAgIG9ubHkgPHZhcj50b2RpcjwvdmFyPiBpcyBhbGxvd2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSB0byBtb3ZlIHRvPC90ZD4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGRpcmVjdG9yeSB0byBtb3ZlIHRvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3ZlcndyaXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBldmVuIGlmIHRoZSBkZXN0aW5hdGlvbgotICAgICAgZmlsZXMgYXJlIG5ld2VyIChkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDspPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGVzIGFyZSBuZXdlcjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24KLSAgICAgIGZpbGVzLiAgPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgPHRkPk92ZXJ3cml0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24gZmlsZXMuICA8ZW0+c2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsdGVyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcKLSAgICAgIHRoZSBtb3ZlLiAgU2VlIHRoZSA8YSBocmVmPSJmaWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrIGZvciBhIGRlc2NyaXB0aW9uIG9mCi0gICAgICBob3cgZmlsdGVycyB3b3JrLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZpbHRlcmluZzwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIHRva2VuIGZpbHRlcmluZyBzaG91bGQgdGFrZSBwbGFjZSBkdXJpbmcgdGhlIG1vdmUuICBTZWUKKyAgICAgIHRoZSA8YSBocmVmPSJmaWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrIGZvciBhIGRlc2NyaXB0aW9uIG9mIGhvdyBmaWx0ZXJzIHdvcmsuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mbGF0dGVuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZSBkaXJlY3Rvcnkgc3RydWN0dXJlIG9mIHNvdXJjZSBkaXJlY3RvcnksCi0gICAgICBjb3B5IGFsbCBmaWxlcyBpbnRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgc3BlY2lmaWVkIGJ5IHRoZSA8dmFyPnRvZGlyPC92YXI+Ci0gICAgICBhdHRyaWJ1dGUgKGRlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDspLk5vdGUgdGhhdCB5b3UgY2FuIGFjaGlldmUgdGhlCi0gICAgICBzYW1lIGVmZmVjdCBieSB1c2luZyBhIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2ZsYXR0ZW4tbWFwcGVyIj5mbGF0dGVuIG1hcHBlcjwvYT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mbGF0dGVuPC90ZD4KKyAgICA8dGQ+aWdub3JlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2Ygc291cmNlIGRpcmVjdG9yeSwgY29weSBhbGwgZmlsZXMgaW50byBhIHNpbmdsZSBkaXJlY3RvcnksCisgICAgICBzcGVjaWZpZWQgYnkgdGhlIDx2YXI+dG9kaXI8L3Zhcj4gYXR0cmlidXRlLiBOb3RlIHRoYXQgeW91IGNhbiBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCBieQorICAgICAgdXNpbmcgYSA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNmbGF0dGVuLW1hcHBlciI+ZmxhdHRlbiBtYXBwZXI8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVFbXB0eURpcnM8L3RkPgotCSA8dGQgdmFsaWduPSJ0b3AiPkNvcHkgZW1wdHkgZGlyZWN0b3JpZXMgaW5jbHVkZWQgd2l0aCB0aGUgbmVzdGVkIEZpbGVTZXQocykuCi0JICAgRGVmYXVsdHMgdG8gJnF1b3Q7eWVzJnF1b3Q7LjwvdGQ+Ci0JIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlRW1wdHlEaXJzPC90ZD4KKyAgICA8dGQ+Q29weSBlbXB0eSBkaXJlY3RvcmllcyBpbmNsdWRlZCB3aXRoIHRoZSBuZXN0ZWQgRmlsZVNldChzKS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5JZiBmYWxzZSwgbG9nIGEgd2FybmluZyBtZXNzYWdlLCBidXQgZG8gbm90IHN0b3AgdGhlCi0gICAgICAgYnVpbGQsIHdoZW4gdGhlIGZpbGUgdG8gY29weSBkb2VzIG5vdCBleGlzdCBvciBvbmUgb2YgdGhlIG5lc3RlZAotICAgICAgIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgYW4gZXJyb3Igb2NjdXJzCi0gICAgICAgd2hpbGUgbW92aW5nLgotICAgICA8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+SWYgZmFsc2UsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZSBidWlsZCwgd2hlbiB0aGUgZmlsZSB0byBjb3B5IGRvZXMgbm90CisgICAgICBleGlzdCBvciBvbmUgb2YgdGhlIG5lc3RlZCBmaWxlc2V0cyBwb2ludHMgdG8gYSBkaXJlY3RvcnkgdGhhdCBkb2Vzbid0IGV4aXN0IG9yIGFuIGVycm9yCisgICAgICBvY2N1cnMgd2hpbGUgbW92aW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdHJ1ZSBhbmQgZmFpbG9uZXJyb3IgaXMgZmFsc2UsIHRoZW4gZG8gbm90IGxvZyBhCi0gICAgICAgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIGZpbGUgdG8gY29weSBkb2VzIG5vdCBleGlzdCBvciBvbmUgb2YgdGhlIG5lc3RlZAotICAgICAgIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgYW4gZXJyb3Igb2NjdXJzCi0gICAgICAgd2hpbGUgY29weWluZy4gPGVtPnNpbmNlIEFudCAxLjguMzwvZW0+LgotICAgICA8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5xdWlldDwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+IGFuZCA8dmFyPmZhaWxvbmVycm9yPC92YXI+IGlzIDxxPmZhbHNlPC9xPiwgdGhlbiBkbyBub3QgbG9nIGEgd2FybmluZyBtZXNzYWdlCisgICAgICB3aGVuIHRoZSBmaWxlIHRvIGNvcHkgZG9lcyBub3QgZXhpc3Qgb3Igb25lIG9mIHRoZSBuZXN0ZWQgZmlsZXNldHMgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRoYXQKKyAgICAgIGRvZXNuJ3QgZXhpc3Qgb3IgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNvcHlpbmcuIDxlbT5zaW5jZSBBbnQgMS44LjM8L2VtPi48L3RkPgorICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPkxvZyB0aGUgZmlsZXMgdGhhdCBhcmUgYmVpbmcgbW92ZWQuPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgPHRkPkxvZyB0aGUgZmlsZXMgdGhhdCBhcmUgYmVpbmcgbW92ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyB0byBhc3N1bWUgd2hlbiBmaWx0ZXItY29weWluZyB0aGUKLSAgICBmaWxlcy4gPGVtPnNpbmNlIEFudCAxLjU8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2RpbmcgdG8gYXNzdW1lIHdoZW4gZmlsdGVyLWNvcHlpbmcgdGhlIGZpbGVzLiA8ZW0+c2luY2UgQW50IDEuNTwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRlbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gd3JpdGluZyB0aGUgZmlsZXMuCi0gICAgPGVtPnNpbmNlIEFudCAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZW5jb2RpbmcKLSAgICBhdHRyaWJ1dGUgaWYgZ2l2ZW4gb3IgdGhlIGRlZmF1bHQgSlZNIGVuY29kaW5nIG90aGVyd2lzZS48L3RkPgorICAgIDx0ZD5vdXRwdXRlbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyB0byB1c2Ugd2hlbiB3cml0aW5nIHRoZSBmaWxlcy4gIDxlbT5zaW5jZSBBbnQgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gaWYgc2V0IG9yIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZyBvdGhlcndpc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmFibGVtdWx0aXBsZW1hcHBpbmdzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgSWYgdHJ1ZSB0aGUgdGFzayB3aWxsIHByb2Nlc3MgdG8gYWxsIHRoZSBtYXBwaW5ncyBmb3IgYQotICAgICAgZ2l2ZW4gc291cmNlIHBhdGguIElmIGZhbHNlIHRoZSB0YXNrIHdpbGwgb25seSBwcm9jZXNzCi0gICAgICB0aGUgZmlyc3QgZmlsZSBvciBkaXJlY3RvcnkuIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgcmVsZXZhbnQKLSAgICAgIGlmIHRoZXJlIGlzIGEgbWFwcGVyIHN1YmVsZW1lbnQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+ZW5hYmxlbXVsdGlwbGVtYXBwaW5nczwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+IHRoZSB0YXNrIHdpbGwgcHJvY2VzcyB0byBhbGwgdGhlIG1hcHBpbmdzIGZvciBhIGdpdmVuIHNvdXJjZQorICAgICAgcGF0aC4gSWYgPHE+ZmFsc2U8L3E+IHRoZSB0YXNrIHdpbGwgb25seSBwcm9jZXNzIHRoZSBmaXJzdCBmaWxlIG9yIGRpcmVjdG9yeS4gVGhpcyBhdHRyaWJ1dGUKKyAgICAgIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlcmUgaXMgYSA8Y29kZT5tYXBwZXI8L2NvZGU+IHN1YmVsZW1lbnQuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUKLSAgICBkZWNpZGluZyBhIGZpbGUgaXMgb3V0IG9mIGRhdGUuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5Ci0gICAgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKLSAgICBtaWxsaXNlY29uZCBsZXZlbC4gRGVmYXVsdCBpcyAwIG1pbGxpc2Vjb25kcywgb3IgMiBzZWNvbmRzIG9uIERPUwotICAgIHN5c3RlbXMuICBUaGlzIGNhbiBhbHNvIGJlIHVzZWZ1bCBpZiBzb3VyY2UgYW5kIHRhcmdldCBmaWxlcyBsaXZlCi0gICAgb24gc2VwYXJhdGUgbWFjaGluZXMgd2l0aCBjbG9ja3MgYmVpbmcgb3V0IG9mIHN5bmMuICA8ZW0+c2luY2UgQW50Ci0gICAgMS42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Z3JhbnVsYXJpdHk8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzCisgICAgICBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgbGl2ZSBvbiBzZXBhcmF0ZQorICAgICAgbWFjaGluZXMgd2l0aCBjbG9ja3MgYmVpbmcgb3V0IG9mIHN5bmMuICA8ZW0+c2luY2UgQW50IDEuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wZXJmb3JtR0NPbkZhaWxlZERlbGV0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIElmIEFudCBmYWlscyB0byBkZWxldGUgYSBmaWxlIG9yIGRpcmVjdG9yeSBpdCB3aWxsIHJldHJ5IHRoZQotICAgICAgb3BlcmF0aW9uIG9uY2UuICBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgaXQgd2lsbCBwZXJmb3JtIGEKLSAgICAgIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWZvcmUgcmV0cnlpbmcgdGhlIGRlbGV0ZS48YnIvPgotICAgICAgU2V0dGluZyB0aGlzIGZsYWcgdG8gdHJ1ZSBpcyBrbm93biB0byByZXNvbHZlIHNvbWUgcHJvYmxlbXMgb24KLSAgICAgIFdpbmRvd3MgKHdoZXJlIGl0IGRlZmF1bHRzIHRvIHRydWUpIGJ1dCBhbHNvIGZvciBkaXJlY3RvcnkgdHJlZXMKLSAgICAgIHJlc2lkaW5nIG9uIGFuIE5GUyBzaGFyZS4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjM8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7IG9uCi0gICAgICBXaW5kb3dzIGFuZCAmcXVvdDt0cnVlJnF1b3Q7IG9uIGFueSBvdGhlciBPUy48L3RkPgorICAgIDx0ZD5wZXJmb3JtR0NPbkZhaWxlZERlbGV0ZTwvdGQ+CisgICAgPHRkPklmIEFudCBmYWlscyB0byBkZWxldGUgYSBmaWxlIG9yIGRpcmVjdG9yeSBpdCB3aWxsIHJldHJ5IHRoZSBvcGVyYXRpb24gb25jZS4gIElmIHRoaXMgZmxhZworICAgICAgaXMgc2V0IHRvIDxxPnRydWU8L3E+IGl0IHdpbGwgcGVyZm9ybSBhIGdhcmJhZ2UgY29sbGVjdGlvbiBiZWZvcmUgcmV0cnlpbmcgdGhlIGRlbGV0ZS48YnIvPgorICAgICAgU2V0dGluZyB0aGlzIGZsYWcgdG8gPHE+dHJ1ZTwvcT4gaXMga25vd24gdG8gcmVzb2x2ZSBzb21lIHByb2JsZW1zIG9uIFdpbmRvd3MgKHdoZXJlIGl0CisgICAgICBkZWZhdWx0cyB0byA8cT50cnVlPC9xPikgYnV0IGFsc28gZm9yIGRpcmVjdG9yeSB0cmVlcyByZXNpZGluZyBvbiBhbiBORlMgc2hhcmUuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+IG9uIFdpbmRvd3MgYW5kIDxxPmZhbHNlPC9xPiBvbiBhbnkgb3RoZXIgT1M8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0Pm1hcHBlcjwvaDQ+Ci08cD5Zb3UgY2FuIGRlZmluZSBmaWxlIG5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhCi1ocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUgZGVmYXVsdCBtYXBwZXIgdXNlZCBieQotPGNvZGU+Jmx0O21vdmUmZ3Q7PC9jb2RlPiBpcyB0aGUgPGEKLWhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2lkZW50aXR5LW1hcHBlciI+aWRlbnRpdHk8L2E+LjwvcD4KLTxwPk5vdGUgdGhhdCB0aGUgc291cmNlIG5hbWUgaGFuZGVkIHRvIHRoZSBtYXBwZXIgZGVwZW5kcyBvbiB0aGUKLXJlc291cmNlIGNvbGxlY3Rpb24geW91IHVzZS4gIElmIHlvdSB1c2UgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgotb3IgYW55IG90aGVyIGNvbGxlY3Rpb24gdGhhdCBwcm92aWRlcyBhIGJhc2UgZGlyZWN0b3J5LCB0aGUgbmFtZQotcGFzc2VkIHRvIHRoZSBtYXBwZXIgd2lsbCBiZSBhIHJlbGF0aXZlIGZpbGVuYW1lLCByZWxhdGl2ZSB0byB0aGUgYmFzZQotZGlyZWN0b3J5LiAgSW4gYW55IG90aGVyIGNhc2UgdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2Ugd2lsbAotYmUgdXNlZC48L3A+Cis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlIG5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUgZGVmYXVsdCBtYXBwZXIgdXNlZAorYnkgPGNvZGU+Jmx0O21vdmUmZ3Q7PC9jb2RlPiBpcyB0aGUgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eTwvYT4uPC9wPgorPHA+Tm90ZSB0aGF0IHRoZSBzb3VyY2UgbmFtZSBoYW5kZWQgdG8gdGhlIG1hcHBlciBkZXBlbmRzIG9uIHRoZSByZXNvdXJjZSBjb2xsZWN0aW9uIHlvdSB1c2UuICBJZgoreW91IHVzZSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IG9yIGFueSBvdGhlciBjb2xsZWN0aW9uIHRoYXQgcHJvdmlkZXMgYSBiYXNlIGRpcmVjdG9yeSwgdGhlCituYW1lIHBhc3NlZCB0byB0aGUgbWFwcGVyIHdpbGwgYmUgYSByZWxhdGl2ZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIGJhc2UgZGlyZWN0b3J5LiAgSW4gYW55IG90aGVyCitjYXNlIHRoZSBhYnNvbHV0ZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIHdpbGwgYmUgdXNlZC48L3A+CiA8aDQ+ZmlsdGVyY2hhaW48L2g0PgotPHA+VGhlIE1vdmUgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+Ci1GaWx0ZXJDaGFpbjwvYT5zLjwvcD4KLQotPHA+Ci1JZiA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSB1c2VkIGluc2lkZSB0aGUKLXNhbWUgPGNvZGU+Jmx0O21vdmUmZ3Q7PC9jb2RlPiB0YXNrLCBhbGwgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZCBmaXJzdAotZm9sbG93ZWQgYnkgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgotPC9wPgorPHA+VGhlIE1vdmUgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+RmlsdGVyQ2hhaW48L2E+cy48L3A+Cis8cD5JZiA8Y29kZT4mbHQ7ZmlsdGVyc2V0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSB1c2VkIGluc2lkZQordGhlIHNhbWUgPGNvZGU+Jmx0O21vdmUmZ3Q7PC9jb2RlPiB0YXNrLCBhbGwgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgYXJlIHByb2Nlc3NlZAorZmlyc3QgZm9sbG93ZWQgYnkgPGNvZGU+Jmx0O2ZpbHRlcnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPjxiPk1vdmUgYSBzaW5nbGUgZmlsZSAocmVuYW1lIGEgZmlsZSk8L2I+PC9wPgotPHByZT4KLSAgJmx0O21vdmUgZmlsZT0mcXVvdDtmaWxlLm9yaWcmcXVvdDsgdG9maWxlPSZxdW90O2ZpbGUubW92ZWQmcXVvdDsvJmd0OwotPC9wcmU+Ci08cD48Yj5Nb3ZlIGEgc2luZ2xlIGZpbGUgdG8gYSBkaXJlY3Rvcnk8L2I+PC9wPgotPHByZT4KLSAgJmx0O21vdmUgZmlsZT0mcXVvdDtmaWxlLm9yaWcmcXVvdDsgdG9kaXI9JnF1b3Q7ZGlyL3RvL21vdmUvdG8mcXVvdDsvJmd0OwotPC9wcmU+Ci08cD48Yj5Nb3ZlIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRpcmVjdG9yeTwvYj48L3A+Ci08cHJlPgotICAmbHQ7bW92ZSB0b2Rpcj0mcXVvdDtuZXcvZGlyL3RvL21vdmUvdG8mcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYy9kaXImcXVvdDsvJmd0OwotICAmbHQ7L21vdmUmZ3Q7Ci08L3ByZT4KLSAgPGk+b3IsIHNpbmNlIEFudCAxLjYuMzo8L2k+Ci08cHJlPgotICAmbHQ7bW92ZSBmaWxlPSZxdW90O3NyYy9kaXImcXVvdDsgdG9maWxlPSZxdW90O25ldy9kaXIvdG8vbW92ZS90byZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPjxiPk1vdmUgYSBzZXQgb2YgZmlsZXMgdG8gYSBuZXcgZGlyZWN0b3J5PC9iPjwvcD4KLTxwcmU+Ci0gICZsdDttb3ZlIHRvZGlyPSZxdW90O3NvbWUvbmV3L2RpciZxdW90OyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7bXkvc3JjL2RpciZxdW90OyZndDsKLSAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXImcXVvdDsvJmd0OwotICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi9hbnQuamFyJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICZsdDsvbW92ZSZndDsKLTwvcHJlPgotPHA+PGI+TW92ZSBhIGxpc3Qgb2YgZmlsZXMgdG8gYSBuZXcgZGlyZWN0b3J5PC9iPjwvcD4KLTxwcmU+Ci0gICZsdDttb3ZlIHRvZGlyPSZxdW90O3NvbWUvbmV3L2RpciZxdW90OyZndDsKLSAgICAmbHQ7ZmlsZWxpc3QgZGlyPSZxdW90O215L3NyYy9kaXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsZSBuYW1lPSJmaWxlMS50eHQiLyZndDsKLSAgICAgICZsdDtmaWxlIG5hbWU9ImZpbGUyLnR4dCIvJmd0OwotICAgICZsdDsvZmlsZWxpc3QmZ3Q7Ci0gICZsdDsvbW92ZSZndDsKLTwvcHJlPgotPHA+PGI+QXBwZW5kIDxjb2RlPiZxdW90Oy5iYWsmcXVvdDs8L2NvZGU+IHRvIHRoZSBuYW1lcyBvZiBhbGwgZmlsZXMKLWluIGEgZGlyZWN0b3J5LjwvYj48L3A+Ci08cHJlPgotICAmbHQ7bW92ZSB0b2Rpcj0mcXVvdDtteS9zcmMvZGlyJnF1b3Q7IGluY2x1ZGVlbXB0eWRpcnM9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O215L3NyYy9kaXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLyouYmFrJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICAgJmx0O21hcHBlciB0eXBlPSZxdW90O2dsb2ImcXVvdDsgZnJvbT0mcXVvdDsqJnF1b3Q7IHRvPSZxdW90OyouYmFrJnF1b3Q7LyZndDsKLSAgJmx0Oy9tb3ZlJmd0OwotPC9wcmU+Cis8cD5Nb3ZlIGEgc2luZ2xlIGZpbGUgKHJlbmFtZSBhIGZpbGUpPC9wPgorPHByZT4mbHQ7bW92ZSBmaWxlPSZxdW90O2ZpbGUub3JpZyZxdW90OyB0b2ZpbGU9JnF1b3Q7ZmlsZS5tb3ZlZCZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPk1vdmUgYSBzaW5nbGUgZmlsZSB0byBhIGRpcmVjdG9yeTwvcD4KKzxwcmU+Jmx0O21vdmUgZmlsZT0mcXVvdDtmaWxlLm9yaWcmcXVvdDsgdG9kaXI9JnF1b3Q7ZGlyL3RvL21vdmUvdG8mcXVvdDsvJmd0OzwvcHJlPgorCis8cD5Nb3ZlIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRpcmVjdG9yeTwvcD4KKzxwcmU+CismbHQ7bW92ZSB0b2Rpcj0mcXVvdDtuZXcvZGlyL3RvL21vdmUvdG8mcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMvZGlyJnF1b3Q7LyZndDsKKyZsdDsvbW92ZSZndDs8L3ByZT4KKzxwPm9yLCA8ZW0+c2luY2UgQW50IDEuNi4zPC9lbT46PC9wPgorPHByZT4mbHQ7bW92ZSBmaWxlPSZxdW90O3NyYy9kaXImcXVvdDsgdG9maWxlPSZxdW90O25ldy9kaXIvdG8vbW92ZS90byZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPk1vdmUgYSBzZXQgb2YgZmlsZXMgdG8gYSBuZXcgZGlyZWN0b3J5PC9wPgorPHByZT4KKyZsdDttb3ZlIHRvZGlyPSZxdW90O3NvbWUvbmV3L2RpciZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O215L3NyYy9kaXImcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CisgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi9hbnQuamFyJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9tb3ZlJmd0OzwvcHJlPgorCis8cD5Nb3ZlIGEgbGlzdCBvZiBmaWxlcyB0byBhIG5ldyBkaXJlY3Rvcnk8L3A+Cis8cHJlPgorJmx0O21vdmUgdG9kaXI9JnF1b3Q7c29tZS9uZXcvZGlyJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZWxpc3QgZGlyPSZxdW90O215L3NyYy9kaXImcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGUgbmFtZT0iZmlsZTEudHh0Ii8mZ3Q7CisgICAgJmx0O2ZpbGUgbmFtZT0iZmlsZTIudHh0Ii8mZ3Q7CisgICZsdDsvZmlsZWxpc3QmZ3Q7CismbHQ7L21vdmUmZ3Q7PC9wcmU+CisKKzxwPkFwcGVuZCA8Y29kZT4mcXVvdDsuYmFrJnF1b3Q7PC9jb2RlPiB0byB0aGUgbmFtZXMgb2YgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LjwvcD4KKzxwcmU+CismbHQ7bW92ZSB0b2Rpcj0mcXVvdDtteS9zcmMvZGlyJnF1b3Q7IGluY2x1ZGVlbXB0eWRpcnM9JnF1b3Q7ZmFsc2UmcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtteS9zcmMvZGlyJnF1b3Q7Jmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi5iYWsmcXVvdDsvJmd0OworICAmbHQ7L2ZpbGVzZXQmZ3Q7CisgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7KiZxdW90OyB0bz0mcXVvdDsqLmJhayZxdW90Oy8mZ3Q7CismbHQ7L21vdmUmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL25hdGl2ZTJhc2NpaS5odG1sIGIvbWFudWFsL1Rhc2tzL25hdGl2ZTJhc2NpaS5odG1sCmluZGV4IGVjYzA2NWEuLjE4Mzg1OGEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9uYXRpdmUyYXNjaWkuaHRtbAorKysgYi9tYW51YWwvVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMzYgKzE1LDExMiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgotICA8aGVhZD48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPk5hdGl2ZTJBc2NpaSBUYXNrPC90aXRsZT48L2hlYWQ+Cis8aHRtbCBsYW5nPSJlbiI+CisgIDxoZWFkPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CisgICAgPHRpdGxlPk5hdGl2ZTJBc2NpaSBUYXNrPC90aXRsZT4KKyAgPC9oZWFkPgogICA8Ym9keT4KICAgICA8aDI+TmF0aXZlMkFzY2lpPC9oMj4KIAotICAgIDxoMz5EZXNjcmlwdGlvbjo8L2gzPgorICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLSAgICA8cD4KLSAgICAgIENvbnZlcnRzIGZpbGVzIGZyb20gbmF0aXZlIGVuY29kaW5ncyB0byBBU0NJSSB3aXRoIGVzY2FwZWQgVW5pY29kZS4KLSAgICAgIEEgY29tbW9uIHVzYWdlIGlzIHRvIGNvbnZlcnQgc291cmNlIGZpbGVzIG1haW50YWluZWQgaW4gYSBuYXRpdmUKLSAgICAgIG9wZXJhdGluZyBzeXN0ZW0gZW5jb2RpbmcsIHRvIEFTQ0lJIHByaW9yIHRvIGNvbXBpbGF0aW9uLgotICAgIDwvcD4KKyAgICA8cD5Db252ZXJ0cyBmaWxlcyBmcm9tIG5hdGl2ZSBlbmNvZGluZ3MgdG8gQVNDSUkgd2l0aCBlc2NhcGVkIFVuaWNvZGUuICBBIGNvbW1vbiB1c2FnZSBpcyB0bworICAgICAgY29udmVydCBzb3VyY2UgZmlsZXMgbWFpbnRhaW5lZCBpbiBhIG5hdGl2ZSBvcGVyYXRpbmcgc3lzdGVtIGVuY29kaW5nLCB0byBBU0NJSSBwcmlvciB0bworICAgICAgY29tcGlsYXRpb24uPC9wPgogCi0gICAgPHA+Ci0gICAgICBGaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxlbT5zcmM8L2VtPgotICAgICAgYXJlIGNvbnZlcnRlZCBmcm9tIGEgbmF0aXZlIGVuY29kaW5nIHRvIEFTQ0lJLgotICAgICAgQnkgZGVmYXVsdCwgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgYXJlIGNvbnZlcnRlZC4KLSAgICAgIEhvd2V2ZXIsIGNvbnZlcnNpb24gbWF5IGJlIGxpbWl0ZWQgdG8gc2VsZWN0ZWQgZmlsZXMgdXNpbmcKLSAgICAgIDxlbT5pbmNsdWRlczwvZW0+IGFuZCA8ZW0+ZXhjbHVkZXM8L2VtPiBhdHRyaWJ1dGVzLgotICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZmlsZSBtYXRjaGluZyBwYXR0ZXJucywKLSAgICAgIHNlZSB0aGUgc2VjdGlvbiBvbgotICAgICAgPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LgotICAgICAgSWYgbm8gPGVtPmVuY29kaW5nPC9lbT4gaXMgc3BlY2lmaWVkLAotICAgICAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBKVk0gaXMgdXNlZC4KLSAgICAgIElmIDxlbT5leHQ8L2VtPiBpcyBzcGVjaWZpZWQsIHRoZW4gb3V0cHV0IGZpbGVzIGFyZSByZW5hbWVkCi0gICAgICB0byB1c2UgaXQgYXMgYSBuZXcgZXh0ZW5zaW9uLgotICAgICAgTW9yZSBzb3BoaXN0aWNhdGVkIGZpbGUgbmFtZSB0cmFuc2xhdGlvbnMgY2FuIGJlIGFjaGlldmVkIHVzaW5nIGEgbmVzdGVkCi0gICAgICA8ZW0+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9lbT4gZWxlbWVudC4gQnkgZGVmYXVsdCBhbgotICAgICAgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eSBtYXBwZXI8L2E+IHdpbGwgYmUgdXNlZC4KLSAgICAgIElmIDxlbT5kZXN0PC9lbT4gYW5kIDxlbT5zcmM8L2VtPiBwb2ludCB0byB0aGUgc2FtZSBkaXJlY3RvcnksCi0gICAgICB0aGUgPGVtPmV4dDwvZW0+IGF0dHJpYnV0ZSBvciBhIG5lc3RlZCA8ZW0+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9lbT4KLSAgICAgIGlzIHJlcXVpcmVkLgotICAgIDwvcD4KKyAgICA8cD5GaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDx2YXI+c3JjPC92YXI+IGFyZSBjb252ZXJ0ZWQgZnJvbSBhIG5hdGl2ZSBlbmNvZGluZyB0byBBU0NJSS4gIEJ5CisgICAgICBkZWZhdWx0LCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSBhcmUgY29udmVydGVkLiAgSG93ZXZlciwgY29udmVyc2lvbiBtYXkgYmUgbGltaXRlZCB0bworICAgICAgc2VsZWN0ZWQgZmlsZXMgdXNpbmcgPHZhcj5pbmNsdWRlczwvdmFyPiBhbmQgPHZhcj5leGNsdWRlczwvdmFyPiBhdHRyaWJ1dGVzLiAgRm9yIG1vcmUKKyAgICAgIGluZm9ybWF0aW9uIG9uIGZpbGUgbWF0Y2hpbmcgcGF0dGVybnMsIHNlZSB0aGUgc2VjdGlvbgorICAgICAgb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LiAgSWYKKyAgICAgIG5vIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIEpWTSBpcyB1c2VkLgorICAgICAgSWYgPHZhcj5leHQ8L3Zhcj4gaXMgc3BlY2lmaWVkLCB0aGVuIG91dHB1dCBmaWxlcyBhcmUgcmVuYW1lZCB0byB1c2UgaXQgYXMgYSBuZXcgZXh0ZW5zaW9uLgorICAgICAgTW9yZSBzb3BoaXN0aWNhdGVkIGZpbGUgbmFtZSB0cmFuc2xhdGlvbnMgY2FuIGJlIGFjaGlldmVkIHVzaW5nIGEKKyAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudC4gQnkgZGVmYXVsdAorICAgICAgYW4gPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eSBtYXBwZXI8L2E+IHdpbGwgYmUgdXNlZC4KKyAgICAgIElmIDx2YXI+ZGVzdDwvdmFyPiBhbmQgPHZhcj5zcmM8L3Zhcj4gcG9pbnQgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGUgPHZhcj5leHQ8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gaXMgcmVxdWlyZWQuPC9wPgogCi0gICAgPHA+Ci0gICAgICBUaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlIFNldDwvYT4sCi0gICAgICBhbmQgc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLSAgICAgICg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+c3JjPC9jb2RlPikgYXMgd2VsbCBhcworICAgIDxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LCBhbmQgc3VwcG9ydHMgbW9zdAorICAgICAgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8dmFyPmRpcjwvdmFyPiBiZWNvbWVzIDx2YXI+c3JjPC92YXI+KSBhcyB3ZWxsIGFzCiAgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiwKLSAgICAgIGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLgotICAgIDwvcD4KKyAgICAgIGFuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAotICAgIDxwPkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBkaWZmZXJlbnQgY29udmVydGVycy4gVGhpcyBjYW4gYmUgc2VsZWN0ZWQKLSAgICAgIHdpdGggdGhlIDxjb2RlPmltcGxlbWVudGF0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgb3IgYSBuZXN0ZWQgZWxlbWVudC4KLSAgICAgIDxhIG5hbWU9ImltcGxlbWVudGF0aW9udmFsdWVzIj5IZXJlIGFyZSB0aGUgY2hvaWNlcyBvZiB0aGUgYXR0cmlidXRlPC9hPjo8L3A+CisgICAgPHAgaWQ9ImltcGxlbWVudGF0aW9udmFsdWVzIj5JdCBpcyBwb3NzaWJsZSB0byB1c2UgZGlmZmVyZW50IGNvbnZlcnRlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkCisgICAgICB3aXRoIHRoZSA8dmFyPmltcGxlbWVudGF0aW9uPC92YXI+IGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBlbGVtZW50LiBIZXJlIGFyZSB0aGUgY2hvaWNlcyBvZiB0aGUKKyAgICAgIGF0dHJpYnV0ZTo8L3A+CiAgICAgPHVsPgotICAgICAgPGxpPmRlZmF1bHQgLSB0aGUgZGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBwbGF0Zm9ybSAtIGthZmZlZQotICAgICAgICB3aGVuIHJ1biBvbiBLYWZmZWUsIGJ1aWx0aW4gaWYgSkRLOSBvciBuZXdlciBpcyBkZXRlY3RlZCwgc3VuCi0gICAgICAgIG90aGVyd2lzZS48L2xpPgotICAgICAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbnZlcnRlciBvZiB0aGUgSkRLIDwgOSk8L2xpPgotICAgICAgPGxpPmthZmZlICh0aGUgc3RhbmRhcmQgY29udmVydGVyCi0gICAgICAgIG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cua2FmZmUub3JnIiB0YXJnZXQ9Il90b3AiPkthZmZlPC9hPik8L2xpPgotICAgICAgPGxpPmJ1aWx0aW4gLSBBbnQncyBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvcgotICAgICAgICBKREs5Ky4gPGVtPnNpbmNlIGFudCAxLjkuODwvZW0+PC9saT4KKyAgICAgIDxsaT48cT5kZWZhdWx0PC9xPiZtZGFzaDt0aGUgZGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBwbGF0Zm9ybToga2FmZmUgd2hlbiBydW4gb24gS2FmZmUsCisgICAgICAgIGJ1aWx0aW4gb3RoZXJ3aXNlLjwvbGk+CisgICAgICA8bGk+PHE+c3VuPC9xPiZtZGFzaDt1c2VkIHRvIGJlIHRoZSBzdGFuZGFyZCBjb252ZXJ0ZXIgb2YgdGhlIEpESyA4IG9yIGVhcmxpZXI8L2xpPgorICAgICAgPGxpPjxxPmthZmZlPC9xPiZtZGFzaDt0aGUgc3RhbmRhcmQgY29udmVydGVyIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYWZmZS9rYWZmZSIKKyAgICAgICAgdGFyZ2V0PSJfdG9wIj5LYWZmZTwvYT48L2xpPgorICAgICAgPGxpPjxxPmJ1aWx0aW48L3E+Jm1kYXNoO0FudCdzIGludGVybmFsIGltcGxlbWVudGF0aW9uLiA8ZW0+U2luY2UgQW50IDEuOS44PC9lbT48L2xpPgogICAgIDwvdWw+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgPHRkPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZD48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+CiAgICAgICAgIDx0ZD5yZXZlcnNlPC90ZD4KLSAgICAgICAgPHRkPlJldmVyc2UgdGhlIHNlbnNlIG9mIHRoZSBjb252ZXJzaW9uLAotICAgICAgICAgIGkuZS4gY29udmVydCBmcm9tIEFTQ0lJIHRvIG5hdGl2ZSA8Yj5vbmx5IHN1cHBvcnRlZCBieSB0aGUKLSAgICAgICAgICAgIHN1biBhbmQgYnVpbHRpbiBjb252ZXJ0ZXJzPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5SZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgY29udmVyc2lvbiwgaS5lLiBjb252ZXJ0IGZyb20gQVNDSUkgdG8gbmF0aXZlPGJyLz48c3Ryb25nPk9ubHkKKyAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIDxxPnN1bjwvcT4gYW5kIDxxPmJ1aWx0aW48L3E+IGNvbnZlcnRlcnM8L3N0cm9uZz48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KICAgICAgICAgPHRkPmVuY29kaW5nPC90ZD4KLSAgICAgICAgPHRkPlRoZSBuYXRpdmUgZW5jb2RpbmcgdGhlIGZpbGVzIGFyZSBpbgotICAgICAgICAgIChkZWZhdWx0IGlzIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgSlZNKTwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmF0aXZlIGVuY29kaW5nIHRoZSBmaWxlcyBhcmUgaW48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgogICAgICAgICA8dGQ+c3JjPC90ZD4KLSAgICAgICAgPHRkPlRoZSBkaXJlY3RvcnkgdG8gZmluZCBmaWxlcyBpbiAoZGVmYXVsdCBpcyA8ZW0+YmFzZWRpcjwvZW0+KTwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIGZpbmQgZmlsZXMgaW47IGRlZmF1bHQgaXMgPHZhcj5iYXNlZGlyPC92YXI+PC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+CiAgICAgICAgIDx0ZD5kZXN0PC90ZD4KICAgICAgICAgPHRkPlRoZSBkaXJlY3RvcnkgdG8gb3V0cHV0IGZpbGUgdG88L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgogICAgICAgICA8dGQ+ZXh0PC90ZD4KICAgICAgICAgPHRkPkZpbGUgZXh0ZW5zaW9uIHRvIHVzZSBpbiByZW5hbWluZyBvdXRwdXQgZmlsZXM8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAotICAgICAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLgotICAgICAgICAgIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KICAgICAgICAgPHRkPmluY2x1ZGVzPC90ZD4KLSAgICAgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KICAgICAgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgIDx0ZD50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+TmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+CiAgICAgICAgIDx0ZD5leGNsdWRlczwvdGQ+Ci0gICAgICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLgotICAgICAgICAgIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KICAgICAgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgICAgIDx0ZD50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+TmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aW1wbGVtZW50YXRpb248L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gdG8gdXNlLgotICAgICAgICAgIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlCi0gICAgICAgICAgY3VycmVudCBWTSB3aWxsIGJlIHVzZWQuICAoU2VlIHRoZSBhYm92ZSA8YQotICAgICAgICAgIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29udmVydGVycy4pPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgICAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+aW1wbGVtZW50YXRpb248L3RkPgorICAgICAgICA8dGQ+VGhlIGNvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuICAoU2VlIHRoZQorICAgICAgICAgIGFib3ZlIDxhIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29udmVydGVycy4pPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGN1cnJlbnQgSlZNPC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIApAQCAtMTUxLDEwMSArMTI4LDgzIEBACiAKIDxoND5hcmc8L2g0PgogCi08cD5Zb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29udmVydGVyCi13aXRoIG5lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyBhcmUKLXNwZWNpZmllZCBsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPgotYnV0IGhhdmUgYW4gYWRkaXRpb25hbCBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCB0byBlbmFibGUgYXJndW1lbnRzCi1vbmx5IGlmIGEgZ2l2ZW4gY29udmVydGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZC48L3A+Cis8cD5Zb3UgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY29udmVydGVyIHdpdGgKK25lc3RlZCA8Y29kZT4mbHQ7YXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cyBhcmUgc3BlY2lmaWVkCitsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPiBidXQgaGF2ZSBhbiBhZGRpdGlvbmFsIGF0dHJpYnV0ZSB0aGF0CitjYW4gYmUgdXNlZCB0byBlbmFibGUgYXJndW1lbnRzIG9ubHkgaWYgYSBnaXZlbiBjb252ZXJ0ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iNCI+U2VlCi0gICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iNCI+U2VlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgorICAgIDx0ZCByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxpbmU8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFyIj5saW5lPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJ2YXIiPmZpbGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KKyAgICA8dGQgY2xhc3M9InZhciI+cGF0aDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uPC90ZD4KLSAgICA8dGQ+T25seSBwYXNzIHRoZSBzcGVjaWZpZWQgYXJndW1lbnQgaWYgdGhlIGNob3NlbiBjb252ZXJ0ZXIKLSAgICBpbXBsZW1lbnRhdGlvbiBtYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZS4gIExlZ2FsIHZhbHVlcwotICAgIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUgYWJvdmUgPGEKLSAgICBocmVmPSIjaW1wbGVtZW50YXRpb252YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbXBsZW1lbnRhdGlvbjwvdGQ+CisgICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4gY29udmVydGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlIHZhbHVlIG9mCisgICAgdGhpcyBhdHRyaWJ1dGUuICBMZWdhbCB2YWx1ZXMgYXJlIHRoZSBzYW1lIGFzIHRob3NlIGluIHRoZQorICAgIGFib3ZlIDxhIGhyZWY9IiNpbXBsZW1lbnRhdGlvbnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29tcGlsZXJzLik8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+aW1wbGVtZW50YXRpb25jbGFzc3BhdGggPGVtPnNpbmNlIEFwYWNoZSBBbnQgMS44LjA8L2VtPjwvaDQ+Cis8aDQ+aW1wbGVtZW50YXRpb25jbGFzc3BhdGg8L2g0PgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjA8L2VtPjwvcD4KKzxwPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBob2xkaW5nIHRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZwordGhlIGNvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBpZiBhIGN1c3RvbSBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQuICBEb2Vzbid0IGhhdmUgYW55IGVmZmVjdCB3aGVuCit1c2luZyBvbmUgb2YgdGhlIGJ1aWx0LWluIGNvbnZlcnRlcnMuPC9wPgogCi08cD5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gaG9sZGluZyB0aGUKLSAgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcgdGhlIGNvbnZlcnRlciBpbXBsZW1lbnRhdGlvbiBpZiBhCi0gIGN1c3RvbSBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQuICBEb2Vzbid0IGhhdmUgYW55IGVmZmVjdCB3aGVuCi0gIHVzaW5nIG9uZSBvZiB0aGUgYnVpbHQtaW4gY29udmVydGVycy48L3A+Cis8aDQ+QW55IG5lc3RlZCBlbGVtZW50IG9mIGEgdHlwZSB0aGF0IGltcGxlbWVudHMgTmF0aXZlMkFzY2lpQWRhcHRlcjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5JZiBhIGRlZmluZWQgdHlwZSBpbXBsZW1lbnRzIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+TmF0aXZlMkFzY2lpQWRhcHRlcjwvY29kZT4gaW50ZXJmYWNlIGEgbmVzdGVkCitlbGVtZW50IG9mIHRoYXQgdHlwZSBjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj5pbXBsZW1lbnRhdGlvbjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi08aDQ+QW55IG5lc3RlZCBlbGVtZW50IG9mIGEgdHlwZSB0aGF0IGltcGxlbWVudHMgTmF0aXZlMkFzY2lpQWRhcHRlcgotICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L2g0PgorPGgzPkV4YW1wbGVzPC9oMz4KIAotPHA+SWYgYSBkZWZpbmVkIHR5cGUgaW1wbGVtZW50cyB0aGUgPGNvZGU+TmF0aXZlMkFzY2lpQWRhcHRlcjwvY29kZT4KLSAgaW50ZXJmYWNlIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhhdCB0eXBlIGNhbiBiZSB1c2VkIGFzIGFuCi0gIGFsdGVybmF0aXZlIHRvIHRoZSA8Y29kZT5pbXBsZW1lbnRhdGlvbjwvY29kZT4gYXR0cmlidXRlLjwvcD4KLQotICAgIDxoMz5FeGFtcGxlczwvaDM+Ci0KLSAgICA8cHJlPgorPHA+Q29udmVydCBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSA8c2FtcD5zcmNkaXI8L3NhbXA+IGVuZGluZyBpbiA8c2FtcD4uZXVjamlzPC9zYW1wPiBmcm9tIHRoZQorRVVDSklTIGVuY29kaW5nIHRvIEFTQ0lJIGFuZCByZW5hbWUgdGhlbSB0byBlbmQgaW4gPHNhbXA+LmphdmE8L3NhbXA+LjwvcD4KKzxwcmU+CiAmbHQ7bmF0aXZlMmFzY2lpIGVuY29kaW5nPSZxdW90O0VVQ0pJUyZxdW90OyBzcmM9JnF1b3Q7c3JjZGlyJnF1b3Q7IGRlc3Q9JnF1b3Q7c3JjZGlyJnF1b3Q7Ci0gICBpbmNsdWRlcz0mcXVvdDsqKi8qLmV1Y2ppcyZxdW90OyBleHQ9JnF1b3Q7LmphdmEmcXVvdDsvJmd0OwotICAgIDwvcHJlPgorICAgICAgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKi8qLmV1Y2ppcyZxdW90OyBleHQ9JnF1b3Q7LmphdmEmcXVvdDsvJmd0OzwvcHJlPgogCi0gICAgPHA+Ci0gICAgICBDb252ZXJ0cyBhbGwgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSA8ZW0+c3JjZGlyPC9lbT4KLSAgICAgIGVuZGluZyBpbiA8Y29kZT4uZXVjamlzPC9jb2RlPiBmcm9tIHRoZSBFVUNKSVMgZW5jb2RpbmcgdG8gQVNDSUkKLSAgICAgIGFuZCByZW5hbWVzIHRoZW0gdG8gZW5kIGluIDxjb2RlPi5qYXZhPC9jb2RlPi4KLSAgICA8L3A+Ci0KKzxwPkNvbnZlcnQgYWxsIHRoZSBmaWxlcyBlbmRpbmcgaW4gPHNhbXA+LmphdmE8L3NhbXA+IGluIHRoZSBkaXJlY3RvcnkgPHNhbXA+bmF0aXZlL2phcGFuZXNlPC9zYW1wPgordG8gQVNDSUksIHBsYWNpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIGRpcmVjdG9yeSA8c2FtcD5zcmM8L3NhbXA+LiAgVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyByZW1haW4gdGhlCitzYW1lLjwvcD4KIDxwcmU+CiAmbHQ7bmF0aXZlMmFzY2lpIGVuY29kaW5nPSZxdW90O0VVQ0pJUyZxdW90OyBzcmM9JnF1b3Q7bmF0aXZlL2phcGFuZXNlJnF1b3Q7IGRlc3Q9JnF1b3Q7c3JjJnF1b3Q7Ci0gICBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OwotPC9wcmU+CisgICAgICAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLSAgICA8cD4KLSAgICAgIENvbnZlcnRzIGFsbCB0aGUgZmlsZXMgZW5kaW5nIGluIDxjb2RlPi5qYXZhPC9jb2RlPgotICAgICAgaW4gdGhlIGRpcmVjdG9yeSA8ZW0+bmF0aXZlL2phcGFuZXNlPC9lbT4gdG8gQVNDSUksCi0gICAgICBwbGFjaW5nIHRoZSByZXN1bHRzIGluIHRoZSBkaXJlY3RvcnkgPGVtPnNyYzwvZW0+LgotICAgICAgVGhlIG5hbWVzIG9mIHRoZSBmaWxlcyByZW1haW4gdGhlIHNhbWUuCi0gICAgPC9wPgotCi08cD5JZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20KLSAgTmF0aXZlMkFzY2lpQWRhcHRlciA8Y29kZT5vcmcuZXhhbXBsZS5NeUFkYXB0ZXI8L2NvZGU+IHlvdSBjYW4gZWl0aGVyCi0gIHVzZSB0aGUgaW1wbGVtZW50YXRpb24gYXR0cmlidXRlOjwvcD4KKzxwPklmIHlvdSB3YW50IHRvIHVzZSBhCitjdXN0b20gPGNvZGUgY2xhc3M9ImNvZGUiPk5hdGl2ZTJBc2NpaUFkYXB0ZXI8L2NvZGU+IDxjb2RlPm9yZy5leGFtcGxlLk15QWRhcHRlcjwvY29kZT4geW91IGNhbgorZWl0aGVyIHVzZSB0aGUgaW1wbGVtZW50YXRpb24gYXR0cmlidXRlOjwvcD4KIDxwcmU+CiAmbHQ7bmF0aXZlMmFzY2lpIGVuY29kaW5nPSJFVUNKSVMiIHNyYz0ic3JjZGlyIiBkZXN0PSJzcmNkaXIiCi0gICAgICAgaW5jbHVkZXM9IioqLyouZXVjamlzIiBleHQ9Ii5qYXZhIgotICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuZXhhbXBsZS5NeUFkYXB0ZXIiLyZndDsKLTwvcHJlPgorICAgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5ldWNqaXMiIGV4dD0iLmphdmEiCisgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uPSJvcmcuZXhhbXBsZS5NeUFkYXB0ZXIiLyZndDs8L3ByZT4KIDxwPm9yIGEgZGVmaW5lIGEgdHlwZSBhbmQgbmVzdCB0aGlzIGludG8gdGhlIHRhc2sgbGlrZSBpbjo8L3A+CiA8cHJlPgogJmx0O2NvbXBvbmVudGRlZiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLk15QWRhcHRlciIKICAgICAgICAgICAgICAgbmFtZT0ibXlhZGFwdGVyIi8mZ3Q7CiAmbHQ7bmF0aXZlMmFzY2lpIGVuY29kaW5nPSJFVUNKSVMiIHNyYz0ic3JjZGlyIiBkZXN0PSJzcmNkaXIiCi0gICAgICAgaW5jbHVkZXM9IioqLyouZXVjamlzIiBleHQ9Ii5qYXZhIiZndDsKLSAgJmx0O215YWRhcHRlci8mZ3Q7Ci0mbHQ7L25hdGl2ZTJhc2NpaSZndDsKLTwvcHJlPgotPHA+aW4gd2hpY2ggY2FzZSB5b3VyIG5hdGl2ZTJhc2NpaSBhZGFwdGVyIGNhbiBzdXBwb3J0IGF0dHJpYnV0ZXMgYW5kCi0gIG5lc3RlZCBlbGVtZW50cyBvZiBpdHMgb3duLjwvcD4KLSAgPC9ib2R5PgorICAgICAgICAgICAgICBpbmNsdWRlcz0iKiovKi5ldWNqaXMiIGV4dD0iLmphdmEiJmd0OworICAgICZsdDtteWFkYXB0ZXIvJmd0OworJmx0Oy9uYXRpdmUyYXNjaWkmZ3Q7PC9wcmU+Cis8cD5pbiB3aGljaCBjYXNlIHlvdXIgPGNvZGU+bmF0aXZlMmFzY2lpPC9jb2RlPiBhZGFwdGVyIGNhbiBzdXBwb3J0IGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cworb2YgaXRzIG93bi48L3A+CiAKKzwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9uZXRyZXh4Yy5odG1sIGIvbWFudWFsL1Rhc2tzL25ldHJleHhjLmh0bWwKaW5kZXggZWZkZmE0ZC4uZWQzNjdhMiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL25ldHJleHhjLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL25ldHJleHhjLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzMjggKzE1LDI4OCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TmV0UmV4eEMgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ibmV0cmV4eGMiPk5ldFJleHhDPC9hPjwvaDI+Cis8aDIgaWQ9Im5ldHJleHhjIj5OZXRSZXh4QzwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Q29tcGlsZXMgYSA8YSBocmVmPSJodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vbmV0cmV4eCIgdGFyZ2V0PSJfdG9wIj5OZXRSZXh4PC9hPgotc291cmNlIHRyZWUgd2l0aGluIHRoZSBydW5uaW5nIChBcGFjaGUgQW50KSBWTS48L3A+Ci08cD5UaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2lsbCBiZSByZWN1cnNpdmVseSBzY2FubmVkIGZvcgotTmV0UmV4eCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4gIE9ubHkgTmV0UmV4eCBmaWxlcyB0aGF0IGhhdmUgbm8gY29ycmVzcG9uZGluZwotY2xhc3MgZmlsZSBvciB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBvbGRlciB0aGFuIHRoZSBqYXZhIGZpbGUgd2lsbCBiZSBjb21waWxlZC48L3A+Ci08cD5GaWxlcyBpbiB0aGUgc291cmNlIHRyZWUgYXJlIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LAotYWxsb3dpbmcgc3VwcG9ydCBmaWxlcyB0byBiZSBsb2NhdGVkIHByb3Blcmx5IGluIHRoZSBjbGFzc3BhdGguIFRoZSBzb3VyY2UKLWZpbGVzIGFyZSBjb3BpZWQgYmVjYXVzZSB0aGUgTmV0UmV4eCBjb21waWxlciBjYW5ub3QgcHJvZHVjZSBjbGFzcyBmaWxlcyBpbiBhCi1zcGVjaWZpYyBkaXJlY3RvcnkgdmlhIHBhcmFtZXRlcnM8L3A+Ci08cD5UaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIHRyZWUgc2hvdWxkIGZvbGxvdyB0aGUgcGFja2FnZQotaGllcmFyY2h5LjwvcD4KLTxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkL2NvcGllZC4KLVRoaXMgY2FuIGJlIGRvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kCi08aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3UKLXNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZQotPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlCi1leGNsdWRlZC4gIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuICBBbmQgZmluYWxseSB3aXRoIHRoZQotPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCi1ocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKKzxwPkNvbXBpbGVzIGEgPGEgaHJlZj0iaHR0cHM6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9hd2R0b29scy9uZXRyZXh4L2xpYnJhcnkuaHRtbCIKK3RhcmdldD0iX3RvcCI+TmV0UmV4eDwvYT4gc291cmNlIHRyZWUgd2l0aGluIHRoZSBydW5uaW5nIChBcGFjaGUgQW50KSBKVk0uPC9wPgorPHA+VGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZGlyZWN0b3J5IHdpbGwgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCBmb3IgTmV0UmV4eCBzb3VyY2UgZmlsZXMgdG8KK2NvbXBpbGUuICBPbmx5IE5ldFJleHggZmlsZXMgdGhhdCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgY2xhc3MgZmlsZSBvciB3aGVyZSB0aGUgY2xhc3MgZmlsZSBpcyBvbGRlcgordGhhbiB0aGUgamF2YSBmaWxlIHdpbGwgYmUgY29tcGlsZWQuPC9wPgorPHA+RmlsZXMgaW4gdGhlIHNvdXJjZSB0cmVlIGFyZSBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgYWxsb3dpbmcgc3VwcG9ydCBmaWxlcyB0byBiZQorbG9jYXRlZCBwcm9wZXJseSBpbiB0aGUgY2xhc3NwYXRoLiBUaGUgc291cmNlIGZpbGVzIGFyZSBjb3BpZWQgYmVjYXVzZSB0aGUgTmV0UmV4eCBjb21waWxlciBjYW5ub3QKK3Byb2R1Y2UgY2xhc3MgZmlsZXMgaW4gYSBzcGVjaWZpYyBkaXJlY3RvcnkgdmlhIHBhcmFtZXRlcnM8L3A+Cis8cD5UaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBvZiB0aGUgc291cmNlIHRyZWUgc2hvdWxkIGZvbGxvdyB0aGUgcGFja2FnZSBoaWVyYXJjaHkuPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgY29tcGlsZWQvY29waWVkLiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoCit0aGUgPHZhcj5pbmNsdWRlczwvdmFyPiwgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4sIDx2YXI+ZXhjbHVkZXM8L3Zhcj4sIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+CithbmQgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPHZhcj5pbmNsdWRlczwvdmFyPiBvciA8dmFyPmluY2x1ZGVzZmlsZTwvdmFyPgorYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPHZhcj5leGNsdWRlPC92YXI+CitvciA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiAgVGhpcworaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuICBBbmQgZmluYWxseSB3aXRoIHRoZSA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBhdHRyaWJ1dGUsIHlvdSBjYW4KK3NwZWNpZnkgd2hldGhlciB5b3Ugd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uCitvbiA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKIGluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuPC9wPgotPHA+VGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCi1zdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgotKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5zcmNkaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLTxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLTxwPkFsbCBwcm9wZXJ0aWVzIGV4Y2VwdCBjbGFzc3BhdGgsIHNyY2RpciBhbmQgZGVzdERpciBhcmUgYWxzbyBhdmFpbGFibGUgYXMgcHJvcGVydGllcyBpbiB0aGUgZm9ybQotPGNvZGU+YW50Lm5ldHJleHhjLjxpPmF0dHJpYnV0ZW5hbWU8L2k+PC9jb2RlPiwgZWcuPGJyPgotPGNvZGU+Jmx0O3Byb3BlcnR5IG5hbWU9ImFudC5uZXRyZXh4Yy52ZXJib3NlIiB2YWx1ZT0ibm92ZXJib3NlIi8mZ3Q7PC9jb2RlPjxicj4KLW9yIGZyb20gdGhlIGNvbW1hbmQgbGluZSBhczxicj4KLTxjb2RlPmFudCAtRGFudC5uZXRyZXh4Yy52ZXJib3NlPW5vdmVyYm9zZSAuLi48L2NvZGU+Ci08L3A+Ci08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QKLWluY2x1ZGVkIGluIHRoZSBBcGFjaGUgQW50IGRpc3RyaWJ1dGlvbi4gU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4KLWZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KKzxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0CithdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDx2YXI+ZGlyPC92YXI+IGJlY29tZXMgPHZhcj5zcmNkaXI8L3Zhcj4pIGFzIHdlbGwgYXMgdGhlCituZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+QWxsIGF0dHJpYnV0ZXMgZXhjZXB0IDx2YXI+Y2xhc3NwYXRoPC92YXI+LCA8dmFyPnNyY2RpcjwvdmFyPiBhbmQgPHZhcj5kZXN0RGlyPC92YXI+IGFyZSBhbHNvCithdmFpbGFibGUgYXMgcHJvcGVydGllcyBpbiB0aGUgZm9ybSA8Y29kZT5hbnQubmV0cmV4eGMuPGk+YXR0cmlidXRlbmFtZTwvaT48L2NvZGU+LAorZWcuPGJyLz48Y29kZSBjbGFzcz0iY29kZSI+Jmx0O3Byb3BlcnR5IG5hbWU9ImFudC5uZXRyZXh4Yy52ZXJib3NlIgordmFsdWU9Im5vdmVyYm9zZSIvJmd0OzwvY29kZT48YnIvPiBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXM8YnIvPjxrYmQ+YW50CistRGFudC5uZXRyZXh4Yy52ZXJib3NlPW5vdmVyYm9zZSAuLi48L2tiZD48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFwYWNoZSBBbnQKK2Rpc3RyaWJ1dGlvbi4gU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iaW5hcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBsaXRlcmFscyBhcmUgdHJlYXRlZCBhcyB0aGUgamF2YSBiaW5hcnkKLSAgICAgIHR5cGUgcmF0aGVyIHRoYW4gdGhlIE5ldFJleHggdHlwZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5iaW5hcnk8L3RkPgorICAgIDx0ZD5XaGV0aGVyIGxpdGVyYWxzIGFyZSB0cmVhdGVkIGFzIHRoZSBKYXZhIGJpbmFyeSB0eXBlIHJhdGhlciB0aGFuIHRoZSBOZXRSZXh4IHR5cGVzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgZHVyaW5nIGNvbXBpbGF0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UgZHVyaW5nIGNvbXBpbGF0aW9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tZW50czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGNvbW1lbnRzIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUKLSAgICAgIGdlbmVyYXRlZCBqYXZhIHNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbW1lbnRzPC90ZD4KKyAgICA8dGQ+V2hldGhlciBjb21tZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZSBmaWxlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wYWN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgZXJyb3IgbWVzc2FnZXMgY29tZSBvdXQgaW4gY29tcGFjdCBvcgotICAgICAgdmVyYm9zZSBmb3JtYXQuIERlZmF1bHQgaXMgdGhlIGNvbXBhY3QgZm9ybWF0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbXBhY3Q8L3RkPgorICAgIDx0ZD5XaGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IgdmVyYm9zZSBmb3JtYXQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGNvbXBpbGUgdGhlCi0gICAgICBnZW5lcmF0ZWQgamF2YSBjb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y29tcGlsZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbnNvbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBvciBub3QgbWVzc2FnZXMgc2hvdWxkIGJlIGRpc3BsYXllZCBvbiB0aGUKLSAgICAgICdjb25zb2xlJy4gTm90ZSB0aGF0IHRoaXMgdGFzayB3aWxsIHJlbHkgb24gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZpbHRlcmluZyBjb21waWxlIG1lc3NhZ2VzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbnNvbGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIG9yIG5vdCBtZXNzYWdlcyBzaG91bGQgYmUgZGlzcGxheWVkIG9uIHRoZSAnY29uc29sZScuIE5vdGUgdGhhdCB0aGlzIHRhc2sgd2lsbCByZWx5CisgICAgICBvbiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZmlsdGVyaW5nIGNvbXBpbGUgbWVzc2FnZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jcm9zc3JlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHZhcmlhYmxlIGNyb3NzIHJlZmVyZW5jZXMgYXJlIGdlbmVyYXRlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNyb3NzcmVmPC90ZD4KKyAgICA8dGQ+V2hldGhlciB2YXJpYWJsZSBjcm9zcyByZWZlcmVuY2VzIGFyZSBnZW5lcmF0ZWQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlY2ltYWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBkZWNpbWFsIGFyaXRobWV0aWMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZQotICAgICAgTmV0UmV4eCBjb2RlLiBTZXR0aW5nIHRoaXMgdG8gb2ZmIHdpbGwgcmVwb3J0IGRlY2ltYWwgYXJpdGhtZXRpYwotICAgICAgYXMgYW4gZXJyb3IsIGZvciBwZXJmb3JtYW5jZSBjcml0aWNhbCBhcHBsaWNhdGlvbnMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVjaW1hbDwvdGQ+CisgICAgPHRkPldoZXRoZXIgZGVjaW1hbCBhcml0aG1ldGljIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgTmV0UmV4eCBjb2RlLiBTZXR0aW5nIHRoaXMgdG8gPHE+b2ZmPC9xPgorICAgICAgd2lsbCByZXBvcnQgZGVjaW1hbCBhcml0aG1ldGljIGFzIGFuIGVycm9yLCBmb3IgcGVyZm9ybWFuY2UgY3JpdGljYWwgYXBwbGljYXRpb25zLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuCi0gICAgICBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdERpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIE5ldFJleHgKLSAgICAgIHNvdXJjZSBmaWxlcyBzaG91bGQgYmUgY29waWVkIGFuZCB0aGVuIGNvbXBpbGVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3REaXI8L3RkPgorICAgIDx0ZD50aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIE5ldFJleHggc291cmNlIGZpbGVzIHNob3VsZCBiZSBjb3BpZWQgYW5kIHRoZW4KKyAgICAgIGNvbXBpbGVkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlhZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMKLSAgICAgIGdlbmVyYXRlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRpYWc8L3RkPgorICAgIDx0ZD5XaGV0aGVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbXBpbGUgaXMgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbgotICAgICAgb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cGxpY2l0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdmFyaWFibGVzIG11c3QgYmUgZGVjbGFyZWQgZXhwbGljaXRseQotICAgICAgYmVmb3JlIHVzZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4cGxpY2l0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlZm9yZSB1c2U8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBjb2RlIGlzIGZvcm1hdHRlZCBuaWNlbHkKLSAgICAgIG9yIGxlZnQgdG8gbWF0Y2ggTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Zm9ybWF0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZSBpcyBmb3JtYXR0ZWQgbmljZWx5IG9yIGxlZnQgdG8gbWF0Y2ggTmV0UmV4eCBsaW5lIG51bWJlcnMKKyAgICAgIGZvciBjYWxsIHN0YWNrIGRlYnVnZ2luZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsICg8cT4qKjwvcT4pPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5qYXZhPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgcHJvZHVjZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5qYXZhPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZSBpcyBwcm9kdWNlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIHNvdXJjZSBmaWxlIHNob3VsZCBiZSBrZXB0Ci0gICAgICBhZnRlciBjb21waWxhdGlvbi4gVGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGhhdmUgYW4gZXh0ZW5zaW9uIG9mCi0gICAgICAuamF2YS5rZWVwLCA8Yj5ub3Q8L2I+IC5qYXZhLiBVc2UgcmVtb3ZlS2VlcEV4dGVuc2lvbiB0byBjaGFuZ2UgdGhhdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5rZWVwPC90ZD4KKyAgICA8dGQ+U2V0cyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UgZmlsZSBzaG91bGQgYmUga2VwdCBhZnRlciBjb21waWxhdGlvbi4gVGhlIGdlbmVyYXRlZAorICAgICAgZmlsZXMgd2lsbCBoYXZlIGFuIGV4dGVuc2lvbgorICAgICAgb2YgPHNhbXA+LmphdmEua2VlcDwvc2FtcD4sIDxzdHJvbmc+bm90PC9zdHJvbmc+IDxzYW1wPi5qYXZhPC9zYW1wPi4gVXNlIDxxPnJlbW92ZUtlZXBFeHRlbnNpb248L3E+CisgICAgICB0byBjaGFuZ2UgdGhhdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ288L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgY29tcGlsZXIgdGV4dCBsb2dvIGlzIGRpc3BsYXllZCB3aGVuCi0gICAgICBjb21waWxpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5sb2dvPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgY29tcGlsZXIgdGV4dCBsb2dvIGlzIGRpc3BsYXllZCB3aGVuIGNvbXBpbGluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3ZlS2VlcEV4dGVuc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHRoZSB0cmFpbGluZyAua2VlcCBpbiBub2NvbXBpbGUtbW9kZSBzaG91bGQKLSAgICAgIGJlIHJlbW92ZWQgc28gdGhhdCB0aGUgcmVzdWx0aW5nIGphdmEgc291cmNlIHJlYWxseSBlbmRzIG9uIC5qYXZhLiBUaGlzCi0gICAgICBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIHRoZSBqYXZhZG9jIHRvb2wgbGF0ZXJvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5yZW1vdmVLZWVwRXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+VGVsbHMgd2hldGhlciB0aGUgdHJhaWxpbmcgPHNhbXA+LmtlZXA8L3NhbXA+IGluIDx2YXI+Y29tcGlsZTwvdmFyPj08cT5mYWxzZTwvcT4gbW9kZSBzaG91bGQKKyAgICAgIGJlIHJlbW92ZWQgc28gdGhhdCB0aGUgcmVzdWx0aW5nIEphdmEgc291cmNlIGZpbGUgcmVhbGx5IGVuZHMgb24gPHNhbXA+LmphdmE8L3NhbXA+LiBUaGlzCisgICAgICBmYWNpbGl0YXRlcyB0aGUgdXNlIG9mIHRoZSA8a2JkPmphdmFkb2M8L2tiZD4gdG9vbCBsYXRlciBvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlcGxhY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgZ2VuZXJhdGVkIC5qYXZhIGZpbGUgc2hvdWxkIGJlIHJlcGxhY2VkCi0gICAgICB3aGVuIGNvbXBpbGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoZSBnZW5lcmF0ZWQgPHNhbXA+LmphdmE8L3NhbXA+IGZpbGVzIHNob3VsZCBiZSByZXBsYWNlZCB3aGVuIGNvbXBpbGluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2F2ZWxvZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBjb21waWxlciBtZXNzYWdlcyB3aWxsIGJlIHdyaXR0ZW4gdG8KLSAgICAgIE5ldFJleHhDLmxvZyBhcyB3ZWxsIGFzIHRvIHRoZSBjb25zb2xlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2F2ZWxvZzwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGNvbXBpbGVyIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlbiB0byA8c2FtcD5OZXRSZXh4Qy5sb2c8L3NhbXA+IGFzIHdlbGwgYXMgdG8gdGhlCisgICAgICBjb25zb2xlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdG8gc3RvcmUgdGhlIGNsYXNzIGZpbGVzIGluIHRoZQotICAgICAgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlcy4gVGhlIGFsdGVybmF0aXZlIGlzIHRoZSB3b3JraW5nCi0gICAgICBkaXJlY3Rvcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zb3VyY2VkaXI8L3RkPgorICAgIDx0ZD5UZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2UKKyAgICAgIGZpbGVzLiBUaGUgYWx0ZXJuYXRpdmUgaXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmNEaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0IHRoZSBzb3VyY2UgZGlyIHRvIGZpbmQgdGhlIHNvdXJjZSBOZXRSZXh4Ci0gICAgICBmaWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zcmNEaXI8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBkaXJlY3RvcnkgdG8gZmluZCB0aGUgc291cmNlIE5ldFJleHggZmlsZXMgaW48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpY3RhcmdzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgbWV0aG9kIGNhbGxzIGFsd2F5cwotICAgICAgbmVlZCBwYXJlbnRoZXNlcywgZXZlbiBpZiBubyBhcmd1bWVudHMgYXJlIG5lZWRlZCwgZS5nLgotICAgICAgPGNvZGU+YVN0cmluZ1Zhci5nZXRCeXRlczwvY29kZT4gdnMuCi0gICAgICA8Y29kZT5hU3RyaW5nVmFyLmdldEJ5dGVzKCk8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3RyaWN0YXJnczwvdGQ+CisgICAgPHRkPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgbWV0aG9kIGNhbGxzIGFsd2F5cyBuZWVkIHBhcmVudGhlc2VzLCBldmVuIGlmIG5vIGFyZ3VtZW50cworICAgICAgYXJlIG5lZWRlZCwgZS5nLiA8Y29kZT5hU3RyaW5nVmFyLmdldEJ5dGVzPC9jb2RlPiB2cy4gPGNvZGU+YVN0cmluZ1Zhci5nZXRCeXRlcygpPC9jb2RlPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0YXNzaWduPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGUgdGhhdCBhc3NpZ25tZW50cyBtdXN0Ci0gICAgICBtYXRjaCBleGFjdGx5IG9uIHR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdHJpY3Rhc3NpZ248L3RkPgorICAgIDx0ZD5UZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdCBtYXRjaCBleGFjdGx5IG9uIHR5cGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmljdGNhc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGJlCi0gICAgICBjYXNlIHNlbnNpdGl2ZSBvciBub3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdHJpY3RjYXNlPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0aW1wb3J0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgY2xhc3NlcyBuZWVkIHRvIGJlIGltcG9ydGVkIGV4cGxpY2l0bHkgdXNpbmcgYW4KLSAgICAgIDxjb2RlPmltcG9ydDwvY29kZT4gc3RhdGVtZW50LiAgQnkgZGVmYXVsdCB0aGUgTmV0UmV4eCBjb21waWxlciB3aWxsCi0gICAgICBpbXBvcnQgY2VydGFpbiBwYWNrYWdlcyBhdXRvbWF0aWNhbGx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3RyaWN0aW1wb3J0PC90ZD4KKyAgICA8dGQ+V2hldGhlciBjbGFzc2VzIG5lZWQgdG8gYmUgaW1wb3J0ZWQgZXhwbGljaXRseSB1c2luZyBhbiA8Y29kZT5pbXBvcnQ8L2NvZGU+IHN0YXRlbWVudDwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IHRoZSBOZXRSZXh4IGNvbXBpbGVyIHdpbGwgaW1wb3J0IGNlcnRhaW4gcGFja2FnZXMgYXV0b21hdGljYWxseTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmljdHByb3BzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgbG9jYWwgcHJvcGVydGllcyBuZWVkIHRvIGJlIHF1YWxpZmllZAotICAgICAgZXhwbGljaXRseSB1c2luZyA8Y29kZT50aGlzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN0cmljdHByb3BzPC90ZD4KKyAgICA8dGQ+V2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkIGV4cGxpY2l0bHkgdXNpbmcgPGNvZGU+dGhpczwvY29kZT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmljdHNpZ25hbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgZm9yY2UgY2F0Y2hpbmcgb2YKLSAgICAgIGV4Y2VwdGlvbnMgYnkgZXhwbGljaXRseSBuYW1lZCB0eXBlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN0cmljdHNpZ25hbDwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZCBmb3JjZSBjYXRjaGluZyBvZiBleGNlcHRpb25zIGJ5IGV4cGxpY2l0bHkgbmFtZWQgdHlwZXM8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN5bWJvbHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGUKLSAgICAgIGNsYXNzIGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zeW1ib2xzPC90ZD4KKyAgICA8dGQ+V2hldGhlciBkZWJ1ZyBzeW1ib2xzIHNob3VsZCBiZSBnZW5lcmF0ZWQgaW50byB0aGUgY2xhc3MgZmlsZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Bc2tzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHByaW50IGNvbXBpbGF0aW9uCi0gICAgICB0aW1lcyB0byB0aGUgY29uc29sZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRpbWU8L3RkPgorICAgIDx0ZD5Bc2tzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHByaW50IGNvbXBpbGF0aW9uIHRpbWVzIHRvIHRoZSBjb25zb2xlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50cmFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UdXJucyBvbiBvciBvZmYgdHJhY2luZyBhbmQgZGlyZWN0cyB0aGUgcmVzdWx0YW50Ci0gICAgICB0cmFjZSBvdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50cmFjZTwvdGQ+CisgICAgPHRkPlR1cm5zIG9uIG9yIG9mZiB0cmFjaW5nIGFuZCBkaXJlY3RzIHRoZSByZXN1bHRhbnQgdHJhY2Ugb3V0cHV0PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51dGY4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgdGhlIHNvdXJjZSBpcyBpbiBVVEY4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dXRmODwvdGQ+CisgICAgPHRkPlRlbGxzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRoYXQgdGhlIHNvdXJjZSBpcyBpbiBVVEY4PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgbG90cyBvZiB3YXJuaW5ncyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkCi0gICAgICBiZSBnZW5lcmF0ZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+VGVsbHMgd2hldGhlciBsb3RzIG9mIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgZ2VuZXJhdGVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdXBwcmVzc01ldGhvZEFyZ3VtZW50Tm90VXNlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZQotICAgICAgJmFtcDtNZXRob2QgYXJndW1lbnQgbm90IHVzZWQmYW1wOyBtZXNzYWdlcyBpbiBzdHJpY3RhcmdzIG1vZGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQ8L3RkPgorICAgIDx0ZD5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSA8cT5NZXRob2QgYXJndW1lbnQgbm90IHVzZWQ8L3E+IG1lc3NhZ2VzCisgICAgICBpbiA8dmFyPnN0cmljdGFyZ3M8L3Zhcj4gbW9kZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZQotICAgICAgJmFtcDtQcml2YXRlIFByb3BlcnR5IGRlZmluZWQsIGJ1dCBub3QgdXNlZCZhbXA7IG1lc3NhZ2VzIGluIHN0cmljdGFyZ3MgbW9kZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdXBwcmVzc1ByaXZhdGVQcm9wZXJ0eU5vdFVzZWQ8L3RkPgorICAgIDx0ZD5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IHRoZSA8cT5Qcml2YXRlIFByb3BlcnR5IGRlZmluZWQsIGJ1dCBub3QgdXNlZDwvcT4KKyAgICAgIG1lc3NhZ2VzIGluIDx2YXI+c3RyaWN0YXJnczwvdmFyPiBtb2RlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NWYXJpYWJsZU5vdFVzZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUKLSAgICAgICZhbXA7VmFyaWFibGUgc2V0IGJ1dCBub3QgdXNlZCZhbXA7IG1lc3NhZ2VzIGluIHN0cmljdGFyZ3MgbW9kZS4KLSAgICAgIFBsZWFzZSBiZSBjYXJlZnVsIHdpdGggdGhpcyBvbmUsIGFzIHlvdSBjYW4gaGlkZSBlcnJvcnMgYmVoaW5kIGl0ITwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN1cHByZXNzVmFyaWFibGVOb3RVc2VkPC90ZD4KKyAgICA8dGQ+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUgPHE+VmFyaWFibGUgc2V0IGJ1dCBub3QgdXNlZDwvcT4gbWVzc2FnZXMKKyAgICAgIGluIDx2YXI+c3RyaWN0YXJnczwvdmFyPiBtb2RlLiAgUGxlYXNlIGJlIGNhcmVmdWwgd2l0aCB0aGlzIG9uZSwgYXMgeW91IGNhbiBoaWRlIGVycm9ycyBiZWhpbmQKKyAgICAgIGl0ITwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NFeGNlcHRpb25Ob3RTaWduYWxsZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCB0aGUKLSAgICAgICZhbXA7RXhjZXB0aW9uIGlzIGRlY2xhcmVkLCBidXQgbm90IHNpZ25hbGxlZCB3aXRoaW4gdGhlIG1ldGhvZCZhbXA7Ci0gICAgICBtZXNzYWdlcyBpbiBzdHJpY3RzaWduYWwgbW9kZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZDwvdGQ+CisgICAgPHRkPlRlbGxzIHdoZXRoZXIgd2Ugc2hvdWxkIGZpbHRlciBvdXQgdGhlIDxxPkV4Y2VwdGlvbiBpcyBkZWNsYXJlZCwgYnV0IG5vdCBzaWduYWxsZWQgd2l0aGluCisgICAgICB0aGUgbWV0aG9kPC9xPiBtZXNzYWdlcyBpbiA8dmFyPnN0cmljdHNpZ25hbDwvdmFyPiBtb2RlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NEZXByZWNhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UZWxscyB3aGV0aGVyIHdlIHNob3VsZCBmaWx0ZXIgb3V0IGFueSBkZXByZWNhdGlvbi1tZXNzYWdlcwotICAgICAgb2YgdGhlIGNvbXBpbGVyIG91dC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zdXBwcmVzc0RlcHJlY2F0aW9uPC90ZD4KKyAgICA8dGQ+VGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24gbWVzc2FnZXMgb2YgdGhlIGNvbXBpbGVyIG91dHB1dDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci0gIDxwPjxjb2RlPiZsdDtuZXRyZXh4YyBzcmNEaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0JnF1b3Q7Ci0gICAgICAgICAgIGluY2x1ZGVzPSZxdW90O3Zuci91dGlsLyomcXVvdDsKLSAgICAgICAgICAgZGVzdERpcj0mcXVvdDsvc291cmNlL3Byb2plY3QvYnVpbGQmcXVvdDsKLSAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90Oy9zb3VyY2UvcHJvamVjdDIvcHJvai5qYXImcXVvdDsKLSAgICAgICAgICAgY29tbWVudHM9JnF1b3Q7dHJ1ZSZxdW90OwotICAgICAgICAgICBjcm9zc3JlZj0mcXVvdDtmYWxzZSZxdW90OyByZXBsYWNlPSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAga2VlcD0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L2NvZGU+Ci0gIDwvcD4KLTwvYmxvY2txdW90ZT4KIAorPHByZT4KKyZsdDtuZXRyZXh4YyBzcmNEaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0JnF1b3Q7CisgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7dm5yL3V0aWwvKiZxdW90OworICAgICAgICAgIGRlc3REaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0L2J1aWxkJnF1b3Q7CisgICAgICAgICAgY2xhc3NwYXRoPSZxdW90Oy9zb3VyY2UvcHJvamVjdDIvcHJvai5qYXImcXVvdDsKKyAgICAgICAgICBjb21tZW50cz0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAgY3Jvc3NyZWY9JnF1b3Q7ZmFsc2UmcXVvdDsgcmVwbGFjZT0mcXVvdDt0cnVlJnF1b3Q7CisgICAgICAgICAga2VlcD0mcXVvdDt0cnVlJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvbmljZS5odG1sIGIvbWFudWFsL1Rhc2tzL25pY2UuaHRtbAppbmRleCAwM2MwZWFhLi4xZTEyODY3IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvbmljZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9uaWNlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw1NyArMTUsNTEgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPk5pY2UgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iZWNobyI+TmljZTwvYT48L2gyPgorPGgyIGlkPSJlY2hvIj5OaWNlPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5Qcm92aWRlICJuaWNlLW5lc3MiIHRvIHRoZSBjdXJyZW50IHRocmVhZAotICAgYW5kL29yIHF1ZXJ5IHRoZSBjdXJyZW50IHZhbHVlLjwvcD4KKzxwPlByb3ZpZGUgJnF1b3Q7bmljZS1uZXNzJnF1b3Q7IHRvIHRoZSBjdXJyZW50IHRocmVhZCBhbmQvb3IgcXVlcnkgdGhlIGN1cnJlbnQgdmFsdWUuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jdXJyZW50cHJpb3JpdHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHZhbHVlIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIHRoZSBjdXJyZW50ICZxdW90O25pY2UtbmVzcyZxdW90OyBsZXZlbC4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jdXJyZW50cHJpb3JpdHk8L3RkPgorICAgIDx0ZD5uYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRoZSBjdXJyZW50ICZxdW90O25pY2UtbmVzcyZxdW90OworICAgICAgbGV2ZWwuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uZXdwcmlvcml0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdmFsdWUgdG8gd2hpY2ggdGhlCi0gICAgICAgICAgICAgICAgICAgICAmcXVvdDtuaWNlLW5lc3MmcXVvdDsgbGV2ZWwgc2hvdWxkIGJlIHNldC4KLSAgICAgICAgICAgICAgICAgICAgIE11c3QgYmUgYSB2YWxpZCBKYXZhIFRocmVhZCBwcmlvcml0eS4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5uZXdwcmlvcml0eTwvdGQ+CisgICAgPHRkPnZhbHVlIHRvIHdoaWNoIHRoZSAmcXVvdDtuaWNlLW5lc3MmcXVvdDsgbGV2ZWwgc2hvdWxkIGJlIHNldC4gIE11c3QgYmUgYSB2YWxpZCBKYXZhIFRocmVhZAorICAgICAgcHJpb3JpdHkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgICZsdDtuaWNlIG5ld3ByaW9yaXR5PSZxdW90OzEwJnF1b3Q7LyZndDs8L3ByZT4KLVNldCB0aGUgVGhyZWFkIHByaW9yaXR5IHRvIDEwIChoaWdoZXN0KS4KLTxwcmU+ICAgJmx0O25pY2UgY3VycmVudHByaW9yaXR5PSZxdW90O3ByaW9yaXR5JnF1b3Q7LyZndDs8L3ByZT4KLVN0b3JlIHRoZSBjdXJyZW50IFRocmVhZCBwcmlvcml0eSBpbiB0aGUgdXNlciBwcm9wZXJ0eSAicHJpb3JpdHkiLgotPHByZT4KLSAgICZsdDtuaWNlIGN1cnJlbnRwcmlvcml0eT0mcXVvdDtjdXJyZW50cHJpb3JpdHkmcXVvdDsgbmV3cHJpb3JpdHk9JnF1b3Q7MSZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPlNldCB0aGUgY3VycmVudCBUaHJlYWQgcHJpb3JpdHkgdG8gMSAobG93ZXN0KSwgc3RvcmluZyB0aGUgb3JpZ2luYWwKLXByaW9yaXR5IGluIHRoZSB1c2VyIHByb3BlcnR5ICJjdXJyZW50cHJpb3JpdHkiLiAgVGhpcwotY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwcmlvcml0eSBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBsYXRlci4KLTwvcD4KIAorPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+U2V0IHRoZSBUaHJlYWQgcHJpb3JpdHkgdG8gMTAgKGhpZ2hlc3QpLjwvcD4KKzxwcmU+Jmx0O25pY2UgbmV3cHJpb3JpdHk9JnF1b3Q7MTAmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5TdG9yZSB0aGUgY3VycmVudCBUaHJlYWQgcHJpb3JpdHkgaW4gdGhlIHVzZXIgcHJvcGVydHkgPGNvZGU+cHJpb3JpdHk8L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O25pY2UgY3VycmVudHByaW9yaXR5PSZxdW90O3ByaW9yaXR5JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+U2V0IHRoZSBjdXJyZW50IFRocmVhZCBwcmlvcml0eSB0byAxIChsb3dlc3QpLCBzdG9yaW5nIHRoZSBvcmlnaW5hbCBwcmlvcml0eSBpbiB0aGUgdXNlcgorcHJvcGVydHkgPGNvZGU+Y3VycmVudHByaW9yaXR5PC9jb2RlPi4gVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHByaW9yaXR5IGJhY2sgdG8gaXRzIG9yaWdpbmFsCit2YWx1ZSBsYXRlci48L3A+Cis8cHJlPiZsdDtuaWNlIGN1cnJlbnRwcmlvcml0eT0mcXVvdDtjdXJyZW50cHJpb3JpdHkmcXVvdDsgbmV3cHJpb3JpdHk9JnF1b3Q7MSZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3BhY2suaHRtbCBiL21hbnVhbC9UYXNrcy9wYWNrLmh0bWwKaW5kZXggNjBhZTFlNS4uNmY2ZGFkMSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3BhY2suaHRtbAorKysgYi9tYW51YWwvVGFza3MvcGFjay5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNjMgKzE1LDYyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KLTx0aXRsZT5HWmlwL0JaaXAyIFRhc2tzPC90aXRsZT4KKzx0aXRsZT5HWmlwL0JaaXAyL1haIFRhc2tzPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJwYWNrIj5HWmlwL0JaaXAyPC9hPjwvaDI+Cis8aDIgaWQ9InBhY2siPkdaaXAvQlppcDIvWFo8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlBhY2tzIGEgcmVzb3VyY2UgdXNpbmcgdGhlIEdaaXAgb3IgQlppcDIgYWxnb3JpdGhtLgotVGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgZ2VuZXJhdGVkIGlmIGl0IGRvZXNuJ3QgZXhpc3Qgb3IgdGhlIHNvdXJjZQotcmVzb3VyY2UgaXMgbmV3ZXIuPC9wPgorPHA+UGFja3MgYSByZXNvdXJjZSB1c2luZyB0aGUgR1ppcCwgQlppcDIgb3IgWFogYWxnb3JpdGhtLiAgVGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgZ2VuZXJhdGVkIGlmIGl0Citkb2Vzbid0IGV4aXN0IG9yIHRoZSBzb3VyY2UgcmVzb3VyY2UgaXMgbmV3ZXIuPC9wPgorCis8cD5YWiBjb21wcmVzc2lvbiBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuMTAuMTwvZW0+IGFuZCBkZXBlbmRzIG9uIGV4dGVybmFsCitsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLgorU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byBnemlwL2J6aXAuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgb3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbi48L3RkPgorICAgIDx0ZD5zcmM8L3RkPgorICAgIDx0ZD50aGUgZmlsZSB0byBnemlwL2J6aXAveHouPC90ZD4KKyAgICA8dGQ+WWVzLCBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRlc3RpbmF0aW9uIGZpbGUgdG8gY3JlYXRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvLjwvdGQ+CisgICAgPHRkPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQ+dGhlIGRlc3RpbmF0aW9uIGZpbGUgdG8gY3JlYXRlLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d288L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj56aXBmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8aT5kZXByZWNhdGVkPC9pPiBvbGQgbmFtZSBvZiBkZXN0ZmlsZS48L3RkPgorICAgIDx0ZD56aXBmaWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPjxlbT48dT5kZXByZWNhdGVkPC91PjwvZW0+IG9sZCBuYW1lIG9mIDx2YXI+ZGVzdGZpbGU8L3Zhcj4uPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08aDQ+YW55IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3Igc2luZ2xlIGVsZW1lbnQKLXJlc291cmNlIGNvbGxlY3Rpb248L2g0PgotCi08cD5UaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgdXNlZCBhcyBzcmMuIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC9wPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8aDQ+YW55IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3Igc2luZ2xlIGVsZW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPjwvcD4KKzxwPlRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSB1c2VkIGFzIDx2YXI+c3JjPC92YXI+LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7Z3ppcCBzcmM9JnF1b3Q7dGVzdC50YXImcXVvdDsgZGVzdGZpbGU9JnF1b3Q7dGVzdC50YXIuZ3omcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtiemlwMiBzcmM9JnF1b3Q7dGVzdC50YXImcXVvdDsgZGVzdGZpbGU9JnF1b3Q7dGVzdC50YXIuYnoyJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7Z3ppcCBkZXN0ZmlsZT0mcXVvdDthcmNoaXZlLnRhci5neiZxdW90OyZndDsKLSAgJmx0O3VybCB1cmw9Imh0dHA6Ly9leGFtcGxlLm9yZy9hcmNoaXZlLnRhciIvJmd0OwotJmx0Oy9nemlwJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+ZG93bmxvYWRzIDxpPmh0dHA6Ly9leGFtcGxlLm9yZy9hcmNoaXZlLnRhcjwvaT4gYW5kIGNvbXByZXNzZXMgaXQKLXRvIDxpPmFyY2hpdmUudGFyLmd6PC9pPiBpbiB0aGUgcHJvamVjdCdzIGJhc2VkaXIgb24gdGhlIGZseS48L3A+Cis8cHJlPiZsdDtnemlwIHNyYz0mcXVvdDt0ZXN0LnRhciZxdW90OyBkZXN0ZmlsZT0mcXVvdDt0ZXN0LnRhci5neiZxdW90Oy8mZ3Q7PC9wcmU+Cis8cHJlPiZsdDtiemlwMiBzcmM9JnF1b3Q7dGVzdC50YXImcXVvdDsgZGVzdGZpbGU9JnF1b3Q7dGVzdC50YXIuYnoyJnF1b3Q7LyZndDs8L3ByZT4KKzxwcmU+Jmx0O3h6IHNyYz0mcXVvdDt0ZXN0LnRhciZxdW90OyBkZXN0ZmlsZT0mcXVvdDt0ZXN0LnRhci54eiZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPkRvd25sb2FkIDxzYW1wPmh0dHBzOi8vZXhhbXBsZS5vcmcvYXJjaGl2ZS50YXI8L3NhbXA+IGFuZCBjb21wcmVzcyBpdAordG8gPHNhbXA+YXJjaGl2ZS50YXIuZ3o8L3NhbXA+IGluIHRoZSBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+IG9uIHRoZSBmbHkuPC9wPgorPHByZT4KKyZsdDtnemlwIGRlc3RmaWxlPSZxdW90O2FyY2hpdmUudGFyLmd6JnF1b3Q7Jmd0OworICAmbHQ7dXJsIHVybD0iaHR0cHM6Ly9leGFtcGxlLm9yZy9hcmNoaXZlLnRhciIvJmd0OworJmx0Oy9nemlwJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcGFyYWxsZWwuaHRtbCBiL21hbnVhbC9UYXNrcy9wYXJhbGxlbC5odG1sCmluZGV4IDM2MmRhZjMuLmRhNGI0NTcgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9wYXJhbGxlbC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9wYXJhbGxlbC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlBhcmFsbGVsIFRhc2s8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjYsMTM4ICsyNiwxMjYgQEAKIAogPGgyPlBhcmFsbGVsPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD4KLSAgICBFeGVjdXRlcyBuZXN0ZWQgdGFza3MgaW4gcGFyYWxsZWwgd2l0aCBubyBndWFyYW50ZWVzIG9mIHRocmVhZCBzYWZldHkuCi0gICAgRXZlcnkgdGFzayB3aWxsIHJ1biBpbiBpdHMgb3duIHRocmVhZCwgd2l0aCB0aGUgbGlrZWxpaG9vZCBvZiAKLSAgICBjb25jdXJyZW5jeSBwcm9ibGVtcyBzY2FsaW5nIHdpdGggdGhlIG51bWJlciBvZiBDUFVzIG9uIHRoZSBob3N0IHN5c3RlbS4KLTwvcD4KLTxwPjxiPldhcm5pbmc6PC9iPiBXaGlsZSB0aGUgQXBhY2hlIEFudCBjb3JlIGlzIGJlbGlldmVkIHRvIGJlIHRocmVhZCBzYWZlLCBubyBzdWNoIAotICAgIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgdGFza3MsIHdoaWNoIGFyZSBub3QgdGVzdGVkIGZvciB0aHJlYWQgc2FmZXR5IGR1cmluZwotICAgIEFudCdzIHRlc3QgcHJvY2Vzcy4gCi0gICAgVGhpcmQgcGFydHkgdGFza3MgbWF5IG9yIG1heSBub3QgYmUgdGhyZWFkIHNhZmUsIGFuZCBzb21lIG9mIEFudCdzIGNvcmUgdGFza3MsIHN1Y2ggYXMKLSAgICA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiBhcmUgZGVmaW5pdGVseSBub3QgcmUtZW50cmFudC4gVGhpcyBpcyBiZWNhdXNlIHRoZXkgdXNlIGxpYnJhcmllcyB0aGF0Ci0gICAgd2VyZSBuZXZlciBkZXNpZ25lZCB0byBiZSB1c2VkIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC4KLTwvcD4KLTxwPgotICAgIFRoZSBwcmltYXJ5IHVzZSBjYXNlIGZvciA8Y29kZT4mbHQ7cGFyYWxsZWwmZ3Q7PC9jb2RlPiBpcyB0byBydW4gZXh0ZXJuYWwgcHJvZ3JhbXMKLSAgICBzdWNoIGFzIGFuIGFwcGxpY2F0aW9uIHNlcnZlciwgYW5kIHRoZSBKVW5pdCBvciBUZXN0TkcgdGVzdCBzdWl0ZXMgYXQgdGhlCi0gICAgc2FtZSB0aW1lLiBBbnlvbmUgdHJ5aW5nIHRvIHJ1biBsYXJnZSBBbnQgdGFzayBzZXF1ZW5jZXMgaW4gcGFyYWxsZWwsIHN1Y2gKLSAgICBhcyBqYXZhZG9jIGFuZCBqYXZhYyBhdCB0aGUgc2FtZSB0aW1lLCBpcyBpbXBsaWNpdGx5IHRha2luZyBvbiB0aGUgdGFzawotICAgIG9mIGlkZW50aWZ5aW5nIGFuZCBmaXhpbmcgYWxsIGNvbmN1cnJlbmN5IGJ1Z3MgdGhlIHRhc2tzIHRoYXQgdGhleSBydW4uCi0gICAgCi08L3A+Ci08cD4KLSAgICBBY2NvcmRpbmdseSwgd2hpbGUgdGhpcyB0YXNrIGhhcyB1c2VzLCBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhZHZhbmNlZAotICAgIHRhc2sgd2hpY2ggc2hvdWxkIGJlIHVzZWQgaW4gY2VydGFpbiBiYXRjaC1wcm9jZXNzaW5nIG9yIHRlc3Rpbmcgc2l0dWF0aW9ucywKLSAgICByYXRoZXIgdGhhbiBhbiBlYXN5IHRyaWNrIHRvIHNwZWVkIHVwIGJ1aWxkIHRpbWVzIG9uIGEgbXVsdGl3YXkgQ1BVLiAKLTwvcD4KKzxwPkV4ZWN1dGVzIG5lc3RlZCB0YXNrcyBpbiBwYXJhbGxlbCB3aXRoIG5vIGd1YXJhbnRlZXMgb2YgdGhyZWFkIHNhZmV0eS4gIEV2ZXJ5IHRhc2sgd2lsbCBydW4gaW4KK2l0cyBvd24gdGhyZWFkLCB3aXRoIHRoZSBsaWtlbGlob29kIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zIHNjYWxpbmcgd2l0aCB0aGUgbnVtYmVyIG9mIENQVXMgb24gdGhlCitob3N0IHN5c3RlbS48L3A+Cis8cD48c3Ryb25nPldhcm5pbmc8L3N0cm9uZz46IFdoaWxlIHRoZSBBcGFjaGUgQW50IGNvcmUgaXMgYmVsaWV2ZWQgdG8gYmUgdGhyZWFkIHNhZmUsIG5vIHN1Y2gKK2d1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgdGFza3MsIHdoaWNoIGFyZSBub3QgdGVzdGVkIGZvciB0aHJlYWQgc2FmZXR5IGR1cmluZyBBbnQncyB0ZXN0IHByb2Nlc3MuCitUaGlyZCBwYXJ0eSB0YXNrcyBtYXkgb3IgbWF5IG5vdCBiZSB0aHJlYWQgc2FmZSwgYW5kIHNvbWUgb2YgQW50J3MgY29yZSB0YXNrcywgc3VjaAorYXMgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gYXJlIGRlZmluaXRlbHkgbm90IHJlLWVudHJhbnQuIFRoaXMgaXMgYmVjYXVzZSB0aGV5IHVzZSBsaWJyYXJpZXMgdGhhdAord2VyZSBuZXZlciBkZXNpZ25lZCB0byBiZSB1c2VkIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudC48L3A+Cis8cD5UaGUgcHJpbWFyeSB1c2UgY2FzZSBmb3IgPGNvZGU+Jmx0O3BhcmFsbGVsJmd0OzwvY29kZT4gaXMgdG8gcnVuIGV4dGVybmFsIHByb2dyYW1zIHN1Y2ggYXMgYW4KK2FwcGxpY2F0aW9uIHNlcnZlciwgYW5kIHRoZSBKVW5pdCBvciBUZXN0TkcgdGVzdCBzdWl0ZXMgYXQgdGhlIHNhbWUgdGltZS4gQW55b25lIHRyeWluZyB0byBydW4gbGFyZ2UKK0FudCB0YXNrIHNlcXVlbmNlcyBpbiBwYXJhbGxlbCwgc3VjaCBhcyA8Y29kZT5qYXZhZG9jPC9jb2RlPiBhbmQgPGNvZGU+amF2YWM8L2NvZGU+IGF0IHRoZSBzYW1lCit0aW1lLCBpcyBpbXBsaWNpdGx5IHRha2luZyBvbiB0aGUgdGFzayBvZiBpZGVudGlmeWluZyBhbmQgZml4aW5nIGFsbCBjb25jdXJyZW5jeSBidWdzIHRoZSB0YXNrcyB0aGF0Cit0aGV5IHJ1bi48L3A+Cis8cD5BY2NvcmRpbmdseSwgd2hpbGUgdGhpcyB0YXNrIGhhcyB1c2VzLCBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhZHZhbmNlZCB0YXNrIHdoaWNoIHNob3VsZCBiZQordXNlZCBpbiBjZXJ0YWluIGJhdGNoIHByb2Nlc3Npbmcgb3IgdGVzdGluZyBzaXR1YXRpb25zLCByYXRoZXIgdGhhbiBhbiBlYXN5IHRyaWNrIHRvIHNwZWVkIHVwIGJ1aWxkCit0aW1lcyBvbiBhIG11bHRpY29yZSBDUFUuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRocmVhZENvdW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1heGltdW0gbnVtYmVycyBvZiB0aHJlYWQgdG8gdXNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnRocmVhZENvdW50PC90ZD4KKyAgICA8dGQ+TWF4aW11bSBudW1iZXJzIG9mIHRocmVhZCB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aHJlYWRzUGVyUHJvY2Vzc29yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIHBlciBhdmFpbGFibGUgcHJvY2Vzc29yCi0oSmF2YSAxLjQrKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmZXJzIHRvIHRocmVhZENvdW50PC90ZD4KKyAgICA8dGQ+dGhyZWFkc1BlclByb2Nlc3NvcjwvdGQ+CisgICAgPHRkPk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIHBlciBhdmFpbGFibGUgcHJvY2Vzc29yIChKYXZhIDEuNCspPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmVycyB0byA8dmFyPnRocmVhZENvdW50PC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZW91dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpb24gaXMgdGVybWluYXRlZDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnRpbWVvdXQ8L3RkPgorICAgIDx0ZD5OdW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSBleGVjdXRpb24gaXMgdGVybWluYXRlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uYW55PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIGFueSBvZiB0aGUgbmVzdGVkIHRhc2tzIGZhaWxzLCBleGVjdXRpb24gb2YgdGhlIHRhc2sgY29tcGxldGVzCi0gICAgICAgICAgICAgICAgICAgICBhdCB0aGF0IHBvaW50IHdpdGhvdXQgd2FpdGluZyBmb3IgYW55IG90aGVyIHRhc2tzIHRvIGNvbXBsZXRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZS48L3RkPgorICAgIDx0ZD5mYWlsb25hbnk8L3RkPgorICAgIDx0ZD5JZiBhbnkgb2YgdGhlIG5lc3RlZCB0YXNrcyBmYWlscywgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIGNvbXBsZXRlcyBhdCB0aGF0IHBvaW50IHdpdGhvdXQKKyAgICAgIHdhaXRpbmcgZm9yIGFueSBvdGhlciB0YXNrcyB0byBjb21wbGV0ZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT4uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9sbEludGVydmFsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkN1cnJlbnRseSBoYXMgbm8gZWZmZWN0PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDEwMDA8L3RkPgorICAgIDx0ZD5wb2xsSW50ZXJ2YWw8L3RkPgorICAgIDx0ZD5DdXJyZW50bHkgaGFzIG5vIGVmZmVjdDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjEwMDA8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxwPlBhcmFsbGVsIHRhc2tzIGhhdmUgYSBudW1iZXIgb2YgdXNlcyBpbiBhbiBBbnQgYnVpbGQgZmlsZSBpbmNsdWRpbmc6PC9wPgogPHVsPgotPGxpPlRha2luZyBhZHZhbnRhZ2Ugb2YgYXZhaWxhYmxlIHByb2Nlc3NpbmcgcmVzb3VyY2VzIHRvIGV4ZWN1dGUgZXh0ZXJuYWwKLSBwcm9ncmFtcyBzaW11bHRhbmVvdXNseS48L2xpPgotPGxpPlRlc3Rpbmcgc2VydmVycywgd2hlcmUgdGhlIHNlcnZlciBjYW4gYmUgcnVuIGluIG9uZSB0aHJlYWQgYW5kIHRoZSB0ZXN0Ci1oYXJuZXNzIGlzIHJ1biBpbiBhbm90aGVyIHRocmVhZC48L2xpPgorICA8bGk+VGFraW5nIGFkdmFudGFnZSBvZiBhdmFpbGFibGUgcHJvY2Vzc2luZyByZXNvdXJjZXMgdG8gZXhlY3V0ZSBleHRlcm5hbCBwcm9ncmFtcworICAgIHNpbXVsdGFuZW91c2x5LjwvbGk+CisgIDxsaT5UZXN0aW5nIHNlcnZlcnMsIHdoZXJlIHRoZSBzZXJ2ZXIgY2FuIGJlIHJ1biBpbiBvbmUgdGhyZWFkIGFuZCB0aGUgdGVzdCBoYXJuZXNzIGlzIHJ1biBpbgorICAgIGFub3RoZXIgdGhyZWFkLjwvbGk+CiA8L3VsPgogCi08cD5BbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiBhCi1wYXJhbGxlbCB0YXNrLCBpbmNsdWRpbmcgb3RoZXIgcGFyYWxsZWwgdGFza3MsIHRob3VnaCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAotdGhlIHRhc2tzIHdpbGwgYmUgdGhyZWFkIHNhZmUgaW4gc3VjaCBhbiBlbnZpcm9ubWVudC48L3A+Cis8cD5BbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiBhIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrLCBpbmNsdWRpbmcKK290aGVyIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrcywgdGhvdWdoIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSB0YXNrcyB3aWxsIGJlIHRocmVhZCBzYWZlCitpbiBzdWNoIGFuIGVudmlyb25tZW50LjwvcD4KIAotPHA+V2hpbGUgdGhlIHRhc2tzIHdpdGhpbiB0aGUgcGFyYWxsZWwgdGFzayBhcmUgYmVpbmcgcnVuLCB0aGUgbWFpbgotdGhyZWFkIHdpbGwgYmUgYmxvY2tlZCB3YWl0aW5nIGZvciBhbGwgdGhlIGNoaWxkIHRocmVhZHMgdG8gY29tcGxldGUuIElmCi1leGVjdXRpb24gaXMgdGVybWluYXRlZCBieSBhIHRpbWVvdXQgb3IgYSBuZXN0ZWQgdGFzayBmYWlsdXJlIHdoZW4gdGhlCi08Y29kZT5mYWlsb25hbnk8L2NvZGU+Ci1mbGFnIGlzIHNldCwgdGhlIHBhcmFsbGVsIHRhc2sgd2lsbCBjb21wbGV0ZSB3aXRob3V0IHdhaXRpbmcgZm9yIG90aGVyIG5lc3RlZAotdGFza3MgdG8gY29tcGxldGUgaW4gb3RoZXIgdGhyZWFkcy4KLTwvcD4KKzxwPldoaWxlIHRoZSB0YXNrcyB3aXRoaW4gdGhlIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrIGFyZSBiZWluZyBydW4sIHRoZSBtYWluIHRocmVhZCB3aWxsIGJlCitibG9ja2VkIHdhaXRpbmcgZm9yIGFsbCB0aGUgY2hpbGQgdGhyZWFkcyB0byBjb21wbGV0ZS4gSWYgZXhlY3V0aW9uIGlzIHRlcm1pbmF0ZWQgYnkgYSB0aW1lb3V0IG9yIGEKK25lc3RlZCB0YXNrIGZhaWx1cmUgd2hlbiB0aGUgPHZhcj5mYWlsb25hbnk8L3Zhcj4gZmxhZyBpcyBzZXQsIHRoZSA8Y29kZT5wYXJhbGxlbDwvY29kZT4gdGFzayB3aWxsCitjb21wbGV0ZSB3aXRob3V0IHdhaXRpbmcgZm9yIG90aGVyIG5lc3RlZCB0YXNrcyB0byBjb21wbGV0ZSBpbiBvdGhlciB0aHJlYWRzLjwvcD4KIAotPHA+SWYgYW55IG9mIHRoZSB0YXNrcyB3aXRoaW4gdGhlIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+IHRhc2sgZmFpbHMgYW5kIGZhaWxvbmFueSBpcwotbm90IHNldCwgdGhlIHJlbWFpbmluZyB0YXNrcyBpbiBvdGhlciB0aHJlYWRzIHdpbGwgY29udGludWUgdG8gcnVuIHVudGlsCi1hbGwgdGhyZWFkcyBoYXZlIGNvbXBsZXRlZC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBwYXJhbGxlbCB0YXNrIHdpbGwgYWxzbyBmYWlsLjwvcD4KKzxwPklmIGFueSBvZiB0aGUgdGFza3Mgd2l0aGluIHRoZSA8Y29kZT4mbHQ7cGFyYWxsZWwmZ3Q7PC9jb2RlPiB0YXNrIGZhaWxzIGFuZCA8dmFyPmZhaWxvbmFueTwvdmFyPgoraXMgbm90IHNldCwgdGhlIHJlbWFpbmluZyB0YXNrcyBpbiBvdGhlciB0aHJlYWRzIHdpbGwgY29udGludWUgdG8gcnVuIHVudGlsIGFsbCB0aHJlYWRzIGhhdmUKK2NvbXBsZXRlZC4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSA8Y29kZT5wYXJhbGxlbDwvY29kZT4gdGFzayB3aWxsIGFsc28gZmFpbC48L3A+CiAKLTxwPlRoZSBwYXJhbGxlbCB0YXNrIG1heSBiZSBjb21iaW5lZCB3aXRoIHRoZSA8YSBocmVmPSJzZXF1ZW50aWFsLmh0bWwiPgotc2VxdWVudGlhbDwvYT4gdGFzayB0byBkZWZpbmUgc2VxdWVuY2VzIG9mIHRhc2tzIHRvIGJlIGV4ZWN1dGVkIG9uIGVhY2ggdGhyZWFkCi13aXRoaW4gdGhlIHBhcmFsbGVsIGJsb2NrPC9wPgorPHA+VGhlIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrIG1heSBiZSBjb21iaW5lZCB3aXRoIHRoZSA8YSBocmVmPSJzZXF1ZW50aWFsLmh0bWwiPnNlcXVlbnRpYWw8L2E+Cit0YXNrIHRvIGRlZmluZSBzZXF1ZW5jZXMgb2YgdGFza3MgdG8gYmUgZXhlY3V0ZWQgb24gZWFjaCB0aHJlYWQgd2l0aGluIHRoZSBwYXJhbGxlbCBibG9jay48L3A+CiAKLTxwPlRoZSA8Y29kZT50aHJlYWRDb3VudDwvY29kZT4gYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIHBsYWNlIGEgbWF4aW11bSBudW1iZXIgb2YgYXZhaWxhYmxlCi10aHJlYWRzIGZvciB0aGUgZXhlY3V0aW9uLiAgV2hlbiBub3QgcHJlc2VudCBhbGwgY2hpbGQgdGFza3Mgd2lsbCBiZSBleGVjdXRlZCBhdAotb25jZS4gIFdoZW4gcHJlc2VudCB0aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50bHkgZXhlY3V0aW5nIHRhc2tzIHdpbGwKLW5vdCBleGNlZWQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHNwZWNpZmllZC4gIEZ1cnRoZXJtb3JlLCBlYWNoIHRhc2sgd2lsbCBiZQotc3RhcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZ2l2ZW4uICBCdXQgbm8gZ3VhcmFudGVlIGlzIG1hZGUgYXMgdG8gdGhlIHNwZWVkCi1vZiBleGVjdXRpb24gb3IgdGhlIG9yZGVyIG9mIGNvbXBsZXRpb24gb2YgdGhlIHRhc2tzLCBvbmx5IHRoYXQgZWFjaCB3aWxsIGJlCi1zdGFydGVkIGJlZm9yZSB0aGUgbmV4dC48cD4KKzxwPlRoZSA8dmFyPnRocmVhZENvdW50PC92YXI+IGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBwbGFjZSBhIG1heGltdW0gbnVtYmVyIG9mIGF2YWlsYWJsZSB0aHJlYWRzCitmb3IgdGhlIGV4ZWN1dGlvbi4gIFdoZW4gbm90IHByZXNlbnQgYWxsIGNoaWxkIHRhc2tzIHdpbGwgYmUgZXhlY3V0ZWQgYXQgb25jZS4gIFdoZW4gcHJlc2VudCB0aGVuCit0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudGx5IGV4ZWN1dGluZyB0YXNrcyB3aWxsIG5vdCBleGNlZWQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHNwZWNpZmllZC4KK0Z1cnRoZXJtb3JlLCBlYWNoIHRhc2sgd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvcmRlciB0aGV5IGFyZSBnaXZlbi4gIEJ1dCBubyBndWFyYW50ZWUgaXMgbWFkZSBhcyB0bwordGhlIHNwZWVkIG9mIGV4ZWN1dGlvbiBvciB0aGUgb3JkZXIgb2YgY29tcGxldGlvbiBvZiB0aGUgdGFza3MsIG9ubHkgdGhhdCBlYWNoIHdpbGwgYmUgc3RhcnRlZAorYmVmb3JlIHRoZSBuZXh0LjxwPgogCi08cD5JZiB5b3UgYXJlIHVzaW5nIEphdmEgMS40IG9yIGxhdGVyIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDxjb2RlPnRocmVhZHNQZXJQcm9jZXNzb3I8L2NvZGU+Ci1hbmQgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdGhyZWFkcyB3aWxsIGJlIHRoZSBzdGF0ZWQgbXVsdGlwbGUgb2YgdGhlIG51bWJlciBvZgotcHJvY2Vzc29ycyAodGhlcmUgaXMgbm8gYWZmaW5pdHkgdG8gYSBwYXJ0aWN1bGFyIHByb2Nlc3NvciBob3dldmVyKS4gIFRoaXMgd2lsbAotb3ZlcnJpZGUgdGhlIHZhbHVlIGluIDxjb2RlPnRocmVhZENvdW50PC9jb2RlPi4gIElmIDxjb2RlPnRocmVhZHNQZXJQcm9jZXNzb3I8L2NvZGU+Ci1pcyBzcGVjaWZpZWQgb24gYW55IG9sZGVyIEpWTSwgdGhlbiB0aGUgdmFsdWUgaW4gPGNvZGU+dGhyZWFkQ291bnQ8L2NvZGU+IHdpbGwgYmUgdXNlZCBhcyBpcy48L3A+Cis8cD5JZiB5b3UgYXJlIHVzaW5nIEphdmEgMS40IG9yIGxhdGVyIHlvdSBjYW4gYWxzbyB1c2UgdGhlIDx2YXI+dGhyZWFkc1BlclByb2Nlc3NvcjwvdmFyPiBhbmQgdGhlCitudW1iZXIgb2YgYXZhaWxhYmxlIHRocmVhZHMgd2lsbCBiZSB0aGUgc3RhcnRlZCBtdWx0aXBsZSBvZiB0aGUgbnVtYmVyIG9mIHByb2Nlc3NvcnMgKHRoZXJlIGlzIG5vCithZmZpbml0eSB0byBhIHBhcnRpY3VsYXIgcHJvY2Vzc29yLCBob3dldmVyKS4gIFRoaXMgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUKK2luIDx2YXI+dGhyZWFkQ291bnQ8L3Zhcj4uICBJZiA8dmFyPnRocmVhZHNQZXJQcm9jZXNzb3I8L3Zhcj4gaXMgc3BlY2lmaWVkIG9uIGFueSBvbGRlciBKVk0sIHRoZW4KK3RoZSB2YWx1ZSBpbiA8dmFyPnRocmVhZENvdW50PC92YXI+IHdpbGwgYmUgdXNlZCBhcyBpcy48L3A+CiAKLTxwPldoZW4gdXNpbmcgPGNvZGU+dGhyZWFkQ291bnQ8L2NvZGU+IGFuZCAgPGNvZGU+dGhyZWFkc1BlclByb2Nlc3NvcjwvY29kZT4gCi0gICAgY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQgdGhlIGJ1aWxkIGRvZXMgbm90IGRlYWRsb2NrLiAgCi0gICAgVGhpcyBjYW4gYmUgY2F1c2VkIGJ5IHRhc2tzIHN1Y2ggYXMgPGNvZGU+d2FpdGZvcjwvY29kZT4KLSAgICB0YWtpbmcgdXAgYWxsIGF2YWlsYWJsZSB0aHJlYWRzIGJlZm9yZSB0aGUgdGFza3MgdGhhdCB3b3VsZCB1bmxvY2sgdGhlIAotICAgIDxjb2RlPndhaXRmb3I8L2NvZGU+Ci13b3VsZCBvY2N1ci4gIFRoaXMgaXMgbm90IGEgcmVwbGFjZW1lbnQgZm9yIEphdmEgTGFuZ3VhZ2UgbGV2ZWwgdGhyZWFkCi1zZW1hbnRpY3MgYW5kIGlzIGJlc3QgdXNlZCBmb3IgImVtYmFyYXNzaW5nbHkgcGFyYWxsZWwiIHRhc2tzLjwvcD4KLQorPHA+V2hlbiB1c2luZyA8dmFyPnRocmVhZENvdW50PC92YXI+IGFuZCA8dmFyPnRocmVhZHNQZXJQcm9jZXNzb3I8L3Zhcj4gY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8KK2Vuc3VyZSB0aGF0IHRoZSBidWlsZCBkb2VzIG5vdCBkZWFkbG9jay4gIFRoaXMgY2FuIGJlIGNhdXNlZCBieSB0YXNrcyBzdWNoIGFzIDxjb2RlPndhaXRmb3I8L2NvZGU+Cit0YWtpbmcgdXAgYWxsIGF2YWlsYWJsZSB0aHJlYWRzIGJlZm9yZSB0aGUgdGFza3MgdGhhdCB3b3VsZCB1bmxvY2sgdGhlIDxjb2RlPndhaXRmb3I8L2NvZGU+IHdvdWxkCitvY2N1ci4gIFRoaXMgaXMgbm90IGEgcmVwbGFjZW1lbnQgZm9yIEphdmEgTGFuZ3VhZ2UgbGV2ZWwgdGhyZWFkIHNlbWFudGljcyBhbmQgaXMgYmVzdCB1c2VkIGZvcgorImVtYmFycmFzc2luZ2x5IHBhcmFsbGVsIiB0YXNrcy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+ZGFlbW9uczwvaDQ+Ci08cD4KLVRoZSBwYXJhbGxlbCB0YXNrIHN1cHBvcnRzIGEgPGNvZGU+Jmx0O2RhZW1vbnMmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudC4gVGhpcyBpcyBhIGxpc3Qgb2YgdGFza3MKLXdoaWNoIGFyZSB0byBiZSBydW4gaW4gcGFyYWxsZWwgZGFlbW9uIHRocmVhZHMuIFRoZSBwYXJhbGxlbCB0YXNrIHdpbGwgbm90IHdhaXQgZm9yCi10aGVzZSB0YXNrcyB0byBjb21wbGV0ZS4gQmVpbmcgZGFlbW9uIHRocmVhZHMsIGhvd2V2ZXIsIHRoZXkgd2lsbCBub3QgcHJldmVudCBBbnQgZnJvbQotY29tcGxldGluZywgd2hlcmV1cG9uIHRoZSB0aHJlYWRzIGFyZSB0ZXJtaW5hdGVkLiBGYWlsdXJlcyBpbiBkYWVtb24gdGhyZWFkcyB3aGljaAotb2NjdXIgYmVmb3JlIHRoZSBwYXJhbGxlbCB0YXNrIGl0c2VsZiBmaW5pc2hlcyB3aWxsIGJlIHJlcG9ydGVkIGFuZCBjYW4gY2F1c2UKLXBhcmFsbGVsIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4gRmFpbHVyZXMgd2hpY2ggb2NjdXIgYWZ0ZXIgcGFyYWxsZWwgaGFzIGNvbXBsZXRlZCBhcmUgbm90Ci1yZXBvcnRlZC4KLTwvcD4KKzxwPlRoZSA8Y29kZT5wYXJhbGxlbDwvY29kZT4gdGFzayBzdXBwb3J0cyBhIDxjb2RlPiZsdDtkYWVtb25zJmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQuIFRoaXMgaXMgYQorbGlzdCBvZiB0YXNrcyB3aGljaCBhcmUgdG8gYmUgcnVuIGluIHBhcmFsbGVsIGRhZW1vbiB0aHJlYWRzLiBUaGUgPGNvZGU+cGFyYWxsZWw8L2NvZGU+IHRhc2sgd2lsbAorbm90IHdhaXQgZm9yIHRoZXNlIHRhc2tzIHRvIGNvbXBsZXRlLiBCZWluZyBkYWVtb24gdGhyZWFkcywgaG93ZXZlciwgdGhleSB3aWxsIG5vdCBwcmV2ZW50IEFudCBmcm9tCitjb21wbGV0aW5nLCB3aGVyZXVwb24gdGhlIHRocmVhZHMgYXJlIHRlcm1pbmF0ZWQuIEZhaWx1cmVzIGluIGRhZW1vbiB0aHJlYWRzIHdoaWNoIG9jY3VyIGJlZm9yZQordGhlIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiB0YXNrIGl0c2VsZiBmaW5pc2hlcyB3aWxsIGJlIHJlcG9ydGVkIGFuZCBjYW4gY2F1c2UgPGNvZGU+cGFyYWxsZWw8L2NvZGU+Cit0byB0aHJvdyBhbiBleGNlcHRpb24uIEZhaWx1cmVzIHdoaWNoIG9jY3VyIGFmdGVyIDxjb2RlPnBhcmFsbGVsPC9jb2RlPiBoYXMgY29tcGxldGVkIGFyZSBub3QKK3JlcG9ydGVkLjwvcD4KIAotPHA+RGFlbW9uIHRhc2tzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gc3RhcnQgdGVzdCBzZXJ2ZXJzIHdoaWNoIG1pZ2h0IG5vdCBiZSBlYXNpbHkKLXRlcm1pbmF0ZWQgZnJvbSBBbnQuIEJ5IHVzaW5nIDxjb2RlPiZsdDtkYWVtb25zJmd0OzwvY29kZT4gc3VjaCBzZXJ2ZXJzIGRvIG5vdCBoYWx0IHRoZSBidWlsZC4KLTwvcD4KLQorPHA+RGFlbW9uIHRhc2tzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gc3RhcnQgdGVzdCBzZXJ2ZXJzIHdoaWNoIG1pZ2h0IG5vdCBiZSBlYXNpbHkgdGVybWluYXRlZAorZnJvbSBBbnQuIEJ5IHVzaW5nIDxjb2RlPiZsdDtkYWVtb25zJmd0OzwvY29kZT4gc3VjaCBzZXJ2ZXJzIGRvIG5vdCBoYWx0IHRoZSBidWlsZC48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Cis8cD5UaGlzIGlzIGEgdHlwaWNhbCBwYXR0ZXJuIGZvciB0ZXN0aW5nIGEgc2VydmVyIGFwcGxpY2F0aW9uLiBJbiBvbmUgdGhyZWFkIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZAorKHRoZSA8Y29kZT4mbHQ7d2xydW4mZ3Q7PC9jb2RlPiB0YXNrKS4gVGhlIG90aGVyIHRocmVhZCBjb25zaXN0cyBvZiBhIHRocmVlIHRhc2tzIHdoaWNoIGFyZQorcGVyZm9ybWVkIGluIHNlcXVlbmNlLiBUaGUgPGNvZGU+Jmx0O3NsZWVwJmd0OzwvY29kZT4gdGFzayBpcyB1c2VkIHRvIGdpdmUgdGhlIHNlcnZlciB0aW1lIHRvIGNvbWUKK3VwLiBBbm90aGVyIHRhc2sgd2hpY2ggaXMgY2FwYWJsZSBvZiB2YWxpZGF0aW5nIHRoYXQgdGhlIHNlcnZlciBpcyBhdmFpbGFibGUgY291bGQgYmUgdXNlZCBpbiBwbGFjZQorb2YgdGhlIDxjb2RlPiZsdDtzbGVlcCZndDs8L2NvZGU+IHRhc2suIFRoZSA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0ZXN0IGhhcm5lc3MgdGhlbiBydW5zLCBhZ2FpbgoraW4gaXRzIG93biBKVk0uIE9uY2UgdGhlIHRlc3RzIGFyZSBjb21wbGV0ZSwgdGhlIHNlcnZlciBpcyBzdG9wcGVkCisodXNpbmcgPGNvZGU+Jmx0O3dsc3RvcCZndDs8L2NvZGU+IGluIHRoaXMgZXhhbXBsZSksIGFsbG93aW5nIGJvdGggdGhyZWFkcyB0bworY29tcGxldGUuIFRoZSA8Y29kZT4mbHQ7cGFyYWxsZWwmZ3Q7PC9jb2RlPiB0YXNrIHdpbGwgYWxzbyBjb21wbGV0ZSBhdCB0aGlzIHRpbWUgYW5kIHRoZSBidWlsZCB3aWxsCit0aGVuIGNvbnRpbnVlLjwvcD4KKwogPHByZT4KICZsdDtwYXJhbGxlbCZndDsKICAgJmx0O3dscnVuIC4uLiAmZ3Q7CkBAIC0xNjYsNzAgKzE1NCw1MCBAQAogICAgICZsdDtqdW5pdCBmb3JrPSJ0cnVlIiBmb3JrbW9kZT0ib25jZSIgLi4uICZndDsKICAgICAmbHQ7d2xzdG9wLyZndDsKICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotJmx0Oy9wYXJhbGxlbCZndDsKLTwvcHJlPgotPHA+VGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSB0eXBpY2FsIHBhdHRlcm4gZm9yIHRlc3RpbmcgYSBzZXJ2ZXIgYXBwbGljYXRpb24uCi1JbiBvbmUgdGhyZWFkIHRoZSBzZXJ2ZXIgaXMgc3RhcnRlZCAodGhlIDxjb2RlPiZsdDt3bHJ1biZndDs8L2NvZGU+IHRhc2spLiAKLVRoZSBvdGhlciB0aHJlYWQgY29uc2lzdHMKLW9mIGEgdGhyZWUgdGFza3Mgd2hpY2ggYXJlIHBlcmZvcm1lZCBpbiBzZXF1ZW5jZS4gVGhlIDxjb2RlPiZsdDtzbGVlcCZndDs8L2NvZGU+IHRhc2sgaXMgdXNlZCB0bwotZ2l2ZSB0aGUgc2VydmVyIHRpbWUgdG8gY29tZSB1cC4gQW5vdGhlciB0YXNrIHdoaWNoIGlzIGNhcGFibGUgb2YgdmFsaWRhdGluZwotdGhhdCB0aGUgc2VydmVyIGlzIGF2YWlsYWJsZSBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSA8Y29kZT4mbHQ7c2xlZXAmZ3Q7PC9jb2RlPiB0YXNrLiBUaGUKLTxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRlc3QgaGFybmVzcyB0aGVuIHJ1bnMsIGFnYWluIGluIGl0cyBvd24gSlZNLiBPbmNlIHRoZSB0ZXN0cyBhcmUgY29tcGxldGUsIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZAotKHVzaW5nIDxjb2RlPiZsdDt3bHN0b3AmZ3Q7PC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUpLCBhbGxvd2luZyBib3RoIHRocmVhZHMgdG8gY29tcGxldGUuIFRoZQotPGNvZGU+Jmx0O3BhcmFsbGVsJmd0OzwvY29kZT4gdGFzayB3aWxsIGFsc28gY29tcGxldGUgYXQgdGhpcyB0aW1lIGFuZCB0aGUgYnVpbGQgd2lsbCB0aGVuCi1jb250aW51ZS48L3A+CismbHQ7L3BhcmFsbGVsJmd0OzwvcHJlPgorCis8cD5IZXJlLCB0d28gaW5kZXBlbmRlbnQgdGFza3MgcnVuIHRvIGFjaGlldmUgYmV0dGVyIHJlc291cmNlIHV0aWxpemF0aW9uIGR1cmluZyB0aGUgYnVpbGQuIEluIHRoaXMKK2luc3RhbmNlLCBzb21lIHNlcnZsZXRzIGFyZSBiZWluZyBjb21waWxlZCBpbiBvbmUgdGhyZWFkIGFuZCBhIHNldCBvZiBKU1BzIGlzIGJlaW5nIHByZWNvbXBpbGVkIGluCithbm90aGVyLiBEZXZlbG9wZXJzIG5lZWQgdG8gYmUgY2FyZWZ1bCB0aGF0IHRoZSB0d28gdGFza3MgYXJlIGluZGVwZW5kZW50LCBib3RoIGluIHRlcm1zIG9mIHRoZWlyCitkZXBlbmRlbmNpZXMgYW5kIGluIHRlcm1zIG9mIHRoZWlyIHBvdGVudGlhbCBpbnRlcmFjdGlvbnMgaW4gQW50J3MgZXh0ZXJuYWwgZW52aXJvbm1lbnQuIEhlcmUgd2UKK3NldCA8dmFyPmZvcms8L3Zhcj49PHE+dHJ1ZTwvcT4gZm9yIHRoZSA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB0YXNrLCBzbyB0aGF0IGl0IHJ1bnMgaW4gYSBuZXcKK3Byb2Nlc3M7IGlmIHRoZSA8Y29kZT4mbHQ7d2xqc3BjJmd0OzwvY29kZT4gdGFzayB1c2VkIHRoZSA8a2JkPmphdmFjPC9rYmQ+IGNvbXBpbGVyIGluLVZNIChpdCBtYXkpLAorY29uY3VycmVuY3kgcHJvYmxlbXMgbWF5IGFyaXNlLjwvcD4KIAogPHByZT4KICZsdDtwYXJhbGxlbCZndDsKICAgJmx0O2phdmFjIGZvcms9InRydWUiLi4uJmd0OyAmbHQ7IS0tIGNvbXBpbGVyIHNlcnZsZXQgY29kZSAtLSZndDsKICAgJmx0O3dsanNwYyAuLi4mZ3Q7ICZsdDshLS0gcHJlY29tcGlsZSBKU1BzIC0tJmd0OwotJmx0Oy9wYXJhbGxlbCZndDsKLTwvcHJlPgorJmx0Oy9wYXJhbGxlbCZndDs8L3ByZT4KIAotPHA+VGhpcyBleGFtcGxlIHNob3dzIHR3byBpbmRlcGVuZGVudCB0YXNrcyBiZWluZyBydW4gdG8gYWNoaWV2ZSBiZXR0ZXIKLXJlc291cmNlIHV0aWxpemF0aW9uIGR1cmluZyB0aGUgYnVpbGQuIEluIHRoaXMgaW5zdGFuY2UsIHNvbWUgc2VydmxldHMgYXJlIGJlaW5nCi1jb21waWxlZCBpbiBvbmUgdGhlYWQgYW5kIGEgc2V0IG9mIEpTUHMgaXMgYmVpbmcgcHJlY29tcGlsZWQgaW4gYW5vdGhlci4gRGV2ZWxvcGVycwotbmVlZCB0byBiZSBjYXJlZnVsIHRoYXQgdGhlIHR3byB0YXNrcyBhcmUgaW5kZXBlbmRlbnQsIGJvdGggaW4KLXRlcm1zIG9mIHRoZWlyIGRlcGVuZGVuY2llcyBhbmQgaW4gdGVybXMgb2YgdGhlaXIgcG90ZW50aWFsIGludGVyYWN0aW9ucyBpbgotQW50J3MgZXh0ZXJuYWwgZW52aXJvbm1lbnQuIEhlcmUgd2Ugc2V0IDxjb2RlPmZvcms9InRydWUiPC9jb2RlPiBmb3IgdGhlIAotPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzaywgc28gdGhhdCBpdCBydW5zIGluIGEgbmV3IHByb2Nlc3M7IAotaWYgdGhlIDxjb2RlPiZsdDt3bGpzcGMmZ3Q7PC9jb2RlPiB0YXNrIHVzZWQgdGhlIGphdmFjIGNvbXBpbGVyIGluLVZNCi0oaXQgbWF5KSwgY29uY3VycmVuY3kgcHJvYmxlbXMgbWF5IGFyaXNlLgotPC9wPgorPHA+VGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSB0eXBpY2FsIG5lZWQgZm9yIHVzZSBvZiB0aGUgPHZhcj50aHJlYWRDb3VudDwvdmFyPgorYW5kIDx2YXI+dGhyZWFkc1BlclByb2Nlc3NvcjwvdmFyPiBhdHRyaWJ1dGVzLiBTcGlubmluZyB1cCBhbGwgNDAgb2YgdGhvc2UgdGFza3MgY291bGQgY3JpcHBsZSB0aGUKK3N5c3RlbSBmb3IgbWVtb3J5IGFuZCBDUFUgdGltZS4gQnkgbGltaXRpbmcgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGV4ZWN1dGlvbnMgeW91IGNhbiByZWR1Y2UKK2NvbnRlbnRpb24gZm9yIENQVSwgbWVtb3J5IGFuZCBkaXNrIElPLCBhbmQgc28gYWN0dWFsbHkgZmluaXNoIGZhc3Rlci4gVGhpcyBpcyBhbHNvIGEgZ29vZCBjYW5kaWRhdGUKK2ZvciB1c2Ugb2YgPHZhcj50aHJlYWRDb3VudDwvdmFyPiAoYW5kIHBvc3NpYmx5IDx2YXI+dGhyZWFkc1BlclByb2Nlc3NvcjwvdmFyPikgYmVjYXVzZSBlYWNoIHRhc2sgaXMKK2luZGVwZW5kZW50IChldmVyeSBuZXcgSlZNIGlzIGZvcmtlZCkgYW5kIGhhcyBubyBkZXBlbmRlbmNpZXMgb24gdGhlIG90aGVyIHRhc2tzLjwvcD4KIAogPHByZT4KICAmbHQ7bWFjcm9kZWYgbmFtZT0iZGJwdXJnZSImZ3Q7CiAgICAgJmx0O2F0dHJpYnV0ZSBmaWxlPSJmaWxlIi8mZ3Q7CiAgICAmbHQ7c2VxdWVudGlhbCZndDsKICAgICAgICZsdDtqYXZhIGphcj0idXRpbHMvZGJwdXJnZS5qYXIiIGZvcms9InRydWUiICZndDsKLSAgICAgICAgJmx0O2FyZyBmaWxlPSJAe2ZpbGV9IC8mZ3Q7CisgICAgICAgICZsdDthcmcgZmlsZT0iQHtmaWxlfS8mZ3Q7CiAgICAgICAmbHQ7L2phdmEmZ3Q7CiAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CiAmbHQ7L21hY3JvZGVmJmd0OwotICAgIAorCiAmbHQ7cGFyYWxsZWwgdGhyZWFkQ291bnQ9IjQiJmd0OwotICAmbHQ7ZGJwdXJnZSBmaWxlPSJkYi9vbmUiIC8mZ3Q7Ci0gICZsdDtkYnB1cmdlIGZpbGU9ImRiL3R3byIgLyZndDsKLSAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvdGhyZWUiIC8mZ3Q7Ci0gICZsdDtkYnB1cmdlIGZpbGU9ImRiL2ZvdXIiIC8mZ3Q7Ci0gICZsdDtkYnB1cmdlIGZpbGU9ImRiL2ZpdmUiIC8mZ3Q7Ci0gICZsdDtkYnB1cmdlIGZpbGU9ImRiL3NpeCIgLyZndDsKLSAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvc2V2ZW4iIC8mZ3Q7Ci0gICZsdDtkYnB1cmdlIGZpbGU9ImRiL2VpZ2h0IiAvJmd0OworICAmbHQ7ZGJwdXJnZSBmaWxlPSJkYi9vbmUiLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvdHdvIi8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL3RocmVlIi8mZ3Q7CisgICZsdDtkYnB1cmdlIGZpbGU9ImRiL2ZvdXIiLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvZml2ZSIvJmd0OworICAmbHQ7ZGJwdXJnZSBmaWxlPSJkYi9zaXgiLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvc2V2ZW4iLyZndDsKKyAgJmx0O2RicHVyZ2UgZmlsZT0iZGIvZWlnaHQiLyZndDsKICAgJmx0OyEtLSByZXBlYXRlZCBhYm91dCA0MCB0aW1lcyAtLSZndDsKLSZsdDsvcGFyYWxsZWwmZ3Q7Ci08L3ByZT4KLQotPHA+VGhpcyBleGFtcGxlIHJlcHJlc2VudHMgYSB0eXBpY2FsIG5lZWQgZm9yIHVzZSBvZiB0aGUgdGhyZWFkQ291bnQgYW5kCi10aHJlYWRzUGVyUHJvY2Vzc29yIGF0dHJpYnV0ZXMuICBTcGlubmluZyB1cCBhbGwgNDAgb2YgdGhvc2UgdGFza3MgY291bGQgY3JpcHBsZQotdGhlIHN5c3RlbSBmb3IgbWVtb3J5IGFuZCBDUFUgdGltZS4gIEJ5IGxpbWl0aW5nIHRoZSBudW1iZXIgb2YKLWNvbmN1cnJlbnQgZXhlY3V0aW9ucyB5b3UgY2FuIHJlZHVjZSBjb250ZW50aW9uIGZvciBDUFUsIG1lbW9yeSBhbmQgZGlzayBJTywgCi1hbmQgc28gYWN0dWFsbHkgZmluaXNoIGZhc3Rlci4gIFRoaXMgaXMgYWxzbyBhIGdvb2QKLWNhbmRpZGF0ZSBmb3IgdXNlIG9mIHRocmVhZENvdW50IChhbmQgcG9zc2libHkgdGhyZWFkc1BlclByb2Nlc3NvcikgYmVjYXVzZQotZWFjaCB0YXNrIGlzIGluZGVwZW5kZW50IChldmVyeSBuZXcgSlZNIGlzIGZvcmtlZCkgYW5kIGhhcyBubyBkZXBlbmRlbmNpZXMgb24KLXRoZSBvdGhlciB0YXNrcy48L3A+Ci0KKyZsdDsvcGFyYWxsZWwmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3BhdGNoLmh0bWwgYi9tYW51YWwvVGFza3MvcGF0Y2guaHRtbAppbmRleCA5NmE1ZWU5Li5lNzY5NTEyIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcGF0Y2guaHRtbAorKysgYi9tYW51YWwvVGFza3MvcGF0Y2guaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDk4ICsxNSw5MSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UGF0Y2ggVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icGF0Y2giPlBhdGNoPC9hPjwvaDI+Cis8aDIgaWQ9InBhdGNoIj5QYXRjaDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+QXBwbGllcyBhIGRpZmYgZmlsZSB0byBvcmlnaW5hbHMuIDsgcmVxdWlyZXMgInBhdGNoIiB0byBiZQotIG9uIHRoZSBleGVjdXRpb24gcGF0aC4gIDwvcD4KKzxwPkFwcGxpZXMgYSBkaWZmIGZpbGUgdG8gb3JpZ2luYWxzLiBSZXF1aXJlcyA8a2JkPnBhdGNoPC9rYmQ+IHRvIGJlIG9uIHRoZSBleGVjdXRpb24gcGF0aC48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGNoZmlsZTwvdGQ+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGlmZiBvdXRwdXQ8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+cGF0Y2hmaWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUgdGhhdCBpbmNsdWRlcyB0aGUgZGlmZiBvdXRwdXQ8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vcmlnaW5hbGZpbGU8L3RkPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIHBhdGNoPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCB0cmllcyB0byBndWVzcyBpdCBmcm9tIHRoZSBkaWZmIAotICAgICAgZmlsZTwvdGQ+CisgICAgPHRkPm9yaWdpbmFsZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBmaWxlIHRvIHBhdGNoPC90ZD4KKyAgICA8dGQ+Tm87IHRyaWVzIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGRpZmYgZmlsZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RmaWxlPC90ZD4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSB0byBzZW5kIHRoZSBvdXRwdXQgdG8gaW5zdGVhZCBvZgotICAgICAgcGF0Y2hpbmcgdGhlIGZpbGUocykgaW4gcGxhY2UuICA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5Oby48L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBmaWxlIHRvIHNlbmQgdGhlIG91dHB1dCB0byBpbnN0ZWFkIG9mIHBhdGNoaW5nIHRoZSBmaWxlKHMpIGluIHBsYWNlLiAgPGVtPnNpbmNlIEFwYWNoZQorICAgICAgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYWNrdXBzPC90ZD4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5LZWVwIGJhY2t1cHMgb2YgdGhlIHVucGF0Y2hlZCBmaWxlczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmJhY2t1cHM8L3RkPgorICAgIDx0ZD5LZWVwIGJhY2t1cHMgb2YgdGhlIHVucGF0Y2hlZCBmaWxlczwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cXVpZXQ8L3RkPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPldvcmsgc2lsZW50bHkgdW5sZXNzIGFuIGVycm9yIG9jY3VyczwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnF1aWV0PC90ZD4KKyAgICA8dGQ+V29yayBzaWxlbnRseSB1bmxlc3MgYW4gZXJyb3Igb2NjdXJzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXZlcnNlPC90ZD4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5Bc3N1bWUgcGF0Y2ggd2FzIGNyZWF0ZWQgd2l0aCBvbGQgYW5kIG5ldyBmaWxlcyAKLSAgICAgIHN3YXBwZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cmV2ZXJzZTwvdGQ+CisgICAgPHRkPkFzc3VtZSBwYXRjaCB3YXMgY3JlYXRlZCB3aXRoIG9sZCBhbmQgbmV3IGZpbGVzIHN3YXBwZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmV3aGl0ZXNwYWNlPC90ZD4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5JZ25vcmUgd2hpdGVzcGFjZSBkaWZmZXJlbmNlcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pZ25vcmV3aGl0ZXNwYWNlPC90ZD4KKyAgICA8dGQ+SWdub3JlIHdoaXRlc3BhY2UgZGlmZmVyZW5jZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHJpcDwvdGQ+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RyaXAgdGhlIHNtYWxsZXN0IHByZWZpeCBjb250YWluaW5nIDxpPm51bTwvaT4gbGVhZGluZyAKLSAgICAgIHNsYXNoZXMgZnJvbSBmaWxlbmFtZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c3RyaXA8L3RkPgorICAgIDx0ZD5TdHJpcCB0aGUgc21hbGxlc3QgcHJlZml4IGNvbnRhaW5pbmcgPHE+bnVtPC9xPiBsZWFkaW5nIHNsYXNoZXMgZnJvbSBmaWxlbmFtZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXI8L3RkPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gcnVuIHRoZSBwYXRjaCBjb21tYW5kLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyB0aGUgcHJvamVjdCdzIGJhc2VkaXIuPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBydW4gdGhlIDxjb2RlPnBhdGNoPC9jb2RlPiBjb21tYW5kLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHRoZSBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYQotICAgICAgcmV0dXJuIGNvZGUgc2lnbmFsaW5nIGZhaWx1cmUuIERlZmF1bHRzIHRvIGZhbHNlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBjb21tYW5kIGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSBzaWduYWxpbmcgZmFpbHVyZS4gPGVtPnNpbmNlCisgICAgICBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgJmx0O3BhdGNoIHBhdGNoZmlsZT0mcXVvdDttb2R1bGUuMS4wLTEuMS5wYXRjaCZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5hcHBsaWVzIHRoZSBkaWZmIGluY2x1ZGVkIGluIDxpPm1vZHVsZS4xLjAtMS4xLnBhdGNoPC9pPiB0byB0aGUKLWZpbGVzIGluIGJhc2UgZGlyZWN0b3J5IGd1ZXNzaW5nIHRoZSBmaWxlbmFtZShzKSBmcm9tIHRoZSBkaWZmIG91dHB1dC48L3A+Ci08cHJlPiAgJmx0O3BhdGNoIHBhdGNoZmlsZT0mcXVvdDttb2R1bGUuMS4wLTEuMS5wYXRjaCZxdW90OyBzdHJpcD0mcXVvdDsxJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmxpa2UgYWJvdmUgYnV0IG9uZSBsZWFkaW5nIGRpcmVjdG9yeSBwYXJ0IHdpbGwgYmUgcmVtb3ZlZC4gaS5lLiBpZgotdGhlIGRpZmYgb3V0cHV0IGxvb2tlZCBsaWtlPC9wPgotPHByZT4KLS0tLSBhL21vZDEuMC9BCU1vbiBKdW4gIDUgMTc6Mjg6NDEgMjAwMAotKysrIGEvbW9kMS4xL0EJTW9uIEp1biAgNSAxNzoyODo0OSAyMDAwCi08L3ByZT4gCi10aGUgbGVhZGluZyA8aT5hLzwvaT4gd2lsbCBiZSBzdHJpcHBlZC4KIAorPHA+QXBwbHkgdGhlIGRpZmYgaW5jbHVkZWQgaW4gPHNhbXA+bW9kdWxlLjEuMC0xLjEucGF0Y2g8L3NhbXA+IHRvIHRoZSBmaWxlcyBpbiBiYXNlIGRpcmVjdG9yeQorZ3Vlc3NpbmcgdGhlIGZpbGVuYW1lKHMpIGZyb20gdGhlIGRpZmYgb3V0cHV0LjwvcD4KKzxwcmU+Jmx0O3BhdGNoIHBhdGNoZmlsZT0mcXVvdDttb2R1bGUuMS4wLTEuMS5wYXRjaCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkhlcmUsIG9uZSBsZWFkaW5nIGRpcmVjdG9yeSBwYXJ0IHdpbGwgYmUgcmVtb3ZlZDo8L3A+Cis8cHJlPiZsdDtwYXRjaCBwYXRjaGZpbGU9JnF1b3Q7bW9kdWxlLjEuMC0xLjEucGF0Y2gmcXVvdDsgc3RyaXA9JnF1b3Q7MSZxdW90Oy8mZ3Q7PC9wcmU+Cis8cD5pLmUuIGlmIHRoZSBkaWZmIG91dHB1dCBsb29rZWQgbGlrZTwvcD4KKzxwcmU+CistLS0gYS9tb2QxLjAvQSAgTW9uIEp1biAgNSAxNzoyODo0MSAyMDAwCisrKysgYS9tb2QxLjEvQSAgTW9uIEp1biAgNSAxNzoyODo0OSAyMDAwPC9wcmU+Cis8cD50aGUgbGVhZGluZyA8c2FtcD5hLzwvc2FtcD4gd2lsbCBiZSBzdHJpcHBlZC48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3BhdGhjb252ZXJ0Lmh0bWwgYi9tYW51YWwvVGFza3MvcGF0aGNvbnZlcnQuaHRtbAppbmRleCA0MWY1NmY0Li40ZDFlNWMzIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcGF0aGNvbnZlcnQuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcGF0aGNvbnZlcnQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDIxMSArMTUsMTY3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5QYXRoQ29udmVydCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJwYXRoY29udmVydCI+UGF0aGNvbnZlcnQ8L2E+PC9oMj4KKzxoMiBpZD0icGF0aGNvbnZlcnQiPlBhdGhjb252ZXJ0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5Db252ZXJ0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+Ci1SZXNvdXJjZUNvbGxlY3Rpb248L2E+cywgb3IgYSByZWZlcmVuY2UgdG8ganVzdCBvbmUsIGludG8gYSBwYXRoCi1mb3JtIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0sIG9wdGlvbmFsbHkgc3RvcmluZyB0aGUgcmVzdWx0IGludG8KLWEgZ2l2ZW4gcHJvcGVydHkuIEl0IGNhbiBhbHNvIGJlIHVzZWQgd2hlbiB5b3UgbmVlZAotdG8gY29udmVydCBhIFJlc291cmNlIENvbGxlY3Rpb24gaW50byBhIGxpc3QsIHNlcGFyYXRlZCBieSBhIGdpdmVuCi1jaGFyYWN0ZXIsIHN1Y2ggYXMgYSBjb21tYSBvciBzcGFjZSwgb3IsIGNvbnZlcnNlbHksIGUuZy4gdG8gY29udmVydCBhIGxpc3QKLW9mIGZpbGVzIGluIGEgRmlsZUxpc3QgaW50byBhIHBhdGguCi08L3A+Ci08cD5OZXN0ZWQgPGNvZGU+Jmx0O21hcCZndDs8L2NvZGU+IGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQgdG8gbWFwIFdpbmRvd3MKLWRyaXZlIGxldHRlcnMgdG8gVW5peCBwYXRocywgYW5kIHZpY2UtdmVyc2EuPC9wPgotPHA+TW9yZSBjb21wbGV4IHRyYW5zZm9ybWF0aW9ucyBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgYSBuZXN0ZWQKLTxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+Ci0oc2luY2UgQXBhY2hlIEFudCAxLjYuMikuCi08L3A+Cis8cD5Db252ZXJ0cyBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+LCBvciBhCityZWZlcmVuY2UgdG8ganVzdCBvbmUsIGludG8gYSBwYXRoIGZvcm0gZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSwgb3B0aW9uYWxseSBzdG9yaW5nIHRoZSByZXN1bHQKK2ludG8gYSBnaXZlbiBwcm9wZXJ0eS4gSXQgY2FuIGFsc28gYmUgdXNlZCB3aGVuIHlvdSBuZWVkIHRvIGNvbnZlcnQgYSByZXNvdXJjZSBjb2xsZWN0aW9uIGludG8gYQorbGlzdCwgc2VwYXJhdGVkIGJ5IGEgZ2l2ZW4gY2hhcmFjdGVyLCBzdWNoIGFzIGEgY29tbWEgb3Igc3BhY2UsIG9yLCBjb252ZXJzZWx5LCBlLmcuIHRvIGNvbnZlcnQgYQorbGlzdCBvZiBmaWxlcyBpbiBhIEZpbGVMaXN0IGludG8gYSBwYXRoLjwvcD4KKzxwPk5lc3RlZCA8Y29kZT4mbHQ7bWFwJmd0OzwvY29kZT4gZWxlbWVudHMgY2FuIGJlIHNwZWNpZmllZCB0byBtYXAgV2luZG93cyBkcml2ZSBsZXR0ZXJzIHRvIFVuaXgKK3BhdGhzLCBhbmQgdmljZS12ZXJzYS48L3A+Cis8cD5Nb3JlIGNvbXBsZXggdHJhbnNmb3JtYXRpb25zIGNhbiBiZSBhY2hpZXZlZCB1c2luZyBhCituZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gKDxlbT5zaW5jZSBBcGFjaGUgQW50CisxLjYuMjwvZW0+KS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0b3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiAgTXVzdCBiZSBvbmUgb2YgJ3VuaXgnLCAnd2luZG93cycsIAotICAgICAgICAnbmV0d2FyZScsICd0YW5kZW0nIG9yICdvcy8yJy4KLSAgICAgICAgVGhpcyBpcyBhIHNob3J0aGFuZCBtZWNoYW5pc20gZm9yIHNwZWNpZnlpbmcgYm90aAotICAgICAgICA8Y29kZT5wYXRoc2VwPC9jb2RlPiBhbmQgPGNvZGU+ZGlyc2VwPC9jb2RlPgotICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQgYXJjaGl0ZWN0dXJlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRhcmdldG9zPC90ZD4KKyAgICA8dGQ+VGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuICBNdXN0IGJlIG9uZQorICAgICAgICBvZiA8cT51bml4PC9xPiwgPHE+d2luZG93czwvcT4sIDxxPm5ldHdhcmU8L3E+LCA8cT50YW5kZW08L3E+IG9yIDxxPm9zLzI8L3E+LiAgVGhpcyBpcyBhCisgICAgICAgIHNob3J0aGFuZCBtZWNoYW5pc20gZm9yIHNwZWNpZnlpbmcgYm90aCA8dmFyPnBhdGhzZXA8L3Zhcj4gYW5kIDx2YXI+ZGlyc2VwPC92YXI+IGFjY29yZGluZworICAgICAgICB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBhcmNoaXRlY3R1cmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXJzZXA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgVGhlIGNoYXJhY3RlcihzKSB0byB1c2UgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4gdGhlCi0gICAgICAgZ2VuZXJhdGVkIHBhdGhzLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gY3VycmVudCBKVk0gPHR0PkZpbGUuc2VwYXJhdG9yPC90dD48L3RkPgorICAgIDx0ZD5kaXJzZXA8L3RkPgorICAgIDx0ZD5UaGUgY2hhcmFjdGVyKHMpIHRvIHVzZSBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpbiB0aGUgZ2VuZXJhdGVkIHBhdGhzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBjdXJyZW50IEpWTSA8Y29kZT5GaWxlLnNlcGFyYXRvcjwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoc2VwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgIFRoZSBjaGFyYWN0ZXIocykgdG8gdXNlIGFzIHRoZSBwYXRoLWVsZW1lbnQgc2VwYXJhdG9yIGluIHRoZQotICAgICAgIGdlbmVyYXRlZCBwYXRocy4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGN1cnJlbnQgSlZNIDx0dD5GaWxlLnBhdGhTZXBhcmF0b3I8L3R0PjwvdGQ+CisgICAgPHRkPnBhdGhzZXA8L3RkPgorICAgIDx0ZD5UaGUgY2hhcmFjdGVyKHMpIHRvIHVzZSBhcyB0aGUgcGF0aC1lbGVtZW50IHNlcGFyYXRvciBpbiB0aGUgZ2VuZXJhdGVkIHBhdGhzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBjdXJyZW50IEpWTSA8Y29kZT5GaWxlLnBhdGhTZXBhcmF0b3I8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBjb252ZXJ0ZWQgcGF0aC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIHJlc3VsdCB3aWxsIGJlIGxvZ2dlZCBpZiB1bnNldDwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSBjb252ZXJ0ZWQgcGF0aC48L3RkPgorICAgIDx0ZD5ObywgcmVzdWx0IHdpbGwgYmUgbG9nZ2VkIGlmIHVuc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hhdCB0byBjb252ZXJ0LCBnaXZlbiBhcyBhCi0gICAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhCi0gICAgICAgIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sCi0gICAgICAgIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiwgb3IgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4KLSAgICAgICAgZGVmaW5lZCBlbHNld2hlcmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGlmIG9taXR0ZWQsIGEgbmVzdGVkCi0gICAgICAgIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudCBtdXN0IGJlIHN1cHBsaWVkLjwvdGQ+CisgICAgPHRkPnJlZmlkPC90ZD4KKyAgICA8dGQ+V2hhdCB0byBjb252ZXJ0LCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0bworICAgICAgYSA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4sCisgICAgICBvciA8Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPiBkZWZpbmVkIGVsc2V3aGVyZTwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIGEgbmVzdGVkIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZWxlbWVudCBpcyBzdXBwbGllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNldG9uZW1wdHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2hvdWxkIHRoZSBwcm9wZXJ0eSBiZSBzZXQsIGV2ZW4gaWYgdGhlIHJlc3VsdAotICAgICAgaXMgdGhlIGVtcHR5IHN0cmluZz8KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGlzICZxdW90O3RydWUmcXVvdDsuCisgICAgPHRkPnNldG9uZW1wdHk8L3RkPgorICAgIDx0ZD5TaG91bGQgdGhlIHByb3BlcnR5IGJlIHNldCwgZXZlbiBpZiB0aGUgcmVzdWx0IGlzIHRoZSBlbXB0eSBzdHJpbmc/PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZWR1cGxpY2F0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwcmVzZXJ2ZSBkdXBsaWNhdGUgcmVzb3VyY2VzLiA8Yj5TaW5jZSBBbnQgMS44PC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCAmcXVvdDtmYWxzZSZxdW90Oy4KKyAgICA8dGQ+cHJlc2VydmVkdXBsaWNhdGVzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwcmVzZXJ2ZSBkdXBsaWNhdGUgcmVzb3VyY2VzLiA8ZW0+U2luY2UgQW50IDEuODwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5tYXA8L2g0PgogPHA+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHBhdGggcHJlZml4ZXMgYmV0d2VlbiBVbml4IGFuZCBXaW5kb3dzLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZnJvbTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSBwcmVmaXggdG8gbWF0Y2guICBOb3RlIHRoYXQgdGhpcyB2YWx1ZSBpcyBjYXNlLWluc2Vuc2l0aXZlIHdoZW4KLSAgICAgIHRoZSBidWlsZCBpcyBydW5uaW5nIG9uIGEgV2luZG93cyBwbGF0Zm9ybSBhbmQgY2FzZS1zZW5zaXRpdmUgCi0gICAgICB3aGVuIHJ1bm5pbmcgb24gYSBVbml4IHBsYXRmb3JtLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjcuMDwvZW0+LCBvbiBXaW5kb3dzIHRoaXMgdmFsdWUgaXMgYWxzbyBpbnNlbnNpdGl2ZQotICAgICAgdG8gdGhlIHNsYXNoIHN0eWxlIHVzZWQgZm9yIGRpcmVjdG9yaWVzLCBvbmUgY2FuIHVzZSAnLycgb3IgJ1wnLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5mcm9tPC90ZD4KKyAgICA8dGQ+VGhlIHByZWZpeCB0byBtYXRjaC4gIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGlzIGNhc2UtaW5zZW5zaXRpdmUgd2hlbiB0aGUgYnVpbGQgaXMgcnVubmluZyBvbgorICAgICAgYSBXaW5kb3dzIHBsYXRmb3JtIGFuZCBjYXNlLXNlbnNpdGl2ZSB3aGVuIHJ1bm5pbmcgb24gYSBVbml4IHBsYXRmb3JtLiAgPGVtPlNpbmNlIEFudAorICAgICAgMS43LjA8L2VtPiwgb24gV2luZG93cyB0aGlzIHZhbHVlIGlzIGFsc28gaW5zZW5zaXRpdmUgdG8gdGhlIHNsYXNoIHN0eWxlIHVzZWQgZm9yIGRpcmVjdG9yaWVzLAorICAgICAgb25lIGNhbiB1c2UgPHE+LzwvcT4gb3IgPHE+XDwvcT4uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlcGxhY2VtZW50IHRleHQgdG8gdXNlIHdoZW4gPGNvZGU+ZnJvbTwvY29kZT4gaXMgbWF0Y2hlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dG88L3RkPgorICAgIDx0ZD5UaGUgcmVwbGFjZW1lbnQgdGV4dCB0byB1c2Ugd2hlbiA8dmFyPmZyb208L3Zhcj4gaXMgbWF0Y2hlZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+RWFjaCBtYXAgZWxlbWVudCBzcGVjaWZpZXMgYSBzaW5nbGUgcmVwbGFjZW1lbnQgbWFwIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnRzIG9mCi0gICB0aGUgcGF0aCBiZWluZyBwcm9jZXNzZWQuICBJZiBubyBtYXAgZW50cmllcyBhcmUgc3BlY2lmaWVkLCB0aGVuIG5vIHBhdGggcHJlZml4IG1hcHBpbmcKLSAgIGlzIHBlcmZvcm1lZC4KLTwvcD4KLTxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhlIG1hcCBlbGVtZW50cyBhcmUgYXBwbGllZCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLAotYW5kIG9ubHkgdGhlIGZpcnN0IG1hdGNoaW5nIG1hcCBlbGVtZW50IGlzIGFwcGxpZWQuICBTbywgdGhlIG9yZGVyaW5nIG9mCi15b3VyIG1hcCBlbGVtZW50cyBjYW4gYmUgaW1wb3J0YW50LCBpZiBhbnkgPGNvZGU+ZnJvbTwvY29kZT4gdmFsdWVzIGFyZQotcHJlZml4ZXMgb2Ygb3RoZXIgPGNvZGU+ZnJvbTwvY29kZT4gdmFsdWVzLjwvaT4KLTwvcD4gICAKLTxoND5SZXNvdXJjZSBDb2xsZWN0aW9uczwvaDQ+Ci08cD5JZiB0aGUgPGNvZGU+cmVmaWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIG9uZSBvciBtb3JlCi0gICBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKLUNvbGxlY3Rpb248L2E+cyBtdXN0IGJlIHN1cHBsaWVkLjwvcD4KKzxwPkVhY2ggbWFwIGVsZW1lbnQgc3BlY2lmaWVzIGEgc2luZ2xlIHJlcGxhY2VtZW50IG1hcCB0byBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgcGF0aAorYmVpbmcgcHJvY2Vzc2VkLiAgSWYgbm8gbWFwIGVudHJpZXMgYXJlIHNwZWNpZmllZCwgdGhlbiBubyBwYXRoIHByZWZpeCBtYXBwaW5nIGlzIHBlcmZvcm1lZC48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoZSBtYXAgZWxlbWVudHMgYXJlIGFwcGxpZWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCwgYW5kIG9ubHkgdGhlIGZpcnN0CittYXRjaGluZyBtYXAgZWxlbWVudCBpcyBhcHBsaWVkLiAgU28sIHRoZSBvcmRlcmluZyBvZiB5b3VyIG1hcCBlbGVtZW50cyBjYW4gYmUgaW1wb3J0YW50LCBpZgorYW55IDx2YXI+ZnJvbTwvdmFyPiB2YWx1ZXMgYXJlIHByZWZpeGVzIG9mIG90aGVyIDx2YXI+ZnJvbTwvdmFyPiB2YWx1ZXMuPC9wPgorPGg0PnJlc291cmNlIGNvbGxlY3Rpb25zPC9oND4KKzxwPklmIHRoZSA8dmFyPnJlZmlkPC92YXI+IGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIG9uZSBvciBtb3JlCituZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IG11c3QgYmUgc3VwcGxpZWQuPC9wPgogPGg0Pm1hcHBlcjwvaDQ+Ci08cD5BIHNpbmdsZSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPgotPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9hPiBlbGVtZW50IGNhbiBiZSBzcGVjaWZpZWQKLXRvIHBlcmZvcm0gYW55IG9mIHZhcmlvdXMgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIChzaW5jZSBBbnQgMS42LjIpLgotPC9wPgorPHA+QSBzaW5nbGUgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgY2FuIGJlCitzcGVjaWZpZWQgdG8gcGVyZm9ybSBhbnkgb2YgdmFyaW91cyBmaWxlbmFtZSB0cmFuc2Zvcm1hdGlvbnMgKDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPikuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+SW4gdGhlIGV4YW1wbGVzIGJlbG93LCBhc3N1bWUgdGhhdCB0aGUgPGNvZGU+JHt3bC5ob21lfTwvY29kZT4gcHJvcGVydHkKLWhhcyB0aGUgdmFsdWUKLTxjb2RlPmQ6XHdlYmxvZ2ljPC9jb2RlPiwgYW5kIDxjb2RlPiR7d2wuaG9tZS51bml4fTwvY29kZT4gaGFzIHRoZSB2YWx1ZQotPGNvZGU+L3dlYmxvZ2ljPC9jb2RlPi48L3A+Cis8cD5JbiB0aGUgZXhhbXBsZXMgYmVsb3csIGFzc3VtZSB0aGF0IHRoZSA8c2FtcD4ke3dsLmhvbWV9PC9zYW1wPiBwcm9wZXJ0eSBoYXMgdGhlCit2YWx1ZSA8c2FtcD5kOlx3ZWJsb2dpYzwvc2FtcD4sIGFuZCA8c2FtcD4ke3dsLmhvbWUudW5peH08L3NhbXA+IGhhcyB0aGUKK3ZhbHVlIDxzYW1wPi93ZWJsb2dpYzwvc2FtcD4uPC9wPgogPGg0PkV4YW1wbGUgMTwvaDQ+Cis8cD5IZXJlLCB0aGUgdGFzazwvcD4KIDxwcmU+Ci0gICAgJmx0O3BhdGggaWQ9IndsLnBhdGgiJmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90OyR7d2wuaG9tZX0vbGliL3dlYmxvZ2ljYXV4LmphciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHt3bC5ob21lfS9jbGFzc2VzJnF1b3Q7LyZndDsKLSAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDske3dsLmhvbWV9L21zc3Fsc2VydmVyNC9jbGFzc2VzJnF1b3Q7LyZndDsKLSAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtjOlx3aW5udFxTeXN0ZW0zMiZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9wYXRoJmd0OwotICAgIAotICAgICZsdDtwYXRoY29udmVydCB0YXJnZXRvcz0mcXVvdDt1bml4JnF1b3Q7IHByb3BlcnR5PSZxdW90O3dsLnBhdGgudW5peCZxdW90OyByZWZpZD0mcXVvdDt3bC5wYXRoJnF1b3Q7Jmd0OwotICAgICAgJmx0O21hcCBmcm9tPSZxdW90OyR7d2wuaG9tZX0mcXVvdDsgdG89JnF1b3Q7JHt3bC5ob21lLnVuaXh9JnF1b3Q7LyZndDsKLSAgICAgICZsdDttYXAgZnJvbT0mcXVvdDtjOiZxdW90OyB0bz0mcXVvdDsmcXVvdDsvJmd0OwotICAgICZsdDsvcGF0aGNvbnZlcnQmZ3Q7Ci08L3ByZT4KLTxwPiB3aWxsIGdlbmVyYXRlIHRoZSBwYXRoIHNob3duIGJlbG93Ci1hbmQgc3RvcmUgaXQgaW4gdGhlIHByb3BlcnR5IG5hbWVkIDxjb2RlPndsLnBhdGgudW5peDwvY29kZT4uCi08L3A+ICAgCi08cHJlPgotL3dlYmxvZ2ljL2xpYi93ZWJsb2dpY2F1eC5qYXI6L3dlYmxvZ2ljL2NsYXNzZXM6L3dlYmxvZ2ljL21zc3Fsc2VydmVyNC9jbGFzc2VzOi9XSU5OVC9TWVNURU0zMgotPC9wcmU+CismbHQ7cGF0aCBpZD0id2wucGF0aCImZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDske3dsLmhvbWV9L2xpYi93ZWJsb2dpY2F1eC5qYXImcXVvdDsvJmd0OworICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHt3bC5ob21lfS9jbGFzc2VzJnF1b3Q7LyZndDsKKyAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90OyR7d2wuaG9tZX0vbXNzcWxzZXJ2ZXI0L2NsYXNzZXMmcXVvdDsvJmd0OworICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7Yzpcd2lubnRcU3lzdGVtMzImcXVvdDsvJmd0OworJmx0Oy9wYXRoJmd0OworCismbHQ7cGF0aGNvbnZlcnQgdGFyZ2V0b3M9JnF1b3Q7dW5peCZxdW90OyBwcm9wZXJ0eT0mcXVvdDt3bC5wYXRoLnVuaXgmcXVvdDsgcmVmaWQ9JnF1b3Q7d2wucGF0aCZxdW90OyZndDsKKyAgJmx0O21hcCBmcm9tPSZxdW90OyR7d2wuaG9tZX0mcXVvdDsgdG89JnF1b3Q7JHt3bC5ob21lLnVuaXh9JnF1b3Q7LyZndDsKKyAgJmx0O21hcCBmcm9tPSZxdW90O2M6JnF1b3Q7IHRvPSZxdW90OyZxdW90Oy8mZ3Q7CismbHQ7L3BhdGhjb252ZXJ0Jmd0OzwvcHJlPgorPHA+d2lsbCBnZW5lcmF0ZSB0aGUgcGF0aCBzaG93biBiZWxvdyBhbmQgc3RvcmUgaXQgaW4gdGhlIHByb3BlcnR5CituYW1lZCA8Y29kZT53bC5wYXRoLnVuaXg8L2NvZGU+LjwvcD4KKzxwcmUgY2xhc3M9Im91dHB1dCI+L3dlYmxvZ2ljL2xpYi93ZWJsb2dpY2F1eC5qYXI6L3dlYmxvZ2ljL2NsYXNzZXM6L3dlYmxvZ2ljL21zc3Fsc2VydmVyNC9jbGFzc2VzOi9XSU5OVC9TWVNURU0zMjwvcHJlPgogCiA8aDQ+RXhhbXBsZSAyPC9oND4KLUdpdmVuIGEgRmlsZUxpc3QgZGVmaW5lZCBhczoKKzxwPkdpdmVuIGEgRmlsZUxpc3QgZGVmaW5lZCBhczo8L3A+CiA8cHJlPgotICAmbHQ7ZmlsZWxpc3QgaWQ9JnF1b3Q7Y3VzdG9tX3Rhc2tzLmphcnMmcXVvdDsKLSAgICAgICAgZGlyPSZxdW90OyR7ZW52LkhPTUV9L2FudC9saWImcXVvdDsKLSAgICAgICAgZmlsZXM9JnF1b3Q7bmphdmFjLmphcix4cHJvcGVydHkuamFyJnF1b3Q7LyZndDsKLTwvcHJlPgotdGhlbjoKKyZsdDtmaWxlbGlzdCBpZD0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OworICAgICAgICAgIGRpcj0mcXVvdDske2Vudi5IT01FfS9hbnQvbGliJnF1b3Q7CisgICAgICAgICAgZmlsZXM9JnF1b3Q7bmphdmFjLmphcix4cHJvcGVydHkuamFyJnF1b3Q7LyZndDs8L3ByZT4KKzxwPnRoZW46PC9wPgogPHByZT4KLSAgICAmbHQ7cGF0aGNvbnZlcnQgdGFyZ2V0b3M9JnF1b3Q7dW5peCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OyByZWZpZD0mcXVvdDtjdXN0b21fdGFza3MuamFycyZxdW90OyZndDsKLSAgICAgICZsdDttYXAgZnJvbT0mcXVvdDske2Vudi5IT01FfSZxdW90OyB0bz0mcXVvdDsvdXNyL2xvY2FsJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OwotPC9wcmU+Ci13aWxsIGNvbnZlcnQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIGZvbGxvd2luZyBVbml4IHBhdGg6Ci08cHJlPgotL3Vzci9sb2NhbC9hbnQvbGliL25qYXZhYy5qYXI6L3Vzci9sb2NhbC9hbnQvbGliL3hwcm9wZXJ0eS5qYXIKLTwvcHJlPgorJmx0O3BhdGhjb252ZXJ0IHRhcmdldG9zPSZxdW90O3VuaXgmcXVvdDsgcHJvcGVydHk9JnF1b3Q7Y3VzdG9tX3Rhc2tzLmphcnMmcXVvdDsgcmVmaWQ9JnF1b3Q7Y3VzdG9tX3Rhc2tzLmphcnMmcXVvdDsmZ3Q7CisgICZsdDttYXAgZnJvbT0mcXVvdDske2Vudi5IT01FfSZxdW90OyB0bz0mcXVvdDsvdXNyL2xvY2FsJnF1b3Q7LyZndDsKKyZsdDsvcGF0aGNvbnZlcnQmZ3Q7PC9wcmU+Cis8cD53aWxsIGNvbnZlcnQgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gdGhlIGZvbGxvd2luZyBVbml4IHBhdGg6PC9wPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4vdXNyL2xvY2FsL2FudC9saWIvbmphdmFjLmphcjovdXNyL2xvY2FsL2FudC9saWIveHByb3BlcnR5LmphcjwvcHJlPgogCiA8aDQ+RXhhbXBsZSAzPC9oND4KKzxwPkhlcmUsIHRoZSBuYW1lcyBvZiBmaWxlcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaWxlc2V0IChhbGwgZmlsZXMgZW5kaW5nIGluIDxzYW1wPi5qYXZhPC9zYW1wPikgYXJlCitqb2luZWQgc2VwYXJhdGVkIGJ5IGNvbW1hLCBhbmQgdGhlIHJlc3VsdGluZyBsaXN0IGlzIHBsYWNlZCBpbnRvIHRoZQorcHJvcGVydHkgPGNvZGU+amF2YWZpbGVzPC9jb2RlPi4gVGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgaXMgbm90IHNwZWNpZmllZCwgc28gaXQgZGVmYXVsdHMgdG8gdGhlCithcHByb3ByaWF0ZSBjaGFyYWN0ZXIgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLiBTdWNoIGEgbGlzdCBjb3VsZCB0aGVuIGJlIHVzZWQgaW4gYW5vdGhlciB0YXNrLAorbGlrZSA8Y29kZT5qYXZhZG9jPC9jb2RlPiwgdGhhdCByZXF1aXJlcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzLjwvcD4KIDxwcmU+Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjLmRpcn0mcXVvdDsgaWQ9JnF1b3Q7c3JjLmZpbGVzJnF1b3Q7Jmd0OwotICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OwotICAgICZsdDsvZmlsZXNldCZndDsKLSAgCi0gICAgJmx0O3BhdGhjb252ZXJ0IHBhdGhzZXA9JnF1b3Q7LCZxdW90OyBwcm9wZXJ0eT0mcXVvdDtqYXZhZmlsZXMmcXVvdDsgcmVmaWQ9JnF1b3Q7c3JjLmZpbGVzJnF1b3Q7LyZndDsKLTwvcHJlPgotPHA+VGhpcyBleGFtcGxlIHRha2VzIHRoZSBzZXQgb2YgZmlsZXMgZGV0ZXJtaW5lZCBieSB0aGUgZmlsZXNldCAoYWxsIGZpbGVzIGVuZGluZwotaW4gPHR0Pi5qYXZhPC90dD4pLCBqb2lucyB0aGVtIHRvZ2V0aGVyIHNlcGFyYXRlZCBieSBjb21tYXMsIGFuZCBwbGFjZXMgdGhlIHJlc3VsdGluZwotbGlzdCBpbnRvIHRoZSBwcm9wZXJ0eSA8dHQ+amF2YWZpbGVzPC90dD4uICBUaGUgZGlyZWN0b3J5IHNlcGFyYXRvciBpcyBub3Qgc3BlY2lmaWVkLCBzbwotaXQgZGVmYXVsdHMgdG8gdGhlIGFwcHJvcHJpYXRlIGNoYXJhY3RlciBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBTdWNoIGEgbGlzdCBjb3VsZAotdGhlbiBiZSB1c2VkIGluIGFub3RoZXIgdGFzaywgbGlrZSA8dHQ+amF2YWRvYzwvdHQ+LCB0aGF0IHJlcXVpcmVzIGEgY29tbWEgc2VwYXJhdGVkCi1saXN0IG9mIGZpbGVzLgotPC9wPgorJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjLmRpcn0mcXVvdDsgaWQ9JnF1b3Q7c3JjLmZpbGVzJnF1b3Q7Jmd0OworICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CismbHQ7L2ZpbGVzZXQmZ3Q7CisKKyZsdDtwYXRoY29udmVydCBwYXRoc2VwPSZxdW90OywmcXVvdDsgcHJvcGVydHk9JnF1b3Q7amF2YWZpbGVzJnF1b3Q7IHJlZmlkPSZxdW90O3NyYy5maWxlcyZxdW90Oy8mZ3Q7PC9wcmU+CisKIDxoND5FeGFtcGxlIDQ8L2g0PgorPHA+VGhpcyB0YXNrIHNldHMgdGhlIHByb3BlcnR5IDxjb2RlPnByb3A8L2NvZGU+IHRvIDxxPmRlZnxnaGk8L3E+IG9uIFdpbmRvd3MgYW5kIG9uIFVuaXguPC9wPgogPHByZT4KLSAgICAmbHQ7cGF0aGNvbnZlcnQgcHJvcGVydHk9InByb3AiIGRpcnNlcD0ifCImZ3Q7Ci0gICAgICAmbHQ7bWFwIGZyb209IiR7YmFzZWRpcn0vYWJjLyIgdG89JycvJmd0OwotICAgICAgJmx0O3BhdGggbG9jYXRpb249ImFiYy9kZWYvZ2hpIi8mZ3Q7Ci0gICAgJmx0Oy9wYXRoY29udmVydCZndDsKLTwvcHJlPgotICA8cD4KLSAgICBUaGlzIGV4YW1wbGUgc2V0cyB0aGUgcHJvcGVydHkgInByb3AiIHRvICJkZWZ8Z2hpIiBvbgotICAgIFdpbmRvd3MgYW5kIG9uIFVuaXguCi0gIDwvcD4KKyZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0icHJvcCIgZGlyc2VwPSJ8IiZndDsKKyAgJmx0O21hcCBmcm9tPSIke2Jhc2VkaXJ9L2FiYy8iIHRvPSZxdW90OyZxdW90Oy8mZ3Q7CisgICZsdDtwYXRoIGxvY2F0aW9uPSJhYmMvZGVmL2doaSIvJmd0OworJmx0Oy9wYXRoY29udmVydCZndDs8L3ByZT4KIDwvYm9keT4KIDwvaHRtbD4KLQotIApkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3ByZXNldGRlZi5odG1sIGIvbWFudWFsL1Rhc2tzL3ByZXNldGRlZi5odG1sCmluZGV4IGM3ZjM4MWMuLjEyNTFmYjcgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9wcmVzZXRkZWYuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcHJlc2V0ZGVmLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw5NiArMTUsNjYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KLSAgCis8aHRtbCBsYW5nPSJlbiI+CisKICAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPjwvbWV0YT4KICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPlByZVNldERlZiBUYXNrPC90aXRsZT4KLSAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgotICAgICAgPCEtLQotICAgICAgICAgICAuY29kZSB7IGJhY2tncm91bmQ6ICNFRkVGRUY7IG1hcmdpbi10b3A6IH0KLSAgICAgICAgICAgLS0+Ci0gICAgPC9zdHlsZT4KKyAgICA8dGl0bGU+UHJlU2V0RGVmIFRhc2s8L3RpdGxlPgogICA8L2hlYWQ+Ci0gIAorCiAgIDxib2R5PgotICAgIAotICAgIDxoMj48YSBuYW1lPSJwcmVzZXRkZWYiPlByZVNldERlZjwvYT48L2gyPgorCisgICAgPGgyIGlkPSJwcmVzZXRkZWYiPlByZVNldERlZjwvaDI+CisgICAgPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+CiAgICAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KLSAgICA8cD4KLSAgICAgIFRoZSBwcmVzZXQgZGVmaW5pdGlvbiBnZW5lcmF0ZXMgYSBuZXcgZGVmaW5pdGlvbgotICAgICAgYmFzZWQgb24gYSBjdXJyZW50IGRlZmluaXRpb24gd2l0aCBzb21lIGF0dHJpYnV0ZXMKLSAgICAgIG9yIGVsZW1lbnRzIHByZXNldC4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPgotICAgIDwvcD4KLSAgICA8cD4KLSAgICAgIFRoZSByZXNvbHV0aW9uIG9mIHByb3BlcnRpZXMgaW4gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yCi0gICAgICBuZXN0ZWQgdGV4dCB0YWtlcyBwbGFjZSB3aXRoIHRoZSBkZWZpbml0aW9uIGlzIHVzZWQgYW5kIDxlbT5ub3Q8L2VtPgotICAgICAgd2hlbiB0aGUgcHJlc2V0IGRlZmluaXRpb24gaXMgZGVmaW5lZC4KLSAgICA8L3A+CisgICAgPHA+VGhlIHByZXNldCBkZWZpbml0aW9uIGdlbmVyYXRlcyBhIG5ldyBkZWZpbml0aW9uIGJhc2VkIG9uIGEgY3VycmVudCBkZWZpbml0aW9uIHdpdGggc29tZQorICAgICAgYXR0cmlidXRlcyBvciBlbGVtZW50cyBwcmVzZXQuPC9wPgorICAgIDxwPlRoZSByZXNvbHV0aW9uIG9mIHByb3BlcnRpZXMgaW4gYW55IG9mIHRoZSBhdHRyaWJ1dGVzIG9yIG5lc3RlZCB0ZXh0IHRha2VzIHBsYWNlIHdpdGggdGhlCisgICAgICBkZWZpbml0aW9uIGlzIHVzZWQgYW5kIDxlbT5ub3Q8L2VtPiB3aGVuIHRoZSBwcmVzZXQgZGVmaW5pdGlvbiBpcyBkZWZpbmVkLjwvcD4KICAgICA8aDM+UGFyYW1ldGVyczwvaDM+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBuZXcgZGVmaW5pdGlvbjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPm5hbWU8L3RkPgorICAgICAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIG5ldyBkZWZpbml0aW9uPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgVGhlIHVyaSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbGl2ZSBpbi4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD51cmk8L3RkPgorICAgICAgICA8dGQ+VGhlIFVSSSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbGl2ZSBpbi48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICA8L3RhYmxlPgogICAgIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogICAgIDxoND5hbm90aGVyIHR5cGUgd2l0aCBhdHRyaWJ1dGVzIG9yIGVsZW1lbnRzIHNldDwvaDQ+Ci0gICAgPHA+VGhlIDxjb2RlPiZsdDtwcmVzZXRkZWYmZ3Q7PC9jb2RlPiB0YXNrIHRha2VzIG9uZSBuZXN0ZWQgZWxlbWVudCBhcyBhIHBhcmFtZXRlci4KLSAgICAgIFRoaXMgbmVzdGVkIGVsZW1lbnQgY2FuIGJlIGFueSBvdGhlciB0eXBlIG9yIHRhc2suIFRoZSBhdHRyaWJ1dGVzCi0gICAgICBhbmQgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGJlIHByZXNldCBhcmUgcGxhY2VkIGhlcmUuCi0gICAgPC9wPgotICAgIAorICAgIDxwPlRoZSA8Y29kZT4mbHQ7cHJlc2V0ZGVmJmd0OzwvY29kZT4gdGFzayB0YWtlcyBvbmUgbmVzdGVkIGVsZW1lbnQgYXMgYSBwYXJhbWV0ZXIuICBUaGlzIG5lc3RlZAorICAgICAgZWxlbWVudCBjYW4gYmUgYW55IG90aGVyIHR5cGUgb3IgdGFzay4gVGhlIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBiZSBwcmVzZXQgYXJlCisgICAgICBwbGFjZWQgaGVyZS48L3A+CisKICAgICA8aDM+RXhhbXBsZXM8L2gzPgotICAgICAgVGhlIGZvbGxvd2luZyBmcmFnbWVudCBkZWZpbmVzIGEgamF2YWMgdGFzayB3aXRoIHRoZSBkZWJ1ZywgZGVwcmVjYXRpb24KLSAgICAgIHNyY2RpciBhbmQgZGVzdGRpcgotICAgICAgYXR0cmlidXRlcyBzZXQuIEl0IGFsc28gaGFzIGEgc3JjIGVsZW1lbnQgdG8gc291cmNlIGZpbGVzIGZyb20gYSBnZW5lcmF0ZWQKLSAgICAgIGRpcmVjdG9yeS4KLSAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9ImNvZGUiPgorICAgIDxwPlRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgZGVmaW5lcyBhIDxjb2RlPmphdmFjPC9jb2RlPiB0YXNrIHdpdGgKKyAgICAgIHRoZSA8dmFyPmRlYnVnPC92YXI+LCA8dmFyPmRlcHJlY2F0aW9uPC92YXI+LCA8dmFyPnNyY2RpcjwvdmFyPiBhbmQgPHZhcj5kZXN0ZGlyPC92YXI+CisgICAgICBhdHRyaWJ1dGVzIHNldC4gSXQgYWxzbyBoYXMgYSA8Y29kZT5zcmM8L2NvZGU+IGVsZW1lbnQgdG8gc291cmNlIGZpbGVzIGZyb20gYSBnZW5lcmF0ZWQKKyAgICAgIGRpcmVjdG9yeS48L3A+CisgICAgPHByZT4KICZsdDtwcmVzZXRkZWYgbmFtZT0ibXkuamF2YWMiJmd0OwogICAgJmx0O2phdmFjIGRlYnVnPSIke2RlYnVnfSIgZGVwcmVjYXRpb249IiR7ZGVwcmVjYXRpb259IgogICAgICAgICAgIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iJmd0OwogICAgICAgJmx0O3NyYyBwYXRoPSIke2dlbi5kaXJ9Ii8mZ3Q7CiAgICAmbHQ7L2phdmFjJmd0OwotJmx0Oy9wcmVzZXRkZWYmZ3Q7Ci08L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgbm9ybWFsIGphdmFjIHRhc2sgLSBleGFtcGxlOgotICAgIDxibG9ja3F1b3RlPgotPHByZSBjbGFzcz0iY29kZSI+Ci0mbHQ7bXkuamF2YWMvJmd0OwotPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgICAgVGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHRoZSBwcmVzZXQgdGFzayBtYXkgYmUgb3ZlcnJpZGRlbiAtIGkuZS4KLSAgICAgIHRoZXkgbWF5IGJlIHNlZW4gYXMgb3B0aW9uYWwgYXR0cmlidXRlcyAtIGV4YW1wbGU6Ci0gICAgPGJsb2NrcXVvdGU+Ci08cHJlIGNsYXNzPSJjb2RlIj4KLSZsdDtteS5qYXZhYyBzcmNkaXI9IiR7dGVzdC5zcmN9IiBkZXByZWNhdGlvbj0ibm8iLyZndDsKLTwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLSAgICAgIE9uZSBtYXkgcHV0IGEgcHJlc2V0ZGVmIGRlZmluaXRpb24gaW4gYW4gYW50bGliLgotICAgICAgRm9yIGV4YW1wbGUgc3VwcG9zZSB0aGUgamFyIGZpbGUgYW50Z29vZGllcy5qYXIgaGFzCi0gICAgICB0aGUgYW50bGliLnhtbCBhcyBmb2xsb3dzOgotICAgIDxibG9ja3F1b3RlPgotPHByZSBjbGFzcz0iY29kZSI+CismbHQ7L3ByZXNldGRlZiZndDs8L3ByZT4KKyAgICA8cD5UaGlzIGNhbiBiZSB1c2VkIGFzIGEgbm9ybWFsIDxjb2RlPmphdmFjPC9jb2RlPiB0YXNrJm1kYXNoO2ZvciBleGFtcGxlOjwvcD4KKyAgICA8cHJlPiZsdDtteS5qYXZhYy8mZ3Q7PC9wcmU+CisgICAgPHA+VGhlIGF0dHJpYnV0ZXMgc3BlY2lmaWVkIGluIHRoZSBwcmVzZXQgdGFzayBtYXkgYmUgb3ZlcnJpZGRlbiZtZGFzaDtpLmUuICB0aGV5IG1heSBiZSBzZWVuIGFzCisgICAgICBvcHRpb25hbCBhdHRyaWJ1dGVzJm1kYXNoO2ZvciBleGFtcGxlOjwvcD4KKyAgICA8cHJlPiZsdDtteS5qYXZhYyBzcmNkaXI9IiR7dGVzdC5zcmN9IiBkZXByZWNhdGlvbj0ibm8iLyZndDs8L3ByZT4KKyAgICA8cD5PbmUgbWF5IHB1dCBhIDxjb2RlPnByZXNldGRlZjwvY29kZT4gZGVmaW5pdGlvbiBpbiBhbiBhbnRsaWIuICBGb3IgZXhhbXBsZSBzdXBwb3NlIHRoZSBqYXIKKyAgICAgIGZpbGUgPHNhbXA+YW50Z29vZGllcy5qYXI8L3NhbXA+IGhhcyB0aGUgPHNhbXA+YW50bGliLnhtbDwvc2FtcD4gYXMgZm9sbG93czo8L3A+CisgICAgPHByZT4KICZsdDthbnRsaWImZ3Q7CiAgICAmbHQ7dGFza2RlZiByZXNvdXJjZT0iY29tL2FjbWUvYW50Z29vZGllcy90YXNrcy5wcm9wZXJ0aWVzIi8mZ3Q7CiAgICAmbHQ7IS0tIEltcGxlbWVudCB0aGUgY29tbW9uIHVzZSBvZiB0aGUgamF2YWMgY29tbWFuZCAtLSZndDsKQEAgLTExMSwxMiArODIsOSBAQAogICAgICAgJmx0O2phdmFjIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIgZGVidWc9IiR7ZGVidWd9IgogICAgICAgICAgICAgIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSJjbGFzc2VzIi8mZ3Q7CiAgICAmbHQ7L3ByZXNldGRlZiZndDsKLSZsdDsvYW50bGliJmd0OwotPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgICAgT25lIG1heSB0aGVuIHVzZSB0aGlzIGluIGEgYnVpbGQgZmlsZSBhcyBmb2xsb3dzOgotICAgIDxibG9ja3F1b3RlPgotPHByZSBjbGFzcz0iY29kZSI+CismbHQ7L2FudGxpYiZndDs8L3ByZT4KKyAgICA8cD5PbmUgbWF5IHRoZW4gdXNlIHRoaXMgaW4gYSBidWlsZCBmaWxlIGFzIGZvbGxvd3M6PC9wPgorICAgIDxwcmU+CiAmbHQ7cHJvamVjdCBkZWZhdWx0PSJleGFtcGxlIiB4bWxuczphbnRnb29kaWVzPSJhbnRsaWI6Y29tLmFjbWUuYW50Z29vZGllcyImZ3Q7CiAgICAmbHQ7dGFyZ2V0IG5hbWU9ImV4YW1wbGUiJmd0OwogICAgICAgJmx0OyEtLSBDb21waWxlIHNvdXJjZSAtLSZndDsKQEAgLTEyNCwxNSArOTIsOSBAQAogICAgICAgJmx0OyEtLSBDb21waWxlIHRlc3QgY29kZSAtLSZndDsKICAgICAgICZsdDthbnRnb29kaWVzOmphdmFjIHNyY2Rpcj0ic3JjL3Rlc3QiLyZndDsKICAgICZsdDsvdGFyZ2V0Jmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxwPgotICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGV2YWx1YXRpb24gb2YgcHJvcGVydGllcyB3aGVuIHRoZQotICAgICAgZGVmaW5pdGlvbiBpcyB1c2VkOgotICAgIDwvcD4KLSAgICAgPGJsb2NrcXVvdGU+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KKyAgICA8cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgZXZhbHVhdGlvbiBvZiBwcm9wZXJ0aWVzIHdoZW4gdGhlIGRlZmluaXRpb24gaXMgdXNlZDo8L3A+CisgICAgPHByZT4KICZsdDt0YXJnZXQgbmFtZT0iZGVmaW5lYW5kY2FsbCImZ3Q7CiAgICAmbHQ7cHJlc2V0ZGVmIG5hbWU9InNob3dtZXNzYWdlIiZndDsKICAgICAgICZsdDtlY2hvJmd0O21lc3NhZ2UgaXMgJyR7bWVzc2FnZX0nJmx0Oy9lY2hvJmd0OwpAQCAtMTQ2LDM5ICsxMDgsMjYgQEAKICZsdDsvdGFyZ2V0Jmd0OwogJmx0O3RhcmdldCBuYW1lPSJjYWxsZWQiJmd0OwogICAgJmx0O3Nob3dtZXNzYWdlLyZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+Ci0gICAgIDwvYmxvY2txdW90ZT4KLSAgICAgPHA+Ci0gICAgICAgIFRoZSBjb21tYW5kIGFudCBkZWZpbmVhbmRjYWxsIHJlc3VsdHMgaW4gdGhlIG91dHB1dDoKLSAgICAgPC9wPgotICAgICA8YmxvY2txdW90ZT4KLTxwcmUgY2xhc3M9ImNvZGUiPgorJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CisgICAgPHA+VGhlIGNvbW1hbmQgPGtiZD5hbnQgZGVmaW5lYW5kY2FsbDwva2JkPiByZXN1bHRzIGluIHRoZSBvdXRwdXQ6PC9wPgorICAgIDxwcmUgY2xhc3M9Im91dHB1dCI+CiBkZWZpbmVhbmRjYWxsOgogW3Nob3dtZXNzYWdlXSBtZXNzYWdlIGlzICcke21lc3NhZ2V9JwogW3Nob3dtZXNzYWdlXSBtZXNzYWdlIGlzICdNZXNzYWdlIDEnCiAKIGNhbGxlZDoKLVtzaG93bWVzc2FnZV0gbWVzc2FnZSBpcyAnTWVzc2FnZSAyJwotPC9wcmU+Ci0gICAgIDwvYmxvY2txdW90ZT4KLTxwPgotSXQgaXMgcG9zc2libGUgdG8gdXNlIGEgdHJpY2sgdG8gZXZhbHVhdGUgcHJvcGVydGllcyB3aGVuIHRoZSBkZWZpbml0aW9uIGlzCi08ZW0+bWFkZTwvZW0+IHJhdGhlciB0aGFuIHVzZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgZG8gbm90IGV4cGVjdCBzb21lCi1wcm9wZXJ0aWVzIHRvIGJlIGF2YWlsYWJsZSBpbiBjaGlsZCBidWlsZHMgcnVuIHdpdGgKLTxjb2RlPiZsdDthbnQgLi4uIGluaGVyaXRhbGw9ImZhbHNlIiZndDs8L2NvZGU+OgotPC9wPgotPGJsb2NrcXVvdGU+PHByZSBjbGFzcz0iY29kZSI+Citbc2hvd21lc3NhZ2VdIG1lc3NhZ2UgaXMgJ01lc3NhZ2UgMic8L3ByZT4KKyAgICA8cD5JdCBpcyBwb3NzaWJsZSB0byB1c2UgYSB0cmljayB0byBldmFsdWF0ZSBwcm9wZXJ0aWVzIHdoZW4gdGhlIGRlZmluaXRpb24gaXMgPGVtPm1hZGU8L2VtPgorICAgICAgcmF0aGVyIHRoYW4gdXNlZC4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkbyBub3QgZXhwZWN0IHNvbWUgcHJvcGVydGllcyB0byBiZSBhdmFpbGFibGUgaW4KKyAgICAgIGNoaWxkIGJ1aWxkcyBydW4gd2l0aCA8Y29kZT4mbHQ7YW50IC4uLiBpbmhlcml0YWxsPSJmYWxzZSImZ3Q7PC9jb2RlPjo8L3A+CisgICAgPHByZT4KICZsdDttYWNyb2RlZiBuYW1lPSJzaG93bWVzc2FnZS1wcmVzZXRkZWYiJmd0OwogICAmbHQ7YXR0cmlidXRlIG5hbWU9Im1lc3NhZ2V2YWwiLyZndDsKICAgJmx0O3ByZXNldGRlZiBuYW1lPSJzaG93bWVzc2FnZSImZ3Q7CiAgICAgJmx0O2VjaG8mZ3Q7bWVzc2FnZSBpcyAnQHttZXNzYWdldmFsfScmbHQ7L2VjaG8mZ3Q7CiAgICZsdDsvcHJlc2V0ZGVmJmd0OwogJmx0Oy9tYWNyb2RlZiZndDsKLSZsdDtzaG93bWVzc2FnZS1wcmVzZXRkZWYgbWVzc2FnZXZhbD0iJHttZXNzYWdlfSIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotICAgIDxocj48L2hyPgotICAgIAorJmx0O3Nob3dtZXNzYWdlLXByZXNldGRlZiBtZXNzYWdldmFsPSIke21lc3NhZ2V9Ii8mZ3Q7PC9wcmU+CisKICAgPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcHJvamVjdGhlbHBlci5odG1sIGIvbWFudWFsL1Rhc2tzL3Byb2plY3RoZWxwZXIuaHRtbAppbmRleCBlYTc4ZWIyLi4xZjQ4OTQ3IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcHJvamVjdGhlbHBlci5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9wcm9qZWN0aGVscGVyLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UHJvamVjdEhlbHBlciBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDMwICsyNSwyOCBAQAogPGJvZHk+CiAKIDxoMj5Qcm9qZWN0SGVscGVyPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5UaGlzIHRhc2sgaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHRoZSB1c2VyIHRvIGluc3RhbGwgYSBkaWZmZXJlbnQKLVByb2plY3RIZWxwZXIgYXQgcnVudGltZS4KLTwvcD4KLTxwPlRoZSBoZWxwZXJzIHdpbGwgYmUgYWRkZWQgYWZ0ZXIgYWxsIHRoZSBhbHJlYWR5IHJlZ2lzdGVyZWQgaGVscGVycywgYnV0IGJlZm9yZQotdGhlIGRlZmF1bHQgb25lIChQcm9qZWN0SGVscGVyMikKLTwvcD4KLTxwPlNlZSB0aGUgZGVzY3JpcHRpb24gb2YgQXBhY2hlIEFudCdzCi08YSBocmVmPSIuLi9wcm9qZWN0aGVscGVyLmh0bWwiPlByb2plY3QgSGVscGVyPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLTwvcD4KLTxwPjxiPlNpbmNlIEFudCAxLjguMjwvYj48L3A+Cis8cD5UaGlzIHRhc2sgaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHRoZSB1c2VyIHRvIGluc3RhbGwgYSBkaWZmZXJlbnQgUHJvamVjdEhlbHBlcgorYXQgcnVuIHRpbWUuPC9wPgorPHA+VGhlIGhlbHBlcnMgd2lsbCBiZSBhZGRlZCBhZnRlciBhbGwgdGhlIGFscmVhZHkgcmVnaXN0ZXJlZCBoZWxwZXJzLCBidXQgYmVmb3JlIHRoZSBkZWZhdWx0IG9uZQorKDxjb2RlPlByb2plY3RIZWxwZXIyPC9jb2RlPik8L3A+Cis8cD5TZWUgdGhlIGRlc2NyaXB0aW9uIG9mIEFwYWNoZSBBbnQncyA8YSBocmVmPSIuLi9wcm9qZWN0aGVscGVyLmh0bWwiPlByb2plY3QgSGVscGVyPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uPC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotWW91IG1heSBzcGVjaWZ5IG1hbnkgY29uZmlndXJlZCA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyPC9jb2RlPiBpbnN0YW5jZXMuCis8cD5Zb3UgbWF5IHNwZWNpZnkgbWFueSBjb25maWd1cmVkIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyPC9jb2RlPgoraW5zdGFuY2VzLjwvcD4KIAogPGgzPkV4YW1wbGU8L2gzPgogCi08cD5JbnN0YWxsIGEgY3VzdG9tIFByb2plY3RIZWxwZXIgaW1wbGVtZW50YXRpb24KLSAgKGFzc3VtaW5nIDxjb2RlPk15UHJvamVjdEhlbHBlciBleHRlbmRzIFByb2plY3RIZWxwZXI8L2NvZGU+KTo8L3A+Cis8cD5JbnN0YWxsIGEgY3VzdG9tIFByb2plY3RIZWxwZXIgaW1wbGVtZW50YXRpb24gKGFzc3VtaW5nIDxjb2RlIGNsYXNzPSJjb2RlIj5NeVByb2plY3RIZWxwZXIKK2V4dGVuZHMgUHJvamVjdEhlbHBlcjwvY29kZT4pOjwvcD4KIAogPHByZT4KICZsdDt0eXBlZGVmIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuTXlQcm9qZWN0SGVscGVyIgotICAgICAgICAgICAgICBuYW1lPSJteXByb2plY3RoZWxwZXIiLz4KKyAgICAgICAgIG5hbWU9Im15cHJvamVjdGhlbHBlciIvPgogJmx0O3Byb2plY3RoZWxwZXI+CiAgICZsdDtteXByb2plY3RoZWxwZXIvPgogJmx0Oy9wcm9qZWN0aGVscGVyPgpAQCAtNTYsNCArNTQsMyBAQAogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9wcm9wZXJ0eS5odG1sIGIvbWFudWFsL1Rhc2tzL3Byb3BlcnR5Lmh0bWwKaW5kZXggNDIyNTBiOS4uYjk2ZjkwZSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3Byb3BlcnR5Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3Byb3BlcnR5Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzNjIgKzE1LDMyOCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UHJvcGVydHkgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icHJvcGVydHkiPlByb3BlcnR5PC9hPjwvaDI+Cis8aDIgaWQ9InByb3BlcnR5Ij5Qcm9wZXJ0eTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+U2V0cyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcHJvcGVydGllcyI+cHJvcGVydHk8L2E+Ci0oYnkgbmFtZSBhbmQgdmFsdWUpLCBvciBzZXQgb2YgcHJvcGVydGllcyAoZnJvbSBmaWxlIG9yCi1yZXNvdXJjZSkgaW4gdGhlIHByb2plY3QuICBQcm9wZXJ0aWVzIGFyZSBjYXNlIHNlbnNpdGl2ZS48L3A+Ci0gUHJvcGVydGllcyBhcmUgaW1tdXRhYmxlOiB3aG9ldmVyIHNldHMgYSBwcm9wZXJ0eSBmaXJzdCBmcmVlemVzIGl0IGZvciB0aGUKLSByZXN0IG9mIHRoZSBidWlsZDsgdGhleSBhcmUgbW9zdCBkZWZpbml0ZWx5IG5vdCB2YXJpYWJsZXMuCis8cD5TZXRzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwcm9wZXJ0aWVzIj5wcm9wZXJ0eTwvYT4gKGJ5IG5hbWUgYW5kIHZhbHVlKSwgb3Igc2V0IG9mIHByb3BlcnRpZXMKKyhmcm9tIGZpbGUgb3IgcmVzb3VyY2UpIGluIHRoZSBwcm9qZWN0LiAgUHJvcGVydGllcyBhcmUgY2FzZSBzZW5zaXRpdmUuPC9wPgorPHA+UHJvcGVydGllcyBhcmUgaW1tdXRhYmxlOiB3aG9ldmVyIHNldHMgYSBwcm9wZXJ0eSBmaXJzdCBmcmVlemVzIGl0IGZvciB0aGUgcmVzdCBvZiB0aGUgYnVpbGQ7Cit0aGV5IGFyZSBtb3N0IGRlZmluaXRlbHkgbm90IHZhcmlhYmxlcy48L3A+CiA8cD5UaGVyZSBhcmUgc2V2ZW4gd2F5cyB0byBzZXQgcHJvcGVydGllczo8L3A+CiA8dWw+Ci0gIDxsaT5CeSBzdXBwbHlpbmcgYm90aCB0aGUgPGk+bmFtZTwvaT4gYW5kIG9uZSBvZiA8aT52YWx1ZTwvaT4gb3IgPGk+bG9jYXRpb248L2k+IGF0dHJpYnV0ZS48L2xpPgotICA8bGk+Qnkgc3VwcGx5aW5nIHRoZSA8aT5uYW1lPC9pPiBhbmQgbmVzdGVkIHRleHQuPC9saT4KLSAgPGxpPkJ5IHN1cHBseWluZyBib3RoIHRoZSA8aT5uYW1lPC9pPiBhbmQgPGk+cmVmaWQ8L2k+IGF0dHJpYnV0ZS48L2xpPgotICA8bGk+Qnkgc2V0dGluZyB0aGUgPGk+ZmlsZTwvaT4gYXR0cmlidXRlIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZSBwcm9wZXJ0eQotICAgIGZpbGUgdG8gbG9hZC4gVGhpcyBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZAotICAgIGluIHRoZSBjbGFzcyBqYXZhLnV0aWwuUHJvcGVydGllcywgd2l0aCB0aGUgc2FtZSBydWxlcyBhYm91dCBob3cKLSAgICBub24tSVNPODg1OS0xIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkLjwvbGk+Ci0gIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT51cmw8L2k+IGF0dHJpYnV0ZSB3aXRoIHRoZSB1cmwgZnJvbSB3aGljaCB0byBsb2FkIHRoZQotICAgIHByb3BlcnRpZXMuIFRoaXMgdXJsIG11c3QgYmUgZGlyZWN0ZWQgdG8gYSBmaWxlIHRoYXQgaGFzIHRoZSBmb3JtYXQgYXMgZGVmaW5lZAotICAgIGJ5IHRoZSBmaWxlIHVzZWQgaW4gdGhlIGNsYXNzIGphdmEudXRpbC5Qcm9wZXJ0aWVzLjwvbGk+Ci0gIDxsaT5CeSBzZXR0aW5nIHRoZSA8aT5yZXNvdXJjZTwvaT4gYXR0cmlidXRlIHdpdGggdGhlIHJlc291cmNlIG5hbWUgb2YgdGhlCi0gICAgcHJvcGVydHkgZmlsZSB0byBsb2FkLiBBIHJlc291cmNlIGlzIGEgcHJvcGVydHkgZmlsZSBvbiB0aGUgY3VycmVudAotICAgIGNsYXNzcGF0aCwgb3Igb24gdGhlIHNwZWNpZmllZCBjbGFzc3BhdGguPC9saT4KLSAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPmVudmlyb25tZW50PC9pPiBhdHRyaWJ1dGUgd2l0aCBhIHByZWZpeCB0byB1c2UuCi0gICAgUHJvcGVydGllcyB3aWxsIGJlIGRlZmluZWQgZm9yIGV2ZXJ5IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5Ci0gICAgcHJlZml4aW5nIHRoZSBzdXBwbGllZCBuYW1lIGFuZCBhIHBlcmlvZCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuPC9saT4KLSAgPGxpPkJ5IHNldHRpbmcgdGhlIDxpPnJ1bnRpbWU8L2k+IGF0dHJpYnV0ZSB3aXRoIGEgcHJlZml4IHRvIHVzZS4KLSAgICBQcm9wZXJ0aWVzIDxjb2RlPnByZWZpeC5hdmFpbGFibGVQcm9jZXNzb3JzPC9jb2RlPiwKLSAgICA8Y29kZT5wcmVmaXguZnJlZU1lbW9yeTwvY29kZT4sIDxjb2RlPnByZWZpeC50b3RhbE1lbW9yeTwvY29kZT4KLSAgICBhbmQgPGNvZGU+cHJlZml4Lm1heE1lbW9yeTwvY29kZT4gd2lsbCBiZSBkZWZpbmVkIHdpdGggdmFsdWVzCi0gICAgcmV0dXJuZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZgorICA8bGk+Qnkgc3VwcGx5aW5nIGJvdGggdGhlIDx2YXI+bmFtZTwvdmFyPiBhbmQgb25lIG9mIDx2YXI+dmFsdWU8L3Zhcj4gb3IgPHZhcj5sb2NhdGlvbjwvdmFyPgorICAgIGF0dHJpYnV0ZXMuPC9saT4KKyAgPGxpPkJ5IHN1cHBseWluZyB0aGUgPHZhcj5uYW1lPC92YXI+IGFuZCBuZXN0ZWQgdGV4dC48L2xpPgorICA8bGk+Qnkgc3VwcGx5aW5nIGJvdGggdGhlIDx2YXI+bmFtZTwvdmFyPiBhbmQgPHZhcj5yZWZpZDwvdmFyPiBhdHRyaWJ1dGVzLjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlIHdpdGggdGhlIGZpbGVuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRvIGxvYWQuIFRoaXMKKyAgICBwcm9wZXJ0eSBmaWxlIGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZCBpbiB0aGUKKyAgICBjbGFzcyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLlByb3BlcnRpZXM8L2NvZGU+LCB3aXRoIHRoZSBzYW1lIHJ1bGVzIGFib3V0IGhvdworICAgIG5vbi1JU08tODg1OS0xIGNoYXJhY3RlcnMgbXVzdCBiZSBlc2NhcGVkLjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8dmFyPnVybDwvdmFyPiBhdHRyaWJ1dGUgd2l0aCB0aGUgVVJMIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgcHJvcGVydGllcy4gVGhpcworICAgIFVSTCBtdXN0IGJlIGRpcmVjdGVkIHRvIGEgZmlsZSB0aGF0IGhhcyB0aGUgZm9ybWF0IGFzIGRlZmluZWQgYnkgdGhlIGZpbGUgdXNlZCBpbiB0aGUKKyAgICBjbGFzcyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLlByb3BlcnRpZXM8L2NvZGU+LjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8dmFyPnJlc291cmNlPC92YXI+IGF0dHJpYnV0ZSB3aXRoIHRoZSByZXNvdXJjZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlIHRvCisgICAgbG9hZC4gQSByZXNvdXJjZSBpcyBhIHByb3BlcnR5IGZpbGUgb24gdGhlIGN1cnJlbnQgY2xhc3NwYXRoLCBvciBvbiB0aGUgc3BlY2lmaWVkCisgICAgY2xhc3NwYXRoLjwvbGk+CisgIDxsaT5CeSBzZXR0aW5nIHRoZSA8dmFyPmVudmlyb25tZW50PC92YXI+IGF0dHJpYnV0ZSB3aXRoIGEgcHJlZml4IHRvIHVzZS4gIFByb3BlcnRpZXMgd2lsbCBiZQorICAgIGRlZmluZWQgZm9yIGV2ZXJ5IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5IHByZWZpeGluZyB0aGUgc3VwcGxpZWQgbmFtZSBhbmQgYSBwZXJpb2QgdG8gdGhlIG5hbWUKKyAgICBvZiB0aGUgdmFyaWFibGUuPC9saT4KKyAgPGxpPkJ5IHNldHRpbmcgdGhlIDx2YXI+cnVudGltZTwvdmFyPiBhdHRyaWJ1dGUgd2l0aCBhIHByZWZpeCB0byB1c2UuCisgICAgUHJvcGVydGllcyA8Y29kZT5wcmVmaXguYXZhaWxhYmxlUHJvY2Vzc29yczwvY29kZT4sIDxjb2RlPnByZWZpeC5mcmVlTWVtb3J5PC9jb2RlPiwgPGNvZGU+cHJlZml4LnRvdGFsTWVtb3J5PC9jb2RlPgorICAgIGFuZCA8Y29kZT5wcmVmaXgubWF4TWVtb3J5PC9jb2RlPiB3aWxsIGJlIGRlZmluZWQgd2l0aCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlCisgICAgY29ycmVzcG9uZGluZyBtZXRob2RzIG9mCiAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS8xMC9kb2NzL2FwaS9qYXZhL2xhbmcvUnVudGltZS5odG1sIj5SdW50aW1lPC9hPgogICAgIGNsYXNzLjwvbGk+CiA8L3VsPgotPHA+QWx0aG91Z2ggY29tYmluYXRpb25zIG9mIHRoZXNlIHdheXMgYXJlIHBvc3NpYmxlLCBvbmx5IG9uZSBzaG91bGQgYmUgdXNlZAotYXQgYSB0aW1lLiBQcm9ibGVtcyBtaWdodCBvY2N1ciB3aXRoIHRoZSBvcmRlciBpbiB3aGljaCBwcm9wZXJ0aWVzIGFyZSBzZXQsIGZvcgotaW5zdGFuY2UuPC9wPgotPHA+VGhlIHZhbHVlIHBhcnQgb2YgdGhlIHByb3BlcnRpZXMgYmVpbmcgc2V0LCBtaWdodCBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIKLXByb3BlcnRpZXMuIFRoZXNlIHJlZmVyZW5jZXMgYXJlIHJlc29sdmVkIGF0IHRoZSB0aW1lIHRoZXNlIHByb3BlcnRpZXMgYXJlIHNldC4KLVRoaXMgYWxzbyBob2xkcyBmb3IgcHJvcGVydGllcyBsb2FkZWQgZnJvbSBhIHByb3BlcnR5IGZpbGUuPC9wPgotPHA+QSBsaXN0IG9mIHByZWRlZmluZWQgcHJvcGVydGllcyBjYW4gYmUgZm91bmQgPGEKLWhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyI+aGVyZTwvYT4uPC9wPgotPHA+U2luY2UgQXBhY2hlIEFudCAxLjguMCBpdCBpcyBwb3NzaWJsZSB0byBsb2FkIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB4bWwKLWFjY29yZGluZyB0byA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZCI+U3VucyBEVEQ8L2E+LAotaWYgSmF2YTUrIGlzIHByZXNlbnQuIEZvciB0aGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCByZXNvdXJjZSBvciB1cmwgaGFzIAotdG8gZW5kIHdpdGggPHR0Pi54bWw8L3R0Pi48L3A+Cis8cD5BbHRob3VnaCBjb21iaW5hdGlvbnMgb2YgdGhlc2Ugd2F5cyBhcmUgcG9zc2libGUsIG9ubHkgb25lIHNob3VsZCBiZSB1c2VkIGF0IGEgdGltZS4gUHJvYmxlbXMKK21pZ2h0IG9jY3VyIHdpdGggdGhlIG9yZGVyIGluIHdoaWNoIHByb3BlcnRpZXMgYXJlIHNldCwgZm9yIGluc3RhbmNlLjwvcD4KKzxwPlRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBwcm9wZXJ0aWVzIGJlaW5nIHNldCBtaWdodCBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgcHJvcGVydGllcy4gVGhlc2UKK3JlZmVyZW5jZXMgYXJlIHJlc29sdmVkIGF0IHRoZSB0aW1lIHRoZXNlIHByb3BlcnRpZXMgYXJlIHNldC4gIFRoaXMgYWxzbyBob2xkcyBmb3IgcHJvcGVydGllcyBsb2FkZWQKK2Zyb20gYSBwcm9wZXJ0eSBmaWxlLjwvcD4KKzxwPkEgbGlzdCBvZiBwcmVkZWZpbmVkIHByb3BlcnRpZXMgY2FuIGJlCitmb3VuZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHMiPmhlcmU8L2E+LjwvcD4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuOC4wPC9lbT4sIGl0IGlzIHBvc3NpYmxlIHRvIGxvYWQgcHJvcGVydGllcyBkZWZpbmVkIGluIFhNTCBhY2NvcmRpbmcKK3RvIDxhIGhyZWY9Imh0dHBzOi8vamF2YS5zdW4uY29tL2R0ZC9wcm9wZXJ0aWVzLmR0ZCIgdGFyZ2V0PSJfdG9wIj5TdW4gRFREPC9hPiwgd2hlbiBydW5uaW5nIG9uIEphdmEKKzUrLiBGb3IgdGhpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSwgcmVzb3VyY2Ugb3IgdXJsIGhhcyB0byBlbmQgd2l0aCA8c2FtcD4ueG1sPC9zYW1wPi48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS48L3RkPgotICAgIDx0ZCB2YWxpZ249Im1pZGRsZSIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMyI+T25lIG9mIHRoZXNlIG9yCi0gICAgICAgbmVzdGVkIHRleHQsIHdoZW4gdXNpbmcgdGhlIG5hbWUgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD50aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPk9uZSBvZiB0aGVzZSBvciBuZXN0ZWQgdGV4dCwgd2hlbiB0aGUgPHZhcj5uYW1lPC92YXI+IGF0dHJpYnV0ZSBpcyBzZXQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIHRoZSBwcm9wZXJ0eSB0byB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlCi0gICAgICBnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQKLSAgICAgIGlzIGxlZnQgdW5jaGFuZ2VkICh3aXRoIC8gYW5kIFwgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gdGhlCi0gICAgICBjdXJyZW50IHBsYXRmb3JtcyBjb252ZW50aW9ucykuIE90aGVyd2lzZSBpdCBpcyB0YWtlbiBhcyBhIHBhdGgKLSAgICAgIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBhbmQgZXhwYW5kZWQuPC90ZD4KKyAgICA8dGQ+bG9jYXRpb248L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U2V0cyB0aGUgcHJvcGVydHkgdG8gdGhlIGFic29sdXRlIGZpbGVuYW1lIG9mIHRoZSBnaXZlbiBmaWxlLiBJZiB0aGUgdmFsdWUgb2YKKyAgICAgIHRoaXMgYXR0cmlidXRlIGlzIGFuIGFic29sdXRlIHBhdGgsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkICh3aXRoIDxxPi88L3E+IGFuZCA8cT5cPC9xPgorICAgICAgY2hhcmFjdGVycyBjb252ZXJ0ZWQgdG8gdGhlIGN1cnJlbnQgcGxhdGZvcm1zIGNvbnZlbnRpb25zKS4gT3RoZXJ3aXNlIGl0IGlzIHRha2VuIGFzIGEgcGF0aAorICAgICAgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj4gYW5kIGV4cGFuZGVkLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+UmVmZXJlbmNlPC9hPiB0byBhbiBvYmplY3QKLSAgICAgIGRlZmluZWQgZWxzZXdoZXJlLiBPbmx5IHlpZWxkcyByZWFzb25hYmxlIHJlc3VsdHMgZm9yIHJlZmVyZW5jZXMKLSAgICAgIHRvIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZXM8L2E+IG9yIHByb3BlcnRpZXMuPC90ZD4KKyAgICA8dGQ+cmVmaWQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+PGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5SZWZlcmVuY2U8L2E+IHRvIGFuIG9iamVjdCBkZWZpbmVkCisgICAgICBlbHNld2hlcmUuIE9ubHkgeWllbGRzIHJlYXNvbmFibGUgcmVzdWx0cyBmb3IgcmVmZXJlbmNlcworICAgICAgdG8gPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlczwvYT4gb3IgcHJvcGVydGllcy48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4gdGhlIG5hbWUgb2YgdGhlIGNsYXNzcGF0aCByZXNvdXJjZSBjb250YWluaW5nCi0gICAgICBwcm9wZXJ0aWVzIHNldHRpbmdzIGluIHByb3BlcnRpZXMgZmlsZSBmb3JtYXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJtaWRkbGUiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjUiPk9uZSBvZiB0aGVzZSwgd2hlbgotICAgICAgPGI+bm90PC9iPiB1c2luZyB0aGUgbmFtZSBhdHRyaWJ1dGU8L3RkPgorICAgIDx0ZD5yZXNvdXJjZTwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBjbGFzc3BhdGggcmVzb3VyY2UgY29udGFpbmluZyBwcm9wZXJ0aWVzIHNldHRpbmdzIGluIHByb3BlcnRpZXMgZmlsZQorICAgICAgZm9ybWF0LjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjUiPk9uZSBvZiB0aGVzZSwgPHN0cm9uZz51bmxlc3M8L3N0cm9uZz4gdGhlIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbG9jYXRpb24gb2YgdGhlIHByb3BlcnRpZXMgZmlsZSB0byBsb2FkLjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gbG9hZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YSB1cmwgY29udGFpbmluZyBwcm9wZXJ0aWVzLWZvcm1hdCBzZXR0aW5ncy48L3RkPgorICAgIDx0ZD51cmw8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+YSBVUkwgY29udGFpbmluZyBwcm9wZXJ0aWVzLWZvcm1hdCBzZXR0aW5ncy48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbnZpcm9ubWVudDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBUaHVzCi0gICAgaWYgeW91IHNwZWNpZnkgZW52aXJvbm1lbnQ9JnF1b3Q7bXllbnYmcXVvdDsgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MgT1Mtc3BlY2lmaWMKLSAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdmlhIHByb3BlcnR5IG5hbWVzICZxdW90O215ZW52LlBBVEgmcXVvdDsgb3IKLSAgICAmcXVvdDtteWVudi5URVJNJnF1b3Q7LiBOb3RlIHRoYXQgaWYgeW91IHN1cHBseSBhIHByb3BlcnR5IG5hbWUgd2l0aCBhIGZpbmFsCi0gICAgJnF1b3Q7LiZxdW90OyBpdCB3aWxsIG5vdCBiZSBkb3VibGVkOyBpLmUuIGVudmlyb25tZW50PSZxdW90O215ZW52LiZxdW90OyB3aWxsIHN0aWxsCi0gICAgYWxsb3cgYWNjZXNzIG9mIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aHJvdWdoICZxdW90O215ZW52LlBBVEgmcXVvdDsgYW5kCi0gICAgJnF1b3Q7bXllbnYuVEVSTSZxdW90Oy4gVGhpcyBmdW5jdGlvbmFsaXR5IGlzIGN1cnJlbnRseSBvbmx5IGltcGxlbWVudGVkCi0gICAgb24gPGEgaHJlZj0iI25vdGVzLWVudiI+c2VsZWN0IHBsYXRmb3JtczwvYT4uIEZlZWwgZnJlZSB0byBzZW5kIHBhdGNoZXMgdG8gaW5jcmVhc2UgdGhlCi0gICAgbnVtYmVyIG9mIHBsYXRmb3JtcyBvbiB3aGljaCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkIDspLjxicj4KLSAgICBOb3RlIGFsc28gdGhhdCBwcm9wZXJ0aWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiBpZiB0aGUKLSAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb24geW91ciBvcGVyYXRpbmcgc3lzdGVtIGFyZSBub3Q7IGUuZy4gV2luZG93cyAyMDAwJ3MKLSAgICBzeXN0ZW0gcGF0aCB2YXJpYWJsZSBpcyBzZXQgdG8gYW4gQW50IHByb3BlcnR5IG5hbWVkICJlbnYuUGF0aCIKLSAgICByYXRoZXIgdGhhbiAiZW52LlBBVEgiLjwvdGQ+CisgICAgPHRkPmVudmlyb25tZW50PC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPnRoZSBwcmVmaXggdG8gdXNlIHdoZW4gcmV0cmlldmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRodXMgaWYgeW91CisgICAgICBzcGVjaWZ5IDx2YXI+ZW52aXJvbm1lbnQ8L3Zhcj49PHE+bXllbnY8L3E+IHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIE9TLXNwZWNpZmljIGVudmlyb25tZW50CisgICAgICB2YXJpYWJsZXMgdmlhIHByb3BlcnR5IG5hbWVzIDxjb2RlPm15ZW52LlBBVEg8L2NvZGU+IG9yIDxjb2RlPm15ZW52LlRFUk08L2NvZGU+LiBOb3RlIHRoYXQgaWYKKyAgICAgIHlvdSBzdXBwbHkgYSBwcm9wZXJ0eSA8dmFyPm5hbWU8L3Zhcj4gd2l0aCBhIGZpbmFsIDxxPi48L3E+IGl0IHdpbGwgbm90IGJlIGRvdWJsZWQ7CisgICAgICBpLmUuIDx2YXI+ZW52aXJvbm1lbnQ8L3Zhcj49PHE+bXllbnYuPC9xPiB3aWxsIHN0aWxsIGFsbG93IGFjY2VzcyBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgIHRocm91Z2ggPGNvZGU+bXllbnYuUEFUSDwvY29kZT4gYW5kIDxjb2RlPm15ZW52LlRFUk08L2NvZGU+LiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgY3VycmVudGx5CisgICAgICBvbmx5IGltcGxlbWVudGVkIG9uIDxhIGhyZWY9IiNub3Rlcy1lbnYiPnNlbGVjdCBwbGF0Zm9ybXM8L2E+LiBGZWVsIGZyZWUgdG8gc2VuZCBwYXRjaGVzIHRvCisgICAgICBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIHBsYXRmb3JtcyBvbiB3aGljaCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgc3VwcG9ydGVkIDstKS48YnIvPk5vdGUgYWxzbworICAgICAgdGhhdCBwcm9wZXJ0aWVzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9uIHlvdXIgb3BlcmF0aW5nIHN5c3RlbQorICAgICAgYXJlIG5vdDsgZS5nLiBXaW5kb3dzIDIwMDAgb3IgbGF0ZXIgc3lzdGVtIHBhdGggdmFyaWFibGUgaXMgc2V0IHRvIGFuIEFudCBwcm9wZXJ0eQorICAgICAgbmFtZWQgPGNvZGU+ZW52LlBhdGg8L2NvZGU+IHJhdGhlciB0aGFuIDxjb2RlPmVudi5QQVRIPC9jb2RlPi48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ydW50aW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwcmVmaXggdG8gdXNlIHdoZW4gcmV0cmlldmluZyBydW50aW1lIHByb3BlcnRpZXMuIFRodXMKLSAgICBpZiB5b3Ugc3BlY2lmeSBydW50aW1lPSZxdW90O215cnQmcXVvdDsgeW91IHdpbGwgYmUgYWJsZSB0byBhY2Nlc3MKLSAgICBydW50aW1lIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIG1ldGhvZHMgaW4KKyAgICA8dGQ+cnVudGltZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij50aGUgcHJlZml4IHRvIHVzZSB3aGVuIHJldHJpZXZpbmcgcnVudGltZSBwcm9wZXJ0aWVzLiBUaHVzIGlmIHlvdQorICAgIHNwZWNpZnkgPHZhcj5ydW50aW1lPC92YXI+PTxxPm15cnQ8L3E+IHlvdSB3aWxsIGJlIGFibGUgdG8gYWNjZXNzIHJ1bnRpbWUgdmFsdWVzIGNvcnJlc3BvbmRpbmcKKyAgICB0byBtZXRob2RzIGluCiAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS8xMC9kb2NzL2FwaS9qYXZhL2xhbmcvUnVudGltZS5odG1sIj5SdW50aW1lPC9hPgotICAgIGNsYXNzIHZpYSBwcm9wZXJ0eSBuYW1lcyAmcXVvdDtteXJ0LmF2YWlsYWJsZVByb2Nlc3NvcnMmcXVvdDssCi0gICAgJnF1b3Q7bXlydC5tYXhNZW1vcnkmcXVvdDssICZxdW90O215cnQudG90YWxNZW1vcnkmcXVvdDsgb3IKLSAgICAmcXVvdDtteXJ0LmZyZWVNZW1vcnkmcXVvdDsuIE5vdGUgdGhhdCBpZiB5b3Ugc3VwcGx5IGEgcHJvcGVydHkgbmFtZSB3aXRoIGEgZmluYWwKLSAgICAmcXVvdDsuJnF1b3Q7IGl0IHdpbGwgbm90IGJlIGRvdWJsZWQ7IGkuZS4gcnVudGltZT0mcXVvdDtteXJ0LiZxdW90OyB3aWxsIHN0aWxsCi0gICAgYWxsb3cgYWNjZXNzIG9mIHJ1bnRpbWUgcHJvcGVydGllcyBhcyBlLmcuICZxdW90O215cnQubWF4TWVtb3J5JnF1b3Q7Ljxicj4KLSAgICBOb3RlIGFsc28gdGhhdCB0aGUgcHJvcGVydHkgdmFsdWVzIGFyZSBzbmFwc2hvdHMgdGFrZW4gYXQgdGhlIHBvaW50IGluIHRpbWUKLSAgICB3aGVuIHRoZSA8Y29kZT5wcm9wZXJ0eTwvY29kZT4gaGFzIGJlZW4gZXhlY3V0ZWQuCi0gICAgPGVtPlNpbmNlIEFudCAxLjkuMTI8L2VtPgorICAgIGNsYXNzIHZpYSBwcm9wZXJ0eQorICAgIG5hbWVzIDxjb2RlPm15cnQuYXZhaWxhYmxlUHJvY2Vzc29yczwvY29kZT4sIDxjb2RlPm15cnQubWF4TWVtb3J5PC9jb2RlPiwgPGNvZGU+bXlydC50b3RhbE1lbW9yeTwvY29kZT4KKyAgICBvciA8Y29kZT5teXJ0LmZyZWVNZW1vcnk8L2NvZGU+LiBOb3RlIHRoYXQgaWYgeW91IHN1cHBseSBhIHByb3BlcnR5IG5hbWUgd2l0aCBhIGZpbmFsIDxxPi48L3E+CisgICAgaXQgd2lsbCBub3QgYmUgZG91YmxlZDsgaS5lLiA8dmFyPnJ1bnRpbWU8L3Zhcj49PHE+bXlydC48L3E+IHdpbGwgc3RpbGwgYWxsb3cgYWNjZXNzIG9mIHJ1bnRpbWUKKyAgICBwcm9wZXJ0aWVzIGFzIGUuZy4gPGNvZGU+bXlydC5tYXhNZW1vcnk8L2NvZGU+Ljxicj4gIE5vdGUgYWxzbyB0aGF0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgYXJlCisgICAgc25hcHNob3RzIHRha2VuIGF0IHRoZSBwb2ludCBpbiB0aW1lIHdoZW4gdGhlIDxjb2RlPnByb3BlcnR5PC9jb2RlPiBoYXMgYmVlbiBleGVjdXRlZC4gPGVtPlNpbmNlCisgICAgQW50IDEuMTAuNDwvZW0+CiAgICAgPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAotICAgICAgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkCisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLCBnaXZlbgorICAgICAgYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkCiAgICAgICBlbHNld2hlcmUuLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlByZWZpeCB0byBhcHBseSB0byBwcm9wZXJ0aWVzIGxvYWRlZCB1c2luZyA8Y29kZT5maWxlPC9jb2RlPiwKLSAgICA8Y29kZT5yZXNvdXJjZTwvY29kZT4sIG9yIDxjb2RlPnVybDwvY29kZT4uCi0gICAgICBBICIuIiBpcyBhcHBlbmRlZCB0byB0aGUgcHJlZml4IGlmIG5vdCBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQ+UHJlZml4IHRvIGFwcGx5IHRvIHByb3BlcnRpZXMgbG9hZGVkIHVzaW5nIDx2YXI+ZmlsZTwvdmFyPiwgPHZhcj5yZXNvdXJjZTwvdmFyPiwKKyAgICAgIG9yIDx2YXI+dXJsPC92YXI+LiAgQSA8cT4uPC9xPiBpcyBhcHBlbmRlZCB0byB0aGUgcHJlZml4IGlmIG5vdCBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXhWYWx1ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBhcHBseSB0aGUgcHJlZml4IHdoZW4gZXhwYW5kaW5nIHRoZQotICAgICAgcmlnaHQgaGFuZCBzaWRlIG9mIHByb3BlcnRpZXMgbG9hZGVkIHVzaW5nIDxjb2RlPmZpbGU8L2NvZGU+LAotICAgICAgPGNvZGU+cmVzb3VyY2U8L2NvZGU+LCBvciA8Y29kZT51cmw8L2NvZGU+LgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIChkZWZhdWx0PTx0dD5mYWxzZTwvdHQ+KTwvdGQ+CisgICAgPHRkPnByZWZpeFZhbHVlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gYXBwbHkgdGhlIHByZWZpeCB3aGVuIGV4cGFuZGluZyB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHByb3BlcnRpZXMgbG9hZGVkCisgICAgICB1c2luZyA8dmFyPmZpbGU8L3Zhcj4sIDx2YXI+cmVzb3VyY2U8L3Zhcj4sIG9yIDx2YXI+dXJsPC92YXI+LiAgPGVtPlNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVsYXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgc2V0IHRvIDx0dD50cnVlPC90dD4gdGhlIHJlbGF0aXZlIHBhdGgKLSAgICAgIHRvIDx0dD5iYXNlZGlyPC90dD4gaXMgc2V0LiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vIChkZWZhdWx0PTx0dD5mYWxzZTwvdHQ+KTwvdGQ+CisgICAgPHRkPnJlbGF0aXZlPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+IHRoZSByZWxhdGl2ZSBwYXRoIHRvIDx2YXI+YmFzZWRpcjwvdmFyPiBpcyBzZXQuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZWRpciB0byBjYWxjdWxhdGUgdGhlIHJlbGF0aXZlIHBhdGgKLSAgICAgIGZyb20uICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ9PHR0PiR7YmFzZWRpcn08L3R0Pik8L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+VGhlIDx2YXI+YmFzZWRpcjwvdmFyPiB0byBjYWxjdWxhdGUgdGhlIHJlbGF0aXZlIHBhdGggZnJvbS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGg0Pk9wZW5WTVMgVXNlcnM8L2g0PgotPHA+V2l0aCB0aGUgPGNvZGU+ZW52aXJvbm1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSB0aGlzIHRhc2sgd2lsbCBsb2FkIGFsbCBkZWZpbmVkCi1sb2dpY2FscyBvbiBhbiBPcGVuVk1TIHN5c3RlbS4gIExvZ2ljYWxzIHdpdGggbXVsdGlwbGUgZXF1aXZhbGVuY2UgbmFtZXMgZ2V0Ci1tYXBwZWQgdG8gYSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBlcXVpdmFsZW5jZQotbmFtZXMuICBJZiBhIGxvZ2ljYWwgaXMgZGVmaW5lZCBpbiBtdWx0aXBsZSB0YWJsZXMsIG9ubHkgdGhlIG1vc3QgbG9jYWwKLWRlZmluaXRpb24gaXMgYXZhaWxhYmxlICh0aGUgdGFibGUgcHJpb3JpdHkgb3JkZXIgYmVpbmcgUFJPQ0VTUywgSk9CLCBHUk9VUCwKLVNZU1RFTSkuCi08L3A+Cis8cD5XaXRoIHRoZSA8dmFyPmVudmlyb25tZW50PC92YXI+IGF0dHJpYnV0ZSB0aGlzIHRhc2sgd2lsbCBsb2FkIGFsbCBkZWZpbmVkIGxvZ2ljYWxzIG9uIGFuIE9wZW5WTVMKK3N5c3RlbS4gIExvZ2ljYWxzIHdpdGggbXVsdGlwbGUgZXF1aXZhbGVuY2UgbmFtZXMgZ2V0IG1hcHBlZCB0byBhIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIGEgY29tbWEKK3NlcGFyYXRlZCBsaXN0IG9mIGFsbCBlcXVpdmFsZW5jZSBuYW1lcy4gIElmIGEgbG9naWNhbCBpcyBkZWZpbmVkIGluIG11bHRpcGxlIHRhYmxlcywgb25seSB0aGUgbW9zdAorbG9jYWwgZGVmaW5pdGlvbiBpcyBhdmFpbGFibGUgKHRoZSB0YWJsZSBwcmlvcml0eSBvcmRlciBiZWluZyBQUk9DRVNTLCBKT0IsIEdST1VQLCBTWVNURU0pLjwvcD4KIAogPGg0PkFueSBPUyBleGNlcHQgT3BlblZNUzwvaDQ+Ci08cD5TdGFydGluZyB3aXRoIEFudCAxLjguMiBpZiBBbnQgZGV0ZWN0cyBpdCBpcyBydW5uaW5nIG9mIGEgSmF2YSAxLjUKLSAgVk0gKG9yIGJldHRlcikgQW50IHdpbGwgdXNlIDxjb2RlPlN5c3RlbS5nZXRlbnY8L2NvZGU+IHJhdGhlciB0aGFuCi0gIGl0cyBvd24gT1MgZGVwZW5kZW50IG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gIEZvciBzb21lIE9TZXMgdGhpcwotICBjYXVzZXMgbWlub3IgZGlmZmVyZW5jZXMgd2hlbiBjb21wYXJlZCB0byBvbGRlciB2ZXJzaW9ucyBvZiBBbnQuCi0gIEZvciBhIGZ1bGwgbGlzdAotICBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkzNjYiPkJ1Z3ppbGxhCi0gIElzc3VlIDQ5MzY2PC9hPi4gIEluIHBhcnRpY3VsYXI6PC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMjwvZW0+LCBpZiBBbnQgZGV0ZWN0cyBpdCBpcyBydW5uaW5nIG9uIGEgSmF2YSA1IG9yIG5ld2VyLCBBbnQgd2lsbAordXNlIDxjb2RlIGNsYXNzPSJjb2RlIj5TeXN0ZW0uZ2V0ZW52KCk8L2NvZGU+IHJhdGhlciB0aGFuIGl0cyBvd24gT1MgZGVwZW5kZW50IG5hdGl2ZQoraW1wbGVtZW50YXRpb24uICBGb3Igc29tZSBPU2VzIHRoaXMgY2F1c2VzIG1pbm9yIGRpZmZlcmVuY2VzIHdoZW4gY29tcGFyZWQgdG8gb2xkZXIgdmVyc2lvbnMgb2YgQW50LgorRm9yIGEgZnVsbCBsaXN0IHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00OTM2NiIKK3RhcmdldD0iX3RvcCI+QnVnemlsbGEgSXNzdWUgNDkzNjY8L2E+LiAgSW4gcGFydGljdWxhcjo8L3A+CiA8dWw+Ci0gIDxsaT5PbiBXaW5kb3dzIEFudCB3aWxsIG5vdyByZXR1cm4gYWRkaXRpb25hbCAiZW52aXJvbm1lbnQKLSAgICB2YXJpYWJsZXMiIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgZHJpdmUgc3BlY2lmaWMgY3VycmVudCB3b3JraW5nCi0gICAgZGlyZWN0b3JpZXMgd2hlbiBBbnQgaXMgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIFRoZSBrZXlzIG9mCisgIDxsaT5PbiBXaW5kb3dzLCBBbnQgd2lsbCBub3cgcmV0dXJuIGFkZGl0aW9uYWwgImVudmlyb25tZW50IHZhcmlhYmxlcyIgdGhhdCBjb3JyZXNwb25kIHRvIHRoZQorICAgIGRyaXZlIHNwZWNpZmljIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcmllcyB3aGVuIEFudCBpcyBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgVGhlIGtleXMgb2YKICAgICB0aGVzZSB2YXJpYWJsZXMgc3RhcnRzIHdpdGggYW4gZXF1YWxzIHNpZ24uPC9saT4KLSAgPGxpPlNvbWUgdXNlcnMgcmVwb3J0ZWQgdGhhdCBzb21lIEN5Z3dpbiBzcGVjaWZpYyB2YXJpYWJsZXMgKGluCi0gICAgcGFydGljdWxhciBQUk9NUFQpIHdhcyBubyBsb25nZXIgcHJlc2VudC48L2xpPgotICA8bGk+T24gT1MvMiBBbnQgbm8gbG9uZ2VyIHJldHVybnMgdGhlIEJFR0lOTElCUEFUSCB2YXJpYWJsZS48L2xpPgorICA8bGk+U29tZSB1c2VycyByZXBvcnRlZCB0aGF0IHNvbWUgQ3lnd2luIHNwZWNpZmljIHZhcmlhYmxlcyAoaW4gcGFydGljdWxhciA8Y29kZT5QUk9NUFQ8L2NvZGU+KQorICAgIHdlcmUgbm8gbG9uZ2VyIHByZXNlbnQuPC9saT4KKyAgPGxpPk9uIE9TLzIsIEFudCBubyBsb25nZXIgcmV0dXJucyB0aGUgPGNvZGU+QkVHSU5MSUJQQVRIPC9jb2RlPiB2YXJpYWJsZS48L2xpPgogPC91bD4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+Y2xhc3NwYXRoPC9oND4KLTxwPjxjb2RlPlByb3BlcnR5PC9jb2RlPidzIDxpPmNsYXNzcGF0aDwvaT4gYXR0cmlidXRlIGlzIGEgPGEKLWhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+UEFUSCBsaWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQKLTxpPmNsYXNzcGF0aDwvaT4gZWxlbWVudC48L3A+Cis8cD48Y29kZT5Qcm9wZXJ0eTwvY29kZT4ncyA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhdHRyaWJ1dGUgaXMKK2EgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhCituZXN0ZWQgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBlbGVtZW50LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmb28uZGlzdCZxdW90OyB2YWx1ZT0mcXVvdDtkaXN0JnF1b3Q7LyZndDs8L3ByZT4KLTxwPnNldHMgdGhlIHByb3BlcnR5IDxjb2RlPmZvby5kaXN0PC9jb2RlPiB0byB0aGUgdmFsdWUgJnF1b3Q7ZGlzdCZxdW90Oy48L3A+Cis8cD5TZXQgdGhlIHByb3BlcnR5IDxjb2RlPmZvby5kaXN0PC9jb2RlPiB0byB0aGUgdmFsdWUgPHE+ZGlzdDwvcT4uPC9wPgorPHByZT4mbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmb28uZGlzdCZxdW90OyB2YWx1ZT0mcXVvdDtkaXN0JnF1b3Q7LyZndDs8L3ByZT4KIAotPHByZT4gICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Zvby5kaXN0JnF1b3Q7Jmd0O2Rpc3QmbHQ7L3Byb3BlcnR5Jmd0OzwvcHJlPgotPHA+c2V0cyB0aGUgcHJvcGVydHkgPGNvZGU+Zm9vLmRpc3Q8L2NvZGU+IHRvIHRoZSB2YWx1ZSAmcXVvdDtkaXN0JnF1b3Q7LjwvcD4KKzxwPlNldCB0aGUgcHJvcGVydHkgPGNvZGU+Zm9vLmRpc3Q8L2NvZGU+IHRvIHRoZSB2YWx1ZSA8cT5kaXN0PC9xPi48L3A+Cis8cHJlPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Zvby5kaXN0JnF1b3Q7Jmd0O2Rpc3QmbHQ7L3Byb3BlcnR5Jmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7Zm9vLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgotPHA+cmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIGEgZmlsZSBjYWxsZWQgJnF1b3Q7Zm9vLnByb3BlcnRpZXMmcXVvdDsuPC9wPgorPHA+UmVhZCBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gYSBmaWxlIGNhbGxlZCA8c2FtcD5mb28ucHJvcGVydGllczwvc2FtcD4uPC9wPgorPHByZT4mbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7cHJvcGVydHkgdXJsPSZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS9ibGEvcHJvcHMvZm9vLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgotPHA+cmVhZHMgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIHRoZSBhZGRyZXNzICZxdW90O2h0dHA6Ly93d3cubXlzaXRlLmNvbS9ibGEvcHJvcHMvZm9vLnByb3BlcnRpZXMmcXVvdDsuPC9wPgorPHA+UmVhZCBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlCithZGRyZXNzIDxzYW1wPmh0dHBzOi8vd3d3Lm15c2l0ZS5jb20vYmxhL3Byb3BzL2Zvby5wcm9wZXJ0aWVzPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtwcm9wZXJ0eSB1cmw9JnF1b3Q7aHR0cHM6Ly93d3cubXlzaXRlLmNvbS9ibGEvcHJvcHMvZm9vLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O3Byb3BlcnR5IHJlc291cmNlPSZxdW90O2Zvby5wcm9wZXJ0aWVzJnF1b3Q7LyZndDs8L3ByZT4KLTxwPnJlYWRzIGEgc2V0IG9mIHByb3BlcnRpZXMgZnJvbSBhIHJlc291cmNlIGNhbGxlZCAmcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy48L3A+Ci08cD5Ob3RlIHRoYXQgeW91IGNhbiByZWZlcmVuY2UgYSBnbG9iYWwgcHJvcGVydGllcyBmaWxlIGZvciBhbGwgb2YgeW91ciBBbnQKLWJ1aWxkcyB1c2luZyB0aGUgZm9sbG93aW5nOjwvcD4KKzxwPlJlYWQgYSBzZXQgb2YgcHJvcGVydGllcyBmcm9tIGEgcmVzb3VyY2UgY2FsbGVkIDxzYW1wPmZvby5wcm9wZXJ0aWVzPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtwcm9wZXJ0eSByZXNvdXJjZT0mcXVvdDtmb28ucHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwcmU+ICAmbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLmFudC1nbG9iYWwucHJvcGVydGllcyZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5zaW5jZSB0aGUgJnF1b3Q7dXNlci5ob21lJnF1b3Q7IHByb3BlcnR5IGlzIGRlZmluZWQgYnkgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lCi10byBiZSB5b3VyIGhvbWUgZGlyZWN0b3J5LiAgV2hlcmUgdGhlICZxdW90O3VzZXIuaG9tZSZxdW90OyBwcm9wZXJ0eSByZXNvbHZlcyB0byBpbgotdGhlIGZpbGUgc3lzdGVtIGRlcGVuZHMgb24gdGhlIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbiBhbmQgdGhlIEpWTSBpbXBsZW1lbnRhdGlvbi4KLU9uIFVuaXggYmFzZWQgc3lzdGVtcywgdGhpcyB3aWxsIG1hcCB0byB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LiBPbiBtb2Rlcm4gV2luZG93cwotdmFyaWFudHMsIHRoaXMgd2lsbCBtb3N0IGxpa2VseSByZXNvbHZlIHRvIHRoZSB1c2VyJ3MgZGlyZWN0b3J5IGluIHRoZSAmcXVvdDtEb2N1bWVudHMKLWFuZCBTZXR0aW5ncyZxdW90OyBvciAmcXVvdDtVc2VycyZxdW90OyBmb2xkZXIuIE9sZGVyIHdpbmRvd3MgdmFyaWFudHMgc3VjaCBhcyBXaW5kb3dzIDk4L01FIGFyZSBsZXNzCi1wcmVkaWN0YWJsZSwgYXMgYXJlIG90aGVyIG9wZXJhdGluZyBzeXN0ZW0vSlZNIGNvbWJpbmF0aW9ucy48L3A+Cis8cD5Ob3RlIHRoYXQgeW91IGNhbiByZWZlcmVuY2UgYSBnbG9iYWwgcHJvcGVydGllcyBmaWxlIGZvciBhbGwgb2YgeW91ciBBbnQgYnVpbGRzIHVzaW5nIHRoZQorZm9sbG93aW5nOjwvcD4KKzxwcmU+Jmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7JHt1c2VyLmhvbWV9Ly5hbnQtZ2xvYmFsLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgorPHA+c2luY2UgdGhlIDxjb2RlPnVzZXIuaG9tZTwvY29kZT4gcHJvcGVydHkgaXMgZGVmaW5lZCBieSBKVk0gdG8gYmUgeW91ciBob21lIGRpcmVjdG9yeS4gV2hlcmUKK3RoZSA8Y29kZT51c2VyLmhvbWU8L2NvZGU+IHByb3BlcnR5IHJlc29sdmVzIHRvIGluIHRoZSBmaWxlIHN5c3RlbSBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtCit2ZXJzaW9uIGFuZCB0aGUgSlZNIGltcGxlbWVudGF0aW9uLiAgT24gVW5peCBiYXNlZCBzeXN0ZW1zLCB0aGlzIHdpbGwgbWFwIHRvIHRoZSB1c2VyJ3MgaG9tZQorZGlyZWN0b3J5LiBPbiBtb2Rlcm4gV2luZG93cyB2YXJpYW50cywgdGhpcyB3aWxsIG1vc3QgbGlrZWx5IHJlc29sdmUgdG8gdGhlIHVzZXIncyBkaXJlY3RvcnkgaW4KK3RoZSA8c2FtcD5Eb2N1bWVudHMgYW5kIFNldHRpbmdzPC9zYW1wPiBvciA8c2FtcD5Vc2Vyczwvc2FtcD4gZm9sZGVyLiBPbGRlciBXaW5kb3dzIHZhcmlhbnRzIHN1Y2ggYXMKK1dpbmRvd3MgOTgvTUUgYXJlIGxlc3MgcHJlZGljdGFibGUsIGFzIGFyZSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtL0pWTSBjb21iaW5hdGlvbnMuPC9wPgogCis8cD5SZWFkIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzdG9yZXMgdGhlbSBpbiBwcm9wZXJ0aWVzLCBwcmVmaXhlZAord2l0aCA8cT5lbnY8L3E+LiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIG9uIDxlbT5zZWxlY3Q8L2VtPiBvcGVyYXRpbmcgc3lzdGVtcy4gVHdvIG9mIHRoZSB2YWx1ZXMKK2FyZSBzaG93biBiZWluZyBlY2hvZWQuPC9wPgogPHByZT4KLSAgJmx0O3Byb3BlcnR5IGVudmlyb25tZW50PSZxdW90O2VudiZxdW90Oy8mZ3Q7Ci0gICZsdDtlY2hvIG1lc3NhZ2U9JnF1b3Q7TnVtYmVyIG9mIFByb2Nlc3NvcnMgPSAke2Vudi5OVU1CRVJfT0ZfUFJPQ0VTU09SU30mcXVvdDsvJmd0OwotICAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90O0FOVF9IT01FIGlzIHNldCB0byA9ICR7ZW52LkFOVF9IT01FfSZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPnJlYWRzIHRoZSBzeXN0ZW0gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzdG9yZXMgdGhlbSBpbiBwcm9wZXJ0aWVzLCBwcmVmaXhlZCB3aXRoICZxdW90O2VudiZxdW90Oy4KLU5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3Mgb24gPGVtPnNlbGVjdDwvZW0+IG9wZXJhdGluZyBzeXN0ZW1zLgotVHdvIG9mIHRoZSB2YWx1ZXMgYXJlIHNob3duIGJlaW5nIGVjaG9lZC4KLTwvcD4KKyZsdDtwcm9wZXJ0eSBlbnZpcm9ubWVudD0mcXVvdDtlbnYmcXVvdDsvJmd0OworJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtOdW1iZXIgb2YgUHJvY2Vzc29ycyA9ICR7ZW52Lk5VTUJFUl9PRl9QUk9DRVNTT1JTfSZxdW90Oy8mZ3Q7CismbHQ7ZWNobyBtZXNzYWdlPSZxdW90O0FOVF9IT01FIGlzIHNldCB0byA9ICR7ZW52LkFOVF9IT01FfSZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPlRoaXMgYnVpbGRmaWxlIHVzZXMgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBpbiA8c2FtcD5idWlsZC5wcm9wZXJ0aWVzPC9zYW1wPi4gUmVnYXJkaW5nIHRvIHRoZQorZW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+U1RBR0U8L2NvZGU+IHNvbWUgb3IgYWxsIHZhbHVlcyBjb3VsZCBiZSBvdmVyd3JpdHRlbiwKK2UuZy4gaGF2aW5nIDxjb2RlPlNUQUdFPXRlc3Q8L2NvZGU+IGFuZCBhIDxzYW1wPnRlc3QucHJvcGVydGllczwvc2FtcD4geW91IGhhdmUgc3BlY2lhbCB2YWx1ZXMgZm9yCit0aGF0IChsaWtlIGFub3RoZXIgbmFtZSBmb3IgdGhlIHRlc3Qgc2VydmVyKS4gRmluYWxseSBhbGwgdGhlc2UgdmFsdWVzIGNvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5CitwZXJzb25hbCBzZXR0aW5ncyB3aXRoIGEgZmlsZSBwZXIgdXNlci48L3A+CiA8cHJlPgotICAmbHQ7cHJvcGVydHkgZW52aXJvbm1lbnQ9JnF1b3Q7ZW52JnF1b3Q7LyZndDsKLSAgJmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7JHt1c2VyLm5hbWV9LnByb3BlcnRpZXMmcXVvdDsvJmd0OwotICAmbHQ7cHJvcGVydHkgZmlsZT0mcXVvdDske2Vudi5TVEFHRX0ucHJvcGVydGllcyZxdW90Oy8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90O2J1aWxkLnByb3BlcnRpZXMmcXVvdDsvJmd0OwotPC9wcmU+Ci08cD5UaGlzIGJ1aWxkZmlsZSB1c2VzIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gPHR0PmJ1aWxkLnByb3BlcnRpZXM8L3R0Pi4gUmVnYXJkaW5nIHRvIHRoZQotZW52aXJvbm1lbnQgdmFyaWFibGUgPHR0PlNUQUdFPC90dD4gc29tZSBvciBhbGwgdmFsdWVzIGNvdWxkIGJlIG92ZXJ3cml0dGVuLCBlLmcuIGhhdmluZwotPHR0PlNUQUdFPXRlc3Q8L3R0PiBhbmQgYSA8dHQ+dGVzdC5wcm9wZXJ0aWVzPC90dD4geW91IGhhdmUgc3BlY2lhbCB2YWx1ZXMgZm9yIHRoYXQgKGxpa2UgYW5vdGhlcgotbmFtZSBmb3IgdGhlIHRlc3Qgc2VydmVyKS4gRmluYWxseSBhbGwgdGhlc2UgdmFsdWVzIGNvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IHBlcnNvbmFsIHNldHRpbmdzIHdpdGgKLWEgZmlsZSBwZXIgdXNlci48L3A+CismbHQ7cHJvcGVydHkgZW52aXJvbm1lbnQ9JnF1b3Q7ZW52JnF1b3Q7LyZndDsKKyZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90OyR7dXNlci5uYW1lfS5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90OyR7ZW52LlNUQUdFfS5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyZsdDtwcm9wZXJ0eSBmaWxlPSZxdW90O2J1aWxkLnByb3BlcnRpZXMmcXVvdDsvJmd0OzwvcHJlPgogCi08cHJlPgotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmb28mcXVvdDsgbG9jYXRpb249JnF1b3Q7bXkvZmlsZS50eHQmcXVvdDsgcmVsYXRpdmU9JnF1b3Q7dHJ1ZSZxdW90OyBiYXNlZGlyPSZxdW90Oy4uJnF1b3Q7LyZndDsKLTwvcHJlPgotPHA+U3RvcmVzIHRoZSByZWxhdGl2ZSBwYXRoIGluIDx0dD5mb288L3R0PjogcHJvamVjdGJhc2VkaXIvbXkvZmlsZS50eHQ8L3A+Cis8cD5TdG9yZSB0aGUgcmVsYXRpdmUgcGF0aCBpbiA8Y29kZT5mb288L2NvZGU+OiA8c2FtcD4uLi9teS9maWxlLnR4dDwvc2FtcD48L3A+Cis8cHJlPiZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2ZvbyZxdW90OyBsb2NhdGlvbj0mcXVvdDtteS9maWxlLnR4dCZxdW90OyByZWxhdGl2ZT0mcXVvdDt0cnVlJnF1b3Q7IGJhc2VkaXI9JnF1b3Q7Li4mcXVvdDsvJmd0OzwvcHJlPgogCi08cHJlPgotICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmb28mcXVvdDsgbG9jYXRpb249JnF1b3Q7bXkvZmlsZS50eHQmcXVvdDsgcmVsYXRpdmU9JnF1b3Q7dHJ1ZSZxdW90OyBiYXNlZGlyPSZxdW90O2N2cyZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPlN0b3JlcyB0aGUgcmVsYXRpdmUgcGF0aCBpbiA8dHQ+Zm9vPC90dD46IC4uL215L2ZpbGUudHh0PC9wPgorPHA+U3RvcmUgdGhlIHJlbGF0aXZlIHBhdGggaW4gPGNvZGU+Zm9vPC9jb2RlPjogPHNhbXA+Y3ZzL215L2ZpbGUudHh0PC9zYW1wPjwvcD4KKzxwcmU+Jmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7Zm9vJnF1b3Q7IGxvY2F0aW9uPSZxdW90O215L2ZpbGUudHh0JnF1b3Q7IHJlbGF0aXZlPSZxdW90O3RydWUmcXVvdDsgYmFzZWRpcj0mcXVvdDtjdnMmcXVvdDsvJmd0OzwvcHJlPgogCis8aDM+UHJvcGVydHkgZmlsZXM8L2gzPgogCi08aDM+UHJvcGVydHkgRmlsZXM8L2gzPgotCi1BcyBzdGF0ZWQsIHRoaXMgdGFzayB3aWxsIGxvYWQgaW4gYSBwcm9wZXJ0aWVzIGZpbGUgc3RvcmVkIGluIHRoZSBmaWxlCi1zeXN0ZW0sIG9yIGFzIGEgcmVzb3VyY2Ugb24gYSBjbGFzc3BhdGguIEhlcmUgYXJlIHNvbWUgaW50ZXJlc3RpbmcgZmFjdHMKLWFib3V0IHRoaXMgZmVhdHVyZQorPHA+QXMgc3RhdGVkLCB0aGlzIHRhc2sgd2lsbCBsb2FkIGluIGEgcHJvcGVydGllcyBmaWxlIHN0b3JlZCBpbiB0aGUgZmlsZSBzeXN0ZW0sIG9yIGFzIGEgcmVzb3VyY2UKK29uIGEgY2xhc3NwYXRoLiBIZXJlIGFyZSBzb21lIGludGVyZXN0aW5nIGZhY3RzIGFib3V0IHRoaXMgZmVhdHVyZTwvcD4KIDxvbD4KLTxsaT5JZiB0aGUgZmlsZSBpcyBub3QgdGhlcmUsIG5vdGhpbmcgaXMgcHJpbnRlZCBleGNlcHQgYXQgLXZlcmJvc2UgbG9nCi1sZXZlbC4gVGhpcyBsZXRzIHlvdSBoYXZlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGV2ZXJ5Ci1wcm9qZWN0LCB0aGF0IHRlYW0gbWVtYmVycyBjYW4gY3VzdG9taXplLgotPGxpPlRoZSBydWxlcyBmb3IgdGhpcyBmb3JtYXQgbWF0Y2ggPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL3V0aWwvUHJvcGVydGllcy5odG1sI2xvYWQlMjhqYXZhLmlvLklucHV0U3RyZWFtJTI5Ij5qYXZhLnV0aWwuUHJvcGVydGllczwvYT4uPC9saT4KLTxsaT5UcmFpbGluZyBzcGFjZXMgYXJlIG5vdCBzdHJpcHBlZC4gSXQgbWF5IGhhdmUgYmVlbiB3aGF0IHlvdSB3YW50ZWQuPC9saT4KLTxsaT5XYW50IHVudXN1YWwgY2hhcmFjdGVycz8gRXNjYXBlIHRoZW0gXHUwNDU2IG9yIFwmcXVvdDsgc3R5bGUuPC9saT4KLTxsaT5BbnQgUHJvcGVydGllcyBhcmUgZXhwYW5kZWQgaW4gdGhlIGZpbGU8L2xpPgotPGxpPklmIHlvdSB3YW50IHRvIGV4cGFuZCBwcm9wZXJ0aWVzIGRlZmluZWQgaW5zaWRlIHRoZSBzYW1lIGZpbGUgYW5kCi0gIHlvdSB1c2UgdGhlIHByZWZpeCBhdHRyaWJ1dGUgb2YgdGhlIHRhc2ssIHlvdSBtdXN0IHVzZSB0aGUgc2FtZQotICBwcmVmaXggd2hlbiBleHBhbmRpbmcgdGhlIHByb3BlcnRpZXMgb3IKLSAgc2V0IDxjb2RlPnByZWZpeFZhbHVlczwvY29kZT4gdG8gdHJ1ZS48L2xpPgorICA8bGk+SWYgdGhlIGZpbGUgaXMgbm90IHRoZXJlLCBub3RoaW5nIGlzIHByaW50ZWQgZXhjZXB0IGF0IDxrYmQ+LXZlcmJvc2U8L2tiZD4gbG9nIGxldmVsLiBUaGlzCisgICAgbGV0cyB5b3UgaGF2ZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBldmVyeSBwcm9qZWN0LCB0aGF0IHRlYW0gbWVtYmVycyBjYW4gY3VzdG9taXplLgorICA8bGk+VGhlIHJ1bGVzIGZvciB0aGlzIGZvcm1hdAorICAgIG1hdGNoIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwjbG9hZC1qYXZhLmlvLklucHV0U3RyZWFtLSIKKyAgICB0YXJnZXQ9Il90b3AiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPi48L2xpPgorICA8bGk+VHJhaWxpbmcgc3BhY2VzIGFyZSBub3Qgc3RyaXBwZWQuIEl0IG1heSBoYXZlIGJlZW4gd2hhdCB5b3Ugd2FudGVkLjwvbGk+CisgIDxsaT5XYW50IHVudXN1YWwgY2hhcmFjdGVycz8gRXNjYXBlIHRoZW0gPGNvZGU+XHUwNDU2PC9jb2RlPiBvciA8Y29kZT5cJnF1b3Q7PC9jb2RlPiBzdHlsZS48L2xpPgorICA8bGk+QW50IFByb3BlcnRpZXMgYXJlIGV4cGFuZGVkIGluIHRoZSBmaWxlPC9saT4KKyAgPGxpPklmIHlvdSB3YW50IHRvIGV4cGFuZCBwcm9wZXJ0aWVzIGRlZmluZWQgaW5zaWRlIHRoZSBzYW1lIGZpbGUgYW5kIHlvdSB1c2UKKyAgICB0aGUgPHZhcj5wcmVmaXg8L3Zhcj4gYXR0cmlidXRlIG9mIHRoZSB0YXNrLCB5b3UgbXVzdCB1c2UgdGhlIHNhbWUgcHJlZml4IHdoZW4gZXhwYW5kaW5nIHRoZQorICAgIHByb3BlcnRpZXMgb3Igc2V0IDx2YXI+cHJlZml4VmFsdWVzPC92YXI+IHRvIDxxPnRydWU8L3E+LjwvbGk+CiA8L29sPgotSW4tZmlsZSBwcm9wZXJ0eSBleHBhbnNpb24gaXMgdmVyeSBjb29sLiBMZWFybiB0byB1c2UgaXQuCi08cD4KLUV4YW1wbGU6Cis8cD5Jbi1maWxlIHByb3BlcnR5IGV4cGFuc2lvbiBpcyB2ZXJ5IGNvb2wuIExlYXJuIHRvIHVzZSBpdC48L3A+Cis8cD5FeGFtcGxlOjwvcD4KIDxwcmU+CiBidWlsZC5jb21waWxlcj1qaWtlcwogZGVwbG95LnNlcnZlcj1sdWNreQotZGVwbG95LnBvcnQ9ODA4MAotZGVwbG95LnVybD1odHRwOi8vJHtkZXBsb3kuc2VydmVyfToke2RlcGxveS5wb3J0fS8KLTwvcHJlPgorZGVwbG95LnBvcnQ9ODQ0MworZGVwbG95LnVybD1odHRwczovLyR7ZGVwbG95LnNlcnZlcn06JHtkZXBsb3kucG9ydH0vPC9wcmU+CiAKLQotPGEgbmFtZT0ibm90ZXMtZW52Ij48L2E+Ci08aDM+Tm90ZXMgYWJvdXQgZW52aXJvbm1lbnQgdmFyaWFibGVzPC9oMz4KKzxoMyBpZD0ibm90ZXMtZW52Ij5Ob3RlcyBhYm91dCBlbnZpcm9ubWVudCB2YXJpYWJsZXM8L2gzPgogPHA+CiAgIFdoZW4gQW50IHN0YXJ0ZWQgdG8gc3VwcG9ydCBzZXR0aW5nIHByb3BlcnRpZXMgZnJvbSBlbnZpcm9ubWVudAotICB2YXJpYWJsZXMgaXQgcmFuIG9uIEphdmEgMS4yIHdoZXJlIDxjb2RlPlN5c3RlbS5nZXRFbnY8L2NvZGU+IGRpZG4ndAorICB2YXJpYWJsZXMgaXQgcmFuIG9uIEphdmEgMS4yIHdoZXJlIDxjb2RlIGNsYXNzPSJjb2RlIj5TeXN0ZW0uZ2V0RW52PC9jb2RlPiBkaWRuJ3QKICAgd29yay4gU28gd2UgZGVjaWRlZCB0byBzdGFydCBhIGNvbW1hbmQgaW4gYSBuZXcgcHJvY2VzcyB3aGljaCBwcmludHMKICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcywgYW5hbHl6ZXMgdGhlIG91dHB1dCBhbmQgY3JlYXRlcyB0aGUKICAgcHJvcGVydGllcy4gT25jZSBKYXZhIDUgYmVjYW1lIG91ciBiYXNlbGluZSB3ZSBjb3VsZCBoYXZlIHN3aXRjaGVkCi0gIHRvIDxjb2RlPmdldEVudjwvY29kZT4gYnV0IGl0IHJldHVybmVkIGRpZmZlcmVudCByZXN1bHRzIG9uIHNvbWUKKyAgdG8gPGNvZGUgY2xhc3M9ImNvZGUiPmdldEVudjwvY29kZT4gYnV0IGl0IHJldHVybmVkIGRpZmZlcmVudCByZXN1bHRzIG9uIHNvbWUKICAgcGxhdGZvcm1zIHNvIHdlIHN0dWNrIHdpdGggdGhlIGNvbW1hbmQgYXBwcm9hY2ggdG8gcmVtYWluIGJhY2t3YXJkcwogICBjb21wYXRpYmxlLgogPC9wPgogPHA+CiAgIFRoZXJlIGFyZSBjb21tYW5kcyBmb3IgdGhlIGZvbGxvd2luZyBvcGVyYXRpbmcgc3lzdGVtcyBpbXBsZW1lbnRlZCBpbgogICA8YSBocmVmPSJodHRwczovL2dpdGJveC5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPWFudC5naXQ7YT1ibG9iO2Y9c3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZS5qYXZhO2g9MmYyOTI1NmVkOGVlOTY0ZDc4NzE4ZmQwZDc5Mjk2NTkwMDg0ODJlNjtoYj1IRUFEIj4KLSAgRXhlY3V0ZS5qYXZhPC9hPiAobWV0aG9kIDx0dD5nZXRQcm9jRW52Q29tbWFuZCgpPC90dD4pOgorICBFeGVjdXRlLmphdmE8L2E+IChtZXRob2QgPGNvZGUgY2xhc3M9ImNvZGUiPmdldFByb2NFbnZDb21tYW5kKCk8L2NvZGU+KToKICAgPHRhYmxlPgogICAgIDx0cj4KLSAgICAgIDx0aD5PUzwvdGg+Ci0gICAgICA8dGg+Y29tbWFuZDwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+T1M8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPmNvbW1hbmQ8L3RoPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPiBvcy8yIDwvdGQ+Ci0gICAgICA8dGQ+IGNtZCAvYyBzZXQgPC90ZD4KKyAgICAgIDx0ZD5vcy8yPC90ZD4KKyAgICAgIDx0ZD48Y29kZT5jbWQgL2Mgc2V0PC9jb2RlPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgY29sc3Bhbj0iMiI+IHdpbmRvd3MgPC90ZD4KKyAgICAgIDx0ZCBjb2xzcGFuPSIyIj53aW5kb3dzPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZD4gKiB3aW45eCA8L3RkPgotICAgICAgPHRkPiBjb21tYW5kLmNvbSAvYyBzZXQgPC90ZD4KKyAgICAgIDx0ZD4qIHdpbjl4PC90ZD4KKyAgICAgIDx0ZD48Y29kZT5jb21tYW5kLmNvbSAvYyBzZXQ8L2NvZGU+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZD4gKiBvdGhlciA8L3RkPgotICAgICAgPHRkPiBjbWQgL2Mgc2V0IDwvdGQ+CisgICAgICA8dGQ+KiBvdGhlcjwvdGQ+CisgICAgICA8dGQ+PGNvZGU+Y21kIC9jIHNldDwvY29kZT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPiB6L29zIDwvdGQ+Ci0gICAgICA8dGQ+IC9iaW4vZW52IDxiPk9SPC9iPiAvdXNyL2Jpbi9lbnYgPGI+T1I8L2I+IGVudiAgIDxpPihkZXBlbmRpbmcgb24gcmVhZCByaWdodHMpPC9pPiA8L3RkPgorICAgICAgPHRkPnovb3M8L3RkPgorICAgICAgPHRkPjxjb2RlPi9iaW4vZW52PC9jb2RlPiA8c3Ryb25nPk9SPC9zdHJvbmc+IDxjb2RlPi91c3IvYmluL2VudjwvY29kZT4gPHN0cm9uZz5PUjwvc3Ryb25nPiA8Y29kZT5lbnY8L2NvZGU+ICg8ZW0+ZGVwZW5kaW5nIG9uIHJlYWQgcmlnaHRzPC9lbT4pPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZD4gdW5peCA8L3RkPgotICAgICAgPHRkPiAvYmluL2VudiA8Yj5PUjwvYj4gL3Vzci9iaW4vZW52IDxiPk9SPC9iPiBlbnYgICA8aT4oZGVwZW5kaW5nIG9uIHJlYWQgcmlnaHRzKTwvaT4gPC90ZD4KKyAgICAgIDx0ZD51bml4PC90ZD4KKyAgICAgIDx0ZD48Y29kZT4vYmluL2VudjwvY29kZT4gPHN0cm9uZz5PUjwvc3Ryb25nPiA8Y29kZT4vdXNyL2Jpbi9lbnY8L2NvZGU+IDxzdHJvbmc+T1I8L3N0cm9uZz4gPGNvZGU+ZW52PC9jb2RlPiAoPGVtPmRlcGVuZGluZyBvbiByZWFkIHJpZ2h0czwvZW0+KTwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQ+IG5ldHdhcmUgPC90ZD4KLSAgICAgIDx0ZD4gZW52IDwvdGQ+CisgICAgICA8dGQ+bmV0d2FyZTwvdGQ+CisgICAgICA8dGQ+PGNvZGU+ZW52PC9jb2RlPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQ+IG9zLzQwMCA8L3RkPgotICAgICAgPHRkPiBlbnYgPC90ZD4KKyAgICAgIDx0ZD5vcy80MDA8L3RkPgorICAgICAgPHRkPjxjb2RlPmVudjwvY29kZT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPiBvcGVudm1zIDwvdGQ+Ci0gICAgICA8dGQ+IHNob3cgbG9naWNhbCA8L3RkPgorICAgICAgPHRkPm9wZW52bXM8L3RkPgorICAgICAgPHRkPjxjb2RlPnNob3cgbG9naWNhbDwvY29kZT48L3RkPgogICAgIDwvdHI+CiAgIDwvdGFibGU+Ci08L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbCBiL21hbnVhbC9UYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbAppbmRleCBlNDAzMGY4Li41ZjIxOTYyIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcHJvcGVydHlmaWxlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3Byb3BlcnR5ZmlsZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsOSArMTUsOCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlByb3BlcnR5RmlsZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI0LDE0MyArMjQsMTQwIEBACiA8Ym9keT4KIAogPGgxPlByb3BlcnR5RmlsZTwvaDE+Cis8aHIvPgorPGgyIGlkPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvaDI+Cis8cD5BcGFjaGUgQW50IHByb3ZpZGVzIGFuIG9wdGlvbmFsIHRhc2sgZm9yIGVkaXRpbmcgcHJvcGVydHkgZmlsZXMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgd2hlbiB3YW50aW5nCit0byBtYWtlIHVuYXR0ZW5kZWQgbW9kaWZpY2F0aW9ucyB0byBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBhcHBsaWNhdGlvbiBzZXJ2ZXJzIGFuZAorYXBwbGljYXRpb25zLiBDdXJyZW50bHksIHRoZSB0YXNrIG1haW50YWlucyBhIHdvcmtpbmcgcHJvcGVydHkgZmlsZSB3aXRoIHRoZSBhYmlsaXR5IHRvIGFkZAorcHJvcGVydGllcyBvciBtYWtlIGNoYW5nZXMgdG8gZXhpc3Rpbmcgb25lcy4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+IGNvbW1lbnRzIGFuZCBsYXlvdXQgb2YgdGhlCitvcmlnaW5hbCBwcm9wZXJ0aWVzIGZpbGUgYXJlIHByZXNlcnZlZC48L3A+CiAKLTxocj4KLTxoMj48YSBuYW1lPSJpbnRyb2R1Y3Rpb24iPkludHJvZHVjdGlvbjwvYT48L2gyPgotPHA+QXBhY2hlIEFudCBwcm92aWRlcyBhbiBvcHRpb25hbCB0YXNrIGZvciBlZGl0aW5nIHByb3BlcnR5IGZpbGVzLiBUaGlzIGlzCi12ZXJ5IHVzZWZ1bCB3aGVuIHdhbnRpbmcgdG8gbWFrZSB1bmF0dGVuZGVkIG1vZGlmaWNhdGlvbnMgdG8KLWNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFwcGxpY2F0aW9uIHNlcnZlcnMgYW5kCi1hcHBsaWNhdGlvbnMuIEN1cnJlbnRseSwgdGhlIHRhc2sgbWFpbnRhaW5zIGEgd29ya2luZyBwcm9wZXJ0eSBmaWxlCi13aXRoIHRoZSBhYmlsaXR5IHRvIGFkZCBwcm9wZXJ0aWVzIG9yIG1ha2UgY2hhbmdlcyB0byBleGlzdGluZwotb25lcy4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+IGNvbW1lbnRzIGFuZCBsYXlvdXQgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMKLWZpbGUgYXJlIHByZXNlcnZlZC48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4yPC9lbT4gdGhlIGxpbmVmZWVkLXN0eWxlIG9mIHRoZSBvcmlnaW5hbCBmaWxlIHdpbGwgYmUgcHJlc2VydmVkIGFzIHdlbGwsIGFzCitsb25nIGFzIHN0eWxlIHVzZWQgdG8gYmUgY29uc2lzdGVudC4gIEluIGdlbmVyYWwsIGxpbmVmZWVkcyBvZiB0aGUgdXBkYXRlZCBmaWxlIHdpbGwgYmUgdGhlIHNhbWUgYXMKK3RoZSBmaXJzdCBsaW5lZmVlZCBmb3VuZCB3aGVuIHJlYWRpbmcgaXQuPC9wPgogCi08cD48ZW0+U2luY2UgQW50IDEuOC4yPC9lbT4gdGhlIGxpbmVmZWVkLXN0eWxlIG9mIHRoZSBvcmlnaW5hbCBmaWxlCi0gIHdpbGwgYmUgcHJlc2VydmVkIGFzIHdlbGwsIGFzIGxvbmcgYXMgc3R5bGUgdXNlZCB0byBiZSBjb25zaXN0ZW50LgotICBJbiBnZW5lcmFsLCBsaW5lZmVlZHMgb2YgdGhlIHVwZGF0ZWQgZmlsZSB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZQotICBmaXJzdCBsaW5lZmVlZCBmb3VuZCB3aGVuIHJlYWRpbmcgaXQuPC9wPgorPGhyLz4KIAotPGhyPgotPGgyPjxhIG5hbWU9InByb3B0YXNrIj5Qcm9wZXJ0eUZpbGUgVGFzazwvYT48L2gyPgorPGgyIGlkPSJwcm9wdGFzayI+UHJvcGVydHlGaWxlIFRhc2s8L2gyPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+TG9jYXRpb24gb2YgdGhlIHByb3BlcnR5IGZpbGUgdG8gYmUgZWRpdGVkPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICA8dGQ+ZmlsZTwvdGQ+CisgIDx0ZD5Mb2NhdGlvbiBvZiB0aGUgcHJvcGVydHkgZmlsZSB0byBiZSBlZGl0ZWQ8L3RkPgorICA8dGQ+WWVzPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+Y29tbWVudDwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+SGVhZGVyIGZvciB0aGUgZmlsZSBpdHNlbGY8L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPm5vPC90ZD4KKyAgPHRkPmNvbW1lbnQ8L3RkPgorICA8dGQ+SGVhZGVyIGZvciB0aGUgZmlsZSBpdHNlbGY8L3RkPgorICA8dGQ+Tm88L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5qZGtwcm9wZXJ0aWVzPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5Vc2UgamF2YS5sYW5nLlByb3BlcnRpZXMsIHdoaWNoIHdpbGwKLSAgICBsb29zZSBjb21tZW50cyBhbmQgbGF5b3V0IG9mIGZpbGUgKGRlZmF1bHQgaXMgJ2ZhbHNlJykuICA8ZW0+c2luY2UKKyAgPHRkPmpka3Byb3BlcnRpZXM8L3RkPgorICA8dGQ+VXNlIDxjb2RlPmphdmEubGFuZy5Qcm9wZXJ0aWVzPC9jb2RlPiwgd2hpY2ggd2lsbCBsb3NlIGNvbW1lbnRzIGFuZCBsYXlvdXQgb2YgZmlsZS4gIDxlbT5zaW5jZQogICAgIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ubzwvdGQ+CisgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogPC90cj4KIDwvdGFibGU+CiAKLTxwPlRoZSBib29sZWFuIGF0dHJpYnV0ZSAnamRrcHJvcGVydGllcycgaXMgcHJvdmlkZWQgdG8gcmVjb3ZlciB0aGUKLXByZXZpb3VzIGJlaGF2aW91ciBvZiB0aGUgdGFzaywgaW4gd2hpY2ggdGhlIGxheW91dCBhbmQgYW55IGNvbW1lbnRzCi1pbiB0aGUgcHJvcGVydGllcyBmaWxlIHdlcmUgbG9zdCBieSB0aGUgdGFzay48L3A+Cis8cD5UaGUgYm9vbGVhbiBhdHRyaWJ1dGUgPHZhcj5qZGtwcm9wZXJ0aWVzPC92YXI+IGlzIHByb3ZpZGVkIHRvIHJlY292ZXIgdGhlIHByZXZpb3VzIGJlaGF2aW91ciBvZgordGhlIHRhc2ssIGluIHdoaWNoIHRoZSBsYXlvdXQgYW5kIGFueSBjb21tZW50cyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIHdlcmUgbG9zdCBieSB0aGUgdGFzay48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgotPGg0PjxhIG5hbWU9ImVudHJ5RWxlbWVudCI+RW50cnk8L2E+PC9oND4KLTxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2VudHJ5Jmd0OzwvY29kZT4KLWVsZW1lbnRzIHRvIHNwZWNpZnkgYWN0dWFsIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHByb3BlcnR5IGZpbGUgaXRzZWxmLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDQgaWQ9ImVudHJ5RWxlbWVudCI+RW50cnk8L2g0PgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7ZW50cnkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IGFjdHVhbCBtb2RpZmljYXRpb25zIHRvIHRoZSBwcm9wZXJ0eQorZmlsZSBpdHNlbGYuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtleTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBwcm9wZXJ0eSBuYW1lL3ZhbHVlIHBhaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+a2V5PC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgcHJvcGVydHkgbmFtZS92YWx1ZSBwYWlyPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VmFsdWUgdG8gc2V0ICg9KSwgdG8gYWRkICgrKSBvciBzdWJ0cmFjdCAoLSk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG11c3QgYmUgc3BlY2lmaWVkLCBpZiA8aT5vcGVyYXRpb248L2k+IGlzIG5vdCA8aT5kZWxldGU8L2k+PC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5WYWx1ZSB0byBzZXQgKDxxPj08L3E+KSwgdG8gYWRkICg8cT4rPC9xPikgb3Igc3VidHJhY3QgKDxxPi08L3E+KTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkF0IGxlYXN0IG9uZSBtdXN0IGJlIHNwZWNpZmllZCwgaWYgPHZhcj5vcGVyYXRpb248L3Zhcj4gaXMgbm90IDxxPmRlbDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluaXRpYWwgdmFsdWUgdG8gc2V0IGZvciBhIHByb3BlcnR5IGlmIGl0IGlzIG5vdAotICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSBkZWZpbmVkIGluIHRoZSBwcm9wZXJ0eSBmaWxlLjxicj4KLSAgICAgICAgICAgICAgICAgICAgIEZvciB0eXBlIGRhdGUsIGFuIGFkZGl0aW9uYWwga2V5d29yZCBpcyBhbGxvd2VkOiAmcXVvdDtub3cmcXVvdDs8L3RkPgotICAgIDwvdHI+CisgICAgPHRkPmRlZmF1bHQ8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+SW5pdGlhbCB2YWx1ZSB0byBzZXQgZm9yIGEgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkgZGVmaW5lZCBpbiB0aGUKKyAgICAgIHByb3BlcnR5IGZpbGUuPGJyLz5Gb3IgdHlwZSA8dmFyPmRhdGU8L3Zhcj4sIGFuIGFkZGl0aW9uYWwga2V5d29yZCBpcworICAgICAgYWxsb3dlZDogPHE+bm93PC9xPjwvdGQ+PC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5SZWdhcmQgdGhlIHZhbHVlIGFzIDogaW50LCBkYXRlIG9yIHN0cmluZyAoZGVmYXVsdCk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+UmVnYXJkIHRoZSB2YWx1ZSBhczogPHE+aW50PC9xPiwgPHE+ZGF0ZTwvcT4gb3IgPHE+c3RyaW5nPC9xPiAoZGVmYXVsdCk8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+c3RyaW5nPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm9wZXJhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PbmUgb2YgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zOjxicj48YnI+Ci0gICAgPGI+Zm9yIGFsbCBkYXRhdHlwZXM6PC9iPjx1bD4KLSAgICAgIDxsaT4mcXVvdDtkZWwmcXVvdDsgOiBkZWxldGVzIGFuIGVudHJ5PC9saT4KLSAgICAgIDxsaT4mcXVvdDsrJnF1b3Q7IDogYWRkcyBhIHZhbHVlIHRvIHRoZSBleGlzdGluZyB2YWx1ZTwvbGk+Ci0gICAgICA8bGk+JnF1b3Q7PSZxdW90OyA6IHNldHMgYSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBleGlzdGluZyB2YWx1ZSAoZGVmYXVsdCk8L2xpPgotICAgIDwvdWw+PGJyPjxiPmZvciBkYXRlIGFuZCBpbnQgb25seTo8L2I+PHVsPgotICAgICAgPGxpPiZxdW90Oy0mcXVvdDsgOiBzdWJ0cmFjdHMgYSB2YWx1ZSBmcm9tIHRoZSBleGlzdGluZyB2YWx1ZTwvbGk+Ci0gICAgPC91bD4KKyAgICA8dGQ+b3BlcmF0aW9uPC90ZD4KKyAgICA8dGQ+T25lIG9mIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczo8YnIvPgorICAgICAgPHN0cm9uZz5mb3IgYWxsIGRhdGF0eXBlczo8L3N0cm9uZz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPmRlbDwvcT4gOiBkZWxldGVzIGFuIGVudHJ5PC9saT4KKyAgICAgICAgPGxpPjxxPis8L3E+IDogYWRkcyBhIHZhbHVlIHRvIHRoZSBleGlzdGluZyB2YWx1ZTwvbGk+CisgICAgICAgIDxsaT48cT49PC9xPiA6IHNldHMgYSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBleGlzdGluZyB2YWx1ZSAoZGVmYXVsdCk8L2xpPgorICAgICAgPC91bD4KKyAgICAgIDxzdHJvbmc+Zm9yIDx2YXI+ZGF0ZTwvdmFyPiBhbmQgPHZhcj5pbnQ8L3Zhcj4gb25seTo8L3N0cm9uZz4KKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPi08L3E+IDogc3VidHJhY3RzIGEgdmFsdWUgZnJvbSB0aGUgZXhpc3RpbmcgdmFsdWU8L2xpPgorICAgICAgPC91bD4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+PTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZvciBpbnQgYW5kIGRhdGUgdHlwZSBvbmx5LiBJZiBwcmVzZW50LCBWYWx1ZXMgd2lsbAotICAgICAgICAgICAgICAgICAgICAgYmUgcGFyc2VkIGFuZCBmb3JtYXR0ZWQgYWNjb3JkaW5nbHkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPkZvciA8dmFyPmludDwvdmFyPiBhbmQgPHZhcj5kYXRlPC92YXI+IHR5cGUgb25seS4gSWYgcHJlc2VudCwgdmFsdWVzIHdpbGwgYmUgcGFyc2VkIGFuZAorICAgICAgZm9ybWF0dGVkIGFjY29yZGluZ2x5LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dW5pdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdW5pdCBvZiB0aGUgdmFsdWUgdG8gYmUgYXBwbGllZCB0byBkYXRlICsvLSBvcGVyYXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZToKLSAgICAgICAgICAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taWxsaXNlY29uZDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+c2Vjb25kPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5taW51dGU8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmhvdXI8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPmRheSAoZGVmYXVsdCk8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPndlZWs8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1vbnRoPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT55ZWFyPC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICAgICAgICAgICBUaGlzIG9ubHkgYXBwbGllcyB0byBkYXRlIHR5cGVzIHVzaW5nIGEgKy8tIG9wZXJhdGlvbi4KKyAgICA8dGQ+dW5pdDwvdGQ+CisgICAgPHRkPlRoZSB1bml0IG9mIHRoZSB2YWx1ZSB0byBiZSBhcHBsaWVkIHRvIDx2YXI+ZGF0ZTwvdmFyPiA8cT4rPC9xPi88cT4tPC9xPiBvcGVyYXRpb25zLiAgVmFsaWQKKyAgICAgIFZhbHVlcyBhcmU6CisgICAgICA8dWw+CisgICAgICAgIDxsaT48cT5taWxsaXNlY29uZDwvcT48L2xpPgorICAgICAgICA8bGk+PHE+c2Vjb25kPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5taW51dGU8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPmhvdXI8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPmRheTwvcT4gKGRlZmF1bHQpPC9saT4KKyAgICAgICAgPGxpPjxxPndlZWs8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPm1vbnRoPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT55ZWFyPC9xPjwvbGk+CisgICAgICA8L3VsPgorICAgICAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gPHZhcj5kYXRlPC92YXI+IHR5cGVzIHVzaW5nIGEgPHE+KzwvcT4vPHE+LTwvcT4gb3BlcmF0aW9uLgogICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5kYXk8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD5UaGUgcnVsZXMgdXNlZCB3aGVuIHNldHRpbmcgYSBwcm9wZXJ0eSB2YWx1ZSBhcmUgc2hvd24gYmVsb3cuJm5ic3A7IFRoZQotb3BlcmF0aW9uIG9jY3VycyA8Yj5hZnRlcjwvYj4gdGhlc2UgcnVsZXMgYXJlIGNvbnNpZGVyZWQuPC9wPgorPHA+VGhlIHJ1bGVzIHVzZWQgd2hlbiBzZXR0aW5nIGEgcHJvcGVydHkgdmFsdWUgYXJlIHNob3duIGJlbG93LiBUaGUgb3BlcmF0aW9uCitvY2N1cnMgPHN0cm9uZz5hZnRlcjwvc3Ryb25nPiB0aGVzZSBydWxlcyBhcmUgY29uc2lkZXJlZC48L3A+CiAKIDx1bD4KLSAgPGxpPklmIG9ubHkgdmFsdWUgaXMgc3BlY2lmaWVkLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGl0IHJlZ2FyZGxlc3Mgb2YgaXRzCi0gIHByZXZpb3VzIHZhbHVlLjwvbGk+Ci0gIDxsaT5JZiBvbmx5IGRlZmF1bHQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgcHJldmlvdXNseSBleGlzdGVkIGluIHRoZQotICBwcm9wZXJ0eSBmaWxlLCBpdCBpcyB1bmNoYW5nZWQuPC9saT4KLSAgPGxpPklmIG9ubHkgZGVmYXVsdCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBkaWQgbm90IGV4aXN0IGluIHRoZQotICBwcm9wZXJ0eSBmaWxlLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGRlZmF1bHQuPC9saT4KLSAgPGxpPklmIHZhbHVlIGFuZCBkZWZhdWx0IGFyZSBib3RoIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IHByZXZpb3VzbHkKLSAgZXhpc3RlZCBpbiB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldCB0byB2YWx1ZS48L2xpPgotICA8bGk+SWYgdmFsdWUgYW5kIGRlZmF1bHQgYXJlIGJvdGggc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgZGlkIG5vdCBleGlzdCBpbgotICB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldCB0byBkZWZhdWx0LjwvbGk+CisgIDxsaT5JZiBvbmx5IDx2YXI+dmFsdWU8L3Zhcj4gaXMgc3BlY2lmaWVkLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIGl0IHJlZ2FyZGxlc3Mgb2YgaXRzIHByZXZpb3VzCisgICAgdmFsdWUuPC9saT4KKyAgPGxpPklmIG9ubHkgPHZhcj5kZWZhdWx0PC92YXI+IGlzIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IHByZXZpb3VzbHkgZXhpc3RlZCBpbiB0aGUgcHJvcGVydHkKKyAgICBmaWxlLCBpdCBpcyB1bmNoYW5nZWQuPC9saT4KKyAgPGxpPklmIG9ubHkgPHZhcj5kZWZhdWx0PC92YXI+IGlzIHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGRpZCBub3QgZXhpc3QgaW4gdGhlIHByb3BlcnR5IGZpbGUsCisgICAgdGhlIHByb3BlcnR5IGlzIHNldCB0byA8dmFyPmRlZmF1bHQ8L3Zhcj4uPC9saT4KKyAgPGxpPklmIDx2YXI+dmFsdWU8L3Zhcj4gYW5kIDx2YXI+ZGVmYXVsdDwvdmFyPiBhcmUgYm90aCBzcGVjaWZpZWQgYW5kIHRoZSBwcm9wZXJ0eSBwcmV2aW91c2x5CisgICAgZXhpc3RlZCBpbiB0aGUgcHJvcGVydHkgZmlsZSwgdGhlIHByb3BlcnR5IGlzIHNldCB0byA8dmFyPnZhbHVlPC92YXI+LjwvbGk+CisgIDxsaT5JZiA8dmFyPnZhbHVlPC92YXI+IGFuZCA8dmFyPmRlZmF1bHQ8L3Zhcj4gYXJlIGJvdGggc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgZGlkIG5vdCBleGlzdAorICAgIGluIHRoZSBwcm9wZXJ0eSBmaWxlLCB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIDx2YXI+ZGVmYXVsdDwvdmFyPi48L2xpPgogPC91bD4KLTxwPiZuYnNwOzwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPHA+VGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRoZSBteS5wcm9wZXJ0aWVzIGZpbGUuICBBc3N1bWUgbXkucHJvcGVydGllcyBsb29rIGxpa2U6PC9wPgorPHA+VGhlIGZvbGxvd2luZyBjaGFuZ2VzIHRoZSA8c2FtcD5teS5wcm9wZXJ0aWVzPC9zYW1wPiBmaWxlLiAgQXNzdW1lIDxzYW1wPm15LnByb3BlcnRpZXM8L3NhbXA+Citsb29rcyBsaWtlOjwvcD4KIAogPHByZT4jIEEgc3RyaW5nIHZhbHVlCiBha2V5PW9yaWdpbmFsIHZhbHVlCkBAIC0xNjksOCArMTY2LDcgQEAKICMgZWFjaCB0aW1lIHRoZSBidWlsZCBpcyBydW4uCiBhbmludD0xPC9wcmU+CiAKLTxwPkFmdGVyIHJ1bm5pbmcsIHRoZSBmaWxlIHdvdWxkIG5vdyBsb29rIGxpa2UKLTwvcD4KKzxwPkFmdGVyIHJ1bm5pbmcsIHRoZSBmaWxlIHdvdWxkIG5vdyBsb29rIGxpa2U8L3A+CiA8cHJlPiNNeSBwcm9wZXJ0aWVzCiAjV2VkIEF1ZyAzMSAxMzo0NzoxOSBCU1QgMjAwNQogIyBBIHN0cmluZyB2YWx1ZQpAQCAtMTg1LDY1ICsxODEsNTUgQEAKIGZvcm1hdGVkLmludD0wMDE0CiAKIGZvcm1hdGVkLmRhdGU9MjQzIDEzXDo0NzwvcHJlPgotPHA+Ci1UaGUgc2xhc2hlcyBjb25mb3JtIHRvIHRoZSBleHBlY3RhdGlvbnMgb2YgdGhlIFByb3BlcnRpZXMgY2xhc3MuICBUaGUgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiBhIG1hbm5lciBzbyB0aGF0IGVhY2ggY2hhcmFjdGVyIGlzIGV4YW1pbmVkIGFuZCBlc2NhcGVkIGlmIG5lY2Vzc2FyeS4gCi08L3A+Cis8cD5UaGUgc2xhc2hlcyBjb25mb3JtIHRvIHRoZSBleHBlY3RhdGlvbnMgb2YgdGhlIFByb3BlcnRpZXMgY2xhc3MuICBUaGUgZmlsZSB3aWxsIGJlIHN0b3JlZCBpbiBhCittYW5uZXIgc28gdGhhdCBlYWNoIGNoYXJhY3RlciBpcyBleGFtaW5lZCBhbmQgZXNjYXBlZCBpZiBuZWNlc3NhcnkuPC9wPgogCi08cD4KLVRoZSBsYXlvdXQgYW5kIGNvbW1lbnQgb2YgdGhlIG9yaWdpbmFsIGZpbGUgaXMgcHJlc2VydmVkLiBOZXcgcHJvcGVydGllcyBhcmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gRXhpc3RpbmcgcHJvcGVydGllcyBhcmUgb3ZlcndyaXR0ZW4gaW4gcGxhY2UuCi08L3A+Cis8cD5UaGUgbGF5b3V0IGFuZCBjb21tZW50IG9mIHRoZSBvcmlnaW5hbCBmaWxlIGlzIHByZXNlcnZlZC4gTmV3IHByb3BlcnRpZXMgYXJlIGFkZGVkIGF0IHRoZSBlbmQgb2YKK3RoZSBmaWxlLiBFeGlzdGluZyBwcm9wZXJ0aWVzIGFyZSBvdmVyd3JpdHRlbiBpbiBwbGFjZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Jmx0O3Byb3BlcnR5ZmlsZQotICAgIGZpbGU9JnF1b3Q7bXkucHJvcGVydGllcyZxdW90OwotICAgIGNvbW1lbnQ9JnF1b3Q7TXkgcHJvcGVydGllcyZxdW90OyZndDsKLSAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7YWtleSZxdW90OyB2YWx1ZT0mcXVvdDthdmFsdWUmcXVvdDsvJmd0OwotICAmbHQ7ZW50cnkgIGtleT0mcXVvdDthZGF0ZSZxdW90OyB0eXBlPSZxdW90O2RhdGUmcXVvdDsgdmFsdWU9JnF1b3Q7bm93JnF1b3Q7LyZndDsKLSAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7YW5pbnQmcXVvdDsgdHlwZT0mcXVvdDtpbnQmcXVvdDsgZGVmYXVsdD0mcXVvdDswJnF1b3Q7IG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7LyZndDsKLSAgJmx0O2VudHJ5ICBrZXk9JnF1b3Q7Zm9ybWF0ZWQuaW50JnF1b3Q7IHR5cGU9JnF1b3Q7aW50JnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7MDAxMyZxdW90OyBvcGVyYXRpb249JnF1b3Q7KyZxdW90OyBwYXR0ZXJuPSZxdW90OzAwMDAmcXVvdDsvJmd0OwotICAmbHQ7ZW50cnkgIGtleT0mcXVvdDtmb3JtYXRlZC5kYXRlJnF1b3Q7IHR5cGU9JnF1b3Q7ZGF0ZSZxdW90OyB2YWx1ZT0mcXVvdDtub3cmcXVvdDsgcGF0dGVybj0mcXVvdDtEREQgSEg6bW0mcXVvdDsvJmd0OwotJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVRvIHByb2R1Y2UgZGF0ZXMgcmVsYXRpdmUgZnJvbSB0b2RheSA6PC9wPgotPGJsb2NrcXVvdGU+PHByZT4mbHQ7cHJvcGVydHlmaWxlCi0gICAgZmlsZT0mcXVvdDtteS5wcm9wZXJ0aWVzJnF1b3Q7Ci0gICAgY29tbWVudD0mcXVvdDtNeSBwcm9wZXJ0aWVzJnF1b3Q7Jmd0OwotICAmbHQ7ZW50cnkgIGtleT0mcXVvdDtmb3JtYXRlZC5kYXRlLTEmcXVvdDsKLSAgICAgIHR5cGU9JnF1b3Q7ZGF0ZSZxdW90OyBkZWZhdWx0PSZxdW90O25vdyZxdW90OyBwYXR0ZXJuPSZxdW90O0RERCZxdW90OwotICAgICAgb3BlcmF0aW9uPSZxdW90Oy0mcXVvdDsgdmFsdWU9JnF1b3Q7MSZxdW90Oy8mZ3Q7Ci0gICZsdDtlbnRyeSAga2V5PSZxdW90O2Zvcm1hdGVkLnRvbW9ycm93JnF1b3Q7Ci0gICAgICB0eXBlPSZxdW90O2RhdGUmcXVvdDsgZGVmYXVsdD0mcXVvdDtub3cmcXVvdDsgcGF0dGVybj0mcXVvdDtEREQmcXVvdDsKLSAgICAgIG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7IHZhbHVlPSZxdW90OzEmcXVvdDsvJmd0OwotJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8cHJlPgorJmx0O3Byb3BlcnR5ZmlsZSBmaWxlPSZxdW90O215LnByb3BlcnRpZXMmcXVvdDsKKyAgICAgICAgICAgICAgY29tbWVudD0mcXVvdDtNeSBwcm9wZXJ0aWVzJnF1b3Q7Jmd0OworICAgICZsdDtlbnRyeSBrZXk9JnF1b3Q7YWtleSZxdW90OyB2YWx1ZT0mcXVvdDthdmFsdWUmcXVvdDsvJmd0OworICAgICZsdDtlbnRyeSBrZXk9JnF1b3Q7YWRhdGUmcXVvdDsgdHlwZT0mcXVvdDtkYXRlJnF1b3Q7IHZhbHVlPSZxdW90O25vdyZxdW90Oy8mZ3Q7CisgICAgJmx0O2VudHJ5IGtleT0mcXVvdDthbmludCZxdW90OyB0eXBlPSZxdW90O2ludCZxdW90OyBkZWZhdWx0PSZxdW90OzAmcXVvdDsgb3BlcmF0aW9uPSZxdW90OysmcXVvdDsvJmd0OworICAgICZsdDtlbnRyeSBrZXk9JnF1b3Q7Zm9ybWF0ZWQuaW50JnF1b3Q7IHR5cGU9JnF1b3Q7aW50JnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7MDAxMyZxdW90OyBvcGVyYXRpb249JnF1b3Q7KyZxdW90OyBwYXR0ZXJuPSZxdW90OzAwMDAmcXVvdDsvJmd0OworICAgICZsdDtlbnRyeSBrZXk9JnF1b3Q7Zm9ybWF0ZWQuZGF0ZSZxdW90OyB0eXBlPSZxdW90O2RhdGUmcXVvdDsgdmFsdWU9JnF1b3Q7bm93JnF1b3Q7IHBhdHRlcm49JnF1b3Q7REREIEhIOm1tJnF1b3Q7LyZndDsKKyZsdDsvcHJvcGVydHlmaWxlJmd0OzwvcHJlPgorPHA+VG8gcHJvZHVjZSBkYXRlcyByZWxhdGl2ZSBmcm9tIHRvZGF5OjwvcD4KKzxwcmU+CismbHQ7cHJvcGVydHlmaWxlIGZpbGU9JnF1b3Q7bXkucHJvcGVydGllcyZxdW90OworICAgICAgICAgICAgICBjb21tZW50PSZxdW90O015IHByb3BlcnRpZXMmcXVvdDsmZ3Q7CisgICAgJmx0O2VudHJ5IGtleT0mcXVvdDtmb3JtYXRlZC5kYXRlLTEmcXVvdDsKKyAgICAgICAgICAgdHlwZT0mcXVvdDtkYXRlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bm93JnF1b3Q7IHBhdHRlcm49JnF1b3Q7REREJnF1b3Q7CisgICAgICAgICAgIG9wZXJhdGlvbj0mcXVvdDstJnF1b3Q7IHZhbHVlPSZxdW90OzEmcXVvdDsvJmd0OworICAgICZsdDtlbnRyeSBrZXk9JnF1b3Q7Zm9ybWF0ZWQudG9tb3Jyb3cmcXVvdDsKKyAgICAgICAgICAgdHlwZT0mcXVvdDtkYXRlJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7bm93JnF1b3Q7IHBhdHRlcm49JnF1b3Q7REREJnF1b3Q7CisgICAgICAgICAgIG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7IHZhbHVlPSZxdW90OzEmcXVvdDsvJmd0OworJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7PC9wcmU+CiAKLTxwPgotQ29uY2F0ZW5hdGlvbiBvZiBzdHJpbmdzIDo8L3A+Ci08YmxvY2txdW90ZT48cHJlPiZsdDtwcm9wZXJ0eWZpbGUKLSAgICBmaWxlPSZxdW90O215LnByb3BlcnRpZXMmcXVvdDsKLSAgICBjb21tZW50PSZxdW90O015IHByb3BlcnRpZXMmcXVvdDsmZ3Q7Ci0gICZsdDtlbnRyeSAga2V5PSZxdW90O3Byb2dyZXNzJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7JnF1b3Q7IG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7IHZhbHVlPSZxdW90Oy4mcXVvdDsvJmd0OwotJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5FYWNoIHRpbWUgY2FsbGVkLCBhICZxdW90Oy4mcXVvdDsgd2lsbCBiZSBhcHBlbmRlZCB0byAmcXVvdDtwcm9ncmVzcyZxdW90OwotPC9wPgorPHA+Q29uY2F0ZW5hdGlvbiBvZiBzdHJpbmdzOjwvcD4KKzxwcmU+CismbHQ7cHJvcGVydHlmaWxlIGZpbGU9JnF1b3Q7bXkucHJvcGVydGllcyZxdW90OworICAgICAgICAgICAgICBjb21tZW50PSZxdW90O015IHByb3BlcnRpZXMmcXVvdDsmZ3Q7CisgICAgJmx0O2VudHJ5a2V5PSZxdW90O3Byb2dyZXNzJnF1b3Q7IGRlZmF1bHQ9JnF1b3Q7JnF1b3Q7IG9wZXJhdGlvbj0mcXVvdDsrJnF1b3Q7IHZhbHVlPSZxdW90Oy4mcXVvdDsvJmd0OworJmx0Oy9wcm9wZXJ0eWZpbGUmZ3Q7PC9wcmU+Cis8cD5FYWNoIHRpbWUgY2FsbGVkLCBhIDxxPi48L3E+IHdpbGwgYmUgYXBwZW5kZWQgdG8gPGNvZGU+cHJvZ3Jlc3M8L2NvZGU+PC9wPgogCi08cD5QdW1wcyB0aGUgcHJvamVjdCB2ZXJzaW9uIHRvIHRoZSBuZXh0IG1pbm9yIHZlcnNpb24gKGluY3JlYXNlIG1pbm9yIGFuZCBzZXQgcGF0aD0wKToKLTxibG9ja3F1b3RlPjxwcmU+Jmx0O3RhcmdldCBuYW1lPSJuZXh0TWlub3JWZXJzaW9uIiZndDsKLSAgICZsdDtwcm9wZXJ0eQotICAgICBuYW1lPSJoZWFkZXIiCi0gICAgIHZhbHVlPSIjI0dlbmVyYXRlZCBmaWxlIC0gZG8gbm90IG1vZGlmeSEiLyZndDsKLSAgICZsdDtwcm9wZXJ0eWZpbGUgZmlsZT0idmVyc2lvbi5wcm9wZXJ0aWVzIiBjb21tZW50PSIke2hlYWRlcn0iJmd0OwotICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1ham9yIiAgIHR5cGU9ImludCIgIHZhbHVlPSIzIiAvJmd0OwotICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1pbm9yIiAgIHR5cGU9ImludCIgIG9wZXJhdGlvbj0iKyIgLyZndDsKLSAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5wYXRjaCIgICB0eXBlPSJpbnQiICB2YWx1ZT0iMCIgLyZndDsKLSAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5kYXRlIiAgICB0eXBlPSJkYXRlIiB2YWx1ZT0ibm93IiAvJmd0OwotICAmbHQ7L3Byb3BlcnR5ZmlsZSZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotQWZ0ZXIgcnVubmluZyB0aGlzIHRhcmdldCB0aGUgdmVyc2lvbiBjaGFuZ2VkIGUuZy4gZnJvbSAzLjIuMiB0byAzLjMuMC4KLTwvcD4KLQorPHA+UHVtcHMgdGhlIHByb2plY3QgdmVyc2lvbiB0byB0aGUgbmV4dCBtaW5vciB2ZXJzaW9uIChpbmNyZWFzZSBtaW5vciBhbmQKK3NldCA8Y29kZT5wYXRjaD0wPC9jb2RlPik6PC9wPgorPHByZT4KKyZsdDt0YXJnZXQgbmFtZT0ibmV4dE1pbm9yVmVyc2lvbiImZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImhlYWRlciIKKyAgICAgICAgICAgICAgdmFsdWU9IiMjR2VuZXJhdGVkIGZpbGUgLSBkbyBub3QgbW9kaWZ5ISIvJmd0OworICAgICZsdDtwcm9wZXJ0eWZpbGUgZmlsZT0idmVyc2lvbi5wcm9wZXJ0aWVzIiBjb21tZW50PSIke2hlYWRlcn0iJmd0OworICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1ham9yIiB0eXBlPSJpbnQiICB2YWx1ZT0iMyIvJmd0OworICAgICAgICAmbHQ7ZW50cnkga2V5PSJwcm9kdWN0LmJ1aWxkLm1pbm9yIiB0eXBlPSJpbnQiICBvcGVyYXRpb249IisiLyZndDsKKyAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5wYXRjaCIgdHlwZT0iaW50IiAgdmFsdWU9IjAiLyZndDsKKyAgICAgICAgJmx0O2VudHJ5IGtleT0icHJvZHVjdC5idWlsZC5kYXRlIiAgdHlwZT0iZGF0ZSIgdmFsdWU9Im5vdyIvJmd0OworICAgICZsdDsvcHJvcGVydHlmaWxlJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+Cis8cD5BZnRlciBydW5uaW5nIHRoaXMgdGFyZ2V0IHRoZSB2ZXJzaW9uIGNoYW5nZWQgZS5nLiBmcm9tIDMuMi4yIHRvIDMuMy4wLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3Byb3BlcnR5aGVscGVyLmh0bWwgYi9tYW51YWwvVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbAppbmRleCA2YzczYjBiLi5lMDQzOTcyIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Qcm9wZXJ0eUhlbHBlciBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDQ5ICsyNSw1MiBAQAogPGJvZHk+CiAKIDxoMj5Qcm9wZXJ0eUhlbHBlcjwvaDI+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+VGhpcyB0YXNrIGlzIHByb3ZpZGVkIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB0aGUgdXNlciB0bwotPGI+KGEpPC9iPiBpbnN0YWxsIGEgZGlmZmVyZW50IFByb3BlcnR5SGVscGVyIGF0IHJ1bnRpbWUsIG9yCi08Yj4oYik8L2I+IChob3BlZnVsbHkgbW9yZSBvZnRlbikgaW5zdGFsbCBvbmUgb3IgbW9yZSBQcm9wZXJ0eUhlbHBlciBEZWxlZ2F0ZXMgaW50byB0aGUKLVByb3BlcnR5SGVscGVyIGFjdGl2ZSBvbiB0aGUgY3VycmVudCBQcm9qZWN0LiBUaGlzIGlzIHNvbWV3aGF0IGFkdmFuY2VkIEFwYWNoZSBBbnQgdXNhZ2UgYW5kCi1hc3N1bWVzIGEgd29ya2luZyBmYW1pbGlhcml0eSB3aXRoIHRoZSBtb2Rlcm4gQW50IEFQSXMuIFNlZSB0aGUgZGVzY3JpcHRpb24gb2YgQW50J3MKLTxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNwcm9wZXJ0eUhlbHBlciI+UHJvcGVydHkgSGVscGVyPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLTxiPlNpbmNlIEFudCAxLjguMDwvYj48L3A+Cis8cD5UaGlzIHRhc2sgaXMgcHJvdmlkZWQgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHRoZSB1c2VyIHRvIDxzdHJvbmc+KGEpPC9zdHJvbmc+IGluc3RhbGwgYQorZGlmZmVyZW50IDxjb2RlPlByb3BlcnR5SGVscGVyPC9jb2RlPiBhdCBydW4gdGltZSwgb3IgPHN0cm9uZz4oYik8L3N0cm9uZz4gKGhvcGVmdWxseSBtb3JlIG9mdGVuKQoraW5zdGFsbCBvbmUgb3IgbW9yZSA8Y29kZSBjbGFzcz0iY29kZSI+UHJvcGVydHlIZWxwZXI8L2NvZGU+IERlbGVnYXRlcyBpbnRvCit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPlByb3BlcnR5SGVscGVyPC9jb2RlPiBhY3RpdmUgb24gdGhlCitjdXJyZW50IDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9qZWN0PC9jb2RlPi4gVGhpcyBpcyBzb21ld2hhdCBhZHZhbmNlZCBBcGFjaGUgQW50IHVzYWdlIGFuZCBhc3N1bWVzIGEKK3dvcmtpbmcgZmFtaWxpYXJpdHkgd2l0aCB0aGUgbW9kZXJuIEFudCBBUElzLiBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mCitBbnQncyA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjcHJvcGVydHlIZWxwZXIiPlByb3BlcnR5IEhlbHBlcjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PlByb3BlcnR5SGVscGVyPC9oND4KLVlvdSBtYXkgc3BlY2lmeSBleGFjdGx5IG9uZSBjb25maWd1cmVkIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyPC9jb2RlPiBpbnN0YW5jZS4KKzxwPllvdSBtYXkgc3BlY2lmeSBleGFjdGx5IG9uZSBjb25maWd1cmVkIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyPC9jb2RlPgoraW5zdGFuY2UuPC9wPgogCiA8aDQ+UHJvcGVydHlIZWxwZXIuRGVsZWdhdGU8L2g0PgotWW91IG1heSBzcGVjaWZ5LCBlaXRoZXIgaW4gY29uanVuY3Rpb24gd2l0aCBhIG5ldyA8Y29kZT5Qcm9wZXJ0eUhlbHBlcjwvY29kZT4gb3Igbm90LCBvbmUgb3IKLW1vcmUgY29uZmlndXJlZCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyLkRlbGVnYXRlPC9jb2RlPgotaW50ZXJmYWNlLiBBIGRlZXBlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBBUEkgaXMgcmVxdWlyZWQgaGVyZSwgaG93ZXZlciwgYXMgPGNvZGU+RGVsZWdhdGU8L2NvZGU+Ci1pcyBhIG1hcmtlciBpbnRlcmZhY2Ugb25seTogdGhlIG5lc3RlZCBhcmd1bWVudHMgbXVzdCBpbXBsZW1lbnQgYSA8Y29kZT5EZWxlZ2F0ZTwvY29kZT4KLXN1YmludGVyZmFjZSBpbiBvcmRlciB0byBkbyBhbnl0aGluZyBtZWFuaW5nZnVsLgorPHA+WW91IG1heSBzcGVjaWZ5LCBlaXRoZXIgaW4gY29uanVuY3Rpb24gd2l0aCBhIG5ldyA8Y29kZSBjbGFzcz0iY29kZSI+UHJvcGVydHlIZWxwZXI8L2NvZGU+IG9yCitub3QsIG9uZSBvciBtb3JlIGNvbmZpZ3VyZWQgaW1wbGVtZW50YXRpb25zIG9mCit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyLkRlbGVnYXRlPC9jb2RlPiBpbnRlcmZhY2UuIEEgZGVlcGVyCit1bmRlcnN0YW5kaW5nIG9mIHRoZSBBUEkgaXMgcmVxdWlyZWQgaGVyZSwgaG93ZXZlciwgYXMgPGNvZGUgY2xhc3M9ImNvZGUiPkRlbGVnYXRlPC9jb2RlPiBpcyBhCittYXJrZXIgaW50ZXJmYWNlIG9ubHk6IHRoZSBuZXN0ZWQgYXJndW1lbnRzIG11c3QgaW1wbGVtZW50IGEgPGNvZGUgY2xhc3M9ImNvZGUiPkRlbGVnYXRlPC9jb2RlPgorc3ViaW50ZXJmYWNlIGluIG9yZGVyIHRvIGRvIGFueXRoaW5nIG1lYW5pbmdmdWwuPC9wPgogCiA8aDQ+ZGVsZWdhdGU8L2g0PgotPHA+QSBnZW5lcmljICZsdDtkZWxlZ2F0ZSZndDsgZWxlbWVudCB3aGljaCBjYW4gdXNlIHByb2plY3QgcmVmZXJlbmNlcwotaXMgYWxzbyBwcm92aWRlZDo8L3A+Cis8cD5BIGdlbmVyaWMgPGNvZGU+Jmx0O2RlbGVnYXRlJmd0OzwvY29kZT4gZWxlbWVudCB3aGljaCBjYW4gdXNlIHByb2plY3QgcmVmZXJlbmNlcyBpcyBhbHNvCitwcm92aWRlZDo8L3A+CiAKIDxoNT5QYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+IAorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSA8aT5pZDwvaT4gb2YgYSA8Y29kZT5Qcm9wZXJ0eUhlbHBlci5EZWxlZ2F0ZTwvY29kZT4gdG8gaW5zdGFsbC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cmVmaWQ8L3RkPgorICAgIDx0ZD5UaGUgPHZhcj5pZDwvdmFyPiBvZiBhIDxjb2RlPlByb3BlcnR5SGVscGVyLkRlbGVnYXRlPC9jb2RlPiB0byBpbnN0YWxsLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cD5JbnN0YWxsIGEgY29tcGxldGVseSBkaWZmZXJlbnQgUHJvcGVydHlIZWxwZXIgaW1wbGVtZW50YXRpb24KLSAgKGFzc3VtaW5nIDxjb2RlPk15UHJvcGVydHlIZWxwZXIgZXh0ZW5kcyBQcm9wZXJ0eUhlbHBlcjwvY29kZT4pOjwvcD4KKzxwPkluc3RhbGwgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCA8Y29kZSBjbGFzcz0iY29kZSI+UHJvcGVydHlIZWxwZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uCisoYXNzdW1pbmcgPGNvZGUgY2xhc3M9ImNvZGUiPk15UHJvcGVydHlIZWxwZXIgZXh0ZW5kcyBQcm9wZXJ0eUhlbHBlcjwvY29kZT4pOjwvcD4KIAogPHByZT4KICZsdDtjb21wb25lbnRkZWYgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5NeVByb3BlcnR5SGVscGVyIgpAQCAtNzcsMTIgKzgwLDExIEBACiAmbHQ7L3Byb3BlcnR5aGVscGVyPgogPC9wcmU+CiAKLTxwPkFkZCBhIG5ldyBQcm9wZXJ0eUV2YWx1YXRvciBkZWxlZ2F0ZQotICAoYXNzdW1pbmcgPGNvZGU+TXlQcm9wZXJ0eUV2YWx1YXRvciBpbXBsZW1lbnRzCi0gIFByb3BlcnR5SGVscGVyLlByb3BlcnR5RXZhbHVhdG9yPC9jb2RlPikuICBOb3RlIHRoYXQgUHJvcGVydHlIZWxwZXIKLSAgdXNlcyB0aGUgY29uZmlndXJlZCBkZWxlZ2F0ZXMgaW4gTElGTyBvcmRlci4gIEkuZS4gdGhlIGRlbGVnYXRlCi0gIGFkZGVkIGJ5IHRoaXMgdGFzayB3aWxsIGJlIGNvbnN1bHRlZCBiZWZvcmUgYW55IHByZXZpb3VzbHkgZGVmaW5lZAotICBkZWxlZ2F0ZSBhbmQgaW4gcGFydGljdWxhciBiZWZvcmUgdGhlIGJ1aWx0LWluIG9uZXMuPC9wPgorPHA+QWRkIGEgbmV3IDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT4gZGVsZWdhdGUKKyhhc3N1bWluZyA8Y29kZSBjbGFzcz0iY29kZSI+TXlQcm9wZXJ0eUV2YWx1YXRvciBpbXBsZW1lbnRzCitQcm9wZXJ0eUhlbHBlci5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT4pLiAgTm90ZSB0aGF0IDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9wZXJ0eUhlbHBlcjwvY29kZT4gdXNlcwordGhlIGNvbmZpZ3VyZWQgZGVsZWdhdGVzIGluIExJRk8gb3JkZXIuICBJLmUuIHRoZSBkZWxlZ2F0ZSBhZGRlZCBieSB0aGlzIHRhc2sgd2lsbCBiZSBjb25zdWx0ZWQKK2JlZm9yZSBhbnkgcHJldmlvdXNseSBkZWZpbmVkIGRlbGVnYXRlIGFuZCBpbiBwYXJ0aWN1bGFyIGJlZm9yZSB0aGUgYnVpbHQtaW4gb25lcy48L3A+CiAKIDxwcmU+CiAmbHQ7Y29tcG9uZW50ZGVmIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuTXlQcm9wZXJ0eUV2YWx1YXRvciIKQEAgLTkyLDcgKzk0LDggQEAKICZsdDsvcHJvcGVydHloZWxwZXI+CiA8L3ByZT4KIAotPHA+QWRkIGEgbmV3IFByb3BlcnR5RXZhbHVhdG9yIGRlbGVnYXRlIHVzaW5nIHRoZSByZWZpZCBzeW50YXg6PC9wPgorPHA+QWRkIGEgbmV3IDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT4gZGVsZWdhdGUgdXNpbmcgdGhlIDx2YXI+cmVmaWQ8L3Zhcj4KK3N5bnRheDo8L3A+CiAKIDxwcmU+CiAmbHQ7dHlwZWRlZiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLk15UHJvcGVydHlFdmFsdWF0b3IiCkBAIC0xMDUsNCArMTA4LDMgQEAKIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcHZjc3Rhc2suaHRtbCBiL21hbnVhbC9UYXNrcy9wdmNzdGFzay5odG1sCmluZGV4IGE5NWIzMmUuLjI3NWQ1MzYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9wdmNzdGFzay5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9wdmNzdGFzay5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjM0ICsxNSwxODUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgotICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UFZDUyB0YXNrPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgogCi08aDE+Ci1BcGFjaGUgQW50IFB2Y3MgVGFzayBVc2VyIE1hbnVhbDwvaDE+Cis8aDE+QXBhY2hlIEFudCBQdmNzIFRhc2sgVXNlciBNYW51YWw8L2gxPgogCi08cD48Yj5Ob3RlOjwvYj4KLUJlZm9yZSB1c2luZyB0aGlzIHRhc2ssIHRoZSB1c2VyIHJ1bm5pbmcgQW50IG11c3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCi1jb21tYW5kcyBvZiBQVkNTIChnZXQgYW5kIHBjbGkpIGFuZCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZQotcmVwb3NpdG9yeS4gTm90ZSB0aGF0IHRoZSB3YXkgdG8gc3BlY2lmeSB0aGUgcmVwb3NpdG9yeSBpcyBwbGF0Zm9ybQotZGVwZW5kZW50IHNvIHVzZSBwcm9wZXJ0eSB0byBzcGVjaWZ5IGxvY2F0aW9uIG9mIHJlcG9zaXRvcnkuCi08L3A+Ci0KLWJ5Ci08YnI+PCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEJlZm9yZSB1c2luZyB0aGlzIHRhc2ssIHRoZSB1c2VyIHJ1bm5pbmcgQW50IG11c3QgaGF2ZSBhY2Nlc3MgdG8gdGhlCitjb21tYW5kcyBvZiBQVkNTICg8a2JkPmdldDwva2JkPiBhbmQgPGtiZD5wY2xpPC9rYmQ+KSBhbmQgbXVzdCBoYXZlIGFjY2VzcyB0byB0aGUKK3JlcG9zaXRvcnkuIE5vdGUgdGhhdCB0aGUgd2F5IHRvIHNwZWNpZnkgdGhlIHJlcG9zaXRvcnkgaXMgcGxhdGZvcm0gZGVwZW5kZW50IHNvIHVzZSBwcm9wZXJ0eSB0bworc3BlY2lmeSBsb2NhdGlvbiBvZiByZXBvc2l0b3J5LjwvcD4KKzxwPmJ5PC9wPgorPCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+CiA8dWw+CiAgIDxsaT5UaG9tYXMgQ2hyaXN0ZW5zZW4gKDxhIGhyZWY9Im1haWx0bzp0Y2hyaXN0ZW5zZW5Abm9yZGlqYS5jb20iPnRjaHJpc3RlbnNlbkBub3JkaWphLmNvbTwvYT4pPC9saT4KICAgPGxpPkRvbiBKZWZmZXJ5ICg8YSBocmVmPSJtYWlsdG86ZG9uakBhcG9nZWVuZXQuY29tIj5kb25qQGFwb2dlZW5ldC5jb208L2E+KTwvbGk+CiAgIDxsaT5Kb24gRGlja2luc29uICg8YSBocmVmPSJtYWlsdG86ZGlja2luc29uLmpAdWNsZXMub3JnLnVrIj5kaWNraW5zb24uakB1Y2xlcy5vcmcudWs8L2E+KTwvbGk+CiA8L3VsPgotVmVyc2lvbiAxLjEgLSAyMDAxLzA2LzI3PGJyPgotPHA+UHJvYmxlbXMgd2l0aCBVTkMgcGF0aG5hbWVzIGFuZCB0aGUgdXNlIG9mICgpIGluIHBhdGhzIGFyZSBmaXhlZCBhbmQgYW4gdXBkYXRlb25seQotICBhcmd1bWVudCBpbnRyb2R1Y2VkLjwvcD4KLVZlcnNpb24gMS4wIC0gMjAwMS8wMS8zMTxicj4KKzxwPlZlcnNpb24gMS4xJm1kYXNoOzIwMDEvMDYvMjc8L3A+Cis8cD5Qcm9ibGVtcyB3aXRoIFVOQyBwYXRobmFtZXMgYW5kIHRoZSB1c2Ugb2YgPHE+KCk8L3E+IGluIHBhdGhzIGFyZSBmaXhlZCBhbmQKK2FuIDx2YXI+dXBkYXRlb25seTwvdmFyPiBhcmd1bWVudCBpbnRyb2R1Y2VkLjwvcD4KKzxwPlZlcnNpb24gMS4wJm1kYXNoOzIwMDEvMDEvMzE8L3A+CiA8cD5Jbml0aWFsIHJlbGVhc2UuPC9wPgotPGhyPgotPGgyPgotVGFibGUgb2YgQ29udGVudHM8L2gyPgorCis8aHIvPgorCis8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPgogPHVsPgogICA8bGk+PGEgaHJlZj0iI2ludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSIjcHZjcyI+UHZjcyBUYXNrPC9hPjwvbGk+CiA8L3VsPgotPGhyPgogCi08aDI+PGEgTkFNRT0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9oMj4KLVRoZSBwdmNzIHRhc2sgYWxsb3dzIHRoZSB1c2VyIG9mIEFudCB0byBleHRyYWN0IHRoZSBsYXRlc3QgZWRpdGlvbgotb2YgdGhlIHNvdXJjZSBjb2RlIGZyb20gYSBQVkNTIHJlcG9zaXRvcnkuIFBWQ1MgaXMgYSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtCi1kZXZlbG9wZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXJhbnQuY29tL3Byb2R1Y3RzL3B2Y3MiPk1lcmFudDwvYT4uCi08YnI+Ci1UaGlzIHZlcnNpb24gaGFzIGJlZW4gdGVzdGVkIGFnYWluc3QgUFZDUyB2ZXJzaW9uIDYuNSBhbmQgNi42IHVuZGVyIFdpbmRvd3MgYW5kIFNvbGFyaXMuCis8aHIvPgogCi08aHI+Ci08aDI+PGEgTkFNRT0icHZjcyI+UHZjcyBUYXNrPC9hPjwvaDI+Cis8aDIgaWQ9ImludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uPC9oMj4KKzxwPlRoZSA8Y29kZT5wdmNzPC9jb2RlPiB0YXNrIGFsbG93cyB0aGUgdXNlciBvZiBBbnQgdG8gZXh0cmFjdCB0aGUgbGF0ZXN0IGVkaXRpb24gb2YgdGhlIHNvdXJjZQorY29kZSBmcm9tIGEgPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUFZDUyIgdGFyZ2V0PSJfdG9wIj5QVkNTPC9hPiAoUG9seXRyb24gVmVyc2lvbgorQ29udHJvbCBTeXN0ZW0pIHJlcG9zaXRvcnkuIEl0IGlzIGN1cnJlbnRseSBvd25lZAorYnkgPGEgaHJlZj0iaHR0cHM6Ly93d3cubWljcm9mb2N1cy5jb20vcHJvZHVjdHMvcHZjcy8iIHRhcmdldD0iX3RvcCI+TWljcm9Gb2N1czwvYT4uPC9wPgorPHA+VGhpcyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCBhZ2FpbnN0IFBWQ1MgdmVyc2lvbiA2LjUgYW5kIDYuNiB1bmRlciBXaW5kb3dzIGFuZCBTb2xhcmlzLjwvcD4KKworPGhyLz4KKworPGgyIGlkPSJwdmNzIj5QdmNzIFRhc2s8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRoZSBwdmNzIHRhc2sgaXMgc2V0IHRvIHBvaW50IGF0IGEgUFZDUyByZXBvc2l0b3J5IGFuZCBvcHRpb25hbGx5IGEgcHJvamVjdAotd2l0aGluIHRoYXQgcmVwb3NpdG9yeSwgYW5kIGNhbiBmcm9tIHRoYXQgc3BlY2lmaWNhdGlvbiBnZXQgdGhlIGxhdGVzdAotdmVyc2lvbiBvZiB0aGUgZmlsZXMgY29udGFpbmVkIGJ5IHRoZSByZXBvc2l0b3J5LgotPGgzPgotUGFyYW1ldGVyczwvaDM+Ci0KLTx0YWJsZSBCT1JERVIgQ0VMTFNQQUNJTkc9MCBDRUxMUEFERElORz0yID4KLTx0cj4KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMiUiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotPC90cj4KLQotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+cmVwb3NpdG9yeTwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSI3OCUiPlRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSAoc2VlIHlvdXIgUFZDUwotbWFudWFscyk8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ZZXM8L3RkPgotPC90cj4KLQotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+cHZjc3Byb2plY3Q8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5UaGUgcHJvamVjdCB3aXRoaW4gdGhlIFBWQ1MgcmVwb3NpdG9yeSB0byBleHRyYWN0Ci1maWxlcyBmcm9tICgmcXVvdDsvJnF1b3Q7IGlzIHJvb3QgcHJvamVjdCBhbmQgdGhhdCBpcyBkZWZhdWx0IGlmIHRoaXMgYXR0cmlidXRlIGlzbid0Ci1zcGVjaWZpZWQpPC90ZD4KLQotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgotPC90cj4KLQotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+bGFiZWw8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5Pbmx5IGZpbGVzIG1hcmtlZCB3aXRoIHRoaXMgbGFiZWwgYXJlIGV4dHJhY3RlZC48L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj5wcm9tb3Rpb25ncm91cDwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSI3OCUiPk9ubHkgZmlsZXMgd2l0aGluIHRoaXMgcHJvbW90aW9uIGdyb3VwIGFyZSBleHRyYWN0ZWQuIFVzaW5nCi1ib3RoIHRoZSA8aT5sYWJlbDwvaT4gYW5kIHRoZSA8aT5wcm9tb3Rpb25ncm91cDwvaT4gdGFnIHdpbGwgY2F1c2UgdGhlIGZpbGVzIGluIHRoZQotcHJvbW90aW9uIGdyb3VwIGFuZCB3aXRoIHRoYXQgbGFiZWwgdG8gYmUgZXh0cmFjdGVkLgotPC90ZD4KLQotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgotPC90cj4KLQotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+Y29uZmlnPC90ZD4KLQotPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+cGF0aCBvZiBhIG5vbiBkZWZhdWx0IC5jZmcgZmlsZS4KLUNhbiBiZSBnaXZlbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byBBbnQncyBiYXNlIGRpcmVjdG9yeS4KLTwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KLTwvdHI+Ci0KLTx0cj4KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMiUiPmZvcmNlPC90ZD4KLQotPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+SWYgc2V0IHRvIDxpPnllczwvaT4gYWxsIGZpbGVzIHRoYXQgZXhpc3RzIGFuZCBhcmUgd3JpdGFibGUgYXJlIG92ZXJ3cml0dGVuLiBEZWZhdWx0IDxpPm5vPC9pPiBjYXVzZXMgdGhlIGZpbGVzIHRoYXQgYXJlIHdyaXRhYmxlIHRvIGJlIGlnbm9yZWQuIFRoaXMgc3RvcHMgdGhlIFBWQ1MgY29tbWFuZCA8aT5nZXQ8L2k+IHRvIHN0b3AgYXNraW5nIHF1ZXN0aW9ucyE8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj53b3Jrc3BhY2U8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5CeSBzcGVjaWZ5aW5nIGEgd29ya3NwYWNlLCB0aGUgZmlsZXMgYXJlIGV4dHJhY3RlZCB0byB0aGF0IGxvY2F0aW9uLiBBIFBWQ1Mgd29ya3NwYWNlIGlzIGEKLW5hbWUgZm9yIGEgbG9jYXRpb24gb2YgdGhlIHdvcmtmaWxlcyBhbmQgaXNuJ3QgYXMgc3VjaCB0aGUgbG9jYXRpb24gaXRzZWxmLiBZb3UgZGVmaW5lIHRoZSBsb2NhdGlvbiBmb3IgYSB3b3Jrc3BhY2UKLXVzaW5nIHRoZSBQVkNTIEdVSSBjbGllbnRzLiBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZSBjdXJyZW50IHVzZXIgaXMgdXNlZC48L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ObzwvdGQ+Ci08L3RyPgotCi08dHI+Ci08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTIlIj5wdmNzYmluPC90ZD4KLQotPHRkIFZBTElHTj1UT1AgV0lEVEg9Ijc4JSI+T24gc29tZSBzeXN0ZW1zIHRoZSBQVkNTIGV4ZWN1dGFibGVzIDxpPnBjbGk8L2k+Ci1hbmQgPGk+Z2V0PC9pPiBhcmUgbm90IGZvdW5kIGluIHRoZSBQQVRILiBJbiBzdWNoIGNhc2VzIHRoaXMgYXR0cmlidXRlCi1zaG91bGQgYmUgc2V0IHRvIHRoZSBiaW4gZGlyZWN0b3J5IG9mIHRoZSBQVkNTIGluc3RhbGxhdGlvbiBjb250YWluaW5nCi10aGUgZXhlY3V0YWJsZXMgbWVudGlvbmVkIGJlZm9yZS4gSWYgdGhpcyBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZQotdGFnIGV4cGVjdHMgdGhlIGV4ZWN1dGFibGVzIHRvIGJlIGZvdW5kIHVzaW5nIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLjwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KLTwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+aWdub3JlcmV0dXJuY29kZTwvdGQ+Ci0gICAgICA8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5JZiBzZXQgdG8gPGk+dHJ1ZTwvaT4gdGhlIHJldHVybiB2YWx1ZSBmcm9tIGV4ZWN1dGluZwotICAgICAgICB0aGUgcHZjcyBjb21tYW5kcyBhcmUgaWdub3JlZC48L3RkPgotICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEwJSI+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+dXBkYXRlb25seTwvdGQ+Ci0gICAgICA8dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj5JZiBzZXQgdG8gPGk+dHJ1ZTwvaT4gZmlsZXMgYXJlIGdvdHRlbiBvbmx5IGlmCi0gICAgICAgIG5ld2VyIHRoYW4gZXhpc3RpbmcgbG9jYWwgZmlsZXMuPC90ZD4KLSAgICAgIDx0ZCBWQUxJR049VE9QIFdJRFRIPSIxMCUiPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRPUCI+ZmlsZW5hbWVmb3JtYXQ8L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVE9QIj5UaGUgZm9ybWF0IG9mIHlvdXIgZm9sZGVyIG5hbWVzIGluIGEKLSAgICAgICAgICBmb3JtYXQgc3VpdGFibGUgZm9yIDxjb2RlPmphdmEudGV4dC5NZXNzYWdlRm9ybWF0PC9jb2RlPi4KLSAgICAgICAgICBEZWZhdWx0cyB0byA8Y29kZT57MH0tYXJjKHsxfSk8L2NvZGU+LiAgUmVwb3NpdG9yaWVzIHdoZXJlCi0gICAgICAgICAgdGhlIGFyY2hpdmUgZXh0ZW5zaW9uIGlzIG5vdCAgPGNvZGU+LWFyYzwvY29kZT4gc2hvdWxkIHNldAotICAgICAgICAgIHRoaXMuPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRPUCI+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0iVE9QIj5saW5lc3RhcnQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJUT1AiPlVzZWQgdG8gcGFyc2UgdGhlIG91dHB1dCBvZiB0aGUgcGNsaQotICAgICAgICAgIGNvbW1hbmQuIEl0IGRlZmF1bHRzIHRvIDxjb2RlPiZxdW90O1A6PC9jb2RlPi4gIFRoZSBwYXJzZXIgYWxyZWFkeQotICAgICAgICAgIGtub3dzIGFib3V0IC8gYW5kIFxcLCB0aGlzIHByb3BlcnR5IGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB0aGUKLSAgICAgICAgICByZXBvc2l0b3J5IGlzIGFjY2Vzc2VkIG9uIGEgV2luZG93cyBwbGF0Zm9ybSB2aWEgYSBkcml2ZSBsZXR0ZXIKLSAgICAgICAgICBtYXBwaW5nLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRPUCI+cmV2aXNpb248L3RkPgotICAgICAgPHRkIHZhbGlnbj0iVE9QIj5SZXRyaWV2ZSB0aGUgc3BlY2lmaWVkIHJldmlzaW9uLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249IlRPUCI+dXNlcmlkPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249IlRPUCI+VXNlIHRoZSBzcGVjaWZpZWQgdXNlcmlkLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJUT1AiPk5vPC90ZD4KLSAgICA8L3RyPgotPC90YWJsZT4KLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgotCi08aDM+cHZjc3Byb2plY3QgZWxlbWVudDwvaDM+Ci08cD48Y29kZT5wdmNzPC9jb2RlPiBzdXBwb3J0cyBhIG5lc3RlZAotPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudCwgdGhhdCByZXByZXNlbnRzIGEgcHJvamVjdAotd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tLiAgQnkgbmVzdGluZyBtdWx0aXBsZQotPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudHMgdW5kZXIgdGhlCi08Y29kZT4mbHQ7cHZjcyZndDs8L2NvZGU+IHRhc2ssIG11bHRpcGxlIHByb2plY3RzIGNhbiBiZQotc3BlY2lmaWVkLjwvcD4KLQorPHA+VGhlIDxjb2RlPnB2Y3M8L2NvZGU+IHRhc2sgaXMgc2V0IHRvIHBvaW50IGF0IGEgUFZDUyByZXBvc2l0b3J5IGFuZCBvcHRpb25hbGx5IGEgcHJvamVjdCB3aXRoaW4KK3RoYXQgcmVwb3NpdG9yeSwgYW5kIGNhbiBmcm9tIHRoYXQgc3BlY2lmaWNhdGlvbiBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBmaWxlcyBjb250YWluZWQgYnkKK3RoZSByZXBvc2l0b3J5LjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KIAotPHRhYmxlIEJPUkRFUiBDRUxMU1BBQ0lORz0wIENFTExQQURESU5HPTIgPgotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnJlcG9zaXRvcnk8L3RkPgorICAgIDx0ZD5UaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgKHNlZSB5b3VyIFBWQ1MgbWFudWFscykuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wdmNzcHJvamVjdDwvdGQ+CisgICAgPHRkPlRoZSBwcm9qZWN0IHdpdGhpbiB0aGUgUFZDUyByZXBvc2l0b3J5IHRvIGV4dHJhY3QgZmlsZXMgZnJvbS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gcm9vdCBwcm9qZWN0LCA8cT4vPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGFiZWw8L3RkPgorICAgIDx0ZD5Pbmx5IGZpbGVzIG1hcmtlZCB3aXRoIHRoaXMgbGFiZWwgYXJlIGV4dHJhY3RlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cHJvbW90aW9uZ3JvdXA8L3RkPgorICAgIDx0ZD5Pbmx5IGZpbGVzIHdpdGhpbiB0aGlzIHByb21vdGlvbiBncm91cCBhcmUgZXh0cmFjdGVkLiBVc2luZyBib3RoIHRoZSA8dmFyPmxhYmVsPC92YXI+IGFuZAorICAgICAgdGhlIDx2YXI+cHJvbW90aW9uZ3JvdXA8L3Zhcj4gdGFnIHdpbGwgY2F1c2UgdGhlIGZpbGVzIGluIHRoZSBwcm9tb3Rpb24gZ3JvdXAgYW5kIHdpdGggdGhhdAorICAgICAgbGFiZWwgdG8gYmUgZXh0cmFjdGVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb25maWc8L3RkPgorICAgIDx0ZD5wYXRoIG9mIGEgbm9uIGRlZmF1bHQgPHNhbXA+LmNmZzwvc2FtcD4gZmlsZS4gIENhbiBiZSBnaXZlbiBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0bworICAgICAgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgPHRkPklmIHNldCB0byA8cT55ZXM8L3E+IGFsbCBmaWxlcyB0aGF0IGV4aXN0cyBhbmQgYXJlIHdyaXRhYmxlIGFyZQorICAgICAgb3ZlcndyaXR0ZW4uIERlZmF1bHQgPHE+bm88L3E+IGNhdXNlcyB0aGUgZmlsZXMgdGhhdCBhcmUgd3JpdGFibGUgdG8gYmUgaWdub3JlZC4gVGhpcyBzdG9wcworICAgICAgdGhlIFBWQ1MgY29tbWFuZCA8Y29kZT5nZXQ8L2NvZGU+IHRvIHN0b3AgYXNraW5nIHF1ZXN0aW9ucyE8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ubzwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPndvcmtzcGFjZTwvdGQ+CisgICAgPHRkPkJ5IHNwZWNpZnlpbmcgYSA8dmFyPndvcmtzcGFjZTwvdmFyPiwgdGhlIGZpbGVzIGFyZSBleHRyYWN0ZWQgdG8gdGhhdCBsb2NhdGlvbi4gQSBQVkNTCisgICAgICB3b3Jrc3BhY2UgaXMgYSBuYW1lIGZvciBhIGxvY2F0aW9uIG9mIHRoZSB3b3JrZmlsZXMgYW5kIGlzbid0IGFzIHN1Y2ggdGhlIGxvY2F0aW9uIGl0c2VsZi4gWW91CisgICAgICBkZWZpbmUgdGhlIGxvY2F0aW9uIGZvciBhIHdvcmtzcGFjZSB1c2luZyB0aGUgUFZDUyBHVUkgY2xpZW50cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCB3b3Jrc3BhY2UgZm9yIHRoZSBjdXJyZW50IHVzZXI8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnB2Y3NiaW48L3RkPgorICAgIDx0ZD5PbiBzb21lIHN5c3RlbXMgdGhlIFBWQ1MgZXhlY3V0YWJsZXMgPGtiZD5wY2xpPC9rYmQ+IGFuZCA8a2JkPmdldDwva2JkPiBhcmUgbm90IGZvdW5kIGluCisgICAgICB0aGUgPGNvZGU+UEFUSDwvY29kZT4uIEluIHN1Y2ggY2FzZXMgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgPGNvZGU+YmluPC9jb2RlPgorICAgICAgZGlyZWN0b3J5IG9mIHRoZSBQVkNTIGluc3RhbGxhdGlvbiBjb250YWluaW5nIHRoZSBleGVjdXRhYmxlcyBtZW50aW9uZWQgYmVmb3JlLiBJZiB0aGlzCisgICAgICBhdHRyaWJ1dGUgaXNuJ3Qgc3BlY2lmaWVkIHRoZSB0YWcgZXhwZWN0cyB0aGUgZXhlY3V0YWJsZXMgdG8gYmUgZm91bmQgdXNpbmcKKyAgICAgIHRoZSA8Y29kZT5QQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aWdub3JlcmV0dXJuY29kZTwvdGQ+CisgICAgPHRkPklmIHNldCB0byA8cT50cnVlPC9xPiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZXhlY3V0aW5nIHRoZSBQVkNTIGNvbW1hbmRzIGFyZSBpZ25vcmVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD51cGRhdGVvbmx5PC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+IGZpbGVzIGFyZSBnb3R0ZW4gb25seSBpZiBuZXdlciB0aGFuIGV4aXN0aW5nIGxvY2FsIGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5maWxlbmFtZWZvcm1hdDwvdGQ+CisgICAgPHRkPlRoZSBmb3JtYXQgb2YgeW91ciBmb2xkZXIgbmFtZXMgaW4gYSBmb3JtYXQgc3VpdGFibGUKKyAgICAgIGZvciA8Y29kZT5qYXZhLnRleHQuTWVzc2FnZUZvcm1hdDwvY29kZT4uICBSZXBvc2l0b3JpZXMgd2hlcmUgdGhlIGFyY2hpdmUgZXh0ZW5zaW9uIGlzCisgICAgICBub3QgPHNhbXA+LWFyYzwvc2FtcD4gc2hvdWxkIHNldCB0aGlzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT57MH0tYXJjKHsxfSk8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5saW5lc3RhcnQ8L3RkPgorICAgIDx0ZD5Vc2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIDxjb2RlPnBjbGk8L2NvZGU+IGNvbW1hbmQuICBUaGUgcGFyc2VyIGFscmVhZHkga25vd3MKKyAgICAgIGFib3V0IDxxPi88L3E+IGFuZCA8cT5cXDwvcT4sIHRoaXMgcHJvcGVydHkgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIHRoZSByZXBvc2l0b3J5IGlzCisgICAgICBhY2Nlc3NlZCBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gdmlhIGEgZHJpdmUgbGV0dGVyIG1hcHBpbmcuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxjb2RlPiZxdW90O1A6PC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmV2aXNpb248L3RkPgorICAgIDx0ZD5SZXRyaWV2ZSB0aGUgc3BlY2lmaWVkIHJldmlzaW9uLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD51c2VyaWQ8L3RkPgorICAgIDx0ZD5Vc2UgdGhlIHNwZWNpZmllZCB1c2VyaWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMyBpZD0ibmVzdGVkIj5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iNzglIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorPGg0PnB2Y3Nwcm9qZWN0IGVsZW1lbnQ8L2g0PgorPHA+VGhlIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudCwgdGhhdCByZXByZXNlbnRzIGEKK3Byb2plY3Qgd2l0aGluIHRoZSBQVkNTIHJlcG9zaXRvcnkgdG8gZXh0cmFjdCBmaWxlcyBmcm9tLiAgQnkgbmVzdGluZworbXVsdGlwbGUgPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudHMgdW5kZXIgdGhlIDxjb2RlPiZsdDtwdmNzJmd0OzwvY29kZT4gdGFzaywKK211bHRpcGxlIHByb2plY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC9wPgogCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotPC90cj4KKzxoNT5QYXJhbWV0ZXJzPC9oNT4KIAotPHRyPgotPHRkIFZBTElHTj1UT1AgV0lEVEg9IjEyJSI+bmFtZTwvdGQ+Ci0KLTx0ZCBWQUxJR049VE9QIFdJRFRIPSI3OCUiPlRoZSBuYW1lIG9mIHRoZSBwdmNzIHByb2plY3Q8L3RkPgotCi08dGQgVkFMSUdOPVRPUCBXSURUSD0iMTAlIj5ZZXM8L3RkPgotPC90cj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBQVkNTIHByb2plY3Q8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLVRoZSBmb2xsb3dpbmcgc2V0LXVwIGV4dHJhY3RzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgZmlsZXMgaW4gdGhlIHB2Y3MgcmVwb3NpdG9yeS4KKzxwPlRoZSBmb2xsb3dpbmcgc2V0LXVwIGV4dHJhY3RzIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgZmlsZXMgaW4gdGhlIHB2Y3MgcmVwb3NpdG9yeS48L3A+CiA8cHJlPgotICAmbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0mZ3Q7Ci0gICZsdDshLS0gR2V0IHRoZSBsYXRlc3QgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDsKLSAgJmx0OyEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tJmd0OwotICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Z2V0bGF0ZXN0JnF1b3Q7Jmd0OwotICAgICZsdDtwdmNzIHJlcG9zaXRvcnk9JnF1b3Q7L21udC9wdmNzJnF1b3Q7IHB2Y3Nwcm9qZWN0PSZxdW90Oy9teXByaiZxdW90Oy8mZ3Q7Ci0gICZsdDsvdGFyZ2V0Jmd0OzwvdWw+Ci08L3ByZT4KLTxwPk5vdyBydW46PC9wPgotPGNvZGU+YW50IGdldGxhdGVzdDwvY29kZT4KKyZsdDshLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLSZndDsKKyZsdDshLS0gR2V0IHRoZSBsYXRlc3QgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSZndDsKKyZsdDshLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLSZndDsKKyZsdDt0YXJnZXQgbmFtZT0mcXVvdDtnZXRsYXRlc3QmcXVvdDsmZ3Q7CisgICZsdDtwdmNzIHJlcG9zaXRvcnk9JnF1b3Q7L21udC9wdmNzJnF1b3Q7IHB2Y3Nwcm9qZWN0PSZxdW90Oy9teXByaiZxdW90Oy8mZ3Q7CismbHQ7L3RhcmdldCZndDs8L3ByZT4KKzxwPk5vdyBydW46IDxrYmQ+YW50IGdldGxhdGVzdDwva2JkPjwvcD4KIDxwPlRoaXMgd2lsbCBjYXVzZSB0aGUgZm9sbG93aW5nIG91dHB1dCB0byBhcHBlYXI6PC9wPgotPHByZT4KKzxwcmUgY2xhc3M9Im91dHB1dCI+CiAgIGdldGxhdGVzdDoKICAgW3B2Y3NdIFBWQ1MgVmVyc2lvbiBNYW5hZ2VyIChWTUdVSSkgdjYuNi4xMCAoQnVpbGQgODcwKSBmb3IgV2luZG93cyBOVC84MHg4NgogICBbcHZjc10gQ29weXJpZ2h0IDE5ODUtMjAwMCBNRVJBTlQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0yNTYsMjMgKzIwOCwyMSBAQAogCiAgIFRvdGFsIHRpbWU6IDE5IHNlY29uZHM8L3ByZT4KIAotVGhpcyBuZXh0IGV4YW1wbGUgZXh0cmFjdHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBmaWxlcyBpbiB0aGUgcHZjcwotcmVwb3NpdG9yeSBmcm9tIHR3byBwcm9qZWN0cyB1c2luZyBuZXN0ZWQgPGNvZGU+Jmx0O3B2Y3Nwcm9qZWN0Jmd0OzwvY29kZT4gZWxlbWVudHMuCis8cD5UaGlzIG5leHQgZXhhbXBsZSBleHRyYWN0cyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGZpbGVzIGluIHRoZSBwdmNzIHJlcG9zaXRvcnkgZnJvbSB0d28KK3Byb2plY3RzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7cHZjc3Byb2plY3QmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiA8cHJlPgotICAmbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLSZndDsKLSAgJmx0OyEtLSBHZXQgbGF0ZXN0IGZyb20gbXlwcmogYW5kIG15cHJqMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0mZ3Q7Ci0gICZsdDshLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tJmd0OwotICAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Z2V0bGF0ZXN0MiZxdW90OyZndDsKLSAgICAmbHQ7cHZjcyByZXBvc2l0b3J5PSZxdW90Oy9tbnQvcHZjcyZxdW90OyZndDsKLSAgICAgICZsdDtwdmNzcHJvamVjdCBuYW1lPSZxdW90Oy9teXByaiZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7cHZjc3Byb2plY3QgbmFtZT0mcXVvdDsvbXlwcmoyJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3B2Y3MmZ3Q7Ci0gICZsdDsvdGFyZ2V0Jmd0OzwvdWw+Ci08L3ByZT4KLTxwPk5vdyBydW46PC9wPgotPGNvZGU+YW50IGdldGxhdGVzdDI8L2NvZGU+CismbHQ7IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLSZndDsKKyZsdDshLS0gR2V0IGxhdGVzdCBmcm9tIG15cHJqIGFuZCBteXByajIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tJmd0OworJmx0OyEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0mZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7Z2V0bGF0ZXN0MiZxdW90OyZndDsKKyAgJmx0O3B2Y3MgcmVwb3NpdG9yeT0mcXVvdDsvbW50L3B2Y3MmcXVvdDsmZ3Q7CisgICAgJmx0O3B2Y3Nwcm9qZWN0IG5hbWU9JnF1b3Q7L215cHJqJnF1b3Q7LyZndDsKKyAgICAmbHQ7cHZjc3Byb2plY3QgbmFtZT0mcXVvdDsvbXlwcmoyJnF1b3Q7LyZndDsKKyAgJmx0Oy9wdmNzJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+Cis8cD5Ob3cgcnVuOiA8a2JkPmFudCBnZXRsYXRlc3QyPC9rYmQ+PC9wPgogPHA+VGhpcyB3aWxsIGNhdXNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHRvIGFwcGVhcjo8L3A+Ci08cHJlPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KICAgZ2V0bGF0ZXN0MjoKICAgW3B2Y3NdIFBWQ1MgVmVyc2lvbiBNYW5hZ2VyIChWTUdVSSkgdjYuNi4xMCAoQnVpbGQgODcwKSBmb3IgV2luZG93cyBOVC84MHg4NgogICBbcHZjc10gQ29weXJpZ2h0IDE5ODUtMjAwMCBNRVJBTlQuICBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMjg5LDcgKzIzOSw1IEBACiAKICAgVG90YWwgdGltZTogMjIgc2Vjb25kczwvcHJlPgogCi08aHIgV0lEVEg9IjEwMCUiPgotPHA+UFZDUyBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIE1FUkFOVC48L3A+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcmVjb3JkZXIuaHRtbCBiL21hbnVhbC9UYXNrcy9yZWNvcmRlci5odG1sCmluZGV4IGRmYmZjMGQuLjE3ZjU5YWUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9yZWNvcmRlci5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9yZWNvcmRlci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsODMgKzE1LDc1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5SZWNvcmRlciBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJsb2ciPlJlY29yZDwvYT48L2gyPgorPGgyIGlkPSJsb2ciPlJlY29yZDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+QSByZWNvcmRlciBpcyBhIGxpc3RlbmVyIHRvIHRoZSBjdXJyZW50IGJ1aWxkIHByb2Nlc3MgdGhhdCByZWNvcmRzIHRoZQotb3V0cHV0IHRvIGEgZmlsZS48L3A+Cis8cD5BIHJlY29yZGVyIGlzIGEgbGlzdGVuZXIgdG8gdGhlIGN1cnJlbnQgYnVpbGQgcHJvY2VzcyB0aGF0IHJlY29yZHMgdGhlIG91dHB1dCB0byBhIGZpbGUuPC9wPgogCi08cD5TZXZlcmFsIHJlY29yZGVycyBjYW4gZXhpc3QgYXQgdGhlIHNhbWUgdGltZS4gIEVhY2ggcmVjb3JkZXIgaXMKLWFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuICBUaGUgZmlsZW5hbWUgaXMgdXNlZCBhcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGZvcgotdGhlIHJlY29yZGVycy4gIFRoZSBmaXJzdCBjYWxsIHRvIHRoZSByZWNvcmRlciB0YXNrIHdpdGggYW4gdW51c2VkIGZpbGVuYW1lCi13aWxsIGNyZWF0ZSBhIHJlY29yZGVyICh1c2luZyB0aGUgcGFyYW1ldGVycyBwcm92aWRlZCkgYW5kIGFkZCBpdCB0byB0aGUKLWxpc3RlbmVycyBvZiB0aGUgYnVpbGQuICBBbGwgc3Vic2VxdWVudCBjYWxscyB0byB0aGUgcmVjb3JkZXIgdGFzayB1c2luZwotdGhpcyBmaWxlbmFtZSB3aWxsIG1vZGlmeSB0aGF0IHJlY29yZGVycyBzdGF0ZSAocmVjb3JkaW5nIG9yIG5vdCkgb3Igb3RoZXIKLXByb3BlcnRpZXMgKGxpa2UgbG9nZ2luZyBsZXZlbCkuPC9wPgorPHA+U2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0IGF0IHRoZSBzYW1lIHRpbWUuICBFYWNoIHJlY29yZGVyIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuICBUaGUKK2ZpbGVuYW1lIGlzIHVzZWQgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlY29yZGVycy4gIFRoZSBmaXJzdCBjYWxsIHRvCit0aGUgPGNvZGU+cmVjb3JkPC9jb2RlPiB0YXNrIHdpdGggYW4gdW51c2VkIGZpbGVuYW1lIHdpbGwgY3JlYXRlIGEgcmVjb3JkZXIgKHVzaW5nIHRoZSBwYXJhbWV0ZXJzCitwcm92aWRlZCkgYW5kIGFkZCBpdCB0byB0aGUgbGlzdGVuZXJzIG9mIHRoZSBidWlsZC4gIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSA8Y29kZT5yZWNvcmQ8L2NvZGU+Cit0YXNrIHVzaW5nIHRoaXMgZmlsZW5hbWUgd2lsbCBtb2RpZnkgdGhhdCByZWNvcmRlcidzIHN0YXRlIChyZWNvcmRpbmcgb3Igbm90KSBvciBvdGhlciBwcm9wZXJ0aWVzCisobGlrZSBsb2dnaW5nIGxldmVsKS48L3A+CiAKLTxwPlNvbWUgdGVjaG5pY2FsIGlzc3VlczogdGhlIGZpbGUncyBwcmludCBzdHJlYW0gaXMgZmx1c2hlZCBmb3IgJnF1b3Q7ZmluaXNoZWQmcXVvdDsKLWV2ZW50cyAoYnVpbGRGaW5pc2hlZCwgdGFyZ2V0RmluaXNoZWQgYW5kIHRhc2tGaW5pc2hlZCksIGFuZCBpcyBjbG9zZWQgb24KLWEgYnVpbGRGaW5pc2hlZCBldmVudC48L3A+Cis8cD5Tb21lIHRlY2huaWNhbCBpc3N1ZXM6IHRoZSBmaWxlJ3MgcHJpbnQgc3RyZWFtIGlzIGZsdXNoZWQgZm9yIDxxPmZpbmlzaGVkPC9xPiBldmVudHMKKyg8cT5idWlsZEZpbmlzaGVkPC9xPiwgPHE+dGFyZ2V0RmluaXNoZWQ8L3E+IGFuZCA8cT50YXNrRmluaXNoZWQ8L3E+KSwgYW5kIGlzIGNsb3NlZCBvbgorYSA8cT5idWlsZEZpbmlzaGVkPC9xPiBldmVudC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGlzIGxvZ2dlciBpcyBhc3NvY2lhdGVkIHdpdGguPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPnllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGlzIGxvZ2dlciBpcyBhc3NvY2lhdGVkIHdpdGguPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWN0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgdGVsbHMgdGhlIGxvZ2dlciB3aGF0IHRvIGRvOiBzaG91bGQgaXQgc3RhcnQKLSAgICByZWNvcmRpbmcgb3Igc3RvcD8gIFRoZSBmaXJzdCB0aW1lIHRoYXQgdGhlIHJlY29yZGVyIHRhc2sgaXMgY2FsbGVkIGZvcgotICAgIHRoaXMgbG9nZmlsZSwgYW5kIGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB0aGUgZGVmYXVsdAotICAgIGZvciB0aGlzIGF0dHJpYnV0ZSBpcyAmcXVvdDtzdGFydCZxdW90Oy4gIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBwcm92aWRlZCBvbgotICAgIHN1YnNlcXVlbnQgY2FsbHMsIHRoZW4gdGhlIHN0YXRlIHJlbWFpbnMgYXMgcHJldmlvdXMuCi0gICAgW1ZhbHVlcyA9IHtzdGFydHxzdG9wfSwgRGVmYXVsdCA9IG5vIHN0YXRlIGNoYW5nZV08L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICAgIDx0ZD5hY3Rpb248L3RkPgorICAgIDx0ZD5UaGlzIHRlbGxzIHRoZSBsb2dnZXIgd2hhdCB0byBkbzogc2hvdWxkIGl0IHN0YXJ0IHJlY29yZGluZyBvciBzdG9wPyAgVGhlIGZpcnN0IHRpbWUgdGhhdAorICAgICAgdGhlIHJlY29yZGVyIHRhc2sgaXMgY2FsbGVkIGZvciB0aGlzIGxvZ2ZpbGUsIGFuZCBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgcHJvdmlkZWQsIHRoZW4gdGhlCisgICAgICBkZWZhdWx0IGZvciB0aGlzIGF0dHJpYnV0ZSBpcyA8cT5zdGFydDwvcT4uICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgcHJvdmlkZWQgb24gc3Vic2VxdWVudAorICAgICAgY2FsbHMsIHRoZW4gdGhlIHN0YXRlIHJlbWFpbnMgYXMgcHJldmlvdXMuPC90ZD4KKyAgICA8dGQ+Tm8gW3ZhbHVlcyA9IDxxPnN0YXJ0fHN0b3A8L3E+LCBkZWZhdWx0ID0gbm8gc3RhdGUgY2hhbmdlXTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TaG91bGQgdGhlIHJlY29yZGVyIGFwcGVuZCB0byBhIGZpbGUsIG9yIGNyZWF0ZSBhIG5ldwotICAgIG9uZT8gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdGhlIGZpcnN0IHRpbWUgdGhpcyB0YXNrIGlzIGNhbGxlZCBmb3IKLSAgICB0aGlzIGZpbGUuICBbVmFsdWVzID0ge3llc3xub30sIERlZmF1bHQ9bm9dPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPm5vPC90ZD4KKyAgICA8dGQ+YXBwZW5kPC90ZD4KKyAgICA8dGQ+U2hvdWxkIHRoZSByZWNvcmRlciBhcHBlbmQgdG8gYSBmaWxlLCBvciBjcmVhdGUgYSBuZXcgb25lPyBUaGlzIGlzIG9ubHkgYXBwbGljYWJsZSB0aGUgZmlyc3QKKyAgICAgIHRpbWUgdGhpcyB0YXNrIGlzIGNhbGxlZCBmb3IgdGhpcyBmaWxlLjwvdGQ+CisgICAgPHRkPk5vIFt2YWx1ZXMgPSA8cT5zdGFydHxzdG9wPC9xPiwgZGVmYXVsdCA9IG5vIHN0YXRlIGNoYW5nZV08L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbWFjc21vZGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UmVtb3ZlcyA8Y29kZT5bdGFza108L2NvZGU+IGJhbm5lcnMgbGlrZSBBcGFjaGUgQW50J3MKLSAgICA8Y29kZT4tZW1hY3M8L2NvZGU+IGNvbW1hbmQgbGluZSBzd2l0Y2ggaWYgc2V0IHRvCi0gICAgPGVtPnRydWU8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm8sIGRlZmF1bHQgaXMgPGVtPmZhbHNlPC9lbT48L3RkPgorICAgIDx0ZD5lbWFjc21vZGU8L3RkPgorICAgIDx0ZD5SZW1vdmVzIDxjb2RlPlt0YXNrXTwvY29kZT4gYmFubmVycyBsaWtlIEFwYWNoZSBBbnQncyA8a2JkPi1lbWFjczwva2JkPiBjb21tYW5kIGxpbmUKKyAgICAgIHN3aXRjaCBpZiBzZXQgdG8gPHE+dHJ1ZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9nbGV2ZWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QXQgd2hhdCBsb2dnaW5nIGxldmVsIHNob3VsZCB0aGlzIHJlY29yZGVyIGluc3RhbmNlCi0gICAgcmVjb3JkIHRvPyAgVGhpcyBpcyBub3QgYSBvbmNlIG9ubHkgcGFyYW1ldGVyIChsaWtlIDxjb2RlPmFwcGVuZDwvY29kZT4KLSAgICBpcykgLS0geW91IGNhbiBpbmNyZWFzZSBvciBkZWNyZWFzZSB0aGUgbG9nZ2luZyBsZXZlbCBhcyB0aGUgYnVpbGQgcHJvY2VzcwotICAgIGNvbnRpbnVlcy4gIFtWYWx1ZXM9IHtlcnJvcnx3YXJufGluZm98dmVyYm9zZXxkZWJ1Z30sIERlZmF1bHQgPSBubyBjaGFuZ2VdCisgICAgPHRkPmxvZ2xldmVsPC90ZD4KKyAgICA8dGQ+QXQgd2hhdCBsb2dnaW5nIGxldmVsIHNob3VsZCB0aGlzIHJlY29yZGVyIGluc3RhbmNlIHJlY29yZCB0bz8gIFRoaXMgaXMgbm90IGEgb25jZSBvbmx5CisgICAgICBwYXJhbWV0ZXIgKGxpa2UgPHZhcj5hcHBlbmQ8L3Zhcj4gaXMpJm1kYXNoO3lvdSBjYW4gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIGxvZ2dpbmcgbGV2ZWwgYXMKKyAgICAgIHRoZSBidWlsZCBwcm9jZXNzIGNvbnRpbnVlcy4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICAgIDx0ZD5ObyBbdmFsdWVzID0gPHE+ZXJyb3J8d2FybnxpbmZvfHZlcmJvc2V8ZGVidWc8L3E+LCBkZWZhdWx0ID0gbm8gY2hhbmdlXTwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+VGhlIGZvbGxvd2luZyBidWlsZC54bWwgc25pcHBldCBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIHJlY29yZGVyCi10byByZWNvcmQganVzdCB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzazo8L3A+Cis8cD5UaGUgZm9sbG93aW5nIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gc25pcHBldCBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIHJlY29yZGVyIHRvIHJlY29yZAoranVzdCB0aGUgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gdGFzazo8L3A+CiA8cHJlPgogICAgIC4uLgogICAgICZsdDtjb21waWxlICZndDsKQEAgLTEwMSwxMCArOTQsOSBAQAogICAgIC4uLgogPC9wcmU+CiAKLTxwPlRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzIHRvIDxjb2RlPiZsdDtyZWNvcmQmZ3Q7PC9jb2RlPiBzZXQgdXAgdHdvCi1yZWNvcmRlcnM6IG9uZSB0byBmaWxlICZxdW90O3JlY29yZHMtc2ltcGxlLmxvZyZxdW90OyBhdCBsb2dnaW5nIGxldmVsIDxjb2RlPmluZm88L2NvZGU+Ci0odGhlIGRlZmF1bHQpIGFuZCBvbmUgdG8gZmlsZSAmcXVvdDtJU08ubG9nJnF1b3Q7IHVzaW5nIGxvZ2dpbmcgbGV2ZWwgb2YKLTxjb2RlPnZlcmJvc2U8L2NvZGU+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzIHRvIDxjb2RlPiZsdDtyZWNvcmQmZ3Q7PC9jb2RlPiBzZXQgdXAgdHdvIHJlY29yZGVyczogb25lIHRvCitmaWxlIDxzYW1wPnJlY29yZHMtc2ltcGxlLmxvZzwvc2FtcD4gYXQgbG9nZ2luZyBsZXZlbCA8cT5pbmZvPC9xPiAodGhlIGRlZmF1bHQpIGFuZCBvbmUgdG8KK2ZpbGUgPHNhbXA+SVNPLmxvZzwvc2FtcD4gdXNpbmcgbG9nZ2luZyBsZXZlbCBvZiA8cT52ZXJib3NlPC9xPi48L3A+CiA8cHJlPgogICAgIC4uLgogICAgICZsdDtyZWNvcmQgbmFtZT0mcXVvdDtyZWNvcmRzLXNpbXBsZS5sb2cmcXVvdDsvJmd0OwpAQCAtMTEzLDYwICsxMDUsNDkgQEAKIDwvcHJlPgogCiA8aDM+Tm90ZXM8L2gzPgotPHA+VGhlcmUgaXMgc29tZSBmdW5jdGlvbmFsaXR5IHRoYXQgSSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gYWRkIGluIHRoZQotZnV0dXJlLiAgVGhleSBpbmNsdWRlIHRoaW5ncyBsaWtlIHRoZSBmb2xsb3dpbmc6PC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZXJlIGlzIHNvbWUgZnVuY3Rpb25hbGl0eSB0aGF0IEkgd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIGFkZCBpbiB0aGUgZnV0dXJlLiAgVGhleSBpbmNsdWRlCit0aGluZ3MgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saXN0ZW5lcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIGNsYXNzbmFtZSBvZiBhIGJ1aWxkIGxpc3RlbmVyIHRvIHVzZSBmcm9tIHRoaXMgcG9pbnQKLSAgICBvbiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGxpc3RlbmVyLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5ubzwvdGQ+CisgICAgPHRkPmxpc3RlbmVyPC90ZD4KKyAgICA8dGQ+QSBjbGFzc25hbWUgb2YgYSBidWlsZCBsaXN0ZW5lciB0byB1c2UgZnJvbSB0aGlzIHBvaW50IG9uIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKKyAgICAgIGxpc3RlbmVyLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXRhcmdldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiByb3dzcGFuPTI+QSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzIHRvIGF1dG9tYXRpY2FsbHkKLSAgICByZWNvcmQuICBJZiB0aGlzIHZhbHVlIGlzICZxdW90O2FsbCZxdW90OywgdGhlbiBhbGwgdGFyZ2V0cyBhcmUgcmVjb3JkZWQuCi0gICAgW0RlZmF1bHQgPSBhbGxdPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPm5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXRhcmdldDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0cyB0byBhdXRvbWF0aWNhbGx5IHJlY29yZC4gIElmIHRoaXMgdmFsdWUKKyAgICAgIGlzIDxxPmFsbDwvcT4sIHRoZW4gYWxsIHRhcmdldHMgYXJlIHJlY29yZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmFsbDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRldGFyZ2V0PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPm5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXRhcmdldDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXRhc2s8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgcm93c3Bhbj0yPkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFzayB0byBhdXRvbWF0aWNhbGx5Ci0gICAgcmVjb3JkIG9yIG5vdC4gIFRoaXMgY291bGQgYmUgZGlmZmljdWx0IGFzIGl0IGNvdWxkIGNvbmZsaWN0IHdpdGggdGhlCi0gICAgPGNvZGU+aW5jbHVkZXRhcmdldC9leGNsdWRldGFyZ2V0PC9jb2RlPi4gIChlLmcuOgotICAgIDxjb2RlPmluY2x1ZGV0YXJnZXQ9JnF1b3Q7Y29tcGlsZSZxdW90OyBleGNsdWRldGFzaz0mcXVvdDtqYXZhYyZxdW90OzwvY29kZT4sIHdoYXQgc2hvdWxkCi0gICAgaGFwcGVuPyk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICAgIDx0ZD5pbmNsdWRldGFzazwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFza3MgdG8gYXV0b21hdGljYWxseSByZWNvcmQgb3Igbm90LiAgVGhpcyBjb3VsZCBiZQorICAgICAgZGlmZmljdWx0IGFzIGl0IG1heSBjb25mbGljdCB3aXRoIHRoZSA8Y29kZT5pbmNsdWRldGFyZ2V0L2V4Y2x1ZGV0YXJnZXQ8L2NvZGU+LgorICAgICAgKGUuZy46IDxjb2RlPmluY2x1ZGV0YXJnZXQ9JnF1b3Q7Y29tcGlsZSZxdW90OyBleGNsdWRldGFzaz0mcXVvdDtqYXZhYyZxdW90OzwvY29kZT4sIHdoYXQKKyAgICAgIHNob3VsZCBoYXBwZW4/KTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXRhc2s8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+bm88L3RkPgorICAgIDx0ZD5leGNsdWRldGFzazwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWN0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZCBncmVhdGVyIGZsZXhpYmlsaXR5IHRvIHRoZSBhY3Rpb24gYXR0cmlidXRlLiAgVGhpbmdzCi0gICAgbGlrZSA8Y29kZT5jbG9zZTwvY29kZT4gdG8gY2xvc2UgdGhlIHByaW50IHN0cmVhbS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+bm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjwvdGQ+CisgICAgPHRkPmFjdGlvbjwvdGQ+CisgICAgPHRkPmFkZCBncmVhdGVyIGZsZXhpYmlsaXR5IHRvIHRoZSA8dmFyPmFjdGlvbjwvdmFyPiBhdHRyaWJ1dGUuICBUaGluZ3MgbGlrZSA8cT5jbG9zZTwvcT4gdG8KKyAgICAgIGNsb3NlIHRoZSBwcmludCBzdHJlYW0uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotCi0KLQotCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcmVuYW1lLmh0bWwgYi9tYW51YWwvVGFza3MvcmVuYW1lLmh0bWwKaW5kZXggMzMwZmJlMy4uZTliM2UxZiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3JlbmFtZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9yZW5hbWUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDUxICsxNSw1MCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UmVuYW1lIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InJlbmFtZSI+UmVuYW1lPC9hPjwvaDI+Ci08aDM+PGk+RGVwcmVjYXRlZDwvaT48L2gzPgotPHA+PGk+VGhpcyB0YXNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICBVc2UgdGhlIE1vdmUgdGFzayBpbnN0ZWFkLjwvaT48L3A+Cis8aDIgaWQ9InJlbmFtZSI+UmVuYW1lPC9oMj4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+VGhpcyB0YXNrIGhhcyBiZWVuIDx1PmRlcHJlY2F0ZWQ8L3U+LiAgVXNlIHRoZSA8Y29kZT5Nb3ZlPC9jb2RlPiB0YXNrIGluc3RlYWQuPC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+UmVuYW1lcyBhIGdpdmVuIGZpbGUuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZSB0byByZW5hbWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPmZpbGUgdG8gcmVuYW1lLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmV3IG5hbWUgb2YgdGhlIGZpbGUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmRlc3Q8L3RkPgorICAgIDx0ZD5uZXcgbmFtZSBvZiB0aGUgZmlsZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXBsYWNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVuYWJsZSByZXBsYWNpbmcgb2YgZXhpc3RpbmcgZmlsZSAoZGVmYXVsdDogb24pLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5FbmFibGUgcmVwbGFjaW5nIG9mIGV4aXN0aW5nIGZpbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+b248L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtyZW5hbWUgc3JjPSZxdW90O2Zvby5qYXImcXVvdDsgZGVzdD0mcXVvdDske25hbWV9LSR7dmVyc2lvbn0uamFyJnF1b3Q7LyZndDs8L3ByZT4gCi08cD5SZW5hbWVzIHRoZSBmaWxlIDxjb2RlPmZvby5qYXI8L2NvZGU+IHRvIDxjb2RlPiR7bmFtZX0tJHt2ZXJzaW9ufS5qYXI8L2NvZGU+IChhc3N1bWluZyA8Y29kZT5uYW1lPC9jb2RlPgotIGFuZCA8Y29kZT52ZXJzaW9uPC9jb2RlPiBiZWluZyBwcmVkZWZpbmVkIHByb3BlcnRpZXMpLiBJZiBhIGZpbGUgbmFtZWQgPGNvZGU+JHtuYW1lfS0ke3ZlcnNpb259LmphcjwvY29kZT4KLSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZW1vdmVkIHByaW9yIHRvIHJlbmFtaW5nIDxjb2RlPmZvby5qYXI8L2NvZGU+LjwvcD4KIAorPHA+UmVuYW1lIHRoZSBmaWxlIDxzYW1wPmZvby5qYXI8L3NhbXA+IHRvIDxzYW1wPiR7bmFtZX0tJHt2ZXJzaW9ufS5qYXI8L3NhbXA+CisoYXNzdW1pbmcgPGNvZGU+bmFtZTwvY29kZT4gYW5kIDxjb2RlPnZlcnNpb248L2NvZGU+IGJlaW5nIHByZWRlZmluZWQgcHJvcGVydGllcykuIElmIGEgZmlsZQorbmFtZWQgPHNhbXA+JHtuYW1lfS0ke3ZlcnNpb259Lmphcjwvc2FtcD4gYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgcmVtb3ZlZCBwcmlvciB0bworcmVuYW1pbmcgPHNhbXA+Zm9vLmphcjwvc2FtcD4uPC9wPgorPHByZT4mbHQ7cmVuYW1lIHNyYz0mcXVvdDtmb28uamFyJnF1b3Q7IGRlc3Q9JnF1b3Q7JHtuYW1lfS0ke3ZlcnNpb259LmphciZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbCBiL21hbnVhbC9UYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwKaW5kZXggZWQzYmZiYi4uYzg2NGFjMCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcmVuYW1lZXh0ZW5zaW9ucy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTEwICsxNSw5MSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UmVuYW1lRXh0ZW5zaW9ucyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJyZW5hbWVleHRzIj5SZW5hbWVFeHRlbnNpb25zPC9hPjwvaDI+Ci08aDM+PGk+RGVwcmVjYXRlZDwvaT48L2gzPgotPHA+PGk+VGhpcyB0YXNrIGhhcyBiZWVuIGRlcHJlY2F0ZWQuICBVc2UgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL21vdmUuaHRtbCI+bW92ZTwvYT4KLXRhc2sgd2l0aCBhIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI2dsb2ItbWFwcGVyIj5nbG9iIG1hcHBlcjwvYT4gaW5zdGVhZC48L2k+PC9wPgorPGgyIGlkPSJyZW5hbWVleHRzIj5SZW5hbWVFeHRlbnNpb25zPC9oMj4KKzxoMz48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPjwvaDM+Cis8cD48ZW0+VGhpcyB0YXNrIGhhcyBiZWVuIDx1PmRlcHJlY2F0ZWQ8L3U+LiAgVXNlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9tb3ZlLmh0bWwiPm1vdmU8L2E+IHRhc2sKK3dpdGggYSA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNnbG9iLW1hcHBlciI+Z2xvYiBtYXBwZXI8L2E+IGluc3RlYWQuPC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+UmVuYW1lcyBmaWxlcyBpbiB0aGUgPGNvZGU+c3JjRGlyPC9jb2RlPiBkaXJlY3RvcnkgZW5kaW5nIHdpdGggdGhlCi08Y29kZT5mcm9tRXh0ZW5zaW9uPC9jb2RlPiBzdHJpbmcgc28gdGhhdCB0aGV5IGVuZCB3aXRoIHRoZQotPGNvZGU+dG9FeHRlbnNpb248L2NvZGU+IHN0cmluZy4gRmlsZXMgYXJlIG9ubHkgcmVwbGFjZWQgaWYKLTxjb2RlPnJlcGxhY2U8L2NvZGU+IGlzIHRydWUKLTwvcD4KLTxwPlNlZSB0aGUgc2VjdGlvbiBvbgotPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCi1pbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLgotVGhpcyB0YXNrIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gYW5kCi1zdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPgotKDxjb2RlPmRpcjwvY29kZT4gYmVjb21lcyA8Y29kZT5zcmNEaXI8L2NvZGU+KSBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQKLTxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPlJlbmFtZXMgZmlsZXMgaW4gdGhlIDx2YXI+c3JjRGlyPC92YXI+IGRpcmVjdG9yeSBlbmRpbmcgd2l0aCB0aGUgPHZhcj5mcm9tRXh0ZW5zaW9uPC92YXI+IHN0cmluZworc28gdGhhdCB0aGV5IGVuZCB3aXRoIHRoZSA8dmFyPnRvRXh0ZW5zaW9uPC92YXI+IHN0cmluZy4gRmlsZXMgYXJlIG9ubHkgcmVwbGFjZWQKK2lmIDx2YXI+cmVwbGFjZTwvdmFyPiBpcyA8cT50cnVlPC9xPi48L3A+Cis8cD5TZWUgdGhlIHNlY3Rpb24gb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbgoraG93IHRoZSBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLiAgVGhpcyB0YXNrIGZvcm1zIGFuCitpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0IGF0dHJpYnV0ZXMKK29mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDx2YXI+ZGlyPC92YXI+IGJlY29tZXMgPHZhcj5zcmNEaXI8L3Zhcj4pIGFzIHdlbGwgYXMgdGhlCituZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4KLSAgICAgIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgZXhjbHVkZWQuIE5vIGZpbGVzIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcykgYXJlIGV4Y2x1ZGVkIHdoZW4KLSAgICAgIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mcm9tRXh0ZW5zaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdGhhdCBmaWxlcyBtdXN0IGVuZCBpbiB0byBiZSByZW5hbWVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZyb21FeHRlbnNpb248L3RkPgorICAgIDx0ZD5UaGUgc3RyaW5nIHRoYXQgZmlsZXMgbXVzdCBlbmQgaW4gdG8gYmUgcmVuYW1lZDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGFsbCAoPHE+Kio8L3E+KTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVwbGFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBmaWxlIGJlaW5nIHJlbmFtZWQgdG8gc2hvdWxkIGJlCi0gICAgICByZXBsYWNlZCBpZiBpdCBhbHJlYWR5IGV4aXN0czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoZSBmaWxlIGJlaW5nIHJlbmFtZWQgdG8gc2hvdWxkIGJlIHJlcGxhY2VkIGlmIGl0IGFscmVhZHkgZXhpc3RzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmNEaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0YXJ0aW5nIGRpcmVjdG9yeSBmb3IgZmlsZXMgdG8gc2VhcmNoIGluPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNyY0RpcjwvdGQ+CisgICAgPHRkPlRoZSBzdGFydGluZyBkaXJlY3RvcnkgZm9yIGZpbGVzIHRvIHNlYXJjaCBpbjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvRXh0ZW5zaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzdHJpbmcgdGhhdCByZW5hbWVkIGZpbGVzIHdpbGwgZW5kIHdpdGggb24KLSAgICAgIGNvbXBsZXRpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dG9FeHRlbnNpb248L3RkPgorICAgIDx0ZD5UaGUgc3RyaW5nIHRoYXQgcmVuYW1lZCBmaWxlcyB3aWxsIGVuZCB3aXRoIG9uIGNvbXBsZXRpb248L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHA+PGNvZGU+Jmx0O3JlbmFtZWV4dCBzcmNEaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0MSZxdW90OwotICAgICAgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKiZxdW90OwotICAgICAgICAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9zYW1wbGVzLyomcXVvdDsKLSAgICAgICAgICAgICAgZnJvbUV4dGVuc2lvbj0mcXVvdDsuamF2YS5rZWVwJnF1b3Q7Ci0gICAgICAgICAgICAgIHRvRXh0ZW5zaW9uPSZxdW90Oy5qYXZhJnF1b3Q7Ci0gICAgICAgICAgICAgIHJlcGxhY2U9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci08L2NvZGU+Ci0gIDwvcD4KLTwvYmxvY2txdW90ZT4KIAotCis8cHJlPgorJmx0O3JlbmFtZWV4dCBzcmNEaXI9JnF1b3Q7L3NvdXJjZS9wcm9qZWN0MSZxdW90OworICAgICAgICAgICBpbmNsdWRlcz0mcXVvdDsqKiZxdW90OworICAgICAgICAgICBleGNsdWRlcz0mcXVvdDsqKi9zYW1wbGVzLyomcXVvdDsKKyAgICAgICAgICAgZnJvbUV4dGVuc2lvbj0mcXVvdDsuamF2YS5rZWVwJnF1b3Q7CisgICAgICAgICAgIHRvRXh0ZW5zaW9uPSZxdW90Oy5qYXZhJnF1b3Q7CisgICAgICAgICAgIHJlcGxhY2U9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3JlcGxhY2UuaHRtbCBiL21hbnVhbC9UYXNrcy9yZXBsYWNlLmh0bWwKaW5kZXggMzYyMDRkMC4uMmQ2NWEyMCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3JlcGxhY2UuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcmVwbGFjZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjI5ICsxNSwyMTQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJlcGxhY2UgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icmVwbGFjZSI+UmVwbGFjZTwvYT48L2gyPgorPGgyIGlkPSJyZXBsYWNlIj5SZXBsYWNlPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5SZXBsYWNlIGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2sgZm9yIHJlcGxhY2luZyB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nIAotaW4gc2VsZWN0ZWQgZmlsZS48L3A+Ci08cD5JZiB5b3Ugd2FudCB0byByZXBsYWNlIGEgdGV4dCB0aGF0IGNyb3NzZXMgbGluZSBib3VuZGFyaWVzLCB5b3UKLW11c3QgdXNlIGEgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNldG9rZW4mZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KKzxwPjxjb2RlPlJlcGxhY2U8L2NvZGU+IGlzIGEgZGlyZWN0b3J5IGJhc2VkIHRhc2sgZm9yIHJlcGxhY2luZyB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHN0cmluZword2l0aCBhbm90aGVyIHN0cmluZyBpbiBzZWxlY3RlZCBmaWxlLjwvcD4KKzxwPklmIHlvdSB3YW50IHRvIHJlcGxhY2UgYSB0ZXh0IHRoYXQgY3Jvc3NlcyBsaW5lIGJvdW5kYXJpZXMsIHlvdSBtdXN0IHVzZSBhCituZXN0ZWQgPGNvZGU+Jmx0O3JlcGxhY2V0b2tlbiZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgogCi08cD5UaGUgb3V0cHV0IGZpbGUgaXMgb25seSB3cml0dGVuIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUgZXhpc3RpbmcKLWZpbGUuICBUaGlzIHByZXZlbnRzIHNwdXJpb3VzIHJlYnVpbGRzIGJhc2VkIG9uIHVuY2hhbmdlZCBmaWxlcyB3aGljaAotaGF2ZSBiZWVuIHJlZ2VuZXJhdGVkIGJ5IHRoaXMgdGFzay48L3A+IAorPHA+VGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIGV4aXN0aW5nIGZpbGUuICBUaGlzIHByZXZlbnRzIHNwdXJpb3VzCityZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2ggaGF2ZSBiZWVuIHJlZ2VuZXJhdGVkIGJ5IHRoaXMgdGFzay48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlIGZvciB3aGljaCB0aGUgdG9rZW4gc2hvdWxkIGJlIHJlcGxhY2VkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPmZpbGUgZm9yIHdoaWNoIHRoZSB0b2tlbiBzaG91bGQgYmUgcmVwbGFjZWQuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcmVwbGFjaW5nIGEgdG9rZW4gaW4gCi0gICAgICBtdWx0aXBsZSBmaWxlcy48L3RkPgorICAgIDx0ZD5kaXI8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGJhc2UgZGlyZWN0b3J5IHRvIHVzZSB3aGVuIHJlcGxhY2luZyBhIHRva2VuIGluIG11bHRpcGxlIGZpbGVzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgdXBvbiB3aGljaCByZXBsYWNlIG9wZXJhdGVzLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgdXBvbiB3aGljaCByZXBsYWNlIG9wZXJhdGVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b2tlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdG9rZW4gd2hpY2ggbXVzdCBiZSByZXBsYWNlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQKLSAgICA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+IGVsZW1lbnQgb3IgdGhlIHJlcGxhY2VmaWx0ZXJmaWxlCi0gICAgYXR0cmlidXRlIGlzIHVzZWQuPC90ZD4KKyAgICA8dGQ+dG9rZW48L3RkPgorICAgIDx0ZD50aGUgdG9rZW4gd2hpY2ggbXVzdCBiZSByZXBsYWNlZC48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBhIG5lc3RlZCA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+IGVsZW1lbnQgb3IgdGhlIDx2YXI+cmVwbGFjZWZpbHRlcmZpbGU8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSBpcyB1c2VkLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuZXcgdmFsdWUgZm9yIHRoZSB0b2tlbi4gV2hlbiBvbWl0dGVkLCBhbiBlbXB0eSBzdHJpbmcKLSAgICAgICgmcXVvdDsmcXVvdDspIGlzIHVzZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD50aGUgbmV3IHZhbHVlIGZvciB0aGUgdG9rZW4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGVtcHR5IHN0cmluZyAoPHE+PC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdW1tYXJ5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyB3aGV0aGVyIGEgc3VtbWFyeSBvZiB0aGUgcmVwbGFjZSBvcGVyYXRpb24gCi0gICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcHJvZHVjZWQsIGRldGFpbGluZyBob3cgbWFueSB0b2tlbiBvY2N1cnJlbmNlcyAKLSAgICAgICAgICAgICAgICAgICAgIGFuZCBmaWxlcyB3ZXJlIHByb2Nlc3NlZAotICAgICAgICAgICAgICAgICAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBieSBkZWZhdWx0IG5vIHN1bW1hcnkgaXMgcHJvZHVjZWQ8L3RkPgorICAgIDx0ZD5zdW1tYXJ5PC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgYSBzdW1tYXJ5IG9mIHRoZSByZXBsYWNlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHJvZHVjZWQsIGRldGFpbGluZyBob3cgbWFueQorICAgICAgdG9rZW4gb2NjdXJyZW5jZXMgYW5kIGZpbGVzIHdlcmUgcHJvY2Vzc2VkPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIG5vIHN1bW1hcnk8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eUZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWQgcHJvcGVydHkgZmlsZSBmcm9tIHdoaWNoIHByb3BlcnRpZXMgc3BlY2lmaWVkIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGVsZW1lbnRzIGFyZSBkcmF3bi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzIG9ubHkgaWYgPGk+cHJvcGVydHk8L2k+IGF0dHJpYnV0ZSBvZiA8Y29kZT4mbHQ7cmVwbGFjZWZpbHRlciZndDs8L2NvZGU+IGlzIHVzZWQuPC90ZD4KKyAgICA8dGQ+cHJvcGVydHlGaWxlPC90ZD4KKyAgICA8dGQ+dmFsaWQgcHJvcGVydHkgZmlsZSBmcm9tIHdoaWNoIHByb3BlcnRpZXMgc3BlY2lmaWVkIHVzaW5nCisgICAgICBuZXN0ZWQgPGNvZGU+Jmx0O3JlcGxhY2VmaWx0ZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgZHJhd24uPC90ZD4KKyAgICA8dGQ+WWVzLCBvbmx5IGlmIDx2YXI+cHJvcGVydHk8L3Zhcj4gYXR0cmlidXRlIG9mIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gaXMKKyAgICAgIHVzZWQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVwbGFjZWZpbHRlcmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsaWQgcHJvcGVydHkgZmlsZS4gIEVhY2ggcHJvcGVydHkgd2lsbCBiZQotICAgIHRyZWF0ZWQgYXMgYSByZXBsYWNlZmlsdGVyIHdoZXJlIDxjb2RlPnRva2VuPC9jb2RlPiBpcyB0aGUgbmFtZSBvZgotICAgIHRoZSBwcm9wZXJ0eSBhbmQgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIHRoZSBwcm9wZXJ0aWVzIHZhbHVlLgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+cmVwbGFjZWZpbHRlcmZpbGU8L3RkPgorICAgIDx0ZD52YWxpZCBwcm9wZXJ0eSBmaWxlLiAgRWFjaCBwcm9wZXJ0eSB3aWxsIGJlIHRyZWF0ZWQgYXMgYSA8Y29kZT5yZXBsYWNlZmlsdGVyPC9jb2RlPgorICAgICAgd2hlcmUgPHZhcj50b2tlbjwvdmFyPiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYW5kIDx2YXI+dmFsdWU8L3Zhcj4gaXMgdGhlIHByb3BlcnR5J3MKKyAgICAgIHZhbHVlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsICg8cT4qKjwvcT4pPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBleGNsdWRlcyBvciBub25lIGlmIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmVMYXN0TW9kaWZpZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+S2VlcCB0aGUgZmlsZSB0aW1lc3RhbXAocykgZXZlbiBpZiB0aGUgZmlsZShzKQotICAgICAgaXMoYXJlKSBtb2RpZmllZC4gIDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuOC4wLjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPnByZXNlcnZlTGFzdE1vZGlmaWVkPC90ZD4KKyAgICA8dGQ+S2VlcCB0aGUgZmlsZSB0aW1lc3RhbXAocykgZXZlbiBpZiB0aGUgZmlsZShzKSBpcyhhcmUpIG1vZGlmaWVkLiAgPGVtPnNpbmNlIEFwYWNoZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxPbk5vUmVwbGFjZW1lbnRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZmFpbCB0aGUgYnVpbGQgaWYgdGhlIHRhc2sgZGlkbid0IGRvCi0gICAgICBhbnl0aGluZy4gIDxlbT5zaW5jZSBBbnQgMS44LjAuPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQ+ZmFpbE9uTm9SZXBsYWNlbWVudHM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGZhaWwgdGhlIGJ1aWxkIGlmIHRoZSB0YXNrIGRpZG4ndCBkbyBhbnl0aGluZy4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtyZXBsYWNlIGZpbGU9JnF1b3Q7JHtzcmN9L2luZGV4Lmh0bWwmcXVvdDsgdG9rZW49JnF1b3Q7QEBAJnF1b3Q7IHZhbHVlPSZxdW90O3dvbWJhdCZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5yZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nICZxdW90O0BAQCZxdW90OyB3aXRoIHRoZSBzdHJpbmcKLSZxdW90O3dvbWJhdCZxdW90OywgaW4gdGhlIGZpbGUgPGNvZGU+JHtzcmN9L2luZGV4Lmh0bWw8L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O3JlcGxhY2UgZmlsZT0mcXVvdDske3NyY30vaW5kZXguaHRtbCZxdW90OyB0b2tlbj0mcXVvdDtAQEAmcXVvdDsgdmFsdWU9JnF1b3Q7d29tYmF0JnF1b3Q7LyZndDs8L3ByZT4KKzxwPnJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgPHE+QEBAPC9xPiB3aXRoIHRoZSBzdHJpbmcgPHE+d29tYmF0PC9xPiwgaW4gdGhlCitmaWxlIDxzYW1wPiR7c3JjfS9pbmRleC5odG1sPC9zYW1wPi48L3A+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAotc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gYXMgd2VsbCBhcyB0aGUKLW5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZAotPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci08cD5TaW5jZSBBbnQgMS44LjAgdGhpcyB0YXNrIHN1cHBvcnRzIGFueSBmaWxlc3lzdGVtCi0gIGJhc2VkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCi0gICAgY29sbGVjdGlvbnM8L2E+IGFzIG5lc3RlZCBlbGVtZW50cy48L3A+Cis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQgc3VwcG9ydHMgbW9zdAorYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGFzIHdlbGwgYXMgdGhlCituZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LCB0aGlzIHRhc2sgc3VwcG9ydHMgYW55IGZpbGVzeXN0ZW0KK2Jhc2VkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgogPGg0PnJlcGxhY2V0b2tlbiBhbmQgcmVwbGFjZXZhbHVlPC9oND4KLTxwPklmIGVpdGhlciB0aGUgdGV4dCB5b3Ugd2FudCB0byByZXBsYWNlIG9yIHRoZSByZXBsYWNlbWVudCB0ZXh0Ci1jcm9zcyBsaW5lIGJvdW5kYXJpZXMsIHlvdSBjYW4gdXNlIG5lc3RlZCBlbGVtZW50cyB0byBzcGVjaWZ5Ci10aGVtLjwvcD4KKzxwPklmIGVpdGhlciB0aGUgdGV4dCB5b3Ugd2FudCB0byByZXBsYWNlIG9yIHRoZSByZXBsYWNlbWVudCB0ZXh0IGNyb3NzIGxpbmUgYm91bmRhcmllcywgeW91IGNhbiB1c2UKK25lc3RlZCBlbGVtZW50cyB0byBzcGVjaWZ5IHRoZW0uPC9wPgogPHA+VGhlIGVsZW1lbnRzIHN1cHBvcnQgYXR0cmlidXRlczo8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cGFuZFByb3BlcnRpZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBleHBhbmQgcHJvcGVydGllcyBpbiB0aGUgbmVzdGVkIHRleHQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4wLjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQ+ZXhwYW5kUHJvcGVydGllczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gZXhwYW5kIHByb3BlcnRpZXMgaW4gdGhlIG5lc3RlZCB0ZXh0LiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3JlcGxhY2UgZGlyPSZxdW90OyR7c3JjfSZxdW90OyB2YWx1ZT0mcXVvdDt3b21iYXQmcXVvdDsmZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5odG1sJnF1b3Q7LyZndDsKICAgJmx0O3JlcGxhY2V0b2tlbiZndDsmbHQ7IVtDREFUQVttdWx0aSBsaW5lCiB0b2tlbl1dJmd0OyZsdDsvcmVwbGFjZXRva2VuJmd0OwotJmx0Oy9yZXBsYWNlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+cmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyAmcXVvdDttdWx0aQotbGluZTxpPlxuPC9pPnRva2VuJnF1b3Q7IHdpdGggdGhlIHN0cmluZyAmcXVvdDt3b21iYXQmcXVvdDssIGluIGFsbAotSFRNTCBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7c3JjfTwvY29kZT4uV2hlcmUgPGk+XG48L2k+IGlzCi10aGUgcGxhdGZvcm0gc3BlY2lmaWMgbGluZSBzZXBhcmF0b3IuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvcmVwbGFjZSZndDs8L3ByZT4KKzxwPnJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgPHE+bXVsdGkgbGluZTxpPlxuPC9pPnRva2VuPC9xPiB3aXRoIHRoZSBzdHJpbmcgPHE+d29tYmF0PC9xPiwKK2luIGFsbCBIVE1MIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgPHNhbXA+JHtzcmN9PC9zYW1wPi4gSGVyZSwgPHE+PGk+XG48L2k+PC9xPiBpcyB0aGUgcGxhdGZvcm0KK3NwZWNpZmljIGxpbmUgc2VwYXJhdG9yLjwvcD4KKzxwcmU+CiAmbHQ7cmVwbGFjZSBmaWxlPSZxdW90OyR7c3JjfS9pbmRleC5odG1sJnF1b3Q7Jmd0OwogICAmbHQ7cmVwbGFjZXRva2VuJmd0OyZsdDshW0NEQVRBW3R3byBsaW5lCiB0b2tlbl1dJmd0OyZsdDsvcmVwbGFjZXRva2VuJmd0OwogICAmbHQ7cmVwbGFjZXZhbHVlJmd0OyZsdDshW0NEQVRBW3R3byBsaW5lCiB0b2tlbl1dJmd0OyZsdDsvcmVwbGFjZXZhbHVlJmd0OwotJmx0Oy9yZXBsYWNlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9yZXBsYWNlJmd0OzwvcHJlPgogPGg0PnJlcGxhY2VmaWx0ZXI8L2g0PgotPHA+SW4gYWRkaXRpb24gdG8gYWxsb3dpbmcgZm9yIG11bHRpcGxlIHJlcGxhY2VtZW50cywgb3B0aW9uYWwgbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gZWxlbWVudHMgYWxsb3cgcmVwbGFjZW1lbnQgdmFsdWVzIHRvIGJlIGV4dHJhY3RlZCBmcm9tIGEgcHJvcGVydHkgZmlsZS4gVGhlIG5hbWUgb2YgdGhpcyBmaWxlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPGNvZGU+Jmx0O3JlcGxhY2UmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUgPGk+cHJvcGVydHlGaWxlPC9pPi4KLTwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5JbiBhZGRpdGlvbiB0byBhbGxvd2luZyBmb3IgbXVsdGlwbGUgcmVwbGFjZW1lbnRzLCBvcHRpb25hbAorbmVzdGVkIDxjb2RlPiZsdDtyZXBsYWNlZmlsdGVyJmd0OzwvY29kZT4gZWxlbWVudHMgYWxsb3cgcmVwbGFjZW1lbnQgdmFsdWVzIHRvIGJlIGV4dHJhY3RlZCBmcm9tIGEKK3Byb3BlcnR5IGZpbGUuIFRoZSBuYW1lIG9mIHRoaXMgZmlsZSBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIDxjb2RlPiZsdDtyZXBsYWNlJmd0OzwvY29kZT4KK2F0dHJpYnV0ZSA8dmFyPnByb3BlcnR5RmlsZTwvdmFyPi48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9rZW48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMgdW5sZXNzIGEgbmVzdGVkIHJlcGxhY2V0b2tlbgorICAgIDx0ZD50b2tlbjwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBhIG5lc3RlZCA8Y29kZT5yZXBsYWNldG9rZW48L2NvZGU+CiAgICAgICBpcyBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVwbGFjZW1lbnQgc3RyaW5nLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkVpdGhlciBtYXkgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguIEJvdGggY2FuIGJlIG9taXR0ZWQsIGlmIGRlc2lyZWQuPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgcmVwbGFjZW1lbnQgc3RyaW5nLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkVpdGhlciBtYXkgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguIEJvdGggY2FuIGJlIG9taXR0ZWQsIGlmIGRlc2lyZWQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgdG8gc2VydmUgYXMgdGhlIHJlcGxhY2VtZW50IHZhbHVlLjwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPk5hbWUgb2YgdGhlIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHRvIHNlcnZlIGFzIHRoZSByZXBsYWNlbWVudCB2YWx1ZS48L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxwPlNpbmNlIEFudCAxLjguMCB0b2tlbiBhbmQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHMKLSAganVzdCBsaWtlIGluIHRoZSB0YXNrIGl0c2VsZi48L3A+Ci08cD5JZiBuZWl0aGVyIDxpPnZhbHVlPC9pPiBub3IgPGk+cHJvcGVydHk8L2k+IGlzIHVzZWQsIHRoZSB2YWx1ZSBwcm92aWRlZCB1c2luZyB0aGUgPGNvZGU+Jmx0O3JlcGxhY2UmZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUgPGk+dmFsdWU8L2k+IGFuZC9vciB0aGUgPGNvZGU+Jmx0O3JlcGxhY2V2YWx1ZSZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZC4gSWYgbm8gdmFsdWUgd2FzIHNwZWNpZmllZCB1c2luZyBlaXRoZXIgb2YgdGhlc2Ugb3B0aW9ucywgdGhlIHRva2VuIGlzIHJlcGxhY2VkIHdpdGggYW4gZW1wdHkgc3RyaW5nLgotPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LCA8dmFyPnRva2VuPC92YXI+IGFuZCA8dmFyPnZhbHVlPC92YXI+IGNhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkCitlbGVtZW50cyBqdXN0IGxpa2UgaW4gdGhlIHRhc2sgaXRzZWxmLjwvcD4KKzxwPklmIG5laXRoZXIgPHZhcj52YWx1ZTwvdmFyPiBub3IgPHZhcj5wcm9wZXJ0eTwvdmFyPiBpcyB1c2VkLCB0aGUgdmFsdWUgcHJvdmlkZWQgdXNpbmcKK3RoZSA8Y29kZT4mbHQ7cmVwbGFjZSZndDs8L2NvZGU+IGF0dHJpYnV0ZSA8dmFyPnZhbHVlPC92YXI+IGFuZC9vcgordGhlIDxjb2RlPiZsdDtyZXBsYWNldmFsdWUmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQuIElmIG5vIHZhbHVlIHdhcyBzcGVjaWZpZWQgdXNpbmcgZWl0aGVyIG9mCit0aGVzZSBvcHRpb25zLCB0aGUgdG9rZW4gaXMgcmVwbGFjZWQgd2l0aCBhbiBlbXB0eSBzdHJpbmcuPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7cmVwbGFjZSAKLSAgICBmaWxlPSZxdW90O2NvbmZpZ3VyZS5zaCZxdW90OwotICAgIHZhbHVlPSZxdW90O2RlZmF1bHR2YWx1ZSZxdW90OwotICAgIHByb3BlcnR5RmlsZT0mcXVvdDtzcmMvbmFtZS5wcm9wZXJ0aWVzJnF1b3Q7Jmd0OwotICAmbHQ7cmVwbGFjZWZpbHRlciAKLSAgICB0b2tlbj0mcXVvdDtAdG9rZW4xQCZxdW90Oy8mZ3Q7Ci0gICZsdDtyZXBsYWNlZmlsdGVyIAotICAgIHRva2VuPSZxdW90O0B0b2tlbjJAJnF1b3Q7IAotICAgIHZhbHVlPSZxdW90O3ZhbHVlMiZxdW90Oy8mZ3Q7Ci0gICZsdDtyZXBsYWNlZmlsdGVyIAotICAgIHRva2VuPSZxdW90O0B0b2tlbjNAJnF1b3Q7IAotICAgIHByb3BlcnR5PSZxdW90O3Byb3BlcnR5LmtleSZxdW90Oy8mZ3Q7Cis8cD5JbiBmaWxlIDxzYW1wPmNvbmZpZ3VyZS5zaDwvc2FtcD4sIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiA8cT5AdG9rZW4xQDwvcT4KK3dpdGggPHE+ZGVmYXVsdHZhbHVlPC9xPiwgYWxsIGluc3RhbmNlcyBvZiA8cT5AdG9rZW4yQDwvcT4gd2l0aCA8cT52YWx1ZTI8L3E+LCBhbmQgYWxsIGluc3RhbmNlcworb2YgPHE+QHRva2VuM0A8L3E+IHdpdGggdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSA8Y29kZT5wcm9wZXJ0eS5rZXk8L2NvZGU+LCBhcyBpdCBhcHBlYXJzIGluCitwcm9wZXJ0eSBmaWxlIDxzYW1wPnNyYy9uYW1lLnByb3BlcnRpZXM8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7cmVwbGFjZSBmaWxlPSZxdW90O2NvbmZpZ3VyZS5zaCZxdW90OworICAgICAgICAgdmFsdWU9JnF1b3Q7ZGVmYXVsdHZhbHVlJnF1b3Q7CisgICAgICAgICBwcm9wZXJ0eUZpbGU9JnF1b3Q7c3JjL25hbWUucHJvcGVydGllcyZxdW90OyZndDsKKyAgJmx0O3JlcGxhY2VmaWx0ZXIgdG9rZW49JnF1b3Q7QHRva2VuMUAmcXVvdDsvJmd0OworICAmbHQ7cmVwbGFjZWZpbHRlciB0b2tlbj0mcXVvdDtAdG9rZW4yQCZxdW90OworICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDt2YWx1ZTImcXVvdDsvJmd0OworICAmbHQ7cmVwbGFjZWZpbHRlciB0b2tlbj0mcXVvdDtAdG9rZW4zQCZxdW90OworICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0mcXVvdDtwcm9wZXJ0eS5rZXkmcXVvdDsvJmd0OwogICAmbHQ7cmVwbGFjZWZpbHRlciZndDsKLSAgICAmbHQ7cmVwbGFjZXRva2VuJmd0O0B0b2tlbjRAJmx0Oy9yZXBsYWNldG9rZW4mZ3Q7IAorICAgICZsdDtyZXBsYWNldG9rZW4mZ3Q7QHRva2VuNEAmbHQ7L3JlcGxhY2V0b2tlbiZndDsKICAgICAmbHQ7cmVwbGFjZXZhbHVlJmd0O3ZhbHVlNCZsdDsvcmVwbGFjZXZhbHVlJmd0OwogICAmbHQ7L3JlcGxhY2VmaWx0ZXImZ3Q7Ci0mbHQ7L3JlcGxhY2UmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5JbiBmaWxlIDxjb2RlPmNvbmZpZ3VyZS5zaDwvY29kZT4sIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAmcXVvdDtAdG9rZW4xQCZxdW90OyB3aXRoICZxdW90O2RlZmF1bHR2YWx1ZSZxdW90OywgYWxsIGluc3RhbmNlcyBvZiAmcXVvdDtAdG9rZW4yQCZxdW90OyB3aXRoICZxdW90O3ZhbHVlMiZxdW90OywgYW5kIGFsbCBpbnN0YW5jZXMgb2YgJnF1b3Q7QHRva2VuM0AmcXVvdDsgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5ICZxdW90O3Byb3BlcnR5LmtleSZxdW90OywgYXMgaXQgYXBwZWFycyBpbiBwcm9wZXJ0eSBmaWxlIDxjb2RlPnNyYy9uYW1lLnByb3BlcnRpZXM8L2NvZGU+LjwvcD4KLTxwPjxiPk5vdGU6PC9iPiBJdCBpcyBwb3NzaWJsZSB0byB1c2UgZWl0aGVyIHRoZSA8aT50b2tlbjwvaT4vPGNvZGU+Jmx0O3JlcGxhY2V0b2tlbiZndDs8L2NvZGU+IGFuZCA8aT52YWx1ZTwvaT4vPGNvZGU+Jmx0O3JlcGxhY2V2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMvZWxlbWVudHMsIHRoZSBuZXN0ZWQgcmVwbGFjZWZpbHRlciBlbGVtZW50cywgb3IgYm90aCBpbiB0aGUgc2FtZSBvcGVyYXRpb24uCi08L3A+Ci0KKyZsdDsvcmVwbGFjZSZndDs8L3ByZT4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogSXQgaXMgcG9zc2libGUgdG8gdXNlIGVpdGhlcgordGhlIDx2YXI+dG9rZW48L3Zhcj4vPGNvZGU+Jmx0O3JlcGxhY2V0b2tlbiZndDs8L2NvZGU+CithbmQgPHZhcj52YWx1ZTwvdmFyPi88Y29kZT4mbHQ7cmVwbGFjZXZhbHVlJmd0OzwvY29kZT4gYXR0cmlidXRlcy9lbGVtZW50cywgdGhlCituZXN0ZWQgPGNvZGU+cmVwbGFjZWZpbHRlcjwvY29kZT4gZWxlbWVudHMsIG9yIGJvdGggaW4gdGhlIHNhbWUgb3BlcmF0aW9uLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIGIvbWFudWFsL1Rhc2tzL3JlcGxhY2VyZWdleHAuaHRtbAppbmRleCA3YTA5MWRlLi41MDc3ZmJjIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyMCArMTUsMTggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJlcGxhY2VSZWdFeHAgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InJlcGxhY2VyZWdleHAiPlJlcGxhY2VSZWdFeHA8L2E+PC9oMj4KKzxoMiBpZD0icmVwbGFjZXJlZ2V4cCI+UmVwbGFjZVJlZ0V4cDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+UmVwbGFjZVJlZ0V4cCBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrIGZvciByZXBsYWNpbmcgdGhlCi1vY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBzdWJzdGl0dXRpb24gcGF0dGVybgotaW4gYSBzZWxlY3RlZCBmaWxlIG9yIHNldCBvZiBmaWxlcy48L3A+Cis8cD48Y29kZT5SZXBsYWNlUmVnRXhwPC9jb2RlPiBpcyBhIGRpcmVjdG9yeSBiYXNlZCB0YXNrIGZvciByZXBsYWNpbmcgdGhlIG9jY3VycmVuY2Ugb2YgYSBnaXZlbgorcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBzdWJzdGl0dXRpb24gcGF0dGVybiBpbiBhIHNlbGVjdGVkIGZpbGUgb3Igc2V0IG9mIGZpbGVzLjwvcD4KIAogPHA+VGhlIG91dHB1dCBmaWxlIGlzIG9ubHkgd3JpdHRlbiBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIGV4aXN0aW5nCiBmaWxlLiAgVGhpcyBwcmV2ZW50cyBzcHVyaW91cyByZWJ1aWxkcyBiYXNlZCBvbiB1bmNoYW5nZWQgZmlsZXMgd2hpY2gKQEAgLTM2LDY1ICszNSw2NSBAQAogc291cmNlIGZpbGUgaW5zaWRlIG9mIHRoZSA8YSBocmVmPSIuLi9ydW5uaW5nLmh0bWwjdG1wZGlyIj50ZW1wb3JhcnkKIGRpcmVjdG9yeTwvYT4uPC9wPgogCi08cD5TaW1pbGFyIHRvIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sI3JlZ2V4cC1tYXBwZXIiPnJlZ2V4cAotdHlwZSBtYXBwZXJzPC9hPiB0aGlzIHRhc2sgbmVlZHMgYSBzdXBwb3J0aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbgotbGlicmFyeSBhbmQgYW4gaW1wbGVtZW50YXRpb24gb2YKLTxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cDwvY29kZT4uCi1TZWUgZGV0YWlscyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgPGEgaHJlZj0iLi4vVHlwZXMvcmVnZXhwLmh0bWwjaW1wbGVtZW50YXRpb24iPlJlZ2V4cCBUeXBlPC9hPi4gPC9wPgorPHA+U2ltaWxhciB0byA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNyZWdleHAtbWFwcGVyIj5yZWdleHAgdHlwZSBtYXBwZXJzPC9hPiB0aGlzIHRhc2sgbmVlZHMgYQorc3VwcG9ydGluZyByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeSBhbmQgYW4gaW1wbGVtZW50YXRpb24KK29mIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHA8L2NvZGU+LiAgU2VlIGRldGFpbHMgaW4gdGhlCitkb2N1bWVudGF0aW9uIG9mIHRoZSA8YSBocmVmPSIuLi9UeXBlcy9yZWdleHAuaHRtbCNpbXBsZW1lbnRhdGlvbiI+UmVnZXhwIFR5cGU8L2E+LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPlllcyBpZiBubyBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyB1c2VkPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPmZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkLjwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGlzIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXRjaDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIGZpbGUocyk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ZZXMsIGlmIG5vIG5lc3RlZCA8Y29kZT4mbHQ7cmVnZXhwJmd0OzwvY29kZT4gaXMgdXNlZDwvdGQ+CisgICAgPHRkPm1hdGNoPC90ZD4KKyAgICA8dGQ+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGluIHRoZSBmaWxlKHMpPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgbmVzdGVkIDxjb2RlPiZsdDtyZWdleHAmZ3Q7PC9jb2RlPiBpcyB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVwbGFjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcGxhY2UgaW4gdGhlIGZpbGUocykgaW4gcGxhY2UKLSAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+WWVzLCBpZiBubyBuZXN0ZWQgPGNvZGU+Jmx0O3N1YnN0aXR1dGlvbiZndDs8L2NvZGU+IGlzIHVzZWQ8L3RkPgorICAgIDx0ZD5yZXBsYWNlPC90ZD4KKyAgICA8dGQ+VGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIHRvIHBsYWNlIGluIHRoZSBmaWxlKHMpIGluIHBsYWNlIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgbmVzdGVkIDxjb2RlPiZsdDtzdWJzdGl0dXRpb24mZ3Q7PC9jb2RlPiBpcyB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmxhZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZsYWdzIHRvIHVzZSB3aGVuIG1hdGNoaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uICBGb3IgbW9yZQotICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24sIGNvbnN1bHQgdGhlIFBlcmw1IHN5bnRheDxicj4KLSAgICAgICAgICAgICAgICAgICAgIGcgOiBHbG9iYWwgcmVwbGFjZW1lbnQuICBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBmb3VuZDxicj4KLSAgICAgICAgICAgICAgICAgICAgIGkgOiBDYXNlIEluc2Vuc2l0aXZlLiAgRG8gbm90IGNvbnNpZGVyIGNhc2UgaW4gdGhlIG1hdGNoPGJyPgotICAgICAgICAgICAgICAgICAgICAgbSA6IE11bHRpbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgbXVsdGlwbGUgbGluZXMgb2YgaW5wdXQsIHVzaW5nICJeIiBhbmQgIiQiIGFzIHRoZSBzdGFydCBvciBlbmQgb2YgYW55IGxpbmUsIHJlc3BlY3RpdmVseSwgcmF0aGVyIHRoYW4gc3RhcnQgb3IgZW5kIG9mIHN0cmluZy48YnI+Ci0gICAgICAgICAgICAgICAgICAgICBzIDogU2luZ2xlbGluZS4gIFRyZWF0IHRoZSBzdHJpbmcgYXMgYSBzaW5nbGUgbGluZSBvZiBpbnB1dCwgdXNpbmcgIi4iIHRvIG1hdGNoIGFueSBjaGFyYWN0ZXIsIGluY2x1ZGluZyBhIG5ld2xpbmUsIHdoaWNoIG5vcm1hbGx5LCBpdCB3b3VsZCBub3QgbWF0Y2guPGJyPgorICAgIDx0ZD5mbGFnczwvdGQ+CisgICAgPHRkPlRoZSBmbGFncyB0byB1c2Ugd2hlbiBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIGNvbnN1bHQgdGhlCisgICAgICBQZXJsIDUgc3ludGF4PGJyLz4KKyAgICAgIDxxPmc8L3E+IDogR2xvYmFsIHJlcGxhY2VtZW50LiAgUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgZm91bmQ8YnIvPgorICAgICAgPHE+aTwvcT4gOiBDYXNlIEluc2Vuc2l0aXZlLiAgRG8gbm90IGNvbnNpZGVyIGNhc2UgaW4gdGhlIG1hdGNoPGJyLz4KKyAgICAgIDxxPm08L3E+IDogTXVsdGlsaW5lLiAgVHJlYXQgdGhlIHN0cmluZyBhcyBtdWx0aXBsZSBsaW5lcyBvZiBpbnB1dCwgdXNpbmcgPHE+XjwvcT4KKyAgICAgIGFuZCA8cT4kPC9xPiBhcyB0aGUgc3RhcnQgb3IgZW5kIG9mIGFueSBsaW5lLCByZXNwZWN0aXZlbHksIHJhdGhlciB0aGFuIHN0YXJ0IG9yIGVuZCBvZgorICAgICAgc3RyaW5nLjxici8+CisgICAgICA8cT5zPC9xPiA6IFNpbmdsZWxpbmUuICBUcmVhdCB0aGUgc3RyaW5nIGFzIGEgc2luZ2xlIGxpbmUgb2YgaW5wdXQsIHVzaW5nIDxxPi48L3E+IHRvIG1hdGNoCisgICAgICBhbnkgY2hhcmFjdGVyLCBpbmNsdWRpbmcgYSBuZXdsaW5lLCB3aGljaCBub3JtYWxseSwgaXQgd291bGQgbm90IG1hdGNoLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YnlsaW5lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlByb2Nlc3MgdGhlIGZpbGUocykgb25lIGxpbmUgYXQgYSB0aW1lLCBleGVjdXRpbmcgdGhlIHJlcGxhY2VtZW50Ci0gICAgICAgICAgICAgICAgICAgICBvbiBvbmUgbGluZSBhdCBhIHRpbWUgKDxpPnRydWUvZmFsc2U8L2k+KS4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdQotICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBvbmx5IHJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSByZWd1bGFyIGV4cHJlc3Npb24gb24KLSAgICAgICAgICAgICAgICAgICAgIGVhY2ggbGluZSwgd2hpY2ggaXMgbm90IGVhc3kgdG8gZG8gd2hlbiBwcm9jZXNzaW5nIHRoZSBmaWxlIGFzIGEgd2hvbGUuCi0gICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byA8aT5mYWxzZTwvaT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YnlsaW5lPC90ZD4KKyAgICA8dGQ+UHJvY2VzcyB0aGUgZmlsZShzKSBvbmUgbGluZSBhdCBhIHRpbWUsIGV4ZWN1dGluZyB0aGUgcmVwbGFjZW1lbnQgb24gb25lIGxpbmUgYXQgYSB0aW1lCisgICAgICAoPHE+dHJ1ZXxmYWxzZTwvcT4pLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gb25seSByZXBsYWNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEKKyAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiBlYWNoIGxpbmUsIHdoaWNoIGlzIG5vdCBlYXN5IHRvIGRvIHdoZW4gcHJvY2Vzc2luZyB0aGUgZmlsZSBhcyBhCisgICAgICB3aG9sZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlLiA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZS4gPGVtPnNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmVMYXN0TW9kaWZpZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+S2VlcCB0aGUgZmlsZSB0aW1lc3RhbXAocykgZXZlbiBpZiB0aGUgZmlsZShzKQotICAgICAgaXMoYXJlKSBtb2RpZmllZC4gIDxlbT5zaW5jZSBBbnQgMS44LjAuPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQ+cHJlc2VydmVMYXN0TW9kaWZpZWQ8L3RkPgorICAgIDx0ZD5LZWVwIHRoZSBmaWxlIHRpbWVzdGFtcChzKSBldmVuIGlmIHRoZSBmaWxlKHMpIGlzKGFyZSkgbW9kaWZpZWQuICA8ZW0+c2luY2UgQW50CisgICAgICAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5FeGFtcGxlczwvaDM+CkBAIC0xMDIsMTA3ICsxMDEsNzkgQEAKICZsdDtyZXBsYWNlcmVnZXhwIGZpbGU9JnF1b3Q7JHtzcmN9L2J1aWxkLnByb3BlcnRpZXMmcXVvdDsKICAgICAgICAgICAgICAgIG1hdGNoPSZxdW90O09sZFByb3BlcnR5PSguKikmcXVvdDsKICAgICAgICAgICAgICAgIHJlcGxhY2U9JnF1b3Q7TmV3UHJvcGVydHk9XDEmcXVvdDsKLSAgICAgICAgICAgICAgIGJ5bGluZT0mcXVvdDt0cnVlJnF1b3Q7Ci0vJmd0OwotPC9wcmU+Ci08cD5yZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiB0aGUgcHJvcGVydHkgbmFtZSAmcXVvdDtPbGRQcm9wZXJ0eSZxdW90OwotIHdpdGggJnF1b3Q7TmV3UHJvcGVydHkmcXVvdDsgaW4gYSBwcm9wZXJ0aWVzIGZpbGUsIHByZXNlcnZpbmcgdGhlIGV4aXN0aW5nCi12YWx1ZSwgaW4gdGhlIGZpbGUgPGNvZGU+JHtzcmN9L2J1aWxkLnByb3BlcnRpZXM8L2NvZGU+PC9wPgorICAgICAgICAgICAgICAgYnlsaW5lPSZxdW90O3RydWUmcXVvdDsvJmd0OzwvcHJlPgorPHA+cmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHByb3BlcnR5IG5hbWUgPHE+T2xkUHJvcGVydHk8L3E+IHdpdGggPHE+TmV3UHJvcGVydHk8L3E+IGluIGEKK3Byb3BlcnRpZXMgZmlsZSwgcHJlc2VydmluZyB0aGUgZXhpc3RpbmcgdmFsdWUsIGluIHRoZSBmaWxlIDxzYW1wPiR7c3JjfS9idWlsZC5wcm9wZXJ0aWVzPC9zYW1wPjwvcD4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci08cD5UaGlzIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPgotICAgZWxlbWVudC48L3A+Ci08cD5TaW5jZSBBbnQgMS44LjAgdGhpcyB0YXNrIHN1cHBvcnRzIGFueSBmaWxlc3lzdGVtCi0gIGJhc2VkIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCi0gICAgY29sbGVjdGlvbnM8L2E+IGFzIG5lc3RlZCBlbGVtZW50cy48L3A+Ci08cD5UaGlzIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGk+PGEgaHJlZj0iLi4vVHlwZXMvcmVnZXhwLmh0bWwiPlJlZ2V4cDwvYT48L2k+IGVsZW1lbnQgdG8gc3BlY2lmeQotICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIFlvdSBjYW4gdXNlIHRoaXMgZWxlbWVudCB0byByZWZlciB0byBhIHByZXZpb3VzbHkKLSAgIGRlZmluZWQgcmVndWxhciBleHByZXNzaW9uIGRhdGF0eXBlIGluc3RhbmNlLjwvcD4KLTxibG9ja3F1b3RlPgotICAgICAmbHQ7cmVnZXhwIGlkPSJpZCIgcGF0dGVybj0iYWxwaGEoLispYmV0YSIvJmd0Ozxicj4KLSAgICAgJmx0O3JlZ2V4cCByZWZpZD0iaWQiLyZndDsKLTwvYmxvY2txdW90ZT4KLTxwPlRoaXMgdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8aT5TdWJzdGl0dXRpb248L2k+IGVsZW1lbnQgdG8gc3BlY2lmeQotICAgdGhlIHN1YnN0aXR1dGlvbiBwYXR0ZXJuLiAgWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseQotICAgZGVmaW5lZCBzdWJzdGl0dXRpb24gcGF0dGVybiBkYXRhdHlwZSBpbnN0YW5jZS48L3A+Ci08YmxvY2txdW90ZT4KLSAgICAgJmx0O3N1YnN0aXR1dGlvbiBpZD0iaWQiIGV4cHJlc3Npb249ImJldGFcMWFscGhhIi8mZ3Q7PGJyPgotICAgICAmbHQ7c3Vic3RpdHV0aW9uIHJlZmlkPSJpZCIvJmd0OwotPC9ibG9ja3F1b3RlPgorPHA+VGhpcyB0YXNrIHN1cHBvcnRzIGEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gZWxlbWVudC48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4sIHRoaXMgdGFzayBzdXBwb3J0cyBhbnkgZmlsZXN5c3RlbQorYmFzZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFzIG5lc3RlZCBlbGVtZW50cy48L3A+Cis8cD5UaGlzIHRhc2sgc3VwcG9ydHMgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVnZXhwLmh0bWwiPlJlZ2V4cDwvYT4gZWxlbWVudCB0byBzcGVjaWZ5IHRoZQorcmVndWxhciBleHByZXNzaW9uLiAgWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHJlZ3VsYXIgZXhwcmVzc2lvbgorZGF0YXR5cGUgaW5zdGFuY2UuPC9wPgogCis8cHJlPgorJmx0O3JlZ2V4cCBpZD0iaWQiIHBhdHRlcm49ImFscGhhKC4rKWJldGEiLyZndDsKKyZsdDtyZWdleHAgcmVmaWQ9ImlkIi8mZ3Q7PC9wcmU+CisKKzxwPlRoaXMgdGFzayBzdXBwb3J0cyBhIG5lc3RlZCA8Y29kZT5zdWJzdGl0dXRpb248L2NvZGU+IGVsZW1lbnQgdG8gc3BlY2lmeSB0aGUgc3Vic3RpdHV0aW9uCitwYXR0ZXJuLiAgWW91IGNhbiB1c2UgdGhpcyBlbGVtZW50IHRvIHJlZmVyIHRvIGEgcHJldmlvdXNseSBkZWZpbmVkIHN1YnN0aXR1dGlvbiBwYXR0ZXJuIGRhdGF0eXBlCitpbnN0YW5jZS48L3A+CisKKzxwcmU+CismbHQ7c3Vic3RpdHV0aW9uIGlkPSJpZCIgZXhwcmVzc2lvbj0iYmV0YVwxYWxwaGEiLyZndDs8YnIvPgorJmx0O3N1YnN0aXR1dGlvbiByZWZpZD0iaWQiLyZndDs8L3ByZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Cis8cD5SZXBsYWNlIG9jY3VycmVuY2VzIG9mIHRoZSBwcm9wZXJ0eSBuYW1lIDxxPk9sZFByb3BlcnR5PC9xPiB3aXRoIDxxPk5ld1Byb3BlcnR5PC9xPiBpbiBhCitwcm9wZXJ0aWVzIGZpbGUsIHByZXNlcnZpbmcgdGhlIGV4aXN0aW5nIHZhbHVlLCBpbiBhbGwgZmlsZXMgZW5kaW5nIGluIDxzYW1wPi5wcm9wZXJ0aWVzPC9zYW1wPiBpbgordGhlIGN1cnJlbnQgZGlyZWN0b3J5OjwvcD4KKzxwcmU+CiAmbHQ7cmVwbGFjZXJlZ2V4cCBieWxpbmU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKLSAgJmx0O3JlZ2V4cCBwYXR0ZXJuPSZxdW90O09sZFByb3BlcnR5PSguKikmcXVvdDsvJmd0OwotICAmbHQ7c3Vic3RpdHV0aW9uIGV4cHJlc3Npb249JnF1b3Q7TmV3UHJvcGVydHk9XDEmcXVvdDsvJmd0OwotICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyZndDsKLSAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoucHJvcGVydGllcyZxdW90Oy8mZ3Q7Ci0gICZsdDsvZmlsZXNldCZndDsKLSZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIHRoZSBwcm9wZXJ0eSBuYW1lICZxdW90O09sZFByb3BlcnR5JnF1b3Q7Ci0gd2l0aCAmcXVvdDtOZXdQcm9wZXJ0eSZxdW90OyBpbiBhIHByb3BlcnRpZXMgZmlsZSwgcHJlc2VydmluZyB0aGUgZXhpc3RpbmcKLXZhbHVlLCBpbiBhbGwgZmlsZXMgZW5kaW5nIGluIDxjb2RlPi5wcm9wZXJ0aWVzPC9jb2RlPiBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnk8L3A+CisgICAgJmx0O3JlZ2V4cCBwYXR0ZXJuPSZxdW90O09sZFByb3BlcnR5PSguKikmcXVvdDsvJmd0OworICAgICZsdDtzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0mcXVvdDtOZXdQcm9wZXJ0eT1cMSZxdW90Oy8mZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7Ki5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L3JlcGxhY2VyZWdleHAmZ3Q7PC9wcmU+CiAKLTxicj4KLTxibG9ja3F1b3RlPgotPHByZT4mbHQ7cmVwbGFjZXJlZ2V4cCBtYXRjaD0iXHMrIiByZXBsYWNlPSIgIiBmbGFncz0iZyIgYnlsaW5lPSJ0cnVlIiZndDsKKzxwPlJlcGxhY2UgYWxsIHdoaXRlc3BhY2VzIChibGFua3MsIHRhYnMsIGV0YykgYnkgb25lIGJsYW5rIHJlbWFpbmluZyB0aGUgbGluZSBzZXBhcmF0b3I6PC9wPgorPHByZT4KKyZsdDtyZXBsYWNlcmVnZXhwIG1hdGNoPSJccysiIHJlcGxhY2U9IiAiIGZsYWdzPSJnIiBieWxpbmU9InRydWUiJmd0OwogICAgICZsdDtmaWxlc2V0IGRpcj0iJHtodG1sLmRpcn0iIGluY2x1ZGVzPSIqKi8qLmh0bWwiLyZndDsKLSZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnJlcGxhY2VzIGFsbCB3aGl0ZXNwYWNlcyAoYmxhbmtzLCB0YWJzLCBldGMpIGJ5IG9uZSBibGFuayByZW1haW5pbmcgdGhlCi1saW5lIHNlcGFyYXRvci4gU28gd2l0aCBpbnB1dAotPGJsb2NrcXVvdGU+CismbHQ7L3JlcGxhY2VyZWdleHAmZ3Q7PC9wcmU+Cis8cD5UaGVuLCBpbnB1dDwvcD4KIDxwcmU+CiAmbHQ7aHRtbCZndDsgICAgJmx0O2JvZHkmZ3Q7Ci0mbHQ7Jmx0O1RBQiZndDsmZ3Q7Jmx0O2gxJmd0OyAgICBUIEUgUyBUICAgJmx0Oy9oMSZndDsgICZsdDsmbHQ7VEFCJmd0OyZndDsgICAgCi0mbHQ7Jmx0O1RBQiZndDsmZ3Q7ICZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci13b3VsZCBjb252ZXJ0ZWQgdG8KLTxibG9ja3F1b3RlPgorJmx0OyZsdDtUQUImZ3Q7Jmd0OyZsdDtoMSZndDsgICAgVCBFIFMgVCAgICZsdDsvaDEmZ3Q7ICAmbHQ7Jmx0O1RBQiZndDsmZ3Q7CismbHQ7Jmx0O1RBQiZndDsmZ3Q7ICZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7PC9wcmU+Cis8cD5pcyBjb252ZXJ0ZWQgdG88L3A+CiA8cHJlPgogJmx0O2h0bWwmZ3Q7ICZsdDtib2R5Jmd0OwotICZsdDtoMSZndDsgVCBFIFMgVCAmbHQ7L2gxJmd0OyAmbHQ7L2JvZHkmZ3Q7Jmx0Oy9odG1sJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08L3A+CisgJmx0O2gxJmd0OyBUIEUgUyBUICZsdDsvaDEmZ3Q7ICZsdDsvYm9keSZndDsmbHQ7L2h0bWwmZ3Q7PC9wcmU+CiAKLTxicj48IS0tIHNtYWxsIGRpc3RhbmNlIGZyb20gY29kZSBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZSAtLT4KLTxibG9ja3F1b3RlPgotPHByZT4mbHQ7cmVwbGFjZXJlZ2V4cCBtYXRjaD0iXFxuIiByZXBsYWNlPSIke2xpbmUuc2VwYXJhdG9yfSIgZmxhZ3M9ImciIGJ5bGluZT0idHJ1ZSImZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpcn0iLyZndDsKLSZsdDsvcmVwbGFjZXJlZ2V4cCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPnJlcGxhY2VzIGFsbCA8dHQ+XG48L3R0PiBtYXJrZXJzIChiZXdhcmUgdGhlIHF1b3Rpbmcgb2YgdGhlIGJhY2tzbGFzaCkgYnkgYSBsaW5lIGJyZWFrLgotU28gd2l0aCBpbnB1dAotPGJsb2NrcXVvdGU+Cis8cD5UaGUgdGFzazwvcD4KIDxwcmU+Ci1vbmVcbnR3b1xudGhyZWUKLTwvcHJlPjwvYmxvY2txdW90ZT4KLXdvdWxkIGNvbnZlcnRlZCB0bwotPGJsb2NrcXVvdGU+CismbHQ7cmVwbGFjZXJlZ2V4cCBtYXRjaD0iXFxuIiByZXBsYWNlPSIke2xpbmUuc2VwYXJhdG9yfSIgZmxhZ3M9ImciIGJ5bGluZT0idHJ1ZSImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpcn0iLyZndDsKKyZsdDsvcmVwbGFjZXJlZ2V4cCZndDs8L3ByZT4KKzxwPnJlcGxhY2VzIGFsbCA8cT5cbjwvcT4gbWFya2VycyAoYmV3YXJlIHRoZSBxdW90aW5nIG9mIHRoZSBiYWNrc2xhc2gpIGJ5IGEgbGluZSBicmVhay4gVGhlbiwKK2lucHV0PC9wPgorPHByZT5vbmVcbnR3b1xudGhyZWU8L3ByZT4KKzxwPmlzIGNvbnZlcnRlZCB0bzwvcD4KIDxwcmU+CiBvbmUKIHR3bwotdGhyZWUKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotQmV3YXJlIHRoYXQgaW5zZXJ0aW5nIGxpbmUgYnJlYWtzIGNvdWxkIGJyZWFrIGZpbGUgc3ludGF4LiBGb3IgZXhhbXBsZSBpbiB4bWw6Ci08YmxvY2txdW90ZT4KK3RocmVlPC9wcmU+CisKKzxwPkJld2FyZSB0aGF0IGluc2VydGluZyBsaW5lIGJyZWFrcyBjb3VsZCBicmVhayBmaWxlIHN5bnRheC4gRm9yIGV4YW1wbGUgaW4gWE1MOjwvcD4KIDxwcmU+CiAmbHQ7cm9vdCZndDsKLSAgJmx0O3RleHQmZ3Q7bGluZSBicmVha3MgXG4gc2hvdWxkIHdvcmsgaW4gdGV4dCZsdDsvdGV4dCZndDsKLSAgJmx0O2F0dHJpYnV0ZSB2YWx1ZT0mcXVvdDtidXQgYnJlYWtzIFxuIGF0dHJpYnV0ZXMmcXVvdDsgLyZndDsKLSZsdDsvcm9vdCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPC9wPgotCi0KKyAgICAmbHQ7dGV4dCZndDtsaW5lIGJyZWFrcyBcbiBzaG91bGQgd29yayBpbiB0ZXh0Jmx0Oy90ZXh0Jmd0OworICAgICZsdDthdHRyaWJ1dGUgdmFsdWU9JnF1b3Q7YnV0IGJyZWFrcyBcbiBhdHRyaWJ1dGVzJnF1b3Q7LyZndDsKKyZsdDsvcm9vdCZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvcmVzb3VyY2Vjb3VudC5odG1sIGIvbWFudWFsL1Rhc2tzL3Jlc291cmNlY291bnQuaHRtbAppbmRleCBhMzQ1MDZiLi4wNGM1NzgxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcmVzb3VyY2Vjb3VudC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9yZXNvdXJjZWNvdW50Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UmVzb3VyY2VDb3VudCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDYxICsyNSw2NCBAQAogPGJvZHk+CiAKIDxoMj5SZXNvdXJjZUNvdW50PC9oMj4KLQorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+RGlzcGxheSBvciBzZXQgYSBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBzaXplIG9mIGEgbmVzdGVkCi0gICA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPi4KLSAgIENhbiBhbHNvIGJlIHVzZWQgYXMgYSBjb25kaXRpb24uIDxiPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9iPjwvcD4KKzxwPkRpc3BsYXkgb3Igc2V0IGEgcHJvcGVydHkgY29udGFpbmluZyB0aGUgc2l6ZSBvZiBhCituZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT4uICBDYW4gYWxzbyBiZSB1c2VkIGFzCithIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4uPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiIHJvd3NwYW49IjIiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCIgY29sc3Bhbj0iMiI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvcGVydHkgdG8gc2V0LiBJZiBvbWl0dGVkIHRoZSByZXN1bHRzIGFyZSB3cml0dGVuCi0gICAgICB0byB0aGUgbG9nLiBJZ25vcmVkIHdoZW4gcHJvY2Vzc2luZyBhcyBhIGNvbmRpdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXNrPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+Q29uZGl0aW9uPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVmaWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4KLSAgICAgIHRvIGEgUmVzb3VyY2UgQ29sbGVjdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ci0gICAgICBZZXMsIHVubGVzcyBhIG5lc3RlZCBSZXNvdXJjZSBDb2xsZWN0aW9uIGlzIHN1cHBsaWVkCi0gICAgPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgcHJvcGVydHkgdG8gc2V0LjwvdGQ+CisgICAgPHRkIGNsYXNzPSJjZW50ZXIiPk5vOyBieSBkZWZhdWx0LCBvdXRwdXQgdmFsdWUgdG8gdGhlIGxvZzwvdGQ+CisgICAgPHRkPklnbm9yZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb3VudDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21wYXJpc29uIGNvdW50IGZvciBwcm9jZXNzaW5nIGFzIGEgY29uZGl0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIGluIGNvbmRpdGlvbiBtb2RlPC90ZD4KKyAgICA8dGQ+cmVmaWQ8L3RkPgorICAgIDx0ZD5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHJlc291cmNlIGNvbGxlY3Rpb24uPC90ZD4KKyAgICA8dGQgY29sc3Bhbj0iMiI+WWVzLCB1bmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBzdXBwbGllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29tcGFyaXNvbiB0eXBlOiAiZXF1YWwiLCAiZXEiLCAiZ3JlYXRlciIsICJndCIsICJsZXNzIiwKLSAgICAgICJsdCIsICJnZSIgKGdyZWF0ZXIgb3IgZXF1YWwpLCAibmUiIChub3QgZXF1YWwpLCAibGUiIChsZXNzIG9yIGVxdWFsKQotICAgICAgZm9yIHVzZSB3aGVuIG9wZXJhdGluZyBhcyBhIGNvbmRpdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgaXMgImVxdWFsIjwvdGQ+CisgICAgPHRkPmNvdW50PC90ZD4KKyAgICA8dGQ+Q29tcGFyaXNvbiBjb3VudC48L3RkPgorICAgIDx0ZCBjbGFzcz0iY2VudGVyIiByb3dzcGFuPSIyIj5JZ25vcmVkPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aGVuPC90ZD4KKyAgICA8dGQ+Q29tcGFyaXNvbgorICAgIHR5cGU6IDxxPmVxdWFsPC9xPiwgPHE+ZXE8L3E+LCA8cT5ncmVhdGVyPC9xPiwgPHE+Z3Q8L3E+LCA8cT5sZXNzPC9xPiwgPHE+bHQ8L3E+LCA8cT5nZTwvcT4KKyAgICAoZ3JlYXRlciBvciBlcXVhbCksIDxxPm5lPC9xPiAobm90IGVxdWFsKSwgPHE+bGU8L3E+IChsZXNzIG9yIGVxdWFsKS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5lcXVhbDwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci08aDQ+UmVzb3VyY2UgQ29sbGVjdGlvbjwvaDQ+Ci08cD5BIHNpbmdsZQotICA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPgotc2hvdWxkIGJlIHNwZWNpZmllZCB2aWEgYSBuZXN0ZWQgZWxlbWVudCBvciB0aGUgPGNvZGU+cmVmaWQ8L2NvZGU+IGF0dHJpYnV0ZS4KLTwvcD4KKzxoND5yZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxwPkEgc2luZ2xlIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+IHNob3VsZCBiZSBzcGVjaWZpZWQKK3ZpYSBhIG5lc3RlZCBlbGVtZW50IG9yIHRoZSA8dmFyPnJlZmlkPC92YXI+IGF0dHJpYnV0ZS48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiZsdDtyZXNvdXJjZWNvdW50IHByb3BlcnR5PSZxdW90O2NvdW50LmZvbyZxdW90OyZndDsKLSAgJmx0O2ZpbGVsaXN0IGRpcj0mcXVvdDsuJnF1b3Q7IGZpbGVzPSZxdW90O2ZvbyxiYXImcXVvdDsgLyZndDsKLSZsdDsvcmVzb3VyY2Vjb3VudCZndDsKLTwvcHJlPgotPHA+U3RvcmVzIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBzcGVjaWZpZWQgZmlsZWxpc3QgKHR3bykKLWluIHRoZSBwcm9wZXJ0eSBuYW1lZCA8aT5jb3VudC5mb288L2k+LjwvcD4KKzxwPlN0b3JlIHRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIGluIHRoZSBzcGVjaWZpZWQgZmlsZWxpc3QgKHR3byBmaWxlcykgaW4gdGhlIHByb3BlcnR5CituYW1lZCA8c2FtcD5jb3VudC5mb288L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7cmVzb3VyY2Vjb3VudCBwcm9wZXJ0eT0mcXVvdDtjb3VudC5mb28mcXVvdDsmZ3Q7CisgICZsdDtmaWxlbGlzdCBkaXI9JnF1b3Q7LiZxdW90OyBmaWxlcz0mcXVvdDtmb28sYmFyJnF1b3Q7LyZndDsKKyZsdDsvcmVzb3VyY2Vjb3VudCZndDs8L3ByZT4KIAorPHA+U3RvcmUgdGhlIG51bWJlciBvZiBsaW5lcyBvZiB0aGUgY3VycmVudCBidWlsZGZpbGUgaW4gdGhlCitwcm9wZXJ0eSA8Y29kZT5maWxlLmxpbmVzPC9jb2RlPi4gUmVxdWlyZXMgQW50IDEuNy4xKyBhcyA8Y29kZT4mbHQ7Y29uY2F0Jmd0OzwvY29kZT4gaGFzIHRvIGJlIGEKK3Jlc291cmNlLjwvcD4KIDxwcmU+CiAmbHQ7cHJvamVjdCZndDsKICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7ZmlsZSZxdW90OyB2YWx1ZT0mcXVvdDske2FudC5maWxlfSZxdW90Oy8mZ3Q7CkBAIC05NiwxMiArOTksNyBAQAogICAgICZsdDsvdG9rZW5zJmd0OwogICAmbHQ7L3Jlc291cmNlY291bnQmZ3Q7CiAgICZsdDtlY2hvJmd0O1RoZSBmaWxlICcke2ZpbGV9JyBoYXMgJHtmaWxlLmxpbmVzfSBsaW5lcy4mbHQ7L2VjaG8mZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KLTxwPlN0b3JlcyB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIHRoZSBjdXJyZW50IGJ1aWxkZmlsZSBpbiB0aGUgcHJvcGVydHkgPHR0PmZpbGUubGluZXM8L3R0Pi4KLVJlcXVpcmVzIEFudCAxLjcuMSsgYXMgJmx0O2NvbmNhdCZndDsgaGFzIHRvIGJlIHJlc291cmNlLjwvcD4KLQorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9yZXRyeS5odG1sIGIvbWFudWFsL1Rhc2tzL3JldHJ5Lmh0bWwKaW5kZXggYWY2OGQ0MC4uZjgxNjdlNCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3JldHJ5Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3JldHJ5Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0OCArMTUsNDggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJldHJ5IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogPGJvZHk+CiA8aDI+UmV0cnk8L2gyPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5SZXRyeSBpcyBhIGNvbnRhaW5lciB3aGljaCBleGVjdXRlcyBhIHNpbmdsZSBuZXN0ZWQgdGFzayB1bnRpbCBlaXRoZXI6IHRoZXJlIGlzIG5vIGZhaWx1cmU7IG9yOgotaXRzIDxlbT5yZXRyeWNvdW50PC9lbT4gaGFzIGJlZW4gZXhjZWVkZWQuIElmIHRoaXMgaGFwcGVucyBhIEJ1aWxkRXhjZXB0aW9uIGlzIHRocm93bi4KLTxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9lbT48L3A+Cis8cD48Y29kZT5SZXRyeTwvY29kZT4gaXMgYSBjb250YWluZXIgd2hpY2ggZXhlY3V0ZXMgYSBzaW5nbGUgbmVzdGVkIHRhc2sgdW50aWwgZWl0aGVyOiB0aGVyZSBpcyBubworZmFpbHVyZTsgb3I6IGl0cyA8dmFyPnJldHJ5Y291bnQ8L3Zhcj4gaGFzIGJlZW4gZXhjZWVkZWQuIElmIHRoaXMgaGFwcGVucworYSA8Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgotICA8dHI+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+cmV0cnljb3VudDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5udW1iZXIgb2YgdGltZXMgdG8gYXR0ZW1wdCB0byBleGVjdXRlIHRoZSBuZXN0ZWQgdGFzazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICA8dHI+CisgICAgPHRkPnJldHJ5Y291bnQ8L3RkPgorICAgIDx0ZD5udW1iZXIgb2YgdGltZXMgdG8gYXR0ZW1wdCB0byBleGVjdXRlIHRoZSBuZXN0ZWQgdGFzazwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXRyeWRlbGF5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzCi0gICAgdGFzay4gPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS44LjM8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gbm8gZGVsYXk8L3RkPgorICA8dHI+CisgICAgPHRkPnJldHJ5ZGVsYXk8L3RkPgorICAgIDx0ZD5udW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiByZXRyeSBhdHRlbXB0cyB0YXNrLiA8ZW0+U2luY2UgQXBhY2hlIEFudAorICAgIDEuOC4zPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gbm8gZGVsYXk8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxwPkFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIHRoZSByZXRyeSB0YXNrLjwvcD4KIAogPGgzPkV4YW1wbGU8L2gzPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgPGNvZGU+Jmx0O3JldHJ5Jmd0OzwvY29kZT4gdG8gd3JhcCBhIHRhc2sgd2hpY2ggbXVzdCBpbnRlcmFjdCB3aXRoCithbiB1bnJlbGlhYmxlIG5ldHdvcmsgcmVzb3VyY2UuPC9wPgogPHByZT4KICZsdDtyZXRyeSByZXRyeWNvdW50PSIzIiZndDsKLSAgJmx0O2dldCBzcmM9Imh0dHA6Ly93d3cudW5yZWxpYWJsZS1zZXJ2ZXIuY29tL3VucmVsaWFibGUudGFyLmd6IiAKLSAgICAgICBkZXN0PSIvaG9tZS9yZXRyeS91bnJlbGlhYmxlLnRhci5neiIgLyZndDsKLSZsdDsvcmV0cnkmZ3Q7Ci08L3ByZT4KLTxwPlRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIDxjb2RlPiZsdDtyZXRyeSZndDs8L2NvZGU+IHRvIHdyYXAgYSB0YXNrIHdoaWNoIG11c3QgaW50ZXJhY3Qgd2l0aCBhbiB1bnJlbGlhYmxlIG5ldHdvcmsgcmVzb3VyY2UuPC9wPgorICAmbHQ7Z2V0IHNyYz0iaHR0cHM6Ly93d3cudW5yZWxpYWJsZS1zZXJ2ZXIuY29tL3VucmVsaWFibGUudGFyLmd6IgorICAgICAgIGRlc3Q9Ii9ob21lL3JldHJ5L3VucmVsaWFibGUudGFyLmd6Ii8mZ3Q7CismbHQ7L3JldHJ5Jmd0OzwvcHJlPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3JleGVjLmh0bWwgYi9tYW51YWwvVGFza3MvcmV4ZWMuaHRtbAppbmRleCAwMmY2ZmUyLi4yNjA5YmZiIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvcmV4ZWMuaHRtbAorKysgYi9tYW51YWwvVGFza3MvcmV4ZWMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDM2ICsxNSwzNiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UkV4ZWMgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icmV4ZWMiPlJFeGVjPC9hPjwvaDI+Cis8aDIgaWQ9InJleGVjIj5SRXhlYzwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBhdXRvbWF0ZSBhIHJlbW90ZSByZXhlYyBzZXNzaW9uLiBKdXN0IGxpa2UgdGhlIFRlbG5ldCB0YXNrLAotaXQgdXNlcyBuZXN0ZWQgPHR0PiZsdDtyZWFkJmd0OzwvdHQ+IHRvIGluZGljYXRlIHN0cmluZ3MgdG8gd2FpdCBmb3IsIGFuZAotPHR0PiZsdDt3cml0ZSZndDs8L3R0PiB0YWdzIHRvIHNwZWNpZnkgdGV4dCB0byBzZW5kIHRvIHRoZSByZW1vdGUgcHJvY2Vzcy4KKzxwPlRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgcmV4ZWMgc2Vzc2lvbi4gSnVzdCBsaWtlIHRoZSA8Y29kZT5UZWxuZXQ8L2NvZGU+IHRhc2ssIGl0IHVzZXMKK25lc3RlZCA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IHRvIGluZGljYXRlIHN0cmluZ3MgdG8gd2FpdCBmb3IsIGFuZAorPGNvZGU+Jmx0O3dyaXRlJmd0OzwvY29kZT4gdGFncyB0byBzcGVjaWZ5IHRleHQgdG8gc2VuZCB0byB0aGUgcmVtb3RlCitwcm9jZXNzLjwvcD4KIAotPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uLgotU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBcGFjaGUgQW50CitkaXN0cmlidXRpb24uICBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uPC9wPgogCi08cD5Zb3UgY2FuIHNwZWNpZnkgdGhlIGNvbW1hbmRzIHlvdSB3YW50IHRvIGV4ZWN1dGUgYXMgbmVzdGVkIGVsZW1lbnRzCi1vciB2aWEgdGhlIGNvbW1hbmQgYXR0cmlidXRlLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgY29tbWFuZAotYXR0cmlidXRlLiAgSWYgeW91IHVzZSB0aGUgY29tbWFuZCBhdHRyaWJ1dGUsIHlvdSBtdXN0IHVzZSB0aGUKLXVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdHRyaWJ1dGVzIGFzIHdlbGwuPC9wPgorPHA+WW91IGNhbiBzcGVjaWZ5IHRoZSBjb21tYW5kcyB5b3Ugd2FudCB0byBleGVjdXRlIGFzIG5lc3RlZCBlbGVtZW50cyBvciB2aWEgdGhlIDx2YXI+Y29tbWFuZDwvdmFyPgorYXR0cmlidXRlLCB3ZSByZWNvbW1lbmQgeW91IHVzZSB0aGUgPHZhcj5jb21tYW5kPC92YXI+IGF0dHJpYnV0ZS4gIElmIHlvdSB1c2UgdGhlIDx2YXI+Y29tbWFuZDwvdmFyPgorYXR0cmlidXRlLCB5b3UgbXVzdCB1c2UgdGhlIDx2YXI+dXNlcm5hbWU8L3Zhcj4gYW5kIDx2YXI+cGFzc3dvcmQ8L3Zhcj4gYXR0cmlidXRlcyBhcyB3ZWxsLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KICAgICAgPHRkPnVzZXJpZDwvdGQ+CkBAIC02Nyw1MCArNjgsNDAgQEAKICAgPC90cj4KICAgPHRyPgogICAgICA8dGQ+cG9ydDwvdGQ+Ci0gICAgIDx0ZD50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSByZXhlYyBzZXJ2ZXIuIERlZmF1bHRzIHRvIHBvcnQgNTEyIGluIEJTRCBVbml4IHN5c3RlbXMuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICAgIDx0ZD50aGUgcG9ydCBudW1iZXIgb2YgdGhlIHJlbW90ZSByZXhlYyBzZXJ2ZXIuPC90ZD4KKyAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT41MTI8L3E+IGluIFVuaXg8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgIDx0ZD50aW1lb3V0PC90ZD4KLSAgICAgPHRkPnNldCBhIGRlZmF1bHQgdGltZW91dCB0byB3YWl0IGZvciBhIHJlc3BvbnNlLiBTcGVjaWZpZWQgaW4gc2Vjb25kcy4gRGVmYXVsdCBpcyBubyB0aW1lb3V0LjwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgIDx0ZD5zZXQgYSBkZWZhdWx0IHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZSwgc3BlY2lmaWVkIGluIHNlY29uZHMuPC90ZD4KKyAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIG5vIHRpbWVvdXQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgotVGhlIGlucHV0IHRvIHNlbmQgdG8gdGhlIHNlcnZlciwgYW5kIHJlc3BvbnNlcyB0byB3YWl0IGZvciwgYXJlCi1kZXNjcmliZWQgYXMgbmVzdGVkIGVsZW1lbnRzLiAgCis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxwPlRoZSBpbnB1dCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIsIGFuZCByZXNwb25zZXMgdG8gd2FpdCBmb3IsIGFyZSBkZXNjcmliZWQgYXMgbmVzdGVkIGVsZW1lbnRzLjwvcD4KIAogPGg0PnJlYWQ8L2g0PgogCi08cD5kZWNsYXJlIChhcyBhIHRleHQgY2hpbGQgb2YgdGhpcyBlbGVtZW50KSBhIHN0cmluZyB0byB3YWl0IGZvci4KLVRoZSBlbGVtZW50IHN1cHBvcnRzIHRoZSB0aW1lb3V0IGF0dHJpYnV0ZSwgd2hpY2ggb3ZlcnJpZGVzIGFueQotdGltZW91dCBzcGVjaWZpZWQgZm9yIHRoZSB0YXNrIGFzIGEgd2hvbGUuIEl0IGFsc28gaGFzIGEgPHR0PnN0cmluZzwvdHQ+Ci1hdHRyaWJ1dGUsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBhcyAKLWEgdGV4dCBlbGVtZW50LgotPC9wPgotPGk+SXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkZWNsYXJlIGEgY2xvc2luZyA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGVsZW1lbnQgbGlrZSBmb3IgdGhlIFRlbG5ldCB0YXNrLiBUaGUgY29ubmVjdGlvbiBpcyBub3QgYnJva2VuIHVudGlsIHRoZSBjb21tYW5kIGhhcyBjb21wbGV0ZWQgYW5kCi10aGUgaW5wdXQgc3RyZWFtIChvdXRwdXQgb2YgdGhlIGNvbW1hbmQpIGlzIHRlcm1pbmF0ZWQuCi08L2k+Cis8cD5kZWNsYXJlIChhcyBhIHRleHQgY2hpbGQgb2YgdGhpcyBlbGVtZW50KSBhIHN0cmluZyB0byB3YWl0IGZvci4gIFRoZSBlbGVtZW50IHN1cHBvcnRzCit0aGUgPHZhcj50aW1lb3V0PC92YXI+IGF0dHJpYnV0ZSwgd2hpY2ggb3ZlcnJpZGVzIGFueSB0aW1lb3V0IHNwZWNpZmllZCBmb3IgdGhlIHRhc2sgYXMgYSB3aG9sZS4gSXQKK2Fsc28gaGFzIGEgPHZhcj5zdHJpbmc8L3Zhcj4gYXR0cmlidXRlLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIHRoZSBzdHJpbmcgYXMgYSB0ZXh0CitlbGVtZW50LjwvcD4KKzxwPjxlbT5JdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgYSBjbG9zaW5nIDxjb2RlPiZsdDtyZWFkJmd0OzwvY29kZT4gZWxlbWVudCBsaWtlIGZvcgordGhlIDxjb2RlPlRlbG5ldDwvY29kZT4gdGFzay4gVGhlIGNvbm5lY3Rpb24gaXMgbm90IGJyb2tlbiB1bnRpbCB0aGUgY29tbWFuZCBoYXMgY29tcGxldGVkIGFuZCB0aGUKK2lucHV0IHN0cmVhbSAob3V0cHV0IG9mIHRoZSBjb21tYW5kKSBpcyB0ZXJtaW5hdGVkLjwvZW0+PC9wPgorCiA8aDQ+d3JpdGU8L2g0PgogCi08cD5kZXNjcmliZXMgdGhlIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBUaGUgPHR0PmVjaG88L3R0PiBib29sZWFuCi1hdHRyaWJ1dGUgY29udHJvbHMgd2hldGhlciB0aGUgc3RyaW5nIGlzIGVjaG9lZCB0byB0aGUgbG9jYWwgbG9nOyAKLXRoaXMgaXMgInRydWUiIGJ5IGRlZmF1bHQKLTwvcD4KKzxwPmRlc2NyaWJlcyB0aGUgdGV4dCB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuIFRoZSA8dmFyPmVjaG88L3Zhcj4gYm9vbGVhbiBhdHRyaWJ1dGUgY29udHJvbHMgd2hldGhlcgordGhlIHN0cmluZyBpcyBlY2hvZWQgdG8gdGhlIGxvY2FsIGxvZzsgdGhpcyBpcyA8cT50cnVlPC9xPiBieSBkZWZhdWx0LjwvcD4KIDxoMz5FeGFtcGxlPC9oMz4KLUEgc2ltcGxlIGV4YW1wbGUgb2YgY29ubmVjdGluZyB0byBhIHNlcnZlciBhbmQgcnVubmluZyBhIGNvbW1hbmQuCis8cD5BIHNpbXBsZSBleGFtcGxlIG9mIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgYW5kIHJ1bm5pbmcgYSBjb21tYW5kLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtyZXhlYyB1c2VyaWQ9JnF1b3Q7Ym9iJnF1b3Q7IHBhc3N3b3JkPSZxdW90O2JhZHBhc3MmcXVvdDsgc2VydmVyPSZxdW90O2xvY2FsaG9zdCZxdW90OyBjb21tYW5kPSZxdW90O2xzJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O3JleGVjIHVzZXJpZD0mcXVvdDtib2ImcXVvdDsgcGFzc3dvcmQ9JnF1b3Q7YmFkcGFzcyZxdW90OyBzZXJ2ZXI9JnF1b3Q7bG9jYWxob3N0JnF1b3Q7IGNvbW1hbmQ9JnF1b3Q7bHMmcXVvdDsvJmd0OzwvcHJlPgogCi1UaGUgdGFzayBjYW4gYmUgdXNlZCB3aXRoIG90aGVyIHBvcnRzIGFzIHdlbGw6Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O3JleGVjIHBvcnQ9JnF1b3Q7ODAmcXVvdDsgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgY29tbWFuZD0mcXVvdDtscyZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5UaGUgdGFzayBjYW4gYmUgdXNlZCB3aXRoIG90aGVyIHBvcnRzIGFzIHdlbGw6PC9wPgogCi0KKzxwcmU+Jmx0O3JleGVjIHBvcnQ9JnF1b3Q7ODAmcXVvdDsgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgY29tbWFuZD0mcXVvdDtscyZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3JtaWMuaHRtbCBiL21hbnVhbC9UYXNrcy9ybWljLmh0bWwKaW5kZXggMjI2YjU0Yi4uYzMyOGM1OCAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3JtaWMuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvcm1pYy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzQ5ICsxNSwzMDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJtaWMgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icm1pYyI+Um1pYzwvYT48L2gyPgorPGgyIGlkPSJybWljIj5SbWljPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5SdW5zIHRoZSBybWljIGNvbXBpbGVyIGZvciBhIGNlcnRhaW4gY2xhc3MuPC9wPgorPHA+UnVucyB0aGUgPGtiZD5ybWljPC9rYmQ+IGNvbXBpbGVyIGZvciBhIGNlcnRhaW4gY2xhc3MuPC9wPgogCi08cD48Yj5Ob3RlPC9iPiA8Y29kZT5ybWljPC9jb2RlPiBoYXMgYmVlbiBkZXByZWNhdGVkIGFzIG9mIEphdmEgMTMgYW5kCis8cD48Yj5Ob3RlPC9iPiA8a2JkPnJtaWM8L2tiZD4gaGFzIGJlZW4gZGVwcmVjYXRlZCBhcyBvZiBKYXZhIDEzIGFuZAogICByZW1vdmVkIGFzIG9mIEphdmEgMTUuIFRyeWluZyB0byB1c2UgaXQgd2l0aCBKYXZhMTUgd2lsbCBmYWlsIHVubGVzcwogICB5b3Ugc3BlY2lmaXkgdGhlIGV4ZWN4dXRhYmxlIG9yIHJtaWMtYWRhcHRlciBleHBsaWNpdGx5LjwvcD4KIAotPHA+Um1pYyBjYW4gYmUgcnVuIG9uIGEgc2luZ2xlIGNsYXNzIChhcyBzcGVjaWZpZWQgd2l0aCB0aGUgY2xhc3NuYW1lCi1hdHRyaWJ1dGUpIG9yIGEgbnVtYmVyIG9mIGNsYXNzZXMgYXQgb25jZSAoYWxsIGNsYXNzZXMgYmVsb3cgYmFzZSB0aGF0Ci1hcmUgbmVpdGhlciBfU3R1YiBub3IgX1NrZWwgY2xhc3NlcykuICBJZiB5b3Ugd2FudCB0byBybWljIGEgc2luZ2xlCi1jbGFzcyBhbmQgdGhpcyBjbGFzcyBpcyBhIGNsYXNzIG5lc3RlZCBpbnRvIGFub3RoZXIgY2xhc3MsIHlvdSBoYXZlIHRvCi1zcGVjaWZ5IHRoZSBjbGFzc25hbWUgaW4gdGhlIGZvcm0gPGNvZGU+T3V0ZXIkJElubmVyPC9jb2RlPiBpbnN0ZWFkIG9mCi08Y29kZT5PdXRlci5Jbm5lcjwvY29kZT4uPC9wPgotPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcm1pY2VkLiBUaGlzIGNhbiBiZQotZG9uZSB3aXRoIHRoZSA8aT5pbmNsdWRlczwvaT4sIDxpPmluY2x1ZGVzZmlsZTwvaT4sIDxpPmV4Y2x1ZGVzPC9pPiwgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhbmQgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPgotYXR0cmlidXRlcy4gV2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+IG9yIDxpPmluY2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0bwotaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDxpPmV4Y2x1ZGU8L2k+IG9yIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeQotdGhlIGZpbGVzIHlvdSB3YW50IHRvIGhhdmUgZXhjbHVkZWQuIFRoaXMgaXMgYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZAotZmluYWxseSB3aXRoIHRoZSA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5IHdoZXRoZXIgeW91Ci13YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24gb24gPGEKLWhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQorPHA+PGNvZGU+Um1pYzwvY29kZT4gY2FuIGJlIHJ1biBvbiBhIHNpbmdsZSBjbGFzcyAoYXMgc3BlY2lmaWVkIHdpdGggdGhlIGNsYXNzbmFtZSBhdHRyaWJ1dGUpIG9yIGEKK251bWJlciBvZiBjbGFzc2VzIGF0IG9uY2UgKGFsbCBjbGFzc2VzIGJlbG93IGJhc2UgdGhhdCBhcmUgbmVpdGhlciA8Y29kZT5fU3R1YjwvY29kZT4KK25vciA8Y29kZT5fU2tlbDwvY29kZT4gY2xhc3NlcykuICBJZiB5b3Ugd2FudCB0byA8Y29kZT5ybWljPC9jb2RlPiBhIHNpbmdsZSBjbGFzcyBhbmQgdGhpcyBjbGFzcyBpcworYSBjbGFzcyBuZXN0ZWQgaW50byBhbm90aGVyIGNsYXNzLCB5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBjbGFzc25hbWUgaW4gdGhlCitmb3JtIDxjb2RlPk91dGVyJCRJbm5lcjwvY29kZT4gaW5zdGVhZCBvZiA8Y29kZT5PdXRlci5Jbm5lcjwvY29kZT4uPC9wPgorPHA+SXQgaXMgcG9zc2libGUgdG8gcmVmaW5lIHRoZSBzZXQgb2YgZmlsZXMgdGhhdCBhcmUgYmVpbmcgPGNvZGU+cm1pYzwvY29kZT5lZC4gVGhpcyBjYW4gYmUgZG9uZQord2l0aCB0aGUgPHZhcj5pbmNsdWRlczwvdmFyPiwgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4sIDx2YXI+ZXhjbHVkZXM8L3Zhcj4sIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+CithbmQgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlcy4gV2l0aCB0aGUgPHZhcj5pbmNsdWRlczwvdmFyPiBvciA8dmFyPmluY2x1ZGVzZmlsZTwvdmFyPgorYXR0cmlidXRlIHlvdSBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPHZhcj5leGNsdWRlPC92YXI+CitvciA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzCithbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kIGZpbmFsbHkgd2l0aCB0aGUgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkKK3doZXRoZXIgeW91IHdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbgorb24gPGEgaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCiBpbmNsdXNpb24vZXhjbHVzaW9uIG9mIGZpbGVzIHdvcmtzLCBhbmQgaG93IHRvIHdyaXRlIHBhdHRlcm5zLjwvcD4KLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAotc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLSg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+YmFzZTwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAotPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgotPHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkCi13aXRoIHRoZSAmcXVvdDtidWlsZC5ybWljJnF1b3Q7IHByb3BlcnR5LCB0aGUgPGNvZGU+Y29tcGlsZXI8L2NvZGU+Ci1hdHRyaWJ1dGUuIG9yIGEgbmVzdGVkIGVsZW1lbnQuCi08YSBuYW1lPSJjb21waWxlcnZhbHVlcyI+SGVyZSBhcmUgdGhlIGNob2ljZXM8L2E+OjwvcD4KKzxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZCBzdXBwb3J0cyBtb3N0CithdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDx2YXI+ZGlyPC92YXI+IGJlY29tZXMgPHZhcj5iYXNlPC92YXI+KSBhcyB3ZWxsIGFzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwIGlkPSJjb21waWxlcnZhbHVlcyI+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkIHdpdGgKK3RoZSA8Y29kZT5idWlsZC5ybWljPC9jb2RlPiBwcm9wZXJ0eSwgdGhlIDx2YXI+Y29tcGlsZXI8L3Zhcj4gYXR0cmlidXRlLCBvciBhIG5lc3RlZCBlbGVtZW50LiBIZXJlCithcmUgdGhlIGNob2ljZXM6PC9wPgogPHVsPgotICA8bGk+ZGVmYXVsdCAtdGhlIGRlZmF1bHQgY29tcGlsZXIgKGthZmZlLCBzdW4gb3IgZm9ya2luZykgZm9yIHRoZSBwbGF0Zm9ybS4KLSAgPGxpPnN1biAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIHRoZSBKREsgJmx0OyBKREsgOSk8L2xpPgotICA8bGk+a2FmZmUgKHRoZSBzdGFuZGFyZCBjb21waWxlciBvZiA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyIgdGFyZ2V0PSJfdG9wIj5LYWZmZTwvYT4pPC9saT4KLSAgPGxpPndlYmxvZ2ljPC9saT4KLSAgPGxpPmZvcmtpbmcgLSB0aGUgc3VuIGNvbXBpbGVyIGZvcmtlZCBpbnRvIGEgc2VwYXJhdGUgcHJvY2VzcyAoc2luY2UKLSAgICBBcGFjaGUgQW50IDEuNykuIFN0YXJ0aW5nIHdpdGggQW50IDEuOS44IHRoaXMgaXMgdGhlIGRlZmF1bHQgd2hlbgotICAgIHJ1bm5pbmcgb24gSkRLIDkrLjwvbGk+Ci0gIDxsaT54bmV3IC0gdGhlIHN1biBjb21waWxlciBmb3JrZWQgaW50byBhIHNlcGFyYXRlIHByb2Nlc3MsCi0gICAgICB3aXRoIHRoZSAtWG5ldyBvcHRpb24gKHNpbmNlIEFudCAxLjcpLgotICAgIFRoaXMgaXMgdGhlIG1vc3QgcmVsaWFibGUgd2F5IHRvIHVzZSAtWG5ldy4KLSAgICA8YnI+PC9icj5KREs5IGhhcyByZW1vdmVkIHN1cHBvcnQgZm9yIC1YbmV3IGFuZCBzdGFydGluZyB3aXRoIEFudAotICAgIDEuOS44IHRoaXMgb3B0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgYnkgYW50IHdoZW4gcnVubmluZyBvbiBKREs5LjwvbGk+Ci0gICAgPGxpPiAiIiAoZW1wdHkgc3RyaW5nKS4gVGhpcyBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIG5vdCBzZXR0aW5nIHRoZSBjb21waWxlciBhdHRyaWJ1dGUuCi0gICAgRmlyc3QgdGhlIHZhbHVlIG9mIDx0dD5idWlsZC5ybWljPC90dD4gaXMgdXNlZCBpZiBkZWZpbmVkLCBhbmQgaWYgbm90LCB0aGUgZGVmYXVsdAotICAgIGZvciB0aGUgcGxhdGZvcm0gaXMgY2hvc2VuLiBJZiBidWlsZC5ybWljIGlzIHNldCB0byB0aGlzLCB5b3UgZ2V0IHRoZSBkZWZhdWx0LgotCisgIDxsaT48cT5kZWZhdWx0PC9xPiZtZGFzaDt0aGUgZGVmYXVsdCBjb21waWxlciAoPHE+a2FmZmU8L3E+LCA8cT5zdW48L3E+IG9yIDxxPmZvcmtpbmc8L3E+KSBmb3IgdGhlCisgICAgcGxhdGZvcm0uCisgIDxsaT48cT5zdW48L3E+Jm1kYXNoO3RoZSBzdGFuZGFyZCBjb21waWxlciBwcmlvciB0byBKREsgOTwvbGk+CisgIDxsaT48cT5rYWZmZTwvcT4mbWRhc2g7dGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rYWZmZS9rYWZmZSIKKyAgICB0YXJnZXQ9Il90b3AiPkthZmZlPC9hPjwvbGk+CisgIDxsaT48cT53ZWJsb2dpYzwvcT48L2xpPgorICA8bGk+PHE+Zm9ya2luZzwvcT4mbWRhc2g7KDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+KSB0aGUgPHE+c3VuPC9xPiBjb21waWxlciBmb3JrZWQgaW50byBhCisgICAgc2VwYXJhdGUgcHJvY2Vzcy4gIDxlbT5TaW5jZSBBbnQgMS45Ljg8L2VtPiwgdGhpcyBpcyB0aGUgZGVmYXVsdCB3aGVuIHJ1bm5pbmcgb24gSkRLIDkrLjwvbGk+CisgIDxsaT48cT54bmV3PC9xPiZtZGFzaDsoPGVtPnNpbmNlIEFudCAxLjc8L2VtPikgdGhlIDxxPnN1bjwvcT4gY29tcGlsZXIgZm9ya2VkIGludG8gYSBzZXBhcmF0ZQorICAgIHByb2Nlc3MsIHdpdGggdGhlIDxrYmQ+LVhuZXc8L2tiZD4gb3B0aW9uLiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0bworICAgIHVzZSA8a2JkPi1YbmV3PC9rYmQ+Ljxici8+SkRLIDkgaGFzIHJlbW92ZWQgc3VwcG9ydCBmb3IgPGtiZD4tWG5ldzwva2JkPiBhbmQgPGVtPnNpbmNlIEFudAorICAgIDEuOS44PC9lbT4gdGhpcyBvcHRpb24gd2lsbCBiZSByZWplY3RlZCB3aGVuIHJ1bm5pbmcgb24gSkRLIDkrLjwvbGk+CisgIDxsaT48cT48L3E+IChlbXB0eSBzdHJpbmcpLiBUaGlzIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgbm90IHNldHRpbmcgdGhlIGNvbXBpbGVyIGF0dHJpYnV0ZS4KKyAgICBGaXJzdCB0aGUgdmFsdWUgb2YgPGNvZGU+YnVpbGQucm1pYzwvY29kZT4gaXMgdXNlZCBpZiBkZWZpbmVkLCBhbmQgaWYgbm90LCB0aGUgZGVmYXVsdCBmb3IgdGhlCisgICAgcGxhdGZvcm0gaXMgY2hvc2VuLiBJZiA8Y29kZT5idWlsZC5ybWljPC9jb2RlPiBpcyBzZXQgdG8gdGhpcywgeW91IGdldCB0aGUgZGVmYXVsdC48L2xpPgogPC91bD4KIAotPHA+VGhlIDxhIGhyZWY9Imh0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iPm1pbmlSTUk8L2E+Ci1wcm9qZWN0IGNvbnRhaW5zIGEgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgdGFzayBhcyB3ZWxsLAotcGxlYXNlIGNvbnN1bHQgbWluaVJNSSdzIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gaG93IHRvIHVzZSBpdC48L3A+Cis8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTMxMjI1MDIzNjAyL2h0dHA6Ly9kaW9uZS56Y3UuY3ovfnRvbWFuNDAvbWluaVJNSS8iCit0YXJnZXQ9Il90b3AiPm1pbmlSTUk8L2E+IHByb2plY3QgY29udGFpbnMgYSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyB0YXNrIGFzIHdlbGwsIHBsZWFzZQorY29uc3VsdCBtaW5pUk1JJ3MgZG9jdW1lbnRhdGlvbiB0byBsZWFybiBob3cgdG8gdXNlIGl0LjwvcD4KIAogPGg0PkNPUkJBIHN1cHBvcnQ8L2g0PgogCi08cD5KYXZhIDExIHJlbW92ZXMgdGhlIENPUkJBIGFuZCBKYXZhRUUgcGFja2FnZXMgYW5kIHJtaWMgbm8gbG9uZ2VyCi0gIHN1cHBvcnRzIGVpdGhlciA8Y29kZT5paW9wPC9jb2RlPiBub3IgPGNvZGU+aWRsPC9jb2RlPi4gU3RhcnRpbmcKLSAgd2l0aCBBbnQgMS45LjExIHRoZSBybWljIHRhc2sgd2lsbCBmYWlsIHdoZW4gdXNpbmcgZWl0aGVyIHdoaWxlCi0gIHJ1bm5pbmcgSmF2YTExKyB1bmxlc3MgeW91IGZvcmsgdGhlIHRhc2sgYW5kIGV4cGxpY2l0bHkgc3BlY2lmeSBhbgotICBleGVjdXRhYmxlLjwvcD4KKzxwPkphdmEgMTEgPGEgaHJlZj0iaHR0cHM6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMzIwIiB0YXJnZXQ9Il90b3AiPnJlbW92ZXM8L2E+IHRoZSBKYXZhIEVFIGFuZAorQ09SQkEgcGFja2FnZXMgYW5kIDxrYmQ+cm1pYzwva2JkPiBubyBsb25nZXIgc3VwcG9ydHMgZWl0aGVyIDxrYmQ+LWlpb3A8L2tiZD4KK29yIDxrYmQ+LWlkbDwva2JkPiBvcHRpb25zLiBTdGFydGluZyB3aXRoIEFudCAxLjEwLjMsIHRoZSA8a2JkPnJtaWM8L2tiZD4gdGFzayB3aWxsIGZhaWwgd2hlbiB1c2luZworZWl0aGVyIHdoaWxlIHJ1bm5pbmcgSmF2YSAxMSsgdW5sZXNzIHlvdSBmb3JrIHRoZSB0YXNrIGFuZCBleHBsaWNpdGx5IHNwZWNpZnkgYW4gZXhlY3V0YWJsZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyIGlkPSJmb290bm90ZS0xLWJhY2siPgorICAgIDx0ZD5iYXNlPC90ZD4KKyAgICA8dGQ+dGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlcy4gIEFsc28gc2VydmVzIGFzIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBhbnkKKyAgICAgIG5vbi1GaWxlc2V0IGluY2x1ZGVzLCBldGMuICAoVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyByZW1haW5lZCB1bmNoYW5nZWQuKTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPlNlZSA8YSBocmVmPSIjZm9vdG5vdGUtMSI+bm90ZTwvYT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBsb2NhdGlvbiB0byBzdG9yZSB0aGUgY29tcGlsZWQgZmlsZXMuCi0gICAgICBBbHNvIHNlcnZlcyBhcyB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgYW55IG5vbi1GaWxlc2V0IGluY2x1ZGVzLCBldGMuCi0gICAgICAoVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyByZW1haW5lZCB1bmNoYW5nZWQuKTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj48YSBocmVmPSIjZm9vdG5vdGUtMSI+KjE8L2E+PC90ZD4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij50aGUgbG9jYXRpb24gdG8gc3RvcmUgdGhlIGNvbXBpbGVkIGZpbGVzLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBjb21waWxlZCBmaWxlcy48L3RkPgorICAgIDx0ZD5jbGFzc25hbWU8L3RkPgorICAgIDx0ZD50aGUgY2xhc3MgZm9yIHdoaWNoIHRvIHJ1biA8a2JkPnJtaWM8L2tiZD4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzIGZvciB3aGljaCB0byBydW4gPGNvZGU+cm1pYzwvY29kZT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmlsdGVyaW5nPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWx0ZXJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG9rZW4gZmlsdGVyaW5nIHNob3VsZCB0YWtlIHBsYWNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c291cmNlYmFzZTwvdGQ+CisgICAgPHRkPlBhc3MgdGhlIDxrYmQ+LWtlZXBnZW5lcmF0ZWQ8L2tiZD4gZmxhZyB0byA8a2JkPnJtaWM8L2tiZD4gYW5kIG1vdmUgdGhlIGdlbmVyYXRlZCBzb3VyY2UKKyAgICAgIGZpbGUgdG8gdGhlIGdpdmVuIDx2YXI+c291cmNlYmFzZTwvdmFyPiBkaXJlY3RvcnkuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zb3VyY2ViYXNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3MgdGhlICZxdW90Oy1rZWVwZ2VuZXJhdGVkJnF1b3Q7IGZsYWcgdG8gcm1pYyBhbmQKLSBtb3ZlIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGUgdG8gdGhlIGdpdmVuIHNvdXJjZWJhc2UgZGlyZWN0b3J5LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnN0dWJ2ZXJzaW9uPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgSkRLIHZlcnNpb24gZm9yIHRoZSBnZW5lcmF0ZWQgc3R1YiBjb2RlLiAgU3BlY2lmeSA8cT4xLjE8L3E+IHRvIHBhc3MKKyAgICAgIHRoZSA8a2JkPi12MS4xPC9rYmQ+IG9wdGlvbiB0byA8a2JkPnJtaWM8L2tiZD4sIDxxPjEuMjwvcT4KKyAgICAgIGZvciA8a2JkPi12MS4yPC9rYmQ+LCA8cT5jb21wYXQ8L3E+IGZvciA8a2JkPi12Y29tcGF0PC9rYmQ+Ljxici8+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiwgaWYKKyAgICAgIHlvdSBkbyBub3Qgc3BlY2lmeSBhIHZlcnNpb24sIGFuZCBkbyBub3QgYXNrIGZvciA8c2FtcD4uaWlvcDwvc2FtcD4gb3IgPHNhbXA+LmlkbDwvc2FtcD4KKyAgICAgIGZpbGVzLCA8cT5jb21wYXQ8L3E+IGlzIHNlbGVjdGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmNvbXBhdDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHVidmVyc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZ5IHRoZSBKREsgdmVyc2lvbiBmb3IgdGhlIGdlbmVyYXRlZCBzdHViIGNvZGUuCi0gU3BlY2lmeSAmcXVvdDsxLjEmcXVvdDsgdG8gcGFzcyB0aGUgJnF1b3Q7LXYxLjEmcXVvdDsgb3B0aW9uIHRvIHJtaWMsCi0gIjEuMiIgZm9yIC12MTIsIGNvbXBhdCBmb3IgLXZjb21wYXQuIDxicj4KLSAgICAgICAgU2luY2UgQW50MS43LCBpZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB2ZXJzaW9uLCBhbmQgZG8gbm90IGFzawotICAgICAgICBmb3IgaWlvcCBvciBpZGwgZmlsZXMsICJjb21wYXQiIGlzIHNlbGVjdGVkLgotIAotIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdD0iY29tcGF0IjwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlIGR1cmluZyBjb21waWxhdGlvbiwgZ2l2ZW4KKyAgICAgIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBkdXJpbmcgY29tcGlsYXRpb24sIGdpdmVuIGFzIDxhCi0gICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBQQVRIIGRlZmluZWQgZWxzZXdoZXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPiBpcyA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dmVyaWZ5PC90ZD4KKyAgICA8dGQ+Y2hlY2sgdGhhdCBjbGFzc2VzIGltcGxlbWVudCA8Y29kZT5SZW1vdGU8L2NvZGU+IGJlZm9yZSBoYW5kaW5nIHRoZW0gdG8gPGtiZD5ybWljPC9rYmQ+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyaWZ5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNoZWNrIHRoYXQgY2xhc3NlcyBpbXBsZW1lbnQgUmVtb3RlIGJlZm9yZSBoYW5kaW5nIHRoZW0gCi0gICAgICAgIHRvIHJtaWMgKGRlZmF1bHQgaXMgZmFsc2UpPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aWlvcDwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB0aGF0IHBvcnRhYmxlIChSTUkvSUlPUCkgc3R1YnMgc2hvdWxkIGJlIGdlbmVyYXRlZC48YnIvPiAgU2VlIHRoZSBub3RlIG9uIENPUkJBCisgICAgICBzdXBwb3J0IGFib3ZlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWlvcDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgdGhhdCBwb3J0YWJsZSAoUk1JL0lJT1ApIHN0dWJzIHNob3VsZAotICAgICAgYmUgZ2VuZXJhdGVkLjxici8+Ci0gICAgICBTZWUgdGhlIG5vdGUgb24gQ09SQkEgc3VwcG9ydCBhYm92ZS4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5paW9wb3B0czwvdGQ+CisgICAgPHRkPmFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBJSU9QIGNsYXNzIGdlbmVyYXRpb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlpb3BvcHRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBJSU9QIGNsYXNzIGdlbmVyYXRpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pZGw8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IGZpbGVzIHNob3VsZCBiZSBnZW5lcmF0ZWQuPGJyLz4gIFNlZSB0aGUgbm90ZSBvbiBDT1JCQSBzdXBwb3J0CisgICAgICBhYm92ZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlkbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgdGhhdCBJREwgb3V0cHV0IGZpbGVzIHNob3VsZCBiZQotICAgICAgZ2VuZXJhdGVkLjxici8+ICBTZWUgdGhlIG5vdGUgb24gQ09SQkEgc3VwcG9ydCBhYm92ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pZGxvcHRzPC90ZD4KKyAgICA8dGQ+YWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIElETCBmaWxlIGdlbmVyYXRpb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlkbG9wdHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIElETCBmaWxlIGdlbmVyYXRpb248L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5kZWJ1ZzwvdGQ+CisgICAgPHRkPmdlbmVyYXRlIGRlYnVnIGluZm8gKHBhc3NlcyA8a2JkPi1nPC9rYmQ+IHRvIDxrYmQ+cm1pYzwva2JkPik8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVidWc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Z2VuZXJhdGUgZGVidWcgaW5mbyAocGFzc2VzIC1nIHRvIHJtaWMpLiBEZWZhdWx0cyB0byBmYWxzZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlQW50UnVudGltZTwvdGQ+CisgICAgPHRkPndoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllczwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZUFudFJ1bnRpbWU8L3RkPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdG8gaW5jbHVkZSB0aGUgQW50IHJ1bi10aW1lIGxpYnJhcmllczsKLSAgICAgIGRlZmF1bHRzIHRvIDxjb2RlPnllczwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZUphdmFSdW50aW1lPC90ZD4KKyAgICA8dGQ+d2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBleGVjdXRpbmcgSlZNPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVKYXZhUnVudGltZTwvdGQ+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBpbmNsdWRlIHRoZSBkZWZhdWx0IHJ1bi10aW1lCi0gICAgICBsaWJyYXJpZXMgZnJvbSB0aGUgZXhlY3V0aW5nIFZNOyBkZWZhdWx0cyB0byA8Y29kZT5ubzwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXh0ZGlyczwvdGQ+CisgICAgPHRkPmxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leHRkaXJzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uIG9mIGluc3RhbGxlZCBleHRlbnNpb25zLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNvbXBpbGVyPC90ZD4KKyAgICA8dGQ+VGhlIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvIHVzZS4gIChTZWUgdGhlIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YKKyAgICAgIHZhbGlkIGNvbXBpbGVycy4pPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YnVpbGQucm1pYzwvY29kZT4gcHJvcGVydHksIGlmIHNldCwgYW5kIHRoZSBkZWZhdWx0CisgICAgICBjb21waWxlciBmb3IgdGhlIGN1cnJlbnQgSkRLIG90aGVyd2lzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXBpbGVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UuCi0gICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc2V0LCB0aGUgdmFsdWUgb2YgdGhlCi0gICAgICA8Y29kZT5idWlsZC5ybWljPC9jb2RlPiBwcm9wZXJ0eSwgaWYgc2V0LCB3aWxsIGJlIHVzZWQuCi0gICAgICBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGNvbXBpbGVyIGZvciB0aGUgY3VycmVudCBWTSB3aWxsIGJlIHVzZWQuCi0gICAgICAoU2VlIHRoZSBhYm92ZSA8YSBocmVmPSIjY29tcGlsZXJ2YWx1ZXMiPmxpc3Q8L2E+IG9mIHZhbGlkCi0gICAgICBjb21waWxlcnMuKTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmV4ZWN1dGFibGU8L3RkPgorICAgIDx0ZD5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8a2JkPnJtaWM8L2tiZD4gZXhlY3V0YWJsZSB0byB1c2UgaW4gY2FzZSBvZiB0aGUgPHE+Zm9ya2luZzwvcT4KKyAgICAgIG9yIDxxPnhuZXc8L3E+IGNvbXBpbGVyLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSA8a2JkPnJtaWM8L2tiZD4gY29tcGlsZXIgb2YgSkRLIHRoYXQgaXMgY3VycmVudGx5IHJ1bm5pbmcgQW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhlY3V0YWJsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Db21wbGV0ZSBwYXRoIHRvIHRoZSA8Y29kZT5ybWljPC9jb2RlPgotICAgICAgZXhlY3V0YWJsZSB0byB1c2UgaW4gY2FzZSBvZiB0aGUgPGNvZGU+Zm9ya2luZzwvY29kZT4KLSAgICAgIG9yIDxjb2RlPnhuZXc8L2NvZGU+IGNvbXBpbGVyLgotICAgICAgRGVmYXVsdHMgdG8gdGhlIHJtaWMgY29tcGlsZXIgb2YgdGhlIEphdmEgdmVyc2lvbiB0aGF0IGlzIGN1cnJlbnRseQotICAgICAgcnVubmluZyBBbnQuPGJyLz4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saXN0ZmlsZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNvdXJjZSBmaWxlcyB0byBiZSBjb21waWxlZCB3aWxsCi0gICAgICBiZSBsaXN0ZWQ7IGRlZmF1bHRzIHRvIDxjb2RlPm5vPC9jb2RlPi48YnIvPgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmxpc3RmaWxlczwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHRoZSBzb3VyY2UgZmlsZXMgdG8gYmUgY29tcGlsZWQgd2lsbCBiZSBsaXN0ZWQuIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD48YSBuYW1lPSJmb290bm90ZS0xIj4qMTwvYT46Cis8cCBpZD0iZm9vdG5vdGUtMSI+PGEgaHJlZj0iI2Zvb3Rub3RlLTEtYmFjayI+Tm90ZTwvYT46PC9wPgogPHVsPgotICA8bGk+TWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSwgPGNvZGU+YmFzZTwvY29kZT4sIHdoZW4gc3BlY2lmaWVkIGJ5Ci0gICAgaXRzZWxmLCBzZXJ2ZXMgYXMgYm90aCB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgYW55IHNvdXJjZSBmaWxlcwotICAgIEFORCB0aGUgb3V0cHV0IGRpcmVjdG9yeS48L2xpPgotICA8bGk+PGNvZGU+ZGVzdGRpcjwvY29kZT4gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgb3V0cHV0Ci0gICAgZGlyZWN0b3J5LCBhbGxvd2luZyBmb3IgPGNvZGU+YmFzZTwvY29kZT4gdG8gYmUgdXNlZCBhcyB0aGUgcGFyZW50Ci0gICAgZGlyZWN0b3J5IGZvciBhbnkgc291cmNlIGZpbGVzLjwvbGk+Ci0gIDxsaT5BdCBsZWFzdCBvbmUgb2YgZWl0aGVyIDxjb2RlPmJhc2U8L2NvZGU+IG9yIDxjb2RlPmRlc3RkaXI8L2NvZGU+Ci0gICAgbXVzdCBiZSBzcGVjaWZpZWQgYW5kIGV4aXN0LCBvciBhIHJ1bnRpbWUgZXJyb3Igd2lsbAotICAgIG9jY3VyLjwvbGk+CisgIDxsaT5NYWludGFpbmluZyBjb21wYXRpYmlsaXR5LCA8dmFyPmJhc2U8L3Zhcj4sIHdoZW4gc3BlY2lmaWVkIGJ5IGl0c2VsZiwgc2VydmVzIGFzIGJvdGggdGhlCisgICAgcGFyZW50IGRpcmVjdG9yeSBmb3IgYW55IHNvdXJjZSBmaWxlcyBBTkQgdGhlIG91dHB1dCBkaXJlY3RvcnkuPC9saT4KKyAgPGxpPjx2YXI+ZGVzdGRpcjwvdmFyPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBhbGxvd2luZyBmb3IgPHZhcj5iYXNlPC92YXI+CisgICAgdG8gYmUgdXNlZCBhcyB0aGUgcGFyZW50IGRpcmVjdG9yeSBmb3IgYW55IHNvdXJjZSBmaWxlcy48L2xpPgorICA8bGk+QXQgbGVhc3Qgb25lIG9mIGVpdGhlciA8dmFyPmJhc2U8L3Zhcj4gb3IgPHZhcj5kZXN0ZGlyPC92YXI+IG11c3QgYmUgc3BlY2lmaWVkIGFuZCBleGlzdCwgb3IKKyAgICBhbiBlcnJvciB3aWxsIG9jY3VyIGF0IHJ1biB0aW1lLjwvbGk+CiA8L3VsPgotPC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5jbGFzc3BhdGggYW5kIGV4dGRpcnM8L2g0PgotPHA+PGNvZGU+Um1pYzwvY29kZT4ncyA8aT5jbGFzc3BhdGg8L2k+IGFuZCA8aT5leHRkaXJzPC9pPiBhdHRyaWJ1dGVzIGFyZSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAotPGk+Y2xhc3NwYXRoPC9pPiBhbmQgPGk+ZXh0ZGlyczwvaT4gZWxlbWVudHMuPC9wPgorPHA+PGNvZGU+Um1pYzwvY29kZT4ncyA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhbmQgPHZhcj5leHRkaXJzPC92YXI+IGF0dHJpYnV0ZXMKK2FyZSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmU8L2E+IGFuZCBjYW4gYWxzbyBiZSBzZXQgdmlhIGEgbmVzdGVkCis8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGFuZCA8Y29kZT5leHRkaXJzPC9jb2RlPiBlbGVtZW50cy48L3A+CiAKIDxoND5jb21waWxlcmFyZzwvaDQ+CiAKLTxwPllvdSBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlcgotd2l0aCBuZXN0ZWQgPGNvZGU+Jmx0O2NvbXBpbGVyYXJnJmd0OzwvY29kZT4gZWxlbWVudHMuICBUaGVzZSBlbGVtZW50cwotYXJlIHNwZWNpZmllZCBsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUKLUFyZ3VtZW50czwvYT4gYnV0IGhhdmUgYW4gYWRkaXRpb25hbCBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgdXNlZCB0bwotZW5hYmxlIGFyZ3VtZW50cyBvbmx5IGlmIGEgZ2l2ZW4gY29tcGlsZXIgaW1wbGVtZW50YXRpb24gd2lsbCBiZQotdXNlZC48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHA+WW91IGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyIHdpdGgKK25lc3RlZCA8Y29kZT4mbHQ7Y29tcGlsZXJhcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gIFRoZXNlIGVsZW1lbnRzIGFyZSBzcGVjaWZpZWQKK2xpa2UgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+IGJ1dCBoYXZlIGFuIGFkZGl0aW9uYWwgYXR0cmlidXRlIHRoYXQKK2NhbiBiZSB1c2VkIHRvIGVuYWJsZSBhcmd1bWVudHMgb25seSBpZiBhIGdpdmVuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjQiPlNlZQotICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjQiPlNlZSA8YSBocmVmPSIuLi91c2luZy5odG1sI2FyZyI+Q29tbWFuZC1saW5lIEFyZ3VtZW50czwvYT4uPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5saW5lPC90ZD4KKyAgICA8dGQgY2xhc3M9InZhciI+bGluZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0idmFyIj5maWxlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0aDwvdGQ+CisgICAgPHRkIGNsYXNzPSJ2YXIiPnBhdGg8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5TZWUKKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+U2VlCiAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+LgotICAgIDxlbT5TaW5jZSBBbnQgMS44LjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8ZW0+U2luY2UgQW50IDEuODwvZW0+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VmZml4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21waWxlcjwvdGQ+Ci0gICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4KLSAgICAgIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlIHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAgTGVnYWwgdmFsdWVzIGFyZSB0aGUKLSAgICAgIHNhbWUgYXMgdGhvc2UgaW4gdGhlIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQKLSAgICAgIGNvbXBpbGVycy4pPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jb21waWxlcjwvdGQ+CisgICAgPHRkPk9ubHkgcGFzcyB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50IGlmIHRoZSBjaG9zZW4gY29tcGlsZXIgaW1wbGVtZW50YXRpb24gbWF0Y2hlcyB0aGUgdmFsdWUgb2YKKyAgICAgIHRoaXMgYXR0cmlidXRlLiAgTGVnYWwgdmFsdWVzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBpbiB0aGUKKyAgICAgIGFib3ZlIDxhIGhyZWY9IiNjb21waWxlcnZhbHVlcyI+bGlzdDwvYT4gb2YgdmFsaWQgY29tcGlsZXJzLik8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+Y29tcGlsZXJjbGFzc3BhdGggPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC9oND4KKzxoND5jb21waWxlcmNsYXNzcGF0aDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5BIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gaG9sZGluZyB0aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvYWRpbmcKK3RoZSBjb21waWxlciBpbXBsZW1lbnRhdGlvbiBpZiBhIGN1c3RvbSBjbGFzcyBoYXMgYmVlbiBzcGVjaWZpZWQuICBEb2Vzbid0IGhhdmUgYW55IGVmZmVjdCB3aGVuCit1c2luZyBvbmUgb2YgdGhlIGJ1aWx0LWluIGNvbXBpbGVycy48L3A+CiAKLTxwPkEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBob2xkaW5nIHRoZQotICBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9hZGluZyB0aGUgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gaWYgYQotICBjdXN0b20gY2xhc3MgaGFzIGJlZW4gc3BlY2lmaWVkLiAgRG9lc24ndCBoYXZlIGFueSBlZmZlY3Qgd2hlbgotICB1c2luZyBvbmUgb2YgdGhlIGJ1aWx0LWluIGNvbXBpbGVycy48L3A+Ci0KLTxoND5BbnkgbmVzdGVkIGVsZW1lbnQgb2YgYSB0eXBlIHRoYXQgaW1wbGVtZW50cyBSbWljQWRhcHRlcgotICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L2g0PgotCi08cD5JZiBhIGRlZmluZWQgdHlwZSBpbXBsZW1lbnRzIHRoZSA8Y29kZT5SbWljQWRhcHRlcjwvY29kZT4KLSAgaW50ZXJmYWNlIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhhdCB0eXBlIGNhbiBiZSB1c2VkIGFzIGFuCi0gIGFsdGVybmF0aXZlIHRvIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4gYXR0cmlidXRlLjwvcD4KKzxoND5BbnkgbmVzdGVkIGVsZW1lbnQgb2YgYSB0eXBlIHRoYXQgaW1wbGVtZW50cyBSbWljQWRhcHRlcjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5JZiBhIGRlZmluZWQgdHlwZSBpbXBsZW1lbnRzIHRoZSA8Y29kZT5SbWljQWRhcHRlcjwvY29kZT4gaW50ZXJmYWNlIGEgbmVzdGVkIGVsZW1lbnQgb2YgdGhhdCB0eXBlCitjYW4gYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj5jb21waWxlcjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDtybWljIGNsYXNzbmFtZT0mcXVvdDtjb20ueHl6LkZvb0JhciZxdW90OyBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsvJmd0OzwvcHJlPgotPHA+cnVucyB0aGUgcm1pYyBjb21waWxlciBmb3IgdGhlIGNsYXNzIDxjb2RlPmNvbS54eXouRm9vQmFyPC9jb2RlPi4gVGhlCi1jb21waWxlZCBmaWxlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZGlyZWN0b3J5IDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+LjwvcD4KLTxwcmU+ICAmbHQ7cm1pYyBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovUmVtb3RlKi5jbGFzcyZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5ydW5zIHRoZSBybWljIGNvbXBpbGVyIGZvciBhbGwgY2xhc3NlcyB3aXRoIDxjb2RlPi5jbGFzczwvY29kZT4KLWZpbGVzIGJlbG93IDxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+IHdob3NlIGNsYXNzbmFtZSBzdGFydHMgd2l0aAotPGk+UmVtb3RlPC9pPi4gVGhlIGNvbXBpbGVkIGZpbGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBkaXJlY3RvcnkKLTxjb2RlPiR7YnVpbGR9L2NsYXNzZXM8L2NvZGU+LjwvcD4KIAotPHA+SWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tCi0gIFJtaWNBZGFwdGVyIDxjb2RlPm9yZy5leGFtcGxlLk15QWRhcHRlcjwvY29kZT4geW91IGNhbiBlaXRoZXIKLSAgdXNlIHRoZSBjb21waWxlciBhdHRyaWJ1dGU6PC9wPgorPHA+UnVuIHRoZSA8a2JkPnJtaWM8L2tiZD4gY29tcGlsZXIgZm9yIHRoZSBjbGFzcyA8Y29kZT5jb20ueHl6LkZvb0JhcjwvY29kZT4uIFRoZSBjb21waWxlZCBmaWxlcword2lsbCBiZSBzdG9yZWQgaW4gdGhlIGRpcmVjdG9yeSA8c2FtcD4ke2J1aWxkfS9jbGFzc2VzPC9zYW1wPi48L3A+Cis8cHJlPiZsdDtybWljIGNsYXNzbmFtZT0mcXVvdDtjb20ueHl6LkZvb0JhciZxdW90OyBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5SdW4gdGhlIDxrYmQ+cm1pYzwva2JkPiBjb21waWxlciBmb3IgYWxsIGNsYXNzZXMgd2l0aCA8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzCitiZWxvdyA8c2FtcD4ke2J1aWxkfS9jbGFzc2VzPC9zYW1wPiB3aG9zZSBjbGFzc25hbWUgc3RhcnRzIHdpdGggPGNvZGU+UmVtb3RlPC9jb2RlPi4gVGhlIGNvbXBpbGVkCitmaWxlcyB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgZGlyZWN0b3J5IDxzYW1wPiR7YnVpbGR9L2NsYXNzZXM8L3NhbXA+LjwvcD4KKzxwcmU+Jmx0O3JtaWMgYmFzZT0mcXVvdDske2J1aWxkfS9jbGFzc2VzJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqL1JlbW90ZSouY2xhc3MmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5JZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20gUm1pY0FkYXB0ZXIgPGNvZGU+b3JnLmV4YW1wbGUuTXlBZGFwdGVyPC9jb2RlPiB5b3UgY2FuIGVpdGhlciB1c2UKK3RoZSA8dmFyPmNvbXBpbGVyPC92YXI+IGF0dHJpYnV0ZTo8L3A+CiA8cHJlPgogJmx0O3JtaWMgY2xhc3NuYW1lPSZxdW90O2NvbS54eXouRm9vQmFyJnF1b3Q7CiAgICAgICBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsKLSAgICAgIGNvbXBpbGVyPSJvcmcuZXhhbXBsZS5NeUFkYXB0ZXIiLyZndDsKLTwvcHJlPgorICAgICAgY29tcGlsZXI9Im9yZy5leGFtcGxlLk15QWRhcHRlciIvJmd0OzwvcHJlPgogPHA+b3IgYSBkZWZpbmUgYSB0eXBlIGFuZCBuZXN0IHRoaXMgaW50byB0aGUgdGFzayBsaWtlIGluOjwvcD4KIDxwcmU+CiAmbHQ7Y29tcG9uZW50ZGVmIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuTXlBZGFwdGVyIgpAQCAtMzY0LDExICszMjUsOCBAQAogJmx0O3JtaWMgY2xhc3NuYW1lPSZxdW90O2NvbS54eXouRm9vQmFyJnF1b3Q7CiAgICAgICBiYXNlPSZxdW90OyR7YnVpbGR9L2NsYXNzZXMmcXVvdDsmZ3Q7CiAgICZsdDtteWFkYXB0ZXIvJmd0OwotJmx0Oy9ybWljJmd0OwotPC9wcmU+Ci08cD5pbiB3aGljaCBjYXNlIHlvdXIgY29tcGlsZXIgYWRhcHRlciBjYW4gc3VwcG9ydCBhdHRyaWJ1dGVzIGFuZAotICBuZXN0ZWQgZWxlbWVudHMgb2YgaXRzIG93bi48L3A+CismbHQ7L3JtaWMmZ3Q7PC9wcmU+Cis8cD5pbiB3aGljaCBjYXNlIHlvdXIgY29tcGlsZXIgYWRhcHRlciBjYW4gc3VwcG9ydCBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgb2YgaXRzIG93bi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3JwbS5odG1sIGIvbWFudWFsL1Rhc2tzL3JwbS5odG1sCmluZGV4IDY5MWQzOTEuLjM2YTZjYjAgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9ycG0uaHRtbAorKysgYi9tYW51YWwvVGFza3MvcnBtLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNSw3ICsxNiw3IEBACiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgpAQCAtMjQsMTAwICsyNSw4NiBAQAogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InJwbSI+UnBtPC9hPjwvaDI+Cis8aDIgaWQ9InJwbSI+UnBtPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD4KLSAgQSBiYXNpYyB0YXNrIGZvciBpbnZva2luZyB0aGUgcnBtIGV4ZWN1dGFibGUgdG8gYnVpbGQgYSBSZWRIYXQgUGFja2FnZSBNYW5hZ2VyIExpbnV4IGluc3RhbGxhdGlvbgotICBmaWxlLiBUaGUgdGFzayBjdXJyZW50bHkgb25seSB3b3JrcyBvbiBMaW51eCBvciBvdGhlciBVbml4IHBsYXRmb3JtcyB3aXRoIHJwbSBzdXBwb3J0LgotPC9wPgorPHA+IEEgYmFzaWMgdGFzayBmb3IgaW52b2tpbmcgdGhlIDxjb2RlPnJwbTwvY29kZT4gZXhlY3V0YWJsZSB0byBidWlsZCBhIFJlZEhhdCBQYWNrYWdlIE1hbmFnZXIKK0xpbnV4IGluc3RhbGxhdGlvbiBmaWxlLiBUaGUgdGFzayBjdXJyZW50bHkgb25seSB3b3JrcyBvbiBMaW51eCBvciBvdGhlciBVbml4IHBsYXRmb3Jtcword2l0aCA8Y29kZT5ycG08L2NvZGU+IHN1cHBvcnQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNGaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBzcGVjIGZpbGUgdG8gYmUgdXNlZC4gVGhpcyBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBTUEVDUyBkaXJlY3RvcnkKLSAgICB1bmRlciB0aGUgcm9vdCBvZiB0aGUgUlBNIHNldCBpbiB0aGUgdG9wRGlyIGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3BlY0ZpbGU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgc3BlYyBmaWxlIHRvIGJlIHVzZWQuIFRoaXMgbXVzdCBiZSByZWxhdGl2ZSB0byB0aGUgPHNhbXA+U1BFQ1M8L3NhbXA+CisgICAgICBkaXJlY3RvcnkgdW5kZXIgdGhlIHJvb3Qgb2YgdGhlIFJQTSBzZXQgaW4gdGhlIDx2YXI+dG9wRGlyPC92YXI+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50b3BEaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGlzIGlzIHRoZSBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBoYXZlIHRoZSBleHBlY3RlZAotICAgICAgc3ViZGlyZWN0b3JpZXMsIFNQRUNTLCBTT1VSQ0VTLCBCVUlMRCwgU1JQTVMuICBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCwKLSAgICAgIHRoZSBkZWZhdWx0IFJQTSBkaXJlY3Rvcnkgb2YgdGhlIHN5c3RlbSAob3IgdXNlciwgaWYgfi8ucnBtbWFjcm9zIGRlZmluZXMgaXQpIGlzIHVzZWQgKG9mdGVuCi0gICAgICAvdXNyL3NyYy9ycG0uPGJyPgotICAgICAgRGVmaW5pbmcgYSB0b3BkaXIgd2lsbCBzZXQgPHR0PiVfdG9wZGlyPC90dD4gdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgLXRoZXJlIGlzIG5vIG5lZWQKLSAgICAgIHRvIGVkaXQgeW91ciAucnBtbWFjcm9zIGZpbGUuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBidXQgeW91ciBidWlsZCBmaWxlIGlzIHZlcnkgYnJpdHRsZSBpZiBpdCBpcyBub3Qgc2V0LjwvdGQ+CisgICAgPHRkPnRvcERpcjwvdGQ+CisgICAgPHRkPlRoaXMgaXMgdGhlIGRpcmVjdG9yeSB3aGljaCB3aWxsIGhhdmUgdGhlIGV4cGVjdGVkCisgICAgICBzdWJkaXJlY3RvcmllcywgPHNhbXA+U1BFQ1M8L3NhbXA+LCA8c2FtcD5TT1VSQ0VTPC9zYW1wPiwgPHNhbXA+QlVJTEQ8L3NhbXA+LCA8c2FtcD5TUlBNUzwvc2FtcD4uCisgICAgICBJZiB0aGlzIGlzbid0IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgUlBNIGRpcmVjdG9yeSBvZiB0aGUgc3lzdGVtIChvciB1c2VyLAorICAgICAgaWYgPHNhbXA+fi8ucnBtbWFjcm9zPC9zYW1wPiBkZWZpbmVzIGl0KSBpcyB1c2VkIChvZnRlbiA8c2FtcD4vdXNyL3NyYy9ycG08L3NhbXA+Ljxici8+CisgICAgICBEZWZpbmluZyBhIDx2YXI+dG9wZGlyPC92YXI+IHdpbGwgc2V0IDxjb2RlPiVfdG9wZGlyPC9jb2RlPiB0byB0aGUgc3BlY2lmaWVkCisgICAgICBkaXJlY3RvcnkmbWRhc2g7dGhlcmUgaXMgbm8gbmVlZCB0byBlZGl0IHlvdXIgPHNhbXA+LnJwbW1hY3Jvczwvc2FtcD4gZmlsZS48L3RkPgorICAgIDx0ZD5ObywgYnV0IHlvdXIgYnVpbGQgZmlsZSBpcyB2ZXJ5IGJyaXR0bGUgaWYgaXQgaXMgbm90IHNldC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGVhbkJ1aWxkRGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgd2lsbCByZW1vdmUgdGhlIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgQlVJTEQKLSAgICAgIGRpcmVjdG9yeS4KLSAgICAgIFNlZSB0aGUgdGhlIDx0dD4tLWNsZWFuPC90dD4gb3B0aW9uIG9mIHJwbWJ1aWxkLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsZWFuQnVpbGREaXI8L3RkPgorICAgIDx0ZD5UaGlzIHdpbGwgcmVtb3ZlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIDxzYW1wPkJVSUxEPC9zYW1wPiBkaXJlY3RvcnkuICBTZWUgdGhlCisgICAgICB0aGUgPGtiZD4tLWNsZWFuPC9rYmQ+IG9wdGlvbiBvZiA8a2JkPnJwbWJ1aWxkPC9rYmQ+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3ZlU3BlYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIHdpbGwgcmVtb3ZlIHRoZSBzcGVjIGZpbGUgZnJvbSBTUEVDUy4KLSAgICAgIFNlZSB0aGUgdGhlIDx0dD4tLXJtc3BlYzwvdHQ+IG9wdGlvbiBvZiBycG1idWlsZC4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5yZW1vdmVTcGVjPC90ZD4KKyAgICA8dGQ+VGhpcyB3aWxsIHJlbW92ZSB0aGUgc3BlYyBmaWxlIGZyb20gPHNhbXA+U1BFQ1M8L3NhbXA+LiAgU2VlIHRoZSB0aGUgPGtiZD4tLXJtc3BlYzwva2JkPgorICAgICAgb3B0aW9uIG9mIDxrYmQ+cnBtYnVpbGQ8L2tiZD4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdmVTb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RmxhZyAob3B0aW9uYWwsIGRlZmF1bHQ9ZmFsc2UpIAotICAgICAgICB0byByZW1vdmUgdGhlIHNvdXJjZXMgYWZ0ZXIgdGhlIGJ1aWxkLgotICAgICAgICBTZWUgdGhlIHRoZSA8dHQ+LS1ybXNvdXJjZTwvdHQ+IG9wdGlvbiBvZiBycG1idWlsZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5yZW1vdmVTb3VyY2U8L3RkPgorICAgIDx0ZD5GbGFnIHRvIHJlbW92ZSB0aGUgc291cmNlcyBhZnRlciB0aGUgYnVpbGQuICBTZWUgdGhlIDxrYmQ+LS1ybXNvdXJjZTwva2JkPiBvcHRpb24KKyAgICAgIG9mIDxrYmQ+cnBtYnVpbGQ8L2tiZD4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cnBtQnVpbGRDb21tYW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBleGVjdXRhYmxlIHRvIHVzZSBmb3IgYnVpbGRpbmcgdGhlIFJQTS4KLSAgICAgIERlZmF1bHRzIHRvIDxjb2RlPnJwbWJ1aWxkPC9jb2RlPiBpZiBpdCBjYW4gYmUgZm91bmQgb3IKLSAgICAgIDxjb2RlPnJwbTwvY29kZT4gb3RoZXJ3aXNlLiAgU2V0IHRoaXMgaWYgeW91IGRvbid0IGhhdmUgZWl0aGVyIG9uCi0gICAgICB5b3VyIFBBVEggb3Igd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgZXhlY3V0YWJsZS4gIDxlbT5TaW5jZSBBcGFjaGUgQW50Ci0gICAgICAxLjY8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ycG1CdWlsZENvbW1hbmQ8L3RkPgorICAgIDx0ZD5UaGUgZXhlY3V0YWJsZSB0byB1c2UgZm9yIGJ1aWxkaW5nIHRoZSBSUE0uIFNldCB0aGlzIGlmIGRlZmF1bHQgZXhlY3V0YWJsZXMgYXJlIG5vdCBvbgorICAgICAgPGNvZGU+UEFUSDwvY29kZT4gb3IgYSBkaWZmZXJlbnQgZXhlY3V0YWJsZSBpcyBuZWVkZWQuICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPGtiZD5ycG1idWlsZDwva2JkPiBpZiBpdCBjYW4gYmUgZm91bmQgb3IgPGtiZD5ycG08L2tiZD4gb3RoZXJ3aXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tbWFuZCB0byBwYXNzIHRvIHRoZSBycG1idWlsZCBwcm9ncmFtLiBUaGUgZGVmYXVsdCBpcyAiLWJiIjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNvbW1hbmQ8L3RkPgorICAgIDx0ZD5UaGUgY29tbWFuZCB0byBwYXNzIHRvIHRoZSA8Y29kZT5ycG1idWlsZDwvY29kZT4gcHJvZ3JhbS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8a2JkPi1iYjwva2JkPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnF1aWV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN1cHByZXNzIG91dHB1dC4gRGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cXVpZXQ8L3RkPgorICAgIDx0ZD5TdXBwcmVzcyBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dC9lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGVyZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIGdvPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3V0cHV0L2Vycm9yPC90ZD4KKyAgICA8dGQ+V2hlcmUgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBnby48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxPbkVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiB0aGUgUlBNIGJ1aWxkIGNvbW1hbmQgZXhpdHMgd2l0aCAKLSAgICAgICBhIG5vbi16ZXJvIHJldHVybmNvZGUuIERlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbE9uRXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIHRoZSBSUE0gYnVpbGQgY29tbWFuZCBleGl0cyB3aXRoIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogPHByZT4KLSAgICAmbHQ7cnBtCi0gICAgICAgIHNwZWNGaWxlPSJleGFtcGxlLnNwZWMiCi0gICAgICAgIHRvcERpcj0iYnVpbGQvcnBtIgotICAgICAgICBjbGVhbkJ1aWxkRGlyPSJ0cnVlIgotICAgICAgICBmYWlsT25FcnJvcj0idHJ1ZSIvJmd0OwotPC9wcmU+CismbHQ7cnBtIHNwZWNGaWxlPSJleGFtcGxlLnNwZWMiCisgICAgIHRvcERpcj0iYnVpbGQvcnBtIgorICAgICBjbGVhbkJ1aWxkRGlyPSJ0cnVlIgorICAgICBmYWlsT25FcnJvcj0idHJ1ZSIvJmd0OzwvcHJlPgogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc2NoZW1hdmFsaWRhdGUuaHRtbCBiL21hbnVhbC9UYXNrcy9zY2hlbWF2YWxpZGF0ZS5odG1sCmluZGV4IDFhYWMyZWYuLmFkZWYxZDkgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zY2hlbWF2YWxpZGF0ZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zY2hlbWF2YWxpZGF0ZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNyArMTUsNyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CkBAIC0yMywyNjEgKzI0LDIyNiBAQAogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InNjaGVtYXZhbGlkYXRlIj5TY2hlbWFWYWxpZGF0ZTwvYT48L2gyPgorPGgyIGlkPSJzY2hlbWF2YWxpZGF0ZSI+U2NoZW1hVmFsaWRhdGU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+VGhpcyA8dHQ+c2NoZW1hdmFsaWRhdGU8L3R0PiB0YXNrIHZhbGlkYXRlcyBYTUwgZmlsZXMgZGVzY3JpYmVkIGJ5IGFuIFhNTCBTY2hlbWEuCi1UaGUgdGFzayBleHRlbmRzIHRoZSBYbWxWYWxpZGF0ZSB0YXNrIHdpdGggWFNELXNwZWNpZmljIGZlYXR1cmVzLjwvcD4KKzxwPlRoaXMgPGNvZGU+c2NoZW1hdmFsaWRhdGU8L2NvZGU+IHRhc2sgdmFsaWRhdGVzIFhNTCBmaWxlcyBkZXNjcmliZWQgYnkgYW4gWE1MIFNjaGVtYS4gIFRoZSB0YXNrCitleHRlbmRzIHRoZSA8Y29kZT5YbWxWYWxpZGF0ZTwvY29kZT4gdGFzayB3aXRoIFhTRC1zcGVjaWZpYyBmZWF0dXJlcy48L3A+CiA8b2w+Ci08bGk+VGhlIHBhcnNlciBpcyBjcmVhdGVkIHZhbGlkYXRpbmcgYW5kIG5hbWVzcGFjZSBhd2FyZQotPC9saT4KLTxsaT5WYWxpZGF0aW9uIGlzIHR1cm5lZCBvbi48L2xpPgotPGxpPlNjaGVtYSB2YWxpZGF0aW9uIGlzIHR1cm5lZCBvbi48L2xpPgotPGxpPkFueSBuby1uYW1lc3BhY2Ugc2NoZW1hIFVSTCBvciBmaWxlIHN1cHBsaWVkIGlzIHVzZWQgYXMgdGhlIG5vLW5hbWVzcGFjZSBzY2hlbWEKLTxsaT5BbGwgbmVzdGVkIHNjaGVtYSBkZWNsYXJhdGlvbnMgYXJlIHR1cm5lZCBpbnRvIHRoZSBsaXN0IG9mIG5hbWVzcGFjZS11cmwKLWJpbmRpbmdzIGZvciBzY2hlbWEgbG9va3VwLgorICA8bGk+VGhlIHBhcnNlciBpcyBjcmVhdGVkIHZhbGlkYXRpbmcgYW5kIG5hbWVzcGFjZSBhd2FyZS48L2xpPgorICA8bGk+VmFsaWRhdGlvbiBpcyB0dXJuZWQgb24uPC9saT4KKyAgPGxpPlNjaGVtYSB2YWxpZGF0aW9uIGlzIHR1cm5lZCBvbi48L2xpPgorICA8bGk+QW55IG5vLW5hbWVzcGFjZSBzY2hlbWEgVVJMIG9yIGZpbGUgc3VwcGxpZWQgaXMgdXNlZCBhcyB0aGUgbm8tbmFtZXNwYWNlIHNjaGVtYS48L2xpPgorICA8bGk+QWxsIG5lc3RlZCBzY2hlbWEgZGVjbGFyYXRpb25zIGFyZSB0dXJuZWQgaW50byB0aGUgbGlzdCBvZiBuYW1lc3BhY2UtdXJsIGJpbmRpbmdzIGZvciBzY2hlbWEKKyAgICBsb29rdXAuPC9saT4KIDwvb2w+CiAKLU5vdGUgdGhhdCBuZXN0ZWQgY2F0YWxvZ3MgYXJlIHN0aWxsIHVzZWQgZm9yIGxvb2t1cCBvZiB0aGUgVVJMcyBnaXZlbiBhcyB0aGUKLXNvdXJjZXMgb2Ygc2NoZW1hIGRvY3VtZW50cywgc28geW91IGNhbiBzdGlsbCBkZWxlZ2F0ZSBsb29rdXAgdG8gYSBjYXRhbG9nLCB5b3UKLWp1c3QgbmVlZCB0byBsaXN0IGFsbCBzY2hlbWEgVVJJcyBhbmQgdGhlaXIgVVJMIGVxdWl2YWxlbnRzLgorPHA+Tm90ZSB0aGF0IG5lc3RlZCBjYXRhbG9ncyBhcmUgc3RpbGwgdXNlZCBmb3IgbG9va3VwIG9mIHRoZSBVUkxzIGdpdmVuIGFzIHRoZSBzb3VyY2VzIG9mIHNjaGVtYQorZG9jdW1lbnRzLCBzbyB5b3UgY2FuIHN0aWxsIGRlbGVnYXRlIGxvb2t1cCB0byBhIGNhdGFsb2csIHlvdSBqdXN0IG5lZWQgdG8gbGlzdCBhbGwgc2NoZW1hIFVSSXMgYW5kCit0aGVpciBVUkwgZXF1aXZhbGVudHMuPC9wPgogCi08cD5UaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBuZXN0ZWQKLSAgPGxpPjxhIGhyZWY9Ii4uL1R5cGVzL3htbGNhdGFsb2cuaHRtbCI+PHR0PiZsdDt4bWxjYXRhbG9nJmd0OzwvdHQ+PC9hPiBlbGVtZW50czwvbGk+Ci0gIDxsaT4gPHR0PiZsdDtzY2hlbWEmZ3Q7PC90dD4gZWxlbWVudHMsIHRoYXQgYmluZCBhIG5hbWVzcGFjZSBVUkkgdG8gYSBVUkwgb3IgYQotICBsb2NhbCBmaWxlbmFtZS4KLSAgPGxpPjx0dD4mbHQ7ZHRkJmd0OzwvdHQ+IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHJlc29sdmUgRFREcyBhbmQgZW50aXRpZXMuPC9saT4KLSAgPGxpPjx0dD4mbHQ7YXR0cmlidXRlJmd0OzwvdHQ+IGVsZW1lbnRzIHdoaWNoIGFyZSB1c2VkIHRvIHNldCBmZWF0dXJlcyBvbiB0aGUgcGFyc2VyLgotICAgICAgVGhlc2UgY2FuIGJlIGFueSBudW1iZXIgb2YKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iPjx0dD5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvPC90dD48L2E+Ci0gICAgICBvciBvdGhlciBmZWF0dXJlcyB0aGF0IHlvdXIgcGFyc2VyIG1heSBzdXBwb3J0LjwvbGk+Ci0gIDxsaT48dHQ+Jmx0O3Byb3BlcnR5Jmd0OzwvdHQ+IGVsZW1lbnRzLCBjb250YWluaW5nIHN0cmluZyBwcm9wZXJ0aWVzCi08L3A+Cis8cD5UaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBuZXN0ZWQ8L3A+Cis8dWw+CisgIDxsaT48YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjxjb2RlPiZsdDt4bWxjYXRhbG9nJmd0OzwvY29kZT48L2E+IGVsZW1lbnRzPC9saT4KKyAgPGxpPjxjb2RlPiZsdDtzY2hlbWEmZ3Q7PC9jb2RlPiBlbGVtZW50cywgdGhhdCBiaW5kIGEgbmFtZXNwYWNlIFVSSSB0byBhIFVSTCBvciBhIGxvY2FsCisgICAgZmlsZW5hbWUuPC9saT4KKyAgPGxpPjxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aGljaCBhcmUgdXNlZCB0byByZXNvbHZlIERURHMgYW5kIGVudGl0aWVzLjwvbGk+CisgIDxsaT48Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gc2V0IGZlYXR1cmVzIG9uIHRoZSBwYXJzZXIuICBUaGVzZQorICAgIGNhbiBiZSBhbnkgbnVtYmVyCisgICAgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKKyAgICB0YXJnZXQ9Il90b3AiPjxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy88L2NvZGU+PC9hPiBvciBvdGhlciBmZWF0dXJlcyB0aGF0IHlvdXIgcGFyc2VyCisgICAgbWF5IHN1cHBvcnQuPC9saT4KKyAgPGxpPjxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzLCBjb250YWluaW5nIHN0cmluZyBwcm9wZXJ0aWVzPC9saT4KKzwvdWw+CiAKLTxwPgotVGhlIHRhc2sgb25seSBzdXBwb3J0cyBTQVgyIG9yIGxhdGVyIHBhcnNlcnM6IGl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgYSBTQVgxCi1wYXJzZXIuIAotCis8cD5UaGUgdGFzayBvbmx5IHN1cHBvcnRzIFNBWDIgb3IgbGF0ZXIgcGFyc2VyczogaXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIFNBWDEgcGFyc2VyLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIHBhcnNlciB0byB1c2UuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQ+dGhlIHBhcnNlciB0byB1c2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzLiAKLSAgICBPcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgPHR0PiZsdDtjbGFzc3BhdGgmZ3Q7PC90dD4gZWxlbWVudC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZD53aGVyZSB0byBmaW5kIHRoZSBwYXJzZXIgY2xhc3MuICBPcHRpb25hbGx5IGNhbiB1c2UgYW4KKyAgICAgIGVtYmVkZGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlzYWJsZURURDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIEZsYWcgdG8gZGlzYWJsZSBEVEQgc3VwcG9ydC4gRFREIHN1cHBvcnQgaXMgbmVlZGVkIHRvIAotICAgICAgdmFsaWRhdGUgWFNEIGZpbGVzIHRoZW1zZWx2ZXMsIGFtb25nc3Qgb3RoZXJzLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgZmFsc2U8L3RkPgorICAgIDx0ZD5kaXNhYmxlRFREPC90ZD4KKyAgICA8dGQ+RmxhZyB0byBkaXNhYmxlIERURCBzdXBwb3J0LiBEVEQgc3VwcG9ydCBpcyBuZWVkZWQgdG8gdmFsaWRhdGUgWFNEIGZpbGVzIHRoZW1zZWx2ZXMsIGFtb25nc3QKKyAgICAgIG90aGVycy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlscyBvbiBhIGVycm9yIGlmIHNldCB0byB0cnVlIChkZWZhdWx0cyB0byB0cnVlKS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPmZhaWxzIG9uIGEgZXJyb3IgaWYgc2V0IHRvIDxxPnRydWU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2suIChvcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgZmlsZXNldCk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2sgKG9wdGlvbmFsbHkgdXNlIGFuIGVtYmVkZGVkIGZpbGVzZXQpLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZnVsbGNoZWNraW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgZW5hYmxlIGZ1bGwgc2NoZW1hIGNoZWNraW5nLiBTbG93IGJ1dCBzdHJpY3QuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCB0cnVlPC90ZD4KLSAgPC90cj4KLSAgCi0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxlbmllbnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBpZiB0cnVlLCBvbmx5IGNoZWNrIHRoZSBYTUwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQKLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mdWxsY2hlY2tpbmc8L3RkPgorICAgIDx0ZD5lbmFibGUgZnVsbCBzY2hlbWEgY2hlY2tpbmcuIFNsb3cgYnV0IHN0cmljdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5vTmFtZXNwYWNlRmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIGZpbGVuYW1lIG9mIGEgbm8tbmFtZXNwYWNlIFhTRCBmaWxlIHRvIHByb3ZpZGUgdGhlIAotICAgICAgc2NoZW1hIGZvciBuby1uYW1lc3BhY2UgWE1MIGNvbnRlbnQuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bGVuaWVudDwvdGQ+CisgICAgPHRkPmlmIDxxPnRydWU8L3E+LCBvbmx5IGNoZWNrIHRoZSBYTUwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5vTmFtZXNwYWNlVVJMPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVVJMIG9mIGEgbm8tbmFtZXNwYWNlIFhTRCBmaWxlIHRvIHByb3ZpZGUgdGhlIAotICAgICAgc2NoZW1hIGZvciBuby1uYW1lc3BhY2UgWE1MIGNvbnRlbnQuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bm9OYW1lc3BhY2VGaWxlPC90ZD4KKyAgICA8dGQ+ZmlsZW5hbWUgb2YgYSBuby1uYW1lc3BhY2UgWFNEIGZpbGUgdG8gcHJvdmlkZSB0aGUgc2NoZW1hIGZvciBuby1uYW1lc3BhY2UgWE1MIGNvbnRlbnQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndhcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9nIHBhcnNlciB3YXJuIGV2ZW50cy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ub05hbWVzcGFjZVVSTDwvdGQ+CisgICAgPHRkPlVSTCBvZiBhIG5vLW5hbWVzcGFjZSBYU0QgZmlsZSB0byBwcm92aWRlIHRoZSBzY2hlbWEgZm9yIG5vLW5hbWVzcGFjZSBYTUwgY29udGVudDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53YXJuPC90ZD4KKyAgICA8dGQ+bG9nIHBhcnNlciB3YXJuIGV2ZW50czwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgotCis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PnNjaGVtYTwvaDQ+Ci08cD4KLUlkZW50aWZ5IHRoZSBuYW1lIGFuZCBsb2NhdGlvbiBvZiBhIHNjaGVtYSB0aGF0IG1heSBiZSB1c2VkIGluIHZhbGlkYXRpbmcKLXRoZSBkb2N1bWVudChzKS4KLTwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5JZGVudGlmeSB0aGUgbmFtZSBhbmQgbG9jYXRpb24gb2YgYSBzY2hlbWEgdGhhdCBtYXkgYmUgdXNlZCBpbiB2YWxpZGF0aW5nIHRoZSBkb2N1bWVudChzKS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lc3BhY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VVJJIG9mIHRoZSBzY2hlbWEgbmFtZXNwYWNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWVzcGFjZTwvdGQ+CisgICAgPHRkPlVSSSBvZiB0aGUgc2NoZW1hIG5hbWVzcGFjZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVybDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5VUkwgb2YgdGhlIHNjaGVtYTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5PbmUgb2YgdXJsIG9yIGZpbGUgaXMgcmVxdWlyZWQ8L3RkPgorICAgIDx0ZD51cmw8L3RkPgorICAgIDx0ZD5VUkwgb2YgdGhlIHNjaGVtYTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mIHRoZSB0d288L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgb2YgdGhlIHNjaGVtYTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5PbmUgb2YgdXJsIG9yIGZpbGUgaXMgcmVxdWlyZWQ8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmZpbGUgb2YgdGhlIHNjaGVtYTwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+ZHRkPC9oND4KLTxwPgotPHR0PiZsdDtkdGQmZ3Q7PC90dD4gaXMgdXNlZCB0byBzcGVjaWZ5IGRpZmZlcmVudCBsb2NhdGlvbnMgZm9yIERURCByZXNvbHV0aW9uLgotPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPjxjb2RlPiZsdDtkdGQmZ3Q7PC9jb2RlPiBpcyB1c2VkIHRvIHNwZWNpZnkgZGlmZmVyZW50IGxvY2F0aW9ucyBmb3IgRFREIHJlc29sdXRpb24uPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KIDx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHVibGljSWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UHVibGljIElEIG9mIHRoZSBEVEQgdG8gcmVzb2x2ZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5wdWJsaWNJZDwvdGQ+CisgICAgPHRkPlB1YmxpYyBJRCBvZiB0aGUgRFREIHRvIHJlc29sdmU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiB0aGUgRFREIHRvIHVzZSwgd2hpY2ggY2FuIGJlIGEgZmlsZSwKKyAgICA8dGQ+bG9jYXRpb248L3RkPgorICAgIDx0ZD5Mb2NhdGlvbiBvZiB0aGUgRFREIHRvIHVzZSwgd2hpY2ggY2FuIGJlIGEgZmlsZSwKICAgICBhIHJlc291cmNlLCBvciBhIFVSTDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoND54bWxjYXRhbG9nPC9oND4KLTxwPlRoZSA8YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjx0dD4mbHQ7eG1sY2F0YWxvZyZndDs8L3R0PjwvYT4KLWVsZW1lbnQgaXMgdXNlZCB0byBwZXJmb3JtIGVudGl0eSByZXNvbHV0aW9uLjwvcD4KKzxwPlRoZSA8YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjxjb2RlPiZsdDt4bWxjYXRhbG9nJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgaXMgdXNlZCB0bworcGVyZm9ybSBlbnRpdHkgcmVzb2x1dGlvbi48L3A+CiA8aDQ+YXR0cmlidXRlPC9oND4KLTxwPlRoZSA8dHQ+Jmx0O2F0dHJpYnV0ZSZndDs8L3R0PiBlbGVtZW50IGlzIHVzZWQgdG8gc2V0IHBhcnNlciBmZWF0dXJlcy48YnI+Ci1GZWF0dXJlcyB1c2FibGUgd2l0aCB0aGUgeGVyY2VzIHBhcnNlciBhcmUgZGVmaW5lZCBoZXJlIDoKLSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovZmVhdHVyZXMuaHRtbCI+U2V0dGluZyBmZWF0dXJlczwvYT48YnI+Ci0KLVNBWCBmZWF0dXJlcyBhcmUgZGVmaW5lZCBoZXJlOgotIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iPjx0dD5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvPC90dD48L2E+PGJyPgotIDwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPHA+VGhlIDxjb2RlPiZsdDthdHRyaWJ1dGUmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgdG8gc2V0IHBhcnNlciBmZWF0dXJlcy48YnIvPkZlYXR1cmVzIHVzYWJsZQord2l0aCB0aGUgWGVyY2VzIHBhcnNlciBhcmUgZGVmaW5lZCBoZXJlOiA8YSBocmVmPSJodHRwczovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2ZlYXR1cmVzLmh0bWwiCit0YXJnZXQ9Il90b3AiPlNldHRpbmcgZmVhdHVyZXM8L2E+PGJyLz5TQVggZmVhdHVyZXMgYXJlIGRlZmluZWQKK2hlcmU6IDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iCit0YXJnZXQ9Il90b3AiPjxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy88L2NvZGU+PC9hPjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgZmVhdHVyZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBmZWF0dXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+VGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZlYXR1cmU8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTwvcD4KIAogPGg0PnByb3BlcnR5PC9oND4KLTxwPlRoZSA8dHQ+Jmx0O3Byb3BlcnR5Jmd0OzwvdHQ+IGVsZW1lbnQgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcy4KLVRoZXNlIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgaGVyZSBmb3IgdGhlIHhlcmNlcyBYTUwgcGFyc2VyIGltcGxlbWVudGF0aW9uIDoKLSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovcHJvcGVydGllcy5odG1sIj5YTUwgUGFyc2VyIHByb3BlcnRpZXM8L2E+Ci1Qcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2NoZW1hIHVzZWQgdG8gdmFsaWRhdGUgdGhlIFhNTCBmaWxlLgorPHA+VGhlIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcy4gIFRoZXNlIHByb3BlcnRpZXMgYXJlCitkZWZpbmVkIGhlcmUgZm9yIHRoZSBYZXJjZXMgWE1MIHBhcnNlcgoraW1wbGVtZW50YXRpb246IDxhIGhyZWY9Imh0dHBzOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovcHJvcGVydGllcy5odG1sIiB0YXJnZXQ9Il90b3AiPlhNTCBQYXJzZXIKK3Byb3BlcnRpZXM8L2E+LiBQcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgc2NoZW1hIHVzZWQgdG8gdmFsaWRhdGUgdGhlIFhNTCBmaWxlLgogPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiA8dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZlYXR1cmU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPC9wPgotCiAKIDxoMz5FeGFtcGxlczwvaDM+Cis8cD5WYWxpZGF0ZSBhIGRvY3VtZW50IGFnYWluc3QgYW4gWE1MIHNjaGVtYS4gVGhlIGRvY3VtZW50IGRvZXMgbm90IGRlY2xhcmUgYW55IHNjaGVtYSBpdHNlbGYsIHdoaWNoCitpcyB3aHkgdGhlIDx2YXI+bm9OYW1lc3BhY2VGaWxlPC92YXI+IGlzIG5lZWRlZC48L3A+CiA8cHJlPgotICAgICZsdDtzY2hlbWF2YWxpZGF0ZQotICAgICAgbm9OYW1lc3BhY2VGaWxlPSJkb2N1bWVudC54c2QiCi0gICAgICBmaWxlPSJ4bWwvZW5kcGllY2UueG1sIiZndDsKLSAgICAmbHQ7L3NjaGVtYXZhbGlkYXRlJmd0OwotPC9wcmU+Ci1WYWxpZGF0ZSBhIGRvY3VtZW50IGFnYWluc3QgYW4gWE1MIHNjaGVtYS4gVGhlIGRvY3VtZW50IGRvZXMgbm90IGRlY2xhcmUKLWFueSBzY2hlbWEgaXRzZWxmLCB3aGljaCBpcyB3aHkgdGhlIDx0dD5ub05hbWVzcGFjZUZpbGU8L3R0PiBpcyBuZWVkZWQuIAotPHByZT4KLSAgICAmbHQ7cHJlc2V0ZGVmIG5hbWU9InZhbGlkYXRlLXNvYXAiJmd0OwotICAgICAgJmx0O3NjaGVtYXZhbGlkYXRlJmd0OwotICAgICAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIgotICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L3dzLWFkZHJlc3NpbmcueHNkIiAvJmd0OwotICAgICAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgotICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L3NvYXAxMi54c2QiIC8mZ3Q7Ci0gICAgICAgICZsdDtzY2hlbWEgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKLSAgICAgICAgICBmaWxlPSIke3NvYXAuZGlyfS93c2RsLnhzZCIgLyZndDsKLSAgICAgICAgJmx0O3NjaGVtYSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L1hNTFNjaGVtYS54c2QiIC8mZ3Q7Ci0gICAgICAgICZsdDsvc2NoZW1hdmFsaWRhdGUmZ3Q7Ci0gICAgJmx0Oy9wcmVzZXRkZWYmZ3Q7Ci08L3ByZT4KLURlY2xhcmUgYSBuZXcgcHJlc2V0IHRhc2ssIDx0dD4mbHQ7dmFsaWRhdGUtc29hcCZndDs8L3R0PiwgdGhhdCB2YWxpZGF0ZXMKLVhTRCBhbmQgV1NETCBkb2N1bWVudHMgYWdhaW5zdCB0aGUgcmVsZXZhbnQgc3BlY2lmaWNhdGlvbnMuIAotVG8gdmFsaWRhdGUgWFNEIGRvY3VtZW50cywgeW91IGFsc28gbmVlZCBYTUxTY2hlbWEuZHRkIGFuZCBkYXRhdHlwZXMuZHRkIGluIAotdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFhNTFNjaGVtYS54c2QsIG9yIHBvaW50ZWQgdG8gdmlhIHRoZSBjYXRhbG9nLiBBbGwKLXRoZXNlIGZpbGVzIGNhbiBiZSBmZXRjaGVkIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotdGhlIFczQzwvYT4uIAotPHByZT4KLSAgICAmbHQ7dmFsaWRhdGUtc29hcCBmaWxlPSJ4bWwvdGVzdC54c2QiLyZndDsKLTwvcHJlPgotVXNlIHRoZSBwcmVzZXQgdGFzayBkZWZpbmVkIGFib3ZlIHRvIHZhbGlkYXRlIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQuCi08YnI+CismbHQ7c2NoZW1hdmFsaWRhdGUgbm9OYW1lc3BhY2VGaWxlPSJkb2N1bWVudC54c2QiCisgICAgICAgICAgICAgICAgZmlsZT0ieG1sL2VuZHBpZWNlLnhtbCIvJmd0OzwvcHJlPgogCis8cD5EZWNsYXJlIGEgbmV3IHByZXNldCB0YXNrLCA8Y29kZT4mbHQ7dmFsaWRhdGUtc29hcCZndDs8L2NvZGU+LCB0aGF0IHZhbGlkYXRlcyBYU0QgYW5kIFdTREwKK2RvY3VtZW50cyBhZ2FpbnN0IHRoZSByZWxldmFudCBzcGVjaWZpY2F0aW9ucy4gVG8gdmFsaWRhdGUgWFNEIGRvY3VtZW50cywgeW91IGFsc28KK25lZWQgPHNhbXA+WE1MU2NoZW1hLmR0ZDwvc2FtcD4gYW5kIDxzYW1wPmRhdGF0eXBlcy5kdGQ8L3NhbXA+IGluIHRoZSBzYW1lIGRpcmVjdG9yeQorYXMgPHNhbXA+WE1MU2NoZW1hLnhzZDwvc2FtcD4sIG9yIHBvaW50ZWQgdG8gdmlhIHRoZSBjYXRhbG9nLiBBbGwgdGhlc2UgZmlsZXMgY2FuIGJlIGZldGNoZWQKK2Zyb20gPGEgaHJlZj0iaHR0cHM6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXQ9Il90b3AiPlczQzwvYT4uPC9wPgorPHByZT4KKyZsdDtwcmVzZXRkZWYgbmFtZT0idmFsaWRhdGUtc29hcCImZ3Q7CisgICZsdDtzY2hlbWF2YWxpZGF0ZSZndDsKKyAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3MvMjAwMy8wMy9hZGRyZXNzaW5nIgorICAgICAgICAgICAgZmlsZT0iJHtzb2FwLmRpcn0vd3MtYWRkcmVzc2luZy54c2QiLyZndDsKKyAgICAmbHQ7c2NoZW1hIG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIgorICAgICAgICAgICAgZmlsZT0iJHtzb2FwLmRpcn0vc29hcDEyLnhzZCIvJmd0OworICAgICZsdDtzY2hlbWEgbmFtZXNwYWNlPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKKyAgICAgICAgICAgIGZpbGU9IiR7c29hcC5kaXJ9L3dzZGwueHNkIi8mZ3Q7CisgICAgJmx0O3NjaGVtYSBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICAgICAgZmlsZT0iJHtzb2FwLmRpcn0vWE1MU2NoZW1hLnhzZCIvJmd0OworICAgICZsdDsvc2NoZW1hdmFsaWRhdGUmZ3Q7CismbHQ7L3ByZXNldGRlZiZndDs8L3ByZT4KKworPHA+VXNlIHRoZSBwcmVzZXQgdGFzayBkZWZpbmVkIGFib3ZlIHRvIHZhbGlkYXRlIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQuPC9wPgorPHByZT4mbHQ7dmFsaWRhdGUtc29hcCBmaWxlPSJ4bWwvdGVzdC54c2QiLyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc2NwLmh0bWwgYi9tYW51YWwvVGFza3Mvc2NwLmh0bWwKaW5kZXggNDdhM2NlZS4uYTlhOTVhMSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3NjcC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zY3AuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDMxMyArMTUsMjcxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TQ1AgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ic2NwIj5TQ1A8L2E+PC9oMj4KKzxoMiBpZD0ic2NwIj5TQ1A8L2gyPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD48ZW0+c2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPjwvcD4KLQogPHA+Q29waWVzIGEgZmlsZSBvciBGaWxlU2V0IHRvIG9yIGZyb20gYSAocmVtb3RlKSBtYWNoaW5lIHJ1bm5pbmcgYW4gU1NIIGRhZW1vbi4KLUZpbGVTZXQgPGk+b25seTwvaT4gd29ya3MgZm9yIGNvcHlpbmcgZmlsZXMgZnJvbSB0aGUgbG9jYWwgbWFjaGluZSB0byBhCi1yZW1vdGUgbWFjaGluZS48L3A+CitGaWxlU2V0IDxlbT5vbmx5PC9lbT4gd29ya3MgZm9yIGNvcHlpbmcgZmlsZXMgZnJvbSB0aGUgbG9jYWwgbWFjaGluZSB0byBhIHJlbW90ZSBtYWNoaW5lLjwvcD4KIAotPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQKLWluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhCi1ocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBqc2NoLTAuMS4yIGFuZCBsYXRlci48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudAorZGlzdHJpYnV0aW9uLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLiAgVGhpcyB0YXNrIGhhcyBiZWVuIHRlc3RlZCB3aXRoIDxjb2RlPmpzY2gtMC4xLjI8L2NvZGU+IGFuZCBsYXRlci48L3A+CiAKIDxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJzc2hleGVjLmh0bWwiPnNzaGV4ZWMgdGFzazwvYT48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBjb3B5LiAgVGhpcyBjYW4gYmUgYSBsb2NhbCBwYXRoIG9yIGEKLSAgICByZW1vdGUgcGF0aCBvZiB0aGUgZm9ybSA8aT51c2VyWzpwYXNzd29yZF1AaG9zdDovZGlyZWN0b3J5L3BhdGg8L2k+LgotICAgIDxpPjpwYXNzd29yZDwvaT4gY2FuIGJlIG9taXR0ZWQgaWYgeW91IHVzZSBrZXkgYmFzZWQKLSAgICBhdXRoZW50aWNhdGlvbiBvciBzcGVjaWZ5IHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUuICBUaGUgd2F5IHJlbW90ZQotICAgIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIEAgY2hhcmFjdGVyIG9yIG5vdC4gVGhpcwotICAgIHdpbGwgbm90IHdvcmsgaWYgeW91ciBsb2NhbFBhdGggY29udGFpbnMgQCBjaGFyYWN0ZXIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIGEgbmVzdGVkCi0gICAgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQuPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBmaWxlIHRvIGNvcHkuICBUaGlzIGNhbiBiZSBhIGxvY2FsIHBhdGggb3IgYSByZW1vdGUgcGF0aCBvZiB0aGUKKyAgICAgIGZvcm0gPHNhbXA+dXNlcls6cGFzc3dvcmRdQGhvc3Q6L2RpcmVjdG9yeS9wYXRoPC9zYW1wPi4gIDxzYW1wPjpwYXNzd29yZDwvc2FtcD4gY2FuIGJlIG9taXR0ZWQKKyAgICAgIGlmIHlvdSB1c2Uga2V5IGJhc2VkIGF1dGhlbnRpY2F0aW9uIG9yIHNwZWNpZnkgdGhlIDx2YXI+cGFzc3dvcmQ8L3Zhcj4gYXR0cmlidXRlLiAgVGhlIHdheQorICAgICAgcmVtb3RlIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIDxxPkA8L3E+IGNoYXJhY3RlciBvciBub3QuIFRoaXMgd2lsbCBub3Qgd29yaworICAgICAgaWYgeW91ciA8dmFyPmxvY2FsUGF0aDwvdmFyPiBjb250YWlucyA8cT5APC9xPiBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2NhbEZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgZmlsZSBhdHRyaWJ1dGUuIEJ1dAotICAgIHRoaXMgbXVzdCBhbHdheXMgcG9pbnQgdG8gYSBsb2NhbCBmaWxlLiBUaGUgcmVhc29uIHRoaXMgd2FzIGFkZGVkCi0gICAgd2FzIHRoYXQgd2hlbiB5b3UgZ2l2ZSBmaWxlIGF0dHJpYnV0ZSBpdCBpcyB0cmVhdGVkIGFzIHJlbW90ZSBpZgotICAgIGl0IGNvbnRhaW5zIEAgY2hhcmFjdGVyLiBUaGlzIGNoYXJhY3RlciBjYW4gZXhpc3QgYWxzbyBpbiBsb2NhbAorICAgIDx0ZD5sb2NhbEZpbGU8L3RkPgorICAgIDx0ZD5UaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlLiBCdXQgdGhpcyBtdXN0IGFsd2F5cyBwb2ludCB0byBhCisgICAgICBsb2NhbCBmaWxlLiBUaGUgcmVhc29uIHRoaXMgd2FzIGFkZGVkIHdhcyB0aGF0IHdoZW4geW91IGdpdmUgZmlsZSBhdHRyaWJ1dGUgaXQgaXMgdHJlYXRlZCBhcworICAgICAgcmVtb3RlIGlmIGl0IGNvbnRhaW5zIDxxPkA8L3E+IGNoYXJhY3Rlci4gVGhpcyBjaGFyYWN0ZXIgY2FuIGV4aXN0IGFsc28gaW4gbG9jYWwKKyAgICAgIHBhdGhzLiAgPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQ+QWx0ZXJuYXRpdmUgdG8gPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmVtb3RlRmlsZTwvdGQ+CisgICAgPHRkPlRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIDx2YXI+ZmlsZTwvdmFyPiBhdHRyaWJ1dGUuIEJ1dCB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEKKyAgICAgIHJlbW90ZSBmaWxlLiAgPGVtPnNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICA8dGQ+QWx0ZXJuYXRpdmUgdG8gPHZhcj5maWxlPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZD5UaGUgZGlyZWN0b3J5IHRvIGNvcHkgdG8uICBUaGlzIGNhbiBiZSBhIGxvY2FsIHBhdGggb3IgYSByZW1vdGUgcGF0aCBvZiB0aGUKKyAgICAgIGZvcm0gPHNhbXA+dXNlcls6cGFzc3dvcmRdQGhvc3Q6L2RpcmVjdG9yeS9wYXRoPC9zYW1wPi4gIDxzYW1wPjpwYXNzd29yZDwvc2FtcD4gY2FuIGJlIG9taXR0ZWQKKyAgICAgIGlmIHlvdSB1c2Uga2V5IGJhc2VkIGF1dGhlbnRpY2F0aW9uIG9yIHNwZWNpZnkgdGhlIDx2YXI+cGFzc3dvcmQ8L3Zhcj4gYXR0cmlidXRlLiAgVGhlIHdheQorICAgICAgcmVtb3RlIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIDxxPkA8L3E+IGNoYXJhY3RlciBvciBub3QuIFRoaXMgd2lsbCBub3Qgd29yaworICAgICAgaWYgeW91ciA8dmFyPmxvY2FsUGF0aDwvdmFyPiBjb250YWlucyA8cT5APC9xPiBjaGFyYWN0ZXIuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2NhbFRvZGlyPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj50b2RpcjwvdmFyPiBhdHRyaWJ1dGUuIEJ1dCB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEKKyAgICBsb2NhbCBkaXJlY3RvcnkuIFRoZSByZWFzb24gdGhpcyB3YXMgYWRkZWQgd2FzIHRoYXQgd2hlbiB5b3UgZ2l2ZSA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZSBpdAorICAgIGlzIHRyZWF0ZWQgYXMgcmVtb3RlIGlmIGl0IGNvbnRhaW5zIDxxPkA8L3E+IGNoYXJhY3Rlci4gVGhpcyBjaGFyYWN0ZXIgY2FuIGV4aXN0IGFsc28gaW4gbG9jYWwKICAgICBwYXRocy4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byBmaWxlIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5BbHRlcm5hdGl2ZSB0byA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW90ZUZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgZmlsZSBhdHRyaWJ1dGUuIEJ1dAotICAgIHRoaXMgbXVzdCBhbHdheXMgcG9pbnQgdG8gYSByZW1vdGUgZmlsZS4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byBmaWxlIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5sb2NhbFRvZmlsZTwvdGQ+CisgICAgPHRkPkNoYW5nZXMgdGhlIGZpbGUgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZSB3aGlsZSByZWNlaXZpbmcgaXQsIG9ubHkgdXNlZnVsIGlmIHJlY2VpdmluZyBhCisgICAgICBzaW5nbGUgZmlsZS4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkPkFsdGVybmF0aXZlIHRvIDx2YXI+dG9kaXI8L3Zhcj4gYXR0cmlidXRlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byBjb3B5IHRvLiAgVGhpcyBjYW4gYmUgYSBsb2NhbCBwYXRoCi0gICAgb3IgYSByZW1vdGUgcGF0aCBvZiB0aGUgZm9ybSA8aT51c2VyWzpwYXNzd29yZF1AaG9zdDovZGlyZWN0b3J5L3BhdGg8L2k+LgotICAgIDxpPjpwYXNzd29yZDwvaT4gY2FuIGJlIG9taXR0ZWQgaWYgeW91IHVzZSBrZXkgYmFzZWQKLSAgICBhdXRoZW50aWNhdGlvbiBvciBzcGVjaWZ5IHRoZSBwYXNzd29yZCBhdHRyaWJ1dGUuICBUaGUgd2F5IHJlbW90ZQotICAgIHBhdGggaXMgcmVjb2duaXplZCBpcyB3aGV0aGVyIGl0IGNvbnRhaW5zIEAgY2hhcmFjdGVyIG9yIG5vdC4gVGhpcwotICAgIHdpbGwgbm90IHdvcmsgaWYgeW91ciBsb2NhbFBhdGggY29udGFpbnMgQCBjaGFyYWN0ZXIuPC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnJlbW90ZVRvZGlyPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgPHZhcj50b2RpcjwvdmFyPiBhdHRyaWJ1dGUuIEJ1dCB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEKKyAgICAgIHJlbW90ZSBkaXJlY3RvcnkuICA8ZW0+c2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZD5BbHRlcm5hdGl2ZSB0byA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2FsVG9kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgdG9kaXIKLSAgICBhdHRyaWJ1dGUuIEJ1dCB0aGlzIG11c3QgYWx3YXlzIHBvaW50IHRvIGEgbG9jYWwgZGlyZWN0b3J5LiBUaGUKLSAgICByZWFzb24gdGhpcyB3YXMgYWRkZWQgd2FzIHRoYXQgd2hlbiB5b3UgZ2l2ZSB0b2RpciBhdHRyaWJ1dGUgaXQgaXMKLSAgICB0cmVhdGVkIGFzIHJlbW90ZSBpZiBpdCBjb250YWlucyBAIGNoYXJhY3Rlci4gVGhpcyBjaGFyYWN0ZXIgY2FuCi0gICAgZXhpc3QgYWxzbyBpbiBsb2NhbCBwYXRocy4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+cmVtb3RlVG9maWxlPC90ZD4KKyAgICA8dGQ+Q2hhbmdlcyB0aGUgZmlsZSBuYW1lIHRvIHRoZSBnaXZlbiBuYW1lIHdoaWxlIHNlbmRpbmcgaXQsIG9ubHkgdXNlZnVsIGlmIHNlbmRpbmcgYSBzaW5nbGUKKyAgICAgIGZpbGUuICA8ZW0+c2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZD5BbHRlcm5hdGl2ZSB0byA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2FsVG9maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYW5nZXMgdGhlIGZpbGUgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZSB3aGlsZQotICAgIHJlY2VpdmluZyBpdCwgb25seSB1c2VmdWwgaWYgcmVjZWl2aW5nIGEgc2luZ2xlIGZpbGUuICA8ZW0+c2luY2UKLSAgICBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+cG9ydDwvdGQ+CisgICAgPHRkPlRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4yMjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZW1vdGVUb2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSB0b2RpcgotICAgIGF0dHJpYnV0ZS4gQnV0IHRoaXMgbXVzdCBhbHdheXMgcG9pbnQgdG8gYSByZW1vdGUgZGlyZWN0b3J5LgotICAgIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5BbHRlcm5hdGl2ZSB0byB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+dHJ1c3Q8L3RkPgorICAgIDx0ZD5UaGlzIHRydXN0cyBhbGwgdW5rbm93biBob3N0cyBpZiBzZXQgdG8gPHE+eWVzPC9xPgorICAgICAgb3IgPHE+dHJ1ZTwvcT4uPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBzZXQgdGhpcyB0byA8cT5mYWxzZTwvcT4gKHRoZSBkZWZhdWx0KSwgdGhlCisgICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIgPHZhcj5rbm93bmhvc3RzPC92YXI+IGZpbGUsIHRoaXMgYWxzbyBpbXBsaWVzIHRoYXQKKyAgICAgIHRoZSBmaWxlIGV4aXN0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVtb3RlVG9maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNoYW5nZXMgdGhlIGZpbGUgbmFtZSB0byB0aGUgZ2l2ZW4gbmFtZSB3aGlsZQotICAgIHNlbmRpbmcgaXQsIG9ubHkgdXNlZnVsIGlmIHNlbmRpbmcgYSBzaW5nbGUgZmlsZS4gIDxlbT5zaW5jZQotICAgIEFudCAxLjYuMjwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPkFsdGVybmF0aXZlIHRvIHRvZGlyIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5rbm93bmhvc3RzPC90ZD4KKyAgICA8dGQ+VGhpcyBzZXRzIHRoZSBrbm93biBob3N0cyBmaWxlIHRvIHVzZSB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcworICAgICAgbXVzdCBiZSBhIFNTSDIgZm9ybWF0IGZpbGUuICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8c2FtcD4ke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0czwvc2FtcD48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wb3J0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gb24gdGhlIHJlbW90ZSBob3N0LjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gMjIuPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIGlmIHRoZSB0cmFuc2ZlciBmYWlscy48L3RkPgorICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHJ1c3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyB0cnVzdHMgYWxsIHVua25vd24gaG9zdHMgaWYgc2V0IHRvIHllcy90cnVlLjxicj4KLSAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlCi0gICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIga25vd25ob3N0cyBmaWxlLCB0aGlzCi0gICAgICBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZmlsZSBleGlzdHMuPC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBOby48L3RkPgorICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgPHRkPlRoZSBwYXNzd29yZC48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlCisgICAgIGZpbGUgb3IgPHZhcj50b2RpcjwvdmFyPiBhdHRyaWJ1dGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rbm93bmhvc3RzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgc2V0cyB0aGUga25vd24gaG9zdHMgZmlsZSB0byB1c2UgdG8gdmFsaWRhdGUKLSAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcyBtdXN0IGJlIGEgU1NIMiBmb3JtYXQgZmlsZS4KLSAgICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8KLSAgICAke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0cy48L3RkPgorICAgIDx0ZD5rZXlmaWxlPC90ZD4KKyAgICA8dGQ+TG9jYXRpb24gb2YgdGhlIGZpbGUgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkuPC90ZD4KKyAgICA8dGQ+WWVzLCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIGlmIHRoZSB0cmFuc2ZlciBmYWlscy4KLSAgICAgPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZD5wYXNzcGhyYXNlPC90ZD4KKyAgICA8dGQ+UGFzc3BocmFzZSBmb3IgeW91ciBwcml2YXRlIGtleS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZC48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vdCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAotICAgICBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlIGZpbGUgb3IKLSAgICAgdG9kaXIgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkPnNzaENvbmZpZzwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIE9wZW5TU0ggc3R5bGUgY29uZmlndXJhdGlvbiAoZS5nLiA8Y29kZT4ke3VzZXIuaG9tZX0vLnNzaC9jb25maWc8L2NvZGU+KS4KKyAgICAgICAgVGhlIHVzZXJuYW1lIGFuZCB0aGUga2V5IGZpbGUgYXJlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAorICAgICAgICB1bmxlc3MgdGhleSBhcmUgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHRhc2sgcGFyYW1ldGVycy4KKyAgICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjg8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5ZmlsZTwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+TG9jYXRpb24gb2YgdGhlIGZpbGUgaG9sZGluZyB0aGUgcHJpdmF0ZSBrZXkuPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIGlmIHlvdSBhcmUgdXNpbmcga2V5IGJhc2VkCi0gICAgIGF1dGhlbnRpY2F0aW9uLjwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD5EZXRlcm1pbmVzIHdoZXRoZXIgU0NQIG91dHB1dHMgdmVyYm9zZWx5IHRvIHRoZSB1c2VyLiBDdXJyZW50bHkgdGhpcyBtZWFucyBvdXRwdXR0aW5nCisgICAgICBkb3RzL3N0YXJzIHNob3dpbmcgdGhlIHByb2dyZXNzIG9mIGEgZmlsZSB0cmFuc2Zlci4gIDxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzcGhyYXNlPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzcGhyYXNlIGZvciB5b3VyIHByaXZhdGUga2V5LjwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy48L3RkPgorICAgIDx0ZD5zZnRwPC90ZD4KKyAgICA8dGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIFNDUCB1c2VzIHRoZSBzZnRwIHByb3RvY29sLiAgVGhlIHNmdHAgcHJvdG9jb2wgaXMgdGhlIGZpbGUgdHJhbnNmZXIKKyAgICAgIHByb3RvY29sIG9mIFNTSDIuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHRoaXMgYmUgc2V0IHRvIDxxPnRydWU8L3E+IGlmIHlvdSBhcmUgY29weWluZyB0by9mcm9tCisgICAgICBhIHNlcnZlciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzY3AxLiA8ZW0+c2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZlcmJvc2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RGV0ZXJtaW5lcyB3aGV0aGVyIFNDUCBvdXRwdXRzIHZlcmJvc2VseSB0byB0aGUKLSAgICB1c2VyLiBDdXJyZW50bHkgdGhpcyBtZWFucyBvdXRwdXR0aW5nIGRvdHMvc3RhcnMgc2hvd2luZyB0aGUKLSAgICBwcm9ncmVzcyBvZiBhIGZpbGUgdHJhbnNmZXIuICA8ZW0+c2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+CisgICAgPHRkPnByZXNlcnZlTGFzdE1vZGlmaWVkPC90ZD4KKyAgICA8dGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgb2YgZG93bmxvYWRlZCBmaWxlcyBpcyBwcmVzZXJ2ZWQuICBJdAorICAgICAgb25seSB3b3JrcyB3aGVuIHRyYW5zZmVycmluZyBmcm9tIGEgcmVtb3RlIHRvIGEgbG9jYWwgc3lzdGVtIGFuZCBwcm9iYWJseSBkb2Vzbid0IHdvcmsgd2l0aCBhCisgICAgICBzZXJ2ZXIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgU1NIMi4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZnRwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRldGVybWluZXMgd2hldGhlciBTQ1AgdXNlcyB0aGUgc2Z0cCBwcm90b2NvbC4KLSAgICBUaGUgc2Z0cCBwcm90b2NvbCBpcyB0aGUgZmlsZSB0cmFuc2ZlciBwcm90b2NvbCBvZiBTU0gyLiAgSXQgaXMKLSAgICByZWNvbW1lbmRlZCB0aGF0IHRoaXMgYmUgc2V0IHRvIHRydWUgaWYgeW91IGFyZSBjb3B5aW5nIHRvL2Zyb20gYQotICAgIHNlcnZlciB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBzY3AxLiA8ZW0+c2luY2UgQW50IDEuNzwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5maWxlbW9kZTwvdGQ+CisgICAgPHRkPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIGFuZCBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peAorICAgICAgZmFzaGlvbi4gIE9ubHkgYXBwbGllcyB0byB1cGxvYWRlZCBmaWxlcy4gIE5vdGUgdGhlIGFjdHVhbCBwZXJtaXNzaW9ucyBvZiB0aGUgcmVtb3RlIGZpbGUgd2lsbAorICAgICAgYmUgZ292ZXJuZWQgYnkgdGhpcyBzZXR0aW5nIGFuZCB0aGUgPGNvZGU+VU1BU0s8L2NvZGU+IG9uIHRoZSByZW1vdGUgc2VydmVyLiA8ZW0+c2luY2UgQW50CisgICAgICAxLjkuNTwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjY0NDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZUxhc3RNb2RpZmllZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxhc3QgbW9kaWZpY2F0aW9uCi0gICAgdGltZXN0YW1wIG9mIGRvd25sb2FkZWQgZmlsZXMgaXMgcHJlc2VydmVkLiAgSXQgb25seSB3b3JrcyB3aGVuCi0gICAgdHJhbnNmZXJyaW5nIGZyb20gYSByZW1vdGUgdG8gYSBsb2NhbCBzeXN0ZW0gYW5kIHByb2JhYmx5IGRvZXNuJ3QKLSAgICB3b3JrIHdpdGggYSBzZXJ2ZXIgdGhhdCBkb2Vzbid0IHN1cHBvcnQgU1NIMi4gIDxlbT5zaW5jZSBBbnQKLSAgICAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD5kaXJtb2RlPC90ZD4KKyAgICA8dGQ+QSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4CisgICAgICBmYXNoaW9uLiAgT25seSBhcHBsaWVzIHRvIHVwbG9hZGVkIGRpcnMuICBOb3RlIHRoZSBhY3R1YWwgcGVybWlzc2lvbnMgb2YgdGhlIHJlbW90ZSBkaXIgd2lsbAorICAgICAgYmUgZ292ZXJuZWQgYnkgdGhpcyBzZXR0aW5nIGFuZCB0aGUgPGNvZGU+VU1BU0s8L2NvZGU+IG9uIHRoZSByZW1vdGUgc2VydmVyLiA8ZW0+c2luY2UgQW50CisgICAgICAxLjkuNTwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjc1NTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbW9kZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cAotICAgICAgYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4IGZhc2hpb24uICBPbmx5IGFwcGxpZXMgdG8KLSAgICAgIHVwbG9hZGVkIGZpbGVzLiAgTm90ZSB0aGUgYWN0dWFsIHBlcm1pc3Npb25zIG9mIHRoZSByZW1vdGUKLSAgICAgIGZpbGUgd2lsbCBiZSBnb3Zlcm5lZCBieSB0aGlzIHNldHRpbmcgYW5kIHRoZSBVTUFTSyBvbiB0aGUKLSAgICAgIHJlbW90ZSBzZXJ2ZXIuIERlZmF1bHQgaXMgNjQ0LiA8ZW0+c2luY2UgQW50IDEuOS41PC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHM8L3RkPgorICAgIDx0ZD5TZXRzIGEgdGltZW91dCBpbnRlcnZhbCBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGlmIG5vIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLAorICAgICAgdGhlIHRhc2sgd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCB0byByZXF1ZXN0IGEgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgIHNlcnZlci4gIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vLCB0aGUgZGVmYXVsdCBpcyA8cT4wPC9xPiwgaW5kaWNhdGluZyB0aGF0IHRoZXNlIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHNlbnQgdG8gdGhlCisgICAgICBzZXJ2ZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXJtb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwCi0gICAgICBhbmQgb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbi4gIE9ubHkgYXBwbGllcyB0bwotICAgICAgdXBsb2FkZWQgZGlycy4gIE5vdGUgdGhlIGFjdHVhbCBwZXJtaXNzaW9ucyBvZiB0aGUgcmVtb3RlCi0gICAgICBkaXIgd2lsbCBiZSBnb3Zlcm5lZCBieSB0aGlzIHNldHRpbmcgYW5kIHRoZSBVTUFTSyBvbiB0aGUKLSAgICAgIHJlbW90ZSBzZXJ2ZXIuIERlZmF1bHQgaXMgNzU1LiA8ZW0+c2luY2UgQW50IDEuOS41PC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2VydmVyQWxpdmVDb3VudE1heDwvdGQ+CisgICAgPHRkPlRoZSBudW1iZXIgb2Ygc2VydmVyIGFsaXZlIG1lc3NhZ2VzIHdoaWNoIG1heSBiZSBzZW50IHdpdGhvdXQgcmVjZWl2aW5nIGFueSBtZXNzYWdlcyBiYWNrCisgICAgICBmcm9tIHRoZSBzZXJ2ZXIuIE9ubHkgdXNlZCBpZiA8dmFyPnNlcnZlckFsaXZlSW50ZXJ2YWxTZWNvbmRzPC92YXI+IGlzCisgICAgICBub3QgPHE+MDwvcT4uICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXJBbGl2ZUludGVydmFsU2Vjb25kczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZXRzIGEgdGltZW91dCBpbnRlcnZhbCBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGlmIG5vIGRhdGEgaGFzCi0gICAgICBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciwgdGhlIHRhc2sgd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoCi0gICAgICB0aGUgZW5jcnlwdGVkIGNoYW5uZWwgdG8gcmVxdWVzdCBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgdGhlIGRlZmF1bHQgaXMgMCwgaW5kaWNhdGluZwotICAgICAgdGhhdCB0aGVzZSBtZXNzYWdlcyB3aWxsIG5vdCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXI8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXJBbGl2ZUNvdW50TWF4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2Ygc2VydmVyIGFsaXZlIG1lc3NhZ2VzIHdoaWNoIG1heSBiZQotICAgICAgc2VudCB3aXRob3V0IHJlY2VpdmluZyBhbnkgbWVzc2FnZXMgYmFjayBmcm9tIHRoZSBzZXJ2ZXIuIE9ubHkKLSAgICAgIHVzZWQgaWYgc2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHMgaXMgbm90IDAuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIDM8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzc2VkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZW5hYmxlIGNvbXByZXNzaW9uIGR1cmluZyB0cmFuc2Zlci4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45Ljg8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZD5jb21wcmVzc2VkPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBlbmFibGUgY29tcHJlc3Npb24gZHVyaW5nIHRyYW5zZmVyLiAgPGVtPnNpbmNlIEFudCAxLjkuODwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxoND5maWxlc2V0IG9yIHJlc291cmNlIGNvbGxlY3Rpb25zPC9oND4KLSA8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBvciA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0Ci0gZ3JvdXBzIG9mIGZpbGVzIHRvIGNvcHkuIFRvIHVzZSBhIGZpbGVzZXQgb3IgYSByZXNvdXJjZSBjb2xsZWN0aW9uLCB0aGUgPGNvZGU+dG9kaXI8L2NvZGU+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC48L3A+Cis8aDQ+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2g0PgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMKK29yIG90aGVyIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcmUgdXNlZCB0byBzZWxlY3QgZ3JvdXBzCitvZiBmaWxlcyB0byBjb3B5LiBUbyB1c2UgYSBmaWxlc2V0IG9yIGEgcmVzb3VyY2UgY29sbGVjdGlvbiwgdGhlIDx2YXI+dG9kaXI8L3Zhcj4gYXR0cmlidXRlIG11c3QgYmUKK3NldC48L3A+CiAKLVByaW9yIHRvIEFudCAxLjkuNyBvbmx5ICZsdDtmaWxlc2V0Jmd0OyBoYXMgYmVlbiBzdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC4KKzxwPlByaW9yIHRvIEFudCAxLjkuNyBvbmx5IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaGFzIGJlZW4gc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+PGI+Q29weSBhIHNpbmdsZSBsb2NhbCBmaWxlIHRvIGEgcmVtb3RlIG1hY2hpbmU8L2I+PC9wPgotPHByZT4KLSAgJmx0O3NjcCBmaWxlPSZxdW90O215ZmlsZS50eHQmcXVvdDsgdG9kaXI9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjayZxdW90Oy8mZ3Q7Ci08L3ByZT4KKzxwPkNvcHkgYSBzaW5nbGUgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBtYWNoaW5lOjwvcD4KKzxwcmU+Jmx0O3NjcCBmaWxlPSZxdW90O215ZmlsZS50eHQmcXVvdDsgdG9kaXI9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjayZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPjxiPkNvcHkgYSBzaW5nbGUgbG9jYWwgZmlsZSB0byBhIHJlbW90ZSBtYWNoaW5lIHdpdGggc2VwYXJhdGUKLXBhc3N3b3JkIGF0dHJpYnV0ZTwvYj48L3A+Ci08cHJlPgotICAmbHQ7c2NwIGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OyB0b2Rpcj0mcXVvdDt1c2VyQHNvbWVob3N0Oi9ob21lL2NodWNrJnF1b3Q7IHBhc3N3b3JkPSZxdW90O3Bhc3N3b3JkJnF1b3Q7LyZndDsKLTwvcHJlPgorPHA+Q29weSBhIHNpbmdsZSBsb2NhbCBmaWxlIHRvIGEgcmVtb3RlIG1hY2hpbmUgd2l0aCBzZXBhcmF0ZSA8dmFyPnBhc3N3b3JkPC92YXI+CithdHRyaWJ1dGU6PC9wPgorPHByZT4mbHQ7c2NwIGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OyB0b2Rpcj0mcXVvdDt1c2VyQHNvbWVob3N0Oi9ob21lL2NodWNrJnF1b3Q7IHBhc3N3b3JkPSZxdW90O3Bhc3N3b3JkJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+PGI+Q29weSBhIHNpbmdsZSBsb2NhbCBmaWxlIHRvIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcga2V5IGJhc2UKLWF1dGhlbnRpY2F0aW9uLjwvYj48L3A+Cis8cD5Db3B5IGEgc2luZ2xlIGxvY2FsIGZpbGUgdG8gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYmFzZSBhdXRoZW50aWNhdGlvbjo8L3A+CiA8cHJlPgotICAmbHQ7c2NwIGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OwotICAgICAgIHRvZGlyPSZxdW90O3VzZXJAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsgCi0gICAgICAga2V5ZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLnNzaC9pZF9kc2EmcXVvdDsKLSAgICAgICBwYXNzcGhyYXNlPSZxdW90O215IGV4dHJlbWVseSBzZWNyZXQgcGFzc3BocmFzZSZxdW90OwotICAvJmd0OwotPC9wcmU+CismbHQ7c2NwIGZpbGU9JnF1b3Q7bXlmaWxlLnR4dCZxdW90OworICAgICB0b2Rpcj0mcXVvdDt1c2VyQHNvbWVob3N0Oi9ob21lL2NodWNrJnF1b3Q7CisgICAgIGtleWZpbGU9JnF1b3Q7JHt1c2VyLmhvbWV9Ly5zc2gvaWRfZHNhJnF1b3Q7CisgICAgIHBhc3NwaHJhc2U9JnF1b3Q7bXkgZXh0cmVtZWx5IHNlY3JldCBwYXNzcGhyYXNlJnF1b3Q7LyZndDs8L3ByZT4KIAotPHA+PGI+Q29weSBhIHNpbmdsZSByZW1vdGUgZmlsZSB0byBhIGxvY2FsIGRpcmVjdG9yeTwvYj48L3A+Ci08cHJlPgotICAmbHQ7c2NwIGZpbGU9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay9teWZpbGUudHh0JnF1b3Q7IHRvZGlyPSZxdW90Oy4uL3NvbWUvb3RoZXIvZGlyJnF1b3Q7LyZndDsKLTwvcHJlPgorPHA+Q29weSBhIHNpbmdsZSByZW1vdGUgZmlsZSB0byBhIGxvY2FsIGRpcmVjdG9yeTo8L3A+Cis8cHJlPiZsdDtzY3AgZmlsZT0mcXVvdDt1c2VyOnBhc3N3b3JkQHNvbWVob3N0Oi9ob21lL2NodWNrL215ZmlsZS50eHQmcXVvdDsgdG9kaXI9JnF1b3Q7Li4vc29tZS9vdGhlci9kaXImcXVvdDsvJmd0OzwvcHJlPgogCi08cD48Yj5Db3B5IGEgcmVtb3RlIGRpcmVjdG9yeSB0byBhIGxvY2FsIGRpcmVjdG9yeTwvYj48L3A+Ci08cHJlPgotICAmbHQ7c2NwIGZpbGU9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay8qJnF1b3Q7IHRvZGlyPSZxdW90Oy9ob21lL3NhcmEmcXVvdDsvJmd0OwotPC9wcmU+Cis8cD5Db3B5IGEgcmVtb3RlIGRpcmVjdG9yeSB0byBhIGxvY2FsIGRpcmVjdG9yeTo8L3A+Cis8cHJlPiZsdDtzY3AgZmlsZT0mcXVvdDt1c2VyOnBhc3N3b3JkQHNvbWVob3N0Oi9ob21lL2NodWNrLyomcXVvdDsgdG9kaXI9JnF1b3Q7L2hvbWUvc2FyYSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxwPjxiPkNvcHkgYSBsb2NhbCBkaXJlY3RvcnkgdG8gYSByZW1vdGUgZGlyZWN0b3J5PC9iPjwvcD4KKzxwPkNvcHkgYSBsb2NhbCBkaXJlY3RvcnkgdG8gYSByZW1vdGUgZGlyZWN0b3J5OjwvcD4KIDxwcmU+Ci0gICZsdDtzY3AgdG9kaXI9JnF1b3Q7dXNlcjpwYXNzd29yZEBzb21laG9zdDovaG9tZS9jaHVjay8mcXVvdDsmZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsvJmd0OwotICAmbHQ7L3NjcCZndDsKLTwvcHJlPgotPHA+PGI+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeTwvYj48L3A+CismbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2svJnF1b3Q7Jmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjX2RpciZxdW90Oy8mZ3Q7CismbHQ7L3NjcCZndDs8L3ByZT4KKworPHA+Q29weSBhIHNldCBvZiBmaWxlcyB0byBhIGRpcmVjdG9yeTo8L3A+CiA8cHJlPgotICAmbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsmZ3Q7CismbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9zY3AmZ3Q7PC9wcmU+CisKKzxwPkNvcHkgYSBzZXQgb2YgZmlsZXMgdG8gYSByZW1vdGUgZGlyZWN0b3J5IGluIHJldmVyc2UgbGFzdC1tb2RpZmllZCBvcmRlcjo8L3A+Cis8cHJlPgorJmx0O3NjcCB0b2Rpcj0mcXVvdDt1c2VyOnBhc3N3b3JkQHNvbWVob3N0Oi9ob21lL2NodWNrJnF1b3Q7Jmd0OworICAmbHQ7c29ydCZndDsKKyAgICAmbHQ7cmV2ZXJzZSZndDsKKyAgICAgICZsdDtkYXRlLyZndDsKKyAgICAmbHQ7L3JldmVyc2UmZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CisgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyomcXVvdDsvJmd0OwogICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy9zY3AmZ3Q7Ci08L3ByZT4KLTxwPjxiPkNvcHkgYSBzZXQgb2YgZmlsZXMgdG8gYSByZW1vdGUgZGlyZWN0b3J5IGluIHJldmVyc2UgbGFzdC1tb2RpZmllZCBvcmRlcjwvYj48L3A+Ci08cHJlPgotICAmbHQ7c2NwIHRvZGlyPSZxdW90O3VzZXI6cGFzc3dvcmRAc29tZWhvc3Q6L2hvbWUvY2h1Y2smcXVvdDsmZ3Q7Ci0gICAgJmx0O3NvcnQmZ3Q7Ci0gICAgICAmbHQ7cmV2ZXJzZSZndDsKLSAgICAgICAgJmx0O2RhdGUgLyZndDsKLSAgICAgICZsdDsvcmV2ZXJzZSZndDsKLSAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmNfZGlyJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyomcXVvdDsgLyZndDsKLSAgICAgICZsdDsvZmlsZXNldCZndDsKLSAgICAmbHQ7L3NvcnQmZ3Q7Ci0gICZsdDsvc2NwJmd0OwotPC9wcmU+CisgICZsdDsvc29ydCZndDsKKyZsdDsvc2NwJmd0OzwvcHJlPgogCi08cD48c3Ryb25nPlNlY3VyaXR5IE5vdGU6PC9zdHJvbmc+ICBIYXJkIGNvZGluZyBwYXNzd29yZHMgYW5kL29yIHVzZXJuYW1lcwotaW4gc2NwIHRhc2sgY2FuIGJlIGEgc2VyaW91cyBzZWN1cml0eSBob2xlLiAgQ29uc2lkZXIgdXNpbmcgdmFyaWFibGUKLXN1YnN0aXR1dGlvbiBhbmQgaW5jbHVkZSB0aGUgcGFzc3dvcmQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOgotPHA+Ci08cHJlPgotICAgICZsdDtzY3AgdG9kaXI9JnF1b3Q7JHt1c2VybmFtZX06JHtwYXNzd29yZH1AaG9zdDovZGlyJnF1b3Q7IC4uLiZndDsKLTwvcHJlPgotSW52b2tpbmcgYW50IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmU6Ci08cHJlPgotICAgIGFudCAtRHVzZXJuYW1lPW1lIC1EcGFzc3dvcmQ9bXlwYXNzd29yZCB0YXJnZXQxIHRhcmdldDIKLTwvcHJlPgorPHA+PHN0cm9uZz5TZWN1cml0eSBOb3RlPC9zdHJvbmc+OiBIYXJkY29kaW5nIHBhc3N3b3JkcyBhbmQvb3IgdXNlcm5hbWVzIGluIDxjb2RlPnNjcDwvY29kZT4gdGFzaworY2FuIGJlIGEgc2VyaW91cyBzZWN1cml0eSBob2xlLiAgQ29uc2lkZXIgdXNpbmcgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGFuZCBpbmNsdWRlIHRoZSBwYXNzd29yZCBvbgordGhlIGNvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlOjwvcD4KKzxwcmU+Jmx0O3NjcCB0b2Rpcj0mcXVvdDske3VzZXJuYW1lfToke3Bhc3N3b3JkfUBob3N0Oi9kaXImcXVvdDsgLi4uJmd0OzwvcHJlPgogCi1JcyBzbGlnaHRseSBiZXR0ZXIsIGJ1dCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgaXMgZXhwb3NlZCB0byBhbGwgdXNlcnMgb24gYW4gVW5peAotc3lzdGVtICh2aWEgdGhlIHBzIGNvbW1hbmQpLiBUaGUgYmVzdCBhcHByb2FjaCBpcyB0byB1c2UgdGhlCi08Y29kZT4mbHQ7aW5wdXQmZ3Q7PC9jb2RlPiB0YXNrIGFuZC9vciByZXRyaWV2ZSB0aGUgcGFzc3dvcmQgZnJvbSBhIChzZWN1cmVkKQotLnByb3BlcnRpZXMgZmlsZS4KKzxwPkludm9raW5nIEFudCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lOjwvcD4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLUR1c2VybmFtZT1tZSAtRHBhc3N3b3JkPW15cGFzc3dvcmQgdGFyZ2V0MSB0YXJnZXQyPC9wcmU+Cis8cD5pcyBzbGlnaHRseSBiZXR0ZXIsIGJ1dCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgaXMgZXhwb3NlZCB0byBhbGwgdXNlcnMgb24gYW4gVW5peCBzeXN0ZW0gKHZpYQordGhlIDxrYmQ+cHM8L2tiZD4gY29tbWFuZCkuIFRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvIHVzZSB0aGUgPGNvZGU+Jmx0O2lucHV0Jmd0OzwvY29kZT4gdGFzayBhbmQvb3IKK3JldHJpZXZlIHRoZSBwYXNzd29yZCBmcm9tIGEgKHNlY3VyZWQpIDxzYW1wPi5wcm9wZXJ0aWVzPC9zYW1wPiBmaWxlLjwvcD4KIAotPHA+Ci0KLTxwPjxzdHJvbmc+VW5peCBOb3RlOjwvc3Ryb25nPiBGaWxlIHBlcm1pc3Npb25zIGFyZSBub3QgcmV0YWluZWQgd2hlbiBmaWxlcwotYXJlIGRvd25sb2FkZWQ7IHRoZXkgZW5kIHVwIHdpdGggdGhlIGRlZmF1bHQgPGNvZGU+VU1BU0s8L2NvZGU+IHBlcm1pc3Npb25zCi1pbnN0ZWFkLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgbGFjayBvZiBhbnkgbWVhbnMgdG8gcXVlcnkgb3Igc2V0IGZpbGUKLXBlcm1pc3Npb25zIGluIHRoZSBjdXJyZW50IEphdmEgcnVudGltZXMuIElmIHlvdSBuZWVkIGEgcGVybWlzc2lvbi0KLXByZXNlcnZpbmcgY29weSBmdW5jdGlvbiwgdXNlIDxjb2RlPiZsdDtleGVjIGV4ZWN1dGFibGU9InNjcCIgLi4uICZndDs8L2NvZGU+Ci1pbnN0ZWFkLgotPC9wPgotCi0KKzxwPjxzdHJvbmc+VW5peCBOb3RlPC9zdHJvbmc+OiBGaWxlIHBlcm1pc3Npb25zIGFyZSBub3QgcmV0YWluZWQgd2hlbiBmaWxlcyBhcmUgZG93bmxvYWRlZDsgdGhleSBlbmQKK3VwIHdpdGggdGhlIGRlZmF1bHQgPGNvZGU+VU1BU0s8L2NvZGU+IHBlcm1pc3Npb25zIGluc3RlYWQuIFRoaXMgaXMgY2F1c2VkIGJ5IHRoZSBsYWNrIG9mIGFueSBtZWFucwordG8gcXVlcnkgb3Igc2V0IGZpbGUgcGVybWlzc2lvbnMgaW4gdGhlIGN1cnJlbnQgSmF2YSBydW50aW1lcy4gSWYgeW91IG5lZWQgYSBwZXJtaXNzaW9uLXByZXNlcnZpbmcKK2NvcHkgZnVuY3Rpb24sIHVzZSA8Y29kZT4mbHQ7ZXhlYyBleGVjdXRhYmxlPSJzY3AiIC4uLiAmZ3Q7PC9jb2RlPiBpbnN0ZWFkLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc2NyaXB0Lmh0bWwgYi9tYW51YWwvVGFza3Mvc2NyaXB0Lmh0bWwKaW5kZXggZmIwMDgyMi4uN2NiNmE0NyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3NjcmlwdC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zY3JpcHQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE1MCArMTUsMTI4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPjwvbWV0YT4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+U2NyaXB0IFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InNjcmlwdCI+U2NyaXB0PC9hPjwvaDI+Cis8aDIgaWQ9InNjcmlwdCI+U2NyaXB0PC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gIDxwPkV4ZWN1dGUgYSBzY3JpcHQgaW4gYQotICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIiB0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+Ci0gICAgb3IKLSAgICA8YSBocmVmPSJodHRwczovL3NjcmlwdGluZy5kZXYuamF2YS5uZXQiPkpTUiAyMjM8L2E+ICBzdXBwb3J0ZWQgbGFuZ3VhZ2UuCi0gIDwvcD4KLSAgPHA+PGI+Tm90ZTo8L2I+Ci0gICAgVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uCi0gICAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4KLSAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgPC9wPgotICA8cD4KLSAgICBUaGUgdGFzayBtYXkgdXNlIHRoZSBCU0Ygc2NyaXB0aW5nIG1hbmFnZXIgb3IgdGhlIEpTUiAyMjMgbWFuYWdlciB0aGF0Ci0gICAgaXMgaW5jbHVkZWQgaW4gSkRLNiBhbmQgaGlnaGVyLiBUaGlzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIDxjb2RlPm1hbmFnZXI8L2NvZGU+Ci0gICAgYXR0cmlidXRlLiBUaGUgSlNSIDIyMyBzY3JpcHRpbmcgbWFuYWdlciBpcyBpbmRpY2F0ZWQgYnkgImphdmF4Ii4KLSAgPC9wPgotICA8cD5BbGwgaXRlbXMgKHRhc2tzLCB0YXJnZXRzLCBldGMpIG9mIHRoZSBydW5uaW5nIHByb2plY3QgYXJlCi0gICAgYWNjZXNzaWJsZSBmcm9tIHRoZSBzY3JpcHQsIHVzaW5nIGVpdGhlciB0aGVpciA8Y29kZT5uYW1lPC9jb2RlPiBvcgotICAgIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGVzIChhcyBsb25nIGFzIHRoZWlyIG5hbWVzIGFyZSBjb25zaWRlcmVkCi0gICAgdmFsaWQgSmF2YSBpZGVudGlmaWVycywgdGhhdCBpcykuCi0gICAgVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSAic2V0YmVhbnMiIGF0dHJpYnV0ZSBvZiB0aGUgdGFzay4KLSAgICBUaGUgbmFtZSAicHJvamVjdCIgaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIFByb2plY3QsIHdoaWNoIGNhbiBiZQotICAgIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvamVjdCBuYW1lLiBUaGUgbmFtZSAic2VsZiIgaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIGFjdHVhbAotICAgIDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPi1UYXNrIGluc3RhbmNlLjxicj5Gcm9tIHRoZXNlIG9iamVjdHMgeW91IGhhdmUgYWNjZXNzIHRvIHRoZSBBbnQgSmF2YSBBUEksIHNlZSB0aGUKLTxhIGhyZWY9Ii4uL2FwaS9pbmRleC5odG1sIj5KYXZhRG9jPC9hPiAoZXNwZWNpYWxseSBmb3IKLTxhIGhyZWY9Ii4uL2FwaS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Lmh0bWwiPlByb2plY3Q8L2E+IGFuZAotPGEgaHJlZj0iLi4vYXBpL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08cD5JZiB5b3UgYXJlIHVzaW5nIEphdmFTY3JpcHQgdW5kZXIgQlNGLCBhIGdvb2QgcmVzb3VyY2UgaXMgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvcmhpbm8vZG9jLmh0bWwiPgotaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9yaGluby9kb2MuaHRtbDwvYT4gYXMgd2UgYXJlIHVzaW5nIHRoZWlyIEphdmFTY3JpcHQgaW50ZXJwcmV0ZXIuPC9wPgorPHA+RXhlY3V0ZSBhIHNjcmlwdCBpbiBhIDxhIGhyZWY9Imh0dHBzOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZiIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUgQlNGPC9hPgorb3IgPGEgaHJlZj0iaHR0cHM6Ly9qY3Aub3JnL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL21haW50ZW5hbmNlL2pzcjIyMy8yMjNDaGFuZ2VMb2cuaHRtbCIKK3RhcmdldD0iX3RvcCI+SlNSIDIyMzwvYT4gc3VwcG9ydGVkIGxhbmd1YWdlLgorPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkIGluIHRoZSBBcGFjaGUgQW50CitkaXN0cmlidXRpb24uICBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uPC9wPgorPHA+VGhlIHRhc2sgbWF5IHVzZSB0aGUgQlNGIHNjcmlwdGluZyBtYW5hZ2VyIG9yIHRoZSBKU1IgMjIzIG1hbmFnZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiBKREsgNiBhbmQKK2hpZ2hlci4gVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8dmFyPm1hbmFnZXI8L3Zhcj4gYXR0cmlidXRlLiBUaGUgSlNSIDIyMyBzY3JpcHRpbmcgbWFuYWdlciBpcworaW5kaWNhdGVkIGJ5IDxxPmphdmF4PC9xPi48L3A+Cis8cD5BbGwgaXRlbXMgKHRhc2tzLCB0YXJnZXRzLCBldGMpIG9mIHRoZSBydW5uaW5nIHByb2plY3QgYXJlIGFjY2Vzc2libGUgZnJvbSB0aGUgc2NyaXB0LCB1c2luZworZWl0aGVyIHRoZWlyIDx2YXI+bmFtZTwvdmFyPiBvciA8dmFyPmlkPC92YXI+IGF0dHJpYnV0ZXMgKGFzIGxvbmcgYXMgdGhlaXIgbmFtZXMgYXJlIGNvbnNpZGVyZWQKK3ZhbGlkIEphdmEgaWRlbnRpZmllcnMsIHRoYXQgaXMpLiAgVGhpcyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8dmFyPnNldGJlYW5zPC92YXI+IGF0dHJpYnV0ZSBvZiB0aGUKK3Rhc2suICBUaGUgbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+cHJvamVjdDwvY29kZT4gaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIFByb2plY3QsIHdoaWNoCitjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9qZWN0IG5hbWUuIFRoZSBuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5zZWxmPC9jb2RlPiBpcyBhIHByZS1kZWZpbmVkCityZWZlcmVuY2UgdG8gdGhlIGFjdHVhbCA8Y29kZT4mbHQ7c2NyaXB0Jmd0OzwvY29kZT4tVGFzayBpbnN0YW5jZS48YnIvPkZyb20gdGhlc2Ugb2JqZWN0cyB5b3UgaGF2ZQorYWNjZXNzIHRvIHRoZSBBbnQgSmF2YSBBUEksIHNlZSB0aGUgPGEgaHJlZj0iLi4vYXBpL2luZGV4Lmh0bWwiPkphdmFEb2M8L2E+IChlc3BlY2lhbGx5Citmb3IgPGEgaHJlZj0iLi4vYXBpL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QuaHRtbCI+UHJvamVjdDwvYT4KK2FuZCA8YSBocmVmPSIuLi9hcGkvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4pIGZvciBtb3JlCitpbmZvcm1hdGlvbi48L3A+Cis8cD5JZiB5b3UgYXJlIHVzaW5nIEphdmFTY3JpcHQgdW5kZXIgQlNGLCBhIGdvb2QgcmVzb3VyY2UKK2lzIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm1vemlsbGEub3JnL3JoaW5vL2RvYy5odG1sIgordGFyZ2V0PSJfdG9wIj5odHRwczovL3d3dy5tb3ppbGxhLm9yZy9yaGluby9kb2MuaHRtbDwvYT4gYXMgd2UgYXJlIHVzaW5nIHRoZWlyIEphdmFTY3JpcHQKK2ludGVycHJldGVyLjwvcD4KIDxwPlNjcmlwdHMgY2FuIGRvIGFsbW9zdCBhbnl0aGluZyBhIHRhc2sgd3JpdHRlbiBpbiBKYXZhIGNvdWxkIGRvLjwvcD4KLTxwPlJoaW5vIHByb3ZpZGVzIGEgc3BlY2lhbCBjb25zdHJ1Y3QgLSB0aGUgPGk+SmF2YUFkYXB0ZXI8L2k+LiBXaXRoIHRoYXQgeW91IGNhbgotY3JlYXRlIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcywgZXh0ZW5kcyBjbGFzc2VzIGFuZCBmb3Igd2hpY2ggeW91Ci1jYW4gb3ZlcndyaXRlIG1ldGhvZHMuIEJlY2F1c2UgdGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSAoeWV0KSwgaGVyZSBpcyB0aGUgbGluawotdG8gYW4gZXhwbGFuYXRpb246IDxhIGhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cHM/aGw9ZW4mbHI9JmllPVVURi04Jm9lPVVURi04Jm5ld3dpbmRvdz0xJmZyYW1lPXJpZ2h0JnRoPTYxMGQyZGI0NWMwNzU2YmQmc2Vla209MzkxRUVDM0MuNTIzNkQ5MjklNDB5YWhvby5jb20jbGluazIiPgotR3JvdXBzQEdvb2dsZTogIlJoaW5vLCBlbnVtLmpzLCBKYXZhQWRhcHRlcj8iPC9hPiBieSBOb3JyaXMgQm95ZCBpbiB0aGUgbmV3c2dyb3VwCi08aT5uZXRzY2FwZS5wdWJsaWMubW96aWxsYS5qc2VuZzwvaT4uPC9wPgorPHA+Umhpbm8gcHJvdmlkZXMgYSBzcGVjaWFsIGNvbnN0cnVjdCZtZGFzaDt0aGUgPGNvZGU+SmF2YUFkYXB0ZXI8L2NvZGU+LiBXaXRoIHRoYXQgeW91IGNhbiBjcmVhdGUKK2FuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHNldmVyYWwgaW50ZXJmYWNlcywgZXh0ZW5kcyBjbGFzc2VzIGFuZCBmb3Igd2hpY2ggeW91IGNhbiBvdmVyd3JpdGUKK21ldGhvZHMuIEJlY2F1c2UgdGhpcyBpcyBhbiB1bmRvY3VtZW50ZWQgZmVhdHVyZSAoeWV0KSwgaGVyZSBpcyB0aGUgbGluayB0byBhbgorZXhwbGFuYXRpb246IDxhIGhyZWY9Imh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFtc2cvbmV0c2NhcGUucHVibGljLm1vemlsbGEuanNlbmcvWWxSUUUwT3ZNOGMvRjhNdnEtWGtweGNKIgordGFyZ2V0PSJfdG9wIj5Hb29nbGUgR3JvdXBzOiAiUmhpbm8sIGVudW0uanMsIEphdmFBZGFwdGVyPyI8L2E+ICBieSBOb3JyaXMgQm95ZCBpbiB0aGUKK25ld3Nncm91cCA8ZW0+bmV0c2NhcGUucHVibGljLm1vemlsbGEuanNlbmc8L2VtPi48L3A+CiAKLTxwPklmIHlvdSBhcmUgY3JlYXRpbmcgVGFyZ2V0cyBwcm9ncmFtbWF0aWNhbGx5LCBtYWtlIHN1cmUgeW91IHNldCB0aGUKLUxvY2F0aW9uIHRvIGEgdXNlZnVsIHZhbHVlLiAgSW4gcGFydGljdWxhciBhbGwgdGFyZ2V0cyBzaG91bGQgaGF2ZQotZGlmZmVyZW50IGxvY2F0aW9uIHZhbHVlcy48L3A+Cis8cD5JZiB5b3UgYXJlIGNyZWF0aW5nIFRhcmdldHMgcHJvZ3JhbW1hdGljYWxseSwgbWFrZSBzdXJlIHlvdSBzZXQgdGhlIExvY2F0aW9uIHRvIGEgdXNlZnVsIHZhbHVlLgorSW4gcGFydGljdWxhciBhbGwgdGFyZ2V0cyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgbG9jYXRpb24gdmFsdWVzLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sYW5ndWFnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLgotICAgICAgTXVzdCBiZSBhIHN1cHBvcnRlZCBBcGFjaGUgQlNGIG9yIEpTUiAyMjMgbGFuZ3VhZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZD5UaGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhlIHNjcmlwdCBpcyB3cml0dGVuIGluLiAgTXVzdCBiZSBhIHN1cHBvcnRlZCBBcGFjaGUgQlNGIG9yIEpTUgorICAgICAgMjIzIGxhbmd1YWdlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuYWdlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIDxlbT5TaW5jZTogQW50IDEuNy4gPC9lbT4KLSAgICAgIFRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLiBUaGlzIGNhbiBoYXZlCi0gICAgICBvbmUgb2YgdGhyZWUgdmFsdWVzICgiYXV0byIsICJic2YiIG9yICJqYXZheCIpLgotICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgImF1dG8iLgotICAgICAgPGRsPgotICAgICAgICA8bGk+ImJzZiIgdXNlIHRoZSBCU0Ygc2NyaXB0aW5nIG1hbmFnZXIgdG8gcnVuCi0gICAgICAgICAgdGhlIGxhbmd1YWdlLjwvbGk+Ci0gICAgICAgIDxsaT4iamF2YXgiIHVzZSB0aGUgPGVtPmphdmF4LnNjcmlwdGluZzwvZW0+IG1hbmFnZXIKLSAgICAgICAgICB0byBydW4gdGhlIGxhbmd1YWdlLiAoVGhpcyB3aWxsIG9ubHkgd29yayBmb3IgSkRLNiBhbmQgaGlnaGVyKS48L2xpPgotICAgICAgICA8bGk+ImF1dG8iIHVzZSB0aGUgQlNGIGVuZ2luZSBpZiBpdCBleGlzdHMsCi0gICAgICAgICAgb3RoZXJ3aXNlIHVzZSB0aGUgPGVtPmphdmF4LnNjcmlwdGluZzwvZW0+IG1hbmFnZXIuPC9saT4KLSAgICAgIDwvZGw+CisgICAgPHRkPm1hbmFnZXI8L3RkPgorICAgIDx0ZD4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4uICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4gVGhpcyBjYW4gaGF2ZSBvbmUgb2YgdGhyZWUKKyAgICAgIHZhbHVlczogPHE+YXV0bzwvcT4sIDxxPmJzZjwvcT4gb3IgPHE+amF2YXg8L3E+LgorICAgICAgPHVsPgorICAgICAgICA8bGk+PHE+YnNmPC9xPiB1c2UgdGhlIEJTRiBzY3JpcHRpbmcgbWFuYWdlciB0byBydW4gdGhlIGxhbmd1YWdlLjwvbGk+CisgICAgICAgIDxsaT48cT5qYXZheDwvcT4gdXNlIHRoZSA8Y29kZT5qYXZheC5zY3JpcHRpbmc8L2NvZGU+IG1hbmFnZXIgdG8gcnVuIHRoZSBsYW5ndWFnZS4gKFRoaXMKKyAgICAgICAgICB3aWxsIG9ubHkgd29yayBmb3IgSkRLIDYgYW5kIGhpZ2hlcikuPC9saT4KKyAgICAgICAgPGxpPjxxPmF1dG88L3E+IHVzZSB0aGUgQlNGIGVuZ2luZSBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSB1c2UKKyAgICAgICAgICB0aGUgPGNvZGU+amF2YXguc2NyaXB0aW5nPC9jb2RlPiBtYW5hZ2VyLjwvbGk+CisgICAgICA8L3VsPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmF1dG88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGFzIGEgZmlsZSwgaWYgbm90IGlubGluZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPlRoZSBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0IGFzIGEgZmlsZSwgaWYgbm90IGlubGluZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2V0YmVhbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIHRvIHNldCB2YXJpYWJsZXMgZm9yCi0gICAgICBhbGwgcHJvcGVydGllcywgcmVmZXJlbmNlcyBhbmQgdGFyZ2V0cyBpbiB0aGUgcnVubmluZyBzY3JpcHQuCi0gICAgICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBmYWxzZSwgb25seSB0aGUgdGhlICJwcm9qZWN0IiBhbmQgInNlbGYiIHZhcmlhYmxlcyBhcmUgc2V0LgotICAgICAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgdHJ1ZSBhbGwgdGhlIHZhcmlhYmxlcyBhcmUgc2V0LiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICBhdHRyaWJ1dGUgaXMgInRydWUiLiAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLiA8ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+Ci0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2V0YmVhbnM8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyIHRvIHNldCB2YXJpYWJsZXMgZm9yIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzCisgICAgICBpbiB0aGUgcnVubmluZyBzY3JpcHQuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyA8cT5mYWxzZTwvcT4sIG9ubHkgdGhlIHRoZSA8Y29kZT5wcm9qZWN0PC9jb2RlPgorICAgICAgYW5kIDxjb2RlPnNlbGY8L2NvZGU+IHZhcmlhYmxlcyBhcmUgc2V0LiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgPHE+dHJ1ZTwvcT4gYWxsIHRoZSB2YXJpYWJsZXMKKyAgICAgIGFyZSBzZXQuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEKLSAgICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGgKKyAgICBkZWZpbmVkIGVsc2V3aGVyZS4KICAgICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PmNsYXNzcGF0aDwvaDQ+Ci0gIDxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+Ci08cD4KLSAgPGNvZGU+U2NyaXB0PC9jb2RlPidzIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gYXR0cmlidXRlIGlzIGEgCi0gIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQKLSAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuCi0gIDxwPgotICAgIElmIGEgY2xhc3NwYXRoIGlzIHNldCwgaXQgd2lsbCBiZSB1c2VkIGFzIHRoZSBjdXJyZW50IHRocmVhZAotICAgIGNvbnRleHQgY2xhc3Nsb2FkZXIsIGFuZAotICAgIGFzIHRoZSBjbGFzc2xvYWRlciBnaXZlbiB0byB0aGUgQlNGIG1hbmFnZXIuIAotICAgIFRoaXMgbWVhbnMgdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5Ci0gICAgdGhlIGNsYXNzcGF0aCBjb250YWluaW5nIHRoZSBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbiBmb3IgQlNGCi0gICAgb3IgZm9yIEpTUiAyMjMgbWFuYWdlcnMuCi0gICAgVGhpcyBjYW4gYmUgdXNlZnVsIGlmIG9uZSB3YW50cwotICAgIHRvIGtlZXAgJHt1c2VyLmhvbWV9Ly5hbnQvbGliIGZyZWUgb2YgbG90cyBvZiBzY3JpcHRpbmcgbGFuZ3VhZ2UKLSAgICBzcGVjaWZpYyBqYXIgZmlsZXMuCi0gIDwvcD4KLSAgPHA+Ci0gICAgPGI+TkI6IChTaW5jZSBBbnQgMS43LjEpPC9iPgotICAgIFRoaXMgY2xhc3NwYXRoIDxlbT5jYW48L2VtPiBiZSB1c2VkIHRvCi0gICAgc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YKLSAgICB0aGUgQlNGIGphciBmaWxlIGFuZC9vciBsYW5ndWFnZXMKLSAgICB0aGF0IGhhdmUgZW5naW5lcyBpbiB0aGUgQlNGIGphciBmaWxlLiBUaGlzIGluY2x1ZGVzIHRoZQotICAgIGphdmFzY3JpcHQsIGp5dGhvbiwgbmV0cmV4eCBhbmQgamFjbCBsYW5ndWFnZXMuCi0gIDwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+Cis8cD48Y29kZT5TY3JpcHQ8L2NvZGU+J3MgPHZhcj5jbGFzc3BhdGg8L3Zhcj4gYXR0cmlidXRlIGlzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2UKK3N0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuCiA8L3A+Cis8cD5JZiBhIGNsYXNzcGF0aCBpcyBzZXQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY3VycmVudCB0aHJlYWQgY29udGV4dCBjbGFzc2xvYWRlciwgYW5kIGFzIHRoZQorY2xhc3Nsb2FkZXIgZ2l2ZW4gdG8gdGhlIEJTRiBtYW5hZ2VyLiAgVGhpcyBtZWFucyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNsYXNzcGF0aAorY29udGFpbmluZyB0aGUgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb24gZm9yIEJTRiBvciBmb3IgSlNSIDIyMyBtYW5hZ2Vycy4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBvbmUKK3dhbnRzIHRvIGtlZXAgPHNhbXA+JHt1c2VyLmhvbWV9Ly5hbnQvbGliPC9zYW1wPiBmcmVlIG9mIGxvdHMgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlIHNwZWNpZmljIGphcgorZmlsZXMuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiAoPGVtPnNpbmNlIEFudCAxLjcuMTwvZW0+KSBUaGlzIGNsYXNzcGF0aCA8ZW0+Y2FuPC9lbT4gYmUgdXNlZCB0byBzcGVjaWZ5Cit0aGUgbG9jYXRpb24gb2YgdGhlIEJTRiBqYXIgZmlsZSBhbmQvb3IgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBlbmdpbmVzIGluIHRoZSBCU0YgamFyIGZpbGUuIFRoaXMKK2luY2x1ZGVzIHRoZSA8cT5qYXZhc2NyaXB0PC9xPiwgPHE+anl0aG9uPC9xPiwgPHE+bmV0cmV4eDwvcT4gYW5kIDxxPmphY2w8L3E+IGxhbmd1YWdlcy48L3A+CiA8aDM+RXhhbXBsZXM8L2gzPgotVGhlIGZvbGxvd2luZyBzbmlwcGV0IHNob3dzIHVzZSBvZiBmaXZlIGRpZmZlcmVudCBsYW5ndWFnZXM6Ci0gIDxibG9ja3F1b3RlPjxwcmU+Cis8cD5UaGUgZm9sbG93aW5nIHNuaXBwZXQgc2hvd3MgdXNlIG9mIGZpdmUgZGlmZmVyZW50IGxhbmd1YWdlczo8L3A+Cis8cHJlPgogICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iSGVsbG8gd29ybGQiLyZndDsKIAogICAgICZsdDtzY3JpcHQgbGFuZ3VhZ2U9Imdyb292eSImZ3Q7CkBAIC0xNzgsNzQgKzE1Nyw0OCBAQAogCiAgICAgJmx0O3NjcmlwdCBsYW5ndWFnZT0ianl0aG9uIiZndDsKIHByaW50ICJtZXNzYWdlIGlzICVzIiAlIG1lc3NhZ2UKLSAgICAmbHQ7L3NjcmlwdCZndDsKLTwvcHJlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICBOb3RlIHRoYXQgZm9yIHRoZSA8aT5qeXRob248L2k+IGV4YW1wbGUsIHRoZSBzY3JpcHQgY29udGVudHMgPGI+bXVzdDwvYj4KLSAgc3RhcnQgb24gdGhlIGZpcnN0IGNvbHVtbi4KLSAgPC9wPgotICA8cD4KLSAgICBOb3RlIGFsc28gdGhhdCBmb3IgdGhlIDxpPnJ1Ynk8L2k+IGV4YW1wbGUsIHRoZSBuYW1lcyBvZiB0aGUgc2V0IHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQKLSAgICBieSBhICckJy4KLSAgPHA+Ci0gICAgVGhlIGZvbGxvd2luZyBzY3JpcHQgc2hvd3MgYSBsaXR0bGUgbW9yZSBjb21wbGljYXRlZCBqcnVieSBleGFtcGxlOgotICA8L3A+Ci0gIDxibG9ja3F1b3RlPjxwcmU+CisgICAgJmx0Oy9zY3JpcHQmZ3Q7PC9wcmU+Cis8cD5Ob3RlIHRoYXQgZm9yIHRoZSA8cT5qeXRob248L3E+IGV4YW1wbGUsIHRoZSBzY3JpcHQgY29udGVudHMgPHN0cm9uZz5tdXN0PC9zdHJvbmc+IHN0YXJ0IG9uIHRoZQorZmlyc3QgY29sdW1uLjwvcD4KKzxwPk5vdGUgYWxzbyB0aGF0IGZvciB0aGUgPHE+cnVieTwvcT4gZXhhbXBsZSwgdGhlIG5hbWVzIG9mIHRoZSBzZXQgdmFyaWFibGVzIGFyZSBwcmVmaXhlZCBieQorYSA8cT4kPC9xPi48L3A+Cis8cD5UaGUgZm9sbG93aW5nIHNjcmlwdCBzaG93cyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIEpSdWJ5IGV4YW1wbGU6PC9wPgorPHByZT4KICZsdDtzY3JpcHQgbGFuZ3VhZ2U9InJ1YnkiJmd0OwogICB4bWxmaWxlcyA9IERpci5uZXcoIi4iKS5lbnRyaWVzLmRlbGV0ZV9pZiB7IHxpfCAhIChpID1+IC9cLnhtbCQvKSB9CiAgIHhtbGZpbGVzLnNvcnQuZWFjaCB7IHxpfCAkc2VsZi5sb2coaSkgfQotJmx0Oy9zY3JpcHQmZ3Q7Ci08L3ByZT4KLSAgPC9ibG9ja3F1b3RlPgotICA8cD4KLSAgICBUaGUgc2FtZSBleGFtcGxlIGluIGdyb292eSBpczoKLSAgPC9wPgotICA8YmxvY2txdW90ZT48cHJlPgorJmx0Oy9zY3JpcHQmZ3Q7PC9wcmU+Cis8cD5UaGUgc2FtZSBleGFtcGxlIGluIEdyb292eSBpczo8L3A+Cis8cHJlPgogJmx0O3NjcmlwdCBsYW5ndWFnZT0iZ3Jvb3Z5IiZndDsKICAgeG1sZmlsZXMgPSBuZXcgamF2YS5pby5GaWxlKCIuIikubGlzdEZpbGVzKCkuZmluZEFsbHsgaXQgPX4gIlwueG1sJCJ9Ci0gIHhtbGZpbGVzLnNvcnQoKS5lYWNoIHsgc2VsZi5sb2coaXQudG9TdHJpbmcoKSl9Ci0mbHQ7L3NjcmlwdCZndDsKLTwvcHJlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIGNsYXNzcGF0aCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbgotICAgIG9mIHRoZSBiZWFuc2hlbGwgamFyIGZpbGUuCi0gIDwvcD4KLSAgPGJsb2NrcXVvdGU+PHByZT4KKyAgeG1sZmlsZXMuc29ydCgpLmVhY2ggeyBzZWxmLmxvZyhpdC50b1N0cmluZygpKSB9CismbHQ7L3NjcmlwdCZndDs8L3ByZT4KKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIGNsYXNzcGF0aCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgYmVhbnNoZWxsIGphcgorZmlsZS48L3A+Cis8cHJlPgogJmx0O3NjcmlwdCBsYW5ndWFnZT0iYmVhbnNoZWxsIiBzZXRiZWFucz0idHJ1ZSImZ3Q7CiAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSIke3VzZXIuaG9tZX0vbGFuZy9iZWFuc2hlbGwiIGluY2x1ZGVzPSIqLmphciIgLyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dXNlci5ob21lfS9sYW5nL2JlYW5zaGVsbCIgaW5jbHVkZXM9IiouamFyIi8mZ3Q7CiAgICZsdDsvY2xhc3NwYXRoJmd0OwogICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIHdvcmxkIik7Ci0mbHQ7L3NjcmlwdCZndDsKLTwvcHJlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIFRoZSBmb2xsb3dpbmcgc2NyaXB0IHVzZXMgamF2YXNjcmlwdCB0byBjcmVhdGUgYSBudW1iZXIgb2YKLSAgICBlY2hvIHRhc2tzIGFuZCBleGVjdXRlIHRoZW0uCi0gIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+CismbHQ7L3NjcmlwdCZndDs8L3ByZT4KKzxwPlRoZSBmb2xsb3dpbmcgc2NyaXB0IHVzZXMgSmF2YVNjcmlwdCB0byBjcmVhdGUgYSBudW1iZXIgb2YgPGNvZGU+ZWNobzwvY29kZT4gdGFza3MgYW5kIGV4ZWN1dGUKK3RoZW0uPC9wPgorPHByZT4KICZsdDtwcm9qZWN0IG5hbWU9JnF1b3Q7c3F1YXJlcyZxdW90OyBkZWZhdWx0PSZxdW90O21haW4mcXVvdDsgYmFzZWRpcj0mcXVvdDsuJnF1b3Q7Jmd0OwotCiAgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDttYWluJnF1b3Q7Jmd0OwotCiAgICAgJmx0O3NjcmlwdCBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OyAmbHQ7IVtDREFUQVsKLQotICAgICAgZm9yIChpPTE7IGkmbHQ7PTEwOyBpKyspIHsKKyAgICAgIGZvciAoaSA9IDE7IGkgJmx0Oz0gMTA7IGkrKykgewogICAgICAgICBlY2hvID0gc3F1YXJlcy5jcmVhdGVUYXNrKCZxdW90O2VjaG8mcXVvdDspOwogICAgICAgICBlY2hvLnNldE1lc3NhZ2UoaSppKTsKICAgICAgICAgZWNoby5wZXJmb3JtKCk7CiAgICAgICB9Ci0KICAgICBdXSZndDsgJmx0Oy9zY3JpcHQmZ3Q7Ci0KICAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIDxwPmdlbmVyYXRlczwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogbWFpbjoKIDEKIDQKQEAgLTI1OCwxNSArMjExLDEzIEBACiA4MQogMTAwCiAKLUJVSUxEIFNVQ0NFU1NGVUwKLTwvcHJlPjwvYmxvY2txdW90ZT4KK0JVSUxEIFNVQ0NFU1NGVUw8L3ByZT4KIAotPHA+Tm93IGEgbW9yZSBjb21wbGV4IGV4YW1wbGUgdXNpbmcgdGhlIEphdmEgQVBJIGFuZCB0aGUgQW50IEFQSS4gVGhlIGdvYWwgaXMgdG8gbGlzdCB0aGUKLWZpbGVzaXplcyBvZiBhbGwgZmlsZXMgYSA8Y29kZT4mbHQ7ZmlsZXNldC8mZ3Q7PC9jb2RlPiBjYXVnaHQuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLQotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OwotJmx0O3Byb2plY3QgbmFtZT0iPGZvbnQgY29sb3I9Ymx1ZT5NeVByb2plY3Q8L2ZvbnQ+IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIiZndDsKKzxwPk5vdyBhIG1vcmUgY29tcGxleCBleGFtcGxlIHVzaW5nIHRoZSBKYXZhIEFQSSBhbmQgdGhlIEFudCBBUEkuIFRoZSBnb2FsIGlzIHRvIGxpc3QgdGhlIGZpbGUgc2l6ZXMKK29mIGFsbCBmaWxlcyBhIDxjb2RlPiZsdDtmaWxlc2V0LyZndDs8L2NvZGU+IGNhdWdodC48L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKKyZsdDtwcm9qZWN0IG5hbWU9IjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5NeVByb2plY3Q8L3NwYW4+IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIiZndDsKIAogICAmbHQ7cHJvcGVydHkgbmFtZT0iZnMuZGlyIiB2YWx1ZT0ic3JjIi8mZ3Q7CiAgICZsdDtwcm9wZXJ0eSBuYW1lPSJmcy5pbmNsdWRlcyIgdmFsdWU9IioqLyoudHh0Ii8mZ3Q7CkBAIC0yNzQsMjAgKzIyNSwyNCBAQAogCiAgICZsdDt0YXJnZXQgbmFtZT0ibWFpbiImZ3Q7CiAgICAgJmx0O3NjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCImZ3Q7ICZsdDshW0NEQVRBWwotCiAgICAgICAvLyBpbXBvcnQgc3RhdGVtZW50cwotICAgICAgPGZvbnQgY29sb3I9Ymx1ZT4vLyBpbXBvcnRQYWNrYWdlKGphdmEuaW8pPC9mb250PjsKLSAgICAgIDxmb250IGNvbG9yPWJsdWU+aW1wb3J0Q2xhc3MoamF2YS5pby5GaWxlKTwvZm9udD47CisgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+Ly8gaW1wb3J0UGFja2FnZShqYXZhLmlvKTwvc3Bhbj47CisgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+aW1wb3J0Q2xhc3MoamF2YS5pby5GaWxlKTwvc3Bhbj47CisgICAgICAvLyBOYXNob3JuIHN5bnRheAorICAgICAgLy8gPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPmxvYWQoIm5hc2hvcm46bW96aWxsYV9jb21wYXQuanMiKTs8L3NwYW4+CisgICAgICAvLyBvcgorICAgICAgLy8gPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPnZhciBGaWxlID0gSmF2YS50eXBlKCdqYXZhLmlvLkZpbGUnKTs8L3NwYW4+CisKIAogICAgICAgLy8gQWNjZXNzIHRvIEFudC1Qcm9wZXJ0aWVzIGJ5IHRoZWlyIG5hbWVzCi0gICAgICBkaXIgICAgICA9IDxmb250IGNvbG9yPWJsdWU+cHJvamVjdDwvZm9udD4uZ2V0UHJvcGVydHkoImZzLmRpciIpOwotICAgICAgaW5jbHVkZXMgPSA8Zm9udCBjb2xvcj1ibHVlPk15UHJvamVjdDwvZm9udD4uZ2V0UHJvcGVydHkoImZzLmluY2x1ZGVzIik7Ci0gICAgICBleGNsdWRlcyA9IDxmb250IGNvbG9yPWJsdWU+c2VsZi5nZXRQcm9qZWN0KCk8L2ZvbnQ+ICAuPGZvbnQgY29sb3I9Ymx1ZT5nZXRQcm9wZXJ0eSgiZnMuZXhjbHVkZXMiKTwvZm9udD47CisgICAgICBkaXIgICAgICA9IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5wcm9qZWN0PC9zcGFuPi5nZXRQcm9wZXJ0eSgiZnMuZGlyIik7CisgICAgICBpbmNsdWRlcyA9IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5NeVByb2plY3Q8L3NwYW4+LmdldFByb3BlcnR5KCJmcy5pbmNsdWRlcyIpOworICAgICAgZXhjbHVkZXMgPSA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+c2VsZi5nZXRQcm9qZWN0KCk8L3NwYW4+LjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5nZXRQcm9wZXJ0eSgiZnMuZXhjbHVkZXMiKTwvc3Bhbj47CiAKICAgICAgIC8vIENyZWF0ZSBhICZsdDtmaWxlc2V0IGRpcj0iIiBpbmNsdWRlcz0iIi8mZ3Q7Ci0gICAgICBmcyA9IHByb2plY3QuPGZvbnQgY29sb3I9Ymx1ZT5jcmVhdGVEYXRhVHlwZSgiZmlsZXNldCIpPC9mb250PjsKLSAgICAgIGZzLnNldERpciggbmV3IEZpbGUoZGlyKSApOwotICAgICAgPGZvbnQgY29sb3I9Ymx1ZT5mcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk8L2ZvbnQ+OworICAgICAgZnMgPSBwcm9qZWN0LjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5jcmVhdGVEYXRhVHlwZSgiZmlsZXNldCIpPC9zcGFuPjsKKyAgICAgIGZzLnNldERpcihuZXcgRmlsZShkaXIpKTsKKyAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5mcy5zZXRJbmNsdWRlcyhpbmNsdWRlcyk8L3NwYW4+OwogICAgICAgZnMuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwogCiAgICAgICAvLyBHZXQgdGhlIGZpbGVzIChhcnJheSkgb2YgdGhhdCBmaWxlc2V0CkBAIC0yOTUsNTAgKzI1MCw0OSBAQAogICAgICAgc3JjRmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CiAKICAgICAgIC8vIGl0ZXJhdGUgb3ZlciB0aGF0IGFycmF5Ci0gICAgICBmb3IgKGk9MDsgaSZsdDtzcmNGaWxlcy5sZW5ndGg7IGkrKykgeworICAgICAgZm9yIChpID0gMDsgaSAmbHQ7IHNyY0ZpbGVzLmxlbmd0aDsgaSsrKSB7CiAKICAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZXMgdmlhIEphdmEgQVBJCiAgICAgICAgIHZhciBiYXNlZGlyICA9IGZzLmdldERpcihwcm9qZWN0KTsKICAgICAgICAgdmFyIGZpbGVuYW1lID0gc3JjRmlsZXNbaV07Ci0gICAgICAgIHZhciBmaWxlID0gPGZvbnQgY29sb3I9Ymx1ZT5uZXcgRmlsZShiYXNlZGlyLCBmaWxlbmFtZSk8L2ZvbnQ+OworICAgICAgICB2YXIgZmlsZSA9IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5uZXcgRmlsZShiYXNlZGlyLCBmaWxlbmFtZSk8L3NwYW4+OwogICAgICAgICB2YXIgc2l6ZSA9IGZpbGUubGVuZ3RoKCk7CiAKICAgICAgICAgLy8gY3JlYXRlIGFuZCB1c2UgYSBUYXNrIHZpYSBBbnQgQVBJCi0gICAgICAgIGVjaG8gPSBNeVByb2plY3QuPGZvbnQgY29sb3I9Ymx1ZT5jcmVhdGVUYXNrKCJlY2hvIik8L2ZvbnQ+OworICAgICAgICBlY2hvID0gTXlQcm9qZWN0LjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5jcmVhdGVUYXNrKCJlY2hvIik8L3NwYW4+OwogICAgICAgICBlY2hvLnNldE1lc3NhZ2UoZmlsZW5hbWUgKyAiOiAiICsgc2l6ZSArICIgYnl0ZSIpOwotICAgICAgICBlY2hvLjxmb250IGNvbG9yPWJsdWU+cGVyZm9ybSgpPC9mb250PjsKKyAgICAgICAgZWNoby48c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+cGVyZm9ybSgpPC9zcGFuPjsKICAgICAgIH0KICAgICBdXSZndDsmbHQ7L3NjcmlwdCZndDsKICAgJmx0Oy90YXJnZXQmZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5XZSB3YW50IHRvIHVzZSB0aGUgSmF2YSBBUEkuIEJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhbHdheXMgdHlwaW5nIHRoZSBwYWNrYWdlIHNpZ25hdHVyZQotd2UgZG8gYW4gaW1wb3J0LiBSaGlubyBrbm93cyB0d28gZGlmZmVyZW50IG1ldGhvZHMgZm9yIGltcG9ydCBzdGF0ZW1lbnRzOiBvbmUgZm9yIHBhY2thZ2VzCi1hbmQgb25lIGZvciBhIHNpbmdsZSBjbGFzcy4gQnkgZGVmYXVsdCBvbmx5IHRoZSA8aT5qYXZhPC9pPiBwYWNrYWdlcyBhcmUgYXZhaWxhYmxlLCBzbwotPGk+amF2YS5sYW5nLlN5c3RlbTwvaT4gY2FuIGJlIGRpcmVjdGx5IGltcG9ydGVkIHdpdGggPGNvZGU+aW1wb3J0Q2xhc3MvaW1wb3J0UGFja2FnZTwvY29kZT4uCi1Gb3Igb3RoZXIgcGFja2FnZXMgeW91IGhhdmUgdG8gcHJlZml4IHRoZSBmdWxsIGNsYXNzaWZpZWQgbmFtZSB3aXRoIDxpPlBhY2thZ2VzPC9pPi4KLUZvciBleGFtcGxlIEFudCdzIDxpPkZpbGVVdGlsczwvaT4gY2xhc3MgY2FuIGJlIGltcG9ydGVkIHdpdGgKLTxjb2RlPmltcG9ydENsYXNzKDxiPlBhY2thZ2VzPC9iPi5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscyk8L2NvZGU+Ci08YnI+Ci1UaGUgPGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+IHRhc2sgcG9wdWxhdGVzIHRoZSBQcm9qZWN0IGluc3RhbmNlIHVuZGVyCi10aGUgbmFtZSA8aT5wcm9qZWN0PC9pPiwgc28gd2UgY2FuIHVzZSB0aGF0IHJlZmVyZW5jZS4gQW5vdGhlciB3YXkgaXMgdG8gdXNlIGl0cyBnaXZlbiBuYW1lCi1vciBnZXR0aW5nIGl0cyByZWZlcmVuY2UgZnJvbSB0aGUgdGFzayBpdHNlbGYuPGJyPgotVGhlIFByb2plY3QgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIGFuZCBzZXR0aW5nIHByb3BlcnRpZXMsIGNyZWF0aW5nIERhdGFUeXBlcyBhbmQKLVRhc2tzIGFuZCBtdWNoIG1vcmUuPGJyPgotQWZ0ZXIgY3JlYXRpbmcgYSBGaWxlU2V0IG9iamVjdCB3ZSBpbml0aWFsaXplIHRoYXQgYnkgY2FsbGluZyBpdHMgc2V0LW1ldGhvZHMuIFRoZW4gd2UgY2FuCi11c2UgdGhhdCBvYmplY3QgbGlrZSBhIG5vcm1hbCBBbnQgdGFzayAoPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiBmb3IgZXhhbXBsZSkuPGJyPgotRm9yIGdldHRpbmcgdGhlIHNpemUgb2YgYSBmaWxlIHdlIGluc3RhbnRpYXRlIGEgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPi4gU28gd2UgYXJlIHVzaW5nCi1ub3JtYWwgSmF2YSBBUEkgaGVyZS48YnI+Ci1GaW5hbGx5IHdlIHVzZSB0aGUgPGNvZGU+Jmx0O2VjaG8mZ3Q7PC9jb2RlPiB0YXNrIGZvciBwcm9kdWNpbmcgdGhlIG91dHB1dC4gVGhlIHRhc2sgaXMgbm90IGV4ZWN1dGVkIGJ5Ci1pdHMgZXhlY3V0ZSgpIG1ldGhvZCwgYmVjYXVzZSB0aGUgcGVyZm9ybSgpIG1ldGhvZCAoaW1wbGVtZW50ZWQgaW4gVGFzayBpdHNlbGYpIGRvZXMgdGhlCi1hcHByb3ByaWF0ZSBsb2dnaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgaW52b2tpbmcgZXhlY3V0ZSgpLgotPC9wPgotPHA+Ci0gIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBiZWFuc2hlbGwgdG8gY3JlYXRlIGFuIGFudAotICB0YXNrLiBUaGlzIHRhc2sgd2lsbCBhZGQgZmlsZXNldHMgYW5kIHBhdGhzIHRvIGEgcmVmZXJlbmNlZAotICBwYXRoLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBjcmVhdGVkLgotPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KKzxwPldlIHdhbnQgdG8gdXNlIHRoZSBKYXZhIEFQSS4gQmVjYXVzZSB3ZSBkb24ndCB3YW50IGFsd2F5cyB0eXBpbmcgdGhlIHBhY2thZ2Ugc2lnbmF0dXJlIHdlIGRvIGFuCitpbXBvcnQuIFJoaW5vIGtub3dzIHR3byBkaWZmZXJlbnQgbWV0aG9kcyBmb3IgaW1wb3J0IHN0YXRlbWVudHM6IG9uZSBmb3IgcGFja2FnZXMgYW5kIG9uZSBmb3IgYQorc2luZ2xlIGNsYXNzLiBCeSBkZWZhdWx0IG9ubHkgdGhlIDxjb2RlPmphdmE8L2NvZGU+IHBhY2thZ2VzIGFyZSBhdmFpbGFibGUsCitzbyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5sYW5nLlN5c3RlbTwvY29kZT4gY2FuIGJlIGRpcmVjdGx5IGltcG9ydGVkCit3aXRoIDxjb2RlPmltcG9ydENsYXNzPC9jb2RlPi88Y29kZT5pbXBvcnRQYWNrYWdlPC9jb2RlPi4gRm9yIG90aGVyIHBhY2thZ2VzIHlvdSBoYXZlIHRvIHByZWZpeCB0aGUKK2Z1bGwgY2xhc3NpZmllZCBuYW1lIHdpdGggPHN0cm9uZz5QYWNrYWdlczwvc3Ryb25nPi4gRm9yIGV4YW1wbGUKK0FudCdzIDxjb2RlIGNsYXNzPSJjb2RlIj5GaWxlVXRpbHM8L2NvZGU+IGNsYXNzIGNhbiBiZSBpbXBvcnRlZAord2l0aCA8Y29kZSBjbGFzcz0iY29kZSI+aW1wb3J0Q2xhc3MoPHN0cm9uZz5QYWNrYWdlczwvc3Ryb25nPi5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlscyk8L2NvZGU+PC9wPgorPHA+SW4gSmF2YSA4KywgeW91IG1heSB1c2UgdGhlIGJ1aWx0LWluIE5hc2hvcm4gSmF2YVNjcmlwdCBlbmdpbmUgcmF0aGVyIHRoYW4gUmhpbm8gKHdoaWNoIGlzCithdmFpbGFibGUgaW4gSmF2YSA3IHJ1bnRpbWUpLiBUaGVuLCB1c2UgPGNvZGU+SmF2YS50eXBlPC9jb2RlPiBhcyBpbXBvcnQgc3RhdGVtZW50IGZvciBhbnkgSmF2YQorY2xhc3MKK29yIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zY3JpcHRpbmcvcHJvZ19ndWlkZS9qYXZhc2NyaXB0Lmh0bWwjQTExNDcyMDciPnRoZQorY29tcGF0aWJpbGl0eSBzY3JpcHQ8L2E+OiA8Y29kZT5sb2FkKCJuYXNob3JuOm1vemlsbGFfY29tcGF0LmpzIik7PC9jb2RlPi48L3A+Cis8cD5UaGUgPGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+IHRhc2sgcG9wdWxhdGVzIHRoZSBQcm9qZWN0IGluc3RhbmNlIHVuZGVyIHRoZQorbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+cHJvamVjdDwvY29kZT4sIHNvIHdlIGNhbiB1c2UgdGhhdCByZWZlcmVuY2UuIEFub3RoZXIgd2F5IGlzIHRvIHVzZSBpdHMKK2dpdmVuIG5hbWUgb3IgZ2V0dGluZyBpdHMgcmVmZXJlbmNlIGZyb20gdGhlIHRhc2sgaXRzZWxmLiBUaGUgUHJvamVjdCBwcm92aWRlcyBtZXRob2RzIGZvciBhY2Nlc3NpbmcKK2FuZCBzZXR0aW5nIHByb3BlcnRpZXMsIGNyZWF0aW5nIERhdGFUeXBlcyBhbmQgVGFza3MgYW5kIG11Y2ggbW9yZS48YnIvPkFmdGVyIGNyZWF0aW5nIGEgRmlsZVNldAorb2JqZWN0IHdlIGluaXRpYWxpemUgdGhhdCBieSBjYWxsaW5nIGl0cyBzZXQtbWV0aG9kcy4gVGhlbiB3ZSBjYW4gdXNlIHRoYXQgb2JqZWN0IGxpa2UgYSBub3JtYWwgQW50Cit0YXNrICg8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IGZvciBleGFtcGxlKS48YnIvPkZvciBnZXR0aW5nIHRoZSBzaXplIG9mIGEgZmlsZSB3ZSBpbnN0YW50aWF0ZQorYSA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5pby5GaWxlPC9jb2RlPi4gU28gd2UgYXJlIHVzaW5nIG5vcm1hbCBKYXZhIEFQSSBoZXJlLjxici8+RmluYWxseSB3ZSB1c2UKK3RoZSA8Y29kZT4mbHQ7ZWNobyZndDs8L2NvZGU+IHRhc2sgZm9yIHByb2R1Y2luZyB0aGUgb3V0cHV0LiBUaGUgdGFzayBpcyBub3QgZXhlY3V0ZWQgYnkKK2l0cyA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZSgpPC9jb2RlPiBtZXRob2QsIGJlY2F1c2UgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5wZXJmb3JtKCk8L2NvZGU+CittZXRob2QgKGltcGxlbWVudGVkIGluIFRhc2sgaXRzZWxmKSBkb2VzIHRoZSBhcHByb3ByaWF0ZSBsb2dnaW5nIGJlZm9yZSBhbmQgYWZ0ZXIKK2ludm9raW5nIDxjb2RlIGNsYXNzPSJjb2RlIj5leGVjdXRlKCk8L2NvZGU+LjwvcD4KKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyBiZWFuc2hlbGwgdG8gY3JlYXRlIGFuIEFudCB0YXNrLiBUaGlzIHRhc2sgd2lsbCBhZGQgZmlsZXNldHMgYW5kCitwYXRocyB0byBhIHJlZmVyZW5jZWQgcGF0aC4gSWYgdGhlIHBhdGggZG9lcyBub3QgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC48L3A+Cis8cHJlPgogJmx0OyEtLQogICAgICAgIERlZmluZSBhZGR0b3BhdGggdGFzawogIC0tJmd0OwpAQCAtMzY2LDE1ICszMjAsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBwcm9qZWN0LmFkZFRhc2tEZWZpbml0aW9uKCJhZGR0b3BhdGgiLCBBZGRUb1BhdGguY2xhc3MpOwotJmx0Oy9zY3JpcHQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIEFuIGV4YW1wbGUgb2YgdXNpbmcgdGhpcyB0YXNrIHRvIGNyZWF0ZSBhIHBhdGgKLSAgICBmcm9tIGEgbGlzdCBvZiBkaXJlY3RvcmllcyAodXNpbmcgYW50Y29udHJpYidzCi0gICAgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC90YXNrcy90YXNrcy9mb3IuaHRtbCI+Ci0gICAgICAmbHQ7Zm9yJmd0OzwvYT4gdGFzaykgZm9sbG93czoKLSAgPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvc2NyaXB0Jmd0OzwvcHJlPgorPHA+QW4gZXhhbXBsZSBvZiB1c2luZyB0aGlzIHRhc2sgdG8gY3JlYXRlIGEgcGF0aCBmcm9tIGEgbGlzdCBvZiBkaXJlY3RvcmllcyAodXNpbmcKK0FudC1Db250cmliJ3MgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC90YXNrcy90YXNrcy9mb3IuaHRtbCIKK3RhcmdldD0iX3RvcCI+Jmx0O2ZvciZndDs8L2E+IHRhc2spIGZvbGxvd3M6PC9wPgorPHByZT4KICZsdDtwYXRoIGlkPSJtYWluLnBhdGgiJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9ImJ1aWxkL2NsYXNzZXMiLyZndDsKICZsdDsvcGF0aCZndDsKQEAgLTM4Niw4ICszMzYsNyBAQAogICAgICAgICAgICAgICAgaW5jbHVkZXM9IioqLyouamFyIi8mZ3Q7CiAgICAgJmx0Oy9hZGR0b3BhdGgmZ3Q7CiAgICZsdDsvc2VxdWVudGlhbCZndDsKLSZsdDsvYWM6Zm9yJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9hYzpmb3ImZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zY3JpcHRkZWYuaHRtbCBiL21hbnVhbC9UYXNrcy9zY3JpcHRkZWYuaHRtbAppbmRleCAzOGMzZmZmLi42ODBmMWE4IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc2NyaXB0ZGVmLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NjcmlwdGRlZi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzE5ICsxNSwyNzYgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlNjcmlwdGRlZiBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJzY3JpcHQiPlNjcmlwdGRlZjwvYT48L2gyPgorPGgyIGlkPSJzY3JpcHQiPlNjcmlwdGRlZjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+U2NyaXB0ZGVmIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBBcGFjaGUgQW50IHRhc2sgdXNpbmcgYSBzY3JpcHRpbmcgbGFuZ3VhZ2UuIEFudAotc2NyaXB0aW5nIGxhbmd1YWdlcyBzdXBwb3J0ZWQgYnkKLTxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIiB0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+IAotb3IKLSAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgotbWF5IGJlCi11c2VkIHRvIGRlZmluZSB0aGUgc2NyaXB0LiBTY3JpcHRkZWYgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gZW5jYXBzdWxhdGUKLWNvbnRyb2wgbG9naWMgZnJvbSBhIGJ1aWxkIHdpdGhpbiBhbiBBbnQgdGFzayBtaW5pbWl6aW5nIHRoZSBuZWVkIGZvcgotcHJvdmlkaW5nIGNvbnRyb2wgc3R5bGUgdGFza3MgaW4gQW50IGl0c2VsZi4gQ29tcGxleCBsb2dpYyBjYW4gYmUgbWFkZQotYXZhaWxhYmxlIHdoaWxlIHJldGFpbmluZyB0aGUgc2ltcGxlIHN0cnVjdHVyZSBvZiBhbiBBbnQgYnVpbGQgZmlsZS4gU2NyaXB0ZGVmCi1pcyBhbHNvIHVzZWZ1bCBmb3IgcHJvdG90eXBpbmcgbmV3IGN1c3RvbSB0YXNrcy4gQ2VydGFpbmx5IGFzIHRoZSBjb21wbGV4aXR5Ci1vZiB0aGUgc2NyaXB0IGluY3JlYXNlcyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gbWlncmF0ZSB0aGUgdGFzayBkZWZpbml0aW9uCi1pbnRvIGEgSmF2YSBiYXNlZCBjdXN0b20gdGFzay4KLTwvcD4KKzxwPjxjb2RlPlNjcmlwdGRlZjwvY29kZT4gY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFuIEFwYWNoZSBBbnQgdGFzayB1c2luZyBhIHNjcmlwdGluZyBsYW5ndWFnZS4gQW50CitzY3JpcHRpbmcgbGFuZ3VhZ2VzIHN1cHBvcnRlZCBieSA8YSBocmVmPSJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlCitCU0Y8L2E+IG9yIDxhIGhyZWY9Imh0dHBzOi8vamNwLm9yZy9hYm91dEphdmEvY29tbXVuaXR5cHJvY2Vzcy9tYWludGVuYW5jZS9qc3IyMjMvMjIzQ2hhbmdlTG9nLmh0bWwiCit0YXJnZXQ9Il90b3AiPkpTUiAyMjM8L2E+IG1heSBiZSB1c2VkIHRvIGRlZmluZSB0aGUgc2NyaXB0LiA8Y29kZT5TY3JpcHRkZWY8L2NvZGU+IHByb3ZpZGVzIGEKK21lY2hhbmlzbSB0byBlbmNhcHN1bGF0ZSBjb250cm9sIGxvZ2ljIGZyb20gYSBidWlsZCB3aXRoaW4gYW4gQW50IHRhc2sgbWluaW1pemluZyB0aGUgbmVlZCBmb3IKK3Byb3ZpZGluZyBjb250cm9sIHN0eWxlIHRhc2tzIGluIEFudCBpdHNlbGYuIENvbXBsZXggbG9naWMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHdoaWxlIHJldGFpbmluZyB0aGUKK3NpbXBsZSBzdHJ1Y3R1cmUgb2YgYW4gQW50IGJ1aWxkIGZpbGUuIDxjb2RlPlNjcmlwdGRlZjwvY29kZT4gaXMgYWxzbyB1c2VmdWwgZm9yIHByb3RvdHlwaW5nIG5ldworY3VzdG9tIHRhc2tzLiBDZXJ0YWlubHkgYXMgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHNjcmlwdCBpbmNyZWFzZXMgaXQgd291bGQgYmUgYmV0dGVyIHRvIG1pZ3JhdGUgdGhlCit0YXNrIGRlZmluaXRpb24gaW50byBhIEphdmEgYmFzZWQgY3VzdG9tIHRhc2suPC9wPgogCi08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUKLUFudCBkaXN0cmlidXRpb24uIFNlZQotPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPgotZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotCi0KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50CitkaXN0cmlidXRpb24uIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlCitpbmZvcm1hdGlvbi48L3A+CiAKIDxwPlRoZSBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgc3VwcG9ydGVkIGJ5IHRoZSB0YXNrIG1heSBiZSBkZWZpbmVkCiB1c2luZyA8Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtlbGVtZW50Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnRzLiBUaGVzZSBhcmUKLWF2YWlsYWJsZSB0byB0aGUgc2NyaXB0IHRoYXQgaW1wbGVtZW50cyB0aGUgdGFzayBhcyB0d28gY29sbGVjdGlvbiBzdHlsZQotc2NyaXB0IHZhcmlhYmxlcyA8Y29kZT5hdHRyaWJ1dGVzPC9jb2RlPiBhbmQgPGNvZGU+ZWxlbWVudHM8L2NvZGU+LiBUaGUKLWVsZW1lbnRzIGluIHRoZSA8Y29kZT5hdHRyaWJ1dGVzPC9jb2RlPiBjb2xsZWN0aW9uIG1heSBiZSBhY2Nlc3NlZCBieSB0aGUKLWF0dHJpYnV0ZSBuYW1lLiBUaGUgPGNvZGU+ZWxlbWVudHM8L2NvZGU+IGNvbGxlY3Rpb24gaXMgYWNjZXNzZWQgYnkgdGhlIG5lc3RlZAotZWxlbWVudCBuYW1lLiBUaGlzIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoZSBuZXN0ZWQgZWxlbWVudC4KLVRoZSBpbnN0YW5jZXMgaW4gdGhpcyBsaXN0IG1heSBiZSBhY2Nlc3NlZCBieSBhbiBpbnRlZ2VyIGluZGV4LgotPC9wPgorYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHQgdGhhdCBpbXBsZW1lbnRzIHRoZSB0YXNrIGFzIHR3byBjb2xsZWN0aW9uIHN0eWxlIHNjcmlwdAordmFyaWFibGVzIDxjb2RlIGNsYXNzPSJjb2RlIj5hdHRyaWJ1dGVzPC9jb2RlPiBhbmQgPGNvZGUgY2xhc3M9ImNvZGUiPmVsZW1lbnRzPC9jb2RlPi4gVGhlIGVsZW1lbnRzCitpbiB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmF0dHJpYnV0ZXM8L2NvZGU+IGNvbGxlY3Rpb24gbWF5IGJlIGFjY2Vzc2VkIGJ5IHRoZSBhdHRyaWJ1dGUKK25hbWUuIFRoZSA8Y29kZSBjbGFzcz0iY29kZSI+ZWxlbWVudHM8L2NvZGU+IGNvbGxlY3Rpb24gaXMgYWNjZXNzZWQgYnkgdGhlIG5lc3RlZCBlbGVtZW50IG5hbWUuIFRoaXMKK3dpbGwgcmV0dXJuIGEgbGlzdCBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoZSBuZXN0ZWQgZWxlbWVudC4gIFRoZSBpbnN0YW5jZXMgaW4gdGhpcyBsaXN0IG1heSBiZQorYWNjZXNzZWQgYnkgYW4gaW50ZWdlciBpbmRleC48L3A+CiAKLTxwPjxiPk5vdGU6PC9iPiBBbnQgd2lsbCB0dXJuIGFsbCBhdHRyaWJ1dGUgYW5kIGVsZW1lbnQgbmFtZXMgaW50byBhbGwKLWxvd2VyY2FzZSBuYW1lcywgc28gZXZlbiBpZiB5b3UgdXNlIG5hbWU9IlNvbWVBdHRyaWJ1dGUiLCB5b3UnbGwgaGF2ZQotdG8gdXNlICJzb21lYXR0cmlidXRlIiB0byByZXRyaWV2ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgZnJvbSB0aGUKLTxjb2RlPmF0dHJpYnV0ZXM8L2NvZGU+IGNvbGxlY3Rpb24uPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBBbnQgd2lsbCB0dXJuIGFsbCBhdHRyaWJ1dGUgYW5kIGVsZW1lbnQgbmFtZXMgaW50byBhbGwgbG93ZXJjYXNlIG5hbWVzLCBzbworZXZlbiBpZiB5b3UgdXNlIDx2YXI+bmFtZTwvdmFyPj08cT5Tb21lQXR0cmlidXRlPC9xPiwgeW91J2xsIGhhdmUgdG8gdXNlIDxxPnNvbWVhdHRyaWJ1dGU8L3E+IHRvCityZXRyaWV2ZSB0aGUgYXR0cmlidXRlJ3MgdmFsdWUgZnJvbSB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmF0dHJpYnV0ZXM8L2NvZGU+IGNvbGxlY3Rpb24uPC9wPgogCi08cD5UaGUgbmFtZSAic2VsZiIgKDxpPnNpbmNlIEFudCAxLjYuMzwvaT4pIGlzIGEgcHJlLWRlZmluZWQgcmVmZXJlbmNlIHRvIHRoZQotICAgIHNjcmlwdCBkZWYgdGFzayBpbnN0YW5jZS4KLSAgICBJdCBjYW4gYmUgdXNlZCBmb3IgbG9nZ2luZywgb3IgZm9yIGludGVncmF0aW9uIHdpdGggdGhlIHJlc3Qgb2YKLSAgICBhbnQuIHRoZSA8Y29kZT5zZWxmLnRleHQgYXR0cmlidXRlPC9jb2RlPiBjb250YWlucwotICAgIGFueSBuZXN0ZWQgdGV4dCBwYXNzZWQgdG8gdGhlIHNjcmlwdDwvcD4KKzxwPlRoZSBuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5zZWxmPC9jb2RlPiAoPGVtPnNpbmNlIEFudCAxLjYuMzwvZW0+KSBpcyBhIHByZS1kZWZpbmVkIHJlZmVyZW5jZSB0bwordGhlIDxjb2RlPnNjcmlwdGRlZjwvY29kZT4gdGFzayBpbnN0YW5jZS4gIEl0IGNhbiBiZSB1c2VkIGZvciBsb2dnaW5nLCBvciBmb3IgaW50ZWdyYXRpb24gd2l0aCB0aGUKK3Jlc3Qgb2YgQW50LiBUaGUgPGNvZGUgY2xhc3M9ImNvZGUiPnNlbGYudGV4dDwvY29kZT4gYXR0cmlidXRlIGNvbnRhaW5zIGFueSBuZXN0ZWQgdGV4dCBwYXNzZWQgdG8KK3RoZSBzY3JpcHQ8L3A+CiAKLTxwPklmIGFuIGF0dHJpYnV0ZSBvciBlbGVtZW50IGlzIG5vdCBwYXNzZWQgaW4sIAotdGhlbiA8Y29kZT5hdHRyaWJ1dGVzLmdldCgpPC9jb2RlPiBvciA8Y29kZT5lbGVtZW50cy5nZXQoKTwvY29kZT4gd2lsbCAKLXJldHVybiBudWxsLiBJdCBpcyB1cCB0byB0aGUgc2NyaXB0IHRvIHBlcmZvcm0gYW55IGNoZWNrcyBhbmQgdmFsaWRhdGlvbi4gCi08Y29kZT5zZWxmLmZhaWwoU3RyaW5nIG1lc3NhZ2UpPC9jb2RlPmNhbiBiZSB1c2VkIHRvIHJhaXNlIGEgCi08Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4uCi08L3A+Cis8cD5JZiBhbiBhdHRyaWJ1dGUgb3IgZWxlbWVudCBpcyBub3QgcGFzc2VkIGluLCB0aGVuIDxjb2RlIGNsYXNzPSJjb2RlIj5hdHRyaWJ1dGVzLmdldCgpPC9jb2RlPgorb3IgPGNvZGUgY2xhc3M9ImNvZGUiPmVsZW1lbnRzLmdldCgpPC9jb2RlPiB3aWxsIHJldHVybiBudWxsLiBJdCBpcyB1cCB0byB0aGUgc2NyaXB0IHRvIHBlcmZvcm0gYW55CitjaGVja3MgYW5kIHZhbGlkYXRpb24uIDxjb2RlIGNsYXNzPSJjb2RlIj5zZWxmLmZhaWwoU3RyaW5nIG1lc3NhZ2UpPC9jb2RlPmNhbiBiZSB1c2VkIHRvIHJhaXNlCithIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPi48L3A+CiAKLQotPHA+VGhlIG5hbWUgInByb2plY3QiIGlzIGEgcHJlLWRlZmluZWQgcmVmZXJlbmNlIHRvIHRoZSBBbnQgUHJvamVjdC4gRm9yCi1tb3JlIGluZm9ybWF0aW9uIG9uIHdyaXRpbmcgc2NyaXB0cywgcGxlYXNlIHJlZmVyIHRvIHRoZQotPGEgaHJlZj0ic2NyaXB0Lmh0bWwiPjxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPjwvYT4gdGFzawotPC9wPgotCis8cD5UaGUgbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+cHJvamVjdDwvY29kZT4gaXMgYSBwcmUtZGVmaW5lZCByZWZlcmVuY2UgdG8gdGhlIEFudCBQcm9qZWN0LiBGb3IKK21vcmUgaW5mb3JtYXRpb24gb24gd3JpdGluZyBzY3JpcHRzLCBwbGVhc2UgcmVmZXIgdG8KK3RoZSA8YSBocmVmPSJzY3JpcHQuaHRtbCI+PGNvZGU+Jmx0O3NjcmlwdCZndDs8L2NvZGU+PC9hPiB0YXNrLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIHNjcmlwdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHRhc2sgdG8gYmUgY3JlYXRlZCB1c2luZyB0aGUgc2NyaXB0PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZSBzY3JpcHQgaXMgd3JpdHRlbiBpbi4KLSAgICAgIE11c3QgYmUgYSBzdXBwb3J0ZWQgQXBhY2hlIEJTRiBvciBKU1IgMjIzIGxhbmd1YWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmxhbmd1YWdlPC90ZD4KKyAgICA8dGQ+VGhlIHByb2dyYW1taW5nIGxhbmd1YWdlIHRoZSBzY3JpcHQgaXMgd3JpdHRlbiBpbi4gIE11c3QgYmUgYSBzdXBwb3J0ZWQgQXBhY2hlIEJTRiBvciBKU1IKKyAgICAgIDIyMyBsYW5ndWFnZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4KLSAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgICAgZm9yIHVzaW5nIHRoaXMgYXR0cmlidXRlLgorICAgIDx0ZD5tYW5hZ2VyPC90ZD4KKyAgICA8dGQ+VGhlIHNjcmlwdCBlbmdpbmUgbWFuYWdlciB0byB1c2UuICBTZWUgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sKKyAgICAgIGZvciB1c2luZyB0aGlzIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5hdXRvPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3JjPC90ZD4KKyAgICA8dGQ+VGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLCBpZiBub3QgaW5saW5lPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLiA8ZW0+c2luY2UgQW50IDEuMTAuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvbXBpbGVkPC90ZD4KKyAgICA8dGQ+SWYgdHJ1ZSwgdGhlIHNjcmlwdCBpcyBjb21waWxlZCBiZWZvcmUgdGhlIGZpcnN0IGV2YWx1YXRpb24gZm9yIGZhc3RlciBtdWx0aXBsZSBleGVjdXRpb25zLAorICAgICAgb24gdGhlIGNvbmRpdGlvbiB0aGF0IHRoZSA8dmFyPm1hbmFnZXI8L3Zhcj4gaXMgPHE+amF2YXg8L3E+IGFuZCB0aGUgdGFyZ2V0IGVuZ2luZQorICAgICAgaW1wbGVtZW50cyA8Y29kZT5qYXZheC5zY3JpcHQuQ29tcGlsYWJsZTwvY29kZT4uICBOb3RlIHRoYXQgdGhlIDxxPmJzZjwvcT4gbWFuYWdlciBtYXkKKyAgICAgIGF1dG9tYXRpY2FsbHkgY29tcGlsZSB0aGUgc2NyaXB0LiA8ZW0+c2luY2UgQW50IDEuMTAuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnVyaTwvdGQ+CisgICAgPHRkPlRoZSBYTUwgbmFtZXNwYWNlIHVyaSB0aGF0IHRoaXMgZGVmaW5pdGlvbiBzaG91bGQgbGl2ZSBpbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byBwYXNzIGludG8gdGhlIHNjcmlwdC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aAorICAgICAgZGVmaW5lZCBlbHNld2hlcmUuCisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2FkZXJSZWY8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgbG9hZGVyIHRoYXQgaXMgdXNlZCB0byBsb2FkIHRoZSBzY3JpcHQsIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNwZWNpZmllZAorICAgICAgY2xhc3NwYXRoLiBUaGlzIGFsbG93cyBtdWx0aXBsZSBzY3JpcHQgZGVmaW5pdGlvbnMgdG8gcmV1c2UgdGhlIHNhbWUgY2xhc3MgbG9hZGVyLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgaXMgImF1dG8iPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLCBpZiBub3QgaW5saW5lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXJpPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIFhNTCBuYW1lc3BhY2UgdXJpIHRoYXQgdGhpcyBkZWZpbml0aW9uIHNob3VsZCBsaXZlIGluLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSBjbGFzc3BhdGggdG8gcGFzcyBpbnRvIHRoZSBzY3JpcHQuCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCi0gICAgICA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmxvYWRlclJlZjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBsb2FkZXIgdGhhdCBpcwotICAgICAgICB1c2VkIHRvIGxvYWQgdGhlIHNjcmlwdCwgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkIAotICAgICAgICBjbGFzc3BhdGguIFRoaXMgYWxsb3dzIG11bHRpcGxlIHNjcmlwdCBkZWZpbml0aW9ucwotICAgICAgICB0byByZXVzZSB0aGUgc2FtZSBjbGFzcyBsb2FkZXIuCi0gICAgICA8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KKzwvdGFibGU+CiAKLTxoMz5OZXN0ZWQgZWxlbWVudHM8L2gzPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+YXR0cmlidXRlPC9oND4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5lbGVtZW50PC9oND4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgbmVzdGVkIGVsZW1lbnQgdG8gYmUgc3VwcG9ydGVkIGJ5IHRoZQotICAgICAgICAgICAgICAgICAgICAgdGFzayBkZWZpbmVkIGJ5IHRoZSBzY3JpcHQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCB0byBiZSBzdXBwb3J0ZWQgYnkgdGhlIHRhc2sgZGVmaW5lZCBieSB0aGUgc2NyaXB0PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc25hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgZm9yIHRoZSBuZXN0ZWQgZWxlbWVudC4KLSAgICAgICAgIFRoaXMgc3BlY2lmaWVzIHRoZSBjbGFzcyBkaXJlY3RseSBhbmQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZwotICAgICAgICAgdGhlIEFudCB0eXBlIG5hbWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQ+dGhlIGNsYXNzbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgdXNlZCBmb3IgdGhlIG5lc3RlZCBlbGVtZW50LiAgVGhpcyBzcGVjaWZpZXMgdGhlIGNsYXNzCisgICAgICBkaXJlY3RseSBhbmQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgQW50IHR5cGUgbmFtZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgbmFtZSBvZiBhbiBBbnQgdGFzayBvciB0eXBlIHdoaWNoIGlzIHRvCi0gICAgICAgIGJlIHVzZWQgd2hlbiB0aGlzIGVsZW1lbnQgaXMgdG8gYmUgY3JlYXRlZC4gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZQotICAgICAgICB0byBzcGVjaWZ5aW5nIHRoZSBjbGFzcyBuYW1lIGRpcmVjdGx5LiBJZiB0aGUgdHlwZSBpcyBpbiBhIG5hbWVzcGFjZSwKLSAgICAgICAgdGhlIFVSSSBhbmQgYSA6IG11c3QgYmUgcHJlZml4ZWQgdG8gdGhlIHR5cGUuIEZvciBleGFtcGxlCi0gICAgICAgIDxjb2RlPnR5cGU9ImFudGxpYjpleGFtcGxlLm9yZzpuZXd0eXBlIjwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyB0aGUgbmFtZSBvZiBhbiBBbnQgdGFzayBvciB0eXBlIHdoaWNoIGlzIHRvIGJlIHVzZWQgd2hlbiB0aGlzIGVsZW1lbnQgaXMgdG8gYmUKKyAgICAgIGNyZWF0ZWQuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgY2xhc3MgbmFtZSBkaXJlY3RseS4gSWYgdGhlIHR5cGUgaXMgaW4gYQorICAgICAgbmFtZXNwYWNlLCB0aGUgVVJJIGFuZCBhIDxxPjo8L3E+IG11c3QgYmUgcHJlZml4ZWQgdG8gdGhlIHR5cGUuIEZvcgorICAgICAgZXhhbXBsZSA8dmFyPnR5cGU8L3Zhcj49PHE+YW50bGliOmV4YW1wbGUub3JnOm5ld3R5cGU8L3E+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hbnkgcmVzb3VyY2Ugb3IgcmVzb3VyY2UgY29sbGVjdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TaW5jZSBBbnQxLjcuMSwgdGhpcyB0YXNrIGNhbiBsb2FkIHNjcmlwdHMKLSAgICBmcm9tIGFueSByZXNvdXJjZSBzdXBwbGllZCBhcyBhIG5lc3RlZCBlbGVtZW50LiB3aGVuIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0KIDwvdGFibGU+CiAKLSAgPGg0PmNsYXNzcGF0aDwvaDQ+Ci0gIDxwPgotICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgIGZvciB1c2luZyB0aGlzIG5lc3RlZCBlbGVtZW50LgotICA8L3A+Cis8aDQ+Y2xhc3NwYXRoPC9oND4KKzxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzayBmb3IgdXNpbmcgdGhpcyBuZXN0ZWQgZWxlbWVudC48L3A+CiAKKzxoND5hbnkgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNy4xPC9lbT48L3A+Cis8cD5UaGlzIHRhc2sgY2FuIGxvYWQgc2NyaXB0cyBmcm9tIGFueSByZXNvdXJjZSBzdXBwbGllZCBhcyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KIAotPHA+Ci1UaGUgZm9sbG93aW5nIGRlZmluaXRpb24gY3JlYXRlcyBhIHRhc2sgd2hpY2ggc3VwcG9ydHMgYW4gYXR0cmlidXRlIGNhbGxlZAotYXR0ciBhbmQgdHdvIG5lc3RlZCBlbGVtZW50cywgb25lIGJlaW5nIGEgZmlsZXNldCBhbmQgdGhlIG90aGVyIGEgcGF0aC4gV2hlbgotZXhlY3V0ZWQsIHRoZSByZXN1bHRpbmcgdGFzayBsb2dzIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGFuZCB0aGUgYmFzZWRpcgotb2YgdGhlIGZpcnN0IGZpbGVzZXQuCi08L3A+Cis8cD5UaGUgZm9sbG93aW5nIGRlZmluaXRpb24gY3JlYXRlcyBhIHRhc2sgd2hpY2ggc3VwcG9ydHMgYW4gYXR0cmlidXRlIGNhbGxlZCA8dmFyPmF0dHI8L3Zhcj4gYW5kCit0d28gbmVzdGVkIGVsZW1lbnRzLCBvbmUgYmVpbmcgYSBmaWxlc2V0IGFuZCB0aGUgb3RoZXIgYSBwYXRoLiBXaGVuIGV4ZWN1dGVkLCB0aGUgcmVzdWx0aW5nIHRhc2sKK2xvZ3MgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gb2YgdGhlIGZpcnN0IGZpbGVzZXQuPC9wPgogCiA8cHJlPgotICAmbHQ7c2NyaXB0ZGVmIG5hbWU9JnF1b3Q7c2NyaXB0dGVzdCZxdW90OyBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OwotICAgICZsdDthdHRyaWJ1dGUgbmFtZT0mcXVvdDthdHRyMSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2VsZW1lbnQgbmFtZT0mcXVvdDtmaWxlc2V0JnF1b3Q7IHR5cGU9JnF1b3Q7ZmlsZXNldCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2VsZW1lbnQgbmFtZT0mcXVvdDtwYXRoJnF1b3Q7IHR5cGU9JnF1b3Q7cGF0aCZxdW90Oy8mZ3Q7Ci0gICAgJmx0OyFbQ0RBVEFbCismbHQ7c2NyaXB0ZGVmIG5hbWU9JnF1b3Q7c2NyaXB0dGVzdCZxdW90OyBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OworICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7YXR0cjEmcXVvdDsvJmd0OworICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O2ZpbGVzZXQmcXVvdDsgdHlwZT0mcXVvdDtmaWxlc2V0JnF1b3Q7LyZndDsKKyAgJmx0O2VsZW1lbnQgbmFtZT0mcXVvdDtwYXRoJnF1b3Q7IHR5cGU9JnF1b3Q7cGF0aCZxdW90Oy8mZ3Q7CisgICZsdDshW0NEQVRBWwogCi0gICAgICBzZWxmLmxvZygmcXVvdDtIZWxsbyBmcm9tIHNjcmlwdCZxdW90Oyk7Ci0gICAgICBzZWxmLmxvZygmcXVvdDtBdHRyaWJ1dGUgYXR0cjEgPSAmcXVvdDsgKyBhdHRyaWJ1dGVzLmdldCgmcXVvdDthdHRyMSZxdW90OykpOwotICAgICAgc2VsZi5sb2coJnF1b3Q7Rmlyc3QgZmlsZXNldCBiYXNlZGlyID0gJnF1b3Q7Ci0gICAgICAgICsgZWxlbWVudHMuZ2V0KCZxdW90O2ZpbGVzZXQmcXVvdDspLmdldCgwKS5nZXREaXIocHJvamVjdCkpOworICAgIHNlbGYubG9nKCZxdW90O0hlbGxvIGZyb20gc2NyaXB0JnF1b3Q7KTsKKyAgICBzZWxmLmxvZygmcXVvdDtBdHRyaWJ1dGUgYXR0cjEgPSAmcXVvdDsgKyBhdHRyaWJ1dGVzLmdldCgmcXVvdDthdHRyMSZxdW90OykpOworICAgIHNlbGYubG9nKCZxdW90O0ZpcnN0IGZpbGVzZXQgYmFzZWRpciA9ICZxdW90OworICAgICAgKyBlbGVtZW50cy5nZXQoJnF1b3Q7ZmlsZXNldCZxdW90OykuZ2V0KDApLmdldERpcihwcm9qZWN0KSk7CiAKLSAgICBdXSZndDsKLSAgJmx0Oy9zY3JpcHRkZWYmZ3Q7CisgIF1dJmd0OworJmx0Oy9zY3JpcHRkZWYmZ3Q7CiAKLSAgJmx0O3NjcmlwdHRlc3QgYXR0cjE9JnF1b3Q7dGVzdCZxdW90OyZndDsKLSAgICAmbHQ7cGF0aCZndDsKLSAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtzcmMmcXVvdDsvJmd0OwotICAgICZsdDsvcGF0aCZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7bWFpbiZxdW90Oy8mZ3Q7Ci0gICZsdDsvc2NyaXB0dGVzdCZndDsKLTwvcHJlPgorJmx0O3NjcmlwdHRlc3QgYXR0cjE9JnF1b3Q7dGVzdCZxdW90OyZndDsKKyAgJmx0O3BhdGgmZ3Q7CisgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O3NyYyZxdW90Oy8mZ3Q7CisgICZsdDsvcGF0aCZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYyZxdW90Oy8mZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDttYWluJnF1b3Q7LyZndDsKKyZsdDsvc2NyaXB0dGVzdCZndDs8L3ByZT4KIAotPHA+Ci1UaGUgZm9sbG93aW5nIHZhcmlhdGlvbiBvbiB0aGUgYWJvdmUgc2NyaXB0IGxpc3RzIHRoZSBudW1iZXIgb2YgZmlsZXNldCBlbGVtZW50cwotYW5kIGl0ZXJhdGVzIHRocm91Z2ggdGhlbQotPC9wPgorPHA+VGhlIGZvbGxvd2luZyB2YXJpYXRpb24gb24gdGhlIGFib3ZlIHNjcmlwdCBsaXN0cyB0aGUgbnVtYmVyIG9mIGZpbGVzZXQgZWxlbWVudHMgYW5kIGl0ZXJhdGVzCit0aHJvdWdoIHRoZW08L3A+CiA8cHJlPgotICAmbHQ7c2NyaXB0ZGVmIG5hbWU9JnF1b3Q7c2NyaXB0dGVzdDImcXVvdDsgbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OyZndDsKLSAgICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O2ZpbGVzZXQmcXVvdDsgdHlwZT0mcXVvdDtmaWxlc2V0JnF1b3Q7LyZndDsKLSAgICAmbHQ7IVtDREFUQVsKLSAgICAgIGZpbGVzZXRzID0gZWxlbWVudHMuZ2V0KCZxdW90O2ZpbGVzZXQmcXVvdDspOwotICAgICAgc2VsZi5sb2coJnF1b3Q7TnVtYmVyIG9mIGZpbGVzZXRzID0gJnF1b3Q7ICsgZmlsZXNldHMuc2l6ZSgpKTsKLSAgICAgIGZvciAoaSA9IDA7IGkgJmx0OyBmaWxlc2V0cy5zaXplKCk7ICsraSkgewotICAgICAgICBzZWxmLmxvZygmcXVvdDtmaWxlc2V0ICZxdW90OyArIGkgKyAmcXVvdDsgYmFzZWRpciA9ICZxdW90OwotICAgICAgICAgICsgZmlsZXNldHMuZ2V0KGkpLmdldERpcihwcm9qZWN0KSk7Ci0gICAgICB9Ci0gICAgXV0mZ3Q7Ci0gICZsdDsvc2NyaXB0ZGVmJmd0CismbHQ7c2NyaXB0ZGVmIG5hbWU9JnF1b3Q7c2NyaXB0dGVzdDImcXVvdDsgbGFuZ3VhZ2U9JnF1b3Q7amF2YXNjcmlwdCZxdW90OyZndDsKKyAgJmx0O2VsZW1lbnQgbmFtZT0mcXVvdDtmaWxlc2V0JnF1b3Q7IHR5cGU9JnF1b3Q7ZmlsZXNldCZxdW90Oy8mZ3Q7CisgICZsdDshW0NEQVRBWworICAgIGZpbGVzZXRzID0gZWxlbWVudHMuZ2V0KCZxdW90O2ZpbGVzZXQmcXVvdDspOworICAgIHNlbGYubG9nKCZxdW90O051bWJlciBvZiBmaWxlc2V0cyA9ICZxdW90OyArIGZpbGVzZXRzLnNpemUoKSk7CisgICAgZm9yIChpID0gMDsgaSAmbHQ7IGZpbGVzZXRzLnNpemUoKTsgKytpKSB7CisgICAgICBzZWxmLmxvZygmcXVvdDtmaWxlc2V0ICZxdW90OyArIGkgKyAmcXVvdDsgYmFzZWRpciA9ICZxdW90OworICAgICAgICArIGZpbGVzZXRzLmdldChpKS5nZXREaXIocHJvamVjdCkpOworICAgIH0KKyAgXV0mZ3Q7CismbHQ7L3NjcmlwdGRlZiZndDsKIAotICAmbHQ7c2NyaXB0dGVzdDImZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyYyZxdW90Oy8mZ3Q7Ci0gICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O21haW4mcXVvdDsvJmd0OwotICAmbHQ7L3NjcmlwdHRlc3QyJmd0OwotPC9wcmU+CismbHQ7c2NyaXB0dGVzdDImZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtzcmMmcXVvdDsvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7bWFpbiZxdW90Oy8mZ3Q7CismbHQ7L3NjcmlwdHRlc3QyJmd0OzwvcHJlPgogCi08cD4KLVdoZW4gYSBzY3JpcHQgaGFzIGEgc3ludGF4IGVycm9yLCB0aGUgc2NyaXB0ZGVmIG5hbWUgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlCi1lcnJvci4gRm9yIGV4YW1wbGUgaW4gdGhlIGFib3ZlIHNjcmlwdCwgcmVtb3ZpbmcgdGhlIGNsb3NpbmcgY3VybHkgYnJhY2tldAotd291bGQgcmVzdWx0IGluIHRoaXMgZXJyb3IKLTwvcD4KKzxwPldoZW4gYSBzY3JpcHQgaGFzIGEgc3ludGF4IGVycm9yLCB0aGUgPGNvZGU+c2NyaXB0ZGVmPC9jb2RlPiBuYW1lIHdpbGwgYmUgbGlzdGVkIGluIHRoZQorZXJyb3IuIEZvciBleGFtcGxlIGluIHRoZSBhYm92ZSBzY3JpcHQsIHJlbW92aW5nIHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgd291bGQgcmVzdWx0IGluIHRoaXMKK2Vycm9yPC9wPgogCi08cD48Y29kZT5idWlsZC54bWw6MTU6IFN5bnRheEVycm9yOiBtaXNzaW5nIH0gaW4gY29tcG91bmQKLXN0YXRlbWVudCAoc2NyaXB0ZGVmIDxjb2RlPiZsdDtzY3JpcHR0ZXN0MiZndDs8L2NvZGU+OyBsaW5lIDEwKTwvY29kZT48L3A+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPmJ1aWxkLnhtbDoxNTogU3ludGF4RXJyb3I6IG1pc3NpbmcgfSBpbiBjb21wb3VuZAorc3RhdGVtZW50IChzY3JpcHRkZWYgJmx0O3NjcmlwdHRlc3QyJmd0OzsgbGluZSAxMCk8L3ByZT4KIAotPHA+Ci1TY3JpcHQgZXJyb3JzIGFyZSBvbmx5IGRldGVjdGVkIHdoZW4gYSBzY3JpcHQgdGFzayBpcyBhY3R1YWxseSBleGVjdXRlZC4KLTwvcD4KLTxwPgotICAgIFRoZSBuZXh0IGV4YW1wbGUgZG9lcyB1c2VzIG5lc3RlZCB0ZXh0IGluIEp5dGhvbi4gSXQgYWxzbyBkZWNsYXJlcyAKLSAgICB0aGUgc2NyaXB0IGluIGEgbmV3IHhtbCBuYW1lc3BhY2UsIHdoaWNoIG11c3QgYmUgdXNlZCB0byByZWZlciB0byAKLSAgICB0aGUgdGFzay4gRGVjbGFyaW5nIHNjcmlwdHMgaW4gYSBuZXcgbmFtZXNwYWNlIGd1YXJhbnRlZXMgdGhhdCBBbnQgd2lsbCAKLSAgICBub3QgY3JlYXRlIGEgdGFzayBvZiB0aGUgc2FtZSAobmFtZXNwYWNlLGxvY2FsbmFtZSkgbmFtZSBwYWlyLiAKLTwvcD4KKzxwPlNjcmlwdCBlcnJvcnMgYXJlIG9ubHkgZGV0ZWN0ZWQgd2hlbiBhIDxjb2RlPnNjcmlwdDwvY29kZT4gdGFzayBpcyBhY3R1YWxseSBleGVjdXRlZC48L3A+Cis8cD5UaGUgbmV4dCBleGFtcGxlIGRvZXMgdXNlcyBuZXN0ZWQgdGV4dCBpbiBKeXRob24uIEl0IGFsc28gZGVjbGFyZXMgdGhlIHNjcmlwdCBpbiBhIG5ldyB4bWwKK25hbWVzcGFjZSwgd2hpY2ggbXVzdCBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSB0YXNrLiBEZWNsYXJpbmcgc2NyaXB0cyBpbiBhIG5ldyBuYW1lc3BhY2UgZ3VhcmFudGVlcwordGhhdCBBbnQgd2lsbCBub3QgY3JlYXRlIGEgdGFzayBvZiB0aGUgc2FtZSAobmFtZXNwYWNlLGxvY2FsbmFtZSkgbmFtZSBwYWlyLjwvcD4KIAogPHByZT4KICZsdDt0YXJnZXQgbmFtZT0iZWNoby10YXNrLWp5dGhvbiImZ3Q7CiAgICZsdDtzY3JpcHRkZWYgbGFuZ3VhZ2U9Imp5dGhvbiIKLSAgICAgIG5hbWU9ImVjaG8iCi0gICAgICB1cmk9Imh0dHA6Ly9leGFtcGxlLm9yZy9zY3JpcHQiJmd0OworICAgICAgICAgICAgIG5hbWU9ImVjaG8iCisgICAgICAgICAgICAgdXJpPSJodHRwczovL2V4YW1wbGUub3JnL3NjcmlwdCImZ3Q7CiAgICAgICAmbHQ7IVtDREFUQVsKIHNlbGYubG9nKCJ0ZXh0OiAiICtzZWxmLnRleHQpCi0gICAgXV0mZ3Q7CisgICAgICBdXSZndDsKICAgICAmbHQ7L3NjcmlwdGRlZiZndDsKICZsdDsvdGFyZ2V0Jmd0OwogCiAmbHQ7dGFyZ2V0IG5hbWU9InRlc3RFY2hvIiBkZXBlbmRzPSJlY2hvLXRhc2stanl0aG9uIgotICAgIHhtbG5zOnM9Imh0dHA6Ly9leGFtcGxlLm9yZy9zY3JpcHQiJmd0OworICAgICAgICB4bWxuczpzPSJodHRwczovL2V4YW1wbGUub3JnL3NjcmlwdCImZ3Q7CiAgICZsdDtzOmVjaG8mZ3Q7bmVzdGVkIHRleHQmbHQ7L3M6ZWNobyZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+CismbHQ7L3RhcmdldCZndDs8L3ByZT4KIAotVGhlIG5leHQgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mICZsdDtjbGFzc3BhdGgmZ3Q7IGFuZAotImxvYWRlcnJlZiIgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYmVhbnNoZWxsIGphci4KKzxwPlRoZSBuZXh0IGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYW5kIDx2YXI+bG9hZGVycmVmPC92YXI+IHRvIGdldAorYWNjZXNzIHRvIHRoZSBiZWFuc2hlbGwgamFyLjwvcD4KIDxwcmU+Ci0gICAgJmx0O3NjcmlwdGRlZiBuYW1lPSJiMSIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCIKLSAgICAgICAgICAgICAgIGxvYWRlcnJlZj0iYmVhbnNoZWxsLXJlZiImZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImEiLyZndDsKLSAgICAgICZsdDtjbGFzc3BhdGgKLSAgICAgICAgcGF0aD0iJHt1c2VyLmhvbWV9L3NjcmlwdGluZy9iZWFuc2hlbGwvYnNoLTEuM2IxLmphciIvJmd0OwotICAgICAgc2VsZi5sb2coImF0dHJpYnV0ZSBhIGlzICIgKyBhdHRyaWJ1dGVzLmdldCgiYSIpKTsKLSAgICAmbHQ7L3NjcmlwdGRlZiZndDsKKyZsdDtzY3JpcHRkZWYgbmFtZT0iYjEiIGxhbmd1YWdlPSJiZWFuc2hlbGwiCisgICAgICAgICAgIGxvYWRlcnJlZj0iYmVhbnNoZWxsLXJlZiImZ3Q7CisgICZsdDthdHRyaWJ1dGUgbmFtZT0iYSIvJmd0OworICAmbHQ7Y2xhc3NwYXRoIHBhdGg9IiR7dXNlci5ob21lfS9zY3JpcHRpbmcvYmVhbnNoZWxsL2JzaC0xLjNiMS5qYXIiLyZndDsKKyAgc2VsZi5sb2coImF0dHJpYnV0ZSBhIGlzICIgKyBhdHRyaWJ1dGVzLmdldCgiYSIpKTsKKyZsdDsvc2NyaXB0ZGVmJmd0OwogCi0gICAgJmx0O3NjcmlwdGRlZiBuYW1lPSJiMiIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCIKLSAgICAgICAgICAgICAgIGxvYWRlcnJlZj0iYmVhbnNoZWxsLXJlZiImZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImEyIi8mZ3Q7Ci0gICAgICBzZWxmLmxvZygiYXR0cmlidXRlIGEyIGlzICIgKyBhdHRyaWJ1dGVzLmdldCgiYTIiKSk7Ci0gICAgJmx0Oy9zY3JpcHRkZWYmZ3Q7CismbHQ7c2NyaXB0ZGVmIG5hbWU9ImIyIiBsYW5ndWFnZT0iYmVhbnNoZWxsIgorICAgICAgICAgICBsb2FkZXJyZWY9ImJlYW5zaGVsbC1yZWYiJmd0OworICAmbHQ7YXR0cmlidXRlIG5hbWU9ImEyIi8mZ3Q7CisgIHNlbGYubG9nKCJhdHRyaWJ1dGUgYTIgaXMgIiArIGF0dHJpYnV0ZXMuZ2V0KCJhMiIpKTsKKyZsdDsvc2NyaXB0ZGVmJmd0OwogCi0gICAgJmx0O2IxIGE9InRoaXMgaXMgYW4gJ2EnIi8mZ3Q7Ci0gICAgJmx0O2IyIGEyPSJ0aGlzIGlzIGFuICdhMicgZm9yIGIyIi8mZ3Q7Ci08L3ByZT4KLTxoMz5UZXN0aW5nIFNjcmlwdHM8L2gzPgorJmx0O2IxIGE9InRoaXMgaXMgYW4gJ2EnIi8mZ3Q7CismbHQ7YjIgYTI9InRoaXMgaXMgYW4gJ2EyJyBmb3IgYjIiLyZndDs8L3ByZT4KIAotPHA+Ci1UaGUgZWFzaWVzdCB3YXkgdG8gdGVzdCBzY3JpcHRzIGlzIHRvIHVzZSB0aGUgCi08YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9hbnR1bml0LyI+QW50VW5pdDwvYT4gYW50IGxpYnJhcnkuCi1UaGlzIHdpbGwgcnVuIGFsbCB0YXJnZXRzIGluIGEgc2NyaXB0IHRoYXQgYmVnaW4gd2l0aCAidGVzdCIgKGFuZCB0aGVpciBkZXBlbmRlbmNpZXMpLiA8L3A+Cis8aDM+VGVzdGluZyBzY3JpcHRzPC9oMz4KIAotCi0KKzxwPlRoZSBlYXNpZXN0IHdheSB0byB0ZXN0IHNjcmlwdHMgaXMgdG8gdXNlIHRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvYW50dW5pdC8iCit0YXJnZXQ9Il90b3AiPkFudFVuaXQ8L2E+IEFudCBsaWJyYXJ5LiAgVGhpcyB3aWxsIHJ1biBhbGwgdGFyZ2V0cyBpbiBhIHNjcmlwdCB0aGF0IGJlZ2luCit3aXRoIDxxPnRlc3Q8L3E+IChhbmQgdGhlaXIgZGVwZW5kZW5jaWVzKS48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zZXF1ZW50aWFsLmh0bWwgYi9tYW51YWwvVGFza3Mvc2VxdWVudGlhbC5odG1sCmluZGV4IGQzZGVkYTYuLjAzNGE4ZmYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zZXF1ZW50aWFsLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NlcXVlbnRpYWwuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TZXF1ZW50aWFsIFRhc2s8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjYsMTYgKzI2LDE3IEBACiAKIDxoMj5TZXF1ZW50aWFsPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5TZXF1ZW50aWFsIGlzIGEgY29udGFpbmVyIHRhc2sgLSBpdCBjYW4gY29udGFpbiBvdGhlciBBcGFjaGUgQW50IHRhc2tzLiBUaGUgbmVzdGVkIAotdGFza3MgYXJlIHNpbXBseSBleGVjdXRlZCBpbiBzZXF1ZW5jZS4gU2VxdWVudGlhbCdzIHByaW1hcnkgdXNlIGlzIHRvIHN1cHBvcnQgCi10aGUgc2VxdWVudGlhbCBleGVjdXRpb24gb2YgYSBzdWJzZXQgb2YgdGFza3Mgd2l0aGluIHRoZSAKLTxhIGhyZWY9InBhcmFsbGVsLmh0bWwiPnBhcmFsbGVsPC9hPiB0YXNrPC9wPgorPHA+PGNvZGU+U2VxdWVudGlhbDwvY29kZT4gaXMgYSBjb250YWluZXIgdGFzayZtZGFzaDtpdCBjYW4gY29udGFpbiBvdGhlciBBcGFjaGUgQW50IHRhc2tzLiBUaGUKK25lc3RlZCB0YXNrcyBhcmUgc2ltcGx5IGV4ZWN1dGVkIGluIHNlcXVlbmNlLiBTZXF1ZW50aWFsJ3MgcHJpbWFyeSB1c2UgaXMgdG8gc3VwcG9ydCB0aGUgc2VxdWVudGlhbAorZXhlY3V0aW9uIG9mIGEgc3Vic2V0IG9mIHRhc2tzIHdpdGhpbiB0aGUgPGEgaHJlZj0icGFyYWxsZWwuaHRtbCI+cGFyYWxsZWw8L2E+IHRhc2s8L3A+CiAKLTxwPlRoZSBzZXF1ZW50aWFsIHRhc2sgaGFzIG5vIGF0dHJpYnV0ZXMgYW5kIGRvZXMgbm90IHN1cHBvcnQgYW55IG5lc3RlZCAKLWVsZW1lbnRzIGFwYXJ0IGZyb20gQW50IHRhc2tzLiBBbnkgdmFsaWQgQW50IHRhc2sgbWF5IGJlIGVtYmVkZGVkIHdpdGhpbiB0aGUgCi1zZXF1ZW50aWFsIHRhc2suPC9wPgorPHA+VGhlIDxjb2RlPnNlcXVlbnRpYWw8L2NvZGU+IHRhc2sgaGFzIG5vIGF0dHJpYnV0ZXMgYW5kIGRvZXMgbm90IHN1cHBvcnQgYW55IG5lc3RlZCBlbGVtZW50cyBhcGFydAorZnJvbSBBbnQgdGFza3MuIEFueSB2YWxpZCBBbnQgdGFzayBtYXkgYmUgZW1iZWRkZWQgd2l0aGluIHRoZSBzZXF1ZW50aWFsIHRhc2suPC9wPgogCiA8aDM+RXhhbXBsZTwvaDM+CisKKzxwPlRoaXMgZXhhbXBsZSBzaG93cyBob3cgdGhlIDxjb2RlPnNlcXVlbnRpYWw8L2NvZGU+IHRhc2sgaXMgdXNlZCB0byBleGVjdXRlIHRocmVlIHRhc2tzIGluCitzZXF1ZW5jZSwgd2hpbGUgYW5vdGhlciB0YXNrIGlzIGJlaW5nIGV4ZWN1dGVkIGluIGEgc2VwYXJhdGUgdGhyZWFkLjwvcD4KIDxwcmU+CiAmbHQ7cGFyYWxsZWwmZ3Q7CiAgICZsdDt3bHJ1biAuLi4gJmd0OwpAQCAtNDQsMTIgKzQ1LDcgQEAKICAgICAmbHQ7anVuaXQgLi4uICZndDsKICAgICAmbHQ7d2xzdG9wLyZndDsKICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotJmx0Oy9wYXJhbGxlbCZndDsKLTwvcHJlPgotPHA+VGhpcyBleGFtcGxlIHNob3dzIGhvdyB0aGUgc2VxdWVudGlhbCB0YXNrIGlzIHVzZWQgdG8gZXhlY3V0ZSB0aHJlZSB0YXNrcyBpbgotc2VxdWVuY2UsIHdoaWxlIGFub3RoZXIgdGFzayBpcyBiZWluZyBleGVjdXRlZCBpbiBhIHNlcGFyYXRlIHRocmVhZC4gPC9wPgotCismbHQ7L3BhcmFsbGVsJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbCBiL21hbnVhbC9UYXNrcy9zZXJ2ZXJkZXBsb3kuaHRtbAppbmRleCA4N2QwNzc3Li43ODBjNjYxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc2VydmVyZGVwbG95Lmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NlcnZlcmRlcGxveS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlNlcnZlckRlcGxveSBUYXNrPC90aXRsZT4KIApAQCAtMjUsMzExICsyNSwyODEgQEAKIAogPGJvZHk+CiAKLTxoMT48YSBuYW1lPSJzZXJ2ZXJkZXBsb3kiPkFwYWNoZSBBbnQgU2VydmVyRGVwbG95IFVzZXIgTWFudWFsPC9hPjwvaDE+Cis8aDEgaWQ9InNlcnZlcmRlcGxveSI+QXBhY2hlIEFudCBTZXJ2ZXJEZXBsb3kgVXNlciBNYW51YWw8L2gxPgogPHA+Ynk8L3A+CiA8IS0tIE5hbWVzIGFyZSBpbiBhbHBoYWJldGljYWwgb3JkZXIsIG9uIGxhc3QgbmFtZSAtLT4KIDx1bD4KLTxsaT5DaHJpc3RvcGhlciBBLiBMb25nbyAoPGEgaHJlZj0ibWFpbHRvOmNhbEBjbG91ZDkubmV0Ij5jYWxAY2xvdWQ5Lm5ldDwvYT4pPC9saT4KLTxsaT5DeXJpbGxlIE1vcnZhbiAoPGEgaHJlZj0ibWFpbHRvOmNtb3J2YW5AaW5nZW5vc3lhLmNvbSI+Y21vcnZhbkBpbmdlbm9zeWEuY29tPC9hPik8L2xpPgorICA8bGk+Q2hyaXN0b3BoZXIgQS4gTG9uZ28gKDxhIGhyZWY9Im1haWx0bzpjYWxAY2xvdWQ5Lm5ldCI+Y2FsQGNsb3VkOS5uZXQ8L2E+KTwvbGk+CisgIDxsaT5DeXJpbGxlIE1vcnZhbiAoPGEgaHJlZj0ibWFpbHRvOmNtb3J2YW5AaW5nZW5vc3lhLmNvbSI+Y21vcnZhbkBpbmdlbm9zeWEuY29tPC9hPik8L2xpPgogPC91bD4KIAotPC9wPgotPGhyPgotPHA+IEF0IHByZXNlbnQgdGhlIHRhc2tzIHN1cHBvcnQ6PGJyPgorPGhyLz4KKzxwPkF0IHByZXNlbnQgdGhlIHRhc2tzIHN1cHBvcnQ6PC9wPgogCiA8dWw+Ci08bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5iZWEuY29tIiB0YXJnZXQ9Il90b3AiPldlYmxvZ2ljPC9hPiBzZXJ2ZXJzPC9saT4KLTxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm9iamVjdHdlYi5vcmcvam9uYXMvIiB0YXJnZXQ9Il90b3AiPkpPbkFTPC9hPgotMi40IE9wZW4gU291cmNlIEVKQiBzZXJ2ZXI8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cub3JhY2xlLmNvbS9jb3Jwb3JhdGUvYWNxdWlzaXRpb25zL2JlYS8iIHRhcmdldD0iX3RvcCI+V2ViTG9naWM8L2E+IHNlcnZlcnM8L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9qb25hcy5vdzIub3JnLyIgdGFyZ2V0PSJfdG9wIj5KT25BUzwvYT4gMi40IE9wZW4gU291cmNlIEVKQiBzZXJ2ZXI8L2xpPgogPC91bD4KLU92ZXIgdGltZSB3ZSBleHBlY3QgZnVydGhlciBvcHRpb25hbCB0YXNrcyAgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIEoyRUUgU2VydmVycy4KLTwvcD4KKzxwPk92ZXIgdGltZSB3ZSBleHBlY3QgZnVydGhlciBvcHRpb25hbCB0YXNrcyB0byBzdXBwb3J0IGFkZGl0aW9uYWwgSjJFRSBTZXJ2ZXJzLjwvcD4KIAotPGhyPgorPGhyLz4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiPgotPHRyPjx0ZD5UYXNrPC90ZD48dGQgY29sc3Bhbj0iMiI+QXBwbGljYXRpb24gU2VydmVyczwvdGQ+PC90cj4KLTx0cj48dGQgcm93c3Bhbj0iNCI+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9lbGVtZW50Ij5zZXJ2ZXJkZXBsb3k8L2E+PC90ZD48dGQgY29sc3Bhbj0iMiIgYWxpZ249ImNlbnRlciI+PGI+TmVzdGVkIEVsZW1lbnRzPC9iPjwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9nZW5lcmljIj5nZW5lcmljPC9hPjwvdGQ+PHRkPkdlbmVyaWMgdGFzazwvdGQ+PC90cj4KLTx0cj48dGQ+PGEgaHJlZj0iI3NlcnZlcmRlcGxveV9qb25hcyI+am9uYXM8L2E+PC90ZD48dGQ+Sk9uQVMgMi40PC90ZD48L3RyPgotPHRyPjx0ZD48YSBocmVmPSIjc2VydmVyZGVwbG95X3dlYmxvZ2ljIj53ZWJsb2dpYzwvYT48L3RkPjx0ZD5XZWJsb2dpYzwvdGQ+PC90cj4KLQorPHRhYmxlPgorICA8dHI+PHRoIHNjb3BlPSJjb2wiPlRhc2s8L3RoPjx0aCBzY29wZT0iY29sIiBjb2xzcGFuPSIyIj5BcHBsaWNhdGlvbiBTZXJ2ZXJzPC90aD48L3RyPgorICA8dHI+PHRkIHJvd3NwYW49IjQiPjxhIGhyZWY9IiNzZXJ2ZXJkZXBsb3lfZWxlbWVudCI+c2VydmVyZGVwbG95PC9hPjwvdGQ+PHRoIHNjb3BlPSJjb2wiIGNvbHNwYW49IjIiPk5lc3RlZCBFbGVtZW50czwvdGg+PC90cj4KKyAgPHRyPjx0ZD48YSBocmVmPSIjc2VydmVyZGVwbG95X2dlbmVyaWMiPmdlbmVyaWM8L2E+PC90ZD48dGQ+R2VuZXJpYyB0YXNrPC90ZD48L3RyPgorICA8dHI+PHRkPjxhIGhyZWY9IiNzZXJ2ZXJkZXBsb3lfam9uYXMiPmpvbmFzPC9hPjwvdGQ+PHRkPkpPbkFTIDIuNDwvdGQ+PC90cj4KKyAgPHRyPjx0ZD48YSBocmVmPSIjc2VydmVyZGVwbG95X3dlYmxvZ2ljIj53ZWJsb2dpYzwvYT48L3RkPjx0ZD5XZWJMb2dpYzwvdGQ+PC90cj4KIDwvdGFibGU+CiAKLTxhIG5hbWU9InNlcnZlcmRlcGxveV9lbGVtZW50Ij4KLTxoMj5TZXJ2ZXJEZXBsb3kgZWxlbWVudDwvaDI+Cis8aDIgaWQ9InNlcnZlcmRlcGxveV9lbGVtZW50Ij5TZXJ2ZXJEZXBsb3kgZWxlbWVudDwvaDI+CiAKLTxoMz48Yj5EZXNjcmlwdGlvbjo8L2I+PC9oMz4KKzxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPlRoZSA8Y29kZT5zZXJ2ZXJkZXBsb3k8L2NvZGU+IHRhc2sgaXMgdXNlZCB0byBydW4gYSAiaG90IiBkZXBsb3ltZW50IHRvb2wgZm9yCi12ZW5kb3Itc3BlY2lmaWMgSjJFRSBzZXJ2ZXIuIFRoZSB0YXNrIHJlcXVpcmVzIG5lc3RlZCBlbGVtZW50cyB3aGljaCBkZWZpbmUKLXRoZSBhdHRyaWJ1dGVzIG9mIHRoZSB2ZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCB0b29sIGJlaW5nIGV4ZWN1dGVkLgotVmVuZG9yLXNwZWNpZmljIGRlcGxveW1lbnQgdG9vbHMgZWxlbWVudHMgbWF5IGVuZm9yY2UgcnVsZXMgZm9yIHdoaWNoCi1hdHRyaWJ1dGVzIGFyZSByZXF1aXJlZCwgZGVwZW5kaW5nIG9uIHRoZSB0b29sLgotPC9wPgorPHA+VGhlIDxjb2RlPnNlcnZlcmRlcGxveTwvY29kZT4gdGFzayBpcyB1c2VkIHRvIHJ1biBhICJob3QiIGRlcGxveW1lbnQgdG9vbCBmb3IgdmVuZG9yLXNwZWNpZmljCitKMkVFIHNlcnZlci4gVGhlIHRhc2sgcmVxdWlyZXMgbmVzdGVkIGVsZW1lbnRzIHdoaWNoIGRlZmluZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgdmVuZG9yLXNwZWNpZmljCitkZXBsb3ltZW50IHRvb2wgYmVpbmcgZXhlY3V0ZWQuICBWZW5kb3Itc3BlY2lmaWMgZGVwbG95bWVudCB0b29scyBlbGVtZW50cyBtYXkgZW5mb3JjZSBydWxlcyBmb3IKK3doaWNoIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLCBkZXBlbmRpbmcgb24gdGhlIHRvb2wuPC9wPgogCi08aDM+UGFyYW1ldGVyczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMz5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gIEZvciBtb3N0IGNhc2VzIHRoaXMKLSAgICB3aWxsIGJlICJkZXBsb3kiLiAgU29tZSB0b29scyBzdXBwb3J0IGFkZGl0aW9uYWwgYWN0aW9ucywgc3VjaCBhcyAiZGVsZXRlIiwgImxpc3QiLAotICAgICJ1bmRlcGxveSIsICJ1cGRhdGUiLi4uPC90ZD4KKyAgICA8dGQ+YWN0aW9uPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyB0aGUgYWN0aW9uIHRvIGJlIHBlcmZvcm1lZC4gIEZvciBtb3N0IGNhc2VzIHRoaXMgd2lsbCBiZSA8cT5kZXBsb3k8L3E+LiAgU29tZSB0b29scworICAgICAgc3VwcG9ydCBhZGRpdGlvbmFsIGFjdGlvbnMsIHN1Y2gKKyAgICAgIGFzIDxxPmRlbGV0ZTwvcT4sIDxxPmxpc3Q8L3E+LCA8cT51bmRlcGxveTwvcT4sIDxxPnVwZGF0ZTwvcT4sIC4uLjwvdGQ+CiAgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIGZ1bGx5IHF1YWxpZmllZCBwYXRoL2ZpbGVuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgZGVwbG95ZWQuCi0gICAgVGhpcyBtYXkgYmUgYW4gLmVhciwgLmphciwgLndhciwgb3IgYW55IG90aGVyIHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4KLSAgICA8L3RkPgorICAgIDx0ZD5zb3VyY2U8L3RkPgorICAgIDx0ZD5BIGZ1bGx5IHF1YWxpZmllZCBwYXRoL2ZpbGVuYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgZGVwbG95ZWQuICBUaGlzIG1heSBiZQorICAgICAgYW4gPHNhbXA+LmVhcjwvc2FtcD4sIDxzYW1wPi5qYXI8L3NhbXA+LCA8c2FtcD4ud2FyPC9zYW1wPiwgb3IgYW55IG90aGVyIHR5cGUgdGhhdCBpcworICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuPC90ZD4KICAgICA8dGQ+VG9vbCBkZXBlbmRlbnQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+VGhlIHNlcnZlcmRlcGxveSB0YXNrIHN1cHBvcnRzIGEgbmVzdGVkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gZWxlbWVudCB0byBzZXQgdGhlIGNsYXNzcGF0aC48L3A+Cis8cD5UaGUgPGNvZGU+c2VydmVyZGVwbG95PC9jb2RlPiB0YXNrIHN1cHBvcnRzIGEgbmVzdGVkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gZWxlbWVudCB0byBzZXQgdGhlCitjbGFzc3BhdGguPC9wPgogCiA8aDM+VmVuZG9yLXNwZWNpZmljIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxoMz5QYXJhbWV0ZXJzIHVzZWQgZm9yIGFsbCB0b29sczo8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPkFsc28gc3VwcG9ydGVkIGFyZSBuZXN0ZWQgdmVuZG9yLXNwZWNpZmljIGVsZW1lbnRzLjwvcD4KKworPGgzPlBhcmFtZXRlcnMgdXNlZCBmb3IgYWxsIHRvb2xzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byBiZSBwYXNzZWQgdG8gdGhlIEpWTSBydW5uaW5nIHRoZSB0b29sLgotICAgIFRoZSBjbGFzc3BhdGggbWF5IGFsc28gYmUgc3VwcGxpZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC48L3RkPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHRvIGJlIHBhc3NlZCB0byB0aGUgSlZNIHJ1bm5pbmcgdGhlIHRvb2wuICBUaGUgY2xhc3NwYXRoIG1heSBhbHNvIGJlIHN1cHBsaWVkCisgICAgICBhcyBhIG5lc3RlZCBlbGVtZW50LjwvdGQ+CiAgICAgPHRkPlRvb2wgZGVwZW5kZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBhZGRyZXNzIG9yIFVSTCBmb3IgdGhlIHNlcnZlciB3aGVyZSB0aGUgY29tcG9uZW50IHdpbGwgYmUgZGVwbG95ZWQuPC90ZD4KKyAgICA8dGQ+c2VydmVyPC90ZD4KKyAgICA8dGQ+VGhlIGFkZHJlc3Mgb3IgVVJMIGZvciB0aGUgc2VydmVyIHdoZXJlIHRoZSBjb21wb25lbnQgd2lsbCBiZSBkZXBsb3llZC48L3RkPgogICAgIDx0ZD5Ub29sIGRlcGVuZGVudDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1c2VyIHdpdGggcHJpdmlsZWdlcyB0byBkZXBsb3kgYXBwbGljYXRpb25zIHRvIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+dXNlcm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgdXNlciB3aXRoIHByaXZpbGVnZXMgdG8gZGVwbG95IGFwcGxpY2F0aW9ucyB0byB0aGUgc2VydmVyLjwvdGQ+CiAgICAgPHRkPlRvb2wgZGVwZW5kZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhc3N3b3JkIG9mIHRoZSB1c2VyIHdpdGggcHJpdmlsZWdlcyB0byBkZXBsb3kgYXBwbGljYXRpb25zIHRvIHRoZSBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5UaGUgcGFzc3dvcmQgb2YgdGhlIHVzZXIgd2l0aCBwcml2aWxlZ2VzIHRvIGRlcGxveSBhcHBsaWNhdGlvbnMgdG8gdGhlIHNlcnZlci48L3RkPgogICAgIDx0ZD5Ub29sIGRlcGVuZGVudDwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD5BbHNvIHN1cHBvcnRlZCBhcmUgbmVzdGVkIHZlbmRvci1zcGVjaWZpYyBlbGVtZW50cy48L3A+Ci0KLTxhIG5hbWU9InNlcnZlcmRlcGxveV9nZW5lcmljIj4KLTxoMz5HZW5lcmljIGVsZW1lbnQ8L2gzPgotVGhpcyBlbGVtZW50IGlzIHByb3ZpZGVkIGZvciBnZW5lcmljIEphdmEtYmFzZWQgZGVwbG95bWVudCB0b29scy4KLVRoZSBnZW5lcmljIHRhc2sgYWNjZXB0cyAoYnV0IGRvZXMgbm90IHJlcXVpcmUpIG5lc3RlZCA8Y29kZT5hcmc8L2NvZGU+Ci1hbmQgPGNvZGU+anZtYXJnPC9jb2RlPiBlbGVtZW50cy4KLUEgSlZNIHdpbGwgYmUgc3Bhd25lZCB3aXRoIHRoZSBwcm92aWRlZCBhdHRyaWJ1dGVzLiAgSXQgaXMgcmVjb21tZW5kZWQKLXRoYXQgYSB2ZW5kb3Itc3BlY2lmaWMgZWxlbWVudCBiZSB1c2VkIG92ZXIgdGhlIGdlbmVyaWMgb25lIGlmIGF0IGFsbAotcG9zc2libGUuCis8aDMgaWQ9InNlcnZlcmRlcGxveV9nZW5lcmljIj5HZW5lcmljIGVsZW1lbnQ8L2gzPgorPHA+VGhpcyBlbGVtZW50IGlzIHByb3ZpZGVkIGZvciBnZW5lcmljIEphdmEtYmFzZWQgZGVwbG95bWVudCB0b29scy4gIFRoZSBnZW5lcmljIHRhc2sgYWNjZXB0cyAoYnV0Citkb2VzIG5vdCByZXF1aXJlKSBuZXN0ZWQgPGNvZGU+YXJnPC9jb2RlPiBhbmQgPGNvZGU+anZtYXJnPC9jb2RlPiBlbGVtZW50cy4gIEEgSlZNIHdpbGwgYmUgc3Bhd25lZAord2l0aCB0aGUgcHJvdmlkZWQgYXR0cmlidXRlcy4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgYSB2ZW5kb3Itc3BlY2lmaWMgZWxlbWVudCBiZSB1c2VkIG92ZXIgdGhlCitnZW5lcmljIG9uZSBpZiBhdCBhbGwgcG9zc2libGUuPC9wPgogPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgZWxlbWVudC48L3A+Ci08cD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIEphdmEgYmFzZWQKLSAgICBkZXBsb3ltZW50IHRvb2wgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZD5jbGFzc25hbWU8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBKYXZhIGJhc2VkIGRlcGxveW1lbnQgdG9vbCB0byBleGVjdXRlLjwvdGQ+CiAgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPC9wPgogCi08aDM+TmVzdGVkIEVsZW1lbnRzPC9oMz4KLTxwPlRoZSBnZW5lcmljIGVsZW1lbnQgc3VwcG9ydHMgbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxoND5OZXN0ZWQgZWxlbWVudHM8L2g0PgorPHA+VGhlIGdlbmVyaWMgZWxlbWVudCBzdXBwb3J0cyBuZXN0ZWQgPGNvZGU+Jmx0O2FyZyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7anZtYXJnJmd0OzwvY29kZT4KK2VsZW1lbnRzLjwvcD4KIAogPGgzPkV4YW1wbGU8L2gzPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiBnZW5lcmljIGRlcGxveSBlbGVtZW50IHRvIGRlcGxveSBhIGNvbXBvbmVudAotdXNpbmcgYSBKYXZhIGJhc2VkIGRlcGxveSB0b29sOjwvcD4KKzxwPlRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIGdlbmVyaWMgZGVwbG95IGVsZW1lbnQgdG8gZGVwbG95IGEgY29tcG9uZW50IHVzaW5nIGEgSmF2YSBiYXNlZAorZGVwbG95IHRvb2w6PC9wPgogCiA8cHJlPgotICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2RlcGxveSZxdW90OyBzb3VyY2U9JnF1b3Q7JHtsaWIuZGlyfS9lamJfbXlBcHAuZWFyJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7Z2VuZXJpYyBjbGFzc25hbWU9ImNvbS55YW1hdG8uajJlZS50b29scy5kZXBsb3kuRGVwbG95VG9vbCIKLSAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsKLSAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OwotICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7JHt1c2VyLnBhc3N3b3JkfSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDthcmcgdmFsdWU9Ii1jb21wb25lbnQ9V2lsZFN0YXIiLyZndDsKLSAgICAgICAgICAgICZsdDthcmcgdmFsdWU9Ii1mb3JjZSIvJmd0OwotICAgICAgICAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLW1zNjRtIi8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7anZtYXJnIHZhbHVlPSItbXgxMjhtIi8mZ3Q7Ci0gICAgICAgICZsdDsvZ2VuZXJpYyZndDsKLSAgICAmbHQ7L3NlcnZlcmRlcGxveSZndDsKLTwvcHJlPgorJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7ZGVwbG95JnF1b3Q7IHNvdXJjZT0mcXVvdDske2xpYi5kaXJ9L2VqYl9teUFwcC5lYXImcXVvdDsmZ3Q7CisgICAgJmx0O2dlbmVyaWMgY2xhc3NuYW1lPSJjb20ueWFtYXRvLmoyZWUudG9vbHMuZGVwbG95LkRlcGxveVRvb2wiCisgICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90OworICAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OworICAgICAgICAgICAgIHBhc3N3b3JkPSZxdW90OyR7dXNlci5wYXNzd29yZH0mcXVvdDsmZ3Q7CisgICAgICAgICZsdDthcmcgdmFsdWU9Ii1jb21wb25lbnQ9V2lsZFN0YXIiLyZndDsKKyAgICAgICAgJmx0O2FyZyB2YWx1ZT0iLWZvcmNlIi8mZ3Q7CisgICAgICAgICZsdDtqdm1hcmcgdmFsdWU9Ii1tczY0bSIvJmd0OworICAgICAgICAmbHQ7anZtYXJnIHZhbHVlPSItbXgxMjhtIi8mZ3Q7CisgICAgJmx0Oy9nZW5lcmljJmd0OworJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7PC9wcmU+CiAKLTxhIG5hbWU9InNlcnZlcmRlcGxveV93ZWJsb2dpYyI+Ci08aDM+V2ViTG9naWMgZWxlbWVudDwvaDM+Ci08cD4KLVRoZSBXZWJMb2dpYyBlbGVtZW50IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBydW4gdGhlCi08Y29kZT53ZWJsb2dpYy5kZXBsb3k8L2NvZGU+IGRlcGxveW1lbnQgdG9vbC4KLTxwPlZhbGlkIGFjdGlvbnMgZm9yIHRoZSB0b29sIGFyZSA8Y29kZT5kZXBsb3k8L2NvZGU+LCA8Y29kZT51bmRlcGxveTwvY29kZT4sCi08Y29kZT5saXN0PC9jb2RlPiwgPGNvZGU+dXBkYXRlPC9jb2RlPiwgYW5kIDxjb2RlPmRlbGV0ZTwvY29kZT4uCi08cD5JZiB0aGUgYWN0aW9uIGlzIDxjb2RlPmRlcGxveTwvY29kZT4gb3IgPGNvZGU+dXBkYXRlPC9jb2RlPiwKLXRoZSA8Y29kZT5hcHBsaWNhdGlvbjwvY29kZT4gYW5kIDxjb2RlPnNvdXJjZTwvY29kZT4gYXR0cmlidXRlcyBtdXN0IGJlIHNldC4KLUlmIHRoZSBhY3Rpb24gaXMgPGNvZGU+dW5kZXBsb3k8L2NvZGU+IG9yIDxjb2RlPmRlbGV0ZTwvY29kZT4sCi10aGUgPGNvZGU+YXBwbGljYXRpb248L2NvZGU+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4gIElmIHRoZSA8Y29kZT51c2VybmFtZTwvY29kZT4KLWF0dHJpYnV0ZSBpcyBvbWl0dGVkLCBpdCBkZWZhdWx0cyB0byAic3lzdGVtIi4gIFRoZSA8Y29kZT5wYXNzd29yZDwvY29kZT4gYXR0cmlidXRlIGlzCi1yZXF1aXJlZCBmb3IgYWxsIGFjdGlvbnMuCi08cD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDMgaWQ9InNlcnZlcmRlcGxveV93ZWJsb2dpYyI+V2ViTG9naWMgZWxlbWVudDwvaDM+Cis8cD5UaGUgV2ViTG9naWMgZWxlbWVudCBjb250YWlucyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gcnVuIHRoZSA8Y29kZT53ZWJsb2dpYy5kZXBsb3k8L2NvZGU+CitkZXBsb3ltZW50IHRvb2wuPC9wPgorPHA+VmFsaWQgYWN0aW9ucyBmb3IgdGhlIHRvb2wgYXJlIDxxPmRlcGxveTwvcT4sIDxxPnVuZGVwbG95PC9xPiwgPHE+bGlzdDwvcT4sIDxxPnVwZGF0ZTwvcT4sCithbmQgPHE+ZGVsZXRlPC9xPi48L3A+Cis8cD5JZiB0aGUgYWN0aW9uIGlzIDxxPmRlcGxveTwvcT4gb3IgPHE+dXBkYXRlPC9xPiwgdGhlIDx2YXI+YXBwbGljYXRpb248L3Zhcj4gYW5kIDx2YXI+c291cmNlPC92YXI+CithdHRyaWJ1dGVzIG11c3QgYmUgc2V0LiAgSWYgdGhlIGFjdGlvbiBpcyA8cT51bmRlcGxveTwvcT4gb3IgPHE+ZGVsZXRlPC9xPiwKK3RoZSA8dmFyPmFwcGxpY2F0aW9uPC92YXI+IGF0dHJpYnV0ZSBtdXN0IGJlIHNldC4gIElmIHRoZSA8dmFyPnVzZXJuYW1lPC92YXI+IGF0dHJpYnV0ZSBpcyBvbWl0dGVkLAoraXQgZGVmYXVsdHMgdG8gPHE+c3lzdGVtPC9xPi4gIFRoZSA8dmFyPnBhc3N3b3JkPC92YXI+IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgYWxsIGFjdGlvbnMuPC9wPgorCis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXBwbGljYXRpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gYmVpbmcgZGVwbG95ZWQ8L3RkPgorICAgIDx0ZD5hcHBsaWNhdGlvbjwvdGQ+CisgICAgPHRkPlRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGJlaW5nIGRlcGxveWVkPC90ZD4KICAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcG9uZW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgaXMgdGhlIGNvbXBvbmVudCBzdHJpbmcgZm9yIGRlcGxveW1lbnQgdGFyZ2V0cy4KLSAgICBJdCBpcyBpbiB0aGUgZm9ybSA8Y29kZT4mbHQ7Y29tcG9uZW50Jmd0OzombHQ7dGFyZ2V0MSZndDssJmx0O3RhcmdldDImZ3Q7Li4uPC9jb2RlPgotICAgIFdoZXJlIGNvbXBvbmVudCBpcyB0aGUgYXJjaGl2ZSBuYW1lIChtaW51cyB0aGUgLmphciwgLmVhciwgLndhcgotICAgIGV4dGVuc2lvbikuICBUYXJnZXRzIGFyZSB0aGUgc2VydmVycyB3aGVyZSB0aGUgY29tcG9uZW50cyB3aWxsIGJlIGRlcGxveWVkPC90ZD4KLSAgICA8dGQ+bm88L3RkPgorICAgIDx0ZD5jb21wb25lbnQ8L3RkPgorICAgIDx0ZD5UaGlzIGlzIHRoZSBjb21wb25lbnQgc3RyaW5nIGZvciBkZXBsb3ltZW50IHRhcmdldHMuICBJdCBpcyBpbiB0aGUKKyAgICAgIGZvcm0gPGNvZGU+Jmx0O2NvbXBvbmVudCZndDs6Jmx0O3RhcmdldDEmZ3Q7LCZsdDt0YXJnZXQyJmd0Oy4uLjwvY29kZT4gIFdoZXJlIGNvbXBvbmVudCBpcyB0aGUKKyAgICAgIGFyY2hpdmUgbmFtZSAobWludXMgdGhlIDxzYW1wPi5qYXI8L3NhbXA+LCA8c2FtcD4uZWFyPC9zYW1wPiwgPHNhbXA+Lndhcjwvc2FtcD4gZXh0ZW5zaW9uKS4KKyAgICAgIFRhcmdldHMgYXJlIHRoZSBzZXJ2ZXJzIHdoZXJlIHRoZSBjb21wb25lbnRzIHdpbGwgYmUgZGVwbG95ZWQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlYnVnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklmIHNldCB0byB0cnVlLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUKLSAgICBwcmludGVkIGR1cmluZyB0aGUgZGVwbG95bWVudCBwcm9jZXNzLjwvdGQ+CisgICAgPHRkPmRlYnVnPC90ZD4KKyAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJpbnRlZCBkdXJpbmcgdGhlIGRlcGxveW1lbnQKKyAgICAgIHByb2Nlc3MuPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cD5UaGlzIGV4YW1wbGUgc2hvd3MgdGhlIHVzZSBvZiBzZXJ2ZXJkZXBsb3kgdG8gZGVwbG95IGEgY29tcG9uZW50IHRvIGEgV2ViTG9naWMgc2VydmVyOjwvcD4KKzxwPlRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIDxjb2RlPnNlcnZlcmRlcGxveTwvY29kZT4gdG8gZGVwbG95IGEgY29tcG9uZW50IHRvIGEgV2ViTG9naWMKK3NlcnZlcjo8L3A+CiAKIDxwcmU+Ci0gICAgJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7ZGVwbG95JnF1b3Q7IHNvdXJjZT0mcXVvdDske2xpYi5kaXJ9L2VqYl9teUFwcC5lYXImcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDt3ZWJsb2dpYyBhcHBsaWNhdGlvbj0mcXVvdDtteWFwcCZxdW90OwotICAgICAgICAgICAgc2VydmVyPSZxdW90O3QzOi8vbXlzZXJ2ZXI6NzAwMSZxdW90OwotICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7d2VibG9naWMuaG9tZX0vbGliL3dlYmxvZ2ljLmphciZxdW90OwotICAgICAgICAgICAgdXNlcm5hbWU9JnF1b3Q7JHt1c2VyLm5hbWV9JnF1b3Q7Ci0gICAgICAgICAgICBwYXNzd29yZD0mcXVvdDske3VzZXIucGFzc3dvcmR9JnF1b3Q7Ci0gICAgICAgICAgICBjb21wb25lbnQ9JnF1b3Q7ZWpiX2Zvb2JhcjpteXNlcnZlcixwcm9kdWN0aW9uc2VydmVyJnF1b3Q7Ci0gICAgICAgICAgICBkZWJ1Zz0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3NlcnZlcmRlcGxveSZndDsKLTwvcHJlPgorJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7ZGVwbG95JnF1b3Q7IHNvdXJjZT0mcXVvdDske2xpYi5kaXJ9L2VqYl9teUFwcC5lYXImcXVvdDsmZ3Q7CisgICAgJmx0O3dlYmxvZ2ljIGFwcGxpY2F0aW9uPSZxdW90O215YXBwJnF1b3Q7CisgICAgICAgICAgICAgIHNlcnZlcj0mcXVvdDt0MzovL215c2VydmVyOjcwMDEmcXVvdDsKKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSZxdW90OyR7d2VibG9naWMuaG9tZX0vbGliL3dlYmxvZ2ljLmphciZxdW90OworICAgICAgICAgICAgICB1c2VybmFtZT0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsKKyAgICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7JHt1c2VyLnBhc3N3b3JkfSZxdW90OworICAgICAgICAgICAgICBjb21wb25lbnQ9JnF1b3Q7ZWpiX2Zvb2JhcjpteXNlcnZlcixwcm9kdWN0aW9uc2VydmVyJnF1b3Q7CisgICAgICAgICAgICAgIGRlYnVnPSZxdW90O3RydWUmcXVvdDsvJmd0OworJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7PC9wcmU+CiAKLTxwPlRoaXMgZXhhbXBsZSBzaG93cyBzZXJ2ZXJkZXBsb3kgYmVpbmcgdXNlZCB0byBkZWxldGUgYSBjb21wb25lbnQgZnJvbSBhCi1XZWJMb2dpYyBzZXJ2ZXI6PC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIDxjb2RlPnNlcnZlcmRlcGxveTwvY29kZT4gYmVpbmcgdXNlZCB0byBkZWxldGUgYSBjb21wb25lbnQgZnJvbSBhIFdlYkxvZ2ljCitzZXJ2ZXI6PC9wPgogCiA8cHJlPgotICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2RlbGV0ZSZxdW90OyBzb3VyY2U9JnF1b3Q7JHtsaWIuZGlyfS9lamJfbXlBcHAuamFyJnF1b3Q7LyZndAotICAgICAgICAmbHQ7d2VibG9naWMgYXBwbGljYXRpb249JnF1b3Q7bXlhcHAmcXVvdDsKLSAgICAgICAgICAgIHNlcnZlcj0mcXVvdDt0MzovL215c2VydmVyOjcwMDEmcXVvdDsKLSAgICAgICAgICAgIGNsYXNzcGF0aD0mcXVvdDske3dlYmxvZ2ljLmhvbWV9L2xpYi93ZWJsb2dpYy5qYXImcXVvdDsKLSAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OwotICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7JHt1c2VyLnBhc3N3b3JkfSZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7Ci08L3ByZT4KKyZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2RlbGV0ZSZxdW90OyBzb3VyY2U9JnF1b3Q7JHtsaWIuZGlyfS9lamJfbXlBcHAuamFyJnF1b3Q7LyZndDsKKyAgICAmbHQ7d2VibG9naWMgYXBwbGljYXRpb249JnF1b3Q7bXlhcHAmcXVvdDsKKyAgICAgICAgICAgICAgc2VydmVyPSZxdW90O3QzOi8vbXlzZXJ2ZXI6NzAwMSZxdW90OworICAgICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9saWIvd2VibG9naWMuamFyJnF1b3Q7CisgICAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OworICAgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDske3VzZXIucGFzc3dvcmR9JnF1b3Q7LyZndDsKKyZsdDsvc2VydmVyZGVwbG95Jmd0OzwvcHJlPgogCi08YSBuYW1lPSJzZXJ2ZXJkZXBsb3lfam9uYXMiPgotPGgzPkpPbkFTIChKYXZhIE9wZW4gQXBwbGljYXRpb24gU2VydmVyKSBlbGVtZW50PC9oMz4KLTxwPgotVGhlIEpPbkFTIGVsZW1lbnQgY29udGFpbnMgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIHRvIHJ1biB0aGUKLTxjb2RlPkpvbmFzQWRtaW48L2NvZGU+IGRlcGxveW1lbnQgdG9vbC4KLTxwPlZhbGlkIGFjdGlvbnMgZm9yIHRoZSB0b29sIGFyZSA8Y29kZT5kZXBsb3k8L2NvZGU+LCA8Y29kZT51bmRlcGxveTwvY29kZT4sCi08Y29kZT5saXN0PC9jb2RlPiBhbmQgPGNvZGU+dXBkYXRlPC9jb2RlPi4KLTxwPllvdSBjYW4ndCB1c2UgPGNvZGU+dXNlcjwvY29kZT4gYW5kIDxjb2RlPnBhc3N3b3JkPC9jb2RlPiBwcm9wZXJ0eSB3aXRoIHRoaXMgCi10YXNrLgotPHA+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGgzIGlkPSJzZXJ2ZXJkZXBsb3lfam9uYXMiPkpPbkFTIChKYXZhIE9wZW4gQXBwbGljYXRpb24gU2VydmVyKSBlbGVtZW50PC9oMz4KKzxwPlRoZSBKT25BUyBlbGVtZW50IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byBydW4gdGhlIDxjb2RlPkpvbmFzQWRtaW48L2NvZGU+IGRlcGxveW1lbnQKK3Rvb2wuPC9wPgorPHA+VmFsaWQgYWN0aW9ucyBmb3IgdGhlIHRvb2wgYXJlIDxxPmRlcGxveTwvcT4sIDxxPnVuZGVwbG95PC9xPiwgPHE+bGlzdDwvcT4gYW5kIDxxPnVwZGF0ZTwvcT4uPC9wPgorPHA+WW91IGNhbid0IHVzZSA8dmFyPnVzZXI8L3Zhcj4gYW5kIDx2YXI+cGFzc3dvcmQ8L3Zhcj4gcHJvcGVydHkgd2l0aCB0aGlzIHRhc2suPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmpvbmFzcm9vdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcm9vdCBkaXJlY3RvcnkgZm9yIEpPbkFTLjwvdGQ+CisgICAgPHRkPmpvbmFzcm9vdDwvdGQ+CisgICAgPHRkPlRoZSByb290IGRpcmVjdG9yeSBmb3IgSk9uQVMuPC90ZD4KICAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3JiPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNob29zZSB5b3VyIE9SQiA6IFJNSSwgSkVSRU1JRSwgREFWSUQsIC4uLiBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cwotICAgICB0byB0aGUgb25lIHByZXNlbnQgaW4gY2xhc3NwYXRoLiBUaGUgY29ycmVzcG9uZGluZyBKT25BUyBKQVIgaXMKLSAgICAgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoLiBJZiB5b3VyIG9yYiBpcyBEQVZJRCAoUk1JL0lJT1ApIHlvdSBtdXN0IAotICAgICBzcGVjaWZ5IGRhdmlkaG9zdCBhbmQgZGF2aWRwb3J0IHByb3BlcnRpZXMuPC90ZD4KKyAgICA8dGQ+b3JiPC90ZD4KKyAgICA8dGQ+Q2hvb3NlIHlvdXIgT1JCOiA8cT5STUk8L3E+LCA8cT5KRVJFTUlFPC9xPiwgPHE+REFWSUQ8L3E+LCAuLi4gVGhlIGNvcnJlc3BvbmRpbmcgSk9uQVMgSkFSCisgICAgICBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBjbGFzc3BhdGguIElmIHlvdXIgPHZhcj5vcmI8L3Zhcj4gaXMgPHE+REFWSUQ8L3E+IChSTUkvSUlPUCkgeW91CisgICAgICBtdXN0IHNwZWNpZnkgPHZhcj5kYXZpZGhvc3Q8L3Zhcj4gYW5kIDx2YXI+ZGF2aWRwb3J0PC92YXI+IHByb3BlcnRpZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHRoZSBPUkIgcHJlc2VudCBpbiBjbGFzc3BhdGg8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmRhdmlkaG9zdDwvdGQ+CisgICAgPHRkPlRoZSB2YWx1ZSBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0eTogPGNvZGU+ZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfaG9zdDwvY29kZT4uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kYXZpZGhvc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIGZvciB0aGUgc3lzdGVtIHByb3BlcnR5IDogPGNvZGU+ZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfaG9zdDwvY29kZT4gLjwvdGQ+CisgICAgPHRkPmRhdmlkcG9ydDwvdGQ+CisgICAgPHRkPlRoZSB2YWx1ZSBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0eTogPGNvZGU+ZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfcG9ydDwvY29kZT4uPC90ZD4KICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kYXZpZHBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZhbHVlIGZvciB0aGUgc3lzdGVtIHByb3BlcnR5IDogPGNvZGU+ZGF2aWQuQ29zTmFtaW5nLmRlZmF1bHRfcG9ydDwvY29kZT4gLjwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQ+VGhpcyBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgSmF2YSBiYXNlZCBkZXBsb3ltZW50IHRvb2wgdG8gZXhlY3V0ZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8Y29kZT5vcmcub2JqZWN0d2ViLmpvbmFzLmFkbS5Kb25hc0FkbWluPC9jb2RlPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lIG9mIHRoZSBKYXZhIGJhc2VkCi0gICAgZGVwbG95bWVudCB0b29sIHRvIGV4ZWN1dGUuIERlZmF1bHQgdG8gPGNvZGU+b3JnLm9iamVjdHdlYi5qb25hcy5hZG0uSm9uYXNBZG1pbjwvY29kZT48L3RkPgotICAgIDx0ZD5ObzwvdGQ+Ci0gIDwvdHI+Ci0KIDwvdGFibGU+CiAKLTxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgotPHA+VGhlIGpvbmFzIGVsZW1lbnQgc3VwcG9ydHMgbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2p2bWFyZyZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KLQorPGg0Pk5lc3RlZCBlbGVtZW50czwvaDQ+Cis8cD5UaGUgPGNvZGU+am9uYXM8L2NvZGU+IGVsZW1lbnQgc3VwcG9ydHMgbmVzdGVkIDxjb2RlPiZsdDthcmcmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtqdm1hcmcmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+CiAKLTxwPlRoaXMgZXhhbXBsZSBzaG93cyB0aGUgdXNlIG9mIHNlcnZlcmRlcGxveSB0byBkZXBsb3kgYSBjb21wb25lbnQgdG8gYSBKT25BUyBzZXJ2ZXI6PC9wPgorPHA+VGhpcyBleGFtcGxlIHNob3dzIHRoZSB1c2Ugb2YgPGNvZGU+c2VydmVyZGVwbG95PC9jb2RlPiB0byBkZXBsb3kgYSBjb21wb25lbnQgdG8gYSBKT25BUworc2VydmVyOjwvcD4KIAogPHByZT4KLSAgICAmbHQ7c2VydmVyZGVwbG95IGFjdGlvbj0mcXVvdDtkZXBsb3kmcXVvdDsgc291cmNlPSZxdW90OyR7bGliLmRpcn0vZWpiX215QXBwLmphciZxdW90OyZndDsKLSAgICAgICAgJmx0O2pvbmFzIHNlcnZlcj0mcXVvdDtNeUpPbkFTJnF1b3Q7IGpvbmFzcm9vdD0iJHtqb25hcy5yb290fSImZ3Q7CismbHQ7c2VydmVyZGVwbG95IGFjdGlvbj0mcXVvdDtkZXBsb3kmcXVvdDsgc291cmNlPSZxdW90OyR7bGliLmRpcn0vZWpiX215QXBwLmphciZxdW90OyZndDsKKyAgICAmbHQ7am9uYXMgc2VydmVyPSZxdW90O015Sk9uQVMmcXVvdDsgam9uYXNyb290PSIke2pvbmFzLnJvb3R9IiZndDsKKyAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2pvbmFzLnJvb3R9L2xpYi9STUlfam9uYXMuamFyJnF1b3Q7LyZndDsKKyAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqb25hcy5yb290fS9jb25maWcvJnF1b3Q7LyZndDsKKyAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgICAmbHQ7L2pvbmFzJmd0OworJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7PC9wcmU+CiAKLSAgICAgICAgICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7am9uYXMucm9vdH0vbGliL1JNSV9qb25hcy5qYXImcXVvdDsvJmd0OwotICAgICAgICAgICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtqb25hcy5yb290fS9jb25maWcvJnF1b3Q7LyZndDsKLSAgICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgICAgICZsdDsvam9uYXMmZ3Q7Ci0gICAgJmx0Oy9zZXJ2ZXJkZXBsb3kmZ3Q7Ci08L3ByZT4KLQotPHA+VGhpcyBleGFtcGxlIHNob3dzIHNlcnZlcmRlcGxveSBiZWluZyB1c2VkIHRvIGxpc3QgdGhlIGNvbXBvbmVudHMgZnJvbSBhCi1KT25BUyBzZXJ2ZXIgYW5kIGEgV2ViTG9naWMgc2VydmVyOjwvcD4KKzxwPlRoaXMgZXhhbXBsZSBzaG93cyA8Y29kZT5zZXJ2ZXJkZXBsb3k8L2NvZGU+IGJlaW5nIHVzZWQgdG8gbGlzdCB0aGUgY29tcG9uZW50cyBmcm9tIGEgSk9uQVMKK3NlcnZlciBhbmQgYSBXZWJMb2dpYyBzZXJ2ZXI6PC9wPgogCiA8cHJlPgotICAgICZsdDtzZXJ2ZXJkZXBsb3kgYWN0aW9uPSZxdW90O2xpc3QmcXVvdDsvJmd0Ci0gICAgICAgICZsdDtqb25hcyBqb25hc3Jvb3Q9JnF1b3Q7JHtqb25hcy5yb290fSZxdW90OyBvcmI9JnF1b3Q7SkVSRU1JRSZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDt3ZWJsb2dpYyBhcHBsaWNhdGlvbj0mcXVvdDtteWFwcCZxdW90Ci0gICAgICAgICAgICBzZXJ2ZXI9JnF1b3Q7dDM6Ly9teXNlcnZlcjo3MDAxJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9saWIvd2VibG9naWMuamFyJnF1b3Q7Ci0gICAgICAgICAgICB1c2VybmFtZT0mcXVvdDske3VzZXIubmFtZX0mcXVvdDsKLSAgICAgICAgICAgIHBhc3N3b3JkPSZxdW90OyR7dXNlci5wYXNzd29yZH0mcXVvdDsvJmd0OwotICAgICZsdDsvc2VydmVyZGVwbG95Jmd0OwotPC9wcmU+Ci0KLQorJmx0O3NlcnZlcmRlcGxveSBhY3Rpb249JnF1b3Q7bGlzdCZxdW90Oy8mZ3Q7CisgICAgJmx0O2pvbmFzIGpvbmFzcm9vdD0mcXVvdDske2pvbmFzLnJvb3R9JnF1b3Q7IG9yYj0mcXVvdDtKRVJFTUlFJnF1b3Q7LyZndDsKKyAgICAmbHQ7d2VibG9naWMgYXBwbGljYXRpb249JnF1b3Q7bXlhcHAmcXVvdDsKKyAgICAgICAgICAgICAgc2VydmVyPSZxdW90O3QzOi8vbXlzZXJ2ZXI6NzAwMSZxdW90OworICAgICAgICAgICAgICBjbGFzc3BhdGg9JnF1b3Q7JHt3ZWJsb2dpYy5ob21lfS9saWIvd2VibG9naWMuamFyJnF1b3Q7CisgICAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlci5uYW1lfSZxdW90OworICAgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDske3VzZXIucGFzc3dvcmR9JnF1b3Q7LyZndDsKKyZsdDsvc2VydmVyZGVwbG95Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc2V0cGVybWlzc2lvbnMuaHRtbCBiL21hbnVhbC9UYXNrcy9zZXRwZXJtaXNzaW9ucy5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWMxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tYW51YWwvVGFza3Mvc2V0cGVybWlzc2lvbnMuaHRtbApAQCAtMCwwICsxLDk5IEBACis8IURPQ1RZUEUgaHRtbD4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8aHRtbCBsYW5nPSJlbiI+CisKKzxoZWFkPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzx0aXRsZT5TZXRQZXJtaXNzaW9ucyBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMiBpZD0ic2V0cGVybWlzc2lvbnMiPlNldFBlcm1pc3Npb25zPC9oMj4KKzxwPjxlbT5TaW5jZSBBbnQgMS4xMC4wPC9lbT4uPC9wPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPkNoYW5nZXMgdGhlIGZpbGUgcGVybWlzc2lvbnMgdXNpbmcgSmF2YSdzIE5JTyBzdXBwb3J0IGZvciBwZXJtaXNzaW9ucy48L3A+Cis8cD5UaGlzIHRhc2sgcHJvdmlkZXMgYSBzdWJzZXQgb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGFiaWxpdGllcyBvZiA8YSBocmVmPSJjaG1vZC5odG1sIj5jaG1vZDwvYT4KK2FuZCA8YSBocmVmPSJhdHRyaWIuaHRtbCI+YXR0cmliPC9hPiBpbiBhIHBsYXRmb3JtIGluZGVwZW5kZW50IHdheS48L3A+Cis8cD5JZiBubyBwZXJtaXNzaW9ucyBhcmUgc3BlY2lmaWVkIGVpdGhlciB2aWEgdGhlIG1vZGUgb3IgdGhlIHBlcm1pc3Npb25zIGF0dHJpYnV0ZSwgdGhlbiBhbGwKK3Blcm1pc3Npb25zIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBuZXN0ZWQgcmVzb3VyY2VzLjwvcD4KKzxwPlRoZSB0YXNrIGFjY2VwdHMgYXJiaXRyYXJ5IHJlc291cmNlcyBhcyBwYXJ0IG9mIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMsIGJ1dCBub3QgYWxsCityZXNvdXJjZXMgc3VwcG9ydCBzZXR0aW5nIHBlcm1pc3Npb25zLiBUaGlzIHRhc2sgd29uJ3QgZG8gYW55dGhpbmcgZm9yIHJlc291cmNlcyB0aGF0IGRvbid0IHN1cHBvcnQKK3NldHRpbmcgcGVybWlzc2lvbnMmbWRhc2g7Zm9yIGV4YW1wbGUgVVJMcy48L3A+Cis8cD5UaGUgcGVybWlzc2lvbnMgYXJlIGFwcGxpZWQgdG8gYWxsIHJlc291cmNlcyBjb250YWluZWQgd2l0aGluIHRoZSBuZXN0ZWQgcmVzb3VyY2VzCitjb2xsZWN0aW9ucy4gWW91IG1heSB3YW50IHRvIGVuc3VyZSB0aGUgY29sbGVjdGlvbiBvbmx5IHJldHVybnMgZmlsZXMgb3IgZGlyZWN0b3JpZXMgaWYgeW91IHdhbnQKK2RpZmZlcmVudCBzZXRzIG9mIHBlcm1pc3Npb25zIHRvIGFwcGx5IHRvIGVpdGhlciB0eXBlIG9mIHJlc291cmNlLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wZXJtaXNzaW9uczwvdGQ+CisgICAgPHRkPlRoZSBwZXJtaXNzaW9ucyB0byBzZXQgYXMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMKKyAgICAgIG9mIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvbmlvL2ZpbGUvYXR0cmlidXRlL1Bvc2l4RmlsZVBlcm1pc3Npb24uaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+UG9zaXhGaWxlUGVybWlzc2lvbjwvYT4gdmFsdWVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tb2RlPC90ZD4KKyAgICA8dGQ+VGhlIHBlcm1pc3Npb25zIHRvIHNldCBhcyB0cmFkaXRpb25hbCBVbml4IHRocmVlLWRpZ2l0IG9jdGFsIG51bWJlci48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bm9uUG9zaXhNb2RlPC90ZD4KKyAgICA8dGQ+V2hhdCB0byBkbyBpZiBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIHRoZSBmaWxlLXN5c3RlbQorICAgICAgZG9lc24ndCBzdXBwb3J0IFBPU0lYIGZpbGUgcGVybWlzc2lvbnMuIFBvc3NpYmxlIG9wdGlvbnMgYXJlIDxxPmZhaWw8L3E+IChmYWlsIHRoZQorICAgICAgYnVpbGQpLCA8cT5wYXNzPC9xPiAoanVzdCBsb2cgYW4gZXJyb3IpLCA8cT50cnlEb3NPckZhaWw8L3E+IChhdCBsZWFzdCB0cnkgdG8gc2V0IHRoZQorICAgICAgcmVhZC1vbmx5IGZsYWcgb24gRE9TIGZpbGUgc3lzdGVtcywgZmFpbCBpZiB0aGF0IGlzbid0IHBvc3NpYmxlIGVpdGhlcikKKyAgICAgIGFuZCA8cT50cnlEb3NPclBhc3M8L3E+IChhdCBsZWFzdCB0cnkgdG8gc2V0IHRoZSByZWFkLW9ubHkgZmxhZyBvbiBET1MgZmlsZSBzeXN0ZW1zLCBqdXN0IGxvZworICAgICAgYW4gZXJyb3IgaWYgdGhhdCBpc24ndCBwb3NzaWJsZSBlaXRoZXIpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWlsPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHN0b3AgdGhlIGJ1aWxkIGlmIHNldHRpbmcgcGVybWlzc2lvbnMgZmFpbHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKworPGg0PmFueSByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPiBhcmUgdXNlZCB0byBzZWxlY3QgZ3JvdXBzCitvZiByZXNvdXJjZXMuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5NYWtlIHRoZSA8c2FtcD5zdGFydC5zaDwvc2FtcD4gZmlsZSByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBmb3IgYW55b25lIGFuZCBpbiBhZGRpdGlvbiB3cml0YWJsZQorYnkgdGhlIG93bmVyLjwvcD4KKzxwcmU+CismbHQ7c2V0cGVybWlzc2lvbnMgbW9kZT0mcXVvdDs3NTUmcXVvdDsmZ3Q7CisgICZsdDtmaWxlIGZpbGU9JnF1b3Q7JHtkaXN0fS9zdGFydC5zaCZxdW90Oy8mZ3Q7CismbHQ7L3NldHBlcm1pc3Npb25zJmd0OzwvcHJlPgorCis8cD5NYWtlIHRoZSA8c2FtcD5zdGFydC5zaDwvc2FtcD4gZmlsZSByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBmb3IgYW55b25lIGFuZCBpbiBhZGRpdGlvbiB3cml0YWJsZQorYnkgdGhlIG93bmVyLjwvcD4KKzxwcmU+CismbHQ7c2V0cGVybWlzc2lvbnMgcGVybWlzc2lvbnM9JnF1b3Q7T1dORVJfUkVBRCxPV05FUl9XUklURSxPV05FUl9FWEVDVVRFLE9USEVSU19SRUFELE9USEVSU19FWEVDVVRFLEdST1VQX1JFQUQsR1JPVVBfRVhFQ1VURSZxdW90OyZndDsKKyAgJmx0O2ZpbGUgZmlsZT0mcXVvdDske2Rpc3R9L3N0YXJ0LnNoJnF1b3Q7LyZndDsKKyZsdDsvc2V0cGVybWlzc2lvbnMmZ3Q7PC9wcmU+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc2V0cHJveHkuaHRtbCBiL21hbnVhbC9UYXNrcy9zZXRwcm94eS5odG1sCmluZGV4IDI0NTkyNGMuLmNkNWEyZWIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zZXRwcm94eS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zZXRwcm94eS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjA3ICsxNSw5OCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLSAgICAKLTxodG1sPgorCis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogICA8dGl0bGU+U2V0cHJveHkgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCi0gICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorPGJvZHk+Cis8aDI+U2V0cHJveHkgVGFzazwvaDI+CiAKLTx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+Cis8aDMgaWQ9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvaDM+Cis8cD5TZXRzIEphdmEncyB3ZWIgcHJveHkgcHJvcGVydGllcywgc28gdGhhdCB0YXNrcyBhbmQgY29kZSBydW4gaW4gdGhlIHNhbWUgSlZNIGNhbiBoYXZlCit0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcywgYW5kIHJlbW90ZSBGVFAgc2l0ZXMuIFlvdSBjYW4gbm9taW5hdGUgYW4gSFRUUCBhbmQKK0ZUUCBwcm94eSwgb3IgYSBTT0NLUyBzZXJ2ZXIsIHJlc2V0IHRoZSBzZXJ2ZXIgc2V0dGluZ3MsIG9yIGRvIG5vdGhpbmcgYXQgYWxsLjwvcD4KIAotICA8IS0tIFBBR0UgSEVBREVSIC0tPgorPGgzIGlkPSJhdHRyaWJ1dGVzIj5QYXJhbWV0ZXJzPC9oMz4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQ+Ci0gICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+PHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249ImJvdHRvbSI+Ci0gICAgICAgICAgICA8Zm9udCBzaXplPSIrMyIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48c3Ryb25nPlNldHByb3h5IFRhc2s8L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIEphdmEncyB3ZWIgcHJveHkgcHJvcGVydGllcywgc28gdGhhdCB0YXNrcyBhbmQgY29kZSBydW4gaW4gdGhlIHNhbWUgSlZNIGNhbiBoYXZlIHRocm91Z2gtdGhlLWZpcmV3YWxsIGFjY2VzcyB0byByZW1vdGUgd2ViIHNpdGVzLCBhbmQgcmVtb3RlIGZ0cCBzaXRlcy48L2ZvbnQ+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8IS0tIFBST0pFQ1QgTE9HTyAtLT4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPgotICAgICAgICAgICAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBBbnQiIGJvcmRlcj0iMCI+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+PC90YWJsZT4KLSAgICA8L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlR5cGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+Ci0KLSAgPCEtLSBTVEFSVCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KICAgPHRyPgotICAgIDx0ZCAgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLQotICAgICAgICAgIDwhLS0gQXBwbHlpbmcgdGFzay9sb25nLWRlc2NyaXB0aW9uIC0tPgotICAgIDwhLS0gU3RhcnQgRGVzY3JpcHRpb24gLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iZGVzY3JpcHRpb24iPgotICAgICAgICAgIDxzdHJvbmc+RGVzY3JpcHRpb248L3N0cm9uZz48L2E+PC9mb250PgotICAgICAgPC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBTZXRzIEphdmEncyB3ZWIgcHJveHkgcHJvcGVydGllcywgc28gdGhhdCB0YXNrcyBhbmQgY29kZSBydW4gaW4gdGhlIHNhbWUgSlZNIGNhbiBoYXZlIHRocm91Z2gtdGhlLWZpcmV3YWxsIGFjY2VzcyB0byByZW1vdGUgd2ViIHNpdGVzLCBhbmQgcmVtb3RlIGZ0cCBzaXRlcy4gWW91IGNhbiBub21pbmF0ZSBhbiBodHRwIGFuZCBmdHAgcHJveHksIG9yIGEgc29ja3Mgc2VydmVyLCByZXNldCB0aGUgc2VydmVyIHNldHRpbmdzLCBvciBkbyBub3RoaW5nIGF0IGFsbC4gPHA+IEV4YW1wbGVzIDxwcmU+Jmx0O3NldHByb3h5LyZndDs8L3ByZT4gZG8gbm90aGluZyA8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIi8mZ3Q7PC9wcmU+IHNldCB0aGUgcHJveHkgdG8gZmlyZXdhbGw6ODAgPHByZT4mbHQ7c2V0cHJveHkgcHJveHlob3N0PSJmaXJld2FsbCIgcHJveHlwb3J0PSI4MSIvJmd0OzwvcHJlPiBzZXQgdGhlIHByb3h5IHRvIGZpcmV3YWxsOjgxIDxwcmU+Jmx0O3NldHByb3h5IHByb3h5aG9zdD0iIi8mZ3Q7PC9wcmU+IHN0b3AgdXNpbmcgdGhlIGh0dHAgcHJveHk7IGRvbid0IGNoYW5nZSB0aGUgc29ja3Mgc2V0dGluZ3MgPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9InNvY2tzeSIvJmd0OzwvcHJlPiB1c2Ugc29ja3MgdmlhIHNvY2tzeToxMDgwIDxwcmU+Jmx0O3NldHByb3h5IHNvY2tzcHJveHlob3N0PSIiLyZndDs8L3ByZT4gc3RvcCB1c2luZyB0aGUgc29ja3Mgc2VydmVyLiA8cD4gWW91IGNhbiBzZXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIGh0dHAgd2l0aCB0aGUgPHR0PnByb3h5SG9zdDwvdHQ+IGFuZCA8dHQ+cHJveHlQYXNzd29yZDwvdHQ+IGF0dHJpYnV0ZXMuIE9uIEphdmExLjQgYW5kIGFib3ZlIHRoZXNlIGNhbiBhbHNvIGJlIHVzZWQgYWdhaW5zdCBTT0NLUzUgc2VydmVycy4gPC9wPgotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRGVzY3JpcHRpb24gLS0+Ci0KLSA8IS0tIElnbm9yZSAtLT4KLQotCi0KLSAgICA8IS0tIFN0YXJ0IEF0dHJpYnV0ZXMgLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+Ci0gICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgotICAgICAgICAgIDxhIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVyczwvc3Ryb25nPjwvYT48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICA8dGFibGU+Ci0gICAgICAgICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+QXR0cmlidXRlPC9iPjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPkRlc2NyaXB0aW9uPC9iPjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNjY2NjY2MiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxiPlR5cGU8L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+UmVxdWlyZW1lbnQ8L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICAgIDwvdHI+Ci0gICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAotICAgIAotICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPiAgICAKLSAgICAgICAgPCEtLSBBdHRyaWJ1dGUgLS0+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+bm9ucHJveHlob3N0czwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkEgbGlzdCBvZiBob3N0cyB0byBieXBhc3MgdGhlIHByb3h5IG9uLiBUaGVzZSBzaG91bGQgYmUgc2VwYXJhdGVkIHdpdGggdGhlIHZlcnRpY2FsIGJhciBjaGFyYWN0ZXIgJ3wnLiBPbmx5IGluIEphdmEgMS40IGRvZXMgZnRwIHVzZSB0aGlzIGxpc3QuIGUuZy4gZm96Ym90LmNvcnAuc3VuLmNvbXwqLmVuZy5zdW4uY29tPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0IiByb3dzcGFuPSI3Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+T3B0aW9uYWw8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5wcm94eWhvc3Q8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj50aGUgSFRUUC9mdHAgcHJveHkgaG9zdC4gU2V0IHRoaXMgdG8gIiIgZm9yIHRoZSBodHRwIHByb3h5IG9wdGlvbiB0byBiZSBkaXNhYmxlZDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3h5cGFzc3dvcmQ8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIHBhc3N3b3JkIGZvciB0aGUgcHJveHkuIFVzZWQgb25seSBpZiB0aGUgcHJveHlVc2VyIGlzIHNldC48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5wcm94eXBvcnQ8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj50aGUgSFRUUC9mdHAgcHJveHkgcG9ydCBudW1iZXI7IGRlZmF1bHQgaXMgODA8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pbnQ8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5wcm94eXVzZXI8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zZXQgdGhlIHByb3h5IHVzZXIuIFByb2JhYmx5IHJlcXVpcmVzIGEgcGFzc3dvcmQgdG8gYWNjb21wYW55IHRoaXMgc2V0dGluZy4gRGVmYXVsdD0iIjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnNvY2tzcHJveHlob3N0PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+VGhlIG5hbWUgb2YgYSBTb2NrcyBzZXJ2ZXIuIFNldCB0byAiIiB0byB0dXJuIHNvY2tzIHByb3h5aW5nIG9mZi48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5zb2Nrc3Byb3h5cG9ydDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldCB0aGUgUHJveHlQb3J0IGZvciBzb2NrcyBjb25uZWN0aW9ucy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTA4MDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmludDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotCi0KLSAgICAgICAgPC90YWJsZT4KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0KLSAgICA8L3RhYmxlPgotICAgIDwhLS0gRW5kIEF0dHJpYnV0ZXMgLS0+Ci0KLSAgICA8IS0tIFN0YXJ0IEVsZW1lbnRzIC0tPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+Ci0gICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgotICAgICAgICAgIDxhIG5hbWU9ImVsZW1lbnRzIj4KLSAgICAgICAgICA8c3Ryb25nPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KLQotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+Ci0KLQotICAgIDwvdGQ+CisgICAgPHRkPm5vbnByb3h5aG9zdHM8L3RkPgorICAgIDx0ZD5BIGxpc3Qgb2YgaG9zdHMgdG8gYnlwYXNzIHRoZSBwcm94eSBvbi4gVGhlc2Ugc2hvdWxkIGJlIHNlcGFyYXRlZCB3aXRoIHRoZSB2ZXJ0aWNhbCBiYXIKKyAgICAgIGNoYXJhY3RlciA8cT58PC9xPi4gT25seSBpbiBKYXZhIDEuNCBkb2VzIEZUUCB1c2UgdGhpcworICAgICAgbGlzdC4gZS5nLiA8c2FtcD5mb3pib3QuY29ycC5zdW4uY29tfCouZW5nLnN1bi5jb208L3NhbXA+PC90ZD4KKyAgICA8dGQ+U3RyaW5nPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8IS0tIEVORCBSSUdIVCBTSURFIE1BSU4gQk9EWSAtLT4KLQorICA8dHI+CisgICAgPHRkPnByb3h5aG9zdDwvdGQ+CisgICAgPHRkPnRoZSBIVFRQL0ZUUCBwcm94eSBob3N0LiBTZXQgdGhpcyB0byA8cT48L3E+IGZvciB0aGUgSFRUUCBwcm94eSBvcHRpb24gdG8gYmUgZGlzYWJsZWQuPC90ZD4KKyAgICA8dGQ+U3RyaW5nPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnByb3h5cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5TZXQgdGhlIHBhc3N3b3JkIGZvciB0aGUgcHJveHkuIFVzZWQgb25seSBpZiB0aGUgPHZhcj5wcm94eVVzZXI8L3Zhcj4gaXMgc2V0LjwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcm94eXBvcnQ8L3RkPgorICAgIDx0ZD50aGUgSFRUUC9GVFAgcHJveHkgcG9ydCBudW1iZXI8L3RkPgorICAgIDx0ZD5pbnQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT44MDwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnByb3h5dXNlcjwvdGQ+CisgICAgPHRkPnNldCB0aGUgcHJveHkgdXNlci4gUHJvYmFibHkgcmVxdWlyZXMgYSBwYXNzd29yZCB0byBhY2NvbXBhbnkgdGhpcyBzZXR0aW5nLjwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNvY2tzcHJveHlob3N0PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBTT0NLUyBzZXJ2ZXIuIFNldCB0byA8cT48L3E+IHRvIHR1cm4gU09DS1MgcHJveHlpbmcgb2ZmLjwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zb2Nrc3Byb3h5cG9ydDwvdGQ+CisgICAgPHRkPlNldCB0aGUgUHJveHlQb3J0IGZvciBTT0NLUyBjb25uZWN0aW9ucy48L3RkPgorICAgIDx0ZD5pbnQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4xMDgwPC9xPjwvdGQ+CisgIDwvdHI+CiA8L3RhYmxlPgogCis8aDM+RXhhbXBsZXM8L2gzPgorCis8cD5EbyBub3RoaW5nPC9wPgorPHByZT4mbHQ7c2V0cHJveHkvJmd0OzwvcHJlPgorCis8cD5TZXQgdGhlIHByb3h5IHRvIDxzYW1wPmZpcmV3YWxsOjgwPC9zYW1wPjwvcD4KKzxwcmU+Jmx0O3NldHByb3h5IHByb3h5aG9zdD0iZmlyZXdhbGwiLyZndDs8L3ByZT4KKworPHA+U2V0IHRoZSBwcm94eSB0byA8c2FtcD5maXJld2FsbDo4MTwvc2FtcD48L3A+Cis8cHJlPiZsdDtzZXRwcm94eSBwcm94eWhvc3Q9ImZpcmV3YWxsIiBwcm94eXBvcnQ9IjgxIi8mZ3Q7PC9wcmU+CisKKzxwPlN0b3AgdXNpbmcgSFRUUCBwcm94eTsgZG9uJ3QgY2hhbmdlIFNPQ0tTIHNldHRpbmdzPC9wPgorPHByZT4mbHQ7c2V0cHJveHkgcHJveHlob3N0PSIiLyZndDs8L3ByZT4KKworPHA+VXNlIFNPQ0tTIHZpYSA8c2FtcD5zb2Nrc3k6MTA4MDwvc2FtcD48L3A+Cis8cHJlPiZsdDtzZXRwcm94eSBzb2Nrc3Byb3h5aG9zdD0ic29ja3N5Ii8mZ3Q7PC9wcmU+CisKKzxwPlN0b3AgdXNpbmcgdGhlIFNPQ0tTIHNlcnZlcjwvcD4KKzxwcmU+Jmx0O3NldHByb3h5IHNvY2tzcHJveHlob3N0PSIiLyZndDs8L3ByZT4KKworPHA+WW91IGNhbiBzZXQgYSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZm9yIEhUVFAgd2l0aCB0aGUgPHZhcj5wcm94eUhvc3Q8L3Zhcj4KK2FuZCA8dmFyPnByb3h5UGFzc3dvcmQ8L3Zhcj4gYXR0cmlidXRlcy4gT24gSmF2YSAxLjQgYW5kIGFib3ZlLCB0aGVzZSBjYW4gYWxzbyBiZSB1c2VkIGFnYWluc3QgU09DS1MKKzUgc2VydmVycy48L3A+CisKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zaWduamFyLmh0bWwgYi9tYW51YWwvVGFza3Mvc2lnbmphci5odG1sCmluZGV4IDg4YmRiNDMuLjI2Nzk0ZDUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zaWduamFyLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NpZ25qYXIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDMxOSArMTUsMjk4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TaWduSmFyIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InNpZ25qYXIiPlNpZ25KYXI8L2E+PC9oMj4KKzxoMiBpZD0ic2lnbmphciI+U2lnbkphcjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+U2lnbmluZyBhIGphciBhbGxvd3MgdXNlcnMgdG8gYXV0aGVudGljYXRlIHRoZSBwdWJsaXNoZXIuPC9wPgotPHA+U2lnbnMgSkFSIGZpbGVzIHdpdGggdGhlIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL3Rvb2xzL3dpbmRvd3MvamFyc2lnbmVyLmh0bWwiPjx0dD5qYXJzaWduZXI8L3R0PiBjb21tYW5kIGxpbmUgdG9vbDwvYT4uCi1JdCB3aWxsIHRha2UgYSBuYW1lZCBmaWxlIGluIHRoZSA8dHQ+amFyPC90dD4gYXR0cmlidXRlLCBhbmQgYW4gb3B0aW9uYWwKLTx0dD5kZXN0RGlyPC90dD4gb3IgPHR0PnNpZ25lZEphcjwvdHQ+IGF0dHJpYnV0ZS4gTmVzdGVkIHBhdGhzIGFyZSBhbHNvCi1zdXBwb3J0ZWQ7IGhlcmUgb25seSBhbiAob3B0aW9uYWwpIDx0dD5kZXN0RGlyPC90dD4gaXMgYWxsb3dlZC4gSWYgYSBkZXN0aW5hdGlvbgotZGlyZWN0b3J5IG9yIGV4cGxpY2l0IEpBUiBmaWxlIG5hbWUgaXMgbm90IHByb3ZpZGVkLCBKQVJzIGFyZSBzaWduZWQgaW4gcGxhY2UuCi08L3A+Ci08cD4KLURlcGVuZGVuY3kgcnVsZXMKLTwvcD4KKzxwPlNpZ25zIEpBUiBmaWxlcyB3aXRoCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXJzaWduZXIuaHRtbCIKK3RhcmdldD0iX3RvcCI+PGtiZD5qYXJzaWduZXI8L2tiZD48L2E+IGNvbW1hbmQgbGluZSB0b29sLiAgSXQgd2lsbCB0YWtlIGEgbmFtZWQgZmlsZSBpbgordGhlIDx2YXI+amFyPC92YXI+IGF0dHJpYnV0ZSwgYW5kIGFuIG9wdGlvbmFsIDx2YXI+ZGVzdERpcjwvdmFyPiBvciA8dmFyPnNpZ25lZEphcjwvdmFyPgorYXR0cmlidXRlLiBOZXN0ZWQgcGF0aHMgYXJlIGFsc28gc3VwcG9ydGVkOyBoZXJlIG9ubHkgYW4gKG9wdGlvbmFsKSA8dmFyPmRlc3REaXI8L3Zhcj4gaXMKK2FsbG93ZWQuIElmIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IG9yIGV4cGxpY2l0IEpBUiBmaWxlIG5hbWUgaXMgbm90IHByb3ZpZGVkLCBKQVJzIGFyZSBzaWduZWQgaW4KK3BsYWNlLjwvcD4KKzxwPkRlcGVuZGVuY3kgcnVsZXM8L3A+CiA8dWw+Ci08bGk+Tm9uZXhpc3RlbnQgZGVzdGluYXRpb24gSkFScyBhcmUgY3JlYXRlZC9zaWduZWQ8L2xpPgotPGxpPk91dCBvZiBkYXRlIGRlc3RpbmF0aW9uIEpBUnMgYXJlIGNyZWF0ZWQvc2lnbmVkPC9saT4KLTxsaT5JZiBhIGRlc3RpbmF0aW9uIGZpbGUgYW5kIGEgc291cmNlIGZpbGUgYXJlIHRoZSBzYW1lLAotYW5kIDx0dD5sYXp5PC90dD4gaXMgdHJ1ZSwgdGhlIEpBUiBpcyBvbmx5IHNpZ25lZCBpZiBpdCBkb2VzIG5vdAotY29udGFpbiBhIHNpZ25hdHVyZSBieSB0aGlzIGFsaWFzLjwvbGk+Ci08bGk+SWYgYSBkZXN0aW5hdGlvbiBmaWxlIGFuZCBhIHNvdXJjZSBmaWxlIGFyZSB0aGUgc2FtZSwKLWFuZCA8dHQ+bGF6eTwvdHQ+IGlzIGZhbHNlLCB0aGUgSkFSIGlzIHNpZ25lZC48L2xpPgorICA8bGk+Tm9uZXhpc3RlbnQgZGVzdGluYXRpb24gSkFScyBhcmUgY3JlYXRlZC9zaWduZWQ8L2xpPgorICA8bGk+T3V0IG9mIGRhdGUgZGVzdGluYXRpb24gSkFScyBhcmUgY3JlYXRlZC9zaWduZWQ8L2xpPgorICA8bGk+SWYgYSBkZXN0aW5hdGlvbiBmaWxlIGFuZCBhIHNvdXJjZSBmaWxlIGFyZSB0aGUgc2FtZSwgYW5kIDx2YXI+bGF6eTwvdmFyPiBpcyA8cT50cnVlPC9xPiwgdGhlCisgICAgSkFSIGlzIG9ubHkgc2lnbmVkIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gYSBzaWduYXR1cmUgYnkgdGhpcyBhbGlhcy48L2xpPgorICA8bGk+SWYgYSBkZXN0aW5hdGlvbiBmaWxlIGFuZCBhIHNvdXJjZSBmaWxlIGFyZSB0aGUgc2FtZSwgYW5kIDx2YXI+bGF6eTwvdmFyPiBpcyA8cT5mYWxzZTwvcT4sIHRoZQorICAgIEpBUiBpcyBzaWduZWQuPC9saT4KIDwvdWw+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+amFyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBqYXIgZmlsZSB0byBzaWduPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIG5lc3RlZCBwYXRocyBoYXZlCi0gICAgICBiZWVuIHVzZWQuPC90ZD4KKyAgICA8dGQ+amFyPC90ZD4KKyAgICA8dGQ+dGhlIGphciBmaWxlIHRvIHNpZ248L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBuZXN0ZWQgcGF0aHMgaGF2ZSBiZWVuIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hbGlhczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYWxpYXMgdG8gc2lnbiB1bmRlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgICA8dGQ+YWxpYXM8L3RkPgorICAgIDx0ZD50aGUgYWxpYXMgdG8gc2lnbiB1bmRlcjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0b3JlcGFzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZCBmb3Iga2V5c3RvcmUgaW50ZWdyaXR5LiBBbnQgd2lsbCBub3QgdXNlCisgICAgPHRkPnN0b3JlcGFzczwvdGQ+CisgICAgPHRkPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuIEFudCB3aWxsIG5vdCB1c2UKICAgICB0aGUgPGNvZGU+LXN0b3JlcGFzczwvY29kZT4gY29tbWFuZCBsaW5lIGFyZ3VtZW50IGJ1dCBzZW5kIHRoZQogICAgIHBhc3N3b3JkIHRvIGphcnNpZ25lciB3aGVuIGl0IHByb21wdHMgZm9yIGl0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmUgbG9jYXRpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5rZXlzdG9yZTwvdGQ+CisgICAgPHRkPmtleXN0b3JlIGxvY2F0aW9uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdG9yZXR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5c3RvcmUgdHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN0b3JldHlwZTwvdGQ+CisgICAgPHRkPmtleXN0b3JlIHR5cGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtleXBhc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+a2V5cGFzczwvdGQ+CisgICAgPHRkPnBhc3N3b3JkIGZvciBwcml2YXRlIGtleSAoaWYgZGlmZmVyZW50KTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2lnZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIC5TRi8uRFNBIGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zaWdmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiA8c2FtcD4uU0Y8L3NhbXA+LzxzYW1wPi5EU0E8L3NhbXA+IGZpbGU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNpZ25lZGphcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIHNpZ25lZCBKQVIgZmlsZS4gVGhpcyBjYW4gb25seSBiZSBzZXQgd2hlbgotICAgIHRoZSA8dHQ+amFyPC90dD4gYXR0cmlidXRlIGlzIHNldC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+c2lnbmVkamFyPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBzaWduZWQgSkFSIGZpbGUuIFRoaXMgY2FuIG9ubHkgYmUgc2V0IHdoZW4gdGhlIDx2YXI+amFyPC92YXI+IGF0dHJpYnV0ZSBpcyBzZXQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52ZXJib3NlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPih0cnVlIHwgZmFsc2UpIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIHZlcmJvc2Ugb3V0cHV0IHdoZW4gc2lnbmluZzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmljdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4odHJ1ZSB8IGZhbHNlKSBzdHJpY3QgY2hlY2tpbmcgd2hlbiBzaWduaW5nLjxici8+PGVtPnNpbmNlIEFudCAxLjkuMTwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgICAgPHRkPnN0cmljdDwvdGQ+CisgICAgPHRkPig8cT50cnVlfGZhbHNlPC9xPikgc3RyaWN0IGNoZWNraW5nIHdoZW4gc2lnbmluZy48YnIvPjxlbT5zaW5jZSBBbnQgMS45LjE8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnRlcm5hbHNmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPih0cnVlIHwgZmFsc2UpIGluY2x1ZGUgdGhlIC5TRiBmaWxlIGluc2lkZSB0aGUgc2lnbmF0dXJlCi1ibG9jazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgICAgPHRkPmludGVybmFsc2Y8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIGluY2x1ZGUgdGhlIDxzYW1wPi5TRjwvc2FtcD4gZmlsZSBpbnNpZGUgdGhlIHNpZ25hdHVyZSBibG9jazwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNlY3Rpb25zb25seTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4odHJ1ZSB8IGZhbHNlKSBkb24ndCBjb21wdXRlIGhhc2ggb2YgZW50aXJlIG1hbmlmZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGZhbHNlPC90ZD4KKyAgICA8dGQ+c2VjdGlvbnNvbmx5PC90ZD4KKyAgICA8dGQ+KDxxPnRydWV8ZmFsc2U8L3E+KSBkb24ndCBjb21wdXRlIGhhc2ggb2YgZW50aXJlIG1hbmlmZXN0PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGF6eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mbGFnIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgYSBzaWduYXR1cmUKLSAgZmlsZSBtZWFucyBhIEpBUiBpcyBzaWduZWQuIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gdGhlIHRhcmdldCBKQVIgbWF0Y2hlcwotICB0aGUgc291cmNlIEpBUjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgICAgPHRkPmxhenk8L3RkPgorICAgIDx0ZD5mbGFnIHRvIGNvbnRyb2wgd2hldGhlciB0aGUgcHJlc2VuY2Ugb2YgYSBzaWduYXR1cmUgZmlsZSBtZWFucyBhIEpBUiBpcyBzaWduZWQuIFRoaXMgaXMgb25seQorICAgICAgdXNlZCB3aGVuIHRoZSB0YXJnZXQgSkFSIG1hdGNoZXMgdGhlIHNvdXJjZSBKQVI8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1lbW9yeSB0aGUgamFyc2lnbmVyIFZNIHdpbGwgdXNlLiBTcGVjaWZpZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZSBvZiBzdGFuZGFyZCBqYXZhIG1lbW9yeSBzcGVjcyAoZS5nLiAxMjhtID0gMTI4IE1CeXRlcyk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG1heGltdW0gbWVtb3J5IHRoZSA8a2JkPmphcnNpZ25lcjwva2JkPiBKVk0gd2lsbCB1c2UuIFNwZWNpZmllZCBpbiB0aGUgc3R5bGUKKyAgICAgIG9mIHN0YW5kYXJkIEphdmEgbWVtb3J5IHNwZWNzIChlLmcuIDxxPjEyOG08L3E+ID0gMTI4IE1CeXRlcyk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkdpdmUgdGhlIHNpZ25lZCBmaWxlcyB0aGUgc2FtZSBsYXN0IG1vZGlmaWVkCi0gICAgICB0aW1lIGFzIHRoZSBvcmlnaW5hbCBqYXIgZmlsZXMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0IGZhbHNlLjwvdGQ+CisgICAgPHRkPnByZXNlcnZlbGFzdG1vZGlmaWVkPC90ZD4KKyAgICA8dGQ+R2l2ZSB0aGUgc2lnbmVkIGZpbGVzIHRoZSBzYW1lIGxhc3QgbW9kaWZpZWQgdGltZSBhcyB0aGUgb3JpZ2luYWwgamFyIGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPmZhbHNlPC9xPi48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50c2F1cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VVJMIGZvciBhIHRpbWVzdGFtcCBhdXRob3JpdHkgZm9yIHRpbWVzdGFtcGVkCi0gICAgSkFSIGZpbGVzIGluIEphdmExLjUrPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dHNhdXJsPC90ZD4KKyAgICA8dGQ+VVJMIGZvciBhIHRpbWVzdGFtcCBhdXRob3JpdHkgZm9yIHRpbWVzdGFtcGVkIEpBUiBmaWxlcyBpbiBKYXZhIDUrPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50c2FjZXJ0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFsaWFzIGluIHRoZSBrZXlzdG9yZSBmb3IgYSB0aW1lc3RhbXAgYXV0aG9yaXR5IGZvcgotICAgIHRpbWVzdGFtcGVkIEpBUiBmaWxlcyBpbiBKYXZhMS41KzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRzYWNlcnQ8L3RkPgorICAgIDx0ZD5hbGlhcyBpbiB0aGUga2V5c3RvcmUgZm9yIGEgdGltZXN0YW1wIGF1dGhvcml0eSBmb3IgdGltZXN0YW1wZWQgSkFSIGZpbGVzIGluIEphdmEgNSs8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRzYXByb3h5aG9zdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm94eSBob3N0IHRvIGJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIFRTQSBzZXJ2ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50c2Fwcm94eWhvc3Q8L3RkPgorICAgIDx0ZD5wcm94eSBob3N0IHRvIGJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIFRTQSBzZXJ2ZXI8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRzYXByb3h5cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm94eSBwb3J0IHRvIGJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIFRTQSBzZXJ2ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD50c2Fwcm94eXBvcnQ8L3RkPgorICAgIDx0ZD5wcm94eSBwb3J0IHRvIGJlIHVzZWQgd2hlbiBjb25uZWN0aW5nIHRvIFRTQSBzZXJ2ZXI8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBhIHBhcnRpY3VsYXIgPGNvZGU+amFyc2lnbmVyPC9jb2RlPiBleGVjdXRhYmxlCi0gICAgICB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgYmluYXJ5IChmb3VuZCBpbiB0aGUgc2FtZSBKREsgYXMKLSAgICAgIEFwYWNoZSBBbnQgaXMgcnVubmluZyBpbikuPGJyLz4KLSAgICAgIE11c3Qgc3VwcG9ydCB0aGUgc2FtZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyB0aGUgU3VuIEpESwotICAgICAgamFyc2lnbmVyIGNvbW1hbmQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXhlY3V0YWJsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBwYXJ0aWN1bGFyIDxrYmQ+amFyc2lnbmVyPC9rYmQ+IGV4ZWN1dGFibGUgdG8gdXNlIGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0IGJpbmFyeQorICAgICAgKGZvdW5kIGluIHRoZSBzYW1lIEpESyBhcyBBcGFjaGUgQW50IGlzIHJ1bm5pbmcgaW4pLjxici8+TXVzdCBzdXBwb3J0IHRoZSBzYW1lIGNvbW1hbmQgbGluZQorICAgICAgb3B0aW9ucyBhcyB0aGUgU3VuIEpESyA8a2JkPmphcnNpZ25lcjwva2JkPiBjb21tYW5kLiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBmb3JjZSBzaWduaW5nIG9mIHRoZSBqYXIgZmlsZSBldmVuIGlmCi0gICAgICBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgb3V0IG9mIGRhdGUgb3IgYWxyZWFkeSBzaWduZWQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IGZhbHNlPC90ZD4KKyAgICA8dGQ+Zm9yY2U8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGZvcmNlIHNpZ25pbmcgb2YgdGhlIGphciBmaWxlIGV2ZW4gaWYgaXQgZG9lc24ndCBzZWVtIHRvIGJlIG91dCBvZiBkYXRlIG9yCisgICAgICBhbHJlYWR5IHNpZ25lZC4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zaWdhbGc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiBzaWduYXR1cmUgYWxnb3JpdGhtPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2lnYWxnPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBzaWduYXR1cmUgYWxnb3JpdGhtPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaWdlc3RhbGc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiBkaWdlc3QgYWxnb3JpdGhtPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGlnZXN0YWxnPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBkaWdlc3QgYWxnb3JpdGhtPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm92aWRlcm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZSBvZiBhIGNyeXB0b2dyYXBoaWMgc2VydmljZSBwcm92aWRlcidzIG5hbWUKKyAgICA8dGQ+dHNhZGlnZXN0YWxnPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBUU0EgZGlnZXN0IGFsZ29yaXRobS4gPGVtPnNpbmNlIEFudCAxLjEwLjI8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcm92aWRlcm5hbWU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlIHByb3ZpZGVyJ3MgbmFtZQogICAgICAgd2hlbiBsaXN0ZWQgaW4gdGhlIHNlY3VyaXR5IHByb3BlcnRpZXMgZmlsZS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45LjE0PC9lbT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS4xMC42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm92aWRlcmNsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgYSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgcHJvdmlkZXIncyBtYXN0ZXIKKyAgICA8dGQ+cHJvdmlkZXJjbGFzczwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgcHJvdmlkZXIncyBtYXN0ZXIKICAgICAgIGNsYXNzIGZpbGUgd2hlbiB0aGUgc2VydmljZSBwcm92aWRlciBpcyBub3QgbGlzdGVkIGluIHRoZSBzZWN1cml0eQogICAgICAgcHJvcGVydGllcyBmaWxlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMTQ8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3ZpZGVyYXJnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJlcHJlc2VudHMgYW4gb3B0aW9uYWwgc3RyaW5nIGlucHV0IGFyZ3VtZW50IGZvcgorICAgIDx0ZD5wcm92aWRlcmFyZzwvdGQ+CisgICAgPHRkPlJlcHJlc2VudHMgYW4gb3B0aW9uYWwgc3RyaW5nIGlucHV0IGFyZ3VtZW50IGZvcgogICAgICAgdGhlIGNvbnN0cnVjdG9yIG9mIHByb3ZpZGVyX2NsYXNzX25hbWUuIElnbm9yZWQKICAgICAgIGlmIDxjb2RlPnByb3ZpZGVyY2xhc3M8L2NvZGU+IGlzIG5vdCBzZXQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8ZW0+c2luY2UgQW50IDEuMTAuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGggb2YgSkFSIGZpbGVzIHRvIHNpZ24uIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wYXRoPC90ZD4KKyAgICA8dGQ+cGF0aCBvZiBKQVIgZmlsZXMgdG8gc2lnbi4gPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc2V0IG9mIEpBUiBmaWxlcyB0byBzaWduLiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWxlc2V0PC90ZD4KKyAgICA8dGQ+ZmlsZXNldCBvZiBKQVIgZmlsZXMgdG8gc2lnbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1hcHBlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIG1hcHBlciB0byByZW5hbWUgamFyIGZpbGVzIGR1cmluZyBzaWduaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBhbmQgb25seSBvbmUgY2FuIGJlIHN1cHBsaWVkPC90ZD4KKyAgICA8dGQ+bWFwcGVyPC90ZD4KKyAgICA8dGQ+QSBtYXBwZXIgdG8gcmVuYW1lIGphciBmaWxlcyBkdXJpbmcgc2lnbmluZzwvdGQ+CisgICAgPHRkPk5vLCBhbmQgb25seSBvbmUgY2FuIGJlIHN1cHBsaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3lzcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SlZNIHN5c3RlbSBwcm9wZXJ0aWVzLCB3aXRoIHRoZSBzeW50YXggb2YgQW50Ci0gICAgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGFuZCBvbmx5IG9uZSBjYW4gYmUgc3VwcGxpZWQ8L3RkPgorICAgIDx0ZD5zeXNwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPkpWTSBzeXN0ZW0gcHJvcGVydGllcywgd2l0aCB0aGUgc3ludGF4IG9mIEFudCA8YSBocmVmPSJleGVjLmh0bWwjZW52Ij5lbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzPC9hPjwvdGQ+CisgICAgPHRkPk5vLCBhbmQgb25seSBvbmUgY2FuIGJlIHN1cHBsaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVzZSB0aGlzIHRvIHNwZWNpZnkgYSA8Y29kZT5rZXl0b29sPC9jb2RlPgorICAgIDx0ZD5hcmc8L3RkPgorICAgIDx0ZD5Vc2UgdGhpcyB0byBzcGVjaWZ5IGEgPGtiZD5rZXl0b29sPC9rYmQ+CiAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPmNvbW1hbmQgbGluZSBhcmd1bWVudDwvYT4gbm90CiAgICAgZXhwbGljaXRseSBzdXBwb3J0ZWQgdmlhIGFuIGF0dHJpYnV0ZS4KLSAgICA8ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoMz5FeGFtcGxlczwvaDM+Ci08cD5Gb3IgaW5zdHJ1Y3Rpb25zIG9uIGdlbmVyYXRpbmcgYSBjb2RlIHNpZ25pbmcgY2VydGlmaWNhdGUsIHNlZSB0aGUgPGEgdGFyZ2V0PSJfYmxhbmsiIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9rZXl0b29sLmh0bWwiPmtleXRvb2wgZG9jdW1lbnRhdGlvbjwvYT4gYW5kL29yIGluc3RydWN0aW9ucyBmcm9tIHlvdXIgY2VydGlmaWNhdGUgYXV0aG9yaXR5LjwvcD4KLSAgPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtzaWduamFyIGphcj0mcXVvdDske2Rpc3R9L2xpYi9hbnQuamFyJnF1b3Q7Ci1hbGlhcz0mcXVvdDthcGFjaGUtZ3JvdXAmcXVvdDsgc3RvcmVwYXNzPSZxdW90O3NlY3JldCZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLSAgc2lnbnMgdGhlIGFudC5qYXIgd2l0aCBhbGlhcyAmcXVvdDthcGFjaGUtZ3JvdXAmcXVvdDsgYWNjZXNzaW5nIHRoZQotICBrZXlzdG9yZSBhbmQgcHJpdmF0ZSBrZXkgdmlhICZxdW90O3NlY3JldCZxdW90OyBwYXNzd29yZC4KLTwvcD4KLSAgPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtzaWduamFyIGRlc3REaXI9InNpZ25lZCIKLSAgICBhbGlhcz0idGVzdG9ubHkiIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiCi0gICAgc3RvcmVwYXNzPSJhcGFjaGVhbnQiCi0gICAgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiJmd0OwotICAmbHQ7cGF0aCZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIgLyZndDsKLSAgJmx0Oy9wYXRoJmd0OwotICAmbHQ7ZmxhdHRlbm1hcHBlciAvJmd0OwotJmx0Oy9zaWduamFyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci1TaWduIGFsbCBKQVIgZmlsZXMgbWF0Y2hpbmcgdGhlIGRpc3QvKiovKi5qYXIgcGF0dGVybiwgY29weWluZyB0aGVtIHRvIHRoZQotZGlyZWN0b3J5ICJzaWduZWQiIGFmdGVyd2FyZHMuIFRoZSBmbGF0dGVuIG1hcHBlciBtZWFucyB0aGF0IHRoZXkgd2lsbAotYWxsIGJlIGNvcGllZCB0byB0aGlzIGRpcmVjdG9yeSwgbm90IHRvIHN1YmRpcmVjdG9yaWVzLgorPHA+Rm9yIGluc3RydWN0aW9ucyBvbiBnZW5lcmF0aW5nIGEgY29kZSBzaWduaW5nIGNlcnRpZmljYXRlLCBzZWUKK3RoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy90b29scy93aW5kb3dzL2tleXRvb2wuaHRtbCIKK3RhcmdldD0iX3RvcCI+a2V5dG9vbCBkb2N1bWVudGF0aW9uPC9hPiBhbmQvb3IgaW5zdHJ1Y3Rpb25zIGZyb20geW91ciBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkuPC9wPgogCi08L3A+Ci0gIDxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7c2lnbmphcgotICAgIGFsaWFzPSJ0ZXN0b25seSIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKLSAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIKLSAgICBsYXp5PSJ0cnVlIgotICAgICZndDsKKzxwPlNpZ24gdGhlIDxzYW1wPmFudC5qYXI8L3NhbXA+IHdpdGggYWxpYXMgPHE+YXBhY2hlLWdyb3VwPC9xPiBhY2Nlc3NpbmcgdGhlIGtleXN0b3JlIGFuZCBwcml2YXRlCitrZXkgdmlhIDxxPnNlY3JldDwvcT4gcGFzc3dvcmQuPC9wPgorPHByZT4KKyZsdDtzaWduamFyIGphcj0mcXVvdDske2Rpc3R9L2xpYi9hbnQuamFyJnF1b3Q7CisgICAgICAgICBhbGlhcz0mcXVvdDthcGFjaGUtZ3JvdXAmcXVvdDsgc3RvcmVwYXNzPSZxdW90O3NlY3JldCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlNpZ24gYWxsIEpBUiBmaWxlcyBtYXRjaGluZyB0aGUgPHNhbXA+ZGlzdC8qKi8qLmphcjwvc2FtcD4gcGF0dGVybiwgY29weWluZyB0aGVtIHRvIHRoZQorZGlyZWN0b3J5IDxzYW1wPnNpZ25lZDwvc2FtcD4gYWZ0ZXJ3YXJkcy4gVGhlIGZsYXR0ZW4gbWFwcGVyIG1lYW5zIHRoYXQgdGhleSB3aWxsIGFsbCBiZSBjb3BpZWQgdG8KK3RoaXMgZGlyZWN0b3J5LCBub3QgdG8gc3ViZGlyZWN0b3JpZXMuPC9wPgorPHByZT4KKyZsdDtzaWduamFyIGRlc3REaXI9InNpZ25lZCIKKyAgICAgICAgIGFsaWFzPSJ0ZXN0b25seSIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKKyAgICAgICAgIHN0b3JlcGFzcz0iYXBhY2hlYW50IgorICAgICAgICAgcHJlc2VydmVsYXN0bW9kaWZpZWQ9InRydWUiJmd0OwogICAmbHQ7cGF0aCZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIgLyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OwogICAmbHQ7L3BhdGgmZ3Q7Ci0mbHQ7L3NpZ25qYXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpZ24gYWxsIHRoZSBKQVIgZmlsZXMgaW4gZGlzdC8qKi8qLmphciA8aT5pbi1zaXR1PC9pPi4gTGF6eSBzaWduaW5nIGlzIHVzZWQsCi1zbyB0aGUgZmlsZXMgd2lsbCBvbmx5IGJlIHNpZ25lZCBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzaWduZWQuCi08L3A+Ci0gIDxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7c2lnbmphcgotICAgIGFsaWFzPSJ0ZXN0b25seSIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKLSAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIKLSAgICBzaWdhbGc9Ik1ENXdpdGhSU0EiCi0gICAgZGlnZXN0YWxnPSJTSEExIiZndDsKKyAgJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OworJmx0Oy9zaWduamFyJmd0OzwvcHJlPgorCis8cD5TaWduIGFsbCB0aGUgSkFSIGZpbGVzIGluIDxzYW1wPmRpc3QvKiovKi5qYXI8L3NhbXA+IDxlbT5pbi1zaXR1PC9lbT4uIExhenkgc2lnbmluZyBpcyB1c2VkLCBzbwordGhlIGZpbGVzIHdpbGwgb25seSBiZSBzaWduZWQgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgc2lnbmVkLjwvcD4KKzxwcmU+CismbHQ7c2lnbmphciBhbGlhcz0idGVzdG9ubHkiIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiCisgICAgICAgICBzdG9yZXBhc3M9ImFwYWNoZWFudCIKKyAgICAgICAgIGxhenk9InRydWUiJmd0OwogICAmbHQ7cGF0aCZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIgLyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OwogICAmbHQ7L3BhdGgmZ3Q7Ci0mbHQ7L3NpZ25qYXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD4KLVNpZ24gYWxsIHRoZSBKQVIgZmlsZXMgaW4gZGlzdC8qKi8qLmphciB1c2luZyB0aGUgZGlnZXN0IGFsZ29yaXRobSBTSEExIGFuZCB0aGUKLXNpZ25hdHVyZSBhbGdvcml0aG0gTUQ1d2l0aFJTQS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHVzZQotdGhlIEpESyA3IGphcnNpZ25lciAod2hpY2ggdXNlcyBTSEEyNTYgYW5kIFNIQTI1NndpdGhSU0EgYXMgZGVmYXVsdCkgdG8gY3JlYXRlCi1zaWduZWQgamFycyB0aGF0IHdpbGwgYmUgZGVwbG95ZWQgb24gcGxhdGZvcm1zIG5vdCBzdXBwb3J0aW5nIFNIQTI1NiBhbmQKLVNIQTI1NndpdGhSU0EuCi08L3A+CismbHQ7L3NpZ25qYXImZ3Q7PC9wcmU+CisKKzxwPlNpZ24gYWxsIHRoZSBKQVIgZmlsZXMgaW4gPHNhbXA+ZGlzdC8qKi8qLmphcjwvc2FtcD4gdXNpbmcgdGhlIGRpZ2VzdCBhbGdvcml0aG0gU0hBMSBhbmQgdGhlCitzaWduYXR1cmUgYWxnb3JpdGhtIE1ENXdpdGhSU0EuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byB1c2UgdGhlIEpESworNyA8a2JkPmphcnNpZ25lcjwva2JkPiAod2hpY2ggdXNlcyBTSEEyNTYgYW5kIFNIQTI1NndpdGhSU0EgYXMgZGVmYXVsdCkgdG8gY3JlYXRlIHNpZ25lZCBqYXJzIHRoYXQKK3dpbGwgYmUgZGVwbG95ZWQgb24gcGxhdGZvcm1zIG5vdCBzdXBwb3J0aW5nIFNIQTI1NiBhbmQgU0hBMjU2d2l0aFJTQS48L3A+Cis8cHJlPgorJmx0O3NpZ25qYXIgYWxpYXM9InRlc3Rvbmx5IiBrZXlzdG9yZT0idGVzdGtleXN0b3JlIgorICAgICAgICAgc3RvcmVwYXNzPSJhcGFjaGVhbnQiCisgICAgICAgICBzaWdhbGc9Ik1ENXdpdGhSU0EiCisgICAgICAgICBkaWdlc3RhbGc9IlNIQTEiJmd0OworICAmbHQ7cGF0aCZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9ImRpc3QiIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OworICAmbHQ7L3BhdGgmZ3Q7CismbHQ7L3NpZ25qYXImZ3Q7PC9wcmU+CisKIDxoMz5BYm91dCB0aW1lc3RhbXAgc2lnbmluZzwvaDM+CiAKLTxwPlRpbWVzdGFtcHMgcmVjb3JkIHRoZSBkYXRlIGFuZCB0aW1lIHRoYXQgYSBzaWduYXR1cmUgdG9vayBwbGFjZSwgYWxsb3dpbmcgdGhlIHNpZ25hdHVyZSB0byBiZSB2ZXJpZmllZCBhcyBvZiB0aGF0IHBvaW50IGluIHRpbWUuCi1XaXRoIHRydXN0ZWQgdGltZXN0YW1waW5nLCB1c2VycyBjYW4gdmVyaWZ5IHRoYXQgc2lnbmluZyBvY2N1cnJlZCBiZWZvcmUgYSBjZXJ0aWZpY2F0ZSdzIGV4cGlyYXRpb24gb3IgcmV2b2NhdGlvbi4gV2l0aG91dCB0aGlzIHRpbWVzdGFtcCwgdXNlcnMgY2FuIG9ubHkgdmVyaWZ5IHRoZSBzaWduYXR1cmUgYXMgb2YgdGhlaXIgY3VycmVudCBkYXRlLjwvcD4KKzxwPlRpbWVzdGFtcHMgcmVjb3JkIHRoZSBkYXRlIGFuZCB0aW1lIHRoYXQgYSBzaWduYXR1cmUgdG9vayBwbGFjZSwgYWxsb3dpbmcgdGhlIHNpZ25hdHVyZSB0byBiZQordmVyaWZpZWQgYXMgb2YgdGhhdCBwb2ludCBpbiB0aW1lLiAgV2l0aCB0cnVzdGVkIHRpbWVzdGFtcGluZywgdXNlcnMgY2FuIHZlcmlmeSB0aGF0IHNpZ25pbmcKK29jY3VycmVkIGJlZm9yZSBhIGNlcnRpZmljYXRlJ3MgZXhwaXJhdGlvbiBvciByZXZvY2F0aW9uLiBXaXRob3V0IHRoaXMgdGltZXN0YW1wLCB1c2VycyBjYW4gb25seQordmVyaWZ5IHRoZSBzaWduYXR1cmUgYXMgb2YgdGhlaXIgY3VycmVudCBkYXRlLjwvcD4KIAotPHA+Ci1UaW1lc3RhbXBlZCBKQVIgZmlsZXMgd2VyZSBpbnRyb2R1Y2VkIGluIEphdmExLjUgYW5kIHN1cHBvcnRlZCBpbiBBbnQgc2luY2UKLUFudCAxLjcuIFNpbmNlIEFudCAxLjkuNSwgQW50IGNhbiB1c2UgdW5hdXRoZW50aWNhdGVkIHByb3hpZXMgZm9yIHRoaXMgc2lnbmluZyBwcm9jZXNzLgotPC9wPgorPHA+VGltZXN0YW1wZWQgSkFSIGZpbGVzIHdlcmUgaW50cm9kdWNlZCBpbiBKYXZhIDU7IHRoZXkgYXJlIHN1cHBvcnRlZCA8ZW0+c2luY2UgQW50CisxLjc8L2VtPi4gVW5hdXRoZW50aWNhdGVkIHByb3hpZXMgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIFRTQXMgPGVtPnNpbmNlIEFudCAxLjkuNTwvZW0+LjwvcD4KIAotPHA+Q29tbW9uIHB1YmxpYyB0aW1lc3RhbXAgYXV0aG9yaXRpZXMgaW5jbHVkZQotICA8dWw+Ci0gICAgPGxpPmh0dHA6Ly90aW1lc3RhbXAudmVyaXNpZ24uY29tPC9saT4KLQk8bGk+aHR0cDovL3RzYS5zdGFyZmllbGR0ZWNoLmNvbTwvbGk+Ci0JPGxpPmh0dHBzOi8vdGltZXN0YW1wLmdlb3RydXN0LmNvbS90c2E8L2xpPgotCTxsaT5PdGhlcnMgKHNlZSB5b3VyIGNlcnRpZmljYXRlIGF1dGhvcml0eSk8L2xpPgotICA8L3VsPjwvcD4KKzxwPkNvbW1vbiBwdWJsaWMgdGltZXN0YW1wIGF1dGhvcml0aWVzIGluY2x1ZGU8L3A+Cis8dWw+CisgIDxsaT5odHRwOi8vdGltZXN0YW1wLnZlcmlzaWduLmNvbTwvbGk+CisgIDxsaT5odHRwOi8vdHNhLnN0YXJmaWVsZHRlY2guY29tPC9saT4KKyAgPGxpPmh0dHBzOi8vdGltZXN0YW1wLmdlb3RydXN0LmNvbS90c2E8L2xpPgorICA8bGk+T3RoZXJzIChzZWUgeW91ciBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkpPC9saT4KKzwvdWw+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3NsZWVwLmh0bWwgYi9tYW51YWwvVGFza3Mvc2xlZXAuaHRtbAppbmRleCA4MDgyN2I1Li45YjhiOTk1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc2xlZXAuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvc2xlZXAuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgpAQCAtMjMsNjMgKzI0LDYxIEBACiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ic2xlZXAiPlNsZWVwPC9hPjwvaDI+Cis8aDIgaWQ9InNsZWVwIj5TbGVlcDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+IEEgdGFzayBmb3Igc2xlZXBpbmcgYSBzaG9ydCBwZXJpb2Qgb2YgdGltZSwgdXNlZnVsIHdoZW4gYSBidWlsZCBvciBkZXBsb3ltZW50IAotICBwcm9jZXNzIHJlcXVpcmVzIGFuIGludGVydmFsIGJldHdlZW4gdGFza3MuPC9wPgorPHA+QSB0YXNrIGZvciBzbGVlcGluZyBhIHNob3J0IHBlcmlvZCBvZiB0aW1lLCB1c2VmdWwgd2hlbiBhIGJ1aWxkIG9yIGRlcGxveW1lbnQgcHJvY2VzcyByZXF1aXJlcyBhbgoraW50ZXJ2YWwgYmV0d2VlbiB0YXNrcy48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0cj4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KLSAgPHRyPiAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPmhvdXJzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmhvdXJzIHRvIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+aG91cnM8L3RkPgorICAgIDx0ZD5ob3VycyB0byB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5taW51dGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPiBtaW51dGVzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+bWludXRlczwvdGQ+CisgICAgPHRkPm1pbnV0ZXMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8dHI+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+c2Vjb25kczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZWNvbmRzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+c2Vjb25kczwvdGQ+CisgICAgPHRkPnNlY29uZHMgdG8gYWRkIHRvIHRoZSBzbGVlcCB0aW1lPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotICA8dHI+IAotICAgIDx0ZCB2YWxpZ249InRvcCI+bWlsbGlzZWNvbmRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8dHI+CisgICAgPHRkPm1pbGxpc2Vjb25kczwvdGQ+CisgICAgPHRkPm1pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWU8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4gCi0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgdG8gYnJlYWsgdGhlIGJ1aWxkIG9uIGFuIGVycm9yLiAKLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICA8dHI+CisgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KKyAgICA8dGQ+ZmxhZyBjb250cm9sbGluZyB3aGV0aGVyIHRvIGJyZWFrIHRoZSBidWlsZCBvbiBhbiBlcnJvcjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD5UaGUgc2xlZXAgdGltZSBpcyB0aGUgc3VtIG9mIHNwZWNpZmllZCB2YWx1ZXMsIGhvdXJzLCBtaW51dGVzIHNlY29uZHMgYW5kIG1pbGxpc2Vjb25kcy4gCi0gIEEgbmVnYXRpdmUgdmFsdWUgY2FuIGJlIHN1cHBsaWVkIHRvIGFueSBvZiB0aGVtIHByb3ZpZGVkIHRoZSB0b3RhbCBzbGVlcCB0aW1lIAotICBpcyBwb3NpdGl2ZTwvcD4KLTxwPk5vdGUgdGhhdCBzbGVlcCB0aW1lcyBhcmUgYWx3YXlzIGhpbnRzIHRvIGJlIGludGVycHJlZCBieSB0aGUgT1MgaG93IGl0IGZlZWxzIAotICAtIHNtYWxsIHRpbWVzIG1heSBlaXRoZXIgYmUgaWdub3JlZCBvciByb3VuZGVkIHVwIHRvIGEgbWluaW11bSB0aW1lc2xpY2UuIE5vdGUgCi0gIGFsc28gdGhhdCB0aGUgc3lzdGVtIGNsb2NrcyBvZnRlbiBoYXZlIGEgZmFpcmx5IGxvdyBncmFudWxhcml0eSB0b28sIHdoaWNoIGNvbXBsaWNhdGVzIAotICBtZWFzdXJpbmcgaG93IGxvbmcgYSBzbGVlcCBhY3R1YWxseSB0b29rLjwvcD4KKzxwPlRoZSBzbGVlcCB0aW1lIGlzIHRoZSBzdW0gb2Ygc3BlY2lmaWVkIHZhbHVlcywgaG91cnMsIG1pbnV0ZXMgc2Vjb25kcyBhbmQgbWlsbGlzZWNvbmRzLiAgQQorbmVnYXRpdmUgdmFsdWUgY2FuIGJlIHN1cHBsaWVkIHRvIGFueSBvZiB0aGVtIHByb3ZpZGVkIHRoZSB0b3RhbCBzbGVlcCB0aW1lIGlzIHBvc2l0aXZlPC9wPgorPHA+Tm90ZSB0aGF0IHNsZWVwIHRpbWVzIGFyZSBhbHdheXMgaGludHMgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIE9TIGhvdyBpdCBmZWVscyZtZGFzaDtzbWFsbCB0aW1lcworbWF5IGVpdGhlciBiZSBpZ25vcmVkIG9yIHJvdW5kZWQgdXAgdG8gYSBtaW5pbXVtIHRpbWVzbGljZS4gTm90ZSBhbHNvIHRoYXQgdGhlIHN5c3RlbSBjbG9ja3Mgb2Z0ZW4KK2hhdmUgYSBmYWlybHkgbG93IGdyYW51bGFyaXR5IHRvbywgd2hpY2ggY29tcGxpY2F0ZXMgbWVhc3VyaW5nIGhvdyBsb25nIGEgc2xlZXAgYWN0dWFsbHkgdG9vay48L3A+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICAmbHQ7c2xlZXAgbWlsbGlzZWNvbmRzPSZxdW90OzEwJnF1b3Q7LyZndDs8L3ByZT4KLVNsZWVwIGZvciBhYm91dCAxMCBtUy4gCi08cHJlPiAgICZsdDtzbGVlcCBzZWNvbmRzPSZxdW90OzImcXVvdDsvJmd0OzwvcHJlPgotU2xlZXAgZm9yIGFib3V0IDIgc2Vjb25kcy4gCi08cHJlPiAgICZsdDtzbGVlcCBob3Vycz0mcXVvdDsxJnF1b3Q7IG1pbnV0ZXM9JnF1b3Q7LTU5JnF1b3Q7IHNlY29uZHM9JnF1b3Q7LTU4JnF1b3Q7LyZndDs8L3ByZT4KLTxwPlNsZWVwIGZvciBvbmUgaG91ciBsZXNzIDU5OjU4LCBvciB0d28gc2Vjb25kcyBhZ2FpbiA8L3A+Ci08cHJlPiAgICZsdDtzbGVlcC8mZ3Q7PC9wcmU+Ci1TbGVlcCBmb3Igbm8gdGltZSBhdCBhbGwuIFRoaXMgbWF5IHlpZWxkIHRoZSBDUFUgdGltZSB0byBhbm90aGVyIHRocmVhZCBvciBwcm9jZXNzLiAKKzxwPlNsZWVwIGZvciBhYm91dCAxMCBtcy48L3A+Cis8cHJlPiZsdDtzbGVlcCBtaWxsaXNlY29uZHM9JnF1b3Q7MTAmcXVvdDsvJmd0OzwvcHJlPgogCis8cD5TbGVlcCBmb3IgYWJvdXQgMiBzZWNvbmRzLjwvcD4KKzxwcmU+Jmx0O3NsZWVwIHNlY29uZHM9JnF1b3Q7MiZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlNsZWVwIGZvciBvbmUgaG91ciBsZXNzIDU5OjU4LCBvciB0d28gc2Vjb25kcyBhZ2Fpbi48L3A+Cis8cHJlPiZsdDtzbGVlcCBob3Vycz0mcXVvdDsxJnF1b3Q7IG1pbnV0ZXM9JnF1b3Q7LTU5JnF1b3Q7IHNlY29uZHM9JnF1b3Q7LTU4JnF1b3Q7LyZndDs8L3ByZT4KKworPHA+U2xlZXAgZm9yIG5vIHRpbWUgYXQgYWxsLiBUaGlzIG1heSB5aWVsZCB0aGUgQ1BVIHRpbWUgdG8gYW5vdGhlciB0aHJlYWQgb3IgcHJvY2Vzcy48L3A+Cis8cHJlPiZsdDtzbGVlcC8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3Nvcy5odG1sIGIvbWFudWFsL1Rhc2tzL3Nvcy5odG1sCmluZGV4IGMwNjgyNjMuLjQ1MzA1ZTQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zb3MuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvc29zLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxODIgKzE1LDE3MSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLQotICA8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KLTx0aXRsZT5TT1MgVGFza3M8L3RpdGxlPgotCisgIDx0aXRsZT5TT1MgVGFza3M8L3RpdGxlPgogPC9oZWFkPgogPGJvZHk+CiAKLTxkaXYgYWxpZ249ImNlbnRlciI+CiA8aDE+U291cmNlT2ZmU2l0ZSBUYXNrcyBVc2VyIE1hbnVhbDwvaDE+Ci0KLTxkaXYgYWxpZ249ImxlZnQiPmJ5Cis8cD5ieTwvcD4KIDx1bD4KLTxsaT48YSBocmVmPSJtYWlsdG86amVzc2VAY3J5cHRvY2FyZC5jb20iPkplc3NlIFN0b2NrYWxsPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJtYWlsdG86amVzc2VAY3J5cHRvY2FyZC5jb20iPkplc3NlIFN0b2NrYWxsPC9hPjwvbGk+CiA8L3VsPgotVmVyc2lvbiAxLjEgMjAwMi8wMS8yMwotPGJyPgotPGJyPgorPHA+VmVyc2lvbiAxLjEgMjAwMi8wMS8yMzwvcD4KIAotPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KKzxoci8+CiA8aDI+Q29udGVudHM8L2gyPgogCiA8dWw+Ci0gICAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiN0YXNrcyI+VGhlIFRhc2tzPC9hPjwvbGk+Ci0KKyAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjdGFza3MiPlRoZSBUYXNrczwvYT48L2xpPgogPC91bD4KLTxicj4KIAotPGgyPjxhIG5hbWU9ImludHJvIj5JbnRyb2R1Y3Rpb248L2E+IDwvaDI+Cis8aDIgaWQ9ImludHJvIj5JbnRyb2R1Y3Rpb248L2gyPgogCi08cD5UaGVzZSB0YXNrcyBwcm92aWRlIGFuIGludGVyZmFjZSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9zc2FmZS9kZWZhdWx0LmFzcCIgdGFyZ2V0PSJfdG9wIj4KLU1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZTwvYT4gU0NNIHZpYSA8YSBocmVmPSJodHRwOi8vd3d3LnNvdXJjZWdlYXIuY29tIj4KLVNvdXJjZUdlYXInczwvYT4gPGEgaHJlZj0iaHR0cDovL3NvdXJjZWdlYXIuY29tL3Nvcy9pbmRleC5odG0iPlNvdXJjZU9mZlNpdGU8L2E+Ci1wcm9kdWN0LiBTb3VyY2VPZmZTaXRlIGlzIGFuIGFkZC1vbiB0byBNaWNyb3NvZnQncyBWU1MsIHRoYXQgYWxsb3dzIHJlbW90ZQotZGV2ZWxvcG1lbnQgdGVhbXMgYW5kIHRlbGUtY29tbXV0ZXJzIHRoYXQgbmVlZCBmYXN0IGFuZCBzZWN1cmUgcmVhZC93cml0ZQotYWNjZXNzIHRvIGEgY2VudHJhbGl6ZWQgU291cmNlU2FmZSBkYXRhYmFzZSB2aWEgYW55IFRDUC9JUCBjb25uZWN0aW9uLiBTT1MKLXByb3ZpZGVzIExpbnV4ICxTb2xhcmlzICZhbXA7IFdpbmRvd3MgY2xpZW50cy4gVGhlCi08Y29kZT4gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zPC9jb2RlPgotcGFja2FnZSBjb25zaXN0cyAgb2YgYSBzaW1wbGUgZnJhbWV3b3JrIHRvIHN1cHBvcnQgU09TIGZ1bmN0aW9uYWxpdHkgYXMgd2VsbAotYXMgc29tZSBBcGFjaGUgQW50IHRhc2tzICBlbmNhcHN1bGF0aW5nIGZyZXF1ZW50bHkgdXNlZCBTT1MgY29tbWFuZHMuICBBbHRob3VnaCBpdAotaXMgcG9zc2libGUgdG8gdXNlICB0aGVzZSBjb21tYW5kcyBvbiB0aGUgZGVza3RvcCwgIHRoZXkgd2VyZSBwcmltYXJpbHkgaW50ZW5kZWQKLXRvIGJlIHVzZWQgYnkgIGF1dG9tYXRlZCBidWlsZCBzeXN0ZW1zLiBUaGVzZSB0YXNrcyBoYXZlIGJlZW4gdGVzdGVkIHdpdGgKLVNvdXJjZU9mZlNpdGUgIHZlcnNpb24gMy41LjEgY29ubmVjdGluZyB0byBWaXN1YWxTb3VyY2VTYWZlIDYuMC4gVGhlIHRhc2tzCi1oYXZlIGJlZW4gdGVzdGVkIHdpdGggTGludXgsIFNvbGFyaXMgJmFtcDsgV2luZG93czIwMDAuPC9wPgorPHA+VGhlc2UgdGFza3MgcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8KK3RoZSA8YSBocmVmPSJodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzNoMDU0NGt4KHY9dnMuODApLmFzcHgiCit0YXJnZXQ9Il90b3AiPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZTwvYT4gU0NNIHZpYSA8YSBocmVmPSJodHRwczovL3NvdXJjZWdlYXIuY29tIgordGFyZ2V0PSJfdG9wIj5Tb3VyY2VHZWFyJ3M8L2E+IDxhIGhyZWY9Imh0dHBzOi8vc291cmNlZ2Vhci5jb20vc29zLyIgdGFyZ2V0PSJfdG9wIj5Tb3VyY2VPZmZTaXRlPC9hPgorcHJvZHVjdC4gU291cmNlT2ZmU2l0ZSBpcyBhbiBhZGQtb24gdG8gTWljcm9zb2Z0J3MgVlNTLCB0aGF0IGFsbG93cyByZW1vdGUgZGV2ZWxvcG1lbnQgdGVhbXMgYW5kCit0ZWxlLWNvbW11dGVycyB0aGF0IG5lZWQgZmFzdCBhbmQgc2VjdXJlIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgY2VudHJhbGl6ZWQgU291cmNlU2FmZSBkYXRhYmFzZSB2aWEKK2FueSBUQ1AvSVAgY29ubmVjdGlvbi4gU09TIHByb3ZpZGVzIExpbnV4LCBTb2xhcmlzICZhbXA7IFdpbmRvd3MKK2NsaWVudHMuIFRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zPC9jb2RlPiBwYWNrYWdlIGNvbnNpc3RzCitvZiBhIHNpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydCBTT1MgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsIGFzIHNvbWUgQXBhY2hlIEFudCB0YXNrcyBlbmNhcHN1bGF0aW5nCitmcmVxdWVudGx5IHVzZWQgU09TIGNvbW1hbmRzLiAgQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZXNlIGNvbW1hbmRzIG9uIHRoZSBkZXNrdG9wLCB0aGV5Cit3ZXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGF1dG9tYXRlZCBidWlsZCBzeXN0ZW1zLiBUaGVzZSB0YXNrcyBoYXZlIGJlZW4gdGVzdGVkIHdpdGgKK1NvdXJjZU9mZlNpdGUgdmVyc2lvbiAzLjUuMSBjb25uZWN0aW5nIHRvIFZpc3VhbFNvdXJjZVNhZmUgNi4wLiBUaGUgdGFza3MgaGF2ZSBiZWVuIHRlc3RlZCB3aXRoCitMaW51eCwgU29sYXJpcyAmYW1wOyBXaW5kb3dzIDIwMDAuPC9wPgogCi08aDI+PGEgbmFtZT0idGFza3MiPlRoZSBUYXNrczwvYT4gPC9oMj4KKzxoMiBpZD0idGFza3MiPlRoZSBUYXNrczwvaDI+CiAKLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+Ci0gICAgICAgPHRib2R5PgotICAgICAgICAgPHRyPgotICAgICAgICAgICA8dGQ+PGEgaHJlZj0iI1NPU0dldCI+c29zZ2V0PC9hPjwvdGQ+Ci0gICAgICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZS48L3RkPgotICAgICAgICAgPC90cj4KLSAgICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPjxhIGhyZWY9IiNTT1NMYWJlbCI+c29zbGFiZWw8L2E+PC90ZD4KLSAgICAgICAgICAgPHRkPkFzc2lnbnMgYSBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIHByb2plY3QuPC90ZD4KLSAgICAgICAgIDwvdHI+Ci0gICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD48YSBocmVmPSIjU09TQ2hlY2tJbiI+c29zY2hlY2tpbjwvYT48L3RkPgotICAgICAgICAgICA8dGQ+VXBkYXRlcyBWU1Mgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gYSBjaGVja2VkIG91dCBmaWxlIG9yIHByb2plY3QsCi0gICAgICAgICAgIGFuZCB1bmxvY2tzIHRoZSBWU1MgbWFzdGVyIGNvcHkuPC90ZD4KLSAgICAgICAgIDwvdHI+Ci0gICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD48YSBocmVmPSIjU09TQ2hlY2tPdXQiPnNvc2NoZWNrb3V0PC9hPjwvdGQ+Ci0gICAgICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLXdyaXRlIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0gICAgICAgICAgIG9yIGZpbGUsIGxvY2tpbmcgdGhlJm5ic3A7VlNTIG1hc3RlciBjb3B5PC90ZD4KLSAgICAgICAgIDwvdHI+Ci0KKzx0YWJsZT4KKyAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSIjU09TR2V0Ij5zb3NnZXQ8L2E+PC90ZD4KKyAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLW9ubHkgY29weSBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3Qgb3IgZmlsZS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9IiNTT1NMYWJlbCI+c29zbGFiZWw8L2E+PC90ZD4KKyAgICAgIDx0ZD5Bc3NpZ25zIGEgbGFiZWwgdG8gdGhlIHNwZWNpZmllZCBwcm9qZWN0LjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iI1NPU0NoZWNrSW4iPnNvc2NoZWNraW48L2E+PC90ZD4KKyAgICAgIDx0ZD5VcGRhdGVzIFZTUyB3aXRoIGNoYW5nZXMgbWFkZSB0byBhIGNoZWNrZWQgb3V0IGZpbGUgb3IgcHJvamVjdCwKKyAgICAgICAgYW5kIHVubG9ja3MgdGhlIFZTUyBtYXN0ZXIgY29weS48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPjxhIGhyZWY9IiNTT1NDaGVja091dCI+c29zY2hlY2tvdXQ8L2E+PC90ZD4KKyAgICAgIDx0ZD5SZXRyaWV2ZXMgYSByZWFkLXdyaXRlIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0IG9yIGZpbGUsIGxvY2tpbmcgdGhlIFZTUyBtYXN0ZXIKKyAgICAgICAgY29weTwvdGQ+CisgICAgPC90cj4KICAgPC90Ym9keT4KIDwvdGFibGU+Ci0gICAgIDxicj4KLQotPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KKzxoci8+CiA8aDI+VGFzayBEZXNjcmlwdGlvbnM8L2gyPgogCi08aDI+PGEgbmFtZT0iU09TR2V0Ij48L2E+U09TR2V0PGJyPgotICAgICA8L2gyPgorPGgyIGlkPSJTT1NHZXQiPlNPU0dldDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotICAgICAgICAgICAgIFRhc2sgdG8gcGVyZm9ybSBHRVQgY29tbWFuZHMgd2l0aCBTT1M8YnI+Cis8cD5UYXNrIHRvIHBlcmZvcm0gPHZhcj5HZXQ8L3Zhcj4gY29tbWFuZHMgd2l0aCBTT1M8L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci0gICAgIDwvZGl2PgotICAgICA8L2Rpdj4KIAotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgIDx0Ym9keT4KLSAgICAgICA8dHI+Ci0gICAgICAgICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgICAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgICAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZD5zb3NjbWQ8L3RkPgotICAgICAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29zY21kKC5leGUpIDxicj4KLSAgICAgICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgotICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgotICAgICAgICAgICA8dGQ+cGF0aCB0byB0aGUgc3Jjc2FmZS5pbmkgIC0gZWcuIFxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgICAgICAgPHRkPmFkZHJlc3MgJmFtcDsgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+Ci0gICAgICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCAtIGVnLiAkL1NvdXJjZVJvb3QvUHJvamVjdDE8L3RkPgotICAgICAgICAgICA8dGQ+WWVzPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICAgICAgIDx0ZD5GaWxlbmFtZSB0byBhY3QgdXBvbjxicj4KLSAgICAgICAgICAgSWYgbm8gZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiBhY3QgdXBvbiB0aGUgcHJvamVjdDwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KLSAgICAgICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgotICAgICAgICAgICA8dGQ+WWVzPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgotICAgICAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gICAgICAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgotICAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD5zb3Nob21lPC90ZD4KLSAgICAgICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KLSAgICAgICAgICAgPHRkPk5vPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICA8dGQ+bm9jb21wcmVzczwvdGQ+Ci0gICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gZGlzYWJsZSBjb21wcmVzc2lvbjwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgotICAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAgICAgICAgICAgPHRkPmEgdmVyc2lvbiBudW1iZXIgdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRGaWxlIGNvbW1hbmQ8L3RkPgotICAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD5sYWJlbDwvdGQ+Ci0gICAgICAgICAgIDx0ZD5hIGxhYmVsIHZlcnNpb24gdG8gZ2V0IC0gT25seSB3b3JrcyB3aXRoIHRoZSBHZXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgotICAgICAgICAgICA8dGQ+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KLSAgICAgICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBPbmx5IG5lZWRlZCBpZiBTT1NIT01FIGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZTwvdGQ+Ci0gICAgICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICAgPHRkPnZlcmJvc2U8L3RkPgotICAgICAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KLSAgICAgICAgICAgPHRkPk5vPC90ZD4KLSAgICAgICAgPC90cj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgICA8L3RyPgorICA8L3RoZWFkPgorICA8dGJvZHk+CisgICAgPHRyPgorICAgICAgPHRkPnNvc2NtZDwvdGQ+CisgICAgICA8dGQ+RGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIDxrYmQ+c29zY21kKC5leGUpPC9rYmQ+PC90ZD4KKyAgICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgdGhlIGV4ZWN1dGFibGUgbXVzdCBiZSBpbiB0aGUgcGF0aDwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+CisgICAgICA8dGQ+cGF0aCB0byB0aGUgPHNhbXA+c3Jjc2FmZS5pbmk8L3NhbXA+Jm1kYXNoO2VnLiA8c2FtcD5cXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmk8L3NhbXA+PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnNvc3NlcnZlcnBhdGg8L3RkPgorICAgICAgPHRkPmFkZHJlc3MgJmFtcDsgcG9ydCBvZiB0aGUgU09TIHNlcnZlciZtZGFzaDtlZy4gPHNhbXA+MTkyLjE2OC4wLjE6ODg4ODwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoJm1kYXNoO2VnLiA8c2FtcD4kL1NvdXJjZVJvb3QvUHJvamVjdDE8L3NhbXA+PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmZpbGU8L3RkPgorICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPC90ZD4KKyAgICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5zb3Nob21lPC90ZD4KKyAgICAgIDx0ZD5UaGUgcGF0aCB0byB0aGUgU291cmNlT2ZmU2l0ZSBob21lIGRpcmVjdG9yeTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPm5vY29tcHJlc3M8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO2Rpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5yZWN1cnNpdmU8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO09ubHkgd29ya3Mgd2l0aCB0aGUgPHZhcj5HZXRQcm9qZWN0PC92YXI+IGNvbW1hbmQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICAgIDx0ZD5hIHZlcnNpb24gbnVtYmVyIHRvIGdldCZtZGFzaDtPbmx5IHdvcmtzIHdpdGggdGhlIDx2YXI+R2V0RmlsZTwvdmFyPiBjb21tYW5kPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+bGFiZWw8L3RkPgorICAgICAgPHRkPmEgbGFiZWwgdmVyc2lvbiB0byBnZXQmbWRhc2g7T25seSB3b3JrcyB3aXRoIHRoZSA8dmFyPkdldFByb2plY3Q8L3Zhcj4gY29tbWFuZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPm5vY2FjaGU8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO09ubHkgbmVlZGVkIGlmIDxjb2RlPlNPU0hPTUU8L2NvZGU+IGlzIHNldCBhcyBhbiBlbnZpcm9ubWVudAorICAgICAgICB2YXJpYWJsZTwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO1N0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CisgICAgPC90cj4KICAgPC90Ym9keT4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlPC9oMz4KIAorPHA+Q29ubmVjdCB0byBhIFNvdXJjZU9mZnNpdGUgc2VydmVyIG9uIDxzYW1wPjE5Mi4xNjguMTAuNjo4ODg4PC9zYW1wPgord2l0aCA8cT5idWlsZDwvcT4sIDxxPmJ1aWxkPC9xPiBhcyB0aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMgb24KK3RoZSBzYW1lIGJveCBhcyB0aGUgU09TIHNlcnZlciAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlIGlzIGF0IDxzYW1wPmQ6XHZzc1xzcmNzYWZlLmluaTwvc2FtcD4uIERvIGEKK3JlY3Vyc2l2ZSA8dmFyPkdldFByb2plY3Q8L3Zhcj4gb24gPHNhbXA+JC9Tb3VyY2VSb290L3Byb2plY3QxPC9zYW1wPiwgdXNpbmcgPHNhbXA+dG1wPC9zYW1wPiBhcyB0aGUKK3dvcmtpbmcgZGlyZWN0b3J5LjwvcD4KIDxwcmU+CiAmbHQ7c29zZ2V0IHZlcmJvc2U9JnF1b3Q7dHJ1ZSZxdW90OwogICAgICAgICByZWN1cnNpdmU9JnF1b3Q7dHJ1ZSZxdW90OwpAQCAtMTk4LDE4MyArMTg4LDE4MiBAQAogICAgICAgICBsb2NhbHBhdGg9JnF1b3Q7dG1wJnF1b3Q7CiAgICAgICAgIHByb2plY3RwYXRoPSZxdW90OyQvU291cmNlUm9vdC9wcm9qZWN0MSZxdW90OwogICAgICAgICBzb3NzZXJ2ZXJwYXRoPSZxdW90OzE5Mi4xNjguMTAuNjo4ODg4JnF1b3Q7Ci0gICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7ZDpcdnNzXHNyY3NhZmUuaW5pJnF1b3Q7LyZndDsKLTwvcHJlPgotPHNtYWxsPkNvbm5lY3RzIHRvIGEgU291cmNlT2Zmc2l0ZSBzZXJ2ZXIgb24gMTkyLjE2OC4xMC42Ojg4ODggd2l0aAotYnVpbGQsYnVpbGQgYXMgdGhlIHVzZXJuYW1lICZhbXA7IHBhc3N3b3JkLiBUaGUgU291cmNlU2FmZSAgZGF0YWJhc2UgcmVzaWRlcwotb24gdGhlIHNhbWUgYm94IGFzIHRoZSBTT1Mgc2VydmVyICAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlICBpcyBhdAotJnF1b3Q7ZDpcdnNzXHNyY3NhZmUuaW5pJnF1b3Q7IERvZXMgYSByZWN1cnNpdmUgR2V0UHJvamVjdCBvbgotJC9Tb3VyY2VSb290L3Byb2plY3QxLCB1c2luZyB0bXAgYXMgdGhlIHdvcmtpbmcKLWRpcmVjdG9yeS4gPC9zbWFsbD48YnI+Ci08YnI+CisgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7ZDpcdnNzXHNyY3NhZmUuaW5pJnF1b3Q7LyZndDs8L3ByZT4KIAotPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KLTxoMj48YSBuYW1lPSJTT1NMYWJlbCI+PC9hPlNPU0xhYmVsPC9oMj4KKzxoci8+Cis8aDIgaWQ9IlNPU0xhYmVsIj5TT1NMYWJlbDwvaDI+CiAKIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgICAgICAgICAgVGFzayB0byBwZXJmb3JtIExhYmVsIGNvbW1hbmRzIHdpdGggU09TPGJyPgorPHA+VGFzayB0byBwZXJmb3JtIDx2YXI+TGFiZWw8L3Zhcj4gY29tbWFuZHMgd2l0aCBTT1M8L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+CiAKLTx0YWJsZSBib3JkZXI9IjEiPgotICAgIDx0Ym9keT48dHI+Ci0gICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICAgPHRoPlJlcXVpcmVkPC90aD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICA8L3RyPgorICA8L3RoZWFkPgorICA8dGJvZHk+CiAgICAgPHRyPgogICAgICAgPHRkPnNvc2NtZDwvdGQ+Ci0gICAgICA8dGQ+RGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHNvc2NtZCguZXhlKSA8YnI+Ci0gICAgICBzb3NjbWQoLmV4ZSkgbXVzdCBiZSBpbiB0aGUgcGF0aCBpZiB0aGlzIGlzIG5vdCBzcGVjaWZpZWQ8L3RkPgorICAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyA8a2JkPnNvc2NtZCguZXhlKTwva2JkPjwvdGQ+CisgICAgICA8dGQ+Tm87IGJ5IGRlZmF1bHQsIHRoZSBleGVjdXRhYmxlIG11c3QgYmUgaW4gdGhlIHBhdGg8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgorICAgICAgPHRkPnBhdGggdG8gdGhlIDxzYW1wPnNyY3NhZmUuaW5pPC9zYW1wPiZtZGFzaDtlZy4gPHNhbXA+XFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC9zYW1wPjwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5hZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBTT1Mgc2VydmVyJm1kYXNoO2VnLiA8c2FtcD4xOTIuMTY4LjAuMTo4ODg4PC9zYW1wPjwvdGQ+CisgICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD5wcm9qZWN0cGF0aDwvdGQ+CisgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGgmbWRhc2g7ZWcuIDxzYW1wPiQvU291cmNlUm9vdC9Qcm9qZWN0MTwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+dXNlcm5hbWU8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgdXNlcm5hbWU8L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcGFzc3dvcmQ8L3RkPgogICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgICA8dGQ+dnNzc2VydmVycGF0aDwvdGQ+Ci0gICAgICAgPHRkPnBhdGggdG8gdGhlIHNyY3NhZmUuaW5pICAtIGVnLiBcXHNlcnZlclx2c3Ncc3Jjc2FmZS5pbmk8L3RkPgotICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgPHRkPmxhYmVsPC90ZD4KKyAgICAgIDx0ZD5UaGUgbGFiZWwgdG8gYXBwbHkgdG8gYSBwcm9qZWN0PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICAgPHRkPlllczwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPnByb2plY3RwYXRoPC90ZD4KLSAgICAgICA8dGQ+U291cmNlU2FmZSBwcm9qZWN0IHBhdGggLSBlZy4gJC9Tb3VyY2VSb290L1Byb2plY3QxPC90ZD4KLSAgICAgICA8dGQ+WWVzPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+dXNlcm5hbWU8L3RkPgotICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHVzZXJuYW1lPC90ZD4KLSAgICAgICA8dGQ+WWVzPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+cGFzc3dvcmQ8L3RkPgotICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5sYWJlbDwvdGQ+Ci0gICAgICAgPHRkPlRoZSBsYWJlbCB0byBhcHBseSB0byBhIHByb2plY3Q8L3RkPgotICAgICAgIDx0ZD5ZZXM8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsZWQ8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGxhYmVsZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KICAgICAgICA8dGQ+dmVyYm9zZTwvdGQ+Ci0gICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBTdGF0dXMgbWVzc2FnZXMgYXJlIGRpc3BsYXllZDwvdGQ+CisgICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO1N0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KICAgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgIDwvdGJvZHk+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkNvbm5lY3QgdG8gYSBTb3VyY2VPZmZzaXRlIHNlcnZlciBvbiA8c2FtcD4xOTIuMTY4LjEwLjY6ODg4ODwvc2FtcD4KK3dpdGggPHE+YnVpbGQ8L3E+LCA8cT5idWlsZDwvcT4gYXMgdGhlIHVzZXJuYW1lICZhbXA7IHBhc3N3b3JkLiBUaGUgU291cmNlU2FmZSBkYXRhYmFzZSByZXNpZGVzIG9uCit0aGUgc2FtZSBib3ggYXMgdGhlIFNPUyBzZXJ2ZXIgJmFtcDsgdGhlIFZTUyBkYXRhYmFzZSBpcyBhdCA8c2FtcD5kOlx2c3Ncc3Jjc2FmZS5pbmk8L3NhbXA+LiBMYWJlbAordGhlIDxzYW1wPiQvU291cmNlUm9vdC9wcm9qZWN0MTwvc2FtcD4gcHJvamVjdCB3aXRoIDxxPnRlc3QgbGFiZWw8L3E+LjwvcD4KIDxwcmU+CiAmbHQ7c29zbGFiZWwgdXNlcm5hbWU9JnF1b3Q7YnVpbGQmcXVvdDsKICAgICAgICAgICBwYXNzd29yZD0mcXVvdDtidWlsZCZxdW90OwogICAgICAgICAgIGxhYmVsPSZxdW90O3Rlc3QgbGFiZWwmcXVvdDsKICAgICAgICAgICBwcm9qZWN0cGF0aD0mcXVvdDskL1NvdXJjZVJvb3QvcHJvamVjdDEmcXVvdDsKICAgICAgICAgICBzb3NzZXJ2ZXJwYXRoPSZxdW90OzE5Mi4xNjguMTAuNjo4ODg4JnF1b3Q7Ci0gICAgICAgICAgdnNzc2VydmVycGF0aD0mcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsvJmd0OwotPC9wcmU+CisgICAgICAgICAgdnNzc2VydmVycGF0aD0mcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsvJmd0OzwvcHJlPgogCi08c21hbGw+Q29ubmVjdHMgdG8gYSBTb3VyY2VPZmZzaXRlIHNlcnZlciBvbiAxOTIuMTY4LjEwLjY6ODg4OCB3aXRoCi1idWlsZCxidWlsZCBhcyB0aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMKLW9uIHRoZSBzYW1lIGJveCBhcyAgdGhlICBTT1Mgc2VydmVyICAmYW1wOyB0aGUgVlNTIGRhdGFiYXNlIGlzIGF0Ci0mcXVvdDtkOlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsuIExhYmVscyB0aGUgJC9Tb3VyY2VSb290L3Byb2plY3QxCi1wcm9qZWN0IHdpdGggJnF1b3Q7dGVzdCBsYWJlbCZxdW90Oy48L3NtYWxsPjxicj4KLTxicj4KLQotPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj48YnI+Ci0KLTxoMj48YSBuYW1lPSJTT1NDaGVja0luIj48L2E+U09TQ2hlY2tJbjwvaDI+Cis8aHIvPgorPGgyIGlkPSJTT1NDaGVja0luIj5TT1NDaGVja0luPC9oMj4KIAogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLSAgICAgICAgVGFzayB0byBwZXJmb3JtIENoZWNrSW4gY29tbWFuZHMgd2l0aCBTT1M8YnI+Cis8cD5UYXNrIHRvIHBlcmZvcm0gPHZhcj5DaGVja0luPC92YXI+IGNvbW1hbmRzIHdpdGggU09TPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgPHRib2R5PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRoZWFkPgogICAgIDx0cj4KLSAgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgogICAgIDx0cj4KICAgICAgIDx0ZD5zb3NjbWQ8L3RkPgotICAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgotICAgICAgc29zY21kKC5leGUpIG11c3QgYmUgaW4gdGhlIHBhdGggaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkPC90ZD4KKyAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgPGtiZD5zb3NjbWQoLmV4ZSk8L2tiZD48L3RkPgorICAgICAgPHRkPk5vOyBieSBkZWZhdWx0LCB0aGUgZXhlY3V0YWJsZSBtdXN0IGJlIGluIHRoZSBwYXRoPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5wYXRoIHRvIHRoZSA8c2FtcD5zcmNzYWZlLmluaTwvc2FtcD4mbWRhc2g7ZWcuIDxzYW1wPlxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+c29zc2VydmVycGF0aDwvdGQ+CisgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciZtZGFzaDtlZy4gPHNhbXA+MTkyLjE2OC4wLjE6ODg4ODwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoJm1kYXNoO2VnLiA8c2FtcD4kL1NvdXJjZVJvb3QvUHJvamVjdDE8L3NhbXA+PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmZpbGU8L3RkPgorICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPC90ZD4KKyAgICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgotICAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KLSAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgorICAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8dGQ+c29zaG9tZTwvdGQ+CisgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgotICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCAtIGVnLiAkL1NvdXJjZVJvb3QvUHJvamVjdDE8L3RkPgotICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgPHRkPm5vY29tcHJlc3M8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO2Rpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPGJyPiBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIGFjdCB1cG9uIHRoZSBwcm9qZWN0PC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4mbWRhc2g7T25seSB3b3JrcyB3aXRoIHRoZSA8dmFyPkNoZWNrT3V0UHJvamVjdDwvdmFyPiBjb21tYW5kPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KLSAgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+Ci0gICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8dGQ+bm9jYWNoZTwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4mbWRhc2g7T25seSBuZWVkZWQgaWYgPGNvZGU+U09TSE9NRTwvY29kZT4gaXMgc2V0IGFzIGFuIGVudmlyb25tZW50CisgICAgICAgIHZhcmlhYmxlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KLSAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+Ci0gICAgICAgPHRkPk5vPC90ZD4KKyAgICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPiZtZGFzaDtTdGF0dXMgbWVzc2FnZXMgYXJlIGRpc3BsYXllZDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgotICAgICAgIDx0ZD5PdmVycmlkZSB0aGUgd29ya2luZyBkaXJlY3RvcnkgYW5kIGdldCB0byB0aGUgc3BlY2lmaWVkIHBhdGg8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGNoZWNrZWQgaW48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+c29zaG9tZTwvdGQ+Ci0gICAgICAgPHRkPlRoZSBwYXRoIHRvIHRoZSBTb3VyY2VPZmZTaXRlIGhvbWUgZGlyZWN0b3J5PC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5ub2NvbXByZXNzPC90ZD4KLSAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIGRpc2FibGUgY29tcHJlc3Npb248L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgICAgPHRkPnRydWUgb3IgZmFsc2UgLSBPbmx5IHdvcmtzIHdpdGggdGhlIENoZWNrT3V0UHJvamVjdCBjb21tYW5kPC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5ub2NhY2hlPC90ZD4KLSAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgbmVlZGVkIGlmIFNPU0hPTUUgaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlPC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD52ZXJib3NlPC90ZD4KLSAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIFN0YXR1cyBtZXNzYWdlcyBhcmUgZGlzcGxheWVkPC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPjx0ZD5jb21tZW50PC90ZD4KLSAgICAgICA8dGQ+QSBjb21tZW50IHRvIGJlIGFwcGxpZWQgdG8gYWxsIGZpbGVzIGJlaW5nIGNoZWNrZWQgaW48L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgPC90cj4KLSA8L3Rib2R5PgorICA8L3Rib2R5PgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGU8L2gzPgorCis8cD5Db25uZWN0IHRvIGEgU291cmNlT2Zmc2l0ZSBzZXJ2ZXIgb24gPHNhbXA+c2VydmVyMTo4ODg4PC9zYW1wPiB3aXRoIDxxPmJ1aWxkPC9xPiwgPHE+YnVpbGQ8L3E+IGFzCit0aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMgb24gYSBkaWZmZXJlbnQgYm94CisoPHNhbXA+c2VydmVyMjwvc2FtcD4pICZhbXA7IHRoZSBWU1MgZGF0YWJhc2UgaXMgb24gYSBzaGFyZSBjYWxsZWQgPHNhbXA+dnNzPC9zYW1wPi4gQ2hlY2staW4gb25seQordGhlIDxzYW1wPmZvb2Jhci50eHQ8L3NhbXA+IGZpbGUgYWRkaW5nIGEgY29tbWVudCBvZiA8cT5jb21tZW50IGFiYzwvcT4uIEV4dHJhIHN0YXR1cyBtZXNzYWdlcyB3aWxsCitiZSBkaXNwbGF5ZWQgb24gc2NyZWVuLjwvcD4KIDxwcmU+CiAmbHQ7c29zY2hlY2tpbiB1c2VybmFtZT0mcXVvdDtidWlsZCZxdW90OwogICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7YnVpbGQmcXVvdDsKQEAgLTM4MywxMDMgKzM3MiwxMDEgQEAKICAgICAgICAgICAgIGNvbW1lbnQ9JnF1b3Q7Y29tbWVudCBhYmMmcXVvdDsKICAgICAgICAgICAgIHByb2plY3RwYXRoPSZxdW90OyQvU291cmNlUm9vdC9wcm9qZWN0MSZxdW90OwogICAgICAgICAgICAgc29zc2VydmVycGF0aD0mcXVvdDtzZXJ2ZXIxOjg4ODgmcXVvdDsKLSAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7XFxzZXJ2ZXIyXHZzc1xzcmNzYWZlLmluaSZxdW90Oy8mZ3Q7Ci08L3ByZT4KKyAgICAgICAgICAgIHZzc3NlcnZlcnBhdGg9JnF1b3Q7XFxzZXJ2ZXIyXHZzc1xzcmNzYWZlLmluaSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxzbWFsbD5Db25uZWN0cyB0byBhIFNvdXJjZU9mZnNpdGUgc2VydmVyIG9uIHNlcnZlcjE6ODg4OCB3aXRoIGJ1aWxkLGJ1aWxkIGFzCi10aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMgb24gYSBkaWZmZXJlbnQKLWJveCAoc2VydmVyMikgJmFtcDsgdGhlIFZTUyBkYXRhYmFzZSBpcyBvbiBhIHNoYXJlIGNhbGxlZAotJnF1b3Q7dnNzJnF1b3Q7LiBDaGVja3MtaW4gb25seSB0aGUgJnF1b3Q7Zm9vYmFyLnR4dCZxdW90OyBmaWxlIGFkZGluZwotYSBjb21tZW50IG9mICZxdW90O2NvbW1lbnQgYWJjJnF1b3Q7LiBFeHRyYSBzdGF0dXMgbWVzc2FnZXMgd2lsbCBiZQotZGlzcGxheWVkIG9uIHNjcmVlbi48L3NtYWxsPjxicj4KLTxicj4KLQotPGhyIHdpZHRoPSIxMDAlIiBzaXplPSIyIj4KLTxoMj48YSBuYW1lPSJTT1NDaGVja091dCI+PC9hPlNPU0NoZWNrT3V0PC9oMj4KKzxoci8+Cis8aDIgaWQ9IlNPU0NoZWNrT3V0Ij5TT1NDaGVja091dDwvaDI+CiAKIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgICAgVGFzayB0byBwZXJmb3JtIENoZWNrT3V0IGNvbW1hbmRzIHdpdGggU09TPGJyPgorPHA+VGFzayB0byBwZXJmb3JtIDx2YXI+Q2hlY2tPdXQ8L3Zhcj4gY29tbWFuZHMgd2l0aCBTT1M8L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KIAotPHRhYmxlIGJvcmRlcj0iMSI+Ci0gICAgICAgPHRib2R5PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRoZWFkPgogICAgIDx0cj4KLSAgICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgPC90cj4KKyAgPC90aGVhZD4KKyAgPHRib2R5PgogICAgIDx0cj4KICAgICAgIDx0ZD5zb3NjbWQ8L3RkPgotICAgICAgPHRkPkRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb3NjbWQoLmV4ZSkgPGJyPgotICAgICAgc29zY21kKC5leGUpIG11c3QgYmUgaW4gdGhlIHBhdGggaWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkPC90ZD4KKyAgICAgIDx0ZD5EaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgPGtiZD5zb3NjbWQoLmV4ZSk8L2tiZD48L3RkPgorICAgICAgPHRkPk5vOyBieSBkZWZhdWx0LCB0aGUgZXhlY3V0YWJsZSBtdXN0IGJlIGluIHRoZSBwYXRoPC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgIDx0ZD52c3NzZXJ2ZXJwYXRoPC90ZD4KKyAgICAgIDx0ZD5wYXRoIHRvIHRoZSA8c2FtcD5zcmNzYWZlLmluaTwvc2FtcD4mbWRhc2g7ZWcuIDxzYW1wPlxcc2VydmVyXHZzc1xzcmNzYWZlLmluaTwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+c29zc2VydmVycGF0aDwvdGQ+CisgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciZtZGFzaDtlZy4gPHNhbXA+MTkyLjE2OC4wLjE6ODg4ODwvc2FtcD48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgorICAgICAgPHRkPlNvdXJjZVNhZmUgcHJvamVjdCBwYXRoJm1kYXNoO2VnLiA8c2FtcD4kL1NvdXJjZVJvb3QvUHJvamVjdDE8L3NhbXA+PC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPmZpbGU8L3RkPgorICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPC90ZD4KKyAgICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCwgYWN0IHVwb24gdGhlIHByb2plY3Q8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHVzZXJuYW1lPC90ZD4KKyAgICAgIDx0ZD5ZZXM8L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhc3N3b3JkPC90ZD4KICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnZzc3NlcnZlcnBhdGg8L3RkPgotICAgICAgIDx0ZD5wYXRoIHRvIHRoZSBzcmNzYWZlLmluaSAgLSBlZy4gXFxzZXJ2ZXJcdnNzXHNyY3NhZmUuaW5pPC90ZD4KLSAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgorICAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgIDx0ZD5zb3NzZXJ2ZXJwYXRoPC90ZD4KLSAgICAgICA8dGQ+YWRkcmVzcyBhbmQgcG9ydCBvZiB0aGUgU09TIHNlcnZlciAgLSBlZy4gMTkyLjE2OC4wLjE6ODg4ODwvdGQ+Ci0gICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8dGQ+c29zaG9tZTwvdGQ+CisgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgICA8dGQ+cHJvamVjdHBhdGg8L3RkPgotICAgICAgIDx0ZD5Tb3VyY2VTYWZlIHByb2plY3QgcGF0aCAtIGVnLiAkL1NvdXJjZVJvb3QvUHJvamVjdDE8L3RkPgotICAgICAgIDx0ZD5ZZXM8L3RkPgorICAgICAgPHRkPm5vY29tcHJlc3M8L3RkPgorICAgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+Jm1kYXNoO2Rpc2FibGUgY29tcHJlc3Npb248L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgICA8dGQ+ZmlsZTwvdGQ+Ci0gICAgICAgPHRkPkZpbGVuYW1lIHRvIGFjdCB1cG9uPGJyPiBJZiBubyBmaWxlIGlzIHNwZWNpZmllZCB0aGVuIGFjdCB1cG9uIHRoZSBwcm9qZWN0PC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgorICAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4mbWRhc2g7T25seSB3b3JrcyB3aXRoIHRoZSA8dmFyPkNoZWNrT3V0UHJvamVjdDwvdmFyPiBjb21tYW5kPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnVzZXJuYW1lPC90ZD4KLSAgICAgICA8dGQ+U291cmNlU2FmZSB1c2VybmFtZTwvdGQ+Ci0gICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8dGQ+bm9jYWNoZTwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4mbWRhc2g7T25seSBuZWVkZWQgaWYgPGNvZGU+U09TSE9NRTwvY29kZT4gaXMgc2V0IGFzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICAgPHRkPnBhc3N3b3JkPC90ZD4KLSAgICAgICA8dGQ+U291cmNlU2FmZSBwYXNzd29yZDwvdGQ+Ci0gICAgICAgPHRkPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KLSAgICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KLSAgICAgICA8dGQ+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgIDx0ZD5zb3Nob21lPC90ZD4KLSAgICAgICA8dGQ+VGhlIHBhdGggdG8gdGhlIFNvdXJjZU9mZlNpdGUgaG9tZSBkaXJlY3Rvcnk8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPm5vY29tcHJlc3M8L3RkPgotICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gZGlzYWJsZSBjb21wcmVzc2lvbjwvdGQ+Ci0gICAgICAgPHRkPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KLSAgICAgICA8dGQ+dHJ1ZSBvciBmYWxzZSAtIE9ubHkgd29ya3Mgd2l0aCB0aGUgQ2hlY2tPdXRQcm9qZWN0IGNvbW1hbmQ8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPm5vY2FjaGU8L3RkPgotICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gT25seSBuZWVkZWQgaWYgU09TSE9NRSBpcyBzZXQgYXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGU8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgPHRkPnZlcmJvc2U8L3RkPgotICAgICAgIDx0ZD50cnVlIG9yIGZhbHNlIC0gU3RhdHVzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQ8L3RkPgotICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4mbWRhc2g7U3RhdHVzIG1lc3NhZ2VzIGFyZSBkaXNwbGF5ZWQ8L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICA8L3Rib2R5PgogPC90YWJsZT4KLSAgICAgPGJyPgogCiA8aDM+RXhhbXBsZTwvaDM+CisKKzxwPkNvbm5lY3QgdG8gYSBTb3VyY2VPZmZzaXRlIHNlcnZlciBvbiA8c2FtcD5zZXJ2ZXIxOjg4ODg8L3NhbXA+IHdpdGggPHE+YnVpbGQ8L3E+LCA8cT5idWlsZDwvcT4gYXMKK3RoZSB1c2VybmFtZSAmYW1wOyBwYXNzd29yZC4gVGhlIFNvdXJjZVNhZmUgZGF0YWJhc2UgcmVzaWRlcyBvbiBhIGRpZmZlcmVudCBib3gKKyg8c2FtcD5zZXJ2ZXIyPC9zYW1wPikgJmFtcDsgdGhlIFZTUyBkYXRhYmFzZSBpcyBvbiBhIHNoYXJlCitjYWxsZWQgPHNhbXA+dnNzPC9zYW1wPi4gQ2hlY2stb3V0IDxxPnByb2plY3QxPC9xPiwgb25seSB0aGUgPHNhbXA+cHJvamVjdDE8L3NhbXA+IGRpcmVjdG9yeSB3aWxsIGJlCitsb2NrZWQgYXMgdGhlIHJlY3Vyc2l2ZSBvcHRpb24gd2FzIG5vdCBzZXQuIEV4dHJhIHN0YXR1cyBtZXNzYWdlcyB3aWxsIGJlIGRpc3BsYXllZCBvbgorc2NyZWVuLiBUaGUgPGNvZGU+c29zY21kKC5leGUpPC9jb2RlPiBmaWxlIHRvIGJlIHVzZWQgcmVzaWRlcyBpbiA8c2FtcD4vdXNyL2xvY2FsL2Jpbjwvc2FtcD4uPC9wPgogPHByZT4KICZsdDtzb3NjaGVja291dCBzb3NjbWQ9JnF1b3Q7L3Vzci9sb2NhbC9iaW4mcXVvdDsKICAgICAgICAgICAgICB2ZXJib3NlPSZxdW90O3RydWUmcXVvdDsKQEAgLTQ4NywxNyArNDc0LDcgQEAKICAgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDtidWlsZCZxdW90OwogICAgICAgICAgICAgIHByb2plY3RwYXRoPSZxdW90OyQvU291cmNlUm9vdC9wcm9qZWN0MSZxdW90OwogICAgICAgICAgICAgIHNvc3NlcnZlcnBhdGg9JnF1b3Q7MTkyLjE2OC4xMC42Ojg4ODgmcXVvdDsKLSAgICAgICAgICAgICB2c3NzZXJ2ZXJwYXRoPSZxdW90O1xcc2VydmVyMlx2c3Ncc3Jjc2FmZS5pbmkmcXVvdDsvJmd0OwotPC9wcmU+Ci0KLTxzbWFsbD5Db25uZWN0cyB0byBhIFNvdXJjZU9mZnNpdGUgc2VydmVyIG9uIHNlcnZlcjE6ODg4OCB3aXRoIGJ1aWxkLGJ1aWxkIGFzCi10aGUgdXNlcm5hbWUgJmFtcDsgcGFzc3dvcmQuIFRoZSBTb3VyY2VTYWZlIGRhdGFiYXNlIHJlc2lkZXMgb24gYSBkaWZmZXJlbnQKLWJveCAoc2VydmVyMikgJmFtcDsgdGhlIFZTUyBkYXRhYmFzZSBpcyBvbiBhIHNoYXJlIGNhbGxlZAotJnF1b3Q7dnNzJnF1b3Q7LiBDaGVja3Mtb3V0ICZxdW90O3Byb2plY3QxJnF1b3Q7LCBPbmx5IHRoZQotJnF1b3Q7cHJvamVjdDEmcXVvdDsgZGlyZWN0b3J5IHdpbGwgYmUgbG9ja2VkIGFzIHRoZSByZWN1cnNpdmUgb3B0aW9uCi13YXMgbm90IHNldC4gRXh0cmEgc3RhdHVzIG1lc3NhZ2VzIHdpbGwgYmUgZGlzcGxheWVkIG9uIHNjcmVlbi4gVGhlCi1zb3NjbWQoLmV4ZSkgZmlsZSB0byBiZSB1c2VkIHJlc2lkZXMgaW4gL3Vzci9sb2NhbC9iaW4uPC9zbWFsbD48YnI+Ci08YnI+CisgICAgICAgICAgICAgdnNzc2VydmVycGF0aD0mcXVvdDtcXHNlcnZlcjJcdnNzXHNyY3NhZmUuaW5pJnF1b3Q7LyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3NvdW5kLmh0bWwgYi9tYW51YWwvVGFza3Mvc291bmQuaHRtbAppbmRleCAxMDk1ZjgwLi4xMDJhMzAwIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc291bmQuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvc291bmQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDc3ICsxNSw2OSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+U291bmQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ic291bmQiPlNvdW5kPC9hPjwvaDI+Cis8aDIgaWQ9InNvdW5kIj5Tb3VuZDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+UGxheXMgYSBzb3VuZC1maWxlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkLCBhY2NvcmRpbmcgdG8gd2hldGhlcgotdGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuIFlvdSBjYW4gc3BlY2lmeSBlaXRoZXIgYSBzcGVjaWZpYwotc291bmQtZmlsZSB0byBwbGF5LCBvciwgaWYgYSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkLCB0aGUKLTxjb2RlPiZsdDtzb3VuZCZndDs8L2NvZGU+IHRhc2sgd2lsbCByYW5kb21seSBzZWxlY3QgYSBmaWxlIHRvIHBsYXkuCi1Ob3RlOiBBdCB0aGlzIHBvaW50LCB0aGUgcmFuZG9tIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiBhbGwgdGhlIGZpbGVzCi1pbiB0aGUgZGlyZWN0b3J5LCBub3QganVzdCB0aG9zZSBlbmRpbmcgaW4gYXBwcm9wcmlhdGUgc3VmZml4ZXMKLWZvciBzb3VuZC1maWxlcywgc28gYmUgc3VyZSB5b3Ugb25seSBoYXZlIHNvdW5kLWZpbGVzIGluIHRoZSAKLWRpcmVjdG9yeSB5b3Ugc3BlY2lmeS48L3A+Ci08cD5Nb3JlIHByZWNpc2VseSA8Y29kZT4mbHQ7c291bmQmZ3Q7PC9jb2RlPiByZWdpc3RlcnMgYSBob29rIHRoYXQgaXMKLXRyaWdnZXJlZCB3aGVuIHRoZSBidWlsZCBmaW5pc2hlcy4gVGhlcmVmb3JlIHlvdSBoYXZlIHRvIHBsYWNlIHRoaXMKLXRhc2sgYXMgdG9wIGxldmVsIG9yIGluc2lkZSBhIHRhcmdldCB3aGljaCBpcyBhbHdheXMgZXhlY3V0ZWQuPC9wPgotPHA+Ci1Vbmxlc3MgeW91IGFyZSBydW5uaW5nIG9uIEphdmEgMS4zIG9yIGxhdGVyLCB5b3UgbmVlZCB0aGUgSmF2YSBNZWRpYSBGcmFtZXdvcmsKLW9uIHRoZSBjbGFzc3BhdGggKGphdmF4LnNvdW5kKS4gCi08L3A+Cis8cD5QbGF5cyBhIHNvdW5kIGZpbGUgYXQgdGhlIGVuZCBvZiB0aGUgYnVpbGQsIGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBidWlsZCBmYWlsZWQgb3IKK3N1Y2NlZWRlZC4gWW91IGNhbiBzcGVjaWZ5IGVpdGhlciBhIHNwZWNpZmljIHNvdW5kIGZpbGUgdG8gcGxheSwgb3IsIGlmIGEgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwKK3RoZSA8Y29kZT4mbHQ7c291bmQmZ3Q7PC9jb2RlPiB0YXNrIHdpbGwgcmFuZG9tbHkgc2VsZWN0IGEgZmlsZSB0byBwbGF5LiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IEF0Cit0aGlzIHBvaW50LCB0aGUgcmFuZG9tIHNlbGVjdGlvbiBpcyBiYXNlZCBvbiBhbGwgdGhlIGZpbGVzIGluIHRoZSBkaXJlY3RvcnksIG5vdCBqdXN0IHRob3NlIGVuZGluZworaW4gYXBwcm9wcmlhdGUgc3VmZml4ZXMgZm9yIHNvdW5kIGZpbGVzLCBzbyBiZSBzdXJlIHlvdSBvbmx5IGhhdmUgc291bmQgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB5b3UKK3NwZWNpZnkuPC9wPgorPHA+TW9yZSBwcmVjaXNlbHkgPGNvZGU+Jmx0O3NvdW5kJmd0OzwvY29kZT4gcmVnaXN0ZXJzIGEgaG9vayB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBidWlsZAorZmluaXNoZXMuIFRoZXJlZm9yZSB5b3UgaGF2ZSB0byBwbGFjZSB0aGlzIHRhc2sgYXMgdG9wIGxldmVsIG9yIGluc2lkZSBhIHRhcmdldCB3aGljaCBpcyBhbHdheXMKK2V4ZWN1dGVkLjwvcD4KKzxwPlVubGVzcyB5b3UgYXJlIHJ1bm5pbmcgb24gSmF2YSAxLjMgb3IgbGF0ZXIsIHlvdSBuZWVkIHRoZSBKYXZhIE1lZGlhIEZyYW1ld29yayBvbiB0aGUgY2xhc3NwYXRoCisoPGNvZGUgY2xhc3M9ImNvZGUiPmphdmF4LnNvdW5kPC9jb2RlPikuPC9wPgogCi0KLTxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+c3VjY2VzczwvaDQ+CiA8cD5TcGVjaWZpZXMgdGhlIHNvdW5kIHRvIGJlIHBsYXllZCBpZiB0aGUgYnVpbGQgc3VjY2VlZGVkLjwvcD4KKwogPGg0PmZhaWw8L2g0PgogPHA+U3BlY2lmaWVzIHRoZSBzb3VuZCB0byBiZSBwbGF5ZWQgaWYgdGhlIGJ1aWxkIGZhaWxlZC48L3A+CiAKLTxoMz5OZXN0ZWQgRWxlbWVudCBQYXJhbWV0ZXJzPC9oMz4KLTxwPgotVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG1heSBiZSB1c2VkIG9uIHRoZSA8Y29kZT4mbHQ7c3VjY2VzcyZndDs8L2NvZGU+IAorPGg0Pk5lc3RlZCBlbGVtZW50IHBhcmFtZXRlcnM8L2g0PgorPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIG1heSBiZSB1c2VkIG9uIHRoZSA8Y29kZT4mbHQ7c3VjY2VzcyZndDs8L2NvZGU+CiBhbmQgPGNvZGU+Jmx0O2ZhaWwmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcGF0aCB0byBhIHNvdW5kLWZpbGUgZGlyZWN0b3J5LCBvciB0aGUgbmFtZSBvZiBhCi1zcGVjaWZpYyBzb3VuZC1maWxlLCB0byBiZSBwbGF5ZWQuIElmIHRoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3IgbWVzc2FnZQotd2lsbCBiZSBsb2dnZWQuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnNvdXJjZTwvdGQ+CisgICAgPHRkPnRoZSBwYXRoIHRvIGEgc291bmQgZmlsZSBkaXJlY3RvcnksIG9yIHRoZSBuYW1lIG9mIGEgc3BlY2lmaWMgc291bmQgZmlsZSwgdG8gYmUgcGxheWVkLiBJZgorICAgICAgdGhpcyBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvb3BzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBudW1iZXIgb2YgZXh0cmEgdGltZXMgdG8gcGxheSB0aGUgc291bmQtZmlsZTsKLSAgICAgIGRlZmF1bHQgaXMgPGNvZGU+MDwvY29kZT4uCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bG9vcHM8L3RkPgorICAgIDx0ZD50aGUgbnVtYmVyIG9mIGV4dHJhIHRpbWVzIHRvIHBsYXkgdGhlIHNvdW5kIGZpbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+MDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kdXJhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gcGxheQotICAgICAgdGhlIHNvdW5kLWZpbGUuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZHVyYXRpb248L3RkPgorICAgIDx0ZD50aGUgYW1vdW50IG9mIHRpbWUgKGluIG1pbGxpc2Vjb25kcykgdG8gcGxheSB0aGUgc291bmQgZmlsZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CisKKzxwPlBsYXkgdGhlIDxzYW1wPmJlbGwud2F2PC9zYW1wPiBzb3VuZCBmaWxlIGlmIHRoZSBidWlsZCBzdWNjZWVkZWQsIG9yIHRoZSA8c2FtcD5vaG5vLndhdjwvc2FtcD4KK3NvdW5kIGZpbGUgaWYgdGhlIGJ1aWxkIGZhaWxlZCwgdGhyZWUgdGltZXMsIGlmIHRoZSA8Y29kZT5mdW48L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0byA8cT50cnVlPC9xPi4KK0lmIHRoZSB0YXJnZXQgaXMgYSBkZXBlbmRlbmN5IG9mIGFuICJpbml0aWFsaXphdGlvbiIgdGFyZ2V0IHRoYXQgb3RoZXIgdGFyZ2V0cyBkZXBlbmQgb24sCit0aGUgPGNvZGU+ZnVuLmRvbmU8L2NvZGU+IHByb3BlcnR5IHByZXZlbnRzIHRoZSB0YXJnZXQgZnJvbSBiZWluZyBleGVjdXRlZCBtb3JlIHRoYW4gb25jZS48L3A+CiA8cHJlPgogJmx0O3RhcmdldCBuYW1lPSZxdW90O2Z1biZxdW90OyBpZj0mcXVvdDtmdW4mcXVvdDsgdW5sZXNzPSZxdW90O2Z1bi5kb25lJnF1b3Q7Jmd0OwogICAmbHQ7c291bmQmZ3Q7CkBAIC05MiwxOCArODUsOSBAQAogICAgICZsdDtmYWlsIHNvdXJjZT0mcXVvdDske3VzZXIuaG9tZX0vc291bmRzL29obm8ud2F2JnF1b3Q7IGxvb3BzPSZxdW90OzImcXVvdDsvJmd0OwogICAmbHQ7L3NvdW5kJmd0OwogICAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDtmdW4uZG9uZSZxdW90OyB2YWx1ZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci1wbGF5cyB0aGUgPGNvZGU+YmVsbC53YXY8L2NvZGU+IHNvdW5kLWZpbGUgaWYgdGhlIGJ1aWxkIHN1Y2NlZWRlZCwgb3IKLXRoZSA8Y29kZT5vaG5vLndhdjwvY29kZT4gc291bmQtZmlsZSBpZiB0aGUgYnVpbGQgZmFpbGVkLCB0aHJlZSB0aW1lcywKLWlmIHRoZSA8Y29kZT5mdW48L2NvZGU+IHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi4KLUlmIHRoZSB0YXJnZXQKLWlzIGEgZGVwZW5kZW5jeSBvZiBhbiAmcXVvdDtpbml0aWFsaXphdGlvbiZxdW90OyB0YXJnZXQgdGhhdCBvdGhlcgotdGFyZ2V0cyBkZXBlbmQgb24sIHRoZQotPGNvZGU+ZnVuLmRvbmU8L2NvZGU+IHByb3BlcnR5IHByZXZlbnRzIHRoZSB0YXJnZXQgZnJvbSBiZWluZyBleGVjdXRlZAotbW9yZSB0aGFuIG9uY2UuCi08YmxvY2txdW90ZT4KKyZsdDsvdGFyZ2V0Jmd0OzwvcHJlPgorCis8cD5SYW5kb21seSBzZWxlY3QgYSBzb3VuZCBmaWxlIHRvIHBsYXkgd2hlbiB0aGUgYnVpbGQgc3VjY2VlZHMgb3IgZmFpbHMuPC9wPgogPHByZT4KICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtmdW4mcXVvdDsgaWY9JnF1b3Q7ZnVuJnF1b3Q7IHVubGVzcz0mcXVvdDtmdW4uZG9uZSZxdW90OyZndDsKICAgJmx0O3NvdW5kJmd0OwpAQCAtMTEzLDExICs5Nyw2IEBACiAgICZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2Z1bi5kb25lJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OwogJmx0Oy90YXJnZXQmZ3Q7CiA8L3ByZT4KLTwvYmxvY2txdW90ZT4KLXJhbmRvbWx5IHNlbGVjdHMgYSBzb3VuZC1maWxlIHRvIHBsYXkgd2hlbiB0aGUgYnVpbGQgc3VjY2VlZHMgb3IgZmFpbHMuCi0KLQogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zcGxhc2guaHRtbCBiL21hbnVhbC9UYXNrcy9zcGxhc2guaHRtbAppbmRleCBlMTU4YmQyLi42YjU0NDcwIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc3BsYXNoLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NwbGFzaC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTQxICsxNSwxMTkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9IlNwbGFzaCI+U3BsYXNoPC9hPjwvaDI+Cis8aDIgaWQ9InNwbGFzaCI+U3BsYXNoPC9oMj4KIDxwPmJ5IExlcyBIdWdoZXMgKGxlc2xpZS5odWdoZXNAcnVidXMuY29tKQogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlRoaXMgdGFzayBjcmVhdGVzIGEgc3BsYXNoIHNjcmVlbi4gVGhlIHNwbGFzaCBzY3JlZW4gaXMgZGlzcGxheWVkCi1mb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBidWlsZCBhbmQgaW5jbHVkZXMgYSBoYW5keSBwcm9ncmVzcyBiYXIgYXMKLXdlbGwuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBzb3VuZCB0YXNrIHRvIHByb3ZpZGUgaW50ZXJlc3QKLXdoaWxzdCB3YWl0aW5nIGZvciB5b3VyIGJ1aWxkcyB0byBjb21wbGV0ZS4uLjwvcD4KKzxwPlRoaXMgdGFzayBjcmVhdGVzIGEgc3BsYXNoIHNjcmVlbi4gVGhlIHNwbGFzaCBzY3JlZW4gaXMgZGlzcGxheWVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGJ1aWxkCithbmQgaW5jbHVkZXMgYSBoYW5keSBwcm9ncmVzcyBiYXIgYXMgd2VsbC4gVXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxjb2RlPnNvdW5kPC9jb2RlPiB0YXNrIHRvCitwcm92aWRlIGludGVyZXN0IHdoaWxzdCB3YWl0aW5nIGZvciB5b3VyIGJ1aWxkcyB0byBjb21wbGV0ZS4uLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+RGVmYXVsdDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW1hZ2V1cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBVUkwgcG9pbnRpbmcgdG8gYW4gaW1hZ2UgdG8gZGlzcGxheS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+YW50bG9nby5naWYgZnJvbSB0aGUgY2xhc3NwYXRoPC90ZD4KLSAgPC90cj4KLSAKLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2hvd2R1cmF0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkluaXRpYWwgcGVyaW9kIHRvIHBhdXNlIHRoZSBidWlsZCB0byBzaG93IHRoZQotICAgIHNwbGFzaCBpbiBtaWxsaXNlY29uZHMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjUwMDAgbXM8L3RkPgorICAgIDx0ZD5pbWFnZXVybDwvdGQ+CisgICAgPHRkPkEgVVJMIHBvaW50aW5nIHRvIGFuIGltYWdlIHRvIGRpc3BsYXkuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxzYW1wPmFudGxvZ28uZ2lmPC9zYW1wPiBmcm9tIHRoZSBjbGFzc3BhdGg8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm9ncmVzc3JlZ2V4cDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Qcm9ncmVzcyByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggaXMgdXNlZCB0bwotICAgICAgcGFyc2UgdGhlIG91dHB1dCBhbmQgZGlnIG91dCBjdXJyZW50IHByb2dyZXNzLiBFeGFjdGx5IG9uZSBncm91cAotICAgICAgcGF0dGVybiBtdXN0IGV4aXN0cywgYW5kIGl0IHJlcHJlc2VudHMgdGhlIHByb2dyZXNzIG51bWJlciAoMC0xMDApCi0gICAgICAoaS5lICJQcm9ncmVzczogKC4qKSUiKTxici8+Ci0gICAgICA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPnByb2dyZXNzIGlzIGluY3JlYXNlZCBldmVyeSBhY3Rpb24KLSAgICAgIGFuZCBsb2cgb3V0cHV0IGxpbmU8L3RkPgorICAgIDx0ZD5zaG93ZHVyYXRpb248L3RkPgorICAgIDx0ZD5Jbml0aWFsIHBlcmlvZCB0byBwYXVzZSB0aGUgYnVpbGQgdG8gc2hvdyB0aGUgc3BsYXNoIGluIG1pbGxpc2Vjb25kcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+NTAwMDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXNwbGF5dGV4dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kaXNwbGF5IHRleHQgcHJlc2VudGVkIGluIHRoZSBzcGxhc2ggd2luZG93PGJyLz4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5CdWlsZGluZyAuLi48L3RkPgorICAgIDx0ZD5wcm9ncmVzc3JlZ2V4cDwvdGQ+CisgICAgPHRkPlByb2dyZXNzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyB1c2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgYW5kIGRpZyBvdXQgY3VycmVudAorICAgICAgcHJvZ3Jlc3MuIEV4YWN0bHkgb25lIGdyb3VwIHBhdHRlcm4gbXVzdCBleGlzdHMsIGFuZCBpdCByZXByZXNlbnRzIHRoZSBwcm9ncmVzcyBudW1iZXIgKDAtMTAwKQorICAgICAgKGkuZSA8cT5Qcm9ncmVzczogKC4qKSU8L3E+KTxici8+PGVtPnNpbmNlIEFwYWNoZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBwcm9ncmVzcyBpbmNyZWFzZSB3aXRoIGV2ZXJ5IGFjdGlvbiBhbmQgbG9nZ2VkIG91dHB1dCBsaW5lPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kaXNwbGF5dGV4dDwvdGQ+CisgICAgPHRkPmRpc3BsYXkgdGV4dCBwcmVzZW50ZWQgaW4gdGhlIHNwbGFzaCB3aW5kb3c8YnIvPjxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cSBjbGFzcz0ibm8tYnJlYWsiPkJ1aWxkaW5nIC4uLjwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5EZXByZWNhdGVkIHByb3BlcnRpZXM8L2gzPgogCi1UaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwcm94eSBzZXR0aW5ncyB0byByZXRyaWV2ZQotYW4gaW1hZ2UgZnJvbSBiZWhpbmQgYSBmaXJld2FsbC4gSG93ZXZlciwgdGhlIHNldHRpbmdzIGFwcGx5IG5vdCBqdXN0IHRvIHRoaXMKLXRhc2ssIGJ1dCB0byBhbGwgZm9sbG93aW5nIHRhc2tzLiBUaGVyZWZvcmUgdGhleSBhcmUgbm93IGRlcHJlY2F0ZWQgaW4gCi1wcmVmZXJlbmNlIHRvIHRoZSA8Y29kZT4mbHQ7c2V0cHJveHkmZ3Q7PC9jb2RlPiB0YXNrLCB0aGF0IG1ha2VzIGl0IGNsZWFyIHRvIHJlYWRlcnMgb2YKLXRoZSBidWlsZCBleGFjdGx5IHdoYXQgaXMgZ29pbmcgb24uCis8cD5UaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBwcm94eSBzZXR0aW5ncyB0byByZXRyaWV2ZSBhbiBpbWFnZSBmcm9tCitiZWhpbmQgYSBmaXJld2FsbC4gSG93ZXZlciwgdGhlIHNldHRpbmdzIGFwcGx5IG5vdCBqdXN0IHRvIHRoaXMgdGFzaywgYnV0IHRvIGFsbCBmb2xsb3dpbmcKK3Rhc2tzLiBUaGVyZWZvcmUgdGhleSBhcmUgbm93IGRlcHJlY2F0ZWQgaW4gcHJlZmVyZW5jZSB0byB0aGUgPGNvZGU+Jmx0O3NldHByb3h5Jmd0OzwvY29kZT4gdGFzaywKK3RoYXQgbWFrZXMgaXQgY2xlYXIgdG8gcmVhZGVycyBvZiB0aGUgYnVpbGQgZXhhY3RseSB3aGF0IGlzIGdvaW5nIG9uLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXByb3h5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVzZSBhIHByb3h5IHRvIGFjY2VzcyBpbWd1cmwuIE5vdGU6IE9ubHkgdGVzdGVkCi0gICAgb24gSkRLIDEuMi4yIGFuZCBhYm92ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Ob25lPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3h5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPklQIG9yIGhvc3RuYW1lIG9mIHRoZSBwcm94eSBzZXJ2ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm9uZTwvdGQ+CisgICAgPHRkPnVzZXByb3h5PC90ZD4KKyAgICA8dGQ+VXNlIGEgcHJveHkgdG8gYWNjZXNzIDx2YXI+aW1ndXJsPC92YXI+Ljxici8+Tm90ZTogT25seSB0ZXN0ZWQgb24gSkRLIDEuMi4yIGFuZCBhYm92ZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Qcm94eSBwb3J0bnVtYmVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vbmU8L3RkPgorICAgIDx0ZD5wcm94eTwvdGQ+CisgICAgPHRkPklQIG9yIGhvc3RuYW1lIG9mIHRoZSBwcm94eSBzZXJ2ZXI8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VXNlciB0byBhdXRoZW50aWNhdGUgdG8gdGhlIHByb3h5IGFzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Ob25lPC90ZD4KLQorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+UHJveHkgcG9ydCBudW1iZXI8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlByb3h5IHBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vbmU8L3RkPgorICAgIDx0ZD51c2VyPC90ZD4KKyAgICA8dGQ+VXNlciB0byBhdXRoZW50aWNhdGUgdG8gdGhlIHByb3h5IGFzPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgotCisgIDx0cj4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5Qcm94eSBwYXNzd29yZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KIDwvdGFibGU+Ci08aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtzcGxhc2gvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+U3BsYXNoIDxjb2RlPmltYWdlcy9hbnRfbG9nb19sYXJnZS5naWY8L2NvZGU+IGZyb20gdGhlIGNsYXNzcGF0aC48L3A+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O3NwbGFzaCBpbWFnZXVybD0mcXVvdDtodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmJnF1b3Q7Ci0gICAgICAgICAgIHVzZXByb3h5PSZxdW90O3RydWUmcXVvdDsKLSAgICAgICAgICAgc2hvd2R1cmF0aW9uPSZxdW90OzUwMDAmcXVvdDsvJmd0OwogCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5TcGxhc2hlcyB0aGUgamFrYXJ0YSBsb2dvLCBmb3IgYW4gaW5pdGlhbCBwZXJpb2Qgb2YgNSBzZWNvbmRzLjwvcD4KKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlNwbGFzaCA8c2FtcD5pbWFnZXMvYW50X2xvZ29fbGFyZ2UuZ2lmPC9zYW1wPiBmcm9tIHRoZSBjbGFzc3BhdGguPC9wPgorPHByZT4mbHQ7c3BsYXNoLyZndDs8L3ByZT4KKworPHA+U3BsYXNoIHRoZSBKYWthcnRhIGxvZ28sIGZvciBhbiBpbml0aWFsIHBlcmlvZCBvZiA1IHNlY29uZHMuPC9wPgorPHByZT4KKyZsdDtzcGxhc2ggaW1hZ2V1cmw9JnF1b3Q7aHR0cHM6Ly9qYWthcnRhLmFwYWNoZS5vcmcvaW1hZ2VzL2pha2FydGEtbG9nby5naWYmcXVvdDsKKyAgICAgICAgdXNlcHJveHk9JnF1b3Q7dHJ1ZSZxdW90OworICAgICAgICBzaG93ZHVyYXRpb249JnF1b3Q7NTAwMCZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDxwPlNwbGFzaCB3aXRoIGNvbnRyb2xsZWQgcHJvZ3Jlc3MgYW5kIG5vbmRlZmF1bHQgdGV4dDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgICAgICZsdDt0YXJnZXQgbmFtZT0idGVzdF9uZXdfZmVhdHVyZXMiJmd0OwotICAgICAgICAgICAgICAgICZsdDtlY2hvJmd0O05ldyBmZWF0dXJlcyZsdDsvZWNobyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7c3BsYXNoIHByb2dyZXNzUmVnRXhwPSJQcm9ncmVzczogKC4qKSUiIHNob3dkdXJhdGlvbj0iMCIgZGlzcGxheVRleHQ9IlRlc3QgdGV4dCIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtzbGVlcCBzZWNvbmRzPSIxIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2VjaG8mZ3Q7UHJvZ3Jlc3M6IDEwJSZsdDsvZWNobyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtlY2hvJmd0O1Byb2dyZXNzOiAyMCUmbHQ7L2VjaG8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3NsZWVwIHNlY29uZHM9IjEiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZWNobyZndDtQcm9ncmVzczogNTAlJmx0Oy9lY2hvJmd0OwotICAgICAgICAgICAgICAgICZsdDtzbGVlcCBzZWNvbmRzPSIxIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2VjaG8mZ3Q7UHJvZ3Jlc3M6IDcwJSZsdDsvZWNobyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtlY2hvJmd0O1Byb2dyZXNzOiAxMDAlJmx0Oy9lY2hvJmd0OwotICAgICAgICAgICAgICAgICZsdDtzbGVlcCBzZWNvbmRzPSIzIi8mZ3Q7Ci0gICAgICAgICZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KKzxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9InRlc3RfbmV3X2ZlYXR1cmVzIiZndDsKKyAgICAmbHQ7ZWNobyZndDtOZXcgZmVhdHVyZXMmbHQ7L2VjaG8mZ3Q7CisgICAgJmx0O3NwbGFzaCBwcm9ncmVzc1JlZ0V4cD0iUHJvZ3Jlc3M6ICguKiklIiBzaG93ZHVyYXRpb249IjAiIGRpc3BsYXlUZXh0PSJUZXN0IHRleHQiLyZndDsKKyAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMSIvJmd0OworICAgICZsdDtlY2hvJmd0O1Byb2dyZXNzOiAxMCUmbHQ7L2VjaG8mZ3Q7CisgICAgJmx0O3NsZWVwIHNlY29uZHM9IjEiLyZndDsKKyAgICAmbHQ7ZWNobyZndDtQcm9ncmVzczogMjAlJmx0Oy9lY2hvJmd0OworICAgICZsdDtzbGVlcCBzZWNvbmRzPSIxIi8mZ3Q7CisgICAgJmx0O2VjaG8mZ3Q7UHJvZ3Jlc3M6IDUwJSZsdDsvZWNobyZndDsKKyAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMSIvJmd0OworICAgICZsdDtlY2hvJmd0O1Byb2dyZXNzOiA3MCUmbHQ7L2VjaG8mZ3Q7CisgICAgJmx0O3NsZWVwIHNlY29uZHM9IjEiLyZndDsKKyAgICAmbHQ7ZWNobyZndDtQcm9ncmVzczogMTAwJSZsdDsvZWNobyZndDsKKyAgICAmbHQ7c2xlZXAgc2Vjb25kcz0iMyIvJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3NxbC5odG1sIGIvbWFudWFsL1Rhc2tzL3NxbC5odG1sCmluZGV4IGJhZGU1OTAuLmJhMmMwNGIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zcWwuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvc3FsLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0NTQgKzE1LDM5NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlNRTCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIDxib2R5PgogCi08aDI+PGEgbmFtZT0ic3FsIj5TcWw8L2E+PC9oMj4KKzxoMiBpZD0ic3FsIj5TcWw8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkV4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHZpYSBKREJDIHRvIGEgZGF0YWJhc2UuIFN0YXRlbWVudHMgY2FuIAotZWl0aGVyIGJlIHJlYWQgaW4gZnJvbSBhIHRleHQgZmlsZSB1c2luZyB0aGUgPGk+c3JjPC9pPiBhdHRyaWJ1dGUgb3IgZnJvbSAKLWJldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwgdGFncy48L3A+Cis8cD5FeGVjdXRlcyBhIHNlcmllcyBvZiBTUUwgc3RhdGVtZW50cyB2aWEgSkRCQyB0byBhIGRhdGFiYXNlLiBTdGF0ZW1lbnRzIGNhbiBlaXRoZXIgYmUgcmVhZCBpbiBmcm9tCithIHRleHQgZmlsZSB1c2luZyB0aGUgPHZhcj5zcmM8L3Zhcj4gYXR0cmlidXRlIG9yIGZyb20gYmV0d2VlbiB0aGUgZW5jbG9zaW5nIFNRTCB0YWdzLjwvcD4KIAotPHA+TXVsdGlwbGUgc3RhdGVtZW50cyBjYW4gYmUgcHJvdmlkZWQsIHNlcGFyYXRlZCBieSBzZW1pY29sb25zIChvciB0aGUgCi1kZWZpbmVkIDxpPmRlbGltaXRlcjwvaT4pLiBJbmRpdmlkdWFsIGxpbmVzIHdpdGhpbiB0aGUgc3RhdGVtZW50cyBjYW4gYmUgCi1jb21tZW50ZWQgdXNpbmcgZWl0aGVyIC0tLCAvLyBvciBSRU0gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLjwvcD4KKzxwPk11bHRpcGxlIHN0YXRlbWVudHMgY2FuIGJlIHByb3ZpZGVkLCBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9ucyAob3IgdGhlCitkZWZpbmVkIDx2YXI+ZGVsaW1pdGVyPC92YXI+KS4gSW5kaXZpZHVhbCBsaW5lcyB3aXRoaW4gdGhlIHN0YXRlbWVudHMgY2FuIGJlIGNvbW1lbnRlZCB1c2luZworZWl0aGVyIDxxPi0tPC9xPiwgPHE+Ly88L3E+IG9yIDxxPlJFTTwvcT4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLjwvcD4KIAotPHA+VGhlIDxpPmF1dG9jb21taXQ8L2k+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciBhdXRvLWNvbW1pdCBzaG91bGQgYmUgCi10dXJuZWQgb24gb3Igb2ZmIHdoaWxzdCBleGVjdXRpbmcgdGhlIHN0YXRlbWVudHMuIElmIGF1dG8tY29tbWl0IGlzIHR1cm5lZCAKLW9uIGVhY2ggc3RhdGVtZW50IHdpbGwgYmUgZXhlY3V0ZWQgYW5kIGNvbW1pdHRlZC4gSWYgaXQgaXMgdHVybmVkIG9mZiB0aGUgCi1zdGF0ZW1lbnRzIHdpbGwgYWxsIGJlIGV4ZWN1dGVkIGFzIG9uZSB0cmFuc2FjdGlvbi48L3A+Cis8cD5UaGUgPHZhcj5hdXRvY29tbWl0PC92YXI+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgd2hldGhlciBhdXRvLWNvbW1pdCBzaG91bGQgYmUgdHVybmVkIG9uIG9yIG9mZgord2hpbHN0IGV4ZWN1dGluZyB0aGUgc3RhdGVtZW50cy4gSWYgYXV0by1jb21taXQgaXMgdHVybmVkIDxxPm9uPC9xPiBlYWNoIHN0YXRlbWVudCB3aWxsIGJlIGV4ZWN1dGVkCithbmQgY29tbWl0dGVkLiBJZiBpdCBpcyB0dXJuZWQgPHE+b2ZmPC9xPiB0aGUgc3RhdGVtZW50cyB3aWxsIGFsbCBiZSBleGVjdXRlZCBhcyBvbmUKK3RyYW5zYWN0aW9uLjwvcD4KIAotPHA+VGhlIDxpPm9uZXJyb3I8L2k+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgaG93IHRvIHByb2NlZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgCi1kdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiBvbmUgb2YgdGhlIHN0YXRlbWVudHMuIAotVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IDxiPmNvbnRpbnVlPC9iPiBleGVjdXRpb24sIG9ubHkgc2hvdyB0aGUgZXJyb3I7Ci08Yj5zdG9wPC9iPiBleGVjdXRpb24sIGxvZyB0aGUgZXJyb3IgYnV0IGRvbid0IGZhaWwgdGhlIHRhc2sKLWFuZCA8Yj5hYm9ydDwvYj4gZXhlY3V0aW9uIGFuZCB0cmFuc2FjdGlvbiBhbmQgZmFpbCB0YXNrLjwvcD4KKzxwPlRoZSA8dmFyPm9uZXJyb3I8L3Zhcj4gYXR0cmlidXRlIHNwZWNpZmllcyBob3cgdG8gcHJvY2VlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlCitleGVjdXRpb24gb2Ygb25lIG9mIHRoZSBzdGF0ZW1lbnRzLiAgVGhlIHBvc3NpYmxlIHZhbHVlcyBhcmU6IDxxPmNvbnRpbnVlPC9xPiBleGVjdXRpb24sIG9ubHkgc2hvdwordGhlIGVycm9yOyA8cT5zdG9wPC9xPiBleGVjdXRpb24sIGxvZyB0aGUgZXJyb3IgYnV0IGRvbid0IGZhaWwgdGhlIHRhc2sgYW5kIDxxPmFib3J0PC9xPiBleGVjdXRpb24KK2FuZCB0cmFuc2FjdGlvbiBhbmQgZmFpbCB0YXNrLjwvcD4KIAotPHA+Ci08Yj5Qcm94aWVzPC9iPi4gU29tZSBKREJDIGRyaXZlcnMgKGluY2x1ZGluZyB0aGUgT3JhY2xlIHRoaW4gZHJpdmVyKSwgCi0gICAgdXNlIHRoZSBKVk0ncyBwcm94eSBzZXR0aW5ncyB0byByb3V0ZSB0aGVpciBKREJDIG9wZXJhdGlvbnMgdG8gdGhlIGRhdGFiYXNlLgotICAgIFNpbmNlIEFwYWNoZSBBbnQxLjcsIEFudCBydW5uaW5nIG9uIEphdmExLjUgb3IgbGF0ZXIgZGVmYXVsdHMgdG8gCi0gICAgPGEgaHJlZj0iLi4vcHJveHkuaHRtbCI+dXNpbmcKLSAgICB0aGUgcHJveHkgc2V0dGluZ3Mgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW08L2E+LiAKLSAgICBBY2NvcmRpbmdseSwgdGhlIE9TIHByb3h5IHNldHRpbmdzIG5lZWQgdG8gYmUgdmFsaWQsIG9yIEFudCdzIHByb3h5Ci0gICAgc3VwcG9ydCBkaXNhYmxlZCB3aXRoIDxjb2RlPi1ub3Byb3h5PC9jb2RlPiBvcHRpb24uCi08L3A+Cis8cD48c3Ryb25nPlByb3hpZXM8L3N0cm9uZz4uIFNvbWUgSkRCQyBkcml2ZXJzIChpbmNsdWRpbmcgdGhlIE9yYWNsZSB0aGluIGRyaXZlciksIHVzZSB0aGUgSlZNJ3MKK3Byb3h5IHNldHRpbmdzIHRvIHJvdXRlIHRoZWlyIEpEQkMgb3BlcmF0aW9ucyB0byB0aGUgZGF0YWJhc2UuICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPiwgQW50CitydW5uaW5nIG9uIEphdmEgNSBvciBsYXRlciBkZWZhdWx0cyB0byA8YSBocmVmPSIuLi9wcm94eS5odG1sIj51c2luZyB0aGUgcHJveHkgc2V0dGluZ3Mgb2YgdGhlCitvcGVyYXRpbmcgc3lzdGVtPC9hPi4gIEFjY29yZGluZ2x5LCB0aGUgT1MgcHJveHkgc2V0dGluZ3MgbmVlZCB0byBiZSB2YWxpZCwgb3IgQW50J3MgcHJveHkgc3VwcG9ydAorZGlzYWJsZWQgd2l0aCA8a2JkPi1ub3Byb3h5PC9rYmQ+IG9wdGlvbi48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5kcml2ZXI8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNsYXNzIG5hbWUgb2YgdGhlIGpkYmMgZHJpdmVyPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj51cmw8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkRhdGFiYXNlIGNvbm5lY3Rpb24gdXJsPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj51c2VyaWQ8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkRhdGFiYXNlIHVzZXIgbmFtZTwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+cGFzc3dvcmQ8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkRhdGFiYXNlIHBhc3N3b3JkPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkZpbGUgY29udGFpbmluZyBTUUwgc3RhdGVtZW50czwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+WWVzLCB1bmxlc3Mgc3RhdGVtZW50cyBlbmNsb3NlZCB3aXRoaW4gdGFnczwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGVzIGNvbnRhaW5pbmcgU1FMIHN0YXRlbWVudHM8L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBlbmNvZGluZzwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgdmFsaWduPSJ0b3AiPm91dHB1dGVuY29kaW5nPC90ZD4KLSAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGVzIGhvbGRpbmcKLSAgICByZXN1bHRzLiAgPGVtPnNpbmNlIDEuOS40PC9lbTwvdGQ+Ci0gIDx0ZCBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGVuY29kaW5nPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+ZGVsaW1pdGVyPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5TdHJpbmcgdGhhdCBzZXBhcmF0ZXMgU1FMIHN0YXRlbWVudHM8L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90OzsmcXVvdDs8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5hdXRvY29tbWl0PC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5BdXRvIGNvbW1pdCBmbGFnIGZvciBkYXRhYmFzZSBjb25uZWN0aW9uIChkZWZhdWx0IGZhbHNlKTwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgJnF1b3Q7ZmFsc2UmcXVvdDs8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5wcmludDwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+UHJpbnQgcmVzdWx0IHNldHMgZnJvbSB0aGUgc3RhdGVtZW50cyAoZGVmYXVsdCBmYWxzZSk8L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O2ZhbHNlJnF1b3Q7PC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+c2hvd2hlYWRlcnM8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlByaW50IGhlYWRlcnMgZm9yIHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHMgKGRlZmF1bHQgdHJ1ZSk8L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDs8L3RkPgotPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5zaG93dHJhaWxlcnM8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlByaW50IHRyYWlsZXIgZm9yIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIChkZWZhdWx0IHRydWUpPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDt0cnVlJnF1b3Q7PC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5PdXRwdXQgZmlsZSBmb3IgcmVzdWx0IHNldHMgKGRlZmF1bHRzIHRvIFN5c3RlbS5vdXQpCi0gICAgPGI+U2luY2UgQW50IDEuODwvYj4gY2FuIHNwZWNpZnkgYW55IFJlc291cmNlIHRoYXQgc3VwcG9ydHMgb3V0cHV0IChzZWUKLSAgICA8YSBocmVmPSIuLi9kZXZlbG9wLmh0bWwjc2V0LW1hZ2ljIj5ub3RlPC9hPikuCi0gIDwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKHByaW50IHRvIFN5c3RlbS5vdXQgYnkgZGVmYXVsdCk8L3RkPgotPC90cj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIG91dHB1dCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXRlCi0gICAgYW4gZXhpc3RpbmcgZmlsZS4gIERlZmF1bHRzIHRvIGZhbHNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgaWdub3JlZCBpZiA8aT5vdXRwdXQ8L2k+IGRvZXMgbm90Ci0gICAgICBzcGVjaWZ5IGEgZmlsZXN5c3RlbSBkZXN0aW5hdGlvbi48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNsYXNzcGF0aCB1c2VkIHRvIGxvYWQgZHJpdmVyPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAodXNlIHN5c3RlbSBjbGFzc3BhdGgpPC90ZD4KLTwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKHVzZSBzeXN0ZW0gY2xhc3NwYXRoKTwvdGQ+CisgICAgPHRkPmRyaXZlcjwvdGQ+CisgICAgPHRkPkNsYXNzIG5hbWUgb2YgdGhlIGpkYmMgZHJpdmVyPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5vbmVycm9yPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5BY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN0YXRlbWVudCBmYWlsczogY29udGludWUsIHN0b3AsIGFib3J0PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAmcXVvdDthYm9ydCZxdW90OzwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnJkYm1zPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5FeGVjdXRlIHRhc2sgb25seSBpZiB0aGlzIHJkYm1zPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAobm8gcmVzdHJpY3Rpb24pPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+dmVyc2lvbjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+RXhlY3V0ZSB0YXNrIG9ubHkgaWYgcmRibXMgdmVyc2lvbiBtYXRjaDwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKG5vIHJlc3RyaWN0aW9uKTwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmNhY2hpbmc8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPlNob3VsZCB0aGUgdGFzayBjYWNoZSBsb2FkZXJzIGFuZCB0aGUgZHJpdmVyPzwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ9dHJ1ZSk8L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmRlbGltaXRlcnR5cGU8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNvbnRyb2wgd2hldGhlciB0aGUgZGVsaW1pdGVyIHdpbGwgb25seSBiZSByZWNvZ25pemVkIG9uIGEgbGluZSBieSBpdHNlbGYuPGJyPgotICAgIENhbiBiZSAibm9ybWFsIiAtYW55d2hlcmUgb24gdGhlIGxpbmUsIG9yICJyb3ciLCBtZWFuaW5nIGl0IG11c3QgYmUgb24gYSBsaW5lIGJ5IGl0c2VsZjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ6bm9ybWFsKTwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+a2VlcGZvcm1hdDwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+Q29udHJvbCB3aGV0aGVyIHRoZSBmb3JtYXQgb2YgdGhlIHNxbCB3aWxsIGJlIHByZXNlcnZlZC48YnI+Ci0gICAgVXNlZnVsIHdoZW4gbG9hZGluZyBwYWNrYWdlcyBhbmQgcHJvY2VkdXJlcy4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAoZGVmYXVsdD1mYWxzZSk8L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmVzY2FwZXByb2Nlc3Npbmc8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPkNvbnRyb2wgd2hldGhlciB0aGUgSmF2YSBzdGF0ZW1lbnQKLSAgICBvYmplY3Qgd2lsbCBwZXJmb3JtIGVzY2FwZSBzdWJzdGl0dXRpb24uPGJyPgotICAgIFNlZSA8YQotICAgIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS9zcWwvU3RhdGVtZW50Lmh0bWwjc2V0RXNjYXBlUHJvY2Vzc2luZyUyOGJvb2xlYW4lMjkiPlN0YXRlbWVudCdzCi0gICAgQVBJIGRvY3M8L2E+IGZvciBkZXRhaWxzLiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPi4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObyAoZGVmYXVsdD10cnVlKTwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+ZXhwYW5kcHJvcGVydGllczwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+U2V0IHRvIHRydWUgdG8gdHVybiBvbiBwcm9wZXJ0eSBleHBhbnNpb24gaW4KLSAgbmVzdGVkIFNRTCwgaW5saW5lIGluIHRoZSB0YXNrIG9yIG5lc3RlZCB0cmFuc2FjdGlvbnMuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4uCi0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8gKGRlZmF1bHQ9dHJ1ZSk8L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnJhd2Jsb2JzPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5JZiB0cnVlLCB3aWxsIHdyaXRlIHJhdyBzdHJlYW1zIHJhdGhlciB0aGFuIGhleCBlbmNvZGluZyB3aGVuCi0gICAgcHJpbnRpbmcgQkxPQiByZXN1bHRzLiA8ZW0+U2luY2UgQW50IDEuNy4xPC9lbT4uPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+ZmFpbE9uQ29ubmVjdGlvbkVycm9yPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5JZiBmYWxzZSwgd2lsbCBvbmx5IHByaW50IGEgd2FybmluZwotICAgIG1lc3NhZ2UgYW5kIG5vdCBleGVjdXRlIGFueSBzdGF0ZW1lbnQgaWYgdGhlIHRhc2sgZmFpbHMgdG8gY29ubmVjdAotICAgIHRvIHRoZSBkYXRhYmFzZS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnN0cmljdERlbGltaXRlck1hdGNoaW5nPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5JZiBmYWxzZSwgZGVsaW1pdGVycyB3aWxsIGJlIHNlYXJjaGVkCi0gICAgZm9yIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBtYW5uZXIgKGkuZS4gZGVsaW1pdGVyPSJnbyIgbWF0Y2hlcyAiR08iKQotICAgIGFuZCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHdpbGwgYmUgaWdub3JlZCAoZGVsaW1pdGVyPSJnbyIgbWF0Y2hlcwotICAgICJHTyAiKS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IDxlbT50cnVlPC9lbT48L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPnNob3dXYXJuaW5nczwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+SWYgdHJ1ZSwgU1FMV2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgYXQKLSAgICB0aGUgV0FSTiBsZXZlbC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48YnIvPgotICAgIDxiPk5vdGU6PC9iPiBldmVuIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IHRvIGZhbHNlLCB3YXJuaW5ncyB0aGF0Ci0gICAgYXBwbHkgdG8gdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBsb2dnZWQgYXQgdGhlIHZlcmJvc2UgbGV2ZWwuPC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8ZW0+ZmFsc2U8L2VtPjwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+dHJlYXRXYXJuaW5nc0FzRXJyb3JzPC90ZD4KLSAgPHRkIHdpZHRoPSI3OCUiIHZhbGlnbj0idG9wIj5JZiB0cnVlLCBTUUxXYXJuaW5ncyB3aWxsIGJlIHRyZWF0ZWQKLSAgICBsaWtlIGVycm9ycyAtIGFuZCB0aGUgbG9naWMgc2VsZWN0ZWQgdmlhIHRoZSBvbkVycm9yIGF0dHJpYnV0ZQotICAgIGFwcGxpZXMuCi0gICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGVtPmZhbHNlPC9lbT48L3RkPgotPC90cj4KLQotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPmNzdkNvbHVtblNlcGFyYXRvcjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+VGhlIGNvbHVtbiBzZXBhcmF0b3IgdXNlZCB3aGVuIHByaW50aW5nCi0gICAgdGhlIHJlc3VsdHMuCi0gICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGVtPicsJzwvZW0+PC90ZD4KLTwvdHI+Ci0KLTx0cj4KLSAgPHRkIHdpZHRoPSIxMiUiIHZhbGlnbj0idG9wIj5jc3ZRdW90ZUNoYXJhY3RlcjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+VGhlIGNoYXJhY3RlciB1c2VkIHRvIHF1b3RlIGNvbHVtbgotICAgIHZhbHVlcy48YnIvPgotICAgIElmIHNldCwgY29sdW1ucyB0aGF0IGNvbnRhaW4gZWl0aGVyIHRoZSBjb2x1bW4gc2VwYXJhdG9yIG9yIHRoZQotICAgIHF1b3RlIGNoYXJhY3RlciBpdHNlbGYgd2lsbCBiZSBzdXJyb3VuZGVkIGJ5IHRoZSBxdW90ZSBjaGFyYWN0ZXIuCi0gICAgVGhlIHF1b3RlIGNoYXJhY3RlciBpdHNlbGYgd2lsbCBiZSBkb3VibGVkIGlmIGl0IGFwcGVhcnMgaW5zaWRlIG9mCi0gICAgdGhlIGNvbHVtbidzIHZhbHVlLjxici8+Ci0gICAgPGI+Tm90ZTo8L2I+IEJMT0IgdmFsdWVzIHdpbGwgbmV2ZXIgYmUgcXVvdGVkLgotICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICA8dGQgd2lkdGg9IjEwJSIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIG5vdCBzZXQgKGkuZS4gbm8gcXVvdGluZwotICAgIGV2ZXIgb2NjdXJzKTwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+Zm9yY2VDc3ZRdW90ZUNoYXI8L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPklmIHRydWUsIHF1b3RpbmcgYWx3YXlzIG9jY3VyczwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgbm90IHNldCAoaS5lLiBxdW90aW5nCi0gICAgb2NjdXJzIG9ubHkgd2hlcmUgbmVlZGVkKTwvdGQ+Ci08L3RyPgotCi08dHI+Ci0gIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jwcm9wZXJ0eTwvdGQ+Ci0gIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuCi0gICAgZXJyb3IuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB2YWxpZ249InRvcCI+d2FybmluZ3Byb3BlcnR5PC90ZD4KLSAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4KLSAgICB3YXJuaW5nLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgdmFsaWduPSJ0b3AiPnJvd2NvdW50cHJvcGVydHk8L3RkPgotICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IHRvIHRoZSBudW1iZXIgb2Ygcm93cwotICAgIHVwZGF0ZWQgYnkgdGhlIGZpcnN0IHN0YXRlbWVudC90cmFuc2FjdGlvbiB0aGF0IGFjdHVhbGx5IHJldHVybmVkCi0gICAgYSByb3cgY291bnQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLTwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dXJsPC90ZD4KKyAgICA8dGQ+RGF0YWJhc2UgY29ubmVjdGlvbiBVUkw8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnVzZXJpZDwvdGQ+CisgICAgPHRkPkRhdGFiYXNlIHVzZXIgbmFtZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5EYXRhYmFzZSBwYXNzd29yZDwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3JjPC90ZD4KKyAgICA8dGQ+RmlsZSBjb250YWluaW5nIFNRTCBzdGF0ZW1lbnRzPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3Mgc3RhdGVtZW50cyBlbmNsb3NlZCB3aXRoaW4gdGFnczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGVzIGNvbnRhaW5pbmcgU1FMIHN0YXRlbWVudHM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vdXRwdXRlbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZXMgaG9sZGluZyByZXN1bHRzLiAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVsaW1pdGVyPC90ZD4KKyAgICA8dGQ+U3RyaW5nIHRoYXQgc2VwYXJhdGVzIFNRTCBzdGF0ZW1lbnRzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjs7PC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+YXV0b2NvbW1pdDwvdGQ+CisgICAgPHRkPkF1dG8gY29tbWl0IGZsYWcgZm9yIGRhdGFiYXNlIGNvbm5lY3Rpb248L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5wcmludDwvdGQ+CisgICAgPHRkPlByaW50IHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zaG93aGVhZGVyczwvdGQ+CisgICAgPHRkPlByaW50IGhlYWRlcnMgZm9yIHJlc3VsdCBzZXRzIGZyb20gdGhlIHN0YXRlbWVudHM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNob3d0cmFpbGVyczwvdGQ+CisgICAgPHRkPlByaW50IHRyYWlsZXIgZm9yIG51bWJlciBvZiByb3dzIGFmZmVjdGVkPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vdXRwdXQ8L3RkPgorICAgIDx0ZD5PdXRwdXQgZmlsZSBmb3IgcmVzdWx0IHNldHMuICA8ZW0+U2luY2UgQW50IDEuODwvZW0+IGNhbiBzcGVjaWZ5IGFueSBSZXNvdXJjZSB0aGF0IHN1cHBvcnRzCisgICAgICBvdXRwdXQgKHNlZSA8YSBocmVmPSIuLi9kZXZlbG9wLmh0bWwjc2V0LW1hZ2ljIj5ub3RlPC9hPikuPC90ZD4KKyAgICA8dGQ+Tm87IHByaW50IHRvIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IGJ5IGRlZmF1bHQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmFwcGVuZDwvdGQ+CisgICAgPHRkPndoZXRoZXIgb3V0cHV0IHNob3VsZCBiZSBhcHBlbmRlZCB0byBvciBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgZmlsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+LCBpZ25vcmVkIGlmIDx2YXI+b3V0cHV0PC92YXI+IGRvZXMgbm90IHNwZWNpZnkgYSBmaWxlc3lzdGVtCisgICAgICBkZXN0aW5hdGlvbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+Q2xhc3NwYXRoIHVzZWQgdG8gbG9hZCBkcml2ZXI8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gc3lzdGVtIGNsYXNzcGF0aDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aAorICAgICAgZGVmaW5lZCBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHN5c3RlbSBjbGFzc3BhdGg8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm9uZXJyb3I8L3RkPgorICAgIDx0ZD5BY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN0YXRlbWVudCBmYWlsczogPHE+Y29udGludWU8L3E+LCA8cT5zdG9wPC9xPiwgPHE+YWJvcnQ8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmFib3J0PC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cmRibXM8L3RkPgorICAgIDx0ZD5FeGVjdXRlIHRhc2sgb25seSBpZiB0aGlzIHJkYm1zPC90ZD4KKyAgICA8dGQ+Tm87IHVucmVzdHJpY3RlZCBieSBkZWZhdWx0PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+RXhlY3V0ZSB0YXNrIG9ubHkgaWYgcmRibXMgdmVyc2lvbiBtYXRjaDwvdGQ+CisgICAgPHRkPk5vOyB1bnJlc3RyaWN0ZWQgYnkgZGVmYXVsdDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2FjaGluZzwvdGQ+CisgICAgPHRkPlNob3VsZCB0aGUgdGFzayBjYWNoZSBsb2FkZXJzIGFuZCB0aGUgZHJpdmVyPzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVsaW1pdGVydHlwZTwvdGQ+CisgICAgPHRkPkNvbnRyb2wgd2hldGhlciB0aGUgZGVsaW1pdGVyIHdpbGwgb25seSBiZSByZWNvZ25pemVkIG9uIGEgbGluZSBieSBpdHNlbGYuPGJyLz5DYW4KKyAgICAgIGJlIDxxPm5vcm1hbDwvcT4mbWRhc2g7YW55d2hlcmUgb24gdGhlIGxpbmUsIG9yIDxxPnJvdzwvcT4sIG1lYW5pbmcgaXQgbXVzdCBiZSBvbiBhIGxpbmUgYnkKKyAgICAgIGl0c2VsZjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ub3JtYWw8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5rZWVwZm9ybWF0PC90ZD4KKyAgICA8dGQ+Q29udHJvbCB3aGV0aGVyIHRoZSBmb3JtYXQgb2YgU1FMIHdpbGwgYmUgcHJlc2VydmVkLjxici8+VXNlZnVsIHdoZW4gbG9hZGluZyBwYWNrYWdlcyBhbmQKKyAgICAgIHByb2NlZHVyZXMuCisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVzY2FwZXByb2Nlc3Npbmc8L3RkPgorICAgIDx0ZD5Db250cm9sIHdoZXRoZXIgdGhlIEphdmEgc3RhdGVtZW50IG9iamVjdCB3aWxsIHBlcmZvcm0gZXNjYXBlIHN1YnN0aXR1dGlvbi48YnIvPgorICAgICAgU2VlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvc3FsL1N0YXRlbWVudC5odG1sI3NldEVzY2FwZVByb2Nlc3NpbmctYm9vbGVhbi0iCisgICAgICB0YXJnZXQ9Il90b3AiPlN0YXRlbWVudCdzIEFQSSBkb2NzPC9hPiBmb3IgZGV0YWlscy4gIDxlbT5TaW5jZSBBbnQgMS42PC9lbT4uCisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZXhwYW5kcHJvcGVydGllczwvdGQ+CisgICAgPHRkPlNldCB0byB0cnVlIHRvIHR1cm4gb24gcHJvcGVydHkgZXhwYW5zaW9uIGluIG5lc3RlZCBTUUwsIGlubGluZSBpbiB0aGUgdGFzayBvciBuZXN0ZWQKKyAgICAgIHRyYW5zYWN0aW9ucy4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPi4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yYXdibG9iczwvdGQ+CisgICAgPHRkPklmIDxxPnRydWU8L3E+LCB3aWxsIHdyaXRlIHJhdyBzdHJlYW1zIHJhdGhlciB0aGFuIGhleCBlbmNvZGluZyB3aGVuIHByaW50aW5nIEJMT0IKKyAgICAgIHJlc3VsdHMuIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsT25Db25uZWN0aW9uRXJyb3I8L3RkPgorICAgIDx0ZD5JZiA8cT5mYWxzZTwvcT4sIHdpbGwgb25seSBwcmludCBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgbm90IGV4ZWN1dGUgYW55IHN0YXRlbWVudCBpZiB0aGUgdGFzaworICAgICAgZmFpbHMgdG8gY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zdHJpY3REZWxpbWl0ZXJNYXRjaGluZzwvdGQ+CisgICAgPHRkPklmIDxxPmZhbHNlPC9xPiwgZGVsaW1pdGVycyB3aWxsIGJlIHNlYXJjaGVkIGZvciBpbiBhIGNhc2UtaW5zZW5zaXRpdmUgbWFubmVyCisgICAgICAoaS5lLiA8dmFyPmRlbGltaXRlcjwvdmFyPj08cT5nbzwvcT4gbWF0Y2hlcyA8cT5HTzwvcT4pIGFuZCBzdXJyb3VuZGluZyB3aGl0ZXNwYWNlIHdpbGwgYmUKKyAgICAgIGlnbm9yZWQgKDx2YXI+ZGVsaW1pdGVyPC92YXI+PTxxPmdvPC9xPiBtYXRjaGVzIDxxPkdPIDwvcT4pLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2hvd1dhcm5pbmdzPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIFNRTFdhcm5pbmdzIHdpbGwgYmUgbG9nZ2VkIGF0IHRoZSA8cT53YXJuaW5nPC9xPiBsZXZlbC4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IGV2ZW4gaWYgdGhlIGF0dHJpYnV0ZSBpcyBzZXQgdG8gPHE+ZmFsc2U8L3E+LCB3YXJuaW5ncworICAgICAgdGhhdCBhcHBseSB0byB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGxvZ2dlZCBhdCB0aGUgPHE+dmVyYm9zZTwvcT4gbGV2ZWwuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dHJlYXRXYXJuaW5nc0FzRXJyb3JzPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4sIFNRTFdhcm5pbmdzIHdpbGwgYmUgdHJlYXRlZCBsaWtlIGVycm9ycyZtZGFzaDthbmQgdGhlIGxvZ2ljIHNlbGVjdGVkIHZpYQorICAgICAgdGhlIDx2YXI+b25FcnJvcjwvdmFyPiBhdHRyaWJ1dGUgYXBwbGllcy4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jc3ZDb2x1bW5TZXBhcmF0b3I8L3RkPgorICAgIDx0ZD5UaGUgY29sdW1uIHNlcGFyYXRvciB1c2VkIHdoZW4gcHJpbnRpbmcgdGhlIHJlc3VsdHMuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPiw8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jc3ZRdW90ZUNoYXJhY3RlcjwvdGQ+CisgICAgPHRkPlRoZSBjaGFyYWN0ZXIgdXNlZCB0byBxdW90ZSBjb2x1bW4gdmFsdWVzLjxici8+SWYgc2V0LCBjb2x1bW5zIHRoYXQgY29udGFpbiBlaXRoZXIgdGhlCisgICAgICBjb2x1bW4gc2VwYXJhdG9yIG9yIHRoZSBxdW90ZSBjaGFyYWN0ZXIgaXRzZWxmIHdpbGwgYmUgc3Vycm91bmRlZCBieSB0aGUgcXVvdGUgY2hhcmFjdGVyLiAgVGhlCisgICAgICBxdW90ZSBjaGFyYWN0ZXIgaXRzZWxmIHdpbGwgYmUgZG91YmxlZCBpZiBpdCBhcHBlYXJzIGluc2lkZSBvZiB0aGUgY29sdW1uJ3MKKyAgICAgIHZhbHVlLjxici8+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBCTE9CIHZhbHVlcyB3aWxsIG5ldmVyIGJlIHF1b3RlZC4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgbm90IHNldCAoaS5lLiBubyBxdW90aW5nIGV2ZXIgb2NjdXJzKTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Zm9yY2VDc3ZRdW90ZUNoYXI8L3RkPgorICAgIDx0ZD5JZiA8cT50cnVlPC9xPiwgcXVvdGluZyBhbHdheXMgb2NjdXJzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgbm90IHNldCAoaS5lLiBxdW90aW5nIG9jY3VycyBvbmx5IHdoZXJlIG5lZWRlZCk8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IHRvIHNldCBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+d2FybmluZ3Byb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBzZXQgaW4gdGhlIGV2ZW50IG9mIGFuIHdhcm5pbmcuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cm93Y291bnRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgdG8gc2V0IHRvIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkIGJ5IHRoZSBmaXJzdAorICAgICAgc3RhdGVtZW50L3RyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgcmV0dXJuZWQgYSByb3cgY291bnQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND50cmFuc2FjdGlvbjwvaDQ+Ci08cD5Vc2UgbmVzdGVkIDxjb2RlPiZsdDt0cmFuc2FjdGlvbiZndDs8L2NvZGU+IAotZWxlbWVudHMgdG8gc3BlY2lmeSBtdWx0aXBsZSBibG9ja3Mgb2YgY29tbWFuZHMgdG8gdGhlIGV4ZWN1dGVkCi1leGVjdXRlZCBpbiB0aGUgc2FtZSBjb25uZWN0aW9uIGJ1dCBkaWZmZXJlbnQgdHJhbnNhY3Rpb25zLiBUaGlzCi1pcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVzIHRvIGV4ZWN1dGUKLW9uIHRoZSBzYW1lIHNjaGVtYS48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7dHJhbnNhY3Rpb24mZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IG11bHRpcGxlIGJsb2NrcyBvZiBjb21tYW5kcyB0bwordGhlIGV4ZWN1dGVkIGV4ZWN1dGVkIGluIHRoZSBzYW1lIGNvbm5lY3Rpb24gYnV0IGRpZmZlcmVudCB0cmFuc2FjdGlvbnMuIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bAord2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZmlsZXMgdG8gZXhlY3V0ZSBvbiB0aGUgc2FtZSBzY2hlbWEuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlIGNvbnRhaW5pbmcgU1FMIHN0YXRlbWVudHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3Mgc3RhdGVtZW50cyBlbmNsb3NlZCB3aXRoaW4gdGFnczwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPkZpbGUgY29udGFpbmluZyBTUUwgc3RhdGVtZW50czwvdGQ+CisgICAgPHRkPlllcywgdW5sZXNzIHN0YXRlbWVudHMgZW5jbG9zZWQgd2l0aGluIHRhZ3M8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxwPlRoZSA8Y29kZT4mbHQ7dHJhbnNhY3Rpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IHN1cHBvcnRzIGFueSA8YQotaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciBzaW5nbGUgZWxlbWVudAotcmVzb3VyY2UgY29sbGVjdGlvbiBhcyBuZXN0ZWQgZWxlbWVudCB0byBzcGVjaWZ5IHRoZSByZXNvdXJjZQotY29udGFpbmluZyB0aGUgU1FMIHN0YXRlbWVudHMuPC9wPgorPHA+VGhlIDxjb2RlPiZsdDt0cmFuc2FjdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQgc3VwcG9ydHMKK2FueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gYXMgbmVzdGVkCitlbGVtZW50IHRvIHNwZWNpZnkgdGhlIHJlc291cmNlIGNvbnRhaW5pbmcgdGhlIFNRTCBzdGF0ZW1lbnRzLjwvcD4KIAotPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHJlc291cmNlCi1jb2xsZWN0aW9uPC9oND4KKzxoND5hbnkgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAotPHA+WW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHNvdXJjZXMgdmlhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uCi1lbGVtZW50cy4gIEVhY2ggcmVzb3VyY2Ugb2YgdGhlIGNvbGxlY3Rpb24gd2lsbCBiZSBydW4gaW4gYQotdHJhbnNhY3Rpb24gb2YgaXRzIG93bi4gIFByaW9yIHRvIEFudCAxLjcgb25seSBmaWxlc2V0cyB3ZXJlCi1zdXBwb3J0ZWQuICBVc2UgYSBzb3J0IHJlc291cmNlIGNvbGxlY3Rpb24gdG8gZ2V0IGEgcHJlZGljdGFibGUgb3JkZXIKLW9mIHRyYW5zYWN0aW9ucy4gPC9wPgorPHA+WW91IGNhbiBzcGVjaWZ5IG11bHRpcGxlIHNvdXJjZXMgdmlhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnRzLiAgRWFjaCByZXNvdXJjZSBvZiB0aGUKK2NvbGxlY3Rpb24gd2lsbCBiZSBydW4gaW4gYSB0cmFuc2FjdGlvbiBvZiBpdHMgb3duLiAgUHJpb3IgdG8gQW50IDEuNyBvbmx5IGZpbGVzZXRzIHdlcmUgc3VwcG9ydGVkLgorVXNlIGEgc29ydCByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGdldCBhIHByZWRpY3RhYmxlIG9yZGVyIG9mIHRyYW5zYWN0aW9ucy48L3A+CiAKIDxoND5jbGFzc3BhdGg8L2g0PgotPHA+PGNvZGU+U3FsPC9jb2RlPidzIDxlbT5jbGFzc3BhdGg8L2VtPiBhdHRyaWJ1dGUgaXMgYSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5QQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZAotPGVtPmNsYXNzcGF0aDwvZW0+IGVsZW1lbnQuIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUgSkRCQyBjbGFzc2VzLjwvcD4KKzxwPjxjb2RlPlNxbDwvY29kZT4ncyA8ZW0+Y2xhc3NwYXRoPC9lbT4gYXR0cmlidXRlIGlzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2UKK3N0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYSBuZXN0ZWQgPGVtPmNsYXNzcGF0aDwvZW0+IGVsZW1lbnQuIEl0IGlzIHVzZWQgdG8gbG9hZCB0aGUKK0pEQkMgY2xhc3Nlcy48L3A+CiAKIDxoND5jb25uZWN0aW9uUHJvcGVydHk8L2g0PgogPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC9wPgotPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7Y29ubmVjdGlvblByb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudHMgdG8KLSAgc3BlY2lmeSBhZGRpdGlvbmFsIEpEQkMgcHJvcGVydGllcyB0aGF0IG5lZWQgdG8gYmUgc2V0IHdoZW4KLSAgY29ubmVjdGluZyB0byB0aGUgZGF0YWJhc2UuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlVzZSBuZXN0ZWQgPGNvZGU+Jmx0O2Nvbm5lY3Rpb25Qcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBKREJDIHByb3BlcnRpZXMKK3RoYXQgbmVlZCB0byBiZSBzZXQgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBkYXRhYmFzZS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgcHJvcGVydHk8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5WYWx1ZSBvZiB0aGUgcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5WYWx1ZSBvZiB0aGUgcHJvcGVydHk8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Jmx0O3NxbAotICAgIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OwotICAgIHVybD0mcXVvdDtqZGJjOmRhdGFiYXNlLXVybCZxdW90OwotICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OwotICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZGF0YS5zcWwmcXVvdDsKLS8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CiAKLTxwPkNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBpbiA8aT51cmw8L2k+IGFzIHRoZSBzYSB1c2VyIHVzaW5nIHRoZSAKLW9yZy5kYXRhYmFzZS5qZGJjRHJpdmVyIGFuZCBleGVjdXRlcyB0aGUgU1FMIHN0YXRlbWVudHMgY29udGFpbmVkIHdpdGhpbiAKLXRoZSBmaWxlIGRhdGEuc3FsPC9wPgorPHA+Q29ubmVjdCB0byB0aGUgZGF0YWJhc2UgZ2l2ZW4gaW4gPHZhcj51cmw8L3Zhcj4gYXMgdGhlIDxxPnNhPC9xPiB1c2VyIHVzaW5nCit0aGUgPGNvZGU+b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXI8L2NvZGU+IGFuZCBleGVjdXRlIHRoZSBTUUwgc3RhdGVtZW50cyBjb250YWluZWQgd2l0aGluIHRoZQorZmlsZSA8c2FtcD5kYXRhLnNxbDwvc2FtcD48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Jmx0O3NxbAotICAgIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OwotICAgIHVybD0mcXVvdDtqZGJjOmRhdGFiYXNlLXVybCZxdW90OwotICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OwotICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsKLSAgICBzcmM9JnF1b3Q7ZGF0YS5zcWwmcXVvdDsmZ3Q7Cis8cHJlPgorJmx0O3NxbCBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7CisgICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OworICAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7CisgICAgIHNyYz0mcXVvdDtkYXRhLnNxbCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIDx2YXI+dXJsPC92YXI+IGFzIHRoZSA8cT5zYTwvcT4gdXNlciB1c2luZwordGhlIDxjb2RlPm9yZy5kYXRhYmFzZS5qZGJjRHJpdmVyPC9jb2RlPiBhbmQgZXhlY3V0ZSB0aGUgU1FMIHN0YXRlbWVudHMgY29udGFpbmVkIHdpdGhpbiB0aGUKK2ZpbGUgPHNhbXA+ZGF0YS5zcWw8L3NhbXA+LiBBbHNvIHNldCB0aGUgcHJvcGVydHkgPGNvZGU+aW50ZXJuYWxfbG9nb248L2NvZGU+IHRvIHRoZQordmFsdWUgPHE+U1lTREJBPC9xPi48L3A+CisKKzxwcmU+CismbHQ7c3FsIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7CisgICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsKKyAgICAgc3JjPSZxdW90O2RhdGEuc3FsJnF1b3Q7Jmd0OwogICAmbHQ7Y29ubmVjdGlvblByb3BlcnR5IG5hbWU9JnF1b3Q7aW50ZXJuYWxfbG9nb24mcXVvdDsgdmFsdWU9JnF1b3Q7U1lTREJBJnF1b3Q7Jmd0OwotJmx0Oy9zcWwmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3NxbCZndDs8L3ByZT4KIAotPHA+Q29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIDxpPnVybDwvaT4gYXMgdGhlIHNhIHVzZXIgdXNpbmcKLXRoZSBvcmcuZGF0YWJhc2UuamRiY0RyaXZlciBhbmQgZXhlY3V0ZXMgdGhlIFNRTCBzdGF0ZW1lbnRzIGNvbnRhaW5lZAotd2l0aGluIHRoZSBmaWxlIGRhdGEuc3FsLiAgQWxzbyBzZXRzIHRoZQotcHJvcGVydHkgPGk+aW50ZXJuYWxfbG9nb248L2k+IHRvIHRoZSB2YWx1ZSA8aT5TWVNEQkE8L2k+LjwvcD4KKzxwPkNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIDx2YXI+dXJsPC92YXI+IGFzIHRoZSA8cT5zYTwvcT4gdXNlciB1c2luZwordGhlIDxjb2RlPm9yZy5kYXRhYmFzZS5qZGJjRHJpdmVyPC9jb2RlPiBhbmQgZXhlY3V0ZSB0aGUgdHdvIFNRTCBzdGF0ZW1lbnRzIGluc2VydGluZyBkYXRhCitpbnRvIDxzYW1wPnNvbWVfdGFibGU8L3NhbXA+IGFuZCB0cnVuY2F0aW5nIDxzYW1wPnNvbWVfb3RoZXJfdGFibGU8L3NhbXA+LiBBbnQgcHJvcGVydGllcyBpbiB0aGUKK25lc3RlZCB0ZXh0IHdpbGwgbm90IGJlIGV4cGFuZGVkLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCi0gICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7Ci0gICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7Ci0gICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OwotICAgICZndDsKKzxwcmU+CismbHQ7c3FsIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7CisgICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsmZ3Q7CiBpbnNlcnQKIGludG8gdGFibGUgc29tZV90YWJsZQogdmFsdWVzKDEsMiwzLDQpOwogCiB0cnVuY2F0ZSB0YWJsZSBzb21lX290aGVyX3RhYmxlOwotJmx0Oy9zcWwmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3NxbCZndDs8L3ByZT4KIAotPHA+Q29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIDxpPnVybDwvaT4gYXMgdGhlIHNhCi0gdXNlciB1c2luZyB0aGUgb3JnLmRhdGFiYXNlLmpkYmNEcml2ZXIgYW5kIGV4ZWN1dGVzIHRoZSB0d28gU1FMIHN0YXRlbWVudHMgCi0gaW5zZXJ0aW5nIGRhdGEgaW50byBzb21lX3RhYmxlIGFuZCB0cnVuY2F0aW5nIHNvbWVfb3RoZXJfdGFibGUuIEFudCBQcm9wZXJ0aWVzCi0gaW4gdGhlIG5lc3RlZCB0ZXh0IHdpbGwgbm90IGJlIGV4cGFuZGVkLjwvcD4KKzxwPk5vdGUgdGhhdCB5b3UgbWF5IHdhbnQgdG8gZW5jbG9zZSB5b3VyIHN0YXRlbWVudHMgaW4gPGNvZGU+Jmx0OyFbQ0RBVEFbPC9jb2RlPgorLi4uIDxjb2RlPl1dJmd0OzwvY29kZT4gc2VjdGlvbnMgc28geW91IGRvbid0IG5lZWQgdG8KK2VzY2FwZSA8Y29kZT4mbHQ7PC9jb2RlPiwgPGNvZGU+Jmd0OzwvY29kZT4sIDxjb2RlPiZhbXA7PC9jb2RlPiBvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMuIEZvcgorZXhhbXBsZTo8L3A+CiAKLTxwPk5vdGUgdGhhdCB5b3UgbWF5IHdhbnQgdG8gZW5jbG9zZSB5b3VyIHN0YXRlbWVudHMgaW4KLTxjb2RlPiZsdDshW0NEQVRBWzwvY29kZT4gLi4uIDxjb2RlPl1dJmd0OzwvY29kZT4gc2VjdGlvbnMgc28geW91IGRvbid0Ci1uZWVkIHRvIGVzY2FwZSA8Y29kZT4mbHQ7PC9jb2RlPiwgPGNvZGU+Jmd0OzwvY29kZT4gPGNvZGU+JmFtcDs8L2NvZGU+Ci1vciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMuIEZvciBleGFtcGxlOjwvcD4KLQotPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCi0gICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7Ci0gICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7Ci0gICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OwotICAgICZndDsmbHQ7IVtDREFUQVsKKzxwcmU+CismbHQ7c3FsIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7CisgICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsmZ3Q7Jmx0OyFbQ0RBVEFbCiAKIHVwZGF0ZSBzb21lX3RhYmxlIHNldCBjb2x1bW4xID0gY29sdW1uMSArIDEgd2hlcmUgY29sdW1uMiAmbHQ7IDQyOwogCi1dXSZndDsmbHQ7L3NxbCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KK11dJmd0OyZsdDsvc3FsJmd0OzwvcHJlPgogCi1UaGUgZm9sbG93aW5nIGNvbW1hbmQgdHVybnMgcHJvcGVydHkgZXhwYW5zaW9uIGluIG5lc3RlZCB0ZXh0IG9uIChpdCBpcyBvZmYgcHVyZWx5IGZvciBiYWNrd2FyZHMKLWNvbXBhdGliaWxpdHkpLCB0aGVuIGNyZWF0ZXMgYSBuZXcgdXNlciBpbiB0aGUgSFNRTERCIGRhdGFiYXNlIHVzaW5nIEFudCBwcm9wZXJ0aWVzLiAKKzxwPlRoZSBmb2xsb3dpbmcgY29tbWFuZCB0dXJucyBwcm9wZXJ0eSBleHBhbnNpb24gaW4gbmVzdGVkIHRleHQgb24gKGl0IGlzIG9mZiBwdXJlbHkgZm9yIGJhY2t3YXJkcworY29tcGF0aWJpbGl0eSksIHRoZW4gY3JlYXRlcyBhIG5ldyB1c2VyIGluIHRoZSBIU1FMREIgZGF0YWJhc2UgdXNpbmcgQW50IHByb3BlcnRpZXMuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKLSAgICBkcml2ZXI9Im9yZy5oc3FsZGIuamRiY0RyaXZlciI7Ci0gICAgdXJsPSJqZGJjOmhzcWxkYjpmaWxlOiR7ZGF0YWJhc2UuZGlyfSIKLSAgICB1c2VyaWQ9InNhIgotICAgIHBhc3N3b3JkPSIiCi0gICAgZXhwYW5kUHJvcGVydGllcz0idHJ1ZSIKLSAgICAmZ3Q7Cis8cHJlPgorJmx0O3NxbCBkcml2ZXI9Im9yZy5oc3FsZGIuamRiY0RyaXZlciI7CisgICAgIHVybD0iamRiYzpoc3FsZGI6ZmlsZToke2RhdGFiYXNlLmRpcn0iCisgICAgIHVzZXJpZD0ic2EiCisgICAgIHBhc3N3b3JkPSIiCisgICAgIGV4cGFuZFByb3BlcnRpZXM9InRydWUiJmd0OwogICAmbHQ7dHJhbnNhY3Rpb24mZ3Q7CiAgICAgQ1JFQVRFIFVTRVIgJHtuZXd1c2VyfSBQQVNTV09SRCAke25ld3Bhc3N3b3JkfQogICAmbHQ7L3RyYW5zYWN0aW9uJmd0OwotJmx0Oy9zcWwmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3NxbCZndDs8L3ByZT4KIAorPHA+VGhlIGZvbGxvd2luZyBjb25uZWN0cyB0byB0aGUgZGF0YWJhc2UgZ2l2ZW4gaW4gPHZhcj51cmw8L3Zhcj4gYXMgdGhlIDxxPnNhPC9xPiB1c2VyIHVzaW5nCit0aGUgPGNvZGU+b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXI8L2NvZGU+IGFuZCBleGVjdXRlcyB0aGUgU1FMIHN0YXRlbWVudHMgY29udGFpbmVkIHdpdGhpbiB0aGUKK2ZpbGVzIDxzYW1wPmRhdGExLnNxbDwvc2FtcD4sIDxzYW1wPmRhdGEyLnNxbDwvc2FtcD4gYW5kIDxzYW1wPmRhdGEzLnNxbDwvc2FtcD4gYW5kIHRoZW4gZXhlY3V0ZXMKK3RoZSB0cnVuY2F0ZSBvcGVyYXRpb24gb24gPHNhbXA+c29tZV9vdGhlcl90YWJsZTwvc2FtcD4uPC9wPgogCi08cD5UaGUgZm9sbG93aW5nIGNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBpbiB1cmwgYXMgdGhlIHNhIHVzZXIgdXNpbmcgCi10aGUgb3JnLmRhdGFiYXNlLmpkYmNEcml2ZXIgYW5kIGV4ZWN1dGVzIHRoZSBTUUwgc3RhdGVtZW50cyBjb250YWluZWQgd2l0aGluIAotdGhlIGZpbGVzIGRhdGExLnNxbCwgZGF0YTIuc3FsIGFuZCBkYXRhMy5zcWwgYW5kIHRoZW4gZXhlY3V0ZXMgdGhlIHRydW5jYXRlIAotb3BlcmF0aW9uIG9uIDxpPnNvbWVfb3RoZXJfdGFibGU8L2k+LjwvcD4KLQotPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCi0gICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7Ci0gICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7Ci0gICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OyAmZ3Q7Cis8cHJlPgorJmx0O3NxbCBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7CisgICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OworICAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7Jmd0OwogICAmbHQ7dHJhbnNhY3Rpb24gIHNyYz0mcXVvdDtkYXRhMS5zcWwmcXVvdDsvJmd0OwogICAmbHQ7dHJhbnNhY3Rpb24gIHNyYz0mcXVvdDtkYXRhMi5zcWwmcXVvdDsvJmd0OwogICAmbHQ7dHJhbnNhY3Rpb24gIHNyYz0mcXVvdDtkYXRhMy5zcWwmcXVvdDsvJmd0OwogICAmbHQ7dHJhbnNhY3Rpb24mZ3Q7CiAgICAgdHJ1bmNhdGUgdGFibGUgc29tZV9vdGhlcl90YWJsZTsKICAgJmx0Oy90cmFuc2FjdGlvbiZndDsKLSZsdDsvc3FsJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9zcWwmZ3Q7PC9wcmU+CiAKLTxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkb2VzIHRoZSBzYW1lIGFzIChhbmQgbWF5IGV4ZWN1dGUgYWRkaXRpb25hbAotU1FMIGZpbGVzIGlmIHRoZXJlIGFyZSBtb3JlIGZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuCi08Y29kZT5kYXRhKi5zcWw8L2NvZGU+KSBidXQgZG9lc24ndCBndWFyYW50ZWUgdGhhdCBkYXRhMS5zcWwgd2lsbCBiZQotcnVuIGJlZm9yZSA8Y29kZT5kYXRhMi5zcWw8L2NvZGU+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkb2VzIHRoZSBzYW1lIGFzIChhbmQgbWF5IGV4ZWN1dGUgYWRkaXRpb25hbCBTUUwgZmlsZXMgaWYgdGhlcmUgYXJlIG1vcmUKK2ZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuIDxzYW1wPmRhdGEqLnNxbDwvc2FtcD4pIGJ1dCBkb2Vzbid0IGd1YXJhbnRlZSB0aGF0IDxzYW1wPmRhdGExLnNxbDwvc2FtcD4KK3dpbGwgYmUgcnVuIGJlZm9yZSA8c2FtcD5kYXRhMi5zcWw8L3NhbXA+LjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCi0gICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7Ci0gICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7Ci0gICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OyZndDsKKzxwcmU+CismbHQ7c3FsIGRyaXZlcj0mcXVvdDtvcmcuZGF0YWJhc2UuamRiY0RyaXZlciZxdW90OworICAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKKyAgICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7CisgICAgIHBhc3N3b3JkPSZxdW90O3Bhc3MmcXVvdDsmZ3Q7CiAgICZsdDtwYXRoJmd0OwogICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7Jmd0OwogICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkYXRhKi5zcWwmcXVvdDsvJmd0OwpAQCAtNDcwLDQ5ICs0MTQsNDMgQEAKICAgJmx0O3RyYW5zYWN0aW9uJmd0OwogICAgIHRydW5jYXRlIHRhYmxlIHNvbWVfb3RoZXJfdGFibGU7CiAgICZsdDsvdHJhbnNhY3Rpb24mZ3Q7Ci0mbHQ7L3NxbCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvc3FsJmd0OzwvcHJlPgogCi08cD5UaGUgZm9sbG93aW5nIGNvbm5lY3RzIHRvIHRoZSBkYXRhYmFzZSBnaXZlbiBpbiB1cmwgYXMgdGhlIHNhIHVzZXIgdXNpbmcgdGhlIAotb3JnLmRhdGFiYXNlLmpkYmNEcml2ZXIgYW5kIGV4ZWN1dGVzIHRoZSBTUUwgc3RhdGVtZW50cyBjb250YWluZWQgd2l0aGluIHRoZSAKLWZpbGUgZGF0YS5zcWwsIHdpdGggb3V0cHV0IHBpcGVkIHRvIG91dHB1dGZpbGUudHh0LCBzZWFyY2hpbmcgL3NvbWUvamRiYy5qYXIgCi1hcyB3ZWxsIGFzIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGZvciB0aGUgZHJpdmVyIGNsYXNzLjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgY29ubmVjdHMgdG8gdGhlIGRhdGFiYXNlIGdpdmVuIGluIDx2YXI+dXJsPC92YXI+IGFzIHRoZSA8cT5zYTwvcT4gdXNlciB1c2luZwordGhlIDxjb2RlPm9yZy5kYXRhYmFzZS5qZGJjRHJpdmVyPC9jb2RlPiBhbmQgZXhlY3V0ZXMgdGhlIFNRTCBzdGF0ZW1lbnRzIGNvbnRhaW5lZCB3aXRoaW4gdGhlCitmaWxlIDxzYW1wPmRhdGEuc3FsPC9zYW1wPiwgd2l0aCBvdXRwdXQgcGlwZWQgdG8gPHNhbXA+b3V0cHV0ZmlsZS50eHQ8L3NhbXA+LAorc2VhcmNoaW5nIDxzYW1wPi9zb21lL2pkYmMuamFyPC9zYW1wPiBhcyB3ZWxsIGFzIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGZvciB0aGUgZHJpdmVyIGNsYXNzLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4mbHQ7c3FsCi0gICAgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7Ci0gICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7Ci0gICAgdXNlcmlkPSZxdW90O3NhJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OwotICAgIHNyYz0mcXVvdDtkYXRhLnNxbCZxdW90OwotICAgIHByaW50PSZxdW90O3llcyZxdW90OwotICAgIG91dHB1dD0mcXVvdDtvdXRwdXRmaWxlLnR4dCZxdW90OwotICAgICZndDsKLSZsdDtjbGFzc3BhdGgmZ3Q7Ci0JJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90Oy9zb21lL2pkYmMuamFyJnF1b3Q7LyZndDsKLSZsdDsvY2xhc3NwYXRoJmd0OwotJmx0Oy9zcWwmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8cHJlPgorJmx0O3NxbCBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKKyAgICAgdXJsPSZxdW90O2pkYmM6ZGF0YWJhc2UtdXJsJnF1b3Q7CisgICAgIHVzZXJpZD0mcXVvdDtzYSZxdW90OworICAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7CisgICAgIHNyYz0mcXVvdDtkYXRhLnNxbCZxdW90OworICAgICBwcmludD0mcXVvdDt5ZXMmcXVvdDsKKyAgICAgb3V0cHV0PSZxdW90O291dHB1dGZpbGUudHh0JnF1b3Q7Jmd0OworICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDsvc29tZS9qZGJjLmphciZxdW90Oy8mZ3Q7CisgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9zcWwmZ3Q7PC9wcmU+CiAKLTxwPlRoZSBmb2xsb3dpbmcgd2lsbCBvbmx5IGV4ZWN1dGUgaWYgdGhlIFJEQk1TIGlzICZxdW90O29yYWNsZSZxdW90OyBhbmQgdGhlIHZlcnNpb24gCi1zdGFydHMgd2l0aCAmcXVvdDs4LjEuJnF1b3Q7PC9wPgorPHA+VGhlIGZvbGxvd2luZyB3aWxsIG9ubHkgZXhlY3V0ZSBpZiB0aGUgUkRCTVMgaXMgPHE+b3JhY2xlPC9xPiBhbmQgdGhlIHZlcnNpb24gc3RhcnRzCit3aXRoIDxxPjguMS48L3E+PC9wPgogCi08YmxvY2txdW90ZT48cHJlPiZsdDtzcWwKLSAgICBkcml2ZXI9JnF1b3Q7b3JnLmRhdGFiYXNlLmpkYmNEcml2ZXImcXVvdDsKLSAgICB1cmw9JnF1b3Q7amRiYzpkYXRhYmFzZS11cmwmcXVvdDsKLSAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKLSAgICBwYXNzd29yZD0mcXVvdDtwYXNzJnF1b3Q7Ci0gICAgc3JjPSZxdW90O2RhdGEuc3FsJnF1b3Q7Ci0gICAgcmRibXM9JnF1b3Q7b3JhY2xlJnF1b3Q7Ci0gICAgdmVyc2lvbj0mcXVvdDs4LjEuJnF1b3Q7Ci0gICAgJmd0OworPHByZT4KKyZsdDtzcWwgZHJpdmVyPSZxdW90O29yZy5kYXRhYmFzZS5qZGJjRHJpdmVyJnF1b3Q7CisgICAgIHVybD0mcXVvdDtqZGJjOmRhdGFiYXNlLXVybCZxdW90OworICAgICB1c2VyaWQ9JnF1b3Q7c2EmcXVvdDsKKyAgICAgcGFzc3dvcmQ9JnF1b3Q7cGFzcyZxdW90OworICAgICBzcmM9JnF1b3Q7ZGF0YS5zcWwmcXVvdDsKKyAgICAgcmRibXM9JnF1b3Q7b3JhY2xlJnF1b3Q7CisgICAgIHZlcnNpb249JnF1b3Q7OC4xLiZxdW90OyZndDsKIGluc2VydAogaW50byB0YWJsZSBzb21lX3RhYmxlCiB2YWx1ZXMoMSwyLDMsNCk7CiAKIHRydW5jYXRlIHRhYmxlIHNvbWVfb3RoZXJfdGFibGU7Ci0mbHQ7L3NxbCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQorJmx0Oy9zcWwmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zc2hleGVjLmh0bWwgYi9tYW51YWwvVGFza3Mvc3NoZXhlYy5odG1sCmluZGV4IGQwODVhYmQuLjY0MzdiNDYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zc2hleGVjLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NzaGV4ZWMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI5NSArMTUsMjcxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TU0hFWEVDIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InNzaGV4ZWMiPlNTSEVYRUM8L2E+PC9oMj4KKzxoMiBpZD0ic3NoZXhlYyI+U1NIRVhFQzwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjY8L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPjxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+PC9wPgorPHA+UnVucyBhIGNvbW1hbmQgb24gYSByZW1vdGUgbWFjaGluZSBydW5uaW5nIFNTSCBkYWVtb24uPC9wPgogCi08cD5SdW5zIGEgY29tbWFuZCBvbiBhIHJlbW90ZSBtYWNoaW5lIHJ1bm5pbmcgU1NIIGRhZW1vbi4KLTwvcD4KLQotPHA+PGI+Tm90ZTo8L2I+IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQKLWluIHRoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhCi1ocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Ci1mb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBqc2NoLTAuMS4yOSBhbmQgYWJvdmUKLWFuZCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgb2YganNjaCBlYXJsaWVyIHRoYW4KLTAuMS4yOC48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudAorZGlzdHJpYnV0aW9uLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLiAgVGhpcyB0YXNrIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEpTQ2ggMC4xLjI5IGFuZCBhYm92ZSBhbmQgd29uJ3Qgd29yayB3aXRoIHZlcnNpb25zIG9mCitKU0NoIGVhcmxpZXIgdGhhbiAwLjEuMjguPC9wPgogCiA8cD5TZWUgYWxzbyB0aGUgPGEgaHJlZj0ic2NwLmh0bWwiPnNjcCB0YXNrPC9hPjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ob3N0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB5b3Ugd2lzaCB0byBjb25uZWN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5ob3N0PC90ZD4KKyAgICA8dGQ+VGhlIGhvc3RuYW1lIG9yIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBob3N0IHRvIHdoaWNoIHlvdSB3aXNoIHRvIGNvbm5lY3QuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVzZXJuYW1lIG9uIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB5b3UgYXJlIGNvbm5lY3RpbmcuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnVzZXJuYW1lPC90ZD4KKyAgICA8dGQ+VGhlIHVzZXJuYW1lIG9uIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB5b3UgYXJlIGNvbm5lY3RpbmcuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY29tbWFuZCB0byBydW4gb24gdGhlIHJlbW90ZSBob3N0LjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5FaXRoZXIgdGhpcyBvciBjb21tYW5kUmVzb3VyY2UgbXVzdCBiZSBzZXQ8L3RkPgorICAgIDx0ZD5jb21tYW5kPC90ZD4KKyAgICA8dGQ+VGhlIGNvbW1hbmQgdG8gcnVuIG9uIHRoZSByZW1vdGUgaG9zdC48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWFuZFJlc291cmNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZXNvdXJjZSAoZmlsZSkgdGhhdCBjb250YWlucyB0aGUgY29tbWFuZHMgdG8gcnVuIG9uIHRoZSByZW1vdGUgaG9zdC4KLSAgICBTaW5jZSBBbnQgMS43LjE8L3RkPgotICAgIDx0ZCB2YWxpYW49InRvcCIgYWxpZ249ImNlbnRlciI+RWl0aGVyIHRoaXMgb3IgY29tbWFuZCBtdXN0IGJlIHNldDwvdGQ+CisgICAgPHRkPmNvbW1hbmRSZXNvdXJjZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgcmVzb3VyY2UgKGZpbGUpIHRoYXQgY29udGFpbnMgdGhlIGNvbW1hbmRzIHRvIHJ1biBvbiB0aGUgcmVtb3RlCisgICAgaG9zdC4gIDxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuPC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAyMi48L3RkPgorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+VGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjIyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydXN0PC90ZD4KLQotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhpcyB0cnVzdHMgYWxsIHVua25vd24gaG9zdHMgaWYgc2V0IHRvIHllcy90cnVlLjxicj4KLSAgICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPiBJZiB5b3Ugc2V0IHRoaXMgdG8gZmFsc2UgKHRoZSBkZWZhdWx0KSwgdGhlCi0gICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIga25vd25ob3N0cyBmaWxlLCB0aGlzCi0gICAgICBhbHNvIGltcGxpZXMgdGhhdCB0aGUgZmlsZSBleGlzdHMuPC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBOby48L3RkPgorICAgIDx0ZD50cnVzdDwvdGQ+CisgICAgPHRkPlRoaXMgdHJ1c3RzIGFsbCB1bmtub3duIGhvc3RzIGlmIHNldCB0byA8cT55ZXM8L3E+CisgICAgICBvciA8cT50cnVlPC9xPi48YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogSWYgeW91IHNldCB0aGlzIHRvIDxxPmZhbHNlPC9xPiAodGhlIGRlZmF1bHQpLCB0aGUKKyAgICAgIGhvc3QgeW91IGNvbm5lY3QgdG8gbXVzdCBiZSBsaXN0ZWQgaW4geW91ciA8dmFyPmtub3duaG9zdHM8L3Zhcj4gZmlsZSwgdGhpcyBhbHNvIGltcGxpZXMgdGhhdAorICAgICAgdGhlIGZpbGUgZXhpc3RzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rbm93bmhvc3RzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgc2V0cyB0aGUga25vd24gaG9zdHMgZmlsZSB0byB1c2UgdG8gdmFsaWRhdGUKLSAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcyBtdXN0IGJlIGEgU1NIMiBmb3JtYXQgZmlsZS4KLSAgICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8KLSAgICAke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0cy48L3RkPgorICAgIDx0ZD5rbm93bmhvc3RzPC90ZD4KKyAgICA8dGQ+VGhpcyBzZXRzIHRoZSBrbm93biBob3N0cyBmaWxlIHRvIHVzZSB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiAgVGhpcworICAgICAgbXVzdCBiZSBhIFNTSDIgZm9ybWF0IGZpbGUuICBTU0gxIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4ke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0czwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBoYWx0IHRoZSBidWlsZCBpZiB0aGUgY29tbWFuZCBkb2VzIG5vdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCi0gICAgIDwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGhhbHQgdGhlIGJ1aWxkIGlmIHRoZSBjb21tYW5kIGRvZXMgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZDwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhc3N3b3JkLjwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm90IGlmIHlvdSBhcmUgdXNpbmcga2V5IGJhc2VkCi0gICAgIGF1dGhlbnRpY2F0aW9uIG9yIHRoZSBwYXNzd29yZCBoYXMgYmVlbiBnaXZlbiBpbiB0aGUgZmlsZSBvcgotICAgICB0b2RpciBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQ8L3RkPgorICAgIDx0ZD5UaGUgcGFzc3dvcmQuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgeW91IGFyZSB1c2luZyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb24gb3IgdGhlIHBhc3N3b3JkIGhhcyBiZWVuIGdpdmVuIGluIHRoZQorICAgICAgZmlsZSBvciA8dmFyPnRvZGlyPC92YXI+IGF0dHJpYnV0ZS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZXlmaWxlPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiB0aGUgZmlsZSBob2xkaW5nIHRoZSBwcml2YXRlIGtleS48L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgaWYgeW91IGFyZSB1c2luZyBrZXkgYmFzZWQKLSAgICAgYXV0aGVudGljYXRpb24uPC90ZD4KKyAgICA8dGQ+a2V5ZmlsZTwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHByaXZhdGUga2V5LjwvdGQ+CisgICAgPHRkPlllcywgaWYgeW91IGFyZSB1c2luZyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb248L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzcGhyYXNlPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5QYXNzcGhyYXNlIGZvciB5b3VyIHByaXZhdGUga2V5LjwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy48L3RkPgorICAgIDx0ZD5wYXNzcGhyYXNlPC90ZD4KKyAgICA8dGQ+UGFzc3BocmFzZSBmb3IgeW91ciBwcml2YXRlIGtleS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYW4gZW1wdHkgc3RyaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NzeXN0ZW1vdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBzdXBwcmVzcyBzeXN0ZW0gb3V0LgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPnNzaENvbmZpZzwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIE9wZW5TU0ggc3R5bGUgY29uZmlndXJhdGlvbiAoZS5nLiA8Y29kZT4ke3VzZXIuaG9tZX0vLnNzaC9jb25maWc8L2NvZGU+KS4KKyAgICAgICAgVGhlIHVzZXJuYW1lIGFuZCB0aGUga2V5IGZpbGUgYXJlIHJlYWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAorICAgICAgICB1bmxlc3MgdGhleSBhcmUgYWxyZWFkeSBzcGVjaWZpZWQgaW4gdGhlIHRhc2sgcGFyYW1ldGVycy4KKyAgICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjg8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3VwcHJlc3NzeXN0ZW1lcnI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBzdXBwcmVzcyBzeXN0ZW0gZXJyLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPnN1cHByZXNzc3lzdGVtb3V0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBzdXBwcmVzcyBzeXN0ZW0gb3V0LiA8ZW0+c2luY2UgQW50IDEuOS4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBvdXRwdXQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c3VwcHJlc3NzeXN0ZW1lcnI8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHN1cHByZXNzIDxjb2RlPlN5c3RlbS5lcnI8L2NvZGU+LiA8ZW0+c2luY2UgQW50IDEuOS40PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3JPdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZQotICAgIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuICA8ZW0+c2luY2UgQW50IDEuOS40PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5vdXRwdXQ8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZSB0byB3aGljaCB0byB3cml0ZSB0aGUgb3V0cHV0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXBwZW5kPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgb3V0cHV0IGZpbGUgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIG9yIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3JPdXRwdXQ8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuICA8ZW0+c2luY2UgQW50CisgICAgICAxLjkuNDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJBcHBlbmQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBlcnJvck91dHB1dCBmaWxlIHNob3VsZCBiZSBhcHBlbmRlZCB0byBvcgotICAgIG92ZXJ3cml0dGVuLiBEZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyBvdmVyd3JpdGUgYW55IGV4aXN0aW5nCi0gICAgZmlsZS4gIDxlbT5zaW5jZSBBbnQgMS45LjQ8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmFwcGVuZDwvdGQ+CisgICAgPHRkPldoZXRoZXIgPHZhcj5vdXRwdXQ8L3Zhcj4gZmlsZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPiwgbWVhbmluZyBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIGZpbGU8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXRwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIAotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiAgSWYgeW91IHVzZSB0aGUgY29tbWFuZFJlc291cmNlCi0gICAgICBhdHRyaWJ1dGUsIGVhY2ggY29tbWFuZCdzIG91dHB1dCB3aWxsIGJlIHByZWZpeGVkIGJ5IHRoZQorICAgIDx0ZD5lcnJBcHBlbmQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIDx2YXI+ZXJyb3JPdXRwdXQ8L3Zhcj4gZmlsZSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gb3Igb3ZlcndyaXR0ZW4uIDxlbT5zaW5jZSBBbnQKKyAgICAgIDEuOS40PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+LCBtZWFuaW5nIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZmlsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+b3V0cHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gIElmIHlvdSB1c2UKKyAgICAgIHRoZSA8dmFyPmNvbW1hbmRSZXNvdXJjZTwvdmFyPiBhdHRyaWJ1dGUsIGVhY2ggY29tbWFuZCdzIG91dHB1dCB3aWxsIGJlIHByZWZpeGVkIGJ5IHRoZQogICAgICAgY29tbWFuZCBpdHNlbGYuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3Jwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZQorICAgICAgc3RvcmVkLiAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXN1bHRwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSByZXR1cm4gY29kZQotICAgICAgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gT25seSBvZiBpbnRlcmVzdCBpZgotICAgICAgZmFpbG9uZXJyb3I9ZmFsc2UuICA8ZW0+c2luY2UgQW50IDEuOS40PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5yZXN1bHRwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHJldHVybiBjb2RlIG9mIHRoZSBjb21tYW5kIHNob3VsZCBiZSBzdG9yZWQuIE9ubHkgb2YKKyAgICAgIGludGVyZXN0IGlmIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj49PHE+ZmFsc2U8L3E+LiAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3AgdGhlIGNvbW1hbmQgaWYgaXQgZG9lc24ndCBmaW5pc2ggd2l0aGluIHRoZQotICAgICAgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcyA8Yj51bmxpa2UgdGVsbmV0LCB3aGljaAotICAgICAgICBleHBlY3RzIGEgdGltZW91dCBpbiBzZWNvbmRzPC9iPikuCi0gICAgICBEZWZhdWx0cyB0byAwIHdoaWNoIG1lYW5zICZxdW90O3dhaXQgZm9yZXZlciZxdW90Oy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD50aW1lb3V0PC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgY29tbWFuZCBpZiBpdCBkb2Vzbid0IGZpbmlzaCB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lIChnaXZlbiBpbgorICAgICAgbWlsbGlzZWNvbmRzIDxzdHJvbmc+dW5saWtlIDxjb2RlPnRlbG5ldDwvY29kZT4sIHdoaWNoIGV4cGVjdHMgYSB0aW1lb3V0IGluCisgICAgICBzZWNvbmRzPC9zdHJvbmc+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MDwvcT4gd2hpY2ggbWVhbnMgPHE+bmV2ZXI8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIGZyb20gd2hpY2ggdGhlIGV4ZWN1dGVkIGNvbW1hbmQncyBzdGFuZGFyZAotICAgICAgaW5wdXQgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZQotICAgICAgaW5wdXRzdHJpbmcgYW5kIGlucHV0cHJvcGVydHkgYXR0cmlidXRlcy48YnIvPgotICAgICAgV2hlbiBleGVjdXRpbmcgbW9yZSB0aGFuIG9uZSBjb21tYW5kIHZpYSBjb21tYW5kUmVzb3VyY2UsIGlucHV0Ci0gICAgICB3aWxsIGJlIHJlYWQgZm9yIGVhY2ggY29tbWFuZC4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlucHV0PC90ZD4KKyAgICA8dGQ+QSBmaWxlIGZyb20gd2hpY2ggdGhlIGV4ZWN1dGVkIGNvbW1hbmQncyBzdGFuZGFyZCBpbnB1dCBpcyB0YWtlbi4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkKKyAgICAgIGV4Y2x1c2l2ZSB3aXRoIHRoZSA8dmFyPmlucHV0c3RyaW5nPC92YXI+IGFuZCA8dmFyPmlucHV0cHJvcGVydHk8L3Zhcj4gYXR0cmlidXRlcy48YnIvPiAgV2hlbgorICAgICAgZXhlY3V0aW5nIG1vcmUgdGhhbiBvbmUgY29tbWFuZCB2aWEgPHZhcj5jb21tYW5kUmVzb3VyY2U8L3Zhcj4sIGlucHV0IHdpbGwgYmUgcmVhZCBmb3IgZWFjaAorICAgICAgY29tbWFuZC4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EZXRlcm1pbmVzIHdoZXRoZXIgc3NoZXhlYyBvdXRwdXRzIHZlcmJvc2VseSB0byB0aGUgdXNlci48YnIvPiAKLSAgICBTaW1pbGFyIG91dHB1dCBpcyBnZW5lcmF0ZWQgYXMgdGhlIHNzaCBjb21tYW5kbGluZSB0b29sIHdpdCB0aGUgLXYgb3B0aW9uLiAKLSAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2U8L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIDxjb2RlPnNzaGV4ZWM8L2NvZGU+IG91dHB1dHMgdmVyYm9zZWx5IHRvIHRoZSB1c2VyLjxici8+ICBTaW1pbGFyIG91dHB1dAorICAgICAgaXMgZ2VuZXJhdGVkIGFzIHRoZSA8a2JkPnNzaDwva2JkPiBjb21tYW5kIGxpbmUgdG9vbCB3aXRoIHRoZSA8a2JkPi12PC9rYmQ+CisgICAgICBvcHRpb24uICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXRwcm9wZXJ0eTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIGEgcHJvcGVydHkgd2hvJ3MgY29udGVudCBzZXJ2ZXMgYXMgdGhlCi0gICAgICBpbnB1dCBzdHJlYW0gZm9yIHRoZSBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIGlucHV0IGFuZCBpbnB1dHN0cmluZwotICAgICAgYXR0cmlidXRlcy48YnIvPgotICAgICAgV2hlbiBleGVjdXRpbmcgbW9yZSB0aGFuIG9uZSBjb21tYW5kIHZpYSBjb21tYW5kUmVzb3VyY2UsIGlucHV0Ci0gICAgICB3aWxsIGJlIHJlYWQgZm9yIGVhY2ggY29tbWFuZC4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlucHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgcHJvcGVydHkgY29udGVudCBvZiB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGV4ZWN1dGVkCisgICAgICBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgPHZhcj5pbnB1dDwvdmFyPgorICAgICAgYW5kIDx2YXI+aW5wdXRzdHJpbmc8L3Zhcj4gYXR0cmlidXRlcy48YnIvPiAgV2hlbiBleGVjdXRpbmcgbW9yZSB0aGFuIG9uZSBjb21tYW5kCisgICAgICB2aWEgPHZhcj5jb21tYW5kUmVzb3VyY2U8L3Zhcj4sIGlucHV0IHdpbGwgYmUgcmVhZCBmb3IgZWFjaCBjb21tYW5kLiAgPGVtPnNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXRzdHJpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzdHJpbmcgd2hpY2ggc2VydmVzIGFzIHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZQotICAgICAgZXhlY3V0ZWQgY29tbWFuZC4gVGhpcyBhdHRyaWJ1dGUgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlCi0gICAgICBpbnB1dCBhbmQgaW5wdXRwcm9wZXJ0eSBhdHRyaWJ1dGVzLjxici8+Ci0gICAgICBXaGVuIGV4ZWN1dGluZyBtb3JlIHRoYW4gb25lIGNvbW1hbmQgdmlhIGNvbW1hbmRSZXNvdXJjZSwgaW5wdXQKLSAgICAgIHdpbGwgYmUgcmVhZCBmb3IgZWFjaCBjb21tYW5kLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjguMzwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5wdXRzdHJpbmc8L3RkPgorICAgIDx0ZD5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGV4ZWN1dGVkIGNvbW1hbmQuIFRoaXMgYXR0cmlidXRlIGlzCisgICAgICBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgPHZhcj5pbnB1dDwvdmFyPiBhbmQgPHZhcj5pbnB1dHByb3BlcnR5PC92YXI+IGF0dHJpYnV0ZXMuPGJyLz4KKyAgICAgIFdoZW4gZXhlY3V0aW5nIG1vcmUgdGhhbiBvbmUgY29tbWFuZCB2aWEgPHZhcj5jb21tYW5kUmVzb3VyY2U8L3Zhcj4sIGlucHV0IHdpbGwgYmUgcmVhZCBmb3IKKyAgICAgIGVhY2ggY29tbWFuZC4gIDxlbT5zaW5jZSBBbnQgMS44LjM8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dXNlcHR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gYWxsb2NhdGUgYSBwc2V1ZG8tdHR5IChsaWtlIHNzaCAtdCkuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4zPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KKyAgICA8dGQ+dXNlcHR5PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBhbGxvY2F0ZSBhIHBzZXVkby10dHkgKGxpa2UgPGtiZD5zc2ggLXQ8L2tiZD4pLiAgPGVtPnNpbmNlIEFudCAxLjguMzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZVN5c3RlbUluPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcGFzcyB0aGUgY3VycmVudCBzdGFuZGFyZCBpbnB1dCB0byB0aGUKLSAgICAgIHJlbW90ZSBwcm9jZXNzLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuNDwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPnVzZVN5c3RlbUluPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBwYXNzIHRoZSBjdXJyZW50IHN0YW5kYXJkIGlucHV0IHRvIHRoZSByZW1vdGUgcHJvY2Vzcy4gIDxlbT5zaW5jZSBBbnQKKyAgICAgIDEuOS40PC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2V0cyBhIHRpbWVvdXQgaW50ZXJ2YWwgaW4gc2Vjb25kcyBhZnRlciB3aGljaCBpZiBubyBkYXRhIGhhcwotICAgICAgYmVlbiByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIsIHRoZSB0YXNrIHdpbGwgc2VuZCBhIG1lc3NhZ2UgdGhyb3VnaAotICAgICAgdGhlIGVuY3J5cHRlZCBjaGFubmVsIHRvIHJlcXVlc3QgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIHRoZSBkZWZhdWx0IGlzIDAsIGluZGljYXRpbmcKLSAgICAgIHRoYXQgdGhlc2UgbWVzc2FnZXMgd2lsbCBub3QgYmUgc2VudCB0byB0aGUgc2VydmVyPC90ZD4KKyAgICA8dGQ+c2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHM8L3RkPgorICAgIDx0ZD5TZXRzIGEgdGltZW91dCBpbnRlcnZhbCBpbiBzZWNvbmRzIGFmdGVyIHdoaWNoIGlmIG5vIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLAorICAgICAgdGhlIHRhc2sgd2lsbCBzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIHRoZSBlbmNyeXB0ZWQgY2hhbm5lbCB0byByZXF1ZXN0IGEgcmVzcG9uc2UgZnJvbSB0aGUKKyAgICAgIHNlcnZlci4gIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vLCB0aGUgZGVmYXVsdCBpcyA8cT4wPC9xPiwgaW5kaWNhdGluZyB0aGF0IHRoZXNlIG1lc3NhZ2VzIHdpbGwgbm90IGJlIHNlbnQgdG8gdGhlCisgICAgICBzZXJ2ZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXJ2ZXJBbGl2ZUNvdW50TWF4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2Ygc2VydmVyIGFsaXZlIG1lc3NhZ2VzIHdoaWNoIG1heSBiZQotICAgICAgc2VudCB3aXRob3V0IHJlY2VpdmluZyBhbnkgbWVzc2FnZXMgYmFjayBmcm9tIHRoZSBzZXJ2ZXIuIE9ubHkKLSAgICAgIHVzZWQgaWYgc2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHMgaXMgbm90IDAuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS43PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIDM8L3RkPgorICAgIDx0ZD5zZXJ2ZXJBbGl2ZUNvdW50TWF4PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiBzZXJ2ZXIgYWxpdmUgbWVzc2FnZXMgd2hpY2ggbWF5IGJlIHNlbnQgd2l0aG91dCByZWNlaXZpbmcgYW55IG1lc3NhZ2VzIGJhY2sKKyAgICAgIGZyb20gdGhlIHNlcnZlci4gT25seSB1c2VkIGlmIDx2YXI+c2VydmVyQWxpdmVJbnRlcnZhbFNlY29uZHM8L3Zhcj4gaXMKKyAgICAgIG5vdCA8cT4wPC9xPi4gIDxlbT5zaW5jZSBBbnQgMS45Ljc8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4zPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+PGI+UnVuIGEgY29tbWFuZCBvbiBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uPC9iPjwvcD4KLTxwcmU+Ci0gICZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLQl1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7Ci0JcGFzc3dvcmQ9JnF1b3Q7eW8mcXVvdDsKLQljb21tYW5kPSZxdW90O3RvdWNoIHNvbWVmaWxlJnF1b3Q7LyZndDsKLTwvcHJlPgogCi08cD48Yj5SdW4gYSBjb21tYW5kIG9uIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcga2V5IGF1dGhlbnRpY2F0aW9uPC9iPjwvcD4KLTxwcmU+Ci0gICZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLQl1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7Ci0Ja2V5ZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLnNzaC9pZF9kc2EmcXVvdDsKLQlwYXNzcGhyYXNlPSZxdW90O3lvIGl0cyBhIHNlY3JldCZxdW90OwotCWNvbW1hbmQ9JnF1b3Q7dG91Y2ggc29tZWZpbGUmcXVvdDsvJmd0OwotPC9wcmU+Cis8cD5SdW4gYSBjb21tYW5kIG9uIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcgcGFzc3dvcmQgYXV0aGVudGljYXRpb248L3A+CiAKLTxwPjxiPlJ1biBhIGNvbW1hbmQgb24gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYXV0aGVudGljYXRpb24gd2l0aCBubyBwYXNzcGhyYXNlPC9iPjwvcD4KIDxwcmU+Ci0gICZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLQl1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7Ci0Ja2V5ZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLnNzaC9pZF9kc2EmcXVvdDsKLQljb21tYW5kPSZxdW90O3RvdWNoIHNvbWVmaWxlJnF1b3Q7LyZndDsKLTwvcHJlPgorJmx0O3NzaGV4ZWMgaG9zdD0mcXVvdDtzb21laG9zdCZxdW90OworICAgICAgICAgdXNlcm5hbWU9JnF1b3Q7ZHVkZSZxdW90OworICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7eW8mcXVvdDsKKyAgICAgICAgIGNvbW1hbmQ9JnF1b3Q7dG91Y2ggc29tZWZpbGUmcXVvdDsvJmd0OzwvcHJlPgogCi08cD48Yj5SdW4gYSBzZXQgb2YgY29tbWFuZHMgZnJvbSBhIGNvbW1hbmQgcmVzb3VyY2UgKGZpbGUpIG9uIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcga2V5IGF1dGhlbnRpY2F0aW9uIHdpdGggbm8gcGFzc3BocmFzZTwvYj48L3A+Cis8cD5SdW4gYSBjb21tYW5kIG9uIGEgcmVtb3RlIG1hY2hpbmUgdXNpbmcga2V5IGF1dGhlbnRpY2F0aW9uPC9wPgorCiA8cHJlPgotICAmbHQ7c3NoZXhlYyBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7Ci0JdXNlcm5hbWU9JnF1b3Q7ZHVkZSZxdW90OwotCWtleWZpbGU9JnF1b3Q7JHt1c2VyLmhvbWV9Ly5zc2gvaWRfZHNhJnF1b3Q7Ci0JY29tbWFuZFJlc291cmNlPSZxdW90O3RvX3J1biZxdW90Oy8mZ3Q7Ci08L3ByZT4KKyZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKyAgICAgICAgIHVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKyAgICAgICAgIGtleWZpbGU9JnF1b3Q7JHt1c2VyLmhvbWV9Ly5zc2gvaWRfZHNhJnF1b3Q7CisgICAgICAgICBwYXNzcGhyYXNlPSZxdW90O3lvIGl0cyBhIHNlY3JldCZxdW90OworICAgICAgICAgY29tbWFuZD0mcXVvdDt0b3VjaCBzb21lZmlsZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxwPlJ1biBhIGNvbW1hbmQgb24gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYXV0aGVudGljYXRpb24gd2l0aCBubyBwYXNzcGhyYXNlPC9wPgogCi08cD48c3Ryb25nPlNlY3VyaXR5IE5vdGU6PC9zdHJvbmc+ICBIYXJkIGNvZGluZyBwYXNzd29yZHMgYW5kL29yIHVzZXJuYW1lcwotaW4gc3NoZXhlYyB0YXNrIGNhbiBiZSBhIHNlcmlvdXMgc2VjdXJpdHkgaG9sZS4gIENvbnNpZGVyIHVzaW5nIHZhcmlhYmxlCi1zdWJzdGl0dXRpb24gYW5kIGluY2x1ZGUgdGhlIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZTo8YnI+CiA8cHJlPgotICAmbHQ7c3NoZXhlYyBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7Ci0JdXNlcm5hbWU9JnF1b3Q7JHt1c2VybmFtZX0mcXVvdDsKLQlwYXNzd29yZD0mcXVvdDske3Bhc3N3b3JkfSZxdW90OwotCWNvbW1hbmQ9JnF1b3Q7dG91Y2ggc29tZWZpbGUmcXVvdDsvJmd0OwotPC9wcmU+Ci1JbnZva2luZyBhbnQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgbGluZToKLTxwcmU+Ci0gICAgYW50IC1EdXNlcm5hbWU9bWUgLURwYXNzd29yZD1teXBhc3N3b3JkIHRhcmdldDEgdGFyZ2V0MgotPC9wcmU+CismbHQ7c3NoZXhlYyBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7CisgICAgICAgICB1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7CisgICAgICAgICBrZXlmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uc3NoL2lkX2RzYSZxdW90OworICAgICAgICAgY29tbWFuZD0mcXVvdDt0b3VjaCBzb21lZmlsZSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLUlzIHNsaWdodGx5IGJldHRlciwgYnV0IHRoZSB1c2VybmFtZS9wYXNzd29yZCBpcyBleHBvc2VkIHRvIGFsbCB1c2Vycwotb24gYW4gVW5peCBzeXN0ZW0gKHZpYSB0aGUgcHMgY29tbWFuZCkuIFRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvIHVzZQotdGhlCi08Y29kZT4mbHQ7aW5wdXQmZ3Q7PC9jb2RlPiB0YXNrIGFuZC9vciByZXRyaWV2ZSB0aGUgcGFzc3dvcmQgZnJvbSBhIChzZWN1cmVkKQotLnByb3BlcnRpZXMgZmlsZS4KLTwvcD4KKzxwPlJ1biBhIHNldCBvZiBjb21tYW5kcyBmcm9tIGEgY29tbWFuZCByZXNvdXJjZSAoZmlsZSkgb24gYSByZW1vdGUgbWFjaGluZSB1c2luZyBrZXkgYXV0aGVudGljYXRpb24KK3dpdGggbm8gcGFzc3BocmFzZTwvcD4KKworPHByZT4KKyZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKyAgICAgICAgIHVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKyAgICAgICAgIGtleWZpbGU9JnF1b3Q7JHt1c2VyLmhvbWV9Ly5zc2gvaWRfZHNhJnF1b3Q7CisgICAgICAgICBjb21tYW5kUmVzb3VyY2U9JnF1b3Q7dG9fcnVuJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+PHN0cm9uZz5TZWN1cml0eSBOb3RlPC9zdHJvbmc+OiBIYXJkY29kaW5nIHBhc3N3b3JkcyBhbmQvb3IgdXNlcm5hbWVzIGluIDx2YXI+c3NoZXhlYzwvdmFyPiB0YXNrCitjYW4gYmUgYSBzZXJpb3VzIHNlY3VyaXR5IGhvbGUuIENvbnNpZGVyIHVzaW5nIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBhbmQgaW5jbHVkZSB0aGUgcGFzc3dvcmQgb24gdGhlCitjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOjwvcD4KKworPHByZT4KKyZsdDtzc2hleGVjIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKyAgICAgICAgIHVzZXJuYW1lPSZxdW90OyR7dXNlcm5hbWV9JnF1b3Q7CisgICAgICAgICBwYXNzd29yZD0mcXVvdDske3Bhc3N3b3JkfSZxdW90OworICAgICAgICAgY29tbWFuZD0mcXVvdDt0b3VjaCBzb21lZmlsZSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkludm9raW5nIEFudCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lOjwvcD4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLUR1c2VybmFtZT1tZSAtRHBhc3N3b3JkPW15cGFzc3dvcmQgdGFyZ2V0MSB0YXJnZXQyPC9wcmU+Cis8cD5pcyBzbGlnaHRseSBiZXR0ZXIsIGJ1dCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgaXMgZXhwb3NlZCB0byBhbGwgdXNlcnMgb24gYW4gVW5peCBzeXN0ZW0gKHZpYQordGhlIDxrYmQ+cHM8L2tiZD4gY29tbWFuZCkuIFRoZSBiZXN0IGFwcHJvYWNoIGlzIHRvIHVzZSB0aGUgPGNvZGU+Jmx0O2lucHV0Jmd0OzwvY29kZT4gdGFzayBhbmQvb3IKK3JldHJpZXZlIHRoZSBwYXNzd29yZCBmcm9tIGEgKHNlY3VyZWQpIDxzYW1wPi5wcm9wZXJ0aWVzPC9zYW1wPiBmaWxlLjwvcD4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zc2hzZXNzaW9uLmh0bWwgYi9tYW51YWwvVGFza3Mvc3Noc2Vzc2lvbi5odG1sCmluZGV4IGU5Njk2ZDEuLjZmNTU3YmIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zc2hzZXNzaW9uLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3NzaHNlc3Npb24uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI3NSArMTUsMjQ3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TU0hTRVNTSU9OIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InNzaHNlc3Npb24iPlNTSFNFU1NJT048L2E+PC9oMj4KKzxoMiBpZD0ic3Noc2Vzc2lvbiI+U1NIU0VTU0lPTjwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjguMDwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAotPHA+PGVtPnNpbmNlIEFwYWNoZSBBbnQgMS44LjA8L2VtPjwvcD4KKzxwPkEgVGFzayB3aGljaCBlc3RhYmxpc2hlcyBhbiBTU0ggY29ubmVjdGlvbiB3aXRoIGEgcmVtb3RlIG1hY2hpbmUgcnVubmluZyBTU0ggZGFlbW9uLCBvcHRpb25hbGx5Citlc3RhYmxpc2hlcyBhbnkgbnVtYmVyIG9mIGxvY2FsIG9yIHJlbW90ZSB0dW5uZWxzIG92ZXIgdGhhdCBjb25uZWN0aW9uLCB0aGVuIGV4ZWN1dGVzIGFueSBuZXN0ZWQKK3Rhc2tzIGJlZm9yZSB0YWtpbmcgZG93biB0aGUgY29ubmVjdGlvbi48L3A+CiAKLTxwPkEgVGFzayB3aGljaCBlc3RhYmxpc2hlcyBhbiBTU0ggY29ubmVjdGlvbiB3aXRoIGEgcmVtb3RlIG1hY2hpbmUKLXJ1bm5pbmcgU1NIIGRhZW1vbiwgb3B0aW9uYWxseSBlc3RhYmxpc2hlcyBhbnkgbnVtYmVyIG9mIGxvY2FsIG9yCi1yZW1vdGUgdHVubmVscyBvdmVyIHRoYXQgY29ubmVjdGlvbiwgdGhlbiBleGVjdXRlcyBhbnkgbmVzdGVkIHRhc2tzCi1iZWZvcmUgdGFraW5nIGRvd24gdGhlIGNvbm5lY3Rpb24uCi08L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFRoaXMgdGFzayBkZXBlbmRzIG9uIGV4dGVybmFsIGxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudAorZGlzdHJpYnV0aW9uLiBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZQoraW5mb3JtYXRpb24uICBUaGlzIHRhc2sgaGFzIGJlZW4gdGVzdGVkIHdpdGggSlNDaCAwLjEuMzMgYW5kIGFib3ZlIGFuZCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgb2YKK0pTQ2ggZWFybGllciB0aGFuIDAuMS4yOC48L3A+CiAKLTxwPjxiPk5vdGU6PC9iPiBUaGlzIHRhc2sgZGVwZW5kcyBvbiBleHRlcm5hbCBsaWJyYXJpZXMgbm90IGluY2x1ZGVkCi1pbiB0aGUgQW50Ci1kaXN0cmlidXRpb24uIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeQotRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aAotanNjaC0wLjEuMzMgYW5kIGFib3ZlIGFuZCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgb2YganNjaCBlYXJsaWVyCi10aGFuIDAuMS4yOC48L3A+Ci0KLTxwPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJzc2hleGVjLmh0bWwiPnNzaGV4ZWM8L2E+Ci1hbmQgPGEgaHJlZj0ic2NwLmh0bWwiPnNjcDwvYT4gdGFza3M8L3A+Cis8cD5TZWUgYWxzbyB0aGUgPGEgaHJlZj0ic3NoZXhlYy5odG1sIj5zc2hleGVjPC9hPiBhbmQgPGEgaHJlZj0ic2NwLmh0bWwiPnNjcDwvYT4gdGFza3M8L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aG9zdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gd2hpY2ggeW91IHdpc2ggdG8gY29ubmVjdC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+aG9zdDwvdGQ+CisgICAgPHRkPlRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB5b3Ugd2lzaCB0byBjb25uZWN0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZXJuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1c2VybmFtZSBvbiB0aGUgcmVtb3RlIGhvc3QgdG8gd2hpY2ggeW91IGFyZSBjb25uZWN0aW5nLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD51c2VybmFtZTwvdGQ+CisgICAgPHRkPlRoZSB1c2VybmFtZSBvbiB0aGUgcmVtb3RlIGhvc3QgdG8gd2hpY2ggeW91IGFyZSBjb25uZWN0aW5nLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuPC90ZD4KLSAgICA8dGQgdmFsaWFuPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byAyMi48L3RkPgorICAgIDx0ZD5wb3J0PC90ZD4KKyAgICA8dGQ+VGhlIHBvcnQgdG8gY29ubmVjdCB0byBvbiB0aGUgcmVtb3RlIGhvc3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjIyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bG9jYWx0dW5uZWxzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YKLSAgICAgIGNvbG9uLWRlbGltaXRlZCA8Y29kZT5scG9ydDpyaG9zdDpycG9ydDwvY29kZT4gdHJpcGxldHMgZGVmaW5pbmcKLSAgICAgIGxvY2FsIHBvcnQgZm9yd2FyZGluZy48YnI+ICBJZgotICAgICAgbmVzdGVkIDxhIGhyZWY9IiNMb2NhbFR1bm5lbCI+bG9jYWx0dW5uZWw8L2E+IGVsZW1lbnRzIGFyZSBhbHNvCisgICAgPHRkPmxvY2FsdHVubmVsczwvdGQ+CisgICAgPHRkPkEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgY29sb24tZGVsaW1pdGVkIDxzYW1wPmxwb3J0OnJob3N0OnJwb3J0PC9zYW1wPiB0cmlwbGV0cyBkZWZpbmluZworICAgICAgbG9jYWwgcG9ydCBmb3J3YXJkaW5nLjxici8+SWYgbmVzdGVkIDxhIGhyZWY9IiNMb2NhbFR1bm5lbCI+bG9jYWx0dW5uZWw8L2E+IGVsZW1lbnRzIGFyZSBhbHNvCiAgICAgICBwcm92aWRlZCwgYm90aCBzZXRzIG9mIHR1bm5lbHMgd2lsbCBiZSBlc3RhYmxpc2hlZC48L3RkPgotICAgIDx0ZCB2YWxpYW49InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbW90ZXR1bm5lbHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZgotICAgICAgY29sb24tZGVsaW1pdGVkIDxjb2RlPnJwb3J0Omxob3N0Omxwb3J0PC9jb2RlPiB0cmlwbGV0cyBkZWZpbmluZwotICAgICAgcmVtb3RlIHBvcnQgZm9yd2FyZGluZy48YnI+ICBJZgotICAgICAgbmVzdGVkIDxhIGhyZWY9IiNSZW1vdGVUdW5uZWwiPnJlbW90ZXR1bm5lbDwvYT4gZWxlbWVudHMgYXJlCisgICAgPHRkPnJlbW90ZXR1bm5lbHM8L3RkPgorICAgIDx0ZD5BIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIGNvbG9uLWRlbGltaXRlZCA8c2FtcD5ycG9ydDpsaG9zdDpscG9ydDwvc2FtcD4gdHJpcGxldHMgZGVmaW5pbmcKKyAgICAgIHJlbW90ZSBwb3J0IGZvcndhcmRpbmcuPGJyLz4gIElmIG5lc3RlZCA8YSBocmVmPSIjUmVtb3RlVHVubmVsIj5yZW1vdGV0dW5uZWw8L2E+IGVsZW1lbnRzIGFyZQogICAgICAgYWxzbyBwcm92aWRlZCwgYm90aCBzZXRzIG9mIHR1bm5lbHMgd2lsbCBiZSBlc3RhYmxpc2hlZC48L3RkPgotICAgIDx0ZCB2YWxpYW49InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRydXN0PC90ZD4KLSAgICAKLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoaXMgdHJ1c3RzIGFsbCB1bmtub3duIGhvc3RzIGlmIHNldCB0byB5ZXMvdHJ1ZS48YnI+Ci0gICAgICA8c3Ryb25nPk5vdGU8L3N0cm9uZz4gSWYgeW91IHNldCB0aGlzIHRvIGZhbHNlICh0aGUgZGVmYXVsdCksIHRoZQotICAgICAgaG9zdCB5b3UgY29ubmVjdCB0byBtdXN0IGJlIGxpc3RlZCBpbiB5b3VyIGtub3duaG9zdHMgZmlsZSwgdGhpcwotICAgICAgYWxzbyBpbXBsaWVzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLjwvdGQ+Ci0gICAgPHRkIHZhbGlhbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gTm8uPC90ZD4KKyAgICA8dGQ+dHJ1c3Q8L3RkPgorICAgIDx0ZD5UaGlzIHRydXN0cyBhbGwgdW5rbm93biBob3N0cyBpZiBzZXQgdG8gPHE+eWVzPC9xPgorICAgICAgb3IgPHE+dHJ1ZTwvcT4uPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBzZXQgdGhpcyB0byA8cT5mYWxzZTwvcT4gKHRoZSBkZWZhdWx0KSwgdGhlCisgICAgICBob3N0IHlvdSBjb25uZWN0IHRvIG11c3QgYmUgbGlzdGVkIGluIHlvdXIgPHZhcj5rbm93bmhvc3RzPC92YXI+IGZpbGUsIHRoaXMgYWxzbyBpbXBsaWVzIHRoYXQKKyAgICAgIHRoZSBmaWxlIGV4aXN0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a25vd25ob3N0czwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIHNldHMgdGhlIGtub3duIGhvc3RzIGZpbGUgdG8gdXNlIHRvIHZhbGlkYXRlCi0gICAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LglUaGlzIG11c3QgYmUgYSBTU0gyIGZvcm1hdCBmaWxlLgotICAgICAgU1NIMSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC48L3RkPgotICAgIDx0ZCB2YWxpYW49InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvCi0gICAgICAke3VzZXIuaG9tZX0vLnNzaC9rbm93bl9ob3N0cy48L3RkPgorICAgIDx0ZD5rbm93bmhvc3RzPC90ZD4KKyAgICA8dGQ+VGhpcyBzZXRzIHRoZSBrbm93biBob3N0cyBmaWxlIHRvIHVzZSB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpdHkgb2YgdGhlIHJlbW90ZSBob3N0LiBUaGlzIG11c3QKKyAgICAgIGJlIGEgU1NIMiBmb3JtYXQgZmlsZS4gIFNTSDEgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPiR7dXNlci5ob21lfS8uc3NoL2tub3duX2hvc3RzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gaGFsdCB0aGUgYnVpbGQgaWYgdGhlIGNvbW1hbmQgZG9lcyBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gaGFsdCB0aGUgYnVpbGQgaWYgdGhlIGNvbW1hbmQgZG9lcyBub3QgY29tcGxldGUgc3VjY2Vzc2Z1bGx5LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXNzd29yZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm90IGlmIHlvdSBhcmUgdXNpbmcga2V5IGJhc2VkCi0gICAgICBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlIGZpbGUgb3IKLSAgICAgIHRvZGlyIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5wYXNzd29yZDwvdGQ+CisgICAgPHRkPlRoZSBwYXNzd29yZC48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZCBhdXRoZW50aWNhdGlvbiBvciB0aGUgcGFzc3dvcmQgaGFzIGJlZW4gZ2l2ZW4gaW4gdGhlCisgICAgICBmaWxlIG9yIDx2YXI+dG9kaXI8L3Zhcj4gYXR0cmlidXRlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Mb2NhdGlvbiBvZiB0aGUgZmlsZSBob2xkaW5nIHRoZSBwcml2YXRlIGtleS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCBpZiB5b3UgYXJlIHVzaW5nIGtleSBiYXNlZAotICAgICAgYXV0aGVudGljYXRpb24uPC90ZD4KKyAgICA8dGQ+a2V5ZmlsZTwvdGQ+CisgICAgPHRkPkxvY2F0aW9uIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHByaXZhdGUga2V5LjwvdGQ+CisgICAgPHRkPlllcywgaWYgeW91IGFyZSB1c2luZyBrZXkgYmFzZWQgYXV0aGVudGljYXRpb248L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzcGhyYXNlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlBhc3NwaHJhc2UgZm9yIHlvdXIgcHJpdmF0ZSBrZXkuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuPC90ZD4KKyAgICA8dGQ+cGFzc3BocmFzZTwvdGQ+CisgICAgPHRkPlBhc3NwaHJhc2UgZm9yIHlvdXIgcHJpdmF0ZSBrZXkuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRpbWVvdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+R2l2ZSB1cCBpZiB0aGUgY29ubmVjdGlvbiBjYW5ub3QgYmUgZXN0YWJsaXNoZWQKLSAgICAgIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluIG1pbGxpc2Vjb25kcykuIERlZmF1bHRzIHRvIDAKLSAgICAgIHdoaWNoIG1lYW5zICZxdW90O3dhaXQgZm9yZXZlciZxdW90Oy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5zc2hDb25maWc8L3RkPgorICAgIDx0ZD5Mb2NhdGlvbiBvZiB0aGUgZmlsZSBob2xkaW5nIHRoZSBPcGVuU1NIIHN0eWxlIGNvbmZpZ3VyYXRpb24gKGUuZy4gPGNvZGU+JHt1c2VyLmhvbWV9Ly5zc2gvY29uZmlnPC9jb2RlPikuCisgICAgICAgIFRoZSB1c2VybmFtZSBhbmQgdGhlIGtleSBmaWxlIGFyZSByZWFkIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyAgICAgICAgdW5sZXNzIHRoZXkgYXJlIGFscmVhZHkgc3BlY2lmaWVkIGluIHRoZSB0YXNrIHBhcmFtZXRlcnMuCisgICAgICAgIDxlbT5zaW5jZSBBbnQgMS4xMC44PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dGltZW91dDwvdGQ+CisgICAgPHRkPkdpdmUgdXAgaWYgdGhlIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgKGdpdmVuIGluCisgICAgICBtaWxsaXNlY29uZHMpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPiB3aGljaCBtZWFucyA8cT5uZXZlcjwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxhIG5hbWU9IkxvY2FsVHVubmVsIj48aDQ+bG9jYWx0dW5uZWw8L2g0PjwvYT4KLTxwPk9wdGlvbmFsbHksIGFueSBudW1iZXIgb2YgbG9jYWx0dW5uZWwgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8KLWRlZmluZSBsb2NhbCBwb3J0IGZvcndhcmRpbmcgb3ZlciB0aGUgU1NIIGNvbm5lY3Rpb24uICBJZiB0aGUKLWxvY2FsdHVubmVscyBwYXJhbWV0ZXIgd2FzIGFsc28gc3BlY2lmaWVkLCBib3RoIHNldHMgb2YgdHVubmVscyB3aWxsCi1iZSBlc3RhYmxpc2hlZC48L3A+Cis8aDQgaWQ9IkxvY2FsVHVubmVsIj5sb2NhbHR1bm5lbDwvaDQ+Cis8cD5PcHRpb25hbGx5LCBhbnkgbnVtYmVyIG9mIDxjb2RlPmxvY2FsdHVubmVsPC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgbG9jYWwgcG9ydAorZm9yd2FyZGluZyBvdmVyIHRoZSBTU0ggY29ubmVjdGlvbi4gIElmIHRoZSA8dmFyPmxvY2FsdHVubmVsczwvdmFyPiBwYXJhbWV0ZXIgd2FzIGFsc28gc3BlY2lmaWVkLAorYm90aCBzZXRzIG9mIHR1bm5lbHMgd2lsbCBiZSBlc3RhYmxpc2hlZC48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bHBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiB0aGUgbG9jYWwgcG9ydCB0byBiZSBmb3J3YXJkZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmxwb3J0PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiB0aGUgbG9jYWwgcG9ydCB0byBiZSBmb3J3YXJkZWQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmhvc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGhvc3RuYW1lIG9yIElQIGFkZHJlc3Mgb2YgdGhlIHJlbW90ZSBob3N0IHRvCi0gICAgICB3aGljaCB0aGUgbG9jYWwgcG9ydCBzaG91bGQgYmUgZm9yd2FyZGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5yaG9zdDwvdGQ+CisgICAgPHRkPlRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB0aGUgbG9jYWwgcG9ydCBzaG91bGQgYmUKKyAgICAgIGZvcndhcmRlZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ycG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIHRoZSBwb3J0IG9uIHRoZSByZW1vdGUgaG9zdCB0bwotICAgICAgd2hpY2ggdGhlIGxvY2FsIHBvcnQgc2hvdWxkIGJlIGZvcndhcmRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cnBvcnQ8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIHRoZSBwb3J0IG9uIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB0aGUgbG9jYWwgcG9ydCBzaG91bGQgYmUgZm9yd2FyZGVkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08YSBuYW1lPSJSZW1vdGVUdW5uZWwiPjxoND5yZW1vdGV0dW5uZWw8L2g0PjwvYT4KLTxwPk9wdGlvbmFsbHksIGFueSBudW1iZXIgb2YgcmVtb3RldHVubmVsIGVsZW1lbnRzIGNhbiBiZSB1c2VkIHRvCi1kZWZpbmUgcmVtb3RlIHBvcnQgZm9yd2FyZGluZyBvdmVyIHRoZSBTU0ggY29ubmVjdGlvbi4gIElmIHRoZQotcmVtb3RldHVubmVscyBwYXJhbWV0ZXIgd2FzIGFsc28gc3BlY2lmaWVkLCBib3RoIHNldHMgb2YgdHVubmVscyB3aWxsCi1iZSBlc3RhYmxpc2hlZC48L3A+Cis8aDQgaWQ9IlJlbW90ZVR1bm5lbCI+cmVtb3RldHVubmVsPC9oND4KKzxwPk9wdGlvbmFsbHksIGFueSBudW1iZXIgb2YgPGNvZGU+cmVtb3RldHVubmVsPC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgcmVtb3RlIHBvcnQKK2ZvcndhcmRpbmcgb3ZlciB0aGUgU1NIIGNvbm5lY3Rpb24uICBJZiB0aGUgPHZhcj5yZW1vdGV0dW5uZWxzPC92YXI+IHBhcmFtZXRlciB3YXMgYWxzbyBzcGVjaWZpZWQsCitib3RoIHNldHMgb2YgdHVubmVscyB3aWxsIGJlIGVzdGFibGlzaGVkLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5ycG9ydDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgcG9ydCB0byBiZSBmb3J3YXJkZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnJwb3J0PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIHBvcnQgdG8gYmUgZm9yd2FyZGVkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxob3N0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBob3N0bmFtZSBvciBJUCBhZGRyZXNzIG9mIHRoZSBsb2NhbCBob3N0IHRvCi0gICAgICB3aGljaCB0aGUgcmVtb3RlIHBvcnQgc2hvdWxkIGJlIGZvcndhcmRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+bGhvc3Q8L3RkPgorICAgIDx0ZD5UaGUgaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyBvZiB0aGUgbG9jYWwgaG9zdCB0byB3aGljaCB0aGUgcmVtb3RlIHBvcnQgc2hvdWxkIGJlCisgICAgICBmb3J3YXJkZWQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bHBvcnQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdCB0byB3aGljaAotICAgICAgdGhlIHJlbW90ZSBwb3J0IHNob3VsZCBiZSBmb3J3YXJkZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmxwb3J0PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiB0aGUgcG9ydCBvbiB0aGUgbG9jYWwgaG9zdCB0byB3aGljaCB0aGUgcmVtb3RlIHBvcnQgc2hvdWxkIGJlIGZvcndhcmRlZC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGEgbmFtZT0iU2VxdWVudGlhbCI+PGg0PnNlcXVlbnRpYWw8L2g0PjwvYT4KLTxwPlRoZSBzZXF1ZW50aWFsIGVsZW1lbnQgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIuICBJdCBpcyBhIGNvbnRhaW5lcgotZm9yIG5lc3RlZCBUYXNrcyB3aGljaCBhcmUgdG8gYmUgZXhlY3V0ZWQgb25jZSB0aGUgU1NIIGNvbm5lY3Rpb24gaXMKLWVzdGFibGlzaGVkIGFuZCBhbGwgbG9jYWwgYW5kL29yIHJlbW90ZSB0dW5uZWxzIGVzdGFibGlzaGVkLjwvcD4KKzxoNCBpZD0iU2VxdWVudGlhbCI+c2VxdWVudGlhbDwvaDQ+Cis8cD5UaGUgPGNvZGU+c2VxdWVudGlhbDwvY29kZT4gZWxlbWVudCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4gIEl0IGlzIGEgY29udGFpbmVyIGZvciBuZXN0ZWQgVGFza3MKK3doaWNoIGFyZSB0byBiZSBleGVjdXRlZCBvbmNlIHRoZSBTU0ggY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBhbmQgYWxsIGxvY2FsIGFuZC9vciByZW1vdGUgdHVubmVscworZXN0YWJsaXNoZWQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHA+PGI+Q29ubmVjdCB0byBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLAotZm9yd2FyZCB0aGUgbG9jYWwgY3ZzIHBvcnQgdG8gdGhlIHJlbW90ZSBob3N0LCBhbmQgZXhlY3V0ZSBhIGN2cwotY29tbWFuZCBsb2NhbGx5LCB3aGljaCBjYW4gdXNlIHRoZSB0dW5uZWwuPC9iPjwvcD4KKworPHA+Q29ubmVjdCB0byBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uLCBmb3J3YXJkIHRoZSBsb2NhbCBDVlMgcG9ydCB0byB0aGUKK3JlbW90ZSBob3N0LCBhbmQgZXhlY3V0ZSBhIENWUyBjb21tYW5kIGxvY2FsbHksIHdoaWNoIGNhbiB1c2UgdGhlIHR1bm5lbC48L3A+CisKIDxwcmU+Ci0gICZsdDtzc2hzZXNzaW9uIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLSAgICB1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7Ci0gICAgcGFzc3dvcmQ9JnF1b3Q7eW8mcXVvdDsKLSAgICBsb2NhbHR1bm5lbHM9JnF1b3Q7MjQwMTpsb2NhbGhvc3Q6MjQwMSZxdW90OwotICAmZ3Q7Ci0gICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7Y3ZzICBjb21tYW5kPSZxdW90O3VwZGF0ZSAke2N2cy5wYXJtc30gJHttb2R1bGV9JnF1b3Q7Ci0gICAgICAgIGN2c1Jvb3Q9JnF1b3Q7JHtjdnMucm9vdH0mcXVvdDsKLSAgICAgICAgZGVzdD0mcXVvdDske2xvY2FsLnJvb3R9JnF1b3Q7Ci0gICAgICAgIGZhaWxvbmVycm9yPSZxdW90O3RydWUmcXVvdDsKLSAgICAgIC8mZ3Q7Ci0gICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotICAmbHQ7L3NzaHNlc3Npb24mZ3Q7Ci08L3ByZT4KKyZsdDtzc2hzZXNzaW9uIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKKyAgICAgICAgICAgIHVzZXJuYW1lPSZxdW90O2R1ZGUmcXVvdDsKKyAgICAgICAgICAgIHBhc3N3b3JkPSZxdW90O3lvJnF1b3Q7CisgICAgICAgICAgICBsb2NhbHR1bm5lbHM9JnF1b3Q7MjQwMTpsb2NhbGhvc3Q6MjQwMSZxdW90OyZndDsKKyAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0O2N2cyBjb21tYW5kPSZxdW90O3VwZGF0ZSAke2N2cy5wYXJtc30gJHttb2R1bGV9JnF1b3Q7CisgICAgICAgICBjdnNSb290PSZxdW90OyR7Y3ZzLnJvb3R9JnF1b3Q7CisgICAgICAgICBkZXN0PSZxdW90OyR7bG9jYWwucm9vdH0mcXVvdDsKKyAgICAgICAgIGZhaWxvbmVycm9yPSZxdW90O3RydWUmcXVvdDsvJmd0OworICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L3NzaHNlc3Npb24mZ3Q7PC9wcmU+CiAKLTxwPjxiPkRvIHRoZSBzYW1lIHRoaW5nIHVzaW5nIG5lc3RlZCBsb2NhbHR1bm5lbCBlbGVtZW50LjwvYj48L3A+Cis8cD5EbyB0aGUgc2FtZSB0aGluZyB1c2luZyBuZXN0ZWQgPGNvZGU+bG9jYWx0dW5uZWw8L2NvZGU+IGVsZW1lbnQuPC9wPgorCiA8cHJlPgotICAmbHQ7c3Noc2Vzc2lvbiBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7Ci0gICAgdXNlcm5hbWU9JnF1b3Q7ZHVkZSZxdW90OwotICAgIHBhc3N3b3JkPSZxdW90O3lvJnF1b3Q7Ci0gICZndDsKLSAgICAmbHQ7bG9jYWx0dW5uZWwgbHBvcnQ9JnF1b3Q7MjQwMSZxdW90OyByaG9zdD0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgcnBvcnQ9JnF1b3Q7MjQwMSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7Y3ZzICBjb21tYW5kPSZxdW90O3VwZGF0ZSAke2N2cy5wYXJtc30gJHttb2R1bGV9JnF1b3Q7Ci0gICAgICAgIGN2c1Jvb3Q9JnF1b3Q7JHtjdnMucm9vdH0mcXVvdDsKLSAgICAgICAgZGVzdD0mcXVvdDske2xvY2FsLnJvb3R9JnF1b3Q7Ci0gICAgICAgIGZhaWxvbmVycm9yPSZxdW90O3RydWUmcXVvdDsKLSAgICAvJmd0OwotICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgJmx0Oy9zc2hzZXNzaW9uJmd0OwotPC9wcmU+CismbHQ7c3Noc2Vzc2lvbiBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7CisgICAgICAgICAgICB1c2VybmFtZT0mcXVvdDtkdWRlJnF1b3Q7CisgICAgICAgICAgICBwYXNzd29yZD0mcXVvdDt5byZxdW90OyZndDsKKyAgJmx0O2xvY2FsdHVubmVsIGxwb3J0PSZxdW90OzI0MDEmcXVvdDsgcmhvc3Q9JnF1b3Q7bG9jYWxob3N0JnF1b3Q7IHJwb3J0PSZxdW90OzI0MDEmcXVvdDsvJmd0OworICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAmbHQ7Y3ZzIGNvbW1hbmQ9JnF1b3Q7dXBkYXRlICR7Y3ZzLnBhcm1zfSAke21vZHVsZX0mcXVvdDsKKyAgICAgICAgIGN2c1Jvb3Q9JnF1b3Q7JHtjdnMucm9vdH0mcXVvdDsKKyAgICAgICAgIGRlc3Q9JnF1b3Q7JHtsb2NhbC5yb290fSZxdW90OworICAgICAgICAgZmFpbG9uZXJyb3I9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CisgICZsdDsvc2VxdWVudGlhbCZndDsKKyZsdDsvc3Noc2Vzc2lvbiZndDs8L3ByZT4KIAotPHA+PGI+Q29ubmVjdCB0byBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIGtleSBhdXRoZW50aWNhdGlvbiwgZm9yd2FyZAotcG9ydCAxMDgwIHRvIHBvcnQgODAgb2YgYW4gaW50cmFuZXQgc2VydmVyIHdoaWNoIGlzIG5vdCBkaXJlY3RseQotYWNjZXNzaWJsZSwgdGhlbiBydW4gYSBnZXQgdGFzayB1c2luZyB0aGF0IHR1bm5lbC48L2I+PC9wPgorPHA+Q29ubmVjdCB0byBhIHJlbW90ZSBtYWNoaW5lIHVzaW5nIGtleSBhdXRoZW50aWNhdGlvbiwgZm9yd2FyZCBwb3J0IDEwODAgdG8gcG9ydCA4MCBvZiBhbiBpbnRyYW5ldAorc2VydmVyIHdoaWNoIGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlLCB0aGVuIHJ1biBhIDxjb2RlPmdldDwvY29kZT4gdGFzayB1c2luZyB0aGF0IHR1bm5lbC48L3A+CisKIDxwcmU+Ci0gICZsdDtzc2hzZXNzaW9uIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLSAgdXNlcm5hbWU9JnF1b3Q7ZHVkZSZxdW90OwotICBrZXlmaWxlPSZxdW90OyR7dXNlci5ob21lfS8uc3NoL2lkX2RzYSZxdW90OwotICBwYXNzcGhyYXNlPSZxdW90O3lvIGl0cyBhIHNlY3JldCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O0xvY2FsVHVubmVsIGxwb3J0PSZxdW90OzEwODAmcXVvdDsgcmhvc3Q9JnF1b3Q7aW50cmFuZXQubXljb21wLmNvbSZxdW90OyBycG9ydD0mcXVvdDs4MCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7Z2V0IHNyYz0mcXVvdDtodHRwOi8vbG9jYWxob3N0OjEwODAvc29tZWZpbGUmcXVvdDsgZGVzdD0mcXVvdDt0ZW1wL3NvbWVmaWxlJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICZsdDsvc3Noc2Vzc2lvbiZndDsKLTwvcHJlPgorJmx0O3NzaHNlc3Npb24gaG9zdD0mcXVvdDtzb21laG9zdCZxdW90OworICAgICAgICAgICAgdXNlcm5hbWU9JnF1b3Q7ZHVkZSZxdW90OworICAgICAgICAgICAga2V5ZmlsZT0mcXVvdDske3VzZXIuaG9tZX0vLnNzaC9pZF9kc2EmcXVvdDsKKyAgICAgICAgICAgIHBhc3NwaHJhc2U9JnF1b3Q7eW8gaXRzIGEgc2VjcmV0JnF1b3Q7LyZndDsKKyAgJmx0O0xvY2FsVHVubmVsIGxwb3J0PSZxdW90OzEwODAmcXVvdDsgcmhvc3Q9JnF1b3Q7aW50cmFuZXQubXljb21wLmNvbSZxdW90OyBycG9ydD0mcXVvdDs4MCZxdW90Oy8mZ3Q7CisgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICZsdDtnZXQgc3JjPSZxdW90O2h0dHA6Ly9sb2NhbGhvc3Q6MTA4MC9zb21lZmlsZSZxdW90OyBkZXN0PSZxdW90O3RlbXAvc29tZWZpbGUmcXVvdDsvJmd0OworICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L3NzaHNlc3Npb24mZ3Q7PC9wcmU+CiAKKzxwPjxzdHJvbmc+U2VjdXJpdHkgTm90ZTwvc3Ryb25nPjogSGFyZGNvZGluZyBwYXNzd29yZHMgb3IgcGFzc3BocmFzZXMgYW5kL29yIHVzZXJuYW1lcworaW4gPGNvZGU+c3Noc2Vzc2lvbjwvY29kZT4gdGFzayBjYW4gYmUgYSBzZXJpb3VzIHNlY3VyaXR5IGhvbGUuIENvbnNpZGVyIHVzaW5nIHZhcmlhYmxlIHN1YnN0aXR1dGlvbgorYW5kIGluY2x1ZGUgdGhlIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOjwvcD4KIAotPHA+PHN0cm9uZz5TZWN1cml0eSBOb3RlOjwvc3Ryb25nPiBIYXJkIGNvZGluZyBwYXNzd29yZHMgb3IKLXBhc3NwaHJhc2VzIGFuZC9vciB1c2VybmFtZXMgaW4gc3Noc2Vzc2lvbiB0YXNrIGNhbiBiZSBhIHNlcmlvdXMKLXNlY3VyaXR5IGhvbGUuIENvbnNpZGVyIHVzaW5nIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBhbmQgaW5jbHVkZSB0aGUKLXBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOjxicj4KIDxwcmU+Ci0gICZsdDtzc2hzZXNzaW9uIGhvc3Q9JnF1b3Q7c29tZWhvc3QmcXVvdDsKLSAgdXNlcm5hbWU9JnF1b3Q7JHt1c2VybmFtZX0mcXVvdDsKLSAgcGFzc3dvcmQ9JnF1b3Q7JHtwYXNzd29yZH0mcXVvdDsKLSAgbG9jYWx0dW5uZWxzPSZxdW90OzI0MDE6bG9jYWxob3N0OjI0MDEmcXVvdDsmZ3Q7Ci0gICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7c29tZXRhc2svJmd0OwotICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgJmx0Oy9zc2hzZXNzaW9uJmd0OwotPC9wcmU+CismbHQ7c3Noc2Vzc2lvbiBob3N0PSZxdW90O3NvbWVob3N0JnF1b3Q7CisgICAgICAgICAgICB1c2VybmFtZT0mcXVvdDske3VzZXJuYW1lfSZxdW90OworICAgICAgICAgICAgcGFzc3dvcmQ9JnF1b3Q7JHtwYXNzd29yZH0mcXVvdDsKKyAgICAgICAgICAgIGxvY2FsdHVubmVscz0mcXVvdDsyNDAxOmxvY2FsaG9zdDoyNDAxJnF1b3Q7Jmd0OworICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAmbHQ7c29tZXRhc2svJmd0OworICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CismbHQ7L3NzaHNlc3Npb24mZ3Q7PC9wcmU+CiAKLUludm9raW5nIGFudCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lOgotPHByZT4KLSAgICBhbnQgLUR1c2VybmFtZT1tZSAtRHBhc3N3b3JkPW15cGFzc3dvcmQgdGFyZ2V0MSB0YXJnZXQyCi08L3ByZT4KLQotSXMgc2xpZ2h0bHkgYmV0dGVyLCBidXQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkIGlzIGV4cG9zZWQgdG8gYWxsIHVzZXJzCi1vbiBhbiBVbml4IHN5c3RlbSAodmlhIHRoZSBwcyBjb21tYW5kKS4gVGhlIGJlc3QgYXBwcm9hY2ggaXMgdG8gdXNlCi10aGUKLTxjb2RlPiZsdDtpbnB1dCZndDs8L2NvZGU+IHRhc2sgYW5kL29yIHJldHJpZXZlIHRoZSBwYXNzd29yZCBmcm9tIGEgKHNlY3VyZWQpCi0ucHJvcGVydGllcyBmaWxlLgotPC9wPgorPHA+SW52b2tpbmcgQW50IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmU6PC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmFudCAtRHVzZXJuYW1lPW1lIC1EcGFzc3dvcmQ9bXlwYXNzd29yZCB0YXJnZXQxIHRhcmdldDI8L3ByZT4KKzxwPmlzIHNsaWdodGx5IGJldHRlciwgYnV0IHRoZSB1c2VybmFtZS9wYXNzd29yZCBpcyBleHBvc2VkIHRvIGFsbCB1c2VycyBvbiBhbiBVbml4IHN5c3RlbSAodmlhCit0aGUgPGtiZD5wczwva2JkPiBjb21tYW5kKS4gVGhlIGJlc3QgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSA8Y29kZT4mbHQ7aW5wdXQmZ3Q7PC9jb2RlPiB0YXNrIGFuZC9vcgorcmV0cmlldmUgdGhlIHBhc3N3b3JkIGZyb20gYSAoc2VjdXJlZCkgPHNhbXA+LnByb3BlcnRpZXM8L3NhbXA+IGZpbGUuPC9wPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3N0eWxlLmh0bWwgYi9tYW51YWwvVGFza3Mvc3R5bGUuaHRtbAppbmRleCA4MWU3ZTZiLi4yYWU0N2ExIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc3R5bGUuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvc3R5bGUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDU3NiArMTUsNTEzIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5YU0xUIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InN0eWxlIj5YU0xUPC9hPjwvaDI+Ci08cD48ZW0+VGhlIG5hbWUgPGNvZGU+c3R5bGU8L2NvZGU+IGlzIGEgZGVwcmVjYXRlZCBuYW1lIGZvciB0aGUgc2FtZSB0YXNrLjwvZW0+PC9wPgorPGgyIGlkPSJzdHlsZSI+WFNMVDwvaDI+Cis8cD48ZW0+VGhlIG5hbWUgPGNvZGU+c3R5bGU8L2NvZGU+IGlzIGEgPHU+ZGVwcmVjYXRlZDwvdT4gbmFtZSBmb3IgdGhlIHNhbWUgdGFzay48L2VtPjwvcD4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiA8cD5Qcm9jZXNzIGEgc2V0IG9mIGRvY3VtZW50cyB2aWEgWFNMVC48L3A+Ci08cD5UaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgdmlld3Mgb2YgWE1MIGJhc2VkIGRvY3VtZW50YXRpb24sCi1vciBmb3IgZ2VuZXJhdGluZyBjb2RlLjwvcD4KLTxwPjxiPk5vdGU6PC9iPiBJZiB5b3UgYXJlIHVzaW5nIEpESyAxLjQgb3IgaGlnaGVyLCB0aGlzIHRhc2sgZG9lcyBub3QgcmVxdWlyZSBleHRlcm5hbCBsaWJyYXJpZXMKLW5vdCBzdXBwbGllZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uIEhvd2V2ZXIsIG9mdGVuIHRoZSBidWlsdCBpbiBYU0wgZW5naW5lIGlzIG5vdCBhcyB1cAotdG8gZGF0ZSBhcyBhIGZyZXNoIGRvd25sb2FkLCBzbyBhbiB1cGRhdGUgaXMgc3RpbGwgaGlnaGx5IHJlY29tbWVuZGVkCi0gIGluIHBhcnRpY3VsYXIgc2luY2UgdGhlIGJ1aWx0LWluIFhTTFQgcHJvY2Vzc29ycyBvZiBKYXZhIDUgKGFuZCB0byBhCi0gIGNlcnRhaW4gZXh0ZW50IEphdmEgNikgYXJlIGtub3duIHRvIGhhdmUgc2VyaW91cyBpc3N1ZXMuCi1TZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBwcm9jZXNzZWQuIFRoaXMgY2FuIGJlCi1kb25lIHdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiwgPGk+aW5jbHVkZXNmaWxlPC9pPiwgPGk+ZXhjbHVkZXM8L2k+LCA8aT5leGNsdWRlc2ZpbGU8L2k+IGFuZCA8aT5kZWZhdWx0ZXhjbHVkZXM8L2k+Ci1hdHRyaWJ1dGVzLiBXaXRoIHRoZSA8aT5pbmNsdWRlczwvaT4gb3IgPGk+aW5jbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgeW91IHNwZWNpZnkgdGhlIGZpbGVzIHlvdSB3YW50IHRvCi1oYXZlIGluY2x1ZGVkIGJ5IHVzaW5nIHBhdHRlcm5zLiBUaGUgPGk+ZXhjbHVkZTwvaT4gb3IgPGk+ZXhjbHVkZXNmaWxlPC9pPiBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5Ci10aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcyBhbHNvIGRvbmUgd2l0aCBwYXR0ZXJucy4gQW5kCi1maW5hbGx5IHdpdGggdGhlIDxpPmRlZmF1bHRleGNsdWRlczwvaT4gYXR0cmlidXRlLCB5b3UgY2FuIHNwZWNpZnkgd2hldGhlciB5b3UKLXdhbnQgdG8gdXNlIGRlZmF1bHQgZXhjbHVzaW9ucyBvciBub3QuIFNlZSB0aGUgc2VjdGlvbiBvbiA8YQotaHJlZj0iLi4vZGlydGFza3MuaHRtbCNkaXJlY3RvcnliYXNlZHRhc2tzIj5kaXJlY3RvcnkgYmFzZWQgdGFza3M8L2E+LCBvbiBob3cgdGhlCis8cD5UaGlzIGlzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgdmlld3Mgb2YgWE1MIGJhc2VkIGRvY3VtZW50YXRpb24sIG9yIGZvciBnZW5lcmF0aW5nIGNvZGUuPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJZiB5b3UgYXJlIHVzaW5nIEpESyAxLjQgb3IgaGlnaGVyLCB0aGlzIHRhc2sgZG9lcyBub3QgcmVxdWlyZSBleHRlcm5hbAorbGlicmFyaWVzIG5vdCBzdXBwbGllZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uIEhvd2V2ZXIsIG9mdGVuIHRoZSBidWlsdCBpbiBYU0wgZW5naW5lIGlzIG5vdAorYXMgdXAgdG8gZGF0ZSBhcyBhIGZyZXNoIGRvd25sb2FkLCBzbyBhbiB1cGRhdGUgaXMgc3RpbGwgaGlnaGx5IHJlY29tbWVuZGVkIGluIHBhcnRpY3VsYXIgc2luY2UgdGhlCitidWlsdC1pbiBYU0xUIHByb2Nlc3NvcnMgb2YgSmF2YSA1IChhbmQgdG8gYSBjZXJ0YWluIGV4dGVudCBKYXZhIDYpIGFyZSBrbm93biB0byBoYXZlIHNlcmlvdXMKK2lzc3Vlcy4gIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvciBtb3JlCitpbmZvcm1hdGlvbi48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyBwcm9jZXNzZWQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAordGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4sIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+LCA8dmFyPmV4Y2x1ZGVzPC92YXI+LCA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPgorYW5kIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4gb3IgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4KK2F0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDx2YXI+ZXhjbHVkZTwvdmFyPgorb3IgPHZhcj5leGNsdWRlc2ZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcworYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZCBmaW5hbGx5IHdpdGggdGhlIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5Cit3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24KK29uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQogaW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+CiA8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQgc3VwcG9ydHMgYWxsCi0gIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiAoPGNvZGU+ZGlyPC9jb2RlPiBiZWNvbWVzIDxjb2RlPmJhc2VkaXI8L2NvZGU+KQotICBhcyB3ZWxsIGFzIHRoZSBuZXN0ZWQgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgotICBhbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CithdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gKDx2YXI+ZGlyPC92YXI+IGJlY29tZXMgPHZhcj5iYXNlZGlyPC92YXI+KSBhcyB3ZWxsCithcyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAotPHA+PGI+Tm90ZTwvYj46IFVubGlrZSBvdGhlciBzaW1pbGFyIHRhc2tzLCB0aGlzIHRhc2sgdHJlYXRzCi1kaXJlY3RvcmllcyB0aGF0IGhhdmUgYmVlbiBtYXRjaGVkIGJ5IHRoZSBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMgb2YKLXRoZSBpbXBsaWNpdCBmaWxlc2V0IGluIGEgc3BlY2lhbCB3YXkuICBJdCB3aWxsIGFwcGx5IHRoZSBzdHlsZXNoZWV0cwotdG8gYWxsIGZpbGVzIGNvbnRhaW4gaW4gdGhlbSBhcyB3ZWxsLiAgU2luY2UgdGhlIGRlZmF1bHQgaW5jbHVkZQotcGF0dGVybiBpcyA8Y29kZT4qKjwvY29kZT4gdGhpcyBtZWFucyBpdCB3aWxsIGFwcGx5IHRoZSBzdHlsZXNoZWV0IHRvCi1hbGwgZmlsZXMuICBJZiB5b3Ugc3BlY2lmeSBhbiBleGNsdWRlcyBwYXR0ZXJuLCBpdCBtYXkgc3RpbGwgd29yayBvbgotdGhlIGZpbGVzIG1hdGNoZWQgYnkgdGhvc2UgcGF0dGVybnMgYmVjYXVzZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBoYXMKLWJlZW4gbWF0Y2hlZC4gIElmIHRoaXMgYmVoYXZpb3IgaXMgbm90IHdoYXQgeW91IHdhbnQsIHNldCB0aGUKLXNjYW5pbmNsdWRlZGlyZWN0b3JpZXMgYXR0cmlidXRlIHRvIGZhbHNlLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVW5saWtlIG90aGVyIHNpbWlsYXIgdGFza3MsIHRoaXMgdGFzayB0cmVhdHMgZGlyZWN0b3JpZXMgdGhhdCBoYXZlIGJlZW4KK21hdGNoZWQgYnkgdGhlIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyBvZiB0aGUgaW1wbGljaXQgZmlsZXNldCBpbiBhIHNwZWNpYWwgd2F5LiAgSXQgd2lsbCBhcHBseSB0aGUKK3N0eWxlc2hlZXRzIHRvIGFsbCBmaWxlcyBjb250YWluIGluIHRoZW0gYXMgd2VsbC4gIFNpbmNlIHRoZSBkZWZhdWx0IDx2YXI+aW5jbHVkZXM8L3Zhcj4gcGF0dGVybgoraXMgPGNvZGU+Kio8L2NvZGU+IHRoaXMgbWVhbnMgaXQgd2lsbCBhcHBseSB0aGUgc3R5bGVzaGVldCB0byBhbGwgZmlsZXMuICBJZiB5b3Ugc3BlY2lmeQorYW4gPHZhcj5leGNsdWRlczwvdmFyPiBwYXR0ZXJuLCBpdCBtYXkgc3RpbGwgd29yayBvbiB0aGUgZmlsZXMgbWF0Y2hlZCBieSB0aG9zZSBwYXR0ZXJucyBiZWNhdXNlIHRoZQorcGFyZW50IGRpcmVjdG9yeSBoYXMgYmVlbiBtYXRjaGVkLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBub3Qgd2hhdCB5b3Ugd2FudCwgc2V0Cit0aGUgPHZhcj5zY2FuaW5jbHVkZWRpcmVjdG9yaWVzPC92YXI+IGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4uPC9wPgogCi08cD5TdGFydGluZyB3aXRoIEFudCAxLjcgdGhpcyB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YQotaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT5zCi1pbiBhZGRpdGlvbiB0byAob3IgaW5zdGVhZCBvZiwgZGVwZW5kaW5nIG9uIHRoZSB1c2VJbXBsaWNpdEZpbGVzZXQKLWF0dHJpYnV0ZSkgdGhlIGltcGxpY2l0IGZpbGVzZXQgZm9ybWVkIGJ5IHRoaXMgdGFzay48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+LCB0aGlzIHRhc2sgc3VwcG9ydHMKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4gaW4gYWRkaXRpb24gdG8gKG9yCitpbnN0ZWFkIG9mLCBkZXBlbmRpbmcgb24gdGhlIDx2YXI+dXNlSW1wbGljaXRGaWxlc2V0PC92YXI+IGF0dHJpYnV0ZSkgdGhlIGltcGxpY2l0IGZpbGVzZXQgZm9ybWVkIGJ5Cit0aGlzIHRhc2suPC9wPgogCi08cD5UaGlzIHRhc2sgc3VwcG9ydHMgdGhlIHVzZSBvZiBhIG5lc3RlZCA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50IHdoaWNoIGlzIHVzZWQgdG8gcGFzcyB2YWx1ZXMKLSAgdG8gYW4gPGNvZGU+Jmx0O3hzbDpwYXJhbSZndDs8L2NvZGU+IGRlY2xhcmF0aW9uLjwvcD4KLTxwPlRoaXMgdGFzayBzdXBwb3J0cyB0aGUgdXNlIG9mIGEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL3htbGNhdGFsb2cuaHRtbCI+eG1sY2F0YWxvZzwvYT4KLWVsZW1lbnQgd2hpY2ggaXMgdXNlZCB0byBwZXJmb3JtIEVudGl0eSBhbmQgVVJJIHJlc29sdXRpb24uPC9wPgorPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYSBuZXN0ZWQgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudCB3aGljaCBpcyB1c2VkIHRvIHBhc3MKK3ZhbHVlcyB0byBhbiA8Y29kZT4mbHQ7eHNsOnBhcmFtJmd0OzwvY29kZT4gZGVjbGFyYXRpb24uPC9wPgorPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMveG1sY2F0YWxvZy5odG1sIj54bWxjYXRhbG9nPC9hPiBlbGVtZW50Cit3aGljaCBpcyB1c2VkIHRvIHBlcmZvcm0gRW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+CiAKLTxwPjxiPk5vdGUgb24gWFNMVCBleHRlbnNpb24gZnVuY3Rpb25zPC9iPjogd2hlbiB1c2luZyB0aGUgZGVmYXVsdAotICBUcmFYIGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXZhIGNsYXNzIGxpYnJhcnkgYW5kCi0gIGEgPGNvZGU+U2VjdXJpdHlNYW5hZ2VyPC9jb2RlPiBpcyBhY3RpdmUgLSBlLmcuIHdoZW4gcnVubmluZyBmcm9tCi0gIHdpdGhpbiBhbiBJREUgLSBYU0xUIGV4dGVuc2lvbiBmdW5jdGlvbnMgY2Fubm90IGJlIHVzZWQgYXMgInNlY3VyZQotICBwcm9jZXNzaW5nIiBpcyBhY3RpdmUgaW4gSmF2YSA3IGFuZCBhYm92ZS4gQW50IGNvbnRhaW5zIGEgc3BlY2lhbAotICAiaGFjayIgdGhhdCBhbGxvd3MgWFNMVCBleHRlbnNpb25zIHRvIGJlIHVzZWQgaW4gSmF2YSA3IGFuZCA4LCBidXQKLSAgdGhpcyBoYWNrIGZhaWxzIGZvciBKYXZhIDkuIElmIHlvdSB3YW50IHRvIHVzZSBleHRlbnNpb25zIGxpa2UgdGhlCi0gIHJlZGlyZWN0IGV4dGVuc2lvbiB0aGF0IGFyZSBwcm92aWRlZCBieSB0aGUgSmF2YSBjbGFzcyBsaWJyYXJ5Ci0gIGl0c2VsZiwgeW91IGNhbiBhbGxvdyB0aGVtIGJ5IGVuYWJsaW5nIHRoZQotICBmZWF0dXJlIDxjb2RlPmh0dHA6Ly93d3cub3JhY2xlLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL2VuYWJsZUV4dGVuc2lvbkZ1bmN0aW9uczwvY29kZT4KLSAgaW4gSmF2YSA5IGFuZCBhYm92ZS4gSWYgeW91IG5lZWQgdG8gdXNlIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiBub3QKLSAgcHJvdmlkZWQgYnkgSmF2YSBpdHNlbGYgeW91IGNhbiBzZXQgdGhlCi0gIGF0dHJpYnV0ZSA8Y29kZT5qZGsueG1sLnRyYW5zZm9ybS5leHRlbnNpb25DbGFzc0xvYWRlcjwvY29kZT4gdG8gYQotICBjbGFzc2xvYWRlciAocmVmZXJlbmNlIHRvIGFuIEFudCBQQVRILWxpa2Ugc3RydWN0dXJlKS48L3A+Cis8cD48c3Ryb25nPk5vdGUgb24gWFNMVCBleHRlbnNpb24gZnVuY3Rpb25zPC9zdHJvbmc+OiB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IFRyQVggaW1wbGVtZW50YXRpb24gb2YKK3RoZSBKYXZhIGNsYXNzIGxpYnJhcnkgYW5kIGEgPGNvZGU+U2VjdXJpdHlNYW5hZ2VyPC9jb2RlPiBpcyBhY3RpdmUmbWRhc2g7ZS5nLiB3aGVuIHJ1bm5pbmcgZnJvbQord2l0aGluIGFuIElERSZtZGFzaDtYU0xUIGV4dGVuc2lvbiBmdW5jdGlvbnMgY2Fubm90IGJlIHVzZWQgYXMgInNlY3VyZSBwcm9jZXNzaW5nIiBpcyBhY3RpdmUgaW4gSmF2YQorNyBhbmQgYWJvdmUuIEFudCBjb250YWlucyBhIHNwZWNpYWwgImhhY2siIHRoYXQgYWxsb3dzIFhTTFQgZXh0ZW5zaW9ucyB0byBiZSB1c2VkIGluIEphdmEgNyBhbmQgOCwKK2J1dCB0aGlzIGhhY2sgZmFpbHMgZm9yIEphdmEgOS4gSWYgeW91IHdhbnQgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSB0aGUgcmVkaXJlY3QgZXh0ZW5zaW9uIHRoYXQgYXJlCitwcm92aWRlZCBieSB0aGUgSmF2YSBjbGFzcyBsaWJyYXJ5IGl0c2VsZiwgeW91IGNhbiBhbGxvdyB0aGVtIGJ5IGVuYWJsaW5nIHRoZQorZmVhdHVyZSA8dmFyPmh0dHA6Ly93d3cub3JhY2xlLmNvbS94bWwvamF4cC9wcm9wZXJ0aWVzL2VuYWJsZUV4dGVuc2lvbkZ1bmN0aW9uczwvdmFyPiBpbiBKYXZhIDkgYW5kCithYm92ZS4gSWYgeW91IG5lZWQgdG8gdXNlIGFuIGV4dGVuc2lvbiBmdW5jdGlvbiBub3QgcHJvdmlkZWQgYnkgSmF2YSBpdHNlbGYgeW91IGNhbiBzZXQgdGhlCithdHRyaWJ1dGUgPHZhcj5qZGsueG1sLnRyYW5zZm9ybS5leHRlbnNpb25DbGFzc0xvYWRlcjwvdmFyPiB0byBhIGNsYXNzbG9hZGVyIChyZWZlcmVuY2UgdG8gYW4gQW50CitwYXRoLWxpa2Ugc3RydWN0dXJlKS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVyZSB0byBmaW5kIHRoZSBzb3VyY2UgWE1MIGZpbGUsIGRlZmF1bHQgaXMgdGhlCi0gICAgICBwcm9qZWN0J3MgYmFzZWRpci48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+d2hlcmUgdG8gZmluZCB0aGUgc291cmNlIFhNTCBmaWxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlc3RkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyZWN0b3J5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZXN1bHRzLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBpbiBhbmQgb3V0IGhhdmUgYmVlbgotICAgICAgc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPmRlc3RkaXI8L3RkPgorICAgIDx0ZD5kaXJlY3RvcnkgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHJlc3VsdHMuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgPHZhcj5pbjwvdmFyPiBhbmQgPHZhcj5vdXQ8L3Zhcj4gaGF2ZSBiZWVuIHNwZWNpZmllZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leHRlbnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0cy4gSWYgbm90Ci0gICAgICBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGlzICZxdW90Oy5odG1sJnF1b3Q7LiAgV2lsbCBiZSBpZ25vcmVkIGlmCi0gICAgICBhIG5lc3RlZCA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gb3IgYm90aCA8Y29kZT5pbjwvY29kZT4gYW5kCi0gICAgICA8Y29kZT5vdXQ8L2NvZGU+IGhhdmUgYmVlbiBzcGVjaWZpZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXh0ZW5zaW9uPC90ZD4KKyAgICA8dGQ+ZGVzaXJlZCBmaWxlIGV4dGVuc2lvbiB0byBiZSB1c2VkIGZvciB0aGUgdGFyZ2V0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT4uaHRtbDwvcT4sIGlnbm9yZWQgaWYgYSBuZXN0ZWQgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IG9yCisgICAgICBib3RoIDx2YXI+aW48L3Zhcj4gYW5kIDx2YXI+b3V0PC92YXI+IGhhdmUgYmVlbiBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdHlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIHRoZSBzdHlsZXNoZWV0IHRvIHVzZSAtIGdpdmVuIGVpdGhlciByZWxhdGl2ZQotICAgICAgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyIG9yIGFzIGFuIGFic29sdXRlIHBhdGguPGJyLz4KLSAgICAgIDxici8+Ci0gICAgICBBbHRlcm5hdGl2ZWx5LCBhIG5lc3RlZCBlbGVtZW50IHdoaWNoIGFudCBjYW4gaW50ZXJwcmV0IGFzIGEgcmVzb3VyY2UKLSAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHdoZXJlIHRvIGZpbmQgdGhlIHN0eWxlc2hlZXQ8YnIvPgotICAgICAgPGVtPmRlcHJlY2F0ZWQgdmFyaWF0aW9uIDo8L2VtPiA8YnIvPgotICAgICAgSWYgdGhlIHN0eWxlc2hlZXQgY2Fubm90IGJlIGZvdW5kLCBhbmQgaWYgeW91IGhhdmUgc3BlY2lmaWVkIHRoZQotICAgICAgYXR0cmlidXRlIGJhc2VkaXIgZm9yIHRoZSB0YXNrLCBhbnQgd2lsbCBhc3N1bWUgdGhhdCB0aGUgc3R5bGUKLSAgICAgIGF0dHJpYnV0ZSBpcyByZWxhdGl2ZSB0byB0aGUgYmFzZWRpciBvZiB0aGUgdGFzay4KKyAgICA8dGQ+c3R5bGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIHRoZSBzdHlsZXNoZWV0IHRvIHVzZSZtZGFzaDtnaXZlbiBlaXRoZXIgcmVsYXRpdmUgdG8gdGhlCisgICAgICBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+IG9yIGFzIGFuIGFic29sdXRlIHBhdGguPGJyLz4gIEFsdGVybmF0aXZlbHksIGEgbmVzdGVkIGVsZW1lbnQKKyAgICAgIHdoaWNoIEFudCBjYW4gaW50ZXJwcmV0IGFzIGEgcmVzb3VyY2UgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgd2hlcmUgdG8gZmluZCB0aGUKKyAgICAgIHN0eWxlc2hlZXQuPGJyLz48ZW0+PHU+RGVwcmVjYXRlZDwvdT4gdmFyaWF0aW9uPC9lbT46PGJyLz4gSWYgdGhlIHN0eWxlc2hlZXQgY2Fubm90IGJlIGZvdW5kLAorICAgICAgYW5kIGlmIHlvdSBoYXZlIHNwZWNpZmllZCB0aGUgYXR0cmlidXRlIDx2YXI+YmFzZWRpcjwvdmFyPiBmb3IgdGhlIHRhc2ssIEFudCB3aWxsIGFzc3VtZSB0aGF0CisgICAgICB0aGUgPHZhcj5zdHlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgcmVsYXRpdmUgdG8gdGhlIDx2YXI+YmFzZWRpcjwvdmFyPiBvZiB0aGUgdGFzay48L3RkPgorICAgIDx0ZD5ObywgaWYgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZXNoZWV0IGlzIHNwZWNpZmllZCB1c2luZyBhIG5lc3RlZCA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPgorICAgICAgZWxlbWVudDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIHRoZSBYU0xUIHByb2Nlc3Nvci48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGgKKyAgICAgIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mb3JjZTwvdGQ+CisgICAgPHRkPlJlY3JlYXRlIHRhcmdldCBmaWxlcywgZXZlbiBpZiB0aGV5IGFyZSBuZXdlciB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIG9yIHRoZQorICAgICAgc3R5bGVzaGVldC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnByb2Nlc3NvcjwvdGQ+CisgICAgPHRkPm5hbWUgb2YgdGhlIFhTTFQgcHJvY2Vzc29yIHRvIHVzZS4gIFBlcm1pc3NpYmxlIHZhbHVlIGlzOgorICAgICAgPHVsPgorICAgICAgICA8bGk+PHE+dHJheDwvcT4gZm9yIGEgVHJhWCBjb21wbGlhbnQgcHJvY2Vzc29yIChpZSBKQVhQIGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzCisgICAgICAgICAgWGFsYW4gMiBvciBTYXhvbik8L2xpPgorICAgICAgPC91bD4KKyAgICAgIFN1cHBvcnQgZm9yIFhhbGFuIDEgaGFzIGJlZW4gcmVtb3ZlZCA8ZW0+c2luY2UgQW50IDEuNzwvZW0+LgogICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgaWYgdGhlIGxvY2F0aW9uIG9mCi0gICAgICAgIHRoZSBzdHlsZXNoZWV0IGlzIHNwZWNpZmllZCB1c2luZyBhIG5lc3RlZCAmbHQ7c3R5bGUmZ3Q7IGVsZW1lbnQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJheDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIHRoZSBYU0xUCi0gICAgICBwcm9jZXNzb3IuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhCi0gICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9yY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+UmVjcmVhdGUgdGFyZ2V0IGZpbGVzLCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyCi0gICAgICB0aGFuIHRoZWlyIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzIG9yIHRoZSBzdHlsZXNoZWV0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBleGNsdWRlcyBvciBub25lIGlmIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb2Nlc3NvcjwvdGQ+Ci0KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgdGhlIFhTTFQgcHJvY2Vzc29yIHRvIHVzZS4KLSAgICAgIFBlcm1pc3NpYmxlIHZhbHVlIGlzIDo8dWw+Ci0gICAgICA8bGk+JnF1b3Q7dHJheCZxdW90OyBmb3IgYSBUcmFYIGNvbXBsaWFudCBwcm9jZXNzb3IgKGllIEpBWFAgaW50ZXJmYWNlCi0gICAgICBpbXBsZW1lbnRhdGlvbiBzdWNoIGFzIFhhbGFuIDIgb3IgU2F4b24pPC9saT48L3VsPgotICAgICAgRGVmYXVsdHMgdG8gdHJheC4KLSAgICAgIDxici8+Ci0gICAgICBTdXBwb3J0IGZvciB4YWxhbjEgaGFzIGJlZW4gcmVtb3ZlZCBpbiBhbnQgMS43LgotICAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLgotICAgICAgQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZQotICAgICAgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW48L3RkPgorICAgIDx0ZD5zcGVjaWZpZXMgYSBzaW5nbGUgWE1MIGRvY3VtZW50IHRvIGJlIHN0eWxlZC4gU2hvdWxkIGJlIHVzZWQKKyAgICAgIHdpdGggdGhlIDx2YXI+b3V0PC92YXI+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgZXhjbHVkZWQuCi0gICAgICBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+b3V0PC90ZD4KKyAgICA8dGQ+c3BlY2lmaWVzIHRoZSBvdXRwdXQgbmFtZSBmb3IgdGhlIHN0eWxlZCByZXN1bHQgZnJvbSB0aGUgPHZhcj5pbjwvdmFyPiBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlCi0gICAgICBhbiBleGNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zY2FuaW5jbHVkZWRkaXJlY3RvcmllczwvdGQ+CisgICAgPHRkPklmIGFueSBkaXJlY3RvcmllcyBhcmUgbWF0Y2hlZCBieSB0aGUgPHZhcj5pbmNsdWRlczwvdmFyPi88dmFyPmV4Y2x1ZGVzPC92YXI+IHBhdHRlcm5zLCB0cnkKKyAgICAgIHRvIHRyYW5zZm9ybSBhbGwgZmlsZXMgaW4gdGhlc2UgZGlyZWN0b3JpZXMuCisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVsb2Fkc3R5bGVzaGVldDwvdGQ+CisgICAgPHRkPkNvbnRyb2wgd2hldGhlciB0aGUgc3R5bGVzaGVldCB0cmFuc2Zvcm1lciBpcyBjcmVhdGVkIGFuZXcgZm9yIGV2ZXJ5IHRyYW5zZm9ybSBvcGVyYXRpb24uIElmCisgICAgICB5b3Ugc2V0IHRoaXMgdG8gPHE+dHJ1ZTwvcT4sIHBlcmZvcm1hbmNlIG1heSBzdWZmZXIsIGJ1dCB5b3UgbWF5IHdvcmsgYXJvdW5kIGEgYnVnIGluIGNlcnRhaW4KKyAgICAgIFhhbGFuIHZlcnNpb25zLiAgPGVtPlNpbmNlIEFudCAxLjUuMjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNwZWNpZmllcyBhIHNpbmdsZSBYTUwgZG9jdW1lbnQgdG8gYmUgc3R5bGVkLiBTaG91bGQgYmUgdXNlZAotICAgICAgd2l0aCB0aGUgb3V0IGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD51c2VJbXBsaWNpdEZpbGVzZXQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoZSBpbXBsaWNpdCBmaWxlc2V0IGZvcm1lZCBieSB0aGlzIHRhc2sgc2hhbGwgYmUgdXNlZC4gIElmIHlvdSBzZXQgdGhpcworICAgICAgdG8gPHE+ZmFsc2U8L3E+IHlvdSBtdXN0IHVzZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMmbWRhc2g7b3IgdGhlIDx2YXI+aW48L3Zhcj4gYXR0cmlidXRlLAorICAgICAgaW4gd2hpY2ggY2FzZSB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8gaW1wYWN0IGFueXdheS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm91dDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZQotICAgICAgaW4gYXR0cmlidXRlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZpbGVuYW1lcGFyYW1ldGVyPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIGFuIFhTTCBwYXJhbWV0ZXIgZm9yIGFjY2Vzc2luZyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZS4gSWYgbm90IHNldCwKKyAgICAgIHRoZSBmaWxlIG5hbWUgaXMgbm90IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtYXRpb24uICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2NhbmluY2x1ZGVkZGlyZWN0b3JpZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgYW55IGRpcmVjdG9yaWVzIGFyZSBtYXRjaGVkIGJ5IHRoZQotICAgICAgaW5jbHVkZXMvZXhjbHVkZXMgcGF0dGVybnMsIHRyeSB0byB0cmFuc2Zvcm0gYWxsIGZpbGVzIGluIHRoZXNlCi0gICAgICBkaXJlY3Rvcmllcy4gIERlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWxlZGlycGFyYW1ldGVyPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIGEgWFNMIHBhcmFtZXRlciBmb3IgYWNjZXNzaW5nIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGN1cnJlbnQgcHJvY2Vzc2VkIGZpbGUuIEZvcgorICAgICAgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhIHZhbHVlIG9mIDxxPi48L3E+IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4gIElmCisgICAgICBub3Qgc2V0LCB0aGUgZGlyZWN0b3J5IGlzIG5vdCBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLiAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbG9hZHN0eWxlc2hlZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Q29udHJvbCB3aGV0aGVyIHRoZSBzdHlsZXNoZWV0IHRyYW5zZm9ybWVyIGlzIGNyZWF0ZWQKLSAgICBhbmV3IGZvciBldmVyeSB0cmFuc2Zvcm0gb3BlcmF0aW9uLiBJZiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSwgcGVyZm9ybWFuY2UgbWF5Ci0gICAgc3VmZmVyLCBidXQgeW91IG1heSB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBjZXJ0YWluIFhhbGFuLUogdmVyc2lvbnMuCi0gICAgRGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4uICA8ZW0+U2luY2UgQW50IDEuNS4yPC9lbT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3VwcHJlc3NXYXJuaW5nczwvdGQ+CisgICAgPHRkPldoZXRoZXIgcHJvY2Vzc29yIHdhcm5pbmdzIHNoYWxsIGJlIHN1cHByZXNzZWQuICBUaGlzIG9wdGlvbiByZXF1aXJlcyBzdXBwb3J0IGJ5IHRoZQorICAgICAgcHJvY2Vzc29yLCBpdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIFRyQVggcHJvY2Vzc29yIGJ1bmRsZWQgd2l0aCBBbnQuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMDwvZW0+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZUltcGxpY2l0RmlsZXNldDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBpbXBsaWNpdCBmaWxlc2V0IGZvcm1lZCBieSB0aGlzIHRhc2sKLSAgICBzaGFsbCBiZSB1c2VkLiAgSWYgeW91IHNldCB0aGlzIHRvIGZhbHNlIHlvdSBtdXN0IHVzZSBuZXN0ZWQKLSAgICByZXNvdXJjZSBjb2xsZWN0aW9ucyAtIG9yIHRoZSBpbiBhdHRyaWJ1dGUsIGluIHdoaWNoIGNhc2UgdGhpcwotICAgIGF0dHJpYnV0ZSBoYXMgbm8gaW1wYWN0IGFueXdheS4gIERlZmF1bHQgaXMgPGNvZGU+dHJ1ZTwvY29kZT4uCi0gICAgPGVtPlNpbmNlIEFudCAxLjc8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mYWlsT25FcnJvcjwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGJ1aWxkIHNob3VsZCBmYWlsIGlmIGFueSBlcnJvciBvY2N1cnMuICBOb3RlIHRoYXQgdHJhbnNmb3JtYXRpb24gZXJyb3JzIGNhbgorICAgICAgc3RpbGwgYmUgc3VwcHJlc3NlZCBieSBzZXR0aW5nIDx2YXI+ZmFpbE9uVHJhbnNmb3JtYXRpb25FcnJvcjwvdmFyPiB0byA8cT5mYWxzZTwvcT4gZXZlbiBpZgorICAgICAgdGhpcyBhdHRyaWJ1dGUgaXMgPHE+dHJ1ZTwvcT4uICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZXBhcmFtZXRlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgYSB4c2wgcGFyYW1ldGVyIGZvciBhY2Nlc3NpbmcgdGhlIG5hbWUKLSAgICBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZS4gSWYgbm90IHNldCwgdGhlIGZpbGUgbmFtZSBpcyBub3QKLSAgICBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLgotICAgIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbE9uVHJhbnNmb3JtYXRpb25FcnJvcjwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGJ1aWxkIHNob3VsZCBmYWlsIGlmIGFuIGVycm9yIG9jY3VycyB3aGlsZSB0cmFuc2Zvcm1pbmcgdGhlIGRvY3VtZW50LiAgTm90ZSB0aGF0CisgICAgICB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8gZWZmZWN0IGlmIDx2YXI+ZmFpbE9uRXJyb3I8L3Zhcj4gaXMgPHE+ZmFsc2U8L3E+LiAgPGVtPlNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVkaXJwYXJhbWV0ZXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIGEgeHNsIHBhcmFtZXRlciBmb3IgYWNjZXNzaW5nIHRoZSBkaXJlY3RvcnkKLSAgICBvZiB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZS4gRm9yIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhCi0gICAgdmFsdWUgb2YgJy4nIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1hdGlvbi4KLSAgICBJZiBub3Qgc2V0LCB0aGUgZGlyZWN0b3J5IGlzIG5vdCBwYXNzZWQgdG8gdGhlIHRyYW5zZm9ybWF0aW9uLiAKLSAgICA8ZW0+U2luY2UgQW50IDEuNzwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzV2FybmluZ3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBwcm9jZXNzb3Igd2FybmluZ3Mgc2hhbGwgYmUgc3VwcHJlc3NlZC4KLSAgICBUaGlzIG9wdGlvbiByZXF1aXJlcyBzdXBwb3J0IGJ5IHRoZSBwcm9jZXNzb3IsIGl0IGlzIHN1cHBvcnRlZCBieQotICAgIHRoZSB0cmF4IHByb2Nlc3NvciBidW5kbGVkIHdpdGggQW50LiAKLSAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIGZhbHNlLjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxPbkVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGJ1aWxkIHNob3VsZCBmYWlsIGlmIGFueSBlcnJvcgotICAgIG9jY3Vycy4gIE5vdGUgdGhhdCB0cmFuc2Zvcm1hdGlvbiBlcnJvcnMgY2FuIHN0aWxsIGJlIHN1cHByZXNzZWQgYnkKLSAgICBzZXR0aW5nIGZhaWxPblRyYW5zZm9ybWF0aW9uRXJyb3IgdG8gZmFsc2UgZXZlbiBpZiB0aGlzIGF0dHJpYnV0ZQotICAgIGlzIHRydWUuCi0gICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyB0cnVlLjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxPblRyYW5zZm9ybWF0aW9uRXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0aGUgYnVpbGQgc2hvdWxkIGZhaWwgaWYgYW4gZXJyb3Igb2NjdXJzCi0gICAgd2hpbGUgdHJhbnNmb3JtaW5nIHRoZSBkb2N1bWVudC4gIE5vdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8KLSAgICBlZmZlY3Qgb2YgPGNvZGU+ZmFpbE9uRXJyb3I8L2NvZGU+IGlzIGZhbHNlLgotICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsT25Ob1Jlc291cmNlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBidWlsZCBzaG91bGQgZmFpbCBpZiB0aGUgbmVzdGVkCi0gICAgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBlbXB0eS4gIE5vdGUgdGhhdCB0aGlzIGF0dHJpYnV0ZSBoYXMgbm8KLSAgICBlZmZlY3Qgb2YgPGNvZGU+ZmFpbE9uRXJyb3I8L2NvZGU+IGlzIGZhbHNlLgotICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgdHJ1ZS48L3RkPgorICAgIDx0ZD5mYWlsT25Ob1Jlc291cmNlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGJ1aWxkIHNob3VsZCBmYWlsIGlmIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBlbXB0eS4gIE5vdGUgdGhhdCB0aGlzCisgICAgICBhdHRyaWJ1dGUgaGFzIG5vIGVmZmVjdCBvZiA8dmFyPmZhaWxPbkVycm9yPC92YXI+IGlzIDxxPmZhbHNlPC9xPi4gIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCi08aDQ+YW55IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlCi1jb2xsZWN0aW9uPC9hPjwvaDQ+Cis8aDQ+YW55IDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb248L2E+PC9oND4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CiAKLTxwPlVzZSByZXNvdXJjZSBjb2xsZWN0aW9ucyB0byBzcGVjaWZ5IHJlc291cmNlcyB0aGF0IHRoZSBzdHlsZXNoZWV0Ci1zaG91bGQgYmUgYXBwbGllZCB0by4gIFVzZSBhIG5lc3RlZCBtYXBwZXIgYW5kIHRoZSB0YXNrJ3MgZGVzdGRpcgotYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlcy48L3A+Cis8cD5Vc2UgcmVzb3VyY2UgY29sbGVjdGlvbnMgdG8gc3BlY2lmeSByZXNvdXJjZXMgdGhhdCB0aGUgc3R5bGVzaGVldCBzaG91bGQgYmUgYXBwbGllZCB0by4gIFVzZSBhCituZXN0ZWQgbWFwcGVyIGFuZCB0aGUgdGFzaydzIDxxPmRlc3RkaXI8L3E+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IHRoZSBvdXRwdXQgZmlsZXMuPC9wPgogCi08aDQ+PGEgbmFtZT0iY2xhc3NwYXRoIj5jbGFzc3BhdGg8L2E+PC9oND4KKzxoNCBpZD0iY2xhc3NwYXRoIj5jbGFzc3BhdGg8L2g0PgogPHA+VGhlIGNsYXNzcGF0aCB0byBsb2FkIHRoZSBwcm9jZXNzb3IgZnJvbSBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhCi1uZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LCBhcyB3ZWxsIC0gdGhhdCBpcywgYQotPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlIHN0cnVjdHVyZS48L3A+CituZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+LCBhcyB3ZWxsJm1kYXNoO3RoYXQgaXMsCithIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4uPC9wPgogCiA8aDQ+eG1sY2F0YWxvZzwvaDQ+Ci08cD5UaGUgPGEgaHJlZj0iLi4vVHlwZXMveG1sY2F0YWxvZy5odG1sIj54bWxjYXRhbG9nPC9hPgotZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gRW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+Cis8cD5UaGUgPGEgaHJlZj0iLi4vVHlwZXMveG1sY2F0YWxvZy5odG1sIj54bWxjYXRhbG9nPC9hPiBlbGVtZW50IGlzIHVzZWQgdG8gcGVyZm9ybSBFbnRpdHkgYW5kIFVSSQorcmVzb2x1dGlvbi48L3A+CiAKIDxoND5wYXJhbTwvaDQ+Ci08cD5QYXJhbSBpcyB1c2VkIHRvIHBhc3MgYSBwYXJhbWV0ZXIgdG8gdGhlIFhTTCBzdHlsZXNoZWV0LjwvcD4KLTxibG9ja3F1b3RlPgotPGg0PlBhcmFtZXRlcnM8L2g0PgotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBYU0wgcGFyYW1ldGVyPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cHJlc3Npb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFyYW0gb3IgYW4gWFBhdGggZXhwcmVzc2lvbgotICAgICAgICAoZGVwZW5kaW5nIG9uIDxjb2RlPnR5cGU8L2NvZGU+KS4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgRGF0YSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICAgIDxsaT48Y29kZT5TVFJJTkc8L2NvZGU+PC9saT4KLSAgICAgICAgICAgIDxsaT48Y29kZT5CT09MRUFOPC9jb2RlPjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGNvZGU+SU5UPC9jb2RlPjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGNvZGU+TE9ORzwvY29kZT48L2xpPgotICAgICAgICAgICAgPGxpPjxjb2RlPkRPVUJMRTwvY29kZT48L2xpPgotICAgICAgICAgICAgPGxpPjxjb2RlPlhQQVRIX1NUUklORzwvY29kZT48L2xpPgotICAgICAgICAgICAgPGxpPjxjb2RlPlhQQVRIX0JPT0xFQU48L2NvZGU+PC9saT4KLSAgICAgICAgICAgIDxsaT48Y29kZT5YUEFUSF9OVU1CRVI8L2NvZGU+PC9saT4KLSAgICAgICAgICAgIDxsaT48Y29kZT5YUEFUSF9OT0RFPC9jb2RlPjwvbGk+Ci0gICAgICAgICAgICA8bGk+PGNvZGU+WFBBVEhfTk9ERVNFVDwvY29kZT48L2xpPgotICAgICAgICA8L3VsPgotICAgICAgICA8ZW0+c2luY2UgQW50IDEuOS4zPC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87IGRlZmF1bHQgaXMgPGNvZGU+U1RSSU5HPC9jb2RlPjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwYXJhbSB3aWxsIG9ubHkgYmUgcGFzc2VkIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoaXMgcHJvcGVydHkgaXMgc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHBhcmFtIHdpbGwgbm90IGJlIHBhc3NlZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGlzIHByb3BlcnR5IGlzIHNldDwvYT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4KKzxwPjxjb2RlPlBhcmFtPC9jb2RlPiBpcyB1c2VkIHRvIHBhc3MgYSBwYXJhbWV0ZXIgdG8gdGhlIFhTTCBzdHlsZXNoZWV0LjwvcD4KIAorPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgWFNMIHBhcmFtZXRlcjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZXhwcmVzc2lvbjwvdGQ+CisgICAgPHRkPlRoZSB2YWx1ZSB0byBiZSBwbGFjZWQgaW50byB0aGUgcGFyYW0gb3IgYW4gWFBhdGggZXhwcmVzc2lvbiAoZGVwZW5kaW5nCisgICAgb24gPHZhcj50eXBlPC92YXI+KS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5EYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlci4gUG9zc2libGUgdmFsdWVzIGFyZToKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPlNUUklORzwvcT48L2xpPgorICAgICAgICA8bGk+PHE+Qk9PTEVBTjwvcT48L2xpPgorICAgICAgICA8bGk+PHE+SU5UPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5MT05HPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5ET1VCTEU8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPlhQQVRIX1NUUklORzwvcT48L2xpPgorICAgICAgICA8bGk+PHE+WFBBVEhfQk9PTEVBTjwvcT48L2xpPgorICAgICAgICA8bGk+PHE+WFBBVEhfTlVNQkVSPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5YUEFUSF9OT0RFPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5YUEFUSF9OT0RFU0VUPC9xPjwvbGk+CisgICAgICA8L3VsPjxlbT5zaW5jZSBBbnQgMS45LjM8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPlNUUklORzwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+VGhlIHBhcmFtIHdpbGwgb25seSBiZSBwYXNzZWQgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhpcyBwcm9wZXJ0eSBpcworICAgICAgc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dW5sZXNzPC90ZD4KKyAgICA8dGQ+VGhlIHBhcmFtIHdpbGwgbm90IGJlIHBhc3NlZCA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGlzIHByb3BlcnR5IGlzCisgICAgICBzZXQ8L2E+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KIDwvdGFibGU+Ci08L2Jsb2NrcXVvdGU+Cis8cD5UaGUgPHE+WFBBVEhfKjwvcT4gdHlwZXMgc2F5cyB0aGF0IHRoZSA8dmFyPmV4cHJlc3Npb248L3Zhcj4gaXMgbm90IGp1c3QgYSBwcmltaXRpdmUtdHlwZSB2YWx1ZQorYnV0IGFuIFhQYXRoIGV4cHJlc3Npb24uICBUaGlzIGV4cHJlc3Npb24gd2lsbCBiZSBldmFsdWF0ZWQgb24gYW4gZW1wdHkgWE1MIGRvY3VtZW50IGFuZCB0aGUgcmVzdWx0Cit3aWxsIGJlIHBhc3NlZCB0byB0aGUgWFNMVCB0cmFuc2Zvcm1lciBhcyBhIHBhcmFtZXRlciBvZiBnaXZlbiB0eXBlLiAgSW4gdGhlc2UgZXhwcmVzc2lvbnMgdGhlCitkZWNsYXJlZCBBbnQgcHJvcGVydGllcyBjYW4gYmUgdXNlZCBhcyBYUGF0aCB2YXJpYWJsZXMgZS5nLiA8Y29kZT4kc29tZVByb3BlcnR5PC9jb2RlPi4gIFNvIHlvdSBjYW4KK2NvbXB1dGUgc29tZXRoaW5nIHVzaW5nIHN0YW5kYXJkIFhQYXRoIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLjwvcD4KKzxwPklmIHlvdSB3cml0ZSA8Y29kZT4ke3NvbWVQcm9wZXJ0eX08L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+JHNvbWVQcm9wZXJ0eTwvY29kZT4sIHRoZSB2YWx1ZSB3aWxsCitiZSBzaW1wbHkgc3Vic3RpdHV0ZWQgYnkgQW50IGJlZm9yZSBldmFsdWF0aW5nIHRoZSBYUGF0aCBleHByZXNzaW9uICh0aGlzIHN1YnN0aXR1dGlvbiB3b3JrcyBhbHNvCitmb3IgcHJpbWl0aXZlIHR5cGVzKS48L3A+CiAKLSAgPHA+ICAgICAgCi0gICAgICBUaGUgPGNvZGU+WFBBVEhfKjwvY29kZT4gdHlwZXMgc2F5cyB0aGF0IHRoZSA8Y29kZT5leHByZXNzaW9uPC9jb2RlPiBpcyBub3QganVzdCBhIHByaW1pdGl2ZS10eXBlIHZhbHVlIGJ1dCBhbiBYUGF0aCBleHByZXNzaW9uLgotICAgICAgVGhpcyBleHByZXNzaW9uIHdpbGwgYmUgZXZhbHVhdGVkIG9uIGFuIGVtcHR5IFhNTCBkb2N1bWVudCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgWFNMVCB0cmFuc2Zvcm1lciBhcyBhIHBhcmFtZXRlciBvZiBnaXZlbiB0eXBlLgotICAgICAgSW4gdGhlc2UgZXhwcmVzc2lvbnMgdGhlIGRlY2xhcmVkIEFudCBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIGFzIFhQYXRoIHZhcmlhYmxlcyBlLmcuIDxjb2RlPiRzb21lUHJvcGVydHk8L2NvZGU+LgotICAgICAgU28geW91IGNhbiBjb21wdXRlIHNvbWV0aGluZyB1c2luZyBzdGFuZGFyZCBYUGF0aCBmdW5jdGlvbnMgYW5kIG9wZXJhdG9ycy4KLSAgPC9wPgotICA8cD4KLSAgICAgIElmIHlvdSB3cml0ZSA8Y29kZT4ke3NvbWVQcm9wZXJ0eX08L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+JHNvbWVQcm9wZXJ0eTwvY29kZT4sCi0gICAgICB0aGUgdmFsdWUgd2lsbCBiZSBzaW1wbHkgc3Vic3RpdHV0ZWQgYnkgQW50IGJlZm9yZSBldmFsdWF0aW5nIHRoZSBYUGF0aCBleHByZXNzaW9uCi0gICAgICAodGhpcyBzdWJzdGl0dXRpb24gd29ya3MgYWxzbyBmb3IgcHJpbWl0aXZlIHR5cGVzKS4KLSAgPC9wPgorPGg0Pm91dHB1dHByb3BlcnR5ICg8dmFyPnRyYXg8L3Zhcj4gcHJvY2Vzc29ycyBvbmx5KTwvaDQ+Cis8cD5Vc2VkIHRvIHNwZWNpZnkgaG93IHlvdSB3aXNoIHRoZSByZXN1bHQgdHJlZSB0byBiZSBvdXRwdXQgYXMgc3BlY2lmaWVkIGluCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cudzMub3JnL1RSL3hzbHQjb3V0cHV0IiB0YXJnZXQ9Il90b3AiPlhTTFQgc3BlY2lmaWNhdGlvbnM8L2E+LgogCi08aDQ+b3V0cHV0cHJvcGVydHkgKCd0cmF4JyBwcm9jZXNzb3JzIG9ubHkpPC9oND4KLTxwPlVzZWQgdG8gc3BlY2lmeSBob3cgeW91IHdpc2ggdGhlIHJlc3VsdCB0cmVlIHRvIGJlIG91dHB1dAotYXMgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94c2x0I291dHB1dCI+Ci1YU0xUIHNwZWNpZmljYXRpb25zPC9hPi4KKzxoNT5QYXJhbWV0ZXJzPC9oNT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPlZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorCis8aDQgaWQ9ImZhY3RvcnkiPmZhY3RvcnkgKDx2YXI+dHJheDwvdmFyPiBwcm9jZXNzb3JzIG9ubHkpPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS45Ljg8L2VtPjwvcD4KKzxwPlVzZWQgdG8gc3BlY2lmeSBmYWN0b3J5IHNldHRpbmdzLjwvcD4KKworPGg1PlBhcmFtZXRlcnM8L2g1PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+ZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUgdHJhbnNmb3JtZXIgZmFjdG9yeSB0byB1c2UuIEZvcgorICAgICAgIGV4YW1wbGUgPGNvZGU+b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvY29kZT4KKyAgICAgICBvciA8Y29kZT5vcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXguVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvY29kZT4KKyAgICAgICBvciA8Y29kZT5uZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvY29kZT4uLi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIEpBWFAgbG9va3VwIG1lY2hhbmlzbTwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+Cis8aDY+YXR0cmlidXRlPC9oNj4KKzxwPlVzZWQgdG8gc3BlY2lmeSBzZXR0aW5ncyBvZiB0aGUgcHJvY2Vzc29yIGZhY3RvcnkuICBUaGUgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVudGlyZWx5Citwcm9jZXNzb3Igc3BlY2lmaWMgc28geW91IG11c3QgYmUgYXdhcmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIGZpZ3VyZSB0aGVtIG91dC4gIFJlYWQgdGhlCitkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvY2Vzc29yLiAgRm9yIGV4YW1wbGUsIGluIFhhbGFuIDIueDo8L3A+Cis8dWw+CisgIDxsaT48dmFyPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZTwvdmFyPiAoYm9vbGVhbik8L2xpPgorICA8bGk+PHZhcj5odHRwOi8veG1sLmFwYWNoZS5vcmcveGFsYW4vZmVhdHVyZXMvaW5jcmVtZW50YWw8L3Zhcj4gKGJvb2xlYW4pPC9saT4KKyAgPGxpPi4uLjwvbGk+Cis8L3VsPgorPHA+QW5kIGluIFNheG9uIDcueDo8L3A+Cis8dWw+CisgIDxsaT48dmFyPmh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS9hbGxvdy1leHRlcm5hbC1mdW5jdGlvbnM8L3Zhcj4gKGJvb2xlYW4pPC9saT4KKyAgPGxpPjx2YXI+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RpbWluZzwvdmFyPiAoYm9vbGVhbik8L2xpPgorICA8bGk+PHZhcj5odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJhY2VMaXN0ZW5lcjwvdmFyPiAoc3RyaW5nKTwvbGk+CisgIDxsaT48dmFyPmh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmVlTW9kZWw8L3Zhcj4gKGludGVnZXIpPC9saT4KKyAgPGxpPjx2YXI+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL2xpbmVudW1iZXJpbmc8L3Zhcj4gKGludGVnZXIpPC9saT4KKyAgPGxpPi4uLjwvbGk+Cis8L3VsPgogPGJsb2NrcXVvdGU+Ci08aDQ+UGFyYW1ldGVyczwvaDQ+Ci08dGFibGUgd2lkdGg9IjYwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGg2PlBhcmFtZXRlcnM8L2g2PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgcHJvcGVydHk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGF0dHJpYnV0ZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlIG9mIHRoZSBwcm9wZXJ0eS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5WYWx1ZSBvZiB0aGUgYXR0cmlidXRlLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPkV4YWN0bHkgb25lIG9mIHRoZXNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52YWx1ZXJlZjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5WYWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcHJvamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4KKyAgICAgIGlkLiA8ZW0+c2luY2UgQW50IDEuOS44PC9lbT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzbG9hZGVyZm9ycGF0aDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5WYWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIGEgY2xhc3Nsb2FkZXIgdGhhdCB1c2VzIHRoZSBjbGFzc3BhdGggc3BlY2lmaWVkIGJ5IGEKKyAgICAgIHBhdGggdGhhdCBpcyB0aGUgcHJvamVjdCByZWZlcmVuY2Ugd2l0aCB0aGUgZ2l2ZW4gPHZhcj5pZDwvdmFyPi4gPGVtPnNpbmNlIEFudCAxLjkuODwvZW0+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8L2Jsb2NrcXVvdGU+CiAKLTxoND48YSBuYW1lPSJmYWN0b3J5Ij5mYWN0b3J5ICgndHJheCcgcHJvY2Vzc29ycyBvbmx5KTwvYT48L2g0PgotVXNlZCB0byBzcGVjaWZ5IGZhY3Rvcnkgc2V0dGluZ3MuCi08YmxvY2txdW90ZT4KLTxoND5QYXJhbWV0ZXJzPC9oND4KLTx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUKLSAgICB0cmFuc2Zvcm1lciBmYWN0b3J5IHRvIHVzZS4gRm9yIGV4YW1wbGUKLSAgICAgIDx0dD5vcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsPC90dD4KLSAgICAgICBvciA8dHQ+b3JnLmFwYWNoZS54YWxhbi54c2x0Yy50cmF4LlRyYW5zZm9ybWVyRmFjdG9yeUltcGw8L3R0PgotICAgICAgIG9yIDx0dD5uZXQuc2Yuc2F4b24uVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDwvdHQ+Li4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLiBEZWZhdWx0cyB0byB0aGUgSkFYUCBsb29rdXAgbWVjaGFuaXNtLjwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci08aDQ+YXR0cmlidXRlPC9oND4KLTxwPlVzZWQgdG8gc3BlY2lmeSBzZXR0aW5ncyBvZiB0aGUgcHJvY2Vzc29yIGZhY3RvcnkuCi1UaGUgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGVudGlyZWx5IHByb2Nlc3NvciBzcGVjaWZpYwotc28geW91IG11c3QgYmUgYXdhcmUgb2YgdGhlIGltcGxlbWVudGF0aW9uIHRvIGZpZ3VyZSB0aGVtIG91dC4KLVJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBwcm9jZXNzb3IuCi1Gb3IgZXhhbXBsZSwgaW4gWGFsYW4gMi54OgotPHVsPgotPGxpPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9vcHRpbWl6ZSAoYm9vbGVhbik8L2xpPgotPGxpPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94YWxhbi9mZWF0dXJlcy9pbmNyZW1lbnRhbCAoYm9vbGVhbik8L2xpPgotPGxpPi4uLjwvbGk+Ci08L3VsPgotQW5kIGluIFNheG9uIDcueDoKLTx1bD4KLTxsaT5odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvYWxsb3ctZXh0ZXJuYWwtZnVuY3Rpb25zIChib29sZWFuKTwvbGk+Ci08bGk+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL3RpbWluZyAoYm9vbGVhbik8L2xpPgotPGxpPmh0dHA6Ly9zYXhvbi5zZi5uZXQvZmVhdHVyZS90cmFjZUxpc3RlbmVyIChzdHJpbmcpPC9saT4KLTxsaT5odHRwOi8vc2F4b24uc2YubmV0L2ZlYXR1cmUvdHJlZU1vZGVsIChpbnRlZ2VyKTwvbGk+Ci08bGk+aHR0cDovL3NheG9uLnNmLm5ldC9mZWF0dXJlL2xpbmVudW1iZXJpbmcgKGludGVnZXIpPC9saT4KLTxsaT4uLi48L2xpPgotPC91bD4KLTxibG9ja3F1b3RlPgotPGg0PlBhcmFtZXRlcnM8L2g0PgotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBhdHRyaWJ1dGU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSIgcm93c3Bhbj0iMyI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZXJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIHRoZSB2YWx1ZSBvZiB0aGUKLSAgICAgIHByb2plY3QgcmVmZXJlbmNlIHdpdGggdGhlIGdpdmVuIGlkLiA8ZW0+c2luY2UgQW50IDEuOS44PC9lbT48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc2xvYWRlcmZvcnBhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBhIGNsYXNzbG9hZGVyIHRoYXQgdXNlcwotICAgICAgdGhlIGNsYXNzcGF0aCBzcGVjaWZpZWQgYnkgYSBwYXRoIHRoYXQgaXMgdGhlIHByb2plY3QgcmVmZXJlbmNlCi0gICAgICB3aXRoIHRoZSBnaXZlbiBpZC4gPGVtPnNpbmNlIEFudCAxLjkuODwvZW0+PC90ZD4KLSAgPC90cj4KLTwvdGFibGU+Ci0KLTxoND5FeGFtcGxlczwvaDQ+Cis8aDU+RXhhbXBsZXM8L2g1PgogCiA8cHJlPgotICAmbHQ7cGF0aCBpZD0iZXh0ZW5zaW9uLXBhdGgiJmd0OwotICAgIC4uLgotICAmbHQ7L3BhdGgmZ3Q7CismbHQ7cGF0aCBpZD0iZXh0ZW5zaW9uLXBhdGgiJmd0OworICAuLi4KKyZsdDsvcGF0aCZndDsKIAorJmx0O3hzbHQgLi4uJmd0OworICAmbHQ7ZmFjdG9yeSZndDsKKyAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Impkay54bWwudHJhbnNmb3JtLmV4dGVuc2lvbkNsYXNzTG9hZGVyIgorICAgICAgICAgICAgICAgY2xhc3Nsb2FkZXJmb3JwYXRoPSJleHRlbnNpb24tcGF0aCIvJmd0OworICAmbHQ7L2ZhY3RvcnkmZ3Q7CismbHQ7L3hzbHQgLi4uJmd0OzwvcHJlPgogCi0gICZsdDt4c2x0IC4uLiZndDsKLSAgICAmbHQ7ZmFjdG9yeSZndDsKLSAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iamRrLnhtbC50cmFuc2Zvcm0uZXh0ZW5zaW9uQ2xhc3NMb2FkZXIiCi0gICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyZm9ycGF0aD0iZXh0ZW5zaW9uLXBhdGgiLyZndDsKLSAgICAmbHQ7L2ZhY3RvcnkmZ3Q7Ci0gICZsdDsveHNsdCAuLi4mZ3Q7Ci08L3ByZT4KLTxwPlNldHMgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZSB3aGVuIGxvYWRpbmcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyB0byBhCi0gIGNsYXNzbG9hZGVyIHVzaW5nIHRoZSA8Y29kZT5wYXRoPC9jb2RlPiB3aXRoIHRoZQotICBpZCA8Y29kZT5leHRlbnNpb24tcGF0aDwvY29kZT4uCi08L2Jsb2NrcXVvdGU+Ci08aDQ+ZmVhdHVyZTwvaDQ+Ci08cD48ZW0+c2luY2UgQW50IDEuOS44PC9lbT48L3A+Ci08cD5Vc2VkIHRvIHNwZWNpZnkgc2V0dGluZ3Mgb2YgdGhlIHByb2Nlc3NvciBmYWN0b3J5LiAgVGhlIGZlYXR1cmUKLW5hbWVzIGFyZSBtb3N0bHkgcHJvY2Vzc29yIHNwZWNpZmljIHNvIHlvdSBtdXN0IGJlIGF3YXJlIG9mIHRoZQotaW1wbGVtZW50YXRpb24gdG8gZmlndXJlIHRoZW0gb3V0LiAgUmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyCi1wcm9jZXNzb3IuIFRoZSBvbmx5IGZlYXR1cmUgYWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVxdWlyZWQgdG8KLXN1cHBvcnQKLWlzIDxjb2RlPmh0dHA6Ly9qYXZheC54bWwuWE1MQ29uc3RhbnRzL2ZlYXR1cmUvc2VjdXJlLXByb2Nlc3Npbmc8L2NvZGU+LgorPHA+U2V0cyB0aGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHdoZW4gbG9hZGluZyBleHRlbnNpb24gZnVuY3Rpb25zIHRvIGEgY2xhc3Nsb2FkZXIgdXNpbmcKK3RoZSA8Y29kZT5wYXRoPC9jb2RlPiB3aXRoIHRoZSBpZCA8Y29kZT5leHRlbnNpb24tcGF0aDwvY29kZT4uPC9wPgorCis8aDY+ZmVhdHVyZTwvaDY+Cis8cD5Vc2VkIHRvIHNwZWNpZnkgc2V0dGluZ3Mgb2YgdGhlIHByb2Nlc3NvciBmYWN0b3J5LiAgVGhlIGZlYXR1cmUgbmFtZXMgYXJlIG1vc3RseSBwcm9jZXNzb3IKK3NwZWNpZmljIHNvIHlvdSBtdXN0IGJlIGF3YXJlIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBmaWd1cmUgdGhlbSBvdXQuICBSZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mCit5b3VyIHByb2Nlc3Nvci4gVGhlIG9ubHkgZmVhdHVyZSBhbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0CitpcyA8dmFyPmh0dHA6Ly9qYXZheC54bWwuWE1MQ29uc3RhbnRzL2ZlYXR1cmUvc2VjdXJlLXByb2Nlc3Npbmc8L3Zhcj4uCiA8YmxvY2txdW90ZT4KLTxoND5QYXJhbWV0ZXJzPC9oND4KLTx0YWJsZSB3aWR0aD0iNjAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDY+UGFyYW1ldGVyczwvaDY+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5OYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWUgb2YgdGhlIGZlYXR1cmUuIEEgYm9vbGVhbiB2YWx1ZQotICAgIChpLmUuIHBlcm1pdHRlZCB2YWx1ZXMgYXJlIHRydWUsZmFsc2UseWVzLG5vLG9uLG9mZikuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+VmFsdWUgb2YgdGhlIGZlYXR1cmUuIEEgYm9vbGVhbiB2YWx1ZSAoaS5lLiBwZXJtaXR0ZWQgdmFsdWVzCisgICAgICBhcmUgPHE+dHJ1ZTwvcT4sIDxxPmZhbHNlPC9xPiwgPHE+eWVzPC9xPiwgPHE+bm88L3E+LCA8cT5vbjwvcT4sIDxxPm9mZjwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDwvYmxvY2txdW90ZT4KLTwvYmxvY2txdW90ZT4KKwogPGg0Pm1hcHBlcjwvaDQ+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS42LjI8L2VtPjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPjwvcD4KIAotPHA+WW91IGNhbiBkZWZpbmUgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEgbmVzdGVkIDxhCi1ocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiBUaGUgZGVmYXVsdCBtYXBwZXIKLXVzZWQgYnkgPGNvZGU+Jmx0O3hzbHQmZ3Q7PC9jb2RlPiByZW1vdmVzIHRoZSBmaWxlIGV4dGVuc2lvbiBmcm9tIHRoZQotc291cmNlIGZpbGUgYW5kIGFkZHMgdGhlIGV4dGVuc2lvbiBzcGVjaWZpZWQgdmlhIHRoZSBleHRlbnNpb24KLWF0dHJpYnV0ZS48L3A+Cis8cD5Zb3UgY2FuIGRlZmluZSBmaWxlbmFtZSB0cmFuc2Zvcm1hdGlvbnMgYnkgdXNpbmcgYQorbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj5tYXBwZXI8L2E+IGVsZW1lbnQuIFRoZSBkZWZhdWx0IG1hcHBlciB1c2VkCitieSA8Y29kZT4mbHQ7eHNsdCZndDs8L2NvZGU+IHJlbW92ZXMgdGhlIGZpbGUgZXh0ZW5zaW9uIGZyb20gdGhlIHNvdXJjZSBmaWxlIGFuZCBhZGRzIHRoZSBleHRlbnNpb24KK3NwZWNpZmllZCB2aWEgdGhlIGV4dGVuc2lvbiBhdHRyaWJ1dGUuPC9wPgogCiA8aDQ+c3R5bGU8L2g0PgogCiA8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgogCi08cD5UaGUgbmVzdGVkIHN0eWxlIGVsZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB5b3VyIHN0eWxlc2hlZXQgaW4gdGVybXMKLW9mIEFudCdzIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gdHlwZXMuICBXaXRoCi10aGlzIGVsZW1lbnQsIHRoZSBzdHlsZXNoZWV0IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQgcmVzb3VyY2Ugb3IKLXNpbmdsZS1lbGVtZW50IGNvbGxlY3Rpb24uICBBbHRlcm5hdGl2ZWx5LCB1c2UgdGhlIDxjb2RlPnJlZmlkPC9jb2RlPiB0bwotc3BlY2lmeSB0aGUgcmVzb3VyY2Ugb3IgY29sbGVjdGlvbiBhcyBhIHJlZmVyZW5jZS48L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPnN0eWxlPC9jb2RlPiBlbGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgeW91ciBzdHlsZXNoZWV0IGluIHRlcm1zIG9mCitBbnQncyA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IHR5cGVzLiAgV2l0aCB0aGlzIGVsZW1lbnQsIHRoZSBzdHlsZXNoZWV0CitzaG91bGQgYmUgc3BlY2lmaWVkIGFzIGEgbmVzdGVkIHJlc291cmNlIG9yIHNpbmdsZS1lbGVtZW50IGNvbGxlY3Rpb24uICBBbHRlcm5hdGl2ZWx5LCB1c2UKK3RoZSA8dmFyPnJlZmlkPC92YXI+IHRvIHNwZWNpZnkgdGhlIHJlc291cmNlIG9yIGNvbGxlY3Rpb24gYXMgYSByZWZlcmVuY2UuPC9wPgogCiA8aDQ+c3lzcHJvcGVydHk8L2g0PgotPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5Ci1zeXN0ZW0gcHJvcGVydGllcyByZXF1aXJlZCBieSB0aGUgZmFjdG9yeSBvciB0cmFuc2Zvcm1hdGlvbi4gIFRoZXNlCi1wcm9wZXJ0aWVzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIFZNIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mCi10aGUgY2xhc3MuIFRoZSBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgYXJlIHRoZSBzYW1lIGFzCi1mb3IgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPi48L3A+CiAKLTxwPjxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC9wPgorPHA+VXNlIG5lc3RlZCA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyB0byBzcGVjaWZ5IHN5c3RlbSBwcm9wZXJ0aWVzIHJlcXVpcmVkIGJ5IHRoZQorZmFjdG9yeSBvciB0cmFuc2Zvcm1hdGlvbi4gIFRoZXNlIHByb3BlcnRpZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSB0byBKVk0gZHVyaW5nIHRoZSBleGVjdXRpb24gb2YKK3RoZSBjbGFzcy4gVGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgZWxlbWVudCBhcmUgdGhlIHNhbWUgYXMgZm9yIDxhIGhyZWY9ImV4ZWMuaHRtbCNlbnYiPmVudmlyb25tZW50Cit2YXJpYWJsZXM8L2E+LjwvcD4KIAogPGg0PnN5c3Byb3BlcnR5c2V0PC9oND4KIAorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LjwvcD4KKwogPHA+WW91IGNhbiBzcGVjaWZ5IGEgc2V0IG9mIHByb3BlcnRpZXMgdG8gYmUgdXNlZCBhcyBzeXN0ZW0gcHJvcGVydGllcwogd2l0aCA8YSBocmVmPSIuLi9UeXBlcy9wcm9wZXJ0eXNldC5odG1sIj5zeXNwcm9wZXJ0eXNldDwvYT5zLjwvcD4KIAotPHA+PGVtPnNpbmNlIEFudCAxLjguMDwvZW0+LjwvcD4KLQogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgotICA8cHJlPgorPHByZT4KICZsdDt4c2x0IGJhc2VkaXI9JnF1b3Q7ZG9jJnF1b3Q7IGRlc3RkaXI9JnF1b3Q7YnVpbGQvZG9jJnF1b3Q7CiAgICAgICAgZXh0ZW5zaW9uPSZxdW90Oy5odG1sJnF1b3Q7IHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsvJmd0OzwvcHJlPgotICA8aDQ+VXNpbmcgYW4geG1sY2F0YWxvZzwvaDQ+Ci0gIDxwcmU+Cis8aDQ+VXNpbmcgYW4geG1sY2F0YWxvZzwvaDQ+Cis8cHJlPgogJmx0O3hzbHQgYmFzZWRpcj0mcXVvdDtkb2MmcXVvdDsgZGVzdGRpcj0mcXVvdDtidWlsZC9kb2MmcXVvdDsKICAgICAgIGV4dGVuc2lvbj0mcXVvdDsuaHRtbCZxdW90OyBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OwogICAmbHQ7eG1sY2F0YWxvZyByZWZpZD0mcXVvdDtteWNhdGFsb2cmcXVvdDsvJmd0OwogJmx0Oy94c2x0Jmd0OwogCiAmbHQ7eHNsdCBiYXNlZGlyPSZxdW90O2RvYyZxdW90OyBkZXN0ZGlyPSZxdW90O2J1aWxkL2RvYyZxdW90OwotICAgZXh0ZW5zaW9uPSZxdW90Oy5odG1sJnF1b3Q7IHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsmZ3Q7CisgICAgICBleHRlbnNpb249JnF1b3Q7Lmh0bWwmcXVvdDsgc3R5bGU9JnF1b3Q7c3R5bGUvYXBhY2hlLnhzbCZxdW90OyZndDsKICAgICZsdDt4bWxjYXRhbG9nJmd0OwogICAgICAgICZsdDtkdGQKICAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL0FyaWVsUGFydG5lcnMvL0RURCBYTUwgQXJ0aWNsZSBWMS4wLy9FTiZxdW90OwogICAgICAgICAgbG9jYXRpb249JnF1b3Q7Y29tL2FyaWVscGFydG5lcnMva25vd2xlZGdlYmFzZS9kdGQvYXJ0aWNsZS5kdGQmcXVvdDsvJmd0OwogICAgJmx0Oy94bWxjYXRhbG9nJmd0OwotJmx0Oy94c2x0Jmd0OwotPC9wcmU+Ci0gIDxoND5Vc2luZyBYU0wgcGFyYW1ldGVyczwvaDQ+Ci0gIDxwPlNpbXBsZSBTdHJpbmcgcGFyYW1ldGVyOjwvcD4KKyZsdDsveHNsdCZndDs8L3ByZT4KKzxoND5Vc2luZyBYU0wgcGFyYW1ldGVyczwvaDQ+Cis8cD5TaW1wbGUgU3RyaW5nIHBhcmFtZXRlcjo8L3A+CiA8cHJlPgogJmx0O3hzbHQgYmFzZWRpcj0mcXVvdDtkb2MmcXVvdDsgZGVzdGRpcj0mcXVvdDtidWlsZC9kb2MmcXVvdDsKICAgICAgIGV4dGVuc2lvbj0mcXVvdDsuaHRtbCZxdW90OyBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OwogICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtkYXRlJnF1b3Q7IGV4cHJlc3Npb249JnF1b3Q7MDctMDEtMjAwMCZxdW90Oy8mZ3Q7CiAmbHQ7L3hzbHQmZ3Q7PC9wcmU+CiAKLSAgPHA+VGhlbiBpZiB5b3UgZGVjbGFyZSBhIGdsb2JhbCBwYXJhbWV0ZXIgJnF1b3Q7ZGF0ZSZxdW90OyB3aXRoIHRoZSB0b3AtbGV2ZWwKLSAgZWxlbWVudCAmbHQ7eHNsOnBhcmFtIG5hbWU9JnF1b3Q7ZGF0ZSZxdW90Oy8mZ3Q7LCB0aGUgdmFyaWFibGUKLSAgPGNvZGU+JGRhdGU8L2NvZGU+IHdpbGwgc3Vic2VxdWVudGx5IGhhdmUgdGhlIHZhbHVlIDA3LTAxLTIwMDAuCi0gIDwvcD4KLSAgCi0gIDxwPlZhcmlvdXMgZGF0YSB0eXBlcyBhbmQgWFBhdGggZXhwcmVzc2lvbnM6PC9wPgotICAKLSAgPHByZT4mbHQ7cHJvcGVydHkgbmFtZT0iYW50UHJvcGVydHkxIiB2YWx1ZT0iQU5UX1BST1BFUlRZXzEiLyZndDsKKzxwPlRoZW4gaWYgeW91IGRlY2xhcmUgYSBnbG9iYWwgcGFyYW1ldGVyIDxxPmRhdGU8L3E+IHdpdGggdGhlIHRvcC1sZXZlbCBlbGVtZW50IDxjb2RlPiZsdDt4c2w6cGFyYW0KK25hbWU9JnF1b3Q7ZGF0ZSZxdW90Oy8mZ3Q7PC9jb2RlPiwgdGhlIHZhcmlhYmxlIDxjb2RlPiRkYXRlPC9jb2RlPiB3aWxsIHN1YnNlcXVlbnRseSBoYXZlIHRoZSB2YWx1ZQorMDctMDEtMjAwMC48L3A+CisKKzxwPlZhcmlvdXMgZGF0YSB0eXBlcyBhbmQgWFBhdGggZXhwcmVzc2lvbnM6PC9wPgorCis8cHJlPgorJmx0O3Byb3BlcnR5IG5hbWU9ImFudFByb3BlcnR5MSIgdmFsdWU9IkFOVF9QUk9QRVJUWV8xIi8mZ3Q7CiAmbHQ7cHJvcGVydHkgbmFtZT0iYW50UHJvcGVydHkyIiB2YWx1ZT0iQU5UX1BST1BFUlRZXzIiLyZndDsKICZsdDtwcm9wZXJ0eSBuYW1lPSJhbnRQcm9wZXJ0eTMiIHZhbHVlPSIzIi8mZ3Q7CiAmbHQ7cHJvcGVydHkgbmFtZT0iYW50UHJvcGVydHk0IiB2YWx1ZT0ic3Vic3RyaW5nLWJlZm9yZSIvJmd0OwpAQCAtNTk0LDQzICs1MzIsNDMgQEAKIC0tJmd0OwogCiAmbHQ7eHNsdCBpbj0iaW4ueG1sIiBvdXQ9Im91dC54bWwiIHN0eWxlPSJ0ZW1wbGF0ZS54c2wiJmd0OwotICAKKwogICAmbHQ7IS0tIFNpbXBsZSBTdHJpbmcgcGFyYW1ldGVyOiAtLSZndDsKICAgJmx0O3BhcmFtIG5hbWU9InAwIiBleHByZXNzaW9uPSJzb21lIG5pY2Ugc3RyaW5nIiB0eXBlPSJTVFJJTkciLyZndDsKLSAgCisKICAgJmx0OyEtLSBBIHZhbHVlIHN1YnN0aXR1dGVkIGJ5IEFudCAtLSZndDsKICAgJmx0O3BhcmFtIG5hbWU9InAxIiBleHByZXNzaW9uPSJzb21lIHN0cmluZyB3aXRoICR7YW50UHJvcGVydHkxfSBjb25zdHJ1Y3RlZCBieSBBbnQiIHR5cGU9IlNUUklORyIvJmd0OwotICAKKwogICAmbHQ7IS0tIFhQYXRoIHJlc3VsdGluZyBpbjogYW5kIHRoaXMgaXMgZG9uZSBpbiBYUGF0aDogQU5UX1BST1BFUlRZXzIgLS0mZ3Q7CiAgICZsdDtwYXJhbSBuYW1lPSJwMiIgZXhwcmVzc2lvbj0iY29uY2F0KCdhbmQgdGhpcyBpcyBkb25lIGluIFhQYXRoOiAnLCAkYW50UHJvcGVydHkyKSIgdHlwZT0iWFBBVEhfU1RSSU5HIi8mZ3Q7Ci0gIAorCiAgICZsdDshLS0gU29tZSBYUGF0aCBtYXRoLCByZXN1bHQ6IDQyIC0tJmd0OwogICAmbHQ7cGFyYW0gbmFtZT0icDMiIGV4cHJlc3Npb249IjY0ICogNjQgZGl2IDEyOCArIDEwIiB0eXBlPSJYUEFUSF9OVU1CRVIiLyZndDsKLSAgCisKICAgJmx0OyEtLSBTb21lIG51bWVyaWMgcGFyYW1ldGVyOiAtLSZndDsKICAgJmx0O3BhcmFtIG5hbWU9InA0IiBleHByZXNzaW9uPSIxMjMuNDUiIHR5cGU9IkRPVUJMRSIvJmd0OwotICAKKwogICAmbHQ7IS0tIFhQYXRoIGV4cHJlc3Npb24sIHJlc3VsdDogdHJ1ZSBib29sZWFuIC0tJmd0OwogICAmbHQ7cGFyYW0gbmFtZT0icDUiIGV4cHJlc3Npb249IiRhbnRQcm9wZXJ0eTEgPSAnQU5UX1BST1BFUlRZXzEnIiB0eXBlPSJYUEFUSF9CT09MRUFOIi8mZ3Q7Ci0gIAorCiAgICZsdDshLS0gRmlyc3Qgb25lIGlzIGFuIFhQYXRoIHZhcmlhYmxlLCBzZWNvbmQgb25lIGlzIGEgdGV4dCBzdWJzdGl0dXRlZCBieSBBbnQsIHJlc3VsdDogdHJ1ZSBib29sZWFuIC0tJmd0OwogICAmbHQ7cGFyYW0gbmFtZT0icDYiIGV4cHJlc3Npb249IiRhbnRQcm9wZXJ0eTIgPSAnJHthbnRQcm9wZXJ0eTJ9JyIgdHlwZT0iWFBBVEhfQk9PTEVBTiIvJmd0OwotICAKKwogICAmbHQ7IS0tIFNvbWUgWFBhdGggbWF0aCB3aXRoIGEgdmFyaWFibGUsIHJlc3VsdDogNjQgLS0mZ3Q7CiAgICZsdDtwYXJhbSBuYW1lPSJwNyIgZXhwcmVzc2lvbj0iJGFudFByb3BlcnR5MyAqIDQgKiA1ICsgNCIgdHlwZT0iWFBBVEhfTlVNQkVSIi8mZ3Q7Ci0gIAotICAmbHQ7IS0tIAorCisgICZsdDshLS0KICAgICBYUGF0aCBleHByZXNzaW9uIHdpdGggc3Vic3RpdHV0ZWQgZnVuY3Rpb24gbmFtZSBhbmQgYSB2YXJpYWJsZToKICAgICBzdWJzdHJpbmctYmVmb3JlKCRhbnRQcm9wZXJ0eTIsICdfJykKICAgICByZXN1bHQ6IEFOVAogICAtLSZndDsKICAgJmx0O3BhcmFtIG5hbWU9InA4IiBleHByZXNzaW9uPSIke2FudFByb3BlcnR5NH0oJGFudFByb3BlcnR5MiwgJ18nKSIgdHlwZT0iWFBBVEhfU1RSSU5HIi8mZ3Q7Ci0gIAorCiAgICZsdDshLS0gV2l0aG91dCB0eXBlIGF0dHJpYnV0ZTogLS0mZ3Q7CiAgICZsdDtwYXJhbSBuYW1lPSJwOSIgZXhwcmVzc2lvbj0iZGVmYXVsdCB0eXBlIGlzIFN0cmluZyIvJmd0OwogJmx0Oy94c2x0Jmd0OzwvcHJlPgogCi0gIDxoND5Vc2luZyBvdXRwdXQgcHJvcGVydGllczwvaDQ+Cis8aDQ+VXNpbmcgb3V0cHV0IHByb3BlcnRpZXM8L2g0PgogPHByZT4KICZsdDt4c2x0IGluPSZxdW90O2RvYy54bWwmcXVvdDsgb3V0PSZxdW90O2J1aWxkL2RvYy9vdXRwdXQueG1sJnF1b3Q7CiAgICAgICBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OwpAQCAtNjM4LDEwICs1NzYsOSBAQAogICAmbHQ7b3V0cHV0cHJvcGVydHkgbmFtZT0mcXVvdDtzdGFuZGFsb25lJnF1b3Q7IHZhbHVlPSZxdW90O3llcyZxdW90Oy8mZ3Q7CiAgICZsdDtvdXRwdXRwcm9wZXJ0eSBuYW1lPSZxdW90O2VuY29kaW5nJnF1b3Q7IHZhbHVlPSZxdW90O2lzbzg4NTlfMSZxdW90Oy8mZ3Q7CiAgICZsdDtvdXRwdXRwcm9wZXJ0eSBuYW1lPSZxdW90O2luZGVudCZxdW90OyB2YWx1ZT0mcXVvdDt5ZXMmcXVvdDsvJmd0OwotJmx0Oy94c2x0Jmd0OwotPC9wcmU+CismbHQ7L3hzbHQmZ3Q7PC9wcmU+CiAKLSAgPGg0PlVzaW5nIGZhY3Rvcnkgc2V0dGluZ3M8L2g0PgorPGg0PlVzaW5nIGZhY3Rvcnkgc2V0dGluZ3M8L2g0PgogPHByZT4KICZsdDt4c2x0IGluPSZxdW90O2RvYy54bWwmcXVvdDsgb3V0PSZxdW90O2J1aWxkL2RvYy9vdXRwdXQueG1sJnF1b3Q7CiAgICAgICBzdHlsZT0mcXVvdDtzdHlsZS9hcGFjaGUueHNsJnF1b3Q7Jmd0OwpAQCAtNjUwLDE1ICs1ODcsMTUgQEAKICAgJmx0Oy9mYWN0b3J5Jmd0OwogJmx0Oy94c2x0Jmd0OzwvcHJlPgogCi0gIDxoND5Vc2luZyBhIG1hcHBlcjwvaDQ+Cis8aDQ+VXNpbmcgYSBtYXBwZXI8L2g0PgogPHByZT4KICZsdDt4c2x0IGJhc2VkaXI9JnF1b3Q7aW4mcXVvdDsgZGVzdGRpcj0mcXVvdDtvdXQmcXVvdDsKICAgICAgIHN0eWxlPSZxdW90O3N0eWxlL2FwYWNoZS54c2wmcXVvdDsmZ3Q7CiAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Ki54bWwuZW4mcXVvdDsgdG89JnF1b3Q7Ki5odG1sLmVuJnF1b3Q7LyZndDsKICZsdDsveHNsdCZndDs8L3ByZT4KIAotICA8aDQ+VXNpbmcgYSBuZXN0ZWQgcmVzb3VyY2UgdG8gZGVmaW5lIHRoZSBzdHlsZXNoZWV0PC9oND4KLSAgICA8cHJlPgorPGg0PlVzaW5nIGEgbmVzdGVkIHJlc291cmNlIHRvIGRlZmluZSB0aGUgc3R5bGVzaGVldDwvaDQ+Cis8cHJlPgogJmx0O3hzbHQgaW49ImRhdGEueG1sIiBvdXQ9IiR7b3V0LmRpcn0vb3V0LnhtbCImZ3Q7CiAgICAgJmx0O3N0eWxlJmd0OwogICAgICAgICAmbHQ7dXJsIHVybD0iJHtwcmludFBhcmFtcy54c2wudXJsfSIvJmd0OwpAQCAtNjY2LDI1ICs2MDMsMjQgQEAKICAgICAmbHQ7cGFyYW0gbmFtZT0ic2V0IiBleHByZXNzaW9uPSJ2YWx1ZSIvJmd0OwogJmx0Oy94c2x0Jmd0OzwvcHJlPgogCi0gIDxoND5QcmludCB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZSBuYW1lPC9oND4KKzxoND5QcmludCB0aGUgY3VycmVudCBwcm9jZXNzZWQgZmlsZSBuYW1lPC9oND4KIDxwcmU+CiAmbHQ7cHJvamVjdCZndDsKICAgJmx0O3hzbHQgc3R5bGU9JnF1b3Q7cHJpbnRGaWxlbmFtZS54c2wmcXVvdDsgZGVzdGRpcj0mcXVvdDtvdXQmcXVvdDsgYmFzZWRpcj0mcXVvdDtpbiZxdW90OyBleHRlbnNpb249JnF1b3Q7LnR4dCZxdW90OwogICAgICAgICBmaWxlbmFtZXBhcmFtZXRlcj0mcXVvdDtmaWxlbmFtZSZxdW90OwotICAgICAgICBmaWxlZGlycGFyYW1ldGVyPSZxdW90O2ZpbGVkaXImcXVvdDsKLSAgLyZndDsKKyAgICAgICAgZmlsZWRpcnBhcmFtZXRlcj0mcXVvdDtmaWxlZGlyJnF1b3Q7LyZndDsKICZsdDsvcHJvamVjdCZndDsKIAogJmx0O3hzbDpzdHlsZXNoZWV0Ci0gIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7Ci0gIHhtbG5zOnhzbD0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0mcXVvdDsmZ3Q7CisgICAgIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7CisgICAgIHhtbG5zOnhzbD0mcXVvdDtodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0mcXVvdDsmZ3Q7CiAKLSAgICAmbHQ7eHNsOnBhcmFtIG5hbWU9JnF1b3Q7ZmlsZW5hbWUmcXVvdDsmZ3Q7Jmx0Oy94c2w6cGFyYW0mZ3Q7Ci0gICAgJmx0O3hzbDpwYXJhbSBuYW1lPSZxdW90O2ZpbGVkaXImcXVvdDsmZ3Q7LiZsdDsveHNsOnBhcmFtJmd0OworICAmbHQ7eHNsOnBhcmFtIG5hbWU9JnF1b3Q7ZmlsZW5hbWUmcXVvdDsmZ3Q7Jmx0Oy94c2w6cGFyYW0mZ3Q7CisgICZsdDt4c2w6cGFyYW0gbmFtZT0mcXVvdDtmaWxlZGlyJnF1b3Q7Jmd0Oy4mbHQ7L3hzbDpwYXJhbSZndDsKIAotJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0mcXVvdDsvJnF1b3Q7Jmd0OwotICBDdXJyZW50IGZpbGUgaXMgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9JnF1b3Q7JGZpbGVuYW1lJnF1b3Q7LyZndDsgaW4gZGlyZWN0b3J5ICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSZxdW90OyRmaWxlZGlyJnF1b3Q7LyZndDsuCi0mbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKKyAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0mcXVvdDsvJnF1b3Q7Jmd0OworICAgIEN1cnJlbnQgZmlsZSBpcyAmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0mcXVvdDskZmlsZW5hbWUmcXVvdDsvJmd0OyBpbiBkaXJlY3RvcnkgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9JnF1b3Q7JGZpbGVkaXImcXVvdDsvJmd0Oy4KKyAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7CiAKICZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7CiA8L3ByZT4KQEAgLTY5NCwxMiArNjMwLDkgQEAKIDxwcmU+CiAmbHQ7eHNsdCAuLi4mZ3Q7CiAgICAgJmx0O3N5c3Byb3BlcnR5IGtleT0ib3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZXJDb25maWd1cmF0aW9uIgotICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5YSW5jbHVkZVBhcnNlckNvbmZpZ3VyYXRpb24iCi0gICAgIC8mZ3Q7CisgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlhJbmNsdWRlUGFyc2VyQ29uZmlndXJhdGlvbiIvJmd0OwogJmx0O3hzbHQmZ3Q7CiA8L3ByZT4KLTwvYmxvY2txdW90ZT4KLQogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc3ViYW50Lmh0bWwgYi9tYW51YWwvVGFza3Mvc3ViYW50Lmh0bWwKaW5kZXggNDI0YmI2Ny4uOTEyMmJkNyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3N1YmFudC5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zdWJhbnQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1LDU5NCArMTYsMjU4IEBACiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgIDx0aXRsZT5TdWJhbnQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKLTxib2R5IGJnY29sb3I9IiNmZmZmZmYiIHRleHQ9IiMwMDAwMDAiIGxpbms9IiM1MjVENzYiCi0gICAgICBhbGluaz0iIzUyNUQ3NiIgdmxpbms9IiM1MjVENzYiPgorPGJvZHk+Cis8aDI+U3ViYW50IFRhc2s8L2gyPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+Cis8aDMgaWQ9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvaDM+Cis8cD5DYWxscyBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIGRlZmluZWQgc3ViLWJ1aWxkcy4gIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIG9mIEFudCBmb3IgYnVsayBwcm9qZWN0CitleGVjdXRpb24uICA8c3Ryb25nPlRoaXMgdGFzayBtdXN0IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgYSA8Y29kZT50YXJnZXQ8L2NvZGU+IGlmIGl0IGludm9rZXMgdGhlCitzYW1lIGJ1aWxkIGZpbGUgaXQgaXMgcGFydCBvZi48L3N0cm9uZz48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iNCI+Cis8cD48Y29kZT5zdWJhbnQ8L2NvZGU+IHVzZXMgPGNvZGU+YW50PC9jb2RlPiBpbnRlcm5hbGx5IHNvIG1hbnkgdGhpbmdzIHNhaWQKK2luIDxhIGhyZWY9ImFudC5odG1sIj48Y29kZT5hbnQ8L2NvZGU+J3MgbWFudWFsIHBhZ2U8L2E+IGFwcGx5IGhlcmUgYXMgd2VsbC48L3A+CiAKLSAgPCEtLSBQQUdFIEhFQURFUiAtLT4KLSAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+U3ViYW50IFRhc2s8L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5DYWxscyBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIGRlZmluZWQgc3ViLWJ1aWxkcy48L2ZvbnQ+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICA8IS0tIFBST0pFQ1QgTE9HTyAtLT4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPgotICAgICAgICAgICAgICA8aW1nIHNyYz0iLi4vaW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZiIgYWxpZ249InJpZ2h0IiBhbHQ9IkFwYWNoZSBBbnQiIGJvcmRlcj0iMCI+Ci0gICAgICAgICAgICA8L2E+Ci0gICAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+PC90YWJsZT4KLSAgICA8L3RkPgotICA8L3RyPgotCi0gIDwhLS0gU1RBUlQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+Ci0gIDx0cj4KLSAgICA8dGQgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0KLSAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svZGVzY3JpcHRpb24gLS0+Ci0gICAgPCEtLSBTdGFydCBEZXNjcmlwdGlvbiAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkIGJnY29sb3I9IiM1MjVENzYiPgotICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KLSAgICAgICAgICA8YSBuYW1lPSJkZXNjcmlwdGlvbiI+Ci0gICAgICAgICAgPHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvYT48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci08cD4KLSAgICAgICAgICAgIENhbGxzIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgZGVmaW5lZCBzdWItYnVpbGRzLgotICAgICAgICAgICAgVGhpcyBpcyBhbiBleHRlbnNpb24KLSAgICAgICAgICAgIG9mIGFudCBmb3IgYnVsayBwcm9qZWN0IGV4ZWN1dGlvbi4KLQotICAgICAgICAgICAgPHN0cm9uZz5UaGlzIHRhc2sgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGEKLSAgICAgICAgICAgICAgICA8Y29kZT50YXJnZXQ8L2NvZGU+IGlmIGl0IGludm9rZXMgdGhlIHNhbWUgYnVpbGQgZmlsZSBpdCBpcwotICAgICAgICAgICAgICAgIHBhcnQgb2YuPC9zdHJvbmc+Ci0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+Ci0KLTxwPjxjb2RlPnN1YmFudDwvY29kZT4gdXNlcyA8Y29kZT5hbnQ8L2NvZGU+IGludGVybmFsbHkgc28gbWFueSB0aGluZ3MKLSAgc2FpZCBpbiA8YSBocmVmPSJhbnQuaHRtbCI+PGNvZGU+YW50PC9jb2RlPidzIG1hbnVhbCBwYWdlPC9hPiBhcHBseQotICBoZXJlIGFzIHdlbGwuPC9wPgotCi0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8IS0tIFN1YnNlY3Rpb24gaGVhZGluZyAtLT4KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBuYW1lPSJVc2Ugd2l0aCBkaXJlY3RvcmllcyI+Ci0gICAgICAgICAgPHN0cm9uZz5Vc2Ugd2l0aCBkaXJlY3Rvcmllczwvc3Ryb25nPjwvYT48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8IS0tIFN1YnNlY3Rpb24gYm9keSAtLT4KLSAgICAgIDx0cj48dGQ+Ci0gICAgICAgIDxwPgotICAgICAgICAgICAgICAgIHN1YmFudCBjYW4gYmUgdXNlZCB3aXRoIGRpcmVjdG9yeSBzZXRzIHRvIGV4ZWN1dGUgYSBidWlsZCBmcm9tIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4KLSAgICAgICAgICAgICAgICAyIGRpZmZlcmVudCBvcHRpb25zIGFyZSBvZmZlcmVkIDoKLSAgICAgICAgICAgIDwvcD4KKzxoMyBpZD0iVXNlLXdpdGgtZGlyZWN0b3JpZXMiPlVzZSB3aXRoIGRpcmVjdG9yaWVzPC9oMz4KKzxwPjxjb2RlPnN1YmFudDwvY29kZT4gY2FuIGJlIHVzZWQgd2l0aCBkaXJlY3Rvcnkgc2V0cyB0byBleGVjdXRlIGEgYnVpbGQgZnJvbSBkaWZmZXJlbnQKK2RpcmVjdG9yaWVzLiAgMiBkaWZmZXJlbnQgb3B0aW9ucyBhcmUgb2ZmZXJlZDo8L3A+CiA8dWw+Ci0gICAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgICAgICB0byBydW4gdGhlIHNhbWUgYnVpbGQgZmlsZSA8Y29kZT4vc29tZXBhdGgvb3RoZXJwYXRoL215YnVpbGQueG1sPC9jb2RlPgotICAgICAgICAgICAgICAgICAgICB3aXRoIGRpZmZlcmVudCBiYXNlIGRpcmVjdG9yaWVzLCB1c2UgdGhlIGdlbmVyaWNhbnRmaWxlIGF0dHJpYnV0ZQotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICAgICAgPGxpPmlmIHlvdSB3YW50IHRvIHJ1biA8Y29kZT5kaXJlY3RvcnkxL215YnVpbGQueG1sPC9jb2RlPiwgPGNvZGU+ZGlyZWN0b3J5Mi9teWJ1aWxkLnhtbDwvY29kZT4sIDxjb2RlPi4uLi48L2NvZGU+LAotICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIGFudGZpbGUgYXR0cmlidXRlLiBUaGUgc3ViYW50IHRhc2sgZG9lcyBub3Qgc2V0IHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgeW91IGluIHRoaXMgY2FzZSwgYmVjYXVzZSB5b3UgY2FuIHNwZWNpZnkgaXQgaW4gZWFjaCBidWlsZCBmaWxlLgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgorICA8bGk+dG8gcnVuIHRoZSBzYW1lIGJ1aWxkIGZpbGUgPHNhbXA+L3NvbWVwYXRoL290aGVycGF0aC9teWJ1aWxkLnhtbDwvc2FtcD4gd2l0aCBkaWZmZXJlbnQgYmFzZQorICAgIGRpcmVjdG9yaWVzLCB1c2UgdGhlIDx2YXI+Z2VuZXJpY2FudGZpbGU8L3Zhcj4gYXR0cmlidXRlPC9saT4KKyAgPGxpPmlmIHlvdSB3YW50IHRvCisgICAgcnVuIDxzYW1wPmRpcmVjdG9yeTEvbXlidWlsZC54bWw8L3NhbXA+LCA8c2FtcD5kaXJlY3RvcnkyL215YnVpbGQueG1sPC9zYW1wPiwgPHNhbXA+Li4uPC9zYW1wPiwKKyAgICB1c2UgdGhlIDx2YXI+YW50ZmlsZTwvdmFyPiBhdHRyaWJ1dGUuIFRoZSA8Y29kZT5zdWJhbnQ8L2NvZGU+IHRhc2sgZG9lcyBub3Qgc2V0IHRoZSBiYXNlCisgICAgZGlyZWN0b3J5IGZvciB5b3UgaW4gdGhpcyBjYXNlLCBiZWNhdXNlIHlvdSBjYW4gc3BlY2lmeSBpdCBpbiBlYWNoIGJ1aWxkIGZpbGUuPC9saT4KKzwvdWw+CiAKLSAgICAgIDwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBEZXNjcmlwdGlvbiAtLT4KLQotIDwhLS0gSWdub3JlIC0tPgotCi0KLQotICAgIDwhLS0gU3RhcnQgQXR0cmlidXRlcyAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5BdHRyaWJ1dGU8L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+VHlwZTwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5SZXF1aXJlbWVudDwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4KLQotICAgIDwhLS0gQXR0cmlidXRlIEdyb3VwIC0tPgotICAgICAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5hbnRmaWxlPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+QnVpbGQgZmlsZSBuYW1lLCB0byB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3Rvcmllcy48YnI+IERlZmF1bHRzIHRvICJidWlsZC54bWwiLjxicj4gSWYgPGNvZGU+Z2VuZXJpY2FudGZpbGU8L2NvZGU+IGlzIHNldCwgdGhpcyBhdHRyaWJ1dGUgaXMgaWdub3JlZC48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjEwIj4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+T3B0aW9uYWw8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5idWlsZHBhdGg8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXQgdGhlIGJ1aWxkcGF0aCB0byBiZSB1c2VkIHRvIGZpbmQgc3ViLXByb2plY3RzLjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlBhdGg8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5idWlsZHBhdGhyZWY8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5CdWlsZHBhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+UmVmZXJlbmNlPC9mb250PgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPCEtLSBBdHRyaWJ1dGUgLS0+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+ZmFpbG9uZXJyb3I8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TZXRzIHdoZXRoZXIgdG8gZmFpbCB3aXRoIGEgYnVpbGQgZXhjZXB0aW9uIG9uIGVycm9yLCBvciBnbyBvbi48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPCEtLSBBdHRyaWJ1dGUgLS0+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Z2VuZXJpY2FudGZpbGU8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5CdWlsZCBmaWxlIHBhdGgsIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGRpcmVjdG9yaWVzLjxicj4gVXNlIDxjb2RlPmdlbmVyaWNhbnRmaWxlPC9jb2RlPiwgaW4gb3JkZXIgdG8gcnVuIHRoZSBzYW1lIGJ1aWxkIGZpbGUgd2l0aCBkaWZmZXJlbnQgYmFzZWRpcnMuPGJyPiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIDxjb2RlPmFudGZpbGU8L2NvZGU+IGlzIGlnbm9yZWQuPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+RmlsZTwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmluaGVyaXRhbGw8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Q29ycmVzcG9uZHMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzCi0gICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5pbmhlcml0YWxsPC9jb2RlPiBhdHRyaWJ1dGUgYnV0IGRlZmF1bHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB0byBmYWxzZSBpbiB0aGlzIHRhc2suLjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5pbmhlcml0cmVmczwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkNvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzIDxjb2RlPmluaGVyaXRyZWZzPC9jb2RlPiBhdHRyaWJ1dGUuPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPm91dHB1dDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkNvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzIDxjb2RlPm91dHB1dDwvY29kZT4gYXR0cmlidXRlLjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnRhcmdldDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlN0cmluZzwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPCEtLSBBdHRyaWJ1dGUgLS0+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+dmVyYm9zZTwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotICAgICAgICAgICAgRW5hYmxlLyBkaXNhYmxlIGxvZyBtZXNzYWdlcyBzaG93aW5nIHdoZW4gZWFjaCBzdWItYnVpbGQgcGF0aCBpcyBlbnRlcmVkLyBleGl0ZWQuCi0gICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5ib29sZWFuPC9mb250PgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci0KLQotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgQXR0cmlidXRlcyAtLT4KLQotICAgIDwhLS0gU3RhcnQgRWxlbWVudHMgLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iZWxlbWVudHMiPgotICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L3N0cm9uZz48L2E+PC9mb250PgotICAgICAgPC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+YW55IGZpbGVzeXN0ZW0gYmFzZWQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbjwvYT48L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBUaGlzIGluY2x1ZGVzIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sCi0gICAgICAgIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4KLSAgICAgICAgd2hpY2ggYXJlIHRoZSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgc3VwcG9ydGVkIHByaW9yCi0gICAgICAgIHRvIEFudCAxLjcuCi0gPCEtLSBJZ25vcmUgLS0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+ZGlyc2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQpPC9mb250PgotICAgICAgPC90ZD48L3RyPgotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KLSAgICAgICAgQWRkcyBhIGRpcmVjdG9yeSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkIHVzZSBhIGZpbGUgbGlzdCBpbnN0ZWFkITwvZW0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+ZmlsZWxpc3Q8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVMaXN0KTwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIEFkZHMgYW4gb3JkZXJlZCBmaWxlIGxpc3QgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IGNvbnRyYXJ5IHRvIGZpbGUgYW5kIGRpcmVjdG9yeSBzZXRzLCBmaWxlIGxpc3RzIGNhbiByZWZlcmVuY2Ugbm9uLWV4aXN0ZW50IGZpbGVzIG9yIGRpcmVjdG9yaWVzITwvZW0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+ZmlsZXNldDwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldCk8L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBBZGRzIGEgZmlsZSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguIDxwPiA8ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyIGlzIHNpZ25pZmljYW50LCBvbmUgc2hvdWxkIHVzZSBhIGZpbGUgbGlzdCBpbnN0ZWFkITwvZW0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0gPCEtLSBJZ25vcmUgLS0+Ci0KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+cHJvcGVydHk8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5KTwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIENvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50LgotCi08cD5XaGVuIG1vcmUgdGhhbiBvbmUgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQKLSAgd291bGQgc2V0IGEgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZSwgdGhlIG9uZSBkZWNsYXJlZCBsYXN0IHdpbGwKLSAgd2luLiAgVGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucyBldmVuIHNvIGl0IGlzCi0gIGRpZmZlcmVudCBmcm9tIHRoZSB3YXkgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFza3MgaW4gYnVpbGQKLSAgZmlsZXMgYmVoYXZlLjwvcD4KLQotIDwhLS0gSWdub3JlIC0tPgotIDwhLS0gSWdub3JlIC0tPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KLSAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+Ci0gICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KLSAgICAgICAgICA8c3Ryb25nPnByb3BlcnR5c2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldCk8L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBDb3JyZXNwb25kcyB0byA8Y29kZT4mbHQ7YW50Jmd0OzwvY29kZT4ncyBuZXN0ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5c2V0Jmd0OzwvY29kZT4gZWxlbWVudC4KLSA8IS0tIElnbm9yZSAtLT4KLSA8IS0tIElnbm9yZSAtLT4KLQotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLSAgICA8L3RhYmxlPgotICAgIDwhLS0gRW5kIEVsZW1lbnQgLS0+Ci0gICAgPCEtLSBTdGFydCBFbGVtZW50IC0tPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkIGJnY29sb3I9IiM4MjhEQTYiPgotICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIiBzaXplPSItMSI+Ci0gICAgICAgICAgPHN0cm9uZz5idWlsZHBhdGg8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgpPC9mb250PgotICAgICAgPC90ZD48L3RyPgotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KLSAgICAgICAgQ3JlYXRlcyBhIG5lc3RlZCBidWlsZCBwYXRoLCBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgotIDwhLS0gSWdub3JlIC0tPgotIDwhLS0gSWdub3JlIC0tPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KLSAgICA8IS0tIFN0YXJ0IEVsZW1lbnQgLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzgyOERBNiI+Ci0gICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiIHNpemU9Ii0xIj4KLSAgICAgICAgICA8c3Ryb25nPmJ1aWxkcGF0aGVsZW1lbnQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGguUGF0aEVsZW1lbnQpPC9mb250PgotICAgICAgPC90ZD48L3RyPgotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KLSAgICAgICAgQ3JlYXRlcyBhIG5lc3RlZCA8Y29kZT4mbHQ7YnVpbGRwYXRoZWxlbWVudCZndDs8L2NvZGU+LCBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZCBwYXRoLgotIDwhLS0gSWdub3JlIC0tPgotIDwhLS0gSWdub3JlIC0tPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudCAtLT4KLQotCi0KLQotPCEtLSBtYW51YWxseSB3cml0dGVuIC0tPgotICAgIDwhLS0gU3RhcnQgRWxlbWVudCAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjODI4REE2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiIgc2l6ZT0iLTEiPgotICAgICAgICAgIDxzdHJvbmc+dGFyZ2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnQuVGFyZ2V0RWxlbWVudCk8L2ZvbnQ+Ci0gICAgICA8L3RkPjwvdHI+Ci0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotICAgICAgICBZb3UgY2FuIHNwZWNpZnkgbXVsdGlwbGUgdGFyZ2V0cyB1c2luZyBuZXN0ZWQgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+IGVsZW1lbnRzCi0gICAgICAgIGluc3RlYWQgb2YgdXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmCi0gICAgICAgIEFudCBoYWQgYmVlbiBpbnZva2VkIHdpdGggYSBzaW5nbGUgdGFyZ2V0IHdob3NlIGRlcGVuZGVuY2llcyBhcmUgdGhlCi0gICAgICAgIHRhcmdldHMgc28gc3BlY2lmaWVkLCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLgotIDwhLS0gSWdub3JlIC0tPgotIDwhLS0gSWdub3JlIC0tPgotICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8cD48ZW0+c2luY2UgQW50IDEuNzwvZW0+LjwvcD4KLSAgICAgIDwvYmxvY2txdW90ZT48L3RkPjwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50IC0tPgotPCEtLSBtYW51YWxseSB3cml0dGVuIGVuZCAtLT4KLQotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgRWxlbWVudHMgLS0+Ci0KLQotCi0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLnNhbnNlcmlmIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIG5hbWU9ImV4YW1wbGVzIj4KLSAgICAgICAgICA8c3Ryb25nPkV4YW1wbGVzPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZSBzdHlsZT0iIj4KLSAgICAgICAgPHByZT4KLSAgICAgICAgJmx0O3Byb2plY3QgbmFtZT0ic3ViYW50IiBkZWZhdWx0PSJzdWJhbnQxIiZndDsKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJzdWJhbnQuYnVpbGQiLyZndDsKLSAgICAgICAgICAgICZsdDt0YXJnZXQgbmFtZT0ic3ViYW50MSImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3N1YmFudCB0YXJnZXQ9IiImZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiIHZhbHVlPSJzdWJhbnQxLmJ1aWxkIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJub3Qub3ZlcmxvYWRlZCIgdmFsdWU9Im5vdC5vdmVybG9hZGVkIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IiovYnVpbGQueG1sIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3RhcmdldCZndDsKLSAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OwotICAgICAgICA8L3ByZT4KLTxwPgotICAgICAgICAgICAgdGhpcyBzbmlwcGV0IGJ1aWxkIGZpbGUgd2lsbCBydW4gYW50IGluIGVhY2ggc3ViZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSwKLSAgICAgICAgICAgIHdoZXJlIGEgZmlsZSBjYWxsZWQgYnVpbGQueG1sIGNhbiBiZSBmb3VuZC4KLSAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBidWlsZC5kaXIgd2lsbCBoYXZlIHRoZSB2YWx1ZSBzdWJhbnQxLmJ1aWxkIGluIHRoZSBhbnQgcHJvamVjdHMgY2FsbGVkIGJ5IHN1YmFudC4KLSAgICAgICAgPC9wPgotPHByZT4KLSAgICAgICAgICAmbHQ7c3ViYW50IHRhcmdldD0iIiZndDsKLSAgICAgICAgICAgICAgJmx0O3Byb3BlcnR5c2V0Jmd0OwotICAgICAgICAgICAgICAgICAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0idG9wbGV2ZWwiLyZndDsKLSAgICAgICAgICAgICAgICAgICZsdDttYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iZm9vKiIgdG89ImJhcioiLyZndDsKLSAgICAgICAgICAgICAgJmx0Oy9wcm9wZXJ0eXNldCZndDsKLSAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKLSAgICAgICAgICAmbHQ7L3N1YmFudCZndDsKLSAgICAgICAgPC9wcmU+Ci08cD4KLSAgICAgICAgICAgIHRoaXMgc25pcHBldCBidWlsZCBmaWxlIHdpbGwgcnVuIGFudCBpbiBlYWNoIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBkaXJlY3RvcnksCi0gICAgICAgICAgICB3aGVyZSBhIGZpbGUgY2FsbGVkIGJ1aWxkLnhtbCBjYW4gYmUgZm91bmQuCi0gICAgICAgICAgICBBbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICJmb28iIGFyZSBwYXNzZWQsIHRoZWlyIG5hbWVzIGFyZSBjaGFuZ2VkIHRvIHN0YXJ0IHdpdGggImJhciIgaW5zdGVhZAotICAgICAgICA8L3A+Ci08cHJlPgotICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJjb21waWxlIiBnZW5lcmljYW50ZmlsZT0iL29wdC9wcm9qZWN0L2J1aWxkMS54bWwiJmd0OwotICAgICAgICAgICAgICAmbHQ7ZGlyc2V0IGRpcj0iLiIgaW5jbHVkZXM9InByb2plY3RzKiIvJmd0OwotICAgICAgICAgICZsdDsvc3ViYW50Jmd0OwotICAgICAgICA8L3ByZT4KLTxwPgotICAgICAgICAgICAgYXNzdW1pbmcgdGhlIHN1YmRpcnMgb2YgdGhlIHByb2plY3QgZGlyIGFyZSBjYWxsZWQgcHJvamVjdHMxLCBwcm9qZWN0czIsIHByb2plY3RzMwotICAgICAgICAgICAgdGhpcyBzbmlwcGV0IHdpbGwgZXhlY3V0ZSB0aGUgY29tcGlsZSB0YXJnZXQgb2YgL29wdC9wcm9qZWN0L2J1aWxkMS54bWwsCi0gICAgICAgICAgICBzZXR0aW5nIHRoZSBiYXNlZGlyIHRvIHByb2plY3RzMSwgcHJvamVjdHMyLCBwcm9qZWN0czMKLSAgICAgICAgPC9wPgotCi0gICAgICAgIDwhLS0gbWFudWFsbHkgd3JpdHRlbiAtLT4KLSAgICAgICAgPHA+Tm93IGEgbGl0dGxlIG1vcmUgY29tcGxleCAtIGJ1dCB1c2VmdWwgLSBzY2VuYXJpby4gQXNzdW1lIHRoYXQgd2UgaGF2ZQotICAgICAgICBhIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbGlrZSB0aGlzOjwvcD4KLSAgICAgICAgPHByZT4KLSAgICAgICAgcm9vdAotICAgICAgICAgIHwgIGNvbW1vbi54bWwKLSAgICAgICAgICB8ICBidWlsZC54bWwKLSAgICAgICAgICB8Ci0gICAgICAgICAgKy0tIG1vZHVsZXMKLSAgICAgICAgICAgICAgICArLS0gbW9kQQotICAgICAgICAgICAgICAgIHwgICAgICstLSBzcmMKLSAgICAgICAgICAgICAgICArLS0gbW9kQgotICAgICAgICAgICAgICAgICAgICAgICstLSBzcmMKLQotICAgICAgICA8dT48Yj5jb21tb24ueG1sOjwvYj48L3U+PGJyPgotICAgICAgICAmbHQ7cHJvamVjdCZndDsKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgIHZhbHVlPSJzcmMiLyZndDsKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiICAgIHZhbHVlPSJidWlsZCIvJmd0OwotICAgICAgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiAgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8mZ3Q7Ci0KLSAgICAgICAgICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O21rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIvJmd0OwotICAgICAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSAgICAgICAgICAgICZsdDshLS0gbW9yZSB0YXJnZXRzIC0tJmd0OwotICAgICAgICAmbHQ7L3Byb2plY3QmZ3Q7Ci0KLSAgICAgICAgPHU+PGI+YnVpbGQueG1sOjwvYj48L3U+PGJyPgotICAgICAgICAmbHQ7cHJvamVjdCZndDsKLQotICAgICAgICAgICAgJmx0O21hY3JvZGVmIG5hbWU9Iml0ZXJhdGUiJmd0OwotICAgICAgICAgICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idGFyZ2V0Ii8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJAe3RhcmdldH0iJmd0OwotICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJtb2R1bGVzIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKLSAgICAgICAgICAgICAgICAgICAgJmx0Oy9zdWJhbnQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotICAgICAgICAgICAgJmx0Oy9tYWNyb2RlZiZndDsKLQotCi0gICAgICAgICAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OwotICAgICAgICAgICAgICAgICZsdDtpdGVyYXRlIHRhcmdldD0iY29tcGlsZSIvJmd0OwotICAgICAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7Ci0KLSAgICAgICAgICAgICZsdDshLS0gbW9yZSB0YXJnZXRzIC0tJmd0OwotICAgICAgICAmbHQ7L3Byb2plY3QmZ3Q7Ci0KLSAgICAgICAgPHU+PGI+bW9kdWxlcy9tb2RBL2J1aWxkLnhtbDo8L2I+PC91Pjxicj4KLSAgICAgICAgJmx0O3Byb2plY3QgbmFtZT0ibW9kQSImZ3Q7Ci0gICAgICAgICAgICAmbHQ7aW1wb3J0IGZpbGU9Ii4uLy4uL2NvbW1vbi54bWwiLyZndDsKLSAgICAgICAgJmx0Oy9wcm9qZWN0Jmd0OwotICAgICAgICA8L3ByZT4KLQotICAgICAgICA8cD5UaGlzIHJlc3VsdHMgaW4gdmVyeSBzbWFsbCBidWlsZGZpbGVzIGluIHRoZSBtb2R1bGVzLCBtYWludGFpbmFibGUKLSAgICAgICAgYnVpbGRmaWxlIChjb21tb24ueG1sKSBhbmQgYSBjbGVhciBwcm9qZWN0IHN0cnVjdHVyZS4gQWRkaXRpb25hbGx5Ci0gICAgICAgIHRoZSByb290IGJ1aWxkZmlsZSBpcyBjYXBhYmxlIHRvIHJ1biB0aGUgd2hvbGUgYnVpbGQgb3ZlciBhbGwKLSAgICAgICAgbW9kdWxlcy4KLSAgICAgICAgPC9wPgotCi0gICAgICAgIDxwcmU+Ci0gICAgICAgICZsdDtzdWJhbnQgZmFpbG9uZXJyb3I9ImZhbHNlIiZndDsKLSAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IioqL2J1aWxkLnhtbCIgZXhjbHVkZXM9ImJ1aWxkLnhtbCIvJmd0OwotICAgICAgICAgICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiIvJmd0OwotICAgICAgICAgICAgJmx0O3RhcmdldCBuYW1lPSJidWlsZCIvJmd0OwotICAgICAgICAmbHQ7L3N1YmFudCZndDsKLSAgICAgICAgPC9wcmU+Ci0KLSAgICAgICAgPHA+RG9lcyBhICZxdW90O2NsZWFuIGJ1aWxkJnF1b3Q7IGZvciBlYWNoIHN1YnByb2plY3QuPC9wPgotICAgICAgICA8cD48Yj5IaW50OjwvYj4gYmVjYXVzZSBidWlsZGZpbGVzIGFyZSBwbGFpbiB4bWwsIHlvdSBjb3VsZCBnZW5lcmF0ZSB0aGUKLSAgICAgICAgbWFzdGVyYnVpbGRmaWxlIGZyb20gdGhlIGNvbW1vbiBidWlsZGZpbGUgYnkgdXNpbmcgYSBYU0xUIHRyYW5zZm9ybWF0aW9uOgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPHByZT4KLSAgICAgICAgJmx0O3hzbHQgaW49JnF1b3Q7Y29tbW9uLnhtbCZxdW90OwotICAgICAgICAgICAgICBvdXQ9JnF1b3Q7bWFzdGVyLnhtbCZxdW90OwotICAgICAgICAgICAgICBzdHlsZT0mcXVvdDske2FudC5ob21lfS9ldGMvY29tbW9uMm1hc3Rlci54c2wmcXVvdDsKLSAgICAgICAgLyZndDsKLSAgICAgICAgPC9wcmU+Ci0KLSAgICAgICAgPCEtLSBtYW51YWxseSB3cml0dGVuIC0tPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLQotICAgIDwvdGQ+Cis8aDMgaWQ9ImF0dHJpYnV0ZXMiPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlR5cGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+Ci0gIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgotCisgIDx0cj4KKyAgICA8dGQ+YW50ZmlsZTwvdGQ+CisgICAgPHRkPkJ1aWxkIGZpbGUgbmFtZSwgdG8gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggZGlyZWN0b3JpZXMuPC90ZD4KKyAgICA8dGQ+U3RyaW5nPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmJ1aWxkLnhtbDwvcT4sIGlnbm9yZWQgaWYgPHZhcj5nZW5lcmljYW50ZmlsZTwvdmFyPiBpcyBzZXQ8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmJ1aWxkcGF0aDwvdGQ+CisgICAgPHRkPlNldCB0aGUgYnVpbGRwYXRoIHRvIGJlIHVzZWQgdG8gZmluZCBzdWItcHJvamVjdHMuPC90ZD4KKyAgICA8dGQ+UGF0aDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjgiPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5idWlsZHBhdGhyZWY8L3RkPgorICAgIDx0ZD5CdWlsZHBhdGggdG8gdXNlLCBieSByZWZlcmVuY2UuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlJlZmVyZW5jZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TZXRzIHdoZXRoZXIgdG8gZmFpbCB3aXRoIGEgYnVpbGQgZXhjZXB0aW9uIG9uIGVycm9yLCBvciBnbyBvbi48L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+Ym9vbGVhbjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Z2VuZXJpY2FudGZpbGU8L3RkPgorICAgIDx0ZD5CdWlsZCBmaWxlIHBhdGgsIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIGRpcmVjdG9yaWVzLjxici8+ICBVc2UgPHZhcj5nZW5lcmljYW50ZmlsZTwvdmFyPiwKKyAgICAgIGluIG9yZGVyIHRvIHJ1biB0aGUgc2FtZSBidWlsZCBmaWxlIHdpdGggZGlmZmVyZW50IDx2YXI+YmFzZWRpcjwvdmFyPnMuPGJyLz4gIElmIHRoaXMgYXR0cmlidXRlCisgICAgICBpcyBzZXQsIDx2YXI+YW50ZmlsZTwvdmFyPiBpcyBpZ25vcmVkLjwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5GaWxlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5pbmhlcml0YWxsPC90ZD4KKyAgICA8dGQ+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgPHZhcj5pbmhlcml0YWxsPC92YXI+IGF0dHJpYnV0ZSBidXQgZGVmYXVsdHMKKyAgICAgIHRvIDxxPmZhbHNlPC9xPiBpbiB0aGlzIHRhc2suPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmJvb2xlYW48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmluaGVyaXRyZWZzPC90ZD4KKyAgICA8dGQ+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgPHZhcj5pbmhlcml0cmVmczwvdmFyPiBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmJvb2xlYW48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm91dHB1dDwvdGQ+CisgICAgPHRkPkNvcnJlc3BvbmRzIHRvIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPidzIDx2YXI+b3V0cHV0PC92YXI+IGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U3RyaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50YXJnZXQ8L3RkPgorICAgIDx0ZD4mbmJzcDs8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U3RyaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+RW5hYmxlL2Rpc2FibGUgbG9nIG1lc3NhZ2VzIHNob3dpbmcgd2hlbiBlYWNoIHN1Yi1idWlsZCBwYXRoIGlzIGVudGVyZWQvZXhpdGVkLjwvdGQ+CisgICAgPHRkPmJvb2xlYW48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoMyBpZD0iZWxlbWVudHMiPlBhcmFtZXRlcnMgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5hbnkgZmlsZXN5c3RlbSBiYXNlZCA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uPC9hPjwvaDQ+Cis8cD5UaGlzIGluY2x1ZGVzIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4sIDxjb2RlPiZsdDtkaXJzZXQmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtmaWxlbGlzdCZndDs8L2NvZGU+IHdoaWNoIGFyZSB0aGUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIHN1cHBvcnRlZCBwcmlvciB0byBBbnQKKzEuNy48L3A+Cis8aDQ+PHN0cm9uZz5kaXJzZXQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRpclNldCk8L2g0PgorQWRkcyBhIGRpcmVjdG9yeSBzZXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguCis8cD48ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyCitpcyBzaWduaWZpY2FudCwgb25lIHNob3VsZCB1c2UgYSBmaWxlIGxpc3QgaW5zdGVhZCE8L2VtPjwvcD4KKzxoND48c3Ryb25nPmZpbGVsaXN0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlTGlzdCk8L2g0PgorPHA+QWRkcyBhbiBvcmRlcmVkIGZpbGUgbGlzdCB0byB0aGUgaW1wbGljaXQgYnVpbGQgcGF0aC48L3A+Cis8cD48ZW0+Tm90ZSB0aGF0IGNvbnRyYXJ5IHRvIGZpbGUgYW5kIGRpcmVjdG9yeSBzZXRzLCBmaWxlIGxpc3RzIGNhbiByZWZlcmVuY2Ugbm9uLWV4aXN0ZW50IGZpbGVzIG9yCitkaXJlY3RvcmllcyE8L2VtPjwvcD4KKzxoND48c3Ryb25nPmZpbGVzZXQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQpPC9oND4KKzxwPkFkZHMgYSBmaWxlIHNldCB0byB0aGUgaW1wbGljaXQgYnVpbGQgcGF0aC48L3A+Cis8cD48ZW0+Tm90ZSB0aGF0IHRoZSBkaXJlY3RvcmllcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWlsZCBwYXRoIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIsIHNvIGlmIG9yZGVyCitpcyBzaWduaWZpY2FudCwgb25lIHNob3VsZCB1c2UgYSBmaWxlIGxpc3QgaW5zdGVhZCE8L2VtPjwvcD4KKzxoND48c3Ryb25nPnByb3BlcnR5PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Qcm9wZXJ0eSk8L2g0PgorPHA+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorPHA+V2hlbiBtb3JlIHRoYW4gb25lIG5lc3RlZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHdvdWxkIHNldCBhIHByb3BlcnR5IG9mIHRoZSBzYW1lCituYW1lLCB0aGUgb25lIGRlY2xhcmVkIGxhc3Qgd2lsbCB3aW4uICBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zIGV2ZW4gc28gaXQgaXMKK2RpZmZlcmVudCBmcm9tIHRoZSB3YXkgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFza3MgaW4gYnVpbGQgZmlsZXMgYmVoYXZlLjwvcD4KKzxoND48c3Ryb25nPnByb3BlcnR5c2V0PC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldCk8L2g0PgorPHA+Q29ycmVzcG9uZHMgdG8gPGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+J3MgbmVzdGVkIDxjb2RlPiZsdDtwcm9wZXJ0eXNldCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgorPGg0PjxzdHJvbmc+YnVpbGRwYXRoPC9zdHJvbmc+IChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoKTwvaDQ+Cis8cD5DcmVhdGVzIGEgbmVzdGVkIGJ1aWxkIHBhdGgsIGFuZCBhZGQgaXQgdG8gdGhlIGltcGxpY2l0IGJ1aWxkIHBhdGguPC9wPgorPGg0PjxzdHJvbmc+YnVpbGRwYXRoZWxlbWVudDwvc3Ryb25nPiAob3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aC5QYXRoRWxlbWVudCk8L2g0PgorPHA+Q3JlYXRlcyBhIG5lc3RlZCA8Y29kZT4mbHQ7YnVpbGRwYXRoZWxlbWVudCZndDs8L2NvZGU+LCBhbmQgYWRkIGl0IHRvIHRoZSBpbXBsaWNpdCBidWlsZAorcGF0aC48L3A+Cis8aDQ+PHN0cm9uZz50YXJnZXQ8L3N0cm9uZz4gKG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFudC5UYXJnZXRFbGVtZW50KTwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+LjwvcD4KKzxwPllvdSBjYW4gc3BlY2lmeSBtdWx0aXBsZSB0YXJnZXRzIHVzaW5nIG5lc3RlZCA8Y29kZT4mbHQ7dGFyZ2V0Jmd0OzwvY29kZT4gZWxlbWVudHMgaW5zdGVhZCBvZgordXNpbmcgdGhlIHRhcmdldCBhdHRyaWJ1dGUuICBUaGVzZSB3aWxsIGJlIGV4ZWN1dGVkIGFzIGlmIEFudCBoYWQgYmVlbiBpbnZva2VkIHdpdGggYSBzaW5nbGUgdGFyZ2V0Cit3aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHRoZSB0YXJnZXRzIHNvIHNwZWNpZmllZCwgaW4gdGhlIG9yZGVyIHNwZWNpZmllZC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgY2FsbGVkIHRhcmdldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgogPC90YWJsZT4KIAorPGgzIGlkPSJleGFtcGxlcyI+RXhhbXBsZXM8L2gzPgorCis8cD5UaGlzIHNuaXBwZXQgYnVpbGQgZmlsZSB3aWxsIHJ1biA8a2JkPmFudDwva2JkPiBpbiBlYWNoIHN1YmRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBkaXJlY3RvcnksCit3aGVyZSBhIGZpbGUgY2FsbGVkIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gY2FuIGJlIGZvdW5kLiBUaGUgcHJvcGVydHkgPGNvZGU+YnVpbGQuZGlyPC9jb2RlPiB3aWxsCitoYXZlIHRoZSB2YWx1ZSA8cT5zdWJhbnQxLmJ1aWxkPC9xPiBpbiB0aGUgQW50IHByb2plY3RzIGNhbGxlZCBieSA8Y29kZT5zdWJhbnQ8L2NvZGU+LjwvcD4KKworPHByZT4KKyZsdDtwcm9qZWN0IG5hbWU9InN1YmFudCIgZGVmYXVsdD0ic3ViYW50MSImZ3Q7CisgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9InN1YmFudC5idWlsZCIvJmd0OworICAgICZsdDt0YXJnZXQgbmFtZT0ic3ViYW50MSImZ3Q7CisgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSIiJmd0OworICAgICAgICAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9InN1YmFudDEuYnVpbGQiLyZndDsKKyAgICAgICAgICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJub3Qub3ZlcmxvYWRlZCIgdmFsdWU9Im5vdC5vdmVybG9hZGVkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSIqL2J1aWxkLnhtbCIvJmd0OworICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KKworPHA+VGhpcyBzbmlwcGV0IGJ1aWxkIGZpbGUgd2lsbCBydW4gPGtiZD5hbnQ8L2tiZD4gaW4gZWFjaCBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgZGlyZWN0b3J5LAord2hlcmUgYSBmaWxlIGNhbGxlZCA8c2FtcD5idWlsZC54bWw8L3NhbXA+IGNhbiBiZSBmb3VuZC4gQWxsIHByb3BlcnRpZXMgd2hvc2UgbmFtZSBzdGFydHMKK3dpdGggPHE+Zm9vPC9xPiBhcmUgcGFzc2VkLCB0aGVpciBuYW1lcyBhcmUgY2hhbmdlZCB0byBzdGFydCB3aXRoIDxxPmJhcjwvcT4gaW5zdGVhZDwvcD4KKworPHByZT4KKyZsdDtzdWJhbnQgdGFyZ2V0PSIiJmd0OworICAgICZsdDtwcm9wZXJ0eXNldCZndDsKKyAgICAgICAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0idG9wbGV2ZWwiLyZndDsKKyAgICAgICAgJmx0O21hcHBlciB0eXBlPSJnbG9iIiBmcm9tPSJmb28qIiB0bz0iYmFyKiIvJmd0OworICAgICZsdDsvcHJvcGVydHlzZXQmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iKi9idWlsZC54bWwiLyZndDsKKyZsdDsvc3ViYW50Jmd0OzwvcHJlPgorCis8cD5Bc3N1bWluZyB0aGUgc3ViZGlycyBvZiB0aGUgcHJvamVjdCBkaXIgYXJlCitjYWxsZWQgPHNhbXA+cHJvamVjdHMxPC9zYW1wPiwgPHNhbXA+cHJvamVjdHMyPC9zYW1wPiwgPHNhbXA+cHJvamVjdHMzPC9zYW1wPiwgdGhpcyBzbmlwcGV0IHdpbGwKK2V4ZWN1dGUgdGhlIDxxPmNvbXBpbGU8L3E+IHRhcmdldCBvZiA8c2FtcD4vb3B0L3Byb2plY3QvYnVpbGQxLnhtbDwvc2FtcD4sIHNldHRpbmcKK3RoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gdG8gPHE+cHJvamVjdHMxPC9xPiwgPHE+cHJvamVjdHMyPC9xPiwgPHE+cHJvamVjdHMzPC9xPjwvcD4KKworPHByZT4KKyZsdDtzdWJhbnQgdGFyZ2V0PSJjb21waWxlIiBnZW5lcmljYW50ZmlsZT0iL29wdC9wcm9qZWN0L2J1aWxkMS54bWwiJmd0OworICAgICZsdDtkaXJzZXQgZGlyPSIuIiBpbmNsdWRlcz0icHJvamVjdHMqIi8mZ3Q7CismbHQ7L3N1YmFudCZndDs8L3ByZT4KKworPHA+Tm93IGEgbGl0dGxlIG1vcmUgY29tcGxleCZtZGFzaDtidXQgdXNlZnVsJm1kYXNoO3NjZW5hcmlvLiBBc3N1bWUgdGhhdCB3ZSBoYXZlIGEgZGlyZWN0b3J5CitzdHJ1Y3R1cmUgbGlrZSB0aGlzOjwvcD4KKworPHByZT4KK3Jvb3QKKyAgfCAgY29tbW9uLnhtbAorICB8ICBidWlsZC54bWwKKyAgfAorICArLS0gbW9kdWxlcworICAgICAgICArLS0gbW9kQQorICAgICAgICB8ICAgICArLS0gc3JjCisgICAgICAgICstLSBtb2RCCisgICAgICAgICAgICAgICstLSBzcmMKKworPGI+Y29tbW9uLnhtbDo8L2I+PGJyLz4KKyZsdDtwcm9qZWN0Jmd0OworICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgIHZhbHVlPSJzcmMiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiAgICB2YWx1ZT0iYnVpbGQiLyZndDsKKyAgICAmbHQ7cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiICB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLyZndDsKKworICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CisgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CisKKyAgICAmbHQ7IS0tIG1vcmUgdGFyZ2V0cyAtLSZndDsKKyZsdDsvcHJvamVjdCZndDsKKworPGI+YnVpbGQueG1sOjwvYj48YnIvPgorJmx0O3Byb2plY3QmZ3Q7CisgICAgJmx0O21hY3JvZGVmIG5hbWU9Iml0ZXJhdGUiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InRhcmdldCIvJmd0OworICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICAgICZsdDtzdWJhbnQgdGFyZ2V0PSJAe3RhcmdldH0iJmd0OworICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0ibW9kdWxlcyIgaW5jbHVkZXM9IiovYnVpbGQueG1sIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3N1YmFudCZndDsKKyAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICZsdDsvbWFjcm9kZWYmZ3Q7CisKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiJmd0OworICAgICAgICAmbHQ7aXRlcmF0ZSB0YXJnZXQ9ImNvbXBpbGUiLyZndDsKKyAgICAmbHQ7L3RhcmdldCZndDsKKworICAgICZsdDshLS0gbW9yZSB0YXJnZXRzIC0tJmd0OworJmx0Oy9wcm9qZWN0Jmd0OworCis8Yj5tb2R1bGVzL21vZEEvYnVpbGQueG1sOjwvYj48YnIvPgorJmx0O3Byb2plY3QgbmFtZT0ibW9kQSImZ3Q7CisgICAgJmx0O2ltcG9ydCBmaWxlPSIuLi8uLi9jb21tb24ueG1sIi8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CisKKzxwPlRoaXMgcmVzdWx0cyBpbiB2ZXJ5IHNtYWxsIGJ1aWxkIGZpbGVzIGluIHRoZSBtb2R1bGVzLCBtYWludGFpbmFibGUgYnVpbGQgZmlsZQorKDxzYW1wPmNvbW1vbi54bWw8L3NhbXA+KSBhbmQgYSBjbGVhciBwcm9qZWN0IHN0cnVjdHVyZS4gQWRkaXRpb25hbGx5IHRoZSByb290IGJ1aWxkIGZpbGUgaXMgY2FwYWJsZQordG8gcnVuIHRoZSB3aG9sZSBidWlsZCBvdmVyIGFsbCBtb2R1bGVzLjwvcD4KKworPHA+VGhpcyB0YXNrIHBlcmZvcm1zIGEgPHE+Y2xlYW4gYnVpbGQ8L3E+IGZvciBlYWNoIHN1YnByb2plY3QuPC9wPgorCis8cHJlPgorJmx0O3N1YmFudCBmYWlsb25lcnJvcj0iZmFsc2UiJmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IioqL2J1aWxkLnhtbCIgZXhjbHVkZXM9ImJ1aWxkLnhtbCIvJmd0OworICAgICZsdDt0YXJnZXQgbmFtZT0iY2xlYW4iLyZndDsKKyAgICAmbHQ7dGFyZ2V0IG5hbWU9ImJ1aWxkIi8mZ3Q7CismbHQ7L3N1YmFudCZndDs8L3ByZT4KKworPHA+PHN0cm9uZz5IaW50PC9zdHJvbmc+OiBiZWNhdXNlIGJ1aWxkIGZpbGVzIGFyZSBwbGFpbiBYTUwsIHlvdSBjb3VsZCBnZW5lcmF0ZSB0aGUgbWFzdGVyIGJ1aWxkCitmaWxlIGZyb20gdGhlIGNvbW1vbiBidWlsZCBmaWxlIGJ5IHVzaW5nIGEgWFNMVCB0cmFuc2Zvcm1hdGlvbjo8L3A+CisKKzxwcmU+CismbHQ7eHNsdCBpbj0mcXVvdDtjb21tb24ueG1sJnF1b3Q7CisgICAgICBvdXQ9JnF1b3Q7bWFzdGVyLnhtbCZxdW90OworICAgICAgc3R5bGU9JnF1b3Q7JHthbnQuaG9tZX0vZXRjL2NvbW1vbjJtYXN0ZXIueHNsJnF1b3Q7LyZndDs8L3ByZT4KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy9zeW1saW5rLmh0bWwgYi9tYW51YWwvVGFza3Mvc3ltbGluay5odG1sCmluZGV4IGRmNDJhYmQuLjZjOTNkMDUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy9zeW1saW5rLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3N5bWxpbmsuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEzMyArMTUsMTEwIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5TeW1saW5rIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InN5bWxpbmsiPlN5bWxpbms8L2E+PC9oMj4KKzxoMiBpZD0ic3ltbGluayI+U3ltbGluazwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+IE1hbmFnZXMgc3ltYm9saWMgbGlua3Mgb24gVW5peCBiYXNlZCBwbGF0Zm9ybXMuIENhbiBiZSB1c2VkIHRvCi1tYWtlIGFuIGluZGl2aWR1YWwgbGluaywgZGVsZXRlIGEgbGluaywgY3JlYXRlIG11bHRpcGxlIGxpbmtzIGZyb20gcHJvcGVydGllcyBmaWxlcywgCi1vciBjcmVhdGUgcHJvcGVydGllcyBmaWxlcyBkZXNjcmliaW5nIGxpbmtzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuCi1FeGlzdGluZyBsaW5rcyBhcmUgbm90IG92ZXJ3cml0dGVuIGJ5IGRlZmF1bHQuCi0KLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBhCi1zZXQgb2YgbGlua3MgdG8gcmVjb3JkLCBvciBhIHNldCBvZiBwcm9wZXJ0eSBmaWxlcyB0byBjcmVhdGUgbGlua3MgZnJvbS4gPC9wPgorPHA+TWFuYWdlcyBzeW1ib2xpYyBsaW5rcyBvbiBwbGF0Zm9ybXMgd2hlcmUgSmF2YSBzdXBwb3J0cyBzeW1ib2xpYyBsaW5rcy4gIENhbiBiZSB1c2VkIHRvIG1ha2UgYW4KK2luZGl2aWR1YWwgbGluaywgZGVsZXRlIGEgbGluaywgY3JlYXRlIG11bHRpcGxlIGxpbmtzIGZyb20gcHJvcGVydGllcyBmaWxlcywgb3IgY3JlYXRlIHByb3BlcnRpZXMKK2ZpbGVzIGRlc2NyaWJpbmcgbGlua3MgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gRXhpc3RpbmcgZmlsZXMgYXJlIG5vdCBvdmVyd3JpdHRlbiBieQorZGVmYXVsdC48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgYSBzZXQgb2YgbGlua3MgdG8gcmVjb3JkLCBvciBhCitzZXQgb2YgcHJvcGVydHkgZmlsZXMgdG8gY3JlYXRlIGxpbmtzIGZyb20uPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHR5cGUgb2YgYWN0aW9uIHRvIHBlcmZvcm0sIG1heSBiZSAic2luZ2xlIiwgCi0gICAgInJlY29yZCIsICJyZWNyZWF0ZSIgb3IgImRlbGV0ZSIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBzaW5nbGUuPC90ZD4KKyAgICA8dGQ+YWN0aW9uPC90ZD4KKyAgICA8dGQ+VGhlIHR5cGUgb2YgYWN0aW9uIHRvIHBlcmZvcm0sIG1heSBiZSA8cT5zaW5nbGU8L3E+LCAiPHE+cmVjb3JkPC9xPiwgPHE+cmVjcmVhdGU8L3E+CisgICAgICBvciA8cT5kZWxldGU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5zaW5nbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGluazwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgbGluayB0byBiZSBjcmVhdGVkIG9yIGRlbGV0ZWQuPGJyLz4KLSAgICAgIDxiPk5vdGU8L2I+IHRoaXMgYXR0cmlidXRlIGlzIHJlc29sdmVkIGFnYWluc3QgdGhlIGN1cnJlbnQKLSAgICAgIHdvcmtpbmcgZGlyZWN0b3J5IHJhdGhlciB0aGFuIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBmb3IKLSAgICAgIGhpc3RvcmljYWwgcmVhc29ucy4gIEl0IGlzIHJlY29tbWVuZGVkIHlvdSBhbHdheXMgdXNlIGFuCi0gICAgICBhYnNvbHV0ZSBwYXRoIG9yIGEgcGF0aCBsaWtlIDxjb2RlPiR7YmFzZWRpcn0vc29tZS1wYXRoPC9jb2RlPgotICAgICAgYXMgaXRzIHZhbHVlLgorICAgIDx0ZD5saW5rPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGxpbmsgdG8gYmUgY3JlYXRlZCBvciBkZWxldGVkLjxici8+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiB0aGlzIGF0dHJpYnV0ZSBpcworICAgICAgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSByYXRoZXIgdGhhbiB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPgorICAgICAgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIEl0IGlzIHJlY29tbWVuZGVkIHlvdSBhbHdheXMgdXNlIGFuIGFic29sdXRlIHBhdGggb3IgYSBwYXRoCisgICAgICBsaWtlIDxzYW1wPiR7YmFzZWRpcn0vc29tZS1wYXRoPC9zYW1wPiBhcyBpdHMgdmFsdWUuCiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIGFsaWduPSJjZW50ZXIiID5yZXF1aXJlZCBmb3IgCi0gICAgYWN0aW9uPSJzaW5nbGUiIG9yICJkZWxldGUiLiBJZ25vcmVkIGluIG90aGVyIGFjdGlvbnMuPC90ZD4KKyAgICA8dGQ+WWVzLCBmb3IgPHZhcj5hY3Rpb248L3Zhcj49PHE+c2luZ2xlPC9xPiBvciA8cT5kZWxldGU8L3E+OyBpZ25vcmVkIGluIG90aGVyIGFjdGlvbnM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgcmVzb3VyY2UgdGhlIGxpbmsgc2hvdWxkIHBvaW50IHRvLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5yZXF1aXJlZCBmb3IgYWN0aW9uPSJzaW5nbGUiLiBJZ25vcmVkIGluIG90aGVyIGFjdGlvbnMuPC90ZD4KKyAgICA8dGQ+cmVzb3VyY2U8L3RkPgorICAgIDx0ZD5UaGUgcmVzb3VyY2UgdGhlIGxpbmsgc2hvdWxkIHBvaW50IHRvLjwvdGQ+CisgICAgPHRkPlllcywgZm9yIDx2YXI+YWN0aW9uPC92YXI+PTxxPnNpbmdsZTwvcT47IGlnbm9yZWQgaW4gb3RoZXIgYWN0aW9uczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxpbmtmaWxlbmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydGllcyBmaWxlIHRvIGNyZWF0ZSBpbiAKLSAgICBlYWNoIGluY2x1ZGVkIGRpcmVjdG9yeS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+cmVxdWlyZWQgZm9yIGFjdGlvbj0icmVjb3JkIi4gCi0gICAgSWdub3JlZCBpbiBvdGhlciBhY3Rpb25zLjwvdGQ+CisgICAgPHRkPmxpbmtmaWxlbmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gY3JlYXRlIGluIGVhY2ggaW5jbHVkZWQgZGlyZWN0b3J5LjwvdGQ+CisgICAgPHRkPlllcywgZm9yIDx2YXI+YWN0aW9uPC92YXI+PTxxPnJlY29yZDwvcT47IGlnbm9yZWQgaW4gb3RoZXIgYWN0aW9uczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVyd3JpdGUgZXhpc3RpbmcgbGlua3Mgb3Igbm90LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQ+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIG9yIG5vdC4gSWYgb3ZlcndyaXRlIGlzIHNldCB0byA8cT50cnVlPC9xPiwgdGhlbiBhbnkgZXhpc3RpbmcgZmlsZSwKKyAgICAgIHNwZWNpZmllZCBieSB0aGUgbGluayBhdHRyaWJ1dGUsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgb3Igbm90IHRoZQorICAgICAgZXhpc3RpbmcgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmsuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhaWxvbmVycm9yPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5TdG9wIGJ1aWxkIGlmIHRydWUsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZSBidWlsZCwKLSAgICAgICB3aGVuIHRoZSBhbiBlcnJvciBvY2N1cnMgaWYgZmFsc2UuCi0gICAgIDwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIHRydWUuPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5TdG9wIGJ1aWxkIGlmIHRydWUsIGxvZyBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IGRvIG5vdCBzdG9wIHRoZSBidWlsZCwgd2hlbiB0aGUgYW4gZXJyb3IKKyAgICAgIG9jY3VycyBpZiA8cT5mYWxzZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KLSAKKwogPGg0PmZpbGVzZXQ8L2g0PgotIDxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zCi0gYXJlIHVzZWQgd2hlbiBhY3Rpb24gPSAicmVjb3JkIiB0byBzZWxlY3QgZGlyZWN0b3JpZXMgYW5kIGxpbmtuYW1lcyB0byBiZSByZWNvcmRlZC4gCi0gVGhleSBhcmUgYWxzbyB1c2VkIHdoZW4gYWN0aW9uID0gInJlY3JlYXRlIiB0byBzcGVjaWZ5IGJvdGggdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IAotIGZpbGVzIHRvIGJlIHByb2Nlc3NlZCwgYW5kIHRoZSBkaXJlY3RvcmllcyBpbiB3aGljaCB0aGV5IGNhbiBiZSBmb3VuZC4gQXQgbGVhc3Qgb25lIAotIGZpbGVzZXQgaXMgcmVxdWlyZWQgZm9yIGVhY2ggY2FzZS48L3A+Ci0gCis8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB3aGVuIDx2YXI+YWN0aW9uPC92YXI+PTxxPnJlY29yZDwvcT4gdG8KK3NlbGVjdCBkaXJlY3RvcmllcyBhbmQgbGluayBuYW1lcyB0byBiZSByZWNvcmRlZC4gIFRoZXkgYXJlIGFsc28gdXNlZAord2hlbiA8dmFyPmFjdGlvbjwvdmFyPj08cT5yZWNyZWF0ZTwvcT4gdG8gc3BlY2lmeSBib3RoIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmaWxlcyB0byBiZQorcHJvY2Vzc2VkLCBhbmQgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIHRoZXkgY2FuIGJlIGZvdW5kLiBBdCBsZWFzdCBvbmUgZmlsZXNldCBpcyByZXF1aXJlZCBmb3IgZWFjaAorY2FzZS48L3A+CisKIDxoMz5FeGFtcGxlczwvaDM+CiAKLSAgPHA+IE1ha2UgYSBsaW5rIG5hbWVkICJmb28iIHRvIGEgcmVzb3VyY2UgbmFtZWQgImJhci5mb28iIGluIHN1YmRpcjo8L3A+Ci0gIDxwcmU+Ci0gICZsdDtzeW1saW5rIGxpbms9IiR7ZGlyLnRvcH0vZm9vIiByZXNvdXJjZT0iJHtkaXIudG9wfS9zdWJkaXIvYmFyLmZvbyIvJmd0OwotICA8L3ByZT4KLSAKLSAgPHA+IFJlY29yZCBhbGwgbGlua3MgaW4gc3ViZGlyIGFuZCBpdCdzIGRlc2NlbmRhbnRzIGluIGZpbGVzIG5hbWVkCi0gICJkaXIubGlua3MiPC9wPgotICA8cHJlPgotICAmbHQ7c3ltbGluayBhY3Rpb249InJlY29yZCIgbGlua2ZpbGVuYW1lPSJkaXIubGlua3MiJmd0OwotICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7ZGlyLnRvcH0iIGluY2x1ZGVzPSJzdWJkaXImIzQ3OyoqIi8mZ3Q7Ci0gICZsdDsvc3ltbGluayZndDsKLSAgPC9wcmU+Ci0gCi0gIDxwPiBSZWNyZWF0ZSB0aGUgbGlua3MgcmVjb3JkZWQgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGU6PC9wPgotICA8cHJlPgotICAmbHQ7c3ltbGluayBhY3Rpb249InJlY3JlYXRlIiZndDsKLSAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2Rpci50b3B9IiBpbmNsdWRlcz0ic3ViZGlyJiM0NzsqKiYjNDc7ZGlyLmxpbmtzIi8mZ3Q7ICAKLSAgJmx0Oy9zeW1saW5rJmd0OwotICA8L3ByZT4KLSAKLSA8cD4gRGVsZXRlIGEgbGluayBuYW1lZCAiZm9vIjoKLSA8cHJlPgotICZsdDtzeW1saW5rIGFjdGlvbj0iZGVsZXRlIiBsaW5rPSIke2Rpci50b3B9L2ZvbyIvJmd0OwotIDwvcHJlPgorPHA+TWFrZSBhIGxpbmsgbmFtZWQgPHNhbXA+Zm9vPC9zYW1wPiB0byBhIHJlc291cmNlIG5hbWVkIDxzYW1wPmJhci5mb288L3NhbXA+CitpbiA8c2FtcD5zdWJkaXI8L3NhbXA+OjwvcD4KKzxwcmU+Jmx0O3N5bWxpbmsgbGluaz0iJHtkaXIudG9wfS9mb28iIHJlc291cmNlPSIke2Rpci50b3B9L3N1YmRpci9iYXIuZm9vIi8mZ3Q7PC9wcmU+CiAKLSAgPHA+PHN0cm9uZz5KYXZhIDEuMiBhbmQgZWFybGllcjo8L3N0cm9uZz4gRHVlIHRvIGxpbWl0YXRpb25zIG9uIGV4ZWN1dGluZyBzeXN0ZW0KLSAgbGV2ZWwgY29tbWFuZHMgaW4gSmF2YSB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS4zIHRoaXMgdGFzayBtYXkgaGF2ZSBkaWZmaWN1bHR5Ci0gIG9wZXJhdGluZyB3aXRoIGEgcmVsYXRpdmUgcGF0aCBpbiBBTlRfSE9NRS4gVGhlIHR5cGljYWwgc3ltcHRvbSBpcyBhbiAKLSAgSU9FeGNlcHRpb24gd2hlcmUgQXBhY2hlIEFudCBjYW4ndCBmaW5kIC9zb21lL3dvcmtpbmcvZGlyZWN0b3J5JHtBTlRfSE9NRX0vYmluL2FudFJ1bgotICBvciBzb21ldGhpbmcgc2ltaWxhci4gVGhlIHdvcmthcm91bmQgaXMgdG8gY2hhbmdlIHlvdXIgQU5UX0hPTUUgZW52aXJvbm1lbnQKLSAgdmFyaWFibGUgdG8gYW4gYWJzb2x1dGUgcGF0aCwgd2hpY2ggd2lsbCByZW1vdmUgdGhlIC9zb21lL3dvcmtpbmcvZGlyZWN0b3J5IHBvcnRpb24KLSAgb2YgdGhlIGFib3ZlIHBhdGggYW5kIGFsbG93IGFudCB0byBmaW5kIHRoZSBjb3JyZWN0IGNvbW1hbmRsaW5lIGV4ZWN1dGlvbiBzY3JpcHQuCi0gCi0gIDxwPjxzdHJvbmc+TElNSVRBVElPTlM6PC9zdHJvbmc+IEJlY2F1c2UgSmF2YSBoYXMgbm8gZGlyZWN0IHN1cHBvcnQgZm9yCi0gIGhhbmRsaW5nIHN5bWxpbmtzIHRoaXMgdGFzayBkaXZpbmVzIHRoZW0gYnkgY29tcGFyaW5nIGNhbm9uaWNhbCBhbmQKLSAgYWJzb2x1dGUgcGF0aHMuIE9uIG5vbi11bml4IHN5c3RlbXMgdGhpcyBtYXkgY2F1c2UgZmFsc2UgcG9zaXRpdmVzLgotICBGdXJ0aGVybW9yZSwgYW55IG9wZXJhdGluZyBzeXN0ZW0gb24gd2hpY2ggdGhlIGNvbW1hbmQKLSAgPGNvZGU+bG4gLXMgJmx0O2xpbmtuYW1lJmd0OyAmbHQ7cmVzb3VyY2VuYW1lJmd0OzwvY29kZT4gaXMgbm90IGEgdmFsaWQgCi0gIGNvbW1hbmQgb24gdGhlIGNvbW1hbmQgbGluZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSBhY3Rpb249InNpbmdsZSIgb3IgCi0gIGFjdGlvbj0icmVjcmVhdGUiLiBBY3Rpb249InJlY29yZCIgYW5kIGFjdGlvbj1kZWxldGUgc2hvdWxkIHN0aWxsIHdvcmsuIEZpbmFsbHksIAotICB0aGUgbGFjayBvZiBzdXBwb3J0IGZvciBzeW1saW5rcyBpbiBKYXZhIG1lYW5zIHRoYXQgYWxsIGxpbmtzIGFyZSByZWNvcmRlZCBhcyAKLSAgbGlua3MgdG8gdGhlIDxzdHJvbmc+Y2Fub25pY2FsPC9zdHJvbmc+IHJlc291cmNlIG5hbWUuIFRoZXJlZm9yZSB0aGUgbGluazoKLSAgPGNvZGU+bGluayAtLT4gc3ViZGlyL2Rpci8uLi9mb28uYmFyPC9jb2RlPiB3aWxsIGJlIHJlY29yZGVkIGFzCi0gIDxjb2RlPmxpbms9c3ViZGlyL2Zvby5iYXI8L2NvZGU+IGFuZCByZXN0b3JlZCBhcwotICA8Y29kZT5saW5rIC0tPiBzdWJkaXIvZm9vLmJhcjwvY29kZT48L3A+Cis8cD5SZWNvcmQgYWxsIGxpbmtzIGluIDxzYW1wPnN1YmRpcjwvc2FtcD4gYW5kIGl0J3MgZGVzY2VuZGFudHMgaW4gZmlsZXMKK25hbWVkIDxzYW1wPmRpci5saW5rczwvc2FtcD48L3A+Cis8cHJlPgorJmx0O3N5bWxpbmsgYWN0aW9uPSJyZWNvcmQiIGxpbmtmaWxlbmFtZT0iZGlyLmxpbmtzIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7ZGlyLnRvcH0iIGluY2x1ZGVzPSJzdWJkaXIvKioiLyZndDsKKyZsdDsvc3ltbGluayZndDs8L3ByZT4KIAorPHA+UmVjcmVhdGUgdGhlIGxpbmtzIHJlY29yZGVkIGluIHRoZSBwcmV2aW91cyBleGFtcGxlOjwvcD4KKzxwcmU+CismbHQ7c3ltbGluayBhY3Rpb249InJlY3JlYXRlIiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7ZGlyLnRvcH0iIGluY2x1ZGVzPSJzdWJkaXIvKiovZGlyLmxpbmtzIi8mZ3Q7CismbHQ7L3N5bWxpbmsmZ3Q7PC9wcmU+CiAKKzxwPkRlbGV0ZSBhIGxpbmsgbmFtZWQgPHNhbXA+Zm9vPC9zYW1wPjo8L3A+Cis8cHJlPiZsdDtzeW1saW5rIGFjdGlvbj0iZGVsZXRlIiBsaW5rPSIke2Rpci50b3B9L2ZvbyIvJmd0OzwvcHJlPgorCis8cD48c3Ryb25nPkphdmEgMS4yIGFuZCBlYXJsaWVyPC9zdHJvbmc+OiBEdWUgdG8gbGltaXRhdGlvbnMgb24gZXhlY3V0aW5nIHN5c3RlbSBsZXZlbCBjb21tYW5kcyBpbgorSmF2YSB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gMS4zIHRoaXMgdGFzayBtYXkgaGF2ZSBkaWZmaWN1bHR5IG9wZXJhdGluZyB3aXRoIGEgcmVsYXRpdmUgcGF0aAoraW4gPGNvZGU+QU5UX0hPTUU8L2NvZGU+LiBUaGUgdHlwaWNhbCBzeW1wdG9tIGlzIGFuIDxjb2RlPklPRXhjZXB0aW9uPC9jb2RlPiB3aGVyZSBBcGFjaGUgQW50IGNhbid0CitmaW5kIDxzYW1wPi9zb21lL3dvcmtpbmcvZGlyZWN0b3J5JHtBTlRfSE9NRX0vYmluL2FudFJ1bjwvc2FtcD4gb3Igc29tZXRoaW5nIHNpbWlsYXIuIFRoZSB3b3JrYXJvdW5kCitpcyB0byBjaGFuZ2UgeW91ciA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gYW4gYWJzb2x1dGUgcGF0aCwgd2hpY2ggd2lsbCByZW1vdmUKK3RoZSA8c2FtcD4vc29tZS93b3JraW5nL2RpcmVjdG9yeTwvc2FtcD4gcG9ydGlvbiBvZiB0aGUgYWJvdmUgcGF0aCBhbmQgYWxsb3cgQW50IHRvIGZpbmQgdGhlIGNvcnJlY3QKK2NvbW1hbmQgbGluZSBleGVjdXRpb24gc2NyaXB0LjwvcD4KKworPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiA8ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+LCB0aGlzIHRhc2sgcmVsaWVzIG9uIHRoZSBzeW1ib2xpYyBsaW5rIHN1cHBvcnQKK2ludHJvZHVjZWQgaW4gSmF2YSA3IHRocm91Z2ggdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLm5pby5maWxlLkZpbGVzPC9jb2RlPiBBUElzPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvc3luYy5odG1sIGIvbWFudWFsL1Rhc2tzL3N5bmMuaHRtbAppbmRleCAxZDM0YWVlLi4yZmVmZWVkIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3Mvc3luYy5odG1sCisrKyBiL21hbnVhbC9UYXNrcy9zeW5jLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNTMgKzE1LDEzMSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+U3luYyBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJnZXQiPlN5bmM8L2E+PC9oMj4KKzxoMiBpZD0iZ2V0Ij5TeW5jPC9oMj4KIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNjwvZW0+PC9wPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIAogPHA+U3luY2hyb25pemUgYSB0YXJnZXQgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGVzIGRlZmluZWQgaW4gb25lIG9yCi1tb3JlIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb248L2E+cy48L3A+Cittb3JlIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPnJlc291cmNlIGNvbGxlY3Rpb25zPC9hPi48L3A+CiAKLTxwPkFueSBmaWxlIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRoYXQgaGFzIG5vdCBiZWVuIG1hdGNoZWQgYnkgYXQKLWxlYXN0IG9uZSBvZiB0aGUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIGdldHMgcmVtb3ZlZC4gIEkuZS4gaWYgeW91IGV4Y2x1ZGUgYQotZmlsZSBpbiB5b3VyIHNvdXJjZXMgYW5kIGEgZmlsZSBvZiB0aGF0IG5hbWUgaXMgcHJlc2VudCBpbiB0aGUgdGFyZ2V0Ci1kaXIsIGl0IHdpbGwgZ2V0IHJlbW92ZWQgZnJvbSB0aGUgdGFyZ2V0LjwvcD4KKzxwPkFueSBmaWxlIGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRoYXQgaGFzIG5vdCBiZWVuIG1hdGNoZWQgYnkgYXQgbGVhc3Qgb25lIG9mIHRoZSBuZXN0ZWQgcmVzb3VyY2UKK2NvbGxlY3Rpb25zIGdldHMgcmVtb3ZlZC4gIEkuZS4gaWYgeW91IGV4Y2x1ZGUgYSBmaWxlIGluIHlvdXIgc291cmNlcyBhbmQgYSBmaWxlIG9mIHRoYXQgbmFtZSBpcworcHJlc2VudCBpbiB0aGUgdGFyZ2V0IGRpciwgaXQgd2lsbCBnZXQgcmVtb3ZlZCBmcm9tIHRoZSB0YXJnZXQuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN5bmMgd2l0aCB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbnM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgPC90cj4gIAotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdmVyd3JpdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uCi0gICAgICBmaWxlcyBhcmUgbmV3ZXIuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byBmYWxzZS48L3RkPgorICAgIDx0ZD50b2RpcjwvdGQ+CisgICAgPHRkPnRoZSB0YXJnZXQgZGlyZWN0b3J5IHRvIHN5bmMgd2l0aCB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbnM8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlRW1wdHlEaXJzPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIj5Db3B5IGFueSBlbXB0eSBkaXJlY3RvcmllcyBpbmNsdWRlZCBpbiB0aGUKLSAgICAgICByZXNvdXJjZSBjb2xsZWN0aW9uKHMpLjxici8+Ci0gICAgICAgPGI+Tm90ZTwvYj4gdGhpcyBhdHRyaWJ1dGUgYWxzbyBjb250cm9scyB0aGUgYmVoYXZpb3IgZm9yIGFueQotICAgICAgIG5lc3RlZCAmbHQ7cHJlc2VydmVpbnRhcmdldCZndDsgZWxlbWVudC4gIElmIHRoaXMgYXR0cmlidXRlIGlzCi0gICAgICAgZmFsc2UgKHRoZSBkZWZhdWx0KSBlbXB0eSBkaXJlY3RvcmllcyB0aGF0IG9ubHkgZXhpc3QgaW4gdGhlCi0gICAgICAgdGFyZ2V0IGRpcmVjdG9yeSB3aWxsIGJlIHJlbW92ZWQgZXZlbiBpZiB0aGV5IGFyZSBtYXRjaGVkIGJ5Ci0gICAgICAgdGhlIHBhdHRlcm5zIG9mICZsdDtwcmVzZXJ2ZWludGFyZ2V0Jmd0Oy4gIFRoaXMgY2FuIGJlCi0gICAgICAgb3ZlcnJpZGRlbiBieSAmbHQ7cHJlc2VydmVpbnRhcmdldCZndDsncwotICAgICAgIHByZXNlcnZlRW1wdHlEaXJzIGF0dHJpYnV0ZS4KLSAgICAgPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQ+T3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzIGV2ZW4gaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGVzIGFyZSBuZXdlci48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiPklmIGlzIHNldCB0byBmYWxzZSwgbG9nIGEgd2FybmluZyBtZXNzYWdlLCBidXQgZG8gbm90IHN0b3AgdGhlIGJ1aWxkLAotICAgICAgIHdoZW4gb25lIG9mIHRoZSBuZXN0ZWQgZmlsZXNldHMgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IHRoYXQKLSAgICAgICBkb2Vzbid0IGV4aXN0LgotICAgICA8L3RkPgotICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPmluY2x1ZGVFbXB0eURpcnM8L3RkPgorICAgIDx0ZD5Db3B5IGFueSBlbXB0eSBkaXJlY3RvcmllcyBpbmNsdWRlZCBpbiB0aGUgcmVzb3VyY2UKKyAgICAgIGNvbGxlY3Rpb24ocykuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoaXMgYXR0cmlidXRlIGFsc28gY29udHJvbHMgdGhlIGJlaGF2aW9yIGZvciBhbnkKKyAgICAgIG5lc3RlZCA8Y29kZT4mbHQ7cHJlc2VydmVpbnRhcmdldCZndDs8L2NvZGU+IGVsZW1lbnQuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyA8cT5mYWxzZTwvcT4gKHRoZQorICAgICAgZGVmYXVsdCkgZW1wdHkgZGlyZWN0b3JpZXMgdGhhdCBvbmx5IGV4aXN0IGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHdpbGwgYmUgcmVtb3ZlZCBldmVuIGlmCisgICAgICB0aGV5IGFyZSBtYXRjaGVkIGJ5IHRoZSBwYXR0ZXJucyBvZiA8Y29kZT4mbHQ7cHJlc2VydmVpbnRhcmdldCZndDs8L2NvZGU+LiAgVGhpcyBjYW4gYmUKKyAgICAgIG92ZXJyaWRkZW4gYnkgPGNvZGU+Jmx0O3ByZXNlcnZlaW50YXJnZXQmZ3Q7PC9jb2RlPidzIDx2YXI+cHJlc2VydmVFbXB0eURpcnM8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgIDx0ZCB2YWxpZ249InRvcCI+TG9nIHRoZSBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQuPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5JZiBzZXQgdG8gPHE+ZmFsc2U8L3E+LCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBkbyBub3Qgc3RvcCB0aGUgYnVpbGQsIHdoZW4gb25lIG9mIHRoZQorICAgICAgbmVzdGVkIGZpbGVzZXRzIHBvaW50cyB0byBhIGRpcmVjdG9yeSB0aGF0IGRvZXNuJ3QgZXhpc3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JhbnVsYXJpdHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIGdpdmUgYmVmb3JlCi0gICAgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG5vdCBldmVyeQotICAgIGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlCi0gICAgbWlsbGlzZWNvbmQgbGV2ZWwuIERlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1MKLSAgICBzeXN0ZW1zLiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgbGl2ZQotICAgIG9uIHNlcGFyYXRlIG1hY2hpbmVzIHdpdGggY2xvY2tzIGJlaW5nIG91dCBvZiBzeW5jLiAgPGVtPnNpbmNlIEFudAotICAgIDEuNi4yPC9lbT4uPC90ZD4KLSAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Oby48L3RkPgorICAgIDx0ZD52ZXJib3NlPC90ZD4KKyAgICA8dGQ+TG9nIHRoZSBmaWxlcyB0aGF0IGFyZSBiZWluZyBjb3BpZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Z3JhbnVsYXJpdHk8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzCisgICAgICBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiAgVGhpcyBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgc291cmNlIGFuZCB0YXJnZXQgZmlsZXMgbGl2ZSBvbiBzZXBhcmF0ZQorICAgICAgbWFjaGluZXMgd2l0aCBjbG9ja3MgYmVpbmcgb3V0IG9mIHN5bmMuICA8ZW0+c2luY2UgQW50IDEuNi4yPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1Mgc3lzdGVtcy48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxoND5maWxlc2V0IG9yIGFueSBvdGhlciByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCi1Db2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiBmaWxlcyB0byBjb3B5LjwvcD4KLTxwPlByaW9yIHRvIEFudCAxLjcgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuCi1zdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC48L3A+Cis8aDQ+YW55IHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdCBncm91cHMKK29mIGZpbGVzIHRvIGNvcHkuPC9wPgorPHA+UHJpb3IgdG8gQW50IDEuNyBvbmx5IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaGFzIGJlZW4gc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCiA8aDQ+cHJlc2VydmVJblRhcmdldDwvaDQ+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KIAotPHA+U3BlY2lmaWVzIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlIGtlcHQgaW4gdGhlIHRhcmdldAotZGlyZWN0b3J5IGV2ZW4gaWYgdGhleSBhcmUgbm90IHByZXNlbnQgaW4gb25lIG9mIHRoZSBzb3VyY2UKLWRpcmVjdG9yaWVzLjwvcD4KKzxwPlNwZWNpZmllcyBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZSBrZXB0IGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IGV2ZW4gaWYgdGhleSBhcmUgbm90CitwcmVzZW50IGluIG9uZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yaWVzLjwvcD4KIAotPHA+VGhpcyBuZXN0ZWQgZWxlbWVudCBpcyBsaWtlIGEgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gZXhjZXB0IHRoYXQgaXQgZG9lc24ndAotc3VwcG9ydCB0aGUgZGlyIGF0dHJpYnV0ZSBhbmQgdGhlIHVzZWRlZmF1bHRleGNsdWRlcyBhdHRyaWJ1dGUKLWRlZmF1bHRzIHRvIGZhbHNlLjwvcD4KKzxwPlRoaXMgbmVzdGVkIGVsZW1lbnQgaXMgbGlrZSBhIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gZXhjZXB0IHRoYXQgaXQgZG9lc24ndAorc3VwcG9ydCB0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIGFuZCB0aGUgPHZhcj51c2VkZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlIGRlZmF1bHRzCit0byA8cT5mYWxzZTwvcT4uPC9wPgogCi08aDU+QWRkaXRpb25hbCBQYXJhbWV0ZXJzPC9oNT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8aDU+QWRkaXRpb25hbCBwYXJhbWV0ZXJzPC9oNT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZUVtcHR5RGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVycnVsZXMgdGhlIGluY2x1ZGVFbXB0eWRpcnMgc2V0dGluZyBmb3IKLSAgICAgIGRpcmVjdG9yaWVzIG1hdGNoZWQgYnkgdGhpcyBlbGVtZW50LiAgSWYgeW91IHdhbnQgdG8gcHJlc2VydmUKLSAgICAgIGVtcHR5IGRpcmVjdG9yaWVzIHRoYXQgYXJlIG5vdCBpbiB5b3VyIHNvdXJjZSBkaXJlY3RvcnkgeW91IGNhbgotICAgICAgZWl0aGVyIHNldCB0aGUgdGFzaydzIGluY2x1ZGVlbXB0eWRpcnMgYXR0cmlidXRlIG9yIHRoaXMgb25lLgotICAgICAgSWYgdGhlIHR3byBhdHRyaWJ1dGUgdmFsdWVzIGNvbmZsaWN0LCB0aGlzIGF0dHJpYnV0ZQotICAgICAgIndpbnMiLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZQotICAgICAgdGFzaydzIGluY2x1ZGVlbXB0eWRpcnMgYXR0cmlidXRlPC90ZD4KLSAgPC90cj4gIAorICAgIDx0ZD5wcmVzZXJ2ZUVtcHR5RGlyczwvdGQ+CisgICAgPHRkPk92ZXJydWxlcyB0aGUgPHZhcj5pbmNsdWRlRW1wdHlkaXJzPC92YXI+IHNldHRpbmcgZm9yIGRpcmVjdG9yaWVzIG1hdGNoZWQgYnkgdGhpcyBlbGVtZW50LgorICAgICAgSWYgeW91IHdhbnQgdG8gcHJlc2VydmUgZW1wdHkgZGlyZWN0b3JpZXMgdGhhdCBhcmUgbm90IGluIHlvdXIgc291cmNlIGRpcmVjdG9yeSB5b3UgY2FuIGVpdGhlcgorICAgICAgc2V0IHRoZSB0YXNrJ3MgPHZhcj5pbmNsdWRlZW1wdHlkaXJzPC92YXI+IGF0dHJpYnV0ZSBvciB0aGlzIG9uZS4gIElmIHRoZSB0d28gYXR0cmlidXRlIHZhbHVlcworICAgICAgY29uZmxpY3QsIHRoaXMgYXR0cmlidXRlICJ3aW5zIi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0YXNrJ3MgPHZhcj5pbmNsdWRlZW1wdHlkaXJzPC92YXI+IGF0dHJpYnV0ZTwvdGQ+CisgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08YmxvY2txdW90ZT48cHJlPgorPHA+T3ZlcndyaXRlIGFsbCBmaWxlcyBpbiA8c2FtcD5zaXRlPC9zYW1wPiB3aXRoIG5ld2VyIGZpbGVzIGZyb20gPHNhbXA+Z2VuZXJhdGVkLXNpdGU8L3NhbXA+LAorZGVsZXRlIGZpbGVzIGZyb20gPHNhbXA+c2l0ZTwvc2FtcD4gdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gPHNhbXA+Z2VuZXJhdGVkLXNpdGU8L3NhbXA+LjwvcD4KKworPHByZT4KICZsdDtzeW5jIHRvZGlyPSZxdW90O3NpdGUmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtnZW5lcmF0ZWQtc2l0ZSZxdW90Oy8mZ3Q7Ci0mbHQ7L3N5bmMmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5vdmVyd3JpdGVzIGFsbCBmaWxlcyBpbiA8ZW0+c2l0ZTwvZW0+IHdpdGggbmV3ZXIgZmlsZXMgZnJvbQotPGVtPmdlbmVyYXRlZC1zaXRlPC9lbT4sIGRlbGV0ZXMgZmlsZXMgZnJvbSA8ZW0+c2l0ZTwvZW0+IHRoYXQgYXJlIG5vdAotcHJlc2VudCBpbiA8ZW0+Z2VuZXJhdGVkLXNpdGU8L2VtPi48L3A+CismbHQ7L3N5bmMmZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5PdmVyd3JpdGUgYWxsIGZpbGVzIGluIDxzYW1wPnNpdGU8L3NhbXA+IHdpdGggbmV3ZXIgZmlsZXMgZnJvbSA8c2FtcD5nZW5lcmF0ZWQtc2l0ZTwvc2FtcD4sCitkZWxldGUgZmlsZXMgZnJvbSA8c2FtcD5zaXRlPC9zYW1wPiB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiA8c2FtcD5nZW5lcmF0ZWQtc2l0ZTwvc2FtcD4gYnV0IGtlZXAgYWxsCitmaWxlcyBpbiBhbnkgPHNhbXA+Q1ZTPC9zYW1wPiBzdWItZGlyZWN0b3J5LjwvcD4KKworPHByZT4KICZsdDtzeW5jIHRvZGlyPSZxdW90O3NpdGUmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtnZW5lcmF0ZWQtc2l0ZSZxdW90Oy8mZ3Q7CiAgICZsdDtwcmVzZXJ2ZWludGFyZ2V0Jmd0OwogICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovQ1ZTLyoqJnF1b3Q7LyZndDsKICAgJmx0Oy9wcmVzZXJ2ZWludGFyZ2V0Jmd0OwotJmx0Oy9zeW5jJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+b3ZlcndyaXRlcyBhbGwgZmlsZXMgaW4gPGVtPnNpdGU8L2VtPiB3aXRoIG5ld2VyIGZpbGVzIGZyb20KLTxlbT5nZW5lcmF0ZWQtc2l0ZTwvZW0+LCBkZWxldGVzIGZpbGVzIGZyb20gPGVtPnNpdGU8L2VtPiB0aGF0IGFyZSBub3QKLXByZXNlbnQgaW4gPGVtPmdlbmVyYXRlZC1zaXRlPC9lbT4gYnV0IGtlZXBzIGFsbCBmaWxlcyBpbiBhbnkKLTxlbT5DVlM8L2VtPiBzdWItZGlyZWN0b3J5LjwvcD4KLQotCismbHQ7L3N5bmMmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3Rhci5odG1sIGIvbWFudWFsL1Rhc2tzL3Rhci5odG1sCmluZGV4IDQ3OTRkNjMuLjg4ZDNjM2EgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy90YXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdGFyLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxOTMgKzE1LDE3NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VGFyIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InRhciI+VGFyPC9hPjwvaDI+Cis8aDIgaWQ9InRhciI+VGFyPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiA8cD5DcmVhdGVzIGEgdGFyIGFyY2hpdmUuPC9wPgotPHA+VGhlIDxpPmJhc2VkaXI8L2k+IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHRhci48L3A+Ci08cD5UaGlzIHRhc2sgaXMgYSA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrPC9hPgotYW5kLCBhcyBzdWNoLCBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVzZXQ8L2E+LiBUaGlzCi1kZWZpbmVzIHdoaWNoIGZpbGVzLCByZWxhdGl2ZSB0byB0aGUgPGk+YmFzZWRpcjwvaT4sIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCi1hcmNoaXZlLiBUaGUgdGFyIHRhc2sgc3VwcG9ydHMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIEZpbGVzZXQgdG8gcmVmaW5lIHRoZQotc2V0IG9mIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpbXBsaWNpdCBmaWxlc2V0LjwvcD4KKzxwPlRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gYXR0cmlidXRlIGlzIHRoZSByZWZlcmVuY2UgZGlyZWN0b3J5IGZyb20gd2hlcmUgdG8gdGFyLjwvcD4KKzxwPlRoaXMgdGFzayBpcyBhIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2s8L2E+IGFuZCwgYXMKK3N1Y2gsIGZvcm1zIGFuIGltcGxpY2l0IDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZXNldDwvYT4uIFRoaXMgZGVmaW5lcyB3aGljaCBmaWxlcywKK3JlbGF0aXZlIHRvIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4sIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUuIFRoZSA8Y29kZT50YXI8L2NvZGU+IHRhc2sKK3N1cHBvcnRzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBGaWxlc2V0IHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBpbXBsaWNpdAorZmlsZXNldC48L3A+CiAKLTxwPkluIGFkZGl0aW9uIHRvIHRoZSBpbXBsaWNpdCBmaWxlc2V0LCB0aGUgdGFyIHRhc2sgc3VwcG9ydHMgbmVzdGVkCi0gICAgICByZXNvdXJjZSBjb2xsZWN0aW9ucyBhbmQgYSBzcGVjaWFsIGZvcm0gb2YgZmlsZXNldHMuIFRoZXNlCi1maWxlc2V0cyBhcmUgZXh0ZW5kZWQgdG8gYWxsb3cgY29udHJvbCBvdmVyIHRoZSBhY2Nlc3MgbW9kZSwgdXNlcm5hbWUgYW5kIGdyb3VwbmFtZQotdG8gYmUgYXBwbGllZCB0byB0aGUgdGFyIGVudHJpZXMuIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiBwcmVwYXJpbmcgYXJjaGl2ZXMgZm9yCi0gIFVuaXggc3lzdGVtcyB3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gaGF2ZSBleGVjdXRlIHBlcm1pc3Npb24uICBCeQotICBkZWZhdWx0IHRoaXMgdGFzayB3aWxsIHVzZSBVbml4IHBlcm1pc3Npb25zIG9mIDY0NCBmb3IgZmlsZXMgYW5kIDc1NQotICBmb3IgZGlyZWN0b3JpZXMuPC9wPgorPHA+SW4gYWRkaXRpb24gdG8gdGhlIGltcGxpY2l0IGZpbGVzZXQsIHRoZSA8Y29kZT50YXI8L2NvZGU+IHRhc2sgc3VwcG9ydHMgbmVzdGVkIHJlc291cmNlCitjb2xsZWN0aW9ucyBhbmQgYSBzcGVjaWFsIGZvcm0gb2YgZmlsZXNldHMuIFRoZXNlIGZpbGVzZXRzIGFyZSBleHRlbmRlZCB0byBhbGxvdyBjb250cm9sIG92ZXIgdGhlCithY2Nlc3MgbW9kZSwgdXNlcm5hbWUgYW5kIGdyb3VwbmFtZSB0byBiZSBhcHBsaWVkIHRvIHRoZSB0YXIgZW50cmllcy4gVGhpcyBpcyB1c2VmdWwsIGZvciBleGFtcGxlLAord2hlbiBwcmVwYXJpbmcgYXJjaGl2ZXMgZm9yIFVuaXggc3lzdGVtcyB3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gaGF2ZSBleGVjdXRlIHBlcm1pc3Npb24uICBCeQorZGVmYXVsdCB0aGlzIHRhc2sgd2lsbCB1c2UgVW5peCBwZXJtaXNzaW9ucyBvZiA2NDQgZm9yIGZpbGVzIGFuZCA3NTUgZm9yIGRpcmVjdG9yaWVzLjwvcD4KIAotPHA+RWFybHkgdmVyc2lvbnMgb2YgdGFyIGRpZCBub3Qgc3VwcG9ydCBwYXRoIGxlbmd0aHMgZ3JlYXRlciB0aGFuIDEwMAotICBjaGFyYWN0ZXJzLiBPdmVyIHRpbWUgc2V2ZXJhbCBpbmNvbXBhdGlibGUgZXh0ZW5zaW9ucyBoYXZlIGJlZW4KLSAgZGV2ZWxvcGVkIHVudGlsIGEgbmV3IFBPU0lYIHN0YW5kYXJkIHdhcyBjcmVhdGVkIHRoYXQgYWRkZWQgc28KLSAgY2FsbGVkIFBBWCBleHRlbnNpb24gaGVhZGVycyAoYXMgdGhlIHBheCB1dGlsaXR5IGZpcnN0IGludHJvZHVjZWQKLSAgdGhlbSkgdGhhdCBhbW9uZyBhbm90aGVyIHRoaW5ncyBhZGRyZXNzZWQgZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxMDAKLSAgY2hhcmFjdGVycy4gIEFsbCBtb2Rlcm4gaW1wbGVtZW50YXRpb25zIG9mIHRhciBzdXBwb3J0IFBBWCBleHRlbnNpb24KLSAgaGVhZGVycy48L3A+Cis8cD5FYXJseSB2ZXJzaW9ucyBvZiA8a2JkPnRhcjwva2JkPiB1dGlsaXR5IGRpZCBub3Qgc3VwcG9ydCBwYXRocyBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycy4gT3ZlcgordGltZSBzZXZlcmFsIGluY29tcGF0aWJsZSBleHRlbnNpb25zIGhhdmUgYmVlbiBkZXZlbG9wZWQgdW50aWwgYSBuZXcgUE9TSVggc3RhbmRhcmQgd2FzIGNyZWF0ZWQgdGhhdAorYWRkZWQgc28gY2FsbGVkIFBBWCBleHRlbnNpb24gaGVhZGVycyAoYXMgdGhlIDxrYmQ+cGF4PC9rYmQ+IHV0aWxpdHkgZmlyc3QgaW50cm9kdWNlZCB0aGVtKSB0aGF0CithbW9uZyBhbm90aGVyIHRoaW5ncyBhZGRyZXNzZWQgZmlsZSBuYW1lcyBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycy4gIEFsbCBtb2Rlcm4gaW1wbGVtZW50YXRpb25zCitvZiA8a2JkPnRhcjwva2JkPiBzdXBwb3J0IFBBWCBleHRlbnNpb24gaGVhZGVycy48L3A+CiAKLTxwPkFudCdzIHRhciBzdXBwb3J0IHByZWRhdGVzIHRoZSBzdGFuZGFyZCB3aXRoIFBBWCBleHRlbnNpb24gaGVhZGVycywKLSAgaXQgc3VwcG9ydHMgZGlmZmVyZW50IGRpYWxlY3RzIHRoYXQgY2FuIGJlIGVuYWJsZWQgdXNpbmcgdGhlCi0gIDxpPmxvbmdmaWxlPC9pPiBhdHRyaWJ1dGUuCi1JZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0byA8Y29kZT5mYWlsPC9jb2RlPiwgYW55IGxvbmcgcGF0aHMgd2lsbAotY2F1c2UgdGhlIHRhciB0YXNrIHRvIGZhaWwuICBJZiB0aGUgbG9uZ2ZpbGUgYXR0cmlidXRlIGlzIHNldCB0bwotPGNvZGU+dHJ1bmNhdGU8L2NvZGU+LCBhbnkgbG9uZyBwYXRocyB3aWxsIGJlIHRydW5jYXRlZCB0byB0aGUgMTAwIGNoYXJhY3RlcgotbWF4aW11bSBsZW5ndGggcHJpb3IgdG8gYWRkaW5nIHRvIHRoZSBhcmNoaXZlLiBJZiB0aGUgdmFsdWUgb2YgdGhlIGxvbmdmaWxlCi1hdHRyaWJ1dGUgaXMgc2V0IHRvIDxjb2RlPm9taXQ8L2NvZGU+IHRoZW4gZmlsZXMgY29udGFpbmluZyBsb25nIHBhdGhzIHdpbGwgYmUKLW9taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIEVpdGhlciBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIGNhbiBiZQotdW50YXJyZWQgYnkgYW55IGNvbXBsaWFudCB2ZXJzaW9uIG9mIHRhci48L3A+Cis8cD5BbnQncyA8a2JkPnRhcjwva2JkPiBzdXBwb3J0IHByZWRhdGVzIHRoZSBzdGFuZGFyZCB3aXRoIFBBWCBleHRlbnNpb24gaGVhZGVycywgaXQgc3VwcG9ydHMKK2RpZmZlcmVudCBkaWFsZWN0cyB0aGF0IGNhbiBiZSBlbmFibGVkIHVzaW5nIHRoZSA8dmFyPmxvbmdmaWxlPC92YXI+IGF0dHJpYnV0ZS4gIElmCit0aGUgPHZhcj5sb25nZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPmZhaWw8L3E+LCBhbnkgbG9uZyBwYXRocyB3aWxsIGNhdXNlCit0aGUgPGNvZGU+dGFyPC9jb2RlPiB0YXNrIHRvIGZhaWwuICBJZiB0aGUgPHZhcj5sb25nZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPnRydW5jYXRlPC9xPiwKK2FueSBsb25nIHBhdGhzIHdpbGwgYmUgdHJ1bmNhdGVkIHRvIHRoZSAxMDAgY2hhcmFjdGVyIG1heGltdW0gbGVuZ3RoIHByaW9yIHRvIGFkZGluZyB0byB0aGUKK2FyY2hpdmUuIElmIHRoZSB2YWx1ZSBvZiB0aGUgPHZhcj5sb25nZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPm9taXQ8L3E+IHRoZW4gZmlsZXMKK2NvbnRhaW5pbmcgbG9uZyBwYXRocyB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgYXJjaGl2ZS4gIEVpdGhlciBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBhcmNoaXZlIGNhbgorYmUgdW50YXJyZWQgYnkgYW55IGNvbXBsaWFudCB2ZXJzaW9uIG9mIDxrYmQ+dGFyPC9rYmQ+LjwvcD4KIAotPHA+SWYgdGhlIGxvc3Mgb2YgcGF0aCBvciBmaWxlCi1pbmZvcm1hdGlvbiBpcyBub3QgYWNjZXB0YWJsZSwgYW5kIGl0IHJhcmVseSBpcywgbG9uZ2ZpbGUgbWF5IGJlIHNldCB0byB0aGUKLXZhbHVlIDxjb2RlPmdudTwvY29kZT4gb3IgPGNvZGU+cG9zaXg8L2NvZGU+LiAgV2l0aCA8Y29kZT5wb3NpeDwvY29kZT4KLSAgQW50IHdpbGwgYWRkIFBBWCBleHRlbnNpb24gaGVhZGVycywgd2l0aCA8Y29kZT5nbnU8L2NvZGU+IGl0IGFkZHMKLSAgR05VIHRhciBzcGVjaWZpYyBleHRlbnNpb25zIHRoYXQgbmV3ZXIgdmVyc2lvbnMgb2YgR05VIHRhciBjYWxsCi0gICJvbGRnbnUiLiAgR05VIHRhciBzdGlsbCBjcmVhdGVzIHRoZXNlIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCBidXQKLSAgc3VwcG9ydHMgUEFYIGV4dGVuc2lvbiBoZWFkZXJzIGFzIHdlbGwuICBFaXRoZXIgY2hvaWNlIHdpbGwgcHJvZHVjZQotICBhIHRhciBmaWxlIHdoaWNoCi1jYW4gaGF2ZSBhcmJpdHJhcnkgbGVuZ3RoIHBhdGhzLiBOb3RlIGhvd2V2ZXIsIHRoYXQgdGhlIHJlc3VsdGluZyBhcmNoaXZlIHdpbGwKLW9ubHkgYmUgYWJsZSB0byBiZSB1bnRhcnJlZCB3aXRoIHRhciB0b29scyB0aGF0IHN1cHBvcnQgdGhlIGNob3NlbiBmb3JtYXQuCis8cD5JZiB0aGUgbG9zcyBvZiBwYXRoIG9yIGZpbGUgaW5mb3JtYXRpb24gaXMgbm90IGFjY2VwdGFibGUsIGFuZCBpdCByYXJlbHkgaXMsIDx2YXI+bG9uZ2ZpbGU8L3Zhcj4KK21heSBiZSBzZXQgdG8gdGhlIHZhbHVlIDxxPmdudTwvcT4gb3IgPHE+cG9zaXg8L3E+LiAgV2l0aCA8cT5wb3NpeDwvcT4gQW50IHdpbGwgYWRkIFBBWCBleHRlbnNpb24KK2hlYWRlcnMsIHdpdGggPHE+Z251PC9xPiBpdCBhZGRzIEdOVSA8a2JkPnRhcjwva2JkPiBzcGVjaWZpYyBleHRlbnNpb25zIHRoYXQgbmV3ZXIgdmVyc2lvbnMgb2YKK0dOVSA8a2JkPnRhcjwva2JkPiBjYWxsIDxxPm9sZGdudTwvcT4uICBHTlUgPGtiZD50YXI8L2tiZD4gc3RpbGwgY3JlYXRlcyB0aGVzZSBleHRlbnNpb25zIGJ5IGRlZmF1bHQKK2J1dCBzdXBwb3J0cyBQQVggZXh0ZW5zaW9uIGhlYWRlcnMgYXMgd2VsbC4gIEVpdGhlciBjaG9pY2Ugd2lsbCBwcm9kdWNlIGEgdGFyIGZpbGUgd2hpY2ggY2FuIGhhdmUKK2FyYml0cmFyeSBsZW5ndGggcGF0aHMuIE5vdGUgaG93ZXZlciwgdGhhdCB0aGUgcmVzdWx0aW5nIGFyY2hpdmUgd2lsbCBvbmx5IGJlIGFibGUgdG8gYmUgdW50YXJyZWQKK3dpdGggPGtiZD50YXI8L2tiZD4gdG9vbHMgdGhhdCBzdXBwb3J0IHRoZSBjaG9zZW4gZm9ybWF0LjwvcD4KIAotPHA+VGhlIGRlZmF1bHQgZm9yIHRoZSBsb25nZmlsZQotYXR0cmlidXRlIGlzIDxjb2RlPndhcm48L2NvZGU+IHdoaWNoIGJlaGF2ZXMganVzdCBsaWtlIHRoZSBnbnUgb3B0aW9uIGV4Y2VwdAotdGhhdCBpdCBwcm9kdWNlcyBhIHdhcm5pbmcgZm9yIGVhY2ggZmlsZSBwYXRoIGVuY291bnRlcmVkIHRoYXQgZG9lcyBub3QgbWF0Y2gKLXRoZSBsaW1pdC4gIEl0IHVzZXMgZ251IHJhdGhlciB0aGFuIHBvc2l4IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICByZWFzb25zLjwvcD4KKzxwPlRoZSBkZWZhdWx0IGZvciB0aGUgPHZhcj5sb25nZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgPHE+d2FybjwvcT4gd2hpY2ggYmVoYXZlcyBqdXN0IGxpa2UKK3RoZSA8cT5nbnU8L3E+IG9wdGlvbiBleGNlcHQgdGhhdCBpdCBwcm9kdWNlcyBhIHdhcm5pbmcgZm9yIGVhY2ggZmlsZXBhdGggZW5jb3VudGVyZWQgdGhhdCBkb2VzIG5vdAorbWF0Y2ggdGhlIGxpbWl0LiAgSXQgdXNlcyA8cT5nbnU8L3E+IHJhdGhlciB0aGFuIDxxPnBvc2l4PC9xPiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK3JlYXNvbnMuPC9wPgogCi08cD5UbyBhY2hpdmlldmUgYmVzdCBpbnRlcm9wZXJhYmlsaXR5IHlvdSBzaG91bGQgdXNlCi0gIGVpdGhlciA8Y29kZT5mYWlsPC9jb2RlPiBvciA8Y29kZT5wb3NpeDwvY29kZT4gZm9yIHRoZSBsb25nZmlsZSBhdHRyaWJ1dGUuPC9wPgorPHA+VG8gYWNoaWV2ZSBiZXN0IGludGVyb3BlcmFiaWxpdHkgeW91IHNob3VsZCB1c2UgZWl0aGVyIDxxPmZhaWw8L3E+IG9yIDxxPnBvc2l4PC9xPiBmb3IKK3RoZSA8dmFyPmxvbmdmaWxlPC92YXI+IGF0dHJpYnV0ZS48L3A+CiAKLTxwPlRoaXMgdGFzayBjYW4gcGVyZm9ybSBjb21wcmVzc2lvbiBieSBzZXR0aW5nIHRoZSBjb21wcmVzc2lvbiBhdHRyaWJ1dGUgdG8gImd6aXAiCi1vciAiYnppcDIiLjwvcD4KKzxwPlRoaXMgdGFzayBjYW4gcGVyZm9ybSBjb21wcmVzc2lvbiBieSBzZXR0aW5nIHRoZSA8dmFyPmNvbXByZXNzaW9uPC92YXI+IGF0dHJpYnV0ZQordG8gPHE+Z3ppcDwvcT4sIDxxPmJ6aXAyPC9xPiwgb3IgPHE+eHo8L3E+LjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgdGFyLWZpbGUgdG8gY3JlYXRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSB0YXIgZmlsZSB0byBjcmVhdGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gdGFyIHRoZSBmaWxlcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHRhciB0aGUgZmlsZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb25nZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EZXRlcm1pbmVzIGhvdyBsb25nIGZpbGVzICgmZ3Q7MTAwIGNoYXJzKSBhcmUgdG8gYmUKLSAgICAgICBoYW5kbGVkLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgJnF1b3Q7dHJ1bmNhdGUmcXVvdDssICZxdW90O2ZhaWwmcXVvdDssCi0gICAgICAgJnF1b3Q7d2FybiZxdW90OywgJnF1b3Q7b21pdCZxdW90OywgJnF1b3Q7Z251JnF1b3Q7IGFuZCAmcXVvdDtwb3NpeCZxdW90Oy4gIERlZmF1bHQgaXMKLSAgICAgICAmcXVvdDt3YXJuJnF1b3Q7LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmxvbmdmaWxlPC90ZD4KKyAgICA8dGQ+RGV0ZXJtaW5lcyBob3cgbG9uZyBmaWxlbmFtZXMgKCZndDsgMTAwIGNoYXJzKSBhcmUgdG8gYmUgaGFuZGxlZC4gIEFsbG93ZWQgdmFsdWVzCisgICAgICBhcmUgPHE+dHJ1bmNhdGU8L3E+LCA8cT5mYWlsPC9xPiwgPHE+d2FybjwvcT4sIDxxPm9taXQ8L3E+LCA8cT5nbnU8L3E+IGFuZCA8cT5wb3NpeDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+d2FybjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkLiBObyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IGV4Y2x1ZGVzIG9yIG5vbmUgaWYgPHZhcj5kZWZhdWx0ZXhjbHVkZXM8L3Zhcj4gaXMgPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICgmcXVvdDt5ZXMmcXVvdDsvJnF1b3Q7bm8mcXVvdDspLiBEZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdCAoPHE+eWVzfG5vPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzc2lvbiBtZXRob2QuICBBbGxvd2FibGUgdmFsdWVzIGFyZSAKLSAgICAgICAmcXVvdDtub25lJnF1b3Q7LCAmcXVvdDtnemlwJnF1b3Q7IGFuZCAmcXVvdDtiemlwMiZxdW90Oy4gIERlZmF1bHQgaXMKLSAgICAgICAmcXVvdDtub25lJnF1b3Q7LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbXByZXNzaW9uPC90ZD4KKyAgICA8dGQ+Y29tcHJlc3Npb24gbWV0aG9kLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgPHE+bm9uZTwvcT4sIDxxPmd6aXA8L3E+LCA8cT54ejwvcT4KKyAgICAgIGFuZCA8cT5iemlwMjwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bm9uZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCi0gICAgaW5zaWRlIHRoZSB0YXIgZmlsZS4gIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSB0aGUgPGEKLSAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi48YnIvPgotICAgIERlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjkuNTwvZW0+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBpbnNpZGUgdGhlIHRhciBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZQorICAgICAgdmFsdWVzIHNlZQorICAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIgorICAgICAgdGFyZ2V0PSJfdG9wIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi48YnIvPjxlbT5TaW5jZSBBbnQgMS45LjU8L2VtPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoMz5OZXN0ZWQgRWxlbWVudHM8L2gzPgorPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLVRoZSB0YXIgdGFzayBzdXBwb3J0cyBuZXN0ZWQgPGEKLWhyZWY9Ii4uL1R5cGVzL3RhcmZpbGVzZXQuaHRtbCI+dGFyZmlsZXNldDwvYT4gZWxlbWVudHMuIFRoZXNlIGFyZQotZXh0ZW5kZWQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0czwvYT4gd2hpY2gsCi1pbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQgZWxlbWVudHMsIHN1cHBvcnQgb25lIGFkZGl0aW9uYWwKLWF0dHJpYnV0ZXMKKzxwPlRoZSB0YXNrIHN1cHBvcnRzIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy90YXJmaWxlc2V0Lmh0bWwiPnRhcmZpbGVzZXQ8L2E+IGVsZW1lbnRzLiBUaGVzZQorYXJlIGV4dGVuZGVkIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldHM8L2E+IHdoaWNoLCBpbiBhZGRpdGlvbiB0byB0aGUgc3RhbmRhcmQKK2VsZW1lbnRzLCBzdXBwb3J0IG9uZSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXM8L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlc2VydmVMZWFkaW5nU2xhc2hlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgd2hldGhlciBsZWFkaW5nIGAvJ3Mgc2hvdWxkCi0gICAgYmUgcHJlc2VydmVkIGluIHRoZSBmaWxlIG5hbWVzLiBEZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5wcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgbGVhZGluZyA8cT4vPC9xPiBzaG91bGQgYmUgcHJlc2VydmVkIGluIHRoZSBmaWxlIG5hbWVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+YW55IG90aGVyIHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgotPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UKLUNvbGxlY3Rpb248L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgZ3JvdXBzIG9mIGZpbGVzIHRvIGFyY2hpdmUuPC9wPgotPHA+UHJpb3IgdG8gQXBhY2hlIEFudCAxLjcgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGhhcyBiZWVuCi1zdXBwb3J0ZWQgYXMgYSBuZXN0ZWQgZWxlbWVudC48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4gYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3Vwcworb2YgZmlsZXMgdG8gYXJjaGl2ZS48L3A+Cis8cD5QcmlvciB0byBBcGFjaGUgQW50IDEuNyBvbmx5IDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gaGFzIGJlZW4gc3VwcG9ydGVkIGFzIGEgbmVzdGVkCitlbGVtZW50LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KKworPHA+VGFyIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IGludG8gYSBmaWxlCitjYWxsZWQgPHNhbXA+bWFudWFsLnRhcjwvc2FtcD4gaW4gdGhlIDxzYW1wPiR7ZGlzdH08L3NhbXA+IGRpcmVjdG9yeSwgdGhlbiBhcHBseQordGhlIDxjb2RlPmd6aXA8L2NvZGU+IHRhc2sgdG8gY29tcHJlc3MgaXQuPC9wPgorCiA8cHJlPgogJmx0O3RhciBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC50YXImcXVvdDsgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKICZsdDtnemlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhci5neiZxdW90OyBzcmM9JnF1b3Q7JHtkaXN0fS9tYW51YWwudGFyJnF1b3Q7LyZndDs8L3ByZT4KLTxwPnRhcnMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byBhIGZpbGUgY2FsbGVkIDxjb2RlPm1hbnVhbC50YXI8L2NvZGU+Ci1pbiB0aGUgPGNvZGU+JHtkaXN0fTwvY29kZT4gIGRpcmVjdG9yeSwgdGhlbiBhcHBsaWVzIHRoZSBnemlwIHRhc2sgdG8gY29tcHJlc3MKLWl0LjwvcD4KKworPHA+VGFyIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5IGludG8gYSBmaWxlCitjYWxsZWQgPHNhbXA+bWFudWFsLnRhcjwvc2FtcD4gaW4gdGhlIDxzYW1wPiR7ZGlzdH08L3NhbXA+IGRpcmVjdG9yeS4gRmlsZXMgaW4gdGhlCitkaXJlY3RvcnkgPHNhbXA+bXlkb2NzPC9zYW1wPiwgb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSA8c2FtcD50b2RvLmh0bWw8L3NhbXA+IGFyZSBleGNsdWRlZC48L3A+CiAKIDxwcmU+CiAmbHQ7dGFyIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnRhciZxdW90OwogICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKLSAgICAgZXhjbHVkZXM9JnF1b3Q7bXlkb2NzLyoqLCAqKi90b2RvLmh0bWwmcXVvdDsKLS8mZ3Q7PC9wcmU+Ci08cD50YXJzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZCA8Y29kZT5tYW51YWwudGFyPC9jb2RlPgotaW4gdGhlIDxjb2RlPiR7ZGlzdH08L2NvZGU+IGRpcmVjdG9yeS4gRmlsZXMgaW4gdGhlIGRpcmVjdG9yeSA8Y29kZT5teWRvY3M8L2NvZGU+LAotb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSA8Y29kZT50b2RvLmh0bWw8L2NvZGU+IGFyZSBleGNsdWRlZC48L3A+CisgICAgIGV4Y2x1ZGVzPSZxdW90O215ZG9jcy8qKiwgKiovdG9kby5odG1sJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+V3JpdGUgdGhlIGZpbGUgPHNhbXA+ZG9jcy9yZWFkbWUudHh0PC9zYW1wPiBhcyA8c2FtcD4vdXNyL2RvYy9hbnQvUkVBRE1FPC9zYW1wPiBpbnRvIHRoZQorYXJjaGl2ZS4gQWxsIDxzYW1wPiouaHRtbDwvc2FtcD4gZmlsZXMgaW4gdGhlIDxzYW1wPmRvY3M8L3NhbXA+IGRpcmVjdG9yeSBhcmUgcHJlZml4ZWQKK2J5IDxzYW1wPi91c3IvZG9jL2FudDwvc2FtcD4sIHNvIGZvciBleGFtcGxlIDxzYW1wPmRvY3MvaW5kZXguaHRtbDwvc2FtcD4gaXMgd3JpdHRlbgorYXMgPHNhbXA+L3Vzci9kb2MvYW50L2luZGV4Lmh0bWw8L3NhbXA+IHRvIHRoZSBhcmNoaXZlLjwvcD4KIAogPHByZT4KICZsdDt0YXIgZGVzdGZpbGU9JnF1b3Q7JHtiYXNlZGlyfS9kb2NzLnRhciZxdW90OyZndDsKQEAgLTIxNSwxNCArMjAwLDExIEBACiAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqLmh0bWwmcXVvdDsvJmd0OwogICAmbHQ7L3RhcmZpbGVzZXQmZ3Q7CiAmbHQ7L3RhciZndDs8L3ByZT4KLTxwPgotICBXcml0ZXMgdGhlIGZpbGUgPGNvZGU+ZG9jcy9yZWFkbWUudHh0PC9jb2RlPiBhcwotICA8Y29kZT4vdXNyL2RvYy9hbnQvUkVBRE1FPC9jb2RlPiBpbnRvIHRoZSBhcmNoaXZlLiBBbGwKLSAgPGNvZGU+Ki5odG1sPC9jb2RlPiBmaWxlcyBpbiB0aGUgPGNvZGU+ZG9jczwvY29kZT4gZGlyZWN0b3J5IGFyZQotICBwcmVmaXhlZCBieSA8Y29kZT4vdXNyL2RvYy9hbnQ8L2NvZGU+LCBzbyBmb3IgZXhhbXBsZQotICA8Y29kZT5kb2NzL2luZGV4Lmh0bWw8L2NvZGU+IGlzIHdyaXR0ZW4gYXMKLSAgPGNvZGU+L3Vzci9kb2MvYW50L2luZGV4Lmh0bWw8L2NvZGU+IHRvIHRoZSBhcmNoaXZlLgotPC9wPgorCis8cD5CdWlsZCBhIHRhciB3aGljaCB1c2VzIHRoZSBHTlUgZXh0ZW5zaW9ucyBmb3IgbG9uZyBwYXRocyB3aGVyZSBzb21lIGZpbGVzIG5lZWQgdG8gYmUgbWFya2VkIGFzCitleGVjdXRhYmxlIChtb2RlIDc1NSkgYW5kIHRoZSByZXN0IHVzZSB0aGUgZGVmYXVsdCBtb2RlIChyZWFkLXdyaXRlIGJ5IG93bmVyKS4gVGhlIGZpcnN0IGZpbGVzZXQKK3NlbGVjdHMganVzdCB0aGUgZXhlY3V0YWJsZSBmaWxlcy4gVGhlIHNlY29uZCBmaWxlc2V0IG11c3QgZXhjbHVkZSB0aGUgZXhlY3V0YWJsZSBmaWxlcyBhbmQgaW5jbHVkZQorYWxsIG90aGVycy48L3A+CiAKIDxwcmU+CiAmbHQ7dGFyIGxvbmdmaWxlPSZxdW90O2dudSZxdW90OwpAQCAtMjM2LDQ2ICsyMTgsMzAgQEAKICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyR7ZGlzdC5uYW1lfS9ib290c3RyYXAuc2gmcXVvdDsvJmd0OwogICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7JHtkaXN0Lm5hbWV9L2J1aWxkLnNoJnF1b3Q7LyZndDsKICAgJmx0Oy90YXJmaWxlc2V0Jmd0OwotJmx0Oy90YXImZ3Q7Ci08L3ByZT4KLTxwPlRoaXMgZXhhbXBsZSBzaG93cyBidWlsZGluZyBhIHRhciB3aGljaCB1c2VzIHRoZSBHTlUgZXh0ZW5zaW9ucyBmb3IgbG9uZyBwYXRocyBhbmQKLXdoZXJlIHNvbWUgZmlsZXMgbmVlZCB0byBiZSBtYXJrZWQgYXMgZXhlY3V0YWJsZSAobW9kZSA3NTUpCi1hbmQgdGhlIHJlc3QgYXJlIHVzZSB0aGUgZGVmYXVsdCBtb2RlIChyZWFkLXdyaXRlIGJ5IG93bmVyKS4gVGhlIGZpcnN0Ci1maWxlc2V0IHNlbGVjdHMganVzdCB0aGUgZXhlY3V0YWJsZSBmaWxlcy4gVGhlIHNlY29uZCBmaWxlc2V0IG11c3QgZXhjbHVkZQotdGhlIGV4ZWN1dGFibGUgZmlsZXMgYW5kIGluY2x1ZGUgYWxsIG90aGVycy4gPC9wPgorJmx0Oy90YXImZ3Q7PC9wcmU+CiAKKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhlIDxjb2RlPnRhcjwvY29kZT4gdGFzayBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGZpbGUgaXMgb25seSBzZWxlY3RlZCBieQorb25lIHJlc291cmNlIGNvbGxlY3Rpb24uIElmIHRoZSBzYW1lIGZpbGUgaXMgc2VsZWN0ZWQgYnkgbW9yZSB0aGFuIG9uZSBjb2xsZWN0aW9uLCBpdCB3aWxsIGJlCitpbmNsdWRlZCBpbiB0aGUgdGFyIGZpbGUgdHdpY2UsIHdpdGggdGhlIHNhbWUgcGF0aC48L3A+CiAKKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhlIHBhdHRlcm5zIGluIHRoZSA8Y29kZT5pbmNsdWRlPC9jb2RlPiBhbmQgPGNvZGU+ZXhjbHVkZTwvY29kZT4gZWxlbWVudHMKK2FyZSBjb25zaWRlcmVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBjb3JyZXNwb25kaW5nIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSBhcyB3aXRoIGFsbCBvdGhlcgorZmlsZXNldHMuICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgPHNhbXA+JHtkaXN0Lm5hbWV9PC9zYW1wPiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCwgYnV0IGEgc2ltcGxlCituYW1lIG9mIGEgZGlyZWN0b3J5LCBzbyA8c2FtcD4ke2Rpc3QubmFtZX08L3NhbXA+IGlzIGEgdmFsaWQgcGF0aCByZWxhdGl2ZQordG8gPHNhbXA+JHtkaXN0Lm5hbWV9Ly4uPC9zYW1wPi48L3A+CiAKLTxwPjxzdHJvbmc+Tm90ZTogPC9zdHJvbmc+IFRoZSB0YXIgdGFzayBkb2VzIG5vdCBlbnN1cmUgdGhhdCBhIGZpbGUgaXMgb25seSBzZWxlY3RlZAotYnkgb25lIHJlc291cmNlIGNvbGxlY3Rpb24uIElmIHRoZSBzYW1lIGZpbGUgaXMgc2VsZWN0ZWQgYnkgbW9yZSB0aGFuIG9uZSBjb2xsZWN0aW9uLCBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQotdGFyIGZpbGUgdHdpY2UsIHdpdGggdGhlIHNhbWUgcGF0aC48L3A+Ci0KLTxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlIHBhdHRlcm5zIGluIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlCi1lbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSByZWxhdGl2ZSB0byB0aGUgY29ycmVzcG9uZGluZyBkaXIKLWF0dHJpYnV0ZSBhcyB3aXRoIGFsbCBvdGhlciBmaWxlc2V0cy4gIEluIHRoZSBleGFtcGxlIGFib3ZlLAotPGNvZGU+JHtkaXN0Lm5hbWV9PC9jb2RlPiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCwgYnV0IGEgc2ltcGxlIG5hbWUKLW9mIGEgZGlyZWN0b3J5LCBzbyA8Y29kZT4ke2Rpc3QubmFtZX08L2NvZGU+IGlzIGEgdmFsaWQgcGF0aCByZWxhdGl2ZQotdG8gPGNvZGU+JHtkaXN0Lm5hbWV9Ly4uPC9jb2RlPi48L3A+Ci0KKzxwPlJlLXBhY2thZ2UgYSBaSVAgYXJjaGl2ZSBhcyBhIEdaaXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZS4gIElmIFVuaXggZmlsZSBwZXJtaXNzaW9ucyBoYXZlIGJlZW4KK3N0b3JlZCBhcyBwYXJ0IG9mIHRoZSBaSVAgZmlsZSwgdGhleSB3aWxsIGJlIHJldGFpbmVkIGluIHRoZSByZXN1bHRpbmcgdGFyIGFyY2hpdmUuPC9wPgogCiA8cHJlPgogJmx0O3RhciBkZXN0ZmlsZT0icmVsZWFzZS50YXIuZ3oiIGNvbXByZXNzaW9uPSJnemlwIiZndDsKICAgJmx0O3ppcGZpbGVzZXQgc3JjPSJyZWxlYXNlLnppcCIvJmd0OwotJmx0Oy90YXImZ3Q7Ci08L3ByZT4KLTxwPlJlLXBhY2thZ2VzIGEgWklQIGFyY2hpdmUgYXMgYSBHWmlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUuICBJZgotVW5peCBmaWxlIHBlcm1pc3Npb25zIGhhdmUgYmVlbiBzdG9yZWQgYXMgcGFydCBvZiB0aGUgWklQIGZpbGUsIHRoZXkKLXdpbGwgYmUgcmV0YWluZWQgaW4gdGhlIHJlc3VsdGluZyB0YXIgYXJjaGl2ZS48L3A+CismbHQ7L3RhciZndDs8L3ByZT4KIAotCi08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+Ci0gIFBsZWFzZSBub3RlIHRoZSB0YXIgdGFzayBjcmVhdGVzIGEgdGFyIGZpbGUsIGl0IGRvZXMgbm90IGFwcGVuZCAKLSAgdG8gYW4gZXhpc3RpbmcgdGFyIGZpbGUuIFRoZSBleGlzdGluZyB0YXIgZmlsZSBpcyByZXBsYWNlZCBpbnN0ZWFkLgotICBBcyB3aXRoIG1vc3QgdGFza3MgaW4gQW50LCB0aGUgdGFzayBvbmx5IHRha2VzIGFjdGlvbiBpZiB0aGUgb3V0cHV0Ci0gIGZpbGUgKHRoZSB0YXIgZmlsZSBpbiB0aGlzIGNhc2UpIGlzIG9sZGVyIHRoYW4gdGhlIGlucHV0IGZpbGVzLCBvcgotICBpZiB0aGUgb3V0cHV0IGZpbGUgZG9lcyBub3QgZXhpc3QuCi08L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IFBsZWFzZSBub3RlIHRoZSA8Y29kZT50YXI8L2NvZGU+IHRhc2sgY3JlYXRlcyBhIHRhciBmaWxlLCBpdCBkb2VzIG5vdAorYXBwZW5kIHRvIGFuIGV4aXN0aW5nIHRhciBmaWxlLiBUaGUgZXhpc3RpbmcgdGFyIGZpbGUgaXMgcmVwbGFjZWQgaW5zdGVhZC4gIEFzIHdpdGggbW9zdCB0YXNrcyBpbgorQW50LCB0aGUgdGFzayBvbmx5IHRha2VzIGFjdGlvbiBpZiB0aGUgb3V0cHV0IGZpbGUgKHRoZSB0YXIgZmlsZSBpbiB0aGlzIGNhc2UpIGlzIG9sZGVyIHRoYW4gdGhlCitpbnB1dCBmaWxlcywgb3IgaWYgdGhlIG91dHB1dCBmaWxlIGRvZXMgbm90IGV4aXN0LjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvdGFza2RlZi5odG1sIGIvbWFudWFsL1Rhc2tzL3Rhc2tkZWYuaHRtbAppbmRleCA0ZjZmNWQyLi5mZDJmYTBiIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvdGFza2RlZi5odG1sCisrKyBiL21hbnVhbC9UYXNrcy90YXNrZGVmLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzMSArMTUsMzEgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlRhc2tEZWYgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0idGFza2RlZiI+VGFza2RlZjwvYT48L2gyPgotPGgzPkRlc2NyaXB0aW9uPC9oMz4KLSAgPHA+QWRkcyBhIHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LCBzdWNoIHRoYXQgdGhpcyBuZXcgdGFzayBjYW4gYmUKLSAgICB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuPC9wPgotICA8cD5UaGlzIHRhc2sgaXMgYSBmb3JtIG9mIDxhIGhyZWY9InR5cGVkZWYuaHRtbCI+VHlwZWRlZjwvYT4gd2l0aCB0aGUKLSAgICBhdHRyaWJ1dGVzICJhZGFwdGVyIiBhbmQgImFkYXB0dG8iIHNldCB0byB0aGUgdmFsdWVzIAotICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlciIgYW5kICJvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrIgotICAgIHJlc3BlY3RpdmVseS4gIEFueXRoaW5nIHNhaWQgaW4gdGhlIDxhIGhyZWY9InR5cGVkZWYuaHRtbCI+bWFudWFsCi0gICAgICBwYWdlIG9mIHR5cGVkZWY8L2E+IGFwcGxpZXMgdG8gdGFza2RlZiBhcyB3ZWxsLjwvcD4KLTxoMz5FeGFtcGxlczwvaDM+Ci08cHJlPiAgJmx0O3Rhc2tkZWYgbmFtZT0mcXVvdDtteWphdmFkb2MmcXVvdDsgY2xhc3NuYW1lPSZxdW90O2NvbS5teWRvbWFpbi5KYXZhZG9jVGFzayZxdW90Oy8mZ3Q7PC9wcmU+Ci08cD5tYWtlcyBhIHRhc2sgY2FsbGVkIDxjb2RlPm15amF2YWRvYzwvY29kZT4gYXZhaWxhYmxlIHRvIEFwYWNoZSBBbnQuIFRoZSBjbGFzcyA8Y29kZT5jb20ubXlkb21haW4uSmF2YWRvY1Rhc2s8L2NvZGU+Ci1pbXBsZW1lbnRzIHRoZSB0YXNrLjwvcD4KKzxoMiBpZD0idGFza2RlZiI+VGFza2RlZjwvaDI+CiAKKzxoMz5EZXNjcmlwdGlvbjwvaDM+Cis8cD5BZGRzIGEgdGFzayBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2ggdGhhdCB0aGlzIG5ldyB0YXNrIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50Citwcm9qZWN0LjwvcD4KKzxwPlRoaXMgdGFzayBpcyBhIGZvcm0gb2YgPGEgaHJlZj0idHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPiB3aXRoIHRoZSBhdHRyaWJ1dGVzIDx2YXI+YWRhcHRlcjwvdmFyPgorYW5kIDx2YXI+YWRhcHR0bzwvdmFyPiBzZXQgdG8gdGhlIHZhbHVlcyA8cT5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlcjwvcT4KK2FuZCA8cT5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrPC9xPiByZXNwZWN0aXZlbHkuIEFueXRoaW5nIHNhaWQgaW4KK3RoZSA8YSBocmVmPSJ0eXBlZGVmLmh0bWwiPm1hbnVhbCBwYWdlIG9mIHR5cGVkZWY8L2E+IGFwcGxpZXMgdG8gPGNvZGU+dGFza2RlZjwvY29kZT4gYXMgd2VsbC48L3A+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPk1ha2UgYSB0YXNrIGNhbGxlZCA8Y29kZT5teWphdmFkb2M8L2NvZGU+IGF2YWlsYWJsZSB0byBBcGFjaGUgQW50LiBUaGUKK2NsYXNzIDxjb2RlPmNvbS5teWRvbWFpbi5KYXZhZG9jVGFzazwvY29kZT4gaW1wbGVtZW50cyB0aGUgdGFzay48L3A+CisKKzxwcmU+Jmx0O3Rhc2tkZWYgbmFtZT0mcXVvdDtteWphdmFkb2MmcXVvdDsgY2xhc3NuYW1lPSZxdW90O2NvbS5teWRvbWFpbi5KYXZhZG9jVGFzayZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3RlbG5ldC5odG1sIGIvbWFudWFsL1Rhc2tzL3RlbG5ldC5odG1sCmluZGV4IDBhYzY1YjMuLmNjNGViODggMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy90ZWxuZXQuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdGVsbmV0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDMgKzE1LDk1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5UZWxuZXQgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0idGVsbmV0Ij5UZWxuZXQ8L2E+PC9oMj4KKzxoMiBpZD0idGVsbmV0Ij5UZWxuZXQ8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgdGVsbmV0IHNlc3Npb24uIFRoZSB0YXNrIHVzZXMgCi1uZXN0ZWQgPHR0PiZsdDtyZWFkJmd0OzwvdHQ+IHRvIGluZGljYXRlIHN0cmluZ3MgdG8gd2FpdCBmb3IsIGFuZAotPHR0PiZsdDt3cml0ZSZndDs8L3R0PiB0YWdzIHRvIHNwZWNpZnkgdGV4dCB0byBzZW5kLiAgCis8cD5UYXNrIHRvIGF1dG9tYXRlIGEgcmVtb3RlIHRlbG5ldCBzZXNzaW9uLiBUaGUgdGFzayB1c2VzIG5lc3RlZCA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IHRvCitpbmRpY2F0ZSBzdHJpbmdzIHRvIHdhaXQgZm9yLCBhbmQgPGNvZGU+Jmx0O3dyaXRlJmd0OzwvY29kZT4gdGFncyB0byBzcGVjaWZ5IHRleHQgdG8gc2VuZC48L3A+CiAKLTxwPklmIHlvdSBkbyBzcGVjaWZ5IGEgdXNlcmlkIGFuZCBwYXNzd29yZCwgdGhlIHN5c3RlbSB3aWxsIAotYXNzdW1lIGEgY29tbW9uIHVuaXggcHJvbXB0IHRvIHdhaXQgb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGVhc2lseSBvdmVyLXJpZGRlbi48L3A+Ci08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uCi1TZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Cis8cD5JZiB5b3UgZG8gc3BlY2lmeSBhIHVzZXJpZCBhbmQgcGFzc3dvcmQsIHRoZSBzeXN0ZW0gd2lsbCBhc3N1bWUgYSBjb21tb24gVW5peCBwcm9tcHQgdG8gd2FpdAorb24uIFRoaXMgYmVoYXZpb3IgY2FuIGJlIGVhc2lseSBvdmVycmlkZGVuLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyB0YXNrIGRlcGVuZHMgb24gZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudAorZGlzdHJpYnV0aW9uLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKK2luZm9ybWF0aW9uLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnVzZXJpZDwvdGQ+Ci0gICAgIDx0ZD50aGUgbG9naW4gaWQgdG8gdXNlIG9uIHRoZSB0ZWxuZXQgc2VydmVyLjwvdGQ+Ci0gICAgIDx0ZD5Pbmx5IGlmIHBhc3N3b3JkIGlzIHNwZWNpZmllZDwvdGQ+CisgICAgPHRkPnVzZXJpZDwvdGQ+CisgICAgPHRkPnRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHRlbG5ldCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+T25seSBpZiA8dmFyPnBhc3N3b3JkPC92YXI+IGlzIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnBhc3N3b3JkPC90ZD4KLSAgICAgPHRkPnRoZSBsb2dpbiBwYXNzd29yZCB0byB1c2Ugb24gdGhlIHRlbG5ldCBzZXJ2ZXIuPC90ZD4KLSAgICAgPHRkPk9ubHkgaWYgdXNlcmlkIGlzIHNwZWNpZmllZDwvdGQ+CisgICAgPHRkPnBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+dGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZSBvbiB0aGUgdGVsbmV0IHNlcnZlci48L3RkPgorICAgIDx0ZD5Pbmx5IGlmIDx2YXI+dXNlcmlkPC92YXI+IGlzIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnNlcnZlcjwvdGQ+Ci0gICAgIDx0ZD50aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIHRlbG5ldCBzZXJ2ZXIuPC90ZD4KLSAgICAgPHRkPlllczwvdGQ+CisgICAgPHRkPnNlcnZlcjwvdGQ+CisgICAgPHRkPnRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgdGVsbmV0IHNlcnZlci48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5wb3J0PC90ZD4KLSAgICAgPHRkPnRoZSBwb3J0IG51bWJlciBvZiB0aGUgcmVtb3RlIHRlbG5ldCBzZXJ2ZXIuIERlZmF1bHRzIHRvIHBvcnQgMjMuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+cG9ydDwvdGQ+CisgICAgPHRkPnRoZSBwb3J0IG51bWJlciBvZiB0aGUgcmVtb3RlIHRlbG5ldCBzZXJ2ZXIuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjIzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmluaXRpYWxDUjwvdGQ+Ci0gICAgIDx0ZD5zZW5kIGEgY3IgYWZ0ZXIgY29ubmVjdGluZyAoJnF1b3Q7eWVzJnF1b3Q7KS4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+aW5pdGlhbENSPC90ZD4KKyAgICA8dGQ+c2VuZCBhIGNyIGFmdGVyIGNvbm5lY3RpbmcgaWYgPHE+eWVzPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+bm88L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+dGltZW91dDwvdGQ+Ci0gICAgIDx0ZD5zZXQgYSBkZWZhdWx0IHRpbWVvdXQgdG8gd2FpdCBmb3IgYSByZXNwb25zZS4gU3BlY2lmaWVkIGluIHNlY29uZHMuIERlZmF1bHQgaXMgbm8gdGltZW91dC48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD50aW1lb3V0PC90ZD4KKyAgICA8dGQ+c2V0IGEgZGVmYXVsdCB0aW1lb3V0IHRvIHdhaXQgZm9yIGEgcmVzcG9uc2UuIFNwZWNpZmllZCBpbiBzZWNvbmRzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIG5vIHRpbWVvdXQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgotVGhlIGNvbW1hbmRzIHRvIHNlbmQgdG8gdGhlIHNlcnZlciwgYW5kIHJlc3BvbnNlcyB0byB3YWl0IGZvciwgYXJlCi1kZXNjcmliZWQgYXMgbmVzdGVkIGVsZW1lbnRzLiAgCis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxwPlRoZSBjb21tYW5kcyB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIsIGFuZCByZXNwb25zZXMgdG8gd2FpdCBmb3IsIGFyZSBkZXNjcmliZWQgYXMgbmVzdGVkCitlbGVtZW50cy48L3A+CiAKIDxoND5yZWFkPC9oND4KIAotPHA+ZGVjbGFyZSAoYXMgYSB0ZXh0IGNoaWxkIG9mIHRoaXMgZWxlbWVudCkgYSBzdHJpbmcgdG8gd2FpdCBmb3IuCi1UaGUgZWxlbWVudCBzdXBwb3J0cyB0aGUgdGltZW91dCBhdHRyaWJ1dGUsIHdoaWNoIG92ZXJyaWRlcyBhbnkKLXRpbWVvdXQgc3BlY2lmaWVkIGZvciB0aGUgdGFzayBhcyBhIHdob2xlLiBJdCBhbHNvIGhhcyBhIDx0dD5zdHJpbmc8L3R0PgotYXR0cmlidXRlLCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIHRoZSBzdHJpbmcgYXMgCi1hIHRleHQgZWxlbWVudC4KLTwvcD4KLTxpPkFsd2F5cyBkZWNsYXJlIGFuIG9wZW5pbmcgYW5kIGNsb3NpbmcKLTxjb2RlPiZsdDtyZWFkJmd0OzwvY29kZT4gZWxlbWVudCB0byBlbnN1cmUgdGhhdCBzdGF0ZW1lbnRzIGFyZSBub3Qgc2VudCBiZWZvcmUKLXRoZSBjb25uZWN0aW9uIGlzIHJlYWR5LCBhbmQgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBub3QgYnJva2VuIGJlZm9yZQotdGhlIGZpbmFsIGNvbW1hbmQgaGFzIGNvbXBsZXRlZC4KLTwvaT4KKzxwPmRlY2xhcmUgKGFzIGEgdGV4dCBjaGlsZCBvZiB0aGlzIGVsZW1lbnQpIGEgc3RyaW5nIHRvIHdhaXQgZm9yLiAgVGhlIGVsZW1lbnQgc3VwcG9ydHMKK3RoZSA8dmFyPnRpbWVvdXQ8L3Zhcj4gYXR0cmlidXRlLCB3aGljaCBvdmVycmlkZXMgYW55IHRpbWVvdXQgc3BlY2lmaWVkIGZvciB0aGUgdGFzayBhcyBhIHdob2xlLiBJdAorYWxzbyBoYXMgYSA8dmFyPnN0cmluZzwvdmFyPiBhdHRyaWJ1dGUsIHdoaWNoIGlzIGFuIGFsdGVybmF0aXZlIHRvIHNwZWNpZnlpbmcgdGhlIHN0cmluZyBhcyBhIHRleHQKK2VsZW1lbnQuPC9wPgorPHA+PGVtPkFsd2F5cyBkZWNsYXJlIGFuIG9wZW5pbmcgYW5kIGNsb3NpbmcgPGNvZGU+Jmx0O3JlYWQmZ3Q7PC9jb2RlPiBlbGVtZW50IHRvIGVuc3VyZSB0aGF0CitzdGF0ZW1lbnRzIGFyZSBub3Qgc2VudCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHksIGFuZCB0aGF0IHRoZSBjb25uZWN0aW9uIGlzIG5vdCBicm9rZW4gYmVmb3JlCit0aGUgZmluYWwgY29tbWFuZCBoYXMgY29tcGxldGVkLjwvZW0+PC9wPgorCiA8aDQ+d3JpdGU8L2g0PgorPHA+ZGVzY3JpYmVzIHRoZSB0ZXh0IHRvIHNlbmQgdG8gdGhlIHNlcnZlci4gVGhlIDx2YXI+ZWNobzwvdmFyPiBib29sZWFuIGF0dHJpYnV0ZSBjb250cm9scyB3aGV0aGVyCit0aGUgc3RyaW5nIGlzIGVjaG9lZCB0byB0aGUgbG9jYWwgbG9nOyB0aGlzIGlzIDxxPnRydWU8L3E+IGJ5IGRlZmF1bHQuPC9wPgogCi08cD5kZXNjcmliZXMgdGhlIHRleHQgdG8gc2VuZCB0byB0aGUgc2VydmVyLiBUaGUgPHR0PmVjaG88L3R0PiBib29sZWFuCi1hdHRyaWJ1dGUgY29udHJvbHMgd2hldGhlciB0aGUgc3RyaW5nIGlzIGVjaG9lZCB0byB0aGUgbG9jYWwgbG9nOyAKLXRoaXMgaXMgInRydWUiIGJ5IGRlZmF1bHQKLTwvcD4KIDxoMz5FeGFtcGxlczwvaDM+Ci1BIHNpbXBsZSBleGFtcGxlIG9mIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgYW5kIHJ1bm5pbmcgYSBjb21tYW5kLiAgVGhpcyBhc3N1bWVzCi0gYSBwcm9tcHQgb2YgJnF1b3Q7b2dpbjomcXVvdDsgZm9yIHRoZSB1c2VyaWQsIGFuZCBhIHByb21wdCBvZiAmcXVvdDthc3N3b3JkOiZxdW90OwotIGZvciB0aGUgcGFzc3dvcmQuCis8cD5BIHNpbXBsZSBleGFtcGxlIG9mIGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIgYW5kIHJ1bm5pbmcgYSBjb21tYW5kLiAgVGhpcyBhc3N1bWVzIGEgcHJvbXB0CitvZiA8cT5vZ2luOjwvcT4gZm9yIHRoZSB1c2VyaWQsIGFuZCBhIHByb21wdCBvZiA8cT5hc3N3b3JkOjwvcT4gZm9yIHRoZSBwYXNzd29yZC48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3RlbG5ldCB1c2VyaWQ9JnF1b3Q7Ym9iJnF1b3Q7IHBhc3N3b3JkPSZxdW90O2JhZHBhc3MmcXVvdDsgc2VydmVyPSZxdW90O2xvY2FsaG9zdCZxdW90OyZndDsKICAgICZsdDtyZWFkJmd0Oy9ob21lL2JvYiZsdDsvcmVhZCZndDsKICAgICZsdDt3cml0ZSZndDtscyZsdDsvd3JpdGUmZ3Q7CiAgICAmbHQ7cmVhZCBzdHJpbmc9JnF1b3Q7L2hvbWUvYm9iJnF1b3Q7LyZndDsKLSZsdDsvdGVsbmV0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90ZWxuZXQmZ3Q7PC9wcmU+CiAKLVRoaXMgdGFzayBjYW4gYmUgcmV3cml0dGVuIGFzOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoaXMgdGFzayBjYW4gYmUgcmV3cml0dGVuIGFzOjwvcD4KKzxwcmU+CiAmbHQ7dGVsbmV0IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsmZ3Q7CiAgICAmbHQ7cmVhZCZndDtvZ2luOiZsdDsvcmVhZCZndDsKICAgICZsdDt3cml0ZSZndDtib2ImbHQ7L3dyaXRlJmd0OwpAQCAtMTE5LDM3ICsxMTIsMzIgQEAKICAgICZsdDtyZWFkJmd0Oy9ob21lL2JvYiZsdDsvcmVhZCZndDsKICAgICZsdDt3cml0ZSZndDtscyZsdDsvd3JpdGUmZ3Q7CiAgICAmbHQ7cmVhZCZndDsvaG9tZS9ib2ImbHQ7L3JlYWQmZ3Q7Ci0mbHQ7L3RlbG5ldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvdGVsbmV0Jmd0OzwvcHJlPgogCi1BIHRpbWVvdXQgY2FuIGJlIHNwZWNpZmllZCBhdCB0aGUgPGNvZGU+Jmx0O3RlbG5ldCZndDs8L2NvZGU+IGxldmVsIG9yIGF0IHRoZSA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGxldmVsLiAKLVRoaXMgd2lsbCBjb25uZWN0LCBpc3N1ZSBhIHNsZWVwIGNvbW1hbmQgdGhhdCBpcyBzdXBwcmVzc2VkIGZyb20gZGlzcGxheWluZyBhbmQgd2FpdCAKLTEwIHNlY29uZHMgYmVmb3JlIHF1aXR0aW5nLgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkEgdGltZW91dCBjYW4gYmUgc3BlY2lmaWVkIGF0IHRoZSA8Y29kZT4mbHQ7dGVsbmV0Jmd0OzwvY29kZT4gbGV2ZWwgb3IgYXQKK3RoZSA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGxldmVsLiAgVGhpcyB3aWxsIGNvbm5lY3QsIGlzc3VlIGEgPGtiZD5zbGVlcDwva2JkPiBjb21tYW5kIHRoYXQgaXMKK3N1cHByZXNzZWQgZnJvbSBkaXNwbGF5aW5nIGFuZCB3YWl0IDEwIHNlY29uZHMgYmVmb3JlIHF1aXR0aW5nLjwvcD4KKworPHByZT4KICZsdDt0ZWxuZXQgdXNlcmlkPSZxdW90O2JvYiZxdW90OyBwYXNzd29yZD0mcXVvdDtiYWRwYXNzJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgdGltZW91dD0mcXVvdDsyMCZxdW90OyZndDsKICAgICZsdDtyZWFkJmd0Oy9ob21lL2JvYiZsdDsvcmVhZCZndDsKICAgICZsdDt3cml0ZSBlY2hvPSZxdW90O2ZhbHNlJnF1b3Q7Jmd0O3NsZWVwIDE1Jmx0Oy93cml0ZSZndDsKICAgICZsdDtyZWFkIHRpbWVvdXQ9JnF1b3Q7MTAmcXVvdDsmZ3Q7L2hvbWUvYm9iJmx0Oy9yZWFkJmd0OwotJmx0Oy90ZWxuZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3RlbG5ldCZndDs8L3ByZT4KIAotVGhlIHRhc2sgY2FuIGJlIHVzZWQgd2l0aCBvdGhlciBwb3J0cyBhcyB3ZWxsOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoZSB0YXNrIGNhbiBiZSB1c2VkIHdpdGggb3RoZXIgcG9ydHMgYXMgd2VsbDo8L3A+Cis8cHJlPgogJmx0O3RlbG5ldCBwb3J0PSZxdW90OzgwJnF1b3Q7IHNlcnZlcj0mcXVvdDtsb2NhbGhvc3QmcXVvdDsgdGltZW91dD0mcXVvdDsyMCZxdW90OyZndDsKICAgICZsdDtyZWFkLyZndDsKICAgICZsdDt3cml0ZSZndDtHRVQgLyBodHRwLzAuOSZsdDsvd3JpdGUmZ3Q7CiAgICAmbHQ7d3JpdGUvJmd0OwogICAgJmx0O3JlYWQgdGltZW91dD0mcXVvdDsxMCZxdW90OyZndDsmYW1wO2x0Oy9IVE1MJmFtcDtndDsmbHQ7L3JlYWQmZ3Q7Ci0mbHQ7L3RlbG5ldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVG8gdXNlIHRoaXMgdGFzayBhZ2FpbnN0IHRoZSBXaW5OVCB0ZWxuZXQgc2VydmljZSwgeW91IG5lZWQgdG8gY29uZmlndXJlIHRoZSBzZXJ2aWNlIHRvIHVzZSAKLWNsYXNzaWMgYXV0aGVudGljYXRpb24gcmF0aGVyIHRoYW4gTlRMTSBuZWdvdGlhdGVkIGF1dGhlbnRpY2F0aW9uLiAKLVRoaXMgY2FuIGJlIGRvbmUgaW4gdGhlIFRlbG5ldCBTZXJ2ZXIgQWRtaW4gYXBwOiAKLXNlbGVjdCAiZGlzcGxheS9jaGFuZ2UgcmVnaXN0cnkgc2V0dGluZ3MiLCB0aGVuICJOVExNIiwgdGhlbiBzZXQgdGhlIHZhbHVlIG9mIE5UTE0gdG8gMS4KLTwvcD4KKyZsdDsvdGVsbmV0Jmd0OzwvcHJlPgogCis8cD5UbyB1c2UgdGhpcyB0YXNrIGFnYWluc3QgdGhlIFdpbmRvd3MgTlQgdGVsbmV0IHNlcnZpY2UsIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSB0aGUgc2VydmljZSB0byB1c2UKK2NsYXNzaWMgYXV0aGVudGljYXRpb24gcmF0aGVyIHRoYW4gTlRMTSBuZWdvdGlhdGVkIGF1dGhlbnRpY2F0aW9uLiAgVGhpcyBjYW4gYmUgZG9uZSBpbiB0aGUgVGVsbmV0CitTZXJ2ZXIgQWRtaW4gYXBwOiBzZWxlY3QgPHE+ZGlzcGxheS9jaGFuZ2UgcmVnaXN0cnkgc2V0dGluZ3M8L3E+LCB0aGVuIDxxPk5UTE08L3E+LCB0aGVuIHNldCB0aGUKK3ZhbHVlIG9mIE5UTE0gdG8gMS48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3RlbXBmaWxlLmh0bWwgYi9tYW51YWwvVGFza3MvdGVtcGZpbGUuaHRtbAppbmRleCAxYmUwMGQwLi43NzJkNTRmIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvdGVtcGZpbGUuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdGVtcGZpbGUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDIxNiArMTUsNzQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci0gICAgCi08aHRtbD4KKworPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KKyAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KICAgPHRpdGxlPlRlbXBmaWxlIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCi08Ym9keSBiZ2NvbG9yPSIjZmZmZmZmIiB0ZXh0PSIjMDAwMDAwIiBsaW5rPSIjNTI1RDc2IgotICAgICAgYWxpbms9IiM1MjVENzYiIHZsaW5rPSIjNTI1RDc2Ij4KLQotPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSI0Ij4KLQotICA8IS0tIFBBR0UgSEVBREVSIC0tPgorPGJvZHk+Cis8aDI+VGVtcGZpbGUgVGFzazwvaDI+Cis8aDMgaWQ9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvaDM+Cis8cD5UaGlzIHRhc2sgc2V0cyBhIHByb3BlcnR5IHRvIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUuCitVbmxpa2UgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEuaW8uRmlsZS5jcmVhdGVUZW1wRmlsZTwvY29kZT4sIHRoaXMgdGFzayBkb2VzIG5vdCBhY3R1YWxseSBjcmVhdGUgdGhlCit0ZW1wb3JhcnkgZmlsZSwgYnV0IGl0IGRvZXMgZ3VhcmFudGVlIHRoYXQgdGhlIGZpbGUgZGlkIG5vdCBleGlzdCB3aGVuIHRoZSB0YXNrIHdhcyBleGVjdXRlZC48L3A+Cis8aDMgaWQ9ImF0dHJpYnV0ZXMiPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZD4KLSAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj48dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0iYm90dG9tIj4KLSAgICAgICAgICAgIDxmb250IHNpemU9IiszIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPjxzdHJvbmc+VGVtcGZpbGUgIFRhc2s8L3N0cm9uZz48L2ZvbnQ+Ci0gICAgICAgICAgICA8YnI+PGZvbnQgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5UaGlzIHRhc2sgc2V0cyBhIHByb3BlcnR5IHRvIHRoZSBuYW1lIG9mIGEgdGVtcG9yYXJ5IGZpbGUuPC9mb250PgotICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPHRkPgotICAgICAgICAgICAgPCEtLSBQUk9KRUNUIExPR08gLS0+Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj4KLSAgICAgICAgICAgICAgPGltZyBzcmM9Ii4uL2ltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIGFsaWduPSJyaWdodCIgYWx0PSJBcGFjaGUgQW50IiBib3JkZXI9IjAiPgotICAgICAgICAgICAgPC9hPgotICAgICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPjwvdGFibGU+Ci0gICAgPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UeXBlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgotCi0gIDwhLS0gU1RBUlQgUklHSFQgU0lERSBNQUlOIEJPRFkgLS0+CiAgIDx0cj4KLSAgICA8dGQgIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0KLSAgICAgICAgICA8IS0tIEFwcGx5aW5nIHRhc2svbG9uZy1kZXNjcmlwdGlvbiAtLT4KLSAgICA8IS0tIFN0YXJ0IERlc2NyaXB0aW9uIC0tPgotICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMiIgd2lkdGg9IjEwMCUiPgotICAgICAgPHRyPjx0ZD4mbmJzcDs8L3RkPjwvdHI+Ci0KLSAgICAgIDx0cj48dGQgYmdjb2xvcj0iIzUyNUQ3NiI+Ci0gICAgICAgIDxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Euc2Fuc2VyaWYiPgotICAgICAgICAgIDxhIG5hbWU9ImRlc2NyaXB0aW9uIj4KLSAgICAgICAgICA8c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZD48YmxvY2txdW90ZT4KLQotICAgICAgICAgIFRoaXMgdGFzayBzZXRzIGEgcHJvcGVydHkgdG8gdGhlIG5hbWUgb2YgYSB0ZW1wb3JhcnkgZmlsZS4KLSAgICAgICAgICBVbmxpa2UgPGNvZGU+amF2YS5pby5GaWxlLmNyZWF0ZVRlbXBGaWxlPC9jb2RlPiwKLSAgICAgICAgICB0aGlzIHRhc2sgZG9lcyBub3QgYWN0dWFsbHkgY3JlYXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSwgYnV0IGl0IGRvZXMgZ3VhcmFudGVlIHRoYXQgdGhlCi0gICAgICAgICAgZmlsZSBkaWQgbm90IGV4aXN0IHdoZW4gdGhlIHRhc2sgd2FzIGV4ZWN1dGVkLgotCi0gICAgICAgICAgPHA+RXhhbXBsZXM6Ci0KLSAgICAgICAgICA8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIi8mZ3Q7PC9wcmU+Ci0KLSAgICAgICAgICBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZQotCi0gICAgICAgICAgPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIgc3VmZml4PSIueG1sIi8mZ3Q7PC9wcmU+Ci0KLSAgICAgICAgICBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIHRoZSA8Y29kZT4ueG1sPC9jb2RlPiBzdWZmaXgKLQotICAgICAgICAgIDxwcmU+Jmx0O3RlbXBmaWxlIHByb3BlcnR5PSJ0ZW1wLmZpbGUiIGRlc3REaXI9ImJ1aWxkIi8mZ3Q7PC9wcmU+Ci0KLSAgICAgICAgICBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSBpbiB0aGUgPGNvZGU+YnVpbGQ8L2NvZGU+IHN1YmRpcmVjdG9yeQotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBEZXNjcmlwdGlvbiAtLT4KLQotIDwhLS0gSWdub3JlIC0tPgotCi0KLQotICAgIDwhLS0gU3RhcnQgQXR0cmlidXRlcyAtLT4KLSAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIj4KLSAgICAgIDx0cj48dGQ+Jm5ic3A7PC90ZD48L3RyPgotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgICAgICAgPHN0cm9uZz5QYXJhbWV0ZXJzPC9zdHJvbmc+PC9hPjwvZm9udD4KLSAgICAgIDwvdGQ+PC90cj4KLSAgICAgIDx0cj48dGQ+PGJsb2NrcXVvdGU+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5BdHRyaWJ1dGU8L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+RGVzY3JpcHRpb248L2I+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2NjY2NjYyIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+PGI+VHlwZTwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjY2NjY2NjIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj48Yj5SZXF1aXJlbWVudDwvYj48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSBHcm91cCAtLT4gICAgCi0gICAgICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByb3BlcnR5PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyB0aGUgcHJvcGVydHkgeW91IHdpc2ggdG8gYXNzaWduIHRoZSB0ZW1wb3JhcnkgZmlsZSB0by48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjEiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5SZXF1aXJlZDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotCi0gICAgPCEtLSBBdHRyaWJ1dGUgR3JvdXAgLS0+ICAgIAotICAgICAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZXN0ZGlyPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiBJZiBub3Qgc2V0LCB0aGUgYmFzZWRpciBkaXJlY3RvcnkgaXMgdXNlZCBpbnN0ZWFkLjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPkZpbGU8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiIHJvd3NwYW49IjUiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5PcHRpb25hbDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPnByZWZpeDwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPlNldHMgdGhlIG9wdGlvbmFsIHByZWZpeCBzdHJpbmcgZm9yIHRoZSB0ZW1wIGZpbGUuPC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U3RyaW5nPC9mb250PgotICAgICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPCEtLSBBdHRyaWJ1dGUgLS0+Ci0gICAgPHRyPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+c3VmZml4PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+U2V0cyB0aGUgb3B0aW9uYWwgc3VmZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5TdHJpbmc8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8IS0tIEF0dHJpYnV0ZSAtLT4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5kZWxldGVvbmV4aXQ8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5XaGV0aGVyIHRoZSB0ZW1wIGZpbGUgd2lsbCBiZSBtYXJrZWQgZm9yIGRlbGV0aW9uIG9uIG5vcm1hbCBleGl0IG9mIHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSAoZXZlbiB0aG91Z2ggdGhlIGZpbGUgbWF5IG5ldmVyIGJlIGNyZWF0ZWQpOyBkZWZhdWx0IDxlbT5mYWxzZTwvZW0+LiA8c3Ryb25nPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9zdHJvbmc+PC9mb250PgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgYmdjb2xvcj0iI2VlZWVlZSIgdmFsaWduPSJ0b3AiIGFsaWduPSJsZWZ0Ij4KLSAgICAgICAgICA8Zm9udCBjb2xvcj0iIzAwMDAwMCIgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ym9vbGVhbjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDwhLS0gQXR0cmlidXRlIC0tPgotICAgIDx0cj4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmNyZWF0ZWZpbGU8L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBiZ2NvbG9yPSIjZWVlZWVlIiB2YWxpZ249InRvcCIgYWxpZ249ImxlZnQiPgotICAgICAgICAgIDxmb250IGNvbG9yPSIjMDAwMDAwIiBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj5XaGV0aGVyIHRoZSB0ZW1wIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhpcyB0YXNrOyBkZWZhdWx0IDxlbT5mYWxzZTwvZW0+LjxzdHJvbmc+U2luY2UgQW50IDEuODwvc3Ryb25nPjwvZm9udD4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGJnY29sb3I9IiNlZWVlZWUiIHZhbGlnbj0idG9wIiBhbGlnbj0ibGVmdCI+Ci0gICAgICAgICAgPGZvbnQgY29sb3I9IiMwMDAwMDAiIHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPmJvb2xlYW48L2ZvbnQ+Ci0gICAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLQotICAgICAgICA8L3RhYmxlPgotICAgICAgPC9ibG9ja3F1b3RlPjwvdGQ+PC90cj4KLQotICAgIDwvdGFibGU+Ci0gICAgPCEtLSBFbmQgQXR0cmlidXRlcyAtLT4KLQotICAgIDwhLS0gU3RhcnQgRWxlbWVudHMgLS0+Ci0gICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIyIiB3aWR0aD0iMTAwJSI+Ci0gICAgICA8dHI+PHRkPiZuYnNwOzwvdGQ+PC90cj4KLQotICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSIjNTI1RDc2Ij4KLSAgICAgICAgPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImFyaWFsLGhlbHZldGljYS5zYW5zZXJpZiI+Ci0gICAgICAgICAgPGEgbmFtZT0iZWxlbWVudHMiPgotICAgICAgICAgIDxzdHJvbmc+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L3N0cm9uZz48L2E+PC9mb250PgotICAgICAgPC90ZD48L3RyPgotCi0gICAgICA8dHI+PHRkPjxibG9ja3F1b3RlPgotCi0gICAgICA8L2Jsb2NrcXVvdGU+PC90ZD48L3RyPgotCi0gICAgPC90YWJsZT4KLSAgICA8IS0tIEVuZCBFbGVtZW50cyAtLT4KLQotCi0gICAgPC90ZD4KKyAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgIDx0ZD5TZXRzIHRoZSBwcm9wZXJ0eSB5b3Ugd2lzaCB0byBhc3NpZ24gdGhlIHRlbXBvcmFyeSBmaWxlIHRvLjwvdGQ+CisgICAgPHRkPlN0cmluZzwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+Ci0gIDwhLS0gRU5EIFJJR0hUIFNJREUgTUFJTiBCT0RZIC0tPgotCisgIDx0cj4KKyAgICA8dGQ+ZGVzdGRpcjwvdGQ+CisgICAgPHRkPlNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS48L3RkPgorICAgIDx0ZD5GaWxlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDx2YXI+YmFzZWRpcjwvdmFyPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgb3B0aW9uYWwgcHJlZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS48L3RkPgorICAgIDx0ZD5TdHJpbmc8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3VmZml4PC90ZD4KKyAgICA8dGQ+U2V0cyB0aGUgb3B0aW9uYWwgc3VmZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS48L3RkPgorICAgIDx0ZD5TdHJpbmc8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGVsZXRlb25leGl0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgdGVtcCBmaWxlIHdpbGwgYmUgbWFya2VkIGZvciBkZWxldGlvbiBvbiBub3JtYWwgZXhpdCBvZiBKVk0gKGV2ZW4gdGhvdWdoIHRoZQorICAgICAgZmlsZSBtYXkgbmV2ZXIgYmUgY3JlYXRlZCkuIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Ym9vbGVhbjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNyZWF0ZWZpbGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoZSB0ZW1wIGZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhpcyB0YXNrLiA8ZW0+U2luY2UgQW50IDEuODwvZW0+PC90ZD4KKyAgICA8dGQ+Ym9vbGVhbjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgogPC90YWJsZT4KIAorPGgzPkV4YW1wbGVzPC9oMz4KKzxwPkNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlPC9wPgorPHByZT4mbHQ7dGVtcGZpbGUgcHJvcGVydHk9InRlbXAuZmlsZSIvJmd0OzwvcHJlPgorCis8cD5DcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIHRoZSA8Y29kZT4ueG1sPC9jb2RlPiBzdWZmaXg8L3A+Cis8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiBzdWZmaXg9Ii54bWwiLyZndDs8L3ByZT4KKworPHA+Q3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIDxjb2RlPmJ1aWxkPC9jb2RlPiBzdWJkaXJlY3Rvcnk8L3A+Cis8cHJlPiZsdDt0ZW1wZmlsZSBwcm9wZXJ0eT0idGVtcC5maWxlIiBkZXN0RGlyPSJidWlsZCIvJmd0OzwvcHJlPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3RvdWNoLmh0bWwgYi9tYW51YWwvVGFza3MvdG91Y2guaHRtbAppbmRleCA4YWRlZTM4Li5mNzk4NzYxIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvdG91Y2guaHRtbAorKysgYi9tYW51YWwvVGFza3MvdG91Y2guaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE0NiArMTUsMTMzIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Ub3VjaCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJ0b3VjaCI+VG91Y2g8L2E+PC9oMj4KKzxoMiBpZD0idG91Y2giPlRvdWNoPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+CiAKLTxwPkNoYW5nZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgcmVzb3VyY2UgYW5kIHBvc3NpYmx5IGNyZWF0ZXMgaXQKLWF0IHRoZSBzYW1lIHRpbWUuIEluIGFkZGl0aW9uIHRvIHdvcmtpbmcgd2l0aCBhIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sKLWNhbiBhbHNvIHdvcmsgb24gPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4gYW5kCi1yZXNvdXJjZSBjb2xsZWN0aW9ucyAod2hpY2ggYWxzbyBpbmNsdWRlcyBkaXJlY3RvcmllcykuICBQcmlvciB0byBBcGFjaGUgQW50Ci0xLjcgb25seSBGaWxlU2V0IG9yIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVsaXN0Lmh0bWwiPkZpbGVsaXN0PC9hPgotKHNpbmNlIEFudCAxLjYpIGhhdmUgYmVlbiBzdXBwb3J0ZWQuPC9wPgorPHA+Q2hhbmdlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSByZXNvdXJjZSBhbmQgcG9zc2libHkgY3JlYXRlcyBpdCBhdCB0aGUgc2FtZSB0aW1lLiBJbiBhZGRpdGlvbgordG8gd29ya2luZyB3aXRoIGEgc2luZ2xlIGZpbGUsIHRoaXMgVGFzayBjYW4gYWxzbyB3b3JrCitvbiA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2VzPC9hPiBhbmQgcmVzb3VyY2UgY29sbGVjdGlvbnMgKHdoaWNoIGFsc28gaW5jbHVkZXMKK2RpcmVjdG9yaWVzKS4gIFByaW9yIHRvIEFwYWNoZSBBbnQgMS43IG9ubHkgRmlsZVNldCBvciA8YSBocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5GaWxlbGlzdDwvYT4KKyg8ZW0+c2luY2UgQW50IDEuNjwvZW0+KSB3ZXJlIHN1cHBvcnRlZC48L3A+CiAKLTxwPkFudCB1c2VzIHRoZSBBUEkgb2YgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPiB0byBzZXQgdGhlIGxhc3QKLSAgbW9kaWZpY2F0aW9uIHRpbWUgd2hpY2ggaGFzIHNvbWUgbGltaXRhdGlvbnMuICBGb3IgZXhhbXBsZSB0aGUKLSAgdGltZXN0YW1wIGdyYW51bGFyaXR5IGRlcGVuZHMgb24gdGhlIG9wZXJhdGluZyBzeXN0ZW0gYW5kIHNvbWV0aW1lcwotICB0aGUgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgYSBncmFudWxhcml0eSBzbWFsbGVyIHRoYW4KLSAgbWlsbGlzZWNvbmRzLiAgSWYgeW91IG5lZWQgbW9yZSBjb250cm9sIHlvdSBoYXZlIHRvIGZhbGwgYmFjayB0bwotICB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIGFuZCBuYXRpdmUgY29tbWFuZHMuPC9wPgorPHA+QW50IHVzZXMgdGhlIEFQSSBvZiA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5pby5GaWxlPC9jb2RlPiB0byBzZXQgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUKK3doaWNoIGhhcyBzb21lIGxpbWl0YXRpb25zLiAgRm9yIGV4YW1wbGUsIHRoZSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbQorYW5kIHNvbWV0aW1lcyB0aGUgb3BlcmF0aW5nIHN5c3RlbSBtYXkgYWxsb3cgYSBncmFudWxhcml0eSBzbWFsbGVyIHRoYW4gbWlsbGlzZWNvbmRzLiAgSWYgeW91IG5lZWQKK21vcmUgY29udHJvbCB5b3UgaGF2ZSB0byBmYWxsIGJhY2sgdG8gdGhlIDxjb2RlPiZsdDtleGVjJmd0OzwvY29kZT4gdGFzayBhbmQgbmF0aXZlIGNvbW1hbmRzLjwvcD4KIAotPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS44LjIgQW50IHdpbGwgbG9nIGEgd2FybmluZyBtZXNzYWdlIGlmIGl0IGZhaWxzCi0gIHRvIGNoYW5nZSB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgeW91IHRyeQotICB0byBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSB5b3UgZG8gbm90IG93biBvbiBtYW55Ci0gIFVuaXggc3lzdGVtcywgZm9yIGV4YW1wbGUuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMjwvZW0+LCBhIHdhcm5pbmcgbWVzc2FnZSBpcyBsb2dnZWQgdXBvbiBmYWlsdXJlIHRvIGNoYW5nZSB0aGUgZmlsZQorbW9kaWZpY2F0aW9uIHRpbWUuICBUaGlzIHdpbGwgaGFwcGVuIGlmIHlvdSB0cnkgdG8gY2hhbmdlIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUgeW91IGRvIG5vdAorb3duIG9uIG1hbnkgVW5peCBzeXN0ZW1zLCBmb3IgZXhhbXBsZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgZmlsZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+VW5sZXNzIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gZWxlbWVudAotICAgICAgIGhhcyBiZWVuIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGZpbGUuPC90ZD4KKyAgICA8dGQ+VW5sZXNzIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gZWxlbWVudCBoYXMgYmVlbiBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5taWxsaXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUKLSAgICAgICBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgSmFuIDEgMTk3MC48L3RkPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+Tm8tLWRhdGV0aW1lIHRha2VzCi0gICAgICAgcHJlY2VkZW5jZSwgaG93ZXZlciBpZiBib3RoIGFyZSBvbWl0dGVkIHRoZSBjdXJyZW50IHRpbWUgaXMgYXNzdW1lZC48L3RkPgorICAgIDx0ZD5taWxsaXM8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZSBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQgSmFuIDEKKyAgICAgIDE5NzAuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm87IDx2YXI+ZGF0ZXRpbWU8L3Zhcj4gdGFrZXMgcHJlY2VkZW5jZSwgaG93ZXZlciBpZiBib3RoIGFyZSBvbWl0dGVkIHRoZW4KKyAgICAgIGN1cnJlbnQgdGltZSBpcyBhc3N1bWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZXRpbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBuZXcgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhlIGZpbGUuIFRoZSAKLSAgICAgICBzcGVjaWFsIHZhbHVlICZxdW90O25vdyZxdW90OyBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgdGltZSAKLSAgICAgICAobm93IHN1cHBvcnRlZCBzaW5jZSBBbnQgMS44KS48L3RkPgorICAgIDx0ZD5kYXRldGltZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZpZXMgdGhlIG5ldyBtb2RpZmljYXRpb24gdGltZSBvZiB0aGUgZmlsZS4gIDxlbT5TaW5jZSBBbnQgMS44PC9lbT4sIHRoZQorICAgICAgc3BlY2lhbCB2YWx1ZSA8cT5ub3c8L3E+IGluZGljYXRlcyB0aGUgY3VycmVudCB0aW1lLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2ltcGxlRGF0ZUZvcm1hdC1jb21wYXRpYmxlIHBhdHRlcm4gc3RyaW5nIHVzaW5nCi0gICAgICAgdGhlIGN1cnJlbnQgbG9jYWxlLgotICAgICAgIERlZmF1bHRzIHRvICJNTS9kZC9ZWVlZIGhoOm1tIGEiIG9yICJNTS9kZC95eXl5IGhoOm1tOnNzIGEiCi0gICAgICAgdXNpbmcgdGhlIFVTIGxvY2FsZS4KLSAgICAgICA8Yj5TaW5jZSBBbnQgMS42LjM8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPlNpbXBsZURhdGVGb3JtYXQtY29tcGF0aWJsZSBwYXR0ZXJuIHN0cmluZyB1c2luZyB0aGUgY3VycmVudCBsb2NhbGUuIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuNi4zPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+TU0vZGQvWVlZWSBoaDptbSBhPC9xPiBvciA8cT5NTS9kZC95eXl5IGhoOm1tOnNzIGE8L3E+IHVzaW5nIHRoZSBVUworICAgICAgbG9jYWxlLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1rZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNyZWF0ZSBub25leGlzdGVudCBwYXJlbnQKLSAgICAgICBkaXJlY3RvcmllcyB3aGVuIHRvdWNoaW5nIG5ldyBmaWxlcy4gPGI+U2luY2UgQW50IDEuNi4zPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgICA8dGQ+bWtkaXJzPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjcmVhdGUgbm9uZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzIHdoZW4gdG91Y2hpbmcgbmV3IGZpbGVzLiA8ZW0+U2luY2UgQW50CisgICAgICAxLjYuMzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGxvZyB0aGUgY3JlYXRpb24gb2YgbmV3IGZpbGVzLgotICAgICAgIDxiPlNpbmNlIEFudCAxLjYuMzwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT4uPC90ZD4KKyAgICA8dGQ+dmVyYm9zZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gbG9nIHRoZSBjcmVhdGlvbiBvZiBuZXcgZmlsZXMuICA8ZW0+U2luY2UgQW50IDEuNi4zPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+YW55IHJlc291cmNlIGNvbGxlY3Rpb248L2g0PgogCi08cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnRzIHRvCi1kZWZpbmUgdGhlIHJlc291cmNlcyBmb3IgdGhpcyB0YXNrIGFuZCByZWZlciB0byByZXNvdXJjZXMgZGVmaW5lZAotZWxzZXdoZXJlLiAgPGI+Tm90ZTo8L2I+IHJlc291cmNlcyBwYXNzZWQgdG8gdGhpcyB0YXNrIG11c3QgaW1wbGVtZW50Ci10aGUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlRvdWNoYWJsZTwvY29kZT4KLWludGVyZmFjZSwgdGhpcyBpcyB0cnVlIGZvciBhbGwgZmlsZXN5c3RlbS1iYXNlZCByZXNvdXJjZXMgbGlrZSB0aG9zZQotcmV0dXJuZWQgYnkgcGF0aCwgZmlsZXNldCBvdCBmaWxlbGlzdC48L3A+Cis8cD5Zb3UgY2FuIHVzZSBhbnkgbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnRzIHRvIGRlZmluZSB0aGUgcmVzb3VyY2VzIGZvciB0aGlzCit0YXNrIGFuZCByZWZlciB0byByZXNvdXJjZXMgZGVmaW5lZCBlbHNld2hlcmUuIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogcmVzb3VyY2VzIHBhc3NlZCB0byB0aGlzIHRhc2sKK211c3QgaW1wbGVtZW50IHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlRvdWNoYWJsZTwvY29kZT4KK2ludGVyZmFjZSwgdGhpcyBpcyB0cnVlIGZvciBhbGwgZmlsZXN5c3RlbS1iYXNlZCByZXNvdXJjZXMgbGlrZSB0aG9zZSByZXR1cm5lZCBieSBwYXRoLCBmaWxlc2V0IG90CitmaWxlbGlzdC48L3A+CiAKLTxwPkZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBkaXJlY3RvcmllcyBtYXRjaGVkIGJ5IG5lc3RlZCBmaWxlc2V0cwotd2lsbCBiZSAidG91Y2hlZCIgYXMgd2VsbCwgdXNlIGEgJmx0O3R5cGUmZ3Q7IHNlbGVjdG9yIHRvIHN1cHByZXNzCi10aGlzLiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gdGhlIHRhc2sgZGlyZWN0bHksCi1ub3QgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gYSBwYXRoIG9yIGFueSBvdGhlciByZXNvdXJjZQotY29sbGVjdGlvbi48L3A+Cis8cD5Gb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZGlyZWN0b3JpZXMgbWF0Y2hlZCBieSBuZXN0ZWQgZmlsZXNldHMgd2lsbCBiZSAidG91Y2hlZCIgYXMgd2VsbCwgdXNlCithIDx2YXI+dHlwZTwvdmFyPiBzZWxlY3RvciB0byBzdXBwcmVzcyB0aGlzLiAgVGhpcyBvbmx5IGFwcGxpZXMgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gdGhlIHRhc2sKK2RpcmVjdGx5LCBub3QgdG8gZmlsZXNldHMgbmVzdGVkIGludG8gYSBwYXRoIG9yIGFueSBvdGhlciByZXNvdXJjZSBjb2xsZWN0aW9uLjwvcD4KIAogPGg0Pm1hcHBlcjwvaDQ+Ci08cD48ZW0+U2luY2UgQW50IDEuNi4zLDwvZW0+IGEgbmVzdGVkIDxhIGhyZWY9Ii4uL1R5cGVzL21hcHBlci5odG1sIj4KLSAgICBtYXBwZXI8L2E+IGNhbiBiZSBzcGVjaWZpZWQuICBGaWxlcyBzcGVjaWZpZWQgdmlhIG5lc3RlZAotICAgIDxjb2RlPmZpbGVzZXQ8L2NvZGU+cywgPGNvZGU+ZmlsZWxpc3Q8L2NvZGU+cywgb3IgdGhlIDxjb2RlPmZpbGU8L2NvZGU+Ci0gICAgYXR0cmlidXRlIGFyZSBtYXBwZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBtYXBwZXIuICBGb3IgZWFjaCBmaWxlIG1hcHBlZCwKLSAgICB0aGUgcmVzdWx0aW5nIGZpbGVzIGFyZSB0b3VjaGVkLiBJZiBubyB0aW1lIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQKLSAgICB0aGUgb3JpZ2luYWwgZmlsZSBleGlzdHMgaXRzIHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQuCi0gICAgSWYgbm8gdGltZSBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBvcmlnaW5hbCBmaWxlIGRvZXMgbm90IGV4aXN0IHRoZSAKLSAgICBjdXJyZW50IHRpbWUgaXMgdXNlZC4gU2luY2UgQW50IDEuOCB0aGUgdGFzayBzZXR0aW5ncyAoPGNvZGU+bWlsbGlzPC9jb2RlPiwKLSAgICBhbmQgPGNvZGU+ZGF0ZXRpbWU8L2NvZGU+KSBoYXZlIHByaW9yaXR5IG92ZXIgdGhlIHRpbWVzdGFtcCBvZiB0aGUgb3JpZ2luYWwKLSAgICBmaWxlLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPiwgYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4gY2FuIGJlIHNwZWNpZmllZC4KK0ZpbGVzIHNwZWNpZmllZCB2aWEgbmVzdGVkIDxjb2RlPmZpbGVzZXQ8L2NvZGU+cywgPGNvZGU+ZmlsZWxpc3Q8L2NvZGU+cywgb3IgdGhlIDxjb2RlPmZpbGU8L2NvZGU+CithdHRyaWJ1dGUgYXJlIG1hcHBlZCB1c2luZyB0aGUgc3BlY2lmaWVkIG1hcHBlci4gIEZvciBlYWNoIGZpbGUgbWFwcGVkLCB0aGUgcmVzdWx0aW5nIGZpbGVzIGFyZQordG91Y2hlZC4gSWYgbm8gdGltZSBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBvcmlnaW5hbCBmaWxlIGV4aXN0cyBpdHMgdGltZXN0YW1wIHdpbGwgYmUgdXNlZC4gIElmCitubyB0aW1lIGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgdGhlIG9yaWdpbmFsIGZpbGUgZG9lcyBub3QgZXhpc3QgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLiA8ZW0+U2luY2UKK0FudCAxLjg8L2VtPiwgdGhlIHRhc2sgc2V0dGluZ3MgKDx2YXI+bWlsbGlzPC92YXI+IGFuZCA8dmFyPmRhdGV0aW1lPC92YXI+KSBoYXZlIHByaW9yaXR5IG92ZXIgdGhlCit0aW1lc3RhbXAgb2YgdGhlIG9yaWdpbmFsIGZpbGUuPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtteWZpbGUmcXVvdDsvJmd0OzwvcHJlPgotPHA+Y3JlYXRlcyA8Y29kZT5teWZpbGU8L2NvZGU+IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZXMgdGhlCi1tb2RpZmljYXRpb24gdGltZSB0byB0aGUgY3VycmVudCB0aW1lLjwvcD4KLTxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtteWZpbGUmcXVvdDsgZGF0ZXRpbWU9JnF1b3Q7MDYvMjgvMjAwMCAyOjAyIHBtJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmNyZWF0ZXMgPGNvZGU+bXlmaWxlPC9jb2RlPiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2VzIHRoZQotbW9kaWZpY2F0aW9uIHRpbWUgdG8gSnVuLCAyOCAyMDAwIDI6MDIgcG0gKDE0OjAyIGZvciB0aG9zZSB1c2VkIHRvIDI0Ci1ob3VyIHRpbWVzKS48L3A+Ci08cHJlPiAgJmx0O3RvdWNoIGRhdGV0aW1lPSZxdW90OzA5LzEwLzE5NzQgNDozMCBwbSZxdW90OyZndDsKKworPHA+Q3JlYXRlIDxzYW1wPm15ZmlsZTwvc2FtcD4gaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgY2hhbmdlIHRoZSBtb2RpZmljYXRpb24gdGltZSB0byB0aGUgY3VycmVudAordGltZS48L3A+Cis8cHJlPiZsdDt0b3VjaCBmaWxlPSZxdW90O215ZmlsZSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNyZWF0ZSA8c2FtcD5teWZpbGU8L3NhbXA+IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gSnVuLCAyOCAyMDAwCisyOjAyIHBtICgxNDowMiBmb3IgdGhvc2UgdXNlZCB0byAyNCBob3VyIHRpbWUpLjwvcD4KKzxwcmU+Jmx0O3RvdWNoIGZpbGU9JnF1b3Q7bXlmaWxlJnF1b3Q7IGRhdGV0aW1lPSZxdW90OzA2LzI4LzIwMDAgMjowMiBwbSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkNoYW5nZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gT2N0LCAwOSAxOTc0IDQ6MzAgcG0gb2YgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmb3VuZAoraW4gPHNhbXA+c3JjX2Rpcjwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDt0b3VjaCBkYXRldGltZT0mcXVvdDswOS8xMC8xOTc0IDQ6MzAgcG0mcXVvdDsmZ3Q7CiAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O3NyY19kaXImcXVvdDsvJmd0OwotICAmbHQ7L3RvdWNoJmd0OzwvcHJlPgotPHA+Y2hhbmdlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gT2N0LCAwOSAxOTc0IDQ6MzAgcG0gb2YgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAKLSAgZm91bmQgaW4gPGNvZGU+c3JjX2RpcjwvY29kZT4uIDwvcD4KLTxwcmU+ICAmbHQ7dG91Y2ggZmlsZT0mcXVvdDtteWZpbGUmcXVvdDsgZGF0ZXRpbWU9JnF1b3Q7MDYvMjgvMjAwMCAyOjAyOjE3IHBtJnF1b3Q7LyZndDs8L3ByZT4KLTxwPmNyZWF0ZXMgPGNvZGU+bXlmaWxlPC9jb2RlPiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2VzIHRoZQotbW9kaWZpY2F0aW9uIHRpbWUgdG8gSnVuLCAyOCAyMDAwIDI6MDI6MTcgcG0gKDE0OjAyOjE3IGZvciB0aG9zZSB1c2VkIHRvIDI0Ci1ob3VyIHRpbWVzKSwgaWYgdGhlIGZpbGVzeXN0ZW0gYWxsb3dzIGEgcHJlY2lzaW9uIG9mIG9uZSBzZWNvbmQgLSBhCi10aW1lIGNsb3NlIHRvIGl0IG90aGVyd2lzZS48L3A+Ci08cHJlPiAgJmx0O3RvdWNoIGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7Jmd0OwotICAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Zm9vJnF1b3Q7IHRvPSZxdW90O2JhciZxdW90OyAvJmd0OwotICAmbHQ7L3RvdWNoJmd0OwotPC9wcmU+Ci08cD5jcmVhdGVzIDxjb2RlPmJhcjwvY29kZT4gaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgY2hhbmdlcyB0aGUKLW1vZGlmaWNhdGlvbiB0aW1lIHRvIHRoYXQgb2YgPGNvZGU+Zm9vPC9jb2RlPi48L3A+CismbHQ7L3RvdWNoJmd0OzwvcHJlPgogCi08cHJlPiAgJmx0O3RvdWNoIGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7IGRhdGV0aW1lPSZxdW90O25vdyZxdW90OyZndDsKLSAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7cmVnZXhwJnF1b3Q7IGZyb209JnF1b3Q7XnNyYyguKilcLmphdmEmcXVvdDsgdG89JnF1b3Q7c2hhZG93XDEuZW1wdHkmcXVvdDsgLyZndDsKLSAgJmx0Oy90b3VjaCZndDsKLTwvcHJlPgotPHA+Y3JlYXRlcyBmaWxlcyBpbiB0aGUgPGNvZGU+c2hhZG93PC9jb2RlPiBkaXJlY3RvcnkgZm9yIGV2ZXJ5IGphdmEgZmlsZSBpbiB0aGUKLSAgIDxjb2RlPnNyYzwvY29kZT4gZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZXMgdGhlIG1vZGlmaWNhdGlvbgotICAgdGltZSBvZiB0aG9zZSBmaWxlcyB0byB0aGUgY3VycmVudCB0aW1lLjwvcD4KKzxwPkNyZWF0ZSA8c2FtcD5teWZpbGU8L3NhbXA+IGlmIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIGNoYW5nZSB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgdG8gSnVuLCAyOCAyMDAwCisyOjAyOjE3IHBtICgxNDowMjoxNyBmb3IgdGhvc2UgdXNlZCB0byAyNCBob3VyIHRpbWUpLCBpZiB0aGUgZmlsZXN5c3RlbSBhbGxvd3MgYSBwcmVjaXNpb24gb2Ygb25lCitzZWNvbmQmbWRhc2g7YSB0aW1lIGNsb3NlIHRvIGl0IG90aGVyd2lzZS48L3A+Cis8cHJlPiZsdDt0b3VjaCBmaWxlPSZxdW90O215ZmlsZSZxdW90OyBkYXRldGltZT0mcXVvdDswNi8yOC8yMDAwIDI6MDI6MTcgcG0mcXVvdDsvJmd0OzwvcHJlPgogCis8cD5DcmVhdGUgPHNhbXA+YmFyPC9zYW1wPiBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIHRvIHRoYXQKK29mIDxzYW1wPmZvbzwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDt0b3VjaCBmaWxlPSZxdW90O2ZvbyZxdW90OyZndDsKKyAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90O2ZvbyZxdW90OyB0bz0mcXVvdDtiYXImcXVvdDsvJmd0OworJmx0Oy90b3VjaCZndDs8L3ByZT4KKworPHA+Q3JlYXRlIGZpbGVzIGluIHRoZSA8c2FtcD5zaGFkb3c8L3NhbXA+IGRpcmVjdG9yeSBmb3IgZXZlcnkgPHNhbXA+LmphdmE8L3NhbXA+IGZpbGUgaW4KK3RoZSA8c2FtcD5zcmM8L3NhbXA+IGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBjaGFuZ2UgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRob3NlIGZpbGVzCit0byB0aGUgY3VycmVudCB0aW1lLjwvcD4KKzxwcmU+CismbHQ7dG91Y2ggZmlsZT0mcXVvdDtmb28mcXVvdDsgZGF0ZXRpbWU9JnF1b3Q7bm93JnF1b3Q7Jmd0OworICAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtyZWdleHAmcXVvdDsgZnJvbT0mcXVvdDtec3JjKC4qKVwuamF2YSZxdW90OyB0bz0mcXVvdDtzaGFkb3dcMS5lbXB0eSZxdW90Oy8mZ3Q7CismbHQ7L3RvdWNoJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvdHJhbnNsYXRlLmh0bWwgYi9tYW51YWwvVGFza3MvdHJhbnNsYXRlLmh0bWwKaW5kZXggMTBlODEyYS4uMGJlMjJiYSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3RyYW5zbGF0ZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy90cmFuc2xhdGUuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDM3ICsxNSwyOCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VHJhbnNsYXRlIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InRyYW5zbGF0ZSI+VHJhbnNsYXRlPC9hPjwvaDI+Cis8aDIgaWQ9InRyYW5zbGF0ZSI+VHJhbnNsYXRlPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5JZGVudGlmaWVzIGtleXMgaW4gZmlsZXMgZGVsaW1pdGVkIGJ5IHNwZWNpYWwgdG9rZW5zCi1hbmQgdHJhbnNsYXRlcyB0aGVtIHdpdGggdmFsdWVzIHJlYWQgZnJvbSByZXNvdXJjZSBidW5kbGVzLgotPC9wPgotPHA+Ci1BIHJlc291cmNlIGJ1bmRsZSBjb250YWlucyBsb2NhbGUtc3BlY2lmaWMga2V5LXZhbHVlIHBhaXJzLgotQSByZXNvdXJjZSBidW5kbGUgaXMgYSBoaWVyYXJjaGljYWwgc2V0IG9mIHByb3BlcnR5IGZpbGVzLgotQSBidW5kbGUgbmFtZSBtYWtlcyB1cCBpdHMgYmFzZSBmYW1pbHkgbmFtZS4gIEVhY2ggZmlsZSB0aGF0Ci1tYWtlcyB1cCB0aGlzIGJ1bmRsZSBoYXMgdGhpcyBuYW1lIHBsdXMgaXRzIGxvY2FsZS4gIEZvciBleGFtcGxlLAotaWYgdGhlIHJlc291cmNlIGJ1bmRsZSBuYW1lIGlzIE15UmVzb3VyY2VzLCB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zCi1HZXJtYW4gdGV4dCB3aWxsIHRha2UgdGhlIG5hbWUgTXlSZXNvdXJjZXNfZGUuICBJbiBhZGRpdGlvbiB0bwotbGFuZ3VhZ2UsIGNvdW50cnkgYW5kIHZhcmlhbnQgYXJlIGFsc28gdXNlZCB0byBmb3JtIHRoZSBmaWxlcyBpbgotdGhlIGJ1bmRsZS4KLTwvcD4KLTxwPgotVGhlIHJlc291cmNlIGJ1bmRsZSBsb29rdXAgc2VhcmNoZXMgZm9yIHJlc291cmNlIGZpbGVzIHdpdGggdmFyaW91cwotc3VmZml4ZXMgb24gdGhlIGJhc2lzIG9mICgxKSB0aGUgZGVzaXJlZCBsb2NhbGUgYW5kICgyKSB0aGUgZGVmYXVsdAotbG9jYWxlIChiYXNlYnVuZGxlbmFtZSksIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgZnJvbSBsb3dlci1sZXZlbAotKG1vcmUgc3BlY2lmaWMpIHRvIHBhcmVudC1sZXZlbCAobGVzcyBzcGVjaWZpYyk6Ci08L3A+Cis8cD5JZGVudGlmaWVzIGtleXMgaW4gZmlsZXMgZGVsaW1pdGVkIGJ5IHNwZWNpYWwgdG9rZW5zIGFuZCB0cmFuc2xhdGVzIHRoZW0gd2l0aCB2YWx1ZXMgcmVhZCBmcm9tCityZXNvdXJjZSBidW5kbGVzLjwvcD4KKzxwPkEgcmVzb3VyY2UgYnVuZGxlIGNvbnRhaW5zIGxvY2FsZS1zcGVjaWZpYyBrZXktdmFsdWUgcGFpcnMuICBBIHJlc291cmNlIGJ1bmRsZSBpcyBhIGhpZXJhcmNoaWNhbAorc2V0IG9mIHByb3BlcnR5IGZpbGVzLiAgQSBidW5kbGUgbmFtZSBtYWtlcyB1cCBpdHMgYmFzZSBmYW1pbHkgbmFtZS4gIEVhY2ggZmlsZSB0aGF0IG1ha2VzIHVwIHRoaXMKK2J1bmRsZSBoYXMgdGhpcyBuYW1lIHBsdXMgaXRzIGxvY2FsZS4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVzb3VyY2UgYnVuZGxlIG5hbWUKK2lzIDxzYW1wPk15UmVzb3VyY2VzPC9zYW1wPiwgdGhlIGZpbGUgdGhhdCBjb250YWlucyBHZXJtYW4gdGV4dCB3aWxsIHRha2UgdGhlCituYW1lIDxzYW1wPk15UmVzb3VyY2VzX2RlPC9zYW1wPi4gIEluIGFkZGl0aW9uIHRvIGxhbmd1YWdlLCBjb3VudHJ5IGFuZCB2YXJpYW50IGFyZSBhbHNvIHVzZWQgdG8KK2Zvcm0gdGhlIGZpbGVzIGluIHRoZSBidW5kbGUuPC9wPgorPHA+VGhlIHJlc291cmNlIGJ1bmRsZSBsb29rdXAgc2VhcmNoZXMgZm9yIHJlc291cmNlIGZpbGVzIHdpdGggdmFyaW91cyBzdWZmaXhlcyBvbiB0aGUgYmFzaXMgb2YgKDEpCit0aGUgZGVzaXJlZCBsb2NhbGUgYW5kICgyKSB0aGUgZGVmYXVsdCBsb2NhbGUgKGJhc2VidW5kbGVuYW1lKSwgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBmcm9tCitsb3dlci1sZXZlbCAobW9yZSBzcGVjaWZpYykgdG8gcGFyZW50LWxldmVsIChsZXNzIHNwZWNpZmljKTo8L3A+CiA8cHJlPgogYmFzZWJ1bmRsZW5hbWUgKyAmcXVvdDtfJnF1b3Q7ICsgbGFuZ3VhZ2UxICsgJnF1b3Q7XyZxdW90OyArIGNvdW50cnkxICsgJnF1b3Q7XyZxdW90OyArIHZhcmlhbnQxCiBiYXNlYnVuZGxlbmFtZSArICZxdW90O18mcXVvdDsgKyBsYW5ndWFnZTEgKyAmcXVvdDtfJnF1b3Q7ICsgY291bnRyeTEKQEAgLTU0LDEyOSArNDYsMTAzIEBACiBiYXNlYnVuZGxlbmFtZSArICZxdW90O18mcXVvdDsgKyBsYW5ndWFnZTIgKyAmcXVvdDtfJnF1b3Q7ICsgY291bnRyeTIKIGJhc2VidW5kbGVuYW1lICsgJnF1b3Q7XyZxdW90OyArIGxhbmd1YWdlMgogPC9wcmU+Ci08cD4KLVRoZSBmaWxlIG5hbWVzIGdlbmVyYXRlZCB0aHVzIGFyZSBhcHBlbmRlZCB3aXRoIHRoZSBzdHJpbmcgJnF1b3Q7LnByb3BlcnRpZXMmcXVvdDsKLXRvIG1ha2UgdXAgdGhlIGZpbGUgbmFtZXMgdGhhdCBhcmUgdG8gYmUgdXNlZC4KLTwvcD4KLTxwPgotRmlsZSBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuICBUaGUgZW5jb2Rpbmcgc2NoZW1lIG9mIHRoZSBzb3VyY2UgZmlsZXMsCi1kZXN0aW5hdGlvbiBmaWxlcyBhbmQgdGhlIGJ1bmRsZSBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkLgotCi1EZXN0aW5hdGlvbiBmaWxlcyBjYW4gYmUgZXhwbGljaXRseSBvdmVyd3JpdHRlbiB1c2luZyB0aGUKLTx2YXI+Zm9yY2VvdmVyd3JpdGU8L3Zhcj4gYXR0cmlidXRlLiAgSWYgPHZhcj5mb3JjZW92ZXJ3cml0ZTwvdmFyPgotaXMgZmFsc2UsIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG92ZXJ3cml0dGVuIG9ubHkgaWYgZWl0aGVyIHRoZQotc291cmNlIGZpbGUgb3IgYW55IG9mIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGJ1bmRsZSBoYXZlIGJlZW4KLW1vZGlmaWVkIGFmdGVyIHRoZSBkZXN0aW5hdGlvbiBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkLgotPC9wPgotPHA+Ci08ZW0+TmV3IGluIEFwYWNoZSBBbnQgMS42OjwvZW0+PGJyPgotTGluZSBlbmRpbmdzIG9mIHNvdXJjZSBmaWxlcyBhcmUgcHJlc2VydmVkIGluIHRoZSB0cmFuc2xhdGVkIGZpbGVzLgotPC9wPgotPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZpbGVzIHRvCi10cmFuc2xhdGUuCi08L3A+Cis8cD5UaGUgZmlsZSBuYW1lcyBnZW5lcmF0ZWQgdGh1cyBhcmUgYXBwZW5kZWQgd2l0aCB0aGUgc3RyaW5nIDxzYW1wPi5wcm9wZXJ0aWVzPC9zYW1wPiB0byBtYWtlIHVwCit0aGUgZmlsZSBuYW1lcyB0aGF0IGFyZSB0byBiZSB1c2VkLjwvcD4KKzxwPkZpbGUgZW5jb2RpbmcgaXMgc3VwcG9ydGVkLiAgVGhlIGVuY29kaW5nIHNjaGVtZSBvZiB0aGUgc291cmNlIGZpbGVzLCBkZXN0aW5hdGlvbiBmaWxlcyBhbmQgdGhlCitidW5kbGUgZmlsZXMgY2FuIGJlIHNwZWNpZmllZC48L3A+Cis8cD5EZXN0aW5hdGlvbiBmaWxlcyBjYW4gYmUgZXhwbGljaXRseSBvdmVyd3JpdHRlbiB1c2luZyB0aGUgPHZhcj5mb3JjZW92ZXJ3cml0ZTwvdmFyPiBhdHRyaWJ1dGUuCitJZiA8dmFyPmZvcmNlb3ZlcndyaXRlPC92YXI+IGlzIDxxPmZhbHNlPC9xPiwgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgb3ZlcndyaXR0ZW4gb25seSBpZiBlaXRoZXIgdGhlCitzb3VyY2UgZmlsZSBvciBhbnkgb2YgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVuZGxlIGhhdmUgYmVlbiBtb2RpZmllZCBhZnRlciB0aGUgZGVzdGluYXRpb24KK2ZpbGUgd2FzIGxhc3QgbW9kaWZpZWQuPC9wPgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT4gbGluZSBlbmRpbmdzIG9mIHNvdXJjZSBmaWxlcyBhcmUgcHJlc2VydmVkIGluIHRoZSB0cmFuc2xhdGVkCitmaWxlcy48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8gdHJhbnNsYXRlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dG9kaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RGVzdGluYXRpb24gZGlyZWN0b3J5IHdoZXJlIGRlc3RpbmF0aW9uIGZpbGVzIGFyZQotICAgICAgdG8gYmUgY3JlYXRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dG9kaXI8L3RkPgorICAgIDx0ZD5EZXN0aW5hdGlvbiBkaXJlY3Rvcnkgd2hlcmUgZGVzdGluYXRpb24gZmlsZXMgYXJlIHRvIGJlIGNyZWF0ZWQuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RhcnR0b2tlbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3RhcnRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5cy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+c3RhcnR0b2tlbjwvdGQ+CisgICAgPHRkPlRoZSBzdGFydGluZyB0b2tlbiB0byBpZGVudGlmeSBrZXlzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuZHRva2VuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmRpbmcgdG9rZW4gdG8gaWRlbnRpZnkga2V5cy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZW5kdG9rZW48L3RkPgorICAgIDx0ZD5UaGUgZW5kaW5nIHRva2VuIHRvIGlkZW50aWZ5IGtleXMuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YnVuZGxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZhbWlseSBuYW1lIG9mIHJlc291cmNlIGJ1bmRsZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+YnVuZGxlPC90ZD4KKyAgICA8dGQ+RmFtaWx5IG5hbWUgb2YgcmVzb3VyY2UgYnVuZGxlLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1bmRsZWxhbmd1YWdlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBMb2NhbGUgc3BlY2lmaWMgbGFuZ3VhZ2Ugb2YgcmVzb3VyY2UgYnVuZGxlLiAgRGVmYXVsdHMgdG8KLSAgICAgICAgZGVmYXVsdCBsb2NhbGUncyBsYW5ndWFnZS4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5idW5kbGVsYW5ndWFnZTwvdGQ+CisgICAgPHRkPkxvY2FsZSBzcGVjaWZpYyBsYW5ndWFnZSBvZiByZXNvdXJjZSBidW5kbGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgbG9jYWxlJ3MgbGFuZ3VhZ2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5idW5kbGVjb3VudHJ5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBMb2NhbGUgc3BlY2lmaWMgY291bnRyeSBvZiByZXNvdXJjZSBidW5kbGUuICBEZWZhdWx0cyB0bwotICAgICAgICBkZWZhdWx0IGxvY2FsZSdzIGNvdW50cnkuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YnVuZGxlY291bnRyeTwvdGQ+CisgICAgPHRkPkxvY2FsZSBzcGVjaWZpYyBjb3VudHJ5IG9mIHJlc291cmNlIGJ1bmRsZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBsb2NhbGUncyBjb3VudHJ5PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YnVuZGxldmFyaWFudDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgTG9jYWxlIHNwZWNpZmljIHZhcmlhbnQgb2YgcmVzb3VyY2UgYnVuZGxlLiAgRGVmYXVsdHMgdG8KLSAgICAgICAgdGhlIGRlZmF1bHQgdmFyaWFudCBvZiB0aGUgY291bnRyeSBhbmQgbGFuZ3VhZ2UgYmVpbmcgdXNlZC4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5idW5kbGV2YXJpYW50PC90ZD4KKyAgICA8dGQ+TG9jYWxlIHNwZWNpZmljIHZhcmlhbnQgb2YgcmVzb3VyY2UgYnVuZGxlLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8dmFyPmJ1bmRsZWxhbmd1YWdlPC92YXI+Xzx2YXI+YnVuZGxlY291bnRyeTwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2VuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvCi0gICAgc3lzdGVtIGRlZmF1bHQgZmlsZSBlbmNvZGluZy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5zcmNlbmNvZGluZzwvdGQ+CisgICAgPHRkPlNvdXJjZSBmaWxlIGVuY29kaW5nIHNjaGVtZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkRlc3RpbmF0aW9uIGZpbGUgZW5jb2Rpbmcgc2NoZW1lLiAgRGVmYXVsdHMgdG8KLSAgICBzb3VyY2UgZmlsZSBlbmNvZGluZy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZXN0ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5EZXN0aW5hdGlvbiBmaWxlIGVuY29kaW5nIHNjaGVtZS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHZhcj5zcmNlbmNvZGluZzwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1bmRsZWVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJlc291cmNlIEJ1bmRsZSBmaWxlIGVuY29kaW5nIHNjaGVtZS4gIERlZmF1bHRzIHRvCi0gICAgc291cmNlIGZpbGUgZW5jb2RpbmcuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YnVuZGxlZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5SZXNvdXJjZSBCdW5kbGUgZmlsZSBlbmNvZGluZyBzY2hlbWUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDx2YXI+c3JjZW5jb2Rpbmc8L3Zhcj48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb3JjZW92ZXJ3cml0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb24KLSAgICAgIGZpbGVzIGFyZSBuZXdlci4gRGVmYXVsdHMgdG8gJnF1b3Q7bm8mcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Zm9yY2VvdmVyd3JpdGU8L3RkPgorICAgIDx0ZD5PdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgZXZlbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZXMgYXJlIG5ld2VyLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5ubzwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+ZmlsZXNldDwvaDQ+Ci0gPHA+PGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0czwvYT4gYXJlIHVzZWQgdG8gc2VsZWN0IGZpbGVzIHRoYXQKLSBjb250YWluIGtleXMgZm9yIHdoaWNoIHZhbHVlIHRyYW5zbGF0ZWQgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4KLTwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldHM8L2E+IGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0aGF0IGNvbnRhaW4ga2V5cyBmb3Igd2hpY2gKK3ZhbHVlIHRyYW5zbGF0ZWQgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC48L3A+CisKIDxoMz5FeGFtcGxlczwvaDM+Ci08cD48Yj5UcmFuc2xhdGUgc291cmNlIGZpbGUgZW5jb2RlZCBpbiBlbmdsaXNoIGludG8gaXRzIGphcGFuZXNlCi1lcXVpdmFsZW50IHVzaW5nIGEgcmVzb3VyY2UgYnVuZGxlIGVuY29kZWQgaW4gamFwYW5lc2UuCi08L2I+PC9wPgorPHA+VHJhbnNsYXRlIHNvdXJjZSBmaWxlIGVuY29kZWQgaW4gRW5nbGlzaCBpbnRvIGl0cyBKYXBhbmVzZSBlcXVpdmFsZW50IHVzaW5nIGEgcmVzb3VyY2UgYnVuZGxlCitlbmNvZGVkIGluIEphcGFuZXNlLjwvcD4KIDxwcmU+Ci0gICZsdDt0cmFuc2xhdGUgdG9EaXI9JnF1b3Q7JChkZXN0LmRpcn0vamEmcXVvdDsKLSAgICAgICAgc3RhcnR0b2tlbj0mcXVvdDsjJnF1b3Q7Ci0gICAgICAgIGVuZHRva2VuPSZxdW90OyMmcXVvdDsKLSAgICAgICAgYnVuZGxlPSZxdW90O3Jlc291cmNlL0Jhc2VSZXNvdXJjZSZxdW90OwotICAgICAgICBidW5kbGVsYW5ndWFnZT0mcXVvdDtqYSZxdW90OwotICAgICAgICBmb3JjZW92ZXJ3cml0ZT0mcXVvdDt5ZXMmcXVvdDsKLSAgICAgICAgc3JjZW5jb2Rpbmc9JnF1b3Q7SVNPODg1OV8xJnF1b3Q7Ci0gICAgICAgIGRlc3RlbmNvZGluZz0mcXVvdDtTSklTJnF1b3Q7Ci0gICAgICAgIGJ1bmRsZWVuY29kaW5nPSZxdW90O1NKSVMmcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NyYy5kaXJ9JnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmpzcCZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDsvZmlsZXNldCZndDsKLSAgJmx0Oy90cmFuc2xhdGUmZ3Q7Ci08L3ByZT4KKyZsdDt0cmFuc2xhdGUgdG9EaXI9JnF1b3Q7JChkZXN0LmRpcn0vamEmcXVvdDsKKyAgICAgICAgICAgc3RhcnR0b2tlbj0mcXVvdDsjJnF1b3Q7CisgICAgICAgICAgIGVuZHRva2VuPSZxdW90OyMmcXVvdDsKKyAgICAgICAgICAgYnVuZGxlPSZxdW90O3Jlc291cmNlL0Jhc2VSZXNvdXJjZSZxdW90OworICAgICAgICAgICBidW5kbGVsYW5ndWFnZT0mcXVvdDtqYSZxdW90OworICAgICAgICAgICBmb3JjZW92ZXJ3cml0ZT0mcXVvdDt5ZXMmcXVvdDsKKyAgICAgICAgICAgc3JjZW5jb2Rpbmc9JnF1b3Q7SVNPODg1OV8xJnF1b3Q7CisgICAgICAgICAgIGRlc3RlbmNvZGluZz0mcXVvdDtTSklTJnF1b3Q7CisgICAgICAgICAgIGJ1bmRsZWVuY29kaW5nPSZxdW90O1NKSVMmcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjLmRpcn0mcXVvdDsmZ3Q7CisgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qc3AmcXVvdDsvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvdHJhbnNsYXRlJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvdHJ1bmNhdGUuaHRtbCBiL21hbnVhbC9UYXNrcy90cnVuY2F0ZS5odG1sCmluZGV4IGI3ZGYzZjcuLjIwNWI1NDggMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy90cnVuY2F0ZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy90cnVuY2F0ZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsOTYgKzE1LDg3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5UcnVuY2F0ZSBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJ0b3VjaCI+VHJ1bmNhdGU8L2E+PC9oMj4KKzxoMiBpZD0idG91Y2giPlRydW5jYXRlPC9oMj4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9lbT48L3A+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD5TZXQgdGhlIGxlbmd0aCBvZiBvbmUgb3IgbW9yZSBmaWxlcywgYXMgdGhlIGludGVybWl0dGVudGx5IGF2YWlsYWJsZQotPGNvZGU+dHJ1bmNhdGU8L2NvZGU+IFVuaXggdXRpbGl0eS9mdW5jdGlvbi4gSW4gYWRkaXRpb24gdG8gd29ya2luZyB3aXRoCi1hIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sgY2FuIGFsc28gd29yayBvbgotPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4gYW5kIHJlc291cmNlIGNvbGxlY3Rpb25zLgotPHN0cm9uZz5TaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9zdHJvbmc+LgotPC9wPgorPHA+U2V0IHRoZSBsZW5ndGggb2Ygb25lIG9yIG1vcmUgZmlsZXMsIGFzIHRoZSA8Y29kZT50cnVuY2F0ZTwvY29kZT4gVW5peCBmdW5jdGlvbiBvciBHTlUKK3V0aWxpdHkuIEluIGFkZGl0aW9uIHRvIHdvcmtpbmcgd2l0aCBhIHNpbmdsZSBmaWxlLCB0aGlzIFRhc2sgY2FuIGFsc28gd29yaworb24gPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlczwvYT4gYW5kIHJlc291cmNlIGNvbGxlY3Rpb25zLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBmaWxlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5Vbmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50Ci0gICAgICAgaGFzIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgZmlsZS48L3RkPgorICAgIDx0ZD5Vbmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50IGhhcyBiZWVuIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxlbmd0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIG5ldyBmaWxlIGxlbmd0aCAoaW4gYnl0ZXMpIHRvIHNldC4KLSAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgc3VmZml4ZXMgYXJlIHN1cHBvcnRlZDoKKyAgICA8dGQ+bGVuZ3RoPC90ZD4KKyAgICA8dGQ+U3BlY2lmaWVzIHRoZSBuZXcgZmlsZSBsZW5ndGggKGluIGJ5dGVzKSB0byBzZXQuICBUaGUgZm9sbG93aW5nIHN1ZmZpeGVzIGFyZSBzdXBwb3J0ZWQ6CiAgICAgICA8dWw+Ci0gICAgICAgIDxsaT5LIDogS2lsb2J5dGVzICgxMDI0IGJ5dGVzKTwvbGk+Ci0gICAgICAgIDxsaT5NIDogTWVnYWJ5dGVzICgxMDI0IEspPC9saT4KLSAgICAgICAgPGxpPkcgOiBHaWdhYnl0ZXMgKDEwMjQgTSk8L2xpPgotICAgICAgICA8bGk+VCA6IFRlcmFieXRlcyAoMTAyNCBHKTwvbGk+Ci0gICAgICAgIDxsaT5QIDogUGV0YWJ5dGVzICgxMDI0IFQpPC9saT4KKyAgICAgICAgPGxpPjxxPks8L3E+IDogS2lsb2J5dGVzICgxMDI0IGJ5dGVzKTwvbGk+CisgICAgICAgIDxsaT48cT5NPC9xPiA6IE1lZ2FieXRlcyAoMTAyNCBLKTwvbGk+CisgICAgICAgIDxsaT48cT5HPC9xPiA6IEdpZ2FieXRlcyAoMTAyNCBNKTwvbGk+CisgICAgICAgIDxsaT48cT5UPC9xPiA6IFRlcmFieXRlcyAoMTAyNCBHKTwvbGk+CisgICAgICAgIDxsaT48cT5QPC9xPiA6IFBldGFieXRlcyAoMTAyNCBUKTwvbGk+CiAgICAgICA8L3VsPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0iY2VudGVyIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5BdCBtb3N0IG9uZSBvZiB0aGVzZS4KLSAgICAgIE9taXR0aW5nIGJvdGggaW1wbGllcyA8Y29kZT5sZW5ndGg9IjAiPC9jb2RlPi4KKyAgICA8dGQgcm93c3Bhbj0iMiI+QXQgbW9zdCBvbmUgb2YgdGhlc2U7IG9taXR0aW5nIGJvdGggaW1wbGllcyA8dmFyPmxlbmd0aDwvdmFyPj08cT4wPC9xPgogICAgIDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFkanVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcwotICAgICAgKGFuZCBwb3NpdGl2ZS9uZWdhdGl2ZSBkaXJlY3Rpb24pCi0gICAgICBieSB3aGljaCB0byBhZGp1c3QgZmlsZSBsZW5ndGhzLiAgVGhlIHNhbWUgc3VmZml4ZXMgYXJlIHN1cHBvcnRlZAotICAgICAgZm9yIHRoaXMgYXR0cmlidXRlIGFzIGZvciB0aGUgPGNvZGU+bGVuZ3RoPC9jb2RlPiBhdHRyaWJ1dGUuCisgICAgPHRkPmFkanVzdDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyAoYW5kIHBvc2l0aXZlL25lZ2F0aXZlIGRpcmVjdGlvbikgYnkgd2hpY2ggdG8KKyAgICAgIGFkanVzdCBmaWxlIGxlbmd0aHMuICBUaGUgc2FtZSBzdWZmaXhlcyBhcmUgc3VwcG9ydGVkIGZvciB0aGlzIGF0dHJpYnV0ZSBhcyBmb3IKKyAgICAgIHRoZSA8dmFyPmxlbmd0aDwvdmFyPiBhdHRyaWJ1dGUuCiAgICAgPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3JlYXRlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPi48L3RkPgorICAgIDx0ZD5jcmVhdGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGNyZWF0ZSBub25leGlzdGVudCBmaWxlcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1rZGlyczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNyZWF0ZSBub25leGlzdGVudCBwYXJlbnQKLSAgICAgICBkaXJlY3RvcmllcyB3aGVuIGNyZWF0aW5nIG5ldyBmaWxlcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgICAgPHRkPm1rZGlyczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY3JlYXRlIG5vbmV4aXN0ZW50IHBhcmVudCBkaXJlY3RvcmllcyB3aGVuIGNyZWF0aW5nIG5ldyBmaWxlcy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PmFueSByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAotPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50cyB0bwotZGVmaW5lIHRoZSByZXNvdXJjZXMgZm9yIHRoaXMgdGFzayBhbmQgcmVmZXIgdG8gcmVzb3VyY2VzIGRlZmluZWQKLWVsc2V3aGVyZS4gIDxiPk5vdGU6PC9iPiByZXNvdXJjZXMgcGFzc2VkIHRvIHRoaXMgdGFzayBhcmUgZXhwZWN0ZWQKLXRvIGJlIGZpbGVzeXN0ZW0tYmFzZWQuPC9wPgorPHA+WW91IGNhbiB1c2UgYW55IG51bWJlciBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50cyB0byBkZWZpbmUgdGhlIHJlc291cmNlcyBmb3IgdGhpcwordGFzayBhbmQgcmVmZXIgdG8gcmVzb3VyY2VzIGRlZmluZWQgZWxzZXdoZXJlLiAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiByZXNvdXJjZXMgcGFzc2VkIHRvIHRoaXMgdGFzaworYXJlIGV4cGVjdGVkIHRvIGJlIGZpbGVzeXN0ZW0tYmFzZWQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cHJlPiAgJmx0O3RydW5jYXRlIGZpbGU9ImZvbyIgLyZndDs8L3ByZT4KLTxwPlNldHMgdGhlIGxlbmd0aCBvZiBmaWxlIDxjb2RlPmZvbzwvY29kZT4gdG8gemVyby48L3A+Cis8cD5TZXQgdGhlIGxlbmd0aCBvZiBmaWxlIDxzYW1wPmZvbzwvc2FtcD4gdG8gemVyby48L3A+Cis8cHJlPiZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iLyZndDs8L3ByZT4KIAotPHByZT4gICZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIGxlbmd0aD0iMUsiIC8mZ3Q7PC9wcmU+Ci08cD5TZXRzIHRoZSBsZW5ndGggb2YgZmlsZSA8Y29kZT5mb288L2NvZGU+IHRvIDEga2lsb2J5dGUgKDEwMjQgYnl0ZXMpLjwvcD4KKzxwPlNldCB0aGUgbGVuZ3RoIG9mIGZpbGUgPHNhbXA+Zm9vPC9zYW1wPiB0byAxIGtpbG9ieXRlICgxMDI0IGJ5dGVzKS48L3A+Cis8cHJlPiZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIGxlbmd0aD0iMUsiLyZndDs8L3ByZT4KIAotPHByZT4gICZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIGFkanVzdD0iMUsiIC8mZ3Q7PC9wcmU+Ci08cD5BZGp1c3RzIHRoZSBsZW5ndGggb2YgZmlsZSA8Y29kZT5mb288L2NvZGU+IHVwd2FyZCBieSAxIGtpbG9ieXRlLjwvcD4KKzxwPkFkanVzdCB0aGUgbGVuZ3RoIG9mIGZpbGUgPHNhbXA+Zm9vPC9zYW1wPiB1cHdhcmQgYnkgMSBraWxvYnl0ZS48L3A+Cis8cHJlPiZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIGFkanVzdD0iMUsiLyZndDs8L3ByZT4KIAotPHByZT4gICZsdDt0cnVuY2F0ZSBmaWxlPSJmb28iIGFkanVzdD0iLTFNIiAvJmd0OzwvcHJlPgotPHA+QWRqdXN0cyB0aGUgbGVuZ3RoIG9mIGZpbGUgPGNvZGU+Zm9vPC9jb2RlPiBkb3dud2FyZCBieSAxIG1lZ2FieXRlLjwvcD4KKzxwPkFkanVzdCB0aGUgbGVuZ3RoIG9mIGZpbGUgPHNhbXA+Zm9vPC9zYW1wPiBkb3dud2FyZCBieSAxIG1lZ2FieXRlLjwvcD4KKzxwcmU+Jmx0O3RydW5jYXRlIGZpbGU9ImZvbyIgYWRqdXN0PSItMU0iLyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3RzdGFtcC5odG1sIGIvbWFudWFsL1Rhc2tzL3RzdGFtcC5odG1sCmluZGV4IDZiYWEwYzguLjE2NjEzOTIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy90c3RhbXAuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdHN0YW1wLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNTQgKzE1LDE0NCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VFN0YW1wIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InRzdGFtcCI+VHN0YW1wPC9hPjwvaDI+Cis8aDIgaWQ9InRzdGFtcCI+VHN0YW1wPC9oMj4KIAogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlNldHMgdGhlIDxjb2RlPkRTVEFNUDwvY29kZT4sIDxjb2RlPlRTVEFNUDwvY29kZT4sIGFuZCA8Y29kZT5UT0RBWTwvY29kZT4KLXByb3BlcnRpZXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC4gQnkgZGVmYXVsdCwKLXRoZSA8Y29kZT5EU1RBTVA8L2NvZGU+IHByb3BlcnR5IGlzIGluIHRoZQotZm9ybWF0ICZxdW90O3l5eXlNTWRkJnF1b3Q7LCA8Y29kZT5UU1RBTVA8L2NvZGU+IGlzIGluIHRoZQotZm9ybWF0ICZxdW90O2hobW0mcXVvdDssIGFuZCA8Y29kZT5UT0RBWTwvY29kZT4gaXMgaW4gdGhlCi1mb3JtYXQgJnF1b3Q7TU1NTSBkZCB5eXl5JnF1b3Q7LiBVc2UgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7Zm9ybWF0Jmd0OzwvY29kZT4gZWxlbWVudAotdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBmb3JtYXQuPC9wPgorPHA+U2V0cyB0aGUgPGNvZGU+RFNUQU1QPC9jb2RlPiwgPGNvZGU+VFNUQU1QPC9jb2RlPiwgYW5kIDxjb2RlPlRPREFZPC9jb2RlPiBwcm9wZXJ0aWVzIGluIHRoZQorY3VycmVudCBwcm9qZWN0LiBCeSBkZWZhdWx0LCB0aGUgPGNvZGU+RFNUQU1QPC9jb2RlPiBwcm9wZXJ0eSBpcyBpbiB0aGUKK2Zvcm1hdCA8cT55eXl5TU1kZDwvcT4sIDxjb2RlPlRTVEFNUDwvY29kZT4gaXMgaW4gdGhlIGZvcm1hdCA8cT5oaG1tPC9xPiwgYW5kIDxjb2RlPlRPREFZPC9jb2RlPiBpcworaW4gdGhlIGZvcm1hdCA8cT5NTU1NIGRkIHl5eXk8L3E+LiBVc2UgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7Zm9ybWF0Jmd0OzwvY29kZT4gZWxlbWVudCB0byBzcGVjaWZ5IGEKK2RpZmZlcmVudCBmb3JtYXQuPC9wPgogCi08cD5UaGVzZSBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIGluIHRoZSBidWlsZC1maWxlLCBmb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZQotdGltZS1zdGFtcGVkIGZpbGVuYW1lcywgb3IgdXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVyIHRhZ3MgaW5zaWRlIGRvY3VtZW50cwotdG8gaW5kaWNhdGUsIGZvciBleGFtcGxlLCB0aGUgcmVsZWFzZSBkYXRlLiBUaGUgYmVzdCBwbGFjZSBmb3IgdGhpcyB0YXNrIGlzCi1wcm9iYWJseSBpbiBhbiBpbml0aWFsaXphdGlvbiB0YXJnZXQuPC9wPgorPHA+VGhlc2UgcHJvcGVydGllcyBjYW4gYmUgdXNlZCBpbiB0aGUgYnVpbGQgZmlsZSwgZm9yIGluc3RhbmNlLCB0byBjcmVhdGUgdGltZXN0YW1wZWQgZmlsZW5hbWVzLCBvcgordXNlZCB0byByZXBsYWNlIHBsYWNlaG9sZGVyIHRhZ3MgaW5zaWRlIGRvY3VtZW50cyB0byBpbmRpY2F0ZSwgZm9yIGV4YW1wbGUsIHRoZSByZWxlYXNlIGRhdGUuIFRoZQorYmVzdCBwbGFjZSBmb3IgdGhpcyB0YXNrIGlzIHByb2JhYmx5IGluIGFuIGluaXRpYWxpemF0aW9uIHRhcmdldC48L3A+CiAKLTxwPjxlbT5TaW5jZSBBbnQgMS45LjEwPC9lbT4gdGhlIG1hZ2ljCi0gIHByb3BlcnR5IDxjb2RlPmFudC50c3RhbXAubm93PC9jb2RlPiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZml4ZWQKLSAgZGF0ZSB2YWx1ZSBpbiBvcmRlciB0byBjcmVhdGUgcmVwcm9kdWNpYmxlIGJ1aWxkcy4gSXRzIHZhbHVlIG11c3QgYmUKLSAgYSBudW1iZXIgYW5kIGlzIGludGVycHJldGVkIGFzIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtaWRuaWdodAotICAxOTcwLTAxLTAxKS48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+IHRoZSBtYWdpYyBwcm9wZXJ0eSA8Y29kZT5hbnQudHN0YW1wLm5vdzwvY29kZT4gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhCitmaXhlZCBkYXRlIHZhbHVlIGluIG9yZGVyIHRvIGNyZWF0ZSByZXByb2R1Y2libGUgYnVpbGRzLiBJdHMgdmFsdWUgbXVzdCBiZSBhIG51bWJlciBhbmQgaXMKK2ludGVycHJldGVkIGFzIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoIChtaWRuaWdodCAxOTcwLTAxLTAxKS4gV2l0aCA8Y29kZT5hbnQudHN0YW1wLm5vdy5pc288L2NvZGU+Cit5b3UgY291bGQgYWxzbyBzcGVjaWZ5IHRoYXQgdmFsdWUgaW4gSVNPLTg2MDEgZm9ybWF0ICg8Y29kZT4xOTcyLTA0LTE3VDA4OjA3OjAwWjwvY29kZT4pLiBJZiB5b3UKK3NwZWNpZnkgYSB2YWx1ZSBpbiBhbiBpbnZhbGlkIGZvcm1hdCBhbiBJTkZPIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQgYW5kIHRoZSB2YWx1ZSB3aWxsIGJlCitpZ25vcmVkLjwvcD4KKworPHA+CisgIDxlbT5TaW5jZSBBbnQgMS4xMC44PC9lbT4gdGhlIDxjb2RlPlNPVVJDRV9EQVRFX0VQT0NIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSAoaWYgc2V0KQorICB3aWxsIGJlIGhvbm91cmVkIGZvciA8YSBocmVmPSJodHRwczovL3JlcHJvZHVjaWJsZS1idWlsZHMub3JnL3NwZWNzL3NvdXJjZS1kYXRlLWVwb2NoLyNpZG01NSI+cmVwcm9kdWNpYmxlIGJ1aWxkczwvYT4uCisgIEFudCB3aWxsIGxvZyBhIERFQlVHIG1lc3NhZ2UgaWYgYW4gaW52YWxpZCB2YWx1ZSAodmFsdWUgdGhhdCBjYW5ub3QgYmUgcGFyc2VkIHRvIGFuIGludGVnZXIpLCBpcyBzcGVjaWZpZWQKKyAgZm9yIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHdpbGwgaW5zdGVhZCB1c2UgdGhlICJjdXJyZW50IiBkYXRlLgorPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5QcmVmaXggdXNlZCBmb3IgYWxsIHByb3BlcnRpZXMgc2V0LiBUaGUgZGVmYXVsdCBpcyBubyBwcmVmaXguPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQ+UHJlZml4IHVzZWQgZm9yIGFsbCBwcm9wZXJ0aWVzIHNldC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyBubyBwcmVmaXg8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Ci1UaGUgVHN0YW1wIHRhc2sgc3VwcG9ydHMgYSA8Y29kZT4mbHQ7Zm9ybWF0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgdGhhdAotYWxsb3dzIGEgcHJvcGVydHkgdG8gYmUgc2V0IHRvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4gYSBnaXZlbiBmb3JtYXQuCi1UaGUgZGF0ZS90aW1lIHBhdHRlcm5zIGFyZSBhcyBkZWZpbmVkIGluIHRoZSBKYXZhCi08YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvdGV4dC9TaW1wbGVEYXRlRm9ybWF0Lmh0bWwiPlNpbXBsZURhdGVGb3JtYXQ8L2E+IGNsYXNzLgotVGhlIGZvcm1hdCBlbGVtZW50IGFsc28gYWxsb3dzIG9mZnNldHMgdG8gYmUgYXBwbGllZCB0byB0aGUgdGltZSB0byBnZW5lcmF0ZSBkaWZmZXJlbnQgdGltZSB2YWx1ZXMuCi08YnI+PGJyPgotPHRhYmxlIHdpZHRoPSI2MCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorPHA+VGhlIHRhc2sgc3VwcG9ydHMgYSA8Y29kZT4mbHQ7Zm9ybWF0Jmd0OzwvY29kZT4gbmVzdGVkIGVsZW1lbnQgdGhhdCBhbGxvd3MgYSBwcm9wZXJ0eSB0byBiZSBzZXQKK3RvIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUgaW4gYSBnaXZlbiBmb3JtYXQuICBUaGUgZGF0ZS90aW1lIHBhdHRlcm5zIGFyZSBhcyBkZWZpbmVkIGluIHRoZQorSmF2YSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3RleHQvU2ltcGxlRGF0ZUZvcm1hdC5odG1sIgordGFyZ2V0PSJfdG9wIj5TaW1wbGVEYXRlRm9ybWF0PC9hPiBjbGFzcy4gIFRoZSBmb3JtYXQgZWxlbWVudCBhbHNvIGFsbG93cyBvZmZzZXRzIHRvIGJlIGFwcGxpZWQgdG8KK3RoZSB0aW1lIHRvIGdlbmVyYXRlIGRpZmZlcmVudCB0aW1lIHZhbHVlcy48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFRoZSBwcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBkYXRlL3RpbWUgc3RyaW5nIGluIHRoZSBnaXZlbiBwYXR0ZXJuLgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5wcm9wZXJ0eTwvdGQ+CisgICAgPHRkPlRoZSBwcm9wZXJ0eSB0byByZWNlaXZlIHRoZSBkYXRlL3RpbWUgc3RyaW5nIGluIHRoZSBnaXZlbiBwYXR0ZXJuLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRhdGUvdGltZSBwYXR0ZXJuIHRvIGJlIHVzZWQuIFRoZSB2YWx1ZXMgYXJlIGFzIGRlZmluZWQgYnkgdGhlIEphdmEgU2ltcGxlRGF0ZUZvcm1hdCBjbGFzcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGltZXpvbmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHRpbWV6b25lIHRvIHVzZSBmb3IgZGlzcGxheWluZyB0aW1lLiBUaGUgdmFsdWVzIGFyZSBhcyBkZWZpbmVkIGJ5IHRoZSBKYXZhIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS91dGlsL1RpbWVab25lLmh0bWwiPlRpbWVab25lPC9hPiBjbGFzcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vZmZzZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWVyaWMgb2Zmc2V0IHRvIHRoZSBjdXJyZW50IHRpbWU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bml0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1bml0IG9mIHRoZSBvZmZzZXQgdG8gYmUgYXBwbGllZCB0byB0aGUgY3VycmVudCB0aW1lLgotICAgICAgICAgICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbGxpc2Vjb25kPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5zZWNvbmQ8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbnV0ZTwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+aG91cjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+ZGF5PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT53ZWVrPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5tb250aDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+eWVhcjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICA8L3VsPgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2FsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbG9jYWxlIHVzZWQgdG8gY3JlYXRlIGRhdGUvdGltZSBzdHJpbmcuIFRoZSBnZW5lcmFsCi0gICAgICBmb3JtIGlzICZxdW90O2xhbmd1YWdlLCBjb3VudHJ5LCB2YXJpYW50JnF1b3Q7IGJ1dCBlaXRoZXIgdmFyaWFudCBvciB2YXJpYW50IGFuZAotICAgICAgY291bnRyeSBtYXkgYmUgb21pdHRlZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIGRvY3VtZW50YXRpb24KLSAgICAgIGZvciB0aGUKLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS91dGlsL0xvY2FsZS5odG1sIj5Mb2NhbGU8L2E+CisgICAgPHRkPnBhdHRlcm48L3RkPgorICAgIDx0ZD5UaGUgZGF0ZS90aW1lIHBhdHRlcm4gdG8gYmUgdXNlZC4gVGhlIHZhbHVlcyBhcmUgYXMgZGVmaW5lZCBieSB0aGUgSmF2YSBTaW1wbGVEYXRlRm9ybWF0CiAgICAgICBjbGFzcy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnRpbWV6b25lPC90ZD4KKyAgICA8dGQ+VGhlIHRpbWV6b25lIHRvIHVzZSBmb3IgZGlzcGxheWluZyB0aW1lLiBUaGUgdmFsdWVzIGFyZSBhcyBkZWZpbmVkIGJ5IHRoZQorICAgICAgSmF2YSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvVGltZVpvbmUuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+VGltZVpvbmU8L2E+IGNsYXNzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5vZmZzZXQ8L3RkPgorICAgIDx0ZD5UaGUgbnVtZXJpYyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgdGltZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD51bml0PC90ZD4KKyAgICA8dGQ+VGhlIHVuaXQgb2YgdGhlIG9mZnNldCB0byBiZSBhcHBsaWVkIHRvIHRoZSBjdXJyZW50IHRpbWUuICBWYWxpZCB2YWx1ZXMgYXJlCisgICAgICA8dWw+CisgICAgICAgIDxsaT48cT5taWxsaXNlY29uZDwvcT48L2xpPgorICAgICAgICA8bGk+PHE+c2Vjb25kPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5taW51dGU8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPmhvdXI8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPmRheTwvcT48L2xpPgorICAgICAgICA8bGk+PHE+d2VlazwvcT48L2xpPgorICAgICAgICA8bGk+PHE+bW9udGg8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPnllYXI8L3E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmxvY2FsZTwvdGQ+CisgICAgPHRkPlRoZSBsb2NhbGUgdXNlZCB0byBjcmVhdGUgZGF0ZS90aW1lIHN0cmluZy4gVGhlIGdlbmVyYWwgZm9ybSBpcyA8cT5sYW5ndWFnZVssIGNvdW50cnlbLAorICAgICAgdmFyaWFudF1dPC9xPiAoZWl0aGVyIDxxPnZhcmlhbnQ8L3E+IG9yIGJvdGggPHE+dmFyaWFudDwvcT4gYW5kIDxxPmNvdW50cnk8L3E+IG1heSBiZQorICAgICAgb21pdHRlZCkuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBkb2N1bWVudGF0aW9uIGZvcgorICAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9Mb2NhbGUuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+TG9jYWxlPC9hPiBjbGFzcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgogCi08cHJlPgotICAmbHQ7dHN0YW1wLyZndDsKLTwvcHJlPgorPHA+U2V0IHRoZSBzdGFuZGFyZCA8Y29kZT5EU1RBTVA8L2NvZGU+LCA8Y29kZT5UU1RBTVA8L2NvZGU+LCBhbmQgPGNvZGU+VE9EQVk8L2NvZGU+IHByb3BlcnRpZXMKK2FjY29yZGluZyB0byB0aGUgZGVmYXVsdCBmb3JtYXRzLjwvcD4KKzxwcmU+Jmx0O3RzdGFtcC8mZ3Q7PC9wcmU+CiAKLTxwPgotc2V0cyB0aGUgc3RhbmRhcmQgPGNvZGU+RFNUQU1QPC9jb2RlPiwgPGNvZGU+VFNUQU1QPC9jb2RlPiwKLWFuZCA8Y29kZT5UT0RBWTwvY29kZT4gcHJvcGVydGllcyBhY2NvcmRpbmcgdG8gdGhlIGRlZmF1bHQgZm9ybWF0cy48L3A+Cis8cD5TZXQgdGhlIHN0YW5kYXJkIHByb3BlcnRpZXMgYXMgd2VsbCBhcyB0aGUgcHJvcGVydHkgPGNvZGU+VE9EQVlfVUs8L2NvZGU+IHdpdGggdGhlIGRhdGUvdGltZQorcGF0dGVybiA8cT5kLU1NTU0teXl5eTwvcT4gdXNpbmcgRW5nbGlzaCBsb2NhbGUgKGVnLiAyMS1NYXktMjAwMSkuPC9wPgogPHByZT4KLSAgJmx0O3RzdGFtcCZndDsKKyZsdDt0c3RhbXAmZ3Q7CiAgICAgJmx0O2Zvcm1hdCBwcm9wZXJ0eT0mcXVvdDtUT0RBWV9HQiZxdW90OyBwYXR0ZXJuPSZxdW90O2QtTU1NTS15eXl5JnF1b3Q7IGxvY2FsZT0mcXVvdDtlbixHQiZxdW90Oy8mZ3Q7Ci0gICZsdDsvdHN0YW1wJmd0OwotPC9wcmU+Ci08cD4KLXNldHMgdGhlIHN0YW5kYXJkIHByb3BlcnRpZXMgYXMgd2VsbCBhcyB0aGUgcHJvcGVydHkKLTxjb2RlPlRPREFZX1VLPC9jb2RlPiB3aXRoIHRoZSBkYXRlL3RpbWUgcGF0dGVybiAmcXVvdDtkLU1NTU0teXl5eSZxdW90OwotdXNpbmcgRW5nbGlzaCBsb2NhbGUgKGVnLiAyMS1NYXktMjAwMSkuPC9wPgorJmx0Oy90c3RhbXAmZ3Q7PC9wcmU+CiAKKzxwPkNyZWF0ZSBhIHRpbWVzdGFtcCwgaW4gdGhlIHByb3BlcnR5IDxjb2RlPnRvdWNoLnRpbWU8L2NvZGU+LCA1IGhvdXJzIGJlZm9yZSB0aGUgY3VycmVudCB0aW1lLiBUaGUKK2Zvcm1hdCBpbiB0aGlzIGV4YW1wbGUgaXMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHRoZSA8Y29kZT4mbHQ7dG91Y2gmZ3Q7PC9jb2RlPiB0YXNrLiBUaGUgc3RhbmRhcmQKK3Byb3BlcnRpZXMgYXJlIHNldCBhbHNvLjwvcD4KIDxwcmU+Ci0gICZsdDt0c3RhbXAmZ3Q7Ci0gICAgICAmbHQ7Zm9ybWF0IHByb3BlcnR5PSZxdW90O3RvdWNoLnRpbWUmcXVvdDsgcGF0dGVybj0mcXVvdDtNTS9kZC95eXl5IGhoOm1tIGFhJnF1b3Q7Ci0gICAgICAgICAgICAgIG9mZnNldD0mcXVvdDstNSZxdW90OyB1bml0PSZxdW90O2hvdXImcXVvdDsvJmd0OwotICAmbHQ7L3RzdGFtcCZndDsKLTwvcHJlPgotPHA+Ci1DcmVhdGVzIGEgdGltZXN0YW1wLCBpbiB0aGUgcHJvcGVydHkgdG91Y2gudGltZSwgNSBob3VycyBiZWZvcmUgdGhlIGN1cnJlbnQgdGltZS4gVGhlIGZvcm1hdCBpbiB0aGlzIGV4YW1wbGUKLWlzIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUgPGNvZGU+Jmx0O3RvdWNoJmd0OzwvY29kZT4gdGFzay4gVGhlIHN0YW5kYXJkIHByb3BlcnRpZXMgYXJlIHNldCBhbHNvLjwvcD4KKyZsdDt0c3RhbXAmZ3Q7CisgICAgJmx0O2Zvcm1hdCBwcm9wZXJ0eT0mcXVvdDt0b3VjaC50aW1lJnF1b3Q7IHBhdHRlcm49JnF1b3Q7TU0vZGQveXl5eSBoaDptbSBhYSZxdW90OworICAgICAgICAgICAgb2Zmc2V0PSZxdW90Oy01JnF1b3Q7IHVuaXQ9JnF1b3Q7aG91ciZxdW90Oy8mZ3Q7CismbHQ7L3RzdGFtcCZndDs8L3ByZT4KIAotPHByZT4KLSAgJmx0O3RzdGFtcCBwcmVmaXg9InN0YXJ0Ii8mZ3Q7Ci08L3ByZT4KLTxwPgotU2V0cyB0aHJlZSBwcm9wZXJ0aWVzIHdpdGggdGhlIHN0YW5kYXJkIGZvcm1hdHMsIHByZWZpeGVkIHdpdGggInN0YXJ0LiI6Ci08Y29kZT5zdGFydC5EU1RBTVA8L2NvZGU+LCA8Y29kZT5zdGFydC5UU1RBTVA8L2NvZGU+LCBhbmQgPGNvZGU+c3RhcnQuVE9EQVk8L2NvZGU+LjwvcD4KLQotCi0KKzxwPlNldCB0aHJlZSBwcm9wZXJ0aWVzIHdpdGggdGhlIHN0YW5kYXJkIGZvcm1hdHMsIHByZWZpeGVkCit3aXRoIDxxPnN0YXJ0LjwvcT46IDxjb2RlPnN0YXJ0LkRTVEFNUDwvY29kZT4sIDxjb2RlPnN0YXJ0LlRTVEFNUDwvY29kZT4sCithbmQgPGNvZGU+c3RhcnQuVE9EQVk8L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O3RzdGFtcCBwcmVmaXg9InN0YXJ0Ii8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy90eXBlZGVmLmh0bWwgYi9tYW51YWwvVGFza3MvdHlwZWRlZi5odG1sCmluZGV4IGJkZDU4YTcuLjI0M2NlMDYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy90eXBlZGVmLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3R5cGVkZWYuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI1NiArMTUsMTg4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5UeXBlZGVmIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InR5cGVkZWYiPlR5cGVkZWY8L2E+PC9oMj4KKzxoMiBpZD0idHlwZWRlZiI+VHlwZWRlZjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotICA8cD4KLSAgICBBZGRzIGEgdGFzayBvciBhIGRhdGEgdHlwZSBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QKLSAgICBzdWNoIHRoYXQgdGhpcyBuZXcgdHlwZSBvciB0YXNrIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuCi0gIDwvcD4KLSAgPHA+Ci0gICAgQSBUYXNrIGlzIGFueSBjbGFzcyB0aGF0IGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayBvcgotICAgIGNhbiBiZSBhZGFwdGVkIGFzIGEgVGFzayB1c2luZyBhbiBhZGFwdGVyIGNsYXNzLgotICA8L3A+Ci0gIDxwPgotICAgIERhdGEgdHlwZXMgYXJlIHRoaW5ncyBsaWtlIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aHM8L2E+IG9yCi0gICAgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0czwvYT4gdGhhdCBjYW4gYmUgZGVmaW5lZCBhdAotICAgIHRoZSBwcm9qZWN0IGxldmVsIGFuZCByZWZlcmVuY2VkIHZpYSB0aGVpciBJRCBhdHRyaWJ1dGUuCi0gICAgQ3VzdG9tIGRhdGEgdHlwZXMgdXN1YWxseSBuZWVkIGN1c3RvbSB0YXNrcyB0byBwdXQgdGhlbSB0byBnb29kIHVzZS4KLSAgPC9wPgotICA8cD4KLSAgICBUd28gYXR0cmlidXRlcyBhcmUgbmVlZGVkIHRvIG1ha2UgYSBkZWZpbml0aW9uOiB0aGUgbmFtZSB0aGF0Ci0gICAgaWRlbnRpZmllcyB0aGlzIGRhdGEgdHlwZSB1bmlxdWVseSwgYW5kIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzCi0gICAgKGluY2x1ZGluZyBpdHMgcGFja2FnZSBuYW1lKSB0aGF0IGltcGxlbWVudHMgdGhpcyB0eXBlLgotICA8L3A+Ci0gIDxwPgotICAgIFlvdSBjYW4gYWxzbyBkZWZpbmUgYSBncm91cCBvZiBkZWZpbml0aW9ucyBhdCBvbmNlIHVzaW5nIHRoZSBmaWxlIG9yCi0gICAgcmVzb3VyY2UgYXR0cmlidXRlcy4gIFRoZXNlIGF0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZgotICAgIEphdmEgcHJvcGVydHkgZmlsZXMgb3IgYW4geG1sIGZvcm1hdC4KLSAgPC9wPgotICA8cD4KLSAgICBGb3IgcHJvcGVydHkgZmlsZXMgZWFjaCBsaW5lIGRlZmluZXMgYSBzaW5nbGUgZGF0YSB0eXBlIGluIHRoZQotICAgIGZvcm1hdDo8L3A+Ci0gIDxwcmU+Ci0gICAgdHlwZW5hbWU9ZnVsbHkucXVhbGlmaWVkLmphdmEuY2xhc3NuYW1lCi0gIDwvcHJlPgotICAgIAotICA8cD4KLSAgICBUaGUgeG1sIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlCi0gICAgPGEgaHJlZj0iLi4vVHlwZXMvYW50bGliLmh0bWwiPkFudGxpYjwvYT4gc2VjdGlvbi4KLSAgPC9wPgorPHA+QWRkcyBhIHRhc2sgb3IgYSBkYXRhIHR5cGUgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0IHN1Y2ggdGhhdCB0aGlzIG5ldyB0eXBlIG9yIHRhc2sgY2FuCitiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuPC9wPgorPHA+QSBUYXNrIGlzIGFueSBjbGFzcyB0aGF0IGV4dGVuZHMgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+IG9yIGNhbiBiZSBhZGFwdGVkCithcyBhIFRhc2sgdXNpbmcgYW4gYWRhcHRlciBjbGFzcy48L3A+Cis8cD5EYXRhIHR5cGVzIGFyZSB0aGluZ3MgbGlrZSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGhzPC9hPgorb3IgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0czwvYT4gdGhhdCBjYW4gYmUgZGVmaW5lZCBhdCB0aGUgcHJvamVjdCBsZXZlbCBhbmQKK3JlZmVyZW5jZWQgdmlhIHRoZWlyIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlLiAgQ3VzdG9tIGRhdGEgdHlwZXMgdXN1YWxseSBuZWVkIGN1c3RvbSB0YXNrcyB0byBwdXQKK3RoZW0gdG8gZ29vZCB1c2UuPC9wPgorPHA+VHdvIGF0dHJpYnV0ZXMgYXJlIG5lZWRlZCB0byBtYWtlIGEgZGVmaW5pdGlvbjogdGhlIG5hbWUgdGhhdCBpZGVudGlmaWVzIHRoaXMgZGF0YSB0eXBlIHVuaXF1ZWx5LAorYW5kIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGNsYXNzIChpbmNsdWRpbmcgaXRzIHBhY2thZ2UgbmFtZSkgdGhhdCBpbXBsZW1lbnRzIHRoaXMgdHlwZS48L3A+Cis8cD5Zb3UgY2FuIGFsc28gZGVmaW5lIGEgZ3JvdXAgb2YgZGVmaW5pdGlvbnMgYXQgb25jZSB1c2luZyB0aGUgZmlsZSBvciByZXNvdXJjZSBhdHRyaWJ1dGVzLiAgVGhlc2UKK2F0dHJpYnV0ZXMgcG9pbnQgdG8gZmlsZXMgaW4gdGhlIGZvcm1hdCBvZiBKYXZhIHByb3BlcnR5IGZpbGVzIG9yIGFuIHhtbCBmb3JtYXQuPC9wPgorPHA+Rm9yIHByb3BlcnR5IGZpbGVzIGVhY2ggbGluZSBkZWZpbmVzIGEgc2luZ2xlIGRhdGEgdHlwZSBpbiB0aGUgZm9ybWF0OjwvcD4KKzxwcmU+dHlwZW5hbWU9ZnVsbHkucXVhbGlmaWVkLmphdmEuY2xhc3NuYW1lPC9wcmU+Cis8cD5UaGUgeG1sIGZvcm1hdCBpcyBkZXNjcmliZWQgaW4gdGhlIDxhIGhyZWY9Ii4uL1R5cGVzL2FudGxpYi5odG1sIj5BbnRsaWI8L2E+IHNlY3Rpb24uPC9wPgogCi0gIDxwPklmIHlvdSBhcmUgZGVmaW5pbmcgdGFza3Mgb3IgdHlwZXMgdGhhdCBzaGFyZSB0aGUgc2FtZSBjbGFzc3BhdGgKLSAgICB3aXRoIG11bHRpcGxlIHRhc2tkZWYgb3IgdHlwZWRlZiB0YXNrcywgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NlcwotICAgIHdpbGwgYmUgbG9hZGVkIGJ5IGRpZmZlcmVudAotICAgIEphdmEgPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuaHRtbCI+Q2xhc3NMb2FkZXJzPC9hPi4KLSAgICBUd28gY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgbG9hZGVkIHZpYSBkaWZmZXJlbnQgQ2xhc3NMb2FkZXJzCi0gICAgYXJlIG5vdCB0aGUgc2FtZSBjbGFzcyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBKYXZhIFZNLCB0aGV5Ci0gICAgZG9uJ3Qgc2hhcmUgc3RhdGljIHZhcmlhYmxlcyBhbmQgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgY2FuJ3QKLSAgICBhY2Nlc3MgcHJpdmF0ZSBtZXRob2RzIG9yIGF0dHJpYnV0ZXMgb2YgaW5zdGFuY2VzIGRlZmluZWQgYnkgInRoZQotICAgIG90aGVyIGNsYXNzIiBvZiB0aGUgc2FtZSBuYW1lLiAgVGhleSBkb24ndCBldmVuIGJlbG9uZyB0byB0aGUgc2FtZQotICAgIEphdmEgcGFja2FnZSBhbmQgY2FuJ3QgYWNjZXNzIHBhY2thZ2UgcHJpdmF0ZSBjb2RlLCBlaXRoZXIuPC9wPgorPHA+SWYgeW91IGFyZSBkZWZpbmluZyB0YXNrcyBvciB0eXBlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIGNsYXNzcGF0aCB3aXRoCittdWx0aXBsZSA8Y29kZT50YXNrZGVmPC9jb2RlPiBvciA8Y29kZT50eXBlZGVmPC9jb2RlPiB0YXNrcywgdGhlIGNvcnJlc3BvbmRpbmcgY2xhc3NlcyB3aWxsIGJlCitsb2FkZWQgYnkgZGlmZmVyZW50CitKYXZhIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvbGFuZy9DbGFzc0xvYWRlci5odG1sIgordGFyZ2V0PSJfdG9wIj5DbGFzc0xvYWRlcnM8L2E+LiAgVHdvIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGxvYWRlZCB2aWEgZGlmZmVyZW50IENsYXNzTG9hZGVycworYXJlIG5vdCB0aGUgc2FtZSBjbGFzcyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIEpWTSwgdGhleSBkb24ndCBzaGFyZSBzdGF0aWMgdmFyaWFibGVzIGFuZAoraW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgY2FuJ3QgYWNjZXNzIHByaXZhdGUgbWV0aG9kcyBvciBhdHRyaWJ1dGVzIG9mIGluc3RhbmNlcyBkZWZpbmVkIGJ5ICJ0aGUKK290aGVyIGNsYXNzIiBvZiB0aGUgc2FtZSBuYW1lLiAgVGhleSBkb24ndCBldmVuIGJlbG9uZyB0byB0aGUgc2FtZSBKYXZhIHBhY2thZ2UgYW5kIGNhbid0IGFjY2VzcworcGFja2FnZSBwcml2YXRlIGNvZGUsIGVpdGhlci48L3A+CiAKLSAgPHA+VGhlIGJlc3Qgd2F5IHRvIGxvYWQgc2V2ZXJhbCB0YXNrcy90eXBlcyB0aGF0IGFyZSBzdXBwb3NlZCB0bwotICAgIGNvb3BlcmF0ZSB3aXRoIGVhY2ggb3RoZXIgdmlhIHNoYXJlZCBKYXZhIGNvZGUgaXMgdG8gdXNlIHRoZQotICAgIHJlc291cmNlIGF0dHJpYnV0ZSBhbmQgYW4gYW50bGliIGRlc2NyaXB0b3IuICBJZiB0aGlzIGlzIG5vdAotICAgIHBvc3NpYmxlLCB0aGUgc2Vjb25kIGJlc3Qgb3B0aW9uIGlzIHRvIHVzZSB0aGUgbG9hZGVycmVmIGF0dHJpYnV0ZQotICAgIGFuZCBzcGVjaWZ5IHRoZSBzYW1lIG5hbWUgZm9yIGVhY2ggYW5kIGV2ZXJ5IHR5cGVkZWYvdGFza2RlZiAtCi0gICAgdGhpcyB3YXkgdGhlIGNsYXNzZXMgd2lsbCBzaGFyZSB0aGUgc2FtZSBDbGFzc0xvYWRlci4gIE5vdGUgdGhhdAotICAgIHRoZSB0eXBlZGVmL3Rhc2tkZWYgdGFza3MgbXVzdCB1c2UgaWRlbnRpY2FsIGNsYXNzcGF0aCBkZWZpbml0aW9ucwotICAgICh0aGlzIGluY2x1ZGVzIHRoZSBvcmRlciBvZiBwYXRoIGNvbXBvbmVudHMpIGZvciB0aGUgbG9hZGVycmVmCi0gICAgYXR0cmlidXRlIHRvIHdvcmsuPC9wPgorPHA+VGhlIGJlc3Qgd2F5IHRvIGxvYWQgc2V2ZXJhbCB0YXNrcy90eXBlcyB0aGF0IGFyZSBzdXBwb3NlZCB0byBjb29wZXJhdGUgd2l0aCBlYWNoIG90aGVyIHZpYQorc2hhcmVkIEphdmEgY29kZSBpcyB0byB1c2UgdGhlIDx2YXI+cmVzb3VyY2U8L3Zhcj4gYXR0cmlidXRlIGFuZCBhbiA8Y29kZT5hbnRsaWI8L2NvZGU+IGRlc2NyaXB0b3IuCitJZiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgdGhlIHNlY29uZCBiZXN0IG9wdGlvbiBpcyB0byB1c2UgdGhlIDx2YXI+bG9hZGVycmVmPC92YXI+IGF0dHJpYnV0ZSBhbmQKK3NwZWNpZnkgdGhlIHNhbWUgbmFtZSBmb3IgZWFjaCBhbmQgZXZlcnkgPGNvZGU+dHlwZWRlZjwvY29kZT4vPGNvZGU+dGFza2RlZjwvY29kZT4mbWRhc2g7dGhpcyB3YXkKK3RoZSBjbGFzc2VzIHdpbGwgc2hhcmUgdGhlIHNhbWUgPGNvZGU+Q2xhc3NMb2FkZXI8L2NvZGU+LiAgTm90ZSB0aGF0Cit0aGUgPGNvZGU+dHlwZWRlZjwvY29kZT4vPGNvZGU+dGFza2RlZjwvY29kZT4gdGFza3MgbXVzdCB1c2UgaWRlbnRpY2FsIGNsYXNzcGF0aCBkZWZpbml0aW9ucyAodGhpcworaW5jbHVkZXMgdGhlIG9yZGVyIG9mIHBhdGggY29tcG9uZW50cykgZm9yIHRoZSA8dmFyPmxvYWRlcnJlZjwvdmFyPiBhdHRyaWJ1dGUgdG8gd29yay48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgZGF0YSB0eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIHRoZSBmaWxlIG9yIHJlc291cmNlIHR5cGUKLSAgICAgIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIGRhdGEgdHlwZTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPlllcywgdW5sZXNzIDx2YXI+ZmlsZTwvdmFyPiBvciA8dmFyPnJlc291cmNlPC92YXI+IGF0dHJpYnV0ZXMgaGF2ZSBiZWVuCisgICAgICBzcGVjaWZpZWQuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmdWxsIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIHRoZSBkYXRhIHR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgZmlsZSBvciByZXNvdXJjZQotICAgICAgaGF2ZSBiZWVuIHNwZWNpZmllZC48L3RkPgorICAgIDx0ZD5jbGFzc25hbWU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+dGhlIGZ1bGwgY2xhc3MgbmFtZSBpbXBsZW1lbnRpbmcgdGhlIGRhdGEgdHlwZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiB0aGUgZmlsZSB0byBsb2FkIGRlZmluaXRpb25zIGZyb20uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgdGhlIGZpbGUgdG8gbG9hZCBkZWZpbml0aW9ucyBmcm9tLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVzb3VyY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBOYW1lIG9mIHRoZSByZXNvdXJjZSB0byBsb2FkIGRlZmluaXRpb25zIGZyb20uCi0gICAgICBJZiBtdWx0aXBsZSByZXNvdXJjZXMgYnkgdGhpcyBuYW1lIGFyZSBmb3VuZCBhbG9uZyB0aGUgY2xhc3NwYXRoLAotICAgICAgYW5kIHRoZSBmb3JtYXQgaXMgInByb3BlcnRpZXMiLCB0aGUgZmlyc3QgcmVzb3VyY2Ugd2lsbCBiZSBsb2FkZWQ7Ci0gICAgICBvdGhlcndpc2UgYWxsIHN1Y2ggcmVzb3VyY2VzIHdpbGwgYmUgbG9hZGVkLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlc291cmNlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gbG9hZCBkZWZpbml0aW9ucyBmcm9tLiAgSWYgbXVsdGlwbGUgcmVzb3VyY2VzIGJ5IHRoaXMgbmFtZSBhcmUgZm91bmQKKyAgICAgIGFsb25nIHRoZSBjbGFzc3BhdGgsIGFuZCA8dmFyPmZvcm1hdDwvdmFyPiBpcyA8cT5wcm9wZXJ0aWVzPC9xPiwgdGhlIGZpcnN0IHJlc291cmNlIHdpbGwgYmUKKyAgICAgIGxvYWRlZDsgb3RoZXJ3aXNlIGFsbCBzdWNoIHJlc291cmNlcyB3aWxsIGJlIGxvYWRlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvcm1hdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZm9ybWF0IG9mIHRoZSBmaWxlIG9yIHJlc291cmNlLiBUaGUgdmFsdWVzCi0gICAgICBhcmUgInByb3BlcnRpZXMiIG9yICJ4bWwiLiBJZiB0aGUgdmFsdWUgaXMgInByb3BlcnRpZXMiIHRoZSBmaWxlL3Jlc291cmNlCi0gICAgICBpcyBhIHByb3BlcnR5IGZpbGUgY29udGFpbnMgbmFtZSB0byBjbGFzc25hbWUgcGFpcnMuIElmIHRoZSB2YWx1ZQotICAgICAgaXMgInhtbCIsIHRoZSBmaWxlL3Jlc291cmNlIGlzIGFuIHhtbCBmaWxlL3Jlc291cmNlIHN0cnVjdHVyZWQgYWNjb3JkaW5nCi0gICAgICB0byA8YSBocmVmPSIuLi9UeXBlcy9hbnRsaWIuaHRtbCI+QW50bGliPC9hPi4KLSAgICAgIFRoZSBkZWZhdWx0IGlzICJwcm9wZXJ0aWVzIiB1bmxlc3MgdGhlIGZpbGUvcmVzb3VyY2UgbmFtZSBlbmRzIHdpdGgKLSAgICAgICIueG1sIiwgaW4gd2hpY2ggY2FzZSB0aGUgZm9ybWF0IGF0dHJpYnV0ZSB3aWxsIGhhdmUgdGhlIHZhbHVlICJ4bWwiLgotICAgICAgPGI+c2luY2UgQXBhY2hlIEFudCAxLjY8L2I+Ci0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Zm9ybWF0PC90ZD4KKyAgICA8dGQ+VGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBvciByZXNvdXJjZS4gVGhlIHZhbHVlcyBhcmUgPHE+cHJvcGVydGllczwvcT4iIG9yIDxxPnhtbDwvcT4uIElmIHRoZQorICAgICAgdmFsdWUgaXMgPHE+cHJvcGVydGllczwvcT4gdGhlIGZpbGUvcmVzb3VyY2UgaXMgYSBwcm9wZXJ0eSBmaWxlIGNvbnRhaW5zIG5hbWUtY2xhc3NuYW1lCisgICAgICBwYWlycy4gSWYgdGhlIHZhbHVlIGlzIDxxPnhtbDwvcT4sIHRoZSBmaWxlL3Jlc291cmNlIGlzIGFuIFhNTCBmaWxlL3Jlc291cmNlIHN0cnVjdHVyZWQKKyAgICAgIGFjY29yZGluZyB0byA8YSBocmVmPSIuLi9UeXBlcy9hbnRsaWIuaHRtbCI+QW50bGliPC9hPi4gIFRoZSBkZWZhdWx0IGlzIDxxPnByb3BlcnRpZXM8L3E+CisgICAgICB1bmxlc3MgdGhlIGZpbGUvcmVzb3VyY2UgbmFtZSBlbmRzIHdpdGggPHNhbXA+LnhtbDwvc2FtcD4sIGluIHdoaWNoIGNhc2UgdGhlIDx2YXI+Zm9ybWF0PC92YXI+CisgICAgICBhdHRyaWJ1dGUgd2lsbCBoYXZlIHRoZSB2YWx1ZSA8cT54bWw8L3E+LiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4gPHRkIHZhbGlnbj0idG9wIj50aGUgY2xhc3NwYXRoIHRvCi0gICAgICB1c2Ugd2hlbiBsb29raW5nIHVwIDxjb2RlPmNsYXNzbmFtZTwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRoPC90ZD4KKyAgICA8dGQ+dGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIDx2YXI+Y2xhc3NuYW1lPC92YXI+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgYSByZWZlcmVuY2UgdG8gYSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCA8Y29kZT5jbGFzc25hbWU8L2NvZGU+LgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPmEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgPHZhcj5jbGFzc25hbWU8L3Zhcj4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2FkZXJSZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGlzCi0gICAgICB1c2VkIHRvIGxvYWQgdGhlIGNsYXNzLCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoLiBVc2UKLSAgICAgIHRoaXMgdG8gYWxsb3cgbXVsdGlwbGUgdGFza3MvdHlwZXMgdG8gYmUgbG9hZGVkIHdpdGggdGhlIHNhbWUgbG9hZGVyLAotICAgICAgc28gdGhleSBjYW4gY2FsbCBlYWNoIG90aGVyLiA8Yj5zaW5jZSBBbnQgMS41PC9iPiA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5sb2FkZXJSZWY8L3RkPgorICAgIDx0ZD50aGUgbmFtZSBvZiB0aGUgbG9hZGVyIHRoYXQgaXMgdXNlZCB0byBsb2FkIHRoZSBjbGFzcywgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3BlY2lmaWVkCisgICAgICBjbGFzc3BhdGguIFVzZSB0aGlzIHRvIGFsbG93IG11bHRpcGxlIHRhc2tzL3R5cGVzIHRvIGJlIGxvYWRlZCB3aXRoIHRoZSBzYW1lIGxvYWRlciwgc28gdGhleQorICAgICAgY2FuIGNhbGwgZWFjaCBvdGhlci4gPGVtPlNpbmNlIEFudCAxLjU8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b25lcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYWN0aW9uIHRvIHRha2UgaWYgdGhlcmUgd2FzIGEgZmFpbHVyZSBpbiBkZWZpbmluZyB0aGUKLSAgICAgIHR5cGUuIFRoZSB2YWx1ZXMgYXJlIDxpPmZhaWw8L2k+OiBjYXVzZSBhIGJ1aWxkIGV4Y2VwdGlvbjsgPGk+cmVwb3J0PC9pPjoKLSAgICAgIG91dHB1dCBhIHdhcm5pbmcsIGJ1dCBjb250aW51ZTsgPGk+aWdub3JlPC9pPjogZG8gbm90aGluZy4KLSAgICAgIDxiPnNpbmNlIEFudCAxLjY8L2I+Ci0gICAgICBBbiBhZGRpdGlvbmFsIHZhbHVlIGlzIDxpPmZhaWxhbGw8L2k+OiBjYXVzZSBhbGwgYmVoYXZpb3Igb2YgZmFpbCwKLSAgICAgIGFzIHdlbGwgYXMgYSBidWlsZCBleGNlcHRpb24gZm9yIHRoZSByZXNvdXJjZSBvciBmaWxlIGF0dHJpYnV0ZQotICAgICAgaWYgdGhlIHJlc291cmNlIG9yIGZpbGUgaXMgbm90IGZvdW5kLiA8Yj5zaW5jZSBBbnQgMS43PC9iPgotICAgICAgVGhlIGRlZmF1bHQgaXMgPGk+ZmFpbDwvaT4uCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+b25lcnJvcjwvdGQ+CisgICAgPHRkPlRoZSBhY3Rpb24gdG8gdGFrZSBpZiB0aGVyZSB3YXMgYSBmYWlsdXJlIGluIGRlZmluaW5nIHRoZSB0eXBlLiBUaGUgdmFsdWVzIGFyZSA8cT5mYWlsPC9xPjoKKyAgICAgIGNhdXNlIGEgYnVpbGQgZXhjZXB0aW9uOyA8cT5yZXBvcnQ8L3E+OiBvdXRwdXQgYSB3YXJuaW5nLCBidXQgY29udGludWU7IDxxPmlnbm9yZTwvcT46IGRvCisgICAgICBub3RoaW5nLiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPiwgYW4gYWRkaXRpb25hbCB2YWx1ZSBpcyA8cT5mYWlsYWxsPC9xPjogY2F1c2UgYWxsIGJlaGF2aW9yIG9mCisgICAgICBmYWlsLCBhcyB3ZWxsIGFzIGEgYnVpbGQgZXhjZXB0aW9uIGZvciB0aGUgcmVzb3VyY2Ugb3IgZmlsZSBhdHRyaWJ1dGUgaWYgdGhlIHJlc291cmNlIG9yIGZpbGUKKyAgICAgIGlzIG5vdCBmb3VuZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWlsPC9xPiAoPGVtPnNpbmNlIEFudCAxLjc8L2VtPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hZGFwdGVyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGFkYXB0IHRoZSBkZWZpbmVkIGNsYXNzIHRvCi0gICAgICBhbm90aGVyIGludGVyZmFjZS9jbGFzcy4gVGhlIGFkYXB0ZXIgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlIGludGVyZmFjZQotICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LlR5cGVBZGFwdGVyIi4gVGhlIGFkYXB0ZXIgY2xhc3Mgd2lsbCBiZSB1c2VkCi0gICAgICB0byB3cmFwIHRoZSBkZWZpbmVkIGNsYXNzIHVubGVzcyB0aGUgZGVmaW5lZCBjbGFzcyBpbXBsZW1lbnRzL2V4dGVuZHMKLSAgICAgIHRoZSBjbGFzcyBkZWZpbmVkIGJ5IHRoZSBhdHRyaWJ1dGUgImFkYXB0dG8iLgotICAgICAgSWYgImFkYXB0dG8iIGlzIG5vdCBzZXQsIHRoZSBkZWZpbmVkIGNsYXNzIHdpbGwgYWx3YXlzIGJlIHdyYXBwZWQuCi0gICAgICA8Yj5zaW5jZSBBbnQgMS42PC9iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmFkYXB0ZXI8L3RkPgorICAgIDx0ZD5BIGNsYXNzIHRoYXQgaXMgdXNlZCB0byBhZGFwdCB0aGUgZGVmaW5lZCBjbGFzcyB0byBhbm90aGVyIGludGVyZmFjZS9jbGFzcy4gVGhlIGFkYXB0ZXIKKyAgICAgIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXI8L2NvZGU+LiBUaGUgYWRhcHRlcgorICAgICAgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIHdyYXAgdGhlIGRlZmluZWQgY2xhc3MgdW5sZXNzIHRoZSBkZWZpbmVkIGNsYXNzIGltcGxlbWVudHMvZXh0ZW5kcyB0aGUKKyAgICAgIGNsYXNzIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSA8cT5hZGFwdHRvPC9xPi4gIElmIDxxPmFkYXB0dG88L3E+IGlzIG5vdCBzZXQsIHRoZSBkZWZpbmVkCisgICAgICBjbGFzcyB3aWxsIGFsd2F5cyBiZSB3cmFwcGVkLiAgPGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWRhcHR0bzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCi0gICAgICBhZGFwdGVyIGF0dHJpYnV0ZS4KLSAgICAgIElmIHRoZSBkZWZpbmVkIGNsYXNzIGRvZXMgbm90IGltcGxlbWVudC9leHRlbmQgdGhlIGludGVyZmFjZS9jbGFzcwotICAgICAgc3BlY2lmaWVkIGJ5IHRoaXMgYXR0cmlidXRlLCB0aGUgYWRhcHRvciBjbGFzcyB3aWxsIGJlIHVzZWQKLSAgICAgIHRvIHdyYXAgdGhlIGNsYXNzLiA8Yj5zaW5jZSBBbnQgMS42PC9iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmFkYXB0dG88L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFkYXB0ZXIgYXR0cmlidXRlLiAgSWYgdGhlIGRlZmluZWQgY2xhc3MgZG9lcworICAgICAgbm90IGltcGxlbWVudC9leHRlbmQgdGhlIGludGVyZmFjZS9jbGFzcyBzcGVjaWZpZWQgYnkgdGhpcyBhdHRyaWJ1dGUsIHRoZSBhZGFwdG9yIGNsYXNzIHdpbGwKKyAgICAgIGJlIHVzZWQgdG8gd3JhcCB0aGUgY2xhc3MuIDxlbT5TaW5jZSBBbnQgMS42PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVyaTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uCi0gICAgICA8Yj5zaW5jZSBBbnQgMS42PC9iPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnVyaTwvdGQ+CisgICAgPHRkPlRoZSB1cmkgdGhhdCB0aGlzIGRlZmluaXRpb24gc2hvdWxkIGxpdmUgaW4uICA8ZW0+U2luY2UgQW50IDEuNjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLSAgPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci0gIDxoND5jbGFzc3BhdGg8L2g0PgotICA8cD48Y29kZT5UeXBlZGVmPC9jb2RlPidzIDxpPmNsYXNzcGF0aDwvaT4gYXR0cmlidXRlIGlzIGEgCi0gICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0Ci0gICAgdmlhIGEgbmVzdGVkIDxpPmNsYXNzcGF0aDwvaT4gZWxlbWVudC48L3A+Cis8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoND5jbGFzc3BhdGg8L2g0PgorPHA+PGNvZGU+VHlwZWRlZjwvY29kZT4ncyA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhdHRyaWJ1dGUgaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUgc2V0IHZpYSBhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnQuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotICBUaGUgZm9sbG93aW5nIGZyYWdtZW50IGRlZmluZXMgZGVmaW5lIGEgdHlwZSBjYWxsZWQgPGk+dXJsc2V0PC9pPi4KLSAgPHByZT4KLSAgICAmbHQ7dHlwZWRlZiBuYW1lPSJ1cmxzZXQiIGNsYXNzbmFtZT0iY29tLm15ZG9tYWluLlVSTFNldCIvJmd0OyA8L3ByZT4KLSAgVGhlIGRhdGEgdHlwZSBpcyBub3cgYXZhaWxhYmxlIHRvIEFudC4gVGhlCi0gIGNsYXNzIDxjb2RlPmNvbS5teWRvbWFpbi5VUkxTZXQ8L2NvZGU+IGltcGxlbWVudHMgdGhpcyB0eXBlLjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgZGVmaW5lcyBkZWZpbmUgYSB0eXBlIGNhbGxlZCA8Y29kZT51cmxzZXQ8L2NvZGU+LjwvcD4KKzxwcmU+Jmx0O3R5cGVkZWYgbmFtZT0idXJsc2V0IiBjbGFzc25hbWU9ImNvbS5teWRvbWFpbi5VUkxTZXQiLyZndDs8L3ByZT4KKzxwPlRoZSBkYXRhIHR5cGUgaXMgbm93IGF2YWlsYWJsZSB0byBBbnQuIFRoZSBjbGFzcyA8Y29kZT5jb20ubXlkb21haW4uVVJMU2V0PC9jb2RlPiBpbXBsZW1lbnRzIHRoaXMKK3R5cGUuPC9wPgogCis8cD5Bc3N1bWluZyBhIGNsYXNzIDxjb2RlPm9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXI8L2NvZGU+IHRoYXQKK2V4dGVuZHMgPGNvZGUgY2xhc3M9ImNvZGUiPlRhc2s8L2NvZGU+IGFuZAoraW1wbGVtZW50cyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXI8L2NvZGU+LCBhbmQgaW4KK3RoZSA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZSgpPC9jb2RlPiBtZXRob2QgaW52b2tlcyA8Y29kZSBjbGFzcz0iY29kZSI+cnVuKCk8L2NvZGU+IG9uIHRoZQorcHJveGllZCBvYmplY3QsIG9uZSBtYXkgdXNlIGEgPGNvZGUgY2xhc3M9ImNvZGUiPlJ1bm5hYmxlPC9jb2RlPiBjbGFzcyBhcyBhbiBBbnQgdGFzay4gVGhlIGZvbGxvd2luZworZnJhZ21lbnQgZGVmaW5lcyBhIHRhc2sgY2FsbGVkIDxjb2RlPnJ1bmNsb2NrPC9jb2RlPi48L3A+Cis8cHJlPgorJmx0O3R5cGVkZWYgbmFtZT0icnVuY2xvY2siCisgICAgICAgICBjbGFzc25hbWU9ImNvbS5hY21lLmFudC5SdW5DbG9jayIKKyAgICAgICAgIGFkYXB0ZXI9Im9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXIiLyZndDs8L3ByZT4KIAotICA8cD4KLSAgICBBc3N1bWluZyBhIGNsYXNzIDxpPm9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXI8L2k+IHRoYXQKLSAgICBleHRlbmRzIFRhc2sgYW5kIGltcGxlbWVudHMgPGk+b3JnLmFwYWNoZS50b29scy5hbnQuVHlwZUFkYXB0ZXI8L2k+LAotICAgIGFuZCBpbiB0aGUgZXhlY3V0ZSBtZXRob2QgaW52b2tlcyA8aT5ydW48L2k+IG9uIHRoZSBwcm94aWVkIG9iamVjdCwKLSAgICBvbmUgbWF5IHVzZSBhIFJ1bm5hYmxlIGNsYXNzIGFzIGFuIEFudCB0YXNrLiBUaGUgZm9sbG93aW5nIGZyYWdtZW50Ci0gICAgZGVmaW5lcyBhIHRhc2sgY2FsbGVkIDxpPnJ1bmNsb2NrPC9pPi4KLSAgPC9wPgotICA8cHJlPgotICAgICZsdDt0eXBlZGVmIG5hbWU9InJ1bmNsb2NrIgotICAgICAgICAgICAgIGNsYXNzbmFtZT0iY29tLmFjbWUuYW50LlJ1bkNsb2NrIgotICAgICAgICAgICAgIGFkYXB0ZXI9Im9yZy5hY21lLmFudC5SdW5uYWJsZUFkYXB0ZXIiLyZndDsKLSAgPC9wcmU+Cis8cD5UaGUgZm9sbG93aW5nIGZyYWdtZW50IHNob3dzIHRoZSB1c2Ugb2YgdGhlIDx2YXI+Y2xhc3NwYXRocmVmPC92YXI+IGFuZCA8dmFyPmxvYWRlcnJlZjwvdmFyPiB0bworbG9hZCB1cCB0d28gZGVmaW5pdGlvbnMuPC9wPgorPHByZT4KKyZsdDtwYXRoIGlkPSJsaWIucGF0aCImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIiIGluY2x1ZGVzPSJsaWIvKi5qYXIiLyZndDsKKyZsdDsvcGF0aCZndDsKIAorJmx0O3R5cGVkZWYgbmFtZT0iZmlsdGVyMSIKKyAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFjbWUuZmlsdGVycy5GaWx0ZXIxIgorICAgICAgICAgY2xhc3NwYXRocmVmPSJsaWIucGF0aCIKKyAgICAgICAgIGxvYWRlcnJlZj0ibGliLnBhdGgubG9hZGVyIi8mZ3Q7CismbHQ7dHlwZWRlZiBuYW1lPSJmaWx0ZXIyIgorICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYWNtZS5maWx0ZXJzLkZpbHRlcjIiCisgICAgICAgICBsb2FkZXJyZWY9ImxpYi5wYXRoLmxvYWRlciIvJmd0OzwvcHJlPgogCi0gIDxwPgotICAgIFRoZSBmb2xsb3dpbmcgZnJhZ21lbnQgc2hvd3MgdGhlIHVzZSBvZiB0aGUgY2xhc3NwYXRocmVmIGFuZAotICAgIGxvYWRlcnJlZiB0byBsb2FkIHVwIHR3byBkZWZpbml0aW9ucy4KLSAgPC9wPgotICA8cHJlPgotICAgICZsdDtwYXRoIGlkPSJsaWIucGF0aCImZ3Q7Ci0gICAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiIgaW5jbHVkZXM9ImxpYi8qLmphciIvJmd0OwotICAgICZsdDsvcGF0aCZndDsKLQotICAgICZsdDt0eXBlZGVmIG5hbWU9ImZpbHRlcjEiCi0gICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYWNtZS5maWx0ZXJzLkZpbHRlcjEiCi0gICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJsaWIucGF0aCIKLSAgICAgICAgICAgICBsb2FkZXJyZWY9ImxpYi5wYXRoLmxvYWRlciIKLSAgICAgICAgICAgICAvJmd0OwotICAgICZsdDt0eXBlZGVmIG5hbWU9ImZpbHRlcjIiCi0gICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYWNtZS5maWx0ZXJzLkZpbHRlcjIiCi0gICAgICAgICAgICAgbG9hZGVycmVmPSJsaWIucGF0aC5sb2FkZXIiCi0gICAgICAgICAgICAgLyZndDsKLSAgPC9wcmU+Ci0gIAotICAKLSAgPHA+Ci0gICAgSWYgeW91IHdhbnQgdG8gbG9hZCBhbiBhbnRsaWIgaW50byBhIHNwZWNpYWwgeG1sLW5hbWVzcGFjZSwgdGhlIDx0dD51cmk8L3R0PiBhdHRyaWJ1dGUKLSAgICBpcyBpbXBvcnRhbnQ6Ci0gIDwvcD4KLSAgPHByZT4KLSAgJmx0O3Byb2plY3QgeG1sbnM6YW50Y29udHJpYj0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIiZndDsKKzxwPklmIHlvdSB3YW50IHRvIGxvYWQgYW4gYW50bGliIGludG8gYSBzcGVjaWFsIFhNTCBuYW1lc3BhY2UsIHRoZSA8dmFyPnVyaTwvdmFyPiBhdHRyaWJ1dGUgaXMKK2ltcG9ydGFudDo8L3A+Cis8cHJlPgorJmx0O3Byb2plY3QgeG1sbnM6YW50Y29udHJpYj0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIiZndDsKICAgICAgJmx0O3Rhc2tkZWYgdXJpPSJhbnRsaWI6bmV0LnNmLmFudGNvbnRyaWIiCiAgICAgICAgICAgICAgIHJlc291cmNlPSJuZXQvc2YvYW50Y29udHJpYi9hbnRsaWIueG1sIgotICAgICAgICAgICAgICBjbGFzc3BhdGg9InBhdGgvdG8vYW50LWNvbnRyaWIuamFyIi8mZ3Q7Ci0gIDwvcHJlPgotICAgICAgICAgICAgCi08cD5IZXJlIHRoZSBuYW1lc3BhY2UKLSAgZGVjbGFyYXRpb24gPGNvZGU+eG1sbnM6YW50Y29udHJpYj0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIjwvY29kZT4KLSAgYWxsb3dzIHRhc2tzIGFuZCB0eXBlcyBvZiB0aGUgQW50Q29udHJpYiBBbnRsaWIgdG8gYmUgdXNlZCB3aXRoIHRoZQotICA8Y29kZT5hbnRjb250cmliPC9jb2RlPiBwcmVmaXgKLSAgbGlrZSA8Y29kZT4mbHQ7YW50Y29udHJpYjppZiZndDs8L2NvZGU+LgotICBUaGUgbm9ybWFsIHJ1bGVzIG9mIFhNTCBuYW1lc3BhY2VzIGFwcGx5IGFuZCB5b3UgY2FuIGRlY2xhcmUgdGhlCi0gIHByZWZpeCBhdCBhbnkgZWxlbWVudCB0byBtYWtlIGl0IHVzYWJsZSBmb3IgdGhlIGVsZW1lbnQgaXQgaXMKLSAgZGVjbGFyZWQgb24gYXMgd2VsbCBhcyBhbGwgaXRzIGNoaWxkIGVsZW1lbnRzLjwvcD4KKyAgICAgICAgICAgICAgY2xhc3NwYXRoPSJwYXRoL3RvL2FudC1jb250cmliLmphciIvJmd0OzwvcHJlPgogCis8cD5IZXJlIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gPGNvZGU+eG1sbnM6YW50Y29udHJpYj0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIjwvY29kZT4gYWxsb3dzCit0YXNrcyBhbmQgdHlwZXMgb2YgdGhlIEFudC1Db250cmliIEFudGxpYiB0byBiZSB1c2VkIHdpdGggdGhlIDxzYW1wPmFudGNvbnRyaWI8L3NhbXA+IHByZWZpeAorbGlrZSA8Y29kZT4mbHQ7YW50Y29udHJpYjppZiZndDs8L2NvZGU+LiAgVGhlIG5vcm1hbCBydWxlcyBvZiBYTUwgbmFtZXNwYWNlcyBhcHBseSBhbmQgeW91IGNhbgorZGVjbGFyZSB0aGUgcHJlZml4IGF0IGFueSBlbGVtZW50IHRvIG1ha2UgaXQgdXNhYmxlIGZvciB0aGUgZWxlbWVudCBpdCBpcyBkZWNsYXJlZCBvbiBhcyB3ZWxsIGFzIGFsbAoraXRzIGNoaWxkIGVsZW1lbnRzLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvdW5wYWNrLmh0bWwgYi9tYW51YWwvVGFza3MvdW5wYWNrLmh0bWwKaW5kZXggZGNjODhhOS4uODlmZmY1NSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3VucGFjay5odG1sCisrKyBiL21hbnVhbC9UYXNrcy91bnBhY2suaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwNCArMTUsOTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkdVbnppcC9CVW56aXAyIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InVucGFjayI+R1VuemlwL0JVbnppcDI8L2E+PC9oMj4KKzxoMiBpZD0idW5wYWNrIj5HVW56aXAvQlVuemlwMi9VblhaPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5FeHBhbmRzIGEgcmVzb3VyY2UgcGFja2VkIHVzaW5nIEdaaXAgb3IgQlppcDIuPC9wPgorPHA+RXhwYW5kcyBhIHJlc291cmNlIHBhY2tlZCB1c2luZyBHWmlwLCBCWmlwMiBvciBYWi48L3A+CiAKLTxwPklmIDxpPmRlc3Q8L2k+IGlzIGEgZGlyZWN0b3J5IHRoZSBuYW1lIG9mIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzCi10aGUgc2FtZSBhcyA8aT5zcmM8L2k+ICh3aXRoIHRoZSAmcXVvdDsuZ3omcXVvdDsgb3IgJnF1b3Q7LmJ6MiZxdW90OwotZXh0ZW5zaW9uIHJlbW92ZWQgaWYgcHJlc2VudCkuIElmIDxpPmRlc3Q8L2k+IGlzIG9taXR0ZWQsIHRoZSBwYXJlbnQKLWRpciBvZiA8aT5zcmM8L2k+IGlzIHRha2VuLiBUaGUgZmlsZSBpcyBvbmx5IGV4cGFuZGVkIGlmIHRoZSBzb3VyY2UKLXJlc291cmNlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUsIG9yIHdoZW4gdGhlIGRlc3RpbmF0aW9uIGZpbGUKLWRvZXMgbm90IGV4aXN0LjwvcD4KKzxwPklmIDx2YXI+ZGVzdDwvdmFyPiBpcyBhIGRpcmVjdG9yeSB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyB0aGUgc2FtZSBhcyA8dmFyPnNyYzwvdmFyPgorKHdpdGggdGhlIDxxPi5nejwvcT4sIDxxPi5iejI8L3E+IG9yIDxxPi54ejwvcT4gZXh0ZW5zaW9uIHJlbW92ZWQgaWYgcHJlc2VudCkuIElmIDx2YXI+ZGVzdDwvdmFyPiBpcworb21pdHRlZCwgdGhlIHBhcmVudCBkaXIgb2YgPHZhcj5zcmM8L3Zhcj4gaXMgdGFrZW4uIFRoZSBmaWxlIGlzIG9ubHkgZXhwYW5kZWQgaWYgdGhlIHNvdXJjZSByZXNvdXJjZQoraXMgbmV3ZXIgdGhhbiB0aGUgZGVzdGluYXRpb24gZmlsZSwgb3Igd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBleGlzdC48L3A+CisKKzxwPlhaIGNvbXByZXNzaW9uIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQgPGVtPnNpbmNlIEFwYWNoZSBBbnQgMS4xMC4xPC9lbT4gYW5kIGRlcGVuZHMgb24gZXh0ZXJuYWwKK2xpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFudCBkaXN0cmlidXRpb24uCitTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBmaWxlIHRvIGV4cGFuZC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzLCBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLjwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPnRoZSBmaWxlIHRvIGV4cGFuZC48L3RkPgorICAgIDx0ZD5ZZXMsIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb248L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkZXN0aW5hdGlvbiBmaWxlIG9yIGRpcmVjdG9yeS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5kZXN0PC90ZD4KKyAgICA8dGQ+dGhlIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50Ci1yZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxoND5hbnkgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciBzaW5nbGUgZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAotPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLjwvcD4KKzxwPlRoZSBzcGVjaWZpZWQgcmVzb3VyY2Ugd2lsbCBiZSB1c2VkIGFzIDx2YXI+c3JjPC92YXI+LjwvcD4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7Z3VuemlwIHNyYz0mcXVvdDt0ZXN0LnRhci5neiZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5leHBhbmRzIDxpPnRlc3QudGFyLmd6PC9pPiB0byA8aT50ZXN0LnRhcjwvaT48L3A+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2J1bnppcDIgc3JjPSZxdW90O3Rlc3QudGFyLmJ6MiZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5leHBhbmRzIDxpPnRlc3QudGFyLmJ6MjwvaT4gdG8gPGk+dGVzdC50YXI8L2k+PC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtndW56aXAgc3JjPSZxdW90O3Rlc3QudGFyLmd6JnF1b3Q7IGRlc3Q9JnF1b3Q7dGVzdDIudGFyJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmV4cGFuZHMgPGk+dGVzdC50YXIuZ3o8L2k+IHRvIDxpPnRlc3QyLnRhcjwvaT48L3A+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2d1bnppcCBzcmM9JnF1b3Q7dGVzdC50YXIuZ3omcXVvdDsgZGVzdD0mcXVvdDtzdWJkaXImcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+ZXhwYW5kcyA8aT50ZXN0LnRhci5nejwvaT4gdG8gPGk+c3ViZGlyL3Rlc3QudGFyPC9pPiAoYXNzdW1pbmcKLXN1YmRpciBpcyBhIGRpcmVjdG9yeSkuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkV4cGFuZCA8c2FtcD50ZXN0LnRhci5nejwvc2FtcD4gdG8gPHNhbXA+dGVzdC50YXI8L3NhbXA+PC9wPgorPHByZT4mbHQ7Z3VuemlwIHNyYz0mcXVvdDt0ZXN0LnRhci5neiZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkV4cGFuZCA8c2FtcD50ZXN0LnRhci5iejI8L3NhbXA+IHRvIDxzYW1wPnRlc3QudGFyPC9zYW1wPjwvcD4KKzxwcmU+Jmx0O2J1bnppcDIgc3JjPSZxdW90O3Rlc3QudGFyLmJ6MiZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkV4cGFuZCA8c2FtcD50ZXN0LnRhci54ejwvc2FtcD4gdG8gPHNhbXA+dGVzdC50YXI8L3NhbXA+PC9wPgorPHByZT4mbHQ7dW54eiBzcmM9JnF1b3Q7dGVzdC50YXIueHomcXVvdDsvJmd0OzwvcHJlPgorCis8cD5FeHBhbmQgPHNhbXA+dGVzdC50YXIuZ3o8L3NhbXA+IHRvIDxzYW1wPnRlc3QyLnRhcjwvc2FtcD48L3A+Cis8cHJlPiZsdDtndW56aXAgc3JjPSZxdW90O3Rlc3QudGFyLmd6JnF1b3Q7IGRlc3Q9JnF1b3Q7dGVzdDIudGFyJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+RXhwYW5kIDxzYW1wPnRlc3QudGFyLmd6PC9zYW1wPiB0byA8c2FtcD5zdWJkaXIvdGVzdC50YXI8L3NhbXA+IChhc3N1bWluZyA8c2FtcD5zdWJkaXI8L3NhbXA+IGlzCithIGRpcmVjdG9yeSkuPC9wPgorPHByZT4mbHQ7Z3VuemlwIHNyYz0mcXVvdDt0ZXN0LnRhci5neiZxdW90OyBkZXN0PSZxdW90O3N1YmRpciZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPkRvd25sb2FkIDxzYW1wPmh0dHBzOi8vZXhhbXBsZS5vcmcvYXJjaGl2ZS50YXIuZ3o8L3NhbXA+IGFuZCBleHBhbmQgaXQgdG8gPHNhbXA+YXJjaGl2ZS50YXI8L3NhbXA+CitpbiB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPiBvbiB0aGUgZmx5LjwvcD4KKzxwcmU+CiAmbHQ7Z3VuemlwIGRlc3Q9JnF1b3Q7LiZxdW90OyZndDsKLSAgJmx0O3VybCB1cmw9Imh0dHA6Ly9leGFtcGxlLm9yZy9hcmNoaXZlLnRhci5neiIvJmd0OworICAmbHQ7dXJsIHVybD0iaHR0cHM6Ly9leGFtcGxlLm9yZy9hcmNoaXZlLnRhci5neiIvJmd0OwogJmx0Oy9ndW56aXAmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5kb3dubG9hZHMgPGk+aHR0cDovL2V4YW1wbGUub3JnL2FyY2hpdmUudGFyLmd6PC9pPiBhbmQgZXhwYW5kcyBpdAotdG8gPGk+YXJjaGl2ZS50YXI8L2k+IGluIHRoZSBwcm9qZWN0J3MgYmFzZWRpciBvbiB0aGUgZmx5LjwvcD4KKzwvcHJlPgogCiA8aDM+UmVsYXRlZCB0YXNrczwvaDM+CiAKLTxwcmU+Ci0mbHQ7Z3VuemlwIHNyYz0ic29tZS1hcmNoaXZlLmd6IiBkZXN0PSJzb21lLWRlc3QtZGlyIi8mZ3Q7Ci08L3ByZT4KLQotaXMgaWRlbnRpY2FsIHRvCi0KKzxwPlRoZSBmb2xsb3dpbmc8L3A+Cis8cHJlPiZsdDtndW56aXAgc3JjPSJzb21lLWFyY2hpdmUuZ3oiIGRlc3Q9InNvbWUtZGVzdC1kaXIiLyZndDs8L3ByZT4KKzxwPmlzIGlkZW50aWNhbCB0bzwvcD4KIDxwcmU+CiAmbHQ7Y29weSB0b2Rpcj0ic29tZS1kZXN0LWRpciImZ3Q7CiAgICZsdDtnemlwcmVzb3VyY2UmZ3Q7CiAgICAgJmx0O2ZpbGUgZmlsZT0ic29tZS1hcmNoaXZlLmd6Ii8mZ3Q7CiAgICZsdDsvZ3ppcHJlc291cmNlJmd0OwogICAmbHQ7bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouZ3oiIHRvPSIqIi8mZ3Q7Ci0mbHQ7L2NvcHkmZ3Q7Ci08L3ByZT4KKyZsdDsvY29weSZndDs8L3ByZT4KIAotPHA+VGhlIHNhbWUgaXMgYWxzbyB0cnVlIGZvciA8Y29kZT4mbHQ7YnVuemlwMiZndDs8L2NvZGU+IGFuZAotPGNvZGU+Jmx0O2J6aXAycmVzb3VyY2UmZ3Q7PC9jb2RlPi4gIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gb2ZmZXJzCi1hZGRpdGlvbmFsIGZlYXR1cmVzIGxpa2UgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmluZyBmaWxlczwvYT4gb24gdGhlIGZseSwKLWFsbG93aW5nIGEgZmlsZSB0byBiZSBtYXBwZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zLCBwcmVzZXJ2aW5nIHRoZQotbGFzdCBtb2RpZmllZCB0aW1lIG9yIGEgY29uZmlndXJhYmxlIGZpbGUgc3lzdGVtIHRpbWVzdGFtcAotZ3JhbnVsYXJpdHkuPC9wPgotCi0KKzxwPlRoZSBzYW1lIGlzIGFsc28gdHJ1ZSBmb3IgPGNvZGU+Jmx0O2J1bnppcDImZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2J6aXAycmVzb3VyY2UmZ3Q7PC9jb2RlPgorb3IgPGNvZGU+Jmx0O3VueHomZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3h6cmVzb3VyY2UmZ3Q7PC9jb2RlPi4gIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gb2ZmZXJzCithZGRpdGlvbmFsIGZlYXR1cmVzIGxpa2UgPGEgaHJlZj0iLi4vVHlwZXMvZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyaW5nIGZpbGVzPC9hPiBvbiB0aGUgZmx5LAorYWxsb3dpbmcgYSBmaWxlIHRvIGJlIG1hcHBlZCB0byBtdWx0aXBsZSBkZXN0aW5hdGlvbnMsIHByZXNlcnZpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBvciBhCitjb25maWd1cmFibGUgZmlsZSBzeXN0ZW0gdGltZXN0YW1wIGdyYW51bGFyaXR5LjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3VudGFyLmh0bWwgYi9tYW51YWwvVGFza3MvdW50YXIuaHRtbAppbmRleCBiZmFmMjhmLi40ODljYmZkIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvdW50YXIuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdW50YXIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDIyICsxNSwyMCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VW50YXIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0idW50YXIiPlVudGFyPC9hPjwvaDI+Cis8aDIgaWQ9InVudGFyIj5VbnRhcjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+VW50YXJzIGEgdGFyZmlsZS48L3A+CiAKLVRoaXMgZG9jdW1lbnQgaGFzIG1vdmVkIDxBIEhSRUY9InVuemlwLmh0bWwiPmhlcmU8L0E+CitUaGlzIGRvY3VtZW50IGhhcyBtb3ZlZCA8YSBocmVmPSJ1bnppcC5odG1sIj5oZXJlPC9hPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy91bnppcC5odG1sIGIvbWFudWFsL1Rhc2tzL3VuemlwLmh0bWwKaW5kZXggZGJmNGExNi4uZjRhNmNlNSAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3VuemlwLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3VuemlwLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNTAgKzE1LDEyMyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VW56aXAgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0idW56aXAiPlVuamFyL1VudGFyL1Vud2FyL1VuemlwPC9hPjwvaDI+Cis8aDIgaWQ9InVuemlwIj5Vbmphci9VbnRhci9Vbndhci9VbnppcDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+VW56aXBzIGEgemlwLSwgd2FyLSwgb3IgamFyIGZpbGUuPC9wPgotPHA+PGEgaHJlZj0iLi4vVHlwZXMvcGF0dGVybnNldC5odG1sIj5QYXR0ZXJuU2V0PC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGZpbGVzIHRvIGV4dHJhY3QKLTxJPmZyb208L0k+IHRoZSBhcmNoaXZlLiAgSWYgbm8gcGF0dGVybnNldCBpcyB1c2VkLCBhbGwgZmlsZXMgYXJlIGV4dHJhY3RlZC4KLTwvcD4KKzxwPjxhIGhyZWY9Ii4uL1R5cGVzL3BhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldDwvYT5zIGFyZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyB0bworZXh0cmFjdCA8ZW0+ZnJvbTwvZW0+IHRoZSBhcmNoaXZlLiAgSWYgbm8gcGF0dGVybnNldCBpcyB1c2VkLCBhbGwgZmlsZXMgYXJlIGV4dHJhY3RlZC48L3A+CiAKLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCi1Db2xsZWN0aW9uPC9hPnMgbWF5IGJlIHVzZWQgdG8gc2VsZWN0IGFyY2hpdmVkIGZpbGVzIHRvIHBlcmZvcm0KLXVuYXJjaGl2YWwgdXBvbi4gIE9ubHkgZmlsZSBzeXN0ZW0gYmFzZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlCi1zdXBwb3J0ZWQgYnkgVW5qYXIvVW53YXIvVW56aXAsIHRoaXMgaW5jbHVkZXMgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4sIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5maWxlbGlzdDwvYT4sIDxhCi1ocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGg8L2E+LCBhbmQgPGEKLWhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2ZpbGVzIj5maWxlczwvYT4uCi1VbnRhciBzdXBwb3J0cyBhcmJpdHJhcnkgcmVzb3VyY2UgY29sbGVjdGlvbnMuCi1QcmlvciB0byBBcGFjaGUgQW50IDEuNyBvbmx5IGZpbGVzZXQgaGFzIGJlZW4gc3VwcG9ydGVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgorPHA+PGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+cmVzb3VyY2UgY29sbGVjdGlvbnM8L2E+IG1heSBiZSB1c2VkIHRvIHNlbGVjdAorYXJjaGl2ZWQgZmlsZXMgdG8gcGVyZm9ybSB1bmFyY2hpdmFsIHVwb24uICBPbmx5IGZpbGUgc3lzdGVtIGJhc2VkIHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZQorc3VwcG9ydGVkIGJ5IDxjb2RlPlVuamFyPC9jb2RlPi88Y29kZT5VbndhcjwvY29kZT4vPGNvZGU+VW56aXA8L2NvZGU+LCB0aGlzCitpbmNsdWRlcyA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+LCA8YSBocmVmPSIuLi9UeXBlcy9maWxlbGlzdC5odG1sIj5maWxlbGlzdDwvYT4sIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aDwvYT4sCithbmQgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZXMiPmZpbGVzPC9hPi4gPGNvZGU+VW50YXI8L2NvZGU+IHN1cHBvcnRzIGFyYml0cmFyeQorcmVzb3VyY2UgY29sbGVjdGlvbnMuICBQcmlvciB0byBBcGFjaGUgQW50IDEuNyBvbmx5IDxjb2RlPmZpbGVzZXQ8L2NvZGU+IGhhcyBiZWVuIHN1cHBvcnRlZCBhcyBhCituZXN0ZWQgZWxlbWVudC48L3A+CiAKLTxwPllvdSBjYW4gZGVmaW5lIGZpbGVuYW1lIHRyYW5zZm9ybWF0aW9ucyBieSB1c2luZyBhIG5lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiAgVGhlIGRlZmF1bHQgbWFwcGVyIGlzIHRoZQotPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eSBtYXBwZXI8L2E+LgotPC9wPgorPHA+WW91IGNhbiBkZWZpbmUgZmlsZW5hbWUgdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIGEKK25lc3RlZCA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBlbGVtZW50LiAgVGhlIGRlZmF1bHQgbWFwcGVyIGlzIHRoZQorPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwjaWRlbnRpdHktbWFwcGVyIj5pZGVudGl0eSBtYXBwZXI8L2E+LjwvcD4KIDxwPkZpbGUgcGVybWlzc2lvbnMgd2lsbCBub3QgYmUgcmVzdG9yZWQgb24gZXh0cmFjdGVkIGZpbGVzLjwvcD4KLTxwPlRoZSB1bnRhciB0YXNrIHJlY29nbml6ZXMgdGhlIGxvbmcgcGF0aG5hbWUgZW50cmllcyB1c2VkIGJ5IEdOVSB0YXIuPHA+Cis8cD5UaGUgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2sgcmVjb2duaXplcyB0aGUgbG9uZyBwYXRobmFtZSBlbnRyaWVzIHVzZWQgYnkgR05VIHRhci48cD4KIAotPHA+PGI+UGxlYXNlIG5vdGU8L2I+IHRoYXQgZGlmZmVyZW50IFpJUCB0b29scyBoYW5kbGUgdGltZXN0YW1wcwotZGlmZmVyZW50bHkgd2hlbiBpdCBjb21lcyB0byBhcHBseWluZyB0aW1lem9uZSBvZmZzZXQgY2FsY3VsYXRpb25zIG9mCi1maWxlcy4gIFNvbWUgWklQIGxpYnJhcmllcyB3aWxsIHN0b3JlIHRoZSB0aW1lc3RhbXBzIGFzIHRoZXkndmUgYmVlbgotcmVhZCBmcm9tIHRoZSBmaWxlc3lzdGVtIHdoaWxlIG90aGVycyB3aWxsIG1vZGlmeSB0aGUgdGltZXN0YW1wcyBib3RoCi13aGVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgdGhlIGZpbGVzIHRvIG1ha2UgYWxsIHRpbWVzdGFtcHMgdXNlIHRoZSBzYW1lCi10aW1lem9uZS4gIEEgWklQIGFyY2hpdmUgY3JlYXRlZCBieSBvbmUgbGlicmFyeSBtYXkgZXh0cmFjdCBmaWxlcyB3aXRoCi0id3JvbmcgdGltZXN0YW1wcyIgd2hlbiBleHRyYWN0ZWQgYnkgYW5vdGhlciBsaWJyYXJ5LjwvcD4KKzxwPjxzdHJvbmc+UGxlYXNlIG5vdGU8L3N0cm9uZz4gdGhhdCBkaWZmZXJlbnQgWklQIHRvb2xzIGhhbmRsZSB0aW1lc3RhbXBzIGRpZmZlcmVudGx5IHdoZW4gaXQgY29tZXMKK3RvIGFwcGx5aW5nIHRpbWV6b25lIG9mZnNldCBjYWxjdWxhdGlvbnMgb2YgZmlsZXMuICBTb21lIFpJUCBsaWJyYXJpZXMgd2lsbCBzdG9yZSB0aGUgdGltZXN0YW1wcyBhcwordGhleSd2ZSBiZWVuIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbSB3aGlsZSBvdGhlcnMgd2lsbCBtb2RpZnkgdGhlIHRpbWVzdGFtcHMgYm90aCB3aGVuIHJlYWRpbmcgYW5kCit3cml0aW5nIHRoZSBmaWxlcyB0byBtYWtlIGFsbCB0aW1lc3RhbXBzIHVzZSB0aGUgc2FtZSB0aW1lem9uZS4gIEEgWklQIGFyY2hpdmUgY3JlYXRlZCBieSBvbmUKK2xpYnJhcnkgbWF5IGV4dHJhY3QgZmlsZXMgd2l0aCAid3JvbmcgdGltZXN0YW1wcyIgd2hlbiBleHRyYWN0ZWQgYnkgYW5vdGhlciBsaWJyYXJ5LjwvcD4KIAotPHA+QW50J3MgWklQIGNsYXNzZXMgdXNlIHRoZSBzYW1lIGFsZ29yaXRobSBhcyB0aGUgSW5mb1pJUCB0b29scyBhbmQKLXpsaWIgKHRpbWVzdGFtcHMgZ2V0IGFkanVzdGVkKSwgV2luZG93cycgImNvbXByZXNzZWQgZm9sZGVycyIgZnVuY3Rpb24KLWFuZCBXaW5aSVAgZG9uJ3QgY2hhbmdlIHRoZSB0aW1lc3RhbXBzLiAgVGhpcyBtZWFucyB0aGF0IHVzaW5nIHRoZQotdW56aXAgdGFzayBvbiBmaWxlcyBjcmVhdGVkIGJ5IFdpbmRvd3MnIGNvbXByZXNzZWQgZm9sZGVycyBmdW5jdGlvbgotbWF5IGNyZWF0ZSBmaWxlcyB3aXRoIHRpbWVzdGFtcHMgdGhhdCBhcmUgIndyb25nIiwgdGhlIHNhbWUgaXMgdHJ1ZSBpZgoteW91IHVzZSBXaW5kb3dzJyBmdW5jdGlvbnMgdG8gZXh0cmFjdCBhbiBBbnQgZ2VuZXJhdGVkIFpJUAotYXJjaGl2ZS48L3A+Ci0KKzxwPkFudCdzIFpJUCBjbGFzc2VzIHVzZSB0aGUgc2FtZSBhbGdvcml0aG0gYXMgdGhlIEluZm9aSVAgdG9vbHMgYW5kIHpsaWIgKHRpbWVzdGFtcHMgZ2V0IGFkanVzdGVkKSwKK1dpbmRvd3MnICJjb21wcmVzc2VkIGZvbGRlcnMiIGZ1bmN0aW9uIGFuZCBXaW5aSVAgZG9uJ3QgY2hhbmdlIHRoZSB0aW1lc3RhbXBzLiAgVGhpcyBtZWFucyB0aGF0Cit1c2luZyB0aGUgPGNvZGU+dW56aXA8L2NvZGU+IHRhc2sgb24gZmlsZXMgY3JlYXRlZCBieSBXaW5kb3dzJyBjb21wcmVzc2VkIGZvbGRlcnMgZnVuY3Rpb24gbWF5CitjcmVhdGUgZmlsZXMgd2l0aCB0aW1lc3RhbXBzIHRoYXQgYXJlICJ3cm9uZyIsIHRoZSBzYW1lIGlzIHRydWUgaWYgeW91IHVzZSBXaW5kb3dzJyBmdW5jdGlvbnMgdG8KK2V4dHJhY3QgYW4gQW50IGdlbmVyYXRlZCBaSVAgYXJjaGl2ZS48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFyY2hpdmUgZmlsZSB0byBleHBhbmQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgaWYgZmlsZXNldHMgYXJlIG5vdCB1c2VkLjwvdGQ+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPmFyY2hpdmUgZmlsZSB0byBleHBhbmQuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgZmlsZXNldHMgYXJlIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcmVjdG9yeSB3aGVyZSB0byBzdG9yZSB0aGUgZXhwYW5kZWQgZmlsZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPmRlc3Q8L3RkPgorICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgdGhlIGV4cGFuZGVkIGZpbGVzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm92ZXJ3cml0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5PdmVyd3JpdGUgZmlsZXMsIGV2ZW4gaWYgdGhleSBhcmUgbmV3ZXIgdGhhbiB0aGUKLSAgICAgIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZSAodHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpcwotICAgICAgdHJ1ZSkuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+b3ZlcndyaXRlPC90ZD4KKyAgICA8dGQ+T3ZlcndyaXRlIGZpbGVzLCBldmVuIGlmIHRoZXkgYXJlIG5ld2VyIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgZW50cmllcyBpbiB0aGUgYXJjaGl2ZQorICAgICAgKDxxPnRydWV8ZmFsc2U8L3E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbXByZXNzaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPk5vdGU6PC9iPiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBmb3IKLSAgICB0aGUgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2suPGJyPgotICAgIGNvbXByZXNzaW9uIG1ldGhvZC4gIEFsbG93YWJsZSB2YWx1ZXMgYXJlICZxdW90O25vbmUmcXVvdDssCi0gICAgJnF1b3Q7Z3ppcCZxdW90OyBhbmQgJnF1b3Q7YnppcDImcXVvdDsuICBEZWZhdWx0IGlzCi0gICAgJnF1b3Q7bm9uZSZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jb21wcmVzc2lvbjwvdGQ+CisgICAgPHRkPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBhdHRyaWJ1dGUgaXMgb25seSBhdmFpbGFibGUgZm9yIHRoZSA8Y29kZT51bnRhcjwvY29kZT4gdGFzay48YnIvPgorICAgICAgY29tcHJlc3Npb24gbWV0aG9kLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUgPHE+bm9uZTwvcT4sIDxxPmd6aXA8L3E+LCA8cT54ejwvcT4KKyAgICAgIGFuZCA8cT5iemlwMjwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bm9uZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRoYXQgaGFzIGJlZW4gdXNlZCBmb3IgZmlsZW5hbWVzCi0gICAgaW5zaWRlIHRoZSB6aXAgZmlsZS4gIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSB0aGUgPGEKLSAgICBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi48YnIvPgotICAgIERlZmF1bHRzIHRvICZxdW90O1VURjgmcXVvdDsgZm9yIHRoZSA8Y29kZT51bnppcDwvY29kZT4gYW5kIHRoZQotICAgIHBsYXRmb3JtJ3MgZGVmYXVsdCBlbmNvZGluZyBmb3IgdGhlIDxjb2RlPnVudGFyPC9jb2RlPiB0YXNrLiAgVXNlCi0gICAgdGhlIG1hZ2ljIHZhbHVlCi0gICAgPGNvZGU+bmF0aXZlLWVuY29kaW5nPC9jb2RlPiBmb3IgdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIKLSAgICBlbmNvZGluZy4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZQotICAgICAgemlwIHRhc2sgcGFnZTwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdGhhdCBoYXMgYmVlbiB1c2VkIGZvciBmaWxlbmFtZXMgaW5zaWRlIHRoZSB6aXAgZmlsZS4gIEZvciBhIGxpc3Qgb2YKKyAgICAgIHBvc3NpYmxlIHZhbHVlcyBzZWUKKyAgICAgIHRoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCIKKyAgICAgIHRhcmdldD0iX3RvcCI+U3VwcG9ydGVkIEVuY29kaW5nczwvYT4uPGJyLz4gIFVzZSB0aGUgbWFnaWMgdmFsdWUgPHE+bmF0aXZlLWVuY29kaW5nPC9xPiBmb3IKKyAgICAgIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZy48YnIvPiAgU2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluCisgICAgICB0aGUgemlwIHRhc2sgcGFnZTwvYT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+VVRGODwvcT4gZm9yIDxjb2RlPnVuemlwPC9jb2RlPiBhbmQgZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nCisgICAgICBmb3IgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2s8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mYWlsT25FbXB0eUFyY2hpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0cnlpbmcgdG8gZXh0cmFjdCBhbiBlbXB0eSBhcmNoaXZlIGlzIGFuCi0gICAgICBlcnJvci4gPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+CisgICAgPHRkPmZhaWxPbkVtcHR5QXJjaGl2ZTwvdGQ+CisgICAgPHRkPndoZXRoZXIgdHJ5aW5nIHRvIGV4dHJhY3QgYW4gZW1wdHkgYXJjaGl2ZSBpcyBhbiBlcnJvci4gPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0cmlwQWJzb2x1dGVQYXRoU3BlYzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIEFudCBzaG91bGQgcmVtb3ZlIGxlYWRpbmcgJy8nIG9yICdcJwotICAgICAgY2hhcmFjdGVycyBmcm9tIHRoZSBleHRyYWN0ZWQgZmlsZSBuYW1lIGJlZm9yZSBleHRyYWN0aW5nIGl0LgotICAgICAgTm90ZSB0aGF0IHRoaXMgY2hhbmdlcyB0aGUgZW50cnkncyBuYW1lIGJlZm9yZSBhcHBseWluZwotICAgICAgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIGFuZCBiZWZvcmUgdXNpbmcgdGhlIG5lc3RlZCBtYXBwZXJzIChpZgotICAgICAgYW55KS4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gdHJ1ZSBzaW5jZSAxLjkuMTIKLSAgICAgICh1c2VkIHRvIGRlZmF1a3QgdG8gZmFsc2UgcHJpb3IgdG8gdGhhdCk8L3RkPgorICAgIDx0ZD5zdHJpcEFic29sdXRlUGF0aFNwZWM8L3RkPgorICAgIDx0ZD53aGV0aGVyIEFudCBzaG91bGQgcmVtb3ZlIGxlYWRpbmcgPHE+LzwvcT4gb3IgPHE+XDwvcT4gY2hhcmFjdGVycyBmcm9tIHRoZSBleHRyYWN0ZWQgZmlsZQorICAgICAgbmFtZSBiZWZvcmUgZXh0cmFjdGluZyBpdC4gIE5vdGUgdGhhdCB0aGlzIGNoYW5nZXMgdGhlIGVudHJ5IG5hbWUgYmVmb3JlCisgICAgICBhcHBseWluZyA8Y29kZT5pbmNsdWRlPC9jb2RlPi88Y29kZT5leGNsdWRlPC9jb2RlPiBwYXR0ZXJucyBhbmQgYmVmb3JlIHVzaW5nIHRoZSBuZXN0ZWQKKyAgICAgIG1hcHBlcnMgKGlmIGFueSkuICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT4gPGVtPnNpbmNlIEFudCAxLjEwLjQ8L2VtPgorICAgICAgKHVzZWQgdG8gZGVmYXVsdCB0byA8cT5mYWxzZTwvcT4gcHJpb3IgdG8gdGhhdCk8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zY2FuRm9yVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPk5vdGU6PC9iPiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlIGZvcgotICAgIHRoZSA8Y29kZT51bnRhcjwvY29kZT4gdGFzay48YnI+Ci0gICAgICBJZiB0aGUgYXJjaGl2ZSBjb250YWlucyB1bmNvZGUgZXh0cmEgZmllbGRzIHRoZW4gdXNlIHRoZW0gdG8gc2V0Ci0gICAgICB0aGUgZmlsZSBuYW1lcywgaWdub3JpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZQotICAgICAgemlwIHRhc2sgcGFnZTwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHRzIHRvIHRydWU8L3RkPgorICAgIDx0ZD5zY2FuRm9yVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KKyAgICA8dGQ+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGUgPGNvZGU+dW50YXI8L2NvZGU+IHRhc2suPGJyLz4KKyAgICAgIElmIHRoZSBhcmNoaXZlIGNvbnRhaW5zIFVuaWNvZGUgZXh0cmEgZmllbGRzIHRoZW4gdXNlIHRoZW0gdG8gc2V0IHRoZSBmaWxlIG5hbWVzLCBpZ25vcmluZyB0aGUKKyAgICAgIHNwZWNpZmllZCBlbmNvZGluZy48YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUgemlwIHRhc2sKKyAgICAgIHBhZ2U8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWxsb3dGaWxlc1RvRXNjYXBlRGVzdDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGFsbG93IHRoZSBleHRyYWN0ZWQgZmlsZSBvciBkaXJlY3RvcnkKLSAgICAgIHRvIGJlIG91dHNpZGUgb2YgdGhlIGRlc3QgZGlyZWN0b3J5LgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMTI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdHMgdG8gZmFsc2UgdW5sZXNzCi0gICAgc3RyaXBBYnNvbHV0ZVBhdGhTcGVjIGlzIGZhbHNlIGFuZCB0aGUgZW50cnkncyBuYW1lIHN0YXJ0cyB3aXRoIGEgbGVhZGluZwotICAgIHBhdGggc3BlYy48L3RkPgorICAgIDx0ZD5hbGxvd0ZpbGVzVG9Fc2NhcGVEZXN0PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBhbGxvdyB0aGUgZXh0cmFjdGVkIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlIG91dHNpZGUgb2YgdGhlIGRlc3QKKyAgICAgIGRpcmVjdG9yeS4gIDxlbT5zaW5jZSBBbnQgMS4xMC40PC9lbT48L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+IHVubGVzcyA8dmFyPnN0cmlwQWJzb2x1dGVQYXRoU3BlYzwvdmFyPiBpcyA8cT5mYWxzZTwvcT4gYW5kIHRoZQorICAgICAgZW50cnkncyBuYW1lIHN0YXJ0cyB3aXRoIGEgbGVhZGluZyBwYXRoIHNwZWMuPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4KLSZsdDt1bnppcCBzcmM9JnF1b3Q7JHt0b21jYXRfc3JjfS90b29scy1zcmMuemlwJnF1b3Q7IGRlc3Q9JnF1b3Q7JHt0b29scy5ob21lfSZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPgorPHByZT4mbHQ7dW56aXAgc3JjPSZxdW90OyR7dG9tY2F0X3NyY30vdG9vbHMtc3JjLnppcCZxdW90OyBkZXN0PSZxdW90OyR7dG9vbHMuaG9tZX0mcXVvdDsvJmd0OzwvcHJlPgogPHByZT4KICZsdDtndW56aXAgc3JjPSZxdW90O3Rvb2xzLnRhci5neiZxdW90Oy8mZ3Q7Ci0mbHQ7dW50YXIgc3JjPSZxdW90O3Rvb2xzLnRhciZxdW90OyBkZXN0PSZxdW90OyR7dG9vbHMuaG9tZX0mcXVvdDsvJmd0OwotPC9wcmU+CismbHQ7dW50YXIgc3JjPSZxdW90O3Rvb2xzLnRhciZxdW90OyBkZXN0PSZxdW90OyR7dG9vbHMuaG9tZX0mcXVvdDsvJmd0OzwvcHJlPgogPHByZT4KICZsdDt1bnppcCBzcmM9JnF1b3Q7JHt0b21jYXRfc3JjfS90b29scy1zcmMuemlwJnF1b3Q7CiAgICAgICAgZGVzdD0mcXVvdDske3Rvb2xzLmhvbWV9JnF1b3Q7Jmd0OwpAQCAtMTY1LDkgKzEzOSw3IEBACiAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKICAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi9UZXN0Ki5qYXZhJnF1b3Q7LyZndDsKICAgICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7Ci0mbHQ7L3VuemlwJmd0OwotPC9wcmU+Ci08cD4KKyZsdDsvdW56aXAmZ3Q7PC9wcmU+CiA8cHJlPgogJmx0O3VuemlwIGRlc3Q9JnF1b3Q7JHt0b29scy5ob21lfSZxdW90OyZndDsKICAgICAmbHQ7cGF0dGVybnNldCZndDsKQEAgLTE3OCwzMCArMTUwLDQ5IEBACiAgICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi56aXAmcXVvdDsvJmd0OwogICAgICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqL3RtcCouemlwJnF1b3Q7LyZndDsKICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0mbHQ7L3VuemlwJmd0OwotPC9wcmU+Ci08cD4KKyZsdDsvdW56aXAmZ3Q7PC9wcmU+CiA8cHJlPgogJmx0O3VuemlwIHNyYz0mcXVvdDthcGFjaGUtYW50LWJpbi56aXAmcXVvdDsgZGVzdD0mcXVvdDske3Rvb2xzLmhvbWV9JnF1b3Q7Jmd0OwogICAgICZsdDtwYXR0ZXJuc2V0Jmd0OwogICAgICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2FwYWNoZS1hbnQvbGliL2FudC5qYXImcXVvdDsvJmd0OwogICAgICZsdDsvcGF0dGVybnNldCZndDsKICAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7ZmxhdHRlbiZxdW90Oy8mZ3Q7Ci0mbHQ7L3VuemlwJmd0OwotPC9wcmU+CismbHQ7L3VuemlwJmd0OzwvcHJlPgorCis8cD5FeHRyYWN0IGFsbCBpbWFnZXMgZnJvbSA8c2FtcD5hbnQuamFyPC9zYW1wPiB3aGljaCBhcmUgc3RvcmVkIGluIHRoZSA8c2FtcD5pbWFnZXM8L3NhbXA+CisgIGRpcmVjdG9yeSBvZiB0aGUgamFyIGZpbGUgKG9yIHNvbWV3aGVyZSB1bmRlciBpdCkuIFdoaWxlIGV4dHJhY3RpbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgKDxzYW1wPmltYWdlczwvc2FtcD4pIHdpbGwgYmUgcHJlc2VydmVkLjwvcD4KKzxwcmU+CismbHQ7dW56aXAgc3JjPSZxdW90OyR7YW50LmhvbWV9L2xpYi9hbnQuamFyJnF1b3Q7IGRlc3Q9JnF1b3Q7Li4uJnF1b3Q7Jmd0OworICAmbHQ7cGF0dGVybnNldCZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2ltYWdlcy8mcXVvdDsvJmd0OworICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CismbHQ7L3VuemlwJmd0OzwvcHJlPgorCis8cD5FeHRyYWN0IHR3byBmaWxlcywgPHNhbXA+YW50X2xvZ29fbGFyZ2UuZ2lmPC9zYW1wPiBhbmQgPHNhbXA+TElDRU5TRS50eHQ8L3NhbXA+LAorICBmcm9tIDxzYW1wPmFudC5qYXI8L3NhbXA+LiBNb3JlIGV4YWN0bHk6IGV4dHJhY3QgYWxsIGZpbGVzIHdpdGggdGhlc2UgbmFtZXMgZnJvbSBhbnl3aGVyZSBpbiB0aGUKKyAgc291cmNlIGZpbGUuIFdoaWxlIGV4dHJhY3RpbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBwcmVzZXJ2ZWQuPC9wPgorPHByZT4KKyZsdDt1bnppcCBzcmM9JnF1b3Q7JHthbnQuaG9tZX0vbGliL2FudC5qYXImcXVvdDsgZGVzdD0mcXVvdDsuLi4mcXVvdDsmZ3Q7CisgICZsdDtwYXR0ZXJuc2V0Jmd0OworICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovYW50X2xvZ29fbGFyZ2UuZ2lmJnF1b3Q7LyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqL0xJQ0VOU0UudHh0JnF1b3Q7LyZndDsKKyAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OworJmx0Oy91bnppcCZndDs8L3ByZT4KIAogPGgzPlJlbGF0ZWQgdGFza3M8L2gzPgogCis8cD5UaGUgdGFzazwvcD4KKwogPHByZT4KICZsdDt1bnppcCBzcmM9InNvbWUtYXJjaGl2ZSIgZGVzdD0ic29tZS1kaXIiJmd0OwogICAmbHQ7cGF0dGVybnNldCZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSJzb21lLXBhdHRlcm4iLyZndDsKICAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OwogICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7c29tZS1tYXBwZXImcXVvdDsvJmd0OwotJmx0Oy91bnppcCZndDsKLTwvcHJlPgorJmx0Oy91bnppcCZndDs8L3ByZT4KIAotaXMgaWRlbnRpY2FsIHRvCis8cD5pcyBpZGVudGljYWwgdG88L3A+CiAKIDxwcmU+CiAmbHQ7Y29weSB0b2Rpcj0ic29tZS1kaXIiIHByZXNlcnZlbGFzdG1vZGlmaWVkPSJ0cnVlIiZndDsKQEAgLTIxMSw0NCArMjAyLDIwIEBACiAgICAgJmx0Oy9wYXR0ZXJuc2V0Jmd0OwogICAmbHQ7L3ppcGZpbGVzZXQmZ3Q7CiAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtzb21lLW1hcHBlciZxdW90Oy8mZ3Q7Ci0mbHQ7L2NvcHkmZ3Q7Ci08L3ByZT4KKyZsdDsvY29weSZndDs8L3ByZT4KIAotPHA+VGhlIHNhbWUgaXMgYWxzbyB0cnVlIGZvciA8Y29kZT4mbHQ7dW50YXImZ3Q7PC9jb2RlPiBhbmQKLTxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4uICA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IG9mZmVycwotYWRkaXRpb25hbCBmZWF0dXJlcyBsaWtlIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmluZyBmaWxlczwvYT4gb24gdGhlIGZseSwKLWFsbG93aW5nIGEgZmlsZSB0byBiZSBtYXBwZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIG9yIGEKLWNvbmZpZ3VyYWJsZSBmaWxlIHN5c3RlbSB0aW1lc3RhbXAgZ3JhbnVsYXJpdHkuPC9wPgorPHA+VGhlIHNhbWUgaXMgYWxzbyB0cnVlIGZvciA8Y29kZT4mbHQ7dW50YXImZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4uICA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IG9mZmVycyBhZGRpdGlvbmFsIGZlYXR1cmVzCitsaWtlIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwiPmZpbHRlcmluZyBmaWxlczwvYT4gb24gdGhlIGZseSwgYWxsb3dpbmcgYSBmaWxlIHRvIGJlCittYXBwZWQgdG8gbXVsdGlwbGUgZGVzdGluYXRpb25zIG9yIGEgY29uZmlndXJhYmxlIGZpbGUgc3lzdGVtIHRpbWVzdGFtcCBncmFudWxhcml0eS48L3A+CisKKzxwPiZxdW90O0RlbGV0ZSZxdW90OyBmaWxlcyBmcm9tIGEgemlwZmlsZS48L3A+CiAKIDxwcmU+Jmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDtuZXcuamFyJnF1b3Q7Jmd0OwogICAmbHQ7emlwZmlsZXNldCBzcmM9JnF1b3Q7b2xkLmphciZxdW90OyZndDsKICAgICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90O2RvL25vdC9pbmNsdWRlL3RoaXMvY2xhc3MmcXVvdDsvJmd0OwogICAmbHQ7L3ppcGZpbGVzZXQmZ3Q7Ci0mbHQ7L3ppcCZndDsKLTwvcHJlPgotPHA+JnF1b3Q7RGVsZXRlcyZxdW90OyBmaWxlcyBmcm9tIGEgemlwZmlsZS48L3A+Ci0KLTxwcmU+Ci0mbHQ7dW56aXAgc3JjPSZxdW90OyR7YW50LmhvbWV9L2xpYi9hbnQuamFyJnF1b3Q7IGRlc3Q9JnF1b3Q7Li4uJnF1b3Q7Jmd0OwotICAmbHQ7cGF0dGVybnNldCZndDsKLSAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2ltYWdlcy8mcXVvdDsvJmd0OwotICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7Ci0mbHQ7L3VuemlwJmd0OwotPC9wcmU+Ci08cD5UaGlzIGV4dHJhY3RzIGFsbCBpbWFnZXMgZnJvbSA8dHQ+YW50LmphcjwvdHQ+IHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIDx0dD5pbWFnZXM8L3R0PiBkaXJlY3RvcnkKLW9mIHRoZSBKYXIgKG9yIHNvbWV3aGVyZSB1bmRlciBpdCkuIFdoaWxlIGV4dHJhY3RpbmcgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKDx0dD5pbWFnZXM8L3R0PikKLXdpbGwgYmUgdGFrZW4uPC9wPgotCi08cHJlPgotJmx0O3VuemlwIHNyYz0mcXVvdDske2FudC5ob21lfS9saWIvYW50LmphciZxdW90OyBkZXN0PSZxdW90Oy4uLiZxdW90OyZndDsKLSAgJmx0O3BhdHRlcm5zZXQmZ3Q7Ci0gICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi9hbnRfbG9nb19sYXJnZS5naWYmcXVvdDsvJmd0OwotICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovTElDRU5TRS50eHQmcXVvdDsvJmd0OwotICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7Ci0mbHQ7L3VuemlwJmd0OwotPC9wcmU+Ci08cD5UaGlzIGV4dHJhY3RzIHRoZSB0d28gZmlsZXMgPHR0PmFudF9sb2dvX2xhcmdlLmdpZjwvdHQ+IGFuZCA8dHQ+TElDRU5TRS50eHQ8L3R0PiBmcm9tIHRoZQotPHR0PmFudC5qYXI8L3R0Pi4gTW9yZSBleGFjdGx5OiBpdCBleHRyYWN0cyBhbGwgZmlsZXMgd2l0aCB0aGVzZSBuYW1lcyBmcm9tIGFueXdoZXJlIGluIHRoZSBzb3VyY2UgZmlsZS4gV2hpbGUgZXh0cmFjdGluZyB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aWxsIGJlIHRha2VuLjwvcD4KKyZsdDsvemlwJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3MvdXB0b2RhdGUuaHRtbCBiL21hbnVhbC9UYXNrcy91cHRvZGF0ZS5odG1sCmluZGV4IGM3MjRmMjAuLjFhMzAxNGUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy91cHRvZGF0ZS5odG1sCisrKyBiL21hbnVhbC9UYXNrcy91cHRvZGF0ZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTY0ICsxNSwxMzggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlVwdG9kYXRlIFRhc2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InVwdG9kYXRlIj5VcHRvZGF0ZTwvYT48L2gyPgorPGgyIGlkPSJ1cHRvZGF0ZSI+VXB0b2RhdGU8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPlNldHMgYSBwcm9wZXJ0eSBpZiBhIHRhcmdldCBmaWxlIG9yIHNldCBvZiB0YXJnZXQgZmlsZXMgaXMgbW9yZSB1cC10by1kYXRlCi10aGFuIGEgc291cmNlIGZpbGUgb3Igc2V0IG9mIHNvdXJjZSBmaWxlcy4gQSBzaW5nbGUgc291cmNlIGZpbGUgaXMgc3BlY2lmaWVkCi11c2luZyB0aGUgPGNvZGU+c3JjZmlsZTwvY29kZT4gYXR0cmlidXRlLiBBIHNldCBvZiBzb3VyY2UgZmlsZXMgaXMgc3BlY2lmaWVkCi11c2luZyB0aGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+Ci1lbGVtZW50cy4gVGhlc2UgYXJlIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLAotd2hlcmVhcyBtdWx0aXBsZSB0YXJnZXQgZmlsZXMgYXJlIHNwZWNpZmllZCB1c2luZyBhIG5lc3RlZAotPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudC48L3A+Ci08cD5CeSBkZWZhdWx0LCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpZgotdGhlIHRpbWVzdGFtcCBvZiB0aGUgc291cmNlIGZpbGUocykgaXMgbm90IG1vcmUgcmVjZW50IHRoYW4gdGhlIHRpbWVzdGFtcCBvZgotdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0IGZpbGUocykuIFlvdSBjYW4gc2V0IHRoZSB2YWx1ZSB0byBzb21ldGhpbmcgb3RoZXIKLXRoYW4gdGhlIGRlZmF1bHQgYnkgc3BlY2lmeWluZyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZS48L3A+Cis8cD5TZXRzIGEgcHJvcGVydHkgaWYgYSB0YXJnZXQgZmlsZSBvciBzZXQgb2YgdGFyZ2V0IGZpbGVzIGlzIG1vcmUgdXAtdG8tZGF0ZSB0aGFuIGEgc291cmNlIGZpbGUgb3IKK3NldCBvZiBzb3VyY2UgZmlsZXMuIEEgc2luZ2xlIHNvdXJjZSBmaWxlIGlzIHNwZWNpZmllZCB1c2luZyB0aGUgPHZhcj5zcmNmaWxlPC92YXI+IGF0dHJpYnV0ZS4gQSBzZXQKK29mIHNvdXJjZSBmaWxlcyBpcyBzcGVjaWZpZWQgdXNpbmcgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gVGhlc2UKK2FyZSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgd2hlcmVhcyBtdWx0aXBsZSB0YXJnZXQgZmlsZXMgYXJlIHNwZWNpZmllZCB1c2luZworYSBuZXN0ZWQgPGEgaHJlZj0iLi4vVHlwZXMvbWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudC48L3A+Cis8cD5CeSBkZWZhdWx0LCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIHNldCB0byA8cT50cnVlPC9xPiBpZiB0aGUgdGltZXN0YW1wIG9mIHRoZSBzb3VyY2UKK2ZpbGUocykgaXMgbm90IG1vcmUgcmVjZW50IHRoYW4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXQgZmlsZShzKS4gWW91IGNhbiBzZXQgdGhlCit2YWx1ZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBieSBzcGVjaWZ5aW5nIHRoZSA8dmFyPnZhbHVlPC92YXI+IGF0dHJpYnV0ZS48L3A+CiA8cD5JZiBhIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCwgd2l0aG91dCBhbHNvIHNwZWNpZnlpbmcKLWEgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZSBhCi08YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNtZXJnZS1tYXBwZXIiPm1lcmdlIG1hcHBlcjwvYT4sIHdpdGggdGhlCi08Y29kZT50bzwvY29kZT4gYXR0cmlidXRlIHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCi08Y29kZT50YXJnZXRmaWxlPC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgotPHA+Tm9ybWFsbHksIHRoaXMgdGFzayBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVzZWZ1bCB0byBhdm9pZAotdGFyZ2V0IGV4ZWN1dGlvbiBkZXBlbmRpbmcgb24gdGhlIHJlbGF0aXZlIGFnZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGVzLjwvcD4KK2EgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQsIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHVzZQorYSA8YSBocmVmPSIuLi9UeXBlcy9tYXBwZXIuaHRtbCNtZXJnZS1tYXBwZXIiPm1lcmdlIG1hcHBlcjwvYT4sIHdpdGggdGhlIDx2YXI+dG88L3Zhcj4gYXR0cmlidXRlIHNldAordG8gdGhlIHZhbHVlIG9mIHRoZSA8dmFyPnRhcmdldGZpbGU8L3Zhcj4gYXR0cmlidXRlLjwvcD4KKzxwPk5vcm1hbGx5LCB0aGlzIHRhc2sgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyB0aGF0IGFyZSB1c2VmdWwgdG8gYXZvaWQgdGFyZ2V0IGV4ZWN1dGlvbiBkZXBlbmRpbmcKK29uIHRoZSByZWxhdGl2ZSBhZ2Ugb2YgdGhlIHNwZWNpZmllZCBmaWxlcy48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnByb3BlcnR5PC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmFsdWUgdG8gc2V0IHRoZSBwcm9wZXJ0eSB0by48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+VGhlIHZhbHVlIHRvIHNldCB0aGUgcHJvcGVydHkgdG8uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+LjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNyY2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZpbGUgdG8gY2hlY2sgYWdhaW5zdCB0aGUgdGFyZ2V0IGZpbGUocykuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllcywgdW5sZXNzIGEgbmVzdGVkCisgICAgPHRkPnNyY2ZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byBjaGVjayBhZ2FpbnN0IHRoZSB0YXJnZXQgZmlsZShzKS48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyBhIG5lc3RlZAogICAgIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+IG9yIDxjb2RlPiZsdDtzcmNyZXNvdXJjZXMmZ3Q7PC9jb2RlPgogICAgIGVsZW1lbnQgaXMgcHJlc2VudC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXRmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIGZvciB3aGljaCB3ZSB3YW50IHRvIGRldGVybWluZSB0aGUgc3RhdHVzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIHVubGVzcyBhIG5lc3RlZAotICAgICAgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgaXMgcHJlc2VudC48L3RkPgorICAgIDx0ZD50YXJnZXRmaWxlPC90ZD4KKyAgICA8dGQ+VGhlIGZpbGUgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0dXMuPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSBuZXN0ZWQgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgaXMgcHJlc2VudC48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci08aDQ+PGEgbmFtZT0ic3JjZmlsZXMiPnNyY2ZpbGVzPC9hPjwvaDQ+Ci08cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+IGVsZW1lbnQgaXMgYQotPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiBhbmQgYWxsb3dzIHlvdSB0bwotc3BlY2lmeSBhIHNldCBvZiBmaWxlcyB0byBjaGVjayBhZ2FpbnN0IHRoZSB0YXJnZXQgZmlsZShzKS48L3A+Cis8aDQgaWQ9InNyY2ZpbGVzIj5zcmNmaWxlczwvaDQ+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNmaWxlcyZndDs8L2NvZGU+IGVsZW1lbnQgaXMgYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+CithbmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgc2V0IG9mIGZpbGVzIHRvIGNoZWNrIGFnYWluc3QgdGhlIHRhcmdldCBmaWxlKHMpLjwvcD4KIAotPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBZb3UgY2FuIHNwZWNpZnkgZWl0aGVyIHRoZSA8Y29kZT5zcmNmaWxlPC9jb2RlPgotYXR0cmlidXRlIG9yIG5lc3RlZCA8Y29kZT4mbHQ7c3JjZmlsZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cywgYnV0IG5vdCBib3RoLgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBZb3UgY2FuIHNwZWNpZnkgZWl0aGVyIHRoZSA8dmFyPnNyY2ZpbGU8L3Zhcj4gYXR0cmlidXRlIG9yCituZXN0ZWQgPGNvZGU+Jmx0O3NyY2ZpbGVzJmd0OzwvY29kZT4gZWxlbWVudHMsIGJ1dCBub3QgYm90aC4KIAotPHA+Tm90ZSB0aGF0IHRoZSB0YXNrIHdpbGwgY29tcGxldGVseSBpZ25vcmUgYW55IGRpcmVjdG9yaWVzIHRoYXQgc2VlbQotICB0byBiZSBtYXRjaGVkIGJ5IHRoZSBzcmNmaWxlcyBmaWxlc2V0LCBpdCB3aWxsIG9ubHkgY29uc2lkZXIgbm9ybWFsCi0gIGZpbGVzLiAgSWYgeW91IG5lZWQgbG9naWMgdGhhdCBhcHBsaWVzIHRvIGRpcmVjdG9yaWVzIGFzIHdlbGwsIHVzZSBhCi0gIG5lc3RlZCBzcmNyZXNvdXJjZSBhbmQgYSBkaXJzZXQgKGZvciBleGFtcGxlKS48L3A+Cis8cD5Ob3RlIHRoYXQgdGhlIHRhc2sgd2lsbCBjb21wbGV0ZWx5IGlnbm9yZSBhbnkgZGlyZWN0b3JpZXMgdGhhdCBzZWVtIHRvIGJlIG1hdGNoZWQgYnkKK3RoZSA8dmFyPnNyY2ZpbGVzPC92YXI+IGZpbGVzZXQsIGl0IHdpbGwgb25seSBjb25zaWRlciBub3JtYWwgZmlsZXMuICBJZiB5b3UgbmVlZCBsb2dpYyB0aGF0IGFwcGxpZXMKK3RvIGRpcmVjdG9yaWVzIGFzIHdlbGwsIHVzZSBhIG5lc3RlZCA8Y29kZT5zcmNyZXNvdXJjZXM8L2NvZGU+IGVsZW1lbnQgYW5kIGEgPGNvZGU+ZGlyc2V0PC9jb2RlPgorKGZvciBleGFtcGxlKS48L3A+CiAKLTxoND48YSBuYW1lPSJzcmNyZXNvdXJjZXMiPnNyY3Jlc291cmNlczwvYT48L2g0PgotPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7c3JjcmVzb3VyY2VzJmd0OzwvY29kZT4gZWxlbWVudCBpcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCN1bmlvbiI+dW5pb248L2E+IGFuZCBhbGxvd3MgeW91IHRvCi1zcGVjaWZ5IGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdG8gY2hlY2sgYWdhaW5zdCB0aGUgdGFyZ2V0IGZpbGUocykuCi08ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPjwvcD4KKzxoNCBpZD0ic3JjcmVzb3VyY2VzIj5zcmNyZXNvdXJjZXM8L2g0PgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPiZsdDtzcmNyZXNvdXJjZXMmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzCithIDxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI3VuaW9uIj51bmlvbjwvYT4gYW5kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGNvbGxlY3Rpb24gb2YKK3Jlc291cmNlcyB0byBjaGVjayBhZ2FpbnN0IHRoZSB0YXJnZXQgZmlsZShzKS48L3A+CiAKLTxoND48YSBuYW1lPSJtYXBwZXIiPm1hcHBlcjwvYT48L2g0PgotPHA+VGhlIG5lc3RlZCA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCBhbGxvd3MgeW91IHRvIHNwZWNpZnkKLWEgc2V0IG9mIHRhcmdldCBmaWxlcyB0byBjaGVjayBmb3IgYmVpbmcgdXAtdG8tZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYQotc2V0IG9mIHNvdXJjZSBmaWxlcy48L3A+Ci0gICA8cD4KLSAgICAgIFRoZSBtYXBwZXIgInRvIiBhdHRyaWJ1dGUgaXMgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCBmaWxlLCBvciB0bwotICAgICAgdGhlICJkaXIiIGF0dHJpYnV0ZSBvZiB0aGUgbmVzdGVkIHNyY2ZpbGVzIGVsZW1lbnQuCi0gICA8L3A+Ci0gIDxwPgotICAgIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPiwKLSAgICBvbmUgY2FuIHVzZSBhIGZpbGVuYW1lbWFwcGVyIHR5cGUgaW4gcGxhY2Ugb2YgdGhlIG1hcHBlciBlbGVtZW50LgotICA8L3A+Cis8aDQgaWQ9Im1hcHBlciI+bWFwcGVyPC9oND4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGEgc2V0IG9mIHRhcmdldCBmaWxlcyB0bworY2hlY2sgZm9yIGJlaW5nIHVwLXRvLWRhdGUgd2l0aCByZXNwZWN0IHRvIGEgc2V0IG9mIHNvdXJjZSBmaWxlcy48L3A+Cis8cD5UaGUgbWFwcGVyIDx2YXI+dG88L3Zhcj4gYXR0cmlidXRlIGlzIHJlbGF0aXZlIHRvIHRoZSB0YXJnZXQgZmlsZSwgb3IgdG8gdGhlIDx2YXI+ZGlyPC92YXI+CithdHRyaWJ1dGUgb2YgdGhlIG5lc3RlZCA8Y29kZT5zcmNmaWxlczwvY29kZT4gZWxlbWVudC48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNi4zPC9lbT4sIG9uZSBjYW4gdXNlIGEgPGNvZGU+ZmlsZW5hbWVtYXBwZXI8L2NvZGU+IHR5cGUgaW4gcGxhY2Ugb2YgdGhlIG1hcHBlcgorZWxlbWVudC48L3A+CiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0mcXVvdDt4bWxCdWlsZC5ub3RSZXF1aXJlZCZxdW90OyB0YXJnZXRmaWxlPSZxdW90OyR7ZGVwbG95fVx4bWxDbGFzc2VzLmphciZxdW90OyAmZ3Q7Ci0gICAgJmx0O3NyY2ZpbGVzIGRpcj0gJnF1b3Q7JHtzcmN9L3htbCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmR0ZCZxdW90Oy8mZ3Q7Ci0gICZsdDsvdXB0b2RhdGUmZ3Q7PC9wcmU+Ci08cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT54bWxCdWlsZC5ub3RSZXF1aXJlZDwvY29kZT4gdG8gPGNvZGU+dHJ1ZTwvY29kZT4KLWlmIHRoZSA8Y29kZT4ke2RlcGxveX0veG1sQ2xhc3Nlcy5qYXI8L2NvZGU+IGZpbGUgaXMgbW9yZSB1cC10by1kYXRlIHRoYW4KLWFueSBvZiB0aGUgRFREIGZpbGVzIGluIHRoZSA8Y29kZT4ke3NyY30veG1sPC9jb2RlPiBkaXJlY3RvcnkuPC9wPgorPHA+U2V0IHRoZSBwcm9wZXJ0eSA8Y29kZT54bWxCdWlsZC5ub3RSZXF1aXJlZDwvY29kZT4gdG8gPHE+dHJ1ZTwvcT4gaWYKK3RoZSA8c2FtcD4ke2RlcGxveX0veG1sQ2xhc3Nlcy5qYXI8L3NhbXA+IGZpbGUgaXMgbW9yZSB1cC10by1kYXRlIHRoYW4gYW55IG9mIHRoZSBEVEQgZmlsZXMgaW4KK3RoZSA8c2FtcD4ke3NyY30veG1sPC9zYW1wPiBkaXJlY3RvcnkuPC9wPgorPHByZT4KKyZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0mcXVvdDt4bWxCdWlsZC5ub3RSZXF1aXJlZCZxdW90OyB0YXJnZXRmaWxlPSZxdW90OyR7ZGVwbG95fVx4bWxDbGFzc2VzLmphciZxdW90OyZndDsKKyAgJmx0O3NyY2ZpbGVzIGRpcj0mcXVvdDske3NyY30veG1sJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouZHRkJnF1b3Q7LyZndDsKKyZsdDsvdXB0b2RhdGUmZ3Q7PC9wcmU+CiA8cD5UaGlzIGNhbiBiZSB3cml0dGVuIGFzOjwvcD4KLTxwcmU+ICAmbHQ7dXB0b2RhdGUgcHJvcGVydHk9JnF1b3Q7eG1sQnVpbGQubm90UmVxdWlyZWQmcXVvdDsmZ3Q7Ci0gICAgJmx0O3NyY2ZpbGVzIGRpcj0gJnF1b3Q7JHtzcmN9L3htbCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmR0ZCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O21hcHBlciB0eXBlPSZxdW90O21lcmdlJnF1b3Q7IHRvPSZxdW90OyR7ZGVwbG95fVx4bWxDbGFzc2VzLmphciZxdW90Oy8mZ3Q7Ci0gICZsdDsvdXB0b2RhdGUmZ3Q7PC9wcmU+Ci1hcyB3ZWxsLgorPHByZT4KKyZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0mcXVvdDt4bWxCdWlsZC5ub3RSZXF1aXJlZCZxdW90OyZndDsKKyAgJmx0O3NyY2ZpbGVzIGRpcj0gJnF1b3Q7JHtzcmN9L3htbCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmR0ZCZxdW90Oy8mZ3Q7CisgICZsdDttYXBwZXIgdHlwZT0mcXVvdDttZXJnZSZxdW90OyB0bz0mcXVvdDske2RlcGxveX1ceG1sQ2xhc3Nlcy5qYXImcXVvdDsvJmd0OworJmx0Oy91cHRvZGF0ZSZndDs8L3ByZT4KKzxwPmFzIHdlbGwuPC9wPgogCi1UaGUgPGNvZGU+eG1sQnVpbGQubm90UmVxdWlyZWQ8L2NvZGU+IHByb3BlcnR5IGNhbiB0aGVuIGJlIHVzZWQgaW4gYQotPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+IHRhZydzIDxjb2RlPnVubGVzczwvY29kZT4gYXR0cmlidXRlIHRvCi1jb25kaXRpb25hbGx5IHJ1biB0aGF0IHRhcmdldC4gRm9yIGV4YW1wbGUsIHJ1bm5pbmcgdGhlIGZvbGxvd2luZyB0YXJnZXQ6PC9wPgorPHA+VGhlIDxjb2RlPnhtbEJ1aWxkLm5vdFJlcXVpcmVkPC9jb2RlPiBwcm9wZXJ0eSBjYW4gdGhlbiBiZSB1c2VkIGluIGEgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+Cit0YWcncyA8dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGUgdG8gY29uZGl0aW9uYWxseSBydW4gdGhhdCB0YXJnZXQuIEZvciBleGFtcGxlLCBydW5uaW5nIHRoZQorZm9sbG93aW5nIHRhcmdldDo8L3A+CiA8cHJlPgogJmx0O3RhcmdldCBuYW1lPSZxdW90O3htbEJ1aWxkJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7Y2hrWG1sQnVpbGQmcXVvdDsgdW5sZXNzPSZxdW90O3htbEJ1aWxkLm5vdFJlcXVpcmVkJnF1b3Q7Jmd0OwogICAuLi4KLSZsdDsvdGFyZ2V0Jmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+Cis8cD53aWxsIGZpcnN0IHJ1biB0aGUgPHE+Y2hrWG1sQnVpbGQ8L3E+IHRhcmdldCwgd2hpY2ggY29udGFpbnMgdGhlIDxjb2RlPiZsdDt1cHRvZGF0ZSZndDs8L2NvZGU+Cit0YXNrIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIDxjb2RlPnhtbEJ1aWxkLm5vdFJlcXVpcmVkPC9jb2RlPiBnZXRzIHNldC4gVGhlIHByb3BlcnR5IG5hbWVkIGluCit0aGUgPHZhcj51bmxlc3M8L3Zhcj4gYXR0cmlidXRlIGlzIHRoZW4gY2hlY2tlZCBmb3IgYmVpbmcgc2V0L25vdCBzZXQuICBJZiBpdCBkaWQgZ2V0IHNldCAoaWUuLCB0aGUKK2phciBmaWxlIGlzIHVwLXRvLWRhdGUpLCB0aGVuIHRoZSA8cT54bWxCdWlsZDwvcT4gdGFyZ2V0IHdvbid0IGJlIHJ1bi48L3A+CisKKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbmdsZSBzb3VyY2UgZmlsZSBiZWluZyBjaGVja2VkIGFnYWluc3QgYSBzaW5nbGUgdGFyZ2V0IGZpbGU6PC9wPgorPHByZT4KKyZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0mcXVvdDtpc1VwVG9EYXRlJnF1b3Q7CisgICAgICAgICAgc3JjZmlsZT0mcXVvdDsvdXNyL2xvY2FsL2Jpbi90ZXN0aXQmcXVvdDsKKyAgICAgICAgICB0YXJnZXRmaWxlPSZxdW90OyR7YnVpbGR9Ly5mbGFnZmlsZSZxdW90Oy8mZ3Q7CiA8L3ByZT4KLXdpbGwgZmlyc3QgcnVuIHRoZSA8Y29kZT5jaGtYbWxCdWlsZDwvY29kZT4gdGFyZ2V0LCB3aGljaCBjb250YWlucwotdGhlIDxjb2RlPiZsdDt1cHRvZGF0ZSZndDs8L2NvZGU+IHRhc2sgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIKLTxjb2RlPnhtbEJ1aWxkLm5vdFJlcXVpcmVkPC9jb2RlPiBnZXRzIHNldC4gVGhlIHByb3BlcnR5IG5hbWVkIGluCi10aGUgPGNvZGU+dW5sZXNzPC9jb2RlPiBhdHRyaWJ1dGUgaXMgdGhlbiBjaGVja2VkIGZvciBiZWluZyBzZXQvbm90IHNldC4KLUlmIGl0IGRpZCBnZXQgc2V0IChpZS4sIHRoZSBqYXIgZmlsZSBpcyB1cC10by1kYXRlKSwKLXRoZW4gdGhlIDxjb2RlPnhtbEJ1aWxkPC9jb2RlPiB0YXJnZXQgd29uJ3QgYmUgcnVuLgotPC9wPgotCi08cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGJlaW5nIGNoZWNrZWQKLWFnYWluc3QgYSBzaW5nbGUgdGFyZ2V0IGZpbGU6PC9wPgotPHByZT4gICZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0mcXVvdDtpc1VwVG9EYXRlJnF1b3Q7Ci0gICAgICAgICAgICBzcmNmaWxlPSZxdW90Oy91c3IvbG9jYWwvYmluL3Rlc3RpdCZxdW90OwotICAgICAgICAgICAgdGFyZ2V0ZmlsZT0mcXVvdDske2J1aWxkfS8uZmxhZ2ZpbGUmcXVvdDsvJmd0OwotPC9wcmU+Ci08cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc1VwVG9EYXRlPC9jb2RlPiB0byA8Y29kZT50cnVlPC9jb2RlPgotaWYgPGNvZGU+L3Vzci9sb2NhbC9iaW4vdGVzdGl0PC9jb2RlPiBpcyBub3QgbmV3ZXIgdGhhbgotPGNvZGU+JHtidWlsZH0vLmZsYWdmaWxlPC9jb2RlPi48L3A+Ci08L3A+Ci0gIDxwPgotICAgIFRoZSBmb2xsb3dpbmcgc2hvd3MgdXNhZ2Ugb2YgYSByZWxhdGl2ZSBtYXBwZXIuCi0gIDwvcD4KLSAgPHByZT4KLSAgICAmbHQ7dXB0b2RhdGUgcHJvcGVydHk9ImNoZWNrVXB0b2RhdGUudXB0b2RhdGUiJmd0OwotICAgICAgJmx0O3NyY2ZpbGVzIGRpcj0ic3JjIiBpbmNsdWRlcz0iKiIvJmd0OwotICAgICAgJmx0O21hcHBlciB0eXBlPSJtZXJnZSIgdG89Ii4uL2Rlc3Qvb3V0cHV0LmRvbmUiLyZndDsKLSAgICAmbHQ7L3VwdG9kYXRlJmd0OwotICAgICZsdDtlY2hvIG1lc3NhZ2U9ImNoZWNrVXB0b2RhdGUgcmVzdWx0OiAke2NoZWNrVXB0b2RhdGUudXB0b2RhdGV9Ii8mZ3Q7Ci0gIDwvcHJlPgotICA8cD4KLSAgICBUaGUgcHJldmlvdXMgZXhhbXBsZSBjYW4gYmUgYSBiaXQgY29uZnVzaW5nLCBzbyBpdCBtYXkgYmUgYmV0dGVyIHRvCi0gICAgdXNlIGFic29sdXRlIHBhdGhzOgotICA8L3A+Ci0gIDxwcmU+Ci0gICAgJmx0O3Byb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiBsb2NhdGlvbj0iZGVzdCIvJmd0OwotICAgICZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0iY2hlY2tVcHRvZGF0ZS51cHRvZGF0ZSImZ3Q7Ci0gICAgICAmbHQ7c3JjZmlsZXMgZGlyPSJzcmMiIGluY2x1ZGVzPSIqIi8mZ3Q7Ci0gICAgICAmbHQ7bWFwcGVyIHR5cGU9Im1lcmdlIiB0bz0iJHtkZXN0LmRpcn0vb3V0cHV0LmRvbmUiLyZndDsKLSAgICAmbHQ7L3VwdG9kYXRlJmd0OwotICA8L3ByZT4KLQotCis8cD5zZXRzIHRoZSBwcm9wZXJ0eSA8Y29kZT5pc1VwVG9EYXRlPC9jb2RlPiB0byA8cT50cnVlPC9xPiBpZiA8c2FtcD4vdXNyL2xvY2FsL2Jpbi90ZXN0aXQ8L3NhbXA+IGlzCitub3QgbmV3ZXIgdGhhbiA8c2FtcD4ke2J1aWxkfS8uZmxhZ2ZpbGU8L3NhbXA+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgc2hvd3MgdXNhZ2Ugb2YgYSByZWxhdGl2ZSBtYXBwZXIuPC9wPgorPHByZT4KKyZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0iY2hlY2tVcHRvZGF0ZS51cHRvZGF0ZSImZ3Q7CisgICZsdDtzcmNmaWxlcyBkaXI9InNyYyIgaW5jbHVkZXM9IioiLyZndDsKKyAgJmx0O21hcHBlciB0eXBlPSJtZXJnZSIgdG89Ii4uL2Rlc3Qvb3V0cHV0LmRvbmUiLyZndDsKKyZsdDsvdXB0b2RhdGUmZ3Q7CismbHQ7ZWNobyBtZXNzYWdlPSJjaGVja1VwdG9kYXRlIHJlc3VsdDogJHtjaGVja1VwdG9kYXRlLnVwdG9kYXRlfSIvJmd0OzwvcHJlPgorPHA+VGhlIHByZXZpb3VzIGV4YW1wbGUgY2FuIGJlIGEgYml0IGNvbmZ1c2luZywgc28gaXQgbWF5IGJlIGJldHRlciB0byB1c2UgYWJzb2x1dGUgcGF0aHM6PC9wPgorPHByZT4KKyZsdDtwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgbG9jYXRpb249ImRlc3QiLyZndDsKKyZsdDt1cHRvZGF0ZSBwcm9wZXJ0eT0iY2hlY2tVcHRvZGF0ZS51cHRvZGF0ZSImZ3Q7CisgICZsdDtzcmNmaWxlcyBkaXI9InNyYyIgaW5jbHVkZXM9IioiLyZndDsKKyAgJmx0O21hcHBlciB0eXBlPSJtZXJnZSIgdG89IiR7ZGVzdC5kaXJ9L291dHB1dC5kb25lIi8mZ3Q7CismbHQ7L3VwdG9kYXRlJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy92ZXJpZnlqYXIuaHRtbCBiL21hbnVhbC9UYXNrcy92ZXJpZnlqYXIuaHRtbAppbmRleCBiMmRmNDI2Li4zZDM1ZWJiIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvdmVyaWZ5amFyLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3ZlcmlmeWphci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTY3ICsxNSwxNTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlZlcmlmeUphciBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJ2ZXJpZnlqYXIiPlZlcmlmeUphcjwvYT48L2gyPgorPGgyIGlkPSJ2ZXJpZnlqYXIiPlZlcmlmeUphcjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+VmVyaWZpZXMgSkFSIGZpbGVzIHdpdGggdGhlIDx0dD5qYXJzaWduZXI8L3R0PiBjb21tYW5kIGxpbmUgdG9vbC4KLUl0IHdpbGwgdGFrZSBhIG5hbWVkIGZpbGUgaW4gdGhlIDx0dD5qYXI8L3R0PiBhdHRyaWJ1dGUuIE5lc3RlZCBwYXRocyBhcmUgYWxzbwotc3VwcG9ydGVkCi08L3A+Ci0KKzxwPlZlcmlmaWVzIEpBUiBmaWxlcyB3aXRoCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvdG9vbHMvd2luZG93cy9qYXJzaWduZXIuaHRtbCIKK3RhcmdldD0iX3RvcCI+PGtiZD5qYXJzaWduZXI8L2tiZD48L2E+IGNvbW1hbmQgbGluZSB0b29sLiAgSXQgd2lsbCB0YWtlIGEgbmFtZWQgZmlsZSBpbgordGhlIDx2YXI+amFyPC92YXI+IGF0dHJpYnV0ZS4gTmVzdGVkIHBhdGhzIGFyZSBhbHNvIHN1cHBvcnRlZC48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+amFyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBqYXIgZmlsZSB0byB2ZXJpZnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgbmVzdGVkIHBhdGhzIGhhdmUKLSAgICAgIGJlZW4gdXNlZC48L3RkPgorICAgIDx0ZD5qYXI8L3RkPgorICAgIDx0ZD50aGUgamFyIGZpbGUgdG8gdmVyaWZ5PC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgbmVzdGVkIHBhdGhzIGhhdmUgYmVlbiB1c2VkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWxpYXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGFsaWFzIHRvIHZlcmlmeSB1bmRlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMuPC90ZD4KKyAgICA8dGQ+YWxpYXM8L3RkPgorICAgIDx0ZD50aGUgYWxpYXMgdG8gdmVyaWZ5IHVuZGVyPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RvcmVwYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuCisgICAgPHRkPnN0b3JlcGFzczwvdGQ+CisgICAgPHRkPnBhc3N3b3JkIGZvciBrZXlzdG9yZSBpbnRlZ3JpdHkuCiAgICAgTm90ZSB0aGF0CiAgICAgamFyc2lnbmVyIGRvZXMgbm90IHJlYWQgdGhlIHBhc3N3b3JkIGZyb20gc3RkaW4gZHVyaW5nCiAgICAgdmVyaWZpY2F0aW9uLCBzbyB0aGUgcGFzc3dvcmQgbXVzdCBiZSBzZW5kIHZpYSBhIGNvbW1hbmQgbGluZQogICAgIGludGVyZmFjZSBhbmQgbWF5IGJlIHZpc2libGUgdG8gb3RoZXIgdXNlcnMgb2YgdGhlIHN5c3RlbS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZSBsb2NhdGlvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmtleXN0b3JlPC90ZD4KKyAgICA8dGQ+a2V5c3RvcmUgbG9jYXRpb248L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN0b3JldHlwZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5rZXlzdG9yZSB0eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3RvcmV0eXBlPC90ZD4KKyAgICA8dGQ+a2V5c3RvcmUgdHlwZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2V5cGFzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXNzd29yZCBmb3IgcHJpdmF0ZSBrZXkgKGlmIGRpZmZlcmVudCk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5rZXlwYXNzPC90ZD4KKyAgICA8dGQ+cGFzc3dvcmQgZm9yIHByaXZhdGUga2V5IChpZiBkaWZmZXJlbnQpPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jZXJ0aWZpY2F0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+KHRydWUgfCBmYWxzZSkgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBjZXJ0aWZpY2F0ZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgZmFsc2U8L3RkPgorICAgIDx0ZD5jZXJ0aWZpY2F0ZXM8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgY2VydGlmaWNhdGVzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmVyYm9zZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4odHJ1ZSB8IGZhbHNlKSB2ZXJib3NlIG91dHB1dCB3aGVuIHZlcmlmeWluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzsgZGVmYXVsdCBmYWxzZTwvdGQ+CisgICAgPHRkPnZlcmJvc2U8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIHZlcmJvc2Ugb3V0cHV0IHdoZW4gdmVyaWZ5aW5nPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3RyaWN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPih0cnVlIHwgZmFsc2UpIHN0cmljdCBjaGVja2luZyB3aGVuIHZlcmlmeWluZy48YnIvPjxlbT5zaW5jZSBBbnQgMS45LjE8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgZmFsc2U8L3RkPgorICAgIDx0ZD5zdHJpY3Q8L3RkPgorICAgIDx0ZD4oPHE+dHJ1ZXxmYWxzZTwvcT4pIHN0cmljdCBjaGVja2luZyB3aGVuIHZlcmlmeWluZy48YnIvPjxlbT5zaW5jZSBBbnQgMS45LjE8L2VtPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYXhtZW1vcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmaWVzIHRoZSBtYXhpbXVtIG1lbW9yeSB0aGUgamFyc2lnbmVyIFZNIHdpbGwgdXNlLiBTcGVjaWZpZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZSBvZiBzdGFuZGFyZCBqYXZhIG1lbW9yeSBzcGVjcyAoZS5nLiAxMjhtID0gMTI4IE1CeXRlcyk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYXhtZW1vcnk8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgdGhlIG1heGltdW0gbWVtb3J5IHRoZSA8a2JkPmphcnNpZ25lcjwva2JkPiBKVk0gd2lsbCB1c2UuIFNwZWNpZmllZCBpbiB0aGUgc3R5bGUKKyAgICAgIG9mIHN0YW5kYXJkIEphdmEgbWVtb3J5IHNwZWNzIChlLmcuIDxxPjEyOG08L3E+ID0gMTI4IE1CeXRlcyk8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4ZWN1dGFibGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3BlY2lmeSBhIHBhcnRpY3VsYXIgPGNvZGU+amFyc2lnbmVyPC9jb2RlPiBleGVjdXRhYmxlCi0gICAgICB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgYmluYXJ5IChmb3VuZCBpbiB0aGUgc2FtZSBKREsgYXMKLSAgICAgIEFwYWNoZSBBbnQgaXMgcnVubmluZyBpbikuPGJyLz4KLSAgICAgIE11c3Qgc3VwcG9ydCB0aGUgc2FtZSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhcyB0aGUgU3VuIEpESwotICAgICAgamFyc2lnbmVyIGNvbW1hbmQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgPC90cj4gIAorICAgIDx0ZD5leGVjdXRhYmxlPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSBhIHBhcnRpY3VsYXIgPGtiZD5qYXJzaWduZXI8L2tiZD4gZXhlY3V0YWJsZSB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgYmluYXJ5CisgICAgICAoZm91bmQgaW4gdGhlIHNhbWUgSkRLIGFzIEFwYWNoZSBBbnQgaXMgcnVubmluZyBpbikuPGJyLz4gIE11c3Qgc3VwcG9ydCB0aGUgc2FtZSBjb21tYW5kIGxpbmUKKyAgICAgIG9wdGlvbnMgYXMgdGhlIFN1biBKREsgPGtiZD5qYXJzaWduZXI8L2tiZD4gY29tbWFuZC4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3ZpZGVybmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lIG9mIGEgY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlIHByb3ZpZGVyJ3MgbmFtZQorICAgIDx0ZD5wcm92aWRlcm5hbWU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgY3J5cHRvZ3JhcGhpYyBzZXJ2aWNlIHByb3ZpZGVyJ3MgbmFtZQogICAgICAgd2hlbiBsaXN0ZWQgaW4gdGhlIHNlY3VyaXR5IHByb3BlcnRpZXMgZmlsZS4KLSAgICAgIDxlbT5zaW5jZSBBbnQgMS45LjE0PC9lbT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgIDxlbT5zaW5jZSBBbnQgMS4xMC42PC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcm92aWRlcmNsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWUgb2YgYSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgcHJvdmlkZXIncyBtYXN0ZXIKKyAgICA8dGQ+cHJvdmlkZXJjbGFzczwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBjcnlwdG9ncmFwaGljIHNlcnZpY2UgcHJvdmlkZXIncyBtYXN0ZXIKICAgICAgIGNsYXNzIGZpbGUgd2hlbiB0aGUgc2VydmljZSBwcm92aWRlciBpcyBub3QgbGlzdGVkIGluIHRoZSBzZWN1cml0eQogICAgICAgcHJvcGVydGllcyBmaWxlLgotICAgICAgPGVtPnNpbmNlIEFudCAxLjkuMTQ8L2VtPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByb3ZpZGVyYXJnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlJlcHJlc2VudHMgYW4gb3B0aW9uYWwgc3RyaW5nIGlucHV0IGFyZ3VtZW50IGZvcgorICAgIDx0ZD5wcm92aWRlcmFyZzwvdGQ+CisgICAgPHRkPlJlcHJlc2VudHMgYW4gb3B0aW9uYWwgc3RyaW5nIGlucHV0IGFyZ3VtZW50IGZvcgogICAgICAgdGhlIGNvbnN0cnVjdG9yIG9mIHByb3ZpZGVyX2NsYXNzX25hbWUuIElnbm9yZWQKICAgICAgIGlmIDxjb2RlPnByb3ZpZGVyY2xhc3M8L2NvZGU+IGlzIG5vdCBzZXQuCi0gICAgICA8ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8ZW0+c2luY2UgQW50IDEuMTAuNjwvZW0+LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDM+UGFyYW1ldGVycyBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGggb2YgSkFSIGZpbGVzIHRvIHZlcmlmeS4gPGVtPnNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnBhdGg8L3RkPgorICAgIDx0ZD5wYXRoIG9mIEpBUiBmaWxlcyB0byB2ZXJpZnkuIDxlbT5zaW5jZSBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVzZXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNldCBvZiBKQVIgZmlsZXMgdG8gdmVyaWZ5LiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWxlc2V0PC90ZD4KKyAgICA8dGQ+ZmlsZXNldCBvZiBKQVIgZmlsZXMgdG8gdmVyaWZ5LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3lzcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SlZNIHN5c3RlbSBwcm9wZXJ0aWVzLCB3aXRoIHRoZSBzeW50YXggb2YgQW50Ci0gICAgPGEgaHJlZj0iZXhlYy5odG1sI2VudiI+ZW52aXJvbm1lbnQgdmFyaWFibGVzPC9hPiA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGFuZCBvbmx5IG9uZSBjYW4gYmUgc3VwcGxpZWQ8L3RkPgorICAgIDx0ZD5zeXNwcm9wZXJ0eTwvdGQ+CisgICAgPHRkPkpWTSBzeXN0ZW0gcHJvcGVydGllcywgd2l0aCB0aGUgc3ludGF4IG9mIEFudCA8YSBocmVmPSJleGVjLmh0bWwjZW52Ij5lbnZpcm9ubWVudAorICAgICAgdmFyaWFibGVzPC9hPjwvdGQ+CisgICAgPHRkPk5vLCBhbmQgb25seSBvbmUgY2FuIGJlIHN1cHBsaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YXJnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlVzZSB0aGlzIHRvIHNwZWNpZnkgYSA8Y29kZT5rZXl0b29sPC9jb2RlPgorICAgIDx0ZD5hcmc8L3RkPgorICAgIDx0ZD5Vc2UgdGhpcyB0byBzcGVjaWZ5IGEgPGtiZD5rZXl0b29sPC9rYmQ+CiAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNhcmciPmNvbW1hbmQgbGluZSBhcmd1bWVudDwvYT4gbm90CiAgICAgZXhwbGljaXRseSBzdXBwb3J0ZWQgdmlhIGFuIGF0dHJpYnV0ZS4KLSAgICA8ZW0+c2luY2UgQW50IDEuOS4xNDwvZW0+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPGVtPnNpbmNlIEFudCAxLjEwLjY8L2VtPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoMz5FeGFtcGxlczwvaDM+Ci0gIDxibG9ja3F1b3RlPjxwcmU+CisKKzxwPlZlcmlmeSB0aGUgPHNhbXA+YW50Lmphcjwvc2FtcD4gd2l0aCBhbGlhcyA8cT5hcGFjaGUtZ3JvdXA8L3E+IGFjY2Vzc2luZyB0aGUga2V5c3RvcmUgYW5kIHByaXZhdGUKK2tleSB2aWEgPHE+c2VjcmV0PC9xPiBwYXNzd29yZC48L3A+Cis8cHJlPgogJmx0O3ZlcmlmeWphciBqYXI9JnF1b3Q7JHtkaXN0fS9saWIvYW50LmphciZxdW90OwotYWxpYXM9JnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IHN0b3JlcGFzcz0mcXVvdDtzZWNyZXQmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+Ci0gIHZlcmlmaWVzIHRoZSBhbnQuamFyIHdpdGggYWxpYXMgJnF1b3Q7YXBhY2hlLWdyb3VwJnF1b3Q7IGFjY2Vzc2luZyB0aGUKLSAga2V5c3RvcmUgYW5kIHByaXZhdGUga2V5IHZpYSAmcXVvdDtzZWNyZXQmcXVvdDsgcGFzc3dvcmQuCi08L3A+Ci0KLQorICAgICAgICAgICBhbGlhcz0mcXVvdDthcGFjaGUtZ3JvdXAmcXVvdDsgc3RvcmVwYXNzPSZxdW90O3NlY3JldCZxdW90Oy8mZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3Zzcy5odG1sIGIvbWFudWFsL1Rhc2tzL3Zzcy5odG1sCmluZGV4IDJjMGVkNjguLjJjNmRmYTEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy92c3MuaHRtbAorKysgYi9tYW51YWwvVGFza3MvdnNzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzMzMgKzE1LDMxMyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZShWU1MpIFRhc2tzPC90aXRsZT4KKzx0aXRsZT5NaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgKFZTUykgVGFza3M8L3RpdGxlPgogPC9oZWFkPgogPGJvZHk+CiA8aDE+TWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlIFRhc2tzIFVzZXIgTWFudWFsPC9oMT4KIDxwPmJ5PC9wPgogPHVsPgotICAgIDxsaT5DcmFpZyBDb3R0aW5naGFtPC9saT4KLSAgICA8bGk+QW5kcmV3IEV2ZXJpdHQ8L2xpPgotICAgIDxsaT5CYWxhenMgRmVqZXMgMjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9Im1haWx0bzpHbGVubl9Ud2lnZ3NAYm1jLmNvbSI+R2xlbm5fVHdpZ2dzQGJtYy5jb208L2E+PC9saT4KLSAgICA8bGk+TWFydGluIFBvZXNjaGwgKDxhIGhyZWY9Im1haWx0bzptcG9lc2NobEBtYXJtb3QuYXQiPm1wb2VzY2hsQG1hcm1vdC5hdDwvYT4pPC9saT4KLSAgICA8bGk+UGhpbGxpcCBXZWxsczwvbGk+Ci0gICAgPGxpPkpvbiBTa2VldCAoPGEgaHJlZj0ibWFpbHRvOmpvbi5za2VldEBwZXJhbW9uLmNvbSI+am9uLnNrZWV0QHBlcmFtb24uY29tPC9hPik8L2xpPgotICAgIDxsaT5OaWdlbCBNYWduYXkgKDxhIGhyZWY9Im1haWx0bzpuaWdlbC5tYWduYXlAcGFyc2VjLmNvLnVrIj5uaWdlbC5tYWduYXlAcGFyc2VjLmNvLnVrPC9hPik8L2xpPgotICAgIDxsaT5HYXJ5IFMuIFdlYXZlcjwvbGk+Ci0gICAgPGxpPkplc3NlIFN0b2NrYWxsPC9saT4KLSA8L3VsPgotPGhyPgorICA8bGk+Q3JhaWcgQ290dGluZ2hhbTwvbGk+CisgIDxsaT5BbmRyZXcgRXZlcml0dDwvbGk+CisgIDxsaT5CYWxhenMgRmVqZXMgMjwvbGk+CisgIDxsaT48YSBocmVmPSJtYWlsdG86R2xlbm5fVHdpZ2dzQGJtYy5jb20iPkdsZW5uX1R3aWdnc0BibWMuY29tPC9hPjwvbGk+CisgIDxsaT5NYXJ0aW4gUG9lc2NobCAoPGEgaHJlZj0ibWFpbHRvOm1wb2VzY2hsQG1hcm1vdC5hdCI+bXBvZXNjaGxAbWFybW90LmF0PC9hPik8L2xpPgorICA8bGk+UGhpbGxpcCBXZWxsczwvbGk+CisgIDxsaT5Kb24gU2tlZXQgKDxhIGhyZWY9Im1haWx0bzpqb24uc2tlZXRAcGVyYW1vbi5jb20iPmpvbi5za2VldEBwZXJhbW9uLmNvbTwvYT4pPC9saT4KKyAgPGxpPk5pZ2VsIE1hZ25heSAoPGEgaHJlZj0ibWFpbHRvOm5pZ2VsLm1hZ25heUBwYXJzZWMuY28udWsiPm5pZ2VsLm1hZ25heUBwYXJzZWMuY28udWs8L2E+KTwvbGk+CisgIDxsaT5HYXJ5IFMuIFdlYXZlcjwvbGk+CisgIDxsaT5KZXNzZSBTdG9ja2FsbDwvbGk+Cis8L3VsPgorPGhyLz4KIDxoMj5Db250ZW50czwvaDI+CiA8dWw+Ci0gICAgPGxpPjxhIGhyZWY9IiNpbnRybyI+SW50cm9kdWN0aW9uPC9hPjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiN0YXNrcyI+VGhlIFRhc2tzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSIjaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3Rhc2tzIj5UaGUgVGFza3M8L2E+PC9saT4KIDwvdWw+Ci08YnI+Ci08aDI+PGEgbmFtZT0iaW50cm8iPkludHJvZHVjdGlvbjwvYT48L2gyPgotPHA+VGhlc2UgdGFza3MgcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8gdGhlCi08YSBocmVmPSJodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3NzYWZlL2RlZmF1bHQuYXNwIiB0YXJnZXQ9Il90b3AiPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZTwvYT4gU0NNLgotVGhlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzczwvY29kZT4gcGFja2FnZSBjb25zaXN0cyBvZiBhIHNpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydAotdnNzIGZ1bmN0aW9uYWxpdHkgYXMgd2VsbCBhcyBzb21lIEFwYWNoZSBBbnQgdGFza3MgZW5jYXBzdWxhdGluZyBmcmVxdWVudGx5IHVzZWQgdnNzIGNvbW1hbmRzLgotQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZXNlIGNvbW1hbmRzIG9uIHRoZSBkZXNrdG9wLAotdGhleSB3ZXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGF1dG9tYXRlZCBidWlsZCBzeXN0ZW1zLjwvcD4KLTxwPgotSWYgeW91IGdldCBhIENyZWF0ZVByb2Nlc3MgSU9FcnJvcj0yIHdoZW4gcnVubmluZyB0aGVzZSwgaXQgbWVhbnMKLXRoYXQgc3MuZXhlIHdhcyBub3QgZm91bmQuIENoZWNrIHRvIHNlZSBpZiB5b3UgY2FuIHJ1biBpdCBmcm9tIHRoZQotY29tbWFuZCBsaW5lIC15b3UgbWF5IG5lZWQgdG8gYWx0ZXIgeW91ciBwYXRoLCBvciBzZXQgdGhlIDx0dD5zc2RpcjwvdHQ+Ci1wcm9wZXJ0eS4KLTxoMj48YSBuYW1lPSJ0YXNrcyI+VGhlIFRhc2tzPC9hPjwvaDI+CiAKLTx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+Ci0gICAgPHRyPgotICAgICAgICA8dGQ+PGEgaHJlZj0iI3Zzc2dldCI+dnNzZ2V0PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZD5SZXRyaWV2ZXMgYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgVlNTIGZpbGUocykuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgICAgPHRkPjxhIGhyZWY9IiN2c3NsYWJlbCI+dnNzbGFiZWw8L2E+PC90ZD4KLSAgICAgICAgPHRkPkFzc2lnbnMgYSBsYWJlbCB0byB0aGUgc3BlY2lmaWVkIHZlcnNpb24gb3IgY3VycmVudCB2ZXJzaW9uIG9mIGEgZmlsZSBvciBwcm9qZWN0LjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzaGlzdG9yeSI+dnNzaGlzdG9yeTwvYT48L3RkPgotICAgICAgICA8dGQ+U2hvd3MgdGhlIGhpc3Rvcnkgb2YgYSBmaWxlIG9yIHByb2plY3QgaW4gVlNTLjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tpbiI+dnNzY2hlY2tpbjwvYT48L3RkPgotICAgICAgICA8dGQ+VXBkYXRlcyBWU1Mgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gYSBjaGVja2VkIG91dCBmaWxlLCBhbmQgdW5sb2NrcyB0aGUgVlNTIG1hc3RlciBjb3B5LjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tvdXQiPnZzc2NoZWNrb3V0PC9hPjwvdGQ+Ci0gICAgICAgIDx0ZD5Db3BpZXMgYSBmaWxlIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCB0byB0aGUgY3VycmVudCBmb2xkZXIsIGZvciB0aGUgcHVycG9zZSBvZiBlZGl0aW5nLjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzYWRkIj52c3NhZGQ8L2E+PC90ZD4KLSAgICAgICAgPHRkPkFkZHMgYSBuZXcgZmlsZSBpbnRvIHRoZSBWU1MgQXJjaGl2ZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY3AiPnZzc2NwPC9hPjwvdGQ+Ci0gICAgICAgIDx0ZD5DaGFuZ2UgdGhlIGN1cnJlbnQgcHJvamVjdCBiZWluZyB1c2VkIGluIFZTUzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICAgIDx0ZD48YSBocmVmPSIjdnNzY3JlYXRlIj52c3NjcmVhdGU8L2E+PC90ZD4KLSAgICAgICAgPHRkPkNyZWF0ZXMgYSBwcm9qZWN0IGluIFZTUy48L3RkPgotICAgIDwvdHI+Cis8YnIvPgorPGgyIGlkPSJpbnRybyI+SW50cm9kdWN0aW9uPC9oMj4KKzxwPlRoZXNlIHRhc2tzIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8zaDA1NDRreCh2PXZzLjgwKS5hc3B4IgordGFyZ2V0PSJfdG9wIj5NaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmU8L2E+IFNDTS4KK1RoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudnNzPC9jb2RlPiBwYWNrYWdlIGNvbnNpc3RzIG9mIGEKK3NpbXBsZSBmcmFtZXdvcmsgdG8gc3VwcG9ydCBWU1MgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsIGFzIHNvbWUgQXBhY2hlIEFudCB0YXNrcyBlbmNhcHN1bGF0aW5nCitmcmVxdWVudGx5IHVzZWQgVlNTIGNvbW1hbmRzLiAgQWx0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZXNlIGNvbW1hbmRzIG9uIHRoZSBkZXNrdG9wLCB0aGV5Cit3ZXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IGF1dG9tYXRlZCBidWlsZCBzeXN0ZW1zLjwvcD4KKzxwPklmIHlvdSBnZXQgYSA8Y29kZSBjbGFzcz0ib3V0cHV0Ij5DcmVhdGVQcm9jZXNzIGVycm9yPTI8L2NvZGU+IHdoZW4gcnVubmluZyB0aGVzZSwgaXQgbWVhbnMKK3RoYXQgPGtiZD5zcy5leGU8L2tiZD4gd2FzIG5vdCBmb3VuZC4gQ2hlY2sgdG8gc2VlIGlmIHlvdSBjYW4gcnVuIGl0IGZyb20gdGhlIGNvbW1hbmQgbGluZSZtZGFzaDt5b3UKK21heSBuZWVkIHRvIGFsdGVyIHlvdXIgcGF0aCwgb3Igc2V0IHRoZSA8dmFyPnNzZGlyPC92YXI+IHByb3BlcnR5LjwvcD4KKzxoMiBpZD0idGFza3MiPlRoZSBUYXNrczwvaDI+CisKKzx0YWJsZT4KKyAgPHRyPjx0aCBzY29wZT0iY29sIj5UYXNrPC90aD48dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPjwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iI3Zzc2dldCI+dnNzZ2V0PC9hPjwvdGQ+CisgICAgPHRkPlJldHJpZXZlcyBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBWU1MgZmlsZShzKS48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IiN2c3NsYWJlbCI+dnNzbGFiZWw8L2E+PC90ZD4KKyAgICA8dGQ+QXNzaWducyBhIGxhYmVsIHRvIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBvciBjdXJyZW50IHZlcnNpb24gb2YgYSBmaWxlIG9yIHByb2plY3QuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzaGlzdG9yeSI+dnNzaGlzdG9yeTwvYT48L3RkPgorICAgIDx0ZD5TaG93cyB0aGUgaGlzdG9yeSBvZiBhIGZpbGUgb3IgcHJvamVjdCBpbiBWU1MuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tpbiI+dnNzY2hlY2tpbjwvYT48L3RkPgorICAgIDx0ZD5VcGRhdGVzIFZTUyB3aXRoIGNoYW5nZXMgbWFkZSB0byBhIGNoZWNrZWQgb3V0IGZpbGUsIGFuZCB1bmxvY2tzIHRoZSBWU1MgbWFzdGVyIGNvcHkuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzY2hlY2tvdXQiPnZzc2NoZWNrb3V0PC9hPjwvdGQ+CisgICAgPHRkPkNvcGllcyBhIGZpbGUgZnJvbSB0aGUgY3VycmVudCBwcm9qZWN0IHRvIHRoZSBjdXJyZW50IGZvbGRlciwgZm9yIHRoZSBwdXJwb3NlIG9mIGVkaXRpbmcuPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzYWRkIj52c3NhZGQ8L2E+PC90ZD4KKyAgICA8dGQ+QWRkcyBhIG5ldyBmaWxlIGludG8gdGhlIFZTUyBBcmNoaXZlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzY3AiPnZzc2NwPC9hPjwvdGQ+CisgICAgPHRkPkNoYW5nZSB0aGUgY3VycmVudCBwcm9qZWN0IGJlaW5nIHVzZWQgaW4gVlNTPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSIjdnNzY3JlYXRlIj52c3NjcmVhdGU8L2E+PC90ZD4KKyAgICA8dGQ+Q3JlYXRlcyBhIHByb2plY3QgaW4gVlNTLjwvdGQ+CisgIDwvdHI+CiA8L3RhYmxlPgogCi08aHI+Cis8aHIvPgogPGgyPlRhc2sgRGVzY3JpcHRpb25zPC9oMj4KIAogPCEtLSBWU1NHRVQgLS0+CiAKLTxoMj48YSBuYW1lPSJ2c3NnZXQiPlZzc0dldDwvYT48L2gyPgorPGgyIGlkPSJ2c3NnZXQiPlZzc0dldDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBwZXJmb3JtIEdFVCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCi08cD5JZiB5b3Ugc3BlY2lmeSB0d28gb3IgbW9yZSBhdHRyaWJ1dGVzIGZyb20gdmVyc2lvbiwgZGF0ZSBhbmQKLWxhYmVsIG9ubHkgb25lIHdpbGwgYmUgdXNlZCBpbiB0aGUgb3JkZXIgdmVyc2lvbiwgZGF0ZSwgbGFiZWwuPC9wPgorPHA+VGFzayB0byBwZXJmb3JtIEdFVCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuPC9wPgorPHA+SWYgeW91IHNwZWNpZnkgdHdvIG9yIG1vcmUgYXR0cmlidXRlcyBmcm9tIHZlcnNpb24sIGRhdGUgYW5kIGxhYmVsIG9ubHkgb25lIHdpbGwgYmUgdXNlZCBpbiB0aGUKK29yZGVyIHZlcnNpb24sIGRhdGUsIGxhYmVsLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD52c3NwYXRoPC90ZD4KLSAgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0bwotICAgICAgICAgcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+Ci0gICAgIDx0ZD5ZZXM8L3RkPgorICAgIDx0ZD52c3NwYXRoPC90ZD4KKyAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcwotICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQotICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKLSAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+bG9naW48L3RkPgorICAgIDx0ZD48cT51c2VybmFtZVsscGFzc3dvcmRdPC9xPiZtZGFzaDtUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzIHRvIFZTUy4gTm90ZQorICAgICAgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSZtZGFzaDtBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UKKyAgICAgIGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KLSAgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPmxvY2FscGF0aDwvdGQ+CisgICAgPHRkPk92ZXJyaWRlIHRoZSB3b3JraW5nIGRpcmVjdG9yeSBhbmQgZ2V0IHRvIHRoZSBzcGVjaWZpZWQgcGF0aDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKLSAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8a2JkPnNzLmV4ZTwva2JkPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IGV4cGVjdGVkIHRvIGJlIGluIDxjb2RlPlBBVEg8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+Ci0gICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jjc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXMuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8c2FtcD5zcmNzYWZlLmluaTwvc2FtcD4gcmVzaWRlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPndyaXRhYmxlPC90ZD4KLSAgICAgPHRkPnRydWUgb3IgZmFsc2U7IGRlZmF1bHQgZmFsc2U8L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD53cml0YWJsZTwvdGQ+CisgICAgPHRkPjxxPnRydWV8ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KLSAgICAgPHRkPnRydWUgb3IgZmFsc2U7IGRlZmF1bHQgZmFsc2UuIE5vdGUgaG93ZXZlciB0aGF0IGluIHRoZSBTb3VyY2VTYWZlIFVJCi0gICAgICwgdGhlcmUgaXMgYSBzZXR0aW5nIGFjY2Vzc2VkIHZpYSBUb29scy9PcHRpb25zL0dlbmVyYWxUYWIgY2FsbGVkCi0gICAgICZxdW90O0FjdCBvbiBwcm9qZWN0cyByZWN1cnNpdmVseSZxdW90Oy4gIElmIHRoaXMgc2V0dGluZyBpcyBjaGVja2VkLAotICAgICB0aGVuIHRoZSByZWN1cnNpdmUgYXR0cmlidXRlIGlzIGVmZmVjdGl2ZWx5IGlnbm9yZWQsIGFuZCB0aGUgZ2V0Ci0gICAgIHdpbGwgYWx3YXlzIGJlIGRvbmUgcmVjdXJzaXZlbHkKLSAgICAgPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT4uIE5vdGUgaG93ZXZlciB0aGF0IGluIHRoZSBTb3VyY2VTYWZlIFVJIHRoZXJlIGlzIGEgc2V0dGluZyBhY2Nlc3NlZAorICAgICAgdmlhIDxxPlRvb2xzL09wdGlvbnMvR2VuZXJhbFRhYjwvcT4gY2FsbGVkIDxxPkFjdCBvbiBwcm9qZWN0cyByZWN1cnNpdmVseTwvcT4uICBJZiB0aGlzCisgICAgICBzZXR0aW5nIGlzIGNoZWNrZWQsIHRoZW4gdGhlIDx2YXI+cmVjdXJzaXZlPC92YXI+IGF0dHJpYnV0ZSBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLCBhbmQgZ2V0CisgICAgICB3aWxsIGFsd2F5cyBiZSBkb25lIHJlY3Vyc2l2ZWx5PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+dmVyc2lvbjwvdGQ+Ci0gICAgIDx0ZD5hIHZlcnNpb24gbnVtYmVyIHRvIGdldDwvdGQ+Ci0gICAgIDx0ZCByb3dzcGFuPSIzIj5Obywgb25seSBvbmUgb2YgdGhlc2UgYWxsb3dlZDwvdGQ+CisgICAgPHRkPnZlcnNpb248L3RkPgorICAgIDx0ZD5hIHZlcnNpb24gbnVtYmVyIHRvIGdldDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPk5vOyBvbmx5IG9uZSBvZiB0aGVzZSBtYXkgYmUgdXNlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmRhdGU8L3RkPgotICAgICA8dGQ+YSBkYXRlIHN0YW1wIHRvIGdldCBhdDwvdGQ+CisgICAgPHRkPmRhdGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+YSBkYXRlIHN0YW1wIHRvIGdldCBhdDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmxhYmVsPC90ZD4KLSAgICAgPHRkPmEgbGFiZWwgdG8gZ2V0IGZvcjwvdGQ+CisgICAgPHRkPmxhYmVsPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmEgbGFiZWwgdG8gZ2V0IGZvcjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnF1aWV0PC90ZD4KLSAgICAgPHRkPnN1cHByZXNzIG91dHB1dCAob2ZmIGJ5IGRlZmF1bHQpPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+cXVpZXQ8L3RkPgorICAgIDx0ZD5zdXBwcmVzcyBvdXRwdXQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+b2ZmPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+Ci0gICAgIDx0ZD5XaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCi0gICAgIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSA8a2JkPi1JPC9rYmQ+IG9wdGlvbikuIEJ5IGRlZmF1bHQsIDxrYmQ+LUktPC9rYmQ+IGlzCisgICAgICB1c2VkOyB2YWx1ZXMgb2YgPHE+WTwvcT4gb3IgPHE+TjwvcT4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD53cml0YWJsZWZpbGVzPC90ZD4KLSAgICA8dGQ+QmVoYXZpb3Igd2hlbiBsb2NhbCBmaWxlcyBhcmUgd3JpdGFibGUuIFZhbGlkIG9wdGlvbnMgYXJlOiA8Y29kZT5yZXBsYWNlPC9jb2RlPiwgCi0gICAgICAgIDxjb2RlPnNraXA8L2NvZGU+IGFuZCA8Y29kZT5mYWlsPC9jb2RlPjsgRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4KLSAgICAgICAgPGJyPjxjb2RlPnNraXA8L2NvZGU+IGltcGxpZXMgPGNvZGU+ZmFpbG9uZXJyb3I9ZmFsc2U8L2NvZGU+PC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5CZWhhdmlvciB3aGVuIGxvY2FsIGZpbGVzIGFyZSB3cml0YWJsZS4gVmFsaWQgb3B0aW9ucyBhcmU6IDxxPnJlcGxhY2U8L3E+LCA8cT5za2lwPC9xPgorICAgICAgYW5kIDxxPmZhaWw8L3E+OyA8cT5za2lwPC9xPiBpbXBsaWVzIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj49PHE+ZmFsc2U8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhaWw8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiBzcy5leGUgZXhpdHMgd2l0aCBhIHJldHVybmNvZGUgb2YgMTAwLiBEZWZhdWx0cyB0byB0cnVlPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIDxrYmQ+c3MuZXhlPC9rYmQ+IGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSA8cT4xMDA8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5maWxldGltZXN0YW1wPC90ZD4KLSAgICA8dGQ+U2V0IHRoZSBiZWhhdmlvciBmb3IgdGltZXN0YW1wcyBvZiBsb2NhbCBmaWxlcy4gVmFsaWQgb3B0aW9ucyBhcmUgPGNvZGU+Y3VycmVudDwvY29kZT4sIAotICAgICAgICA8Y29kZT5tb2RpZmllZDwvY29kZT4sIG9yIDxjb2RlPnVwZGF0ZWQ8L2NvZGU+LiBEZWZhdWx0cyB0byA8Y29kZT5jdXJyZW50PC9jb2RlPi48L3RkPiAKLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TZXQgdGhlIGJlaGF2aW9yIGZvciB0aW1lc3RhbXBzIG9mIGxvY2FsIGZpbGVzLiBWYWxpZCBvcHRpb25zCisgICAgICBhcmUgPHE+Y3VycmVudDwvcT4sIDxxPm1vZGlmaWVkPC9xPiwgb3IgPHE+dXBkYXRlZDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmN1cnJlbnQ8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8cD5Ob3RlIHRoYXQgb25seSBvbmUgb2YgdmVyc2lvbiwgZGF0ZSBvciBsYWJlbCBzaG91bGQgYmUgc3BlY2lmaWVkPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgorCis8cD5QZXJmb3JtIGEgZ2V0IG9uIHRoZSBWU1MgUHJvamVjdCA8c2FtcD4kL3NvdXJjZS9teXByb2plY3Q8L3NhbXA+IHVzaW5nIHRoZSB1c2VybmFtZSA8cT5tZTwvcT4gYW5kCit0aGUgcGFzc3dvcmQgPHE+bXlwYXNzd29yZDwvcT4uIFRoYXQgd2lsbCByZWN1cnNpdmVseSBnZXQgdGhlIGZpbGVzIHdoaWNoIGFyZQorbGFiZWxlZCA8cT5SZWxlYXNlMTwvcT4gYW5kIHdyaXRlIHRoZW0gdG8gdGhlIGxvY2FsIGRpcmVjdG9yeSA8c2FtcD5DOlxteXNyY1xteXByb2plY3Q8L3NhbXA+LiBUaGUKK2xvY2FsIGZpbGVzIHdpbGwgYmUgd3JpdGFibGUuPC9wPgorCiA8cHJlPgogJmx0O3Zzc2dldCBsb2NhbFBhdGg9JnF1b3Q7QzpcbXlzcmNcbXlwcm9qZWN0JnF1b3Q7CiAgICAgICAgIHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7CiAgICAgICAgIGxhYmVsPSZxdW90O1JlbGVhc2UxJnF1b3Q7CiAgICAgICAgIGxvZ2luPSZxdW90O21lLG15cGFzc3dvcmQmcXVvdDsKICAgICAgICAgdnNzcGF0aD0mcXVvdDskL3NvdXJjZS9hUHJvamVjdCZxdW90OwotICAgICAgICB3cml0YWJsZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIGdldCBvbiB0aGUgVlNTLVByb2plY3QgPGk+JC9zb3VyY2UvbXlwcm9qZWN0PC9pPiB1c2luZyB0aGUgdXNlcm5hbWUKLTxpPm1lPC9pPiBhbmQgdGhlIHBhc3N3b3JkIDxpPm15cGFzc3dvcmQ8L2k+LiBJdCB3aWxsIHJlY3Vyc2l2ZWx5IGdldCB0aGUgZmlsZXMKLXdoaWNoIGFyZSBsYWJlbGVkIDxpPlJlbGVhc2UxPC9pPiBhbmQgd3JpdGUgdGhlbSB0byB0aGUgbG9jYWwgZGlyZWN0b3J5Ci08aT5DOlxteXNyY1xteXByb2plY3Q8L2k+LiBUaGUgbG9jYWwgZmlsZXMgd2lsbCBiZSB3cml0YWJsZS48L3A+Ci08aHI+CisgICAgICAgIHdyaXRhYmxlPSZxdW90O3RydWUmcXVvdDsvJmd0OzwvcHJlPgogCis8aHIvPgogPCEtLSBWU1NMQUJFTCAtLT4KLQotPGgyPjxhIG5hbWU9InZzc2xhYmVsIj5Wc3NMYWJlbDwvYT48L2gyPgorPGgyIGlkPSJ2c3NsYWJlbCI+VnNzTGFiZWw8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLVRhc2sgdG8gcGVyZm9ybSBMQUJFTCBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuCi08cD5Bc3NpZ25zIGEgbGFiZWwgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG9yIGN1cnJlbnQgdmVyc2lvbiBvZiBhIGZpbGUgb3IKLXByb2plY3QuPC9wPgorPHA+VGFzayB0byBwZXJmb3JtIExBQkVMIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS48L3A+Cis8cD5Bc3NpZ25zIGEgbGFiZWwgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIG9yIGN1cnJlbnQgdmVyc2lvbiBvZiBhIGZpbGUgb3IgcHJvamVjdC48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgPHRyPgotICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gICA8L3RyPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgICA8dGQ+dnNzcGF0aDwvdGQ+Ci0gICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8KLSAgICAgICAgIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi48L3RkPgotICAgICA8dGQ+WWVzPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcwotICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQotICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKLSAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0byBwZXJmb3JtIHRoZSBhY3Rpb24gb24uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKLSAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5sb2dpbjwvdGQ+CisgICAgPHRkPjxxPnVzZXJuYW1lWyxwYXNzd29yZF08L3E+Jm1kYXNoO1RoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGdldCBhY2Nlc3MgdG8gVlNTLiBOb3RlCisgICAgICB0aGF0IHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGJvdGggKGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQpJm1kYXNoO0FudC9WU1Mgd2lsbCBoYW5nIGlmIHlvdQorICAgICAgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdCBsb2dpbiB3aXRob3V0IGEgcGFzc3dvcmQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KLSAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8a2JkPnNzLmV4ZTwva2JkPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IGV4cGVjdGVkIHRvIGJlIGluIDxjb2RlPlBBVEg8L2NvZGU+PC90ZD4KICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5sYWJlbDwvdGQ+Ci0gICAgICA8dGQ+QSBsYWJlbCB0byBhcHBseSB0byB0aGUgaGllcmFyY2h5PC90ZD4KLSAgICAgIDx0ZD5ZZXM8L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD52ZXJzaW9uPC90ZD4KLSAgICAgIDx0ZD5BbiBleGlzdGluZyBmaWxlIG9yIHByb2plY3QgdmVyc2lvbiB0byBsYWJlbC4gQnkgZGVmYXVsdCB0aGUgY3VycmVudAotICAgICAgdmVyc2lvbiBpcyBsYWJlbGVkLjwvdGQ+Ci0gICAgICA8dGQ+Tm88L3RkPgotICAgPC90cj4KLSAgIDx0cj4KLSAgICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICAgIDx0ZD5UaGUgY29tbWVudCB0byB1c2UgZm9yIHRoaXMgbGFiZWwuIEVtcHR5IG9yICctJyBmb3Igbm8gY29tbWVudC48L3RkPgotICAgICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+Ci0gICAgIDx0ZD5XaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzCi0gICAgIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPnNlcnZlclBhdGg8L3RkPgorICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPHNhbXA+c3Jjc2FmZS5pbmk8L3NhbXA+IHJlc2lkZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmxhYmVsPC90ZD4KKyAgICA8dGQ+QSBsYWJlbCB0byBhcHBseSB0byB0aGUgaGllcmFyY2h5PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+QW4gZXhpc3RpbmcgZmlsZSBvciBwcm9qZWN0IHZlcnNpb24gdG8gbGFiZWwuIEJ5IGRlZmF1bHQgdGhlIGN1cnJlbnQgdmVyc2lvbiBpcworICAgICAgbGFiZWxlZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tbWVudDwvdGQ+CisgICAgPHRkPlRoZSBjb21tZW50IHRvIHVzZSBmb3IgdGhpcyBsYWJlbC4gRW1wdHkgb3IgPHE+LTwvcT4gZm9yIG5vIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSA8a2JkPi1JPC9rYmQ+IG9wdGlvbikuIEJ5IGRlZmF1bHQsIDxrYmQ+LUktPC9rYmQ+IGlzCisgICAgICB1c2VkOyB2YWx1ZXMgb2YgPHE+WTwvcT4gb3IgPHE+TjwvcT4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiBzcy5leGUgZXhpdHMgd2l0aCBhIHJldHVybmNvZGUgb2YgMTAwLiBEZWZhdWx0cyB0byB0cnVlPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIDxrYmQ+c3MuZXhlPC9rYmQ+IGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSA8cT4xMDA8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgorCis8cD5MYWJlbCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBWU1MgcHJvamVjdCA8c2FtcD4kL3NvdXJjZS9hUHJvamVjdDwvc2FtcD4gd2l0aCB0aGUKK2xhYmVsIDxxPlJlbGVhc2UxPC9xPiB1c2luZyB0aGUgdXNlcm5hbWUgPHE+bWU8L3E+IGFuZCB0aGUgcGFzc3dvcmQgPHE+bXlwYXNzd29yZDwvcT4uPC9wPgorCiA8cHJlPgogJmx0O3Zzc2xhYmVsIHZzc3BhdGg9JnF1b3Q7JC9zb3VyY2UvYVByb2plY3QmcXVvdDsKICAgICAgICAgICBsb2dpbj0mcXVvdDttZSxteXBhc3N3b3JkJnF1b3Q7Ci0gICAgICAgICAgbGFiZWw9JnF1b3Q7UmVsZWFzZTEmcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5MYWJlbHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgVlNTIHByb2plY3QgPGk+JC9zb3VyY2UvYVByb2plY3Q8L2k+IHdpdGgKLXRoZSBsYWJlbCA8aT5SZWxlYXNlMTwvaT4gdXNpbmcgdGhlIHVzZXJuYW1lIDxpPm1lPC9pPiBhbmQgdGhlIHBhc3N3b3JkCi08aT5teXBhc3N3b3JkPC9pPi4KLTwvcD4KLTxibG9ja3F1b3RlPgorICAgICAgICAgIGxhYmVsPSZxdW90O1JlbGVhc2UxJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+TGFiZWwgdmVyc2lvbiA0IG9mIHRoZSBWU1MgZmlsZSA8c2FtcD4kL3NvdXJjZS9hUHJvamVjdC9teWZpbGUudHh0PC9zYW1wPiB3aXRoIHRoZQorbGFiZWwgPHE+MS4wMy4wMDQ8L3E+LiBJZiB0aGlzIHZlcnNpb24gYWxyZWFkeSBoYXMgYSBsYWJlbCwgdGhlIG9wZXJhdGlvbiAoYW5kIHRoZSBidWlsZCkgd2lsbAorZmFpbC48L3A+CisKIDxwcmU+CiAmbHQ7dnNzbGFiZWwgdnNzcGF0aD0mcXVvdDskL3NvdXJjZS9hUHJvamVjdC9teWZpbGUudHh0JnF1b3Q7CiAgICAgICAgICAgdmVyc2lvbj0mcXVvdDs0JnF1b3Q7Ci0gICAgICAgICAgbGFiZWw9JnF1b3Q7MS4wMy4wMDQmcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5MYWJlbHMgdmVyc2lvbiA0IG9mIHRoZSBWU1MgZmlsZSA8aT4kL3NvdXJjZS9hUHJvamVjdC9teWZpbGUudHh0PC9pPiB3aXRoIHRoZQotbGFiZWwgPGk+MS4wMy4wMDQ8L2k+LiBJZiB0aGlzIHZlcnNpb24gYWxyZWFkeSBoYXMgYSBsYWJlbCwgdGhlIG9wZXJhdGlvbiAoYW5kCi10aGUgYnVpbGQpIHdpbGwgZmFpbC4KLTwvcD4KLTxocj4KKyAgICAgICAgICBsYWJlbD0mcXVvdDsxLjAzLjAwNCZxdW90Oy8mZ3Q7PC9wcmU+CiAKKzxoci8+CiA8IS0tIFZTU0hJU1RPUlkgLS0+Ci0KLTxoMj48YSBuYW1lPSJ2c3NoaXN0b3J5Ij5Wc3NIaXN0b3J5PC9hPjwvaDI+Cis8aDIgaWQ9InZzc2hpc3RvcnkiPlZzc0hpc3Rvcnk8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIFRhc2sgdG8gcGVyZm9ybSBISVNUT1JZIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD52c3NwYXRoPC90ZD4KLSAgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0bwotICAgICAgICAgcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+Ci0gICAgIDx0ZD5ZZXM8L3RkPgorICAgIDx0ZD52c3NwYXRoPC90ZD4KKyAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiBvbi48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcwotICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQotICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKLSAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+bG9naW48L3RkPgorICAgIDx0ZD48cT51c2VybmFtZVsscGFzc3dvcmRdPC9xPiZtZGFzaDtUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzIHRvIFZTUy4gTm90ZQorICAgICAgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSZtZGFzaDtBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UKKyAgICAgIGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKLSAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8a2JkPnNzLmV4ZTwva2JkPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IGV4cGVjdGVkIHRvIGJlIGluIDxjb2RlPlBBVEg8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+Ci0gICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jjc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXMuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8c2FtcD5zcmNzYWZlLmluaTwvc2FtcD4gcmVzaWRlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZnJvbURhdGU8L3RkPgpAQCAtMzU0LDEwICszMzUsMTAgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5kYXRlRm9ybWF0PC90ZD4KLSAgICA8dGQ+Rm9ybWF0IG9mIGRhdGVzIGluIGZyb21EYXRlIGFuZCB0b0RhdGUuIFVzZWQgd2hlbiBjYWxjdWxhdGluZyBkYXRlcyB3aXRoCi0gICAgICB0aGUgbnVtZGF5cyBhdHRyaWJ1dGUuIFRoaXMgc3RyaW5nIHVzZXMgdGhlIGZvcm1hdHRpbmcgcnVsZXMgb2YgU2ltcGxlRGF0ZUZvcm1hdC4KLSAgICAgIERlZmF1bHRzIHRvIERhdGVGb3JtYXQuU0hPUlQuPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5Gb3JtYXQgb2YgZGF0ZXMgaW4gPHZhcj5mcm9tRGF0ZTwvdmFyPiBhbmQgPHZhcj50b0RhdGU8L3Zhcj4uIFVzZWQgd2hlbiBjYWxjdWxhdGluZyBkYXRlcworICAgICAgd2l0aCB0aGUgPHZhcj5udW1kYXlzPC92YXI+IGF0dHJpYnV0ZS4gVGhpcyBzdHJpbmcgdXNlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBvZgorICAgICAgU2ltcGxlRGF0ZUZvcm1hdC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPGNvZGU+RGF0ZUZvcm1hdC5TSE9SVDwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmZyb21MYWJlbDwvdGQ+CkBAIC0zODEsMTMgKzM2MiwxMyBAQAogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgorICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5zdHlsZTwvdGQ+Ci0gICAgPHRkPmJyaWVmLCBjb2RlZGlmZiwgZGVmYXVsdCBvciBub2ZpbGUuIFRoZSBkZWZhdWx0IGlzIGRlZmF1bHQuPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD48cT5icmllZjwvcT4sIDxxPmNvZGVkaWZmPC9xPiwgPHE+ZGVmYXVsdDwvcT4gb3IgPHE+bm9maWxlPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZGVmYXVsdDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPnVzZXI8L3RkPgpAQCAtMzk2LDQzICszNzcsNDEgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+Ci0gICAgPHRkPlN0b3AgdGhlIGJ1aWxkcHJvY2VzcyBpZiBzcy5leGUgZXhpdHMgd2l0aCBhIHJldHVybmNvZGUgb2YgMTAwLiBEZWZhdWx0cyB0byB0cnVlPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TdG9wIHRoZSBidWlsZCBwcm9jZXNzIGlmIDxrYmQ+c3MuZXhlPC9rYmQ+IGV4aXRzIHdpdGggYSByZXR1cm4gY29kZSA8cT4xMDA8L3E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5TcGVjaWZ5aW5nIHRoZSB0aW1lLWZyYW1lPC9oND4KIDxwPlRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cyB0byBzcGVjaWZ5IHdoYXQgdGltZS1mcmFtZSB5b3Ugd2lzaCB0byBldmFsdWF0ZTo8L3A+CiA8dWw+Ci0gIDxsaT5DaGFuZ2VzIGJldHdlZW4gdHdvIGRhdGVzOiBTcGVjaWZ5IGJvdGggPGNvZGU+ZnJvbURhdGU8L2NvZGU+IGFuZCA8Y29kZT50b0RhdGU8L2NvZGU+IDwvbGk+Ci0gIDxsaT5DaGFuZ2VzIGJlZm9yZSBhIGRhdGU6IFNwZWNpZnkgPGNvZGU+dG9EYXRlPC9jb2RlPjwvbGk+Ci0gIDxsaT5DaGFuZ2VzIGFmdGVyIGEgZGF0ZTogU3BlY2lmeSA8Y29kZT5mcm9tRGF0ZTwvY29kZT48L2xpPgotICA8bGk+Q2hhbmdlcyBYIERheXMgYmVmb3JlIGEgZGF0ZTogU3BlY2lmeSA8Y29kZT50b0RhdGU8L2NvZGU+IGFuZCAobmVnYXRpdmUhKSA8Y29kZT5udW1EYXlzPC9jb2RlPjwvbGk+Ci0gIDxsaT5DaGFuZ2VzIFggRGF5cyBhZnRlciBhIGRhdGU6IFNwZWNpZnkgPGNvZGU+ZnJvbURhdGU8L2NvZGU+IGFuZCA8Y29kZT5udW1EYXlzPC9jb2RlPjwvbGk+CisgIDxsaT5DaGFuZ2VzIGJldHdlZW4gdHdvIGRhdGVzOiBTcGVjaWZ5IGJvdGggPHZhcj5mcm9tRGF0ZTwvdmFyPiBhbmQgPHZhcj50b0RhdGU8L3Zhcj48L2xpPgorICA8bGk+Q2hhbmdlcyBiZWZvcmUgYSBkYXRlOiBTcGVjaWZ5IDx2YXI+dG9EYXRlPC92YXI+PC9saT4KKyAgPGxpPkNoYW5nZXMgYWZ0ZXIgYSBkYXRlOiBTcGVjaWZ5IDx2YXI+ZnJvbURhdGU8L3Zhcj48L2xpPgorICA8bGk+Q2hhbmdlcyBYIERheXMgYmVmb3JlIGEgZGF0ZTogU3BlY2lmeSA8dmFyPnRvRGF0ZTwvdmFyPiBhbmQgKG5lZ2F0aXZlISkgPHZhcj5udW1EYXlzPC92YXI+PC9saT4KKyAgPGxpPkNoYW5nZXMgWCBEYXlzIGFmdGVyIGEgZGF0ZTogU3BlY2lmeSA8dmFyPmZyb21EYXRlPC92YXI+IGFuZCA8dmFyPm51bURheXM8L3Zhcj48L2xpPgogPC91bD4KIAotCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+CisKKzxwPlNob3cgYWxsIGNoYW5nZXMgYmV0d2VlbiA8cT5SZWxlYXNlMTwvcT4gYW5kIDxxPlJlbGVhc2UyPC9xPi48L3A+CisKKzxwcmU+CiAmbHQ7dnNzaGlzdG9yeSB2c3NwYXRoPSZxdW90OyQvbXlQcm9qZWN0JnF1b3Q7IHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7CiAgICAgICAgICAgICBmcm9tTGFiZWw9JnF1b3Q7UmVsZWFzZTEmcXVvdDsKLSAgICAgICAgICAgIHRvTGFiZWw9JnF1b3Q7UmVsZWFzZTImcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5TaG93cyBhbGwgY2hhbmdlcyBiZXR3ZWVuICZxdW90O1JlbGVhc2UxJnF1b3Q7IGFuZCAmcXVvdDtSZWxlYXNlMiZxdW90Oy48L3A+CisgICAgICAgICAgICB0b0xhYmVsPSZxdW90O1JlbGVhc2UyJnF1b3Q7LyZndDs8L3ByZT4KIAotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Cis8cD5TaG93IGFsbCBjaGFuZ2VzIGJldHdlZW4gSmFudWFyeSAxc3QgMjAwMSBhbmQgTWFyY2ggMzFzdCAyMDAxIChpbiBHZXJtYW55LCBkYXRlIG11c3QgYmUgc3BlY2lmaWVkCithY2NvcmRpbmcgdG8geW91ciBsb2NhbGUpLjwvcD4KKworPHByZT4KICZsdDt2c3NoaXN0b3J5IHZzc3BhdGg9JnF1b3Q7JC9teVByb2plY3QmcXVvdDsgcmVjdXJzaXZlPSZxdW90O3RydWUmcXVvdDsKICAgICAgICAgICAgIGZyb21EYXRlPSZxdW90OzAxLjAxLjIwMDEmcXVvdDsKLSAgICAgICAgICAgIHRvRGF0ZT0mcXVvdDszMS4wMy4yMDAxJnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+U2hvd3MgYWxsIGNoYW5nZXMgYmV0d2VlbiBKYW51YXJ5IDFzdCAyMDAxIGFuZCBNYXJjaCAzMXN0IDIwMDEgKGluIEdlcm1hbnksIGRhdGUgbXVzdCBiZSBzcGVjaWZpZWQgYWNjb3JkaW5nIHRvIHlvdXIgbG9jYWxlKS48L3A+CisgICAgICAgICAgICB0b0RhdGU9JnF1b3Q7MzEuMDMuMjAwMSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPgotICA8cHJlPgorPHA+U2hvd3MgYWxsIGNoYW5nZXMgaW4gdGhlIGxhc3QgZm9ydG5pZ2h0LjwvcD4KKworPHByZT4KICZsdDt0c3RhbXAmZ3Q7CiAgICZsdDtmb3JtYXQgcHJvcGVydHk9JnF1b3Q7dG8udHN0YW1wJnF1b3Q7IHBhdHRlcm49JnF1b3Q7TS1kLXl5O2g6bW1hJnF1b3Q7LyZndDsKICZsdDsvdHN0YW1wJmd0OwpAQCAtNDQwLDM2ICs0MTksMzAgQEAKICZsdDt2c3NoaXN0b3J5IHZzc3BhdGg9JnF1b3Q7JC9teVByb2plY3QmcXVvdDsgcmVjdXJzaXZlPSZxdW90O3RydWUmcXVvdDsKICAgICAgICAgICAgIG51bURheXM9JnF1b3Q7LTE0JnF1b3Q7CiAgICAgICAgICAgICBkYXRlRm9ybWF0PSZxdW90O00tZC15eTtoOm1tYSZxdW90OwotICAgICAgICAgICAgdG9EYXRlPSZxdW90OyR7dG8udHN0YW1wfSZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPlNob3dzIGFsbCBjaGFuZ2VzIGluIHRoZSAxNCBkYXlzIGJlZm9yZSB0b2RheS48L3A+Ci08aHI+CisgICAgICAgICAgICB0b0RhdGU9JnF1b3Q7JHt0by50c3RhbXB9JnF1b3Q7LyZndDs8L3ByZT4KIAorPGhyLz4KIDwhLS0gVlNTQ0hFQ0tJTiAtLT4KLQotPGgyPjxhIG5hbWU9InZzc2NoZWNraW4iPlZzc0NoZWNraW48L2E+PC9oMj4KKzxoMiBpZD0idnNzY2hlY2tpbiI+VnNzQ2hlY2tpbjwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBwZXJmb3JtIENIRUNLSU4gY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgorPHA+VGFzayB0byBwZXJmb3JtIENIRUNLSU4gY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLjwvcD4KIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VmFsdWVzPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+CiAgICAgIDx0ZD52c3NwYXRoPC90ZD4KLSAgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QvZmlsZShzKSB5b3Ugd2lzaCB0bwotICAgICAgICAgcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+CisgICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+CiAgICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcwotICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQotICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKLSAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KKyAgICAgPHRkPjxxPnVzZXJuYW1lWyxwYXNzd29yZF08L3E+Jm1kYXNoO1RoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGdldCBhY2Nlc3MgdG8KKyAgICAgICBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSZtZGFzaDtBbnQvVlNTIHdpbGwgaGFuZworICAgICAgIGlmIHlvdSBsZWF2ZSB0aGUgcGFzc3dvcmQgb3V0IGFuZCBWU1MgZG9lcyBub3QgYWNjZXB0IGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC48L3RkPgogICAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+CkBAIC00NzksMzAzICs0NTIsMjg1IEBACiAgIDwvdHI+CiAgIDx0cj4KICAgICAgPHRkPnNzZGlyPC90ZD4KLSAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuIEJ5IGRlZmF1bHQgdGhlCi0gICAgICAgICB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8a2JkPnNzLmV4ZTwva2JkPiByZXNpZGVzLjwvdGQ+CisgICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCBleHBlY3RlZCB0byBiZSBpbiA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnNlcnZlclBhdGg8L3RkPgotICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNyY3NhZmUuaW5pPC9jb2RlPiByZXNpZGVzLjwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPnNlcnZlclBhdGg8L3RkPgorICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPHNhbXA+c3Jjc2FmZS5pbmk8L3NhbXA+IHJlc2lkZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD53cml0YWJsZTwvdGQ+Ci0gICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+d3JpdGFibGU8L3RkPgorICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KLSAgICAgPHRkPnRydWUgb3IgZmFsc2U8L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5yZWN1cnNpdmU8L3RkPgorICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgIDx0ZD5Db21tZW50IHRvIHVzZSBmb3IgdGhlIGZpbGVzIHRoYXQgd2hlcmUgY2hlY2tlZCBpbi48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+Q29tbWVudCB0byB1c2UgZm9yIHRoZSBmaWxlcyB0aGF0IHdoZXJlIGNoZWNrZWQgaW4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICAgICA8dGQ+J1knLCAnTicgb3IgZW1wdHkuIFNwZWNpZnkgaG93IHRvIHJlcGx5IHRvIHF1ZXN0aW9ucyBmcm9tIFZTUy48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgorICAgIDx0ZD48cT5ZPC9xPiwgPHE+TjwvcT4gb3IgZW1wdHkuIFNwZWNpZnkgaG93IHRvIHJlcGx5IHRvIHF1ZXN0aW9ucyBmcm9tIFZTUy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZD5TdG9wIHRoZSBidWlsZHByb2Nlc3MgaWYgc3MuZXhlIGV4aXRzIHdpdGggYSByZXR1cm5jb2RlIG9mIDEwMC4gRGVmYXVsdHMgdG8gdHJ1ZTwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+U3RvcCB0aGUgYnVpbGQgcHJvY2VzcyBpZiA8a2JkPnNzLmV4ZTwva2JkPiBleGl0cyB3aXRoIGEgcmV0dXJuIGNvZGUgPHE+MTAwPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgorCis8cD5DaGVjayBpbiB0aGUgZmlsZShzKSBuYW1lZCA8c2FtcD50ZXN0Kjwvc2FtcD4gaW4gdGhlIHByb2plY3QgPHNhbXA+JC90ZXN0PC9zYW1wPiB1c2luZyB0aGUgbG9jYWwKK2RpcmVjdG9yeSA8c2FtcD5EOlxidWlsZDwvc2FtcD4uPC9wPgorCiA8cHJlPgogJmx0O3Zzc2NoZWNraW4gdnNzcGF0aD0mcXVvdDskL3Rlc3QvdGVzdComcXVvdDsKICAgICAgICAgICAgIGxvY2FscGF0aD0mcXVvdDtEOlxidWlsZFwmcXVvdDsKICAgICAgICAgICAgIGNvbW1lbnQ9JnF1b3Q7TW9kaWZpZWQgYnkgYXV0b21hdGljIGJ1aWxkJnF1b3Q7LyZndDsKIDwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+Q2hlY2tzIGluIHRoZSBmaWxlKHMpIG5hbWVkIDxpPnRlc3QqPC9pPiBpbiB0aGUgcHJvamVjdCA8aT4kL3Rlc3Q8L2k+IHVzaW5nCi10aGUgbG9jYWwgZGlyZWN0b3J5IDxpPkQ6XGJ1aWxkPC9pPi48L3A+Ci08aHI+CiAKKzxoci8+CiA8IS0tIFZTU0NIRUNLT1VUIC0tPgotCi08aDI+PGEgbmFtZT0idnNzY2hlY2tvdXQiPlZzc0NoZWNrb3V0PC9hPjwvaDI+Cis8aDIgaWQ9InZzc2NoZWNrb3V0Ij5Wc3NDaGVja291dDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotVGFzayB0byBwZXJmb3JtIENIRUNLT1VUIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS4KLTxwPklmIHlvdSBzcGVjaWZ5IHR3byBvciBtb3JlIGF0dHJpYnV0ZXMgZnJvbSB2ZXJzaW9uLCBkYXRlIGFuZAotbGFiZWwgb25seSBvbmUgd2lsbCBiZSB1c2VkIGluIHRoZSBvcmRlciB2ZXJzaW9uLCBkYXRlLCBsYWJlbC48L3A+Cis8cD5UYXNrIHRvIHBlcmZvcm0gQ0hFQ0tPVVQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLjwvcD4KKzxwPklmIHlvdSBzcGVjaWZ5IHR3byBvciBtb3JlIGF0dHJpYnV0ZXMgZnJvbSA8dmFyPnZlcnNpb248L3Zhcj4sIDx2YXI+ZGF0ZTwvdmFyPgorYW5kIDx2YXI+bGFiZWw8L3Zhcj4gb25seSBvbmUgd2lsbCBiZSB1c2VkIGluIHRoZQorb3JkZXIgPHZhcj52ZXJzaW9uPC92YXI+LCA8dmFyPmRhdGU8L3Zhcj4sIDx2YXI+bGFiZWw8L3Zhcj4uPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnZzc3BhdGg8L3RkPgotICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdC9maWxlKHMpIHlvdSB3aXNoIHRvCi0gICAgICAgICBwZXJmb3JtIHRoZSBhY3Rpb24gb24uPC90ZD4KLSAgICAgPHRkPlllczwvdGQ+CisgICAgPHRkPnZzc3BhdGg8L3RkPgorICAgIDx0ZD5Tb3VyY2VTYWZlIHBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwcm9qZWN0L2ZpbGUocykgeW91IHdpc2ggdG8gcGVyZm9ybSB0aGUgYWN0aW9uIG9uLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmxvZ2luPC90ZD4KLSAgICAgPHRkPnVzZXJuYW1lWyxwYXNzd29yZF0gLSBUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzCi0gICAgICAgICB0byBWU1MuIE5vdGUgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSAtCi0gICAgICAgICBBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdAotICAgICAgICAgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLiA8L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5sb2dpbjwvdGQ+CisgICAgPHRkPjxxPnVzZXJuYW1lWyxwYXNzd29yZF08L3E+Jm1kYXNoO1RoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGdldCBhY2Nlc3MgdG8gVlNTLiBOb3RlCisgICAgICB0aGF0IHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGJvdGggKGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQpJm1kYXNoO0FudC9WU1Mgd2lsbCBoYW5nIGlmIHlvdQorICAgICAgbGVhdmUgdGhlIHBhc3N3b3JkIG91dCBhbmQgVlNTIGRvZXMgbm90IGFjY2VwdCBsb2dpbiB3aXRob3V0IGEgcGFzc3dvcmQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5sb2NhbHBhdGg8L3RkPgotICAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICA8dGQ+T3ZlcnJpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBnZXQgdG8gdGhlIHNwZWNpZmllZCBwYXRoPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5zc2RpcjwvdGQ+Ci0gICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzLiBCeSBkZWZhdWx0IHRoZQotICAgICAgICAgdGFzayBleHBlY3RzIGl0IHRvIGJlIGluIHRoZSBQQVRILjwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPnNzZGlyPC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxrYmQ+c3MuZXhlPC9rYmQ+IHJlc2lkZXMuPC90ZD4KKyAgICA8dGQ+Tm87IGJ5IGRlZmF1bHQgZXhwZWN0ZWQgdG8gYmUgaW4gPGNvZGU+UEFUSDwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KLSAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgotICAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxzYW1wPnNyY3NhZmUuaW5pPC9zYW1wPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgICA8dGQ+d3JpdGFibGU8L3RkPgotICAgICA8dGQ+dHJ1ZSBvciBmYWxzZTwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPndyaXRhYmxlPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+cmVjdXJzaXZlPC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZXxmYWxzZTwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPnZlcnNpb248L3RkPgotICAgICA8dGQ+YSB2ZXJzaW9uIG51bWJlciB0byBnZXQ8L3RkPgotICAgICA8dGQgcm93c3Bhbj0iMyI+Tm8sIG9ubHkgb25lIG9mIHRoZXNlIGFsbG93ZWQ8L3RkPgorICAgIDx0ZD52ZXJzaW9uPC90ZD4KKyAgICA8dGQ+YSB2ZXJzaW9uIG51bWJlciB0byBnZXQ8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIzIj5Obzsgb25seSBvbmUgb2YgdGhlc2UgbWF5IGJlIHVzZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5kYXRlPC90ZD4KLSAgICAgPHRkPmEgZGF0ZSBzdGFtcCB0byBnZXQgYXQ8L3RkPgorICAgIDx0ZD5kYXRlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPmEgZGF0ZSBzdGFtcCB0byBnZXQgYXQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgIDx0ZD5sYWJlbDwvdGQ+Ci0gICAgIDx0ZD5hIGxhYmVsIHRvIGdldCBmb3I8L3RkPgorICAgIDx0ZD5sYWJlbDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5hIGxhYmVsIHRvIGdldCBmb3I8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPndyaXRhYmxlZmlsZXM8L3RkPgotICAgIDx0ZD5CZWhhdmlvciB3aGVuIGxvY2FsIGZpbGVzIGFyZSB3cml0YWJsZS4gVmFsaWQgb3B0aW9ucyBhcmU6IDxjb2RlPnJlcGxhY2U8L2NvZGU+LCAKLSAgICAgICAgPGNvZGU+c2tpcDwvY29kZT4gYW5kIDxjb2RlPmZhaWw8L2NvZGU+OyBEZWZhdWx0cyB0byA8Y29kZT5mYWlsPC9jb2RlPgotICAgICAgICA8YnI+PGNvZGU+c2tpcDwvY29kZT4gaW1wbGllcyA8Y29kZT5mYWlsb25lcnJvcj1mYWxzZTwvY29kZT48L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPkJlaGF2aW9yIHdoZW4gbG9jYWwgZmlsZXMgYXJlIHdyaXRhYmxlLiBWYWxpZCBvcHRpb25zIGFyZTogPHE+cmVwbGFjZTwvcT4sIDxxPnNraXA8L3E+CisgICAgICBhbmQgPHE+ZmFpbDwvcT47IDxxPnNraXA8L3E+IGltcGxpZXMgPHZhcj5mYWlsb25lcnJvcjwvdmFyPj08cT5mYWxzZTwvcT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFpbDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQ+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHNzLmV4ZSBleGl0cyB3aXRoIGEgcmV0dXJuY29kZSBvZiAxMDAuIERlZmF1bHRzIHRvIHRydWU8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgPGtiZD5zcy5leGU8L2tiZD4gZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIDxxPjEwMDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5maWxldGltZXN0YW1wPC90ZD4KLSAgICA8dGQ+U2V0IHRoZSBiZWhhdmlvciBmb3IgdGltZXN0YW1wcyBvZiBsb2NhbCBmaWxlcy4gVmFsaWQgb3B0aW9ucyBhcmUgPGNvZGU+Y3VycmVudDwvY29kZT4sIAotICAgICAgICA8Y29kZT5tb2RpZmllZDwvY29kZT4sIG9yIDxjb2RlPnVwZGF0ZWQ8L2NvZGU+LiBEZWZhdWx0cyB0byA8Y29kZT5jdXJyZW50PC9jb2RlPi48L3RkPiAKLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5TZXQgdGhlIGJlaGF2aW9yIGZvciB0aW1lc3RhbXBzIG9mIGxvY2FsIGZpbGVzLiBWYWxpZCBvcHRpb25zCisgICAgICBhcmUgPHE+Y3VycmVudDwvcT4sIDxxPm1vZGlmaWVkPC9xPiwgb3IgPHE+dXBkYXRlZDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmN1cnJlbnQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5nZXRsb2NhbGNvcHk8L3RkPgotICAgIDx0ZD5TZXQgdGhlIGJlaGF2aW9yIHRvIHJldHJpZXZlIGxvY2FsIGNvcGllcyBvZiB0aGUgZmlsZXMuIERlZmF1bHRzIHRvIHRydWUuPC90ZD4gCi0gICAgPHRkPk5vPC90ZD4KKyAgICA8dGQ+U2V0IHRoZSBiZWhhdmlvciB0byByZXRyaWV2ZSBsb2NhbCBjb3BpZXMgb2YgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+CisKKzxwPkNoZWNrIG91dCB0aGUgcHJvamVjdCA8c2FtcD4kL3Rlc3Q8L3NhbXA+IHJlY3Vyc2l2ZWx5IHRvIHRoZSBkaXJlY3RvcnkgPHNhbXA+RDpcYnVpbGQ8L3NhbXA+LjwvcD4KKwogPHByZT4KICZsdDt2c3NjaGVja291dCB2c3NwYXRoPSZxdW90OyQvdGVzdCZxdW90OwogICAgICAgICAgICAgIGxvY2FscGF0aD0mcXVvdDtEOlxidWlsZCZxdW90OwogICAgICAgICAgICAgIHJlY3Vyc2l2ZT0mcXVvdDt0cnVlJnF1b3Q7Ci0gICAgICAgICAgICAgbG9naW49JnF1b3Q7bWUsbXlwYXNzJnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+RG9lcyBhIHJlY3Vyc2l2ZSBjaGVja291dCBvZiB0aGUgcHJvamVjdCA8aT4kL3Rlc3Q8L2k+IHRvIHRoZSBkaXJlY3RvcnkgRDpcYnVpbGQuCi08L3A+Ci08aHI+CisgICAgICAgICAgICAgbG9naW49JnF1b3Q7bWUsbXlwYXNzJnF1b3Q7LyZndDs8L3ByZT4KIAorPGhyLz4KIDwhLS0gVlNTQUREIC0tPgotCi08aDI+PGEgbmFtZT0idnNzYWRkIj5Wc3NBZGQ8L2E+PC9oMj4KKzxoMiBpZD0idnNzYWRkIj5Wc3NBZGQ8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KIFRhc2sgdG8gcGVyZm9ybSBBREQgY29tbWFuZHMgdG8gTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlLgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICA8dGg+VmFsdWVzPC90aD4KLSAgICA8dGg+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICAgPHRkPmxvY2FscGF0aDwvdGQ+Ci0gICAgIDx0ZD5TcGVjaWZ5IHRoZSBsb2NhbCBmaWxlKHMpIHRvIGFkZCB0byBWU1M8L3RkPgotICAgICA8dGQ+WWVzPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgICA8dGQ+bG9naW48L3RkPgotICAgICA8dGQ+dXNlcm5hbWVbLHBhc3N3b3JkXSAtIFRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgbmVlZGVkIHRvIGdldCBhY2Nlc3MKLSAgICAgICAgIHRvIFZTUy4gTm90ZSB0aGF0IHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5IGJvdGggKGlmIHlvdSBoYXZlIGEgcGFzc3dvcmQpIC0KLSAgICAgICAgIEFudC9WU1Mgd2lsbCBoYW5nIGlmIHlvdSBsZWF2ZSB0aGUgcGFzc3dvcmQgb3V0IGFuZCBWU1MgZG9lcyBub3QgYWNjZXB0Ci0gICAgICAgICBsb2dpbiB3aXRob3V0IGEgcGFzc3dvcmQuIDwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICAgPHRkPnNzZGlyPC90ZD4KLSAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcy5leGU8L2NvZGU+IHJlc2lkZXMuIEJ5IGRlZmF1bHQgdGhlCi0gICAgICAgICB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+Ci0gICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3Jjc2FmZS5pbmk8L2NvZGU+IHJlc2lkZXMuPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgICA8dGQ+d3JpdGFibGU8L3RkPgotICAgICA8dGQ+dHJ1ZSBvciBmYWxzZTwvdGQ+Ci0gICAgIDx0ZD5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICAgPHRkPnJlY3Vyc2l2ZTwvdGQ+Ci0gICAgIDx0ZD50cnVlIG9yIGZhbHNlPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgICA8dGQ+Y29tbWVudDwvdGQ+Ci0gICAgIDx0ZD5Db21tZW50IHRvIHVzZSBmb3IgdGhlIGZpbGVzIHRoYXQgd2hlcmUgY2hlY2tlZCBpbi48L3RkPgotICAgICA8dGQ+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICAgICA8dGQ+J1knLCAnTicgb3IgZW1wdHkuIFNwZWNpZnkgaG93IHRvIHJlcGx5IHRvIHF1ZXN0aW9ucyBmcm9tIFZTUy48L3RkPgotICAgICA8dGQ+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQ+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHNzLmV4ZSBleGl0cyB3aXRoIGEgcmV0dXJuY29kZSBvZiAxMDAuIERlZmF1bHRzIHRvIHRydWU8L3RkPgotICAgIDx0ZD5ObzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci08cHJlPgotJmx0O3Zzc2FkZCBsb2NhbHBhdGg9JnF1b3Q7RDpcYnVpbGRcYnVpbGQuMDAwMTIuemlwJnF1b3Q7Ci0gICAgICAgICAgICBjb21tZW50PSZxdW90O0FkZGVkIGJ5IGF1dG9tYXRpYyBidWlsZCZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPkFkZCB0aGUgZmlsZSBuYW1lZCBidWlsZC4wMDAxMi56aXAgaW50byB0aGUgcHJvamVjdCBjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeSAoc2VlIHZzc2NwKS48L3A+Ci08aHI+Ci0KLTwhLS0gVlNTQ1AgLS0+Ci0KLTxoMj48YSBuYW1lPSJ2c3NjcCI+VnNzQ3A8L2E+PC9oMj4KLTxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5UYXNrIHRvIHBlcmZvcm0gQ1AgKENoYW5nZSBQcm9qZWN0KSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUuPC9wPgotPHA+VGhpcyB0YXNrIGlzIHR5cGljYWxseSB1c2VkIGJlZm9yZSBhIFZzc0FkZCBpbiBvcmRlciB0byBzZXQgdGhlIHRhcmdldCBwcm9qZWN0PC9wPgotPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyPgotICAgIDx0aD5BdHRyaWJ1dGU8L3RoPgotICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgIDx0aD5SZXF1aXJlZDwvdGg+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICAgPHRkPnZzc3BhdGg8L3RkPgotICAgICA8dGQ+U291cmNlU2FmZSBwYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcHJvamVjdCB5b3Ugd2lzaCB0bwotICAgICAgICAgbWFrZSB0aGUgY3VycmVudCBwcm9qZWN0LjwvdGQ+Ci0gICAgIDx0ZD5ZZXM8L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgIDx0ZD51c2VybmFtZVsscGFzc3dvcmRdIC0gVGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcwotICAgICAgICAgdG8gVlNTLiBOb3RlIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkgLQotICAgICAgICAgQW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91IGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQKLSAgICAgICAgIGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC4gPC90ZD4KLSAgICAgPHRkPk5vPC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgICA8dGQ+c3NkaXI8L3RkPgotICAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxjb2RlPnNzLmV4ZTwvY29kZT4gcmVzaWRlcy4gQnkgZGVmYXVsdCB0aGUKLSAgICAgICAgIHRhc2sgZXhwZWN0cyBpdCB0byBiZSBpbiB0aGUgUEFUSC48L3RkPgotICAgICA8dGQ+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KLSAgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8Y29kZT5zcmNzYWZlLmluaTwvY29kZT4gcmVzaWRlcy48L3RkPgotICAgICA8dGQ+Tm88L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkPmZhaWxvbmVycm9yPC90ZD4KLSAgICA8dGQ+U3RvcCB0aGUgYnVpbGRwcm9jZXNzIGlmIHNzLmV4ZSBleGl0cyB3aXRoIGEgcmV0dXJuY29kZSBvZiAxMDAuIERlZmF1bHRzIHRvIHRydWU8L3RkPgotICAgIDx0ZD5ObzwvdGQ+Ci0gIDwvdHI+Ci08L3RhYmxlPgotCi08aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+Ci08cHJlPgotJmx0O3Zzc2NwIHZzc3BhdGg9JnF1b3Q7JC9Qcm9qZWN0cy9hbnQmcXVvdDsvJmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5TZXRzIHRoZSBjdXJyZW50IFZTUyBwcm9qZWN0IHRvIDxpPiQvUHJvamVjdHMvYW50PC9pPi48L3A+Ci08aHI+Ci0KLTwhLS0gVlNTQ1JFQVRFIC0tPgotCi0gPGgyPjxhIG5hbWU9InZzc2NyZWF0ZSI+VnNzQ3JlYXRlPC9hPjwvaDI+Ci0gPGgzPkRlc2NyaXB0aW9uPC9oMz4KLSBUYXNrIHRvIHBlcmZvcm0gQ1JFQVRFIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlIFNhZmUuCi0gPHA+Q3JlYXRlcyBhIG5ldyBwcm9qZWN0IGluIFZTUy48L3A+Ci08aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHI+Ci0gICAgPHRoPkF0dHJpYnV0ZTwvdGg+Ci0gICAgPHRoPlZhbHVlczwvdGg+Ci0gICAgPHRoPlJlcXVpcmVkPC90aD4KKyAgICA8dGQ+bG9jYWxwYXRoPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB0aGUgbG9jYWwgZmlsZShzKSB0byBhZGQgdG8gVlNTPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5sb2dpbjwvdGQ+Ci0gICAgPHRkPnVzZXJuYW1lLHBhc3N3b3JkPC90ZD4KKyAgICA8dGQ+PHE+dXNlcm5hbWVbLHBhc3N3b3JkXTwvcT4mbWRhc2g7VGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBuZWVkZWQgdG8gZ2V0IGFjY2VzcyB0byBWU1MuIE5vdGUKKyAgICAgIHRoYXQgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgYm90aCAoaWYgeW91IGhhdmUgYSBwYXNzd29yZCkmbWRhc2g7QW50L1ZTUyB3aWxsIGhhbmcgaWYgeW91CisgICAgICBsZWF2ZSB0aGUgcGFzc3dvcmQgb3V0IGFuZCBWU1MgZG9lcyBub3QgYWNjZXB0IGxvZ2luIHdpdGhvdXQgYSBwYXNzd29yZC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c3NkaXI8L3RkPgorICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGtiZD5zcy5leGU8L2tiZD4gcmVzaWRlcy48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCBleHBlY3RlZCB0byBiZSBpbiA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2VydmVyUGF0aDwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8c2FtcD5zcmNzYWZlLmluaTwvc2FtcD4gcmVzaWRlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+d3JpdGFibGU8L3RkPgorICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZWN1cnNpdmU8L3RkPgorICAgIDx0ZD48cT50cnVlfGZhbHNlPC9xPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jb21tZW50PC90ZD4KKyAgICA8dGQ+Q29tbWVudCB0byB1c2UgZm9yIHRoZSBmaWxlcyB0aGF0IHdoZXJlIGNoZWNrZWQgaW4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmF1dG9yZXNwb25zZTwvdGQ+CisgICAgPHRkPjxxPlk8L3E+LCA8cT5OPC9xPiBvciBlbXB0eS4gU3BlY2lmeSBob3cgdG8gcmVwbHkgdG8gcXVlc3Rpb25zIGZyb20gVlNTLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgPGtiZD5zcy5leGU8L2tiZD4gZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIDxxPjEwMDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPkFkZCB0aGUgZmlsZSBuYW1lZCA8c2FtcD5idWlsZC4wMDAxMi56aXA8L3NhbXA+IGludG8gdGhlIHByb2plY3QgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQorKHNlZSA8Y29kZT52c3NjcDwvY29kZT4pLjwvcD4KKworPHByZT4KKyZsdDt2c3NhZGQgbG9jYWxwYXRoPSZxdW90O0Q6XGJ1aWxkXGJ1aWxkLjAwMDEyLnppcCZxdW90OworICAgICAgICBjb21tZW50PSZxdW90O0FkZGVkIGJ5IGF1dG9tYXRpYyBidWlsZCZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxoci8+Cis8IS0tIFZTU0NQIC0tPgorPGgyIGlkPSJ2c3NjcCI+VnNzQ3A8L2gyPgorPGgzPkRlc2NyaXB0aW9uPC9oMz4KKzxwPlRhc2sgdG8gcGVyZm9ybSBDUCAoQ2hhbmdlIFByb2plY3QpIGNvbW1hbmRzIHRvIE1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZS48L3A+Cis8cD5UaGlzIHRhc2sgaXMgdHlwaWNhbGx5IHVzZWQgYmVmb3JlIGEgPGNvZGU+VnNzQWRkPC9jb2RlPiBpbiBvcmRlciB0byBzZXQgdGhlIHRhcmdldCBwcm9qZWN0PC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dnNzcGF0aDwvdGQ+CisgICAgPHRkPlNvdXJjZVNhZmUgcGF0aCB3aGljaCBzcGVjaWZpZXMgdGhlIHByb2plY3QgeW91IHdpc2ggdG8gbWFrZSB0aGUgY3VycmVudCBwcm9qZWN0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bG9naW48L3RkPgorICAgIDx0ZD48cT51c2VybmFtZVsscGFzc3dvcmRdPC9xPiZtZGFzaDtUaGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIG5lZWRlZCB0byBnZXQgYWNjZXNzIHRvIFZTUy4gTm90ZQorICAgICAgdGhhdCB5b3UgbWF5IG5lZWQgdG8gc3BlY2lmeSBib3RoIChpZiB5b3UgaGF2ZSBhIHBhc3N3b3JkKSZtZGFzaDtBbnQvVlNTIHdpbGwgaGFuZyBpZiB5b3UKKyAgICAgIGxlYXZlIHRoZSBwYXNzd29yZCBvdXQgYW5kIFZTUyBkb2VzIG5vdCBhY2NlcHQgbG9naW4gd2l0aG91dCBhIHBhc3N3b3JkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zc2RpcjwvdGQ+CisgICAgPHRkPmRpcmVjdG9yeSB3aGVyZSA8a2JkPnNzLmV4ZTwva2JkPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vOyBieSBkZWZhdWx0IGV4cGVjdGVkIHRvIGJlIGluIDxjb2RlPlBBVEg8L2NvZGU+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5zZXJ2ZXJQYXRoPC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5IHdoZXJlIDxzYW1wPnNyY3NhZmUuaW5pPC9zYW1wPiByZXNpZGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5mYWlsb25lcnJvcjwvdGQ+CisgICAgPHRkPlN0b3AgdGhlIGJ1aWxkIHByb2Nlc3MgaWYgPGtiZD5zcy5leGU8L2tiZD4gZXhpdHMgd2l0aCBhIHJldHVybiBjb2RlIDxxPjEwMDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5FeGFtcGxlczwvaDM+CisKKzxwPlNldCB0aGUgY3VycmVudCBWU1MgcHJvamVjdCB0byA8c2FtcD4kL1Byb2plY3RzL2FudDwvc2FtcD4uPC9wPgorCis8cHJlPiZsdDt2c3NjcCB2c3NwYXRoPSZxdW90OyQvUHJvamVjdHMvYW50JnF1b3Q7LyZndDs8L3ByZT4KKworPGhyLz4KKzwhLS0gVlNTQ1JFQVRFIC0tPgorPGgyIGlkPSJ2c3NjcmVhdGUiPlZzc0NyZWF0ZTwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+VGFzayB0byBwZXJmb3JtIENSRUFURSBjb21tYW5kcyB0byBNaWNyb3NvZnQgVmlzdWFsIFNvdXJjZSBTYWZlLjwvcD4KKzxwPkNyZWF0ZXMgYSBuZXcgcHJvamVjdCBpbiBWU1MuPC9wPgorPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5WYWx1ZXM8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bG9naW48L3RkPgorICAgIDx0ZD48cT51c2VybmFtZSxwYXNzd29yZDwvcT48L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KQEAgLTc4NSwzOSArNzQwLDM2IEBACiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+c3NkaXI8L3RkPgotICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGNvZGU+c3MuZXhlPC9jb2RlPiByZXNpZGVzLiBCeSBkZWZhdWx0IHRoZSB0YXNrIGV4cGVjdHMgaXQgdG8gYmUgaW4gdGhlIFBBVEguPC90ZD4KLSAgICA8dGQ+Tm88L3RkPgorICAgIDx0ZD5kaXJlY3Rvcnkgd2hlcmUgPGtiZD5zcy5leGU8L2tiZD4gcmVzaWRlcy48L3RkPgorICAgIDx0ZD5ObzsgYnkgZGVmYXVsdCBleHBlY3RlZCB0byBiZSBpbiA8Y29kZT5QQVRIPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+cXVpZXQ8L3RkPgotICAgIDx0ZD5zdXBwcmVzcyBvdXRwdXQgKG9mZiBieSBkZWZhdWx0KTwvdGQ+Ci0gICAgPHRkPk5vPC90ZD4KLSAgIDwvdHI+CisgICAgPHRkPnN1cHByZXNzIG91dHB1dDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5vZmY8L3E+PC90ZD4KKyAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5mYWlsT25FcnJvcjwvdGQ+Ci0gICAgPHRkPmZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIHByb2plY3QgKHRydWUgYnkgZGVmYXVsdCk8L3RkPgotICAgIDx0ZD5ObzwvdGQ+CisgICAgPHRkPmZhaWwgaWYgdGhlcmUgaXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5hdXRvcmVzcG9uc2U8L3RkPgotICAgIDx0ZD5XaGF0IHRvIHJlc3BvbmQgd2l0aCAoc2V0cyB0aGUgLUkgb3B0aW9uKS4gQnkgZGVmYXVsdCwgLUktIGlzIHVzZWQ7IHZhbHVlcyBvZiBZIG9yIE4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+CisgICAgPHRkPldoYXQgdG8gcmVzcG9uZCB3aXRoIChzZXRzIHRoZSA8a2JkPi1JPC9rYmQ+IG9wdGlvbikuIEJ5IGRlZmF1bHQsIDxrYmQ+LUktPC9rYmQ+IGlzCisgICAgICB1c2VkOyB2YWx1ZXMgb2YgPHE+WTwvcT4gb3IgPHE+TjwvcT4gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGlzLjwvdGQ+CiAgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5jb21tZW50PC90ZD4KLSAgICA8dGQ+VGhlIGNvbW1lbnQgdG8gdXNlIGZvciB0aGlzIGxhYmVsLiBFbXB0eSBvciAnLScgZm9yIG5vIGNvbW1lbnQuPC90ZD4KKyAgICA8dGQ+VGhlIGNvbW1lbnQgdG8gdXNlIGZvciB0aGlzIGxhYmVsLiBFbXB0eSBvciA8cT4tPC9xPiBmb3Igbm8gY29tbWVudC48L3RkPgogICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPgotPHByZT4KLSZsdDt2c3NjcmVhdGUgdnNzcGF0aD0mcXVvdDskL2V4aXN0aW5nUHJvamVjdC9uZXdQcm9qZWN0JnF1b3Q7LyZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+Q3JlYXRlcyB0aGUgVlNTLVByb2plY3QgPGk+JC9leGlzdGluZ1Byb2plY3QvbmV3UHJvamVjdDwvaT4uPC9wPgotPGhyPgogCi08IS0tIEZvb3RlciAtLT4KKzxwPkNyZWF0ZSB0aGUgVlNTIFByb2plY3QgPHNhbXA+JC9leGlzdGluZ1Byb2plY3QvbmV3UHJvamVjdDwvc2FtcD4uPC9wPgorCis8cHJlPiZsdDt2c3NjcmVhdGUgdnNzcGF0aD0mcXVvdDskL2V4aXN0aW5nUHJvamVjdC9uZXdQcm9qZWN0JnF1b3Q7LyZndDs8L3ByZT4KKwogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3dhaXRmb3IuaHRtbCBiL21hbnVhbC9UYXNrcy93YWl0Zm9yLmh0bWwKaW5kZXggNTRmZjhlZC4uMmY2MDU2ZiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3dhaXRmb3IuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvd2FpdGZvci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPldhaXRGb3IgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yNiwxMDggKzI2LDk4IEBACiAKIDxoMj5XYWl0Zm9yPC9oMj4KIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci08cD5CbG9ja3MgZXhlY3V0aW9uIHVudGlsIGEgc2V0IG9mIHNwZWNpZmllZCBjb25kaXRpb25zIGJlY29tZSB0cnVlLiBUaGlzIGlzIGludGVuZGVkCi0gIHRvIGJlIHVzZWQgd2l0aCB0aGUgPGEgaHJlZj0icGFyYWxsZWwuaHRtbCI+cGFyYWxsZWw8L2E+IHRhc2sgdG8KLSAgc3luY2hyb25pemUgYSBzZXQgb2YgcHJvY2Vzc2VzLjwvcD4KLTxwPlRoZSBjb25kaXRpb25zIHRvIHdhaXQgZm9yIGFyZSBkZWZpbmVkIGluIDxhIGhyZWY9IndhaXRmb3IuaHRtbCNuZXN0ZWQiPm5lc3RlZCBlbGVtZW50czwvYT4sCi1pZiBtdWx0aXBsZSBjb25kaXRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHRhc2sgd2lsbCB3YWl0IHVudGlsIGFsbCBjb25kaXRpb25zIGFyZSB0cnVlLi48L3A+Ci08cD48L3A+Ci08cD5JZiBib3RoIG1heHdhaXQgYW5kIG1heHdhaXR1bml0IGFyZSBub3Qgc3BlY2lmaWVkLCB0aGUgbWF4d2FpdCBpcyAzIG1pbnV0ZXMgKDE4MDAwMCBtaWxsaXNlY29uZHMpLjwvcD4KLTxwPklmIHRoZSA8Y29kZT50aW1lb3V0cHJvcGVydHk8L2NvZGU+IGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQsIGEKLXByb3BlcnR5IG9mIHRoYXQgbmFtZSB3aWxsIGJlIGNyZWF0ZWQgaWYgdGhlIGNvbmRpdGlvbiBkaWRuJ3QgY29tZQotdHJ1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLjwvcD4KKzxwPkJsb2NrcyBleGVjdXRpb24gdW50aWwgYSBzZXQgb2Ygc3BlY2lmaWVkIGNvbmRpdGlvbnMgYmVjb21lIHRydWUuIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZAord2l0aCB0aGUgPGEgaHJlZj0icGFyYWxsZWwuaHRtbCI+cGFyYWxsZWw8L2E+IHRhc2sgdG8gc3luY2hyb25pemUgYSBzZXQgb2YgcHJvY2Vzc2VzLjwvcD4KKzxwPlRoZSBjb25kaXRpb25zIHRvIHdhaXQgZm9yIGFyZSBkZWZpbmVkIGluIDxhIGhyZWY9IndhaXRmb3IuaHRtbCNuZXN0ZWQiPm5lc3RlZCBlbGVtZW50czwvYT4sIGlmCittdWx0aXBsZSBjb25kaXRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIHRhc2sgd2lsbCB3YWl0IHVudGlsIGFsbCBjb25kaXRpb25zIGFyZSB0cnVlLjwvcD4KKzxwPklmIGJvdGggPHZhcj5tYXh3YWl0PC92YXI+IGFuZCA8dmFyPm1heHdhaXR1bml0PC92YXI+IGFyZSBub3Qgc3BlY2lmaWVkLAorZGVmYXVsdCA8dmFyPm1heHdhaXQ8L3Zhcj4gaXMgMyBtaW51dGVzICgxODAwMDAgbWlsbGlzZWNvbmRzKS48L3A+Cis8cD5JZiB0aGUgPHZhcj50aW1lb3V0cHJvcGVydHk8L3Zhcj4gYXR0cmlidXRlIGhhcyBiZWVuIHNldCwgYSBwcm9wZXJ0eSBvZiB0aGF0IG5hbWUgd2lsbCBiZSBjcmVhdGVkCitpZiB0aGUgY29uZGl0aW9uIGRpZG4ndCBjb21lIHRydWUgd2l0aGluIHRoZSBzcGVjaWZpZWQgdGltZS48L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1heHdhaXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYWxsIHRoZSByZXF1aXJlZCBjb25kaXRpb25zCi0gICAgICB0byBiZWNvbWUgdHJ1ZSBiZWZvcmUgZmFpbGluZyB0aGUgdGFzay4gRGVmYXVsdHMgdG8gMTgwMDAwIG1heHdhaXR1bml0cy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5tYXh3YWl0PC90ZD4KKyAgICA8dGQ+VGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBmb3IgYWxsIHRoZSByZXF1aXJlZCBjb25kaXRpb25zIHRvIGJlY29tZSB0cnVlIGJlZm9yZQorICAgICAgZmFpbGluZyB0aGUgdGFzay48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gMTgwMDAwIDx2YXI+bWF4d2FpdHVuaXQ8L3Zhcj5zPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWF4d2FpdHVuaXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVuaXQgb2YgdGltZSB0aGF0IG11c3QgYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIG9mIHRoZQotICAgIG1heHdhaXQgYXR0cmlidXRlLiAgRGVmYXVsdHMgdG8gbWlsbGlzZWNvbmQuCi0gICAgICAgICAgICAgICAgICAgICBWYWxpZCBWYWx1ZXMgYXJlCi0gICAgICAgICAgICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+bWlsbGlzZWNvbmQ8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPnNlY29uZDwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+bWludXRlPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5ob3VyPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5kYXk8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPndlZWs8L2xpPgotICAgICAgICAgICAgICAgICAgICAgPC91bD4KLSAgICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNoZWNrZXZlcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmV0d2VlbiBlYWNoIHRlc3Qgb2YgdGhlIGNvbmRpdGlvbnMuCi0gICAgICBEZWZhdWx0cyB0byA1MDAgY2hlY2tldmVyeXVuaXRzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNoZWNrZXZlcnl1bml0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1bml0IG9mIHRpbWUgdGhhdCBtdXN0IGJlIHVzZWQgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZSBvZiB0aGUKLSAgICBjaGVja2V2ZXJ5IGF0dHJpYnV0ZS4gIERlZmF1bHRzIHRvIG1pbGxpc2Vjb25kLgotICAgICAgICAgICAgICAgICAgICAgVmFsaWQgVmFsdWVzIGFyZQotICAgICAgICAgICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbGxpc2Vjb25kPC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5zZWNvbmQ8L2xpPgotICAgICAgICAgICAgICAgICAgICAgICAgPGxpPm1pbnV0ZTwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+aG91cjwvbGk+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bGk+ZGF5PC9saT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxsaT53ZWVrPC9saT4KLSAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgPHRkPm1heHdhaXR1bml0PC90ZD4KKyAgICA8dGQ+VGhlIHVuaXQgb2YgdGltZSB0aGF0IG11c3QgYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHZhbHVlIG9mIHRoZSA8dmFyPm1heHdhaXQ8L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZS4gIFZhbGlkIHZhbHVlcyBhcmUKKyAgICAgIDx1bD4KKyAgICAgICAgPGxpPjxxPm1pbGxpc2Vjb25kPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5zZWNvbmQ8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPm1pbnV0ZTwvcT48L2xpPgorICAgICAgICA8bGk+PHE+aG91cjwvcT48L2xpPgorICAgICAgICA8bGk+PHE+ZGF5PC9xPjwvbGk+CisgICAgICAgIDxsaT48cT53ZWVrPC9xPjwvbGk+CisgICAgICA8L3VsPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5taWxsaXNlY29uZDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aW1lb3V0cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBpZiBtYXh3YWl0IGhhcwotICAgICAgYmVlbiBleGNlZWRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jaGVja2V2ZXJ5PC90ZD4KKyAgICA8dGQ+VGhlIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgYmV0d2VlbiBlYWNoIHRlc3Qgb2YgdGhlIGNvbmRpdGlvbnMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDUwMCA8dmFyPmNoZWNrZXZlcnl1bml0PC92YXI+czwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2hlY2tldmVyeXVuaXQ8L3RkPgorICAgIDx0ZD5UaGUgdW5pdCBvZiB0aW1lIHRoYXQgbXVzdCBiZSB1c2VkIHRvIGludGVycHJldCB0aGUgdmFsdWUgb2YgdGhlIDx2YXI+Y2hlY2tldmVyeTwvdmFyPgorICAgICAgYXR0cmlidXRlLiAgVmFsaWQgdmFsdWVzIGFyZQorICAgICAgPHVsPgorICAgICAgICA8bGk+PHE+bWlsbGlzZWNvbmQ8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPnNlY29uZDwvcT48L2xpPgorICAgICAgICA8bGk+PHE+bWludXRlPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5ob3VyPC9xPjwvbGk+CisgICAgICAgIDxsaT48cT5kYXk8L3E+PC9saT4KKyAgICAgICAgPGxpPjxxPndlZWs8L3E+PC9saT4KKyAgICAgIDwvdWw+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPm1pbGxpc2Vjb25kPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dGltZW91dHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCBpZiA8dmFyPm1heHdhaXQ8L3Zhcj4gaGFzIGJlZW4gZXhjZWVkZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoMz48YSBuYW1lPSJuZXN0ZWQiPk5lc3RlZCBFbGVtZW50czwvYT48L2gzPgogCi08cD5UaGUgYXZhaWxhYmxlIGNvbmRpdGlvbnMgdGhhdCBzYXRpc2Z5IHRoZQotPGNvZGU+Jmx0O3dhaXRmb3ImZ3Q7PC9jb2RlPiB0YXNrIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgdGhlCi08YSBocmVmPSJjb25kaXRpb24uaHRtbCI+PGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+PC9hPiB0YXNrLiBTZWUKLTxhIGhyZWY9ImNvbmRpdGlvbnMuaHRtbCI+aGVyZTwvYT4gZm9yIHRoZSBmdWxsIGxpc3QuPC9wPgorPGgzIGlkPSJuZXN0ZWQiPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Cis8cD5UaGUgYXZhaWxhYmxlIGNvbmRpdGlvbnMgdGhhdCBzYXRpc2Z5IHRoZSA8Y29kZT4mbHQ7d2FpdGZvciZndDs8L2NvZGU+IHRhc2sgYXJlIHRoZSBzYW1lIGFzIHRob3NlCitmb3IgdGhlIDxhIGhyZWY9ImNvbmRpdGlvbi5odG1sIj48Y29kZT4mbHQ7Y29uZGl0aW9uJmd0OzwvY29kZT48L2E+Cit0YXNrLiBTZWUgPGEgaHJlZj0iY29uZGl0aW9ucy5odG1sIj5oZXJlPC9hPiBmb3IgdGhlIGZ1bGwgbGlzdC48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O3dhaXRmb3IgbWF4d2FpdD0iMzAiIG1heHdhaXR1bml0PSJzZWNvbmQiJmd0OwotICAgICAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9ImVycm9ycy5sb2ciLyZndDsKLSZsdDsvd2FpdGZvciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPndhaXRzIHVwIHRvIDMwIHNlY29uZHMgZm9yIGEgZmlsZSBjYWxsZWQgZXJyb3JzLmxvZyB0byBhcHBlYXIuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDt3YWl0Zm9yIG1heHdhaXQ9IjMiIG1heHdhaXR1bml0PSJtaW51dGUiIGNoZWNrZXZlcnk9IjUwMCImZ3Q7Ci0gICAgICAgICZsdDtodHRwIHVybD0iaHR0cDovL2xvY2FsaG9zdC9teWFwcC9pbmRleC5odG1sIi8mZ3Q7Ci0mbHQ7L3dhaXRmb3ImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD53YWl0cyB1cCB0byAzIG1pbnV0ZXMgKGFuZCBjaGVja3MgZXZlcnkgNTAwIG1pbGxpc2Vjb25kcykgZm9yIGEgd2ViIHNlcnZlciBvbiBsb2NhbGhvc3QKLSAgdG8gc2VydmUgdXAgdGhlIHNwZWNpZmllZCBVUkwuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDt3YWl0Zm9yIG1heHdhaXQ9IjEwIiBtYXh3YWl0dW5pdD0ic2Vjb25kIiZndDsKLSAgICAgICAgJmx0O2FuZCZndDsKLSAgICAgICAgICAgICZsdDtzb2NrZXQgc2VydmVyPSJkYnNlcnZlciIgcG9ydD0iMTUyMSIvJmd0OwotICAgICAgICAgICAgJmx0O2h0dHAgdXJsPSJodHRwOi8vd2Vic2VydmVyL215cGFnZS5odG1sIi8mZ3Q7Ci0gICAgICAgICZsdDsvYW5kJmd0OwotJmx0Oy93YWl0Zm9yJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+d2FpdHMgdXAgdG8gMTAgc2Vjb25kcyBmb3IgYSBzZXJ2ZXIgb24gdGhlIGRic2VydmVyIG1hY2hpbmUgdG8gYmVnaW4gbGlzdGVuaW5nCi0gIG9uIHBvcnQgMTUyMSBhbmQgZm9yIHRoZSBodHRwOi8vd2Vic2VydmVyL215cGFnZS5odG1sIHdlYiBwYWdlCi0gIHRvIGJlY29tZSBhdmFpbGFibGUuPC9wPgogCis8cD5XYWl0IHVwIHRvIDMwIHNlY29uZHMgZm9yIGEgZmlsZSBjYWxsZWQgPHNhbXA+ZXJyb3JzLmxvZzwvc2FtcD4gdG8gYXBwZWFyLjwvcD4KKzxwcmU+CismbHQ7d2FpdGZvciBtYXh3YWl0PSIzMCIgbWF4d2FpdHVuaXQ9InNlY29uZCImZ3Q7CisgICAgJmx0O2F2YWlsYWJsZSBmaWxlPSJlcnJvcnMubG9nIi8mZ3Q7CismbHQ7L3dhaXRmb3ImZ3Q7PC9wcmU+CisKKzxwPldhaXQgdXAgdG8gMyBtaW51dGVzIChhbmQgY2hlY2tzIGV2ZXJ5IDUwMCBtaWxsaXNlY29uZHMpIGZvciBhIHdlYiBzZXJ2ZXIKK29uIDxzYW1wPmxvY2FsaG9zdDwvc2FtcD4gdG8gc2VydmUgdXAgdGhlIHNwZWNpZmllZCBVUkwuPC9wPgorPHByZT4KKyZsdDt3YWl0Zm9yIG1heHdhaXQ9IjMiIG1heHdhaXR1bml0PSJtaW51dGUiIGNoZWNrZXZlcnk9IjUwMCImZ3Q7CisgICAgJmx0O2h0dHAgdXJsPSJodHRwczovL2xvY2FsaG9zdC9teWFwcC9pbmRleC5odG1sIi8mZ3Q7CismbHQ7L3dhaXRmb3ImZ3Q7PC9wcmU+CisKKzxwPldhaXQgdXAgdG8gMTAgc2Vjb25kcyBmb3IgYSBzZXJ2ZXIgb24gdGhlIDxzYW1wPmRic2VydmVyPC9zYW1wPiBtYWNoaW5lIHRvIGJlZ2luIGxpc3RlbmluZyBvbgorcG9ydCAxNTIxIGFuZCBmb3IgdGhlIDxzYW1wPmh0dHBzOi8vd2Vic2VydmVyL215cGFnZS5odG1sPC9zYW1wPiB3ZWIgcGFnZSB0byBiZWNvbWUgYXZhaWxhYmxlLjwvcD4KKzxwcmU+CismbHQ7d2FpdGZvciBtYXh3YWl0PSIxMCIgbWF4d2FpdHVuaXQ9InNlY29uZCImZ3Q7CisgICAgJmx0O2FuZCZndDsKKyAgICAgICAgJmx0O3NvY2tldCBzZXJ2ZXI9ImRic2VydmVyIiBwb3J0PSIxNTIxIi8mZ3Q7CisgICAgICAgICZsdDtodHRwIHVybD0iaHR0cHM6Ly93ZWJzZXJ2ZXIvbXlwYWdlLmh0bWwiLyZndDsKKyAgICAmbHQ7L2FuZCZndDsKKyZsdDsvd2FpdGZvciZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVGFza3Mvd2FyLmh0bWwgYi9tYW51YWwvVGFza3Mvd2FyLmh0bWwKaW5kZXggMmM5MjAwNi4uZThiYjcxZiAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3dhci5odG1sCisrKyBiL21hbnVhbC9UYXNrcy93YXIuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDI5NSArMTUsMjU3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5XQVIgVGFzazwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0id2FyIj5XYXI8L2E+PC9oMj4KKzxoMiBpZD0id2FyIj5XYXI8L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iamFyLmh0bWwiPkphcjwvYT4gdGFzayB3aXRoIHNwZWNpYWwKLXRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQgZW5kIHVwIGluIHRoZQotPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+LCA8Y29kZT5XRUItSU5GL2NsYXNzZXM8L2NvZGU+IG9yCi08Y29kZT5XRUItSU5GPC9jb2RlPiBkaXJlY3RvcmllcyBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uIEFyY2hpdmUuPC9wPgotPHA+KFRoZSBXYXIgdGFzayBpcyBhIHNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIHRoZSBwYXJ0aWN1bGFyIGxheW91dCBvZiBhIFdBUiBmaWxlLgotVGhlIHNhbWUgdGhpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgPGk+cHJlZml4PC9pPiBhbmQgPGk+ZnVsbHBhdGg8L2k+Ci1hdHRyaWJ1dGVzIG9mIHppcGZpbGVzZXRzIGluIGEgWmlwIG9yIEphciB0YXNrLik8L3A+Ci08cD5UaGUgZXh0ZW5kZWQgemlwZmlsZXNldCBlbGVtZW50IGZyb20gdGhlIHppcCB0YXNrCi0gICAgKHdpdGggYXR0cmlidXRlcyA8aT5wcmVmaXg8L2k+LCA8aT5mdWxscGF0aDwvaT4sIGFuZCA8aT5zcmM8L2k+KQotICAgIGlzIGF2YWlsYWJsZSBpbiB0aGUgV2FyIHRhc2suIFRoZSB0YXNrIGlzIGFsc28gcmVzb3VyY2UtZW5hYmxlZAotICAgIGFuZCB3aWxsIGFkZCBuZXN0ZWQgcmVzb3VyY2VzIGFuZCByZXNvdXJjZSBjb2xsZWN0aW9ucyB0byB0aGUgYXJjaGl2ZS48L3A+Cis8cD5BbiBleHRlbnNpb24gb2YgdGhlIDxhIGhyZWY9Imphci5odG1sIj5KYXI8L2E+IHRhc2sgd2l0aCBzcGVjaWFsIHRyZWF0bWVudCBmb3IgZmlsZXMgdGhhdCBzaG91bGQKK2VuZCB1cCBpbiB0aGUgPHNhbXA+V0VCLUlORi9saWI8L3NhbXA+LCA8c2FtcD5XRUItSU5GL2NsYXNzZXM8L3NhbXA+IG9yIDxzYW1wPldFQi1JTkY8L3NhbXA+CitkaXJlY3RvcmllcyBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uIEFyY2hpdmUuPC9wPgogCi08cD4KLSAgICBCZWZvcmUgU2VydmxldCBBUEkgMi41L0phdmEgRUUgNSwgYSBXRUItSU5GL3dlYi54bWwgZmlsZSB3YXMgbWFuZGF0b3J5IGluIGEKLSAgICBXQVIgZmlsZSwgc28gdGhpcyB0YXNrIGZhaWxlZCBpZiB0aGUgPGNvZGU+d2VieG1sPC9jb2RlPiBhdHRyaWJ1dGUgd2FzIG1pc3NpbmcuCi0gICAgQXMgdGhlIHdlYi54bWwgZmlsZSBpcyBub3cgb3B0aW9uYWwsIHRoZSA8Y29kZT53ZWJ4bWw8L2NvZGU+IGF0dHJpYnV0ZSBtYXkgbm93Ci0gICAgYmUgbWFkZSBvcHRpb25hbC4gSG93ZXZlciwgYXMgbW9zdCByZWFsIHdlYiBhcHBsaWNhdGlvbnMgZG8gbmVlZCBhIHdlYi54bWwgZmlsZSwKLSAgICBpdCBpcyBub3Qgb3B0aW9uYWwgYnkgZGVmYXVsdC4gVGhlIHRhc2sgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIGlzIG5vdAotICAgIGluY2x1ZGVkLCB1bmxlc3MgdGhlIDxjb2RlPm5lZWR4bWxmaWxlPC9jb2RlPiBhdHRyaWJ1dGUKLSAgICBpcyBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGUgdGFzawotICAgIHdpbGwgd2FybiBpZiBtb3JlIHRoYW4gb25lIHdlYi54bWwgZmlsZSBpcyBhZGRlZCB0byB0aGUgSkFSICAKLSAgICB0aHJvdWdoIHRoZSBmaWxlc2V0cy4KLTwvcD4KKzxwPihUaGUgPGNvZGU+V2FyPC9jb2RlPiB0YXNrIGlzIGEgc2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgdGhlIHBhcnRpY3VsYXIgbGF5b3V0IG9mIGEgV0FSIGZpbGUuICBUaGUKK3NhbWUgdGhpbmcgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB1c2luZyB0aGUgPHZhcj5wcmVmaXg8L3Zhcj4gYW5kIDx2YXI+ZnVsbHBhdGg8L3Zhcj4gYXR0cmlidXRlcworb2YgPGNvZGU+emlwZmlsZXNldDwvY29kZT5zIGluIGEgPGNvZGU+WmlwPC9jb2RlPiBvciA8Y29kZT5KYXI8L2NvZGU+IHRhc2suKTwvcD4KKzxwPlRoZSBleHRlbmRlZCA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPiBlbGVtZW50IGZyb20gdGhlIDxjb2RlPnppcDwvY29kZT4gdGFzayAod2l0aAorYXR0cmlidXRlcyA8dmFyPnByZWZpeDwvdmFyPiwgPHZhcj5mdWxscGF0aDwvdmFyPiwgYW5kIDx2YXI+c3JjPC92YXI+KSBpcyBhdmFpbGFibGUgaW4KK3RoZSA8Y29kZT5XYXI8L2NvZGU+IHRhc2suIFRoZSB0YXNrIGlzIGFsc28gcmVzb3VyY2UtZW5hYmxlZCBhbmQgd2lsbCBhZGQgbmVzdGVkIHJlc291cmNlcyBhbmQKK3Jlc291cmNlIGNvbGxlY3Rpb25zIHRvIHRoZSBhcmNoaXZlLjwvcD4KIAorPHA+QmVmb3JlIFNlcnZsZXQgQVBJIDIuNS9KYXZhIEVFIDUsIGEgPHNhbXA+V0VCLUlORi93ZWIueG1sPC9zYW1wPiBmaWxlIHdhcyBtYW5kYXRvcnkgaW4gYSBXQVIKK2ZpbGUsIHNvIHRoaXMgdGFzayBmYWlsZWQgaWYgdGhlIDx2YXI+d2VieG1sPC92YXI+IGF0dHJpYnV0ZSB3YXMgbWlzc2luZy4gIEFzCit0aGUgPHNhbXA+d2ViLnhtbDwvc2FtcD4gZmlsZSBpcyBub3cgb3B0aW9uYWwsIHRoZSA8dmFyPndlYnhtbDwvdmFyPiBhdHRyaWJ1dGUgbWF5IG5vdyBiZSBtYWRlCitvcHRpb25hbC4gSG93ZXZlciwgYXMgbW9zdCByZWFsIHdlYiBhcHBsaWNhdGlvbnMgZG8gbmVlZCBhIDxzYW1wPndlYi54bWw8L3NhbXA+IGZpbGUsIGl0IGlzIG5vdAorb3B0aW9uYWwgYnkgZGVmYXVsdC4gVGhlIHRhc2sgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIGlzIG5vdCBpbmNsdWRlZCwgdW5sZXNzCit0aGUgPHZhcj5uZWVkeG1sZmlsZTwvdmFyPiBhdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPmZhbHNlPC9xPi4gVGhlIHRhc2sgd2lsbCB3YXJuIGlmIG1vcmUgdGhhbgorb25lIDxzYW1wPndlYi54bWw8L3NhbXA+IGZpbGUgaXMgYWRkZWQgdG8gdGhlIEpBUiB0aHJvdWdoIHRoZSBmaWxlc2V0cy48L3A+CiAKLTxwPjxiPlBsZWFzZSBub3RlIHRoYXQgdGhlIFppcCBmb3JtYXQgYWxsb3dzIG11bHRpcGxlIGZpbGVzIG9mIHRoZSBzYW1lCi1mdWxseS1xdWFsaWZpZWQgbmFtZSB0byBleGlzdCB3aXRoaW4gYSBzaW5nbGUgYXJjaGl2ZS4gIFRoaXMgaGFzIGJlZW4KLWRvY3VtZW50ZWQgYXMgY2F1c2luZyB2YXJpb3VzIHByb2JsZW1zIGZvciB1bnN1c3BlY3RpbmcgdXNlcnMuICBJZiB5b3Ugd2lzaAotdG8gYXZvaWQgdGhpcyBiZWhhdmlvciB5b3UgbXVzdCBzZXQgdGhlIDxjb2RlPmR1cGxpY2F0ZTwvY29kZT4gYXR0cmlidXRlCi10byBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIDxjb2RlPiZxdW90O2FkZCZxdW90OzwvY29kZT4uPC9iPjwvcD4KKzxwPjxzdHJvbmc+UGxlYXNlIG5vdGUgdGhhdCB0aGUgWmlwIGZvcm1hdCBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgb2YgdGhlIHNhbWUgZnVsbHktcXVhbGlmaWVkIG5hbWUgdG8KK2V4aXN0IHdpdGhpbiBhIHNpbmdsZSBhcmNoaXZlLiAgVGhpcyBoYXMgYmVlbiBkb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IKK3Vuc3VzcGVjdGluZyB1c2Vycy4gIElmIHlvdSB3aXNoIHRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IG11c3Qgc2V0IHRoZSA8dmFyPmR1cGxpY2F0ZTwvdmFyPgorYXR0cmlidXRlIHRvIGEgdmFsdWUgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdCwgPHE+YWRkPC9xPi48L3N0cm9uZz48L3A+CiAKIDxoMz5QYXJhbWV0ZXJzPC9oMz4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVzdGZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIFdBUiBmaWxlIHRvIGNyZWF0ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3by48L3RkPgorICAgIDx0ZD5kZXN0ZmlsZTwvdGQ+CisgICAgPHRkPnRoZSBXQVIgZmlsZSB0byBjcmVhdGUuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndhcmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGk+RGVwcmVjYXRlZDwvaT4gbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUKLSAgICAtdXNlIDx0dD5kZXN0ZmlsZTwvdHQ+IGluc3RlYWQuPC90ZD4KKyAgICA8dGQ+d2FyZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPiBuYW1lIG9mIHRoZSBmaWxlIHRvCisgICAgICBjcmVhdGUmbWRhc2g7dXNlIDx2YXI+ZGVzdGZpbGU8L3Zhcj4gaW5zdGVhZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53ZWJ4bWw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHNlcnZsZXQgY29uZmlndXJhdGlvbiBkZXNjcmlwdG9yIHRvIHVzZSAoV0VCLUlORi93ZWIueG1sKS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzLCB1bmxlc3MgPHR0Pm5lZWR4bWxmaWxlPC90dD4gaXMgdHJ1ZSwKLSAgICB0aGUgZmlsZSBpcyBwdWxsZWQgaW4gdmlhIGEgbmVzdGVkIGZpbGVzZXQsIG9yIGFuIGV4aXN0aW5nIFdBUiBmaWxlIGlzCi0gICAgYmVpbmcgdXBkYXRlZC48L3RkPgorICAgIDx0ZD53ZWJ4bWw8L3RkPgorICAgIDx0ZD5UaGUgc2VydmxldCBjb25maWd1cmF0aW9uIGRlc2NyaXB0b3IgdG8gdXNlICg8c2FtcD5XRUItSU5GL3dlYi54bWw8L3NhbXA+KS48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyA8dmFyPm5lZWR4bWxmaWxlPC92YXI+IGlzIDxxPnRydWU8L3E+LCB0aGUgZmlsZSBpcyBwdWxsZWQgaW4gdmlhIGEgbmVzdGVkCisgICAgICBmaWxlc2V0LCBvciBhbiBleGlzdGluZyBXQVIgZmlsZSBpcyBiZWluZyB1cGRhdGVkLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5lZWR4bWxmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIHdlYi54bWwgZmlsZSBpcyBuZWVkZWQuCi0gICAgICAgIEl0IHNob3VsZCBiZSBzZXQgdG8gZmFsc2Ugd2hlbiBnZW5lcmF0aW5nCi0gICAgICAgIHNlcnZsZXQgMi41KyBXQVIgZmlsZXMgd2l0aG91dCBhIHdlYi54bWwgZmlsZS4KLSAgICAgICAgPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLWRlZmF1bHQgInRydWUiPC90ZD4KKyAgICA8dGQ+bmVlZHhtbGZpbGU8L3RkPgorICAgIDx0ZD5GbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSA8c2FtcD53ZWIueG1sPC9zYW1wPiBmaWxlIGlzIG5lZWRlZC4gIEl0IHNob3VsZCBiZSBzZXQKKyAgICAgIHRvIDxxPmZhbHNlPC9xPiB3aGVuIGdlbmVyYXRpbmcgc2VydmxldCAyLjUrIFdBUiBmaWxlcyB3aXRob3V0IGEgPHNhbXA+d2ViLnhtbDwvc2FtcD4KKyAgICAgIGZpbGUuICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggdG8gamFyIHRoZSBmaWxlcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIGphciB0aGUgZmlsZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21wcmVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0sCi0gICAgZGVmYXVsdHMgdG8gdHJ1ZS4gIFVubGVzcyB5b3Ugc2V0IHRoZSA8ZW0+a2VlcGNvbXByZXNzaW9uPC9lbT4KLSAgICBhdHRyaWJ1dGUgdG8gZmFsc2UsIHRoaXMgd2lsbCBhcHBseSB0byB0aGUgZW50aXJlIGFyY2hpdmUsIG5vdAotICAgIG9ubHkgdGhlIGZpbGVzIHlvdSd2ZSBhZGRlZCB3aGlsZSB1cGRhdGluZy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5jb21wcmVzczwvdGQ+CisgICAgPHRkPk5vdCBvbmx5IHN0b3JlIGRhdGEgYnV0IGFsc28gY29tcHJlc3MgdGhlbS4gIFVubGVzcyB5b3Ugc2V0IHRoZSA8dmFyPmtlZXBjb21wcmVzc2lvbjwvdmFyPgorICAgICAgYXR0cmlidXRlIHRvIDxxPmZhbHNlPC9xPiwgdGhpcyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgYXJjaGl2ZSwgbm90IG9ubHkgdGhlIGZpbGVzIHlvdSd2ZQorICAgICAgYWRkZWQgd2hpbGUgdXBkYXRpbmcuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+a2VlcGNvbXByZXNzaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkZvciBlbnRyaWVzIGNvbWluZyBmcm9tIGV4aXN0aW5nIGFyY2hpdmVzIChsaWtlCi0gICAgbmVzdGVkIDxlbT56aXBmaWxlc2V0PC9lbT5zIG9yIHdoaWxlIHVwZGF0aW5nIHRoZSBhcmNoaXZlKSwga2VlcAotICAgIHRoZSBjb21wcmVzc2lvbiBhcyBpdCBoYXMgYmVlbiBvcmlnaW5hbGx5IGluc3RlYWQgb2YgdXNpbmcgdGhlCi0gICAgPGVtPmNvbXByZXNzPC9lbT4gYXR0cmlidXRlLiAgRGVmYXVsdHMgZmFsc2UuICA8ZW0+U2luY2UgQW50Ci0gICAgMS42PC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5rZWVwY29tcHJlc3Npb248L3RkPgorICAgIDx0ZD5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZSBuZXN0ZWQgPHZhcj56aXBmaWxlc2V0PC92YXI+cyBvciB3aGlsZQorICAgICAgdXBkYXRpbmcgdGhlIGFyY2hpdmUpLCBrZWVwIHRoZSBjb21wcmVzc2lvbiBhcyBpdCBoYXMgYmVlbiBvcmlnaW5hbGx5IGluc3RlYWQgb2YgdXNpbmcKKyAgICAgIHRoZSA8dmFyPmNvbXByZXNzPC92YXI+IGF0dHJpYnV0ZS4gPGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCi0gICAgICBpbnNpZGUgdGhlIGFyY2hpdmUuICBEZWZhdWx0cyB0byBVVEY4LiA8c3Ryb25nPkl0IGlzIG5vdAotICAgICAgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3QKLSAgICAgIGxpa2VseSBiZSB1bnJlYWRhYmxlIGZvciBKYXZhIG90aGVyd2lzZS48L3N0cm9uZz4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZQotICAgICAgemlwIHRhc2sgcGFnZTwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgaW5zaWRlIHRoZSBhcmNoaXZlLiA8c3Ryb25nPkl0IGlzIG5vdAorICAgICAgcmVjb21tZW5kZWQgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYXMgdGhlIGNyZWF0ZWQgYXJjaGl2ZSB3aWxsIG1vc3QgbGlrZWx5IGJlIHVucmVhZGFibGUgZm9yCisgICAgICBKYXZhIG90aGVyd2lzZS48L3N0cm9uZz4gIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAKKyAgICAgIHRhc2sgcGFnZTwvYT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+VVRGODwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlc29ubHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U3RvcmUgb25seSBmaWxlIGVudHJpZXMsIGRlZmF1bHRzIHRvIGZhbHNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmlsZXNvbmx5PC90ZD4KKyAgICA8dGQ+U3RvcmUgb25seSBmaWxlIGVudHJpZXM8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZQotICAgICAgaW5jbHVkZWQuIEFsbCBmaWxlcyBhcmUgaW5jbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsICg8cT4qKjwvcT4pPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+TmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBleGNsdWRlcyBvciBub25lIGlmIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90Ci0gICAgICAoJnF1b3Q7eWVzJnF1b3Q7LyZxdW90O25vJnF1b3Q7KS4gRGVmYXVsdCBleGNsdWRlcyBhcmUgdXNlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgZGVmYXVsdCBleGNsdWRlcyBzaG91bGQgYmUgdXNlZCBvciBub3QgKDxxPnllc3xubzwvcT4pLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT55ZXM8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuaWZlc3Q8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPm1hbmlmZXN0PC90ZD4KKyAgICA8dGQ+dGhlIG1hbmlmZXN0IGZpbGUgdG8gdXNlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNldG1hbmlmZXN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gYSBNYW5pZmVzdCBpcyBmb3VuZCBpbiBhIHppcGZpbGVzZXQgb3IgemlwZ3JvdXBmaWxlc2V0IGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O3NraXAmcXVvdDssICZxdW90O21lcmdlJnF1b3Q7LCBhbmQgJnF1b3Q7bWVyZ2V3aXRob3V0bWFpbiZxdW90Oy4gICZxdW90O21lcmdlJnF1b3Q7IHdpbGwgbWVyZ2UgYWxsIG9mIHRoZSBtYW5pZmVzdHMgdG9nZXRoZXIsIGFuZCBtZXJnZSB0aGlzIGludG8gYW55IG90aGVyIHNwZWNpZmllZCBtYW5pZmVzdHMuICAmcXVvdDttZXJnZXdpdGhvdXRtYWluJnF1b3Q7IG1lcmdlcyBldmVyeXRoaW5nIGJ1dCB0aGUgTWFpbiBzZWN0aW9uIG9mIHRoZSBtYW5pZmVzdHMuICBEZWZhdWx0IHZhbHVlIGlzICZxdW90O3NraXAmcXVvdDsuCisgICAgPHRkPmZpbGVzZXRtYW5pZmVzdDwvdGQ+CisgICAgPHRkPmJlaGF2aW9yIHdoZW4gYSBtYW5pZmVzdCBpcyBmb3VuZCBpbiBhIDxjb2RlPnppcGZpbGVzZXQ8L2NvZGU+CisgICAgICBvciA8Y29kZT56aXBncm91cGZpbGVzZXQ8L2NvZGU+IGZpbGUuICBWYWxpZCB2YWx1ZXMgYXJlIDxxPnNraXA8L3E+LCA8cT5tZXJnZTwvcT4sCisgICAgICBhbmQgPHE+bWVyZ2V3aXRob3V0bWFpbjwvcT4uICA8cT5tZXJnZTwvcT4gd2lsbCBtZXJnZSBhbGwgb2YgdGhlIG1hbmlmZXN0cyB0b2dldGhlciwgYW5kIG1lcmdlCisgICAgICB0aGlzIGludG8gYW55IG90aGVyIHNwZWNpZmllZCBtYW5pZmVzdHMuICA8cT5tZXJnZXdpdGhvdXRtYWluPC9xPiBtZXJnZXMgZXZlcnl0aGluZyBidXQgdGhlCisgICAgICBNYWluIHNlY3Rpb24gb2YgdGhlIG1hbmlmZXN0cy4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+c2tpcDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVubWFuaWZlc3Rvbmx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJlaGF2aW9yIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2ZhaWwmcXVvdDssICZxdW90O3NraXAmcXVvdDssIGFuZCAmcXVvdDtjcmVhdGUmcXVvdDsuICBEZWZhdWx0IGlzICZxdW90O2NyZWF0ZSZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD53aGVubWFuaWZlc3Rvbmx5PC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgPHE+ZmFpbDwvcT4sIDxxPnNraXA8L3E+LAorICAgICAgYW5kIDxxPmNyZWF0ZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmNyZWF0ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cGRhdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZQotICAgICAgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuICBEZWZhdWx0IGlzICZxdW90O2ZhbHNlJnF1b3Q7LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnVwZGF0ZTwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIHRvIHVwZGF0ZSBvciBvdmVyd3JpdGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmR1cGxpY2F0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssIGFuZCAmcXVvdDtmYWlsJnF1b3Q7LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJnF1b3Q7YWRkJnF1b3Q7LiAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZHVwbGljYXRlPC90ZD4KKyAgICA8dGQ+YmVoYXZpb3Igd2hlbiBhIGR1cGxpY2F0ZSBmaWxlIGlzIGZvdW5kLiAgVmFsaWQgdmFsdWVzIGFyZSA8cT5hZGQ8L3E+LCA8cT5wcmVzZXJ2ZTwvcT4sCisgICAgICBhbmQgPHE+ZmFpbDwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmFkZDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yb3VuZHVwPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpbGwgYmUKLSAgICByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIG9mIHNlY29uZHMuPGJyPgotICAgIFppcCBhcmNoaXZlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YKLSAgICB0d28gc2Vjb25kcywgc28gdGhlIHRpbWVzIHdpbGwgZWl0aGVyIGJlIHJvdW5kZWQgdXAgb3IgZG93bi4gIElmCi0gICAgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0gb3V0LW9mLWRhdGUgd2hlbiB5b3UKLSAgICByZXJ1biB0aGUgdGFzaywgc28gdGhlIGRlZmF1bHQgaXMgdG8gcm91bmQgdXAuICBSb3VuZGluZyB1cCBtYXkKLSAgICBsZWFkIHRvIGEgZGlmZmVyZW50IHR5cGUgb2YgcHJvYmxlbXMgbGlrZSBKU1BzIGluc2lkZSBhIHdlYgotICAgIGFyY2hpdmUgdGhhdCBzZWVtIHRvIGJlIHNsaWdodGx5IG1vcmUgcmVjZW50IHRoYW4gcHJlY29tcGlsZWQKLSAgICBwYWdlcywgcmVuZGVyaW5nIHByZWNvbXBpbGF0aW9uIHVzZWxlc3MuPGJyPgotICAgIERlZmF1bHRzIHRvIHRydWUuICA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5yb3VuZHVwPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2lsbCBiZSByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IGV2ZW4gbnVtYmVyIG9mCisgICAgICBzZWNvbmRzLjxici8+WmlwIGFyY2hpdmVzIHN0b3JlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpdGggYSBncmFudWxhcml0eSBvZiAyIHNlY29uZHMsIHNvCisgICAgICB0aGUgdGltZXMgd2lsbCBlaXRoZXIgYmUgcm91bmRlZCB1cCBvciBkb3duLiAgSWYgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0KKyAgICAgIG91dC1vZi1kYXRlIHdoZW4geW91IHJlcnVuIHRoZSB0YXNrLCBzbyB0aGUgZGVmYXVsdCBpcyB0byByb3VuZCB1cC4gIFJvdW5kaW5nIHVwIG1heSBsZWFkIHRvIGEKKyAgICAgIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIgYXJjaGl2ZSB0aGF0IHNlZW0gdG8gYmUgc2xpZ2h0bHkgbW9yZSByZWNlbnQKKyAgICAgIHRoYW4gcHJlY29tcGlsZWQgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLiA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sZXZlbDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Ob24tZGVmYXVsdCBsZXZlbCBhdCB3aGljaCBmaWxlIGNvbXByZXNzaW9uIHNob3VsZCBiZQotICAgIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlIGZyb20gMCAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gOQotICAgIChtYXhpbXVtIGNvbXByZXNzaW9uL3Nsb3dlc3QpLiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bGV2ZWw8L3RkPgorICAgIDx0ZD5Ob24tZGVmYXVsdCBsZXZlbCBhdCB3aGljaCBmaWxlIGNvbXByZXNzaW9uIHNob3VsZCBiZSBwZXJmb3JtZWQuIFZhbGlkIHZhbHVlcyByYW5nZQorICAgICAgZnJvbSA8cT4wPC9xPiAobm8gY29tcHJlc3Npb24vZmFzdGVzdCkgdG8gPHE+OTwvcT4gKG1heGltdW0gY29tcHJlc3Npb24vc2xvd2VzdCkuIDxlbT5TaW5jZQorICAgICAgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVzZXJ2ZTBwZXJtaXNzaW9uczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVuIHVwZGF0aW5nIGFuIGFyY2hpdmUgb3IgYWRkaW5nIGVudHJpZXMgZnJvbSBhCi0gICAgZGlmZmVyZW50IGFyY2hpdmUgQW50IHdpbGwgYXNzdW1lIHRoYXQgYSBVbml4IHBlcm1pc3Npb25zIHZhbHVlIG9mCi0gICAgMCAobm9ib2R5IGlzIGFsbG93ZWQgdG8gZG8gYW55dGhpbmcgdG8gdGhlIGZpbGUvZGlyZWN0b3J5KSBtZWFucwotICAgIHRoYXQgdGhlIHBlcm1pc3Npb25zIGhhdmVuJ3QgYmVlbiBzdG9yZWQgYXQgYWxsIHJhdGhlciB0aGFuIHJlYWwKLSAgICBwZXJtaXNzaW9ucyBhbmQgd2lsbCBpbnN0ZWFkIGFwcGx5IGl0cyBvd24gZGVmYXVsdCB2YWx1ZXMuPGJyLz4KLSAgICBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gdHJ1ZSBpZiB5b3UgcmVhbGx5IHdhbnQgdG8gcHJlc2VydmUgdGhlCi0gICAgICBvcmlnaW5hbCBwZXJtaXNzaW9uIGZpZWxkLjxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPnByZXNlcnZlMHBlcm1pc3Npb25zPC90ZD4KKyAgICA8dGQ+d2hlbiB1cGRhdGluZyBhbiBhcmNoaXZlIG9yIGFkZGluZyBlbnRyaWVzIGZyb20gYSBkaWZmZXJlbnQgYXJjaGl2ZSBBbnQgd2lsbCBhc3N1bWUgdGhhdCBhCisgICAgICBVbml4IHBlcm1pc3Npb25zIHZhbHVlIG9mIDAgKG5vYm9keSBpcyBhbGxvd2VkIHRvIGRvIGFueXRoaW5nIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSkgbWVhbnMKKyAgICAgIHRoYXQgdGhlIHBlcm1pc3Npb25zIGhhdmVuJ3QgYmVlbiBzdG9yZWQgYXQgYWxsIHJhdGhlciB0aGFuIHJlYWwgcGVybWlzc2lvbnMgYW5kIHdpbGwgaW5zdGVhZAorICAgICAgYXBwbHkgaXRzIG93biBkZWZhdWx0IHZhbHVlcy48YnIvPiAgU2V0IHRoaXMgYXR0cmlidXRlIHRvIDxxPnRydWU8L3E+IGlmIHlvdSByZWFsbHkgd2FudCB0bworICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHBlcm1pc3Npb24gZmllbGQuIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZUxhbmd1YWdlRW5jb2RpbmdGbGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZQotICAgICAgZW5jb2RpbmcgaXMgVVRGLTguICBUaGlzIHNldHRpbmcgZG9lc24ndCBoYXZlIGFueSBlZmZlY3QgaWYgdGhlCi0gICAgICBlbmNvZGluZyBpcyBub3QgVVRGLTguCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgorICAgIDx0ZD51c2VMYW5ndWFnZUVuY29kaW5nRmxhZzwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZSBlbmNvZGluZyBpcyBVVEYtOC4gIFRoaXMgc2V0dGluZyBkb2Vzbid0CisgICAgICBoYXZlIGFueSBlZmZlY3QgaWYgdGhlIGVuY29kaW5nIGlzIG5vdCBVVEYtOC4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LiAgPGJyLz5TZWUgYWxzbworICAgICAgdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y3JlYXRlVW5pY29kZUV4dHJhRmllbGRzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY3JlYXRlIHVuaWNvZGUgZXh0cmEgZmllbGRzIHRvIHN0b3JlCi0gICAgICB0aGUgZmlsZSBuYW1lcyBhIHNlY29uZCB0aW1lIGluc2lkZSB0aGUgZW50cnkncyBtZXRhZGF0YS4KLSAgICAgIDxicj5Qb3NzaWJsZSB2YWx1ZXMgYXJlICJuZXZlciIsICJhbHdheXMiIGFuZCAibm90LWVuY29kZWFibGUiCi0gICAgICB3aGljaCB3aWxsIG9ubHkgYWRkIFVuaWNvZGUgZXh0cmEgZmllbGRzIGlmIHRoZSBmaWxlIG5hbWUgY2Fubm90Ci0gICAgICBiZSBlbmNvZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzICJuZXZlciI8L3RkPgorICAgIDx0ZD5jcmVhdGVVbmljb2RlRXh0cmFGaWVsZHM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGNyZWF0ZSBVbmljb2RlIGV4dHJhIGZpZWxkcyB0byBzdG9yZSB0aGUgZmlsZSBuYW1lcyBhIHNlY29uZCB0aW1lIGluc2lkZSB0aGUKKyAgICAgIGVudHJ5J3MgbWV0YWRhdGEuPGJyLz5Qb3NzaWJsZSB2YWx1ZXMgYXJlIDxxPm5ldmVyPC9xPiwgPHE+YWx3YXlzPC9xPgorICAgICAgYW5kIDxxPm5vdC1lbmNvZGVhYmxlPC9xPiB3aGljaCB3aWxsIG9ubHkgYWRkIFVuaWNvZGUgZXh0cmEgZmllbGRzIGlmIHRoZSBmaWxlIG5hbWUgY2Fubm90IGJlCisgICAgICBlbmNvZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48YnIvPlNlZSBhbHNvCisgICAgICB0aGUgPGEgaHJlZj0iemlwLmh0bWwjZW5jb2RpbmciPmRpc2N1c3Npb24gaW4gdGhlIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+bmV2ZXI8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFsbGJhY2t0b1VURjg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byB1c2UgVVRGLTggYW5kIHRoZSBsYW5ndWFnZSBlbmNvZGluZwotICAgICAgZmxhZyBpbnN0ZWFkIG9mIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaWYgYSBmaWxlIG5hbWUgY2Fubm90IGJlCi0gICAgICBlbmNvZGVkIHVzaW5nIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSJ6aXAuaHRtbCNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBpbiB0aGUKLSAgICAgIHppcCB0YXNrIHBhZ2U8L2E+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KKyAgICA8dGQ+ZmFsbGJhY2t0b1VURjg8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHVzZSBVVEYtOCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlmIGEKKyAgICAgIGZpbGUgbmFtZSBjYW5ub3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPGJyLz5TZWUKKyAgICAgIGFsc28gdGhlIDxhIGhyZWY9InppcC5odG1sI2VuY29kaW5nIj5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm1lcmdlQ2xhc3NQYXRoQXR0cmlidXRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIG1lcmdlIHRoZSBDbGFzcy1QYXRoIGF0dHJpYnV0ZXMgZm91bmQKLSAgICAgIGluIGRpZmZlcmVudCBtYW5pZmVzdHMgKGlmIG1lcmdpbmcgbWFuaWZlc3RzKS4gIElmIGZhbHNlLCBvbmx5Ci0gICAgICB0aGUgYXR0cmlidXRlIG9mIHRoZSBsYXN0IG1lcmdlZCBtYW5pZmVzdCB3aWxsIGJlIHByZXNlcnZlZC4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi4KLSAgICAgIDxici8+dW5sZXNzIHlvdSBhbHNvIHNldCBmbGF0dGVuQXR0cmlidXRlcyB0byB0cnVlIHRoaXMgbWF5Ci0gICAgICByZXN1bHQgaW4gbWFuaWZlc3RzIGNvbnRhaW5pbmcgbXVsdGlwbGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzCi0gICAgICB3aGljaCB2aW9sYXRlcyB0aGUgbWFuaWZlc3Qgc3BlY2lmaWNhdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgorICAgIDx0ZD5tZXJnZUNsYXNzUGF0aEF0dHJpYnV0ZXM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIG1lcmdlIHRoZSA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGVzIGZvdW5kIGluIGRpZmZlcmVudCBtYW5pZmVzdHMgKGlmCisgICAgICBtZXJnaW5nIG1hbmlmZXN0cykuICBJZiA8cT5mYWxzZTwvcT4sIG9ubHkgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgbGFzdCBtZXJnZWQgbWFuaWZlc3Qgd2lsbCBiZQorICAgICAgcHJlc2VydmVkLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ljxici8+VW5sZXNzIHlvdSBhbHNvIHNldCA8dmFyPmZsYXR0ZW5BdHRyaWJ1dGVzPC92YXI+CisgICAgICB0byA8cT50cnVlPC9xPiB0aGlzIG1heSByZXN1bHQgaW4gbWFuaWZlc3RzIGNvbnRhaW5pbmcgbXVsdGlwbGUgPGNvZGU+Q2xhc3MtUGF0aDwvY29kZT4KKyAgICAgIGF0dHJpYnV0ZXMgd2hpY2ggdmlvbGF0ZXMgdGhlIG1hbmlmZXN0IHNwZWNpZmljYXRpb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgZmFsc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mbGF0dGVuQXR0cmlidXRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIG1lcmdlIGF0dHJpYnV0ZXMgb2NjdXJyaW5nIG1vcmUgdGhhbgotICAgICAgb25jZSBpbiBhIHNlY3Rpb24gKHRoaXMgY2FuIG9ubHkgaGFwcGVuIGZvciB0aGUgQ2xhc3MtUGF0aAotICAgICAgYXR0cmlidXRlKSBpbnRvIGEgc2luZ2xlIGF0dHJpYnV0ZS4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgZmFsc2U8L3RkPgorICAgIDx0ZD5mbGF0dGVuQXR0cmlidXRlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gbWVyZ2UgYXR0cmlidXRlcyBvY2N1cnJpbmcgbW9yZSB0aGFuIG9uY2UgaW4gYSBzZWN0aW9uICh0aGlzIGNhbiBvbmx5IGhhcHBlbiBmb3IKKyAgICAgIHRoZSA8Y29kZT5DbGFzcy1QYXRoPC9jb2RlPiBhdHRyaWJ1dGUpIGludG8gYSBzaW5nbGUgYXR0cmlidXRlLiA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+emlwNjRNb2RlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gdG8gdXNlIFppcDY0IGV4dGVuc2lvbnMgZm9yIGVudHJpZXMuICBUaGUKLSAgICAgIHBvc3NpYmxlIHZhbHVlcyBhcmUgIm5ldmVyIiwgImFsd2F5cyIgYW5kICJhcy1uZWVkZWQiLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjkuMTwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iemlwLmh0bWwjemlwNjQiPmRpc2N1c3Npb24gaW4gdGhlCi0gICAgICB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyAibmV2ZXIiPC90ZD4KKyAgICA8dGQ+emlwNjRNb2RlPC90ZD4KKyAgICA8dGQ+V2hlbiB0byB1c2UgWmlwNjQgZXh0ZW5zaW9ucyBmb3IgZW50cmllcy4gIFRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgIGFyZSA8cT5uZXZlcjwvcT4sIDxxPmFsd2F5czwvcT4gYW5kIDxxPmFzLW5lZWRlZDwvcT4uICA8ZW0+U2luY2UgQW50IDEuOS4xPC9lbT4uPGJyLz5TZWUgYWxzbworICAgICAgdGhlIDxhIGhyZWY9InppcC5odG1sI3ppcDY0Ij5kaXNjdXNzaW9uIGluIHRoZSB6aXAgdGFzayBwYWdlPC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5ldmVyPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogCiA8aDQ+bGliPC9oND4KLTxwPlRoZSBuZXN0ZWQgPGNvZGU+bGliPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwKLWVuZCB1cCBpbiB0aGUgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgd2FyIGZpbGUuPC9wPgorPHA+VGhlIG5lc3RlZCA8Y29kZT5saWI8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gQWxsCitmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBlbmQgdXAgaW4gdGhlIDxzYW1wPldFQi1JTkYvbGliPC9zYW1wPiBkaXJlY3Rvcnkgb2YgdGhlIHdhcgorZmlsZS48L3A+CiAKIDxoND5jbGFzc2VzPC9oND4KLTxwPlRoZSBuZXN0ZWQgPGNvZGU+Y2xhc3NlczwvY29kZT4gZWxlbWVudCBzcGVjaWZpZXMgYSA8YQotaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPi4gQWxsIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgZmlsZXNldCB3aWxsCi1lbmQgdXAgaW4gdGhlIDxjb2RlPldFQi1JTkYvY2xhc3NlczwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS48L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPmNsYXNzZXM8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBlbmQgdXAgaW4KK3RoZSA8c2FtcD5XRUItSU5GL2NsYXNzZXM8L3NhbXA+IGRpcmVjdG9yeSBvZiB0aGUgd2FyIGZpbGUuPC9wPgogCiA8aDQ+d2ViaW5mPC9oND4KLTxwPlRoZSBuZXN0ZWQgPGNvZGU+d2ViaW5mPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcyBhIDxhCi1ocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwKLWVuZCB1cCBpbiB0aGUgPGNvZGU+V0VCLUlORjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS4gSWYgdGhpcwotZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUgbmFtZWQgPGNvZGU+d2ViLnhtbDwvY29kZT4sIHRoZSBmaWxlIGlzCi1pZ25vcmVkIGFuZCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nLjwvcD4KKzxwPlRoZSBuZXN0ZWQgPGNvZGU+d2ViaW5mPC9jb2RlPiBlbGVtZW50IHNwZWNpZmllcworYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LiBBbGwgZmlsZXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlc2V0IHdpbGwgZW5kIHVwIGluCit0aGUgPHNhbXA+V0VCLUlORjwvc2FtcD4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS4gSWYgdGhpcyBmaWxlc2V0IGluY2x1ZGVzIGEgZmlsZQorbmFtZWQgPHNhbXA+d2ViLnhtbDwvc2FtcD4sIHRoZSBmaWxlIGlzIGlnbm9yZWQgYW5kIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcuPC9wPgogCiA8aDQ+bWV0YWluZjwvaDQ+Ci08cD5UaGUgbmVzdGVkIDxjb2RlPm1ldGFpbmY8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzIGEgPGEKLWhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbAotZW5kIHVwIGluIHRoZSA8Y29kZT5NRVRBLUlORjwvY29kZT4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS4gSWYgdGhpcwotZmlsZXNldCBpbmNsdWRlcyBhIGZpbGUgbmFtZWQgPGNvZGU+TUFOSUZFU1QuTUY8L2NvZGU+LCB0aGUgZmlsZSBpcwotaWdub3JlZCBhbmQgeW91IHdpbGwgZ2V0IGEgd2FybmluZy48L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPm1ldGFpbmY8L2NvZGU+IGVsZW1lbnQgc3BlY2lmaWVzCithIDxhIGhyZWY9Ii4uL1R5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4uIEFsbCBmaWxlcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGVzZXQgd2lsbCBlbmQgdXAgaW4KK3RoZSA8c2FtcD5NRVRBLUlORjwvc2FtcD4gZGlyZWN0b3J5IG9mIHRoZSB3YXIgZmlsZS4gSWYgdGhpcyBmaWxlc2V0IGluY2x1ZGVzIGEgZmlsZQorbmFtZWQgPHNhbXA+TUFOSUZFU1QuTUY8L3NhbXA+LCB0aGUgZmlsZSBpcyBpZ25vcmVkIGFuZCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nLjwvcD4KIAogPGg0Pm1hbmlmZXN0LCBpbmRleGphcnMsIHNlcnZpY2U8L2g0PgogVGhlc2UgYXJlIGluaGVyaXRlZCBmcm9tIDxhIGhyZWY9Imphci5odG1sIj4mbHQ7amFyJmd0OzwvYT4KQEAgLTMxOCw5ICsyODEsOCBAQAogc3JjL2h0bWwvbXlhcHAvaW5kZXguaHRtbAogc3JjL2pzcC9teWFwcC9mcm9udC5qc3AKIHNyYy9ncmFwaGljcy9pbWFnZXMvZ2lmcy9zbWFsbC9sb2dvLmdpZgotc3JjL2dyYXBoaWNzL2ltYWdlcy9naWZzL2xhcmdlL2xvZ28uZ2lmCi08L3ByZT4KLXRoZW4gdGhlIHdhciBmaWxlIDxjb2RlPm15YXBwLndhcjwvY29kZT4gY3JlYXRlZCB3aXRoCitzcmMvZ3JhcGhpY3MvaW1hZ2VzL2dpZnMvbGFyZ2UvbG9nby5naWY8L3ByZT4KKzxwPnRoZW4gdGhlIHdhciBmaWxlIDxzYW1wPm15YXBwLndhcjwvc2FtcD4gY3JlYXRlZCB3aXRoPC9wPgogPHByZT4KICZsdDt3YXIgZGVzdGZpbGU9JnF1b3Q7bXlhcHAud2FyJnF1b3Q7IHdlYnhtbD0mcXVvdDtzcmMvbWV0YWRhdGEvbXlhcHAueG1sJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7c3JjL2h0bWwvbXlhcHAmcXVvdDsvJmd0OwpAQCAtMzMxLDkgKzI5Myw4IEBACiAgICZsdDtjbGFzc2VzIGRpcj0mcXVvdDtidWlsZC9tYWluJnF1b3Q7LyZndDsKICAgJmx0O3ppcGZpbGVzZXQgZGlyPSZxdW90O3NyYy9ncmFwaGljcy9pbWFnZXMvZ2lmcyZxdW90OwogICAgICAgICAgICAgICBwcmVmaXg9JnF1b3Q7aW1hZ2VzJnF1b3Q7LyZndDsKLSZsdDsvd2FyJmd0OwotPC9wcmU+Ci13aWxsIGNvbnNpc3Qgb2YKKyZsdDsvd2FyJmd0OzwvcHJlPgorPHA+d2lsbCBjb25zaXN0IG9mPC9wPgogPHByZT4KIFdFQi1JTkYvd2ViLnhtbAogV0VCLUlORi9saWIvamRiYzIuamFyCkBAIC0zNDIsMjMgKzMwMywxOSBAQAogaW5kZXguaHRtbAogZnJvbnQuanNwCiBpbWFnZXMvc21hbGwvbG9nby5naWYKLWltYWdlcy9sYXJnZS9sb2dvLmdpZgotPC9wcmU+CitpbWFnZXMvbGFyZ2UvbG9nby5naWY8L3ByZT4KIHVzaW5nIEFudCdzIGRlZmF1bHQgbWFuaWZlc3QgZmlsZS4gVGhlIGNvbnRlbnQgb2YKLTxjb2RlPldFQi1JTkYvd2ViLnhtbDwvY29kZT4gaXMgaWRlbnRpY2FsIHRvCi08Y29kZT5zcmMvbWV0YWRhdGEvbXlhcHAueG1sPC9jb2RlPi4KKzxzYW1wPldFQi1JTkYvd2ViLnhtbDwvc2FtcD4gaXMgaWRlbnRpY2FsIHRvCis8c2FtcD5zcmMvbWV0YWRhdGEvbXlhcHAueG1sPC9zYW1wPi4KIAotPHA+V2UgcmVndWxhcmx5IHJlY2VpdmUgYnVnIHJlcG9ydHMgdGhhdCB0aGlzIHRhc2sgaXMgY3JlYXRpbmcgdGhlIFdFQi1JTkYKLWRpcmVjdG9yeSBhcyB3ZWItaW5mIChhbGwgbG93ZXIgY2FzZSksIGFuZCB0aHVzIGl0IGlzIG91ciBmYXVsdCB5b3VyIHdlYmFwcCBkb2Vzbid0IHdvcmsuIFRoZSBjYXVzZQotb2YgdGhlc2UgY29tcGxhaW50cyBsaWVzIGluIFdpblppcCwgd2hpY2ggdHVybnMgYW4gYWxsIHVwcGVyLWNhc2UKLWRpcmVjdG9yeSBpbnRvIGFuIGFsbCBsb3dlciBjYXNlIG9uZSBpbiBhIGZpdCBvZiBoZWxwZnVsbmVzcy4gUGxlYXNlIGNoZWNrIHRoYXQKLTxjb2RlPmphciB4dmYgeW91cndlYmFwcC53YXI8L2NvZGU+IHNob3dzIHRoZSBzYW1lIGJlaGF2aW91ciBiZWZvcmUgZmlsaW5nIGFub3RoZXIKLXJlcG9ydC48YnIvPgotV2luemlwIGhhcyBhbiBvcHRpb24gYWxsb3dpbmcgYWxsIHVwcGVyY2FzZSBuYW1lcyAod2hpY2ggaXMgb2ZmIGJ5IGRlZmF1bHQhKS4gIEl0IGNhbiBiZSBlbmFibGVkIGJ5OgotTWVudSAiT3B0aW9ucyIgLT4gIkNvbmZpZ3VyYXRpb24iLCAgIlZpZXciIHByb3BlcnR5L3RhYiBwYWdlLCB0aGVuICJHZW5lcmFsIiBncm91cCBib3ggaGFzIGFuIG9wdGlvbiBjYWxsZWQgIkFsbG93IGFsbCB1cHBlcmNhc2UgZmlsZSBuYW1lcyIuCi08L3A+Ci0KLQorPHA+V2UgcmVndWxhcmx5IHJlY2VpdmUgYnVnIHJlcG9ydHMgdGhhdCB0aGlzIHRhc2sgaXMgY3JlYXRpbmcgdGhlIDxzYW1wPldFQi1JTkY8L3NhbXA+IGRpcmVjdG9yeQorYXMgPHNhbXA+d2ViLWluZjwvc2FtcD4gKGFsbCBsb3dlciBjYXNlKSwgYW5kIHRodXMgaXQgaXMgb3VyIGZhdWx0IHlvdXIgd2ViYXBwIGRvZXNuJ3Qgd29yay4gVGhlCitjYXVzZSBvZiB0aGVzZSBjb21wbGFpbnRzIGxpZXMgaW4gV2luWmlwLCB3aGljaCB0dXJucyBhbiBhbGwgdXBwZXItY2FzZSBkaXJlY3RvcnkgaW50byBhbiBhbGwKK2xvd2VyLWNhc2Ugb25lIGluIGEgZml0IG9mIGhlbHBmdWxuZXNzLiBQbGVhc2UgY2hlY2sgdGhhdCA8Y29kZT5qYXIgeHZmIHlvdXJ3ZWJhcHAud2FyPC9jb2RlPiBzaG93cwordGhlIHNhbWUgYmVoYXZpb3VyIGJlZm9yZSBmaWxpbmcgYW5vdGhlciByZXBvcnQuPGJyLz5XaW5aaXAgaGFzIGFuIG9wdGlvbiBhbGxvd2luZyBhbGwgdXBwZXJjYXNlCituYW1lcyAod2hpY2ggaXMgb2ZmIGJ5IGRlZmF1bHQhKS4gIEl0IGNhbiBiZSBlbmFibGVkIGJ5OiBNZW51IDxxPk9wdGlvbnM8L3E+CismcmFycjsgPHE+Q29uZmlndXJhdGlvbjwvcT4sIDxxPlZpZXc8L3E+IHByb3BlcnR5L3RhYiBwYWdlLCB0aGVuIDxxPkdlbmVyYWw8L3E+IGdyb3VwIGJveCBoYXMgYW4KK29wdGlvbiBjYWxsZWQgPHE+QWxsb3cgYWxsIHVwcGVyY2FzZSBmaWxlIG5hbWVzPC9xPi48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy93aGljaHJlc291cmNlLmh0bWwgYi9tYW51YWwvVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sCmluZGV4IDViMmI1NGUuLjhlZDZhZmUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy93aGljaHJlc291cmNlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3doaWNocmVzb3VyY2UuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwNyArMTUsNzUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci0gICAgCi08aHRtbD4KKworPGh0bWwgbGFuZz0iZW4iPgogICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Ci0gICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotICAgICAgICA8dGl0bGU+V2hpY2hyZXNvdXJjZSBUYXNrPC90aXRsZT4KLSAgICAgIDwvbGluaz4KLSAgICA8L21ldGE+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgICA8dGl0bGU+V2hpY2hyZXNvdXJjZSBUYXNrPC90aXRsZT4KICAgPC9oZWFkPgogCi0KICAgPGJvZHk+Ci0gICAgPGgyPjxhIG5hbWU9IndoaWNocmVzb3VyY2UiPldoaWNocmVzb3VyY2U8L2E+PC9oMj4KKyAgICA8aDIgaWQ9IndoaWNocmVzb3VyY2UiPldoaWNocmVzb3VyY2U8L2gyPgogICAgIDxoMz5EZXNjcmlwdGlvbjwvaDM+Ci0gICAgPHA+Ci0gICAgICBGaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2Ugb24gdGhlIHN1cHBsaWVkIGNsYXNzcGF0aCwgb3IgdGhlCi0gICAgICBzeXN0ZW0gY2xhc3NwYXRoIGlmIG5vbmUgaXMgc3VwcGxpZWQuCi0gICAgICBUaGUgbmFtZWQgcHJvcGVydHkgaXMgc2V0IGlmIHRoZSBpdGVtIGNhbiBiZSBmb3VuZC4KLSAgICAgIEZvciBleGFtcGxlOgotICAgIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDt3aGljaHJlc291cmNlIHJlc291cmNlPSIvbG9nNGoucHJvcGVydGllcyIgcHJvcGVydHk9ImxvZzRqLnVybCIgJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgIDxwPkZpbmQgYSBjbGFzcyBvciByZXNvdXJjZSBvbiB0aGUgc3VwcGxpZWQgY2xhc3NwYXRoLCBvciB0aGUgc3lzdGVtIGNsYXNzcGF0aCBpZiBub25lIGlzCisgICAgICBzdXBwbGllZC4gIFRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQgaWYgdGhlIGl0ZW0gY2FuIGJlIGZvdW5kLiAgRm9yIGV4YW1wbGU6PC9wPgorICAgIDxwcmU+Jmx0O3doaWNocmVzb3VyY2UgcmVzb3VyY2U9Ii9sb2c0ai5wcm9wZXJ0aWVzIiBwcm9wZXJ0eT0ibG9nNGoudXJsIi8mZ3Q7PC9wcmU+CiAgICAgPGgzPlBhcmFtZXRlcnM8L2gzPgotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5wcm9wZXJ0eTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgVGhlIHByb3BlcnR5IHRvIGZpbGwgd2l0aCB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSBvZiBjbGFzcy4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgICA8dGQ+cHJvcGVydHk8L3RkPgorICAgICAgICA8dGQ+VGhlIHByb3BlcnR5IHRvIGZpbGwgd2l0aCB0aGUgVVJMIG9mIHRoZSByZXNvdXJjZSBvZiBjbGFzcy48L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3M8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZS48L3RkPgorICAgICAgICA8dGQ+Y2xhc3M8L3RkPgorICAgICAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGxvb2sgZm9yLjwvdGQ+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnJlc291cmNlPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgdG8gbG9vayBmb3IuCi0gICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD5yZXNvdXJjZTwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIHRvIGxvb2sgZm9yLjwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgVGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIDxjb2RlPmNsYXNzPC9jb2RlPgotICAgICAgICAgIG9yIDxjb2RlPnJlc291cmNlPC9jb2RlPi4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgICAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2Ugd2hlbiBsb29raW5nIHVwIDx2YXI+Y2xhc3M8L3Zhcj4gb3IgPHZhcj5yZXNvdXJjZTwvdmFyPi48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgIFRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhCi0gICAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+Ci0gICAgICAgICAgdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLgotICAgICAgICAgIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xLjwvZW0+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICAgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhCisgICAgICAgICAgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4gIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9lbT4uPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KICAgICA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KICAgICA8aDQ+Y2xhc3NwYXRoPC9oND4KLSAgICA8cD4KLSAgICAgIDxjb2RlPldoaWNocmVzb3VyY2U8L2NvZGU+J3MgPGNvZGU+Y2xhc3NwYXRoPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYQotICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPiBhbmQgY2FuIGFsc28gYmUKLSAgICAgIHNldCB2aWEgYSBuZXN0ZWQgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQuCi0gICAgPC9wPgorICAgIDxwPjxjb2RlPldoaWNocmVzb3VyY2U8L2NvZGU+J3MgPHZhcj5jbGFzc3BhdGg8L3Zhcj4gYXR0cmlidXRlIGlzCisgICAgICBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gYW5kIGNhbiBhbHNvIGJlIHNldCB2aWEgYQorICAgICAgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KICAgICA8aDM+RXhhbXBsZXM8L2gzPgotICAgIDxwPgotICAgICAgVGhlIGZvbGxvd2luZyBzaG93cyB1c2luZyBhIGNsYXNzcGF0aCByZWZlcmVuY2UuCi0gICAgPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSAgJmx0O3BhdGggaWQ9ImJzZi5jbGFzc3BhdGgiJmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0iJHt1c2VyLmhvbWV9L2xhbmcvYnNmIiBpbmNsdWRlcz0iKi5qYXIiLyZndDsKLSAgJmx0Oy9wYXRoJmd0OwotICAmbHQ7d2hpY2hyZXNvdXJjZSBwcm9wZXJ0eT0iYnNmLmNsYXNzLmxvY2F0aW9uIgotICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmFwYWNoZS5ic2YuQlNGTWFuYWdlciIKLSAgICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJic2YuY2xhc3NwYXRoIi8mZ3Q7Ci0gICZsdDtlY2hvJmd0OyR7YnNmLmNsYXNzLmxvY2F0aW9ufSZsdDsvZWNobyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLSAgICA8cD4KLSAgICAgIFRoZSBmb2xsb3dpbmcgc2hvd3MgdXNpbmcgYSBuZXN0ZWQgY2xhc3NwYXRoLgotICAgIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDt3aGljaHJlc291cmNlCi0gICAgcHJvcGVydHk9ImFudC1jb250cmliLmFudGxpYi5sb2NhdGlvbiIKLSAgICByZXNvdXJjZT0ibmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCImZ3Q7Ci0gICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICZsdDtwYXRoIHBhdGg9ImY6L3Rlc3RpbmcvYW50LWNvbnRyaWIvdGFyZ2V0L2FudC1jb250cmliLmphciIvJmd0OwotICAgICZsdDsvY2xhc3NwYXRoJmd0OwotICAmbHQ7L3doaWNocmVzb3VyY2UmZ3Q7Ci0gICZsdDtlY2hvJmd0OyR7YW50LWNvbnRyaWIuYW50bGliLmxvY2F0aW9ufSZsdDsvZWNobyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICA8cD5UaGUgZm9sbG93aW5nIHNob3dzIHVzaW5nIGEgY2xhc3NwYXRoIHJlZmVyZW5jZS48L3A+CisgICAgPHByZT4KKyZsdDtwYXRoIGlkPSJic2YuY2xhc3NwYXRoIiZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSIke3VzZXIuaG9tZX0vbGFuZy9ic2YiIGluY2x1ZGVzPSIqLmphciIvJmd0OworJmx0Oy9wYXRoJmd0OworJmx0O3doaWNocmVzb3VyY2UgcHJvcGVydHk9ImJzZi5jbGFzcy5sb2NhdGlvbiIKKyAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuYXBhY2hlLmJzZi5CU0ZNYW5hZ2VyIgorICAgICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJic2YuY2xhc3NwYXRoIi8mZ3Q7CismbHQ7ZWNobyZndDske2JzZi5jbGFzcy5sb2NhdGlvbn0mbHQ7L2VjaG8mZ3Q7PC9wcmU+CisgICAgPHA+VGhlIGZvbGxvd2luZyBzaG93cyB1c2luZyBhIG5lc3RlZCBjbGFzc3BhdGguPC9wPgorICAgIDxwcmU+CismbHQ7d2hpY2hyZXNvdXJjZSBwcm9wZXJ0eT0iYW50LWNvbnRyaWIuYW50bGliLmxvY2F0aW9uIgorICAgICAgICAgICAgICAgcmVzb3VyY2U9Im5ldC9zZi9hbnRjb250cmliL2FudGxpYi54bWwiJmd0OworICAmbHQ7Y2xhc3NwYXRoJmd0OworICAgICZsdDtwYXRoIHBhdGg9ImY6L3Rlc3RpbmcvYW50LWNvbnRyaWIvdGFyZ2V0L2FudC1jb250cmliLmphciIvJmd0OworICAmbHQ7L2NsYXNzcGF0aCZndDsKKyZsdDsvd2hpY2hyZXNvdXJjZSZndDsKKyZsdDtlY2hvJmd0OyR7YW50LWNvbnRyaWIuYW50bGliLmxvY2F0aW9ufSZsdDsvZWNobyZndDs8L3ByZT4KICAgPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3dsanNwYy5odG1sIGIvbWFudWFsL1Rhc2tzL3dsanNwYy5odG1sCmluZGV4IDU2NjM0OTQuLmQzZTkwN2QgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UYXNrcy93bGpzcGMuaHRtbAorKysgYi9tYW51YWwvVGFza3Mvd2xqc3BjLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw4NSArMTUsNzUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KLTxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Ci08dGl0bGU+V0xKU1BDIFRhc2s8L3RpdGxlPjwvaGVhZD4KKzxodG1sIGxhbmc9ImVuIj4KKyAgPGhlYWQ+CisgICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKyAgICA8dGl0bGU+V0xKU1BDIFRhc2s8L3RpdGxlPgorICA8L2hlYWQ+CiA8Ym9keT4KIDxoMT53bGpzcGM8L2gxPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkNsYXNzIHRvIHByZWNvbXBpbGUgSlNQJ3MgdXNpbmcgd2VibG9naWMncyBqc3AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpPC9wPgotVGVzdGVkIG9ubHkgb24gV2VibG9naWMgNC41LjEgLSBOVDQuMCBhbmQgU29sYXJpcyA1LjcsNS44PGJyPgorPHA+Q2xhc3MgdG8gcHJlY29tcGlsZSBKU1AncyB1c2luZyBXZWJMb2dpYyBKU1AgY29tcGlsZXIgKDxjb2RlPndlYmxvZ2ljLmpzcGM8L2NvZGU+KTwvcD4KKzxwPlRlc3RlZCBvbmx5IG9uIFdlYkxvZ2ljIDQuNS4xJm1kYXNoO05UIDQuMCBhbmQgU29sYXJpcyA3ICZhbXA7IDg8L3A+CiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxsUGFkZGluZz0iMiIgY2VsbFNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRoZWFkPgorICAgIDx0cj4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPlZhbHVlczwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgIDwvdHI+CisgIDwvdGhlYWQ+CiAgIDx0Ym9keT4KICAgICA8dHI+Ci0gICAgICA8dGg+QXR0cmlidXRlPC90aD4KLSAgICAgIDx0aD5WYWx1ZXM8L3RoPgotICAgICAgPHRoPlJlcXVpcmVkPC90aD4KLSAgICA8L3RyPgotICAgIDx0cj4KICAgICAgIDx0ZD5zcmM8L3RkPgotICAgICAgPHRkPnJvb3Qgb2Ygc291cmNlIHRyZWUgZm9yIEpTUCwgaWUsIHRoZSBkb2N1bWVudCByb290IGZvciB5b3VyIHdlYmxvZ2ljIHNlcnZlcjwvdGQ+CisgICAgICA8dGQ+cm9vdCBvZiBzb3VyY2UgdHJlZSBmb3IgSlNQLCBpZSwgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHlvdXIgV2ViTG9naWMgc2VydmVyPC90ZD4KICAgICAgIDx0ZD5ZZXM8L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkPgotZGVzdDwvdGQ+Ci0gICAgICA8dGQ+IHJvb3Qgb2YgZGVzdGluYXRpb24gZGlyZWN0b3J5LCB3aGF0IHlvdSBoYXZlIHNldCBhcyBXb3JraW5nRGlyIGluIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWVzPC90ZD4KKyAgICAgIDx0ZD5kZXN0PC90ZD4KKyAgICAgIDx0ZD5yb290IG9mIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgd2hhdCB5b3UgaGF2ZSBzZXQgYXMgPGNvZGU+V29ya2luZ0RpcjwvY29kZT4gaW4gdGhlCisgICAgICAgIFdlYkxvZ2ljIHByb3BlcnRpZXM8L3RkPgogICAgICAgPHRkPlllczwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQ+Ci1wYWNrYWdlPC90ZD4KLSAgICAgIDx0ZD4gc3RhcnQgcGFja2FnZSBuYW1lIHVuZGVyIHdoaWNoIHlvdXIgSlNQJ3Mgd291bGQgYmUgY29tcGlsZWQ8L3RkPgorICAgICAgPHRkPnBhY2thZ2U8L3RkPgorICAgICAgPHRkPnN0YXJ0IHBhY2thZ2UgbmFtZSB1bmRlciB3aGljaCB5b3VyIEpTUHMgd291bGQgYmUgY29tcGlsZWQ8L3RkPgogICAgICAgPHRkPlllczwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQ+Ci1jbGFzc3BhdGg8L3RkPgotICAgICAgPHRkPkNsYXNzIHBhdGggdG8gdXNlIHdoZW4gY29tcGlsaW5nIGpzcCdzPC90ZD4KKyAgICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgICAgPHRkPkNsYXNzIHBhdGggdG8gdXNlIHdoZW4gY29tcGlsaW5nIEpTUHM8L3RkPgogICAgICAgPHRkPlllczwvdGQ+CiAgICAgPC90cj4KICAgPC90Ym9keT4KIDwvdGFibGU+Ci08cD4KLTxicj4KLQotQSBjbGFzc3BhdGggc2hvdWxkIGJlIHNldCB3aGljaCBjb250YWlucyB0aGUgd2VibG9naWMgY2xhc3NlcyBhcyB3ZWxsIGFzIGFsbCBhcHBsaWNhdGlvbiBjbGFzc2VzPGJyPgotcmVmZXJlbmNlZCBieSB0aGUgSlNQLiBUaGUgc3lzdGVtIGNsYXNzcGF0aCBpcyBhbHNvIGFwcGVuZGVkIHdoZW4gdGhlIGpzcGMgaXMgY2FsbGVkLCBzbyB5b3UgbWF5PGJyPgotY2hvb3NlIHRvIHB1dCBldmVyeXRoaW5nIGluIHRoZSBjbGFzc3BhdGggd2hpbGUgY2FsbGluZyBBcGFjaGUgQW50LiBIb3dldmVyLCBzaW5jZSBwcmVzdW1hYmx5IHRoZSBKU1AncyB3aWxsIHJlZmVyZW5jZTxicj4KLWNsYXNzZXMgYmVpbmcgYnVpbGQgYnkgQW50LCBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gZXhwbGljaXRseSBhZGQgdGhlIGNsYXNzcGF0aCBpbiB0aGUgdGFzazxicj4KLTxicj4KLVRoZSB0YXNrIGNoZWNrcyB0aW1lc3RhbXBzIG9uIHRoZSBKU1AncyBhbmQgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLCBhbmQgY29tcGlsZXM8YnI+Ci1vbmx5IHRob3NlIGZpbGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLjxicj4KLTxicj4KLUl0IGZvbGxvd3MgdGhlIHdlYmxvZ2ljIG5hbWluZyBjb252ZW50aW9uIG9mIHB1dHRpbmcgY2xhc3NlcyBpbjxicj4KLTxiPiBfZGlyTmFtZS9fZmlsZU5hbWUuY2xhc3MgZm9yIGRpcm5hbWUvZmlsZU5hbWUuanNwICAgPC9iPjxicj4KLTxicj4KLTwvcD4KLTxoMz48YnI+Ci1FeGFtcGxlPGJyPgotPC9oMz4KLTxwPgorPHA+QSBjbGFzc3BhdGggc2hvdWxkIGJlIHNldCB3aGljaCBjb250YWlucyB0aGUgV2ViTG9naWMgY2xhc3NlcyBhcyB3ZWxsIGFzIGFsbCBhcHBsaWNhdGlvbiBjbGFzc2VzCityZWZlcmVuY2VkIGJ5IEpTUC4gVGhlIHN5c3RlbSBjbGFzc3BhdGggaXMgYWxzbyBhcHBlbmRlZCB3aGVuIHRoZSA8Y29kZT5qc3BjPC9jb2RlPiBpcyBjYWxsZWQsIHNvCit5b3UgbWF5IGNob29zZSB0byBwdXQgZXZlcnl0aGluZyBpbiB0aGUgY2xhc3NwYXRoIHdoaWxlIGNhbGxpbmcgQXBhY2hlIEFudC4gSG93ZXZlciwgc2luY2UKK3ByZXN1bWFibHkgSlNQcyB3aWxsIHJlZmVyZW5jZSBjbGFzc2VzIGJlaW5nIGJ1aWxkIGJ5IEFudCwgaXQgd291bGQgYmUgYmV0dGVyIHRvIGV4cGxpY2l0bHkgYWRkIHRoZQorY2xhc3NwYXRoIGluIHRoZSB0YXNrLjwvcD4KKzxwPlRoZSB0YXNrIGNoZWNrcyB0aW1lc3RhbXBzIG9uIHRoZSBKU1AncyBhbmQgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLCBhbmQgY29tcGlsZXMgb25seSB0aG9zZSBmaWxlcwordGhhdCBoYXZlIGNoYW5nZWQuPC9wPgorPHA+SXQgZm9sbG93cyB0aGUgV2ViTG9naWMgbmFtaW5nIGNvbnZlbnRpb24gb2YgcHV0dGluZyBjbGFzc2VzIGluIDxzYW1wPl9kaXJOYW1lL19maWxlTmFtZS5jbGFzcworZm9yIGRpcm5hbWUvZmlsZU5hbWUuanNwPC9zYW1wPjwvcD4KKzxoMz5FeGFtcGxlPC9oMz4KIDxwcmU+CiAmbHQ7dGFyZ2V0IG5hbWU9ImpzcGNvbXBpbGUiIGRlcGVuZHM9ImNvbXBpbGUiJmd0OwotICAmbHQ7d2xqc3BjIHNyYz0iYzpcXHdlYmxvZ2ljXFxteXNlcnZlclxccHVibGljX2h0bWwiIGRlc3Q9ImM6XFx3ZWJsb2dpY1xcbXlzZXJ2ZXJcXHNlcnZlcmNsYXNzZXMiIHBhY2thZ2U9Im15YXBwLmpzcCImZ3QKKyAgJmx0O3dsanNwYyBzcmM9ImM6XFx3ZWJsb2dpY1xcbXlzZXJ2ZXJcXHB1YmxpY19odG1sIiBkZXN0PSJjOlxcd2VibG9naWNcXG15c2VydmVyXFxzZXJ2ZXJjbGFzc2VzIiBwYWNrYWdlPSJteWFwcC5qc3AiJmd0OwogICAgICZsdDtjbGFzc3BhdGgmZ3Q7CiAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7d2VibG9naWMuY2xhc3NwYXRofSIvJmd0OwogICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7Y29tcGlsZS5kZXN0fSIvJmd0OwogICAgICZsdDsvY2xhc3NwYXRoJmd0OwogICAmbHQ7L3dsanNwYyZndDsKLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+Ci0KLTwvcD4KKyZsdDsvdGFyZ2V0Jmd0OzwvcHJlPgogCiA8aDM+TGltaXRhdGlvbnM8L2gzPgogPHVsPgotPGxpPlRoaXMgd29ya3Mgb25seSBvbiB3ZWJsb2dpYyA0LjUuMTwvbGk+Ci08bGk+SXQgY29tcGlsZXMgdGhlIGZpbGVzIHRocnUgdGhlIENsYXNzaWMgY29tcGlsZXIgb25seS48L2xpPgotPGxpPlNpbmNlIGl0IGlzIG15IGV4cGVyaWVuY2UgdGhhdCB3ZWJsb2dpYyBqc3BjIHRocm93cyBvdXQgb2YgbWVtb3J5IGVycm9yIG9uIGJlaW5nIGdpdmVuIHRvbwotbWFueSBmaWxlcyBhdCBvbmUgZ28sIGl0IGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoIG9uZSBqc3AgZmlsZSBlYWNoLjwvbGk+CisgIDxsaT5UaGlzIHdvcmtzIG9ubHkgb24gV2ViTG9naWMgNC41LjE8L2xpPgorICA8bGk+SXQgY29tcGlsZXMgdGhlIGZpbGVzIHRocm91Z2ggdGhlIENsYXNzaWMgY29tcGlsZXIgb25seS48L2xpPgorICA8bGk+U2luY2UgaXQgaXMgbXkgZXhwZXJpZW5jZSB0aGF0IDxjb2RlPndlYmxvZ2ljLmpzcGM8L2NvZGU+IHRocm93cyBvdXQgb2YgbWVtb3J5IGVycm9yIG9uIGJlaW5nCisgICAgZ2l2ZW4gdG9vIG1hbnkgZmlsZXMgYXQgb25lIGdvLCBpdCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBvbmUgSlNQIGZpbGUgZWFjaC48L2xpPgogPC91bD4KIAogPC9ib2R5PgpkaWZmIC0tZ2l0IGEvbWFudWFsL1Rhc2tzL3htbHByb3BlcnR5Lmh0bWwgYi9tYW51YWwvVGFza3MveG1scHJvcGVydHkuaHRtbAppbmRleCAyOTNjZjI0Li5lNTY4MzkyIDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MveG1scHJvcGVydHkuaHRtbAorKysgYi9tYW51YWwvVGFza3MveG1scHJvcGVydHkuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5YbWxQcm9wZXJ0eSBUYXNrPC90aXRsZT4KQEAgLTIyLDI2OCArMjMsMjM2IEBACiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ieG1scHJvcGVydHkiPlhtbFByb3BlcnR5PC9hPjwvaDI+Cis8aDIgaWQ9InhtbHByb3BlcnR5Ij5YbWxQcm9wZXJ0eTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgotPHA+Ci1Mb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHdlbGwtZm9ybWVkIHhtbCBmaWxlLiBUaGVyZSBhcmUgbm8gb3RoZXIgcmVzdHJpY3Rpb25zCi10aGFuICJ3ZWxsLWZvcm1lZCIuIFlvdSBjYW4gY2hvb3NlIHRoZSBsYXlvdXQgeW91IHdhbnQuIEZvciBleGFtcGxlIHRoaXMgWE1MIHByb3BlcnR5IGZpbGU6Cis8cD5Mb2FkcyBwcm9wZXJ0eSB2YWx1ZXMgZnJvbSBhIHdlbGwtZm9ybWVkIHhtbCBmaWxlLiBUaGVyZSBhcmUgbm8gb3RoZXIgcmVzdHJpY3Rpb25zIHRoYW4KKyJ3ZWxsLWZvcm1lZCIuIFlvdSBjYW4gY2hvb3NlIHRoZSBsYXlvdXQgeW91IHdhbnQuIEZvciBleGFtcGxlIHRoaXMgWE1MIHByb3BlcnR5IGZpbGU6PC9wPgogPHByZT4KICAgJmx0O3Jvb3QmZ3Q7CiAgICAgJmx0O3Byb3BlcnRpZXMmZ3Q7CiAgICAgICAmbHQ7Zm9vJmd0O2JhciZsdDsvZm9vJmd0OwogICAgICZsdDsvcHJvcGVydGllcyZndDsKLSAgJmx0Oy9yb290Jmd0OwotPC9wcmU+Ci1pcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhpcyBKYXZhIHByb3BlcnR5IGZpbGU6Ci08cHJlPgotICByb290LnByb3BlcnRpZXMuZm9vID0gYmFyCi08L3ByZT4KKyAgJmx0Oy9yb290Jmd0OzwvcHJlPgorPHA+aXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoaXMgSmF2YSBwcm9wZXJ0eSBmaWxlOjwvcD4KKzxwcmU+cm9vdC5wcm9wZXJ0aWVzLmZvbyA9IGJhcjwvcHJlPgogCi08cD4KLUJ5IGRlZmF1bHQsIHRoaXMgbG9hZAotZG9lcyA8ZW0+bm88L2VtPiBwcm9jZXNzaW5nIG9mIHRoZSBpbnB1dC4gIEluIHBhcnRpY3VsYXIsIHVubGlrZSB0aGUKLTxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPlByb3BlcnR5IHRhc2s8L2E+LCBwcm9wZXJ0eSByZWZlcmVuY2VzCi0oaS5lLiwgPHNhbXA+JHtmb299PC9zYW1wPikgYXJlIG5vdCByZXNvbHZlZC4KLTxwPgotPGEgbmFtZT0ic2VtYW50aWNBdHRyaWJ1dGVzIj4KLTxoMz5TZW1hbnRpYyBBdHRyaWJ1dGVzPC9oMz4KLTwvYT4KLUlucHV0IHByb2Nlc3NpbmcgY2FuIGJlIGVuYWJsZWQgYnkgdXNpbmcgdGhlIDxiPnNlbWFudGljQXR0cmlidXRlczwvYj4KLWF0dHJpYnV0ZS4gIElmIHRoaXMgYXR0cmlidXRlIGlzIHNldCB0byA8aT50cnVlPC9pPiAoaXRzIGRlZmF1bHQgaXMKLTxpPmZhbHNlPC9pPiksIHRoZSBmb2xsb3dpbmcgcHJvY2Vzc2luZyBvY2N1cnMgYXMgdGhlIGlucHV0IFhNTCBmaWxlCi1pcyBsb2FkZWQ6Cis8cD5CeSBkZWZhdWx0LCB0aGlzIGxvYWQgZG9lcyA8ZW0+bm88L2VtPiBwcm9jZXNzaW5nIG9mIHRoZSBpbnB1dC4gIEluIHBhcnRpY3VsYXIsIHVubGlrZQordGhlIDxhIGhyZWY9InByb3BlcnR5Lmh0bWwiPlByb3BlcnR5IHRhc2s8L2E+LCBwcm9wZXJ0eSByZWZlcmVuY2VzIChpLmUuLCA8c2FtcD4ke2Zvb308L3NhbXA+KSBhcmUKK25vdCByZXNvbHZlZC48L3A+Cis8aDMgaWQ9InNlbWFudGljQXR0cmlidXRlcyI+U2VtYW50aWMgYXR0cmlidXRlczwvaDM+Cis8cD5JbnB1dCBwcm9jZXNzaW5nIGNhbiBiZSBlbmFibGVkIGJ5IHVzaW5nIHRoZSA8dmFyPnNlbWFudGljQXR0cmlidXRlczwvdmFyPiBhdHRyaWJ1dGUuICBJZiB0aGlzCithdHRyaWJ1dGUgaXMgc2V0IHRvIDxxPnRydWU8L3E+IChpdHMgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT4pLCB0aGUgZm9sbG93aW5nIHByb2Nlc3Npbmcgb2NjdXJzIGFzCit0aGUgaW5wdXQgWE1MIGZpbGUgaXMgbG9hZGVkOi9wPgogPHVsPgogICA8bGk+UHJvcGVydHkgcmVmZXJlbmNlcyBhcmUgcmVzb2x2ZWQuPC9saT4KICAgPGxpPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseToKICAgICA8dWw+Ci0gICAgICA8bGk+PGI+aWQ8L2I+OiBUaGUgcHJvcGVydHkgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpZCB2YWx1ZS48L2xpPgotICAgICAgPGxpPjxiPmxvY2F0aW9uPC9iPjogVGhlIHByb3BlcnR5IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIGxvY2F0aW9uPC9saT4KLSAgICAgIDxsaT48Yj5yZWZpZDwvYj46IFRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHZhbHVlIG9mIHRoZQotICAgICAgICAgIHJlZmVyZW5jZWQgcHJvcGVydHkuPC9saT4KLSAgICAgIDxsaT48Yj52YWx1ZTwvYj46IFRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHZhbHVlIGluZGljYXRlZC48L2xpPgorICAgICAgPGxpPjx2YXI+aWQ8L3Zhcj46IFRoZSBwcm9wZXJ0eSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGlkIHZhbHVlLjwvbGk+CisgICAgICA8bGk+PHZhcj5sb2NhdGlvbjwvdmFyPjogVGhlIHByb3BlcnR5IGlzIHRyZWF0ZWQgYXMgYSBmaWxlIGxvY2F0aW9uPC9saT4KKyAgICAgIDxsaT48dmFyPnJlZmlkPC92YXI+OiBUaGUgcHJvcGVydHkgaXMgc2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlZCBwcm9wZXJ0eS48L2xpPgorICAgICAgPGxpPjx2YXI+dmFsdWU8L3Zhcj46IFRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gdGhlIHZhbHVlIGluZGljYXRlZC48L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+Ci0gIDxsaT48YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPlBhdGgtbGlrZSBTdHJ1Y3R1cmVzPC9hPiBjYW4gYmUgZGVmaW5lZAotICAgICAgYnkgdXNlIG9mIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgPGxpPjxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZXM8L2E+IGNhbiBiZSBkZWZpbmVkIGJ5IHVzZSBvZiB0aGUgZm9sbG93aW5nCisgICAgYXR0cmlidXRlczoKICAgICA8dWw+Ci0gICAgICA8bGk+PGI+cGF0aGlkPC9iPjogVGhlIGdpdmVuIGlkIGlzIHVzZWQgdG8gaWRlbnRpZnkgYSBwYXRoLiAgVGhlCi0gICAgICAgICAgbmVzdGVkIFhNTCB0YWcgbmFtZSBpcyBpZ25vcmVkLiAgQ2hpbGQgZWxlbWVudHMgY2FuIGJlIHVzZWQKLSAgICAgICAgICAoWE1MIHRhZyBuYW1lcyBhcmUgaWdub3JlZCkgdG8gaWRlbnRpZnkgZWxlbWVudHMgb2YgdGhlIHBhdGguPC9saT4KKyAgICAgIDxsaT48dmFyPnBhdGhpZDwvdmFyPjogVGhlIGdpdmVuIDx2YXI+aWQ8L3Zhcj4gaXMgdXNlZCB0byBpZGVudGlmeSBhIHBhdGguICBUaGUgbmVzdGVkIFhNTCB0YWcKKyAgICAgICAgbmFtZSBpcyBpZ25vcmVkLiAgQ2hpbGQgZWxlbWVudHMgY2FuIGJlIHVzZWQgKFhNTCB0YWcgbmFtZXMgYXJlIGlnbm9yZWQpIHRvIGlkZW50aWZ5CisgICAgICAgIGVsZW1lbnRzIG9mIHRoZSBwYXRoLjwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KIDwvdWw+Ci08cD4KLUZvciBleGFtcGxlLCB3aXRoIHNlbWFudGljIGF0dHJpYnV0ZSBwcm9jZXNzaW5nIGVuYWJsZWQsIHRoaXMgWE1MIHByb3BlcnR5Ci1maWxlOgorPHA+Rm9yIGV4YW1wbGUsIHdpdGggc2VtYW50aWMgYXR0cmlidXRlIHByb2Nlc3NpbmcgZW5hYmxlZCwgdGhpcyBYTUwgcHJvcGVydHkgZmlsZTo8L3A+CiA8cHJlPgotICAmbHQ7cm9vdCZndDsKLSAgICAmbHQ7cHJvcGVydGllcyZndDsKLSAgICAgICZsdDtmb28gbG9jYXRpb249ImJhciIvJmd0OwotICAgICAgJmx0O3F1dXgmZ3Q7JHtyb290LnByb3BlcnRpZXMuZm9vfSZsdDsvcXV1eCZndDsKLSAgICAmbHQ7L3Byb3BlcnRpZXMmZ3Q7Ci0gICZsdDsvcm9vdCZndDsKLTwvcHJlPgotaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnRzIGluIGEgYnVpbGQueG1sIGZpbGU6CismbHQ7cm9vdCZndDsKKyAgJmx0O3Byb3BlcnRpZXMmZ3Q7CisgICAgJmx0O2ZvbyBsb2NhdGlvbj0iYmFyIi8mZ3Q7CisgICAgJmx0O3F1dXgmZ3Q7JHtyb290LnByb3BlcnRpZXMuZm9vfSZsdDsvcXV1eCZndDsKKyAgJmx0Oy9wcm9wZXJ0aWVzJmd0OworJmx0Oy9yb290Jmd0OzwvcHJlPgorPHA+aXMgcm91Z2hseSBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnRzIGluIGEgPHNhbXA+YnVpbGQueG1sPC9zYW1wPiBmaWxlOjwvcD4KIDxwcmU+Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJyb290LnByb3BlcnRpZXMuZm9vIiBsb2NhdGlvbj0iYmFyIi8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJyb290LnByb3BlcnRpZXMucXV1eCIgdmFsdWU9IiR7cm9vdC5wcm9wZXJ0aWVzLmZvb30iLyZndDsKLTwvcHJlPgotCi08L3A+CismbHQ7cHJvcGVydHkgbmFtZT0icm9vdC5wcm9wZXJ0aWVzLmZvbyIgbG9jYXRpb249ImJhciIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9InJvb3QucHJvcGVydGllcy5xdXV4IiB2YWx1ZT0iJHtyb290LnByb3BlcnRpZXMuZm9vfSIvJmd0OzwvcHJlPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIFhNTCBmaWxlIHRvIHBhcnNlLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXMsIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkPlRoZSBYTUwgZmlsZSB0byBwYXJzZS48L3RkPgorICAgIDx0ZD5ZZXMsIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb248L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHByZWZpeCB0byBwcmVwZW5kIHRvIGVhY2ggcHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZD5UaGUgcHJlZml4IHRvIHByZXBlbmQgdG8gZWFjaCBwcm9wZXJ0eS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBSb290PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPktlZXAgdGhlIHhtbCByb290IHRhZyBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgIGZpcnN0IHZhbHVlIGluIHRoZSBwcm9wZXJ0eSBuYW1lLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT50cnVlPC9pPi48L3RkPgorICAgIDx0ZD5rZWVwUm9vdDwvdGQ+CisgICAgPHRkPktlZXAgdGhlIFhNTCByb290IHRhZyBhcyB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIHByb3BlcnR5IG5hbWUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWxpZGF0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5WYWxpZGF0ZSB0aGUgaW5wdXQgZmlsZSAoZS5nLiBieSBhIERURCkuIE90aGVyd2lzZSB0aGUgWE1MIG11c3Qgb25seSBiZSB3ZWxsLWZvcm1lZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgICAgPHRkPnZhbGlkYXRlPC90ZD4KKyAgICA8dGQ+VmFsaWRhdGUgdGhlIGlucHV0IGZpbGUgKGUuZy4gYnkgYSBEVEQpLiBPdGhlcndpc2UgdGhlIFhNTCBtdXN0IG9ubHkgYmUgd2VsbC1mb3JtZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29sbGFwc2VBdHRyaWJ1dGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRyZWF0IGF0dHJpYnV0ZXMgYXMgbmVzdGVkIGVsZW1lbnRzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgICA8dGQ+Y29sbGFwc2VBdHRyaWJ1dGVzPC90ZD4KKyAgICA8dGQ+VHJlYXQgYXR0cmlidXRlcyBhcyBuZXN0ZWQgZWxlbWVudHMuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2VtYW50aWNBdHRyaWJ1dGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkVuYWJsZSBzcGVjaWFsIGhhbmRsaW5nIG9mIGNlcnRhaW4gYXR0cmlidXRlIG5hbWVzLgotICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSIjc2VtYW50aWNBdHRyaWJ1dGVzIj5TZW1hbnRpYyBBdHRyaWJ1dGVzPC9hPgotICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgPGk+ZmFsc2U8L2k+LjwvdGQ+CisgICAgPHRkPnNlbWFudGljQXR0cmlidXRlczwvdGQ+CisgICAgPHRkPkVuYWJsZSBzcGVjaWFsIGhhbmRsaW5nIG9mIGNlcnRhaW4gYXR0cmlidXRlIG5hbWVzLiAgU2VlCisgICAgICB0aGUgPGEgaHJlZj0iI3NlbWFudGljQXR0cmlidXRlcyI+U2VtYW50aWMgQXR0cmlidXRlczwvYT4gc2VjdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SW5jbHVkZSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIHByb3BlcnR5IG5hbWUuICBJZ25vcmVkIGlmCi0gICAgICAgICAgICAgICAgICAgICA8aT5zZW1hbnRpY0F0dHJpYnV0ZXM8L2k+IGlzIG5vdCBzZXQgdG8gPGk+dHJ1ZTwvaT4uCi0gICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIDxhIGhyZWY9IiNzZW1hbnRpY0F0dHJpYnV0ZXMiPlNlbWFudGljIEF0dHJpYnV0ZXM8L2E+Ci0gICAgICAgICAgICAgICAgICAgICBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyA8aT5mYWxzZTwvaT4uPC90ZD4KKyAgICA8dGQ+aW5jbHVkZVNlbWFudGljQXR0cmlidXRlPC90ZD4KKyAgICA8dGQ+SW5jbHVkZSB0aGUgc2VtYW50aWMgYXR0cmlidXRlIG5hbWUgYXMgcGFydCBvZiB0aGUgcHJvcGVydHkgbmFtZS4gIElnbm9yZWQKKyAgICAgIGlmIDx2YXI+c2VtYW50aWNBdHRyaWJ1dGVzPC92YXI+IGlzIG5vdCBzZXQgdG8gPHE+dHJ1ZTwvcT4uICBTZWUKKyAgICAgIHRoZSA8YSBocmVmPSIjc2VtYW50aWNBdHRyaWJ1dGVzIj5TZW1hbnRpYyBBdHRyaWJ1dGVzPC9hPiBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJvb3REaXJlY3Rvcnk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGRpcmVjdG9yeSB0byB1c2UgZm9yIHJlc29sdmluZyBmaWxlIHJlZmVyZW5jZXMuIElnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgIGlmIDxpPnNlbWFudGljQXR0cmlidXRlczwvaT4gaXMgbm90IHNldCB0byA8aT50cnVlPC9pPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgaXMgPGk+JHtiYXNlZGlyfTwvaT4uPC90ZD4KKyAgICA8dGQ+cm9vdERpcmVjdG9yeTwvdGQ+CisgICAgPHRkPlRoZSBkaXJlY3RvcnkgdG8gdXNlIGZvciByZXNvbHZpbmcgZmlsZSByZWZlcmVuY2VzLiBJZ25vcmVkIGlmIDx2YXI+c2VtYW50aWNBdHRyaWJ1dGVzPC92YXI+CisgICAgICBpcyBub3Qgc2V0IHRvIDxxPnRydWU8L3E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDx2YXI+YmFzZWRpcjwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlbGltaXRlcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5EZWxpbWl0ZXIgZm9yIHNwbGl0dGluZyBtdWx0aXBsZSB2YWx1ZXMuPGJyPjxpPnNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L2k+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0cyB0byBjb21tYTwvdGQ+CisgICAgPHRkPmRlbGltaXRlcjwvdGQ+CisgICAgPHRkPkRlbGltaXRlciBmb3Igc3BsaXR0aW5nIG11bHRpcGxlIHZhbHVlcy48YnIvPjxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+LDwvcT4gKGNvbW1hKTwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDM+PGEgbmFtZT0ibmVzdGVkIj5OZXN0ZWQgRWxlbWVudHM8L2E+PC9oMz4KKzxoMyBpZD0ibmVzdGVkIj5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgogPGg0PnhtbGNhdGFsb2c8L2g0PgotPHA+VGhlIDxhIGhyZWY9Ii4uL1R5cGVzL3htbGNhdGFsb2cuaHRtbCI+PHR0PiZsdDt4bWxjYXRhbG9nJmd0OzwvdHQ+PC9hPgotZWxlbWVudCBpcyB1c2VkIHRvIHBlcmZvcm0gZW50aXR5IHJlc29sdXRpb24uPC9wPgorPHA+VGhlIDxhIGhyZWY9Ii4uL1R5cGVzL3htbGNhdGFsb2cuaHRtbCI+PGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudCBpcyB1c2VkIHRvCitwZXJmb3JtIGVudGl0eSByZXNvbHV0aW9uLjwvcD4KIAotPGg0PmFueSA8YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50Ci1yZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxoND5hbnkgPGEgaHJlZj0iLi4vVHlwZXMvcmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciBzaW5nbGUgZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAogPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgaW5wdXQuPC9wPgogCi08YSBuYW1lPSJleGFtcGxlcyI+Ci08aDM+RXhhbXBsZXM8L2gzPgotPC9hPgorPGgzIGlkPSJleGFtcGxlcyI+RXhhbXBsZXM8L2gzPgogCi08aDQ+Tm9uLXNlbWFudGljIEF0dHJpYnV0ZXM8L2g0PgorPGg0Pk5vbi1zZW1hbnRpYyBhdHRyaWJ1dGVzPC9oND4KIAotPHA+SGVyZSBpcyBhbiBleGFtcGxlIHhtbCBmaWxlIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgc2VtYW50aWMgYXR0cmlidXRlcy48L3A+Cis8cD5IZXJlIGlzIGFuIGV4YW1wbGUgWE1MIGZpbGUgdGhhdCBkb2VzIG5vdCBoYXZlIGFueSBzZW1hbnRpYyBhdHRyaWJ1dGVzLjwvcD4KIAogPHByZT4KLSAgICZsdDtyb290LXRhZyBteWF0dHI9InRydWUiJmd0OwotICAgICZsdDtpbm5lci10YWcgc29tZWF0dHI9InZhbCImZ3Q7VGV4dCZsdDsvaW5uZXItdGFnJmd0OwotICAgICZsdDthMiZndDsmbHQ7YTMmZ3Q7Jmx0O2E0Jmd0O2ZhbHNlJmx0Oy9hNCZndDsmbHQ7L2EzJmd0OyZsdDsvYTImZ3Q7Ci0gICAmbHQ7L3Jvb3QtdGFnJmd0OwotPC9wcmU+CismbHQ7cm9vdC10YWcgbXlhdHRyPSJ0cnVlIiZndDsKKyAgJmx0O2lubmVyLXRhZyBzb21lYXR0cj0idmFsIiZndDtUZXh0Jmx0Oy9pbm5lci10YWcmZ3Q7CisgICZsdDthMiZndDsmbHQ7YTMmZ3Q7Jmx0O2E0Jmd0O2ZhbHNlJmx0Oy9hNCZndDsmbHQ7L2EzJmd0OyZsdDsvYTImZ3Q7CismbHQ7L3Jvb3QtdGFnJmd0OzwvcHJlPgogCiA8aDU+ZGVmYXVsdCBsb2FkaW5nPC9oNT4KLTxwPlRoaXMgZW50cnkgaW4gYSBidWlsZCBmaWxlOgotPHByZT4gICAmbHQ7eG1scHJvcGVydHkgZmlsZT0ic29tZWZpbGUueG1sIi8mZ3Q7PC9wcmU+Ci1pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKzxwPlRoaXMgZW50cnkgaW4gYSBidWlsZCBmaWxlOjwvcD4KKzxwcmU+Jmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIvJmd0OzwvcHJlPgorPHA+aXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgogPHByZT4KLSAgIHJvb3QtdGFnKG15YXR0cik9dHJ1ZQotICAgcm9vdC10YWcuaW5uZXItdGFnPVRleHQKLSAgIHJvb3QtdGFnLmlubmVyLXRhZyhzb21lYXR0cik9dmFsCi0gICByb290LXRhZy5hMi5hMy5hND1mYWxzZQotPC9wcmU+Cityb290LXRhZyhteWF0dHIpPXRydWUKK3Jvb3QtdGFnLmlubmVyLXRhZz1UZXh0Cityb290LXRhZy5pbm5lci10YWcoc29tZWF0dHIpPXZhbAorcm9vdC10YWcuYTIuYTMuYTQ9ZmFsc2U8L3ByZT4KIAotPGg1PmNvbGxhcHNlQXR0cmlidXRlcz1mYWxzZTwvaDU+Ci08cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZToKLTxwcmU+ICAgJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIgY29sbGFwc2VBdHRyaWJ1dGVzPSJ0cnVlIi8mZ3Q7PC9wcmU+Ci1pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKzxoNT48dmFyPmNvbGxhcHNlQXR0cmlidXRlczwvdmFyPj08cT5mYWxzZTwvcT48L2g1PgorPHA+VGhpcyBlbnRyeSBpbiBhIGJ1aWxkIGZpbGU6PC9wPgorPHByZT4mbHQ7eG1scHJvcGVydHkgZmlsZT0ic29tZWZpbGUueG1sIiBjb2xsYXBzZUF0dHJpYnV0ZXM9InRydWUiLyZndDs8L3ByZT4KKzxwPmlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOjwvcD4KIDxwcmU+Ci0gICByb290LXRhZy5teWF0dHI9dHJ1ZQotICAgcm9vdC10YWcuaW5uZXItdGFnPVRleHQKLSAgIHJvb3QtdGFnLmlubmVyLXRhZy5zb21lYXR0PXZhbAotICAgcm9vdC10YWcuYTIuYTMuYTQ9ZmFsc2UKLTwvcHJlPgorcm9vdC10YWcubXlhdHRyPXRydWUKK3Jvb3QtdGFnLmlubmVyLXRhZz1UZXh0Cityb290LXRhZy5pbm5lci10YWcuc29tZWF0dD12YWwKK3Jvb3QtdGFnLmEyLmEzLmE0PWZhbHNlPC9wcmU+CiAKLTxoNT5rZWVwUm9vdD1mYWxzZTwvaDU+Ci08cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZToKLTxwcmU+ICAgJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIga2VlcFJvb3Q9ImZhbHNlIi8mZ3Q7PC9wcmU+Ci1pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKzxoNT48dmFyPmtlZXBSb290PC92YXI+PTxxPmZhbHNlPC9xPjwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZTo8L3A+Cis8cHJlPiZsdDt4bWxwcm9wZXJ0eSBmaWxlPSJzb21lZmlsZS54bWwiIGtlZXBSb290PSJmYWxzZSIvJmd0OzwvcHJlPgorPHA+aXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6PC9wPgogPHByZT4KLSAgIGlubmVyLXRhZz1UZXh0Ci0gICBpbm5lci10YWcoc29tZWF0dHIpPXZhbAotICAgYTIuYTMuYTQ9ZmFsc2UKLTwvcHJlPgoraW5uZXItdGFnPVRleHQKK2lubmVyLXRhZyhzb21lYXR0cik9dmFsCithMi5hMy5hND1mYWxzZTwvcHJlPgogCi08aDQ+U2VtYW50aWMgQXR0cmlidXRlczwvaDQ+Cis8aDQ+U2VtYW50aWMgYXR0cmlidXRlczwvaDQ+CiAKLTxwPkhlcmUgaXMgYW4gZXhhbXBsZSB4bWwgZmlsZSB0aGF0IGhhcyBzZW1hbnRpYyBhdHRyaWJ1dGVzLjwvcD4KKzxwPkhlcmUgaXMgYW4gZXhhbXBsZSBYTUwgZmlsZSB0aGF0IGhhcyBzZW1hbnRpYyBhdHRyaWJ1dGVzLjwvcD4KIDxwcmU+Ci0gICZsdDtyb290LXRhZyZndDsKLSAgICAmbHQ7dmVyc2lvbiB2YWx1ZT0iMC4wLjEiLyZndDsKLSAgICAmbHQ7YnVpbGQgZm9sZGVyPSJidWlsZCImZ3Q7Ci0gICAgICAmbHQ7Y2xhc3NlcyBpZD0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGQuZm9sZGVyfS9jbGFzc2VzIi8mZ3Q7Ci0gICAgICAmbHQ7cmVmZXJlbmNlIHJlZmlkPSJidWlsZC5jbGFzc2VzIi8mZ3Q7Ci0gICAgJmx0Oy9idWlsZCZndDsKLSAgICAmbHQ7Y29tcGlsZSZndDsKLSAgICAgICZsdDtjbGFzc3BhdGggcGF0aGlkPSJjb21waWxlLmNsYXNzcGF0aCImZ3Q7Ci0gICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvJmd0OwotICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgJmx0Oy9jb21waWxlJmd0OwotICAgICZsdDtydW4tdGltZSZndDsKLSAgICAgICZsdDtqYXJzJmd0OyouamFyJmx0Oy9qYXJzJmd0OwotICAgICAgJmx0O2NsYXNzcGF0aCBwYXRoaWQ9InJ1bi10aW1lLmNsYXNzcGF0aCImZ3Q7Ci0gICAgICAgICZsdDtwYXRoIHJlZmlkPSJjb21waWxlLmNsYXNzcGF0aCIvJmd0OwotICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0iJHtydW4tdGltZS5qYXJzfSIvJmd0OwotICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAgJmx0Oy9ydW4tdGltZSZndDsKLSAgJmx0Oy9yb290LXRhZyZndDsKLTwvcHJlPgorJmx0O3Jvb3QtdGFnJmd0OworICAmbHQ7dmVyc2lvbiB2YWx1ZT0iMC4wLjEiLyZndDsKKyAgJmx0O2J1aWxkIGZvbGRlcj0iYnVpbGQiJmd0OworICAgICZsdDtjbGFzc2VzIGlkPSJidWlsZC5jbGFzc2VzIiBsb2NhdGlvbj0iJHtidWlsZC5mb2xkZXJ9L2NsYXNzZXMiLyZndDsKKyAgICAmbHQ7cmVmZXJlbmNlIHJlZmlkPSJidWlsZC5jbGFzc2VzIi8mZ3Q7CisgICZsdDsvYnVpbGQmZ3Q7CisgICZsdDtjb21waWxlJmd0OworICAgICZsdDtjbGFzc3BhdGggcGF0aGlkPSJjb21waWxlLmNsYXNzcGF0aCImZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iLyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgJmx0Oy9jb21waWxlJmd0OworICAmbHQ7cnVuLXRpbWUmZ3Q7CisgICAgJmx0O2phcnMmZ3Q7Ki5qYXImbHQ7L2phcnMmZ3Q7CisgICAgJmx0O2NsYXNzcGF0aCBwYXRoaWQ9InJ1bi10aW1lLmNsYXNzcGF0aCImZ3Q7CisgICAgICAmbHQ7cGF0aCByZWZpZD0iY29tcGlsZS5jbGFzc3BhdGgiLyZndDsKKyAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke3J1bi10aW1lLmphcnN9Ii8mZ3Q7CisgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CisgICZsdDsvcnVuLXRpbWUmZ3Q7CismbHQ7L3Jvb3QtdGFnJmd0OzwvcHJlPgogCi08aDU+ZGVmYXVsdCBsb2FkaW5nIChzZW1hbnRpY0F0dHJpYnV0ZXM9dHJ1ZSk8L2g1PgotPHA+VGhpcyBlbnRyeSBpbiBhIGJ1aWxkIGZpbGU6Ci08cHJlPiAgICZsdDt4bWxwcm9wZXJ0eSBmaWxlPSJzb21lZmlsZS54bWwiIGtlZXBSb290PSJmYWxzZSIKLSAgICAgICAgICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXM9InRydWUiLyZndDs8L3ByZT4KLWlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBlbnRyaWVzIGluIGEgYnVpbGQgZmlsZToKKzxoNT5kZWZhdWx0IGxvYWRpbmcgKDx2YXI+c2VtYW50aWNBdHRyaWJ1dGVzPC92YXI+PTxxPnRydWU8L3E+KTwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZTo8L3A+CiA8cHJlPgotICAmbHQ7cHJvcGVydHkgbmFtZT0idmVyc2lvbiIgdmFsdWU9IjAuMC4xIi8mZ3Q7Ci0gICZsdDtwcm9wZXJ0eSBuYW1lPSJidWlsZC5mb2xkZXIiIHZhbHVlPSJidWlsZCIvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGQuZm9sZGVyfS9jbGFzc2VzIiBpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQucmVmZXJlbmNlIiByZWZpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OwotCi0gICZsdDtwcm9wZXJ0eSBuYW1lPSJydW4tdGltZS5qYXJzIiB2YWx1ZT0iKi5qYXIiLyZndDsKLQotICAmbHQ7cGF0aCBpZD0iY29tcGlsZS5jbGFzc3BhdGgiJmd0OwotICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvJmd0OwotICAmbHQ7L3BhdGgmZ3Q7Ci0KLSAgJmx0O3BhdGggaWQ9InJ1bi10aW1lLmNsYXNzcGF0aCImZ3Q7Ci0gICAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7Ci0gICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7cnVuLXRpbWUuamFyc30iLyZndDsKLSAgJmx0Oy9wYXRoJmd0OwotPC9wcmU+Ci0KLTxoNT5pbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU9InRydWUiPC9oNT4KLTxwPlRoaXMgZW50cnkgaW4gYSBidWlsZCBmaWxlOgotPHByZT4gICAmbHQ7eG1scHJvcGVydHkgZmlsZT0ic29tZWZpbGUueG1sIgotICAgICAgICAgICAgICAgIHNlbWFudGljQXR0cmlidXRlcz0idHJ1ZSIga2VlcFJvb3Q9ImZhbHNlIgotICAgICAgICAgICAgICAgIGluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZT0idHJ1ZSIvJmd0OwotPC9wcmU+Ci1pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZW50cmllcyBpbiBhIGJ1aWxkIGZpbGU6CismbHQ7eG1scHJvcGVydHkgZmlsZT0ic29tZWZpbGUueG1sIiBrZWVwUm9vdD0iZmFsc2UiCisgICAgICAgICAgICAgc2VtYW50aWNBdHRyaWJ1dGVzPSJ0cnVlIi8mZ3Q7PC9wcmU+Cis8cD5pcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgZW50cmllcyBpbiBhIGJ1aWxkIGZpbGU6PC9wPgogPHByZT4KLSAgJmx0O3Byb3BlcnR5IG5hbWU9InZlcnNpb24udmFsdWUiIHZhbHVlPSIwLjAuMSIvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuZm9sZGVyIiB2YWx1ZT0iYnVpbGQiLyZndDsKLSAgJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMubG9jYXRpb24iIGxvY2F0aW9uPSIke2J1aWxkLmZvbGRlcn0vY2xhc3NlcyIvJmd0OwotICAmbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQucmVmZXJlbmNlLnJlZmlkIiByZWZpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9InZlcnNpb24iIHZhbHVlPSIwLjAuMSIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmZvbGRlciIgdmFsdWU9ImJ1aWxkIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3NlcyIgbG9jYXRpb249IiR7YnVpbGQuZm9sZGVyfS9jbGFzc2VzIiBpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLnJlZmVyZW5jZSIgcmVmaWQ9ImJ1aWxkLmNsYXNzZXMiLyZndDsKIAotICAmbHQ7cHJvcGVydHkgbmFtZT0icnVuLXRpbWUuamFycyIgdmFsdWU9IiouamFyIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0icnVuLXRpbWUuamFycyIgdmFsdWU9IiouamFyIi8mZ3Q7CiAKLSAgJmx0O3BhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiZndDsKLSAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQuY2xhc3Nlc30iLyZndDsKLSAgJmx0Oy9wYXRoJmd0OworJmx0O3BhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIiZndDsKKyAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXN9Ii8mZ3Q7CismbHQ7L3BhdGgmZ3Q7CiAKLSAgJmx0O3BhdGggaWQ9InJ1bi10aW1lLmNsYXNzcGF0aCImZ3Q7Ci0gICAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7Ci0gICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9IiR7cnVuLXRpbWUuamFyc30iLyZndDsKLSAgJmx0Oy9wYXRoJmd0OwotPC9wcmU+CismbHQ7cGF0aCBpZD0icnVuLXRpbWUuY2xhc3NwYXRoIiZndDsKKyAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke3J1bi10aW1lLmphcnN9Ii8mZ3Q7CismbHQ7L3BhdGgmZ3Q7PC9wcmU+CiAKKzxoNT48dmFyPmluY2x1ZGVTZW1hbnRpY0F0dHJpYnV0ZTwvdmFyPj08cT50cnVlPC9xPjwvaDU+Cis8cD5UaGlzIGVudHJ5IGluIGEgYnVpbGQgZmlsZTo8L3A+Cis8cHJlPgorJmx0O3htbHByb3BlcnR5IGZpbGU9InNvbWVmaWxlLnhtbCIKKyAgICAgICAgICAgICBzZW1hbnRpY0F0dHJpYnV0ZXM9InRydWUiIGtlZXBSb290PSJmYWxzZSIKKyAgICAgICAgICAgICBpbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGU9InRydWUiLyZndDs8L3ByZT4KKzxwPmlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBlbnRyaWVzIGluIGEgYnVpbGQgZmlsZTo8L3A+Cis8cHJlPgorJmx0O3Byb3BlcnR5IG5hbWU9InZlcnNpb24udmFsdWUiIHZhbHVlPSIwLjAuMSIvJmd0OworJmx0O3Byb3BlcnR5IG5hbWU9ImJ1aWxkLmZvbGRlciIgdmFsdWU9ImJ1aWxkIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQuY2xhc3Nlcy5sb2NhdGlvbiIgbG9jYXRpb249IiR7YnVpbGQuZm9sZGVyfS9jbGFzc2VzIi8mZ3Q7CismbHQ7cHJvcGVydHkgbmFtZT0iYnVpbGQucmVmZXJlbmNlLnJlZmlkIiByZWZpZD0iYnVpbGQuY2xhc3NlcyIvJmd0OwogCismbHQ7cHJvcGVydHkgbmFtZT0icnVuLXRpbWUuamFycyIgdmFsdWU9IiouamFyIi8mZ3Q7CisKKyZsdDtwYXRoIGlkPSJjb21waWxlLmNsYXNzcGF0aCImZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzfSIvJmd0OworJmx0Oy9wYXRoJmd0OworCismbHQ7cGF0aCBpZD0icnVuLXRpbWUuY2xhc3NwYXRoIiZndDsKKyAgJmx0O3BhdGggcmVmaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIi8mZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBwYXRoPSIke3J1bi10aW1lLmphcnN9Ii8mZ3Q7CismbHQ7L3BhdGgmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy94bWx2YWxpZGF0ZS5odG1sIGIvbWFudWFsL1Rhc2tzL3htbHZhbGlkYXRlLmh0bWwKaW5kZXggYzM2MmJiZS4uOWY5MmEwYyAxMDA2NDQKLS0tIGEvbWFudWFsL1Rhc2tzL3htbHZhbGlkYXRlLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3htbHZhbGlkYXRlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw3ICsxNSw3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KQEAgLTIzLDI0MSArMjQsMjExIEBACiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ieG1sdmFsaWRhdGUiPlhNTFZhbGlkYXRlPC9hPjwvaDI+Cis8aDIgaWQ9InhtbHZhbGlkYXRlIj5YTUxWYWxpZGF0ZTwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogCi08cD5UaGlzIHRhc2sgY2hlY2tzIHRoYXQgWE1MIGZpbGVzIGFyZSB2YWxpZCAob3Igb25seSB3ZWxsIGZvcm1lZCkuIFRoZQotdGFzayB1c2VzIHRoZSBTQVgyIHBhcnNlciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKQVhQIGJ5IGRlZmF1bHQKLShwcm9iYWJseSB0aGUgb25lIHRoYXQgaXMgdXNlZCBieSBBcGFjaGUgQW50IGl0c2VsZiksIGJ1dCBvbmUgY2FuIHNwZWNpZnkgYW55Ci1TQVgxLzIgcGFyc2VyIGlmIG5lZWRlZC48L3A+Cis8cD5UaGlzIHRhc2sgY2hlY2tzIHRoYXQgWE1MIGZpbGVzIGFyZSB2YWxpZCAob3Igb25seSB3ZWxsIGZvcm1lZCkuIFRoZSB0YXNrIHVzZXMgdGhlIFNBWDIgcGFyc2VyCitpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKQVhQIGJ5IGRlZmF1bHQgKHByb2JhYmx5IHRoZSBvbmUgdGhhdCBpcyB1c2VkIGJ5IEFwYWNoZSBBbnQgaXRzZWxmKSwgYnV0CitvbmUgY2FuIHNwZWNpZnkgYW55IFNBWDEvMiBwYXJzZXIgaWYgbmVlZGVkLjwvcD4KIAotPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgbmVzdGVkCi0gIDxsaT48YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjx0dD4mbHQ7eG1sY2F0YWxvZyZndDs8L3R0PjwvYT4gZWxlbWVudHM8L2xpPgotICA8bGk+PHR0PiZsdDtkdGQmZ3Q7PC90dD4gZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gcmVzb2x2ZSBEVERzIGFuZCBlbnRpdGllczwvbGk+Ci0gIDxsaT48dHQ+Jmx0O2F0dHJpYnV0ZSZndDs8L3R0PiBlbGVtZW50cyB3aGljaCBhcmUgdXNlZCB0byBzZXQgZmVhdHVyZXMgb24gdGhlIHBhcnNlci4KLSAgICAgIFRoZXNlIGNhbiBiZSBhbnkgbnVtYmVyIG9mCi0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3LnNheHByb2plY3Qub3JnL2FwaWRvYy9vcmcveG1sL3NheC9wYWNrYWdlLXN1bW1hcnkuaHRtbCNwYWNrYWdlX2Rlc2NyaXB0aW9uIj48dHQ+aHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzLzwvdHQ+PC9hPgotICAgICAgb3Igb3RoZXIgZmVhdHVyZXMgdGhhdCB5b3VyIHBhcnNlciBtYXkgc3VwcG9ydC48L2xpPgotICA8bGk+PHR0PiZsdDtwcm9wZXJ0eSZndDs8L3R0PiBlbGVtZW50cywgY29udGFpbmluZyBzdHJpbmcgcHJvcGVydGllcwotPC9wPgorPHA+VGhpcyB0YXNrIHN1cHBvcnRzIHRoZSB1c2Ugb2YgbmVzdGVkPC9wPgorPHVsPgorICA8bGk+PGEgaHJlZj0iLi4vVHlwZXMveG1sY2F0YWxvZy5odG1sIj48Y29kZT4mbHQ7eG1sY2F0YWxvZyZndDs8L2NvZGU+PC9hPiBlbGVtZW50czwvbGk+CisgIDxsaT48Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gcmVzb2x2ZSBEVERzIGFuZCBlbnRpdGllczwvbGk+CisgIDxsaT48Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gZWxlbWVudHMgd2hpY2ggYXJlIHVzZWQgdG8gc2V0IGZlYXR1cmVzIG9uIHRoZSBwYXJzZXIuICBUaGVzZQorICAgIGNhbiBiZSBhbnkgbnVtYmVyCisgICAgb2YgPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKKyAgICB0YXJnZXQ9Il90b3AiPjxjb2RlPmh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy88L2NvZGU+PC9hPiBvciBvdGhlciBmZWF0dXJlcyB0aGF0IHlvdXIgcGFyc2VyCisgICAgbWF5IHN1cHBvcnQuPC9saT4KKyAgPGxpPjxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzLCBjb250YWluaW5nIHN0cmluZyBwcm9wZXJ0aWVzPC9saT4KKzwvdWw+CiAKLTxwPjxiPldhcm5pbmc8L2I+IDogSkFYUCBjcmVhdGVzIGJ5IGRlZmF1bHQgYSBub24gbmFtZXNwYWNlIGF3YXJlIHBhcnNlci4KLVRoZSA8dHQ+Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIjwvdHQ+IGZlYXR1cmUgaXMgc2V0Ci1ieSBkZWZhdWx0IHRvIDx0dD5mYWxzZTwvdHQ+IGJ5IHRoZSBKQVhQIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgYW50LiBUbyB2YWxpZGF0ZQotYSBkb2N1bWVudCBjb250YWluaW5nIG5hbWVzcGFjZXMsCi1zZXQgdGhlIG5hbWVzcGFjZXMgZmVhdHVyZSB0byA8dHQ+dHJ1ZTwvdHQ+IGV4cGxpY2l0bHkgYnkgbmVzdGluZyB0aGUgZm9sbG93aW5nIGVsZW1lbnQ6Ci08cHJlPgotICAmbHQ7YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiB2YWx1ZT0idHJ1ZSIvJmd0OwotPC9wcmU+Ci1JZiB5b3UgYXJlIHVzaW5nIGZvciBpbnN0YW5jZSBhIDx0dD54c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbjwvdHQ+IGF0dHJpYnV0ZSBpbiB5b3VyIFhNTCBmaWxlcywKLXlvdSB3aWxsIG5lZWQgdGhpcyBuYW1lc3BhY2Ugc3VwcG9ydCBmZWF0dXJlLgotPC9wPgotPHA+SWYgeW91IGFyZSB1c2luZyBhIHBhcnNlciBub3QgZ2VuZXJhdGVkIGJ5IEpBWFAsIGJ5IHVzaW5nIHRoZSA8dHQ+Y2xhc3NuYW1lPC90dD4gYXR0cmlidXRlIG9mIHhtbHZhbGlkYXRlLCB0aGlzIHdhcm5pbmcKLW1heSBub3QgYXBwbHkuPC9wPgotCis8cD48c3Ryb25nPldhcm5pbmc8L3N0cm9uZz46IEJ5IGRlZmF1bHQsIEpBWFAgY3JlYXRlcyBhIG5vbiBuYW1lc3BhY2UgYXdhcmUgcGFyc2VyLgorVGhlIDx2YXI+aHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXM8L3Zhcj4gZmVhdHVyZSBpcyBzZXQgYnkgZGVmYXVsdCB0byA8cT5mYWxzZTwvcT4gYnkKK3RoZSBKQVhQIGltcGxlbWVudGF0aW9uIHVzZWQgYnkgQW50LiBUbyB2YWxpZGF0ZSBhIGRvY3VtZW50IGNvbnRhaW5pbmcgbmFtZXNwYWNlcywgc2V0IHRoZQorbmFtZXNwYWNlcyBmZWF0dXJlIHRvIDxxPnRydWU8L3E+IGV4cGxpY2l0bHkgYnkgbmVzdGluZyB0aGUgZm9sbG93aW5nIGVsZW1lbnQ6PC9wPgorPHByZT4mbHQ7YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiB2YWx1ZT0idHJ1ZSIvJmd0OzwvcHJlPgorPHA+SWYgeW91IGFyZSB1c2luZyBmb3IgaW5zdGFuY2UgYSA8Y29kZT54c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbjwvY29kZT4gYXR0cmlidXRlIGluIHlvdXIgWE1MCitmaWxlcywgeW91IHdpbGwgbmVlZCB0aGlzIG5hbWVzcGFjZSBzdXBwb3J0IGZlYXR1cmUuPC9wPgorPHA+SWYgeW91IGFyZSB1c2luZyBhIHBhcnNlciBub3QgZ2VuZXJhdGVkIGJ5IEpBWFAsIGJ5IHVzaW5nIHRoZSA8dmFyPmNsYXNzbmFtZTwvdmFyPiBhdHRyaWJ1dGUKK29mIDxjb2RlPnhtbHZhbGlkYXRlPC9jb2RlPiwgdGhpcyB3YXJuaW5nIG1heSBub3QgYXBwbHkuPC9wPgogCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2suIChvcHRpb25hbGx5IGNhbiB1c2UgYW4gZW1iZWRkZWQgZmlsZXNldCk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+dGhlIGZpbGUocykgeW91IHdhbnQgdG8gY2hlY2suPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYW4gZW1iZWRkZWQgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sZW5pZW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgaWYgdHJ1ZSwgb25seSBjaGVjayB0aGUgWE1MIGRvY3VtZW50IGlzIHdlbGwgZm9ybWVkCi0gICAgICAgIChpZ25vcmVkIGlmIHRoZSBzcGVjaWZpZWQgcGFyc2VyIGlzIGEgU0FYMSBwYXJzZXIpCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bGVuaWVudDwvdGQ+CisgICAgPHRkPmlmIDxxPnRydWU8L3E+LCBvbmx5IGNoZWNrIHRoZSBYTUwgZG9jdW1lbnQgaXMgd2VsbCBmb3JtZWQgKGlnbm9yZWQgaWYgdGhlIHNwZWNpZmllZCBwYXJzZXIKKyAgICAgIGlzIGEgU0FYMSBwYXJzZXIpLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBwYXJzZXIgdG8gdXNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkPnRoZSBwYXJzZXIgdG8gdXNlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXJlIHRvIGZpbmQgdGhlIHBhcnNlciBjbGFzcy4gT3B0aW9uYWxseSBjYW4gdXNlIGFuIGVtYmVkZGVkIDx0dD4mbHQ7Y2xhc3NwYXRoJmd0OzwvdHQ+IGVsZW1lbnQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICA8dGQ+d2hlcmUgdG8gZmluZCB0aGUgcGFyc2VyIGNsYXNzLjwvdGQ+CisgICAgPHRkPk5vLCBjYW4gdXNlIGFuIGVtYmVkZGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbG9uZXJyb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmFpbHMgb24gYSBlcnJvciBpZiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdHMgdG8gdHJ1ZSkuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZmFpbG9uZXJyb3I8L3RkPgorICAgIDx0ZD5mYWlscyBvbiBhIGVycm9yIGlmIHNldCB0byA8cT50cnVlPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53YXJuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZyBwYXJzZXIgd2FybiBldmVudHMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+d2FybjwvdGQ+CisgICAgPHRkPmxvZyBwYXJzZXIgd2FybiBldmVudHMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPjxhIG5hbWU9Im5lc3RlZCI+TmVzdGVkIEVsZW1lbnRzPC9hPjwvaDM+Cis8aDMgaWQ9Im5lc3RlZCI+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5kdGQ8L2g0PgotPHA+Ci08dHQ+Jmx0O2R0ZCZndDs8L3R0PiBpcyB1c2VkIHRvIHNwZWNpZnkgZGlmZmVyZW50IGxvY2F0aW9ucyBmb3IgRFREIHJlc29sdXRpb24uCi08L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+Cis8cD48Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gaXMgdXNlZCB0byBzcGVjaWZ5IGRpZmZlcmVudCBsb2NhdGlvbnMgZm9yIERURCByZXNvbHV0aW9uLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnB1YmxpY0lkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlB1YmxpYyBJRCBvZiB0aGUgRFREIHRvIHJlc29sdmU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkxvY2F0aW9uIG9mIHRoZSBEVEQgdG8gdXNlLCB3aGljaCBjYW4gYmUgYSBmaWxlLAotICAgIGEgcmVzb3VyY2UsIG9yIGEgVVJMPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPnB1YmxpY0lkPC90ZD4KKyAgICA8dGQ+UHVibGljIElEIG9mIHRoZSBEVEQgdG8gcmVzb2x2ZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bG9jYXRpb248L3RkPgorICAgIDx0ZD5Mb2NhdGlvbiBvZiB0aGUgRFREIHRvIHVzZSwgd2hpY2ggY2FuIGJlIGEgZmlsZSwgYSByZXNvdXJjZSwgb3IgYSBVUkw8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxoND54bWxjYXRhbG9nPC9oND4KLTxwPlRoZSA8YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjx0dD4mbHQ7eG1sY2F0YWxvZyZndDs8L3R0PjwvYT4KLWVsZW1lbnQgaXMgdXNlZCB0byBwZXJmb3JtIGVudGl0eSByZXNvbHV0aW9uLjwvcD4KKzxwPlRoZSA8YSBocmVmPSIuLi9UeXBlcy94bWxjYXRhbG9nLmh0bWwiPjxjb2RlPiZsdDt4bWxjYXRhbG9nJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgaXMgdXNlZCB0bworcGVyZm9ybSBlbnRpdHkgcmVzb2x1dGlvbi48L3A+CiA8aDQ+YXR0cmlidXRlPC9oND4KLTxwPlRoZSA8dHQ+Jmx0O2F0dHJpYnV0ZSZndDs8L3R0PiBlbGVtZW50IGlzIHVzZWQgdG8gc2V0IHBhcnNlciBmZWF0dXJlcy48YnI+Ci1GZWF0dXJlcyB1c2FibGUgd2l0aCB0aGUgeGVyY2VzIHBhcnNlciBhcmUgZGVmaW5lZCBoZXJlIDoKLSA8YSBocmVmPSJodHRwOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovZmVhdHVyZXMuaHRtbCI+U2V0dGluZyBmZWF0dXJlczwvYT48YnI+Ci0KLVNBWCBmZWF0dXJlcyBhcmUgZGVmaW5lZCBoZXJlOgotIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iPjx0dD5odHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvPC90dD48L2E+PGJyPgotIDwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iMTIlIiB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iNzglIiB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgPHRkIHdpZHRoPSIxMCUiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotPC90cj4KKzxwPlRoZSA8Y29kZT4mbHQ7YXR0cmlidXRlJmd0OzwvY29kZT4gZWxlbWVudCBpcyB1c2VkIHRvIHNldCBwYXJzZXIgZmVhdHVyZXMuPC9wPgorPHA+RmVhdHVyZXMgdXNhYmxlIHdpdGggdGhlIFhlcmNlcyBwYXJzZXIgYXJlIGRlZmluZWQKK2hlcmU6IDxhIGhyZWY9Imh0dHBzOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovZmVhdHVyZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5TZXR0aW5nIEZlYXR1cmVzPC9hPjwvcD4KKzxwPlNBWCBmZWF0dXJlcyBhcmUgZGVmaW5lZAoraGVyZTogPGEgaHJlZj0iaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKK3RhcmdldD0iX3RvcCI+U0FYMiBTdGFuZGFyZCBGZWF0dXJlIEZsYWdzPC9hPjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGZlYXR1cmU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBib29sZWFuIHZhbHVlIG9mIHRoZSBmZWF0dXJlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgZmVhdHVyZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgZmVhdHVyZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPC9wPgogCiA8aDQ+cHJvcGVydHk8L2g0PgotPHA+VGhlIDx0dD4mbHQ7cHJvcGVydHkmZ3Q7PC90dD4gZWxlbWVudCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzLgotVGhlc2UgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBoZXJlIGZvciB0aGUgeGVyY2VzIFhNTCBwYXJzZXIgaW1wbGVtZW50YXRpb24gOgotIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9wcm9wZXJ0aWVzLmh0bWwiPlhNTCBQYXJzZXIgcHJvcGVydGllczwvYT4KLVByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzY2hlbWEgdXNlZCB0byB2YWxpZGF0ZSB0aGUgWE1MIGZpbGUuCi08L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLTwvdHI+Cis8cD5UaGUgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gZWxlbWVudCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzLiAgVGhlc2UgcHJvcGVydGllcyBhcmUKK2RlZmluZWQgaGVyZSBmb3IgdGhlIFhlcmNlcyBYTUwgcGFyc2VyCitpbXBsZW1lbnRhdGlvbjogPGEgaHJlZj0iaHR0cHM6Ly94bWwuYXBhY2hlLm9yZy94ZXJjZXMtai9wcm9wZXJ0aWVzLmh0bWwiIHRhcmdldD0iX3RvcCI+WE1MIFBhcnNlcgorcHJvcGVydGllczwvYT4uIFByb3BlcnRpZXMgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzY2hlbWEgdXNlZCB0byB2YWxpZGF0ZSB0aGUgWE1MIGZpbGUuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgZmVhdHVyZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvcGVydHk8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD52YWx1ZTwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08L3A+Ci0KIAogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+Ci0mbHQ7eG1sdmFsaWRhdGUgZmlsZT0idG90by54bWwiLyZndDsKLTwvcHJlPgotVmFsaWRhdGUgdG90by54bWwKKzxwPlZhbGlkYXRlIDxzYW1wPnRvdG8ueG1sPC9zYW1wPjwvcD4KKzxwcmU+Jmx0O3htbHZhbGlkYXRlIGZpbGU9InRvdG8ueG1sIi8mZ3Q7PC9wcmU+CisKKzxwPlZhbGlkYXRlIGFsbCA8c2FtcD4ueHNsPC9zYW1wPiBmaWxlcyBpbiA8c2FtcD5zcmMvc3R5bGU8L3NhbXA+LCBidXQgb25seSB3YXJuIGlmIHRoZXJlIGlzIGFuCitlcnJvciwgcmF0aGVyIHRoYW4gaGFsdCB0aGUgYnVpbGQuPC9wPgogPHByZT4KICZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iIGxlbmllbnQ9InllcyIgd2Fybj0ieWVzIgogICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIiJmd0OwogICAgICAgICAgICAgIGNsYXNzcGF0aD0ibGliL3hlcmNlcy5qYXIiJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9InN0eWxlLyoueHNsIi8mZ3Q7Ci0mbHQ7L3htbHZhbGlkYXRlJmd0OwotPC9wcmU+Ci1WYWxpZGF0ZSBhbGwgLnhzbCBmaWxlcyBpbiBzcmMvc3R5bGUsIGJ1dCBvbmx5IHdhcm4gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHJhdGhlciB0aGFuCi1oYWx0IHRoZSBidWlsZC4KLTxwcmU+CismbHQ7L3htbHZhbGlkYXRlJmd0OzwvcHJlPgogCis8cD5WYWxpZGF0ZSBhIHN0cnV0cyBjb25maWd1cmF0aW9uLCB1c2luZyBhIGxvY2FsIGNvcHkgb2YgdGhlIERURC48L3A+Cis8cHJlPgogJmx0O3htbHZhbGlkYXRlIGZpbGU9InN0cnV0cy1jb25maWcueG1sIiB3YXJuPSJmYWxzZSImZ3Q7CiAgICZsdDtkdGQgcHVibGljSWQ9Ii0vL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLy9EVEQgU3RydXRzIENvbmZpZ3VyYXRpb24gMS4wLy9FTiIKICAgICAgICBsb2NhdGlvbj0ic3RydXRzLWNvbmZpZ18xXzAuZHRkIi8mZ3Q7Ci0mbHQ7L3htbHZhbGlkYXRlJmd0OwotPC9wcmU+CismbHQ7L3htbHZhbGlkYXRlJmd0OzwvcHJlPgogCi1WYWxpZGF0ZSBhIHN0cnV0cyBjb25maWd1cmF0aW9uLCB1c2luZyBhIGxvY2FsIGNvcHkgb2YgdGhlIERURC4gCi08cHJlPiAKKzxwPlNjYW4gYWxsIFhNTCBmaWxlcyBpbiB0aGUgcHJvamVjdCwgdXNpbmcgYSBwcmVkZWZpbmVkIGNhdGFsb2cgdG8gbWFwIFVSSXMgdG8gbG9jYWwgZmlsZXMuPC9wPgorPHByZT4KICZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5kaXJ9IiBpbmNsdWRlcz0iKiovKi54bWwiLyZndDsKICAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9Im15Y2F0YWxvZyIvJmd0OwotJmx0Oy94bWx2YWxpZGF0ZSZndDsKLTwvcHJlPgorJmx0Oy94bWx2YWxpZGF0ZSZndDs8L3ByZT4KIAotU2NhbiBhbGwgWE1MIGZpbGVzIGluIHRoZSBwcm9qZWN0LCB1c2luZyBhIHByZWRlZmluZWQgY2F0YWxvZyB0byBtYXAgVVJJcyB0byBsb2NhbCBmaWxlcy4KKzxwPlNjYW4gYWxsIFhNTCBmaWxlcyBpbiB0aGUgcHJvamVjdCwgdXNpbmcgdGhlIGNhdGFsb2cgZGVmaW5lZCBpbmxpbmUuPC9wPgogPHByZT4KICZsdDt4bWx2YWxpZGF0ZSBmYWlsb25lcnJvcj0ibm8iJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5kaXJ9IiBpbmNsdWRlcz0iKiovKi54bWwiLyZndDsKICAgJmx0O3htbGNhdGFsb2cmZ3Q7Ci0gICAgICAgJmx0O2R0ZAotICAgICAgICAgcHVibGljSWQ9JnF1b3Q7LS8vQXJpZWxQYXJ0bmVycy8vRFREIFhNTCBBcnRpY2xlIFYxLjAvL0VOJnF1b3Q7CisgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9BcmllbFBhcnRuZXJzLy9EVEQgWE1MIEFydGljbGUgVjEuMC8vRU4mcXVvdDsKICAgICAgICAgIGxvY2F0aW9uPSZxdW90O2NvbS9hcmllbHBhcnRuZXJzL2tub3dsZWRnZWJhc2UvZHRkL2FydGljbGUuZHRkJnF1b3Q7LyZndDsKICAgJmx0Oy94bWxjYXRhbG9nJmd0OwotJmx0Oy94bWx2YWxpZGF0ZSZndDsKLTwvcHJlPgotU2NhbiBhbGwgWE1MIGZpbGVzIGluIHRoZSBwcm9qZWN0LCB1c2luZyB0aGUgY2F0YWxvZyBkZWZpbmVkIGlubGluZS4KKyZsdDsveG1sdmFsaWRhdGUmZ3Q7PC9wcmU+CiAKKzxwPlZhbGlkYXRlIGFsbCA8c2FtcD4ueG1sPC9zYW1wPiBmaWxlcyBpbiA8c2FtcD54bWw8L3NhbXA+IGRpcmVjdG9yeSB3aXRoIHRoZSBwYXJzZXIgY29uZmlndXJlZCB0bworcGVyZm9ybSBYU0QgdmFsaWRhdGlvbi4gTm90ZTogVGhlIHBhcnNlciBtdXN0IHN1cHBvcnQgdGhlCitmZWF0dXJlIDx2YXI+aHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hPC92YXI+LiBUaGUgPGEgaHJlZj0ic2NoZW1hdmFsaWRhdGUuaHRtbCI+c2NoZW1hdmFsaWRhdGU8L2E+Cit0YXNrIGlzIGJldHRlciBmb3IgdmFsaWRhdGluZyBXM0MgWE1MIFNjaGVtYXMsIGFzIGl0IGV4dGVuZHMgdGhpcyB0YXNrIHdpdGggdGhlIHJpZ2h0IG9wdGlvbnMKK2F1dG9tYXRpY2FsbHkgZW5hYmxlZCwgYW5kIG1ha2VzIGl0IGVhc3kgdG8gYWRkIGEgbGlzdCBvZiBzY2hlbWEgZmlsZXMvVVJMcyB0byBhY3QgYXMgc291cmNlcy48L3A+CiA8cHJlPgogJmx0O3htbHZhbGlkYXRlIGZhaWxvbmVycm9yPSJ5ZXMiIGxlbmllbnQ9Im5vIiB3YXJuPSJ5ZXMiJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9InhtbCIgaW5jbHVkZXM9IioqLyoueG1sIi8mZ3Q7CiAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iIHZhbHVlPSJ0cnVlIi8mZ3Q7CiAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiAgdmFsdWU9InRydWUiLyZndDsKICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIgdmFsdWU9InRydWUiLyZndDsKLSZsdDsveG1sdmFsaWRhdGUmZ3Q7Ci08L3ByZT4KLVZhbGlkYXRlIGFsbCAueG1sIGZpbGVzIGluIHhtbCBkaXJlY3Rvcnkgd2l0aCB0aGUgcGFyc2VyIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBYU0QgdmFsaWRhdGlvbi4KLU5vdGU6IFRoZSBwYXJzZXIgbXVzdCBzdXBwb3J0IHRoZSBmZWF0dXJlCi08Y29kZT5odHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWE8L2NvZGU+LgotVGhlIDxhIGhyZWY9InNjaGVtYXZhbGlkYXRlLmh0bWwiPnNjaGVtYXZhbGlkYXRlPC9hPiB0YXNrIGlzIGJldHRlciBmb3IgdmFsaWRhdGluZwotVzNDIFhNTCBTY2hlbWFzLCBhcyBpdCBleHRlbmRzIHRoaXMgdGFzayB3aXRoIHRoZSByaWdodCBvcHRpb25zIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwKLWFuZCBtYWtlcyBpdCBlYXN5IHRvIGFkZCBhIGxpc3Qgb2Ygc2NoZW1hIGZpbGVzL1VSTHMgdG8gYWN0IGFzIHNvdXJjZXMuCismbHQ7L3htbHZhbGlkYXRlJmd0OzwvcHJlPgogCis8cD5WYWxpZGF0ZSB0aGUgZmlsZSA8c2FtcD54bWwvZW5kcGllY2Utbm9TY2hlbWEueG1sPC9zYW1wPiBhZ2FpbnN0IHRoZQorc2NoZW1hIDxzYW1wPnhtbC9kb2MueHNkPC9zYW1wPi48L3A+CiA8cHJlPgotPCEtLSBDb252ZXJ0cyBwYXRoIHRvIFVSTCBmb3JtYXQgLS0+CismbHQ7IS0tIENvbnZlcnQgcGF0aCB0byBVUkwgZm9ybWF0IC0tJmd0OwogJmx0O3BhdGhjb252ZXJ0IGRpcnNlcD0iLyIgcHJvcGVydHk9InhzZC5maWxlIiZndDsKICZsdDtwYXRoJmd0OwogICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSJ4bWwvZG9jLnhzZCIvJmd0OwogJmx0Oy9wYXRoJmd0OwogJmx0Oy9wYXRoY29udmVydCZndDsKIAotJmx0O3htbHZhbGlkYXRlIGZpbGU9InhtbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwiIGxlbmllbnQ9ImZhbHNlIgotICBmYWlsb25lcnJvcj0idHJ1ZSIgd2Fybj0idHJ1ZSImZ3Q7Ci0gICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIgotICB2YWx1ZT0idHJ1ZSIvJmd0OworJmx0O3htbHZhbGlkYXRlIGZpbGU9InhtbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwiIGxlbmllbnQ9ImZhbHNlIiBmYWlsb25lcnJvcj0idHJ1ZSIgd2Fybj0idHJ1ZSImZ3Q7CisgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIiB2YWx1ZT0idHJ1ZSIvJmd0OwogICAmbHQ7YXR0cmlidXRlIG5hbWU9Imh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiB2YWx1ZT0idHJ1ZSIvJmd0OwotICAmbHQ7cHJvcGVydHkKLSAgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCi0gIHZhbHVlPSIke3hzZC5maWxlfSIvJmd0OwotJmx0Oy94bWx2YWxpZGF0ZSZndDsKLTwvcHJlPgotPGJyPgotVmFsaWRhdGUgdGhlIGZpbGUgeG1sL2VuZHBpZWNlLW5vU2NoZW1hLnhtbCBhZ2FpbnN0IHRoZSBzY2hlbWEgeG1sL2RvYy54c2QuCi08YnI+Ci0KLQorICAmbHQ7cHJvcGVydHkgbmFtZT0iaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLW5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iCisgICAgICAgICAgICB2YWx1ZT0iJHt4c2QuZmlsZX0iLyZndDsKKyZsdDsveG1sdmFsaWRhdGUmZ3Q7PC9wcmU+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UYXNrcy96aXAuaHRtbCBiL21hbnVhbC9UYXNrcy96aXAuaHRtbAppbmRleCA0ZDY2ODUxLi5kM2IxMTE1IDEwMDY0NAotLS0gYS9tYW51YWwvVGFza3MvemlwLmh0bWwKKysrIGIvbWFudWFsL1Rhc2tzL3ppcC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTM4ICsxNSw0NzMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlppcCBUYXNrPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJ6aXAiPlppcDwvYT48L2gyPgorPGgyIGlkPSJ6aXAiPlppcDwvaDI+CiA8aDM+RGVzY3JpcHRpb248L2gzPgogPHA+Q3JlYXRlcyBhIHppcGZpbGUuPC9wPgotPHA+VGhlIDxpPmJhc2VkaXI8L2k+IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHppcC48L3A+Cis8cD5UaGUgPHZhcj5iYXNlZGlyPC92YXI+IGF0dHJpYnV0ZSBpcyB0aGUgcmVmZXJlbmNlIGRpcmVjdG9yeSBmcm9tIHdoZXJlIHRvIHppcC48L3A+CiA8cD5Ob3RlIHRoYXQgZmlsZSBwZXJtaXNzaW9ucyB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHJlc3VsdGluZyB6aXBmaWxlLjwvcD4KLTxwPkl0IGlzIHBvc3NpYmxlIHRvIHJlZmluZSB0aGUgc2V0IG9mIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHppcHBlZC4gVGhpcyBjYW4gYmUKLWRvbmUgd2l0aCB0aGUgPGk+aW5jbHVkZXM8L2k+LCA8aT5pbmNsdWRlc2ZpbGU8L2k+LCA8aT5leGNsdWRlczwvaT4sIDxpPmV4Y2x1ZGVzZmlsZTwvaT4gYW5kIDxpPmRlZmF1bHRleGNsdWRlczwvaT4KLWF0dHJpYnV0ZXMuIFdpdGggdGhlIDxpPmluY2x1ZGVzPC9pPiBvciA8aT5pbmNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8KLWhhdmUgaW5jbHVkZWQgYnkgdXNpbmcgcGF0dGVybnMuIFRoZSA8aT5leGNsdWRlPC9pPiBvciA8aT5leGNsdWRlc2ZpbGU8L2k+IGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkKLXRoZSBmaWxlcyB5b3Ugd2FudCB0byBoYXZlIGV4Y2x1ZGVkLiBUaGlzIGlzIGFsc28gZG9uZSB3aXRoIHBhdHRlcm5zLiBBbmQKLWZpbmFsbHkgd2l0aCB0aGUgPGk+ZGVmYXVsdGV4Y2x1ZGVzPC9pPiBhdHRyaWJ1dGUsIHlvdSBjYW4gc3BlY2lmeSB3aGV0aGVyIHlvdQotd2FudCB0byB1c2UgZGVmYXVsdCBleGNsdXNpb25zIG9yIG5vdC4gU2VlIHRoZSBzZWN0aW9uIG9uIDxhCi1ocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RpcmVjdG9yeWJhc2VkdGFza3MiPmRpcmVjdG9yeSBiYXNlZCB0YXNrczwvYT4sIG9uIGhvdyB0aGUKLWluY2x1c2lvbi9leGNsdXNpb24gb2YgZmlsZXMgd29ya3MsIGFuZCBob3cgdG8gd3JpdGUgcGF0dGVybnMuIDwvcD4KLTxwPlRoaXMgdGFzayBmb3JtcyBhbiBpbXBsaWNpdCA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+IGFuZAotc3VwcG9ydHMgbW9zdCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4KLSg8Y29kZT5kaXI8L2NvZGU+IGJlY29tZXMgPGNvZGU+YmFzZWRpcjwvY29kZT4pIGFzIHdlbGwgYXMgdGhlIG5lc3RlZAotPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuPC9wPgotPHA+T3IsIHlvdSBtYXkgcGxhY2Ugd2l0aGluIGl0IG5lc3RlZCBmaWxlIHNldHMsIG9yIHJlZmVyZW5jZXMgdG8gZmlsZSBzZXRzLgotSW4gdGhpcyBjYXNlIDxjb2RlPmJhc2VkaXI8L2NvZGU+IGlzIG9wdGlvbmFsOyB0aGUgaW1wbGljaXQgZmlsZSBzZXQgaXMgPGk+b25seSB1c2VkPC9pPgotaWYgPGNvZGU+YmFzZWRpcjwvY29kZT4gaXMgc2V0LiBZb3UgbWF5IHVzZSBhbnkgbWl4dHVyZSBvZiB0aGUgaW1wbGljaXQgZmlsZSBzZXQKLSh3aXRoIDxjb2RlPmJhc2VkaXI8L2NvZGU+IHNldCwgYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgbGlrZSA8Y29kZT5pbmNsdWRlczwvY29kZT4KLWFuZCBvcHRpb25hbCBzdWJlbGVtZW50cyBsaWtlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4pOyBleHBsaWNpdCBuZXN0ZWQKLTxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMgc28gbG9uZyBhcyBhdCBsZWFzdCBvbmUgZmlsZXNldCB0b3RhbCBpcyBzcGVjaWZpZWQuIFRoZSBaSVAgZmlsZSB3aWxsCi1vbmx5IHJlZmxlY3QgdGhlIHJlbGF0aXZlIHBhdGhzIG9mIGZpbGVzIDxpPndpdGhpbjwvaT4gZWFjaCBmaWxlc2V0LiBUaGUgWmlwIHRhc2sgYW5kIGl0cyBkZXJpdmF0aXZlcyBrbm93IGEgc3BlY2lhbCBmb3JtIG9mIGEgZmlsZXNldCBuYW1lZCB6aXBmaWxlc2V0IHRoYXQgaGFzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoZGVzY3JpYmVkIGJlbG93KS4gPC9wPgotPHA+VGhlIFppcCB0YXNrIGFsc28gc3VwcG9ydHMgdGhlIG1lcmdpbmcgb2YgbXVsdGlwbGUgemlwIGZpbGVzIGludG8gdGhlIHppcCBmaWxlLiAKLVRoaXMgaXMgcG9zc2libGUgdGhyb3VnaCBlaXRoZXIgdGhlIDxpPnNyYzwvaT4gYXR0cmlidXRlIG9mIGFueSBuZXN0ZWQgZmlsZXNldHMgCi1vciBieSB1c2luZyB0aGUgc3BlY2lhbCBuZXN0ZWQgZmlsZXNldCA8aT56aXBncm91cGZpbGVzZXQ8L2k+LjwvcD4KIAotPHA+VGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4gcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyBpZiB0aGUgWklQCi1maWxlIGFscmVhZHkgZXhpc3RzLiBXaGVuIHNldCB0byA8Y29kZT55ZXM8L2NvZGU+LCB0aGUgWklQIGZpbGUgaXMKLXVwZGF0ZWQgd2l0aCB0aGUgZmlsZXMgc3BlY2lmaWVkLiAoTmV3IGZpbGVzIGFyZSBhZGRlZDsgb2xkIGZpbGVzIGFyZQotcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZlcnNpb25zLikgV2hlbiBzZXQgdG8gPGNvZGU+bm88L2NvZGU+ICh0aGUKLWRlZmF1bHQpIHRoZSBaSVAgZmlsZSBpcyBvdmVyd3JpdHRlbiBpZiBhbnkgb2YgdGhlIGZpbGVzIHRoYXQgd291bGQgYmUKLWFkZGVkIHRvIHRoZSBhcmNoaXZlIGFyZSBuZXdlciB0aGFuIHRoZSBlbnRyaWVzIGluc2lkZSB0aGUgYXJjaGl2ZS4KLVBsZWFzZSBub3RlIHRoYXQgWklQIGZpbGVzIHN0b3JlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpdGggYQotZ3JhbnVsYXJpdHkgb2YgdHdvIHNlY29uZHMuICBJZiBhIGZpbGUgaXMgbGVzcyB0aGFuIHR3byBzZWNvbmRzIG5ld2VyCi10aGFuIHRoZSBlbnRyeSBpbiB0aGUgYXJjaGl2ZSwgQXBhY2hlIEFudCB3aWxsIG5vdCBjb25zaWRlciBpdCBuZXdlci48L3A+Cis8cD5JdCBpcyBwb3NzaWJsZSB0byByZWZpbmUgdGhlIHNldCBvZiBmaWxlcyB0aGF0IGFyZSBiZWluZyB6aXBwZWQuIFRoaXMgY2FuIGJlIGRvbmUgd2l0aAordGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4sIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+LCA8dmFyPmV4Y2x1ZGVzPC92YXI+LCA8dmFyPmV4Y2x1ZGVzZmlsZTwvdmFyPgorYW5kIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZXMuIFdpdGggdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4gb3IgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4KK2F0dHJpYnV0ZSB5b3Ugc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBpbmNsdWRlZCBieSB1c2luZyBwYXR0ZXJucy4gVGhlIDx2YXI+ZXhjbHVkZTwvdmFyPgorb3IgPHZhcj5leGNsdWRlc2ZpbGU8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgeW91IHdhbnQgdG8gaGF2ZSBleGNsdWRlZC4gVGhpcyBpcworYWxzbyBkb25lIHdpdGggcGF0dGVybnMuIEFuZCBmaW5hbGx5IHdpdGggdGhlIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGF0dHJpYnV0ZSwgeW91IGNhbiBzcGVjaWZ5Cit3aGV0aGVyIHlvdSB3YW50IHRvIHVzZSBkZWZhdWx0IGV4Y2x1c2lvbnMgb3Igbm90LiBTZWUgdGhlIHNlY3Rpb24KK29uIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGlyZWN0b3J5YmFzZWR0YXNrcyI+ZGlyZWN0b3J5IGJhc2VkIHRhc2tzPC9hPiwgb24gaG93IHRoZQoraW5jbHVzaW9uL2V4Y2x1c2lvbiBvZiBmaWxlcyB3b3JrcywgYW5kIGhvdyB0byB3cml0ZSBwYXR0ZXJucy48L3A+CiAKLTxwPlRoZSA8Y29kZT53aGVuZW1wdHk8L2NvZGU+IHBhcmFtZXRlciBjb250cm9scyB3aGF0IGhhcHBlbnMgd2hlbiBubyBmaWxlcyBtYXRjaC4KLUlmIDxjb2RlPnNraXA8L2NvZGU+ICh0aGUgZGVmYXVsdCksIHRoZSBaSVAgaXMgbm90IGNyZWF0ZWQgYW5kIGEgd2FybmluZyBpcyBpc3N1ZWQuCi1JZiA8Y29kZT5mYWlsPC9jb2RlPiwgdGhlIFpJUCBpcyBub3QgY3JlYXRlZCBhbmQgdGhlIGJ1aWxkIGlzIGhhbHRlZCB3aXRoIGFuIGVycm9yLgotSWYgPGNvZGU+Y3JlYXRlPC9jb2RlPiwgYW4gZW1wdHkgWklQIGZpbGUgKGV4cGxpY2l0bHkgemVybyBlbnRyaWVzKSBpcyBjcmVhdGVkLAotd2hpY2ggc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgc3VjaCBieSBjb21wbGlhbnQgWklQIG1hbmlwdWxhdGlvbiB0b29scy48L3A+Ci08cD5UaGlzIHRhc2sgd2lsbCBub3cgdXNlIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nCi1mb3IgZmlsZW5hbWVzIC0gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGNvbW1hbmQgbGluZSBaSVAgdG9vbHMsCi1idXQgY2F1c2VzIHByb2JsZW1zIGlmIHlvdSB0cnkgdG8gb3BlbiB0aGVtIGZyb20gd2l0aGluIEphdmEgYW5kIHlvdXIKLWZpbGVuYW1lcyBjb250YWluIG5vbiBVUy1BU0NJSSBjaGFyYWN0ZXJzLiBVc2UgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZQotYW5kIHNldCBpdCB0byBVVEY4IHRvIGNyZWF0ZSB6aXAgZmlsZXMgdGhhdCBjYW4gc2FmZWx5IGJlIHJlYWQgYnkKLUphdmEuICBGb3IgYSBtb3JlIGNvbXBsZXRlIGRpc2N1c3Npb24sCis8cD5UaGlzIHRhc2sgZm9ybXMgYW4gaW1wbGljaXQgPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPiBhbmQgc3VwcG9ydHMgbW9zdAorYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+ICg8dmFyPmRpcjwvdmFyPiBiZWNvbWVzIDx2YXI+YmFzZWRpcjwvdmFyPikgYXMgd2VsbCBhcwordGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+CisKKzxwPk9yLCB5b3UgbWF5IHBsYWNlIHdpdGhpbiBpdCBuZXN0ZWQgZmlsZSBzZXRzLCBvciByZWZlcmVuY2VzIHRvIGZpbGUgc2V0cy4gIEluIHRoaXMKK2Nhc2UgPHZhcj5iYXNlZGlyPC92YXI+IGlzIG9wdGlvbmFsOyB0aGUgaW1wbGljaXQgZmlsZSBzZXQgaXMgPGVtPm9ubHkgdXNlZDwvZW0+CitpZiA8dmFyPmJhc2VkaXI8L3Zhcj4gaXMgc2V0LiBZb3UgbWF5IHVzZSBhbnkgbWl4dHVyZSBvZiB0aGUgaW1wbGljaXQgZmlsZSBzZXQKKyh3aXRoIDx2YXI+YmFzZWRpcjwvdmFyPiBzZXQsIGFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIGxpa2UgPHZhcj5pbmNsdWRlczwvdmFyPiBhbmQgb3B0aW9uYWwKK3N1YmVsZW1lbnRzIGxpa2UgPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPik7IGV4cGxpY2l0IG5lc3RlZCA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+CitlbGVtZW50cyBzbyBsb25nIGFzIGF0IGxlYXN0IG9uZSBmaWxlc2V0IHRvdGFsIGlzIHNwZWNpZmllZC4gVGhlIFpJUCBmaWxlIHdpbGwgb25seSByZWZsZWN0IHRoZQorcmVsYXRpdmUgcGF0aHMgb2YgZmlsZXMgPGVtPndpdGhpbjwvZW0+IGVhY2ggZmlsZXNldC4gVGhlIFppcCB0YXNrIGFuZCBpdHMgZGVyaXZhdGl2ZXMga25vdyBhCitzcGVjaWFsIGZvcm0gb2YgYSBmaWxlc2V0IG5hbWVkIDxjb2RlPnppcGZpbGVzZXQ8L2NvZGU+IHRoYXQgaGFzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAoZGVzY3JpYmVkCitiZWxvdykuPC9wPgorCis8cD5UaGUgWmlwIHRhc2sgYWxzbyBzdXBwb3J0cyB0aGUgbWVyZ2luZyBvZiBtdWx0aXBsZSB6aXAgZmlsZXMgaW50byB0aGUgemlwIGZpbGUuICBUaGlzIGlzIHBvc3NpYmxlCit0aHJvdWdoIGVpdGhlciB0aGUgPHZhcj5zcmM8L3Zhcj4gYXR0cmlidXRlIG9mIGFueSBuZXN0ZWQgZmlsZXNldHMgb3IgYnkgdXNpbmcgdGhlIHNwZWNpYWwgbmVzdGVkCitmaWxlc2V0IDxjb2RlPnppcGdyb3VwZmlsZXNldDwvY29kZT4uPC9wPgorCis8cD5UaGUgPHZhcj51cGRhdGU8L3Zhcj4gcGFyYW1ldGVyIGNvbnRyb2xzIHdoYXQgaGFwcGVucyBpZiB0aGUgWklQIGZpbGUgYWxyZWFkeSBleGlzdHMuIFdoZW4gc2V0Cit0byA8cT55ZXM8L3E+LCB0aGUgWklQIGZpbGUgaXMgdXBkYXRlZCB3aXRoIHRoZSBmaWxlcyBzcGVjaWZpZWQuIChOZXcgZmlsZXMgYXJlIGFkZGVkOyBvbGQgZmlsZXMgYXJlCityZXBsYWNlZCB3aXRoIHRoZSBuZXcgdmVyc2lvbnMuKSBXaGVuIHNldCB0byA8cT5ubzwvcT4gKHRoZSBkZWZhdWx0KSB0aGUgWklQIGZpbGUgaXMgb3ZlcndyaXR0ZW4gaWYKK2FueSBvZiB0aGUgZmlsZXMgdGhhdCB3b3VsZCBiZSBhZGRlZCB0byB0aGUgYXJjaGl2ZSBhcmUgbmV3ZXIgdGhhbiB0aGUgZW50cmllcyBpbnNpZGUgdGhlIGFyY2hpdmUuCitQbGVhc2Ugbm90ZSB0aGF0IFpJUCBmaWxlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YgMiBzZWNvbmRzLiAgSWYgYSBmaWxlCitpcyBsZXNzIHRoYW4gMiBzZWNvbmRzIG5ld2VyIHRoYW4gdGhlIGVudHJ5IGluIHRoZSBhcmNoaXZlLCBBcGFjaGUgQW50IHdpbGwgbm90IGNvbnNpZGVyIGl0CituZXdlci48L3A+CisKKzxwPlRoZSA8dmFyPndoZW5lbXB0eTwvdmFyPiBwYXJhbWV0ZXIgY29udHJvbHMgd2hhdCBoYXBwZW5zIHdoZW4gbm8gZmlsZXMgbWF0Y2guICBJZiA8cT5za2lwPC9xPgorKHRoZSBkZWZhdWx0KSwgdGhlIFpJUCBpcyBub3QgY3JlYXRlZCBhbmQgYSB3YXJuaW5nIGlzIGlzc3VlZC4gIElmIDxxPmZhaWw8L3E+LCB0aGUgWklQIGlzIG5vdAorY3JlYXRlZCBhbmQgdGhlIGJ1aWxkIGlzIGhhbHRlZCB3aXRoIGFuIGVycm9yLiAgSWYgPHE+Y3JlYXRlPC9xPiwgYW4gZW1wdHkgWklQIGZpbGUgKGV4cGxpY2l0bHkgemVybworZW50cmllcykgaXMgY3JlYXRlZCwgd2hpY2ggc2hvdWxkIGJlIHJlY29nbml6ZWQgYXMgc3VjaCBieSBjb21wbGlhbnQgWklQIG1hbmlwdWxhdGlvbiB0b29scy48L3A+CisKKzxwPlRoaXMgdGFzayB3aWxsIG5vdyB1c2UgZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nIGZvciBmaWxlbmFtZXMmbWRhc2g7dGhpcyBpcyBjb25zaXN0ZW50IHdpdGgKK3RoZSBjb21tYW5kIGxpbmUgWklQIHRvb2xzLCBidXQgY2F1c2VzIHByb2JsZW1zIGlmIHlvdSB0cnkgdG8gb3BlbiB0aGVtIGZyb20gd2l0aGluIEphdmEgYW5kIHlvdXIKK2ZpbGVuYW1lcyBjb250YWluIG5vbiBVUy1BU0NJSSBjaGFyYWN0ZXJzLiBVc2UgdGhlIDx2YXI+ZW5jb2Rpbmc8L3Zhcj4gYXR0cmlidXRlIGFuZCBzZXQgaXQKK3RvIDxxPlVURjg8L3E+IHRvIGNyZWF0ZSB6aXAgZmlsZXMgdGhhdCBjYW4gc2FmZWx5IGJlIHJlYWQgYnkgSmF2YS4gIEZvciBhIG1vcmUgY29tcGxldGUgZGlzY3Vzc2lvbiwKIHNlZSA8YSBocmVmPSIjZW5jb2RpbmciPmJlbG93PC9hPjwvcD4KIAotPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS41LjIsIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiBjYW4gc3RvcmUgVW5peCBwZXJtaXNzaW9ucwotaW5zaWRlIHRoZSBhcmNoaXZlIChzZWUgZGVzY3JpcHRpb24gb2YgdGhlIGZpbGVtb2RlIGFuZCBkaXJtb2RlCi1hdHRyaWJ1dGVzIGZvciA8YSBocmVmPSIuLi9UeXBlcy96aXBmaWxlc2V0Lmh0bWwiPiZsdDt6aXBmaWxlc2V0Jmd0OzwvYT4pLgotVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBwb3J0YWJsZSB3YXkgdG8gc3RvcmUgdGhlc2UgcGVybWlzc2lvbnMuCi1BbnQgdXNlcyB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvLXppcC5vcmciPkluZm8tWmlwJ3M8L2E+Ci1pbXBsZW1lbnRhdGlvbiBvZiB0aGUgemlwIGFuZCB1bnppcCBjb21tYW5kcyAtIHRoZXNlIGFyZSB0aGUgZGVmYXVsdAotdmVyc2lvbnMgb2YgemlwIGFuZCB1bnppcCBmb3IgbWFueSBVbml4IGFuZCBVbml4LWxpa2Ugc3lzdGVtcy48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNS4yPC9lbT4sIDxjb2RlPiZsdDt6aXAmZ3Q7PC9jb2RlPiBjYW4gc3RvcmUgVW5peCBwZXJtaXNzaW9ucyBpbnNpZGUgdGhlIGFyY2hpdmUKKyhzZWUgZGVzY3JpcHRpb24gb2YgdGhlIDx2YXI+ZmlsZW1vZGU8L3Zhcj4gYW5kIDx2YXI+ZGlybW9kZTwvdmFyPiBhdHRyaWJ1dGVzCitmb3IgPGEgaHJlZj0iLi4vVHlwZXMvemlwZmlsZXNldC5odG1sIj4mbHQ7emlwZmlsZXNldCZndDs8L2E+KS4gIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gcG9ydGFibGUKK3dheSB0byBzdG9yZSB0aGVzZSBwZXJtaXNzaW9ucy4gIEFudCB1c2VzIHRoZSBhbGdvcml0aG0gdXNlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmluZm8temlwLm9yZyIKK3RhcmdldD0iX3RvcCI+SW5mby1aaXAnczwvYT4gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxrYmQ+emlwPC9rYmQ+IGFuZCA8a2JkPnVuemlwPC9rYmQ+Citjb21tYW5kcyZtZGFzaDt0aGVzZSBhcmUgdGhlIGRlZmF1bHQgdmVyc2lvbnMgb2YgPGtiZD56aXA8L2tiZD4gYW5kIDxrYmQ+dW56aXA8L2tiZD4gZm9yIG1hbnkKK1VuaXgoLWxpa2UpIHN5c3RlbXMuPC9wPgogCi08cD48Yj5QbGVhc2Ugbm90ZSB0aGF0IHRoZSB6aXAgZm9ybWF0IGFsbG93cyBtdWx0aXBsZSBmaWxlcyBvZiB0aGUgc2FtZQotZnVsbHktcXVhbGlmaWVkIG5hbWUgdG8gZXhpc3Qgd2l0aGluIGEgc2luZ2xlIGFyY2hpdmUuICBUaGlzIGhhcyBiZWVuCi1kb2N1bWVudGVkIGFzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcyBmb3IgdW5zdXNwZWN0aW5nIHVzZXJzLiAgSWYgeW91IHdpc2gKLXRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgeW91IG11c3Qgc2V0IHRoZSA8Y29kZT5kdXBsaWNhdGU8L2NvZGU+IGF0dHJpYnV0ZQotdG8gYSB2YWx1ZSBvdGhlciB0aGFuIGl0cyBkZWZhdWx0LCA8Y29kZT4mcXVvdDthZGQmcXVvdDs8L2NvZGU+LjwvYj48L3A+Cis8cD48c3Ryb25nPlBsZWFzZSBub3RlIHRoYXQgdGhlIHppcCBmb3JtYXQgYWxsb3dzIG11bHRpcGxlIGZpbGVzIG9mIHRoZSBzYW1lIGZ1bGx5LXF1YWxpZmllZCBuYW1lIHRvCitleGlzdCB3aXRoaW4gYSBzaW5nbGUgYXJjaGl2ZS4gIFRoaXMgaGFzIGJlZW4gZG9jdW1lbnRlZCBhcyBjYXVzaW5nIHZhcmlvdXMgcHJvYmxlbXMgZm9yCit1bnN1c3BlY3RpbmcgdXNlcnMuICBJZiB5b3Ugd2lzaCB0byBhdm9pZCB0aGlzIGJlaGF2aW9yIHlvdSBtdXN0IHNldCB0aGUgPHZhcj5kdXBsaWNhdGU8L3Zhcj4KK2F0dHJpYnV0ZSB0byBhIHZhbHVlIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQsIDxxPmFkZDwvcT4uPC9zdHJvbmc+PC9wPgogCi08cD48Yj5QbGVhc2UgYWxzbyBub3RlPC9iPiB0aGF0IGRpZmZlcmVudCBaSVAgdG9vbHMgaGFuZGxlIHRpbWVzdGFtcHMKLWRpZmZlcmVudGx5IHdoZW4gaXQgY29tZXMgdG8gYXBwbHlpbmcgdGltZXpvbmUgb2Zmc2V0IGNhbGN1bGF0aW9ucyBvZgotZmlsZXMuICBTb21lIFpJUCBsaWJyYXJpZXMgd2lsbCBzdG9yZSB0aGUgdGltZXN0YW1wcyBhcyB0aGV5J3ZlIGJlZW4KLXJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbSB3aGlsZSBvdGhlcnMgd2lsbCBtb2RpZnkgdGhlIHRpbWVzdGFtcHMgYm90aAotd2hlbiByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBmaWxlcyB0byBtYWtlIGFsbCB0aW1lc3RhbXBzIHVzZSB0aGUgc2FtZQotdGltZXpvbmUuICBBIFpJUCBhcmNoaXZlIGNyZWF0ZWQgYnkgb25lIGxpYnJhcnkgbWF5IGV4dHJhY3QgZmlsZXMgd2l0aAotIndyb25nIHRpbWVzdGFtcHMiIHdoZW4gZXh0cmFjdGVkIGJ5IGFub3RoZXIgbGlicmFyeS48L3A+Cis8cD48c3Ryb25nPlBsZWFzZSBhbHNvIG5vdGU8L3N0cm9uZz4gdGhhdCBkaWZmZXJlbnQgWklQIHRvb2xzIGhhbmRsZSB0aW1lc3RhbXBzIGRpZmZlcmVudGx5IHdoZW4gaXQKK2NvbWVzIHRvIGFwcGx5aW5nIHRpbWV6b25lIG9mZnNldCBjYWxjdWxhdGlvbnMgb2YgZmlsZXMuICBTb21lIFpJUCBsaWJyYXJpZXMgd2lsbCBzdG9yZSB0aGUKK3RpbWVzdGFtcHMgYXMgdGhleSd2ZSBiZWVuIHJlYWQgZnJvbSB0aGUgZmlsZXN5c3RlbSB3aGlsZSBvdGhlcnMgd2lsbCBtb2RpZnkgdGhlIHRpbWVzdGFtcHMgYm90aAord2hlbiByZWFkaW5nIGFuZCB3cml0aW5nIHRoZSBmaWxlcyB0byBtYWtlIGFsbCB0aW1lc3RhbXBzIHVzZSB0aGUgc2FtZSB0aW1lem9uZS4gIEEgWklQIGFyY2hpdmUKK2NyZWF0ZWQgYnkgb25lIGxpYnJhcnkgbWF5IGV4dHJhY3QgZmlsZXMgd2l0aCAid3JvbmcgdGltZXN0YW1wcyIgd2hlbiBleHRyYWN0ZWQgYnkgYW5vdGhlcgorbGlicmFyeS48L3A+CiAKLTxwPkFudCdzIFpJUCBjbGFzc2VzIHVzZSB0aGUgc2FtZSBhbGdvcml0aG0gYXMgdGhlIEluZm9aSVAgdG9vbHMgYW5kCi16bGliICh0aW1lc3RhbXBzIGdldCBhZGp1c3RlZCksIFdpbmRvd3MnICJjb21wcmVzc2VkIGZvbGRlcnMiIGZ1bmN0aW9uCi1hbmQgV2luWklQIGRvbid0IGNoYW5nZSB0aGUgdGltZXN0YW1wcy4gIFRoaXMgbWVhbnMgdGhhdCB1c2luZyB0aGUKLXVuemlwIHRhc2sgb24gZmlsZXMgY3JlYXRlZCBieSBXaW5kb3dzJyBjb21wcmVzc2VkIGZvbGRlcnMgZnVuY3Rpb24KLW1heSBjcmVhdGUgZmlsZXMgd2l0aCB0aW1lc3RhbXBzIHRoYXQgYXJlICJ3cm9uZyIsIHRoZSBzYW1lIGlzIHRydWUgaWYKLXlvdSB1c2UgV2luZG93cycgZnVuY3Rpb25zIHRvIGV4dHJhY3QgYW4gQW50IGdlbmVyYXRlZCBaSVAKLWFyY2hpdmUuPC9wPgorPHA+QW50J3MgWklQIGNsYXNzZXMgdXNlIHRoZSBzYW1lIGFsZ29yaXRobSBhcyB0aGUgSW5mb1pJUCB0b29scyBhbmQgemxpYiAodGltZXN0YW1wcyBnZXQgYWRqdXN0ZWQpLAorV2luZG93cycgImNvbXByZXNzZWQgZm9sZGVycyIgZnVuY3Rpb24gYW5kIFdpblpJUCBkb24ndCBjaGFuZ2UgdGhlIHRpbWVzdGFtcHMuICBUaGlzIG1lYW5zIHRoYXQKK3VzaW5nIHRoZSA8Y29kZT51bnppcDwvY29kZT4gdGFzayBvbiBmaWxlcyBjcmVhdGVkIGJ5IFdpbmRvd3MnIGNvbXByZXNzZWQgZm9sZGVycyBmdW5jdGlvbiBtYXkKK2NyZWF0ZSBmaWxlcyB3aXRoIHRpbWVzdGFtcHMgdGhhdCBhcmUgIndyb25nIiwgdGhlIHNhbWUgaXMgdHJ1ZSBpZiB5b3UgdXNlIFdpbmRvd3MnIGZ1bmN0aW9ucyB0bworZXh0cmFjdCBhbiBBbnQgZ2VuZXJhdGVkIFpJUCBhcmNoaXZlLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZXN0ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgemlwLWZpbGUgdG8gY3JlYXRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvLjwvdGQ+CisgICAgPHRkPmRlc3RmaWxlPC90ZD4KKyAgICA8dGQ+dGhlIHppcCBmaWxlIHRvIGNyZWF0ZS48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+emlwZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGk+ZGVwcmVjYXRlZDwvaT4gb2xkIG5hbWUgb2YgZGVzdGZpbGUuPC90ZD4KKyAgICA8dGQ+emlwZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij48ZW0+PHU+ZGVwcmVjYXRlZDwvdT48L2VtPiBvbGQgbmFtZSBvZiA8dmFyPmRlc3RmaWxlPC92YXI+LjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIHRvIHppcCB0aGUgZmlsZXMuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+YmFzZWRpcjwvdGQ+CisgICAgPHRkPnRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCB0byB6aXAgdGhlIGZpbGVzLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y29tcHJlc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Tm90IG9ubHkgc3RvcmUgZGF0YSBidXQgYWxzbyBjb21wcmVzcyB0aGVtLAotICAgIGRlZmF1bHRzIHRvIHRydWUuICBVbmxlc3MgeW91IHNldCB0aGUgPGVtPmtlZXBjb21wcmVzc2lvbjwvZW0+Ci0gICAgYXR0cmlidXRlIHRvIGZhbHNlLCB0aGlzIHdpbGwgYXBwbHkgdG8gdGhlIGVudGlyZSBhcmNoaXZlLCBub3QKLSAgICBvbmx5IHRoZSBmaWxlcyB5b3UndmUgYWRkZWQgd2hpbGUgdXBkYXRpbmcuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y29tcHJlc3M8L3RkPgorICAgIDx0ZD5Ob3Qgb25seSBzdG9yZSBkYXRhIGJ1dCBhbHNvIGNvbXByZXNzIHRoZW0uICBVbmxlc3MgeW91IHNldCB0aGUgPHZhcj5rZWVwY29tcHJlc3Npb248L3Zhcj4KKyAgICAgIGF0dHJpYnV0ZSB0byA8cT5mYWxzZTwvcT4sIHRoaXMgd2lsbCBhcHBseSB0byB0aGUgZW50aXJlIGFyY2hpdmUsIG5vdCBvbmx5IHRoZSBmaWxlcyB5b3UndmUKKyAgICAgIGFkZGVkIHdoaWxlIHVwZGF0aW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmtlZXBjb21wcmVzc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Gb3IgZW50cmllcyBjb21pbmcgZnJvbSBleGlzdGluZyBhcmNoaXZlcyAobGlrZQotICAgIG5lc3RlZCA8ZW0+emlwZmlsZXNldDwvZW0+cyBvciB3aGlsZSB1cGRhdGluZyB0aGUgYXJjaGl2ZSksIGtlZXAKLSAgICB0aGUgY29tcHJlc3Npb24gYXMgaXQgaGFzIGJlZW4gb3JpZ2luYWxseSBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotICAgIDxlbT5jb21wcmVzczwvZW0+IGF0dHJpYnV0ZS4gIERlZmF1bHRzIGZhbHNlLiAgPGVtPlNpbmNlIEFudAotICAgIDEuNjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+a2VlcGNvbXByZXNzaW9uPC90ZD4KKyAgICA8dGQ+Rm9yIGVudHJpZXMgY29taW5nIGZyb20gZXhpc3RpbmcgYXJjaGl2ZXMgKGxpa2UgbmVzdGVkIDxjb2RlPnppcGZpbGVzZXQ8L2NvZGU+cyBvciB3aGlsZQorICAgICAgdXBkYXRpbmcgdGhlIGFyY2hpdmUpLCBrZWVwIHRoZSBjb21wcmVzc2lvbiBhcyBpdCBoYXMgYmVlbiBvcmlnaW5hbGx5IGluc3RlYWQgb2YgdXNpbmcKKyAgICAgIHRoZSA8dmFyPmNvbXByZXNzPC92YXI+IGF0dHJpYnV0ZS4gPGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCi0gICAgaW5zaWRlIHRoZSB6aXAgZmlsZS4gIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSB0aGUgPGEKLSAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi48YnIvPgotICAgIERlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iI2VuY29kaW5nIj5kaXNjdXNzaW9uIGJlbG93PC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBpbnNpZGUgdGhlIHppcCBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZQorICAgICAgdmFsdWVzIHNlZQorICAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIgorICAgICAgdGFyZ2V0PSJfdG9wIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZXNvbmx5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlN0b3JlIG9ubHkgZmlsZSBlbnRyaWVzLCBkZWZhdWx0cyB0byBmYWxzZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmZpbGVzb25seTwvdGQ+CisgICAgPHRkPlN0b3JlIG9ubHkgZmlsZSBlbnRyaWVzLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZC4gQWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgKDxxPioqPC9xPik8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZS4gRWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZC4gTm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBleGNsdWRlcyBvciBub25lIGlmIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGUuIEVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlLiBFYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRlZmF1bHRleGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciBkZWZhdWx0IGV4Y2x1ZGVzIHNob3VsZCBiZSB1c2VkIG9yIG5vdAotICAgICAgKCZxdW90O3llcyZxdW90Oy8mcXVvdDtubyZxdW90OykuIERlZmF1bHQgZXhjbHVkZXMgYXJlIHVzZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlZmF1bHRleGNsdWRlczwvdGQ+CisgICAgPHRkPmluZGljYXRlcyB3aGV0aGVyIGRlZmF1bHQgZXhjbHVkZXMgc2hvdWxkIGJlIHVzZWQgb3Igbm90ICg8cT55ZXN8bm88L3E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+eWVzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVwZGF0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmRpY2F0ZXMgd2hldGhlciB0byB1cGRhdGUgb3Igb3ZlcndyaXRlCi0gICAgICB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4gIERlZmF1bHQgaXMgJnF1b3Q7ZmFsc2UmcXVvdDsuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dXBkYXRlPC90ZD4KKyAgICA8dGQ+aW5kaWNhdGVzIHdoZXRoZXIgdG8gdXBkYXRlIG9yIG92ZXJ3cml0ZSB0aGUgZGVzdGluYXRpb24gZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGVuZW1wdHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmVoYXZpb3Igd2hlbiBubyBmaWxlcyBtYXRjaC4gIFZhbGlkIHZhbHVlcyBhcmUgJnF1b3Q7ZmFpbCZxdW90OywgJnF1b3Q7c2tpcCZxdW90OywgYW5kICZxdW90O2NyZWF0ZSZxdW90Oy4gIERlZmF1bHQgaXMgJnF1b3Q7c2tpcCZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD53aGVuZW1wdHk8L3RkPgorICAgIDx0ZD5iZWhhdmlvciB3aGVuIG5vIGZpbGVzIG1hdGNoLiAgVmFsaWQgdmFsdWVzIGFyZSA8cT5mYWlsPC9xPiwgPHE+c2tpcDwvcT4sCisgICAgICBhbmQgPHE+Y3JlYXRlPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5za2lwPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmR1cGxpY2F0ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlICZxdW90O2FkZCZxdW90OywgJnF1b3Q7cHJlc2VydmUmcXVvdDssIGFuZCAmcXVvdDtmYWlsJnF1b3Q7LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAmcXVvdDthZGQmcXVvdDsuICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kdXBsaWNhdGU8L3RkPgorICAgIDx0ZD5iZWhhdmlvciB3aGVuIGEgZHVwbGljYXRlIGZpbGUgaXMgZm91bmQuICBWYWxpZCB2YWx1ZXMgYXJlIDxxPmFkZDwvcT4sIDxxPnByZXNlcnZlPC9xPiwKKyAgICAgIGFuZCA8cT5mYWlsPC9xPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5hZGQ8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cm91bmR1cDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aWxsIGJlCi0gICAgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBldmVuIG51bWJlciBvZiBzZWNvbmRzLjxicj4KLSAgICBaaXAgYXJjaGl2ZXMgc3RvcmUgZmlsZSBtb2RpZmljYXRpb24gdGltZXMgd2l0aCBhIGdyYW51bGFyaXR5IG9mCi0gICAgdHdvIHNlY29uZHMsIHNvIHRoZSB0aW1lcyB3aWxsIGVpdGhlciBiZSByb3VuZGVkIHVwIG9yIGRvd24uICBJZgotICAgIHlvdSByb3VuZCBkb3duLCB0aGUgYXJjaGl2ZSB3aWxsIGFsd2F5cyBzZWVtIG91dC1vZi1kYXRlIHdoZW4geW91Ci0gICAgcmVydW4gdGhlIHRhc2ssIHNvIHRoZSBkZWZhdWx0IGlzIHRvIHJvdW5kIHVwLiAgUm91bmRpbmcgdXAgbWF5Ci0gICAgbGVhZCB0byBhIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIKLSAgICBhcmNoaXZlIHRoYXQgc2VlbSB0byBiZSBzbGlnaHRseSBtb3JlIHJlY2VudCB0aGFuIHByZWNvbXBpbGVkCi0gICAgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLjxicj4KLSAgICBEZWZhdWx0cyB0byB0cnVlLiAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+cm91bmR1cDwvdGQ+CisgICAgPHRkPldoZXRoZXIgdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzIHdpbGwgYmUgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBldmVuIG51bWJlciBvZgorICAgICAgc2Vjb25kcy48YnIvPlppcCBhcmNoaXZlcyBzdG9yZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YgMiBzZWNvbmRzLCBzbworICAgICAgdGhlIHRpbWVzIHdpbGwgZWl0aGVyIGJlIHJvdW5kZWQgdXAgb3IgZG93bi4gSWYgeW91IHJvdW5kIGRvd24sIHRoZSBhcmNoaXZlIHdpbGwgYWx3YXlzIHNlZW0KKyAgICAgIG91dC1vZi1kYXRlIHdoZW4geW91IHJlcnVuIHRoZSB0YXNrLCBzbyB0aGUgZGVmYXVsdCBpcyB0byByb3VuZCB1cC4gIFJvdW5kaW5nIHVwIG1heSBsZWFkIHRvIGEKKyAgICAgIGRpZmZlcmVudCB0eXBlIG9mIHByb2JsZW1zIGxpa2UgSlNQcyBpbnNpZGUgYSB3ZWIgYXJjaGl2ZSB0aGF0IHNlZW0gdG8gYmUgc2xpZ2h0bHkgbW9yZSByZWNlbnQKKyAgICAgIHRoYW4gcHJlY29tcGlsZWQgcGFnZXMsIHJlbmRlcmluZyBwcmVjb21waWxhdGlvbiB1c2VsZXNzLiA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tZW50PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1lbnQgdG8gc3RvcmUgaW4gdGhlIGFyY2hpdmUuIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5Db21tZW50IHRvIHN0b3JlIGluIHRoZSBhcmNoaXZlLiA8ZW0+U2luY2UgQW50IDEuNi4zPC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxldmVsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlCi0gICAgcGVyZm9ybWVkLiBWYWxpZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIChubyBjb21wcmVzc2lvbi9mYXN0ZXN0KSB0byA5Ci0gICAgKG1heGltdW0gY29tcHJlc3Npb24vc2xvd2VzdCkuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5sZXZlbDwvdGQ+CisgICAgPHRkPk5vbi1kZWZhdWx0IGxldmVsIGF0IHdoaWNoIGZpbGUgY29tcHJlc3Npb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4gVmFsaWQgdmFsdWVzIHJhbmdlCisgICAgICBmcm9tIDxxPjA8L3E+IChubyBjb21wcmVzc2lvbi9mYXN0ZXN0KSB0byA8cT45PC9xPiAobWF4aW11bSBjb21wcmVzc2lvbi9zbG93ZXN0KS4gPGVtPlNpbmNlCisgICAgICBBbnQgMS43PC9lbT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXNlcnZlMHBlcm1pc3Npb25zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW4gdXBkYXRpbmcgYW4gYXJjaGl2ZSBvciBhZGRpbmcgZW50cmllcyBmcm9tIGEKLSAgICBkaWZmZXJlbnQgYXJjaGl2ZSBBbnQgd2lsbCBhc3N1bWUgdGhhdCBhIFVuaXggcGVybWlzc2lvbnMgdmFsdWUgb2YKLSAgICAwIChub2JvZHkgaXMgYWxsb3dlZCB0byBkbyBhbnl0aGluZyB0byB0aGUgZmlsZS9kaXJlY3RvcnkpIG1lYW5zCi0gICAgdGhhdCB0aGUgcGVybWlzc2lvbnMgaGF2ZW4ndCBiZWVuIHN0b3JlZCBhdCBhbGwgcmF0aGVyIHRoYW4gcmVhbAotICAgIHBlcm1pc3Npb25zIGFuZCB3aWxsIGluc3RlYWQgYXBwbHkgaXRzIG93biBkZWZhdWx0IHZhbHVlcy48YnIvPgotICAgIFNldCB0aGlzIGF0dHJpYnV0ZSB0byB0cnVlIGlmIHlvdSByZWFsbHkgd2FudCB0byBwcmVzZXJ2ZSB0aGUKLSAgICAgIG9yaWdpbmFsIHBlcm1pc3Npb24gZmllbGQuPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+CisgICAgPHRkPnByZXNlcnZlMHBlcm1pc3Npb25zPC90ZD4KKyAgICA8dGQ+d2hlbiB1cGRhdGluZyBhbiBhcmNoaXZlIG9yIGFkZGluZyBlbnRyaWVzIGZyb20gYSBkaWZmZXJlbnQgYXJjaGl2ZSBBbnQgd2lsbCBhc3N1bWUgdGhhdCBhCisgICAgICBVbml4IHBlcm1pc3Npb25zIHZhbHVlIG9mIDAgKG5vYm9keSBpcyBhbGxvd2VkIHRvIGRvIGFueXRoaW5nIHRvIHRoZSBmaWxlL2RpcmVjdG9yeSkgbWVhbnMKKyAgICAgIHRoYXQgdGhlIHBlcm1pc3Npb25zIGhhdmVuJ3QgYmVlbiBzdG9yZWQgYXQgYWxsIHJhdGhlciB0aGFuIHJlYWwgcGVybWlzc2lvbnMgYW5kIHdpbGwgaW5zdGVhZAorICAgICAgYXBwbHkgaXRzIG93biBkZWZhdWx0IHZhbHVlcy48YnIvPiAgU2V0IHRoaXMgYXR0cmlidXRlIHRvIDxxPnRydWU8L3E+IGlmIHlvdSByZWFsbHkgd2FudCB0bworICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHBlcm1pc3Npb24gZmllbGQuIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVzZUxhbmd1YWdlRW5jb2RpbmdGbGFnPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZQotICAgICAgZW5jb2RpbmcgaXMgVVRGLTguICBUaGlzIHNldHRpbmcgZG9lc24ndCBoYXZlIGFueSBlZmZlY3QgaWYgdGhlCi0gICAgICBlbmNvZGluZyBpcyBub3QgVVRGLTguCi0gICAgICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4uCi0gICAgICA8YnIvPlNlZSBhbHNvIHRoZSA8YSBocmVmPSIjZW5jb2RpbmciPmRpc2N1c3Npb24gYmVsb3c8L2E+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIHRydWU8L3RkPgorICAgIDx0ZD51c2VMYW5ndWFnZUVuY29kaW5nRmxhZzwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gc2V0IHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGlmIHRoZSBlbmNvZGluZyBpcyBVVEYtOC4gVGhpcyBzZXR0aW5nIGRvZXNuJ3QKKyAgICAgIGhhdmUgYW55IGVmZmVjdCBpZiB0aGUgZW5jb2RpbmcgaXMgbm90IFVURi04LiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ljxici8+U2VlIGFsc28KKyAgICAgIHRoZSA8YSBocmVmPSIjZW5jb2RpbmciPmRpc2N1c3Npb24gYmVsb3c8L2E+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jcmVhdGVVbmljb2RlRXh0cmFGaWVsZHM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjcmVhdGUgdW5pY29kZSBleHRyYSBmaWVsZHMgdG8gc3RvcmUKLSAgICAgIHRoZSBmaWxlIG5hbWVzIGEgc2Vjb25kIHRpbWUgaW5zaWRlIHRoZSBlbnRyeSdzIG1ldGFkYXRhLgotICAgICAgPGJyPlBvc3NpYmxlIHZhbHVlcyBhcmUgIm5ldmVyIiwgImFsd2F5cyIgYW5kICJub3QtZW5jb2RlYWJsZSIKLSAgICAgIHdoaWNoIHdpbGwgb25seSBhZGQgVW5pY29kZSBleHRyYSBmaWVsZHMgaWYgdGhlIGZpbGUgbmFtZSBjYW5ub3QKLSAgICAgIGJlIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9IiNlbmNvZGluZyI+ZGlzY3Vzc2lvbiBiZWxvdzwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgIm5ldmVyIjwvdGQ+CisgICAgPHRkPmNyZWF0ZVVuaWNvZGVFeHRyYUZpZWxkczwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY3JlYXRlIFVuaWNvZGUgZXh0cmEgZmllbGRzIHRvIHN0b3JlIHRoZSBmaWxlIG5hbWVzIGEgc2Vjb25kIHRpbWUgaW5zaWRlIHRoZQorICAgICAgZW50cnkncyBtZXRhZGF0YS48YnIvPlBvc3NpYmxlIHZhbHVlcyBhcmUgPHE+bmV2ZXI8L3E+LCA8cT5hbHdheXM8L3E+CisgICAgICBhbmQgPHE+bm90LWVuY29kZWFibGU8L3E+IHdoaWNoIHdpbGwgb25seSBhZGQgVW5pY29kZSBleHRyYSBmaWVsZHMgaWYgdGhlIGZpbGUgbmFtZSBjYW5ub3QgYmUKKyAgICAgIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48YnIvPlNlZSBhbHNvCisgICAgICB0aGUgPGEgaHJlZj0iI2VuY29kaW5nIj5kaXNjdXNzaW9uIGJlbG93PC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPm5ldmVyPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZhbGxiYWNrdG9VVEY4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gdXNlIFVURi04IGFuZCB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcKLSAgICAgIGZsYWcgaW5zdGVhZCBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlmIGEgZmlsZSBuYW1lIGNhbm5vdCBiZQotICAgICAgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LgotICAgICAgPGJyLz5TZWUgYWxzbyB0aGUgPGEgaHJlZj0iI2VuY29kaW5nIj5kaXNjdXNzaW9uIGJlbG93PC9hPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCBpcyBmYWxzZTwvdGQ+CisgICAgPHRkPmZhbGxiYWNrdG9VVEY4PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byB1c2UgVVRGLTggYW5kIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGluc3RlYWQgb2YgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpZiBhCisgICAgICBmaWxlIG5hbWUgY2Fubm90IGJlIGVuY29kZWQgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48YnIvPlNlZQorICAgICAgYWxzbyB0aGUgPGEgaHJlZj0iI2VuY29kaW5nIj5kaXNjdXNzaW9uIGJlbG93PC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnppcDY0TW9kZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGVuIHRvIHVzZSBaaXA2NCBleHRlbnNpb25zIGZvciBlbnRyaWVzLiAgVGhlCi0gICAgICBwb3NzaWJsZSB2YWx1ZXMgYXJlICJuZXZlciIsICJhbHdheXMiIGFuZCAiYXMtbmVlZGVkIi4KLSAgICAgIDxlbT5TaW5jZSBBbnQgMS45LjE8L2VtPi4KLSAgICAgIDxici8+U2VlIGFsc28gdGhlIDxhIGhyZWY9IiN6aXA2NCI+ZGlzY3Vzc2lvbiBiZWxvdzwvYT48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgaXMgImFzLW5lZWRlZCI8L3RkPgorICAgIDx0ZD56aXA2NE1vZGU8L3RkPgorICAgIDx0ZD5XaGVuIHRvIHVzZSBaaXA2NCBleHRlbnNpb25zIGZvciBlbnRyaWVzLiAgVGhlIHBvc3NpYmxlIHZhbHVlcworICAgICAgYXJlIDxxPm5ldmVyPC9xPiwgPHE+YWx3YXlzPC9xPiBhbmQgPHE+YXMtbmVlZGVkPC9xPi4gIDxlbT5TaW5jZSBBbnQgMS45LjE8L2VtPi48YnIvPlNlZSBhbHNvCisgICAgICB0aGUgPGEgaHJlZj0iI3ppcDY0Ij5kaXNjdXNzaW9uIGJlbG93PC9hPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmFzLW5lZWRlZDwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPjxhIG5hbWU9ImVuY29kaW5nIj5FbmNvZGluZyBvZiBGaWxlIE5hbWVzPC9hPjwvaDM+Cis8aDMgaWQ9ImVuY29kaW5nIj5FbmNvZGluZyBvZiBmaWxlIG5hbWVzPC9oMz4KIAotPHA+VHJhZGl0aW9uYWxseSB0aGUgWklQIGFyY2hpdmUgZm9ybWF0IHVzZXMgQ29kZVBhZ2UgNDM3IGFzIGVuY29kaW5nCi0gIGZvciBmaWxlIG5hbWUsIHdoaWNoIGlzIG5vdCBzdWZmaWNpZW50IGZvciBtYW55IGludGVybmF0aW9uYWwKLSAgY2hhcmFjdGVyIHNldHMuPC9wPgorPHA+VHJhZGl0aW9uYWxseSB0aGUgWklQIGFyY2hpdmUgZm9ybWF0IHVzZXMgQ29kZVBhZ2UgNDM3IGFzIGVuY29kaW5nIGZvciBmaWxlIG5hbWUsIHdoaWNoIGlzIG5vdAorc3VmZmljaWVudCBmb3IgbWFueSBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlciBzZXRzLjwvcD4KIAotPHA+T3ZlciB0aW1lIGRpZmZlcmVudCBhcmNoaXZlcnMgaGF2ZSBjaG9zZW4gZGlmZmVyZW50IHdheXMgdG8gd29yawotICBhcm91bmQgdGhlIGxpbWl0YXRpb24gLSB0aGUgPGNvZGU+amF2YS51dGlsLnppcDwvY29kZT4gcGFja2FnZXMKLSAgc2ltcGx5IHVzZXMgVVRGLTggYXMgaXRzIGVuY29kaW5nIGZvciBleGFtcGxlLjwvcD4KKzxwPk92ZXIgdGltZSBkaWZmZXJlbnQgYXJjaGl2ZXJzIGhhdmUgY2hvc2VuIGRpZmZlcmVudCB3YXlzIHRvIHdvcmsgYXJvdW5kIHRoZQorbGltaXRhdGlvbiZtZGFzaDt0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEudXRpbC56aXA8L2NvZGU+IHBhY2thZ2VzIHNpbXBseSB1c2VzIFVURi04IGFzIGl0cworZW5jb2RpbmcgZm9yIGV4YW1wbGUuPC9wPgogCi08cD5BbnQgaGFzIGJlZW4gb2ZmZXJpbmcgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgemlwIGFuZCB1bnppcAotICB0YXNrIGFzIGEgd2F5IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgZW5jb2RpbmcgdG8gdXNlIChvciBleHBlY3QpCi0gIHNpbmNlIEFudCAxLjQuICBJdCBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGVuY29kaW5nIGZvcgotICB6aXAgYW5kIFVURi04IGZvciBqYXIgYW5kIG90aGVyIGphci1saWtlIHRhc2tzICh3YXIsIGVhciwgLi4uKSBhcwotICB3ZWxsIGFzIHRoZSB1bnppcCBmYW1pbHkgb2YgdGFza3MuPC9wPgorPHA+QW50IGhhcyBiZWVuIG9mZmVyaW5nIHRoZSA8cT5lbmNvZGluZzwvcT4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT56aXA8L2NvZGU+CithbmQgPGNvZGU+dW56aXA8L2NvZGU+IHRhc2sgYXMgYSB3YXkgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBlbmNvZGluZyB0byB1c2UgKG9yIGV4cGVjdCkgPGVtPnNpbmNlCitBbnQgMS40PC9lbT4uICBJdCBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIDxjb2RlPnppcDwvY29kZT4gYW5kIFVURi04Citmb3IgPGNvZGU+amFyPC9jb2RlPiBhbmQgb3RoZXIgamFyLWxpa2UgdGFza3MgKDxjb2RlPndhcjwvY29kZT4sIDxjb2RlPmVhcjwvY29kZT4sIC4uLikgYXMgd2VsbCBhcwordGhlIDxjb2RlPnVuemlwPC9jb2RlPiBmYW1pbHkgb2YgdGFza3MuPC9wPgogCi08cD5Nb3JlIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgWklQIHNwZWNpZmljYXRpb24gaW50cm9kdWNlIHNvbWV0aGluZwotICBjYWxsZWQgdGhlICZxdW90O2xhbmd1YWdlIGVuY29kaW5nIGZsYWcmcXVvdDsgd2hpY2ggY2FuIGJlIHVzZWQgdG8KLSAgc2lnbmFsIHRoYXQgYSBmaWxlIG5hbWUgaGFzIGJlZW4gZW5jb2RlZCB1c2luZyBVVEYtOC4gIFN0YXJ0aW5nIHdpdGgKLSAgQW50IDEuOC4wIGFsbCB6aXAtL2phci0gYW5kIHNpbWlsYXIgYXJjaGl2ZXMgd3JpdHRlbiBieSBBbnQgd2lsbCBzZXQKLSAgdGhpcyBmbGFnLCBpZiB0aGUgZW5jb2RpbmcgaGFzIGJlZW4gc2V0IHRvIFVURi04LiAgT3VyCi0gIGludGVyb3BlcmFiaWx0eSB0ZXN0cyB3aXRoIGV4aXN0aW5nIGFyY2hpdmVycyBkaWRuJ3Qgc2hvdyBhbnkgaWxsCi0gIGVmZmVjdHMgKGluIGZhY3QsIG1vc3QgYXJjaGl2ZXJzIGlnbm9yZSB0aGUgZmxhZyB0byBkYXRlKSwgYnV0IHlvdQotICBjYW4gdHVybiBvZmYgdGhlICJsYW5ndWFnZSBlbmNvZGluZyBmbGFnIiBieSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGUKLSAgPGNvZGU+dXNlTGFuZ3VhZ2VFbmNvZGluZ0ZsYWc8L2NvZGU+IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBvbiB0aGUKLSAgemlwLXRhc2sgaWYgeW91IHNob3VsZCBlbmNvdW50ZXIgcHJvYmxlbXMuPC9wPgorPHA+TW9yZSByZWNlbnQgdmVyc2lvbnMgb2YgdGhlIFpJUCBzcGVjaWZpY2F0aW9uIGludHJvZHVjZSBzb21ldGhpbmcgY2FsbGVkIHRoZSA8cT5sYW5ndWFnZSBlbmNvZGluZworZmxhZzwvcT4gd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2lnbmFsIHRoYXQgYSBmaWxlIG5hbWUgaGFzIGJlZW4gZW5jb2RlZCB1c2luZyBVVEYtOC4gPGVtPlNpbmNlIEFudAorMS44LjA8L2VtPiwgYWxsIHppcCwgamFyIGFuZCBzaW1pbGFyIGFyY2hpdmVzIHdyaXR0ZW4gYnkgQW50IHdpbGwgc2V0IHRoaXMgZmxhZywgaWYgdGhlIGVuY29kaW5nIGhhcworYmVlbiBzZXQgdG8gVVRGLTguICBPdXIgaW50ZXJvcGVyYWJpbGl0eSB0ZXN0cyB3aXRoIGV4aXN0aW5nIGFyY2hpdmVycyBkaWRuJ3Qgc2hvdyBhbnkgaWxsIGVmZmVjdHMKKyhpbiBmYWN0LCBtb3N0IGFyY2hpdmVycyBpZ25vcmUgdGhlIGZsYWcgdG8gZGF0ZSksIGJ1dCB5b3UgY2FuIHR1cm4gb2ZmIHRoZSA8cT5sYW5ndWFnZSBlbmNvZGluZworZmxhZzwvcT4gYnkgc2V0dGluZyB0aGUgYXR0cmlidXRlIDx2YXI+dXNlTGFuZ3VhZ2VFbmNvZGluZ0ZsYWc8L3Zhcj4gdG8gPHE+ZmFsc2U8L3E+IG9uCit0aGUgPGNvZGU+emlwPC9jb2RlPiB0YXNrIGlmIHlvdSBzaG91bGQgZW5jb3VudGVyIHByb2JsZW1zLjwvcD4KIAotPHA+VGhlIHVuemlwIChhbmQgc2ltaWxhciB0YXNrcykgLXRhc2sgd2lsbCByZWNvZ25pemUgdGhlIGxhbmd1YWdlCi0gIGVuY29kaW5nIGZsYWcgYW5kIGlnbm9yZSB0aGUgZW5jb2Rpbmcgc2V0IG9uIHRoZSB0YXNrIGlmIGl0IGhhcyBiZWVuCi0gIGZvdW5kLjwvcD4KKzxwPlRoZSA8Y29kZT51bnppcDwvY29kZT4gdGFzayAoYW5kIHNpbWlsYXIgdGFza3MpIHdpbGwgcmVjb2duaXplIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGFuZAoraWdub3JlIHRoZSBlbmNvZGluZyBzZXQgb24gdGhlIHRhc2sgaWYgaXQgaGFzIGJlZW4gZm91bmQuPC9wPgogCi08cD5UaGUgSW5mb1pJUCBkZXZlbG9wZXJzIGhhdmUgaW50cm9kdWNlZCBuZXcgWklQIGV4dHJhIGZpZWxkcyB0aGF0Ci0gIGNhbiBiZSB1c2VkIHRvIGFkZCBhbiBhZGRpdGlvbmFsIFVURi04IGVuY29kZWQgZmlsZSBuYW1lIHRvIHRoZQotICBlbnRyeSdzIG1ldGFkYXRhLiAgTW9zdCBhcmNoaXZlcnMgaWdub3JlIHRoZXNlIGV4dHJhIGZpZWxkcy4gIFRoZQotICB6aXAgZmFtaWx5IG9mIHRhc2tzIHN1cHBvcnQgYW4KLSAgb3B0aW9uIDxjb2RlPmNyZWF0ZVVuaWNvZGVFeHRyYUZpZWxkczwvY29kZT4gc2luY2UgQW50IDEuOC4wIHdoaWNoCi0gIG1ha2VzIEFudCB3cml0ZSB0aGVzZSBleHRyYSBmaWVsZHMgZWl0aGVyIGZvciBhbGwgZW50cmllcyAoImFsd2F5cyIpCi0gIG9yIG9ubHkgdGhvc2Ugd2hvc2UgbmFtZSBjYW5ub3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkCi0gIGVuY29kaW5nIChub3QtZW5jb2RlYWJsZSksIGl0IGRlZmF1bHRzIHRvICJuZXZlciIgc2luY2UgdGhlIGV4dHJhCi0gIGZpZWxkcyBjcmVhdGUgYmlnZ2VyIGFyY2hpdmVzLjwvcD4KKzxwPlRoZSBJbmZvWklQIGRldmVsb3BlcnMgaGF2ZSBpbnRyb2R1Y2VkIG5ldyBaSVAgZXh0cmEgZmllbGRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGFuIGFkZGl0aW9uYWwKK1VURi04IGVuY29kZWQgZmlsZSBuYW1lIHRvIHRoZSBlbnRyeSdzIG1ldGFkYXRhLiAgTW9zdCBhcmNoaXZlcnMgaWdub3JlIHRoZXNlIGV4dHJhCitmaWVsZHMuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4sIHRoZSA8Y29kZT56aXA8L2NvZGU+IGZhbWlseSBvZiB0YXNrcyBzdXBwb3J0IGFuCitvcHRpb24gPHZhcj5jcmVhdGVVbmljb2RlRXh0cmFGaWVsZHM8L3Zhcj4sIHdoaWNoIG1ha2VzIEFudCB3cml0ZSB0aGVzZSBleHRyYSBmaWVsZHMgZWl0aGVyIGZvciBhbGwKK2VudHJpZXMgKDxxPmFsd2F5czwvcT4pIG9yIG9ubHkgdGhvc2Ugd2hvc2UgbmFtZSBjYW5ub3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nCisoPHE+bm90LWVuY29kZWFibGU8L3E+KSwgaXQgZGVmYXVsdHMgdG8gPHE+bmV2ZXI8L3E+IHNpbmNlIHRoZSBleHRyYSBmaWVsZHMgY3JlYXRlIGJpZ2dlcgorYXJjaGl2ZXMuPC9wPgogCi08cD5UaGUgZmFsbGJhY2tUb1VURjggYXR0cmlidXRlIG9mIHppcCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYXJjaGl2ZXMKLSAgdGhhdCB1c2UgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpbiB0aGUgbWFqb3JpdHkgb2YgY2FzZXMgYnV0IFVURi04IGFuZAotICB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcgZmxhZyBmb3IgZmlsZW5hbWVzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQKLSAgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZy48L3A+Cis8cD5UaGUgPHZhcj5mYWxsYmFja1RvVVRGODwvdmFyPiBhdHRyaWJ1dGUgb2YgPGNvZGU+emlwPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYXJjaGl2ZXMgdGhhdAordXNlIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgaW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzIGJ1dCBVVEYtOCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgZm9yCitmaWxlbmFtZXMgdGhhdCBjYW5ub3QgYmUgZW5jb2RlZCB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLjwvcD4KIAotPHA+VGhlIHVuemlwLXRhc2sgd2lsbCByZWNvZ25pemUgdGhlIHVuaWNvZGUgZXh0cmEgZmllbGRzIGJ5IGRlZmF1bHQKLSAgYW5kIHJlYWQgdGhlIGZpbGUgbmFtZSBpbmZvcm1hdGlvbiBmcm9tIHRoZW0sIHVubGVzcyB5b3Ugc2V0IHRoZQotICBvcHRpb25hbCBhdHRyaWJ1dGUgPGNvZGU+c2NhbkZvclVuaWNvZGVFeHRyYUZpZWxkczwvY29kZT4gdG8KLSAgZmFsc2UuPC9wPgorPHA+VGhlIDxjb2RlPnVuemlwPC9jb2RlPiB0YXNrIHdpbGwgcmVjb2duaXplIHRoZSBVbmljb2RlIGV4dHJhIGZpZWxkcyBieSBkZWZhdWx0IGFuZCByZWFkIHRoZSBmaWxlCituYW1lIGluZm9ybWF0aW9uIGZyb20gdGhlbSwgdW5sZXNzIHlvdSBzZXQgdGhlIG9wdGlvbmFsCithdHRyaWJ1dGUgPHZhcj5zY2FuRm9yVW5pY29kZUV4dHJhRmllbGRzPC92YXI+IHRvIDxxPmZhbHNlPC9xPi48L3A+CiAKLTxoND5SZWNvbW1lbmRhdGlvbnMgZm9yIEludGVyb3BlcmFiaWxpdHk8L2g0PgorPGg0PlJlY29tbWVuZGF0aW9ucyBmb3IgaW50ZXJvcGVyYWJpbGl0eTwvaDQ+CiAKLTxwPlRoZSBvcHRpbWFsIHNldHRpbmcgb2YgZmxhZ3MgZGVwZW5kcyBvbiB0aGUgYXJjaGl2ZXJzIHlvdSBleHBlY3QgYXMKLSAgY29uc3VtZXJzL3Byb2R1Y2VycyBvZiB0aGUgWklQIGFyY2hpdmVzLiAgQmVsb3cgYXJlIHNvbWUgdGVzdAotICByZXN1bHRzIHdoaWNoIG1heSBiZSBzdXBlcnNlZWRlZCB3aXRoIGxhdGVyIHZlcnNpb25zIG9mIGVhY2gKLSAgdG9vbC48L3A+Cis8cD5UaGUgb3B0aW1hbCBzZXR0aW5nIG9mIGZsYWdzIGRlcGVuZHMgb24gdGhlIGFyY2hpdmVycyB5b3UgZXhwZWN0IGFzIGNvbnN1bWVycy9wcm9kdWNlcnMgb2YgdGhlCitaSVAgYXJjaGl2ZXMuICBCZWxvdyBhcmUgc29tZSB0ZXN0IHJlc3VsdHMgd2hpY2ggbWF5IGJlIHN1cGVyc2VkZWQgd2l0aCBsYXRlciB2ZXJzaW9ucyBvZiBlYWNoCit0b29sLjwvcD4KIAogPHVsPgotICA8bGk+VGhlIGphdmEudXRpbC56aXAgcGFja2FnZSB1c2VkIGJ5IHRoZSBqYXIgZXhlY3V0YWJsZSBvciB0byByZWFkCi0gICAgamFycyBmcm9tIHlvdXIgQ0xBU1NQQVRIIHJlYWRzIGFuZCB3cml0ZXMgVVRGLTggbmFtZXMsIGl0IGRvZXNuJ3QKLSAgICBzZXQgb3IgcmVjb2duaXplIGFueSBmbGFncyBvciB1bmljb2RlIGV4dHJhIGZpZWxkcy48L2xpPgotCi0gIDxsaT5TdGFydGluZyB3aXRoIEphdmE3IDxjb2RlPmphdmEudXRpbC56aXA8L2NvZGU+IHdyaXRlcyBVVEYtOCBieQotICAgIGRlZmF1bHQgYW5kIHVzZXMgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcuICBJdCBpcyBwb3NzaWJsZSB0bwotICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgZW5jb2Rpbmcgd2hlbiByZWFkaW5nL3dyaXRpbmcgWklQcyB2aWEgbmV3Ci0gICAgY29uc3RydWN0b3JzLiAgVGhlIHBhY2thZ2Ugbm93IHJlY29nbml6ZXMgdGhlIGxhbmd1YWdlIGVuY29kaW5nCi0gICAgZmxhZyB3aGVuIHJlYWRpbmcgYW5kIGlnbm9yZXMgdGhlIFVuaWNvZGUgZXh0cmEgZmllbGRzLjwvbGk+Ci0KLSAgPGxpPjdaaXAgd3JpdGVzIENvZGVQYWdlIDQzNyBieSBkZWZhdWx0IGJ1dCB1c2VzIFVURi04IGFuZCB0aGUKLSAgICBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIHdoZW4gd3JpdGluZyBlbnRyaWVzIHRoYXQgY2Fubm90IGJlIGVuY29kZWQKLSAgICBhcyBDb2RlUGFnZSA0MzcgKHNpbWlsYXIgdG8gdGhlIHppcCB0YXNrIHdpdGggZmFsbGJhY2t0b1VURjggc2V0Ci0gICAgdG8gdHJ1ZSkuICBJdCByZWNvZ25pemVzIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIHdoZW4gcmVhZGluZwotICAgIGFuZCBpZ25vcmVzIHRoZSB1bmljb2RlIGV4dHJhIGZpZWxkcy48L2xpPgotCi0gIDxsaT5XaW5aSVAgd3JpdGVzIENvZGVQYWdlIDQzNyBhbmQgdXNlcyB1bmljb2RlIGV4dHJhIGZpZWxkcyBieQotICAgIGRlZmF1bHQuICBJdCByZWNvZ25pemVzIHRoZSB1bmljb2RlIGV4dHJhIGZpZWxkIGFuZCB0aGUgbGFuZ3VhZ2UKLSAgICBlbmNvZGluZyBmbGFnIHdoZW4gcmVhZGluZy48L2xpPgotCi0gIDxsaT5XaW5kb3dzJyAiY29tcHJlc3NlZCBmb2xkZXIiIGZlYXR1cmUgZG9lc24ndCByZWNvZ25pemUgYW55IGZsYWcKLSAgICBvciBleHRyYSBmaWVsZCBhbmQgY3JlYXRlcyBhcmNoaXZlcyB1c2luZyB0aGUgcGxhdGZvcm1zIGRlZmF1bHQKLSAgICBlbmNvZGluZyAtIGFuZCBleHBlY3RzIGFyY2hpdmVzIHRvIGJlIGluIHRoYXQgZW5jb2Rpbmcgd2hlbiByZWFkaW5nCi0gICAgdGhlbS48L2xpPgotCi0gIDxsaT5JbmZvWklQIGJhc2VkIHRvb2xzIGNhbiByZWNvZ25pemUgYW5kIHdyaXRlIGJvdGgsIGl0IGlzIGEKLSAgICBjb21waWxlIHRpbWUgb3B0aW9uIGFuZCBkZXBlbmRzIG9uIHRoZSBwbGF0Zm9ybSBzbyB5b3VyIG1pbGVhZ2UKLSAgICBtYXkgdmFyeS48L2xpPgotCi0gIDxsaT5QS1dBUkUgemlwIHRvb2xzIHJlY29nbml6ZSBib3RoIGFuZCBwcmVmZXIgdGhlIGxhbmd1YWdlIGVuY29kaW5nCi0gICAgZmxhZy4gIFRoZXkgY3JlYXRlIGFyY2hpdmVzIHVzaW5nIENvZGVQYWdlIDQzNyBpZiBwb3NzaWJsZSBhbmQgVVRGLTgKLSAgICBwbHVzIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGZvciBmaWxlIG5hbWVzIHRoYXQgY2Fubm90IGJlCi0gICAgZW5jb2RlZCBhcyBDb2RlUGFnZSA0MzcuPC9saT4KKyAgPGxpPlRoZSA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLnppcDwvY29kZT4gcGFja2FnZSB1c2VkIGJ5IHRoZSA8a2JkPmphcjwva2JkPiBleGVjdXRhYmxlIG9yCisgICAgdG8gcmVhZCBqYXJzIGZyb20geW91ciA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IHJlYWRzIGFuZCB3cml0ZXMgVVRGLTggbmFtZXMsIGl0IGRvZXNuJ3Qgc2V0IG9yCisgICAgcmVjb2duaXplIGFueSBmbGFncyBvciB1bmljb2RlIGV4dHJhIGZpZWxkcy48L2xpPgorICA8bGk+U2luY2UgSmF2YSA3LCA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLnppcDwvY29kZT4gd3JpdGVzIFVURi04IGJ5IGRlZmF1bHQgYW5kIHVzZXMgdGhlCisgICAgbGFuZ3VhZ2UgZW5jb2RpbmcgZmxhZy4gIEl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZW5jb2Rpbmcgd2hlbiByZWFkaW5nL3dyaXRpbmcKKyAgICBaSVBzIHZpYSBuZXcgY29uc3RydWN0b3JzLiAgVGhlIHBhY2thZ2Ugbm93IHJlY29nbml6ZXMgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgd2hlbiByZWFkaW5nCisgICAgYW5kIGlnbm9yZXMgdGhlIFVuaWNvZGUgZXh0cmEgZmllbGRzLjwvbGk+CisgIDxsaT43WmlwIHdyaXRlcyBDb2RlUGFnZSA0MzcgYnkgZGVmYXVsdCBidXQgdXNlcyBVVEYtOCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgd2hlbiB3cml0aW5nCisgICAgZW50cmllcyB0aGF0IGNhbm5vdCBiZSBlbmNvZGVkIGFzIENvZGVQYWdlIDQzNyAoc2ltaWxhciB0byB0aGUgPGNvZGU+emlwPC9jb2RlPiB0YXNrCisgICAgd2l0aCA8dmFyPmZhbGxiYWNrdG9VVEY4PC92YXI+IHNldCB0byA8cT50cnVlPC9xPikuICBJdCByZWNvZ25pemVzIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnCisgICAgd2hlbiByZWFkaW5nIGFuZCBpZ25vcmVzIHRoZSBVbmljb2RlIGV4dHJhIGZpZWxkcy48L2xpPgorICA8bGk+V2luWklQIHdyaXRlcyBDb2RlUGFnZSA0MzcgYW5kIHVzZXMgVW5pY29kZSBleHRyYSBmaWVsZHMgYnkgZGVmYXVsdC4gIEl0IHJlY29nbml6ZXMgdGhlCisgICAgVW5pY29kZSBleHRyYSBmaWVsZCBhbmQgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgd2hlbiByZWFkaW5nLjwvbGk+CisgIDxsaT5XaW5kb3dzJyAiY29tcHJlc3NlZCBmb2xkZXIiIGZlYXR1cmUgZG9lc24ndCByZWNvZ25pemUgYW55IGZsYWcgb3IgZXh0cmEgZmllbGQgYW5kIGNyZWF0ZXMKKyAgICBhcmNoaXZlcyB1c2luZyB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBlbmNvZGluZyZtZGFzaDthbmQgZXhwZWN0cyBhcmNoaXZlcyB0byBiZSBpbiB0aGF0IGVuY29kaW5nCisgICAgd2hlbiByZWFkaW5nIHRoZW0uPC9saT4KKyAgPGxpPkluZm9aSVAgYmFzZWQgdG9vbHMgY2FuIHJlY29nbml6ZSBhbmQgd3JpdGUgYm90aCwgaXQgaXMgYSBjb21waWxlIHRpbWUgb3B0aW9uIGFuZCBkZXBlbmRzIG9uCisgICAgdGhlIHBsYXRmb3JtIHNvIHlvdXIgbWlsZWFnZSBtYXkgdmFyeS48L2xpPgorICA8bGk+UEtXQVJFIHppcCB0b29scyByZWNvZ25pemUgYm90aCBhbmQgcHJlZmVyIHRoZSBsYW5ndWFnZSBlbmNvZGluZyBmbGFnLiAgVGhleSBjcmVhdGUgYXJjaGl2ZXMKKyAgICB1c2luZyBDb2RlUGFnZSA0MzcgaWYgcG9zc2libGUgYW5kIFVURi04IHBsdXMgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgZm9yIGZpbGUgbmFtZXMgdGhhdAorICAgIGNhbm5vdCBiZSBlbmNvZGVkIGFzIENvZGVQYWdlIDQzNy48L2xpPgogPC91bD4KIAogPHA+U28sIHdoYXQgdG8gZG8/PC9wPgogCi08cD5JZiB5b3UgYXJlIGNyZWF0aW5nIGphcnMsIHRoZW4gamF2YS51dGlsLnppcCBpcyB5b3VyIG1haW4KLSAgY29uc3VtZXIuICBXZSByZWNvbW1lbmQgeW91IHNldCB0aGUgZW5jb2RpbmcgdG8gVVRGLTggYW5kIGtlZXAgdGhlCi0gIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgZW5hYmxlZC4gIFRoZSBmbGFnIHdvbid0IGhlbHAgb3IgaHVydAotICBqYXZhLnV0aWwuemlwIHByaW9yIHRvIEphdmE3IGJ1dCBhcmNoaXZlcnMgdGhhdCBzdXBwb3J0IGl0IHdpbGwgc2hvdwotICB0aGUgY29ycmVjdCBmaWxlIG5hbWVzLjwvcD4KKzxwPklmIHlvdSBhcmUgY3JlYXRpbmcgamFycywgdGhlbiA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLnppcDwvY29kZT4gaXMgeW91ciBtYWluIGNvbnN1bWVyLiAgV2UKK3JlY29tbWVuZCB5b3Ugc2V0IHRoZSBlbmNvZGluZyB0byBVVEYtOCBhbmQga2VlcCB0aGUgbGFuZ3VhZ2UgZW5jb2RpbmcgZmxhZyBlbmFibGVkLiAgVGhlIGZsYWcgd29uJ3QKK2hlbHAgb3IgaHVydCA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLnppcDwvY29kZT4gcHJpb3IgdG8gSmF2YSA3IGJ1dCBhcmNoaXZlcnMgdGhhdCBzdXBwb3J0IGl0Cit3aWxsIHNob3cgdGhlIGNvcnJlY3QgZmlsZSBuYW1lcy48L3A+CiAKLTxwPkZvciBtYXhpbXVtIGludGVyb3AgaXQgaXMgcHJvYmFibHkgYmVzdCB0byBzZXQgdGhlIGVuY29kaW5nIHRvCi0gIFVURi04LCBlbmFibGUgdGhlIGxhbmd1YWdlIGVuY29kaW5nIGZsYWcgYW5kIGNyZWF0ZSB1bmljb2RlIGV4dHJhCi0gIGZpZWxkcyB3aGVuIHdyaXRpbmcgWklQcy4gIFN1Y2ggYXJjaGl2ZXMgc2hvdWxkIGJlIGV4dHJhY3RlZAotICBjb3JyZWN0bHkgYnkgamF2YS51dGlsLnppcCwgN1ppcCwgV2luWklQLCBQS1dBUkUgdG9vbHMgYW5kIG1vc3QKLSAgbGlrZWx5IEluZm9aSVAgdG9vbHMuICBUaGV5IHdpbGwgYmUgdW51c2FibGUgd2l0aCBXaW5kb3dzJwotICAiY29tcHJlc3NlZCBmb2xkZXJzIiBmZWF0dXJlIGFuZCBiaWdnZXIgdGhhbiBhcmNoaXZlcyB3aXRob3V0IHRoZQotICB1bmljb2RlIGV4dHJhIGZpZWxkcywgdGhvdWdoLjwvcD4KKzxwPkZvciBtYXhpbXVtIGludGVyb3BhcmFiaWxpdHkgaXQgaXMgcHJvYmFibHkgYmVzdCB0byBzZXQgdGhlIGVuY29kaW5nIHRvIFVURi04LCBlbmFibGUgdGhlCitsYW5ndWFnZSBlbmNvZGluZyBmbGFnIGFuZCBjcmVhdGUgVW5pY29kZSBleHRyYSBmaWVsZHMgd2hlbiB3cml0aW5nIFpJUHMuICBTdWNoIGFyY2hpdmVzIHNob3VsZCBiZQorZXh0cmFjdGVkIGNvcnJlY3RseSBieSA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS51dGlsLnppcDwvY29kZT4sIDdaaXAsIFdpblpJUCwgUEtXQVJFIHRvb2xzIGFuZCBtb3N0CitsaWtlbHkgSW5mb1pJUCB0b29scy4gIFRoZXkgd2lsbCBiZSB1bnVzYWJsZSB3aXRoIFdpbmRvd3MnICJjb21wcmVzc2VkIGZvbGRlcnMiIGZlYXR1cmUgYW5kIGJpZ2dlcgordGhhbiBhcmNoaXZlcyB3aXRob3V0IHRoZSBVbmljb2RlIGV4dHJhIGZpZWxkcywgdGhvdWdoLjwvcD4KIAotPHA+SWYgV2luZG93cycgImNvbXByZXNzZWQgZm9sZGVycyIgaXMgeW91ciBwcmltYXJ5IGNvbnN1bWVyLCB0aGVuCi0gIHlvdXIgYmVzdCBvcHRpb24gaXMgdG8gZXhwbGljaXRseSBzZXQgdGhlIGVuY29kaW5nIHRvIHRoZSB0YXJnZXQKLSAgcGxhdGZvcm0uICBZb3UgbWF5IHdhbnQgdG8gZW5hYmxlIGNyZWF0aW9uIG9mIHVuaWNvZGUgZXh0cmEgZmllbGRzCi0gIHNvIHRoZSB0b29scyB0aGF0IHN1cHBvcnQgdGhlbSB3aWxsIGV4dHJhY3QgdGhlIGZpbGUgbmFtZXMKLSAgY29ycmVjdGx5LjwvcD4KKzxwPklmIFdpbmRvd3MnICJjb21wcmVzc2VkIGZvbGRlcnMiIGlzIHlvdXIgcHJpbWFyeSBjb25zdW1lciwgdGhlbiB5b3VyIGJlc3Qgb3B0aW9uIGlzIHRvIGV4cGxpY2l0bHkKK3NldCB0aGUgZW5jb2RpbmcgdG8gdGhlIHRhcmdldCBwbGF0Zm9ybS4gIFlvdSBtYXkgd2FudCB0byBlbmFibGUgY3JlYXRpb24gb2YgVW5pY29kZSBleHRyYSBmaWVsZHMgc28KK3RoZSB0b29scyB0aGF0IHN1cHBvcnQgdGhlbSB3aWxsIGV4dHJhY3QgdGhlIGZpbGUgbmFtZXMgY29ycmVjdGx5LjwvcD4KIAotPGgzPjxhIG5hbWU9InppcDY0Ij5aaXA2NCBleHRlbnNpb25zPC9hPjwvaDM+Cis8aDMgaWQ9InppcDY0Ij5aaXA2NCBleHRlbnNpb25zPC9oMz4KIAotPHA+WmlwNjQgZXh0ZW5zaW9ucyBwcm92aWRlIGEgd2F5IHRvIGNyZWF0ZSBhcmNoaXZlcyBiaWdnZXIgdGhhbiA0R0IKLSAgb3IgaG9sZGluZyBtb3JlIHRoYW4gNjU1MzUgZW50cmllcyAtIG9yIGFkZCBpbmRpdmlkdWFsIGVudHJpZXMKLSAgYmlnZ2VyIHRoYW4gNEdCIHVzaW5nIHRoZSBaSVAgZXh0ZW5zaW9uIGZpZWxkIG1lY2hhbmlzbS4gIFRoZXNlCi0gIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZCBieSBtb3N0IG1vZGVybiBaSVAgaW1wbGVtZW50YXRpb25zLjwvcD4KKzxwPlppcDY0IGV4dGVuc2lvbnMgcHJvdmlkZSBhIHdheSB0byBjcmVhdGUgYXJjaGl2ZXMgYmlnZ2VyIHRoYW4gNCBHQiBvciBob2xkaW5nIG1vcmUgdGhhbiA2NTUzNQorZW50cmllcyZtZGFzaDtvciBhZGQgaW5kaXZpZHVhbCBlbnRyaWVzIGJpZ2dlciB0aGFuIDQgR0IgdXNpbmcgdGhlIFpJUCBleHRlbnNpb24gZmllbGQgbWVjaGFuaXNtLgorVGhlc2UgZXh0ZW5zaW9ucyBhcmUgc3VwcG9ydGVkIGJ5IG1vc3QgbW9kZXJuIFpJUCBpbXBsZW1lbnRhdGlvbnMuPC9wPgogCi08cD5XaGVuIEFudCB3cml0ZXMgY29tcHJlc3NlZCBlbnRyaWVzIGludG8gdGhlIGFyY2hpdmUgaXQgY3JlYXRlcyBpdAotICBkb2Vzbid0IGtub3cgdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiBhbiBlbnRyeSBiZWZvcmUgaXQgaGFzIGJlZW4KLSAgd3JpdHRlbi4gIFVuZm9ydHVuYXRlbHkgdGhlIGRlY2lzaW9uIHdoZXRoZXIgYSBaaXA2NCBleHRyYSBmaWVsZAotICB3aWxsIGJlIHdyaXR0ZW4gaGFzIHRvIGJlIG1hZGUgYmVmb3JlIHdyaXRpbmcgdGhlIGVudHJ5J3MKLSAgY29udGVudC48L3A+Cis8cD5XaGVuIEFudCB3cml0ZXMgY29tcHJlc3NlZCBlbnRyaWVzIGludG8gdGhlIGFyY2hpdmUgaXQgY3JlYXRlcyBpdCBkb2Vzbid0IGtub3cgdGhlIGNvbXByZXNzZWQKK3NpemUgb2YgYW4gZW50cnkgYmVmb3JlIGl0IGhhcyBiZWVuIHdyaXR0ZW4uICBVbmZvcnR1bmF0ZWx5IHRoZSBkZWNpc2lvbiB3aGV0aGVyIGEgWmlwNjQgZXh0cmEgZmllbGQKK3dpbGwgYmUgd3JpdHRlbiBoYXMgdG8gYmUgbWFkZSBiZWZvcmUgd3JpdGluZyB0aGUgZW50cnkncyBjb250ZW50LjwvcD4KIAotPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS45LjAgQW50IHN1cHBvcnRzIFppcDY0IGV4dGVuc2lvbnMgYnV0IGRpZG4ndAotICBwcm92aWRlIGFueSBjb250cm9sIG92ZXIgdGhlaXIgdXNhZ2UsIHN0YXJ0aW5nIHdpdGggQW50IDEuOS4xIGEKLSAgbmV3IDxlbT56aXA2NG1vZGU8L2VtPiBhdHRyaWJ1dGUgd2FzIGFkZGVkIHRvIHRoZSA8Y29kZT56aXA8L2NvZGU+Ci0gIGZhbWlseSBvZiB0YXNrcy4gIEl0IHN1cHBvcnRzIHRocmVlIHZhbHVlczoKKzxwPkFudCAxLjkuMCBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIFppcDY0IGV4dGVuc2lvbnMgYnV0IGRpZG4ndCBwcm92aWRlIGFueSBjb250cm9sIG92ZXIgdGhlaXIKK3VzYWdlLiA8ZW0+U2luY2UgQW50IDEuOS4xPC9lbT4sIGEgbmV3IDx2YXI+emlwNjRtb2RlPC92YXI+IGF0dHJpYnV0ZSB3YXMgYWRkZWQgdG8KK3RoZSA8Y29kZT56aXA8L2NvZGU+IGZhbWlseSBvZiB0YXNrcy4gIEl0IHN1cHBvcnRzIHRocmVlIHZhbHVlczoKIAogPHVsPgotICA8bGk+PGVtPm5ldmVyPC9lbT4gbWVhbnMgbm8gWmlwNjQgZXh0cmEgZmllbGRzIHdpbGwgZXZlciBiZQotICAgIHdyaXR0ZW4sIHRoaXMgaXMgdGhlIGJlaGF2aW9yIG9mIEFudCAxLjgueCBhbmQgZWFybGllciBhbmQgdGhlCi0gICAgZGVmYXVsdCBiZWhhdmlvciBvZiA8Y29kZT5qYXI8L2NvZGU+LCA8Y29kZT5lYXI8L2NvZGU+Ci0gICAgYW5kIDxjb2RlPndhcjwvY29kZT4gc3RhcnRpbmcgd2l0aCBBbnQgMS45LjEuPC9saT4KLSAgPGxpPjxlbT5hbHdheXM8L2VtPiBtZWFucyBaaXA2NCBleHRyYSBmaWVsZHMgYXJlIHdyaXR0ZW4gZm9yIGFsbAotICAgIGVudHJpZXMuPC9saT4KLSAgPGxpPjxlbT5hcy1uZWVkZWQ8L2VtPiBtZWFucyBaaXA2NCBleHRyYSBmaWVsZHMgYXJlIHdyaXR0ZW4gZm9yIGFsbAotICAgIGNvbXByZXNzZWQgZW50cmllcyB0byB0aGUgImxvY2FsIGZpbGUgaGVhZGVyIiAoYnkgZGVmYXVsdCB0aGVzZQotICAgIGFyZSBhbGwgZmlsZXMgYnV0IG5vdCB0aGUgZGlyZWN0b3JpZXMpIGJ1dCBvbmx5IHdyaXR0ZW4gdG8gdGhlCi0gICAgY2VudHJhbCBkaXJlY3RvcnkgaWYgdGhlIGVudHJ5IHJlYWxseSByZXF1aXJlZCBaaXA2NCBmZWF0dXJlcy4KLSAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIEFudCAxLjkuMCBhbmQgcmVtYWlucyB0aGUgZGVmYXVsdAotICAgIGJlaGF2aW9yIG9mIHRoZSA8Y29kZT56aXA8L2NvZGU+IHRhc2suPC9saT4KKyAgPGxpPjxxPm5ldmVyPC9xPiBtZWFucyBubyBaaXA2NCBleHRyYSBmaWVsZHMgd2lsbCBldmVyIGJlIHdyaXR0ZW4uIFRoaXMgaXMgdGhlIGJlaGF2aW9yIG9mIEFudAorICAgIHByaW9yIHRvIDEuOS4wIGFuZCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiA8Y29kZT5qYXI8L2NvZGU+LCA8Y29kZT5lYXI8L2NvZGU+CisgICAgYW5kIDxjb2RlPndhcjwvY29kZT4gPGVtPnNpbmNlIEFudCAxLjkuMTwvZW0+LjwvbGk+CisgIDxsaT48cT5hbHdheXM8L3E+IG1lYW5zIFppcDY0IGV4dHJhIGZpZWxkcyBhcmUgd3JpdHRlbiBmb3IgYWxsIGVudHJpZXMuPC9saT4KKyAgPGxpPjxxPmFzLW5lZWRlZDwvcT4gbWVhbnMgWmlwNjQgZXh0cmEgZmllbGRzIGFyZSB3cml0dGVuIGZvciBhbGwgY29tcHJlc3NlZCBlbnRyaWVzIHRvIHRoZSAibG9jYWwKKyAgICBmaWxlIGhlYWRlciIgKGJ5IGRlZmF1bHQgdGhlc2UgYXJlIGFsbCBmaWxlcyBidXQgbm90IHRoZSBkaXJlY3RvcmllcykgYnV0IG9ubHkgd3JpdHRlbiB0byB0aGUKKyAgICBjZW50cmFsIGRpcmVjdG9yeSBpZiB0aGUgZW50cnkgcmVhbGx5IHJlcXVpcmVkIFppcDY0IGZlYXR1cmVzLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZgorICAgIEFudCAxLjkuMCBhbmQgcmVtYWlucyB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgPGNvZGU+emlwPC9jb2RlPiB0YXNrLjwvbGk+CiA8L3VsPgogCi08cD48ZW0+YXMtbmVlZGVkPC9lbT4gcHJvdmlkZXMgYSBnb29kIGNvbXByb21pc2UgaWYgeW91IGRvbid0IGtub3cKLSAgd2hldGhlciB5b3UgYXJjaGl2ZSB3aWxsIGV4Y2VlZCB0aGUgbGltaXRzIG9mIHRyYWRpdGlvbmFsIHppcCBmaWxlcwotICBidXQgZG9uJ3Qgd2FudCB0byB3YXN0ZSB0b28gbXVjaCBzcGFjZSAodGhlIFppcDY0IGV4dGVuc2lvbnMgdGFrZSB1cAotICBleHRyYSBzcGFjZSkuICBVbmZvcnR1bmF0ZWx5IHNvbWUgWklQIGltcGxlbWVudGF0aW9ucyBkb24ndAotICB1bmRlcnN0YW5kIFppcDY0IGV4dHJhIGZpZWxkcyBvciBmYWlsIHRvIHBhcnNlIGFyY2hpdmVzIHdpdGggZXh0cmEKLSAgZmllbGRzIGluIGxvY2FsIGZpbGUgaGVhZGVycyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgY2VudHJhbAotICBkaXJlY3RvcnksIG9uZSBzdWNoIGltcGxlbWVudGF0aW9uIGlzIHRoZSBqYXZhLnV0aWwuemlwIHBhY2thZ2Ugb2YKLSAgSmF2YTUsIHRoYXQncyB3aHkgdGhlIDxjb2RlPmphcjwvY29kZT4gdGFza3MgZGVmYXVsdAotICB0byA8ZW0+bmV2ZXI8L2VtPi4gIEFyY2hpdmVzIGNyZWF0ZWQgd2l0aCA8ZW0+YXMtbmVlZGVkPC9lbT4gY2FuIGJlCi0gIHJlYWQgd2l0aG91dCBwcm9ibGVtcyB3aXRoIEphdmE2IGFuZCBsYXRlci48L3A+Cis8cD48cT5hcy1uZWVkZWQ8L3E+IHByb3ZpZGVzIGEgZ29vZCBjb21wcm9taXNlIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgeW91IGFyY2hpdmUgd2lsbCBleGNlZWQgdGhlCitsaW1pdHMgb2YgdHJhZGl0aW9uYWwgemlwIGZpbGVzIGJ1dCBkb24ndCB3YW50IHRvIHdhc3RlIHRvbyBtdWNoIHNwYWNlICh0aGUgWmlwNjQgZXh0ZW5zaW9ucyB0YWtlIHVwCitleHRyYSBzcGFjZSkuICBVbmZvcnR1bmF0ZWx5IHNvbWUgWklQIGltcGxlbWVudGF0aW9ucyBkb24ndCB1bmRlcnN0YW5kIFppcDY0IGV4dHJhIGZpZWxkcyBvciBmYWlsIHRvCitwYXJzZSBhcmNoaXZlcyB3aXRoIGV4dHJhIGZpZWxkcyBpbiBsb2NhbCBmaWxlIGhlYWRlcnMgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIGNlbnRyYWwKK2RpcmVjdG9yeSwgb25lIHN1Y2ggaW1wbGVtZW50YXRpb24gaXMgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLnV0aWwuemlwPC9jb2RlPiBwYWNrYWdlIG9mIEphdmEgNSwKK3RoYXQncyB3aHkgdGhlIDxjb2RlPmphcjwvY29kZT4gdGFza3MgZGVmYXVsdCB0byA8cT5uZXZlcjwvcT4uICBBcmNoaXZlcyBjcmVhdGVkCit3aXRoIDxxPmFzLW5lZWRlZDwvcT4gY2FuIGJlIHJlYWQgd2l0aG91dCBwcm9ibGVtcyB3aXRoIEphdmEgNiBhbmQgbGF0ZXIuPC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmFueSByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KLTxwPjxhIGhyZWY9Ii4uL1R5cGVzL3Jlc291cmNlcy5odG1sI2NvbGxlY3Rpb24iPlJlc291cmNlCi1Db2xsZWN0aW9uPC9hPnMgYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiBmaWxlcyB0byBhcmNoaXZlLjwvcD4KLTxwPlByaW9yIHRvIEFudCAxLjcgb25seSA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGFuZAotPGNvZGU+Jmx0O3ppcGZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXZlIGJlZW4gc3VwcG9ydGVkIGFzIG5lc3RlZCBlbGVtZW50cy48L3A+Cis8cD48YSBocmVmPSIuLi9UeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4gYXJlIHVzZWQgdG8gc2VsZWN0IGdyb3Vwcworb2YgZmlsZXMgdG8gYXJjaGl2ZS48L3A+Cis8cD5QcmlvciB0byBBbnQgMS43IG9ubHkgPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3ppcGZpbGVzZXQmZ3Q7PC9jb2RlPiBoYXZlIGJlZW4KK3N1cHBvcnRlZCBhcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgogCi08YSBuYW1lPSJ6aXBncm91cGZpbGVzZXQiIC8+Ci08aDQ+emlwZ3JvdXBmaWxlc2V0PC9oND4KLTxwPkEgPGNvZGU+Jmx0O3ppcGdyb3VwZmlsZXNldCZndDs8L2NvZGU+IGFsbG93cyBmb3IgbXVsdGlwbGUgemlwIGZpbGVzIHRvIGJlIAotbWVyZ2VkIGludG8gdGhlIGFyY2hpdmUuIEVhY2ggZmlsZSBmb3VuZCBpbiB0aGlzIGZpbGVzZXQgaXMgYWRkZWQgdG8gdGhlIGFyY2hpdmUgCi10aGUgc2FtZSB3YXkgdGhhdCA8aT56aXBmaWxlc2V0IHNyYzwvaT4gZmlsZXMgYXJlIGFkZGVkLjwvcD4KKzxoNCBpZD0iemlwZ3JvdXBmaWxlc2V0Ij56aXBncm91cGZpbGVzZXQ8L2g0PgorPHA+QSA8Y29kZT4mbHQ7emlwZ3JvdXBmaWxlc2V0Jmd0OzwvY29kZT4gYWxsb3dzIGZvciBtdWx0aXBsZSB6aXAgZmlsZXMgdG8gYmUgbWVyZ2VkIGludG8gdGhlCithcmNoaXZlLiBFYWNoIGZpbGUgZm91bmQgaW4gdGhpcyBmaWxlc2V0IGlzIGFkZGVkIHRvIHRoZSBhcmNoaXZlIHRoZSBzYW1lIHdheQordGhhdCA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPiA8dmFyPnNyYzwvdmFyPiBmaWxlcyBhcmUgYWRkZWQuPC9wPgogCi08cD48Y29kZT4mbHQ7emlwZ3JvdXBmaWxlc2V0Jmd0OzwvY29kZT4gaXMKLSAgYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+IGFuZCBzdXBwb3J0cyBhbGwKLSAgb2YgaXRzIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cy48L2E+Cis8cD48Y29kZT4mbHQ7emlwZ3JvdXBmaWxlc2V0Jmd0OzwvY29kZT4gaXMgYSA8YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+IGFuZAorc3VwcG9ydHMgYWxsIG9mIGl0cyBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7Ci0gIC8mZ3Q7PC9wcmU+Ci08cD56aXBzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8gYSBmaWxlIGNhbGxlZCA8Y29kZT5tYW51YWwuemlwPC9jb2RlPgotaW4gdGhlIDxjb2RlPiR7ZGlzdH08L2NvZGU+IGRpcmVjdG9yeS48L3A+Ci08cHJlPiAgJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsKLSAgICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKLSAgICAgICB1cGRhdGU9JnF1b3Q7dHJ1ZSZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+emlwcyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeSBpbnRvIGEgZmlsZSBjYWxsZWQgPGNvZGU+bWFudWFsLnppcDwvY29kZT4KLWluIHRoZSA8Y29kZT4ke2Rpc3R9PC9jb2RlPiBkaXJlY3RvcnkuIElmIDxjb2RlPm1hbnVhbC56aXA8L2NvZGU+Ci1kb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkOyBvdGhlcndpc2UgaXQgaXMgdXBkYXRlZCB3aXRoIHRoZQotbmV3L2NoYW5nZWQgZmlsZXMuPC9wPgotPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7Ci0gICAgICAgZXhjbHVkZXM9JnF1b3Q7bXlkb2NzLyoqLCAqKi90b2RvLmh0bWwmcXVvdDsKLSAgLyZndDs8L3ByZT4KLTxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkuIEZpbGVzIGluIHRoZSBkaXJlY3RvcnkgPGNvZGU+bXlkb2NzPC9jb2RlPiwKLW9yIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+dG9kby5odG1sPC9jb2RlPiBhcmUgZXhjbHVkZWQuPC9wPgotPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Ci0gICAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7Ci0gICAgICAgaW5jbHVkZXM9JnF1b3Q7YXBpLyoqLyouaHRtbCZxdW90OwotICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqL3RvZG8uaHRtbCZxdW90OwotICAvJmd0OzwvcHJlPgotPHA+emlwcyBhbGwgZmlsZXMgaW4gdGhlIDxjb2RlPmh0ZG9jcy9tYW51YWw8L2NvZGU+IGRpcmVjdG9yeS4gT25seSBodG1sIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkgPGNvZGU+YXBpPC9jb2RlPgotYXJlIHppcHBlZCwgYW5kIGZpbGVzIHdpdGggdGhlIG5hbWUgPGNvZGU+dG9kby5odG1sPC9jb2RlPiBhcmUgZXhjbHVkZWQuPC9wPgotPHByZT4gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Jmd0OwotICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtDaGFuZ2VMb2cudHh0JnF1b3Q7LyZndDsKLSAgJmx0Oy96aXAmZ3Q7PC9wcmU+Ci08cD56aXBzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5LCBhbmQgYWxzbyBhZGRzIHRoZSBmaWxlIDxjb2RlPkNoYW5nZUxvZy50eHQ8L2NvZGU+IGluIHRoZQotY3VycmVudCBkaXJlY3RvcnkuIDxjb2RlPkNoYW5nZUxvZy50eHQ8L2NvZGU+IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRvcCBvZiB0aGUgWklQIGZpbGUsIGp1c3QgYXMgaWYKLWl0IGhhZCBiZWVuIGxvY2F0ZWQgYXQgPGNvZGU+aHRkb2NzL21hbnVhbC9DaGFuZ2VMb2cudHh0PC9jb2RlPi48L3A+Ci08cHJlPiAgJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsmZ3Q7Ci0gICAgJmx0O3ppcGZpbGVzZXQgZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsgcHJlZml4PSZxdW90O2RvY3MvdXNlci1ndWlkZSZxdW90Oy8mZ3Q7Ci0gICAgJmx0O3ppcGZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Q2hhbmdlTG9nMjcudHh0JnF1b3Q7IGZ1bGxwYXRoPSZxdW90O2RvY3MvQ2hhbmdlTG9nLnR4dCZxdW90Oy8mZ3Q7Ci0gICAgJmx0O3ppcGZpbGVzZXQgc3JjPSZxdW90O2V4YW1wbGVzLnppcCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmh0bWwmcXVvdDsgcHJlZml4PSZxdW90O2RvY3MvZXhhbXBsZXMmcXVvdDsvJmd0OwotICAmbHQ7L3ppcCZndDs8L3ByZT4KLTxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byB0aGUgPGNvZGU+ZG9jcy91c2VyLWd1aWRlPC9jb2RlPiBkaXJlY3RvcnkKLWluIHRoZSBhcmNoaXZlLCBhZGRzIHRoZSBmaWxlIDxjb2RlPkNoYW5nZUxvZzI3LnR4dDwvY29kZT4gaW4gdGhlCi1jdXJyZW50IGRpcmVjdG9yeSBhcyA8Y29kZT5kb2NzL0NoYW5nZUxvZy50eHQ8L2NvZGU+LCBhbmQgaW5jbHVkZXMgYWxsIHRoZSBodG1sIGZpbGVzIGluIDxjb2RlPmV4YW1wbGVzLnppcDwvY29kZT4gCi11bmRlciA8Y29kZT5kb2NzL2V4YW1wbGVzPC9jb2RlPi4gIFRoZSBhcmNoaXZlIG1pZ2h0IGVuZCB1cCBjb250YWluaW5nIHRoZSBmaWxlczo8L3A+Ci08cHJlPiAgICBkb2NzL3VzZXItZ3VpZGUvaHRtbC9pbmRleC5odG1sCis8cD5aaXAgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8c2FtcD5tYW51YWwuemlwPC9zYW1wPiBpbiB0aGUgPHNhbXA+JHtkaXN0fTwvc2FtcD4gZGlyZWN0b3J5LjwvcD4KKzxwcmU+CismbHQ7emlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnppcCZxdW90OworICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5aaXAgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byBhIGZpbGUKK2NhbGxlZCA8c2FtcD5tYW51YWwuemlwPC9zYW1wPiBpbiB0aGUgPHNhbXA+JHtkaXN0fTwvc2FtcD4gZGlyZWN0b3J5LiBJZiA8c2FtcD5tYW51YWwuemlwPC9zYW1wPgorZG9lc24ndCBleGlzdCwgaXQgaXMgY3JlYXRlZDsgb3RoZXJ3aXNlIGl0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3L2NoYW5nZWQgZmlsZXMuPC9wPgorPHByZT4KKyZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7CisgICAgIGJhc2VkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90OworICAgICB1cGRhdGU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7PC9wcmU+CisKKzxwPlppcCBhbGwgZmlsZXMgaW4gdGhlIDxzYW1wPmh0ZG9jcy9tYW51YWw8L3NhbXA+IGRpcmVjdG9yeS4gRmlsZXMgaW4gdGhlCitkaXJlY3RvcnkgPHNhbXA+bXlkb2NzPC9zYW1wPiwgb3IgZmlsZXMgd2l0aCB0aGUgbmFtZSA8c2FtcD50b2RvLmh0bWw8L3NhbXA+IGFyZSBleGNsdWRlZC48L3A+Cis8cHJlPgorJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsKKyAgICAgYmFzZWRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7CisgICAgIGV4Y2x1ZGVzPSZxdW90O215ZG9jcy8qKiwgKiovdG9kby5odG1sJnF1b3Q7LyZndDs8L3ByZT4KKworPHA+WmlwIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+aHRkb2NzL21hbnVhbDwvc2FtcD4gZGlyZWN0b3J5LiBPbmx5IDxzYW1wPmh0bWw8L3NhbXA+IGZpbGVzIHVuZGVyIHRoZQorZGlyZWN0b3J5IDxzYW1wPmFwaTwvc2FtcD4gYXJlIHppcHBlZCwgYW5kIGZpbGVzIHdpdGggdGhlIG5hbWUgPHNhbXA+dG9kby5odG1sPC9zYW1wPiBhcmUKK2V4Y2x1ZGVkLjwvcD4KKzxwcmU+CismbHQ7emlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnppcCZxdW90OworICAgICBiYXNlZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsKKyAgICAgaW5jbHVkZXM9JnF1b3Q7YXBpLyoqLyouaHRtbCZxdW90OworICAgICBleGNsdWRlcz0mcXVvdDsqKi90b2RvLmh0bWwmcXVvdDsvJmd0OzwvcHJlPgorCis8cD5aaXAgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnksIGFuZCBhbHNvIGFkZCB0aGUKK2ZpbGUgPHNhbXA+Q2hhbmdlTG9nLnR4dDwvc2FtcD4gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiA8c2FtcD5DaGFuZ2VMb2cudHh0PC9zYW1wPiB3aWxsIGJlIGFkZGVkCit0byB0aGUgdG9wIG9mIHRoZSBaSVAgZmlsZSwganVzdCBhcyBpZiBpdCBoYWQgYmVlbiBsb2NhdGVkCithdCA8c2FtcD5odGRvY3MvbWFudWFsL0NoYW5nZUxvZy50eHQ8L3NhbXA+LjwvcD4KKzxwcmU+CismbHQ7emlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnppcCZxdW90OyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2h0ZG9jcy9tYW51YWwmcXVvdDsvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtDaGFuZ2VMb2cudHh0JnF1b3Q7LyZndDsKKyZsdDsvemlwJmd0OzwvcHJlPgorCis8cD5aaXAgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byB0aGUgPHNhbXA+ZG9jcy91c2VyLWd1aWRlPC9zYW1wPgorZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlLCBhZGRzIHRoZSBmaWxlIDxzYW1wPkNoYW5nZUxvZzI3LnR4dDwvc2FtcD4gaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CithcyA8c2FtcD5kb2NzL0NoYW5nZUxvZy50eHQ8L3NhbXA+LCBhbmQgaW5jbHVkZXMgYWxsIHRoZSA8c2FtcD5odG1sPC9zYW1wPiBmaWxlcworaW4gPHNhbXA+ZXhhbXBsZXMuemlwPC9zYW1wPiB1bmRlciA8c2FtcD5kb2NzL2V4YW1wbGVzPC9zYW1wPi48L3A+Cis8cHJlPgorJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsmZ3Q7CisgICZsdDt6aXBmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7IHByZWZpeD0mcXVvdDtkb2NzL3VzZXItZ3VpZGUmcXVvdDsvJmd0OworICAmbHQ7emlwZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtDaGFuZ2VMb2cyNy50eHQmcXVvdDsgZnVsbHBhdGg9JnF1b3Q7ZG9jcy9DaGFuZ2VMb2cudHh0JnF1b3Q7LyZndDsKKyAgJmx0O3ppcGZpbGVzZXQgc3JjPSZxdW90O2V4YW1wbGVzLnppcCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmh0bWwmcXVvdDsgcHJlZml4PSZxdW90O2RvY3MvZXhhbXBsZXMmcXVvdDsvJmd0OworJmx0Oy96aXAmZ3Q7PC9wcmU+Cis8cD5UaGUgYXJjaGl2ZSBtaWdodCBlbmQgdXAgY29udGFpbmluZyB0aGUgZmlsZXM6PC9wPgorPHByZT4KKyAgICBkb2NzL3VzZXItZ3VpZGUvaHRtbC9pbmRleC5odG1sCiAgICAgZG9jcy9DaGFuZ2VMb2cudHh0Ci0gICAgZG9jcy9leGFtcGxlcy9pbmRleC5odG1sCi08L3ByZT4KLTxwPgotVGhlIGNvZGUKLTxwcmU+Ci0gICZsdDt6aXAgZGVzdGZpbGU9JnF1b3Q7JHtkaXN0fS9tYW51YWwuemlwJnF1b3Q7Jmd0OwotICAgICZsdDt6aXBmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7IHByZWZpeD0mcXVvdDtkb2NzL3VzZXItZ3VpZGUmcXVvdDsvJmd0OwotICAgICZsdDt6aXBncm91cGZpbGVzZXQgZGlyPSZxdW90Oy4mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7ZXhhbXBsZXMqLnppcCZxdW90Oy8mZ3Q7Ci0gICZsdDsvemlwJmd0OwotPC9wcmU+Ci08cD4KLTxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5odGRvY3MvbWFudWFsPC9jb2RlPiBkaXJlY3RvcnkgaW50byB0aGUgPGNvZGU+ZG9jcy91c2VyLWd1aWRlPC9jb2RlPiBkaXJlY3RvcnkgaW4gdGhlIGFyY2hpdmUgYW5kIGluY2x1ZGVzIGFsbCB0aGUgZmlsZXMgaW4gYW55IGZpbGUgdGhhdCBtYXRjaGVzIDxjb2RlPmV4YW1wbGVzKi56aXA8L2NvZGU+LCBzdWNoIGFzIGFsbCBmaWxlcyB3aXRoaW4gPGNvZGU+ZXhhbXBsZXMxLnppcDwvY29kZT4gb3IgPGNvZGU+ZXhhbXBsZXNfZm9yX2JyaWFuLnppcDwvY29kZT4uCi1UaGUgc2FtZSBjYW4gYmUgYWNoaWV2ZWQgd2l0aAotPHByZT4KLSAgJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsmZ3Q7Ci0gICAgJmx0O21hcHBlZHJlc291cmNlcyZndDsKLSAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7LyZndDsKLSAgICAgICZsdDtnbG9ibWFwcGVyIGZyb209IioiIHRvPSJkb2NzL3VzZXItZ3VpZGUvKiIvJmd0OwotICAgICZsdDsvbWFwcGVkcmVzb3VyY2VzJmd0OwotICAgICZsdDthcmNoaXZlcyZndDsKLSAgICAgICZsdDt6aXBzJmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtleGFtcGxlcyouemlwJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvemlwcyZndDsKLSAgICAmbHQ7L2FyY2hpdmVzJmd0OwotICAmbHQ7L3ppcCZndDsKLTwvcHJlPgorICAgIGRvY3MvZXhhbXBsZXMvaW5kZXguaHRtbDwvcHJlPgogCi1UaGUgbmV4dCBleGFtcGxlCis8cD5aaXAgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50byB0aGUgPHNhbXA+ZG9jcy91c2VyLWd1aWRlPC9zYW1wPgorZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlIGFuZCBpbmNsdWRlIGFsbCB0aGUgZmlsZXMgaW4gYW55IGZpbGUgdGhhdAorbWF0Y2hlcyA8c2FtcD5leGFtcGxlcyouemlwPC9zYW1wPiwgc3VjaCBhcyBhbGwgZmlsZXMgd2l0aGluIDxzYW1wPmV4YW1wbGVzMS56aXA8L3NhbXA+CitvciA8c2FtcD5leGFtcGxlc19mb3JfYnJpYW4uemlwPC9zYW1wPi48L3A+Cis8cHJlPgorJmx0O3ppcCBkZXN0ZmlsZT0mcXVvdDske2Rpc3R9L21hbnVhbC56aXAmcXVvdDsmZ3Q7CisgICZsdDt6aXBmaWxlc2V0IGRpcj0mcXVvdDtodGRvY3MvbWFudWFsJnF1b3Q7IHByZWZpeD0mcXVvdDtkb2NzL3VzZXItZ3VpZGUmcXVvdDsvJmd0OworICAmbHQ7emlwZ3JvdXBmaWxlc2V0IGRpcj0mcXVvdDsuJnF1b3Q7IGluY2x1ZGVzPSZxdW90O2V4YW1wbGVzKi56aXAmcXVvdDsvJmd0OworJmx0Oy96aXAmZ3Q7PC9wcmU+Cis8cD5UaGUgc2FtZSBjYW4gYmUgYWNoaWV2ZWQgd2l0aDwvcD4KKzxwcmU+CismbHQ7emlwIGRlc3RmaWxlPSZxdW90OyR7ZGlzdH0vbWFudWFsLnppcCZxdW90OyZndDsKKyAgJmx0O21hcHBlZHJlc291cmNlcyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aHRkb2NzL21hbnVhbCZxdW90Oy8mZ3Q7CisgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKiIgdG89ImRvY3MvdXNlci1ndWlkZS8qIi8mZ3Q7CisgICZsdDsvbWFwcGVkcmVzb3VyY2VzJmd0OworICAmbHQ7YXJjaGl2ZXMmZ3Q7CisgICAgJmx0O3ppcHMmZ3Q7CisgICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7LiZxdW90OyBpbmNsdWRlcz0mcXVvdDtleGFtcGxlcyouemlwJnF1b3Q7LyZndDsKKyAgICAmbHQ7L3ppcHMmZ3Q7CisgICZsdDsvYXJjaGl2ZXMmZ3Q7CismbHQ7L3ppcCZndDs8L3ByZT4KIAorPHA+UmUtcGFja2FnZSBhIFRBUiBhcmNoaXZlIGFzIGEgWklQIGFyY2hpdmUuIElmIFVuaXggZmlsZSBwZXJtaXNzaW9ucyBoYXZlIGJlZW4gc3RvcmVkIGFzIHBhcnQgb2YKK3RoZSBUQVIgZmlsZSwgdGhleSB3aWxsIGJlIHJldGFpbmVkIGluIHRoZSByZXN1bHRpbmcgWklQIGFyY2hpdmUuPC9wPgogPHByZT4KICZsdDt6aXAgZGVzdGZpbGU9InJlbGVhc2UuemlwIiZndDsKICAgJmx0O3RhcmZpbGVzZXQgc3JjPSJyZWxlYXNlLnRhciIvJmd0OwotJmx0Oy96aXAmZ3Q7Ci08L3ByZT4KLQotPHA+cmUtcGFja2FnZXMgYSBUQVIgYXJjaGl2ZSBhcyBhIFpJUCBhcmNoaXZlLiAgSWYgVW5peCBmaWxlCi1wZXJtaXNzaW9ucyBoYXZlIGJlZW4gc3RvcmVkIGFzIHBhcnQgb2YgdGhlIFRBUiBmaWxlLCB0aGV5IHdpbGwgYmUKLXJldGFpbmVkIGluIHRoZSByZXN1bHRpbmcgWklQIGFyY2hpdmUuPC9wPgotCi0KKyZsdDsvemlwJmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9hbnRsaWIuaHRtbCBiL21hbnVhbC9UeXBlcy9hbnRsaWIuaHRtbAppbmRleCA5MjUzMjBhLi45NjYyY2U2IDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvYW50bGliLmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL2FudGxpYi5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjUzICsxNSwyMDMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogICA8aGVhZD4KLSAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+PC9tZXRhPgogICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgICAgPHRpdGxlPkFudExpYjwvdGl0bGU+CiAgIDwvaGVhZD4KIAogICA8Ym9keT4KLSAgICA8aDI+PGEgbmFtZT0iYW50bGliIj5BbnRsaWI8L2E+PC9oMj4KLQorICAgIDxoMiBpZD0iYW50bGliIj5BbnRsaWI8L2gyPgogCiAgICAgPGgzPkRlc2NyaXB0aW9uPC9oMz4KICAgICA8cD4KLSAgICAgIEFuIGFudGxpYiBmaWxlIGlzIGFuIHhtbCBmaWxlIHdpdGggYSByb290IGVsZW1lbnQgb2YgImFudGxpYiIuCi0gICAgICBBbnRsaWIncyBlbGVtZW50cyBhcmUgQXBhY2hlIEFudCBkZWZpbml0aW9uIHRhc2tzIC0gbGlrZQotICAgICAgPGEgaHJlZj0iLi4vVGFza3MvdGFza2RlZi5odG1sIj5UYXNrZGVmPC9hPgotICAgICAgb3IgYW55IEFudCB0YXNrIHRoYXQgZXh0ZW5kcwotICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50bGliRGVmaW5pdGlvbjwvY29kZT4uCisgICAgICBBbiBhbnRsaWIgZmlsZSBpcyBhbiB4bWwgZmlsZSB3aXRoIGEgcm9vdCBlbGVtZW50IG9mIDxjb2RlPmFudGxpYjwvY29kZT4uICBBbnRsaWIncyBlbGVtZW50cworICAgICAgYXJlIEFwYWNoZSBBbnQgZGVmaW5pdGlvbiB0YXNrcyZtZGFzaDtsaWtlIDxhIGhyZWY9Ii4uL1Rhc2tzL3Rhc2tkZWYuaHRtbCI+VGFza2RlZjwvYT4gb3IgYW55CisgICAgICBBbnQgdGFzayB0aGF0CisgICAgICBleHRlbmRzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BbnRsaWJEZWZpbml0aW9uPC9jb2RlPi4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICAgIFRoZSBjdXJyZW50IHNldCBvZiBkZWNsYXJhdGlvbnMgYnVuZGxlZCB3aXRoIEFudCB0aGF0IGRvIHRoaXMgYXJlOgorICAgICAgVGhlIGN1cnJlbnQgc2V0IG9mIGRlY2xhcmF0aW9ucyBidW5kbGVkIHdpdGggQW50IHRoYXQgZG8gdGhpcyBhcmU6CiAgICAgPC9wPgotICAgICAgICA8b2w+Ci0gICAgICAgICAgICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvdHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9UYXNrcy90YXNrZGVmLmh0bWwiPlRhc2tkZWY8L2E+Ci0gICAgICAgICAgICA8L2xpPgotICAgICAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL1Rhc2tzL21hY3JvZGVmLmh0bWwiPk1hY3JvZGVmPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9UYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlc2V0ZGVmPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT48YSBocmVmPSIuLi9UYXNrcy9zY3JpcHRkZWYuaHRtbCI+U2NyaXB0ZGVmPC9hPgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgPC9vbD4KKyAgICA8b2w+CisgICAgICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvdHlwZWRlZi5odG1sIj5UeXBlZGVmPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvdGFza2RlZi5odG1sIj5UYXNrZGVmPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvbWFjcm9kZWYuaHRtbCI+TWFjcm9kZWY8L2E+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIuLi9UYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlc2V0ZGVmPC9hPjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0ZGVmLmh0bWwiPlNjcmlwdGRlZjwvYT48L2xpPgorICAgIDwvb2w+CiAgICAgPHA+Ci0gICAgICBBIGdyb3VwIG9mIHRhc2tzIGFuZCB0eXBlcyBtYXkgYmUgZGVmaW5lZCB0b2dldGhlciBpbiBhbiBhbnRsaWIKLSAgICAgIGZpbGUuIEZvciBleGFtcGxlIHRoZSBmaWxlIDxpPnNhbXBsZS54bWw8L2k+IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CisgICAgICBBIGdyb3VwIG9mIHRhc2tzIGFuZCB0eXBlcyBtYXkgYmUgZGVmaW5lZCB0b2dldGhlciBpbiBhbiBhbnRsaWIgZmlsZS4gRm9yIGV4YW1wbGUgdGhlCisgICAgICBmaWxlIDxzYW1wPnNhbXBsZS54bWw8L3NhbXA+IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6CiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cHJlPgogJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7CiAmbHQ7YW50bGliJmd0OwotICAgJmx0O3R5cGVkZWYgbmFtZT0iaWYiIGNsYXNzbmFtZT0ib3JnLmFjbWUuYW50LklmIi8mZ3Q7Ci0gICAmbHQ7dHlwZWRlZiBuYW1lPSJzY3JpcHRwYXRobWFwcGVyIgotICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYWNtZS5hbnQuU2NyaXB0UGF0aE1hcHBlciIKLSAgICAgICAgICAgIG9uZXJyb3I9Imlnbm9yZSIvJmd0OwotICAgJmx0O21hY3JvZGVmIG5hbWU9InByaW50IiZndDsKLSAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iZmlsZSIvJmd0OwotICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAmbHQ7Y29uY2F0IHRhc2tuYW1lPSJwcmludCImZ3Q7Ci0gICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iIGluY2x1ZGVzPSJAe2ZpbGV9Ii8mZ3Q7Ci0gICAgICAgICAmbHQ7L2NvbmNhdCZndDsKLSAgICAgICZsdDsvc2VxdWVudGlhbCZndDsKLSAgICZsdDsvbWFjcm9kZWYmZ3Q7Ci0mbHQ7L2FudGxpYiZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICAmbHQ7dHlwZWRlZiBuYW1lPSJpZiIgY2xhc3NuYW1lPSJvcmcuYWNtZS5hbnQuSWYiLyZndDsKKyAgICAmbHQ7dHlwZWRlZiBuYW1lPSJzY3JpcHRwYXRobWFwcGVyIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFjbWUuYW50LlNjcmlwdFBhdGhNYXBwZXIiCisgICAgICAgICAgICAgb25lcnJvcj0iaWdub3JlIi8mZ3Q7CisgICAgJmx0O21hY3JvZGVmIG5hbWU9InByaW50IiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJmaWxlIi8mZ3Q7CisgICAgICAgICZsdDtzZXF1ZW50aWFsJmd0OworICAgICAgICAgICAgJmx0O2NvbmNhdCB0YXNrbmFtZT0icHJpbnQiJmd0OworICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkB7ZmlsZX0iLyZndDsKKyAgICAgICAgICAgICZsdDsvY29uY2F0Jmd0OworICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0Oy9tYWNyb2RlZiZndDsKKyZsdDsvYW50bGliJmd0OzwvcHJlPgogICAgIDxwPgotICAgICAgSXQgZGVmaW5lcyB0d28gdHlwZXMgb3IgdGFza3MsIDxpPmlmPC9pPiBhbmQgPGk+c2NyaXB0cGF0aG1hcHBlcjwvaT4uCi0gICAgICBUaGlzIGFudGxpYiBmaWxlIG1heSBiZSB1c2VkIGluIGEgYnVpbGQgc2NyaXB0IGFzIGZvbGxvd3M6CisgICAgICBJdCBkZWZpbmVzIHR3byB0eXBlcyBvciB0YXNrcywgPGNvZGU+aWY8L2NvZGU+IGFuZCA8Y29kZT5zY3JpcHRwYXRobWFwcGVyPC9jb2RlPi4gIFRoaXMKKyAgICAgIGFudGxpYiBmaWxlIG1heSBiZSB1c2VkIGluIGEgYnVpbGQgc2NyaXB0IGFzIGZvbGxvd3M6CiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KLSZsdDt0eXBlZGVmIGZpbGU9InNhbXBsZS54bWwiLyZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICA8cHJlPiZsdDt0eXBlZGVmIGZpbGU9InNhbXBsZS54bWwiLyZndDs8L3ByZT4KICAgICA8cD4KLSAgICAgIFRoZSBvdGhlciBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gbWF5IGJlIHVzZWQgYXMgd2VsbC4KLSAgICAgIEZvciBleGFtcGxlLCBhc3N1bWluZyB0aGF0IHRoZSA8aT5zYW1wbGUueG1sPC9pPiBpcyBpbiBhIGphcgotICAgICAgZmlsZSA8aT5zYW1wbGUuamFyPC9pPiBhbHNvIGNvbnRhaW5pbmcgdGhlIGNsYXNzZXMsIHRoZQotICAgICAgZm9sbG93aW5nIGJ1aWxkIGZyYWdtZW50IHdpbGwgZGVmaW5lIHRoZSA8aT5pZjwvaT4gYW5kIDxpPnNjcmlwdHBhdGhtYXBwZXI8L2k+Ci0gICAgICB0YXNrcy90eXBlcyBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgbmFtZXNwYWNlIHVyaSA8aT5zYW1wbGVzOi9hY21lLm9yZzwvaT4uCisgICAgICBUaGUgb3RoZXIgYXR0cmlidXRlcyBvZiA8Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+IG1heSBiZSB1c2VkIGFzIHdlbGwuICBGb3IgZXhhbXBsZSwKKyAgICAgIGFzc3VtaW5nIHRoYXQgdGhlIDxzYW1wPnNhbXBsZS54bWw8L3NhbXA+IGlzIGluIGEgamFyIGZpbGUgPHNhbXA+c2FtcGxlLmphcjwvc2FtcD4gYWxzbworICAgICAgY29udGFpbmluZyB0aGUgY2xhc3NlcywgdGhlIGZvbGxvd2luZyBidWlsZCBmcmFnbWVudCB3aWxsIGRlZmluZSB0aGUgPGNvZGU+aWY8L2NvZGU+CisgICAgICBhbmQgPGNvZGU+c2NyaXB0cGF0aG1hcHBlcjwvY29kZT4gdGFza3MvdHlwZXMgYW5kIHBsYWNlIHRoZW0gaW4gdGhlIG5hbWVzcGFjZQorICAgICAgdXJpIDxjb2RlPnNhbXBsZXM6L2FjbWUub3JnPC9jb2RlPi4KICAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cHJlPgorICAgIDxwcmU+CiAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2FjbWUvYW50L3NhbXBsZS54bWwiCi0gICAgICAgICB1cmk9InNhbXBsZXM6L2FjbWUub3JnIi8mZ3Q7Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+CisgICAgICAgICB1cmk9InNhbXBsZXM6L2FjbWUub3JnIi8mZ3Q7PC9wcmU+CiAgICAgPHA+CiAgICAgICBUaGUgZGVmaW5pdGlvbnMgbWF5IHRoZW4gYmUgdXNlZCBhcyBmb2xsb3dzOgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDtzYW1wbGU6aWYgdmFsdWV0cnVlPSIke3Byb3BzfSIgeG1sbnM6c2FtcGxlPSJzYW1wbGVzOi9hY21lLm9yZyImZ3Q7Ci0gICAmbHQ7c2FtcGxlOnNjcmlwdHBhdGhtYXBwZXIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCImZ3Q7Ci0gICAgICBzb21lIGJlYW4gc2hlbGwKLSAgICZsdDsvc2FtcGxlOnNjcmlwdHBhdGhtYXBwZXImZ3Q7Ci0mbHQ7L3NhbXBsZTppZiZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICAmbHQ7c2FtcGxlOnNjcmlwdHBhdGhtYXBwZXIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCImZ3Q7CisgICAgICAgIHNvbWUgYmVhbiBzaGVsbAorICAgICZsdDsvc2FtcGxlOnNjcmlwdHBhdGhtYXBwZXImZ3Q7CismbHQ7L3NhbXBsZTppZiZndDs8L3ByZT4KIAotCi0gICAgPGgzPjxhIG5hbWU9ImFudGxpYm5hbWVzcGFjZSI+QW50bGliIG5hbWVzcGFjZTwvYT48L2gzPgorICAgIDxoMyBpZD0iYW50bGlibmFtZXNwYWNlIj5BbnRsaWIgbmFtZXNwYWNlPC9oMz4KICAgICA8cD4KLSAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSXMgd2l0aCB0aGUgcGF0dGVybiA8Yj5hbnRsaWI6PGk+amF2YSBwYWNrYWdlPC9pPjwvYj4KLSAgICAgIGFyZSBnaXZlbiBzcGVjaWFsIHRyZWF0bWVudC4KKyAgICAgIFRoZSBuYW1lIHNwYWNlIFVSSXMgd2l0aCB0aGUgcGF0dGVybiA8Y29kZT5hbnRsaWI6PGk+amF2YS5wYWNrYWdlPC9pPjwvY29kZT4gYXJlIGdpdmVuCisgICAgICBzcGVjaWFsIHRyZWF0bWVudC4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBXaGVuIEFudCBlbmNvdW50ZXJzIGEgZWxlbWVudCB3aXRoIGEgbmFtZXNwYWNlIFVSSSB3aXRoIHRoaXMgcGF0dGVybiwgaXQKLSAgICAgIHdpbGwgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgcmVzb3VyY2Ugb2YgdGhlIG5hbWUgPGk+YW50bGliLnhtbDwvaT4gaW4KLSAgICAgIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpbiB0aGUgZGVmYXVsdCBjbGFzc3BhdGguCisgICAgICBXaGVuIEFudCBlbmNvdW50ZXJzIGEgZWxlbWVudCB3aXRoIGEgbmFtZXNwYWNlIFVSSSB3aXRoIHRoaXMgcGF0dGVybiwgaXQgd2lsbCBjaGVjayB0byBzZWUKKyAgICAgIGlmIHRoZXJlIGlzIGEgcmVzb3VyY2Ugb2YgdGhlIG5hbWUgPHNhbXA+YW50bGliLnhtbDwvc2FtcD4gaW4gdGhlIHBhY2thZ2UgZGlyZWN0b3J5IGluIHRoZQorICAgICAgZGVmYXVsdCBjbGFzc3BhdGguCiAgICAgPC9wPgogICAgIDxwPgotICAgICAgRm9yIGV4YW1wbGUsIGFzc3VtaW5nIHRoYXQgdGhlIGZpbGUgPGk+YW50Y29udHJpYi5qYXI8L2k+IGhhcyBiZWVuIHBsYWNlZAotICAgICAgaW4gdGhlIGRpcmVjdG9yeSA8aT4ke2FudC5ob21lfS9saWI8L2k+IGFuZCBpdCBjb250YWlucyB0aGUgcmVzb3VyY2UKLSAgICAgIDxpPm5ldC9zZi9hbnRjb250cmliL2FudGxpYi54bWw8L2k+IHdoaWNoIGhhcyBhbGwgYW50Y29udHJpYidzIGRlZmluaXRpb25zCi0gICAgICBkZWZpbmVkLCB0aGUgZm9sbG93aW5nIGJ1aWxkIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIGFudGNvbnRyaWIKLSAgICAgIGRlZmluaXRpb25zIGF0IGxvY2F0aW9uIDxpPkhFUkU8L2k+OgorICAgICAgRm9yIGV4YW1wbGUsIGFzc3VtaW5nIHRoYXQgdGhlIGZpbGUgPHNhbXA+YW50Y29udHJpYi5qYXI8L3NhbXA+IGhhcyBiZWVuIHBsYWNlZCBpbiB0aGUKKyAgICAgIGRpcmVjdG9yeSA8c2FtcD4ke2FudC5ob21lfS9saWI8L3NhbXA+IGFuZCBpdCBjb250YWlucyB0aGUKKyAgICAgIHJlc291cmNlIDxzYW1wPm5ldC9zZi9hbnRjb250cmliL2FudGxpYi54bWw8L3NhbXA+IHdoaWNoIGhhcyBhbGwgYW50Y29udHJpYidzIGRlZmluaXRpb25zCisgICAgICBkZWZpbmVkLCB0aGUgZm9sbG93aW5nIGJ1aWxkIGZpbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGxvYWQgdGhlIGFudGNvbnRyaWIgZGVmaW5pdGlvbnMgYXQKKyAgICAgIGxvY2F0aW9uIDxjb2RlPkhFUkU8L2NvZGU+OgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDtwcm9qZWN0IGRlZmF1bHQ9ImRlbGV0ZXRlc3QiIHhtbG5zOmFudGNvbnRyaWI9ImFudGxpYjpuZXQuc2YuYW50Y29udHJpYiImZ3Q7Ci0gICAmbHQ7bWFjcm9kZWYgbmFtZT0ic2hvd2RpciImZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImRpciIvJmd0OwotICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICAmbHQ7YW50Y29udHJpYjpzaGVsbHNjcmlwdCBzaGVsbD0iYmFzaCImZ3Q7ICAmbHQ7IS0tIEhFUkUgLS0mZ3Q7Ci0gICAgICAgICAgICBscyAtUmwgQHtkaXJ9Ci0gICAgICAgICAmbHQ7L2FudGNvbnRyaWI6c2hlbGxzY3JpcHQmZ3Q7Ci0gICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICAmbHQ7L21hY3JvZGVmJmd0OworICAgICZsdDttYWNyb2RlZiBuYW1lPSJzaG93ZGlyIiZndDsKKyAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJkaXIiLyZndDsKKyAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAgICAmbHQ7YW50Y29udHJpYjpzaGVsbHNjcmlwdCBzaGVsbD0iYmFzaCImZ3Q7ICAmbHQ7IS0tIEhFUkUgLS0mZ3Q7CisgICAgICAgICAgICAgICAgbHMgLVJsIEB7ZGlyfQorICAgICAgICAgICAgJmx0Oy9hbnRjb250cmliOnNoZWxsc2NyaXB0Jmd0OworICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0Oy9tYWNyb2RlZiZndDsKIAotICAgJmx0O3RhcmdldCBuYW1lPSJkZWxldGV0ZXN0IiZndDsKLSAgICAgICZsdDtkZWxldGUgZGlyPSJhIiBxdWlldD0ieWVzIi8mZ3Q7Ci0gICAgICAmbHQ7bWtkaXIgZGlyPSJhL2IiLyZndDsKLSAgICAgICZsdDt0b3VjaCBmaWxlPSJhL2EudHh0Ii8mZ3Q7Ci0gICAgICAmbHQ7dG91Y2ggZmlsZT0iYS9iL2IudHh0Ii8mZ3Q7Ci0gICAgICAmbHQ7ZGVsZXRlJmd0OwotICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJhIi8mZ3Q7Ci0gICAgICAmbHQ7L2RlbGV0ZSZndDsKLSAgICAgICZsdDtzaG93ZGlyIGRpcj0iYSIvJmd0OwotICAgJmx0Oy90YXJnZXQmZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+CisgICAgJmx0O3RhcmdldCBuYW1lPSJkZWxldGV0ZXN0IiZndDsKKyAgICAgICAgJmx0O2RlbGV0ZSBkaXI9ImEiIHF1aWV0PSJ5ZXMiLyZndDsKKyAgICAgICAgJmx0O21rZGlyIGRpcj0iYS9iIi8mZ3Q7CisgICAgICAgICZsdDt0b3VjaCBmaWxlPSJhL2EudHh0Ii8mZ3Q7CisgICAgICAgICZsdDt0b3VjaCBmaWxlPSJhL2IvYi50eHQiLyZndDsKKyAgICAgICAgJmx0O2RlbGV0ZSZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iYSIvJmd0OworICAgICAgICAmbHQ7L2RlbGV0ZSZndDsKKyAgICAgICAgJmx0O3Nob3dkaXIgZGlyPSJhIi8mZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAgICAgPHA+Ci0gICAgICBUaGUgcmVxdWlyZW1lbnQgdGhhdCB0aGUgcmVzb3VyY2UgaXMgaW4gdGhlIGRlZmF1bHQgY2xhc3NwYXRoCi0gICAgICBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgQW50LjwvcD4KKyAgICAgIFRoZSByZXF1aXJlbWVudCB0aGF0IHRoZSByZXNvdXJjZSBpcyBpbiB0aGUgZGVmYXVsdCBjbGFzc3BhdGggbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlCisgICAgICB2ZXJzaW9ucyBvZiBBbnQuCiAgICAgPC9wPgotCi0KLQk8aDM+PGEgbmFtZT0ibG9hZEZyb21JbnNpZGUiPkxvYWQgYW50bGliIGZyb20gaW5zaWRlIG9mIHRoZSBidWlsZGZpbGU8L2E+PC9oMz4KLQk8cD4KLQkgIElmIHlvdSB3YW50IHRvIHNlcGFyYXRlIHRoZSBhbnRsaWIgZnJvbSB5b3VyIGxvY2FsIEFudCBpbnN0YWxsYXRpb24sIGUuZy4gYmVjYXVzZSB5b3UgCi0JICB3YW50IHRvIGhvbGQgdGhhdCBqYXIgaW4geW91ciBwcm9qZWN0cyBTQ00gc3lzdGVtLCB5b3UgaGF2ZSB0byBzcGVjaWZ5IGEgY2xhc3NwYXRoLCBzbyAKLQkgIHRoYXQgQW50IGNvdWxkIGZpbmQgdGhhdCBqYXIuIFRoZSBiZXN0IHNvbHV0aW9uIGlzIGxvYWRpbmcgdGhlIGFudGxpYiB3aXRoIDx0dD4mbHQ7dGFza2RlZiZndDs8L3R0Pi4KLQk8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cHJlPgotJmx0O3Byb2plY3QgeG1sbnM6PGZvbnQgY29sb3I9ImdyZWVuIj5hbnRjb250cmliPC9mb250Pj0iPGZvbnQgY29sb3I9InJlZCI+YW50bGliOm5ldC5zZi5hbnRjb250cmliPC9mb250PiImZ3Q7Ci0gICAmbHQ7dGFza2RlZiB1cmk9Ijxmb250IGNvbG9yPSJyZWQiPmFudGxpYjpuZXQuc2YuYW50Y29udHJpYjwvZm9udD4iCi0gICAgICAgICAgICByZXNvdXJjZT0ibmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCIKLSAgICAgICAgICAgIGNsYXNzcGF0aD0icGF0aC90by9hbnQtY29udHJpYi5qYXIiLyZndDsKLSAgIAotICAgJmx0O3RhcmdldCBuYW1lPSJpdGVyYXRlIiZndDsKLSAgICAgICZsdDs8Zm9udCBjb2xvcj0iZ3JlZW4iPmFudGNvbnRyaWI8L2ZvbnQ+OmZvciBwYXJhbT0iZmlsZSImZ3Q7Ci0gICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Ii4iLyZndDsKLSAgICAgICAgICZsdDtzZXF1ZW50aWFsJmd0OwotICAgICAgICAgICAgJmx0O2VjaG8gbWVzc2FnZT0iLSBAe2ZpbGV9Ii8mZ3Q7Ci0gICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAmbHQ7L2FudGNvbnRyaWI6Zm9yJmd0OwotICAgJmx0Oy90YXJnZXQmZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0KLQkKLQkKLQotICAgIDxoMz48YSBuYW1lPSJjdXJyZW50bmFtZXNwYWNlIj5DdXJyZW50IG5hbWVzcGFjZTwvYT48L2gzPgorICAgIDxoMyBpZD0ibG9hZEZyb21JbnNpZGUiPkxvYWQgYW50bGliIGZyb20gaW5zaWRlIG9mIHRoZSBidWlsZGZpbGU8L2gzPgogICAgIDxwPgotICAgICAgRGVmaW5pdGlvbnMgZGVmaW5lZCBpbiBhbnRsaWJzIG1heSBiZSB1c2VkIGluIGFudGxpYnMuIEhvd2V2ZXIKLSAgICAgIHRoZSBuYW1lc3BhY2UgdGhhdCBkZWZpbml0aW9ucyBhcmUgcGxhY2VkIGluIGFyZSBkZXBlbmRlbnQgb24KLSAgICAgIHRoZSA8Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+IHRoYXQgdXNlcyB0aGUgYW50bGliLiBUbyBkZWFsIHdpdGggdGhpcwotICAgICAgcHJvYmxlbSwgdGhlIGRlZmluaXRpb25zIGFyZSBwbGFjZWQgaW4gdGhlIG5hbWVzcGFjZSBVUkkgPGk+YW50OmN1cnJlbnQ8L2k+Ci0gICAgICBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBhbnRsaWIgZXhlY3V0aW9uLgotICAgICAgRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBhbnRsaWIgZGVmaW5lcyB0aGUgdGFzayA8Y29kZT4mbHQ7aWYmZ3Q7PC9jb2RlPiwgdGhlCi0gICAgICB0eXBlIDxjb2RlPiZsdDtpc2FsbG93ZWQmZ3Q7PC9jb2RlPiBhbmQgYSBtYWNybwotICAgICAgPGNvZGU+Jmx0O2lmYWxsb3dlZCZndDs8L2NvZGU+IHRoYXQgbWFrZXMgdXNlIG9mIHRoZSB0YXNrIGFuZCB0eXBlOgorICAgICAgSWYgeW91IHdhbnQgdG8gc2VwYXJhdGUgdGhlIGFudGxpYiBmcm9tIHlvdXIgbG9jYWwgQW50IGluc3RhbGxhdGlvbiwgZS5nLiBiZWNhdXNlIHlvdSB3YW50CisgICAgICB0byBob2xkIHRoYXQgamFyIGluIHlvdXIgcHJvamVjdCdzIFNDTSBzeXN0ZW0sIHlvdSBoYXZlIHRvIHNwZWNpZnkgYSBjbGFzc3BhdGgsIHNvIHRoYXQKKyAgICAgIEFudCBjb3VsZCBmaW5kIHRoYXQgamFyLiBUaGUgYmVzdCBzb2x1dGlvbiBpcyBsb2FkaW5nIHRoZSBhbnRsaWIKKyAgICAgIHdpdGggPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPi4KICAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cHJlPgorICAgIDxwcmU+CismbHQ7cHJvamVjdCB4bWxuczo8c3BhbiBzdHlsZT0iY29sb3I6Z3JlZW4iPmFudGNvbnRyaWI8L3NwYW4+PSI8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj5hbnRsaWI6bmV0LnNmLmFudGNvbnRyaWI8L3NwYW4+IiZndDsKKyAgICAmbHQ7dGFza2RlZiB1cmk9IjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPmFudGxpYjpuZXQuc2YuYW50Y29udHJpYjwvc3Bhbj4iCisgICAgICAgICAgICAgcmVzb3VyY2U9Im5ldC9zZi9hbnRjb250cmliL2FudGxpYi54bWwiCisgICAgICAgICAgICAgY2xhc3NwYXRoPSJwYXRoL3RvL2FudC1jb250cmliLmphciIvJmd0OworCisgICAgJmx0O3RhcmdldCBuYW1lPSJpdGVyYXRlIiZndDsKKyAgICAgICAgJmx0OzxzcGFuIHN0eWxlPSJjb2xvcjpncmVlbiI+YW50Y29udHJpYjwvc3Bhbj46Zm9yIHBhcmFtPSJmaWxlIiZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iLiIvJmd0OworICAgICAgICAgICAgJmx0O3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2VjaG8gbWVzc2FnZT0iLSBAe2ZpbGV9Ii8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgICAgICZsdDsvYW50Y29udHJpYjpmb3ImZ3Q7CisgICAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CisgICAgPGgzIGlkPSJjdXJyZW50bmFtZXNwYWNlIj5DdXJyZW50IG5hbWVzcGFjZTwvaDM+CisgICAgPHA+CisgICAgICBEZWZpbml0aW9ucyBkZWZpbmVkIGluIGFudGxpYnMgbWF5IGJlIHVzZWQgaW4gYW50bGlicy4gSG93ZXZlciwgdGhlIG5hbWVzcGFjZSB0aGF0CisgICAgICBkZWZpbml0aW9ucyBhcmUgcGxhY2VkIGluIGFyZSBkZXBlbmRlbnQgb24gdGhlIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gdGhhdCB1c2VzIHRoZQorICAgICAgYW50bGliLiBUbyBkZWFsIHdpdGggdGhpcyBwcm9ibGVtLCB0aGUgZGVmaW5pdGlvbnMgYXJlIHBsYWNlZCBpbiB0aGUgbmFtZXNwYWNlCisgICAgICBVUkkgPGNvZGU+YW50OmN1cnJlbnQ8L2NvZGU+IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFudGxpYiBleGVjdXRpb24uICBGb3IgZXhhbXBsZSwgdGhlCisgICAgICBmb2xsb3dpbmcgYW50bGliIGRlZmluZXMgdGhlIHRhc2sgPGNvZGU+Jmx0O2lmJmd0OzwvY29kZT4sIHRoZQorICAgICAgdHlwZSA8Y29kZT4mbHQ7aXNhbGxvd2VkJmd0OzwvY29kZT4gYW5kIGEgbWFjcm8gPGNvZGU+Jmx0O2lmYWxsb3dlZCZndDs8L2NvZGU+IHRoYXQgbWFrZXMKKyAgICAgIHVzZSBvZiB0aGUgdGFzayBhbmQgdHlwZToKKyAgICA8L3A+CisgICAgPHByZT4KICZsdDthbnRsaWIgeG1sbnM6Y3VycmVudD0iYW50OmN1cnJlbnQiJmd0OwotICAgJmx0O3Rhc2tkZWYgbmFtZT0iaWYiIGNsYXNzbmFtZT0ib3JnLmFjbWUuYW50LklmIi8mZ3Q7Ci0gICAmbHQ7dHlwZWRlZiBuYW1lPSJpc2FsbG93ZWQiIGNsYXNzbmFtZT0ib3JnLmFjbWUuYW50LklzYWxsb3dlZCIvJmd0OwotICAgJmx0O21hY3JvZGVmIG5hbWU9ImlmYWxsb3dlZCImZ3Q7Ci0gICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIvJmd0OwotICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iZG8iLyZndDsKLSAgICAgICZsdDtzZXF1ZW50aWFsJmd0OwotICAgICAgICAgJmx0O2N1cnJlbnQ6aWYmZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y3VycmVudDppc2FsbG93ZWQgdGVzdD0iQHthY3Rpb259Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y3VycmVudDp0aGVuJmd0OwotICAgICAgICAgICAgICAgJmx0O2RvLyZndDsKLSAgICAgICAgICAgICZsdDsvY3VycmVudDp0aGVuJmd0OwotICAgICAgICAgJmx0Oy9jdXJyZW50OmlmJmd0OwotICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OwotICAgJmx0Oy9tYWNyb2RlZiZndDsKLSZsdDsvYW50bGliJmd0OwotICAgICAgPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotCi0KKyAgICAmbHQ7dGFza2RlZiBuYW1lPSJpZiIgY2xhc3NuYW1lPSJvcmcuYWNtZS5hbnQuSWYiLyZndDsKKyAgICAmbHQ7dHlwZWRlZiBuYW1lPSJpc2FsbG93ZWQiIGNsYXNzbmFtZT0ib3JnLmFjbWUuYW50LklzYWxsb3dlZCIvJmd0OworICAgICZsdDttYWNyb2RlZiBuYW1lPSJpZmFsbG93ZWQiJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImFjdGlvbiIvJmd0OworICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJkbyIvJmd0OworICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICAgICZsdDtjdXJyZW50OmlmJmd0OworICAgICAgICAgICAgICAgICZsdDtjdXJyZW50OmlzYWxsb3dlZCB0ZXN0PSJAe2FjdGlvbn0iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7Y3VycmVudDp0aGVuJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7ZG8vJmd0OworICAgICAgICAgICAgICAgICZsdDsvY3VycmVudDp0aGVuJmd0OworICAgICAgICAgICAgJmx0Oy9jdXJyZW50OmlmJmd0OworICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7CisgICAgJmx0Oy9tYWNyb2RlZiZndDsKKyZsdDsvYW50bGliJmd0OzwvcHJlPgogICAgIDxoMz5PdGhlciBleGFtcGxlcyBhbmQgY29tbWVudHM8L2gzPgogICAgIDxwPgogICAgICAgQW50bGlicyBtYXkgbWFrZSB1c2Ugb2Ygb3RoZXIgYW50bGlicy4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBBcyB0aGUgbmFtZXMgZGVmaW5lZCBpbiB0aGUgYW50bGliIGFyZSBpbiB0aGUgbmFtZXNwYWNlIHVyaSBhcwotICAgICAgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gb3IgYnkgYXV0b21hdGljIGVsZW1lbnQKLSAgICAgIHJlc29sdXRpb24sIG9uZSBtYXkgcmV1c2UgbmFtZXMgZnJvbSBjb3JlIGFudCB0eXBlcyBhbmQgdGFza3MsCi0gICAgICBwcm92aWRlZCB0aGUgY2FsbGVyIHVzZXMgYSBuYW1lc3BhY2UgdXJpLiBGb3IgZXhhbXBsZSwgdGhlCi0gICAgICBmb2xsb3dpbmcgYW50bGliIG1heSBiZSB1c2VkIHRvIGRlZmluZSBkZWZhdWx0cyBmb3IgdmFyaW91cwotICAgICAgdGFza3M6CisgICAgICBBcyB0aGUgbmFtZXMgZGVmaW5lZCBpbiB0aGUgYW50bGliIGFyZSBpbiB0aGUgbmFtZXNwYWNlIFVSSSBhcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICBjYWxsaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gb3IgYnkgYXV0b21hdGljIGVsZW1lbnQgcmVzb2x1dGlvbiwgb25lIG1heSByZXVzZQorICAgICAgbmFtZXMgZnJvbSBjb3JlIEFudCB0eXBlcyBhbmQgdGFza3MsIHByb3ZpZGVkIHRoZSBjYWxsZXIgdXNlcyBhIG5hbWVzcGFjZSBVUkkuIEZvcgorICAgICAgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBhbnRsaWIgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGRlZmF1bHRzIGZvciB2YXJpb3VzIHRhc2tzOgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDthbnRsaWIgeG1sbnM6YW50Y29udHJpYj0iYW50bGliOm5ldC5zZi5hbnRjb250cmliIiZndDsKLSAgICZsdDtwcmVzZXRkZWYgbmFtZT0iamF2YWMiJmd0OwotICAgICAgJmx0O2phdmFjIGRlcHJlY2F0aW9uPSIke2RlcHJlY2F0aW9ufSIKLSAgICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLyZndDsKLSAgICZsdDsvcHJlc2V0ZGVmJmd0OwotICAgJmx0O3ByZXNldGRlZiBuYW1lPSJkZWxldGUiJmd0OwotICAgICAgJmx0O2RlbGV0ZSBxdWlldD0ieWVzIi8mZ3Q7Ci0gICAmbHQ7L3ByZXNldGRlZiZndDsKLSAgICZsdDtwcmVzZXRkZWYgbmFtZT0ic2hlbGxzY3JpcHQiJmd0OwotICAgICAgJmx0O2FudGNvbnRyaWI6c2hlbGxzY3JpcHQgc2hlbGw9ImJhc2giLyZndDsKLSAgICZsdDsvcHJlc2V0ZGVmJmd0OwotJmx0Oy9hbnRsaWImZ3Q7Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+CisgICAgJmx0O3ByZXNldGRlZiBuYW1lPSJqYXZhYyImZ3Q7CisgICAgICAgICZsdDtqYXZhYyBkZXByZWNhdGlvbj0iJHtkZXByZWNhdGlvbn0iCisgICAgICAgICAgICAgICBkZWJ1Zz0iJHtkZWJ1Z30iLyZndDsKKyAgICAmbHQ7L3ByZXNldGRlZiZndDsKKyAgICAmbHQ7cHJlc2V0ZGVmIG5hbWU9ImRlbGV0ZSImZ3Q7CisgICAgICAgICZsdDtkZWxldGUgcXVpZXQ9InllcyIvJmd0OworICAgICZsdDsvcHJlc2V0ZGVmJmd0OworICAgICZsdDtwcmVzZXRkZWYgbmFtZT0ic2hlbGxzY3JpcHQiJmd0OworICAgICAgICAmbHQ7YW50Y29udHJpYjpzaGVsbHNjcmlwdCBzaGVsbD0iYmFzaCIvJmd0OworICAgICZsdDsvcHJlc2V0ZGVmJmd0OworJmx0Oy9hbnRsaWImZ3Q7PC9wcmU+CiAgICAgPHA+CiAgICAgICBUaGlzIG1heSBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cHJlPgogJmx0O3Byb2plY3QgeG1sbnM6bG9jYWw9ImxvY2FscHJlc2V0cyImZ3Q7Ci0gICAmbHQ7dHlwZWRlZiBmaWxlPSJsb2NhbHByZXNldHMueG1sIiB1cmk9ImxvY2FscHJlc2V0cyIvJmd0OwotICAgJmx0O2xvY2FsOnNoZWxsc2NyaXB0Jmd0OwotICAgICAgZWNobyAiaGVsbG8gd29ybGQiCi0gICAmbHQ7L2xvY2FsOnNoZWxsc2NyaXB0Jmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotICAgICAgPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIAotCisgICAgJmx0O3R5cGVkZWYgZmlsZT0ibG9jYWxwcmVzZXRzLnhtbCIgdXJpPSJsb2NhbHByZXNldHMiLyZndDsKKyAgICAmbHQ7bG9jYWw6c2hlbGxzY3JpcHQmZ3Q7CisgICAgICAgIGVjaG8gImhlbGxvIHdvcmxkIgorICAgICZsdDsvbG9jYWw6c2hlbGxzY3JpcHQmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL2Fzc2VydGlvbnMuaHRtbCBiL21hbnVhbC9UeXBlcy9hc3NlcnRpb25zLmh0bWwKaW5kZXggZTE2ODk2OS4uMzNlODExZiAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL2Fzc2VydGlvbnMuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvYXNzZXJ0aW9ucy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTk1ICsxNSwxNzQgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFzc2VydGlvbnMgdHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iYXNzZXJ0aW9ucyI+QXNzZXJ0aW9uczwvYT48L2gyPgorPGgyIGlkPSJhc3NlcnRpb25zIj5Bc3NlcnRpb25zPC9oMj4KIDxwPgotVGhlIDx0dD5hc3NlcnRpb25zPC90dD4gdHlwZSBlbmFibGVzIG9yIGRpc2FibGVzIHRoZSBKYXZhIDEuNCBhc3NlcnRpb25zIGZlYXR1cmUsCi1vbiBhIHdob2xlIEphdmEgcHJvZ3JhbSwgb3IgY29tcG9uZW50cyBvZiBhIHByb2dyYW0uIEl0IGNhbiBiZSB1c2VkCi1pbiA8YSBocmVmPSIuLi9UYXNrcy9qYXZhLmh0bWwiPjxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT48L2E+IGFuZAotPGEgaHJlZj0iLi4vVGFza3MvanVuaXQuaHRtbCI+PGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT48L2E+IHRvIGFkZCBleHRyYSB2YWxpZGF0aW9uIHRvIGNvZGUuICAKK1RoZSA8Y29kZT5hc3NlcnRpb25zPC9jb2RlPiB0eXBlIGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEphdmEgMS40IGFzc2VydGlvbnMgZmVhdHVyZSwgb24gYSB3aG9sZQorSmF2YSBwcm9ncmFtLCBvciBjb21wb25lbnRzIG9mIGEgcHJvZ3JhbS4gSXQgY2FuIGJlIHVzZWQKK2luIDxhIGhyZWY9Ii4uL1Rhc2tzL2phdmEuaHRtbCI+PGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPjwvYT4KK2FuZCA8YSBocmVmPSIuLi9UYXNrcy9qdW5pdC5odG1sIj48Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPjwvYT4gdG8gYWRkIGV4dHJhIHZhbGlkYXRpb24gdG8gY29kZS4KIAogPHA+Ci1Bc3NlcnRpb25zIGFyZSBjb3ZlcmVkIGluIHRoZSAKLTxhIGhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2xhbmd1YWdlL2Fzc2VydC5odG1sIj5KYXZhIFNFIGRvY3VtZW50YXRpb248L2E+LAotYW5kIHRoZQotPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlNy9odG1sL2pscy0xNC5odG1sI2pscy0xNC4xMCI+SmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uPC9hPi4KK0Fzc2VydGlvbnMgYXJlIGNvdmVyZWQgaW4KK3RoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvbGFuZ3VhZ2UvYXNzZXJ0Lmh0bWwiCit0YXJnZXQ9Il90b3AiPkphdmEgU0UgZG9jdW1lbnRhdGlvbjwvYT4sIGFuZAordGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy9qbHMvc2U4L2h0bWwvamxzLTE0Lmh0bWwjamxzLTE0LjEwIgordGFyZ2V0PSJfdG9wIj5KYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb248L2E+LgogCiA8cD4KLVRoZSBrZXkgcG9pbnRzIHRvIG5vdGUgYXJlIHRoYXQgYSA8dHQ+amF2YS5sYW5nLkFzc2VydGlvbkVycm9yPC90dD4KLWlzIHRocm93biB3aGVuIGFuIGFzc2VydGlvbiBmYWlscywgYW5kIHRoYXQgdGhlIGZhY2lsaXR5IGlzIG9ubHkgYXZhaWxhYmxlIAotb24gSmF2YSAxLjQgYW5kIGxhdGVyLiBUbyBlbmFibGUgYXNzZXJ0aW9ucyBvbmUgbXVzdCBzZXQgPHR0PnNvdXJjZT0iMS40IjwvdHQ+Ci0ob3IgbGF0ZXIpIGluIDx0dD4mbHQ7amF2YWMmZ3Q7PC90dD4gd2hlbiB0aGUgc291cmNlIGlzIGJlaW5nIGNvbXBpbGVkLCBhbmQKLXRoYXQgdGhlIGNvZGUgbXVzdCBjb250YWluIDx0dD5hc3NlcnQ8L3R0PiBzdGF0ZW1lbnRzIHRvIGJlIHRlc3RlZC4gVGhlCi1yZXN1bHQgb2Ygc3VjaCBhbiBhY3Rpb24gaXMgY29kZSB0aGF0IG5laXRoZXIgY29tcGlsZXMgb3IgcnVucyBvbiBlYXJsaWVyCi12ZXJzaW9ucyBvZiBKYXZhLiBGb3IgdGhpcyByZWFzb24gQXBhY2hlIEFudCBpdHNlbGYgY3VycmVudGx5IGNvbnRhaW5zIG5vIGFzc2VydGlvbnMuCitUaGUga2V5IHBvaW50cyB0byBub3RlIGFyZSB0aGF0IGEgPGNvZGU+amF2YS5sYW5nLkFzc2VydGlvbkVycm9yPC9jb2RlPiBpcyB0aHJvd24gd2hlbiBhbiBhc3NlcnRpb24KK2ZhaWxzLCBhbmQgdGhhdCB0aGUgZmFjaWxpdHkgaXMgb25seSBhdmFpbGFibGUgb24gSmF2YSAxLjQgYW5kIGxhdGVyLiBUbyBlbmFibGUgYXNzZXJ0aW9ucyBvbmUgbXVzdAorc2V0IDx2YXI+c291cmNlPC92YXI+PTxxPjEuNDwvcT4gKG9yIGxhdGVyKSBpbiA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiB3aGVuIHRoZSBzb3VyY2UgaXMgYmVpbmcKK2NvbXBpbGVkLCBhbmQgdGhhdCB0aGUgY29kZSBtdXN0IGNvbnRhaW4gPGNvZGU+YXNzZXJ0PC9jb2RlPiBzdGF0ZW1lbnRzIHRvIGJlIHRlc3RlZC4gVGhlIHJlc3VsdCBvZgorc3VjaCBhbiBhY3Rpb24gaXMgY29kZSB0aGF0IG5laXRoZXIgY29tcGlsZXMgb3IgcnVucyBvbiBlYXJsaWVyIHZlcnNpb25zIG9mIEphdmEuIEZvciB0aGlzIHJlYXNvbgorQXBhY2hlIEFudCBpdHNlbGYgY3VycmVudGx5IGNvbnRhaW5zIG5vIGFzc2VydGlvbnMuCiA8cD4KIAotV2hlbiBhc3NlcnRpb25zIGFyZSBlbmFibGVkIChvciBkaXNhYmxlZCkgaW4gYSB0YXNrIHRocm91Z2ggbmVzdGVkIAotYXNzZXJ0aW9ucyBlbGVtZW50cywgdGhlIGNsYXNzIGxvYWRlciBvciBjb21tYW5kIGxpbmUgaXMgbW9kaWZpZWQgd2l0aCB0aGUgCi1hcHByb3ByaWF0ZSBvcHRpb25zLiBUaGlzIG1lYW5zIHRoYXQgdGhlIEpWTSBleGVjdXRlZCBtdXN0IGJlIGEgSmF2YSAxLjQKLW9yIGxhdGVyIEpWTSwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZS4gQXR0ZW1wdGluZyB0bwotZW5hYmxlIGFzc2VydGlvbnMgb24gZWFybGllciBWTXMgd2lsbCByZXN1bHQgaW4gYW4gIlVucmVjb2duaXplZCBvcHRpb24iIAotZXJyb3IgYW5kIHRoZSBKVk0gd2lsbCBub3Qgc3RhcnQuICAKLQogPHA+Ci08aDQ+QXR0cmlidXRlczwvaDQ+Ci08cD4KLQotCitXaGVuIGFzc2VydGlvbnMgYXJlIGVuYWJsZWQgKG9yIGRpc2FibGVkKSBpbiBhIHRhc2sgdGhyb3VnaCBuZXN0ZWQgYXNzZXJ0aW9ucyBlbGVtZW50cywgdGhlIGNsYXNzCitsb2FkZXIgb3IgY29tbWFuZCBsaW5lIGlzIG1vZGlmaWVkIHdpdGggdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgSlZNIGV4ZWN1dGVkCittdXN0IGJlIG9mIHZlcnNpb24gMS40IG9yIGxhdGVyLCBldmVuIGlmIHRoZXJlIGFyZSBubyBhc3NlcnRpb25zIGluIHRoZSBjb2RlLiBBdHRlbXB0aW5nIHRvIGVuYWJsZQorYXNzZXJ0aW9ucyBvbiBlYXJsaWVyIEpWTXMgd2lsbCByZXN1bHQgaW4gYW4gIlVucmVjb2duaXplZCBvcHRpb24iIGVycm9yIGFuZCB0aGUgSlZNIHdpbGwgbm90IHN0YXJ0LgogPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKworPGg0PkF0dHJpYnV0ZXM8L2g0PgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuYWJsZVN5c3RlbUFzc2VydGlvbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+RmxhZyB0byB0dXJuIHN5c3RlbSBhc3NlcnRpb25zIG9uIG9yIG9mZi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm87IGRlZmF1bHQgaXMgInVuc3BlY2lmaWVkIjwvdGQ+CisgICAgPHRkPmVuYWJsZVN5c3RlbUFzc2VydGlvbnM8L3RkPgorICAgIDx0ZD5GbGFnIHRvIHR1cm4gc3lzdGVtIGFzc2VydGlvbnMgb24gb3Igb2ZmLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnVuc3BlY2lmaWVkPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+Ci1XaGVuIHN5c3RlbSBhc3NlcnRpb25zIGhhdmUgYmVlbiBuZWl0aGVyIGVuYWJsZWQgbm9yIGRpc2FibGVkLCB0aGVuCi10aGUgSlZNIGlzIG5vdCBnaXZlbiBhbnkgYXNzZXJ0aW9uIGluZm9ybWF0aW9uIC0gdGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZQotIGN1cnJlbnQgSlZNcyBpcyB0byBkaXNhYmxlIHN5c3RlbSBhc3NlcnRpb25zLiAKK1doZW4gc3lzdGVtIGFzc2VydGlvbnMgaGF2ZSBiZWVuIG5laXRoZXIgZW5hYmxlZCBub3IgZGlzYWJsZWQsIHRoZW4gdGhlIEpWTSBpcyBub3QgZ2l2ZW4gYW55Cithc3NlcnRpb24gaW5mb3JtYXRpb24mbWRhc2g7dGhlIGRlZmF1bHQgYWN0aW9uIG9mIHRoZSBjdXJyZW50IEpWTXMgaXMgdG8gZGlzYWJsZSBzeXN0ZW0gYXNzZXJ0aW9ucy4KKzwvcD4KIDxwPgotTm90ZSBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gYXBwYXJlbnQgZG9jdW1lbnRhdGlvbiBmb3Igd2hhdCBwYXJ0cyBvZiB0aGUKLUpSRSBjb21lIHdpdGggdXNlZnVsIGFzc2VydGlvbnMuCitOb3RlIGFsc28gdGhhdCB0aGVyZSBpcyBubyBhcHBhcmVudCBkb2N1bWVudGF0aW9uIGZvciB3aGF0IHBhcnRzIG9mIHRoZSBKUkUgY29tZSB3aXRoIHVzZWZ1bAorYXNzZXJ0aW9ucy4KKzwvcD4KIAogPGgzPk5lc3RlZCBlbGVtZW50czwvaDM+CiAKIDxoND5lbmFibGU8L2g0PgogPHA+Ci1FbmFibGUgYXNzZXJ0aW9ucyBpbiBwb3J0aW9ucyBvZiBjb2RlLgotSWYgbmVpdGhlciBhIHBhY2thZ2Ugbm9yIGNsYXNzIGlzIHNwZWNpZmllZCwgYXNzZXJ0aW9ucyBhcmUgdHVybmVkIG9uIGluIDxpPmFsbDwvaT4gKHVzZXIpIGNvZGUuCitFbmFibGUgYXNzZXJ0aW9ucyBpbiBwb3J0aW9ucyBvZiBjb2RlLiAgSWYgbmVpdGhlciBhIHBhY2thZ2Ugbm9yIGNsYXNzIGlzIHNwZWNpZmllZCwgYXNzZXJ0aW9ucyBhcmUKK3R1cm5lZCBvbiBpbiA8ZW0+YWxsPC9lbT4gKHVzZXIpIGNvZGUuCiA8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgY2xhc3Mgb24gd2hpY2ggdG8gZW5hYmxlIGFzc2VydGlvbnMuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Y2xhc3M8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIGNsYXNzIG9uIHdoaWNoIHRvIGVuYWJsZSBhc3NlcnRpb25zLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICBUaGUgbmFtZSBvZiBhIHBhY2thZ2UgaW4gd2hpY2ggdG8gZW5hYmxlIGFzc2VydGlvbnMgb24gYWxsIGNsYXNzZXMuIChJbmNsdWRlcyBzdWJwYWNrYWdlcy4pCi0gICAgVXNlICI8dHQ+Li4uPC90dD4iIGZvciB0aGUgYW5vbnltb3VzIHBhY2thZ2UuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cGFja2FnZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgcGFja2FnZSBpbiB3aGljaCB0byBlbmFibGUgYXNzZXJ0aW9ucyBvbiBhbGwgY2xhc3Nlcy4gKEluY2x1ZGVzIHN1YnBhY2thZ2VzLikKKyAgICAgIFVzZSA8cT4uLi48L3E+IGZvciB0aGUgYW5vbnltb3VzIHBhY2thZ2UuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGg0PmRpc2FibGU8L2g0PgogPHA+CiBEaXNhYmxlIGFzc2VydGlvbnMgaW4gcG9ydGlvbnMgb2YgY29kZS4KLQogPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGNsYXNzIG9uIHdoaWNoIHRvIGRpc2FibGUgYXNzZXJ0aW9ucy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jbGFzczwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIGEgY2xhc3Mgb24gd2hpY2ggdG8gZGlzYWJsZSBhc3NlcnRpb25zLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cGFja2FnZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICBUaGUgbmFtZSBvZiBhIHBhY2thZ2UgaW4gd2hpY2ggdG8gZGlzYWJsZSBhc3NlcnRpb25zIG9uIGFsbCBjbGFzc2VzLiAoSW5jbHVkZXMgc3VicGFja2FnZXMuKQotICAgIFVzZSAiPHR0Pi4uLjwvdHQ+IiBmb3IgdGhlIGFub255bW91cyBwYWNrYWdlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnBhY2thZ2U8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHBhY2thZ2UgaW4gd2hpY2ggdG8gZGlzYWJsZSBhc3NlcnRpb25zIG9uIGFsbCBjbGFzc2VzLiAoSW5jbHVkZXMgc3VicGFja2FnZXMuKQorICAgICAgVXNlIDxxPi4uLjwvcT4gZm9yIHRoZSBhbm9ueW1vdXMgcGFja2FnZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+Ci0KLUJlY2F1c2UgYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQgYnkgZGVmYXVsdCwgaXQgb25seSBtYWtlcyBzZW5zZSB0byBkaXNhYmxlCi1hc3NlcnRpb25zIHdoZXJlIHRoZXkgaGF2ZSBiZWVuIGVuYWJsZWQgaW4gYSBwYXJlbnQgcGFja2FnZS4KLQotCitCZWNhdXNlIGFzc2VydGlvbnMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGl0IG9ubHkgbWFrZXMgc2Vuc2UgdG8gZGlzYWJsZSBhc3NlcnRpb25zIHdoZXJlIHRoZXkKK2hhdmUgYmVlbiBlbmFibGVkIGluIGEgcGFyZW50IHBhY2thZ2UuCis8L3A+CiA8aDQ+RXhhbXBsZXM8L2g0PgogCiA8aDU+RXhhbXBsZTogZW5hYmxlIGFzc2VydGlvbnMgaW4gYWxsIHVzZXIgY2xhc3NlczwvaDU+CiAKLUFsbCBjbGFzc2VzIG5vdCBpbiB0aGUgSlJFIChpLmUuIGFsbCBub24tc3lzdGVtIGNsYXNzZXMpIHdpbGwgaGF2ZSBhc3NlcnRpb25zIHR1cm5lZCBvbi4KKzxwPkFsbCBjbGFzc2VzIG5vdCBpbiB0aGUgSlJFIChpLmUuIGFsbCBub24tc3lzdGVtIGNsYXNzZXMpIHdpbGwgaGF2ZSBhc3NlcnRpb25zIHR1cm5lZCBvbi48L3A+CiA8cHJlPgogJmx0O2Fzc2VydGlvbnMmZ3Q7CiAgICZsdDtlbmFibGUvJmd0OwotJmx0Oy9hc3NlcnRpb25zJmd0OwotPC9wcmU+CismbHQ7L2Fzc2VydGlvbnMmZ3Q7PC9wcmU+CiAKIDxoNT5FeGFtcGxlOiBlbmFibGUgYSBzaW5nbGUgY2xhc3M8L2g1PgogCi1FbmFibGUgYXNzZXJ0aW9ucyBpbiBhIGNsYXNzIGNhbGxlZCBUZXN0Cis8cD5FbmFibGUgYXNzZXJ0aW9ucyBpbiBhIGNsYXNzIGNhbGxlZCBUZXN0PC9wPgogPHByZT4KICZsdDthc3NlcnRpb25zJmd0OwogICAmbHQ7ZW5hYmxlIGNsYXNzPSJUZXN0Ii8mZ3Q7Ci0mbHQ7L2Fzc2VydGlvbnMmZ3Q7Ci08L3ByZT4KKyZsdDsvYXNzZXJ0aW9ucyZndDs8L3ByZT4KIAogPGg1PkV4YW1wbGU6IGVuYWJsZSBhIHBhY2thZ2U8L2g1PgogCi1FbmFibGUgYXNzZXJ0aW9ucyBpbiB0aGUgPHR0Pm9yZy5hcGFjaGU8L3R0PiBwYWNrYWdlCi1hbmQgYWxsIHBhY2thZ2VzIHN0YXJ0aW5nIHdpdGggdGhlIDx0dD5vcmcuYXBhY2hlLjwvdHQ+IHByZWZpeAorPHA+RW5hYmxlIGFzc2VydGlvbnMgaW4gdGhlIDxjb2RlPm9yZy5hcGFjaGU8L2NvZGU+IHBhY2thZ2UgYW5kIGFsbCBwYWNrYWdlcyBzdGFydGluZyB3aXRoCit0aGUgPGNvZGU+b3JnLmFwYWNoZS48L2NvZGU+IHByZWZpeDwvcD4KIDxwcmU+CiAmbHQ7YXNzZXJ0aW9ucyZndDsKICAgJmx0O2VuYWJsZSBwYWNrYWdlPSJvcmcuYXBhY2hlIi8mZ3Q7Ci0mbHQ7L2Fzc2VydGlvbnMmZ3Q7Ci08L3ByZT4KKyZsdDsvYXNzZXJ0aW9ucyZndDs8L3ByZT4KIAogPGg1PkV4YW1wbGU6IFN5c3RlbSBhc3NlcnRpb25zPC9oNT4KIAotRXhhbXBsZTogZW5hYmxlIHN5c3RlbSBhc3NlcnRpb25zIGFuZCBhc3NlcnRpb25zIGluIGFsbCA8dHQ+b3JnLmFwYWNoZTwvdHQ+IHBhY2thZ2VzIGV4Y2VwdAotZm9yIEFudCAoYnV0IGluY2x1ZGluZyA8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjwvdHQ+KQorPHA+RW5hYmxlIHN5c3RlbSBhc3NlcnRpb25zIGFuZCBhc3NlcnRpb25zIGluIGFsbCA8Y29kZT5vcmcuYXBhY2hlPC9jb2RlPiBwYWNrYWdlcyBleGNlcHQgZm9yIEFudAorKGJ1dCBpbmNsdWRpbmcgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuTWFpbjwvY29kZT4pPC9wPgogPHByZT4KICZsdDthc3NlcnRpb25zIGVuYWJsZVN5c3RlbUFzc2VydGlvbnM9InRydWUiJmd0OwogICAmbHQ7ZW5hYmxlIHBhY2thZ2U9Im9yZy5hcGFjaGUiLyZndDsKICAgJmx0O2Rpc2FibGUgcGFja2FnZT0ib3JnLmFwYWNoZS50b29scy5hbnQiLyZndDsKICAgJmx0O2VuYWJsZSBjbGFzcz0ib3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiIvJmd0OwotJmx0Oy9hc3NlcnRpb25zJmd0OwotPC9wcmU+CismbHQ7L2Fzc2VydGlvbnMmZ3Q7PC9wcmU+CiAKIDxoNT5FeGFtcGxlOiBkaXNhYmxlZCBhbmQgYW5vbnltb3VzIHBhY2thZ2UgYXNzZXJ0aW9uczwvaDU+CiAKLURpc2FibGUgc3lzdGVtIGFzc2VydGlvbnM7IGVuYWJsZSB0aG9zZSBpbiB0aGUgYW5vbnltb3VzIHBhY2thZ2UKKzxwPkRpc2FibGUgc3lzdGVtIGFzc2VydGlvbnM7IGVuYWJsZSB0aG9zZSBpbiB0aGUgYW5vbnltb3VzIHBhY2thZ2U8L3A+CiA8cHJlPgogJmx0O2Fzc2VydGlvbnMgZW5hYmxlU3lzdGVtQXNzZXJ0aW9ucz0iZmFsc2UiJmd0OwogICAmbHQ7ZW5hYmxlIHBhY2thZ2U9Ii4uLiIvJmd0OwotJmx0Oy9hc3NlcnRpb25zJmd0OwotPC9wcmU+Ci0KKyZsdDsvYXNzZXJ0aW9ucyZndDs8L3ByZT4KIAogPGg1PkV4YW1wbGU6IHJlZmVyZW5jZWQgYXNzZXJ0aW9uczwvaDU+CiAKLVRoaXMgdHlwZSBpcyBhIGRhdGF0eXBlLCBzbyB5b3UgY2FuIGRlY2xhcmUgYXNzZXJ0aW9ucyBhbmQgdXNlIHRoZW0gbGF0ZXIKLQorPHA+VGhpcyB0eXBlIGlzIGEgZGF0YXR5cGUsIHNvIHlvdSBjYW4gZGVjbGFyZSBhc3NlcnRpb25zIGFuZCB1c2UgdGhlbSBsYXRlcjwvcD4KIDxwcmU+CiAmbHQ7YXNzZXJ0aW9ucyBpZD0icHJvamVjdC5hc3NlcnRpb25zIiZndDsKICAgJmx0O2VuYWJsZSBwYWNrYWdlPSJvcmcuYXBhY2hlLnRlc3QiLyZndDsKICZsdDsvYXNzZXJ0aW9ucyZndDsKIAotJmx0O2Fzc2VydGlvbnMgcmVmaWQ9InByb2plY3QuYXNzZXJ0aW9ucyIvJmd0OwotPC9wcmU+Ci0KKyZsdDthc3NlcnRpb25zIHJlZmlkPSJwcm9qZWN0LmFzc2VydGlvbnMiLyZndDs8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL2NsYXNzZmlsZXNldC5odG1sIGIvbWFudWFsL1R5cGVzL2NsYXNzZmlsZXNldC5odG1sCmluZGV4IGE4M2QyNjYuLjIzNmYyMGUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9jbGFzc2ZpbGVzZXQuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvY2xhc3NmaWxlc2V0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDYgKzE1LDk5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+Q2xhc3NGaWxlU2V0IFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KLTxoMj48YSBuYW1lPSJmaWxlc2V0Ij5DbGFzc0ZpbGVTZXQ8L2E+PC9oMj4KLTxwPkEgY2xhc3NmaWxlc2V0IGlzIGEgc3BlY2lhbGl6ZWQgdHlwZSBvZiBmaWxlc2V0IHdoaWNoLCBnaXZlbiBhIHNldCBvZiAKLSZxdW90O3Jvb3QmcXVvdDsgY2xhc3Nlcywgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgY2xhc3MgZmlsZXMgdXBvbiB3aGljaCB0aGUgCi1yb290IGNsYXNzZXMgZGVwZW5kLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGNyZWF0ZSBhIGphciB3aXRoIGFsbCBvZiB0aGUKLXJlcXVpcmVkIGNsYXNzZXMgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KKzxoMiBpZD0iZmlsZXNldCI+Q2xhc3NGaWxlU2V0PC9oMj4KKzxwPkEgY2xhc3NmaWxlc2V0IGlzIGEgc3BlY2lhbGl6ZWQgdHlwZSBvZiBmaWxlc2V0IHdoaWNoLCBnaXZlbiBhIHNldCBvZiAmcXVvdDtyb290JnF1b3Q7CitjbGFzc2VzLCB3aWxsIGluY2x1ZGUgYWxsIG9mIHRoZSBjbGFzcyBmaWxlcyB1cG9uIHdoaWNoIHRoZSByb290IGNsYXNzZXMgZGVwZW5kLiBUaGlzIGlzCit0eXBpY2FsbHkgdXNlZCB0byBjcmVhdGUgYSBqYXIgd2l0aCBhbGwgb2YgdGhlIHJlcXVpcmVkIGNsYXNzZXMgZm9yIGEgcGFydGljdWxhciBhcHBsaWNhdGlvbi4KIDwvcD4KIDxwPgotY2xhc3NmaWxlc2V0cyBhcmUgdHlwaWNhbGx5IHVzZWQgYnkgcmVmZXJlbmNlLiBUaGV5IGFyZSBkZWNsYXJlZCB3aXRoIGFuCi0mcXVvdDtpZCZxdW90OyB2YWx1ZSBhbmQgdGhpcyBpcyB0aGVuIHVzZWQgYXMgYSByZWZlcmVuY2Ugd2hlcmUgYSBub3JtYWwgZmlsZXNldAotaXMgZXhwZWN0ZWQuCitjbGFzc2ZpbGVzZXRzIGFyZSB0eXBpY2FsbHkgdXNlZCBieSByZWZlcmVuY2UuIFRoZXkgYXJlIGRlY2xhcmVkIHdpdGggYW4gPHZhcj5pZDwvdmFyPiB2YWx1ZSBhbmQKK3RoaXMgaXMgdGhlbiB1c2VkIGFzIGEgcmVmZXJlbmNlIHdoZXJlIGEgbm9ybWFsIGZpbGVzZXQgaXMgZXhwZWN0ZWQuCiA8L3A+CiA8cD4KLVRoaXMgdHlwZSByZXF1aXJlcyB0aGUgPGNvZGU+QkNFTDwvY29kZT4gPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmxpYnJhcnk8L2E+LgorVGhpcyB0eXBlIHJlcXVpcmVzCit0aGUgPGNvZGU+QkNFTDwvY29kZT4gPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmxpYnJhcnk8L2E+LgogPC9wPgogCi0KIDxoMz5BdHRyaWJ1dGVzPC9oMz4KLTxwPlRoZSBjbGFzcyBmaWxlc2V0IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGluIGFkZGl0aW9uCi10byB0aG9zZSBzdXBwb3J0ZWQgYnkgdGhlIAotPGEgaHJlZj0iLi4vVHlwZXMvZmlsZXNldC5odG1sIj5zdGFuZGFyZCBmaWxlc2V0PC9hPjoKKzxwPgorVGhlIGNsYXNzIGZpbGVzZXQgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgaW4gYWRkaXRpb24gdG8gdGhvc2Ugc3VwcG9ydGVkIGJ5Cit0aGUgPGEgaHJlZj0iZmlsZXNldC5odG1sIj5zdGFuZGFyZCBmaWxlc2V0PC9hPjoKIDwvcD4KLSAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yb290Y2xhc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBzaW5nbGUgcm9vdCBjbGFzcyBuYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cm9vdGNsYXNzPC90ZD4KKyAgICA8dGQ+QSBzaW5nbGUgcm9vdCBjbGFzcyBuYW1lPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PlJvb3Q8L2g0PgogPHA+CiBXaGVuIG1vcmUgdGhhbiBvbmUgcm9vdCBjbGFzcyBpcyByZXF1aXJlZCwgbXVsdGlwbGUgbmVzdGVkIDxjb2RlPiZsdDtyb290Jmd0OzwvY29kZT4gZWxlbWVudHMKIG1heSBiZSB1c2VkCiA8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHJvb3QgY2xhc3M8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+Y2xhc3NuYW1lPC90ZD4KKyAgICA8dGQ+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSByb290IGNsYXNzPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoND5Sb290RmlsZVNldDwvaDQ+CiA8cD4KLUEgcm9vdCBmaWxlc2V0IGlzIHVzZWQgdG8gYWRkIGEgc2V0IG9mIHJvb3QgY2xhc3NlcyBmcm9tIGEgZmlsZXNldC4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyaWVzIGluIAotdGhlIGZpbGVzZXQgYXJlIGV4cGVjdGVkIHRvIGJlIEphdmEgY2xhc3MgZmlsZXMuIFRoZSBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzIGlzIGRldGVybWluZWQgYnkgdGhlIAotcmVsYXRpdmUgbG9jYXRpb24gb2YgdGhlIGNsYXNzZmlsZSBpbiB0aGUgZmlsZXNldC4gU28sIHRoZSBmaWxlIAotPGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5jbGFzczwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhlIEphdmEgY2xhc3MKLTxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q8L2NvZGU+LjwvcD4KK0Egcm9vdCBmaWxlc2V0IGlzIHVzZWQgdG8gYWRkIGEgc2V0IG9mIHJvb3QgY2xhc3NlcyBmcm9tIGEgZmlsZXNldC4gSW4gdGhpcyBjYXNlIHRoZSBlbnRyaWVzIGluIHRoZQorZmlsZXNldCBhcmUgZXhwZWN0ZWQgdG8gYmUgSmF2YSBjbGFzcyBmaWxlcy4gVGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUKK3JlbGF0aXZlIGxvY2F0aW9uIG9mIHRoZSBjbGFzc2ZpbGUgaW4gdGhlIGZpbGVzZXQuIFNvLCB0aGUKK2ZpbGUgPGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5jbGFzczwvY29kZT4gY29ycmVzcG9uZHMgdG8gdGhlIEphdmEKK2NsYXNzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0PC9jb2RlPi48L3A+CiAKIDxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtjbGFzc2ZpbGVzZXQgaWQ9JnF1b3Q7cmVxZENsYXNzZXMiIGRpcj0mcXVvdDske2NsYXNzZXMuZGlyfSZxdW90OyZndDsKICAgJmx0O3Jvb3QgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QmcXVvdDsvJmd0OwotJmx0Oy9jbGFzc2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgZXhhbXBsZSBjcmVhdGVzIGEgZmlsZXNldCBjb250YWluaW5nIGFsbCB0aGUgY2xhc3MgZmlsZXMgdXBvbiB3aGljaCB0aGUgCi08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0PC9jb2RlPiBjbGFzcyBkZXBlbmRzLiBUaGlzIGZpbGVzZXQgY291bGQgCi10aGVuIGJlIHVzZWQgdG8gY3JlYXRlIGEgamFyLiAKKyZsdDsvY2xhc3NmaWxlc2V0Jmd0OzwvcHJlPgorPHA+CitUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIGZpbGVzZXQgY29udGFpbmluZyBhbGwgdGhlIGNsYXNzIGZpbGVzIHVwb24gd2hpY2gKK3RoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDwvY29kZT4gY2xhc3MgZGVwZW5kcy4gVGhpcyBmaWxlc2V0IGNvdWxkIHRoZW4gYmUKK3VzZWQgdG8gY3JlYXRlIGEgamFyLgogPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtqYXIgZGVzdGZpbGU9JnF1b3Q7bWluaW1hbC5qYXImcXVvdDsmZ3Q7CiAgICZsdDtmaWxlc2V0IHJlZmlkPSZxdW90O3JlcWRDbGFzc2VzJnF1b3Q7LyZndDsKLSZsdDsvamFyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9qYXImZ3Q7PC9wcmU+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2NsYXNzZmlsZXNldCBpZD0mcXVvdDtyZXFkQ2xhc3NlcyZxdW90OyBkaXI9JnF1b3Q7JHtjbGFzc2VzLmRpcn0mcXVvdDsmZ3Q7CiAgICZsdDtyb290ZmlsZXNldCBkaXI9JnF1b3Q7JHtjbGFzc2VzLmRpcn0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7b3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdCouY2xhc3MmcXVvdDsvJmd0OwotJmx0Oy9jbGFzc2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPlRoaXMgZXhhbXBsZSBjb25zdHJ1Y3RzIHRoZSBjbGFzc2ZpbGVzZXQgdXNpbmcgYWxsIHRoZSBjbGFzcyB3aXRoIG5hbWVzIHN0YXJ0aW5nIHdpdGggUHJvamVjdCAKLWluIHRoZSBvcmcuYXBhY2hlLnRvb2xzLmFudCBwYWNrYWdlPC9wPiAKLQotCismbHQ7L2NsYXNzZmlsZXNldCZndDs8L3ByZT4KKzxwPgorVGhpcyBleGFtcGxlIGNvbnN0cnVjdHMgdGhlIGNsYXNzZmlsZXNldCB1c2luZyBhbGwgdGhlIGNsYXNzIHdpdGggbmFtZXMgc3RhcnRpbmcKK3dpdGggPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3Q8L2NvZGU+IGluIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQ8L2NvZGU+CitwYWNrYWdlLgorPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9jdXN0b20tcHJvZ3JhbW1pbmcuaHRtbCBiL21hbnVhbC9UeXBlcy9jdXN0b20tcHJvZ3JhbW1pbmcuaHRtbAppbmRleCA5NmJhZGUzLi42MDE1ZDQxIDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvY3VzdG9tLXByb2dyYW1taW5nLmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL2N1c3RvbS1wcm9ncmFtbWluZy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTggKzE1LDUyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAgIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj48L21ldGE+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPkN1c3RvbSBDb21wb25lbnRzPC90aXRsZT4KKyAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgorICAgIDx0aXRsZT5DdXN0b20gQ29tcG9uZW50czwvdGl0bGU+CiAgIDwvaGVhZD4KICAgPGJvZHk+CiAgICAgPGgyPkN1c3RvbSBDb21wb25lbnRzPC9oMj4KICAgICA8aDM+T3ZlcnZpZXc8L2gzPgogICAgIDxwPgotICAgICAgQ3VzdG9tIGNvbXBvbmVudHMgYXJlIGNvbmRpdGlvbnMsIHNlbGVjdG9ycywgZmlsdGVycyBhbmQgb3RoZXIKLSAgICAgIG9iamVjdHMgdGhhdCBhcmUgZGVmaW5lZCBvdXRzaWRlIEFwYWNoZSBBbnQgY29yZS4KKyAgICAgIEN1c3RvbSBjb21wb25lbnRzIGFyZSBjb25kaXRpb25zLCBzZWxlY3RvcnMsIGZpbHRlcnMgYW5kIG90aGVyIG9iamVjdHMgdGhhdCBhcmUgZGVmaW5lZAorICAgICAgb3V0c2lkZSBBcGFjaGUgQW50IGNvcmUuCiAgICAgPC9wPgogICAgIDxwPgotICAgICAgSW4gQW50IDEuNiBjdXN0b20gY29uZGl0aW9ucywgc2VsZWN0b3JzIGFuZCBmaWx0ZXJzIGhhcwotICAgICAgYmVlbiBvdmVyaGF1bGVkLgorICAgICAgSW4gQW50IDEuNiBjdXN0b20gY29uZGl0aW9ucywgc2VsZWN0b3JzIGFuZCBmaWx0ZXJzIGhhcyBiZWVuIG92ZXJoYXVsZWQuCiAgICAgPC9wPgogICAgIDxwPgotICAgICAgSXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjdXN0b20gY29uZGl0aW9ucywgc2VsZWN0b3JzIGFuZCBmaWx0ZXJzCi0gICAgICB0aGF0IGJlaGF2ZSBsaWtlIEFudCBDb3JlIGNvbXBvbmVudHMuCi0gICAgICBUaGlzIGlzIGFjaGlldmVkIGJ5IGFsbG93aW5nIGRhdGF0eXBlcyBkZWZpbmVkIGluIGJ1aWxkIHNjcmlwdHMKLSAgICAgIHRvIGJlIHVzZWQgYXMgY3VzdG9tIGNvbXBvbmVudHMgaWYgdGhlIGNsYXNzIG9mIHRoZSBkYXRhdHlwZQotICAgICAgaXMgY29tcGF0aWJsZSwgb3IgaGFzIGJlZW4gYWRhcHRlZCBieSBhbiBhZGFwdGVyIGNsYXNzLgorICAgICAgSXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjdXN0b20gY29uZGl0aW9ucywgc2VsZWN0b3JzIGFuZCBmaWx0ZXJzIHRoYXQgYmVoYXZlIGxpa2UgQW50CisgICAgICBDb3JlIGNvbXBvbmVudHMuICBUaGlzIGlzIGFjaGlldmVkIGJ5IGFsbG93aW5nIGRhdGF0eXBlcyBkZWZpbmVkIGluIGJ1aWxkIHNjcmlwdHMgdG8gYmUgdXNlZAorICAgICAgYXMgY3VzdG9tIGNvbXBvbmVudHMgaWYgdGhlIGNsYXNzIG9mIHRoZSBkYXRhdHlwZSBpcyBjb21wYXRpYmxlLCBvciBoYXMgYmVlbiBhZGFwdGVkIGJ5IGFuCisgICAgICBhZGFwdGVyIGNsYXNzLgogICAgIDwvcD4KICAgICA8cD4KICAgICAgIFRoZSBvbGQgbWV0aG9kcyBvZiBkZWZpbmluZyBjdXN0b20gY29tcG9uZW50cyBhcmUgc3RpbGwgc3VwcG9ydGVkLgogICAgIDwvcD4KLSAgICA8aDM+RGVmaW5pdGlvbiBhbmQgdXNlPC9oMz4KKyAgICA8aDM+RGVmaW5pdGlvbiBhbmQgVXNlPC9oMz4KICAgICA8cD4KLSAgICAgIEEgY3VzdG9tIGNvbXBvbmVudCBpcyBhIG5vcm1hbCBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIKLSAgICAgIGludGVyZmFjZSBvciBleHRlbmRzIGEgIHBhcnRpY3VsYXIgY2xhc3MsIG9yIGhhcyBiZWVuIGFkYXB0ZWQgdG8gdGhlCi0gICAgICBpbnRlcmZhY2Ugb3IgY2xhc3MuCisgICAgICBBIGN1c3RvbSBjb21wb25lbnQgaXMgYSBub3JtYWwgSmF2YSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBwYXJ0aWN1bGFyIGludGVyZmFjZSBvciBleHRlbmRzIGEKKyAgICAgIHBhcnRpY3VsYXIgY2xhc3MsIG9yIGhhcyBiZWVuIGFkYXB0ZWQgdG8gdGhlIGludGVyZmFjZSBvciBjbGFzcy4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBJdCBpcyBleGFjdGx5IGxpa2Ugd3JpdGluZyBhCi0gICAgICA8YSBocmVmPSIuLi9kZXZlbG9wLmh0bWwjd3JpdGluZ293bnRhc2siPmN1c3RvbSB0YXNrPC9hPi4KLSAgICAgIE9uZSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBieSB3cml0aW5nIDxpPnNldHRlcjwvaT4KLSAgICAgIG1ldGhvZHMgYW5kIDxpPmFkZDwvaT4gbWV0aG9kcy4KKyAgICAgIEl0IGlzIGV4YWN0bHkgbGlrZSB3cml0aW5nIGEgPGEgaHJlZj0iLi4vZGV2ZWxvcC5odG1sI3dyaXRpbmdvd250YXNrIj5jdXN0b20gdGFzazwvYT4uICBPbmUKKyAgICAgIGRlZmluZXMgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzIGJ5IHdyaXRpbmcgPGVtPnNldHRlcjwvZW0+IG1ldGhvZHMgYW5kIDxlbT5hZGQ8L2VtPgorICAgICAgbWV0aG9kcy4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBBZnRlciB0aGUgY2xhc3MgaGFzIGJlZW4gd3JpdHRlbiwgaXQgaXMgYWRkZWQgdG8gdGhlIGFudCBzeXN0ZW0KLSAgICAgIGJ5IHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4uCisgICAgICBBZnRlciB0aGUgY2xhc3MgaGFzIGJlZW4gd3JpdHRlbiwgaXQgaXMgYWRkZWQgdG8gdGhlIGFudCBzeXN0ZW0gYnkKKyAgICAgIHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4uCiAgICAgPC9wPgotICAgIDxoMz48YSBuYW1lPSJjdXN0b21jb25kaXRpb25zIj5DdXN0b20gQ29uZGl0aW9uczwvYT48L2gzPgorICAgIDxoMyBpZD0iY3VzdG9tY29uZGl0aW9ucyI+Q3VzdG9tIENvbmRpdGlvbnM8L2gzPgogICAgIDxwPgotICAgICAgQ3VzdG9tIGNvbmRpdGlvbnMgYXJlIGRhdGF0eXBlcyB0aGF0IGltcGxlbWVudAotICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjwvY29kZT4uCi0gICAgICBGb3IgZXhhbXBsZSBhIGN1c3RvbSBjb25kaXRpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgYQotICAgICAgc3RyaW5nIGlzIGFsbCB1cHBlciBjYXNlIGNvdWxkIGJlIHdyaXR0ZW4gYXM6CisgICAgICBDdXN0b20gY29uZGl0aW9ucyBhcmUgZGF0YXR5cGVzIHRoYXQKKyAgICAgIGltcGxlbWVudCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkNvbmRpdGlvbjwvY29kZT4uICBGb3IKKyAgICAgIGV4YW1wbGUgYSBjdXN0b20gY29uZGl0aW9uIHRoYXQgcmV0dXJucyB0cnVlIGlmIGEgc3RyaW5nIGlzIGFsbCB1cHBlciBjYXNlIGNvdWxkIGJlIHdyaXR0ZW4KKyAgICAgIGFzOgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KIHBhY2thZ2UgY29tLm15ZG9tYWluOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC04NSwxMjAgKzgwLDkwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInZhbHVlIGF0dHJpYnV0ZSBpcyBub3Qgc2V0Iik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCkuZXF1YWxzKHZhbHVlKTsKLSAgIH0KLX0KLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLQorICAgIH0KK308L3ByZT4KICAgICA8cD4KLSAgICAgICAgQWRkaW5nIHRoZSBjb25kaXRpb24gdG8gdGhlIHN5c3RlbSBpcyBhY2hpZXZlZCBhcyBmb2xsb3dzOgorICAgICAgQWRkaW5nIHRoZSBjb25kaXRpb24gdG8gdGhlIHN5c3RlbSBpcyBhY2hpZXZlZCBhcyBmb2xsb3dzOgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDt0eXBlZGVmCiAgICAgbmFtZT0iYWxsdXBwZXJjYXNlIgogICAgIGNsYXNzbmFtZT0iY29tLm15ZG9tYWluLkFsbFVwcGVyQ2FzZUNvbmRpdGlvbiIKLSAgICBjbGFzc3BhdGg9IiR7bXlkb21haW4uY2xhc3Nlc30iLyZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICBjbGFzc3BhdGg9IiR7bXlkb21haW4uY2xhc3Nlc30iLyZndDs8L3ByZT4KICAgICA8cD4KLSAgICAgIFRoaXMgY29uZGl0aW9uIGNhbiBub3cgYmUgdXNlZCB3aGVyZXZlciBhIENvcmUgQW50IGNvbmRpdGlvbgotICAgICAgaXMgdXNlZC4KKyAgICAgIFRoaXMgY29uZGl0aW9uIGNhbiBub3cgYmUgdXNlZCB3aGVyZXZlciBhIENvcmUgQW50IGNvbmRpdGlvbiBpcyB1c2VkLgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDtjb25kaXRpb24gcHJvcGVydHk9ImFsbHVwcGVyIiZndDsKLSAgICZsdDthbGx1cHBlcmNhc2UgdmFsdWU9IlRISVMgSVMgQUxMIFVQUEVSIENBU0UiLyZndDsKLSZsdDsvY29uZGl0aW9uJmd0OwotICAgICAgPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgotICAgIDxoMz48YSBuYW1lPSJjdXN0b21zZWxlY3RvcnMiPkN1c3RvbSBTZWxlY3RvcnM8L2E+PC9oMz4KKyAgICAmbHQ7YWxsdXBwZXJjYXNlIHZhbHVlPSJUSElTIElTIEFMTCBVUFBFUiBDQVNFIi8mZ3Q7CismbHQ7L2NvbmRpdGlvbiZndDs8L3ByZT4KKyAgICA8aDMgaWQ9ImN1c3RvbXNlbGVjdG9ycyI+Q3VzdG9tIFNlbGVjdG9yczwvaDM+CiAgICAgPHA+Ci0gICAgICBDdXN0b20gc2VsZWN0b3JzIGFyZSBkYXRhdHlwZXMgdGhhdCBpbXBsZW1lbnQKLSAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+LgorICAgICAgQ3VzdG9tIHNlbGVjdG9ycyBhcmUgZGF0YXR5cGVzIHRoYXQKKyAgICAgIGltcGxlbWVudCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjwvY29kZT4uCiAgICAgPC9wPgotICAgIDxwPlRoZXJlIGlzIG9ubHkgb25lIG1ldGhvZCByZXF1aXJlZC4KLSAgICAgIDxjb2RlPnB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsCi0gICAgICAgIEZpbGUgZmlsZSk8L2NvZGU+LgotICAgICAgSXQgcmV0dXJucyB0cnVlCi0gICAgICBvciBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBzaG91bGQgYmUKLSAgICAgIHNlbGVjdGVkIG9yIG5vdC4KKyAgICA8cD4KKyAgICAgIFRoZXJlIGlzIG9ubHkgb25lIG1ldGhvZCByZXF1aXJlZCwgPGNvZGUgY2xhc3M9ImNvZGUiPnB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLAorICAgICAgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpPC9jb2RlPi4gIEl0IHJldHVybnMgdHJ1ZSBvciBmYWxzZSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZ2l2ZW4KKyAgICAgIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdC4KICAgICA8L3A+CiAgICAgPHA+CiAgICAgICBBbiBleGFtcGxlIG9mIGEgY3VzdG9tIHNlbGVjdGlvbiB0aGF0IHNlbGVjdHMgZmlsZW5hbWVzIGVuZGluZwotICAgICAgaW4gIi5qYXZhIiB3b3VsZCBiZToKKyAgICAgIGluIDxzYW1wPi5qYXZhPC9zYW1wPiB3b3VsZCBiZToKICAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cHJlPgorICAgIDxwcmU+CiBwYWNrYWdlIGNvbS5teWRvbWFpbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKIHB1YmxpYyBjbGFzcyBKYXZhU2VsZWN0b3IgaW1wbGVtZW50cyBGaWxlU2VsZWN0b3IgewogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZikgewotICAgICAgIHJldHVybiBmaWxlbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuamF2YSIpOworICAgICAgICByZXR1cm4gZmlsZW5hbWUudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLmphdmEiKTsKICAgICB9Ci19Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Cit9PC9wcmU+CiAgICAgPHA+CiAgICAgICBBZGRpbmcgdGhlIHNlbGVjdG9yIHRvIHRoZSBzeXN0ZW0gaXMgYWNoaWV2ZWQgYXMgZm9sbG93czoKICAgICA8L3A+Ci0gICAgPGJsb2NrcXVvdGU+Ci0gICAgICA8cHJlPgorICAgIDxwcmU+CiAmbHQ7dHlwZWRlZgogICAgIG5hbWU9ImphdmFzZWxlY3RvciIKICAgICBjbGFzc25hbWU9ImNvbS5teWRvbWFpbi5KYXZhU2VsZWN0b3IiCi0gICAgY2xhc3NwYXRoPSIke215ZG9tYWluLmNsYXNzZXN9Ii8mZ3Q7Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+Ci0gICAgICAgIDxwPgotICAgICAgVGhpcyBzZWxlY3RvciBjYW4gbm93IGJlIHVzZWQgd2hlcmV2ZXIgYSBDb3JlIEFudCBzZWxlY3RvcgotICAgICAgaXMgdXNlZCwgZm9yIGV4YW1wbGU6CisgICAgY2xhc3NwYXRoPSIke215ZG9tYWluLmNsYXNzZXN9Ii8mZ3Q7PC9wcmU+CisgICAgPHA+CisgICAgICBUaGlzIHNlbGVjdG9yIGNhbiBub3cgYmUgdXNlZCB3aGVyZXZlciBhIENvcmUgQW50IHNlbGVjdG9yIGlzIHVzZWQsIGZvciBleGFtcGxlOgogICAgIDwvcD4KLSAgICA8YmxvY2txdW90ZT4KLSAgICAgIDxwcmU+CisgICAgPHByZT4KICZsdDtjb3B5IHRvZGlyPSJ0byImZ3Q7Ci0gICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7Ci0gICAgICAmbHQ7amF2YXNlbGVjdG9yLyZndDsKLSAgICZsdDsvZmlsZXNldCZndDsKLSZsdDsvY29weSZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KLQotICAgICAgPHA+Ci0gICAgICAgIE9uZSBtYXkgdXNlCi0gICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3I8L2NvZGU+LAotICAgICAgICBhIGNvbnZlbmllbmNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgcmVhc29uYWJsZSBkZWZhdWx0Ci0gICAgICAgIGJlaGF2aW91ci4KLSAgICAgICAgSXQgaGFzIHNvbWUgcHJlZGVmaW5lZCBiZWhhdmlvdXJzIHlvdSBjYW4gdGFrZSBhZHZhbnRhZ2UKLSAgICAgICAgb2YuIEFueSB0aW1lIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdoZW4gc2V0dGluZyBhdHRyaWJ1dGVzIG9yCi0gICAgICAgIGFkZGluZyB0YWdzLCB5b3UgY2FuIGNhbGwgc2V0RXJyb3IoU3RyaW5nIGVycm1zZykgYW5kIHRoZSBjbGFzcwotICAgICAgICB3aWxsIGtub3cgdGhhdCB0aGVyZSBpcyBhIHByb2JsZW0uIFRoZW4sIGF0IHRoZSB0b3Agb2YgeW91cgotICAgICAgICA8Y29kZT5pc1NlbGVjdGVkKCk8L2NvZGU+IG1ldGhvZCBjYWxsIDxjb2RlPnZhbGlkYXRlKCk8L2NvZGU+IGFuZAotICAgICAgICBhIEJ1aWxkRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIHdpdGggdGhlIGNvbnRlbnRzIG9mIHlvdXIgZXJyb3IKLSAgICAgICAgbWVzc2FnZS4gVGhlIDxjb2RlPnZhbGlkYXRlKCk8L2NvZGU+IG1ldGhvZCBhbHNvIGdpdmVzIHlvdSBhCi0gICAgICAgIGxhc3QgY2hhbmNlIHRvIGNoZWNrIHlvdXIgc2V0dGluZ3MgZm9yIGNvbnNpc3RlbmN5IGJlY2F1c2UgaXQKLSAgICAgICAgY2FsbHMgPGNvZGU+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4uIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAotICAgICAgICBjYWxsIDxjb2RlPnNldEVycm9yKCk8L2NvZGU+IHdpdGhpbiBpdCBpZiB5b3UgZGV0ZWN0IGFueQotICAgICAgICBwcm9ibGVtcyBpbiBob3cgeW91ciBzZWxlY3RvciBpcyBzZXQgdXAuCisgICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiJmd0OworICAgICAgICAmbHQ7amF2YXNlbGVjdG9yLyZndDsKKyAgICAmbHQ7L2ZpbGVzZXQmZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CisgICAgPHA+CisgICAgICBPbmUgbWF5IHVzZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvcjwvY29kZT4sIGEKKyAgICAgIGNvbnZlbmllbmNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgcmVhc29uYWJsZSBkZWZhdWx0IGJlaGF2aW91ci4gIEl0IGhhcyBzb21lIHByZWRlZmluZWQKKyAgICAgIGJlaGF2aW91cnMgeW91IGNhbiB0YWtlIGFkdmFudGFnZSBvZi4gQW55IHRpbWUgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2hlbiBzZXR0aW5nIGF0dHJpYnV0ZXMKKyAgICAgIG9yIGFkZGluZyB0YWdzLCB5b3UgY2FuIGNhbGwgPGNvZGUgY2xhc3M9ImNvZGUiPnNldEVycm9yKFN0cmluZyBlcnJtc2cpPC9jb2RlPiBhbmQgdGhlIGNsYXNzCisgICAgICB3aWxsIGtub3cgdGhhdCB0aGVyZSBpcyBhIHByb2JsZW0uIFRoZW4sIGF0IHRoZSB0b3Agb2YKKyAgICAgIHlvdXIgPGNvZGUgY2xhc3M9ImNvZGUiPmlzU2VsZWN0ZWQoKTwvY29kZT4gbWV0aG9kIGNhbGwgPGNvZGUgY2xhc3M9ImNvZGUiPnZhbGlkYXRlKCk8L2NvZGU+CisgICAgICBhbmQgYSA8Y29kZT5CdWlsZEV4Y2VwdGlvbjwvY29kZT4gd2lsbCBiZSB0aHJvd24gd2l0aCB0aGUgY29udGVudHMgb2YgeW91ciBlcnJvcgorICAgICAgbWVzc2FnZS4gVGhlIDxjb2RlIGNsYXNzPSJjb2RlIj52YWxpZGF0ZSgpPC9jb2RlPiBtZXRob2QgYWxzbyBnaXZlcyB5b3UgYSBsYXN0IGNoYW5jZSB0byBjaGVjaworICAgICAgeW91ciBzZXR0aW5ncyBmb3IgY29uc2lzdGVuY3kgYmVjYXVzZSBpdAorICAgICAgY2FsbHMgPGNvZGUgY2xhc3M9ImNvZGUiPnZlcmlmeVNldHRpbmdzKCk8L2NvZGU+LiBPdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQKKyAgICAgIGNhbGwgPGNvZGUgY2xhc3M9ImNvZGUiPnNldEVycm9yKCk8L2NvZGU+IHdpdGhpbiBpdCBpZiB5b3UgZGV0ZWN0IGFueSBwcm9ibGVtcyBpbiBob3cgeW91cgorICAgICAgc2VsZWN0b3IgaXMgc2V0IHVwLgogICAgIDwvcD4KICAgICA8cD4KLSAgICAgIFRvIHdyaXRlIGN1c3RvbSBzZWxlY3RvciBjb250YWluZXJzIG9uZSBzaG91bGQgZXh0ZW5kCi0gICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yQ29udGFpbmVyPC9jb2RlPi4KLSAgICAgIEltcGxlbWVudCB0aGUKLSAgICAgIDxjb2RlPnB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlRGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSk8L2NvZGU+Ci0gICAgICBtZXRob2QgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLiBDaGFuY2VzIGFyZSB5b3UnbGwgd2FudCB0byBpdGVyYXRlCi0gICAgICBvdmVyIHRoZSBzZWxlY3RvcnMgdW5kZXIgeW91LCBzbyB1c2UKLSAgICAgIDxjb2RlPnNlbGVjdG9yRWxlbWVudHMoKTwvY29kZT4gdG8gZ2V0IGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBkbwotICAgICAgdGhhdC4KKyAgICAgIFRvIHdyaXRlIGN1c3RvbSBzZWxlY3RvciBjb250YWluZXJzIG9uZSBzaG91bGQKKyAgICAgIGV4dGVuZCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvckNvbnRhaW5lcjwvY29kZT4uCisgICAgICBJbXBsZW1lbnQgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZURpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlCisgICAgICBmaWxlKTwvY29kZT4gbWV0aG9kIHRvIGRvIHRoZSByaWdodCB0aGluZy4gQ2hhbmNlcyBhcmUgeW91J2xsIHdhbnQgdG8gaXRlcmF0ZSBvdmVyIHRoZQorICAgICAgc2VsZWN0b3JzIHVuZGVyIHlvdSwgc28gdXNlIDxjb2RlIGNsYXNzPSJjb2RlIj5zZWxlY3RvckVsZW1lbnRzKCk8L2NvZGU+IHRvIGdldCBhbiBpdGVyYXRvcgorICAgICAgdGhhdCB3aWxsIGRvIHRoYXQuCiAgICAgPC9wPgogICAgIDxwPgotICAgICAgRm9yIGV4YW1wbGUgdG8gY3JlYXRlIGEgc2VsZWN0b3IgY29udGFpbmVyIHRoYXQgd2lsbCBzZWxlY3QgZmlsZXMKLSAgICAgIGlmIGEgY2VydGFpbiBudW1iZXIgb2YgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QsIG9uZSBjb3VsZCB3cml0ZQotICAgICAgYSBzZWxlY3RvciBhcyBmb2xsb3dzOgorICAgICAgRm9yIGV4YW1wbGUgdG8gY3JlYXRlIGEgc2VsZWN0b3IgY29udGFpbmVyIHRoYXQgd2lsbCBzZWxlY3QgZmlsZXMgaWYgYSBjZXJ0YWluIG51bWJlciBvZgorICAgICAgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QsIG9uZSBjb3VsZCB3cml0ZSBhIHNlbGVjdG9yIGFzIGZvbGxvd3M6CiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cHJlPgogcHVibGljIGNsYXNzIE1hdGNoTnVtYmVyU2VsZWN0b3JzIGV4dGVuZHMgQmFzZVNlbGVjdG9yQ29udGFpbmVyIHsKICAgICBwcml2YXRlIGludCBudW1iZXIgPSAtMTsKICAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoaW50IG51bWJlcikgewpAQCAtMjIwLDE5NiArMTg1LDE2NyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudW1iZXJTZWxlY3RlZCA9PSBudW1iZXI7CiAgICAgfQotfQotICAgICAgPC9wcmU+Ci0gICAgPC9ibG9ja3F1b3RlPgorfTwvcHJlPgogICAgIDxwPgogICAgICAgVG8gZGVmaW5lIGFuZCB1c2UgdGhpcyBzZWxlY3RvciBvbmUgY291bGQgZG86CiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cHJlPgogJmx0O3R5cGVkZWYgbmFtZT0ibnVtYmVyc2VsZWN0ZWQiCiAgICAgICAgICBjbGFzc25hbWU9ImNvbS5teWRvbWFpbi5NYXRjaE51bWJlclNlbGVjdG9ycyIvJmd0OwogLi4uCiAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLnBhdGh9IiZndDsKLSAgICZsdDtudW1iZXJzZWxlY3RlZCBudW1iZXI9IjIiJmd0OwotICAgICAgJmx0O2NvbnRhaW5zIHRleHQ9InNjcmlwdCIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKLSAgICAgICZsdDtzaXplIHZhbHVlPSI0IiB1bml0cz0iS2kiIHdoZW49Im1vcmUiLyZndDsKLSAgICAgICZsdDtqYXZhc2VsZWN0b3IvJmd0OwotICAgJmx0Oy9udW1iZXJzZWxlY3RlZCZndDsKLSZsdDsvZmlsZXNldCZndDsKLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICAmbHQ7bnVtYmVyc2VsZWN0ZWQgbnVtYmVyPSIyIiZndDsKKyAgICAgICAgJmx0O2NvbnRhaW5zIHRleHQ9InNjcmlwdCIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKKyAgICAgICAgJmx0O3NpemUgdmFsdWU9IjQiIHVuaXRzPSJLaSIgd2hlbj0ibW9yZSIvJmd0OworICAgICAgICAmbHQ7amF2YXNlbGVjdG9yLyZndDsKKyAgICAmbHQ7L251bWJlcnNlbGVjdGVkJmd0OworJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogICAgIDxwPgotICAgICAgPGk+VGhlIGN1c3RvbSBzZWxlY3RvcjwvaT4KKyAgICAgIDxlbT5UaGUgY3VzdG9tIHNlbGVjdG9yPC9lbT4KICAgICA8L3A+CiAgICAgPHA+Ci0gICAgICBUaGUgY3VzdG9tIHNlbGVjdG9yIHdhcyB0aGUgcHJlIGFudCAxLjYgd2F5IG9mIGRlZmluaW5nIGN1c3RvbSBzZWxlY3RvcnMuCi0gICAgICBUaGlzIG1ldGhvZCBpcyBzdGlsbCBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICBUaGUgY3VzdG9tIHNlbGVjdG9yIHdhcyB0aGUgcHJlIEFudCAxLjYgd2F5IG9mIGRlZmluaW5nIGN1c3RvbSBzZWxlY3RvcnMuICBUaGlzIG1ldGhvZCBpcworICAgICAgc3RpbGwgc3VwcG9ydGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgIDwvcD4KLSAgICA8cD5Zb3UgY2FuIHdyaXRlIHlvdXIgb3duIHNlbGVjdG9ycyBhbmQgdXNlIHRoZW0gd2l0aGluIHRoZSBzZWxlY3RvcgotICAgICAgY29udGFpbmVycyBieSBzcGVjaWZ5aW5nIHRoZW0gd2l0aGluIHRoZSA8Y29kZT4mbHQ7Y3VzdG9tJmd0OzwvY29kZT4gdGFnLjwvcD4KLQotICAgICAgICA8cD5UbyBjcmVhdGUgYSBuZXcgQ3VzdG9tIFNlbGVjdG9yLCB5b3UgaGF2ZSB0byBjcmVhdGUgYSBjbGFzcyB0aGF0Ci0gICAgICAgIGltcGxlbWVudHMKLSAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkV4dGVuZEZpbGVTZWxlY3RvcjwvY29kZT4uCi0gICAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHRocm91Z2ggdGhlIGNvbnZlbmllbmNlIGJhc2UgY2xhc3MKLSAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VFeHRlbmRTZWxlY3RvcjwvY29kZT4sCi0gICAgICAgIHdoaWNoIHByb3ZpZGVzIGFsbCBvZiB0aGUgbWV0aG9kcyBmb3Igc3VwcG9ydGluZwotICAgICAgICA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiB0YWdzLiBGaXJzdCwgb3ZlcnJpZGUgdGhlCi0gICAgICAgIDxjb2RlPmlzU2VsZWN0ZWQoKTwvY29kZT4gbWV0aG9kLCBhbmQgb3B0aW9uYWxseSB0aGUKLSAgICAgICAgPGNvZGU+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4gbWV0aG9kLiBJZiB5b3VyIGN1c3RvbQotICAgICAgICBzZWxlY3RvciByZXF1aXJlcyBwYXJhbWV0ZXJzIHRvIGJlIHNldCwgeW91IGNhbiBhbHNvIG92ZXJyaWRlCi0gICAgICAgIHRoZSA8Y29kZT5zZXRQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZCBhbmQgaW50ZXJwcmV0IHRoZQotICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBpbiBhbnkgd2F5IHlvdSBsaWtlLiBTZXZlcmFsIG9mIHRoZQotICAgICAgICBjb3JlIHNlbGVjdG9ycyBkZW1vbnN0cmF0ZSBob3cgdG8gZG8gdGhhdCBiZWNhdXNlIHRoZXkgY2FuCi0gICAgICAgIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzLjwvcD4KLQotCi0gICAgPHA+T25jZSB0aGF0IGlzIHdyaXR0ZW4sIHlvdSBpbmNsdWRlIGl0IGluIHlvdXIgYnVpbGQgZmlsZSBieSB1c2luZworICAgIDxwPgorICAgICAgWW91IGNhbiB3cml0ZSB5b3VyIG93biBzZWxlY3RvcnMgYW5kIHVzZSB0aGVtIHdpdGhpbiB0aGUgc2VsZWN0b3IgY29udGFpbmVycyBieSBzcGVjaWZ5aW5nCisgICAgICB0aGVtIHdpdGhpbiB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy4KKyAgICA8L3A+CisgICAgPHA+CisgICAgICBUbyBjcmVhdGUgYSBuZXcgQ3VzdG9tIFNlbGVjdG9yLCB5b3UgaGF2ZSB0byBjcmVhdGUgYSBjbGFzcyB0aGF0CisgICAgICBpbXBsZW1lbnRzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRXh0ZW5kRmlsZVNlbGVjdG9yPC9jb2RlPi4KKyAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHRocm91Z2ggdGhlIGNvbnZlbmllbmNlIGJhc2UKKyAgICAgIGNsYXNzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZUV4dGVuZFNlbGVjdG9yPC9jb2RlPiwgd2hpY2gKKyAgICAgIHByb3ZpZGVzIGFsbCBvZiB0aGUgbWV0aG9kcyBmb3Igc3VwcG9ydGluZyA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiB0YWdzLiBGaXJzdCwgb3ZlcnJpZGUKKyAgICAgIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+aXNTZWxlY3RlZCgpPC9jb2RlPiBtZXRob2QsIGFuZCBvcHRpb25hbGx5CisgICAgICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPnZlcmlmeVNldHRpbmdzKCk8L2NvZGU+IG1ldGhvZC4gSWYgeW91ciBjdXN0b20gc2VsZWN0b3IgcmVxdWlyZXMKKyAgICAgIHBhcmFtZXRlcnMgdG8gYmUgc2V0LCB5b3UgY2FuIGFsc28gb3ZlcnJpZGUgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5zZXRQYXJhbWV0ZXJzKCk8L2NvZGU+CisgICAgICBtZXRob2QgYW5kIGludGVycHJldCB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgaW4gYW55IHdheSB5b3UgbGlrZS4gU2V2ZXJhbCBvZiB0aGUgY29yZQorICAgICAgc2VsZWN0b3JzIGRlbW9uc3RyYXRlIGhvdyB0byBkbyB0aGF0IGJlY2F1c2UgdGhleSBjYW4gYWxzbyBiZSB1c2VkIGFzIGN1c3RvbSBzZWxlY3RvcnMuCisgICAgPC9wPgorICAgIDxwPgorICAgICAgT25jZSB0aGF0IGlzIHdyaXR0ZW4sIHlvdSBpbmNsdWRlIGl0IGluIHlvdXIgYnVpbGQgZmlsZSBieSB1c2luZwogICAgICAgdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0YWcuCiAgICAgPC9wPgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgeW91ciBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yPC9jb2RlPi4KKyAgICAgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICBUaGUgbmFtZSBvZiB5b3VyIGNsYXNzIHRoYXQKKyAgICAgICAgICBpbXBsZW1lbnRzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yPC9jb2RlPi4KICAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSBpbiBvcmRlciB0byBsb2FkIHRoZQotICAgICAgICAgIGN1c3RvbSBzZWxlY3RvciBjbGFzcy4gSWYgbmVpdGhlciB0aGlzIGNsYXNzcGF0aCBub3IgdGhlCi0gICAgICAgICAgY2xhc3NwYXRocmVmIGFyZSBzcGVjaWZpZWQsIHRoZSBjbGFzcyB3aWxsIGJlCisgICAgICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgVGhlIGNsYXNzcGF0aCB0byB1c2UgaW4gb3JkZXIgdG8gbG9hZCB0aGUgY3VzdG9tIHNlbGVjdG9yIGNsYXNzLiBJZgorICAgICAgICAgIG5laXRoZXIgPHZhcj5jbGFzc3BhdGg8L3Zhcj4gbm9yIDx2YXI+Y2xhc3NwYXRocmVmPC92YXI+IGFyZSBzcGVjaWZpZWQsIHRoZSBjbGFzcyB3aWxsIGJlCiAgICAgICAgICAgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aCB0aGF0IEFudCB1c2VzLgogICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBwcmV2aW91c2x5Ci0gICAgICAgICAgZGVmaW5lZC4gSWYgbmVpdGhlciB0aGlzIHJlZmVyZW5jZSBub3IgdGhlCi0gICAgICAgICAgY2xhc3NwYXRoIGFib3ZlIGFyZSBzcGVjaWZpZWQsIHRoZSBjbGFzcyB3aWxsIGJlCi0gICAgICAgICAgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aCB0aGF0IEFudCB1c2VzLgorICAgICAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgIEEgcmVmZXJlbmNlIHRvIGEgY2xhc3NwYXRoIHByZXZpb3VzbHkgZGVmaW5lZC4gSWYgbmVpdGhlciA8dmFyPmNsYXNzcGF0aHJlZjwvdmFyPgorICAgICAgICAgIG5vciA8dmFyPmNsYXNzcGF0aDwvdmFyPiBhYm92ZSBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoCisgICAgICAgICAgdGhhdCBBbnQgdXNlcy4KICAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKLSAgICA8cD5IZXJlIGlzIGhvdyB5b3UgdXNlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0bwotICAgICAgdXNlIHlvdXIgY2xhc3MgYXMgYSBzZWxlY3RvcjoKKyAgICA8cD4KKyAgICAgIEhlcmUgaXMgaG93IHlvdSB1c2UgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRvIHVzZSB5b3VyIGNsYXNzIGFzIGEgc2VsZWN0b3I6CiAgICAgPC9wPgotCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSIke215ZGlyfSIgaW5jbHVkZXM9IioqLyoiJmd0OwogICAgICZsdDtjdXN0b20gY2xhc3NuYW1lPSJjb20ubXlkb21haW4uTXlTZWxlY3RvciImZ3Q7CiAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJteWF0dHJpYnV0ZSIgdmFsdWU9Im15dmFsdWUiLyZndDsKICAgICAmbHQ7L2N1c3RvbSZndDsKLSZsdDsvZmlsZXNldCZndDsKLSAgICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi0gICAgPHA+VGhlIGNvcmUgc2VsZWN0b3JzIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzCi0gICAgICBhcmU8L3A+CismbHQ7L2ZpbGVzZXQmZ3Q7PC9wcmU+CisgICAgPHA+VGhlIGNvcmUgc2VsZWN0b3JzIHRoYXQgY2FuIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzIGFyZTwvcD4KIAogICAgIDx1bD4KICAgICAgIDxsaT48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCNjb250YWluc3NlbGVjdCI+Q29udGFpbnMgU2VsZWN0b3I8L2E+IHdpdGgKLSAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Db250YWluc1NlbGVjdG9yPC9jb2RlPgotICAgICAgPC9saT4KKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQ29udGFpbnNTZWxlY3RvcjwvY29kZT48L2xpPgogICAgICAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2RhdGVzZWxlY3QiPkRhdGUgU2VsZWN0b3I8L2E+IHdpdGgKLSAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EYXRlU2VsZWN0b3I8L2NvZGU+Ci0gICAgICA8L2xpPgorICAgICAgICBjbGFzc25hbWUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EYXRlU2VsZWN0b3I8L2NvZGU+PC9saT4KICAgICAgIDxsaT48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCNkZXB0aHNlbGVjdCI+RGVwdGggU2VsZWN0b3I8L2E+IHdpdGgKLSAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EZXB0aFNlbGVjdG9yPC9jb2RlPgotICAgICAgPC9saT4KKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvcjwvY29kZT48L2xpPgogICAgICAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2ZpbGVuYW1lc2VsZWN0Ij5GaWxlbmFtZSBTZWxlY3RvcjwvYT4gd2l0aAotICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVuYW1lU2VsZWN0b3I8L2NvZGU+Ci0gICAgICA8L2xpPgorICAgICAgICBjbGFzc25hbWUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlbmFtZVNlbGVjdG9yPC9jb2RlPjwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjc2l6ZXNlbGVjdCI+U2l6ZSBTZWxlY3RvcjwvYT4gd2l0aAotICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjwvY29kZT4KLSAgICAgIDwvbGk+CisgICAgICAgIGNsYXNzbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjwvY29kZT48L2xpPgogICAgIDwvdWw+CiAKLSAgICA8cD5IZXJlIGlzIHRoZSBleGFtcGxlIGZyb20gdGhlIERlcHRoIFNlbGVjdG9yIHNlY3Rpb24gcmV3cml0dGVuCi0gICAgdG8gdXNlIHRoZSBzZWxlY3RvciB0aHJvdWdoIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPi48L3A+Ci0KLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwPgorICAgICAgSGVyZSBpcyB0aGUgZXhhbXBsZSBmcm9tIHRoZSBEZXB0aCBTZWxlY3RvciBzZWN0aW9uIHJld3JpdHRlbiB0byB1c2UgdGhlIHNlbGVjdG9yCisgICAgICB0aHJvdWdoIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPi4KKyAgICA8L3A+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0iJHtkb2MucGF0aH0iIGluY2x1ZGVzPSIqKi8qIiZndDsKICAgICAmbHQ7Y3VzdG9tIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcHRoU2VsZWN0b3IiJmd0OwogICAgICAgICAmbHQ7cGFyYW0gbmFtZT0ibWF4IiB2YWx1ZT0iMSIvJmd0OwogICAgICZsdDsvY3VzdG9tJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotICAgICAgPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgorICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdyB0aGF0LjwvcD4KIAotICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdwotICAgICAgdGhhdC48L3A+Ci0KLSAgICA8aDM+PGEgbmFtZT0iZmlsdGVycmVhZGVycyI+Q3VzdG9tIEZpbHRlciBSZWFkZXJzPC9hPjwvaDM+CisgICAgPGgzIGlkPSJmaWx0ZXJyZWFkZXJzIj5DdXN0b20gRmlsdGVyIFJlYWRlcnM8L2gzPgogICAgIDxwPgotICAgICAgQ3VzdG9tIGZpbHRlciByZWFkZXJzIHNlbGVjdG9ycyBhcmUgZGF0YXR5cGVzIHRoYXQgaW1wbGVtZW50Ci0gICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5maWx0ZXJzLkNoYWluYWJsZVJlYWRlcjwvY29kZT4uCi0gICAgPC9wPgotICAgIDxwPlRoZXJlIGlzIG9ubHkgb25lIG1ldGhvZCByZXF1aXJlZC4KLSAgICAgIDxjb2RlPlJlYWRlciBjaGFpbihSZWFkZXIgcmVhZGVyKTwvY29kZT4uCi0gICAgICBUaGlzIHJldHVybnMgYSByZWFkZXIgdGhhdCBmaWx0ZXJzIGlucHV0IGZyb20gdGhlIHNwZWNpZmllZAotICAgICAgcmVhZGVyLgorICAgICAgQ3VzdG9tIGZpbHRlciByZWFkZXJzIHNlbGVjdG9ycyBhcmUgZGF0YXR5cGVzIHRoYXQKKyAgICAgIGltcGxlbWVudCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuZmlsdGVycy5DaGFpbmFibGVSZWFkZXI8L2NvZGU+LgogICAgIDwvcD4KICAgICA8cD4KLSAgICAgIEZvciBleGFtcGxlIGEgZmlsdGVycmVhZGVyIHRoYXQgcmVtb3ZlcyBldmVyeSBzZWNvbmQgY2hhcmFjdGVyCi0gICAgICBjb3VsZCBiZToKKyAgICAgIFRoZXJlIGlzIG9ubHkgb25lIG1ldGhvZCByZXF1aXJlZCwgPGNvZGUgY2xhc3M9ImNvZGUiPlJlYWRlciBjaGFpbihSZWFkZXIgcmVhZGVyKTwvY29kZT4uCisgICAgICBUaGlzIHJldHVybnMgYSByZWFkZXIgdGhhdCBmaWx0ZXJzIGlucHV0IGZyb20gdGhlIHNwZWNpZmllZCByZWFkZXIuCiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cD4KKyAgICAgIEZvciBleGFtcGxlIGEgZmlsdGVycmVhZGVyIHRoYXQgcmVtb3ZlcyBldmVyeSBzZWNvbmQgY2hhcmFjdGVyIGNvdWxkIGJlOgorICAgIDwvcD4KKyAgICA8cHJlPgogcHVibGljIGNsYXNzIFJlbW92ZU9kZENoYXJhY3RlcnMgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgewotICAgcHVibGljIFJlYWRlciBjaGFpbihSZWFkZXIgcmVhZGVyKSB7Ci0gICAgICByZXR1cm4gbmV3IEJhc2VGaWx0ZXJSZWFkZXIocmVhZGVyKSB7Ci0gICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZCgpOwotICAgICAgICAgICAgICAgIGlmIChjID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gbmV3IEJhc2VGaWx0ZXJSZWFkZXIocmVhZGVyKSB7CisgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGlmICgoY291bnQgJSAyKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIGlmICgoY291bnQgJSAyKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLSAgIH0KLX0KLSAgICAgIDwvcHJlPgotICAgIDwvYmxvY2txdW90ZT4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK308L3ByZT4KICAgICA8cD4KLSAgICAgIEZvciBsaW5lIG9yaWVudGVkIGZpbHRlcnMgaXQgbWF5IGJlIGVhc2llciB0byBleHRlbmQKLSAgICAgIDxjb2RlPkNoYWluYWJsZUZpbHRlclJlYWRlcjwvY29kZT4gYW4gaW5uZXIgY2xhc3Mgb2YKLSAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVG9rZW5GaWx0ZXI8L2NvZGU+LgorICAgICAgRm9yIGxpbmUgb3JpZW50ZWQgZmlsdGVycyBpdCBtYXkgYmUgZWFzaWVyIHRvCisgICAgICBleHRlbmQgPGNvZGUgY2xhc3M9ImNvZGUiPkNoYWluYWJsZUZpbHRlclJlYWRlcjwvY29kZT4gYW4gaW5uZXIgY2xhc3MKKyAgICAgIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRva2VuRmlsdGVyPC9jb2RlPi4KICAgICA8L3A+CiAgICAgPHA+CiAgICAgICBGb3IgZXhhbXBsZSBhIGZpbHRlciB0aGF0IGFwcGVuZHMgdGhlIGxpbmUgbnVtYmVyIGNvdWxkIGJlCiAgICAgPC9wPgotICAgIDxibG9ja3F1b3RlPgotICAgICAgPHByZT4KKyAgICA8cHJlPgogcHVibGljIGNsYXNzIEFkZExpbmVOdW1iZXIgZXh0ZW5kcyBDaGFpbmFibGVSZWFkZXJGaWx0ZXIgewotICAgcHJpdmF0ZSB2b2lkIGxpbmVOdW1iZXIgPSAwOwotICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHN0cmluZykgewotICAgICAgbGluZU51bWJlcisrOwotICAgICAgcmV0dXJuICIiICsgbGluZU51bWJlciArICJcdCIgKyBzdHJpbmc7Ci0gICB9Ci19Ci0gICAgICA8L3ByZT4KLSAgICA8L2Jsb2NrcXVvdGU+CisgICAgcHJpdmF0ZSB2b2lkIGxpbmVOdW1iZXIgPSAwOworICAgIHB1YmxpYyBTdHJpbmcgZmlsdGVyKFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgbGluZU51bWJlcisrOworICAgICAgICByZXR1cm4gIiIgKyBsaW5lTnVtYmVyICsgIlx0IiArIHN0cmluZzsKKyAgICB9Cit9PC9wcmU+CiAKLQotICAgIDxocj48L2hyPgogICA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9kZXNjcmlwdGlvbi5odG1sIGIvbWFudWFsL1R5cGVzL2Rlc2NyaXB0aW9uLmh0bWwKaW5kZXggODU5NDJiZS4uMTU5Yzc3NyAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL2Rlc2NyaXB0aW9uLmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL2Rlc2NyaXB0aW9uLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzMyArMTUsMjkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9ImRlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjwvYT48L2gyPgorPGgyIGlkPSJkZXNjcmlwdGlvbiI+RGVzY3JpcHRpb248L2gyPgogPGgzPkRlc2NyaXB0aW9uPC9oMz4KLTxwPkFsbG93cyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvamVjdCB0byBiZSBzcGVjaWZpZWQgdGhhdAotd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IG9mIHRoZSA8Y29kZT5hbnQgJiN4MjAxMTtwcm9qZWN0aGVscDwvY29kZT4KLWNvbW1hbmQuPC9wPgorPHA+QWxsb3dzIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9qZWN0IHRvIGJlIHNwZWNpZmllZCB0aGF0IHdpbGwgYmUKK2luY2x1ZGVkIGluIHRoZSBvdXRwdXQgb2YgdGhlIDxrYmQ+YW50IC1wcm9qZWN0aGVscDwva2JkPiBjb21tYW5kLjwvcD4KIAogPGgzPlBhcmFtZXRlcnM8L2gzPgogPHA+KG5vbmUpPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwcmU+ICAKKzxwcmU+CiAmbHQ7ZGVzY3JpcHRpb24mZ3Q7Ci1UaGlzIGJ1aWxkZmlsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBGb28gc3VicHJvamVjdCB3aXRoaW4gCitUaGlzIGJ1aWxkZmlsZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBGb28gc3VicHJvamVjdCB3aXRoaW4KIHRoZSBsYXJnZSwgY29tcGxleCBCYXIgcHJvamVjdC4KICZsdDsvZGVzY3JpcHRpb24mZ3Q7CiA8L3ByZT4KIAotCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9kaXJzZXQuaHRtbCBiL21hbnVhbC9UeXBlcy9kaXJzZXQuaHRtbAppbmRleCAwNDM0ZTljLi4zMjc3ODQ3IDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvZGlyc2V0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL2RpcnNldC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTQxICsxNSwxMjAgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkRpclNldCBUeXBlPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJkaXJzZXQiPkRpclNldDwvYT48L2gyPgotPHA+QSBEaXJTZXQgaXMgYSBncm91cCBvZiBkaXJlY3Rvcmllcy4gVGhlc2UgZGlyZWN0b3JpZXMgY2FuIGJlIGZvdW5kIGluIGEKLWRpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGluIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFyZSBtYXRjaGVkIGJ5Ci1wYXR0ZXJucyB0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhIGhyZWY9InBhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldHM8L2E+Ci1hbmQgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yczwvYT4uCi08L3A+Ci08cD5QYXR0ZXJuU2V0cyBjYW4gYmUgc3BlY2lmaWVkIGFzIG5lc3RlZAotPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSW4gYWRkaXRpb24sIERpclNldCBob2xkcwotYW4gaW1wbGljaXQgUGF0dGVyblNldCBhbmQgc3VwcG9ydHMgdGhlIG5lc3RlZAotPGNvZGU+Jmx0O2luY2x1ZGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2luY2x1ZGVzZmlsZSZndDs8L2NvZGU+LAotPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGVzZmlsZSZndDs8L2NvZGU+Ci1lbGVtZW50cyBvZiA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGRpcmVjdGx5LCBhcyB3ZWxsIGFzCi08Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+J3MgYXR0cmlidXRlcy48L3A+Ci08cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBEaXJTZXQuCi1JZiBhbnkgb2YgdGhlIHNlbGVjdG9ycyB3aXRoaW4gdGhlIERpclNldCBkbyBub3Qgc2VsZWN0IHRoZSBkaXJlY3RvcnksIGl0Ci1pcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBEaXJTZXQuIFRoaXMgbWFrZXMgYSBEaXJTZXQKLWVxdWl2YWxlbnQgdG8gYW4gPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IHNlbGVjdG9yIGNvbnRhaW5lci48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGgyIGlkPSJkaXJzZXQiPkRpclNldDwvaDI+Cis8cD5BIERpclNldCBpcyBhIGdyb3VwIG9mIGRpcmVjdG9yaWVzLiBUaGVzZSBkaXJlY3RvcmllcyBjYW4gYmUgZm91bmQgaW4gYSBkaXJlY3RvcnkgdHJlZQorc3RhcnRpbmcgaW4gYSBiYXNlIGRpcmVjdG9yeSBhbmQgYXJlIG1hdGNoZWQgYnkgcGF0dGVybnMgdGFrZW4gZnJvbSBhIG51bWJlcgorb2YgPGEgaHJlZj0icGF0dGVybnNldC5odG1sIj5QYXR0ZXJuU2V0czwvYT4gYW5kIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5TZWxlY3RvcnM8L2E+LjwvcD4KKzxwPlBhdHRlcm5TZXRzIGNhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEluCithZGRpdGlvbiwgRGlyU2V0IGhvbGRzIGFuIGltcGxpY2l0IFBhdHRlcm5TZXQgYW5kIHN1cHBvcnRzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtpbmNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtleGNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGRpcmVjdGx5LAorYXMgd2VsbCBhcyA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+J3MgYXR0cmlidXRlcy48L3A+Cis8cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBEaXJTZXQuICBJZiBhbnkgb2YgdGhlIHNlbGVjdG9ycword2l0aGluIHRoZSBEaXJTZXQgZG8gbm90IHNlbGVjdCB0aGUgZGlyZWN0b3J5LCBpdCBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBEaXJTZXQuIFRoaXMKK21ha2VzIGEgRGlyU2V0IGVxdWl2YWxlbnQgdG8gYW4gPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IHNlbGVjdG9yIGNvbnRhaW5lci48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZSBvZiB0aGlzIERpclNldC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZGlyPC90ZD4KKyAgICA8dGQ+VGhlIHJvb3Qgb2YgdGhlIGRpcmVjdG9yeSB0cmVlIG9mIHRoaXMgRGlyU2V0LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgY29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGRpcmVjdG9yaWVzIHRoYXQKLSAgICAgbXVzdCBiZSBpbmNsdWRlZDsgYWxsIGRpcmVjdG9yaWVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZGlyZWN0b3JpZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgZGlyZWN0b3JpZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uCi0gICAgICA8Yj5Ob3RlOjwvYj4gaWYgdGhlIGZpbGUgaXMgZW1wdHkgYW5kIHRoZXJlIGFyZSBubyBvdGhlcgotICAgICAgcGF0dGVybnMgZGVmaW5lZCBmb3IgdGhlIGZpbGVzZXQsIGFsbCBkaXJlY3RvcmllcyB3aWxsIGJlIGluY2x1ZGVkLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUKKyAgICAgIHBhdHRlcm4uIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gaWYgdGhlIGZpbGUgaXMgZW1wdHkgYW5kIHRoZXJlIGFyZSBubyBvdGhlciBwYXR0ZXJucyBkZWZpbmVkCisgICAgICBmb3IgdGhlIGZpbGVzZXQsIGFsbCBkaXJlY3RvcmllcyB3aWxsIGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhjbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBjb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZGlyZWN0b3JpZXMgdGhhdAotICAgICBtdXN0IGJlIGV4Y2x1ZGVkOyBubyBkaXJlY3RvcmllcyBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Q29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGRpcmVjdG9yaWVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gbm9uZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB3aGV0aGVyIGNhc2Utc2Vuc2l0aXZpdHkgc2hvdWxkIGJlIGFwcGxpZWQKLSAgICAgKDxjb2RlPnRydWU8L2NvZGU+fDxjb2RlPnllczwvY29kZT58PGNvZGU+b248L2NvZGU+IG9yCi0gICAgIDxjb2RlPmZhbHNlPC9jb2RlPnw8Y29kZT5ubzwvY29kZT58PGNvZGU+b2ZmPC9jb2RlPikuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBjYXNlLXNlbnNpdGl2aXR5IHNob3VsZCBiZSBhcHBsaWVkICg8cT50cnVlPC9xPiwgPHE+eWVzPC9xPiwgPHE+b248L3E+CisgICAgICBvciA8cT5mYWxzZTwvcT4sIDxxPm5vPC9xPiwgPHE+b2ZmPC9xPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Zm9sbG93c3ltbGlua3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2hhbGwgc3ltYm9saWMgbGlua3MgYmUgZm9sbG93ZWQ/IERlZmF1bHRzIHRvCi0gICAgICB0cnVlLiBTZWUgPGEgaHJlZj0iZmlsZXNldC5odG1sI3N5bWxpbmsiPmZpbGVzZXQncyBkb2N1bWVudGF0aW9uPC9hPi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mb2xsb3dzeW1saW5rczwvdGQ+CisgICAgPHRkPlNoYWxsIHN5bWJvbGljIGxpbmtzIGJlIGZvbGxvd2VkPyAgU2VlIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCNzeW1saW5rIj5maWxlc2V0J3MKKyAgICAgIGRvY3VtZW50YXRpb248L2E+LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yb25taXNzaW5nZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgU3BlY2lmeSB3aGF0IGhhcHBlbnMgaWYgdGhlIGJhc2UgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotICAgICAgSWYgdHJ1ZSBhIGJ1aWxkIGVycm9yIHdpbGwgaGFwcGVuLCBpZiBmYWxzZSwgdGhlIGRpcnNldAotICAgICAgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LgotICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xIChkZWZhdWx0IGlzIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgcmVhc29ucy4pPC9lbT4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5lcnJvcm9ubWlzc2luZ2RpcjwvdGQ+CisgICAgPHRkPlNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHRoZSBiYXNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gIElmIDxxPnRydWU8L3E+IGEgYnVpbGQgZXJyb3IKKyAgICAgIHdpbGwgaGFwcGVuLCBpZiA8cT5mYWxzZTwvcT4sIHRoZSBkaXJzZXQgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LiAgPGVtPlNpbmNlIEFwYWNoZSBBbnQKKyAgICAgIDEuNy4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdHJ1ZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucyk8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAogPGg0PkV4YW1wbGVzPC9oND4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi9jbGFzc2VzJnF1b3Q7LyZndDsKICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqLypUZXN0KiZxdW90Oy8mZ3Q7CiAmbHQ7L2RpcnNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkdyb3VwcyBhbGwgZGlyZWN0b3JpZXMgbmFtZWQgPGNvZGU+Y2xhc3NlczwvY29kZT4gZm91bmQgdW5kZXIgdGhlCi08Y29kZT5hcHBzPC9jb2RlPiBzdWJkaXJlY3Rvcnkgb2YgPGNvZGU+JHtidWlsZC5kaXJ9PC9jb2RlPiwgZXhjZXB0IHRob3NlCi10aGF0IGhhdmUgdGhlIHRleHQgPGNvZGU+VGVzdDwvY29kZT4gaW4gdGhlaXIgbmFtZS48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyBhbGwgZGlyZWN0b3JpZXMgbmFtZWQgPHNhbXA+Y2xhc3Nlczwvc2FtcD4gZm91bmQgdW5kZXIgdGhlIDxzYW1wPmFwcHM8L3NhbXA+IHN1YmRpcmVjdG9yeQorb2YgPHNhbXA+JHtidWlsZC5kaXJ9PC9zYW1wPiwgZXhjZXB0IHRob3NlIHRoYXQgaGF2ZSB0aGUgdGV4dCA8c2FtcD5UZXN0PC9zYW1wPiBpbiB0aGVpciBuYW1lLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CiAgICZsdDtwYXR0ZXJuc2V0IGlkPSZxdW90O25vbi50ZXN0LmNsYXNzZXMmcXVvdDsmZ3Q7CiAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqL2NsYXNzZXMmcXVvdDsvJmd0OwogICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi8qVGVzdComcXVvdDsvJmd0OwogICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CiAmbHQ7L2RpcnNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkdyb3VwcyB0aGUgc2FtZSBkaXJlY3RvcmllcyBhcyB0aGUgYWJvdmUgZXhhbXBsZSwgYnV0IGFsc28gZXN0YWJsaXNoZXMKLWEgUGF0dGVyblNldCB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGluIG90aGVyCi08Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMsIHJvb3RlZCBhdCBhIGRpZmZlcmVudCBkaXJlY3RvcnkuPC9wPgorPC9wcmU+Cis8cD5Hcm91cHMgdGhlIHNhbWUgZGlyZWN0b3JpZXMgYXMgdGhlIGFib3ZlIGV4YW1wbGUsIGJ1dCBhbHNvIGVzdGFibGlzaGVzIGEgUGF0dGVyblNldCB0aGF0IGNhbiBiZQorcmVmZXJlbmNlZCBpbiBvdGhlciA8Y29kZT4mbHQ7ZGlyc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMsIHJvb3RlZCBhdCBhIGRpZmZlcmVudCBkaXJlY3RvcnkuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtkaXJzZXQgZGlyPSZxdW90OyR7ZGVidWdfYnVpbGQuZGlyfSZxdW90OyZndDsKICAgJmx0O3BhdHRlcm5zZXQgcmVmaWQ9JnF1b3Q7bm9uLnRlc3QuY2xhc3NlcyZxdW90Oy8mZ3Q7CiAmbHQ7L2RpcnNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkdyb3VwcyBhbGwgZGlyZWN0b3JpZXMgaW4gZGlyZWN0b3J5IDxjb2RlPiR7ZGVidWdfYnVpbGQuZGlyfTwvY29kZT4sCi11c2luZyB0aGUgc2FtZSBwYXR0ZXJucyBhcyB0aGUgYWJvdmUgZXhhbXBsZS48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyBhbGwgZGlyZWN0b3JpZXMgaW4gZGlyZWN0b3J5IDxzYW1wPiR7ZGVidWdfYnVpbGQuZGlyfTwvc2FtcD4sIHVzaW5nIHRoZSBzYW1lIHBhdHRlcm5zIGFzCit0aGUgYWJvdmUgZXhhbXBsZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2RpcnNldCBpZD0mcXVvdDtkaXJzZXQmcXVvdDsgZGlyPSZxdW90OyR7d29ya2luZ2Rpcn0mcXVvdDsmZ3Q7CiAgICAmbHQ7cHJlc2VudCB0YXJnZXRkaXI9JnF1b3Q7JHt3b3JraW5nZGlyfSZxdW90OyZndDsKLSAgICAgICAgJmx0O21hcHBlciB0eXBlPSZxdW90O2dsb2ImcXVvdDsgZnJvbT0mcXVvdDsqJnF1b3Q7IHRvPSZxdW90OyovJHttYXJrZXJmaWxlfSZxdW90OyAvJmd0OworICAgICAgICAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyomcXVvdDsgdG89JnF1b3Q7Ki8ke21hcmtlcmZpbGV9JnF1b3Q7LyZndDsKICAgICZsdDsvcHJlc2VudCZndDsKICZsdDsvZGlyc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+U2VsZWN0cyBhbGwgZGlyZWN0b3JpZXMgc29tZXdoZXJlIHVuZGVyIDxjb2RlPiR7d29ya2luZ2Rpcn08L2NvZGU+Ci13aGljaCBjb250YWluIGEgPGNvZGU+JHttYXJrZXJmaWxlfTwvY29kZT4uPC9wPgotCis8L3ByZT4KKzxwPlNlbGVjdHMgYWxsIGRpcmVjdG9yaWVzIHNvbWV3aGVyZSB1bmRlciA8c2FtcD4ke3dvcmtpbmdkaXJ9PC9zYW1wPiB3aGljaCBjb250YWluCithIDxzYW1wPiR7bWFya2VyZmlsZX08L3NhbXA+LjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvZXh0ZW5zaW9uLmh0bWwgYi9tYW51YWwvVHlwZXMvZXh0ZW5zaW9uLmh0bWwKaW5kZXggYjA1YzBhNi4uYzdlNmUxNCAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL2V4dGVuc2lvbi5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9leHRlbnNpb24uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDc4ICsxNSw3NCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkV4dGVuc2lvbiBUeXBlPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+Ci08aDI+PGEgbmFtZT0iZmlsZXNldCI+RXh0ZW5zaW9uPC9hPjwvaDI+Ci08cD5VdGlsaXR5IHR5cGUgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhbiBhdmFpbGFibGUgIk9wdGlvbmFsIFBhY2thZ2UiCi0gKGZvcm1lcmx5IGtub3duIGFzICJTdGFuZGFyZCBFeHRlbnNpb24iKSBhcyBkZXNjcmliZWQgaW4gdGhlIG1hbmlmZXN0Ci0gb2YgYSBKQVIgZmlsZSwgb3IgdGhlIHJlcXVpcmVtZW50IGZvciBzdWNoIGFuIG9wdGlvbmFsIHBhY2thZ2UuPC9wPgotPHA+Tm90ZSB0aGF0IHRoaXMgdHlwZQotd29ya3Mgd2l0aCBleHRlbnNpb25zIGFzIGRlZmluZWQgYnkgdGhlICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgotIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50Ci08ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4gaW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyCi1KYXZhMiBTdGFuZGFyZCBFZGl0aW9uIHBhY2thZ2UsIGluIGZpbGUKLTxjb2RlPmd1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9jb2RlPiBvciB0aGUgb25saW5lCi08YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy92ZXJzaW9uaW5nL3NwZWMvdmVyc2lvbmluZzIuaHRtbCN3cDkwNzc5Ij4KLVBhY2thZ2UgVmVyc2lvbmluZyBkb2N1bWVudGF0aW9uLjwvcD4KKzxoMiBpZD0iZmlsZXNldCI+RXh0ZW5zaW9uPC9oMj4KKzxwPlV0aWxpdHkgdHlwZSB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGFuIGF2YWlsYWJsZSAiT3B0aW9uYWwgUGFja2FnZSIgKGZvcm1lcmx5IGtub3duIGFzICJTdGFuZGFyZAorRXh0ZW5zaW9uIikgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW5pZmVzdCBvZiBhIEpBUiBmaWxlLCBvciB0aGUgcmVxdWlyZW1lbnQgZm9yIHN1Y2ggYW4gb3B0aW9uYWwKK3BhY2thZ2UuPC9wPgorPHA+Tm90ZSB0aGF0IHRoaXMgdHlwZSB3b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBvcHRpb25hbCBwYWNrYWdlcywgc2VlIHRoZSBkb2N1bWVudCA8ZW0+T3B0aW9uYWwgUGFja2FnZSBWZXJzaW9uaW5nPC9lbT4KK2luIHRoZSBkb2N1bWVudGF0aW9uIGJ1bmRsZSBmb3IgeW91ciBKYXZhIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4KK2ZpbGUgPHNhbXA+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L3NhbXA+IG9yIHRoZQorb25saW5lIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy92ZXJzaW9uaW5nL3NwZWMvdmVyc2lvbmluZzIuaHRtbCN3cDkwNzc5IgordGFyZ2V0PSJfdG9wIj5QYWNrYWdlIFZlcnNpb25pbmcgZG9jdW1lbnRhdGlvbi48L2E+PC9wPgogCiA8aDM+QXR0cmlidXRlczwvaDM+Ci08cD5UaGUgZXh0ZW5zaW9uIHR5cGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzPC9hPjoKLTwvcD4KKzxwPlRoZSBleHRlbnNpb24gdHlwZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4dGVuc2lvbk5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgZXh0ZW5zaW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPnllczwvdGQ+CisgICAgPHRkPmV4dGVuc2lvbk5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBleHRlbnNpb248L3RkPgorICAgIDx0ZD55ZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zcGVjaWZpY2F0aW9uVmVyc2lvbjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdmVyc2lvbiBvZiBleHRlbnNpb24gc3BlY2lmaWNhdGlvbiAoTXVzdCBiZSBpbgotICAgIGRld2V5IGRlY2ltYWwgYWthIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLiAzLjIuNCk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICAgIDx0ZD5zcGVjaWZpY2F0aW9uVmVyc2lvbjwvdGQ+CisgICAgPHRkPlRoZSB2ZXJzaW9uIG9mIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uIChtdXN0IGJlIGluIGRld2V5IGRlY2ltYWwgYWthIGRvdHRlZCBkZWNpbWFsCisgICAgICBub3RhdGlvbiwgZWcgPHE+My4yLjQ8L3E+KTwvdGQ+CisgICAgPHRkPm5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWNhdGlvblZlbmRvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc3BlY2lmaWNhdGlvbiB2ZW5kb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICAgIDx0ZD5zcGVjaWZpY2F0aW9uVmVuZG9yPC90ZD4KKyAgICA8dGQ+VGhlIHNwZWNpZmljYXRpb24gdmVuZG9yPC90ZD4KKyAgICA8dGQ+bm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsZW1lbnRhdGlvblZlcnNpb248L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHZlcnNpb24gb2YgZXh0ZW5zaW9uIGltcGxlbWVudGF0aW9uIChNdXN0IGJlIGluCi0gICAgZGV3ZXkgZGVjaW1hbCBha2EgZG90dGVkIGRlY2ltYWwgbm90YXRpb24uIDMuMi40KTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgICAgPHRkPmltcGxlbWVudGF0aW9uVmVyc2lvbjwvdGQ+CisgICAgPHRkPlRoZSB2ZXJzaW9uIG9mIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiAobXVzdCBiZSBpbiBkZXdleSBkZWNpbWFsIGFrYSBkb3R0ZWQgZGVjaW1hbAorICAgICAgbm90YXRpb24sIGVnIDxxPjMuMi40PC9xPik8L3RkPgorICAgIDx0ZD5ubzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uVmVuZG9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbXBsZW1lbnRhdGlvbiB2ZW5kb3I8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+bm88L3RkPgorICAgIDx0ZD5pbXBsZW1lbnRhdGlvblZlbmRvcjwvdGQ+CisgICAgPHRkPlRoZSBpbXBsZW1lbnRhdGlvbiB2ZW5kb3I8L3RkPgorICAgIDx0ZD5ubzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmltcGxlbWVudGF0aW9uVmVuZG9ySWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGltcGxlbWVudGF0aW9uIHZlbmRvciBJRDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgICAgPHRkPmltcGxlbWVudGF0aW9uVmVuZG9ySWQ8L3RkPgorICAgIDx0ZD5UaGUgaW1wbGVtZW50YXRpb24gdmVuZG9yIElEPC90ZD4KKyAgICA8dGQ+bm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbXBsZW1lbnRhdGlvblVSTDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXJsIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgZXh0ZW5zaW9uLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+CisgICAgPHRkPmltcGxlbWVudGF0aW9uVVJMPC90ZD4KKyAgICA8dGQ+VGhlIHVybCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIGV4dGVuc2lvbi48L3RkPgorICAgIDx0ZD5ubzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+RXhhbXBsZXM8L2g0PgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O2UxJnF1b3Q7CiAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtNeUV4dGVuc2lvbnMmcXVvdDsKICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsKQEAgLTkzLDIyICs5MCwxOSBAQAogICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQ9JnF1b3Q7dnYmcXVvdDsKICAgICBpbXBsZW1lbnRhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUmcXVvdDsKICAgICBpbXBsZW1lbnRhdGlvblZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25VUkw9JnF1b3Q7aHR0cDovL3NvbWV3aGVyZS5jb20vbXlFeHQuamFyJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICBpbXBsZW1lbnRhdGlvblVSTD0mcXVvdDtodHRwczovL3NvbWV3aGVyZS5jb20vbXlFeHQuamFyJnF1b3Q7LyZndDsKKzwvcHJlPgogCi08cD5GdWxseSBzcGVjaWZpYyBleHRlbnNpb24gb2JqZWN0LjwvcD4KKzxwPkZ1bGx5IHNwZWNpZmllZCBleHRlbnNpb24gb2JqZWN0LjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZXh0ZW5zaW9uIGlkPSZxdW90O2UxJnF1b3Q7CiAgICAgZXh0ZW5zaW9uTmFtZT0mcXVvdDtNeUV4dGVuc2lvbnMmcXVvdDsKICAgICBzcGVjaWZpY2F0aW9uVmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsKICAgICBzcGVjaWZpY2F0aW9uVmVuZG9yPSZxdW90O1BldGVyIERvbmFsZCZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8L3ByZT4KIAotPHA+RXh0ZW5zaW9uIG9iamVjdCB0aGF0IGp1c3Qgc3BlY2llcyB0aGUgc3BlY2lmaWNhdGlvbiBkZXRhaWxzLjwvcD4KLQotCis8cD5FeHRlbnNpb24gb2JqZWN0IHRoYXQganVzdCBzcGVjaWZpZXMgdGhlIHNwZWNpZmljYXRpb24gZGV0YWlscy48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL2V4dGVuc2lvbnNldC5odG1sIGIvbWFudWFsL1R5cGVzL2V4dGVuc2lvbnNldC5odG1sCmluZGV4IGYzOGMxZWQuLjBjYjUzODUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9leHRlbnNpb25zZXQuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvZXh0ZW5zaW9uc2V0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw5ICsxNSw4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RXh0ZW5zaW9uU2V0IFR5cGU8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjQsMzIgKzI0LDI4IEBACiA8Ym9keT4KIDxoMj48YT5FeHRlbnNpb25TZXQ8L2E+PC9oMj4KIDxwPlV0aWxpdHkgdHlwZSB0aGF0IHJlcHJlc2VudHMgYSBzZXQgb2YgRXh0ZW5zaW9ucy48L3A+Ci08cD5Ob3RlIHRoYXQgdGhpcyB0eXBlCi13b3JrcyB3aXRoIGV4dGVuc2lvbnMgYXMgZGVmaW5lZCBieSB0aGUgIk9wdGlvbmFsIFBhY2thZ2UiIHNwZWNpZmljYXRpb24uCi0gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgb3B0aW9uYWwgcGFja2FnZXMsIHNlZSB0aGUgZG9jdW1lbnQKLTxlbT5PcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmc8L2VtPiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidW5kbGUgZm9yIHlvdXIKLUphdmEyIFN0YW5kYXJkIEVkaXRpb24gcGFja2FnZSwgaW4gZmlsZQotPGNvZGU+Z3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWw8L2NvZGU+IG9yIG9ubGluZSBhdAotPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvdmVyc2lvbmluZy9zcGVjL3ZlcnNpb25pbmcyLmh0bWwjd3A5MDc3OSI+Ci1QYWNrYWdlIFZlcnNpb25pbmcgZG9jdW1lbnRhdGlvbi48L3A+Cis8cD5Ob3RlIHRoYXQgdGhpcyB0eXBlIHdvcmtzIHdpdGggZXh0ZW5zaW9ucyBhcyBkZWZpbmVkIGJ5IHRoZSAiT3B0aW9uYWwgUGFja2FnZSIgc3BlY2lmaWNhdGlvbi4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG9wdGlvbmFsIHBhY2thZ2VzLCBzZWUgdGhlIGRvY3VtZW50IDxlbT5PcHRpb25hbCBQYWNrYWdlIFZlcnNpb25pbmc8L2VtPgoraW4gdGhlIGRvY3VtZW50YXRpb24gYnVuZGxlIGZvciB5b3VyIEphdmEgU3RhbmRhcmQgRWRpdGlvbiBwYWNrYWdlLCBpbgorZmlsZSA8c2FtcD5ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvc2FtcD4gb3Igb25saW5lCithdCA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvdmVyc2lvbmluZy9zcGVjL3ZlcnNpb25pbmcyLmh0bWwjd3A5MDc3OSIKK3RhcmdldD0iX3RvcCI+UGFja2FnZSBWZXJzaW9uaW5nIGRvY3VtZW50YXRpb24uPC9hPjwvcD4KIAotPGgzPk5lc3RlZCBFbGVtZW50czwvaDM+Cis8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KIAogPGg0PmV4dGVuc2lvbjwvaDQ+CiA8cD48YSBocmVmPSJleHRlbnNpb24uaHRtbCI+RXh0ZW5zaW9uPC9hPiBvYmplY3QgdG8gYWRkIHRvIHNldC48L3A+CiAKIDxoND5maWxlc2V0PC9oND4KLSA8cD48YSBocmVmPSIuLi9UeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cyBhbGwgZmlsZXMgY29udGFpbmVkCi0gY29udGFpbmVkIHdpdGhpbiBzZXQgdGhhdCBhcmUgamFycyBhbmQgaW1wbGVtZW50IGFuIGV4dGVuc2lvbiBhcmUgYWRkZWQKLSB0byBleHRlbnNpb24gc2V0LjwvcD4KKzxwPjxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zIGFsbCBmaWxlcyBjb250YWluZWQgY29udGFpbmVkIHdpdGhpbiBzZXQgdGhhdCBhcmUgamFycyBhbmQKK2ltcGxlbWVudCBhbiBleHRlbnNpb24gYXJlIGFkZGVkIHRvIGV4dGVuc2lvbiBzZXQuPC9wPgogCi08aDQ+TGliRmlsZVNldDwvaDQ+Ci0gPHA+QWxsIGZpbGVzIGNvbnRhaW5lZCBjb250YWluZWQgd2l0aGluIHNldCB0aGF0IGFyZSBqYXJzIGFuZCBpbXBsZW1lbnQgCi0gYW4gZXh0ZW5zaW9uIGFyZSBhZGRlZCB0byBleHRlbnNpb24gc2V0LiBIb3dldmVyIHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gCi0gbWF5IGJlIG1vZGlmaWVkIGJ5IGF0dHJpYnV0ZXMgb2YgbGliZmlsZXNldDwvcD4KKzxoND5saWJmaWxlc2V0PC9oND4KKzxwPkFsbCBmaWxlcyBjb250YWluZWQgY29udGFpbmVkIHdpdGhpbiBzZXQgdGhhdCBhcmUgamFycyBhbmQgaW1wbGVtZW50IGFuIGV4dGVuc2lvbiBhcmUgYWRkZWQgdG8KK2V4dGVuc2lvbiBzZXQuIEhvd2V2ZXIsIHRoZSBleHRlbnNpb24gaW5mb3JtYXRpb24gbWF5IGJlIG1vZGlmaWVkIGJ5IGF0dHJpYnV0ZXMgb2YgbGliZmlsZXNldC48L3A+CiAKIDxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtleHRlbnNpb24gaWQ9JnF1b3Q7ZTEmcXVvdDsKICAgICBleHRlbnNpb25OYW1lPSZxdW90O015RXh0ZW5zaW9ucyZxdW90OwogICAgIHNwZWNpZmljYXRpb25WZXJzaW9uPSZxdW90OzEuMCZxdW90OwpAQCAtNTcsNyArNTMsNyBAQAogICAgIGltcGxlbWVudGF0aW9uVmVuZG9ySUQ9JnF1b3Q7dnYmcXVvdDsKICAgICBpbXBsZW1lbnRhdGlvblZlbmRvcj0mcXVvdDtBcGFjaGUmcXVvdDsKICAgICBpbXBsZW1lbnRhdGlvblZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7Ci0gICAgaW1wbGVtZW50YXRpb25VUkw9JnF1b3Q7aHR0cDovL3NvbWV3aGVyZS5jb20vbXlFeHQuamFyJnF1b3Q7LyZndDsKKyAgICBpbXBsZW1lbnRhdGlvblVSTD0mcXVvdDtodHRwczovL3NvbWV3aGVyZS5jb20vbXlFeHQuamFyJnF1b3Q7LyZndDsKIAogJmx0O2xpYmZpbGVzZXQgaWQ9ImxmcyIKICAgICAgICAgICAgICAgIGluY2x1ZGVVcmw9InRydWUiCkBAIC03MywxMSArNjksNyBAQAogICAmbHQ7bGliZmlsZXNldCByZWZpZD0ibGZzIi8mZ3Q7CiAgICZsdDtleHRlbnNpb24gcmVmaWQ9ImUxIi8mZ3Q7CiAmbHQ7L2V4dGVuc2lvblNldCZndDsKLQotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi0KKzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9maWxlbGlzdC5odG1sIGIvbWFudWFsL1R5cGVzL2ZpbGVsaXN0Lmh0bWwKaW5kZXggNTdjOTgxZC4uZmYwYjYyNSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL2ZpbGVsaXN0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL2ZpbGVsaXN0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMDcgKzE1LDg5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5GaWxlTGlzdCBUeXBlPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJmaWxlbGlzdCI+RmlsZUxpc3Q8L2E+PC9oMj4gCis8aDIgaWQ9ImZpbGVsaXN0Ij5GaWxlTGlzdDwvaDI+CiAKLTxwPkZpbGVMaXN0cyBhcmUgZXhwbGljaXRseSBuYW1lZCBsaXN0cyBvZiBmaWxlcy4gIFdoZXJlYXMgRmlsZVNldHMKLWFjdCBhcyBmaWx0ZXJzLCByZXR1cm5pbmcgb25seSB0aG9zZSBmaWxlcyB0aGF0IGV4aXN0IGluIHRoZSBmaWxlCi1zeXN0ZW0gYW5kIG1hdGNoIHNwZWNpZmllZCBwYXR0ZXJucywgRmlsZUxpc3RzIGFyZSB1c2VmdWwgZm9yCi1zcGVjaWZ5aW5nIGZpbGVzIHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3QuICBNdWx0aXBsZSBmaWxlcyBhcmUKLXNwZWNpZmllZCBhcyBhIGxpc3Qgb2YgZmlsZXMsIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LAotd2l0aCBubyBzdXBwb3J0IGZvciB3aWxkY2FyZCBleHBhbnNpb24gKGZpbGVuYW1lcyB3aXRoIHdpbGRjYXJkcyB3aWxsIGJlCi1pbmNsdWRlZCBpbiB0aGUgbGlzdCB1bmNoYW5nZWQpLgotRmlsZUxpc3RzIGNhbiBhcHBlYXIgaW5zaWRlIHRhc2tzIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUgb3IgYXMgc3RhbmQtYWxvbmUKLXR5cGVzLgotPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPkZpbGVMaXN0cyBhcmUgZXhwbGljaXRseSBuYW1lZCBsaXN0cyBvZiBmaWxlcy4gIFdoZXJlYXMgRmlsZVNldHMgYWN0IGFzIGZpbHRlcnMsIHJldHVybmluZworb25seSB0aG9zZSBmaWxlcyB0aGF0IGV4aXN0IGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgbWF0Y2ggc3BlY2lmaWVkIHBhdHRlcm5zLCBGaWxlTGlzdHMgYXJlCit1c2VmdWwgZm9yIHNwZWNpZnlpbmcgZmlsZXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBleGlzdC4gIE11bHRpcGxlIGZpbGVzIGFyZSBzcGVjaWZpZWQgYXMgYSBsaXN0CitvZiBmaWxlcywgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnksIHdpdGggbm8gc3VwcG9ydCBmb3Igd2lsZGNhcmQgZXhwYW5zaW9uIChmaWxlbmFtZXMKK3dpdGggd2lsZGNhcmRzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgdW5jaGFuZ2VkKS4gIEZpbGVMaXN0cyBjYW4gYXBwZWFyIGluc2lkZSB0YXNrcyB0aGF0CitzdXBwb3J0IHRoaXMgZmVhdHVyZSBvciBhcyBzdGFuZC1hbG9uZSB0eXBlcy48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGlzIEZpbGVMaXN0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5kaXI8L3RkPgorICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhpcyBGaWxlTGlzdC48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbGlzdCBvZiBmaWxlIG5hbWVzLiBUaGlzIGlzIGEgbGlzdCBvZgotICAgIGZpbGUgbmFtZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgb3IgYnkgY29tbWFzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4KLSAgICAgIFllcywgdW5sZXNzIHRoZXJlIGlzIGEgbmVzdGVkIGZpbGUgZWxlbWVudDwvdGQ+CisgICAgPHRkPmZpbGVzPC90ZD4KKyAgICA8dGQ+VGhlIGxpc3Qgb2YgZmlsZSBuYW1lcy4gVGhpcyBpcyBhIGxpc3Qgb2YgZmlsZSBuYW1lIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBvciBieQorICAgIGNvbW1hcy48L3RkPgorICAgIDx0ZD5ZZXMsIHVubGVzcyB0aGVyZSBpcyBhIG5lc3RlZCBmaWxlIGVsZW1lbnQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLSAgPGg0Pk5lc3RlZCBFbGVtZW50OiBmaWxlPC9oND4KLSAgPHA+Ci0gICAgVGhpcyByZXByZXNlbnRzIGEgZmlsZSBuYW1lLiBUaGUgbmVzdGVkIGVsZW1lbnQgYWxsb3dzIGZpbGVuYW1lcyBjb250YWluaW5nCi0gICAgd2hpdGUgc3BhY2UgYW5kIGNvbW1hcy4KLSAgPC9wPgotICA8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuMjwvZW0+PC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgZmlsZS48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgotICAgIDwvdHI+Ci08L3RhYmxlPiAgCis8aDQ+TmVzdGVkIGVsZW1lbnQ6IGZpbGU8L2g0PgorPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42LjI8L2VtPjwvcD4KKzxwPlRoaXMgcmVwcmVzZW50cyBhIGZpbGUgbmFtZS4gVGhlIG5lc3RlZCBlbGVtZW50IGFsbG93cyBmaWxlbmFtZXMgY29udGFpbmluZyB3aGl0ZSBzcGFjZSBhbmQKK2NvbW1hcy48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgZmlsZS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KIDxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O2ZpbGVsaXN0IAotICAgIGlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7IAorPHByZT4KKyZsdDtmaWxlbGlzdAorICAgIGlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7CiAgICAgZGlyPSZxdW90OyR7ZG9jLnNyY30mcXVvdDsKLSAgICBmaWxlcz0mcXVvdDtmb28ueG1sLGJhci54bWwmcXVvdDsvJmd0OyAKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICBmaWxlcz0mcXVvdDtmb28ueG1sLGJhci54bWwmcXVvdDsvJmd0OzwvcHJlPgogCi08cD5UaGUgZmlsZXMgPGNvZGU+JHtkb2Muc3JjfS9mb28ueG1sPC9jb2RlPiBhbmQKLTxjb2RlPiR7ZG9jLnNyY30vYmFyLnhtbDwvY29kZT4uICBOb3RlIHRoYXQgdGhlc2UgZmlsZXMgbWF5IG5vdCAoeWV0KQotYWN0dWFsbHkgZXhpc3QuCi08L3A+Cis8cD5UaGUgZmlsZXMgPHNhbXA+JHtkb2Muc3JjfS9mb28ueG1sPC9zYW1wPiBhbmQgPHNhbXA+JHtkb2Muc3JjfS9iYXIueG1sPC9zYW1wPi4gIE5vdGUgdGhhdAordGhlc2UgZmlsZXMgbWF5IG5vdCAoeWV0KSBhY3R1YWxseSBleGlzdC48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7ZmlsZWxpc3QgCi0gICAgaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsgCis8cHJlPgorJmx0O2ZpbGVsaXN0CisgICAgaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsKICAgICBkaXI9JnF1b3Q7JHtkb2Muc3JjfSZxdW90OwogICAgIGZpbGVzPSZxdW90O2Zvby54bWwKLSAgICAgICAgICAgYmFyLnhtbCZxdW90Oy8mZ3Q7IAotPC9wcmU+PC9ibG9ja3F1b3RlPgorICAgICAgICAgICBiYXIueG1sJnF1b3Q7LyZndDs8L3ByZT4KIAogPHA+U2FtZSBmaWxlcyBhcyB0aGUgZXhhbXBsZSBhYm92ZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7ZmlsZWxpc3QgcmVmaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsvJmd0OyAKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+Jmx0O2ZpbGVsaXN0IHJlZmlkPSZxdW90O2RvY2ZpbGVzJnF1b3Q7LyZndDs8L3ByZT4KIAogPHA+U2FtZSBmaWxlcyBhcyB0aGUgZXhhbXBsZSBhYm92ZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7ZmlsZWxpc3QgCi0gICAgaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsgCis8cHJlPgorJmx0O2ZpbGVsaXN0CisgICAgaWQ9JnF1b3Q7ZG9jZmlsZXMmcXVvdDsKICAgICBkaXI9JnF1b3Q7JHtkb2Muc3JjfSZxdW90OyZndDsKICAgICAmbHQ7ZmlsZSBuYW1lPSJmb28ueG1sIi8mZ3Q7CiAgICAgJmx0O2ZpbGUgbmFtZT0iYmFyLnhtbCIvJmd0OwotJmx0Oy9maWxlbGlzdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZWxpc3QmZ3Q7PC9wcmU+CiAKIDxwPlNhbWUgZmlsZXMgYXMgdGhlIGV4YW1wbGUgYWJvdmUuPC9wPgogCi0KLQogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvZmlsZXNldC5odG1sIGIvbWFudWFsL1R5cGVzL2ZpbGVzZXQuaHRtbAppbmRleCAzZDkwMTcyLi42ZGRhMmM0IDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvZmlsZXNldC5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9maWxlc2V0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNzMgKzE1LDE2MCBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RmlsZVNldCBUeXBlPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJmaWxlc2V0Ij5GaWxlU2V0PC9hPjwvaDI+Ci08cD5BIEZpbGVTZXQgaXMgYSBncm91cCBvZiBmaWxlcy4gVGhlc2UgZmlsZXMgY2FuIGJlIGZvdW5kIGluIGEKLWRpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGluIGEgYmFzZSBkaXJlY3RvcnkgYW5kIGFyZSBtYXRjaGVkIGJ5Ci1wYXR0ZXJucyB0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhCi1ocmVmPSJwYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXRzPC9hPiBhbmQKLTxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5TZWxlY3RvcnM8L2E+LgotPHA+UGF0dGVyblNldHMgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEluIGFkZGl0aW9uLCBGaWxlU2V0IGhvbGRzCi1hbiBpbXBsaWNpdCBQYXR0ZXJuU2V0IGFuZCBzdXBwb3J0cyB0aGUgbmVzdGVkCi08Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7aW5jbHVkZXNmaWxlJmd0OzwvY29kZT4sCi08Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZXNmaWxlJmd0OzwvY29kZT4KLWVsZW1lbnRzIG9mIFBhdHRlcm5TZXQgZGlyZWN0bHksIGFzIHdlbGwgYXMgUGF0dGVyblNldCdzCis8aDIgaWQ9ImZpbGVzZXQiPkZpbGVTZXQ8L2gyPgorPHA+QSBGaWxlU2V0IGlzIGEgZ3JvdXAgb2YgZmlsZXMuIFRoZXNlIGZpbGVzIGNhbiBiZSBmb3VuZCBpbiBhIGRpcmVjdG9yeSB0cmVlIHN0YXJ0aW5nIGluIGEKK2Jhc2UgZGlyZWN0b3J5IGFuZCBhcmUgbWF0Y2hlZCBieSBwYXR0ZXJucyB0YWtlbiBmcm9tIGEgbnVtYmVyCitvZiA8YSBocmVmPSJwYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXRzPC9hPiBhbmQgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yczwvYT4uPC9wPgorPHA+UGF0dGVyblNldHMgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cy4gSW4KK2FkZGl0aW9uLCBGaWxlU2V0IGhvbGRzIGFuIGltcGxpY2l0IFBhdHRlcm5TZXQgYW5kIHN1cHBvcnRzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtpbmNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtleGNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiBQYXR0ZXJuU2V0IGRpcmVjdGx5LCBhcyB3ZWxsIGFzIFBhdHRlcm5TZXQncwogYXR0cmlidXRlcy48L3A+Ci08cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBGaWxlU2V0LgotSWYgYW55IG9mIHRoZSBzZWxlY3RvcnMgd2l0aGluIHRoZSBGaWxlU2V0IGRvIG5vdCBzZWxlY3QgdGhlIGZpbGUsIHRoZQotZmlsZSBpcyBub3QgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBGaWxlU2V0LiBUaGlzIG1ha2VzIGEgRmlsZVNldAotZXF1aXZhbGVudCB0byBhbiA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4gc2VsZWN0b3IgY29udGFpbmVyLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBGaWxlU2V0LiBJZiBhbnkgb2YgdGhlIHNlbGVjdG9ycword2l0aGluIHRoZSBGaWxlU2V0IGRvIG5vdCBzZWxlY3QgdGhlIGZpbGUsIHRoZSBmaWxlIGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEZpbGVTZXQuIFRoaXMKK21ha2VzIGEgRmlsZVNldCBlcXVpdmFsZW50IHRvIGFuIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBjb250YWluZXIuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUgb2YgdGhpcyBGaWxlU2V0LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiBkaXIgb3IgZmlsZSBtdXN0IGJlIHNwZWNpZmllZDwvdGQ+CisgICAgPHRkPmRpcjwvdGQ+CisgICAgPHRkPnRoZSByb290IG9mIHRoZSBkaXJlY3RvcnkgdHJlZSBvZiB0aGlzIEZpbGVTZXQuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgZGlyIG9yIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnNob3J0Y3V0IGZvciBzcGVjaWZ5aW5nIGEgc2luZ2xlLWZpbGUgZmlsZXNldDwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+c2hvcnRjdXQgZm9yIHNwZWNpZnlpbmcgYSBzaW5nbGUtZmlsZSBmaWxlc2V0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluZGljYXRlcyB3aGV0aGVyIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj5kZWZhdWx0IGV4Y2x1ZGVzPC9hPiBzaG91bGQgYmUgdXNlZCBvciBub3QKLSAgICAgICg8Y29kZT55ZXMgfCBubzwvY29kZT4pOyBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSB1c2VkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5pbmRpY2F0ZXMgd2hldGhlciA8YSBocmVmPSIuLi9kaXJ0YXNrcy5odG1sI2RlZmF1bHRleGNsdWRlcyI+ZGVmYXVsdCBleGNsdWRlczwvYT4gc2hvdWxkCisgICAgICBiZSB1c2VkIG9yIG5vdCAoPGNvZGU+eWVzfG5vPC9jb2RlPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnllczwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBpbmNsdWRlZDsgYWxsIGZpbGVzIGFyZSBpbmNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBhbGwgZmlsZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPGJyLz4KLSAgICAgIDxiPk5vdGU6PC9iPiBpZiB0aGUgZmlsZSBpcyBlbXB0eSBhbmQgdGhlcmUgYXJlIG5vIG90aGVyCi0gICAgICBwYXR0ZXJucyBkZWZpbmVkIGZvciB0aGUgZmlsZXNldCwgYWxsIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQuCisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48YnIvPgorICAgICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBpZiB0aGUgZmlsZSBpcyBlbXB0eSBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIHBhdHRlcm5zIGRlZmluZWQgZm9yCisgICAgICB0aGUgZmlsZXNldCwgYWxsIGZpbGVzIHdpbGwgYmUgaW5jbHVkZWQuCiAgICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlCi0gICAgICBleGNsdWRlZDsgbm8gZmlsZXMgKGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzKSBhcmUgZXhjbHVkZWQgd2hlbiBvbWl0dGVkLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzPC90ZD4KKyAgICA8dGQ+Y29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBleGNsdWRlcyBvciBub25lIGlmIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+IGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5uYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk11c3QgdGhlIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMgYmUgdHJlYXRlZCBpbiBhIGNhc2Ugc2Vuc2l0aXZlIHdheT8KLSAgICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+TXVzdCB0aGUgaW5jbHVkZSBhbmQgZXhjbHVkZSBwYXR0ZXJucyBiZSB0cmVhdGVkIGluIGEgY2FzZSBzZW5zaXRpdmUgd2F5PzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvbGxvd3N5bWxpbmtzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNoYWxsIHN5bWJvbGljIGxpbmtzIGJlIGZvbGxvd2VkPyBEZWZhdWx0cyB0bwotICAgICAgdHJ1ZS4gU2VlIHRoZSBub3RlIDxhIGhyZWY9IiNzeW1saW5rIj5iZWxvdzwvYT4uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Zm9sbG93c3ltbGlua3M8L3RkPgorICAgIDx0ZD5TaGFsbCBzeW1ib2xpYyBsaW5rcyBiZSBmb2xsb3dlZD8gU2VlIHRoZSBub3RlIDxhIGhyZWY9IiNzeW1saW5rIj5iZWxvdzwvYT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXJyb3Jvbm1pc3NpbmdkaXI8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBTcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYmFzZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuCi0gICAgICBJZiB0cnVlIGEgYnVpbGQgZXJyb3Igd2lsbCBoYXBwZW4sIGlmIGZhbHNlLCB0aGUgZmlsZXNldAotICAgICAgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LgotICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgIDxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xIChkZWZhdWx0IGlzIHRydWUgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKLSAgICAgICAgcmVhc29ucy4pPC9lbT4KKyAgICA8dGQ+ZXJyb3Jvbm1pc3NpbmdkaXI8L3RkPgorICAgIDx0ZD4KKyAgICAgIFNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIHRoZSBiYXNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4gSWYgPHE+dHJ1ZTwvcT4gYSBidWlsZCBlcnJvcgorICAgICAgd2lsbCBoYXBwZW4sIGlmIDxxPmZhbHNlPC9xPiwgdGhlIGZpbGVzZXQgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LgorICAgICAgPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L2VtPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29ucyk8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+PGEgbmFtZT0ic3ltbGluayI+PGI+Tm90ZTwvYj48L2E+OiBBbGwgZmlsZXMvZGlyZWN0b3JpZXMgZm9yIHdoaWNoCi10aGUgY2Fub25pY2FsIHBhdGggaXMgZGlmZmVyZW50IGZyb20gaXRzIHBhdGggYXJlIGNvbnNpZGVyZWQgc3ltYm9saWMKLWxpbmtzLiAgT24gVW5peCBzeXN0ZW1zIHRoaXMgdXN1YWxseSBtZWFucyB0aGUgZmlsZSByZWFsbHkgaXMgYQotc3ltYm9saWMgbGluayBidXQgaXQgbWF5IGxlYWQgdG8gZmFsc2UgcmVzdWx0cyBvbiBvdGhlcgotcGxhdGZvcm1zLjwvcD4KKzxwIGlkPSJzeW1saW5rIj48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEFsbCBmaWxlcy9kaXJlY3RvcmllcyBmb3Igd2hpY2ggdGhlIGNhbm9uaWNhbCBwYXRoIGlzCitkaWZmZXJlbnQgZnJvbSBpdHMgcGF0aCBhcmUgY29uc2lkZXJlZCBzeW1ib2xpYyBsaW5rcy4gT24gVW5peCBzeXN0ZW1zIHRoaXMgdXN1YWxseSBtZWFucyB0aGUKK2ZpbGUgcmVhbGx5IGlzIGEgc3ltYm9saWMgbGluayBidXQgaXQgbWF5IGxlYWQgdG8gZmFsc2UgcmVzdWx0cyBvbiBvdGhlciBwbGF0Zm9ybXMuPC9wPgorCis8cD5BbnQgaXMgcmVzdHJpY3RlZCB0byBmZWF0dXJlcyB0aGF0IEpSRSBjb25zaWRlcnMgcG9ydGFibGUsIGFuZCBzeW1ib2xpYyBsaW5rcyBpcyBvbmUgc3VjaCBmZWF0dXJlCit0aGF0IHdhcyBsb25nIGNvbnNpZGVyZWQgbm9uLXBvcnRhYmxlLiBUaGF0IGhhcyBjaGFuZ2VkIHdpdGggSmF2YSA3IGFuZCBOSU8uMiwgeWV0IGZ1bGwgc3VwcG9ydCBmb3IKK3N5bWJvbGljIGxpbmtzIGlzIHN0aWxsIGxhY2tpbmcgKG5vdGFibHksIGluIFppcCBmaWxlcykuIEZ1bGwgc3VwcG9ydCBvZiBzeW1ib2xpYyBsaW5rcyBpbiBBbnQgd291bGQKK3JlcXVpcmUgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgRmlsZVNldCBhbmQgcmV2aXNpb24gb2YgYWxsIHRhc2tzIGFuZC9vciB0eXBlcyB0aGF0IGRlcml2ZQorZnJvbSBpdC4gQ3VycmVudGx5LCB0aGUgc2VtYW50aWNzIG9mIDx2YXI+Zm9sbG93c3ltbGlua3M8L3Zhcj4gaW4gRmlsZVNldCBpcyBzdWNoIHRoYXQgPHE+ZmFsc2U8L3E+CitleGNsdWRlcyBzeW1ib2xpYyBsaW5rcyBjb21wbGV0ZWx5LCBhbmQgPHE+dHJ1ZTwvcT4gYWxsb3dzIHN5bWJvbGljIGxpbmtzIHRvIGJlIGNvbnNpZGVyZWQgYnkKK3NlbGVjdG9ycywgd2hpY2ggbWF5IGhhdmUgdGhlaXIgb3duIDx2YXI+Zm9sbG93c3ltbGlua3M8L3Zhcj4gYXR0cmlidXRlcyB3aXRoIHByb3BlciBzZW1hbnRpY3M7CitpLmUuLCA8cT5mYWxzZTwvcT4gYWxsb3dzIHNlbGVjdG9yIHRvIGluc3BlY3QgcHJvcGVydGllcyBvZiBhIHN5bWJvbGljIGxpbmsgaXRzZWxmLCBhbmQgPHE+dHJ1ZTwvcT4KK3Rob3NlIG9mIGl0cyB0YXJnZXQuCis8L3A+CiAKIDxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3NlcnZlci5zcmN9JnF1b3Q7IGNhc2VzZW5zaXRpdmU9JnF1b3Q7eWVzJnF1b3Q7Jmd0OwogICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CiAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKlRlc3QqJnF1b3Q7LyZndDsKICZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkdyb3VwcyBhbGwgZmlsZXMgaW4gZGlyZWN0b3J5IDxjb2RlPiR7c2VydmVyLnNyY308L2NvZGU+IHRoYXQgYXJlIEphdmEKLXNvdXJjZSBmaWxlcyBhbmQgZG9uJ3QgaGF2ZSB0aGUgdGV4dCA8Y29kZT5UZXN0PC9jb2RlPiBpbiB0aGVpcgotbmFtZS48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyBhbGwgZmlsZXMgaW4gZGlyZWN0b3J5IDxzYW1wPiR7c2VydmVyLnNyY308L3NhbXA+IHRoYXQgYXJlIEphdmEgc291cmNlIGZpbGVzIGFuZCBkb24ndAoraGF2ZSB0aGUgdGV4dCA8c2FtcD5UZXN0PC9zYW1wPiBpbiB0aGVpciBuYW1lLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzZXJ2ZXIuc3JjfSZxdW90OyBjYXNlc2Vuc2l0aXZlPSZxdW90O3llcyZxdW90OyZndDsKICAgJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7bm9uLnRlc3Quc291cmNlcyZxdW90OyZndDsKICAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CiAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qVGVzdComcXVvdDsvJmd0OwogICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CiAmbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5Hcm91cHMgdGhlIHNhbWUgZmlsZXMgYXMgdGhlIGFib3ZlIGV4YW1wbGUsIGJ1dCBhbHNvIGVzdGFibGlzaGVzCi1hIFBhdHRlcm5TZXQgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvdGhlcgotPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPiBlbGVtZW50cywgcm9vdGVkIGF0IGEgZGlmZmVyZW50IGRpcmVjdG9yeS48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgYWJvdmUgZXhhbXBsZSwgYnV0IGFsc28gZXN0YWJsaXNoZXMgYSBQYXR0ZXJuU2V0IHRoYXQgY2FuIGJlCityZWZlcmVuY2VkIGluIG90aGVyIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMsIHJvb3RlZCBhdCBhIGRpZmZlcmVudCBkaXJlY3RvcnkuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2NsaWVudC5zcmN9JnF1b3Q7ICZndDsKICAgJmx0O3BhdHRlcm5zZXQgcmVmaWQ9JnF1b3Q7bm9uLnRlc3Quc291cmNlcyZxdW90Oy8mZ3Q7CiAmbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5Hcm91cHMgYWxsIGZpbGVzIGluIGRpcmVjdG9yeSA8Y29kZT4ke2NsaWVudC5zcmN9PC9jb2RlPiwgdXNpbmcgdGhlCi1zYW1lIHBhdHRlcm5zIGFzIHRoZSBhYm92ZSBleGFtcGxlLjwvcD4KKzwvcHJlPgorPHA+R3JvdXBzIGFsbCBmaWxlcyBpbiBkaXJlY3RvcnkgPHNhbXA+JHtjbGllbnQuc3JjfTwvc2FtcD4sIHVzaW5nIHRoZSBzYW1lIHBhdHRlcm5zIGFzIHRoZQorYWJvdmUgZXhhbXBsZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c2VydmVyLnNyY30mcXVvdDsgY2FzZXNlbnNpdGl2ZT0mcXVvdDt5ZXMmcXVvdDsmZ3Q7CiAgICZsdDtmaWxlbmFtZSBuYW1lPSZxdW90OyoqLyouamF2YSZxdW90Oy8mZ3Q7CiAgICZsdDtmaWxlbmFtZSBuYW1lPSZxdW90OyoqLypUZXN0KiZxdW90OyBuZWdhdGU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CiAmbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5Hcm91cHMgdGhlIHNhbWUgZmlsZXMgYXMgdGhlIHRvcCBleGFtcGxlLCBidXQgdXNpbmcgdGhlCi08Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiBzZWxlY3Rvci48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgdG9wIGV4YW1wbGUsIGJ1dCB1c2luZyB0aGUgPGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4KK3NlbGVjdG9yLjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzZXJ2ZXIuc3JjfSZxdW90OyBjYXNlc2Vuc2l0aXZlPSZxdW90O3llcyZxdW90OyZndDsKICAgJmx0O2ZpbGVuYW1lIG5hbWU9JnF1b3Q7KiovKi5qYXZhJnF1b3Q7LyZndDsKICAgJmx0O25vdCZndDsKICAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0mcXVvdDsqKi8qVGVzdComcXVvdDsvJmd0OwogICAmbHQ7L25vdCZndDsKICZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPkdyb3VwcyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIHRoZQotPGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4gc2VsZWN0b3IgYW5kIHRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4KLXNlbGVjdG9yIGNvbnRhaW5lci48L3A+Cis8L3ByZT4KKzxwPkdyb3VwcyB0aGUgc2FtZSBmaWxlcyBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mCit0aGUgPGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4gc2VsZWN0b3IgYW5kIHRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gc2VsZWN0b3IKK2NvbnRhaW5lci48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9Im1haW4vIiAvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+U2VsZWN0cyBhbGwgZmlsZXMgaW4gPGk+c3JjL21haW48L2k+IChlLmcuIDxpPnNyYy9tYWluL0Zvby5qYXZhPC9pPiBvciAKLTxpPnNyYy9tYWluL2FwcGxpY2F0aW9uL0Jhci5qYXZhPC9pPikuPC9wPgotCi0KKzxwcmU+Jmx0O2ZpbGVzZXQgZGlyPSJzcmMiIGluY2x1ZGVzPSJtYWluLyIvJmd0OzwvcHJlPgorPHA+U2VsZWN0cyBhbGwgZmlsZXMgaW4gPHNhbXA+c3JjL21haW48L3NhbXA+IChlLmcuIDxzYW1wPnNyYy9tYWluL0Zvby5qYXZhPC9zYW1wPgorb3IgPHNhbXA+c3JjL21haW4vYXBwbGljYXRpb24vQmFyLmphdmE8L3NhbXA+KS48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL2ZpbHRlcmNoYWluLmh0bWwgYi9tYW51YWwvVHlwZXMvZmlsdGVyY2hhaW4uaHRtbAppbmRleCBjODNiMTA2Li4wNWI5NWE2IDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvZmlsdGVyY2hhaW4uaHRtbAorKysgYi9tYW51YWwvVHlwZXMvZmlsdGVyY2hhaW4uaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDUxICsxNSwzOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkZpbHRlckNoYWlucyBhbmQgRmlsdGVyUmVhZGVyczwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCiA8aDI+RmlsdGVyQ2hhaW5zIGFuZCBGaWx0ZXJSZWFkZXJzPC9oMj4KLUNvbnNpZGVyIHRoZSBmbGV4aWJpbGl0eSBvZiBVbml4IHBpcGVzLiAgSWYgeW91IHdhbnRlZCwKLWZvciBleGFtcGxlLCB0byBjb3B5IGp1c3QgdGhvc2UgbGluZXMgdGhhdCBjb250YWluZWQgdGhlCi1zdHJpbmcgYmxlZSBmcm9tIHRoZSBmaXJzdCAxMCBsaW5lcyBvZiBhIHRleHQgZmlsZSAnZm9vJwotKDxlbT55b3Ugd291bGRuJ3Qgd2FudCB0byBmaWx0ZXIgYSBiaW5hcnkgZmlsZTwvZW0+KQotdG8gYSBmaWxlICdiYXInLCB5b3Ugd291bGQgZG8gc29tZXRoaW5nIGxpa2U6PHA+Ci08Y29kZT4KLWNhdCBmb298aGVhZCAtbjEwfGdyZXAgYmxlZSAmZ3Q7IGJhcgotPC9jb2RlPjxwPgotQXBhY2hlIEFudCB3YXMgbm90IGZsZXhpYmxlIGVub3VnaC4gIFRoZXJlIHdhcyBubyB3YXkgZm9yIHRoZQotPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrIHRvIGRvIHNvbWV0aGluZyBzaW1pbGFyLiAgSWYgeW91IHdhbnRlZAotdGhlIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4gdGFzayB0byBnZXQgdGhlIGZpcnN0IDEwIGxpbmVzLCB5b3Ugd291bGQgaGF2ZQotaGFkIHRvIGNyZWF0ZSBzcGVjaWFsIGF0dHJpYnV0ZXM6PHA+Ci08Y29kZT4KLSZsdDtjb3B5IGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7IHRvZmlsZT0mcXVvdDtiYXImcXVvdDsgaGVhZD0mcXVvdDsxMCZxdW90OyBjb250YWlucz0mcXVvdDtibGVlJnF1b3Q7LyZndDsKLTwvY29kZT48cD4KLVRoZSBvYnZpb3VzIHByb2JsZW0gdGh1cyBzdXJmYWNlZDogQW50IHRhc2tzIHdvdWxkIG5vdCBiZSBhYmxlCi10byBhY2NvbW1vZGF0ZSBzdWNoIGRhdGEgdHJhbnNmb3JtYXRpb24gYXR0cmlidXRlcyBhcyB0aGV5IHdvdWxkCi1iZSBlbmRsZXNzLiAgVGhlIHRhc2sgd291bGQgYWxzbyBub3Qga25vdyBpbiB3aGljaCBvcmRlciB0aGVzZQotYXR0cmlidXRlcyB3ZXJlIHRvIGJlIGludGVycHJldGVkLiAgVGhhdCBpcywgbXVzdCB0aGUgdGFzayBleGVjdXRlIHRoZQotY29udGFpbnMgYXR0cmlidXRlIGZpcnN0IGFuZCB0aGVuIHRoZSBoZWFkIGF0dHJpYnV0ZSBvciB2aWNlLXZlcnNhPwotV2hhdCBBbnQgdGFza3MgbmVlZGVkIHdhcyBhIG1lY2hhbmlzbSB0byBhbGxvdyBwbHVnZ2FibGUgZmlsdGVyIChkYXRhCi10cmFuc2Zvcm1lcikgY2hhaW5zLiAgQW50IHdvdWxkIHByb3ZpZGUgYSBmZXcgZmlsdGVycyBmb3Igd2hpY2ggdGhlcmUKLWhhdmUgYmVlbiByZXBlYXRlZCByZXF1ZXN0cy4gIFVzZXJzIHdpdGggc3BlY2lhbCBmaWx0ZXJpbmcgbmVlZHMKLXdvdWxkIGJlIGFibGUgdG8gZWFzaWx5IHdyaXRlIHRoZWlyIG93biBhbmQgcGx1ZyB0aGVtIGluLjxwPgorPHA+Q29uc2lkZXIgdGhlIGZsZXhpYmlsaXR5IG9mIFVuaXggcGlwZXMuICBJZiB5b3Ugd2FudGVkLCBmb3IgZXhhbXBsZSwgdG8gY29weSBqdXN0IHRob3NlIGxpbmVzCit0aGF0IGNvbnRhaW5lZCB0aGUgc3RyaW5nIDxxPmJsZWU8L3E+IGZyb20gdGhlIGZpcnN0IDEwIGxpbmVzIG9mIGEgdGV4dCBmaWxlIDxzYW1wPmZvbzwvc2FtcD4KKyg8ZW0+eW91IHdvdWxkbid0IHdhbnQgdG8gZmlsdGVyIGEgYmluYXJ5IGZpbGU8L2VtPikgdG8gYSBmaWxlIDxzYW1wPmJhcjwvc2FtcD4sIHlvdSB3b3VsZCBkbworc29tZXRoaW5nIGxpa2U6PC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmNhdCBmb298aGVhZCAtbjEwfGdyZXAgYmxlZSAmZ3Q7IGJhcjwvcHJlPgorPHA+QXBhY2hlIEFudCB3YXMgbm90IGZsZXhpYmxlIGVub3VnaC4gIFRoZXJlIHdhcyBubyB3YXkgZm9yIHRoZSA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IHRhc2sgdG8KK2RvIHNvbWV0aGluZyBzaW1pbGFyLiAgSWYgeW91IHdhbnRlZCB0aGUgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrIHRvIGdldCB0aGUgZmlyc3QgMTAgbGluZXMsCit5b3Ugd291bGQgaGF2ZSBoYWQgdG8gY3JlYXRlIHNwZWNpYWwgYXR0cmlidXRlczo8L3A+Cis8cHJlPiZsdDtjb3B5IGZpbGU9JnF1b3Q7Zm9vJnF1b3Q7IHRvZmlsZT0mcXVvdDtiYXImcXVvdDsgaGVhZD0mcXVvdDsxMCZxdW90OyBjb250YWlucz0mcXVvdDtibGVlJnF1b3Q7LyZndDs8L3ByZT4KKzxwPlRoZSBvYnZpb3VzIHByb2JsZW0gdGh1cyBzdXJmYWNlZDogQW50IHRhc2tzIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGFjY29tbW9kYXRlIHN1Y2ggZGF0YQordHJhbnNmb3JtYXRpb24gYXR0cmlidXRlcyBhcyB0aGV5IHdvdWxkIGJlIGVuZGxlc3MuICBUaGUgdGFzayB3b3VsZCBhbHNvIG5vdCBrbm93IGluIHdoaWNoIG9yZGVyCit0aGVzZSBhdHRyaWJ1dGVzIHdlcmUgdG8gYmUgaW50ZXJwcmV0ZWQuICBUaGF0IGlzLCBtdXN0IHRoZSB0YXNrIGV4ZWN1dGUgdGhlIGNvbnRhaW5zIGF0dHJpYnV0ZQorZmlyc3QgYW5kIHRoZW4gdGhlIGhlYWQgYXR0cmlidXRlIG9yIHZpY2UtdmVyc2E/ICBXaGF0IEFudCB0YXNrcyBuZWVkZWQgd2FzIGEgbWVjaGFuaXNtIHRvIGFsbG93CitwbHVnZ2FibGUgZmlsdGVyIChkYXRhIHRyYW5zZm9ybWVyKSBjaGFpbnMuICBBbnQgd291bGQgcHJvdmlkZSBhIGZldyBmaWx0ZXJzIGZvciB3aGljaCB0aGVyZSBoYXZlCitiZWVuIHJlcGVhdGVkIHJlcXVlc3RzLiAgVXNlcnMgd2l0aCBzcGVjaWFsIGZpbHRlcmluZyBuZWVkcyB3b3VsZCBiZSBhYmxlIHRvIGVhc2lseSB3cml0ZSB0aGVpciBvd24KK2FuZCBwbHVnIHRoZW0gaW4uPC9wPgogCi1UaGUgc29sdXRpb24gd2FzIHRvIHJlZmFjdG9yIGRhdGEgdHJhbnNmb3JtYXRpb24gb3JpZW50ZWQKLXRhc2tzIHRvIHN1cHBvcnQgRmlsdGVyQ2hhaW5zLiAgQSBGaWx0ZXJDaGFpbiBpcyBhIGdyb3VwIG9mCi1vcmRlcmVkIEZpbHRlclJlYWRlcnMuICBVc2VycyBjYW4gZGVmaW5lIHRoZWlyIG93biBGaWx0ZXJSZWFkZXJzCi1ieSBqdXN0IGV4dGVuZGluZyB0aGUgamF2YS5pby5GaWx0ZXJSZWFkZXIgY2xhc3MuICBTdWNoIGN1c3RvbQotRmlsdGVyUmVhZGVycyBjYW4gYmUgZWFzaWx5IHBsdWdnZWQgaW4gYXMgbmVzdGVkIGVsZW1lbnRzIG9mCi08Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBieSB1c2luZyA8Y29kZT4mbHQ7ZmlsdGVycmVhZGVyJmd0OzwvY29kZT4gZWxlbWVudHMuCi08cD4KLUV4YW1wbGU6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+VGhlIHNvbHV0aW9uIHdhcyB0byByZWZhY3RvciBkYXRhIHRyYW5zZm9ybWF0aW9uIG9yaWVudGVkIHRhc2tzIHRvIHN1cHBvcnQgRmlsdGVyQ2hhaW5zLiAgQQorRmlsdGVyQ2hhaW4gaXMgYSBncm91cCBvZiBvcmRlcmVkIEZpbHRlclJlYWRlcnMuICBVc2VycyBjYW4gZGVmaW5lIHRoZWlyIG93biBGaWx0ZXJSZWFkZXJzIGJ5IGp1c3QKK2V4dGVuZGluZyB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEuaW8uRmlsdGVyUmVhZGVyPC9jb2RlPiBjbGFzcy4gIFN1Y2ggY3VzdG9tIEZpbHRlclJlYWRlcnMgY2FuCitiZSBlYXNpbHkgcGx1Z2dlZCBpbiBhcyBuZXN0ZWQgZWxlbWVudHMgb2YgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gYnkKK3VzaW5nIDxjb2RlPiZsdDtmaWx0ZXJyZWFkZXImZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Cis8cD5FeGFtcGxlOjwvcD4KKzxwcmU+CiAmbHQ7Y29weSBmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHRvZmlsZT0mcXVvdDske2Rlc3QuZmlsZX0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDt5b3VyLmV4dGVuc2lvbi5vZi5qYXZhLmlvLkZpbHRlclJlYWRlciZxdW90OyZndDsKQEAgLTcyLDUzNSArNjEsNDczIEBACiAgICAgICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDthYnJhJnF1b3Q7IHZhbHVlPSZxdW90O2NhZGFicmEmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCi1BbnQgcHJvdmlkZXMgc29tZSBidWlsdC1pbiBmaWx0ZXIgcmVhZGVycy4gIFRoZXNlIGZpbHRlciByZWFkZXJzCi1jYW4gYWxzbyBiZSBkZWNsYXJlZCB1c2luZyBhIHN5bnRheCBzaW1pbGFyIHRvIHRoZSBhYm92ZSBzeW50YXguCi1Ib3dldmVyLCB0aGV5IGNhbiBiZSBkZWNsYXJlZCB1c2luZyBzb21lIHNpbXBsZXIgc3ludGF4IGFsc28uPHA+Ci1FeGFtcGxlOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkFudCBwcm92aWRlcyBzb21lIGJ1aWx0LWluIGZpbHRlciByZWFkZXJzLiAgVGhlc2UgZmlsdGVyIHJlYWRlcnMgY2FuIGFsc28gYmUgZGVjbGFyZWQgdXNpbmcgYQorc3ludGF4IHNpbWlsYXIgdG8gdGhlIGFib3ZlIHN5bnRheC4gIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIGRlY2xhcmVkIHVzaW5nIHNvbWUgc2ltcGxlciBzeW50YXgKK2Fsc28uPC9wPgorPHA+RXhhbXBsZTo8L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7c3JjLmZpbGUuaGVhZCZxdW90OyZndDsKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtoZWFkZmlsdGVyIGxpbmVzPSZxdW90OzE1JnF1b3Q7LyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci1pcyBlcXVpdmFsZW50IHRvOgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+Cis8cD5pcyBlcXVpdmFsZW50IHRvOjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5IZWFkRmlsdGVyJnF1b3Q7Jmd0OwogICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bGluZXMmcXVvdDsgdmFsdWU9JnF1b3Q7MTUmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLVRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gdGFza3Mgc3VwcG9ydCBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMuPGJyPgotPGEgaHJlZj0iLi4vVGFza3MvY29uY2F0Lmh0bWwiPkNvbmNhdDwvYT4sPGJyPgotPGEgaHJlZj0iLi4vVGFza3MvY29weS5odG1sIj5Db3B5PC9hPiw8YnI+Ci08YSBocmVmPSIuLi9UYXNrcy9sb2FkZmlsZS5odG1sIj5Mb2FkRmlsZTwvYT4sPGJyPgotPGEgaHJlZj0iLi4vVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbCI+TG9hZFByb3BlcnRpZXM8L2E+LDxicj4KLTxhIGhyZWY9Ii4uL1Rhc2tzL2xvYWRyZXNvdXJjZS5odG1sIj5Mb2FkUmVzb3VyY2U8L2E+LDxicj4KLTxhIGhyZWY9Ii4uL1Rhc2tzL21vdmUuaHRtbCI+TW92ZTwvYT48YnI+PGJyPgorPHA+VGhlIGZvbGxvd2luZyBidWlsdC1pbiB0YXNrcyBzdXBwb3J0IG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cy48YnIvPgorPGEgaHJlZj0iLi4vVGFza3MvY29uY2F0Lmh0bWwiPkNvbmNhdDwvYT4sPGJyLz4KKzxhIGhyZWY9Ii4uL1Rhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT4sPGJyLz4KKzxhIGhyZWY9Ii4uL1Rhc2tzL2xvYWRmaWxlLmh0bWwiPkxvYWRGaWxlPC9hPiw8YnIvPgorPGEgaHJlZj0iLi4vVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbCI+TG9hZFByb3BlcnRpZXM8L2E+LDxici8+Cis8YSBocmVmPSIuLi9UYXNrcy9sb2FkcmVzb3VyY2UuaHRtbCI+TG9hZFJlc291cmNlPC9hPiw8YnIvPgorPGEgaHJlZj0iLi4vVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPjwvcD4KIAotQSBGaWx0ZXJDaGFpbiBpcyBmb3JtZWQgYnkgZGVmaW5pbmcgemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKLW5lc3RlZCBlbGVtZW50cy48YnI+Ci08YSBocmVmPSIjZmlsdGVycmVhZGVyIj5GaWx0ZXJSZWFkZXI8L2E+PGJyPgotPGEgaHJlZj0iI2NsYXNzY29uc3RhbnRzIj5DbGFzc0NvbnN0YW50czwvYT48YnI+Ci08YSBocmVmPSIjZXNjYXBldW5pY29kZSI+RXNjYXBlVW5pY29kZTwvYT48YnI+Ci08YSBocmVmPSIjZXhwYW5kcHJvcGVydGllcyI+RXhwYW5kUHJvcGVydGllczwvYT48YnI+Ci08YSBocmVmPSIjaGVhZGZpbHRlciI+SGVhZEZpbHRlcjwvYT48YnI+Ci08YSBocmVmPSIjbGluZWNvbnRhaW5zIj5MaW5lQ29udGFpbnM8L2E+PGJyPgotPGEgaHJlZj0iI2xpbmVjb250YWluc3JlZ2V4cCI+TGluZUNvbnRhaW5zUmVnRXhwPC9hPjxicj4KLTxhIGhyZWY9IiNwcmVmaXhsaW5lcyI+UHJlZml4TGluZXM8L2E+PGJyPgotPGEgaHJlZj0iI3JlcGxhY2V0b2tlbnMiPlJlcGxhY2VUb2tlbnM8L2E+PGJyPgotPGEgaHJlZj0iI3N0cmlwamF2YWNvbW1lbnRzIj5TdHJpcEphdmFDb21tZW50czwvYT48YnI+Ci08YSBocmVmPSIjc3RyaXBsaW5lYnJlYWtzIj5TdHJpcExpbmVCcmVha3M8L2E+PGJyPgotPGEgaHJlZj0iI3N0cmlwbGluZWNvbW1lbnRzIj5TdHJpcExpbmVDb21tZW50czwvYT48YnI+Ci08YSBocmVmPSIjc3VmZml4bGluZXMiPlN1ZmZpeExpbmVzPC9hPjxicj4KLTxhIGhyZWY9IiN0YWJzdG9zcGFjZXMiPlRhYnNUb1NwYWNlczwvYT48YnI+Ci08YSBocmVmPSIjdGFpbGZpbHRlciI+VGFpbEZpbHRlcjwvYT48YnI+Ci08YSBocmVmPSIjZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnI+Ci08YSBocmVmPSIjY29uY2F0ZmlsdGVyIj5Db25jYXRGaWx0ZXI8L2E+PGJyPgotPGEgaHJlZj0iI3Rva2VuZmlsdGVyIj5Ub2tlbkZpbHRlcjwvYT48YnI+Ci08YSBocmVmPSIuLi9UYXNrcy9maXhjcmxmLmh0bWwiPkZpeENSTEY8L2E+PGJyPgotPGEgaHJlZj0iI3NvcnRmaWx0ZXIiPlNvcnRGaWx0ZXI8L2E+PGJyPgorPHA+QSBGaWx0ZXJDaGFpbiBpcyBmb3JtZWQgYnkgZGVmaW5pbmcgemVybyBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgbmVzdGVkIGVsZW1lbnRzLjxici8+Cis8YSBocmVmPSIjZmlsdGVycmVhZGVyIj5GaWx0ZXJSZWFkZXI8L2E+PGJyLz4KKzxhIGhyZWY9IiNjbGFzc2NvbnN0YW50cyI+Q2xhc3NDb25zdGFudHM8L2E+PGJyLz4KKzxhIGhyZWY9IiNlc2NhcGV1bmljb2RlIj5Fc2NhcGVVbmljb2RlPC9hPjxici8+Cis8YSBocmVmPSIjZXhwYW5kcHJvcGVydGllcyI+RXhwYW5kUHJvcGVydGllczwvYT48YnIvPgorPGEgaHJlZj0iI2hlYWRmaWx0ZXIiPkhlYWRGaWx0ZXI8L2E+PGJyLz4KKzxhIGhyZWY9IiNsaW5lY29udGFpbnMiPkxpbmVDb250YWluczwvYT48YnIvPgorPGEgaHJlZj0iI2xpbmVjb250YWluc3JlZ2V4cCI+TGluZUNvbnRhaW5zUmVnRXhwPC9hPjxici8+Cis8YSBocmVmPSIjcHJlZml4bGluZXMiPlByZWZpeExpbmVzPC9hPjxici8+Cis8YSBocmVmPSIjcmVwbGFjZXRva2VucyI+UmVwbGFjZVRva2VuczwvYT48YnIvPgorPGEgaHJlZj0iI3N0cmlwamF2YWNvbW1lbnRzIj5TdHJpcEphdmFDb21tZW50czwvYT48YnIvPgorPGEgaHJlZj0iI3N0cmlwbGluZWJyZWFrcyI+U3RyaXBMaW5lQnJlYWtzPC9hPjxici8+Cis8YSBocmVmPSIjc3RyaXBsaW5lY29tbWVudHMiPlN0cmlwTGluZUNvbW1lbnRzPC9hPjxici8+Cis8YSBocmVmPSIjc3VmZml4bGluZXMiPlN1ZmZpeExpbmVzPC9hPjxici8+Cis8YSBocmVmPSIjdGFic3Rvc3BhY2VzIj5UYWJzVG9TcGFjZXM8L2E+PGJyLz4KKzxhIGhyZWY9IiN0YWlsZmlsdGVyIj5UYWlsRmlsdGVyPC9hPjxici8+Cis8YSBocmVmPSIjZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnIvPgorPGEgaHJlZj0iI2NvbmNhdGZpbHRlciI+Q29uY2F0RmlsdGVyPC9hPjxici8+Cis8YSBocmVmPSIjc29ydGZpbHRlciI+U29ydEZpbHRlcjwvYT48YnIvPgorPGEgaHJlZj0iI3Rva2VuZmlsdGVyIj5Ub2tlbkZpbHRlcjwvYT48YnIvPgorPGEgaHJlZj0iLi4vVGFza3MvZml4Y3JsZi5odG1sIj5GaXhDUkxGPC9hPjwvcD4KIAotPGgzPjxhIG5hbWU9ImZpbHRlcnJlYWRlciI+RmlsdGVyUmVhZGVyPC9hPjwvaDM+Cis8aDMgaWQ9ImZpbHRlcnJlYWRlciI+RmlsdGVyUmVhZGVyPC9oMz4KIAotVGhlIGZpbHRlcnJlYWRlciBlbGVtZW50IGlzIHRoZSBnZW5lcmljIHdheSB0bwotZGVmaW5lIGEgZmlsdGVyLiAgVXNlciBkZWZpbmVkIGZpbHRlciBlbGVtZW50cyBhcmUKLWRlZmluZWQgaW4gdGhlIGJ1aWxkIGZpbGUgdXNpbmcgdGhpcy4gIFBsZWFzZSBub3RlIHRoYXQKLWJ1aWx0IGluIGZpbHRlciByZWFkZXJzIGNhbiBhbHNvIGJlIGRlZmluZWQgdXNpbmcgdGhpcwotc3ludGF4LgorPHA+VGhlIDxjb2RlPmZpbHRlcnJlYWRlcjwvY29kZT4gZWxlbWVudCBpcyB0aGUgZ2VuZXJpYyB3YXkgdG8gZGVmaW5lIGEgZmlsdGVyLiAgVXNlciBkZWZpbmVkIGZpbHRlcgorZWxlbWVudHMgYXJlIGRlZmluZWQgaW4gdGhlIGJ1aWxkIGZpbGUgdXNpbmcgdGhpcy4gIFBsZWFzZSBub3RlIHRoYXQgYnVpbHQgaW4gZmlsdGVyIHJlYWRlcnMgY2FuCithbHNvIGJlIGRlZmluZWQgdXNpbmcgdGhpcyBzeW50YXguPC9wPgogCi1BIEZpbHRlclJlYWRlciBlbGVtZW50IG11c3QgYmUgc3VwcGxpZWQgd2l0aCBhIGNsYXNzIG5hbWUgYXMKLWFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBjbGFzcyByZXNvbHZlZCBieSB0aGlzIG5hbWUgbXVzdAotZXh0ZW5kIGphdmEuaW8uRmlsdGVyUmVhZGVyLiAgSWYgdGhlIGN1c3RvbSBmaWx0ZXIgcmVhZGVyCi1uZWVkcyB0byBiZSBwYXJhbWV0ZXJpemVkLCBpdCBtdXN0IGltcGxlbWVudAotb3JnLmFwYWNoZS50b29scy50eXBlLlBhcmFtZXRlcml6YWJsZS4KKzxwPkEgRmlsdGVyUmVhZGVyIGVsZW1lbnQgbXVzdCBiZSBzdXBwbGllZCB3aXRoIGEgY2xhc3MgbmFtZSBhcyBhbiBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgY2xhc3MKK3Jlc29sdmVkIGJ5IHRoaXMgbmFtZSBtdXN0IGV4dGVuZCA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5pby5GaWx0ZXJSZWFkZXI8L2NvZGU+LiAgSWYgdGhlIGN1c3RvbQorZmlsdGVyIHJlYWRlciBuZWVkcyB0byBiZSBwYXJhbWV0ZXJpemVkLCBpdCBtdXN0CitpbXBsZW1lbnQgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMudHlwZS5QYXJhbWV0ZXJpemFibGU8L2NvZGU+LjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+Y2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5UaGUgY2xhc3MgbmFtZSBvZiB0aGUgZmlsdGVyIHJlYWRlci48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBmaWx0ZXIgcmVhZGVyLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD4KLTxoND5OZXN0ZWQgRWxlbWVudHM6PC9oND4KLTxjb2RlPiZsdDtmaWx0ZXJyZWFkZXImZ3Q7PC9jb2RlPiBzdXBwb3J0cyA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+Ci1hcyBuZXN0ZWQgZWxlbWVudHMuICBFYWNoIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IGVsZW1lbnQgbWF5IHRha2UgaW4gdGhlIGZvbGxvd2luZwotYXR0cmlidXRlcyAtIG5hbWUsIHR5cGUgYW5kIHZhbHVlLgotPHA+Ci1UaGUgZm9sbG93aW5nIEZpbHRlclJlYWRlcnMgYXJlIHN1cHBsaWVkIHdpdGggdGhlIGRlZmF1bHQKLWRpc3RyaWJ1dGlvbi4KKzxoND5OZXN0ZWQgZWxlbWVudHM8L2g0PgorPHA+PGNvZGU+Jmx0O2ZpbHRlcnJlYWRlciZndDs8L2NvZGU+IHN1cHBvcnRzIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IGFzIG5lc3RlZCBlbGVtZW50cy4gIEVhY2ggPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gZWxlbWVudCBtYXkgdGFrZQoraW4gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzJm1kYXNoOzx2YXI+bmFtZTwvdmFyPiwgPHZhcj50eXBlPC92YXI+IGFuZCA8dmFyPnZhbHVlPC92YXI+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgRmlsdGVyUmVhZGVycyBhcmUgc3VwcGxpZWQgd2l0aCB0aGUgZGVmYXVsdCBkaXN0cmlidXRpb24uPC9wPgogCi08aDM+PGEgbmFtZT0iY2xhc3Njb25zdGFudHMiPkNsYXNzQ29uc3RhbnRzPC9hPjwvaDM+Ci08cD4KLSAgVGhpcyBmaWx0ZXJzIGJhc2ljIGNvbnN0YW50cyBkZWZpbmVkIGluIGEgSmF2YSBDbGFzcywKLSAgYW5kIG91dHB1dHMgdGhlbSBpbiBsaW5lcyBjb21wb3NlZCBvZiB0aGUgZm9ybWF0IDxpPm5hbWU8L2k+PTxpPnZhbHVlPC9pPi4KLSAgVGhpcyBmaWx0ZXIgdXNlcyB0aGUgPGVtPmJjZWw8L2VtPiBsaWJyYXJ5IHRvIHVuZGVyc3RhbmQgdGhlIEphdmEgQ2xhc3MgZmlsZS4KLSAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4uCi08cD4KLSAgPHA+Ci0gICAgPGVtPjxiPkltcG9ydGFudDo8L2I+PC9lbT4KLSAgICBUaGlzIGZpbHRlciBpcyBkaWZmZXJlbnQgZnJvbSBtb3N0IG9mIHRoZSBvdGhlciBmaWx0ZXJzLgotICAgIE1vc3Qgb2YgdGhlIGZpbHRlcnMgb3BlcmF0ZSBvbiBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuCi0gICAgVGhpcyBmaWx0ZXIgb3BlcmF0ZXMgb24gdGhlIHNlcXVlbmNlIG9mIGJ5dGVzIHRoYXQgbWFrZXMgdXAKLSAgICBhIGNsYXNzLiBIb3dldmVyIHRoZSBieXRlcyBhcnJpdmUgdG8gdGhlIGZpbHRlciBhcyBhIHNlcXVlbmNlCi0gICAgb2YgY2hhcmFjdGVycy4gVGhpcyBtZWFucyB0aGF0IG9uZSBtdXN0IGJlIGNhcmVmdWwgb24gdGhlCi0gICAgY2hvaWNlIG9mIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UuIE1vc3QgZW5jb2RpbmcgbG9zZSBpbmZvcm1hdGlvbgotICAgIG9uIGNvbnZlcnNpb24gZnJvbSBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gY2hhcmFjdGVycwotICAgIGFuZCBiYWNrIGFnYWluIHRvIGJ5dGVzLiBJbiBwYXJ0aWN1bGFyIHRoZSB1c3VhbCBkZWZhdWx0Ci0gICAgY2hhcmFjdGVyIGVuY29kaW5ncyAoQ1AxNTIgYW5kIFVURi04KSBkby4KLSAgICBGb3IgdGhpcyByZWFzb24sIDxlbT5zaW5jZSBBbnQgMS43PC9lbT4sIHRoZSBjaGFyYWN0ZXIKLSAgICBlbmNvZGluZyA8Yj5JU08tODg1OS0xPC9iPiBpcyB1c2VkIHRvIGNvbnZlcnQgZnJvbSBjaGFyYWN0ZXJzIGJhY2sgdG8KLSAgICBieXRlcywgc28gb25lIDxiPmhhczwvYj4gdG8gdXNlIHRoaXMgZW5jb2RpbmcgZm9yIHJlYWRpbmcgdGhlIGphdmEKLSAgICBjbGFzcyBmaWxlLgotPGg0PkV4YW1wbGU6PC9oND4KKzxoMyBpZD0iY2xhc3Njb25zdGFudHMiPkNsYXNzQ29uc3RhbnRzPC9oMz4KKzxwPlRoaXMgZmlsdGVycyBiYXNpYyBjb25zdGFudHMgZGVmaW5lZCBpbiBhIEphdmEgQ2xhc3MsIGFuZCBvdXRwdXRzIHRoZW0gaW4gbGluZXMgY29tcG9zZWQgb2YgdGhlCitmb3JtYXQgPGVtPm5hbWU8L2VtPj08ZW0+dmFsdWU8L2VtPi4gIFRoaXMgZmlsdGVyIHVzZXMgdGhlIEJDRUwgbGlicmFyeSB0byB1bmRlcnN0YW5kIHRoZSBKYXZhIENsYXNzCitmaWxlLiAgU2VlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4uPC9wPgorPHA+PHN0cm9uZz5JbXBvcnRhbnQ8L3N0cm9uZz46IFRoaXMgZmlsdGVyIGlzIGRpZmZlcmVudCBmcm9tIG1vc3Qgb2YgdGhlIG90aGVyIGZpbHRlcnMuICBNb3N0IG9mIHRoZQorZmlsdGVycyBvcGVyYXRlIG9uIGEgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4gIFRoaXMgZmlsdGVyIG9wZXJhdGVzIG9uIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0CittYWtlcyB1cCBhIGNsYXNzLiBIb3dldmVyIHRoZSBieXRlcyBhcnJpdmUgdG8gdGhlIGZpbHRlciBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMuIFRoaXMgbWVhbnMKK3RoYXQgb25lIG11c3QgYmUgY2FyZWZ1bCBvbiB0aGUgY2hvaWNlIG9mIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UuIE1vc3QgZW5jb2RpbmdzIGxvc2UgaW5mb3JtYXRpb24KK29uIGNvbnZlcnNpb24gZnJvbSBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gY2hhcmFjdGVycyBhbmQgYmFjayBhZ2FpbiB0byBieXRlcy4gSW4KK3BhcnRpY3VsYXIsIHRoZSB1c3VhbCBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZ3MgKENQMTI1MiBhbmQgVVRGLTgpIGRvLiAgRm9yIHRoaXMgcmVhc29uLCA8ZW0+c2luY2UKK0FudCAxLjc8L2VtPiwgdGhlIGNoYXJhY3RlciBlbmNvZGluZyA8c3Ryb25nPklTTy04ODU5LTE8L3N0cm9uZz4gaXMgdXNlZCB0byBjb252ZXJ0IGZyb20gY2hhcmFjdGVycworYmFjayB0byBieXRlcywgc28gb25lIDxzdHJvbmc+aGFzPC9zdHJvbmc+IHRvIHVzZSB0aGlzIGVuY29kaW5nIGZvciByZWFkaW5nIHRoZSBKYXZhIGNsYXNzIGZpbGUuPC9wPgorPGg0PkV4YW1wbGU8L2g0PgogCi1UaGlzIGxvYWRzIHRoZSBiYXNpYyBjb25zdGFudHMgZGVmaW5lZCBpbiBhIEphdmEgY2xhc3MgYXMgQW50IHByb3BlcnRpZXMuCis8cD5UaGlzIGxvYWRzIHRoZSBiYXNpYyBjb25zdGFudHMgZGVmaW5lZCBpbiBhIEphdmEgY2xhc3MgYXMgQW50IHByb3BlcnRpZXMuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtsb2FkcHJvcGVydGllcyBzcmNmaWxlPSJmb28uY2xhc3MiIGVuY29kaW5nPSJJU08tODg1OS0xIiZndDsKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtjbGFzc2NvbnN0YW50cy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KIAotVGhpcyBsb2FkcyB0aGUgY29uc3RhbnRzIGZyb20gYSBKYXZhIGNsYXNzIGZpbGUgYXMgQW50IHByb3BlcnRpZXMsCi1wcmVwZW5kaW5nIHRoZSBuYW1lcyB3aXRoIGEgcHJlZml4LgorPHA+VGhpcyBsb2FkcyB0aGUgY29uc3RhbnRzIGZyb20gYSBKYXZhIGNsYXNzIGZpbGUgYXMgQW50IHByb3BlcnRpZXMsIHByZXBlbmRpbmcgdGhlIG5hbWVzIHdpdGgKK2EgcHJlZml4LjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2xvYWRwcm9wZXJ0aWVzIHNyY2ZpbGU9ImJ1aWxkL2NsYXNzZXMvb3JnL2FjbWUvYmFyLmNsYXNzIgogICAgICAgICAgICAgICAgIGVuY29kaW5nPSJJU08tODg1OS0xIiZndDsKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtjbGFzc2NvbnN0YW50cy8mZ3Q7CiAgICAgJmx0O3ByZWZpeGxpbmVzIHByZWZpeD0iaW5pLiIvJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkcHJvcGVydGllcyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxoMz48YSBuYW1lPSJlc2NhcGV1bmljb2RlIj5Fc2NhcGVVbmljb2RlPC9hPjwvaDM+Ci08cD4KLVRoaXMgZmlsdGVyIGNvbnZlcnRzIGl0cyBpbnB1dCBieSBjaGFuZ2luZyBhbGwgbm9uIFVTLUFTQ0lJIGNoYXJhY3RlcnMKLWludG8gdGhlaXIgZXF1aXZhbGVudCB1bmljb2RlIGVzY2FwZSBiYWNrc2xhc2ggdSBwbHVzIDQgZGlnaXRzLjwvcD4KKyZsdDsvbG9hZHByb3BlcnRpZXMmZ3Q7PC9wcmU+Cis8aDMgaWQ9ImVzY2FwZXVuaWNvZGUiPkVzY2FwZVVuaWNvZGU8L2gzPgogCi08cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+PC9wPgorPHA+VGhpcyBmaWx0ZXIgY29udmVydHMgaXRzIGlucHV0IGJ5IGNoYW5naW5nIGFsbCBub24gVVMtQVNDSUkgY2hhcmFjdGVycyBpbnRvIHRoZWlyIGVxdWl2YWxlbnQKK1VuaWNvZGUgZXNjYXBlIGJhY2tzbGFzaCB1IHBsdXMgNCBkaWdpdHMuPC9wPgogCi08aDQ+RXhhbXBsZTo8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KIAotVGhpcyBsb2FkcyB0aGUgYmFzaWMgY29uc3RhbnRzIGRlZmluZWQgaW4gYSBKYXZhIGNsYXNzIGFzIEFudCBwcm9wZXJ0aWVzLgotPGJsb2NrcXVvdGU+PHByZT4KKzxoND5FeGFtcGxlPC9oND4KKworPHA+VGhpcyBsb2FkcyB0aGUgYmFzaWMgY29uc3RhbnRzIGRlZmluZWQgaW4gYSBKYXZhIGNsYXNzIGFzIEFudCBwcm9wZXJ0aWVzLjwvcD4KKzxwcmU+CiAmbHQ7bG9hZHByb3BlcnRpZXMgc3JjZmlsZT0mcXVvdDtub25fYXNjaWlfcHJvcGVydHkucHJvcGVydGllcyZxdW90OyZndDsKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuRXNjYXBlVW5pY29kZSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KIAotQ29udmVuaWVuY2UgbWV0aG9kOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPgogJmx0O2xvYWRwcm9wZXJ0aWVzIHNyY2ZpbGU9JnF1b3Q7bm9uX2FzY2lpX3Byb3BlcnR5LnByb3BlcnRpZXMmcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZXNjYXBldW5pY29kZS8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRwcm9wZXJ0aWVzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkcHJvcGVydGllcyZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9ImV4cGFuZHByb3BlcnRpZXMiPkV4cGFuZFByb3BlcnRpZXM8L2E+PC9oMz4KLTxwPgotSWYgdGhlIGRhdGEgY29udGFpbnMgZGF0YSB0aGF0IHJlcHJlc2VudHMgQW50Ci1wcm9wZXJ0aWVzIChvZiB0aGUgZm9ybSAkey4uLn0pLCB0aGF0IGlzIHN1YnN0aXR1dGVkCi13aXRoIHRoZSBwcm9wZXJ0eSdzIGFjdHVhbCB2YWx1ZS4KLTxwPgotPGg0PkV4YW1wbGU6PC9oND4KKzxoMyBpZD0iZXhwYW5kcHJvcGVydGllcyI+RXhwYW5kUHJvcGVydGllczwvaDM+Cis8cD5JZiB0aGUgZGF0YSBjb250YWlucyBkYXRhIHRoYXQgcmVwcmVzZW50cyBBbnQgcHJvcGVydGllcyAob2YgdGhlIGZvcm0gPGNvZGU+JHsuLi59PC9jb2RlPiksIHRoYXQKK2lzIHN1YnN0aXR1dGVkIHdpdGggdGhlIHByb3BlcnR5J3MgYWN0dWFsIHZhbHVlLjwvcD4KIAotVGhpcyByZXN1bHRzIGluIHRoZSBwcm9wZXJ0eSBtb2RpZmllZG1lc3NhZ2UgaG9sZGluZyB0aGUgdmFsdWUKLSZxdW90O0FsbCB0aGVzZSBtb21lbnRzIHdpbGwgYmUgbG9zdCBpbiB0aW1lLCBsaWtlIHRlYXJkcm9wcyBpbiB0aGUgcmFpbiZxdW90OwotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtlY2hvCi0gIG1lc3NhZ2U9JnF1b3Q7QWxsIHRoZXNlIG1vbWVudHMgd2lsbCBiZSBsb3N0IGluIHRpbWUsIGxpa2UgdGVhcmRyb3BzIGluIHRoZSAke3dlYXRoZXJ9JnF1b3Q7Ci0gIGZpbGU9JnF1b3Q7bG9hZGZpbGUxLnRtcCZxdW90OwotICAvJmd0OworPGg0PkV4YW1wbGU8L2g0PgorCis8cD5UaGlzIHJlc3VsdHMgaW4gdGhlIHByb3BlcnR5IDxjb2RlPm1vZGlmaWVkbWVzc2FnZTwvY29kZT4gaG9sZGluZyB0aGUgdmFsdWUgPHE+QWxsIHRoZXNlIG1vbWVudHMKK3dpbGwgYmUgbG9zdCBpbiB0aW1lLCBsaWtlIHRlYXJkcm9wcyBpbiB0aGUgcmFpbjwvcT48L3A+Cis8cHJlPgorJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtBbGwgdGhlc2UgbW9tZW50cyB3aWxsIGJlIGxvc3QgaW4gdGltZSwgbGlrZSB0ZWFyZHJvcHMgaW4gdGhlICR7d2VhdGhlcn0mcXVvdDsKKyAgICAgIGZpbGU9JnF1b3Q7bG9hZGZpbGUxLnRtcCZxdW90Oy8mZ3Q7CiAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt3ZWF0aGVyJnF1b3Q7IHZhbHVlPSZxdW90O3JhaW4mcXVvdDsvJmd0OwogJmx0O2xvYWRmaWxlIHByb3BlcnR5PSZxdW90O21vZGlmaWVkbWVzc2FnZSZxdW90OyBzcmNGaWxlPSZxdW90O2xvYWRmaWxlMS50bXAmcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkV4cGFuZFByb3BlcnRpZXMmcXVvdDsvJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7ZWNobwotICBtZXNzYWdlPSZxdW90O0FsbCB0aGVzZSBtb21lbnRzIHdpbGwgYmUgbG9zdCBpbiB0aW1lLCBsaWtlIHRlYXJkcm9wcyBpbiB0aGUgJHt3ZWF0aGVyfSZxdW90OwotICBmaWxlPSZxdW90O2xvYWRmaWxlMS50bXAmcXVvdDsKLSAgLyZndDsKKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPgorJmx0O2VjaG8gbWVzc2FnZT0mcXVvdDtBbGwgdGhlc2UgbW9tZW50cyB3aWxsIGJlIGxvc3QgaW4gdGltZSwgbGlrZSB0ZWFyZHJvcHMgaW4gdGhlICR7d2VhdGhlcn0mcXVvdDsKKyAgICAgIGZpbGU9JnF1b3Q7bG9hZGZpbGUxLnRtcCZxdW90Oy8mZ3Q7CiAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt3ZWF0aGVyJnF1b3Q7IHZhbHVlPSZxdW90O3JhaW4mcXVvdDsvJmd0OwogJmx0O2xvYWRmaWxlIHByb3BlcnR5PSZxdW90O21vZGlmaWVkbWVzc2FnZSZxdW90OyBzcmNGaWxlPSZxdW90O2xvYWRmaWxlMS50bXAmcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZXhwYW5kcHJvcGVydGllcy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotPHA+QXMgb2YgQW50IDxzdHJvbmc+MS44LjM8L3N0cm9uZz4sIGEgbmVzdGVkCi0gPGEgaHJlZj0icHJvcGVydHlzZXQuaHRtbCI+UHJvcGVydHlTZXQ8L2E+IGNhbiBiZSBzcGVjaWZpZWQ6Cis8cD48ZW0+U2luY2UgQW50IDEuOC4zPC9lbT4sIGEgbmVzdGVkIDxhIGhyZWY9InByb3BlcnR5c2V0Lmh0bWwiPlByb3BlcnR5U2V0PC9hPiBjYW4gYmUgc3BlY2lmaWVkOjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7cHJvcGVydHkgbmFtZT0mcXVvdDt3ZWF0aGVyJnF1b3Q7IHZhbHVlPSZxdW90O3JhaW4mcXVvdDsvJmd0OwogJmx0O2xvYWRmaWxlIHByb3BlcnR5PSZxdW90O21vZGlmaWVkbWVzc2FnZSZxdW90OyBzcmNGaWxlPSZxdW90O2xvYWRmaWxlMS50bXAmcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZXhwYW5kcHJvcGVydGllcyZndDsKICAgICAgICZsdDtwcm9wZXJ0eXNldCZndDsKLSAgICAgICAgJmx0O3Byb3BlcnR5cmVmIG5hbWU9IndlYXRoZXIiIC8mZ3Q7CisgICAgICAgICZsdDtwcm9wZXJ0eXJlZiBuYW1lPSJ3ZWF0aGVyIi8mZ3Q7CiAgICAgICAmbHQ7L3Byb3BlcnR5c2V0Jmd0OwogICAgICZsdDsvZXhwYW5kcHJvcGVydGllcyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi08aDM+PGEgbmFtZT0iaGVhZGZpbHRlciI+SGVhZEZpbHRlcjwvYT48L2gzPgorPGgzIGlkPSJoZWFkZmlsdGVyIj5IZWFkRmlsdGVyPC9oMz4KIAotVGhpcyBmaWx0ZXIgcmVhZHMgdGhlIGZpcnN0IGZldyBsaW5lcyBmcm9tIHRoZSBkYXRhIHN1cHBsaWVkIHRvIGl0LgorPHA+VGhpcyBmaWx0ZXIgcmVhZHMgdGhlIGZpcnN0IGZldyBsaW5lcyBmcm9tIHRoZSBkYXRhIHN1cHBsaWVkIHRvIGl0LjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+bGluZXM8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk51bWJlciBvZiBsaW5lcyB0byBiZSByZWFkLgotICAgIERlZmF1bHRzIHRvICZxdW90OzEwJnF1b3Q7IDxicj4gQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyB0aGF0IGFsbCBsaW5lcyBhcmUKLSAgICBwYXNzZWQgKHVzZWZ1bCB3aXRoIDxpPnNraXA8L2k+KTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5saW5lczwvdGQ+CisgICAgPHRkPk51bWJlciBvZiBsaW5lcyB0byBiZSByZWFkLjxici8+CisgICAgICBBIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIHRoYXQgYWxsIGxpbmVzIGFyZSBwYXNzZWQgKHVzZWZ1bCB3aXRoIDx2YXI+c2tpcDwvdmFyPikuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjEwPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5za2lwPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5OdW1iZXIgb2YgbGluZXMgdG8gYmUgc2tpcHBlZCAoZnJvbSB0aGUgYmVnaW5uaW5nKS4KLSAgICBEZWZhdWx0cyB0byAmcXVvdDswJnF1b3Q7PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnNraXA8L3RkPgorICAgIDx0ZD5OdW1iZXIgb2YgbGluZXMgdG8gYmUgc2tpcHBlZCAoZnJvbSB0aGUgYmVnaW5uaW5nKS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+MDwvcT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxwPgotPGg0PkV4YW1wbGU6PC9oND4KIAotVGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZCBkYXRhIGluIHRoZSBwcm9wZXJ0eSBzcmMuZmlsZS5oZWFkCi08YmxvY2txdW90ZT48cHJlPgorPGg0PkV4YW1wbGU8L2g0PgorPHA+VGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZCBkYXRhIGluIHRoZSBwcm9wZXJ0eSA8Y29kZT5zcmMuZmlsZS5oZWFkPC9jb2RlPjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5IZWFkRmlsdGVyJnF1b3Q7Jmd0OwogICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bGluZXMmcXVvdDsgdmFsdWU9JnF1b3Q7MTUmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90O3NyYy5maWxlLmhlYWQmcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7aGVhZGZpbHRlciBsaW5lcz0mcXVvdDsxNSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotVGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzLCBza2lwcGluZyB0aGUgZmlyc3QgMiBsaW5lcywgb2YgdGhlIHN1cHBsaWVkIGRhdGEKLWluIHRoZSBwcm9wZXJ0eSBzcmMuZmlsZS5oZWFkLiAoTWVhbnM6IGxpbmVzIDMtMTcpCi08YmxvY2txdW90ZT48cHJlPgorPHA+VGhpcyBzdG9yZXMgdGhlIGZpcnN0IDE1IGxpbmVzLCBza2lwcGluZyB0aGUgZmlyc3QgMiBsaW5lcywgb2YgdGhlIHN1cHBsaWVkIGRhdGEgaW4gdGhlCitwcm9wZXJ0eSA8Y29kZT5zcmMuZmlsZS5oZWFkPC9jb2RlPiAobWVhbnM6IGxpbmVzIDMtMTcpLjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2hlYWRmaWx0ZXIgbGluZXM9JnF1b3Q7MTUmcXVvdDsgc2tpcD0mcXVvdDsyJnF1b3Q7LyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1TZWUgdGhlIHRlc3RjYXNlcyBmb3IgbW9yZSBleGFtcGxlcyAoPGk+c3JjXGV0Y1x0ZXN0Y2FzZXNcZmlsdGVyc1xoZWFkLXRhaWwueG1sPC9pPiBpbiB0aGUKLXNvdXJjZSBkaXN0cmlidXRpb24pLgorPHA+U2VlIHRoZSB0ZXN0Y2FzZXMgZm9yIG1vcmUgZXhhbXBsZXMgKDxzYW1wPnNyY1xldGNcdGVzdGNhc2VzXGZpbHRlcnNcaGVhZC10YWlsLnhtbDwvc2FtcD4gaW4KK3RoZSBzb3VyY2UgZGlzdHJpYnV0aW9uKS48L3A+CiAKLTxoMz48YSBuYW1lPSJsaW5lY29udGFpbnMiPkxpbmVDb250YWluczwvYT48L2gzPgorPGgzIGlkPSJsaW5lY29udGFpbnMiPkxpbmVDb250YWluczwvaDM+CiAKLVRoaXMgZmlsdGVyIGluY2x1ZGVzIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIGFsbCB0aGUgdXNlci1zcGVjaWZpZWQKLXN0cmluZ3MuCis8cD5UaGlzIGZpbHRlciBpbmNsdWRlcyBvbmx5IHRob3NlIGxpbmVzIHRoYXQgY29udGFpbiBhbGwgdGhlIHVzZXItc3BlY2lmaWVkIHN0cmluZ3MuPC9wPgogCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBUeXBlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFR5cGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgVmFsdWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5jb250YWluczwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+U3Vic3RyaW5nIHRvIGJlIHNlYXJjaGVkIGZvci48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmNvbnRhaW5zPC90ZD4KKyAgICA8dGQ+U3Vic3RyaW5nIHRvIGJlIHNlYXJjaGVkIGZvci48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+bmVnYXRlPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5XaGV0aGVyIHRvIHNlbGVjdAotICAgICAgPGk+bm9uLTwvaT5tYXRjaGluZyBsaW5lcyBvbmx5LiA8Yj5TaW5jZSBBbnQgMS43PC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5uZWdhdGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHNlbGVjdCA8ZW0+bm9uLTwvZW0+bWF0Y2hpbmcgbGluZXMgb25seS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5tYXRjaEFueTwvdGQ+CisgICAgPHRkPklmIDxxPmZhbHNlPC9xPiwgdGhlbiBhbGwgdGhlIHN0cmluZ3MgYXJlIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gdGhlIGxpbmUuIElmCisgICAgICA8cT50cnVlPC9xPiwgdGhlbiB0aGUgcHJlc2VuY2Ugb2YgYW55IG9mIHRoZSBzdHJpbmdzIGluIHRoZSBsaW5lIGlzIGNvbnNpZGVyZWQKKyAgICAgIGEgc3VjY2Vzc2Z1bCBtYXRjaC48YnIvPjxlbT5TaW5jZSBBbnQgMS4xMC40PC9lbT4KKyAgICA8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8cD4KLTxoND5FeGFtcGxlOjwvaDQ+Cis8aDQ+RXhhbXBsZTwvaDQ+CiAKLVRoaXMgd2lsbCBpbmNsdWRlIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIDxjb2RlPmZvbzwvY29kZT4gYW5kCi08Y29kZT5iYXI8L2NvZGU+LgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoaXMgd2lsbCBpbmNsdWRlIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIDxxPmZvbzwvcT4gYW5kIDxxPmJhcjwvcT4uPC9wPgorPHByZT4KICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zJnF1b3Q7Jmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb250YWlucyZxdW90OyB2YWx1ZT0mcXVvdDtmb28mcXVvdDsvJmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb250YWlucyZxdW90OyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsvJmd0OwotJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2ZpbHRlcnJlYWRlciZndDs8L3ByZT4KIAotQ29udmVuaWVuY2UgbWV0aG9kOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPgogJmx0O2xpbmVjb250YWlucyZndDsKICAgJmx0O2NvbnRhaW5zIHZhbHVlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiAgICZsdDtjb250YWlucyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsvJmd0OwotJmx0Oy9saW5lY29udGFpbnMmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xpbmVjb250YWlucyZndDs8L3ByZT4KIAotTmVnYXRpb246Ci08YmxvY2txdW90ZT48cHJlPgorPHA+TmVnYXRpb246PC9wPgorPHByZT4KICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuTGluZUNvbnRhaW5zJnF1b3Q7Jmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtuZWdhdGUmcXVvdDsgdmFsdWU9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7CiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbnRhaW5zJnF1b3Q7IHZhbHVlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbnRhaW5zJnF1b3Q7IHZhbHVlPSZxdW90O2JhciZxdW90Oy8mZ3Q7Ci0mbHQ7L2ZpbHRlcnJlYWRlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxpPm9yPC9pPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgorPHA+PGVtPm9yPC9lbT48L3A+Cis8cHJlPgogJmx0O2xpbmVjb250YWlucyBuZWdhdGU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKICAgJmx0O2NvbnRhaW5zIHZhbHVlPSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiAgICZsdDtjb250YWlucyB2YWx1ZT0mcXVvdDtiYXImcXVvdDsvJmd0OwotJmx0Oy9saW5lY29udGFpbnMmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xpbmVjb250YWlucyZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9ImxpbmVjb250YWluc3JlZ2V4cCI+TGluZUNvbnRhaW5zUmVnRXhwPC9hPjwvaDM+Cis8aDMgaWQ9ImxpbmVjb250YWluc3JlZ2V4cCI+TGluZUNvbnRhaW5zUmVnRXhwPC9oMz4KIAotRmlsdGVyIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSB1c2VyLXNwZWNpZmllZAotcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIHN0cmluZ3MuCis8cD5GaWx0ZXIgd2hpY2ggaW5jbHVkZXMgb25seSB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gdGhlIHVzZXItc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbgorbWF0Y2hpbmcgc3RyaW5ncy48L3A+CiAKLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFR5cGU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgVHlwZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBWYWx1ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnJlZ2V4cDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+UmVndWxhciBleHByZXNzaW9uIHRvIGJlIHNlYXJjaGVkIGZvci48YnI+Ci0gICAgICA8ZW0+U3RhcnRpbmcgd2l0aCAxLjkuMTAgdGhpcyBhbHNvIHdvcmtzIGFzIGFuIGF0dHJpYnV0ZQotICAgICAgICBvbiA8Y29kZT5saW5lY29udGFpbnNyZWdleHA8L2NvZGU+LCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIEFudAotICAgICAgICB5b3UgbXVzdCB1c2UgYSBuZXN0ZWQgZWxlbWVudCB3aGVuIHVzaW5nIHRoZSBjb252ZW5pZW5jZQotICAgICAgICBtZXRob2QuPC9lbT4KKyAgICA8dGQ+cmVnZXhwPC90ZD4KKyAgICA8dGQ+UmVndWxhciBleHByZXNzaW9uIHRvIGJlIHNlYXJjaGVkIGZvci48YnIvPjxlbT5TaW5jZSBBbnQgMS4xMC4yPC9lbT4sIHRoaXMgYWxzbyB3b3JrcyBhcyBhbgorICAgICAgYXR0cmlidXRlIG9uIDxjb2RlPmxpbmVjb250YWluc3JlZ2V4cDwvY29kZT4uIEluIGVhcmxpZXIgdmVyc2lvbnMgb2YgQW50IHlvdSBtdXN0IHVzZSBhIG5lc3RlZAorICAgICAgZWxlbWVudCB3aGVuIHVzaW5nIHRoZSBjb252ZW5pZW5jZSBtZXRob2QuCiAgICAgPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+bmVnYXRlPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5XaGV0aGVyIHRvIHNlbGVjdAotICAgICAgPGk+bm9uLTwvaT5tYXRjaGluZyBsaW5lcyBvbmx5LiA8Yj5TaW5jZSBBbnQgMS43PC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5uZWdhdGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHNlbGVjdCA8ZW0+bm9uLTwvZW0+bWF0Y2hpbmcgbGluZXMgb25seS4gPGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlBlcmZvcm0gYSBjYXNlIHNlbnNpdGl2ZQotICAgICAgbWF0Y2guIERlZmF1bHQgaXMgdHJ1ZS4gPGI+U2luY2UgQW50IDEuOC4yPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoLiA8ZW0+U2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi1TZWUgPGEgaHJlZj0icmVnZXhwLmh0bWwiPlJlZ2V4cCBUeXBlPC9hPiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCByZWdleHAgYW5kIG9mCi10aGUgY2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4KLTxoND5FeGFtcGxlOjwvaDQ+Cis8cD5TZWUgPGEgaHJlZj0icmVnZXhwLmh0bWwiPlJlZ2V4cCBUeXBlPC9hPiBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXN0ZWQgZWxlbWVudCByZWdleHAKK2FuZCBvZiB0aGUgY2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi48L3A+CiAKLVRoaXMgd2lsbCBmZXRjaCBhbGwgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSBwYXR0ZXJuIDxjb2RlPmZvbzwvY29kZT4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQ+RXhhbXBsZTwvaDQ+CisKKzxwPlRoaXMgd2lsbCBmZXRjaCBhbGwgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSBwYXR0ZXJuIDxjb2RlPmZvbzwvY29kZT48L3A+Cis8cHJlPgogJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5MaW5lQ29udGFpbnNSZWdFeHAmcXVvdDsmZ3Q7CiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O3JlZ2V4cCZxdW90OyB2YWx1ZT0mcXVvdDtmb28qJnF1b3Q7LyZndDsKLSZsdDsvZmlsdGVycmVhZGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDtsaW5lY29udGFpbnNyZWdleHAmZ3Q7CiAgICZsdDtyZWdleHAgcGF0dGVybj0mcXVvdDtmb28qJnF1b3Q7LyZndDsKLSZsdDsvbGluZWNvbnRhaW5zcmVnZXhwJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9saW5lY29udGFpbnNyZWdleHAmZ3Q7PC9wcmU+CiAKLU5lZ2F0aW9uOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPk5lZ2F0aW9uOjwvcD4KKzxwcmU+CiAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkxpbmVDb250YWluc1JlZ0V4cCZxdW90OyZndDsKICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7bmVnYXRlJnF1b3Q7IHZhbHVlPSZxdW90O3RydWUmcXVvdDsvJmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtyZWdleHAmcXVvdDsgdmFsdWU9JnF1b3Q7Zm9vKiZxdW90Oy8mZ3Q7Ci0mbHQ7L2ZpbHRlcnJlYWRlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxpPm9yPC9pPgotPGJsb2NrcXVvdGU+PHByZT4KKyZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgorPHA+PGVtPm9yPC9lbT48L3A+Cis8cHJlPgogJmx0O2xpbmVjb250YWluc3JlZ2V4cCBuZWdhdGU9JnF1b3Q7dHJ1ZSZxdW90OyZndDsKICAgJmx0O3JlZ2V4cCBwYXR0ZXJuPSZxdW90O2ZvbyomcXVvdDsvJmd0OwotJmx0Oy9saW5lY29udGFpbnNyZWdleHAmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xpbmVjb250YWluc3JlZ2V4cCZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9InByZWZpeGxpbmVzIj5QcmVmaXhMaW5lczwvYT48L2gzPgorPGgzIGlkPSJwcmVmaXhsaW5lcyI+UHJlZml4TGluZXM8L2gzPgogCi1BdHRhY2hlcyBhIHByZWZpeCB0byBldmVyeSBsaW5lLgorPHA+QXR0YWNoZXMgYSBwcmVmaXggdG8gZXZlcnkgbGluZS48L3A+CiAKLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBWYWx1ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnByZWZpeDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+UHJlZml4IHRvIGJlIGF0dGFjaGVkIHRvIGxpbmVzLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cHJlZml4PC90ZD4KKyAgICA8dGQ+UHJlZml4IHRvIGJlIGF0dGFjaGVkIHRvIGxpbmVzLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+Ci08aDQ+RXhhbXBsZTo8L2g0PgogCi1UaGlzIHdpbGwgYXR0YWNoIHRoZSBwcmVmaXggPGNvZGU+Rm9vPC9jb2RlPiB0byBhbGwgbGluZXMuCi08YmxvY2txdW90ZT48cHJlPgorPGg0PkV4YW1wbGU8L2g0PgorCis8cD5UaGlzIHdpbGwgYXR0YWNoIHRoZSBwcmVmaXggPGNvZGU+Rm9vPC9jb2RlPiB0byBhbGwgbGluZXMuPC9wPgorPHByZT4KICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuUHJlZml4TGluZXMmcXVvdDsmZ3Q7CiAgICZsdDtwYXJhbSBuYW1lPSZxdW90O3ByZWZpeCZxdW90OyB2YWx1ZT0mcXVvdDtGb28mcXVvdDsvJmd0OwotJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2ZpbHRlcnJlYWRlciZndDs8L3ByZT4KIAotQ29udmVuaWVuY2UgbWV0aG9kOgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtwcmVmaXhsaW5lcyBwcmVmaXg9JnF1b3Q7Rm9vJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPiZsdDtwcmVmaXhsaW5lcyBwcmVmaXg9JnF1b3Q7Rm9vJnF1b3Q7LyZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9InN1ZmZpeGxpbmVzIj5TdWZmaXhMaW5lczwvYT48L2gzPgorPGgzIGlkPSJzdWZmaXhsaW5lcyI+U3VmZml4TGluZXM8L2gzPgogCi1BdHRhY2hlcyBhIHN1ZmZpeCB0byBldmVyeSBsaW5lLgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC9wPgogCi08cD48ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5BdHRhY2hlcyBhIHN1ZmZpeCB0byBldmVyeSBsaW5lLjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+c3VmZml4PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5TdWZmaXggdG8gYmUgYXR0YWNoZWQgdG8gbGluZXMuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5zdWZmaXg8L3RkPgorICAgIDx0ZD5TdWZmaXggdG8gYmUgYXR0YWNoZWQgdG8gbGluZXMuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4KLTxoND5FeGFtcGxlOjwvaDQ+CiAKLVRoaXMgd2lsbCBhdHRhY2ggdGhlIHN1ZmZpeCA8Y29kZT5Gb288L2NvZGU+IHRvIGFsbCBsaW5lcy4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQ+RXhhbXBsZTwvaDQ+CisKKzxwPlRoaXMgd2lsbCBhdHRhY2ggdGhlIHN1ZmZpeCA8Y29kZT5Gb288L2NvZGU+IHRvIGFsbCBsaW5lcy48L3A+Cis8cHJlPgogJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdWZmaXhMaW5lcyZxdW90OyZndDsKICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7c3VmZml4JnF1b3Q7IHZhbHVlPSZxdW90O0ZvbyZxdW90Oy8mZ3Q7Ci0mbHQ7L2ZpbHRlcnJlYWRlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsdGVycmVhZGVyJmd0OzwvcHJlPgogCi1Db252ZW5pZW5jZSBtZXRob2Q6Ci08YmxvY2txdW90ZT48cHJlPgotJmx0O3N1ZmZpeGxpbmVzIHN1ZmZpeD0mcXVvdDtGb28mcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+Q29udmVuaWVuY2UgbWV0aG9kOjwvcD4KKzxwcmU+Jmx0O3N1ZmZpeGxpbmVzIHN1ZmZpeD0mcXVvdDtGb28mcXVvdDsvJmd0OzwvcHJlPgogCi08aDM+PGEgbmFtZT0icmVwbGFjZXRva2VucyI+UmVwbGFjZVRva2VuczwvYT48L2gzPgorPGgzIGlkPSJyZXBsYWNldG9rZW5zIj5SZXBsYWNlVG9rZW5zPC9oMz4KIAotVGhpcyBmaWx0ZXIgcmVhZGVyIHJlcGxhY2VzIGFsbCBzdHJpbmdzIHRoYXQgYXJlCi1zYW5kd2ljaGVkIGJldHdlZW4gYmVnaW50b2tlbiBhbmQgZW5kdG9rZW4gd2l0aAotdXNlciBkZWZpbmVkIHZhbHVlcy4KKzxwPlRoaXMgZmlsdGVyIHJlYWRlciByZXBsYWNlcyBhbGwgc3RyaW5ncyB0aGF0IGFyZSBzYW5kd2ljaGVkIGJldHdlZW4gPHZhcj5iZWdpbnRva2VuPC92YXI+CithbmQgPHZhcj5lbmR0b2tlbjwvdmFyPiB3aXRoIHVzZXIgZGVmaW5lZCB2YWx1ZXMuPC9wPgogCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBUeXBlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgVHlwZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+dG9rZW5jaGFyPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5iZWdpbnRva2VuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5TdHJpbmcgbWFya2luZyB0aGUKLSAgICBiZWdpbm5pbmcgb2YgYSB0b2tlbi4gIERlZmF1bHRzIHRvIEA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dG9rZW5jaGFyPC90ZD4KKyAgICA8dGQ+YmVnaW50b2tlbjwvdGQ+CisgICAgPHRkPlN0cmluZyBtYXJraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSB0b2tlbi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+QDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+dG9rZW5jaGFyPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5lbmR0b2tlbjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+U3RyaW5nIG1hcmtpbmcgdGhlCi0gICAgZW5kIG9mIGEgdG9rZW4uICBEZWZhdWx0cyB0byBAPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRva2VuY2hhcjwvdGQ+CisgICAgPHRkPmVuZHRva2VuPC90ZD4KKyAgICA8dGQ+U3RyaW5nIG1hcmtpbmcgdGhlIGVuZCBvZiBhIHRva2VuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5APC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5Vc2VyIGRlZmluZWQgU3RyaW5nLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+dG9rZW48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlVzZXIgZGVmaW5lZCBzZWFyY2ggU3RyaW5nLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dG9rZW48L3RkPgorICAgIDx0ZD5Vc2VyIGRlZmluZWQgdG9rZW4gc3RyaW5nPC90ZD4KKyAgICA8dGQ+UmVwbGFjZW1lbnQgdmFsdWUgZm9yIHRoZSB0b2tlbi48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+Tm90IGFwcGxpY2FibGUuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5wcm9wZXJ0aWVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+UHJvcGVydGllcyBmaWxlIHRvIHRha2UgdG9rZW5zIGZyb20uPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnByb3BlcnRpZXNmaWxlPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm90IGFwcGxpY2FibGU8L3RkPgorICAgIDx0ZD5Qcm9wZXJ0aWVzIGZpbGUgdG8gdGFrZSB0b2tlbnMgYW5kIHJlcGxhY2VtZW50IHZhbHVlcyBmcm9tLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPk5vdCBhcHBsaWNhYmxlLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+cHJvcGVydGllc1Jlc291cmNlPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5Qcm9wZXJ0aWVzIHJlc291cmNlIHRvIHRha2UgdG9rZW5zIGZyb20uCisgICAgPHRkPnByb3BlcnRpZXNSZXNvdXJjZTwvdGQ+CisgICAgPHRkPlByb3BlcnRpZXMgcmVzb3VyY2UgdG8gdGFrZSB0b2tlbnMgZnJvbS4KICAgICAgIE5vdGUgdGhpcyBvbmx5IHdvcmtzIGlzIHlvdSB1c2UgdGhlCiAgICAgICAiY29udmVuaWVuY2UiIDxjb2RlPiZsdDtyZXBsYWNldG9rZW5zJmd0OzwvY29kZT4gc3ludGF4LgogICAgICAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPlVzZXIgZGVmaW5lZCBTdHJpbmcuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+UmVwbGFjZS12YWx1ZSBmb3IgdGhlIHRva2VuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+PC90YWJsZT4KLTxwPgorPC90YWJsZT4KIAotPGg0PkV4YW1wbGU6PC9oND4KKzxoND5FeGFtcGxlPC9oND4KIAotVGhpcyByZXBsYWNlcyBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nICYjNjQ7REFURSYjNjQ7IGluIHRoZSBkYXRhCi13aXRoIHRvZGF5J3MgZGF0ZSBhbmQgc3RvcmVzIGl0IGluIHRoZSBwcm9wZXJ0eSAke3NyYy5maWxlLnJlcGxhY2VkfS4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5UaGlzIHJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgPGNvZGU+QERBVEVAPC9jb2RlPiBpbiB0aGUgZGF0YSB3aXRoIHRvZGF5J3MgZGF0ZSBhbmQKK3N0b3JlcyBpdCBpbiB0aGUgcHJvcGVydHkgPGNvZGU+JHtzcmMuZmlsZS5yZXBsYWNlZH08L2NvZGU+LjwvcD4KKzxwcmU+CiAmbHQ7dHN0YW1wLyZndDsKICZsdDshLS0ganVzdCBmb3IgZXhwbGFpbmluZyB0aGUgdXNlIG9mIHRoZSBwcm9wZXJ0aWVzIC0tJmd0OwogJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7c3JjLmZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7b3JkZXJzLmNzdiZxdW90Oy8mZ3Q7CkBAIC02MTYsMTEgKzU0MywxMCBAQAogJmx0Oy9sb2FkZmlsZSZndDsKIAogJmx0OyEtLSBqdXN0IGZvciBleHBsYWluaW5nIHRoZSB1c2Ugb2YgdGhlIHByb3BlcnRpZXMgLS0mZ3Q7Ci0mbHQ7ZWNobyBtZXNzYWdlPSZxdW90OyR7b3JkZXJzLnJlcGxhY2VkfSZxdW90Oy8+Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7ZWNobyBtZXNzYWdlPSZxdW90OyR7b3JkZXJzLnJlcGxhY2VkfSZxdW90Oy8mZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDt0c3RhbXAvJmd0OwogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5yZXBsYWNlZH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKQEAgLTYyOCwxMiArNTU0LDExIEBACiAgICAgICAmbHQ7dG9rZW4ga2V5PSZxdW90O0RBVEUmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUT0RBWX0mcXVvdDsvJmd0OwogICAgICZsdDsvcmVwbGFjZXRva2VucyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1UaGlzIHJlcGxhY2VzIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcge3tEQVRFfX0gaW4gdGhlIGRhdGEKLXdpdGggdG9kYXkncyBkYXRlIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHByb3BlcnR5ICR7c3JjLmZpbGUucmVwbGFjZWR9LgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoaXMgcmVwbGFjZXMgb2NjdXJyZW5jZXMgb2YgdGhlIHN0cmluZyA8cT57e0RBVEV9fTwvcT4gaW4gdGhlIGRhdGEgd2l0aCB0b2RheSdzIGRhdGUgYW5kCitzdG9yZXMgaXQgaW4gdGhlIHByb3BlcnR5IDxzYW1wPiR7c3JjLmZpbGUucmVwbGFjZWR9PC9zYW1wPi48L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5yZXBsYWNlZH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlJlcGxhY2VUb2tlbnMmcXVvdDsmZ3Q7CkBAIC02NDEsMTEgKzU2NiwxMCBAQAogICAgICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7dG9rZW5jaGFyJnF1b3Q7IG5hbWU9JnF1b3Q7ZW5kdG9rZW4mcXVvdDsgdmFsdWU9JnF1b3Q7fX0mcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDt0c3RhbXAvJmd0OwogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5yZXBsYWNlZH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKQEAgLTY1MywyMiArNTc3LDIwIEBACiAgICAgICAmbHQ7dG9rZW4ga2V5PSZxdW90O0RBVEUmcXVvdDsgdmFsdWU9JnF1b3Q7JHtUT0RBWX0mcXVvdDsvJmd0OwogICAgICZsdDsvcmVwbGFjZXRva2VucyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1UaGlzIHdpbGwgdHJlYXQgZWFjaCBwcm9wZXJ0aWVzIGZpbGUgZW50cnkgaW4gc2FtcGxlLnByb3BlcnRpZXMgYXMgYSB0b2tlbi9rZXkgcGFpciA6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+VGhpcyB3aWxsIHRyZWF0IGVhY2ggcHJvcGVydGllcyBmaWxlIGVudHJ5IGluIHNhbXBsZS5wcm9wZXJ0aWVzIGFzIGEgdG9rZW4va2V5IHBhaXI6PC9wPgorPHByZT4KICZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUucmVwbGFjZWR9JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5SZXBsYWNlVG9rZW5zJnF1b3Q7Jmd0OwogICAgICAgJmx0O3BhcmFtIHR5cGU9JnF1b3Q7cHJvcGVydGllc2ZpbGUmcXVvdDsgdmFsdWU9JnF1b3Q7c2FtcGxlLnByb3BlcnRpZXMmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLVRoaXMgcmVhZHMgdGhlIHByb3BlcnRpZXMgZnJvbSBhbiBBbnQgcmVzb3VyY2UgcmVmZXJlbmNlZCBieSBpdHMgaWQ6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+VGhpcyByZWFkcyB0aGUgcHJvcGVydGllcyBmcm9tIGFuIEFudCByZXNvdXJjZSByZWZlcmVuY2VkIGJ5IGl0cyA8dmFyPmlkPC92YXI+OjwvcD4KKzxwcmU+CiAmbHQ7c3RyaW5nIGlkPSZxdW90O2VtYmVkZGVkLXByb3BlcnRpZXMmcXVvdDsmZ3Q7CiBmb289YmFyCiBiYXo9eHl6enkKQEAgLTY3NywzMDggKzU5OSwyNzAgQEAKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtyZXBsYWNldG9rZW5zIHByb3BlcnRpZXNSZXNvdXJjZT0mcXVvdDske2FudC5yZWZpZDplbWJlZGRlZC1wcm9wZXJ0aWVzfSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9InN0cmlwamF2YWNvbW1lbnRzIj5TdHJpcEphdmFDb21tZW50czwvYT48L2gzPgorPGgzIGlkPSJzdHJpcGphdmFjb21tZW50cyI+U3RyaXBKYXZhQ29tbWVudHM8L2gzPgogCi1UaGlzIGZpbHRlciByZWFkZXIgc3RyaXBzIGF3YXkgY29tbWVudHMgZnJvbSB0aGUgZGF0YSwKLXVzaW5nIEphdmEgc3ludGF4IGd1aWRlbGluZXMuICBUaGlzIGZpbHRlciBkb2VzIG5vdAotdGFrZSBpbiBhbnkgcGFyYW1ldGVycy4KLTxwPgotPGg0PkV4YW1wbGU6PC9oND4KKzxwPlRoaXMgZmlsdGVyIHJlYWRlciBzdHJpcHMgYXdheSBjb21tZW50cyBmcm9tIHRoZSBkYXRhLCB1c2luZyBKYXZhIHN5bnRheCBndWlkZWxpbmVzLiAgVGhpcworZmlsdGVyIGRvZXMgbm90IHRha2UgaW4gYW55IHBhcmFtZXRlcnMuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPGg0PkV4YW1wbGU8L2g0PgorCis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtqYXZhLnNyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske2phdmEuc3JjLmZpbGUubm9jb21tZW50c30mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwSmF2YUNvbW1lbnRzJnF1b3Q7LyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1Db252ZW5pZW5jZSBtZXRob2Q6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+Q29udmVuaWVuY2UgbWV0aG9kOjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske2phdmEuc3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7amF2YS5zcmMuZmlsZS5ub2NvbW1lbnRzfSZxdW90OyZndDsKICAgJmx0O2ZpbHRlcmNoYWluJmd0OwogICAgICZsdDtzdHJpcGphdmFjb21tZW50cy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9InN0cmlwbGluZWJyZWFrcyI+U3RyaXBMaW5lQnJlYWtzPC9hPjwvaDM+Cis8aDMgaWQ9InN0cmlwbGluZWJyZWFrcyI+U3RyaXBMaW5lQnJlYWtzPC9oMz4KIAotVGhpcyBmaWx0ZXIgcmVhZGVyIHN0cmlwcyBhd2F5IHNwZWNpZmljIGNoYXJhY3RlcnMKLWZyb20gdGhlIGRhdGEgc3VwcGxpZWQgdG8gaXQuCis8cD5UaGlzIGZpbHRlciByZWFkZXIgc3RyaXBzIGF3YXkgc3BlY2lmaWMgY2hhcmFjdGVycyBmcm9tIHRoZSBkYXRhIHN1cHBsaWVkIHRvIGl0LjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+bGluZWJyZWFrczwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Q2hhcmFjdGVycyB0aGF0IGFyZSB0bwotICAgIGJlIHN0cmlwcGVkIG91dC4gIERlZmF1bHRzIHRvICZxdW90O1xyXG4mcXVvdDs8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bGluZWJyZWFrczwvdGQ+CisgICAgPHRkPkNoYXJhY3RlcnMgdGhhdCBhcmUgdG8gYmUgc3RyaXBwZWQgb3V0LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5cclxuPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+Ci08aDQ+RXhhbXBsZXM6PC9oND4KIAotVGhpcyBzdHJpcHMgdGhlICdccicgYW5kICdcbicgY2hhcmFjdGVycy4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQ+RXhhbXBsZXM8L2g0PgorCis8cD5UaGlzIHN0cmlwcyB0aGUgPHE+XHI8L3E+IGFuZCA8cT5cbjwvcT4gY2hhcmFjdGVycy48L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5jb250ZW50c30mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlN0cmlwTGluZUJyZWFrcyZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotQ29udmVuaWVuY2UgbWV0aG9kOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5jb250ZW50c30mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7c3RyaXBsaW5lYnJlYWtzLyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1UaGlzIHRyZWF0cyB0aGUgJygnIGFuZCAnKScgY2hhcmFjdGVycyBhcyBsaW5lIGJyZWFrIGNoYXJhY3RlcnMgYW5kCi1zdHJpcHMgdGhlbS4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5UaGlzIHRyZWF0cyB0aGUgPHE+KDwvcT4gYW5kIDxxPik8L3E+IGNoYXJhY3RlcnMgYXMgbGluZSBicmVhayBjaGFyYWN0ZXJzIGFuZCBzdHJpcHMKK3RoZW0uPC9wPgorPHByZT4KICZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUuY29udGVudHN9JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5TdHJpcExpbmVCcmVha3MmcXVvdDsmZ3Q7CiAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lYnJlYWtzJnF1b3Q7IHZhbHVlPSZxdW90OygpJnF1b3Q7LyZndDsKICAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi08aDM+PGEgbmFtZT0ic3RyaXBsaW5lY29tbWVudHMiPlN0cmlwTGluZUNvbW1lbnRzPC9hPjwvaDM+Cis8aDMgaWQ9InN0cmlwbGluZWNvbW1lbnRzIj5TdHJpcExpbmVDb21tZW50czwvaDM+CiAKLVRoaXMgZmlsdGVyIHJlbW92ZXMgYWxsIHRob3NlIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCBzdHJpbmdzCi10aGF0IHJlcHJlc2VudCBjb21tZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCis8cD5UaGlzIGZpbHRlciByZW1vdmVzIGFsbCB0aG9zZSBsaW5lcyB0aGF0IGJlZ2luIHdpdGggc3RyaW5ncyB0aGF0IHJlcHJlc2VudCBjb21tZW50cyBhcyBzcGVjaWZpZWQKK2J5IHRoZSB1c2VyLjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVHlwZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBUeXBlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+Y29tbWVudDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+U3RyaW5ncyB0aGF0IGlkZW50aWZ5IGEgbGluZSBhcyBhIGNvbW1lbnQKLSAgICB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmNvbW1lbnQ8L3RkPgorICAgIDx0ZD5TdHJpbmdzIHRoYXQgaWRlbnRpZnkgYSBsaW5lIGFzIGEgY29tbWVudCB3aGVuIHRoZXkgYXBwZWFyIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICBsaW5lLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+Ci08aDQ+RXhhbXBsZXM6PC9oND4KKzxoND5FeGFtcGxlczwvaDQ+CiAKLVRoaXMgcmVtb3ZlcyBhbGwgbGluZXMgdGhhdCBiZWdpbiB3aXRoICMsIC0tLCBSRU0sIHJlbSBhbmQgLy8KLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5UaGlzIHJlbW92ZXMgYWxsIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCA8cT4jPC9xPiwgPHE+LS08L3E+LCA8cT5SRU08L3E+LCA8cT5yZW08L3E+CithbmQgPHE+Ly88L3E+PC9wPgorPHByZT4KICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU3RyaXBMaW5lQ29tbWVudHMmcXVvdDsmZ3Q7CiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbW1lbnQmcXVvdDsgdmFsdWU9JnF1b3Q7IyZxdW90Oy8mZ3Q7CiAgICZsdDtwYXJhbSB0eXBlPSZxdW90O2NvbW1lbnQmcXVvdDsgdmFsdWU9JnF1b3Q7LS0mcXVvdDsvJmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90O1JFTSAmcXVvdDsvJmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90O3JlbSAmcXVvdDsvJmd0OwogICAmbHQ7cGFyYW0gdHlwZT0mcXVvdDtjb21tZW50JnF1b3Q7IHZhbHVlPSZxdW90Oy8vJnF1b3Q7LyZndDsKLSZsdDsvZmlsdGVycmVhZGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWx0ZXJyZWFkZXImZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDtzdHJpcGxpbmVjb21tZW50cyZndDsKICAgJmx0O2NvbW1lbnQgdmFsdWU9JnF1b3Q7IyZxdW90Oy8mZ3Q7CiAgICZsdDtjb21tZW50IHZhbHVlPSZxdW90Oy0tJnF1b3Q7LyZndDsKICAgJmx0O2NvbW1lbnQgdmFsdWU9JnF1b3Q7UkVNICZxdW90Oy8mZ3Q7CiAgICZsdDtjb21tZW50IHZhbHVlPSZxdW90O3JlbSAmcXVvdDsvJmd0OwogICAmbHQ7Y29tbWVudCB2YWx1ZT0mcXVvdDsvLyZxdW90Oy8mZ3Q7Ci0mbHQ7L3N0cmlwbGluZWNvbW1lbnRzJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9zdHJpcGxpbmVjb21tZW50cyZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9InRhYnN0b3NwYWNlcyI+VGFic1RvU3BhY2VzPC9hPjwvaDM+Cis8aDMgaWQ9InRhYnN0b3NwYWNlcyI+VGFic1RvU3BhY2VzPC9oMz4KIAotVGhpcyBmaWx0ZXIgcmVwbGFjZXMgdGFicyB3aXRoIHNwYWNlcworPHA+VGhpcyBmaWx0ZXIgcmVwbGFjZXMgdGFicyB3aXRoIHNwYWNlczwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+dGFibGVuZ3RoPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5EZWZhdWx0cyB0byAmcXVvdDs4JnF1b3Q7PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnRhYmxlbmd0aDwvdGQ+CisgICAgPHRkPkFtb3VudCBvZiBzcGFjZSBjaGFyYWN0ZXJzIHRvIHJlcGxhY2UgYSB0YWIgY2hhcmFjdGVyIHdpdGguPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPjg8L3E+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4KLTxoND5FeGFtcGxlczo8L2g0PgogCi1UaGlzIHJlcGxhY2VzIHRhYnMgaW4gJHtzcmMuZmlsZX0gd2l0aCBzcGFjZXMuCi08YmxvY2txdW90ZT48cHJlPgorPGg0PkV4YW1wbGVzPC9oND4KKworPHA+VGhpcyByZXBsYWNlcyB0YWJzIGluIDxzYW1wPiR7c3JjLmZpbGV9PC9zYW1wPiB3aXRoIHNwYWNlcy48L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5ub3RhYn0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRhYnNUb1NwYWNlcyZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotQ29udmVuaWVuY2UgbWV0aG9kOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkNvbnZlbmllbmNlIG1ldGhvZDo8L3A+Cis8cHJlPgogJmx0O2xvYWRmaWxlIHNyY2ZpbGU9JnF1b3Q7JHtzcmMuZmlsZX0mcXVvdDsgcHJvcGVydHk9JnF1b3Q7JHtzcmMuZmlsZS5ub3RhYn0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7dGFic3Rvc3BhY2VzLyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi08aDM+PGEgbmFtZT0idGFpbGZpbHRlciI+VGFpbEZpbHRlcjwvYT48L2gzPgorPGgzIGlkPSJ0YWlsZmlsdGVyIj5UYWlsRmlsdGVyPC9oMz4KIAotVGhpcyBmaWx0ZXIgcmVhZHMgdGhlIGxhc3QgZmV3IGxpbmVzIGZyb20gdGhlIGRhdGEgc3VwcGxpZWQgdG8gaXQuCis8cD5UaGlzIGZpbHRlciByZWFkcyB0aGUgbGFzdCBmZXcgbGluZXMgZnJvbSB0aGUgZGF0YSBzdXBwbGllZCB0byBpdC48L3A+CiAKLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIE5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgVmFsdWU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBWYWx1ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPmxpbmVzPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5OdW1iZXIgb2YgbGluZXMgdG8gYmUgcmVhZC4KLSAgICBEZWZhdWx0cyB0byAmcXVvdDsxMCZxdW90OyA8YnI+IEEgbmVnYXRpdmUgdmFsdWUgbWVhbnMgdGhhdCBhbGwgbGluZXMgYXJlCi0gICAgcGFzc2VkICh1c2VmdWwgd2l0aCA8aT5za2lwPC9pPik8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bGluZXM8L3RkPgorICAgIDx0ZD5OdW1iZXIgb2YgbGluZXMgdG8gYmUgcmVhZC48YnIvPgorICAgICAgQSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyB0aGF0IGFsbCBsaW5lcyBhcmUgcGFzc2VkCisgICAgICAodXNlZnVsIHdpdGggPHZhcj5za2lwPC92YXI+KTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4xMDwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+c2tpcDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+TnVtYmVyIG9mIGxpbmVzIHRvIGJlIHNraXBwZWQgKGZyb20gdGhlIGVuZCkuCi0gICAgRGVmYXVsdHMgdG8gJnF1b3Q7MCZxdW90OyA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c2tpcDwvdGQ+CisgICAgPHRkPk51bWJlciBvZiBsaW5lcyB0byBiZSBza2lwcGVkIChmcm9tIHRoZSBlbmQpLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT4wPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+CiAKLTxoND5CYWNrZ3JvdW5kOjwvaDQ+Ci1XaXRoIEhlYWRGaWx0ZXIgYW5kIFRhaWxGaWx0ZXIgeW91IGNhbiBleHRyYWN0IGVhY2ggcGFydCBvZiBhIHRleHQgZmlsZSB5b3Ugd2FudC4KLVRoaXMgZ3JhcGhpYyBzaG93cyB0aGUgZGVwZW5kZW5jaWVzOgorPGg0PkJhY2tncm91bmQ8L2g0PgorPHA+V2l0aCBIZWFkRmlsdGVyIGFuZCBUYWlsRmlsdGVyIHlvdSBjYW4gZXh0cmFjdCBlYWNoIHBhcnQgb2YgYSB0ZXh0IGZpbGUgeW91IHdhbnQuICBUaGlzIGdyYXBoaWMKK3Nob3dzIHRoZSBkZXBlbmRlbmNpZXM6PC9wPgogCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRhYmxlPgogPHRyPgotIDx0aD4gQ29udGVudCA8L3RoPgotIDx0aD48L3RoPgotIDx0aD48L3RoPgotIDx0aD48L3RoPgotIDx0aD4gRmlsdGVyIDwvdGg+CisgPHRoIHNjb3BlPSJjb2wiPkNvbnRlbnQ8L3RoPgorIDx0aCBzY29wZT0iY29sIiBjb2xzcGFuPSIzIj5GaWx0ZXI8L3RoPgogPC90cj4KIDx0cj4KLSA8dGQ+IExpbmUgMSA8L3RkPgotIDx0ZCByb3dzcGFuPSIyIiBiZ2NvbG9yPSIjQzBDMEMwIj4mbmJzcDs8L3RkPgotIDx0ZCByb3dzcGFuPSI5IiBiZ2NvbG9yPSIjRkYwMEZGIj4mbmJzcDs8L3RkPgotIDx0ZCByb3dzcGFuPSI0Ij4mbmJzcDs8L3RkPgotIDx0ZCByb3dzcGFuPSIxMSI+Ci0gICAgPHRhYmxlPgotICAgIDx0cj4KLSAgICAgPHRkIGJnY29sb3I9IiNDMEMwQzAiPiZuYnNwOzwvdGQ+Ci0gICAgIDx0ZD48cHJlPiZsdDtmaWx0ZXJjaGFpbiZndDsKKyA8dGQ+TGluZSAxPC90ZD4KKyA8dGQgcm93c3Bhbj0iMiIgc3R5bGU9ImJhY2tncm91bmQ6bGltZWdyZWVuOyI+CisgICA8cHJlIHN0eWxlPSJiYWNrZ3JvdW5kOmxpbWVncmVlbjttYXJnaW46IDAgMCAwIDA7Ij4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2hlYWRmaWx0ZXIgbGluZXM9IjIiLyZndDsKICZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgPHRkIGJnY29sb3I9IiNGRjAwRkYiPiZuYnNwOzwvdGQ+Ci0gICAgIDx0ZD48cHJlPiZsdDtmaWx0ZXJjaGFpbiZndDsKKyA8dGQgcm93c3Bhbj0iOSIgc3R5bGU9ImJhY2tncm91bmQ6ZnVjaHNpYTsiPgorICAgPHByZSBzdHlsZT0iYmFja2dyb3VuZDpmdWNoc2lhO21hcmdpbjogMCAwIDAgMDsiPiZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0iLTEiIHNraXA9IjIiLyZndDsKLSZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgPHRkIGJnY29sb3I9IiMwMDgwMDAiPiZuYnNwOzwvdGQ+Ci0gICAgIDx0ZD48cHJlPiZsdDtmaWx0ZXJjaGFpbiZndDsKKyZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+CisgPC90ZD4KKyA8dGQgcm93c3Bhbj0iMiI+Jm5ic3A7PC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPkxpbmUgMjwvdGQ+Cis8L3RyPgorPHRyPgorIDx0ZD5MaW5lIDM8L3RkPgorIDx0ZCByb3dzcGFuPSI5IiBzdHlsZT0iYmFja2dyb3VuZDp0b21hdG87Ij4KKyAgIDxwcmUgc3R5bGU9ImJhY2tncm91bmQ6dG9tYXRvO21hcmdpbjogMCAwIDAgMDsiPiZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7aGVhZGZpbHRlciBsaW5lcz0iLTEiIHNraXA9IjIiLyZndDsKICZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgPHRkIGJnY29sb3I9IiMwMDAwRkYiPiZuYnNwOzwvdGQ+Ci0gICAgIDx0ZD48cHJlPiZsdDtmaWx0ZXJjaGFpbiZndDsKKyA8dGQgcm93c3Bhbj0iNyIgc3R5bGU9ImJhY2tncm91bmQ6ZG9kZ2VyYmx1ZTsiPgorICAgPHByZSBzdHlsZT0iYmFja2dyb3VuZDpkb2RnZXJibHVlO21hcmdpbjogMCAwIDAgMDsiPiZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7aGVhZGZpbHRlciBsaW5lcz0iLTEiIHNraXA9IjIiLyZndDsKICAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0iLTEiIHNraXA9IjIiLyZndDsKICZsdDsvZmlsdGVyY2hhaW4mZ3Q7PC9wcmU+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgPHRkIGJnY29sb3I9IiMwMEZGMDAiPiZuYnNwOzwvdGQ+Ci0gICAgIDx0ZD48cHJlPiZsdDtmaWx0ZXJjaGFpbiZndDsKKzwvdHI+Cis8dHI+CisgPHRkPkxpbmUgNDwvdGQ+Cis8L3RyPgorPHRyPgorIDx0ZD5MaW5lIDU8L3RkPgorPC90cj4KKzx0cj4KKyA8dGQ+TGluZXMgLi4uPC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPkxpbmUgOTU8L3RkPgorPC90cj4KKzx0cj4KKyA8dGQ+TGluZSA5NjwvdGQ+Cis8L3RyPgorPHRyPgorIDx0ZD5MaW5lIDk3PC90ZD4KKzwvdHI+Cis8dHI+CisgPHRkPkxpbmUgOTg8L3RkPgorIDx0ZCByb3dzcGFuPSIyIiBzdHlsZT0iYmFja2dyb3VuZDpsaW1lOyI+CisgICA8cHJlICBzdHlsZT0iYmFja2dyb3VuZDpsaW1lO21hcmdpbjogMCAwIDAgMDsiPiZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0iMiIvJmd0OwogJmx0Oy9maWx0ZXJjaGFpbiZndDs8L3ByZT48L3RkPgotICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSA8L3RkPgorIDx0ZCByb3dzcGFuPSIyIj4mbmJzcDs8L3RkPgogPC90cj4KIDx0cj4KLSA8dGQ+IExpbmUgMiA8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmUgMyA8L3RkPgotIDx0ZCByb3dzcGFuPSI5IiBiZ2NvbG9yPSIjMDA4MDAwIj4mbmJzcDs8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmUgNCA8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmUgNSA8L3RkPgotIDx0ZCByb3dzcGFuPSIzIiBiZ2NvbG9yPSIjMDAwMEZGIj4mbmJzcDs8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmVzIC4uLiA8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmUgOTUgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gPHRkPiBMaW5lIDk2IDwvdGQ+Ci0gPHRkIHJvd3NwYW49IjQiPiZuYnNwOzwvdGQ+Ci08L3RyPgotPHRyPgotIDx0ZD4gTGluZSA5NyA8L3RkPgotPC90cj4KLTx0cj4KLSA8dGQ+IExpbmUgOTggPC90ZD4KLSA8dGQgcm93c3Bhbj0iMiIgYmdjb2xvcj0iIzAwRkYwMCI+Jm5ic3A7PC90ZD4KLTwvdHI+Ci08dHI+Ci0gPHRkPiBMaW5lIDk5IDwvdGQ+CisgPHRkPkxpbmUgOTk8L3RkPgogPC90cj4KIDwvdGFibGU+CiAKKzxoND5FeGFtcGxlczwvaDQ+CiAKLQotPGg0PkV4YW1wbGVzOjwvaDQ+Ci0KLVRoaXMgc3RvcmVzIHRoZSBsYXN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZCBkYXRhIGluIHRoZSBwcm9wZXJ0eSAke3NyYy5maWxlLnRhaWx9Ci08YmxvY2txdW90ZT48cHJlPgorPHA+VGhpcyBzdG9yZXMgdGhlIGxhc3QgMTUgbGluZXMgb2YgdGhlIHN1cHBsaWVkIGRhdGEgaW4gdGhlCitwcm9wZXJ0eSA8c2FtcD4ke3NyYy5maWxlLnRhaWx9PC9zYW1wPjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske3NyYy5maWxlLnRhaWx9JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2ZpbHRlcnJlYWRlciBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5UYWlsRmlsdGVyJnF1b3Q7Jmd0OwogICAgICAgJmx0O3BhcmFtIG5hbWU9JnF1b3Q7bGluZXMmcXVvdDsgdmFsdWU9JnF1b3Q7MTUmcXVvdDsvJmd0OwogICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9sb2FkZmlsZSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvbG9hZGZpbGUmZ3Q7PC9wcmU+CiAKLUNvbnZlbmllbmNlIG1ldGhvZDoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5Db252ZW5pZW5jZSBtZXRob2Q6PC9wPgorPHByZT4KICZsdDtsb2FkZmlsZSBzcmNmaWxlPSZxdW90OyR7c3JjLmZpbGV9JnF1b3Q7IHByb3BlcnR5PSZxdW90OyR7c3JjLmZpbGUudGFpbH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7dGFpbGZpbHRlciBsaW5lcz0mcXVvdDsxNSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotCi1UaGlzIHN0b3JlcyB0aGUgbGFzdCA1IGxpbmVzIG9mIHRoZSBmaXJzdCAxNSBsaW5lcyBvZiB0aGUgc3VwcGxpZWQKLWRhdGEgaW4gdGhlIHByb3BlcnR5ICR7c3JjLmZpbGUubWlkfQotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoaXMgc3RvcmVzIHRoZSBsYXN0IDUgbGluZXMgb2YgdGhlIGZpcnN0IDE1IGxpbmVzIG9mIHRoZSBzdXBwbGllZCBkYXRhIGluIHRoZQorcHJvcGVydHkgPHNhbXA+JHtzcmMuZmlsZS5taWR9PC9zYW1wPjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske3NyYy5maWxlLm1pZH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7ZmlsdGVycmVhZGVyIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkhlYWRGaWx0ZXImcXVvdDsmZ3Q7CkBAIC05ODgsNjI4ICs4NzIsNjY4IEBACiAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtsaW5lcyZxdW90OyB2YWx1ZT0mcXVvdDs1JnF1b3Q7LyZndDsKICAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi1Db252ZW5pZW5jZSBtZXRob2Q6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+Q29udmVuaWVuY2UgbWV0aG9kOjwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDske3NyYy5maWxlLm1pZH0mcXVvdDsmZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7aGVhZGZpbHRlciBsaW5lcz0mcXVvdDsxNSZxdW90Oy8mZ3Q7CiAgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9JnF1b3Q7NSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0mbHQ7L2xvYWRmaWxlJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9sb2FkZmlsZSZndDs8L3ByZT4KIAotCi1UaGlzIHN0b3JlcyB0aGUgbGFzdCAxMCBsaW5lcywgc2tpcHBpbmcgdGhlIGxhc3QgMiBsaW5lcywgb2YgdGhlIHN1cHBsaWVkIGRhdGEKLWluIHRoZSBwcm9wZXJ0eSBzcmMuZmlsZS5oZWFkLiAoTWVhbnM6IGlmIHN1cHBsaWVkIGRhdGEgY29udGFpbnMgNjAgbGluZXMsCi1saW5lcyA0OS01OCBhcmUgZXh0cmFjdGVkKQotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlRoaXMgc3RvcmVzIHRoZSBsYXN0IDEwIGxpbmVzLCBza2lwcGluZyB0aGUgbGFzdCAyIGxpbmVzLCBvZiB0aGUgc3VwcGxpZWQgZGF0YSBpbiB0aGUKK3Byb3BlcnR5IDxjb2RlPnNyYy5maWxlLmhlYWQ8L2NvZGU+LiAoTWVhbnM6IGlmIHN1cHBsaWVkIGRhdGEgY29udGFpbnMgNjAgbGluZXMsIGxpbmVzIDQ5LTU4IGFyZQorZXh0cmFjdGVkKTwvcD4KKzxwcmU+CiAmbHQ7bG9hZGZpbGUgc3JjZmlsZT0mcXVvdDske3NyYy5maWxlfSZxdW90OyBwcm9wZXJ0eT0mcXVvdDtzcmMuZmlsZS5oZWFkJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O3RhaWxmaWx0ZXIgbGluZXM9JnF1b3Q7MTAmcXVvdDsgc2tpcD0mcXVvdDsyJnF1b3Q7LyZndDsKICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSZsdDsvbG9hZGZpbGUmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2xvYWRmaWxlJmd0OzwvcHJlPgogCi08aDM+PGEgbmFtZT0iZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48L2gzPgorPGgzIGlkPSJkZWxldGVjaGFyYWN0ZXJzIj5EZWxldGVDaGFyYWN0ZXJzPC9oMz4KIAotICA8cD5UaGlzIGZpbHRlciBkZWxldGVzIHNwZWNpZmllZCBjaGFyYWN0ZXJzLjwvcD4KLSAgPHA+PGVtPnNpbmNlIEFudCAxLjY8L2VtPjwvcD4KLSAgPHA+VGhpcyBmaWx0ZXIgaXMgb25seSBhdmFpbGFibGUgaW4gdGhlIGNvbnZlbmllbmNlIGZvcm0uPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzxwPlRoaXMgZmlsdGVyIGRlbGV0ZXMgc3BlY2lmaWVkIGNoYXJhY3RlcnMuPC9wPgorCis8cD5UaGlzIGZpbHRlciBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgY29udmVuaWVuY2UgZm9ybS48L3A+CisKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5QYXJhbWV0ZXIgTmFtZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBWYWx1ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIFZhbHVlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+Y2hhcnM8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPgotICAgICAgVGhlIGNoYXJhY3RlcnMgdG8gZGVsZXRlLiBUaGlzIGF0dHJpYnV0ZSBpcwotICAgICAgPGEgaHJlZj0iI2JhY2tzbGFzaCI+YmFja3NsYXNoIGVuYWJsZWQ8L2E+LgorICAgIDx0ZD5jaGFyczwvdGQ+CisgICAgPHRkPgorICAgICAgVGhlIGNoYXJhY3RlcnMgdG8gZGVsZXRlLiBUaGlzIGF0dHJpYnV0ZSBpcyA8YSBocmVmPSIjYmFja3NsYXNoIj5iYWNrc2xhc2ggZW5hYmxlZDwvYT4uCiAgICAgPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIDxwPgotPGg0PkV4YW1wbGVzOjwvaDQ+Cis8aDQ+RXhhbXBsZXM8L2g0PgogCi1EZWxldGUgdGFicyBhbmQgcmV0dXJucyBmcm9tIHRoZSBkYXRhLgotPGJsb2NrcXVvdGU+PHByZT4KLSZsdDtkZWxldGVjaGFyYWN0ZXJzIGNoYXJzPSJcdFxyIi8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8cD5EZWxldGUgdGFicyBhbmQgcmV0dXJucyBmcm9tIHRoZSBkYXRhLjwvcD4KKzxwcmU+Jmx0O2RlbGV0ZWNoYXJhY3RlcnMgY2hhcnM9Ilx0XHIiLyZndDs8L3ByZT4KIAotPGgzPjxhIG5hbWU9ImNvbmNhdGZpbHRlciI+Q29uY2F0RmlsdGVyPC9hPjwvaDM+Ci0gIDxwPlRoaXMgZmlsdGVyIHByZXBlbmRzIG9yIGFwcGVuZHMgdGhlIGNvbnRlbnQgZmlsZSB0byB0aGUgZmlsdGVyZWQgZmlsZXMuPC9wPgotICA8cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+PC9wPgotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzxoMyBpZD0iY29uY2F0ZmlsdGVyIj5Db25jYXRGaWx0ZXI8L2gzPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPjwvcD4KKzxwPlRoaXMgZmlsdGVyIHByZXBlbmRzIG9yIGFwcGVuZHMgdGhlIGNvbnRlbnQgZmlsZSB0byB0aGUgZmlsdGVyZWQgZmlsZXMuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBOYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UGFyYW1ldGVyIE5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgVmFsdWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5wcmVwZW5kPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD4KKyAgICA8dGQ+cHJlcGVuZDwvdGQ+CisgICAgPHRkPgogICAgICAgVGhlIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggY29udGVudCBzaG91bGQgYmUgcHJlcGVuZGVkIHRvIHRoZSBmaWxlLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5hcHBlbmQ8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPgorICAgIDx0ZD5hcHBlbmQ8L3RkPgorICAgIDx0ZD4KICAgICAgIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIGNvbnRlbnQgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+CiAKLTxoND5FeGFtcGxlczo8L2g0PgorPGg0PkV4YW1wbGVzPC9oND4KIAotRG8gbm90aGluZzoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5EbyBub3RoaW5nOjwvcD4KKzxwcmU+CiAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CiAgICAgJmx0O2NvbmNhdGZpbHRlci8mZ3Q7Ci0mbHQ7L2ZpbHRlcmNoYWluJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWx0ZXJjaGFpbiZndDs8L3ByZT4KIAotQWRkcyBhIGxpY2Vuc2UgdGV4dCBiZWZvcmUgZWFjaCBqYXZhIHNvdXJjZToKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5BZGRzIGEgbGljZW5zZSB0ZXh0IGJlZm9yZSBlYWNoIEphdmEgc291cmNlIGZpbGU6PC9wPgorPHByZT4KICZsdDtmaWx0ZXJjaGFpbiZndDsKICAgICAmbHQ7Y29uY2F0ZmlsdGVyIHByZXBlbmQ9ImFwYWNoZS1saWNlbnNlLWphdmEudHh0Ii8mZ3Q7Ci0mbHQ7L2ZpbHRlcmNoYWluJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWx0ZXJjaGFpbiZndDs8L3ByZT4KIAorPGgzIGlkPSJzb3J0ZmlsdGVyIj5Tb3J0RmlsdGVyPC9oMz4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KIAorPHA+VGhlIHNvcnQgZmlsdGVyIHJlYWRzIGFsbCBsaW5lcyBhbmQgc29ydHMgdGhlbS4gIFRoZSBzb3J0IG9yZGVyIGNhbiBiZSByZXZlcnNlZCBhbmQgaXQgaXMKK3Bvc3NpYmxlIHRvIHNwZWNpZnkgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLnV0aWwuQ29tcGFyYXRvcjwvY29kZT4KK2ludGVyZmFjZSB0byBnZXQgZXZlbiBtb3JlIGNvbnRyb2wuPC9wPgogCi08aDM+PGEgbmFtZT0idG9rZW5maWx0ZXIiPlRva2VuRmlsdGVyPC9hPjwvaDM+Ci1UaGlzIGZpbHRlciB0b2tlbml6ZXMgdGhlIGlucHV0c3RyZWFtIGludG8gc3RyaW5ncyBhbmQgcGFzc2VzIHRoZXNlCi1zdHJpbmdzIHRvIGZpbHRlcnMgb2Ygc3RyaW5ncy4gVW5saWtlIHRoZSBvdGhlciBmaWx0ZXJyZWFkZXJzLCB0aGlzIGRvZXMKLW5vdCBzdXBwb3J0IHBhcmFtcywgb25seSBjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZC4KLVRoZSB0b2tlbml6ZXIgYW5kIHRoZSBzdHJpbmcgZmlsdGVycyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQgZWxlbWVudHMuCi08cD48ZW0+c2luY2UgQW50IDEuNjwvZW0+PC9wPgotPHA+Ci1Pbmx5IG9uZSB0b2tlbml6ZXIgZWxlbWVudCBtYXkgYmUgdXNlZCwgdGhlIExpbmVUb2tlbml6ZXIgaXMgdGhlCi1kZWZhdWx0IGlmIG5vbmUgYXJlIHNwZWNpZmllZC4gIEEgdG9rZW5pemVyCi1zcGxpdHMgdGhlIGlucHV0IGludG8gdG9rZW4gc3RyaW5ncyBhbmQgdHJhaWxpbmcgZGVsaW1pdGVyIHN0cmluZ3MuCi08cD4KLVRoZXJlIG1heSBiZSB6ZXJvIG9yIG1vcmUgc3RyaW5nIGZpbHRlcnMuIEEgc3RyaW5nIGZpbHRlciBwcm9jZXNzZXMKLWEgdG9rZW4gYW5kIGVpdGhlciByZXR1cm5zIGEgc3RyaW5nIG9yIGEgbnVsbC4KLUl0IHRoZSBzdHJpbmcgaXMgbm90IG51bGwgaXQgaXMgcGFzc2VkIHRvIHRoZSBuZXh0IGZpbHRlci4gVGhpcwotcHJvY2VlZHMgdW50aWwgYWxsIHRoZSBmaWx0ZXJzIGFyZSBjYWxsZWQuCi1JZiBhIHN0cmluZyBpcyByZXR1cm5lZCBhZnRlciBhbGwgdGhlIGZpbHRlcnMsIHRoZSBzdHJpbmcgaXMKLW91dHB1dHMgd2l0aCBpdHMgYXNzb2NpYXRlZCB0b2tlbiBkZWxpbWl0ZXIKLShpZiBvbmUgaXMgcHJlc2VudCkuCi1UaGUgdHJhaWxpbmcgZGVsaW1pdGVyIG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSA8aT5kZWxpbU91dHB1dDwvaT4KLWF0dHJpYnV0ZS4KLTxwPgotPGEgbmFtZT0iYmFja3NsYXNoIj48ZW0+YmFja3NsYXNoIGludGVycHJldGF0aW9uPC9lbT48L2E+Ci1BIG51bWJlciBvZiBhdHRyaWJ1dGVzIChpbmNsdWRpbmcgPGk+ZGVsaW1PdXRwdXQ8L2k+KSBpbnRlcnByZXQKLWJhY2tzbGFzaCBlc2NhcGVzLiBUaGUgZm9sbG93aW5nIGFyZSB1bmRlcnN0b29kOiBcbiwgXHIsIFxmLCBcdAotYW5kIFxcLgotCi0KLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5QYXJhbWV0ZXIgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlBhcmFtZXRlciBWYWx1ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPmRlbGltT3V0cHV0PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD4KLSAgICAgVGhpcyBvdmVycmlkZXMgdGhlIHRva2VuZGVsaW1pdGVyCi0gICAgICAgIHJldHVybmVkIGJ5IHRoZSB0b2tlbml6ZXIgaWYgaXQgaXMgbm90IGVtcHR5LiBUaGlzCisgICAgPHRkPnJldmVyc2U8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIHJldmVyc2UgdGhlIHNvcnQgb3JkZXIuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQKKyAgICAgIGlmIHRoZSBjb21wYXJhdG9yIHBhcmFtZXRlciBpcyBwcmVzZW50IGFzIHdlbGwuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y29tcGFyYXRvcjwvdGQ+CisgICAgPHRkPkNsYXNzIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEudXRpbC5Db21wYXJhdG9yPC9jb2RlPiBmb3IKKyAgICAgIFN0cmluZ3MuICBUaGlzIGNsYXNzIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgb2YgbGluZXMuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKworPHA+VGhpcyBmaWx0ZXIgaXMgYWxzbyBhdmFpbGFibGUgdXNpbmcgdGhlIG5hbWUgPGNvZGU+c29ydGZpbHRlcjwvY29kZT4uCitUaGUgPGNvZGU+cmV2ZXJzZTwvY29kZT4gcGFyYW1ldGVyIGJlY29tZXMgYW4gYXR0cmlidXRlLCA8Y29kZT5jb21wYXJhdG9yPC9jb2RlPiBjYW4gYmUKK3NwZWNpZmllZCBieSB1c2luZyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KKworPGg0PkV4YW1wbGVzPC9oND4KKworPHByZT4KKyZsdDtjb3B5IHRvZGlyPSZxdW90O2J1aWxkJnF1b3Q7Jmd0OworICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtpbnB1dCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqLnR4dCZxdW90Oy8mZ3Q7CisgICAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICAgICAmbHQ7c29ydGZpbHRlci8mZ3Q7CisgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KKworPHA+CitTb3J0IGFsbCBmaWxlcyA8c2FtcD4qLnR4dDwvc2FtcD4gZnJvbSA8c2FtcD5zcmM8L3NhbXA+IGxvY2F0aW9uIGludG8gPHNhbXA+YnVpbGQ8L3NhbXA+Citsb2NhdGlvbi4gVGhlIGxpbmVzIG9mIGVhY2ggZmlsZSBhcmUgc29ydGVkIGluIGFzY2VuZGFudCBvcmRlciBjb21wYXJpbmcgdGhlIGxpbmVzIHZpYSB0aGUKKzxjb2RlPlN0cmluZy5jb21wYXJlVG8oT2JqZWN0IG8pPC9jb2RlPiBtZXRob2QuCis8L3A+CisKKzxwcmU+CismbHQ7Y29weSB0b2Rpcj0mcXVvdDtidWlsZCZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aW5wdXQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OworICAgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAgICAgJmx0O3NvcnRmaWx0ZXIgcmV2ZXJzZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKKyAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgorCis8cD4KK1NvcnQgYWxsIGZpbGVzIDxzYW1wPioudHh0PC9zYW1wPiBmcm9tIDxzYW1wPnNyYzwvc2FtcD4gbG9jYXRpb24gaW50byByZXZlcnNlIG9yZGVyIGFuZCBjb3B5Cit0aGVtIGludG8gPHNhbXA+YnVpbGQ8L3NhbXA+IGxvY2F0aW9uLgorPC9wPgorCis8cHJlPgorJmx0O2NvcHkgdG9kaXI9JnF1b3Q7YnVpbGQmcXVvdDsmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2lucHV0JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoudHh0JnF1b3Q7LyZndDsKKyAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7CisgICAgICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU29ydEZpbHRlciZxdW90OyZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O2NvbXBhcmF0b3ImcXVvdDsgdmFsdWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5FdmVuRmlyc3RDbXAmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L2ZpbHRlcnJlYWRlciZndDsKKyAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgorCis8cD4KK1NvcnQgYWxsIGZpbGVzIDxzYW1wPioudHh0PC9zYW1wPiBmcm9tIDxzYW1wPnNyYzwvc2FtcD4gbG9jYXRpb24gdXNpbmcgYXMgc29ydGluZworY3JpdGVyaXVtIDxjb2RlIGNsYXNzPSJjb2RlIj5FdmVuRmlyc3RDbXA8L2NvZGU+IGNsYXNzLCB0aGF0IHNvcnRzIHRoZSBmaWxlIGxpbmVzIHB1dHRpbmcgZXZlbiBsaW5lcworZmlyc3QgdGhlbiBvZGQgbGluZXMgZm9yIGV4YW1wbGUuIFRoZSBtb2RpZmllZCBmaWxlcyBhcmUgY29waWVkIGludG8gPHNhbXA+YnVpbGQ8L3NhbXA+Citsb2NhdGlvbi4gVGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5FdmVuRmlyc3RDbXA8L2NvZGU+IGhhcyB0byBhbiBpbnN0YW5jaWFibGUgY2xhc3MKK3ZpYSA8Y29kZSBjbGFzcz0iY29kZSI+Q2xhc3MubmV3SW5zdGFuY2UoKTwvY29kZT4sIHRoZXJlZm9yZSBpbiBjYXNlIG9mIGlubmVyIGNsYXNzIGhhcyB0bworYmUgPGVtPnN0YXRpYzwvZW0+LiBJdCBhbHNvIGhhcyB0byBpbXBsZW1lbnQgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEudXRpbC5Db21wYXJhdG9yPC9jb2RlPgoraW50ZXJmYWNlLCBmb3IgZXhhbXBsZToKKzwvcD4KKworPHByZT4KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKKy4uLiAob21pdHRlZCkKK3B1YmxpYyBmaW5hbCBjbGFzcyBFdmVuRmlyc3RDbXAgaW1wbGVtZW50cyAmbHQ7YiZndDtDb21wYXJhdG9yJmx0Oy9iJmd0OyB7CisgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAuLi4ob21pdHRlZCkKKyAgIH0KK308L3ByZT4KKworPHA+VGhlIGV4YW1wbGUgYWJvdmUgaXMgZXF1aXZhbGVudCB0bzo8L3A+CisKKzxwcmU+CismbHQ7Y29tcG9uZW50ZGVmIG5hbWU9JnF1b3Q7ZXZlbmZpcnN0JnF1b3Q7CisgICAgICAgICAgICAgIGNsYXNzbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkV2ZW5GaXJzdENtcCZxdW90Oy8mZ3Q7CismbHQ7Y29weSB0b2Rpcj0mcXVvdDtidWlsZCZxdW90OyZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aW5wdXQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OworICAgICZsdDtmaWx0ZXJjaGFpbiZndDsKKyAgICAgICAgJmx0O3NvcnRmaWx0ZXImZ3Q7CisgICAgICAgICAgICAmbHQ7ZXZlbmZpcnN0LyZndDsKKyAgICAgICAgJmx0Oy9zb3J0ZmlsdGVyJmd0OworICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CisKKzxoMyBpZD0idG9rZW5maWx0ZXIiPlRva2VuRmlsdGVyPC9oMz4KKzxwPlRoaXMgZmlsdGVyIHRva2VuaXplcyB0aGUgSW5wdXRTdHJlYW0gaW50byBzdHJpbmdzIGFuZCBwYXNzZXMgdGhlc2Ugc3RyaW5ncyB0byBmaWx0ZXJzIG9mCitzdHJpbmdzLiBVbmxpa2UgdGhlIG90aGVyIEZpbHRlclJlYWRlcnMsIHRoaXMgZG9lcyBub3Qgc3VwcG9ydCA8Y29kZT5wYXJhbTwvY29kZT5zLCBvbmx5Citjb252ZW5pZW5jZSBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZC4gIFRoZSB0b2tlbml6ZXIgYW5kIHRoZSBzdHJpbmcgZmlsdGVycyBhcmUgZGVmaW5lZCBieSBuZXN0ZWQKK2VsZW1lbnRzLjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT48L3A+Cis8cD4KK09ubHkgb25lIDxjb2RlPnRva2VuaXplcjwvY29kZT4gZWxlbWVudCBtYXkgYmUgdXNlZCwgdGhlIExpbmVUb2tlbml6ZXIgaXMgdGhlIGRlZmF1bHQgaWYgbm9uZQorYXJlIHNwZWNpZmllZC4gIEEgdG9rZW5pemVyIHNwbGl0cyB0aGUgaW5wdXQgaW50byB0b2tlbiBzdHJpbmdzIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXIgc3RyaW5ncy4KKzxwPgorVGhlcmUgbWF5IGJlIHplcm8gb3IgbW9yZSBzdHJpbmcgZmlsdGVycy4gQSBzdHJpbmcgZmlsdGVyIHByb2Nlc3NlcyBhIHRva2VuIGFuZCBlaXRoZXIgcmV0dXJucyBhCitzdHJpbmcgb3IgYSBudWxsLiAgSXQgdGhlIHN0cmluZyBpcyBub3QgbnVsbCBpdCBpcyBwYXNzZWQgdG8gdGhlIG5leHQgZmlsdGVyLiBUaGlzIHByb2NlZWRzCit1bnRpbCBhbGwgdGhlIGZpbHRlcnMgYXJlIGNhbGxlZC4gIElmIGEgc3RyaW5nIGlzIHJldHVybmVkIGFmdGVyIGFsbCB0aGUgZmlsdGVycywgdGhlIHN0cmluZyBpcworb3V0cHV0cyB3aXRoIGl0cyBhc3NvY2lhdGVkIHRva2VuIGRlbGltaXRlciAoaWYgb25lIGlzIHByZXNlbnQpLiAgVGhlIHRyYWlsaW5nIGRlbGltaXRlciBtYXkgYmUKK292ZXJyaWRkZW4gYnkgdGhlIDx2YXI+ZGVsaW1PdXRwdXQ8L3Zhcj4gYXR0cmlidXRlLgorPGg0IGlkPSJiYWNrc2xhc2giPkJhY2tzbGFzaCBpbnRlcnByZXRhdGlvbjwvaDQ+Cis8cD4KK0EgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKGluY2x1ZGluZyA8dmFyPmRlbGltT3V0cHV0PC92YXI+KSBpbnRlcnByZXQgYmFja3NsYXNoIGVzY2FwZXMuIFRoZQorZm9sbG93aW5nIGFyZSB1bmRlcnN0b29kOiA8cT5cbjwvcT4sIDxxPlxyPC9xPiwgPHE+XGY8L3E+LCA8cT5cdDwvcT4gYW5kIDxxPlxcPC9xPi4KKzwvcD4KKworPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kZWxpbU91dHB1dDwvdGQ+CisgICAgPHRkPgorICAgICBUaGlzIG92ZXJyaWRlcyB0aGUgdG9rZW4gZGVsaW1pdGVyIHJldHVybmVkIGJ5IHRoZSB0b2tlbml6ZXIgaWYgaXQgaXMgbm90IGVtcHR5LiBUaGlzCiAgICAgIGF0dHJpYnV0ZSBpcyBiYWNrc2xhc2ggZW5hYmxlZC4KLTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICA8L3RyPgotPC90YWJsZT4KLTxwPgotCi0gICAgVGhlIGZvbGxvd2luZyB0b2tlbml6ZXJzIGFyZSBwcm92aWRlZCBieSB0aGUgZGVmYXVsdCBkaXN0cmlidXRpb24uCi0gICAgPHA+Ci0gICAgICAgIDxhIGhyZWY9IiNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPjxicj4KLSAgICAgICAgPGEgaHJlZj0iI2ZpbGV0b2tlbml6ZXIiPkZpbGVUb2tlbml6ZXI8L2E+PGJyPgotICAgICAgICA8YSBocmVmPSIjc3RyaW5ndG9rZW5pemVyIj5TdHJpbmdUb2tlbml6ZXI8L2E+PGJyPgotICAgIDwvcD4KLQotICAgIFRoZSBmb2xsb3dpbmcgc3RyaW5nIGZpbHRlcnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbi4KLSAgICA8cD4KLSAgICAgICAgPGEgaHJlZj0iI3JlcGxhY2VzdHJpbmciPlJlcGxhY2VTdHJpbmc8L2E+PGJyPgotICAgICAgICA8YSBocmVmPSIjY29udGFpbnNzdHJpbmciPkNvbnRhaW5zU3RyaW5nPC9hPjxicj4KLSAgICAgICAgPGEgaHJlZj0iI3JlcGxhY2VyZWdleCI+UmVwbGFjZVJlZ2V4PC9hPjxicj4KLSAgICAgICAgPGEgaHJlZj0iI2NvbnRhaW5zcmVnZXgiPkNvbnRhaW5zUmVnZXg8L2E+PGJyPgotICAgICAgICA8YSBocmVmPSIjdHJpbSI+VHJpbTwvYT48YnI+Ci0gICAgICAgIDxhIGhyZWY9IiNpZ25vcmVibGFuayI+SWdub3JlQmxhbms8L2E+PGJyPgotICAgICAgICA8YSBocmVmPSIjZmlsdGVyZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnI+Ci0gICAgICAgIDxhIGhyZWY9IiN1bmlxZmlsdGVyIj5VbmlxRmlsdGVyPC9hPjxicj4KLSAgICAgICAgPGEgaHJlZj0iI25hdGl2ZTJhc2NpaWZpbHRlciI+TmF0aXZlMkFzY2lpRmlsdGVyPC9hPjxicj4KLSAgICA8L3A+Ci0KLSAgICBUaGUgZm9sbG93aW5nIHN0cmluZyBmaWx0ZXJzIGFyZSBwcm92aWRlZCBieSB0aGUgb3B0aW9uYWwgZGlzdHJpYnV0aW9uLgotICAgIDxwPgotICAgICAgICA8YSBocmVmPSIjc2NyaXB0ZmlsdGVyIj5TY3JpcHRGaWx0ZXI8L2E+PGJyPgotICAgIDwvcD4KLQotU29tZSBvZiB0aGUgZmlsdGVycyBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXIgY2hhaW4uIEluIHRoaXMKLWNhc2UgYSB0b2tlbmZpbHRlciBpcyBjcmVhdGVkIGltcGxpY2l0bHkuIEFuIGV4dHJhIGF0dHJpYnV0ZSAiYnlsaW5lIgotaXMgYWRkZWQgdG8gdGhlIGZpbHRlciB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIGEgbGluZXRva2VuaXplcgotKGJ5bGluZT0idHJ1ZSIpIG9yIGEgZmlsZXRva2VuaXplciAoYnlsaW5lPSJmYWxzZSIpLiBUaGUgZGVmYXVsdAotaXMgInRydWUiLgotPHA+Ci0KLTxwPjxiPjxlbT48YSBuYW1lPSJsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPjwvZW0+PC9iPjwvcD4KLVRoaXMgdG9rZW5pemVyIHNwbGl0cyB0aGUgaW5wdXQgaW50byBsaW5lcy4KLVRoZSB0b2tlbml6ZXIgZGVsaW1pdHMgbGluZXMKLWJ5ICJcciIsICJcbiIgb3IgIlxyXG4iLgotVGhpcyBpcyB0aGUgZGVmYXVsdCB0b2tlbml6ZXIuCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgotICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICA8L3RyPgotICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+aW5jbHVkZURlbGltczwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+Ci0gICAgICBJbmNsdWRlIHRoZSBsaW5lIGVuZGluZ3MgaW4gdGhlIHRva2VuLgotICAgICAgRGVmYXVsdCBpcyBmYWxzZS4KICAgICA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxoND5FeGFtcGxlczo8L2g0PgorPHA+VGhlIGZvbGxvd2luZyB0b2tlbml6ZXJzIGFyZSBwcm92aWRlZCBieSB0aGUgZGVmYXVsdCBkaXN0cmlidXRpb24uPC9wPgorPHA+CisgIDxhIGhyZWY9IiNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPjxici8+CisgIDxhIGhyZWY9IiNmaWxldG9rZW5pemVyIj5GaWxlVG9rZW5pemVyPC9hPjxici8+CisgIDxhIGhyZWY9IiNzdHJpbmd0b2tlbml6ZXIiPlN0cmluZ1Rva2VuaXplcjwvYT4KKzwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgc3RyaW5nIGZpbHRlcnMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBkZWZhdWx0IGRpc3RyaWJ1dGlvbi48L3A+Cis8cD4KKyAgPGEgaHJlZj0iI3JlcGxhY2VzdHJpbmciPlJlcGxhY2VTdHJpbmc8L2E+PGJyLz4KKyAgPGEgaHJlZj0iI2NvbnRhaW5zc3RyaW5nIj5Db250YWluc1N0cmluZzwvYT48YnIvPgorICA8YSBocmVmPSIjcmVwbGFjZXJlZ2V4Ij5SZXBsYWNlUmVnZXg8L2E+PGJyLz4KKyAgPGEgaHJlZj0iI2NvbnRhaW5zcmVnZXgiPkNvbnRhaW5zUmVnZXg8L2E+PGJyLz4KKyAgPGEgaHJlZj0iI3RyaW0iPlRyaW08L2E+PGJyLz4KKyAgPGEgaHJlZj0iI2lnbm9yZWJsYW5rIj5JZ25vcmVCbGFuazwvYT48YnIvPgorICA8YSBocmVmPSIjZmlsdGVyZGVsZXRlY2hhcmFjdGVycyI+RGVsZXRlQ2hhcmFjdGVyczwvYT48YnIvPgorICA8YSBocmVmPSIjdW5pcWZpbHRlciI+VW5pcUZpbHRlcjwvYT48YnIvPgorICA8YSBocmVmPSIjbmF0aXZlMmFzY2lpZmlsdGVyIj5OYXRpdmUyQXNjaWlGaWx0ZXI8L2E+Cis8L3A+Cis8cD5UaGUgZm9sbG93aW5nIHN0cmluZyBmaWx0ZXJzIGFyZSBwcm92aWRlZCBieSB0aGUgb3B0aW9uYWwgZGlzdHJpYnV0aW9uLjwvcD4KKzxwPgorICA8YSBocmVmPSIjc2NyaXB0ZmlsdGVyIj5TY3JpcHRGaWx0ZXI8L2E+Cis8L3A+Cis8cD4KKyAgPGEgaHJlZj0iI2N1c3RvbSI+Q3VzdG9tPC9hPiB0b2tlbml6ZXJzIGFuZCBzdHJpbmcgZmlsdGVycyBjYW4gYmUgZGVjbGFyZWQKKyAgdXNpbmcgPGEgaHJlZj0iLi4vVGFza3MvdHlwZWRlZi5odG1sIj50eXBlZGVmPC9hPiB0YXNrLgorPC9wPgorPHA+CitTb21lIG9mIHRoZSBmaWx0ZXJzIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbiBhIDxjb2RlPmZpbHRlcmNoYWluPC9jb2RlPi4gSW4gdGhpcyBjYXNlCithIDxjb2RlPnRva2VuZmlsdGVyPC9jb2RlPiBpcyBjcmVhdGVkIGltcGxpY2l0bHkuIEFuIGV4dHJhIGF0dHJpYnV0ZSA8dmFyPmJ5bGluZTwvdmFyPiBpcyBhZGRlZCB0bwordGhlIGZpbHRlciB0byBzcGVjaWZ5IHdoZXRoZXIgdG8gdXNlIGEgPGNvZGU+bGluZXRva2VuaXplcjwvY29kZT4gKDx2YXI+YnlsaW5lPC92YXI+PTxxPnRydWU8L3E+KSBvcgorYSA8Y29kZT5maWxldG9rZW5pemVyPC9jb2RlPiAoPHZhcj5ieWxpbmU8L3Zhcj49PHE+ZmFsc2U8L3E+KS4gVGhlIGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT4uCis8L3A+CiAKLUNvbnZlcnQgaW5wdXQgY3VycmVudCBsaW5lIGVuZGluZ3MgdG8gdW5peCBzdHlsZSBsaW5lIGVuZGluZ3MuCi08YmxvY2txdW90ZT48cHJlPgotJmx0O3Rva2VuZmlsdGVyIGRlbGltb3V0cHV0PSZxdW90O1xuJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxoNCBpZD0ibGluZXRva2VuaXplciI+TGluZVRva2VuaXplcjwvaDQ+Cis8cD5UaGlzIHRva2VuaXplciBzcGxpdHMgdGhlIGlucHV0IGludG8gbGluZXMuICBUaGUgdG9rZW5pemVyIGRlbGltaXRzIGxpbmVzIGJ5IDxxPlxyPC9xPiwgPHE+XG48L3E+CitvciA8cT5cclxuPC9xPi4gIFRoaXMgaXMgdGhlIGRlZmF1bHQgdG9rZW5pemVyLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+aW5jbHVkZURlbGltczwvdGQ+CisgICAgPHRkPgorICAgICAgSW5jbHVkZSB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSB0b2tlbi4KKyAgICA8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoNT5FeGFtcGxlczwvaDU+CiAKKzxwPkNvbnZlcnQgaW5wdXQgY3VycmVudCBsaW5lIGVuZGluZ3MgdG8gVW5peCBzdHlsZSBsaW5lIGVuZGluZ3MuPC9wPgorPHByZT4mbHQ7dG9rZW5maWx0ZXIgZGVsaW1vdXRwdXQ9JnF1b3Q7XG4mcXVvdDsvJmd0OzwvcHJlPgogCi1SZW1vdmUgYmxhbmsgbGluZXMuCi08YmxvY2txdW90ZT48cHJlPgorPHA+UmVtb3ZlIGJsYW5rIGxpbmVzLjwvcD4KKzxwcmU+CiAmbHQ7dG9rZW5maWx0ZXImZ3Q7CiAgICAgJmx0O2lnbm9yZWJsYW5rLyZndDsKLSZsdDsvdG9rZW5maWx0ZXImZ3Q7CismbHQ7L3Rva2VuZmlsdGVyJmd0OzwvcHJlPgogCi08L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDQgaWQ9ImZpbGV0b2tlbml6ZXIiPkZpbGVUb2tlbml6ZXI8L2g0PgorPHA+VGhpcyB0b2tlbml6ZXIgdHJlYXRzIDxzdHJvbmc+YWxsPC9zdHJvbmc+IHRoZSBpbnB1dCBhcyBhIHRva2VuLiBTbyBiZSBjYXJlZnVsIG5vdCB0byB1c2UKK3RoaXMgb24gdmVyeSBsYXJnZSBpbnB1dC48L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgogCi08cD48Yj48ZW0+PGEgbmFtZT0iZmlsZXRva2VuaXplciI+RmlsZVRva2VuaXplcjwvYT48L2VtPjwvYj48L3A+Ci1UaGlzIHRva2VuaXplciB0cmVhdHMgPGI+YWxsPC9iPiB0aGUgaW5wdXQgYXMgYSB0b2tlbi4gU28gYmUKLWNhcmVmdWwgbm90IHRvIHVzZSB0aGlzIG9uIHZlcnkgbGFyZ2UgaW5wdXQuCi08aDQ+RXhhbXBsZXM6PC9oND4KLQotUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBwYWNrYWdlIHdpdGggLy9wYWNrYWdlLgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPlJlcGxhY2UgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgPHNhbXA+cGFja2FnZTwvc2FtcD4gd2l0aCA8c2FtcD4vL3BhY2thZ2U8L3NhbXA+LjwvcD4KKzxwcmU+CiAmbHQ7dG9rZW5maWx0ZXImZ3Q7CiAgICAgICAmbHQ7ZmlsZXRva2VuaXplci8mZ3Q7CiAgICAgICAmbHQ7cmVwbGFjZXJlZ2V4IHBhdHRlcm49IihbXG5ccl0rWyBcdF0qfF5bIFx0XSopcGFja2FnZSIKICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9InMiCiAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2U9IlwxLy9wYWNrYWdlIi8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPHA+PGI+PGVtPjxhIG5hbWU9InN0cmluZ3Rva2VuaXplciI+U3RyaW5nVG9rZW5pemVyPC9hPjwvZW0+PC9iPjwvcD4KLVRoaXMgdG9rZW5pemVyIGlzIGJhc2VkIG9uIGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIuCi1JdCBzcGxpdHMgdXAgdGhlIGlucHV0IGludG8gc3RyaW5ncyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UsIG9yCi1ieSBhIHNwZWNpZmllZCBsaXN0IG9mIGRlbGltaXRpbmcgY2hhcmFjdGVycy4KLUlmIHRoZSBzdHJlYW0gc3RhcnRzIHdpdGggZGVsaW1pdGVyIGNoYXJhY3RlcnMsIHRoZSBmaXJzdAotdG9rZW4gd2lsbCBiZSB0aGUgZW1wdHkgc3RyaW5nICh1bmxlc3MgdGhlIDxpPmRlbGltc2FyZXRva2VuczwvaT4KLWF0dHJpYnV0ZSBpcyB1c2VkKS4KKzxoNCBpZD0ic3RyaW5ndG9rZW5pemVyIj5TdHJpbmdUb2tlbml6ZXI8L2g0PgorPHA+VGhpcyB0b2tlbml6ZXIgaXMgYmFzZWQgb24gPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI8L2NvZGU+LiAgSXQgc3BsaXRzIHVwIHRoZQoraW5wdXQgaW50byBzdHJpbmdzIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZSwgb3IgYnkgYSBzcGVjaWZpZWQgbGlzdCBvZiBkZWxpbWl0aW5nIGNoYXJhY3RlcnMuICBJZgordGhlIHN0cmVhbSBzdGFydHMgd2l0aCBkZWxpbWl0ZXIgY2hhcmFjdGVycywgdGhlIGZpcnN0IHRva2VuIHdpbGwgYmUgdGhlIGVtcHR5IHN0cmluZyAodW5sZXNzCit0aGUgPHZhcj5kZWxpbXNhcmV0b2tlbnM8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQpLjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+ZGVsaW1zPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5UaGUgZGVsaW1pdGVyIGNoYXJhY3RlcnMuIFdoaXRlIHNwYWNlCi0gICAgICBpcyB1c2VkIGlmIHRoaXMgaXMgbm90IHNldC4gKFdoaXRlIHNwYWNlIGlzIGRlZmluZWQKLSAgICAgIGluIHRoaXMgY2FzZSBieSBqYXZhLmxhbmcuQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSgpKS4KKyAgICA8dGQ+ZGVsaW1zPC90ZD4KKyAgICA8dGQ+VGhlIGRlbGltaXRlciBjaGFyYWN0ZXJzLgogICAgIDwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gd2hpdGUgc3BhY2UgYXMgZGVmaW5lZAorICAgICAgYnkgPGNvZGU+amF2YS5sYW5nLkNoYXJhY3Rlci5pc1doaXRlc3BhY2UoKTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWxpbXNhcmV0b2tlbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+SWYgdGhpcyBpcyB0cnVlLAotICAgICAgZWFjaCBkZWxpbWl0ZXIgY2hhcmFjdGVyIGlzIHJldHVybmVkIGFzIGEgdG9rZW4uCi0gICAgICBEZWZhdWx0IGlzIGZhbHNlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmRlbGltc2FyZXRva2VuczwvdGQ+CisgICAgPHRkPklmIHRoaXMgaXMgPHE+dHJ1ZTwvcT4sIGVhY2ggZGVsaW1pdGVyIGNoYXJhY3RlciBpcyByZXR1cm5lZCBhcyBhIHRva2VuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnN1cHByZXNzZGVsaW1zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgSWYgdGhpcyBpcyB0cnVlLCBkZWxpbWl0ZXJzIGFyZSBub3QgcmV0dXJuZWQuCi0gICAgICBEZWZhdWx0IGlzIGZhbHNlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnN1cHByZXNzZGVsaW1zPC90ZD4KKyAgICA8dGQ+SWYgdGhpcyBpcyA8cT50cnVlPC9xPiwgZGVsaW1pdGVycyBhcmUgbm90IHJldHVybmVkLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5pbmNsdWRlRGVsaW1zPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD4KLSAgICAgIEluY2x1ZGUgdGhlIGRlbGltaXRlcnMgaW4gdGhlIHRva2VuLgotICAgICAgRGVmYXVsdCBpcyBmYWxzZS4KLSAgICA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aW5jbHVkZURlbGltczwvdGQ+CisgICAgPHRkPkluY2x1ZGUgdGhlIGRlbGltaXRlcnMgaW4gdGhlIHRva2VuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+RXhhbXBsZXM6PC9oND4KKzxoNT5FeGFtcGxlczwvaDU+CiAKLVN1cnJvdW5kIGVhY2ggbm9uIHNwYWNlIHRva2VuIHdpdGggYSAiW10iLgorPHA+U3Vycm91bmQgZWFjaCBub24gc3BhY2UgdG9rZW4gd2l0aCBhIDxxPltdPC9xPi48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3Rva2VuZmlsdGVyJmd0OwogICAgICZsdDtzdHJpbmd0b2tlbml6ZXIvJmd0OwogICAgICZsdDtyZXBsYWNlcmVnZXggcGF0dGVybj0iKC4rKSIgcmVwbGFjZT0iW1wxXSIvJmd0OwotJmx0Oy90b2tlbmZpbHRlciZndDsKKyZsdDsvdG9rZW5maWx0ZXImZ3Q7PC9wcmU+CiAKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxoNCBpZD0icmVwbGFjZXN0cmluZyI+UmVwbGFjZVN0cmluZzwvaDQ+Cis8cD5UaGlzIGlzIGEgc2ltcGxlIGZpbHRlciB0byByZXBsYWNlIHN0cmluZ3MuICBUaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4KK2EgPGNvZGU+ZmlsdGVyY2hhaW48L2NvZGU+LjwvcD4KIAotPHA+PGI+PGVtPjxhIG5hbWU9InJlcGxhY2VzdHJpbmciPlJlcGxhY2VTdHJpbmc8L2E+PC9lbT48L2I+PC9wPgotVGhpcyBpcyBhIHNpbXBsZSBmaWx0ZXIgdG8gcmVwbGFjZSBzdHJpbmdzLgotVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uCi0KLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPmZyb208L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBzdHJpbmcgdGhhdCBtdXN0IGJlIHJlcGxhY2VkLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+ZnJvbTwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgdGhhdCBtdXN0IGJlIHJlcGxhY2VkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRvPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuZXcgdmFsdWUgZm9yIHRoZSByZXBsYWNlZCBzdHJpbmcuIFdoZW4gb21pdHRlZAotICAgICAgYW4gZW1wdHkgc3RyaW5nIGlzIHVzZWQuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+dG88L3RkPgorICAgIDx0ZD5UaGUgbmV3IHZhbHVlIGZvciB0aGUgcmVwbGFjZWQgc3RyaW5nLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBlbXB0eSBzdHJpbmc8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PkV4YW1wbGVzOjwvaDQ+Cis8aDU+RXhhbXBsZXM8L2g1PgogCi1SZXBsYWNlICJzdW4iIHdpdGggIm1vb24iLgorPHA+UmVwbGFjZSA8cT5zdW48L3E+IHdpdGggPHE+bW9vbjwvcT4uPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDt0b2tlbmZpbHRlciZndDsKICAgICAmbHQ7cmVwbGFjZXN0cmluZyBmcm9tPSJzdW4iIHRvPSJtb29uIi8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPHA+PGI+PGVtPjxhIG5hbWU9ImNvbnRhaW5zc3RyaW5nIj5Db250YWluc1N0cmluZzwvYT48L2VtPjwvYj48L3A+Ci1UaGlzIGlzIGEgc2ltcGxlIGZpbHRlciB0byBmaWx0ZXIgdG9rZW5zIHRoYXQgY29udGFpbnMKLWEgc3BlY2lmaWVkIHN0cmluZy4KKzxoNCBpZD0iY29udGFpbnNzdHJpbmciPkNvbnRhaW5zU3RyaW5nPC9oND4KKzxwPlRoaXMgaXMgYSBzaW1wbGUgZmlsdGVyIHRvIGZpbHRlciB0b2tlbnMgdGhhdCBjb250YWlucyBhIHNwZWNpZmllZCBzdHJpbmcuPC9wPgogCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5jb250YWluczwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+VGhlIHN0cmluZyB0aGF0IHRoZSB0b2tlbiBtdXN0IGNvbnRhaW4uPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5jb250YWluczwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgdGhhdCB0aGUgdG9rZW4gbXVzdCBjb250YWluLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+RXhhbXBsZXM6PC9oND4KKzxoNT5FeGFtcGxlczwvaDU+CiAKLUluY2x1ZGUgb25seSBsaW5lcyB0aGF0IGNvbnRhaW4gImZvbyI7Cis8cD5JbmNsdWRlIG9ubHkgbGluZXMgdGhhdCBjb250YWluIDxxPmZvbzwvcT48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3Rva2VuZmlsdGVyJmd0OwogICAgICZsdDtjb250YWluc3N0cmluZyBjb250YWlucz0iZm9vIi8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08cD48Yj48ZW0+PGEgbmFtZT0icmVwbGFjZXJlZ2V4Ij5SZXBsYWNlUmVnZXg8L2E+PC9lbT48L2I+PC9wPgotVGhpcyBzdHJpbmcgZmlsdGVyIHJlcGxhY2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCi1UaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXJjaGFpbi4KKzxoNCBpZD0icmVwbGFjZXJlZ2V4Ij5SZXBsYWNlUmVnZXg8L2g0PgogPHA+Ci0gU2VlIDxhIGhyZWY9InJlZ2V4cC5odG1sI2ltcGxlbWVudGF0aW9uIj5SZWdleHAgVHlwZTwvYT4KLWNvbmNlcm5pbmcgdGhlIGNob2ljZSBvZiB0aGUgaW1wbGVtZW50YXRpb24uCitUaGlzIHN0cmluZyBmaWx0ZXIgcmVwbGFjZXMgcmVndWxhciBleHByZXNzaW9ucy4gIFRoaXMgZmlsdGVyIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbgorYSA8Y29kZT5maWx0ZXJjaGFpbjwvY29kZT4uCis8L3A+Cis8cD4KK1NlZSA8YSBocmVmPSJyZWdleHAuaHRtbCNpbXBsZW1lbnRhdGlvbiI+UmVnZXhwIFR5cGU8L2E+IGNvbmNlcm5pbmcgdGhlIGNob2ljZSBvZiB0aGUKK2ltcGxlbWVudGF0aW9uLgogPC9wPgogCi08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5wYXR0ZXJuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4KLSAgICAgIHRoZSB0b2tlbi48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnBhdHRlcm48L3RkPgorICAgIDx0ZD5UaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIHRva2VuLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5yZXBsYWNlPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5UaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcmVwbGFjZSB0aGUgbWF0Y2hlZAotICAgICAgcmVndWxhciBleHByZXNzaW9uLiBXaGVuIG9taXR0ZWQgYW4gZW1wdHkgc3RyaW5nIGlzIHVzZWQuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5UaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcmVwbGFjZSB0aGUgbWF0Y2hlZCByZWd1bGFyIGV4cHJlc3Npb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGVtcHR5IHN0cmluZzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5mbGFnczwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+U2VlCi08YSBocmVmPSIuLi9UYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdleHA8L2E+Ci1mb3IgYW4gZXhwbGFuYXRpb24gb2YgcmVnZXggZmxhZ3MuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZsYWdzPC90ZD4KKyAgICA8dGQ+U2VlIDxhIGhyZWY9Ii4uL1Rhc2tzL3JlcGxhY2VyZWdleHAuaHRtbCI+UmVwbGFjZVJlZ2V4cDwvYT4gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHJlZ2V4CisgICAgICBmbGFncy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGg0PkV4YW1wbGVzOjwvaDQ+Cis8aDU+RXhhbXBsZXM8L2g1PgogCi1SZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiAiaGVsbG8iIHdpdGggIndvcmxkIiwgaWdub3JpbmcgY2FzZS4KKzxwPlJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIDxxPmhlbGxvPC9xPiB3aXRoIDxxPndvcmxkPC9xPiwgaWdub3JpbmcgY2FzZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3Rva2VuZmlsdGVyJmd0OwogICAgICZsdDtyZXBsYWNlcmVnZXggcGF0dGVybj0iaGVsbG8iIHJlcGxhY2U9IndvcmxkIiBmbGFncz0iZ2kiLyZndDsKLSZsdDsvdG9rZW5maWx0ZXImZ3Q7CismbHQ7L3Rva2VuZmlsdGVyJmd0OzwvcHJlPgogCi08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTxwPjxiPjxlbT48YSBuYW1lPSJjb250YWluc3JlZ2V4Ij5Db250YWluc1JlZ2V4PC9hPjwvZW0+PC9iPjwvcD4KLVRoaXMgZmlsdGVycyBzdHJpbmdzIHRoYXQgbWF0Y2ggcmVndWxhciBleHByZXNzaW9ucy4KLVRoZSBmaWx0ZXIgbWF5IG9wdGlvbmFsbHkgcmVwbGFjZSB0aGUgbWF0Y2hlZCByZWd1bGFyIGV4cHJlc3Npb24uCi1UaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXJjaGFpbi4KKzxoNCBpZD0iY29udGFpbnNyZWdleCI+Q29udGFpbnNSZWdleDwvaDQ+CiA8cD4KLVNlZQotPGEgaHJlZj0icmVnZXhwLmh0bWwjaW1wbGVtZW50YXRpb24iPlJlZ2V4cCBUeXBlPC9hPgotY29uY2VybmluZyB0aGUgY2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4KK1RoaXMgZmlsdGVycyBzdHJpbmdzIHRoYXQgbWF0Y2ggcmVndWxhciBleHByZXNzaW9ucy4gIFRoZSBmaWx0ZXIgbWF5IG9wdGlvbmFsbHkgcmVwbGFjZSB0aGUKK21hdGNoZWQgcmVndWxhciBleHByZXNzaW9uLiAgVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgPGNvZGU+ZmlsdGVyY2hhaW48L2NvZGU+LgogPC9wPgotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzxwPgorU2VlIDxhIGhyZWY9InJlZ2V4cC5odG1sI2ltcGxlbWVudGF0aW9uIj5SZWdleHAgVHlwZTwvYT4gY29uY2VybmluZyB0aGUgY2hvaWNlIG9mIHJlZ3VsYXIKK2V4cHJlc3Npb24gaW1wbGVtZW50YXRpb24uCis8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBpbgotICAgICAgdGhlIHRva2VuLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBpbiB0aGUgdG9rZW4uPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnJlcGxhY2U8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBzdWJzdGl0dXRpb24gcGF0dGVybiB0byByZXBsYWNlIHRoZSBtYXRjaGVkCi0gICAgICByZWd1bGFyIGV4cHJlc3Npb24uIFdoZW4gb21pdHRlZCB0aGUgb3JpZ2luYWwgdG9rZW4gaXMgcmV0dXJuZWQuCi0gICAgPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJlcGxhY2U8L3RkPgorICAgIDx0ZD5UaGUgc3Vic3RpdHV0aW9uIHBhdHRlcm4gdG8gcmVwbGFjZSB0aGUgbWF0Y2hlZCByZWd1bGFyIGV4cHJlc3Npb24uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgb3JpZ2luYWwgdG9rZW48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+ZmxhZ3M8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlNlZQotPGEgaHJlZj0iLi4vVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIj5SZXBsYWNlUmVnZXhwPC9hPgotZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHJlZ2V4IGZsYWdzLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5mbGFnczwvdGQ+CisgICAgPHRkPlNlZSA8YSBocmVmPSIuLi9UYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdleHA8L2E+IGZvciBhbiBleHBsYW5hdGlvbiBvZiByZWdleAorICAgICAgZmxhZ3MuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PkV4YW1wbGVzOjwvaDQ+Cis8aDU+RXhhbXBsZXM8L2g1PgogCi1GaWx0ZXIgbGluZXMgdGhhdCBjb250YWluICJoZWxsbyIgb3IgIndvcmxkIiwgaWdub3JpbmcgY2FzZS4KKzxwPkZpbHRlciBsaW5lcyB0aGF0IGNvbnRhaW4gPHE+aGVsbG88L3E+IG9yIDxxPndvcmxkPC9xPiwgaWdub3JpbmcgY2FzZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3Rva2VuZmlsdGVyJmd0OwogICAgICZsdDtjb250YWluc3JlZ2V4IHBhdHRlcm49IihoZWxsb3x3b3JsZCkiIGZsYWdzPSJpIi8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OworJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPC9wcmU+PC9ibG9ja3F1b3RlPgorPHA+VGhpcyBleGFtcGxlIHJlcGxhY2VzIGxpbmVzIGxpa2UgPGNvZGU+U1VJVEUoVGVzdFN1aXRlLCBiaXRzKTs8L2NvZGU+IHdpdGggPGNvZGU+dm9pZAorcmVnaXN0ZXJfYml0cygpOzwvY29kZT4gYW5kIHJlbW92ZXMgb3RoZXIgbGluZXMuPC9wPgogCi1UaGlzIGV4YW1wbGUgcmVwbGFjZXMgbGluZXMgbGlrZSAiU1VJVEUoVGVzdFN1aXRlLCBiaXRzKTsiIHdpdGgKLSJ2b2lkIHJlZ2lzdGVyX2JpdHMoKTsiIGFuZCByZW1vdmVzIG90aGVyIGxpbmVzLgotCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDt0b2tlbmZpbHRlciZndDsKICAgICAmbHQ7Y29udGFpbnNyZWdleAogICAgICAgICBwYXR0ZXJuPSJeICpTVUlURVwoLiosXHMqKC4qKVxzKlwpLioiCiAgICAgICAgIHJlcGxhY2U9InZvaWQgcmVnaXN0ZXJfXDEoKTsiLyZndDsKLSZsdDsvdG9rZW5maWx0ZXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3Rva2VuZmlsdGVyJmd0OzwvcHJlPgogCi08cD48Yj48ZW0+PGEgbmFtZT0idHJpbSI+VHJpbTwvYT48L2VtPjwvYj48L3A+Ci1UaGlzIGZpbHRlciB0cmltcyB3aGl0ZXNwYWNlIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YKLXRva2Vucy4KLVRoaXMgZmlsdGVyIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbiBhIGZpbHRlcmNoYWluLgotPHA+PGI+PGVtPjxhIG5hbWU9Imlnbm9yZWJsYW5rIj5JZ25vcmVCbGFuazwvYT48L2VtPjwvYj48L3A+Ci1UaGlzIGZpbHRlciByZW1vdmVzIGVtcHR5IHRva2Vucy4KLVRoaXMgZmlsdGVyIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbiBhIGZpbHRlcmNoYWluLgotPHA+PGI+PGVtPjxhIG5hbWU9ImZpbHRlcmRlbGV0ZWNoYXJhY3RlcnMiPkRlbGV0ZUNoYXJhY3RlcnM8L2E+PC9lbT48L2I+PC9wPgotVGhpcyBmaWx0ZXIgZGVsZXRlcyBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIHRva2Vucy4KKzxoNCBpZD0idHJpbSI+VHJpbTwvaDQ+Cis8cD5UaGlzIGZpbHRlciB0cmltcyB3aGl0ZXNwYWNlIGZyb20gdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdG9rZW5zLiAgVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQKK2RpcmVjdGx5IHdpdGhpbiBhIDxjb2RlPmZpbHRlcmNoYWluPC9jb2RlPi48L3A+CiAKLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8aDQgaWQ9Imlnbm9yZWJsYW5rIj5JZ25vcmVCbGFuazwvaDQ+Cis8cD5UaGlzIGZpbHRlciByZW1vdmVzIGVtcHR5IHRva2Vucy4gIFRoaXMgZmlsdGVyIG1heSBiZSB1c2VkIGRpcmVjdGx5IHdpdGhpbgorYSA8Y29kZT5maWx0ZXJjaGFpbjwvY29kZT4uPC9wPgorCis8aDQgaWQ9ImZpbHRlcmRlbGV0ZWNoYXJhY3RlcnMiPkRlbGV0ZUNoYXJhY3RlcnM8L2g0PgorPHA+VGhpcyBmaWx0ZXIgZGVsZXRlcyBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIHRva2Vucy48L3A+CisKKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+Y2hhcnM8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlRoZSBjaGFyYWN0ZXJzIHRvIGRlbGV0ZS4gVGhpcyBhdHRyaWJ1dGUKLSAgICAgIGlzIGJhY2tzbGFzaCBlbmFibGVkLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+Y2hhcnM8L3RkPgorICAgIDx0ZD5UaGUgY2hhcmFjdGVycyB0byBkZWxldGUuIFRoaXMgYXR0cmlidXRlIGlzIGJhY2tzbGFzaCBlbmFibGVkLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+RXhhbXBsZXM6PC9oND4KKzxoNT5FeGFtcGxlczwvaDU+CiAKLURlbGV0ZSB0YWJzIGZyb20gbGluZXMsIHRyaW0gdGhlIGxpbmVzIGFuZCByZW1vdmVzIGVtcHR5IGxpbmVzLgorPHA+RGVsZXRlIHRhYnMgZnJvbSBsaW5lcywgdHJpbSB0aGUgbGluZXMgYW5kIHJlbW92ZXMgZW1wdHkgbGluZXMuPC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDt0b2tlbmZpbHRlciZndDsKICAgICAmbHQ7ZGVsZXRlY2hhcmFjdGVycyBjaGFycz0iXHQiLyZndDsKICAgICAmbHQ7dHJpbS8mZ3Q7CiAgICAgJmx0O2lnbm9yZWJsYW5rLyZndDsKLSZsdDsvdG9rZW5maWx0ZXImZ3Q7CismbHQ7L3Rva2VuZmlsdGVyJmd0OzwvcHJlPgogCi08L3ByZT48L2Jsb2NrcXVvdGU+Cis8aDQgaWQ9InVuaXFmaWx0ZXIiPlVuaXFGaWx0ZXI8L2g0PgogCi08cD48Yj48ZW0+PGEgbmFtZT0idW5pcWZpbHRlciI+VW5pcUZpbHRlcjwvYT48L2VtPjwvYj48L3A+Cis8cD5TdXBwcmVzc2VzIGFsbCB0b2tlbnMgdGhhdCBtYXRjaCB0aGVpciBhbmNlc3RvciB0b2tlbi4gIEl0IGlzIG1vc3QgdXNlZnVsIGlmIGNvbWJpbmVkIHdpdGggYQorc29ydCBmaWx0ZXIuPC9wPgogCi08cD5TdXBwcmVzc2VzIGFsbCB0b2tlbnMgdGhhdCBtYXRjaCB0aGVpciBhbmNlc3RvciB0b2tlbi4gIEl0IGlzIG1vc3QKLSAgdXNlZnVsIGlmIGNvbWJpbmVkIHdpdGggYSBzb3J0IGZpbHRlci48L3A+Cis8cD5UaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSA8Y29kZT5maWx0ZXJjaGFpbjwvY29kZT4uPC9wPgogCi08cD5UaGlzIGZpbHRlciBtYXkgYmUgdXNlZCBkaXJlY3RseSB3aXRoaW4gYSBmaWx0ZXJjaGFpbi48L3A+Cis8aDU+RXhhbXBsZTwvaDU+CiAKLTxoND5FeGFtcGxlOjwvaDQ+Ci0KLVRoaXMgc3VwcHJlc3NlcyBkdXBsaWNhdGUgbGluZXMuCi08YmxvY2txdW90ZT48cHJlPgorPHA+VGhpcyBzdXBwcmVzc2VzIGR1cGxpY2F0ZSBsaW5lcy48L3A+Cis8cHJlPgogJmx0O3Rva2VuZmlsdGVyJmd0OwogICAmbHQ7dW5pcWZpbHRlci8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPHA+PGI+PGVtPjxhIG5hbWU9Im5hdGl2ZTJhc2NpaWZpbHRlciI+TmF0aXZlMkFzY2lpRmlsdGVyPC9hPjwvZW0+PC9iPjwvcD4KKzxoNCBpZD0ibmF0aXZlMmFzY2lpZmlsdGVyIj5OYXRpdmUyQXNjaWlGaWx0ZXI8L2g0PgorCis8cD48ZW0+U2luY2UgQW50IDEuOS44PC9lbT48L3A+CiAKIDxwPlVzZXMgdGhlICJidWlsdGluIiBpbXBsZW1lbnRhdGlvbiBvZgotICB0aGUgPGEgaHJlZj0iLi4vVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPm5hdGl2ZTJhc2NpaTwvYT4gdGFzay48L3A+Cit0aGUgPGEgaHJlZj0iLi4vVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPm5hdGl2ZTJhc2NpaTwvYT4gdGFzay48L3A+CiAKLTxwPlJlcGxhY2VzIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIFVuaWNvZGUtZXNjYXBlcyBvcgotICB2aWNlLXZlcnNhLiAgPGVtPlNpbmNlIEFudCAxLjkuODwvZW0+LjwvcD4KKzxwPlJlcGxhY2VzIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIFVuaWNvZGUtZXNjYXBlcyBvciB2aWNlLXZlcnNhLjwvcD4KIAotPHA+VGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uPC9wPgorPHA+VGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgPGNvZGU+ZmlsdGVyY2hhaW48L2NvZGU+LjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+cmV2ZXJzZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+UmV2ZXJzZSB0aGUgc2Vuc2Ugb2YgdGhlIGNvbnZlcnNpb24sCi0gICAgICBpLmUuIGNvbnZlcnQgZnJvbSBBU0NJSSB0byBuYXRpdmUuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnJldmVyc2U8L3RkPgorICAgIDx0ZD5SZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgY29udmVyc2lvbiwgaS5lLiBjb252ZXJ0IGZyb20gQVNDSUkgdG8gbmF0aXZlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxoND5FeGFtcGxlOjwvaDQ+Cis8aDU+RXhhbXBsZTwvaDU+CiAKIDxwPlRoaXMgcmVwbGFjZXMgYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIFVuaWNvZGUtZXNjYXBlcy48L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDt0b2tlbmZpbHRlciZndDsKICAgJmx0O25hdGl2ZTJhc2NpaWZpbHRlci8mZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotPHA+PGI+PGVtPjxhIG5hbWU9InNjcmlwdGZpbHRlciI+U2NyaXB0RmlsdGVyPC9hPjwvZW0+PC9iPjwvcD4KLVRoaXMgaXMgYW4gb3B0aW9uYWwgZmlsdGVyIHRoYXQgZXhlY3V0ZXMgYSBzY3JpcHQgaW4gYQotPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KLSAgb3IKLSAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgotc3VwcG9ydGVkIGxhbmd1YWdlLjwvcD4KLVNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IKLWFuIGV4cGxhbmF0aW9uIG9mIHNjcmlwdHMgYW5kIGRlcGVuZGVuY2llcy4KKzxoNCBpZD0ic2NyaXB0ZmlsdGVyIj5TY3JpcHRGaWx0ZXI8L2g0PgorPHA+CitUaGlzIGlzIGFuIG9wdGlvbmFsIGZpbHRlciB0aGF0IGV4ZWN1dGVzIGEgc2NyaXB0IGluIGEgPGEgaHJlZj0iaHR0cHM6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIgordGFyZ2V0PSJfdG9wIj5BcGFjaGUgQlNGPC9hPgorb3IgPGEgaHJlZj0iaHR0cHM6Ly9qY3Aub3JnL2Fib3V0SmF2YS9jb21tdW5pdHlwcm9jZXNzL21haW50ZW5hbmNlL2pzcjIyMy8yMjNDaGFuZ2VMb2cuaHRtbCIKK3RhcmdldD0iX3RvcCI+SlNSIDIyMzwvYT4gc3VwcG9ydGVkIGxhbmd1YWdlLgogPC9wPgogPHA+Ci1UaGUgc2NyaXB0IGlzIHByb3ZpZGVkIHdpdGggYW4gb2JqZWN0IDxpPnNlbGY8L2k+IHRoYXQgaGFzCi1nZXRUb2tlbigpIGFuZCBzZXRUb2tlbihTdHJpbmcpIG1ldGhvZHMuCi1UaGUgZ2V0VG9rZW4oKSBtZXRob2QgcmV0dXJucyB0aGUgY3VycmVudCB0b2tlbi4gVGhlIHNldFRva2VuKFN0cmluZykKLW1ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCB0b2tlbi4KK1NlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQKK2RlcGVuZGVuY2llcy4KIDwvcD4KLQotVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgZmlsdGVyY2hhaW4uPHA+Ci08dGFibGUgY2VsbFNwYWNpbmc9MCBjZWxsUGFkZGluZz0yIGJvcmRlcj0xPgorPHA+CitUaGUgc2NyaXB0IGlzIHByb3ZpZGVkIHdpdGggYW4gb2JqZWN0IDxzYW1wIGNsYXNzPSJjb2RlIj5zZWxmPC9zYW1wPiB0aGF0CitoYXMgPGNvZGUgY2xhc3M9ImNvZGUiPmdldFRva2VuKCk8L2NvZGU+IGFuZCA8Y29kZSBjbGFzcz0iY29kZSI+c2V0VG9rZW4oU3RyaW5nKTwvY29kZT4gbWV0aG9kcy4KK1RoZSA8Y29kZSBjbGFzcz0iY29kZSI+Z2V0VG9rZW4oKTwvY29kZT4gbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQKK3Rva2VuLiBUaGUgPGNvZGUgY2xhc3M9ImNvZGUiPnNldFRva2VuKFN0cmluZyk8L2NvZGU+IG1ldGhvZCByZXBsYWNlcyB0aGUgY3VycmVudCB0b2tlbi4KKzwvcD4KKzxwPgorVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgZGlyZWN0bHkgd2l0aGluIGEgPGNvZGU+ZmlsdGVyY2hhaW48L2NvZGU+LgorPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5sYW5ndWFnZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+IFRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZSB0aGUgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uCi1NdXN0IGJlIGEgc3VwcG9ydGVkIEFwYWNoZSBCU0Ygb3IgSlNSIDIyMyBsYW5ndWFnZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZD5Qcm9ncmFtbWluZyBsYW5ndWFnZSB0aGUgc2NyaXB0IGlzIHdyaXR0ZW4gaW4uICBNdXN0IGJlIGEgc3VwcG9ydGVkIEFwYWNoZSBCU0Ygb3IgSlNSIDIyMworICAgICAgbGFuZ3VhZ2U8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5tYW5hZ2VyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgVGhlIHNjcmlwdCBlbmdpbmUgbWFuYWdlciB0byB1c2UuCi0gICAgICBTZWUgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sKLSAgICAgIGZvciB1c2luZyB0aGlzIGF0dHJpYnV0ZS4KLSAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8gLSBkZWZhdWx0IGlzICJhdXRvIjwvdGQ+CisgICAgPHRkPm1hbmFnZXI8L3RkPgorICAgIDx0ZD5TY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLiAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrIGZvcgorICAgICAgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+YXV0bzwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+c3JjPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD5UaGUgbG9jYXRpb24gb2YgdGhlIHNjcmlwdCBhcyBhIGZpbGUsIGlmIG5vdCBpbmxpbmUKLSAgICA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+c3JjPC90ZD4KKyAgICA8dGQ+TG9jYXRpb24gb2YgdGhlIHNjcmlwdCBhcyBhIGZpbGUsIGlmIG5vdCBpbmxpbmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zZXRiZWFuczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj53aGV0aGVyIHRvIGhhdmUgYWxsIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMgYW5kIHRhcmdldHMgYXMKLSAgICAgIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHNjcmlwdC4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyAidHJ1ZSIuPC90ZD4KKyAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5FbmNvZGluZyBvZiB0aGUgc2NyaXB0IGFzIGEgZmlsZS4gPGVtPlNpbmNlIEFudCAxLjEwLjI8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICBUaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LgotICAgIDwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnNldGJlYW5zPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBoYXZlIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzIGFzIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlCisgICAgICBzY3JpcHQuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aHJlZjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYQotICAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gcGFzcyBpbnRvIHRoZSBzY3JpcHQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGgKKyAgICAgIGRlZmluZWQgZWxzZXdoZXJlLgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotICA8cD4KLSAgICBUaGlzIGZpbHRlciBjYW4gdGFrZSBhIG5lc3RlZCAmbHQ7Y2xhc3NwYXRoJmd0OyBlbGVtZW50LgotICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgIG9uIGhvdyB0byB1c2UgdGhpcyBlbGVtZW50LgotICA8L3A+Ci08aDQ+RXhhbXBsZXM6PC9oND4KLQotQ29udmVydCB0byB1cHBlcmNhc2U6Ci08YmxvY2txdW90ZT48cHJlPgorPHA+CitUaGlzIGZpbHRlciBjYW4gdGFrZSBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudC4gIFNlZQordGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2sgb24gaG93IHRvIHVzZSB0aGlzIGVsZW1lbnQuCis8L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHA+Q29udmVydCB0byB1cHBlcmNhc2U6PC9wPgorPHByZT4KICZsdDt0b2tlbmZpbHRlciZndDsKICAgICAmbHQ7c2NyaXB0ZmlsdGVyIGxhbmd1YWdlPSJqYXZhc2NyaXB0IiZndDsKICAgICAgICAgc2VsZi5zZXRUb2tlbihzZWxmLmdldFRva2VuKCkudG9VcHBlckNhc2UoKSk7CiAgICAgJmx0Oy9zY3JpcHRmaWx0ZXImZ3Q7Ci0mbHQ7L3Rva2VuZmlsdGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90b2tlbmZpbHRlciZndDs8L3ByZT4KIAotUmVtb3ZlIGxpbmVzIGNvbnRhaW5pbmcgdGhlIHN0cmluZyAiYmFkIiB3aGlsZQotY29weWluZyB0ZXh0IGZpbGVzOgotICA8YmxvY2txdW90ZT4KLSAgICA8cHJlPgorPHA+UmVtb3ZlIGxpbmVzIGNvbnRhaW5pbmcgdGhlIHN0cmluZyA8cT5iYWQ8L3E+IHdoaWxlIGNvcHlpbmcgdGV4dCBmaWxlczo8L3A+Cis8cHJlPgogJmx0O2NvcHkgdG9kaXI9ImRpc3QiJmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9IioqLyoudHh0Ii8mZ3Q7CiAgICZsdDtmaWx0ZXJjaGFpbiZndDsKQEAgLTE2MTksMTkgKzE1NDMsMTcgQEAKICAgICAgICAgfQogICAgICZsdDsvc2NyaXB0ZmlsdGVyJmd0OwogICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotJmx0Oy9jb3B5Jmd0OwotICAgIDwvcHJlPgotICA8L2Jsb2NrcXVvdGU+CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLTxoND5DdXN0b20gdG9rZW5pemVycyBhbmQgc3RyaW5nIGZpbHRlcnM8L2g0PgorPGg0IGlkPSJjdXN0b20iPkN1c3RvbSB0b2tlbml6ZXJzIGFuZCBzdHJpbmcgZmlsdGVyczwvaDQ+CiAKLUN1c3RvbSBzdHJpbmcgZmlsdGVycyBhbmQgdG9rZW5pemVycyBtYXkgYmUgcGx1Z2dlZCBpbiBieQotZXh0ZW5kaW5nIHRoZSBpbnRlcmZhY2VzIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVG9rZW5GaWx0ZXIuRmlsdGVyCi1hbmQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Ub2tlbml6ZXIgcmVzcGVjdGx5LgorPHA+Q3VzdG9tIHN0cmluZyBmaWx0ZXJzIGFuZCB0b2tlbml6ZXJzIG1heSBiZSBwbHVnZ2VkIGluIGJ5IGV4dGVuZGluZyB0aGUKK2ludGVyZmFjZXMgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuVG9rZW5GaWx0ZXIuRmlsdGVyPC9jb2RlPgorYW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlRva2VuaXplcjwvY29kZT4gcmVzcGVjdGx5LjwvcD4KIAotVGhleSBhcmUgZGVmaW5lZCB0aGUgYnVpbGQgZmlsZSB1c2luZyA8Y29kZT4mbHQ7dHlwZWRlZi8mZ3Q7PC9jb2RlPi4gRm9yCi1leGFtcGxlIGEgc3RyaW5nIGZpbHRlciB0aGF0IGNhcGl0YWxpemVzIHdvcmRzIG1heSBiZSBkZWNsYXJlZCBhczoKLTxibG9ja3F1b3RlPjxwcmU+Cis8cD5UaGV5IGFyZSBkZWZpbmVkIGluIHRoZSBidWlsZCBmaWxlIHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmLyZndDs8L2NvZGU+LiBGb3IgZXhhbXBsZSwgYSBzdHJpbmcKK2ZpbHRlciB0aGF0IGNhcGl0YWxpemVzIHdvcmRzIG1heSBiZSBkZWNsYXJlZCBhczo8L3A+Cis8cHJlPgogcGFja2FnZSBteS5jdXN0b21hbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Ub2tlbkZpbHRlcjsKIApAQCAtMTY0NCwxMzUgKzE1NjYsMjAgQEAKICAgICAgICAgcmV0dXJuIHRva2VuLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsKICAgICAgICAgICAgICAgICB0b2tlbi5zdWJzdHJpbmcoMSk7CiAgICB9Ci19Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cit9PC9wcmU+CiAKLVRoaXMgbWF5IGJlIHVzZWQgYXMgZm9sbG93czoKLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDt0eXBlZGVmIG5hbWU9ImNhcGl0YWxpemUiIGNsYXNzbmFtZT0ibXkuY3VzdG9tYW50LkNhcGl0YWxpemUiCi0gICAgICAgICAgIGNsYXNzcGF0aD0ibXkuY3VzdG9tYW50LnBhdGgiLyZndDsKLSAgJmx0O2NvcHkgZmlsZT0iaW5wdXQiIHRvZmlsZT0ib3V0cHV0IiZndDsKLSAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7Ci0gICAgICAmbHQ7dG9rZW5maWx0ZXImZ3Q7Ci0gICAgICAgICZsdDtzdHJpbmd0b2tlbml6ZXIvJmd0OwotICAgICAgICAmbHQ7Y2FwaXRhbGl6ZS8mZ3Q7Ci0gICAgICAmbHQ7L3Rva2VuZmlsdGVyJmd0OwotICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0gICZsdDsvY29weSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCi08aDM+PGEgbmFtZT0ic29ydGZpbHRlciI+U29ydEZpbHRlcjwvYT48L2gzPgotICA8cD48ZW0+c2luY2UgQW50IDEuOC4wPC9lbT48L3A+Ci0KLTxwPlRoZSBzb3J0IGZpbHRlciByZWFkcyBhbGwgbGluZXMgYW5kIHNvcnRzIHRoZW0uICBUaGUgc29ydCBvcmRlciBjYW4KLSAgYmUgcmV2ZXJzZWQgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIHNwZWNpZnkgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YKLSAgdGhlIDxjb2RlPmphdmEudXRpbC5Db21wYXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UgdG8gZ2V0IGV2ZW4gbW9yZQotICBjb250cm9sLjwvcD4KLQotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KLSAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPlBhcmFtZXRlciBOYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+UGFyYW1ldGVyIFZhbHVlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnJldmVyc2U8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPndoZXRoZXIgdG8gcmV2ZXJzZSB0aGUgc29ydCBvcmRlciwKLSAgICAgIGRlZmF1bHRzIHRvIGZhbHNlLiAgPGI+Tm90ZTo8L2I+IHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQgaWYKLSAgICAgIHRoZSBjb21wYXJhdG9yIHBhcmFtZXRlciBpcyBwcmVzZW50IGFzIHdlbGwuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5jb21wYXJhdG9yPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj5DbGFzcyBuYW1lIG9mIGEgY2xhc3MgdGhhdAotICAgICAgaW1wbGVtZW50cyA8Y29kZT5qYXZhLnV0aWwuQ29tcGFyYXRvcjwvY29kZT4gZm9yIFN0cmluZ3MuICBUaGlzCi0gICAgICBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzb3J0IG9yZGVyIG9mIGxpbmVzLjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICA8L3RyPgotPC90YWJsZT4KLQotPHA+VGhpcyBmaWx0ZXIgaXMgYWxzbyBhdmFpbGFibGUgdXNpbmcgdGhlCi0gIG5hbWUgPGNvZGU+c29ydGZpbHRlcjwvY29kZT4uICBUaGUgPGNvZGU+cmV2ZXJzZTwvY29kZT4gcGFyYW1ldGVyCi0gIGJlY29tZXMgYW4gYXR0cmlidXRlLCA8Y29kZT5jb21wYXJhdG9yPC9jb2RlPiBjYW4gYmUgc3BlY2lmaWVkIGJ5Ci0gIHVzaW5nIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgotCi08aDQ+RXhhbXBsZXM6PC9oND4KLQotPGJsb2NrcXVvdGU+PHByZT4KLSAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7YnVpbGQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aW5wdXQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OwotICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OwotICAgICAgICAgICZsdDtzb3J0ZmlsdGVyLyZndDsKLSAgICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0gICZsdDsvY29weSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+Ci1Tb3J0IGFsbCBmaWxlcyA8Y29kZT4qLnR4dDwvY29kZT4gZnJvbSA8aT5zcmM8L2k+IGxvY2F0aW9uCi1pbnRvIDxpPmJ1aWxkPC9pPiBsb2NhdGlvbi4gVGhlIGxpbmVzIG9mIGVhY2ggZmlsZSBhcmUgc29ydGVkIGluCi1hc2NlbmRhbnQgb3JkZXIgY29tcGFyaW5nIHRoZSBsaW5lcyB2aWEgdGhlCi08Y29kZT5TdHJpbmcuY29tcGFyZVRvKE9iamVjdCBvKTwvY29kZT4gbWV0aG9kLgotPC9wPgotCi08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7Y29weSB0b2Rpcj0mcXVvdDtidWlsZCZxdW90OyZndDsKLSAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtpbnB1dCZxdW90OyBpbmNsdWRlcz0mcXVvdDsqLnR4dCZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7ZmlsdGVyY2hhaW4mZ3Q7Ci0gICAgICAgICAgJmx0O3NvcnRmaWx0ZXIgcmV2ZXJzZT0mcXVvdDt0cnVlJnF1b3Q7LyZndDsKLSAgICAgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7Ci0gICZsdDsvY29weSZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotPHA+Ci1Tb3J0IGFsbCBmaWxlcyA8Y29kZT4qLnR4dDwvY29kZT4gZnJvbSA8aT5zcmM8L2k+IGxvY2F0aW9uIGludG8gcmV2ZXJzZQotb3JkZXIgYW5kIGNvcHkgdGhlbSBpbnRvIDxpPmJ1aWxkPC9pPiBsb2NhdGlvbi4KLTwvcD4KLQotPGJsb2NrcXVvdGU+PHByZT4KLSAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7YnVpbGQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aW5wdXQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OwotICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OwotICAgICAgICAgICZsdDtmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuU29ydEZpbHRlciZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O2NvbXBhcmF0b3ImcXVvdDsgdmFsdWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5FdmVuRmlyc3RDbXAmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDsvZmlsdGVycmVhZGVyJmd0OwotICAgICAgJmx0Oy9maWx0ZXJjaGFpbiZndDsKLSAgJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotCi08cD4KLVNvcnQgYWxsIGZpbGVzIDxjb2RlPioudHh0PC9jb2RlPiBmcm9tIDxpPnNyYzwvaT4gbG9jYXRpb24gdXNpbmcgYXMKLXNvcnRpbmcgY3JpdGVyaXVtIDxjb2RlPkV2ZW5GaXJzdENtcDwvY29kZT4gY2xhc3MsIHRoYXQgc29ydHMgdGhlIGZpbGUKLWxpbmVzIHB1dHRpbmcgZXZlbiBsaW5lcyBmaXJzdCB0aGVuIG9kZCBsaW5lcyBmb3IgZXhhbXBsZS4gVGhlIG1vZGlmaWVkIGZpbGVzCi1hcmUgY29waWVkIGludG8gPGk+YnVpbGQ8L2k+IGxvY2F0aW9uLiBUaGUgPGNvZGU+RXZlbkZpcnN0Q21wPC9jb2RlPiwKLWhhcyB0byBhbiBpbnN0YW5jaWFibGUgY2xhc3MgdmlhIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+LAotdGhlcmVmb3JlIGluIGNhc2Ugb2YgaW5uZXIgY2xhc3MgaGFzIHRvIGJlIDxlbT5zdGF0aWM8L2VtPi4gSXQgYWxzbyBoYXMgdG8KLWltcGxlbWVudCA8Y29kZT5qYXZhLnV0aWwuQ29tcGFyYXRvcjwvY29kZT4gaW50ZXJmYWNlLCBmb3IgZXhhbXBsZToKLTwvcD4KLQorPHA+VGhpcyBtYXkgYmUgdXNlZCBhcyBmb2xsb3dzOjwvcD4KIDxwcmU+Ci0gICAgICAgIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVyczsKLSAgICAgICAgLi4uKG9taXR0ZWQpCi0gICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEV2ZW5GaXJzdENtcCBpbXBsZW1lbnRzICZsdDtiJmd0O0NvbXBhcmF0b3ImbHQ7L2ImZ3Q7IHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgLi4uKG9taXR0ZWQpCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotPC9wcmU+CismbHQ7dHlwZWRlZiBuYW1lPSJjYXBpdGFsaXplIiBjbGFzc25hbWU9Im15LmN1c3RvbWFudC5DYXBpdGFsaXplIgorICAgICAgICAgY2xhc3NwYXRoPSJteS5jdXN0b21hbnQucGF0aCIvJmd0OworJmx0O2NvcHkgZmlsZT0iaW5wdXQiIHRvZmlsZT0ib3V0cHV0IiZndDsKKyAgJmx0O2ZpbHRlcmNoYWluJmd0OworICAgICZsdDt0b2tlbmZpbHRlciZndDsKKyAgICAgICZsdDtzdHJpbmd0b2tlbml6ZXIvJmd0OworICAgICAgJmx0O2NhcGl0YWxpemUvJmd0OworICAgICZsdDsvdG9rZW5maWx0ZXImZ3Q7CisgICZsdDsvZmlsdGVyY2hhaW4mZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLTxwPlRoZSBleGFtcGxlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG86PC9wPgotCi08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7Y29tcG9uZW50ZGVmIG5hbWU9ImV2ZW5maXJzdCIKLSAgICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMuRXZlbkZpcnN0Q21wJnF1b3Q7LyZndDsKLSAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7YnVpbGQmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7aW5wdXQmcXVvdDsgaW5jbHVkZXM9JnF1b3Q7Ki50eHQmcXVvdDsvJmd0OwotICAgICAgJmx0O2ZpbHRlcmNoYWluJmd0OwotICAgICAgICAgICZsdDtzb3J0ZmlsdGVyJmd0OwotICAgICAgICAgICAgICAmbHQ7ZXZlbmZpcnN0LyZndDsKLSAgICAgICAgICAmbHQ7L3NvcnRmaWx0ZXImZ3Q7Ci0gICAgICAmbHQ7L2ZpbHRlcmNoYWluJmd0OwotICAmbHQ7L2NvcHkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTwvYm9keT48L2h0bWw+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvZmlsdGVyc2V0Lmh0bWwgYi9tYW51YWwvVHlwZXMvZmlsdGVyc2V0Lmh0bWwKaW5kZXggOGIwZGZlMS4uYTZhMGViMSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL2ZpbHRlcnNldC5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9maWx0ZXJzZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE1NiArMTUsMTQyIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KLSAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RmlsdGVyU2V0IFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KLTxoMj48YSBuYW1lPSJmaWx0ZXJzZXQiPkZpbHRlclNldDwvYT48L2gyPgorPGgyIGlkPSJmaWx0ZXJzZXQiPkZpbHRlclNldDwvaDI+CiAKLTxwPkZpbHRlclNldHMgYXJlIGdyb3VwcyBvZiBmaWx0ZXJzLiBGaWx0ZXJzIGNhbiBiZSBkZWZpbmVkIGFzIHRva2VuLXZhbHVlCi1wYWlycyAKLW9yIGJlIHJlYWQgaW4gZnJvbSBhIGZpbGUuIEZpbHRlclNldHMgY2FuIGFwcGVhciBpbnNpZGUgdGFza3MgdGhhdCBzdXBwb3J0IHRoaXMgCi1mZWF0dXJlIG9yIGF0IHRoZSBzYW1lIGxldmVsIGFzIDxjb2RlPiZsdDt0YXJnZXQmZ3Q7PC9jb2RlPiAtIGkuZS4sIGFzCi1jaGlsZHJlbiBvZiAKLTxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uPC9wPgorPHA+RmlsdGVyU2V0cyBhcmUgZ3JvdXBzIG9mIGZpbHRlcnMuIEZpbHRlcnMgY2FuIGJlIGRlZmluZWQgYXMgdG9rZW4tdmFsdWUgcGFpcnMgb3IgYmUgcmVhZCBpbgorZnJvbSBhIGZpbGUuIEZpbHRlclNldHMgY2FuIGFwcGVhciBpbnNpZGUgdGFza3MgdGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBvciBhdCB0aGUgc2FtZSBsZXZlbAorYXMgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+Jm1kYXNoO2kuZS4sIGFzIGNoaWxkcmVuIG9mIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uPC9wPgogCi08cD5GaWx0ZXJTZXRzIHN1cHBvcnQgdGhlIDxjb2RlPmlkPC9jb2RlPiBhbmQgPGNvZGU+cmVmaWQ8L2NvZGU+Ci1hdHRyaWJ1dGVzLiAgWW91IGNhbiBkZWZpbmUgYSBGaWx0ZXJTZXQgd2l0aCBhbiA8Y29kZT5pZDwvY29kZT4KLWF0dHJpYnV0ZSBhbmQgdGhlbiByZWZlciB0byB0aGF0IGRlZmluaXRpb24gZnJvbSBhbm90aGVyIEZpbHRlclNldAotd2l0aCBhIDxjb2RlPnJlZmlkPC9jb2RlPiBhdHRyaWJ1dGUuICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG5lc3QKLWZpbHRlcnNldHMgaW50byBmaWx0ZXJzZXRzIHRvIGdldCBhIHNldCB1bmlvbiBvZiB0aGUgY29udGFpbmVkCi1maWx0ZXJzLjwvcD4KKzxwPkZpbHRlclNldHMgc3VwcG9ydCB0aGUgPHZhcj5pZDwvdmFyPiBhbmQgPHZhcj5yZWZpZDwvdmFyPiBhdHRyaWJ1dGVzLiAgWW91IGNhbiBkZWZpbmUgYQorRmlsdGVyU2V0IHdpdGggYW4gPHZhcj5pZDwvdmFyPiBhdHRyaWJ1dGUgYW5kIHRoZW4gcmVmZXIgdG8gdGhhdCBkZWZpbml0aW9uIGZyb20gYW5vdGhlcgorRmlsdGVyU2V0IHdpdGggYSA8dmFyPnJlZmlkPC92YXI+IGF0dHJpYnV0ZS4gIEl0IGlzIGFsc28gcG9zc2libGUgdG8gbmVzdCBmaWx0ZXJzZXRzIGludG8KK2ZpbHRlcnNldHMgdG8gZ2V0IGEgc2V0IHVuaW9uIG9mIHRoZSBjb250YWluZWQgZmlsdGVycy48L3A+CiAKLTxwPkluIGFkZGl0aW9uLCBGaWx0ZXJTZXRzIGNhbiBzcGVjaWZ5Ci08Y29kZT5iZWdpbnRva2VuPC9jb2RlPiBhbmQvb3IgCi08Y29kZT5lbmR0b2tlbjwvY29kZT4gYXR0cmlidXRlcyB0byBkZWZpbmUgd2hhdCB0byBtYXRjaC48L3A+Ci08cD5GaWx0ZXJzZXRzIGFyZSB1c2VkIGZvciBkb2luZyAKLXJlcGxhY2VtZW50cyBpbiB0YXNrcyBzdWNoIGFzIDxjb2RlPiZsdDtjb3B5Jmd0OzwvY29kZT4sIGV0Yy48L3A+Cis8cD5JbiBhZGRpdGlvbiwgRmlsdGVyU2V0cyBjYW4gc3BlY2lmeSA8dmFyPmJlZ2ludG9rZW48L3Zhcj4gYW5kL29yIDx2YXI+ZW5kdG9rZW48L3Zhcj4KK2F0dHJpYnV0ZXMgdG8gZGVmaW5lIHdoYXQgdG8gbWF0Y2guPC9wPgogCi08cD5GaWx0ZXJzIGNhbiBhbHNvIGJ5IHNwZWNpZmllZCBieSBvbmUgb3IgbW9yZSBuZXN0ZWQgcHJvcGVydHlzZXRzLCB0aGUKLSAgY29udGVudHMgb2Ygd2hpY2ggYXJlIGFwcGxpZWQgd2hlbiB0aGUgZmlsdGVyc2V0IGlzIGNyZWF0ZWQuPC9wPgorPHA+RmlsdGVyc2V0cyBhcmUgdXNlZCBmb3IgZG9pbmcgcmVwbGFjZW1lbnRzIGluIHRhc2tzIHN1Y2ggYXMgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiwKK2V0Yy48L3A+CiAKLTxwPklmIHlvdSBzcGVjaWZ5IG11bHRpcGxlIHZhbHVlcyBmb3IgdGhlIHNhbWUgdG9rZW4sIHRoZSBsYXN0IG9uZQotICBkZWZpbmVkIHdpdGhpbiBhIGZpbHRlcnNldCB3aWxsIGJlIHVzZWQuPC9wPgorPHA+RmlsdGVycyBjYW4gYWxzbyBieSBzcGVjaWZpZWQgYnkgb25lIG9yIG1vcmUgbmVzdGVkIHByb3BlcnR5c2V0cywgdGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZQorYXBwbGllZCB3aGVuIHRoZSBmaWx0ZXJzZXQgaXMgY3JlYXRlZC48L3A+CiAKLTxwPgotPHN0cm9uZz5Ob3RlOiA8L3N0cm9uZz5XaGVuIGEgZmlsdGVyc2V0IGlzIHVzZWQgaW4gYW4gb3BlcmF0aW9uLCB0aGUgZmlsZXMgYXJlIAotcHJvY2Vzc2VkIGluIHRleHQgbW9kZSBhbmQgdGhlIGZpbHRlcnMgYXBwbGllZCBsaW5lIGJ5IGxpbmUuIFRoaXMgbWVhbnMgdGhhdAotdGhlIGNvcHkgb3BlcmF0aW9ucyB3aWxsIHR5cGljYWxseSBjb3JydXB0IGJpbmFyeSBmaWxlcy4gV2hlbiBhcHBseWluZyBmaWx0ZXJzCi15b3Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBzZXQgb2YgZmlsZXMgYmVpbmcgZmlsdGVyZWQgYXJlIGFsbCB0ZXh0IGZpbGVzLgotPC9wPgorPHA+SWYgeW91IHNwZWNpZnkgbXVsdGlwbGUgdmFsdWVzIGZvciB0aGUgc2FtZSB0b2tlbiwgdGhlIGxhc3Qgb25lIGRlZmluZWQgd2l0aGluIGEgZmlsdGVyc2V0Cit3aWxsIGJlIHVzZWQuPC9wPgogCi08aDI+RmlsdGVyc2V0PC9oMj4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogV2hlbiBhIGZpbHRlcnNldCBpcyB1c2VkIGluIGFuIG9wZXJhdGlvbiwgdGhlIGZpbGVzIGFyZSBwcm9jZXNzZWQgaW4KK3RleHQgbW9kZSBhbmQgdGhlIGZpbHRlcnMgYXBwbGllZCBsaW5lIGJ5IGxpbmUuIFRoaXMgbWVhbnMgdGhhdCB0aGUgY29weSBvcGVyYXRpb25zIHdpbGwKK3R5cGljYWxseSBjb3JydXB0IGJpbmFyeSBmaWxlcy4gV2hlbiBhcHBseWluZyBmaWx0ZXJzIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIHNldCBvZiBmaWxlcworYmVpbmcgZmlsdGVyZWQgYXJlIGFsbCB0ZXh0IGZpbGVzLjwvcD4KIAotPHRhYmxlIGNlbGxTcGFjaW5nPTAgY2VsbFBhZGRpbmc9MiBib3JkZXI9MT4KKzxoMz5GaWx0ZXJzZXQ8L2gzPgorCis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48Yj5EZWZhdWx0PC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZWZhdWx0PC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+YmVnaW50b2tlbjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+VGhlIHN0cmluZyBtYXJraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSB0b2tlbiAoZWcuLAotICAgICAgPGNvZGU+JiM2NDtEQVRFJiM2NDs8L2NvZGU+KS48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPkA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YmVnaW50b2tlbjwvdGQ+CisgICAgPHRkPlRoZSBzdHJpbmcgbWFya2luZyB0aGUgYmVnaW5uaW5nIG9mIGEgdG9rZW4gKGVnLiwgPHNhbXA+QERBVEVAPC9zYW1wPikuPC90ZD4KKyAgICA8dGQ+PHE+QDwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5lbmR0b2tlbjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+VGhlIHN0cmluZyBtYXJraW5nIHRoZSBlbmQgb2YgYSB0b2tlbiAoZWcuLAotICAgICAgPGNvZGU+JiM2NDtEQVRFJiM2NDs8L2NvZGU+KS48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPkA8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+ZW5kdG9rZW48L3RkPgorICAgIDx0ZD5UaGUgc3RyaW5nIG1hcmtpbmcgdGhlIGVuZCBvZiBhIHRva2VuIChlZy4sIDxzYW1wPkBEQVRFQDwvc2FtcD4pLjwvdGQ+CisgICAgPHRkPjxxPkA8L3E+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+ZmlsdGVyc2ZpbGU8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPlNwZWNpZnkgYSBzaW5nbGUgZmlsdGVyc2ZpbGUuPC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcD48aT5ub25lPC9pPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5maWx0ZXJzZmlsZTwvdGQ+CisgICAgPHRkPlNwZWNpZnkgYSBzaW5nbGUgZmlsdGVyc2ZpbGUuPC90ZD4KKyAgICA8dGQ+PGVtPm5vbmU8L2VtPjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPnJlY3Vyc2U8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPkluZGljYXRlcyB3aGV0aGVyIHRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIHRva2VucwotICAgICAgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBtb3JlIHRva2Vucy4gPGI+U2luY2UgQW50IDEuNi4zPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGk+dHJ1ZTwvaT48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+cmVjdXJzZTwvdGQ+CisgICAgPHRkPkluZGljYXRlcyB3aGV0aGVyIHRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIHRva2VucyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIG1vcmUKKyAgICAgIHRva2Vucy4gPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+PC90ZD4KKyAgICA8dGQ+PHE+dHJ1ZTwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD5vbm1pc3NpbmdmaWx0ZXJzZmlsZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+SW5kaWNhdGUgYmVoYXZpb3Igd2hlbiBhIG5vbmV4aXN0ZW50IDxpPmZpbHRlcnNmaWxlPC9pPgotICAgICAgaXMgc3BlY2lmaWVkLiAgT25lIG9mICJmYWlsIiwgIndhcm4iLCAiaWdub3JlIi4gPGI+U2luY2UgQW50IDEuNzwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPiJmYWlsIjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5vbm1pc3NpbmdmaWx0ZXJzZmlsZTwvdGQ+CisgICAgPHRkPkluZGljYXRlIGJlaGF2aW9yIHdoZW4gYSBub25leGlzdGVudCA8dmFyPmZpbHRlcnNmaWxlPC92YXI+IGlzIHNwZWNpZmllZC4gIE9uZQorICAgICAgb2YgPHE+ZmFpbDwvcT4sIDxxPndhcm48L3E+LCA8cT5pZ25vcmU8L3E+LiA8ZW0+U2luY2UgQW50IDEuNzwvZW0+PC90ZD4KKyAgICA8dGQ+PHE+ZmFpbDwvcT48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDI+RmlsdGVyPC9oMj4KLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8aDM+RmlsdGVyPC9oMz4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD50b2tlbjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+VGhlIHRva2VuIHRvIHJlcGxhY2UgKGVnLiwgPGNvZGU+JiM2NDtEQVRFJiM2NDs8L2NvZGU+KTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3AgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+dG9rZW48L3RkPgorICAgIDx0ZD5UaGUgdG9rZW4gdG8gcmVwbGFjZSAoZWcuLCA8c2FtcD5AREFURUA8L3NhbXA+KTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdkFsaWduPXRvcD52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+VGhlIHZhbHVlIHRvIHJlcGxhY2UgaXQgd2l0aAotICAgICAoZWcuLCA8Y29kZT5UaHVyc2RheSwgQXByaWwgMjYsIDIwMDE8L2NvZGU+KS48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+VGhlIHZhbHVlIHRvIHJlcGxhY2UgaXQgd2l0aCAoZWcuLCA8cT5UaHVyc2RheSwgQXByaWwgMjYsIDIwMDE8L3E+KS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGgyPkZpbHRlcnNmaWxlPC9oMj4KLTx0YWJsZSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTIgYm9yZGVyPTE+Cis8aDM+RmlsdGVyc2ZpbGU8L2gzPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZBbGlnbj10b3A+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgdkFsaWduPXRvcCBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2QWxpZ249dG9wPmZpbGU8L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wPkEgcHJvcGVydGllcyBmaWxlIG9mIAotICAgICAgbmFtZS12YWx1ZSBwYWlycyBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHRva2Vucy48L3RkPgotICAgIDx0ZCB2QWxpZ249dG9wIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5BIHByb3BlcnRpZXMgZmlsZSBvZiBuYW1lLXZhbHVlIHBhaXJzIGZyb20gd2hpY2ggdG8gbG9hZCB0aGUgdG9rZW5zLjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDQ+RXhhbXBsZXM8L2g0PgogCi08cD5Zb3UgYXJlIGNvcHlpbmcgdGhlIDxjb2RlPnZlcnNpb24udHh0PC9jb2RlPiBmaWxlIHRvIHRoZSA8Y29kZT5kaXN0PC9jb2RlPgotZGlyZWN0b3J5IGZyb20gdGhlIDxjb2RlPmJ1aWxkPC9jb2RlPiBkaXJlY3RvcnkgCi1idXQgd2lzaCB0byByZXBsYWNlIHRoZSB0b2tlbiA8Y29kZT4mIzY0O0RBVEUmIzY0OzwvY29kZT4gd2l0aCB0b2RheSdzIGRhdGUuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPllvdSBhcmUgY29weWluZyB0aGUgPHNhbXA+dmVyc2lvbi50eHQ8L3NhbXA+IGZpbGUgdG8gdGhlIDxzYW1wPmRpc3Q8L3NhbXA+IGRpcmVjdG9yeSBmcm9tCit0aGUgPHNhbXA+YnVpbGQ8L3NhbXA+IGRpcmVjdG9yeSBidXQgd2lzaCB0byByZXBsYWNlIHRoZSB0b2tlbiA8c2FtcD5AREFURUA8L3NhbXA+IHdpdGggdG9kYXkncworZGF0ZS48L3A+Cis8cHJlPgogJmx0O2NvcHkgZmlsZT0mcXVvdDske2J1aWxkLmRpcn0vdmVyc2lvbi50eHQmcXVvdDsgdG9GaWxlPSZxdW90OyR7ZGlzdC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyc2V0Jmd0OwogICAgICZsdDtmaWx0ZXIgdG9rZW49JnF1b3Q7REFURSZxdW90OyB2YWx1ZT0mcXVvdDske1RPREFZfSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyc2V0Jmd0OwogJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPC9wcmU+CiAKLTxwPllvdSBhcmUgY29weWluZyB0aGUgPGNvZGU+dmVyc2lvbi50eHQ8L2NvZGU+IGZpbGUgdG8gdGhlIDxjb2RlPmRpc3Q8L2NvZGU+Ci1kaXJlY3RvcnkgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IAotYnV0IHdpc2ggdG8gcmVwbGFjZSB0aGUgdG9rZW4gPGNvZGU+JURBVEUqPC9jb2RlPiB3aXRoIHRvZGF5J3MgZGF0ZS48L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHA+WW91IGFyZSBjb3B5aW5nIHRoZSA8c2FtcD52ZXJzaW9uLnR4dDwvc2FtcD4gZmlsZSB0byB0aGUgPHNhbXA+ZGlzdDwvc2FtcD4gZGlyZWN0b3J5IGZyb20gdGhlCitidWlsZCBkaXJlY3RvcnkgYnV0IHdpc2ggdG8gcmVwbGFjZSB0aGUgdG9rZW4gPHNhbXA+JURBVEUqPC9zYW1wPiB3aXRoIHRvZGF5J3MgZGF0ZS48L3A+Cis8cHJlPgogJmx0O2NvcHkgZmlsZT0mcXVvdDske2J1aWxkLmRpcn0vdmVyc2lvbi50eHQmcXVvdDsgdG9GaWxlPSZxdW90OyR7ZGlzdC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyc2V0IGJlZ2ludG9rZW49JnF1b3Q7JSZxdW90OyBlbmR0b2tlbj0mcXVvdDsqJnF1b3Q7Jmd0OwogICAgICZsdDtmaWx0ZXIgdG9rZW49JnF1b3Q7REFURSZxdW90OyB2YWx1ZT0mcXVvdDske1RPREFZfSZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyc2V0Jmd0OwogJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPC9wcmU+CiAKIDxwPkNvcHkgYWxsIHRoZSBkb2NzIGJ1dCBjaGFuZ2UgYWxsIGRhdGVzIGFuZCBhcHByb3ByaWF0ZSBub3RpY2VzIGFzIHN0b3JlZCBpbiBhIGZpbGUuPC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7Y29weSB0b0Rpcj0mcXVvdDske2Rpc3QuZGlyfS9kb2NzJnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtidWlsZC5kaXJ9L2RvY3MmcXVvdDsmZ3Q7CiAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmh0bWwmcXVvdDsmZ3Q7CkBAIC0xNzIsMTAgKzE1OSwxMCBAQAogICAgICZsdDtmaWx0ZXJzZmlsZSBmaWxlPSZxdW90OyR7dXNlci5kaXJ9L2Rpc3QucHJvcGVydGllcyZxdW90Oy8mZ3Q7CiAgICZsdDsvZmlsdGVyc2V0Jmd0OwogJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPC9wcmU+CiAKIDxwPkRlZmluZSBhIEZpbHRlclNldCBhbmQgcmVmZXJlbmNlIGl0IGxhdGVyLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O2ZpbHRlcnNldCBpZD0mcXVvdDtteUZpbHRlclNldCZxdW90OyBiZWdpbnRva2VuPSZxdW90OyUmcXVvdDsgZW5kdG9rZW49JnF1b3Q7KiZxdW90OyZndDsKICAgJmx0O2ZpbHRlciB0b2tlbj0mcXVvdDtEQVRFJnF1b3Q7IHZhbHVlPSZxdW90OyR7VE9EQVl9JnF1b3Q7LyZndDsKICZsdDsvZmlsdGVyc2V0Jmd0OwpAQCAtMTgzLDEyICsxNzAsMTIgQEAKICZsdDtjb3B5IGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7IHRvRmlsZT0mcXVvdDske2Rpc3QuZGlyfS92ZXJzaW9uLnR4dCZxdW90OyZndDsKICAgJmx0O2ZpbHRlcnNldCByZWZpZD0mcXVvdDtteUZpbHRlclNldCZxdW90Oy8mZ3Q7CiAmbHQ7L2NvcHkmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8L3ByZT4KIAotPHA+WW91IGFyZSBjb3B5aW5nIHRoZSA8Y29kZT52ZXJzaW9uLnR4dDwvY29kZT4gZmlsZSB0byB0aGUgPGNvZGU+ZGlzdDwvY29kZT4KLWRpcmVjdG9yeSBmcm9tIHRoZSA8Y29kZT5idWlsZDwvY29kZT4gZGlyZWN0b3J5IAotYnV0IHdpc2ggdG8gcmVwbGFjZSB0aGUgdG9rZW4gPGNvZGU+JiM2NDtwcm9qZWN0LmRhdGUmIzY0OzwvY29kZT4gd2l0aCB0aGUgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS48L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHA+WW91IGFyZSBjb3B5aW5nIHRoZSA8c2FtcD52ZXJzaW9uLnR4dDwvc2FtcD4gZmlsZSB0byB0aGUgPHNhbXA+ZGlzdDwvc2FtcD4gZGlyZWN0b3J5IGZyb20KK3RoZSA8c2FtcD5idWlsZDwvc2FtcD4gZGlyZWN0b3J5IGJ1dCB3aXNoIHRvIHJlcGxhY2UgdGhlIHRva2VuIDxzYW1wPkBwcm9qZWN0LmRhdGVAPC9zYW1wPiB3aXRoCit0aGUgcHJvcGVydHkgb2YgdGhlIHNhbWUgbmFtZS48L3A+Cis8cHJlPgogJmx0O2NvcHkgZmlsZT0mcXVvdDske2J1aWxkLmRpcn0vdmVyc2lvbi50eHQmcXVvdDsgdG9GaWxlPSZxdW90OyR7ZGlzdC5kaXJ9L3ZlcnNpb24udHh0JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsdGVyc2V0Jmd0OwogICAgICZsdDtwcm9wZXJ0eXNldCZndDsKQEAgLTE5Niw1ICsxODMsNiBAQAogICAgICZsdDsvcHJvcGVydHlzZXQmZ3Q7CiAgICZsdDsvZmlsdGVyc2V0Jmd0OwogJmx0Oy9jb3B5Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPC9ib2R5PjwvaHRtbD4KKzwvcHJlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL21hcHBlci5odG1sIGIvbWFudWFsL1R5cGVzL21hcHBlci5odG1sCmluZGV4IGRhMzE4MWMuLjdhOTc2MmIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9tYXBwZXIuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvbWFwcGVyLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMzQgKzE1LDEyMiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+TWFwcGVyIFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9Im1hcHBlciI+TWFwcGluZyBGaWxlIE5hbWVzPC9hPjwvaDI+Ci08cD5Tb21lIHRhc2tzIHRha2Ugc291cmNlIGZpbGVzIGFuZCBjcmVhdGUgdGFyZ2V0IGZpbGVzLiBEZXBlbmRpbmcgb24KLXRoZSB0YXNrLCBpdCBtYXkgYmUgcXVpdGUgb2J2aW91cyB3aGljaCBuYW1lIGEgdGFyZ2V0IGZpbGUgd2lsbCBoYXZlCi0odXNpbmcgPGEgaHJlZj0iLi4vVGFza3MvamF2YWMuaHRtbCI+amF2YWM8L2E+LCB5b3Uga25vdyB0aGVyZSB3aWxsIGJlCi08Y29kZT4uY2xhc3M8L2NvZGU+IGZpbGVzIGZvciB5b3VyIDxjb2RlPi5qYXZhPC9jb2RlPiBmaWxlcykgLSBpbgotb3RoZXIgY2FzZXMgeW91IG1heSB3YW50IHRvIHNwZWNpZnkgdGhlIHRhcmdldCBmaWxlcywgZWl0aGVyIHRvIGhlbHAKLUFwYWNoZSBBbnQgb3IgdG8gZ2V0IGFuIGV4dHJhIGJpdCBvZiBmdW5jdGlvbmFsaXR5LjwvcD4KLTxwPldoaWxlIHNvdXJjZSBmaWxlcyBhcmUgdXN1YWxseSBzcGVjaWZpZWQgYXMgPGEKLWhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT5zLCB5b3UgZG9uJ3Qgc3BlY2lmeSB0YXJnZXQgZmlsZXMgZGlyZWN0bHkgLQotaW5zdGVhZCwgeW91IHRlbGwgQW50IGhvdyB0byBmaW5kIHRoZSB0YXJnZXQgZmlsZShzKSBmb3Igb25lIHNvdXJjZSBmaWxlLiBBbgotaW5zdGFuY2Ugb2YgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjwvY29kZT4gaXMKLXJlc3BvbnNpYmxlIGZvciB0aGlzLiBJdCBjb25zdHJ1Y3RzIHRhcmdldCBmaWxlIG5hbWVzIGJhc2VkIG9uIHJ1bGVzCi10aGF0IGNhbiBiZSBwYXJhbWV0ZXJpemVkIHdpdGggPGNvZGU+ZnJvbTwvY29kZT4gYW5kIDxjb2RlPnRvPC9jb2RlPgotYXR0cmlidXRlcyAtIHRoZSBleGFjdCBtZWFuaW5nIG9mIHdoaWNoIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC48L3A+Ci08cD5UaGVzZSBpbnN0YW5jZXMgYXJlIGRlZmluZWQgaW4gPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnRzCi13aXRoIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczo8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGgyIGlkPSJtYXBwZXIiPk1hcHBpbmcgRmlsZSBOYW1lczwvaDI+Cis8cD5Tb21lIHRhc2tzIHRha2Ugc291cmNlIGZpbGVzIGFuZCBjcmVhdGUgdGFyZ2V0IGZpbGVzLiBEZXBlbmRpbmcgb24gdGhlIHRhc2ssIGl0IG1heSBiZSBxdWl0ZQorb2J2aW91cyB3aGljaCBuYW1lIGEgdGFyZ2V0IGZpbGUgd2lsbCBoYXZlICh1c2luZyA8YSBocmVmPSIuLi9UYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4sIHlvdSBrbm93Cit0aGVyZSB3aWxsIGJlIDxzYW1wPi5jbGFzczwvc2FtcD4gZmlsZXMgZm9yIHlvdXIgPHNhbXA+LmphdmE8L3NhbXA+IGZpbGVzKSZtZGFzaDtpbiBvdGhlciBjYXNlcyB5b3UKK21heSB3YW50IHRvIHNwZWNpZnkgdGhlIHRhcmdldCBmaWxlcywgZWl0aGVyIHRvIGhlbHAgQXBhY2hlIEFudCBvciB0byBnZXQgYW4gZXh0cmEgYml0IG9mCitmdW5jdGlvbmFsaXR5LjwvcD4KKzxwPldoaWxlIHNvdXJjZSBmaWxlcyBhcmUgdXN1YWxseSBzcGVjaWZpZWQgYXMgPGEgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPnMsIHlvdSBkb24ndAorc3BlY2lmeSB0YXJnZXQgZmlsZXMgZGlyZWN0bHkmbWRhc2g7aW5zdGVhZCwgeW91IHRlbGwgQW50IGhvdyB0byBmaW5kIHRoZSB0YXJnZXQgZmlsZShzKSBmb3Igb25lCitzb3VyY2UgZmlsZS4gQW4gaW5zdGFuY2Ugb2YgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI8L2NvZGU+IGlzCityZXNwb25zaWJsZSBmb3IgdGhpcy4gSXQgY29uc3RydWN0cyB0YXJnZXQgZmlsZSBuYW1lcyBiYXNlZCBvbiBydWxlcyB0aGF0IGNhbiBiZSBwYXJhbWV0ZXJpemVkCit3aXRoIDx2YXI+ZnJvbTwvdmFyPiBhbmQgPHZhcj50bzwvdmFyPiBhdHRyaWJ1dGVzJm1kYXNoO3RoZSBleGFjdCBtZWFuaW5nIG9mIHdoaWNoIGlzCitpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuPC9wPgorPHA+VGhlc2UgaW5zdGFuY2VzIGFyZSBkZWZpbmVkIGluIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcKK2F0dHJpYnV0ZXM6PC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWVzIG9uZSBvZiB0aGUgYnVpbHQtaW4gaW1wbGVtZW50YXRpb25zLjwvdGQ+Ci0gICAgPHRkIHJvd3NwYW49IjIiIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5zcGVjaWZpZXMgb25lIG9mIHRoZSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbnMuPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc25hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c3BlY2lmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBieSBjbGFzcyBuYW1lLjwvdGQ+CisgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5zcGVjaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIGJ5IGNsYXNzIG5hbWUuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cAorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD50aGUgY2xhc3NwYXRoIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAKICAgICAgIDxjb2RlPmNsYXNzbmFtZTwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIDxhCi0gICAgICBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYQorICAgICAgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZyb208L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxjb2RlPmZyb208L2NvZGU+IGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuCi0gICAgICBpbXBsZW1lbnRhdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+RGVwZW5kcyBvbiBpbXBsZW1lbnRhdGlvbi48L3RkPgorICAgIDx0ZD5mcm9tPC90ZD4KKyAgICA8dGQ+dGhlIDxjb2RlPmZyb208L2NvZGU+IGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGltcGxlbWVudGF0aW9uLjwvdGQ+CisgICAgPHRkPkRlcGVuZHMgb24gaW1wbGVtZW50YXRpb248L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50bzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgPGNvZGU+dG88L2NvZGU+IGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuCi0gICAgICBpbXBsZW1lbnRhdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+RGVwZW5kcyBvbiBpbXBsZW1lbnRhdGlvbi48L3RkPgorICAgIDx0ZD50bzwvdGQ+CisgICAgPHRkPnRoZSA8Y29kZT50bzwvY29kZT4gYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gaW1wbGVtZW50YXRpb24uPC90ZD4KKyAgICA8dGQ+RGVwZW5kcyBvbiBpbXBsZW1lbnRhdGlvbjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+Tm90ZSB0aGF0IEFudCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGNvbnZlcnQgLyBvciBcIGNoYXJhY3RlcnMgaW4KLXRoZSA8Y29kZT50bzwvY29kZT4gYW5kIDxjb2RlPmZyb208L2NvZGU+IGF0dHJpYnV0ZXMgdG8gdGhlIGNvcnJlY3QKLWRpcmVjdG9yeSBzZXBhcmF0b3Igb2YgeW91ciBjdXJyZW50IHBsYXRmb3JtLiAgSWYgeW91IG5lZWQgdG8gc3BlY2lmeQotdGhpcyBzZXBhcmF0b3IsIHVzZSA8Y29kZT4ke2ZpbGUuc2VwYXJhdG9yfTwvY29kZT4gaW5zdGVhZC4KLSAgRm9yIHRoZSByZWdleHBtYXBwZXIsIDxjb2RlPiR7ZmlsZS5zZXBhcmF0b3J9PC9jb2RlPiB3aWxsIG5vdCB3b3JrLAotYXMgb24gd2luZG93cyBpdCBpcyB0aGUgJ1wnIGNoYXJhY3RlciwgYW5kIHRoaXMgaXMgYW4gZXNjYXBlIGNoYXJhY3RlcgotZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIG9uZSBzaG91bGQgdXNlIHRoZSA8Y29kZT5oYW5kbGVkaXJzZXA8L2NvZGU+IGF0dHJpYnV0ZQotaW5zdGVhZC4KKzxwPk5vdGUgdGhhdCBBbnQgd2lsbCBub3QgYXV0b21hdGljYWxseSBjb252ZXJ0IDxxPi88L3E+IG9yIDxxPlw8L3E+IGNoYXJhY3RlcnMgaW4gdGhlIDx2YXI+dG88L3Zhcj4KK2FuZCA8dmFyPmZyb208L3Zhcj4gYXR0cmlidXRlcyB0byB0aGUgY29ycmVjdCBkaXJlY3Rvcnkgc2VwYXJhdG9yIG9mIHlvdXIgY3VycmVudCBwbGF0Zm9ybS4gIElmIHlvdQorbmVlZCB0byBzcGVjaWZ5IHRoaXMgc2VwYXJhdG9yLCB1c2UgPGNvZGU+JHtmaWxlLnNlcGFyYXRvcn08L2NvZGU+IGluc3RlYWQuICBGb3IgdGhlIHJlZ2V4cAorbWFwcGVyLCA8Y29kZT4ke2ZpbGUuc2VwYXJhdG9yfTwvY29kZT4gd2lsbCBub3Qgd29yaywgYXMgb24gV2luZG93cyBpdCBpcyB0aGUgPHE+XDwvcT4gY2hhcmFjdGVyLAorYW5kIHRoaXMgaXMgYW4gZXNjYXBlIGNoYXJhY3RlciBmb3IgcmVndWxhciBleHByZXNzaW9ucywgb25lIHNob3VsZCB1c2UKK3RoZSA8Y29kZT5oYW5kbGVkaXJzZXA8L2NvZGU+IGF0dHJpYnV0ZSBpbnN0ZWFkLgogPC9wPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+Ci08cD5UaGUgY2xhc3NwYXRoIGNhbiBiZSBzcGVjaWZpZWQgdmlhIGEgbmVzdGVkCi08Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4sIGFzIHdlbGwgLSB0aGF0IGlzLAotYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGg8L2E+LWxpa2Ugc3RydWN0dXJlLjwvcD4KLTxwPjxiPlNpbmNlIEFudCAxLjcuMCw8L2I+IG5lc3RlZCBGaWxlIE1hcHBlcnMgY2FuCi1iZSBzdXBwbGllZCB2aWEgZWl0aGVyIDxDT0RFPiZsdDttYXBwZXImZ3Q7PC9DT0RFPiBlbGVtZW50cyBvcgotPGEgaHJlZj0iLi4vVGFza3MvdHlwZWRlZi5odG1sIj48Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+PC9hPidkCi1pbXBsZW1lbnRhdGlvbnMgb2YgPENPREU+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjwvQ09ERT4uCi1JZiBuZXN0ZWQgRmlsZSBNYXBwZXJzIGFyZSBzcGVjaWZpZWQgYnkgZWl0aGVyIG1lYW5zLCB0aGUgbWFwcGVyIHdpbGwgYmUKLWltcGxpY2l0bHkgY29uZmlndXJlZCBhcyBhIDxhIGhyZWY9IiNjb21wb3NpdGUtbWFwcGVyIj5jb21wb3NpdGUgbWFwcGVyPC9hPi4KLTwvcD4KLTxocj4KLTxoMz5UaGUgYnVpbHQtaW4gbWFwcGVyIHR5cGVzIGFyZTo8L2gzPgorPHA+VGhlIGNsYXNzcGF0aCBjYW4gYmUgc3BlY2lmaWVkIHZpYSBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4sIGFzIHdlbGwmbWRhc2g7dGhhdAoraXMsIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlIHN0cnVjdHVyZS48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNy4wPC9lbT4sIG5lc3RlZCBGaWxlIE1hcHBlcnMgY2FuIGJlIHN1cHBsaWVkIHZpYQorZWl0aGVyIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50cworb3IgPGEgaHJlZj0iLi4vVGFza3MvdHlwZWRlZi5odG1sIj48Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+PC9hPidkIGltcGxlbWVudGF0aW9ucworb2YgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI8L2NvZGU+LiAgSWYgbmVzdGVkIEZpbGUgTWFwcGVycyBhcmUKK3NwZWNpZmllZCBieSBlaXRoZXIgbWVhbnMsIHRoZSBtYXBwZXIgd2lsbCBiZSBpbXBsaWNpdGx5IGNvbmZpZ3VyZWQgYXMKK2EgPGEgaHJlZj0iI2NvbXBvc2l0ZS1tYXBwZXIiPmNvbXBvc2l0ZSBtYXBwZXI8L2E+LjwvcD4KKzxoMz5UaGUgYnVpbHQtaW4gbWFwcGVyIHR5cGVzPC9oMz4KIDxwPkFsbCBidWlsdC1pbiBtYXBwZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZS48L3A+Ci08cD48Yj5BcyBvZiBBbnQgMS43LjAsPC9iPiBlYWNoIG9mIHRoZSBidWlsdC1pbiBtYXBwZXIgaW1wbGVtZW50YXRpb24KLSAgdHlwZXMgaXMgZGlyZWN0bHkgYWNjZXNzaWJsZSB1c2luZyBhIHNwZWNpZmljIHRhZ25hbWUuIFRoaXMgbWFrZXMgaXQKLSAgcG9zc2libGUgZm9yIGZpbGVuYW1lIG1hcHBlcnMgdG8gc3VwcG9ydCBhdHRyaWJ1dGVzIGluIGFkZGl0aW9uIHRvCi0gIHRoZSBnZW5lcmFsbHkgYXZhaWxhYmxlIDxpPnRvPC9pPiBhbmQgPGk+ZnJvbTwvaT4uPGJyPgotICBUaGUgPGNvZGU+Jmx0O21hcHBlciB0eXBlfGNsYXNzbmFtZT0mcXVvdDsuLi4mcXVvdDsmZ3Q7PC9jb2RlPiB1c2FnZQotICBmb3JtIHJlbWFpbnMgdmFsaWQgZm9yIHJlYXNvbnMgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eS48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuNy4wPC9lbT4sIGVhY2ggb2YgdGhlIGJ1aWx0LWluIG1hcHBlciBpbXBsZW1lbnRhdGlvbiB0eXBlcyBpcyBkaXJlY3RseSBhY2Nlc3NpYmxlCit1c2luZyBhIHNwZWNpZmljIHRhZ25hbWUuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgZm9yIGZpbGVuYW1lIG1hcHBlcnMgdG8gc3VwcG9ydCBhdHRyaWJ1dGVzIGluCithZGRpdGlvbiB0byB0aGUgZ2VuZXJhbGx5IGF2YWlsYWJsZSA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4uPGJyLz4KK1RoZSA8Y29kZT4mbHQ7bWFwcGVyIDx2YXI+dHlwZTwvdmFyPnw8dmFyPmNsYXNzbmFtZTwvdmFyPj0mcXVvdDsuLi4mcXVvdDsmZ3Q7PC9jb2RlPiB1c2FnZSBmb3JtCityZW1haW5zIHZhbGlkIGZvciByZWFzb25zIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuPC9wPgogCiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KICAgICA8IS0tICAgICAgICAgICAgIElkZW50aXR5IE1hcHBlciAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAKLTxoND48YSBuYW1lPSJpZGVudGl0eS1tYXBwZXIiPmlkZW50aXR5PC9hPjwvaDQ+Ci08cD5UaGUgdGFyZ2V0IGZpbGUgbmFtZSBpcyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBmaWxlIG5hbWUuIEJvdGgKLTxjb2RlPnRvPC9jb2RlPiBhbmQgPGNvZGU+ZnJvbTwvY29kZT4gd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9ImlkZW50aXR5LW1hcHBlciI+aWRlbnRpdHk8L2g0PgorPHA+VGhlIHRhcmdldCBmaWxlIG5hbWUgaXMgaWRlbnRpY2FsIHRvIHRoZSBzb3VyY2UgZmlsZSBuYW1lLiBCb3RoIDx2YXI+dG88L3Zhcj4gYW5kIDx2YXI+ZnJvbTwvdmFyPgord2lsbCBiZSBpZ25vcmVkLjwvcD4KKzxoNT5FeGFtcGxlczwvaDU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSZxdW90O2lkZW50aXR5JnF1b3Q7LyZndDsKLSZsdDtpZGVudGl0eW1hcHBlci8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorJmx0O2lkZW50aXR5bWFwcGVyLyZndDs8L3ByZT4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZTwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC0xNDksMzUgKzEzOCwzMyBAQAogICAgIDwhLS0gICAgICAgICAgICAgRmxhdHRlbiBNYXBwZXIgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIAotPGg0PjxhIG5hbWU9ImZsYXR0ZW4tbWFwcGVyIj5mbGF0dGVuPC9hPjwvaDQ+Ci08cD5UaGUgdGFyZ2V0IGZpbGUgbmFtZSBpcyBpZGVudGljYWwgdG8gdGhlIHNvdXJjZSBmaWxlIG5hbWUsIHdpdGggYWxsCi1sZWFkaW5nIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBzdHJpcHBlZCBvZmYuIEJvdGggPGNvZGU+dG88L2NvZGU+IGFuZAotPGNvZGU+ZnJvbTwvY29kZT4gd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9ImZsYXR0ZW4tbWFwcGVyIj5mbGF0dGVuPC9oND4KKzxwPlRoZSB0YXJnZXQgZmlsZSBuYW1lIGlzIGlkZW50aWNhbCB0byB0aGUgc291cmNlIGZpbGUgbmFtZSwgd2l0aCBhbGwgbGVhZGluZyBkaXJlY3RvcnkgaW5mb3JtYXRpb24KK3N0cmlwcGVkIG9mZi4gQm90aCA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4gd2lsbCBiZSBpZ25vcmVkLjwvcD4KKzxoNT5FeGFtcGxlczwvaDU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSZxdW90O2ZsYXR0ZW4mcXVvdDsvJmd0OwotJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDtmbGF0dGVubWFwcGVyLyZndDs8L3ByZT4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZTwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkIuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5CLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkEucHJvcGVydGllczwvY29kZT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIApAQCAtMTg1LDM0ICsxNzIsMzMgQEAKICAgICA8IS0tICAgICAgICAgICAgIE1lcmdlIE1hcHBlciAgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAKLTxoND48YSBuYW1lPSJtZXJnZS1tYXBwZXIiPm1lcmdlPC9hPjwvaDQ+Ci08cD5UaGUgdGFyZ2V0IGZpbGUgbmFtZSB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSwgYXMgZGVmaW5lZCBieQotPGNvZGU+dG88L2NvZGU+IC0gPGNvZGU+ZnJvbTwvY29kZT4gd2lsbCBiZSBpZ25vcmVkLjwvcD4KLTxoNT5FeGFtcGxlczo8L2g1PgotPGJsb2NrcXVvdGU+PHByZT4KKzxoNCBpZD0ibWVyZ2UtbWFwcGVyIj5tZXJnZTwvaDQ+Cis8cD5UaGUgdGFyZ2V0IGZpbGUgbmFtZSB3aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSwgYXMgZGVmaW5lZCBieSA8dmFyPnRvPC92YXI+Jm1kYXNoOzx2YXI+ZnJvbTwvdmFyPgord2lsbCBiZSBpZ25vcmVkLjwvcD4KKzxoNT5FeGFtcGxlczwvaDU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSZxdW90O21lcmdlJnF1b3Q7IHRvPSZxdW90O2FyY2hpdmUudGFyJnF1b3Q7LyZndDsKLSZsdDttZXJnZW1hcHBlciB0bz0mcXVvdDthcmNoaXZlLnRhciZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorJmx0O21lcmdlbWFwcGVyIHRvPSZxdW90O2FyY2hpdmUudGFyJnF1b3Q7LyZndDs8L3ByZT4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZTwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+YXJjaGl2ZS50YXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+QS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmFyY2hpdmUudGFyPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5hcmNoaXZlLnRhcjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5hcmNoaXZlLnRhcjwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmFyY2hpdmUudGFyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5hcmNoaXZlLnRhcjwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+YXJjaGl2ZS50YXI8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+YXJjaGl2ZS50YXI8L2NvZGU+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKQEAgLTIyMCwzODQgKzIwNiwzMzIgQEAKICAgICA8IS0tICAgICAgICAgICAgICBHbG9iIE1hcHBlciAgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAKLTxoND48YSBuYW1lPSJnbG9iLW1hcHBlciI+Z2xvYjwvYT48L2g0PgotPHA+Qm90aCA8Y29kZT50bzwvY29kZT4gYW5kIDxjb2RlPmZyb208L2NvZGU+IGFyZSByZXF1aXJlZCBhbmQgZGVmaW5lIHBhdHRlcm5zIHRoYXQgbWF5Ci1jb250YWluIGF0IG1vc3Qgb25lIDxjb2RlPio8L2NvZGU+LiBGb3IgZWFjaCBzb3VyY2UgZmlsZSB0aGF0IG1hdGNoZXMKLXRoZSA8Y29kZT5mcm9tPC9jb2RlPiBwYXR0ZXJuLCBhIHRhcmdldCBmaWxlIG5hbWUgd2lsbCBiZSBjb25zdHJ1Y3RlZAotZnJvbSB0aGUgPGNvZGU+dG88L2NvZGU+IHBhdHRlcm4gYnkgc3Vic3RpdHV0aW5nIHRoZSA8Y29kZT4qPC9jb2RlPiBpbgotdGhlIDxjb2RlPnRvPC9jb2RlPiBwYXR0ZXJuIHdpdGggdGhlIHRleHQgdGhhdCBtYXRjaGVzIHRoZQotPGNvZGU+KjwvY29kZT4gaW4gdGhlIDxjb2RlPmZyb208L2NvZGU+IHBhdHRlcm4uIFNvdXJjZSBmaWxlIG5hbWVzCi10aGF0IGRvbid0IG1hdGNoIHRoZSA8Y29kZT5mcm9tPC9jb2RlPiBwYXR0ZXJuIHdpbGwgYmUgaWdub3JlZC48L3A+Ci08Yj5FeGFtcGxlczo8L2I+Ci08YmxvY2txdW90ZT48cHJlPgorPGg0IGlkPSJnbG9iLW1hcHBlciI+Z2xvYjwvaDQ+Cis8cD5Cb3RoIDx2YXI+dG88L3Zhcj4gYW5kIDx2YXI+ZnJvbTwvdmFyPiBhcmUgcmVxdWlyZWQgYW5kIGRlZmluZSBwYXR0ZXJucyB0aGF0IG1heSBjb250YWluIGF0IG1vc3QKK29uZSA8cT4qPC9xPi4gRm9yIGVhY2ggc291cmNlIGZpbGUgdGhhdCBtYXRjaGVzIHRoZSA8dmFyPmZyb208L3Zhcj4gcGF0dGVybiwgYSB0YXJnZXQgZmlsZSBuYW1lIHdpbGwKK2JlIGNvbnN0cnVjdGVkIGZyb20gdGhlIDx2YXI+dG88L3Zhcj4gcGF0dGVybiBieSBzdWJzdGl0dXRpbmcgdGhlIDxxPio8L3E+IGluIHRoZSA8dmFyPnRvPC92YXI+CitwYXR0ZXJuIHdpdGggdGhlIHRleHQgdGhhdCBtYXRjaGVzIHRoZSA8cT4qPC9xPiBpbiB0aGUgPHZhcj5mcm9tPC92YXI+IHBhdHRlcm4uIFNvdXJjZSBmaWxlIG5hbWVzCit0aGF0IGRvbid0IG1hdGNoIHRoZSA8dmFyPmZyb208L3Zhcj4gcGF0dGVybiB3aWxsIGJlIGlnbm9yZWQuPC9wPgorPGg1PkV4YW1wbGVzPC9oNT4KKzxwcmU+CiAmbHQ7bWFwcGVyIHR5cGU9JnF1b3Q7Z2xvYiZxdW90OyBmcm9tPSZxdW90OyouamF2YSZxdW90OyB0bz0mcXVvdDsqLmphdmEuYmFrJnF1b3Q7LyZndDsKLSZsdDtnbG9ibWFwcGVyIGZyb209JnF1b3Q7Ki5qYXZhJnF1b3Q7IHRvPSZxdW90OyouamF2YS5iYWsmcXVvdDsvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDtnbG9ibWFwcGVyIGZyb209JnF1b3Q7Ki5qYXZhJnF1b3Q7IHRvPSZxdW90OyouamF2YS5iYWsmcXVvdDsvJmd0OzwvcHJlPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+QS5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmEuYmFrPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5BLmphdmEuYmFrPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0IuamF2YS5iYWs8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vL2Jhci9CLmphdmEuYmFrPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgICAgPHRkPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD5pZ25vcmVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWQ8L3RkPgorICAgIDx0ZD48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD5pZ25vcmVkPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7QyppZXMmcXVvdDsgdG89JnF1b3Q7USp5JnF1b3Q7LyZndDsKLSZsdDtnbG9ibWFwcGVyIGZyb209JnF1b3Q7QyppZXMmcXVvdDsgdG89JnF1b3Q7USp5JnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CismbHQ7Z2xvYm1hcHBlciBmcm9tPSZxdW90O0MqaWVzJnF1b3Q7IHRvPSZxdW90O1EqeSZxdW90Oy8mZ3Q7PC9wcmU+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWU8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWQ8L3RkPgorICAgIDx0ZD48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+aWdub3JlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+aWdub3JlZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkMucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+US5wcm9wZXJ0eTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+US5wcm9wZXJ0eTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+UWxhc3Nlcy9kaXIvZGlyMi9BLnByb3BlcnR5PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPlFsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0eTwvY29kZT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KLSAgPHA+Ci0gICAgVGhlIGdsb2JtYXBwZXIgbWFwcGVyIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgZXh0cmEgYXR0cmlidXRlcy4KLSAgPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgSWYgdGhpcyBpcyBmYWxzZSwgdGhlIG1hcHBlciB3aWxsIGlnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcgdGhlIGdsb2IgcGF0dGVybi4KLSAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHRydWUgb3IgZmFsc2UsIHRoZSBkZWZhdWx0IGlzIHRydWUuCi0gICAgICA8ZW0+U2luY2UgQW50IDEuNi4zLjwvZW0+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmhhbmRsZWRpcnNlcDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBJZiB0aGlzIGlzIHNwZWNpZmllZCwgdGhlIG1hcHBlciB3aWxsIGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBub3JtYWwKLSAgICAgICAgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXJzIC0gXCBhbmQgLy4KLSAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHRydWUgb3IgZmFsc2UsIHRoZSBkZWZhdWx0IGlzIGZhbHNlLgotICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgZm9yIGNyb3NzLXBsYXRmb3JtIGJ1aWxkIGZpbGVzLgotICAgICAgICA8ZW0+U2luY2UgQW50IDEuNi4zLjwvZW0+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgICA8L3RhYmxlPgotICAgIDxwPgotICAgICAgQW4gZXhhbXBsZToKLSAgICA8L3A+Ci0gICAgPHByZT4KLSAgICAgICZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0ieCIgdGFyZ2V0b3M9InVuaXgiJmd0OwotICAgICAgICAmbHQ7cGF0aCBwYXRoPSJBai5KYXZhIi8mZ3Q7Ci0gICAgICAgICZsdDttYXBwZXImZ3Q7Ci0gICAgICAgICZsdDtjaGFpbmVkbWFwcGVyJmd0OwotICAgICAgICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKLSAgICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSJhKi5qYXZhIiB0bz0iKi5qYXZhLmJhayIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKLSAgICAgICAgJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OwotICAgICAgICAmbHQ7L21hcHBlciZndDsKLSAgICAgICZsdDsvcGF0aGNvbnZlcnQmZ3Q7Ci0gICAgICAmbHQ7ZWNobyZndDt4IGlzICR7eH0mbHQ7L2VjaG8mZ3Q7Ci0gICAgPC9wcmU+Ci0gICAgPHA+Ci0gICAgICB3aWxsIG91dHB1dCAieCBpcyBqLmphdmEuYmFrIi4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgICBhbmQKLSAgICA8L3A+Ci0gICAgPHByZT4KLSAgICAgICZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0ieCIgdGFyZ2V0b3M9InVuaXgiJmd0OwotICAgICAgICAmbHQ7cGF0aCBwYXRoPSJkL2UvZi9qLmphdmEiLyZndDsKLSAgICAgICAgJmx0O21hcHBlciZndDsKLSAgICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIke2Jhc2VkaXJ9XGQvZVwqIiB0bz0iKiIgaGFuZGxlZGlyc2VwPSJ5ZXMiLyZndDsKLSAgICAgICAgJmx0Oy9tYXBwZXImZ3Q7Ci0gICAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OwotICAgICAgJmx0O2VjaG8mZ3Q7eCBpcyAke3h9Jmx0Oy9lY2hvJmd0OwotICAgIDwvcHJlPgotICAgIDxwPgotICAgICAgd2lsbCBvdXRwdXQgInggaXMgZi9qLmphdmEiLgotICAgIDwvcD4KLQorPHA+VGhlIDxjb2RlPmdsb2JtYXBwZXI8L2NvZGU+IG1hcHBlciBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGV4dHJhIGF0dHJpYnV0ZXMuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+CisgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgPHE+dHJ1ZTwvcT4gb3IgPHE+ZmFsc2U8L3E+LiAgSWYgdGhpcyBpcyA8cT5mYWxzZTwvcT4sIHRoZSBtYXBwZXIgd2lsbAorICAgICAgaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZyB0aGUgZ2xvYiBwYXR0ZXJuLiAgPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhhbmRsZWRpcnNlcDwvdGQ+CisgICAgPHRkPgorICAgICAgVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIDxxPnRydWU8L3E+IG9yIDxxPmZhbHNlPC9xPi4gIElmIHRoaXMgaXMgc3BlY2lmaWVkLCB0aGUgbWFwcGVyIHdpbGwKKyAgICAgIGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBub3JtYWwgZGlyZWN0b3J5IHNlcGFyYXRvciBjaGFyYWN0ZXJzJm1kYXNoOzxxPlw8L3E+CisgICAgICBhbmQgPHE+LzwvcT4uICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgZm9yIGNyb3NzLXBsYXRmb3JtIGJ1aWxkIGZpbGVzLiAgPGVtPlNpbmNlIEFudAorICAgICAgMS42LjM8L2VtPgorICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPkFuIGV4YW1wbGU6PC9wPgorPHByZT4KKyZsdDtwYXRoY29udmVydCBwcm9wZXJ0eT0ieCIgdGFyZ2V0b3M9InVuaXgiJmd0OworICAmbHQ7cGF0aCBwYXRoPSJBai5KYXZhIi8mZ3Q7CisgICZsdDttYXBwZXImZ3Q7CisgICZsdDtjaGFpbmVkbWFwcGVyJmd0OworICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKKyAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSJhKi5qYXZhIiB0bz0iKi5qYXZhLmJhayIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKKyAgJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OworICAmbHQ7L21hcHBlciZndDsKKyZsdDsvcGF0aGNvbnZlcnQmZ3Q7CismbHQ7ZWNobyZndDt4IGlzICR7eH0mbHQ7L2VjaG8mZ3Q7PC9wcmU+Cis8cD53aWxsIG91dHB1dCA8Y29kZT54IGlzIGouamF2YS5iYWs8L2NvZGU+LCBhbmQ8L3A+Cis8cHJlPgorJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJ4IiB0YXJnZXRvcz0idW5peCImZ3Q7CisgICZsdDtwYXRoIHBhdGg9ImQvZS9mL2ouamF2YSIvJmd0OworICAmbHQ7bWFwcGVyJmd0OworICAgICZsdDtnbG9ibWFwcGVyIGZyb209IiR7YmFzZWRpcn1cZC9lXCoiIHRvPSIqIiBoYW5kbGVkaXJzZXA9InllcyIvJmd0OworICAmbHQ7L21hcHBlciZndDsKKyZsdDsvcGF0aGNvbnZlcnQmZ3Q7CismbHQ7ZWNobyZndDt4IGlzICR7eH0mbHQ7L2VjaG8mZ3Q7PC9wcmU+Cis8cD53aWxsIG91dHB1dCA8Y29kZT54IGlzIGYvai5qYXZhPC9jb2RlPi48L3A+CiAKICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgUmVnRXhwIE1hcHBlciAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIAotPGg0PjxhIG5hbWU9InJlZ2V4cC1tYXBwZXIiPnJlZ2V4cDwvYT48L2g0PgorPGg0IGlkPSJyZWdleHAtbWFwcGVyIj5yZWdleHA8L2g0PgogCi08cD5Cb3RoIDxjb2RlPnRvPC9jb2RlPiBhbmQgPGNvZGU+ZnJvbTwvY29kZT4gYXJlIHJlcXVpcmVkIGFuZCBkZWZpbmUKLXJlZ3VsYXIgZXhwcmVzc2lvbnMuIElmIHRoZSBzb3VyY2UgZmlsZSBuYW1lIChhcyBhIHdob2xlIG9yIGluIHBhcnQpCi1tYXRjaGVzIHRoZSA8Y29kZT5mcm9tPC9jb2RlPiBwYXR0ZXJuLCB0aGUgdGFyZ2V0IGZpbGUgbmFtZSB3aWxsIGJlCi1jb25zdHJ1Y3RlZCBmcm9tIHRoZQotPGNvZGU+dG88L2NvZGU+IHBhdHRlcm4sIHVzaW5nIDxjb2RlPlwwPC9jb2RlPiB0byA8Y29kZT5cOTwvY29kZT4gYXMKLWJhY2stcmVmZXJlbmNlcyBmb3IgdGhlIGZ1bGwgbWF0Y2ggKDxjb2RlPlwwPC9jb2RlPikgb3IgdGhlIG1hdGNoZXMgb2YKLXRoZSBzdWJleHByZXNzaW9ucyBpbiBwYXJlbnRoZXNlcy4gIFRoZSA8Y29kZT50bzwvY29kZT4gcGF0dGVybgotZGV0ZXJtaW5lcyB0aGUgPHN0cm9uZz53aG9sZTwvc3Ryb25nPiBmaWxlIG5hbWUsIHNvIGlmIHlvdSB3YW50ZWQgdG8KLXJlcGxhY2UgdGhlIGV4dGVuc2lvbiBvZiBhIGZpbGUgeW91IHNob3VsZCBub3QgdXNlIDxjb2RlPmZyb209Ilwub2xkJCIKLXRvPSIubmV3IjwvY29kZT4gYnV0IHJhdGhlciA8Y29kZT5mcm9tPSIoLiopXC5vbGQkIiB0bz0iXDEubmV3IjwvY29kZT4KLShvciByYXRoZXIgdXNlIGEgZ2xvYiBtYXBwZXIgaW4gdGhpcyBjYXNlKS48L3A+Cis8cD5Cb3RoIDx2YXI+dG88L3Zhcj4gYW5kIDx2YXI+ZnJvbTwvdmFyPiBhcmUgcmVxdWlyZWQgYW5kIGRlZmluZSByZWd1bGFyIGV4cHJlc3Npb25zLiBJZiB0aGUgc291cmNlCitmaWxlIG5hbWUgKGFzIGEgd2hvbGUgb3IgaW4gcGFydCkgbWF0Y2hlcyB0aGUgPHZhcj5mcm9tPC92YXI+IHBhdHRlcm4sIHRoZSB0YXJnZXQgZmlsZSBuYW1lIHdpbGwgYmUKK2NvbnN0cnVjdGVkIGZyb20gdGhlIDx2YXI+dG88L3Zhcj4gcGF0dGVybiwgdXNpbmcgPGNvZGU+XDA8L2NvZGU+IHRvIDxjb2RlPlw5PC9jb2RlPiBhcworYmFjay1yZWZlcmVuY2VzIGZvciB0aGUgZnVsbCBtYXRjaCAoPGNvZGU+XDA8L2NvZGU+KSBvciB0aGUgbWF0Y2hlcyBvZiB0aGUgc3ViZXhwcmVzc2lvbnMgaW4KK3BhcmVudGhlc2VzLiAgVGhlIDx2YXI+dG88L3Zhcj4gcGF0dGVybiBkZXRlcm1pbmVzIHRoZSA8c3Ryb25nPndob2xlPC9zdHJvbmc+IGZpbGUgbmFtZSwgc28gaWYgeW91Cit3YW50ZWQgdG8gcmVwbGFjZSB0aGUgZXh0ZW5zaW9uIG9mIGEgZmlsZSB5b3Ugc2hvdWxkIG5vdCB1c2UgPGNvZGU+ZnJvbT0iXC5vbGQkIiB0bz0iLm5ldyI8L2NvZGU+CitidXQgcmF0aGVyIDxjb2RlPmZyb209IiguKilcLm9sZCQiIHRvPSJcMS5uZXciPC9jb2RlPiAob3IgcmF0aGVyIHVzZSBhIGdsb2IgbWFwcGVyIGluIHRoaXMKK2Nhc2UpLjwvcD4KIAotPHA+U291cmNlIGZpbGVzIG5vdCBtYXRjaGluZyB0aGUgPGNvZGU+ZnJvbTwvY29kZT4gcGF0dGVybiB3aWxsIGJlCi1pZ25vcmVkLjwvcD4KKzxwPlNvdXJjZSBmaWxlcyBub3QgbWF0Y2hpbmcgdGhlIDx2YXI+ZnJvbTwvdmFyPiBwYXR0ZXJuIHdpbGwgYmUgaWdub3JlZC48L3A+CiAKLTxwPk5vdGUgdGhhdCB5b3UgbmVlZCB0byBlc2NhcGUgYSBkb2xsYXItc2lnbiAoPGNvZGU+JDwvY29kZT4pIHdpdGgKLWFub3RoZXIgZG9sbGFyLXNpZ24gaW4gQW50LjwvcD4KKzxwPk5vdGUgdGhhdCB5b3UgbmVlZCB0byBlc2NhcGUgYSBkb2xsYXItc2lnbiAoPHE+JDwvcT4pIHdpdGggYW5vdGhlciBkb2xsYXItc2lnbiBpbiBBbnQuPC9wPgogCiA8cD5UaGUgcmVnZXhwIG1hcHBlciBuZWVkcyBhIHN1cHBvcnRpbmcgbGlicmFyeSBhbmQgYW4gaW1wbGVtZW50YXRpb24KLW9mIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXI8L2NvZGU+IHRoYXQKLSAgaGlkZXMgdGhlIHNwZWNpZmljcyBvZiB0aGUgbGlicmFyeS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPiBBbnQKLSAgcmVxdWlyZXMgSmF2YSAxLjQgdG8gcnVuLCBzbyB0aGUgaW1wbGVtZW50YXRpb24gYmFzZWQgb24KLSAgdGhlIDxjb2RlPmphdmEudXRpbC5yZWdleDwvY29kZT4gcGFja2FnZSB3aWxsIGFsd2F5cyBiZSBhdmFpbGFibGUuCi0gIFlvdSBjYW4gc3RpbGwgdXNlIHRoZSBub3cgcmV0aXJlZCBKYWthcnRhIE9STyBvciBKYWthcnRhIFJlZ2V4IGluc3RlYWQgaWYgeW91cgotICBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIGphciBpbiB5b3VyIENMQVNTUEFUSC48L3A+CitvZiA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlcjwvY29kZT4gdGhhdCBoaWRlcyB0aGUgc3BlY2lmaWNzCitvZiB0aGUgbGlicmFyeS4gPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+LCBKYXZhIDEuNCBvciBsYXRlciBpcyByZXF1aXJlZCwgc28gdGhlIGltcGxlbWVudGF0aW9uIGJhc2VkCitvbiB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEudXRpbC5yZWdleDwvY29kZT4gcGFja2FnZSBpcyBhbHdheXMgYmUgYXZhaWxhYmxlLiAgWW91IGNhbiBzdGlsbCB1c2UKK3RoZSBub3cgcmV0aXJlZCBKYWthcnRhIE9STyBvciBKYWthcnRhIFJlZ2V4IGluc3RlYWQgaWYgeW91ciBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIGphciBpbgoreW91ciA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LjwvcD4KIAotPHA+Rm9yIGluZm9ybWF0aW9uIGFib3V0IHVzaW5nIDxhCi1ocmVmPSJodHRwOi8vd3d3LmNhY2FzLm9yZy9+d2VzL2phdmEvIiB0YXJnZXQ9Il90b3AiPmdudS5yZWdleHA8L2E+IG9yIDxhCi1ocmVmPSJodHRwOi8vd3d3LmNyb2NvZGlsZS5vcmcvfnN0cy9SZXgvIiB0YXJnZXQ9Il90b3AiPmdudS5yZXg8L2E+IHdpdGggQW50LCBzZWUgPGEKLWhyZWY9Imh0dHA6Ly9tYXJjLnRoZWFpbXNncm91cC5jb20vP2w9YW50LWRldiZtPTk3NTUwNzUzODEzNDgxJnc9MiIgdGFyZ2V0PSJfdG9wIj50aGlzPC9hPgotYXJ0aWNsZS48L3A+Cis8cD5Gb3IgaW5mb3JtYXRpb24gYWJvdXQgdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly9zYXZhbm5haC5nbnUub3JnL3Byb2plY3RzL2dudS1yZWdleHAvIgordGFyZ2V0PSJfdG9wIj5nbnUucmVnZXhwPC9hPiBvciA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va3puL3JlZ2V4NGovIiB0YXJnZXQ9Il90b3AiPmdudS5yZXg8L2E+Cit3aXRoIEFudCwgc2VlIDxhIGhyZWY9Imh0dHBzOi8vbWFyYy5pbmZvLz9sPWFudC1kZXYmbT05NzU1MDc1MzgxMzQ4MSZ3PTIiIHRhcmdldD0iX3RvcCI+dGhpczwvYT4KK2FydGljbGUuIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCA8YSBocmVmPSJodHRwOi8vdHVza2VyLm9yZy9yZWdleC9yZWdleF9iZW5jaG1hcmsuaHRtbCIKK3RhcmdldD0iX3RvcCI+eW91ciBtaWxlYWdlIG1heSB2YXJ5PC9hPiB3aXRoIGRpZmZlcmVudCByZWdleHAgZW5naW5lcy48L3A+CiAKIDxwPklmIHlvdSB3YW50IHRvIHVzZSBvbmUgb2YgdGhlIDxhIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5yZWd1bGFyIGV4cHJlc3Npb24KLSAgbGlicmFyaWVzPC9hPiBvdGhlciB0aGFuIDxjb2RlPmphdmEudXRpbC5yZWdleDwvY29kZT4geW91IG5lZWQgdG8gYWxzbyB1c2UKLSAgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+YW50LVthcGFjaGUtb3JvLCBhcGFjaGUtcmVnZXhwXS5qYXI8L2NvZGU+Ci1mcm9tIHRoZSBBbnQgcmVsZWFzZSB5b3UgYXJlIHVzaW5nLgotTWFrZSBzdXJlLCBib3RoIHdpbGwgYmUgbG9hZGVkIGZyb20gdGhlIHNhbWUKLWNsYXNzcGF0aCwgdGhhdCBpcyBlaXRoZXIgcHV0IHRoZW0gaW50byB5b3VyIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4sCi08Y29kZT5BTlRfSE9NRS9saWI8L2NvZGU+IGRpcmVjdG9yeSBvciBhIG5lc3RlZAotPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgb2YgdGhlIG1hcHBlciAtIHlvdSBjYW5ub3QgaGF2ZQotPGNvZGU+YW50LVthcGFjaGUtb3JvLCBhcGFjaGUtcmVnZXhwXS5qYXI8L2NvZGU+IGluIDxjb2RlPkFOVF9IT01FL2xpYjwvY29kZT4KLSBhbmQgdGhlIGxpYnJhcnkKK2xpYnJhcmllczwvYT4gb3RoZXIgdGhhbiA8Y29kZT5qYXZhLnV0aWwucmVnZXg8L2NvZGU+IHlvdSBuZWVkIHRvIGFsc28gdXNlIHRoZQorY29ycmVzcG9uZGluZyA8c2FtcD5hbnQtW2FwYWNoZS1vcm8sIGFwYWNoZS1yZWdleHBdLmphcjwvc2FtcD4gZnJvbSB0aGUgQW50IHJlbGVhc2UgeW91IGFyZSB1c2luZy4KK01ha2Ugc3VyZSB0aGF0IGJvdGggd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgc2FtZSBjbGFzc3BhdGgsIHRoYXQgaXMgZWl0aGVyIHB1dCB0aGVtIGludG8KK3lvdXIgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiwgPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPiBkaXJlY3Rvcnkgb3IgYQorbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IG9mIHRoZSBtYXBwZXImbWRhc2g7eW91IGNhbm5vdAoraGF2ZSA8c2FtcD5hbnQtW2FwYWNoZS1vcm8sIGFwYWNoZS1yZWdleHBdLmphcjwvc2FtcD4gaW4gPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPiBhbmQgdGhlIGxpYnJhcnkKIGluIGEgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPi48L3A+Ci08cD5BbnQgd2lsbCBjaG9vc2UgdGhlIHJlZ3VsYXItZXhwcmVzc2lvbiBsaWJyYXJ5IGJhc2VkIG9uIHRoZQotZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+Cis8cD5BbnQgd2lsbCBjaG9vc2UgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOjwvcD4KIDx1bD4KLTxsaT5JZiB0aGUgc3lzdGVtIHByb3BlcnR5Ci08Y29kZT5hbnQucmVnZXhwLm1hdGNoZXJpbXBsPC9jb2RlPiBoYXMgYmVlbiBzZXQsIGl0IGlzIHRha2VuIGFzIHRoZQotbmFtZSBvZiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nCi08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyPC9jb2RlPiB0aGF0Ci1zaG91bGQgYmUgdXNlZC48L2xpPgorPGxpPklmIHRoZSBzeXN0ZW0gcHJvcGVydHkgPGNvZGU+YW50LnJlZ2V4cC5tYXRjaGVyaW1wbDwvY29kZT4gaGFzIGJlZW4gc2V0LCBpdCBpcyB0YWtlbiBhcyB0aGUgbmFtZQorb2YgdGhlIGNsYXNzIGltcGxlbWVudGluZyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlcjwvY29kZT4KK3RoYXQgc2hvdWxkIGJlIHVzZWQuPC9saT4KIDxsaT5JZiBpdCBoYXMgbm90IGJlZW4gc2V0LCB1c2VzIHRoZSBKREsgMS40IGNsYXNzZXMuPC9saT4KIDwvdWw+CiAKLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4KICZsdDttYXBwZXIgdHlwZT0mcXVvdDtyZWdleHAmcXVvdDsgZnJvbT0mcXVvdDteKC4qKVwuamF2YSQkJnF1b3Q7IHRvPSZxdW90O1wxLmphdmEuYmFrJnF1b3Q7LyZndDsKLSZsdDtyZWdleHBtYXBwZXIgZnJvbT0mcXVvdDteKC4qKVwuamF2YSQkJnF1b3Q7IHRvPSZxdW90O1wxLmphdmEuYmFrJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CismbHQ7cmVnZXhwbWFwcGVyIGZyb209JnF1b3Q7XiguKilcLmphdmEkJCZxdW90OyB0bz0mcXVvdDtcMS5qYXZhLmJhayZxdW90Oy8mZ3Q7PC9wcmU+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWU8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YS5iYWs8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+QS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkEuamF2YS5iYWs8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhLmJhazwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YS5iYWs8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgICA8dGQ+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPmlnbm9yZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgICAgPHRkPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPmlnbm9yZWQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSZxdW90O3JlZ2V4cCZxdW90OyBmcm9tPSZxdW90O14oLiopLyhbXi9dKykvKFteL10qKSQkJnF1b3Q7IHRvPSZxdW90O1wxL1wyL1wyLVwzJnF1b3Q7LyZndDsKLSZsdDtyZWdleHBtYXBwZXIgZnJvbT0mcXVvdDteKC4qKS8oW14vXSspLyhbXi9dKikkJCZxdW90OyB0bz0mcXVvdDtcMS9cMi9cMi1cMyZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorJmx0O3JlZ2V4cG1hcHBlciBmcm9tPSZxdW90O14oLiopLyhbXi9dKykvKFteL10qKSQkJnF1b3Q7IHRvPSZxdW90O1wxL1wyL1wyLVwzJnF1b3Q7LyZndDs8L3ByZT4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZTwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZTwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlZDwvdGQ+CisgICAgPHRkPjxjb2RlPkEuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD5pZ25vcmVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9CLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvYmFyLUIuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL2Jhci1CLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pZ25vcmVkPC90ZD4KKyAgICA8dGQ+PGNvZGU+Qy5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CisgICAgPHRkPmlnbm9yZWQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3Nlcy9kaXIvZGlyMi9kaXIyLUEucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL2RpcjItQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7bWFwcGVyIHR5cGU9InJlZ2V4cCIgZnJvbT0iXiguKilcLiguKikkJCIgdG89IlwyLlwxIi8mZ3Q7Ci0mbHQ7cmVnZXhwbWFwcGVyIGZyb209Il4oLiopXC4oLiopJCQiIHRvPSJcMi5cMSIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDtyZWdleHBtYXBwZXIgZnJvbT0iXiguKilcLiguKikkJCIgdG89IlwyLlwxIi8mZ3Q7PC9wcmU+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWU8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWU8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmphdmEuQTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+amF2YS5BPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhLmZvby9iYXIvQjwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0IuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5qYXZhLmZvby9iYXIvQjwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPnByb3BlcnRpZXMuQzwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DLnByb3BlcnRpZXM8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+cHJvcGVydGllcy5DPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzZXMvZGlyL2RpcjIvQS5wcm9wZXJ0aWVzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5wcm9wZXJ0aWVzLkNsYXNzZXMvZGlyL2RpcjIvQTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5DbGFzc2VzL2Rpci9kaXIyL0EucHJvcGVydGllczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5wcm9wZXJ0aWVzLkNsYXNzZXMvZGlyL2RpcjIvQTwvY29kZT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSJyZWdleHAiIGZyb209Il4oLio/KShcJCRbXi9cXFwuXSopP1wuY2xhc3MkJCIgdG89IlwxLmphdmEiLyZndDsKLSZsdDtyZWdleHBtYXBwZXIgZnJvbT0iXiguKj8pKFwkJFteL1xcXC5dKik/XC5jbGFzcyQkIiB0bz0iXDEuamF2YSIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDtyZWdleHBtYXBwZXIgZnJvbT0iXiguKj8pKFwkJFteL1xcXC5dKik/XC5jbGFzcyQkIiB0bz0iXDEuamF2YSIvJmd0OzwvcHJlPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Q2xhc3NMb2FkZXIuY2xhc3M8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkNsYXNzTG9hZGVyLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Q2xhc3NMb2FkZXIuY2xhc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Q2xhc3NMb2FkZXIuamF2YTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuY2xhc3M8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmphdmEvbGFuZy9DbGFzc0xvYWRlci5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmphdmEvbGFuZy9DbGFzc0xvYWRlci5jbGFzczwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuamF2YTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhXGxhbmdcQ2xhc3NMb2FkZXIkMS5jbGFzczwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+amF2YVxsYW5nXENsYXNzTG9hZGVyLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+amF2YVxsYW5nXENsYXNzTG9hZGVyJDEuY2xhc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+amF2YVxsYW5nXENsYXNzTG9hZGVyLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+amF2YS9sYW5nL0NsYXNzTG9hZGVyJGZvbyQxLmNsYXNzPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5qYXZhL2xhbmcvQ2xhc3NMb2FkZXIkZm9vJDEuY2xhc3M8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+amF2YS9sYW5nL0NsYXNzTG9hZGVyLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci0gIDxwPgotICAgIFRoZSByZWdleHBtYXBwZXIgbWFwcGVyIGNhbiB0YWtlIHRoZSBmb2xsb3dpbmcgZXh0cmEgYXR0cmlidXRlcy4KLSAgPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgSWYgdGhpcyBpcyBmYWxzZSwgdGhlIG1hcHBlciB3aWxsIGlnbm9yZSBjYXNlIHdoZW4gbWF0Y2hpbmcgdGhlIHBhdHRlcm4uCi0gICAgICAgIFRoaXMgYXR0cmlidXRlIGNhbiBiZSB0cnVlIG9yIGZhbHNlLCB0aGUgZGVmYXVsdCBpcyB0cnVlLgotICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMy48L2VtPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5oYW5kbGVkaXJzZXA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIHRoZSBtYXBwZXIgd2lsbCB0cmVhdCBhIFwgY2hhcmFjdGVyIGluIGEgZmlsZW5hbWUKLSAgICAgICAgYXMgYSAvIGZvciB0aGUgcHVycG9zZXMgb2YgbWF0Y2hpbmcuCi0gICAgICAgIFRoaXMgYXR0cmlidXRlIGNhbiBiZSB0cnVlIG9yIGZhbHNlLCB0aGUgZGVmYXVsdCBpcyBmYWxzZS4KLSAgICAgICAgVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZnVsIGZvciBjcm9zcy1wbGF0Zm9ybSBidWlsZCBmaWxlcy4KLSAgICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMy48L2VtPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KLSAgICA8cD4KLSAgICAgIEFuIGV4YW1wbGU6Ci0gICAgPC9wPgotICAgIDxwcmU+Ci0gICAgICAmbHQ7cGF0aGNvbnZlcnQgcHJvcGVydHk9IngiIHRhcmdldG9zPSJ1bml4IiZndDsKLSAgICAgICAgJmx0O3BhdGggcGF0aD0iQWouSmF2YSIvJmd0OwotICAgICAgICAmbHQ7Y2hhaW5lZG1hcHBlciZndDsKLSAgICAgICAgICAmbHQ7ZmxhdHRlbm1hcHBlci8mZ3Q7Ci0gICAgICAgICAgJmx0O3JlZ2V4cG1hcHBlciBmcm9tPSJhKC4qKVwuamF2YSIgdG89IlwxLmphdmEuYmFrIiBjYXNlc2Vuc2l0aXZlPSJubyIvJmd0OwotICAgICAgICAmbHQ7L2NoYWluZWRtYXBwZXImZ3Q7Ci0gICAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OwotICAgICAgJmx0O2VjaG8mZ3Q7eCBpcyAke3h9Jmx0Oy9lY2hvJmd0OwotICAgIDwvcHJlPgotICAgIDxwPgotICAgICAgd2lsbCBvdXRwdXQgInggaXMgai5qYXZhLmJhayIuCi0gICAgPC9wPgotICAgIDxwPgotICAgICAgYW5kCi0gICAgPC9wPgotICAgIDxwcmU+Ci0gICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJoZC5wcm9wIiB0YXJnZXRvcz0id2luZG93cyImZ3Q7Ci0gICAgICAmbHQ7cGF0aCBwYXRoPSJkXGUvZlxqLmphdmEiLyZndDsKLSAgICAgICZsdDtjaGFpbmVkbWFwcGVyJmd0OwotICAgICAgICAmbHQ7cmVnZXhwbWFwcGVyIGZyb209IiR7YmFzZWRpcn0vZC9lLyguKikiIHRvPSJcMSIgaGFuZGxlZGlyc2VwPSJ5ZXMiLyZndDsKLSAgICAgICZsdDsvY2hhaW5lZG1hcHBlciZndDsKLSAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OwotICAgIDwvcHJlPgotICAgIDxwPgotICAgICAgd2lsbCBzZXQgPGNvZGU+aGQucHJvcDwvY29kZT4gdG8gImZcai5qYXZhIi4KLSAgICA8L3A+Cis8cD5UaGUgcmVnZXhwIG1hcHBlciBjYW4gdGFrZSB0aGUgZm9sbG93aW5nIGV4dHJhIGF0dHJpYnV0ZXMuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+CisgICAgICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgPHE+dHJ1ZTwvcT4gb3IgPHE+ZmFsc2U8L3E+LiAgSWYgdGhpcyBpcyA8cT5mYWxzZTwvcT4sIHRoZSBtYXBwZXIgd2lsbAorICAgICAgaWdub3JlIGNhc2Ugd2hlbiBtYXRjaGluZyB0aGUgcGF0dGVybi4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPgorICAgIDwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5oYW5kbGVkaXJzZXA8L3RkPgorICAgIDx0ZD4KKyAgICAgIFRoaXMgYXR0cmlidXRlIGNhbiBiZSA8cT50cnVlPC9xPiBvciA8cT5mYWxzZTwvcT4uICBJZiB0aGlzIGlzIHNwZWNpZmllZCwgdGhlIG1hcHBlciB3aWxsCisgICAgICB0cmVhdCBhIDxxPlw8L3E+IGNoYXJhY3RlciBpbiBhIGZpbGVuYW1lIGFzIGEgPHE+LzwvcT4gZm9yIHRoZSBwdXJwb3NlcyBvZiBtYXRjaGluZy4gIFRoaXMKKyAgICAgIGF0dHJpYnV0ZSBpcyB1c2VmdWwgZm9yIGNyb3NzLXBsYXRmb3JtIGJ1aWxkIGZpbGVzLgorICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPHA+QW4gZXhhbXBsZTo8L3A+Cis8cHJlPgorJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSJ4IiB0YXJnZXRvcz0idW5peCImZ3Q7CisgICZsdDtwYXRoIHBhdGg9IkFqLkphdmEiLyZndDsKKyAgJmx0O2NoYWluZWRtYXBwZXImZ3Q7CisgICAgJmx0O2ZsYXR0ZW5tYXBwZXIvJmd0OworICAgICZsdDtyZWdleHBtYXBwZXIgZnJvbT0iYSguKilcLmphdmEiIHRvPSJcMS5qYXZhLmJhayIgY2FzZXNlbnNpdGl2ZT0ibm8iLyZndDsKKyAgJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OworJmx0Oy9wYXRoY29udmVydCZndDsKKyZsdDtlY2hvJmd0O3ggaXMgJHt4fSZsdDsvZWNobyZndDs8L3ByZT4KKzxwPndpbGwgb3V0cHV0IDxjb2RlPnggaXMgai5qYXZhLmJhazwvY29kZT4sIGFuZDwvcD4KKzxwcmU+CismbHQ7cGF0aGNvbnZlcnQgcHJvcGVydHk9ImhkLnByb3AiIHRhcmdldG9zPSJ3aW5kb3dzIiZndDsKKyAgJmx0O3BhdGggcGF0aD0iZFxlL2Zcai5qYXZhIi8mZ3Q7CisgICZsdDtjaGFpbmVkbWFwcGVyJmd0OworICAgICZsdDtyZWdleHBtYXBwZXIgZnJvbT0iJHtiYXNlZGlyfS9kL2UvKC4qKSIgdG89IlwxIiBoYW5kbGVkaXJzZXA9InllcyIvJmd0OworICAmbHQ7L2NoYWluZWRtYXBwZXImZ3Q7CismbHQ7L3BhdGhjb252ZXJ0Jmd0OzwvcHJlPgorPHA+d2lsbCBzZXQgPGNvZGU+aGQucHJvcDwvY29kZT4gdG8gPGNvZGU+ZlxqLmphdmE8L2NvZGU+LjwvcD4KIAogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICBQYWNrYWdlIE1hcHBlciAgICAgICAgICAgICAtLT4KICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogCi08aDQ+PGEgbmFtZT0icGFja2FnZS1tYXBwZXIiPnBhY2thZ2U8L2E+PC9oND4KLTxwPlNoYXJpbmcgdGhlIHNhbWUgc3ludGF4IGFzIHRoZSA8YSBocmVmPSIjZ2xvYi1tYXBwZXIiPmdsb2IgbWFwcGVyPC9hPiwKLXRoZSBwYWNrYWdlIG1hcHBlciByZXBsYWNlcwotZGlyZWN0b3J5IHNlcGFyYXRvcnMgZm91bmQgaW4gdGhlIG1hdGNoZWQgc291cmNlIHBhdHRlcm4gd2l0aCBkb3RzIGluIHRoZSB0YXJnZXQKLXBhdHRlcm4gcGxhY2Vob2xkZXIuIFRoaXMgbWFwcGVyIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgaW4gY29tYmluYXRpb24KLXdpdGggPGNvZGU+Jmx0O3VwdG9kYXRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IG91dHB1dC48L3A+Ci08cD5UaGUgdG8gYW5kIGZyb20gYXR0cmlidXRlcyBhcmUgYm90aCByZXF1aXJlZC48L3A+Ci08Yj5FeGFtcGxlOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9InBhY2thZ2UtbWFwcGVyIj5wYWNrYWdlPC9oND4KKzxwPlNoYXJpbmcgdGhlIHNhbWUgc3ludGF4IGFzIHRoZSA8YSBocmVmPSIjZ2xvYi1tYXBwZXIiPmdsb2IgbWFwcGVyPC9hPiwgdGhlIHBhY2thZ2UgbWFwcGVyCityZXBsYWNlcyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBmb3VuZCBpbiB0aGUgbWF0Y2hlZCBzb3VyY2UgcGF0dGVybiB3aXRoIGRvdHMgaW4gdGhlIHRhcmdldCBwYXR0ZXJuCitwbGFjZWhvbGRlci4gVGhpcyBtYXBwZXIgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIDxjb2RlPiZsdDt1cHRvZGF0ZSZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gb3V0cHV0LjwvcD4KKzxwPlRoZSA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4gYXR0cmlidXRlcyBhcmUgYm90aCByZXF1aXJlZC48L3A+Cis8aDU+RXhhbXBsZTwvaDU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSJwYWNrYWdlIiBmcm9tPSIqVGVzdC5qYXZhIiB0bz0iVEVTVC0qVGVzdC54bWwiLyZndDsKLSZsdDtwYWNrYWdlbWFwcGVyIGZyb209IipUZXN0LmphdmEiIHRvPSJURVNULSpUZXN0LnhtbCIvJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDtwYWNrYWdlbWFwcGVyIGZyb209IipUZXN0LmphdmEiIHRvPSJURVNULSpUZXN0LnhtbCIvJmd0OzwvcHJlPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTWFwcGVyVGVzdC5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5URVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU1hcHBlclRlc3QueG1sPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGFja2FnZU1hcHBlclRlc3QuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5URVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU1hcHBlclRlc3QueG1sPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSGVscGVyLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlnbm9yZWQ8L3RkPgorICAgIDx0ZD48Y29kZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0hlbHBlci5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPmlnbm9yZWQ8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIApAQCAtNjA1LDI3ICs1MzksMjUgQEAKICAgICA8IS0tICAgICAgICAgICBVbnBhY2thZ2UgTWFwcGVyICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAKLTxoND48YSBuYW1lPSJ1bnBhY2thZ2UtbWFwcGVyIj51bnBhY2thZ2UgKHNpbmNlIEFudCAxLjYuMCk8L2E+PC9oND4KLSAgPHA+VGhpcyBtYXBwZXIgaXMgdGhlIGludmVyc2Ugb2YgdGhlIDxhIGhyZWY9IiNwYWNrYWdlLW1hcHBlciI+cGFja2FnZTwvYT4gbWFwcGVyLgotICAgIEl0IHJlcGxhY2VzIHRoZSBkb3RzIGluIGEgcGFja2FnZSBuYW1lIHdpdGggZGlyZWN0b3J5IHNlcGFyYXRvcnMuIFRoaXMKLSAgICBpcyB1c2VmdWwgZm9yIG1hdGNoaW5nIFhNTCBmb3JtYXR0ZXIgcmVzdWx0cyBhZ2FpbnN0IHRoZWlyIEpVbml0IHRlc3QKLSAgICB0ZXN0IGNhc2VzLiBUaGUgbWFwcGVyIHNoYXJlcyB0aGUgc2FtcGxlIHN5bnRheAotICAgIGFzIHRoZSA8YSBocmVmPSIjZ2xvYi1tYXBwZXIiPmdsb2IgbWFwcGVyPC9hPi4KLSAgPC9wPgotPHA+VGhlIHRvIGFuZCBmcm9tIGF0dHJpYnV0ZXMgYXJlIGJvdGggcmVxdWlyZWQuPC9wPgotPGI+RXhhbXBsZTo8L2I+Ci08YmxvY2txdW90ZT48cHJlPgorPGg0IGlkPSJ1bnBhY2thZ2UtbWFwcGVyIj51bnBhY2thZ2U8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjYuMDwvZW0+PC9wPgorPHA+VGhpcyBtYXBwZXIgaXMgdGhlIGludmVyc2Ugb2YgdGhlIDxhIGhyZWY9IiNwYWNrYWdlLW1hcHBlciI+cGFja2FnZTwvYT4gbWFwcGVyLiAgSXQgcmVwbGFjZXMgdGhlCitkb3RzIGluIGEgcGFja2FnZSBuYW1lIHdpdGggZGlyZWN0b3J5IHNlcGFyYXRvcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBtYXRjaGluZyBYTUwgZm9ybWF0dGVyIHJlc3VsdHMKK2FnYWluc3QgdGhlaXIgSlVuaXQgdGVzdCB0ZXN0IGNhc2VzLiBUaGUgbWFwcGVyIHNoYXJlcyB0aGUgc2FtcGxlIHN5bnRheCBhcwordGhlIDxhIGhyZWY9IiNnbG9iLW1hcHBlciI+Z2xvYiBtYXBwZXI8L2E+LjwvcD4KKzxwPlRoZSA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4gYXR0cmlidXRlcyBhcmUgYm90aCByZXF1aXJlZC48L3A+Cis8aDU+RXhhbXBsZTwvaDU+Cis8cHJlPgogJmx0O21hcHBlciB0eXBlPSJ1bnBhY2thZ2UiIGZyb209IlRFU1QtKlRlc3QueG1sIiB0bz0iJHt0ZXN0LnNyYy5kaXJ9LypUZXN0LmphdmEiJmd0OwotJmx0O3VucGFja2FnZW1hcHBlciBmcm9tPSJURVNULSpUZXN0LnhtbCIgdG89IiR7dGVzdC5zcmMuZGlyfS8qVGVzdC5qYXZhIiZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CismbHQ7dW5wYWNrYWdlbWFwcGVyIGZyb209IlRFU1QtKlRlc3QueG1sIiB0bz0iJHt0ZXN0LnNyYy5kaXJ9LypUZXN0LmphdmEiJmd0OzwvcHJlPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+VEVTVC1vcmcuYWNtZS5BY21lVGVzdC54bWw8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPiR7dGVzdC5zcmMuZGlyfS9vcmcvYWNtZS9BY21lVGVzdC5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPlRFU1Qtb3JnLmFjbWUuQWNtZVRlc3QueG1sPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPiR7dGVzdC5zcmMuZGlyfS9vcmcvYWNtZS9BY21lVGVzdC5qYXZhPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCkBAIC02MzMsNTAgKzU2NSw0NyBAQAogICAgIDwhLS0gICAgICAgICAgIENvbXBvc2l0ZSBNYXBwZXIgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIAotPGg0PjxhIG5hbWU9ImNvbXBvc2l0ZS1tYXBwZXIiPmNvbXBvc2l0ZSAoc2luY2UgQW50IDEuNy4wKTwvYT48L2g0PgotICA8cD5UaGlzIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBjYW4gY29udGFpbiBtdWx0aXBsZSBuZXN0ZWQgbWFwcGVycy4KLSAgICBGaWxlIG1hcHBpbmcgaXMgcGVyZm9ybWVkIGJ5IHBhc3NpbmcgdGhlIHNvdXJjZSBmaWxlbmFtZSB0byBlYWNoIG5lc3RlZAotICAgIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBpbiB0dXJuLCByZXR1cm5pbmcgYWxsIHJlc3VsdHMuCi0gICAgVGhlIDxpPnRvPC9pPiBhbmQgPGk+ZnJvbTwvaT4gYXR0cmlidXRlcyBhcmUgaWdub3JlZC48L3A+Ci0gIDxwPlN0YXJ0aW5nIHdpdGggQW50IDEuOC4wIHRoZSBvcmRlciBvZiB0aGUgbWFwcGVkIHJlc3VsdHMgaXMgdGhlCi0gICAgc2FtZSBhcyB0aGUgb3JkZXIgb2YgdGhlIG5lc3RlZCBtYXBwZXJzOyBwcmlvciB0byBBbnQgMS44LjAgdGhlCi0gICAgb3JkZXIgaGFzIGJlZW4gdW5kZWZpbmVkLjwvcD4KLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9ImNvbXBvc2l0ZS1tYXBwZXIiPmNvbXBvc2l0ZTwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNy4wPC9lbT48L3A+Cis8cD5UaGlzIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBjYW4gY29udGFpbiBtdWx0aXBsZSBuZXN0ZWQgbWFwcGVycy4gIEZpbGUgbWFwcGluZyBpcyBwZXJmb3JtZWQgYnkKK3Bhc3NpbmcgdGhlIHNvdXJjZSBmaWxlbmFtZSB0byBlYWNoIG5lc3RlZCA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gaW4gdHVybiwgcmV0dXJuaW5nIGFsbAorcmVzdWx0cy4gIFRoZSA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4gYXR0cmlidXRlcyBhcmUgaWdub3JlZC48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4sIHRoZSBvcmRlciBvZiB0aGUgbWFwcGVkIHJlc3VsdHMgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIHRoZSBuZXN0ZWQKK21hcHBlcnM7IHByaW9yIHRvIEFudCAxLjguMCB0aGUgb3JkZXIgaGFzIGJlZW4gdW5kZWZpbmVkLjwvcD4KKzxoNT5FeGFtcGxlczwvaDU+Cis8cHJlPgogJmx0O2NvbXBvc2l0ZW1hcHBlciZndDsKICAgJmx0O2lkZW50aXR5bWFwcGVyLyZndDsKICAgJmx0O3BhY2thZ2VtYXBwZXIgZnJvbT0iKi5qYXZhIiB0bz0iKiIvJmd0OwotJmx0Oy9jb21wb3NpdGVtYXBwZXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorJmx0Oy9jb21wb3NpdGVtYXBwZXImZ3Q7PC9wcmU+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWVzPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lczwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPjxjb2RlPmZvby9iYXIvQS5qYXZhPC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28vYmFyL0EuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj48Y29kZT5mb28vYmFyL0EuamF2YTwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0EuamF2YTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5mb28uYmFyLkE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vLmJhci5BPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotICA8cD5UaGUgY29tcG9zaXRlIG1hcHBlciBoYXMgbm8gY29ycmVzcG9uZGluZwotICAgIDxjb2RlPiZsdDttYXBwZXIgPGI+dHlwZTwvYj4mZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUuCi0gIDwvcD4KKzxwPlRoZSBjb21wb3NpdGUgbWFwcGVyIGhhcyBubyBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiA8dmFyPnR5cGU8L3Zhcj4KK2F0dHJpYnV0ZS48L3A+CiAKICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICBDaGFpbmVkIE1hcHBlciAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KIAotPGg0PjxhIG5hbWU9ImNoYWluZWQtbWFwcGVyIj5jaGFpbmVkIChzaW5jZSBBbnQgMS43LjApPC9hPjwvaDQ+Ci0gIDxwPlRoaXMgbWFwcGVyIGltcGxlbWVudGF0aW9uIGNhbiBjb250YWluIG11bHRpcGxlIG5lc3RlZCBtYXBwZXJzLgotICAgIEZpbGUgbWFwcGluZyBpcyBwZXJmb3JtZWQgYnkgcGFzc2luZyB0aGUgc291cmNlIGZpbGVuYW1lIHRvIHRoZSBmaXJzdAotICAgIG5lc3RlZCBtYXBwZXIsIGl0cyByZXN1bHRzIHRvIHRoZSBzZWNvbmQsIGFuZCBzbyBvbi4gIFRoZSB0YXJnZXQgZmlsZW5hbWVzCi0gICAgZ2VuZXJhdGVkIGJ5IHRoZSBsYXN0IG5lc3RlZCBtYXBwZXIgY29tcHJpc2UgdGhlIHVsdGltYXRlIHJlc3VsdHMgb2YgdGhlCi0gICAgbWFwcGluZyBvcGVyYXRpb24uICBUaGUgPGk+dG88L2k+IGFuZCA8aT5mcm9tPC9pPiBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLjwvcD4KLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9ImNoYWluZWQtbWFwcGVyIj5jaGFpbmVkPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvcD4KKzxwPlRoaXMgbWFwcGVyIGltcGxlbWVudGF0aW9uIGNhbiBjb250YWluIG11bHRpcGxlIG5lc3RlZCBtYXBwZXJzLiAgRmlsZSBtYXBwaW5nIGlzIHBlcmZvcm1lZCBieQorcGFzc2luZyB0aGUgc291cmNlIGZpbGVuYW1lIHRvIHRoZSBmaXJzdCBuZXN0ZWQgbWFwcGVyLCBpdHMgcmVzdWx0cyB0byB0aGUgc2Vjb25kLCBhbmQgc28gb24uICBUaGUKK3RhcmdldCBmaWxlbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBsYXN0IG5lc3RlZCBtYXBwZXIgY29tcHJpc2UgdGhlIHVsdGltYXRlIHJlc3VsdHMgb2YgdGhlIG1hcHBpbmcKK29wZXJhdGlvbi4gIFRoZSA8dmFyPnRvPC92YXI+IGFuZCA8dmFyPmZyb208L3Zhcj4gYXR0cmlidXRlcyBhcmUgaWdub3JlZC48L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4KICZsdDtjaGFpbmVkbWFwcGVyJmd0OwogICAmbHQ7ZmxhdHRlbm1hcHBlci8mZ3Q7CiAgICZsdDtnbG9ibWFwcGVyIGZyb209IioiIHRvPSJuZXcvcGF0aC8qIi8mZ3Q7CkBAIC02ODQsMjg5ICs2MTMsMjQ4IEBACiAgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKiIgdG89IioxIi8mZ3Q7CiAgICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKiIgdG89IioyIi8mZ3Q7CiAgICZsdDsvbWFwcGVyJmd0OwotJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyZsdDsvY2hhaW5lZG1hcHBlciZndDs8L3ByZT4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZXM8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWVzPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPm5ldy9wYXRoL0EuamF2YTE8L2NvZGU+PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+bmV3L3BhdGgvQS5qYXZhMTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5uZXcvcGF0aC9BLmphdmEyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm5ldy9wYXRoL0EuamF2YTI8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+PGNvZGU+Ym9vL2Zhci9CLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPm5ldy9wYXRoL0IuamF2YTE8L2NvZGU+PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Ym9vL2Zhci9CLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+bmV3L3BhdGgvQi5qYXZhMTwvY29kZT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5uZXcvcGF0aC9CLmphdmEyPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPm5ldy9wYXRoL0IuamF2YTI8L2NvZGU+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci0gIDxwPlRoZSBjaGFpbmVkIG1hcHBlciBoYXMgbm8gY29ycmVzcG9uZGluZwotICAgIDxjb2RlPiZsdDttYXBwZXIgPGI+dHlwZTwvYj4mZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUuCi0gIDwvcD4KKzxwPlRoZSBjaGFpbmVkIG1hcHBlciBoYXMgbm8gY29ycmVzcG9uZGluZyA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gPHZhcj50eXBlPC92YXI+CithdHRyaWJ1dGUuPC9wPgogCiAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KICAgICA8IS0tICAgICAgICAgICAgIEZpbHRlciBNYXBwZXIgICAgICAgICAgICAgIC0tPgogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAKLTxoND48YSBuYW1lPSJmaWx0ZXItbWFwcGVyIj5maWx0ZXJtYXBwZXIgKHNpbmNlIEFudCAxLjYuMyk8L2E+PC9oND4KLSAgICA8cD4KLSAgICAgIFRoaXMgbWFwcGVyIGltcGxlbWVudGF0aW9uIGFwcGxpZXMgYSA8YSBocmVmPSJmaWx0ZXJjaGFpbi5odG1sIj5maWx0ZXJjaGFpbjwvYT4KLSAgICAgIHRvIHRoZSBzb3VyY2UgZmlsZSBuYW1lLgotICAgIDwvcD4KLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDQgaWQ9ImZpbHRlci1tYXBwZXIiPmZpbHRlcm1hcHBlcjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNi4zPC9lbT48L3A+Cis8cD5UaGlzIG1hcHBlciBpbXBsZW1lbnRhdGlvbiBhcHBsaWVzIGEgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyY2hhaW48L2E+IHRvIHRoZSBzb3VyY2UKK2ZpbGUgbmFtZS48L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4KICZsdDtmaWx0ZXJtYXBwZXImZ3Q7CiAgICZsdDtyZXBsYWNlc3RyaW5nIGZyb209IlwiIHRvPSIvIi8mZ3Q7Ci0mbHQ7L2ZpbHRlcm1hcHBlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsdGVybWFwcGVyJmd0OzwvcHJlPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lczwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZXM8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0iY2VudGVyIj48Y29kZT5mb29cYmFyXEEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vXGJhclxBLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtmaWx0ZXJtYXBwZXImZ3Q7CiAgICZsdDtzY3JpcHRmaWx0ZXIgbGFuZ3VhZ2U9ImJlYW5zaGVsbCImZ3Q7CiAgICAgc2VsZi5zZXRUb2tlbihzZWxmLmdldFRva2VuKCkudG9VcHBlckNhc2UoKSk7CiAgICZsdDsvc2NyaXB0ZmlsdGVyJmd0OwotJmx0Oy9maWx0ZXJtYXBwZXImZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2ZpbHRlcm1hcHBlciZndDs8L3ByZT4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZXM8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWVzPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+PGNvZGU+Zm9vXGJhclxBLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPkZPT1xCQVJcQS5KQVZBPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvb1xiYXJcQS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPkZPT1xCQVJcQS5KQVZBPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0gIDxwPlRoZSBmaWx0ZXJtYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcKLSAgICA8Y29kZT4mbHQ7bWFwcGVyIDxiPnR5cGU8L2I+Jmd0OzwvY29kZT4gYXR0cmlidXRlLgotICA8L3A+Cis8cD5UaGUgZmlsdGVybWFwcGVyIGhhcyBubyBjb3JyZXNwb25kaW5nIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiA8dmFyPnR5cGU8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAogICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CiAgICAgPCEtLSAgICAgICAgICAgICBTY3JpcHQgTWFwcGVyICAgICAgICAgICAgICAtLT4KICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgogCi08aDQ+PGEgbmFtZT0ic2NyaXB0LW1hcHBlciI+c2NyaXB0bWFwcGVyIChzaW5jZSBBbnQgMS43KTwvYT48L2g0PgotPHA+Ci1UaGlzIG1hcHBlciBleGVjdXRlcyBhIHNjcmlwdCB3cml0dGVuIGluIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmIiB0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+Ci1vcgotICA8YSBocmVmPSJodHRwczovL3NjcmlwdGluZy5kZXYuamF2YS5uZXQiPkpTUiAyMjM8L2E+Ci1zdXBwb3J0ZWQgbGFuZ3VhZ2UsIG9uY2UgcGVyIGZpbGUgdG8gbWFwLjwvcD4KLVRoZSBzY3JpcHQgY2FuIGJlIGRlY2xhcmVkIGlubGluZSBvciBpbiBhIHNwZWNpZmllZCBmaWxlLgotPC9wPgotPHA+Ci1TZWUgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+IHRhc2sgZm9yCi1hbiBleHBsYW5hdGlvbiBvZiBzY3JpcHRzIGFuZCBkZXBlbmRlbmNpZXMuCi08L3A+Cis8aDQgaWQ9InNjcmlwdC1tYXBwZXIiPnNjcmlwdG1hcHBlcjwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNzwvZW0+PC9wPgorPHA+VGhpcyBtYXBwZXIgZXhlY3V0ZXMgYSBzY3JpcHQgd3JpdHRlbiBpbiA8YSBocmVmPSJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiCit0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+CitvciA8YSBocmVmPSJodHRwczovL2pjcC5vcmcvYWJvdXRKYXZhL2NvbW11bml0eXByb2Nlc3MvbWFpbnRlbmFuY2UvanNyMjIzLzIyM0NoYW5nZUxvZy5odG1sIgordGFyZ2V0PSJfdG9wIj5KU1IgMjIzPC9hPiBzdXBwb3J0ZWQgbGFuZ3VhZ2UsIG9uY2UgcGVyIGZpbGUgdG8gbWFwLjwvcD4KKzxwPlRoZSBzY3JpcHQgY2FuIGJlIGRlY2xhcmVkIGlubGluZSBvciBpbiBhIHNwZWNpZmllZCBmaWxlLjwvcD4KKzxwPlNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQKK2RlcGVuZGVuY2llcy48L3A+CiAKLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5sYW5ndWFnZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBTY3JpcHRpbmcgbGFuZ3VhZ2UKLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPm1hbmFnZXI8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgVGhlIHNjcmlwdCBlbmdpbmUgbWFuYWdlciB0byB1c2UuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObyAtIGRlZmF1bHQgaXMgImF1dG8iPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+c3JjPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIEZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0Ci0gICAgICA8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnNldGJlYW5zPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hldGhlciB0byBoYXZlIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzIGFzCi0gICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlIHNjcmlwdC4gIDxlbT5zaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzICJ0cnVlIi48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGg8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgVGhlIGNsYXNzcGF0aCB0byBwYXNzIGludG8gdGhlIHNjcmlwdC4KLSAgICAgIDwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEKLSAgICAgICAgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0gIDxwPgotICAgIFRoaXMgZmlsZW5hbWUgbWFwcGVyIGNhbiB0YWtlIGEgbmVzdGVkICZsdDtjbGFzc3BhdGgmZ3Q7IGVsZW1lbnQuCi0gICAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCi0gICAgb24gaG93IHRvIHVzZSB0aGlzIGVsZW1lbnQuCi0gIDwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bGFuZ3VhZ2U8L3RkPgorICAgIDx0ZD5TY3JpcHRpbmcgbGFuZ3VhZ2U8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPm1hbmFnZXI8L3RkPgorICAgIDx0ZD5UaGUgc2NyaXB0IGVuZ2luZSBtYW5hZ2VyIHRvIHVzZS4gU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCisgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+YXV0bzwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNyYzwvdGQ+CisgICAgPHRkPkZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgYXMgYSBmaWxlLiA8ZW0+U2luY2UgQW50IDEuMTAuMjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+c2V0YmVhbnM8L3RkPgorICAgIDx0ZD53aGV0aGVyIHRvIGhhdmUgYWxsIHByb3BlcnRpZXMsIHJlZmVyZW5jZXMgYW5kIHRhcmdldHMgYXMgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUKKyAgICAgIHNjcmlwdC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jbGFzc3BhdGhyZWY8L3RkPgorICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHRvIHVzZSwgZ2l2ZW4gYXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVyZW5jZTwvYT4gdG8gYQorICAgICAgcGF0aCBkZWZpbmVkIGVsc2V3aGVyZS4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxwPlRoaXMgZmlsZW5hbWUgbWFwcGVyIGNhbiB0YWtlIGEgbmVzdGVkIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50LiAgU2VlCit0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzayBvbiBob3cgdG8gdXNlIHRoaXMgZWxlbWVudC48L3A+CiAKLTxwPgotICA8Yj5FeGFtcGxlOjwvYj4KLTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8aDU+RXhhbXBsZTwvaDU+Cis8cHJlPgogJmx0O3NjcmlwdG1hcHBlciBsYW5ndWFnZT0iamF2YXNjcmlwdCImZ3Q7CiAgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9VcHBlckNhc2UoKSk7CiAgIHNlbGYuYWRkTWFwcGVkTmFtZShzb3VyY2UudG9Mb3dlckNhc2UoKSk7Ci0mbHQ7L3NjcmlwdG1hcHBlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvc2NyaXB0bWFwcGVyJmd0OzwvcHJlPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5Tb3VyY2UgZmlsZSBuYW1lPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UYXJnZXQgZmlsZSBuYW1lczwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5Tb3VyY2UgZmlsZSBuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFyZ2V0IGZpbGUgbmFtZXM8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0iY2VudGVyIiByb3dzcGFuPSIyIj48Y29kZT5mb29cYmFyXEEuamF2YTwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Rk9PXEJBUlxBLkpBVkE8L2NvZGU+PC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+PGNvZGU+Zm9vXGJhclxBLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Rk9PXEJBUlxBLkpBVkE8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vXGJhclxhLmphdmE8L2NvZGU+PC90ZD4KKyAgICA8dGQ+PGNvZGU+Zm9vXGJhclxhLmphdmE8L2NvZGU+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPgotVG8gdXNlIHRoaXMgbWFwcGVyLCB0aGUgc2NyaXB0cyBuZWVkIGFjY2VzcyB0byB0aGUgc291cmNlIGZpbGUsCi1hbmQgdGhlIGFiaWxpdHkgdG8gcmV0dXJuIG11bHRpcGxlIG1hcHBpbmdzLiBIZXJlIGFyZSB0aGUgcmVsZXZhbnQgYmVhbnMgYW5kCi10aGVpciBtZXRob2RzLiBUaGUgc2NyaXB0IGlzIGNhbGxlZCBvbmNlIGZvciBldmVyeSBzb3VyY2UgZmlsZSwgd2l0aCB0aGUKLWxpc3Qgb2YgbWFwcGVkIG5hbWVzIHJlc2V0IGFmdGVyIGV2ZXJ5IGludm9jYXRpb24uCis8cD5UbyB1c2UgdGhpcyBtYXBwZXIsIHRoZSBzY3JpcHRzIG5lZWQgYWNjZXNzIHRvIHRoZSBzb3VyY2UgZmlsZSwgYW5kIHRoZSBhYmlsaXR5IHRvIHJldHVybgorbXVsdGlwbGUgbWFwcGluZ3MuIEhlcmUgYXJlIHRoZSByZWxldmFudCBiZWFucyBhbmQgdGhlaXIgbWV0aG9kcy4gVGhlIHNjcmlwdCBpcyBjYWxsZWQgb25jZSBmb3IKK2V2ZXJ5IHNvdXJjZSBmaWxlLCB3aXRoIHRoZSBsaXN0IG9mIG1hcHBlZCBuYW1lcyByZXNldCBhZnRlciBldmVyeSBpbnZvY2F0aW9uLjwvcD4KIAotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U2NyaXB0IGJlYW48L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+c291cmNlOiBTdHJpbmc8L2NvZGU+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIFRoZSBmaWxlL3BhdGggdG8gbWFwCi0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5zZWxmPC9jb2RlPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICB0aGUgc2NyaXB0bWFwcGVyIGl0c2VsZgotICAgICAgPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+c2VsZi5hZGRNYXBwZWROYW1lKFN0cmluZyBuYW1lKTwvY29kZT48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgQWRkIGEgbmV3IG1hcHBpbmcKLSAgICAgIDwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPnNlbGYuY2xlYXIoKTwvY29kZT48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgUmVzZXQgdGhlIGxpc3Qgb2YgZmlsZXMuCi0gICAgICA8L3RkPgotICAgIDwvdHI+Ci0gICAgPC90YWJsZT4KKzx0YWJsZT4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5TY3JpcHQgYmVhbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD48Y29kZT5zb3VyY2U6IFN0cmluZzwvY29kZT48L3RkPgorICAgIDx0ZD5UaGUgZmlsZS9wYXRoIHRvIG1hcDwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+c2VsZjwvY29kZT48L3RkPgorICAgIDx0ZD5UaGUgc2NyaXB0bWFwcGVyIGl0c2VsZjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+c2VsZi5hZGRNYXBwZWROYW1lKFN0cmluZyBuYW1lKTwvY29kZT48L3RkPgorICAgIDx0ZD5BZGQgYSBuZXcgbWFwcGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+PGNvZGU+c2VsZi5jbGVhcigpPC9jb2RlPjwvdGQ+CisgICAgPHRkPlJlc2V0IHRoZSBsaXN0IG9mIGZpbGVzPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CiAKLSAgPHA+VGhlIHNjcmlwdG1hcHBlciBoYXMgbm8gY29ycmVzcG9uZGluZwotICAgIDxjb2RlPiZsdDttYXBwZXIgPGI+dHlwZTwvYj4mZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUuCi0gIDwvcD4KKzxwPlRoZSBzY3JpcHRtYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IDx2YXI+dHlwZTwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi08aDQ+PGEgbmFtZT0iZmlyc3RtYXRjaC1tYXBwZXIiPmZpcnN0bWF0Y2htYXBwZXIgKHNpbmNlIEFudCAxLjguMCk8L2E+PC9oND4KLSAgICA8cD4KLSAgICAgIFRoaXMgbWFwcGVyIHN1cHBvcnRzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgbmVzdGVkIG1hcHBlcnMgYW5kCi0gICAgICByZXR1cm5zIHRoZSByZXN1bHRzIG9mIHRoZSBmaXJzdCBtYXBwZXIgdGhhdCBtYXRjaGVzLiAgVGhpcyBpcwotICAgICAgZGlmZmVyZW50IGZyb20gPGEgaHJlZj0iI2NvbXBvc2l0ZS1tYXBwZXIiPmNvbXBvc2l0ZSBtYXBwZXI8L2E+Ci0gICAgICB3aGljaCBjb2xsZWN0cyB0aGUgcmVzdWx0cyBvZiBhbGwgbWF0Y2hpbmcgY2hpbGRyZW4uPC9wPgotPGI+RXhhbXBsZXM6PC9iPgotPGJsb2NrcXVvdGU+PHByZT4KKzxoNCBpZD0iZmlyc3RtYXRjaC1tYXBwZXIiPmZpcnN0bWF0Y2htYXBwZXI8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC9wPgorPHA+VGhpcyBtYXBwZXIgc3VwcG9ydHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBuZXN0ZWQgbWFwcGVycyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QKK21hcHBlciB0aGF0IG1hdGNoZXMuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIDxhIGhyZWY9IiNjb21wb3NpdGUtbWFwcGVyIj5jb21wb3NpdGUgbWFwcGVyPC9hPiB3aGljaAorY29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgYWxsIG1hdGNoaW5nIGNoaWxkcmVuLjwvcD4KKzxoNT5FeGFtcGxlczwvaDU+Cis8cHJlPgogJmx0O2ZpcnN0bWF0Y2htYXBwZXImZ3Q7CiAgICZsdDtnbG9ibWFwcGVyIGZyb209IioudHh0IiB0bz0iKi5iYWsiLyZndDsKICAgJmx0O2dsb2JtYXBwZXIgZnJvbT0iKkEuKiIgdG89IipCLioiLyZndDsKLSZsdDsvZmlyc3RtYXRjaG1hcHBlciZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlyc3RtYXRjaG1hcHBlciZndDs8L3ByZT4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+U291cmNlIGZpbGUgbmFtZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+VGFyZ2V0IGZpbGUgbmFtZXM8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+U291cmNlIGZpbGUgbmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhcmdldCBmaWxlIG5hbWVzPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+PGNvZGU+Zm9vL2Jhci9BLnR4dDwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+Zm9vL2Jhci9BLmJhazwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0EudHh0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvby9iYXIvQS5iYWs8L2NvZGU+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249ImNlbnRlciI+PGNvZGU+Zm9vL2Jhci9BLmphdmE8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvby9iYXIvQS5qYXZhPC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmZvby9iYXIvQi5qYXZhPC9jb2RlPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi0gIDxwPlRoZSBmaXJzdG1hdGNobWFwcGVyIGhhcyBubyBjb3JyZXNwb25kaW5nCi0gICAgPGNvZGU+Jmx0O21hcHBlciA8Yj50eXBlPC9iPiZndDs8L2NvZGU+IGF0dHJpYnV0ZS4KLSAgPC9wPgorPHA+VGhlIGZpcnN0bWF0Y2htYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IDx2YXI+dHlwZTwvdmFyPgorYXR0cmlidXRlLjwvcD4KIAotPGg0PjxhIG5hbWU9ImN1dGRpcnMtbWFwcGVyIj5jdXRkaXJzbWFwcGVyIChzaW5jZSBBbnQgMS44LjIpPC9hPjwvaDQ+Cis8aDQgaWQ9ImN1dGRpcnMtbWFwcGVyIj5jdXRkaXJzbWFwcGVyPC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvcD4KKzxwPlRoaXMgbWFwcGVyIHN0cmlwcyBhIGNvbmZpZ3VyZWQgbnVtYmVyIG9mIGxlYWRpbmcgZGlyZWN0b3JpZXMgZnJvbSB0aGUgc291cmNlIGZpbGUgbmFtZS48L3A+CiAKLTxwPlRoaXMgbWFwcGVyIHN0cmlwcyBhIGNvbmZpZ3VyZWQgbnVtYmVyIG9mIGxlYWRpbmcgZGlyZWN0b3JpZXMgZnJvbQotICB0aGUgc291cmNlIGZpbGUgbmFtZS48L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4mbHQ7Y3V0ZGlyc21hcHBlciBkaXJzPSIxIi8mZ3Q7PC9wcmU+CiAKLTxiPkV4YW1wbGVzOjwvYj4KLTxibG9ja3F1b3RlPjxwcmU+Ci0mbHQ7Y3V0ZGlyc21hcHBlciBkaXJzPSIxIi8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci0KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlNvdXJjZSBmaWxlIG5hbWU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPlRhcmdldCBmaWxlIG5hbWVzPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPlNvdXJjZSBmaWxlIG5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXJnZXQgZmlsZSBuYW1lczwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJjZW50ZXIiPjxjb2RlPmZvby9iYXIvQS50eHQ8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPmJhci9BLnR4dDwvY29kZT48L3RkPgorICAgIDx0ZD48Y29kZT5mb28vYmFyL0EudHh0PC9jb2RlPjwvdGQ+CisgICAgPHRkPjxjb2RlPmJhci9BLnR4dDwvY29kZT48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+VGhlIGN1dGRpcnNtYXBwZXIgaGFzIG5vCi1jb3JyZXNwb25kaW5nIDxjb2RlPiZsdDttYXBwZXIgPGI+dHlwZTwvYj4mZ3Q7PC9jb2RlPiBhdHRyaWJ1dGUuPC9wPgorPHA+VGhlIGN1dGRpcnNtYXBwZXIgaGFzIG5vIGNvcnJlc3BvbmRpbmcgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IDx2YXI+dHlwZTwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlyczwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBOdW1iZXIgb2YgZGlyZWN0b3JpZXMgdG8gc3RyaXAgKG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIpLgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kaXJzPC90ZD4KKyAgICA8dGQ+TnVtYmVyIG9mIGRpcmVjdG9yaWVzIHRvIHN0cmlwIChtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyKS48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL211bHRpcm9vdGZpbGVzZXQuaHRtbCBiL21hbnVhbC9UeXBlcy9tdWx0aXJvb3RmaWxlc2V0Lmh0bWwKaW5kZXggMjlhNGY1NC4uNTFjNTBhNCAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL211bHRpcm9vdGZpbGVzZXQuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvbXVsdGlyb290ZmlsZXNldC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTYwICsxNSwxMzcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPk11bHRpUm9vdEZpbGVTZXQgVHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ibXVsdGlyb290ZmlsZXNldCI+TXVsdGlSb290RmlsZVNldDwvYT48L2gyPgorPGgyIGlkPSJtdWx0aXJvb3RmaWxlc2V0Ij5NdWx0aVJvb3RGaWxlU2V0PC9oMj4KIAogPHA+PGVtPlNpbmNlIEFudCAxLjkuNDwvZW0+PC9wPgogCi08cD5BIE11bHRpUm9vdEZpbGVTZXQgaXMgYSBncm91cCBvZiBmaWxlcyBvciBkaXJlY3Rvcmllcy4gVGhlc2UgZmlsZXMKLW9yIGRpcmVjdG9yaWVzIGNhbiBiZSBmb3VuZCBpbiBhIGRpcmVjdG9yeSBmb3JyZXN0IHN0YXJ0aW5nIHdpdGggYSBzZXQKLW9mIGJhc2UgZGlyZWN0b3JpZXMgYW5kIGFyZSBtYXRjaGVkIGJ5IHBhdHRlcm5zIHRha2VuIGZyb20gYSBudW1iZXIgb2YKLTxhIGhyZWY9InBhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldHM8L2E+IGFuZCA8YQotaHJlZj0ic2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yczwvYT4uPC9wPgorPHA+QSBNdWx0aVJvb3RGaWxlU2V0IGlzIGEgZ3JvdXAgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMuIFRoZXNlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGNhbiBiZQorZm91bmQgaW4gYSBkaXJlY3RvcnkgZm9ycmVzdCBzdGFydGluZyB3aXRoIGEgc2V0IG9mIGJhc2UgZGlyZWN0b3JpZXMgYW5kIGFyZSBtYXRjaGVkIGJ5IHBhdHRlcm5zCit0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhIGhyZWY9InBhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldHM8L2E+CithbmQgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yczwvYT4uPC9wPgogCi08cD5NdWx0aVJvb3RGaWxlU2V0IGFjdHMgYXMgYSB1bmlvbiBvZiA8YQotaHJlZj0iZmlsZXNldC5odG1sIj5GaWxlU2V0czwvYT4gYW5kIDxhIGhyZWY9ImRpcnNldC5odG1sIj5EaXJTZXRzPC9hPgotdGhhdCBzaGFyZSB0aGUgc2FtZSBwYXR0ZXJucyBhbmQgc2VsZWN0b3JzLjwvcD4KKzxwPk11bHRpUm9vdEZpbGVTZXQgYWN0cyBhcyBhIHVuaW9uIG9mIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+RmlsZVNldHM8L2E+CithbmQgPGEgaHJlZj0iZGlyc2V0Lmh0bWwiPkRpclNldHM8L2E+IHRoYXQgc2hhcmUgdGhlIHNhbWUgcGF0dGVybnMgYW5kIHNlbGVjdG9ycy48L3A+CiAKLTxwPk11bHRpUm9vdEZpbGVTZXQgc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBvZgotRmlsZVNldCBhbmQgRGlyU2V0IGV4Y2VwdCBmb3IgdGhlICJkaXIiIGF0dHJpYnV0ZS48L3A+Cis8cD5NdWx0aVJvb3RGaWxlU2V0IHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgb2YgRmlsZVNldCBhbmQgRGlyU2V0IGV4Y2VwdCBmb3IKK3RoZSA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJhc2VkaXJzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgYnVpbGQKLSAgICB0aGUgcm9vdHMgb2YgdGhlIE11bHRpUm9vdEZpbGVTZXQuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YmFzZWRpcnM8L3RkPgorICAgIDx0ZD5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IGJ1aWxkIHRoZSByb290cyBvZiB0aGUgTXVsdGlSb290RmlsZVNldC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nCi0gICAgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50eXBlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB0eXBlIG9mIGZpbGUgc3lzdGVtIGVudGl0aWVzIHdoaWNoIHdpbGwgYmUKLSAgICBpbmNsdWRlZCBpbiB0aGlzIHNldC4KLSAgICBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6CisgICAgPHRkPnR5cGU8L3RkPgorICAgIDx0ZD5UaGUgdHlwZSBvZiBmaWxlIHN5c3RlbSBlbnRpdGllcyB3aGljaCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoaXMgc2V0LiAgQWNjZXB0YWJsZSB2YWx1ZXMKKyAgICBhcmU6CiAgICAgPHVsPgotICAgICAgPGxpPmZpbGUgLSByZWd1bGFyIGZpbGVzPC9saT4KLSAgICAgIDxsaT5kaXIgLSBkaXJlY3RvcmllczwvbGk+Ci0gICAgICA8bGk+Ym90aCAtIHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzPC9saT4KKyAgICAgIDxsaT48cT5maWxlPC9xPiZtZGFzaDtyZWd1bGFyIGZpbGVzPC9saT4KKyAgICAgIDxsaT48cT5kaXI8L3E+Jm1kYXNoO2RpcmVjdG9yaWVzPC9saT4KKyAgICAgIDxsaT48cT5ib3RoPC9xPiZtZGFzaDtyZWd1bGFyIGZpbGVzIGFuZCBkaXJlY3RvcmllczwvbGk+CiAgICAgPC91bD4KICAgICA8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIDxpPmZpbGU8L2k+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmZpbGU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBjb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZGlyZWN0b3JpZXMgdGhhdAotICAgICBtdXN0IGJlIGluY2x1ZGVkOyBhbGwgZGlyZWN0b3JpZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPkEgY29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGRpcmVjdG9yaWVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gYWxsIGRpcmVjdG9yaWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5jbHVkZXNmaWxlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcwotICAgICAgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmluY2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPk5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgY29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGRpcmVjdG9yaWVzIHRoYXQKLSAgICAgbXVzdCBiZSBleGNsdWRlZDsgbm8gZGlyZWN0b3JpZXMgYXJlIGV4Y2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlczwvdGQ+CisgICAgPHRkPkEgY29tbWEtIG9yIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIG9mIGRpcmVjdG9yaWVzIHRoYXQgbXVzdCBiZSBleGNsdWRlZC48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gbm9uZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZD5OYW1lIG9mIGEgZmlsZTsgZWFjaCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jYXNlc2Vuc2l0aXZlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB3aGV0aGVyIGNhc2Utc2Vuc2l0aXZpdHkgc2hvdWxkIGJlIGFwcGxpZWQKLSAgICAgKDxjb2RlPnRydWU8L2NvZGU+fDxjb2RlPnllczwvY29kZT58PGNvZGU+b248L2NvZGU+IG9yCi0gICAgIDxjb2RlPmZhbHNlPC9jb2RlPnw8Y29kZT5ubzwvY29kZT58PGNvZGU+b2ZmPC9jb2RlPikuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vOyBkZWZhdWx0cyB0byB0cnVlLjwvdGQ+CisgICAgPHRkPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZD5TcGVjaWZpZXMgd2hldGhlciBjYXNlLXNlbnNpdGl2aXR5IHNob3VsZCBiZSBhcHBsaWVkICg8cT50cnVlPC9xPiwgPHE+eWVzPC9xPiwgPHE+b248L3E+CisgICAgIG9yIDxxPmZhbHNlPC9xPiwgPHE+bm88L3E+LCA8cT5vZmY8L3E+KS48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5mb2xsb3dzeW1saW5rczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TaGFsbCBzeW1ib2xpYyBsaW5rcyBiZSBmb2xsb3dlZD8gRGVmYXVsdHMgdG8KLSAgICAgIHRydWUuIFNlZSA8YSBocmVmPSJmaWxlc2V0Lmh0bWwjc3ltbGluayI+ZmlsZXNldCdzIGRvY3VtZW50YXRpb248L2E+LjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmZvbGxvd3N5bWxpbmtzPC90ZD4KKyAgICA8dGQ+U2hhbGwgc3ltYm9saWMgbGlua3MgYmUgZm9sbG93ZWQ/IFNlZSA8YSBocmVmPSJmaWxlc2V0Lmh0bWwjc3ltbGluayI+ZmlsZXNldCdzCisgICAgICBkb2N1bWVudGF0aW9uPC9hPi48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcm9ubWlzc2luZ2RpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgIFNwZWNpZnkgd2hhdCBoYXBwZW5zIGlmIG9uZSBvZiB0aGUgYmFzZSBkaXJlY3RvcmllcyBkb2VzIG5vdCBleGlzdC4KLSAgICAgIElmIHRydWUgYSBidWlsZCBlcnJvciB3aWxsIGhhcHBlbiwgaWYgZmFsc2UsIHRoZSBzdWJ0cmVlCi0gICAgICB3aWxsIGJlIGlnbm9yZWQvZW1wdHkuCi0gICAgICBEZWZhdWx0cyB0byB0cnVlLgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmVycm9yb25taXNzaW5nZGlyPC90ZD4KKyAgICA8dGQ+U3BlY2lmeSB3aGF0IGhhcHBlbnMgaWYgb25lIG9mIHRoZSBiYXNlIGRpcmVjdG9yaWVzIGRvZXMgbm90IGV4aXN0LiAgSWYgPHE+dHJ1ZTwvcT4gYQorICAgICAgYnVpbGQgZXJyb3Igd2lsbCBoYXBwZW4sIGlmIDxxPmZhbHNlPC9xPiwgdGhlIHN1YnRyZWUgd2lsbCBiZSBpZ25vcmVkL2VtcHR5LjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPHA+UGF0dGVyblNldHMgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEluIGFkZGl0aW9uLCBNdWx0aVJvb3RGaWxlU2V0IGhvbGRzCi1hbiBpbXBsaWNpdCBQYXR0ZXJuU2V0IGFuZCBzdXBwb3J0cyB0aGUgbmVzdGVkCi08Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7aW5jbHVkZXNmaWxlJmd0OzwvY29kZT4sCi08Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZXNmaWxlJmd0OzwvY29kZT4KLWVsZW1lbnRzIG9mIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZGlyZWN0bHksIGFzIHdlbGwgYXMKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4ncyBhdHRyaWJ1dGVzLjwvcD4KKzxwPlBhdHRlcm5TZXRzIGNhbiBiZSBzcGVjaWZpZWQgYXMgbmVzdGVkIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEluIGFkZGl0aW9uLAorTXVsdGlSb290RmlsZVNldCBob2xkcyBhbiBpbXBsaWNpdCBQYXR0ZXJuU2V0IGFuZCBzdXBwb3J0cyB0aGUKK25lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7aW5jbHVkZXNmaWxlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7ZXhjbHVkZXNmaWxlJmd0OzwvY29kZT4gZWxlbWVudHMgb2YgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPiBkaXJlY3RseSwgYXMKK3dlbGwgYXMgPGNvZGU+Jmx0O3BhdHRlcm5zZXQmZ3Q7PC9jb2RlPidzIGF0dHJpYnV0ZXMuPC9wPgogCi08cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZQotTXVsdGlSb290RmlsZVNldC4gIElmIGFueSBvZiB0aGUgc2VsZWN0b3JzIHdpdGhpbiB0aGUgTXVsdGlSb290RmlsZVNldAotZG8gbm90IHNlbGVjdCB0aGUgZmlsZSBvciBkaXJlY3RvcnksIGl0IGlzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlCi1NdWx0aVJvb3RGaWxlU2V0LiBUaGlzIG1ha2VzIGEgTXVsdGlSb290RmlsZVNldCBlcXVpdmFsZW50IHRvCis8cD5TZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQgZWxlbWVudHMgd2l0aGluIHRoZSBNdWx0aVJvb3RGaWxlU2V0LiAgSWYgYW55IG9mIHRoZQorc2VsZWN0b3JzIHdpdGhpbiB0aGUgTXVsdGlSb290RmlsZVNldCBkbyBub3Qgc2VsZWN0IHRoZSBmaWxlIG9yIGRpcmVjdG9yeSwgaXQgaXMgbm90IGNvbnNpZGVyZWQKK3BhcnQgb2YgdGhlIE11bHRpUm9vdEZpbGVTZXQuIFRoaXMgbWFrZXMgYSBNdWx0aVJvb3RGaWxlU2V0IGVxdWl2YWxlbnQgdG8KIGFuIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBjb250YWluZXIuPC9wPgogCi08cD5JbiBhZGRpdGlvbiBiYXNlZGlycyBmb3IgdGhlIE11bHRpUm9vdEZpbGVTZXQgY2FuIGJlIHNwZWNpZmllZCBhcwotICBuZXN0ZWQgPGNvZGU+YmFzZWRpcjwvY29kZT4gZWxlbWVudHMgdGhhdCBoYXZlIGEKLSAgc2luZ2xlIDxjb2RlPmZpbGU8L2NvZGU+IGF0dHJpYnV0ZS48L3A+Cis8cD5JbiBhZGRpdGlvbiBiYXNlZGlycyBmb3IgdGhlIE11bHRpUm9vdEZpbGVTZXQgY2FuIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgPGNvZGU+YmFzZWRpcjwvY29kZT4KK2VsZW1lbnRzIHRoYXQgaGF2ZSBhIHNpbmdsZSA8dmFyPmZpbGU8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAorPGgzPkV4YW1wbGVzPC9oMz4KIAotPGg0PkV4YW1wbGVzPC9oND4KLQotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7bXVsdGlyb290ZmlsZXNldCBiYXNlZGlycz0mcXVvdDske2J1aWxkLmRpcn0sJHtvdGhlci5wcm9qZWN0LmRpcn0mcXVvdDsmZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi9jbGFzc2VzJnF1b3Q7LyZndDsKICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqLypUZXN0KiZxdW90Oy8mZ3Q7CiAmbHQ7L211bHRpcm9vdGZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5Hcm91cHMgYWxsIGZpbGVzIGluc2lkZSA8Y29kZT5jbGFzc2VzPC9jb2RlPiBmb3VuZCB1bmRlciB0aGUKLTxjb2RlPmFwcHM8L2NvZGU+IHN1YmRpcmVjdG9yeSBvZiA8Y29kZT4ke2J1aWxkLmRpcn08L2NvZGU+IG9yCi08Y29kZT4ke290aGVyLnByb2plY3QuZGlyfTwvY29kZT4sIGV4Y2VwdCB0aG9zZSB0aGF0IGhhdmUgdGhlIHRleHQKLTxjb2RlPlRlc3Q8L2NvZGU+IGluIHRoZWlyIG5hbWUuPC9wPgorPC9wcmU+Cis8cD5Hcm91cHMgYWxsIGZpbGVzIGluc2lkZSA8c2FtcD5jbGFzc2VzPC9zYW1wPiBmb3VuZCB1bmRlciB0aGUgPHNhbXA+YXBwczwvc2FtcD4gc3ViZGlyZWN0b3J5CitvZiA8c2FtcD4ke2J1aWxkLmRpcn08L3NhbXA+IG9yIDxzYW1wPiR7b3RoZXIucHJvamVjdC5kaXJ9PC9zYW1wPiwgZXhjZXB0IHRob3NlIHRoYXQgaGF2ZSB0aGUKK3RleHQgPHNhbXA+VGVzdDwvc2FtcD4gaW4gdGhlaXIgbmFtZS48L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O211bHRpcm9vdGZpbGVzZXQmZ3Q7CiAgICZsdDtiYXNlZGlyIGZpbGU9JnF1b3Q7JHtidWlsZC5kaXJ9JnF1b3Q7LyZndDsKICAgJmx0O2Jhc2VkaXIgZmlsZT0mcXVvdDske290aGVyLnByb2plY3QuZGlyfSZxdW90OwogICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90O2FwcHMvKiovY2xhc3NlcyZxdW90Oy8mZ3Q7CiAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi8qVGVzdComcXVvdDsvJmd0OwogJmx0Oy9tdWx0aXJvb3RmaWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+SXMgZXF1aXZhbGVudCB0byB0aGUgZmlyc3QgZXhhbXBsZSBidXQgdXNlZAotICBuZXN0ZWQgPGNvZGU+YmFzZWRpcjwvY29kZT4gZWxlbWVudHMuICBUaGUgbmVzdGVkIGVsZW1lbnRzIGFuZAotICB0aGUgPGNvZGU+YmFzZWRpcnM8L2NvZGU+IGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lIGFuZAotICB0aGUgd2lsbCBiZSBtZXJnZWQuPC9wPgorPC9wcmU+Cis8cD5JcyBlcXVpdmFsZW50IHRvIHRoZSBmaXJzdCBleGFtcGxlIGJ1dCB1c2VkIG5lc3RlZCA8Y29kZT5iYXNlZGlyPC9jb2RlPiBlbGVtZW50cy4gIFRoZSBuZXN0ZWQKK2VsZW1lbnRzIGFuZCB0aGUgPHZhcj5iYXNlZGlyczwvdmFyPiBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZSBhbmQgdGhlIHdpbGwgYmUKK21lcmdlZC48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL25hbWVzcGFjZS5odG1sIGIvbWFudWFsL1R5cGVzL25hbWVzcGFjZS5odG1sCmluZGV4IDNhZGZhODAuLjQ4YzVmMTQgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9uYW1lc3BhY2UuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvbmFtZXNwYWNlLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNDYgKzE1LDE0MiBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KLTxodG1sPjxoZWFkPjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Ci08dGl0bGU+WG1sTmFtZXNwYWNlU3VwcG9ydDwvdGl0bGU+PC9oZWFkPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CisgIDx0aXRsZT5YbWxOYW1lc3BhY2VTdXBwb3J0PC90aXRsZT4KKzwvaGVhZD4KICAgPGJvZHk+Ci0gICAgPGgyPjxhIG5hbWU9Im5hbWVzcGFjZSI+WE1MIE5hbWVzcGFjZSBTdXBwb3J0PC9hPjwvaDI+Ci0gICAgQXBhY2hlIEFudCAxLjYgaW50cm9kdWNlcyBzdXBwb3J0IGZvciBYTUwgbmFtZXNwYWNlcy4gCisgICAgPGgyIGlkPSJuYW1lc3BhY2UiPlhNTCBOYW1lc3BhY2UgU3VwcG9ydDwvaDI+CisgICAgQXBhY2hlIEFudCAxLjYgaW50cm9kdWNlcyBzdXBwb3J0IGZvciBYTUwgbmFtZXNwYWNlcy4KICAgICA8aDM+SGlzdG9yeTwvaDM+Ci0gICAgCisKICAgICA8cD4KLSAgICAgIEFsbCByZWxlYXNlcyBvZiBBbnQgcHJpb3IgdG8gQW50IDEuNiBkbyBub3Qgc3VwcG9ydCBYTUwgbmFtZXNwYWNlcy4KLSAgICAgIE5vIHN1cHBvcnQgYmFzaWNhbGx5IGltcGxpZXMgdHdvIHRoaW5ncyBoZXJlOgorICAgICAgQWxsIHJlbGVhc2VzIG9mIEFudCBwcmlvciB0byBBbnQgMS42IGRvIG5vdCBzdXBwb3J0IFhNTCBuYW1lc3BhY2VzLiAgTm8gc3VwcG9ydCBiYXNpY2FsbHkKKyAgICAgIGltcGxpZXMgdHdvIHRoaW5ncyBoZXJlOgogICAgIDwvcD4KICAgICA8dWw+Ci0gICAgICA8bGk+IEVsZW1lbnQgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgInFuYW1lIiBvZiB0aGUgdGFncywgd2hpY2ggaXMKLSAgICAgICAgdXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgbG9jYWwgbmFtZS4gQnV0IGlmIHRoZSBidWlsZCBmaWxlIHdyaXRlciB1c2VzCi0gICAgICAgIGNvbG9ucyBpbiBuYW1lcyBvZiBkZWZpbmVkIHRhc2tzL3R5cGVzLCB0aG9zZSBiZWNvbWUgcGFydCBvZiB0aGUKLSAgICAgICAgZWxlbWVudCBuYW1lLiBUdXJuaW5nIG9uIG5hbWVzcGFjZSBzdXBwb3J0IGdpdmVzIGNvbG9uLXNlcGFyYXRlZAotICAgICAgICBwcmVmaXhlcyBpbiB0YWcgbmFtZXMgYSBzcGVjaWFsIG1lYW5pbmcsIGFuZCB0aHVzIGJ1aWxkIGZpbGVzIHVzaW5nCisgICAgICA8bGk+RWxlbWVudCBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSAicW5hbWUiIG9mIHRoZSB0YWdzLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBzYW1lIGFzIHRoZQorICAgICAgICBsb2NhbCBuYW1lLiBCdXQgaWYgdGhlIGJ1aWxkIGZpbGUgd3JpdGVyIHVzZXMgY29sb25zIGluIG5hbWVzIG9mIGRlZmluZWQgdGFza3MvdHlwZXMsCisgICAgICAgIHRob3NlIGJlY29tZSBwYXJ0IG9mIHRoZSBlbGVtZW50IG5hbWUuIFR1cm5pbmcgb24gbmFtZXNwYWNlIHN1cHBvcnQgZ2l2ZXMKKyAgICAgICAgY29sb24tc2VwYXJhdGVkIHByZWZpeGVzIGluIHRhZyBuYW1lcyBhIHNwZWNpYWwgbWVhbmluZywgYW5kIHRodXMgYnVpbGQgZmlsZXMgdXNpbmcKICAgICAgICAgY29sb25zIGluIHVzZXItZGVmaW5lZCB0YXNrcyBhbmQgdHlwZXMgd2lsbCBicmVhay4KICAgICAgIDwvbGk+Ci0gICAgICA8bGk+IEF0dHJpYnV0ZXMgd2l0aCB0aGUgbmFtZXMgJ3htbG5zJyBhbmQgJ3htbG5zOjxjb2RlPiZsdDtwcmVmaXgmZ3Q7PC9jb2RlPicKLSAgICAgICAgYXJlIG5vdCB0cmVhdGVkIHNwZWNpYWxseSwgd2hpY2ggbWVhbnMgdGhhdCBjdXN0b20gdGFza3MgYW5kIHR5cGVzIGhhdmUKLSAgICAgICAgYWN0dWFsbHkgYmVlbiBhYmxlIHRvIHVzZSBzdWNoIGF0dHJpYnV0ZXMgYXMgcGFyYW1ldGVyIG5hbWVzLiBBZ2FpbiwKLSAgICAgICAgc3VjaCB0YXNrcy90eXBlcyBhcmUgZ29pbmcgdG8gYnJlYWsgd2hlbiBuYW1lc3BhY2Ugc3VwcG9ydCBpcyBlbmFibGVkCi0gICAgICAgIG9uIHRoZSBwYXJzZXIuCisgICAgICA8bGk+QXR0cmlidXRlcyB3aXRoIHRoZSBuYW1lcyA8cT54bWxuczwvcT4gYW5kIDxxPnhtbG5zOjxlbT5wcmVmaXg8L2VtPjwvcT4gYXJlIG5vdAorICAgICAgICB0cmVhdGVkIHNwZWNpYWxseSwgd2hpY2ggbWVhbnMgdGhhdCBjdXN0b20gdGFza3MgYW5kIHR5cGVzIGhhdmUgYWN0dWFsbHkgYmVlbiBhYmxlIHRvCisgICAgICAgIHVzZSBzdWNoIGF0dHJpYnV0ZXMgYXMgcGFyYW1ldGVyIG5hbWVzLiBBZ2Fpbiwgc3VjaCB0YXNrcy90eXBlcyBhcmUgZ29pbmcgdG8gYnJlYWsgd2hlbgorICAgICAgICBuYW1lc3BhY2Ugc3VwcG9ydCBpcyBlbmFibGVkIG9uIHRoZSBwYXJzZXIuCiAgICAgICA8L2xpPgogICAgIDwvdWw+Ci0gICAgPHA+VXNlIG9mIGNvbG9ucyBpbiBlbGVtZW50IG5hbWVzIGhhcyBiZWVuIGRpc2NvdXJhZ2VkIGluIHRoZSBwYXN0LAotICAgICAgYW5kIHVzaW5nIGFueSBhdHRyaWJ1dGUgc3RhcnRpbmcgd2l0aCAieG1sIiBpcyBhY3R1YWxseSBzdHJvbmdseQotICAgICAgZGlzY291cmFnZWQgYnkgdGhlIFhNTCBzcGVjIHRvIHJlc2VydmUgc3VjaCBuYW1lcyBmb3IgZnV0dXJlIHVzZS4KKyAgICA8cD5Vc2Ugb2YgY29sb25zIGluIGVsZW1lbnQgbmFtZXMgaGFzIGJlZW4gZGlzY291cmFnZWQgaW4gdGhlIHBhc3QsIGFuZCB1c2luZyBhbnkgYXR0cmlidXRlCisgICAgICBzdGFydGluZyB3aXRoIDxxPnhtbDwvcT4gaXMgYWN0dWFsbHkgc3Ryb25nbHkgZGlzY291cmFnZWQgYnkgdGhlIFhNTCBzcGVjIHRvIHJlc2VydmUgc3VjaAorICAgICAgbmFtZXMgZm9yIGZ1dHVyZSB1c2UuCiAgICAgPC9wPgorCiAgICAgPGgzPk1vdGl2YXRpb248L2gzPgorICAgIDxwPkluIGJ1aWxkIGZpbGVzIHVzaW5nIGEgbG90IG9mIGN1c3RvbSBhbmQgdGhpcmQtcGFydHkgdGFza3MsIGl0IGlzIGVhc3kgdG8gZ2V0IGludG8gbmFtZQorICAgICAgY29uZmxpY3RzLiBXaGVuIGluZGl2aWR1YWwgdHlwZXMgYXJlIGRlZmluZWQsIHRoZSBidWlsZCBmaWxlIHdyaXRlciBjYW4gZG8gc29tZQorICAgICAgbmFtZXNwYWNpbmcgbWFudWFsbHkgKGZvciBleGFtcGxlLCB1c2luZyA8cT50b21jYXQtZGVwbG95PC9xPiBpbnN0ZWFkIG9mCisgICAgICBqdXN0IDxxPmRlcGxveTwvcT4pLiBCdXQgd2hlbiBkZWZpbmluZyB3aG9sZSBsaWJyYXJpZXMgb2YgdHlwZXMgdXNpbmcKKyAgICAgIHRoZSA8Y29kZT4mbHQ7dHlwZWRlZiZndDs8L2NvZGU+IDx2YXI+cmVzb3VyY2U8L3Zhcj4gYXR0cmlidXRlLCB0aGUgYnVpbGQgZmlsZSB3cml0ZXIgaGFzCisgICAgICBubyBjaGFuY2UgdG8gb3ZlcnJpZGUgb3IgZXZlbiBwcmVmaXggdGhlIG5hbWVzIHN1cHBsaWVkIGJ5IHRoZSBsaWJyYXJ5LjwvcD4KIAotICAgIDxwPkluIGJ1aWxkIGZpbGVzIHVzaW5nIGEgbG90IG9mIGN1c3RvbSBhbmQgdGhpcmQtcGFydHkgdGFza3MsIGl0IGlzCi0gICAgICBlYXN5IHRvIGdldCBpbnRvIG5hbWUgY29uZmxpY3RzLiBXaGVuIGluZGl2aWR1YWwgdHlwZXMgYXJlIGRlZmluZWQsIHRoZQotICAgICAgYnVpbGQgZmlsZSB3cml0ZXIgY2FuIGRvIHNvbWUgbmFtZXNwYWNpbmcgbWFudWFsbHkgKGZvciBleGFtcGxlLCB1c2luZwotICAgICAgInRvbWNhdC1kZXBsb3kiIGluc3RlYWQgb2YganVzdCAiZGVwbG95IikuIEJ1dCB3aGVuIGRlZmluaW5nIHdob2xlCi0gICAgICBsaWJyYXJpZXMgb2YgdHlwZXMgdXNpbmcgdGhlIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gJ3Jlc291cmNlJyBhdHRyaWJ1dGUsIHRoZQotICAgICAgYnVpbGQgZmlsZSB3cml0ZXIgaGFzIG5vIGNoYW5jZSB0byBvdmVycmlkZSBvciBldmVuIHByZWZpeCB0aGUgbmFtZXMKLSAgICAgIHN1cHBsaWVkIGJ5IHRoZSBsaWJyYXJ5LiA8L3A+CiAgICAgPGgzPkFzc2lnbmluZyBOYW1lc3BhY2VzPC9oMz4KLQogICAgIDxwPgotICAgICAgQWRkaW5nIGEgJ3ByZWZpeCcgYXR0cmlidXRlIHRvIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gbWlnaHQgaGF2ZSBiZWVuIGVub3VnaCwKLSAgICAgIGJ1dCBYTUwgYWxyZWFkeSBoYXMgYSB3ZWxsLWtub3duIG1ldGhvZCBmb3IgbmFtZXNwYWNpbmcuIFRodXMsIGluc3RlYWQKLSAgICAgIG9mIGFkZGluZyBhICdwcmVmaXgnIGF0dHJpYnV0ZSwgdGhlIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4KLSAgICAgIHRhc2tzIGdldCBhICd1cmknIGF0dHJpYnV0ZSwgd2hpY2ggc3RvcmVzIHRoZSBVUkkgb2YgdGhlIFhNTCBuYW1lc3BhY2UKLSAgICAgIHdpdGggd2hpY2ggdGhlIHR5cGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQ6Ci0gICAgPC9wPjxwcmU+ICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiIvJmd0OwotICZsdDtteTp0YXNrIHhtbG5zOm15PSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OworICAgICAgQWRkaW5nIGEgPHZhcj5wcmVmaXg8L3Zhcj4gYXR0cmlidXRlIHRvIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gbWlnaHQgaGF2ZSBiZWVuCisgICAgICBlbm91Z2gsIGJ1dCBYTUwgYWxyZWFkeSBoYXMgYSB3ZWxsLWtub3duIG1ldGhvZCBmb3IgbmFtZXNwYWNpbmcuIFRodXMsIGluc3RlYWQgb2YgYWRkaW5nCisgICAgICBhIDx2YXI+cHJlZml4PC92YXI+IGF0dHJpYnV0ZSwgdGhlIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4KKyAgICAgIGFuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHRhc2tzIGdldCBhIDx2YXI+dXJpPC92YXI+IGF0dHJpYnV0ZSwgd2hpY2ggc3RvcmVzIHRoZQorICAgICAgVVJJIG9mIHRoZSBYTUwgbmFtZXNwYWNlIHdpdGggd2hpY2ggdGhlIHR5cGUgc2hvdWxkIGJlIGFzc29jaWF0ZWQ6CisgICAgPC9wPgorICAgIDxwcmU+CismbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiLyZndDsKKyZsdDtteTp0YXNrIHhtbG5zOm15PSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiJmd0OwogICAgIC4uLgotICZsdDsvbXk6dGFzayZndDsKLTwvcHJlPgotICAgIDxwPkFzIHRoZSBhYm92ZSBleGFtcGxlIGRlbW9uc3RyYXRlcywgdGhlIG5hbWVzcGFjZSBVUkkgbmVlZHMgdG8gYmUKLSAgICAgIHNwZWNpZmllZCBhdCBsZWFzdCB0d2ljZTogb25lIHRpbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSAndXJpJyBhdHRyaWJ1dGUsCi0gICAgICBhbmQgYW5vdGhlciB0aW1lIHRvIGFjdHVhbGx5IG1hcCB0aGUgbmFtZXNwYWNlIHRvIG9jY3VycmVuY2VzIG9mCi0gICAgICBlbGVtZW50cyBmcm9tIHRoYXQgbmFtZXNwYWNlLCBieSB1c2luZyB0aGUgJ3htbG5zJyBhdHRyaWJ1dGUuIFRoaXMKLSAgICAgIG1hcHBpbmcgY2FuIGhhcHBlbiBhdCBhbnkgbGV2ZWwgaW4gdGhlIGJ1aWxkIGZpbGU6Ci0gICAgPC9wPjxwcmU+ICZsdDtwcm9qZWN0IG5hbWU9InRlc3QiIHhtbG5zOm15PSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OyAKLSAgICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiIvJmd0OwotICAgJmx0O215OnRhc2smZ3Q7Ci0gICAgIC4uLgotICAgJmx0Oy9teTp0YXNrJmd0OwotICZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9teTp0YXNrJmd0OzwvcHJlPgorICAgIDxwPkFzIHRoZSBhYm92ZSBleGFtcGxlIGRlbW9uc3RyYXRlcywgdGhlIG5hbWVzcGFjZSBVUkkgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGF0IGxlYXN0CisgICAgICB0d2ljZTogb25lIHRpbWUgYXMgdGhlIHZhbHVlIG9mIHRoZSA8dmFyPnVyaTwvdmFyPiBhdHRyaWJ1dGUsIGFuZCBhbm90aGVyIHRpbWUgdG8gYWN0dWFsbHkKKyAgICAgIG1hcCB0aGUgbmFtZXNwYWNlIHRvIG9jY3VycmVuY2VzIG9mIGVsZW1lbnRzIGZyb20gdGhhdCBuYW1lc3BhY2UsIGJ5IHVzaW5nCisgICAgICB0aGUgPHZhcj54bWxuczwvdmFyPiBhdHRyaWJ1dGUuIFRoaXMgbWFwcGluZyBjYW4gaGFwcGVuIGF0IGFueSBsZXZlbCBpbiB0aGUgYnVpbGQgZmlsZToKKyAgICA8L3A+CisgICAgPHByZT4KKyZsdDtwcm9qZWN0IG5hbWU9InRlc3QiIHhtbG5zOm15PSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiJmd0OworICAgICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyIvJmd0OworICAgICZsdDtteTp0YXNrJmd0OworICAgICAgICAuLi4KKyAgICAmbHQ7L215OnRhc2smZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAgICAgPHA+Ci0gICAgICBVc2Ugb2YgYSBuYW1lc3BhY2UgcHJlZml4IGlzIG9mIGNvdXJzZSBvcHRpb25hbC4gVGhlcmVmb3JlCi0gICAgICB0aGUgZXhhbXBsZSBjb3VsZCBhbHNvIGxvb2sgbGlrZSB0aGlzOgotICAgIDwvcD48cHJlPiAmbHQ7cHJvamVjdCBuYW1lPSJ0ZXN0IiZndDsgCi0gICAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iLyZndDsKLSAgICZsdDt0YXNrIHhtbG5zPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OwotICAgICAuLi4KLSAgICZsdDsvdGFzayZndDsKLSAmbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyAgICAgIFVzZSBvZiBhIG5hbWVzcGFjZSBwcmVmaXggaXMgb2YgY291cnNlIG9wdGlvbmFsLiBUaGVyZWZvcmUgdGhlIGV4YW1wbGUgY291bGQgYWxzbyBsb29rCisgICAgICBsaWtlIHRoaXM6CisgICAgPC9wPgorICAgIDxwcmU+CismbHQ7cHJvamVjdCBuYW1lPSJ0ZXN0IiZndDsKKyAgICAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiLyZndDsKKyAgICAmbHQ7dGFzayB4bWxucz0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIiZndDsKKyAgICAgICAgLi4uCisgICAgJmx0Oy90YXNrJmd0OworJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogICAgIDxwPgogICAgICAgSGVyZSwgdGhlIG5hbWVzcGFjZSBpcyBzZXQgYXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGZvciB0aGUgPGNvZGU+Jmx0O3Rhc2smZ3Q7PC9jb2RlPgogICAgICAgZWxlbWVudCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cy4KICAgICA8L3A+Ci0gICAgPGgzPkRlZmF1bHQgbmFtZXNwYWNlPC9oMz4KKworICAgIDxoMz5EZWZhdWx0IE5hbWVzcGFjZTwvaDM+CiAgICAgPHA+Ci0gICAgICBUaGUgZGVmYXVsdCBuYW1lc3BhY2UgdXNlZCBieSBBbnQgaXMgImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudCIuCisgICAgICBUaGUgZGVmYXVsdCBuYW1lc3BhY2UgdXNlZCBieSBBbnQgaXMgPGNvZGU+YW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50PC9jb2RlPi4KICAgICA8L3A+CiAgICAgPHByZT4KICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudCIvJmd0OwogJmx0O3Rhc2smZ3Q7Ci0gICAgICAuLi4uCi0mbHQ7L3Rhc2smZ3Q7Ci0gICAgPC9wcmU+Ci0KLSAgICAgCisgICAgLi4uCismbHQ7L3Rhc2smZ3Q7PC9wcmU+CiAKICAgICA8aDM+TmFtZXNwYWNlcyBhbmQgTmVzdGVkIEVsZW1lbnRzPC9oMz4KLQogICAgIDxwPgotICAgICAgQWxtb3N0IGFsd2F5cyBpbiBBbnQgMS42LCBlbGVtZW50cyBuZXN0ZWQgaW5zaWRlIGEgbmFtZXNwYWNlZAotICAgICAgZWxlbWVudCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGVpciBwYXJlbnQuIFNvIGlmICd0YXNrJyBpbiB0aGUKLSAgICAgIGV4YW1wbGUgYWJvdmUgYWxsb3dlZCBhIG5lc3RlZCAnY29uZmlnJyBlbGVtZW50LCB0aGUgYnVpbGQgZmlsZSBzbmlwcGV0Ci0gICAgICB3b3VsZCBsb29rIGxpa2UgdGhpczoKLSAgICA8L3A+PHByZT4gJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL3Rhc2tzLnByb3BlcnRpZXMiIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7Ci0gJmx0O215OnRhc2sgeG1sbnM6bXk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7Ci0gICAmbHQ7bXk6Y29uZmlnIGE9ImZvbyIgYj0iYmFyIi8mZ3Q7Ci0gICAuLi4KLSAmbHQ7L215OnRhc2smZ3Q7Ci08L3ByZT4KLSAgICA8cD5JZiB0aGUgZWxlbWVudCBhbGxvd3Mgb3IgcmVxdWlyZXMgYSBsb3Qgb2YgbmVzdGVkIGVsZW1lbnRzLCB0aGUKLSAgICAgIHByZWZpeCBuZWVkcyB0byBiZSB1c2VkIGZvciBldmVyeSBuZXN0ZWQgZWxlbWVudC4gTWFraW5nIHRoZSBuYW1lc3BhY2UKLSAgICAgIHRoZSBkZWZhdWx0IGNhbiByZWR1Y2UgdGhlIHZlcmJvc2l0eSBvZiB0aGUgc2NyaXB0OgotICAgIDwvcD48cHJlPiAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIgdXJpPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iLyZndDsKLSAgICAgICAgICAmbHQ7dGFzayB4bWxucz0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+IiZndDsKLSAgICAgICAgICAmbHQ7Y29uZmlnIGE9ImZvbyIgYj0iYmFyIi8mZ3Q7Ci0gICAuLi4KLSAgICAgICAgICAmbHQ7L3Rhc2smZ3Q7Ci0gICAgICAgIDwvcHJlPgotICAgIDxwPgotICAgICAgRnJvbSBBbnQgMS42LjIsIGVsZW1lbnRzIG5lc3RlZCBpbnNpZGUgYSBuYW1lc3BhY2VkIGVsZW1lbnQgbWF5IGFsc28gYmUKLSAgICAgIGluIEFudCdzIGRlZmF1bHQgbmFtZXNwYWNlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGZvbGxvd2luZyBpcyBub3cgYWxsb3dlZDoKKyAgICAgIEFsbW9zdCBhbHdheXMgaW4gQW50IDEuNiwgZWxlbWVudHMgbmVzdGVkIGluc2lkZSBhIG5hbWVzcGFjZWQgZWxlbWVudCBoYXZlIHRoZSBzYW1lCisgICAgICBuYW1lc3BhY2UgYXMgdGhlaXIgcGFyZW50LiBTbyBpZiA8Y29kZT50YXNrPC9jb2RlPiBpbiB0aGUgZXhhbXBsZSBhYm92ZSBhbGxvd2VkIGEKKyAgICAgIG5lc3RlZCA8Y29kZT5jb25maWc8L2NvZGU+IGVsZW1lbnQsIHRoZSBidWlsZCBmaWxlIHNuaXBwZXQgd291bGQgbG9vayBsaWtlIHRoaXM6CiAgICAgPC9wPgotICAgIDwvcD48cHJlPiAmbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIKLSAgIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+Ii8mZ3Q7Ci0gJmx0O215OnRhc2sgeG1sbnM6bXk9IjxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyI+aHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzPC9hPiImZ3Q7Ci0gICAmbHQ7Y29uZmlnIGE9ImZvbyIgYj0iYmFyIi8mZ3Q7Ci0gICAuLi4KLSAmbHQ7L215OnRhc2smZ3Q7Ci08L3ByZT4KLSAgICAgIAotICAgIDxoMz5OYW1lc3BhY2VzIGFuZCBBdHRyaWJ1dGVzPC9oMz4KKyAgICA8cHJlPgorJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL3Rhc2tzLnByb3BlcnRpZXMiIHVyaT0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIi8mZ3Q7CismbHQ7bXk6dGFzayB4bWxuczpteT0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIiZndDsKKyAgICAmbHQ7bXk6Y29uZmlnIGE9ImZvbyIgYj0iYmFyIi8mZ3Q7CisgICAgLi4uCismbHQ7L215OnRhc2smZ3Q7PC9wcmU+CisgICAgPHA+SWYgdGhlIGVsZW1lbnQgYWxsb3dzIG9yIHJlcXVpcmVzIGEgbG90IG9mIG5lc3RlZCBlbGVtZW50cywgdGhlIHByZWZpeCBuZWVkcyB0byBiZSB1c2VkCisgICAgICBmb3IgZXZlcnkgbmVzdGVkIGVsZW1lbnQuIE1ha2luZyB0aGUgbmFtZXNwYWNlIHRoZSBkZWZhdWx0IGNhbiByZWR1Y2UgdGhlIHZlcmJvc2l0eSBvZiB0aGUKKyAgICAgIHNjcmlwdDoKKyAgICA8L3A+CisgICAgPHByZT4KKyZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS90YXNrcy5wcm9wZXJ0aWVzIiB1cmk9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyIvJmd0OworJmx0O3Rhc2sgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyImZ3Q7CisgICAgJmx0O2NvbmZpZyBhPSJmb28iIGI9ImJhciIvJmd0OworICAgIC4uLgorJmx0Oy90YXNrJmd0OzwvcHJlPgorICAgIDxwPgorICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+LCBlbGVtZW50cyBuZXN0ZWQgaW5zaWRlIGEgbmFtZXNwYWNlZCBlbGVtZW50IG1heSBhbHNvIGJlIGluIEFudCdzCisgICAgICBkZWZhdWx0IG5hbWVzcGFjZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgaXMgbm93IGFsbG93ZWQ6CisgICAgPC9wPgorICAgIDxwcmU+CismbHQ7dHlwZWRlZiByZXNvdXJjZT0ib3JnL2V4YW1wbGUvdGFza3MucHJvcGVydGllcyIKKyAgICB1cmk9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyIvJmd0OworJmx0O215OnRhc2sgeG1sbnM6bXk9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyImZ3Q7CisgICAgJmx0O2NvbmZpZyBhPSJmb28iIGI9ImJhciIvJmd0OworICAgIC4uLgorJmx0Oy9teTp0YXNrJmd0OzwvcHJlPgogCisgICAgPGgzPk5hbWVzcGFjZXMgYW5kIEF0dHJpYnV0ZXM8L2gzPgogICAgIDxwPgogICAgICAgQXR0cmlidXRlcyBhcmUgb25seSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZWxlbWVudCB0aGV5IGJlbG9uZyB0byBpZjoKICAgICA8L3A+CiAgICAgPHVsPgotICAgICAgPGxpPiB0aGV5IGhhdmUgbm8gbmFtZXNwYWNlIChub3RlIHRoYXQgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGRvZXMgKm5vdCogYXBwbHkgdG8gYXR0cmlidXRlcykKLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+IHRoZXkgYXJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgZWxlbWVudCB0aGV5IGJlbG9uZyB0bwotICAgICAgPC9saT4KKyAgICAgIDxsaT50aGV5IGhhdmUgbm8gbmFtZXNwYWNlIChub3RlIHRoYXQgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIGRvZXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gYXBwbHkgdG8gYXR0cmlidXRlcyk8L2xpPgorICAgICAgPGxpPnRoZXkgYXJlIGluIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgZWxlbWVudCB0aGV5IGJlbG9uZyB0bzwvbGk+CiAgICAgPC91bD4KICAgICA8cD4KLSAgICAgIEluIEFudCAxLjkuMSB0d28gYXR0cmlidXRlIG5hbWVzcGFjZXMgPGNvZGU+YW50OmlmPC9jb2RlPiBhbmQgPGNvZGU+YW50OnVubGVzczwvY29kZT4gd2VyZSBhZGRlZAotICAgICAgdG8gYWxsb3cgeW91IHRvIGluc2VydCBlbGVtZW50cyBjb25kaXRpb25hbGx5LgorICAgICAgPGVtPlNpbmNlIEFudCAxLjkuMTwvZW0+IHR3byBhdHRyaWJ1dGUgbmFtZXNwYWNlcyA8Y29kZT5hbnQ6aWY8L2NvZGU+CisgICAgICBhbmQgPGNvZGU+YW50OnVubGVzczwvY29kZT4gYXJlIGF2YWlsYWJsZSB0byBhbGxvdyB5b3UgdG8gaW5zZXJ0IGVsZW1lbnRzIGNvbmRpdGlvbmFsbHkuCiAgICAgPC9wPgogICAgIDxwPgogICAgICAgT3RoZXIgYXR0cmlidXRlcyBhcmUgc2ltcGx5IGlnbm9yZWQuCkBAIC0xNjIsNjIgKzE1OSw2NSBAQAogICAgICAgVGhpcyBtZWFucyB0aGF0IGJvdGg6CiAgICAgPC9wPgogICAgIDxwPgotICAgIDwvcD48cHJlPiAmbHQ7bXk6dGFzayB4bWxuczpteT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL3Rhc2tzIj5odHRwOi8vZXhhbXBsZS5vcmcvdGFza3M8L2E+IiZndDsKLSAgICZsdDtteTpjb25maWcgYT0iZm9vIiBiPSJiYXIiLyZndDsKLSAgIC4uLgotICZsdDsvbXk6dGFzayZndDsKLTwvcHJlPgorICAgIDwvcD4KKyAgICA8cHJlPgorJmx0O215OnRhc2sgeG1sbnM6bXk9Imh0dHA6Ly9leGFtcGxlLm9yZy90YXNrcyImZ3Q7CisgICAgJmx0O215OmNvbmZpZyBhPSJmb28iIGI9ImJhciIvJmd0OworICAgIC4uLgorJmx0Oy9teTp0YXNrJmd0OzwvcHJlPgogICAgIDxwPgogICAgICAgYW5kCiAgICAgPC9wPgotICAgIDxwcmU+ICZsdDtteTp0YXNrIHhtbG5zOm15PSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiPmh0dHA6Ly9leGFtcGxlLm9yZy90YXNrczwvYT4iJmd0OwotICAgJmx0O215OmNvbmZpZyBteTphPSJmb28iIG15OmI9ImJhciIvJmd0OwotICAgLi4uCi0gJmx0Oy9teTp0YXNrJmd0OwotPC9wcmU+CisgICAgPHByZT4KKyZsdDtteTp0YXNrIHhtbG5zOm15PSJodHRwOi8vZXhhbXBsZS5vcmcvdGFza3MiJmd0OworICAgICZsdDtteTpjb25maWcgbXk6YT0iZm9vIiBteTpiPSJiYXIiLyZndDsKKyAgICAuLi4KKyZsdDsvbXk6dGFzayZndDs8L3ByZT4KICAgICA8cD4KLSAgICAgIHJlc3VsdCBpbiB0aGUgcGFyYW1ldGVycyAiYSIgYW5kICJiIiBiZWluZyB1c2VkIGFzIHBhcmFtZXRlcnMgdG8gY29uZmlndXJlIHRoZSBuZXN0ZWQgImNvbmZpZyIgZWxlbWVudC4KKyAgICAgIHJlc3VsdCBpbiB0aGUgcGFyYW1ldGVycyA8dmFyPmE8L3Zhcj4gYW5kIDx2YXI+YjwvdmFyPiBiZWluZyB1c2VkIGFzIHBhcmFtZXRlcnMgdG8KKyAgICAgIGNvbmZpZ3VyZSB0aGUgbmVzdGVkIDxjb2RlPmNvbmZpZzwvY29kZT4gZWxlbWVudC4KICAgICA8L3A+Ci0gICAgPHA+SXQgYWxzbyBtZWFucyB0aGF0IHlvdSBjYW4gdXNlIGF0dHJpYnV0ZXMgZnJvbSBvdGhlciBuYW1lc3BhY2VzCi0gICAgICB0byBtYXJrdXAgdGhlIGJ1aWxkIGZpbGUgd2l0aCBleHRyYSBtZXRhZGF0YSwgc3VjaCBhcyBSREYgYW5kCi0gICAgICBYTUwtU2NoZW1hICh3aGV0aGVyIHRoYXQncyBhIGdvb2QgdGhpbmcgb3Igbm90KS4gVGhlIHNhbWUgaXMgbm90IHRydWUKLSAgICAgIGZvciBlbGVtZW50cyBmcm9tIHVua25vd24gbmFtZXNwYWNlcywgd2hpY2ggcmVzdWx0IGluIGEgZXJyb3IuCisgICAgPHA+CisgICAgICBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiB1c2UgYXR0cmlidXRlcyBmcm9tIG90aGVyIG5hbWVzcGFjZXMgdG8gbWFya3VwIHRoZSBidWlsZCBmaWxlCisgICAgICB3aXRoIGV4dHJhIG1ldGFkYXRhLCBzdWNoIGFzIFJERiBhbmQgWE1MLVNjaGVtYSAod2hldGhlciB0aGF0J3MgYSBnb29kIHRoaW5nIG9yIG5vdCkuIFRoZQorICAgICAgc2FtZSBpcyBub3QgdHJ1ZSBmb3IgZWxlbWVudHMgZnJvbSB1bmtub3duIG5hbWVzcGFjZXMsIHdoaWNoIHJlc3VsdCBpbiBhIGVycm9yLgogICAgIDwvcD4KICAgICA8aDM+TWl4aW5nIEVsZW1lbnRzIGZyb20gRGlmZmVyZW50IE5hbWVzcGFjZXM8L2gzPgogCi0gICAgPHA+Tm93IGNvbWVzIHRoZSBkaWZmaWN1bHQgcGFydDogZWxlbWVudHMgZnJvbSBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjYW4KLSAgICAgIGJlIHdvdmVuIHRvZ2V0aGVyIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4gVGhpcyBoYXMgYSBsb3QgdG8gZG8KLSAgICAgIHdpdGggdGhlIEFudCAxLjYKLSAgICAgIDxhIGhyZWY9Ii4uL2RldmVsb3AuaHRtbCNuZXN0ZWR0eXBlIj5hZGQgdHlwZSBpbnRyb3NwZWN0aW9uIHJ1bGVzPC9hPjoKLSAgICAgIEFudCB0eXBlcyBhbmQgdGFza3MgYXJlIG5vdyBmcmVlIHRvIGFjY2VwdCBhcmJpdHJhcnkgbmFtZWQgdHlwZXMgYXMKLSAgICAgIG5lc3RlZCBlbGVtZW50cywgYXMgbG9uZyBhcyB0aGUgY29uY3JldGUgdHlwZSBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UKLSAgICAgIGV4cGVjdGVkIGJ5IHRoZSB0YXNrL3R5cGUuIFRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBmb3IgdGhpcyBpcyB0aGUKLSAgICAgIDxjb2RlPiZsdDtjb25kaXRpb24mZ3Q7PC9jb2RlPiB0YXNrLCB3aGljaCBzdXBwb3J0cyB2YXJpb3VzIG5lc3RlZCBjb25kaXRpb25zLCBhbGwKLSAgICAgIG9mIHdoaWNoIGV4dGVuZCB0aGUgaW50ZXJmYWNlIDx0dD5Db25kaXRpb248L3R0Pi4gVG8gaW50ZWdyYXRlIGEKLSAgICAgIGN1c3RvbSBjb25kaXRpb24gaW4gQW50LCB5b3UgY2FuIG5vdyBzaW1wbHkgPGNvZGU+Jmx0O3R5cGVkZWYmZ3Q7PC9jb2RlPiB0aGUKLSAgICAgIGNvbmRpdGlvbiwgYW5kIHRoZW4gdXNlIGl0IGFueXdoZXJlIG5lc3RlZCBjb25kaXRpb25zIGFyZSBhbGxvd2VkCi0gICAgICAoYXNzdW1pbmcgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCBoYXMgYSBnZW5lcmljIDx0dD5hZGQoQ29uZGl0aW9uKTwvdHQ+IG9yIDx0dD5hZGRDb25maWd1cmVkKENvbmRpdGlvbik8L3R0PiBtZXRob2QpOgotPC9wPjxwcmU+ICZsdDt0eXBlZGVmIHJlc291cmNlPSJvcmcvZXhhbXBsZS9jb25kaXRpb25zLnByb3BlcnRpZXMiIHVyaT0iPGEgaHJlZj0iaHR0cDovL2V4YW1wbGUub3JnL2NvbmRpdGlvbnMiPmh0dHA6Ly9leGFtcGxlLm9yZy9jb25kaXRpb25zPC9hPiIvJmd0OwotICZsdDtjb25kaXRpb24gcHJvcGVydHk9InByb3AiIHhtbG5zPSI8YSBocmVmPSJodHRwOi8vZXhhbXBsZS5vcmcvY29uZGl0aW9ucyI+aHR0cDovL2V4YW1wbGUub3JnL2NvbmRpdGlvbnM8L2E+IiZndDsKLSAgICZsdDthbmQmZ3Q7Ci0gICAgICZsdDthdmFpbGFibGUgZmlsZT0iYmxhLnR4dCIvJmd0OwotICAgICAmbHQ7bXk6Y29uZGl0aW9uIGE9ImZvbyIvJmd0OwotICAgJmx0Oy9hbmQmZ3Q7Ci0gJmx0Oy9jb25kaXRpb24mZ3Q7Ci08L3ByZT4KICAgICA8cD4KLSAgICAgIEluIEFudCAxLjYsIHRoaXMgZmVhdHVyZSBjYW5ub3QgYmUgdXNlZCBhcyBtdWNoIGFzIHdlJ2QgYWxsIGxpa2UgdG86IGEKLSAgICAgIGxvdCBvZiBjb2RlIGhhcyBub3QgeWV0IGJlZW4gYWRhcHRlZCB0byB0aGUgbmV3IGludHJvc3BlY3Rpb24gcnVsZXMsCi0gICAgICBhbmQgZWxlbWVudHMgbGlrZSBBbnQncyBidWlsdC1pbiBjb25kaXRpb25zIGFuZCBzZWxlY3RvcnMgYXJlIG5vdAotICAgICAgcmVhbGx5IHR5cGVzIGluIDEuNi4gVGhpcyBpcyBleHBlY3RlZCB0byBjaGFuZ2UgaW4gQW50IDEuNy4KKyAgICAgIE5vdyBjb21lcyB0aGUgZGlmZmljdWx0IHBhcnQ6IGVsZW1lbnRzIGZyb20gZGlmZmVyZW50IG5hbWVzcGFjZXMgY2FuIGJlIHdvdmVuIHRvZ2V0aGVyIHVuZGVyCisgICAgICBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuIFRoaXMgaGFzIGEgbG90IHRvIGRvIHdpdGggdGhlIEFudAorICAgICAgMS42IDxhIGhyZWY9Ii4uL2RldmVsb3AuaHRtbCNuZXN0ZWR0eXBlIj5hZGQgdHlwZSBpbnRyb3NwZWN0aW9uIHJ1bGVzPC9hPjogQW50IHR5cGVzIGFuZCB0YXNrcworICAgICAgYXJlIG5vdyBmcmVlIHRvIGFjY2VwdCBhcmJpdHJhcnkgbmFtZWQgdHlwZXMgYXMgbmVzdGVkIGVsZW1lbnRzLCBhcyBsb25nIGFzIHRoZSBjb25jcmV0ZSB0eXBlCisgICAgICBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgZXhwZWN0ZWQgYnkgdGhlIHRhc2svdHlwZS4gVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIGZvciB0aGlzIGlzCisgICAgICB0aGUgPGNvZGU+Jmx0O2NvbmRpdGlvbiZndDs8L2NvZGU+IHRhc2ssIHdoaWNoIHN1cHBvcnRzIHZhcmlvdXMgbmVzdGVkIGNvbmRpdGlvbnMsIGFsbCBvZgorICAgICAgd2hpY2ggZXh0ZW5kIHRoZSBpbnRlcmZhY2UgPGNvZGUgY2xhc3M9ImNvZGUiPkNvbmRpdGlvbjwvY29kZT4uIFRvIGludGVncmF0ZSBhIGN1c3RvbQorICAgICAgY29uZGl0aW9uIGluIEFudCwgeW91IGNhbiBub3cgc2ltcGx5IDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4gdGhlIGNvbmRpdGlvbiwgYW5kIHRoZW4gdXNlCisgICAgICBpdCBhbnl3aGVyZSBuZXN0ZWQgY29uZGl0aW9ucyBhcmUgYWxsb3dlZCAoYXNzdW1pbmcgdGhlIGNvbnRhaW5pbmcgZWxlbWVudCBoYXMgYQorICAgICAgZ2VuZXJpYyA8Y29kZSBjbGFzcz0iY29kZSI+YWRkKENvbmRpdGlvbik8L2NvZGU+CisgICAgICBvciA8Y29kZSBjbGFzcz0iY29kZSI+YWRkQ29uZmlndXJlZChDb25kaXRpb24pPC9jb2RlPiBtZXRob2QpOgorICAgIDwvcD4KKyAgICA8cHJlPgorJmx0O3R5cGVkZWYgcmVzb3VyY2U9Im9yZy9leGFtcGxlL2NvbmRpdGlvbnMucHJvcGVydGllcyIgdXJpPSJodHRwOi8vZXhhbXBsZS5vcmcvY29uZGl0aW9ucyIvJmd0OworJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0icHJvcCIgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLm9yZy9jb25kaXRpb25zIiZndDsKKyAgICAmbHQ7YW5kJmd0OworICAgICAgICAmbHQ7YXZhaWxhYmxlIGZpbGU9ImJsYS50eHQiLyZndDsKKyAgICAgICAgJmx0O215OmNvbmRpdGlvbiBhPSJmb28iLyZndDsKKyAgICAmbHQ7L2FuZCZndDsKKyZsdDsvY29uZGl0aW9uJmd0OzwvcHJlPgorICAgIDxwPgorICAgICAgSW4gQW50IDEuNiwgdGhpcyBmZWF0dXJlIGNhbm5vdCBiZSB1c2VkIGFzIG11Y2ggYXMgd2UnZCBhbGwgbGlrZSB0bzogYSBsb3Qgb2YgY29kZSBoYXMgbm90CisgICAgICB5ZXQgYmVlbiBhZGFwdGVkIHRvIHRoZSBuZXcgaW50cm9zcGVjdGlvbiBydWxlcywgYW5kIGVsZW1lbnRzIGxpa2UgQW50J3MgYnVpbHQtaW4KKyAgICAgIGNvbmRpdGlvbnMgYW5kIHNlbGVjdG9ycyBhcmUgbm90IHJlYWxseSB0eXBlcyBpbiAxLjYuIFRoaXMgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGluIEFudAorICAgICAgMS43LgogICAgIDwvcD4KICAgICA8aDM+TmFtZXNwYWNlcyBhbmQgQW50bGliPC9oMz4KIAogICAgIDxwPgotICAgICAgVGhlIG5ldyA8YSBocmVmPSJhbnRsaWIuaHRtbCI+QW50TGliPC9hPgotICAgICAgZmVhdHVyZSBpcyBhbHNvIHZlcnkgbXVjaCBpbnRlZ3JhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSBzdXBwb3J0IGluIEFudAotICAgICAgMS42LiBCYXNpY2FsbHksIHlvdSBjYW4gImltcG9ydCIgQW50bGlicyBzaW1wbHkgYnkgdXNpbmcgYSBzcGVjaWFsCi0gICAgICBzY2hlbWUgZm9yIHRoZSBuYW1lc3BhY2UgVVJJOiB0aGUgPHR0PmFudGxpYjwvdHQ+IHNjaGVtZSwgd2hpY2ggZXhwZWN0cyB0aGUgcGFja2FnZSBuYW1lIGluIHdoaWNoIGEgc3BlY2lhbCA8dHQ+YW50bGliLnhtbDwvdHQ+IGZpbGUgaXMgbG9jYXRlZC4KKyAgICAgIFRoZSBuZXcgPGEgaHJlZj0iYW50bGliLmh0bWwiPkFudExpYjwvYT4gZmVhdHVyZSBpcyBhbHNvIHZlcnkgbXVjaCBpbnRlZ3JhdGVkIHdpdGggdGhlCisgICAgICBuYW1lc3BhY2Ugc3VwcG9ydCBpbiBBbnQgMS42LiBCYXNpY2FsbHksIHlvdSBjYW4gImltcG9ydCIgQW50bGlicyBzaW1wbHkgYnkgdXNpbmcgYQorICAgICAgc3BlY2lhbCBzY2hlbWUgZm9yIHRoZSBuYW1lc3BhY2UgVVJJOiB0aGUgPGNvZGU+YW50bGliPC9jb2RlPiBzY2hlbWUsIHdoaWNoIGV4cGVjdHMgdGhlCisgICAgICBwYWNrYWdlIG5hbWUgaW4gd2hpY2ggYSBzcGVjaWFsIDxzYW1wPmFudGxpYi54bWw8L3NhbXA+IGZpbGUgaXMgbG9jYXRlZC4KICAgICA8L3A+CiAKIDwvYm9keT4KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9wYXR0ZXJuc2V0Lmh0bWwgYi9tYW51YWwvVHlwZXMvcGF0dGVybnNldC5odG1sCmluZGV4IDFjZmNiOGYuLjlmZjI5ZGMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9wYXR0ZXJuc2V0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL3BhdHRlcm5zZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE4NCArMTUsMTc1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5QYXR0ZXJuU2V0IFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InBhdHRlcm5zZXQiPlBhdHRlcm5TZXQ8L2E+PC9oMj4KLTxwPjxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjcGF0dGVybnMiPlBhdHRlcm5zPC9hPiBjYW4gYmUgZ3JvdXBlZCB0bwotc2V0cyBhbmQgbGF0ZXIgYmUgcmVmZXJlbmNlZCBieSB0aGVpciA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlLiBUaGV5Ci1hcmUgZGVmaW5lZCB2aWEgYSA8Y29kZT5wYXR0ZXJuc2V0PC9jb2RlPiBlbGVtZW50LCB3aGljaCBjYW4gYXBwZWFyCi1uZXN0ZWQgaW50byBhIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gb3IgYSBkaXJlY3RvcnktYmFzZWQKLXRhc2sgdGhhdCBjb25zdGl0dXRlcyBhbiBpbXBsaWNpdCBGaWxlU2V0LiBJbiBhZGRpdGlvbiwKLTxjb2RlPnBhdHRlcm5zZXQ8L2NvZGU+cyBjYW4gYmUgZGVmaW5lZCBhcyBhIHN0YW5kIGFsb25lIGVsZW1lbnQgYXQKLXRoZSBzYW1lIGxldmVsIGFzIDxjb2RlPnRhcmdldDwvY29kZT4gJiMxNTE7IGkuZS4sIGFzIGNoaWxkcmVuIG9mCi08Y29kZT5wcm9qZWN0PC9jb2RlPiBhcyB3ZWxsIGFzIGFzIGNoaWxkcmVuIG9mCi08Y29kZT50YXJnZXQ8L2NvZGU+LjwvcD4gPHA+UGF0dGVybnMgY2FuIGJlIHNwZWNpZmllZCBieSBuZXN0ZWQKLTxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIG9yIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMKLW9yIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGgyIGlkPSJwYXR0ZXJuc2V0Ij5QYXR0ZXJuU2V0PC9oMj4KKzxwPjxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjcGF0dGVybnMiPlBhdHRlcm5zPC9hPiBjYW4gYmUgZ3JvdXBlZCB0byBzZXRzIGFuZCBsYXRlciBiZQorcmVmZXJlbmNlZCBieSB0aGVpciA8dmFyPmlkPC92YXI+IGF0dHJpYnV0ZS4gVGhleSBhcmUgZGVmaW5lZCB2aWEgYSA8Y29kZT5wYXR0ZXJuc2V0PC9jb2RlPgorZWxlbWVudCwgd2hpY2ggY2FuIGFwcGVhciBuZXN0ZWQgaW50byBhIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT4gb3IgYSBkaXJlY3RvcnktYmFzZWQKK3Rhc2sgdGhhdCBjb25zdGl0dXRlcyBhbiBpbXBsaWNpdCBGaWxlU2V0LiBJbiBhZGRpdGlvbiwgPGNvZGU+cGF0dGVybnNldDwvY29kZT5zIGNhbiBiZSBkZWZpbmVkCithcyBhIHN0YW5kIGFsb25lIGVsZW1lbnQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgPGNvZGU+dGFyZ2V0PC9jb2RlPiZtZGFzaDtpLmUuLCBhcyBjaGlsZHJlbiBvZgorPGNvZGU+cHJvamVjdDwvY29kZT4gYXMgd2VsbCBhcyBhcyBjaGlsZHJlbiBvZiA8Y29kZT50YXJnZXQ8L2NvZGU+LjwvcD4KKzxwPlBhdHRlcm5zIGNhbiBiZSBzcGVjaWZpZWQgYnkgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sCitvciA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzIG9yIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcy48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVmYXVsdDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGluY2x1ZGVkLiBBbGwgZmlsZXMgYXJlIGluY2x1ZGVkIHdoZW4gb21pdHRlZC48L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQuPC90ZD4KKyAgICA8dGQ+QWxsIGZpbGVzIGFyZSBpbmNsdWRlZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uIFlvdSBjYW4gc3BlY2lmeSBtb3JlIHRoYW4gb25lCi0gICAgICBpbmNsdWRlIGZpbGUgYnkgdXNpbmcgYSBuZXN0ZWQgaW5jbHVkZXNmaWxlIGVsZW1lbnRzLgotICAgICAgPGI+Tm90ZTo8L2I+IGlmIHRoZSBmaWxlIGlzIGVtcHR5IGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIKKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQ+bmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gaW5jbHVkZSBwYXR0ZXJuLiBZb3UgY2FuCisgICAgICBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgaW5jbHVkZSBmaWxlIGJ5IHVzaW5nIGEgbmVzdGVkIDxjb2RlPmluY2x1ZGVzZmlsZTwvY29kZT4gZWxlbWVudHMuCisgICAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IGlmIHRoZSBmaWxlIGlzIGVtcHR5IGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIKICAgICAgIHBhdHRlcm5zIGRlZmluZWQgZm9yIHRoZSBmaWxlc2V0LCBhbGwgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZC4KICAgICA8L3RkPgorICAgIDx0ZD5TZWUgPHZhcj5pbmNsdWRlczwvdmFyPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUKLSAgICAgIGV4Y2x1ZGVkOyBubyBmaWxlcyAoZXhjZXB0IGRlZmF1bHQgZXhjbHVkZXMpIGFyZSBleGNsdWRlZCB3aGVuIG9taXR0ZWQuPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkLjwvdGQ+CisgICAgPHRkPk5vIGZpbGVzIGV4Y2VwdCBkZWZhdWx0IGV4Y2x1ZGVzIGFyZSBleGNsdWRlZC48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5leGNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBleGNsdWRlIHBhdHRlcm4uIFlvdSBjYW4gc3BlY2lmeSBtb3JlIHRoYW4gb25lCi0gICAgICBleGNsdWRlIGZpbGUgYnkgdXNpbmcgYSBuZXN0ZWQgZXhjbHVkZXNmaWxlIGVsZW1lbnRzLjwvdGQ+CisgICAgPHRkPmV4Y2x1ZGVzZmlsZTwvdGQ+CisgICAgPHRkPm5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi4gWW91IGNhbgorICAgICAgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGV4Y2x1ZGUgZmlsZSBieSB1c2luZyBhIG5lc3RlZCA8Y29kZT5leGNsdWRlc2ZpbGU8L2NvZGU+CisgICAgICBlbGVtZW50cy48L3RkPgorICAgIDx0ZD5TZWUgPHZhcj5leGNsdWRlczwvdmFyPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+PGNvZGU+aW5jbHVkZTwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGU8L2NvZGU+PC9oND4KLTxwPkVhY2ggc3VjaCBlbGVtZW50IGRlZmluZXMgYSBzaW5nbGUgcGF0dGVybiBmb3IgZmlsZXMgdG8gaW5jbHVkZSBvcgotZXhjbHVkZS48L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHA+RWFjaCBzdWNoIGVsZW1lbnQgZGVmaW5lcyBhIHNpbmdsZSBwYXR0ZXJuIGZvciBmaWxlcyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjcGF0dGVybnMiPnBhdHRlcm48L2E+Ci0gICAgICB0byBpbi9leGNsdWRlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+dGhlIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjcGF0dGVybnMiPnBhdHRlcm48L2E+IHRvIGluL2V4Y2x1ZGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSB1c2UgdGhpcyBwYXR0ZXJuIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmlmPC90ZD4KKyAgICA8dGQ+T25seSB1c2UgdGhpcyBwYXR0ZXJuIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcworICAgIHNldDwvYT4uPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51bmxlc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSB1c2UgdGhpcyBwYXR0ZXJuIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcwotICAgICAgIDxiPm5vdDwvYj4gc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD51bmxlc3M8L3RkPgorICAgIDx0ZD5Pbmx5IHVzZSB0aGlzIHBhdHRlcm4gPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGg0Pjxjb2RlPmluY2x1ZGVzZmlsZTwvY29kZT4gYW5kIDxjb2RlPmV4Y2x1ZGVzZmlsZTwvY29kZT48L2g0PgotPHA+SWYgeW91IHdhbnQgdG8gbGlzdCB0aGUgZmlsZXMgdG8gaW5jbHVkZSBvciBleGNsdWRlIGV4dGVybmFsIHRvCi15b3VyIGJ1aWxkIGZpbGUsIHlvdSBzaG91bGQgdXNlIHRoZSBpbmNsdWRlc2ZpbGUvZXhjbHVkZXNmaWxlCi1hdHRyaWJ1dGVzIG9yIGVsZW1lbnRzLiAgVXNpbmcgdGhlIGF0dHJpYnV0ZSwgeW91IGNhbiBvbmx5IHNwZWNpZnkgYQotc2luZ2xlIGZpbGUgb2YgZWFjaCB0eXBlLCB3aGlsZSB0aGUgbmVzdGVkIGVsZW1lbnRzIGNhbiBiZSBzcGVjaWZpZWQKLW1vcmUgdGhhbiBvbmNlIC0gdGhlIG5lc3RlZCBlbGVtZW50cyBhbHNvIHN1cHBvcnQgaWYvdW5sZXNzIGF0dHJpYnV0ZXMKLXlvdSBjYW4gdXNlIHRvIHRlc3QgdGhlIGV4aXN0ZW5jZSBvZiBhIHByb3BlcnR5LjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5JZiB5b3Ugd2FudCB0byBsaXN0IHRoZSBmaWxlcyB0byBpbmNsdWRlIG9yIGV4Y2x1ZGUgZXh0ZXJuYWwgdG8geW91ciBidWlsZCBmaWxlLCB5b3Ugc2hvdWxkCit1c2UgdGhlIDx2YXI+aW5jbHVkZXNmaWxlPC92YXI+Lzx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+IGF0dHJpYnV0ZXMgb3IgZWxlbWVudHMuICBVc2luZyB0aGUKK2F0dHJpYnV0ZSwgeW91IGNhbiBvbmx5IHNwZWNpZnkgYSBzaW5nbGUgZmlsZSBvZiBlYWNoIHR5cGUsIHdoaWxlIHRoZSBuZXN0ZWQgZWxlbWVudHMgY2FuIGJlCitzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UmbWRhc2g7dGhlIG5lc3RlZCBlbGVtZW50cyBhbHNvIHN1cHBvcnQgPHZhcj5pZjwvdmFyPi88dmFyPnVubGVzczwvdmFyPgorYXR0cmlidXRlcyB5b3UgY2FuIHVzZSB0byB0ZXN0IHRoZSBleGlzdGVuY2Ugb2YgYSBwcm9wZXJ0eS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgZmlsZSBob2xkaW5nIHRoZSBwYXR0ZXJucyB0bwotICAgICAgaW4vZXhjbHVkZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHBhdHRlcm5zIHRvIGluL2V4Y2x1ZGUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+T25seSByZWFkIHRoaXMgZmlsZSA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgc2V0PC9hPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pZjwvdGQ+CisgICAgPHRkPk9ubHkgcmVhZCB0aGlzIGZpbGUgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5IGlzCisgICAgc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5Pbmx5IHJlYWQgdGhpcyBmaWxlIDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcwotICAgICAgPGI+bm90PC9iPiBzZXQ8L2E+LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPnVubGVzczwvdGQ+CisgICAgPHRkPk9ubHkgcmVhZCB0aGlzIGZpbGUgPGEgaHJlZj0iLi4vcHJvcGVydGllcy5odG1sI2lmK3VubGVzcyI+aWYgdGhlIG5hbWVkIHByb3BlcnR5CisgICAgaXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gc2V0PC9hPi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZS4gPGVtPlNpbmNlIEFudCAxLjkuMTI8L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBwbGF0Zm9ybSBkZWZhdWx0PC90ZD4KKyAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgIDx0ZD5UaGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUuIDxlbT5TaW5jZSBBbnQgMS4xMC40PC9lbT48L3RkPgorICAgIDx0ZD5ObywgZGVmYXVsdCBpcyBwbGF0Zm9ybSBkZWZhdWx0PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDQ+PGNvZGU+cGF0dGVybnNldDwvY29kZT48L2g0PgotPHA+UGF0dGVybnNldHMgbWF5IGJlIG5lc3RlZCB3aXRoaW4gb25lIGFub3RoZXIsIGFkZGluZyB0aGUgbmVzdGVkCi1wYXR0ZXJucyB0byB0aGUgcGFyZW50IHBhdHRlcm5zZXQuPC9wPgorPHA+UGF0dGVybnNldHMgbWF5IGJlIG5lc3RlZCB3aXRoaW4gb25lIGFub3RoZXIsIGFkZGluZyB0aGUgbmVzdGVkIHBhdHRlcm5zIHRvIHRoZSBwYXJlbnQKK3BhdHRlcm5zZXQuPC9wPgogPGg0Pjxjb2RlPmludmVydDwvY29kZT48L2g0PgotPHA+QSBuZXN0ZWQgcGF0dGVybnNldCBjYW4gYmUgaW52ZXJ0ZWQgdXNpbmcgdGhlIDxjb2RlPiZsdDtpbnZlcnQmZ3Q7PC9jb2RlPgotZWxlbWVudC4gPGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43LjE8L2VtPjwvcD4KKzxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNy4xPC9lbT48L3A+Cis8cD5BIG5lc3RlZCBwYXR0ZXJuc2V0IGNhbiBiZSBpbnZlcnRlZCB1c2luZyB0aGUgPGNvZGU+Jmx0O2ludmVydCZndDs8L2NvZGU+IGVsZW1lbnQuPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3BhdHRlcm5zZXQgaWQ9JnF1b3Q7bm9uLnRlc3Quc291cmNlcyZxdW90OyZndDsKICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OwogICAmbHQ7ZXhjbHVkZSBuYW1lPSZxdW90OyoqLypUZXN0KiZxdW90Oy8mZ3Q7CiAmbHQ7L3BhdHRlcm5zZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5CdWlsZHMgYSBzZXQgb2YgcGF0dGVybnMgdGhhdCBtYXRjaGVzIGFsbCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMKLXRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHRleHQgPGNvZGU+VGVzdDwvY29kZT4gaW4gdGhlaXIgbmFtZS4gVGhpcyBzZXQKLWNhbiBiZSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVycmVkPC9hPiB0byB2aWEKLTxjb2RlPiZsdDtwYXR0ZXJuc2V0IHJlZmlkPSZxdW90O25vbi50ZXN0LnNvdXJjZXMmcXVvdDsvJmd0OzwvY29kZT4sCi1ieSB0YXNrcyB0aGF0IHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBvciBieSBGaWxlU2V0cy48L3A+Ci08cD5Ob3RlIHRoYXQgd2hpbGUgdGhlIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBhbmQKLTxjb2RlPmV4Y2x1ZGVzPC9jb2RlPiBhdHRyaWJ1dGVzIGFjY2VwdAotbXVsdGlwbGUgZWxlbWVudHMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciBzcGFjZXMsIHRoZSBuZXN0ZWQKLTxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gZWxlbWVudHMgZXhwZWN0IHRoZWlyIG5hbWUKLWF0dHJpYnV0ZSB0byBob2xkIGEgc2luZ2xlIHBhdHRlcm4uPC9wPgotPHA+VGhlIG5lc3RlZCBlbGVtZW50cyBhbGxvdyB5b3UgdG8gdXNlIGlmIGFuZCB1bmxlc3MgYXJndW1lbnRzIHRvCi1zcGVjaWZ5IHRoYXQgdGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBhIHByb3BlcnR5IGlzIHNldCwgb3IKLXRoYXQgaXQgc2hvdWxkIGJlIHVzZWQgb25seSBpZiBhIHByb3BlcnR5IGlzIG5vdCBzZXQuPC9wPgorPC9wcmU+Cis8cD5CdWlsZHMgYSBzZXQgb2YgcGF0dGVybnMgdGhhdCBtYXRjaGVzIGFsbCA8c2FtcD4uamF2YTwvc2FtcD4gZmlsZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUKK3RleHQgPHNhbXA+VGVzdDwvc2FtcD4gaW4gdGhlaXIgbmFtZS4gVGhpcyBzZXQgY2FuCitiZSA8YSBocmVmPSIuLi91c2luZy5odG1sI3JlZmVyZW5jZXMiPnJlZmVycmVkPC9hPiB0byB2aWEgPGNvZGU+Jmx0O3BhdHRlcm5zZXQKK3JlZmlkPSZxdW90O25vbi50ZXN0LnNvdXJjZXMmcXVvdDsvJmd0OzwvY29kZT4sIGJ5IHRhc2tzIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUsIG9yIGJ5CitGaWxlU2V0cy48L3A+Cis8cD5Ob3RlIHRoYXQgd2hpbGUgdGhlIDx2YXI+aW5jbHVkZXM8L3Zhcj4gYW5kIDx2YXI+ZXhjbHVkZXM8L3Zhcj4gYXR0cmlidXRlcyBhY2NlcHQgbXVsdGlwbGUKK2VsZW1lbnRzIHNlcGFyYXRlZCBieSBjb21tYXMgb3Igc3BhY2VzLCB0aGUgbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IGVsZW1lbnRzIGV4cGVjdCB0aGVpciBuYW1lIGF0dHJpYnV0ZSB0byBob2xkIGEgc2luZ2xlCitwYXR0ZXJuLjwvcD4KKzxwPlRoZSBuZXN0ZWQgZWxlbWVudHMgYWxsb3cgeW91IHRvIHVzZSA8dmFyPmlmPC92YXI+IGFuZCA8dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGVzIHRvCitzcGVjaWZ5IHRoYXQgdGhlIGVsZW1lbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiBhIHByb3BlcnR5IGlzIHNldCwgb3IgdGhhdCBpdCBzaG91bGQgYmUgdXNlZAorb25seSBpZiBhIHByb3BlcnR5IGlzIG5vdCBzZXQuPC9wPgogPHA+Rm9yIGV4YW1wbGU8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwYXR0ZXJuc2V0IGlkPSZxdW90O3NvdXJjZXMmcXVvdDsmZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7c3RkLyoqLyouamF2YSZxdW90Oy8mZ3Q7CiAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7cHJvZi8qKi8qLmphdmEmcXVvdDsgaWY9JnF1b3Q7cHJvZmVzc2lvbmFsJnF1b3Q7LyZndDsKICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDsqKi8qVGVzdComcXVvdDsvJmd0OwogJmx0Oy9wYXR0ZXJuc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+d2lsbCBvbmx5IGluY2x1ZGUgdGhlIGZpbGVzIGluIHRoZSBzdWItZGlyZWN0b3J5IDxlbT5wcm9mPC9lbT4gaWYgdGhlIHByb3BlcnR5Ci08ZW0+cHJvZmVzc2lvbmFsPC9lbT4gaXMgc2V0IHRvIHNvbWUgdmFsdWUuPC9wPgorPC9wcmU+Cis8cD53aWxsIG9ubHkgaW5jbHVkZSB0aGUgZmlsZXMgaW4gdGhlIHN1Yi1kaXJlY3RvcnkgPHNhbXA+cHJvZjwvc2FtcD4gaWYgdGhlCitwcm9wZXJ0eSA8Y29kZT5wcm9mZXNzaW9uYWw8L2NvZGU+IGlzIHNldCB0byBzb21lIHZhbHVlLjwvcD4KIDxwPlRoZSB0d28gc2V0czwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3BhdHRlcm5zZXQgaW5jbHVkZXNmaWxlPSZxdW90O3NvbWUtZmlsZSZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8L3ByZT4KIDxwPmFuZDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3BhdHRlcm5zZXQmZ3Q7Ci0gICZsdDtpbmNsdWRlc2ZpbGUgbmFtZT0mcXVvdDtzb21lLWZpbGUmcXVvdDsvJmd0OyAKKyAgJmx0O2luY2x1ZGVzZmlsZSBuYW1lPSZxdW90O3NvbWUtZmlsZSZxdW90Oy8mZ3Q7CiAmbHQ7cGF0dGVybnNldC8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5hcmUgaWRlbnRpY2FsLiAgVGhlIGluY2x1ZGUgcGF0dGVybnMgd2lsbCBiZSByZWFkIGZyb20gdGhlIGZpbGUKLTxjb2RlPnNvbWUtZmlsZTwvY29kZT4sIG9uZSBwYXR0ZXJuIHBlciBsaW5lLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8L3ByZT4KKzxwPmFyZSBpZGVudGljYWwuICBUaGUgaW5jbHVkZSBwYXR0ZXJucyB3aWxsIGJlIHJlYWQgZnJvbSB0aGUgZmlsZSA8c2FtcD5zb21lLWZpbGU8L3NhbXA+LCBvbmUKK3BhdHRlcm4gcGVyIGxpbmUuPC9wPgorPHByZT4KICZsdDtwYXR0ZXJuc2V0Jmd0OwotICAmbHQ7aW5jbHVkZXNmaWxlIG5hbWU9JnF1b3Q7c29tZS1maWxlJnF1b3Q7LyZndDsgCi0gICZsdDtpbmNsdWRlc2ZpbGUgbmFtZT0mcXVvdDske3NvbWUtb3RoZXItZmlsZX0mcXVvdDsgCi0gICAgICAgICAgICAgICAgaWY9JnF1b3Q7c29tZS1vdGhlci1maWxlJnF1b3Q7Ci0gIC8mZ3Q7IAorICAmbHQ7aW5jbHVkZXNmaWxlIG5hbWU9JnF1b3Q7c29tZS1maWxlJnF1b3Q7LyZndDsKKyAgJmx0O2luY2x1ZGVzZmlsZSBuYW1lPSZxdW90OyR7c29tZS1vdGhlci1maWxlfSZxdW90OworICAgICAgICAgICAgICAgIGlmPSZxdW90O3NvbWUtb3RoZXItZmlsZSZxdW90Oy8mZ3Q7CiAmbHQ7cGF0dGVybnNldC8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD53aWxsIGFsc28gcmVhZCBpbmNsdWRlIHBhdHRlcm5zIGZyb20gdGhlIGZpbGUgdGhlIHByb3BlcnR5Ci08Y29kZT5zb21lLW90aGVyLWZpbGU8L2NvZGU+IHBvaW50cyB0bywgaWYgYSBwcm9wZXJ0eSBvZiB0aGF0IG5hbWUgaGFzCi1iZWVuIGRlZmluZWQuPC9wPgotCis8L3ByZT4KKzxwPndpbGwgYWxzbyByZWFkIGluY2x1ZGUgcGF0dGVybnMgZnJvbSB0aGUgZmlsZSB0aGUgcHJvcGVydHkgPGNvZGU+c29tZS1vdGhlci1maWxlPC9jb2RlPgorcG9pbnRzIHRvLCBpZiBhIHByb3BlcnR5IG9mIHRoYXQgbmFtZSBoYXMgYmVlbiBkZWZpbmVkLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvcGVybWlzc2lvbnMuaHRtbCBiL21hbnVhbC9UeXBlcy9wZXJtaXNzaW9ucy5odG1sCmluZGV4IGY3YjkwYjcuLjYxMThhYjUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9wZXJtaXNzaW9ucy5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9wZXJtaXNzaW9ucy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTA3ICsxNSw4NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UGVybWlzc2lvbnMgdHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icGVybWlzc2lvbnMiPlBlcm1pc3Npb25zPC9hPjwvaDI+Ci08cD4KLVBlcm1pc3Npb25zIHJlcHJlc2VudHMgYSBzZXQgb2Ygc2VjdXJpdHkgcGVybWlzc2lvbnMgZ3JhbnRlZCBvciByZXZva2VkIHRvCi1hIHNwZWNpZmljIHBhcnQgY29kZSBleGVjdXRlZCBpbiB0aGUgSlZNIHdoZXJlIEFwYWNoZSBBbnQgaXMgcnVubmluZyBpbi4KLVRoZSBhY3R1YWwgUGVybWlzc2lvbnMgYXJlIHNwZWNpZmllZCB2aWEgYSBzZXQgb2YgbmVzdGVkIHBlcm1pc3Npb24gaXRlbXMgZWl0aGVyCi08Y29kZT4mbHQ7Z3JhbnQmZ3Q7PC9jb2RlPmVkIG9yIDxjb2RlPiZsdDtyZXZva2UmZ3Q7PC9jb2RlPmQuPC9wPgotPHA+Ci1JbiB0aGUgYmFzZSBzaXR1YXRpb24gYSA8YSBocmVmPSIjYmFzZXNldCI+YmFzZSBzZXQ8L2E+IG9mIHBlcm1pc3Npb25zIGdyYW50ZWQuIAotRXh0cmEgcGVybWlzc2lvbnMgY2FuIGJlCi1ncmFudGVkLiBBIGdyYW50ZWQgcGVybWlzc2lvbiBjYW4gYmUgb3ZlcnJ1bGVkIGJ5IHJldm9raW5nIGEgcGVybWlzc2lvbi4KLVRoZSBzZWN1cml0eSBtYW5hZ2VyIGluc3RhbGxlZCBieSB0aGUgcGVybWlzc2lvbnMgd2lsbCB0aHJvdyBhbiAKLTxjb2RlPlNlY3VyaXR5RXhjZXB0aW9uPC9jb2RlPiBpZgotdGhlIGNvZGUgc3ViamVjdCB0byB0aGVzZSBwZXJtaXNzaW9ucyB0cnkgdG8gdXNlIGFuIHBlcm1pc3Npb24gdGhhdCBoYXMgbm90IGJlZW4gCi1ncmFudGVkIG9yIHRoYXQgaGFzIGJlZW4gcmV2b2tlZC48L3A+Cis8aDIgaWQ9InBlcm1pc3Npb25zIj5QZXJtaXNzaW9uczwvaDI+Cis8cD5QZXJtaXNzaW9ucyByZXByZXNlbnRzIGEgc2V0IG9mIHNlY3VyaXR5IHBlcm1pc3Npb25zIGdyYW50ZWQgb3IgcmV2b2tlZCB0byBhIHNwZWNpZmljIHBhcnQKK2NvZGUgZXhlY3V0ZWQgaW4gdGhlIEpWTSB3aGVyZSBBcGFjaGUgQW50IGlzIHJ1bm5pbmcgaW4uICBUaGUgYWN0dWFsIFBlcm1pc3Npb25zIGFyZSBzcGVjaWZpZWQKK3ZpYSBhIHNldCBvZiBuZXN0ZWQgcGVybWlzc2lvbiBpdGVtcyBlaXRoZXIgPGNvZGU+Jmx0O2dyYW50Jmd0OzwvY29kZT5lZAorb3IgPGNvZGU+Jmx0O3Jldm9rZSZndDs8L2NvZGU+ZC48L3A+Cis8cD5JbiB0aGUgYmFzZSBzaXR1YXRpb24gYSA8YSBocmVmPSIjYmFzZXNldCI+YmFzZSBzZXQ8L2E+IG9mIHBlcm1pc3Npb25zIGdyYW50ZWQuICBFeHRyYQorcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQuIEEgZ3JhbnRlZCBwZXJtaXNzaW9uIGNhbiBiZSBvdmVycnVsZWQgYnkgcmV2b2tpbmcgYSBwZXJtaXNzaW9uLiAgVGhlCitzZWN1cml0eSBtYW5hZ2VyIGluc3RhbGxlZCBieSB0aGUgcGVybWlzc2lvbnMgd2lsbCB0aHJvdyBhbiA8Y29kZT5TZWN1cml0eUV4Y2VwdGlvbjwvY29kZT4gaWYKK3RoZSBjb2RlIHN1YmplY3QgdG8gdGhlc2UgcGVybWlzc2lvbnMgdHJ5IHRvIHVzZSBhbiBwZXJtaXNzaW9uIHRoYXQgaGFzIG5vdCBiZWVuIGdyYW50ZWQgb3IgdGhhdAoraGFzIGJlZW4gcmV2b2tlZC48L3A+CiA8aDM+TmVzdGVkIGVsZW1lbnRzPC9oMz4KIDxoND5ncmFudDwvaDQ+Ci08cD4KLUluZGljYXRlcyBhIHNwZWNpZmljIHBlcm1pc3Npb24gaXMgYWx3YXlzIGdyYW50ZWQuIEl0cyBhdHRyaWJ1dGVzIGluZGljYXRlIHdoaWNoIAotcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPkluZGljYXRlcyBhIHNwZWNpZmljIHBlcm1pc3Npb24gaXMgYWx3YXlzIGdyYW50ZWQuIEl0cyBhdHRyaWJ1dGVzIGluZGljYXRlIHdoaWNoIHBlcm1pc3Npb25zCithcmUgZ3JhbnRlZC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3M8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBQZXJtaXNzaW9uIGNsYXNzLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5jbGFzczwvdGQ+CisgICAgPHRkPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgUGVybWlzc2lvbiBjbGFzcy48L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoZSBQZXJtaXNzaW9uLiBUaGUgYWN0dWFsIGNvbnRlbnRzIGRlcGVuZHMgb24gdGhlCi0gICAgUGVybWlzc2lvbiBjbGFzcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIFBlcm1pc3Npb24uIFRoZSBhY3R1YWwgY29udGVudHMgZGVwZW5kcyBvbiB0aGUgUGVybWlzc2lvbiBjbGFzcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFjdGlvbnM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGFjdGlvbnMgYWxsb3dlZC4gVGhlIGFjdHVhbCBjb250ZW50cyBkZXBlbmQgb24gdGhlIAotICAgIFBlcm1pc3Npb24gY2xhc3MgYW5kIG5hbWUuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+YWN0aW9uczwvdGQ+CisgICAgPHRkPlRoZSBhY3Rpb25zIGFsbG93ZWQuIFRoZSBhY3R1YWwgY29udGVudHMgZGVwZW5kIG9uIHRoZSBQZXJtaXNzaW9uIGNsYXNzIGFuZCBuYW1lLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+Ci08cD4KLUltcGxpZWQgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuCi08L3A+Ci08cD4KLVBsZWFzZSBub3RlIHRoYXQgc29tZSBQZXJtaXNzaW9uIGNsYXNzZXMgbWF5IGFjdHVhbGx5IG5lZWQgYSBuYW1lIGFuZCAvIG9yIGFjdGlvbnMgaW4gb3JkZXIgdG8gZnVuY3Rpb24gcHJvcGVybHkuIFRoZSBuYW1lIGFuZCBhY3Rpb25zIGFyZSBwYXJzZWQgYnkgdGhlIGFjdHVhbAotUGVybWlzc2lvbiBjbGFzcy4KLTwvcD4KKzxwPkltcGxpZWQgcGVybWlzc2lvbnMgYXJlIGdyYW50ZWQuPC9wPgorPHA+UGxlYXNlIG5vdGUgdGhhdCBzb21lIFBlcm1pc3Npb24gY2xhc3NlcyBtYXkgYWN0dWFsbHkgbmVlZCBhIG5hbWUgYW5kL29yIGFjdGlvbnMgaW4gb3JkZXIgdG8KK2Z1bmN0aW9uIHByb3Blcmx5LiBUaGUgbmFtZSBhbmQgYWN0aW9ucyBhcmUgcGFyc2VkIGJ5IHRoZSBhY3R1YWwgUGVybWlzc2lvbiBjbGFzcy48L3A+CiA8aDQ+cmV2b2tlPC9oND4KLTxwPgotSW5kaWNhdGVzIGEgc3BlY2lmaWMgcGVybWlzc2lvbiBpcyByZXZva2VkLjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8cD5JbmRpY2F0ZXMgYSBzcGVjaWZpYyBwZXJtaXNzaW9uIGlzIHJldm9rZWQuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgUGVybWlzc2lvbiBjbGFzcy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+Y2xhc3M8L3RkPgorICAgIDx0ZD5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFBlcm1pc3Npb24gY2xhc3MuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgUGVybWlzc2lvbi4gVGhlIGFjdHVhbCBjb250ZW50cyBkZXBlbmRzIG9uIHRoZQotICAgIFBlcm1pc3Npb24gY2xhc3MuPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSBQZXJtaXNzaW9uLiBUaGUgYWN0dWFsIGNvbnRlbnRzIGRlcGVuZHMgb24gdGhlIFBlcm1pc3Npb24gY2xhc3MuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hY3Rpb25zPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBhY3Rpb25zIGFsbG93ZWQuIFRoZSBhY3R1YWwgY29udGVudHMgZGVwZW5kIG9uIHRoZSAKLSAgICBQZXJtaXNzaW9uIGNsYXNzIGFuZCBuYW1lLjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPmFjdGlvbnM8L3RkPgorICAgIDx0ZD5UaGUgYWN0aW9ucyBhbGxvd2VkLiBUaGUgYWN0dWFsIGNvbnRlbnRzIGRlcGVuZCBvbiB0aGUgUGVybWlzc2lvbiBjbGFzcyBhbmQgbmFtZS48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+Ci1JbXBsaWVkIHBlcm1pc3Npb25zIGFyZSBub3QgcmVzb2x2ZWQgYW5kIHRoZXJlZm9yZSBhbHNvIG5vdCByZXZva2VkLgotPC9wPgotPHA+Ci1UaGUgbmFtZSBjYW4gaGFuZGxlIHRoZSAqIHdpbGRjYXJkIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUsIGluIHdoaWNoIGNhc2UgYWxsIAotcGVybWlzc2lvbnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBvZiB3aGljaCB0aGUgbmFtZSBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLShleGNsdWRpbmcgdGhlICopIGFyZSByZXZva2VkLiBOb3RlIHRoYXQgdGhlIC0gd2lsZGNhcmQgb2Z0ZW4gc3VwcG9ydGVkIGJ5IHRoZQotZ3JhbnRlZCBwcm9wZXJ0aWVzIGlzIG5vdCBzdXBwb3J0ZWQuCi1JZiB0aGUgbmFtZSBpcyBsZWZ0IGVtcHR5IGFsbCBuYW1lcyBtYXRjaCwgYW5kIGFyZSByZXZva2VkLgotSWYgdGhlIGFjdGlvbnMgYXJlIGxlZnQgZW1wdHkgYWxsIGFjdGlvbnMgbWF0Y2gsIGFuZCBhcmUgcmV2b2tlZC4KLTwvcD4KLTxoMz48YSBuYW1lPSJiYXNlc2V0Ij5CYXNlIHNldDwvYT48L2gzPgotQSBwZXJtaXNzaW9ucyBzZXQgaW1wbGljaXRseSBjb250YWlucyB0aGUgZm9sbG93aW5nIHBlcm1pc3Npb25zOgotPGJsb2NrcXVvdGU+PHByZT4KKzxwPkltcGxpZWQgcGVybWlzc2lvbnMgYXJlIG5vdCByZXNvbHZlZCBhbmQgdGhlcmVmb3JlIGFsc28gbm90IHJldm9rZWQuPC9wPgorPHA+VGhlIDx2YXI+bmFtZTwvdmFyPiBjYW4gaGFuZGxlIHRoZSA8cT4qPC9xPiB3aWxkY2FyZCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lLCBpbiB3aGljaCBjYXNlCithbGwgcGVybWlzc2lvbnMgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyBvZiB3aGljaCB0aGUgbmFtZSBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyhleGNsdWRpbmcgdGhlIDxxPio8L3E+KSBhcmUgcmV2b2tlZC4gTm90ZSB0aGF0IHRoZSA8cT4tPC9xPiB3aWxkY2FyZCBvZnRlbiBzdXBwb3J0ZWQgYnkgdGhlCitncmFudGVkIHByb3BlcnRpZXMgaXMgbm90IHN1cHBvcnRlZC4gIElmIHRoZSA8dmFyPm5hbWU8L3Zhcj4gaXMgbGVmdCBlbXB0eSBhbGwgbmFtZXMgbWF0Y2gsIGFuZAorYXJlIHJldm9rZWQuICBJZiB0aGUgPHZhcj5hY3Rpb25zPC92YXI+IGFyZSBsZWZ0IGVtcHR5IGFsbCBhY3Rpb25zIG1hdGNoLCBhbmQgYXJlIHJldm9rZWQuPC9wPgorPGgzIGlkPSJiYXNlc2V0Ij5CYXNlIHNldDwvaDM+Cis8cD5BIHBlcm1pc3Npb25zIHNldCBpbXBsaWNpdGx5IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcGVybWlzc2lvbnM6PC9wPgorPHByZT4KICZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uJnF1b3Q7IG5hbWU9JnF1b3Q7bG9jYWxob3N0OjEwMjQtJnF1b3Q7IGFjdGlvbnM9JnF1b3Q7bGlzdGVuJnF1b3Q7Jmd0OwogJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZlcnNpb24mcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OwogJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZlbmRvciZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CkBAIC0xMzYsMjkgKzExNywyNiBAQAogJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZtLnZlcnNpb24mcXVvdDsgYWN0aW9ucz0mcXVvdDtyZWFkJnF1b3Q7Jmd0OwogJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDtqYXZhLnZtLnZlbmRvciZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7CiAmbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2phdmEudm0ubmFtZSZxdW90OyBhY3Rpb25zPSZxdW90O3JlYWQmcXVvdDsmZ3Q7Ci08L2Jsb2NrcXVvdGU+PC9wcmU+Ci1UaGVzZSBwZXJtaXNzaW9ucyBjYW4gYmUgcmV2b2tlZCB2aWEgPGNvZGU+Jmx0O3Jldm9rZSZndDs8L2NvZGU+IGVsZW1lbnRzIGlmIG5lY2Vzc2FyeS4KKzwvcHJlPgorPHA+VGhlc2UgcGVybWlzc2lvbnMgY2FuIGJlIHJldm9rZWQgdmlhIDxjb2RlPiZsdDtyZXZva2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBpZiBuZWNlc3NhcnkuPC9wPgogCiA8aDM+RXhhbXBsZXM8L2gzPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7cGVybWlzc2lvbnMmZ3Q7CiAgICZsdDtncmFudCBjbGFzcz0mcXVvdDtqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24mcXVvdDsvJmd0OwogICAmbHQ7cmV2b2tlIGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsvJmd0OwogJmx0Oy9wZXJtaXNzaW9ucyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR3JhbnRzIGFsbCBwZXJtaXNzaW9ucyB0byB0aGUgY29kZSBleGNlcHQgZm9yIHRob3NlIGhhbmRsaW5nIFByb3BlcnRpZXMuCi08L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPC9wcmU+Cis8cD5HcmFudHMgYWxsIHBlcm1pc3Npb25zIHRvIHRoZSBjb2RlIGV4Y2VwdCBmb3IgdGhvc2UgaGFuZGxpbmcgUHJvcGVydGllcy48L3A+Cis8cHJlPgogJmx0O3Blcm1pc3Npb25zJmd0OwogICAmbHQ7Z3JhbnQgY2xhc3M9JnF1b3Q7amF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiZxdW90OyBuYW1lPSZxdW90O2Zvby5iYXIuY29tJnF1b3Q7IGFjdGlvbj0mcXVvdDtjb25uZWN0JnF1b3Q7LyZndDsKICAgJmx0O2dyYW50IGNsYXNzPSZxdW90O2phdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24mcXVvdDsgbmFtZT0mcXVvdDt1c2VyLmhvbWUmcXVvdDsgYWN0aW9uPSZxdW90O3JlYWQsd3JpdGUmcXVvdDsvJmd0OwogJmx0Oy9wZXJtaXNzaW9ucyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotR3JhbnRzIHRoZSBiYXNlIHNldCBvZiBwZXJtaXNzaW9ucyB3aXRoIHRoZSBhZGRpdGlvbiBvZiBhIFNvY2tldFBlcm1pc3Npb24gdG8gY29ubmVjdAotdG8gZm9vLmJhci5jb20gYW5kIHRoZSBwZXJtaXNzaW9uIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSB1c2VyLmhvbWUgc3lzdGVtIHByb3BlcnR5LgotPC9wPgorPC9wcmU+Cis8cD5HcmFudHMgdGhlIGJhc2Ugc2V0IG9mIHBlcm1pc3Npb25zIHdpdGggdGhlIGFkZGl0aW9uIG9mCithIDxjb2RlIGNsYXNzPSJjb2RlIj5Tb2NrZXRQZXJtaXNzaW9uPC9jb2RlPiB0byBjb25uZWN0IHRvIDxzYW1wPmZvby5iYXIuY29tPC9zYW1wPiBhbmQgdGhlCitwZXJtaXNzaW9uIHRvIHJlYWQgYW5kIHdyaXRlIHRoZSA8Y29kZT51c2VyLmhvbWU8L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eS48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9wcm9wZXJ0eXNldC5odG1sIGIvbWFudWFsL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwKaW5kZXggODFkNDkxZS4uODk2M2ZmOSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL3Byb3BlcnR5c2V0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw4MCArMTUsNzEgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlByb3BlcnR5U2V0IFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InByb3BlcnR5c2V0Ij5Qcm9wZXJ0eVNldDwvYT48L2gyPgorPGgyIGlkPSJwcm9wZXJ0eXNldCI+UHJvcGVydHlTZXQ8L2gyPgogPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS42PC9lbT48L3A+CiAKLTxwPkdyb3VwcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgYnkgcmVmZXJlbmNlIGluIGEgdGFzayB0aGF0Ci1zdXBwb3J0cyB0aGlzLjwvcD4KKzxwPkdyb3VwcyBhIHNldCBvZiBwcm9wZXJ0aWVzIHRvIGJlIHVzZWQgYnkgcmVmZXJlbmNlIGluIGEgdGFzayB0aGF0IHN1cHBvcnRzIHRoaXMuPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmR5bmFtaWM8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byByZWV2YWx1YXRlIHRoZSBzZXQgZXZlcnkgdGltZSB0aGUgc2V0Ci0gICAgICBpcyB1c2VkLiAgRGVmYXVsdCBpcyAmcXVvdDs8Y29kZT50cnVlPC9jb2RlPiZxdW90Oy48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5keW5hbWljPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byByZWV2YWx1YXRlIHRoZSBzZXQgZXZlcnkgdGltZSB0aGUgc2V0IGlzIHVzZWQuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uZWdhdGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBuZWdhdGUgcmVzdWx0cy4gSWYKLSAgICAgICZxdW90Ozxjb2RlPnRydWU8L2NvZGU+JnF1b3Q7LCBhbGwgcHJvcGVydGllcyA8aT5ub3Q8L2k+Ci0gICAgICBzZWxlY3RlZCBieSBuZXN0ZWQgZWxlbWVudHMgd2lsbCBiZSByZXR1cm5lZC4gRGVmYXVsdCBpcwotICAgICAgJnF1b3Q7PGNvZGU+ZmFsc2U8L2NvZGU+JnF1b3Q7LiA8ZW0+U2luY2UgQW50IDEuNi4yPC9lbT4KKyAgICA8dGQ+bmVnYXRlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBuZWdhdGUgcmVzdWx0cy4gSWYgPHE+dHJ1ZTwvcT4sIGFsbCBwcm9wZXJ0aWVzIDxlbT5ub3Q8L2VtPiBzZWxlY3RlZCBieQorICAgICAgbmVzdGVkIGVsZW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQuIDxlbT5TaW5jZSBBbnQgMS42LjI8L2VtPgogICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKIDxoND5wcm9wZXJ0eXJlZjwvaDQ+CiAKLTxwPlNlbGVjdHMgcHJvcGVydGllcyBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi1zZXQuPC9wPgorPHA+U2VsZWN0cyBwcm9wZXJ0aWVzIGZyb20gdGhlIGN1cnJlbnQgcHJvamVjdCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgc2V0LjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlNlbGVjdCB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgcm93c3Bhbj0iNCI+RXhhY3RseSBvbmUgb2YgdGhlc2UuPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlNlbGVjdCB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZS48L3RkPgorICAgIDx0ZCByb3dzcGFuPSI0Ij5FeGFjdGx5IG9uZSBvZiB0aGVzZTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnByZWZpeDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZWxlY3QgdGhlIHByb3BlcnRpZXMgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCB0aGUKLSAgICAgIGdpdmVuIHN0cmluZy48L3RkPgorICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U2VsZWN0IHRoZSBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHN0cmluZy48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5yZWdleDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5TZWxlY3QgdGhlIHByb3BlcnRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4KLSAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbi4gIFNpbWlsYXIgdG8gPGEKLSAgICAgIGhyZWY9Im1hcHBlci5odG1sI3JlZ2V4cC1tYXBwZXIiPnJlZ2V4cCB0eXBlIG1hcHBlcnM8L2E+LCB0aGlzCi0gICAgICByZXF1aXJlcyBhIHN1cHBvcnRlZCByZWd1bGFyIGV4cHJlc3Npb24gbGlicmFyeS48L3RkPgorICAgIDx0ZD5yZWdleDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5TZWxlY3QgdGhlIHByb3BlcnRpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uLiAgU2ltaWxhcgorICAgICAgdG8gPGEgaHJlZj0ibWFwcGVyLmh0bWwjcmVnZXhwLW1hcHBlciI+cmVnZXhwIHR5cGUgbWFwcGVyczwvYT4sIHRoaXMgcmVxdWlyZXMgYSBzdXBwb3J0ZWQKKyAgICAgIHJlZ3VsYXIgZXhwcmVzc2lvbiBsaWJyYXJ5LjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmJ1aWx0aW48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+U2VsZWN0cyBhIGJ1aWx0aW4gc2V0IG9mIHByb3BlcnRpZXMuICBWYWxpZAotICAgICAgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgPGNvZGU+YWxsPC9jb2RlPiBmb3IgYWxsIEFudAotICAgICAgcHJvcGVydGllcywgPGNvZGU+c3lzdGVtPC9jb2RlPiBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZAotICAgICAgPGNvZGU+Y29tbWFuZGxpbmU8L2NvZGU+IGZvciBhbGwgcHJvcGVydGllcyBzcGVjaWZpZWQgb24gdGhlCisgICAgPHRkPmJ1aWx0aW48L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+U2VsZWN0cyBhIGJ1aWx0aW4gc2V0IG9mIHByb3BlcnRpZXMuICBWYWxpZCB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlCisgICAgICBhcmUgPHE+YWxsPC9xPiBmb3IgYWxsIEFudCBwcm9wZXJ0aWVzLCA8cT5zeXN0ZW08L3E+IGZvciB0aGUgc3lzdGVtIHByb3BlcnRpZXMgYW5kCisgICAgICA8cT5jb21tYW5kbGluZTwvcT4gZm9yIGFsbCBwcm9wZXJ0aWVzIHNwZWNpZmllZCBvbiB0aGUKICAgICAgIGNvbW1hbmQgbGluZSB3aGVuIGludm9raW5nIEFudCAocGx1cyBhIG51bWJlciBvZiBzcGVjaWFsCiAgICAgICBpbnRlcm5hbCBBbnQgcHJvcGVydGllcykuPC90ZD4KICAgPC90cj4KQEAgLTk1LDEyICs4NywxMiBAQAogCiA8aDQ+cHJvcGVydHlzZXQ8L2g0PgogCi08cD5BIDxjb2RlPnByb3BlcnR5c2V0PC9jb2RlPiBjYW4gYmUgdXNlZCBhcyB0aGUgc2V0IHVuaW9uIG9mIG1vcmUKLTxjb2RlPnByb3BlcnR5c2V0PC9jb2RlPnMuPC9wPgorPHA+QSA8Y29kZT5wcm9wZXJ0eXNldDwvY29kZT4gY2FuIGJlIHVzZWQgYXMgdGhlIHNldCB1bmlvbiBvZgorbW9yZSA8Y29kZT5wcm9wZXJ0eXNldDwvY29kZT5zLjwvcD4KIAogPHA+Rm9yIGV4YW1wbGU6PC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwcm9wZXJ0eXNldCBpZD0mcXVvdDtwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtZm9vJnF1b3Q7Jmd0OwogICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiAmbHQ7L3Byb3BlcnR5c2V0Jmd0OwpAQCAtMTExLDMzICsxMDMsMjggQEAKICAgJmx0O3Byb3BlcnR5c2V0IHJlZmlkPSZxdW90O3Byb3BlcnRpZXMtc3RhcnRpbmctd2l0aC1mb28mcXVvdDsvJmd0OwogICAmbHQ7cHJvcGVydHlzZXQgcmVmaWQ9JnF1b3Q7cHJvcGVydGllcy1zdGFydGluZy13aXRoLWJhciZxdW90Oy8mZ3Q7CiAmbHQ7L3Byb3BlcnR5c2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorPC9wcmU+CiAKLTxwPmNvbGxlY3RzIGFsbCBwcm9wZXJ0aWVzIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggZWl0aGVyCi0mcXVvdDtmb28mcXVvdDsgb3IgJnF1b3Q7YmFyJnF1b3Q7IGluIHRoZSBzZXQgbmFtZWQKLSZxdW90O215LXNldCZxdW90Oy48L3A+Cis8cD5jb2xsZWN0cyBhbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGVpdGhlciA8cT5mb288L3E+IG9yIDxxPmJhcjwvcT4gaW4gdGhlIHNldAorbmFtZWQgPHE+bXktc2V0PC9xPi48L3A+CiAKIDxoND5tYXBwZXI8L2g0PgogCi08cD5BIDxhIGhyZWY9Im1hcHBlci5odG1sIj5tYXBwZXI8L2E+IC0gYXQgbWF4aW11bSBvbmUgbWFwcGVyIGNhbiBiZQotc3BlY2lmaWVkLiAgVGhlIG1hcHBlciBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnR5Ci1rZXlzLCBmb3IgZXhhbXBsZToKKzxwPkEgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4mbWRhc2g7YXQgbWF4aW11bSBvbmUgbWFwcGVyIGNhbiBiZSBzcGVjaWZpZWQuICBUaGUgbWFwcGVyCitpcyB1c2VkIHRvIGNoYW5nZSB0aGUgbmFtZXMgb2YgdGhlIHByb3BlcnR5IGtleXMsIGZvciBleGFtcGxlOgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwcm9wZXJ0eXNldCBpZD0mcXVvdDtwcm9wZXJ0aWVzLXN0YXJ0aW5nLXdpdGgtZm9vJnF1b3Q7Jmd0OwogICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSZxdW90O2ZvbyZxdW90Oy8mZ3Q7CiAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Zm9vKiZxdW90OyB0bz0mcXVvdDtiYXIqJnF1b3Q7LyZndDsKICZsdDsvcHJvcGVydHlzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Cis8L3ByZT4KIAotPHA+Y29sbGVjdHMgYWxsIHByb3BlcnRpZXMgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCAmcXVvdDtmb28mcXVvdDssIGJ1dAotY2hhbmdlcyB0aGUgbmFtZXMgdG8gc3RhcnQgd2l0aCAmcXVvdDtiYXImcXVvdDsgaW5zdGVhZC48L3A+Cis8cD5jb2xsZWN0cyBhbGwgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIDxxPmZvbzwvcT4sIGJ1dCBjaGFuZ2VzIHRoZSBuYW1lcyB0byBzdGFydAord2l0aCA8cT5iYXI8L3E+IGluc3RlYWQuPC9wPgogCi08cD5JZiBzdXBwbGllZCwgdGhlIG5lc3RlZCBtYXBwZXIgd2lsbCBiZSBhcHBsaWVkCi1zdWJzZXF1ZW50IHRvIGFueSBuZWdhdGlvbiBvZiBtYXRjaGVkIHByb3BlcnRpZXMuPC9wPgotCi0KKzxwPklmIHN1cHBsaWVkLCB0aGUgbmVzdGVkIG1hcHBlciB3aWxsIGJlIGFwcGxpZWQgc3Vic2VxdWVudCB0byBhbnkgbmVnYXRpb24gb2YgbWF0Y2hlZAorcHJvcGVydGllcy48L3A+CiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL3JlZGlyZWN0b3IuaHRtbCBiL21hbnVhbC9UeXBlcy9yZWRpcmVjdG9yLmh0bWwKaW5kZXggZDBlMzY4My4uYzBhMWMwZSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL3JlZGlyZWN0b3IuaHRtbAorKysgYi9tYW51YWwvVHlwZXMvcmVkaXJlY3Rvci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTgwICsxNSwxNTMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJlZGlyZWN0b3IgVHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0icmVkaXJlY3RvciI+SS9PIHJlZGlyZWN0aW9uPC9hPjwvaDI+Ci08cD5Gb3IgbWFueSB0YXNrcywgaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgZGVmaW5lZCBpbiBhIGZhaXJseQotc3RyYWlnaHRmb3J3YXJkIGZhc2hpb24uICBUaGUgPGEgaHJlZj0iLi4vVGFza3MvZXhlYy5odG1sIj5leGVjPC9hPgotdGFzaywgdXNlZCB0byBleGVjdXRlIGFuIGV4dGVybmFsIHByb2Nlc3MsIHN0YW5kcyBhcyBhIHZlcnkKLWJhc2ljIGV4YW1wbGUuICBUaGUgZXhlY3V0ZWQgcHJvY2VzcyBtYXkgYWNjZXB0IGlucHV0LCBwcm9kdWNlCi1vdXRwdXQsIG9yIGRvIGVpdGhlciBvciBib3RoIGRlcGVuZGluZyB1cG9uIHZhcmlvdXMgY2lyY3Vtc3RhbmNlcy4KLU91dHB1dCBtYXkgYmUgY2xhc3NpZmllZCBhcyAmcXVvdDtvdXRwdXQmcXVvdDsgb3IgYXMgJnF1b3Q7ZXJyb3IKLW91dHB1dC4mcXVvdDsgIFRoZSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+IHR5cGUgcHJvdmlkZXMgYSBjb25jcmV0ZSBtZWFucwotb2YgcmVkaXJlY3RpbmcgaW5wdXQgYW5kIG91dHB1dCBmZWF0dXJpbmcgdGhlIHVzZSBvZgotPGEgaHJlZj0iLi9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXI8L2E+cyB0byBzcGVjaWZ5Ci1zb3VyY2UgKGlucHV0KSBhbmQgZGVzdGluYXRpb24gKG91dHB1dC9lcnJvcikgZmlsZXMuICA8ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuMjwvZW0+Cis8aDIgaWQ9InJlZGlyZWN0b3IiPkkvTyByZWRpcmVjdGlvbjwvaDI+Cis8cD48ZW0+U2luY2UgQXBhY2hlIEFudCAxLjYuMjwvZW0+PC9wPgorPHA+Rm9yIG1hbnkgdGFza3MsIGlucHV0IGFuZCBvdXRwdXQgY2FuIGJlIGRlZmluZWQgaW4gYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIGZhc2hpb24uCitUaGUgPGEgaHJlZj0iLi4vVGFza3MvZXhlYy5odG1sIj5leGVjPC9hPiB0YXNrLCB1c2VkIHRvIGV4ZWN1dGUgYW4gZXh0ZXJuYWwgcHJvY2Vzcywgc3RhbmRzIGFzIGEKK3ZlcnkgYmFzaWMgZXhhbXBsZS4gIFRoZSBleGVjdXRlZCBwcm9jZXNzIG1heSBhY2NlcHQgaW5wdXQsIHByb2R1Y2Ugb3V0cHV0LCBvciBkbyBlaXRoZXIgb3IgYm90aAorZGVwZW5kaW5nIHVwb24gdmFyaW91cyBjaXJjdW1zdGFuY2VzLiAgT3V0cHV0IG1heSBiZSBjbGFzc2lmaWVkIGFzIDxlbT5vdXRwdXQ8L2VtPiBvcgorYXMgPGVtPmVycm9yIG91dHB1dDwvZW0+LiAgVGhlIDxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4gdHlwZSBwcm92aWRlcyBhIGNvbmNyZXRlIG1lYW5zIG9mCityZWRpcmVjdGluZyBpbnB1dCBhbmQgb3V0cHV0IGZlYXR1cmluZyB0aGUgdXNlIG9mIDxhIGhyZWY9Ii4vbWFwcGVyLmh0bWwiPkZpbGUgTWFwcGVyPC9hPnMgdG8KK3NwZWNpZnkgc291cmNlIChpbnB1dCkgYW5kIGRlc3RpbmF0aW9uIChvdXRwdXQvZXJyb3IpIGZpbGVzLjwvcD4KIDxwPlRoZSA8Y29kZT4mbHQ7cmVkaXJlY3RvciZndDs8L2NvZGU+IGVsZW1lbnQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5vdXRwdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TmFtZSBvZiBhIGZpbGUgdG8gd2hpY2ggb3V0cHV0IHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgSWYgdGhlIGVycm9yIHN0cmVhbSBpcyBub3QgYWxzbyByZWRpcmVjdGVkIHRvIGEgZmlsZSBvciBwcm9wZXJ0eSwKLSAgICAgIGl0IHdpbGwgYXBwZWFyIGluIHRoaXMgb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPm91dHB1dDwvdGQ+CisgICAgPHRkPk5hbWUgb2YgYSBmaWxlIHRvIHdoaWNoIG91dHB1dCBzaG91bGQgYmUgd3JpdHRlbi4gIElmIHRoZSBlcnJvciBzdHJlYW0gaXMgbm90IGFsc28KKyAgICAgIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIG9yIHByb3BlcnR5LCBpdCB3aWxsIGFwcGVhciBpbiB0aGlzIG91dHB1dC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBmaWxlIHRvIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUKLSAgICAgIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+ZXJyb3I8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSB0byB3aGljaCB0aGUgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2dFcnJvcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlCi0gICAgICBlcnJvciBvdXRwdXQgaW4gQW50J3MgbG9nIGFuZCB5b3UgYXJlIHJlZGlyZWN0aW5nIG91dHB1dCB0bwotICAgICAgYSBmaWxlL3Byb3BlcnR5LiBUaGUgZXJyb3Igb3V0cHV0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluCi0gICAgICB0aGUgb3V0cHV0IGZpbGUvcHJvcGVydHkuIElmIHlvdSByZWRpcmVjdCBlcnJvciB3aXRoIHRoZQotICAgICAgPGk+ZXJyb3I8L2k+IG9yIDxpPmVycm9yUHJvcGVydHk8L2k+IGF0dHJpYnV0ZXMsIHRoaXMgd2lsbAotICAgICAgaGF2ZSBubyBlZmZlY3QuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+bG9nRXJyb3I8L3RkPgorICAgIDx0ZD5UaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHdoZW4geW91IHdpc2ggdG8gc2VlIGVycm9yIG91dHB1dCBpbiBBbnQncyBsb2cgYW5kIHlvdSBhcmUKKyAgICAgIHJlZGlyZWN0aW5nIG91dHB1dCB0byBhIGZpbGUvcHJvcGVydHkuIFRoZSBlcnJvciBvdXRwdXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dAorICAgICAgZmlsZS9wcm9wZXJ0eS48L3RkPgorICAgIDx0ZD5ObzsgaWdub3JlZCBpZiA8dmFyPmVycm9yPC92YXI+IG9yIDx2YXI+ZXJyb3JQcm9wZXJ0eTwvdmFyPgorICAgIGlzIHNldDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFwcGVuZDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIG91dHB1dCBhbmQgZXJyb3IgZmlsZXMgc2hvdWxkIGJlCi0gICAgICBhcHBlbmRlZCB0byByYXRoZXIgdGhhbiBvdmVyd3JpdHRlbi4gRGVmYXVsdHMgdG8KLSAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5hcHBlbmQ8L3RkPgorICAgIDx0ZD5XaGV0aGVyIG91dHB1dCBhbmQgZXJyb3IgZmlsZXMgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHJhdGhlciB0aGFuIG92ZXJ3cml0dGVuLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5mYWxzZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jcmVhdGVlbXB0eWZpbGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgb3V0cHV0IGFuZCBlcnJvciBmaWxlcyBzaG91bGQgYmUKLSAgICAgIGNyZWF0ZWQgZXZlbiB3aGVuIGVtcHR5LiAgRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Y3JlYXRlZW1wdHlmaWxlczwvdGQ+CisgICAgPHRkPldoZXRoZXIgb3V0cHV0IGFuZCBlcnJvciBmaWxlcyBzaG91bGQgYmUgY3JlYXRlZCBldmVuIHdoZW4gZW1wdHkuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0cHJvcGVydHk8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgb3V0cHV0IG9mIHRoZQotICAgICAgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLiBVbmxlc3MgdGhlIGVycm9yIHN0cmVhbSBpcyByZWRpcmVjdGVkCi0gICAgICB0byBhIHNlcGFyYXRlIGZpbGUgb3Igc3RyZWFtLCB0aGlzIHByb3BlcnR5IHdpbGwgaW5jbHVkZSB0aGUKKyAgICA8dGQ+b3V0cHV0cHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBvdXRwdXQgb2YgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIHN0b3JlZC4gVW5sZXNzIHRoZQorICAgICAgZXJyb3Igc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gYSBzZXBhcmF0ZSBmaWxlIG9yIHN0cmVhbSwgdGhpcyBwcm9wZXJ0eSB3aWxsIGluY2x1ZGUgdGhlCiAgICAgICBlcnJvciBvdXRwdXQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcnByb3BlcnR5PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGEgcHJvcGVydHkgaW4gd2hpY2ggdGhlIHN0YW5kYXJkIGVycm9yCi0gICAgICBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmVycm9ycHJvcGVydHk8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiBhIHByb3BlcnR5IGluIHdoaWNoIHRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgc3RvcmVkLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+aW5wdXQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaWxlIGZyb20gd2hpY2ggdGhlIGV4ZWN1dGVkIGNvbW1hbmQncyBzdGFuZGFyZCBpbnB1dAotICAgICAgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIHRoZQotICAgICAgPGk+aW5wdXRzdHJpbmc8L2k+IGF0dHJpYnV0ZS48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbnB1dDwvdGQ+CisgICAgPHRkPkEgZmlsZSBmcm9tIHdoaWNoIHRoZSBleGVjdXRlZCBjb21tYW5kJ3Mgc3RhbmRhcmQgaW5wdXQgaXMgdGFrZW4uIFRoaXMgYXR0cmlidXRlIGlzCisgICAgICBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgPHZhcj5pbnB1dHN0cmluZzwvdmFyPiBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dHN0cmluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlCi0gICAgICBleGVjdXRlZCBjb21tYW5kLiBUaGlzIGF0dHJpYnV0ZSBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUKLSAgICAgIDxpPmlucHV0PC9pPiBhdHRyaWJ1dGUuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+aW5wdXRzdHJpbmc8L3RkPgorICAgIDx0ZD5BIHN0cmluZyB3aGljaCBzZXJ2ZXMgYXMgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGV4ZWN1dGVkIGNvbW1hbmQuIFRoaXMgYXR0cmlidXRlIGlzCisgICAgICBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgPHZhcj5pbnB1dDwvdmFyPiBhdHRyaWJ1dGUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbnB1dGVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBpbnB1dCBlbmNvZGluZy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5pbnB1dGVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGlucHV0IGVuY29kaW5nLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+b3V0cHV0ZW5jb2Rpbmc8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG91dHB1dCBlbmNvZGluZy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5vdXRwdXRlbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBvdXRwdXQgZW5jb2RpbmcuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lcnJvcmVuY29kaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlcnJvciBlbmNvZGluZy48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5lcnJvcmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVycm9yIGVuY29kaW5nLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YWx3YXlzbG9nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkFsd2F5cyBzZW5kIHRvIHRoZSBsb2cgaW4gYWRkaXRpb24gdG8KLSAgICAgICAgYW55IG90aGVyIGRlc3RpbmF0aW9uLiA8aT5TaW5jZSBBbnQgMS42LjM8L2k+LgorICAgIDx0ZD5hbHdheXNsb2c8L3RkPgorICAgIDx0ZD5BbHdheXMgc2VuZCB0byB0aGUgbG9nIGluIGFkZGl0aW9uIHRvIGFueSBvdGhlciBkZXN0aW5hdGlvbi4gPGVtPlNpbmNlIEFudCAxLjYuMzwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5sb2dpbnB1dHN0cmluZzwvdGQ+CisgICAgPHRkPkNvbnRyb2xzIHRoZSBkaXNwbGF5IG9mIDx2YXI+aW5wdXRzdHJpbmc8L3Zhcj4ncyB2YWx1ZSBpbiBsb2cgbWVzc2FnZXMuIFNldAorICAgICAgdG8gPHE+ZmFsc2U8L3E+IHdoZW4gc2VuZGluZyBzZW5zaXRpdmUgZGF0YSAoZS5nLiBwYXNzd29yZHMpIHRvIGV4dGVybmFsCisgICAgICBwcm9jZXNzZXMuIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5iaW5hcnlPdXRwdXQ8L3RkPgorICAgIDx0ZD5XaGVuIHNldCB0byA8cT50cnVlPC9xPiBBbnQgd2lsbCBub3QgdHJ5IHRvIHNwbGl0IHRoZSBvdXRwdXQgaW50byBsaW5lcyZtZGFzaDt3aGljaCBpdAorICAgICAgd2lsbCB1c3VhbGx5IGRvIGluIG9yZGVyIHRvIHNlcGFyYXRlIGVycm9yIGZyb20gbm9ybWFsIG91dHB1dC4gIFRoaXMgc2V0dGluZyB3aWxsIG5vdAorICAgICAgcHJldmVudCBiaW5hcnkgb3V0cHV0IGZyb20gZ2V0dGluZyBjb3JydXB0ZWQgaWYgeW91IGFsc28gc3BlY2lmeSBmaWx0ZXIgY2hhaW5zLgorICAgICAgPGVtPlNpbmNlIEFudCAxLjkuNDwvZW0+CiAgICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+Ci0gIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvZ2lucHV0c3RyaW5nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkNvbnRyb2xzIHRoZSBkaXNwbGF5IG9mIDxpPmlucHV0c3RyaW5nPC9pPidzIHZhbHVlIGluCi0gICAgICAgIGxvZyBtZXNzYWdlcy4gU2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiB3aGVuIHNlbmRpbmcgc2Vuc2l0aXZlIGRhdGEKLSAgICAgICAgKGUuZy4gcGFzc3dvcmRzKSB0byBleHRlcm5hbCBwcm9jZXNzZXMuIDxpPlNpbmNlIEFudCAxLjYuMzwvaT4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxjb2RlPnRydWU8L2NvZGU+PC90ZD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmluYXJ5T3V0cHV0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZW4gc2V0IHRvIHRydWUgQW50IHdpbGwgbm90IHRyeSB0byBzcGxpdCB0aGUKLSAgICAgIG91dHB1dCBpbnRvIGxpbmVzIC0gd2hpY2ggaXQgd2lsbCB1c3VhbGx5IGRvIGluIG9yZGVyIHRvIHNlcGFyYXRlCi0gICAgICBlcnJvciBmcm9tIG5vcm1hbCBvdXRwdXQuICBUaGlzIHNldHRpbmcgd2lsbCBub3QgcHJldmVudCBiaW5hcnkKLSAgICAgIG91dHB1dCBmcm9tIGdldHRpbmcgY29ycnVwdGVkIGlmIHlvdSBhbHNvIHNwZWNpZnkgZmlsdGVyIGNoYWlucy4KLSAgICAgIDxpPlNpbmNlIEFudCAxLjkuNDwvaT4uCi0gICAgPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+aW5wdXRtYXBwZXI8L2g0PgotPHA+QSBzaW5nbGUgPGEgaHJlZj0iLi9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXI8L2E+IHVzZWQgdG8gcmVkaXJlY3QgcHJvY2VzcwotaW5wdXQuICBNdWx0aXBsZSBtYXBwaW5nIHJlc3VsdHMgc2hvdWxkIGNvbmNhdGVuYXRlIGFsbCBtYXBwZWQgZmlsZXMgYXMgaW5wdXQuCi1NYXBwaW5nIHdpbGwgb3JkaW5hcmlseSBiZSBwZXJmb3JtZWQgb24gYSB0YXNrLXNwZWNpZmllZCBzb3VyY2VmaWxlOwotY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCB0YXNrIGZvciBtb3JlIGRldGFpbHMuCi1BIG5lc3RlZCA8Y29kZT4mbHQ7aW5wdXRtYXBwZXImZ3Q7PC9jb2RlPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGVpdGhlciBvZiB0aGUKLTxpPmlucHV0PC9pPiBvciA8aT5pbnB1dHN0cmluZzwvaT4gYXR0cmlidXRlcy48L3A+Cis8cD5BIHNpbmdsZSA8YSBocmVmPSIuL21hcHBlci5odG1sIj5GaWxlIE1hcHBlcjwvYT4gdXNlZCB0byByZWRpcmVjdCBwcm9jZXNzIGlucHV0LiAgTXVsdGlwbGUKK21hcHBpbmcgcmVzdWx0cyBzaG91bGQgY29uY2F0ZW5hdGUgYWxsIG1hcHBlZCBmaWxlcyBhcyBpbnB1dC4gIE1hcHBpbmcgd2lsbCBvcmRpbmFyaWx5IGJlCitwZXJmb3JtZWQgb24gYSB0YXNrLXNwZWNpZmllZCBzb3VyY2VmaWxlOyBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIHRhc2sgZm9yCittb3JlIGRldGFpbHMuICBBIG5lc3RlZCA8Y29kZT4mbHQ7aW5wdXRtYXBwZXImZ3Q7PC9jb2RlPiBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGVpdGhlciBvZiB0aGUKKzx2YXI+aW5wdXQ8L3Zhcj4gb3IgPHZhcj5pbnB1dHN0cmluZzwvdmFyPiBhdHRyaWJ1dGVzLjwvcD4KIDxoND5vdXRwdXRtYXBwZXI8L2g0PgotPHA+QSBzaW5nbGUgPGEgaHJlZj0iLi9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXI8L2E+IHVzZWQgdG8gcmVkaXJlY3QgcHJvY2Vzcwotb3V0cHV0LiAgTWFwcGluZyB3aWxsIG9yZGluYXJpbHkgYmUgcGVyZm9ybWVkIG9uIGEgdGFzay1zcGVjaWZpZWQgc291cmNlZmlsZTsKLWNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGluZGl2aWR1YWwgdGFzayBmb3IgbW9yZSBkZXRhaWxzLgotQSBuZXN0ZWQgPGNvZGU+Jmx0O291dHB1dG1hcHBlciZndDs8L2NvZGU+IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlCi08aT5vdXRwdXQ8L2k+IGF0dHJpYnV0ZS48L3A+Cis8cD5BIHNpbmdsZSA8YSBocmVmPSIuL21hcHBlci5odG1sIj5GaWxlIE1hcHBlcjwvYT4gdXNlZCB0byByZWRpcmVjdCBwcm9jZXNzIG91dHB1dC4gIE1hcHBpbmcKK3dpbGwgb3JkaW5hcmlseSBiZSBwZXJmb3JtZWQgb24gYSB0YXNrLXNwZWNpZmllZCBzb3VyY2VmaWxlOyBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZQoraW5kaXZpZHVhbCB0YXNrIGZvciBtb3JlIGRldGFpbHMuICBBIG5lc3RlZCA8Y29kZT4mbHQ7b3V0cHV0bWFwcGVyJmd0OzwvY29kZT4gaXMgbm90IGNvbXBhdGlibGUKK3dpdGggdGhlIDx2YXI+b3V0cHV0PC92YXI+IGF0dHJpYnV0ZS48L3A+CiA8aDQ+ZXJyb3JtYXBwZXI8L2g0PgotPHA+QSBzaW5nbGUgPGEgaHJlZj0iLi9tYXBwZXIuaHRtbCI+RmlsZSBNYXBwZXI8L2E+IHVzZWQgdG8gcmVkaXJlY3QgZXJyb3IKLW91dHB1dC4gIE1hcHBpbmcgd2lsbCBvcmRpbmFyaWx5IGJlIHBlcmZvcm1lZCBvbiBhIHRhc2stc3BlY2lmaWVkIHNvdXJjZWZpbGU7Ci1jb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIHRhc2sgZm9yIG1vcmUgZGV0YWlscy4KLUEgbmVzdGVkIDxjb2RlPiZsdDtlcnJvcm1hcHBlciZndDs8L2NvZGU+IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlCi08aT5lcnJvcjwvaT4gYXR0cmlidXRlLjwvcD4KKzxwPkEgc2luZ2xlIDxhIGhyZWY9Ii4vbWFwcGVyLmh0bWwiPkZpbGUgTWFwcGVyPC9hPiB1c2VkIHRvIHJlZGlyZWN0IGVycm9yIG91dHB1dC4gIE1hcHBpbmcgd2lsbAorb3JkaW5hcmlseSBiZSBwZXJmb3JtZWQgb24gYSB0YXNrLXNwZWNpZmllZCBzb3VyY2VmaWxlOyBjb25zdWx0IHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZQoraW5kaXZpZHVhbCB0YXNrIGZvciBtb3JlIGRldGFpbHMuICBBIG5lc3RlZCA8Y29kZT4mbHQ7ZXJyb3JtYXBwZXImZ3Q7PC9jb2RlPiBpcyBub3QgY29tcGF0aWJsZQord2l0aCB0aGUgPHZhcj5lcnJvcjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogPGg0PmlucHV0ZmlsdGVyY2hhaW48L2g0PgotPHA+QSA8YSBocmVmPSIuL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPiBjYW4gYmUKLWFwcGxpZWQgdG8gdGhlIHByb2Nlc3MgaW5wdXQuPC9wPgorPHA+QSA8YSBocmVmPSIuL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPiBjYW4gYmUgYXBwbGllZCB0byB0aGUgcHJvY2VzcyBpbnB1dC48L3A+CiA8aDQ+b3V0cHV0ZmlsdGVyY2hhaW48L2g0PgotPHA+QSA8YSBocmVmPSIuL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPiBjYW4gYmUKLWFwcGxpZWQgdG8gdGhlIHByb2Nlc3Mgb3V0cHV0LjwvcD4KKzxwPkEgPGEgaHJlZj0iLi9maWx0ZXJjaGFpbi5odG1sIj5GaWx0ZXJDaGFpbjwvYT4gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHByb2Nlc3Mgb3V0cHV0LjwvcD4KIDxoND5lcnJvcmZpbHRlcmNoYWluPC9oND4KLTxwPkEgPGEgaHJlZj0iLi9maWx0ZXJjaGFpbi5odG1sIj5GaWx0ZXJDaGFpbjwvYT4gY2FuIGJlCi1hcHBsaWVkIHRvIHRoZSBlcnJvciBvdXRwdXQuPC9wPgorPHA+QSA8YSBocmVmPSIuL2ZpbHRlcmNoYWluLmh0bWwiPkZpbHRlckNoYWluPC9hPiBjYW4gYmUgYXBwbGllZCB0byB0aGUgZXJyb3Igb3V0cHV0LjwvcD4KIDxoMz5Vc2FnZTwvaDM+Ci1UYXNrcyBrbm93biB0byBzdXBwb3J0IEkvTyByZWRpcmVjdGlvbjoKKzxwPlRhc2tzIGtub3duIHRvIHN1cHBvcnQgSS9PIHJlZGlyZWN0aW9uOjwvcD4KIDx1bD4KIDxsaT48YSBocmVmPSIuLi9UYXNrcy9leGVjLmh0bWwiPkV4ZWM8L2E+PC9saT4KIDxsaT48YSBocmVmPSIuLi9UYXNrcy9hcHBseS5odG1sIj5BcHBseTwvYT48L2xpPgogPGxpPjxhIGhyZWY9Ii4uL1Rhc2tzL2phdmEuaHRtbCI+SmF2YTwvYT48L2xpPgogPC91bD4KLTxwPlRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiBhIDxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4gaXMgdG8gYSBncmVhdCBkZWdyZWUKLWRlcGVuZGVudCBvbiB0aGUgc3VwcG9ydGluZyB0YXNrLiAgQW55IHBvc3NpYmxlIHBvaW50cyBvZiBjb25mdXNpb24KLXNob3VsZCBiZSBub3RlZCBhdCB0aGUgdGFzayBsZXZlbC48L3A+Ci0KKzxwPlRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiBhIDxjb2RlPiZsdDtyZWRpcmVjdG9yJmd0OzwvY29kZT4gaXMgdG8gYSBncmVhdCBkZWdyZWUgZGVwZW5kZW50IG9uCit0aGUgc3VwcG9ydGluZyB0YXNrLiAgQW55IHBvc3NpYmxlIHBvaW50cyBvZiBjb25mdXNpb24gc2hvdWxkIGJlIG5vdGVkIGF0IHRoZSB0YXNrIGxldmVsLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvcmVnZXhwLmh0bWwgYi9tYW51YWwvVHlwZXMvcmVnZXhwLmh0bWwKaW5kZXggMDYyOGJiOS4uZGVhODZlOCAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL3JlZ2V4cC5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9yZWdleHAuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDk2ICsxNSw3NyBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UmVnZXhwIFR5cGU8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InJlZ2V4cCI+UmVnZXhwPC9hPjwvaDI+Cis8aDIgaWQ9InJlZ2V4cCI+UmVnZXhwPC9oMj4KIDxwPgogUmVnZXhwIHJlcHJlc2VudHMgYSByZWd1bGFyIGV4cHJlc3Npb24uCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cmVndWxhciBleHByZXNzaW9uIHBhdHRlcm48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPnJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT48cHJlPgotICAgICAmbHQ7cmVnZXhwIGlkPSJteXJlZ2V4cCIgcGF0dGVybj0iYWxwaGEoLispYmV0YSIvJmd0Ozxicj4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotRGVmaW5lcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbGF0ZXIgdXNlIHdpdGggaWQgbXlyZWdleHAuCi08L3A+Ci08YmxvY2txdW90ZT48cHJlPgotICAgICAmbHQ7cmVnZXhwIHJlZmlkPSJteXJlZ2V4cCIvJmd0Ozxicj4KLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPgotVXNlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBpZCBteXJlZ2V4cC4KLTwvcD4KLTxoMz48YSBuYW1lPSJpbXBsZW1lbnRhdGlvbiI+Q2hvaWNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbjwvYT48L2gzPgotPHA+Ci1BcGFjaGUgQW50IGNvbWVzIHdpdGgKLXdyYXBwZXJzIGZvcgotPGEgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL3V0aWwvcmVnZXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiIHRhcmdldD0iX3RvcCI+dGhlIGphdmEudXRpbC5yZWdleCBwYWNrYWdlPC9hPiwKLTxhIGhyZWY9Imh0dHA6Ly9hdHRpYy5hcGFjaGUub3JnL3Byb2plY3RzL2pha2FydGEtcmVnZXhwLmh0bWwiIHRhcmdldD0iX3RvcCI+amFrYXJ0YS1yZWdleHA8L2E+Ci1hbmQgPGEgaHJlZj0iaHR0cDovL2F0dGljLmFwYWNoZS5vcmcvcHJvamVjdHMvamFrYXJ0YS1vcm8uaHRtbCIgdGFyZ2V0PSJfdG9wIj5qYWthcnRhLU9STzwvYT4sCi1TZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPmluc3RhbGxhdGlvbiBkZXBlbmRlbmNpZXM8L2E+Ci0gY29uY2VybmluZyB0aGUgc3VwcG9ydGluZyBsaWJyYXJpZXMuPC9wPgotPHA+Ci1UaGUgcHJvcGVydHkgPGNvZGU+YW50LnJlZ2V4cC5yZWdleHBpbXBsPC9jb2RlPiBnb3Zlcm5zIHdoaWNoIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNob3Nlbi4KLVBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmUgOgorPHByZT4mbHQ7cmVnZXhwIGlkPSJteXJlZ2V4cCIgcGF0dGVybj0iYWxwaGEoLispYmV0YSIvJmd0OzwvcHJlPgorPHA+RGVmaW5lcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbGF0ZXIgdXNlIHdpdGggPHZhcj5pZDwvdmFyPiA8cT5teXJlZ2V4cDwvcT4uPC9wPgorPHByZT4mbHQ7cmVnZXhwIHJlZmlkPSJteXJlZ2V4cCIvJmd0OzwvcHJlPgorPHA+VXNlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCA8dmFyPmlkPC92YXI+IDxxPm15cmVnZXhwPC9xPi48L3A+Cis8aDMgaWQ9ImltcGxlbWVudGF0aW9uIj5DaG9pY2Ugb2YgcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uPC9oMz4KKzxwPkFwYWNoZSBBbnQgY29tZXMgd2l0aCB3cmFwcGVycyBmb3IKK3RoZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvcmVnZXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwiCit0YXJnZXQ9Il90b3AiPmphdmEudXRpbC5yZWdleAorcGFja2FnZTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vYXR0aWMuYXBhY2hlLm9yZy9wcm9qZWN0cy9qYWthcnRhLXJlZ2V4cC5odG1sIgordGFyZ2V0PSJfdG9wIj5qYWthcnRhLXJlZ2V4cDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vYXR0aWMuYXBhY2hlLm9yZy9wcm9qZWN0cy9qYWthcnRhLW9yby5odG1sIgordGFyZ2V0PSJfdG9wIj5qYWthcnRhLU9STzwvYT4sIHNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+aW5zdGFsbGF0aW9uCitkZXBlbmRlbmNpZXM8L2E+IGNvbmNlcm5pbmcgdGhlIHN1cHBvcnRpbmcgbGlicmFyaWVzLjwvcD4KKzxwPlRoZSBwcm9wZXJ0eSA8Y29kZT5hbnQucmVnZXhwLnJlZ2V4cGltcGw8L2NvZGU+IGdvdmVybnMgd2hpY2ggcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uCit3aWxsIGJlIGNob3Nlbi4gIFBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBhcmU6PC9wPgogPHVsPgotPGxpPgotb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmRrMTRSZWdleHBSZWdleHAKLTwvbGk+Ci08bGk+Ci1vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhT3JvUmVnZXhwCi08L2xpPgotPGxpPgotb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YVJlZ2V4cFJlZ2V4cAotPC9saT4KKzxsaT48Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmRrMTRSZWdleHBSZWdleHA8L2NvZGU+PC9saT4KKzxsaT48Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuSmFrYXJ0YU9yb1JlZ2V4cDwvY29kZT48L2xpPgorPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5KYWthcnRhUmVnZXhwUmVnZXhwPC9jb2RlPjwvbGk+CiA8L3VsPgotSXQgY2FuIGFsc28gYmUgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJmYWNlIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cDwvY29kZT4uCi1JZiA8Y29kZT5hbnQucmVnZXhwLnJlZ2V4cGltcGw8L2NvZGU+IGlzIG5vdCBkZWZpbmVkLCBBbnQgdXNlcyBKZGsxNFJlZ2V4cCBhcyB0aGlzIGlzIGFsd2F5cyBhdmFpbGFibGUuPC9wPgorPHA+SXQgY2FuIGFsc28gYmUgYW5vdGhlciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK2ludGVyZmFjZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwPC9jb2RlPi4KK0lmIDxjb2RlPmFudC5yZWdleHAucmVnZXhwaW1wbDwvY29kZT4gaXMgbm90IGRlZmluZWQsIEFudCB1c2VzIEpkazE0UmVnZXhwIGFzIHRoaXMgaXMgYWx3YXlzCithdmFpbGFibGUuPC9wPgogPHA+Ci1UaGVyZSBhcmUgY3Jvc3MtcGxhdGZvcm0gaXNzdWVzIGZvciBtYXRjaGVzIHJlbGF0ZWQgdG8gbGluZSB0ZXJtaW5hdG9yLgotRm9yIGV4YW1wbGUgaWYgeW91IHVzZSAkIHRvIGFuY2hvciB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiB0aGUgZW5kIG9mIGEgbGluZQotdGhlIHJlc3VsdHMgbWlnaHQgYmUgdmVyeSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIGJvdGggeW91ciBwbGF0Zm9ybSBhbmQgdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gbGlicmFyeSB5b3UgdXNlLiBJdCBpcyAnaGlnaGx5IHJlY29tbWVuZGVkJyB0aGF0IHlvdSB0ZXN0IHlvdXIgcGF0dGVybiBvbgotYm90aCBVbml4IGFuZCBXaW5kb3dzIHBsYXRmb3JtcyBiZWZvcmUgeW91IHJlbHkgb24gaXQuCitUaGVyZSBhcmUgY3Jvc3MtcGxhdGZvcm0gaXNzdWVzIGZvciBtYXRjaGVzIHJlbGF0ZWQgdG8gbGluZSB0ZXJtaW5hdG9yLiAgRm9yIGV4YW1wbGUgaWYgeW91Cit1c2UgPHE+JDwvcT4gdG8gYW5jaG9yIHlvdXIgcmVndWxhciBleHByZXNzaW9uIG9uIHRoZSBlbmQgb2YgYSBsaW5lIHRoZSByZXN1bHRzIG1pZ2h0IGJlIHZlcnkKK2RpZmZlcmVudCBkZXBlbmRpbmcgb24gYm90aCB5b3VyIHBsYXRmb3JtIGFuZCB0aGUgcmVndWxhciBleHByZXNzaW9uIGxpYnJhcnkgeW91IHVzZS4gSXQKK2lzIDxlbT5oaWdobHkgcmVjb21tZW5kZWQ8L2VtPiB0aGF0IHlvdSB0ZXN0IHlvdXIgcGF0dGVybiBvbiBib3RoIFVuaXggYW5kIFdpbmRvd3MgcGxhdGZvcm1zIGJlZm9yZQoreW91IHJlbHkgb24gaXQuPC9wPgogPHVsPgotICAgIDxsaT5KYWthcnRhIE9ybyBkZWZpbmVzIGEgbGluZSB0ZXJtaW5hdG9yIGFzICdcbicgYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQZXJsLjwvbGk+Ci0gICAgPGxpPkpha2FydGEgUmVnRXhwIHVzZXMgYSBzeXN0ZW0tZGVwZW5kZW50IGxpbmUgdGVybWluYXRvci48L2xpPgotICAgIDxsaT5KREsgMS40IHVzZXMgJ1xuJywgJ1xyXG4nLCAnXHUwMDg1JywgJ1x1MjAyOCcsICdcdTIwMjknIGFzIGEgZGVmYXVsdAotICAgIGJ1dCBpcyBjb25maWd1cmVkIGluIHRoZSB3cmFwcGVyIHRvIHVzZSBvbmx5ICdcbicgKFVOSVhfTElORSk8L2xpPgorICA8bGk+SmFrYXJ0YSBPcm8gZGVmaW5lcyBhIGxpbmUgdGVybWluYXRvciBhcyA8cT5cbjwvcT4gYW5kIGlzIGNvbnNpc3RlbnQgd2l0aCBQZXJsLjwvbGk+CisgIDxsaT5KYWthcnRhIFJlZ0V4cCB1c2VzIGEgc3lzdGVtLWRlcGVuZGVudCBsaW5lIHRlcm1pbmF0b3IuPC9saT4KKyAgPGxpPkpESyAxLjQgdXNlcyA8cT5cbjwvcT4sIDxxPlxyXG48L3E+LCA8cT5cdTAwODU8L3E+LCA8cT5cdTIwMjg8L3E+LCA8cT5cdTIwMjk8L3E+IGFzIGEKKyAgICBkZWZhdWx0IGJ1dCBpcyBjb25maWd1cmVkIGluIHRoZSB3cmFwcGVyIHRvIHVzZSBvbmx5IDxxPlxuPC9xPiAoVU5JWF9MSU5FKTwvbGk+CiA8L3VsPgotPGVtPldlIHVzZWQgdG8gcmVjb21tZW5kIHRoYXQgeW91IHVzZSBKYWthcnRhIE9STyBidXQgc2luY2UgaXRzCi0gIGRldmVsb3BtZW50IGhhcyBiZWVuIHJldGlyZWQgSmF2YSdzIGJ1aWx0LWluIHJlZ2V4IHBhY2thZ2UgaXMgbGlrZWx5Ci0gIHRoZSBiZXN0IGNob2ljZSBnb2luZyBmb3J3YXJkLjwvZW0+Ci08L3A+Ci08aDM+VXNhZ2U8L2gzPgotVGhlIGZvbGxvd2luZyB0YXNrcyBhbmQgdHlwZXMgdXNlIHRoZSBSZWdleHAgdHlwZSA6Cis8cD48ZW0+V2UgdXNlZCB0byByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIEpha2FydGEgT1JPIGJ1dCBzaW5jZSBpdHMgZGV2ZWxvcG1lbnQgaGFzIGJlZW4gcmV0aXJlZAorSmF2YSdzIGJ1aWx0LWluIHJlZ2V4IHBhY2thZ2UgaXMgbGlrZWx5IHRoZSBiZXN0IGNob2ljZSBnb2luZyBmb3J3YXJkLjwvZW0+PC9wPgorPGgzPlVzYWdlPC9oMz4gVGhlIGZvbGxvd2luZyB0YXNrcyBhbmQgdHlwZXMgdXNlIHRoZSBSZWdleHAgdHlwZToKIDx1bD4KIDxsaT48YSBocmVmPSIuLi9UYXNrcy9yZXBsYWNlcmVnZXhwLmh0bWwiPlJlcGxhY2VSZWdFeHAgdGFzazwvYT48L2xpPgogPGxpPjxhIGhyZWY9ImZpbHRlcmNoYWluLmh0bWwjbGluZWNvbnRhaW5zcmVnZXhwIj5MaW5lQ29udGFpbnNSZWdleHAgZmlsdGVyPC9hPjwvbGk+CiA8L3VsPgotPHA+Ci1UaGVzZSBzdHJpbmcgZmlsdGVycyBhbHNvIHVzZSB0aGUgbWVjaGFuaXNtIG9mIHJlZ2V4cCB0byBjaG9vc2UgYSByZWd1bGFyIGV4cHJlc3Npb24gaW1wbGVtZW50YXRpb24gOgotPC9wPgorPHA+VGhlc2Ugc3RyaW5nIGZpbHRlcnMgYWxzbyB1c2UgdGhlIG1lY2hhbmlzbSBvZiByZWdleHAgdG8gY2hvb3NlIGEgcmVndWxhciBleHByZXNzaW9uCitpbXBsZW1lbnRhdGlvbjo8L3A+CiA8dWw+CiA8bGk+PGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCNjb250YWluc3JlZ2V4Ij5Db250YWluc1JlZ2V4IHN0cmluZyBmaWx0ZXI8L2E+PC9saT4KIDxsaT48YSBocmVmPSJmaWx0ZXJjaGFpbi5odG1sI3JlcGxhY2VyZWdleCI+UmVwbGFjZVJlZ2V4IHN0cmluZyBmaWx0ZXI8L2E+PC9saT4KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy9yZXNvdXJjZXMuaHRtbCBiL21hbnVhbC9UeXBlcy9yZXNvdXJjZXMuaHRtbAppbmRleCA1YmRjMjMxLi5hNmI1NmY3IDEwMDY0NAotLS0gYS9tYW51YWwvVHlwZXMvcmVzb3VyY2VzLmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL3Jlc291cmNlcy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzUxICsxNSwzNTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlJlc291cmNlcyBhbmQgUmVzb3VyY2UgQ29sbGVjdGlvbnM8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgyPjxhIG5hbWU9InJlc291cmNlIj5SZXNvdXJjZXM8L2E+PC9oMj4KKzxoMiBpZD0icmVzb3VyY2UiPlJlc291cmNlczwvaDI+CiA8cD4KLUEgZmlsZS1saWtlIGVudGl0eSBjYW4gYmUgYWJzdHJhY3RlZCB0byB0aGUgY29uY2VwdCBvZiBhIDxpPnJlc291cmNlPC9pPi4KLUluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBhY2Nlc3MgdG8gZmlsZS1saWtlIGF0dHJpYnV0ZXMsIGEgcmVzb3VyY2UKLWltcGxlbWVudGF0aW9uIHNob3VsZCwgd2hlbiBwb3NzaWJsZSwgcHJvdmlkZSB0aGUgbWVhbnMgdG8gcmVhZCBjb250ZW50Ci1mcm9tIGFuZC9vciB3cml0ZSBjb250ZW50IHRvIHRoZSB1bmRlcmx5aW5nIGVudGl0eS4gQWx0aG91Z2ggdGhlIHJlc291cmNlCi1jb25jZXB0IHdhcyBpbnRyb2R1Y2VkIGluIDxpPkFwYWNoZSBBbnQgMS41LjI8L2k+LCByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSBmb3IKLWV4cGxpY2l0IHVzZSBiZWdpbm5pbmcgaW4gPGI+QW50IDEuNzwvYj4uCitBIGZpbGUtbGlrZSBlbnRpdHkgY2FuIGJlIGFic3RyYWN0ZWQgdG8gdGhlIGNvbmNlcHQgb2YgYSA8ZW0+cmVzb3VyY2U8L2VtPi4gIEluIGFkZGl0aW9uIHRvCitwcm92aWRpbmcgYWNjZXNzIHRvIGZpbGUtbGlrZSBhdHRyaWJ1dGVzLCBhIHJlc291cmNlIGltcGxlbWVudGF0aW9uIHNob3VsZCwgd2hlbiBwb3NzaWJsZSwKK3Byb3ZpZGUgdGhlIG1lYW5zIHRvIHJlYWQgY29udGVudCBmcm9tIGFuZC9vciB3cml0ZSBjb250ZW50IHRvIHRoZSB1bmRlcmx5aW5nIGVudGl0eS4gQWx0aG91Z2gKK3RoZSByZXNvdXJjZSBjb25jZXB0IHdhcyBpbnRyb2R1Y2VkIGluIEFwYWNoZSBBbnQgMS41LjIsIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlIGZvciBleHBsaWNpdAordXNlIDxlbT5zaW5jZSBBbnQgMS43PC9lbT4uCiA8L3A+CiAKLTxoMz5UaGUgYnVpbHQtaW4gcmVzb3VyY2UgdHlwZXMgYXJlOjwvaDM+Ci0KKzxoMz5CdWlsdC1pbiByZXNvdXJjZSB0eXBlczwvaDM+CitUaGUgYnVpbHQtaW4gcmVzb3VyY2UgdHlwZXMgYXJlOgogPHVsPgotICA8bGk+PGEgaHJlZj0iI2Jhc2ljIj5yZXNvdXJjZTwvYT4gLSBhIGJhc2ljIHJlc291cmNlLjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjYnppcDJyZXNvdXJjZSI+YnppcDJyZXNvdXJjZTwvYT4gLSBhIEJaaXAyIGNvbXByZXNzZWQgcmVzb3VyY2UuPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNmaWxlIj5maWxlPC9hPiAtIGEgZmlsZS48L2xpPgotICA8bGk+PGEgaHJlZj0iI2d6aXByZXNvdXJjZSI+Z3ppcHJlc291cmNlPC9hPiAtIGEgR1ppcCBjb21wcmVzc2VkIHJlc291cmNlLjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjamF2YXJlc291cmNlIj5qYXZhcmVzb3VyY2U8L2E+IC0gYSByZXNvdXJjZSBsb2FkYWJsZQotICAgICAgICB2aWEgYSBKYXZhIGNsYXNzbG9hZGVyLjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjamF2YWNvbnN0YW50Ij5qYXZhY29uc3RhbnQ8L2E+IC0gYSBjb25zdGFudCBpbiBhIGNsYXNzIGxvYWRhYmxlCi0gICAgICAgIHZpYSBhIEphdmEgY2xhc3Nsb2FkZXIuPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNwcm9wZXJ0eXJlc291cmNlIj5wcm9wZXJ0eXJlc291cmNlPC9hPiAtIGFuIEFudCBwcm9wZXJ0eS48L2xpPgotICA8bGk+PGEgaHJlZj0iI3N0cmluZyI+c3RyaW5nPC9hPiAtIGEgdGV4dCBzdHJpbmcuPC9saT4KLSAgPGxpPjxhIGhyZWY9IiN0YXJlbnRyeSI+dGFyZW50cnk8L2E+IC0gYW4gZW50cnkgaW4gYSB0YXIgZmlsZS48L2xpPgotICA8bGk+PGEgaHJlZj0iI3VybCI+dXJsPC9hPiAtIGEgVVJMLjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjemlwZW50cnkiPnppcGVudHJ5PC9hPiAtIGFuIGVudHJ5IGluIGEgemlwIGZpbGUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNiYXNpYyI+cmVzb3VyY2U8L2E+Jm1kYXNoO2EgYmFzaWMgcmVzb3VyY2UuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNiemlwMnJlc291cmNlIj5iemlwMnJlc291cmNlPC9hPiZtZGFzaDthIEJaaXAyIGNvbXByZXNzZWQgcmVzb3VyY2UuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNmaWxlIj5maWxlPC9hPiZtZGFzaDthIGZpbGUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNnemlwcmVzb3VyY2UiPmd6aXByZXNvdXJjZTwvYT4mbWRhc2g7YSBHWmlwIGNvbXByZXNzZWQgcmVzb3VyY2UuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNqYXZhcmVzb3VyY2UiPmphdmFyZXNvdXJjZTwvYT4mbWRhc2g7YSByZXNvdXJjZSBsb2FkYWJsZSB2aWEgYSBKYXZhCisgICAgICAgIGNsYXNzbG9hZGVyLjwvbGk+CisgIDxsaT48YSBocmVmPSIjamF2YWNvbnN0YW50Ij5qYXZhY29uc3RhbnQ8L2E+Jm1kYXNoO2EgY29uc3RhbnQgaW4gYSBjbGFzcyBsb2FkYWJsZSB2aWEgYSBKYXZhCisgICAgICAgIGNsYXNzbG9hZGVyLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcHJvcGVydHlyZXNvdXJjZSI+cHJvcGVydHlyZXNvdXJjZTwvYT4mbWRhc2g7YW4gQW50IHByb3BlcnR5LjwvbGk+CisgIDxsaT48YSBocmVmPSIjc3RyaW5nIj5zdHJpbmc8L2E+Jm1kYXNoO2EgdGV4dCBzdHJpbmcuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN0YXJlbnRyeSI+dGFyZW50cnk8L2E+Jm1kYXNoO2FuIGVudHJ5IGluIGEgdGFyIGZpbGUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN1cmwiPnVybDwvYT4mbWRhc2g7YSBVUkwuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN4enJlc291cmNlIj54enJlc291cmNlPC9hPiZtZGFzaDthbiBYWiBjb21wcmVzc2VkIHJlc291cmNlLjwvbGk+CisgIDxsaT48YSBocmVmPSIjemlwZW50cnkiPnppcGVudHJ5PC9hPiZtZGFzaDthbiBlbnRyeSBpbiBhIHppcCBmaWxlLjwvbGk+CiA8L3VsPgogCi08aDQ+PGEgbmFtZT0iYmFzaWMiPnJlc291cmNlPC9hPjwvaDQ+Cis8aDQgaWQ9ImJhc2ljIj5yZXNvdXJjZTwvaDQ+CiAKLTxwPkEgYmFzaWMgcmVzb3VyY2UuIE90aGVyIHJlc291cmNlIHR5cGVzIGRlcml2ZSBmcm9tIHRoaXMgYmFzaWMKLXR5cGU7IGFzIHN1Y2ggYWxsIGl0cyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUsIHRob3VnaCBpbiBtb3N0IGNhc2VzCi1pcnJlbGV2YW50IGF0dHJpYnV0ZXMgd2lsbCBiZSBpZ25vcmVkLiBUaGlzIGFuZCBhbGwgcmVzb3VyY2UKLWltcGxlbWVudGF0aW9ucyBhcmUgYWxzbyB1c2FibGUgYXMgc2luZ2xlLWVsZW1lbnQKLTxhIGhyZWY9IiNjb2xsZWN0aW9uIj5SZXNvdXJjZSBDb2xsZWN0aW9uczwvYT4uCis8cD4KK0EgYmFzaWMgcmVzb3VyY2UuIE90aGVyIHJlc291cmNlIHR5cGVzIGRlcml2ZSBmcm9tIHRoaXMgYmFzaWMgdHlwZTsgYXMgc3VjaCBhbGwgaXRzIGF0dHJpYnV0ZXMKK2FyZSBhdmFpbGFibGUsIHRob3VnaCBpbiBtb3N0IGNhc2VzIGlycmVsZXZhbnQgYXR0cmlidXRlcyB3aWxsIGJlIGlnbm9yZWQuIFRoaXMgYW5kIGFsbCByZXNvdXJjZQoraW1wbGVtZW50YXRpb25zIGFyZSBhbHNvIHVzYWJsZSBhcyBzaW5nbGUtZWxlbWVudCA8YSBocmVmPSIjY29sbGVjdGlvbiI+cmVzb3VyY2UKK2NvbGxlY3Rpb25zPC9hPi4KIDwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZXhpc3RzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdGhpcyByZXNvdXJjZSBleGlzdHM8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZD5leGlzdHM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRoaXMgcmVzb3VyY2UgZXhpc3RzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sYXN0bW9kaWZpZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhpcyByZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmxhc3Rtb2RpZmllZDwvdGQ+CisgICAgPHRkPlRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcmVjdG9yeTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRoaXMgcmVzb3VyY2UgaXMgZGlyZWN0b3J5LWxpa2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8sIGRlZmF1bHQgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgICA8dGQ+ZGlyZWN0b3J5PC90ZD4KKyAgICA8dGQ+V2hldGhlciB0aGlzIHJlc291cmNlIGlzIGRpcmVjdG9yeS1saWtlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+c2l6ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgc2l6ZSBvZiB0aGlzIHJlc291cmNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+c2l6ZTwvdGQ+CisgICAgPHRkPlRoZSBzaXplIG9mIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+PGEgbmFtZT0iZmlsZSI+ZmlsZTwvYT48L2g0PgorPGg0IGlkPSJmaWxlIj5maWxlPC9oND4KIAogPHA+UmVwcmVzZW50cyBhIGZpbGUgYWNjZXNzaWJsZSB2aWEgbG9jYWwgZmlsZXN5c3RlbSBjb252ZW50aW9ucy48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIHJlc291cmNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPmZpbGU8L3RkPgorICAgIDx0ZD5UaGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIHJlc291cmNlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhpcyByZXNvdXJjZS4gIFdoZW4gdGhpcwotICAgICAgYXR0cmlidXRlIGlzIHNldCwgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZQotICAgICAgd2lsbCB5aWVsZCBhIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBsb2NhdGlvbi48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+VGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoaXMgcmVzb3VyY2UuICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgYXR0ZW1wdHMgdG8gYWNjZXNzIHRoZQorICAgICAgbmFtZSBvZiB0aGUgcmVzb3VyY2Ugd2lsbCB5aWVsZCBhIHBhdGggcmVsYXRpdmUgdG8gdGhpcyBsb2NhdGlvbi48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aDQ+PGEgbmFtZT0iamF2YXJlc291cmNlIj5qYXZhcmVzb3VyY2U8L2E+PC9oND4KKzxoNCBpZD0iamF2YXJlc291cmNlIj5qYXZhcmVzb3VyY2U8L2g0PgogCiA8cD5SZXByZXNlbnRzIGEgcmVzb3VyY2UgbG9hZGFibGUgdmlhIGEgSmF2YSBjbGFzc2xvYWRlci48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLjwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLAotICAgICAgZ2l2ZW4gYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+Ci0gICAgICB0byBhIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4gZGVmaW5lZCBlbHNld2hlcmUuLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgPHRkPnRoZSBjbGFzc3BhdGggdG8gdXNlIHdoZW4gbG9va2luZyB1cCBhIHJlc291cmNlLCBnaXZlbgorICAgICAgYXMgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNyZWZlcmVuY2VzIj5yZWZlcmVuY2U8L2E+IHRvIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBkZWZpbmVkCisgICAgICBlbHNld2hlcmUuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5sb2FkZXJSZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgdGhlIGxvYWRlciB0aGF0IGlzCi0gICAgICB1c2VkIHRvIGxvYWQgdGhlIHJlc291cmNlLCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3NwYXRoLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPmxvYWRlclJlZjwvdGQ+CisgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBsb2FkZXIgdGhhdCBpcyB1c2VkIHRvIGxvYWQgdGhlIHJlc291cmNlLCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgICAgIGNsYXNzcGF0aC48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhcmVudEZpcnN0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY29uc3VsdCB0aGUgcGFyZW50IGNsYXNzbG9hZGVyIGZpcnN0IC0KLSAgICAgIHRoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgbW9zdCBsaWtlbHkgaXMgdGhlIHN5c3RlbSBjbGFzc2xvYWRlciAtCi0gICAgICB3aGVuIHVzaW5nIGEgbmVzdGVkIGNsYXNzcGF0aC4gIERlZmF1bHRzCi0gICAgICB0byA8Y29kZT50cnVlPC9jb2RlPi48YnIvPgorICAgIDx0ZD5wYXJlbnRGaXJzdDwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY29uc3VsdCB0aGUgcGFyZW50IGNsYXNzbG9hZGVyIGZpcnN0Jm1kYXNoO3RoZSBwYXJlbnQgY2xhc3Nsb2FkZXIgbW9zdCBsaWtlbHkKKyAgICAgIGlzIHRoZSBzeXN0ZW0gY2xhc3Nsb2FkZXImbWRhc2g7d2hlbiB1c2luZyBhIG5lc3RlZCBjbGFzc3BhdGguPGJyLz4KICAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCiA8cD5UaGUgY2xhc3NwYXRoIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBuZXN0ZWQgY2xhc3NwYXRoIGVsZW1lbnQsCi13aGVyZSA8Yj4mbHQ7Y2xhc3NwYXRoJmd0OzwvYj4gaXMgYSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlPC9hPi48L3A+Cit3aGVyZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGgtbGlrZQorc3RydWN0dXJlPC9hPi48L3A+CiAKKzxoNCBpZD0iamF2YWNvbnN0YW50Ij5qYXZhY29uc3RhbnQ8L2g0PgorPHA+TG9hZHMgdGhlIHZhbHVlIG9mIGEgSmF2YSBjb25zdGFudC4gQXMgYSBzcGVjaWFsaXNhdGlvbgorb2YgPGEgaHJlZj0iI2phdmFyZXNvdXJjZSI+amF2YXJlc291cmNlPC9hPiBhbGwgb2YgaXRzIGF0dHJpYnV0ZXMgYW5kIG5lc3RlZCBlbGVtZW50cyBhcmUKK3N1cHBvcnRlZC4gQSBjb25zdGFudCBtdXN0IGJlIHNwZWNpZmllZCBhcyA8Y29kZT5wdWJsaWMgc3RhdGljPC9jb2RlPiBvdGhlcndpc2UgaXQgY291bGQgbm90IGJlCitsb2FkZWQuPC9wPgogCi08aDQ+PGEgbmFtZT0iamF2YWNvbnN0YW50Ij5qYXZhY29uc3RhbnQ8L2E+PC9oND4KLTxwPkxvYWRzIHRoZSB2YWx1ZSBvZiBhIGphdmEgY29uc3RhbnQuIEFzIGEgc3BlY2lhbGlzYXRpb24gb2YgCi08YSBocmVmPSIjamF2YXJlc291cmNlIj5qYXZhcmVzb3VyY2U8L2E+IGFsbCBvZiBpdHMgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzIGFyZQotc3VwcG9ydGVkLiBBIGNvbnN0YW50IG11c3QgYmUgc3BlY2lmaWVkIGFzIDx0dD5wdWJsaWMgc3RhdGljPC90dD4gb3RoZXJ3aXNlIGl0IGNvdWxkIG5vdCBiZSBsb2FkZWQuPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLiBNdXN0IGJlIHNwZWNpZmllZCBhcyBmdWxsIHF1YWxpZmllZAotICAgICAgZmllbGQgbmFtZS4KLSAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+bmFtZTwvdGQ+CisgICAgPHRkPlRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4gTXVzdCBiZSBzcGVjaWZpZWQgYXMgZnVsbCBxdWFsaWZpZWQKKyAgICAgIGZpZWxkIG5hbWUuPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiA8aDU+RXhhbXBsZXM8L2g1PgotVGhpcyBsb2FkcyB0aGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IDx0dD5WRVJTSU9OPC90dD4gb2YgdGhlIDx0dD5vcmcuYWNtZS5NYWluPC90dD4gY2xhc3MKLWludG8gdGhlIDx0dD52ZXJzaW9uPC90dD4tcHJvcGVydHkuIFRoZSBjbGFzc3BhdGggZm9yIGZpbmRpbmcgdGhhdCBjbGFzcyBpcyBwcm92aWRlZCB2aWEKLW5lc3RlZCBjbGFzc3BhdGggZWxlbWVudC4KLTxwcmU+PGNvZGU+Jmx0O2xvYWRyZXNvdXJjZSBwcm9wZXJ0eT0mcXVvdDt2ZXJzaW9uJnF1b3Q7Jmd0OwotICAgJmx0O2phdmFjb25zdGFudCBuYW1lPSZxdW90O29yZy5hY21lLk1haW4uVkVSU0lPTiZxdW90OyZndDsKLSAgICAgJmx0O2NsYXNzcGF0aCZndDsKLSAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHthY21lLmxpYi5kaXJ9JnF1b3Q7LyZndDsKLSAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICAmbHQ7L2phdmFjb25zdGFudCZndDsKLSAmbHQ7L2xvYWRyZXNvdXJjZSZndDsKLTwvY29kZT48L3ByZT4KKzxwPlRoaXMgbG9hZHMgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCA8Y29kZT5WRVJTSU9OPC9jb2RlPiBvZiB0aGUgPGNvZGU+b3JnLmFjbWUuTWFpbjwvY29kZT4KK2NsYXNzIGludG8gdGhlIDx2YXI+dmVyc2lvbjwvdmFyPi1wcm9wZXJ0eS4gVGhlIGNsYXNzcGF0aCBmb3IgZmluZGluZyB0aGF0IGNsYXNzIGlzIHByb3ZpZGVkIHZpYQorbmVzdGVkIDxjb2RlPmNsYXNzcGF0aDwvY29kZT4gZWxlbWVudC48L3A+Cis8cHJlPgorJmx0O2xvYWRyZXNvdXJjZSBwcm9wZXJ0eT0mcXVvdDt2ZXJzaW9uJnF1b3Q7Jmd0OworICAmbHQ7amF2YWNvbnN0YW50IG5hbWU9JnF1b3Q7b3JnLmFjbWUuTWFpbi5WRVJTSU9OJnF1b3Q7Jmd0OworICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7JHthY21lLmxpYi5kaXJ9JnF1b3Q7LyZndDsKKyAgICAmbHQ7L2NsYXNzcGF0aCZndDsKKyAgJmx0Oy9qYXZhY29uc3RhbnQmZ3Q7CismbHQ7L2xvYWRyZXNvdXJjZSZndDs8L3ByZT4KIAotQ3JlYXRlIGEgbmV3IGZpbGUgPHR0PmM6L3RlbXAvb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbi5ERUZBVUxUX0JVSUxEX0ZJTEVOQU1FPC90dD4gd2l0aCB0aGUgY29udGVudAotb2YgdGhhdCBjb25zdGFudCAoPHR0PmJ1aWxkLnhtbDwvdHQ+KS4KLTxwcmU+PGNvZGU+Jmx0O2NvcHkgdG9kaXI9JnF1b3Q7YzovdGVtcCZxdW90OyZndDsKKzxwPkNyZWF0ZSBhIG5ldyBmaWxlIDxzYW1wPmM6L3RlbXAvb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbi5ERUZBVUxUX0JVSUxEX0ZJTEVOQU1FPC9zYW1wPiB3aXRoCit0aGUgY29udGVudCBvZiB0aGF0IGNvbnN0YW50ICg8cT5idWlsZC54bWw8L3E+KS48L3A+Cis8cHJlPgorJmx0O2NvcHkgdG9kaXI9JnF1b3Q7YzovdGVtcCZxdW90OyZndDsKICAgJmx0O2phdmFjb25zdGFudCBuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50Lk1haW4uREVGQVVMVF9CVUlMRF9GSUxFTkFNRSZxdW90Oy8mZ3Q7Ci0mbHQ7L2NvcHkmZ3Q7PC9jb2RlPjwvcHJlPgorJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCis8aDQgaWQ9InppcGVudHJ5Ij56aXBlbnRyeTwvaDQ+CiAKLTxoND48YSBuYW1lPSJ6aXBlbnRyeSI+emlwZW50cnk8L2E+PC9oND4KKzxwPlJlcHJlc2VudHMgYW4gZW50cnkgaW4gYSBaSVAgYXJjaGl2ZS4gVGhlIGFyY2hpdmUgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgYXJjaGl2ZQorYXR0cmlidXRlIG9yIGEgbmVzdGVkIHNpbmdsZS1lbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24uICA8Y29kZT56aXBlbnRyeTwvY29kZT4gb25seSBzdXBwb3J0cworZmlsZSBzeXN0ZW0gcmVzb3VyY2VzIGFzIG5lc3RlZCBlbGVtZW50cy48L3A+CiAKLTxwPlJlcHJlc2VudHMgYW4gZW50cnkgaW4gYSBaSVAgYXJjaGl2ZS4gVGhlIGFyY2hpdmUgY2FuIGJlIHNwZWNpZmllZAotdXNpbmcgdGhlIGFyY2hpdmUgYXR0cmlidXRlIG9yIGEgbmVzdGVkIHNpbmdsZS1lbGVtZW50IHJlc291cmNlCi1jb2xsZWN0aW9uLiAgPGNvZGU+emlwZW50cnk8L2NvZGU+IG9ubHkgc3VwcG9ydHMgZmlsZSBzeXN0ZW0gcmVzb3VyY2VzCi1hcyBuZXN0ZWQgZWxlbWVudHMuPC9wPgotCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnppcGZpbGUgb3IgaXRzIGFsaWFzIG5hbWUgYXJjaGl2ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgemlwIGZpbGUgY29udGFpbmluZyB0aGlzIHJlc291cmNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllcywgdW5sZXNzIGEgbmVzdGVkIHJlc291cmNlCi0gICAgY29sbGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQuPC90ZD4KKyAgICA8dGQ+emlwZmlsZTwvdGQ+CisgICAgPHRkPlRoZSB6aXAgZmlsZSBjb250YWluaW5nIHRoaXMgcmVzb3VyY2U8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5ZZXMsIHVubGVzcyBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGhhcyBiZWVuCisgICAgc3BlY2lmaWVkPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZWQgcmVzb3VyY2U8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+WWVzPC90ZD4KKyAgICA8dGQ+YXJjaGl2ZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5hbGlhcyBvZiA8dmFyPnppcGZpbGU8L3Zhcj48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2Rpbmcgb2YgdGhlIHppcGZpbGU8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm87Ci0gICAgICBwbGF0Zm9ybSBkZWZhdWx0IHVzZWQgaWYgdW5zcGVjaWZpZWQ8L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGFyY2hpdmVkIHJlc291cmNlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyBvZiB0aGUgemlwZmlsZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0cyB0byBkZWZhdWx0IEpWTSBjaGFyYWN0ZXIgZW5jb2Rpbmc8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9InRhcmVudHJ5Ij50YXJlbnRyeTwvYT48L2g0PgorPGg0IGlkPSJ0YXJlbnRyeSI+dGFyZW50cnk8L2g0PgogCi08cD5SZXByZXNlbnRzIGFuIGVudHJ5IGluIGEgVEFSIGFyY2hpdmUuICBUaGUgYXJjaGl2ZSBjYW4gYmUgc3BlY2lmaWVkCi11c2luZyB0aGUgYXJjaGl2ZSBhdHRyaWJ1dGUgb3IgYSBuZXN0ZWQgc2luZ2xlLWVsZW1lbnQgcmVzb3VyY2UKLWNvbGxlY3Rpb24uPC9wPgorPHA+UmVwcmVzZW50cyBhbiBlbnRyeSBpbiBhIFRBUiBhcmNoaXZlLiAgVGhlIGFyY2hpdmUgY2FuIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgYXJjaGl2ZQorYXR0cmlidXRlIG9yIGEgbmVzdGVkIHNpbmdsZS1lbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24uPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmFyY2hpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHRhciBhcmNoaXZlIGNvbnRhaW5pbmcgdGhpcyByZXNvdXJjZTwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXMsIHVubGVzcyBhIG5lc3RlZCByZXNvdXJjZQotICAgIGNvbGxlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkLjwvdGQ+CisgICAgPHRkPmFyY2hpdmU8L3RkPgorICAgIDx0ZD5UaGUgdGFyIGFyY2hpdmUgY29udGFpbmluZyB0aGlzIHJlc291cmNlPC90ZD4KKyAgICA8dGQ+WWVzLCB1bmxlc3MgYSBuZXN0ZWQgcmVzb3VyY2UKKyAgICBjb2xsZWN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgdGhlIGFyY2hpdmVkIHJlc291cmNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgYXJjaGl2ZWQgcmVzb3VyY2U8L3RkPgorICAgIDx0ZD5ZZXM8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9Imd6aXByZXNvdXJjZSI+Z3ppcHJlc291cmNlPC9hPjwvaDQ+Cis8aDQgaWQ9Imd6aXByZXNvdXJjZSI+Z3ppcHJlc291cmNlPC9oND4KIAotPHA+VGhpcyBpcyBub3QgYSBzdGFuZC1hbG9uZSByZXNvdXJjZSwgYnV0IGEgd3JhcHBlciBhcm91bmQgYW5vdGhlcgotcmVzb3VyY2UgcHJvdmlkaW5nIGNvbXByZXNzaW9uIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzIG9uIHRoZSBmbHkuCi1BIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQKLWVsZW1lbnQuPC9wPgorPHA+VGhpcyBpcyBub3QgYSBzdGFuZC1hbG9uZSByZXNvdXJjZSwgYnV0IGEgd3JhcHBlciBhcm91bmQgYW5vdGhlciByZXNvdXJjZSBwcm92aWRpbmcKK2NvbXByZXNzaW9uIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzIG9uIHRoZSBmbHkuICBBIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZQorc3BlY2lmaWVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCi08aDQ+PGEgbmFtZT0iYnppcDJyZXNvdXJjZSI+YnppcDJyZXNvdXJjZTwvYT48L2g0PgorPGg0IGlkPSJiemlwMnJlc291cmNlIj5iemlwMnJlc291cmNlPC9oND4KIAotPHA+VGhpcyBpcyBub3QgYSBzdGFuZC1hbG9uZSByZXNvdXJjZSwgYnV0IGEgd3JhcHBlciBhcm91bmQgYW5vdGhlcgotcmVzb3VyY2UgcHJvdmlkaW5nIGNvbXByZXNzaW9uIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzIG9uIHRoZSBmbHkuCi1BIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQgYXMgYSBuZXN0ZWQKLWVsZW1lbnQuPC9wPgorPHA+VGhpcyBpcyBub3QgYSBzdGFuZC1hbG9uZSByZXNvdXJjZSwgYnV0IGEgd3JhcHBlciBhcm91bmQgYW5vdGhlciByZXNvdXJjZSBwcm92aWRpbmcKK2NvbXByZXNzaW9uIG9mIHRoZSByZXNvdXJjZSdzIGNvbnRlbnRzIG9uIHRoZSBmbHkuICBBIHNpbmdsZSBlbGVtZW50IHJlc291cmNlIGNvbGxlY3Rpb24gbXVzdCBiZQorc3BlY2lmaWVkIGFzIGEgbmVzdGVkIGVsZW1lbnQuPC9wPgogCi08aDQ+PGEgbmFtZT0idXJsIj51cmw8L2E+PC9oND4KKzxoNCBpZD0ieHpyZXNvdXJjZSI+eHpyZXNvdXJjZTwvaDQ+CisKKzxwPlRoaXMgaXMgbm90IGEgc3RhbmQtYWxvbmUgcmVzb3VyY2UsIGJ1dCBhIHdyYXBwZXIgYXJvdW5kIGFub3RoZXIgcmVzb3VyY2UgcHJvdmlkaW5nCitjb21wcmVzc2lvbiBvZiB0aGUgcmVzb3VyY2UncyBjb250ZW50cyBvbiB0aGUgZmx5LiAgQSBzaW5nbGUgZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9uIG11c3QgYmUKK3NwZWNpZmllZCBhcyBhIG5lc3RlZCBlbGVtZW50LjwvcD4KKworPHA+WFogY29tcHJlc3Npb24gc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCA8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjEwLjE8L2VtPiBhbmQgZGVwZW5kcyBvbgorZXh0ZXJuYWwgbGlicmFyaWVzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQW50CitkaXN0cmlidXRpb24uIFNlZSA8YSBocmVmPSIuLi9pbnN0YWxsLmh0bWwjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+IGZvcgorbW9yZSBpbmZvcm1hdGlvbi48L3A+CisKKzxoNCBpZD0idXJsIj51cmw8L2g0PgogCiA8cD5SZXByZXNlbnRzIGEgVVJMLjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj51cmw8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHVybCB0byBleHBvc2U8L3RkPgotICAgIDx0ZCByb3dzcGFuPSIzIiBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+RXhhY3RseSBvbmUgb2YgdGhlc2U8L3RkPgorICAgIDx0ZD51cmw8L3RkPgorICAgIDx0ZD5UaGUgVVJMIHRvIGV4cG9zZTwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjMiPkV4YWN0bHkgb25lIG9mIHRoZXNlPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZmlsZSB0byBleHBvc2UgYXMgYSBmaWxlOiB1cmw8L3RkPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBmaWxlIHRvIGV4cG9zZSBhcyBhIDxjb2RlPmZpbGU6PC9jb2RlPiBVUkw8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlVXJsPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIFVSTCB3aGljaCBtdXN0IGJlIGNvbWJpbmVkIHdpdGggcmVsYXRpdmVQYXRoPC90ZD4KKyAgICA8dGQ+YmFzZVVybDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgYmFzZSBVUkwgd2hpY2ggbXVzdCBiZSBjb21iaW5lZAorICAgIHdpdGggPHZhcj5yZWxhdGl2ZVBhdGg8L3Zhcj48L3RkPgogIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlbGF0aXZlUGF0aDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5SZWxhdGl2ZSBwYXRoIHRoYXQgZGVmaW5lcyB0aGUgdXJsIGNvbWJpbmVkIHdpdGgKLSAgICAgIGJhc2VVcmw8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+SWYgdXNpbmcgYmFzZVVybDwvdGQ+CisgICAgPHRkPnJlbGF0aXZlUGF0aDwvdGQ+CisgICAgPHRkPlJlbGF0aXZlIHBhdGggdGhhdCBkZWZpbmVzIHRoZSBVUkwgd2hlbiBjb21iaW5lZCB3aXRoCisgICAgICA8dmFyPmJhc2VVcmw8L3Zhcj48L3RkPgorICAgIDx0ZD5JZiB1c2luZyA8dmFyPmJhc2VVcmw8L3Zhcj48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPGg0PjxhIG5hbWU9InN0cmluZyI+c3RyaW5nPC9hPjwvaDQ+Cis8aDQgaWQ9InN0cmluZyI+c3RyaW5nPC9oND4KIAotPHA+UmVwcmVzZW50cyBhIEphdmEgU3RyaW5nLiBJdCBjYW4gYmUgd3JpdHRlbiB0bywgYnV0IG9ubHkgb25jZSwgYWZ0ZXIgd2hpY2gKLWl0IHdpbGwgYmUgYW4gZXJyb3IgdG8gd3JpdGUgdG8gYWdhaW4uPC9wPgorPHA+UmVwcmVzZW50cyBhIEphdmEgU3RyaW5nLiBJdCBjYW4gYmUgd3JpdHRlbiB0bywgYnV0IG9ubHkgb25jZSwgYWZ0ZXIgd2hpY2ggaXQgd2lsbCBiZSBhbgorZXJyb3IgdG8gd3JpdGUgdG8gYWdhaW4uPC9wPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnZhbHVlPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB2YWx1ZSBvZiB0aGlzIHJlc291cmNlPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICA8dGQ+dmFsdWU8L3RkPgorICAgIDx0ZD5UaGUgdmFsdWUgb2YgdGhpcyByZXNvdXJjZTwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPlRoZSByZXNvdXJjZSBhbHNvIHN1cHBvcnRzIG5lc3RlZCB0ZXh0LCB3aGljaCBjYW4gb25seSBiZSBzdXBwbGllZCBpZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZSBpcyB1bnNldDoKLSAgPC9wPgorPHA+VGhlIHJlc291cmNlIGFsc28gc3VwcG9ydHMgbmVzdGVkIHRleHQsIHdoaWNoIGNhbiBvbmx5IGJlIHN1cHBsaWVkIGlmIHRoZSA8dmFyPnZhbHVlPC92YXI+CithdHRyaWJ1dGUgaXMgdW5zZXQ6PC9wPgogPHByZT4KLSAgJmx0O3N0cmluZz4KLSAgICAgICAgc2VsZi5sb2coIkFudCB2ZXJzaW9uID0ke2FudC52ZXJzaW9ufSIpOwotICAmbHQ7L3N0cmluZz4KLTwvcHJlPgotICAgIAotPC9wPgorJmx0O3N0cmluZyZndDsKKyAgICBzZWxmLmxvZygiQW50IHZlcnNpb24gPSR7YW50LnZlcnNpb259Iik7CismbHQ7L3N0cmluZyZndDs8L3ByZT4KIAotPGg0PjxhIG5hbWU9InByb3BlcnR5cmVzb3VyY2UiPnByb3BlcnR5cmVzb3VyY2U8L2E+PC9oND4KKzxoNCBpZD0icHJvcGVydHlyZXNvdXJjZSI+cHJvcGVydHlyZXNvdXJjZTwvaDQ+CiAKIDxwPlJlcHJlc2VudHMgYW4gQW50IHByb3BlcnR5LjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBwcm9wZXJ0eSBuYW1lPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgPHRkPm5hbWU8L3RkPgorICAgIDx0ZD5UaGUgcHJvcGVydHkgbmFtZTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08aHI+Ci08aDI+PGEgbmFtZT0iY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbnM8L2E+PC9oMj4KKzxoci8+Cis8aDIgaWQ9ImNvbGxlY3Rpb24iPlJlc291cmNlIENvbGxlY3Rpb25zPC9oMj4KIDxwPgotQSBSZXNvdXJjZSBDb2xsZWN0aW9uIGlzIGFuIGFic3RyYWN0aW9uIG9mIGFuIGVudGl0eSB0aGF0IGdyb3VwcwotdG9nZXRoZXIgYSBudW1iZXIgb2YgPGEgaHJlZj0iI3Jlc291cmNlIj5yZXNvdXJjZXM8L2E+LiBTZXZlcmFsIG9mCi1BbnQncyAibGVnYWN5IiBkYXRhdHlwZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGJlaGF2ZSBhcyBSZXNvdXJjZSBDb2xsZWN0aW9uczoKK0EgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhbiBlbnRpdHkgdGhhdCBncm91cHMgdG9nZXRoZXIgYSBudW1iZXIKK29mIDxhIGhyZWY9IiNyZXNvdXJjZSI+cmVzb3VyY2VzPC9hPi4gU2V2ZXJhbCBvZiBBbnQncyAibGVnYWN5IiBkYXRhdHlwZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvCitiZWhhdmUgYXMgcmVzb3VyY2UgY29sbGVjdGlvbnM6Cis8L3A+CiA8dWw+CiAgIDxsaT48YSBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+LAogICAgIDxhIGhyZWY9ImRpcnNldC5odG1sIj5kaXJzZXQ8L2E+LApAQCAtMzc5LDEwMTIgKzM4NCw5MTUgQEAKICAgICBleHBvc2VzIDxhIGhyZWY9IiNwcm9wZXJ0eXJlc291cmNlIj5wcm9wZXJ0eTwvYT4gcmVzb3VyY2VzCiAgIDwvbGk+CiA8L3VsPgotPC9wPgotPHA+U3RyYW5nZWx5LCBzb21lIHRhc2tzIGNhbiBldmVuIGxlZ2l0aW1hdGVseSBiZWhhdmUgYXMgcmVzb3VyY2UgY29sbGVjdGlvbnM6Cis8cD5TdHJhbmdlbHksIHNvbWUgdGFza3MgY2FuIGV2ZW4gbGVnaXRpbWF0ZWx5IGJlaGF2ZSBhcyByZXNvdXJjZQorY29sbGVjdGlvbnM6PC9wPgogPHVsPgotICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvY29uY2F0Lmh0bWwiPmNvbmNhdDwvYT4KLSAgICBleHBvc2VzIGEgY29uY2F0ZW5hdGVkIHJlc291cmNlLCBhbmQgYWRkcyBlLmcuCi0gICAgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyaW5nPC9hPgorICA8bGk+PGEgaHJlZj0iLi4vVGFza3MvY29uY2F0Lmh0bWwiPmNvbmNhdDwvYT4gZXhwb3NlcyBhIGNvbmNhdGVuYXRlZAorICAgIHJlc291cmNlLCBhbmQgYWRkcyBlLmcuICA8YSBocmVmPSJmaWx0ZXJjaGFpbi5odG1sIj5maWx0ZXJpbmc8L2E+CiAgICAgdG8gQW50J3MgcmVzb3VyY2UtcmVsYXRlZCBjYXBhYmlsaXRpZXMuCiAgIDwvbGk+CiA8L3VsPgotPC9wPgotPGgzPlRoZSBhZGRpdGlvbmFsIGJ1aWx0LWluIHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZTo8L2gzPgorPGgzPkFkZGl0aW9uYWwgYnVpbHQtaW4gcmVzb3VyY2UgY29sbGVjdGlvbnM8L2gzPgorVGhlIGFkZGl0aW9uYWwgYnVpbHQtaW4gcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlOgogPHVsPgotICA8bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+cmVzb3VyY2VzPC9hPiAtIGdlbmVyaWMgcmVzb3VyY2UgY29sbGVjdGlvbjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjZmlsZXMiPmZpbGVzPC9hPiAtIGNvbGxlY3Rpb24gb2YgZmlsZXMgc2ltaWxhciB0bwotICAgIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0iI3Jlc3RyaWN0Ij5yZXN0cmljdDwvYT4gLSByZXN0cmljdCBhIHJlc291cmNlIGNvbGxlY3Rpb24KLSAgICB0byBpbmNsdWRlIG9ubHkgcmVzb3VyY2VzIG1lZXRpbmcgc3BlY2lmaWVkIGNyaXRlcmlhPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNzb3J0Ij5zb3J0PC9hPiAtIHNvcnRlZCByZXNvdXJjZSBjb2xsZWN0aW9uPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNmaXJzdCI+Zmlyc3Q8L2E+IC0gZmlyc3QgPGk+bjwvaT4gcmVzb3VyY2VzIGZyb20gYQorICA8bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+cmVzb3VyY2VzPC9hPiZtZGFzaDtnZW5lcmljIHJlc291cmNlIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI2ZpbGVzIj5maWxlczwvYT4mbWRhc2g7Y29sbGVjdGlvbiBvZiBmaWxlcyBzaW1pbGFyCisgIHRvIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI3Jlc3RyaWN0Ij5yZXN0cmljdDwvYT4mbWRhc2g7cmVzdHJpY3QgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIGluY2x1ZGUgb25seQorICByZXNvdXJjZXMgbWVldGluZyBzcGVjaWZpZWQgY3JpdGVyaWE8L2xpPgorICA8bGk+PGEgaHJlZj0iI3NvcnQiPnNvcnQ8L2E+Jm1kYXNoO3NvcnRlZCByZXNvdXJjZSBjb2xsZWN0aW9uPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNmaXJzdCI+Zmlyc3Q8L2E+Jm1kYXNoO2ZpcnN0IDxlbT5uPC9lbT4gcmVzb3VyY2VzIGZyb20gYSBuZXN0ZWQgY29sbGVjdGlvbjwvbGk+CisgIDxsaT48YSBocmVmPSIjbGFzdCI+bGFzdDwvYT4mbWRhc2g7bGFzdCA8ZW0+bjwvZW0+IHJlc291cmNlcyBmcm9tIGEgbmVzdGVkIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI2FsbGJ1dGZpcnN0Ij5hbGxidXRmaXJzdDwvYT4mbWRhc2g7YWxsIGV4Y2VwdCB0aGUgZmlyc3QgPGVtPm48L2VtPiByZXNvdXJjZXMKKyAgICBmcm9tIGEgbmVzdGVkIGNvbGxlY3Rpb248L2xpPgorICA8bGk+PGEgaHJlZj0iI2FsbGJ1dGxhc3QiPmFsbGJ1dGxhc3Q8L2E+Jm1kYXNoO2FsbCBleGNlcHQgdGhlIGxhc3QgPGVtPm48L2VtPiByZXNvdXJjZXMgZnJvbSBhCiAgICAgbmVzdGVkIGNvbGxlY3Rpb248L2xpPgotICA8bGk+PGEgaHJlZj0iI2xhc3QiPmxhc3Q8L2E+IC0gbGFzdCA8aT5uPC9pPiByZXNvdXJjZXMgZnJvbSBhCisgIDxsaT48YSBocmVmPSIjdG9rZW5zIj50b2tlbnM8L2E+Jm1kYXNoOzxhIGhyZWY9IiNzdHJpbmciPnN0cmluZzwvYT4gdG9rZW5zIGdhdGhlcmVkIGZyb20gYQogICAgIG5lc3RlZCBjb2xsZWN0aW9uPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNhbGxidXRmaXJzdCI+YWxsYnV0Zmlyc3Q8L2E+IC0gYWxsIGV4Y2VwdCB0aGUKLSAgICBmaXJzdCA8aT5uPC9pPiByZXNvdXJjZXMgZnJvbSBhIG5lc3RlZCBjb2xsZWN0aW9uPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNhbGxidXRsYXN0Ij5hbGxidXRsYXN0PC9hPiAtIGFsbCBleGNlcHQgdGhlIGxhc3QgPGk+bjwvaT4KLSAgICByZXNvdXJjZXMgZnJvbSBhIG5lc3RlZCBjb2xsZWN0aW9uPC9saT4KLSAgPGxpPjxhIGhyZWY9IiN0b2tlbnMiPnRva2VuczwvYT4gLSA8YSBocmVmPSIjc3RyaW5nIj5zdHJpbmc8L2E+IHRva2VucwotICAgIGdhdGhlcmVkIGZyb20gYSBuZXN0ZWQgY29sbGVjdGlvbjwvbGk+Ci0gIDxsaT48YSBocmVmPSIjdW5pb24iPnVuaW9uPC9hPiAtIHNldCB1bmlvbiBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnM8L2xpPgotICA8bGk+PGEgaHJlZj0iI2ludGVyc2VjdCI+aW50ZXJzZWN0PC9hPiAtIHNldCBpbnRlcnNlY3Rpb24KLSAgICBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnM8L2xpPgotICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVuY2UiPmRpZmZlcmVuY2U8L2E+IC0gc2V0IGRpZmZlcmVuY2UKLSAgICBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnM8L2xpPgotICA8bGk+PGEgaHJlZj0iI21hcHBlZHJlc291cmNlcyI+bWFwcGVkcmVzb3VyY2VzPC9hPiAtIGdlbmVyaWMKLSAgICByZXNvdXJjZSBjb2xsZWN0aW9uIHdyYXBwZXIgdGhhdCBtYXBzIHRoZSBuYW1lcyBvZiB0aGUgbmVzdGVkCi0gICAgcmVzb3VyY2VzIHVzaW5nIGEgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4uPC9saT4KLSAgPGxpPjxhIGhyZWY9IiNhcmNoaXZlcyI+YXJjaGl2ZXM8L2E+IC0gd3JhcHMgYXJvdW5kIGRpZmZlcmVudAotICAgIHJlc291cmNlIGNvbGxlY3Rpb25zIGFuZCB0cmVhdHMgdGhlIG5lc3RlZCByZXNvdXJjZXMgYXMgWklQIG9yIFRBUgotICAgIGFyY2hpdmVzIHRoYXQgd2lsbCBiZSBleHRyYWN0ZWQgb24gdGhlIGZseS48L2xpPgotICA8bGk+PGEgaHJlZj0iI3Jlc291cmNlbGlzdCI+cmVzb3VyY2VsaXN0PC9hPiAtIGEgY29sbGVjdGlvbiBvZgotICAgIHJlc291cmNlcyB3aG9zZSBuYW1lcyBoYXZlIGJlZW4gcmVhZCBmcm9tIGFub3RoZXIgcmVzb3VyY2UuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiN1bmlvbiI+dW5pb248L2E+Jm1kYXNoO3NldCB1bmlvbiBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnM8L2xpPgorICA8bGk+PGEgaHJlZj0iI2ludGVyc2VjdCI+aW50ZXJzZWN0PC9hPiZtZGFzaDtzZXQgaW50ZXJzZWN0aW9uIG9mIG5lc3RlZCByZXNvdXJjZQorICAgIGNvbGxlY3Rpb25zPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNkaWZmZXJlbmNlIj5kaWZmZXJlbmNlPC9hPiZtZGFzaDtzZXQgZGlmZmVyZW5jZSBvZiBuZXN0ZWQgcmVzb3VyY2UKKyAgICBjb2xsZWN0aW9uczwvbGk+CisgIDxsaT48YSBocmVmPSIjbWFwcGVkcmVzb3VyY2VzIj5tYXBwZWRyZXNvdXJjZXM8L2E+Jm1kYXNoO2dlbmVyaWMgcmVzb3VyY2UgY29sbGVjdGlvbiB3cmFwcGVyCisgICAgdGhhdCBtYXBzIHRoZSBuYW1lcyBvZiB0aGUgbmVzdGVkIHJlc291cmNlcyB1c2luZyBhIDxhIGhyZWY9Im1hcHBlci5odG1sIj5tYXBwZXI8L2E+LjwvbGk+CisgIDxsaT48YSBocmVmPSIjYXJjaGl2ZXMiPmFyY2hpdmVzPC9hPiZtZGFzaDt3cmFwcyBhcm91bmQgZGlmZmVyZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIGFuZAorICAgIHRyZWF0cyB0aGUgbmVzdGVkIHJlc291cmNlcyBhcyBaSVAgb3IgVEFSIGFyY2hpdmVzIHRoYXQgd2lsbCBiZSBleHRyYWN0ZWQgb24gdGhlIGZseS48L2xpPgorICA8bGk+PGEgaHJlZj0iI3Jlc291cmNlbGlzdCI+cmVzb3VyY2VsaXN0PC9hPiZtZGFzaDthIGNvbGxlY3Rpb24gb2YgcmVzb3VyY2VzIHdob3NlIG5hbWVzIGhhdmUKKyAgICBiZWVuIHJlYWQgZnJvbSBhbm90aGVyIHJlc291cmNlLjwvbGk+CiA8L3VsPgotPGg0PjxhIG5hbWU9InJlc291cmNlcyI+cmVzb3VyY2VzPC9hPjwvaDQ+Ci08cD5BIGdlbmVyaWMgcmVzb3VyY2UgY29sbGVjdGlvbiwgZGVzaWduZWQgZm9yIHVzZSB3aXRoCi0gIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlczwvYT4uCi0gIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkLXBhcnR5IEFudCB0YXNrIGdlbmVyYXRlcyBhIFJlc291cmNlIENvbGxlY3Rpb24KLSAgb2YgYW4gdW5rbm93biB0eXBlLCBpdCBjYW4gc3RpbGwgYmUgYWNjZXNzZWQgdmlhIGEKLSAgPGNvZGU+Jmx0O3Jlc291cmNlcyZndDs8L2NvZGU+IGNvbGxlY3Rpb24uIFRoZSBzZWNvbmRhcnkgdXNlIG9mIHRoaXMKLSAgY29sbGVjdGlvbiB0eXBlIGlzIGFzIGEgY29udGFpbmVyIG9mIG90aGVyIHJlc291cmNlIGNvbGxlY3Rpb25zLAotICBwcmVzZXJ2aW5nIHRoZSBvcmRlciBvZiBuZXN0ZWQgY29sbGVjdGlvbnMgYXMgd2VsbCBhcwotICBkdXBsaWNhdGUgcmVzb3VyY2VzIChjb250cmFzdCB3aXRoIDxhIGhyZWY9IiN1bmlvbiI+dW5pb248L2E+KS4KKworPGg0IGlkPSJyZXNvdXJjZXMiPnJlc291cmNlczwvaDQ+Cis8cD4KK0EgZ2VuZXJpYyByZXNvdXJjZSBjb2xsZWN0aW9uLCBkZXNpZ25lZCBmb3IgdXNlCit3aXRoIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlczwvYT4uICBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZC1wYXJ0eSBBbnQgdGFzaworZ2VuZXJhdGVzIGEgcmVzb3VyY2UgY29sbGVjdGlvbiBvZiBhbiB1bmtub3duIHR5cGUsIGl0IGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB2aWEKK2EgPGNvZGU+Jmx0O3Jlc291cmNlcyZndDs8L2NvZGU+IGNvbGxlY3Rpb24uIFRoZSBzZWNvbmRhcnkgdXNlIG9mIHRoaXMgY29sbGVjdGlvbiB0eXBlIGlzIGFzIGEKK2NvbnRhaW5lciBvZiBvdGhlciByZXNvdXJjZSBjb2xsZWN0aW9ucywgcHJlc2VydmluZyB0aGUgb3JkZXIgb2YgbmVzdGVkIGNvbGxlY3Rpb25zIGFzIHdlbGwgYXMKK2R1cGxpY2F0ZSByZXNvdXJjZXMgKGNvbnRyYXN0IHdpdGggPGEgaHJlZj0iI3VuaW9uIj51bmlvbjwvYT4pLgogPC9wPgotPGJsb2NrcXVvdGU+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjYWNoZSByZXN1bHRzLiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+ZmFsc2U8L2k+PC90ZD4KKyAgICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgICA8dGQ+V2hldGhlciB0byBjYWNoZSByZXN1bHRzLiAgPGVtPnNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgogICAgIDwvdHI+CiAgIDwvdGFibGU+Ci08L2Jsb2NrcXVvdGU+CiAKLTxoND48YSBuYW1lPSJmaWxlcyI+ZmlsZXM8L2E+PC9oND4KLTxwPkEgZ3JvdXAgb2YgZmlsZXMuIFRoZXNlIGZpbGVzIGFyZSBtYXRjaGVkIGJ5IDxiPmFic29sdXRlPC9iPiBwYXR0ZXJucwotICB0YWtlbiBmcm9tIGEgbnVtYmVyIG9mIDxhIGhyZWY9InBhdHRlcm5zZXQuaHRtbCI+UGF0dGVyblNldHM8L2E+LgotICBUaGVzZSBjYW4gYmUgc3BlY2lmaWVkIGFzIG5lc3RlZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+Ci0gIGVsZW1lbnRzLiBJbiBhZGRpdGlvbiwgPGNvZGU+Jmx0O2ZpbGVzJmd0OzwvY29kZT4gaG9sZHMgYW4gaW1wbGljaXQKLSAgUGF0dGVyblNldCBhbmQgc3VwcG9ydHMgdGhlIG5lc3RlZCA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+LAotICA8Y29kZT4mbHQ7aW5jbHVkZXNmaWxlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KLSAgYW5kIDxjb2RlPiZsdDtleGNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiBQYXR0ZXJuU2V0IGRpcmVjdGx5LAotICBhcyB3ZWxsIGFzIFBhdHRlcm5TZXQncyBhdHRyaWJ1dGVzLgorPGg0IGlkPSJmaWxlcyI+ZmlsZXM8L2g0PgorPHA+QSBncm91cCBvZiBmaWxlcy4gVGhlc2UgZmlsZXMgYXJlIG1hdGNoZWQgYnkgPHN0cm9uZz5hYnNvbHV0ZTwvc3Ryb25nPiBwYXR0ZXJucyB0YWtlbiBmcm9tIGEKK251bWJlciBvZiA8YSBocmVmPSJwYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXRzPC9hPi4gIFRoZXNlIGNhbiBiZSBzcGVjaWZpZWQgYXMKK25lc3RlZCA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+IGVsZW1lbnRzLiBJbiBhZGRpdGlvbiwgPGNvZGU+Jmx0O2ZpbGVzJmd0OzwvY29kZT4gaG9sZHMKK2FuIGltcGxpY2l0IFBhdHRlcm5TZXQgYW5kIHN1cHBvcnRzIHRoZQorbmVzdGVkIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4sIDxjb2RlPiZsdDtpbmNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtleGNsdWRlc2ZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiBQYXR0ZXJuU2V0IGRpcmVjdGx5LCBhcyB3ZWxsIGFzIFBhdHRlcm5TZXQncworYXR0cmlidXRlcy4KIDwvcD4KLTxwPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5GaWxlIFNlbGVjdG9yczwvYT4gYXJlIGF2YWlsYWJsZSBhcyBuZXN0ZWQKLSAgZWxlbWVudHMuIEEgZmlsZSBtdXN0IGJlIHNlbGVjdGVkIGJ5IGFsbCBzZWxlY3RvcnMgaW4gb3JkZXIgdG8gYmUgaW5jbHVkZWQ7Ci0gIDxjb2RlPiZsdDtmaWxlcyZndDs8L2NvZGU+IGlzIHRodXMgZXF1aXZhbGVudCB0byBhbgotICA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4gZmlsZSBzZWxlY3RvciBjb250YWluZXIuCis8cD48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCI+RmlsZSBTZWxlY3RvcnM8L2E+IGFyZSBhdmFpbGFibGUgYXMgbmVzdGVkIGVsZW1lbnRzLiBBIGZpbGUgbXVzdCBiZQorc2VsZWN0ZWQgYnkgYWxsIHNlbGVjdG9ycyBpbiBvcmRlciB0byBiZSBpbmNsdWRlZDsgPGNvZGU+Jmx0O2ZpbGVzJmd0OzwvY29kZT4gaXMgdGh1cyBlcXVpdmFsZW50Cit0byBhbiA8Y29kZT4mbHQ7YW5kJmd0OzwvY29kZT4gZmlsZSBzZWxlY3RvciBjb250YWluZXIuCiA8L3A+Ci08cD48Yj5Nb3JlIHNpbXBseSBwdXQ8L2I+LCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBhCi0gIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4gd2l0aCBubyBiYXNlIGRpcmVjdG9yeS4KLSAgPGI+UGxlYXNlIG5vdGU8L2I+IHRoYXQgd2l0aG91dCBhIGJhc2UgZGlyZWN0b3J5LAotICBmaWxlc3lzdGVtIHNjYW5uaW5nIGlzIGJhc2VkIGVudGlyZWx5IG9uIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMuCi0gIEEgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjZmlsZW5hbWVzZWxlY3QiPmZpbGVuYW1lPC9hPiAob3IgYW55KQotICBzZWxlY3RvciBjYW4gPGk+b25seTwvaT4gaW5mbHVlbmNlIHRoZSBzY2FubmluZyBwcm9jZXNzIDxpPmFmdGVyPC9pPgotICB0aGUgZmlsZSBoYXMgYmVlbiBpbmNsdWRlZCBiYXNlZCBvbiBwYXR0ZXJuLWJhc2VkIHNlbGVjdGlvbi4KKzxwPjxzdHJvbmc+TW9yZSBzaW1wbHkgcHV0PC9zdHJvbmc+LCB0aGlzIHR5cGUgaXMgZXF1aXZhbGVudAordG8gPGEgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiB3aXRoIG5vIGJhc2UgZGlyZWN0b3J5LiAgPHN0cm9uZz5QbGVhc2Ugbm90ZTwvc3Ryb25nPiB0aGF0Cit3aXRob3V0IGEgYmFzZSBkaXJlY3RvcnksIGZpbGVzeXN0ZW0gc2Nhbm5pbmcgaXMgYmFzZWQgZW50aXJlbHkgb24gaW5jbHVkZSBhbmQgZXhjbHVkZSBwYXR0ZXJucy4KK0EgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjZmlsZW5hbWVzZWxlY3QiPmZpbGVuYW1lPC9hPiAob3IgYW55KSBzZWxlY3RvciBjYW4gPGVtPm9ubHk8L2VtPgoraW5mbHVlbmNlIHRoZSBzY2FubmluZyBwcm9jZXNzIDxlbT5hZnRlcjwvZW0+IHRoZSBmaWxlIGhhcyBiZWVuIGluY2x1ZGVkIGJhc2VkIG9uIHBhdHRlcm4tYmFzZWQKK3NlbGVjdGlvbi4KIDwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlczwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5jb21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMKLSAgICAgIG9mIGZpbGVzIHRoYXQgbXVzdCBiZSBpbmNsdWRlZDwvdGQ+Ci0gICAgPHRkIHJvd3NwYW49IjIiIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0iY2VudGVyIj5BdCBsZWFzdCBvbmUgb2YgdGhlc2U8L3RkPgorICAgIDx0ZD5pbmNsdWRlczwvdGQ+CisgICAgPHRkPkNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucyBvZiBmaWxlcyB0aGF0IG11c3QgYmUgaW5jbHVkZWQ8L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5BdCBsZWFzdCBvbmUgb2YgdGhlc2U8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5pbmNsdWRlc2ZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIG5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzCi0gICAgICB0YWtlbiB0byBiZSBhbiBpbmNsdWRlIHBhdHRlcm4uPC90ZD4KKyAgICA8dGQ+aW5jbHVkZXNmaWxlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPk5hbWUgb2YgYSBmaWxlOyBlYWNoIGxpbmUgb2YgdGhpcyBmaWxlIGlzIHRha2VuIHRvIGJlIGFuIGluY2x1ZGUKKyAgICBwYXR0ZXJuLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNvbW1hLSBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucwotICAgICAgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkPC90ZD4KLSAgICA8dGQgcm93c3Bhbj0iMiIgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IG5vbmUKLSAgICAgIChleGNlcHQgZGVmYXVsdCBleGNsdWRlcyB3aGVuIHRydWUpPC90ZD4KKyAgICA8dGQ+ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5Db21tYS0gb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgb2YgZmlsZXMgdGhhdCBtdXN0IGJlIGV4Y2x1ZGVkPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgZXhjbHVkZXMgb3Igbm9uZSBpZiA8dmFyPmRlZmF1bHRleGNsdWRlczwvdmFyPgorICAgIGlzIDxxPm5vPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmV4Y2x1ZGVzZmlsZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMKLSAgICAgIHRha2VuIHRvIGJlIGFuIGV4Y2x1ZGUgcGF0dGVybi48L3RkPgorICAgIDx0ZD5leGNsdWRlc2ZpbGU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+TmFtZSBvZiBhIGZpbGU7IGVhY2ggbGluZSBvZiB0aGlzIGZpbGUgaXMgdGFrZW4gdG8gYmUgYW4gZXhjbHVkZQorICAgIHBhdHRlcm4uPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+ZGVmYXVsdGV4Y2x1ZGVzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIKLSAgICAgIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj5kZWZhdWx0IGV4Y2x1ZGVzPC9hPgotICAgICAgc2hvdWxkIGJlIHVzZWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZD5kZWZhdWx0ZXhjbHVkZXM8L3RkPgorICAgIDx0ZD5XaGV0aGVyIDxhIGhyZWY9Ii4uL2RpcnRhc2tzLmh0bWwjZGVmYXVsdGV4Y2x1ZGVzIj5kZWZhdWx0IGV4Y2x1ZGVzPC9hPiBzaG91bGQgYmUKKyAgICAgIHVzZWQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBwYXR0ZXJucyBhcmUgY2FzZS1zZW5zaXRpdmU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICAgIDx0ZD5jYXNlc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+V2hldGhlciBwYXR0ZXJucyBhcmUgY2FzZS1zZW5zaXRpdmU8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+Ci0gIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZvbGxvd3N5bWxpbmtzPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZm9sbG93IHN5bWJvbGljIGxpbmtzCi0gICAgICAoc2VlIG5vdGUgPGEgaHJlZj0iI3N5bWxpbmsiPmJlbG93PC9hPik8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgorICA8dHIgaWQ9ImZvbGxvd3N5bWxpbmtzIj4KKyAgICA8dGQ+Zm9sbG93c3ltbGlua3M8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGZvbGxvdyBzeW1ib2xpYyBsaW5rcyAoc2VlIG5vdGUgPGEgaHJlZj0iI3N5bWxpbmsiPmJlbG93PC9hPik8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD48YSBuYW1lPSJzeW1saW5rIj48Yj5Ob3RlPC9iPjwvYT46IEFsbCBmaWxlcy9kaXJlY3RvcmllcyBmb3Igd2hpY2gKLXRoZSBjYW5vbmljYWwgcGF0aCBpcyBkaWZmZXJlbnQgZnJvbSBpdHMgcGF0aCBhcmUgY29uc2lkZXJlZCBzeW1ib2xpYwotbGlua3MuICBPbiBVbml4IHN5c3RlbXMgdGhpcyB1c3VhbGx5IG1lYW5zIHRoZSBmaWxlIHJlYWxseSBpcyBhCi1zeW1ib2xpYyBsaW5rIGJ1dCBpdCBtYXkgbGVhZCB0byBmYWxzZSByZXN1bHRzIG9uIG90aGVyCi1wbGF0Zm9ybXMuCi08L3A+Cis8cCBpZD0ic3ltbGluayI+PGEgaHJlZj0iI2ZvbGxvd3N5bWxpbmtzIj48c3Ryb25nPk5vdGU8L3N0cm9uZz48L2E+OiBBbGwgZmlsZXMvZGlyZWN0b3JpZXMgZm9yIHdoaWNoCit0aGUgY2Fub25pY2FsIHBhdGggaXMgZGlmZmVyZW50IGZyb20gaXRzIHBhdGggYXJlIGNvbnNpZGVyZWQgc3ltYm9saWMgbGlua3MuICBPbiBVbml4IHN5c3RlbXMgdGhpcwordXN1YWxseSBtZWFucyB0aGUgZmlsZSByZWFsbHkgaXMgYSBzeW1ib2xpYyBsaW5rIGJ1dCBpdCBtYXkgbGVhZCB0byBmYWxzZSByZXN1bHRzIG9uIG90aGVyCitwbGF0Zm9ybXMuPC9wPgogCi08aDQ+PGEgbmFtZT0icmVzdHJpY3QiPnJlc3RyaWN0PC9hPjwvaDQ+Ci08cD5SZXN0cmljdHMgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiB1c2luZyByZXNvdXJjZSBzZWxlY3RvcnM6Ci08YmxvY2txdW90ZT4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nCi0gICAgICAgIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgotICA8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KLSAgPHA+TmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycyBhcmUgdXNlZCB0byAibmFycm93IGRvd24iIHRoZSBpbmNsdWRlZAotICAgIHJlc291cmNlcywgY29tYmluZWQgdmlhIGEgbG9naWNhbCA8aT5BTkQ8L2k+LiBUaGVzZSBhcmUgcGF0dGVybmVkIAotICAgIGFmdGVyIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5maWxlIHNlbGVjdG9yczwvYT4gYnV0IGFyZSwgCi0gICAgdW5zdXJwcmlzaW5nbHksIHRhcmdldGVkIHRvIHJlc291cmNlcy4KLSAgICBTZXZlcmFsIGJ1aWx0LWluIHJlc291cmNlIHNlbGVjdG9ycyBhcmUgYXZhaWxhYmxlIGluIHRoZSBpbnRlcm5hbAotICAgIDxhIGhyZWY9ImFudGxpYi5odG1sIj5hbnRsaWI8L2E+Ci0gICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczwvY29kZT46Ci0gIDwvcD4KKzxoNCBpZD0icmVzdHJpY3QiPnJlc3RyaWN0PC9oND4KKzxwPlJlc3RyaWN0cyBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIHVzaW5nIHJlc291cmNlIHNlbGVjdG9yczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhY2hlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcKKyAgICAgIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoNT5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g1PgorPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+Cis8cD5OZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzIGFyZSB1c2VkIHRvICJuYXJyb3cgZG93biIgdGhlIGluY2x1ZGVkIHJlc291cmNlcywgY29tYmluZWQgdmlhIGEKK2xvZ2ljYWwgPGVtPkFORDwvZW0+LiBUaGVzZSBhcmUgcGF0dGVybmVkIGFmdGVyIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sIj5maWxlIHNlbGVjdG9yczwvYT4gYnV0CithcmUsIHVuc3VycHJpc2luZ2x5LCB0YXJnZXRlZCB0byByZXNvdXJjZXMuICBTZXZlcmFsIGJ1aWx0LWluIHJlc291cmNlIHNlbGVjdG9ycyBhcmUgYXZhaWxhYmxlCitpbiB0aGUKK2ludGVybmFsIDxhIGhyZWY9ImFudGxpYi5odG1sIj5hbnRsaWI8L2E+IDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnM8L2NvZGU+OjwvcD4KIAotICA8dWw+Ci0gICAgPGxpPjxhIGhyZWY9IiNyc2VsLm5hbWUiPm5hbWU8L2E+IC0gc2VsZWN0IHJlc291cmNlcyBieSBuYW1lLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNyc2VsLmV4aXN0cyI+ZXhpc3RzPC9hPiAtIHNlbGVjdCBleGlzdGluZyByZXNvdXJjZXMuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3JzZWwuZGF0ZSI+ZGF0ZTwvYT4gLSBzZWxlY3QgcmVzb3VyY2VzIGJ5IGRhdGUuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3JzZWwudHlwZSI+dHlwZTwvYT4gLSBzZWxlY3QgcmVzb3VyY2VzIGJ5IHR5cGUuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3JzZWwuc2l6ZSI+c2l6ZTwvYT4gLSBzZWxlY3QgcmVzb3VyY2VzIGJ5IHNpemUuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3JzZWwuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT4KLSAgICAgIC0gc2VsZWN0IHJlc291cmNlcyBieSBjbGFzcyBvciBBbnQgZGF0YXR5cGUuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI3JzZWwuYW5kIj5hbmQ8L2E+IC0gImFuZCIgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L2xpPgotICAgIDxsaT48YSBocmVmPSIjcnNlbC5vciI+b3I8L2E+IC0gIm9yIiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNyc2VsLm5vdCI+bm90PC9hPiAtICJub3QiIGEgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9yLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNyc2VsLm5vbmUiPm5vbmU8L2E+Ci0gICAgICAtIHNlbGVjdCByZXNvdXJjZXMgc2VsZWN0ZWQgYnkgbm8gbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L2xpPgotICAgIDxsaT48YSBocmVmPSIjcnNlbC5tYWpvcml0eSI+bWFqb3JpdHk8L2E+IC0gc2VsZWN0IHJlc291cmNlcyBzZWxlY3RlZAotICAgICAgYnkgYSBtYWpvcml0eSBvZiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI21vZGlmaWVkIj5tb2RpZmllZDwvYT4gLSBzZWxlY3QgcmVzb3VyY2VzIHdoaWNoCi0gICAgICBjb250ZW50IGhhcyBjaGFuZ2VkLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2NvbnRhaW5zc2VsZWN0Ij5jb250YWluczwvYT4gLSBzZWxlY3QgcmVzb3VyY2VzIAotICAgICAgY29udGFpbmluZyBhIHBhcnRpY3VsYXIgdGV4dCBzdHJpbmcuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjcmVnZXhwc2VsZWN0Ij5jb250YWluc3JlZ2V4cDwvYT4gLSBzZWxlY3QKLSAgICAgIHJlc291cmNlcyB3aG9zZSBjb250ZW50cyBtYXRjaCBhIHBhcnRpY3VsYXIgcmVndWxhciBleHByZXNzaW9uLjwvbGk+Ci0gICAgPGxpPjxhIGhyZWY9IiNyc2VsLmNvbXBhcmUiPmNvbXBhcmU8L2E+IC0gc2VsZWN0IHJlc291cmNlcwotICAgICAgYmFzZWQgb24gY29tcGFyaXNvbiB0byBvdGhlciByZXNvdXJjZXMuPC9saT4KLSAgICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjcmVhZGFibGUiPnJlYWRhYmxlPC9hPiAtCi0gICAgICBTZWxlY3QgZmlsZXMgKHJlc291cmNlcyBtdXN0IGJlIGZpbGVzKSBpZiB0aGV5IGFyZSByZWFkYWJsZS48L2xpPgotICAgIDxsaT48YSBocmVmPSJzZWxlY3RvcnMuaHRtbCN3cml0YWJsZSI+d3JpdGFibGU8L2E+IC0KLSAgICAgIFNlbGVjdCBmaWxlcyAocmVzb3VyY2VzIG11c3QgYmUgZmlsZXMpIGlmIHRoZXkgYXJlIHdyaXRhYmxlLjwvbGk+Ci0gIDwvdWw+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjcnNlbC5uYW1lIj5uYW1lPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIGJ5IG5hbWUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyc2VsLmV4aXN0cyI+ZXhpc3RzPC9hPiZtZGFzaDtzZWxlY3QgZXhpc3RpbmcgcmVzb3VyY2VzLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5kYXRlIj5kYXRlPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIGJ5IGRhdGUuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyc2VsLnR5cGUiPnR5cGU8L2E+Jm1kYXNoO3NlbGVjdCByZXNvdXJjZXMgYnkgdHlwZS48L2xpPgorICA8bGk+PGEgaHJlZj0iI3JzZWwuc2l6ZSI+c2l6ZTwvYT4mbWRhc2g7c2VsZWN0IHJlc291cmNlcyBieSBzaXplLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5pbnN0YW5jZW9mIj5pbnN0YW5jZW9mPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIGJ5IGNsYXNzIG9yIEFudAorICAgIGRhdGF0eXBlLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5hbmQiPmFuZDwvYT4mbWRhc2g7PHE+YW5kPC9xPiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5vciI+b3I8L2E+Jm1kYXNoOzxxPm9yPC9xPiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5ub3QiPm5vdDwvYT4mbWRhc2g7PHE+bm90PC9xPiBhIG5lc3RlZCByZXNvdXJjZSBzZWxlY3Rvci48L2xpPgorICA8bGk+PGEgaHJlZj0iI3JzZWwubm9uZSI+bm9uZTwvYT4mbWRhc2g7c2VsZWN0IHJlc291cmNlcyBzZWxlY3RlZCBieSBubyBuZXN0ZWQgcmVzb3VyY2UKKyAgICBzZWxlY3RvcnMuPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyc2VsLm1ham9yaXR5Ij5tYWpvcml0eTwvYT4mbWRhc2g7c2VsZWN0IHJlc291cmNlcyBzZWxlY3RlZCBieSBhIG1ham9yaXR5IG9mCisgICAgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L2xpPgorICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjbW9kaWZpZWQiPm1vZGlmaWVkPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIHdoaWNoIGNvbnRlbnQgaGFzCisgICAgY2hhbmdlZC48L2xpPgorICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjY29udGFpbnNzZWxlY3QiPmNvbnRhaW5zPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIGNvbnRhaW5pbmcgYQorICAgIHBhcnRpY3VsYXIgdGV4dCBzdHJpbmcuPC9saT4KKyAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI3JlZ2V4cHNlbGVjdCI+Y29udGFpbnNyZWdleHA8L2E+Jm1kYXNoO3NlbGVjdCByZXNvdXJjZXMgd2hvc2UKKyAgICBjb250ZW50cyBtYXRjaCBhIHBhcnRpY3VsYXIgcmVndWxhciBleHByZXNzaW9uLjwvbGk+CisgIDxsaT48YSBocmVmPSIjcnNlbC5jb21wYXJlIj5jb21wYXJlPC9hPiZtZGFzaDtzZWxlY3QgcmVzb3VyY2VzIGJhc2VkIG9uIGNvbXBhcmlzb24gdG8gb3RoZXIKKyAgICByZXNvdXJjZXMuPC9saT4KKyAgPGxpPjxhIGhyZWY9InNlbGVjdG9ycy5odG1sI3JlYWRhYmxlIj5yZWFkYWJsZTwvYT4mbWRhc2g7c2VsZWN0IGZpbGVzIChyZXNvdXJjZXMgbXVzdCBiZQorICAgIGZpbGVzKSBpZiB0aGV5IGFyZSByZWFkYWJsZS48L2xpPgorICA8bGk+PGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjd3JpdGFibGUiPndyaXRhYmxlPC9hPiZtZGFzaDtzZWxlY3QgZmlsZXMgKHJlc291cmNlcyBtdXN0IGJlCisgICAgZmlsZXMpIGlmIHRoZXkgYXJlIHdyaXRhYmxlLjwvbGk+Cis8L3VsPgogCi0gIDxoND48YSBuYW1lPSJyc2VsLm5hbWUiPm5hbWU8L2E+PC9oND4KLSAgPHA+U2VsZWN0cyByZXNvdXJjZXMgYnkgbmFtZS48L3A+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIHBhdHRlcm4gdG8gdGVzdCB1c2luZyBzdGFuZGFyZCBBbnQKLSAgICAgICAgcGF0dGVybnMuPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+RXhhY3RseSBvbmUgb2YKLSAgICAgICAgdGhlIHR3bzwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZ2V4PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBmaWxlcyB0byBzZWxlY3QuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgbmFtZSBjb21wYXJpc29ucyBhcmUgY2FzZS1zZW5zaXRpdmU8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmhhbmRsZWRpcnNlcDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBJZiB0aGlzIGlzIHNwZWNpZmllZCwgdGhlIG1hcHBlciB3aWxsIHRyZWF0IGEgXCBjaGFyYWN0ZXIgaW4gYQotICAgICAgICByZXNvdXJjZSBuYW1lIG9yIG5hbWUgYXR0cmlidXRlIGFzIGEgLyBmb3IgdGhlIHB1cnBvc2VzIG9mCi0gICAgICAgIG1hdGNoaW5nLiAgVGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHRydWUgb3IgZmFsc2UsIHRoZSBkZWZhdWx0IGlzCi0gICAgICAgIGZhbHNlLgotICAgICAgICA8ZW0+U2luY2UgQW50IDEuOC4wLjwvZW0+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgPC90cj4KLSAgPC90YWJsZT4KKzxoNSBpZD0icnNlbC5uYW1lIj5uYW1lPC9oNT4KKzxwPlNlbGVjdHMgcmVzb3VyY2VzIGJ5IG5hbWUuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgcGF0dGVybiB0byB0ZXN0IHVzaW5nIHN0YW5kYXJkIEFudCBwYXR0ZXJucy48L3RkPgorICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5yZWdleDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIGZpbGVzIHRvIHNlbGVjdC48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIG5hbWUgY29tcGFyaXNvbnMgYXJlIGNhc2Utc2Vuc2l0aXZlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmhhbmRsZWRpcnNlcDwvdGQ+CisgICAgPHRkPgorICAgICAgSWYgdGhpcyBpcyBzcGVjaWZpZWQsIHRoZSBtYXBwZXIgd2lsbCB0cmVhdCBhIFwgY2hhcmFjdGVyIGluIGEgcmVzb3VyY2UgbmFtZSBvciBuYW1lCisgICAgICBhdHRyaWJ1dGUgYXMgYSAvIGZvciB0aGUgcHVycG9zZXMgb2YgbWF0Y2hpbmcuICBUaGlzIGF0dHJpYnV0ZSBjYW4gYmUgPHE+dHJ1ZTwvcT4KKyAgICAgIG9yIDxxPmZhbHNlPC9xPi4KKyAgICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5mYWxzZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotICA8aDQ+PGEgbmFtZT0icnNlbC5leGlzdHMiPmV4aXN0czwvYT48L2g0PgotICA8cD5TZWxlY3RzIGV4aXN0aW5nIHJlc291cmNlcy48L3A+Cis8aDUgaWQ9InJzZWwuZXhpc3RzIj5leGlzdHM8L2g1PgorPHA+U2VsZWN0cyBleGlzdGluZyByZXNvdXJjZXMuPC9wPgogCi0gIDxoND48YSBuYW1lPSJyc2VsLmRhdGUiPmRhdGU8L2E+PC9oND4KLSAgPHA+U2VsZWN0cyByZXNvdXJjZXMgYnkgZGF0ZS48L3A+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWlsbGlzPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNvbXBhcmlzb24gZGF0ZS90aW1lIGluIG1zIHNpbmNlIEphbnVhcnkgMSwgMTk3MDwvdGQ+Ci0gICAgICA8dGQgcm93c3Bhbj0iMiIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPk9uZSBvZiB0aGVzZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmRhdGV0aW1lPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGZvcm1hdHRlZCBjb21wYXJpc29uIGRhdGUvdGltZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5TaW1wbGVEYXRlRm9ybWF0LWNvbXBhdGlibGUgcGF0dGVybgotICAgICAgICBmb3IgdXNlIHdpdGggdGhlIDxjb2RlPmRhdGV0aW1lPC9jb2RlPiBhdHRyaWJ1dGUgdXNpbmcgdGhlCi0gICAgICAgIGN1cnJlbnQgbG9jYWxlPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Ci0gICAgICAgIE5vLCBkZWZhdWx0IGlzICJNTS9kZC95eXl5IGhoOm1tIGEiIHVzaW5nIHRoZSBVUyBsb2NhbGU8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byB1c2Ugd2hlbgotICAgICAgICBjb21wYXJpbmcgZmlsZSBtb2RpZmljYXRpb24gdGltZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90Ci0gICAgICAgIGV2ZXJ5IGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8KLSAgICAgICAgdGhlIG1pbGxpc2Vjb25kIGxldmVsLjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBkZWZhdWx0IHZhcmllcyBieSBwbGF0Zm9ybToKLSAgICAgICAgRkFUIGZpbGVzeXN0ZW1zID0gMiBzZWM7IFVuaXggPSAxIHNlYzsgTlRGUyA9IDEgbXMuPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+d2hlbjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAiYmVmb3JlIiwgImFmdGVyIiwgImVxdWFsIjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJlcXVhbCI8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Cis8aDUgaWQ9InJzZWwuZGF0ZSI+ZGF0ZTwvaDU+Cis8cD5TZWxlY3RzIHJlc291cmNlcyBieSBkYXRlLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bWlsbGlzPC90ZD4KKyAgICA8dGQ+VGhlIGNvbXBhcmlzb24gZGF0ZS90aW1lIGluIG1zIHNpbmNlIEphbnVhcnkgMSwgMTk3MDwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjIiPk9uZSBvZiB0aGVzZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+ZGF0ZXRpbWU8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIGZvcm1hdHRlZCBjb21wYXJpc29uIGRhdGUvdGltZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgPHRkPlNpbXBsZURhdGVGb3JtYXQtY29tcGF0aWJsZSBwYXR0ZXJuIGZvciB1c2Ugd2l0aCB0aGUgPGNvZGU+ZGF0ZXRpbWU8L2NvZGU+IGF0dHJpYnV0ZQorICAgIHVzaW5nIHRoZSBjdXJyZW50IGxvY2FsZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPk1NL2RkL3l5eXkgaGg6bW0gYTwvcT4gdXNpbmcgdGhlIFVTIGxvY2FsZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Z3JhbnVsYXJpdHk8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gdXNlIHdoZW4gY29tcGFyaW5nIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWVzLiBUaGlzIGlzCisgICAgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5IGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlCisgICAgbWlsbGlzZWNvbmQgbGV2ZWwuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgdmFyaWVzIGJ5IHBsYXRmb3JtOiBGQVQgZmlsZXN5c3RlbXMgPSAyIHNlYzsgVW5peCA9IDEgc2VjOyBOVEZTID0gMSBtcy48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPndoZW48L3RkPgorICAgIDx0ZD5PbmUgb2YgPHE+YmVmb3JlPC9xPiwgPHE+YWZ0ZXI8L3E+LCA8cT5lcXVhbDwvcT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5lcXVhbDwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotICA8aDQ+PGEgbmFtZT0icnNlbC50eXBlIj50eXBlPC9hPjwvaDQ+Ci0gIDxwPlNlbGVjdHMgcmVzb3VyY2VzIGJ5IHR5cGUgKGZpbGUgb3IgZGlyZWN0b3J5KS48L3A+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk9uZSBvZiAiZmlsZSIsICJkaXIiLCAiYW55IiAoc2luY2UgQW50IDEuOCk8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Cis8aDUgaWQ9InJzZWwudHlwZSI+dHlwZTwvaDU+Cis8cD5TZWxlY3RzIHJlc291cmNlcyBieSB0eXBlIChmaWxlIG9yIGRpcmVjdG9yeSkuPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQ+T25lIG9mIDxxPmZpbGU8L3E+LCA8cT5kaXI8L3E+LCA8cT5hbnk8L3E+ICg8ZW0+c2luY2UgQW50IDEuODwvZW0+KTwvdGQ+CisgICAgPHRkPlllczwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgogCi0gIDxoND48YSBuYW1lPSJyc2VsLnNpemUiPnNpemU8L2E+PC9oND4KLSAgPHA+U2VsZWN0cyByZXNvdXJjZXMgYnkgc2l6ZS48L3A+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+c2l6ZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzaXplIHRvIGNvbXBhcmU8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ZZXM8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj53aGVuPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+T25lIG9mICJlcXVhbCIsICJlcSIsICJncmVhdGVyIiwgImd0IiwgImxlc3MiLCAibHQiLAotICAgICAgICAiZ2UiIChncmVhdGVyIG9yIGVxdWFsKSwgIm5lIiAobm90IGVxdWFsKSwgImxlIiAobGVzcyBvciBlcXVhbCk8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCAiZXF1YWwiPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgorPGg1IGlkPSJyc2VsLnNpemUiPnNpemU8L2g1PgorPHA+U2VsZWN0cyByZXNvdXJjZXMgYnkgc2l6ZS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPnNpemU8L3RkPgorICAgIDx0ZD5UaGUgc2l6ZSB0byBjb21wYXJlPC90ZD4KKyAgICA8dGQ+WWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aGVuPC90ZD4KKyAgICA8dGQ+T25lCisgICAgb2YgPHE+ZXF1YWw8L3E+LCA8cT5lcTwvcT4sIDxxPmdyZWF0ZXI8L3E+LCA8cT5ndDwvcT4sIDxxPmxlc3M8L3E+LCA8cT5sdDwvcT4sIDxxPmdlPC9xPgorICAgIChncmVhdGVyIG9yIGVxdWFsKSwgPHE+bmU8L3E+IChub3QgZXF1YWwpLCA8cT5sZTwvcT4gKGxlc3Mgb3IgZXF1YWwpPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZXF1YWw8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CiAKLSAgPGg0PjxhIG5hbWU9InJzZWwuaW5zdGFuY2VvZiI+aW5zdGFuY2VvZjwvYT48L2g0PgotICA8cD5TZWxlY3RzIHJlc291cmNlcyBieSB0eXBlLjwvcD4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzczwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjbGFzcyBvZiB3aGljaCB0aGUgcmVzb3VyY2UgbXVzdCBiZSBhbiBpbnN0YW5jZTwvdGQ+Ci0gICAgICA8dGQgcm93c3Bhbj0iMiIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPk9uZSBvZiB0aGVzZTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnR5cGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgQW50IHR5cGUgdGhhdCBtdXN0Ci0gICAgICAgIGJlIGFzc2lnbmFibGUgZnJvbSB0aGUgcmVzb3VyY2U8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj51cmk8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXJpIGluIHdoaWNoIDxpPnR5cGU8L2k+IG11c3QgYmUgZGVmaW5lZDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgorPGg1IGlkPSJyc2VsLmluc3RhbmNlb2YiPmluc3RhbmNlb2Y8L2g1PgorPHA+U2VsZWN0cyByZXNvdXJjZXMgYnkgdHlwZS48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNsYXNzPC90ZD4KKyAgICA8dGQ+VGhlIGNsYXNzIG9mIHdoaWNoIHRoZSByZXNvdXJjZSBtdXN0IGJlIGFuIGluc3RhbmNlPC90ZD4KKyAgICA8dGQgcm93c3Bhbj0iMiI+T25lIG9mIHRoZXNlPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD50eXBlPC90ZD4KKyAgICA8dGQgY2xhc3M9ImxlZnQiPlRoZSBBbnQgdHlwZSB0aGF0IG11c3QgYmUgYXNzaWduYWJsZSBmcm9tIHRoZSByZXNvdXJjZTwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+dXJpPC90ZD4KKyAgICA8dGQ+VGhlIFVSSSBpbiB3aGljaCA8dmFyPnR5cGU8L3Zhcj4gbXVzdCBiZSBkZWZpbmVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotICA8aDQ+PGEgbmFtZT0icnNlbC5hbmQiPmFuZDwvYT48L2g0PgotICA8cD5TZWxlY3RzIGEgcmVzb3VyY2UgaWYgaXQgaXMgc2VsZWN0ZWQgYnkgYWxsIG5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMuPC9wPgorPGg1IGlkPSJyc2VsLmFuZCI+YW5kPC9oNT4KKzxwPlNlbGVjdHMgYSByZXNvdXJjZSBpZiBpdCBpcyBzZWxlY3RlZCBieSBhbGwgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9ycy48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJzZWwub3IiPm9yPC9hPjwvaDQ+Ci0gIDxwPlNlbGVjdHMgYSByZXNvdXJjZSBpZiBpdCBpcyBzZWxlY3RlZAotICAgIGJ5IGF0IGxlYXN0IG9uZSBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3IuPC9wPgorPGg1IGlkPSJyc2VsLm9yIj5vcjwvaDU+Cis8cD5TZWxlY3RzIGEgcmVzb3VyY2UgaWYgaXQgaXMgc2VsZWN0ZWQgYnkgYXQgbGVhc3Qgb25lIG5lc3RlZCByZXNvdXJjZSBzZWxlY3Rvci48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJzZWwubm90Ij5ub3Q8L2E+PC9oND4KLSAgPHA+TmVnYXRlcyB0aGUgc2VsZWN0aW9uIHJlc3VsdCBvZiB0aGUgc2luZ2xlCi0gICAgbmVzdGVkIHJlc291cmNlIHNlbGVjdG9yIGFsbG93ZWQuPC9wPgorPGg1IGlkPSJyc2VsLm5vdCI+bm90PC9oNT4KKzxwPk5lZ2F0ZXMgdGhlIHNlbGVjdGlvbiByZXN1bHQgb2YgdGhlIHNpbmdsZSBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3IgYWxsb3dlZC48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJzZWwubm9uZSI+bm9uZTwvYT48L2g0PgotICA8cD5TZWxlY3RzIGEgcmVzb3VyY2UgaWYgaXQgaXMgc2VsZWN0ZWQKLSAgICBieSBubyBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvcD4KKzxoNSBpZD0icnNlbC5ub25lIj5ub25lPC9oNT4KKzxwPlNlbGVjdHMgYSByZXNvdXJjZSBpZiBpdCBpcyBzZWxlY3RlZCBieSBubyBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvcD4KIAotICA8aDQ+PGEgbmFtZT0icnNlbC5tYWpvcml0eSI+bWFqb3JpdHk8L2E+PC9oND4KLSAgPHA+U2VsZWN0cyBhIHJlc291cmNlIGlmIGl0IGlzIHNlbGVjdGVkCi0gICAgYnkgdGhlIG1ham9yaXR5IG9mIG5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMuPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmFsbG93dGllPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciBhIHRpZSAod2hlbiB0aGVyZSBpcyBhbiBldmVuIG51bWJlcgotICAgICAgICBvZiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzKSBpcyBjb25zaWRlcmVkIGEgbWFqb3JpdHk8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KKzxoNSBpZD0icnNlbC5tYWpvcml0eSI+bWFqb3JpdHk8L2g1PgorPHA+U2VsZWN0cyBhIHJlc291cmNlIGlmIGl0IGlzIHNlbGVjdGVkIGJ5IHRoZSBtYWpvcml0eSBvZiBuZXN0ZWQgcmVzb3VyY2Ugc2VsZWN0b3JzLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+YWxsb3d0aWU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIGEgdGllICh3aGVuIHRoZXJlIGlzIGFuIGV2ZW4gbnVtYmVyIG9mIG5lc3RlZCByZXNvdXJjZSBzZWxlY3RvcnMpIGlzIGNvbnNpZGVyZWQKKyAgICAgIGEgbWFqb3JpdHk8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgogCi0gIDxoND48YSBuYW1lPSJyc2VsLmNvbXBhcmUiPmNvbXBhcmU8L2E+PC9oND4KLSAgPHA+U2VsZWN0cyBhIHJlc291cmNlIGJhc2VkIG9uIGl0cyBjb21wYXJpc29uIHRvIG9uZSBvciBtb3JlICJjb250cm9sIgotICAgICByZXNvdXJjZXMgdXNpbmcgbmVzdGVkIDxhIGhyZWY9IiNyY21wIj5yZXNvdXJjZSBjb21wYXJhdG9yczwvYT4uPC9wPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5Db21wYXJpc29uICgiZXF1YWwiLyJlcSIsICJncmVhdGVyIi8iZ3QiLCAibGVzcyIvImx0IiwKLSAgICAgICAgImxlIiAobGVzcyBvciBlcXVhbCksICJnZSIgKGdyZWF0ZXIgb3IgZXF1YWwpLCAibmUiIChub3QgZXF1YWwpLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJlcXVhbCI8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5hZ2FpbnN0PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+UXVhbnRpZmllciAoImFsbCIvImVhY2giLyJldmVyeSIsICJhbnkiLyJzb21lIiwKLSAgICAgICAgKGV4YWN0bHkpICJvbmUiLCAibW9zdCIvIm1ham9yaXR5IiwgIm5vbmUiLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0ICJhbGwiPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KLSAgPHA+VGhlIHJlc291cmNlcyBhZ2FpbnN0IHdoaWNoIGNvbXBhcmlzb25zIHdpbGwgYmUgbWFkZSBtdXN0IGJlIHNwZWNpZmllZAotICAgIHVzaW5nIHRoZSBuZXN0ZWQgJmx0O2NvbnRyb2wmZ3Q7IGVsZW1lbnQsIHdoaWNoIGRlbm90ZXMgYQotICAgIDxhIGhyZWY9IiNyZXNvdXJjZXMiPnJlc291cmNlczwvYT4gY29sbGVjdGlvbi48L3A+Ci0gIDxoND5FeGFtcGxlczwvaDQ+Ci0gIDxwPkFzc3VtaW5nIHRoZSBuYW1lc3BhY2Ugc2V0dGluZ3MKLTxwcmU+PGNvZGU+ICByc2VsPSJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycyIKLSAgcmNtcD0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycyIKLTwvY29kZT48L3ByZT48L3A+Cis8aDUgaWQ9InJzZWwuY29tcGFyZSI+Y29tcGFyZTwvaDU+Cis8cD5TZWxlY3RzIGEgcmVzb3VyY2UgYmFzZWQgb24gaXRzIGNvbXBhcmlzb24gdG8gb25lIG9yIG1vcmUgImNvbnRyb2wiIHJlc291cmNlcyB1c2luZworbmVzdGVkIDxhIGhyZWY9IiNyY21wIj5yZXNvdXJjZSBjb21wYXJhdG9yczwvYT4uPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD53aGVuPC90ZD4KKyAgICA8dGQ+Q29tcGFyaXNvbgorICAgICg8cT5lcXVhbDwvcT4vPHE+ZXE8L3E+LCA8cT5ncmVhdGVyPC9xPi88cT5ndDwvcT4sIDxxPmxlc3M8L3E+LzxxPmx0PC9xPiwgPHE+bGU8L3E+IChsZXNzIG9yCisgICAgZXF1YWwpLCA8cT5nZTwvcT4gKGdyZWF0ZXIgb3IgZXF1YWwpLCA8cT5uZTwvcT4gKG5vdCBlcXVhbCkuPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZXF1YWw8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5hZ2FpbnN0PC90ZD4KKyAgICA8dGQ+UXVhbnRpZmllciAoPHE+YWxsPC9xPi88cT5lYWNoPC9xPi88cT5ldmVyeTwvcT4sIDxxPmFueTwvcT4vPHE+c29tZTwvcT4sCisgICAgKGV4YWN0bHkpIDxxPm9uZTwvcT4sIDxxPm1vc3Q8L3E+LzxxPm1ham9yaXR5PC9xPiwgPHE+bm9uZTwvcT4uPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+YWxsPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg2PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDY+Cis8cD5UaGUgcmVzb3VyY2VzIGFnYWluc3Qgd2hpY2ggY29tcGFyaXNvbnMgd2lsbCBiZSBtYWRlIG11c3QgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBuZXN0ZWQKKyZsdDtjb250cm9sJmd0OyBlbGVtZW50LCB3aGljaCBkZW5vdGVzIGEgPGEgaHJlZj0iI3Jlc291cmNlcyI+cmVzb3VyY2VzPC9hPiBjb2xsZWN0aW9uLjwvcD4KKzxoNj5FeGFtcGxlczwvaDY+Cis8cD5Bc3N1bWluZyB0aGUgbmFtZXNwYWNlIHNldHRpbmdzPC9wPgorPHByZT4KK3JzZWw9ImFudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzIgorcmNtcD0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycyI8L3ByZT4KICAgPHByZT4KICZsdDtyZXN0cmljdCZndDsKLSAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiIGluY2x1ZGVzPSJhLGIsYyxkLGUsZixnIiAvJmd0OworICAmbHQ7ZmlsZXNldCBkaXI9InNyYyIgaW5jbHVkZXM9ImEsYixjLGQsZSxmLGciLyZndDsKICAgJmx0O3JzZWw6Y29tcGFyZSB3aGVuPSJsZSIgYWdhaW5zdD0iYWxsIiZndDsKICAgICAmbHQ7Y29udHJvbCZndDsKLSAgICAgICZsdDtyZXNvdXJjZSBuYW1lPSJkIiAvJmd0OworICAgICAgJmx0O3Jlc291cmNlIG5hbWU9ImQiLyZndDsKICAgICAmbHQ7L2NvbnRyb2wmZ3Q7Ci0gICAgJmx0O3JjbXA6bmFtZSAvJmd0OworICAgICZsdDtyY21wOm5hbWUvJmd0OwogICAmbHQ7L3JzZWw6Y29tcGFyZSZndDsKLSZsdDsvcmVzdHJpY3QmZ3Q7Ci0gIDwvcHJlPgotICA8cD5TZWxlY3RzIGZpbGVzIGEsIGIsIGMsIGFuZCBkLjwvcD4KLSAgPHByZT4KLSAgICAmbHQ7cHJvamVjdCByc2VsPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7bWFjcm9kZWYgbmFtZT0mcXVvdDtjb3B5RnJvbVBhdGgmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7dG9kaXImcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSZxdW90O3JlZmlkJnF1b3Q7LyZndDsKLSAgICAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9JnF1b3Q7bmVzdGVkLXJlc291cmNlLXNlbGVjdG9ycyZxdW90OyBvcHRpb25hbD0mcXVvdDt5ZXMmcXVvdDsgaW1wbGljaXQ9JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7bWtkaXIgZGlyPSZxdW90O0B7dG9kaXJ9JnF1b3Q7IHRhc2tuYW1lPSZxdW90O2NvcHlGcm9tUGF0aCZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2NvcHkgdG9kaXI9JnF1b3Q7QHt0b2Rpcn0mcXVvdDsgdGFza25hbWU9JnF1b3Q7Y29weUZyb21QYXRoJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAgICAgICAmbHQ7cmVzdHJpY3QmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0mcXVvdDtAe3JlZmlkfSZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cnNlbDpvciZndDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7bmVzdGVkLXJlc291cmNlLXNlbGVjdG9ycy8mZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAmbHQ7L3JzZWw6b3ImZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDsvcmVzdHJpY3QmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7L2NvcHkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3NlcXVlbnRpYWwmZ3Q7Ci0gICAgICAgICZsdDsvbWFjcm9kZWYmZ3Q7Ci0gICAgICAgICZsdDtjb3B5RnJvbVBhdGggcmVmaWQ9JnF1b3Q7Y2xhc3NwYXRoJnF1b3Q7IHRvZGlyPSZxdW90O3RvZGlyJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3JzZWw6bmFtZSBuYW1lPSZxdW90O2xvZzRqLnByb3BlcnRpZXMmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0O3JzZWw6bmFtZSBuYW1lPSZxdW90O2RlZmF1bHQucHJvcGVydGllcyZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDsvY29weUZyb21QYXRoJmd0OwotICAgICAmbHQ7L3Byb2plY3QmZ3Q7Ci0gIDwvcHJlPgotICA8cD5DcmVhdGVzIHRoZSA8dHQ+dG9kaXI8L3R0PiBkaXJlY3RvcnkgYW5kIGNvcGllcyAoaWYgcHJlc2VudCkgdGhlCi0gICAgIGZpbGVzIDx0dD5sb2c0ai5wcm9wZXJ0aWVzPC90dD4gYW5kIDx0dD5kZWZhdWx0LnByb3BlcnRpZXM8L3R0PgotICAgICBmcm9tIHRoZSBDbGFzc3BhdGggKGFscmVhZHkgdXNlZCB3aGlsZSBjb21waWxpbmcpLgotICA8L3A+CismbHQ7L3Jlc3RyaWN0Jmd0OzwvcHJlPgorPHA+U2VsZWN0cyBmaWxlcyA8c2FtcD5hPC9zYW1wPiwgPHNhbXA+Yjwvc2FtcD4sIDxzYW1wPmM8L3NhbXA+LCBhbmQgPHNhbXA+ZDwvc2FtcD4uPC9wPgorPHByZT4KKyZsdDtwcm9qZWN0IHJzZWw9JnF1b3Q7YW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMmcXVvdDsmZ3Q7CisgICAgJmx0O21hY3JvZGVmIG5hbWU9JnF1b3Q7Y29weUZyb21QYXRoJnF1b3Q7Jmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7dG9kaXImcXVvdDsvJmd0OworICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9JnF1b3Q7cmVmaWQmcXVvdDsvJmd0OworICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSZxdW90O25lc3RlZC1yZXNvdXJjZS1zZWxlY3RvcnMmcXVvdDsgb3B0aW9uYWw9JnF1b3Q7eWVzJnF1b3Q7IGltcGxpY2l0PSZxdW90O3RydWUmcXVvdDsvJmd0OworICAgICAgICAmbHQ7c2VxdWVudGlhbCZndDsKKyAgICAgICAgICAgICZsdDtta2RpciBkaXI9JnF1b3Q7QHt0b2Rpcn0mcXVvdDsgdGFza25hbWU9JnF1b3Q7Y29weUZyb21QYXRoJnF1b3Q7LyZndDsKKyAgICAgICAgICAgICZsdDtjb3B5IHRvZGlyPSZxdW90O0B7dG9kaXJ9JnF1b3Q7IHRhc2tuYW1lPSZxdW90O2NvcHlGcm9tUGF0aCZxdW90OyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzdHJpY3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtwYXRoIHJlZmlkPSZxdW90O0B7cmVmaWR9JnF1b3Q7LyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JzZWw6b3ImZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7bmVzdGVkLXJlc291cmNlLXNlbGVjdG9ycy8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDsvcnNlbDpvciZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3RyaWN0Jmd0OworICAgICAgICAgICAgICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKKyAgICAgICAgICAgICZsdDsvY29weSZndDsKKyAgICAgICAgJmx0Oy9zZXF1ZW50aWFsJmd0OworICAgICZsdDsvbWFjcm9kZWYmZ3Q7CisgICAgJmx0O2NvcHlGcm9tUGF0aCByZWZpZD0mcXVvdDtjbGFzc3BhdGgmcXVvdDsgdG9kaXI9JnF1b3Q7dG9kaXImcXVvdDsmZ3Q7CisgICAgICAgICZsdDtyc2VsOm5hbWUgbmFtZT0mcXVvdDtsb2c0ai5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsKKyAgICAgICAgJmx0O3JzZWw6bmFtZSBuYW1lPSZxdW90O2RlZmF1bHQucHJvcGVydGllcyZxdW90Oy8mZ3Q7CisgICAgJmx0Oy9jb3B5RnJvbVBhdGgmZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+Cis8cD5DcmVhdGVzIHRoZSA8c2FtcD50b2Rpcjwvc2FtcD4gZGlyZWN0b3J5IGFuZCBjb3BpZXMgKGlmIHByZXNlbnQpIHRoZQorZmlsZXMgPHNhbXA+bG9nNGoucHJvcGVydGllczwvc2FtcD4gYW5kIDxzYW1wPmRlZmF1bHQucHJvcGVydGllczwvc2FtcD4gZnJvbSB0aGUgY2xhc3NwYXRoCisoYWxyZWFkeSB1c2VkIHdoaWxlIGNvbXBpbGluZykuPC9wPgogCi0gIDxwcmU+Ci0gICZsdDtwcm9qZWN0Jmd0OwotICAgICAgJmx0O2ZpbGVsaXN0IGlkPSZxdW90O2FsbGZpbGVzJnF1b3Q7IGRpcj0mcXVvdDske2FudC5ob21lfS9iaW4mcXVvdDsgZmlsZXM9JnF1b3Q7YW50LmNtZCxmb28udHh0LGFudC5iYXQsYmFyLnR4dCxhbnQmcXVvdDsvJmd0OwotICAgICAgJmx0O3Jlc3RyaWN0IGlkPSZxdW90O21pc3NpbmdmaWxlcyZxdW90OyZndDsKLSAgICAgICAgICAmbHQ7ZmlsZWxpc3QgcmVmaWQ9JnF1b3Q7YWxsZmlsZXMmcXVvdDsvJmd0OwotICAgICAgICAgICZsdDtyc2VsOm5vdCB4bWxuczpyc2VsPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzJnF1b3Q7Jmd0OwotICAgICAgICAgICAgICAmbHQ7cnNlbDpleGlzdHMvJmd0OwotICAgICAgICAgICZsdDsvcnNlbDpub3QmZ3Q7Ci0gICAgICAmbHQ7L3Jlc3RyaWN0Jmd0OwotICAgICAgJmx0O2VjaG8mZ3Q7VGhlc2UgZmlsZXMgYXJlIG1pc3NlZDogJHt0b1N0cmluZzptaXNzaW5nZmlsZXN9Jmx0Oy9lY2hvJmd0OwotICAmbHQ7L3Byb2plY3QmZ3Q7Ci0gIDwvcHJlPgotICA8cD5UaGUgcmVzb3VyY2UgY29sbGVjdGlvbiA8aT5hbGxmaWxlczwvaT4gZGVmaW5lcyBhIGxpc3Qgb2YgZmlsZXMgd2hpY2ggYXJlIGV4cGVjdGVkLiBUaGUgcmVzdHJpY3QKLSAgPGk+bWlzc2luZ2ZpbGVzPC9pPiB1c2VzIHRoZSA8dHQ+Jmx0O25vdCZndDsmbHQ7ZXhpc3RzJmd0OzwvdHQ+IHNlbGVjdG9yIGZvciBnZXR0aW5nIGFsbCBmaWxlcwotICB3aGljaCBhcmUgbm90IHByZXNlbnQuIEZpbmFsbHkgd2UgdXNlIHRoZSA8aT50b1N0cmluZzo8L2k+IDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aHNob3J0Y3V0Ij5wYXRoc2hvcnRjdXQ8L2E+IGZvcgotICBnZXR0aW5nIHRoZW0gaW4gYSByZWFkYWJsZSBmb3JtOiA8dHQ+W2VjaG9dIFRoZXNlIGZpbGVzIGFyZSBtaXNzZWQ6IC4uLi5mb28udHh0Oy4uLi5iYXIudHh0PC90dD48L3A+Cis8cHJlPgorJmx0O3Byb2plY3QmZ3Q7CisgICAgJmx0O2ZpbGVsaXN0IGlkPSZxdW90O2FsbGZpbGVzJnF1b3Q7IGRpcj0mcXVvdDske2FudC5ob21lfS9iaW4mcXVvdDsgZmlsZXM9JnF1b3Q7YW50LmNtZCxmb28udHh0LGFudC5iYXQsYmFyLnR4dCxhbnQmcXVvdDsvJmd0OworICAgICZsdDtyZXN0cmljdCBpZD0mcXVvdDttaXNzaW5nZmlsZXMmcXVvdDsmZ3Q7CisgICAgICAgICZsdDtmaWxlbGlzdCByZWZpZD0mcXVvdDthbGxmaWxlcyZxdW90Oy8mZ3Q7CisgICAgICAgICZsdDtyc2VsOm5vdCB4bWxuczpyc2VsPSZxdW90O2FudGxpYjpvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzJnF1b3Q7Jmd0OworICAgICAgICAgICAgJmx0O3JzZWw6ZXhpc3RzLyZndDsKKyAgICAgICAgJmx0Oy9yc2VsOm5vdCZndDsKKyAgICAmbHQ7L3Jlc3RyaWN0Jmd0OworICAgICZsdDtlY2hvJmd0O1RoZXNlIGZpbGVzIGFyZSBtaXNzZWQ6ICR7dG9TdHJpbmc6bWlzc2luZ2ZpbGVzfSZsdDsvZWNobyZndDsKKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KKzxwPlRoZSByZXNvdXJjZSBjb2xsZWN0aW9uIDxxPmFsbGZpbGVzPC9xPiBkZWZpbmVzIGEgbGlzdCBvZiBmaWxlcyB3aGljaCBhcmUgZXhwZWN0ZWQuIFRoZQorcmVzdHJpY3QgPHE+bWlzc2luZ2ZpbGVzPC9xPiB1c2VzIHRoZSA8Y29kZT4mbHQ7bm90Jmd0OyZsdDtleGlzdHMmZ3Q7PC9jb2RlPiBzZWxlY3RvciBmb3IKK2dldHRpbmcgYWxsIGZpbGVzIHdoaWNoIGFyZSBub3QgcHJlc2VudC4gRmluYWxseSB3ZSB1c2UKK3RoZSA8Y29kZT50b1N0cmluZzo8L2NvZGU+IDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aHNob3J0Y3V0Ij5wYXRoc2hvcnRjdXQ8L2E+IGZvciBnZXR0aW5nCit0aGVtIGluIGEgcmVhZGFibGUgZm9ybTogPGNvZGU+W2VjaG9dIFRoZXNlIGZpbGVzIGFyZSBtaXNzZWQ6IC4uLi5mb28udHh0Oy4uLi5iYXIudHh0PC9jb2RlPjwvcD4KIAotPC9ibG9ja3F1b3RlPgorPGg0IGlkPSJzb3J0Ij5zb3J0PC9oND4KIAotPGg0PjxhIG5hbWU9InNvcnQiPnNvcnQ8L2E+PC9oND4KKzxwPlNvcnRzIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSByZXNvdXJjZXMnIG5hdHVyYWwgb3JkZXIsIG9yIGJ5IG9uZSBvcgorbW9yZSBuZXN0ZWQgPGEgaHJlZj0iI3JjbXAiPnJlc291cmNlIGNvbXBhcmF0b3JzPC9hPjo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhY2hlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+Cis8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KKzxwPlRoZSBzb3J0IGNhbiBiZSBjb250cm9sbGVkIGFuZCBjdXN0b21pemVkIGJ5IHNwZWNpZnlpbmcgb25lIG9yIG1vcmUgcmVzb3VyY2UKK2NvbXBhcmF0b3JzLiBSZXNvdXJjZXMgY2FuIGJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gbXVsdGlwbGUgY3JpdGVyaWE7IHRoZSBmaXJzdCBzcGVjaWZpZWQgaXMgdGhlCisib3V0ZXJtb3N0Iiwgd2hpbGUgdGhlIGxhc3Qgc3BlY2lmaWVkIGlzIHRoZSAiaW5uZXJtb3N0Ii4gU2V2ZXJhbCBidWlsdC1pbiByZXNvdXJjZSBjb21wYXJhdG9ycworYXJlIGF2YWlsYWJsZSBpbiB0aGUKK2ludGVybmFsIDxhIGhyZWY9ImFudGxpYi5odG1sIj5hbnRsaWI8L2E+IDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczwvY29kZT46PC9wPgorPGg1IGlkPSJyY21wIj5SZXNvdXJjZSBDb21wYXJhdG9yczwvaDU+Cis8dWw+CisgIDxsaT48YSBocmVmPSIjcmNtcC5uYW1lIj5uYW1lPC9hPiZtZGFzaDtzb3J0IHJlc291cmNlcyBieSBuYW1lPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyY21wLmV4aXN0cyI+ZXhpc3RzPC9hPiZtZGFzaDtzb3J0IHJlc291cmNlcyBieSBleGlzdGVuY2U8L2xpPgorICA8bGk+PGEgaHJlZj0iI3JjbXAuZGF0ZSI+ZGF0ZTwvYT4mbWRhc2g7c29ydCByZXNvdXJjZXMgYnkgZGF0ZTwvbGk+CisgIDxsaT48YSBocmVmPSIjcmNtcC50eXBlIj50eXBlPC9hPiZtZGFzaDtzb3J0IHJlc291cmNlcyBieSB0eXBlPC9saT4KKyAgPGxpPjxhIGhyZWY9IiNyY21wLnNpemUiPnNpemU8L2E+Jm1kYXNoO3NvcnQgcmVzb3VyY2VzIGJ5IHNpemU8L2xpPgorICA8bGk+PGEgaHJlZj0iI3JjbXAuY29udGVudCI+Y29udGVudDwvYT4mbWRhc2g7c29ydCByZXNvdXJjZXMgYnkgY29udGVudDwvbGk+CisgIDxsaT48YSBocmVmPSIjcmNtcC5yZXZlcnNlIj5yZXZlcnNlPC9hPiZtZGFzaDtyZXZlcnNlIHRoZSBuYXR1cmFsIHNvcnQgb3JkZXIsIG9yIHRoYXQgb2YgYQorICAgIHNpbmdsZSBuZXN0ZWQgcmVzb3VyY2UgY29tcGFyYXRvcjwvbGk+Cis8L3VsPgogCi08cD5Tb3J0cyBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGFjY29yZGluZyB0byB0aGUgcmVzb3VyY2VzJwotICAgbmF0dXJhbCBvcmRlciwgb3IgYnkgb25lIG9yIG1vcmUgbmVzdGVkIDxhIGhyZWY9IiNyY21wIj5yZXNvdXJjZQotICAgY29tcGFyYXRvcnM8L2E+OjwvcD4KLTxibG9ja3F1b3RlPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcKLSAgICAgICAgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGg0PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDQ+Ci0gIDxwPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9wPgotICA8cD5UaGUgc29ydCBjYW4gYmUgY29udHJvbGxlZCBhbmQgY3VzdG9taXplZCBieSBzcGVjaWZ5aW5nIG9uZSBvciBtb3JlCi0gICAgcmVzb3VyY2UgY29tcGFyYXRvcnMuIFJlc291cmNlcyBjYW4gYmUgc29ydGVkIGFjY29yZGluZyB0byBtdWx0aXBsZQotICAgIGNyaXRlcmlhOyB0aGUgZmlyc3Qgc3BlY2lmaWVkIGlzIHRoZSAib3V0ZXJtb3N0Iiwgd2hpbGUgdGhlIGxhc3QKLSAgICBzcGVjaWZpZWQgaXMgdGhlICJpbm5lcm1vc3QiLiBTZXZlcmFsIGJ1aWx0LWluIHJlc291cmNlIGNvbXBhcmF0b3JzCi0gICAgYXJlIGF2YWlsYWJsZSBpbiB0aGUgaW50ZXJuYWwgPGEgaHJlZj0iYW50bGliLmh0bWwiPmFudGxpYjwvYT4KLSAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM8L2NvZGU+OgotICA8L3A+Ci0gIDxoND48YSBuYW1lPSJyY21wIj5SZXNvdXJjZSBDb21wYXJhdG9yczo8L2E+PC9oND4KLSAgPHVsPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5uYW1lIj5uYW1lPC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IG5hbWU8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5leGlzdHMiPmV4aXN0czwvYT4gLSBzb3J0IHJlc291cmNlcyBieSBleGlzdGVuY2U8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5kYXRlIj5kYXRlPC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IGRhdGU8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC50eXBlIj50eXBlPC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IHR5cGU8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5zaXplIj5zaXplPC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IHNpemU8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5jb250ZW50Ij5jb250ZW50PC9hPiAtIHNvcnQgcmVzb3VyY2VzIGJ5IGNvbnRlbnQ8L2xpPgotICAgIDxsaT48YSBocmVmPSIjcmNtcC5yZXZlcnNlIj5yZXZlcnNlPC9hPiAtIHJldmVyc2UgdGhlIG5hdHVyYWwgc29ydCBvcmRlciwKLSAgICAgIG9yIHRoYXQgb2YgYSBzaW5nbGUgbmVzdGVkIHJlc291cmNlIGNvbXBhcmF0b3I8L2xpPgotICA8L3VsPgorPGg2IGlkPSJyY21wLm5hbWUiPm5hbWU8L2g2PgorPHA+U29ydCByZXNvdXJjZXMgYnkgbmFtZS48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJjbXAubmFtZSI+bmFtZTwvYT48L2g0PgotICA8cD5Tb3J0IHJlc291cmNlcyBieSBuYW1lLjwvcD4KKzxoNiBpZD0icmNtcC5leGlzdHMiPmV4aXN0czwvaDY+Cis8cD5Tb3J0IHJlc291cmNlcyBieSBleGlzdGVuY2UuICBOb3QgZXhpc3RpbmcgaXMgY29uc2lkZXJlZCAibGVzcyB0aGFuIiBleGlzdGluZy48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJjbXAuZXhpc3RzIj5leGlzdHM8L2E+PC9oND4KLSAgPHA+U29ydCByZXNvdXJjZXMgYnkgZXhpc3RlbmNlLgotICAgIE5vdCBleGlzdGluZyBpcyBjb25zaWRlcmVkICJsZXNzIHRoYW4iIGV4aXN0aW5nLjwvcD4KKzxoNiBpZD0icmNtcC5kYXRlIj5kYXRlPC9oNj4KKzxwPlNvcnQgcmVzb3VyY2VzIGJ5IGRhdGUuPC9wPgogCi0gIDxoND48YSBuYW1lPSJyY21wLmRhdGUiPmRhdGU8L2E+PC9oND4KLSAgPHA+U29ydCByZXNvdXJjZXMgYnkgZGF0ZS48L3A+Cis8aDYgaWQ9InJjbXAudHlwZSI+dHlwZTwvaDY+Cis8cD5Tb3J0IHJlc291cmNlcyBieSB0eXBlIChmaWxlIG9yIGRpcmVjdG9yeSkuICBCZWNhdXNlIGRpcmVjdG9yaWVzIGNvbnRhaW4gZmlsZXMsIHRoZXkgYXJlCitjb25zaWRlcmVkICJncmVhdGVyIi48L3A+CiAKLSAgPGg0PjxhIG5hbWU9InJjbXAudHlwZSI+dHlwZTwvYT48L2g0PgotICA8cD5Tb3J0IHJlc291cmNlcyBieSB0eXBlIChmaWxlIG9yIGRpcmVjdG9yeSkuCi0gICAgQmVjYXVzZSBkaXJlY3RvcmllcyBjb250YWluIGZpbGVzLCB0aGV5IGFyZSBjb25zaWRlcmVkICJncmVhdGVyIi48L3A+Cis8aDYgaWQ9InJjbXAuc2l6ZSI+c2l6ZTwvaDY+Cis8cD5Tb3J0IHJlc291cmNlcyBieSBzaXplLjwvcD4KIAotICA8aDQ+PGEgbmFtZT0icmNtcC5zaXplIj5zaXplPC9hPjwvaDQ+Ci0gIDxwPlNvcnQgcmVzb3VyY2VzIGJ5IHNpemUuPC9wPgorPGg2IGlkPSJyY21wLmNvbnRlbnQiPmNvbnRlbnQ8L2g2PgorPHA+U29ydCByZXNvdXJjZXMgYnkgY29udGVudC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmJpbmFyeTwvdGQ+CisgICAgPHRkPldoZXRoZXIgY29udGVudCBzaG91bGQgYmUgY29tcGFyZWQgaW4gYmluYXJ5IG1vZGUuICBJZiA8cT5mYWxzZTwvcT4sIGNvbnRlbnQgd2lsbCBiZQorICAgIGNvbXBhcmVkIHdpdGhvdXQgcmVnYXJkIHRvIHBsYXRmb3JtLXNwZWNpZmljIGxpbmUtZW5kaW5nIGNvbnZlbnRpb25zLjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CiAKLSAgPGg0PjxhIG5hbWU9InJjbXAuY29udGVudCI+Y29udGVudDwvYT48L2g0PgotICA8cD5Tb3J0IHJlc291cmNlcyBieSBjb250ZW50LjwvcD4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5iaW5hcnk8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGNvbnRlbnQgc2hvdWxkIGJlIGNvbXBhcmVkIGluIGJpbmFyeSBtb2RlLgotICAgICAgICBJZiA8aT5mYWxzZTxpPiwgY29udGVudCB3aWxsIGJlIGNvbXBhcmVkIHdpdGhvdXQgcmVnYXJkIHRvCi0gICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGxpbmUtZW5kaW5nIGNvbnZlbnRpb25zLjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgorPGg2IGlkPSJyY21wLnJldmVyc2UiPnJldmVyc2U8L2g2PgorPHA+UmV2ZXJzZSB0aGUgbmF0dXJhbCBzb3J0IG9yZGVyLCBvciB0aGF0IG9mIGEgc2luZ2xlIG5lc3RlZCBjb21wYXJhdG9yLjwvcD4KIAotICA8aDQ+PGEgbmFtZT0icmNtcC5yZXZlcnNlIj5yZXZlcnNlPC9hPjwvaDQ+Ci0gIDxwPlJldmVyc2UgdGhlIG5hdHVyYWwgc29ydCBvcmRlciwgb3IgdGhhdCBvZiBhIHNpbmdsZSBuZXN0ZWQgY29tcGFyYXRvci48L3A+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4KKyZsdDtwcm9wZXJ0eSBuYW1lPSZxdW90O2VvbCZxdW90OyB2YWx1ZT0mcXVvdDske2xpbmUuc2VwYXJhdG9yfSZxdW90Oy8mZ3Q7CismbHQ7cGF0aGNvbnZlcnQgcHJvcGVydHk9JnF1b3Q7c29ydGVkJnF1b3Q7IHBhdGhzZXA9JnF1b3Q7JHtlb2x9JnF1b3Q7Jmd0OworICAmbHQ7c29ydCZndDsKKyAgICAmbHQ7dG9rZW5zJmd0OworICAgICAgJmx0O3N0cmluZyB2YWx1ZT0mcXVvdDtmb28gYmFyIGV0YyBiYXomcXVvdDsvJmd0OworICAgICAgJmx0O3N0cmluZ3Rva2VuaXplci8mZ3Q7CisgICAgJmx0Oy90b2tlbnMmZ3Q7CisgICZsdDsvc29ydCZndDsKKyZsdDsvcGF0aGNvbnZlcnQmZ3Q7PC9wcmU+Cis8cD5UaGUgcmVzb3VyY2Ugb2YgdHlwZSBzdHJpbmcgPHE+Zm9vIGJhciBldGMgYmF6PC9xPiBpcyBzcGxpdCBpbnRvIGZvdXIgdG9rZW5zIGJ5Cit0aGUgPGNvZGU+c3RyaW5ndG9rZW5pemVyPC9jb2RlPi4gVGhlc2UgdG9rZW5zIGFyZSBzb3J0ZWQgYW5kIHRoZXJlIDxjb2RlPnNvcnRlZDwvY29kZT4gZ2V0cyB0aGUKK3ZhbHVlIG9mIDxxPmJhciBiYXogZXRjIGZvbzwvcT4uPC9wPgogCi0gIDxoND5FeGFtcGxlczwvaDQ+Ci0gIDxwcmU+Ci0gICAgJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7ZW9sJnF1b3Q7IHZhbHVlPSZxdW90OyR7bGluZS5zZXBhcmF0b3J9JnF1b3Q7IC8mZ3Q7Ci0gICAgJmx0O3BhdGhjb252ZXJ0IHByb3BlcnR5PSZxdW90O3NvcnRlZCZxdW90OyBwYXRoc2VwPSZxdW90OyR7ZW9sfSZxdW90OyZndDsKLSAgICAgICZsdDtzb3J0Jmd0OwotICAgICAgICAmbHQ7dG9rZW5zJmd0OwotICAgICAgICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7Zm9vIGJhciBldGMgYmF6JnF1b3Q7IC8mZ3Q7Ci0gICAgICAgICAgJmx0O3N0cmluZ3Rva2VuaXplciAvJmd0OwotICAgICAgICAmbHQ7L3Rva2VucyZndDsKLSAgICAgICZsdDsvc29ydCZndDsKLSAgICAmbHQ7L3BhdGhjb252ZXJ0Jmd0OzwvcHJlPgotICA8cD5UaGUgcmVzb3VyY2Ugb2YgdHlwZSBzdHJpbmcgJnF1b3Q7Zm9vIGJhciBldGMgYmF6JnF1b3Q7IGlzIHNwbGl0IGludG8gZm91ciB0b2tlbnMgYnkgCi0gIHRoZSBzdHJpbmd0b2tlbml6ZXIuIFRoZXNlIHRva2VucyBhcmUgc29ydGVkIGFuZCB0aGVyZSA8aT5zb3J0ZWQ8L2k+IGdldHMgdGhlIHZhbHVlCi0gIG9mICZxdW90O2JhciBiYXogZXRjIGZvbyZxdW90Oy48L3A+Ci0gIAotICA8cHJlPgotICAgICZsdDtzb3J0Jmd0OwotICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2ZvbyZxdW90OyAvJmd0OwotICAgICAgJmx0O3JldmVyc2UgeG1sbnM9JnF1b3Q7YW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycyZxdW90OyZndDsKLSAgICAgICAgJmx0O2RhdGUgLyZndDsKLSAgICAgICZsdDsvcmV2ZXJzZSZndDsKLSAgICAmbHQ7L3NvcnQmZ3Q7PC9wcmU+Ci0gIDxwPlRoaXMgdGFrZXMgYWxsIGZpbGVzIGZyb20gPGk+Zm9vPC9pPgotICAgICBhbmQgc29ydHMgdGhlbSBieSBtb2RpZmljYXRpb24gZGF0ZSBpbiByZXZlcnNlIG9yZGVyLgotICAgICBCZWNhdXNlIHRoZSByZXNvdXJjZSBjb21wYXJhdG9ycyB1c2VkICg8Y29kZT4mbHQ7cmV2ZXJzZSZndDs8L2NvZGU+Ci0gICAgIGFuZCA8Y29kZT4mbHQ7ZGF0ZSZndDs8L2NvZGU+KSBhcmUgaW4gYW4gaW50ZXJuYWwgYW50bGliCi0gICAgIHRoZWlyIG5hbWVzcGFjZSBtdXN0IGJlIHNldCBleHBsaWNpdGx5LgotICA8L3A+Cis8cHJlPgorJmx0O3NvcnQmZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtmb28mcXVvdDsvJmd0OworICAmbHQ7cmV2ZXJzZSB4bWxucz0mcXVvdDthbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzJnF1b3Q7Jmd0OworICAgICZsdDtkYXRlLyZndDsKKyAgJmx0Oy9yZXZlcnNlJmd0OworJmx0Oy9zb3J0Jmd0OzwvcHJlPgorPHA+VGhpcyB0YWtlcyBhbGwgZmlsZXMgZnJvbSA8c2FtcD5mb288L3NhbXA+IGFuZCBzb3J0cyB0aGVtIGJ5IG1vZGlmaWNhdGlvbiBkYXRlIGluIHJldmVyc2UKK29yZGVyLiAgQmVjYXVzZSB0aGUgcmVzb3VyY2UgY29tcGFyYXRvcnMgdXNlZCAoPGNvZGU+Jmx0O3JldmVyc2UmZ3Q7PC9jb2RlPgorYW5kIDxjb2RlPiZsdDtkYXRlJmd0OzwvY29kZT4pIGFyZSBpbiBhbiBpbnRlcm5hbCBhbnRsaWIgdGhlaXIgbmFtZXNwYWNlIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkuCis8L3A+CiAKLTwvYmxvY2txdW90ZT4KKzxoNCBpZD0iZmlyc3QiPmZpcnN0PC9oND4KKzxwPkluY2x1ZGVzIHRoZSBmaXJzdCA8dmFyPmNvdW50PC92YXI+IHJlc291cmNlcyBmcm9tIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uICBUaGlzIGNhbiBiZQordXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8YSBocmVmPSIjc29ydCI+c29ydDwvYT4gY29sbGVjdGlvbiwgZm9yIGV4YW1wbGUsIHRvIHNlbGVjdCB0aGUKK2ZpcnN0IGZldyBvbGRlc3QsIGxhcmdlc3QsIGV0Yy4gcmVzb3VyY2VzIGZyb20gYSBsYXJnZXIgY29sbGVjdGlvbi48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvdW50PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gaW5jbHVkZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPjE8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoNT5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g1PgorPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+CiAKLTxoND48YSBuYW1lPSJmaXJzdCI+Zmlyc3Q8L2E+PC9oND4KLTxwPkluY2x1ZGVzIHRoZSBmaXJzdCA8aT5jb3VudDwvaT4gcmVzb3VyY2VzIGZyb20gYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbi4KLVRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPGEgaHJlZj0iI3NvcnQiPnNvcnQ8L2E+IGNvbGxlY3Rpb24sCi1mb3IgZXhhbXBsZSwgdG8gc2VsZWN0IHRoZSBmaXJzdCBmZXcgb2xkZXN0LCBsYXJnZXN0LCBldGMuIHJlc291cmNlcyBmcm9tIGEKLWxhcmdlciBjb2xsZWN0aW9uLjwvcD4KLTxibG9ja3F1b3RlPgotICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNvdW50PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gaW5jbHVkZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDE8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nCi0gICAgICAgIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgotICA8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KLTwvYmxvY2txdW90ZT4KKzxoNCBpZD0ibGFzdCI+bGFzdDwvaDQ+Cis8cD48ZW0+U2luY2UgQW50IDEuNy4xPC9lbT48L3A+Cis8cD5JbmNsdWRlcyB0aGUgbGFzdCA8dmFyPmNvdW50PC92YXI+IHJlc291cmNlcyBmcm9tIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uICBUaGlzIGNhbiBiZQordXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8YSBocmVmPSIjc29ydCI+c29ydDwvYT4gY29sbGVjdGlvbiwgZm9yIGV4YW1wbGUsIHRvIHNlbGVjdCB0aGUKK2xhc3QgZmV3IG9sZGVzdCwgbGFyZ2VzdCwgZXRjLiByZXNvdXJjZXMgZnJvbSBhIGxhcmdlciBjb2xsZWN0aW9uLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y291bnQ8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0byBpbmNsdWRlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+MTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhY2hlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+Cis8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KIAotPGg0PjxhIG5hbWU9Imxhc3QiPmxhc3Q8L2E+PC9oND4KLTxwPkluY2x1ZGVzIHRoZSBsYXN0IDxpPmNvdW50PC9pPiByZXNvdXJjZXMgZnJvbSBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLgotVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSA8YSBocmVmPSIjc29ydCI+c29ydDwvYT4gY29sbGVjdGlvbiwKLWZvciBleGFtcGxlLCB0byBzZWxlY3QgdGhlIGxhc3QgZmV3IG9sZGVzdCwgbGFyZ2VzdCwgZXRjLiByZXNvdXJjZXMgZnJvbSBhCi1sYXJnZXIgY29sbGVjdGlvbi4gPHN0cm9uZz5TaW5jZSBBbnQgMS43LjE8L3N0cm9uZz4uPC9wPgotPGJsb2NrcXVvdGU+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y291bnQ8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0byBpbmNsdWRlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgMTwvdGQ+Ci0gICAgPC90cj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhY2hlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcKLSAgICAgICAgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT50cnVlPC9pPjwvdGQ+Ci0gICAgPC90cj4KLSAgPC90YWJsZT4KLSAgPGg0PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDQ+Ci0gIDxwPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9wPgotPC9ibG9ja3F1b3RlPgorPGg0IGlkPSJhbGxidXRmaXJzdCI+YWxsYnV0Zmlyc3Q8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjkuNTwvZW0+PC9wPgorPHA+SW5jbHVkZXMgYWxsIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IDx2YXI+Y291bnQ8L3Zhcj4gcmVzb3VyY2VzIGZyb20gYSBuZXN0ZWQgcmVzb3VyY2UKK2NvbGxlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIDxhIGhyZWY9IiNzb3J0Ij5zb3J0PC9hPiBjb2xsZWN0aW9uLCBmb3IKK2V4YW1wbGUsIHRvIHNlbGVjdCBhbGwgYnV0IHRoZSBmaXJzdCBmZXcgb2xkZXN0LCBsYXJnZXN0LCBldGMuIHJlc291cmNlcyBmcm9tIGEgbGFyZ2VyCitjb2xsZWN0aW9uLjwvcD4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y291bnQ8L3RkPgorICAgIDx0ZD5UaGUgbnVtYmVyIG9mIHJlc291cmNlcyB0byBleGNsdWRlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+MTwvcT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNhY2hlPC90ZD4KKyAgICA8dGQ+V2hldGhlciB0byBjYWNoZSByZXN1bHRzOyBkaXNhYmxpbmcgbWF5IHNlcmlvdXNseSBpbXBhY3QgcGVyZm9ybWFuY2U8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT50cnVlPC9xPjwvdGQ+CisgIDwvdHI+Cis8L3RhYmxlPgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+Cis8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KIAotPGg0PjxhIG5hbWU9ImFsbGJ1dGZpcnN0Ij5hbGxidXRmaXJzdDwvYT48L2g0PgotPHA+SW5jbHVkZXMgYWxsIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IDxpPmNvdW50PC9pPiByZXNvdXJjZXMKLWZyb20gYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIDxhIGhyZWY9IiNzb3J0Ij5zb3J0PC9hPiBjb2xsZWN0aW9uLCBmb3IgZXhhbXBsZSwgdG8gc2VsZWN0Ci1hbGwgYnV0IHRoZSBmaXJzdCBmZXcgb2xkZXN0LCBsYXJnZXN0LCBldGMuIHJlc291cmNlcyBmcm9tIGEgbGFyZ2VyCi1jb2xsZWN0aW9uLiA8c3Ryb25nPlNpbmNlIEFudCAxLjkuNTwvc3Ryb25nPi48L3A+Ci08YmxvY2txdW90ZT4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb3VudDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGV4Y2x1ZGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCAxPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZwotICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KLSAgPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+Ci08L2Jsb2NrcXVvdGU+Cis8aDQgaWQ9ImFsbGJ1dGxhc3QiPmFsbGJ1dGxhc3Q8L2g0PgorPHA+PGVtPlNpbmNlIEFudCAxLjkuNTwvZW0+PC9wPgorPHA+SW5jbHVkZXMgYWxsIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGxhc3QgPHZhcj5jb3VudDwvdmFyPiByZXNvdXJjZXMgZnJvbSBhIG5lc3RlZCByZXNvdXJjZQorY29sbGVjdGlvbi4gIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgPGEgaHJlZj0iI3NvcnQiPnNvcnQ8L2E+IGNvbGxlY3Rpb24sIGZvcgorZXhhbXBsZSwgdG8gc2VsZWN0IGFsbCBidXQgdGhlIGxhc3QgZmV3IG9sZGVzdCwgbGFyZ2VzdCwgZXRjLiByZXNvdXJjZXMgZnJvbSBhIGxhcmdlcgorY29sbGVjdGlvbi48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmNvdW50PC90ZD4KKyAgICA8dGQ+VGhlIG51bWJlciBvZiByZXNvdXJjZXMgdG8gZXhjbHVkZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPjE8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KKzxoNT5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g1PgorPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+CiAKLTxoND48YSBuYW1lPSJhbGxidXRsYXN0Ij5hbGxidXRsYXN0PC9hPjwvaDQ+Ci08cD5JbmNsdWRlcyBhbGwgZWxlbWVudHMgZXhjZXB0IGZvciB0aGUgbGFzdCA8aT5jb3VudDwvaT4gcmVzb3VyY2VzCi1mcm9tIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uICBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSA8YSBocmVmPSIjc29ydCI+c29ydDwvYT4gY29sbGVjdGlvbiwgZm9yIGV4YW1wbGUsIHRvIHNlbGVjdAotYWxsIGJ1dCB0aGUgbGFzdCBmZXcgb2xkZXN0LCBsYXJnZXN0LCBldGMuIHJlc291cmNlcyBmcm9tIGEgbGFyZ2VyCi1jb2xsZWN0aW9uLiA8c3Ryb25nPlNpbmNlIEFudCAxLjkuNTwvc3Ryb25nPi48L3A+Ci08YmxvY2txdW90ZT4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jb3VudDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHRvIGV4Y2x1ZGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCAxPC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZwotICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oND4KLSAgPHA+QSBzaW5nbGUgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyByZXF1aXJlZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci0KLTxoND48YSBuYW1lPSJ0b2tlbnMiPnRva2VuczwvYT48L2g0PgotPHA+SW5jbHVkZXMgdGhlIDxhIGhyZWY9IiNzdHJpbmciPnN0cmluZzwvYT4gdG9rZW5zIGdhdGhlcmVkIGZyb20gYSBuZXN0ZWQKLSByZXNvdXJjZSBjb2xsZWN0aW9uLiBVc2VzIHRoZSBzYW1lIHRva2VuaXplcnMgc3VwcG9ydGVkIGJ5IHRoZQotPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCN0b2tlbmZpbHRlciI+VG9rZW5GaWx0ZXI8L2E+LiBJbWFnaW5hdGl2ZQotICB1c2Ugb2YgdGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGNhbiBpbXBsZW1lbnQgZXF1aXZhbGVudHMgZm9yIHN1Y2ggVW5peAotICBmdW5jdGlvbnMgYXMgPGNvZGU+c29ydDwvY29kZT4sIDxjb2RlPmdyZXAgLWM8L2NvZGU+LCA8Y29kZT53YzwvY29kZT4gYW5kCi0gIDxjb2RlPndjIC1sPC9jb2RlPi48L3A+Ci08YmxvY2txdW90ZT4KLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBlbmNvZGluZyBvZiB0aGUgbmVzdGVkIHJlc291cmNlczwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IGlzIHBsYXRmb3JtIGRlZmF1bHQ8L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nCi0gICAgICAgIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHQgPGk+dHJ1ZTwvaT48L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci0gIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgotICA8dWw+Ci0gICAgPGxpPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9saT4KLSAgICA8bGk+T25lIG5lc3RlZCB0b2tlbml6ZXIgbWF5IGJlIHNwZWNpZmllZC4gIElmIG9taXR0ZWQsIGEKLSAgICAgICAgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPiB3aWxsIGJlIHVzZWQuCi0gICAgPC9saT4KLSAgPC91bD4KLSAgPGg0PkV4YW1wbGVzPC9oND4KLSAgPHByZT4mbHQ7Y29uY2F0Jmd0OworPGg0IGlkPSJ0b2tlbnMiPnRva2VuczwvaDQ+Cis8cD5JbmNsdWRlcyB0aGUgPGEgaHJlZj0iI3N0cmluZyI+c3RyaW5nPC9hPiB0b2tlbnMgZ2F0aGVyZWQgZnJvbSBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLiBVc2VzCit0aGUgc2FtZSB0b2tlbml6ZXJzIHN1cHBvcnRlZCBieQordGhlIDxhIGhyZWY9ImZpbHRlcmNoYWluLmh0bWwjdG9rZW5maWx0ZXIiPlRva2VuRmlsdGVyPC9hPi4gSW1hZ2luYXRpdmUgdXNlIG9mIHRoaXMgcmVzb3VyY2UKK2NvbGxlY3Rpb24gY2FuIGltcGxlbWVudCBlcXVpdmFsZW50cyBmb3Igc3VjaCBVbml4IGZ1bmN0aW9ucyBhcyA8a2JkPnNvcnQ8L2tiZD4sIDxrYmQ+Z3JlcAorLWM8L2tiZD4sIDxrYmQ+d2M8L2tiZD4gYW5kIDxrYmQ+d2MgLWw8L2tiZD4uPC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgPHRkPlRoZSBlbmNvZGluZyBvZiB0aGUgbmVzdGVkIHJlc291cmNlczwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+Y2FjaGU8L3RkPgorICAgIDx0ZD5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZyBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+Cis8aDU+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oNT4KKzx1bD4KKyAgPGxpPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9saT4KKyAgPGxpPk9uZSBuZXN0ZWQgdG9rZW5pemVyIG1heSBiZSBzcGVjaWZpZWQuICBJZiBvbWl0dGVkLAorICAgIGEgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCNsaW5ldG9rZW5pemVyIj5MaW5lVG9rZW5pemVyPC9hPiB3aWxsIGJlIHVzZWQuCisgIDwvbGk+Cis8L3VsPgorPGg1PkV4YW1wbGVzPC9oNT4KKzxwcmU+CismbHQ7Y29uY2F0Jmd0OwogICAmbHQ7dW5pb24mZ3Q7CiAgICAgJmx0O3NvcnQmZ3Q7CiAgICAgICAmbHQ7dG9rZW5zJmd0OwotICAgICAgICAmbHQ7cmVzb3VyY2VzIHJlZmlkPSJpbnB1dCIgLyZndDsKLSAgICAgICAgJmx0O2xpbmV0b2tlbml6ZXIgaW5jbHVkZWRlbGltcz0idHJ1ZSIgLyZndDsKKyAgICAgICAgJmx0O3Jlc291cmNlcyByZWZpZD0iaW5wdXQiLyZndDsKKyAgICAgICAgJmx0O2xpbmV0b2tlbml6ZXIgaW5jbHVkZWRlbGltcz0idHJ1ZSIvJmd0OwogICAgICAgJmx0Oy90b2tlbnMmZ3Q7CiAgICAgJmx0Oy9zb3J0Jmd0OwogICAmbHQ7L3VuaW9uJmd0OwotJmx0Oy9jb25jYXQmZ3Q7Ci0gIDwvcHJlPgotICA8cD5JbXBsZW1lbnRzIFVuaXggPGk+c29ydCAtdTwvaT4gYWdhaW5zdCByZXNvdXJjZSBjb2xsZWN0aW9uIDxpPmlucHV0PC9pPi48L3A+Ci08L2Jsb2NrcXVvdGU+CismbHQ7L2NvbmNhdCZndDs8L3ByZT4KKzxwPkltcGxlbWVudHMgVW5peCA8a2JkPnNvcnQgLXU8L2tiZD4gYWdhaW5zdCByZXNvdXJjZSBjb2xsZWN0aW9uIDxxPmlucHV0PC9xPi48L3A+CiAKLTxoND48YSBuYW1lPSJzZXRsb2dpYyI+U2V0IG9wZXJhdGlvbnM8L2E+PC9oND4KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgZm9sbG93aW5nIHJlc291cmNlIGNvbGxlY3Rpb25zIGltcGxlbWVudCBzZXQgb3BlcmF0aW9uczo8L3A+Ci0gIDx1bD4KLSAgICA8bGk+PGEgaHJlZj0iI3VuaW9uIj51bmlvbjwvYT48L2xpPgotICAgIDxsaT48YSBocmVmPSIjaW50ZXJzZWN0Ij5pbnRlcnNlY3Q8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVuY2UiPmRpZmZlcmVuY2U8L2E+PC9saT4KLSAgPC91bD4KKzxoNCBpZD0ic2V0bG9naWMiPlNldCBvcGVyYXRpb25zPC9oND4KKzxwPlRoZSBmb2xsb3dpbmcgcmVzb3VyY2UgY29sbGVjdGlvbnMgaW1wbGVtZW50IHNldCBvcGVyYXRpb25zOjwvcD4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IiN1bmlvbiI+dW5pb248L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IiNpbnRlcnNlY3QiPmludGVyc2VjdDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVuY2UiPmRpZmZlcmVuY2U8L2E+PC9saT4KKzwvdWw+CiAKLSAgPGg0PjxhIG5hbWU9InVuaW9uIj51bmlvbjwvYT48L2g0PgotICA8cD5VbmlvbiBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMuPC9wPgorPGg0IGlkPSJ1bmlvbiI+dW5pb248L2g0PgorPHA+VW5pb24gb2YgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLjwvcD4KIAotICA8aDQ+PGEgbmFtZT0iaW50ZXJzZWN0Ij5pbnRlcnNlY3Q8L2E+PC9oND4KLSAgPHA+SW50ZXJzZWN0aW9uIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+Cis8aDQgaWQ9ImludGVyc2VjdCI+aW50ZXJzZWN0PC9oND4KKzxwPkludGVyc2VjdGlvbiBvZiBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMuPC9wPgogCi0gIDxoND48YSBuYW1lPSJkaWZmZXJlbmNlIj5kaWZmZXJlbmNlPC9hPjwvaDQ+Ci0gIDxwPkRpZmZlcmVuY2Ugb2YgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLjwvcD4KKzxoNCBpZD0iZGlmZmVyZW5jZSI+ZGlmZmVyZW5jZTwvaDQ+Cis8cD5EaWZmZXJlbmNlIG9mIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucy48L3A+CiAKLSAgPHA+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFwcGx5IHRvIGFsbCBzZXQtb3BlcmF0aW9uIHJlc291cmNlIGNvbGxlY3Rpb25zOgotICA8L3A+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FjaGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIGNhY2hlIHJlc3VsdHM7IGRpc2FibGluZwotICAgICAgICBtYXkgc2VyaW91c2x5IGltcGFjdCBwZXJmb3JtYW5jZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vLCBkZWZhdWx0IDxpPnRydWU8L2k+PC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgotICAKLSAgPGg0PkV4YW1wbGVzPC9oND4KLSAgPHByZT4KLSAgICAmbHQ7cmVzb3VyY2VzIGlkPSZxdW90O0EmcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7YSZxdW90Oy8mZ3Q7Ci0gICAgICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7YiZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9yZXNvdXJjZXMmZ3Q7Ci0gICAgJmx0O3Jlc291cmNlcyBpZD0mcXVvdDtCJnF1b3Q7Jmd0OwotICAgICAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2ImcXVvdDsvJmd0OwotICAgICAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2MmcXVvdDsvJmd0OwotICAgICZsdDsvcmVzb3VyY2VzJmd0OwotICAgICZsdDt1bmlvbiBpZD0mcXVvdDt1bmlvbiZxdW90OyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0EmcXVvdDsvJmd0OyZsdDtyZXNvdXJjZXMgcmVmaWQ9JnF1b3Q7QiZxdW90Oy8mZ3Q7Jmx0Oy91bmlvbiZndDsKLSAgICAmbHQ7aW50ZXJzZWN0IGlkPSZxdW90O2ludGVyc2VjdCZxdW90OyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0EmcXVvdDsvJmd0OyZsdDtyZXNvdXJjZXMgcmVmaWQ9JnF1b3Q7QiZxdW90Oy8mZ3Q7Jmx0Oy9pbnRlcnNlY3QmZ3Q7Ci0gICAgJmx0O2RpZmZlcmVuY2UgaWQ9JnF1b3Q7ZGlmZmVyZW5jZSZxdW90OyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0EmcXVvdDsvJmd0OyZsdDtyZXNvdXJjZXMgcmVmaWQ9JnF1b3Q7QiZxdW90Oy8mZ3Q7Jmx0Oy9kaWZmZXJlbmNlJmd0OwotICAgICZsdDtlY2hvJmd0OwotICAgICAgQTogJHt0b1N0cmluZzpBfSAgICAgICAgICAgICAgICAgICAgPSBhO2IKLSAgICAgIEI6ICR7dG9TdHJpbmc6Qn0gICAgICAgICAgICAgICAgICAgID0gYjtjCis8cD5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXBwbHkgdG8gYWxsIHNldC1vcGVyYXRpb24gcmVzb3VyY2UgY29sbGVjdGlvbnM6PC9wPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZGlzYWJsaW5nIG1heSBzZXJpb3VzbHkgaW1wYWN0IHBlcmZvcm1hbmNlPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+dHJ1ZTwvcT48L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotICAgICAgdW5pb24gICAgIDogJHt0b1N0cmluZzp1bmlvbn0gICAgICAgPSBhO2I7YwotICAgICAgaW50ZXJzZWN0IDogJHt0b1N0cmluZzppbnRlcnNlY3R9ICAgPSBiCi0gICAgICBkaWZmZXJlbmNlOiAke3RvU3RyaW5nOmRpZmZlcmVuY2V9ICA9IGE7YwotICAgICZsdDsvZWNobyZndDsKLSAgPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Cis8aDU+RXhhbXBsZXM8L2g1PgorPHByZT4KKyZsdDtyZXNvdXJjZXMgaWQ9JnF1b3Q7QSZxdW90OyZndDsKKyAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2EmcXVvdDsvJmd0OworICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7YiZxdW90Oy8mZ3Q7CismbHQ7L3Jlc291cmNlcyZndDsKKyZsdDtyZXNvdXJjZXMgaWQ9JnF1b3Q7QiZxdW90OyZndDsKKyAgICAmbHQ7c3RyaW5nIHZhbHVlPSZxdW90O2ImcXVvdDsvJmd0OworICAgICZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7YyZxdW90Oy8mZ3Q7CismbHQ7L3Jlc291cmNlcyZndDsKKyZsdDt1bmlvbiBpZD0mcXVvdDt1bmlvbiZxdW90OyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0EmcXVvdDsvJmd0OyZsdDtyZXNvdXJjZXMgcmVmaWQ9JnF1b3Q7QiZxdW90Oy8mZ3Q7Jmx0Oy91bmlvbiZndDsKKyZsdDtpbnRlcnNlY3QgaWQ9JnF1b3Q7aW50ZXJzZWN0JnF1b3Q7Jmd0OyZsdDtyZXNvdXJjZXMgcmVmaWQ9JnF1b3Q7QSZxdW90Oy8mZ3Q7Jmx0O3Jlc291cmNlcyByZWZpZD0mcXVvdDtCJnF1b3Q7LyZndDsmbHQ7L2ludGVyc2VjdCZndDsKKyZsdDtkaWZmZXJlbmNlIGlkPSZxdW90O2RpZmZlcmVuY2UmcXVvdDsmZ3Q7Jmx0O3Jlc291cmNlcyByZWZpZD0mcXVvdDtBJnF1b3Q7LyZndDsmbHQ7cmVzb3VyY2VzIHJlZmlkPSZxdW90O0ImcXVvdDsvJmd0OyZsdDsvZGlmZmVyZW5jZSZndDsKKyZsdDtlY2hvJmd0OworICBBOiAke3RvU3RyaW5nOkF9ICAgICAgICAgICAgICAgICAgICA9IGE7YgorICBCOiAke3RvU3RyaW5nOkJ9ICAgICAgICAgICAgICAgICAgICA9IGI7YwogCi08aDQ+PGEgbmFtZT0ibWFwcGVkcmVzb3VyY2VzIj5tYXBwZWRyZXNvdXJjZXM8L2E+PC9oND4KKyAgdW5pb24gICAgIDogJHt0b1N0cmluZzp1bmlvbn0gICAgICAgPSBhO2I7YworICBpbnRlcnNlY3QgOiAke3RvU3RyaW5nOmludGVyc2VjdH0gICA9IGIKKyAgZGlmZmVyZW5jZTogJHt0b1N0cmluZzpkaWZmZXJlbmNlfSAgPSBhO2MKKyZsdDsvZWNobyZndDs8L3ByZT4KKworPGg0IGlkPSJtYXBwZWRyZXNvdXJjZXMiPm1hcHBlZHJlc291cmNlczwvaDQ+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KIAotPHA+V3JhcHMgYW5vdGhlciByZXNvdXJjZSBjb2xsZWN0aW9uIGFuZCBtYXBzIHRoZSBuYW1lcyBvZiB0aGUgbmVzdGVkCi0gIHJlc291cmNlcyB1c2luZyBhIDxhIGhyZWY9Im1hcHBlci5odG1sIj5tYXBwZXI8L2E+LjwvcD4KKzxwPldyYXBzIGFub3RoZXIgcmVzb3VyY2UgY29sbGVjdGlvbiBhbmQgbWFwcyB0aGUgbmFtZXMgb2YgdGhlIG5lc3RlZCByZXNvdXJjZXMgdXNpbmcKK2EgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPm1hcHBlcjwvYT4uPC9wPgogCi08cD5FdmVuIGlmIDxlbT5tYXBwZWRyZXNvdXJjZXM8L2VtPiB3cmFwcyBhIHJlc291cmNlIGNvbGxlY3Rpb24gdGhhdAotICBjb25zaXN0cyBvZiBmaWxlLXN5c3RlbSBiYXNlZCByZXNvdXJjZXMsIDxlbT5tYXBwZWRyZXNvdXJjZXM8L2VtPgotICB3aWxsIG5vdCBhcHBlYXIgdG8gYmUgZmlsZS1zeXN0ZW0gYmFzZWQuICBUaGlzIG1lYW5zIHlvdSBjYW4ndAotICB1c2UgPGVtPm1hcHBlZHJlc291cmNlczwvZW0+IHdpdGggdGFza3MgdGhhdCBvbmx5IGFsbG93IGZpbGUtc3lzdGVtCi0gIGJhc2VkIHJlc291cmNlcy48L3A+Cis8cD5FdmVuIGlmIDx2YXI+bWFwcGVkcmVzb3VyY2VzPC92YXI+IHdyYXBzIGEgcmVzb3VyY2UgY29sbGVjdGlvbiB0aGF0IGNvbnNpc3RzIG9mIGZpbGUtc3lzdGVtCitiYXNlZCByZXNvdXJjZXMsIDx2YXI+bWFwcGVkcmVzb3VyY2VzPC92YXI+IHdpbGwgbm90IGFwcGVhciB0byBiZSBmaWxlLXN5c3RlbSBiYXNlZC4gIFRoaXMgbWVhbnMKK3lvdSBjYW4ndCB1c2UgPHZhcj5tYXBwZWRyZXNvdXJjZXM8L3Zhcj4gd2l0aCB0YXNrcyB0aGF0IG9ubHkgYWxsb3cgZmlsZS1zeXN0ZW0gYmFzZWQKK3Jlc291cmNlcy48L3A+CiAKLTxibG9ja3F1b3RlPgotICA8aDQ+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgYXR0cmlidXRlczwvaDQ+Cis8aDU+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgYXR0cmlidXRlczwvaDU+CiAKLSAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5jYWNoZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZW5hYmxpbmcKLSAgICAgICAgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2UuICA8ZW0+U2luY2UgQW50IDEuOC4xPC9lbT48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCA8aT5mYWxzZTwvaT48L3RkPgotICAgIDwvdHI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5lbmFibGVtdWx0aXBsZW1hcHBpbmdzPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgIElmIHRydWUgdGhlIHRoZSBjb2xsZWN0aW9uIHdpbGwgdXNlIGFsbCB0aGUgbWFwcGluZ3MgZm9yIGEKLSAgICAgICAgZ2l2ZW4gc291cmNlIHBhdGguIElmIGZhbHNlIHRoZSBpdCB3aWxsIG9ubHkgcHJvY2VzcyB0aGUgZmlyc3QKLSAgICAgICAgcmVzb3VyY2UuCi0gICAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjE8L2VtPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdHMgdG8gZmFsc2UuPC90ZD4KLSAgICA8L3RyPgotICA8L3RhYmxlPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5jYWNoZTwvdGQ+CisgICAgPHRkPldoZXRoZXIgdG8gY2FjaGUgcmVzdWx0czsgZW5hYmxpbmcgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2UuICA8ZW0+U2luY2UgQW50CisgICAgICAxLjguMTwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5lbmFibGVtdWx0aXBsZW1hcHBpbmdzPC90ZD4KKyAgICA8dGQ+SWYgPHE+dHJ1ZTwvcT4gdGhlIGNvbGxlY3Rpb24gd2lsbCB1c2UgYWxsIHRoZSBtYXBwaW5ncyBmb3IgYSBnaXZlbiBzb3VyY2UKKyAgICAgIHBhdGguIElmIDxxPmZhbHNlPC9xPiBpdCB3aWxsIG9ubHkgcHJvY2VzcyB0aGUgZmlyc3QgcmVzb3VyY2UuCisgICAgICA8ZW0+c2luY2UgQW50IDEuOC4xPC9lbT48L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CiAKLSAgPGg0PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDQ+Ci0gIDxwPkEgc2luZ2xlIHJlc291cmNlIGNvbGxlY3Rpb24gaXMgcmVxdWlyZWQuPC9wPgotICA8cD5BIHNpbmdsZSA8YSBocmVmPSJtYXBwZXIuaHRtbCI+bWFwcGVyPC9hPiBjYW4gYmUgdXNlZCB0byBtYXAKLSAgICBuYW1lcy4gIElmIG5vIG1hcHBlciBoYXMgYmVlbiBnaXZlbiAod2hpY2ggZG9lc24ndCBtYWtlIGFueSBzZW5zZSwKLSAgICBob25lc3RseSksIGFuIGlkZW50aXR5IG1hcHBlciB3aWxsIGJlIHVzZWQuPC9wPgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+Cis8cD5BIHNpbmdsZSByZXNvdXJjZSBjb2xsZWN0aW9uIGlzIHJlcXVpcmVkLjwvcD4KKzxwPkEgc2luZ2xlIDxhIGhyZWY9Im1hcHBlci5odG1sIj5tYXBwZXI8L2E+IGNhbiBiZSB1c2VkIHRvIG1hcCBuYW1lcy4gIElmIG5vIG1hcHBlciBoYXMgYmVlbgorZ2l2ZW4gKHdoaWNoIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UsIGhvbmVzdGx5KSwgYW4gaWRlbnRpdHkgbWFwcGVyIHdpbGwgYmUgdXNlZC48L3A+CiAKLSAgPGg0PkV4YW1wbGVzPC9oND4KKzxoNT5FeGFtcGxlczwvaDU+CiAKLSAgPHA+Q29waWVzIGFsbCBmaWxlcyBmcm9tIGEgZ2l2ZW4gZGlyZWN0b3J5IHRvIGEgdGFyZ2V0IGRpcmVjdG9yeQotICAgIGFkZGluZyAiLmJhayIgYXMgYW4gZXh0ZW5zaW9uLiAgTm90ZSB0aGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBhCi0gICAgPGVtPm1hcHBlcjwvZW0+IG5lc3RlZCBpbnRvIDxlbT5jb3B5PC9lbT4gZGlyZWN0bHkgYXMgd2VsbC48L3A+Cis8cD5Db3BpZXMgYWxsIGZpbGVzIGZyb20gYSBnaXZlbiBkaXJlY3RvcnkgdG8gYSB0YXJnZXQgZGlyZWN0b3J5IGFkZGluZyA8c2FtcD4uYmFrPC9zYW1wPiBhcyBhbgorZXh0ZW5zaW9uLiAgTm90ZSB0aGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBhIDxjb2RlPm1hcHBlcjwvY29kZT4gbmVzdGVkIGludG8gPGNvZGU+Y29weTwvY29kZT4KK2RpcmVjdGx5IGFzIHdlbGwuPC9wPgogCi0gIDxwcmU+Ci0gICAgJmx0O2NvcHkgdG9kaXI9IiR7dGFyZ2V0fSImZ3Q7Ci0gICAgICAmbHQ7bWFwcGVkcmVzb3VyY2VzJmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjfSIvJmd0OwotICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKi5iYWsiLyZndDsKLSAgICAgICZsdDsvbWFwcGVkcmVzb3VyY2VzJmd0OwotICAgICZsdDsvY29weSZndDsKLSAgPC9wcmU+Cis8cHJlPgorJmx0O2NvcHkgdG9kaXI9IiR7dGFyZ2V0fSImZ3Q7CisgICZsdDttYXBwZWRyZXNvdXJjZXMmZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyY30iLyZndDsKKyAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iKi5iYWsiLyZndDsKKyAgJmx0Oy9tYXBwZWRyZXNvdXJjZXMmZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLSAgPHA+Q3JlYXRlcyBhIFdBUiBhcmNoaXZlIGFkZGluZyBhbGwgQ0xBU1NQQVRIIGVudHJpZXMgdGhhdCBhcmUgZmlsZXMKLSAgICB0byB0aGUgPGNvZGU+V0VCLUlORi9saWI8L2NvZGU+IGRpcmVjdG9yeSB3aXRob3V0IGtlZXBpbmcgdGhlaXIKLSAgICBmaWxlcy1zeXN0ZW0gc3RydWN0dXJlLjwvcD4KKzxwPkNyZWF0ZXMgYSBXQVIgYXJjaGl2ZSBhZGRpbmcgYWxsIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW50cmllcyB0aGF0IGFyZSBmaWxlcyB0bwordGhlIDxzYW1wPldFQi1JTkYvbGliPC9zYW1wPiBkaXJlY3Rvcnkgd2l0aG91dCBrZWVwaW5nIHRoZWlyIGZpbGVzLXN5c3RlbSBzdHJ1Y3R1cmUuPC9wPgogCi0gIDxwcmU+Ci0gICAgJmx0O3dhciBkZXN0ZmlsZT0iJHtvdXRwdXR9IiZndDsKLSAgICAgICZsdDttYXBwZWRyZXNvdXJjZXMmZ3Q7Ci0gICAgICAgICZsdDtyZXN0cmljdCZndDsKLSAgICAgICAgICAmbHQ7cGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLyZndDsKLSAgICAgICAgICAmbHQ7dHlwZSB0eXBlPSJmaWxlIi8mZ3Q7Ci0gICAgICAgICZsdDsvcmVzdHJpY3QmZ3Q7Ci0gICAgICAgICZsdDtjaGFpbmVkbWFwcGVyJmd0OwotICAgICAgICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKLSAgICAgICAgICAmbHQ7Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0iV0VCLUlORi9saWIvKiIvJmd0OwotICAgICAgICAmbHQ7L2NoYWluZWRtYXBwZXImZ3Q7Ci0gICAgICAmbHQ7L21hcHBlZHJlc291cmNlcyZndDsKLSAgICAmbHQ7L3dhciZndDsKLSAgPC9wcmU+ICAgIAotPC9ibG9ja3F1b3RlPgorPHByZT4KKyZsdDt3YXIgZGVzdGZpbGU9IiR7b3V0cHV0fSImZ3Q7CisgICZsdDttYXBwZWRyZXNvdXJjZXMmZ3Q7CisgICAgJmx0O3Jlc3RyaWN0Jmd0OworICAgICAgJmx0O3BhdGggcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8mZ3Q7CisgICAgICAmbHQ7dHlwZSB0eXBlPSJmaWxlIi8mZ3Q7CisgICAgJmx0Oy9yZXN0cmljdCZndDsKKyAgICAmbHQ7Y2hhaW5lZG1hcHBlciZndDsKKyAgICAgICZsdDtmbGF0dGVubWFwcGVyLyZndDsKKyAgICAgICZsdDtnbG9ibWFwcGVyIGZyb209IioiIHRvPSJXRUItSU5GL2xpYi8qIi8mZ3Q7CisgICAgJmx0Oy9jaGFpbmVkbWFwcGVyJmd0OworICAmbHQ7L21hcHBlZHJlc291cmNlcyZndDsKKyZsdDsvd2FyJmd0OzwvcHJlPgogCi08aDQ+PGEgbmFtZT0iYXJjaGl2ZXMiPmFyY2hpdmVzPC9hPjwvaDQ+Cis8aDQgaWQ9ImFyY2hpdmVzIj5hcmNoaXZlczwvaDQ+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KIAotPHA+VGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBuZXN0ZWQKLSAgcmVzb3VyY2VzIGFuZCBhc3N1bWVzIHRoYXQgYWxsIHRob3NlIHJlc291cmNlcyBtdXN0IGJlIGVpdGhlciBaSVAgb3IKLSAgVEFSIGFyY2hpdmVzLiAgVGhlIHJlc291cmNlcyByZXR1cm5lZAotICBieSA8Y29kZT4mbHQ7YXJjaGl2ZXMmZ3Q7PC9jb2RlPiBhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBuZXN0ZWQKLSAgYXJjaGl2ZXMuPC9wPgorPHA+VGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBuZXN0ZWQgcmVzb3VyY2VzIGFuZCBhc3N1bWVzIHRoYXQgYWxsCit0aG9zZSByZXNvdXJjZXMgbXVzdCBiZSBlaXRoZXIgWklQIG9yIFRBUiBhcmNoaXZlcy4gIFRoZSByZXNvdXJjZXMgcmV0dXJuZWQKK2J5IDxjb2RlPiZsdDthcmNoaXZlcyZndDs8L2NvZGU+IGFyZSB0aGUgY29udGVudHMgb2YgdGhlIG5lc3RlZCBhcmNoaXZlcy48L3A+CiAKIDxwPlRoaXMgcmVzb3VyY2UgY29sbGVjdGlvbiBpcyBhIGdlbmVyYWxpemF0aW9uCi0gIG9mIDxhIGhyZWY9Ii4uL1Rhc2tzL3ppcC5odG1sI3ppcGdyb3VwZmlsZXNldCI+emlwZ3JvdXBmaWxlc2V0PC9hPgotICB3aGljaCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgemlwIGZhbWlseSBvZiB0YXNrcy48L3A+CitvZiA8YSBocmVmPSIuLi9UYXNrcy96aXAuaHRtbCN6aXBncm91cGZpbGVzZXQiPnppcGdyb3VwZmlsZXNldDwvYT4gd2hpY2ggaXMgb25seSBzdXBwb3J0ZWQgYnkKK3RoZSB6aXAgZmFtaWx5IG9mIHRhc2tzLjwvcD4KIAotPHA+PGVtPmFyY2hpdmVzPC9lbT4gZG9lc24ndCBzdXBwb3J0IGFueSBhdHRyaWJ1dGVzLjwvcD4KKzxwPjxjb2RlPmFyY2hpdmVzPC9jb2RlPiBkb2Vzbid0IHN1cHBvcnQgYW55IGF0dHJpYnV0ZXMuPC9wPgogCi08YmxvY2txdW90ZT4KLSAgPGg0PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDQ+Cis8aDU+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oNT4KIAotICA8cD48Y29kZT4mbHQ7YXJjaGl2ZXMmZ3Q7PC9jb2RlPiBoYXMgdHdvIG5lc3RlZAotICAgIGVsZW1lbnRzIDxjb2RlPiZsdDt6aXBzJmd0OzwvY29kZT4gYW5kCi0gICAgPGNvZGU+Jmx0O3RhcnMmZ3Q7PC9jb2RlPiB0aGF0IGFyZSA8YSBocmVmPSIjdW5pb24iPnVuaW9uczwvYT4KLSAgICB0aGVtc2VsdmVzLCBpLmUuIHRoZXkgYWNjZXB0IGFyYml0cmFyeSBtYW55IHJlc291cmNlKGNvbGxlY3Rpb24pcwotICAgIGFzIG5lc3RlZCBlbGVtZW50cy48L3A+Cis8cD48Y29kZT4mbHQ7YXJjaGl2ZXMmZ3Q7PC9jb2RlPiBoYXMgdHdvIG5lc3RlZCBlbGVtZW50cyA8Y29kZT4mbHQ7emlwcyZndDs8L2NvZGU+CithbmQgPGNvZGU+Jmx0O3RhcnMmZ3Q7PC9jb2RlPiB0aGF0IGFyZSA8YSBocmVmPSIjdW5pb24iPnVuaW9uczwvYT4gdGhlbXNlbHZlcywgaS5lLiB0aGV5IGFjY2VwdAorYXJiaXRyYXJ5IG1hbnkgcmVzb3VyY2UoY29sbGVjdGlvbilzIGFzIG5lc3RlZCBlbGVtZW50cy48L3A+CiAKLSAgPHA+VGhlIG5lc3RlZCByZXNvdXJjZXMgb2YgJmx0O3ppcHMmZ3Q7IGFyZSB0cmVhdGVkIGFzIFpJUCBhcmNoaXZlcywKLSAgICB0aGUgbmVzdGVkIHJlc291cmNlcyBvZiAmbHQ7dGFycyZndDsgYXMgVEFSIGFyY2hpdmVzLjwvcD4KKzxwPlRoZSBuZXN0ZWQgcmVzb3VyY2VzIG9mIDxjb2RlPiZsdDt6aXBzJmd0OzwvY29kZT4gYXJlIHRyZWF0ZWQgYXMgWklQIGFyY2hpdmVzLCB0aGUgbmVzdGVkCityZXNvdXJjZXMgb2YgPGNvZGU+Jmx0O3RhcnMmZ3Q7PC9jb2RlPiBhcyBUQVIgYXJjaGl2ZXMuPC9wPgogCi0gIDxoND5FeGFtcGxlczwvaDQ+Cis8aDU+RXhhbXBsZXM8L2g1PgogCi0gIDxwPkNvcGllcyBhbGwgZmlsZXMgZnJvbSBhbGwgamFycyB0aGF0IGFyZSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgdG8gPGNvZGU+JHt0YXJnZXR9PC9jb2RlPi48L3A+Cis8cD5Db3BpZXMgYWxsIGZpbGVzIGZyb20gYWxsIGphcnMgdGhhdCBhcmUgb24gdGhlIGNsYXNzcGF0aCB0byA8c2FtcD4ke3RhcmdldH08L3NhbXA+LjwvcD4KIAotICA8cHJlPgotICAgICZsdDtjb3B5IHRvZGlyPSIke3RhcmdldH0iJmd0OwotICAgICAgJmx0O2FyY2hpdmVzJmd0OwotICAgICAgICAmbHQ7emlwcyZndDsKLSAgICAgICAgICAmbHQ7cmVzdHJpY3QmZ3Q7Ci0gICAgICAgICAgICAmbHQ7cGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLyZndDsKLSAgICAgICAgICAgICZsdDtuYW1lIG5hbWU9IiouamFyIi8mZ3Q7Ci0gICAgICAgICAgJmx0Oy9yZXN0cmljdCZndDsKLSAgICAgICAgJmx0Oy96aXBzJmd0OwotICAgICAgJmx0Oy9hcmNoaXZlcyZndDsKLSAgICAmbHQ7L2NvcHkmZ3Q7Ci0gIDwvcHJlPgotPC9ibG9ja3F1b3RlPgorPHByZT4KKyZsdDtjb3B5IHRvZGlyPSIke3RhcmdldH0iJmd0OworICAmbHQ7YXJjaGl2ZXMmZ3Q7CisgICAgJmx0O3ppcHMmZ3Q7CisgICAgICAmbHQ7cmVzdHJpY3QmZ3Q7CisgICAgICAgICZsdDtwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvJmd0OworICAgICAgICAmbHQ7bmFtZSBuYW1lPSIqLmphciIvJmd0OworICAgICAgJmx0Oy9yZXN0cmljdCZndDsKKyAgICAmbHQ7L3ppcHMmZ3Q7CisgICZsdDsvYXJjaGl2ZXMmZ3Q7CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLTxoND48YSBuYW1lPSJyZXNvdXJjZWxpc3QiPnJlc291cmNlbGlzdDwvYT48L2g0PgorPGg0IGlkPSJyZXNvdXJjZWxpc3QiPnJlc291cmNlbGlzdDwvaDQ+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvcD4KIAotPHA+VGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBuZXN0ZWQKLSAgcmVzb3VyY2VzLCByZWFkcyB0aG9zZSByZXNvdXJjZXMgYW5kIHJldHVybnMgYSByZXNvdXJjZSBmb3IgZWFjaAotICBsaW5lIHJlYWQuPC9wPgorPHA+VGhpcyByZXNvdXJjZSBjb2xsZWN0aW9uIGFjY2VwdHMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBuZXN0ZWQgcmVzb3VyY2VzLCByZWFkcyB0aG9zZQorcmVzb3VyY2VzIGFuZCByZXR1cm5zIGEgcmVzb3VyY2UgZm9yIGVhY2ggbGluZSByZWFkLjwvcD4KIAotPHA+SWYgdGhlIGxpbmUgY29udGFpbnMgYSBjb2xvbiwgQW50IHdpbGwgdHJ5IHRvIHVzZSBpdCBhcyBhbiBVUkwgYW5kCi0gIGlmIHRoYXQgZmFpbHMgKG9yIHRoZSBsaW5lIGRvZXNuJ3QgY29udGFpbiBhIGNvbG9uKSB3aWxsIHJldHVybiBhCi0gIGZpbGUgcmVzb3VyY2Ugd2l0aCB0aGUgbGluZSdzIGNvbnRlbnQgYXMgaXRzIG5hbWUuPC9wPgorPHA+SWYgdGhlIGxpbmUgY29udGFpbnMgYSBjb2xvbiwgQW50IHdpbGwgdHJ5IHRvIHVzZSBpdCBhcyBhbiBVUkwgYW5kIGlmIHRoYXQgZmFpbHMgKG9yIHRoZSBsaW5lCitkb2Vzbid0IGNvbnRhaW4gYSBjb2xvbikgd2lsbCByZXR1cm4gYSBmaWxlIHJlc291cmNlIHdpdGggdGhlIGxpbmUncyBjb250ZW50IGFzIGl0cyBuYW1lLjwvcD4KIAotPHA+UHJvcGVydGllcyB3aWxsIGJlIGV4cGFuZGVkIGZvciBlYWNoIGxpbmUuICBJZiB0aGUgcHJvcGVydHkKLSAgZXhwYW5zaW9uIHlpZWxkcyBhIHJlc291cmNlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAoZm9yIGV4YW1wbGUKLSAgYmVjYXVzZSBvZiBjdXN0b20gcHJvcGVydHkgaGVscGVycyksIHRoZSByZXNvdXJjZXMgd2lsbCBiZSByZXR1cm5lZAotICBkaXJlY3RseS48L3A+Cis8cD5Qcm9wZXJ0aWVzIHdpbGwgYmUgZXhwYW5kZWQgZm9yIGVhY2ggbGluZS4gIElmIHRoZSBwcm9wZXJ0eSBleHBhbnNpb24geWllbGRzIGEgcmVzb3VyY2UKK29iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZyAoZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBjdXN0b20gcHJvcGVydHkgaGVscGVycyksIHRoZSByZXNvdXJjZXMgd2lsbAorYmUgcmV0dXJuZWQgZGlyZWN0bHkuPC9wPgogCiA8cD48Y29kZT4mbHQ7cmVzb3VyY2VsaXN0Jmd0OzwvY29kZT4gaXMgYSBnZW5lcmFsaXphdGlvbgotICBvZiA8YSBocmVmPSJmaWxlbGlzdC5odG1sIj48Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPjwvYT4uPC9wPgorb2YgPGEgaHJlZj0iZmlsZWxpc3QuaHRtbCI+PGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT48L2E+LjwvcD4KIAotPGJsb2NrcXVvdGU+Ci0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZW5jb2Rpbmcgb2YgdGhlIG5lc3RlZCByZXNvdXJjZXM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyBwbGF0Zm9ybSBkZWZhdWx0PC90ZD4KLSAgICA8L3RyPgotICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPkJhc2UgZGlyZWN0b3J5IHRoYXQgaXMgdXNlZCB0byByZXNvbHZlCi0gICAgICAgIHJlbGF0aXZlIGZpbGUgbmFtZXMgYWdhaW5zdC4gSXMgYWxzbyB1c2VkIHRvIHByb3ZpZGUgYSBiYXNlCi0gICAgICAgIGRpcmVjdG9yeSB0byB0aGUgRmlsZVJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXMgcmVzb3VyY2UKLSAgICAgICAgY29sbGVjdGlvbi4gPGVtPlNpbmNlIEFudCAxLjkuMTI8L2VtPgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgotICAgIDwvdHI+Ci0gIDwvdGFibGU+Ci08L2Jsb2NrcXVvdGU+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICA8dGQ+VGhlIGVuY29kaW5nIG9mIHRoZSBuZXN0ZWQgcmVzb3VyY2VzPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5iYXNlZGlyPC90ZD4KKyAgICA8dGQ+QmFzZSBkaXJlY3RvcnkgdGhhdCBpcyB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgZmlsZSBuYW1lcworICAgICAgYWdhaW5zdC4gSXMgYWxzbyB1c2VkIHRvIHByb3ZpZGUgYSBiYXNlIGRpcmVjdG9yeSB0byB0aGUKKyAgICAgIEZpbGVSZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24uIDxlbT5TaW5jZSBBbnQKKyAgICAgIDEuMTAuNDwvZW0+CisgICAgPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgorICA8L3RyPgorPC90YWJsZT4KIAotPGJsb2NrcXVvdGU+Ci0gIDxoND5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g0PgorPGg1PlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDU+CiAKLSAgPHA+PGNvZGU+Jmx0O3Jlc291cmNlbGlzdCZndDs8L2NvZGU+IGFjY2VwdHMgYXJiaXRyYXJ5IG1hbnkKLSAgICByZXNvdXJjZShjb2xsZWN0aW9uKXMgYXMgbmVzdGVkIGVsZW1lbnRzLjwvcD4KKzxwPjxjb2RlPiZsdDtyZXNvdXJjZWxpc3QmZ3Q7PC9jb2RlPiBhY2NlcHRzIGFyYml0cmFyeSBtYW55IHJlc291cmNlKGNvbGxlY3Rpb24pcyBhcyBuZXN0ZWQKK2VsZW1lbnRzLjwvcD4KIAotICA8cD5JbiBhZGRpdGlvbiA8Y29kZT4mbHQ7cmVzb3VyY2VsaXN0Jmd0OzwvY29kZT4gc3VwcG9ydHMKLSAgICBuZXN0ZWQgPGNvZGU+Jmx0O2ZpbHRlcmNoYWluJmd0OzwvY29kZT4gZWxlbWVudHMgdGhhdCBjYW4gYmUgdXNlZAotICAgIHRvIGZpbHRlci9tb2RpZnkgdGhlIHJlYWQgcmVzb3VyY2VzIGJlZm9yZSB0aGVpciBsaW5lcyBnZXQKLSAgICBleHBhbmRlZC4gIFN1Y2ggYSBuZXN0ZWQgZWxlbWVudCBjb3JyZXNwb25kcyB0bwotICAgIGEgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyY2hhaW48L2E+LjwvcD4KKzxwPkluIGFkZGl0aW9uIDxjb2RlPiZsdDtyZXNvdXJjZWxpc3QmZ3Q7PC9jb2RlPiBzdXBwb3J0cworbmVzdGVkIDxjb2RlPiZsdDtmaWx0ZXJjaGFpbiZndDs8L2NvZGU+IGVsZW1lbnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmlsdGVyL21vZGlmeSB0aGUgcmVhZAorcmVzb3VyY2VzIGJlZm9yZSB0aGVpciBsaW5lcyBnZXQgZXhwYW5kZWQuICBTdWNoIGEgbmVzdGVkIGVsZW1lbnQgY29ycmVzcG9uZHMgdG8KK2EgPGEgaHJlZj0iZmlsdGVyY2hhaW4uaHRtbCI+ZmlsdGVyY2hhaW48L2E+LjwvcD4KIAotICA8aDQ+RXhhbXBsZXM8L2g0PgorPGg1PkV4YW1wbGVzPC9oNT4KIAotICA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgY29waWVzIGEgZmlsZSBmcm9tIHRoZSBmaXJzdCBVUkwgb2YKLSAgICBzZXZlcmFsIGFsdGVybmF0aXZlcyB0aGF0IGNhbiBhY3R1YWxseSBiZSByZWFjaGVkLiAgSXQgYXNzdW1lcwotICAgIHRoYXQgdGhlIGZpbGUgbWlycm9ycy50eHQgbG9va3MgbGlrZTwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb3BpZXMgYSBmaWxlIGZyb20gdGhlIGZpcnN0IFVSTCBvZiBzZXZlcmFsIGFsdGVybmF0aXZlcyB0aGF0IGNhbgorYWN0dWFsbHkgYmUgcmVhY2hlZC4gIEl0IGFzc3VtZXMgdGhhdCB0aGUgZmlsZSA8c2FtcD5taXJyb3JzLnR4dDwvc2FtcD4gbG9va3MgbGlrZTwvcD4KIAotICA8cHJlPgorPHByZT4KICAgICBtaXJyb3JzLnR4dDoKLWh0dHA6Ly9iZXN0Lm1pcnJvci5leGFtcGxlLm9yZy8KK2h0dHBzOi8vYmVzdC5taXJyb3IuZXhhbXBsZS5vcmcvCiBodHRwOi8vc2Vjb25kLmJlc3QubWlycm9yLmV4YW1wbGUub3JnL21pcnJvci9vZi9iZXN0LwogaHR0cHM6Ly95ZXQuYW5vdGhlci5taXJyb3IvCi1odHRwOi8vdGhlLm9yaWdpbmFsLnNpdGUvCi0gIDwvcHJlPgotICAgIAotICA8cHJlPgotICAgICZsdDtjb3B5IHRvZGlyPSIke3RhcmdldH0iJmd0OwotICAgICAgJmx0O2ZpcnN0Jmd0OwotICAgICAgICAmbHQ7cmVzdHJpY3QmZ3Q7Ci0gICAgICAgICAgJmx0O3Jlc291cmNlbGlzdCZndDsKLSAgICAgICAgICAgICZsdDtmaWxlIGZpbGU9Im1pcnJvcnMudHh0Ii8mZ3Q7Ci0gICAgICAgICAgJmx0Oy9yZXNvdXJjZWxpc3QmZ3Q7Ci0gICAgICAgICAgJmx0O2V4aXN0cy8mZ3Q7Ci0gICAgICAgICZsdDsvcmVzdHJpY3QmZ3Q7Ci0gICAgICAmbHQ7L2ZpcnN0Jmd0OwotICAgICZsdDsvY29weSZndDsKLSAgPC9wcmU+Ci08L2Jsb2NrcXVvdGU+CitodHRwczovL3RoZS5vcmlnaW5hbC5zaXRlLzwvcHJlPgorCis8cHJlPgorJmx0O2NvcHkgdG9kaXI9IiR7dGFyZ2V0fSImZ3Q7CisgICZsdDtmaXJzdCZndDsKKyAgICAmbHQ7cmVzdHJpY3QmZ3Q7CisgICAgICAmbHQ7cmVzb3VyY2VsaXN0Jmd0OworICAgICAgICAmbHQ7ZmlsZSBmaWxlPSJtaXJyb3JzLnR4dCIvJmd0OworICAgICAgJmx0Oy9yZXNvdXJjZWxpc3QmZ3Q7CisgICAgICAmbHQ7ZXhpc3RzLyZndDsKKyAgICAmbHQ7L3Jlc3RyaWN0Jmd0OworICAmbHQ7L2ZpcnN0Jmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvc2VsZWN0b3JzLXByb2dyYW0uaHRtbCBiL21hbnVhbC9UeXBlcy9zZWxlY3RvcnMtcHJvZ3JhbS5odG1sCmluZGV4IDA3NGE1NDIuLjQ3ZDRkY2IgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy9zZWxlY3RvcnMtcHJvZ3JhbS5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9zZWxlY3RvcnMtcHJvZ3JhbS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTEgKzE1LDEwIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAgIDxoZWFkPgotICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPlByb2dyYW1taW5nIFNlbGVjdG9ycyBpbiBBcGFjaGUgQW50PC90aXRsZT4KKyAgICA8dGl0bGU+UHJvZ3JhbW1pbmcgU2VsZWN0b3JzIGluIEFwYWNoZSBBbnQ8L3RpdGxlPgogICA8L2hlYWQ+CiAKICAgPGJvZHk+CkBAIC0yOCwxMzggKzI4LDExOSBAQAogCiAgICAgPHA+V2FudCB0byBkZWZpbmUgeW91ciBvd24gc2VsZWN0b3JzPyBJdCdzIGVhc3khPC9wPgogCi0gICAgPHA+Rmlyc3QsIHBpY2sgdGhlIHR5cGUgb2Ygc2VsZWN0b3IgdGhhdCB5b3Ugd2FudCB0byBkZWZpbmUuIFRoZXJlCi0gICAgYXJlIHRocmVlIHR5cGVzLCBhbmQgYSByZWNpcGUgZm9yIGVhY2ggb25lIGZvbGxvd3MuIENoYW5jZXMgYXJlCi0gICAgeW91J2xsIHdhbnQgdG8gd29yayB3aXRoIHRoZSBmaXJzdCBvbmUsIEN1c3RvbSBTZWxlY3RvcnMuPC9wPgorICAgIDxwPkZpcnN0LCBwaWNrIHRoZSB0eXBlIG9mIHNlbGVjdG9yIHRoYXQgeW91IHdhbnQgdG8gZGVmaW5lLiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMsIGFuZCBhCisgICAgcmVjaXBlIGZvciBlYWNoIG9uZSBmb2xsb3dzLiBDaGFuY2VzIGFyZSB5b3UnbGwgd2FudCB0byB3b3JrIHdpdGggdGhlIGZpcnN0IG9uZSwgQ3VzdG9tCisgICAgU2VsZWN0b3JzLjwvcD4KIAogICAgIDxvbD4KICAgICAgIDxsaT5DdXN0b20gU2VsZWN0b3JzCiAKLSAgICAgICAgPHA+VGhpcyBpcyB0aGUgY2F0ZWdvcnkgdGhhdCBBcGFjaGUgQW50IHByb3ZpZGVzIHNwZWNpZmljYWxseSBmb3IgeW91IHRvCi0gICAgICAgIGRlZmluZSB5b3VyIG93biBTZWxlY3RvcnMuIEFueXdoZXJlIHlvdSB3YW50IHRvIHVzZSB5b3VyIHNlbGVjdG9yCi0gICAgICAgIHlvdSB1c2UgdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiBlbGVtZW50IGFuZCBzcGVjaWZ5Ci0gICAgICAgIHRoZSBjbGFzcyBuYW1lIG9mIHlvdXIgc2VsZWN0b3Igd2l0aGluIGl0LiBTZWUgdGhlCi0gICAgICAgIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2N1c3RvbXNlbGVjdCI+Q3VzdG9tIFNlbGVjdG9yczwvYT4KLSAgICAgICAgc2VjdGlvbiBvZiB0aGUgU2VsZWN0b3IgcGFnZSBmb3IgZGV0YWlscy4gVGhlCi0gICAgICAgIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBiZSB1c2VkIGFueXdoZXJlCi0gICAgICAgIHRoZSBjb3JlIHNlbGVjdG9ycyBjYW4gYmUgdXNlZC4gSXQgY2FuIGJlIGNvbnRhaW5lZCB3aXRoaW4KLSAgICAgICAgPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjc2VsZWN0Y29udGFpbmVycyI+U2VsZWN0b3IgQ29udGFpbmVyczwvYT4sCi0gICAgICAgIGZvciBleGFtcGxlLjwvcD4KKyAgICAgICAgPHA+VGhpcyBpcyB0aGUgY2F0ZWdvcnkgdGhhdCBBcGFjaGUgQW50IHByb3ZpZGVzIHNwZWNpZmljYWxseSBmb3IgeW91IHRvIGRlZmluZSB5b3VyIG93bgorICAgICAgICBTZWxlY3RvcnMuIEFueXdoZXJlIHlvdSB3YW50IHRvIHVzZSB5b3VyIHNlbGVjdG9yIHlvdSB1c2UKKyAgICAgICAgdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiBlbGVtZW50IGFuZCBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lIG9mIHlvdXIgc2VsZWN0b3IKKyAgICAgICAgd2l0aGluIGl0LiBTZWUgdGhlIDxhIGhyZWY9InNlbGVjdG9ycy5odG1sI2N1c3RvbXNlbGVjdCI+Q3VzdG9tIFNlbGVjdG9yczwvYT4gc2VjdGlvbiBvZgorICAgICAgICB0aGUgU2VsZWN0b3IgcGFnZSBmb3IgZGV0YWlscy4gVGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiBlbGVtZW50IGNhbiBiZSB1c2VkCisgICAgICAgIGFueXdoZXJlIHRoZSBjb3JlIHNlbGVjdG9ycyBjYW4gYmUgdXNlZC4gSXQgY2FuIGJlIGNvbnRhaW5lZAorICAgICAgICB3aXRoaW4gPGEgaHJlZj0ic2VsZWN0b3JzLmh0bWwjc2VsZWN0Y29udGFpbmVycyI+U2VsZWN0b3IgQ29udGFpbmVyczwvYT4sIGZvcgorICAgICAgICBleGFtcGxlLjwvcD4KIAogICAgICAgICA8cD5UbyBjcmVhdGUgYSBuZXcgQ3VzdG9tIFNlbGVjdG9yLCB5b3UgaGF2ZSB0byBjcmVhdGUgYSBjbGFzcyB0aGF0Ci0gICAgICAgIGltcGxlbWVudHMKLSAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkV4dGVuZEZpbGVTZWxlY3RvcjwvY29kZT4uCi0gICAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHRocm91Z2ggdGhlIGNvbnZlbmllbmNlIGJhc2UgY2xhc3MKLSAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VFeHRlbmRTZWxlY3RvcjwvY29kZT4sCi0gICAgICAgIHdoaWNoIHByb3ZpZGVzIGFsbCBvZiB0aGUgbWV0aG9kcyBmb3Igc3VwcG9ydGluZwotICAgICAgICA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiB0YWdzLiBGaXJzdCwgb3ZlcnJpZGUgdGhlCi0gICAgICAgIDxjb2RlPmlzU2VsZWN0ZWQoKTwvY29kZT4gbWV0aG9kLCBhbmQgb3B0aW9uYWxseSB0aGUKLSAgICAgICAgPGNvZGU+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4gbWV0aG9kLiBJZiB5b3VyIGN1c3RvbQotICAgICAgICBzZWxlY3RvciByZXF1aXJlcyBwYXJhbWV0ZXJzIHRvIGJlIHNldCwgeW91IGNhbiBhbHNvIG92ZXJyaWRlCi0gICAgICAgIHRoZSA8Y29kZT5zZXRQYXJhbWV0ZXJzKCk8L2NvZGU+IG1ldGhvZCBhbmQgaW50ZXJwcmV0IHRoZQotICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBpbiBhbnkgd2F5IHlvdSBsaWtlLiBTZXZlcmFsIG9mIHRoZQotICAgICAgICBjb3JlIHNlbGVjdG9ycyBkZW1vbnN0cmF0ZSBob3cgdG8gZG8gdGhhdCBiZWNhdXNlIHRoZXkgY2FuCi0gICAgICAgIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzLjwvcD4KKyAgICAgICAgaW1wbGVtZW50cyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkV4dGVuZEZpbGVTZWxlY3RvcjwvY29kZT4uCisgICAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGF0IGlzIHRocm91Z2ggdGhlIGNvbnZlbmllbmNlIGJhc2UKKyAgICAgICAgY2xhc3MgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlRXh0ZW5kU2VsZWN0b3I8L2NvZGU+LAorICAgICAgICB3aGljaCBwcm92aWRlcyBhbGwgb2YgdGhlIG1ldGhvZHMgZm9yIHN1cHBvcnRpbmcgPGNvZGU+Jmx0O3BhcmFtJmd0OzwvY29kZT4gdGFncy4gRmlyc3QsCisgICAgICAgIG92ZXJyaWRlIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+aXNTZWxlY3RlZCgpPC9jb2RlPiBtZXRob2QsIGFuZCBvcHRpb25hbGx5CisgICAgICAgIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4gbWV0aG9kLiBJZiB5b3VyIGN1c3RvbSBzZWxlY3RvciByZXF1aXJlcworICAgICAgICBwYXJhbWV0ZXJzIHRvIGJlIHNldCwgeW91IGNhbiBhbHNvIG92ZXJyaWRlIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+c2V0UGFyYW1ldGVycygpPC9jb2RlPgorICAgICAgICBtZXRob2QgYW5kIGludGVycHJldCB0aGUgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgaW4gYW55IHdheSB5b3UgbGlrZS4gU2V2ZXJhbCBvZiB0aGUgY29yZQorICAgICAgICBzZWxlY3RvcnMgZGVtb25zdHJhdGUgaG93IHRvIGRvIHRoYXQgYmVjYXVzZSB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgYXMgY3VzdG9tIHNlbGVjdG9ycy48L3A+CiAKICAgICAgIDxsaT5Db3JlIFNlbGVjdG9ycwogCi0gICAgICAgIDxwPlRoZXNlIGFyZSB0aGUgc2VsZWN0b3JzIHVzZWQgYnkgQW50IGl0c2VsZi4gVG8gaW1wbGVtZW50IG9uZSBvZgotICAgICAgICB0aGVzZSwgeW91IHdpbGwgaGF2ZSB0byBhbHRlciBzb21lIG9mIHRoZSBjbGFzc2VzIGNvbnRhaW5lZCB3aXRoaW4KLSAgICAgICAgQW50LjwvcD4KKyAgICAgICAgPHA+VGhlc2UgYXJlIHRoZSBzZWxlY3RvcnMgdXNlZCBieSBBbnQgaXRzZWxmLiBUbyBpbXBsZW1lbnQgb25lIG9mIHRoZXNlLCB5b3Ugd2lsbCBoYXZlCisgICAgICAgIHRvIGFsdGVyIHNvbWUgb2YgdGhlIGNsYXNzZXMgY29udGFpbmVkIHdpdGhpbiBBbnQuPC9wPgogCiAgICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+PHA+Rmlyc3QsIGNyZWF0ZSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cwotICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjwvY29kZT4uCi0gICAgICAgICAgICBZb3UgY2FuIGVpdGhlciBjaG9vc2UgdG8gaW1wbGVtZW50IGFsbCBtZXRob2RzIHlvdXJzZWxmIGZyb20KLSAgICAgICAgICAgIHNjcmF0Y2gsIG9yIHlvdSBjYW4gZXh0ZW5kCi0gICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yPC9jb2RlPgotICAgICAgICAgICAgaW5zdGVhZCwgYSBjb252ZW5pZW5jZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHJlYXNvbmFibGUgZGVmYXVsdAotICAgICAgICAgICAgYmVoYXZpb3VyIGZvciBtYW55IG1ldGhvZHMuPC9wPgorICAgICAgICAgIDxsaT48cD5GaXJzdCwgY3JlYXRlIGEgY2xhc3MgdGhhdAorICAgICAgICAgICAgaW1wbGVtZW50cyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjwvY29kZT4uCisgICAgICAgICAgICBZb3UgY2FuIGVpdGhlciBjaG9vc2UgdG8gaW1wbGVtZW50IGFsbCBtZXRob2RzIHlvdXJzZWxmIGZyb20gc2NyYXRjaCwgb3IgeW91IGNhbgorICAgICAgICAgICAgZXh0ZW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yPC9jb2RlPgorICAgICAgICAgICAgaW5zdGVhZCwgYSBjb252ZW5pZW5jZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHJlYXNvbmFibGUgZGVmYXVsdCBiZWhhdmlvdXIgZm9yIG1hbnkKKyAgICAgICAgICAgIG1ldGhvZHMuPC9wPgogCi0gICAgICAgICAgICA8cD5UaGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgcmVxdWlyZWQuCi0gICAgICAgICAgICA8Y29kZT5wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLAotICAgICAgICAgICAgICBGaWxlIGZpbGUpPC9jb2RlPgotICAgICAgICAgICAgICBpcyB0aGUgcmVhbCBwdXJwb3NlIG9mIHRoZSB3aG9sZSBleGVyY2lzZS4gSXQgcmV0dXJucyB0cnVlCi0gICAgICAgICAgICAgIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBnaXZlbiBmaWxlIHNob3VsZCBiZQotICAgICAgICAgICAgICBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0IG9yIG5vdC48L3A+CisgICAgICAgICAgICA8cD5UaGVyZSBpcyBvbmx5IG9uZSBtZXRob2QgcmVxdWlyZWQuICA8Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlCisgICAgICAgICAgICBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSk8L2NvZGU+IGlzIHRoZSByZWFsIHB1cnBvc2Ugb2YgdGhlIHdob2xlCisgICAgICAgICAgICBleGVyY2lzZS4gSXQgcmV0dXJucyA8cT50cnVlPC9xPiBvciA8cT5mYWxzZTwvcT4gZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUKKyAgICAgICAgICAgIHNob3VsZCBiZSBzZWxlY3RlZCBmcm9tIHRoZSBsaXN0IG9yIG5vdC48L3A+CiAKLSAgICAgICAgICAgIDxwPklmIHlvdSBhcmUgdXNpbmcKLSAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3I8L2NvZGU+Ci0gICAgICAgICAgICB0aGVyZSBhcmUgYWxzbyBzb21lIHByZWRlZmluZWQgYmVoYXZpb3VycyB5b3UgY2FuIHRha2UgYWR2YW50YWdlCi0gICAgICAgICAgICBvZi4gQW55IHRpbWUgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2hlbiBzZXR0aW5nIGF0dHJpYnV0ZXMgb3IKLSAgICAgICAgICAgIGFkZGluZyB0YWdzLCB5b3UgY2FuIGNhbGwgc2V0RXJyb3IoU3RyaW5nIGVycm1zZykgYW5kIHRoZSBjbGFzcwotICAgICAgICAgICAgd2lsbCBrbm93IHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtLiBUaGVuLCBhdCB0aGUgdG9wIG9mIHlvdXIKLSAgICAgICAgICAgIDxjb2RlPmlzU2VsZWN0ZWQoKTwvY29kZT4gbWV0aG9kIGNhbGwgPGNvZGU+dmFsaWRhdGUoKTwvY29kZT4gYW5kCi0gICAgICAgICAgICBhIEJ1aWxkRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIHdpdGggdGhlIGNvbnRlbnRzIG9mIHlvdXIgZXJyb3IKLSAgICAgICAgICAgIG1lc3NhZ2UuIFRoZSA8Y29kZT52YWxpZGF0ZSgpPC9jb2RlPiBtZXRob2QgYWxzbyBnaXZlcyB5b3UgYQotICAgICAgICAgICAgbGFzdCBjaGFuY2UgdG8gY2hlY2sgeW91ciBzZXR0aW5ncyBmb3IgY29uc2lzdGVuY3kgYmVjYXVzZSBpdAotICAgICAgICAgICAgY2FsbHMgPGNvZGU+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4uIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAotICAgICAgICAgICAgY2FsbCA8Y29kZT5zZXRFcnJvcigpPC9jb2RlPiB3aXRoaW4gaXQgaWYgeW91IGRldGVjdCBhbnkKLSAgICAgICAgICAgIHByb2JsZW1zIGluIGhvdyB5b3VyIHNlbGVjdG9yIGlzIHNldCB1cC48L3A+CisgICAgICAgICAgICA8cD5JZiB5b3UgYXJlCisgICAgICAgICAgICB1c2luZyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvcjwvY29kZT4gdGhlcmUKKyAgICAgICAgICAgIGFyZSBhbHNvIHNvbWUgcHJlZGVmaW5lZCBiZWhhdmlvdXJzIHlvdSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YuIEFueSB0aW1lIHlvdSBlbmNvdW50ZXIgYQorICAgICAgICAgICAgcHJvYmxlbSB3aGVuIHNldHRpbmcgYXR0cmlidXRlcyBvciBhZGRpbmcgdGFncywgeW91IGNhbgorICAgICAgICAgICAgY2FsbCA8Y29kZSBjbGFzcz0iY29kZSI+c2V0RXJyb3IoU3RyaW5nIGVycm1zZyk8L2NvZGU+IGFuZCB0aGUgY2xhc3Mgd2lsbCBrbm93IHRoYXQKKyAgICAgICAgICAgIHRoZXJlIGlzIGEgcHJvYmxlbS4gVGhlbiwgYXQgdGhlIHRvcCBvZiB5b3VyIDxjb2RlIGNsYXNzPSJjb2RlIj5pc1NlbGVjdGVkKCk8L2NvZGU+CisgICAgICAgICAgICBtZXRob2QgY2FsbCA8Y29kZSBjbGFzcz0iY29kZSI+dmFsaWRhdGUoKTwvY29kZT4gYW5kIGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+IHdpbGwKKyAgICAgICAgICAgIGJlIHRocm93biB3aXRoIHRoZSBjb250ZW50cyBvZiB5b3VyIGVycm9yCisgICAgICAgICAgICBtZXNzYWdlLiBUaGUgPGNvZGUgY2xhc3M9ImNvZGUiPnZhbGlkYXRlKCk8L2NvZGU+IG1ldGhvZCBhbHNvIGdpdmVzIHlvdSBhIGxhc3QgY2hhbmNlIHRvCisgICAgICAgICAgICBjaGVjayB5b3VyIHNldHRpbmdzIGZvciBjb25zaXN0ZW5jeSBiZWNhdXNlIGl0CisgICAgICAgICAgICBjYWxscyA8Y29kZSBjbGFzcz0iY29kZSI+dmVyaWZ5U2V0dGluZ3MoKTwvY29kZT4uIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZAorICAgICAgICAgICAgY2FsbCA8Y29kZSBjbGFzcz0iY29kZSI+c2V0RXJyb3IoKTwvY29kZT4gd2l0aGluIGl0IGlmIHlvdSBkZXRlY3QgYW55IHByb2JsZW1zIGluIGhvdworICAgICAgICAgICAgeW91ciBzZWxlY3RvciBpcyBzZXQgdXAuPC9wPgogCi0gICAgICAgICAgICA8cD5Zb3UgbWF5IGFsc28gd2FudCB0byBvdmVycmlkZSA8Y29kZT50b1N0cmluZygpPC9jb2RlPi48L3A+CisgICAgICAgICAgICA8cD5Zb3UgbWF5IGFsc28gd2FudCB0byBvdmVycmlkZSA8Y29kZSBjbGFzcz0iY29kZSI+dG9TdHJpbmcoKTwvY29kZT4uPC9wPjwvbGk+CiAKLSAgICAgICAgICA8bGk+PHA+UHV0IGFuIDxjb2RlPmFkZDwvY29kZT4gbWV0aG9kIGZvciB5b3VyIHNlbGVjdG9yIGluCi0gICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgotICAgICAgICAgICAgVGhpcyBpcyBhbiBpbnRlcmZhY2UsIHNvIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBhZGQgYW4gaW1wbGVtZW50YXRpb24KLSAgICAgICAgICAgIGZvciB0aGUgbWV0aG9kIGluIHRoZSBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpdCwgbmFtZWx5Ci0gICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BYnN0cmFjdEZpbGVTZXQ8L2NvZGU+LAotICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTWF0Y2hpbmdUYXNrPC9jb2RlPiBhbmQKLSAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgotICAgICAgICAgICAgT25jZSBpdCBpcyBpbiB0aGVyZSwgaXQgd2lsbCBiZSBhdmFpbGFibGUgZXZlcnl3aGVyZSB0aGF0IGNvcmUKLSAgICAgICAgICAgIHNlbGVjdG9ycyBhcmUgYXBwcm9wcmlhdGUuPC9wPgorICAgICAgICAgIDxsaT5QdXQgYW4gPGNvZGUgY2xhc3M9ImNvZGUiPmFkZCgpPC9jb2RlPiBtZXRob2QgZm9yIHlvdXIgc2VsZWN0b3IKKyAgICAgICAgICAgIGluIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgorICAgICAgICAgICAgVGhpcyBpcyBhbiBpbnRlcmZhY2UsIHNvIHlvdSB3aWxsIGFsc28gaGF2ZSB0byBhZGQgYW4gaW1wbGVtZW50YXRpb24gZm9yIHRoZSBtZXRob2QgaW4KKyAgICAgICAgICAgIHRoZSBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBpdCwKKyAgICAgICAgICAgIG5hbWVseSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQWJzdHJhY3RGaWxlU2V0PC9jb2RlPiwgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hdGNoaW5nVGFzazwvY29kZT4KKyAgICAgICAgICAgIGFuZCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvckNvbnRhaW5lcjwvY29kZT4uCisgICAgICAgICAgICBPbmNlIGl0IGlzIGluIHRoZXJlLCBpdCB3aWxsIGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlIHRoYXQgY29yZSBzZWxlY3RvcnMgYXJlCisgICAgICAgICAgICBhcHByb3ByaWF0ZS48L2xpPgogICAgICAgICA8L3VsPgogCiAgICAgICA8bGk+U2VsZWN0b3IgQ29udGFpbmVycwotICAgICAgICA8cD5Hb3QgYW4gaWRlYSBmb3IgYSBuZXcgU2VsZWN0b3IgQ29udGFpbmVyPyBDcmVhdGluZyBhIG5ldyBvbmUgaXMKLSAgICAgICAgbm8gcHJvYmxlbTo8L3A+CisgICAgICAgIDxwPkdvdCBhbiBpZGVhIGZvciBhIG5ldyBTZWxlY3RvciBDb250YWluZXI/IENyZWF0aW5nIGEgbmV3IG9uZSBpcyBubyBwcm9ibGVtOjwvcD4KICAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48cD5DcmVhdGUgYSBuZXcgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCi0gICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgotICAgICAgICAgICAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdXIgbmV3Ci0gICAgICAgICAgICBDb250YWluZXIgY2FuIGFjY2VzcyBhbnkgbmV3IHNlbGVjdG9ycyB0aGF0IGNvbWUgYWxvbmcuIEFnYWluLCB0aGVyZQotICAgICAgICAgICAgaXMgYSBjb252ZW5pZW5jZSBjbGFzcyBhdmFpbGFibGUgZm9yIHlvdSBjYWxsZWQKLSAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgotICAgICAgICAgICAgPC9wPgotICAgICAgICAgIDxsaT48cD5JbXBsZW1lbnQgdGhlCi0gICAgICAgICAgICA8Y29kZT5wdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKTwvY29kZT4KLSAgICAgICAgICAgIG1ldGhvZCB0byBkbyB0aGUgcmlnaHQgdGhpbmcuIENoYW5jZXMgYXJlIHlvdSdsbCB3YW50IHRvIGl0ZXJhdGUKLSAgICAgICAgICAgIG92ZXIgdGhlIHNlbGVjdG9ycyB1bmRlciB5b3UsIHNvIHVzZQotICAgICAgICAgICAgPGNvZGU+c2VsZWN0b3JFbGVtZW50cygpPC9jb2RlPiB0byBnZXQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGRvCi0gICAgICAgICAgICB0aGF0LjwvcD4KLSAgICAgICAgICA8bGk+PHA+QWdhaW4sIHB1dCBhbiA8Y29kZT5hZGQ8L2NvZGU+IG1ldGhvZCBmb3IgeW91ciBjb250YWluZXIgaW4KLSAgICAgICAgICAgIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RvckNvbnRhaW5lcjwvY29kZT4KLSAgICAgICAgICAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb25zCi0gICAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BYnN0cmFjdEZpbGVTZXQ8L2NvZGU+IGFuZAotICAgICAgICAgICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvckNvbnRhaW5lcjwvY29kZT4uCi0gICAgICAgICAgICA8L3A+CisgICAgICAgICAgPGxpPkNyZWF0ZSBhIG5ldyBjbGFzcyB0aGF0CisgICAgICAgICAgICBpbXBsZW1lbnRzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LgorICAgICAgICAgICAgVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHlvdXIgbmV3IENvbnRhaW5lciBjYW4gYWNjZXNzIGFueSBuZXcgc2VsZWN0b3JzIHRoYXQgY29tZQorICAgICAgICAgICAgYWxvbmcuIEFnYWluLCB0aGVyZSBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIGF2YWlsYWJsZSBmb3IgeW91CisgICAgICAgICAgICBjYWxsZWQgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JDb250YWluZXI8L2NvZGU+LjwvbGk+CisgICAgICAgICAgPGxpPkltcGxlbWVudCB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPnB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoU3RyaW5nIGZpbGVuYW1lLCBGaWxlCisgICAgICAgICAgICBmaWxlKTwvY29kZT4gbWV0aG9kIHRvIGRvIHRoZSByaWdodCB0aGluZy4gQ2hhbmNlcyBhcmUgeW91J2xsIHdhbnQgdG8gaXRlcmF0ZSBvdmVyIHRoZQorICAgICAgICAgICAgc2VsZWN0b3JzIHVuZGVyIHlvdSwgc28gdXNlIDxjb2RlIGNsYXNzPSJjb2RlIj5zZWxlY3RvckVsZW1lbnRzKCk8L2NvZGU+IHRvIGdldCBhbgorICAgICAgICAgICAgaXRlcmF0b3IgdGhhdCB3aWxsIGRvIHRoYXQuPC9saT4KKyAgICAgICAgICA8bGk+QWdhaW4sIHB1dCBhbiA8Y29kZSBjbGFzcz0iY29kZSI+YWRkKCk8L2NvZGU+IG1ldGhvZCBmb3IgeW91ciBjb250YWluZXIKKyAgICAgICAgICAgIGluIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI8L2NvZGU+IGFuZAorICAgICAgICAgICAgaXRzIGltcGxlbWVudGF0aW9ucyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQWJzdHJhY3RGaWxlU2V0PC9jb2RlPgorICAgICAgICAgICAgYW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yQ29udGFpbmVyPC9jb2RlPi48L2xpPgogICAgICAgICA8L3VsPgogICAgIDwvb2w+CiAKICAgICA8aDM+VGVzdGluZyBTZWxlY3RvcnM8L2gzPgogCi0gICAgPHA+Rm9yIGEgcm9idXN0IGNvbXBvbmVudCAoYW5kIHNlbGVjdG9ycyBhcmUgKFByb2plY3QpQ29tcG9uZW50cykgdGVzdHMgYXJlCi0gICAgbmVjZXNzYXJ5LiBGb3IgdGVzdGluZyBUYXNrcyB3ZSB1c2UgSlVuaXQgVGVzdENhc2VzIC0gbW9yZSBzcGVjaWZpYwotICAgIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlIGV4dGVuZHMgb3JnLmp1bml0LnJ1bGVzLkV4dGVybmFsUmVzb3VyY2U8L3R0Pi4KLSAgICBTb21lIG9mIGl0cyBmZWF0dXJlcyBsaWtlIGNvbmZpZ3VyZSB0aGUgKHRlc3QpIHByb2plY3QgYnkgcmVhZGluZyBpdHMgYnVpbGRmaWxlIGFuZAotICAgIGV4ZWN1dGUgdGFyZ2V0cyB3ZSBuZWVkIGZvciBzZWxlY3RvciB0ZXN0cyBhbHNvLiBUaGVyZWZvcmUgd2UgdXNlIHRoYXQgQnVpbGRGaWxlUnVsZS4KLSAgICBCdXQgdGVzdGluZyBzZWxlY3RvcnMgcmVxdWlyZXMgc29tZSBtb3JlIHdvcms6IGhhdmluZyBhIHNldCBvZiBmaWxlcywgaW5zdGFudGlhdGUKLSAgICBhbmQgY29uZmlndXJlIHRoZSBzZWxlY3RvciwgY2hlY2sgdGhlIHNlbGVjdGlvbiB3b3JrIGFuZCBtb3JlLiBCZWNhdXNlIHdlIHVzdWFsbHkKLSAgICBleHRlbmQgPHR0PkJhc2VFeHRlbmRTZWxlY3RvcjwvdHQ+IGl0cyBmZWF0dXJlcyBoYXZlIHRvIGJlIHRlc3RlZCBhbHNvIChlLmcuIHNldEVycm9yKCkpLgotICAgIDwvcD4KKyAgICA8cD5Gb3IgYSByb2J1c3QgY29tcG9uZW50IChhbmQgc2VsZWN0b3JzIGFyZSAoUHJvamVjdClDb21wb25lbnRzKSB0ZXN0cyBhcmUgbmVjZXNzYXJ5LiBGb3IKKyAgICB0ZXN0aW5nIFRhc2tzIHdlIHVzZSBKVW5pdCBUZXN0cyBhbmQgUnVsZXMmbWRhc2g7bW9yZQorICAgIHNwZWNpZmljIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlIGV4dGVuZHMKKyAgICBvcmcuanVuaXQucnVsZXMuRXh0ZXJuYWxSZXNvdXJjZTwvY29kZT4uICBTb21lIG9mIGl0cyBmZWF0dXJlcyBsaWtlIGNvbmZpZ3VyZSB0aGUgKHRlc3QpIHByb2plY3QKKyAgICBieSByZWFkaW5nIGl0cyBidWlsZGZpbGUgYW5kIGV4ZWN1dGUgdGFyZ2V0cyB3ZSBuZWVkIGZvciBzZWxlY3RvciB0ZXN0cyBhbHNvLiBUaGVyZWZvcmUgd2UgdXNlCisgICAgdGhhdCBCdWlsZEZpbGVSdWxlLiAgQnV0IHRlc3Rpbmcgc2VsZWN0b3JzIHJlcXVpcmVzIHNvbWUgbW9yZSB3b3JrOiBoYXZpbmcgYSBzZXQgb2YgZmlsZXMsCisgICAgaW5zdGFudGlhdGUgYW5kIGNvbmZpZ3VyZSB0aGUgc2VsZWN0b3IsIGNoZWNrIHRoZSBzZWxlY3Rpb24gd29yayBhbmQgbW9yZS4gQmVjYXVzZSB3ZSB1c3VhbGx5CisgICAgZXh0ZW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5CYXNlRXh0ZW5kU2VsZWN0b3I8L2NvZGU+IGl0cyBmZWF0dXJlcyBoYXZlIHRvIGJlIHRlc3RlZCBhbHNvCisgICAgKGUuZy4gPGNvZGUgY2xhc3M9ImNvZGUiPnNldEVycm9yKCk8L2NvZGU+KS48L3A+CiAKLSAgICA8cD5UaGF0J3Mgd2h5IHdlIGhhdmUgYSB0ZXN0IHJ1bGUgZm9yIGRvaW5nIG91ciBzZWxlY3RvciB0ZXN0czoKLSAgICA8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvclJ1bGU8L3R0Pi48L3A+CisgICAgPHA+VGhhdCdzIHdoeSB3ZSBoYXZlIGEgdGVzdCBydWxlIGZvciBkb2luZyBvdXIgc2VsZWN0b3IKKyAgICB0ZXN0czogPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5CYXNlU2VsZWN0b3JSdWxlPC9jb2RlPi48L3A+CiAKLSAgICA8cD5UaGlzIGNsYXNzIGV4dGVuZHMgRXh0ZXJuYWxSZXNvdXJjZSBhbmQgdGhlcmVmb3JlIGNhbiBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mIEFudCdzCi0gICAgdW5pdCB0ZXN0cy4gSXQgaG9sZHMgYW4gaW5zdGFuY2Ugb2YgcHJlY29uZmlndXJlZCBCdWlsZEZpbGVSdWxlLiBDb25maWd1cmF0aW9uCi0gICAgaXMgZG9uZSBieSBwYXJzaW5nIHRoZSBzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMueG1sLiBCYXNlU2VsZWN0b3JSdWxlCi0gICAgdGhlbiBnaXZlcyB1cyBoZWxwZXIgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgc2VsZWN0aW9ucy4gPC9wPgorICAgIDxwPlRoaXMgY2xhc3MgZXh0ZW5kcyBFeHRlcm5hbFJlc291cmNlIGFuZCB0aGVyZWZvcmUgY2FuIGluY2x1ZGVkIGluIHRoZSBzZXQgb2YgQW50J3MgdW5pdAorICAgIHRlc3RzLiBJdCBob2xkcyBhbiBpbnN0YW5jZSBvZiBwcmVjb25maWd1cmVkIEJ1aWxkRmlsZVJ1bGUuIENvbmZpZ3VyYXRpb24gaXMgZG9uZSBieSBwYXJzaW5nCisgICAgdGhlIDxzYW1wPnNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWw8L3NhbXA+LiBCYXNlU2VsZWN0b3JSdWxlIHRoZW4gZ2l2ZXMgdXMKKyAgICBoZWxwZXIgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbXVsdGlwbGUgc2VsZWN0aW9ucy48L3A+CiAKLSAgICA8cD5CZWNhdXNlIHRoZSB0ZXJtICJ0ZXN0Y2FzZSIgb3IgInRlc3RlbnZpcm9ubWVudCIgYXJlIHNvIG9mdGVuIHVzZWQsIHRoaXMKLSAgICBzcGVjaWFsIHRlc3RlbnZpcm9ubWVudCBnb3QgYSBuZXcgbmFtZTogPGk+YmVkPC9pPi4gVGhlIHNldHVwIGFuZCBjbGVhbnVwIG9mCi0gICAgdGhlIGJlZCBpcyBhbGwgaGFuZGxlZCBieSB0aGUgQmFzZVNlbGVjdG9yUnVsZSBzbyBhbnkgdGVzdCBvbmx5IGhhcyB0byBoYW5kbGUKLSAgICB0aGUgYWN0dWFsIHRlc3Qgc2NlbmFyaW9zPC9wPgorICAgIDxwPkJlY2F1c2UgdGhlIHRlcm0gInRlc3RjYXNlIiBvciAidGVzdGVudmlyb25tZW50IiBhcmUgc28gb2Z0ZW4gdXNlZCwgdGhpcyBzcGVjaWFsCisgICAgdGVzdGVudmlyb25tZW50IGdvdCBhIG5ldyBuYW1lOiA8ZW0+YmVkPC9lbT4uIFRoZSBzZXR1cCBhbmQgY2xlYW51cCBvZiB0aGUgYmVkIGlzIGFsbAorICAgIGhhbmRsZWQgYnkgdGhlIEJhc2VTZWxlY3RvclJ1bGUgc28gYW55IHRlc3Qgb25seSBoYXMgdG8gaGFuZGxlIHRoZSBhY3R1YWwgdGVzdCBzY2VuYXJpb3M8L3A+CiAKICAgICA8cD5BIHVzdWFsIHRlc3Qgc2NlbmFyaW8gaXM6PC9wPgogICAgIDxvbD4KQEAgLTE2OSw5ICsxNTAsOCBAQAogICAgICAgIDxsaT52ZXJpZnkgdGhlIHdvcms8L2xpPgogICAgIDwvb2w+CiAKLQotCi0gICAgPHA+QW4gZXhhbXBsZSB0ZXN0IHdvdWxkIGJlOjxwcmU+CisgICAgPHA+QW4gZXhhbXBsZSB0ZXN0IHdvdWxkIGJlOjwvcD4KKyAgICA8cHJlPgogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKIHB1YmxpYyBjbGFzcyBNeVNlbGVjdG9yVGVzdCB7CkBAIC0xODIsNyArMTYyLDYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlMSgpIHsKIAotCiAgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VsZWN0b3IKICAgICAgICAgTXlTZWxlY3RvciBzID0gbmV3IE15U2VsZWN0b3IoKTsKICAgICAgICAgcy5hZGRQYXJhbSgia2V5MSIsICJ2YWx1ZTEiKTsKQEAgLTE5Myw1MiArMTcyLDQ0IEBACiAgICAgICAgIC8vIGRvIHRoZSB0ZXN0cwogICAgICAgICBhc3NlcnRFcXVhbHMoIkZUVFRUVFRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KLX0KLSAgICA8L3ByZT4KLSAgICBBcyBhbiBleGFtcGxlIG9mIGFuIGVycm9yIEpVbml0IGNvdWxkIGxvZzxwcmU+Ci0gICAgW2p1bml0XSAgICAgRkFJTEVECi0gICAgW2p1bml0XSBFcnJvciBmb3IgZmlsZXM6IDxmb250IGNvbG9yPWJsdWU+Ljtjb3B5LmZpbHRlcnNldC5maWx0ZXJlZDt0YXIvZ3ovYXNmLWxvZ28uZ2lmLnRhci5nejwvZm9udD4KLSAgICBbanVuaXRdIGV4cGVjdGVkOiZsdDs8Zm9udCBjb2xvcj1ibHVlPkZUVFRGVFRURi4uLjwvZm9udD4mZ3Q7IGJ1dCB3YXM6Jmx0O1RUVFRUVFRUVC4uLiZndDsKLSAgICBbanVuaXRdIGp1bml0LmZyYW1ld29yay5Db21wYXJpc29uRmFpbHVyZTogRXJyb3IgZm9yIGZpbGVzOiAuO2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkO3Rhci9nei9hc2YtbG9nby5naWYudGFyLmd6Ci0gICAgW2p1bml0XSBleHBlY3RlZDombHQ7RlRUVEZUVFRGLi4uJmd0OyBidXQgd2FzOiZsdDtUVFRUVFRUVFQuLi4mZ3Q7Ci0gICAgW2p1bml0XSAgICAgYXQganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6ODEpCi0gICAgW2p1bml0XSAgICAgYXQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkJhc2VTZWxlY3RvclRlc3QucGVyZm9ybVRlc3QoQmFzZVNlbGVjdG9yVGVzdC5qYXZhOjE5NCkKLSAgICA8L3ByZT48L3A+Cit9PC9wcmU+CisgICAgPHA+QXMgYW4gZXhhbXBsZSBvZiBhbiBlcnJvciBKVW5pdCBjb3VsZCBsb2c8L3A+CisgICAgPHByZT4KK1tqdW5pdF0gICAgIEZBSUxFRAorW2p1bml0XSBFcnJvciBmb3IgZmlsZXM6IDxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj4uO2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkO3Rhci9nei9hc2YtbG9nby5naWYudGFyLmd6PC9zcGFuPgorW2p1bml0XSBleHBlY3RlZDombHQ7PHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkZUVFRGVFRURi4uLjwvc3Bhbj4mZ3Q7IGJ1dCB3YXM6Jmx0O1RUVFRUVFRUVC4uLiZndDsKK1tqdW5pdF0ganVuaXQuZnJhbWV3b3JrLkNvbXBhcmlzb25GYWlsdXJlOiBFcnJvciBmb3IgZmlsZXM6IC47Y29weS5maWx0ZXJzZXQuZmlsdGVyZWQ7dGFyL2d6L2FzZi1sb2dvLmdpZi50YXIuZ3oKK1tqdW5pdF0gZXhwZWN0ZWQ6Jmx0O0ZUVFRGVFRURi4uLiZndDsgYnV0IHdhczombHQ7VFRUVFRUVFRULi4uJmd0OworW2p1bml0XSAgICAgYXQganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHMoQXNzZXJ0LmphdmE6ODEpCitbanVuaXRdICAgICBhdCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuQmFzZVNlbGVjdG9yVGVzdC5wZXJmb3JtVGVzdChCYXNlU2VsZWN0b3JUZXN0LmphdmE6MTk0KTwvcHJlPgogCi0gICAgPHA+RGVzY3JpYmVkIGFib3ZlIHRoZSB0ZXN0IGNsYXNzIHNob3VsZCBwcm92aWRlIGEgPHR0PmdldEluc3RhbmNlKCk8L3R0PgotICAgIG1ldGhvZC4gQnV0IHRoYXQgaXNuJ3QgdXNlZCBoZXJlLiBUaGUgdXNlZCA8dHQ+Z2V0U2VsZWN0b3IoKTwvdHQ+IG1ldGhvZCBpcwotICAgIGltcGxlbWVudGVkIGluIHRoZSBiYXNlIGNsYXNzIGFuZCBnaXZlcyBhbiBpbnN0YW5jZSBvZiBhbiBBbnQgUHJvamVjdCB0bwotICAgIHRoZSBzZWxlY3Rvci4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW5zaWRlIG5vcm1hbCBidWlsZCBmaWxlIHJ1bnMsIGJ1dCBub3QKLSAgICBpbnNpZGUgdGhpcyBzcGVjaWFsIGVudmlyb25tZW50LCBzbyB0aGlzIG1ldGhvZCBnaXZlcyB0aGUgc2VsZWN0b3IgdGhlCi0gICAgYWJpbGl0eSB0byB1c2UgaXRzIG93biBQcm9qZWN0IG9iamVjdCAoPHR0PmdldFByb2plY3QoKTwvdHQ+KSwgZm9yIGV4YW1wbGUKLSAgICBmb3IgbG9nZ2luZy48L3A+Ci0KKyAgICA8cD5EZXNjcmliZWQgYWJvdmUgdGhlIHRlc3QgY2xhc3Mgc2hvdWxkIHByb3ZpZGUgYSA8Y29kZSBjbGFzcz0iY29kZSI+Z2V0SW5zdGFuY2UoKTwvY29kZT4KKyAgICBtZXRob2QuIEJ1dCB0aGF0IGlzbid0IHVzZWQgaGVyZS4gVGhlIHVzZWQgPGNvZGUgY2xhc3M9ImNvZGUiPmdldFNlbGVjdG9yKCk8L2NvZGU+IG1ldGhvZCBpcworICAgIGltcGxlbWVudGVkIGluIHRoZSBiYXNlIGNsYXNzIGFuZCBnaXZlcyBhbiBpbnN0YW5jZSBvZiBhbiBBbnQgUHJvamVjdCB0byB0aGUgc2VsZWN0b3IuIFRoaXMgaXMKKyAgICB1c3VhbGx5IGRvbmUgaW5zaWRlIG5vcm1hbCBidWlsZCBmaWxlIHJ1bnMsIGJ1dCBub3QgaW5zaWRlIHRoaXMgc3BlY2lhbCBlbnZpcm9ubWVudCwgc28gdGhpcworICAgIG1ldGhvZCBnaXZlcyB0aGUgc2VsZWN0b3IgdGhlIGFiaWxpdHkgdG8gdXNlIGl0cyBvd24gUHJvamVjdCBvYmplY3QKKyAgICAoPGNvZGUgY2xhc3M9ImNvZGUiPmdldFByb2plY3QoKTwvY29kZT4pLCBmb3IgZXhhbXBsZSBmb3IgbG9nZ2luZy48L3A+CiAKICAgICA8aDM+TG9nZ2luZzwvaDM+CiAKLSAgICA8cD5EdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIG1heWJlIGxhdGVyIHlvdSBzb21ldGltZXMgbmVlZCB0aGUgb3V0cHV0IG9mIGluZm9ybWF0aW9uLgotICAgIFRoZXJlZm9yZSBMb2dnaW5nIGlzIG5lZWRlZC4gQmVjYXVzZSB0aGUgc2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3Igb3IgZGlyZWN0bHkKLSAgICBCYXNlU2VsZWN0b3IgaXQgaXMgYW4gQW50IDx0dD5EYXRhVHlwZTwvdHQ+IGFuZCB0aGVyZWZvcmUgYSA8dHQ+UHJvamVjdENvbXBvbmVudDwvdHQ+LiA8YnI+Ci0gICAgVGhhdCBtZWFucyB0aGF0IHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgcHJvamVjdCBvYmplY3QgYW5kIGl0cyBsb2dnaW5nIGNhcGFiaWxpdHkuCi0gICAgPHR0PlByb2plY3RDb21wb25lbnQ8L3R0PiBpdHNlbGYgcHJvdmlkZXMgPGk+bG9nPC9pPiBtZXRob2RzIHdoaWNoIHdpbGwgZG8gdGhlCi0gICAgYWNjZXNzIHRvIHRoZSBwcm9qZWN0IGluc3RhbmNlLiBMb2dnaW5nIGlzIHRoZXJlZm9yZSBkb25lIHNpbXBseSB3aXRoOgotICAgIDxwcmU+Ci0gICAgICAgIGxvZyggIm1lc3NhZ2UiICk7Ci0gICAgPC9wcmU+Ci0gICAgb3IKLSAgICA8cHJlPgotICAgICAgICBsb2coICJtZXNzYWdlIiAsIGxvZ2xldmVsICk7Ci0gICAgPC9wcmU+Ci0gICAgd2hlcmUgdGhlIDx0dD5sb2dsZXZlbDwvdHQ+IGlzIG9uZSBvZiB0aGUgdmFsdWVzIDx1bD4KLSAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0VSUiA8L2xpPgotICAgIDxsaT4gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfV0FSTiA8L2xpPgotICAgIDxsaT4gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfSU5GTyAgKD0gZGVmYXVsdCkgPC9saT4KLSAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX1ZFUkJPU0UgPC9saT4KLSAgICA8bGk+IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0RFQlVHIDwvbGk+CisgICAgPHA+RHVyaW5nIGRldmVsb3BtZW50IGFuZCBtYXliZSBsYXRlciB5b3Ugc29tZXRpbWVzIG5lZWQgdGhlIG91dHB1dCBvZiBpbmZvcm1hdGlvbi4gIFRoZXJlZm9yZQorICAgIExvZ2dpbmcgaXMgbmVlZGVkLiBCZWNhdXNlIHRoZSBzZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciBvciBkaXJlY3RseSBCYXNlU2VsZWN0b3IgaXQKKyAgICBpcyBhbiBBbnQgPGNvZGUgY2xhc3M9ImNvZGUiPkRhdGFUeXBlPC9jb2RlPiBhbmQgdGhlcmVmb3JlCisgICAgYSA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdENvbXBvbmVudDwvY29kZT4uPGJyLz4gIFRoYXQgbWVhbnMgdGhhdCB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhlCisgICAgcHJvamVjdCBvYmplY3QgYW5kIGl0cyBsb2dnaW5nIGNhcGFiaWxpdHkuICA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdENvbXBvbmVudDwvY29kZT4gaXRzZWxmCisgICAgcHJvdmlkZXMgPGNvZGUgY2xhc3M9ImNvZGUiPmxvZygpPC9jb2RlPiBtZXRob2RzIHdoaWNoIHdpbGwgZG8gdGhlIGFjY2VzcyB0byB0aGUgcHJvamVjdAorICAgIGluc3RhbmNlLiBMb2dnaW5nIGlzIHRoZXJlZm9yZSBkb25lIHNpbXBseSB3aXRoOjwvcD4KKyAgICA8cHJlPmxvZygibWVzc2FnZSIpOzwvcHJlPgorICAgIDxwPm9yPC9wPgorICAgIDxwcmU+bG9nKCJtZXNzYWdlIiwgbG9nbGV2ZWwpOzwvcHJlPgorICAgIDxwPndoZXJlIHRoZSA8Y29kZT5sb2dsZXZlbDwvY29kZT4gaXMgb25lIG9mIHRoZSB2YWx1ZXM8L3A+CisgICAgPHVsPgorICAgICAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Lk1TR19FUlI8L2NvZGU+PC9saT4KKyAgICAgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdC5NU0dfV0FSTjwvY29kZT48L2xpPgorICAgICAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Lk1TR19JTkZPPC9jb2RlPiAoZGVmYXVsdCk8L2xpPgorICAgICAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Lk1TR19WRVJCT1NFPC9jb2RlPjwvbGk+CisgICAgICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0RFQlVHPC9jb2RlPjwvbGk+CiAgICAgPC91bD4KLSAgICA8L3A+CiAKLSAgICAKICAgPC9ib2R5PgotCiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvVHlwZXMvc2VsZWN0b3JzLmh0bWwgYi9tYW51YWwvVHlwZXMvc2VsZWN0b3JzLmh0bWwKaW5kZXggZjYyMmU3Mi4uNjAwN2MzZSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL3NlbGVjdG9ycy5odG1sCisrKyBiL21hbnVhbC9UeXBlcy9zZWxlY3RvcnMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDkgKzE1LDggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KICAgPGhlYWQ+Ci0gICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiAgICAgPHRpdGxlPlNlbGVjdG9ycyBpbiBBcGFjaGUgQW50PC90aXRsZT4KICAgPC9oZWFkPgpAQCAtMjQsMTIwNCArMjQsMTE0NSBAQAogICA8Ym9keT4KICAgICA8aDI+U2VsZWN0b3JzPC9oMj4KIAotICAgIDxwPlNlbGVjdG9ycyBhcmUgYSBtZWNoYW5pc20gd2hlcmVieSB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIGEKLSAgICA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+IGNhbiBiZSBzZWxlY3RlZCBiYXNlZCBvbiBjcml0ZXJpYQotICAgIG90aGVyIHRoYW4gZmlsZW5hbWUgYXMgcHJvdmlkZWQgYnkgdGhlIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4KLSAgICBhbmQgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPiB0YWdzLjwvcD4KKyAgICA8cD5TZWxlY3RvcnMgYXJlIGEgbWVjaGFuaXNtIHdoZXJlYnkgdGhlIGZpbGVzIHRoYXQgbWFrZSB1cCBhIDxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT4gY2FuCisgICAgYmUgc2VsZWN0ZWQgYmFzZWQgb24gY3JpdGVyaWEgb3RoZXIgdGhhbiBmaWxlbmFtZSBhcyBwcm92aWRlZCBieQorICAgIHRoZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IHRhZ3MuPC9wPgogCiAgICAgPGgzPkhvdyB0byB1c2UgYSBTZWxlY3RvcjwvaDM+CiAKLSAgICA8cD5BIHNlbGVjdG9yIGlzIGFuIGVsZW1lbnQgb2YgRmlsZVNldCwgYW5kIGFwcGVhcnMgd2l0aGluIGl0LiBJdCBjYW4KLSAgICBhbHNvIGJlIGRlZmluZWQgb3V0c2lkZSBvZiBhbnkgdGFyZ2V0IGJ5IHVzaW5nIHRoZSA8Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcKLSAgICBhbmQgdGhlbiB1c2luZyBpdCBhcyBhIHJlZmVyZW5jZS4KLSAgICA8L3A+CisgICAgPHA+QSBzZWxlY3RvciBpcyBhbiBlbGVtZW50IG9mIEZpbGVTZXQsIGFuZCBhcHBlYXJzIHdpdGhpbiBpdC4gSXQgY2FuIGFsc28gYmUgZGVmaW5lZCBvdXRzaWRlIG9mCisgICAgYW55IHRhcmdldCBieSB1c2luZyB0aGUgPGNvZGU+Jmx0O3NlbGVjdG9yJmd0OzwvY29kZT4gdGFnIGFuZCB0aGVuIHVzaW5nIGl0IGFzIGEgcmVmZXJlbmNlLjwvcD4KIAotICAgIDxwPkRpZmZlcmVudCBzZWxlY3RvcnMgaGF2ZSBkaWZmZXJlbnQgYXR0cmlidXRlcy4gU29tZSBzZWxlY3RvcnMgY2FuCi0gICAgY29udGFpbiBvdGhlciBzZWxlY3RvcnMsIGFuZCB0aGVzZSBhcmUgY2FsbGVkCi0gICAgPGEgaHJlZj0iI3NlbGVjdGNvbnRhaW5lcnMiPjxjb2RlPlNlbGVjdG9yIENvbnRhaW5lcnM8L2NvZGU+PC9hPi4KLSAgICBUaGVyZSBpcyBhbHNvIGEgY2F0ZWdvcnkgb2Ygc2VsZWN0b3JzIHRoYXQgYWxsb3cKLSAgICB1c2VyLWRlZmluZWQgZXh0ZW5zaW9ucywgY2FsbGVkCi0gICAgPGEgaHJlZj0iI2N1c3RvbXNlbGVjdCI+PGNvZGU+Q3VzdG9tIFNlbGVjdG9yczwvY29kZT48L2E+LgotICAgIFRoZSBvbmVzIGJ1aWx0IGluIHRvIEFwYWNoZSBBbnQgYXJlIGNhbGxlZAotICAgIDxhIGhyZWY9IiNjb3Jlc2VsZWN0Ij48Y29kZT5Db3JlIFNlbGVjdG9yczwvY29kZT48L2E+LgotICAgIDwvcD4KKyAgICA8cD5EaWZmZXJlbnQgc2VsZWN0b3JzIGhhdmUgZGlmZmVyZW50IGF0dHJpYnV0ZXMuIFNvbWUgc2VsZWN0b3JzIGNhbiBjb250YWluIG90aGVyIHNlbGVjdG9ycywKKyAgICBhbmQgdGhlc2UgYXJlIGNhbGxlZCA8YSBocmVmPSIjc2VsZWN0Y29udGFpbmVycyI+PHE+U2VsZWN0b3IgQ29udGFpbmVyczwvcT48L2E+LiAgVGhlcmUgaXMgYWxzbworICAgIGEgY2F0ZWdvcnkgb2Ygc2VsZWN0b3JzIHRoYXQgYWxsb3cgdXNlci1kZWZpbmVkIGV4dGVuc2lvbnMsCisgICAgY2FsbGVkIDxhIGhyZWY9IiNjdXN0b21zZWxlY3QiPjxxPkN1c3RvbSBTZWxlY3RvcnM8L3E+PC9hPi4gIFRoZSBvbmVzIGJ1aWx0IGluIHRvIEFwYWNoZSBBbnQgYXJlCisgICAgY2FsbGVkIDxhIGhyZWY9IiNjb3Jlc2VsZWN0Ij48cT5Db3JlIFNlbGVjdG9yczwvcT48L2E+LjwvcD4KIAotICAgIDxoMz48YSBuYW1lPSJjb3Jlc2VsZWN0Ij5Db3JlIFNlbGVjdG9yczwvYT48L2gzPgorICAgIDxoMyBpZD0iY29yZXNlbGVjdCI+Q29yZSBTZWxlY3RvcnM8L2gzPgogCi0gICAgPHA+Q29yZSBzZWxlY3RvcnMgYXJlIHRoZSBvbmVzIHRoYXQgY29tZSBzdGFuZGFyZAotICAgIHdpdGggQW50LiBUaGV5IGNhbiBiZSB1c2VkIHdpdGhpbiBhIGZpbGVzZXQgYW5kIGNhbiBiZSBjb250YWluZWQKLSAgICB3aXRoaW4gU2VsZWN0b3IgQ29udGFpbmVycy48L3A+CisgICAgPHA+Q29yZSBzZWxlY3RvcnMgYXJlIHRoZSBvbmVzIHRoYXQgY29tZSBzdGFuZGFyZCB3aXRoIEFudC4gVGhleSBjYW4gYmUgdXNlZCB3aXRoaW4gYQorICAgIGZpbGVzZXQgYW5kIGNhbiBiZSBjb250YWluZWQgd2l0aGluIFNlbGVjdG9yIENvbnRhaW5lcnMuPC9wPgogCiAgICAgPHA+VGhlIGNvcmUgc2VsZWN0b3JzIGFyZTo8L3A+CiAKICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iI2NvbnRhaW5zc2VsZWN0Ij48Y29kZT4mbHQ7Y29udGFpbnMmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QKLSAgICAgICAgZmlsZXMgdGhhdCBjb250YWluIGEgcGFydGljdWxhciB0ZXh0IHN0cmluZzwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iI2RhdGVzZWxlY3QiPjxjb2RlPiZsdDtkYXRlJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzCi0gICAgICAgIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgYSBwYXJ0aWN1bGFyIGRhdGUKLSAgICAgICAgYW5kIHRpbWU8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiNkZXBlbmRzZWxlY3QiPjxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMKLSAgICAgICAgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQgbW9yZSByZWNlbnRseSB0aGFuIGVxdWl2YWxlbnQgZmlsZXMKLSAgICAgICAgZWxzZXdoZXJlPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjZGVwdGhzZWxlY3QiPjxjb2RlPiZsdDtkZXB0aCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdCBmaWxlcwotICAgICAgICB0aGF0IGFwcGVhciBzbyBtYW55IGRpcmVjdG9yaWVzIGRvd24gaW4gYSBkaXJlY3RvcnkgdHJlZTwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVudHNlbGVjdCI+PGNvZGU+Jmx0O2RpZmZlcmVudCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdCBmaWxlcwotICAgICAgICB0aGF0IGFyZSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBlbHNld2hlcmU8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiNmaWxlbmFtZXNlbGVjdCI+PGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0Ci0gICAgICAgIGZpbGVzIHdob3NlIG5hbWUgbWF0Y2hlcyBhIHBhcnRpY3VsYXIgcGF0dGVybi4gRXF1aXZhbGVudCB0bwotICAgICAgICB0aGUgaW5jbHVkZSBhbmQgZXhjbHVkZSBlbGVtZW50cyBvZiBhIHBhdHRlcm5zZXQuPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjcHJlc2VudHNlbGVjdCI+PGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QKLSAgICAgICAgZmlsZXMgdGhhdCBlaXRoZXIgZG8gb3IgZG8gbm90IGV4aXN0IGluIHNvbWUgb3RoZXIgbG9jYXRpb248L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiNyZWdleHBzZWxlY3QiPjxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+PC9hPiAtIFNlbGVjdAotICAgICAgICBmaWxlcyB0aGF0IG1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjc2l6ZXNlbGVjdCI+PGNvZGU+Jmx0O3NpemUmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMKLSAgICAgICAgdGhhdCBhcmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiBhIHBhcnRpY3VsYXIgbnVtYmVyIG9mIGJ5dGVzLjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iI3R5cGVzZWxlY3QiPjxjb2RlPiZsdDt0eXBlJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzCi0gICAgICAgIHRoYXQgYXJlIGVpdGhlciByZWd1bGFyIGZpbGVzIG9yIGRpcmVjdG9yaWVzLjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iI21vZGlmaWVkIj48Y29kZT4mbHQ7bW9kaWZpZWQmZ3Q7PC9jb2RlPjwvYT4gLSBTZWxlY3QgZmlsZXMgaWYKLSAgICAgICAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgY29uZmlndXJlZCBhbGdvcml0aG0gaXMgZGlmZmVyZW50IGZyb20gdGhhdAotICAgICAgICBzdG9yZWQgaW4gYSBjYWNoZS48L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiNzaWduZWRzZWxlY3RvciI+PGNvZGU+Jmx0O3NpZ25lZHNlbGVjdG9yJmd0OzwvY29kZT48L2E+IC0gU2VsZWN0IGZpbGVzIGlmCi0gICAgICAgIHRoZXkgYXJlIHNpZ25lZCwgYW5kIG9wdGlvbmFsbHkgaWYgdGhleSBoYXZlIGEgc2lnbmF0dXJlIG9mIGEgY2VydGFpbiBuYW1lLgotICAgICAgPC9saT4KLSAgICAgIDxsaT48YSBocmVmPSIjc2NyaXB0c2VsZWN0b3IiPjxjb2RlPiZsdDtzY3JpcHRzZWxlY3RvciZndDs8L2NvZGU+PC9hPiAtIAotICAgICAgICBVc2UgYSBCU0Ygb3IgSlNSIDIyMyBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gY3JlYXRlCi0gICAgICAgIHlvdXIgb3duIHNlbGVjdG9yCi0gICAgICA8L2xpPgotICAgICAgPGxpPjxhIGhyZWY9IiNyZWFkYWJsZSI+PGNvZGU+Jmx0O3JlYWRhYmxlJmd0OzwvY29kZT48L2E+IC0KLSAgICAgICAgU2VsZWN0IGZpbGVzIGlmIHRoZXkgYXJlIHJlYWRhYmxlLjwvbGk+Ci0gICAgICA8bGk+PGEgaHJlZj0iI3dyaXRhYmxlIj48Y29kZT4mbHQ7d3JpdGFibGUmZ3Q7PC9jb2RlPjwvYT4gLQotICAgICAgICBTZWxlY3QgZmlsZXMgaWYgdGhleSBhcmUgd3JpdGFibGUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjY29udGFpbnNzZWxlY3QiPjxjb2RlPiZsdDtjb250YWlucyZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgdGhhdAorICAgICAgICBjb250YWluIGEgcGFydGljdWxhciB0ZXh0IHN0cmluZzwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI2RhdGVzZWxlY3QiPjxjb2RlPiZsdDtkYXRlJmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdCBmaWxlcyB0aGF0IGhhdmUgYmVlbgorICAgICAgICBtb2RpZmllZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGEgcGFydGljdWxhciBkYXRlIGFuZCB0aW1lPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjZGVwZW5kc2VsZWN0Ij48Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdCBmaWxlcyB0aGF0IGhhdmUgYmVlbgorICAgICAgICBtb2RpZmllZCBtb3JlIHJlY2VudGx5IHRoYW4gZXF1aXZhbGVudCBmaWxlcyBlbHNld2hlcmU8L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNkZXB0aHNlbGVjdCI+PGNvZGU+Jmx0O2RlcHRoJmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdCBmaWxlcyB0aGF0IGFwcGVhciBzbworICAgICAgICBtYW55IGRpcmVjdG9yaWVzIGRvd24gaW4gYSBkaXJlY3RvcnkgdHJlZTwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI2RpZmZlcmVudHNlbGVjdCI+PGNvZGU+Jmx0O2RpZmZlcmVudCZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgdGhhdCBhcmUKKyAgICAgICAgZGlmZmVyZW50IGZyb20gdGhvc2UgZWxzZXdoZXJlPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjZmlsZW5hbWVzZWxlY3QiPjxjb2RlPiZsdDtmaWxlbmFtZSZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgd2hvc2UgbmFtZQorICAgICAgICBtYXRjaGVzIGEgcGFydGljdWxhciBwYXR0ZXJuLiBFcXVpdmFsZW50IHRvIHRoZSBpbmNsdWRlIGFuZCBleGNsdWRlIGVsZW1lbnRzIG9mIGEKKyAgICAgICAgcGF0dGVybnNldC48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNwcmVzZW50c2VsZWN0Ij48Y29kZT4mbHQ7cHJlc2VudCZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgdGhhdCBlaXRoZXIKKyAgICAgICAgZG8gb3IgZG8gbm90IGV4aXN0IGluIHNvbWUgb3RoZXIgbG9jYXRpb248L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNyZWdleHBzZWxlY3QiPjxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgdGhhdAorICAgICAgICBtYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI3NpemVzZWxlY3QiPjxjb2RlPiZsdDtzaXplJmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdCBmaWxlcyB0aGF0IGFyZSBsYXJnZXIgb3IKKyAgICAgICAgc21hbGxlciB0aGFuIGEgcGFydGljdWxhciBudW1iZXIgb2YgYnl0ZXMuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjdHlwZXNlbGVjdCI+PGNvZGU+Jmx0O3R5cGUmZ3Q7PC9jb2RlPjwvYT4mbWRhc2g7U2VsZWN0IGZpbGVzIHRoYXQgYXJlIGVpdGhlcgorICAgICAgICByZWd1bGFyIGZpbGVzIG9yIGRpcmVjdG9yaWVzLjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI21vZGlmaWVkIj48Y29kZT4mbHQ7bW9kaWZpZWQmZ3Q7PC9jb2RlPjwvYT4mbWRhc2g7U2VsZWN0IGZpbGVzIGlmIHRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgb2YgdGhlIGNvbmZpZ3VyZWQgYWxnb3JpdGhtIGlzIGRpZmZlcmVudCBmcm9tIHRoYXQgc3RvcmVkIGluIGEgY2FjaGUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjc2lnbmVkc2VsZWN0b3IiPjxjb2RlPiZsdDtzaWduZWRzZWxlY3RvciZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgaWYKKyAgICAgICAgdGhleSBhcmUgc2lnbmVkLCBhbmQgb3B0aW9uYWxseSBpZiB0aGV5IGhhdmUgYSBzaWduYXR1cmUgb2YgYSBjZXJ0YWluIG5hbWUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjc2NyaXB0c2VsZWN0b3IiPjxjb2RlPiZsdDtzY3JpcHRzZWxlY3RvciZndDs8L2NvZGU+PC9hPiZtZGFzaDtVc2UgYSBCU0Ygb3IgSlNSCisgICAgICAgIDIyMyBzY3JpcHRpbmcgbGFuZ3VhZ2UgdG8gY3JlYXRlIHlvdXIgb3duIHNlbGVjdG9yPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjcmVhZGFibGUiPjxjb2RlPiZsdDtyZWFkYWJsZSZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgaWYgdGhleSBhcmUKKyAgICAgICAgcmVhZGFibGUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjd3JpdGFibGUiPjxjb2RlPiZsdDt3cml0YWJsZSZndDs8L2NvZGU+PC9hPiZtZGFzaDtTZWxlY3QgZmlsZXMgaWYgdGhleSBhcmUKKyAgICAgICAgd3JpdGFibGUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjZXhlY3V0YWJsZSI+PGNvZGU+Jmx0O2V4ZWN1dGFibGUmZ3Q7PC9jb2RlPjwvYT4mbWRhc2g7U2VsZWN0IGZpbGVzIGlmIHRoZXkKKyAgICAgICAgYXJlIGV4ZWN1dGFibGUuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjc3ltbGluayI+PGNvZGU+Jmx0O3N5bWxpbmsmZ3Q7PC9jb2RlPjwvYT4mbWRhc2g7U2VsZWN0IGZpbGVzIGlmIHRoZXkgYXJlCisgICAgICAgIHN5bWxpbmtzLjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI293bmVkQnkiPjxjb2RlPiZsdDtvd25lZEJ5Jmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdCBmaWxlcyBpZiB0aGV5IGFyZSBvd25lZAorICAgICAgICBieSBhIGdpdmVuIHVzZXIuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjcG9zaXhHcm91cCI+PGNvZGU+Jmx0O3Bvc2l4R3JvdXAmZ3Q7PC9jb2RlPjwvYT4mbWRhc2g7U2VsZWN0CisgICAgICAgIGZpbGVzIGlmIHRoZXkgaGF2ZSBhIGdpdmVuIFBPU0lYIGdyb3VwLjwvbGk+CisgICAgICA8bGk+PGEgaHJlZj0iI3Bvc2l4UGVybWlzc2lvbnMiPjxjb2RlPiZsdDtwb3NpeFBlcm1pc3Npb25zJmd0OzwvY29kZT48L2E+Jm1kYXNoO1NlbGVjdAorICAgICAgICBmaWxlcyBpZiB0aGV5IGhhdmUgZ2l2ZW4gUE9TSVggcGVybWlzc2lvbnMuPC9saT4KICAgICA8L3VsPgogCi0gICAgPGg0PjxhIG5hbWU9ImNvbnRhaW5zc2VsZWN0Ij5Db250YWlucyBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxoNCBpZD0iY29udGFpbnNzZWxlY3QiPkNvbnRhaW5zIFNlbGVjdG9yPC9oND4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7Y29udGFpbnMmZ3Q7PC9jb2RlPiB0YWcgaW4gYSBGaWxlU2V0IGxpbWl0cwotICAgIHRoZSBmaWxlcyBkZWZpbmVkIGJ5IHRoYXQgZmlsZXNldCB0byBvbmx5IHRob3NlIHdoaWNoIGNvbnRhaW4gdGhlCi0gICAgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+dGV4dDwvY29kZT4gYXR0cmlidXRlLgotICAgIC48L3A+Ci0gICAgPHA+VGhlIDxjb2RlPiZsdDtjb250YWlucyZndDs8L2NvZGU+IHNlbGVjdG9yIGNhbiBiZSB1c2VkIGFzIGEKLSAgICAgIFJlc291cmNlU2VsZWN0b3IgKHNlZSB0aGUKLSAgICAgIDxhIGhyZWY9InJlc291cmNlcy5odG1sI3Jlc3RyaWN0Ij4mbHQ7cmVzdHJpY3QmZ3Q7PC9hPgotICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uKS48L3A+CisgICAgPHA+VGhlIDxjb2RlPiZsdDtjb250YWlucyZndDs8L2NvZGU+IHRhZyBpbiBhIEZpbGVTZXQgbGltaXRzIHRoZSBmaWxlcyBkZWZpbmVkIGJ5IHRoYXQgZmlsZXNldAorICAgIHRvIG9ubHkgdGhvc2Ugd2hpY2ggY29udGFpbiB0aGUgc3RyaW5nIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+dGV4dDwvY29kZT4gYXR0cmlidXRlLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2NvbnRhaW5zJmd0OzwvY29kZT4gc2VsZWN0b3IgY2FuIGJlIHVzZWQgYXMgYSBSZXNvdXJjZVNlbGVjdG9yIChzZWUKKyAgICB0aGUgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwjcmVzdHJpY3QiPiZsdDtyZXN0cmljdCZndDs8L2E+IFJlc291cmNlQ29sbGVjdGlvbikuPC9wPgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnRleHQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgdGV4dCB0aGF0IGV2ZXJ5IGZpbGUgbXVzdCBjb250YWluCisgICAgICAgIDx0ZD50ZXh0PC90ZD4KKyAgICAgICAgPHRkPlNwZWNpZmllcyB0aGUgdGV4dCB0aGF0IGV2ZXJ5IGZpbGUgbXVzdCBjb250YWluCiAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNhc2VzZW5zaXRpdmU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcGF5IGF0dGVudGlvbiB0byBjYXNlIHdoZW4gbG9va2luZwotICAgICAgICAgIGZvciB0aGUgc3RyaW5nIGluIHRoZSA8Y29kZT50ZXh0PC9jb2RlPiBhdHRyaWJ1dGUuIERlZmF1bHQgaXMKLSAgICAgICAgICB0cnVlLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmNhc2VzZW5zaXRpdmU8L3RkPgorICAgICAgICA8dGQ+V2hldGhlciB0byBwYXkgYXR0ZW50aW9uIHRvIGNhc2Ugd2hlbiBsb29raW5nIGZvciB0aGUgc3RyaW5nIGluIHRoZSA8dmFyPnRleHQ8L3Zhcj4KKyAgICAgICAgICBhdHRyaWJ1dGUuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3Jld2hpdGVzcGFjZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBlbGltaW5hdGUgd2hpdGVzcGFjZSBiZWZvcmUgY2hlY2tpbmcKLSAgICAgICAgICBmb3IgdGhlIHN0cmluZyBpbiB0aGUgPGNvZGU+dGV4dDwvY29kZT4gYXR0cmlidXRlLiBEZWZhdWx0IGlzCi0gICAgICAgICAgZmFsc2UuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+aWdub3Jld2hpdGVzcGFjZTwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIGVsaW1pbmF0ZSB3aGl0ZXNwYWNlIGJlZm9yZSBjaGVja2luZyBmb3IgdGhlIHN0cmluZyBpbiB0aGUgPHZhcj50ZXh0PC92YXI+CisgICAgICAgICAgYXR0cmlidXRlLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkVuY29kaW5nIG9mIHRoZSByZXNvdXJjZXMgYmVpbmcgc2VsZWN0ZWQuCi0gICAgICAgICAgICAgICAgUmVxdWlyZWQgaW4gcHJhY3RpY2UgaWYgdGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlcyBiZWluZwotICAgICAgICAgICAgICAgIHNlbGVjdGVkIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0IGVuY29kaW5nIG9mIHRoZSBKVk0KLSAgICAgICAgICAgICAgICB3aGVyZSBBbnQgaXMgcnVubmluZy4KLSAgICAgICAgICAgICAgICBTaW5jZSBBbnQgMS45LjAKLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KLSAgICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmVuY29kaW5nPC90ZD4KKyAgICAgICAgPHRkPkVuY29kaW5nIG9mIHRoZSByZXNvdXJjZXMgYmVpbmcgc2VsZWN0ZWQuCisgICAgICAgICAgPGVtPlNpbmNlIEFudCAxLjkuMDwvZW0+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gZGVmYXVsdCBKVk0gY2hhcmFjdGVyIGVuY29kaW5nPC90ZD4KKyAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAogICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBDb250YWlucyBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtkb2MucGF0aH0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5odG1sJnF1b3Q7Jmd0OwogICAgICZsdDtjb250YWlucyB0ZXh0PSZxdW90O3NjcmlwdCZxdW90OyBjYXNlc2Vuc2l0aXZlPSZxdW90O25vJnF1b3Q7LyZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBIVE1MIGZpbGVzIHRoYXQgY29udGFpbiB0aGUgc3RyaW5nCi0gICAgPGNvZGU+c2NyaXB0PC9jb2RlPi48L3A+CisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEhUTUwgZmlsZXMgdGhhdCBjb250YWluIHRoZSBzdHJpbmcgPGNvZGU+c2NyaXB0PC9jb2RlPi48L3A+CiAKKyAgICA8aDQgaWQ9ImRhdGVzZWxlY3QiPkRhdGUgU2VsZWN0b3I8L2g0PgogCi0gICAgPGg0PjxhIG5hbWU9ImRhdGVzZWxlY3QiPkRhdGUgU2VsZWN0b3I8L2E+PC9oND4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2RhdGUmZ3Q7PC9jb2RlPiB0YWcgaW4gYSBGaWxlU2V0IHdpbGwgcHV0IGEgbGltaXQgb24gdGhlIGZpbGVzIHNwZWNpZmllZCBieSB0aGUKKyAgICBpbmNsdWRlIHRhZywgc28gdGhhdCB0YWdzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBkb2VzIG5vdCBtZWV0IHRoZSBkYXRlIGxpbWl0cyBzcGVjaWZpZWQgYnkKKyAgICB0aGUgc2VsZWN0b3Igd2lsbCBub3QgZW5kIHVwIGJlaW5nIHNlbGVjdGVkLjwvcD4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGF0ZSZndDs8L2NvZGU+IHRhZyBpbiBhIEZpbGVTZXQgd2lsbCBwdXQKLSAgICBhIGxpbWl0IG9uIHRoZSBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlIGluY2x1ZGUgdGFnLCBzbyB0aGF0IHRhZ3MKLSAgICB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgZG9lcyBub3QgbWVldCB0aGUgZGF0ZSBsaW1pdHMgc3BlY2lmaWVkCi0gICAgYnkgdGhlIHNlbGVjdG9yIHdpbGwgbm90IGVuZCB1cCBiZWluZyBzZWxlY3RlZC48L3A+Ci0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGF0ZXRpbWU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgZGF0ZSBhbmQgdGltZSB0byB0ZXN0IGZvci4KLSAgICAgICAgICBTaG91bGQgYmUgaW4gdGhlIGZvcm1hdCAiTU0vZGQveXl5eSBoaDptbSBhIiB1c2luZyB0aGUgVVMKLSAgICAgICAgICBsb2NhbGUsIG9yIGFuIGFsdGVybmF0aXZlIHBhdHRlcm4gc3BlY2lmaWVkIHZpYQotICAgICAgICAgIHRoZSA8aT5wYXR0ZXJuPC9pPiBhdHRyaWJ1dGUuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0d28uPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWlsbGlzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSAxOTcwIHRoYXQgc2hvdWxkCi0gICAgICAgICAgYmUgdGVzdGVkIGZvci4gSXQgaXMgdXN1YWxseSBtdWNoIGVhc2llciB0byB1c2UgdGhlIGRhdGV0aW1lCisgICAgICAgIDx0ZD5kYXRldGltZTwvdGQ+CisgICAgICAgIDx0ZD5TcGVjaWZpZXMgdGhlIGRhdGUgYW5kIHRpbWUgdG8gdGVzdCBmb3IuICBTaG91bGQgYmUgaW4gdGhlIGZvcm1hdCA8cT5NTS9kZC95eXl5IGhoOm1tCisgICAgICAgICAgYTwvcT4gdXNpbmcgdGhlIFVTIGxvY2FsZSwgb3IgYW4gYWx0ZXJuYXRpdmUgcGF0dGVybiBzcGVjaWZpZWQgdmlhIHRoZSA8dmFyPnBhdHRlcm48L3Zhcj4KICAgICAgICAgICBhdHRyaWJ1dGUuCiAgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj5BdCBsZWFzdCBvbmUgb2YgdGhlIHR3bzwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPndoZW48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSBkYXRlLCB3aGV0aGVyCi0gICAgICAgICAgdGhlIGZpbGVzIHRvIGJlIHNlbGVjdGVkIGFyZSB0aG9zZSB3aG9zZSBsYXN0IG1vZGlmaWVkIHRpbWVzIHNob3VsZAotICAgICAgICAgIGJlIGJlZm9yZSwgYWZ0ZXIsIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIEFjY2VwdGFibGUKLSAgICAgICAgICB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlIGFyZToKKyAgICAgICAgPHRkPm1pbGxpczwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQgZm9yLiBJdCBpcworICAgICAgICAgIHVzdWFsbHkgbXVjaCBlYXNpZXIgdG8gdXNlIHRoZSA8dmFyPmRhdGV0aW1lPC92YXI+IGF0dHJpYnV0ZS4KKyAgICAgICAgPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD53aGVuPC90ZD4KKyAgICAgICAgPHRkPkluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSBkYXRlLCB3aGV0aGVyIHRoZSBmaWxlcyB0byBiZSBzZWxlY3RlZCBhcmUgdGhvc2UKKyAgICAgICAgICB3aG9zZSBsYXN0IG1vZGlmaWVkIHRpbWVzIHNob3VsZCBiZSBiZWZvcmUsIGFmdGVyLCBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgdmFsdWUuIEFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmU6CiAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgPGxpPmJlZm9yZSAtIHNlbGVjdCBmaWxlcyB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgaXMgYmVmb3JlIHRoZSBpbmRpY2F0ZWQgZGF0ZQotICAgICAgICAgICAgPGxpPmFmdGVyIC0gc2VsZWN0IGZpbGVzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBhZnRlciB0aGUgaW5kaWNhdGVkIGRhdGUKLSAgICAgICAgICAgIDxsaT5lcXVhbCAtIHNlbGVjdCBmaWxlcyAgd2hvc2UgbGFzdCBtb2RpZmllZCBkYXRlIGlzIHRoaXMgZXhhY3QgZGF0ZQotICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZXF1YWwuCi0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICAgICAgPGxpPjxxPmJlZm9yZTwvcT4mbWRhc2g7c2VsZWN0IGZpbGVzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBiZWZvcmUgdGhlIGluZGljYXRlZAorICAgICAgICAgICAgICBkYXRlPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5hZnRlcjwvcT4mbWRhc2g7c2VsZWN0IGZpbGVzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBhZnRlciB0aGUgaW5kaWNhdGVkCisgICAgICAgICAgICAgIGRhdGU8L2xpPgorICAgICAgICAgICAgPGxpPjxxPmVxdWFsPC9xPiZtZGFzaDtzZWxlY3QgZmlsZXMgd2hvc2UgbGFzdCBtb2RpZmllZCBkYXRlIGlzIHRoaXMgZXhhY3QgZGF0ZTwvbGk+CisgICAgICAgICAgPC91bD48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZXF1YWw8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JhbnVsYXJpdHk8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byB1c2Ugd2hlbgotICAgICAgICAgIGNvbXBhcmluZyBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkKLSAgICAgICAgICBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQotICAgICAgICAgIG1pbGxpc2Vjb25kIGxldmVsLiBEZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXMuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Z3JhbnVsYXJpdHk8L3RkPgorICAgICAgICA8dGQ+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIHVzZSB3aGVuIGNvbXBhcmluZyBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4gVGhpcyBpcworICAgICAgICAgIG5lZWRlZCBiZWNhdXNlIG5vdCBldmVyeSBmaWxlIHN5c3RlbSBzdXBwb3J0cyB0cmFja2luZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIHRvIHRoZQorICAgICAgICAgIG1pbGxpc2Vjb25kIGxldmVsLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyAwIG1pbGxpc2Vjb25kcywgb3IgMiBzZWNvbmRzIG9uIERPUyBzeXN0ZW1zPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cGF0dGVybjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIDxDT0RFPlNpbXBsZURhdGVGb3JtYXQ8L0NPREU+LWNvbXBhdGlibGUgcGF0dGVybgotICAgICAgICAgIHRvIHVzZSB3aGVuIGludGVycHJldGluZyB0aGUgPGk+ZGF0ZXRpbWU8L2k+IGF0dHJpYnV0ZSB1c2luZwotICAgICAgICAgIHRoZSBjdXJyZW50IGxvY2FsZS4KLSAgICAgICAgICA8aT5TaW5jZSBBbnQgMS42LjI8L2k+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+cGF0dGVybjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgPGNvZGU+U2ltcGxlRGF0ZUZvcm1hdDwvY29kZT4tY29tcGF0aWJsZSBwYXR0ZXJuIHRvIHVzZSB3aGVuIGludGVycHJldGluZworICAgICAgICAgIHRoZSA8dmFyPmRhdGV0aW1lPC92YXI+IGF0dHJpYnV0ZSB1c2luZyB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgICAgICAgPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+PC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2hlY2tkaXJzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gY2hlY2sgZGF0ZXMgb24gZGlyZWN0b3JpZXMuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm8sIGRlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPjwvdGQ+CisgICAgICAgIDx0ZD5jaGVja2RpcnM8L3RkPgorICAgICAgICA8dGQ+SW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIGNoZWNrIGRhdGVzIG9uIGRpcmVjdG9yaWVzLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+ZmFsc2U8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAogICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBEYXRlIFNlbGVjdG9yOjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2phci5wYXRofSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphciZxdW90OyZndDsKICAgICAmbHQ7ZGF0ZSBkYXRldGltZT0mcXVvdDswMS8wMS8yMDAxIDEyOjAwIEFNJnF1b3Q7IHdoZW49JnF1b3Q7YmVmb3JlJnF1b3Q7LyZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIEpBUiBmaWxlcyB3aGljaCB3ZXJlIGxhc3QgbW9kaWZpZWQgYmVmb3JlIG1pZG5pZ2h0Ci0gICAgSmFudWFyeSAxLCAyMDAxLjwvcD4KKyAgICA8cD5TZWxlY3RzIGFsbCBKQVIgZmlsZXMgd2hpY2ggd2VyZSBsYXN0IG1vZGlmaWVkIGJlZm9yZSBtaWRuaWdodCBKYW51YXJ5IDEsIDIwMDEuPC9wPgogCisgICAgPGg0IGlkPSJkZXBlbmRzZWxlY3QiPkRlcGVuZCBTZWxlY3RvcjwvaDQ+CiAKLSAgICA8aDQ+PGEgbmFtZT0iZGVwZW5kc2VsZWN0Ij5EZXBlbmQgU2VsZWN0b3I8L2E+PC9oND4KLQotICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGVwZW5kJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMKLSAgICB3aG9zZSBsYXN0IG1vZGlmaWVkIGRhdGUgaXMgbGF0ZXIgdGhhbiBhbm90aGVyLCBlcXVpdmFsZW50IGZpbGUgaW4KLSAgICBhbm90aGVyIGxvY2F0aW9uLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2RlcGVuZCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHdob3NlIGxhc3QgbW9kaWZpZWQgZGF0ZSBpcyBsYXRlciB0aGFuCisgICAgYW5vdGhlciwgZXF1aXZhbGVudCBmaWxlIGluIGFub3RoZXIgbG9jYXRpb24uPC9wPgogCiAgICAgPHA+VGhlIDxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiB0YWcgc3VwcG9ydHMgdGhlIHVzZSBvZiBhCi0gICAgY29udGFpbmVkIDxhIGhyZWY9Im1hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+IGVsZW1lbnQKLSAgICB0byBkZWZpbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QuIElmIG5vCi0gICAgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUKLSAgICA8Y29kZT5pZGVudGl0eTwvY29kZT4gdHlwZSBtYXBwZXIgaXMgdXNlZC48L3A+CisgICAgY29udGFpbmVkIDxhIGhyZWY9Im1hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbgorICAgIG9mIHRoZSBmaWxlIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QuIElmIG5vIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHNwZWNpZmllZCwKKyAgICB0aGUgPGNvZGU+aWRlbnRpdHk8L2NvZGU+IHR5cGUgbWFwcGVyIGlzIHVzZWQuPC9wPgogCiAgICAgPHA+VGhlIDxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcyBjYXNlLXNlbnNpdGl2ZS48L3A+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0ZGlyPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUKLSAgICAgICAgICBhZ2FpbnN0LiBUaGUgcHJlY2lzZSBsb2NhdGlvbiBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcwotICAgICAgICAgIGF0dHJpYnV0ZSBhbmQgdGhlIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50LCBpZiBhbnkuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPnRhcmdldGRpcjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4gVGhlIHByZWNpc2UgbG9jYXRpb24KKyAgICAgICAgICBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUgYW5kIHRoZSA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCwgaWYKKyAgICAgICAgICBhbnkuPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmdyYW51bGFyaXR5PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUKLSAgICAgICAgICBkZWNpZGluZyBhIGZpbGUgaXMgb3V0IG9mIGRhdGUuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5Ci0gICAgICAgICAgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKLSAgICAgICAgICBtaWxsaXNlY29uZCBsZXZlbC4gRGVmYXVsdCBpcyAwIG1pbGxpc2Vjb25kcywgb3IgMiBzZWNvbmRzIG9uIERPUyBzeXN0ZW1zLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmdyYW51bGFyaXR5PC90ZD4KKyAgICAgICAgPHRkPlRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGxlZXdheSB0byBnaXZlIGJlZm9yZSBkZWNpZGluZyBhIGZpbGUgaXMgb3V0IG9mIGRhdGUuIFRoaXMgaXMKKyAgICAgICAgICBuZWVkZWQgYmVjYXVzZSBub3QgZXZlcnkgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgdHJhY2tpbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZSB0byB0aGUKKyAgICAgICAgICBtaWxsaXNlY29uZCBsZXZlbC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1Mgc3lzdGVtczwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKICAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgRGVwZW5kIFNlbGVjdG9yOjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2FudC4xLjV9L3NyYy9tYWluJnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OyZndDsKICAgICAmbHQ7ZGVwZW5kIHRhcmdldGRpcj0mcXVvdDske2FudC4xLjQuMX0vc3JjL21haW4mcXVvdDsvJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+U2VsZWN0cyBhbGwgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQgaW4gdGhlCi0gICAgICAxLjUgcmVsZWFzZS4KLSAgICA8L3A+CisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQgaW4gdGhlIDEuNSByZWxlYXNlLjwvcD4KIAorICAgIDxoNCBpZD0iZGVwdGhzZWxlY3QiPkRlcHRoIFNlbGVjdG9yPC9oND4KIAotICAgIDxoND48YSBuYW1lPSJkZXB0aHNlbGVjdCI+RGVwdGggU2VsZWN0b3I8L2E+PC9oND4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2RlcHRoJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMgYmFzZWQgb24gaG93IG1hbnkgZGlyZWN0b3J5IGxldmVscyBkZWVwIHRoZXkKKyAgICBhcmUgaW4gcmVsYXRpb24gdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlc2V0LjwvcD4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGVwdGgmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyBiYXNlZCBvbgotICAgIGhvdyBtYW55IGRpcmVjdG9yeSBsZXZlbHMgZGVlcCB0aGV5IGFyZSBpbiByZWxhdGlvbiB0byB0aGUgYmFzZQotICAgIGRpcmVjdG9yeSBvZiB0aGUgZmlsZXNldC4KLSAgICA8L3A+Ci0KLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWluPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgbWluaW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyBiZWxvdwotICAgICAgICAgIHRoZSBiYXNlIGRpcmVjdG9yeSB0aGF0IGEgZmlsZSBtdXN0IGJlIGluIG9yZGVyIHRvIGJlIHNlbGVjdGVkLgotICAgICAgICAgIERlZmF1bHQgaXMgbm8gbGltaXQuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciIgcm93c3Bhbj0iMiI+QXQgbGVhc3Qgb25lIG9mIHRoZSB0d28uPC90ZD4KKyAgICAgICAgPHRkPm1pbjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbWluaW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyBiZWxvdyB0aGUgYmFzZSBkaXJlY3RvcnkgdGhhdCBhIGZpbGUgbXVzdCBiZSBpbgorICAgICAgICAgIG9yZGVyIHRvIGJlIHNlbGVjdGVkLjwvdGQ+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj5BdCBsZWFzdCBvbmUgb2YgdGhlIHR3bzsgZGVmYXVsdCBpcyBubyBsaW1pdDwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm1heDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG1heGltdW0gbnVtYmVyIG9mIGRpcmVjdG9yeSBsZXZlbHMgYmVsb3cKLSAgICAgICAgICB0aGUgYmFzZSBkaXJlY3RvcnkgdGhhdCBhIGZpbGUgY2FuIGJlIGFuZCBzdGlsbCBiZSBzZWxlY3RlZC4KLSAgICAgICAgICBEZWZhdWx0IGlzIG5vIGxpbWl0LgotICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+bWF4PC90ZD4KKyAgICAgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3J5IGxldmVscyBiZWxvdyB0aGUgYmFzZSBkaXJlY3RvcnkgdGhhdCBhIGZpbGUKKyAgICAgICAgICBjYW4gYmUgYW5kIHN0aWxsIGJlIHNlbGVjdGVkLjwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKICAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgRGVwdGggU2VsZWN0b3I6PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyomcXVvdDsmZ3Q7CiAgICAgJmx0O2RlcHRoIG1heD0mcXVvdDsxJnF1b3Q7LyZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdwotICAgIHRoYXQuPC9wPgorICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdyB0aGF0LjwvcD4KIAotICAgIAotICAgIDxoND48YSBuYW1lPSJkaWZmZXJlbnRzZWxlY3QiPkRpZmZlcmVudCBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxoNCBpZD0iZGlmZmVyZW50c2VsZWN0Ij5EaWZmZXJlbnQgU2VsZWN0b3I8L2g0PgogCi0gICAgPHA+VGhlIDxjb2RlPiZsdDtkaWZmZXJlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciB3aWxsIHNlbGVjdCBhIGZpbGUKLSAgICBpZiBpdCBpcyBkZWVtZWQgdG8gYmUgJ2RpZmZlcmVudCcgZnJvbSBhbiBlcXVpdmFsZW50IGZpbGUgaW4KLSAgICBhbm90aGVyIGxvY2F0aW9uLiBUaGUgcnVsZXMgZm9yIGRldGVybWluaW5nIGRpZmZlcmVuY2UgYmV0d2VlbgotICAgIHRoZSB0d28gZmlsZXMgYXJlIGFzIGZvbGxvd3M6CisgICAgPHA+VGhlIDxjb2RlPiZsdDtkaWZmZXJlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciB3aWxsIHNlbGVjdCBhIGZpbGUgaWYgaXQgaXMgZGVlbWVkIHRvIGJlCisgICAgJ2RpZmZlcmVudCcgZnJvbSBhbiBlcXVpdmFsZW50IGZpbGUgaW4gYW5vdGhlciBsb2NhdGlvbi4gVGhlIHJ1bGVzIGZvciBkZXRlcm1pbmluZyBkaWZmZXJlbmNlCisgICAgYmV0d2VlbiB0aGUgdHdvIGZpbGVzIGFyZSBhcyBmb2xsb3dzOjxwPgogICAgIDxvbD4KLSAgICA8bGk+SWYgYSBmaWxlIGlzIG9ubHkgcHJlc2VudCBpbiB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbiB5b3UgYXBwbHkKLSAgICAgIHRoZSBzZWxlY3RvciB0byBidXQgbm90IGluIHRhcmdldGRpciAob3IgYWZ0ZXIgYXBwbHlpbmcgdGhlCi0gICAgICBtYXBwZXIpIHRoZSBmaWxlIGlzIHNlbGVjdGVkLgotICAgIDxsaT5JZiBhIGZpbGUgaXMgb25seSBwcmVzZW50IGluIHRhcmdldGRpciAob3IgYWZ0ZXIgYXBwbHlpbmcgdGhlCi0gICAgICBtYXBwZXIpIGl0IGlzIGlnbm9yZWQuCi0gICAgPGxpPiBGaWxlcyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzIGFyZSBkaWZmZXJlbnQuCi0gICAgPGxpPiBJZiA8dHQ+aWdub3JlRmlsZVRpbWVzPC90dD4gaXMgdHVybmVkIG9mZiwgdGhlbiBkaWZmZXJpbmcgZmlsZQotICAgIHRpbWVzdGFtcHMgd2lsbCBjYXVzZSBmaWxlcyB0byBiZSByZWdhcmRlZCBhcyBkaWZmZXJlbnQuCi0gICAgPGxpPiBVbmxlc3MgPHR0Pmlnbm9yZUNvbnRlbnRzPC90dD4gaXMgc2V0IHRvIHRydWUsCi0gICAgICAgICBhIGJ5dGUtZm9yLWJ5dGUgY2hlY2sgaXMgcnVuIGFnYWluc3QgdGhlIHR3byBmaWxlcy4KKyAgICA8bGk+SWYgYSBmaWxlIGlzIG9ubHkgcHJlc2VudCBpbiB0aGUgcmVzb3VyY2UgY29sbGVjdGlvbiB5b3UgYXBwbHkgdGhlIHNlbGVjdG9yIHRvIGJ1dCBub3QKKyAgICAgIGluIDx2YXI+dGFyZ2V0ZGlyPC92YXI+IChvciBhZnRlciBhcHBseWluZyB0aGUgbWFwcGVyKSB0aGUgZmlsZSBpcyBzZWxlY3RlZC48L2xpPgorICAgIDxsaT5JZiBhIGZpbGUgaXMgb25seSBwcmVzZW50IGluIDx2YXI+dGFyZ2V0ZGlyPC92YXI+IChvciBhZnRlciBhcHBseWluZyB0aGUgbWFwcGVyKSBpdCBpcworICAgICAgaWdub3JlZC48L2xpPgorICAgIDxsaT5GaWxlcyB3aXRoIGRpZmZlcmVudCBsZW5ndGhzIGFyZSBkaWZmZXJlbnQuPC9saT4KKyAgICA8bGk+SWYgPHZhcj5pZ25vcmVGaWxlVGltZXM8L3Zhcj4gaXMgdHVybmVkIDxxPm9mZjwvcT4sIHRoZW4gZGlmZmVyaW5nIGZpbGUgdGltZXN0YW1wcyB3aWxsCisgICAgICBjYXVzZSBmaWxlcyB0byBiZSByZWdhcmRlZCBhcyBkaWZmZXJlbnQuPC9saT4KKyAgICA8bGk+VW5sZXNzIDx2YXI+aWdub3JlQ29udGVudHM8L3Zhcj4gaXMgc2V0IHRvIDxxPnRydWU8L3E+LCBhIGJ5dGUtZm9yLWJ5dGUgY2hlY2sgaXMgcnVuIGFnYWluc3QKKyAgICAgIHRoZSB0d28gZmlsZXMuPC9saT4KICAgICA8L29sPgorICAgIDxwPlRoaXMgaXMgYSB1c2VmdWwgc2VsZWN0b3IgdG8gd29yayB3aXRoIHByb2dyYW1zIGFuZCB0YXNrcyB0aGF0IGRvbid0IGhhbmRsZSBkZXBlbmRlbmN5CisgICAgY2hlY2tpbmcgcHJvcGVybHk7IGV2ZW4gaWYgYSBwcmVkZWNlc3NvciB0YXNrIGFsd2F5cyBjcmVhdGVzIGl0cyBvdXRwdXQgZmlsZXMsIGZvbGxvd3VwIHRhc2tzCisgICAgY2FuIGJlIGRyaXZlbiBvZmYgY29waWVzIG1hZGUgd2l0aCBhIGRpZmZlcmVudCBzZWxlY3Rvciwgc28gdGhlaXIgZGVwZW5kZW5jaWVzIGFyZSBkcml2ZW4gb24gdGhlCisgICAgYWJzb2x1dGUgc3RhdGUgb2YgdGhlIGZpbGVzLCBub3QganVzdCBhIHRpbWVzdGFtcC4gRm9yIGV4YW1wbGU6IGFueXRoaW5nIGZldGNoZWQgZnJvbSBhIHdlYgorICAgIHNpdGUsIG9yIHRoZSBvdXRwdXQgb2Ygc29tZSBwcm9ncmFtLiBUbyByZWR1Y2UgdGhlIGFtb3VudCBvZiBjaGVja2luZywgd2hlbiB1c2luZyB0aGlzIHRhc2sKKyAgICBpbnNpZGUgYSA8Y29kZT4mbHQ7Y29weSZndDs8L2NvZGU+IHRhc2ssIHNldCA8dmFyPnByZXNlcnZlbGFzdG1vZGlmaWVkPC92YXI+IHRvIDxxPnRydWU8L3E+IHRvCisgICAgcHJvcGFnYXRlIHRoZSB0aW1lc3RhbXAgZnJvbSB0aGUgc291cmNlIGZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuPC9wPgogCi0gICAgVGhpcyBpcyBhIHVzZWZ1bCBzZWxlY3RvciB0byB3b3JrIHdpdGggcHJvZ3JhbXMgYW5kIHRhc2tzIHRoYXQgZG9uJ3QgaGFuZGxlCi0gICAgZGVwZW5kZW5jeSBjaGVja2luZyBwcm9wZXJseTsgZXZlbiBpZiBhIHByZWRlY2Vzc29yIHRhc2sgYWx3YXlzIGNyZWF0ZXMgaXRzCi0gICAgb3V0cHV0IGZpbGVzLCBmb2xsb3d1cCB0YXNrcyBjYW4gYmUgZHJpdmVuIG9mZiBjb3BpZXMgbWFkZSB3aXRoIGEgZGlmZmVyZW50Ci0gICAgc2VsZWN0b3IsIHNvIHRoZWlyIGRlcGVuZGVuY2llcyBhcmUgZHJpdmVuIG9uIHRoZSBhYnNvbHV0ZSBzdGF0ZSBvZiB0aGUKLSAgICBmaWxlcywgbm90IGp1c3QgYSB0aW1lc3RhbXAuIEZvciBleGFtcGxlOiBhbnl0aGluZyBmZXRjaGVkIGZyb20gYSB3ZWIgc2l0ZSwKLSAgICBvciB0aGUgb3V0cHV0IG9mIHNvbWUgcHJvZ3JhbS4gVG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY2hlY2tpbmcsIHdoZW4gdXNpbmcKLSAgICB0aGlzIHRhc2sgaW5zaWRlIGEgPGNvZGU+Jmx0O2NvcHkmZ3Q7PC9jb2RlPiB0YXNrLCBzZXQKLSAgICA8dHQ+cHJlc2VydmVsYXN0bW9kaWZpZWQ8L3R0PiB0byA8aT50cnVlPC9pPiB0byBwcm9wYWdhdGUgdGhlIHRpbWVzdGFtcAotICAgIGZyb20gdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLjxwPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZGlmZmVyZW50Jmd0OzwvY29kZT4gc2VsZWN0b3Igc3VwcG9ydHMgdGhlIHVzZSBvZiBhCisgICAgY29udGFpbmVkIDxhIGhyZWY9Im1hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+IGVsZW1lbnQgdG8gZGVmaW5lIHRoZSBsb2NhdGlvbgorICAgIG9mIHRoZSBmaWxlIHRvIGJlIGNvbXBhcmVkIGFnYWluc3QuIElmIG5vIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHNwZWNpZmllZCwKKyAgICB0aGUgPGNvZGU+aWRlbnRpdHk8L2NvZGU+IHR5cGUgbWFwcGVyIGlzIHVzZWQuPC9wPgogCi0gICAgVGhlIDxjb2RlPiZsdDtkaWZmZXJlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBzdXBwb3J0cyB0aGUgdXNlIG9mIGEKLSAgICBjb250YWluZWQgPGEgaHJlZj0ibWFwcGVyLmh0bWwiPjxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPjwvYT4gZWxlbWVudAotICAgIHRvIGRlZmluZSB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gYmUgY29tcGFyZWQgYWdhaW5zdC4gSWYgbm8KLSAgICA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCBpcyBzcGVjaWZpZWQsIHRoZQotICAgIDxjb2RlPmlkZW50aXR5PC9jb2RlPiB0eXBlIG1hcHBlciBpcyB1c2VkLjwvcD4KLQotICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj50YXJnZXRkaXI8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBiYXNlIGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUgZmlsZXMgdG8gY29tcGFyZQotICAgICAgICAgIGFnYWluc3QuIFRoZSBwcmVjaXNlIGxvY2F0aW9uIGRlcGVuZHMgb24gYSBjb21iaW5hdGlvbiBvZiB0aGlzCi0gICAgICAgICAgYXR0cmlidXRlIGFuZCB0aGUgPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQsIGlmIGFueS4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgICAgICA8dGQ+dGFyZ2V0ZGlyPC90ZD4KKyAgICAgICAgPHRkPlRoZSBiYXNlIGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUgZmlsZXMgdG8gY29tcGFyZSBhZ2FpbnN0LiBUaGUgcHJlY2lzZSBsb2NhdGlvbgorICAgICAgICAgIGRlcGVuZHMgb24gYSBjb21iaW5hdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZSBhbmQgdGhlIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50LCBpZgorICAgICAgICAgIGFueS48L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlRmlsZVRpbWVzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIHRvIHVzZSBmaWxlIHRpbWVzIGluIHRoZSBjb21wYXJpc29uIG9yIG5vdC4KLSAgICAgICAgICBEZWZhdWx0IGlzIHRydWUgKHRpbWUgZGlmZmVyZW5jZXMgYXJlIGlnbm9yZWQpLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmlnbm9yZUZpbGVUaW1lczwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIHVzZSBmaWxlIHRpbWVzIGluIHRoZSBjb21wYXJpc29uIG9yIG5vdC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT4gKHRpbWUgZGlmZmVyZW5jZXMgYXJlIGlnbm9yZWQpPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+aWdub3JlQ29udGVudHM8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gZG8gYSBieXRlIHBlciBieXRlIGNvbXBhcmUuCi0gICAgICAgICAgRGVmYXVsdCBpcyBmYWxzZSAoY29udGVudHMgYXJlIGNvbXBhcmVkKS4KLSAgICAgICAgICBTaW5jZSBBbnQgMS42LjMKLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5pZ25vcmVDb250ZW50czwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIGRvIGEgYnl0ZSBwZXIgYnl0ZSBjb21wYXJlLgorICAgICAgICAgIDxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT4gKGNvbnRlbnRzIGFyZSBjb21wYXJlZCk8L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5ncmFudWxhcml0eTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGVld2F5IHRvIGdpdmUgYmVmb3JlCi0gICAgICAgICAgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG5vdCBldmVyeQotICAgICAgICAgIGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlCi0gICAgICAgICAgbWlsbGlzZWNvbmQgbGV2ZWwuIERlZmF1bHQgaXMgMCBtaWxsaXNlY29uZHMsIG9yIDIgc2Vjb25kcyBvbiBET1Mgc3lzdGVtcy4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5ncmFudWxhcml0eTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBsZWV3YXkgdG8gZ2l2ZSBiZWZvcmUgZGVjaWRpbmcgYSBmaWxlIGlzIG91dCBvZiBkYXRlLiBUaGlzIGlzCisgICAgICAgICAgbmVlZGVkIGJlY2F1c2Ugbm90IGV2ZXJ5IGZpbGUgc3lzdGVtIHN1cHBvcnRzIHRyYWNraW5nIHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUgdG8gdGhlCisgICAgICAgICAgbWlsbGlzZWNvbmQgbGV2ZWwuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDAgbWlsbGlzZWNvbmRzLCBvciAyIHNlY29uZHMgb24gRE9TIHN5c3RlbXM8L3RkPgogICAgICAgPC90cj4KICAgICA8L3RhYmxlPgogCiAgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIERpZmZlcmVudCBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHthbnQuMS41fS9zcmMvbWFpbiZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsmZ3Q7CiAgICAgJmx0O2RpZmZlcmVudCB0YXJnZXRkaXI9JnF1b3Q7JHthbnQuMS40LjF9L3NyYy9tYWluJnF1b3Q7CiAgICAgICAgIGlnbm9yZUZpbGVUaW1lcz0idHJ1ZSIvJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+Q29tcGFyZXMgYWxsIHRoZSBKYXZhIHNvdXJjZSBmaWxlcyBiZXR3ZWVuIHRoZSAxLjQuMSBhbmQgdGhlIDEuNSByZWxlYXNlCi0gICAgYW5kIHNlbGVjdHMgdGhvc2Ugd2hvIGFyZSBkaWZmZXJlbnQsIGRpc3JlZ2FyZGluZyBmaWxlIHRpbWVzLgotICAgIDwvcD4KKyAgICA8cD5Db21wYXJlcyBhbGwgdGhlIEphdmEgc291cmNlIGZpbGVzIGJldHdlZW4gdGhlIDEuNC4xIGFuZCB0aGUgMS41IHJlbGVhc2UgYW5kIHNlbGVjdHMgdGhvc2UKKyAgICB3aG8gYXJlIGRpZmZlcmVudCwgZGlzcmVnYXJkaW5nIGZpbGUgdGltZXMuPC9wPgogCi0gICAgPGg0PjxhIG5hbWU9ImZpbGVuYW1lc2VsZWN0Ij5GaWxlbmFtZSBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxoNCBpZD0iZmlsZW5hbWVzZWxlY3QiPkZpbGVuYW1lIFNlbGVjdG9yPC9oND4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiB0YWcgYWN0cyBsaWtlIHRoZQotICAgIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4KLSAgICB0YWdzIHdpdGhpbiBhIGZpbGVzZXQuIEJ5IHVzaW5nIGEgc2VsZWN0b3IgaW5zdGVhZCwgaG93ZXZlciwKLSAgICBvbmUgY2FuIGNvbWJpbmUgaXQgd2l0aCBhbGwgdGhlIG90aGVyIHNlbGVjdG9ycyB1c2luZyB3aGF0ZXZlcgotICAgIDxhIGhyZWY9IiNzZWxlY3Rjb250YWluZXJzIj5zZWxlY3RvciBjb250YWluZXI8L2E+IGlzIGRlc2lyZWQuCi0gICAgPC9wPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiB0YWcgYWN0cyBsaWtlIHRoZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+CisgICAgYW5kIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gdGFncyB3aXRoaW4gYSBmaWxlc2V0LiBCeSB1c2luZyBhIHNlbGVjdG9yIGluc3RlYWQsIGhvd2V2ZXIsCisgICAgb25lIGNhbiBjb21iaW5lIGl0IHdpdGggYWxsIHRoZSBvdGhlciBzZWxlY3RvcnMgdXNpbmcKKyAgICB3aGF0ZXZlciA8YSBocmVmPSIjc2VsZWN0Y29udGFpbmVycyI+c2VsZWN0b3IgY29udGFpbmVyPC9hPiBpcyBkZXNpcmVkLjwvcD4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7ZmlsZW5hbWUmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcwotICAgIGNhc2Utc2Vuc2l0aXZlLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O2ZpbGVuYW1lJmd0OzwvY29kZT4gc2VsZWN0b3IgaXMgY2FzZS1zZW5zaXRpdmUuPC9wPgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBuYW1lIG9mIGZpbGVzIHRvIHNlbGVjdC4gVGhlIG5hbWUgcGFyYW1ldGVyCi0gICAgICAgICAgY2FuIGNvbnRhaW4gdGhlIHN0YW5kYXJkIEFudCB3aWxkY2FyZCBjaGFyYWN0ZXJzLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjIiPkV4YWN0bHkgb25lIG9mCi0gICAgICAgICAgdGhlIHR3bzwvdGQ+CisgICAgICAgIDx0ZD5uYW1lPC90ZD4KKyAgICAgICAgPHRkPlRoZSBuYW1lIG9mIGZpbGVzIHRvIHNlbGVjdC4gVGhlIG5hbWUgcGFyYW1ldGVyIGNhbiBjb250YWluIHRoZSBzdGFuZGFyZCBBbnQgd2lsZGNhcmQKKyAgICAgICAgICBjaGFyYWN0ZXJzLjwvdGQ+CisgICAgICAgIDx0ZCByb3dzcGFuPSIyIj5FeGFjdGx5IG9uZSBvZiB0aGUgdHdvPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+cmVnZXg8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgZmlsZXMgdG8gc2VsZWN0LjwvdGQ+CisgICAgICAgIDx0ZD5yZWdleDwvdGQ+CisgICAgICAgIDx0ZCBjbGFzcz0ibGVmdCI+VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBmaWxlcyB0byBzZWxlY3QuPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hldGhlciB0byBwYXkgYXR0ZW50aW9uIHRvIGNhc2Ugd2hlbiBsb29raW5nCi0gICAgICAgICAgYXQgZmlsZSBuYW1lcy4gRGVmYXVsdCBpcyAidHJ1ZSIuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIHBheSBhdHRlbnRpb24gdG8gY2FzZSB3aGVuIGxvb2tpbmcgYXQgZmlsZSBuYW1lcy48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uZWdhdGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgdG8gcmV2ZXJzZSB0aGUgZWZmZWN0cyBvZiB0aGlzIGZpbGVuYW1lCi0gICAgICAgICAgc2VsZWN0aW9uLCB0aGVyZWZvcmUgZW11bGF0aW5nIGFuIGV4Y2x1ZGUgcmF0aGVyIHRoYW4gaW5jbHVkZQotICAgICAgICAgIHRhZy4gRGVmYXVsdCBpcyAiZmFsc2UiLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPm5lZ2F0ZTwvdGQ+CisgICAgICAgIDx0ZD5XaGV0aGVyIHRvIHJldmVyc2UgdGhlIGVmZmVjdHMgb2YgdGhpcyBmaWxlbmFtZSBzZWxlY3Rpb24sIHRoZXJlZm9yZSBlbXVsYXRpbmcKKyAgICAgICAgICBhbiA8Y29kZT5leGNsdWRlPC9jb2RlPiByYXRoZXIgdGhhbiA8Y29kZT5pbmNsdWRlPC9jb2RlPiB0YWcuPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKICAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgRmlsZW5hbWUgU2VsZWN0b3I6PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyomcXVvdDsmZ3Q7CiAgICAgJmx0O2ZpbGVuYW1lIG5hbWU9JnF1b3Q7KiovKi5jc3MmcXVvdDsvJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCiAgICAgPHA+U2VsZWN0cyBhbGwgdGhlIGNhc2NhZGluZyBzdHlsZSBzaGVldCBmaWxlcy48L3A+CiAKKyAgICA8aDQgaWQ9InByZXNlbnRzZWxlY3QiPlByZXNlbnQgU2VsZWN0b3I8L2g0PgogCi0gICAgPGg0PjxhIG5hbWU9InByZXNlbnRzZWxlY3QiPlByZXNlbnQgU2VsZWN0b3I8L2E+PC9oND4KLQotICAgIDxwPlRoZSA8Y29kZT4mbHQ7cHJlc2VudCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzCi0gICAgdGhhdCBoYXZlIGFuIGVxdWl2YWxlbnQgZmlsZSBpbiBhbm90aGVyIGRpcmVjdG9yeSB0cmVlLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyB0aGF0IGhhdmUgYW4gZXF1aXZhbGVudCBmaWxlIGluCisgICAgYW5vdGhlciBkaXJlY3RvcnkgdHJlZS48L3A+CiAKICAgICA8cD5UaGUgPGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPiB0YWcgc3VwcG9ydHMgdGhlIHVzZSBvZiBhCi0gICAgY29udGFpbmVkIDxhIGhyZWY9Im1hcHBlci5odG1sIj48Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT48L2E+IGVsZW1lbnQKLSAgICB0byBkZWZpbmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRvIGJlIHRlc3RlZCBhZ2FpbnN0LiBJZiBubwotICAgIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHNwZWNpZmllZCwgdGhlCi0gICAgPGNvZGU+aWRlbnRpdHk8L2NvZGU+IHR5cGUgbWFwcGVyIGlzIHVzZWQuPC9wPgorICAgIGNvbnRhaW5lZCA8YSBocmVmPSJtYXBwZXIuaHRtbCI+PGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+PC9hPiBlbGVtZW50IHRvIGRlZmluZSB0aGUgbG9jYXRpb24KKyAgICBvZiB0aGUgZmlsZSB0byBiZSB0ZXN0ZWQgYWdhaW5zdC4gSWYgbm8gPGNvZGU+Jmx0O21hcHBlciZndDs8L2NvZGU+IGVsZW1lbnQgaXMgc3BlY2lmaWVkLAorICAgIHRoZSA8Y29kZT5pZGVudGl0eTwvY29kZT4gdHlwZSBtYXBwZXIgaXMgdXNlZC48L3A+CiAKICAgICA8cD5UaGUgPGNvZGU+Jmx0O3ByZXNlbnQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBpcyBjYXNlLXNlbnNpdGl2ZS48L3A+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGFyZ2V0ZGlyPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUKLSAgICAgICAgICBhZ2FpbnN0LiBUaGUgcHJlY2lzZSBsb2NhdGlvbiBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcwotICAgICAgICAgIGF0dHJpYnV0ZSBhbmQgdGhlIDxjb2RlPiZsdDttYXBwZXImZ3Q7PC9jb2RlPiBlbGVtZW50LCBpZiBhbnkuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPnRhcmdldGRpcjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgYmFzZSBkaXJlY3RvcnkgdG8gbG9vayBmb3IgdGhlIGZpbGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4gVGhlIHByZWNpc2UgbG9jYXRpb24KKyAgICAgICAgICBkZXBlbmRzIG9uIGEgY29tYmluYXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUgYW5kIHRoZSA8Y29kZT4mbHQ7bWFwcGVyJmd0OzwvY29kZT4gZWxlbWVudCwgaWYKKyAgICAgICAgICBhbnkuPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnByZXNlbnQ8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPldoZXRoZXIgd2UgYXJlIHJlcXVpcmluZyB0aGF0IGEgZmlsZSBpcyBwcmVzZW50IGluCi0gICAgICAgICAgdGhlIHNyYyBkaXJlY3RvcnkgdHJlZSBvbmx5LCBvciBpbiBib3RoIHRoZSBzcmMgYW5kIHRoZSB0YXJnZXQKLSAgICAgICAgICBkaXJlY3RvcnkgdHJlZS4gVmFsaWQgdmFsdWVzIGFyZToKKyAgICAgICAgPHRkPnByZXNlbnQ8L3RkPgorICAgICAgICA8dGQ+V2hldGhlciB3ZSBhcmUgcmVxdWlyaW5nIHRoYXQgYSBmaWxlIGlzIHByZXNlbnQgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgdHJlZSBvbmx5LCBvciBpbgorICAgICAgICAgIGJvdGggdGhlIHNvdXJjZSBhbmQgdGhlIHRhcmdldCBkaXJlY3RvcnkgdHJlZS4gVmFsaWQgdmFsdWVzIGFyZToKICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+c3Jjb25seSAtIHNlbGVjdCBmaWxlcyBvbmx5IGlmIHRoZXkgYXJlIGluIHRoZSBzcmMKLSAgICAgICAgICAgICAgZGlyZWN0b3J5IHRyZWUgYnV0IG5vdCBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB0cmVlCi0gICAgICAgICAgICA8bGk+Ym90aCAtIHNlbGVjdCBmaWxlcyBvbmx5IGlmIHRoZXkgYXJlIHByZXNlbnQgYm90aCBpbiB0aGUKLSAgICAgICAgICAgICAgc3JjIGFuZCB0YXJnZXQgZGlyZWN0b3J5IHRyZWVzCisgICAgICAgICAgICA8bGk+PHE+c3Jjb25seTwvcT4mbWRhc2g7c2VsZWN0IGZpbGVzIG9ubHkgaWYgdGhleSBhcmUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcnkgdHJlZSBidXQKKyAgICAgICAgICAgICAgbm90IGluIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHRyZWU8L2xpPgorICAgICAgICAgICAgPGxpPjxxPmJvdGg8L3EgPi0tIHNlbGVjdCBmaWxlcyBvbmx5IGlmIHRoZXkgYXJlIHByZXNlbnQgYm90aCBpbiB0aGUgc291cmNlIGFuZCB0YXJnZXQKKyAgICAgICAgICAgICAgZGlyZWN0b3J5IHRyZWVzPC9saT4KICAgICAgICAgICA8L3VsPgotICAgICAgICAgIERlZmF1bHQgaXMgYm90aC4gU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byAmcXVvdDtzcmNvbmx5JnF1b3Q7Ci0gICAgICAgICAgaXMgZXF1aXZhbGVudCB0byB3cmFwcGluZyB0aGUgc2VsZWN0b3IgaW4gdGhlIDxjb2RlPiZsdDtub3QmZ3Q7PC9jb2RlPgotICAgICAgICAgIHNlbGVjdG9yIGNvbnRhaW5lci4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgICAgU2V0dGluZyB0aGlzIGF0dHJpYnV0ZSB0byA8cT5zcmNvbmx5PC9xPiBpcyBlcXVpdmFsZW50IHRvIHdyYXBwaW5nIHRoZSBzZWxlY3RvciBpbgorICAgICAgICAgIHRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gc2VsZWN0b3IgY29udGFpbmVyLjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5ib3RoPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKICAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgUHJlc2VudCBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHthbnQuMS41fS9zcmMvbWFpbiZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsmZ3Q7CiAgICAgJmx0O3ByZXNlbnQgcHJlc2VudD0mcXVvdDtzcmNvbmx5JnF1b3Q7IHRhcmdldGRpcj0mcXVvdDske2FudC4xLjQuMX0vc3JjL21haW4mcXVvdDsvJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+U2VsZWN0cyBhbGwgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZSBuZXcgaW4gdGhlCi0gICAgICAxLjUgcmVsZWFzZS4KLSAgICA8L3A+CisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEphdmEgc291cmNlIGZpbGVzIHdoaWNoIGFyZSBuZXcgaW4gdGhlIDEuNSByZWxlYXNlLjwvcD4KIAotICAgIDxoND48YSBuYW1lPSJyZWdleHBzZWxlY3QiPlJlZ3VsYXIgRXhwcmVzc2lvbiBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxoNCBpZD0icmVnZXhwc2VsZWN0Ij5SZWd1bGFyIEV4cHJlc3Npb24gU2VsZWN0b3I8L2g0PgogCi0gICAgPHA+VGhlIDxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+IHRhZyBpbiBhIEZpbGVTZXQgbGltaXRzCi0gICAgdGhlIGZpbGVzIGRlZmluZWQgYnkgdGhhdCBmaWxlc2V0IHRvIG9ubHkgdGhvc2Ugd2hpY2ggY29udGVudHMgY29udGFpbiBhCi0gICAgbWF0Y2ggdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmV4cHJlc3Npb248L2NvZGU+IGF0dHJpYnV0ZS4KLSAgICA8L3A+Ci0gICAgPHA+VGhlIDxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+IHNlbGVjdG9yIGNhbiBiZSB1c2VkIGFzIGEKLSAgICAgIFJlc291cmNlU2VsZWN0b3IgKHNlZSB0aGUKLSAgICAgIDxhIGhyZWY9InJlc291cmNlcy5odG1sI3Jlc3RyaWN0Ij4mbHQ7cmVzdHJpY3QmZ3Q7PC9hPgotICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uKS48L3A+CisgICAgPHA+VGhlIDxjb2RlPiZsdDtjb250YWluc3JlZ2V4cCZndDs8L2NvZGU+IHRhZyBpbiBhIEZpbGVTZXQgbGltaXRzIHRoZSBmaWxlcyBkZWZpbmVkIGJ5IHRoYXQKKyAgICBmaWxlc2V0IHRvIG9ubHkgdGhvc2Ugd2hpY2ggY29udGVudHMgY29udGFpbiBhIG1hdGNoIHRvIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3BlY2lmaWVkIGJ5CisgICAgdGhlIDxjb2RlPmV4cHJlc3Npb248L2NvZGU+IGF0dHJpYnV0ZS48L3A+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7Y29udGFpbnNyZWdleHAmZ3Q7PC9jb2RlPiBzZWxlY3RvciBjYW4gYmUgdXNlZCBhcyBhIFJlc291cmNlU2VsZWN0b3IgKHNlZQorICAgIHRoZSA8YSBocmVmPSJyZXNvdXJjZXMuaHRtbCNyZXN0cmljdCI+Jmx0O3Jlc3RyaWN0Jmd0OzwvYT4gUmVzb3VyY2VDb2xsZWN0aW9uKS48L3A+CisKKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmV4cHJlc3Npb248L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlNwZWNpZmllcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbXVzdAotICAgICAgICBtYXRjaCB0cnVlIGluIGV2ZXJ5IGZpbGU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICAgIDx0ZD5leHByZXNzaW9uPC90ZD4KKyAgICAgICAgPHRkPlNwZWNpZmllcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB0cnVlIGluIGV2ZXJ5IGZpbGU8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2FzZXNlbnNpdGl2ZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+UGVyZm9ybSBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoLiAgRGVmYXVsdCBpcwotICAgICAgICAgIHRydWUuIDxlbT5zaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Y2FzZXNlbnNpdGl2ZTwvdGQ+CisgICAgICAgIDx0ZD5QZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgbWF0Y2guIDxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT50cnVlPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPm11bHRpbGluZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Ci0gICAgICAgICAgUGVyZm9ybSBhIG11bHRpIGxpbmUgbWF0Y2guCi0gICAgICAgICAgRGVmYXVsdCBpcyBmYWxzZS4gPGVtPnNpbmNlIEFudCAxLjguMjwvZW0+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5tdWx0aWxpbmU8L3RkPgorICAgICAgICA8dGQ+UGVyZm9ybSBhIG11bHRpIGxpbmUgbWF0Y2guIDxlbT5TaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT5mYWxzZTwvcT48L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zaW5nbGVsaW5lPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICBUaGlzIGFsbG93cyAnLicgdG8gbWF0Y2ggbmV3IGxpbmVzLgotICAgICAgICAgIFNpbmdsZUxpbmUgaXMgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggbXVsdGlsaW5lLCBTaW5nbGVMaW5lIGlzIGEgcGVybAotICAgICAgICAgIHJlZ2V4IHRlcm0sIGl0IGNvcnJlc3BvbmRzIHRvIGRvdGFsbCBpbiBqYXZhIHJlZ2V4LgotICAgICAgICAgIERlZmF1bHQgaXMgZmFsc2UuIDxlbT5zaW5jZSBBbnQgMS44LjI8L2VtPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+c2luZ2xlbGluZTwvdGQ+CisgICAgICAgIDx0ZD5UaGlzIGFsbG93cyA8cT4uPC9xPiB0byBtYXRjaCBuZXcgbGluZXMuICBTaW5nbGVMaW5lIGlzIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoCisgICAgICAgICAgbXVsdGlsaW5lLCBTaW5nbGVMaW5lIGlzIGEgcGVybCByZWdleCB0ZXJtLCBpdCBjb3JyZXNwb25kcyB0byBkb3RhbGwgaW4gSmF2YSByZWdleC4KKyAgICAgICAgICA8ZW0+U2luY2UgQW50IDEuOC4yPC9lbT48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+ZmFsc2U8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAogICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gU2VsZWN0b3I6PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoudHh0JnF1b3Q7Jmd0OwogICAgICZsdDtjb250YWluc3JlZ2V4cCBleHByZXNzaW9uPSZxdW90O1s0LTZdXC5bMC05XSZxdW90Oy8mZ3Q7Ci0mbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2ZpbGVzZXQmZ3Q7PC9wcmU+CiAKLSAgICA8cD5TZWxlY3RzIGFsbCB0aGUgdGV4dCBmaWxlcyB0aGF0IG1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KLSAgICAoaGF2ZSBhIDQsNSBvciA2IGZvbGxvd2VkIGJ5IGEgcGVyaW9kIGFuZCBhIG51bWJlciBmcm9tIDAgdG8gOSkuCisgICAgPHA+U2VsZWN0cyBhbGwgdGhlIHRleHQgZmlsZXMgdGhhdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uIChoYXZlIGEgNCwgNSBvciA2IGZvbGxvd2VkIGJ5IGEKKyAgICBwZXJpb2QgYW5kIGEgbnVtYmVyIGZyb20gMCB0byA5KS4KIAorICAgIDxoNCBpZD0ic2l6ZXNlbGVjdCI+U2l6ZSBTZWxlY3RvcjwvaDQ+CiAKLSAgICA8aDQ+PGEgbmFtZT0ic2l6ZXNlbGVjdCI+U2l6ZSBTZWxlY3RvcjwvYT48L2g0PgotCi0gICAgPHA+VGhlIDxjb2RlPiZsdDtzaXplJmd0OzwvY29kZT4gdGFnIGluIGEgRmlsZVNldCB3aWxsIHB1dAotICAgIGEgbGltaXQgb24gdGhlIGZpbGVzIHNwZWNpZmllZCBieSB0aGUgaW5jbHVkZSB0YWcsIHNvIHRoYXQgdGFncwotICAgIHdoaWNoIGRvIG5vdCBtZWV0IHRoZSBzaXplIGxpbWl0cyBzcGVjaWZpZWQgYnkgdGhlIHNlbGVjdG9yIHdpbGwgbm90CisgICAgPHA+VGhlIDxjb2RlPiZsdDtzaXplJmd0OzwvY29kZT4gdGFnIGluIGEgRmlsZVNldCB3aWxsIHB1dCBhIGxpbWl0IG9uIHRoZSBmaWxlcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgaW5jbHVkZSB0YWcsIHNvIHRoYXQgdGFncyB3aGljaCBkbyBub3QgbWVldCB0aGUgc2l6ZSBsaW1pdHMgc3BlY2lmaWVkIGJ5IHRoZSBzZWxlY3RvciB3aWxsIG5vdAogICAgIGVuZCB1cCBiZWluZyBzZWxlY3RlZC48L3A+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dmFsdWU8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBzaXplIG9mIHRoZSBmaWxlIHdoaWNoIHNob3VsZCBiZSB0ZXN0ZWQgZm9yLgorICAgICAgICA8dGQ+dmFsdWU8L3RkPgorICAgICAgICA8dGQ+VGhlIHNpemUgb2YgdGhlIGZpbGUgd2hpY2ggc2hvdWxkIGJlIHRlc3RlZCBmb3IuCiAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnVuaXRzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdW5pdHMgdGhhdCB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZQotICAgICAgICAgIGlzIGV4cHJlc3NlZCBpbi4gV2hlbiB1c2luZyB0aGUgc3RhbmRhcmQgc2luZ2xlIGxldHRlciBTSQotICAgICAgICAgIGRlc2lnbmF0aW9ucywgc3VjaCBhcyAmcXVvdDtrJnF1b3Q7LCZxdW90O00mcXVvdDssIG9yCi0gICAgICAgICAgJnF1b3Q7RyZxdW90OywgbXVsdGlwbGVzIG9mIDEwMDAgYXJlIHVzZWQuIElmIHlvdSB3YW50IHRvIHVzZQotICAgICAgICAgIHBvd2VyIG9mIDIgdW5pdHMsIHVzZSB0aGUgSUVDIHN0YW5kYXJkOiAmcXVvdDtLaSZxdW90OyBmb3IgMTAyNCwKLSAgICAgICAgICAmcXVvdDtNaSZxdW90OyBmb3IgMTA0ODU3NiwgYW5kIHNvIG9uLiBUaGUgZGVmYXVsdCBpcyBubyB1bml0cywKLSAgICAgICAgICB3aGljaCBtZWFucyB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+IGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIGV4YWN0Ci0gICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPnVuaXRzPC90ZD4KKyAgICAgICAgPHRkPlRoZSB1bml0cyB0aGF0IHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gYXR0cmlidXRlIGlzIGV4cHJlc3NlZCBpbi4gV2hlbiB1c2luZyB0aGUgc3RhbmRhcmQKKyAgICAgICAgc2luZ2xlIGxldHRlciBTSSBkZXNpZ25hdGlvbnMsIHN1Y2ggYXMgPHE+azwvcT4sIDxxPk08L3E+LCBvciA8cT5HPC9xPiwgbXVsdGlwbGVzIG9mIDEwMDAKKyAgICAgICAgYXJlIHVzZWQuIElmIHlvdSB3YW50IHRvIHVzZSBwb3dlciBvZiAyIHVuaXRzLCB1c2UgdGhlIElFQyBzdGFuZGFyZDogPHE+S2k8L3E+IGZvcgorICAgICAgICAxMDI0LCA8cT5NaTwvcT4gZm9yIDEwNDg1NzYsIGFuZCBzbyBvbi4gVGhlIGRlZmF1bHQgaXMgbm8gdW5pdHMsIHdoaWNoIG1lYW5zCisgICAgICAgIHRoZSA8dmFyPnZhbHVlPC92YXI+IGF0dHJpYnV0ZSBleHByZXNzZXMgdGhlIGV4YWN0IG51bWJlciBvZiBieXRlcy48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj53aGVuPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5JbmRpY2F0ZXMgaG93IHRvIGludGVycHJldCB0aGUgc2l6ZSwgd2hldGhlcgotICAgICAgICAgIHRoZSBmaWxlcyB0byBiZSBzZWxlY3RlZCBzaG91bGQgYmUgbGFyZ2VyLCBzbWFsbGVyLCBvciBlcXVhbCB0bwotICAgICAgICAgIHRoYXQgdmFsdWUuIEFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmU6CisgICAgICAgIDx0ZD53aGVuPC90ZD4KKyAgICAgICAgPHRkPkluZGljYXRlcyBob3cgdG8gaW50ZXJwcmV0IHRoZSBzaXplLCB3aGV0aGVyIHRoZSBmaWxlcyB0byBiZSBzZWxlY3RlZCBzaG91bGQgYmUgbGFyZ2VyLAorICAgICAgICAgIHNtYWxsZXIsIG9yIGVxdWFsIHRvIHRoYXQgdmFsdWUuIEFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmU6CiAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgPGxpPmxlc3MgLSBzZWxlY3QgZmlsZXMgbGVzcyB0aGFuIHRoZSBpbmRpY2F0ZWQgc2l6ZQotICAgICAgICAgICAgPGxpPm1vcmUgLSBzZWxlY3QgZmlsZXMgZ3JlYXRlciB0aGFuIHRoZSBpbmRpY2F0ZWQgc2l6ZQotICAgICAgICAgICAgPGxpPmVxdWFsIC0gc2VsZWN0IGZpbGVzIHRoaXMgZXhhY3Qgc2l6ZQotICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgVGhlIGRlZmF1bHQgaXMgZXF1YWwuCi0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICAgICAgPGxpPjxxPmxlc3M8L3E+Jm1kYXNoO3NlbGVjdCBmaWxlcyBsZXNzIHRoYW4gdGhlIGluZGljYXRlZCBzaXplPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5tb3JlPC9xPiZtZGFzaDtzZWxlY3QgZmlsZXMgZ3JlYXRlciB0aGFuIHRoZSBpbmRpY2F0ZWQgc2l6ZTwvbGk+CisgICAgICAgICAgICA8bGk+PHE+ZXF1YWw8L3E+Jm1kYXNoO3NlbGVjdCBmaWxlcyB0aGlzIGV4YWN0IHNpemU8L2xpPgorICAgICAgICAgIDwvdWw+PC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmVxdWFsPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKICAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU2l6ZSBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtqYXIucGF0aH0mcXVvdDsmZ3Q7CiAgICZsdDtwYXR0ZXJuc2V0Jmd0OwogICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXImcXVvdDsvJmd0OwogICAmbHQ7L3BhdHRlcm5zZXQmZ3Q7CiAgICZsdDtzaXplIHZhbHVlPSZxdW90OzQmcXVvdDsgdW5pdHM9JnF1b3Q7S2kmcXVvdDsgd2hlbj0mcXVvdDttb3JlJnF1b3Q7LyZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAogICAgIDxwPlNlbGVjdHMgYWxsIEpBUiBmaWxlcyB0aGF0IGFyZSBsYXJnZXIgdGhhbiA0MDk2IGJ5dGVzLjwvcD4KIAotICAgIDxoND48YSBuYW1lPSJ0eXBlc2VsZWN0Ij5UeXBlIFNlbGVjdG9yPC9hPjwvaDQ+CisgICAgPGg0IGlkPSJ0eXBlc2VsZWN0Ij5UeXBlIFNlbGVjdG9yPC9oND4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7dHlwZSZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIG9mIGEgY2VydGFpbiB0eXBlOgotICAgIGRpcmVjdG9yeSBvciByZWd1bGFyLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3R5cGUmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyBvZiBhIGNlcnRhaW4gdHlwZTogZGlyZWN0b3J5IG9yCisgICAgcmVndWxhci48L3A+CiAKLSAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dHlwZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHR5cGUgb2YgZmlsZSB3aGljaCBzaG91bGQgYmUgdGVzdGVkIGZvci4KLSAgICAgICAgICAgIEFjY2VwdGFibGUgdmFsdWVzIGFyZToKLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgICA8bGk+ZmlsZSAtIHJlZ3VsYXIgZmlsZXM8L2xpPgotICAgICAgICAgICAgICAgIDxsaT5kaXIgLSBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgICAgIDx0ZD50eXBlPC90ZD4KKyAgICAgICAgPHRkPlRoZSB0eXBlIG9mIGZpbGUgd2hpY2ggc2hvdWxkIGJlIHRlc3RlZCBmb3IuICBBY2NlcHRhYmxlIHZhbHVlcyBhcmU6CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxxPmZpbGU8L3E+Jm1kYXNoO3JlZ3VsYXIgZmlsZXM8L2xpPgorICAgICAgICAgICAgPGxpPjxxPmRpcjwvcT4mbWRhc2g7ZGlyZWN0b3JpZXM8L2xpPgorICAgICAgICAgIDwvdWw+PC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAKLSAgICA8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgVHlwZSBTZWxlY3RvciB0byBzZWxlY3Qgb25seQotICAgIGRpcmVjdG9yaWVzIGluIDxjb2RlPiR7c3JjfTwvY29kZT48L3A+CisgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFR5cGUgU2VsZWN0b3IgdG8gc2VsZWN0IG9ubHkgZGlyZWN0b3JpZXMKKyAgICBpbiA8Y29kZT4ke3NyY308L2NvZGU+PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjfSZxdW90OyZndDsKICAgJmx0O3R5cGUgdHlwZT0iZGlyIi8mZ3Q7Ci0mbHQ7L2ZpbGVzZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L2ZpbGVzZXQmZ3Q7PC9wcmU+CiAKLSAgICA8cD5UaGUgVHlwZSBTZWxlY3RvciBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggb3RoZXIgc2VsZWN0b3JzLgotICAgIEZvciBleGFtcGxlLCB0byBzZWxlY3QgZmlsZXMgdGhhdCBhbHNvIGV4aXN0IGluIGEgPGNvZGU+dGVtcGxhdGU8L2NvZGU+Ci0gICAgZGlyZWN0b3J5LCBidXQgYXZvaWQgc2VsZWN0aW5nIGVtcHR5IGRpcmVjdG9yaWVzLCB1c2U6CisgICAgPHA+VGhlIFR5cGUgU2VsZWN0b3IgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIG90aGVyIHNlbGVjdG9ycy4gIEZvciBleGFtcGxlLCB0byBzZWxlY3QKKyAgICBmaWxlcyB0aGF0IGFsc28gZXhpc3QgaW4gYSA8c2FtcD50ZW1wbGF0ZTwvc2FtcD4gZGlyZWN0b3J5LCBidXQgYXZvaWQgc2VsZWN0aW5nIGVtcHR5CisgICAgZGlyZWN0b3JpZXMsIHVzZTo8L3A+CiAKLTxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0iJHtzcmN9IiZndDsKICAgICAmbHQ7YW5kJmd0OwogICAgICAgICAmbHQ7cHJlc2VudCB0YXJnZXRkaXI9InRlbXBsYXRlIi8mZ3Q7CiAgICAgICAgICZsdDt0eXBlIHR5cGU9ImZpbGUiLyZndDsKICAgICAmbHQ7L2FuZCZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAorICAgIDxoNCBpZD0ibW9kaWZpZWQiPk1vZGlmaWVkIFNlbGVjdG9yPC9oND4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O21vZGlmaWVkJmd0OzwvY29kZT4gc2VsZWN0b3IgY29tcHV0ZXMgYSB2YWx1ZSBmb3IgYSBmaWxlLCBjb21wYXJlcyB0aGF0IHRvIHRoZQorICAgIHZhbHVlIHN0b3JlZCBpbiBhIGNhY2hlIGFuZCBzZWxlY3QgdGhlIGZpbGUsIGlmIHRoZXNlIHR3byB2YWx1ZXMgZGlmZmVyLjwvcD4KKyAgICA8cD5CZWNhdXNlIHRoaXMgc2VsZWN0b3IgaXMgaGlnaGx5IGNvbmZpZ3VyYWJsZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlbGVjdGlvbiBpcyBkb25lIGlzOjwvcD4KKyAgICA8b2w+CisgICAgICA8bGk+Z2V0IHRoZSBhYnNvbHV0ZSBwYXRoIGZvciB0aGUgZmlsZTwvbGk+CisgICAgICA8bGk+Z2V0IHRoZSBjYWNoZWQgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBjYWNoZSAoYWJzb2x1dGUgcGF0aCBhcyBrZXkpPC9saT4KKyAgICAgIDxsaT5nZXQgdGhlIG5ldyB2YWx1ZSBmcm9tIHRoZSBjb25maWd1cmVkIGFsZ29yaXRobTwvbGk+CisgICAgICA8bGk+Y29tcGFyZSB0aGVzZSB0d28gdmFsdWVzIHdpdGggdGhlIGNvbmZpZ3VyZWQgY29tcGFyYXRvcjwvbGk+CisgICAgICA8bGk+dXBkYXRlIHRoZSBjYWNoZSBpZiBuZWVkZWQgYW5kIHJlcXVlc3RlZDwvbGk+CisgICAgICA8bGk+ZG8gdGhlIHNlbGVjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIGNvbXBhcmlzb24gcmVzdWx0PC9saT4KKyAgICA8L29sPgorICAgIDxwPlRoZSBjb21wYXJpc29uLCBjb21wdXRpbmcgb2YgdGhlIGhhc2h2YWx1ZSBhbmQgdGhlIHN0b3JlIGlzIGRvbmUgYnkgaW1wbGVtZW50YXRpb24gb2Ygc3BlY2lhbAorICAgIGludGVyZmFjZXMuIFRoZXJlZm9yZSB0aGV5IG1heSBwcm92aWRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy48L3A+CiAKLSAgICA8aDQ+PGEgbmFtZT0ibW9kaWZpZWQiPk1vZGlmaWVkIFNlbGVjdG9yPC9hPjwvaDQ+Ci0gICAgPHA+VGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIGNvbXB1dGVzIGEgdmFsdWUgZm9yIGEgZmlsZSwgY29tcGFyZXMgdGhhdAotICAgIHRvIHRoZSB2YWx1ZSBzdG9yZWQgaW4gYSBjYWNoZSBhbmQgc2VsZWN0IHRoZSBmaWxlLCBpZiB0aGVzZSB0d28gdmFsdWVzCi0gICAgZGlmZmVyLjwvcD4KLSAgICA8cD5CZWNhdXNlIHRoaXMgc2VsZWN0b3IgaXMgaGlnaGx5IGNvbmZpZ3VyYWJsZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHNlbGVjdGlvbiBpcyBkb25lCi0gICAgaXM6IDxvbD4KLSAgICAgICAgPGxpPiBnZXQgdGhlIGFic29sdXRlIHBhdGggZm9yIHRoZSBmaWxlIDwvbGk+Ci0gICAgICAgIDxsaT4gZ2V0IHRoZSBjYWNoZWQgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBjYWNoZSAoYWJzb2x1dGUgcGF0aCBhcyBrZXkpIDwvbGk+Ci0gICAgICAgIDxsaT4gZ2V0IHRoZSBuZXcgdmFsdWUgZnJvbSB0aGUgY29uZmlndXJlZCBhbGdvcml0aG0gPC9saT4KLSAgICAgICAgPGxpPiBjb21wYXJlIHRoZXNlIHR3byB2YWx1ZXMgd2l0aCB0aGUgY29uZmlndXJlZCBjb21wYXJhdG9yIDwvbGk+Ci0gICAgICAgIDxsaT4gdXBkYXRlIHRoZSBjYWNoZSBpZiBuZWVkZWQgYW5kIHJlcXVlc3RlZCA8L2xpPgotICAgICAgICA8bGk+IGRvIHRoZSBzZWxlY3Rpb24gYWNjb3JkaW5nIHRvIHRoZSBjb21wYXJpc29uIHJlc3VsdCA8L2xpPgotICAgICAgICA8L29sPgotICAgIDxwPlRoZSBjb21wYXJpc29uLCBjb21wdXRpbmcgb2YgdGhlIGhhc2h2YWx1ZSBhbmQgdGhlIHN0b3JlIGlzIGRvbmUgYnkgaW1wbGVtZW50YXRpb24KLSAgICBvZiBzcGVjaWFsIGludGVyZmFjZXMuIFRoZXJlZm9yZSB0aGV5IG1heSBwcm92aWRlIGFkZGl0aW9uYWwgcGFyYW1ldGVycy48L3A+Ci0KLSAgICA8cD5UaGUgPGNvZGU+Jmx0O21vZGlmaWVkJmd0OzwvY29kZT4gc2VsZWN0b3IgY2FuIGJlIHVzZWQgYXMgYQotICAgICAgUmVzb3VyY2VTZWxlY3RvciAoc2VlIHRoZQotICAgICAgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwjcmVzdHJpY3QiPiZsdDtyZXN0cmljdCZndDs8L2E+Ci0gICAgICBSZXNvdXJjZUNvbGxlY3Rpb24pLgotICAgIEluIHRoYXQgY2FzZSBpdCBtYXBzIHNpbXBsZSBmaWxlIHJlc291cmNlcyB0byBmaWxlcyBhbmQgZG9lcyBpdHMgam9iLiBJZiB0aGUKLSAgICByZXNvdXJjZSBpcyBmcm9tIGFub3RoZXIgdHlwZSwgdGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIHRyaWVzCi0gICAgdG8gKDxiPmF0dGVudGlvbiE8L2I+KSBjb3B5IHRoZSBjb250ZW50IGludG8gYSBsb2NhbCBmaWxlIGZvciBjb21wdXRpbmcgdGhlCi0gICAgaGFzaHZhbHVlLjwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O21vZGlmaWVkJmd0OzwvY29kZT4gc2VsZWN0b3IgY2FuIGJlIHVzZWQgYXMgYSBSZXNvdXJjZVNlbGVjdG9yIChzZWUKKyAgICB0aGUgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwjcmVzdHJpY3QiPiZsdDtyZXN0cmljdCZndDs8L2E+IFJlc291cmNlQ29sbGVjdGlvbikuICBJbiB0aGF0IGNhc2UgaXQKKyAgICBtYXBzIHNpbXBsZSBmaWxlIHJlc291cmNlcyB0byBmaWxlcyBhbmQgZG9lcyBpdHMgam9iLiBJZiB0aGUgcmVzb3VyY2UgaXMgZnJvbSBhbm90aGVyIHR5cGUsCisgICAgdGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIHRyaWVzIHRvICg8c3Ryb25nPmF0dGVudGlvbiE8L3N0cm9uZz4pIGNvcHkgdGhlCisgICAgY29udGVudCBpbnRvIGEgbG9jYWwgZmlsZSBmb3IgY29tcHV0aW5nIHRoZSBoYXNodmFsdWUuPC9wPgogCiAgICAgPHA+SWYgdGhlIHNvdXJjZSByZXNvdXJjZSBpcyBub3QgYSBmaWxlc3lzdGVtIHJlc291cmNlIHRoZQogICAgIG1vZGlmaWVkIHNlbGVjdG9yIHdpbGwgZG93bmxvYWQgaXQgdG8KICAgICB0aGUgPGEgaHJlZj0iLi4vcnVubmluZy5odG1sI3RtcGRpciI+dGVtcG9yYXJ5IGRpcmVjdG9yeTwvYT4uPC9wPgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBhbGdvcml0aG0gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gVGhlIHR5cGUgb2YgYWxnb3JpdGhtIHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIChmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSBsYXRlcik6Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgPGxpPiBoYXNodmFsdWUgLSBIYXNodmFsdWVBbGdvcml0aG0gPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+IGRpZ2VzdCAtIERpZ2VzdEFsZ29yaXRobSA8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4gY2hlY2tzdW0gLSBDaGVja3N1bUFsZ29yaXRobSA8L2xpPgotICAgICAgICAgICAgICAgIDxsaT4gbGFzdG1vZGlmaWVkIC0gTGFzdE1vZGlmaWVkQWxnb3JpdGhtIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgorICAgICAgICA8dGQ+YWxnb3JpdGhtPC90ZD4KKyAgICAgICAgPHRkPlRoZSB0eXBlIG9mIGFsZ29yaXRobSBzaG91bGQgYmUgdXNlZC4gIEFjY2VwdGFibGUgdmFsdWVzIGFyZSAoZnVydGhlciBpbmZvcm1hdGlvbgorICAgICAgICAgIHNlZSBsYXRlcik6CisgICAgICAgICAgPHVsPgorICAgICAgICAgICAgPGxpPjxxPmhhc2h2YWx1ZTwvcT4mbWRhc2g7SGFzaHZhbHVlQWxnb3JpdGhtPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5kaWdlc3Q8L3E+Jm1kYXNoO0RpZ2VzdEFsZ29yaXRobTwvbGk+CisgICAgICAgICAgICA8bGk+PHE+Y2hlY2tzdW08L3E+Jm1kYXNoO0NoZWNrc3VtQWxnb3JpdGhtPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5sYXN0bW9kaWZpZWQ8L3E+Jm1kYXNoO0xhc3RNb2RpZmllZEFsZ29yaXRobTwvbGk+CisgICAgICAgICAgPC91bD4KICAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPmRpZ2VzdDwvaT4gPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5kaWdlc3Q8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IGNhY2hlIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFRoZSB0eXBlIG9mIGNhY2hlIHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIChmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZSBsYXRlcik6Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgICAgPGxpPiBwcm9wZXJ0eWZpbGUgLSBQcm9wZXJ0eWZpbGVDYWNoZSA8L2xpPgotICAgICAgICAgICAgPC91bD4KKyAgICAgICAgPHRkPmNhY2hlPC90ZD4KKyAgICAgICAgPHRkPlRoZSB0eXBlIG9mIGNhY2hlIHNob3VsZCBiZSB1c2VkLiAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlIChmdXJ0aGVyIGluZm9ybWF0aW9uIHNlZQorICAgICAgICAgIGxhdGVyKToKKyAgICAgICAgICA8dWw+CisgICAgICAgICAgICA8bGk+PHE+cHJvcGVydHlmaWxlPC9xPiZtZGFzaDtQcm9wZXJ0eWZpbGVDYWNoZTwvbGk+CisgICAgICAgICAgPC91bD4KICAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPnByb3BlcnR5ZmlsZTwvaT4gPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT5wcm9wZXJ0eWZpbGU8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IGNvbXBhcmF0b3IgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gVGhlIHR5cGUgb2YgY29tcGFyYXRvciBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICAgIEFjY2VwdGFibGUgdmFsdWVzIGFyZSAoZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgbGF0ZXIpOgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICAgIDxsaT4gZXF1YWwgLSBFcXVhbENvbXBhcmF0b3IgPC9saT4KLSAgICAgICAgICAgICAgICA8bGk+IHJ1bGUgLSBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IKLSAgICAgICAgICAgICAgICAgIDwhLS0gTk9URSAtLT4KLSAgICAgICAgICAgICAgICAgIDxpPihzZWUgPGEgaHJlZj0iI01vZFNlbE5vdGUiPm5vdGU8L2E+IGZvciByZXN0cmljdGlvbnMpPC9pPgotICAgICAgICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgICA8L3VsPgorICAgICAgICA8dGQ+Y29tcGFyYXRvcjwvdGQ+CisgICAgICAgIDx0ZD5UaGUgdHlwZSBvZiBjb21wYXJhdG9yIHNob3VsZCBiZSB1c2VkLiAgQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgIDxsaT48cT5lcXVhbDwvcT4mbWRhc2g7RXF1YWxDb21wYXJhdG9yPC9saT4KKyAgICAgICAgICAgIDxsaT48cT5ydWxlPC9xPiZtZGFzaDtqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IKKyAgICAgICAgICAgICAgPCEtLSBOT1RFIC0tPgorICAgICAgICAgICAgICA8ZW0+KHNlZSA8YSBocmVmPSIjTW9kU2VsTm90ZSI+bm90ZTwvYT4gZm9yIHJlc3RyaWN0aW9ucyk8L2VtPjwvbGk+CisgICAgICAgICAgPC91bD4KICAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPmVxdWFsPC9pPiA8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPmVxdWFsPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBhbGdvcml0aG1jbGFzcyA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBDbGFzc25hbWUgb2YgY3VzdG9tIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbi4gTG93ZXIKLSAgICAgICAgICBwcmlvcml0eSB0aGFuIDxpPmFsZ29yaXRobTwvaT4uIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vIDwvdGQ+CisgICAgICAgIDx0ZD5hbGdvcml0aG1jbGFzczwvdGQ+CisgICAgICAgIDx0ZD5DbGFzc25hbWUgb2YgY3VzdG9tIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbi4gTG93ZXIgcHJpb3JpdHkKKyAgICAgICAgICB0aGFuIDx2YXI+YWxnb3JpdGhtPC92YXI+LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBjYWNoZWNsYXNzIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IENsYXNzbmFtZSBvZiBjdXN0b20gY2FjaGUgaW1wbGVtZW50YXRpb24uIExvd2VyCi0gICAgICAgICAgcHJpb3JpdHkgdGhhbiA8aT5jYWNoZTwvaT4uIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vIDwvdGQ+CisgICAgICAgIDx0ZD5jYWNoZWNsYXNzPC90ZD4KKyAgICAgICAgPHRkPkNsYXNzbmFtZSBvZiBjdXN0b20gY2FjaGUgaW1wbGVtZW50YXRpb24uIExvd2VyIHByaW9yaXR5IHRoYW4gPHZhcj5jYWNoZTwvdmFyPi48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gY29tcGFyYXRvcmNsYXNzIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IENsYXNzbmFtZSBvZiBjdXN0b20gY29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbi4gTG93ZXIKLSAgICAgICAgICBwcmlvcml0eSB0aGFuIDxpPmNvbXBhcmF0b3I8L2k+LiA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObyA8L3RkPgorICAgICAgICA8dGQ+Y29tcGFyYXRvcmNsYXNzPC90ZD4KKyAgICAgICAgPHRkPkNsYXNzbmFtZSBvZiBjdXN0b20gY29tcGFyYXRvciBpbXBsZW1lbnRhdGlvbi4gTG93ZXIgcHJpb3JpdHkKKyAgICAgICAgICB0aGFuIDx2YXI+Y29tcGFyYXRvcjwvdmFyPi48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gdXBkYXRlIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFNob3VsZCB0aGUgY2FjaGUgYmUgdXBkYXRlZCB3aGVuIHZhbHVlcyBkaWZmZXI/IChib29sZWFuKSA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPiBObywgZGVmYXVsdHMgdG8gPGk+dHJ1ZTwvaT4gPC90ZD4KKyAgICAgICAgPHRkPnVwZGF0ZTwvdGQ+CisgICAgICAgIDx0ZD5TaG91bGQgdGhlIGNhY2hlIGJlIHVwZGF0ZWQgd2hlbiB2YWx1ZXMgZGlmZmVyPyAoYm9vbGVhbik8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IHNlbGRpcnMgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gU2hvdWxkIGRpcmVjdG9yaWVzIGJlIHNlbGVjdGVkPyAoYm9vbGVhbikgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj4gTm8sIGRlZmF1bHRzIHRvIDxpPnRydWU8L2k+IDwvdGQ+CisgICAgICAgIDx0ZD5zZWxkaXJzPC90ZD4KKyAgICAgICAgPHRkPlNob3VsZCBkaXJlY3RvcmllcyBiZSBzZWxlY3RlZD8gKGJvb2xlYW4pPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPjwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBzZWxyZXMgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gU2hvdWxkIFJlc291cmNlcyB3aXRob3V0IGFuIElucHV0U3RyZWFtLCBhbmQKLSAgICAgICAgICAgdGhlcmVmb3JlIHdpdGhvdXQgY2hlY2tpbmcsIGJlIHNlbGVjdGVkPyAgKGJvb2xlYW4pIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vLCBkZWZhdWx0cyB0byA8aT50cnVlPC9pPi4gT25seSByZWxldmFudAotICAgICAgICAgICB3aGVuIHVzZWQgYXMgUmVzb3VyY2VTZWxlY3Rvci4gPC90ZD4KKyAgICAgICAgPHRkPnNlbHJlczwvdGQ+CisgICAgICAgIDx0ZD5TaG91bGQgUmVzb3VyY2VzIHdpdGhvdXQgYW4gSW5wdXRTdHJlYW0sIGFuZCB0aGVyZWZvcmUgd2l0aG91dCBjaGVja2luZywgYmUgc2VsZWN0ZWQ/CisgICAgICAgICAgKGJvb2xlYW4pPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0cyB0byA8cT50cnVlPC9xPi4gT25seSByZWxldmFudCB3aGVuIHVzZWQgYXMgUmVzb3VyY2VTZWxlY3Rvci48L3RkPgogICAgICAgPC90cj4KICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gZGVsYXl1cGRhdGUgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gSWYgc2V0IHRvIDxpPnRydWU8L2k+LCB0aGUgc3RvcmFnZSBvZiB0aGUgY2FjaGUgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZQotICAgICAgICAgICAgIG5leHQgZmluaXNoZWQgQnVpbGRFdmVudDsgdGFzayBmaW5pc2hlZCwgdGFyZ2V0IGZpbmlzaGVkIG9yIGJ1aWxkIGZpbmlzaGVkLAotICAgICAgICAgICAgIHdoaWNoZXZlciBjb21lcyBmaXJzdC4gIFRoaXMgaXMgcHJvdmlkZWQgZm9yIGluY3JlYXNlZCBwZXJmb3JtYW5jZS4gIElmIHNldAotICAgICAgICAgICAgIHRvIDxpPmZhbHNlPC9pPiwgdGhlIHN0b3JhZ2Ugb2YgdGhlIGNhY2hlIHdpbGwgaGFwcGVuIHdpdGggZWFjaCBjaGFuZ2UuICBUaGlzCi0gICAgICAgICAgICAgYXR0cmlidXRlIGRlcGVuZHMgdXBvbiB0aGUgPGk+dXBkYXRlPC9pPiBhdHRyaWJ1dGUuIChib29sZWFuKTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+IE5vLCBkZWZhdWx0cyB0byA8aT50cnVlPC9pPiA8L3RkPgorICAgICAgICA8dGQ+ZGVsYXl1cGRhdGU8L3RkPgorICAgICAgICA8dGQ+SWYgc2V0IHRvIDxxPnRydWU8L3E+LCB0aGUgc3RvcmFnZSBvZiB0aGUgY2FjaGUgd2lsbCBiZSBkZWxheWVkIHVudGlsIHRoZSBuZXh0IGZpbmlzaGVkCisgICAgICAgICAgQnVpbGRFdmVudDsgdGFzayBmaW5pc2hlZCwgdGFyZ2V0IGZpbmlzaGVkIG9yIGJ1aWxkIGZpbmlzaGVkLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuICBUaGlzCisgICAgICAgICAgaXMgcHJvdmlkZWQgZm9yIGluY3JlYXNlZCBwZXJmb3JtYW5jZS4gIElmIHNldCB0byA8cT5mYWxzZTwvcT4sIHRoZSBzdG9yYWdlIG9mIHRoZSBjYWNoZQorICAgICAgICAgIHdpbGwgaGFwcGVuIHdpdGggZWFjaCBjaGFuZ2UuICBUaGlzIGF0dHJpYnV0ZSBkZXBlbmRzIHVwb24gdGhlIDx2YXI+dXBkYXRlPC92YXI+CisgICAgICAgICAgYXR0cmlidXRlLiAoYm9vbGVhbik8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAotICAgIDxwPlRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlIHNldCB3aXRoIG5lc3RlZCA8Y29kZT4mbHQ7cGFyYW0vJmd0OzwvY29kZT4gdGFncy4gV2l0aCA8Y29kZT4mbHQ7cGFyYW0vJmd0OzwvY29kZT4KLSAgICB0YWdzIHlvdSBjYW4gc2V0IG90aGVyIHZhbHVlcyB0b28gLSBhcyBsb25nIGFzIHRoZXkgYXJlIG5hbWVkIGFjY29yZGluZyB0bwotICAgIHRoZSBmb2xsb3dpbmcgcnVsZXM6IDx1bD4KLSAgICAgICAgPGxpPiA8Yj4gYWxnb3JpdGhtIDwvYj46IHNhbWUgYXMgYXR0cmlidXRlIGFsZ29yaXRobSA8L2xpPgotICAgICAgICA8bGk+IDxiPiBjYWNoZSA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBjYWNoZSA8L2xpPgotICAgICAgICA8bGk+IDxiPiBjb21wYXJhdG9yIDwvYj46IHNhbWUgYXMgYXR0cmlidXRlIGNvbXBhcmF0b3IgPC9saT4KLSAgICAgICAgPGxpPiA8Yj4gYWxnb3JpdGhtY2xhc3MgPC9iPjogc2FtZSBhcyBhdHRyaWJ1dGUgYWxnb3JpdGhtY2xhc3MgPC9saT4KLSAgICAgICAgPGxpPiA8Yj4gY2FjaGVjbGFzcyA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBjYWNoZWNsYXNzIDwvbGk+Ci0gICAgICAgIDxsaT4gPGI+IGNvbXBhcmF0b3JjbGFzcyA8L2I+OiBzYW1lIGFzIGF0dHJpYnV0ZSBjb21wYXJhdG9yY2xhc3MgPC9saT4KLSAgICAgICAgPGxpPiA8Yj4gdXBkYXRlIDwvYj46IHNhbWUgYXMgYXR0cmlidXRlIHVwZGF0ZSA8L2xpPgotICAgICAgICA8bGk+IDxiPiBzZWxkaXJzIDwvYj46IHNhbWUgYXMgYXR0cmlidXRlIHNlbGRpcnMgPC9saT4KLSAgICAgICAgPGxpPiA8Yj4gYWxnb3JpdGhtLiogPC9iPjogVmFsdWUgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGFsZ29yaXRobSB2aWEgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPnNldDwvaT5YWC1tZXRob2RzIDwvbGk+Ci0gICAgICAgIDxsaT4gPGI+IGNhY2hlLiogPC9iPjogVmFsdWUgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGNhY2hlIHZpYSBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+c2V0PC9pPlhYLW1ldGhvZHMgPC9saT4KLSAgICAgICAgPGxpPiA8Yj4gY29tcGFyYXRvci4qIDwvYj46IFZhbHVlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBjb21wYXJhdG9yIHZpYSBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+c2V0PC9pPlhYLW1ldGhvZHMgPC9saT4KLSAgICA8L3VsPgorICAgIDxoNT5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2g1PgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+PGZvbnQgc2l6ZT0iKzEiPjxiPiBBbGdvcml0aG0gb3B0aW9uczwvYj48L2ZvbnQ+PC90ZD48L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPk5hbWU8L2I+PC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7bW9kaWZpZWQmZ3Q7PC9jb2RlPiBzZWxlY3RvciBzdXBwb3J0cyBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4KKyAgICBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcGF0aCI+cGF0aC1saWtlIHN0cnVjdHVyZTwvYT4gZm9yIGZpbmRpbmcKKyAgICBjdXN0b20gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucy48L3A+CisKKyAgICA8cD5BbGwgYXR0cmlidXRlcyBvZiBhIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIGFuIGJlIHNldCB3aXRoCisgICAgbmVzdGVkIDxjb2RlPiZsdDtwYXJhbS8mZ3Q7PC9jb2RlPiB0YWdzLiBBZGRpdGlvbmFsIHZhbHVlcyBjYW4gYmUgc2V0CisgICAgd2l0aCA8Y29kZT4mbHQ7cGFyYW0vJmd0OzwvY29kZT4gdGFncyBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGJlbG93LjwvcD4KKworICAgIDxoNj5hbGdvcml0aG08L2g2PgorICAgIDxwPlNhbWUgYXMgPHZhcj5hbGdvcml0aG08L3Zhcj4gYXR0cmlidXRlLCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB2YWx1ZXM6PC9wPgorICAgIDx0YWJsZT4KKyAgICAgPHRyPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+TmFtZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBoYXNodmFsdWUgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGludG8gYSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICAgICAgYW5kIHVzZSB0aGF0cyBoYXNoVmFsdWUoKS4gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlcXVpcmVkLgotICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+aGFzaHZhbHVlPC90ZD4KKyAgICAgICAgPHRkPlJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBpbnRvIGEgPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gYW5kIHVzZXMKKyAgICAgICAgICB0aGF0IDxjb2RlPmhhc2hWYWx1ZSgpPC9jb2RlPi4gTm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIHJlcXVpcmVkLjwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBkaWdlc3QgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gVXNlcyBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3QuIFRoaXMgQWxnb3JpdGhtIHN1cHBvcnRzCi0gICAgICAgICAgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICA8dGQ+ZGlnZXN0PC90ZD4KKyAgICAgICAgPHRkPlVzZXMgPGNvZGU+amF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0PC9jb2RlPi4gVGhpcyBBbGdvcml0aG0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgICAgICAgIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgPGxpPjxpPmFsZ29yaXRobS5hbGdvcml0aG08L2k+IChvcHRpb25hbCk6IE5hbWUgb2YgdGhlIERpZ2VzdCBhbGdvcml0aG0KLSAgICAgICAgICAgICAgICAoZS5nLiAnTUQ1JyBvciAnU0hBJywgZGVmYXVsdCA9IDxpPk1ENTwvaT4pIDwvbGk+Ci0gICAgICAgICAgICA8bGk+PGk+YWxnb3JpdGhtLnByb3ZpZGVyPC9pPiAob3B0aW9uYWwpOiBOYW1lIG9mIHRoZSBEaWdlc3QgcHJvdmlkZXIKLSAgICAgICAgICAgICAgICAoZGVmYXVsdCA9IDxpPm51bGw8L2k+KSA8L2xpPgorICAgICAgICAgICAgPGxpPjx2YXI+YWxnb3JpdGhtLmFsZ29yaXRobTwvdmFyPiAob3B0aW9uYWwpOiBOYW1lIG9mIHRoZSBEaWdlc3QgYWxnb3JpdGhtCisgICAgICAgICAgICAgIChlLmcuIDxxPk1ENTwvcT4gb3IgPHE+U0hBPC9xPik7IGRlZmF1bHQgaXMgPHE+TUQ1PC9xPjwvbGk+CisgICAgICAgICAgICA8bGk+PHZhcj5hbGdvcml0aG0ucHJvdmlkZXI8L3Zhcj4gKG9wdGlvbmFsKTogTmFtZSBvZiB0aGUgRGlnZXN0IHByb3ZpZGVyOyBkZWZhdWx0CisgICAgICAgICAgICAgIGlzIDxxPm51bGw8L3E+PC9saT4KICAgICAgICAgICA8L3VsPgogICAgICAgICA8L3RkPgogICAgICAgPC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gY2hlY2tzdW0gPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gVXNlcyBqYXZhLnV0aWwuemlwLkNoZWNrc3VtLiBUaGlzIEFsZ29yaXRobSBzdXBwb3J0cwotICAgICAgICAgIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLSAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICA8bGk+PGk+YWxnb3JpdGhtLmFsZ29yaXRobTwvaT4gKG9wdGlvbmFsKTogTmFtZSBvZiB0aGUgYWxnb3JpdGhtCi0gICAgICAgICAgICAgICAgKGUuZy4gJ0NSQycgb3IgJ0FETEVSJywgZGVmYXVsdCA9IDxpPkNSQzwvaT4pIDwvbGk+Ci0gICAgICAgICAgPC91bD4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IGxhc3Rtb2RpZmllZCA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBVc2VzIHRoZSBsYXN0TW9kaWZpZWQgcHJvcGVydHkgb2YgYSBmaWxlLiBObyBhZGRpdGlvbmFsCi0gICAgICAgICAgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC4KLSAgICAgICAgPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+PHRkIGNvbHNwYW49IjIiPjxmb250IHNpemU9IisxIj48Yj4gQ2FjaGUgb3B0aW9ucyA8L2I+PC9mb250PjwvdGQ+PC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gcHJvcGVydHlmaWxlIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFVzZSB0aGUgamF2YS51dGlsLlByb3BlcnRpZXMgY2xhc3MgYW5kIGl0cyBwb3NzaWJpbGl0eQotICAgICAgICAgIHRvIGxvYWQgYW5kIHN0b3JlIHRvIGZpbGUuCi0gICAgICAgICAgVGhpcyBDYWNoZSBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0gICAgICAgICAgPHVsPgotICAgICAgICAgICAgPGxpPjxpPmNhY2hlLmNhY2hlZmlsZTwvaT4gKG9wdGlvbmFsKTogTmFtZSBvZiB0aGUgcHJvcGVydGllcy1maWxlCi0gICAgICAgICAgICAgICAgKGRlZmF1bHQgPSA8aT5jYWNoZS5wcm9wZXJ0aWVzPC9pPikgPC9saT4KLSAgICAgICAgICA8L3VsPgotICAgICAgICA8L3RkPgotICAgICAgPC90cj4KLSAgICAgIDx0cj48dGQgY29sc3Bhbj0iMiI+PGZvbnQgc2l6ZT0iKzEiPjxiPiBDb21wYXJhdG9yIG9wdGlvbnM8L2I+PC9mb250PjwvdGQ+PC90cj4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gZXF1YWwgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4gVmVyeSBzaW1wbGUgb2JqZWN0IGNvbXBhcmlzb24uIDwvdGQ+Ci0gICAgICA8L3RyPgotICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBydWxlIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+IFVzZXMgPGk+amF2YS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yPC9pPiBmb3IgT2JqZWN0Ci0gICAgICAgICAgY29tcGFyaXNvbi4KLSAgICAgICAgICA8IS0tIE5PVEUgLS0+Ci0gICAgICAgICAgPGk+KHNlZSA8YSBocmVmPSIjTW9kU2VsTm90ZSI+bm90ZTwvYT4gZm9yIHJlc3RyaWN0aW9ucyk8L2k+Ci0gICAgICAgIDwvdGQ+Ci0gICAgICA8L3RyPgorICAgICA8dHI+CisgICAgICAgPHRkPmNoZWNrc3VtPC90ZD4KKyAgICAgICA8dGQ+VXNlcyA8Y29kZT5qYXZhLnV0aWwuemlwLkNoZWNrc3VtPC9jb2RlPi4gVGhpcyBBbGdvcml0aG0gc3VwcG9ydHMgdGhlIGZvbGxvd2luZworICAgICAgICAgYXR0cmlidXRlczoKKyAgICAgICAgIDx1bD4KKyAgICAgICAgICAgPGxpPjx2YXI+YWxnb3JpdGhtLmFsZ29yaXRobTwvdmFyPiAob3B0aW9uYWwpOiBOYW1lIG9mIHRoZSBhbGdvcml0aG0gKGUuZy4gPHE+Q1JDPC9xPgorICAgICAgICAgICAgIG9yIDxxPkFETEVSPC9xPik7IGRlZmF1bHQgaXMgPHE+Q1JDPC9xPik8L2xpPgorICAgICAgICAgPC91bD4KKyAgICAgICA8L3RkPgorICAgICA8L3RyPgorICAgICA8dHI+CisgICAgICAgPHRkPmxhc3Rtb2RpZmllZDwvdGQ+CisgICAgICAgPHRkPlVzZXMgdGhlIGxhc3RNb2RpZmllZCBwcm9wZXJ0eSBvZiBhIGZpbGUuIE5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC48L3RkPgorICAgICA8L3RyPgogICAgIDwvdGFibGU+CisgICAgPGg2PmNhY2hlPC9oNj4KKyAgICA8cD5TYW1lIGFzIDx2YXI+Y2FjaGU8L3Zhcj4gYXR0cmlidXRlLCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB2YWx1ZXM6PC9wPgorICAgIDx0YWJsZT4KKyAgICAgPHRyPgorICAgICAgIDx0aCBzY29wZT0iY29sIj5OYW1lPC90aD4KKyAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICA8L3RyPgorICAgICA8dHI+CisgICAgICAgPHRkPnByb3BlcnR5ZmlsZTwvdGQ+CisgICAgICAgPHRkPlVzZSB0aGUgPGNvZGU+amF2YS51dGlsLlByb3BlcnRpZXM8L2NvZGU+IGNsYXNzIGFuZCBpdHMgcG9zc2liaWxpdHkgdG8gbG9hZCBhbmQgc3RvcmUgdG8KKyAgICAgICAgIGZpbGUuICBUaGlzIENhY2hlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgIDx1bD4KKyAgICAgICAgICAgPGxpPjx2YXI+Y2FjaGUuY2FjaGVmaWxlPC92YXI+IChvcHRpb25hbCk6IE5hbWUgb2YgdGhlIHByb3BlcnRpZXMgZmlsZTsgZGVmYXVsdAorICAgICAgICAgICAgIGlzIDxxPmNhY2hlLnByb3BlcnRpZXM8L3E+PC9saT4KKyAgICAgICAgIDwvdWw+CisgICAgICAgPC90ZD4KKyAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorICAgIDxoNj5jb21wYXJhdG9yPC9oNj4KKyAgICA8cD5TYW1lIGFzIDx2YXI+Y29tcGFyYXRvcjwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorICAgIDxoNj5hbGdvcml0aG1jbGFzczwvaDY+CisgICAgPHA+U2FtZSBhcyA8dmFyPmFsZ29yaXRobWNsYXNzPC92YXI+IGF0dHJpYnV0ZS48L3A+CisgICAgPGg2PmNvbXBhcmF0b3JjbGFzczwvaDY+CisgICAgPHA+U2FtZSBhcyA8dmFyPmNvbXBhcmF0b3JjbGFzczwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorICAgIDxoNj5jYWNoZWNsYXNzPC9oNj4KKyAgICA8cD5TYW1lIGFzIDx2YXI+Y2FjaGVjbGFzczwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorICAgIDxoNj51cGRhdGU8L2g2PgorICAgIDxwPlNhbWUgYXMgPHZhcj51cGRhdGU8L3Zhcj4gYXR0cmlidXRlLjwvcD4KKyAgICA8aDY+c2VsZGlyczwvaDY+CisgICAgPHA+U2FtZSBhcyA8dmFyPmNvbXBhcmF0b3JjbGFzczwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi0gICAgPHA+VGhlIDxjb2RlPiZsdDttb2RpZmllZCZndDs8L2NvZGU+IHNlbGVjdG9yIHN1cHBvcnRzIGEgbmVzdGVkCi0gICAgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj4KLSAgICBQQVRIIGxpa2Ugc3RydWN0dXJlPC9hPiBmb3IgZmluZGluZyBjdXN0b20gaW50ZXJmYWNlIGltcGxlbWVudGF0aW9ucy4gPC9wPgotCisgICAgPGg1PkV4YW1wbGVzPC9oNT4KICAgICA8cD5IZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byB1c2UgdGhlIE1vZGlmaWVkIFNlbGVjdG9yOjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7Ci0gICAgICAgICAgICAmbHQ7bW9kaWZpZWQvJmd0OwotICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICAgJmx0Oy9jb3B5Jmd0OwotICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KLSAgICA8cD5UaGlzIHdpbGwgY29weSBhbGwgZmlsZXMgZnJvbSA8aT5zcmM8L2k+IHRvIDxpPmRlc3Q8L2k+IHdoaWNoIGNvbnRlbnQgaGFzIGNoYW5nZWQuCi0gICAgVXNpbmcgYW4gdXBkYXRpbmcgUHJvcGVydHlmaWxlQ2FjaGUgd2l0aCBjYWNoZS5wcm9wZXJ0aWVzIGFuZAorICAgIDxwcmU+CismbHQ7Y29weSB0b2Rpcj0iZGVzdCImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiJmd0OworICAgICAgICAmbHQ7bW9kaWZpZWQvJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KKworICAgIDxwPlRoaXMgd2lsbCBjb3B5IGFsbCBmaWxlcyBmcm9tIDxzYW1wPnNyYzwvc2FtcD4gdG8gPHNhbXA+ZGVzdDwvc2FtcD4gd2hpY2ggY29udGVudCBoYXMKKyAgICBjaGFuZ2VkLiAgVXNpbmcgYW4gdXBkYXRpbmcgUHJvcGVydHlmaWxlQ2FjaGUgd2l0aCA8c2FtcD5jYWNoZS5wcm9wZXJ0aWVzPC9zYW1wPiBhbmQKICAgICBNRDUtRGlnZXN0QWxnb3JpdGhtLjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7Ci0gICAgICAgICAgICAmbHQ7bW9kaWZpZWQgdXBkYXRlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgIHNlbGRpcnM9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgY2FjaGU9InByb3BlcnR5ZmlsZSIKLSAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG09ImRpZ2VzdCIKLSAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yPSJlcXVhbCImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgICAgIHZhbHVlPSJjYWNoZS5wcm9wZXJ0aWVzIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKLSAgICAgICAgICAgICZsdDsvbW9kaWZpZWQmZ3Q7CisgICAgPHByZT4KKyZsdDtjb3B5IHRvZGlyPSJkZXN0IiZndDsKKyAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7CisgICAgICAgICZsdDttb2RpZmllZCB1cGRhdGU9InRydWUiCisgICAgICAgICAgICAgICAgICBzZWxkaXJzPSJ0cnVlIgorICAgICAgICAgICAgICAgICAgY2FjaGU9InByb3BlcnR5ZmlsZSIKKyAgICAgICAgICAgICAgICAgIGFsZ29yaXRobT0iZGlnZXN0IgorICAgICAgICAgICAgICAgICAgY29tcGFyYXRvcj0iZXF1YWwiJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNhY2hlLmNhY2hlZmlsZSIgICAgIHZhbHVlPSJjYWNoZS5wcm9wZXJ0aWVzIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iYWxnb3JpdGhtLmFsZ29yaXRobSIgdmFsdWU9Ik1ENSIvJmd0OworICAgICAgICAmbHQ7L21vZGlmaWVkJmd0OworICAgICZsdDsvZmlsZXNldCZndDsKKyZsdDsvY29weSZndDs8L3ByZT4KKworICAgIDxwPlRoaXMgaXMgdGhlIHNhbWUgZXhhbXBsZSByZXdyaXR0ZW4gYXMgQ29yZVNlbGVjdG9yIHdpdGggc2V0dGluZyB0aGUgYWxsIHRoZSB2YWx1ZXMgKHNhbWUgYXMKKyAgICBkZWZhdWx0cyBhcmUpLjwvcD4KKworICAgIDxwcmU+CismbHQ7Y29weSB0b2Rpcj0iZGVzdCImZ3Q7CisgICAgJmx0O2ZpbGVzZXQgZGlyPSJzcmMiJmd0OworICAgICAgICAmbHQ7Y3VzdG9tIGNsYXNzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yIiZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJ1cGRhdGUiICAgICB2YWx1ZT0idHJ1ZSIvJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9InNlbGRpcnMiICAgIHZhbHVlPSJ0cnVlIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY2FjaGUiICAgICAgdmFsdWU9InByb3BlcnR5ZmlsZSIvJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobSIgIHZhbHVlPSJkaWdlc3QiLyZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJjb21wYXJhdG9yIiB2YWx1ZT0iZXF1YWwiLyZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJjYWNoZS5jYWNoZWZpbGUiICAgICB2YWx1ZT0iY2FjaGUucHJvcGVydGllcyIvJmd0OworICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImFsZ29yaXRobS5hbGdvcml0aG0iIHZhbHVlPSJNRDUiLyZndDsKKyAgICAgICAgJmx0Oy9jdXN0b20mZ3Q7CisgICAgJmx0Oy9maWxlc2V0Jmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgorCisgICAgPHA+QW5kIHRoaXMgaXMgdGhlIHNhbWUgcmV3cml0dGVuIGFzIEN1c3RvbVNlbGVjdG9yLjwvcD4KKworICAgIDxwcmU+CismbHQ7dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLWFuZC11cGxvYWQtc2l0ZSImZ3Q7CisgICAgJmx0O2VjaG8mZ3Q7IGdlbmVyYXRlIHRoZSBzaXRlIHVzaW5nIGZvcnJlc3QgJmx0Oy9lY2hvJmd0OworICAgICZsdDthbnRjYWxsIHRhcmdldD0ic2l0ZSIvJmd0OworCisgICAgJmx0O2VjaG8mZ3Q7IHVwbG9hZCB0aGUgY2hhbmdlZCBmaWxlICZsdDsvZWNobyZndDsKKyAgICAmbHQ7ZnRwIHNlcnZlcj0iJHtmdHAuc2VydmVyfSIgdXNlcmlkPSIke2Z0cC51c2VyfSIgcGFzc3dvcmQ9IiR7ZnRwLnB3ZH0iJmd0OworICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiJmd0OworICAgICAgICAgICAgJmx0O21vZGlmaWVkLyZndDsKICAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OwotICAgICZsdDsvY29weSZndDsKLSAgICA8L3ByZT48L2Jsb2NrcXVvdGU+Ci0gIDxwPlRoaXMgaXMgdGhlIHNhbWUgZXhhbXBsZSByZXdyaXR0ZW4gYXMgQ29yZVNlbGVjdG9yIHdpdGggc2V0dGluZyB0aGUgYWxsIHRoZSB2YWx1ZXMKLSAgKHNhbWUgYXMgZGVmYXVsdHMgYXJlKS48L3A+CisgICAgJmx0Oy9mdHAmZ3Q7CismbHQ7L3RhcmdldCZndDs8L3ByZT4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O2NvcHkgdG9kaXI9ImRlc3QiJmd0OwotICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9InNyYyImZ3Q7Ci0gICAgICAgICAgICAmbHQ7Y3VzdG9tIGNsYXNzPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0idXBkYXRlIiAgICAgdmFsdWU9InRydWUiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0ic2VsZGlycyIgICAgdmFsdWU9InRydWUiLyZndDsKLSAgICAgICAgICAgICAgICAmbHQ7cGFyYW0gbmFtZT0iY2FjaGUiICAgICAgdmFsdWU9InByb3BlcnR5ZmlsZSIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJhbGdvcml0aG0iICB2YWx1ZT0iZGlnZXN0Ii8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3BhcmFtIG5hbWU9ImNvbXBhcmF0b3IiIHZhbHVlPSJlcXVhbCIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJjYWNoZS5jYWNoZWZpbGUiICAgICB2YWx1ZT0iY2FjaGUucHJvcGVydGllcyIvJmd0OwotICAgICAgICAgICAgICAgICZsdDtwYXJhbSBuYW1lPSJhbGdvcml0aG0uYWxnb3JpdGhtIiB2YWx1ZT0iTUQ1Ii8mZ3Q7Ci0gICAgICAgICAgICAmbHQ7L2N1c3RvbSZndDsKLSAgICAgICAgJmx0Oy9maWxlc2V0Jmd0OwotICAgICZsdDsvY29weSZndDsKLSAgICA8L3ByZT48L2Jsb2NrcXVvdGU+Ci0gIDxwPkFuZCB0aGlzIGlzIHRoZSBzYW1lIHJld3JpdHRlbiBhcyBDdXN0b21TZWxlY3Rvci48L3A+CisgICAgPHA+QSB1c2VmdWwgc2NlbmFyaW8gZm9yIHRoaXMgc2VsZWN0b3IgaW5zaWRlIGEgYnVpbGQgZW52aXJvbm1lbnQgZm9yIGhvbWVwYWdlIGdlbmVyYXRpb24KKyAgICAoZS5nLiB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vZm9ycmVzdC5hcGFjaGUub3JnLyIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUgRm9ycmVzdDwvYT4pLiBIZXJlCisgICAgYWxsIDxzdHJvbmc+Y2hhbmdlZDwvc3Ryb25nPiBmaWxlcyBhcmUgdXBsb2FkZWQgdG8gdGhlIHNlcnZlci4gVGhlIENhY2hlU2VsZWN0b3Igc2F2ZXMgdGhlcmVmb3JlCisgICAgbXVjaCB1cGxvYWQgdGltZS48L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgotICAmbHQ7dGFyZ2V0IG5hbWU9ImdlbmVyYXRlLWFuZC11cGxvYWQtc2l0ZSImZ3Q7Ci0gICAgICAmbHQ7ZWNobyZndDsgZ2VuZXJhdGUgdGhlIHNpdGUgdXNpbmcgZm9ycmVzdCAmbHQ7L2VjaG8mZ3Q7Ci0gICAgICAmbHQ7YW50Y2FsbCB0YXJnZXQ9InNpdGUiLyZndDsKKyAgICA8cHJlPgorJmx0O21vZGlmaWVkIGNhY2hlY2xhc3NuYW1lPSJjb20ubXljb21wYW55Lk15Q2FjaGUiJmd0OworICAgICZsdDtjbGFzc3BhdGgmZ3Q7CisgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliL215Y29tcGFueS1hbnR1dGlsLmphciIvJmd0OworICAgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0Oy9tb2RpZmllZCZndDs8L3ByZT4KIAotICAgICAgJmx0O2VjaG8mZ3Q7IHVwbG9hZCB0aGUgY2hhbmdlZCBmaWxlICZsdDsvZWNobyZndDsKLSAgICAgICZsdDtmdHAgc2VydmVyPSIke2Z0cC5zZXJ2ZXJ9IiB1c2VyaWQ9IiR7ZnRwLnVzZXJ9IiBwYXNzd29yZD0iJHtmdHAucHdkfSImZ3Q7Ci0gICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiZndDsKLSAgICAgICAgICAgICAgJmx0O21vZGlmaWVkLyZndDsKLSAgICAgICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICAgICAmbHQ7L2Z0cCZndDsKLSAgJmx0Oy90YXJnZXQmZ3Q7Ci0gICAgPC9wcmU+PC9ibG9ja3F1b3RlPgotICA8cD5BIHVzZWZ1bCBzY2VuYXJpbyBmb3IgdGhpcyBzZWxlY3RvciBpbnNpZGUgYSBidWlsZCBlbnZpcm9ubWVudAotICBmb3IgaG9tZXBhZ2UgZ2VuZXJhdGlvbiAoZS5nLiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy9mb3JyZXN0LyI+Ci0gIEFwYWNoZSBGb3JyZXN0PC9hPikuIEhlcmUgYWxsIDxiPmNoYW5nZWQ8L2I+IGZpbGVzIGFyZSB1cGxvYWRlZCB0byB0aGUgc2VydmVyLiBUaGUKLSAgQ2FjaGVTZWxlY3RvciBzYXZlcyB0aGVyZWZvcmUgbXVjaCB1cGxvYWQgdGltZS48L3A+CisgICAgPHA+VXNlcyA8Y29kZT5jb20ubXljb21wYW55Lk15Q2FjaGU8L2NvZGU+IGZyb20gYSBqYXIgb3V0c2lkZSBvZiBBbnQncyBvd24gY2xhc3NwYXRoIGFzCisgICAgY2FjaGUgaW1wbGVtZW50YXRpb248L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgotICAmbHQ7bW9kaWZpZWQgY2FjaGVjbGFzc25hbWU9ImNvbS5teWNvbXBhbnkuTXlDYWNoZSImZ3Q7Ci0gICAgICAmbHQ7Y2xhc3NwYXRoJmd0OwotICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0ibGliL215Y29tcGFueS1hbnR1dGlsLmphciIvJmd0OwotICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7Ci0gICZsdDsvbW9kaWZpZWQmZ3Q7Ci0gICAgPC9wcmU+PC9ibG9ja3F1b3RlPgotICAgIDxwPlVzZXMgPHR0PmNvbS5teWNvbXBhbnkuTXlDYWNoZTwvdHQ+IGZyb20gYSBqYXIgb3V0c2lkZSBvZiBBbnRzIG93biBjbGFzc3BhdGgKLSAgICBhcyBjYWNoZSBpbXBsZW1lbnRhdGlvbjwvcD4KKyAgICA8aDQgaWQ9Ik1vZFNlbE5vdGUiPk5vdGUgb24gUnVsZUJhc2VkQ29sbGF0b3I8L2g0PgorICAgIDxwPlRoZSBSdWxlQmFzZWRDb2xsYXRvciBuZWVkcyBhIGZvcm1hdCBmb3IgaXRzIHdvcmssIGJ1dCBpdHMgbmVlZGVkIHdoaWxlIGluc3RhbnRpYXRpbmcuIFRoZXJlCisgICAgaXMgYSBwcm9ibGVtIGluIHRoZSBpbml0aWFsaXphdGlvbiBhbGdvcml0aG0gZm9yIHRoaXMgY2FzZS4gVGhlcmVmb3JlIHlvdSBzaG91bGQgbm90IHVzZSB0aGlzCisgICAgKG9yIHRlbGwgbWUgdGhlIHdvcmthcm91bmQgOi0pLjwvcD4KIAotICA8aDQ+PGEgbmFtZT0iTW9kU2VsTm90ZSI+Tm90ZSBvbiBSdWxlQmFzZWRDb2xsYXRvcjwvYT48L2g0PgotICA8cD5UaGUgUnVsZUJhc2VkQ29sbGF0b3IgbmVlZHMgYSBmb3JtYXQgZm9yIGl0cyB3b3JrLCBidXQgaXRzIG5lZWRlZCB3aGlsZQotICBpbnN0YW50aWF0aW9uLiBUaGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIGluaXRpYWxpemF0aW9uIGFsZ29yaXRobSBmb3IgdGhpcwotICBjYXNlLiBUaGVyZWZvcmUgeW91IHNob3VsZCBub3QgdXNlIHRoaXMgKG9yIHRlbGwgbWUgdGhlIHdvcmthcm91bmQgOi0pLjwvcD4KKyAgICA8aDQgaWQ9InNpZ25lZHNlbGVjdG9yIj5TaWduZWQgU2VsZWN0b3I8L2g0PgogCi0gICAgICA8aDQ+PGEgbmFtZT0ic2lnbmVkc2VsZWN0b3IiPlNpZ25lZCBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7c2lnbmVkc2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBzaWduZWQgZmlsZXMgYW5kIG9wdGlvbmFsbHkgc2lnbmVkIHdpdGggYQorICAgIGNlcnRhaW4gbmFtZS48L3A+CisgICAgPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3A+CisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+bmFtZTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgc2lnbmF0dXJlIG5hbWUgdG8gY2hlY2sgZm9yLjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CiAKLSAgICAgIDxwPgotICAgICAgICBUaGUgPGNvZGU+Jmx0O3NpZ25lZHNlbGVjdG9yJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgc2lnbmVkIGZpbGVzIGFuZCBvcHRpb25hbGx5Ci0gICAgICAgIHNpZ25lZCB3aXRoIGEgY2VydGFpbiBuYW1lLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgc2VsZWN0b3IgaGFzIGJlZW4gYWRkZWQgaW4gQXBhY2hlIEFudCAxLjcuCi0gICAgICA8L3A+Ci0gICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5uYW1lPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPiBUaGUgc2lnbmF0dXJlIG5hbWUgdG8gY2hlY2sgZm9yLjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgorICAgIDxoNCBpZD0icmVhZGFibGUiPlJlYWRhYmxlIFNlbGVjdG9yPC9oND4KIAotICAgICAgPGg0PjxhIG5hbWU9InJlYWRhYmxlIj5SZWFkYWJsZSBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7cmVhZGFibGUmZ3Q7PC9jb2RlPiBzZWxlY3RvciBzZWxlY3RzIG9ubHkgZmlsZXMgdGhhdCBhcmUgcmVhZGFibGUuICBBbnQgb25seQorICAgIGludm9rZXMgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEuaW8uRmlsZSNjYW5SZWFkPC9jb2RlPiBzbyBpZiBhIGZpbGUgaXMgdW5yZWFkYWJsZSBidXQgSlZNIGNhbm5vdAorICAgIGRldGVjdCB0aGlzIHN0YXRlLCB0aGlzIHNlbGVjdG9yIHdpbGwgc3RpbGwgc2VsZWN0IHRoZSBmaWxlLjwvcD4KIAotICAgICAgPHA+VGhlIDxjb2RlPiZsdDtyZWFkYWJsZSZndDs8L2NvZGU+IHNlbGVjdG9yIHNlbGVjdHMgb25seSBmaWxlcwotICAgICAgICB0aGF0IGFyZSByZWFkYWJsZS4gIEFudCBvbmx5IGludm9rZXMKLSAgICAgICAgPGNvZGU+amF2YS5pby5GaWxlI2NhblJlYWQ8L2NvZGU+IHNvIGlmIGEgZmlsZSBpcyB1bnJlYWRhYmxlCi0gICAgICAgIGJ1dCB0aGUgSmF2YSBWTSBjYW5ub3QgZGV0ZWN0IHRoaXMgc3RhdGUsIHRoaXMgc2VsZWN0b3Igd2lsbAotICAgICAgICBzdGlsbCBzZWxlY3QgdGhlIGZpbGUuPC9wPgorICAgIDxoNCBpZD0id3JpdGFibGUiPldyaXRhYmxlIFNlbGVjdG9yPC9oND4KIAotICAgICAgPGg0PjxhIG5hbWU9IndyaXRhYmxlIj5Xcml0YWJsZSBTZWxlY3RvcjwvYT48L2g0PgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7d3JpdGFibGUmZ3Q7PC9jb2RlPiBzZWxlY3RvciBzZWxlY3RzIG9ubHkgZmlsZXMgdGhhdCBhcmUgd3JpdGFibGUuICBBbnQgb25seQorICAgIGludm9rZXMgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEuaW8uRmlsZSNjYW5Xcml0ZTwvY29kZT4gc28gaWYgYSBmaWxlIGlzIG5vbndyaXRhYmxlIGJ1dCBKVk0KKyAgICBjYW5ub3QgZGV0ZWN0IHRoaXMgc3RhdGUsIHRoaXMgc2VsZWN0b3Igd2lsbCBzdGlsbCBzZWxlY3QgdGhlIGZpbGUuPC9wPgogCi0gICAgICA8cD5UaGUgPGNvZGU+Jmx0O3dyaXRhYmxlJmd0OzwvY29kZT4gc2VsZWN0b3Igc2VsZWN0cyBvbmx5IGZpbGVzCi0gICAgICAgIHRoYXQgYXJlIHdyaXRhYmxlLiAgQW50IG9ubHkgaW52b2tlcwotICAgICAgICA8Y29kZT5qYXZhLmlvLkZpbGUjY2FuV3JpdGU8L2NvZGU+IHNvIGlmIGEgZmlsZSBpcyB1bndyaXRhYmxlCi0gICAgICAgIGJ1dCB0aGUgSmF2YSBWTSBjYW5ub3QgZGV0ZWN0IHRoaXMgc3RhdGUsIHRoaXMgc2VsZWN0b3Igd2lsbAotICAgICAgICBzdGlsbCBzZWxlY3QgdGhlIGZpbGUuPC9wPgorICAgIDxoNCBpZD0iZXhlY3V0YWJsZSI+RXhlY3V0YWJsZSBTZWxlY3RvcjwvaDQ+CiAKLSAgICAgIDxoND48YSBuYW1lPSJzY3JpcHRzZWxlY3RvciI+U2NyaXB0IFNlbGVjdG9yPC9hPjwvaDQ+CisgICAgPHA+VGhlIDxjb2RlPiZsdDtleGVjdXRhYmxlJmd0OzwvY29kZT4gc2VsZWN0b3Igc2VsZWN0cyBvbmx5IGZpbGVzIHRoYXQgYXJlIGV4ZWN1dGFibGUuICBBbnQKKyAgICBvbmx5IGludm9rZXMgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEubmlvLmZpbGUuRmlsZXMjaXNFeGVjdXRhYmxlPC9jb2RlPiBzbyBpZiBhIGZpbGUgaXMgbm90CisgICAgZXhlY3V0YWJsZSBidXQgSlZNIGNhbm5vdCBkZXRlY3QgdGhpcyBzdGF0ZSwgdGhpcyBzZWxlY3RvciB3aWxsIHN0aWxsIHNlbGVjdCB0aGUgZmlsZS48L3A+CiAKLSAgICAgIDxwPgotICAgICAgICBUaGUgPGNvZGU+Jmx0O3NjcmlwdHNlbGVjdG9yJmd0OzwvY29kZT4gZWxlbWVudCBlbmFibGVzIHlvdQotICAgICAgICB0byB3cml0ZSBhIGNvbXBsZXggc2VsZWN0aW9uIGFsZ29yaXRobSBpbiBhbnkKLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KLSAgICAgICAgb3IKLSAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9zY3JpcHRpbmcuZGV2LmphdmEubmV0Ij5KU1IgMjIzPC9hPgotICAgICAgICBzdXBwb3J0ZWQgbGFuZ3VhZ2UuCi0gICAgICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPlNjcmlwdDwvYT4gdGFzayBmb3IKLSAgICAgICAgYW4gZXhwbGFuYXRpb24gb2Ygc2NyaXB0cyBhbmQgZGVwZW5kZW5jaWVzLgotICAgICAgPC9wPgotICAgICAgPHA+Ci0gICAgICAgIFRoaXMgc2VsZWN0b3Igd2FzIGFkZGVkIGluIEFwYWNoZSBBbnQgMS43LgotICAgICAgPC9wPgotICAgICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2U8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bGFuZ3VhZ2Ugb2YgdGhlIHNjcmlwdC48L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+eWVzPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+bWFuYWdlcjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj4KLSAgICAgICAgICAgIFRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLgotICAgICAgICAgICAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrCi0gICAgICAgICAgICBmb3IgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICAgICAgPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vIC0gZGVmYXVsdCBpcyAiYXV0byI8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZW5hbWUgb2YgdGhlIHNjcmlwdDwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ubzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNldGJlYW5zPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPndoZXRoZXIgdG8gaGF2ZSBhbGwgcHJvcGVydGllcywgcmVmZXJlbmNlcyBhbmQgdGFyZ2V0cyBhcwotICAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgc2NyaXB0LjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObywgZGVmYXVsdCBpcyAidHJ1ZSIuPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRoPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICAgICAgVGhlIGNsYXNzcGF0aCB0byBwYXNzIGludG8gdGhlIHNjcmlwdC4KLSAgICAgICAgICA8L3RkPgotICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5jbGFzc3BhdGhyZWY8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UsIGdpdmVuIGFzIGEKLSAgICAgICAgICAgIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0byBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCi0gICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KLSAgICAgICAgICA8L3RyPgotICAgICAgPC90YWJsZT4KLSAgPHA+Ci0gICAgVGhpcyBzZWxlY3RvciBjYW4gdGFrZSBhIG5lc3RlZCAmbHQ7Y2xhc3NwYXRoJmd0OyBlbGVtZW50LgotICAgIFNlZSB0aGUgPGEgaHJlZj0iLi4vVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzawotICAgIG9uIGhvdyB0byB1c2UgdGhpcyBlbGVtZW50LgotICA8L3A+Ci0gICAgICA8cD4KLSAgICAgIElmIG5vIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlIGlzIHN1cHBsaWVkLCB0aGUgc2NyaXB0IG11c3QgYmUgbmVzdGVkCi0gICAgICBpbnNpZGUgdGhlIHNlbGVjdG9yIGRlY2xhcmF0aW9uLgotICAgICAgPC9wPgotICAgICAgPHA+VGhlIGVtYmVkZGVkIHNjcmlwdCBpcyBpbnZva2VkIGZvciBldmVyeSB0ZXN0LCB3aXRoCi0gICAgICAgICB0aGUgYmVhbiA8Y29kZT5zZWxmPC9jb2RlPgotICAgICAgICBpcyBib3VuZCB0byB0aGUgc2VsZWN0b3IuIEl0IGhhcyBhbiBhdHRyaWJ1dGUgPGNvZGU+c2VsZWN0ZWQ8L2NvZGU+Ci0gICAgICAgIG11c3QgY2FuIGJlIHNldCB1c2luZyA8Y29kZT5zZXRTZWxlY3RlZChib29sZWFuKTwvY29kZT4gdG8gc2VsZWN0IHRoYXQKLSAgICAgICAgZmlsZS4KKyAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuMDwvZW0+PC9wPgogCi0gICAgICA8cD4KKyAgICA8aDQgaWQ9InN5bWxpbmsiPlN5bWxpbmsgU2VsZWN0b3I8L2g0PgogCi0gICAgICBUaGUgZm9sbG93aW5nIGJlYW5zIGFyZSBjb25maWd1cmVkIGZvciBldmVyeSBzY3JpcHQsIGFsb25nc2lkZQotICAgICAgdGhlIGNsYXNzaWMgc2V0IG9mIHByb2plY3QsIHByb3BlcnRpZXMsIGFuZCB0YXJnZXRzLgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7c3ltbGluayZndDs8L2NvZGU+IHNlbGVjdG9yIHNlbGVjdHMgb25seSBmaWxlcyB0aGF0IGFyZSBzeW1ib2xpYyBsaW5rcy4gIEFudAorICAgIG9ubHkgaW52b2tlcyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5uaW8uZmlsZS5GaWxlcyNpc1N5bWJvbGljTGluazwvY29kZT4gc28gaWYgYSBmaWxlIGlzIGEKKyAgICBzeW1ib2xpYyBsaW5rIGJ1dCBKVk0gY2Fubm90IGRldGVjdCB0aGlzIHN0YXRlLCB0aGlzIHNlbGVjdG9yIHdpbGwgbm90IHNlbGVjdCB0aGUgZmlsZS48L3A+CiAKLSAgICAgIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkJlYW48L2I+PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5UeXBlPC9iPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNlbGY8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+c2VsZWN0b3IgaW5zdGFuY2U8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWw8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZTwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbmFtZSBvZiB0aGUgc2VsZWN0aW9uPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiID5TdHJpbmc8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGUgb2YgdGhlIHNlbGVjdGlvbjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiA+amF2YS5pby5GaWxlPC90ZD4KLSAgICAgICAgPC90cj4KLSAgICAgICAgPHRyPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+YmFzZWRpcjwvdGQ+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5GaWxlc2V0IGJhc2UgZGlyZWN0b3J5PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiID5qYXZhLmlvLkZpbGU8L3RkPgotICAgICAgICA8L3RyPgorICAgIDxwPjxlbT5TaW5jZSBBbnQgMS4xMC4wPC9lbT48L3A+CiAKLSAgICAgIDwvdGFibGU+Ci0gICAgICA8cD4KLSAgICAgIFRoZSA8Y29kZT5zZWxmPC9jb2RlPiBiZWFuIG1hcHMgdG8gdGhlIHNlbGVjdG9yLCB3aGljaCBoYXMgdGhlIGZvbGxvd2luZwotICAgICAgYXR0cmlidXRlcy4gT25seSB0aGUgPGNvZGU+c2VsZWN0ZWQ8L2NvZGU+IGZsYWcgaXMgd3JpdGFibGUsIHRoZSByZXN0Ci0gICAgICBhcmUgcmVhZCBvbmx5IHZpYSB0aGVpciBnZXR0ZXIgbWV0aG9kcy4KKyAgICA8aDQgaWQ9Im93bmVkQnkiPk93bmVkQnkgU2VsZWN0b3I8L2g0PgogCi0gICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5UeXBlPC9iPjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPnNlbGVjdGVkPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPndyaXRlYWJsZSBmbGFnIHRvIHNlbGVjdCB0aGlzIGZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Ym9vbGVhbjwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVuYW1lPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVuYW1lIG9mIHRoZSBzZWxlY3Rpb248L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgPlN0cmluZzwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICAgIDx0cj4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZmlsZSBvZiB0aGUgc2VsZWN0aW9uPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiID5qYXZhLmlvLkZpbGU8L3RkPgotICAgICAgICA8L3RyPgotICAgICAgICA8dHI+Ci0gICAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KLSAgICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPkZpbGVzZXQgYmFzZSBkaXJlY3Rvcnk8L3RkPgotICAgICAgICAgIDx0ZCB2YWxpZ249InRvcCIgPmphdmEuaW8uRmlsZTwvdGQ+Ci0gICAgICAgIDwvdHI+Ci0gICAgICA8L3RhYmxlPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7b3duZWRCeSZndDs8L2NvZGU+IHNlbGVjdG9yIHNlbGVjdHMgb25seSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSB0aGUgZ2l2ZW4KKyAgICB1c2VyLiAgQW50IG9ubHkgaW52b2tlcyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5uaW8uZmlsZS5GaWxlcyNnZXRPd25lcjwvY29kZT4gc28gaWYgYSBmaWxlCisgICAgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHRoaXMgc2VsZWN0b3Igd2lsbCBub3Qgc2VsZWN0IHRoZSBmaWxlLjwvcD4KIAotICAgICAgPHA+Ci0gICAgICBFeGFtcGxlCi0gICAgICA8L3A+Ci08cHJlPgotICAgICZsdDtzY3JpcHRzZWxlY3RvciBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OwotICAgICAgc2VsZi5zZXRTZWxlY3RlZCh0cnVlKTsKLSAgICAmbHQ7L3NjcmlwdHNlbGVjdG9yJmd0OwotPC9wcmU+Ci0gICAgPHA+Ci0gICAgU2VsZWN0cyBldmVyeSBmaWxlLgotICAgIDwvcD4KKyAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuMDwvZW0+PC9wPgogCi08cHJlPgotICAgICZsdDtzY3JpcHRzZWxlY3RvciBsYW5ndWFnZT0mcXVvdDtqYXZhc2NyaXB0JnF1b3Q7Jmd0OwotICAgICAgc2VsZi5zZXRTZWxlY3RlZCgoZmlsZW5hbWUubGVuZ3RoJTIpPT0wKTsKLSAgICAmbHQ7L3NjcmlwdHNlbGVjdG9yJmd0OwotPC9wcmU+Ci1TZWxlY3QgZmlsZXMgd2hvc2UgZmlsZW5hbWUgbGVuZ3RoIGlzIGV2ZW4uCisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+b3duZXI8L3RkPgorICAgICAgICA8dGQ+VXNlcm5hbWUgb2YgdGhlIGV4cGVjdGVkIG93bmVyPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+Zm9sbG93c3ltbGlua3M8L3RkPgorICAgICAgICA8dGQ+TXVzdCB0aGUgc2VsZWN0b3IgZm9sbG93IHN5bWJvbGljIGxpbmtzPyAoc2VlIGFsc28gaG93IHRoZSBhdHRyaWJ1dGUgaW50ZXJhY3RzIHdpdGggdGhlCisgICAgICAgICAgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCNzeW1saW5rIj5GaWxlU2V0PC9hPik8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KIAotICAgIDxoMz48YSBuYW1lPSJzZWxlY3Rjb250YWluZXJzIj5TZWxlY3RvciBDb250YWluZXJzPC9hPjwvaDM+CisgICAgPGg0IGlkPSJwb3NpeEdyb3VwIj5Qb3NpeEdyb3VwIFNlbGVjdG9yPC9oND4KIAotICAgIDxwPlRvIGNyZWF0ZSBtb3JlIGNvbXBsZXggc2VsZWN0aW9ucywgYSB2YXJpZXR5IG9mIHNlbGVjdG9ycyB0aGF0Ci0gICAgY29udGFpbiBvdGhlciBzZWxlY3RvcnMgYXJlIGF2YWlsYWJsZSBmb3IgeW91ciB1c2UuIFRoZXkgY29tYmluZSB0aGUKLSAgICBzZWxlY3Rpb25zIG9mIHRoZWlyIGNoaWxkIHNlbGVjdG9ycyBpbiB2YXJpb3VzIHdheXMuPC9wPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7cG9zaXhHcm91cCZndDs8L2NvZGU+IHNlbGVjdG9yIHNlbGVjdHMgb25seSBmaWxlcyB0aGF0IGFyZSBvd25lZCBieSB0aGUgZ2l2ZW4KKyAgICAgIFBPU0lYIGdyb3VwLiAgQW50IG9ubHkgaW52b2tlcyA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5uaW8uZmlsZS5GaWxlcyNyZWFkQXR0cmlidXRlczwvY29kZT4gc28KKyAgICAgIGlmIGEgZmlsZSBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gb3IgUE9TSVggYXR0cmlidXRlcyB0aGlzIHNlbGVjdG9yIHdpbGwgbm90CisgICAgICBzZWxlY3QgdGhlIGZpbGUuPC9wPgorCisgICAgPHA+PGVtPlNpbmNlIEFudCAxLjEwLjQ8L2VtPjwvcD4KKworICAgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CisgICAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmdyb3VwPC90ZD4KKyAgICAgICAgPHRkPlBPU0lYIGdyb3VwIG5hbWU8L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5mb2xsb3dzeW1saW5rczwvdGQ+CisgICAgICAgIDx0ZD5NdXN0IHRoZSBzZWxlY3RvciBmb2xsb3cgc3ltYm9saWMgbGlua3M/IChzZWUgYWxzbyBob3cgdGhlIGF0dHJpYnV0ZSBpbnRlcmFjdHMgd2l0aCB0aGUKKyAgICAgICAgICBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBvZiB0aGUgPGEgaHJlZj0iZmlsZXNldC5odG1sI3N5bWxpbmsiPkZpbGVTZXQ8L2E+KTwvdGQ+CisgICAgICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gPHE+dHJ1ZTwvcT48L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPGg0IGlkPSJwb3NpeFBlcm1pc3Npb25zIj5Qb3NpeFBlcm1pc3Npb25zIFNlbGVjdG9yPC9oND4KKworICAgIDxwPlRoZSA8Y29kZT4mbHQ7cG9zaXhQZXJtaXNzaW9ucyZndDs8L2NvZGU+IHNlbGVjdG9yIHNlbGVjdHMgb25seSBmaWxlcyB0aGF0IGhhdmUgdGhlIGdpdmVuCisgICAgICBQT1NJWCBwZXJtaXNzaW9ucy4gIEFudCBvbmx5CisgICAgICBpbnZva2VzIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLm5pby5maWxlLkZpbGVzI2dldFBvc2l4RmlsZVBlcm1pc3Npb25zPC9jb2RlPiBzbyBpZiBhIGZpbGUKKyAgICAgIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB0aGlzIHNlbGVjdG9yIHdpbGwgbm90IHNlbGVjdCB0aGUgZmlsZS48L3A+CisKKyAgICA8cD48ZW0+U2luY2UgQW50IDEuMTAuNDwvZW0+PC9wPgorCisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+cGVybWlzc2lvbnM8L3RkPgorICAgICAgICA8dGQ+UE9TSVggcGVybWlzc2lvbnMgaW4gc3RyaW5nICg8cT5yd3hyd3hyd3g8L3E+KSBvciBvY3RhbCAoPHE+Nzc3PC9xPikgZm9ybWF0PC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+Zm9sbG93c3ltbGlua3M8L3RkPgorICAgICAgICA8dGQ+TXVzdCB0aGUgc2VsZWN0b3IgZm9sbG93IHN5bWJvbGljIGxpbmtzPyAoc2VlIGFsc28gaG93IHRoZSBhdHRyaWJ1dGUgaW50ZXJhY3RzIHdpdGgKKyAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgb2YgdGhlIDxhIGhyZWY9ImZpbGVzZXQuaHRtbCNzeW1saW5rIj5GaWxlU2V0PC9hPik8L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KKyAgICAgIDwvdHI+CisgICAgPC90YWJsZT4KKworICAgIDxoNCBpZD0ic2NyaXB0c2VsZWN0b3IiPlNjcmlwdCBTZWxlY3RvcjwvaDQ+CisKKyAgICA8cD5UaGUgPGNvZGU+Jmx0O3NjcmlwdHNlbGVjdG9yJmd0OzwvY29kZT4gZWxlbWVudCBlbmFibGVzIHlvdSB0byB3cml0ZSBhIGNvbXBsZXggc2VsZWN0aW9uCisgICAgYWxnb3JpdGhtIGluIGFueSA8YSBocmVmPSJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9ic2YiIHRhcmdldD0iX3RvcCI+QXBhY2hlIEJTRjwvYT4KKyAgICBvciA8YSBocmVmPSJodHRwczovL2pjcC5vcmcvYWJvdXRKYXZhL2NvbW11bml0eXByb2Nlc3MvbWFpbnRlbmFuY2UvanNyMjIzLzIyM0NoYW5nZUxvZy5odG1sIgorICAgIHRhcmdldD0iX3RvcCI+SlNSIDIyMzwvYT4gc3VwcG9ydGVkIGxhbmd1YWdlLiAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+U2NyaXB0PC9hPgorICAgIHRhc2sgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHNjcmlwdHMgYW5kIGRlcGVuZGVuY2llcy48L3A+CisgICAgPHA+PGVtPlNpbmNlIEFwYWNoZSBBbnQgMS43PC9lbT48L3A+CisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+bGFuZ3VhZ2U8L3RkPgorICAgICAgICA8dGQ+bGFuZ3VhZ2Ugb2YgdGhlIHNjcmlwdC48L3RkPgorICAgICAgICA8dGQ+WWVzPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5tYW5hZ2VyPC90ZD4KKyAgICAgICAgPHRkPlRoZSBzY3JpcHQgZW5naW5lIG1hbmFnZXIgdG8gdXNlLiAgU2VlIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPgorICAgICAgICB0YXNrIGZvciB1c2luZyB0aGlzIGF0dHJpYnV0ZS48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+YXV0bzwvcT48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPnNyYzwvdGQ+CisgICAgICAgIDx0ZD5maWxlbmFtZSBvZiB0aGUgc2NyaXB0PC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgICAgIDx0ZD5UaGUgZW5jb2Rpbmcgb2YgdGhlIHNjcmlwdCBhcyBhIGZpbGUuIDxlbT5zaW5jZSBBbnQgMS4xMC4yPC9lbT48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+c2V0YmVhbnM8L3RkPgorICAgICAgICA8dGQ+V2hldGhlciB0byBoYXZlIGFsbCBwcm9wZXJ0aWVzLCByZWZlcmVuY2VzIGFuZCB0YXJnZXRzIGFzIGdsb2JhbCB2YXJpYWJsZXMgaW4gdGhlCisgICAgICAgIHNjcmlwdC48L3RkPgorICAgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dHJ1ZTwvcT48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmNsYXNzcGF0aDwvdGQ+CisgICAgICAgIDx0ZD5UaGUgY2xhc3NwYXRoIHRvIHBhc3MgaW50byB0aGUgc2NyaXB0LjwvdGQ+CisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+Y2xhc3NwYXRocmVmPC90ZD4KKyAgICAgICAgPHRkPlRoZSBjbGFzc3BhdGggdG8gdXNlLCBnaXZlbiBhcyBhIDxhIGhyZWY9Ii4uL3VzaW5nLmh0bWwjcmVmZXJlbmNlcyI+cmVmZXJlbmNlPC9hPiB0bworICAgICAgICBhIHBhdGggZGVmaW5lZCBlbHNld2hlcmUuCisgICAgICAgIDx0ZD5ObzwvdGQ+CisgICAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPHA+VGhpcyBzZWxlY3RvciBjYW4gdGFrZSBhIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gZWxlbWVudC4gIFNlZQorICAgIHRoZSA8YSBocmVmPSIuLi9UYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrIG9uIGhvdyB0byB1c2UgdGhpcyBlbGVtZW50LjwvcD4KKyAgICA8cD5JZiBubyA8dmFyPnNyYzwvdmFyPiBhdHRyaWJ1dGUgaXMgc3VwcGxpZWQsIHRoZSBzY3JpcHQgbXVzdCBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBzZWxlY3RvcgorICAgIGRlY2xhcmF0aW9uLjwvcD4KKyAgICA8cD5UaGUgZW1iZWRkZWQgc2NyaXB0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IHRlc3QsIHdpdGggdGhlIGJlYW4gPGNvZGUgY2xhc3M9ImNvZGUiPnNlbGY8L2NvZGU+CisgICAgaXMgYm91bmQgdG8gdGhlIHNlbGVjdG9yLiBJdCBoYXMgYW4gYXR0cmlidXRlIDx2YXI+c2VsZWN0ZWQ8L3Zhcj4gd2hpY2ggY2FuIGJlIHNldAorICAgIHVzaW5nIDxjb2RlIGNsYXNzPSJjb2RlIj5zZXRTZWxlY3RlZChib29sZWFuKTwvY29kZT4gdG8gc2VsZWN0IGEgZmlsZS48L3A+CisKKyAgICA8cD5UaGUgZm9sbG93aW5nIGJlYW5zIGFyZSBjb25maWd1cmVkIGZvciBldmVyeSBzY3JpcHQsIGFsb25nc2lkZSB0aGUgY2xhc3NpYyBzZXQgb2YgcHJvamVjdCwKKyAgICBwcm9wZXJ0aWVzLCBhbmQgdGFyZ2V0cy48L3A+CisKKyAgICA8dGFibGU+CisgICAgICA8dHI+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5CZWFuPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPlR5cGU8L3RoPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPnNlbGY8L3RkPgorICAgICAgICA8dGQ+c2VsZWN0b3IgaW5zdGFuY2U8L3RkPgorICAgICAgICA8dGQ+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWw8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmZpbGVuYW1lPC90ZD4KKyAgICAgICAgPHRkPmZpbGVuYW1lIG9mIHRoZSBzZWxlY3Rpb248L3RkPgorICAgICAgICA8dGQ+U3RyaW5nPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgICAgPHRkPmZpbGUgb2YgdGhlIHNlbGVjdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5qYXZhLmlvLkZpbGU8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmJhc2VkaXI8L3RkPgorICAgICAgICA8dGQ+RmlsZXNldCBiYXNlIGRpcmVjdG9yeTwvdGQ+CisgICAgICAgIDx0ZD5qYXZhLmlvLkZpbGU8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+VGhlIDxjb2RlPnNlbGY8L2NvZGU+IGJlYW4gbWFwcyB0byB0aGUgc2VsZWN0b3IsIHdoaWNoIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMuIE9ubHkKKyAgICB0aGUgPHZhcj5zZWxlY3RlZDwvdmFyPiBmbGFnIGlzIHdyaXRhYmxlLCB0aGUgcmVzdCBhcmUgcmVhZCBvbmx5IHZpYSB0aGVpciBnZXR0ZXIgbWV0aG9kcy48L3A+CisgICAgPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5UeXBlPC90aD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5zZWxlY3RlZDwvdGQ+CisgICAgICAgIDx0ZD53cml0ZWFibGUgZmxhZyB0byBzZWxlY3QgdGhpcyBmaWxlPC90ZD4KKyAgICAgICAgPHRkPmJvb2xlYW48L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmZpbGVuYW1lPC90ZD4KKyAgICAgICAgPHRkPmZpbGVuYW1lIG9mIHRoZSBzZWxlY3Rpb248L3RkPgorICAgICAgICA8dGQ+U3RyaW5nPC90ZD4KKyAgICAgIDwvdHI+CisgICAgICA8dHI+CisgICAgICAgIDx0ZD5maWxlPC90ZD4KKyAgICAgICAgPHRkPmZpbGUgb2YgdGhlIHNlbGVjdGlvbjwvdGQ+CisgICAgICAgIDx0ZD5qYXZhLmlvLkZpbGU8L3RkPgorICAgICAgPC90cj4KKyAgICAgIDx0cj4KKyAgICAgICAgPHRkPmJhc2VkaXI8L3RkPgorICAgICAgICA8dGQ+RmlsZXNldCBiYXNlIGRpcmVjdG9yeTwvdGQ+CisgICAgICAgIDx0ZD5qYXZhLmlvLkZpbGU8L3RkPgorICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorCisgICAgPHA+RXhhbXBsZTwvcD4KKyAgICA8cHJlPgorJmx0O3NjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSZxdW90O2phdmFzY3JpcHQmcXVvdDsmZ3Q7CisgIHNlbGYuc2V0U2VsZWN0ZWQodHJ1ZSk7CismbHQ7L3NjcmlwdHNlbGVjdG9yJmd0OzwvcHJlPgorICAgIDxwPlNlbGVjdHMgZXZlcnkgZmlsZS48L3A+CisKKyAgICA8cHJlPgorJmx0O3NjcmlwdHNlbGVjdG9yIGxhbmd1YWdlPSZxdW90O2phdmFzY3JpcHQmcXVvdDsmZ3Q7CisgIHNlbGYuc2V0U2VsZWN0ZWQoKGZpbGVuYW1lLmxlbmd0aCUyKT09MCk7CismbHQ7L3NjcmlwdHNlbGVjdG9yJmd0OzwvcHJlPgorICAgIDxwPlNlbGVjdCBmaWxlcyB3aG9zZSBmaWxlbmFtZSBsZW5ndGggaXMgZXZlbi48L3A+CisKKyAgICA8aDMgaWQ9InNlbGVjdGNvbnRhaW5lcnMiPlNlbGVjdG9yIENvbnRhaW5lcnM8L2gzPgorCisgICAgPHA+VG8gY3JlYXRlIG1vcmUgY29tcGxleCBzZWxlY3Rpb25zLCBhIHZhcmlldHkgb2Ygc2VsZWN0b3JzIHRoYXQgY29udGFpbiBvdGhlciBzZWxlY3RvcnMgYXJlCisgICAgYXZhaWxhYmxlIGZvciB5b3VyIHVzZS4gVGhleSBjb21iaW5lIHRoZSBzZWxlY3Rpb25zIG9mIHRoZWlyIGNoaWxkIHNlbGVjdG9ycyBpbiB2YXJpb3VzCisgICAgd2F5cy48L3A+CiAKICAgICA8cD5UaGUgc2VsZWN0b3IgY29udGFpbmVycyBhcmU6PC9wPgogCiAgICAgPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IiNhbmRzZWxlY3QiPjxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPjwvYT4gLSBzZWxlY3QgYSBmaWxlIG9ubHkgaWYgYWxsCi0gICAgICAgIHRoZSBjb250YWluZWQgc2VsZWN0b3JzIHNlbGVjdCBpdC4KLSAgICAgIDxsaT48YSBocmVmPSIjbWFqb3JpdHlzZWxlY3QiPjxjb2RlPiZsdDttYWpvcml0eSZndDs8L2NvZGU+PC9hPiAtIHNlbGVjdCBhIGZpbGUKLSAgICAgICAgaWYgYSBtYWpvcml0eSBvZiBpdHMgc2VsZWN0b3JzIHNlbGVjdCBpdC4KLSAgICAgIDxsaT48YSBocmVmPSIjbm9uZXNlbGVjdCI+PGNvZGU+Jmx0O25vbmUmZ3Q7PC9jb2RlPjwvYT4gLSBzZWxlY3QgYSBmaWxlIG9ubHkgaWYKLSAgICAgICAgbm9uZSBvZiB0aGUgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QgaXQuCi0gICAgICA8bGk+PGEgaHJlZj0iI25vdHNlbGVjdCI+PGNvZGU+Jmx0O25vdCZndDs8L2NvZGU+PC9hPiAtIGNhbiBjb250YWluIG9ubHkgb25lCi0gICAgICAgIHNlbGVjdG9yLCBhbmQgcmV2ZXJzZXMgd2hhdCBpdCBzZWxlY3RzIGFuZCBkb2Vzbid0IHNlbGVjdC4KLSAgICAgIDxsaT48YSBocmVmPSIjb3JzZWxlY3QiPjxjb2RlPiZsdDtvciZndDs8L2NvZGU+PC9hPiAtIHNlbGVjdHMgYSBmaWxlIGlmIGFueSBvbmUKLSAgICAgICAgb2YgdGhlIGNvbnRhaW5lZCBzZWxlY3RvcnMgc2VsZWN0cyBpdC4KLSAgICAgIDxsaT48YSBocmVmPSIjc2VsZWN0b3JzZWxlY3QiPjxjb2RlPiZsdDtzZWxlY3RvciZndDs8L2NvZGU+PC9hPiAtIGNvbnRhaW5zIG9ubHkgb25lCi0gICAgICAgIHNlbGVjdG9yIGFuZCBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gaXQgd2l0aG91dCBhbHRlcmF0aW9uLCBwcm92aWRlZAotICAgICAgICB0aGF0IGFueSA8Y29kZT4mcXVvdDtpZiZxdW90OzwvY29kZT4gb3IKLSAgICAgICAgPGNvZGU+JnF1b3Q7dW5sZXNzJnF1b3Q7PC9jb2RlPiBjb25kaXRpb25zIGFyZSBtZXQuIFRoaXMKLSAgICAgICAgaXMgdGhlIHNlbGVjdG9yIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBkZWZpbmUgYSByZWZlcmVuY2UuIEl0IGlzCi0gICAgICAgIHVzYWJsZSBhcyBhbiBlbGVtZW50IG9mIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uIEl0IGlzIGFsc28KLSAgICAgICAgdGhlIG9uZSB0byB1c2UgaWYgeW91IHdhbnQgc2VsZWN0aW9uIG9mIGZpbGVzIHRvIGJlIGRlcGVuZGVudCBvbgotICAgICAgICBBbnQgcHJvcGVydHkgc2V0dGluZ3MuCisgICAgICA8bGk+PGEgaHJlZj0iI2FuZHNlbGVjdCI+PGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+PC9hPiZtZGFzaDtzZWxlY3QgYSBmaWxlIG9ubHkgaWYgYWxsIHRoZQorICAgICAgICBjb250YWluZWQgc2VsZWN0b3JzIHNlbGVjdCBpdC48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNtYWpvcml0eXNlbGVjdCI+PGNvZGU+Jmx0O21ham9yaXR5Jmd0OzwvY29kZT48L2E+Jm1kYXNoO3NlbGVjdCBhIGZpbGUgaWYgYQorICAgICAgICBtYWpvcml0eSBvZiBpdHMgc2VsZWN0b3JzIHNlbGVjdCBpdC48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNub25lc2VsZWN0Ij48Y29kZT4mbHQ7bm9uZSZndDs8L2NvZGU+PC9hPiZtZGFzaDtzZWxlY3QgYSBmaWxlIG9ubHkgaWYgbm9uZQorICAgICAgICBvZiB0aGUgY29udGFpbmVkIHNlbGVjdG9ycyBzZWxlY3QgaXQuPC9saT4KKyAgICAgIDxsaT48YSBocmVmPSIjbm90c2VsZWN0Ij48Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT48L2E+Jm1kYXNoO2NhbiBjb250YWluIG9ubHkgb25lIHNlbGVjdG9yLCBhbmQKKyAgICAgICAgcmV2ZXJzZXMgd2hhdCBpdCBzZWxlY3RzIGFuZCBkb2Vzbid0IHNlbGVjdC48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNvcnNlbGVjdCI+PGNvZGU+Jmx0O29yJmd0OzwvY29kZT48L2E+Jm1kYXNoO3NlbGVjdHMgYSBmaWxlIGlmIGFueSBvbmUgb2YgdGhlCisgICAgICAgIGNvbnRhaW5lZCBzZWxlY3RvcnMgc2VsZWN0cyBpdC48L2xpPgorICAgICAgPGxpPjxhIGhyZWY9IiNzZWxlY3RvcnNlbGVjdCI+PGNvZGU+Jmx0O3NlbGVjdG9yJmd0OzwvY29kZT48L2E+Jm1kYXNoO2NvbnRhaW5zIG9ubHkgb25lCisgICAgICAgIHNlbGVjdG9yIGFuZCBmb3J3YXJkcyBhbGwgcmVxdWVzdHMgdG8gaXQgd2l0aG91dCBhbHRlcmF0aW9uLCBwcm92aWRlZCB0aGF0CisgICAgICAgIGFueSA8Y29kZT4mcXVvdDtpZiZxdW90OzwvY29kZT4gb3IgPGNvZGU+JnF1b3Q7dW5sZXNzJnF1b3Q7PC9jb2RlPiBjb25kaXRpb25zIGFyZSBtZXQuIFRoaXMKKyAgICAgICAgaXMgdGhlIHNlbGVjdG9yIHRvIHVzZSBpZiB5b3Ugd2FudCB0byBkZWZpbmUgYSByZWZlcmVuY2UuIEl0IGlzIHVzYWJsZSBhcyBhbiBlbGVtZW50CisgICAgICAgIG9mIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uIEl0IGlzIGFsc28gdGhlIG9uZSB0byB1c2UgaWYgeW91IHdhbnQgc2VsZWN0aW9uIG9mIGZpbGVzIHRvCisgICAgICAgIGJlIGRlcGVuZGVudCBvbiBBbnQgcHJvcGVydHkgc2V0dGluZ3MuPC9saT4KICAgICA8L3VsPgogCi0gICAgPHA+QWxsIHNlbGVjdG9yIGNvbnRhaW5lcnMgY2FuIGNvbnRhaW4gYW55IG90aGVyIHNlbGVjdG9yLCBpbmNsdWRpbmcKLSAgICBvdGhlciBjb250YWluZXJzLCBhcyBhbiBlbGVtZW50LiBVc2luZyBjb250YWluZXJzLCB0aGUgc2VsZWN0b3IgdGFncwotICAgIGNhbiBiZSBhcmJpdHJhcmlseSBkZWVwLiBIZXJlIGlzIGEgY29tcGxldGUgbGlzdCBvZiBhbGxvd2FibGUKLSAgICBzZWxlY3RvciBlbGVtZW50cyB3aXRoaW4gYSBjb250YWluZXI6PC9wPgorICAgIDxwPkFsbCBzZWxlY3RvciBjb250YWluZXJzIGNhbiBjb250YWluIGFueSBvdGhlciBzZWxlY3RvciwgaW5jbHVkaW5nIG90aGVyIGNvbnRhaW5lcnMsIGFzIGFuCisgICAgZWxlbWVudC4gVXNpbmcgY29udGFpbmVycywgdGhlIHNlbGVjdG9yIHRhZ3MgY2FuIGJlIGFyYml0cmFyaWx5IGRlZXAuIEhlcmUgaXMgYSBjb21wbGV0ZSBsaXN0IG9mCisgICAgYWxsb3dhYmxlIHNlbGVjdG9yIGVsZW1lbnRzIHdpdGhpbiBhIGNvbnRhaW5lcjo8L3A+CiAKICAgICA8dWw+CiAgICAgICA8bGk+PGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+PC9saT4KQEAgLTEyNDAsODMgKzExODEsNjkgQEAKICAgICAgIDxsaT48Y29kZT4mbHQ7c2l6ZSZndDs8L2NvZGU+PC9saT4KICAgICA8L3VsPgogCi0gICAgPGg0PjxhIG5hbWU9ImFuZHNlbGVjdCI+QW5kIFNlbGVjdG9yPC9hPjwvaDQ+CisgICAgPGg0IGlkPSJhbmRzZWxlY3QiPkFuZCBTZWxlY3RvcjwvaDQ+CiAKLSAgICA8cD5UaGUgPGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHRoYXQgYXJlCi0gICAgc2VsZWN0ZWQgYnkgYWxsIG9mIHRoZSBlbGVtZW50cyBpdCBjb250YWlucy4gSXQgcmV0dXJucyBhcwotICAgIHNvb24gYXMgaXQgZmluZHMgYSBzZWxlY3RvciB0aGF0IGRvZXMgbm90IHNlbGVjdCB0aGUgZmlsZSwKLSAgICBzbyBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBjaGVjayBldmVyeSBzZWxlY3Rvci4KLSAgICA8L3A+CisgICAgPHA+VGhlIDxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyB0aGF0IGFyZSBzZWxlY3RlZCBieSBhbGwgb2YgdGhlIGVsZW1lbnRzIGl0CisgICAgY29udGFpbnMuIEl0IHJldHVybnMgYXMgc29vbiBhcyBpdCBmaW5kcyBhIHNlbGVjdG9yIHRoYXQgZG9lcyBub3Qgc2VsZWN0IHRoZSBmaWxlLCBzbyBpdCBpcyBub3QKKyAgICBndWFyYW50ZWVkIHRvIGNoZWNrIGV2ZXJ5IHNlbGVjdG9yLjwvcD4KIAogICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBBbmQgU2VsZWN0b3I6PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZGlzdH0mcXVvdDsgaW5jbHVkZXM9JnF1b3Q7KiovKi5qYXImcXVvdDsmZ3Q7CiAgICAgJmx0O2FuZCZndDsKICAgICAgICAgJmx0O3NpemUgdmFsdWU9JnF1b3Q7NCZxdW90OyB1bml0cz0mcXVvdDtLaSZxdW90OyB3aGVuPSZxdW90O21vcmUmcXVvdDsvJmd0OwogICAgICAgICAmbHQ7ZGF0ZSBkYXRldGltZT0mcXVvdDswMS8wMS8yMDAxIDEyOjAwIEFNJnF1b3Q7IHdoZW49JnF1b3Q7YmVmb3JlJnF1b3Q7LyZndDsKICAgICAmbHQ7L2FuZCZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBKQVIgZmlsZSBsYXJnZXIgdGhhbiA0MDk2IGJ5dGVzIHdoaWNoIGhhdmVuJ3QgYmVlbiB1cGRhdGUKLSAgICAgIHNpbmNlIHRoZSBsYXN0IG1pbGxlbm5pdW0uCi0gICAgPC9wPgorICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBKQVIgZmlsZSBsYXJnZXIgdGhhbiA0MDk2IGJ5dGVzIHdoaWNoIGhhdmVuJ3QgYmVlbiB1cGRhdGUgc2luY2UgdGhlIGxhc3QKKyAgICBtaWxsZW5uaXVtLjwvcD4KIAorICAgIDxoNCBpZD0ibWFqb3JpdHlzZWxlY3QiPk1ham9yaXR5IFNlbGVjdG9yPC9oND4KIAotICAgIDxoND48YSBuYW1lPSJtYWpvcml0eXNlbGVjdCI+TWFqb3JpdHkgU2VsZWN0b3I8L2E+PC9oND4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O21ham9yaXR5Jmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMgcHJvdmlkZWQgdGhhdCBhIG1ham9yaXR5IG9mIHRoZSBjb250YWluZWQKKyAgICBlbGVtZW50cyBhbHNvIHNlbGVjdCBpdC4gVGllcyBhcmUgZGVhbHQgd2l0aCBhcyBzcGVjaWZpZWQgYnkgdGhlIDx2YXI+YWxsb3d0aWU8L3Zhcj4KKyAgICBhdHRyaWJ1dGUuPC9wPgogCi0gICAgPHA+VGhlIDxjb2RlPiZsdDttYWpvcml0eSZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHByb3ZpZGVkCi0gICAgdGhhdCBhIG1ham9yaXR5IG9mIHRoZSBjb250YWluZWQgZWxlbWVudHMgYWxzbyBzZWxlY3QgaXQuIFRpZXMgYXJlCi0gICAgZGVhbHQgd2l0aCBhcyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmFsbG93dGllPC9jb2RlPiBhdHRyaWJ1dGUuCi0gICAgPC9wPgotCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmFsbG93dGllPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5XaGV0aGVyIGZpbGVzIHNob3VsZCBiZSBzZWxlY3RlZCBpZiB0aGVyZQotICAgICAgICAgIGFyZSBhbiBldmVuIG51bWJlciBvZiBzZWxlY3RvcnMgc2VsZWN0aW5nIHRoZW0gYXMgYXJlCi0gICAgICAgICAgbm90IHNlbGVjdGluZyB0aGVtLiBEZWZhdWx0IGlzIHRydWUuCi0gICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+YWxsb3d0aWU8L3RkPgorICAgICAgICA8dGQ+V2hldGhlciBmaWxlcyBzaG91bGQgYmUgc2VsZWN0ZWQgaWYgdGhlcmUgYXJlIGFuIGV2ZW4gbnVtYmVyIG9mIHNlbGVjdG9ycyBzZWxlY3RpbmcgdGhlbQorICAgICAgICAgIGFzIGFyZSBub3Qgc2VsZWN0aW5nIHRoZW0uPC90ZD4KKyAgICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPnRydWU8L3E+PC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90YWJsZT4KIAotCiAgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIE1ham9yaXR5IFNlbGVjdG9yOjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske2RvY3N9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouaHRtbCZxdW90OyZndDsKICAgICAmbHQ7bWFqb3JpdHkmZ3Q7CiAgICAgICAgICZsdDtjb250YWlucyB0ZXh0PSZxdW90O3Byb2plY3QmcXVvdDsgY2FzZXNlbnNpdGl2ZT0iZmFsc2UiLyZndDsKICAgICAgICAgJmx0O2NvbnRhaW5zIHRleHQ9JnF1b3Q7dGFza2RlZiZxdW90OyBjYXNlc2Vuc2l0aXZlPSJmYWxzZSIvJmd0OwogICAgICAgICAmbHQ7Y29udGFpbnMgdGV4dD0mcXVvdDtJbnRyb3NwZWN0aW9uSGVscGVyJnF1b3Q7IGNhc2VzZW5zaXRpdmU9InRydWUiLyZndDsKICAgICAmbHQ7L21ham9yaXR5Jmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCiAgICAgPHA+U2VsZWN0cyBhbGwgdGhlIEhUTUwgZmlsZXMgd2hpY2ggY29udGFpbiBhdCBsZWFzdCB0d28gb2YgdGhlIHRocmVlCi0gICAgcGhyYXNlcyAicHJvamVjdCIsICJ0YXNrZGVmIiwgYW5kICJJbnRyb3NwZWN0aW9uSGVscGVyIiAodGhpcyBsYXN0IHBocmFzZSBtdXN0Ci0gICAgbWF0Y2ggY2FzZSBleGFjdGx5KS4KLSAgICA8L3A+CisgICAgcGhyYXNlcyA8cT5wcm9qZWN0PC9xPiwgPHE+dGFza2RlZjwvcT4sIGFuZCA8cT5JbnRyb3NwZWN0aW9uSGVscGVyPC9xPiAodGhpcyBsYXN0IHBocmFzZSBtdXN0CisgICAgbWF0Y2ggY2FzZSBleGFjdGx5KS48L3A+CiAKKyAgICA8aDQgaWQ9Im5vbmVzZWxlY3QiPk5vbmUgU2VsZWN0b3I8L2g0PgogCi0gICAgPGg0PjxhIG5hbWU9Im5vbmVzZWxlY3QiPk5vbmUgU2VsZWN0b3I8L2E+PC9oND4KLQotICAgIDxwPlRoZSA8Y29kZT4mbHQ7bm9uZSZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHRoYXQgYXJlCi0gICAgbm90IHNlbGVjdGVkIGJ5IGFueSBvZiB0aGUgZWxlbWVudHMgaXQgY29udGFpbnMuIEl0IHJldHVybnMgYXMKLSAgICBzb29uIGFzIGl0IGZpbmRzIGEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIHRoZSBmaWxlLAotICAgIHNvIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNoZWNrIGV2ZXJ5IHNlbGVjdG9yLgotICAgIDwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O25vbmUmZ3Q7PC9jb2RlPiB0YWcgc2VsZWN0cyBmaWxlcyB0aGF0IGFyZSBub3Qgc2VsZWN0ZWQgYnkgYW55IG9mIHRoZSBlbGVtZW50cworICAgIGl0IGNvbnRhaW5zLiBJdCByZXR1cm5zIGFzIHNvb24gYXMgaXQgZmluZHMgYSBzZWxlY3RvciB0aGF0IHNlbGVjdHMgdGhlIGZpbGUsIHNvIGl0IGlzIG5vdAorICAgIGd1YXJhbnRlZWQgdG8gY2hlY2sgZXZlcnkgc2VsZWN0b3IuPC9wPgogCiAgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIE5vbmUgU2VsZWN0b3I6PC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7c3JjfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsmZ3Q7CiAgICAgJmx0O25vbmUmZ3Q7CiAgICAgICAgICZsdDtwcmVzZW50IHRhcmdldGRpcj0mcXVvdDske2Rlc3R9JnF1b3Q7LyZndDsKQEAgLTEzMjQsNDYgKzEyNTEsMzYgQEAKICAgICAgICAgICAgICZsdDttYXBwZXIgdHlwZT0mcXVvdDtnbG9iJnF1b3Q7IGZyb209JnF1b3Q7Ki5qYXZhJnF1b3Q7IHRvPSZxdW90OyouY2xhc3MmcXVvdDsvJmd0OwogICAgICAgICAmbHQ7L3ByZXNlbnQmZ3Q7CiAgICAgJmx0Oy9ub25lJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+U2VsZWN0cyBvbmx5IEphdmEgZmlsZXMgd2hpY2ggZG8gbm90IGhhdmUgZXF1aXZhbGVudCBqYXZhIG9yCi0gICAgY2xhc3MgZmlsZXMgaW4gdGhlIGRlc3QgZGlyZWN0b3J5LgotICAgIDwvcD4KKyAgICA8cD5TZWxlY3RzIG9ubHkgPHNhbXA+LmphdmE8L3NhbXA+IGZpbGVzIHdoaWNoIGRvIG5vdCBoYXZlIGVxdWl2YWxlbnQgPHNhbXA+LmphdmE8L3NhbXA+CisgICAgb3IgPHNhbXA+LmNsYXNzPC9zYW1wPiBmaWxlcyBpbiB0aGUgPHNhbXA+ZGVzdDwvc2FtcD4gZGlyZWN0b3J5LjwvcD4KIAorICAgIDxoNCBpZD0ibm90c2VsZWN0Ij5Ob3QgU2VsZWN0b3I8L2g0PgogCi0gICAgPGg0PjxhIG5hbWU9Im5vdHNlbGVjdCI+Tm90IFNlbGVjdG9yPC9hPjwvaDQ+Ci0KLSAgICA8cD5UaGUgPGNvZGU+Jmx0O25vdCZndDs8L2NvZGU+IHRhZyByZXZlcnNlcyB0aGUgbWVhbmluZyBvZiB0aGUKLSAgICBzaW5nbGUgc2VsZWN0b3IgaXQgY29udGFpbnMuCi0gICAgPC9wPgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7bm90Jmd0OzwvY29kZT4gdGFnIHJldmVyc2VzIHRoZSBtZWFuaW5nIG9mIHRoZSBzaW5nbGUgc2VsZWN0b3IgaXQgY29udGFpbnMuPC9wPgogCiAgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIE5vdCBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyouamF2YSZxdW90OyZndDsKICAgICAmbHQ7bm90Jmd0OwogICAgICAgICAmbHQ7Y29udGFpbnMgdGV4dD0mcXVvdDt0ZXN0JnF1b3Q7LyZndDsKICAgICAmbHQ7L25vdCZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBmaWxlcyBpbiB0aGUgc3JjIGRpcmVjdG9yeSB0aGF0IGRvIG5vdCBjb250YWluIHRoZQotICAgIHN0cmluZyAidGVzdCIuCi0gICAgPC9wPgorICAgIDxwPlNlbGVjdHMgYWxsIHRoZSBmaWxlcyBpbiB0aGUgPHNhbXA+c3JjPC9zYW1wPiBkaXJlY3RvcnkgdGhhdCBkbyBub3QgY29udGFpbiB0aGUKKyAgICBzdHJpbmcgPHE+dGVzdDwvcT4uPC9wPgogCisgICAgPGg0IGlkPSJvcnNlbGVjdCI+T3IgU2VsZWN0b3I8L2g0PgogCi0gICAgPGg0PjxhIG5hbWU9Im9yc2VsZWN0Ij5PciBTZWxlY3RvcjwvYT48L2g0PgotCi0gICAgPHA+VGhlIDxjb2RlPiZsdDtvciZndDs8L2NvZGU+IHRhZyBzZWxlY3RzIGZpbGVzIHRoYXQgYXJlCi0gICAgc2VsZWN0ZWQgYnkgYW55IG9uZSBvZiB0aGUgZWxlbWVudHMgaXQgY29udGFpbnMuIEl0IHJldHVybnMgYXMKLSAgICBzb29uIGFzIGl0IGZpbmRzIGEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIHRoZSBmaWxlLAotICAgIHNvIGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGNoZWNrIGV2ZXJ5IHNlbGVjdG9yLgotICAgIDwvcD4KKyAgICA8cD5UaGUgPGNvZGU+Jmx0O29yJmd0OzwvY29kZT4gdGFnIHNlbGVjdHMgZmlsZXMgdGhhdCBhcmUgc2VsZWN0ZWQgYnkgYW55IG9uZSBvZiB0aGUgZWxlbWVudHMgaXQKKyAgICBjb250YWlucy4gSXQgcmV0dXJucyBhcyBzb29uIGFzIGl0IGZpbmRzIGEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIHRoZSBmaWxlLCBzbyBpdCBpcyBub3QKKyAgICBndWFyYW50ZWVkIHRvIGNoZWNrIGV2ZXJ5IHNlbGVjdG9yLjwvcD4KIAogICAgIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBPciBTZWxlY3Rvcjo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtiYXNlZGlyfSZxdW90OyZndDsKICAgICAmbHQ7b3ImZ3Q7CiAgICAgICAgICZsdDtkZXB0aCBtYXg9JnF1b3Q7MCZxdW90Oy8mZ3Q7CkBAIC0xMzcxLDU3ICsxMjg4LDQ4IEBACiAgICAgICAgICZsdDtmaWxlbmFtZSBuYW1lPSIqLmdpZiIvJmd0OwogICAgICAgICAmbHQ7ZmlsZW5hbWUgbmFtZT0iKi5qcGciLyZndDsKICAgICAmbHQ7L29yJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+U2VsZWN0cyBhbGwgdGhlIGZpbGVzIGluIHRoZSB0b3AgZGlyZWN0b3J5IGFsb25nIHdpdGggYWxsIHRoZQotICAgIGltYWdlIGZpbGVzIGJlbG93IGl0LgotICAgIDwvcD4KKyAgICA8cD5TZWxlY3RzIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHRvcCBkaXJlY3RvcnkgYWxvbmcgd2l0aCBhbGwgdGhlIGltYWdlIGZpbGVzIGJlbG93IGl0LjwvcD4KIAorICAgIDxoNCBpZD0ic2VsZWN0b3JzZWxlY3QiPlNlbGVjdG9yIFJlZmVyZW5jZTwvaDQ+CiAKLSAgICA8aDQ+PGEgbmFtZT0ic2VsZWN0b3JzZWxlY3QiPlNlbGVjdG9yIFJlZmVyZW5jZTwvYT48L2g0PgorICAgIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBjcmVhdGUgc2VsZWN0b3JzIHRoYXQgY2FuIGJlIHJldXNlZCB0aHJvdWdoCisgICAgcmVmZXJlbmNlcy4gSXQgaXMgdGhlIG9ubHkgc2VsZWN0b3Igd2hpY2ggY2FuIGJlIHVzZWQgb3V0c2lkZSBvZiBhbnkgdGFyZ2V0LCBhcyBhbiBlbGVtZW50IG9mCisgICAgdGhlIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4gdGFnLiBJdCBjYW4gY29udGFpbiBvbmx5IG9uZSBvdGhlciBzZWxlY3RvciwgYnV0IG9mIGNvdXJzZSB0aGF0CisgICAgc2VsZWN0b3IgY2FuIGJlIGEgY29udGFpbmVyLjwvcD4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcgaXMgdXNlZCB0byBjcmVhdGUgc2VsZWN0b3JzCi0gICAgdGhhdCBjYW4gYmUgcmV1c2VkIHRocm91Z2ggcmVmZXJlbmNlcy4gSXQgaXMgdGhlIG9ubHkgc2VsZWN0b3Igd2hpY2ggY2FuCi0gICAgYmUgdXNlZCBvdXRzaWRlIG9mCi0gICAgYW55IHRhcmdldCwgYXMgYW4gZWxlbWVudCBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiB0YWcuIEl0Ci0gICAgY2FuIGNvbnRhaW4gb25seSBvbmUgb3RoZXIgc2VsZWN0b3IsIGJ1dCBvZiBjb3Vyc2UgdGhhdCBzZWxlY3RvciBjYW4KLSAgICBiZSBhIGNvbnRhaW5lci4KLSAgICA8L3A+CisgICAgPHA+VGhlIDxjb2RlPiZsdDtzZWxlY3RvciZndDs8L2NvZGU+IHRhZyBjYW4gYWxzbyBiZSB1c2VkIHRvIHNlbGVjdCBmaWxlcyBjb25kaXRpb25hbGx5IGJhc2VkIG9uCisgICAgd2hldGhlciBhbiBBbnQgcHJvcGVydHkgZXhpc3RzIG9yIG5vdC4gIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyByZWFsaXplZCB1c2luZyB0aGUgPHZhcj5pZjwvdmFyPgorICAgIGFuZCA8dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGVzIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZXkgYXJlIHVzZWQgb24gdGFyZ2V0cyBvciBvbgorICAgIHRoZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZSZndDs8L2NvZGU+IHRhZ3Mgd2l0aGluCisgICAgYSA8Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+LjwvcD4KIAotICAgIDxwPlRoZSA8Y29kZT4mbHQ7c2VsZWN0b3ImZ3Q7PC9jb2RlPiB0YWcgY2FuIGFsc28gYmUgdXNlZCB0byBzZWxlY3QKLSAgICBmaWxlcyBjb25kaXRpb25hbGx5IGJhc2VkIG9uIHdoZXRoZXIgYW4gQW50IHByb3BlcnR5IGV4aXN0cyBvciBub3QuCi0gICAgVGhpcyBmdW5jdGlvbmFsaXR5IGlzIHJlYWxpemVkIHVzaW5nIHRoZSA8Y29kZT4mcXVvdDtpZiZxdW90OzwvY29kZT4gYW5kCi0gICAgPGNvZGU+JnF1b3Q7dW5sZXNzJnF1b3Q7PC9jb2RlPiBhdHRyaWJ1dGVzIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoZXkKLSAgICBhcmUgdXNlZCBvbiB0YXJnZXRzIG9yIG9uIHRoZSA8Y29kZT4mbHQ7aW5jbHVkZSZndDs8L2NvZGU+IGFuZAotICAgIDxjb2RlPiZsdDtleGNsdWRlJmd0OzwvY29kZT4gdGFncyB3aXRoaW4gYQotICAgIDxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT4uPC9wPgotCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmlmPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BbGxvdyBmaWxlcyB0byBiZSBzZWxlY3RlZCBvbmx5IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZAorICAgICAgICA8dGQ+aWY8L3RkPgorICAgICAgICA8dGQ+QWxsb3cgZmlsZXMgdG8gYmUgc2VsZWN0ZWQgb25seSA8YSBocmVmPSIuLi9wcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5pZiB0aGUgbmFtZWQKICAgICAgICAgICBwcm9wZXJ0eSBpcyBzZXQ8L2E+LgogICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+dW5sZXNzPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BbGxvdyBmaWxlcyB0byBiZSBzZWxlY3RlZCBvbmx5IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZAotICAgICAgICAgIHByb3BlcnR5IGlzIDxiPm5vdDwvYj4gc2V0PC9hPi4KKyAgICAgICAgPHRkPnVubGVzczwvdGQ+CisgICAgICAgIDx0ZD5BbGxvdyBmaWxlcyB0byBiZSBzZWxlY3RlZCBvbmx5IDxhIGhyZWY9Ii4uL3Byb3BlcnRpZXMuaHRtbCNpZit1bmxlc3MiPmlmIHRoZSBuYW1lZAorICAgICAgICAgIHByb3BlcnR5IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHNldDwvYT4uCiAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICA8L3RhYmxlPgogCiAgICAgPHA+SGVyZSBpcyBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNlbGVjdG9yIFJlZmVyZW5jZTo8L3A+CiAKLSAgICA8YmxvY2txdW90ZT48cHJlPgorICAgIDxwcmU+CiAmbHQ7cHJvamVjdCBkZWZhdWx0PSZxdW90O2FsbCZxdW90OyBiYXNlZGlyPSZxdW90Oy4vYW50JnF1b3Q7Jmd0OwogCiAgICAgJmx0O3NlbGVjdG9yIGlkPSZxdW90O2NvbXBsZXRlZCZxdW90OyZndDsKQEAgLTE0NDMsMTcgKzEzNTEsMTQgQEAKICAgICAgICAgJmx0Oy96aXAmZ3Q7CiAgICAgJmx0Oy90YXJnZXQmZ3Q7CiAKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAotICAgIDxwPlppcHMgdXAgYWxsIHRoZSBKYXZhIGZpbGVzIHdoaWNoIGhhdmUgYW4gdXAtdG8tZGF0ZSBlcXVpdmFsZW50Ci0gICAgY2xhc3MgZmlsZSBhbmQgamF2YWRvYyBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLgotICAgIDwvcD4KKyAgICA8cD5aaXBzIHVwIGFsbCB0aGUgamF2YSBmaWxlcyB3aGljaCBoYXZlIGFuIHVwLXRvLWRhdGUgZXF1aXZhbGVudCBjbGFzcyBmaWxlIGFuZCBqYXZhZG9jIGZpbGUKKyAgICBhc3NvY2lhdGVkIHdpdGggdGhlbS48L3A+CiAKLSAgICA8cD5BbmQgYW4gZXhhbXBsZSBvZiBzZWxlY3RpbmcgZmlsZXMgY29uZGl0aW9uYWxseSwgYmFzZWQgb24gd2hldGhlcgotICAgIHByb3BlcnRpZXMgYXJlIHNldDo8L3A+CisgICAgPHA+QW5kIGFuIGV4YW1wbGUgb2Ygc2VsZWN0aW5nIGZpbGVzIGNvbmRpdGlvbmFsbHksIGJhc2VkIG9uIHdoZXRoZXIgcHJvcGVydGllcyBhcmUgc2V0OjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske3dvcmtpbmcuY29weX0mcXVvdDsmZ3Q7CiAgICAgJmx0O29yJmd0OwogICAgICAgICAmbHQ7c2VsZWN0b3IgaWY9JnF1b3Q7aW5jbHVkZS50ZXN0cyZxdW90OyZndDsKQEAgLTE0NzAsMTA5ICsxMzc1LDkzIEBACiAgICAgICAgICAgICAmbHQ7L2FuZCZndDsKICAgICAgICAgJmx0Oy9zZWxlY3RvciZndDsKICAgICAmbHQ7L29yJmd0OwotJmx0Oy9maWxlc2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy9maWxlc2V0Jmd0OzwvcHJlPgogCi0gICAgPHA+QSBmaWxlc2V0IHRoYXQgY29uZGl0aW9uYWxseSBjb250YWlucyBKYXZhIHNvdXJjZSBmaWxlcyBhbmQgVGVzdAotICAgIHNvdXJjZSBhbmQgY2xhc3MgZmlsZXMuPC9wPgorICAgIDxwPkEgZmlsZXNldCB0aGF0IGNvbmRpdGlvbmFsbHkgY29udGFpbnMgSmF2YSBzb3VyY2UgZmlsZXMgYW5kIFRlc3Qgc291cmNlIGFuZCBjbGFzcworICAgIGZpbGVzLjwvcD4KIAotICAgIDxoMz48YSBuYW1lPSJjdXN0b21zZWxlY3QiPkN1c3RvbSBTZWxlY3RvcnM8L2E+PC9oMz4KKyAgICA8aDMgaWQ9ImN1c3RvbXNlbGVjdCI+Q3VzdG9tIFNlbGVjdG9yczwvaDM+CiAKLSAgICA8cD5Zb3UgY2FuIHdyaXRlIHlvdXIgb3duIHNlbGVjdG9ycyBhbmQgdXNlIHRoZW0gd2l0aGluIHRoZSBzZWxlY3RvcgotICAgIGNvbnRhaW5lcnMgYnkgc3BlY2lmeWluZyB0aGVtIHdpdGhpbiB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy48L3A+CisgICAgPHA+WW91IGNhbiB3cml0ZSB5b3VyIG93biBzZWxlY3RvcnMgYW5kIHVzZSB0aGVtIHdpdGhpbiB0aGUgc2VsZWN0b3IgY29udGFpbmVycyBieSBzcGVjaWZ5aW5nCisgICAgdGhlbSB3aXRoaW4gdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0YWcuPC9wPgogCi0gICAgPHA+Rmlyc3QsIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIgc2VsZWN0b3IgY2xhc3MgaW4gSmF2YS4gVGhlIG9ubHkKLSAgICByZXF1aXJlbWVudCBpdCBtdXN0IG1lZXQgaW4gb3JkZXIgdG8gYmUgYSBzZWxlY3RvciBpcyB0aGF0IGl0IGltcGxlbWVudHMKLSAgICB0aGUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjwvY29kZT4KLSAgICBpbnRlcmZhY2UsIHdoaWNoIGNvbnRhaW5zIGEgc2luZ2xlIG1ldGhvZC4gU2VlCi0gICAgPGEgaHJlZj0ic2VsZWN0b3JzLXByb2dyYW0uaHRtbCI+UHJvZ3JhbW1pbmcgU2VsZWN0b3JzIGluIEFudDwvYT4gZm9yCi0gICAgbW9yZSBpbmZvcm1hdGlvbi48L3A+CisgICAgPHA+Rmlyc3QsIHlvdSBoYXZlIHRvIHdyaXRlIHlvdXIgc2VsZWN0b3IgY2xhc3MgaW4gSmF2YS4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXQgbXVzdCBtZWV0IGluCisgICAgb3JkZXIgdG8gYmUgYSBzZWxlY3RvciBpcyB0aGF0IGl0IGltcGxlbWVudHMKKyAgICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I8L2NvZGU+IGludGVyZmFjZSwgd2hpY2gKKyAgICBjb250YWlucyBhIHNpbmdsZSBtZXRob2QuIFNlZSA8YSBocmVmPSJzZWxlY3RvcnMtcHJvZ3JhbS5odG1sIj5Qcm9ncmFtbWluZyBTZWxlY3RvcnMgaW4gQW50PC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KIAogICAgIDxwPk9uY2UgdGhhdCBpcyB3cml0dGVuLCB5b3UgaW5jbHVkZSBpdCBpbiB5b3VyIGJ1aWxkIGZpbGUgYnkgdXNpbmcKLSAgICB0aGUgPGNvZGU+Jmx0O2N1c3RvbSZndDs8L2NvZGU+IHRhZy4KLSAgICA8L3A+CisgICAgdGhlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0YWcuPC9wPgogCi0gICAgPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKyAgICA8dGFibGUgY2xhc3M9ImF0dHIiPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzbmFtZTwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgeW91ciBjbGFzcyB0aGF0IGltcGxlbWVudHMKLSAgICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZVNlbGVjdG9yPC9jb2RlPi4KKyAgICAgICAgPHRkPmNsYXNzbmFtZTwvdGQ+CisgICAgICAgIDx0ZD5UaGUgbmFtZSBvZiB5b3VyIGNsYXNzIHRoYXQKKyAgICAgICAgaW1wbGVtZW50cyA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjwvY29kZT4uCiAgICAgICAgIDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+WWVzPC90ZD4KKyAgICAgICAgPHRkPlllczwvdGQ+CiAgICAgICA8L3RyPgogICAgICAgPHRyPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiPmNsYXNzcGF0aDwvdGQ+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIGNsYXNzcGF0aCB0byB1c2UgaW4gb3JkZXIgdG8gbG9hZCB0aGUKLSAgICAgICAgICBjdXN0b20gc2VsZWN0b3IgY2xhc3MuIElmIG5laXRoZXIgdGhpcyBjbGFzc3BhdGggbm9yIHRoZQotICAgICAgICAgIGNsYXNzcGF0aHJlZiBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQotICAgICAgICAgIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQgdXNlcy4KLSAgICAgICAgPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICAgIDx0ZD5jbGFzc3BhdGg8L3RkPgorICAgICAgICA8dGQ+VGhlIGNsYXNzcGF0aCB0byB1c2UgaW4gb3JkZXIgdG8gbG9hZCB0aGUgY3VzdG9tIHNlbGVjdG9yIGNsYXNzLiBJZgorICAgICAgICBuZWl0aGVyIDx2YXI+Y2xhc3NwYXRoPC92YXI+IG5vciA8dmFyPmNsYXNzcGF0aHJlZjwvdmFyPiBhcmUgc3BlY2lmaWVkLCB0aGUgY2xhc3Mgd2lsbCBiZQorICAgICAgICBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoIHRoYXQgQW50IHVzZXMuPC90ZD4KKyAgICAgICAgPHRkPk5vPC90ZD4KICAgICAgIDwvdHI+CiAgICAgICA8dHI+Ci0gICAgICAgIDx0ZCB2YWxpZ249InRvcCI+Y2xhc3NwYXRocmVmPC90ZD4KLSAgICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBwcmV2aW91c2x5Ci0gICAgICAgICAgZGVmaW5lZC4gSWYgbmVpdGhlciB0aGlzIHJlZmVyZW5jZSBub3IgdGhlCi0gICAgICAgICAgY2xhc3NwYXRoIGFib3ZlIGFyZSBzcGVjaWZpZWQsIHRoZSBjbGFzcyB3aWxsIGJlCi0gICAgICAgICAgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aCB0aGF0IEFudCB1c2VzLgotICAgICAgICA8L3RkPgotICAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICAgICAgPHRkPmNsYXNzcGF0aHJlZjwvdGQ+CisgICAgICAgIDx0ZD5BIHJlZmVyZW5jZSB0byBhIGNsYXNzcGF0aCBwcmV2aW91c2x5IGRlZmluZWQuIElmIG5laXRoZXIgPHZhcj5jbGFzc3BhdGhyZWY8L3Zhcj4KKyAgICAgICAgbm9yIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGFyZSBzcGVjaWZpZWQsIHRoZSBjbGFzcyB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBjbGFzc3BhdGggdGhhdCBBbnQKKyAgICAgICAgdXNlcy48L3RkPgorICAgICAgICA8dGQ+Tm88L3RkPgogICAgICAgPC90cj4KICAgICA8L3RhYmxlPgogCi0gICAgPHA+SGVyZSBpcyBob3cgeW91IHVzZSA8Y29kZT4mbHQ7Y3VzdG9tJmd0OzwvY29kZT4gdG8KLSAgICB1c2UgeW91ciBjbGFzcyBhcyBhIHNlbGVjdG9yOgotICAgIDwvcD4KKyAgICA8cD5IZXJlIGlzIGhvdyB5b3UgdXNlIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPiB0byB1c2UgeW91ciBjbGFzcyBhcyBhIHNlbGVjdG9yOjwvcD4KIAotICAgIDxibG9ja3F1b3RlPjxwcmU+CisgICAgPHByZT4KICZsdDtmaWxlc2V0IGRpcj0mcXVvdDske215ZGlyfSZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qJnF1b3Q7Jmd0OwogICAgICZsdDtjdXN0b20gY2xhc3NuYW1lPSZxdW90O2NvbS5teWRvbWFpbi5NeVNlbGVjdG9yJnF1b3Q7Jmd0OwogICAgICAgICAmbHQ7cGFyYW0gbmFtZT0mcXVvdDtteWF0dHJpYnV0ZSZxdW90OyB2YWx1ZT0mcXVvdDtteXZhbHVlJnF1b3Q7LyZndDsKICAgICAmbHQ7L2N1c3RvbSZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPkEgbnVtYmVyIG9mIGNvcmUgc2VsZWN0b3JzIGNhbiBhbHNvIGJlIHVzZWQgYXMgY3VzdG9tIHNlbGVjdG9ycwotICAgIGJ5IHNwZWNpZnlpbmcgdGhlaXIgYXR0cmlidXRlcyB1c2luZyA8Y29kZT4mbHQ7cGFyYW0mZ3Q7PC9jb2RlPiBlbGVtZW50cy4gVGhlc2UKLSAgICBhcmU8L3A+CisgICAgPHA+QSBudW1iZXIgb2YgY29yZSBzZWxlY3RvcnMgY2FuIGFsc28gYmUgdXNlZCBhcyBjdXN0b20gc2VsZWN0b3JzIGJ5IHNwZWNpZnlpbmcgdGhlaXIKKyAgICBhdHRyaWJ1dGVzIHVzaW5nIDxjb2RlPiZsdDtwYXJhbSZndDs8L2NvZGU+IGVsZW1lbnRzLiBUaGVzZSBhcmU8L3A+CiAKICAgICA8dWw+CiAgICAgICA8bGk+PGEgaHJlZj0iI2NvbnRhaW5zc2VsZWN0Ij5Db250YWlucyBTZWxlY3RvcjwvYT4gd2l0aAotICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkNvbnRhaW5zU2VsZWN0b3I8L2NvZGU+CisgICAgICAgIGNsYXNzbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkNvbnRhaW5zU2VsZWN0b3I8L2NvZGU+CiAgICAgICA8bGk+PGEgaHJlZj0iI2RhdGVzZWxlY3QiPkRhdGUgU2VsZWN0b3I8L2E+IHdpdGgKLSAgICAgICAgY2xhc3NuYW1lIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5EYXRlU2VsZWN0b3I8L2NvZGU+CisgICAgICAgIGNsYXNzbmFtZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRhdGVTZWxlY3RvcjwvY29kZT4KICAgICAgIDxsaT48YSBocmVmPSIjZGVwdGhzZWxlY3QiPkRlcHRoIFNlbGVjdG9yPC9hPiB3aXRoCi0gICAgICAgIGNsYXNzbmFtZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvcjwvY29kZT4KKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwdGhTZWxlY3RvcjwvY29kZT4KICAgICAgIDxsaT48YSBocmVmPSIjZmlsZW5hbWVzZWxlY3QiPkZpbGVuYW1lIFNlbGVjdG9yPC9hPiB3aXRoCi0gICAgICAgIGNsYXNzbmFtZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZW5hbWVTZWxlY3RvcjwvY29kZT4KKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRmlsZW5hbWVTZWxlY3RvcjwvY29kZT4KICAgICAgIDxsaT48YSBocmVmPSIjc2l6ZXNlbGVjdCI+U2l6ZSBTZWxlY3RvcjwvYT4gd2l0aAotICAgICAgICBjbGFzc25hbWUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjwvY29kZT4KKyAgICAgICAgY2xhc3NuYW1lIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2l6ZVNlbGVjdG9yPC9jb2RlPgogICAgIDwvdWw+CiAKLSAgICA8cD5IZXJlIGlzIHRoZSBleGFtcGxlIGZyb20gdGhlIERlcHRoIFNlbGVjdG9yIHNlY3Rpb24gcmV3cml0dGVuCi0gICAgdG8gdXNlIHRoZSBzZWxlY3RvciB0aHJvdWdoIDxjb2RlPiZsdDtjdXN0b20mZ3Q7PC9jb2RlPi48L3A+CisgICAgPHA+SGVyZSBpcyB0aGUgZXhhbXBsZSBmcm9tIHRoZSBEZXB0aCBTZWxlY3RvciBzZWN0aW9uIHJld3JpdHRlbiB0byB1c2UgdGhlIHNlbGVjdG9yCisgICAgdGhyb3VnaCA8Y29kZT4mbHQ7Y3VzdG9tJmd0OzwvY29kZT4uPC9wPgogCi0gICAgPGJsb2NrcXVvdGU+PHByZT4KKyAgICA8cHJlPgogJmx0O2ZpbGVzZXQgZGlyPSZxdW90OyR7ZG9jLnBhdGh9JnF1b3Q7IGluY2x1ZGVzPSZxdW90OyoqLyomcXVvdDsmZ3Q7CiAgICAgJmx0O2N1c3RvbSBjbGFzc25hbWU9JnF1b3Q7b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcHRoU2VsZWN0b3ImcXVvdDsmZ3Q7CiAgICAgICAgICZsdDtwYXJhbSBuYW1lPSZxdW90O21heCZxdW90OyB2YWx1ZT0mcXVvdDsxJnF1b3Q7LyZndDsKICAgICAmbHQ7L2N1c3RvbSZndDsKLSZsdDsvZmlsZXNldCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvZmlsZXNldCZndDs8L3ByZT4KIAotICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdwotICAgIHRoYXQuPC9wPgorICAgIDxwPlNlbGVjdHMgYWxsIGZpbGVzIGluIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgb25lIGRpcmVjdG9yeSBiZWxvdyB0aGF0LjwvcD4KIAotICAgIDxwPkZvciBtb3JlIGRldGFpbHMgY29uY2VybmluZyB3cml0aW5nIHlvdXIgb3duIHNlbGVjdG9ycywgY29uc3VsdAotICAgIDxhIGhyZWY9InNlbGVjdG9ycy1wcm9ncmFtLmh0bWwiPlByb2dyYW1taW5nIFNlbGVjdG9ycyBpbiBBbnQ8L2E+LjwvcD4KLQotICAgIAorICAgIDxwPkZvciBtb3JlIGRldGFpbHMgY29uY2VybmluZyB3cml0aW5nIHlvdXIgb3duIHNlbGVjdG9ycywKKyAgICBjb25zdWx0IDxhIGhyZWY9InNlbGVjdG9ycy1wcm9ncmFtLmh0bWwiPlByb2dyYW1taW5nIFNlbGVjdG9ycyBpbiBBbnQ8L2E+LjwvcD4KIAogICA8L2JvZHk+Ci0KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy90YXJmaWxlc2V0Lmh0bWwgYi9tYW51YWwvVHlwZXMvdGFyZmlsZXNldC5odG1sCmluZGV4IDQ5OWVkNzkuLmQ2ZGZlZmIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy90YXJmaWxlc2V0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL3RhcmZpbGVzZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE2OSArMTUsMTM0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlRhckZpbGVTZXQgVHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KLTxoMj48YSBuYW1lPSJmaWxlc2V0Ij5UYXJGaWxlU2V0PC9hPjwvaDI+Cis8aDIgaWQ9ImZpbGVzZXQiPlRhckZpbGVTZXQ8L2gyPgogCi08cD48ZW0+VGFyRmlsZVNldDwvZW0+IGhhcyBiZWVuIGFkZGVkIGFzIGEgc3RhbmQtYWxvbmUgdHlwZSBpbiBBcGFjaGUgQW50Ci0xLjcuPC9wPgorPHA+PGNvZGU+VGFyRmlsZVNldDwvY29kZT4gaGFzIGJlZW4gYSBzdGFuZC1hbG9uZSB0eXBlIDxlbT5zaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+LjwvcD4KIAotPHA+QSA8Y29kZT4mbHQ7dGFyZmlsZXNldCZndDs8L2NvZGU+IGlzIGEgc3BlY2lhbCBmb3JtIG9mIGEgPGNvZGU+Jmx0OzxhCi0gaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiZndDs8L2NvZGU+IHdoaWNoIGNhbiBiZWhhdmUgaW4gMgotZGlmZmVyZW50IHdheXMgOiA8YnI+Ci08L3A+Cis8cD5BIDxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4gaXMgYSBzcGVjaWFsIGZvcm0gb2YKK2EgPGNvZGU+Jmx0OzxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4mZ3Q7PC9jb2RlPiB3aGljaCBjYW4gYmVoYXZlIGluIDIgZGlmZmVyZW50IHdheXM6PC9wPgogPHVsPgotICA8bGk+V2hlbiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnNyYzwvc3Bhbj4gYXR0cmlidXRlCi0gIGlzIHVzZWQgLSBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGhhcyBiZWVuIHNwZWNpZmllZCwgdGhlCi0gIHRhcmZpbGVzZXQgaXMgcG9wdWxhdGVkIHdpdGggdGFyIGVudHJpZXMgZm91bmQgaW4gdGhlIGZpbGUgPHNwYW4KLSAgc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnNyYzwvc3Bhbj4uPGJyPgotICA8L2xpPgotICA8bGk+V2hlbiB0aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4gYXR0cmlidXRlCi1pcyB1c2VkLCB0aGUgdGFyZmlsZXNldCBpcyBwb3B1bGF0ZWQgd2l0aCBmaWxlc3lzdGVtIGZpbGVzIGZvdW5kIHVuZGVyIDxzcGFuCi0gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPmRpcjwvc3Bhbj4uPGJyPgotICA8L2xpPgorICA8bGk+V2hlbiB0aGUgPHZhcj5zcmM8L3Zhcj4gYXR0cmlidXRlIGlzIHVzZWQmbWRhc2g7b3IgYSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBoYXMgYmVlbgorICBzcGVjaWZpZWQsIHRoZSB0YXJmaWxlc2V0IGlzIHBvcHVsYXRlZCB3aXRoIHRhciBlbnRyaWVzIGZvdW5kIGluIHRoZSBmaWxlIDx2YXI+c3JjPC92YXI+LjwvbGk+CisgIDxsaT5XaGVuIHRoZSA8dmFyPmRpcjwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCwgdGhlIHRhcmZpbGVzZXQgaXMgcG9wdWxhdGVkIHdpdGggZmlsZXN5c3RlbSBmaWxlcworICBmb3VuZCB1bmRlciA8dmFyPmRpcjwvdmFyPi48L2xpPgogPC91bD4KLTxwPjxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4gc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0OzxhCi0gaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiZndDs8L2NvZGU+Ci0gaW4gYWRkaXRpb24gdG8gdGhvc2UgbGlzdGVkIGJlbG93LiAgTm90ZSB0aGF0IHRhciBhcmNoaXZlcyBpbiBnZW5lcmFsCi0gZG9uJ3QgY29udGFpbiBlbnRyaWVzIHdpdGggbGVhZGluZyBzbGFzaGVzIHNvIHlvdSBzaG91bGRuJ3QgdXNlCi0gaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIHRoYXQgc3RhcnQgd2l0aCBzbGFzaGVzIGVpdGhlci4KLTwvcD4KLTxwPkEgdGFyZmlsZXNldCBjYW4gYmUgZGVmaW5lZCB3aXRoIHRoZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZToKLWl0YWxpYzsiPmlkIDwvc3Bhbj5hdHRyaWJ1dGUgYW5kIHJlZmVycmVkIHRvIHdpdGggdGhlIDxzcGFuCi1zdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+cmVmaWQ8L3NwYW4+IGF0dHJpYnV0ZS4gIFRoaXMgaXMgYWxzbyB0cnVlCi1mb3IgdGFyZmlsZXNldCB3aGljaCBoYXMgYmVlbiBhZGRlZCBpbiBBbnQgMS43Ljxicj4KLTwvcD4KKzxwPjxjb2RlPiZsdDt0YXJmaWxlc2V0Jmd0OzwvY29kZT4gc3VwcG9ydHMgYWxsIGF0dHJpYnV0ZXMKK29mIDxjb2RlPiZsdDs8YSBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+Jmd0OzwvY29kZT4gaW4gYWRkaXRpb24gdG8gdGhvc2UgbGlzdGVkIGJlbG93LiAgTm90ZQordGhhdCB0YXIgYXJjaGl2ZXMgaW4gZ2VuZXJhbCBkb24ndCBjb250YWluIGVudHJpZXMgd2l0aCBsZWFkaW5nIHNsYXNoZXMgc28geW91IHNob3VsZG4ndCB1c2UKK2luY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyB0aGF0IHN0YXJ0IHdpdGggc2xhc2hlcyBlaXRoZXIuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPiwgYSB0YXJmaWxlc2V0IGNhbiBiZSBkZWZpbmVkIHdpdGggdGhlIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlIGFuZCByZWZlcnJlZAordG8gd2l0aCB0aGUgPHZhcj5yZWZpZDwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogPGgzPlBhcmFtZXRlcnM8L2gzPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgIDx0Ym9keT4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+YWxsIGZpbGVzIGluIHRoZSBmaWxlc2V0IGFyZSBwcmVmaXhlZCB3aXRoIHRoYXQgCi1wYXRoIGluIHRoZSBhcmNoaXZlLjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5wcmVmaXg8L3RkPgorICAgICAgPHRkPmFsbCBmaWxlcyBpbiB0aGUgZmlsZXNldCBhcmUgcHJlZml4ZWQgd2l0aCB0aGF0IHBhdGggaW4gdGhlIGFyY2hpdmUuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmZ1bGxwYXRoPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+dGhlIGZpbGUgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlc2V0IGlzIHBsYWNlZCBhdCAgCi10aGF0IGV4YWN0IGxvY2F0aW9uIGluIHRoZSBhcmNoaXZlLjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5mdWxscGF0aDwvdGQ+CisgICAgICA8dGQ+dGhlIGZpbGUgZGVzY3JpYmVkIGJ5IHRoZSBmaWxlc2V0IGlzIHBsYWNlZCBhdCB0aGF0IGV4YWN0IGxvY2F0aW9uIGluIHRoZSBhcmNoaXZlLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5zcmM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5tYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgPGk+ZGlyPC9pPiBhdHRyaWJ1dGUKLSB0byBzcGVjaWZ5IGEgdGFyIGZpbGUgd2hvc2UgY29udGVudHMgd2lsbCBiZSBleHRyYWN0ZWQgYW5kICAgICBpbmNsdWRlZAotaW4gdGhlIGFyY2hpdmUuPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHRkPnNyYzwvdGQ+CisgICAgICA8dGQ+bWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSB0byBzcGVjaWZ5IGEgdGFyIGZpbGUgd2hvc2UgY29udGVudHMKKyAgICAgICAgd2lsbCBiZSBleHRyYWN0ZWQgYW5kIGluY2x1ZGVkIGluIHRoZSBhcmNoaXZlLjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5maWxlbW9kZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIAotYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4IGZhc2hpb24uICBPbmx5IGFwcGxpZXMgdG8gICAgCi1wbGFpbiBmaWxlcy4gIERlZmF1bHQgaXMgNjQ0LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5maWxlbW9kZTwvdGQ+CisgICAgICA8dGQ+QSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4CisgICAgICAgIGZhc2hpb24uICBPbmx5IGFwcGxpZXMgdG8gcGxhaW4gZmlsZXMuPC90ZD4KKyAgICAgIDx0ZD5ObzsgZGVmYXVsdCBpcyA8cT42NDQ8L3E+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZGlybW9kZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIAotYW5kIG90aGVyIG1vZGVzIGluIHRoZSBzdGFuZGFyZCBVbml4IGZhc2hpb24uICBPbmx5IGFwcGxpZXMgdG8gICAgCi1kaXJlY3Rvcmllcy4gIERlZmF1bHQgaXMgNzU1LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5kaXJtb2RlPC90ZD4KKyAgICAgIDx0ZD5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCBhbmQgb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXgKKyAgICAgICAgZmFzaGlvbi4gIE9ubHkgYXBwbGllcyB0byBkaXJlY3Rvcmllcy48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjc1NTwvcT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj51c2VybmFtZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSB1c2VybmFtZSBmb3IgdGhlIHRhciBlbnRyeS4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIFVJRC4KLSAgICAgICA8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+dXNlcm5hbWU8L3RkPgorICAgICAgPHRkPlRoZSB1c2VybmFtZSBmb3IgdGhlIHRhciBlbnRyeS4gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIFVJRC48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+Z3JvdXA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgZ3JvdXBuYW1lIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgR0lELgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHRkPmdyb3VwPC90ZD4KKyAgICAgIDx0ZD5UaGUgZ3JvdXBuYW1lIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgR0lELjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj51aWQ8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgdXNlciBpZGVudGlmaWVyIChVSUQpIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUKLSAgICAgICAgYW5kIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgdXNlcm5hbWUuCi0gICAgICA8L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+dWlkPC90ZD4KKyAgICAgIDx0ZD5UaGUgdXNlciBpZGVudGlmaWVyIChVSUQpIGZvciB0aGUgdGFyIGVudHJ5LiBUaGlzIGlzIGFuIGludGVnZXIgdmFsdWUgYW5kIGlzIG5vdCB0aGUKKyAgICAgICAgc2FtZSBhcyB0aGUgdXNlcm5hbWUuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmdpZDwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBncm91cCBpZGVudGlmaWVyIChHSUQpIGZvciB0aGUgdGFyIGVudHJ5LgotICAgICAgPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHRkPmdpZDwvdGQ+CisgICAgICA8dGQ+VGhlIGdyb3VwIGlkZW50aWZpZXIgKEdJRCkgZm9yIHRoZSB0YXIgZW50cnkuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yb25taXNzaW5nYXJjaGl2ZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBTcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgSWYgdHJ1ZSwgYSBidWlsZCBlcnJvciB3aWxsIGhhcHBlbjsgaWYgZmFsc2UsIHRoZSBmaWxlc2V0Ci0gICAgICAgIHdpbGwgYmUgaWdub3JlZC9lbXB0eS4KLSAgICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8dGQ+ZXJyb3Jvbm1pc3NpbmdhcmNoaXZlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4gIElmIDxxPnRydWU8L3E+LCBhIGJ1aWxkIGVycm9yIHdpbGwKKyAgICAgICAgaGFwcGVuOyBpZiA8cT5mYWxzZTwvcT4sIHRoZSBmaWxlc2V0IHdpbGwgYmUgaWdub3JlZC9lbXB0eS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZW5jb2Rpbmc8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5UaGUgY2hhcmFjdGVyIGVuY29kaW5nIHRvIHVzZSBmb3IgZmlsZW5hbWVzCi0gICAgICBpbnNpZGUgdGhlIHppcCBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgc2VlIHRoZSA8YQotICAgICAgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+U3VwcG9ydGVkIEVuY29kaW5nczwvYT4uCi0gICAgICBEZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KLSAgICAgICAgPGVtPlNpbmNlIEFudCAxLjkuNTwvZW0+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5lbmNvZGluZzwvdGQ+CisgICAgICA8dGQ+VGhlIGNoYXJhY3RlciBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBpbnNpZGUgdGhlIHppcCBmaWxlLiAgRm9yIGEgbGlzdCBvZiBwb3NzaWJsZQorICAgICAgdmFsdWVzIHNlZQorICAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIgorICAgICAgdGFyZ2V0PSJfdG9wIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi4gIDxlbT5TaW5jZSBBbnQgMS45LjU8L2VtPjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgICAgPC90cj4KICAgPC90Ym9keT4KIDwvdGFibGU+Ci08cD5UaGUgPGk+ZnVsbHBhdGg8L2k+IGF0dHJpYnV0ZSBjYW4gb25seSBiZSBzZXQgZm9yIGZpbGVzZXRzIHRoYXQKLXJlcHJlc2VudCBhIHNpbmdsZSBmaWxlLiBUaGUgPGk+cHJlZml4PC9pPiBhbmQgPGk+ZnVsbHBhdGg8L2k+Ci1hdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNldCBvbiB0aGUgc2FtZSBmaWxlc2V0LjwvcD4KLTxwPldoZW4gdXNpbmcgdGhlIDxpPnNyYzwvaT4gYXR0cmlidXRlLCBpbmNsdWRlIGFuZCBleGNsdWRlIHBhdHRlcm5zCi1tYXkgYmUgdXNlZCB0byBzcGVjaWZ5IGEgc3Vic2V0IG9mIHRoZSBhcmNoaXZlIGZvciBpbmNsdXNpb24gaW4gdGhlCi1hcmNoaXZlIGFzIHdpdGggdGhlIDxpPmRpcjwvaT4gYXR0cmlidXRlLjwvcD4KKzxwPlRoZSA8dmFyPmZ1bGxwYXRoPC92YXI+IGF0dHJpYnV0ZSBjYW4gb25seSBiZSBzZXQgZm9yIGZpbGVzZXRzIHRoYXQgcmVwcmVzZW50IGEgc2luZ2xlCitmaWxlLiBUaGUgPHZhcj5wcmVmaXg8L3Zhcj4gYW5kIDx2YXI+ZnVsbHBhdGg8L3Zhcj4gYXR0cmlidXRlcyBjYW5ub3QgYm90aCBiZSBzZXQgb24gdGhlIHNhbWUKK2ZpbGVzZXQuPC9wPgorPHA+V2hlbiB1c2luZyB0aGUgPHZhcj5zcmM8L3Zhcj4gYXR0cmlidXRlLCA8dmFyPmluY2x1ZGU8L3Zhcj4gYW5kIDx2YXI+ZXhjbHVkZTwvdmFyPiBwYXR0ZXJucyBtYXkKK2JlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiB0aGUgYXJjaGl2ZSBmb3IgaW5jbHVzaW9uIGluIHRoZSBhcmNoaXZlIGFzIHdpdGggdGhlIDx2YXI+ZGlyPC92YXI+CithdHRyaWJ1dGUuPC9wPgogCi08cD5QbGVhc2Ugbm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IHRoZSA8YQotaHJlZj0iLi4vVGFza3MvdGFyLmh0bWwiPnRhcjwvYT4gdGFzayB1c2VzIHRoZSBwZXJtaXNzaW9uIGFuZAotb3duZXJzaGlwIGF0dHJpYnV0ZXMuPC9wPgorPHA+UGxlYXNlIG5vdGUgdGhhdCBjdXJyZW50bHkgb25seSB0aGUgPGEgaHJlZj0iLi4vVGFza3MvdGFyLmh0bWwiPnRhcjwvYT4gdGFzayB1c2VzIHRoZSBwZXJtaXNzaW9uCithbmQgb3duZXJzaGlwIGF0dHJpYnV0ZXMuPC9wPgogCiA8aDM+UGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmVzdGVkIGVsZW1lbnRzPC9oMz4KIAotPGg0PmFueSA8YSBocmVmPSJyZXNvdXJjZXMuaHRtbCI+cmVzb3VyY2U8L2E+IG9yIHNpbmdsZSBlbGVtZW50Ci1yZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KKzxoND5hbnkgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvciBzaW5nbGUgZWxlbWVudCByZXNvdXJjZSBjb2xsZWN0aW9uPC9oND4KIAogPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgc3JjLjwvcD4KIAogPGg0PkV4YW1wbGVzPC9oND4KLTxibG9ja3F1b3RlPgorCiA8cHJlPgotICAmbHQ7Y29weSB0b2Rpcj0ic29tZS1kaXIiJmd0OwotICAgICZsdDt0YXJmaWxlc2V0IGluY2x1ZGVzPSJsaWIvKioiJmd0OwotICAgICAgJmx0O2J6aXAycmVzb3VyY2UmZ3Q7Ci0gICAgICAgICZsdDt1cmwgdXJsPSJodHRwOi8vZXhhbXBsZS5vcmcvZGlzdC9zb21lLWFyY2hpdmUudGFyLmJ6MiIvJmd0OwotICAgICAgJmx0Oy9iemlwMnJlc291cmNlJmd0OwotICAgICZsdDsvdGFyZmlsZXNldCZndDsKLSAgJmx0Oy9jb3B5Jmd0OwotICAgICAgPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0O2NvcHkgdG9kaXI9InNvbWUtZGlyIiZndDsKKyAmbHQ7dGFyZmlsZXNldCBpbmNsdWRlcz0ibGliLyoqIiZndDsKKyAgICZsdDtiemlwMnJlc291cmNlJmd0OworICAgICAmbHQ7dXJsIHVybD0iaHR0cHM6Ly9leGFtcGxlLm9yZy9kaXN0L3NvbWUtYXJjaGl2ZS50YXIuYnoyIi8mZ3Q7CisgICAmbHQ7L2J6aXAycmVzb3VyY2UmZ3Q7CisgJmx0Oy90YXJmaWxlc2V0Jmd0OworJmx0Oy9jb3B5Jmd0OzwvcHJlPgogCi08cD5kb3dubG9hZHMgdGhlIGFyY2hpdmUgc29tZS1hcmNoaXZlLnRhci5iejIsIHVuY29tcHJlc3NlcyBhbmQKLWV4dHJhY3RzIGl0IG9uIHRoZSBmbHksIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGxpYiBkaXJlY3RvcnkgaW50bwotc29tZS1kaXIgYW5kIGRpc2NhcmRzIHRoZSByZXN0IG9mIHRoZSBhcmNoaXZlLiAgRmlsZSB0aW1lc3RhbXBzIHdpbGwKLWJlIGNvbXBhcmVkIGJldHdlZW4gdGhlIGFyY2hpdmUncyBlbnRyaWVzIGFuZCBmaWxlcyBpbnNpZGUgdGhlIHRhcmdldAotZGlyZWN0b3J5LCBubyBmaWxlcyBnZXQgb3ZlcndyaXR0ZW4gdW5sZXNzIHRoZXkgYXJlIG91dC1vZi1kYXRlLjwvcD4KLQorPHA+ZG93bmxvYWRzIHRoZSBhcmNoaXZlIDxzYW1wPnNvbWUtYXJjaGl2ZS50YXIuYnoyPC9zYW1wPiwgdW5jb21wcmVzc2VzIGFuZCBleHRyYWN0cyBpdCBvbiB0aGUgZmx5LAorY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgPHNhbXA+bGliPC9zYW1wPiBkaXJlY3RvcnkgaW50byA8c2FtcD5zb21lLWRpcjwvc2FtcD4gYW5kIGRpc2NhcmRzIHRoZQorcmVzdCBvZiB0aGUgYXJjaGl2ZS4gIEZpbGUgdGltZXN0YW1wcyB3aWxsIGJlIGNvbXBhcmVkIGJldHdlZW4gdGhlIGFyY2hpdmUncyBlbnRyaWVzIGFuZCBmaWxlcworaW5zaWRlIHRoZSB0YXJnZXQgZGlyZWN0b3J5LCBubyBmaWxlcyBnZXQgb3ZlcndyaXR0ZW4gdW5sZXNzIHRoZXkgYXJlIG91dC1vZi1kYXRlLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL1R5cGVzL3htbGNhdGFsb2cuaHRtbCBiL21hbnVhbC9UeXBlcy94bWxjYXRhbG9nLmh0bWwKaW5kZXggYTBkZGFmYy4uNDY1MGM4YSAxMDA2NDQKLS0tIGEvbWFudWFsL1R5cGVzL3htbGNhdGFsb2cuaHRtbAorKysgYi9tYW51YWwvVHlwZXMveG1sY2F0YWxvZy5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjkzICsxNSwyMjggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlhNTENhdGFsb2cgVHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0iWE1MQ2F0YWxvZyI+WE1MQ2F0YWxvZzwvYT48L2gyPgorPGgyIGlkPSJYTUxDYXRhbG9nIj5YTUxDYXRhbG9nPC9oMj4KIAotPHA+QW4gWE1MQ2F0YWxvZyBpcyBhIGNhdGFsb2cgb2YgcHVibGljIHJlc291cmNlcyBzdWNoIGFzIERURHMgb3IKLWVudGl0aWVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gYW4gWE1MIGRvY3VtZW50LiAgQ2F0YWxvZ3MgYXJlCi10eXBpY2FsbHkgdXNlZCB0byBtYWtlIHdlYiByZWZlcmVuY2VzIHRvIHJlc291cmNlcyBwb2ludCB0byBhIGxvY2FsbHkKKzxwPkFuIFhNTENhdGFsb2cgaXMgYSBjYXRhbG9nIG9mIHB1YmxpYyByZXNvdXJjZXMgc3VjaCBhcyBEVERzIG9yIGVudGl0aWVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gYW4KK1hNTCBkb2N1bWVudC4gIENhdGFsb2dzIGFyZSB0eXBpY2FsbHkgdXNlZCB0byBtYWtlIHdlYiByZWZlcmVuY2VzIHRvIHJlc291cmNlcyBwb2ludCB0byBhIGxvY2FsbHkKIGNhY2hlZCBjb3B5IG9mIHRoZSByZXNvdXJjZS48L3A+CiAKLTxwPlRoaXMgYWxsb3dzIHRoZSBYTUwgUGFyc2VyLCBYU0xUIFByb2Nlc3NvciBvciBvdGhlciBjb25zdW1lciBvZiBYTUwgCi1kb2N1bWVudHMKLXRvIGVmZmljaWVudGx5IGFsbG93IGEgbG9jYWwgc3Vic3RpdHV0aW9uIGZvciBhIHJlc291cmNlIGF2YWlsYWJsZSBvbiB0aGUgCi13ZWIuCi08L3A+Ci08cD48Yj5Ob3RlOjwvYj4gVGhpcyB0YXNrIDxlbT51c2VzLCBidXQgZG9lcyBub3QgZGVwZW5kIG9uPC9lbT4gZXh0ZXJuYWwKLWxpYnJhcmllcyBub3QgaW5jbHVkZWQgaW4gdGhlIEFwYWNoZSBBbnQgZGlzdHJpYnV0aW9uLiAgU2VlIDxhCi0gIGhyZWY9Ii4uL2luc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUKLWluZm9ybWF0aW9uLjwvcD4KLTxwPlRoaXMgZGF0YSB0eXBlIHByb3ZpZGVzIGEgY2F0YWxvZyBvZiByZXNvdXJjZSBsb2NhdGlvbnMgYmFzZWQKLW9uIHRoZSA8YQotaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KLU9BU0lTICJPcGVuIENhdGFsb2ciIHN0YW5kYXJkPC9hPi4gIFRoZSBjYXRhbG9nIGVudHJpZXMgYXJlIHVzZWQKLWJvdGggZm9yIEVudGl0eSByZXNvbHV0aW9uIGFuZCBVUkkgcmVzb2x1dGlvbiwgaW4gYWNjb3JkYW5jZSB3aXRoCi10aGUgPGNvZGU+b3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI8L2NvZGU+IGFuZCA8Y29kZT4KLWphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI8L2NvZGU+IGludGVyZmFjZXMgYXMgZGVmaW5lZAotaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vamF4cC5kZXYuamF2YS5uZXQvIj5KYXZhIEFQSSBmb3IgWE1MCi1Qcm9jZXNzaW5nIChKQVhQKSBTcGVjaWZpY2F0aW9uPC9hPi48L3A+Ci08cD5Gb3IgZXhhbXBsZSwgaW4gYSA8Y29kZT53ZWIueG1sPC9jb2RlPiBmaWxlLCB0aGUgRFREIGlzIHJlZmVyZW5jZWQgYXM6Cis8cD5UaGlzIGFsbG93cyB0aGUgWE1MIFBhcnNlciwgWFNMVCBQcm9jZXNzb3Igb3Igb3RoZXIgY29uc3VtZXIgb2YgWE1MIGRvY3VtZW50cyB0byBlZmZpY2llbnRseQorYWxsb3cgYSBsb2NhbCBzdWJzdGl0dXRpb24gZm9yIGEgcmVzb3VyY2UgYXZhaWxhYmxlIG9uIHRoZSB3ZWIuPC9wPgorPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGlzIHRhc2sgPGVtPnVzZXMsIGJ1dCBkb2VzIG5vdCBkZXBlbmQgb248L2VtPiBleHRlcm5hbCBsaWJyYXJpZXMgbm90CitpbmNsdWRlZCBpbiB0aGUgQXBhY2hlIEFudCBkaXN0cmlidXRpb24uICBTZWUgPGEgaHJlZj0iLi4vaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkKK0RlcGVuZGVuY2llczwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgorPHA+VGhpcyBkYXRhIHR5cGUgcHJvdmlkZXMgYSBjYXRhbG9nIG9mIHJlc291cmNlIGxvY2F0aW9ucyBiYXNlZCBvbgordGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE0ODA5L3htbC1jYXRhbG9ncy5odG1sIgordGFyZ2V0PSJfdG9wIj5PQVNJUyBYTUwgQ2F0YWxvZyBzdGFuZGFyZDwvYT4uICBUaGUgY2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkIGJvdGggZm9yIEVudGl0eQorcmVzb2x1dGlvbiBhbmQgVVJJIHJlc29sdXRpb24sIGluIGFjY29yZGFuY2Ugd2l0aAordGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjwvY29kZT4KK2FuZCA8Y29kZSBjbGFzcz0iY29kZSI+amF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlcjwvY29kZT4gaW50ZXJmYWNlcyBhcyBkZWZpbmVkIGluCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb3dubG9hZC5vcmFjbGUuY29tL290bi1wdWIvamNwL2pheHAtMV82LW1yZWwzLXNwZWMvSkFYUDFfNi1GaW5hbFNwZWMucGRmIgordGFyZ2V0PSJfdG9wIj5KYXZhIEFQSSBmb3IgWE1MIFByb2Nlc3NpbmcgKEpBWFApIFNwZWNpZmljYXRpb248L2E+LjwvcD4KKzxwPkZvciBleGFtcGxlLCBpbiBhIDxjb2RlPndlYi54bWw8L2NvZGU+IGZpbGUsIHRoZSBEVEQgaXMgcmVmZXJlbmNlZCBhczo8L3A+CiA8cHJlPgogJmx0OyFET0NUWVBFIHdlYi1hcHAgUFVCTElDICZxdW90Oy0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiZxdW90OwotICAmcXVvdDtodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzJfMi5kdGQmcXVvdDsmZ3Q7Ci08L3ByZT4KLVRoZSBYTUwgcHJvY2Vzc29yLCB3aXRob3V0IFhNTENhdGFsb2cgc3VwcG9ydCwgd291bGQgbmVlZCB0byByZXRyaWV2ZSB0aGUgCi1EVEQgZnJvbQotdGhlIFVSTCBzcGVjaWZpZWQgd2hlbmV2ZXIgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIHJlcXVpcmVkLgotPC9wPgotPHA+VGhpcyBjYW4gYmUgdmVyeSB0aW1lIGNvbnN1bWluZyBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsCi1lc3BlY2lhbGx5IHdoZXJlIG5ldHdvcmsgdGhyb3VnaHB1dCBpcyBsaW1pdGVkLiAgQWx0ZXJuYXRpdmVseSwgeW91Ci1jYW4gZG8gdGhlIGZvbGxvd2luZzoKKyAgJnF1b3Q7aHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkJnF1b3Q7Jmd0OzwvcHJlPgorPHA+VGhlIFhNTCBwcm9jZXNzb3IsIHdpdGhvdXQgWE1MQ2F0YWxvZyBzdXBwb3J0LCB3b3VsZCBuZWVkIHRvIHJldHJpZXZlIHRoZSBEVEQgZnJvbSB0aGUgVVJMCitzcGVjaWZpZWQgd2hlbmV2ZXIgdmFsaWRhdGlvbiBvZiB0aGUgZG9jdW1lbnQgd2FzIHJlcXVpcmVkLjwvcD4KKzxwPlRoaXMgY2FuIGJlIHZlcnkgdGltZSBjb25zdW1pbmcgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLCBlc3BlY2lhbGx5IHdoZXJlIG5ldHdvcmsgdGhyb3VnaHB1dAoraXMgbGltaXRlZC4gIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzo8L3A+CiA8b2w+Ci08bGk+Q29weSA8Y29kZT53ZWItYXBwXzJfMi5kdGQ8L2NvZGU+IG9udG8geW91ciBsb2NhbCBkaXNrIHNvbWV3aGVyZSAoZWl0aGVyIGluIHRoZQotZmlsZXN5c3RlbSBvciBldmVuIGVtYmVkZGVkIGluc2lkZSBhIGphciBvciB6aXAgZmlsZSBvbiB0aGUgY2xhc3NwYXRoKS48L2xpPgotPGxpPkNyZWF0ZSBhbiA8Y29kZT4mbHQ7eG1sY2F0YWxvZyZndDs8L2NvZGU+IHdpdGggYSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gCi1lbGVtZW50IHdob3NlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgcG9pbnRzIHRvIHRoZSBmaWxlLjwvbGk+Ci08bGk+U3VjY2VzcyEgVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3cgdXNlIHRoZSBsb2NhbCBjb3B5IGluc3RlYWQgb2YgY2FsbGluZyBvdXQKLXRvIHRoZSBpbnRlcm5ldC48L2xpPgorPGxpPkNvcHkgPHNhbXA+d2ViLWFwcF8yXzIuZHRkPC9zYW1wPiBvbnRvIHlvdXIgbG9jYWwgZGlzayBzb21ld2hlcmUgKGVpdGhlciBpbiB0aGUgZmlsZXN5c3RlbQorb3IgZXZlbiBlbWJlZGRlZCBpbnNpZGUgYSBqYXIgb3IgemlwIGZpbGUgb24gdGhlIGNsYXNzcGF0aCkuPC9saT4KKzxsaT5DcmVhdGUgYW4gPGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPiB3aXRoIGEgPGNvZGU+Jmx0O2R0ZCZndDs8L2NvZGU+IGVsZW1lbnQKK3dob3NlIDx2YXI+bG9jYXRpb248L3Zhcj4gYXR0cmlidXRlIHBvaW50cyB0byB0aGUgZmlsZS48L2xpPgorPGxpPlN1Y2Nlc3MhIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm93IHVzZSB0aGUgbG9jYWwgY29weSBpbnN0ZWFkIG9mIGNhbGxpbmcgb3V0IHRvIHRoZQoraW50ZXJuZXQuPC9saT4KIDwvb2w+Ci08L3A+Ci08cD5YTUxDYXRhbG9ncyBjYW4gYXBwZWFyIGluc2lkZSB0YXNrcwotdGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZSBvciBhdCB0aGUgc2FtZSBsZXZlbCBhcyA8Y29kZT50YXJnZXQ8L2NvZGU+Ci0tIGkuZS4sIGFzIGNoaWxkcmVuIG9mIDxjb2RlPnByb2plY3Q8L2NvZGU+IGZvciByZXVzZSBhY3Jvc3MgZGlmZmVyZW50IAotdGFza3MsCi1lLmcuIFhNTCBWYWxpZGF0aW9uIGFuZCBYU0xUIFRyYW5zZm9ybWF0aW9uLiAgVGhlIFhNTCBWYWxpZGF0ZSB0YXNrCi11c2VzIFhNTENhdGFsb2dzIGZvciBlbnRpdHkgcmVzb2x1dGlvbi4gIFRoZSBYU0xUIFRyYW5zZm9ybWF0aW9uCi10YXNrIHVzZXMgWE1MQ2F0YWxvZ3MgZm9yIGJvdGggZW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+Ci08cD5YTUxDYXRhbG9ncyBhcmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIHJlZmVyZW5jZSB0byBhbm90aGVyCi1YTUxDYXRhbG9nLCBkZWZpbmVkIHByZXZpb3VzbHkgaW4gYSBidWlsZCBmaWxlLCBvciBhcyBhIGxpc3Qgb2YKLTxjb2RlPmR0ZDwvY29kZT4gb3IgPGNvZGU+ZW50aXR5PC9jb2RlPiBsb2NhdGlvbnMuICBJbiBhZGRpdGlvbiwKLWV4dGVybmFsIGNhdGFsb2cgZmlsZXMgbWF5IGJlIHNwZWNpZmllZCBpbiBhIG5lc3RlZCA8Y29kZT5jYXRhbG9ncGF0aDwvY29kZT4gLAotYnV0IHRoZXkgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyB0aGUgcmVzb2x2ZXIgbGlicmFyeSBmcm9tCi14bWwtY29tbW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBjbGFzc3BhdGguICA8Yj5EdWUgdG8gYmFja3dhcmRzCi1pbmNvbXBhdGlibGUgY2hhbmdlcyBpbiB0aGUgcmVzb2x2ZXIgY29kZSBhZnRlciB0aGUgcmVsZWFzZSBvZgotcmVzb2x2ZXIgMS4wLCBBbnQgd2lsbCBub3Qgc3VwcG9ydCByZXNvbHZlci5qYXIgaW4gdmVyc2lvbiAxLjAgLSB3ZQotZXhwZWN0IGEgcmVzb2x2ZXIgcmVsZWFzZSAxLjEgdG8gaGFwcGVuIGJlZm9yZSBBbnQgMS42IGdldHMKLXJlbGVhc2VkLjwvYj4gIEEgc2VwYXJhdGUgY2xhc3NwYXRoIGZvciBlbnRpdHkgcmVzb2x1dGlvbiBtYXkgYmUKLXNwZWNpZmllZCBpbmxpbmUgdmlhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnRzOyBvdGhlcndpc2UKKzxwPlhNTENhdGFsb2dzIGNhbiBhcHBlYXIgaW5zaWRlIHRhc2tzIHRoYXQgc3VwcG9ydCB0aGlzIGZlYXR1cmUgb3IgYXQgdGhlIHNhbWUgbGV2ZWwKK2FzIDxjb2RlPnRhcmdldDwvY29kZT4mbWRhc2g7aS5lLiwgYXMgY2hpbGRyZW4gb2YgPGNvZGU+cHJvamVjdDwvY29kZT4gZm9yIHJldXNlIGFjcm9zcworZGlmZmVyZW50IHRhc2tzLCBlLmcuIFhNTCBWYWxpZGF0aW9uIGFuZCBYU0xUIFRyYW5zZm9ybWF0aW9uLiAgVGhlIFhNTCBWYWxpZGF0ZSB0YXNrIHVzZXMKK1hNTENhdGFsb2dzIGZvciBlbnRpdHkgcmVzb2x1dGlvbi4gIFRoZSBYU0xUIFRyYW5zZm9ybWF0aW9uIHRhc2sgdXNlcyBYTUxDYXRhbG9ncyBmb3IgYm90aAorZW50aXR5IGFuZCBVUkkgcmVzb2x1dGlvbi48L3A+Cis8cD5YTUxDYXRhbG9ncyBhcmUgc3BlY2lmaWVkIGFzIGVpdGhlciBhIHJlZmVyZW5jZSB0byBhbm90aGVyIFhNTENhdGFsb2csIGRlZmluZWQgcHJldmlvdXNseSBpbgorYSBidWlsZCBmaWxlLCBvciBhcyBhIGxpc3Qgb2YgPGNvZGU+ZHRkPC9jb2RlPiBvciA8Y29kZT5lbnRpdHk8L2NvZGU+IGxvY2F0aW9ucy4gIEluIGFkZGl0aW9uLAorZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkIGluIGEgbmVzdGVkIDxjb2RlPmNhdGFsb2dwYXRoPC9jb2RlPiwgYnV0IHRoZXkgd2lsbCBiZQoraWdub3JlZCB1bmxlc3MgdGhlIHJlc29sdmVyIGxpYnJhcnkgZnJvbSB4bWwtY29tbW9ucyBpcyBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbQorY2xhc3NwYXRoLiAgPHN0cm9uZz5EdWUgdG8gYmFja3dhcmRzIGluY29tcGF0aWJsZSBjaGFuZ2VzIGluIHRoZSByZXNvbHZlciBjb2RlIGFmdGVyIHRoZSByZWxlYXNlCitvZiByZXNvbHZlciAxLjAsIEFudCBzdXBwb3J0cyBvbmx5IHJlc29sdmVyIDEuMSBvciBsYXRlci48L3N0cm9uZz4gIEEgc2VwYXJhdGUgY2xhc3NwYXRoIGZvcgorZW50aXR5IHJlc29sdXRpb24gbWF5IGJlIHNwZWNpZmllZCBpbmxpbmUgdmlhIG5lc3RlZCA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGVsZW1lbnRzOyBvdGhlcndpc2UKIHRoZSBzeXN0ZW0gY2xhc3NwYXRoIGlzIHVzZWQgZm9yIHRoaXMgYXMgd2VsbC48L3A+Ci08cD5YTUxDYXRhbG9ncyBjYW4gYWxzbyBiZSBuZXN0ZWQgaW5zaWRlIG90aGVyIFhNTENhdGFsb2dzLiAgRm9yCi1leGFtcGxlLCBhICJzdXBlcnNldCIgWE1MQ2F0YWxvZyBjb3VsZCBiZSBtYWRlIGJ5IGluY2x1ZGluZyBzZXZlcmFsCi1uZXN0ZWQgWE1MQ2F0YWxvZ3MgdGhhdCByZWZlcnJlZCB0byBvdGhlciwgcHJldmlvdXNseSBkZWZpbmVkCi1YTUxDYXRhbG9ncy48L3A+Ci08cD5SZXNvdXJjZSBsb2NhdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgaW4tbGluZSBvciBpbgotZXh0ZXJuYWwgY2F0YWxvZyBmaWxlKHMpLCBvciBib3RoLiAgSW4gb3JkZXIgdG8gdXNlIGFuIGV4dGVybmFsCi1jYXRhbG9nIGZpbGUsIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5ICgicmVzb2x2ZXIuamFyIikKLW11c3QgYmUgaW4geW91ciBwYXRoLiAgRXh0ZXJuYWwgY2F0YWxvZyBmaWxlcyBtYXkgYmUgZWl0aGVyIDxhCi1ocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvYmFja2dyb3VuZC85NDAxLmh0bWwiPgotcGxhaW4gdGV4dCBmb3JtYXQ8L2E+IG9yIDxhCi1ocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KLVhNTCBmb3JtYXQ8L2E+LiAgSWYgdGhlIHhtbC1jb21tb25zIHJlc29sdmVyIGxpYnJhcnkgaXMgbm90IGZvdW5kIGluIHRoZQotY2xhc3NwYXRoLCBleHRlcm5hbCBjYXRhbG9nIGZpbGVzLCBzcGVjaWZpZWQgaW4gPGNvZGU+Y2F0YWxvZ3BhdGg8L2NvZGU+LCAKLXdpbGwgYmUgaWdub3JlZCBhbmQgYSB3YXJuaW5nCi13aWxsIGJlIGxvZ2dlZC4gIEluIHRoaXMgY2FzZSwgaG93ZXZlciwgcHJvY2Vzc2luZyBvZiBpbmxpbmUgZW50cmllcyB3aWxsCi1wcm9jZWVkIG5vcm1hbGx5LjwvcD4KLTxwPkN1cnJlbnRseSwgb25seSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gYW5kCi08Y29kZT4mbHQ7ZW50aXR5Jmd0OzwvY29kZT4gZWxlbWVudHMgbWF5IGJlIHNwZWNpZmllZCBpbmxpbmU7IHRoZXNlCi1yb3VnaGx5IGNvcnJlc3BvbmQgdG8gT0FTSVMgY2F0YWxvZyBlbnRyeSB0eXBlcyA8Y29kZT5QVUJMSUM8L2NvZGU+IGFuZAotPGNvZGU+VVJJPC9jb2RlPiByZXNwZWN0aXZlbHkuICBCeSBjb250cmFzdCwgZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcwotbWF5IHVzZSBhbnkgb2YgdGhlIGVudHJ5IHR5cGVzIGRlZmluZWQgaW4gdGhlIAotPGEgaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KLStPQVNJUyBzcGVjaWZpY2F0aW9uPC9hPi48L3A+Ci08aDM+PGEgbmFtZT0iUmVzb2x2ZXJBbGdvcml0aG0iPkVudGl0eS9EVEQvVVJJIFJlc29sdXRpb24gQWxnb3JpdGhtPC9hPjwvaDM+Ci0KLVdoZW4gYW4gZW50aXR5LCBEVEQsIG9yIFVSSSBpcyBsb29rZWQgdXAgYnkgdGhlIFhNTCBwcm9jZXNzb3IsIHRoZQotWE1MQ2F0YWxvZyBzZWFyY2hlcyBpdHMgbGlzdCBvZiBlbnRyaWVzIHRvIHNlZSBpZiBhbnkgbWF0Y2guICBUaGF0IGlzLAotaXQgYXR0ZW1wdHMgdG8gbWF0Y2ggdGhlIDxjb2RlPnB1YmxpY0lkPC9jb2RlPiBhdHRyaWJ1dGUgb2YgZWFjaCBlbnRyeQotd2l0aCB0aGUgUHVibGljSUQgb3IgVVJJIG9mIHRoZSBlbnRpdHkgdG8gYmUgcmVzb2x2ZWQuICBBc3N1bWluZyBhCi1tYXRjaGluZyBlbnRyeSBpcyBmb3VuZCwgWE1MQ2F0YWxvZyB0aGVuIGV4ZWN1dGVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6Cis8cD5YTUxDYXRhbG9ncyBjYW4gYWxzbyBiZSBuZXN0ZWQgaW5zaWRlIG90aGVyIFhNTENhdGFsb2dzLiAgRm9yIGV4YW1wbGUsIGEgInN1cGVyc2V0IgorWE1MQ2F0YWxvZyBjb3VsZCBiZSBtYWRlIGJ5IGluY2x1ZGluZyBzZXZlcmFsIG5lc3RlZCBYTUxDYXRhbG9ncyB0aGF0IHJlZmVycmVkIHRvIG90aGVyLAorcHJldmlvdXNseSBkZWZpbmVkIFhNTENhdGFsb2dzLjwvcD4KKzxwPlJlc291cmNlIGxvY2F0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBpbi1saW5lIG9yIGluIGV4dGVybmFsIGNhdGFsb2cgZmlsZShzKSwgb3IgYm90aC4gIEluCitvcmRlciB0byB1c2UgYW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlLCB0aGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbGlicmFyeSAoPHNhbXA+cmVzb2x2ZXIuamFyPC9zYW1wPikKK211c3QgYmUgaW4geW91ciBwYXRoLiAgRXh0ZXJuYWwgY2F0YWxvZyBmaWxlcyBtYXkgYmUKK2VpdGhlciA8YSBocmVmPSJodHRwczovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIiB0YXJnZXQ9Il90b3AiPnBsYWluCit0ZXh0IGZvcm1hdDwvYT4gb3IgPGEgaHJlZj0iaHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy0yMDAxLTA4LTA2Lmh0bWwiCit0YXJnZXQ9Il90b3AiPlhNTCBmb3JtYXQ8L2E+LiAgSWYgdGhlIHhtbC1jb21tb25zIHJlc29sdmVyIGxpYnJhcnkgaXMgbm90IGZvdW5kIGluIHRoZSBjbGFzc3BhdGgsCitleHRlcm5hbCBjYXRhbG9nIGZpbGVzLCBzcGVjaWZpZWQgaW4gPGNvZGU+Y2F0YWxvZ3BhdGg8L2NvZGU+LCB3aWxsIGJlIGlnbm9yZWQgYW5kIGEgd2FybmluZyB3aWxsIGJlCitsb2dnZWQuICBJbiB0aGlzIGNhc2UsIGhvd2V2ZXIsIHByb2Nlc3Npbmcgb2YgaW5saW5lIGVudHJpZXMgd2lsbCBwcm9jZWVkIG5vcm1hbGx5LjwvcD4KKzxwPkN1cnJlbnRseSwgb25seSA8Y29kZT4mbHQ7ZHRkJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtlbnRpdHkmZ3Q7PC9jb2RlPiBlbGVtZW50cyBtYXkgYmUKK3NwZWNpZmllZCBpbmxpbmU7IHRoZXNlIHJvdWdobHkgY29ycmVzcG9uZCB0byBPQVNJUyBjYXRhbG9nIGVudHJ5IHR5cGVzIDxjb2RlPlBVQkxJQzwvY29kZT4KK2FuZCA8Y29kZT5VUkk8L2NvZGU+IHJlc3BlY3RpdmVseS4gIEJ5IGNvbnRyYXN0LCBleHRlcm5hbCBjYXRhbG9nIGZpbGVzIG1heSB1c2UgYW55IG9mIHRoZSBlbnRyeQordHlwZXMgZGVmaW5lZCBpbgordGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE0ODA5L3htbC1jYXRhbG9ncy5odG1sIgordGFyZ2V0PSJfdG9wIj5PQVNJUyBzcGVjaWZpY2F0aW9uPC9hPi48L3A+Cis8aDMgaWQ9IlJlc29sdmVyQWxnb3JpdGhtIj5FbnRpdHkvRFREL1VSSSByZXNvbHV0aW9uIGFsZ29yaXRobTwvaDM+Cis8cD5XaGVuIGFuIGVudGl0eSwgRFRELCBvciBVUkkgaXMgbG9va2VkIHVwIGJ5IHRoZSBYTUwgcHJvY2Vzc29yLCB0aGUgWE1MQ2F0YWxvZyBzZWFyY2hlcyBpdHMgbGlzdAorb2YgZW50cmllcyB0byBzZWUgaWYgYW55IG1hdGNoLiAgVGhhdCBpcywgaXQgYXR0ZW1wdHMgdG8gbWF0Y2ggdGhlIDx2YXI+cHVibGljSWQ8L3Zhcj4gYXR0cmlidXRlIG9mCitlYWNoIGVudHJ5IHdpdGggdGhlIFB1YmxpY0lEIG9yIFVSSSBvZiB0aGUgZW50aXR5IHRvIGJlIHJlc29sdmVkLiAgQXNzdW1pbmcgYSBtYXRjaGluZyBlbnRyeSBpcworZm91bmQsIFhNTENhdGFsb2cgdGhlbiBleGVjdXRlcyB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KIAogPGg0PjEuIEZpbGVzeXN0ZW0gbG9va3VwPC9oND4KIAotPHA+VGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBpcyBmaXJzdCBsb29rZWQgdXAgaW4gdGhlIGZpbGVzeXN0ZW0uICBJZgotdGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBpcyBhIHJlbGF0aXZlIHBhdGgsIHRoZSBhbnQgcHJvamVjdCBiYXNlZGlyCi1hdHRyaWJ1dGUgaXMgdXNlZCBhcyB0aGUgYmFzZSBkaXJlY3RvcnkuICBJZiB0aGUgPGNvZGU+bG9jYXRpb248L2NvZGU+Ci1zcGVjaWZpZXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQgaXMgdXNlZCBhcyBpcy4gIE9uY2Ugd2UgaGF2ZSBhbgotYWJzb2x1dGUgcGF0aCBpbiBoYW5kLCB3ZSBjaGVjayB0byBzZWUgaWYgYSB2YWxpZCBhbmQgcmVhZGFibGUgZmlsZQotZXhpc3RzIGF0IHRoYXQgcGF0aC4gIElmIHNvLCB3ZSBhcmUgZG9uZS4gIElmIG5vdCwgd2UgcHJvY2VlZCB0byB0aGUKLW5leHQgc3RlcC48L3A+Cis8cD5UaGUgPHZhcj5sb2NhdGlvbjwvdmFyPiBpcyBmaXJzdCBsb29rZWQgdXAgaW4gdGhlIGZpbGVzeXN0ZW0uICBJZiB0aGUgPHZhcj5sb2NhdGlvbjwvdmFyPiBpcyBhCityZWxhdGl2ZSBwYXRoLCB0aGUgQW50IHByb2plY3QgPHZhcj5iYXNlZGlyPC92YXI+IGF0dHJpYnV0ZSBpcyB1c2VkIGFzIHRoZSBiYXNlIGRpcmVjdG9yeS4gIElmCit0aGUgPHZhcj5sb2NhdGlvbjwvdmFyPiBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgcGF0aCwgaXQgaXMgdXNlZCBhcyBpcy4gIE9uY2Ugd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoCitpbiBoYW5kLCB3ZSBjaGVjayB0byBzZWUgaWYgYSB2YWxpZCBhbmQgcmVhZGFibGUgZmlsZSBleGlzdHMgYXQgdGhhdCBwYXRoLiAgSWYgc28sIHdlIGFyZSBkb25lLiAgSWYKK25vdCwgd2UgcHJvY2VlZCB0byB0aGUgbmV4dCBzdGVwLjwvcD4KIAogPGg0PjIuIENsYXNzcGF0aCBsb29rdXA8L2g0PgogCi08cD5UaGUgPGNvZGU+bG9jYXRpb248L2NvZGU+IGlzIG5leHQgbG9va2VkIHVwIGluIHRoZSBjbGFzc3BhdGguCi1SZWNhbGwgdGhhdCBqYXIgZmlsZXMgYXJlIG1lcmVseSBmYW5jeSB6aXAgZmlsZXMuICBGb3IgY2xhc3NwYXRoCi1sb29rdXAsIHRoZSA8Y29kZT5sb2NhdGlvbjwvY29kZT4gaXMgdXNlZCBhcyBpcyAobm8gYmFzZSBpcwotcHJlcGVuZGVkKS4gIFdlIHVzZSBhIENsYXNzbG9hZGVyIHRvIGF0dGVtcHQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgZnJvbQotdGhlIGNsYXNzcGF0aC4gIEZvciBleGFtcGxlLCBpZiBoZWxsby5qYXIgaXMgaW4gdGhlIGNsYXNzcGF0aCBhbmQgaXQKLWNvbnRhaW5zIDxjb2RlPmZvby9iYXIvYmxhdC5kdGQ8L2NvZGU+IGl0IHdpbGwgcmVzb2x2ZSBhbiBlbnRpdHkgd2hvc2UKLTxjb2RlPmxvY2F0aW9uPC9jb2RlPiBpcyA8Y29kZT5mb28vYmFyL2JsYXQuZHRkPC9jb2RlPi4gIE9mIGNvdXJzZSwgaXQKLXdpbGwgPGVtPm5vdDwvZW0+IHJlc29sdmUgYW4gZW50aXR5IHdob3NlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBpcwotPGNvZGU+YmxhdC5kdGQ8L2NvZGU+LgotCis8cD5UaGUgPHZhcj5sb2NhdGlvbjwvdmFyPiBpcyBuZXh0IGxvb2tlZCB1cCBpbiB0aGUgY2xhc3NwYXRoLiAgUmVjYWxsIHRoYXQgamFyIGZpbGVzIGFyZSBtZXJlbHkKK2ZhbmN5IHppcCBmaWxlcy4gIEZvciBjbGFzc3BhdGggbG9va3VwLCB0aGUgPHZhcj5sb2NhdGlvbjwvdmFyPiBpcyB1c2VkIGFzIGlzIChubyBiYXNlIGlzCitwcmVwZW5kZWQpLiAgV2UgdXNlIGEgQ2xhc3Nsb2FkZXIgdG8gYXR0ZW1wdCB0byBsb2FkIHRoZSByZXNvdXJjZSBmcm9tIHRoZSBjbGFzc3BhdGguICBGb3IgZXhhbXBsZSwKK2lmIDxzYW1wPmhlbGxvLmphcjwvc2FtcD4gaXMgaW4gdGhlIGNsYXNzcGF0aCBhbmQgaXQgY29udGFpbnMgPHNhbXA+Zm9vL2Jhci9ibGF0LmR0ZDwvc2FtcD4gaXQgd2lsbAorcmVzb2x2ZSBhbiBlbnRpdHkgd2hvc2UgPHZhcj5sb2NhdGlvbjwvdmFyPiBpcyA8c2FtcD5mb28vYmFyL2JsYXQuZHRkPC9zYW1wPi4gIE9mIGNvdXJzZSwgaXQKK3dpbGwgPGVtPm5vdDwvZW0+IHJlc29sdmUgYW4gZW50aXR5IHdob3NlIDx2YXI+bG9jYXRpb248L3Zhcj4gaXMgPGNvZGU+YmxhdC5kdGQ8L2NvZGU+LjwvcD4KIAogPGg0PjNhLiBBcGFjaGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbG9va3VwPC9oND4KIAotPHA+V2hhdCBoYXBwZW5zIG5leHQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZXNvbHZlciBsaWJyYXJ5IGZyb20KLXhtbC1jb21tb25zIGlzIGF2YWlsYWJsZSBvbiB0aGUgY2xhc3NwYXRoLiAgSWYgc28sIHdlIGRlZmVyIGFsbAotZnVydGhlciBhdHRlbXB0cyBhdCByZXNvbHZpbmcgdG8gaXQuICBUaGUgcmVzb2x2ZXIgbGlicmFyeSBzdXBwb3J0cwotZXh0cmVtZWx5IHNvcGhpc3RpY2F0ZWQgZnVuY3Rpb25hbGl0eSBsaWtlIFVSTCByZXdyaXRpbmcgYW5kIHNvIG9uLAotd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IG1ha2luZyB0aGUgYXBwcm9wcmlhdGUgZW50cmllcyBpbiBleHRlcm5hbAotY2F0YWxvZyBmaWxlcyAoWE1MQ2F0YWxvZyBkb2VzIG5vdCB5ZXQgcHJvdmlkZSBpbmxpbmUgc3VwcG9ydCBmb3IgYWxsCi1vZiB0aGUgZW50cmllcyBkZWZpbmVkIGluIHRoZSA8YQotaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj5PQVNJUwotc3RhbmRhcmQ8L2E+KS48L3A+Cis8cD5XaGF0IGhhcHBlbnMgbmV4dCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHJlc29sdmVyIGxpYnJhcnkgZnJvbSB4bWwtY29tbW9ucyBpcyBhdmFpbGFibGUgb24gdGhlCitjbGFzc3BhdGguICBJZiBzbywgd2UgZGVmZXIgYWxsIGZ1cnRoZXIgYXR0ZW1wdHMgYXQgcmVzb2x2aW5nIHRvIGl0LiAgVGhlIHJlc29sdmVyIGxpYnJhcnkgc3VwcG9ydHMKK2V4dHJlbWVseSBzb3BoaXN0aWNhdGVkIGZ1bmN0aW9uYWxpdHkgbGlrZSBVUkwgcmV3cml0aW5nIGFuZCBzbyBvbiwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IG1ha2luZwordGhlIGFwcHJvcHJpYXRlIGVudHJpZXMgaW4gZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcyAoWE1MQ2F0YWxvZyBkb2VzIG5vdCB5ZXQgcHJvdmlkZSBpbmxpbmUgc3VwcG9ydAorZm9yIGFsbCBvZiB0aGUgZW50cmllcyBkZWZpbmVkIGluCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9kb3dubG9hZC5waHAvMTQ4MDkveG1sLWNhdGFsb2dzLmh0bWwiCit0YXJnZXQ9Il90b3AiPk9BU0lTIHN0YW5kYXJkPC9hPikuPC9wPgogCiA8aDQ+My4gVVJMLXNwYWNlIGxvb2t1cDwvaDQ+CiAKLTxwPkZpbmFsbHksIHdlIGF0dGVtcHQgdG8gbWFrZSBhIFVSTCBvdXQgb2YgdGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPi4KLUF0IGZpcnN0IHRoaXMgbWF5IHNlZW0gbGlrZSB0aGlzIHdvdWxkIGRlZmVhdCB0aGUgcHVycG9zZSBvZgotWE1MQ2F0YWxvZ3MgLS0gd2h5IGdvIGJhY2sgb3V0IHRvIHRoZSBpbnRlcm5ldD8gIEJ1dCBpbiBmYWN0LCB0aGlzIGNhbgotYmUgdXNlZCB0byAoaW4gYSBzZW5zZSkgaW1wbGVtZW50IEhUVFAgcmVkaXJlY3RzLCBzdWJzdGl0dXRpbmcgb25lIFVSTAotZm9yIGFub3RoZXIuICBUaGUgbWFwcGVkLXRvIFVSTCBtaWdodCBhbHNvIGJlIHNlcnZlZCBieSBhIGxvY2FsIHdlYgotc2VydmVyLiAgSWYgdGhlIFVSTCByZXNvbHZlcyB0byBhIHZhbGlkIGFuZCByZWFkYWJsZSByZXNvdXJjZSwgd2UgYXJlCi1kb25lLiAgT3RoZXJ3aXNlLCB3ZSBnaXZlIHVwLiAgSW4gdGhpcyBjYXNlLCB0aGUgWE1MIHByb2Nlc3NvciB3aWxsCi1wZXJmb3JtIGl0cyBub3JtYWwgcmVzb2x1dGlvbiBhbGdvcml0aG0uICBEZXBlbmRpbmcgb24gdGhlIHByb2Nlc3NvcgotY29uZmlndXJhdGlvbiwgZnVydGhlciByZXNvbHV0aW9uIGZhaWx1cmVzIG1heSBvciBtYXkgbm90IHJlc3VsdCBpbgotZmF0YWwgKGkuZS4gYnVpbGQtZW5kaW5nKSBlcnJvcnMuPC9wPgorPHA+RmluYWxseSwgd2UgYXR0ZW1wdCB0byBtYWtlIGEgVVJMIG91dCBvZiB0aGUgPHZhcj5sb2NhdGlvbjwvdmFyPi4gIEF0IGZpcnN0IHRoaXMgbWF5IHNlZW0gbGlrZQordGhpcyB3b3VsZCBkZWZlYXQgdGhlIHB1cnBvc2Ugb2YgWE1MQ2F0YWxvZ3MmbWRhc2g7d2h5IGdvIGJhY2sgb3V0IHRvIHRoZSBpbnRlcm5ldD8gIEJ1dCBpbiBmYWN0LAordGhpcyBjYW4gYmUgdXNlZCB0byAoaW4gYSBzZW5zZSkgaW1wbGVtZW50IEhUVFAgcmVkaXJlY3RzLCBzdWJzdGl0dXRpbmcgb25lIFVSTCBmb3IgYW5vdGhlci4gIFRoZQorbWFwcGVkLXRvIFVSTCBtaWdodCBhbHNvIGJlIHNlcnZlZCBieSBhIGxvY2FsIHdlYiBzZXJ2ZXIuICBJZiB0aGUgVVJMIHJlc29sdmVzIHRvIGEgdmFsaWQgYW5kCityZWFkYWJsZSByZXNvdXJjZSwgd2UgYXJlIGRvbmUuICBPdGhlcndpc2UsIHdlIGdpdmUgdXAuICBJbiB0aGlzIGNhc2UsIHRoZSBYTUwgcHJvY2Vzc29yIHdpbGwKK3BlcmZvcm0gaXRzIG5vcm1hbCByZXNvbHV0aW9uIGFsZ29yaXRobS4gIERlcGVuZGluZyBvbiB0aGUgcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24sIGZ1cnRoZXIKK3Jlc29sdXRpb24gZmFpbHVyZXMgbWF5IG9yIG1heSBub3QgcmVzdWx0IGluIGZhdGFsIChpLmUuIGJ1aWxkLWVuZGluZykgZXJyb3JzLjwvcD4KIAogPGgzPlhNTENhdGFsb2cgYXR0cmlidXRlczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5EZXNjcmlwdGlvbjwvYj48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmEgdW5pcXVlIG5hbWUgZm9yIGFuIFhNTENhdGFsb2csIHVzZWQgZm9yIHJlZmVyZW5jaW5nIAotdGhlCi0gICAgWE1MQ2F0YWxvZydzIGNvbnRlbnRzIGZyb20gYW5vdGhlciBYTUxDYXRhbG9nPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPk5vPC90ZD4KKyAgICA8dGQ+aWQ8L3RkPgorICAgIDx0ZD5hIHVuaXF1ZSBuYW1lIGZvciBhbiBYTUxDYXRhbG9nLCB1c2VkIGZvciByZWZlcmVuY2luZyB0aGUgWE1MQ2F0YWxvZydzIGNvbnRlbnRzIGZyb20KKyAgICBhbm90aGVyIFhNTENhdGFsb2c8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnJlZmlkPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSA8Y29kZT5pZDwvY29kZT4gb2YgYW5vdGhlciBYTUxDYXRhbG9nIHdob3NlIAotY29udGVudHMKLSAgICB5b3Ugd291bGQgbGlrZSB0byBiZSB1c2VkIGZvciB0aGlzIFhNTENhdGFsb2c8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCIgYWxpZ249ImNlbnRlciI+Tm88L3RkPgorICAgIDx0ZD5yZWZpZDwvdGQ+CisgICAgPHRkPnRoZSA8dmFyPmlkPC92YXI+IG9mIGFub3RoZXIgWE1MQ2F0YWxvZyB3aG9zZSBjb250ZW50cyB5b3Ugd291bGQgbGlrZSB0byBiZSB1c2VkIGZvcgorICAgIHRoaXMgWE1MQ2F0YWxvZzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKIDxoMz5YTUxDYXRhbG9nIG5lc3RlZCBlbGVtZW50czwvaDM+CiA8aDQ+ZHRkL2VudGl0eTwvaDQ+Ci08cD5UaGUgPGNvZGU+ZHRkPC9jb2RlPiBhbmQgPGNvZGU+ZW50aXR5PC9jb2RlPiBlbGVtZW50cyB1c2VkIHRvIHNwZWNpZnkKLVhNTENhdGFsb2dzIGFyZSBpZGVudGljYWwgaW4gdGhlaXIgc3RydWN0dXJlPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxwPlRoZSA8Y29kZT5kdGQ8L2NvZGU+IGFuZCA8Y29kZT5lbnRpdHk8L2NvZGU+IGVsZW1lbnRzIHVzZWQgdG8gc3BlY2lmeSBYTUxDYXRhbG9ncyBhcmUKK2lkZW50aWNhbCBpbiB0aGVpciBzdHJ1Y3R1cmU8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHVibGljSWQ8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIHB1YmxpYyBpZGVudGlmaWVyIHVzZWQgd2hlbiBkZWZpbmluZyBhIGR0ZCBvciAKLWVudGl0eSwKLSAgICBlLmcuIDxjb2RlPiZxdW90Oy0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gCi0yLjIvL0VOJnF1b3Q7PC9jb2RlPgotICAgIDwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ZZXM8L3RkPgorICAgIDx0ZD5wdWJsaWNJZDwvdGQ+CisgICAgPHRkPlRoZSBwdWJsaWMgaWRlbnRpZmllciB1c2VkIHdoZW4gZGVmaW5pbmcgYSBkdGQgb3IgZW50aXR5LCBlLmcuCisgICAgPGNvZGU+JnF1b3Q7LS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOJnF1b3Q7PC9jb2RlPjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmxvY2F0aW9uPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBsb2NhdGlvbiBvZiB0aGUgbG9jYWwgcmVwbGFjZW1lbnQgdG8gYmUgdXNlZCBmb3IgCi10aGUgcHVibGljIGlkZW50aWZpZXIgc3BlY2lmaWVkLiBUaGlzIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBmaWxlIG5hbWUsIAotcmVzb3VyY2UgbmFtZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoLCBvciBhIFVSTC4gIFJlbGF0aXZlIHBhdGhzIHdpbGwKLWJlIHJlc29sdmVkIGFjY29yZGluZyB0byB0aGUgYmFzZSwgd2hpY2ggYnkgZGVmYXVsdCBpcyB0aGUgQW50IHByb2plY3QKLWJhc2VkaXIuCi0gICAgPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPlllczwvdGQ+CisgICAgPHRkPmxvY2F0aW9uPC90ZD4KKyAgICA8dGQ+VGhlIGxvY2F0aW9uIG9mIHRoZSBsb2NhbCByZXBsYWNlbWVudCB0byBiZSB1c2VkIGZvciB0aGUgcHVibGljIGlkZW50aWZpZXIgc3BlY2lmaWVkLiBUaGlzCisgICAgbWF5IGJlIHNwZWNpZmllZCBhcyBhIGZpbGUgbmFtZSwgcmVzb3VyY2UgbmFtZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoLCBvciBhIFVSTC4gIFJlbGF0aXZlIHBhdGhzCisgICAgd2lsbCBiZSByZXNvbHZlZCBhY2NvcmRpbmcgdG8gdGhlIGJhc2UsIHdoaWNoIGJ5IGRlZmF1bHQgaXMgdGhlIEFudAorICAgIHByb2plY3QgPHZhcj5iYXNlZGlyPC92YXI+LjwvdGQ+CisgICAgPHRkPlllczwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPGg0PmNsYXNzcGF0aDwvaDQ+Ci08cD5UaGUgY2xhc3NwYXRoIHRvIHVzZSBmb3IgPGEgaHJlZj0iI1Jlc29sdmVyQWxnb3JpdGhtIj5lbnRpdHkKLXJlc29sdXRpb248L2E+LiAgVGhlIG5lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gaXMgYQotPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlIHN0cnVjdHVyZS48L3A+Cis8cD5UaGUgY2xhc3NwYXRoIHRvIHVzZSBmb3IgPGEgaHJlZj0iI1Jlc29sdmVyQWxnb3JpdGhtIj5lbnRpdHkgcmVzb2x1dGlvbjwvYT4uICBUaGUKK25lc3RlZCA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gaXMgYSA8YSBocmVmPSIuLi91c2luZy5odG1sI3BhdGgiPnBhdGg8L2E+LWxpa2Ugc3RydWN0dXJlLjwvcD4KIDxoND5jYXRhbG9ncGF0aDwvaDQ+Ci08cD4KLVRoZSBuZXN0ZWQgPGNvZGU+Y2F0YWxvZ3BhdGg8L2NvZGU+IGVsZW1lbnQgaXMgYSA8YQotaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlIHN0cnVjdHVyZSBsaXN0aW5nIGNhdGFsb2cgZmlsZXMgdG8KLXNlYXJjaC4gIEFsbCBmaWxlcyBpbiB0aGlzIHBhdGggYXJlIGFzc3VtZWQgdG8gYmUgT0FTSVMgY2F0YWxvZyBmaWxlcywgaW4KLWVpdGhlcgotPGEgaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIj4KLXBsYWluIHRleHQgZm9ybWF0PC9hPiBvciA8YQotaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+Ci1YTUwgZm9ybWF0PC9hPi4gRW50cmllcyBzcGVjaWZ5aW5nIG5vbmV4aXN0ZW50IGZpbGVzIHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlCi1yZXNvbHZlciBsaWJyYXJ5IGZyb20geG1sLWNvbW1vbnMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLCBhbGwKLTxjb2RlPmNhdGFsb2dwYXRoczwvY29kZT4gd2lsbCBiZSBpZ25vcmVkIGFuZCBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuCi08L3A+Cis8cD5UaGUgbmVzdGVkIDxjb2RlPmNhdGFsb2dwYXRoPC9jb2RlPiBlbGVtZW50IGlzIGEgPGEgaHJlZj0iLi4vdXNpbmcuaHRtbCNwYXRoIj5wYXRoPC9hPi1saWtlCitzdHJ1Y3R1cmUgbGlzdGluZyBjYXRhbG9nIGZpbGVzIHRvIHNlYXJjaC4gIEFsbCBmaWxlcyBpbiB0aGlzIHBhdGggYXJlIGFzc3VtZWQgdG8gYmUgT0FTSVMgY2F0YWxvZworZmlsZXMsIGluIGVpdGhlciA8YSBocmVmPSJodHRwczovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIgordGFyZ2V0PSJfdG9wIj5wbGFpbiB0ZXh0IGZvcm1hdDwvYT4KK29yIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIiB0YXJnZXQ9Il90b3AiPlhNTAorZm9ybWF0PC9hPi4gRW50cmllcyBzcGVjaWZ5aW5nIG5vbmV4aXN0ZW50IGZpbGVzIHdpbGwgYmUgaWdub3JlZC4gSWYgdGhlIHJlc29sdmVyIGxpYnJhcnkgZnJvbQoreG1sLWNvbW1vbnMgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLCBhbGwgPGNvZGU+Y2F0YWxvZ3BhdGg8L2NvZGU+cyB3aWxsIGJlIGlnbm9yZWQgYW5kIGEKK3dhcm5pbmcgd2lsbCBiZSBsb2dnZWQuPC9wPgogPGgzPkV4YW1wbGVzPC9oMz4KLTxwPlNldCB1cCBhbiBYTUxDYXRhbG9nIHdpdGggYSBzaW5nbGUgZHRkIHJlZmVyZW5jZWQgbG9jYWxseSBpbiBhIHVzZXIncyAKLWhvbWUgCi1kaXJlY3Rvcnk6PC9wPgotPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7eG1sY2F0YWxvZyZndDsKLSAgICAgICAgJmx0O2R0ZCAKLSAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiZxdW90OwotICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7L2hvbWUvZGlvbi9kb3dubG9hZHMvZG9jYm9vay9kb2Nib29reC5kdGQmcXVvdDsvJmd0OwotICAgICZsdDsveG1sY2F0YWxvZyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPlNldCB1cCBhbiBYTUxDYXRhbG9nIHdpdGggYSBtdWx0aXBsZSBkdGRzIHRvIGJlIGZvdW5kIGVpdGhlciBpbiB0aGUKLWZpbGVzeXN0ZW0gKHJlbGF0aXZlIHRvIHRoZSBBbnQgcHJvamVjdCBiYXNlZGlyKSBvciBpbiB0aGUgY2xhc3NwYXRoOgorPHA+U2V0IHVwIGFuIFhNTENhdGFsb2cgd2l0aCBhIHNpbmdsZSBEVEQgcmVmZXJlbmNlZCBsb2NhbGx5IGluIGEgdXNlcidzIGhvbWUgZGlyZWN0b3J5OjwvcD4KKzxwcmU+CismbHQ7eG1sY2F0YWxvZyZndDsKKyAgICAmbHQ7ZHRkIHB1YmxpY0lkPSZxdW90Oy0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiZxdW90OworICAgICAgICAgbG9jYXRpb249JnF1b3Q7L2hvbWUvZGlvbi9kb3dubG9hZHMvZG9jYm9vay9kb2Nib29reC5kdGQmcXVvdDsvJmd0OworJmx0Oy94bWxjYXRhbG9nJmd0OzwvcHJlPgorPHA+U2V0IHVwIGFuIFhNTENhdGFsb2cgd2l0aCBhIG11bHRpcGxlIERURHMgdG8gYmUgZm91bmQgZWl0aGVyIGluIHRoZSBmaWxlc3lzdGVtIChyZWxhdGl2ZSB0bwordGhlIEFudCBwcm9qZWN0IDx2YXI+YmFzZWRpcjwvdmFyPikgb3IgaW4gdGhlIGNsYXNzcGF0aDoKIDwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICAgJmx0O3htbGNhdGFsb2cgaWQ9JnF1b3Q7Y29tbW9uRFREcyZxdW90OyZndDsKLSAgICAgICAgJmx0O2R0ZCAKLSAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiZxdW90OwotICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7ZG9jYm9vay9kb2Nib29reC5kdGQmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7ZHRkIAotICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7LS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOJnF1b3Q7Ci0gICAgICAgICAgICBsb2NhdGlvbj0mcXVvdDt3ZWItYXBwXzJfMi5kdGQmcXVvdDsvJmd0OwotICAgICZsdDsveG1sY2F0YWxvZyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKzxwcmU+CismbHQ7eG1sY2F0YWxvZyBpZD0mcXVvdDtjb21tb25EVERzJnF1b3Q7Jmd0OworICAgICZsdDtkdGQgcHVibGljSWQ9JnF1b3Q7LS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOJnF1b3Q7CisgICAgICAgICBsb2NhdGlvbj0mcXVvdDtkb2Nib29rL2RvY2Jvb2t4LmR0ZCZxdW90Oy8mZ3Q7CisgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4mcXVvdDsKKyAgICAgICAgIGxvY2F0aW9uPSZxdW90O3dlYi1hcHBfMl8yLmR0ZCZxdW90Oy8mZ3Q7CismbHQ7L3htbGNhdGFsb2cmZ3Q7PC9wcmU+CiAKLTxwPlNldCB1cCBhbiBYTUxDYXRhbG9nIHdpdGggYSBjb21iaW5hdGlvbiBvZiBEVERzIGFuZCBlbnRpdGllcyBhcwotd2VsbCBhcyBhIG5lc3RlZCBYTUxDYXRhbG9nIGFuZCBleHRlcm5hbCBjYXRhbG9nIGZpbGVzIGluIGJvdGgKLWZvcm1hdHM6PC9wPgorPHA+U2V0IHVwIGFuIFhNTENhdGFsb2cgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIERURHMgYW5kIGVudGl0aWVzIGFzIHdlbGwgYXMgYSBuZXN0ZWQgWE1MQ2F0YWxvZworYW5kIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgaW4gYm90aCBmb3JtYXRzOjwvcD4KIAotPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7eG1sY2F0YWxvZyBpZD0mcXVvdDthbGxjYXRhbG9ncyZxdW90OyZndDsKLSAgICAgICAgJmx0O2R0ZCAKLSAgICAgICAgICAgIHB1YmxpY0lkPSZxdW90Oy0vL0FyaWVsUGFydG5lcnMvL0RURCBYTUwgQXJ0aWNsZSBWMS4wLy9FTiZxdW90OwotICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7Y29tL2FyaWVscGFydG5lcnMva25vd2xlZGdlYmFzZS9kdGQvYXJ0aWNsZS5kdGQmcXVvdDsvJmd0OwotICAgICAgICAmbHQ7ZW50aXR5IAotICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7TGFyZ2VMb2dvJnF1b3Q7Cis8cHJlPgorJmx0O3htbGNhdGFsb2cgaWQ9JnF1b3Q7YWxsY2F0YWxvZ3MmcXVvdDsmZ3Q7CisgICAgJmx0O2R0ZCBwdWJsaWNJZD0mcXVvdDstLy9BcmllbFBhcnRuZXJzLy9EVEQgWE1MIEFydGljbGUgVjEuMC8vRU4mcXVvdDsKKyAgICAgICAgIGxvY2F0aW9uPSZxdW90O2NvbS9hcmllbHBhcnRuZXJzL2tub3dsZWRnZWJhc2UvZHRkL2FydGljbGUuZHRkJnF1b3Q7LyZndDsKKyAgICAmbHQ7ZW50aXR5IHB1YmxpY0lkPSZxdW90O0xhcmdlTG9nbyZxdW90OwogICAgICAgICAgICAgbG9jYXRpb249JnF1b3Q7Y29tL2FyaWVscGFydG5lcnMvaW1hZ2VzL2FyaWVsLWxvZ28tbGFyZ2UuZ2lmJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9ImNvbW1vbkRURHMiLyZndDsKLSAgICAgICAgICAgICZsdDtjYXRhbG9ncGF0aCZndDsKLSAgICAgICAgICAgICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249Ii9ldGMvc2dtbC9jYXRhbG9nIi8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgCi0gICAgICAgICAgICAgICAgICAgIGRpcj0mcXVvdDsvYW5ldHdvcmsvZHJpdmUmcXVvdDsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovY2F0YWxvZyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgCi0gICAgICAgICAgICAgICAgICAgIGRpcj0mcXVvdDsvbXkvY2F0YWxvZ3MmcXVvdDsKLSAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovY2F0YWxvZy54bWwmcXVvdDsvJmd0OwotICAgICAgICAgICAgJmx0Oy9jYXRhbG9ncGF0aCZndDsKLSAgICAgICAgJmx0Oy94bWxjYXRhbG9nJmd0OworICAgICZsdDt4bWxjYXRhbG9nIHJlZmlkPSJjb21tb25EVERzIi8mZ3Q7CisgICAgICAgICZsdDtjYXRhbG9ncGF0aCZndDsKKyAgICAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iL2V0Yy9zZ21sL2NhdGFsb2ciLyZndDsKKyAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDsvYW5ldHdvcmsvZHJpdmUmcXVvdDsKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqL2NhdGFsb2cmcXVvdDsvJmd0OworICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90Oy9teS9jYXRhbG9ncyZxdW90OworICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXM9JnF1b3Q7KiovY2F0YWxvZy54bWwmcXVvdDsvJmd0OworICAgICAgICAmbHQ7L2NhdGFsb2dwYXRoJmd0OwogICAgICZsdDsveG1sY2F0YWxvZyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsveG1sY2F0YWxvZyZndDs8L3ByZT4KIDxwPlRvIHJlZmVyZW5jZSB0aGUgYWJvdmUgWE1MQ2F0YWxvZyBpbiBhbiA8Y29kZT54c2x0PC9jb2RlPiB0YXNrOjxwPgotPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7eHNsdCBiYXNlZGlyPSIke3NvdXJjZS5kb2N9IgotICAgICAgICAgICBkZXN0ZGlyPSIke2Rlc3QueGRvY3N9IgotICAgICAgICAgICBleHRlbnNpb249Ii54bWwiCi0gICAgICAgICAgIHN0eWxlPSIke3NvdXJjZS54c2wuY29udmVydGVyLmRvY2Jvb2t9IgotICAgICAgICAgICBpbmNsdWRlcz0iKiovKi54bWwiCi0gICAgICAgICAgIGZvcmNlPSJ0cnVlIiZndDsKLSAgICAgICAgJmx0O3htbGNhdGFsb2cgcmVmaWQ9JnF1b3Q7YWxsY2F0YWxvZ3MmcXVvdDsvJmd0OwotICAgICZsdDsveHNsdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLQotCis8cHJlPgorJmx0O3hzbHQgYmFzZWRpcj0iJHtzb3VyY2UuZG9jfSIKKyAgICAgIGRlc3RkaXI9IiR7ZGVzdC54ZG9jc30iCisgICAgICBleHRlbnNpb249Ii54bWwiCisgICAgICBzdHlsZT0iJHtzb3VyY2UueHNsLmNvbnZlcnRlci5kb2Nib29rfSIKKyAgICAgIGluY2x1ZGVzPSIqKi8qLnhtbCIKKyAgICAgIGZvcmNlPSJ0cnVlIiZndDsKKyAgICAmbHQ7eG1sY2F0YWxvZyByZWZpZD0mcXVvdDthbGxjYXRhbG9ncyZxdW90Oy8mZ3Q7CismbHQ7L3hzbHQmZ3Q7PC9wcmU+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9UeXBlcy96aXBmaWxlc2V0Lmh0bWwgYi9tYW51YWwvVHlwZXMvemlwZmlsZXNldC5odG1sCmluZGV4IDk1NWUyNzEuLjcxNTBmZGEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9UeXBlcy96aXBmaWxlc2V0Lmh0bWwKKysrIGIvbWFudWFsL1R5cGVzL3ppcGZpbGVzZXQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEzNSArMTUsMTE1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Ci0gIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlppcEZpbGVTZXQgVHlwZTwvdGl0bGU+CiA8L2hlYWQ+CiA8Ym9keT4KLTxoMj48YSBuYW1lPSJmaWxlc2V0Ij5aaXBGaWxlU2V0PC9hPjwvaDI+Cis8aDIgaWQ9ImZpbGVzZXQiPlppcEZpbGVTZXQ8L2gyPgogCi08cD5BIDxjb2RlPiZsdDt6aXBmaWxlc2V0Jmd0OzwvY29kZT4gaXMgYSBzcGVjaWFsIGZvcm0gb2YgYSA8Y29kZT4mbHQ7PGEKLSBocmVmPSJmaWxlc2V0Lmh0bWwiPmZpbGVzZXQ8L2E+Jmd0OzwvY29kZT4gd2hpY2ggY2FuIGJlaGF2ZSBpbiAyCi1kaWZmZXJlbnQgd2F5cyA6IDxicj4KLTwvcD4KKzxwPkEgPGNvZGU+Jmx0O3ppcGZpbGVzZXQmZ3Q7PC9jb2RlPiBpcyBhIHNwZWNpYWwgZm9ybSBvZgorYSA8Y29kZT4mbHQ7PGEgaHJlZj0iZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiZndDs8L2NvZGU+IHdoaWNoIGNhbiBiZWhhdmUgaW4gMiBkaWZmZXJlbnQgd2F5czo8L3A+CiA8dWw+Ci0gIDxsaT5XaGVuIHRoZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+c3JjPC9zcGFuPiBhdHRyaWJ1dGUKLSAgaXMgdXNlZCAtIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkCi0gICg8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPiksIHRoZSB6aXBmaWxlc2V0IGlzIHBvcHVsYXRlZCB3aXRoIAotICB6aXAgZW50cmllcyBmb3VuZCBpbiB0aGUgZmlsZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZToKLSAgaXRhbGljOyI+c3JjPC9zcGFuPi48YnI+Ci0gIDwvbGk+Ci0gIDxsaT5XaGVuIHRoZSA8c3BhbiBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+ZGlyPC9zcGFuPiBhdHRyaWJ1dGUKLWlzIHVzZWQsIHRoZSB6aXBmaWxlc2V0IGlzIHBvcHVsYXRlZCB3aXRoIGZpbGVzeXN0ZW0gZmlsZXMgZm91bmQgdW5kZXIgPHNwYW4KLSBzdHlsZT0iZm9udC1zdHlsZTogaXRhbGljOyI+ZGlyPC9zcGFuPi48YnI+Ci0gIDwvbGk+CisgIDxsaT5XaGVuIHRoZSA8dmFyPnNyYzwvdmFyPiBhdHRyaWJ1dGUgaXMgdXNlZCZtZGFzaDtvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGhhcyBiZWVuCisgICAgc3BlY2lmaWVkICg8ZW0+c2luY2UgQXBhY2hlIEFudCAxLjc8L2VtPiksIHRoZSB6aXBmaWxlc2V0IGlzIHBvcHVsYXRlZCB3aXRoIHppcCBlbnRyaWVzIGZvdW5kIGluCisgICAgdGhlIGZpbGUgPHZhcj5zcmM8L3Zhcj4uPC9saT4KKyAgPGxpPldoZW4gdGhlIDx2YXI+ZGlyPC92YXI+IGF0dHJpYnV0ZSBpcyB1c2VkLCB0aGUgemlwZmlsZXNldCBpcyBwb3B1bGF0ZWQgd2l0aCBmaWxlc3lzdGVtIGZpbGVzCisgICAgZm91bmQgdW5kZXIgPHZhcj5kaXI8L3Zhcj4uPC9saT4KIDwvdWw+Ci08cD48Y29kZT4mbHQ7emlwZmlsZXNldCZndDs8L2NvZGU+IHN1cHBvcnRzIGFsbCBhdHRyaWJ1dGVzIG9mIDxjb2RlPiZsdDs8YQotIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4mZ3Q7PC9jb2RlPgotIGluIGFkZGl0aW9uIHRvIHRob3NlIGxpc3RlZCBiZWxvdy4gIE5vdGUgdGhhdCB6aXAgYXJjaGl2ZXMgaW4gZ2VuZXJhbAotIGRvbid0IGNvbnRhaW4gZW50cmllcyB3aXRoIGxlYWRpbmcgc2xhc2hlcyBzbyB5b3Ugc2hvdWxkbid0IHVzZQotIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyB0aGF0IHN0YXJ0IHdpdGggc2xhc2hlcyBlaXRoZXIuPC9wPgorPHA+PGNvZGU+Jmx0O3ppcGZpbGVzZXQmZ3Q7PC9jb2RlPiBzdXBwb3J0cyBhbGwgYXR0cmlidXRlcworb2YgPGNvZGU+Jmx0OzxhIGhyZWY9ImZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4mZ3Q7PC9jb2RlPiBpbiBhZGRpdGlvbiB0byB0aG9zZSBsaXN0ZWQgYmVsb3cuICBOb3RlCit0aGF0IHppcCBhcmNoaXZlcyBpbiBnZW5lcmFsIGRvbid0IGNvbnRhaW4gZW50cmllcyB3aXRoIGxlYWRpbmcgc2xhc2hlcyBzbyB5b3Ugc2hvdWxkbid0Cit1c2UgPHZhcj5pbmNsdWRlczwvdmFyPi88dmFyPmV4Y2x1ZGVzPC92YXI+IHBhdHRlcm5zIHRoYXQgc3RhcnQgd2l0aCBzbGFzaGVzIGVpdGhlci48L3A+CiAKLTxwPlNpbmNlIEFudCAxLjYsIGEgemlwZmlsZXNldCBjYW4gYmUgZGVmaW5lZCB3aXRoIHRoZSA8c3BhbgotIHN0eWxlPSJmb250LXN0eWxlOiBpdGFsaWM7Ij5pZCA8L3NwYW4+YXR0cmlidXRlIGFuZCByZWZlcnJlZCB0byB3aXRoCi10aGUgPHNwYW4gc3R5bGU9ImZvbnQtc3R5bGU6IGl0YWxpYzsiPnJlZmlkPC9zcGFuPiBhdHRyaWJ1dGUuPGJyPgotPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjY8L2VtPiwgYSB6aXBmaWxlc2V0IGNhbiBiZSBkZWZpbmVkIHdpdGggdGhlIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlIGFuZCByZWZlcnJlZAordG8gd2l0aCB0aGUgPHZhcj5yZWZpZDwvdmFyPiBhdHRyaWJ1dGUuPC9wPgorCiA8aDM+UGFyYW1ldGVyczwvaDM+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KICAgPHRib2R5PgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+QXR0cmlidXRlPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiIGFsaWduPSJjZW50ZXIiPjxiPlJlcXVpcmVkPC9iPjwvdGQ+CisgICAgICA8dGggc2NvcGU9ImNvbCI+QXR0cmlidXRlPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5wcmVmaXg8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5hbGwgZmlsZXMgaW4gdGhlIGZpbGVzZXQgYXJlIHByZWZpeGVkIHdpdGggdGhhdCAKLXBhdGggaW4gdGhlIGFyY2hpdmUuPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHRkPnByZWZpeDwvdGQ+CisgICAgICA8dGQ+YWxsIGZpbGVzIGluIHRoZSBmaWxlc2V0IGFyZSBwcmVmaXhlZCB3aXRoIHRoYXQgcGF0aCBpbiB0aGUgYXJjaGl2ZS48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZnVsbHBhdGg8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgZmlsZSBkZXNjcmliZWQgYnkgdGhlIGZpbGVzZXQgaXMgcGxhY2VkIGF0ICAKLXRoYXQgZXhhY3QgbG9jYXRpb24gaW4gdGhlIGFyY2hpdmUuPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgPHRkPmZ1bGxwYXRoPC90ZD4KKyAgICAgIDx0ZD50aGUgZmlsZSBkZXNjcmliZWQgYnkgdGhlIGZpbGVzZXQgaXMgcGxhY2VkIGF0IHRoYXQgZXhhY3QgbG9jYXRpb24gaW4gdGhlIGFyY2hpdmUuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnNyYzwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPm1heSBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSA8aT5kaXI8L2k+IGF0dHJpYnV0ZQotIHRvIHNwZWNpZnkgYSB6aXAgZmlsZSB3aG9zZSBjb250ZW50cyB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgICAgIGluY2x1ZGVkCi1pbiB0aGUgYXJjaGl2ZS48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+c3JjPC90ZD4KKyAgICAgIDx0ZD5tYXkgYmUgdXNlZCBpbiBwbGFjZSBvZiB0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIHRvIHNwZWNpZnkgYSB6aXAgZmlsZSB3aG9zZSBjb250ZW50cworICAgICAgICB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgaW5jbHVkZWQgaW4gdGhlIGFyY2hpdmUuPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGVtb2RlPC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+QSAzIGRpZ2l0IG9jdGFsIHN0cmluZywgc3BlY2lmeSB0aGUgdXNlciwgZ3JvdXAgCi1hbmQgb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXggZmFzaGlvbi4gIE9ubHkgYXBwbGllcyB0byAgICAKLXBsYWluIGZpbGVzLiAgRGVmYXVsdCBpcyA2NDQuIDxlbT5zaW5jZSBBbnQgMS41LjI8L2VtPi48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+ZmlsZW1vZGU8L3RkPgorICAgICAgPHRkPkEgMyBkaWdpdCBvY3RhbCBzdHJpbmcsIHNwZWNpZnkgdGhlIHVzZXIsIGdyb3VwIGFuZCBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peAorICAgICAgICBmYXNoaW9uLiBPbmx5IGFwcGxpZXMgdG8gcGxhaW4gZmlsZXMuIDxlbT5TaW5jZSBBbnQgMS41LjI8L2VtPjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+NjQ0PC9xPjwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmRpcm1vZGU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCAKLWFuZCBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peCBmYXNoaW9uLiAgT25seSBhcHBsaWVzIHRvICAgIAotZGlyZWN0b3JpZXMuICBEZWZhdWx0IGlzIDc1NS4gPGVtPnNpbmNlIEFudCAxLjUuMjwvZW0+LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgIDx0ZD5kaXJtb2RlPC90ZD4KKyAgICAgIDx0ZD5BIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCBhbmQgb3RoZXIgbW9kZXMgaW4gdGhlIHN0YW5kYXJkIFVuaXgKKyAgICAgICAgZmFzaGlvbi4gT25seSBhcHBsaWVzIHRvIGRpcmVjdG9yaWVzLiA8ZW0+U2luY2UgQW50IDEuNS4yPC9lbT48L3RkPgorICAgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPjc1NTwvcT48L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5lbmNvZGluZzwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMKLSAgICAgIGluc2lkZSB0aGUgemlwIGZpbGUuICBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUgdGhlIDxhCi0gICAgICBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj5TdXBwb3J0ZWQgRW5jb2RpbmdzPC9hPi4KLSAgICAgIERlZmF1bHRzIHRvIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+ZW5jb2Rpbmc8L3RkPgorICAgICAgPHRkPlRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdG8gdXNlIGZvciBmaWxlbmFtZXMgaW5zaWRlIHRoZSB6aXAgZmlsZS4gIEZvciBhIGxpc3Qgb2YgcG9zc2libGUKKyAgICAgICAgdmFsdWVzIHNlZQorICAgICAgICB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiCisgICAgICAgIHRhcmdldD0iX3RvcCI+U3VwcG9ydGVkIEVuY29kaW5nczwvYT4uCisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIGRlZmF1bHQgSlZNIGNoYXJhY3RlciBlbmNvZGluZzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmVycm9yb25taXNzaW5nYXJjaGl2ZTwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPgotICAgICAgICBTcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4KLSAgICAgICAgSWYgdHJ1ZSwgYSBidWlsZCBlcnJvciB3aWxsIGhhcHBlbjsgaWYgZmFsc2UsIHRoZSBmaWxlc2V0Ci0gICAgICAgIHdpbGwgYmUgaWdub3JlZC9lbXB0eS4KLSAgICAgICAgRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICAgICAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+Ci0gICAgICA8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgICA8dGQ+ZXJyb3Jvbm1pc3NpbmdhcmNoaXZlPC90ZD4KKyAgICAgIDx0ZD5TcGVjaWZ5IHdoYXQgaGFwcGVucyBpZiB0aGUgYXJjaGl2ZSBkb2VzIG5vdCBleGlzdC4gIElmIDxxPnRydWU8L3E+LCBhIGJ1aWxkIGVycm9yIHdpbGwKKyAgICAgICAgaGFwcGVuOyBpZiA8cT5mYWxzZTwvcT4sIHRoZSBmaWxlc2V0IHdpbGwgYmUgaWdub3JlZC9lbXB0eS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgICA8dGQ+Tm87IGRlZmF1bHRzIHRvIDxxPnRydWU8L3E+PC90ZD4KICAgICA8L3RyPgogICA8L3Rib2R5PgogPC90YWJsZT4KLTxwPlRoZSA8aT5mdWxscGF0aDwvaT4gYXR0cmlidXRlIGNhbiBvbmx5IGJlIHNldCBmb3IgZmlsZXNldHMgdGhhdAotcmVwcmVzZW50IGEgc2luZ2xlIGZpbGUuIFRoZSA8aT5wcmVmaXg8L2k+IGFuZCA8aT5mdWxscGF0aDwvaT4KLWF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc2V0IG9uIHRoZSBzYW1lIGZpbGVzZXQuPC9wPgotPHA+V2hlbiB1c2luZyB0aGUgPGk+c3JjPC9pPiBhdHRyaWJ1dGUsIGluY2x1ZGUgYW5kIGV4Y2x1ZGUgcGF0dGVybnMKLW1heSBiZSB1c2VkIHRvIHNwZWNpZnkgYSBzdWJzZXQgb2YgdGhlIGFyY2hpdmUgZm9yIGluY2x1c2lvbiBpbiB0aGUKLWFyY2hpdmUgYXMgd2l0aCB0aGUgPGk+ZGlyPC9pPiBhdHRyaWJ1dGUuPC9wPgorPHA+VGhlIDx2YXI+ZnVsbHBhdGg8L3Zhcj4gYXR0cmlidXRlIGNhbiBvbmx5IGJlIHNldCBmb3IgZmlsZXNldHMgdGhhdCByZXByZXNlbnQgYSBzaW5nbGUKK2ZpbGUuIFRoZSA8dmFyPnByZWZpeDwvdmFyPiBhbmQgPHZhcj5mdWxscGF0aDwvdmFyPiBhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNldCBvbiB0aGUgc2FtZQorZmlsZXNldC48L3A+Cis8cD5XaGVuIHVzaW5nIHRoZSA8dmFyPnNyYzwvdmFyPiBhdHRyaWJ1dGUsIDx2YXI+aW5jbHVkZXM8L3Zhcj4gYW5kIDx2YXI+ZXhjbHVkZXM8L3Zhcj4gcGF0dGVybnMKK21heSBiZSB1c2VkIHRvIHNwZWNpZnkgYSBzdWJzZXQgb2YgdGhlIGFyY2hpdmUgZm9yIGluY2x1c2lvbiBpbiB0aGUgYXJjaGl2ZSBhcyB3aXRoCit0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAotPHA+UGxlYXNlIG5vdGUgdGhhdCBjdXJyZW50bHkgb25seSB0aGUgPGEKLWhyZWY9Ii4uL1Rhc2tzL3Rhci5odG1sIj50YXI8L2E+IGFuZCA8YQotaHJlZj0iLi4vVGFza3MvemlwLmh0bWwiPnppcDwvYT4gdGFza3MgdXNlIHRoZSBwZXJtaXNzaW9uLjwvcD4KKzxwPlBsZWFzZSBub3RlIHRoYXQgY3VycmVudGx5IG9ubHkgdGhlIDxhIGhyZWY9Ii4uL1Rhc2tzL3Rhci5odG1sIj50YXI8L2E+CithbmQgPGEgaHJlZj0iLi4vVGFza3MvemlwLmh0bWwiPnppcDwvYT4gdGFza3MgdXNlIHRoZSBwZXJtaXNzaW9uLjwvcD4KIAogPGgzPlBhcmFtZXRlcnMgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxoND5hbnkgZmlsZSBzeXN0ZW0gYmFzZWQgPGEgaHJlZj0icmVzb3VyY2VzLmh0bWwiPnJlc291cmNlPC9hPiBvcgotc2luZ2xlIGVsZW1lbnQgcmVzb3VyY2UgY29sbGVjdGlvbjwvaDQ+Cis8aDQ+YW55IGZpbGUgc3lzdGVtIGJhc2VkIDxhIGhyZWY9InJlc291cmNlcy5odG1sIj5yZXNvdXJjZTwvYT4gb3Igc2luZ2xlIGVsZW1lbnQgcmVzb3VyY2UKK2NvbGxlY3Rpb248L2g0PgogCi08cD5UaGUgc3BlY2lmaWVkIHJlc291cmNlIHdpbGwgYmUgdXNlZCBhcyBzcmMuPC9wPgorPHA+VGhlIHNwZWNpZmllZCByZXNvdXJjZSB3aWxsIGJlIHVzZWQgYXMgPHZhcj5zcmM8L3Zhcj4uPC9wPgogCiA8aDQ+RXhhbXBsZXM8L2g0PgotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+ICAmbHQ7emlwIGRlc3RmaWxlPSIke2Rpc3R9L21hbnVhbC56aXAiJmd0Ozxicj4gICAgJmx0O3ppcGZpbGVzZXQgZGlyPSJodGRvY3MvbWFudWFsIiBwcmVmaXg9ImRvY3MvdXNlci1ndWlkZSIvJmd0Ozxicj4gICAgJmx0O3ppcGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iQ2hhbmdlTG9nMjcudHh0IiBmdWxscGF0aD0iZG9jcy9DaGFuZ2VMb2cudHh0Ii8mZ3Q7PGJyPiAgICAmbHQ7emlwZmlsZXNldCBzcmM9ImV4YW1wbGVzLnppcCIgaW5jbHVkZXM9IioqLyouaHRtbCIgcHJlZml4PSJkb2NzL2V4YW1wbGVzIi8mZ3Q7PGJyPiAgJmx0Oy96aXAmZ3Q7PGJyPjwvcHJlPgotICA8cD56aXBzIGFsbCBmaWxlcyBpbiB0aGUgPGNvZGU+aHRkb2NzL21hbnVhbDwvY29kZT4gZGlyZWN0b3J5IGludG8KLXRoZSA8Y29kZT5kb2NzL3VzZXItZ3VpZGU8L2NvZGU+IGRpcmVjdG9yeSBpbiB0aGUgYXJjaGl2ZSwgYWRkcyB0aGUKLWZpbGUgPGNvZGU+Q2hhbmdlTG9nMjcudHh0PC9jb2RlPiBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgPGNvZGU+ZG9jcy9DaGFuZ2VMb2cudHh0PC9jb2RlPiwKLWFuZCBpbmNsdWRlcyBhbGwgdGhlIGh0bWwgZmlsZXMgaW4gPGNvZGU+ZXhhbXBsZXMuemlwPC9jb2RlPiB1bmRlciA8Y29kZT5kb2NzL2V4YW1wbGVzPC9jb2RlPi4KKzxwcmU+CismbHQ7emlwIGRlc3RmaWxlPSIke2Rpc3R9L21hbnVhbC56aXAiJmd0OworICAmbHQ7emlwZmlsZXNldCBkaXI9Imh0ZG9jcy9tYW51YWwiIHByZWZpeD0iZG9jcy91c2VyLWd1aWRlIi8mZ3Q7CisgICZsdDt6aXBmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IkNoYW5nZUxvZzI3LnR4dCIgZnVsbHBhdGg9ImRvY3MvQ2hhbmdlTG9nLnR4dCIvJmd0OworICAmbHQ7emlwZmlsZXNldCBzcmM9ImV4YW1wbGVzLnppcCIgaW5jbHVkZXM9IioqLyouaHRtbCIgcHJlZml4PSJkb2NzL2V4YW1wbGVzIi8mZ3Q7CismbHQ7L3ppcCZndDs8L3ByZT4KKzxwPnppcHMgYWxsIGZpbGVzIGluIHRoZSA8c2FtcD5odGRvY3MvbWFudWFsPC9zYW1wPiBkaXJlY3RvcnkgaW50bwordGhlIDxzYW1wPmRvY3MvdXNlci1ndWlkZTwvc2FtcD4gZGlyZWN0b3J5IGluIHRoZSBhcmNoaXZlLCBhZGRzIHRoZQorZmlsZSA8c2FtcD5DaGFuZ2VMb2cyNy50eHQ8L3NhbXA+IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyA8c2FtcD5kb2NzL0NoYW5nZUxvZy50eHQ8L3NhbXA+LAorYW5kIGluY2x1ZGVzIGFsbCB0aGUgaHRtbCBmaWxlcyBpbiA8c2FtcD5leGFtcGxlcy56aXA8L3NhbXA+IHVuZGVyIDxzYW1wPmRvY3MvZXhhbXBsZXM8L3NhbXA+LgogVGhlIGFyY2hpdmUgbWlnaHQgZW5kIHVwIGNvbnRhaW5pbmcgdGhlIGZpbGVzOjwvcD4KLSAgPGNvZGU+IGRvY3MvdXNlci1ndWlkZS9odG1sL2luZGV4Lmh0bWw8YnI+Ci1kb2NzL0NoYW5nZUxvZy50eHQ8YnI+Ci1kb2NzL2V4YW1wbGVzL2luZGV4Lmh0bWw8YnI+Ci0gIDwvY29kZT48L2Jsb2NrcXVvdGU+Ci0KKzxwcmU+ZG9jcy91c2VyLWd1aWRlL2h0bWwvaW5kZXguaHRtbAorZG9jcy9DaGFuZ2VMb2cudHh0Citkb2NzL2V4YW1wbGVzL2luZGV4Lmh0bWw8L3ByZT4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL2FudGV4dGVybmFsLmh0bWwgYi9tYW51YWwvYW50ZXh0ZXJuYWwuaHRtbAppbmRleCAwMmQyZjdiLi4zOWE0OWFhIDEwMDY0NAotLS0gYS9tYW51YWwvYW50ZXh0ZXJuYWwuaHRtbAorKysgYi9tYW51YWwvYW50ZXh0ZXJuYWwuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw4IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5JbnB1dEhhbmRsZXI8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjksMTYgKzI4LDE2IEBACiAKIDxwPkFwYWNoZSBBbnQgcHJvdmlkZXMgYSByaWNoIHNldCBvZiB0YXNrcyBmb3IgYnVpbGRmaWxlIGNyZWF0b3JzIGFuZAogYWRtaW5pc3RyYXRvcnMuICBCdXQgd2hhdCBhYm91dCBwcm9ncmFtbWVycz8gIENhbiB0aGUgZnVuY3Rpb25hbGl0eQotcHJvdmlkZWQgYnkgQW50IHRhc2tzIGJlIHVzZWQgaW4gamF2YSBwcm9ncmFtcz88L3A+Citwcm92aWRlZCBieSBBbnQgdGFza3MgYmUgdXNlZCBpbiBKYXZhIHByb2dyYW1zPzwvcD4KIAotPHA+WWVzLCBhbmQgaXRzIHF1aXRlIGVhc3kuICBCZWZvcmUgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzLCBob3dldmVyLCAKKzxwPlllcywgYW5kIGl0cyBxdWl0ZSBlYXN5LiAgQmVmb3JlIGdldHRpbmcgaW50byB0aGUgZGV0YWlscywgaG93ZXZlciwKIHdlIHNob3VsZCBtZW50aW9uIHRoZSBwcm9zIGFuZCBjb25zIG9mIHRoaXMgYXBwcm9hY2g6CiAKIDxoMz5Qcm9zPC9oMz4KIAotPHRhYmxlIGNlbGxwYWRkaW5nPSIwIiBtYXJnaW49IjAiIGJvcmRlcj0iMSI+Cis8dGFibGU+CiA8dHI+Ci08dGQ+PGI+Um9idXN0PC9iPjwvdGQ+Cis8dGQ+PHN0cm9uZz5Sb2J1c3Q8L3N0cm9uZz48L3RkPgogPHRkPgogQW50IHRhc2tzIGFyZSB2ZXJ5IHJvYnVzdC4gIFRoZXkgaGF2ZSBiZWVuIGJhbmdlZCBvbiBieSBtYW55IHBlb3BsZS4KIEFudCB0YXNrcyBoYXZlIGJlZW4gdXNlZCBpbiBtYW55IGRpZmZlcmVudCBjb250ZXh0cywgYW5kIGhhdmUKQEAgLTQ3LDcgKzQ2LDcgQEAKIDwvdGQ+CiA8L3RyPgogPHRyPgotPHRkPjxiPkNyb3NzIFBsYXRmb3JtPC9iPjwvdGQ+Cis8dGQ+PHN0cm9uZz5Dcm9zcyBQbGF0Zm9ybTwvc3Ryb25nPjwvdGQ+CiA8dGQ+CiBBbnQgdGFza3MgYXJlIGNyb3NzIHBsYXRmb3JtLiAgVGhleSBoYXZlIGJlZW4gdGVzdGVkIG9uIGFsbCBvZiB0aGUKIHZvbHVtZSBwbGF0Zm9ybXMsIGFuZCBzZXZlcmFsIHJhdGhlciB1bnVzdWFsIG9uZXMgKE5ldHdhcmUgYW5kIE9TLzM5MCwgdG8KQEAgLTU1LDcgKzU0LDcgQEAKIDwvdGQ+CiA8L3RyPgogPHRyPgotPHRkPjxiPkNvbW11bml0eSBTdXBwb3J0PC9iPjwvdGQ+Cis8dGQ+PHN0cm9uZz5Db21tdW5pdHkgU3VwcG9ydDwvc3Ryb25nPjwvdGQ+CiA8dGQ+CiBVc2luZyBBbnQgdGFza3MgbWVhbnMgeW91IGhhdmUgbGVzcyBvZiB5b3VyIG93biBjb2RlIHRvIHN1cHBvcnQuICBBbnQKIGNvZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBlbnRpcmUgQXBhY2hlIEFudCBjb21tdW5pdHkuCkBAIC02NSwxOCArNjQsMTggQEAKIAogPGgzPkNvbnM8L2gzPgogCi08dGFibGUgY2VsbHBhZGRpbmc9IjAiIG1hcmdpbj0iMCIgYm9yZGVyPSIxIj4KKzx0YWJsZT4KIDx0cj4KLTx0ZD48Yj5EZXBlbmRlbmN5IG9uIEFudCBMaWJyYXJpZXM8L2I+PC90ZD4KKzx0ZD48c3Ryb25nPkRlcGVuZGVuY3kgb24gQW50IExpYnJhcmllczwvc3Ryb25nPjwvdGQ+CiA8dGQ+CiBPYnZpb3VzbHksIGlmIHlvdSB1c2UgYW4gQW50IHRhc2sgaW4geW91ciBjb2RlLCB5b3Ugd2lsbCBoYXZlIHRvIGFkZAotImFudC5qYXIiIHRvIHlvdXIgcGF0aC4gIE9mIGNvdXJzZSwgeW91IGNvdWxkIHVzZSBhIGNvZGUgb3B0aW1pemVyIHRvCis8cT5hbnQuamFyPC9xPiB0byB5b3VyIHBhdGguICBPZiBjb3Vyc2UsIHlvdSBjb3VsZCB1c2UgYSBjb2RlIG9wdGltaXplciB0bwogcmVtb3ZlIHRoZSB1bm5lY2Vzc2FyeSBjbGFzc2VzLCBidXQgeW91IHdpbGwgc3RpbGwgcHJvYmFibHkgcmVxdWlyZSBhCiBjaHVuayBvZiB0aGUgQW50IGNvcmUuCiA8L3RkPgogPC90cj4KIDx0cj4KLTx0ZD48Yj5Mb3NzIG9mIEZsZXhpYmlsaXR5PC9iPjwvdGQ+Cis8dGQ+PHN0cm9uZz5Mb3NzIG9mIEZsZXhpYmlsaXR5PC9zdHJvbmc+PC90ZD4KIDx0ZD4KIEF0IHNvbWUgcG9pbnQsIGlmIHlvdSBmaW5kIHlvdXJzZWxmIGhhdmluZyB0byBtb2RpZnkgdGhlIEFudCBjb2RlLCBpdAogcHJvYmFibHkgbWFrZXMgbW9yZSBzZW5zZSB0byAicm9sbCB5b3VyIG93bi4iICBPZiBjb3Vyc2UsIHlvdSBjYW4KQEAgLTg2LDcgKzg1LDYgQEAKIDwvdHI+CiA8L3RhYmxlPgogCi0KIDxoMj5FeGFtcGxlPC9oMj4KIAogPHA+TGV0J3Mgc2F5IHlvdSB3YW50IHRvIHVuemlwIGEgemlwIGZpbGUgcHJvZ3JhbW1hdGljYWxseSBmcm9tIGphdmEKQEAgLTEwOSw4ICsxMDcsOCBAQAogPC9wcmU+CiAKIDxwPgotVGhlIEFudCB0YXNrIHRvIHBlcmZvcm0gdGhpcyBmdW5jdGlvbiBpcwotPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kPC9jb2RlPi4gIEFsbCB3ZSBoYXZlIHRvIGRvCitUaGUgQW50IHRhc2sgdG8gcGVyZm9ybSB0aGlzIGZ1bmN0aW9uCitpcyA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQ8L2NvZGU+LiAgQWxsIHdlIGhhdmUgdG8gZG8KIGlzIGNyZWF0ZSBhIGR1bW15IEFudCA8Y29kZT5Qcm9qZWN0PC9jb2RlPiBhbmQgPGNvZGU+VGFyZ2V0PC9jb2RlPiwKIHNldCB0aGUgPGNvZGU+VGFzazwvY29kZT4gcGFyYW1ldGVycyB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIHNldCBpbiBhCiBidWlsZGZpbGUsIGFuZCBjYWxsIDxjb2RlPmV4ZWN1dGUoKTwvY29kZT4uPC9wPgpAQCAtMTIxLDggKzExOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhwYW5kOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLTwvcHJlPgoraW1wb3J0IGphdmEuaW8uRmlsZTs8L3ByZT4KIAogPHA+VGhlIGZ1bmN0aW9uIGNhbGwgaXMgYWN0dWFsbHkgcXVpdGUgc2ltcGxlOjwvcD4KIApAQCAtMTMxLDMwICsxMjgsMzAgQEAKIAogICAgIGZpbmFsIGNsYXNzIEV4cGFuZGVyIGV4dGVuZHMgRXhwYW5kIHsKICAgICAgICAgcHVibGljIEV4cGFuZGVyKCkgewotIAkgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7Ci0JICAgIHByb2plY3QuaW5pdCgpOwotCSAgICB0YXNrVHlwZSA9ICJ1bnppcCI7Ci0JICAgIHRhc2tOYW1lID0gInVuemlwIjsKLQkgICAgdGFyZ2V0ID0gbmV3IFRhcmdldCgpOwotCX0JCisgICAgICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgICAgIHByb2plY3QuaW5pdCgpOworICAgICAgICAgICAgdGFza1R5cGUgPSAidW56aXAiOworICAgICAgICAgICAgdGFza05hbWUgPSAidW56aXAiOworICAgICAgICAgICAgdGFyZ2V0ID0gbmV3IFRhcmdldCgpOworICAgICAgICB9CiAgICAgfQogICAgIEV4cGFuZGVyIGV4cGFuZGVyID0gbmV3IEV4cGFuZGVyKCk7CiAgICAgZXhwYW5kZXIuc2V0U3JjKG5ldyBGaWxlKHppcGZpbGUpKTsKICAgICBleHBhbmRlci5zZXREZXN0KG5ldyBGaWxlKGRlc3RkaXIpKTsKICAgICBleHBhbmRlci5leGVjdXRlKCk7Ci08L3ByZT4KK308L3ByZT4KIAogPHA+SW4gYWN0dWFsIHByYWN0aWNlLCB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIGFkZCB5b3VyIG93biBlcnJvcgogaGFuZGxpbmcgY29kZSBhbmQgeW91IG1heSBub3Qgd2FudCB0byB1c2UgYSBsb2NhbCBpbm5lciBjbGFzcy4KIEhvd2V2ZXIsIHRoZSBwb2ludCBvZiB0aGUgZXhhbXBsZSBpcyB0byBzaG93IGhvdyBhbiBBbnQgdGFzayBjYW4gYmUKIGNhbGxlZCBwcm9ncmFtbWF0aWNhbGx5IGluIHJlbGF0aXZlbHkgZmV3IGxpbmVzIG9mIGNvZGUuPC9wPgogCi08cD5UaGUgcXVlc3Rpb24geW91IGFyZSBwcm9iYWJseSBhc2tpbmcgeW91cnNlbGYgYXQgdGhpcyBwb2ludCBpczoKLTxpPkhvdyB3b3VsZCBJIGtub3cgd2hpY2ggY2xhc3NlcyBhbmQgbWV0aG9kcyBoYXZlIHRvIGJlIGNhbGxlZCBpbgotb3JkZXIgdG8gc2V0IHVwIGEgZHVtbXkgUHJvamVjdCBhbmQgVGFyZ2V0PzwvaT4gVGhlIGFuc3dlciBpczogeW91Cis8cD5UaGUgcXVlc3Rpb24geW91IGFyZSBwcm9iYWJseSBhc2tpbmcgeW91cnNlbGYgYXQgdGhpcyBwb2ludAoraXM6IDxlbT5Ib3cgd291bGQgSSBrbm93IHdoaWNoIGNsYXNzZXMgYW5kIG1ldGhvZHMgaGF2ZSB0byBiZSBjYWxsZWQgaW4KK29yZGVyIHRvIHNldCB1cCBhIGR1bW15IFByb2plY3QgYW5kIFRhcmdldD88L2VtPiBUaGUgYW5zd2VyIGlzOiB5b3UKIGRvbid0LiAgVWx0aW1hdGVseSwgeW91IGhhdmUgdG8gYmUgd2lsbGluZyB0byBnZXQgeW91ciBmZWV0IHdldCBhbmQKIHJlYWQgdGhlIHNvdXJjZSBjb2RlLiAgVGhlIGFib3ZlIGV4YW1wbGUgaXMgbWVyZWx5IGRlc2lnbmVkIHRvIHdoZXQKIHlvdXIgYXBwZXRpdGUgYW5kIGdldCB5b3Ugc3RhcnRlZC4gIEdvIGZvciBpdCE8L3A+CiAKLQorPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL2FudHRhc2tzbGlzdC5odG1sIGIvbWFudWFsL2FudHRhc2tzbGlzdC5odG1sCmluZGV4IGJkMTIwNDkuLjI2NmY2YmUgMTAwNjQ0Ci0tLSBhL21hbnVhbC9hbnR0YXNrc2xpc3QuaHRtbAorKysgYi9tYW51YWwvYW50dGFza3NsaXN0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KIDx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CkBAIC0yNSwxNiArMjUsMTMgQEAKIAogPGJvZHk+CiAKLQogPGgyPjxhIGhyZWY9InRvYy5odG1sIiB0YXJnZXQ9Im5hdkZyYW1lIj5UYWJsZSBvZiBDb250ZW50czwvYT48L2gyPgogCiA8aDM+QXBhY2hlIEFudCBUYXNrczwvaDM+CiA8dWwgY2xhc3M9ImlubGluZWxpc3QiPgotPGxpPjxhIGhyZWY9InRhc2tzb3ZlcnZpZXcuaHRtbCIgdGFyZ2V0PSJtYWluRnJhbWUiPk92ZXJ2aWV3IG9mIEFudCBUYXNrczwvYT48L2xpPgotPGxpPjxhIGhyZWY9InRhc2tsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkxpc3Qgb2YgVGFza3M8L2E+PC9saT4KLTxkaXYgc3R5bGU9InBhZGRpbmctbGVmdDoxZW0iPgotICA8bGk+PGEgaHJlZj0iaW5zdGFsbC5odG1sI2xpYnJhcnlkZXBlbmRlbmNpZXMiIHRhcmdldD0ibWFpbkZyYW1lIj5MaWJyYXJ5IERlcGVuZGVuY2llczwvYT48L2xpPgotPC9kaXY+CisgIDxsaT48YSBocmVmPSJ0YXNrc292ZXJ2aWV3Lmh0bWwiIHRhcmdldD0ibWFpbkZyYW1lIj5PdmVydmlldyBvZiBBbnQgVGFza3M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9InRhc2tsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPkxpc3Qgb2YgVGFza3M8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9Imluc3RhbGwuaHRtbCNsaWJyYXJ5ZGVwZW5kZW5jaWVzIiB0YXJnZXQ9Im1haW5GcmFtZSI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+PC9saT4KIDwvdWw+CiAKIDwvYm9keT4KZGlmZiAtLWdpdCBhL21hbnVhbC9hcGkvaW5kZXguaHRtbCBiL21hbnVhbC9hcGkvaW5kZXguaHRtbAppbmRleCA3MThkOGQ0Li4wZjJmYzkwIDEwMDY0NAotLS0gYS9tYW51YWwvYXBpL2luZGV4Lmh0bWwKKysrIGIvbWFudWFsL2FwaS9pbmRleC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjMgKzE1LDIxIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiA8aGVhZD4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+QXBhY2hlIEFudCBBUEk8L3RpdGxlPgogPC9oZWFkPgogPGJvZHk+Ci08Yj5BcGFjaGUgQW50IEFQSSBoYXMgbm90IGJlZW4gZ2VuZXJhdGVkPC9iPgorPGgyPkFwYWNoZSBBbnQgQVBJIGhhcyBub3QgYmVlbiBnZW5lcmF0ZWQ8L2gyPgogCi08cD5JZiB5b3Ugc2VlIHRoaXMgcGFnZSBvbmxpbmUgYXQgPGEKLWhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPmFudC5hcGFjaGUub3JnPC9hPiwgaXQgaXMgbm90IGEgYnVnLCBidXQKLW9uIHB1cnBvc2UuICBXZSBkbyBub3QgcHJvdmlkZSBhbiBvbmxpbmUgdmVyc2lvbiBvZiB0aGUgQVBJIGRvY3MsIHRoZXkKLWFyZSBpbmNsdWRlZCB3aXRoIGFsbCBvdXIgZGlzdHJpYnV0aW9ucy48L3A+Cis8cD5JZiB5b3Ugc2VlIHRoaXMgcGFnZSBvbmxpbmUgYXQgPGEgdGFyZ2V0PSJfdG9wIgoraHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iPmFudC5hcGFjaGUub3JnPC9hPiwgaXQgaXMgbm90IGEgYnVnLCBidXQgb24gcHVycG9zZS4gIFdlIGRvIG5vdAorcHJvdmlkZSBhbiBvbmxpbmUgdmVyc2lvbiBvZiB0aGUgQVBJIGRvY3MsIHRoZXkgYXJlIGluY2x1ZGVkIHdpdGggYWxsIG91ciBkaXN0cmlidXRpb25zLjwvcD4KIAotPHAgYWxpZ249ImxlZnQiPkFudCdzIG1hbnVhbCBhbmQgQVBJIGRvY3VtZW50YXRpb24gaXMgcGFydCBvZgotICB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSI+YmluYXJ5PC9hPgotICBkaXN0cmlidXRpb25zIG9yIGF2YWlsYWJsZSBhcyBhCi0gIHNlcGFyYXRlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWxkb3dubG9hZC5jZ2kiPmFyY2hpdmU8L2E+LgotPC9wPgorPHA+QW50J3MgbWFudWFsIGFuZCBBUEkgZG9jdW1lbnRhdGlvbiBpcyBwYXJ0IG9mCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiIHRhcmdldD0iX3RvcCI+YmluYXJ5PC9hPiBkaXN0cmlidXRpb25zIG9yCithdmFpbGFibGUgYXMgYSBzZXBhcmF0ZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL21hbnVhbGRvd25sb2FkLmNnaSIKK3RhcmdldD0iX3RvcCI+YXJjaGl2ZTwvYT4uPC9wPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL2FyZ3VtZW50cHJvY2Vzc29yLmh0bWwgYi9tYW51YWwvYXJndW1lbnRwcm9jZXNzb3IuaHRtbAppbmRleCAyY2Q1MjAyLi4yMzYyMjJkIDEwMDY0NAotLS0gYS9tYW51YWwvYXJndW1lbnRwcm9jZXNzb3IuaHRtbAorKysgYi9tYW51YWwvYXJndW1lbnRwcm9jZXNzb3IuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5UaGUgQ29tbWFuZCBMaW5lIFByb2Nlc3NvciBQbHVnaW46IEFyZ3VtZW50UHJvY2Vzc29yPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDUyICsyNSw0NSBAQAogPGJvZHk+CiA8aDE+VGhlIENvbW1hbmQgTGluZSBQcm9jZXNzb3IgUGx1Z2luOiBBcmd1bWVudFByb2Nlc3NvcjwvaDE+CiAKLTxoMj48YSBuYW1lPSJkZWZpbml0aW9uIj5XaGF0IGlzIGFuIEFyZ3VtZW50UHJvY2Vzc29yPzwvYT48L2gyPgorPGgyIGlkPSJkZWZpbml0aW9uIj5XaGF0IGlzIGFuIEFyZ3VtZW50UHJvY2Vzc29yPzwvaDI+CiAKIDxwPgotQW4gPGNvZGU+QXJndW1lbnRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgcGFyc2VyIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aGljaCBpcwotdGhlbiBjYWxsIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGJ1aWxkIGZpbGUgaXMgYmVpbmcgcGFyc2VkLiBUaGlyZCBwYXJ0eQotbGlicmFyaWVzIG1heSB0aGVuIGJlIGFibGUgdG8gaGF2ZSBjdXN0b20gYXJndW1lbnQgbGluZSBhcmd1bWVudCB3aGljaCBtb2RpZnkKLUFudCBiZWhhdmlvdXIuCitBbiA8Y29kZSBjbGFzcz0iY29kZSI+QXJndW1lbnRQcm9jZXNzb3I8L2NvZGU+IGlzIGEgcGFyc2VyIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudCB3aGljaCBpcyB0aGVuCitjYWxsIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGJ1aWxkIGZpbGUgaXMgYmVpbmcgcGFyc2VkLiBUaGlyZCBwYXJ0eSBsaWJyYXJpZXMgbWF5IHRoZW4gYmUgYWJsZSB0byBoYXZlCitjdXN0b20gYXJndW1lbnQgbGluZSBhcmd1bWVudCB3aGljaCBtb2RpZnkgQW50IGJlaGF2aW91ci4KIDwvcD4KIAogPHA+Ci1BbiA8Y29kZT5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gaXMgY2FsbGVkIGVhY2ggdGltZSBBbnQgcGFyc2UgYW4gdW5rbm93bgotYXJndW1lbnQsIGFuIDxjb2RlPkFyZ3VtZW50UHJvY2Vzc29yPC9jb2RlPiBkb2Vzbid0IHRha2UgcHJlY2VkZW5jZSBvdmVyIEFudCB0bwotcGFyc2UgYWxyZWFkeSBzdXBvcnRlZCBvcHRpb25zLiBJdCBpcyB0aGVuIHJlY29tbWVuZGVkIHRvIHRoaXJkIHBhcnR5Ci08Y29kZT5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gaW1wbGVtZW50YXRpb24gdG8gY2hvc2Ugc3BlY2lmaWMgJ2Vub3VnaCcKLWFyZ3VtZW50IG5hbWUsIGF2b2lkaW5nIGZvciBpbnN0YW5jZSBvbmUgbGV0dGVyIGFyZ3VtZW50cy4KK0FuIDxjb2RlIGNsYXNzPSJjb2RlIj5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gaXMgY2FsbGVkIGVhY2ggdGltZSBBbnQgcGFyc2UgYW4gdW5rbm93biBhcmd1bWVudCwKK2FuIDxjb2RlIGNsYXNzPSJjb2RlIj5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gZG9lc24ndCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBBbnQgdG8gcGFyc2UgYWxyZWFkeQorc3VwcG9ydGVkIG9wdGlvbnMuIEl0IGlzIHRoZW4gcmVjb21tZW5kZWQgdG8gdGhpcmQgcGFydHkgPGNvZGUgY2xhc3M9ImNvZGUiPkFyZ3VtZW50UHJvY2Vzc29yPC9jb2RlPgoraW1wbGVtZW50YXRpb24gdG8gY2hvc2Ugc3BlY2lmaWMgJ2Vub3VnaCcgYXJndW1lbnQgbmFtZSwgYXZvaWRpbmcgZm9yIGluc3RhbmNlIG9uZSBsZXR0ZXIgYXJndW1lbnRzLgogPC9wPgogCiA8cD4KLUl0IGlzIGFsc28gY2FsbGVkIGF0IHRoZSBkaWZmZXJlbnQgcGhhc2VzIHNvIGRpZmZlcmVudCBiZWhhdmlvdXIgY2FuIGJlCi1pbXBsZW1lbnRlZC4gSXQgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgZXZlcnkgYXJndW1lbnRzIGFyZSBwYXJzZWQsIGp1c3QKLWJlZm9yZSB0aGUgcHJvamVjdCBpcyBiZWluZyBjb25maWd1cmVkICh0aGUgYnVpbGQgZmlsZSBiZWluZyBwYXJzZWQpLAotYW5kIGp1c3QgYWZ0ZXIuIFNvbWUgb2YgdGhlIG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgcmV0dXJuIGEgYm9vbGVhbjoKLWlmIDxjb2RlPnRydWU8L2NvZGU+IGlzIHJldHVybmVkLCBBbnQgd2lsbCB0ZXJtaW5hdGUgaW1tZWRpYXRlbHksIHdpdGhvdXQKLWVycm9yLgorSXQgaXMgYWxzbyBjYWxsZWQgYXQgdGhlIGRpZmZlcmVudCBwaGFzZXMgc28gZGlmZmVyZW50IGJlaGF2aW91ciBjYW4gYmUgaW1wbGVtZW50ZWQuIEl0IGlzIGNhbGxlZAoranVzdCBhZnRlciBldmVyeSBhcmd1bWVudHMgYXJlIHBhcnNlZCwganVzdCBiZWZvcmUgdGhlIHByb2plY3QgaXMgYmVpbmcgY29uZmlndXJlZCAodGhlIGJ1aWxkIGZpbGUKK2JlaW5nIHBhcnNlZCksIGFuZCBqdXN0IGFmdGVyLiBTb21lIG9mIHRoZSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIHJldHVybiBhIGJvb2xlYW46CitpZiA8cT50cnVlPC9xPiBpcyByZXR1cm5lZCwgQW50IHdpbGwgdGVybWluYXRlIGltbWVkaWF0ZWx5LCB3aXRob3V0IGVycm9yLgogPC9wPgogCiA8cD4KLUJlaW5nIGNhbGxlZCBkdXJpbmcgYWxsIHRoZXNlIHBoYXNlcywgYW4gPGNvZGU+QXJndW1lbnRQcm9jZXNzb3I8L2NvZGU+Ci1jYW4ganVzdCBwcmludCBzb21lIHNwZWNpZmljIHN5c3RlbSBwcm9wZXJ0aWVzIGFuZCBxdWl0IChsaWtlCi08Y29kZT4tZGlhZ25vc2U8L2NvZGU+KSwgb3IgcHJpbnQgc29tZSBzcGVjaWZpYyBwcm9wZXJ0aWVzIG9mIGEgcHJvamVjdCBhZnRlcgotYmVpbmcgcGFyc2VkIGFuZCBxdWl0IChsaWtlIDxjb2RlPi1wcm9qZWN0SGVscDwvY29kZT4pLCBvciBqdXN0IHNldCBzb21lCitCZWluZyBjYWxsZWQgZHVyaW5nIGFsbCB0aGVzZSBwaGFzZXMsIGFuIDxjb2RlIGNsYXNzPSJjb2RlIj5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gY2FuIGp1c3QgcHJpbnQKK3NvbWUgc3BlY2lmaWMgc3lzdGVtIHByb3BlcnRpZXMgYW5kIHF1aXQgKGxpa2UgPGtiZD4tZGlhZ25vc2U8L2tiZD4pLCBvciBwcmludCBzb21lIHNwZWNpZmljCitwcm9wZXJ0aWVzIG9mIGEgcHJvamVjdCBhZnRlciBiZWluZyBwYXJzZWQgYW5kIHF1aXQgKGxpa2UgPGtiZD4tcHJvamVjdEhlbHA8L2tiZD4pLCBvciBqdXN0IHNldCBzb21lCiBjdXN0b20gcHJvcGVydGllcyBvbiB0aGUgcHJvamVjdCBhbmQgbGV0IGl0IHJ1bi4KIDwvcD4KIAotPGgyPjxhIG5hbWU9InJlcG9zaXRvcnkiPkhvdyB0byByZWdpc3RlciBpdCdzIG93biBBcmd1bWVudFByb2Nlc3NvcjwvYT48L2gyPgorPGgyIGlkPSJyZXBvc2l0b3J5Ij5Ib3cgdG8gcmVnaXN0ZXIgaXQncyBvd24gQXJndW1lbnRQcm9jZXNzb3I8L2gyPgogCi08cD5GaXJzdCwgdGhlIDxjb2RlPkFyZ3VtZW50UHJvY2Vzc29yPC9jb2RlPiBtdXN0IGJlIGFuIGltcGxlbWVudGF0aW9uIG9mCi08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4uCis8cD5GaXJzdCwgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4gbXVzdCBiZSBhbiBpbXBsZW1lbnRhdGlvbgorb2YgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LkFyZ3VtZW50UHJvY2Vzc29yPC9jb2RlPi4KIDwvcD4KIAotPHA+VGhlbiB0byBkZWNhcmUgaXQ6IGNyZWF0ZSBhIGZpbGUKLTxjb2RlPk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LkFyZ3VtZW50UHJvY2Vzc29yPC9jb2RlPiB3aGljaAotY29udGFpbnMgb25seSBvbmUgbGluZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZQotaW1wbGVtZW50YXRpb24uIFRoaXMgZmlsZSB0b2dldGhlciB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuZWVkIHRoZW4gdG8KLWJlIGZvdW5kIGluIEFudCdzIGNsYXNzcGF0aC4KKzxwPlRoZW4gdG8gZGVjbGFyZSBpdDogY3JlYXRlIGEKK2ZpbGUgPHNhbXA+TUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS50b29scy5hbnQuQXJndW1lbnRQcm9jZXNzb3I8L3NhbXA+IHdoaWNoIGNvbnRhaW5zIG9ubHkgb25lCitsaW5lIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2YgdGhlIGltcGxlbWVudGF0aW9uLiBUaGlzIGZpbGUgdG9nZXRoZXIgd2l0aCB0aGUKK2ltcGxlbWVudGF0aW9uIGNsYXNzIG5lZWQgdGhlbiB0byBiZSBmb3VuZCBpbiBBbnQncyBjbGFzc3BhdGguCiA8L3A+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9iYXNlX3Rhc2tfY2xhc3Nlcy5odG1sIGIvbWFudWFsL2Jhc2VfdGFza19jbGFzc2VzLmh0bWwKaW5kZXggMWIwNThlYi4uYzAxYWY2MSAxMDA2NDQKLS0tIGEvbWFudWFsL2Jhc2VfdGFza19jbGFzc2VzLmh0bWwKKysrIGIvbWFudWFsL2Jhc2VfdGFza19jbGFzc2VzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+VGFza3MgRGVzaWduZWQgZm9yIEV4dGVuc2lvbjwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yOSwxNSArMjksMTEgQEAKIAogPHA+PHN0cm9uZz5UaGUgbGlua3Mgd2lsbCBub3Qgd29yayBpbiB0aGUgb25saW5lIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudC48L3N0cm9uZz48L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiPgorPHRhYmxlPgogPHRoZWFkPgogPHRyPgotPHRoPgotQ2xhc3MKLTwvdGg+Ci08dGg+Ci1EZXNjcmlwdGlvbgotPC90aD4KKzx0aCBzY29wZT0iY29sIj5DbGFzczwvdGg+Cis8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogPC90cj4KIDwvdGhlYWQ+CiA8dGJvZHk+CkBAIC01NSw3ICs1MSw3IEBACiA8YSBocmVmPSJhcGkvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQWJzdHJhY3RDdnNUYXNrLmh0bWwiPkFic3RyYWN0Q3ZzVGFzazwvYT4KIDwvdGQ+CiA8dGQ+Ci1Bbm90aGVyIHRhc2sgY2FuIGV4dGVuZCB0aGlzIHdpdGggc29tZSBjdXN0b21pemVkIG91dHB1dCBwcm9jZXNzaW5nCitBbm90aGVyIHRhc2sgY2FuIGV4dGVuZCB0aGlzIHdpdGggc29tZSBjdXN0b21pemVkIG91dHB1dCBwcm9jZXNzaW5nLgogPC90ZD4KIDwvdHI+CiAKQEAgLTg2LDcgKzgyLDYgQEAKIDwvdGQ+CiA8L3RyPgogCi0KIDx0cj4KIDx0ZD4KIDxhIGhyZWY9ImFwaS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnBhY2suaHRtbCI+VW5wYWNrPC9hPgpAQCAtMTA0LDExICs5OSw4IEBACiBBYnN0cmFjdCBCYXNlIGNsYXNzIGZvciB0YXNrcyB0aGF0IG1heSBoYXZlIG11bHRpcGxlIGFjdGlvbnMuCiA8L3RkPgogPC90cj4KLQogPC90Ym9keT4KIDwvdGFibGU+CiAKLQotCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvY2xvbmV2bS5odG1sIGIvbWFudWFsL2Nsb25ldm0uaHRtbAppbmRleCBiMGE1MzQyLi5iNzAyZDI3IDEwMDY0NAotLS0gYS9tYW51YWwvY2xvbmV2bS5odG1sCisrKyBiL21hbnVhbC9jbG9uZXZtLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzOSArMTUsMzUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPmFudC5idWlsZC5jbG9uZXZtPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJjbG9uZXZtIj5hbnQuYnVpbGQuY2xvbmV2bTwvYT48L2gyPgorPGgyIGlkPSJjbG9uZXZtIj5hbnQuYnVpbGQuY2xvbmV2bTwvaDI+CiAKIDxwPjxlbT5TaW5jZSBBcGFjaGUgQW50IDEuNzwvZW0+PC9wPgogCi08cD5UaGUgdmFsdWUgb2YgdGhlIGFudC5idWlsZC5jbG9uZXZtIHN5c3RlbSBwcm9wZXJ0eSBjb250cm9scyBob3cgQW50Ci1pbnN0cnVtZW50cyBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmVzLiAgVGhlIDxhCi1ocmVmPSJUYXNrcy9qYXZhLmh0bWwiPmphdmE8L2E+IGFuZCA8YQotaHJlZj0iVGFza3MvanVuaXQuaHRtbCI+anVuaXQ8L2E+IHRhc2tzIHN1cHBvcnQgY2xvbmV2bQotYXR0cmlidXRlcyB0byBjb250cm9sIHRoZSBWTXMgb24gYSB0YXNrLWJ5LXRhc2sgYmFzaXMgd2hpbGUgdGhlIHN5c3RlbQotcHJvcGVydHkgYXBwbGllcyB0byBhbGwgZm9ya2VkIEphdmEgVk1zLjwvcD4KKzxwPlRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YW50LmJ1aWxkLmNsb25ldm08L2NvZGU+IHN5c3RlbSBwcm9wZXJ0eQorY29udHJvbHMgaG93IEFudCBpbnN0cnVtZW50cyBmb3JrZWQgSlZNcy4gIFRoZSA8YSBocmVmPSJUYXNrcy9qYXZhLmh0bWwiPmphdmE8L2E+CithbmQgPGEgaHJlZj0iVGFza3MvanVuaXQuaHRtbCI+anVuaXQ8L2E+IHRhc2tzIHN1cHBvcnQgPHZhcj5jbG9uZXZtPC92YXI+CithdHRyaWJ1dGVzIHRvIGNvbnRyb2wgSlZNcyBvbiBhIHRhc2stYnktdGFzayBiYXNpcyB3aGlsZSB0aGUgc3lzdGVtCitwcm9wZXJ0eSBhcHBsaWVzIHRvIGFsbCBmb3JrZWQgSlZNcy48L3A+CiAKLTxwPklmIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgdHJ1ZSwgdGhlbiBhbGwgc3lzdGVtIHByb3BlcnRpZXMgb2YKLXRoZSBmb3JrZWQgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUgSmF2YQotVk0gcnVubmluZyBBbnQuICBJbiBhZGRpdGlvbiwgaWYgeW91IHNldCBhbnQuYnVpbGQuY2xvbmV2bSB0byB0cnVlIGFuZCA8YQotaHJlZj0ic3lzY2xhc3NwYXRoLmh0bWwiPmJ1aWxkLnN5c2NsYXNzcGF0aDwvYT4gaGFzIG5vdCBiZWVuIHNldCwgdGhlCi1ib290Y2xhc3NwYXRoIG9mIGZvcmtlZCBKYXZhIFZNcyBnZXRzIGNvbnN0cnVjdGVkIGFzIGlmCi1idWlsZC5zeXNjbGFzc3BhdGggaGFkIHRoZSB2YWx1ZSAibGFzdCIuPC9wPgorPHA+SWYgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyA8cT50cnVlPC9xPiwgdGhlbiBhbGwgc3lzdGVtIHByb3BlcnRpZXMgb2YKK3RoZSBmb3JrZWQgSlZNIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhvc2Ugb2YgdGhlIEpWTSBydW5uaW5nIEFudC4gSW4KK2FkZGl0aW9uLCBpZiB5b3Ugc2V0IDxjb2RlPmFudC5idWlsZC5jbG9uZXZtPC9jb2RlPiB0byA8cT50cnVlPC9xPgorYW5kIDxhIGhyZWY9InN5c2NsYXNzcGF0aC5odG1sIj5idWlsZC5zeXNjbGFzc3BhdGg8L2E+IGhhcyBub3QgYmVlbgorc2V0LCB0aGUgPHZhcj5ib290Y2xhc3NwYXRoPC92YXI+IG9mIGZvcmtlZCBKVk1zIGdldHMgY29uc3RydWN0ZWQgYXMKK2lmIDxjb2RlPmJ1aWxkLnN5c2NsYXNzcGF0aDwvY29kZT4gaGFkIHRoZSB2YWx1ZSA8cT5sYXN0PC9xPi48L3A+CiAKIDxwPk5vdGUgdGhhdCB0aGlzIGhhcyB0byBiZSBhIHN5c3RlbSBwcm9wZXJ0eSwgc28gaXQgY2Fubm90IGJlCi1zcGVjaWZpZWQgb24gdGhlIEFudCBjb21tYW5kIGxpbmUuICBVc2UgdGhlIEFOVF9PUFRTIGVudmlyb25tZW50Ci12YXJpYWJsZSBpbnN0ZWFkLjwvcD4KLQorc3BlY2lmaWVkIG9uIHRoZSBBbnQgY29tbWFuZCBsaW5lLiAgVXNlIHRoZSA8Y29kZT5BTlRfT1BUUzwvY29kZT4KK2Vudmlyb25tZW50IHZhcmlhYmxlIGluc3RlYWQuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9jb25jZXB0c3R5cGVzbGlzdC5odG1sIGIvbWFudWFsL2NvbmNlcHRzdHlwZXNsaXN0Lmh0bWwKaW5kZXggYWU2Y2ExYS4uZDdmZmFlNCAxMDA2NDQKLS0tIGEvbWFudWFsL2NvbmNlcHRzdHlwZXNsaXN0Lmh0bWwKKysrIGIvbWFudWFsL2NvbmNlcHRzdHlwZXNsaXN0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KIDx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CmRpZmYgLS1naXQgYS9tYW51YWwvY292ZXIuaHRtbCBiL21hbnVhbC9jb3Zlci5odG1sCmluZGV4IGZjMDc0YTMuLjc2ZDA3MTMgMTAwNjQ0Ci0tLSBhL21hbnVhbC9jb3Zlci5odG1sCisrKyBiL21hbnVhbC9jb3Zlci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMzkgKzE1LDMwIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KLTx0aXRsZT5BcGFjaGUgQW50IDEuOS4xNSBVc2VyIE1hbnVhbDwvdGl0bGU+Cis8dGl0bGU+QXBhY2hlIEFudCAxLjEwLjggVXNlciBNYW51YWw8L3RpdGxlPgogPC9oZWFkPgogCi08Ym9keSBiZ2NvbG9yPSIjRkZGRkZGIj4KLTxkaXYgYWxpZ249ImNlbnRlciI+IAotICA8aDE+PGltZyBzcmM9ImltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIHdpZHRoPSIxOTAiIGhlaWdodD0iMTIwIj48L2gxPgotICA8aDE+QXBhY2hlIEFudCZ0cmFkZTsgMS45LjE1IE1hbnVhbDwvaDE+Ci0gIDxwIGFsaWduPSJsZWZ0Ij5UaGlzIGlzIHRoZSBtYW51YWwgZm9yIHZlcnNpb24gMS45LjE1IG9mCi0gIDxhIHRhcmdldD0iX3RvcCIgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiPkFwYWNoZSBBbnQ8L2E+LiAKLSAgICBJZiB5b3VyIHZlcnNpb24gCi0gICAgb2YgQW50IChhcyB2ZXJpZmllZCB3aXRoIDx0dD5hbnQgLXZlcnNpb248L3R0PikgaXMgb2xkZXIgb3IgbmV3ZXIgdGhhbiB0aGlzIAotICAgIHZlcnNpb24gdGhlbiB0aGlzIGlzIG5vdCB0aGUgY29ycmVjdCBtYW51YWwgc2V0LiBQbGVhc2UgdXNlIHRoZSBkb2N1bWVudGF0aW9uIAotICAgIGFwcHJvcHJpYXRlIHRvIHlvdXIgY3VycmVudCB2ZXJzaW9uLiBBbHNvLCBpZiB5b3UgYXJlIHVzaW5nIGEgdmVyc2lvbgotICAgIG9sZGVyIHRoYW4gdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UsIHdlIHJlY29tbWVuZCBhbiB1cGdyYWRlIHRvIGZpeCBidWdzCi0gICAgYXMgd2VsbCBhcyBwcm92aWRlIG5ldyBmdW5jdGlvbmFsaXR5LiA8L3A+Ci0gIDxwPiZuYnNwOzwvcD4KKzxib2R5PgorICA8aDEgY2xhc3M9ImNlbnRlciI+PGltZyBzcmM9ImltYWdlcy9hbnRfbG9nb19sYXJnZS5naWYiIHdpZHRoPSIxOTAiIGhlaWdodD0iMTIwIiBhbHQ9IkFwYWNoZSBBbnQgbG9nbyI+PC9oMT4KKyAgPGgxIGNsYXNzPSJjZW50ZXIiPkFwYWNoZSBBbnQmdHJhZGU7IDEuMTAuOCBNYW51YWw8L2gxPgorICA8cD5UaGlzIGlzIHRoZSBtYW51YWwgZm9yIHZlcnNpb24gMS4xMC44IG9mIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIiB0YXJnZXQ9Il90b3AiPkFwYWNoZSBBbnQ8L2E+LiBJZiB5b3VyCisgICAgdmVyc2lvbiBvZiBBbnQgKGFzIHZlcmlmaWVkIHdpdGggPGtiZD5hbnQgLXZlcnNpb248L2tiZD4pIGlzIG9sZGVyIG9yIG5ld2VyIHRoYW4gdGhpcyB2ZXJzaW9uIHRoZW4gdGhpcyBpcyBub3QgdGhlCisgICAgY29ycmVjdCBtYW51YWwgc2V0LiBQbGVhc2UgdXNlIHRoZSBkb2N1bWVudGF0aW9uIGFwcHJvcHJpYXRlIHRvIHlvdXIgY3VycmVudCB2ZXJzaW9uLiBBbHNvLCBpZiB5b3UgYXJlIHVzaW5nIGEKKyAgICB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlIG1vc3QgcmVjZW50IHJlbGVhc2UsIHdlIHJlY29tbWVuZCBhbiB1cGdyYWRlIHRvIGZpeCBidWdzIGFzIHdlbGwgYXMgcHJvdmlkZSBuZXcKKyAgICBmdW5jdGlvbmFsaXR5LjwvcD4KIAotICA8cCBhbGlnbj0ibGVmdCI+QW50J3MgbWFudWFsIGFuZCBBUEkgZG9jdW1lbnRhdGlvbiBpcyBwYXJ0IG9mCi0gICAgdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kiPmJpbmFyeTwvYT4KLSAgICBkaXN0cmlidXRpb25zIG9yIGF2YWlsYWJsZSBhcyBhCi0gICAgc2VwYXJhdGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbGRvd25sb2FkLmNnaSI+YXJjaGl2ZTwvYT4uCi0gICAgTWFudWFscyBmb3Igb2xkZXIgcmVsZWFzZXMgYXJlIGF2YWlsYWJsZSBmb3IKLSAgICBkb3dubG9hZAotICAgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9iaW5kb3dubG9hZC5jZ2kjT2xkIEFudCBSZWxlYXNlcyI+YXMKLSAgICAgIHdlbGw8L2E+LjwvcD4KKyAgPHA+QW50J3MgbWFudWFsIGFuZCBBUEkgZG9jdW1lbnRhdGlvbiBpcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSIKKyAgICAgdGFyZ2V0PSJfdG9wIj5iaW5hcnk8L2E+IGRpc3RyaWJ1dGlvbnMgb3IgYXZhaWxhYmxlIGFzIGEKKyAgICAgc2VwYXJhdGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWxkb3dubG9hZC5jZ2kiIHRhcmdldD0iX3RvcCI+YXJjaGl2ZTwvYT4uICBNYW51YWxzIGZvciBvbGRlciByZWxlYXNlcworICAgICBhcmUgYXZhaWxhYmxlIGZvciBkb3dubG9hZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSNPbGQlMjBBbnQlMjBSZWxlYXNlcyIgdGFyZ2V0PSJfdG9wIj5hcworICAgICB3ZWxsPC9hPi48L3A+CiAKLSAgPHA+QXBhY2hlIEFudCwgQXBhY2hlIEl2eSwgQW50LCBJdnksIEFwYWNoZSwgdGhlIEFwYWNoZSBmZWF0aGVyIGxvZ28sIGFuZCB0aGUgQXBhY2hlIEFudCBwcm9qZWN0IGxvZ29zIGFyZSB0cmFkZW1hcmtzIG9mIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi48L3A+Ci08L2Rpdj4KKyAgPHAgY2xhc3M9ImNlbnRlciI+QXBhY2hlIEFudCwgQXBhY2hlIEl2eSwgQW50LCBJdnksIEFwYWNoZSwgdGhlIEFwYWNoZSBmZWF0aGVyIGxvZ28sIGFuZCB0aGUgQXBhY2hlIEFudCBwcm9qZWN0IGxvZ29zCisgICAgYXJlIHRyYWRlbWFya3Mgb2YgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLjwvcD4KIAogCiA8L2JvZHk+CmRpZmYgLS1naXQgYS9tYW51YWwvY3JlZGl0cy5odG1sIGIvbWFudWFsL2NyZWRpdHMuaHRtbAppbmRleCBiYjVlY2I4Li43MjcxMTA5IDEwMDY0NAotLS0gYS9tYW51YWwvY3JlZGl0cy5odG1sCisrKyBiL21hbnVhbC9jcmVkaXRzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxOSArMTUsMTkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwgLSBDcmVkaXRzPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08aDE+QXBhY2hlIEFudCBVc2VyIE1hbnVhbDwvaDE+Ci08cD5ieTwvcD4KLTwvZGl2PgorPGgxIGNsYXNzPSJjZW50ZXIiPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L2gxPgorCis8cCBjbGFzcz0iY2VudGVyIj5ieTwvcD4KKwogPCEtLSBOYW1lcyBhcmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLCBvbiBsYXN0IG5hbWUgLS0+CiA8dWw+CiAgIDxsaT5TdGVwaGFuZSBCYWlsbGlleiAoPGEgaHJlZj0ibWFpbHRvOnNiYWlsbGllekBpbWVkaWF0aW9uLmNvbSI+c2JhaWxsaWV6QGltZWRpYXRpb24uY29tPC9hPik8L2xpPgpAQCAtMzcsNyArMzgsNyBAQAogICA8bGk+SmFtZXMgRHVuY2FuIERhdmlkc29uICg8YSBocmVmPSJtYWlsdG86ZHVuY2FuQHgxODAuY29tIj5kdW5jYW5AeDE4MC5jb208L2E+KTwvbGk+CiAgIDxsaT5Ub20gRGltb2NrICg8YSBocmVmPSJtYWlsdG86dGFkMUBjb3JuZWxsLmVkdSI+dGFkMUBjb3JuZWxsLmVkdTwvYT4pPC9saT4KICAgPGxpPlBldGVyIERvbmFsZCAoPGEgaHJlZj0ibWFpbHRvOmRvbmFsZHBAYXBhY2hlLm9yZyI+ZG9uYWxkcEBhcGFjaGUub3JnPC9hPik8L2xpPgotICA8bGk+ZElvbiBHaWxsYXJkICg8YSBocmVmPSJtYWlsdG86ZGlvbkBhcGFjaGUub3JnIj5kaW9uQGFwYWNoZS5vcmc8L2E+KTwvbGk+CisgIDxsaT5EaW9uIEdpbGxhcmQgKDxhIGhyZWY9Im1haWx0bzpkaW9uQGFwYWNoZS5vcmciPmRpb25AYXBhY2hlLm9yZzwvYT4pPC9saT4KICAgPGxpPkVyaWsgSGF0Y2hlciAoPGEgaHJlZj0ibWFpbHRvOmVoYXRjaGVyQGFwYWNoZS5vcmciPmVoYXRjaGVyQGFwYWNoZS5vcmc8L2E+KTwvbGk+CiAgIDxsaT5EaWFuZSBIb2x0ICg8YSBocmVmPSJtYWlsdG86aG9sdGRsQHlhaG9vLmNvbSI+aG9sdGRsQHlhaG9vLmNvbTwvYT4pPC9saT4KICAgPGxpPkJpbGwgS2VsbHkgKDxhIGhyZWY9Im1haWx0bzpiaWxsLmtlbGx5QHNvZnR3aXJlZC1pbmMuY29tIj5iaWxsLmtlbGx5QHNvZnR3aXJlZC1pbmMuY29tPC9hPik8L2xpPgpAQCAtNjAsMTAgKzYxLDcgQEAKICAgPGxpPkNyYWVnIFN0cm9uZyAoPGEgaHJlZj0ibWFpbHRvOmNzdHJvbmdAYXJpZWxwYXJ0bmVycy5jb20iPmNzdHJvbmdAYXJpZWxwYXJ0bmVycy5jb208L2E+KTwvbGk+CiA8L3VsPgogCi08Y2VudGVyPgotPHA+VmVyc2lvbjogMS45LjE1PC9wPgotPC9jZW50ZXI+Ci0KKzxwIGNsYXNzPSJjZW50ZXIiPlZlcnNpb246IDEuMTAuODwvcD4KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL2RldmVsb3AuaHRtbCBiL21hbnVhbC9kZXZlbG9wLmh0bWwKaW5kZXggYWE0Y2ZkNy4uMzNjYzQ4ZCAxMDA2NDQKLS0tIGEvbWFudWFsL2RldmVsb3AuaHRtbAorKysgYi9tYW51YWwvZGV2ZWxvcC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPldyaXRpbmcgWW91ciBPd24gVGFzazwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yNSwyNTggKzI1LDIxMCBAQAogPGJvZHk+CiA8aDE+RGV2ZWxvcGluZyB3aXRoIEFwYWNoZSBBbnQ8L2gxPgogCi08aDI+PGEgbmFtZT0id3JpdGluZ293bnRhc2siPldyaXRpbmcgWW91ciBPd24gVGFzazwvYT48L2gyPgorPGgyIGlkPSJ3cml0aW5nb3dudGFzayI+V3JpdGluZyBZb3VyIE93biBUYXNrPC9oMj4KIDxwPkl0IGlzIHZlcnkgZWFzeSB0byB3cml0ZSB5b3VyIG93biB0YXNrOjwvcD4KIDxvbD4KLSAgPGxpPkNyZWF0ZSBhIEphdmEgY2xhc3MgdGhhdCBleHRlbmRzIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+Ci0gICAgICBvciA8YSBocmVmPSJiYXNlX3Rhc2tfY2xhc3Nlcy5odG1sIj5hbm90aGVyIGNsYXNzPC9hPiB0aGF0IHdhcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZC48L2xpPgorICA8bGk+Q3JlYXRlIGEgSmF2YSBjbGFzcyB0aGF0IGV4dGVuZHMgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+CisgICAgb3IgPGEgaHJlZj0iYmFzZV90YXNrX2NsYXNzZXMuaHRtbCI+YW5vdGhlciBjbGFzczwvYT4gdGhhdCB3YXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQuPC9saT4KIAotICA8bGk+Rm9yIGVhY2ggYXR0cmlidXRlLCB3cml0ZSBhIDxpPnNldHRlcjwvaT4gbWV0aG9kLiBUaGUgc2V0dGVyIG1ldGhvZCBtdXN0IGJlIGEKLSAgICA8Y29kZT5wdWJsaWMgdm9pZDwvY29kZT4gbWV0aG9kIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQuIFRoZQotICAgIG5hbWUgb2YgdGhlIG1ldGhvZCBtdXN0IGJlZ2luIHdpdGggPGNvZGU+c2V0PC9jb2RlPiwgZm9sbG93ZWQgYnkgdGhlCi0gICAgYXR0cmlidXRlIG5hbWUsIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbmFtZSBpbiB1cHBlcmNhc2UsIGFuZCB0aGUgcmVzdCBpbgotICAgIGxvd2VyY2FzZTxhIGhyZWY9IiNmb290bm90ZS0xIj48c3VwPio8L3N1cD48L2E+LiAgVGhhdCBpcywgdG8gc3VwcG9ydCBhbiBhdHRyaWJ1dGUgbmFtZWQKLSAgICA8Y29kZT5maWxlPC9jb2RlPiB5b3UgY3JlYXRlIGEgbWV0aG9kIDxjb2RlPnNldEZpbGU8L2NvZGU+LgotICAgIERlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQsIEFudCB3aWxsIHBlcmZvcm0gc29tZQotICAgIGNvbnZlcnNpb25zIGZvciB5b3UsIHNlZSA8YSBocmVmPSIjc2V0LW1hZ2ljIj5iZWxvdzwvYT4uPC9saT4KKyAgPGxpIGlkPSJmb290bm90ZS0xLWJhY2siPkZvciBlYWNoIGF0dHJpYnV0ZSwgd3JpdGUgYSA8ZW0+c2V0dGVyPC9lbT4gbWV0aG9kLiBUaGUgc2V0dGVyIG1ldGhvZAorICAgIG11c3QgYmUgYSA8Y29kZT5wdWJsaWMgdm9pZDwvY29kZT4gbWV0aG9kIHRoYXQgdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQuIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QKKyAgICBtdXN0IGJlZ2luIHdpdGggPGNvZGU+c2V0PC9jb2RlPiwgZm9sbG93ZWQgYnkgdGhlIGF0dHJpYnV0ZSBuYW1lLCB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YKKyAgICB0aGUgbmFtZSBpbiB1cHBlcmNhc2UsIGFuZCB0aGUgcmVzdCBpbiBsb3dlcmNhc2U8YSBocmVmPSIjZm9vdG5vdGUtMSI+KjwvYT4uICBUaGF0IGlzLCB0bworICAgIHN1cHBvcnQgYW4gYXR0cmlidXRlIG5hbWVkIDx2YXI+ZmlsZTwvdmFyPiB5b3UgY3JlYXRlIGEKKyAgICBtZXRob2QgPGNvZGUgY2xhc3M9ImNvZGUiPnNldEZpbGU8L2NvZGU+LiAgRGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCwgQW50IHdpbGwKKyAgICBwZXJmb3JtIHNvbWUgY29udmVyc2lvbnMgZm9yIHlvdSwgc2VlIDxhIGhyZWY9IiNzZXQtbWFnaWMiPmJlbG93PC9hPi48L2xpPgogCi0gIDxsaT5JZiB5b3VyIHRhc2sgc2hhbGwgY29udGFpbiBvdGhlciB0YXNrcyBhcyBuZXN0ZWQgZWxlbWVudHMgKGxpa2UKLSAgICA8YSBocmVmPSJUYXNrcy9wYXJhbGxlbC5odG1sIj48Y29kZT5wYXJhbGxlbDwvY29kZT48L2E+KSwgeW91cgotICAgIGNsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UKLSAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyPC9jb2RlPi4gIElmIHlvdSBkbyBzbywgeW91cgotICAgIHRhc2sgY2FuIG5vdCBzdXBwb3J0IGFueSBvdGhlciBuZXN0ZWQgZWxlbWVudHMuICBTZWUgCi0gICAgPGEgaHJlZj0iI3Rhc2tjb250YWluZXIiPmJlbG93PC9hPi48L2xpPgorICA8bGk+SWYgeW91ciB0YXNrIHNoYWxsIGNvbnRhaW4gb3RoZXIgdGFza3MgYXMgbmVzdGVkIGVsZW1lbnRzCisgICAgKGxpa2UgPGEgaHJlZj0iVGFza3MvcGFyYWxsZWwuaHRtbCI+PGNvZGU+cGFyYWxsZWw8L2NvZGU+PC9hPiksIHlvdXIgY2xhc3MgbXVzdCBpbXBsZW1lbnQgdGhlCisgICAgaW50ZXJmYWNlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyPC9jb2RlPi4gIElmIHlvdSBkbyBzbywgeW91ciB0YXNrCisgICAgY2FuIG5vdCBzdXBwb3J0IGFueSBvdGhlciBuZXN0ZWQgZWxlbWVudHMuICBTZWUgPGEgaHJlZj0iI3Rhc2tjb250YWluZXIiPmJlbG93PC9hPi48L2xpPgogCi0gIDxsaT5JZiB0aGUgdGFzayBzaG91bGQgc3VwcG9ydCBjaGFyYWN0ZXIgZGF0YSAodGV4dCBuZXN0ZWQgYmV0d2VlbiB0aGUKLSAgICBzdGFydCBlbmQgZW5kIHRhZ3MpLCB3cml0ZSBhIDxjb2RlPnB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nKTwvY29kZT4KLSAgICBtZXRob2QuICBOb3RlIHRoYXQgQW50IGRvZXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZXhwYW5kIHByb3BlcnRpZXMgb24KLSAgICB0aGUgdGV4dCBpdCBwYXNzZXMgdG8gdGhlIHRhc2suPC9saT4KKyAgPGxpPklmIHRoZSB0YXNrIHNob3VsZCBzdXBwb3J0IGNoYXJhY3RlciBkYXRhICh0ZXh0IG5lc3RlZCBiZXR3ZWVuIHRoZSBzdGFydCBhbmQgZW5kIHRhZ3MpLCB3cml0ZQorICAgIGEgPGNvZGUgY2xhc3M9ImNvZGUiPnB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nKTwvY29kZT4gbWV0aG9kLiAgTm90ZSB0aGF0IEFudAorICAgIGRvZXMgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gZXhwYW5kIHByb3BlcnRpZXMgb24gdGhlIHRleHQgaXQgcGFzc2VzIHRvIHRoZSB0YXNrLjwvbGk+CiAKLSAgPGxpPkZvciBlYWNoIG5lc3RlZCBlbGVtZW50LCB3cml0ZSBhIDxpPmNyZWF0ZTwvaT4sIDxpPmFkZDwvaT4gb3IKLSAgICA8aT5hZGRDb25maWd1cmVkPC9pPiBtZXRob2QuICBBIGNyZWF0ZSBtZXRob2QgbXVzdCBiZSBhCi0gICAgPGNvZGU+cHVibGljPC9jb2RlPiBtZXRob2QgdGhhdCB0YWtlcyBubyBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4KLSAgICA8Y29kZT5PYmplY3Q8L2NvZGU+IHR5cGUuIFRoZSBuYW1lIG9mIHRoZSBjcmVhdGUgbWV0aG9kIG11c3QgYmVnaW4KLSAgICB3aXRoIDxjb2RlPmNyZWF0ZTwvY29kZT4sIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50IG5hbWUuIEFuIGFkZCAob3IKLSAgICBhZGRDb25maWd1cmVkKSBtZXRob2QgbXVzdCBiZSBhIDxjb2RlPnB1YmxpYyB2b2lkPC9jb2RlPiBtZXRob2QgdGhhdAotICAgIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IG9mIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdHlwZSB3aXRoIGEKLSAgICBuby1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gIFRoZSBuYW1lIG9mIHRoZSBhZGQgKGFkZENvbmZpZ3VyZWQpIG1ldGhvZAotICAgIG11c3QgYmVnaW4gd2l0aCA8Y29kZT5hZGQ8L2NvZGU+ICg8Y29kZT5hZGRDb25maWd1cmVkPC9jb2RlPiksCi0gICAgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQgbmFtZS4gIEZvciBhIG1vcmUgY29tcGxldGUgZGlzY3Vzc2lvbiBzZWUgCi0gICAgPGEgaHJlZj0iI25lc3RlZC1lbGVtZW50cyI+YmVsb3c8L2E+LjwvbGk+CisgIDxsaT5Gb3IgZWFjaCBuZXN0ZWQgZWxlbWVudCwgd3JpdGUgYSA8ZW0+Y3JlYXRlPC9lbT4sIDxlbT5hZGQ8L2VtPiBvciA8ZW0+YWRkQ29uZmlndXJlZDwvZW0+CisgICAgbWV0aG9kLiAgQSBjcmVhdGUgbWV0aG9kIG11c3QgYmUgYSA8Y29kZT5wdWJsaWM8L2NvZGU+IG1ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyBhbmQKKyAgICByZXR1cm5zIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdHlwZS4gVGhlIG5hbWUgb2YgdGhlIGNyZWF0ZSBtZXRob2QgbXVzdCBiZWdpbgorICAgIHdpdGggPGNvZGU+Y3JlYXRlPC9jb2RlPiwgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQgbmFtZS4gQW4gYWRkIChvciBhZGRDb25maWd1cmVkKSBtZXRob2QgbXVzdCBiZQorICAgIGEgPGNvZGU+cHVibGljIHZvaWQ8L2NvZGU+IG1ldGhvZCB0aGF0IHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IG9mIGFuIDxjb2RlPk9iamVjdDwvY29kZT4gdHlwZQorICAgIHdpdGggYSBuby1hcmd1bWVudCBjb25zdHJ1Y3Rvci4gIFRoZSBuYW1lIG9mIHRoZSBhZGQgKGFkZENvbmZpZ3VyZWQpIG1ldGhvZCBtdXN0IGJlZ2luCisgICAgd2l0aCA8Y29kZT5hZGQ8L2NvZGU+ICg8Y29kZT5hZGRDb25maWd1cmVkPC9jb2RlPiksIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50IG5hbWUuICBGb3IgYSBtb3JlCisgICAgY29tcGxldGUgZGlzY3Vzc2lvbiBzZWUgPGEgaHJlZj0iI25lc3RlZC1lbGVtZW50cyI+YmVsb3c8L2E+LjwvbGk+CiAKLSAgPGxpPldyaXRlIGEgPGNvZGU+cHVibGljIHZvaWQgZXhlY3V0ZTwvY29kZT4gbWV0aG9kLCB3aXRoIG5vIGFyZ3VtZW50cywgdGhhdAotICAgIHRocm93cyBhIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPi4gVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgdGFzawotICAgIGl0c2VsZi48L2xpPgorICA8bGk+V3JpdGUgYSA8Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIHZvaWQgZXhlY3V0ZSgpPC9jb2RlPiBtZXRob2QsIHdpdGggbm8gYXJndW1lbnRzLCB0aGF0IHRocm93cworICAgIGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+LiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSB0YXNrIGl0c2VsZi48L2xpPgogPC9vbD4KIAotPGhyPgotPHA+PGEgbmFtZT0iZm9vdG5vdGUtMSI+KjwvYT4gQWN0dWFsbHkgdGhlIGNhc2Ugb2YgdGhlIGxldHRlcnMgYWZ0ZXIKLXRoZSBmaXJzdCBvbmUgZG9lc24ndCByZWFsbHkgbWF0dGVyIHRvIEFudCwgdXNpbmcgYWxsIGxvd2VyIGNhc2UgaXMgYQotZ29vZCBjb252ZW50aW9uLCB0aG91Z2guPC9wPgorPGhyLz4KKzxwIGlkPSJmb290bm90ZS0xIj48YSBocmVmPSIjZm9vdG5vdGUtMS1iYWNrIj4qPC9hPiBBY3R1YWxseSB0aGUgY2FzZSBvZiB0aGUgbGV0dGVycyBhZnRlciB0aGUgZmlyc3QKK29uZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgdG8gQW50LCB1c2luZyBhbGwgbG93ZXIgY2FzZSBpcyBhIGdvb2QgY29udmVudGlvbiwgdGhvdWdoLjwvcD4KIAogPGgzPlRoZSBMaWZlLWN5Y2xlIG9mIGEgVGFzazwvaDM+CiA8b2w+Ci0gIDxsaT4KLSAgICBUaGUgeG1sIGVsZW1lbnQgdGhhdCBjb250YWlucyB0aGUgdGFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgdGFzayBnZXRzIGNvbnZlcnRlZCB0byBhbiBVbmtub3duRWxlbWVudCBhdCBwYXJzZXIgdGltZS4KLSAgICBUaGlzIFVua25vd25FbGVtZW50IGdldHMgcGxhY2VkIGluIGEgbGlzdCB3aXRoaW4gYSB0YXJnZXQKLSAgICBvYmplY3QsIG9yIHJlY3Vyc2l2ZWx5IHdpdGhpbiBhbm90aGVyIFVua25vd25FbGVtZW50LgotICA8L2xpPgotICA8bGk+Ci0gICAgV2hlbiB0aGUgdGFyZ2V0IGlzIGV4ZWN1dGVkLCBlYWNoIFVua25vd25FbGVtZW50IGlzIGludm9rZWQKLSAgICB1c2luZyBhbiA8Y29kZT5wZXJmb3JtKCk8L2NvZGU+IG1ldGhvZC4gVGhpcyBpbnN0YW50aWF0ZXMKLSAgICB0aGUgdGFzay4gVGhpcyBtZWFucyB0aGF0IHRhc2tzIG9ubHkgZ2V0cwotICAgIGluc3RhbnRpYXRlZCBhdCBydW4gdGltZS4KKyAgPGxpPlRoZSB4bWwgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHRoZSB0YWcgY29ycmVzcG9uZGluZyB0byB0aGUgdGFzayBnZXRzIGNvbnZlcnRlZCB0bworICAgIGFuIDxjb2RlIGNsYXNzPSJjb2RlIj5Vbmtub3duRWxlbWVudDwvY29kZT4gYXQgcGFyc2UgdGltZS4KKyAgICBUaGlzIDxjb2RlIGNsYXNzPSJjb2RlIj5Vbmtub3duRWxlbWVudDwvY29kZT4gZ2V0cyBwbGFjZWQgaW4gYSBsaXN0IHdpdGhpbiBhIHRhcmdldCBvYmplY3QsIG9yCisgICAgcmVjdXJzaXZlbHkgd2l0aGluIGFub3RoZXIgPGNvZGUgY2xhc3M9ImNvZGUiPlVua25vd25FbGVtZW50PC9jb2RlPi4KICAgPC9saT4KIAotICA8bGk+VGhlIHRhc2sgZ2V0cyByZWZlcmVuY2VzIHRvIGl0cyBwcm9qZWN0IGFuZCBsb2NhdGlvbiBpbnNpZGUgdGhlCi0gICAgYnVpbGRmaWxlIHZpYSBpdHMgaW5oZXJpdGVkIDxjb2RlPnByb2plY3Q8L2NvZGU+IGFuZAotICAgIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiB2YXJpYWJsZXMuPC9saT4KKyAgPGxpPldoZW4gdGhlIHRhcmdldCBpcyBleGVjdXRlZCwgZWFjaCA8Y29kZSBjbGFzcz0iY29kZSI+VW5rbm93bkVsZW1lbnQ8L2NvZGU+IGlzIGludm9rZWQgdXNpbmcKKyAgICBhbiA8Y29kZSBjbGFzcz0iY29kZSI+cGVyZm9ybSgpPC9jb2RlPiBtZXRob2QuIFRoaXMgaW5zdGFudGlhdGVzIHRoZSB0YXNrLiBUaGlzIG1lYW5zIHRoYXQgdGFza3MKKyAgICBvbmx5IGdldHMgaW5zdGFudGlhdGVkIGF0IHJ1biB0aW1lLgorICA8L2xpPgogCi0gIDxsaT5JZiB0aGUgdXNlciBzcGVjaWZpZWQgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGlzIHRhc2ssCi0gICAgdGhlIHByb2plY3QKLSAgICByZWdpc3RlcnMgYSByZWZlcmVuY2UgdG8gdGhpcyBuZXdseSBjcmVhdGVkIHRhc2ssIGF0IHJ1bgotICAgIHRpbWUuPC9saT4KKyAgPGxpPlRoZSB0YXNrIGdldHMgcmVmZXJlbmNlcyB0byBpdHMgcHJvamVjdCBhbmQgbG9jYXRpb24gaW5zaWRlIHRoZSBidWlsZGZpbGUgdmlhIGl0cworICAgIGluaGVyaXRlZCA8Y29kZT5wcm9qZWN0PC9jb2RlPiBhbmQgPGNvZGU+bG9jYXRpb248L2NvZGU+IHZhcmlhYmxlcy48L2xpPgogCi0gIDxsaT5UaGUgdGFzayBnZXRzIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgaXQgYmVsb25ncyB0byB2aWEgaXRzCi0gICAgaW5oZXJpdGVkIDxjb2RlPnRhcmdldDwvY29kZT4gdmFyaWFibGUuPC9saT4KKyAgPGxpPklmIHRoZSB1c2VyIHNwZWNpZmllZCBhbiA8dmFyPmlkPC92YXI+IGF0dHJpYnV0ZSB0byB0aGlzIHRhc2ssIHRoZSBwcm9qZWN0IHJlZ2lzdGVycyBhCisgICAgcmVmZXJlbmNlIHRvIHRoaXMgbmV3bHkgY3JlYXRlZCB0YXNrLCBhdCBydW4gdGltZS48L2xpPgogCi0gIDxsaT48Y29kZT5pbml0KCk8L2NvZGU+IGlzIGNhbGxlZCBhdCBydW4gdGltZS48L2xpPgorICA8bGk+VGhlIHRhc2sgZ2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IGl0IGJlbG9uZ3MgdG8gdmlhIGl0cyBpbmhlcml0ZWQgPGNvZGU+dGFyZ2V0PC9jb2RlPgorICAgIHZhcmlhYmxlLjwvbGk+CiAKLSAgPGxpPkFsbCBjaGlsZCBlbGVtZW50cyBvZiB0aGUgWE1MIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhc2sKLSAgICBhcmUgY3JlYXRlZCB2aWEgdGhpcyB0YXNrJ3MgPGNvZGU+Y3JlYXRlWFhYKCk8L2NvZGU+IG1ldGhvZHMgb3IKLSAgICBpbnN0YW50aWF0ZWQgYW5kIGFkZGVkIHRvIHRoaXMgdGFzayB2aWEgaXRzIDxjb2RlPmFkZFhYWCgpPC9jb2RlPgotICAgIG1ldGhvZHMsIGF0IHJ1biB0aW1lLiAgQ2hpbGQgZWxlbWVudHMgY29ycmVzcG9uZGluZwotICAgIHRvIDxjb2RlPmFkZENvbmZpZ3VyZWRYWFgoKTwvY29kZT4gYXJlIGNyZWF0ZWQgYXQgdGhpcyBwb2ludCBidXQKLSAgICB0aGUgYWN0dWFsIDxjb2RlPmFkZENvbmZpZ3VyZWQ8L2NvZGU+IG1ldGhvZCBpcyBub3QgY2FsbGVkLjwvbGk+CisgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+aW5pdCgpPC9jb2RlPiBpcyBjYWxsZWQgYXQgcnVuIHRpbWUuPC9saT4KIAotICA8bGk+QWxsIGF0dHJpYnV0ZXMgb2YgdGhpcyB0YXNrIGdldCBzZXQgdmlhIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAgICA8Y29kZT5zZXRYWFg8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1bnRpbWUuPC9saT4KKyAgPGxpPkFsbCBjaGlsZCBlbGVtZW50cyBvZiB0aGUgWE1MIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhc2sgYXJlIGNyZWF0ZWQgdmlhIHRoaXMKKyAgICB0YXNrJ3MgPGNvZGUgY2xhc3M9ImNvZGUiPmNyZWF0ZVhYWCgpPC9jb2RlPiBtZXRob2RzIG9yIGluc3RhbnRpYXRlZCBhbmQgYWRkZWQgdG8gdGhpcyB0YXNrIHZpYQorICAgIGl0cyA8Y29kZSBjbGFzcz0iY29kZSI+YWRkWFhYKCk8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1biB0aW1lLiAgQ2hpbGQgZWxlbWVudHMgY29ycmVzcG9uZGluZworICAgIHRvIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRDb25maWd1cmVkWFhYKCk8L2NvZGU+IGFyZSBjcmVhdGVkIGF0IHRoaXMgcG9pbnQgYnV0IHRoZQorICAgIGFjdHVhbCA8ZW0+YWRkQ29uZmlndXJlZDwvZW0+IG1ldGhvZCBpcyBub3QgY2FsbGVkLjwvbGk+CiAKLSAgPGxpPlRoZSBjb250ZW50IGNoYXJhY3RlciBkYXRhIHNlY3Rpb25zIGluc2lkZSB0aGUgWE1MIGVsZW1lbnQKLSAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdGFzayBpcyBhZGRlZCB0byB0aGUgdGFzayB2aWEgaXRzCi0gICAgPGNvZGU+YWRkVGV4dDwvY29kZT4gbWV0aG9kLCBhdCBydW50aW1lLjwvbGk+CisgIDxsaT5BbGwgYXR0cmlidXRlcyBvZiB0aGlzIHRhc2sgZ2V0IHNldCB2aWEgdGhlaXIgY29ycmVzcG9uZGluZyA8Y29kZSBjbGFzcz0iY29kZSI+c2V0WFhYKCk8L2NvZGU+CisgICAgbWV0aG9kcywgYXQgcnVuIHRpbWUuPC9saT4KIAotICA8bGk+QWxsIGF0dHJpYnV0ZXMgb2YgYWxsIGNoaWxkIGVsZW1lbnRzIGdldCBzZXQgdmlhIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAgICA8Y29kZT5zZXRYWFg8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1bnRpbWUuPC9saT4KKyAgPGxpPlRoZSBjb250ZW50IGNoYXJhY3RlciBkYXRhIHNlY3Rpb25zIGluc2lkZSB0aGUgWE1MIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhc2sgaXMgYWRkZWQKKyAgICB0byB0aGUgdGFzayB2aWEgaXRzIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRUZXh0KCk8L2NvZGU+IG1ldGhvZCwgYXQgcnVuIHRpbWUuPC9saT4KIAotICA8bGk+SWYgY2hpbGQgZWxlbWVudHMgb2YgdGhlIFhNTCBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyB0YXNrCi0gICAgaGF2ZSBiZWVuIGNyZWF0ZWQgZm9yIDxjb2RlPmFkZENvbmZpZ3VyZWRYWFgoKTwvY29kZT4gbWV0aG9kcywKLSAgICB0aG9zZSBtZXRob2RzIGdldCBpbnZva2VkIG5vdy48L2xpPgorICA8bGk+QWxsIGF0dHJpYnV0ZXMgb2YgYWxsIGNoaWxkIGVsZW1lbnRzIGdldCBzZXQgdmlhIHRoZWlyCisgICAgY29ycmVzcG9uZGluZyA8Y29kZSBjbGFzcz0iY29kZSI+c2V0WFhYKCk8L2NvZGU+IG1ldGhvZHMsIGF0IHJ1biB0aW1lLjwvbGk+CiAKLSAgPGxpPjxhIG5hbWU9ImV4ZWN1dGUiPjxjb2RlPmV4ZWN1dGUoKTwvY29kZT48L2E+IGlzIGNhbGxlZCBhdCBydW50aW1lLgotICAgIElmIDxjb2RlPnRhcmdldDE8L2NvZGU+IGFuZCA8Y29kZT50YXJnZXQyPC9jb2RlPiBib3RoIGRlcGVuZAotICAgIG9uIDxjb2RlPnRhcmdldDM8L2NvZGU+LCB0aGVuIHJ1bm5pbmcKLSAgICA8Y29kZT4nYW50IHRhcmdldDEgdGFyZ2V0Mic8L2NvZGU+IHdpbGwgcnVuIGFsbCB0YXNrcyBpbgotICAgIDxjb2RlPnRhcmdldDM8L2NvZGU+IHR3aWNlLjwvbGk+CisgIDxsaT5JZiBjaGlsZCBlbGVtZW50cyBvZiB0aGUgWE1MIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIHRhc2sgaGF2ZSBiZWVuIGNyZWF0ZWQKKyAgICBmb3IgPGNvZGUgY2xhc3M9ImNvZGUiPmFkZENvbmZpZ3VyZWRYWFgoKTwvY29kZT4gbWV0aG9kcywgdGhvc2UgbWV0aG9kcyBnZXQgaW52b2tlZCBub3cuPC9saT4KKworICA8bGkgaWQ9ImV4ZWN1dGUiPjxjb2RlIGNsYXNzPSJjb2RlIj5leGVjdXRlKCk8L2NvZGU+IGlzIGNhbGxlZCBhdCBydW4gdGltZS4gIElmIDxxPnRhcmdldDE8L3E+CisgICAgYW5kIDxxPnRhcmdldDI8L3E+IGJvdGggZGVwZW5kIG9uIDxxPnRhcmdldDM8L3E+LCB0aGVuIHJ1bm5pbmcgPGtiZD5hbnQgdGFyZ2V0MSB0YXJnZXQyPC9rYmQ+CisgICAgd2lsbCBydW4gYWxsIHRhc2tzIGluIDxxPnRhcmdldDM8L3E+IHR3aWNlLjwvbGk+CiA8L29sPgogCi08aDM+PGEgbmFtZT0ic2V0LW1hZ2ljIj5Db252ZXJzaW9ucyBBbnQgd2lsbCBwZXJmb3JtIGZvciBhdHRyaWJ1dGVzPC9hPjwvaDM+Cis8aDMgaWQ9InNldC1tYWdpYyI+Q29udmVyc2lvbnMgQW50IHdpbGwgcGVyZm9ybSBmb3IgYXR0cmlidXRlczwvaDM+CiAKLTxwPkFudCB3aWxsIGFsd2F5cyBleHBhbmQgcHJvcGVydGllcyBiZWZvcmUgaXQgcGFzc2VzIHRoZSB2YWx1ZSBvZiBhbgotYXR0cmlidXRlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNldHRlciBtZXRob2QuIDxiPlNpbmNlIEFudCAxLjg8L2I+LCBpdCBpcwotcG9zc2libGUgdG8gPGEgaHJlZj0iVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbCI+ZXh0ZW5kIEFudCdzIHByb3BlcnR5IGhhbmRsaW5nPC9hPgotc3VjaCB0aGF0IGEgbm9uLXN0cmluZyBPYmplY3QgbWF5IGJlIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24gb2YgYSBzdHJpbmcKLWNvbnRhaW5pbmcgYSBzaW5nbGUgcHJvcGVydHkgcmVmZXJlbmNlLiBUaGVzZSB3aWxsIGJlIGFzc2lnbmVkIGRpcmVjdGx5IHZpYQotc2V0dGVyIG1ldGhvZHMgb2YgbWF0Y2hpbmcgdHlwZS4gU2luY2UgaXQgcmVxdWlyZXMgc29tZSBiZXlvbmQtdGhlLWJhc2ljcwotaW50ZXJ2ZW50aW9uIHRvIGVuYWJsZSB0aGlzIGJlaGF2aW9yLCBpdCBtYXkgYmUgYSBnb29kIGlkZWEgdG8gZmxhZyBhdHRyaWJ1dGVzCi1pbnRlbmRlZCB0byBwZXJtaXQgdGhpcyB1c2FnZSBwYXJhZGlnbS4KLTwvcD4KKzxwPkFudCB3aWxsIGFsd2F5cyBleHBhbmQgcHJvcGVydGllcyBiZWZvcmUgaXQgcGFzc2VzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgdG8gdGhlIGNvcnJlc3BvbmRpbmcKK3NldHRlciBtZXRob2QuIDxlbT5TaW5jZSBBbnQgMS44PC9lbT4sIGl0IGlzIHBvc3NpYmxlIHRvIDxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5aGVscGVyLmh0bWwiPmV4dGVuZAorQW50J3MgcHJvcGVydHkgaGFuZGxpbmc8L2E+IHN1Y2ggdGhhdCBhIG5vbi1zdHJpbmcgT2JqZWN0IG1heSBiZSB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG9mIGEKK3N0cmluZyBjb250YWluaW5nIGEgc2luZ2xlIHByb3BlcnR5IHJlZmVyZW5jZS4gVGhlc2Ugd2lsbCBiZSBhc3NpZ25lZCBkaXJlY3RseSB2aWEgc2V0dGVyIG1ldGhvZHMgb2YKK21hdGNoaW5nIHR5cGUuIFNpbmNlIGl0IHJlcXVpcmVzIHNvbWUgYmV5b25kLXRoZS1iYXNpY3MgaW50ZXJ2ZW50aW9uIHRvIGVuYWJsZSB0aGlzIGJlaGF2aW9yLCBpdCBtYXkKK2JlIGEgZ29vZCBpZGVhIHRvIGZsYWcgYXR0cmlidXRlcyBpbnRlbmRlZCB0byBwZXJtaXQgdGhpcyB1c2FnZSBwYXJhZGlnbS48L3A+CiAKLTxwPlRoZSBtb3N0IGNvbW1vbiB3YXkgdG8gd3JpdGUgYW4gYXR0cmlidXRlIHNldHRlciBpcyB0byB1c2UgYQotPGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gYXJndW1lbnQuICBJbiB0aGlzIGNhc2UgQW50IHdpbGwgcGFzcwotdGhlIGxpdGVyYWwgdmFsdWUgKGFmdGVyIHByb3BlcnR5IGV4cGFuc2lvbikgdG8geW91ciB0YXNrLiAgQnV0IHRoZXJlCi1pcyBtb3JlISAgSWYgdGhlIGFyZ3VtZW50IG9mIHlvdSBzZXR0ZXIgbWV0aG9kIGlzPC9wPgorPHA+VGhlIG1vc3QgY29tbW9uIHdheSB0byB3cml0ZSBhbiBhdHRyaWJ1dGUgc2V0dGVyIGlzIHRvIHVzZQorYSA8Y29kZSBjbGFzcz0iY29kZSI+amF2YS5sYW5nLlN0cmluZzwvY29kZT4gYXJndW1lbnQuICBJbiB0aGlzIGNhc2UgQW50IHdpbGwgcGFzcyB0aGUgbGl0ZXJhbCB2YWx1ZQorKGFmdGVyIHByb3BlcnR5IGV4cGFuc2lvbikgdG8geW91ciB0YXNrLiAgQnV0IHRoZXJlIGlzIG1vcmUhICBJZiB0aGUgYXJndW1lbnQgb2YgeW91IHNldHRlciBtZXRob2QKK2lzPC9wPgogCiA8dWw+CisgIDxsaT48Y29kZT5ib29sZWFuPC9jb2RlPiwgeW91ciBtZXRob2Qgd2lsbCBiZSBwYXNzZWQgdGhlIHZhbHVlIDxxPnRydWU8L3E+IGlmIHRoZSB2YWx1ZSBzcGVjaWZpZWQKKyAgICBpbiB0aGUgYnVpbGQgZmlsZSBpcyBvbmUgb2YgPHE+dHJ1ZTwvcT4sIDxxPnllczwvcT4sIG9yIDxxPm9uPC9xPiBhbmQgPHE+ZmFsc2U8L3E+CisgICAgb3RoZXJ3aXNlLjwvbGk+CiAKLSAgPGxpPjxjb2RlPmJvb2xlYW48L2NvZGU+LCB5b3VyIG1ldGhvZCB3aWxsIGJlIHBhc3NlZCB0aGUgdmFsdWUKLSAgPGk+dHJ1ZTwvaT4gaWYgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSBpcyBvbmUgb2YKLSAgPGNvZGU+dHJ1ZTwvY29kZT4sIDxjb2RlPnllczwvY29kZT4sIG9yIDxjb2RlPm9uPC9jb2RlPiBhbmQKLSAgPGk+ZmFsc2U8L2k+IG90aGVyd2lzZS48L2xpPgorICA8bGk+PGNvZGU+Y2hhcjwvY29kZT4gb3IgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEubGFuZy5DaGFyYWN0ZXI8L2NvZGU+LCB5b3VyIG1ldGhvZCB3aWxsIGJlIHBhc3NlZAorICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZS48L2xpPgogCi0gIDxsaT48Y29kZT5jaGFyPC9jb2RlPiBvciA8Y29kZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9jb2RlPiwgeW91cgotICBtZXRob2Qgd2lsbCBiZSBwYXNzZWQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGluCi0gIHRoZSBidWlsZCBmaWxlLjwvbGk+CisgIDxsaT5hbnkgb3RoZXIgcHJpbWl0aXZlIHR5cGUgKDxjb2RlIGNsYXNzPSJjb2RlIj5pbnQ8L2NvZGU+LCA8Y29kZSBjbGFzcz0iY29kZSI+c2hvcnQ8L2NvZGU+IGFuZAorICAgIHNvIG9uKSwgQW50IHdpbGwgY29udmVydCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpbnRvIHRoaXMgdHlwZSwgdGh1cyBtYWtpbmcgc3VyZSB0aGF0IHlvdSdsbAorICAgIG5ldmVyIHJlY2VpdmUgaW5wdXQgdGhhdCBpcyBub3QgYSBudW1iZXIgZm9yIHRoYXQgYXR0cmlidXRlLjwvbGk+CiAKLSAgPGxpPmFueSBvdGhlciBwcmltaXRpdmUgdHlwZSAoPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+c2hvcnQ8L2NvZGU+Ci0gIGFuZCBzbyBvbiksIEFudCB3aWxsIGNvbnZlcnQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW50byB0aGlzCi0gIHR5cGUsIHRodXMgbWFraW5nIHN1cmUgdGhhdCB5b3UnbGwgbmV2ZXIgcmVjZWl2ZSBpbnB1dCB0aGF0IGlzIG5vdCBhCi0gIG51bWJlciBmb3IgdGhhdCBhdHRyaWJ1dGUuPC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLmlvLkZpbGU8L2NvZGU+LCBBbnQgd2lsbCBmaXJzdCBkZXRlcm1pbmUgd2hldGhlciB0aGUgdmFsdWUgZ2l2ZW4gaW4KKyAgICB0aGUgYnVpbGQgZmlsZSByZXByZXNlbnRzIGFuIGFic29sdXRlIHBhdGggbmFtZS4gIElmIG5vdCwgQW50IHdpbGwgaW50ZXJwcmV0IHRoZSB2YWx1ZSBhcyBhIHBhdGgKKyAgICBuYW1lIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MgPHZhcj5iYXNlZGlyPC92YXI+LjwvbGk+CiAKLSAgPGxpPjxjb2RlPmphdmEuaW8uRmlsZTwvY29kZT4sIEFudCB3aWxsIGZpcnN0IGRldGVybWluZSB3aGV0aGVyIHRoZQotICB2YWx1ZSBnaXZlbiBpbiB0aGUgYnVpbGQgZmlsZSByZXByZXNlbnRzIGFuIGFic29sdXRlIHBhdGggbmFtZS4gIElmCi0gIG5vdCwgQW50IHdpbGwgaW50ZXJwcmV0IHRoZSB2YWx1ZSBhcyBhIHBhdGggbmFtZSByZWxhdGl2ZSB0byB0aGUKLSAgcHJvamVjdCdzIGJhc2VkaXIuPC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTwvY29kZT4sIEFudCB3aWxsIHJlc29sdmUgdGhlIHN0cmluZyBhcworICAgIGEgPGNvZGUgY2xhc3M9ImNvZGUiPmphdmEuaW8uRmlsZTwvY29kZT4gYXMgYWJvdmUsIHRoZW4gcGFzcyBpbiBhcworICAgIGEgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U8L2NvZGU+LiAgPGVtPlNpbmNlIEFudAorICAgIDEuODwvZW0+PC9saT4KIAotICA8bGk+PGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U8L2NvZGU+Ci0gIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlPC9jb2RlPiwgQW50IHdpbGwKLSAgcmVzb2x2ZSB0aGUgc3RyaW5nIGFzIGEgPGNvZGU+amF2YS5pby5GaWxlPC9jb2RlPiBhcyBhYm92ZSwgdGhlbgotICBwYXNzIGluIGFzIGEgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTwvY29kZT4uCi0gIDxiPlNpbmNlIEFudCAxLjg8L2I+Ci0gIDwvbGk+CisgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDwvY29kZT4sIEFudCB3aWxsIHRva2VuaXplIHRoZSB2YWx1ZQorICAgIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSwgYWNjZXB0aW5nIDxxPjo8L3E+IGFuZCA8cT47PC9xPiBhcyBwYXRoIHNlcGFyYXRvcnMuICBSZWxhdGl2ZSBwYXRoCisgICAgbmFtZXMgd2lsbCBiZSBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIDx2YXI+YmFzZWRpcjwvdmFyPi48L2xpPgogCi0gIDxsaT48Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoPC9jb2RlPiwgQW50IHdpbGwgdG9rZW5pemUKLSAgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZSwgYWNjZXB0aW5nIDxjb2RlPjo8L2NvZGU+IGFuZAotICA8Y29kZT47PC9jb2RlPiBhcyBwYXRoIHNlcGFyYXRvcnMuICBSZWxhdGl2ZSBwYXRoIG5hbWVzIHdpbGwgYmUKLSAgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBiYXNlZGlyLjwvbGk+CisgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+amF2YS5sYW5nLkNsYXNzPC9jb2RlPiwgQW50IHdpbGwgaW50ZXJwcmV0IHRoZSB2YWx1ZSBnaXZlbiBpbiB0aGUgYnVpbGQKKyAgICBmaWxlIGFzIGEgSmF2YSBjbGFzcyBuYW1lIGFuZCBsb2FkIHRoZSBuYW1lZCBjbGFzcyBmcm9tIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyLjwvbGk+CiAKLSAgPGxpPjxjb2RlPmphdmEubGFuZy5DbGFzczwvY29kZT4sIEFudCB3aWxsIGludGVycHJldCB0aGUgdmFsdWUKLSAgZ2l2ZW4gaW4gdGhlIGJ1aWxkIGZpbGUgYXMgYSBKYXZhIGNsYXNzIG5hbWUgYW5kIGxvYWQgdGhlIG5hbWVkCi0gIGNsYXNzIGZyb20gdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIuPC9saT4KKyAgPGxpPmFueSBvdGhlciB0eXBlIHRoYXQgaGFzIGEgY29uc3RydWN0b3Igd2l0aCBhIHNpbmdsZSA8Y29kZSBjbGFzcz0iY29kZSI+U3RyaW5nPC9jb2RlPiBhcmd1bWVudCwKKyAgICBBbnQgd2lsbCB1c2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgdmFsdWUgZ2l2ZW4gaW4gdGhlIGJ1aWxkCisgICAgZmlsZS48L2xpPgogCi0gIDxsaT5hbnkgb3RoZXIgdHlwZSB0aGF0IGhhcyBhIGNvbnN0cnVjdG9yIHdpdGggYSBzaW5nbGUKLSAgPGNvZGU+U3RyaW5nPC9jb2RlPiBhcmd1bWVudCwgQW50IHdpbGwgdXNlIHRoaXMgY29uc3RydWN0b3IgdG8KLSAgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBidWlsZCBmaWxlLjwvbGk+CisgIDxsaT5BIHN1YmNsYXNzIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlPC9jb2RlPiwgQW50CisgICAgd2lsbCBpbnZva2UgdGhpcyBjbGFzcydzIDxjb2RlIGNsYXNzPSJjb2RlIj5zZXRWYWx1ZTwvY29kZT4gbWV0aG9kLiAgVXNlIHRoaXMgaWYgeW91ciB0YXNrCisgICAgc2hvdWxkIHN1cHBvcnQgZW51bWVyYXRlZCBhdHRyaWJ1dGVzIChhdHRyaWJ1dGVzIHdpdGggdmFsdWVzIHRoYXQgbXVzdCBiZSBwYXJ0IG9mIGEgcHJlZGVmaW5lZAorICAgIHNldCBvZiB2YWx1ZXMpLiAgU2VlIDxjb2RlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YTwvY29kZT4gYW5kIHRoZQorICAgIGlubmVyIDxjb2RlIGNsYXNzPSJjb2RlIj5BZGRBc2lzUmVtb3ZlPC9jb2RlPiBjbGFzcyB1c2VkIGluIDxjb2RlIGNsYXNzPSJjb2RlIj5zZXRDcjwvY29kZT4gZm9yCisgICAgYW4gZXhhbXBsZS48L2xpPgogCi0gIDxsaT5BIHN1YmNsYXNzIG9mCi0gIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU8L2NvZGU+LCBBbnQKLSAgd2lsbCBpbnZva2UgdGhpcyBjbGFzc2VzIDxjb2RlPnNldFZhbHVlPC9jb2RlPiBtZXRob2QuICBVc2UgdGhpcyBpZgotICB5b3VyIHRhc2sgc2hvdWxkIHN1cHBvcnQgZW51bWVyYXRlZCBhdHRyaWJ1dGVzIChhdHRyaWJ1dGVzIHdpdGgKLSAgdmFsdWVzIHRoYXQgbXVzdCBiZSBwYXJ0IG9mIGEgcHJlZGVmaW5lZCBzZXQgb2YgdmFsdWVzKS4gIFNlZQotICA8Y29kZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDUkxGLmphdmE8L2NvZGU+IGFuZCB0aGUKLSAgaW5uZXIgPGNvZGU+QWRkQXNpc1JlbW92ZTwvY29kZT4gY2xhc3MgdXNlZCBpbiA8Y29kZT5zZXRDcjwvY29kZT4KLSAgZm9yIGFuIGV4YW1wbGUuPC9saT4KLQotICA8bGk+QSAoSmF2YSA1KSBlbnVtZXJhdGlvbi4gQW50IHdpbGwgY2FsbCB0aGUgc2V0dGVyIHdpdGggdGhlIGVudW0gY29uc3RhbnQKLSAgbWF0Y2hpbmcgdGhlIHZhbHVlIGdpdmVuIGluIHRoZSBidWlsZCBmaWxlLiBUaGlzIGlzIGVhc2llciB0aGFuIHVzaW5nCi0gIDxjb2RlPkVudW1lcmF0ZWRBdHRyaWJ1dGU8L2NvZGU+IGFuZCBjYW4gcmVzdWx0IGluIGNsZWFuZXIgY29kZSwgYnV0IG9mIGNvdXJzZQotICB5b3VyIHRhc2sgd2lsbCBub3QgcnVuIG9uIEpESyAxLjQgb3IgZWFybGllci4gTm90ZSB0aGF0IGFueSBvdmVycmlkZSBvZgotICA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBpbiB0aGUgZW51bWVyYXRpb24gaXMgaWdub3JlZDsgdGhlIGJ1aWxkIGZpbGUgbXVzdCB1c2UKLSAgdGhlIGRlY2xhcmVkIG5hbWUgKHNlZSA8Y29kZT5FbnVtLmdldE5hbWUoKTwvY29kZT4pLiBZb3UgbWF5IHdpc2ggdG8gdXNlIGxvd2VyY2FzZQotICBlbnVtIGNvbnN0YW50IG5hbWVzLCBpbiBjb250cmFzdCB0byB1c3VhbCBKYXZhIHN0eWxlLCB0byBsb29rIGJldHRlciBpbiBidWlsZCBmaWxlcy4KLSAgPGVtPkFzIG9mIEFudCAxLjcuMC48L2VtPjwvbGk+Ci0KKyAgPGxpPkEgKEphdmEgNSkgZW51bWVyYXRpb24sIEFudCB3aWxsIGNhbGwgdGhlIHNldHRlciB3aXRoIHRoZSBlbnVtIGNvbnN0YW50IG1hdGNoaW5nIHRoZSB2YWx1ZQorICAgIGdpdmVuIGluIHRoZSBidWlsZCBmaWxlLiBUaGlzIGlzIGVhc2llciB0aGFuIHVzaW5nIDxjb2RlIGNsYXNzPSJjb2RlIj5FbnVtZXJhdGVkQXR0cmlidXRlPC9jb2RlPgorICAgIGFuZCBjYW4gcmVzdWx0IGluIGNsZWFuZXIgY29kZSwgYnV0IG9mIGNvdXJzZSB5b3VyIHRhc2sgd2lsbCBub3QgcnVuIG9uIEpESyAxLjQgb3IgZWFybGllci4gTm90ZQorICAgIHRoYXQgYW55IG92ZXJyaWRlIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj50b1N0cmluZygpPC9jb2RlPiBpbiB0aGUgZW51bWVyYXRpb24gaXMgaWdub3JlZDsgdGhlCisgICAgYnVpbGQgZmlsZSBtdXN0IHVzZSB0aGUgZGVjbGFyZWQgbmFtZSAoc2VlIDxjb2RlPkVudW0uZ2V0TmFtZSgpPC9jb2RlPikuIFlvdSBtYXkgd2lzaCB0byB1c2UKKyAgICBsb3dlcmNhc2UgZW51bSBjb25zdGFudCBuYW1lcywgaW4gY29udHJhc3QgdG8gdXN1YWwgSmF2YSBzdHlsZSwgdG8gbG9vayBiZXR0ZXIgaW4gYnVpbGQKKyAgICBmaWxlcy4gIDxlbT5TaW5jZSBBbnQgMS43LjA8L2VtPjwvbGk+CiA8L3VsPgogCi08cD5XaGF0IGhhcHBlbnMgaWYgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgbWV0aG9kIGlzIHByZXNlbnQgZm9yIGEgZ2l2ZW4KLWF0dHJpYnV0ZT8gIEEgbWV0aG9kIHRha2luZyBhIDxjb2RlPlN0cmluZzwvY29kZT4gYXJndW1lbnQgd2lsbCBhbHdheXMKLWxvc2UgYWdhaW5zdCB0aGUgbW9yZSBzcGVjaWZpYyBtZXRob2RzLiAgSWYgdGhlcmUgYXJlIHN0aWxsIG1vcmUKLXNldHRlcnMgQW50IGNvdWxkIGNob3NlIGZyb20sIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBjYWxsZWQsIGJ1dCB3ZQotZG9uJ3Qga25vdyB3aGljaCwgdGhpcyBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIEphdmEKLXZpcnR1YWwgbWFjaGluZS48L3A+Cis8cD5XaGF0IGhhcHBlbnMgaWYgbW9yZSB0aGFuIG9uZSBzZXR0ZXIgbWV0aG9kIGlzIHByZXNlbnQgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlPyAgQSBtZXRob2QgdGFraW5nCithIDxjb2RlIGNsYXNzPSJjb2RlIj5TdHJpbmc8L2NvZGU+IGFyZ3VtZW50IHdpbGwgYWx3YXlzIGxvc2UgYWdhaW5zdCB0aGUgbW9yZSBzcGVjaWZpYyBtZXRob2RzLiAgSWYKK3RoZXJlIGFyZSBzdGlsbCBtb3JlIHNldHRlcnMgQW50IGNvdWxkIGNob3NlIGZyb20sIG9ubHkgb25lIG9mIHRoZW0gd2lsbCBiZSBjYWxsZWQsIGJ1dCB3ZSBkb24ndAora25vdyB3aGljaCwgdGhpcyBkZXBlbmRzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIEphdmEgdmlydHVhbCBtYWNoaW5lLjwvcD4KIAotPGgzPjxhIG5hbWU9Im5lc3RlZC1lbGVtZW50cyI+U3VwcG9ydGluZyBuZXN0ZWQgZWxlbWVudHM8L2E+PC9oMz4KKzxoMyBpZD0ibmVzdGVkLWVsZW1lbnRzIj5TdXBwb3J0aW5nIG5lc3RlZCBlbGVtZW50czwvaDM+CiAKLTxwPkxldCdzIGFzc3VtZSB5b3VyIHRhc2sgc2hhbGwgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMgd2l0aCB0aGUgbmFtZQotPGNvZGU+aW5uZXI8L2NvZGU+LiAgRmlyc3Qgb2YgYWxsLCB5b3UgbmVlZCBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cwotdGhpcyBuZXN0ZWQgZWxlbWVudC4gIE9mdGVuIHlvdSBzaW1wbHkgd2FudCB0byB1c2Ugb25lIG9mIEFudCdzCi1jbGFzc2VzIGxpa2UgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDwvY29kZT4gdG8KLXN1cHBvcnQgbmVzdGVkIDxjb2RlPmZpbGVzZXQ8L2NvZGU+IGVsZW1lbnRzLjwvcD4KKzxwPkxldCdzIGFzc3VtZSB5b3VyIHRhc2sgc2hhbGwgc3VwcG9ydCBuZXN0ZWQgZWxlbWVudHMgd2l0aCB0aGUgbmFtZSA8Y29kZT5pbm5lcjwvY29kZT4uICBGaXJzdCBvZgorYWxsLCB5b3UgbmVlZCBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGlzIG5lc3RlZCBlbGVtZW50LiAgT2Z0ZW4geW91IHNpbXBseSB3YW50IHRvIHVzZSBvbmUgb2YKK0FudCdzIGNsYXNzZXMgbGlrZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDwvY29kZT4gdG8gc3VwcG9ydAorbmVzdGVkIDxjb2RlPmZpbGVzZXQ8L2NvZGU+IGVsZW1lbnRzLjwvcD4KIAotPHA+QXR0cmlidXRlcyBvZiB0aGUgbmVzdGVkIGVsZW1lbnRzIG9yIG5lc3RlZCBjaGlsZCBlbGVtZW50cyBvZiB0aGVtCi13aWxsIGJlIGhhbmRsZWQgdXNpbmcgdGhlIHNhbWUgbWVjaGFuaXNtIHVzZWQgZm9yIHRhc2tzIChpLmUuIHNldHRlcgotbWV0aG9kcyBmb3IgYXR0cmlidXRlcywgYWRkVGV4dCBmb3IgbmVzdGVkIHRleHQgYW5kCi1jcmVhdGUvYWRkL2FkZENvbmZpZ3VyZWQgbWV0aG9kcyBmb3IgY2hpbGQgZWxlbWVudHMpLjwvcD4KKzxwPkF0dHJpYnV0ZXMgb2YgdGhlIG5lc3RlZCBlbGVtZW50cyBvciBuZXN0ZWQgY2hpbGQgZWxlbWVudHMgb2YgdGhlbSB3aWxsIGJlIGhhbmRsZWQgdXNpbmcgdGhlIHNhbWUKK21lY2hhbmlzbSB1c2VkIGZvciB0YXNrcyAoaS5lLiA8ZW0+c2V0dGVyPC9lbT4gbWV0aG9kcyBmb3IKK2F0dHJpYnV0ZXMsIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRUZXh0KCk8L2NvZGU+IGZvciBuZXN0ZWQgdGV4dAorYW5kIDxlbT5jcmVhdGU8L2VtPi88ZW0+YWRkPC9lbT4vPGVtPmFkZENvbmZpZ3VyZWQ8L2VtPiBtZXRob2RzIGZvciBjaGlsZCBlbGVtZW50cykuPC9wPgogCi08cD5Ob3cgeW91IGhhdmUgYSBjbGFzcyA8Y29kZT5OZXN0ZWRFbGVtZW50PC9jb2RlPiB0aGF0IGlzIHN1cHBvc2VkIHRvCi1iZSB1c2VkIGZvciB5b3VyIG5lc3RlZCA8Y29kZT4mbHQ7aW5uZXImZ3Q7PC9jb2RlPiBlbGVtZW50cywgeW91IGhhdmUKLXRocmVlIG9wdGlvbnM6PC9wPgorPHA+Tm93IHlvdSBoYXZlIGEgY2xhc3MgPGNvZGUgY2xhc3M9ImNvZGUiPk5lc3RlZEVsZW1lbnQ8L2NvZGU+IHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBmb3IgeW91cgorbmVzdGVkIDxjb2RlPiZsdDtpbm5lciZndDs8L2NvZGU+IGVsZW1lbnRzLCB5b3UgaGF2ZSB0aHJlZSBvcHRpb25zOjwvcD4KIAogPG9sPgotICA8bGk+PGNvZGU+cHVibGljIE5lc3RlZEVsZW1lbnQgY3JlYXRlSW5uZXIoKTwvY29kZT48L2xpPgotICA8bGk+PGNvZGU+cHVibGljIHZvaWQgYWRkSW5uZXIoTmVzdGVkRWxlbWVudCBhbklubmVyKTwvY29kZT48L2xpPgotICA8bGk+PGNvZGU+cHVibGljIHZvaWQgYWRkQ29uZmlndXJlZElubmVyKE5lc3RlZEVsZW1lbnQgYW5Jbm5lcik8L2NvZGU+PC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5wdWJsaWMgTmVzdGVkRWxlbWVudCBjcmVhdGVJbm5lcigpPC9jb2RlPjwvbGk+CisgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIHZvaWQgYWRkSW5uZXIoTmVzdGVkRWxlbWVudCBhbklubmVyKTwvY29kZT48L2xpPgorICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPnB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRJbm5lcihOZXN0ZWRFbGVtZW50IGFuSW5uZXIpPC9jb2RlPjwvbGk+CiA8L29sPgogCiA8cD5XaGF0IGlzIHRoZSBkaWZmZXJlbmNlPzwvcD4KIAotPHA+T3B0aW9uIDEgbWFrZXMgdGhlIHRhc2sgY3JlYXRlIHRoZSBpbnN0YW5jZSBvZgotPGNvZGU+TmVzdGVkRWxlbWVudDwvY29kZT4sIHRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHR5cGUuCi1Gb3IgdGhlIG9wdGlvbnMgMiBhbmQgMywgQW50IGhhcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLTxjb2RlPk5lc3RlZElubmVyPC9jb2RlPiBiZWZvcmUgaXQgY2FuIHBhc3MgaXQgdG8gdGhlIHRhc2ssIHRoaXMKLW1lYW5zLCA8Y29kZT5OZXN0ZWRJbm5lcjwvY29kZT4gbXVzdCBoYXZlIGEgPGNvZGU+cHVibGljPC9jb2RlPiBuby1hcmcKLSAgY29uc3RydWN0b3Igb3IgYSA8Y29kZT5wdWJsaWM8L2NvZGU+IG9uZS1hcmcgY29uc3RydWN0b3IKLSAgdGFraW5nIGEgUHJvamVjdCBjbGFzcyBhcyBhIHBhcmFtZXRlci4KLVRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9wdGlvbnMgMSBhbmQgMi48L3A+Cis8cD5PcHRpb24gMSBtYWtlcyB0aGUgdGFzayBjcmVhdGUgdGhlIGluc3RhbmNlIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5OZXN0ZWRFbGVtZW50PC9jb2RlPiwgdGhlcmUgYXJlCitubyByZXN0cmljdGlvbnMgb24gdGhlIHR5cGUuICBGb3IgdGhlIG9wdGlvbnMgMiBhbmQgMywgQW50IGhhcyB0byBjcmVhdGUgYW4gaW5zdGFuY2UKK29mIDxjb2RlIGNsYXNzPSJjb2RlIj5OZXN0ZWRJbm5lcjwvY29kZT4gYmVmb3JlIGl0IGNhbiBwYXNzIGl0IHRvIHRoZSB0YXNrLCB0aGlzCittZWFucywgPGNvZGUgY2xhc3M9ImNvZGUiPk5lc3RlZElubmVyPC9jb2RlPiBtdXN0IGhhdmUgYSA8Y29kZT5wdWJsaWM8L2NvZGU+IG5vLWFyZyBjb25zdHJ1Y3RvciBvcgorYSA8Y29kZT5wdWJsaWM8L2NvZGU+IG9uZS1hcmcgY29uc3RydWN0b3IgdGFraW5nIGEgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3Q8L2NvZGU+IGNsYXNzIGFzIGEKK3BhcmFtZXRlci4gIFRoaXMgaXMgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIG9wdGlvbnMgMSBhbmQgMi48L3A+CiAKLTxwPlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBhbmQgMyBpcyB3aGF0IEFudCBoYXMgZG9uZSB0byB0aGUgb2JqZWN0Ci1iZWZvcmUgaXQgcGFzc2VzIGl0IHRvIHRoZSBtZXRob2QuICA8Y29kZT5hZGRJbm5lcjwvY29kZT4gd2lsbCByZWNlaXZlCi1hbiBvYmplY3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGhhcyBiZWVuIGNhbGxlZCwgd2hpbGUKLTxjb2RlPmFkZENvbmZpZ3VyZWRJbm5lcjwvY29kZT4gZ2V0cyB0aGUgb2JqZWN0IDxlbT5hZnRlcjwvZW0+IHRoZQotYXR0cmlidXRlcyBhbmQgbmVzdGVkIGNoaWxkcmVuIGZvciB0aGlzIG5ldyBvYmplY3QgaGF2ZSBiZWVuCi1oYW5kbGVkLjwvcD4KKzxwPlRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBhbmQgMyBpcyB3aGF0IEFudCBoYXMgZG9uZSB0byB0aGUgb2JqZWN0IGJlZm9yZSBpdCBwYXNzZXMgaXQgdG8gdGhlCittZXRob2QuICA8Y29kZSBjbGFzcz0iY29kZSI+YWRkSW5uZXIoKTwvY29kZT4gd2lsbCByZWNlaXZlIGFuIG9iamVjdCBkaXJlY3RseSBhZnRlciB0aGUgY29uc3RydWN0b3IKK2hhcyBiZWVuIGNhbGxlZCwgd2hpbGUgPGNvZGUgY2xhc3M9ImNvZGUiPmFkZENvbmZpZ3VyZWRJbm5lcigpPC9jb2RlPiBnZXRzIHRoZSBvYmplY3QgPGVtPmFmdGVyPC9lbT4KK3RoZSBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgY2hpbGRyZW4gZm9yIHRoaXMgbmV3IG9iamVjdCBoYXZlIGJlZW4gaGFuZGxlZC48L3A+CiAKLTxwPldoYXQgaGFwcGVucyBpZiB5b3UgdXNlIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnM/ICBPbmx5IG9uZSBvZgotdGhlIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoaWNoLCB0aGlzIGRlcGVuZHMgb24KLXRoZSBpbXBsZW1lbnRhdGlvbiBvZiB5b3VyIEphdmEgdmlydHVhbCBtYWNoaW5lLjwvcD4KKzxwPldoYXQgaGFwcGVucyBpZiB5b3UgdXNlIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnM/ICBPbmx5IG9uZSBvZiB0aGUgbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCwKK2J1dCB3ZSBkb24ndCBrbm93IHdoaWNoLCB0aGlzIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHlvdXIgSlZNLjwvcD4KIAotPGgzPjxhIG5hbWU9Im5lc3RlZHR5cGUiPk5lc3RlZCBUeXBlczwvYT48L2gzPgotSWYgeW91ciB0YXNrIG5lZWRzIHRvIG5lc3QgYW4gYXJiaXRyYXJ5IHR5cGUgdGhhdCBoYXMgYmVlbiBkZWZpbmVkCi0gIHVzaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4geW91IGhhdmUgdHdvIG9wdGlvbnMuCi0gIDxvbD4KLSAgICA8bGk+PGNvZGU+cHVibGljIHZvaWQgYWRkKFR5cGUgdHlwZSk8L2NvZGU+PC9saT4KLSAgICA8bGk+PGNvZGU+cHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChUeXBlIHR5cGUpPC9jb2RlPjwvbGk+Ci0gIDwvb2w+Ci0gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMSBhbmQgMiBpcyB0aGUgc2FtZSBhcyBiZXR3ZWVuIDIgYW5kIDMgaW4gdGhlCi0gIHByZXZpb3VzIHNlY3Rpb24uCi0gIDxwPgotICAgIEZvciBleGFtcGxlIHN1cHBvc2Ugb25lIHdhbnRlZCB0byBoYW5kbGUgb2JqZWN0cyBvYmplY3Qgb2YgdHlwZQotICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5Db25kaXRpb24sIG9uZSBtYXkKLSAgICBoYXZlIGEgY2xhc3M6Ci0gIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gIDxwcmU+Cis8aDMgaWQ9Im5lc3RlZHR5cGUiPk5lc3RlZCBUeXBlczwvaDM+Cis8cD5JZiB5b3VyIHRhc2sgbmVlZHMgdG8gbmVzdCBhbiBhcmJpdHJhcnkgdHlwZSB0aGF0IGhhcyBiZWVuIGRlZmluZWQKK3VzaW5nIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4geW91IGhhdmUgdHdvIG9wdGlvbnMuPC9wPgorPG9sPgorICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPnB1YmxpYyB2b2lkIGFkZChUeXBlIHR5cGUpPC9jb2RlPjwvbGk+CisgIDxsaT48Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChUeXBlIHR5cGUpPC9jb2RlPjwvbGk+Cis8L29sPgorPHA+VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAxIGFuZCAyIGlzIHRoZSBzYW1lIGFzIGJldHdlZW4gMiBhbmQgMyBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbi48L3A+Cis8cD5Gb3IgZXhhbXBsZSBzdXBwb3NlIG9uZSB3YW50ZWQgdG8gaGFuZGxlIG9iamVjdHMgb2JqZWN0IG9mCit0eXBlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uPC9jb2RlPiwgb25lIG1heSBoYXZlIGEKK2NsYXNzOjwvcD4KKzxwcmU+CiBwdWJsaWMgY2xhc3MgTXlUYXNrIGV4dGVuZHMgVGFzayB7CiAgICAgcHJpdmF0ZSBMaXN0IGNvbmRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgcHVibGljIHZvaWQgYWRkKENvbmRpdGlvbiBjKSB7CkBAIC0yODUsMjcgKzIzNywxNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgIC8vIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbmRpdGlvbnMKICAgICB9Ci19Ci0gIDwvcHJlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIE9uZSBtYXkgZGVmaW5lIGFuZCB1c2UgdGhpcyBjbGFzcyBsaWtlIHRoaXM6Ci0gIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHByZT4KK308L3ByZT4KKzxwPk9uZSBtYXkgZGVmaW5lIGFuZCB1c2UgdGhpcyBjbGFzcyBsaWtlIHRoaXM6PC9wPgorPHByZT4KICZsdDt0YXNrZGVmIG5hbWU9Im15dGFzayIgY2xhc3NuYW1lPSJNeVRhc2siIGNsYXNzcGF0aD0iY2xhc3NlcyIvJmd0OwogJmx0O3R5cGVkZWYgbmFtZT0iY29uZGl0aW9uLmVxdWFscyIKICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9ucy5FcXVhbHMiLyZndDsKICZsdDtteXRhc2smZ3Q7CiAgICAgJmx0O2NvbmRpdGlvbi5lcXVhbHMgYXJnMT0iJHtkZWJ1Z30iIGFyZzI9InRydWUiLyZndDsKLSZsdDsvbXl0YXNrJmd0OwotICAgIDwvcHJlPgotICA8L2Jsb2NrcXVvdGU+Ci0gIDxwPgotICAgIEEgbW9yZSBjb21wbGljYXRlZCBleGFtcGxlIGZvbGxvd3M6Ci0gIDwvcD4KLSAgPGJsb2NrcXVvdGU+Ci0gICAgPHByZT4KKyZsdDsvbXl0YXNrJmd0OzwvcHJlPgorPHA+QSBtb3JlIGNvbXBsaWNhdGVkIGV4YW1wbGUgZm9sbG93czo8L3A+Cis8cHJlPgogcHVibGljIGNsYXNzIFNhbXBsZSB7CiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpbGVTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CiAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyQShpbnQgYSkge30KQEAgLTMxOCwxMyArMjYwLDEzIEBACiAKICAgICBpbnRlcmZhY2UgTXlJbnRlcmZhY2UgewogICAgICAgICB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2YWwpOwotICAgIH0gICAgICAgIAorICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRQYXRoIGV4dGVuZHMgUGF0aCB7CiAgICAgICAgIHB1YmxpYyBCdWlsZFBhdGgoUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgICAgICBzdXBlcihwcm9qZWN0KTsKICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICBwdWJsaWMgdm9pZCBhZGQoTXlJbnRlcmZhY2UgaW50ZXIpIHt9CiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7fQogICAgIH0KQEAgLTMzMywxNiArMjc1LDExIEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB4KSB7fQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgYykge30KICAgICB9Ci19Ci0gICAgPC9wcmU+Ci0gIDwvYmxvY2txdW90ZT4KLSAgPHA+Ci0gICAgVGhpcyBjbGFzcyBkZWZpbmVzIGEgbnVtYmVyIG9mIHN0YXRpYyBjbGFzc2VzIHRoYXQgaW1wbGVtZW50L2V4dGVuZAotICAgIFBhdGgsIE15RmlsZVNlbGVjdG9yIGFuZCBNeUludGVyZmFjZS4gVGhlc2UgbWF5IGJlIGRlZmluZWQgYW5kIHVzZWQKLSAgICBhcyBmb2xsb3dzOgotICA8L3A+Ci0gIDxwcmU+Ci0gICAgPGJsb2NrcXVvdGU+Cit9PC9wcmU+Cis8cD5UaGlzIGNsYXNzIGRlZmluZXMgYSBudW1iZXIgb2Ygc3RhdGljIGNsYXNzZXMgdGhhdAoraW1wbGVtZW50L2V4dGVuZCA8Y29kZSBjbGFzcz0iY29kZSI+UGF0aDwvY29kZT4sIDxjb2RlIGNsYXNzPSJjb2RlIj5NeUZpbGVTZWxlY3RvcjwvY29kZT4KK2FuZCA8Y29kZSBjbGFzcz0iY29kZSI+TXlJbnRlcmZhY2U8L2NvZGU+LiBUaGVzZSBtYXkgYmUgZGVmaW5lZCBhbmQgdXNlZCBhcyBmb2xsb3dzOjwvcD4KKzxwcmU+CiAmbHQ7dHlwZWRlZiBuYW1lPSJteWZpbGVzZWxlY3RvciIgY2xhc3NuYW1lPSJTYW1wbGUkTXlGaWxlU2VsZWN0b3IiCiAgICAgICAgICBjbGFzc3BhdGg9ImNsYXNzZXMiIGxvYWRlcnJlZj0iY2xhc3NlcyIvJmd0OwogJmx0O3R5cGVkZWYgbmFtZT0iYnVpbGRwYXRoIiBjbGFzc25hbWU9IlNhbXBsZSRCdWlsZFBhdGgiCkBAIC0zNTgsMzMgKzI5NSwyOCBAQAogICAgICAgICAgJmx0Oy9idWlsZHBhdGgmZ3Q7CiAgICAgICAmbHQ7L215ZmlsZXNlbGVjdG9yJmd0OwogICAgJmx0Oy9maWxlc2V0Jmd0OwotJmx0Oy9jb3B5Jmd0OwotICAgIDwvYmxvY2txdW90ZT4KLSAgPC9wcmU+CismbHQ7L2NvcHkmZ3Q7PC9wcmU+CiAKLTxoMz48YSBuYW1lPSJ0YXNrY29udGFpbmVyIj5UYXNrQ29udGFpbmVyPC9hPjwvaDM+Cis8aDMgaWQ9InRhc2tjb250YWluZXIiPlRhc2tDb250YWluZXI8L2gzPgogCi08cD5UaGUgPGNvZGU+VGFza0NvbnRhaW5lcjwvY29kZT4gY29uc2lzdHMgb2YgYSBzaW5nbGUgbWV0aG9kLAotPGNvZGU+YWRkVGFzazwvY29kZT4gdGhhdCBiYXNpY2FsbHkgaXMgdGhlIHNhbWUgYXMgYW4gPGEKLWhyZWY9IiNuZXN0ZWQtZWxlbWVudHMiPmFkZCBtZXRob2Q8L2E+IGZvciBuZXN0ZWQgZWxlbWVudHMuICBUaGUgdGFzawotaW5zdGFuY2VzIHdpbGwgYmUgY29uZmlndXJlZCAodGhlaXIgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzCi1oYXZlIGJlZW4gaGFuZGxlZCkgd2hlbiB5b3VyIHRhc2sncyA8Y29kZT5leGVjdXRlPC9jb2RlPiBtZXRob2QgZ2V0cwotaW52b2tlZCwgYnV0IG5vdCBiZWZvcmUgdGhhdC48L3A+Cis8cD5UaGUgPGNvZGUgY2xhc3M9ImNvZGUiPlRhc2tDb250YWluZXI8L2NvZGU+IGNvbnNpc3RzIG9mIGEgc2luZ2xlCittZXRob2QsIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRUYXNrPC9jb2RlPiB0aGF0IGJhc2ljYWxseSBpcyB0aGUgc2FtZSBhcworYW4gPGEgaHJlZj0iI25lc3RlZC1lbGVtZW50cyI+YWRkIG1ldGhvZDwvYT4gZm9yIG5lc3RlZCBlbGVtZW50cy4gIFRoZSB0YXNrIGluc3RhbmNlcyB3aWxsIGJlCitjb25maWd1cmVkICh0aGVpciBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgaGF2ZSBiZWVuIGhhbmRsZWQpIHdoZW4geW91cgordGFzaydzIDxjb2RlIGNsYXNzPSJjb2RlIj5leGVjdXRlPC9jb2RlPiBtZXRob2QgZ2V0cyBpbnZva2VkLCBidXQgbm90IGJlZm9yZSB0aGF0LjwvcD4KIAotPHA+V2hlbiB3ZSA8YSBocmVmPSIjZXhlY3V0ZSI+c2FpZDwvYT4gPGNvZGU+ZXhlY3V0ZTwvY29kZT4gd291bGQgYmUKLWNhbGxlZCwgd2UgbGllZCA7LSkuICBJbiBmYWN0LCBBbnQgd2lsbCBjYWxsIHRoZSA8Y29kZT5wZXJmb3JtPC9jb2RlPgotbWV0aG9kIGluIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+LCB3aGljaCBpbiB0dXJuIGNhbGxzCi08Y29kZT5leGVjdXRlPC9jb2RlPi4gIFRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdGhhdCA8YQotaHJlZj0iI2J1aWxkZXZlbnRzIj5CdWlsZCBFdmVudHM8L2E+IHdpbGwgYmUgdHJpZ2dlcmVkLiAgSWYgeW91Ci1leGVjdXRlIHRoZSB0YXNrIGluc3RhbmNlcyBuZXN0ZWQgaW50byB5b3VyIHRhc2ssIHlvdSBzaG91bGQgYWxzbwotaW52b2tlIDxjb2RlPnBlcmZvcm08L2NvZGU+IG9uIHRoZXNlIGluc3RhbmNlcyBpbnN0ZWFkIG9mCi08Y29kZT5leGVjdXRlPC9jb2RlPi48L3A+Cis8cD5XaGVuIHdlIDxhIGhyZWY9IiNleGVjdXRlIj5zYWlkPC9hPiA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZTwvY29kZT4gd291bGQgYmUgY2FsbGVkLCB3ZSBsaWVkCis7LSkuICBJbiBmYWN0LCBBbnQgd2lsbCBjYWxsIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+cGVyZm9ybTwvY29kZT4gbWV0aG9kCitpbiA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuVGFzazwvY29kZT4sIHdoaWNoIGluIHR1cm4KK2NhbGxzIDxjb2RlIGNsYXNzPSJjb2RlIj5leGVjdXRlPC9jb2RlPi4gIFRoaXMgbWV0aG9kIG1ha2VzIHN1cmUgdGhhdCA8YSBocmVmPSIjYnVpbGRldmVudHMiPkJ1aWxkCitFdmVudHM8L2E+IHdpbGwgYmUgdHJpZ2dlcmVkLiAgSWYgeW91IGV4ZWN1dGUgdGhlIHRhc2sgaW5zdGFuY2VzIG5lc3RlZCBpbnRvIHlvdXIgdGFzaywgeW91IHNob3VsZAorYWxzbyBpbnZva2UgPGNvZGUgY2xhc3M9ImNvZGUiPnBlcmZvcm08L2NvZGU+IG9uIHRoZXNlIGluc3RhbmNlcyBpbnN0ZWFkCitvZiA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZTwvY29kZT4uPC9wPgogCiA8aDM+RXhhbXBsZTwvaDM+Ci08cD5MZXQncyB3cml0ZSBvdXIgb3duIHRhc2ssIHdoaWNoIHByaW50cyBhIG1lc3NhZ2Ugb24gdGhlCi08Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiBzdHJlYW0uCi1UaGUgdGFzayBoYXMgb25lIGF0dHJpYnV0ZSwgY2FsbGVkIDxjb2RlPm1lc3NhZ2U8L2NvZGU+LjwvcD4KLTxibG9ja3F1b3RlPgorPHA+TGV0J3Mgd3JpdGUgb3VyIG93biB0YXNrLCB3aGljaCBwcmludHMgYSBtZXNzYWdlIG9uIHRoZSA8Y29kZT5TeXN0ZW0ub3V0PC9jb2RlPiBzdHJlYW0uICBUaGUgdGFzaworaGFzIG9uZSBhdHRyaWJ1dGUsIGNhbGxlZCA8Y29kZT5tZXNzYWdlPC9jb2RlPi48L3A+CisKIDxwcmU+CiBwYWNrYWdlIGNvbS5teWRvbWFpbjsKIApAQCAtNDAzLDIxICszMzUsMTkgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtc2cpIHsKICAgICAgICAgdGhpcy5tc2cgPSBtc2c7CiAgICAgfQotfQotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Cit9PC9wcmU+CisKIDxwPkl0J3MgcmVhbGx5IHRoaXMgc2ltcGxlIDstKTwvcD4KIDxwPkFkZGluZyB5b3VyIHRhc2sgdG8gdGhlIHN5c3RlbSBpcyByYXRoZXIgc2ltcGxlIHRvbzo8L3A+CiA8b2w+Ci0gIDxsaT5NYWtlIHN1cmUgdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB5b3VyIHRhc2sgaXMgaW4gdGhlIGNsYXNzcGF0aCB3aGVuCi0gICAgc3RhcnRpbmcgQW50LjwvbGk+Ci0gIDxsaT5BZGQgYSA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGVsZW1lbnQgdG8geW91ciBwcm9qZWN0LgotICAgIFRoaXMgYWN0dWFsbHkgYWRkcyB5b3VyIHRhc2sgdG8gdGhlIHN5c3RlbS48L2xpPgorICA8bGk+TWFrZSBzdXJlIHRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgeW91ciB0YXNrIGlzIGluIHRoZSBjbGFzc3BhdGggd2hlbiBzdGFydGluZyBBbnQuPC9saT4KKyAgPGxpPkFkZCBhIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gZWxlbWVudCB0byB5b3VyIHByb2plY3QuICBUaGlzIGFjdHVhbGx5IGFkZHMgeW91ciB0YXNrIHRvCisgICAgdGhlIHN5c3RlbS48L2xpPgogICA8bGk+VXNlIHlvdXIgdGFzayBpbiB0aGUgcmVzdCBvZiB0aGUgYnVpbGRmaWxlLjwvbGk+CiA8L29sPgogCiA8aDM+RXhhbXBsZTwvaDM+Ci08YmxvY2txdW90ZT4KKwogPHByZT4KICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7PyZndDsKIApAQCAtNDI3LDE3ICszNTcsMTQgQEAKICAgJmx0O3RhcmdldCBuYW1lPSZxdW90O21haW4mcXVvdDsmZ3Q7CiAgICAgJmx0O215dGFzayBtZXNzYWdlPSZxdW90O0hlbGxvIFdvcmxkISBNeVZlcnlPd25UYXNrIHdvcmtzISZxdW90Oy8mZ3Q7CiAgICZsdDsvdGFyZ2V0Jmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+Ci08L2Jsb2NrcXVvdGU+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKIDxoMz5FeGFtcGxlIDI8L2gzPgotVG8gdXNlIGEgdGFzayBkaXJlY3RseSBmcm9tIHRoZSBidWlsZGZpbGUgd2hpY2ggY3JlYXRlZCBpdCwgcGxhY2UgdGhlCi08Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGRlY2xhcmF0aW9uIGluc2lkZSBhIHRhcmdldAotPGk+YWZ0ZXIgdGhlIGNvbXBpbGF0aW9uPC9pPi4gVXNlIHRoZSA8Y29kZT5jbGFzc3BhdGg8L2NvZGU+IGF0dHJpYnV0ZSBvZgotPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPiB0byBwb2ludCB0byB3aGVyZSB0aGUgY29kZSBoYXMganVzdCBiZWVuCi1jb21waWxlZC4KLTxibG9ja3F1b3RlPgorPHA+VG8gdXNlIGEgdGFzayBkaXJlY3RseSBmcm9tIHRoZSBidWlsZGZpbGUgd2hpY2ggY3JlYXRlZCBpdCwgcGxhY2UKK3RoZSA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IGRlY2xhcmF0aW9uIGluc2lkZSBhIHRhcmdldCA8ZW0+YWZ0ZXIgdGhlIGNvbXBpbGF0aW9uPC9lbT4uIFVzZQordGhlIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGF0dHJpYnV0ZSBvZiA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHRvIHBvaW50IHRvIHdoZXJlIHRoZSBjb2RlIGhhcworanVzdCBiZWVuIGNvbXBpbGVkLjwvcD4KKwogPHByZT4KICZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7PyZndDsKIApAQCAtNDU3LDI3ICszODQsMjMgQEAKICAgJmx0O3RhcmdldCBuYW1lPSZxdW90O21haW4mcXVvdDsgZGVwZW5kcz0mcXVvdDtkZWNsYXJlJnF1b3Q7Jmd0OwogICAgICZsdDtteXRhc2sgbWVzc2FnZT0mcXVvdDtIZWxsbyBXb3JsZCEgTXlWZXJ5T3duVGFzayB3b3JrcyEmcXVvdDsvJmd0OwogICAmbHQ7L3RhcmdldCZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5Bbm90aGVyIHdheSB0byBhZGQgYSB0YXNrIChtb3JlIHBlcm1hbmVudGx5KSwgaXMgdG8gYWRkIHRoZSB0YXNrIG5hbWUgYW5kCi1pbXBsZW1lbnRpbmcgY2xhc3MgbmFtZSB0byB0aGUgPGNvZGU+ZGVmYXVsdC5wcm9wZXJ0aWVzPC9jb2RlPiBmaWxlIGluIHRoZQotPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM8L2NvZGU+Ci1wYWNrYWdlLiBUaGVuIHlvdSBjYW4gdXNlIGl0IGFzIGlmIGl0IHdlcmUgYSBidWlsdC1pbiB0YXNrLjwvcD4KKzxwPkFub3RoZXIgd2F5IHRvIGFkZCBhIHRhc2sgKG1vcmUgcGVybWFuZW50bHkpIGlzIHRvIGFkZCB0aGUgdGFzayBuYW1lIGFuZCBpbXBsZW1lbnRpbmcgY2xhc3MgbmFtZQordG8gdGhlIDxzYW1wPmRlZmF1bHQucHJvcGVydGllczwvc2FtcD4gZmlsZSBpbgordGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczwvY29kZT4gcGFja2FnZS4gVGhlbiB5b3UgY2FuIHVzZSBpdCBhcyBpZiBpdAord2VyZSBhIGJ1aWx0LWluIHRhc2suPC9wPgogCi0KLQotPGhyPgotPGgyPjxhIG5hbWU9ImJ1aWxkZXZlbnRzIj5CdWlsZCBFdmVudHM8L2E+PC9oMj4KKzxoci8+Cis8aDIgaWQ9ImJ1aWxkZXZlbnRzIj5CdWlsZCBFdmVudHM8L2gyPgogPHA+QW50IGlzIGNhcGFibGUgb2YgZ2VuZXJhdGluZyBidWlsZCBldmVudHMgYXMgaXQgcGVyZm9ybXMgdGhlIHRhc2tzIG5lY2Vzc2FyeSB0byBidWlsZCBhIHByb2plY3QuCi1MaXN0ZW5lcnMgY2FuIGJlIGF0dGFjaGVkIHRvIEFudCB0byByZWNlaXZlIHRoZXNlIGV2ZW50cy4gVGhpcyBjYXBhYmlsaXR5IGNvdWxkIGJlIHVzZWQsIGZvciBleGFtcGxlLAotdG8gY29ubmVjdCBBbnQgdG8gYSBHVUkgb3IgdG8gaW50ZWdyYXRlIEFudCB3aXRoIGFuIElERS4KLTwvcD4KLTxwPlRvIHVzZSBidWlsZCBldmVudHMgeW91IG5lZWQgdG8gY3JlYXRlIGFuIGFudCA8Y29kZT5Qcm9qZWN0PC9jb2RlPiBvYmplY3QuIFlvdSBjYW4gdGhlbiBjYWxsIHRoZQotPGNvZGU+YWRkQnVpbGRMaXN0ZW5lcjwvY29kZT4gbWV0aG9kIHRvIGFkZCB5b3VyIGxpc3RlbmVyIHRvIHRoZSBwcm9qZWN0LiBZb3VyIGxpc3RlbmVyIG11c3QgaW1wbGVtZW50Ci10aGUgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnRCdWlsZExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuIFRoZSBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgQnVpbGRFdmVudHMKLWZvciB0aGUgZm9sbG93aW5nIGV2ZW50czwvcD4KK0xpc3RlbmVycyBjYW4gYmUgYXR0YWNoZWQgdG8gQW50IHRvIHJlY2VpdmUgdGhlc2UgZXZlbnRzLiBUaGlzIGNhcGFiaWxpdHkgY291bGQgYmUgdXNlZCwgZm9yCitleGFtcGxlLCB0byBjb25uZWN0IEFudCB0byBhIEdVSSBvciB0byBpbnRlZ3JhdGUgQW50IHdpdGggYW4gSURFLjwvcD4KKzxwPlRvIHVzZSBidWlsZCBldmVudHMgeW91IG5lZWQgdG8gY3JlYXRlIGFuIGFudCA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdDwvY29kZT4gb2JqZWN0LiBZb3UgY2FuCit0aGVuIGNhbGwgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRCdWlsZExpc3RlbmVyPC9jb2RlPiBtZXRob2QgdG8gYWRkIHlvdXIgbGlzdGVuZXIgdG8gdGhlCitwcm9qZWN0LiBZb3VyIGxpc3RlbmVyIG11c3QgaW1wbGVtZW50Cit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50QnVpbGRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlLiBUaGUgbGlzdGVuZXIgd2lsbCByZWNlaXZlCitCdWlsZEV2ZW50cyBmb3IgdGhlIGZvbGxvd2luZyBldmVudHM8L3A+CiA8dWw+CiAgIDxsaT5CdWlsZCBzdGFydGVkPC9saT4KICAgPGxpPkJ1aWxkIGZpbmlzaGVkPC9saT4KQEAgLTQ4OCw1NSArNDExLDQ5IEBACiAgIDxsaT5NZXNzYWdlIGxvZ2dlZDwvbGk+CiA8L3VsPgogCi08cD5JZiB0aGUgYnVpbGQgZmlsZSBpbnZva2VzIGFub3RoZXIgYnVpbGQgZmlsZSB2aWEgCi08YSBocmVmPSJUYXNrcy9hbnQuaHRtbCI+PGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+PC9hPiBvciAKLTxhIGhyZWY9IlRhc2tzL3N1YmFudC5odG1sIj48Y29kZT4mbHQ7c3ViYW50Jmd0OzwvY29kZT48L2E+IG9yIHVzZXMgCi08YSBocmVmPSJUYXNrcy9hbnRjYWxsLmh0bWwiPjxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT48L2E+LCB5b3UgYXJlIGNyZWF0aW5nIGEKLW5ldyBBbnQgInByb2plY3QiIHRoYXQgd2lsbCBzZW5kIHRhcmdldCBhbmQgdGFzayBsZXZlbCBldmVudHMgb2YgaXRzCi1vd24gYnV0IG5ldmVyIHNlbmRzIGJ1aWxkIHN0YXJ0ZWQvZmluaXNoZWQgZXZlbnRzLiAgQW50IDEuNi4yCi1pbnRyb2R1Y2VzIGFuIGV4dGVuc2lvbiBvZiB0aGUgQnVpbGRMaXN0ZW5lciBpbnRlcmZhY2UgbmFtZWQKLVN1YkJ1aWxkTGlzdGVuZXIgdGhhdCB3aWxsIHJlY2VpdmUgdHdvIG5ldyBldmVudHMgZm9yPC9wPgorPHA+SWYgdGhlIGJ1aWxkIGZpbGUgaW52b2tlcyBhbm90aGVyIGJ1aWxkIGZpbGUKK3ZpYSA8YSBocmVmPSJUYXNrcy9hbnQuaHRtbCI+PGNvZGU+Jmx0O2FudCZndDs8L2NvZGU+PC9hPgorb3IgPGEgaHJlZj0iVGFza3Mvc3ViYW50Lmh0bWwiPjxjb2RlPiZsdDtzdWJhbnQmZ3Q7PC9jb2RlPjwvYT4gb3IKK3VzZXMgPGEgaHJlZj0iVGFza3MvYW50Y2FsbC5odG1sIj48Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+PC9hPiwgeW91IGFyZSBjcmVhdGluZyBhIG5ldyBBbnQKKyJwcm9qZWN0IiB0aGF0IHdpbGwgc2VuZCB0YXJnZXQgYW5kIHRhc2sgbGV2ZWwgZXZlbnRzIG9mIGl0cyBvd24gYnV0IG5ldmVyIHNlbmRzIGJ1aWxkCitzdGFydGVkL2ZpbmlzaGVkIGV2ZW50cy4gPGVtPlNpbmNlIEFudCAxLjYuMjwvZW0+LCA8Y29kZSBjbGFzcz0iY29kZSI+QnVpbGRMaXN0ZW5lcjwvY29kZT4gaW50ZXJmYWNlCitoYXMgYW4gZXh0ZW5zaW9uIG5hbWVkIDxjb2RlIGNsYXNzPSJjb2RlIj5TdWJCdWlsZExpc3RlbmVyPC9jb2RlPiB0aGF0IHdpbGwgcmVjZWl2ZSB0d28gbmV3IGV2ZW50cworZm9yPC9wPgogPHVsPgogICA8bGk+U3ViQnVpbGQgc3RhcnRlZDwvbGk+CiAgIDxsaT5TdWJCdWlsZCBmaW5pc2hlZDwvbGk+CiA8L3VsPgotPHA+SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRob3NlIGV2ZW50cywgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvCi1pbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2UgaW5zdGVhZCBvZiBCdWlsZExpc3RlbmVyIChhbmQgcmVnaXN0ZXIgdGhlCi1saXN0ZW5lciwgb2YgY291cnNlKS48L3A+Cis8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhvc2UgZXZlbnRzLCBhbGwgeW91IG5lZWQgdG8gZG8gaXMgdG8gaW1wbGVtZW50IHRoZSBuZXcgaW50ZXJmYWNlCitpbnN0ZWFkIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5CdWlsZExpc3RlbmVyPC9jb2RlPiAoYW5kIHJlZ2lzdGVyIHRoZSBsaXN0ZW5lciwgb2YgY291cnNlKS48L3A+CiAKLTxwPklmIHlvdSB3aXNoIHRvIGF0dGFjaCBhIGxpc3RlbmVyIGZyb20gdGhlIGNvbW1hbmQgbGluZSB5b3UgbWF5IHVzZSB0aGUKLTxjb2RlPi1saXN0ZW5lcjwvY29kZT4gb3B0aW9uLiBGb3IgZXhhbXBsZTo8L3A+Ci08YmxvY2txdW90ZT4KLSAgPHByZT5hbnQgLWxpc3RlbmVyIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlcjwvcHJlPgotPC9ibG9ja3F1b3RlPgorPHA+SWYgeW91IHdpc2ggdG8gYXR0YWNoIGEgbGlzdGVuZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHlvdSBtYXkgdXNlIHRoZSA8a2JkPi1saXN0ZW5lcjwva2JkPgorb3B0aW9uLiBGb3IgZXhhbXBsZTo8L3A+CisKKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxpc3RlbmVyIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlcjwvcHJlPgorCiA8cD53aWxsIHJ1biBBbnQgd2l0aCBhIGxpc3RlbmVyIHRoYXQgZ2VuZXJhdGVzIGFuIFhNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbGQgcHJvZ3Jlc3MuIFRoaXMKLWxpc3RlbmVyIGlzIGluY2x1ZGVkIHdpdGggQW50LCBhcyBpcyB0aGUgZGVmYXVsdCBsaXN0ZW5lciwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBsb2dnaW5nIHRvIHN0YW5kYXJkIG91dHB1dC48L3A+CitsaXN0ZW5lciBpcyBpbmNsdWRlZCB3aXRoIEFudCwgYXMgaXMgdGhlIGRlZmF1bHQgbGlzdGVuZXIsIHdoaWNoIGdlbmVyYXRlcyB0aGUgbG9nZ2luZyB0byBzdGFuZGFyZAorb3V0cHV0LjwvcD4KIAotPHA+PGI+Tm90ZTogPC9iPkEgbGlzdGVuZXIgbXVzdCBub3QgYWNjZXNzIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgZGlyZWN0bHkgc2luY2Ugb3V0cHV0IG9uIAotdGhlc2Ugc3RyZWFtcyBpcyByZWRpcmVjdGVkIGJ5IEFudCdzIGNvcmUgdG8gdGhlIGJ1aWxkIGV2ZW50IHN5c3RlbS4gQWNjZXNzaW5nIHRoZXNlIAotc3RyZWFtcyBjYW4gY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBpbiBBbnQuIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBBbnQsIHRoaXMgd2lsbAotZWl0aGVyIGNhdXNlIHRoZSBidWlsZCB0byB0ZXJtaW5hdGUgb3IgdGhlIEphdmEgVk0gdG8gcnVuIG91dCBvZiBTdGFjayBzcGFjZS4gQSBsb2dnZXIsIGFsc28sIG1heSAKLW5vdCBhY2Nlc3MgU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyciBkaXJlY3RseS4gSXQgbXVzdCB1c2UgdGhlIHN0cmVhbXMgd2l0aCB3aGljaCBpdCBoYXMKLWJlZW4gY29uZmlndXJlZC48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEEgbGlzdGVuZXIgbXVzdCBub3QgYWNjZXNzIDxjb2RlIGNsYXNzPSJjb2RlIj5TeXN0ZW0ub3V0PC9jb2RlPgorYW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5TeXN0ZW0uZXJyPC9jb2RlPiBkaXJlY3RseSBzaW5jZSBvdXRwdXQgb24gdGhlc2Ugc3RyZWFtcyBpcyByZWRpcmVjdGVkIGJ5CitBbnQncyBjb3JlIHRvIHRoZSBidWlsZCBldmVudCBzeXN0ZW0uIEFjY2Vzc2luZyB0aGVzZSBzdHJlYW1zIGNhbiBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIGluCitBbnQuIERlcGVuZGluZyBvbiB0aGUgdmVyc2lvbiBvZiBBbnQsIHRoaXMgd2lsbCBlaXRoZXIgY2F1c2UgdGhlIGJ1aWxkIHRvIHRlcm1pbmF0ZSBvciB0aGUgSlZNIHRvCitydW4gb3V0IG9mIFN0YWNrIHNwYWNlLiBBIGxvZ2dlciwgYWxzbywgbWF5IG5vdCBhY2Nlc3MgPGNvZGUgY2xhc3M9ImNvZGUiPlN5c3RlbS5vdXQ8L2NvZGU+CithbmQgPGNvZGUgY2xhc3M9ImNvZGUiPlN5c3RlbS5lcnI8L2NvZGU+IGRpcmVjdGx5LiBJdCBtdXN0IHVzZSB0aGUgc3RyZWFtcyB3aXRoIHdoaWNoIGl0IGhhcyBiZWVuCitjb25maWd1cmVkLjwvcD4KIAotPHA+PGI+Tm90ZTI6PC9iPiBBbGwgbWV0aG9kcyBvZiBhIEJ1aWxkTGlzdGVuZXIgZXhjZXB0IGZvciB0aGUgIkJ1aWxkCi0gIFN0YXJ0ZWQiIGFuZCAiQnVpbGQgRmluaXNoZWQiIGV2ZW50cyBtYXkgb2NjdXIgb24gc2V2ZXJhbCB0aHJlYWRzCi0gIHNpbXVsdGFuZW91c2x5IC0gZm9yIGV4YW1wbGUgd2hpbGUgQW50IGlzIGV4ZWN1dGluZwotICBhIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+IHRhc2suPC9wPgotCi0KLQotCis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEFsbCBtZXRob2RzIG9mIGEgPGNvZGUgY2xhc3M9ImNvZGUiPkJ1aWxkTGlzdGVuZXI8L2NvZGU+IGV4Y2VwdCBmb3IgdGhlCisiQnVpbGQgU3RhcnRlZCIgYW5kICJCdWlsZCBGaW5pc2hlZCIgZXZlbnRzIG1heSBvY2N1ciBvbiBzZXZlcmFsIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkmbWRhc2g7Zm9yCitleGFtcGxlIHdoaWxlIEFudCBpcyBleGVjdXRpbmcgYSA8Y29kZT4mbHQ7cGFyYWxsZWwmZ3Q7PC9jb2RlPiB0YXNrLjwvcD4KIAogPGgzPkV4YW1wbGU8L2gzPgotV3JpdGluZyBhbiBhZGFwdGVyIHRvIHlvdXIgZmF2b3VyaXRlIGxvZyBsaWJyYXJ5IGlzIHZlcnkgZWFzeS4KLUp1c3QgaW1wbGVudCB0aGUgQnVpbGRMaXN0ZW5lciBpbnRlcmZhY2UsIGluc3RhbnRpYXRlIHlvdXIgbG9nZ2VyIGFuZCBkZWxlZ2F0ZQotdGhlIG1lc3NhZ2UgdG8gdGhhdCBpbnN0YW5jZS4gPGJyPgotV2hlbiBzdGFydGluZyB5b3VyIGJ1aWxkIHByb3ZpZGUgeW91ciBhZGFwdGVyIGNsYXNzIGFuZCB0aGUgbG9nIGxpYnJhcnkgdG8gdGhlCi1idWlsZCBjbGFzc3BhdGggYW5kIGFjdGl2YXRlIHlvdXIgbG9nZ2VyIHZpYSA8Y29kZT4tbGlzdGVuZXI8L2NvZGU+IG9wdGlvbiBhcwotZGVzY3JpYmVkIGFib3ZlLgorPHA+V3JpdGluZyBhbiBhZGFwdGVyIHRvIHlvdXIgZmF2b3VyaXRlIGxvZyBsaWJyYXJ5IGlzIHZlcnkgZWFzeS4gIEp1c3QgaW1wbGVtZW50Cit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPkJ1aWxkTGlzdGVuZXI8L2NvZGU+IGludGVyZmFjZSwgaW5zdGFudGlhdGUgeW91ciBsb2dnZXIgYW5kIGRlbGVnYXRlIHRoZQorbWVzc2FnZSB0byB0aGF0IGluc3RhbmNlLjwvcD4KKzxwPldoZW4gc3RhcnRpbmcgeW91ciBidWlsZCBwcm92aWRlIHlvdXIgYWRhcHRlciBjbGFzcyBhbmQgdGhlIGxvZyBsaWJyYXJ5IHRvIHRoZSBidWlsZCBjbGFzc3BhdGgKK2FuZCBhY3RpdmF0ZSB5b3VyIGxvZ2dlciB2aWEgPGtiZD4tbGlzdGVuZXI8L2tiZD4gb3B0aW9uIGFzIGRlc2NyaWJlZCBhYm92ZS48L3A+CiAKLTxibG9ja3F1b3RlPgogPHByZT4KIHB1YmxpYyBjbGFzcyBNeUxvZ0FkYXB0ZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKIApAQCAtNTYxLDI5ICs0NzgsMjIgQEAKICAgICB9CiAKICAgICAvLyBpbXBsZW1lbnQgYWxsIG1ldGhvZHMgaW4gdGhhdCB3YXkKLX0KLTwvcHJlPgotPC9ibG9ja3F1b3RlPgorfTwvcHJlPgogCis8aHIvPgorPGgyIGlkPSJpbnRlZ3JhdGlvbiI+U291cmNlIGNvZGUgaW50ZWdyYXRpb248L2gyPgogCis8cD5UaGUgb3RoZXIgd2F5IHRvIGV4dGVuZCBBbnQgdGhyb3VnaCBKYXZhIGlzIHRvIG1ha2UgY2hhbmdlcyB0byBleGlzdGluZyB0YXNrcywgd2hpY2ggaXMKK3Bvc2l0aXZlbHkgZW5jb3VyYWdlZC4gIEJvdGggY2hhbmdlcyB0byB0aGUgZXhpc3Rpbmcgc291cmNlIGFuZCBuZXcgdGFza3MgY2FuIGJlIGluY29ycG9yYXRlZCBiYWNrCitpbnRvIHRoZSBBbnQgY29kZWJhc2UsIHdoaWNoIGJlbmVmaXRzIGFsbCB1c2VycyBhbmQgc3ByZWFkcyB0aGUgbWFpbnRlbmFuY2UgbG9hZCBhcm91bmQuPC9wPgogCi08aHI+Ci08aDI+PGEgbmFtZT0iaW50ZWdyYXRpb24iPlNvdXJjZSBjb2RlIGludGVncmF0aW9uPC9hPjwvaDI+Cis8cD5QbGVhc2UgY29uc3VsdCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL2dldGludm9sdmVkLmh0bWwiCit0YXJnZXQ9Il90b3AiPkdldHRpbmcgSW52b2x2ZWQ8L2E+IHBhZ2VzIG9uIHRoZSBBcGFjaGUgd2ViIHNpdGUgZm9yIGRldGFpbHMgb24gaG93IHRvIGZldGNoIHRoZQorbGF0ZXN0IHNvdXJjZSBhbmQgaG93IHRvIHN1Ym1pdCBjaGFuZ2VzIGZvciByZWluY29ycG9yYXRpb24gaW50byB0aGUgc291cmNlIHRyZWUuPC9wPgogCi08cD5UaGUgb3RoZXIgd2F5IHRvIGV4dGVuZCBBbnQgdGhyb3VnaCBKYXZhIGlzIHRvIG1ha2UgY2hhbmdlcyB0byBleGlzdGluZyB0YXNrcywgd2hpY2ggaXMgcG9zaXRpdmVseSBlbmNvdXJhZ2VkLgotQm90aCBjaGFuZ2VzIHRvIHRoZSBleGlzdGluZyBzb3VyY2UgYW5kIG5ldyB0YXNrcyBjYW4gYmUgaW5jb3Jwb3JhdGVkIGJhY2sgaW50byB0aGUgQW50IGNvZGViYXNlLCB3aGljaAotYmVuZWZpdHMgYWxsIHVzZXJzIGFuZCBzcHJlYWRzIHRoZSBtYWludGVuYW5jZSBsb2FkIGFyb3VuZC48L3A+Ci0KLTxwPlBsZWFzZSBjb25zdWx0IHRoZQotPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vZ2V0aW52b2x2ZWQuaHRtbCI+R2V0dGluZyBJbnZvbHZlZDwvYT4gcGFnZXMgb24gdGhlIEFwYWNoZSB3ZWIgc2l0ZQotZm9yIGRldGFpbHMgb24gaG93IHRvIGZldGNoIHRoZSBsYXRlc3Qgc291cmNlIGFuZCBob3cgdG8gc3VibWl0IGNoYW5nZXMgZm9yIHJlaW5jb3Jwb3JhdGlvbiBpbnRvIHRoZQotc291cmNlIHRyZWUuPC9wPgotCi08cD5BbnQgYWxzbyBoYXMgc29tZQotPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+dGFzayBndWlkZWxpbmVzPC9hPgotd2hpY2ggcHJvdmlkZXMgc29tZSBhZHZpY2UgdG8gcGVvcGxlIGRldmVsb3BpbmcgYW5kIHRlc3RpbmcgdGFza3MuIEV2ZW4gaWYgeW91IGludGVuZCB0bwota2VlcCB5b3VyIHRhc2tzIHRvIHlvdXJzZWxmLCB5b3Ugc2hvdWxkIHN0aWxsIHJlYWQgdGhpcyBhcyBpdCBzaG91bGQgYmUgaW5mb3JtYXRpdmUuPC9wPgorPHA+QW50IGFsc28gaGFzIHNvbWUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWwiIHRhcmdldD0iX3RvcCI+dGFzaworZ3VpZGVsaW5lczwvYT4gd2hpY2ggcHJvdmlkZXMgc29tZSBhZHZpY2UgdG8gcGVvcGxlIGRldmVsb3BpbmcgYW5kIHRlc3RpbmcgdGFza3MuIEV2ZW4gaWYgeW91IGludGVuZAordG8ga2VlcCB5b3VyIHRhc2tzIHRvIHlvdXJzZWxmLCB5b3Ugc2hvdWxkIHN0aWxsIHJlYWQgdGhpcyBhcyBpdCBzaG91bGQgYmUgaW5mb3JtYXRpdmUuPC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9kZXZlbG9wbGlzdC5odG1sIGIvbWFudWFsL2RldmVsb3BsaXN0Lmh0bWwKaW5kZXggMWJiZGM0ZS4uNWRkOWE1NCAxMDA2NDQKLS0tIGEvbWFudWFsL2RldmVsb3BsaXN0Lmh0bWwKKysrIGIvbWFudWFsL2RldmVsb3BsaXN0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KIDx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CkBAIC0zMCw4ICszMCw4IEBACiA8aDM+RGV2ZWxvcGluZyB3aXRoIEFwYWNoZSBBbnQ8L2gzPgogCiA8dWwgY2xhc3M9ImlubGluZWxpc3QiPgotPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfaW5fYW5nZXIuaHRtbCI+QW50IGluIEFuZ2VyPC9hPiA8c21hbGw+KG9ubGluZSk8L3NtYWxsPjwvbGk+Ci08bGk+PGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+QW50IFRhc2sgR3VpZGVsaW5lczwvYT4gPHNtYWxsPihvbmxpbmUpPC9zbWFsbD48L2xpPgorPGxpPjxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvYW50X2luX2FuZ2VyLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IGluIEFuZ2VyPC9hPiA8c21hbGw+KG9ubGluZSk8L3NtYWxsPjwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IFRhc2sgR3VpZGVsaW5lczwvYT4gPHNtYWxsPihvbmxpbmUpPC9zbWFsbD48L2xpPgogPGxpPjxhIGhyZWY9ImRldmVsb3AuaHRtbCN3cml0aW5nb3dudGFzayI+V3JpdGluZyBZb3VyIE93biBUYXNrPC9hPjwvbGk+CiA8bGk+PGEgaHJlZj0iYmFzZV90YXNrX2NsYXNzZXMuaHRtbCI+VGFza3MgRGVzaWduZWQgZm9yIEV4dGVuc2lvbjwvYT48L2xpPgogPGxpPjxhIGhyZWY9ImRldmVsb3AuaHRtbCNidWlsZGV2ZW50cyI+QnVpbGQgRXZlbnRzPC9hPjwvbGk+CkBAIC0zOSw3ICszOSw3IEBACiA8bGk+PGEgaHJlZj0iaW5wdXRoYW5kbGVyLmh0bWwiPklucHV0SGFuZGxlcjwvYT48L2xpPgogPGxpPjxhIGhyZWY9ImFudGV4dGVybmFsLmh0bWwiPlVzaW5nIEFudCBUYXNrcyBPdXRzaWRlIG9mIEFudDwvYT48L2xpPgogPGxpPjxhIGhyZWY9InByb2plY3RoZWxwZXIuaHRtbCI+VGhlIEFudCBmcm9udGVuZDogUHJvamVjdEhlbHBlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9ImFyZ3VtZW50cHJvY2Vzc29yLmh0bWwiPlRoZSBDb21tYW5kIExpbmUgUHJvY2Vzc29yIFBsdWdpbjpBcmd1bWVudFByb2Nlc3NvcjwvYT48L2xpPgorPGxpPjxhIGhyZWY9ImFyZ3VtZW50cHJvY2Vzc29yLmh0bWwiPlRoZSBDb21tYW5kIExpbmUgUHJvY2Vzc29yIFBsdWdpbjogQXJndW1lbnRQcm9jZXNzb3I8L2E+PC9saT4KIDwvdWw+CiAKIDxoMz5UdXRvcmlhbHM8L2gzPgpkaWZmIC0tZ2l0IGEvbWFudWFsL2RpcnRhc2tzLmh0bWwgYi9tYW51YWwvZGlydGFza3MuaHRtbAppbmRleCA1YzIzMjI5Li5kNzQ4ZmViIDEwMDY0NAotLS0gYS9tYW51YWwvZGlydGFza3MuaHRtbAorKysgYi9tYW51YWwvZGlydGFza3MuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDU0ICsxNSw1NSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+RGlyZWN0b3J5LWJhc2VkIFRhc2tzPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+CiAKLTxoMj48YSBuYW1lPSJkaXJlY3RvcnliYXNlZHRhc2tzIj5EaXJlY3RvcnktYmFzZWQgVGFza3M8L2E+PC9oMj4KKzxoMiBpZD0iZGlyZWN0b3J5YmFzZWR0YXNrcyI+RGlyZWN0b3J5LWJhc2VkIFRhc2tzPC9oMj4KIDxwPlNvbWUgdGFza3MgdXNlIGRpcmVjdG9yeSB0cmVlcyBmb3IgdGhlIGFjdGlvbnMgdGhleSBwZXJmb3JtLgogRm9yIGV4YW1wbGUsIHRoZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gdGFzaywgd2hpY2gKLWNvbXBpbGVzIGEgZGlyZWN0b3J5IHRyZWUgd2l0aCA8Y29kZT4uamF2YTwvY29kZT4gZmlsZXMgaW50bwotPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcywgaXMgb25lIG9mIHRoZXNlIGRpcmVjdG9yeS1iYXNlZCB0YXNrcy4gQmVjYXVzZQorY29tcGlsZXMgYSBkaXJlY3RvcnkgdHJlZSB3aXRoIDxzYW1wPi5qYXZhPC9zYW1wPiBmaWxlcyBpbnRvCis8c2FtcD4uY2xhc3M8L3NhbXA+IGZpbGVzLCBpcyBvbmUgb2YgdGhlc2UgZGlyZWN0b3J5LWJhc2VkIHRhc2tzLiBCZWNhdXNlCiBzb21lIG9mIHRoZXNlIHRhc2tzIGRvIHNvIG11Y2ggd29yayB3aXRoIGEgZGlyZWN0b3J5IHRyZWUsIHRoZSB0YXNrIGl0c2VsZgogY2FuIGFjdCBhcyBhbiBpbXBsaWNpdCA8YSBocmVmPSJUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+LjwvcD4KKwogPHA+V2hldGhlciB0aGUgZmlsZXNldCBpcyBpbXBsaWNpdCBvciBub3QsIGl0IGNhbiBvZnRlbiBiZSB2ZXJ5IHVzZWZ1bCB0bwogd29yayBvbiBhIHN1YnNldCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUuIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IHlvdSBjYW4KIHNlbGVjdCBhIHN1YnNldCBvZiBzdWNoIGEgZGlyZWN0b3J5IHRyZWUgd2hlbiB1c2luZyBvbmUgb2YgdGhlc2UKIGRpcmVjdG9yeS1iYXNlZCB0YXNrcy48L3A+Ci08cD5BcGFjaGUgQW50IGdpdmVzIHlvdSB0d28gd2F5cyB0byBjcmVhdGUgYSBzdWJzZXQgb2YgZmlsZXMgaW4gYSBmaWxlc2V0LCBib3RoIG9mCi13aGljaCBjYW4gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lOjwvcD4KKworPHA+QXBhY2hlIEFudCBnaXZlcyB5b3UgdHdvIHdheXMgdG8gY3JlYXRlIGEgc3Vic2V0IG9mIGZpbGVzIGluIGEKK2ZpbGVzZXQsIGJvdGggb2Ygd2hpY2ggY2FuIGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZTo8L3A+CiA8dWw+CiAgIDxsaT5Pbmx5IGluY2x1ZGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHRoYXQgbWF0Y2ggYW55Ci0gICAgPGNvZGU+aW5jbHVkZTwvY29kZT4gcGF0dGVybnMgYW5kIGRvIG5vdCBtYXRjaCBhbnkKLSAgICA8Y29kZT5leGNsdWRlPC9jb2RlPiBwYXR0ZXJucyBpbiBhIGdpdmVuCisgICAgPHZhcj5pbmNsdWRlPC92YXI+IHBhdHRlcm5zIGFuZCBkbyBub3QgbWF0Y2ggYW55CisgICAgPHZhcj5leGNsdWRlPC92YXI+IHBhdHRlcm5zIGluIGEgZ2l2ZW4KICAgICA8YSBocmVmPSJUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXQ8L2E+LjwvbGk+CiAgIDxsaT5TZWxlY3QgZmlsZXMgYmFzZWQgb24gc2VsZWN0aW9uIGNyaXRlcmlhIGRlZmluZWQgYnkgYSBjb2xsZWN0aW9uIG9mCiAgICAgPGEgaHJlZj0iVHlwZXMvc2VsZWN0b3JzLmh0bWwiPnNlbGVjdG9yPC9hPiBuZXN0ZWQgZWxlbWVudHMuPC9saT4KIDwvdWw+Ci08aDM+PGEgbmFtZT0icGF0dGVybnNldCI+UGF0dGVybnNldDwvYT48L2gzPgorPGgzIGlkPSJwYXR0ZXJuc2V0Ij5QYXR0ZXJuc2V0PC9oMz4KIAotPHA+V2Ugc2FpZCB0aGF0IERpcmVjdG9yeS1iYXNlZCB0YXNrcyBjYW4gc29tZXRpbWVzIGFjdCBhcyBhbiBpbXBsaWNpdAotPGEgaHJlZj0iVHlwZXMvZmlsZXNldC5odG1sIj48Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+PC9hPiwKLWJ1dCBpbiBhZGRpdGlvbiB0byB0aGF0LCBhIEZpbGVTZXQgYWN0cyBhcyBhbiBpbXBsaWNpdAotPGEgaHJlZj0iVHlwZXMvcGF0dGVybnNldC5odG1sIj48Y29kZT4mbHQ7cGF0dGVybnNldCZndDs8L2NvZGU+PC9hPi48L3A+Cis8cD5XZSBzYWlkIHRoYXQgRGlyZWN0b3J5LWJhc2VkIHRhc2tzIGNhbiBzb21ldGltZXMgYWN0IGFzIGFuCitpbXBsaWNpdCA8YSBocmVmPSJUeXBlcy9maWxlc2V0Lmh0bWwiPjxjb2RlPiZsdDtmaWxlc2V0Jmd0OzwvY29kZT48L2E+LAorYnV0IGluIGFkZGl0aW9uIHRvIHRoYXQsIGEgRmlsZVNldCBhY3RzIGFzIGFuCitpbXBsaWNpdCA8YSBocmVmPSJUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPjxjb2RlPiZsdDtwYXR0ZXJuc2V0Jmd0OzwvY29kZT48L2E+LjwvcD4KIAogPHA+VGhlIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uIGVsZW1lbnRzIG9mIHRoZSBpbXBsaWNpdCBQYXR0ZXJuU2V0IGNhbiBiZQogc3BlY2lmaWVkIGluc2lkZSB0aGUgZGlyZWN0b3J5LWJhc2VkIHRhc2sgKG9yIGV4cGxpY2l0IGZpbGVzZXQpIHZpYQogZWl0aGVyOjwvcD4KIDx1bD4KLSAgPGxpPnRoZSBhdHRyaWJ1dGVzIDxjb2RlPmluY2x1ZGVzPC9jb2RlPiBhbmQKLSAgICA8Y29kZT5leGNsdWRlczwvY29kZT4uPC9saT4KKyAgPGxpPnRoZSBhdHRyaWJ1dGVzIDx2YXI+aW5jbHVkZXM8L3Zhcj4gYW5kCisgICAgPHZhcj5leGNsdWRlczwvdmFyPi48L2xpPgogICA8bGk+bmVzdGVkIGVsZW1lbnRzIDxjb2RlPiZsdDtpbmNsdWRlJmd0OzwvY29kZT4gYW5kCiAgICAgPGNvZGU+Jmx0O2V4Y2x1ZGUmZ3Q7PC9jb2RlPi48L2xpPgogICA8bGk+ZXh0ZXJuYWwgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlIGF0dHJpYnV0ZXMKLSAgICA8Y29kZT5pbmNsdWRlc2ZpbGU8L2NvZGU+IGFuZCA8Y29kZT5leGNsdWRlc2ZpbGU8L2NvZGU+LjwvbGk+CisgICAgPHZhcj5pbmNsdWRlc2ZpbGU8L3Zhcj4gYW5kIDx2YXI+ZXhjbHVkZXNmaWxlPC92YXI+LjwvbGk+CiAgIDxsaT5leHRlcm5hbCBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgbmVzdGVkIGVsZW1lbnRzCiAgICAgPGNvZGU+Jmx0O2luY2x1ZGVzZmlsZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZXhjbHVkZXNmaWxlJmd0OzwvY29kZT4uCiAgIDwvbGk+CkBAIC03NywxNDIgKzc5LDEzOSBAQAogYXJlIGFzc3VtZWQgdG8gbWF0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybiAod2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mCiB0aGUgZGVmYXVsdCBleGNsdWRlcykuPC9wPgogCi08aDQ+PGEgbmFtZT0icGF0dGVybnMiPlBhdHRlcm5zPC9hPjwvaDQ+Cis8aDQgaWQ9InBhdHRlcm5zIj5QYXR0ZXJuczwvaDQ+CiAKIDxwPkFzIGRlc2NyaWJlZCBlYXJsaWVyLCBwYXR0ZXJucyBhcmUgdXNlZCBmb3IgdGhlIGluY2x1c2lvbiBhbmQgZXhjbHVzaW9uCiBvZiBmaWxlcy4gVGhlc2UgcGF0dGVybnMgbG9vayB2ZXJ5IG11Y2ggbGlrZSB0aGUgcGF0dGVybnMgdXNlZCBpbiBET1MgYW5kCiBVTklYOjwvcD4KLTxwPicqJyBtYXRjaGVzIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzLCAnPycgbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLjwvcD4KKworPHA+PHE+KjwvcT4gbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycywgPHE+PzwvcT4gbWF0Y2hlcyBvbmUgY2hhcmFjdGVyLjwvcD4KIAogPHA+SW4gZ2VuZXJhbCwgcGF0dGVybnMgYXJlIGNvbnNpZGVyZWQgcmVsYXRpdmUgcGF0aHMsIHJlbGF0aXZlIHRvIGEKLXRhc2sgZGVwZW5kZW50IGJhc2UgZGlyZWN0b3J5ICh0aGUgZGlyIGF0dHJpYnV0ZSBpbiB0aGUgY2FzZSBvZgotPGNvZGU+Jmx0O2ZpbGVzZXQmZ3Q7PC9jb2RlPikuICBPbmx5IGZpbGVzIGZvdW5kIGJlbG93IHRoYXQgYmFzZQotZGlyZWN0b3J5IGFyZSBjb25zaWRlcmVkLiAgU28gd2hpbGUgYSBwYXR0ZXJuIGxpa2UKLTxjb2RlPi4uL2Zvby5qYXZhPC9jb2RlPiBpcyBwb3NzaWJsZSwgaXQgd2lsbCBub3QgbWF0Y2ggYW55dGhpbmcgd2hlbgotYXBwbGllZCBzaW5jZSB0aGUgYmFzZSBkaXJlY3RvcnkncyBwYXJlbnQgaXMgbmV2ZXIgc2Nhbm5lZCBmb3IKLWZpbGVzLjwvcD4KK3Rhc2sgZGVwZW5kZW50IGJhc2UgZGlyZWN0b3J5ICh0aGUgPHZhcj5kaXI8L3Zhcj4gYXR0cmlidXRlIGluIHRoZQorY2FzZSBvZiA8Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+KS4gIE9ubHkgZmlsZXMgZm91bmQgYmVsb3cgdGhhdCBiYXNlCitkaXJlY3RvcnkgYXJlIGNvbnNpZGVyZWQuICBTbyB3aGlsZSBhIHBhdHRlcm4KK2xpa2UgPHNhbXA+Li4vZm9vLmphdmE8L3NhbXA+IGlzIHBvc3NpYmxlLCBpdCB3aWxsIG5vdCBtYXRjaAorYW55dGhpbmcgd2hlbiBhcHBsaWVkIHNpbmNlIHRoZSBiYXNlIGRpcmVjdG9yeSdzIHBhcmVudCBpcyBuZXZlcgorc2Nhbm5lZCBmb3IgZmlsZXMuPC9wPgogCi08cD48Yj5FeGFtcGxlczo8L2I+PC9wPgorPGg1PkV4YW1wbGVzPC9oNT4KIDxwPgotPGNvZGU+Ki5qYXZhPC9jb2RlPiZuYnNwOyZuYnNwO21hdGNoZXMmbmJzcDsmbmJzcDs8Y29kZT4uamF2YTwvY29kZT4sCi08Y29kZT54LmphdmE8L2NvZGU+IGFuZCA8Y29kZT5Gb29CYXIuamF2YTwvY29kZT4sIGJ1dAotbm90IDxjb2RlPkZvb0Jhci54bWw8L2NvZGU+IChkb2VzIG5vdCBlbmQgd2l0aCA8Y29kZT4uamF2YTwvY29kZT4pLjwvcD4KKzxzYW1wPiouamF2YTwvc2FtcD4mbmJzcDsmbmJzcDttYXRjaGVzJm5ic3A7Jm5ic3A7PHNhbXA+LmphdmE8L3NhbXA+LAorPHNhbXA+eC5qYXZhPC9zYW1wPiBhbmQgPHNhbXA+Rm9vQmFyLmphdmE8L3NhbXA+LCBidXQKK25vdCA8c2FtcD5Gb29CYXIueG1sPC9zYW1wPiAoZG9lcyBub3QgZW5kIHdpdGggPHNhbXA+LmphdmE8L3NhbXA+KS48L3A+CisKIDxwPgotPGNvZGU+Py5qYXZhPC9jb2RlPiZuYnNwOyZuYnNwO21hdGNoZXMmbmJzcDsmbmJzcDs8Y29kZT54LmphdmE8L2NvZGU+LAotPGNvZGU+QS5qYXZhPC9jb2RlPiwgYnV0IG5vdCA8Y29kZT4uamF2YTwvY29kZT4gb3IgPGNvZGU+eHl6LmphdmE8L2NvZGU+Ci0oYm90aCBkb24ndCBoYXZlIG9uZSBjaGFyYWN0ZXIgYmVmb3JlIDxjb2RlPi5qYXZhPC9jb2RlPikuPC9wPgotPHA+Ci1Db21iaW5hdGlvbnMgb2YgPGNvZGU+KjwvY29kZT4ncyBhbmQgPGNvZGU+PzwvY29kZT4ncyBhcmUgYWxsb3dlZC48L3A+Cis8c2FtcD4/LmphdmE8L3NhbXA+Jm5ic3A7Jm5ic3A7bWF0Y2hlcyZuYnNwOyZuYnNwOzxzYW1wPnguamF2YTwvc2FtcD4sCis8c2FtcD5BLmphdmE8L3NhbXA+LCBidXQgbm90IDxzYW1wPi5qYXZhPC9zYW1wPiBvciA8c2FtcD54eXouamF2YTwvc2FtcD4KKyhib3RoIGRvbid0IGhhdmUgb25lIGNoYXJhY3RlciBiZWZvcmUgPHNhbXA+LmphdmE8L3NhbXA+KS48L3A+CisKKzxwPkNvbWJpbmF0aW9ucyBvZiA8cT4qPC9xPidzIGFuZCA8cT4/PC9xPidzIGFyZSBhbGxvd2VkLjwvcD4KKwogPHA+TWF0Y2hpbmcgaXMgZG9uZSBwZXItZGlyZWN0b3J5LiBUaGlzIG1lYW5zIHRoYXQgZmlyc3QgdGhlIGZpcnN0IGRpcmVjdG9yeSBpbgogdGhlIHBhdHRlcm4gaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaXJzdCBkaXJlY3RvcnkgaW4gdGhlIHBhdGggdG8gbWF0Y2guIFRoZW4KLXRoZSBzZWNvbmQgZGlyZWN0b3J5IGlzIG1hdGNoZWQsIGFuZCBzbyBvbi4gRm9yIGV4YW1wbGUsIHdoZW4gd2UgaGF2ZSB0aGUgcGF0dGVybgotPGNvZGU+Lz9hYmMvKi8qLmphdmE8L2NvZGU+Ci1hbmQgdGhlIHBhdGggPGNvZGU+L3hhYmMvZm9vYmFyL3Rlc3QuamF2YTwvY29kZT4sCi10aGUgZmlyc3QgPGNvZGU+P2FiYzwvY29kZT4gaXMgbWF0Y2hlZCB3aXRoIDxjb2RlPnhhYmM8L2NvZGU+LAotdGhlbiA8Y29kZT4qPC9jb2RlPiBpcyBtYXRjaGVkIHdpdGggPGNvZGU+Zm9vYmFyPC9jb2RlPiwKLWFuZCBmaW5hbGx5IDxjb2RlPiouamF2YTwvY29kZT4gaXMgbWF0Y2hlZCB3aXRoIDxjb2RlPnRlc3QuamF2YTwvY29kZT4uCit0aGUgc2Vjb25kIGRpcmVjdG9yeSBpcyBtYXRjaGVkLCBhbmQgc28gb24uIEZvciBleGFtcGxlLCB3aGVuIHdlIGhhdmUKK3RoZSBwYXR0ZXJuIDxzYW1wPi8/YWJjLyovKi5qYXZhPC9zYW1wPgorYW5kIHRoZSBwYXRoIDxzYW1wPi94YWJjL2Zvb2Jhci90ZXN0LmphdmE8L3NhbXA+LAordGhlIGZpcnN0IDxzYW1wPj9hYmM8L3NhbXA+IGlzIG1hdGNoZWQgd2l0aCA8c2FtcD54YWJjPC9zYW1wPiwKK3RoZW4gPHNhbXA+Kjwvc2FtcD4gaXMgbWF0Y2hlZCB3aXRoIDxzYW1wPmZvb2Jhcjwvc2FtcD4sCithbmQgZmluYWxseSA8c2FtcD4qLmphdmE8L3NhbXA+IGlzIG1hdGNoZWQgd2l0aCA8c2FtcD50ZXN0LmphdmE8L3NhbXA+LgogVGhleSBhbGwgbWF0Y2gsIHNvIHRoZSBwYXRoIG1hdGNoZXMgdGhlIHBhdHRlcm4uPC9wPgorCiA8cD5UbyBtYWtlIHRoaW5ncyBhIGJpdCBtb3JlIGZsZXhpYmxlLCB3ZSBhZGQgb25lIGV4dHJhIGZlYXR1cmUsIHdoaWNoIG1ha2VzIGl0CiBwb3NzaWJsZSB0byBtYXRjaCBtdWx0aXBsZSBkaXJlY3RvcnkgbGV2ZWxzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1hdGNoIGEKIGNvbXBsZXRlIGRpcmVjdG9yeSB0cmVlLCBvciBhIGZpbGUgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlLgotVG8gZG8gdGhpcywgPGNvZGU+Kio8L2NvZGU+Ci1tdXN0IGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkuCi1XaGVuIDxjb2RlPioqPC9jb2RlPiBpcyB1c2VkIGFzIHRoZSBuYW1lIG9mIGEKLWRpcmVjdG9yeSBpbiB0aGUgcGF0dGVybiwgaXQgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgZGlyZWN0b3JpZXMuCi1Gb3IgZXhhbXBsZToKLTxjb2RlPi90ZXN0LyoqPC9jb2RlPiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJlY3RvcmllcyB1bmRlciA8Y29kZT4vdGVzdC88L2NvZGU+LAotc3VjaCBhcyA8Y29kZT4vdGVzdC94LmphdmE8L2NvZGU+LAotb3IgPGNvZGU+L3Rlc3QvZm9vL2Jhci94eXouaHRtbDwvY29kZT4sIGJ1dCBub3QgPGNvZGU+L3h5ei54bWw8L2NvZGU+LjwvcD4KLTxwPlRoZXJlIGlzIG9uZSAmcXVvdDtzaG9ydGhhbmQmcXVvdDs6IGlmIGEgcGF0dGVybiBlbmRzCi13aXRoIDxjb2RlPi88L2NvZGU+Ci1vciA8Y29kZT5cPC9jb2RlPiwgdGhlbiA8Y29kZT4qKjwvY29kZT4KLWlzIGFwcGVuZGVkLgotRm9yIGV4YW1wbGUsIDxjb2RlPm15cGFja2FnZS90ZXN0LzwvY29kZT4gaXMgaW50ZXJwcmV0ZWQgYXMgaWYgaXQgd2VyZQotPGNvZGU+bXlwYWNrYWdlL3Rlc3QvKio8L2NvZGU+LjwvcD4KLTxwPjxiPkV4YW1wbGUgcGF0dGVybnM6PC9iPjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CitUbyBkbyB0aGlzLCA8cT4qKjwvcT4gbXVzdCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIGEKK2RpcmVjdG9yeS4gV2hlbiA8c2FtcD4qKjwvc2FtcD4gaXMgdXNlZCBhcyB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSBpbgordGhlIHBhdHRlcm4sIGl0IG1hdGNoZXMgemVybyBvciBtb3JlIGRpcmVjdG9yaWVzLiBGb3IKK2V4YW1wbGU6IDxzYW1wPi90ZXN0LyoqPC9zYW1wPiBtYXRjaGVzIGFsbCBmaWxlcy9kaXJlY3RvcmllcwordW5kZXIgPHNhbXA+L3Rlc3QvPC9zYW1wPiwgc3VjaCBhcyA8c2FtcD4vdGVzdC94LmphdmE8L3NhbXA+LAorb3IgPHNhbXA+L3Rlc3QvZm9vL2Jhci94eXouaHRtbDwvc2FtcD4sIGJ1dCBub3QgPHNhbXA+L3h5ei54bWw8L3NhbXA+LjwvcD4KKworPHA+VGhlcmUgaXMgb25lICZxdW90O3Nob3J0aGFuZCZxdW90OzogaWYgYSBwYXR0ZXJuIGVuZHMgd2l0aCA8cT4vPC9xPgorb3IgPHE+XDwvcT4sIHRoZW4gPHE+Kio8L3E+IGlzIGFwcGVuZGVkLiBGb3IKK2V4YW1wbGUsIDxzYW1wPm15cGFja2FnZS90ZXN0Lzwvc2FtcD4gaXMgaW50ZXJwcmV0ZWQgYXMgaWYgaXQKK3dlcmUgPHNhbXA+bXlwYWNrYWdlL3Rlc3QvKio8L3NhbXA+LjwvcD4KKworPGg1PkV4YW1wbGUgcGF0dGVybnM8L2g1PgorPHRhYmxlPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT4qKi9DVlMvKjwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF0Y2hlcyBhbGwgZmlsZXMgaW4gPGNvZGU+Q1ZTPC9jb2RlPgorICAgIDx0ZD5FeGFtcGxlPC90ZD4KKyAgICA8dGQ+RXhwbGFuYXRpb248L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPjxzYW1wPioqL0NWUy8qPC9zYW1wPjwvdGQ+CisgICAgPHRkPk1hdGNoZXMgYWxsIGZpbGVzIGluIDxzYW1wPkNWUzwvc2FtcD4KICAgICAgIGRpcmVjdG9yaWVzIHRoYXQgY2FuIGJlIGxvY2F0ZWQKLSAgICAgIGFueXdoZXJlIGluIHRoZSBkaXJlY3RvcnkgdHJlZS48YnI+CisgICAgICBhbnl3aGVyZSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUuPGJyLz4KICAgICAgIE1hdGNoZXM6Ci0gICAgICA8cHJlPgotICAgICAgQ1ZTL1JlcG9zaXRvcnkKLSAgICAgIG9yZy9hcGFjaGUvQ1ZTL0VudHJpZXMKLSAgICAgIG9yZy9hcGFjaGUvamFrYXJ0YS90b29scy9hbnQvQ1ZTL0VudHJpZXMKLSAgICAgIDwvcHJlPgotICAgICAgQnV0IG5vdDoKLSAgICAgIDxwcmU+Ci0gICAgICBvcmcvYXBhY2hlL0NWUy9mb28vYmFyL0VudHJpZXMgKDxjb2RlPmZvby9iYXIvPC9jb2RlPgotICAgICAgcGFydCBkb2VzIG5vdCBtYXRjaCkKLSAgICAgIDwvcHJlPgorPHByZT4KK0NWUy9SZXBvc2l0b3J5CitvcmcvYXBhY2hlL0NWUy9FbnRyaWVzCitvcmcvYXBhY2hlL2pha2FydGEvdG9vbHMvYW50L0NWUy9FbnRyaWVzPC9wcmU+CitCdXQgbm90OgorPHByZT5vcmcvYXBhY2hlL0NWUy9mb28vYmFyL0VudHJpZXM8L3ByZT4KKyg8c2FtcD5mb28vYmFyLzwvc2FtcD4gcGFydCBkb2VzIG5vdCBtYXRjaCkKICAgICA8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Y29kZT5vcmcvYXBhY2hlL2pha2FydGEvKio8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1hdGNoZXMgYWxsIGZpbGVzIGluIHRoZSA8Y29kZT5vcmcvYXBhY2hlL2pha2FydGE8L2NvZGU+Ci0gICAgICBkaXJlY3RvcnkgdHJlZS48YnI+CisgICAgPHRkPjxzYW1wPm9yZy9hcGFjaGUvamFrYXJ0YS8qKjwvc2FtcD48L3RkPgorICAgIDx0ZD5NYXRjaGVzIGFsbCBmaWxlcyBpbiB0aGUgPHNhbXA+b3JnL2FwYWNoZS9qYWthcnRhPC9zYW1wPgorICAgICAgZGlyZWN0b3J5IHRyZWUuPGJyLz4KICAgICAgIE1hdGNoZXM6Ci0gICAgICA8cHJlPgotICAgICAgb3JnL2FwYWNoZS9qYWthcnRhL3Rvb2xzL2FudC9kb2NzL2luZGV4Lmh0bWwKLSAgICAgIG9yZy9hcGFjaGUvamFrYXJ0YS90ZXN0LnhtbAotICAgICAgPC9wcmU+Ci0gICAgICBCdXQgbm90OgotICAgICAgPHByZT4KLSAgICAgIG9yZy9hcGFjaGUveHl6LmphdmEKLSAgICAgIDwvcHJlPgotICAgICAgKDxjb2RlPmpha2FydGEvPC9jb2RlPiBwYXJ0IGlzIG1pc3NpbmcpLjwvdGQ+Cis8cHJlPgorb3JnL2FwYWNoZS9qYWthcnRhL3Rvb2xzL2FudC9kb2NzL2luZGV4Lmh0bWwKK29yZy9hcGFjaGUvamFrYXJ0YS90ZXN0LnhtbAorPC9wcmU+CitCdXQgbm90OgorPHByZT5vcmcvYXBhY2hlL3h5ei5qYXZhPC9wcmU+CisoPGNvZGU+amFrYXJ0YS88L2NvZGU+IHBhcnQgaXMgbWlzc2luZykuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGNvZGU+b3JnL2FwYWNoZS8qKi9DVlMvKjwvY29kZT48L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+TWF0Y2hlcyBhbGwgZmlsZXMgaW4gPGNvZGU+Q1ZTPC9jb2RlPiBkaXJlY3RvcmllcworICAgIDx0ZD48c2FtcD5vcmcvYXBhY2hlLyoqL0NWUy8qPC9zYW1wPjwvdGQ+CisgICAgPHRkPk1hdGNoZXMgYWxsIGZpbGVzIGluIDxzYW1wPkNWUzwvc2FtcD4gZGlyZWN0b3JpZXMKICAgICAgIHRoYXQgYXJlIGxvY2F0ZWQgYW55d2hlcmUgaW4gdGhlIGRpcmVjdG9yeSB0cmVlIHVuZGVyCi0gICAgICA8Y29kZT5vcmcvYXBhY2hlPC9jb2RlPi48YnI+CisgICAgICA8c2FtcD5vcmcvYXBhY2hlPC9zYW1wPi48YnIvPgogICAgICAgTWF0Y2hlczoKLSAgICAgIDxwcmU+Ci0gICAgICBvcmcvYXBhY2hlL0NWUy9FbnRyaWVzCi0gICAgICBvcmcvYXBhY2hlL2pha2FydGEvdG9vbHMvYW50L0NWUy9FbnRyaWVzCi0gICAgICA8L3ByZT4KLSAgICAgIEJ1dCBub3Q6Ci0gICAgICA8cHJlPgotICAgICAgb3JnL2FwYWNoZS9DVlMvZm9vL2Jhci9FbnRyaWVzCi0gICAgICA8L3ByZT4KLSAgICAgICg8Y29kZT5mb28vYmFyLzwvY29kZT4gcGFydCBkb2VzIG5vdCBtYXRjaCk8L3RkPgorPHByZT4KK29yZy9hcGFjaGUvQ1ZTL0VudHJpZXMKK29yZy9hcGFjaGUvamFrYXJ0YS90b29scy9hbnQvQ1ZTL0VudHJpZXM8L3ByZT4KK0J1dCBub3Q6Cis8cHJlPm9yZy9hcGFjaGUvQ1ZTL2Zvby9iYXIvRW50cmllczwvcHJlPgorKDxzYW1wPmZvby9iYXIvPC9zYW1wPiBwYXJ0IGRvZXMgbm90IG1hdGNoKTwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxjb2RlPioqL3Rlc3QvKio8L2NvZGU+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPk1hdGNoZXMgYWxsIGZpbGVzIHRoYXQgaGF2ZSBhIDxjb2RlPnRlc3Q8L2NvZGU+Ci0gICAgICAgIGVsZW1lbnQgaW4gdGhlaXIgcGF0aCwgaW5jbHVkaW5nIDxjb2RlPnRlc3Q8L2NvZGU+IGFzIGEgZmlsZW5hbWUuPC90ZD4KKyAgICA8dGQ+PHNhbXA+KiovdGVzdC8qKjwvc2FtcD48L3RkPgorICAgIDx0ZD5NYXRjaGVzIGFsbCBmaWxlcyB0aGF0IGhhdmUgYSA8c2FtcD50ZXN0PC9zYW1wPgorICAgICAgICBlbGVtZW50IGluIHRoZWlyIHBhdGgsIGluY2x1ZGluZyA8c2FtcD50ZXN0PC9zYW1wPiBhcyBhIGZpbGVuYW1lLjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogPHA+V2hlbiB0aGVzZSBwYXR0ZXJucyBhcmUgdXNlZCBpbiBpbmNsdXNpb24gYW5kIGV4Y2x1c2lvbiwgeW91IGhhdmUgYSBwb3dlcmZ1bAogd2F5IHRvIHNlbGVjdCBqdXN0IHRoZSBmaWxlcyB5b3Ugd2FudC48L3A+CiAKLTxoMz48YSBuYW1lPSJzZWxlY3RvcnMiPlNlbGVjdG9yczwvYT48L2gzPgorPGgzIGlkPSJzZWxlY3RvcnMiPlNlbGVjdG9yczwvaDM+CiA8cD5UaGUgPGEgaHJlZj0iVHlwZXMvZmlsZXNldC5odG1sIj48Y29kZT4mbHQ7ZmlsZXNldCZndDs8L2NvZGU+PC9hPiwKLXdoZXRoZXIgaW1wbGljaXQgb3IgZXhwbGljaXQgaW4gdGhlCi1kaXJlY3RvcnktYmFzZWQgdGFzaywgYWxzbyBhY3RzIGFzIGFuCi08YSBocmVmPSJUeXBlcy9zZWxlY3RvcnMuaHRtbCNhbmRzZWxlY3QiPjxjb2RlPiZsdDthbmQmZ3Q7PC9jb2RlPjwvYT4KK3doZXRoZXIgaW1wbGljaXQgb3IgZXhwbGljaXQgaW4gdGhlIGRpcmVjdG9yeS1iYXNlZCB0YXNrLCBhbHNvIGFjdHMgYXMKK2FuIDxhIGhyZWY9IlR5cGVzL3NlbGVjdG9ycy5odG1sI2FuZHNlbGVjdCI+PGNvZGU+Jmx0O2FuZCZndDs8L2NvZGU+PC9hPgogc2VsZWN0b3IgY29udGFpbmVyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhcmJpdHJhcmlseSBjb21wbGljYXRlZAotc2VsZWN0aW9uIGNyaXRlcmlhIGZvciB0aGUgZmlsZXMgdGhlIHRhc2sgc2hvdWxkIHdvcmsgd2l0aC4gU2VlIHRoZQotPGEgaHJlZj0iVHlwZXMvc2VsZWN0b3JzLmh0bWwiPlNlbGVjdG9yPC9hPiBkb2N1bWVudGF0aW9uIGZvciBtb3JlCi1pbmZvcm1hdGlvbi48L3A+CitzZWxlY3Rpb24gY3JpdGVyaWEgZm9yIHRoZSBmaWxlcyB0aGUgdGFzayBzaG91bGQgd29yayB3aXRoLiBTZWUKK3RoZSA8YSBocmVmPSJUeXBlcy9zZWxlY3RvcnMuaHRtbCI+U2VsZWN0b3I8L2E+IGRvY3VtZW50YXRpb24gZm9yCittb3JlIGluZm9ybWF0aW9uLjwvcD4KIAotPGgzPjxhIG5hbWU9InRhc2tsaXN0Ij5TdGFuZGFyZCBUYXNrcy9GaWxlc2V0czwvYT48L2gzPgorPGgzIGlkPSJ0YXNrbGlzdCI+U3RhbmRhcmQgVGFza3MvRmlsZVNldHM8L2gzPgogPHA+TWFueSBvZiB0aGUgc3RhbmRhcmQgdGFza3MgaW4gYW50IHRha2Ugb25lIG9yIG1vcmUgZmlsZXNldHMgd2hpY2ggZm9sbG93CiB0aGUgcnVsZXMgZ2l2ZW4gaGVyZS4gVGhpcyBsaXN0LCBhIHN1YnNldCBvZiB0aG9zZSwgaXMgYSBsaXN0IG9mIHN0YW5kYXJkIGFudAogdGFza3MgdGhhdCBjYW4gYWN0IGFzIGFuIGltcGxpY2l0IGZpbGVzZXQ6PC9wPgogPHVsPgotICAgICAgPGxpPjxhIGhyZWY9IlRhc2tzL2NoZWNrc3VtLmh0bWwiPjxjb2RlPiZsdDtjaGVja3N1bSZndDs8L2NvZGU+PC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJUYXNrcy9jb3B5ZGlyLmh0bWwiPjxjb2RlPiZsdDtjb3B5ZGlyJmd0OzwvY29kZT48L2E+IChkZXByZWNhdGVkKTwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jaGVja3N1bS5odG1sIj48Y29kZT4mbHQ7Y2hlY2tzdW0mZ3Q7PC9jb2RlPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvY29weWRpci5odG1sIj48Y29kZT4mbHQ7Y29weWRpciZndDs8L2NvZGU+PC9hPiAoPGVtPmRlcHJlY2F0ZWQ8L2VtPik8L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvZGVsZXRlLmh0bWwiPjxjb2RlPiZsdDtkZWxldGUmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvZGVwZW5kc2V0Lmh0bWwiPjxjb2RlPiZsdDtkZXBlbmRzZXQmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvZml4Y3JsZi5odG1sIj48Y29kZT4mbHQ7Zml4Y3JsZiZndDs8L2NvZGU+PC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj48Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvcmVwbGFjZS5odG1sIj48Y29kZT4mbHQ7cmVwbGFjZSZndDs8L2NvZGU+PC9hPjwvbGk+CiAgIDxsaT48YSBocmVmPSJUYXNrcy9ybWljLmh0bWwiPjxjb2RlPiZsdDtybWljJmd0OzwvY29kZT48L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IlRhc2tzL3N0eWxlLmh0bWwiPjxjb2RlPiZsdDtzdHlsZSZndDs8L2NvZGU+IChha2EgPGNvZGU+Jmx0O3hzbHQmZ3Q7PC9jb2RlPik8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3N0eWxlLmh0bWwiPjxjb2RlPiZsdDt4c2x0Jmd0OzwvY29kZT4gKGFrYSA8Y29kZT4mbHQ7c3R5bGUmZ3Q7PC9jb2RlPik8L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IlRhc2tzL3Rhci5odG1sIj48Y29kZT4mbHQ7dGFyJmd0OzwvY29kZT48L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IlRhc2tzL3ppcC5odG1sIj48Y29kZT4mbHQ7emlwJmd0OzwvY29kZT48L2E+PC9saT4KICAgPGxpPjxhIGhyZWY9IlRhc2tzL2VqYi5odG1sI2RkY3JlYXRvciI+PGNvZGU+Jmx0O2RkY3JlYXRvciZndDs8L2NvZGU+PC9hPjwvbGk+CkBAIC0yMjEsMzggKzIyMCwzNCBAQAogICA8bGk+PGEgaHJlZj0iVGFza3MvY2FiLmh0bWwiPjxjb2RlPiZsdDtjYWImZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPjxjb2RlPiZsdDtuYXRpdmUyYXNjaWkmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+PGNvZGU+Jmx0O25ldHJleHhjJmd0OzwvY29kZT48L2E+PC9saT4KLSAgPGxpPgotICAgIDxhIGhyZWY9IlRhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbCI+PGNvZGU+Jmx0O3JlbmFtZWV4dGVuc2lvbnMmZ3Q7PC9jb2RlPjwvYT4KLSAgPC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3JlbmFtZWV4dGVuc2lvbnMuaHRtbCI+PGNvZGU+Jmx0O3JlbmFtZWV4dGVuc2lvbnMmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvZGVwZW5kLmh0bWwiPjxjb2RlPiZsdDtkZXBlbmQmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvdHJhbnNsYXRlLmh0bWwiPjxjb2RlPiZsdDt0cmFuc2xhdGUmZ3Q7PC9jb2RlPjwvYT48L2xpPgogICA8bGk+PGEgaHJlZj0iVGFza3MvaW1hZ2UuaHRtbCI+PGNvZGU+Jmx0O2ltYWdlJmd0OzwvY29kZT48L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9IlRhc2tzL2psaW5rLmh0bWwiPjxjb2RlPiZsdDtqbGluayZndDs8L2NvZGU+PC9hPiAoZGVwcmVjYXRlZCk8L2xpPgotICA8bGk+PGEgaHJlZj0iVGFza3MvanNwYy5odG1sIj48Y29kZT4mbHQ7anNwYyZndDs8L2NvZGU+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qbGluay5odG1sIj48Y29kZT4mbHQ7amxpbmsmZ3Q7PC9jb2RlPjwvYT4gKDxlbT5kZXByZWNhdGVkPC9lbT4pPC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2pzcGMuaHRtbCI+PGNvZGU+Jmx0O2pzcGMmZ3Q7PC9jb2RlPjwvYT4gKDxlbT5kZXByZWNhdGVkPC9lbT4pPC9saT4KICAgPGxpPjxhIGhyZWY9IlRhc2tzL3dsanNwYy5odG1sIj48Y29kZT4mbHQ7d2xqc3BjJmd0OzwvY29kZT48L2E+PC9saT4KIDwvdWw+CiAKLTxoMz48YSBuYW1lPSJleGFtcGxlcyI+RXhhbXBsZXM8L2E+PC9oMz4KKzxoMyBpZD0iZXhhbXBsZXMiPkV4YW1wbGVzPC9oMz4KIDxwcmU+CiAmbHQ7Y29weSB0b2Rpcj0mcXVvdDske2Rpc3R9JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7CiAgICAgICAgICAgIGluY2x1ZGVzPSZxdW90OyoqL2ltYWdlcy8qJnF1b3Q7Ci0gICAgICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqLyouZ2lmJnF1b3Q7Ci0gIC8mZ3Q7CisgICAgICAgICAgIGV4Y2x1ZGVzPSZxdW90OyoqLyouZ2lmJnF1b3Q7LyZndDsKICZsdDsvY29weSZndDs8L3ByZT4KLTxwPlRoaXMgY29waWVzIGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcyBjYWxsZWQgPGNvZGU+aW1hZ2VzPC9jb2RlPiB0aGF0IGFyZQotbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgZGVmaW5lZCBieSA8Y29kZT4ke3NyY308L2NvZGU+IHRvIHRoZQotZGVzdGluYXRpb24gZGlyZWN0b3J5IGRlZmluZWQgYnkgPGNvZGU+JHtkaXN0fTwvY29kZT4sCi1idXQgZXhjbHVkZXMgYWxsIDxjb2RlPiouZ2lmPC9jb2RlPiBmaWxlcyBmcm9tIHRoZSBjb3B5LjwvcD4KKzxwPlRoaXMgY29waWVzIGFsbCBmaWxlcyBpbiBkaXJlY3RvcmllcyBjYWxsZWQgPHNhbXA+aW1hZ2VzPC9zYW1wPiB0aGF0IGFyZQorbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgZGVmaW5lZCBieSA8c2FtcD4ke3NyY308L3NhbXA+IHRvIHRoZQorZGVzdGluYXRpb24gZGlyZWN0b3J5IGRlZmluZWQgYnkgPHNhbXA+JHtkaXN0fTwvc2FtcD4sCitidXQgZXhjbHVkZXMgYWxsIDxzYW1wPiouZ2lmPC9zYW1wPiBmaWxlcyBmcm9tIHRoZSBjb3B5LjwvcD4KIDxwcmU+CiAmbHQ7Y29weSB0b2Rpcj0mcXVvdDske2Rpc3R9JnF1b3Q7Jmd0OwogICAmbHQ7ZmlsZXNldCBkaXI9JnF1b3Q7JHtzcmN9JnF1b3Q7Jmd0OwogICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovaW1hZ2VzLyomcXVvdDsvJmd0OwogICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7KiovKi5naWYmcXVvdDsvJmd0OwogICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0mbHQ7L2NvcHkmZ3Q7Ci08L3ByZT4KLTxwPiBUaGUgc2FtZSBhcyB0aGUgZXhhbXBsZSBhYm92ZSwgYnV0IGV4cHJlc3NlZCB1c2luZyBuZXN0ZWQgZWxlbWVudHMuPC9wPgorJmx0Oy9jb3B5Jmd0OzwvcHJlPgorPHA+VGhlIHNhbWUgYXMgdGhlIGV4YW1wbGUgYWJvdmUsIGJ1dCBleHByZXNzZWQgdXNpbmcgbmVzdGVkIGVsZW1lbnRzLjwvcD4KIAogPHByZT4KICZsdDtkZWxldGUgZGlyPSZxdW90OyR7ZGlzdH0mcXVvdDsmZ3Q7CkBAIC0yNjMsNTIgKzI1OCw0NiBAQAogPHA+RGVsZXRpbmcgdGhlIG9yaWdpbmFsIHNldCBvZiBmaWxlcywgdGhlIDxjb2RlPmRlbGV0ZTwvY29kZT4gdGFzayBjYW4gYWN0CiBhcyBhbiBpbXBsaWNpdCBmaWxlc2V0LjwvcD4KIAotPGgzPjxhIG5hbWU9ImRlZmF1bHRleGNsdWRlcyI+RGVmYXVsdCBFeGNsdWRlczwvYT48L2gzPgorPGgzIGlkPSJkZWZhdWx0ZXhjbHVkZXMiPkRlZmF1bHQgRXhjbHVkZXM8L2gzPgogPHA+VGhlcmUgYXJlIGEgc2V0IG9mIGRlZmluaXRpb25zIHRoYXQgYXJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQgZnJvbSBhbGwKLWRpcmVjdG9yeS1iYXNlZCB0YXNrcy4gQXMgb2YgQW50IDEuOC4xIHRoZXkgYXJlOjwvcD4KK2RpcmVjdG9yeS1iYXNlZCB0YXNrcy4gPGVtPlNpbmNlIEFudCAxLjguMTwvZW0+IHRoZXkgYXJlOjwvcD4KIDxwcmU+Ci0gICAgICoqLyp+Ci0gICAgICoqLyMqIwotICAgICAqKi8uIyoKLSAgICAgKiovJSolCi0gICAgICoqLy5fKgotICAgICAqKi9DVlMKLSAgICAgKiovQ1ZTLyoqCi0gICAgICoqLy5jdnNpZ25vcmUKLSAgICAgKiovU0NDUwotICAgICAqKi9TQ0NTLyoqCi0gICAgICoqL3Zzc3Zlci5zY2MKLSAgICAgKiovLnN2bgotICAgICAqKi8uc3ZuLyoqCi0gICAgICoqLy5EU19TdG9yZQotPC9wcmU+Ci08cD5BbnQgMS44LjIgYWRkcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgZXhjbHVkZXM6PC9wPgorKiovKn4KKyoqLyMqIworKiovLiMqCisqKi8lKiUKKyoqLy5fKgorKiovQ1ZTCisqKi9DVlMvKioKKyoqLy5jdnNpZ25vcmUKKyoqL1NDQ1MKKyoqL1NDQ1MvKioKKyoqL3Zzc3Zlci5zY2MKKyoqLy5zdm4KKyoqLy5zdm4vKioKKyoqLy5EU19TdG9yZTwvcHJlPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMjwvZW0+LCBhZGRpdGlvbmFsIGRlZmF1bHQgZXhjbHVkZXMgYXJlOjwvcD4KIDxwcmU+Ci0gICAgICoqLy5naXQKLSAgICAgKiovLmdpdC8qKgotICAgICAqKi8uZ2l0YXR0cmlidXRlcwotICAgICAqKi8uZ2l0aWdub3JlCi0gICAgICoqLy5naXRtb2R1bGVzCi0gICAgICoqLy5oZwotICAgICAqKi8uaGcvKioKLSAgICAgKiovLmhnaWdub3JlCi0gICAgICoqLy5oZ3N1YgotICAgICAqKi8uaGdzdWJzdGF0ZQotICAgICAqKi8uaGd0YWdzCi0gICAgICoqLy5ienIKLSAgICAgKiovLmJ6ci8qKgotICAgICAqKi8uYnpyaWdub3JlCi08L3ByZT4KKyoqLy5naXQKKyoqLy5naXQvKioKKyoqLy5naXRhdHRyaWJ1dGVzCisqKi8uZ2l0aWdub3JlCisqKi8uZ2l0bW9kdWxlcworKiovLmhnCisqKi8uaGcvKioKKyoqLy5oZ2lnbm9yZQorKiovLmhnc3ViCisqKi8uaGdzdWJzdGF0ZQorKiovLmhndGFncworKiovLmJ6cgorKiovLmJ6ci8qKgorKiovLmJ6cmlnbm9yZTwvcHJlPgogPHA+SWYgeW91IGRvIG5vdCB3YW50IHRoZXNlIGRlZmF1bHQgZXhjbHVkZXMgYXBwbGllZCwgeW91IG1heSBkaXNhYmxlCi10aGVtIHdpdGggdGhlIDxjb2RlPmRlZmF1bHRleGNsdWRlcz0mcXVvdDtubyZxdW90OzwvY29kZT4KLWF0dHJpYnV0ZS48L3A+Cit0aGVtIHdpdGggdGhlIDx2YXI+ZGVmYXVsdGV4Y2x1ZGVzPC92YXI+PTxxPm5vPC9xPiBhdHRyaWJ1dGUuPC9wPgogCiA8cD5UaGlzIGlzIHRoZSBkZWZhdWx0IGxpc3Q7IG5vdGUgdGhhdCB5b3UgY2FuIG1vZGlmeSB0aGUgbGlzdCBvZgotZGVmYXVsdCBleGNsdWRlcyBieSB1c2luZyB0aGUgPGEKLWhyZWY9IlRhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sIj5kZWZhdWx0ZXhjbHVkZXM8L2E+IHRhc2suPC9wPgotCi0KK2RlZmF1bHQgZXhjbHVkZXMgYnkgdXNpbmcKK3RoZSA8YSBocmVmPSJUYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbCI+ZGVmYXVsdGV4Y2x1ZGVzPC9hPiB0YXNrLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvZmVlZGJhY2suaHRtbCBiL21hbnVhbC9mZWVkYmFjay5odG1sCmluZGV4IDcwMDI3ZjYuLmVlZmM4YWEgMTAwNjQ0Ci0tLSBhL21hbnVhbC9mZWVkYmFjay5odG1sCisrKyBiL21hbnVhbC9mZWVkYmFjay5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNTkgKzE1LDU0IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KLTx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsIC0gRmVlZGJhY2s8L3RpdGxlPgorPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwmbWRhc2g7RmVlZGJhY2s8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPGgxPjxhIG5hbWU9ImZlZWRiYWNrIj5GZWVkYmFjazwvYT4gYW5kIFRyb3VibGVzaG9vdGluZzwvaDE+Ci08cD5JZiB0aGluZ3MgZG8gbm90IHdvcmssIGVzcGVjaWFsbHkgc2ltcGxlIHRoaW5ncyBsaWtlIDx0dD5hbnQgLXZlcnNpb248L3R0PiwgCi0gIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nIHdpdGggeW91ciBjb25maWd1cmF0aW9uLiBCZWZvcmUgZmlsaW5nIGJ1ZyByZXBvcnRzIGFuZCAKLSAgZW1haWxpbmcgYWxsIHRoZSBBcGFjaGUgQW50IG1haWxpbmcgbGlzdHM8L3A+Cis8aDEgaWQ9ImZlZWRiYWNrIj5GZWVkYmFjayBhbmQgVHJvdWJsZXNob290aW5nPC9oMT4KKzxwPklmIHRoaW5ncyBkbyBub3Qgd29yaywgZXNwZWNpYWxseSBzaW1wbGUgdGhpbmdzIGxpa2UgPGtiZD5hbnQgLXZlcnNpb248L2tiZD4sIHRoZW4gc29tZXRoaW5nIGlzCisgIHdyb25nIHdpdGggeW91ciBjb25maWd1cmF0aW9uLiBCZWZvcmUgZmlsaW5nIGJ1ZyByZXBvcnRzIGFuZCBlbWFpbGluZyBhbGwgdGhlIEFwYWNoZSBBbnQgbWFpbGluZworICBsaXN0czwvcD4KIDxvbD4KLSAgPGxpPkNoZWNrIHlvdXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBBcmUgQU5UX0hPTUUgYW5kIEpBVkFfSE9NRSBjb3JyZWN0PyBJZiAKLSAgICB0aGV5IGhhdmUgcXVvdGVzIG9yIHRyYWlsaW5nIHNsYXNoZXMsIHJlbW92ZSB0aGVtLjwvbGk+Ci0gIDxsaT5VbnNldCBDTEFTU1BBVEg7IGlmIHRoYXQgaXMgd3JvbmcgdGhpbmdzIGdvIGhvcnJpYmx5IHdyb25nLiBBbnQgZG9lcyBub3QgCi0gICAgbmVlZCB0aGUgQ0xBU1NQQVRIIHZhcmlhYmxlIGRlZmluZWQgdG8gYW55dGhpbmcgdG8gd29yay48L2xpPgotICA8bGk+TWFrZSBzdXJlIHRoZXJlIGFyZSBubyB2ZXJzaW9ucyBvZiBjcmltc29uLmphciBvciBvdGhlciBYTUwgcGFyc2VycyBpbiBKUkUvZXh0PC9saT4KLSAgPGxpPklzIHlvdXIgcGF0aCBjb3JyZWN0PyBpcyBBbnQgb24gaXQ/IFdoYXQgYWJvdXQgSkRLL2Jpbj8gaGF2ZSB5b3UgdGVzdGVkIAotICAgIHRoaXM/IElmIHlvdSBhcmUgdXNpbmcgSmlrZXMsIGlzIGl0IG9uIHRoZSBwYXRoPyBBIGNyZWF0ZVByb2Nlc3MgZXJyb3IgKGVzcGVjaWFsbHkgCi0gICAgd2l0aCBJRD0yIG9uIHdpbmRvd3MpIHVzdWFsbHkgbWVhbnMgZXhlY3V0YWJsZSBub3QgZm91bmQgb24gdGhlIHBhdGguPC9saT4KLSAgPGxpPldoaWNoIHZlcnNpb24gb2YgYW50IGFyZSB5b3UgcnVubmluZz8gT3RoZXIgYXBwbGljYXRpb25zIGRpc3RyaWJ1dGUgYSBjb3B5IAotICAgIC1pdCBtYXkgYmUgYmVpbmcgcGlja2VkIHVwIGJ5IGFjY2lkZW50LjwvbGk+Ci0gIDxsaT5JZiBhIHRhc2sgaXMgZmFpbGluZyB0byBydW4gaXMgb3B0aW9uYWwuamFyIGluIEFOVF9IT01FL2xpYj8gQXJlIHRoZXJlIGFueSAKLSAgICBsaWJyYXJpZXMgd2hpY2ggaXQgZGVwZW5kcyBvbiBtaXNzaW5nPzwvbGk+Ci0gIDxsaT5JZiBhIHRhc2sgZG9lc24ndCBkbyB3aGF0IHlvdSBleHBlY3QsIHJ1biA8dHQ+YW50IC12ZXJib3NlPC90dD4gb3IgPHR0PmFudCAKLSAgICAtZGVidWc8L3R0PiB0byBzZWUgd2hhdCBpcyBoYXBwZW5pbmc8L2xpPgorICA8bGk+Q2hlY2sgeW91ciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEFyZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gYW5kIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4KKyAgICBjb3JyZWN0PyBJZiB0aGV5IGhhdmUgcXVvdGVzIG9yIHRyYWlsaW5nIHNsYXNoZXMsIHJlbW92ZSB0aGVtLjwvbGk+CisgIDxsaT5VbnNldCA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+OyBpZiB0aGF0IGlzIHdyb25nIHRoaW5ncyBnbyBob3JyaWJseSB3cm9uZy4gQW50IGRvZXMgbm90IG5lZWQKKyAgICB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiB2YXJpYWJsZSBkZWZpbmVkIHRvIGFueXRoaW5nIHRvIHdvcmsuPC9saT4KKyAgPGxpPk1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gdmVyc2lvbnMgb2YgPHNhbXA+Y3JpbXNvbi5qYXI8L3NhbXA+IG9yIG90aGVyIFhNTCBwYXJzZXJzCisgICAgaW4gPHNhbXA+SkFWQV9IT01FL2pyZS9saWIvZXh0PC9zYW1wPjwvbGk+CisgIDxsaT5JcyB5b3VyIHBhdGggY29ycmVjdD8gaXMgQW50IG9uIGl0PyBXaGF0IGFib3V0IDxzYW1wPkpBVkFfSE9NRS9iaW48L3NhbXA+PyBoYXZlIHlvdSB0ZXN0ZWQKKyAgICB0aGlzPyBJZiB5b3UgYXJlIHVzaW5nIEppa2VzLCBpcyBpdCBvbiB0aGUgcGF0aD8gQSBDcmVhdGVQcm9jZXNzIGVycm9yIChlc3BlY2lhbGx5CisgICAgd2l0aCA8Y29kZT5lcnJvcj0yPC9jb2RlPikgb24gV2luZG93cyB1c3VhbGx5IG1lYW5zIGV4ZWN1dGFibGUgbm90IGZvdW5kIG9uIHRoZSBwYXRoLjwvbGk+CisgIDxsaT5XaGljaCB2ZXJzaW9uIG9mIGFudCBhcmUgeW91IHJ1bm5pbmc/IE90aGVyIGFwcGxpY2F0aW9ucyBkaXN0cmlidXRlIGEgY29weSZtZGFzaDtpdCBtYXkgYmUKKyAgICBiZWluZyBwaWNrZWQgdXAgYnkgYWNjaWRlbnQuPC9saT4KKyAgPGxpPklmIGEgdGFzayBmYWlsaW5nIHRvIHJ1biBpcyBmcm9tIDxzYW1wPm9wdGlvbmFsLmphcjwvc2FtcD4gaW4gPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPj8gQXJlCisgICAgdGhlcmUgYW55IGxpYnJhcmllcyB3aGljaCBpdCBkZXBlbmRzIG9uIG1pc3Npbmc/PC9saT4KKyAgPGxpPklmIGEgdGFzayBkb2Vzbid0IGRvIHdoYXQgeW91IGV4cGVjdCwgcnVuIDxrYmQ+YW50IC12ZXJib3NlPC9rYmQ+IG9yIDxrYmQ+YW50IC1kZWJ1Zzwva2JkPgorICAgIHRvIHNlZSB3aGF0IGlzIGhhcHBlbmluZzwvbGk+CiA8L29sPgotPHA+SWYgeW91IGNhbid0IGZpeCB5b3VyIHByb2JsZW0sIHN0YXJ0IHdpdGggdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IAotICBVc2VyIE1haWxpbmcgTGlzdDwvYT4gLiBUaGVzZSBhcmUgb3RoZXIgYW50IHVzZXJzIHdobyB3aWxsIGhlbHAgeW91IGxlYXJuIHRvIAotICB1c2UgYW50LiBJZiB0aGV5IGNhbm5vdCBmaXggaXQgdGhlbiBzb21lb25lIG1heSBzdWdnZXN0IGZpbGluZyBhIGJ1ZyByZXBvcnQsIAotICB3aGljaCB3aWxsIGVzY2FsYXRlIHRoZSBpc3N1ZS4gUmVtZW1iZXIgb2YgY291cnNlLCB0aGF0IHN1cHBvcnQsIGxpa2UgYWxsIG9wZW4gCi0gIHNvdXJjZSBkZXZlbG9wbWVudCB0YXNrcywgaXMgdm9sdW50YXJ5LiBJZiB5b3UgaGF2ZW4ndCBpbnZlc3RlZCB0aW1lIGluIGhlbHBpbmcgCi0gIHlvdXJzZWxmIGJ5IGZvbGxvd2luZyB0aGUgc3RlcHMgYWJvdmUsIGl0IGlzIHVubGlrZWx5IHRoYXQgYW55b25lIHdpbGwgaW52ZXN0IAotICB0aGUgdGltZSBpbiBoZWxwaW5nIHlvdS4gPC9wPgotPHA+QWxzbywgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgc29tZXRoaW5nLCB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21haWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj5BbnQgCi0gIFVzZXIgTWFpbGluZyBMaXN0PC9hPiBpcyB0aGUgcGxhY2UgdG8gYXNrIHF1ZXN0aW9ucy4gTm90IHRoZSBkZXZlbG9wZXIgbGlzdCwgCi0gIG5vciB0aGUgaW5kaXZpZHVhbHMgd2hvc2UgbmFtZXMgYXBwZWFycyBpbiB0aGUgc291cmNlIGFuZCBkb2N1bWVudGF0aW9uLiBJZiAKLSAgdGhleSBhbnN3ZXJlZCBhbGwgc3VjaCBlbWFpbHMsIG5vYm9keSB3b3VsZCBoYXZlIGFueSB0aW1lIHRvIGltcHJvdmUgYW50LiA8L3A+Ci08cD5UbyBwcm92aWRlIGZlZWRiYWNrIG9uIHRoaXMgc29mdHdhcmUsIHBsZWFzZSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IAotICBVc2VyIE1haWxpbmcgTGlzdDwvYT4gPC9wPgotCi08cD5JZiB5b3Ugd2FudCB0byBjb250cmlidXRlIHRvIEFudCBvciBzdGF5IGN1cnJlbnQgd2l0aCB0aGUgbGF0ZXN0Ci1kZXZlbG9wbWVudCwgam9pbiB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IERldmVsb3BtZW50IE1haWxpbmcgTGlzdDwvYT4KLTwvcD4KLTxwPkEgc2VhcmNoYWJsZSBhcmNoaXZlIGNhbiBiZSBmb3VuZCBhdCA8YQotaHJlZj0iaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbSIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vbWFyYy50aGVhaW1zZ3JvdXAuY29tPC9hPi4KLU90aGVyIGFyY2hpdmVzIHdpbGwgYmUgZG9jdW1lbnRlZCBvbmxpbmUgYXQgIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwjQXJjaGl2ZXMiIHRhcmdldD0iX3RvcCI+TWFpbGluZyBMaXN0cyBBcmNoaXZlczwvYT4gPC9wPgotCis8cD5JZiB5b3UgY2FuJ3QgZml4IHlvdXIgcHJvYmxlbSwgc3RhcnQgd2l0aCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiCisgIHRhcmdldD0iX3RvcCI+QW50IFVzZXIgTWFpbGluZyBMaXN0PC9hPi4gVGhlc2UgYXJlIG90aGVyIGFudCB1c2VycyB3aG8gd2lsbCBoZWxwIHlvdSBsZWFybiB0byB1c2UKKyAgYW50LiBJZiB0aGV5IGNhbm5vdCBmaXggaXQgdGhlbiBzb21lb25lIG1heSBzdWdnZXN0IGZpbGluZyBhIGJ1ZyByZXBvcnQsIHdoaWNoIHdpbGwgZXNjYWxhdGUgdGhlCisgIGlzc3VlLiBSZW1lbWJlciBvZiBjb3Vyc2UsIHRoYXQgc3VwcG9ydCwgbGlrZSBhbGwgb3BlbiBzb3VyY2UgZGV2ZWxvcG1lbnQgdGFza3MsIGlzIHZvbHVudGFyeS4gSWYKKyAgeW91IGhhdmVuJ3QgaW52ZXN0ZWQgdGltZSBpbiBoZWxwaW5nIHlvdXJzZWxmIGJ5IGZvbGxvd2luZyB0aGUgc3RlcHMgYWJvdmUsIGl0IGlzIHVubGlrZWx5IHRoYXQKKyAgYW55b25lIHdpbGwgaW52ZXN0IHRoZSB0aW1lIGluIGhlbHBpbmcgeW91LjwvcD4KKzxwPkFsc28sIGlmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHNvbWV0aGluZywgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sIgorICB0YXJnZXQ9Il90b3AiPkFudCBVc2VyIE1haWxpbmcgTGlzdDwvYT4gaXMgdGhlIHBsYWNlIHRvIGFzayBxdWVzdGlvbnMuIE5vdCB0aGUgZGV2ZWxvcGVyIGxpc3QsIG5vcgorICB0aGUgaW5kaXZpZHVhbHMgd2hvc2UgbmFtZXMgYXBwZWFycyBpbiB0aGUgc291cmNlIGFuZCBkb2N1bWVudGF0aW9uLiBJZiB0aGV5IGFuc3dlcmVkIGFsbCBzdWNoCisgIGVtYWlscywgbm9ib2R5IHdvdWxkIGhhdmUgYW55IHRpbWUgdG8gaW1wcm92ZSBBbnQuPC9wPgorPHA+VG8gcHJvdmlkZSBmZWVkYmFjayBvbiB0aGlzIHNvZnR3YXJlLCBwbGVhc2Ugc3Vic2NyaWJlIHRvCisgIHRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL21haWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj5BbnQgVXNlciBNYWlsaW5nIExpc3Q8L2E+PC9wPgorPHA+SWYgeW91IHdhbnQgdG8gY29udHJpYnV0ZSB0byBBbnQgb3Igc3RheSBjdXJyZW50IHdpdGggdGhlIGxhdGVzdCBkZXZlbG9wbWVudCwgam9pbgorICB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9tYWlsLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50IERldmVsb3BtZW50IE1haWxpbmcgTGlzdDwvYT48L3A+Cis8cD5BIHNlYXJjaGFibGUgYXJjaGl2ZSBjYW4gYmUgZm91bmQgYXQgPGEgaHJlZj0iaHR0cHM6Ly9tYXJjLmluZm8iCisgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9tYXJjLmluZm88L2E+LiBPdGhlciBhcmNoaXZlcyB3aWxsIGJlIGRvY3VtZW50ZWQgb25saW5lCisgIGF0IDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sI0FyY2hpdmVzIiB0YXJnZXQ9Il90b3AiPk1haWxpbmcgTGlzdHMKKyAgQXJjaGl2ZXM8L2E+PC9wPgogCiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9pZGUuaHRtbCBiL21hbnVhbC9pZGUuaHRtbAppbmRleCA3ZjJiYzZkLi5kZmFmZTEwIDEwMDY0NAotLS0gYS9tYW51YWwvaWRlLmh0bWwKKysrIGIvbWFudWFsL2lkZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyIvPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIi8+CiA8dGl0bGU+SURFIEludGVncmF0aW9uPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CkBAIC0zNCw3MiArMzQsNDIgQEAKIAogPHVsPgogICA8bGk+Ci0gICAgPGEgaHJlZj0iaHR0cDovL2FudHJ1bm5lci5zb3VyY2Vmb3JnZS5uZXQvIj4KLSAgICAgIEFudFJ1bm5lciBGb3IgSkJ1aWxkZXIgKHVuYnVuZGxlZCkKLSAgICA8L2E+CisgICAgPGEgaHJlZj0iSW50ZWdyYXRpb24vamV4dC1wbHVnaW4uaHRtbCI+QW50V29yayBQbHVnaW4gZm9yIHRoZSBKZXh0IEphdmEgVGV4dCBFZGl0b3IKKyAgICAodW5idW5kbGVkKTwvYT4KICAgPC9saT4KICAgPGxpPgotICAgIDxhIGhyZWY9IkludGVncmF0aW9uL2pleHQtcGx1Z2luLmh0bWwiPgotICAgICAgQW50V29yayBQbHVnaW4gZm9yIHRoZSBKZXh0IEphdmEgVGV4dCBFZGl0b3IgKHVuYnVuZGxlZCkKLSAgICA8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2pkZWUuc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5KREVFIChKYXZhIERldmVsb3BtZW50IEVudmlyb25tZW50IGZvcgorICAgIEVtYWNzKTwvYT4gaGFzIGJ1aWx0LWluIHRleHQgQW50IGludGVncmF0aW9uOiBzZWxlY3Rpb24gb2YgdGFyZ2V0IHRocm91Z2ggdGV4dCBmaWVsZCwgZXhlY3V0aW9uLAorICAgIGh5cGVybGluayB0byBjb21waWxhdGlvbiBlcnJvcnMuIEluc3RhbGxhdGlvbjogYnVpbHQtaW4gSkRFRSAyLjIuOCBvciBsYXRlci4gQ29uZmlndXJhdGlvbjoKKyAgICB0aHJvdWdoIGN1c3RvbWl6ZSBtZW51ICJKZGUgQnVpbGQgRnVuY3Rpb24iCiAgIDwvbGk+CiAgIDxsaT4KLSAgICA8YSBocmVmPSJodHRwOi8vamRlZS5zdW5zaXRlLmRrLyI+Ci0gICAgICBKREVFIChKYXZhIERldmVsb3BtZW50IEVudmlyb25tZW50IGZvciBFbWFjcykKLSAgICA8L2E+IGhhcyBidWlsdC1pbiB0ZXh0IEFOVCBpbnRlZ3JhdGlvbjogc2VsZWN0aW9uIG9mIHRhcmdldCB0aHJvdWdoIHRleHQKLSAgICBmaWVsZCwgZXhlY3V0aW9uLCBoeXBlcmxpbmsgdG8gY29tcGlsYXRpb24gZXJyb3JzLiBJbnN0YWxsYXRpb246IGJ1aWx0LWluCi0gICAgSkRFRSAyLjIuOCBvciBsYXRlci4gQ29uZmlndXJhdGlvbjogdGhyb3VnaCBjdXN0b21pemUgbWVudQotICAgICJKZGUgQnVpbGQgRnVuY3Rpb24iCisgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuamV0YnJhaW5zLmNvbS9pZGVhLyIgdGFyZ2V0PSJfdG9wIj5JREVBPC9hPiBoYXMgYnVpbHQtaW4gR1VJIEFOVAorICAgIGludGVncmF0aW9uOiBHVUkgc2VsZWN0aW9uIG9mIHRhcmdldHMsIGV4ZWN1dGlvbiwgaHlwZXJsaW5rIHRvIGNvbXBpbGF0aW9uIGVycm9ycwogICA8L2xpPgogICA8bGk+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnRlbGxpai5jb20vaWRlYS8iPgotICAgICAgSURFQQotICAgIDwvYT4gaGFzIGJ1aWx0LWluIEdVSSBBTlQgaW50ZWdyYXRpb246IEdVSSBzZWxlY3Rpb24gb2YgdGFyZ2V0cywgZXhlY3V0aW9uLAotICAgIGh5cGVybGluayB0byBjb21waWxhdGlvbiBlcnJvcnMKKyAgICA8YSBocmVmPSJodHRwczovL25ldGJlYW5zLm9yZy8iIHRhcmdldD0iX3RvcCI+TmV0QmVhbnM8L2E+IElERSB1c2VzIEFudCBhcyB0aGUgYmFzaXMgZm9yIGl0cworICAgIHByb2plY3Qgc3lzdGVtIHN0YXJ0aW5nIHdpdGggdGhlIDQuMCByZWxlYXNlCiAgIDwvbGk+CiAgIDxsaT4KLSAgICA8YSBocmVmPSJodHRwOi8vYW50Lm5ldGJlYW5zLm9yZy8iPgotICAgICAgTmV0QmVhbnMKLSAgICA8L2E+Ci0gICAgTmV0QmVhbnMgSURFIHVzZXMgQW50IGFzIHRoZSBiYXNpcyBmb3IgaXRzIHByb2plY3Qgc3lzdGVtIHN0YXJ0aW5nIHdpdGggdGhlIDQuMCByZWxlYXNlLgorICAgIDxhIGhyZWY9Imh0dHA6Ly9qZWRpdC5vcmcvIiB0YXJnZXQ9Il90b3AiPmpFZGl0PC9hPiBpcyBhbiBvcGVuIHNvdXJjZSBKYXZhIElERSB3aXRoIHNvbWUgZ3JlYXQKKyAgICBwbHVnaW5zIGZvciBKYXZhIGRldiwgYSBnb29kIFhNTCBlZGl0b3IgYW5kIHRoZSBBbnRmYXJtIHBsdWdpbiB0byBleGVjdXRlIHRhcmdldHMgaW4gYSBidWlsZAorICAgIGZpbGUKICAgPC9saT4KICAgPGxpPgotICAgIDxhIGhyZWY9Imh0dHA6Ly9qZWRpdC5vcmcvIj4KLSAgICAgIGpFZGl0Ci0gICAgPC9hPgotICAgIGpFZGl0IGlzIGFuIG9wZW4gc291cmNlIGphdmEgSURFIHdpdGggc29tZSBncmVhdCBwbHVnaW5zIGZvciBKYXZhIGRldiwgYQotICAgIGdvb2QgWE1MIGVkaXRvciBhbmQgdGhlIEFudGZhcm0gcGx1Z2luIHRvIGV4ZWN1dGUgdGFyZ2V0cyBpbiBhIGJ1aWxkCi0gICAgZmlsZS4KKyAgICA8YSBocmVmPSJodHRwczovL2VjbGlwc2Uub3JnLyIgdGFyZ2V0PSJfdG9wIj5FY2xpcHNlPC9hPiBpcyBJQk0ncyBjb3VudGVycG9pbnQgdG8gTmV0QmVhbnM7IGFuCisgICAgb3BlbiBzb3VyY2UgSURFIHdpdGggSmF2YSBhbmQgQW50IHN1cHBvcnQKICAgPC9saT4KICAgPGxpPgotICAgIDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy8iPgotICAgICAgRWNsaXBzZQotICAgIDwvYT4KLSAgICBFY2xpcHNlIGlzIElCTSdzIGNvdW50ZXJwb2ludCB0byBOZXRCZWFuczsgYW4gb3BlbiBzb3VyY2UgSURFIHdpdGgKLSAgICBKYXZhIGFuZCBBbnQgc3VwcG9ydC4KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LnBsYWNpZHN5c3RlbXMuY29tL3ZpcnR1YWxhbnQvIiB0YXJnZXQ9Il90b3AiPlZpcnR1YWwgQW50PC9hPiBHVUkgYWxsb3dzIHlvdQorICAgIHRvIHdvcmsgb24gYSBWaXJ0dWFsIEZpbGUgU3lzdGVtIHdpdGhvdXQgZGVhbGluZyB3aXRoIHRoZSBYTUw7IHBsdWdzIGludG8gRWNsaXBzZSwgTmV0YmVhbnMKKyAgICAmYW1wOyBJbnRlbGxpSgogICA8L2xpPgogICA8bGk+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5wbGFjaWRzeXN0ZW1zLmNvbS92aXJ0dWFsYW50LyI+Ci0gICAgICBWaXJ0dWFsIEFudDwvYT4gR1VJIGFsbG93cyB5b3UgdG8gd29yayBvbiBhIFZpcnR1YWwgRmlsZSBTeXN0ZW0gd2l0aG91dCBkZWFsaW5nIHdpdGggdGhlIFhNTC4gUGx1Z3MgaW50byBFY2xpcHNlLCBOZXRiZWFucyAmYW1wOyBJbnRlbGxpai4KLSAgPC9saT4KLSAgPGxpPgotICAgIDxhIGhyZWY9Imh0dHA6Ly93d3c3Yi5zb2Z0d2FyZS5pYm0uY29tL3dzZGQvbGlicmFyeS90ZWNoYXJ0aWNsZXMvMDIwM19zZWFybGUvc2VhcmxlMS5odG1sIj4KLSAgICAgIFdlYlNwaGVyZSBTdHVkaW8gQXBwbGljYXRpb24gRGV2ZWxvcGVyCi0gICAgPC9hPgotICA8L2xpPgotICA8bGk+Ci0gICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ib3JsYW5kLmNvbS9qYnVpbGRlci9wZGYvamI5X2ZlYW1hdHJpeC5wZGYiPgotICAgICAgSkJ1aWxkZXIgOSBQZXJzb25hbAotICAgIDwvYT4KLSAgICBKQnVpbGRlciBzdXBwb3J0cyBBbnQgd2l0aCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzLiBBZGQgQW50IG5vZGVzIHRvCi0gICAgcHJvamVjdHMgYW5kIGV4ZWN1dGUgQW50IHRhcmdldHMgZnJvbSB3aXRoaW4gSkJ1aWxkZXIuIEFkZCBjdXN0b20gQW50LWJhc2VkCi0gICAgYnVpbGQgdGFza3Mgd2l0aCBjdXN0b20gQW50IGxpYnJhcmllcyB0byBydW4gQW50IGZyb20gd2l0aGluIEpCdWlsZGVyLgotICAgIFJhcGlkIG5hdmlnYXRpb24gZnJvbSBBbnQgYnVpbGQgZXJyb3IgbWVzc2FnZXMgdG8gc291cmNlIGZpbGVzLgotICAgIEN1c3RvbWl6ZSBidWlsZCBtZW51IGFuZCB0b29sYmFyIHdpdGggY3VzdG9tIGJ1aWxkIHRhcmdldHMuCisgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vZmZlcnMvd3NhZDIuaHRtbCIgdGFyZ2V0PSJfdG9wIj5XZWJTcGhlcmUgU3R1ZGlvCisgICAgQXBwbGljYXRpb24gRGV2ZWxvcGVyPC9hPgogICA8L2xpPgogPC91bD4KIAotCi0KIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9pZnVubGVzcy5odG1sIGIvbWFudWFsL2lmdW5sZXNzLmh0bWwKaW5kZXggYWJiZGNlMS4uOTI0YjUxNyAxMDA2NDQKLS0tIGEvbWFudWFsL2lmdW5sZXNzLmh0bWwKKysrIGIvbWFudWFsL2lmdW5sZXNzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwzOSArMTUsMzMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogICA8dGl0bGU+SWYgYW5kIFVubGVzcyBvbiBhbGwgdGFza3MvbmVzdGVkIGVsZW1lbnRzPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+Ci0gIDxoMT48YSBuYW1lPSJpZl9hbmRfdW5sZXNzIj5JZiBBbmQgVW5sZXNzPC9hPjwvaDE+CisgIDxoMSBpZD0iaWZfYW5kX3VubGVzcyI+SWYgQW5kIFVubGVzczwvaDE+CiAKLSAgPHA+U2luY2UgQW50IDEuOS4xIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBpZiBhbmQgdW5sZXNzIGF0dHJpYnV0ZXMgb24gYWxsIHRhc2tzIGFuZCBuZXN0ZWQgZWxlbWVudHMgdXNpbmcgc3BlY2lhbCBuYW1lc3BhY2VzLjwvcD4KKyAgPHA+PGVtPlNpbmNlIEFudCAxLjkuMTwvZW0+LCBpdCBpcyBwb3NzaWJsZSB0byBhZGQgPHZhcj5pZjwvdmFyPiBhbmQgPHZhcj51bmxlc3M8L3Zhcj4gYXR0cmlidXRlcyBvbiBhbGwgdGFza3MgYW5kIG5lc3RlZCBlbGVtZW50cyB1c2luZyBzcGVjaWFsIG5hbWVzcGFjZXMuPC9wPgogCiAgIDxwPkluIG9yZGVyIHRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgbmFtZXNwYWNlIGRlY2xhcmF0aW9uczwvcD4KLSAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICB4bWxuczppZj0mcXVvdDthbnQ6aWYmcXVvdDsKLSAgICB4bWxuczp1bmxlc3M9JnF1b3Q7YW50OnVubGVzcyZxdW90OwotICAgIDwvcHJlPgotICA8L2Jsb2NrcXVvdGU+CisgIDxwcmU+Cit4bWxuczppZj0mcXVvdDthbnQ6aWYmcXVvdDsKK3htbG5zOnVubGVzcz0mcXVvdDthbnQ6dW5sZXNzJnF1b3Q7PC9wcmU+CiAKLSAgPHA+VGhlIGlmIGFuZCB1bmxlc3MgbmFtZXNwYWNlcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgMyBjb25kaXRpb25zIDoKLSAgPHVsPgotICAgIDxsaT50cnVlPC9saT50cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGV2YWx1YXRlcyB0byB0cnVlCi0gICAgPGxpPmJsYW5rPC9saT50cnVlIGlmIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGlzIG51bGwgb3IgZW1wdHkKLSAgICA8bGk+c2V0PC9saT50cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0Ci0gIDwvdWw+PC9wPgotCi08YmxvY2txdW90ZT4KLTxwcmU+CisgIDxwPlRoZSA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPnVubGVzczwvY29kZT4gbmFtZXNwYWNlcyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgMyBjb25kaXRpb25zOjwvcD4KKyAgPGRsPgorICAgICAgPGR0PjxxPnRydWU8L3E+PC9kdD48ZGQ+dHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBldmFsdWF0ZXMgdG8gdHJ1ZTwvZGQ+CisgICAgICA8ZHQ+PHE+Ymxhbms8L3E+PC9kdD48ZGQ+dHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBudWxsIG9yIGVtcHR5PC9kZD4KKyAgICAgIDxkdD48cT5zZXQ8L3E+PC9kdD48ZGQ+dHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldDwvZGQ+CisgIDwvZGw+CisgIDxwcmU+CiAmbHQ7cHJvamVjdCBuYW1lPSZxdW90O3RyeWl0JnF1b3Q7CiAgeG1sbnM6aWY9JnF1b3Q7YW50OmlmJnF1b3Q7Ci0geG1sbnM6dW5sZXNzPSZxdW90O2FudDp1bmxlc3MmcXVvdDsKLSZndDsKKyB4bWxuczp1bmxlc3M9JnF1b3Q7YW50OnVubGVzcyZxdW90OyZndDsKICAmbHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90O2phdmEmcXVvdDsmZ3Q7CiAgICAmbHQ7YXJnIGxpbmU9JnF1b3Q7LVgmcXVvdDsgaWY6dHJ1ZT0mcXVvdDske3Nob3dleHRlbmRlZHBhcmFtc30mcXVvdDsvJmd0OwogICAgJmx0O2FyZyBsaW5lPSZxdW90Oy12ZXJzaW9uJnF1b3Q7IHVubGVzczp0cnVlPSZxdW90OyR7c2hvd2V4dGVuZGVkcGFyYW1zfSZxdW90Oy8mZ3Q7CkBAIC01Niw5ICs1MSw3IEBACiAgJmx0Oy9jb25kaXRpb24mZ3Q7CiAgJmx0O2VjaG8gaWY6c2V0PSZxdW90O29ubWFjJnF1b3Q7Jmd0O3J1bm5pbmcgb24gTWFjT1MmbHQ7L2VjaG8mZ3Q7CiAgJmx0O2VjaG8gdW5sZXNzOnNldD0mcXVvdDtvbm1hYyZxdW90OyZndDtub3QgcnVubmluZyBvbiBNYWNPUyZsdDsvZWNobyZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvaW5kZXguaHRtbCBiL21hbnVhbC9pbmRleC5odG1sCmluZGV4IDlkZjQ4YTAuLmViZjc4ZDYgMTAwNjQ0Ci0tLSBhL21hbnVhbC9pbmRleC5odG1sCisrKyBiL21hbnVhbC9pbmRleC5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPkFwYWNoZSBBbnQmdHJhZGU7IFVzZXIgTWFudWFsPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI3LDcgKzI3LDcgQEAKIDxmcmFtZSBzcmM9ImNvdmVyLmh0bWwiIG5hbWU9Im1haW5GcmFtZSI+CiA8L2ZyYW1lc2V0PgogPG5vZnJhbWVzPgotPEgyPkFwYWNoZSBBbnQmdHJhZGU7IFVzZXIgTWFudWFsPC9IMj4KKzxoMj5BcGFjaGUgQW50JnRyYWRlOyBVc2VyIE1hbnVhbDwvaDI+CiAKIDxhIGhyZWY9InRvYy5odG1sIj5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC9hPjwvbm9mcmFtZXM+CiAKZGlmZiAtLWdpdCBhL21hbnVhbC9pbnB1dGhhbmRsZXIuaHRtbCBiL21hbnVhbC9pbnB1dGhhbmRsZXIuaHRtbAppbmRleCAxMzMzMTU3Li5hNzczYWIxIDEwMDY0NAotLS0gYS9tYW51YWwvaW5wdXRoYW5kbGVyLmh0bWwKKysrIGIvbWFudWFsL2lucHV0aGFuZGxlci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPklucHV0SGFuZGxlcjwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yNyw5MCArMjYsNzcgQEAKIAogPGgyPk92ZXJ2aWV3PC9oMj4KIAotPHA+V2hlbiBhIHRhc2sgd2FudHMgdG8gcHJvbXB0IGEgdXNlciBmb3IgaW5wdXQsIGl0IGRvZXNuJ3Qgc2ltcGx5Ci1yZWFkIHRoZSBpbnB1dCBmcm9tIHRoZSBjb25zb2xlIGFzIHRoaXMgd291bGQgbWFrZSBpdCBpbXBvc3NpYmxlIHRvCi1lbWJlZCBBcGFjaGUgQW50IGluIGFuIElERS4gIEluc3RlYWQgaXQgYXNrcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLTxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0SGFuZGxlcjwvY29kZT4gaW50ZXJmYWNlIHRvCi1wcm9tcHQgdGhlIHVzZXIgYW5kIGhhbmQgdGhlIHVzZXIgaW5wdXQgYmFjayB0byB0aGUgdGFzay48L3A+Cis8cD5XaGVuIGEgdGFzayB3YW50cyB0byBwcm9tcHQgYSB1c2VyIGZvciBpbnB1dCwgaXQgZG9lc24ndCBzaW1wbHkgcmVhZCB0aGUgaW5wdXQgZnJvbSB0aGUgY29uc29sZQorYXMgdGhpcyB3b3VsZCBtYWtlIGl0IGltcG9zc2libGUgdG8gZW1iZWQgQXBhY2hlIEFudCBpbiBhbiBJREUuICBJbnN0ZWFkIGl0IGFza3MgYW4gaW1wbGVtZW50YXRpb24KK29mIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRIYW5kbGVyPC9jb2RlPiBpbnRlcmZhY2UgdG8gcHJvbXB0IHRoZQordXNlciBhbmQgaGFuZCB0aGUgdXNlciBpbnB1dCBiYWNrIHRvIHRoZSB0YXNrLjwvcD4KIAotPHA+VG8gZG8gdGhpcywgdGhlIHRhc2sgY3JlYXRlcyBhbiA8Y29kZT5JbnB1dFJlcXVlc3Q8L2NvZGU+IG9iamVjdAotYW5kIHBhc3NlcyBpdCB0byB0aGUgPGNvZGU+SW5wdXRIYW5kbGVyPC9jb2RlPiBTdWNoIGFuCi08Y29kZT5JbnB1dFJlcXVlc3Q8L2NvZGU+IG1heSBrbm93IHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlucHV0IGlzIHZhbGlkCi1hbmQgdGhlIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4gaXMgc3VwcG9zZWQgdG8gcmVqZWN0IGFsbCBpbnZhbGlkCi1pbnB1dC48L3A+Cis8cD5UbyBkbyB0aGlzLCB0aGUgdGFzayBjcmVhdGVzIGFuIDxjb2RlIGNsYXNzPSJjb2RlIj5JbnB1dFJlcXVlc3Q8L2NvZGU+IG9iamVjdCBhbmQgcGFzc2VzIGl0IHRvCit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPklucHV0SGFuZGxlcjwvY29kZT4uIFN1Y2ggYW4gPGNvZGUgY2xhc3M9ImNvZGUiPklucHV0UmVxdWVzdDwvY29kZT4gbWF5IGtub3cKK3doZXRoZXIgYSBnaXZlbiB1c2VyIGlucHV0IGlzIHZhbGlkIGFuZCB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPklucHV0SGFuZGxlcjwvY29kZT4gaXMgc3VwcG9zZWQgdG8KK3JlamVjdCBhbGwgaW52YWxpZCBpbnB1dC48L3A+CiAKLTxwPkV4YWN0bHkgb25lIDxjb2RlPklucHV0SGFuZGxlcjwvY29kZT4gaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoCi1ldmVyeSBBbnQgcHJvY2VzcywgdXNlcnMgY2FuIHNwZWNpZnkgdGhlIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZQotPGNvZGU+LWlucHV0aGFuZGxlcjwvY29kZT4gY29tbWFuZCBsaW5lIHN3aXRjaC48L3A+Cis8cD5FeGFjdGx5IG9uZSA8Y29kZSBjbGFzcz0iY29kZSI+SW5wdXRIYW5kbGVyPC9jb2RlPiBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggZXZlcnkgQW50IHByb2Nlc3MsCit1c2VycyBjYW4gc3BlY2lmeSB0aGUgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlIDxrYmQ+LWlucHV0aGFuZGxlcjwva2JkPiBjb21tYW5kIGxpbmUgc3dpdGNoLjwvcD4KIAogPGgyPklucHV0SGFuZGxlcjwvaDI+CiAKLTxwPlRoZSA8Y29kZT5JbnB1dEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSBjb250YWlucyBleGFjdGx5IG9uZQotbWV0aG9kPC9wPgorPHA+VGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5JbnB1dEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSBjb250YWlucyBleGFjdGx5IG9uZSBtZXRob2Q8L3A+CiAKIDxwcmU+Ci0gICAgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgCi0gICAgICAgIHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLTwvcHJlPgordm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkKKyAgICB0aHJvd3Mgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247PC9wcmU+CiAKLTxwPndpdGggc29tZSBwcmUtIGFuZCBwb3N0Y29uZGl0aW9ucy4gIFRoZSBtYWluIHBvc3Rjb25kaXRpb24gaXMgdGhhdAotdGhpcyBtZXRob2QgbXVzdCBub3QgcmV0dXJuIHVubGVzcyB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gY29uc2lkZXJzCi10aGUgdXNlciBpbnB1dCB2YWxpZCwgaXQgaXMgYWxsb3dlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gaW4gdGhpcwotc2l0dWF0aW9uLjwvcD4KKzxwPndpdGggc29tZSBwcmUtIGFuZCBwb3N0Y29uZGl0aW9ucy4gIFRoZSBtYWluIHBvc3Rjb25kaXRpb24gaXMgdGhhdCB0aGlzIG1ldGhvZCBtdXN0IG5vdCByZXR1cm4KK3VubGVzcyB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gY29uc2lkZXJzIHRoZSB1c2VyIGlucHV0IHZhbGlkOyBpdCBpcyBhbGxvd2VkIHRvIHRocm93IGFuIGV4Y2VwdGlvbgoraW4gdGhpcyBzaXR1YXRpb24uPC9wPgogCiA8cD5BbnQgY29tZXMgd2l0aCB0aHJlZSBidWlsdC1pbiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2U6PC9wPgogCi08aDM+PGEgbmFtZT0iZGVmYXVsdGhhbmRsZXIiPkRlZmF1bHRJbnB1dEhhbmRsZXI8L2E+PC9oMz4KKzxoMyBpZD0iZGVmYXVsdGhhbmRsZXIiPkRlZmF1bHRJbnB1dEhhbmRsZXI8L2gzPgogCi08cD5UaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiB5b3UgZ2V0LCB3aGVuIHlvdSBkb24ndCB1c2UgdGhlCi08Y29kZT4taW5wdXRoYW5kbGVyPC9jb2RlPiBjb21tYW5kIGxpbmUgc3dpdGNoIGF0IGFsbC4gIFRoaXMKLWltcGxlbWVudGF0aW9uIHdpbGwgcHJpbnQgdGhlIHByb21wdCBlbmNhcHN1bGF0ZWQgaW4gdGhlCi08Y29kZT5yZXF1ZXN0PC9jb2RlPiBvYmplY3QgdG8gQW50J3MgbG9nZ2luZyBzeXN0ZW0gYW5kIHJlLXByb21wdCBmb3IKLWlucHV0IHVudGlsIHRoZSB1c2VyIGVudGVycyBzb21ldGhpbmcgdGhhdCBpcyBjb25zaWRlcmVkIHZhbGlkIGlucHV0Ci1ieSB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gb2JqZWN0LiAgSW5wdXQgd2lsbCBiZSByZWFkIGZyb20gdGhlCi1jb25zb2xlIGFuZCB0aGUgdXNlciB3aWxsIG5lZWQgdG8gcHJlc3MgdGhlIFJldHVybiBrZXkuPC9wPgorPHA+VGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24geW91IGdldCwgd2hlbiB5b3UgZG9uJ3QgdXNlIHRoZSA8a2JkPi1pbnB1dGhhbmRsZXI8L2tiZD4gY29tbWFuZCBsaW5lCitzd2l0Y2ggYXQgYWxsLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIHByaW50IHRoZSBwcm9tcHQgZW5jYXBzdWxhdGVkIGluIHRoZSA8Y29kZT5yZXF1ZXN0PC9jb2RlPgorb2JqZWN0IHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtIGFuZCByZS1wcm9tcHQgZm9yIGlucHV0IHVudGlsIHRoZSB1c2VyIGVudGVycyBzb21ldGhpbmcgdGhhdCBpcworY29uc2lkZXJlZCB2YWxpZCBpbnB1dCBieSB0aGUgPGNvZGU+cmVxdWVzdDwvY29kZT4gb2JqZWN0LiAgSW5wdXQgd2lsbCBiZSByZWFkIGZyb20gdGhlIGNvbnNvbGUgYW5kCit0aGUgdXNlciB3aWxsIG5lZWQgdG8gcHJlc3MgdGhlIFJldHVybiBrZXkuPC9wPgogCiA8aDM+UHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyPC9oMz4KIAotPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcnVuIHVuYXR0ZW5kZWQgYnVpbGQKLXByb2Nlc3Nlcy4gIEl0IHJlYWRzIGFsbCBpbnB1dCBmcm9tIGEgcHJvcGVydGllcyBmaWxlIGFuZCBtYWtlcyB0aGUKLWJ1aWxkIGZhaWwgaWYgaXQgY2Fubm90IGZpbmQgdmFsaWQgaW5wdXQgaW4gdGhpcyBmaWxlLiAgVGhlIG5hbWUgb2YKLXRoZSBwcm9wZXJ0aWVzIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIEphdmEgc3lzdGVtIHByb3BlcnR5Ci08Y29kZT5hbnQuaW5wdXQucHJvcGVydGllczwvY29kZT4uPC9wPgorPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcnVuIHVuYXR0ZW5kZWQgYnVpbGQgcHJvY2Vzc2VzLiAgSXQgcmVhZHMgYWxsIGlucHV0Citmcm9tIGEgcHJvcGVydGllcyBmaWxlIGFuZCBtYWtlcyB0aGUgYnVpbGQgZmFpbCBpZiBpdCBjYW5ub3QgZmluZCB2YWxpZCBpbnB1dCBpbiB0aGlzIGZpbGUuICBUaGUKK25hbWUgb2YgdGhlIHByb3BlcnRpZXMgZmlsZSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgSmF2YSBzeXN0ZW0KK3Byb3BlcnR5IDxjb2RlPmFudC5pbnB1dC5wcm9wZXJ0aWVzPC9jb2RlPi48L3A+CiAKLTxwPlRoZSBwcm9tcHQgZW5jYXBzdWxhdGVkIGluIGEgPGNvZGU+cmVxdWVzdDwvY29kZT4gd2lsbCBiZSB1c2VkIGFzCi10aGUga2V5IHdoZW4gbG9va2luZyB1cCB0aGUgaW5wdXQgaW5zaWRlIHRoZSBwcm9wZXJ0aWVzIGZpbGUuICBJZiBubwotaW5wdXQgY2FuIGJlIGZvdW5kLCB0aGUgaW5wdXQgaXMgY29uc2lkZXJlZCBpbnZhbGlkIGFuZCBhbiBleGNlcHRpb24KLXdpbGwgYmUgdGhyb3duLjwvcD4KKzxwPlRoZSBwcm9tcHQgZW5jYXBzdWxhdGVkIGluIGEgPGNvZGU+cmVxdWVzdDwvY29kZT4gd2lsbCBiZSB1c2VkIGFzIHRoZSBrZXkgd2hlbiBsb29raW5nIHVwIHRoZQoraW5wdXQgaW5zaWRlIHRoZSBwcm9wZXJ0aWVzIGZpbGUuICBJZiBubyBpbnB1dCBjYW4gYmUgZm91bmQsIHRoZSBpbnB1dCBpcyBjb25zaWRlcmVkIGludmFsaWQgYW5kIGFuCitleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uPC9wPgogCi08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz4gdGhhdCA8Y29kZT5hbnQuaW5wdXQucHJvcGVydGllczwvY29kZT4gbXVzdAotYmUgYSBKYXZhIHN5c3RlbSBwcm9wZXJ0eSwgbm90IGFuIEFudCBwcm9wZXJ0eS4gIEkuZS4geW91IGNhbm5vdAotZGVmaW5lIGl0IGFzIGEgc2ltcGxlIHBhcmFtZXRlciB0byA8Y29kZT5hbnQ8L2NvZGU+LCBidXQgeW91IGNhbgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+IHRoYXQgPGNvZGU+YW50LmlucHV0LnByb3BlcnRpZXM8L2NvZGU+IG11c3QgYmUgYSBKYXZhIHN5c3RlbSBwcm9wZXJ0eSwgbm90CithbiBBbnQgcHJvcGVydHkuICBJLmUuIHlvdSBjYW5ub3QgZGVmaW5lIGl0IGFzIGEgc2ltcGxlIHBhcmFtZXRlciB0byA8a2JkPmFudDwva2JkPiwgYnV0IHlvdSBjYW4KIGRlZmluZSBpdCBpbnNpZGUgdGhlIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L3A+CiAKIDxoMz5HcmVlZHlJbnB1dEhhbmRsZXI8L2gzPgotCi08cD5MaWtlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB0aGlzIElucHV0SGFuZGxlciByZWFkcyBmcm9tIHN0YW5kYXJkCi1pbnB1dC4gSG93ZXZlciwgaXQgY29uc3VtZXMgPGk+YWxsPC9pPiBhdmFpbGFibGUgaW5wdXQuIFRoaXMgYmVoYXZpb3IgaXMKLXVzZWZ1bCBmb3Igc2VuZGluZyBBbnQgaW5wdXQgdmlhIGFuIE9TIHBpcGUuIDxiPlNpbmNlIEFudCAxLjc8L2I+LjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+Cis8cD5MaWtlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLCB0aGlzIElucHV0SGFuZGxlciByZWFkcyBmcm9tIHN0YW5kYXJkIGlucHV0LiBIb3dldmVyLCBpdAorY29uc3VtZXMgPGVtPmFsbDwvZW0+IGF2YWlsYWJsZSBpbnB1dC4gVGhpcyBiZWhhdmlvciBpcyB1c2VmdWwgZm9yIHNlbmRpbmcgQW50IGlucHV0IHZpYSBhbiBPUworcGlwZS48L3A+CiAKIDxoMz5TZWN1cmVJbnB1dEhhbmRsZXI8L2gzPgotCi08cD5UaGlzIElucHV0SGFuZGxlciBjYWxscyA8Y29kZT5TeXN0ZW0uY29uc29sZSgpLnJlYWRQYXNzd29yZCgpPC9jb2RlPiwKLWF2YWlsYWJsZSBzaW5jZSBKYXZhIDEuNi4gIE9uIGVhcmxpZXIgcGxhdGZvcm1zIGl0IGZhbGxzIGJhY2sgdG8gdGhlCi1iZWhhdmlvciBvZiBEZWZhdWx0SW5wdXRIYW5kbGVyLiA8Yj5TaW5jZSBBbnQgMS43LjE8L2I+LjwvcD4KKzxwPjxlbT5TaW5jZSBBbnQgMS43LjE8L2VtPjwvcD4KKzxwPlRoaXMgSW5wdXRIYW5kbGVyIGNhbGxzIDxjb2RlIGNsYXNzPSJjb2RlIj5TeXN0ZW0uY29uc29sZSgpLnJlYWRQYXNzd29yZCgpPC9jb2RlPiwgYXZhaWxhYmxlCitzaW5jZSBKYXZhIDYuICBPbiBlYXJsaWVyIHBsYXRmb3JtcyBpdCBmYWxscyBiYWNrIHRvIHRoZSBiZWhhdmlvcgorb2YgPGNvZGUgY2xhc3M9ImNvZGUiPkRlZmF1bHRJbnB1dEhhbmRsZXI8L2NvZGU+LjwvcD4KIAogPGgyPklucHV0UmVxdWVzdDwvaDI+CiAKLTxwPkluc3RhbmNlcyBvZiA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3Q8L2NvZGU+Ci1lbmNhcHN1bGF0ZSB0aGUgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGFzayBhIHVzZXIgZm9yIGlucHV0IGFuZAotdmFsaWRhdGUgdGhpcyBpbnB1dC48L3A+Cis8cD5JbnN0YW5jZXMgb2YgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LklucHV0UmVxdWVzdDwvY29kZT4gZW5jYXBzdWxhdGUgdGhlCitpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gYXNrIGEgdXNlciBmb3IgaW5wdXQgYW5kIHZhbGlkYXRlIHRoaXMgaW5wdXQuPC9wPgogCi08cD5UaGUgaW5zdGFuY2VzIG9mIDxjb2RlPklucHV0UmVxdWVzdDwvY29kZT4gaXRzZWxmIHdpbGwgYWNjZXB0IGFueQotaW5wdXQsIGJ1dCBzdWJjbGFzc2VzIG1heSB1c2Ugc3RyaWN0ZXIgdmFsaWRhdGlvbnMuCi08Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5NdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdDwvY29kZT4KLXNob3VsZCBiZSB1c2VkIGlmIHRoZSB1c2VyIGlucHV0IG11c3QgYmUgcGFydCBvZiBhIHByZWRlZmluZWQgc2V0IG9mCi1jaG9pY2VzLjwvcD4KKzxwPlRoZSBpbnN0YW5jZXMgb2YgPGNvZGUgY2xhc3M9ImNvZGUiPklucHV0UmVxdWVzdDwvY29kZT4gaXRzZWxmIHdpbGwgYWNjZXB0IGFueSBpbnB1dCwgYnV0CitzdWJjbGFzc2VzIG1heSB1c2Ugc3RyaWN0ZXIKK3ZhbGlkYXRpb25zLiA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3Q8L2NvZGU+IHNob3VsZAorYmUgdXNlZCBpZiB0aGUgdXNlciBpbnB1dCBtdXN0IGJlIHBhcnQgb2YgYSBwcmVkZWZpbmVkIHNldCBvZiBjaG9pY2VzLjwvcD4KIAotCis8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvaW5zdGFsbC5odG1sIGIvbWFudWFsL2luc3RhbGwuaHRtbAppbmRleCA5M2EwOWYxLi40OTM4ZTYzIDEwMDY0NAotLS0gYS9tYW51YWwvaW5zdGFsbC5odG1sCisrKyBiL21hbnVhbC9pbnN0YWxsLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+SW5zdGFsbGluZyBBcGFjaGUgQW50PC90aXRsZT4KIDwvaGVhZD4KQEAgLTMxLDE4ICszMSwxOCBAQAogVG8gZ2V0IHVwIGFuZCBydW5uaW5nIHdpdGggdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IHF1aWNrbHksIGZvbGxvdyB0aGVzZSBzdGVwczoKIDwvcD4KIDxvbD4KLTxsaT5NYWtlIHN1cmUgeW91IGhhdmUgYSBKYXZhIGVudmlyb25tZW50IGluc3RhbGxlZCwgU2VlIDxhIGhyZWY9IiNzeXNyZXF1aXJlbWVudHMiPlN5c3RlbSBSZXF1aXJlbWVudHM8L2E+IGZvcgorPGxpPk1ha2Ugc3VyZSB5b3UgaGF2ZSBhIEphdmEgZW52aXJvbm1lbnQgaW5zdGFsbGVkLiBTZWUgPGEgaHJlZj0iI3N5c3JlcXVpcmVtZW50cyI+U3lzdGVtIFJlcXVpcmVtZW50czwvYT4gZm9yCiBkZXRhaWxzLjwvbGk+CiA8bGk+RG93bmxvYWQgQW50LiBTZWUgPGEgaHJlZj0iI2dldEJpbmFyeSI+QmluYXJ5IERpc3RyaWJ1dGlvbjwvYT4gZm9yIGRldGFpbHMuPC9saT4KIDxsaT5VbmNvbXByZXNzIHRoZSBkb3dubG9hZGVkIGZpbGUgaW50byBhIGRpcmVjdG9yeS48L2xpPgotPGxpPlNldCBlbnZpcm9ubWVudGFsIHZhcmlhYmxlcyA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IHRvIHlvdXIgSmF2YSBlbnZpcm9ubWVudCwgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IHRvIHRoZSBkaXJlY3RvcnkKLXlvdSB1bmNvbXByZXNzZWQgQW50IHRvLCBhbmQgYWRkIDxjb2RlPiR7QU5UX0hPTUV9L2JpbjwvY29kZT4gKFVuaXgpIG9yIDxjb2RlPiVBTlRfSE9NRSUvYmluPC9jb2RlPiAoV2luZG93cykgdG8KKzxsaT5TZXQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXM6IDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gdG8geW91ciBKYXZhIGVudmlyb25tZW50LCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gdG8gdGhlIGRpcmVjdG9yeQoreW91IHVuY29tcHJlc3NlZCBBbnQgdG8sIGFuZCBhZGQgPHNhbXA+JHtBTlRfSE9NRX0vYmluPC9zYW1wPiAoVW5peCkgb3IgPHNhbXA+JUFOVF9IT01FJS9iaW48L3NhbXA+IChXaW5kb3dzKSB0bwogeW91ciA8Y29kZT5QQVRIPC9jb2RlPi4gU2VlIDxhIGhyZWY9IiNzZXR1cCI+U2V0dXA8L2E+IGZvciBkZXRhaWxzLjwvbGk+Ci08bGk+T3B0aW9uYWxseSwgZnJvbSB0aGUgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGRpcmVjdG9yeSBydW4gPGNvZGU+YW50IC1mIGZldGNoLnhtbCAtRGRlc3Q9c3lzdGVtPC9jb2RlPiB0byBnZXQgdGhlCis8bGk+T3B0aW9uYWxseSwgZnJvbSB0aGUgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGRpcmVjdG9yeSBydW4gPGtiZD5hbnQgLWYgZmV0Y2gueG1sIC1EZGVzdD1zeXN0ZW08L2tiZD4gdG8gZ2V0IHRoZQogbGlicmFyeSBkZXBlbmRlbmNpZXMgb2YgbW9zdCBvZiB0aGUgQW50IHRhc2tzIHRoYXQgcmVxdWlyZSB0aGVtLiBJZiB5b3UgZG9uJ3QgZG8gdGhpcywgbWFueSBvZiB0aGUgZGVwZW5kZW50IEFudCB0YXNrcwogd2lsbCBub3QgYmUgYXZhaWxhYmxlLiBTZWUgPGEgaHJlZj0iI29wdGlvbmFsVGFza3MiPk9wdGlvbmFsIFRhc2tzPC9hPiBmb3IgZGV0YWlscyBhbmQgb3RoZXIgb3B0aW9ucyBmb3IKLXRoZSA8Y29kZT4tRGRlc3Q8L2NvZGU+IHBhcmFtZXRlci48L2xpPgotPGxpPk9wdGlvbmFsbHksIGFkZCBhbnkgZGVzaXJlZCBBbnRsaWJzLiBTZWUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvcHJvcGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50Cit0aGUgPGtiZD4tRGRlc3Q8L2tiZD4gcGFyYW1ldGVyLjwvbGk+Cis8bGk+T3B0aW9uYWxseSwgYWRkIGFueSBkZXNpcmVkIEFudGxpYnMuIFNlZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvcHJvcGVyLmh0bWwiIHRhcmdldD0iX3RvcCI+QW50CiBMaWJyYXJpZXM8L2E+IGZvciBhIGxpc3QuPC9saT4KIDwvb2w+CiA8cD4KQEAgLTYzLDE3ICs2MywxNyBAQAogPGgzIGlkPSJnZXRCaW5hcnkiPkJpbmFyeSBEaXN0cmlidXRpb248L2gzPgogCiA8cD4KLVRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgQW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBBbnQgd2ViIHBhZ2UgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyIKLXRhcmdldD0iX3RvcCI+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvYT4KK1RoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24gb2YgQW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBBbnQgd2ViIHBhZ2UgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iCit0YXJnZXQ9Il90b3AiPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC9hPgogPC9wPgogPHA+CiBUaGUgYmluYXJ5IGRpc3RyaWJ1dGlvbiBvZiBBbnQgaXMgYXZhaWxhYmxlIGFzIDMgZGlmZmVyZW50IGFyY2hpdmVzCiA8L3A+CiA8b2w+Ci08bGk+PGI+LnppcDwvYj4gLSBSZWNvbW1lbmRlZCBjb21wcmVzc2lvbiBmb3JtYXQgZm9yIFdpbmRvd3MsIGNhbiBhbHNvIGJlIHVzZWQgb24gb3RoZXIgcGxhdGZvcm1zLiBTdXBwb3J0ZWQgYnkgbWFueQotcHJvZ3JhbXMgYW5kIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgbmF0aXZlbHkuPC9saT4KLTxsaT48Yj4udGFyLmd6PC9iPiAtIFVzaW5nIHRoZSB0YXIgcHJvZ3JhbSB0byBnYXRoZXIgZmlsZXMgdG9nZXRoZXIsIGFuZCBnemlwIHRvIGNvbXByZXNzIGFuZCB1bmNvbXByZXNzLjwvbGk+Ci08bGk+PGI+LnRhci5iejI8L2I+IC0gVXNpbmcgdGhlIHRhciBwcm9ncmFtIHRvIGdhdGhlciBmaWxlcyB0b2dldGhlciwgYW5kIGJ6aXAyIHRvIGNvbXByZXNzIGFuZCB1bmNvbXByZXNzLjwvbGk+Cis8bGk+PHNhbXA+LnppcDwvc2FtcD4mbWRhc2g7UmVjb21tZW5kZWQgY29tcHJlc3Npb24gZm9ybWF0IGZvciBXaW5kb3dzLCBjYW4gYWxzbyBiZSB1c2VkIG9uIG90aGVyIHBsYXRmb3Jtcy4gU3VwcG9ydGVkCitieSBtYW55IHByb2dyYW1zIGFuZCBzb21lIG9wZXJhdGluZyBzeXN0ZW1zIG5hdGl2ZWx5LjwvbGk+Cis8bGk+PHNhbXA+LnRhci5nejwvc2FtcD4mbWRhc2g7VXNpbmcgdGhlIHRhciBwcm9ncmFtIHRvIGdhdGhlciBmaWxlcyB0b2dldGhlciwgYW5kIGd6aXAgdG8gY29tcHJlc3MgYW5kIHVuY29tcHJlc3MuPC9saT4KKzxsaT48c2FtcD4udGFyLmJ6Mjwvc2FtcD4mbWRhc2g7VXNpbmcgdGhlIHRhciBwcm9ncmFtIHRvIGdhdGhlciBmaWxlcyB0b2dldGhlciwgYW5kIGJ6aXAyIHRvIGNvbXByZXNzIGFuZCB1bmNvbXByZXNzLjwvbGk+CiA8L29sPgogPHA+CiBDaG9vc2UgdGhlIGZvcm1hdCB0aGF0IGlzIGJlc3Qgc3VwcG9ydGVkIGZvciB5b3VyIHBsYXRmb3JtLgpAQCAtOTcsMTIyICs5NywxMzAgQEAKIGVsaW1pbmF0ZSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiBjb21tYW5kLWxpbmUgYW5kIElERSBBbnQuCiA8L3A+CiAKLTxoMz5CdW5kbGVkIGluIEphdmEgYXBwbGljYXRpb25zPC9oMz4KKzxoMz5CdW5kbGVkIGluIEphdmEgQXBwbGljYXRpb25zPC9oMz4KIAogPHA+CiBNYW55IEphdmEgYXBwbGljYXRpb25zLCBtb3N0IHBhcnRpY3VsYXJseSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCBzaGlwIHdpdGggYSB2ZXJzaW9uIG9mIEFudC4gVGhlc2UgYXJlIHByaW1hcmlseSBmb3IKIGludGVybmFsIHVzZSBieSB0aGUgYXBwbGljYXRpb24sIHVzaW5nIHRoZSBKYXZhIEFQSXMgdG8gZGVsZWdhdGUgdGFza3Mgc3VjaCBhcyBKU1AgcGFnZSBjb21waWxhdGlvbiB0byB0aGUgQW50CiBydW50aW1lLiBTdWNoIGRpc3RyaWJ1dGlvbnMgYXJlIHVzdWFsbHkgdW5zdXBwb3J0ZWQgYnkgZXZlcnlvbmUuIFBhcnRpY3VsYXJseSB0cm91Ymxlc29tZSBhcmUgdGhvc2UgcHJvZHVjdHMgdGhhdCBub3QKLW9ubHkgc2hpcCB3aXRoIHRoZWlyIG93biBBbnQgcmVsZWFzZSwgdGhleSBhZGQgdGhlaXIgb3duIHZlcnNpb24gb2YgQU5ULkJBVCBvciBhbnQuc2ggdG8gdGhlIDxjb2RlPlBBVEg8L2NvZGU+LiBJZiBBbnQKLXN0YXJ0cyBiZWhhdmluZyB3ZWlyZGx5IGFmdGVyIGluc3RhbGxpbmcgc29tZXRoaW5nLCB0cnkgdGhlIDxhIGhyZWY9IiNkaWFnbm9zdGljcyI+ZGlhZ25vc3RpY3M8L2E+IGFkdmljZS4KK29ubHkgc2hpcCB3aXRoIHRoZWlyIG93biBBbnQgcmVsZWFzZSwgdGhleSBhZGQgdGhlaXIgb3duIHZlcnNpb24gb2YgPHNhbXA+QU5ULkJBVDwvc2FtcD4gb3IgPHNhbXA+YW50LnNoPC9zYW1wPiB0bwordGhlIDxjb2RlPlBBVEg8L2NvZGU+LiBJZiBBbnQgc3RhcnRzIGJlaGF2aW5nIHdlaXJkbHkgYWZ0ZXIgaW5zdGFsbGluZyBzb21ldGhpbmcsIHRyeQordGhlIDxhIGhyZWY9IiNkaWFnbm9zdGljcyI+ZGlhZ25vc3RpY3M8L2E+IGFkdmljZS4KIDwvcD4KIAogPGgzIGlkPSJzb3VyY2VFZGl0aW9uIj5Tb3VyY2UgRGlzdHJpYnV0aW9uPC9oMz4KIAogPHA+Ci1JZiB5b3UgcHJlZmVyIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBzb3VyY2UgZm9yIHRoZSBsYXRlc3QgQW50IHJlbGVhc2UgZnJvbQotPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvc3JjZG93bmxvYWQuY2dpPC9hPi4KK0lmIHlvdSBwcmVmZXIgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24sIHlvdSBjYW4gZG93bmxvYWQgdGhlIHNvdXJjZSBmb3IgdGhlIGxhdGVzdCBBbnQgcmVsZWFzZQorZnJvbSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaSIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2FudC5hcGFjaGUub3JnL3NyY2Rvd25sb2FkLmNnaTwvYT4uCiA8L3A+CiA8cD4KIElmIHlvdSBwcmVmZXIgdGhlIGxlYWRpbmctZWRnZSBjb2RlLCB5b3UgY2FuIGFjY2VzcyB0aGUgY29kZSBhcyBpdCBpcyBiZWluZyBkZXZlbG9wZWQgdmlhIEdpdC4gVGhlIEFudCB3ZWJzaXRlIGhhcwotZGV0YWlscyBvbiA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvZ2l0Lmh0bWwiIHRhcmdldD0iX3RvcCI+YWNjZXNzaW5nIEdpdDwvYT4uIEFsbCBidWcgZml4ZXMgd2lsbCBnbyBpbiBhZ2FpbnN0Ci10aGUgSEVBRCBvZiB0aGUgc291cmNlIHRyZWUsIGFuZCB0aGUgZmlyc3QgcmVzcG9uc2UgdG8gbWFueSBidWdyZXBzIHdpbGwgYmUgImhhdmUgeW91IHRyaWVkIHRoZSBsYXRlc3QgdmVyc2lvbiIuIERvbid0Ci1iZSBhZnJhaWQgdG8gZG93bmxvYWQgYW5kIGJ1aWxkIGEgcHJlcmVsZWFzZSBkaXN0cmlidXRpb24sIGFzIGV2ZXJ5dGhpbmcgb3RoZXIgdGhhbiBuZXcgZmVhdHVyZXMgYXJlIHVzdWFsbHkgc3RhYmxlLgorZGV0YWlscyBvbiA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2dpdC5odG1sIiB0YXJnZXQ9Il90b3AiPmFjY2Vzc2luZyBHaXQ8L2E+LiBBbGwgYnVnIGZpeGVzIHdpbGwgZ28gaW4gYWdhaW5zdAordGhlIEhFQUQgb2YgdGhlIHNvdXJjZSB0cmVlLCBhbmQgdGhlIGZpcnN0IHJlc3BvbnNlIHRvIG1hbnkgYnVnIHJlcG9ydHMgd2lsbCBiZSAiaGF2ZSB5b3UgdHJpZWQgdGhlIGxhdGVzdAordmVyc2lvbiIuIERvbid0IGJlIGFmcmFpZCB0byBkb3dubG9hZCBhbmQgYnVpbGQgYSBwcmVyZWxlYXNlIGRpc3RyaWJ1dGlvbiwgYXMgZXZlcnl0aGluZyBvdGhlciB0aGFuIG5ldyBmZWF0dXJlcyBhcmUKK3VzdWFsbHkgc3RhYmxlLgogPC9wPgogPHA+CiBTZWUgdGhlIHNlY3Rpb24gPGEgaHJlZj0iI2J1aWxkaW5nYW50Ij5CdWlsZGluZyBBbnQ8L2E+IG9uIGhvdyB0byBidWlsZCBBbnQgZnJvbSB0aGUgc291cmNlIGNvZGUuIFlvdSBjYW4gYWxzbyBhY2Nlc3MKLXRoZSA8YSBocmVmPSJodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD1hbnQuZ2l0O2E9c3VtbWFyeSIgdGFyZ2V0PSJfdG9wIj5BbnQgR2l0IHJlcG9zaXRvcnk8L2E+IG9uLWxpbmUuCit0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD1hbnQuZ2l0O2E9c3VtbWFyeSIgdGFyZ2V0PSJfdG9wIj5BbnQgR2l0IHJlcG9zaXRvcnk8L2E+IG9uLWxpbmUuCiA8L3A+CiAKIDxoMyBpZD0iYXJjaGl2ZXMiPkFyY2hpdmUgRG93bmxvYWQgQXJlYSBMYXlvdXQ8L2gzPgogCiA8cD4KLU9sZGVyIHZlcnNpb25zIG9mIEFudCBhcmUgYXZhaWxhYmxlIGluIHRoZSBhcmNoaXZlcyBhdCA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyIKLXRhcmdldD0iX3RvcCI+aHR0cDovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2FudC88L2E+LiBUaGUgZmlsZXMgYXJlIG9yZ2FuaXplZCBhcyBmb2xsb3dzLgorT2xkZXIgdmVyc2lvbnMgb2YgQW50IGFyZSBhdmFpbGFibGUgaW4gdGhlIGFyY2hpdmVzIGF0IDxhIGhyZWY9Imh0dHBzOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvYW50LyIKK3RhcmdldD0iX3RvcCI+aHR0cHM6Ly9hcmNoaXZlLmFwYWNoZS5vcmcvZGlzdC9hbnQvPC9hPi4gVGhlIGZpbGVzIGFyZSBvcmdhbml6ZWQgYXMgZm9sbG93cy4KIDwvcD4KIDx0YWJsZT4KIDx0cj4KLSAgPHRoPkZpbGVuYW1lIG9yIFBhdGg8L3RoPgotICA8dGg+RGVzY3JpcHRpb248L3RoPgorICA8dGggc2NvcGU9ImNvbCI+RmlsZW5hbWUgb3IgUGF0aDwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CiA8L3RyPgogPHRyPgotICA8dGQ+S0VZUzwvdGQ+CisgIDx0ZD48c2FtcD5LRVlTPC9zYW1wPjwvdGQ+CiAgIDx0ZD5QR1Aga2V5ZmlsZS4gSXQgY29udGFpbnMgdGhlIFBHUCBrZXlzIG9mIEFudCBkZXZlbG9wZXJzIHNvIHlvdSBjYW4gJ3RydXN0JyB0aGUgZGlzdHJpYnV0aW9uLjwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+UkVMRUFTRS1OT1RFUy17dmVyc2lvbn0uaHRtbDwvdGQ+CisgIDx0ZD48c2FtcD5SRUxFQVNFLU5PVEVTLXt2ZXJzaW9ufS5odG1sPC9zYW1wPjwvdGQ+CiAgIDx0ZD4KICAgICBSZWxlYXNlIG5vdGVzIG9mIHRoZSBnaXZlbiB2ZXJzaW9uIGluIEhUTUwgZm9ybWF0LiBXaGVuIHVwZ3JhZGluZyB5b3VyIEFudCBpbnN0YWxsYXRpb24geW91Ci0gICAgc2hvdWxkIGhhdmUgYSBsb29rIGF0IHRoZSA8aT5DaGFuZ2VzIHRoYXQgY291bGQgYnJlYWsgb2xkZXIgZW52aXJvbm1lbnRzPC9pPiBzZWN0aW9uLgorICAgIHNob3VsZCBoYXZlIGEgbG9vayBhdCB0aGUgPGVtPkNoYW5nZXMgdGhhdCBjb3VsZCBicmVhayBvbGRlciBlbnZpcm9ubWVudHM8L2VtPiBzZWN0aW9uLgogICA8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPmFudC1jdXJyZW50LWJpbi56aXA8L3RkPgorICA8dGQ+PHNhbXA+YW50LWN1cnJlbnQtYmluLnppcDwvc2FtcD48L3RkPgogICA8dGQ+Ci0gICAgWklQIGFyY2hpdmUgY29udGFpbmluZyB0aGUgY29tcGlsZWQgdmVyc2lvbiBvZiBBbnQgaW4gdGhlIGxhc3QgcmVsZWFzZWQgdmVyc2lvbi4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdAotICAgIHlvdSBkbyBub3QgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIHRoaXMgd2F5LCBhcyB0aGUgc3RhbmRhcmQgd2F5IG9mIGRvd25sb2FkaW5nIGRlc2NyaWJlZCBhYm92ZSB3aWxsCi0gICAgcmVkaXJlY3QgeW91IHRvIGEgbWlycm9yIGNsb3NlciB0byB5b3UsIHRodXMgbWFraW5nIHRoZSBkb3dubG9hZCBmYXN0ZXIgZm9yIHlvdSBhbmQgcmVkdWNpbmcgdGhlIGxvYWQKKyAgICBaSVAgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBjb21waWxlZCB2ZXJzaW9uIG9mIEFudCBpbiB0aGUgbGFzdCByZWxlYXNlZCB2ZXJzaW9uLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkbyBub3QKKyAgICBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gdGhpcyB3YXksIGFzIHRoZSBzdGFuZGFyZCB3YXkgb2YgZG93bmxvYWRpbmcgZGVzY3JpYmVkIGFib3ZlIHdpbGwgcmVkaXJlY3QgeW91IHRvIGEKKyAgICBtaXJyb3IgY2xvc2VyIHRvIHlvdSwgdGh1cyBtYWtpbmcgdGhlIGRvd25sb2FkIGZhc3RlciBmb3IgeW91IGFuZCByZWR1Y2luZyB0aGUgbG9hZCBvbiBBcGFjaGUgc2VydmVycy4KKyAgPC90ZD4KKzwvdHI+Cis8dHI+CisgIDx0ZD48c2FtcD5hbnQtY3VycmVudC1zcmMuemlwPC9zYW1wPjwvdGQ+CisgIDx0ZD4KKyAgICBaSVAgYXJjaGl2ZSBjb250YWluaW5nIHRoZSBzb3VyY2VzIG9mIEFudC4gSWYgeW91IGhhdmUgdGhpcyB5b3UgY2FuIGNvbXBpbGUgQW50LiBJZiB5b3UgZG8gbm90IGhhdmUKKyAgICB0aGUgPGVtPnJlcXVpcmVkPC9lbT4gZGVwZW5kZW5jaWVzLCB0aGUgY2xhc3NlcyBkZXBlbmRpbmcgb24gdGhlbSBhcmUganVzdCBub3QgYnVpbHQuIEFnYWluLCBpdCBpcyBwcmVmZXJyZWQgdG8gdXNlCisgICAgdGhlIHN0YW5kYXJkIHdheSBvZiBnZXR0aW5nIHRoZSBzb3VyY2UgcGFja2FnZSBkZXNjcmliZWQgYWJvdmUgdG8gbWFrZSB5b3VyIGRvd25sb2FkIHF1aWNrZXIgYW5kIHRvIHJlZHVjZSB0aGUgbG9hZAogICAgIG9uIEFwYWNoZSBzZXJ2ZXJzLgogICA8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPmFudC1jdXJyZW50LXNyYy56aXA8L3RkPgorICA8dGQ+PHNhbXA+YW50LWN1cnJlbnQtKi5hc2M8L3NhbXA+PC90ZD4KICAgPHRkPgotICAgIFpJUCBhcmNoaXZlIGNvbnRhaW5pbmcgdGhlIHNvdXJjZXMgb2YgQW50LiBJZiB5b3UgaGF2ZSB0aGlzIHlvdSBjYW4gY29tcGlsZSBBbnQuIElmIHlvdSBkbyBub3QgaGF2ZSB0aGUKLSAgICA8aT5yZXF1aXJlZDwvaT4gZGVwZW5kZW5jaWVzLCB0aGUgY2xhc3NlcyBkZXBlbmRpbmcgb24gdGhlbSBhcmUganVzdCBub3QgYnVpbHQuIEFnYWluLCBpdCBpcyBwcmVmZXJyZWQgdG8gdXNlIHRoZQotICAgIHN0YW5kYXJkIHdheSBvZiBnZXR0aW5nIHRoZSBzb3VyY2UgcGFja2FnZSBkZXNjcmliZWQgYWJvdmUgdG8gbWFrZSB5b3VyIGRvd25sb2FkIHF1aWNrZXIgYW5kIHRvIHJlZHVjZSB0aGUgbG9hZCBvbgotICAgIEFwYWNoZSBzZXJ2ZXJzLgorICAgIFNlY3VyaXR5IGZpbGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgb25lIGlzCisgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ByZXR0eV9Hb29kX1ByaXZhY3kiIHRhcmdldD0iX3RvcCI+UEdQPC9hPiBzaWduYXR1cmUuCiAgIDwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+YW50LWN1cnJlbnQtKi5hc2M8L3RkPgorICA8dGQ+PHNhbXA+YW50LWN1cnJlbnQtKi5tZDU8L3NhbXA+PC90ZD4KICAgPHRkPgotICAgIFNlY3VyaXR5IGZpbGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgb25lIGlzIHRoZQotICAgIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJldHR5X0dvb2RfUHJpdmFjeSIgdGFyZ2V0PSJfYmxhbmsiPlBHUDwvYT4gc2lnbmF0dXJlLgorICAgIFNlY3VyaXR5IGZpbGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgb25lIGlzCisgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01kNSIgdGFyZ2V0PSJfdG9wIj5NRDU8L2E+IGNoZWNrc3VtLgogICA8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPmFudC1jdXJyZW50LSoubWQ1PC90ZD4KKyAgPHRkPjxzYW1wPmFudC1jdXJyZW50LSouc2hhMTwvc2FtcD48L3RkPgogICA8dGQ+Ci0gICAgU2VjdXJpdHkgZmlsZSBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB6aXAgZmlsZS4gVGhpcyBvbmUgaXMgdGhlCi0gICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZDUiIHRhcmdldD0iX2JsYW5rIj5NRDU8L2E+IGNoZWNrc3VtLgorICAgIFNlY3VyaXR5IGZpbGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgb25lIGlzCisgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NIQS0xIiB0YXJnZXQ9Il90b3AiPlNIQTE8L2E+IGNoZWNrc3VtLgogICA8L3RkPgogPC90cj4KIDx0cj4KLSAgPHRkPmFudC1jdXJyZW50LSouc2hhMTwvdGQ+CisgIDx0ZD48c2FtcD5hbnQtY3VycmVudC0qLnNoYTUxMjwvc2FtcD48L3RkPgogICA8dGQ+Ci0gICAgU2VjdXJpdHkgZmlsZSBmb3IgY2hlY2tpbmcgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB6aXAgZmlsZS4gVGhpcyBvbmUgaXMgdGhlCi0gICAgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TSEEtMSIgdGFyZ2V0PSJfYmxhbmsiPlNIQTE8L2E+IGNoZWNrc3VtLgorICAgIFNlY3VyaXR5IGZpbGUgZm9yIGNoZWNraW5nIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgemlwIGZpbGUuIFRoaXMgb25lIGlzCisgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NIQS0yIiB0YXJnZXQ9Il90b3AiPlNIQTUxMjwvYT4gY2hlY2tzdW0uCiAgIDwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+YW50bGlicy88L3RkPgorICA8dGQ+PHNhbXA+YW50bGlicy88L3NhbXA+PC90ZD4KICAgPHRkPgogICAgIFRoaXMgZGlyZWN0b3J5IGhvbGRzIHRoZSBBbnRsaWJzIHRoYXQgYXJlIG1hZGUgb2YgYXZhaWxhYmxlIGJ5IHRoZSBBcGFjaGUgQW50IHByb2plY3QuIEFudGxpYnMgYXJlIGJ1bmRsZXMgb2YgQW50CiAgICAgdGFza3MgdGhhdCBhcmUgbm90IGRlbGl2ZXJlZCBhcyBwYXJ0IG9mIHRoZSBBbnQgY29yZSBidXQgYXJlIGF2YWlsYWJsZSBhcyBvcHRpb25hbCBkb3dubG9hZHMuCiAgIDwvdGQ+CiA8L3RyPgogPHRyPgotICA8dGQ+YmluYXJpZXMvPC90ZD4KKyAgPHRkPjxzYW1wPmJpbmFyaWVzLzwvc2FtcD48L3RkPgogICA8dGQ+CiAgICAgVGhlIGJpbmFyaWVzIGRpcmVjdG9yeSBob2xkcyBzcGVjaWZpYyBBbnQgcmVsZWFzZXMgYnVuZGxlZCBpbiBib3RoIFpJUCBhbmQgdGFyLmd6IGFyY2hpdmUgZm9ybWF0cy4gVGhlIG5hbWVkCi0gICAgcmVsZWFzZXMgYXJlIGluIGNvbnRyYXN0IHRvIHRoZSBhbnQtY3VycmVudC1iaW4uemlwIGZpbGUgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksIHdoaWNoIGlzIGFsd2F5cyBndWFyYW50ZWVkIHRvIGJlCi0gICAgdGhlIG1vc3QgY3VycmVudCByZWxlYXNlIG9mIEFudC4KKyAgICByZWxlYXNlcyBhcmUgaW4gY29udHJhc3QgdG8gdGhlIDxzYW1wPmFudC1jdXJyZW50LWJpbi56aXA8L3NhbXA+IGZpbGUgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksIHdoaWNoIGlzIGFsd2F5cworICAgIGd1YXJhbnRlZWQgdG8gYmUgdGhlIG1vc3QgY3VycmVudCByZWxlYXNlIG9mIEFudC4KICAgPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD5jb21tb24vPC90ZD4KKyAgPHRkPjxzYW1wPmNvbW1vbi88L3NhbXA+PC90ZD4KICAgPHRkPgogICAgIFRoZSBjb21tb24gZGlyZWN0b3J5IGhvbGRzIHZhcmlvdXMgZmlsZXMsIHN1Y2ggYXMgdGhlIEFwYWNoZSBMaWNlbnNlIGZpbGUgdGhhdCBBbnQgaXMgbGljZW5zZWQgdW5kZXIsIHRoYXQgcGVvcGxlCiAgICAgbWF5IHdpc2ggdG8gZXhhbWluZSB3aXRob3V0IGhhdmluZyB0byBkb3dubG9hZCB0aGUgd2hvbGUgQW50IGRpc3RyaWJ1dGlvbi4KICAgPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD5zb3VyY2UvPC90ZD4KKyAgPHRkPjxzYW1wPnNvdXJjZS88L3NhbXA+PC90ZD4KICAgPHRkPgogICAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5IGhvbGRzIHRoZSBzb3VyY2UgY29kZSBmb3Igc3BlY2lmaWMgQW50IHJlbGVhc2VzIGJ1bmRsZWQgaW4gYm90aCBaSVAgYW5kIHRhci5neiBhcmNoaXZlCi0gICAgZm9ybWF0cy4gVGhlIG5hbWVkIHJlbGVhc2VzIGFyZSBpbiBjb250cmFzdCB0byB0aGUgYW50LWN1cnJlbnQtc3JjLnppcCBmaWxlIGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5LCB3aGljaCBpcyBhbHdheXMKLSAgICBndWFyYW50ZWVkIHRvIGhvbGQgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgbW9zdCBjdXJyZW50IHJlbGVhc2Ugb2YgQW50LgorICAgIGZvcm1hdHMuIFRoZSBuYW1lZCByZWxlYXNlcyBhcmUgaW4gY29udHJhc3QgdG8gdGhlIDxzYW1wPmFudC1jdXJyZW50LXNyYy56aXA8L3NhbXA+IGZpbGUgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnksCisgICAgd2hpY2ggaXMgYWx3YXlzIGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgc291cmNlIGNvZGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgcmVsZWFzZSBvZiBBbnQuCiAgIDwvdGQ+CiA8L3RyPgogPC90YWJsZT4KQEAgLTIyMSwyNiArMjI5LDI2IEBACiA8aDIgaWQ9InN5c3JlcXVpcmVtZW50cyI+U3lzdGVtIFJlcXVpcmVtZW50czwvaDI+CiA8cD4KIEFudCBoYXMgYmVlbiB1c2VkIHN1Y2Nlc3NmdWxseSBvbiBtYW55IHBsYXRmb3JtcywgaW5jbHVkaW5nIExpbnV4LCBjb21tZXJjaWFsIGZsYXZvdXJzIG9mIFVuaXggc3VjaCBhcyBTb2xhcmlzIGFuZAotSFAtVVgsIG1hY09TLCBXaW5kb3dzIE5UIGRlc2NlbmRhbnRzLCBPUy8yIFdhcnAsIE5vdmVsbCBOZXR3YXJlIDYsIE9wZW5WTVMuIFRoZSBwbGF0Zm9ybXMgdXNlZCBtb3N0IGZvciBkZXZlbG9wbWVudAotYXJlLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLCBMaW51eCwgbWFjT1MsIE1pY3Jvc29mdCBXaW5kb3dzIGFuZCBVbml4OyB0aGVzZSBhcmUgdGhlcmVmb3JlIHRoYXQgcGxhdGZvcm1zIHRoYXQgdGVuZCB0bwotd29yayBiZXN0LiBBcyBvZiBBbnQgMS43LCBXaW5kb3dzIDl4IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIUC1VWCwgbWFjT1MsIFdpbmRvd3MgTlQgZGVzY2VuZGFudHMsIE9TLzIgV2FycCwgTm92ZWxsIE5ldHdhcmUgNiwgT3BlblZNUy4gVGhlIHBsYXRmb3JtcyB1c2VkIG1vc3QgZm9yIGRldmVsb3BtZW50IGFyZSwKK2luIG5vIHBhcnRpY3VsYXIgb3JkZXIsIExpbnV4LCBtYWNPUywgTWljcm9zb2Z0IFdpbmRvd3MgYW5kIFVuaXg7IHRoZXNlIGFyZSB0aGVyZWZvcmUgdGhhdCBwbGF0Zm9ybXMgdGhhdCB0ZW5kIHRvIHdvcmsKK2Jlc3QuIDxlbT5TaW5jZSBBbnQgMS43PC9lbT4sIFdpbmRvd3MgOXggaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KIDwvcD4KIDxwPgotRm9yIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgQW50ICgxLjkpLCB5b3Ugd2lsbCBhbHNvIG5lZWQgYSBKREsgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLCB2ZXJzaW9uIDEuNSBvciBsYXRlciByZXF1aXJlZC4KK0ZvciB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIEFudCAoMS4xMCksIHlvdSB3aWxsIGFsc28gbmVlZCBhIEpESyBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0sIHZlcnNpb24gOCBvciBsYXRlciByZXF1aXJlZC4KIFRoZSBtb3JlIHVwLXRvLWRhdGUgdGhlIHZlcnNpb24gb2YgSmF2YSwgdGhlIG1vcmUgQW50IHRhc2tzIHlvdSBnZXQuCiA8L3A+CiA8cD4KLTxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gSWYgYSBKREsgaXMgbm90IHByZXNlbnQsIG9ubHkgdGhlIHJ1bnRpbWUgKEpSRSksIHRoZW4gbWFueSB0YXNrcyB3aWxsIG5vdCB3b3JrLgorPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJZiBhIEpESyBpcyBub3QgcHJlc2VudCwgb25seSB0aGUgcnVudGltZSAoSlJFKSwgdGhlbiBtYW55IHRhc2tzIHdpbGwgbm90IHdvcmsuCiA8L3A+CiA8cD4KLSAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPgotICAgIEFudCAxLjguKiB3b3JrcyB3aXRoIEpESyAxLjQgYW5kIGhpZ2hlciwgQW50IDEuNy4qIHdvcmtzIHdpdGggSkRLIDEuMyBhbmQgaGlnaGVyLAorICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46CisgICAgQW50IDEuOS4qIHdvcmtzIHdpdGggSkRLIDEuNSBhbmQgaGlnaGVyLCBBbnQgMS44Liogd29ya3Mgd2l0aCBKREsgMS40IGFuZCBoaWdoZXIsIEFudCAxLjcuKiB3b3JrcyB3aXRoIEpESyAxLjMgYW5kIGhpZ2hlciwKICAgICBBbnQgMS42Liogd29ya3Mgd2l0aCBKREsgMS4yIGFuZCBoaWdoZXIsIEFudCAxLjIgdG8gQW50IDEuNS4qIHdvcmsgd2l0aCBKREsgMS4xIGFuZCBoaWdoZXIuCiA8L3A+CiAKIDxoMz5PcGVuIFNvdXJjZSBKYXZhIFJ1bnRpbWVzPC9oMz4KIDxwPgotVGhlIEFudCB0ZWFtIHN0cm9uZ2x5IHN1cHBvcnRzIHVzZXJzIHJ1bm5pbmcgQW50IG9uIDxhIHRhcmdldD0iX2JsYW5rIiBocmVmPSJodHRwOi8vb3Blbmpkay5qYXZhLm5ldC8iPk9wZW5KREs8L2E+IGFuZAorVGhlIEFudCB0ZWFtIHN0cm9uZ2x5IHN1cHBvcnRzIHVzZXJzIHJ1bm5pbmcgQW50IG9uIDxhIGhyZWY9Imh0dHBzOi8vb3Blbmpkay5qYXZhLm5ldC8iIHRhcmdldD0iX3RvcCI+T3BlbkpESzwvYT4gYW5kCiBvdGhlciBvcGVuIHNvdXJjZSBKYXZhIHJ1bnRpbWVzLCBhbmQgc28gc3RyaXZlcyB0byBoYXZlIGEgcHJvZHVjdCB0aGF0IHdvcmtzIHdlbGwgb24gdGhvc2UgcGxhdGZvcm1zLgogPC9wPgogCkBAIC0yNjEsNTQgKzI2OSwzNyBAQAogICAgKy0tLSBldGMgLy8gY29udGFpbnMgeHNsIGdvb2RpZXMgdG86CiAgICAgICAgICAgICAvLyAgIC0gY3JlYXRlIGFuIGVuaGFuY2VkIHJlcG9ydCBmcm9tIHhtbCBvdXRwdXQgb2YgdmFyaW91cyB0YXNrcy4KICAgICAgICAgICAgIC8vICAgLSBtaWdyYXRlIHlvdXIgYnVpbGQgZmlsZXMgYW5kIGdldCByaWQgb2YgJ2RlcHJlY2F0ZWQnIHdhcm5pbmcKLSAgICAgICAgICAgIC8vICAgLSAuLi4gYW5kIG1vcmUgOy0pCi08L3ByZT4KKyAgICAgICAgICAgIC8vICAgLSAuLi4gYW5kIG1vcmUgOy0pPC9wcmU+CiA8cD4KLU9ubHkgdGhlIDxjb2RlPmJpbjwvY29kZT4gYW5kIDxjb2RlPmxpYjwvY29kZT4gZGlyZWN0b3JpZXMgYXJlIHJlcXVpcmVkIHRvIHJ1biBBbnQuCitPbmx5IHRoZSA8c2FtcD5iaW48L3NhbXA+IGFuZCA8c2FtcD5saWI8L3NhbXA+IGRpcmVjdG9yaWVzIGFyZSByZXF1aXJlZCB0byBydW4gQW50LgogPC9wPgogPHA+Ci1UbyBpbnN0YWxsIEFudCwgY2hvb3NlIGEgZGlyZWN0b3J5IGFuZCBjb3B5IHRoZSBkaXN0cmlidXRpb24gZmlsZXMgdGhlcmUuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUga25vd24gYXMKLTxjb2RlPkFOVF9IT01FPC9jb2RlPi4KK1RvIGluc3RhbGwgQW50LCBjaG9vc2UgYSBkaXJlY3RvcnkgYW5kIGNvcHkgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlcyB0aGVyZS4gVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBrbm93bgorYXMgPGNvZGU+QU5UX0hPTUU8L2NvZGU+LgogPC9wPgogCi08dGFibGUgd2lkdGg9IjgwJSI+Ci08dHI+Ci0gIDx0ZCBjb2xzcGFuPSIyIj4KLSAgICA8Yj5XaW5kb3dzIDk1LCBXaW5kb3dzIDk4ICZhbXA7IFdpbmRvd3MgTUUgTm90ZTo8L2I+Ci0gIDwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgd2lkdGg9IjUlIj4mbmJzcDs8L3RkPgotICA8dGQ+Ci0gICAgPGk+Tm90ZSB0aGF0IGN1cnJlbnQgcmVsZWFzZXMgb2YgQW50IG5vIGxvbmdlciBzdXBwb3J0IHRoZXNlIHN5c3RlbXMuIElmIHlvdSBhcmUgdXNpbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBBbnQsCis8aDM+V2luZG93cyA5NSwgV2luZG93cyA5OCAmYW1wOyBXaW5kb3dzIE1FIE5vdGU8L2gzPgorICA8cD4KKyAgICA8ZW0+Tm90ZSB0aGF0IGN1cnJlbnQgcmVsZWFzZXMgb2YgQW50IG5vIGxvbmdlciBzdXBwb3J0IHRoZXNlIHN5c3RlbXMuIElmIHlvdSBhcmUgdXNpbmcgYW4gb2xkZXIgdmVyc2lvbiBvZiBBbnQsCiAgICAgaG93ZXZlciwgdGhlIHNjcmlwdCB1c2VkIHRvIGxhdW5jaCBBbnQgd2lsbCBoYXZlIHByb2JsZW1zIGlmIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBpcyBhIGxvbmcgZmlsZW5hbWUgKGkuZS4gYQogICAgIGZpbGVuYW1lIHdoaWNoIGlzIG5vdCBvZiB0aGUgZm9ybWF0IGtub3duIGFzICZxdW90OzguMyZxdW90OykuIFRoaXMgaXMgZHVlIHRvIGxpbWl0YXRpb25zIGluIHRoZSBPUydzIGhhbmRsaW5nIG9mCi0gICAgdGhlIDxjb2RlPiZxdW90O2ZvciZxdW90OzwvY29kZT4gYmF0Y2ggZmlsZSBzdGF0ZW1lbnQuIEl0IGlzIHJlY29tbWVuZGVkLCB0aGVyZWZvcmUsIHRoYXQgQW50IGJlIGluc3RhbGxlZCBpbiBhCi0gICAgPGI+c2hvcnQ8L2I+LCA4LjMgcGF0aCwgc3VjaCBhcyA8Y29kZT5DOlxBbnQ8L2NvZGU+LjwvaT4KLSAgPC90ZD4KLTwvdHI+Ci08dHI+Ci0gIDx0ZCB3aWR0aD0iNSUiPiZuYnNwOzwvdGQ+Ci0gIDx0ZD4KLSAgICA8cD4KKyAgICB0aGUgPGNvZGU+JnF1b3Q7Zm9yJnF1b3Q7PC9jb2RlPiBiYXRjaCBmaWxlIHN0YXRlbWVudC4gSXQgaXMgcmVjb21tZW5kZWQsIHRoZXJlZm9yZSwgdGhhdCBBbnQgYmUgaW5zdGFsbGVkIGluCisgICAgYSA8c3Ryb25nPnNob3J0PC9zdHJvbmc+LCA4LjMgcGF0aCwgc3VjaCBhcyA8c2FtcD5DOlxBbnQ8L3NhbXA+LjwvZW0+CisgIDwvcD4KKyAgPHA+CiAgICAgT24gdGhlc2Ugc3lzdGVtcyB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gY29uZmlndXJlIG1vcmUgZW52aXJvbm1lbnQgc3BhY2UgdG8gY2F0ZXIgZm9yIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZAotICAgIGluIHRoZSBBbnQgbGF1bmNoIHNjcmlwdC4gVG8gZG8gdGhpcywgeW91IHdpbGwgbmVlZCB0byBhZGQgb3IgdXBkYXRlIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUKLSAgICA8Y29kZT5jb25maWcuc3lzPC9jb2RlPiBmaWxlCi0gICAgPC9wPgotICAgIDxwPgotICAgIDxjb2RlPnNoZWxsPWM6XGNvbW1hbmQuY29tIGM6XCAvcCAvZTozMjc2ODwvY29kZT4KLSAgICA8L3A+Ci0gIDwvdGQ+Ci08L3RyPgotPC90YWJsZT4KKyAgICBpbiB0aGUgQW50IGxhdW5jaCBzY3JpcHQuIFRvIGRvIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gYWRkIG9yIHVwZGF0ZSB0aGUgZm9sbG93aW5nIGxpbmUgaW4KKyAgICB0aGUgPHNhbXA+Y29uZmlnLnN5czwvc2FtcD4gZmlsZQorICA8L3A+CisgIDxwcmU+c2hlbGw9YzpcY29tbWFuZC5jb20gYzpcIC9wIC9lOjMyNzY4PC9wcmU+CiAKIDxoMyBpZD0ic2V0dXAiPlNldHVwPC9oMz4KIDxwPgotQmVmb3JlIHlvdSBjYW4gcnVuIEFudCB0aGVyZSBpcyBzb21lIGFkZGl0aW9uYWwgc2V0dXAgeW91IHdpbGwgbmVlZCB0byBkbyB1bmxlc3MgeW91IGFyZSBpbnN0YWxsaW5nIHRoZQotPGEgaHJlZj0iI2pwYWNrYWdlIj5SUE0gdmVyc2lvbiBmcm9tIGpwYWNrYWdlLm9yZzwvYT46CitCZWZvcmUgeW91IGNhbiBydW4gQW50IHRoZXJlIGlzIHNvbWUgYWRkaXRpb25hbCBzZXR1cCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHVubGVzcyB5b3UgYXJlIGluc3RhbGxpbmcKK3RoZSA8YSBocmVmPSIjanBhY2thZ2UiPlJQTSBWZXJzaW9uIGZyb20ganBhY2thZ2Uub3JnPC9hPjoKIDwvcD4KIDx1bD4KLTxsaT5BZGQgdGhlIDxjb2RlPmJpbjwvY29kZT4gZGlyZWN0b3J5IHRvIHlvdXIgcGF0aC48L2xpPgorPGxpPkFkZCB0aGUgPHNhbXA+YmluPC9zYW1wPiBkaXJlY3RvcnkgdG8geW91ciBwYXRoLjwvbGk+CiA8bGk+U2V0IHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3UgaW5zdGFsbGVkIEFudC4gT24gc29tZSBvcGVyYXRpbmcKIHN5c3RlbXMsIEFudCdzIHN0YXJ0dXAgc2NyaXB0cyBjYW4gZ3Vlc3MgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IChVbml4IGRpYWxlY3RzIGFuZCBXaW5kb3dzIE5UIGRlc2NlbmRhbnRzKSwgYnV0IGl0IGlzCiBiZXR0ZXIgdG8gbm90IHJlbHkgb24gdGhpcyBiZWhhdmlvci48L2xpPgpAQCAtMzE2LDQ3ICszMDcsMzkgQEAKIGJlbG93KS4gVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91ciBKREsgaXMgaW5zdGFsbGVkLjwvbGk+CiA8L3VsPgogPHA+Ci1PcGVyYXRpbmcgU3lzdGVtLXNwZWNpZmljIGluc3RydWN0aW9ucyBmb3IgZG9pbmcgdGhpcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXJlIGluIHRoZSA8YSBocmVmPSIjd2luZG93cyI+V2luZG93czwvYT4sCi08YSBocmVmPSIjYmFzaCI+TGludXgvVW5peCAoYmFzaCk8L2E+LCBhbmQgPGEgaHJlZj0iI3Rjc2hjc2giPkxpbnV4L1VuaXggKGNzaCk8L2E+IHNlY3Rpb25zLiBOb3RlIHRoYXQgdXNpbmcgdGhpcwotbWV0aG9kLCB0aGUgc2V0dGluZ3Mgd2lsbCBvbmx5IGJlIHZhbGlkIGZvciB0aGUgY29tbWFuZCBsaW5lIHNlc3Npb24geW91IHJ1biB0aGVtIGluLgorT3BlcmF0aW5nIFN5c3RlbS1zcGVjaWZpYyBpbnN0cnVjdGlvbnMgZm9yIGRvaW5nIHRoaXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFyZSBpbgordGhlIDxhIGhyZWY9IiN3aW5kb3dzIj5XaW5kb3dzPC9hPiwgPGEgaHJlZj0iI2Jhc2giPkxpbnV4L1VuaXggKGJhc2gpPC9hPiwgYW5kIDxhIGhyZWY9IiN0Y3NoY3NoIj5MaW51eC9Vbml4IChjc2gpPC9hPgorc2VjdGlvbnMuIE5vdGUgdGhhdCB1c2luZyB0aGlzIG1ldGhvZCwgdGhlIHNldHRpbmdzIHdpbGwgb25seSBiZSB2YWxpZCBmb3IgdGhlIGNvbW1hbmQgbGluZSBzZXNzaW9uIHlvdSBydW4gdGhlbSBpbi4KIDwvcD4KIDxwPgotPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBEbyBub3QgaW5zdGFsbCBBbnQncyA8Y29kZT5hbnQuamFyPC9jb2RlPiBmaWxlIGludG8gdGhlIDxjb2RlPmxpYi9leHQ8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUKKzxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogRG8gbm90IGluc3RhbGwgQW50J3MgPHNhbXA+YW50Lmphcjwvc2FtcD4gZmlsZSBpbnRvIHRoZSA8c2FtcD5saWIvZXh0PC9zYW1wPiBkaXJlY3Rvcnkgb2YgdGhlCiBKREsvSlJFLiBBbnQgaXMgYW4gYXBwbGljYXRpb24sIHdoaWxzdCB0aGUgZXh0ZW5zaW9uIGRpcmVjdG9yeSBpcyBpbnRlbmRlZCBmb3IgSkRLIGV4dGVuc2lvbnMuIEluIHBhcnRpY3VsYXIgdGhlcmUgYXJlCiBzZWN1cml0eSByZXN0cmljdGlvbnMgb24gdGhlIGNsYXNzZXMgd2hpY2ggbWF5IGJlIGxvYWRlZCBieSBhbiBleHRlbnNpb24uCiA8L3A+CiAKLTx0YWJsZSB3aWR0aD0iODAlIj4KLTx0cj4KLSAgPHRkIGNvbHNwYW49IjIiPgotICAgIDxiPldpbmRvd3MgTm90ZTo8L2I+Ci0gIDwvdGQ+Ci08L3RyPgotPHRyPgotICA8dGQgd2lkdGg9IjUlIj4mbmJzcDs8L3RkPgotICA8dGQ+Ci0gICAgVGhlIDxjb2RlPmFudC5iYXQ8L2NvZGU+IHNjcmlwdCBtYWtlcyB1c2Ugb2YgdGhyZWUgZW52aXJvbm1lbnQgdmFyaWFibGVzIC0gPGNvZGU+QU5UX0hPTUU8L2NvZGU+LAotICAgIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gYW5kIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4uIDxiPkVuc3VyZTwvYj4gdGhhdCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gYW5kCi0gICAgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiB2YXJpYWJsZXMgYXJlIHNldCwgYW5kIHRoYXQgdGhleSBkbyA8Yj48dT5ub3Q8L3U+PC9iPiBoYXZlIHF1b3RlcyAoZWl0aGVyICcgb3IgJnF1b3Q7KSBhbmQKLSAgICB0aGV5IGRvIDxiPjx1Pm5vdDwvdT48L2I+IGVuZCB3aXRoIFwgb3Igd2l0aCAvLiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IHNob3VsZCBiZSB1bnNldCBvciBlbXB0eS4KLSAgPC90ZD4KLTwvdHI+Ci08L3RhYmxlPgorPGgzPldpbmRvd3MgTm90ZTwvaDM+Cis8cD4KKyAgICBUaGUgPHNhbXA+YW50LmJhdDwvc2FtcD4gc2NyaXB0IG1ha2VzIHVzZSBvZiB0aHJlZSBlbnZpcm9ubWVudAorICAgIHZhcmlhYmxlcyZtZGFzaDs8Y29kZT5BTlRfSE9NRTwvY29kZT4sIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gYW5kIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4uIDxzdHJvbmc+RW5zdXJlPC9zdHJvbmc+CisgICAgdGhhdCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gYW5kIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gdmFyaWFibGVzIGFyZSBzZXQsIGFuZCB0aGF0IHRoZXkgZG8gPHN0cm9uZz5ub3Q8L3N0cm9uZz4gaGF2ZQorICAgIHF1b3RlcyAoZWl0aGVyICcgb3IgJnF1b3Q7KSBhbmQgdGhleSBkbyA8c3Ryb25nPm5vdDwvc3Ryb25nPiBlbmQgd2l0aCBcIG9yIHdpdGggLy4gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBzaG91bGQgYmUKKyAgICB1bnNldCBvciBlbXB0eS4KKzwvcD4KIAogPGgzIGlkPSJjaGVja0luc3RhbGxhdGlvbiI+Q2hlY2sgSW5zdGFsbGF0aW9uPC9oMz4KIDxwPgotWW91IGNhbiBjaGVjayB0aGUgYmFzaWMgaW5zdGFsbGF0aW9uIHdpdGggb3BlbmluZyBhIG5ldyBzaGVsbCBhbmQgdHlwaW5nIDxjb2RlPmFudDwvY29kZT4uIFlvdSBzaG91bGQgZ2V0IGEgbWVzc2FnZSBsaWtlCitZb3UgY2FuIGNoZWNrIHRoZSBiYXNpYyBpbnN0YWxsYXRpb24gd2l0aCBvcGVuaW5nIGEgbmV3IHNoZWxsIGFuZCB0eXBpbmcgPGtiZD5hbnQ8L2tiZD4uIFlvdSBzaG91bGQgZ2V0IGEgbWVzc2FnZSBsaWtlCiB0aGlzCiA8L3A+Ci08cHJlPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KIEJ1aWxkZmlsZTogYnVpbGQueG1sIGRvZXMgbm90IGV4aXN0IQogQnVpbGQgZmFpbGVkCiA8L3ByZT4KIDxwPgotU28gQW50IHdvcmtzLiBUaGlzIG1lc3NhZ2UgaXMgdGhlcmUgYmVjYXVzZSB5b3UgbmVlZCB0byB3cml0ZSBhIGJ1aWxkZmlsZSBmb3IgeW91ciBwcm9qZWN0LiBXaXRoIGEgPGNvZGU+YW50Ci0tdmVyc2lvbjwvY29kZT4geW91IHNob3VsZCBnZXQgYW4gb3V0cHV0IGxpa2UKK1NvIEFudCB3b3Jrcy4gVGhpcyBtZXNzYWdlIGlzIHRoZXJlIGJlY2F1c2UgeW91IG5lZWQgdG8gd3JpdGUgYSBidWlsZGZpbGUgZm9yIHlvdXIgcHJvamVjdC4gV2l0aCBhIDxrYmQ+YW50CistdmVyc2lvbjwva2JkPiB5b3Ugc2hvdWxkIGdldCBhbiBvdXRwdXQgbGlrZQogPC9wPgotPHByZT4KKzxwcmUgY2xhc3M9Im91dHB1dCI+CiBBcGFjaGUgQW50KFRNKSB2ZXJzaW9uIDEuOS4yIGNvbXBpbGVkIG9uIEp1bHkgOCAyMDEzCiA8L3ByZT4KIDxwPgpAQCAtMzY4LDExICszNTEsMTEgQEAKICAgPGxpPnJlcXVpcmVkOiA8Y29kZT4lUEFUSCU9Li4uPGk+bWF5YmUtb3RoZXItZW50cmllczwvaT4uLi47JUFOVF9IT01FJVxiaW47Li4uPGk+bWF5YmUtb3RoZXItZW50cmllczwvaT4uLi48L2NvZGU+PC9saT4KIDwvdWw+CiA8cD4KLTxiPkFOVF9IT01FPC9iPiBpcyB1c2VkIGJ5IHRoZSBsYXVuY2hlciBzY3JpcHQgZm9yIGZpbmRpbmcgdGhlIGxpYnJhcmllcy4KLTxiPkpBVkFfSE9NRTwvYj4gaXMgdXNlZCBieSB0aGUgbGF1bmNoZXIgZm9yIGZpbmRpbmcgdGhlIEpESy9KUkUgdG8gdXNlLiAoSkRLIGlzIHJlY29tbWVuZGVkIGFzIHNvbWUgdGFza3MgcmVxdWlyZSB0aGUKLUphdmEgdG9vbHMuKSBJZiBub3Qgc2V0LCB0aGUgbGF1bmNoZXIgdHJpZXMgdG8gZmluZCBvbmUgdmlhIHRoZSA8Y29kZT4lUEFUSCU8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLgotPGI+UEFUSDwvYj4gaXMgc2V0IGZvciB1c2VyIGNvbnZlbmllbmNlLiBXaXRoIHRoYXQgc2V0IHlvdSBjYW4ganVzdCBzdGFydCA8aT5hbnQ8L2k+IGluc3RlYWQgb2YgYWx3YXlzIHR5cGluZwotPGk+dGhlL2NvbXBsZXRlL3BhdGgvdG8veW91ci9hbnQvaW5zdGFsbGF0aW9uL2Jpbi9hbnQ8L2k+LgorPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGlzIHVzZWQgYnkgdGhlIGxhdW5jaGVyIHNjcmlwdCBmb3IgZmluZGluZyB0aGUgbGlicmFyaWVzLiA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGlzIHVzZWQgYnkgdGhlCitsYXVuY2hlciBmb3IgZmluZGluZyB0aGUgSkRLL0pSRSB0byB1c2UuIChKREsgaXMgcmVjb21tZW5kZWQgYXMgc29tZSB0YXNrcyByZXF1aXJlIHRoZSBKYXZhIHRvb2xzLikgSWYgbm90IHNldCwgdGhlCitsYXVuY2hlciB0cmllcyB0byBmaW5kIG9uZSB2aWEgdGhlIDxjb2RlPiVQQVRIJTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuIDxjb2RlPlBBVEg8L2NvZGU+IGlzIHNldCBmb3IgdXNlcgorY29udmVuaWVuY2UuIFdpdGggdGhhdCBzZXQgeW91IGNhbiBqdXN0IHN0YXJ0IDxrYmQ+YW50PC9rYmQ+IGluc3RlYWQgb2YgYWx3YXlzCit0eXBpbmcgPHNhbXA+dGhlL2NvbXBsZXRlL3BhdGgvdG8veW91ci9hbnQvaW5zdGFsbGF0aW9uL2Jpbi9hbnQ8L3NhbXA+LgogPC9wPgogCiA8aDMgaWQ9Im9wdGlvbmFsVGFza3MiPk9wdGlvbmFsIFRhc2tzPC9oMz4KQEAgLTM5NCwyOCArMzc3LDI4IEBACiAKIDxsaT4KIDxwPgotSW4gPGNvZGU+JHt1c2VyLmhvbWV9Ly5hbnQvbGliPC9jb2RlPiAoYXMgb2YgQW50IDEuNikuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCB1c2VycyB0byBhZGQgbmV3IGxpYnJhcmllcyB0byBBbnQuIEFsbCBKQVIKLWZpbGVzIGFkZGVkIHRvIHRoaXMgZGlyZWN0b3J5IGFyZSBhdmFpbGFibGUgdG8gY29tbWFuZC1saW5lIEFudC4KK0luIDxjb2RlPiR7dXNlci5ob21lfS8uYW50L2xpYjwvY29kZT4gKDxlbT5zaW5jZSBBbnQgMS42PC9lbT4pLiBUaGlzIGFsbG93cyBkaWZmZXJlbnQgdXNlcnMgdG8gYWRkIG5ldyBsaWJyYXJpZXMgdG8KK0FudC4gQWxsIEpBUiBmaWxlcyBhZGRlZCB0byB0aGlzIGRpcmVjdG9yeSBhcmUgYXZhaWxhYmxlIHRvIGNvbW1hbmQtbGluZSBBbnQuCiA8L3A+CiA8L2xpPgogCiA8bGk+CiA8cD4KLU9uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCBhIDxjb2RlPi1saWI8L2NvZGU+IHBhcmFtZXRlci4gVGhpcyBsZXRzIHlvdSBhZGQgbmV3IEpBUiBmaWxlcyBvbiBhIGNhc2UtYnktY2FzZSBiYXNpcy4KK09uIHRoZSBjb21tYW5kIGxpbmUgd2l0aCBhIDxrYmQ+LWxpYjwva2JkPiBwYXJhbWV0ZXIuIFRoaXMgbGV0cyB5b3UgYWRkIG5ldyBKQVIgZmlsZXMgb24gYSBjYXNlLWJ5LWNhc2UgYmFzaXMuCiA8L3A+CiA8L2xpPgogCiA8bGk+CiA8cD4KLUluIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlLiBBdm9pZCB0aGlzOyBpdCBtYWtlcyB0aGUgSkFSIGZpbGVzIHZpc2libGUgdG8gPGk+YWxsPC9pPiBKYXZhCitJbiB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gQXZvaWQgdGhpczsgaXQgbWFrZXMgdGhlIEpBUiBmaWxlcyB2aXNpYmxlIHRvIDxlbT5hbGw8L2VtPiBKYXZhCiBhcHBsaWNhdGlvbnMsIGFuZCBjYXVzZXMgbm8gZW5kIG9mIHN1cHBvcnQgY2FsbHMuIFNlZSA8YSBocmVmPSIjY2xhc3NwYXRoIj5iZWxvdzwvYT4gZm9yIGRldGFpbHMuCiA8L3A+CiA8L2xpPgogCiA8bGk+CiA8cD4KLUluIHNvbWUgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGFjY2VwdGVkIGJ5IHRoZSB0YXNrIGl0c2VsZi4gRm9yIGV4YW1wbGUsIGFzIG9mIEFudCAxLjcuMCB5b3UgY2FuIHJ1bgotdGhlIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sgd2l0aG91dCA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGluIEFudCdzIG93biBjbGFzc3BhdGgsIHNvIGxvbmcgYXMgaXQgaXMgaW5jbHVkZWQKK0luIHNvbWUgPGNvZGU+Jmx0O2NsYXNzcGF0aCZndDs8L2NvZGU+IGFjY2VwdGVkIGJ5IHRoZSB0YXNrIGl0c2VsZi4gPGVtPlNpbmNlIEFudCAxLjcuMDwvZW0+LCB5b3UgY2FuIHJ1bgordGhlIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sgd2l0aG91dCA8c2FtcD5qdW5pdC5qYXI8L3NhbXA+IGluIEFudCdzIG93biBjbGFzc3BhdGgsIHNvIGxvbmcgYXMgaXQgaXMgaW5jbHVkZWQKIChhbG9uZyB3aXRoIHlvdXIgcHJvZ3JhbSBhbmQgdGVzdHMpIGluIHRoZSBjbGFzc3BhdGggcGFzc2VkIHdoZW4gcnVubmluZyB0aGUgdGFzay4KIDwvcD4KIDxwPgpAQCAtNDI5LDcgKzQxMiw3IEBACiA8cD4KIElmIHlvdSBhcmUgdXNpbmcgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50LCBvciBpZiB5b3UgYXJlIHdvcmtpbmcgZnJvbSBzb3VyY2UgY29kZSwgeW91IGNhbiBlYXNpbHkgZ2F0aGVyIG1vc3Qgb2YKIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGluc3RhbGwgdGhlbSBmb3IgdXNlIHdpdGggeW91ciBBbnQgdGFza3MuIEluIHlvdXIgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGRpcmVjdG9yeSB5b3Ugc2hvdWxkIHNlZSBhCi1maWxlIGNhbGxlZCA8Y29kZT5mZXRjaC54bWw8L2NvZGU+LiBUaGlzIGlzIGFuIEFudCBzY3JpcHQgdGhhdCB5b3UgY2FuIHJ1biB0byBpbnN0YWxsIGFsbW9zdCBhbGwgdGhlIGRlcGVuZGVuY2llcyB0aGF0CitmaWxlIGNhbGxlZCA8c2FtcD5mZXRjaC54bWw8L3NhbXA+LiBUaGlzIGlzIGFuIEFudCBzY3JpcHQgdGhhdCB5b3UgY2FuIHJ1biB0byBpbnN0YWxsIGFsbW9zdCBhbGwgdGhlIGRlcGVuZGVuY2llcyB0aGF0CiB0aGUgb3B0aW9uYWwgQW50IHRhc2tzIG5lZWQuCiA8L3A+CiAKQEAgLTQzNywxNyArNDIwLDE1IEBACiBUbyBkbyBzbywgY2hhbmdlIHRvIHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZGlyZWN0b3J5IGFuZCBleGVjdXRlIHRoZSBjb21tYW5kOgogPC9wPgogCi08YmxvY2txdW90ZT4KLSAgPHByZT5hbnQgLWYgZmV0Y2gueG1sIC1EZGVzdD08aT5bb3B0aW9uXTwvaT48L3ByZT4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWYgZmV0Y2gueG1sIC1EZGVzdD08ZW0+W29wdGlvbl08L2VtPjwvcHJlPgogCiA8cD4KIHdoZXJlIG9wdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZywgYXMgZGVzY3JpYmVkIGFib3ZlOgogPC9wPgogPHVsPgotPGxpPjxjb2RlPnN5c3RlbTwvY29kZT4gLSBzdG9yZSBpbiBBbnQncyBsaWIgZGlyZWN0b3J5IDxpPihSZWNvbW1lbmRlZCk8L2k+PC9saT4KLTxsaT48Y29kZT51c2VyPC9jb2RlPiAtIHN0b3JlIGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk8L2xpPgotPGxpPjxjb2RlPm9wdGlvbmFsPC9jb2RlPiAtIHN0b3JlIGluIEFudCdzIHNvdXJjZSBjb2RlIDxjb2RlPmxpYi9vcHRpb25hbDwvY29kZT4gZGlyZWN0b3J5LCB1c2VkIHdoZW4gYnVpbGRpbmcgQW50Cis8bGk+PGNvZGU+c3lzdGVtPC9jb2RlPiZtZGFzaDtzdG9yZSBpbiBBbnQncyBsaWIgZGlyZWN0b3J5ICg8ZW0+UmVjb21tZW5kZWQ8L2VtPik8L2xpPgorPGxpPjxjb2RlPnVzZXI8L2NvZGU+Jm1kYXNoO3N0b3JlIGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnk8L2xpPgorPGxpPjxjb2RlPm9wdGlvbmFsPC9jb2RlPiZtZGFzaDtzdG9yZSBpbiBBbnQncyBzb3VyY2UgY29kZSA8c2FtcD5saWIvb3B0aW9uYWw8L3NhbXA+IGRpcmVjdG9yeSwgdXNlZCB3aGVuIGJ1aWxkaW5nIEFudAogc291cmNlIGNvZGU8L2xpPgogPC91bD4KIApAQCAtNDU2LDE4ICs0MzcsMTggQEAKIDwvcD4KIAogPHA+Ci1Ob3RlIHRoYXQgbm90IGFsbCBkZXBlbmRlbmNpZXMgYXJlIGdhdGhlcmVkIHVzaW5nIDxjb2RlPmZldGNoLnhtbDwvY29kZT4uIFRhc2tzIHRoYXQgZGVwZW5kIG9uIGNvbW1lcmNpYWwgc29mdHdhcmUsIGluCitOb3RlIHRoYXQgbm90IGFsbCBkZXBlbmRlbmNpZXMgYXJlIGdhdGhlcmVkIHVzaW5nIDxzYW1wPmZldGNoLnhtbDwvc2FtcD4uIFRhc2tzIHRoYXQgZGVwZW5kIG9uIGNvbW1lcmNpYWwgc29mdHdhcmUsIGluCiBwYXJ0aWN1bGFyLCB3aWxsIHJlcXVpcmUgeW91IHRvIGhhdmUgdGhlIGNvbW1lcmNpYWwgc29mdHdhcmUgaW5zdGFsbGVkIGluIG9yZGVyIHRvIGJlIHVzZWQuCiA8L3A+CiAKIDxwPgogVGhlIEFwYWNoZSBBbnQgUHJvamVjdCBhbHNvIHByb3ZpZGVzIGFkZGl0aW9uYWwgdGFza3MgYW5kIHR5cGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBhcyBzZXBhcmF0ZWx5IGRvd25sb2FkZWQgQW50Ci1MaWJyYXJpZXMuIFlvdSBjYW4gc2VlIHRoZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgQW50bGlicyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvcHJvcGVyLmh0bWwiCitMaWJyYXJpZXMuIFlvdSBjYW4gc2VlIHRoZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgQW50bGlicyBhdCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL3Byb3Blci5odG1sIgogdGFyZ2V0PSJfdG9wIj5BbnQgTGlicmFyaWVzPC9hPiBwYWdlLgogPC9wPgogCiA8cD4KLVlvdSBjYW4gYWxzbyBmaW5kIHRhc2tzIGFuZCB0eXBlcyBwcm92aWRlZCBieSB0aGlyZC1wYXJ0eSBwcm9qZWN0cyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2V4dGVybmFsLmh0bWwiCitZb3UgY2FuIGFsc28gZmluZCB0YXNrcyBhbmQgdHlwZXMgcHJvdmlkZWQgYnkgdGhpcmQtcGFydHkgcHJvamVjdHMgYXQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZXh0ZXJuYWwuaHRtbCIKIHRhcmdldD0iX3RvcCI+RXh0ZXJuYWwgVG9vbHMgYW5kIFRhc2tzPC9hPiBwYWdlLgogPC9wPgogCkBAIC00NzYsNyArNDU3LDcgQEAKIGNvbmZpZ3VyYXRpb24gZGlhbG9nLiBTb21ldGltZXMgSkFSIGZpbGVzIGFkZGVkIHRvIGEgcHJvamVjdCBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBBbnQncyBjbGFzc3BhdGguCiA8L3A+CiAKLTxoMyBpZD0iY2xhc3NwYXRoIj5UaGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZTwvaDM+Cis8aDMgaWQ9ImNsYXNzcGF0aCI+VGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gRW52aXJvbm1lbnQgVmFyaWFibGU8L2gzPgogPHA+CiBUaGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBhIHNvdXJjZSBvZiBtYW55IEFudCBzdXBwb3J0IHF1ZXJpZXMuIEFzIHRoZSByb3VuZCB0cmlwIHRpbWUgZm9yCiBkaWFnbm9zaXMgb24gdGhlIEFudCB1c2VyIG1haWxpbmcgbGlzdCBjYW4gYmUgc2xvdywgYW5kIGJlY2F1c2UgZmlsaW5nIGJ1ZyByZXBvcnRzIGNvbXBsYWluaW5nIGFib3V0ICdhbnQuYmF0JyBub3QKQEAgLTQ5MywxNCArNDc0LDE0IEBACiBBbnQncyBhYmlsaXR5IHRvIHF1b3RlIHRoZSBzdHJpbmcuIEFnYWluLCB0aGlzIGlzIG5vdCBuZWVkZWQgZm9yIHRoZSBjb3JyZWN0IG9wZXJhdGlvbiBvZiB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPgogZW52aXJvbm1lbnQgdmFyaWFibGUsIGV2ZW4gaWYgYSBET1MgZGlyZWN0b3J5IGlzIHRvIGJlIGFkZGVkIHRvIHRoZSBwYXRoLjwvbGk+CiAKLTxsaT5Zb3UgY2FuIHN0b3AgQW50IHVzaW5nIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5IHNldHRpbmcgdGhlIDxjb2RlPi1ub2NsYXNzcGF0aDwvY29kZT4KKzxsaT5Zb3UgY2FuIHN0b3AgQW50IHVzaW5nIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGJ5IHNldHRpbmcgdGhlIDxrYmQ+LW5vY2xhc3NwYXRoPC9rYmQ+CiBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBhbiBlYXN5IHdheSB0byB0ZXN0IGZvciBjbGFzc3BhdGgtcmVsYXRlZCBwcm9ibGVtcy48L2xpPgogPC9vbD4KIAogPHA+Ci1UaGUgdXN1YWwgc3ltcHRvbSBvZiA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IHByb2JsZW1zIGlzIHRoYXQgYW50IHdpbGwgbm90IHJ1biB3aXRoIHNvbWUgZXJyb3IgYWJvdXQgbm90IGJlaW5nIGFibGUgdG8KLWZpbmQgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyPC9jb2RlPiwgb3IsIGlmIHlvdSBoYXZlIGdvdCB0aGUgcXVvdGVzL2JhY2tzbGFzaGVzIHdyb25nLCBzb21lIHZlcnkKLXdlaXJkIEphdmEgc3RhcnR1cCBlcnJvci4gVG8gc2VlIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHJ1biA8Y29kZT5hbnQgLW5vY2xhc3NwYXRoPC9jb2RlPiBvciB1bnNldAorVGhlIHVzdWFsIHN5bXB0b20gb2YgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBwcm9ibGVtcyBpcyB0aGF0IEFudCB3aWxsIG5vdCBydW4gd2l0aCBzb21lIGVycm9yIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvCitmaW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXI8L2NvZGU+LCBvciwgaWYgeW91IGhhdmUgZ290IHRoZSBxdW90ZXMvYmFja3NsYXNoZXMgd3JvbmcsCitzb21lIHZlcnkgd2VpcmQgSmF2YSBzdGFydHVwIGVycm9yLiBUbyBzZWUgaWYgdGhpcyBpcyB0aGUgY2FzZSwgcnVuIDxrYmQ+YW50IC1ub2NsYXNzcGF0aDwva2JkPiBvciB1bnNldAogdGhlIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuCiA8L3A+CiAKQEAgLTUyOSwxNiArNTEwLDE2IEBACiA8L3A+CiAKIDx1bD4KLTxsaT48Yj5XaXRoIEphdmEgNSBvciBhYm92ZTwvYj48YnIvPgorPGxpPjxzdHJvbmc+V2l0aCBKYXZhIDUgb3IgYWJvdmU8L3N0cm9uZz48YnIvPgogPHA+CiBXaGVuIHlvdSBydW4gQW50IG9uIEphdmEgNSBvciBhYm92ZSwgeW91IGNvdWxkIHRyeSB0byB1c2UgdGhlIGF1dG9tYXRpYyBwcm94eSBzZXR1cCBtZWNoYW5pc20KLXdpdGggPGNvZGU+LWF1dG9wcm94eTwvY29kZT4uCit3aXRoIDxrYmQ+LWF1dG9wcm94eTwva2JkPi4KIDwvcD4KIDwvbGk+CiAKLTxsaT48Yj5XaXRoIGV4cGxpY2l0IEpWTSBwcm9wZXJ0aWVzLjwvYj48YnIvPgorPGxpPjxzdHJvbmc+V2l0aCBleHBsaWNpdCBKVk0gcHJvcGVydGllcy48L3N0cm9uZz48YnIvPgogPHA+Ci1UaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9uZXQvcHJvcGVydGllcy5odG1sIgorVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL25ldC9wcm9wZXJ0aWVzLmh0bWwiCiB0YXJnZXQ9Il90b3AiPkphdmEncyBOZXR3b3JraW5nIFByb3BlcnRpZXM8L2E+LCBhbmQgY29udHJvbCB0aGUgcHJveHkgYmVoYXZpb3VyIG9mIHRoZSBlbnRpcmUgSlZNLiBUbyBzZXQgdGhlbSBpbiBBbnQsCiBkZWNsYXJlIHRoZW0gaW4gdGhlIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVGhpcyBpcyB0aGUgYmVzdCBvcHRpb24gZm9yIGEgbm9uLW1vYmlsZSBzeXN0ZW0uIEZvciBhCiBsYXB0b3AsIHlvdSBoYXZlIHRvIGNoYW5nZSB0aGVzZSBzZXR0aW5ncyBhcyB5b3Ugcm9hbS4gVG8gc2V0IDxjb2RlPkFOVF9PUFRTPC9jb2RlPjoKQEAgLTU0NywyOSArNTI4LDIzIEBACiA8cD4KIEZvciBjc2gvdGNzaDoKIDwvcD4KLTxwcmU+Ci0gICAgc2V0ZW52IEFOVF9PUFRTICItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCIKLTwvcHJlPgorPHByZSBjbGFzcz0iaW5wdXQiPnNldGVudiBBTlRfT1BUUyAiLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODAiPC9wcmU+CiA8cD4KIEZvciBiYXNoOgogPC9wPgotPHByZT4KLSAgICBleHBvcnQgQU5UX09QVFM9Ii1EaHR0cC5wcm94eUhvc3Q9cHJveHkgLURodHRwLnByb3h5UG9ydD04MDgwIgotPC9wcmU+Cis8cHJlIGNsYXNzPSJpbnB1dCI+ZXhwb3J0IEFOVF9PUFRTPSItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCI8L3ByZT4KIDxwPgogRm9yIFdpbmRvd3MsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgaW4gdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyBib3ggYW5kIG9wZW4gYSBuZXcgY29uc29sZSBvciwgYnkgaGFuZAogPC9wPgotPHByZT4KLSAgICBzZXQgQU5UX09QVFMgPSAtRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MAotPC9wcmU+Cis8cHJlIGNsYXNzPSJpbnB1dCI+c2V0IEFOVF9PUFRTID0gLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgwODA8L3ByZT4KIDwvYmxvY2txdW90ZT4KIDwvbGk+CiAKLTxsaT48Yj5JbiB0aGUgYnVpbGQgZmlsZSBpdHNlbGY8L2I+PGJyLz4KKzxsaT48c3Ryb25nPkluIHRoZSBidWlsZCBmaWxlIGl0c2VsZjwvc3Ryb25nPjxici8+CiA8cD4KIElmIHlvdSBhcmUgd3JpdGluZyBhIGJ1aWxkIGZpbGUgdGhhdCBpcyBhbHdheXMgdG8gYmUgdXNlZCBiZWhpbmQgdGhlIGZpcmV3YWxsLAogdGhlIDxhIGhyZWY9IlRhc2tzL3NldHByb3h5Lmh0bWwiPnNldHByb3h5PC9hPiB0YXNrIGxldHMgeW91IGNvbmZpZ3VyZSB0aGUgcHJveHkgKHdoaWNoIGl0IGRvZXMgYnkgc2V0dGluZyB0aGUgSlZNCi1wcm9wZXJ0aWVzKS4gSWYgeW91IGRvIHRoaXMsIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB1c2luZyBhbnQgcHJvcGVydGllcyB0byBkZWZpbmUgdGhlIHByb3h5IGhvc3QsIHBvcnQsIGV0Yywgc28gdGhhdAorcHJvcGVydGllcykuIElmIHlvdSBkbyB0aGlzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdXNpbmcgQW50IHByb3BlcnRpZXMgdG8gZGVmaW5lIHRoZSBwcm94eSBob3N0LCBwb3J0LCBldGMsIHNvIHRoYXQKIGluZGl2aWR1YWxzIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCiA8L3A+CiA8L2xpPgpAQCAtNTc4LDExICs1NTMsMTEgQEAKIDxwPgogVGhlIEFudCB0ZWFtIGFja25vd2xlZGdlcyB0aGF0IHRoaXMgaXMgdW5zYXRpc2ZhY3RvcnkuIFVudGlsIHRoZSBKVk0gYXV0b21hdGljIHByb3h5IHNldHVwIHdvcmtzIHByb3Blcmx5IGV2ZXJ5d2hlcmUsCiBleHBsaWNpdCBKVk0gb3B0aW9ucyB2aWEgPGNvZGU+QU5UX0FSR1M8L2NvZGU+IGFyZSBwcm9iYWJseSB0aGUgYmVzdCBzb2x1dGlvbi4gU2V0dGluZyBwcm9wZXJ0aWVzIG9uIEFudCdzIGNvbW1hbmQgbGluZQotZG8gbm90IHdvcmssIGJlY2F1c2UgdGhvc2UgYXJlIDxpPkFudCBwcm9wZXJ0aWVzPC9pPiBiZWluZyBzZXQsIG5vdCBKVk0gb3B0aW9ucy4gVGhpcyBtZWFucyB0aGUgZm9sbG93aW5nIGRvZXMgbm90IHNldAorZG8gbm90IHdvcmssIGJlY2F1c2UgdGhvc2UgYXJlIDxlbT5BbnQgcHJvcGVydGllczwvZW0+IGJlaW5nIHNldCwgbm90IEpWTSBvcHRpb25zLiBUaGlzIG1lYW5zIHRoZSBmb2xsb3dpbmcgZG9lcyBub3Qgc2V0CiB1cCB0aGUgY29tbWFuZCBsaW5lOgogPC9wPgogCi08cHJlPmFudCAtRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODE8L3ByZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLURodHRwLnByb3h5SG9zdD1wcm94eSAtRGh0dHAucHJveHlQb3J0PTgxPC9wcmU+CiAKIDxwPgogQWxsIGl0IGRvZXMgaXMgc2V0IHVwIHR3byBBbnQgcHJvcGVydGllcy4KQEAgLTU5NSwyMSArNTcwLDIxIEBACiA8L3A+CiAKIDxoMyBpZD0id2luZG93cyI+V2luZG93cyBhbmQgT1MvMjwvaDM+Ci08cD5Bc3N1bWUgQW50IGlzIGluc3RhbGxlZCBpbiA8Y29kZT5jOlxhbnRcPC9jb2RlPi4gVGhlIGZvbGxvd2luZyBzZXRzIHVwIHRoZQorPHA+QXNzdW1lIEFudCBpcyBpbnN0YWxsZWQgaW4gPHNhbXA+YzpcYW50XDwvc2FtcD4uIFRoZSBmb2xsb3dpbmcgc2V0cyB1cCB0aGUKIGVudmlyb25tZW50OjwvcD4KLTxwcmU+c2V0IEFOVF9IT01FPWM6XGFudAorPHByZSBjbGFzcz0iaW5wdXQiPnNldCBBTlRfSE9NRT1jOlxhbnQKIHNldCBKQVZBX0hPTUU9YzpcamRrMS43LjBfNTEKIHNldCBQQVRIPSVQQVRIJTslQU5UX0hPTUUlXGJpbjwvcHJlPgogCiA8aDMgaWQ9ImJhc2giPkxpbnV4L1VuaXggKGJhc2gpPC9oMz4KLTxwPkFzc3VtZSBBbnQgaXMgaW5zdGFsbGVkIGluIDxjb2RlPi91c3IvbG9jYWwvYW50PC9jb2RlPi4gVGhlIGZvbGxvd2luZyBzZXRzIHVwCis8cD5Bc3N1bWUgQW50IGlzIGluc3RhbGxlZCBpbiA8c2FtcD4vdXNyL2xvY2FsL2FudDwvc2FtcD4uIFRoZSBmb2xsb3dpbmcgc2V0cyB1cAogdGhlIGVudmlyb25tZW50OjwvcD4KLTxwcmU+ZXhwb3J0IEFOVF9IT01FPS91c3IvbG9jYWwvYW50Cis8cHJlIGNsYXNzPSJpbnB1dCI+ZXhwb3J0IEFOVF9IT01FPS91c3IvbG9jYWwvYW50CiBleHBvcnQgSkFWQV9IT01FPS91c3IvbG9jYWwvamRrMS43LjBfNTEKIGV4cG9ydCBQQVRIPSR7UEFUSH06JHtBTlRfSE9NRX0vYmluPC9wcmU+CiAKIDxoMyBpZD0idGNzaGNzaCI+TGludXgvVW5peCAoY3NoKTwvaDM+Ci08cHJlPnNldGVudiBBTlRfSE9NRSAvdXNyL2xvY2FsL2FudAorPHByZSBjbGFzcz0iaW5wdXQiPnNldGVudiBBTlRfSE9NRSAvdXNyL2xvY2FsL2FudAogc2V0ZW52IEpBVkFfSE9NRSAvdXNyL2xvY2FsL2pkay9qZGsxLjcuMF81MQogc2V0IHBhdGg9KCAkcGF0aCAkQU5UX0hPTUUvYmluICk8L3ByZT4KIApAQCAtNjE5LDE4ICs1OTQsMTggQEAKIDxoMyBpZD0ianBhY2thZ2UiPlJQTSB2ZXJzaW9uIGZyb20ganBhY2thZ2Uub3JnPC9oMz4KIDxwPgogVGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuanBhY2thZ2Uub3JnIiB0YXJnZXQ9Il90b3AiPkpQYWNrYWdlIHByb2plY3Q8L2E+IGRpc3RyaWJ1dGVzIGFuIFJQTSB2ZXJzaW9uIG9mIEFudC4gV2l0aCB0aGlzCi12ZXJzaW9uLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNldCA8Y29kZT4gSkFWQV9IT01FPC9jb2RlPiBvciA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCB0aGUgUlBNCi1pbnN0YWxsZXIgd2lsbCBjb3JyZWN0bHkgcGxhY2UgdGhlIEFudCBleGVjdXRhYmxlIG9uIHlvdXIgcGF0aC4KK3ZlcnNpb24sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gb3IgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgdGhlIFJQTQoraW5zdGFsbGVyIHdpbGwgY29ycmVjdGx5IHBsYWNlIHRoZSA8a2JkPmFudDwva2JkPiBleGVjdXRhYmxlIG9uIHlvdXIgcGF0aC4KIDwvcD4KIDxwPgotPGI+Tk9URTo8L2I+IDxpPlNpbmNlIEFudCAxLjcuMDwvaT4sIGlmIHRoZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LCB0aGUgSlBhY2thZ2UKKzxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogPGVtPlNpbmNlIEFudCAxLjcuMDwvZW0+LCBpZiB0aGUgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCwgdGhlIEpQYWNrYWdlCiBkaXN0cmlidXRpb24gd2lsbCBiZSBpZ25vcmVkLgogPC9wPgogPHA+CiBPcHRpb25hbCBKQVJzIGZvciB0aGUgSlBhY2thZ2UgdmVyc2lvbiBhcmUgaGFuZGxlZCBpbiB0d28gd2F5cy4gVGhlIGVhc2llc3QsIGFuZCBiZXN0IHdheSBpcyB0byBnZXQgdGhlc2UgZXh0ZXJuYWwKIGxpYnJhcmllcyBmcm9tIEpQYWNrYWdlIGlmIEpQYWNrYWdlIGhhcyB0aGVtIGF2YWlsYWJsZS4gKE5vdGU6IGZvciBlYWNoIHN1Y2ggbGlicmFyeSwgeW91IHdpbGwgaGF2ZSB0byBnZXQgYm90aCB0aGUKLWV4dGVybmFsIHBhY2thZ2UgaXRzZWxmIChlLmcuIDxjb2RlPm9yby0yLjAuOC0yanBwLm5vYXJjaC5ycG08L2NvZGU+KSBhbmQgdGhlIHNtYWxsIGxpYnJhcnkgdGhhdCBsaW5rcyBBbnQgYW5kIHRoZQotZXh0ZXJuYWwgcGFja2FnZSAoZS5nLiA8Y29kZT5hbnQtYXBhY2hlLW9yby0xLjYuMi0zanBwLm5vYXJjaC5ycG08L2NvZGU+KS4KK2V4dGVybmFsIHBhY2thZ2UgaXRzZWxmIChlLmcuIDxzYW1wPm9yby0yLjAuOC0yanBwLm5vYXJjaC5ycG08L3NhbXA+KSBhbmQgdGhlIHNtYWxsIGxpYnJhcnkgdGhhdCBsaW5rcyBBbnQgYW5kIHRoZQorZXh0ZXJuYWwgcGFja2FnZSAoZS5nLiA8c2FtcD5hbnQtYXBhY2hlLW9yby0xLjYuMi0zanBwLm5vYXJjaC5ycG08L3NhbXA+KS4KIDwvcD4KIDxwPgogSG93ZXZlciwgSlBhY2thZ2UgZG9lcyBub3QgcGFja2FnZSBwcm9wcmlldGFyeSBzb2Z0d2FyZSwgYW5kIHNpbmNlIHNvbWUgb2YgdGhlIG9wdGlvbmFsIHBhY2thZ2VzIGRlcGVuZCBvbiBwcm9wcmlldGFyeQpAQCAtNjQwLDMyICs2MTUsMzIgQEAKIAogPG9sPgogPGxpPkRlY2lkZSB3aGVyZSB5b3Ugd2FudCB0byBkZXBsb3kgdGhlIGV4dHJhIEpBUnMuIE9uZSBvcHRpb24gaXMgaW4gPGNvZGU+JEFOVF9IT01FL2xpYjwvY29kZT4sIHdoaWNoLCBmb3IgSlBhY2thZ2UgaXMKLXVzdWFsbHkgPGNvZGU+L3Vzci9zaGFyZS9hbnQvbGliPC9jb2RlPi4gQW5vdGhlciwgbGVzcyBtZXNzeSBvcHRpb24gaXMgdG8gY3JlYXRlIGFuIDxjb2RlPi5hbnQvbGliPC9jb2RlPiBzdWJkaXJlY3RvcnkKK3VzdWFsbHkgPHNhbXA+L3Vzci9zaGFyZS9hbnQvbGliPC9zYW1wPi4gQW5vdGhlciwgbGVzcyBtZXNzeSBvcHRpb24gaXMgdG8gY3JlYXRlIGFuIDxzYW1wPi5hbnQvbGliPC9zYW1wPiBzdWJkaXJlY3RvcnkKIG9mIHlvdXIgaG9tZSBkaXJlY3RvcnkgYW5kIHBsYWNlIHlvdXIgbm9uLUpQYWNrYWdlIEFudCBKQVJzIHRoZXJlLCB0aGVyZWJ5IGF2b2lkaW5nIG1peGluZyBKUGFja2FnZSBsaWJyYXJpZXMgd2l0aAogbm9uLUpQYWNrYWdlIHN0dWZmIGluIHRoZSBzYW1lIGZvbGRlci4gTW9yZSBpbmZvcm1hdGlvbiBvbiB3aGVyZSBBbnQgZmluZHMgaXRzIGxpYnJhcmllcyBpcwotYXZhaWxhYmxlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvcnVubmluZy5odG1sI2xpYnMiPmhlcmU8L2E+PC9saT4KLTxsaT5Eb3dubG9hZCBhIG5vbi1KUGFja2FnZSBiaW5hcnkgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHJlZ3VsYXIgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSIKK2F2YWlsYWJsZSA8YSBocmVmPSJydW5uaW5nLmh0bWwjbGlicyI+aGVyZTwvYT48L2xpPgorPGxpPkRvd25sb2FkIGEgbm9uLUpQYWNrYWdlIGJpbmFyeSBkaXN0cmlidXRpb24gZnJvbSB0aGUgcmVndWxhciA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2JpbmRvd25sb2FkLmNnaSIKIHRhcmdldD0iX3RvcCI+QXBhY2hlIEFudCBzaXRlPC9hPjwvbGk+CiA8bGk+VW56aXAgb3IgdW50YXIgdGhlIGRpc3RyaWJ1dGlvbiBpbnRvIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeTwvbGk+Ci08bGk+Q29weSB0aGUgbGlua2luZyBKQVIsIGluIHRoaXMgY2FzZSA8Y29kZT5hbnQtamFpLmphcjwvY29kZT4sIGludG8gdGhlIGxpYnJhcnkgZGlyZWN0b3J5IHlvdSBjaG9zZSBpbiBzdGVwIDEKKzxsaT5Db3B5IHRoZSBsaW5raW5nIEpBUiwgaW4gdGhpcyBjYXNlIDxzYW1wPmFudC1qYWkuamFyPC9zYW1wPiwgaW50byB0aGUgbGlicmFyeSBkaXJlY3RvcnkgeW91IGNob3NlIGluIHN0ZXAgMQogYWJvdmUuPC9saT4KIDxsaT5Db3B5IHRoZSBwcm9wcmlldGFyeSBKQVIgaXRzZWxmIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5LjwvbGk+CiA8L29sPgogCiBGaW5hbGx5LCBpZiBmb3Igc29tZSByZWFzb24geW91IGFyZSBydW5uaW5nIG9uIGEgc3lzdGVtIHdpdGggYm90aCB0aGUgSlBhY2thZ2UgYW5kIEFwYWNoZSB2ZXJzaW9ucyBvZiBBbnQgYXZhaWxhYmxlLCBpZgogeW91IHNob3VsZCB3YW50IHRvIHJ1biB0aGUgQXBhY2hlIHZlcnNpb24gKHdoaWNoIHdpbGwgaGF2ZSB0byBiZSBzcGVjaWZpZWQgd2l0aCBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUsIG5vdCBmb3VuZCBvbiB0aGUKLXBhdGgpLCB5b3Ugc2hvdWxkIHVzZSBBbnQncyA8Y29kZT4tLW5vY29uZmlnPC9jb2RlPiBjb21tYW5kLWxpbmUgc3dpdGNoIHRvIGF2b2lkIEpQYWNrYWdlJ3MgY2xhc3NwYXRoIG1lY2hhbmlzbS4KK3BhdGgpLCB5b3Ugc2hvdWxkIHVzZSBBbnQncyA8a2JkPi0tbm9jb25maWc8L2tiZD4gY29tbWFuZC1saW5lIHN3aXRjaCB0byBhdm9pZCBKUGFja2FnZSdzIGNsYXNzcGF0aCBtZWNoYW5pc20uCiAKIDxoMyBpZD0iYWR2YW5jZWQiPkFkdmFuY2VkPC9oMz4KIAogPHA+VGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHdheXMgdG8gcnVuIEFudC4gV2hhdCB5b3UgbmVlZCBpcyBhdCBsZWFzdCB0aGUgZm9sbG93aW5nOjwvcD4KIAogPHVsPgotPGxpPlRoZSBjbGFzc3BhdGggZm9yIEFudCBtdXN0IGNvbnRhaW4gPGNvZGU+YW50LmphcjwvY29kZT4gYW5kIGFueSBKQVJzL2NsYXNzZXMgbmVlZGVkIGZvciB5b3VyIGNob3NlbiBKQVhQLWNvbXBsaWFudAorPGxpPlRoZSBjbGFzc3BhdGggZm9yIEFudCBtdXN0IGNvbnRhaW4gPHNhbXA+YW50Lmphcjwvc2FtcD4gYW5kIGFueSBKQVJzL2NsYXNzZXMgbmVlZGVkIGZvciB5b3VyIGNob3NlbiBKQVhQLWNvbXBsaWFudAogWE1MIHBhcnNlci48L2xpPgogPGxpPldoZW4geW91IG5lZWQgSkRLIGZ1bmN0aW9uYWxpdHkgKHN1Y2ggYXMgZm9yIHRoZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gdGFzayBvcgotdGhlIDxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+cm1pYzwvYT4gdGFzayksIHRoZW4gPGNvZGU+dG9vbHMuamFyPC9jb2RlPiBtdXN0IGJlIGFkZGVkLiBUaGUgc2NyaXB0cyBzdXBwbGllZCB3aXRoIEFudCwKLWluIHRoZSA8Y29kZT5iaW48L2NvZGU+IGRpcmVjdG9yeSwgd2lsbCBhZGQgdGhlIHJlcXVpcmVkIEpESyBjbGFzc2VzIGF1dG9tYXRpY2FsbHksIGlmIHRoZSA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+Cit0aGUgPGEgaHJlZj0iVGFza3Mvcm1pYy5odG1sIj5ybWljPC9hPiB0YXNrKSwgdGhlbiA8c2FtcD50b29scy5qYXI8L3NhbXA+IG11c3QgYmUgYWRkZWQuIFRoZSBzY3JpcHRzIHN1cHBsaWVkIHdpdGggQW50LAoraW4gdGhlIDxzYW1wPmJpbjwvc2FtcD4gZGlyZWN0b3J5LCB3aWxsIGFkZCB0aGUgcmVxdWlyZWQgSkRLIGNsYXNzZXMgYXV0b21hdGljYWxseSwgaWYgdGhlIDxjb2RlPkpBVkFfSE9NRTwvY29kZT4KIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldC48L2xpPgogPGxpPldoZW4geW91IGFyZSBleGVjdXRpbmcgcGxhdGZvcm0tc3BlY2lmaWMgYXBwbGljYXRpb25zLCBzdWNoIGFzIHRoZSA8YSBocmVmPSJUYXNrcy9leGVjLmh0bWwiPmV4ZWM8L2E+IHRhc2sgb3IKIHRoZSA8YSBocmVmPSJUYXNrcy9jdnMuaHRtbCI+Y3ZzPC9hPiB0YXNrLCB0aGUgcHJvcGVydHkgPGNvZGU+YW50LmhvbWU8L2NvZGU+IG11c3QgYmUgc2V0IHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZwpAQCAtNjkzLDEzICs2NjgsMTMgQEAKIDwvcD4KIAogPHA+Ci08Yj5Ob3RlPC9iPjogVGhlIGJvb3RzdHJhcCBwcm9jZXNzIG9mIEFudCByZXF1aXJlcyBhIGdyZWVkeSBjb21waWxlciBsaWtlIE9wZW5KREsgb3IgT3JhY2xlJ3MgamF2YWMuIEl0IGRvZXMgbm90IHdvcmsKLXdpdGggZ2NqIG9yIGtqYy4KKzxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhlIGJvb3RzdHJhcCBwcm9jZXNzIG9mIEFudCByZXF1aXJlcyBhIGdyZWVkeSBjb21waWxlciBsaWtlIE9wZW5KREsgb3IKK09yYWNsZSdzIDxrYmQ+amF2YWM8L2tiZD4uIEl0IGRvZXMgbm90IHdvcmsgd2l0aCA8a2JkPmdjajwva2JkPiBvciA8a2JkPmtqYzwva2JkPi4KIDwvcD4KIAogPHA+CiBNYWtlIHN1cmUgeW91IGhhdmUgZG93bmxvYWRlZCBhbnkgYXV4aWxpYXJ5IEpBUnMgcmVxdWlyZWQgdG8gYnVpbGQgdGFza3MgeW91IGFyZSBpbnRlcmVzdGVkIGluLiBUaGVzZSBzaG91bGQgYmUgYWRkZWQgdG8KLXRoZSA8Y29kZT5saWIvb3B0aW9uYWw8L2NvZGU+IGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIHRyZWUuIFNlZSA8YSBocmVmPSIjbGlicmFyeWRlcGVuZGVuY2llcyI+TGlicmFyeSBEZXBlbmRlbmNpZXM8L2E+Cit0aGUgPHNhbXA+bGliL29wdGlvbmFsPC9zYW1wPiBkaXJlY3Rvcnkgb2YgdGhlIHNvdXJjZSB0cmVlLiBTZWUgPGEgaHJlZj0iI2xpYnJhcnlkZXBlbmRlbmNpZXMiPkxpYnJhcnkgRGVwZW5kZW5jaWVzPC9hPgogZm9yIGEgbGlzdCBvZiBKQVIgcmVxdWlyZW1lbnRzIGZvciB2YXJpb3VzIGZlYXR1cmVzLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG1ha2UgdGhlIGF1eGlsaWFyeSBKQVIgYXZhaWxhYmxlIGZvciB0aGUKIGJ1aWxkaW5nIG9mIEFudCBvbmx5LiBGb3IgcnVubmluZyBBbnQgeW91IHdpbGwgc3RpbGwgbmVlZCB0byBtYWtlIHRoZSBKQVJzIGF2YWlsYWJsZSBhcyBkZXNjcmliZWQKIHVuZGVyIDxhIGhyZWY9IiNpbnN0YWxsaW5nIj5JbnN0YWxsaW5nIEFudDwvYT4uCkBAIC03MDcsMjIgKzY4MiwyMiBAQAogCiA8cD4KIFlvdSBjYW4gYWxzbyBnZXQgbW9zdCBvZiB0aGUgYXV4aWxpYXJ5IEpBUiBmaWxlcyAoaS5lLiB0aGUgSkFSIGZpbGVzIHRoYXQgdmFyaW91cyBvcHRpb25hbCBBbnQgdGFza3MgZGVwZW5kIG9uKSBieQotcnVubmluZyBBbnQgb24gdGhlIDxjb2RlPmZldGNoLnhtbDwvY29kZT4gYnVpbGQgZmlsZS4gU2VlIDxhIGhyZWY9IiNvcHRpb25hbFRhc2tzIj5PcHRpb25hbCBUYXNrczwvYT4gZm9yIGluc3RydWN0aW9ucworcnVubmluZyBBbnQgb24gdGhlIDxzYW1wPmZldGNoLnhtbDwvc2FtcD4gYnVpbGQgZmlsZS4gU2VlIDxhIGhyZWY9IiNvcHRpb25hbFRhc2tzIj5PcHRpb25hbCBUYXNrczwvYT4gZm9yIGluc3RydWN0aW9ucwogb24gaG93IHRvIGRvIHRoaXMuCiA8L3A+CiAKIDxwPgotQXMgb2YgdmVyc2lvbiAxLjcuMCBBbnQgaGFzIGEgaGFyZCBkZXBlbmRlbmN5IG9uIEpVbml0LiBUaGUgPGNvZGU+ZmV0Y2gueG1sPC9jb2RlPiBidWlsZCBzY3JpcHQgd2lsbCBkb3dubG9hZCBKVW5pdAotYXV0b21hdGljYWxseSwgYnV0IGlmIHlvdSBkb24ndCB1c2UgdGhpcyB5b3UgbXVzdCBpbnN0YWxsIGl0IG1hbnVhbGx5IGludG8gPGNvZGU+bGliL29wdGlvbmFsPC9jb2RlPiAoZG93bmxvYWQgaXQKLWZyb20gPGEgaHJlZj0iaHR0cDovL2p1bml0Lm9yZy8iIHRhcmdldD0iX3RvcCI+SlVuaXQub3JnPC9hPikgaWYgeW91IGFyZSB1c2luZyBhIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgQW50LgorPGVtPlNpbmNlIEFudCAxLjcuMDwvZW0+LCBBbnQgaGFzIGEgaGFyZCBkZXBlbmRlbmN5IG9uIEpVbml0LiBUaGUgPHNhbXA+ZmV0Y2gueG1sPC9zYW1wPiBidWlsZCBzY3JpcHQgd2lsbCBkb3dubG9hZAorSlVuaXQgYXV0b21hdGljYWxseSwgYnV0IGlmIHlvdSBkb24ndCB1c2UgdGhpcyB5b3UgbXVzdCBpbnN0YWxsIGl0IG1hbnVhbGx5IGludG8gPHNhbXA+bGliL29wdGlvbmFsPC9zYW1wPiAoZG93bmxvYWQgaXQKK2Zyb20gPGEgaHJlZj0iaHR0cHM6Ly9qdW5pdC5vcmcvIiB0YXJnZXQ9Il90b3AiPkpVbml0Lm9yZzwvYT4pIGlmIHlvdSBhcmUgdXNpbmcgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mIEFudC4KIDwvcD4KIAogPHA+CiBZb3VyIGFyZSBub3cgcmVhZHkgdG8gYnVpbGQgQW50OgogPC9wPgogPGJsb2NrcXVvdGU+Ci0gIDxwPjxjb2RlPmJ1aWxkIC1EZGlzdC5kaXI9Jmx0OzxpPmRpcmVjdG9yeV90b19jb250YWluX0FudF9kaXN0cmlidXRpb248L2k+Jmd0OyBkaXN0PC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5XaW5kb3dzPC9pPik8L3A+Ci0gIDxwPjxjb2RlPnNoIGJ1aWxkLnNoIC1EZGlzdC5kaXI9Jmx0OzxpPmRpcmVjdG9yeV90b19jb250YWluX0FudF9kaXN0cmlidXRpb248L2k+Jmd0OyBkaXN0PC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5Vbml4PC9pPik8L3A+CisgIDxwPjxrYmQ+YnVpbGQgLURkaXN0LmRpcj0mbHQ7PGk+ZGlyZWN0b3J5LXRvLWNvbnRhaW4tQW50LWRpc3RyaWJ1dGlvbjwvaT4mZ3Q7IGRpc3Q8L2tiZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGVtPldpbmRvd3M8L2VtPik8L3A+CisgIDxwPjxrYmQ+c2ggYnVpbGQuc2ggLURkaXN0LmRpcj0mbHQ7PGk+ZGlyZWN0b3J5LXRvLWNvbnRhaW4tQW50LWRpc3RyaWJ1dGlvbjwvaT4mZ3Q7IGRpc3Q8L2tiZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGVtPlVuaXg8L2VtPik8L3A+CiA8L2Jsb2NrcXVvdGU+CiAKIDxwPgpAQCAtNzM2LDQ5ICs3MTEsNDkgQEAKIDxsaT5JZiBuZWNlc3NhcnkgaXQgd2lsbCBib290c3RyYXAgdGhlIEFudCBjb2RlLiBCb290c3RyYXBwaW5nIGludm9sdmVzIHRoZSBtYW51YWwgY29tcGlsYXRpb24gb2YgZW5vdWdoIEFudCBjb2RlIHRvIGJlCiBhYmxlIHRvIHJ1biBBbnQuIFRoZSBib290c3RyYXBwZWQgQW50IGlzIHVzZWQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIGJ1aWxkIHN0ZXBzLjwvbGk+CiA8bGk+SW52b2tlcyB0aGUgYm9vdHN0cmFwcGVkIEFudCB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgYnVpbGQgc2NyaXB0LiBJbiB0aGlzIGNhc2UsIHRoZXNlIHBhcmFtZXRlcnMgZGVmaW5lCi1hbiBBbnQgcHJvcGVydHkgdmFsdWUgYW5kIHNwZWNpZnkgdGhlICZxdW90O2Rpc3QmcXVvdDsgdGFyZ2V0IGluIEFudCdzIG93biA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUuPC9saT4KLTxsaT5DcmVhdGUgdGhlIDxjb2RlPmFudC5qYXI8L2NvZGU+IGFuZCA8Y29kZT5hbnQtbGF1bmNoZXIuamFyPC9jb2RlPiBKQVIgZmlsZXM8L2xpPgorYW4gQW50IHByb3BlcnR5IHZhbHVlIGFuZCBzcGVjaWZ5IHRoZSA8cT5kaXN0PC9xPiB0YXJnZXQgaW4gQW50J3Mgb3duIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gZmlsZS48L2xpPgorPGxpPkNyZWF0ZSB0aGUgPHNhbXA+YW50Lmphcjwvc2FtcD4gYW5kIDxzYW1wPmFudC1sYXVuY2hlci5qYXI8L3NhbXA+IEpBUiBmaWxlczwvbGk+CiA8bGk+Q3JlYXRlIG9wdGlvbmFsIEpBUnMgZm9yIHdoaWNoIHRoZSBidWlsZCBoYWQgdGhlIHJlbGV2YW50IGxpYnJhcmllcy4gSWYgYSBwYXJ0aWN1bGFyIGxpYnJhcnkgaXMgbWlzc2luZwotZnJvbSA8Y29kZT5saWIvb3B0aW9uYWw8L2NvZGU+LCB0aGVuIHRoZSBtYXRjaGluZyBhbnQtbGlicmFyeSBKQVIgZmlsZSB3aWxsIG5vdCBiZSBjcmVhdGVkLiBGb3IKLWV4YW1wbGUsIDxjb2RlPmFudC1qdW5pdC5qYXI8L2NvZGU+IGlzIG9ubHkgYnVpbHQgaWYgdGhlcmUgaXMgYSA8Y29kZT5qdW5pdC5qYXI8L2NvZGU+IGluIHRoZSA8Y29kZT5saWIvb3B0aW9uYWw8L2NvZGU+Citmcm9tIDxzYW1wPmxpYi9vcHRpb25hbDwvc2FtcD4sIHRoZW4gdGhlIG1hdGNoaW5nIGFudC1saWJyYXJ5IEpBUiBmaWxlIHdpbGwgbm90IGJlIGNyZWF0ZWQuIEZvcgorZXhhbXBsZSwgPHNhbXA+YW50LWp1bml0Lmphcjwvc2FtcD4gaXMgb25seSBidWlsdCBpZiB0aGVyZSBpcyBhIDxzYW1wPmp1bml0Lmphcjwvc2FtcD4gaW4gdGhlIDxzYW1wPmxpYi9vcHRpb25hbDwvc2FtcD4KIGRpcmVjdG9yeS48L2xpPgogPC91bD4KIAogPHA+CiBPbiBtb3N0IG9jY2FzaW9ucyB5b3Ugd2lsbCBub3QgbmVlZCB0byBleHBsaWNpdGx5IGJvb3RzdHJhcCBBbnQgc2luY2UgdGhlIGJ1aWxkIHNjcmlwdHMgZG8gdGhhdCBmb3IgeW91LiBIb3dldmVyLCBpZiB0aGUKIGJ1aWxkIGZpbGUgeW91IGFyZSB1c2luZyBtYWtlcyB1c2Ugb2YgZmVhdHVyZXMgbm90IHlldCBjb21waWxlZCBpbnRvIHRoZSBib290c3RyYXBwZWQgQW50LCB5b3Ugd2lsbCBuZWVkIHRvIG1hbnVhbGx5Ci1ib290c3RyYXAuIFJ1biA8Y29kZT5ib290c3RyYXAuYmF0PC9jb2RlPiAoV2luZG93cykgb3IgPGNvZGU+Ym9vdHN0cmFwLnNoPC9jb2RlPiAoVU5JWCkgdG8gYnVpbGQgYSBuZXcgYm9vdHN0cmFwIHZlcnNpb24KK2Jvb3RzdHJhcC4gUnVuIDxrYmQ+Ym9vdHN0cmFwLmJhdDwva2JkPiAoV2luZG93cykgb3IgPGtiZD5ib290c3RyYXAuc2g8L2tiZD4gKFVOSVgpIHRvIGJ1aWxkIGEgbmV3IGJvb3RzdHJhcCB2ZXJzaW9uCiBvZiBBbnQuCiA8L3A+CiAKIElmIHlvdSB3aXNoIHRvIGluc3RhbGwgdGhlIGJ1aWxkIGludG8gdGhlIGN1cnJlbnQgPGNvZGU+QU5UX0hPTUU8L2NvZGU+CiBkaXJlY3RvcnksIHlvdSBjYW4gdXNlOgogPGJsb2NrcXVvdGU+Ci0gIDxwPjxjb2RlPmJ1aWxkIGluc3RhbGw8L2NvZGU+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KDxpPldpbmRvd3M8L2k+KTwvcD4KLSAgPHA+PGNvZGU+c2ggYnVpbGQuc2ggaW5zdGFsbDwvY29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGk+VW5peDwvaT4pPC9wPgorICA8cD48a2JkPmJ1aWxkIGluc3RhbGw8L2tiZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGVtPldpbmRvd3M8L2VtPik8L3A+CisgIDxwPjxrYmQ+c2ggYnVpbGQuc2ggaW5zdGFsbDwva2JkPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8ZW0+VW5peDwvZW0+KTwvcD4KIDwvYmxvY2txdW90ZT4KIAogWW91IGNhbiBhdm9pZCB0aGUgbGVuZ3RoeSBKYXZhZG9jIHN0ZXAsIGlmIGRlc2lyZWQsIHdpdGg6CiA8YmxvY2txdW90ZT4KLSAgPHA+PGNvZGU+YnVpbGQgaW5zdGFsbC1saXRlPC9jb2RlPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8aT5XaW5kb3dzPC9pPik8L3A+Ci0gIDxwPjxjb2RlPnNoIGJ1aWxkLnNoIGluc3RhbGwtbGl0ZTwvY29kZT4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGk+VW5peDwvaT4pPC9wPgorICA8cD48a2JkPmJ1aWxkIGluc3RhbGwtbGl0ZTwva2JkPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyg8ZW0+V2luZG93czwvZW0+KTwvcD4KKyAgPHA+PGtiZD5zaCBidWlsZC5zaCBpbnN0YWxsLWxpdGU8L2tiZD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsoPGVtPlVuaXg8L2VtPik8L3A+CiA8L2Jsb2NrcXVvdGU+Ci1UaGlzIHdpbGwgb25seSBpbnN0YWxsIHRoZSA8Y29kZT5iaW48L2NvZGU+IGFuZCA8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yaWVzLgorVGhpcyB3aWxsIG9ubHkgaW5zdGFsbCB0aGUgPHNhbXA+YmluPC9zYW1wPiBhbmQgPHNhbXA+bGliPC9zYW1wPiBkaXJlY3Rvcmllcy4KIAogPHA+Ci1Cb3RoIHRoZSA8Y29kZT5pbnN0YWxsPC9jb2RlPiBhbmQgPGNvZGU+aW5zdGFsbC1saXRlPC9jb2RlPiB0YXJnZXRzIHdpbGwgb3ZlcndyaXRlIHRoZSBjdXJyZW50IEFudCB2ZXJzaW9uCitCb3RoIHRoZSA8dmFyPmluc3RhbGw8L3Zhcj4gYW5kIDx2YXI+aW5zdGFsbC1saXRlPC92YXI+IHRhcmdldHMgd2lsbCBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgQW50IHZlcnNpb24KIGluIDxjb2RlPkFOVF9IT01FPC9jb2RlPi4KIDwvcD4KIAogPHA+Ci1BbnQncyBidWlsZCBzY3JpcHQgd2lsbCB0cnkgdG8gc2V0IGV4ZWN1dGFibGUgZmxhZ3MgZm9yIGl0cyBzaGVsbCBzY3JpcHRzIG9uIFVuaXgtbGlrZSBzeXN0ZW1zLiBUaGVyZSBhcmUgdmFyaW91cworQW50J3MgYnVpbGQgc2NyaXB0IHdpbGwgdHJ5IHRvIHNldCBleGVjdXRhYmxlIGZsYWdzIGZvciBpdHMgc2hlbGwgc2NyaXB0cyBvbiBVbml4KC1saWtlKSBzeXN0ZW1zLiBUaGVyZSBhcmUgdmFyaW91cwogcmVhc29ucyB3aHkgdGhlIDxhIGhyZWY9IlRhc2tzL2NobW9kLmh0bWwiPmNobW9kPC9hPiB0YXNrIG1pZ2h0IGZhaWwgKGxpa2Ugd2hlbiB5b3UgYXJlIHJ1bm5pbmcgdGhlIGJ1aWxkIHNjcmlwdCBhcyBhCiBkaWZmZXJlbnQgdXNlciB0aGFuIHRoZSBvbmUgd2hvIGluc3RhbGxlZCBBbnQgaW5pdGlhbGx5KS4gSW4gdGhpcyBjYXNlIHlvdSBjYW4gc2V0IHRoZSBBbnQKIHByb3BlcnR5IDxjb2RlPmNobW9kLmZhaWw8L2NvZGU+IHRvIGZhbHNlIHdoZW4gc3RhcnRpbmcgdGhlIGJ1aWxkIGxpa2UgaW4KIDwvcD4KLTxibG9ja3F1b3RlPgotICA8cD48Y29kZT5zaCBidWlsZC5zaCBpbnN0YWxsIC1EY2htb2QuZmFpbD1mYWxzZTwvY29kZT48L3A+Ci08L2Jsb2NrcXVvdGU+CisKKzxwcmUgY2xhc3M9ImlucHV0Ij5zaCBidWlsZC5zaCBpbnN0YWxsIC1EY2htb2QuZmFpbD1mYWxzZTwvcHJlPgorCiA8cD4KIGFuZCBhbnkgZXJyb3IgdG8gY2hhbmdlIHBlcm1pc3Npb24gd2lsbCBub3QgcmVzdWx0IGluIGEgYnVpbGQgZmFpbHVyZS4KIDwvcD4KQEAgLTc5MCwzMyArNzY1LDM0IEBACiBUaGUgZm9sbG93aW5nIGxpYnJhcmllcyBhcmUgbmVlZGVkIGluIEFudCdzIGNsYXNzcGF0aCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBpbmRpY2F0ZWQgZmVhdHVyZS4gTm90ZSB0aGF0IG9ubHkgb25lIG9mIHRoZQogcmVnZXhwIGxpYnJhcmllcyBpcyBuZWVkZWQgZm9yIHVzZSB3aXRoIHRoZSBtYXBwZXJzIChhbmQgSmF2YSBpbmNsdWRlcyBhIHJlZ2V4cCBpbXBsZW1lbnRhdGlvbiB3aGljaCBBbnQgd2lsbCBmaW5kCiBhdXRvbWF0aWNhbGx5KS4gWW91IHdpbGwgYWxzbyBuZWVkIHRvIGluc3RhbGwgdGhlIHBhcnRpY3VsYXIgQW50IG9wdGlvbmFsIEpBUiBjb250YWluaW5nIHRoZSB0YXNrIGRlZmluaXRpb25zIHRvIG1ha2UKLXRoZXNlIHRhc2tzIGF2YWlsYWJsZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSA8YSBocmVmPSIjb3B0aW9uYWxUYXNrcyI+IEluc3RhbGxpbmcgQW50IC8gT3B0aW9uYWwgVGFza3M8L2E+IHNlY3Rpb24gYWJvdmUuCit0aGVzZSB0YXNrcyBhdmFpbGFibGUuIFBsZWFzZSByZWZlciB0byB0aGUgPGEgaHJlZj0iI29wdGlvbmFsVGFza3MiPkluc3RhbGxpbmcgQW50IC8gT3B0aW9uYWwgVGFza3M8L2E+IHNlY3Rpb24gYWJvdmUuCiA8L3A+CiAKLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQ+PGI+SkFSIE5hbWU8L2I+PC90ZD4KLSAgICA8dGQ+PGI+TmVlZGVkIEZvcjwvYj48L3RkPgotICAgIDx0ZD48Yj5BdmFpbGFibGUgQXQ8L2I+PC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+SkFSIE5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5OZWVkZWQgRm9yPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+QXZhaWxhYmxlIEF0PC90aD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5qYWthcnRhLXJlZ2V4cC0xLjQuamFyPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iVHlwZXMvbWFwcGVyLmh0bWwjcmVnZXhwLW1hcHBlciI+cmVnZXhwPC9hPiB0eXBlIHdpdGggbWFwcGVycyAoaWYgeW91IGRvIG5vdCB3aXNoIHRvIHVzZQotICAgIGphdmEudXRpbC5yZWdleCk8L3RkPgorICAgICAgamF2YS51dGlsLnJlZ2V4KTwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vYXR0aWMuYXBhY2hlLm9yZy9wcm9qZWN0cy9qYWthcnRhLXJlZ2V4cC5odG1sIgotICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9hdHRpYy5hcGFjaGUub3JnL3Byb2plY3RzL2pha2FydGEtcmVnZXhwLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL2F0dGljLmFwYWNoZS5vcmcvcHJvamVjdHMvamFrYXJ0YS1yZWdleHAuaHRtbDwvYT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmpha2FydGEtb3JvLTIuMC44LmphcjwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9IlR5cGVzL21hcHBlci5odG1sI3JlZ2V4cC1tYXBwZXIiPnJlZ2V4cDwvYT4gdHlwZSB3aXRoIG1hcHBlcnMgKGlmIHlvdSBkbyBub3Qgd2lzaCB0byB1c2UKLSAgICBqYXZhLnV0aWwucmVnZXgpIG9yIDxhIGhyZWY9IlRhc2tzL2Z0cC5odG1sIj5mdHA8L2E+IHRhc2sgd2l0aCA8YSBocmVmPSIjY29tbW9ucy1uZXQiPmNvbW1vbnMtbmV0PC9hPiAxLjQuMTwvdGQ+CisgICAgICBqYXZhLnV0aWwucmVnZXgpIG9yIDxhIGhyZWY9IlRhc2tzL2Z0cC5odG1sIj5mdHA8L2E+IHRhc2sgd2l0aCA8YSBocmVmPSIjY29tbW9ucy1uZXQiPmNvbW1vbnMtbmV0PC9hPiAxLjQuMTwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vYXR0aWMuYXBhY2hlLm9yZy9wcm9qZWN0cy9qYWthcnRhLW9yby5odG1sIgotICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9hdHRpYy5hcGFjaGUub3JnL3Byb2plY3RzL2pha2FydGEtb3JvLmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL2F0dGljLmFwYWNoZS5vcmcvcHJvamVjdHMvamFrYXJ0YS1vcm8uaHRtbDwvYT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmp1bml0LmphcjwvdGQ+Ci0gICAgPHRkPjxhIGhyZWY9IlRhc2tzL2p1bml0Lmh0bWwiPmp1bml0PC9hPiB0YXNrIChtYXkgYmUgaW4gY2xhc3NwYXRoIHBhc3NlZCB0byB0YXNrIHJhdGhlciB0aGFuIEFudCdzIGNsYXNzcGF0aCk8L3RkPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vanVuaXQub3JnLyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vanVuaXQub3JnLzwvYT48L3RkPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qdW5pdC5odG1sIj5qdW5pdDwvYT4gdGFzayAobWF5IGJlIGluIGNsYXNzcGF0aCBwYXNzZWQgdG8gdGFzayByYXRoZXIgdGhhbgorICAgICAgQW50J3MgY2xhc3NwYXRoKTwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vanVuaXQub3JnLyIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2p1bml0Lm9yZy88L2E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD54YWxhbi5qYXI8L3RkPgpAQCAtODI2LDcgKzgwMiw3IEBACiAgIDx0cj4KICAgICA8dGQ+YW50bHIuamFyPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iVGFza3MvYW50bHIuaHRtbCI+YW50bHI8L2E+IHRhc2s8L3RkPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cDovL3d3dy5hbnRsci5vcmcvPC9hPjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmFudGxyLm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly93d3cuYW50bHIub3JnLzwvYT48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmJzZi5qYXI8L3RkPgpAQCAtODQxLDI5ICs4MTcsMjYgQEAKICAgICA8dGQ+R3Jvb3Z5IEpBUnM8L3RkPgogICAgIDx0ZD5Hcm9vdnkgQW50IHRhc2tzIHdpdGggYmluZGluZ3Mgb3IgR3Jvb3Z5IHdpdGggPGEgaHJlZj0iVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4KICAgICBhbmQgPGEgaHJlZj0iVGFza3Mvc2NyaXB0ZGVmLmh0bWwiPnNjcmlwdGRlZjwvYT4gdGFza3M8L3RkPgotICAgIDx0ZD4KLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9ncm9vdnktbGFuZy5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9ncm9vdnktbGFuZy5vcmcvPC9hPjxici8+Ci0gICAgICBVc2UgZWl0aGVyIGdyb292eS1hbnQgZm9yIEdyb292eSBBbnQgdGFza3Mgd2l0aCBiaW5kaW5ncyBvciBncm9vdnktYnNmIGZvciBHcm9vdnkgd2l0aCBzY3JpcHQgYW5kIHNjcmlwdGRlZiB0YXNrcwotICAgICAgKG9yIGdyb292eS1hbGwpCisgICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly9ncm9vdnktbGFuZy5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly9ncm9vdnktbGFuZy5vcmcvPC9hPjxici8+IFVzZSBlaXRoZXIgZ3Jvb3Z5LWFudCBmb3IKKyAgICAgIEdyb292eSBBbnQgdGFza3Mgd2l0aCBiaW5kaW5ncyBvciBncm9vdnktYnNmIGZvciBHcm9vdnkgd2l0aCBzY3JpcHQgYW5kIHNjcmlwdGRlZiB0YXNrcyAob3IgZ3Jvb3Z5LWFsbCkKICAgICA8L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPm5ldHJleHguamFyPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+bmV0cmV4eGM8L2E+IHRhc2ssIFJleHggd2l0aCA8YSBocmVmPSJUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9hd2R0b29scy9uZXRyZXh4L2xpYnJhcnkuaHRtbCIKLSAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vd3d3LmlibS5jb20vc29mdHdhcmUvYXdkdG9vbHMvbmV0cmV4eC9saWJyYXJ5Lmh0bWw8L2E+PC90ZD4KKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL3d3dy5pYm0uY29tL3NvZnR3YXJlL2F3ZHRvb2xzL25ldHJleHgvbGlicmFyeS5odG1sPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQ+cmhpbm8uamFyPGJyLz4KLSAgICAoaW5jbHVkZWQgaW4gSmF2YSA3IHJ1bnRpbWUsIHJlcGxhY2VkIGJ5IE5hc2hvcm4gaW4gSmF2YSZuYnNwOzggYW5kIGxhdGVyKTwvdGQ+Ci0gICAgPHRkPkphdmFTY3JpcHQgd2l0aCA8YSBocmVmPSJUYXNrcy9zY3JpcHQuaHRtbCI+c2NyaXB0PC9hPiB0YXNrPGJyLz4KLSAgICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEFwYWNoZSBCU0YgMi40LjAgd29ya3Mgb25seSB3aXRoIFJoaW5vIDEuNVI0IGFuZCBsYXRlciB2ZXJzaW9ucy48L3RkPgorICAgIDx0ZD5yaGluby5qYXI8YnIvPihpbmNsdWRlZCBpbiBKYXZhIDcgcnVudGltZSwgcmVwbGFjZWQgYnkgTmFzaG9ybiBpbiBKYXZhJm5ic3A7OCBhbmQgbGF0ZXIpPC90ZD4KKyAgICA8dGQ+SmF2YVNjcmlwdCB3aXRoIDxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2s8YnIvPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogQXBhY2hlIEJTRiAyLjQuMCB3b3JrcworICAgICAgb25seSB3aXRoIFJoaW5vIDEuNVI0IGFuZCBsYXRlciB2ZXJzaW9ucy48L3RkPgogICAgIDx0ZD48YSBocmVmPSJodHRwczovL3d3dy5tb3ppbGxhLm9yZy9yaGluby8iIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly93d3cubW96aWxsYS5vcmcvcmhpbm8vPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+anl0aG9uLmphcjwvdGQ+CiAgICAgPHRkPlB5dGhvbiB3aXRoIDxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2s8L3RkPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vd3d3Lmp5dGhvbi5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuanl0aG9uLm9yZy88L2E+PC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly93d3cuanl0aG9uLm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly93d3cuanl0aG9uLm9yZy88L2E+PC90ZD4KICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5qYWNsLmphciBhbmQgdGNsamF2YS5qYXI8L3RkPgpAQCAtODc3LDE5ICs4NTAsMTkgQEAKICAgPC90cj4KICAgPHRyPgogICAgIDx0ZD5CZWFuU2hlbGwgSkFSKHMpPC90ZD4KLSAgICA8dGQ+QmVhblNoZWxsIHdpdGggPGEgaHJlZj0iVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzay48YnIvPgotICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogQW50IHJlcXVpcmVzIEJlYW5TaGVsbCB2ZXJzaW9uIDEuMyBvciBsYXRlcjwvdGQ+CisgICAgPHRkPkJlYW5TaGVsbCB3aXRoIDxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2suPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IEFudCByZXF1aXJlcyBCZWFuU2hlbGwKKyAgICAgIHZlcnNpb24gMS4zIG9yIGxhdGVyPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5iZWFuc2hlbGwub3JnLyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vd3d3LmJlYW5zaGVsbC5vcmcvPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+anJ1YnkuamFyPC90ZD4KICAgICA8dGQ+UnVieSB3aXRoIDxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5zY3JpcHQ8L2E+IHRhc2s8L3RkPgotICAgIDx0ZD48YSBocmVmPSJodHRwOi8vanJ1Ynkub3JnLyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vanJ1Ynkub3JnLzwvYT48L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwczovL2pydWJ5Lm9yZy8iIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9qcnVieS5vcmcvPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+anVkby5qYXI8L3RkPgogICAgIDx0ZD5KdWRvIGxhbmd1YWdlIHdpdGggPGEgaHJlZj0iVGFza3Mvc2NyaXB0Lmh0bWwiPnNjcmlwdDwvYT4gdGFzazwvdGQ+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHA6Ly93d3cuanVkb3NjcmlwdC5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuanVkb3NjcmlwdC5vcmcvPC9hPjwvdGQ+CisgICAgPHRkPnVzZWQgdG8gYmUgYXQgaHR0cDovL3d3dy5qdWRvc2NyaXB0Lm9yZy8gd2hpY2ggaXMgbm93IG5vdCBhdmFpbGFibGUgYW55bW9yZS48L3RkPgogICA8L3RyPgogICA8dHI+CiAgICAgPHRkPmNvbW1vbnMtbG9nZ2luZy5qYXI8L3RkPgpAQCAtOTA0LDkwICs4NzcsMTE1IEBACiAgIDx0ciBpZD0iY29tbW9ucy1uZXQiPgogICAgIDx0ZD5jb21tb25zLW5ldC5qYXI8L3RkPgogICAgIDx0ZD48YSBocmVmPSJUYXNrcy9mdHAuaHRtbCI+ZnRwPC9hPiwgPGEgaHJlZj0iVGFza3MvcmV4ZWMuaHRtbCI+cmV4ZWM8L2E+Ci0gICAgYW5kIDxhIGhyZWY9IlRhc2tzL3RlbG5ldC5odG1sIj50ZWxuZXQ8L2E+IHRhc2tzPGJyLz4KLSAgICBBIG1pbmltdW0gdmVyc2lvbiBvZiBjb21tb25zLW5ldCBvZiAxLjQuMCBpcyBuZWVkZWQgdG8gY29tcGlsZSBBbnQsIGVhcmxpZXIgdmVyc2lvbnMgZGlkIG5vdCBzdXBwb3J0IHRoZSBmdWxsIHJhbmdlCi0gICAgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLjxici8+Ci0gICAgamFrYXJ0YS1vcm8gMi4wLjggaXMgcmVxdWlyZWQgdG9nZXRoZXIgd2l0aCBjb21tb25zLW5ldCAxLjQueCBhdCBydW4gdGltZS48YnIvPgotICAgIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogZG8gbm90IHVzZSBjb21tb25zLW5ldCAzLjIgYmVjYXVzZQotICAgIG9mIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTkVULTQ5MyI+cGVyZm9ybWFuY2UgaXNzdWVzPC9hPgorICAgICAgYW5kIDxhIGhyZWY9IlRhc2tzL3RlbG5ldC5odG1sIj50ZWxuZXQ8L2E+IHRhc2tzPGJyLz4gQSBtaW5pbXVtIHZlcnNpb24gb2YgY29tbW9ucy1uZXQgb2YgMS40LjAgaXMgbmVlZGVkIHRvCisgICAgICBjb21waWxlIEFudCwgZWFybGllciB2ZXJzaW9ucyBkaWQgbm90IHN1cHBvcnQgdGhlIGZ1bGwgcmFuZ2Ugb2YgY29uZmlndXJhdGlvbiBvcHRpb25zLjxici8+amFrYXJ0YS1vcm8gMi4wLjggaXMKKyAgICAgIHJlcXVpcmVkIHRvZ2V0aGVyIHdpdGggY29tbW9ucy1uZXQgMS40LnggYXQgcnVuIHRpbWUuPGJyLz48c3Ryb25nPk5vdGU8L3N0cm9uZz46IGRvIG5vdCB1c2UgY29tbW9ucy1uZXQgMy4yCisgICAgICBiZWNhdXNlIG9mIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTkVULTQ5MyIgdGFyZ2V0PSJfdG9wIj5wZXJmb3JtYW5jZSBpc3N1ZXM8L2E+CiAgICAgPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9jb21tb25zLmFwYWNoZS5vcmcvbmV0LyIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9uZXQvPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+YmNlbC5qYXI8L3RkPgogICAgIDx0ZD48YSBocmVmPSJUeXBlcy9jbGFzc2ZpbGVzZXQuaHRtbCI+Y2xhc3NmaWxlc2V0PC9hPiBkYXRhIHR5cGUsIEphdmFDbGFzc0hlbHBlciB1c2VkIGJ5IHRoZSBDbGFzc0NvbnN0YW50cyBmaWx0ZXIKLSAgICByZWFkZXIgYW5kIG9wdGlvbmFsbHkgdXNlZCBieSA8YSBocmVmPSJUYXNrcy9lamIuaHRtbCNlamJqYXIiPmVqYmphcjwvYT4gdGFzayBmb3IgZGVwZW5kZW5jeSBkZXRlcm1pbmF0aW9uPC90ZD4KKyAgICAgIHJlYWRlciBhbmQgb3B0aW9uYWxseSB1c2VkIGJ5IDxhIGhyZWY9IlRhc2tzL2VqYi5odG1sI2VqYmphciI+ZWpiamFyPC9hPiB0YXNrIGZvciBkZXBlbmRlbmN5IGRldGVybWluYXRpb248L3RkPgogICAgIDx0ZD48YSBocmVmPSJodHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9iY2VsLyIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2NvbW1vbnMuYXBhY2hlLm9yZy9iY2VsLzwvYT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkPmphdmF4Lm1haWwuamFyPC90ZD4KLSAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbWFpbC5odG1sIj5tYWlsPC9hPiB0YXNrIGFuZCA8aT5kZXByZWNhdGVkPC9pPiA8YSBocmVmPSJUYXNrcy9taW1lbWFpbC5odG1sIj5taW1lbWFpbDwvYT4gdGFzazwvdGQ+Ci0gICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vamF2YWVlLmdpdGh1Yi5pby9qYXZhbWFpbC8iCi0gICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2phdmFtYWlsLzwvYT48L3RkPgorICAgIDx0ZD5qYWthcnRhLm1haWwuamFyPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbWFpbC5odG1sIj5tYWlsPC9hPiB0YXNrCisgICAgICBhbmQgPGVtPjx1PmRlcHJlY2F0ZWQ8L3U+PC9lbT4gPGEgaHJlZj0iVGFza3MvbWltZW1haWwuaHRtbCI+bWltZW1haWw8L2E+IHRhc2s8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwczovL2VjbGlwc2UtZWU0ai5naXRodWIuaW8vbWFpbC8iCisgICAgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9lY2xpcHNlLWVlNGouZ2l0aHViLmlvL21haWwvPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+YWN0aXZhdGlvbi5qYXI8YnIvPgotICAgIChpbmNsdWRlZCBpbiBKYXZhIDYgdG8gSmF2YSAxMCBidXQKLSAgICB0aGUgPGNvZGU+amF2YS5hY3RpdmF0aW9uPC9jb2RlPiBtb2R1bGUgaXMgZGVwcmVjYXRlZCBhbmQgbWFya2VkCi0gICAgZm9yIHJlbW92YWwgaW4gSmF2YSA5IGFuZCBuZWVkcyB0byBiZSBlbmFibGVkIGV4cGxpY2l0bHkgb24gSmF2YQotICAgIDEwKTwvdGQ+CisgICAgICA8dWw+CisgICAgICAgIDxsaT5JbmNsdWRlZCBpbiBKYXZhIDYgdG8gSmF2YSAxMCBidXQgdGhlIDxjb2RlPmphdmEuYWN0aXZhdGlvbjwvY29kZT4gbW9kdWxlIGlzIGRlcHJlY2F0ZWQgYW5kIG1hcmtlZCBmb3IgcmVtb3ZhbCBpbgorICAgICAgSmF2YSA5IGFuZCBuZWVkcyB0byBiZSBlbmFibGVkIGV4cGxpY2l0bHkgb24gSmF2YSAxMC48L2xpPgorICAgICAgIDxsaT5TdGFydGluZyBKYXZhIDExLCB0aGUgPGNvZGU+amF2YS5hY3RpdmF0aW9uPC9jb2RlPiBtb2R1bGUgaGFzIGJlZW4gPGEgaHJlZj0iaHR0cHM6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMzIwIj5yZW1vdmVkPC9hPiBhbmQgdGhlIGphciBoYXMgdG8gYmUgZXhwbGljaXRseSBtYWRlIGF2YWlsYWJsZSBpbiB0aGUgY2xhc3NwYXRoLjwvbGk+CisgICAgICA8L3VsPgorICAgIDwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9IlRhc2tzL21haWwuaHRtbCI+bWFpbDwvYT4gdGFzayB3aXRoIE1JTUUgZW5jb2RpbmcsCi0gICAgYW5kIDxpPmRlcHJlY2F0ZWQ8L2k+IDxhIGhyZWY9IlRhc2tzL21pbWVtYWlsLmh0bWwiPm1pbWVtYWlsPC9hPiB0YXNrPC90ZD4KLSAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phdmFlZS9hY3RpdmF0aW9uIgotICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vZ2l0aHViLmNvbS9qYXZhZWUvYWN0aXZhdGlvbjwvYT48L3RkPgorICAgICAgYW5kIDxlbT48dT5kZXByZWNhdGVkPC91PjwvZW0+IDxhIGhyZWY9IlRhc2tzL21pbWVtYWlsLmh0bWwiPm1pbWVtYWlsPC9hPiB0YXNrPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qYWYiPmh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamFmPC9hPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KICAgICA8dGQ+amRlcGVuZC5qYXI8L3RkPgogICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qZGVwZW5kLmh0bWwiPmpkZXBlbmQ8L2E+IHRhc2s8L3RkPgotICAgIDx0ZD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQiCi0gICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9naXRodWIuY29tL2NsYXJrd2FyZS9qZGVwZW5kPC9hPjwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jbGFya3dhcmUvamRlcGVuZCIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQ8L2E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZD5yZXNvbHZlci5qYXIgPGI+MS4xIG9yIGxhdGVyPC9iPjwvdGQ+Ci0gICAgPHRkPjxhIGhyZWY9IlR5cGVzL3htbGNhdGFsb2cuaHRtbCI+eG1sY2F0YWxvZzwvYT4gZGF0YXR5cGUgPGk+b25seSBpZiBzdXBwb3J0IGZvciBleHRlcm5hbCBjYXRhbG9nIGZpbGVzIGlzCi0gICAgZGVzaXJlZDwvaT48L3RkPgorICAgIDx0ZD5yZXNvbHZlci5qYXIgPHN0cm9uZz4xLjEgb3IgbGF0ZXI8L3N0cm9uZz48L3RkPgorICAgIDx0ZD48YSBocmVmPSJUeXBlcy94bWxjYXRhbG9nLmh0bWwiPnhtbGNhdGFsb2c8L2E+IGRhdGF0eXBlIDxlbT5vbmx5IGlmIHN1cHBvcnQgZm9yIGV4dGVybmFsIGNhdGFsb2cgZmlsZXMgaXMKKyAgICAgIGRlc2lyZWQ8L2VtPjwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8veGVyY2VzLmFwYWNoZS5vcmcveG1sLWNvbW1vbnMvY29tcG9uZW50cy9yZXNvbHZlci8iCi0gICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL3hlcmNlcy5hcGFjaGUub3JnL3htbC1jb21tb25zL2NvbXBvbmVudHMvcmVzb2x2ZXIvPC9hPjwvdGQ+CisgICAgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly94ZXJjZXMuYXBhY2hlLm9yZy94bWwtY29tbW9ucy9jb21wb25lbnRzL3Jlc29sdmVyLzwvYT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkPmpzY2guamFyIDxiPjAuMS41NSBvciBsYXRlcjwvYj48L3RkPgorICAgIDx0ZD5qc2NoLmphciA8c3Ryb25nPjAuMS41NSBvciBsYXRlcjwvc3Ryb25nPjwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3NzaGV4ZWMuaHRtbCI+c3NoZXhlYzwvYT4gYW5kIDxhIGhyZWY9IlRhc2tzL3NjcC5odG1sIj5zY3A8L2E+IHRhc2tzPC90ZD4KICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5qY3JhZnQuY29tL2pzY2gvIiB0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuamNyYWZ0LmNvbS9qc2NoLzwvYT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkPkpBSSAtIEphdmEgQWR2YW5jZWQgSW1hZ2luZzwvdGQ+CisgICAgPHRkPkpBSSZtZGFzaDtKYXZhIEFkdmFuY2VkIEltYWdpbmc8L3RkPgogICAgIDx0ZD48YSBocmVmPSJUYXNrcy9pbWFnZS5odG1sIj5pbWFnZTwvYT4gdGFzazwvdGQ+CiAgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZG93bmxvYWQuamF2YS5uZXQvbWVkaWEvamFpL2J1aWxkcy9yZWxlYXNlLzFfMV8zL0lOU1RBTEwuaHRtbCIKLSAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vZG93bmxvYWQuamF2YS5uZXQvbWVkaWEvamFpL2J1aWxkcy9yZWxlYXNlLzFfMV8zL0lOU1RBTEwuaHRtbDwvYT48L3RkPgorICAgICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vZG93bmxvYWQuamF2YS5uZXQvbWVkaWEvamFpL2J1aWxkcy9yZWxlYXNlLzFfMV8zL0lOU1RBTEwuaHRtbDwvYT48L3RkPgorICA8L3RyPgorICA8dHI+CisgICAgPHRkPmphaS1pbWFnZWlvLWNvcmUuamFyPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvaW1hZ2Vpby5odG1sIj5pbWFnZWlvPC9hPiB0YXNrIGZvciBUSUZGIHN1cHBvcnQgb24gSmF2YSA4LCBhcyB3ZWxsIGFzIFBDWCwgUE5NLCBSQVcgc3VwcG9ydDwvdGQ+CisgICAgPHRkPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYWktaW1hZ2Vpby9qYWktaW1hZ2Vpby1jb3JlL3JlbGVhc2VzIgorICAgICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vZ2l0aHViLmNvbS9qYWktaW1hZ2Vpby9qYWktaW1hZ2Vpby1jb3JlL3JlbGVhc2VzPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+WFombWRhc2g7WFogZm9yIEphdmEgPHN0cm9uZz4xLjYgb3IgbGF0ZXI8L3N0cm9uZz48L3RkPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9wYWNrLmh0bWwiPnh6PC9hPiBhbmQgPGEgaHJlZj0iVGFza3MvdW5wYWNrLmh0bWwiPnVueHo8L2E+CisgICAgICB0YXNrcywgPGEgaHJlZj0iVHlwZXMvcmVzb3VyY2VzLmh0bWwjeHpyZXNvdXJjZSI+eHpyZXNvdXJjZTwvYT4sIHh6IGNvbXByZXNzaW9uCisgICAgICBpbiA8YSBocmVmPSJUYXNrcy90YXIuaHRtbCI+dGFyPC9hPi88YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj51bnRhcjwvYT4gdGFza3M8L3RkPgorICAgIDx0ZD48YSBocmVmPSJodHRwczovL3d3dy50dWthYW5pLm9yZy94ei9qYXZhLmh0bWwiIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly93d3cudHVrYWFuaS5vcmcveHovamF2YS5odG1sPC9hPjwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+SlVuaXQgNSBQbGF0Zm9ybSBqYXJzOgorICAgICAgPHVsPgorICAgICAgICAgIDxsaT5qdW5pdC1wbGF0Zm9ybS1jb21tb25zLmphcjwvbGk+CisgICAgICAgICAgPGxpPmp1bml0LXBsYXRmb3JtLWVuZ2luZS5qYXI8L2xpPgorICAgICAgICAgIDxsaT5qdW5pdC1wbGF0Zm9ybS1sYXVuY2hlci5qYXI8L2xpPgorICAgICAgPC91bD4KKyAgICA8L3RkPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qdW5pdGxhdW5jaGVyLmh0bWwiPmp1bml0bGF1bmNoZXI8L2E+IHRhc2suIEFkZGl0aW9uYWwgbGlicmFyaWVzIG1heWJlIG5lZWRlZCBkZXBlbmRpbmcKKyAgICAgIG9uIHRoZSBzZWxlY3RlZCB0ZXN0IGVuZ2luZXMsIGRldGFpbHMgb2Ygd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGF0IHRhc2sncyBkb2N1bWVudGF0aW9uPC90ZD4KKyAgICA8dGQ+PGEgaHJlZj0iaHR0cHM6Ly9qdW5pdC5vcmcvanVuaXQ1LyIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2p1bml0Lm9yZy9qdW5pdDUvPC9hPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08bGk+V2hpY2ggb3B0aW9uYWwgdGFza3MgYXJlIGF2YWlsYWJsZS4gSWYgYSB0YXNrIGlzIG5vdCBsaXN0ZWQgYXMgYmVpbmcgYXZhaWxhYmxlLCBlaXRoZXIgaXQgaXMgbm90IHByZXNlbnQsIG9yCi1saWJyYXJpZXMgdGhhdCBpdCBkZXBlbmRzIG9uIGFyZSBhYnNlbnQuPC9saT4KKzxoMiBpZD0iVHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3Rpbmc8L2gyPgogCiA8aDMgaWQ9ImRpYWdub3N0aWNzIj5EaWFnbm9zdGljczwvaDM+CiAKIDxwPgotQW50IGhhcyBhIGJ1aWx0IGluIGRpYWdub3N0aWNzIGZlYXR1cmUuIElmIHlvdSBydW4gPGNvZGU+YW50IC1kaWFnbm9zdGljczwvY29kZT4gYW50IHdpbGwgbG9vayBhdCBpdHMgaW50ZXJuYWwgc3RhdGUgYW5kCi1wcmludCBpdCBvdXQuIFRoaXMgY29kZSB3aWxsIGNoZWNrIGFuZCBwcmludCB0aGUgZm9sbG93aW5nIHRoaW5ncy4KK0FudCBoYXMgYSBidWlsdCBpbiBkaWFnbm9zdGljcyBmZWF0dXJlLiBJZiB5b3UgcnVuIDxrYmQ+YW50IC1kaWFnbm9zdGljczwva2JkPiwgQW50IHdpbGwgbG9vayBhdCBpdHMgaW50ZXJuYWwgc3RhdGUKK2FuZCBwcmludCBpdCBvdXQuIFRoaXMgY29kZSB3aWxsIGNoZWNrIGFuZCBwcmludCB0aGUgZm9sbG93aW5nIHRoaW5ncy4KIDwvcD4KIAogPHVsPgogCiA8bGk+V2hlcmUgQW50IGlzIHJ1bm5pbmcgZnJvbS4gU29tZXRpbWVzIHlvdSBjYW4gYmUgc3VycHJpc2VkLjwvbGk+CiAKLTxsaT5UaGUgdmVyc2lvbiBvZiBhbnQuamFyIGFuZCBvZiB0aGUgYW50LSouamFyIGNvbnRhaW5pbmcgdGhlIG9wdGlvbmFsIHRhc2tzIC0gYW5kIHdoZXRoZXIgdGhleSBtYXRjaDwvbGk+Cis8bGk+VGhlIHZlcnNpb24gb2YgPHNhbXA+YW50Lmphcjwvc2FtcD4gYW5kIG9mIHRoZSA8c2FtcD5hbnQtKi5qYXI8L3NhbXA+IGNvbnRhaW5pbmcgdGhlIG9wdGlvbmFsIHRhc2tzJm1kYXNoO2FuZAord2hldGhlciB0aGV5IG1hdGNoPC9saT4KIAogPGxpPldoaWNoIEpBUiBmaWxlcyBhcmUgaW4gPGNvZGU+QU5UX0hPTUUvbGliPC9jb2RlPjwvbGk+CiAKLTxoMiBpZD0iVHJvdWJsZXNob290aW5nIj5Ucm91Ymxlc2hvb3Rpbmc8L2gyPgorPGxpPldoaWNoIG9wdGlvbmFsIHRhc2tzIGFyZSBhdmFpbGFibGUuIElmIGEgdGFzayBpcyBub3QgbGlzdGVkIGFzIGJlaW5nIGF2YWlsYWJsZSwgZWl0aGVyIGl0IGlzIG5vdCBwcmVzZW50LCBvcgorbGlicmFyaWVzIHRoYXQgaXQgZGVwZW5kcyBvbiBhcmUgYWJzZW50LjwvbGk+CiAKIDxsaT5YTUwgUGFyc2VyIGluZm9ybWF0aW9uPC9saT4KIAogPGxpPkpWTSBzeXN0ZW0gcHJvcGVydGllczwvbGk+CiAKLTxsaT5UaGUgc3RhdHVzIG9mIHRoZSB0ZW1wIGRpcmVjdG9yeS4gSWYgdGhpcyBpcyBub3Qgd3JpdGFibGUsIG9yIGl0cyBjbG9jayBpcyBob3JyaWJseSB3cm9uZyAocG9zc2libGUgaWYgaXQgaXMgb24gYQotbmV0d29yayBkcml2ZSksIGEgbG90IG9mIHRhc2tzIHdpbGwgZmFpbCB3aXRoIG9ic2N1cmUgZXJyb3IgbWVzc2FnZXMuPC9saT4KKzxsaT5UaGUgc3RhdHVzIG9mIHRoZSA8c2FtcD50ZW1wPC9zYW1wPiBkaXJlY3RvcnkuIElmIHRoaXMgaXMgbm90IHdyaXRhYmxlLCBvciBpdHMgdGltZXN0YW1wIGlzIGhvcnJpYmx5IHdyb25nIChwb3NzaWJsZQoraWYgaXQgaXMgb24gYSBuZXR3b3JrIGRyaXZlKSwgYSBsb3Qgb2YgdGFza3MgbWF5IGZhaWwgd2l0aCBvYnNjdXJlIGVycm9yIG1lc3NhZ2VzLjwvbGk+CiAKIDxsaT5UaGUgY3VycmVudCB0aW1lIHpvbmUgYXMgSmF2YSBzZWVzIGl0LiBJZiB0aGlzIGlzIG5vdCB3aGF0IGl0IHNob3VsZCBiZSBmb3IgeW91ciBsb2NhdGlvbiwgdGhlbiBkZXBlbmRlbmN5IGxvZ2ljIG1heQogZ2V0IGNvbmZ1c2VkLjwvbGk+CkBAIC05OTUsNyArOTkzLDcgQEAKIDwvdWw+CiAKIDxwPgotUnVubmluZyA8Y29kZT5hbnQgLWRpYWdub3N0aWNzPC9jb2RlPiBpcyBhIGdvb2Qgd2F5IHRvIGNoZWNrIHRoYXQgQW50IGlzIGluc3RhbGxlZC4gSXQgaXMgYWxzbyBhIGZpcnN0IHN0ZXAgdG93YXJkcworUnVubmluZyA8a2JkPmFudCAtZGlhZ25vc3RpY3M8L2tiZD4gaXMgYSBnb29kIHdheSB0byBjaGVjayB0aGF0IEFudCBpcyBpbnN0YWxsZWQuIEl0IGlzIGFsc28gYSBmaXJzdCBzdGVwIHRvd2FyZHMKIHNlbGYtZGlhZ25vc2lzIG9mIGFueSBwcm9ibGVtLiBBbnkgY29uZmlndXJhdGlvbiBwcm9ibGVtIHJlcG9ydGVkIHRvIHRoZSB1c2VyIG1haWxpbmcgbGlzdCB3aWxsIHByb2JhYmx5IHJlc3VsdCBpbnMKIHNvbWVvbmUgYXNraW5nIHlvdSB0byBydW4gdGhlIGNvbW1hbmQgYW5kIHNob3cgdGhlIHJlc3VsdHMsIHNvIHNhdmUgdGltZSBieSB1c2luZyBpdCB5b3Vyc2VsZi4KIDwvcD4KQEAgLTEwMDYsNyArMTAwNCw3IEBACiB3aGF0IHRoZSBYTUwgcGFyc2VyIGFuZCBjbGFzc3BhdGggaXMsIGV0Yy4KIDwvcD4KIAotPGgzIGlkPSJhbnQtdXNlciI+dXNlciBtYWlsaW5nIGxpc3Q8L2gzPgorPGgzIGlkPSJhbnQtdXNlciI+VXNlciBNYWlsaW5nIExpc3Q8L2gzPgogCiA8cD4KIElmIHlvdSBjYW5ub3QgZ2V0IEFudCBpbnN0YWxsZWQgb3Igd29ya2luZywgdGhlIEFudCB1c2VyIG1haWxpbmcgbGlzdCBpcyB0aGUgYmVzdCBwbGFjZSB0byBzdGFydCB3aXRoIGFueQpkaWZmIC0tZ2l0IGEvbWFudWFsL2luc3RhbGxsaXN0Lmh0bWwgYi9tYW51YWwvaW5zdGFsbGxpc3QuaHRtbAppbmRleCA2YmJlM2RkLi5mNTA1NjA4IDEwMDY0NAotLS0gYS9tYW51YWwvaW5zdGFsbGxpc3QuaHRtbAorKysgYi9tYW51YWwvaW5zdGFsbGxpc3QuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KQEAgLTQxLDQgKzQxLDMgQEAKIDwvdWw+CiA8L2JvZHk+CiA8L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL21hbnVhbC9pbnRyby5odG1sIGIvbWFudWFsL2ludHJvLmh0bWwKaW5kZXggZTU2NzNlZC4uMDY4YTQwNCAxMDA2NDQKLS0tIGEvbWFudWFsL2ludHJvLmh0bWwKKysrIGIvbWFudWFsL2ludHJvLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyNCArMTUsMjMgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgotPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwgLSBJbnRyb2R1Y3Rpb248L3RpdGxlPgorPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWwmbWRhc2g7SW50cm9kdWN0aW9uPC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHk+Ci08aDE+PGEgbmFtZT0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2E+PC9oMT4KKzxoMSBpZD0iaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb248L2gxPgogPHA+QXBhY2hlIEFudCBpcyBhIEphdmEtYmFzZWQgYnVpbGQgdG9vbC4gSW4gdGhlb3J5LCBpdCBpcyBraW5kIG9mIGxpa2UKLTxpPm1ha2U8L2k+LCB3aXRob3V0IDxpPm1ha2U8L2k+J3Mgd3JpbmtsZXMuPC9wPgorPGVtPm1ha2U8L2VtPiwgd2l0aG91dCA8ZW0+bWFrZTwvZW0+J3Mgd3JpbmtsZXMuPC9wPgogPGgzPldoeT88L2gzPgogPHA+V2h5IGFub3RoZXIgYnVpbGQgdG9vbCB3aGVuIHRoZXJlIGlzIGFscmVhZHkKLTxpPm1ha2U8L2k+LAotPGk+Z251bWFrZTwvaT4sCi08aT5ubWFrZTwvaT4sCi08aT5qYW08L2k+LAorPGVtPm1ha2U8L2VtPiwKKzxlbT5nbnVtYWtlPC9lbT4sCis8ZW0+bm1ha2U8L2VtPiwKKzxlbT5qYW08L2VtPiwKIGFuZAogb3RoZXJzPyBCZWNhdXNlIGFsbCB0aG9zZSB0b29scyBoYXZlIGxpbWl0YXRpb25zIHRoYXQgQW50J3Mgb3JpZ2luYWwgYXV0aG9yCiBjb3VsZG4ndCBsaXZlIHdpdGggd2hlbiBkZXZlbG9waW5nIHNvZnR3YXJlIGFjcm9zcyBtdWx0aXBsZSBwbGF0Zm9ybXMuCkBAIC01NCwxNiArNTQsMTMgQEAKIFRhc2sgaW50ZXJmYWNlLjwvcD4KIDxwPkdyYW50ZWQsIHRoaXMgcmVtb3ZlcyBzb21lIG9mIHRoZSBleHByZXNzaXZlIHBvd2VyIHRoYXQgaXMgaW5oZXJlbnQgaW4gYmVpbmcKIGFibGUgdG8gY29uc3RydWN0IGEgc2hlbGwgY29tbWFuZCBzdWNoIGFzCi08bm9icj48Y29kZT5gZmluZCAuIC1uYW1lIGZvbyAtZXhlYyBybSB7fWA8L2NvZGU+PC9ub2JyPiwgYnV0IGl0Ci1naXZlcyB5b3UgdGhlIGFiaWxpdHkgdG8gYmUgY3Jvc3MtcGxhdGZvcm0tLXRvIHdvcmsgYW55d2hlcmUgYW5kCis8Y29kZT5gZmluZCAuIC1uYW1lIGZvbyAtZXhlYyBybSB7fWA8L2NvZGU+LCBidXQgaXQKK2dpdmVzIHlvdSB0aGUgYWJpbGl0eSB0byBiZSBjcm9zcy1wbGF0Zm9ybSZtZGFzaDt0byB3b3JrIGFueXdoZXJlIGFuZAogZXZlcnl3aGVyZS4gQW5kCiBoZXksIGlmIHlvdSByZWFsbHkgbmVlZCB0byBleGVjdXRlIGEgc2hlbGwgY29tbWFuZCwgQW50IGhhcyBhbgogPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIHRoYXQKIGFsbG93cyBkaWZmZXJlbnQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgYmFzZWQgb24gdGhlIE9TIGl0IGlzIGV4ZWN1dGluZwogb24uPC9wPgogCi0KLQogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvamF2YWNwcm9wcy5odG1sIGIvbWFudWFsL2phdmFjcHJvcHMuaHRtbAppbmRleCA2Y2FiMDdjLi5kNDgyZWNkIDEwMDY0NAotLS0gYS9tYW51YWwvamF2YWNwcm9wcy5odG1sCisrKyBiL21hbnVhbC9qYXZhY3Byb3BzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0MCArMTUsMzggQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlByb3BlcnRpZXMgY29udHJvbGxpbmcgamF2YWM8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keT4KIAotPHA+VGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGF0dHJpYnV0ZXMgb2YgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4KLWRvbid0IGhhdmUgYW55IGRlZmF1bHQgdmFsdWVzIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMuICBTaW5jZSB0aGUKLXVuZGVybHlpbmcgamF2YWMgY29tcGlsZXIncyBkZWZhdWx0IGRlcGVuZHMgb24gdGhlIEpESyB5b3UgdXNlLCB5b3UKLW1heSBlbmNvdW50ZXIgYnVpbGQgZmlsZXMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHNldCB0aG9zZSBhdHRyaWJ1dGVzCi1hbmQgdGhhdCB3aWxsIG5vIGxvbmdlciBjb21waWxlIHVzaW5nIGEgbmV3ZXIgSkRLLiAgSWYgeW91IGNhbm5vdAotY2hhbmdlIHRoZSBidWlsZCBmaWxlLCBBcGFjaGUgQW50IHByb3ZpZGVzIHR3byBwcm9wZXJ0aWVzIHRoYXQgaGVscCB5b3UKLXNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGF0dHJpYnV0ZXMuICBJZiB0aGUgYXR0cmlidXRlcyBoYXZlCi1iZWVuIHNldCBleHBsaWNpdGx5LCB0aGUgcHJvcGVydGllcyBsaXN0ZWQgaGVyZSB3aWxsIGJlIGlnbm9yZWQuPC9wPgorPHA+VGhlIDx2YXI+c291cmNlPC92YXI+IGFuZCA8dmFyPnRhcmdldDwvdmFyPiBhdHRyaWJ1dGVzCitvZiA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPiBkb24ndCBoYXZlIGFueSBkZWZhdWx0IHZhbHVlcyBmb3IKK2hpc3RvcmljYWwgcmVhc29ucy4gIFNpbmNlIHRoZSB1bmRlcmx5aW5nIDxrYmQ+amF2YWM8L2tiZD4KK2NvbXBpbGVyIGRlZmF1bHRzIGRlcGVuZHMgb24gdGhlIEpESyB5b3UgdXNlLCB5b3UgbWF5IGVuY291bnRlcgorYnVpbGQgZmlsZXMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHNldCB0aG9zZSBhdHRyaWJ1dGVzIGFuZCB0aGF0IHdpbGwKK25vIGxvbmdlciBjb21waWxlIHVzaW5nIGEgbmV3ZXIgSkRLLiAgSWYgeW91IGNhbm5vdCBjaGFuZ2UgdGhlIGJ1aWxkCitmaWxlLCBBcGFjaGUgQW50IHByb3ZpZGVzIHR3byBwcm9wZXJ0aWVzIHRoYXQgaGVscCB5b3Ugc2V0dGluZworZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGF0dHJpYnV0ZXMuICBJZiB0aGUgYXR0cmlidXRlcyBoYXZlIGJlZW4KK3NldCBleHBsaWNpdGx5LCB0aGUgcHJvcGVydGllcyBsaXN0ZWQgaGVyZSB3aWxsIGJlIGlnbm9yZWQuPC9wPgogCi08aDI+PGEgbmFtZT0ic291cmNlIj5hbnQuYnVpbGQuamF2YWMuc291cmNlPC9hPjwvaDI+Cis8aDIgaWQ9InNvdXJjZSI+YW50LmJ1aWxkLmphdmFjLnNvdXJjZTwvaDI+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CiAKLTxwPlByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncyBhbmQKLTxjb2RlPiZsdDtqYXZhZG9jJmd0OzwvY29kZT4ncyBzb3VyY2UgYXR0cmlidXRlLjwvcD4KKzxwPlByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncworYW5kIDxjb2RlPiZsdDtqYXZhZG9jJmd0OzwvY29kZT4ncyA8dmFyPnNvdXJjZTwvdmFyPiBhdHRyaWJ1dGUuPC9wPgogCi08aDI+PGEgbmFtZT0idGFyZ2V0Ij5hbnQuYnVpbGQuamF2YWMudGFyZ2V0PC9hPjwvaDI+Cis8aDIgaWQ9InRhcmdldCI+YW50LmJ1aWxkLmphdmFjLnRhcmdldDwvaDI+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT48L3A+CiAKLTxwPlByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4ncyB0YXJnZXQKLWF0dHJpYnV0ZS48L3A+Ci0KKzxwPlByb3ZpZGVzIGEgZGVmYXVsdCB2YWx1ZQorZm9yIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+J3MgPHZhcj50YXJnZXQ8L3Zhcj4gYXR0cmlidXRlLjwvcD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvbGlzdGVuZXJzLmh0bWwgYi9tYW51YWwvbGlzdGVuZXJzLmh0bWwKaW5kZXggNzM4NzI4OC4uNGMxYjg3OCAxMDA2NDQKLS0tIGEvbWFudWFsL2xpc3RlbmVycy5odG1sCisrKyBiL21hbnVhbC9saXN0ZW5lcnMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5MaXN0ZW5lcnMgJmFtcDsgTG9nZ2VyczwvdGl0bGU+CiA8L2hlYWQ+CkBAIC0yNSwxMiArMjUsMTIgQEAKIDxib2R5PgogPGgxPkxpc3RlbmVycyAmYW1wOyBMb2dnZXJzPC9oMT4KIAotPGgyPjxhIG5hbWU9Ik92ZXJ2aWV3Ij5PdmVydmlldzwvYT48L2gyPgorPGgyIGlkPSJPdmVydmlldyI+T3ZlcnZpZXc8L2gyPgogCi08cD5BcGFjaGUgQW50IGhhcyB0d28gcmVsYXRlZCBmZWF0dXJlcyB0byBhbGxvdyB0aGUgYnVpbGQgcHJvY2VzcyB0byBiZSBtb25pdG9yZWQ6Ci1saXN0ZW5lcnMgYW5kIGxvZ2dlcnMuPC9wPgorPHA+QXBhY2hlIEFudCBoYXMgdHdvIHJlbGF0ZWQgZmVhdHVyZXMgdG8gYWxsb3cgdGhlIGJ1aWxkIHByb2Nlc3MgdG8gYmUgbW9uaXRvcmVkOiBsaXN0ZW5lcnMgYW5kCitsb2dnZXJzLjwvcD4KIAotPGgzPjxhIG5hbWU9Ikxpc3RlbmVycyI+TGlzdGVuZXJzPC9hPjwvaDM+Cis8aDMgaWQ9Ikxpc3RlbmVycyI+TGlzdGVuZXJzPC9oMz4KIAogPHA+QSBsaXN0ZW5lciBpcyBhbGVydGVkIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzOjwvcD4KIApAQCAtNDQsMzY1ICs0NCwzMjYgQEAKICAgPGxpPm1lc3NhZ2UgbG9nZ2VkPC9saT4KIDwvdWw+CiAKLTxwPgotICBUaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGZvciB2YXJpb3VzIHJlY29yZGluZyBhbmQgaG91c2VrZWVwaW5nIG9wZXJhdGlvbnMsCi0gIGhvd2V2ZXIgbmV3IGxpc3RlbmVycyBtYXkgcmVnaXN0ZXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHRocm91Z2ggdGhlIDxjb2RlPi1saXN0ZW5lcjwvY29kZT4KLSAgYXJndW1lbnQuCi08L3A+Cis8cD5UaGVzZSBhcmUgdXNlZCBpbnRlcm5hbGx5IGZvciB2YXJpb3VzIHJlY29yZGluZyBhbmQgaG91c2VrZWVwaW5nIG9wZXJhdGlvbnMsIGhvd2V2ZXIgbmV3CitsaXN0ZW5lcnMgbWF5IHJlZ2lzdGVyZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0aHJvdWdoIHRoZSA8a2JkPi1saXN0ZW5lcjwva2JkPiBhcmd1bWVudC48L3A+CiAKLTxoMz48YSBuYW1lPSJMb2dnZXJzIj5Mb2dnZXJzPC9hPjwvaDM+Cis8aDMgaWQ9IkxvZ2dlcnMiPkxvZ2dlcnM8L2gzPgogCiA8cD5Mb2dnZXJzIGV4dGVuZCB0aGUgY2FwYWJpbGl0aWVzIG9mIGxpc3RlbmVycyBhbmQgYWRkIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6PC9wPgogCiA8dWw+Ci0gIDxsaT5SZWNlaXZlcyBhIGhhbmRsZSB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGFuZCBlcnJvciBwcmludCBzdHJlYW1zIGFuZAotICB0aGVyZWZvcmUgY2FuIGxvZyBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZSBvciB0aGUgPGNvZGU+LWxvZ2ZpbGU8L2NvZGU+IHNwZWNpZmllZCBmaWxlLjwvbGk+Ci0gIDxsaT5Mb2dnaW5nIGxldmVsICgtcXVpZXQsIC12ZXJib3NlLCAtZGVidWcpIGF3YXJlPC9saT4KKyAgPGxpPlJlY2VpdmVzIGEgaGFuZGxlIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIHByaW50IHN0cmVhbXMgYW5kIHRoZXJlZm9yZSBjYW4gbG9nCisgICAgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGUgb3IgdGhlIDxrYmQ+LWxvZ2ZpbGU8L2tiZD4gc3BlY2lmaWVkIGZpbGUuPC9saT4KKyAgPGxpPkxvZ2dpbmcgbGV2ZWwgKDxrYmQ+LXF1aWV0PC9rYmQ+LCA8a2JkPi12ZXJib3NlPC9rYmQ+LCA8a2JkPi1kZWJ1Zzwva2JkPikgYXdhcmU8L2xpPgogICA8bGk+RW1hY3MtbW9kZSBhd2FyZTwvbGk+CiA8L3VsPgogCi08aDI+PGEgbmFtZT0iYnVpbHRpbiI+QnVpbHQtaW4gTGlzdGVuZXJzL0xvZ2dlcnM8L2E+PC9oMj4KKzxoMiBpZD0iYnVpbHRpbiI+QnVpbHQtaW4gTGlzdGVuZXJzL0xvZ2dlcnM8L2gyPgogCi08dGFibGUgYm9yZGVyPSIxIiBjZWxsc3BhY2luZz0iMSIgd2lkdGg9IjEwMCUiIGlkPSJBdXRvTnVtYmVyMSI+Cis8dGFibGU+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzJSI+Q2xhc3NuYW1lPC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+RGVzY3JpcHRpb248L3RkPgotICAgIDx0ZCB3aWR0aD0iMzQlIj5UeXBlPC90ZD4KKyAgICA8dGggc2NvcGU9ImNvbCI+Q2xhc3NuYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5UeXBlPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjRGVmYXVsdExvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+VGhlIGxvZ2dlciB1c2VkIGltcGxpY2l0bHkgdW5sZXNzIG92ZXJyaWRkZW4gd2l0aCB0aGUKLSAgICA8Y29kZT4tbG9nZ2VyPC9jb2RlPiBjb21tYW5kLWxpbmUgc3dpdGNoLjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI0RlZmF1bHRMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPlRoZSBsb2dnZXIgdXNlZCBpbXBsaWNpdGx5IHVubGVzcyBvdmVycmlkZGVuIHdpdGggdGhlIDxrYmQ+LWxvZ2dlcjwva2JkPiBjb21tYW5kLWxpbmUKKyAgICAgIHN3aXRjaC48L3RkPgorICAgIDx0ZD5CdWlsZExvZ2dlcjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzJSI+PGNvZGU+PGEgaHJlZj0iI05vQmFubmVyTG9nZ2VyIj4KLSAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Ob0Jhbm5lckxvZ2dlcjwvYT48L2NvZGU+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+VGhpcyBsb2dnZXIgb21pdHMgb3V0cHV0IG9mIGVtcHR5IHRhcmdldCBvdXRwdXQuPC90ZD4KLSAgICA8dGQgd2lkdGg9IjM0JSI+QnVpbGRMb2dnZXI8L3RkPgorICAgIDx0ZD48Y29kZT48YSBocmVmPSIjTm9CYW5uZXJMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lk5vQmFubmVyTG9nZ2VyPC9hPjwvY29kZT48L3RkPgorICAgIDx0ZD5UaGlzIGxvZ2dlciBvbWl0cyBvdXRwdXQgb2YgZW1wdHkgdGFyZ2V0IG91dHB1dC48L3RkPgorICAgIDx0ZD5CdWlsZExvZ2dlcjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzJSI+PGNvZGU+PGEgaHJlZj0iI01haWxMb2dnZXIiPgotICAgIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLk1haWxMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPkV4dGVuZHMgRGVmYXVsdExvZ2dlciBzdWNoIHRoYXQgb3V0cHV0IGlzIHN0aWxsIGdlbmVyYXRlZAotICAgIHRoZSBzYW1lLCBhbmQgd2hlbiB0aGUgYnVpbGQgaXMgZmluaXNoZWQgYW4gZS1tYWlsIGNhbiBiZSBzZW50LjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI01haWxMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLk1haWxMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPkV4dGVuZHMgRGVmYXVsdExvZ2dlciBzdWNoIHRoYXQgb3V0cHV0IGlzIHN0aWxsIGdlbmVyYXRlZCB0aGUgc2FtZSwgYW5kIHdoZW4gdGhlIGJ1aWxkIGlzCisgICAgICBmaW5pc2hlZCBhbiBlLW1haWwgY2FuIGJlIHNlbnQuPC90ZD4KKyAgICA8dGQ+QnVpbGRMb2dnZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNBbnNpQ29sb3JMb2dnZXIiPgotICAgIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkFuc2lDb2xvckxvZ2dlcjwvYT48L2NvZGU+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+Q29sb3JpZmllcyB0aGUgYnVpbGQgb3V0cHV0LjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI0Fuc2lDb2xvckxvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuQW5zaUNvbG9yTG9nZ2VyPC9hPjwvY29kZT48L3RkPgorICAgIDx0ZD5Db2xvcmlmaWVzIHRoZSBidWlsZCBvdXRwdXQuPC90ZD4KKyAgICA8dGQ+QnVpbGRMb2dnZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNMb2c0akxpc3RlbmVyIj4KLSAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Mb2c0akxpc3RlbmVyPC9hPjwvY29kZT48L3RkPgotICAgIDx0ZCB3aWR0aD0iMzMlIj4KLSAgICAgICAgUGFzc2VzIGV2ZW50cyB0byBBcGFjaGUgTG9nNGogZm9yIGhpZ2hseSBjdXN0b21pemFibGUgbG9nZ2luZy48YnI+Ci0gICAgICAgIDxiPkRlcHJlY2F0ZWQ6PC9iPiBBcGFjaGUgTG9nNGogKDEueCkgaXMgbm90IGRldmVsb3BlZCBhbnkgbW9yZS4gTGFzdAotICAgICAgICByZWxlYXNlIGlzIDEuMi4xNyBmcm9tIDI2LU1heS0yMDEyIGFuZCBjb250YWlucyB2dWxuZXJhYmlsaXR5IGlzc3Vlcy4KLSAgICA8L3RkPgotICAgIDx0ZCB3aWR0aD0iMzQlIj5CdWlsZExpc3RlbmVyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI0xvZzRqTGlzdGVuZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkxvZzRqTGlzdGVuZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPlBhc3NlcyBldmVudHMgdG8gQXBhY2hlIExvZzRqIGZvciBoaWdobHkgY3VzdG9taXphYmxlCisgICAgICBsb2dnaW5nLjxici8+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT46IEFwYWNoZSBMb2c0aiAoMS54KSBpcyBub3QgZGV2ZWxvcGVkIGFueSBtb3JlLiBMYXN0CisgICAgICByZWxlYXNlIGlzIDEuMi4xNyBmcm9tIDI2IE1heSAyMDEyIGFuZCBjb250YWlucyB2dWxuZXJhYmlsaXR5IGlzc3Vlcy48L3RkPgorICAgIDx0ZD5CdWlsZExpc3RlbmVyPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjWG1sTG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPldyaXRlcyB0aGUgYnVpbGQgaW5mb3JtYXRpb24gdG8gYW4gWE1MIGZpbGUuPC90ZD4KLSAgICA8dGQgd2lkdGg9IjM0JSI+QnVpbGRMb2dnZXI8L3RkPgorICAgIDx0ZD48Y29kZT48YSBocmVmPSIjWG1sTG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPldyaXRlcyB0aGUgYnVpbGQgaW5mb3JtYXRpb24gdG8gYW4gWE1MIGZpbGUuPC90ZD4KKyAgICA8dGQ+QnVpbGRMb2dnZXI8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPjxjb2RlPjxhIGhyZWY9IiNUaW1lc3RhbXBlZExvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQuVGltZXN0YW1wZWRMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPlByaW50cyB0aGUgdGltZSB0aGF0IGEgYnVpbGQgZmluaXNoZWQ8L3RkPgotICAgIDx0ZCB3aWR0aD0iMzQlIj5CdWlsZExvZ2dlcjwvdGQ+CisgICAgPHRkPjxjb2RlPjxhIGhyZWY9IiNUaW1lc3RhbXBlZExvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQuVGltZXN0YW1wZWRMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPlByaW50cyB0aGUgdGltZSB0aGF0IGEgYnVpbGQgZmluaXNoZWQ8L3RkPgorICAgIDx0ZD5CdWlsZExvZ2dlcjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzJSI+PGNvZGU+PGEgaHJlZj0iI0JpZ1Byb2plY3RMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkJpZ1Byb2plY3RMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzMyUiPlByaW50cyB0aGUgcHJvamVjdCBuYW1lIGV2ZXJ5IHRhcmdldDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI0JpZ1Byb2plY3RMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkJpZ1Byb2plY3RMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPlByaW50cyB0aGUgcHJvamVjdCBuYW1lIGV2ZXJ5IHRhcmdldDwvdGQ+CisgICAgPHRkPkJ1aWxkTG9nZ2VyPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjU2ltcGxlQmlnUHJvamVjdExvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuU2ltcGxlQmlnUHJvamVjdExvZ2dlcjwvYT48L2NvZGU+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+UHJpbnRzIHRoZSBwcm9qZWN0IG5hbWUgZm9yIHN1YnByb2plY3RzIG9ubHksIG90aGVyd2lzZSBsaWtlIE5vQmFubmVyTG9nZ2VyIDxlbT5TaW5jZSBBbnQgMS44LjE8L2VtPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSIzNCUiPkJ1aWxkTG9nZ2VyPC90ZD4KKyAgICA8dGQ+PGNvZGU+PGEgaHJlZj0iI1NpbXBsZUJpZ1Byb2plY3RMb2dnZXIiPm9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLlNpbXBsZUJpZ1Byb2plY3RMb2dnZXI8L2E+PC9jb2RlPjwvdGQ+CisgICAgPHRkPlByaW50cyB0aGUgcHJvamVjdCBuYW1lIGZvciBzdWJwcm9qZWN0cyBvbmx5LCBvdGhlcndpc2UgbGlrZSBOb0Jhbm5lckxvZ2dlciA8ZW0+U2luY2UgQW50CisgICAgMS44LjE8L2VtPjwvdGQ+CisgICAgPHRkPkJ1aWxkTG9nZ2VyPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzMlIj48Y29kZT48YSBocmVmPSIjUHJvZmlsZUxvZ2dlciI+b3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuUHJvZmlsZUxvZ2dlcjwvYT48L2NvZGU+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjMzJSI+VGhlIGRlZmF1bHQgbG9nZ2VyLCB3aXRoIHN0YXJ0IHRpbWVzLCBlbmQgdGltZXMgYW5kCi0gICAgZHVyYXRpb25zIGFkZGVkIGZvciBlYWNoIHRhc2sgYW5kIHRhcmdldC48L3RkPgotICAgIDx0ZCB3aWR0aD0iMzQlIj5CdWlsZExvZ2dlcjwvdGQ+CisgICAgPHRkPjxjb2RlPjxhIGhyZWY9IiNQcm9maWxlTG9nZ2VyIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Qcm9maWxlTG9nZ2VyPC9hPjwvY29kZT48L3RkPgorICAgIDx0ZD5UaGUgZGVmYXVsdCBsb2dnZXIsIHdpdGggc3RhcnQgdGltZXMsIGVuZCB0aW1lcyBhbmQgZHVyYXRpb25zIGFkZGVkIGZvciBlYWNoIHRhc2sgYW5kCisgICAgICB0YXJnZXQuPC90ZD4KKyAgICA8dGQ+QnVpbGRMb2dnZXI8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotCi0KLTxoMz48YSBuYW1lPSJEZWZhdWx0TG9nZ2VyIj5EZWZhdWx0TG9nZ2VyPC9hPjwvaDM+Cis8aDMgaWQ9IkRlZmF1bHRMb2dnZXIiPkRlZmF1bHRMb2dnZXI8L2gzPgogPHA+U2ltcGx5IHJ1biBBbnQgbm9ybWFsbHksIG9yOjwvcD4KLTxibG9ja3F1b3RlPgotPHA+PGNvZGU+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjwvY29kZT48L3A+Ci08L2Jsb2NrcXVvdGU+CiAKKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyPC9wcmU+CiAKLQotPGgzPjxhIG5hbWU9Ik5vQmFubmVyTG9nZ2VyIj5Ob0Jhbm5lckxvZ2dlcjwvYT48L2gzPgorPGgzIGlkPSJOb0Jhbm5lckxvZ2dlciI+Tm9CYW5uZXJMb2dnZXI8L2gzPgogPHA+UmVtb3ZlcyBvdXRwdXQgb2YgZW1wdHkgdGFyZ2V0IG91dHB1dC48L3A+Ci08YmxvY2txdW90ZT4KLTxwPjxjb2RlPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lk5vQmFubmVyTG9nZ2VyPC9jb2RlPjwvcD4KLTwvYmxvY2txdW90ZT4KIAorPHByZSBjbGFzcz0iaW5wdXQiPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lk5vQmFubmVyTG9nZ2VyPC9wcmU+CiAKLQotPGgzPjxhIG5hbWU9Ik1haWxMb2dnZXIiPk1haWxMb2dnZXI8L2E+PC9oMz4KLTxwPlRoZSBNYWlsTG9nZ2VyIGNhcHR1cmVzIGFsbCBvdXRwdXQgbG9nZ2VkIHRocm91Z2ggRGVmYXVsdExvZ2dlciAoc3RhbmRhcmQgQW50Ci1vdXRwdXQpIGFuZCB3aWxsIHNlbmQgc3VjY2VzcyBhbmQgZmFpbHVyZSBtZXNzYWdlcyB0byB1bmlxdWUgZS1tYWlsIGxpc3RzLCB3aXRoCi1jb250cm9sIGZvciB0dXJuaW5nIG9mZiBzdWNjZXNzIG9yIGZhaWx1cmUgbWVzc2FnZXMgaW5kaXZpZHVhbGx5LjwvcD4KKzxoMyBpZD0iTWFpbExvZ2dlciI+TWFpbExvZ2dlcjwvaDM+Cis8cD5UaGUgTWFpbExvZ2dlciBjYXB0dXJlcyBhbGwgb3V0cHV0IGxvZ2dlZCB0aHJvdWdoIERlZmF1bHRMb2dnZXIgKHN0YW5kYXJkIEFudCBvdXRwdXQpIGFuZCB3aWxsCitzZW5kIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8gdW5pcXVlIGUtbWFpbCBsaXN0cywgd2l0aCBjb250cm9sIGZvciB0dXJuaW5nIG9mZiBzdWNjZXNzIG9yCitmYWlsdXJlIG1lc3NhZ2VzIGluZGl2aWR1YWxseS48L3A+CiAKIDxwPlByb3BlcnRpZXMgY29udHJvbGxpbmcgdGhlIG9wZXJhdGlvbiBvZiBNYWlsTG9nZ2VyOjwvcD4KLTx0YWJsZSBib3JkZXI9IjEiIGNlbGxzcGFjaW5nPSIxIiB3aWR0aD0iMTAwJSIgaWQ9IkF1dG9OdW1iZXIyIj4KKzx0YWJsZT4KICAgPHRyPgotICAgIDx0aCB3aWR0aD0iMzM3Ij5Qcm9wZXJ0eTwvdGg+Ci0gICAgPHRoIHdpZHRoPSI2MyUiPkRlc2NyaXB0aW9uPC90aD4KLSAgICA8dGggd2lkdGg9IjYzJSI+UmVxdWlyZWQ8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5Qcm9wZXJ0eTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+UmVxdWlyZWQ8L3RoPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIubWFpbGhvc3QgPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+TWFpbCBzZXJ2ZXIgdG8gdXNlPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgJnF1b3Q7bG9jYWxob3N0JnF1b3Q7PC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5tYWlsaG9zdDwvY29kZT48L3RkPgorICAgIDx0ZD5NYWlsIHNlcnZlciB0byB1c2U8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5sb2NhbGhvc3Q8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnBvcnQgPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+U01UUCBQb3J0IGZvciB0aGUgTWFpbCBzZXJ2ZXI8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5ObywgZGVmYXVsdCAmcXVvdDsyNSZxdW90OzwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIucG9ydDwvY29kZT48L3RkPgorICAgIDx0ZD5TTVRQIFBvcnQgZm9yIHRoZSBNYWlsIHNlcnZlcjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPjI1PC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci51c2VyPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+dXNlciBuYW1lIGZvciBTTVRQIGF1dGg8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5ZZXMsIGlmIFNNVFAgYXV0aCBpcyByZXF1aXJlZCBvbiB5b3VyIFNNVFAgc2VydmVyPGJyPgotICAgIHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50IHVzaW5nIE1pbWUgYW5kIHJlcXVpcmVzIEphdmFNYWlsPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci51c2VyPC9jb2RlPjwvdGQ+CisgICAgPHRkPnVzZXIgbmFtZSBmb3IgU01UUCBhdXRoPC90ZD4KKyAgICA8dGQ+WWVzLCBpZiBTTVRQIGF1dGggaXMgcmVxdWlyZWQgb24geW91ciBTTVRQIHNlcnZlcjxici8+IHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50CisgICAgICB1c2luZyBNSU1FIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5wYXNzd29yZDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPnBhc3N3b3JkIGZvciBTTVRQIGF1dGg8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5ZZXMsIGlmIFNNVFAgYXV0aCBpcyByZXF1aXJlZCBvbiB5b3VyIFNNVFAgc2VydmVyPGJyPgotICAgIHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50IHVzaW5nIE1pbWUgYW5kIHJlcXVpcmVzIEphdmFNYWlsPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5wYXNzd29yZDwvY29kZT48L3RkPgorICAgIDx0ZD5wYXNzd29yZCBmb3IgU01UUCBhdXRoPC90ZD4KKyAgICA8dGQ+WWVzLCBpZiBTTVRQIGF1dGggaXMgcmVxdWlyZWQgb24geW91ciBTTVRQIHNlcnZlcjxici8+IHRoZSBlbWFpbCBtZXNzYWdlIHdpbGwgYmUgdGhlbiBzZW50CisgICAgICB1c2luZyBNSU1FIGFuZCByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5zc2w8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5vbiBvciB0cnVlIGlmIHNzbCBpcyBuZWVkZWQ8YnI+Ci0gICAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIEphdmFNYWlsPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Ci0gICAgbm88L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnNzbDwvY29kZT48L3RkPgorICAgIDx0ZD5vbiBvciB0cnVlIGlmIFNTTCBpcyBuZWVkZWQ8YnIvPlRoaXMgZmVhdHVyZSByZXF1aXJlcyBKYXZhTWFpbDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLmZyb208L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5NYWlsICZxdW90O2Zyb20mcXVvdDsgYWRkcmVzczwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPlllcywgaWYgbWFpbCBuZWVkcyB0byBiZSBzZW50PC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5mcm9tPC9jb2RlPjwvdGQ+CisgICAgPHRkPk1haWwgPHE+ZnJvbTwvcT4gYWRkcmVzczwvdGQ+CisgICAgPHRkPlllcywgaWYgbWFpbCBuZWVkcyB0byBiZSBzZW50PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnJlcGx5dG88L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5NYWlsICZxdW90O3JlcGx5dG8mcXVvdDsgYWRkcmVzcyhlcyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5yZXBseXRvPC9jb2RlPjwvdGQ+CisgICAgPHRkPk1haWwgPHE+cmVwbHl0bzwvcT4gYWRkcmVzcyhlcyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLmZhaWx1cmUubm90aWZ5IDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPlNlbmQgYnVpbGQgZmFpbHVyZSBlLW1haWxzPzwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDs8L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLmZhaWx1cmUubm90aWZ5PC9jb2RlPjwvdGQ+CisgICAgPHRkPlNlbmQgYnVpbGQgZmFpbHVyZSBlLW1haWxzPzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnN1Y2Nlc3Mubm90aWZ5IDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPlNlbmQgYnVpbGQgc3VjY2VzcyBlLW1haWxzPzwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0ICZxdW90O3RydWUmcXVvdDs8L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnN1Y2Nlc3Mubm90aWZ5PC9jb2RlPjwvdGQ+CisgICAgPHRkPlNlbmQgYnVpbGQgc3VjY2VzcyBlLW1haWxzPzwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IDxxPnRydWU8L3E+PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLmZhaWx1cmUudG8gPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+QWRkcmVzcyhlcykgdG8gc2VuZCBmYWlsdXJlIG1lc3NhZ2VzIHRvLCBjb21tYS1zZXBhcmF0ZWQ8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5ZZXMsIGlmIGZhaWx1cmUgbWFpbCBpcyB0byBiZSBzZW50PC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5mYWlsdXJlLnRvPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZHJlc3MoZXMpIHRvIHNlbmQgZmFpbHVyZSBtZXNzYWdlcyB0bywgY29tbWEtc2VwYXJhdGVkPC90ZD4KKyAgICA8dGQ+WWVzLCBpZiBmYWlsdXJlIG1haWwgaXMgdG8gYmUgc2VudDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5zdWNjZXNzLnRvIDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPkFkZHJlc3MoZXMpIHRvIHNlbmQgc3VjY2VzcyBtZXNzYWdlcyB0bywgY29tbWEtc2VwYXJhdGVkPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+WWVzLCBpZiBzdWNjZXNzIG1haWwgaXMgdG8gYmUgc2VudDwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIuc3VjY2Vzcy50bzwvY29kZT48L3RkPgorICAgIDx0ZD5BZGRyZXNzKGVzKSB0byBzZW5kIHN1Y2Nlc3MgbWVzc2FnZXMgdG8sIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkPlllcywgaWYgc3VjY2VzcyBtYWlsIGlzIHRvIGJlIHNlbnQ8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuZmFpbHVyZS5jYyA8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5BZGRyZXNzKGVzKSB0byBzZW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8gY2FyYm9uIGNvcHkgKGNjKSwgY29tbWEtc2VwYXJhdGVkPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm88L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLmZhaWx1cmUuY2M8L2NvZGU+PC90ZD4KKyAgICA8dGQ+QWRkcmVzcyhlcykgdG8gc2VuZCBmYWlsdXJlIG1lc3NhZ2VzIHRvIGNhcmJvbiBjb3B5IChjYyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnN1Y2Nlc3MuY2MgPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+QWRkcmVzcyhlcykgdG8gc2VuZCBzdWNjZXNzIG1lc3NhZ2VzIHRvIGNhcmJvbiBjb3B5IChjYyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5zdWNjZXNzLmNjPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZHJlc3MoZXMpIHRvIHNlbmQgc3VjY2VzcyBtZXNzYWdlcyB0byBjYXJib24gY29weSAoY2MpLCBjb21tYS1zZXBhcmF0ZWQ8L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5mYWlsdXJlLmJjYyA8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5BZGRyZXNzKGVzKSB0byBzZW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmxpbmQgY2FyYm9uIGNvcHkgKGJjYyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5mYWlsdXJlLmJjYzwvY29kZT48L3RkPgorICAgIDx0ZD5BZGRyZXNzKGVzKSB0byBzZW5kIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmxpbmQgY2FyYm9uIGNvcHkgKGJjYyksIGNvbW1hLXNlcGFyYXRlZDwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLnN1Y2Nlc3MuYmNjIDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPkFkZHJlc3MoZXMpIHRvIHNlbmQgc3VjY2VzcyBtZXNzYWdlcyB0byBibGluZCBjYXJib24gY29weSAoYmNjKSwgY29tbWEtc2VwYXJhdGVkPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm88L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnN1Y2Nlc3MuYmNjPC9jb2RlPjwvdGQ+CisgICAgPHRkPkFkZHJlc3MoZXMpIHRvIHNlbmQgc3VjY2VzcyBtZXNzYWdlcyB0byBibGluZCBjYXJib24gY29weSAoYmNjKSwgY29tbWEtc2VwYXJhdGVkPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuZmFpbHVyZS5zdWJqZWN0IDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPlN1YmplY3Qgb2YgZmFpbGVkIGJ1aWxkPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgJnF1b3Q7QnVpbGQgRmFpbHVyZSZxdW90OzwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIuZmFpbHVyZS5zdWJqZWN0PC9jb2RlPjwvdGQ+CisgICAgPHRkPlN1YmplY3Qgb2YgZmFpbGVkIGJ1aWxkPC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgPHE+QnVpbGQgRmFpbHVyZTwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuc3VjY2Vzcy5zdWJqZWN0IDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPlN1YmplY3Qgb2Ygc3VjY2Vzc2Z1bCBidWlsZDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0ICZxdW90O0J1aWxkIFN1Y2Nlc3MmcXVvdDs8L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnN1Y2Nlc3Muc3ViamVjdDwvY29kZT48L3RkPgorICAgIDx0ZD5TdWJqZWN0IG9mIHN1Y2Nlc3NmdWwgYnVpbGQ8L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdCA8cT5CdWlsZCBTdWNjZXNzPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5mYWlsdXJlLmJvZHk8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5GaXhlZCBib2R5IG9mIHRoZSBlbWFpbCBmb3IgYSBmYWlsZWQKLSAgICAgIGJ1aWxkLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgaXMgdG8gc2VuZCB0aGUgZnVsbCBsb2cgb3V0cHV0LjwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIuZmFpbHVyZS5ib2R5PC9jb2RlPjwvdGQ+CisgICAgPHRkPkZpeGVkIGJvZHkgb2YgdGhlIGVtYWlsIGZvciBhIGZhaWxlZCBidWlsZC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIHRvIHNlbmQgdGhlIGZ1bGwgbG9nIG91dHB1dDwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5zdWNjZXNzLmJvZHk8L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5GaXhlZCBib2R5IG9mIHRoZSBlbWFpbCBmb3IgYSBzdWNjZXNzZnVsCi0gICAgICBidWlsZC4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0IGlzIHRvIHNlbmQgdGhlIGZ1bGwgbG9nIG91dHB1dC48L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnN1Y2Nlc3MuYm9keTwvY29kZT48L3RkPgorICAgIDx0ZD5GaXhlZCBib2R5IG9mIHRoZSBlbWFpbCBmb3IgYSBzdWNjZXNzZnVsIGJ1aWxkLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgdG8gc2VuZCB0aGUgZnVsbCBsb2cgb3V0cHV0PC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB3aWR0aD0iMzM3Ij5NYWlsTG9nZ2VyLm1pbWVUeXBlPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+TUlNRS1UeXBlIG9mIHRoZSBtZXNzYWdlLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm8sIGRlZmF1bHQgaXMgdGV4dC9wbGFpbjwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIubWltZVR5cGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+TUlNRS1UeXBlIG9mIHRoZSBtZXNzYWdlLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm87IGRlZmF1bHQgaXMgPHE+dGV4dC9wbGFpbjwvcT48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuY2hhcnNldDwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPkNoYXJhY3RlciBzZXQgb2YgdGhlIG1lc3NhZ2UuICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3RkPgotICAgIDx0ZCB3aWR0aD0iNjMlIj5ObzwvdGQ+CisgICAgPHRkPjxjb2RlPk1haWxMb2dnZXIuY2hhcnNldDwvY29kZT48L3RkPgorICAgIDx0ZD5DaGFyYWN0ZXIgc2V0IG9mIHRoZSBtZXNzYWdlLiAgPGVtPlNpbmNlIEFudCAxLjguMDwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHdpZHRoPSIzMzciPk1haWxMb2dnZXIuc3RhcnR0bHMuZW5hYmxlPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+b24gb3IgdHJ1ZSBpZiBTVEFSVFRMUyBzaG91bGQgYmUgc3VwcG9ydGVkCi0gICAgKHJlcXVpcmVzIEphdmFNYWlsKS4gIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPjwvdGQ+Ci0gICAgPHRkIHdpZHRoPSI2MyUiPk5vLCBkZWZhdWx0IGlzIGZhbHNlPC90ZD4KKyAgICA8dGQ+PGNvZGU+TWFpbExvZ2dlci5zdGFydHRscy5lbmFibGU8L2NvZGU+PC90ZD4KKyAgICA8dGQ+b24gb3IgdHJ1ZSBpZiA8Y29kZT5TVEFSVFRMUzwvY29kZT4gc2hvdWxkIGJlIHN1cHBvcnRlZCAocmVxdWlyZXMgSmF2YU1haWwpLiAgPGVtPlNpbmNlIEFudAorICAgICAgMS44LjA8L2VtPjwvdGQ+CisgICAgPHRkPk5vOyBkZWZhdWx0IGlzIDxxPmZhbHNlPC9xPjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgd2lkdGg9IjMzNyI+TWFpbExvZ2dlci5wcm9wZXJ0aWVzLmZpbGUgPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+RmlsZW5hbWUgb2YgcHJvcGVydGllcyBmaWxlIHRoYXQgd2lsbCBvdmVycmlkZSBvdGhlciB2YWx1ZXMuPC90ZD4KLSAgICA8dGQgd2lkdGg9IjYzJSI+Tm88L3RkPgorICAgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnByb3BlcnRpZXMuZmlsZTwvY29kZT48L3RkPgorICAgIDx0ZD5GaWxlbmFtZSBvZiBwcm9wZXJ0aWVzIGZpbGUgdGhhdCB3aWxsIG92ZXJyaWRlIG90aGVyIHZhbHVlcy48L3RkPgorICAgIDx0ZD5ObzwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08YmxvY2txdW90ZT4KLTxwPjxjb2RlPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLk1haWxMb2dnZXI8L2NvZGU+PC9wPgotPC9ibG9ja3F1b3RlPgorPHByZSBjbGFzcz0iaW5wdXQiPmFudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLk1haWxMb2dnZXI8L3ByZT4KIAorPGgzIGlkPSJBbnNpQ29sb3JMb2dnZXIiPkFuc2lDb2xvckxvZ2dlcjwvaDM+CiAKLQotPGgzPjxhIG5hbWU9IkFuc2lDb2xvckxvZ2dlciI+QW5zaUNvbG9yTG9nZ2VyPC9hPjwvaDM+Ci0KLTxwPlRoZSBBbnNpQ29sb3JMb2dnZXIgYWRkcyBjb2xvciB0byB0aGUgc3RhbmRhcmQgQW50IG91dHB1dAotYnkgcHJlZml4aW5nIGFuZCBzdWZmaXhpbmcgQU5TSSBjb2xvciBjb2RlIGVzY2FwZSBzZXF1ZW5jZXMgdG8KLWl0LiAgSXQgaXMganVzdCBhbiBleHRlbnNpb24gb2YgPGEgaHJlZj0iI0RlZmF1bHRMb2dnZXIiPkRlZmF1bHRMb2dnZXI8L2E+Cis8cD5UaGUgQW5zaUNvbG9yTG9nZ2VyIGFkZHMgY29sb3IgdG8gdGhlIHN0YW5kYXJkIEFudCBvdXRwdXQgYnkgcHJlZml4aW5nIGFuZCBzdWZmaXhpbmcgQU5TSSBjb2xvcgorY29kZSBlc2NhcGUgc2VxdWVuY2VzIHRvIGl0LiAgSXQgaXMganVzdCBhbiBleHRlbnNpb24gb2YgPGEgaHJlZj0iI0RlZmF1bHRMb2dnZXIiPkRlZmF1bHRMb2dnZXI8L2E+CiBhbmQgaGVuY2UgcHJvdmlkZXMgYWxsIGZlYXR1cmVzIHRoYXQgRGVmYXVsdExvZ2dlciBkb2VzLjwvcD4KLTxwPkFuc2lDb2xvckxvZ2dlciBkaWZmZXJlbnRpYXRlcyB0aGUgb3V0cHV0IGJ5IGFzc2lnbmluZwotZGlmZmVyZW50IGNvbG9ycyBkZXBlbmRpbmcgdXBvbiB0aGUgdHlwZSBvZiB0aGUgbWVzc2FnZS48L3A+Ci08cD5JZiB1c2VkIHdpdGggdGhlIC1sb2dmaWxlIG9wdGlvbiwgdGhlIG91dHB1dCBmaWxlCi13aWxsIGNvbnRhaW4gYWxsIHRoZSBuZWNlc3NhcnkgZXNjYXBlIGNvZGVzIHRvCi1kaXNwbGF5IHRoZSB0ZXh0IGluIGNvbG9yaXplZCBtb2RlIHdoZW4gZGlzcGxheWVkCi1pbiB0aGUgY29uc29sZSB1c2luZyBhcHBsaWNhdGlvbnMgbGlrZSBjYXQsIG1vcmUsIGV0Yy48L3A+Ci08cD5UaGlzIGlzIGRlc2lnbmVkIHRvIHdvcmsgb24gdGVybWluYWxzIHRoYXQgc3VwcG9ydCBBTlNJCi1jb2xvciBjb2Rlcy4gIEl0IHdvcmtzIG9uIFhUZXJtLCBFVGVybSwgV2luOXggQ29uc29sZQotKHdpdGggQU5TSS5TWVMgbG9hZGVkLiksIGV0Yy48L3A+Ci08cD48U3Ryb25nPk5PVEU6PC9TdHJvbmc+Ci1JdCBkb2Vzbid0IHdvcmsgb24gV2luTlQgYW5kIHN1Y2Nlc3NvcnMsIGV2ZW4gd2hlbiBhIENPTU1BTkQuQ09NIGNvbnNvbGUgbG9hZGVkIHdpdGgKLUFOU0kuU1lTIGlzIHVzZWQuPC9wPgotPHA+SWYgdGhlIHVzZXIgd2lzaGVzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbG9ycwotd2l0aCBjdXN0b20gb25lcywgYSBmaWxlIGNvbnRhaW5pbmcgemVybyBvciBtb3JlIG9mIHRoZQotY3VzdG9tIGNvbG9yIGtleS12YWx1ZSBwYWlycyBtdXN0IGJlIGNyZWF0ZWQuICBUaGUgcmVjb2duaXplZCBrZXlzCi1hbmQgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYXJlIHNob3duIGJlbG93OjwvcD48Y29kZT48cHJlPgorPHA+QW5zaUNvbG9yTG9nZ2VyIGRpZmZlcmVudGlhdGVzIHRoZSBvdXRwdXQgYnkgYXNzaWduaW5nIGRpZmZlcmVudCBjb2xvcnMgZGVwZW5kaW5nIHVwb24gdGhlIHR5cGUKK29mIHRoZSBtZXNzYWdlLjwvcD4KKzxwPklmIHVzZWQgd2l0aCB0aGUgPGtiZD4tbG9nZmlsZTwva2JkPiBvcHRpb24sIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGNvbnRhaW4gYWxsIHRoZSBuZWNlc3NhcnkKK2VzY2FwZSBjb2RlcyB0byBkaXNwbGF5IHRoZSB0ZXh0IGluIGNvbG9yaXplZCBtb2RlIHdoZW4gZGlzcGxheWVkIGluIHRoZSBjb25zb2xlIHVzaW5nIGFwcGxpY2F0aW9ucworbGlrZSA8Y29kZT5jYXQ8L2NvZGU+LCA8Y29kZT5tb3JlPC9jb2RlPiwgZXRjLjwvcD4KKzxwPlRoaXMgaXMgZGVzaWduZWQgdG8gd29yayBvbiB0ZXJtaW5hbHMgdGhhdCBzdXBwb3J0IEFOU0kgY29sb3IgY29kZXMuICBJdCB3b3JrcyBvbiBYVGVybSwgRVRlcm0sCitXaW45eCBDb25zb2xlICh3aXRoIDxjb2RlPkFOU0kuU1lTPC9jb2RlPiBsb2FkZWQuKSwgZXRjLjwvcD4KKzxwPjxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogSXQgZG9lc24ndCB3b3JrIG9uIFdpbk5UIGFuZCBzdWNjZXNzb3JzLCBldmVuIHdoZW4KK2EgPGNvZGU+Q09NTUFORC5DT008L2NvZGU+IGNvbnNvbGUgbG9hZGVkIHdpdGggPGNvZGU+QU5TSS5TWVM8L2NvZGU+IGlzIHVzZWQuPC9wPgorPHA+SWYgdGhlIHVzZXIgd2lzaGVzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNvbG9ycyB3aXRoIGN1c3RvbSBvbmVzLCBhIGZpbGUgY29udGFpbmluZyB6ZXJvIG9yCittb3JlIG9mIHRoZSBjdXN0b20gY29sb3Iga2V5LXZhbHVlIHBhaXJzIG11c3QgYmUgY3JlYXRlZC4gIFRoZSByZWNvZ25pemVkIGtleXMgYW5kIHRoZWlyIGRlZmF1bHQKK3ZhbHVlcyBhcmUgc2hvd24gYmVsb3c6PC9wPgorPHByZT4KIEFuc2lDb2xvckxvZ2dlci5FUlJPUl9DT0xPUj0yOzMxCiBBbnNpQ29sb3JMb2dnZXIuV0FSTklOR19DT0xPUj0yOzM1CiBBbnNpQ29sb3JMb2dnZXIuSU5GT19DT0xPUj0yOzM2CiBBbnNpQ29sb3JMb2dnZXIuVkVSQk9TRV9DT0xPUj0yOzMyCi1BbnNpQ29sb3JMb2dnZXIuREVCVUdfQ09MT1I9MjszNDwvcHJlPjwvY29kZT4KLTxwPkVhY2gga2V5IHRha2VzIGFzIHZhbHVlIGEgY29sb3IgY29tYmluYXRpb24gZGVmaW5lZCBhcwotPGI+QXR0cmlidXRlO0ZvcmVncm91bmQ7QmFja2dyb3VuZDwvYj4uICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgYmFja2dyb3VuZAotdmFsdWUgaGFzIG5vdCBiZWVuIHVzZWQuPC9wPgorQW5zaUNvbG9yTG9nZ2VyLkRFQlVHX0NPTE9SPTI7MzQ8L3ByZT4KKzxwPkVhY2gga2V5IHRha2VzIGFzIHZhbHVlIGEgY29sb3IgY29tYmluYXRpb24gZGVmaW5lZCBhcyA8cT5BdHRyaWJ1dGU7Rm9yZWdyb3VuZDtCYWNrZ3JvdW5kPC9xPi4KK0luIHRoZSBhYm92ZSBleGFtcGxlLCBiYWNrZ3JvdW5kIHZhbHVlIGhhcyBub3QgYmVlbiB1c2VkLjwvcD4KIDxwPlRoaXMgZmlsZSBtdXN0IGJlIHNwZWNpZmllZCBhcyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gdmFyaWFibGUKLW5hbWVkIGFudC5sb2dnZXIuZGVmYXVsdHMgYW5kIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB1c2luZyB0aGUgLUQKLW9wdGlvbiB0byB0aGUgPGI+amF2YTwvYj4gY29tbWFuZCB0aGF0IGludm9rZXMgdGhlIEFudCBhcHBsaWNhdGlvbi4KLUFuIGVhc3kgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBhZGQgLURhbnQubG9nZ2VyLmRlZmF1bHRzPQotPGk+L3BhdGgvdG8veW91ci9maWxlPC9pPiB0byB0aGUgQU5UX09QVFMgZW52aXJvbm1lbnQgdmFyaWFibGUuCi1BbnQncyBsYXVuY2hpbmcgc2NyaXB0IHJlY29nbml6ZXMgdGhpcyBmbGFnIGFuZCB3aWxsIHBhc3MgaXQgdG8KLXRoZSBqYXZhIGNvbW1hbmQgYXBwcm9wcmlhdGVseS48L3A+Ci08cD5Gb3JtYXQ6PC9wPjxwcmU+CituYW1lZCA8Y29kZT5hbnQubG9nZ2VyLmRlZmF1bHRzPC9jb2RlPiBhbmQgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHVzaW5nIHRoZSA8a2JkPi1EPC9rYmQ+IG9wdGlvbiB0bwordGhlIDxrYmQ+amF2YTwva2JkPiBjb21tYW5kIHRoYXQgaW52b2tlcyB0aGUgQW50IGFwcGxpY2F0aW9uLiBBbiBlYXN5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8KK2FkZCA8a2JkPi1EYW50LmxvZ2dlci5kZWZhdWx0cz08L2tiZD48c2FtcCBjbGFzcz0iaW5wdXQiPi9wYXRoL3RvL3lvdXIvZmlsZTwvc2FtcD4gdG8KK3RoZSA8Y29kZT5BTlRfT1BUUzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUuIEFudCdzIGxhdW5jaGluZyBzY3JpcHQgcmVjb2duaXplcyB0aGlzIGZsYWcgYW5kIHdpbGwKK3Bhc3MgaXQgdG8gdGhlIDxrYmQ+amF2YTwva2JkPiBjb21tYW5kIGFwcHJvcHJpYXRlbHkuPC9wPgorPHA+Rm9ybWF0OjwvcD4KKzxwcmU+CiBBbnNpQ29sb3JMb2dnZXIuKj1BdHRyaWJ1dGU7Rm9yZWdyb3VuZDtCYWNrZ3JvdW5kCiAKIEF0dHJpYnV0ZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTAgLSZndDsgUmVzZXQgQWxsIEF0dHJpYnV0ZXMgKHJldHVybiB0byBub3JtYWwgbW9kZSkKLTEgLSZndDsgQnJpZ2h0IChVc3VhbGx5IHR1cm5zIG9uIEJPTEQpCi0yIC0mZ3Q7IERpbQotMyAtJmd0OyBVbmRlcmxpbmUKLTUgLSZndDsgbGluawotNyAtJmd0OyBSZXZlcnNlCi04IC0mZ3Q7IEhpZGRlbgorMCAmcmFycjsgUmVzZXQgQWxsIEF0dHJpYnV0ZXMgKHJldHVybiB0byBub3JtYWwgbW9kZSkKKzEgJnJhcnI7IEJyaWdodCAoVXN1YWxseSB0dXJucyBvbiBCT0xEKQorMiAmcmFycjsgRGltCiszICZyYXJyOyBVbmRlcmxpbmUKKzUgJnJhcnI7IGxpbmsKKzcgJnJhcnI7IFJldmVyc2UKKzggJnJhcnI7IEhpZGRlbgogCiBGb3JlZ3JvdW5kIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotMzAgLSZndDsgQmxhY2sKLTMxIC0mZ3Q7IFJlZAotMzIgLSZndDsgR3JlZW4KLTMzIC0mZ3Q7IFllbGxvdwotMzQgLSZndDsgQmx1ZQotMzUgLSZndDsgTWFnZW50YQotMzYgLSZndDsgQ3lhbgotMzcgLSZndDsgV2hpdGUKKzMwICZyYXJyOyBCbGFjaworMzEgJnJhcnI7IFJlZAorMzIgJnJhcnI7IEdyZWVuCiszMyAmcmFycjsgWWVsbG93CiszNCAmcmFycjsgQmx1ZQorMzUgJnJhcnI7IE1hZ2VudGEKKzM2ICZyYXJyOyBDeWFuCiszNyAmcmFycjsgV2hpdGUKIAogQmFja2dyb3VuZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTQwIC0mZ3Q7IEJsYWNrCi00MSAtJmd0OyBSZWQKLTQyIC0mZ3Q7IEdyZWVuCi00MyAtJmd0OyBZZWxsb3cKLTQ0IC0mZ3Q7IEJsdWUKLTQ1IC0mZ3Q7IE1hZ2VudGEKLTQ2IC0mZ3Q7IEN5YW4KLTQ3IC0mZ3Q7IFdoaXRlPC9wcmU+Cis0MCAmcmFycjsgQmxhY2sKKzQxICZyYXJyOyBSZWQKKzQyICZyYXJyOyBHcmVlbgorNDMgJnJhcnI7IFllbGxvdworNDQgJnJhcnI7IEJsdWUKKzQ1ICZyYXJyOyBNYWdlbnRhCis0NiAmcmFycjsgQ3lhbgorNDcgJnJhcnI7IFdoaXRlPC9wcmU+CiAKLTxibG9ja3F1b3RlPgotPHA+PGNvZGU+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuQW5zaUNvbG9yTG9nZ2VyPC9jb2RlPjwvcD4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5BbnNpQ29sb3JMb2dnZXI8L3ByZT4KIAotCi0KLTxoMz48YSBuYW1lPSJMb2c0akxpc3RlbmVyIj5Mb2c0akxpc3RlbmVyPC9hPjwvaDM+Ci08cD48Yj5EZXByZWNhdGVkOjwvYj4gQXBhY2hlIExvZzRqICgxKSBpcyBub3QgZGV2ZWxvcGVkIGFueSBtb3JlLiBMYXN0Ci1yZWxlYXNlIGlzIDEuMi4xNyBmcm9tIDI2LU1heS0yMDEyIGFuZCBjb250YWlucyB2dWxuZXJhYmlsaXR5IGlzc3Vlcy48L3A+Ci08cD5QYXNzZXMgYnVpbGQgZXZlbnRzIHRvIExvZzRqLCB1c2luZyB0aGUgZnVsbCBjbGFzc25hbWUncyBvZiB0aGUgZ2VuZXJhdG9yIG9mCi1lYWNoIGJ1aWxkIGV2ZW50IGFzIHRoZSBjYXRlZ29yeTo8L3A+Cis8aDMgaWQ9IkxvZzRqTGlzdGVuZXIiPkxvZzRqTGlzdGVuZXI8L2gzPgorPHA+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT46IEFwYWNoZSBMb2c0aiAoMSkgaXMgbm90IGRldmVsb3BlZCBhbnkgbW9yZS4gTGFzdCByZWxlYXNlIGlzIDEuMi4xNworZnJvbSAyNiBNYXkgMjAxMiBhbmQgY29udGFpbnMgdnVsbmVyYWJpbGl0eSBpc3N1ZXMuPC9wPgorPHA+UGFzc2VzIGJ1aWxkIGV2ZW50cyB0byBMb2c0aiwgdXNpbmcgdGhlIGZ1bGwgY2xhc3NuYW1lJ3Mgb2YgdGhlIGdlbmVyYXRvciBvZiBlYWNoIGJ1aWxkIGV2ZW50IGFzCit0aGUgY2F0ZWdvcnk6PC9wPgogPHVsPgotICA8bGk+YnVpbGQgc3RhcnRlZCAvIGJ1aWxkIGZpbmlzaGVkIC0gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDwvbGk+Ci0gIDxsaT50YXJnZXQgc3RhcnRlZCAvIHRhcmdldCBmaW5pc2hlZCAtIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDwvbGk+Ci0gIDxsaT50YXNrIHN0YXJ0ZWQgLyB0YXNrIGZpbmlzaGVkIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIHRhc2s8L2xpPgotICA8bGk+bWVzc2FnZSBsb2dnZWQgLSB0aGUgY2xhc3NuYW1lIG9mIG9uZSBvZiB0aGUgYWJvdmUsIHNvIGlmIGEgdGFzayBsb2dzIGEKLSAgbWVzc2FnZSwgaXRzIGNsYXNzbmFtZSBpcyB0aGUgY2F0ZWdvcnkgdXNlZCwgYW5kIHNvIG9uLjwvbGk+CisgIDxsaT5idWlsZCBzdGFydGVkIC8gYnVpbGQgZmluaXNoZWQmbWRhc2g7PGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q8L2NvZGU+PC9saT4KKyAgPGxpPnRhcmdldCBzdGFydGVkIC8gdGFyZ2V0IGZpbmlzaGVkJm1kYXNoOzxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXJnZXQ8L2NvZGU+PC9saT4KKyAgPGxpPnRhc2sgc3RhcnRlZCAvIHRhc2sgZmluaXNoZWQmbWRhc2g7dGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUgb2YgdGhlIHRhc2s8L2xpPgorICA8bGk+bWVzc2FnZSBsb2dnZWQmbWRhc2g7dGhlIGNsYXNzbmFtZSBvZiBvbmUgb2YgdGhlIGFib3ZlLCBzbyBpZiBhIHRhc2sgbG9ncyBhIG1lc3NhZ2UsIGl0cworICAgIGNsYXNzbmFtZSBpcyB0aGUgY2F0ZWdvcnkgdXNlZCwgYW5kIHNvIG9uLjwvbGk+CiA8L3VsPgotPHA+QWxsIHN0YXJ0IGV2ZW50cyBhcmUgbG9nZ2VkIGFzIElORk8uJm5ic3A7IEZpbmlzaCBldmVudHMgYXJlIGVpdGhlciBsb2dnZWQgYXMKLUlORk8gb3IgRVJST1IgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGJ1aWxkIGZhaWxlZCBkdXJpbmcgdGhhdCBzdGFnZS4gTWVzc2FnZQotZXZlbnRzIGFyZSBsb2dnZWQgYWNjb3JkaW5nIHRvIHRoZWlyIEFudCBsb2dnaW5nIGxldmVsLCBtYXBwaW5nIGRpcmVjdGx5IHRvIGEKLWNvcnJlc3BvbmRpbmcgTG9nNGogbGV2ZWwuPC9wPgorPHA+QWxsIHN0YXJ0IGV2ZW50cyBhcmUgbG9nZ2VkIGFzIElORk8uIEZpbmlzaCBldmVudHMgYXJlIGVpdGhlciBsb2dnZWQgYXMgSU5GTyBvciBFUlJPUiBkZXBlbmRpbmcKK29uIHdoZXRoZXIgdGhlIGJ1aWxkIGZhaWxlZCBkdXJpbmcgdGhhdCBzdGFnZS4gTWVzc2FnZSBldmVudHMgYXJlIGxvZ2dlZCBhY2NvcmRpbmcgdG8gdGhlaXIgQW50Citsb2dnaW5nIGxldmVsLCBtYXBwaW5nIGRpcmVjdGx5IHRvIGEgY29ycmVzcG9uZGluZyBMb2c0aiBsZXZlbC48L3A+CiAKLTxibG9ja3F1b3RlPgotPHA+PGNvZGU+YW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Mb2c0akxpc3RlbmVyPC9jb2RlPjwvcD4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxpc3RlbmVyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkxvZzRqTGlzdGVuZXI8L3ByZT4KIAotPHA+VG8gdXNlIExvZzRqIHlvdSB3aWxsIG5lZWQgdGhlIExvZzRqIEpBUiBmaWxlIGFuZCBhICdsb2c0ai5wcm9wZXJ0aWVzJwotY29uZmlndXJhdGlvbiBmaWxlLiAgQm90aCBzaG91bGQgYmUgcGxhY2VkIHNvbWV3aGVyZSBpbiB5b3VyIEFudAotY2xhc3NwYXRoLiBJZiB0aGUgbG9nNGoucHJvcGVydGllcyBpcyBpbiB5b3VyIHByb2plY3Qgcm9vdCBmb2xkZXIgeW91IGNhbgotYWRkIHRoaXMgd2l0aCA8aT4tbGliPC9pPiBvcHRpb246PC9wPgorPHA+VG8gdXNlIExvZzRqIHlvdSB3aWxsIG5lZWQgdGhlIExvZzRqIEpBUiBmaWxlIGFuZCBhIDxzYW1wPmxvZzRqLnByb3BlcnRpZXM8L3NhbXA+IGNvbmZpZ3VyYXRpb24KK2ZpbGUuICBCb3RoIHNob3VsZCBiZSBwbGFjZWQgc29tZXdoZXJlIGluIHlvdXIgQW50IGNsYXNzcGF0aC4gSWYgdGhlIDxzYW1wPmxvZzRqLnByb3BlcnRpZXM8L3NhbXA+CitpcyBpbiB5b3VyIHByb2plY3Qgcm9vdCBmb2xkZXIgeW91IGNhbiBhZGQgdGhpcyB3aXRoIDxrYmQ+LWxpYjwva2JkPiBvcHRpb246PC9wPgogCi08YmxvY2txdW90ZT4KLTxwcmU+PGNvZGU+YW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Mb2c0akxpc3RlbmVyIC1saWIgLjwvY29kZT48L3ByZT4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxpc3RlbmVyIG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLkxvZzRqTGlzdGVuZXIgLWxpYiAuPC9wcmU+CiAKLTxwPklmLCBmb3IgZXhhbXBsZSwgeW91IHdhbnRlZCB0byBjYXB0dXJlIHRoZSBzYW1lIGluZm9ybWF0aW9uIG91dHB1dCB0byB0aGUKLWNvbnNvbGUgYnkgdGhlIERlZmF1bHRMb2dnZXIgYW5kIHNlbmQgaXQgdG8gYSBmaWxlIG5hbWVkICdidWlsZC5sb2cnLCB5b3UKLWNvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb246PC9wPgorPHA+SWYsIGZvciBleGFtcGxlLCB5b3Ugd2FudGVkIHRvIGNhcHR1cmUgdGhlIHNhbWUgaW5mb3JtYXRpb24gb3V0cHV0IHRvIHRoZSBjb25zb2xlIGJ5IHRoZQorRGVmYXVsdExvZ2dlciBhbmQgc2VuZCBpdCB0byBhIGZpbGUgbmFtZWQgPHNhbXA+YnVpbGQubG9nPC9zYW1wPiwgeW91IGNvdWxkIHVzZSB0aGUgZm9sbG93aW5nCitjb25maWd1cmF0aW9uOjwvcD4KIAotPGJsb2NrcXVvdGU+Ci08cHJlPjxjb2RlPmxvZzRqLnJvb3RMb2dnZXI9RVJST1IsIExvZ0ZpbGUKKzxwcmU+Citsb2c0ai5yb290TG9nZ2VyPUVSUk9SLCBMb2dGaWxlCiBsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdD1JTkZPCiBsb2c0ai5sb2dnZXIub3JnLmFwYWNoZS50b29scy5hbnQuVGFyZ2V0PUlORk8KIGxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcz1JTkZPCkBAIC00MTEsMjggKzM3MiwyNiBAQAogbG9nNGouYXBwZW5kZXIuTG9nRmlsZT1vcmcuYXBhY2hlLmxvZzRqLkZpbGVBcHBlbmRlcgogbG9nNGouYXBwZW5kZXIuTG9nRmlsZS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CiBsb2c0ai5hcHBlbmRlci5Mb2dGaWxlLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJTZyXSAlOGN7MX0gOiAlbSVuCi1sb2c0ai5hcHBlbmRlci5Mb2dGaWxlLmZpbGU9YnVpbGQubG9nCi08L2NvZGU+PC9wcmU+Ci08L2Jsb2NrcXVvdGU+Citsb2c0ai5hcHBlbmRlci5Mb2dGaWxlLmZpbGU9YnVpbGQubG9nPC9wcmU+CiAKLTxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbmZpZ3VyaW5nIExvZzRKIHNlZSA8YSBocmVmPSJodHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvZG9jdW1lbnRhdGlvbi5odG1sIj5pdHMKLWRvY3VtZW50YXRpb24gcGFnZTwvYT4uPC9wPgorPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29uZmlndXJpbmcgTG9nNEogc2VlIDxhIGhyZWY9Imh0dHBzOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqLzEuMi8iCit0YXJnZXQ9Il90b3AiPml0cyBkb2N1bWVudGF0aW9uIHBhZ2U8L2E+LjwvcD4KIAogPGg0PlVzaW5nIHRoZSBMb2c0aiAxLjIgQnJpZGdlPC9oND4KLVlvdSBjb3VsZCB1c2UgdGhlIDxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovMi54L2xvZzRqLTEuMi1hcGkvaW5kZXguaHRtbCI+TG9nNGogQnJpZGdlPC9hPgotaWYgeW91ciBhcHBsaWNhdGlvbiBpcyB3cml0dGVuIGFnYWluc3QgdGhlIExvZzRqICgxLngpIEFQSSwgYnV0IHlvdSB3YW50IHRvIHVzZSB0aGUgTG9nNGogMi54IHJ1bnRpbWUuCi1Gb3IgdXNpbmcgdGhlIGJyaWRnZSB3aXRoIEFudCB5b3UgaGF2ZSB0byBhZGQKKzxwPllvdSBjb3VsZCB1c2UgdGhlIDxhIGhyZWY9Imh0dHBzOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqLzIueC9sb2c0ai0xLjItYXBpL2luZGV4Lmh0bWwiCit0YXJnZXQ9Il90b3AiPkxvZzRqIEJyaWRnZTwvYT4gaWYgeW91ciBhcHBsaWNhdGlvbiBpcyB3cml0dGVuIGFnYWluc3QgdGhlIExvZzRqICgxLngpIEFQSSwgYnV0IHlvdQord2FudCB0byB1c2UgdGhlIExvZzRqIDIueCBydW50aW1lLiAgRm9yIHVzaW5nIHRoZSBicmlkZ2Ugd2l0aCBBbnQgeW91IGhhdmUgdG8gYWRkPC9wPgogPHVsPgotICA8bGk+bG9nNGotMS4yLWFwaS0ke2xvZzRqLnZlcnNpb259LmphcjwvbGk+Ci0gIDxsaT5sb2c0ai1hcGktJHtsb2c0ai52ZXJzaW9ufS5qYXI8L2xpPgotICA8bGk+bG9nNGotY29yZS0ke2xvZzRqLnZlcnNpb259LmphcjwvbGk+Ci0gIDxsaT5sb2c0ajIueG1sPC9saT4KKyAgPGxpPjxzYW1wPmxvZzRqLTEuMi1hcGktJHtsb2c0ai52ZXJzaW9ufS5qYXI8L3NhbXA+PC9saT4KKyAgPGxpPjxzYW1wPmxvZzRqLWFwaS0ke2xvZzRqLnZlcnNpb259Lmphcjwvc2FtcD48L2xpPgorICA8bGk+PHNhbXA+bG9nNGotY29yZS0ke2xvZzRqLnZlcnNpb259Lmphcjwvc2FtcD48L2xpPgorICA8bGk+PHNhbXA+bG9nNGoyLnhtbDwvc2FtcD48L2xpPgogPC91bD4KLXRvIHlvdXIgY2xhc3NwYXRoIChlLmcuIHZpYSB0aGUgPGNvZGU+LWxpYjwvY29kZT4gb3B0aW9uKS4KLShGb3IgdXNpbmcgdGhlIGJyaWRnZSBBbnQgMS45LjEwLzEuMTAuMiBvciBoaWdoZXIgaXMgcmVxdWlyZWQuKQotVHJhbnNsYXRpbmcgdGhlIDEueCBwcm9wZXJ0aWVzIGZpbGUgaW50byB0aGUgMi54IHhtbCBzeW50YXggd291bGQgcmVzdWx0IGluCi08YmxvY2txdW90ZT4KLTxwcmU+PGNvZGU+Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OworPHA+dG8geW91ciBjbGFzc3BhdGgsIGUuZy4gdmlhIHRoZSA8a2JkPi1saWI8L2tiZD4gb3B0aW9uLiAgKEZvciB1c2luZyB0aGUgYnJpZGdlLCBBbnQKKzEuOS4xMC8xLjEwLjIgb3IgaGlnaGVyIGlzIHJlcXVpcmVkLikgIFRyYW5zbGF0aW5nIHRoZSAxLnggcHJvcGVydGllcyBmaWxlIGludG8gdGhlIDIueCBYTUwgc3ludGF4Cit3b3VsZCByZXN1bHQgaW48L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OwogJmx0O0NvbmZpZ3VyYXRpb24gc3RhdHVzPSZxdW90O1dBUk4mcXVvdDsmZ3Q7CiAgICZsdDtBcHBlbmRlcnMmZ3Q7CiAgICAgJmx0O0ZpbGUgbmFtZT0mcXVvdDtmaWxlJnF1b3Q7IGZpbGVOYW1lPSZxdW90O2J1aWxkLmxvZyZxdW90OyZndDsKQEAgLTQ1MCw1NSArNDA5LDM0IEBACiAgICAgJmx0O0xvZ2dlciBuYW1lPSZxdW90O29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzJnF1b3Q7IGxldmVsPSZxdW90O0lORk8mcXVvdDsvJmd0OwogICAgICZsdDtMb2dnZXIgbmFtZT0mcXVvdDtvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvJnF1b3Q7IGxldmVsPSZxdW90O1dBUk4mcXVvdDsvJmd0OwogICAmbHQ7L0xvZ2dlcnMmZ3Q7Ci0mbHQ7L0NvbmZpZ3VyYXRpb24mZ3Q7Ci08L2NvZGU+PC9wcmU+Ci08L2Jsb2NrcXVvdGU+CismbHQ7L0NvbmZpZ3VyYXRpb24mZ3Q7PC9wcmU+CiAKKzxoMyBpZD0iWG1sTG9nZ2VyIj5YbWxMb2dnZXI8L2gzPgorPHA+V3JpdGVzIGFsbCBidWlsZCBpbmZvcm1hdGlvbiBvdXQgdG8gYW4gWE1MIGZpbGUgbmFtZWQgPHNhbXA+bG9nLnhtbDwvc2FtcD4sIG9yIHRoZSB2YWx1ZSBvZgordGhlIDxjb2RlPlhtbExvZ2dlci5maWxlPC9jb2RlPiBwcm9wZXJ0eSBpZiBwcmVzZW50LCB3aGVuIHVzZWQgYXMgYSBsaXN0ZW5lci4gV2hlbiB1c2VkIGFzIGEgbG9nZ2VyLAoraXQgd3JpdGVzIGFsbCBvdXRwdXQgdG8gZWl0aGVyIHRoZSBjb25zb2xlIG9yIHRvIHRoZSB2YWx1ZSBvZiA8a2JkPi1sb2dmaWxlPC9rYmQ+LiBXaGV0aGVyIHVzZWQgYXMKK2EgbGlzdGVuZXIgb3IgbG9nZ2VyLCB0aGUgb3V0cHV0IGlzIG5vdCBnZW5lcmF0ZWQgdW50aWwgdGhlIGJ1aWxkIGlzIGNvbXBsZXRlLCBhcyBpdCBidWZmZXJzIHRoZQoraW5mb3JtYXRpb24gaW4gb3JkZXIgdG8gcHJvdmlkZSB0aW1pbmcgaW5mb3JtYXRpb24gZm9yIHRhc2ssIHRhcmdldHMsIGFuZCB0aGUgcHJvamVjdC48L3A+Cis8cD5CeSBkZWZhdWx0IHRoZSBYTUwgZmlsZSBjcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGFuIFhTTFQgZmlsZSA8c2FtcD5sb2cueHNsPC9zYW1wPiBpbiB0aGUgY3VycmVudAorZGlyZWN0b3J5OyBsb29rIGluIDxzYW1wPkFOVF9IT01FL2V0Yzwvc2FtcD4gZm9yIG9uZSBvZiB0aGVzZS4gWW91IGNhbiBzZXQgdGhlCitwcm9wZXJ0eSA8Y29kZT5hbnQuWG1sTG9nZ2VyLnN0eWxlc2hlZXQudXJpPC9jb2RlPiB0byBwcm92aWRlIGEgVVJJIHRvIGEgc3R5bGUgc2hlZXQuIFRoaXMgY2FuIGJlIGEKK3JlbGF0aXZlIG9yIGFic29sdXRlIGZpbGUgcGF0aCwgb3IgYW4gSFRUUCBVUkwuIElmIHlvdSBzZXQgdGhlIHByb3BlcnR5IHRvIHRoZSBlbXB0eQorc3RyaW5nLCA8cT48L3E+LCBubyBYU0xUIHRyYW5zZm9ybSBpcyBkZWNsYXJlZCBhdCBhbGwuPC9wPgogCis8cHJlIGNsYXNzPSJpbnB1dCI+YW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXIKK2FudCAtbG9nZ2VyIG9yZy5hcGFjaGUudG9vbHMuYW50LlhtbExvZ2dlciAtdmVyYm9zZSAtbG9nZmlsZSBidWlsZF9sb2cueG1sPC9wcmU+CiAKLTxoMz48YSBuYW1lPSJYbWxMb2dnZXIiPlhtbExvZ2dlcjwvYT48L2gzPgotPHA+V3JpdGVzIGFsbCBidWlsZCBpbmZvcm1hdGlvbiBvdXQgdG8gYW4gWE1MIGZpbGUgbmFtZWQgbG9nLnhtbCwgb3IgdGhlIHZhbHVlCi1vZiB0aGUgPGNvZGU+WG1sTG9nZ2VyLmZpbGU8L2NvZGU+IHByb3BlcnR5IGlmIHByZXNlbnQsIHdoZW4gdXNlZCBhcyBhCi1saXN0ZW5lci4gV2hlbiB1c2VkIGFzIGEgbG9nZ2VyLCBpdCB3cml0ZXMgYWxsIG91dHB1dCB0byBlaXRoZXIgdGhlCi1jb25zb2xlIG9yIHRvIHRoZSB2YWx1ZSBvZiA8Y29kZT4tbG9nZmlsZTwvY29kZT4uIFdoZXRoZXIgdXNlZCBhcyBhIGxpc3RlbmVyCi1vciBsb2dnZXIsIHRoZSBvdXRwdXQgaXMgbm90IGdlbmVyYXRlZCB1bnRpbCB0aGUgYnVpbGQgaXMgY29tcGxldGUsIGFzIGl0Ci1idWZmZXJzIHRoZSBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBwcm92aWRlIHRpbWluZyBpbmZvcm1hdGlvbiBmb3IgdGFzaywKLXRhcmdldHMsIGFuZCB0aGUgcHJvamVjdC48L3A+Ci08cD5CeSBkZWZhdWx0IHRoZSBYTUwgZmlsZSBjcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGFuIFhTTFQgZmlsZSAibG9nLnhzbCIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5OwotbG9vayBpbiBBTlRfSE9NRS9ldGMgZm9yIG9uZSBvZiB0aGVzZS4gWW91IGNhbiBzZXQgdGhlIHByb3BlcnR5Ci08Y29kZT5hbnQuWG1sTG9nZ2VyLnN0eWxlc2hlZXQudXJpPC9jb2RlPiB0byBwcm92aWRlIGEgdXJpIHRvIGEgc3R5bGUgc2hlZXQuCi10aGlzIGNhbiBiZSBhIHJlbGF0aXZlIG9yIGFic29sdXRlIGZpbGUgcGF0aCwgb3IgYW4gaHR0cCBVUkwuCi1JZiB5b3Ugc2V0IHRoZSBwcm9wZXJ0eSB0byB0aGUgZW1wdHkgc3RyaW5nLCAiIiwgbm8gWFNMVCB0cmFuc2Zvcm0KLWlzIGRlY2xhcmVkIGF0IGFsbC48L3A+Ci0KLTxibG9ja3F1b3RlPgotPHA+PGNvZGU+YW50IC1saXN0ZW5lciBvcmcuYXBhY2hlLnRvb2xzLmFudC5YbWxMb2dnZXI8L2NvZGU+PGJyPgotPGNvZGU+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQuWG1sTG9nZ2VyIC12ZXJib3NlIC1sb2dmaWxlIGJ1aWxkX2xvZy54bWw8L2NvZGU+PC9wPgotPC9ibG9ja3F1b3RlPgotCi0KLQotPGgzPjxhIG5hbWU9IlRpbWVzdGFtcGVkTG9nZ2VyIj5UaW1lc3RhbXBlZExvZ2dlcjwvYT48L2gzPgotPHA+Ci0gIEFjdHMgbGlrZSB0aGUgZGVmYXVsdCBsb2dnZXIsIGV4Y2VwdCB0aGF0IHRoZSBmaW5hbCBzdWNjZXNzL2ZhaWx1cmUgbWVzc2FnZSBhbHNvIGluY2x1ZGVzCi0gIHRoZSB0aW1lIHRoYXQgdGhlIGJ1aWxkIGNvbXBsZXRlZC4gRm9yIGV4YW1wbGU6Ci08L3A+Ci08cHJlPgotICBCVUlMRCBTVUNDRVNTRlVMIC0gYXQgMTYvMDgvMDUgMTY6MjQKLTwvcHJlPgorPGgzIGlkPSJUaW1lc3RhbXBlZExvZ2dlciI+VGltZXN0YW1wZWRMb2dnZXI8L2gzPgorPHA+QWN0cyBsaWtlIHRoZSBkZWZhdWx0IGxvZ2dlciwgZXhjZXB0IHRoYXQgdGhlIGZpbmFsIHN1Y2Nlc3MvZmFpbHVyZSBtZXNzYWdlIGFsc28gaW5jbHVkZXMgdGhlCit0aW1lIHRoYXQgdGhlIGJ1aWxkIGNvbXBsZXRlZC4gRm9yIGV4YW1wbGU6PC9wPgorPHByZSBjbGFzcz0ib3V0cHV0Ij5CVUlMRCBTVUNDRVNTRlVMIC0gYXQgMTYvMDgvMDUgMTY6MjQ8L3ByZT4KIDxwPlRvIHVzZSB0aGlzIGxpc3RlbmVyLCB1c2UgdGhlIGNvbW1hbmQ6PC9wPgogCi08YmxvY2txdW90ZT4KLTxjb2RlPmFudCAgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5UaW1lc3RhbXBlZExvZ2dlcjwvY29kZT4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5UaW1lc3RhbXBlZExvZ2dlcjwvcHJlPgogCi0KLQotPGgzPjxhIG5hbWU9IkJpZ1Byb2plY3RMb2dnZXIiPkJpZ1Byb2plY3RMb2dnZXI8L2E+PC9oMz4KLTxwPgotICBUaGlzIGxvZ2dlciBpcyBkZXNpZ25lZCB0byBtYWtlIGV4YW1pbmluZyB0aGUgbG9ncyBvZiBhIGJpZyBidWlsZCBlYXNpZXIsCi0gIGVzcGVjaWFsbHkgdGhvc2UgcnVuIHVuZGVyIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gdG9vbHMuIEl0Ci08L3A+Cis8aDMgaWQ9IkJpZ1Byb2plY3RMb2dnZXIiPkJpZ1Byb2plY3RMb2dnZXI8L2gzPgorPHA+VGhpcyBsb2dnZXIgaXMgZGVzaWduZWQgdG8gbWFrZSBleGFtaW5pbmcgdGhlIGxvZ3Mgb2YgYSBiaWcgYnVpbGQgZWFzaWVyLCBlc3BlY2lhbGx5IHRob3NlIHJ1bgordW5kZXIgY29udGludW91cyBpbnRlZ3JhdGlvbiB0b29scy4gSXQ8L3A+CiA8b2w+CiAgIDxsaT5XaGVuIGVudGVyaW5nIGEgY2hpbGQgcHJvamVjdCwgcHJpbnRzIGl0cyBuYW1lIGFuZCBkaXJlY3Rvcnk8L2xpPgogICA8bGk+V2hlbiBleGl0aW5nIGEgY2hpbGQgcHJvamVjdCwgcHJpbnRzIGl0cyBuYW1lPC9saT4KQEAgLTUwNiwxNCArNDQ0LDEwIEBACiAgIDxsaT5PbWl0cyBsb2dnaW5nIHRoZSBuYW1lcyBvZiBhbGwgdGFyZ2V0cyB0aGF0IGhhdmUgbm8gZGlyZWN0IHRhc2sgb3V0cHV0PC9saT4KICAgPGxpPkluY2x1ZGVzIHRoZSBidWlsZCBmaW5pc2hlZCB0aW1lc3RhbXAgb2YgdGhlIFRpbWVTdGFtcCBsb2dnZXI8L2xpPgogPC9vbD4KLTxwPgotICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nICZsdDtzdWJhbnQmZ3Q7IHRvIGJ1aWxkIGEgbGFyZ2UgcHJvamVjdAotICBmcm9tIG1hbnkgc21hbGxlciBwcm9qZWN0cyAtdGhlIG91dHB1dCBzaG93cyB3aGljaCBwYXJ0aWN1bGFyCi0gIHByb2plY3QgaXMgYnVpbGRpbmcuIEhlcmUgaXMgYW4gZXhhbXBsZSBpbiB3aGljaCAiY2xlYW4iIGlzIGJlaW5nIGNhbGxlZAotICBvbiBhbGwgYSBudW1iZXIgb2YgY2hpbGQgcHJvamVjdHMsIG9ubHkgc29tZSBvZiB3aGljaCBwZXJmb3JtIHdvcms6Ci08L3A+Ci08cHJlPgotCis8cD5UaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIDxjb2RlPiZsdDtzdWJhbnQmZ3Q7PC9jb2RlPiB0byBidWlsZCBhIGxhcmdlIHByb2plY3QgZnJvbSBtYW55IHNtYWxsZXIKK3Byb2plY3RzJm1kYXNoO3RoZSBvdXRwdXQgc2hvd3Mgd2hpY2ggcGFydGljdWxhciBwcm9qZWN0IGlzIGJ1aWxkaW5nLiBIZXJlIGlzIGFuIGV4YW1wbGUgaW4gd2hpY2gKKyJjbGVhbiIgaXMgYmVpbmcgY2FsbGVkIG9uIGFsbCBhIG51bWJlciBvZiBjaGlsZCBwcm9qZWN0cywgb25seSBzb21lIG9mIHdoaWNoIHBlcmZvcm0gd29yazo8L3A+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogRW50ZXJpbmcgcHJvamVjdCAieHVuaXQiCiBJbiAvaG9tZS9hbnQvY29tcG9uZW50cy94dW5pdApAQCAtNTM0LDI1ICs0NjgsMTkgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogRXhpdGluZyBwcm9qZWN0ICJqdW5pdCIKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLTwvcHJlPgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTwvcHJlPgogCi08cD4KLSAgVGhlIGVudHJ5IGFuZCBleGl0IG1lc3NhZ2VzIGFyZSB2ZXJ5IHZlcmJvc2UgaW4gdGhpcyBleGFtcGxlLCBidXQgaW4KLSAgYSBiaWcgcHJvamVjdCBjb21waWxpbmcgb3IgdGVzdGluZyBtYW55IGNoaWxkIGNvbXBvbmVudHMsIHRoZSBtZXNzYWdlcwotICBhcmUgcmVkdWNlZCB0byBiZWNvbWluZyBjbGVhciBkZWxpbWl0ZXJzIG9mIHdoZXJlIGRpZmZlcmVudCBwcm9qZWN0cwotICBhcmUgaW4gY2hhcmdlIC1vciBtb3JlIGltcG9ydGFudGx5LCB3aGljaCBwcm9qZWN0IGlzIGZhaWxpbmcuCi08L3A+Cis8cD5UaGUgZW50cnkgYW5kIGV4aXQgbWVzc2FnZXMgYXJlIHZlcnkgdmVyYm9zZSBpbiB0aGlzIGV4YW1wbGUsIGJ1dCBpbiBhIGJpZyBwcm9qZWN0IGNvbXBpbGluZyBvcgordGVzdGluZyBtYW55IGNoaWxkIGNvbXBvbmVudHMsIHRoZSBtZXNzYWdlcyBhcmUgcmVkdWNlZCB0byBiZWNvbWluZyBjbGVhciBkZWxpbWl0ZXJzIG9mIHdoZXJlCitkaWZmZXJlbnQgcHJvamVjdHMgYXJlIGluIGNoYXJnZSZtZGFzaDtvciwgbW9yZSBpbXBvcnRhbnRseSwgd2hpY2ggcHJvamVjdCBpcyBmYWlsaW5nLjwvcD4KIDxwPlRvIHVzZSB0aGlzIGxpc3RlbmVyLCB1c2UgdGhlIGNvbW1hbmQ6PC9wPgotPGJsb2NrcXVvdGU+Ci08Y29kZT5hbnQgIC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuQmlnUHJvamVjdExvZ2dlcjwvY29kZT4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5CaWdQcm9qZWN0TG9nZ2VyPC9wcmU+CiAKLTxoMz48YSBuYW1lPSJTaW1wbGVCaWdQcm9qZWN0TG9nZ2VyIj5TaW1wbGVCaWdQcm9qZWN0TG9nZ2VyPC9hPjwvaDM+Ci08cD5MaWtlIDxjb2RlPkJpZ1Byb2plY3RMb2dnZXI8L2NvZGU+LCBwcm9qZWN0LXF1YWxpZmllZCB0YXJnZXQgbmFtZXMgYXJlIHByaW50ZWQsCi11c2VmdWwgZm9yIGJpZyBidWlsZHMgd2l0aCBzdWJwcm9qZWN0cy4KLU90aGVyd2lzZSBpdCBpcyBhcyBxdWlldCBhcyA8Y29kZT5Ob0Jhbm5lckxvZ2dlcjwvY29kZT46PC9wPgotPHByZT4KKzxoMyBpZD0iU2ltcGxlQmlnUHJvamVjdExvZ2dlciI+U2ltcGxlQmlnUHJvamVjdExvZ2dlcjwvaDM+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4xPC9lbT48L3A+Cis8cD5MaWtlIDxjb2RlPkJpZ1Byb2plY3RMb2dnZXI8L2NvZGU+LCBwcm9qZWN0LXF1YWxpZmllZCB0YXJnZXQgbmFtZXMgYXJlIHByaW50ZWQsIHVzZWZ1bCBmb3IgYmlnCitidWlsZHMgd2l0aCBzdWJwcm9qZWN0cy4gT3RoZXJ3aXNlIGl0IGlzIGFzIHF1aWV0IGFzIDxjb2RlPk5vQmFubmVyTG9nZ2VyPC9jb2RlPjo8L3A+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPgogQnVpbGRmaWxlOiAvc291cmNlcy9teWFwcC9idWlsZC54bWwKIAogbXlhcHAtbGliLmNvbXBpbGU6CkBAIC01NzAsMjAgKzQ5OCwxNiBAQAogQnVpbGRpbmcgamFyOiAvc291cmNlcy9teWFwcC9idWlsZC9teWFwcC5qYXIKIAogQlVJTEQgU1VDQ0VTU0ZVTAotVG90YWwgdGltZTogMSBzZWNvbmQKLTwvcHJlPgotPHA+PGI+c2luY2UgQW50IDEuOC4xPC9iPjwvcD4KK1RvdGFsIHRpbWU6IDEgc2Vjb25kPC9wcmU+CiA8cD5UbyB1c2UgdGhpcyBsaXN0ZW5lciwgdXNlIHRoZSBjb21tYW5kOjwvcD4KLTxibG9ja3F1b3RlPgotPGNvZGU+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuU2ltcGxlQmlnUHJvamVjdExvZ2dlcjwvY29kZT4KLTwvYmxvY2txdW90ZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5TaW1wbGVCaWdQcm9qZWN0TG9nZ2VyPC9wcmU+CiAKLTxoMz48YSBuYW1lPSJQcm9maWxlTG9nZ2VyIj5Qcm9maWxlTG9nZ2VyPC9hPjwvaDM+Ci08cD5UaGlzIGxvZ2dlciBzdG9yZXMgdGhlIHRpbWUgbmVlZGVkIGZvciBleGVjdXRpbmcgYSB0YXNrLCB0YXJnZXQgYW5kIHRoZSB3aG9sZSBidWlsZCBhbmQgcHJpbnRzCi10aGVzZSBpbmZvcm1hdGlvbi4gVGhlIG91dHB1dCBjb250YWlucyBhIHRpbWVzdGFtcCB3aGVuIGVudGVyaW5nIHRoZSBidWlsZCwgdGFyZ2V0IG9yIHRhc2sgYW5kIGEgdGltZXN0YW1wIGFuZCB0aGUgbmVlZGVkIHRpbWUgd2hlbiBleGl0aW5nLgotPC9wPgorPGgzIGlkPSJQcm9maWxlTG9nZ2VyIj5Qcm9maWxlTG9nZ2VyPC9oMz4KIDwhLS0gVGhpcyBpcyB0aGUgJ3NpbmNlJyBhcyBkZXNjcmliZWQgaW4gdGhlIExvZ2dlcnMgSmF2YURvYyAtLT4KLTxwPjxiPnNpbmNlIEFudCAxLjguMDwvYj48L3A+Cis8cD48ZW0+U2luY2UgQW50IDEuOC4wPC9lbT48L3A+Cis8cD5UaGlzIGxvZ2dlciBzdG9yZXMgdGhlIHRpbWUgbmVlZGVkIGZvciBleGVjdXRpbmcgYSB0YXNrLCB0YXJnZXQgYW5kIHRoZSB3aG9sZSBidWlsZCBhbmQgcHJpbnRzCit0aGVzZSBpbmZvcm1hdGlvbi4gVGhlIG91dHB1dCBjb250YWlucyBhIHRpbWVzdGFtcCB3aGVuIGVudGVyaW5nIHRoZSBidWlsZCwgdGFyZ2V0IG9yIHRhc2sgYW5kIGEKK3RpbWVzdGFtcCBhbmQgdGhlIG5lZWRlZCB0aW1lIHdoZW4gZXhpdGluZy48L3A+CiA8aDQ+RXhhbXBsZTwvaDQ+CiBIYXZpbmcgdGhhdCBidWlsZGZpbGUKIDxwcmU+CkBAIC01OTcsMTAgKzUyMSwxMCBAQAogICAgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDthbm90aGVyVGFyZ2V0JnF1b3Q7IGRlcGVuZHM9JnF1b3Q7YVRhcmdldCZxdW90OyZndDsKICAgICAgICAgJmx0O2VjaG8mZ3Q7YW5vdGhlci1lY2hvLXRhc2smbHQ7L2VjaG8mZ3Q7CiAgICAgJmx0Oy90YXJnZXQmZ3Q7Ci0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KLWFuZCBleGVjdXRpbmcgd2l0aCA8dHQ+YW50IC1sb2dnZXIgb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXIuUHJvZmlsZUxvZ2dlciBhbm90aGVyVGFyZ2V0PC90dD4gZ2l2ZXMgdGhhdCBvdXRwdXQgKHdpdGggb3RoZXIgdGltZXN0YW1wcyBhbmQgZHVyYXRpb24gb2YgY291cnNlIDspIDoKLTxwcmU+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+Cis8cD5hbmQgZXhlY3V0aW5nIHdpdGggPGtiZD5hbnQgLWxvZ2dlciBvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lci5Qcm9maWxlTG9nZ2VyCithbm90aGVyVGFyZ2V0PC9rYmQ+IGdpdmVzIHRoYXQgb3V0cHV0ICh3aXRoIG90aGVyIHRpbWVzdGFtcHMgYW5kIGR1cmF0aW9uIG9mIGNvdXJzZSA7LSk6PC9wPgorPHByZSBjbGFzcz0ib3V0cHV0Ij4KIEJ1aWxkZmlsZTogLi4uXGJ1aWxkLnhtbAogCiBUYXJnZXQgYVRhcmdldDogc3RhcnRlZCBUaHUgSmFuIDIyIDA5OjAxOjAwIENFVCAyMDA5CkBAIC02MjcsMzYgKzU1MSwzNCBAQAogVGFyZ2V0IGFub3RoZXJUYXJnZXQ6IGZpbmlzaGVkIFRodSBKYW4gMjIgMDk6MDE6MDEgQ0VUIDIwMDkgKDBtcykKIAogQlVJTEQgU1VDQ0VTU0ZVTAotVG90YWwgdGltZTogMiBzZWNvbmRzCi08L3ByZT4KK1RvdGFsIHRpbWU6IDIgc2Vjb25kczwvcHJlPgogCis8aDIgaWQ9ImRldiI+V3JpdGluZyB5b3VyIG93bjwvaDI+CiAKLQotPGgyPjxhIG5hbWU9ImRldiI+V3JpdGluZyB5b3VyIG93bjwvYT48L2gyPgotCi08cD5TZWUgdGhlIDxhIGhyZWY9ImRldmVsb3AuaHRtbCNidWlsZGV2ZW50cyI+QnVpbGQgRXZlbnRzPC9hPiBzZWN0aW9uIGZvcgotZGV2ZWxvcGVycy48L3A+Cis8cD5TZWUgdGhlIDxhIGhyZWY9ImRldmVsb3AuaHRtbCNidWlsZGV2ZW50cyI+QnVpbGQgRXZlbnRzPC9hPiBzZWN0aW9uIGZvciBkZXZlbG9wZXJzLjwvcD4KIAogPHA+Tm90ZXM6PC9wPgogCiA8dWw+CiAgIDxsaT4KLSAgICBBIGxpc3RlbmVyIG9yIGxvZ2dlciBzaG91bGQgbm90IHdyaXRlIHRvIHN0YW5kYXJkIG91dHB1dCBvciBlcnJvciBpbiB0aGUgPGNvZGU+bWVzc2FnZUxvZ2dlZCgpPC9jb2RlPiBtZXRob2Q7Ci0gICAgQW50IGNhcHR1cmVzIHRoZXNlIGludGVybmFsbHkgYW5kIGl0IHdpbGwgdHJpZ2dlciBhbiBpbmZpbml0ZSBsb29wLgorICAgIEEgbGlzdGVuZXIgb3IgbG9nZ2VyIHNob3VsZCBub3Qgd3JpdGUgdG8gc3RhbmRhcmQgb3V0cHV0IG9yIGVycm9yIGluCisgICAgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5tZXNzYWdlTG9nZ2VkKCk8L2NvZGU+IG1ldGhvZDsgQW50IGNhcHR1cmVzIHRoZXNlIGludGVybmFsbHkgYW5kIGl0IHdpbGwKKyAgICB0cmlnZ2VyIGFuIGluZmluaXRlIGxvb3AuCiAgIDwvbGk+CiAgIDxsaT4KLSAgICBMb2dnaW5nIGlzIHN5bmNocm9ub3VzOyBhbGwgbGlzdGVuZXJzIGFuZCBsb2dnZXJzIGFyZSBjYWxsZWQgb25lIGFmdGVyIHRoZSBvdGhlciwgd2l0aCB0aGUgYnVpbGQgYmxvY2tpbmcgdW50aWwKLSAgICB0aGUgb3V0cHV0IGlzIHByb2Nlc3NlZC4gU2xvdyBsb2dnaW5nIG1lYW5zIGEgc2xvdyBidWlsZC4KKyAgICBMb2dnaW5nIGlzIHN5bmNocm9ub3VzOyBhbGwgbGlzdGVuZXJzIGFuZCBsb2dnZXJzIGFyZSBjYWxsZWQgb25lIGFmdGVyIHRoZSBvdGhlciwgd2l0aCB0aGUgYnVpbGQKKyAgICBibG9ja2luZyB1bnRpbCB0aGUgb3V0cHV0IGlzIHByb2Nlc3NlZC4gU2xvdyBsb2dnaW5nIG1lYW5zIGEgc2xvdyBidWlsZC4KICAgPC9saT4KLSAgPGxpPldoZW4gYSBidWlsZCBpcyBzdGFydGVkLCBhbmQgPGNvZGU+QnVpbGRMaXN0ZW5lci5idWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCk8L2NvZGU+IGlzIGNhbGxlZCwKLSAgICB0aGUgcHJvamVjdCBpcyBub3QgZnVsbHkgZnVuY3Rpb25hbC4gVGhlIGJ1aWxkIGhhcyBzdGFydGVkLCB5ZXMsIGFuZCB0aGUgPGNvZGU+ZXZlbnQuZ2V0UHJvamVjdCgpPC9jb2RlPiBtZXRob2QgY2FsbAotICAgIHJldHVybnMgdGhlIFByb2plY3QgaW5zdGFuY2UsIGJ1dCB0aGF0IHByb2plY3QgaXMgaW5pdGlhbGl6ZWQgd2l0aCBKVk0gYW5kIGFudCBwcm9wZXJ0aWVzLCBub3IgaGFzIGl0Ci0gICAgcGFyc2VkIHRoZSBidWlsZCBmaWxlIHlldC4gWW91IGNhbm5vdCBjYWxsIDxjb2RlPlByb2plY3QuZ2V0UHJvcGVydHkoKTwvY29kZT4gZm9yIHByb3BlcnR5IGxvb2t1cCwgb3IKLSAgICA8Y29kZT5Qcm9qZWN0LmdldE5hbWUoKTwvY29kZT4gdG8gZ2V0IHRoZSBwcm9qZWN0IG5hbWUgKGl0IHdpbGwgcmV0dXJuIG51bGwpLgorICA8bGk+V2hlbiBhIGJ1aWxkIGlzIHN0YXJ0ZWQsIGFuZCA8Y29kZSBjbGFzcz0iY29kZSI+QnVpbGRMaXN0ZW5lci5idWlsZFN0YXJ0ZWQoQnVpbGRFdmVudAorICAgIGV2ZW50KTwvY29kZT4gaXMgY2FsbGVkLCB0aGUgcHJvamVjdCBpcyBub3QgZnVsbHkgZnVuY3Rpb25hbC4gVGhlIGJ1aWxkIGhhcyBzdGFydGVkLCB5ZXMsIGFuZAorICAgIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+ZXZlbnQuZ2V0UHJvamVjdCgpPC9jb2RlPiBtZXRob2QgY2FsbCByZXR1cm5zIHRoZSBQcm9qZWN0IGluc3RhbmNlLCBidXQKKyAgICB0aGF0IHByb2plY3QgaXMgaW5pdGlhbGl6ZWQgd2l0aCBKVk0gYW5kIEFudCBwcm9wZXJ0aWVzLCBub3IgaGFzIGl0IHBhcnNlZCB0aGUgYnVpbGQgZmlsZQorICAgIHlldC4gWW91IGNhbm5vdCBjYWxsIDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9qZWN0LmdldFByb3BlcnR5KCk8L2NvZGU+IGZvciBwcm9wZXJ0eSBsb29rdXAsIG9yCisgICAgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3QuZ2V0TmFtZSgpPC9jb2RlPiB0byBnZXQgdGhlIHByb2plY3QgbmFtZSAoaXQgd2lsbCByZXR1cm4gbnVsbCkuCiAgIDwvbGk+CiAgIDxsaT4KLSAgICBDbGFzc2VzIHRoYXQgaW1wbGVtZW50IDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlN1YkJ1aWxkTGlzdGVuZXI8L2NvZGU+IHJlY2VpdmUgbm90aWZpY2F0aW9ucyB3aGVuIGNoaWxkIHByb2plY3RzCi0gICAgc3RhcnQgYW5kIHN0b3AuCisgICAgQ2xhc3NlcyB0aGF0IGltcGxlbWVudCA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuU3ViQnVpbGRMaXN0ZW5lcjwvY29kZT4gcmVjZWl2ZQorICAgIG5vdGlmaWNhdGlvbnMgd2hlbiBjaGlsZCBwcm9qZWN0cyBzdGFydCBhbmQgc3RvcC4KICAgPC9saT4KIDwvdWw+CiAKZGlmZiAtLWdpdCBhL21hbnVhbC9wbGF0Zm9ybS5odG1sIGIvbWFudWFsL3BsYXRmb3JtLmh0bWwKaW5kZXggOGIzODczMS4uNTljODZjMSAxMDA2NDQKLS0tIGEvbWFudWFsL3BsYXRmb3JtLmh0bWwKKysrIGIvbWFudWFsL3BsYXRmb3JtLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMTUgKzE1LDk5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Ci0KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5QbGF0Zm9ybSBJc3N1ZXM8L3RpdGxlPgogPC9oZWFkPgorPGJvZHk+CiAKIDxoMT5QbGF0Zm9ybSBJc3N1ZXM8L2gxPgogCiA8aDI+SmF2YSB2ZXJzaW9uczwvaDI+Ci08aDM+SmF2YSAxLjU8L2gzPgotCi1Zb3UgbWF5IG5lZWQgYSBiaWdnZXIgc3RhY2sgdGhhbiBkZWZhdWx0LCBlc3BlY2lhbGx5IGlmIHlvdSBhcmUgdXNpbmcgdGhlIGJ1aWx0IGluCi1YU0xUIGVuZ2luZS4gV2UgcmVjb21tZW5kIHlvdSB1c2UgQXBhY2hlIFhhbGFuOyBpbmRlZWQsIHNvbWUgdGFza3MgKEpVbml0IHJlcG9ydCBpbiBYTUwsCi1mb3IgZXhhbXBsZSkgbWF5IG5vdCB3b3JrIGFnYWluc3QgdGhlIHNoaXBwaW5nIFhTTCBlbmdpbmUuCis8aDM+SmF2YSA1PC9oMz4KKzxwPgorWW91IG1heSBuZWVkIGEgYmlnZ2VyIHN0YWNrIHRoYW4gZGVmYXVsdCwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIHVzaW5nIHRoZSBidWlsdCBpbiBYU0xUIGVuZ2luZS4gV2UKK3JlY29tbWVuZCB5b3UgdXNlIEFwYWNoZSBYYWxhbjsgaW5kZWVkLCBzb21lIHRhc2tzIChKVW5pdCByZXBvcnQgaW4gWE1MLCBmb3IgZXhhbXBsZSkgbWF5IG5vdCB3b3JrCithZ2FpbnN0IHRoZSBzaGlwcGluZyBYU0wgZW5naW5lLgorPC9wPgogCiA8aDI+VW5peCBhbmQgTGludXg8L2gyPgotCiA8dWw+Ci08bGk+IFlvdSBzaG91bGQgdXNlIGEgR05VIHZlcnNpb24gb2YgPHR0PnRhcjwvdHQ+IHRvIHVudGFyIHRoZSBBcGFjaGUgCi1BbnQgc291cmNlIHRyZWUsIGlmIHlvdSBoYXZlIGRvd25sb2FkZWQgdGhpcyBhcyBhIHRhciBmaWxlLiBJZiB5b3UgZ2V0Ci13ZWlyZCBlcnJvcnMgYWJvdXQgbWlzc2luZyBmaWxlcywgdGhpcyBpcyB0aGUgcHJvYmxlbS4gCi08L2xpPgotPGxpPiBBbnQgZG9lcyBub3QgcHJlc2VydmUgZmlsZSBwZXJtaXNzaW9ucyB3aGVuIGEgZmlsZSBpcyBjb3BpZWQsIG1vdmVkIG9yIAotYXJjaGl2ZWQsIGJlY2F1c2UgSmF2YSBkb2VzIG5vdCBsZXQgaXQgcmVhZCBvciB3cml0ZSB0aGUgcGVybWlzc2lvbnMuCi0gVXNlIDx0dD4mbHQ7Y2htb2QmZ3Q7PC90dD4gdG8gc2V0IHBlcm1pc3Npb25zLCBhbmQgd2hlbiBjcmVhdGluZyBhIAotdGFyIGFyY2hpdmUsIHVzZSB0aGUgPHR0Pm1vZGU8L3R0PiBhdHRyaWJ1dGUgb2YgPHR0PiZsdDt0YXJmaWxlc2V0Jmd0OzwvdHQ+Ci10byBzZXQgdGhlIHBlcm1pc3Npb25zIGluIHRoZSB0YXIgZmlsZSwgb3IgPGNvZGU+Jmx0O2FwcGx5Jmd0OzwvY29kZT4gdGhlIHJlYWwgdGFyIHByb2dyYW0uCi08L2xpPgotPGxpPiBBbnQgaXMgbm90IHN5bWJvbGljIGxpbmsgYXdhcmUgaW4gbW92ZXMsIGRlbGV0ZXMgYW5kIHdoZW4gcmVjdXJzaW5nIGRvd24gYSB0cmVlCi1vZiBkaXJlY3RvcmllcyB0byBidWlsZCB1cCBhIGxpc3Qgb2YgZmlsZXMuIFVuZXhwZWN0ZWQgdGhpbmdzIGNhbiBoYXBwZW4uCi08L2xpPgotPGxpPiBMaW51eCBvbiBJQS02NDogYXBwYXJlbnRseSB5b3UgbmVlZCBhIGxhcmdlciBoZWFwIHRoYW4gdGhlIGRlZmF1bHQKLW9uZSAoNjRNKSB0byBjb21waWxlIGJpZyBwcm9qZWN0cy4gSWYgeW91IGdldCBvdXQgb2YgaGVhcAotZXJyb3JzLCBlaXRoZXIgaW5jcmVhc2UgdGhlIGhlYXAgb3IgdXNlIGEgZm9ya2luZyBqYXZhYy4gQmV0dGVyIHlldCwKLXVzZSBqaWtlcyBmb3IgZXh0cmEgY29tcGlsYXRpb24gc3BlZWQuICAgCi08L2xpPgotCis8bGk+WW91IHNob3VsZCB1c2UgYSBHTlUgdmVyc2lvbiBvZiA8a2JkPnRhcjwva2JkPiB0byB1bnRhciB0aGUgQXBhY2hlIEFudCBzb3VyY2UgdHJlZSwgaWYgeW91IGhhdmUKK2Rvd25sb2FkZWQgdGhpcyBhcyBhIHRhciBmaWxlLiBJZiB5b3UgZ2V0IHdlaXJkIGVycm9ycyBhYm91dCBtaXNzaW5nIGZpbGVzLCB0aGlzIGlzIHRoZQorcHJvYmxlbS48L2xpPgorPGxpPkFudCBkb2VzIG5vdCBwcmVzZXJ2ZSBmaWxlIHBlcm1pc3Npb25zIHdoZW4gYSBmaWxlIGlzIGNvcGllZCwgbW92ZWQgb3IgYXJjaGl2ZWQsIGJlY2F1c2UgSmF2YQorZG9lcyBub3QgbGV0IGl0IHJlYWQgb3Igd3JpdGUgdGhlIHBlcm1pc3Npb25zLiAgVXNlIDxjb2RlPiZsdDtjaG1vZCZndDs8L2NvZGU+IHRvIHNldCBwZXJtaXNzaW9ucywKK2FuZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGFyY2hpdmUsIHVzZSB0aGUgPHZhcj5tb2RlPC92YXI+IGF0dHJpYnV0ZQorb2YgPGNvZGU+Jmx0O3RhcmZpbGVzZXQmZ3Q7PC9jb2RlPiB0byBzZXQgdGhlIHBlcm1pc3Npb25zIGluIHRoZSB0YXIgZmlsZSwKK29yIDxjb2RlPiZsdDthcHBseSZndDs8L2NvZGU+IHRoZSByZWFsIDxrYmQ+dGFyPC9rYmQ+IHByb2dyYW0uPC9saT4KKzxsaT5BbnQgaXMgbm90IHN5bWJvbGljIGxpbmsgYXdhcmUgaW4gbW92ZXMsIGRlbGV0ZXMgYW5kIHdoZW4gcmVjdXJzaW5nIGRvd24gYSB0cmVlIG9mIGRpcmVjdG9yaWVzCit0byBidWlsZCB1cCBhIGxpc3Qgb2YgZmlsZXMuIFVuZXhwZWN0ZWQgdGhpbmdzIGNhbiBoYXBwZW4uPC9saT4KKzxsaT5MaW51eCBvbiBJQS02NDogYXBwYXJlbnRseSB5b3UgbmVlZCBhIGxhcmdlciBoZWFwIHRoYW4gdGhlIGRlZmF1bHQgb25lICg2NE0pIHRvIGNvbXBpbGUgYmlnCitwcm9qZWN0cy4gSWYgeW91IGdldCBvdXQgb2YgaGVhcCBlcnJvcnMsIGVpdGhlciBpbmNyZWFzZSB0aGUgaGVhcCBvciB1c2UgYQorZm9ya2luZyA8Y29kZT4mbHQ7amF2YWMmZ3Q7PC9jb2RlPi4gQmV0dGVyIHlldCwgdXNlIDxrYmQ+amlrZXM8L2tiZD4gZm9yIGV4dHJhIGNvbXBpbGF0aW9uCitzcGVlZC48L2xpPgogPC91bD4KIAotCiA8aDI+TWljcm9zb2Z0IFdpbmRvd3M8L2gyPgogPHA+Ci1XaW5kb3dzIDl4ICh3aW45NSwgd2luOTgsIHdpbjk4U0UgYW5kIHdpbk1FKSBhcmUgbm90IHN1cHBvcnRlZCBpbiBBbnQxLjcsCitXaW5kb3dzIDl4ICh3aW45NSwgd2luOTgsIHdpbjk4U0UgYW5kIHdpbk1FKSBhcmUgbm90IHN1cHBvcnRlZCA8ZW0+c2luY2UgQW50IDEuNzwvZW0+LgorPC9wPgorPHA+CitUaGUgQW50IHRlYW0gaGFzIHJldGlyZWQgc3VwcG9ydCBmb3IgdGhlc2UgcHJvZHVjdHMgYmVjYXVzZSB0aGV5IGFyZSBvdXRkYXRlZCBhbmQgY2FuIGV4cG9zZQorY3VzdG9tZXJzIHRvIHNlY3VyaXR5IHJpc2tzLiBXZSByZWNvbW1lbmQgdGhhdCBjdXN0b21lcnMgd2hvIGFyZSBzdGlsbCBydW5uaW5nIFdpbmRvd3MgOTggb3IgV2luZG93cworTUUgdXBncmFkZSB0byBhIG5ld2VyLCBtb3JlIHNlY3VyZSBvcGVyYXRpbmcgc3lzdGVtLCBhcyBzb29uIGFzIHBvc3NpYmxlLgorPC9wPgorPHA+CitDdXN0b21lcnMgd2hvIHVwZ3JhZGUgdG8gTGludXggcmVwb3J0IGltcHJvdmVkIHNlY3VyaXR5LCByaWNoZXIgZnVuY3Rpb25hbGl0eSwgYW5kIGluY3JlYXNlZAorcHJvZHVjdGl2aXR5LgogPC9wPgogCis8aDI+TWljcm9zb2Z0IFdpbmRvd3MgMkssIFhQIGFuZCBTZXJ2ZXIgMkswMzwvaDI+CiA8cD4KLVRoZSBBbnQgdGVhbSBoYXMgcmV0aXJlZCBzdXBwb3J0IGZvciB0aGVzZSBwcm9kdWN0cyBiZWNhdXNlIHRoZXkgYXJlIG91dGRhdGVkIGFuZAotY2FuIGV4cG9zZSBjdXN0b21lcnMgdG8gc2VjdXJpdHkgcmlza3MuIFdlIHJlY29tbWVuZCB0aGF0IGN1c3RvbWVycyB3aG8gYXJlCi1zdGlsbCBydW5uaW5nIFdpbmRvd3MgOTggb3IgV2luZG93cyBNZSB1cGdyYWRlIHRvIGEgbmV3ZXIsIG1vcmUgc2VjdXJlIAotb3BlcmF0aW5nIHN5c3RlbSwgYXMgc29vbiBhcyBwb3NzaWJsZS4KK1dpbmRvd3MgOXggKHdpbjk1LCB3aW45OCwgd2luOThTRSBhbmQgd2luTUUpIGhhcyBhIGJhdGNoIGZpbGUgc3lzdGVtIHdoaWNoIGRvZXMgbm90IHdvcmsgZnVsbHkgd2l0aAorbG9uZyBmaWxlIG5hbWVzLCBzbyB3ZSByZWNvbW1lbmQgdGhhdCBBbnQgYW5kIEpESyBhcmUgaW5zdGFsbGVkIGludG8gZGlyZWN0b3JpZXMgd2l0aG91dCBzcGFjZXMsIGFuZAord2l0aCA4LjMgZmlsZW5hbWVzLiAgVGhlIFBlcmwgYW5kIFB5dGhvbiBsYXVuY2hlciBzY3JpcHRzIGRvIG5vdCBzdWZmZXIgZnJvbSB0aGlzIGxpbWl0YXRpb24uCiA8L3A+CiA8cD4KLUN1c3RvbWVycyB3aG8gdXBncmFkZSB0byBMaW51eCByZXBvcnQgaW1wcm92ZWQgc2VjdXJpdHksIHJpY2hlcgotZnVuY3Rpb25hbGl0eSwgYW5kIGluY3JlYXNlZCBwcm9kdWN0aXZpdHkuIAotPC9wPgotPGgyPk1pY3Jvc29mdCBXaW5kb3dzIDJLLCBYUCBhbmQgU2VydmVyIDJLMDMgPC9oMj4KLQotPHA+Ci1XaW5kb3dzIDl4ICh3aW45NSwgd2luOTgsIHdpbjk4U0UgYW5kIHdpbk1FKSBoYXMgYSBiYXRjaCBmaWxlIHN5c3RlbSB3aGljaAotZG9lcyBub3Qgd29yayBmdWxseSB3aXRoIGxvbmcgZmlsZSBuYW1lcywgc28gd2UgcmVjb21tZW5kIHRoYXQgYW50IGFuZCB0aGUgSkRLCi1hcmUgaW5zdGFsbGVkIGludG8gZGlyZWN0b3JpZXMgd2l0aG91dCBzcGFjZXMsIGFuZCB3aXRoIDguMyBmaWxlbmFtZXMuIAotVGhlIFBlcmwgYW5kIFB5dGhvbiBsYXVuY2hlciBzY3JpcHRzIGRvIG5vdCBzdWZmZXIgZnJvbSB0aGlzIGxpbWl0YXRpb24uCitBbGwgdmVyc2lvbnMgb2YgV2luZG93cyBhcmUgdXN1YWxseSBjYXNlIGluc2Vuc2l0aXZlLCBhbHRob3VnaCBtb3VudGVkIGZpbGUgc3lzdGVtcyAoVW5peCBkcml2ZXMsCitDbGVhckNhc2Ugdmlld3MpIGNhbiBiZSBjYXNlIHNlbnNpdGl2ZSB1bmRlcm5lYXRoLCBjb25mdXNpbmcgcGF0dGVybnNldHMuCiA8L3A+CiA8cD4KLUFsbCB2ZXJzaW9ucyBvZiB3aW5kb3dzIGFyZSB1c3VhbGx5IGNhc2UgaW5zZW5zaXRpdmUsIGFsdGhvdWdoIG1vdW50ZWQgCi1maWxlIHN5c3RlbXMgKFVuaXggZHJpdmVzLCBDbGVhcmNhc2Ugdmlld3MpIGNhbiBiZSBjYXNlIHNlbnNpdGl2ZSB1bmRlcm5lYXRoLAotY29uZnVzaW5nIHBhdHRlcm5zZXRzLgorQW50IGNhbiBvZnRlbiBub3QgZGVsZXRlIGEgZGlyZWN0b3J5IHdoaWNoIGlzIG9wZW4gaW4gYW4gRXhwbG9yZXIgd2luZG93LiAgVGhlcmUgaXMgbm90aGluZyB3ZSBjYW4KK2RvIGFib3V0IHRoaXMgc2hvcnQgb2Ygc3Bhd25pbmcgYSBwcm9ncmFtIHRvIGtpbGwgdGhlIHNoZWxsIGJlZm9yZSBkZWxldGluZyBkaXJlY3Rvcmllcy4gIE5vciBjYW4KK2ZpbGVzIHRoYXQgYXJlIGluIHVzZSBiZSBvdmVyd3JpdHRlbi4KIDwvcD4KIDxwPgotQW50IGNhbiBvZnRlbiBub3QgZGVsZXRlIGEgZGlyZWN0b3J5IHdoaWNoIGlzIG9wZW4gaW4gYW4gRXhwbG9yZXIgd2luZG93LiAKLVRoZXJlIGlzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoaXMgc2hvcnQgb2Ygc3Bhd25pbmcgYSBwcm9ncmFtIHRvIGtpbGwKLXRoZSBzaGVsbCBiZWZvcmUgZGVsZXRpbmcgZGlyZWN0b3JpZXMuCi1Ob3IgY2FuIGZpbGVzIHRoYXQgYXJlIGluIHVzZSBiZSBvdmVyd3JpdHRlbi4KLTwvcD4KLTxwPgotICAgIEZpbmFsbHksIGlmIGFueSBBbnQgdGFzayBmYWlscyB3aXRoIGFuIElPRXJyb3I9MiwgaXQgbWVhbnMgdGhhdCB3aGF0ZXZlcgotICAgIG5hdGl2ZSBwcm9ncmFtIEFudCBpcyB0cnlpbmcgdG8gcnVuLCBpdCBpcyBub3Qgb24gdGhlIHBhdGguCitGaW5hbGx5LCBpZiBhbnkgQW50IHRhc2sgZmFpbHMgd2l0aCBhbiA8Y29kZT5lcnJvcj0yPC9jb2RlPiwgaXQgbWVhbnMgdGhhdCB3aGF0ZXZlciBuYXRpdmUgcHJvZ3JhbQorQW50IGlzIHRyeWluZyB0byBydW4sIGl0IGlzIG5vdCBvbiB0aGUgPGNvZGU+UGF0aDwvY29kZT4uCiA8L3A+CiAKIDxoMj5NaWNyb3NvZnQgV2luZG93cyBWaXN0YTwvaDI+CiA8cD4KLSAgICBUaGVyZSBhcmUgcmVwb3J0cyBvZiBwcm9ibGVtcyB3aXRoIFdpbmRvd3MgVmlzdGEgc2VjdXJpdHkgYnJpbmdpbmcgdXAKLSAgICBkaWFsb2cgYm94ZXMgYXNraW5nIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHJ1biBhbiB1bnRydXN0ZWQgZXhlY3V0YWJsZQotICAgIGR1cmluZyBhbiBhbnQgcnVuLCBzdWNoIGFzIHdoZW4gdGhlICZsdDtzaWduamFyJmd0IHRhc2sgcnVucyB0aGUgamFyc2lnbmVyLmV4ZQotICAgIHByb2dyYW0uIFRoaXMgaXMgYmV5b25kIEFudCdzIGNvbnRyb2wsIGFuZCBzdGVtcyBmcm9tIHRoZSBPUyB0cnlpbmcgdG8gcHJvdmlkZQotICAgIHNvbWUgaWxsdXNpb24gb2Ygc2VjdXJpdHkgYnkgYmVpbmcgcmVsdWN0YW50IHRvIHJ1biB1bnNpZ25lZCBuYXRpdmUgZXhlY3V0YWJsZXMuCi0gICAgVGhlIGxhdGVzdCBKYXZhIHZlcnNpb25zIGFwcGVhciB0byByZXNvbHZlIHRoaXMgcHJvYmxlbSBieSBoYXZpbmcgc2lnbmVkCi0gICAgYmluYXJpZXMuIAorVGhlcmUgYXJlIHJlcG9ydHMgb2YgcHJvYmxlbXMgd2l0aCBXaW5kb3dzIFZpc3RhIHNlY3VyaXR5IGJyaW5naW5nIHVwIGRpYWxvZyBib3hlcyBhc2tpbmcgaWYgdGhlCit1c2VyIHdhbnRzIHRvIHJ1biBhbiB1bnRydXN0ZWQgZXhlY3V0YWJsZSBkdXJpbmcgYW4gQW50IHJ1biwgc3VjaCBhcyB3aGVuCit0aGUgPGNvZGU+Jmx0O3NpZ25qYXImZ3Q7PC9jb2RlPiB0YXNrIHJ1bnMgdGhlIDxrYmQ+amFyc2lnbmVyLmV4ZTwva2JkPiBwcm9ncmFtLiBUaGlzIGlzIGJleW9uZAorQW50J3MgY29udHJvbCwgYW5kIHN0ZW1zIGZyb20gdGhlIE9TIHRyeWluZyB0byBwcm92aWRlIHNvbWUgaWxsdXNpb24gb2Ygc2VjdXJpdHkgYnkgYmVpbmcgcmVsdWN0YW50Cit0byBydW4gdW5zaWduZWQgbmF0aXZlIGV4ZWN1dGFibGVzLiAgVGhlIGxhdGVzdCBKYXZhIHZlcnNpb25zIGFwcGVhciB0byByZXNvbHZlIHRoaXMgcHJvYmxlbSBieQoraGF2aW5nIHNpZ25lZCBiaW5hcmllcy4KIDwvcD4KIAotCiA8aDI+Q3lnd2luPC9oMj4KLQotQ3lnd2luIGlzIG5vdCBhbiBvcGVyYXRpbmcgc3lzdGVtOyByYXRoZXIgaXQgaXMgYW4gYXBwbGljYXRpb24gc3VpdGUgCi1ydW5uaW5nIHVuZGVyIFdpbmRvd3MgYW5kIHByb3ZpZGluZyBzb21lIFVOSVggbGlrZSBmdW5jdGlvbmFsaXR5LiBTdW4gaGFzIAotbm90IGNyZWF0ZWQgYW55IHNwZWNpZmljIEphdmEgRGV2ZWxvcG1lbnQgS2l0IG9yIEphdmEgUnVudGltZSBFbnZpcm9ubWVudCBmb3IgCi1jeWd3aW4uIFNlZSB0aGlzIGxpbmsgOiAKLTxhIGhyZWY9Imh0dHA6Ly93d3cuaW5vbml0LmNvbS9jeWd3aW4vZmFxLyI+aHR0cDovL3d3dy5pbm9uaXQuY29tL2N5Z3dpbi9mYXEvPC9hPiAuIAotT25seSBXaW5kb3dzIHBhdGggCi1uYW1lcyBhcmUgc3VwcG9ydGVkIGJ5IEpESyBhbmQgSlJFIHRvb2xzIHVuZGVyIFdpbmRvd3Mgb3IgY3lnd2luLiBSZWxhdGl2ZSBwYXRoIAotbmFtZXMgc3VjaCBhcyAic3JjL29yZy9hcGFjaGUvdG9vbHMiIGFyZSBzdXBwb3J0ZWQsIGJ1dCBKYXZhIHRvb2xzIGRvIG5vdCAKLXVuZGVyc3RhbmQgL2N5Z2RyaXZlL2MgdG8gbWVhbiBjOlwuCiA8cD4KLVRoZSB1dGlsaXR5IGN5Z3BhdGggKHVzZWQgaW5kdXN0cmlhbGx5IGluIHRoZSBhbnQgc2NyaXB0IHRvIHN1cHBvcnQgY3lnd2luKSBjYW4gCi1jb252ZXJ0IGN5Z3dpbiBwYXRoIG5hbWVzIHRvIFdpbmRvd3MuCi1Zb3UgY2FuIHVzZSB0aGUgPGNvZGU+Jmx0O2V4ZWMmZ3Q7PC9jb2RlPiB0YXNrIGluIGFudCB0byBjb252ZXJ0IGN5Z3dpbiBwYXRocyB0byBXaW5kb3dzIHBhdGgsIGZvciAKLWluc3RhbmNlIGxpa2UgdGhhdCA6CitDeWd3aW4gaXMgbm90IGFuIG9wZXJhdGluZyBzeXN0ZW07IHJhdGhlciBpdCBpcyBhbiBhcHBsaWNhdGlvbiBzdWl0ZSBydW5uaW5nIHVuZGVyIFdpbmRvd3MgYW5kCitwcm92aWRpbmcgc29tZSBVTklYIGxpa2UgZnVuY3Rpb25hbGl0eS4gU3VuIGhhcyBub3QgY3JlYXRlZCBhbnkgc3BlY2lmaWMgSmF2YSBEZXZlbG9wbWVudCBLaXQgb3IKK0phdmEgUnVudGltZSBFbnZpcm9ubWVudCBmb3IgY3lnd2luLiBTZWUgdGhpcyBsaW5rOiA8YSBocmVmPSJodHRwOi8vd3d3Lmlub25pdC5jb20vY3lnd2luL2ZhcS8iCit0YXJnZXQ9Il90b3AiPmh0dHA6Ly93d3cuaW5vbml0LmNvbS9jeWd3aW4vZmFxLzwvYT4uICBPbmx5IFdpbmRvd3MgcGF0aCBuYW1lcyBhcmUgc3VwcG9ydGVkIGJ5IEpESworYW5kIEpSRSB0b29scyB1bmRlciBXaW5kb3dzIG9yIGN5Z3dpbi4gUmVsYXRpdmUgcGF0aCBuYW1lcyBzdWNoIGFzIDxzYW1wPnNyYy9vcmcvYXBhY2hlL3Rvb2xzPC9zYW1wPgorYXJlIHN1cHBvcnRlZCwgYnV0IEphdmEgdG9vbHMgZG8gbm90IHVuZGVyc3RhbmQgPHNhbXA+L2N5Z2RyaXZlL2M8L3NhbXA+IHRvIG1lYW4gPHNhbXA+YzpcPC9zYW1wPi4KKzwvcD4KKzxwPgorVGhlIHV0aWxpdHkgPGtiZD5jeWdwYXRoPC9rYmQ+ICh1c2VkIGluZHVzdHJpYWxseSBpbiB0aGUgPGtiZD5hbnQ8L2tiZD4gc2NyaXB0IHRvIHN1cHBvcnQKK2N5Z3dpbikgY2FuIGNvbnZlcnQgY3lnd2luIHBhdGggbmFtZXMgdG8gV2luZG93cy4gIFlvdSBjYW4gdXNlIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2sgaW4KK0FudCB0byBjb252ZXJ0IGN5Z3dpbiBwYXRocyB0byBXaW5kb3dzIHBhdGgsIGZvciBpbnN0YW5jZSBsaWtlIHRoYXQ6Cis8L3A+CiA8cHJlPgogJmx0O3Byb3BlcnR5IG5hbWU9JnF1b3Q7c29tZS5jeWd3aW4ucGF0aCZxdW90OyB2YWx1ZT0mcXVvdDsvY3lnZHJpdmUvaC9zb21lcGF0aCZxdW90Oy8mZ3Q7CiAmbHQ7ZXhlYyBleGVjdXRhYmxlPSZxdW90O2N5Z3BhdGgmcXVvdDsgb3V0cHV0cHJvcGVydHk9JnF1b3Q7d2luZG93cy5wYXRobmFtZSZxdW90OyZndDsKQEAgLTEzMSw0OCArMTE2LDYyIEBACiAmbHQ7L2V4ZWMmZ3Q7CiAmbHQ7ZWNobyBtZXNzYWdlPSZxdW90OyR7d2luZG93cy5wYXRobmFtZX0mcXVvdDsvJmd0OwogPC9wcmU+Cis8cD4KK1dlIGdldCBsb3RzIG9mIHN1cHBvcnQgY2FsbHMgZnJvbSBDeWd3aW4gdXNlcnMuIEVpdGhlciBpdCBpcyBpbmNyZWRpYmx5IHBvcHVsYXIsIG9yIGl0IGlzCit0cm91YmxlLiBJZiB5b3UgZG8gdXNlIGl0LCByZW1lbWJlciB0aGF0IEphdmEgaXMgYSBXaW5kb3dzIGFwcGxpY2F0aW9uLCBzbyBBbnQgaXMgcnVubmluZyBpbiBhCitXaW5kb3dzIHByb2Nlc3MsIG5vdCBhIEN5Z3dpbiBvbmUuIFRoaXMgd2lsbCBzYXZlIHVzIGhhdmluZyB0byBtYXJrIHlvdXIgYnVnIHJlcG9ydHMgYXMgaW52YWxpZC4KKzwvcD4KIAotV2UgZ2V0IGxvdHMgb2Ygc3VwcG9ydCBjYWxscyBmcm9tIEN5Z3dpbiB1c2Vycy4gRWl0aGVyIGl0IGlzIGluY3JlZGlibHkKLXBvcHVsYXIsIG9yIGl0IGlzIHRyb3VibGUuIElmIHlvdSBkbyB1c2UgaXQsIHJlbWVtYmVyIHRoYXQgSmF2YSBpcyBhCi1XaW5kb3dzIGFwcGxpY2F0aW9uLCBzbyBBbnQgaXMgcnVubmluZyBpbiBhIFdpbmRvd3MgcHJvY2Vzcywgbm90IGEKLUN5Z3dpbiBvbmUuIFRoaXMgd2lsbCBzYXZlIHVzIGhhdmluZyB0byBtYXJrIHlvdXIgYnVnIHJlcG9ydHMgYXMgaW52YWxpZC4gCi0KLTxoMj5BcHBsZSBNYWNPUyBYPC9oMj4KLQotTWFjT1MgWCBpcyB0aGUgZmlyc3Qgb2YgdGhlIEFwcGxlIHBsYXRmb3JtcyB0aGF0IEFudCBzdXBwb3J0cyBjb21wbGV0ZWx5OwotaXQgaXMgdHJlYXRlZCBsaWtlIGFueSBvdGhlciBVbml4LiAKKzxoMj5BcHBsZSBNYWNPUyBYL21hY09TPC9oMj4KKzxwPgorTWFjT1MgWCBhLmsuYS4gbWFjT1MgaXMgdGhlIGZpcnN0IG9mIHRoZSBBcHBsZSBwbGF0Zm9ybXMgdGhhdCBBbnQgc3VwcG9ydHMgY29tcGxldGVseTsgaXQgaXMgdHJlYXRlZAorbGlrZSBhbnkgb3RoZXIgVW5peC4KKzwvcD4KIAogPGgyPk5vdmVsbCBOZXR3YXJlPC9oMj4KKzxwPgorVG8gZ2l2ZSB0aGUgc2FtZSBsZXZlbCBvZiBzb3BoaXN0aWNhdGVkIGNvbnRyb2wgYXMgQW50J3Mgc3RhcnR1cCBzY3JpcHRzIG9uIG90aGVyIHBsYXRmb3JtcywgaXQgd2FzCitkZWNpZGVkIHRvIG1ha2UgdGhlIG1haW4gYW50IHN0YXJ0dXAgb24gTmV0V2FyZSBiZSB2aWEgYSBQZXJsIFNjcmlwdCwgPGNvZGU+cnVuYW50LnBsPC9jb2RlPi4gIFRoaXMKK2lzIGZvdW5kIGluIHRoZSA8c2FtcD5iaW48L3NhbXA+IGRpcmVjdG9yeSAoZm9yIGluc3RhbmNlJm1kYXNoOzxzYW1wPmJvb3RzdHJhcFxiaW48L3NhbXA+CitvciA8c2FtcD5kaXN0XGJpbjwvc2FtcD4pLgorPC9wPgogCi08cD5UbyBnaXZlIHRoZSBzYW1lIGxldmVsIG9mIHNvcGhpc3RpY2F0ZWQgY29udHJvbCBhcyBBbnQncyBzdGFydHVwIHNjcmlwdHMgb24gb3RoZXIgcGxhdGZvcm1zLCBpdCB3YXMgZGVjaWRlZCB0byBtYWtlIHRoZSBtYWluIGFudCBzdGFydHVwIG9uIE5ldFdhcmUgYmUgdmlhIGEgUGVybCBTY3JpcHQsICJydW5hbnQucGwiLiAgVGhpcyBpcyBmb3VuZCBpbiB0aGUgYmluIGRpcmVjdG9yeSAoZm9yIGluc3RhbmNlIC0gYm9vdHN0cmFwXGJpbiBvciBkaXN0XGJpbikuPC9wPgotCi08cD5PbmUgaW1wb3J0YW50IGl0ZW0gb2Ygbm90ZSBpcyB0aGF0IHlvdSBuZWVkIHRvIHNldCB1cCB0aGUgZm9sbG93aW5nIHRvIHJ1biBhbnQ6PC9wPgotPHVsPjxsaT48Y29kZT5DTEFTU1BBVEg8L2NvZGU+IC0gcHV0IGFudC5qYXIgYW5kIGFueSBvdGhlciBuZWVkZWQgamFycyBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aC48L2xpPgotICAgPGxpPjxjb2RlPkFOVF9PUFRTPC9jb2RlPiAtIE9uIE5ldFdhcmUsIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBuZWVkcyB0byBpbmNsdWRlIGEgcGFyYW1ldGVyIG9mIHRoZSBmb3JtLCA8bm9icj4iLWVudkNXRD08Y29kZT5BTlRfSE9NRTwvY29kZT4iPC9ub2JyPiwgd2l0aCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gYmVpbmcgdGhlIGZ1bGx5IGV4cGFuZGVkIGxvY2F0aW9uIG9mIEFudCwgPGI+bm90PC9iPiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIE5ldFdhcmUgU3lzdGVtIENvbnNvbGUgaGFzIG5vIG5vdGlvbiBvZiBhIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuPC9saT4KKzxwPk9uZSBpbXBvcnRhbnQgaXRlbSBvZiBub3RlIGlzIHRoYXQgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBmb2xsb3dpbmcgdG8gcnVuIEFudDo8L3A+Cis8dWw+CisgIDxsaT48Y29kZT5DTEFTU1BBVEg8L2NvZGU+Jm1kYXNoO3B1dCA8c2FtcD5hbnQuamFyPC9zYW1wPiBhbmQgYW55IG90aGVyIG5lZWRlZCBqYXJzIG9uIHRoZSBzeXN0ZW0KKyAgICBjbGFzc3BhdGguPC9saT4KKyAgPGxpPjxjb2RlPkFOVF9PUFRTPC9jb2RlPiZtZGFzaDtPbiBOZXRXYXJlLCA8Y29kZT5BTlRfT1BUUzwvY29kZT4gbmVlZHMgdG8gaW5jbHVkZSBhIHBhcmFtZXRlciBvZgorICAgIHRoZSBmb3JtLCA8a2JkPi1lbnZDV0Q9PGk+QU5UX0hPTUU8L2k+PC9rYmQ+LCB3aXRoIDxrYmQ+PGk+QU5UX0hPTUU8L2k+PC9rYmQ+IGJlaW5nIHRoZQorICAgIGZ1bGx5IGV4cGFuZGVkIGxvY2F0aW9uIG9mIEFudCwgPHN0cm9uZz5ub3Q8L3N0cm9uZz4gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuICBUaGlzIGlzIGR1ZSB0bworICAgIHRoZSBmYWN0IHRoYXQgdGhlIE5ldFdhcmUgU3lzdGVtIENvbnNvbGUgaGFzIG5vIG5vdGlvbiBvZiBhIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuPC9saT4KIDwvdWw+Ci08cD5JdCBpcyBzdWdnZXN0ZWQgdGhhdCB5b3UgY3JlYXRlIHVwIGFuIGFudC5uY2YgdGhhdCBzZXRzIHVwIHRoZXNlIHBhcmFtZXRlcnMsIGFuZCBjYWxscyA8Y29kZT5wZXJsIEFOVF9IT01FL2Rpc3QvYmluL3J1bmFudC5wbDwvY29kZT48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhbiBOQ0YgZmlsZShhc3N1bWluZyBhbnQgaXMgaW5zdGFsbGVkIGluIDxub2JyPidzeXM6L2FwYWNoZS1hbnQvJyk6PC9ub2JyPjwvcD4KLTxjb2RlPgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7ZW52c2V0IENMQVNTUEFUSD1TWVM6L2FwYWNoZS1hbnQvYm9vdHN0cmFwL2xpYi9hbnQuamFyPGJyPgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7ZW52c2V0IENMQVNTUEFUSD0kQ0xBU1NQQVRIO1NZUzovYXBhY2hlLWFudC9saWIvb3B0aW9uYWwvanVuaXQuamFyIDxicj4KLSAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBDTEFTU1BBVEg9JENMQVNTUEFUSDtTWVM6L2FwYWNoZS1hbnQvYm9vdHN0cmFwL2xpYi9vcHRpb25hbC5qYXIgPGJyPgotPGJyPgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7c2V0ZW52IEFOVF9PUFRTPS1lbnZDV0Q9c3lzOi9hcGFjaGUtYW50IDxicj4KLSAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBBTlRfT1BUUz0tZW52Q1dEPXN5czovYXBhY2hlLWFudCA8YnI+Ci0gICAmbmJzcDsmbmJzcDsmbmJzcDtzZXRlbnYgQU5UX0hPTUU9c3lzOi9hcGFjaGUtYW50L2Rpc3QvbGliIDxicj4KLSAgICZuYnNwOyZuYnNwOyZuYnNwO2VudnNldCBBTlRfSE9NRT1zeXM6L2FwYWNoZS1hbnQvZGlzdC9saWIgPGJyPgotPGJyPgotICAgJm5ic3A7Jm5ic3A7Jm5ic3A7cGVybCBzeXM6L2FwYWNoZS1hbnQvZGlzdC9iaW4vcnVuYW50LnBsIDxicj4KLTwvY29kZT4KKzxwPkl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBjcmVhdGUgdXAgYW4gPHNhbXA+YW50Lm5jZjwvc2FtcD4gdGhhdCBzZXRzIHVwIHRoZXNlIHBhcmFtZXRlcnMsIGFuZAorY2FsbHMgPHNhbXA+cGVybCBBTlRfSE9NRS9kaXN0L2Jpbi9ydW5hbnQucGw8L3NhbXA+PC9wPgorPHA+VGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIHN1Y2ggYW4gTkNGIGZpbGUgKGFzc3VtaW5nIEFudCBpcyBpbnN0YWxsZWQKK2luIDxzYW1wPnN5czovYXBhY2hlLWFudC88L3NhbXA+KTo8L3A+Cis8cHJlPgorZW52c2V0IENMQVNTUEFUSD1zeXM6L2FwYWNoZS1hbnQvYm9vdHN0cmFwL2xpYi9hbnQuamFyCitlbnZzZXQgQ0xBU1NQQVRIPSRDTEFTU1BBVEg7c3lzOi9hcGFjaGUtYW50L2xpYi9vcHRpb25hbC9qdW5pdC5qYXIKK2VudnNldCBDTEFTU1BBVEg9JENMQVNTUEFUSDtzeXM6L2FwYWNoZS1hbnQvYm9vdHN0cmFwL2xpYi9vcHRpb25hbC5qYXIKIAotPHA+QW50IHdvcmtzIG9uIEpWTSB2ZXJzaW9uIDEuMyBvciBoaWdoZXIuICBZb3UgbWF5IGhhdmUgc29tZSBsdWNrIHJ1bm5pbmcgaXQgb24gSlZNIDEuMiwgYnV0IHNlcmlvdXMgcHJvYmxlbXMgaGF2ZSBiZWVuIGZvdW5kIHJ1bm5pbmcgQW50IG9uIEpWTSAxLjEuN0IuICBUaGVzZSBwcm9ibGVtcyBhcmUgY2F1c2VkIGJ5IEpWTSBidWdzIHRoYXQgd2lsbCBub3QgYmUgZml4ZWQuPC9wPgorc2V0ZW52IEFOVF9PUFRTPS1lbnZDV0Q9c3lzOi9hcGFjaGUtYW50CitlbnZzZXQgQU5UX09QVFM9LWVudkNXRD1zeXM6L2FwYWNoZS1hbnQKK3NldGVudiBBTlRfSE9NRT1zeXM6L2FwYWNoZS1hbnQvZGlzdC9saWIKK2VudnNldCBBTlRfSE9NRT1zeXM6L2FwYWNoZS1hbnQvZGlzdC9saWIKKworcGVybCBzeXM6L2FwYWNoZS1hbnQvZGlzdC9iaW4vcnVuYW50LnBsPC9wcmU+CisKKzxwPkFudCB3b3JrcyBvbiBKVk0gdmVyc2lvbiAxLjMgb3IgaGlnaGVyLiAgWW91IG1heSBoYXZlIHNvbWUgbHVjayBydW5uaW5nIGl0IG9uIEpWTSAxLjIsIGJ1dAorc2VyaW91cyBwcm9ibGVtcyBoYXZlIGJlZW4gZm91bmQgcnVubmluZyBBbnQgb24gSlZNIDEuMS43Qi4gIFRoZXNlIHByb2JsZW1zIGFyZSBjYXVzZWQgYnkgSlZNIGJ1Z3MKK3RoYXQgd2lsbCBub3QgYmUgZml4ZWQuPC9wPgogPHA+SlZNIDEuMyBpcyBzdXBwb3J0ZWQgb24gTm92ZWxsIE5ldFdhcmUgdmVyc2lvbnMgNS4xIGFuZCBoaWdoZXIuPC9wPgogCi0KIDxoMj5PdGhlciBwbGF0Zm9ybXM8L2gyPgotU3VwcG9ydCBmb3Igb3RoZXIgcGxhdGZvcm1zIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlLCBhcyBjZXJ0YWluIAotdGVjaG5pcXVlcyB0byBoaWRlIHBsYXRmb3JtIGRldGFpbHMgZnJvbSBidWlsZCBmaWxlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gYW5kCi10ZXN0ZWQgb24gZXZlcnkgcGFydGljdWxhciBwbGF0Zm9ybS4gQ29udHJpYnV0aW9ucyBpbiB0aGlzIGFyZWEgYXJlIHdlbGNvbWUuCis8cD4KK1N1cHBvcnQgZm9yIG90aGVyIHBsYXRmb3JtcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBjb21wbGV0ZSwgYXMgY2VydGFpbiB0ZWNobmlxdWVzIHRvIGhpZGUgcGxhdGZvcm0KK2RldGFpbHMgZnJvbSBidWlsZCBmaWxlcyBuZWVkIHRvIGJlIHdyaXR0ZW4gYW5kIHRlc3RlZCBvbiBldmVyeSBwYXJ0aWN1bGFyIHBsYXRmb3JtLiBDb250cmlidXRpb25zCitpbiB0aGlzIGFyZWEgYXJlIHdlbGNvbWUuCis8L3A+CiAKLQorPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL3Byb2plY3RoZWxwZXIuaHRtbCBiL21hbnVhbC9wcm9qZWN0aGVscGVyLmh0bWwKaW5kZXggMmU0M2Y3OS4uMDJhMTJlNyAxMDA2NDQKLS0tIGEvbWFudWFsL3Byb2plY3RoZWxwZXIuaHRtbAorKysgYi9tYW51YWwvcHJvamVjdGhlbHBlci5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlRoZSBBcGFjaGUgQW50IGZyb250ZW5kOiBQcm9qZWN0SGVscGVyPC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDEyNiArMjUsMTE4IEBACiA8Ym9keT4KIDxoMT5UaGUgQXBhY2hlIEFudCBmcm9udGVuZDogUHJvamVjdEhlbHBlcjwvaDE+CiAKLTxoMj48YSBuYW1lPSJkZWZpbml0aW9uIj5XaGF0IGlzIGEgUHJvamVjdEhlbHBlcj88L2E+PC9oMj4KKzxoMiBpZD0iZGVmaW5pdGlvbiI+V2hhdCBpcyBhIFByb2plY3RIZWxwZXI/PC9oMj4KIAogPHA+Ci1UaGUgPGNvZGU+UHJvamVjdEhlbHBlcjwvY29kZT4gaW4gQXBhY2hlIEFudCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyB0aGUgYnVpbGQgZmlsZQotYW5kIGNyZWF0aW5nIGphdmEgaW5zdGFuY2VzIHJlcHJlc2VudGluZyB0aGUgYnVpbGQgd29ya2Zsb3cuIEl0IGFsc28gc2lnbmFscyB3aGljaAota2luZCBvZiBmaWxlIGl0IGNhbiBwYXJzZSwgYW5kIHdoaWNoIGZpbGUgbmFtZSBpdCBleHBlY3RzIGFzIGRlZmF1bHQgaW5wdXQgZmlsZS4KK1RoZSA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdEhlbHBlcjwvY29kZT4gaW4gQXBhY2hlIEFudCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyB0aGUgYnVpbGQgZmlsZQorYW5kIGNyZWF0aW5nIEphdmEgaW5zdGFuY2VzIHJlcHJlc2VudGluZyB0aGUgYnVpbGQgd29ya2Zsb3cuIEl0IGFsc28gc2lnbmFscyB3aGljaCBraW5kIG9mIGZpbGUgaXQKK2NhbiBwYXJzZSwgYW5kIHdoaWNoIGZpbGUgbmFtZSBpdCBleHBlY3RzIGFzIGRlZmF1bHQgaW5wdXQgZmlsZS4KIDwvcD4KIAogPHA+Ci1BbnQnIGRlZmF1bHQgPGNvZGU+UHJvamVjdEhlbHBlcjwvY29kZT4KLSg8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuUHJvamVjdEhlbHBlcjI8L2NvZGU+KSBwYXJzZXMgdGhlCi11c3VhbCBidWlsZC54bWwgZmlsZXMuIEFuZCBpZiBubyBidWlsZCBmaWxlIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdAotd2lsbCBleHBlY3QgdG8gZmluZCBhIGZpbGUgbmFtZWQgPGNvZGU+YnVpbGQueG1sPC9jb2RlPi4KK0FudCdzIGRlZmF1bHQgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3RIZWxwZXI8L2NvZGU+CisoPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5Qcm9qZWN0SGVscGVyMjwvY29kZT4pIHBhcnNlcyB0aGUKK3VzdWFsIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZXMuIEFuZCBpZiBubyBidWlsZCBmaWxlIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBpdCB3aWxsCitleHBlY3QgdG8gZmluZCBhIGZpbGUgbmFtZWQgPGNvZGU+YnVpbGQueG1sPC9jb2RlPi4KIDwvcD4KIAogPHA+Ci1UaGUgaW1tZWRpYXRlIGJlbmVmaXQgb2YgYSBzdWNoIGFic3RyYWN0aW9uIGl0IHRoYXQgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBBbnQKLXVuZGVyc3RhbmQgb3RoZXIga2luZCBvZiBkZXNjcmlwdGl2ZSBsYW5ndWFnZXMgdGhhbiBYTUwuIFNvbWUgZXhwZXJpbWVudHMgaGF2ZQotYmVlbiBkb25lIGFyb3VuZCBhIHB1cmUgamF2YSBmcm9udGVuZCwgYW5kIGEgZ3Jvb3Z5IG9uZSB0b28gKGFzayB0aGUgZGV2IG1haWxpbmcKLWxpc3QgZm9yIGZ1cnRoZXIgaW5mbyBhYm91dCB0aGVzZSkuCitUaGUgaW1tZWRpYXRlIGJlbmVmaXQgb2YgYSBzdWNoIGFic3RyYWN0aW9uIGl0IHRoYXQgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBBbnQgdW5kZXJzdGFuZCBvdGhlciBraW5kCitvZiBkZXNjcmlwdGl2ZSBsYW5ndWFnZXMgdGhhbiBYTUwuIFNvbWUgZXhwZXJpbWVudHMgaGF2ZSBiZWVuIGRvbmUgYXJvdW5kIGEgcHVyZSBKYXZhIGZyb250ZW5kLCBhbmQKK2EgR3Jvb3Z5IG9uZSB0b28gKGFzayB0aGUgZGV2IG1haWxpbmcgbGlzdCBmb3IgZnVydGhlciBpbmZvIGFib3V0IHRoZXNlKS4KIDwvcD4KIAotPHA+U2luY2UgQW50IDEuOC4yLCB0aGUgPGEgaHJlZj0iVGFza3MvaW1wb3J0Lmh0bWwiPmltcG9ydDwvYT4gdGFzayB3aWxsIGFsc28KLXRyeSB0byB1c2UgdGhlIHByb3BlciBoZWxwZXIgdG8gcGFyc2UgdGhlIGltcG9ydGVkIGZpbGUuIFNvIGl0IGlzIHBvc3NpYmxlIHRvCi13cml0ZSBkaWZmZXJlbnQgYnVpbGQgZmlsZXMgaW4gZGlmZmVyZW50IGxhbmd1YWdlcyBhbmQgaGF2ZSB0aGVtIGltcG9ydCBlYWNoCi1vdGhlci4KLTwvcD4KLQotPGgyPjxhIG5hbWU9InJlcG9zaXRvcnkiPkhvdyBpcyBBbnQgaXMgc2VsZWN0aW5nIHRoZSBwcm9wZXIgUHJvamVjdEhlbHBlcjwvYT48L2gyPgotCiA8cD4KLUFudCBrbm93cyBhYm91dCBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBvZiA8Y29kZT5Qcm9qZWN0SGVscGVyPC9jb2RlPgotYW5kIGhhcyB0byBkZWNpZGUgd2hpY2ggdG8gdXNlIGZvciBlYWNoIGJ1aWxkIGZpbGUuCis8ZW0+U2luY2UgQW50IDEuOC4yPC9lbT4sIHRoZSA8YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+aW1wb3J0PC9hPiB0YXNrIHdpbGwgYWxzbyB0cnkgdG8gdXNlIHRoZQorcHJvcGVyIGhlbHBlciB0byBwYXJzZSB0aGUgaW1wb3J0ZWQgZmlsZS4gU28gaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgZGlmZmVyZW50IGJ1aWxkIGZpbGVzIGluCitkaWZmZXJlbnQgbGFuZ3VhZ2VzIGFuZCBoYXZlIHRoZW0gaW1wb3J0IGVhY2ggb3RoZXIuCiA8L3A+CiAKLTxwPkF0IHN0YXJ0dXAgQW50IGxpc3RzIHRoZSBhbGwgaW1wbGVtZW50YXRpb25zIGZvdW5kIGFuZCBrZWVwcyB0aGVtCi1pbiB0aGUgc2FtZSBvcmRlciB0aGV5J3ZlIGJlZW4gZm91bmQgaW4gYW4gaW50ZXJuYWwgJ3JlcG9zaXRvcnknOgorPGgyIGlkPSJyZXBvc2l0b3J5Ij5Ib3cgaXMgQW50IGlzIHNlbGVjdGluZyB0aGUgcHJvcGVyIFByb2plY3RIZWxwZXI8L2gyPgorCis8cD4KK0FudCBrbm93cyBhYm91dCBzZXZlcmFsIGltcGxlbWVudGF0aW9ucyBvZiA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdEhlbHBlcjwvY29kZT4gYW5kIGhhcyB0byBkZWNpZGUKK3doaWNoIHRvIHVzZSBmb3IgZWFjaCBidWlsZCBmaWxlLgorPC9wPgorCis8cD4KK0F0IHN0YXJ0dXAgQW50IGxpc3RzIHRoZSBhbGwgaW1wbGVtZW50YXRpb25zIGZvdW5kIGFuZCBrZWVwcyB0aGVtIGluIHRoZSBzYW1lIG9yZGVyIHRoZXkndmUgYmVlbgorZm91bmQgaW4gYW4gaW50ZXJuYWwgJ3JlcG9zaXRvcnknOgorPC9wPgogPHVsPgotICAgIDxsaT50aGUgZmlyc3QgdG8gYmUgc2VhcmNoZWQgZm9yIGlzIHRoZSBvbmUgZGVjbGFyZWQgYnkgdGhlIHN5c3RlbSBwcm9wZXJ0eQotICAgICAgICA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyPC9jb2RlPiAoc2VlCi0gICAgICAgIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNzeXNwcm9wcyI+SmF2YSBTeXN0ZW0gUHJvcGVydGllczwvYT4pOzwvbGk+Ci0gICAgPGxpPnRoZW4gaXQgc2VhcmNoZXMgd2l0aCBpdHMgY2xhc3MgbG9hZGVyIGZvciBhIDxjb2RlPlByb2plY3RIZWxwZXI8L2NvZGU+Ci0gICAgICAgIHNlcnZpY2UgZGVjbGFyYXRpb25zIGluIHRoZSBNRVRBLUlORjogaXQgc2VhcmNoZXMgaW4gdGhlIGNsYXNzcGF0aCBmb3IgYQotICAgICAgICBmaWxlIDxjb2RlPk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+LgotICAgICAgICBUaGlzIGZpbGUgd2lsbCBqdXN0IGNvbnRhaW4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZQotICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Qcm9qZWN0SGVscGVyPC9jb2RlPiB0byBpbnN0YW50aWF0ZTs8L2xpPgotICAgIDxsaT5pdCB3aWxsIGFsc28gc2VhcmNoIHdpdGggdGhlIHN5c3RlbSBjbGFzcyBsb2FkZXIgZm9yCi0gICAgICAgIDxjb2RlPlByb2plY3RIZWxwZXI8L2NvZGU+IHNlcnZpY2UgZGVjbGFyYXRpb25zIGluIHRoZSBNRVRBLUlORjs8L2xpPgotICAgIDxsaT5sYXN0IGJ1dCBub3QgbGVhc3QgaXQgd2lsbCBhZGQgaXRzIGRlZmF1bHQgPGNvZGU+UHJvamVjdEhlbHBlcjwvY29kZT4KLSAgICAgICAgdGhhdCBjYW4gcGFyc2UgY2xhc3NpY2FsIGJ1aWxkLnhtbCBmaWxlcy48L2xpPgorICA8bGk+dGhlIGZpcnN0IHRvIGJlIHNlYXJjaGVkIGZvciBpcyB0aGUgb25lIGRlY2xhcmVkIGJ5IHRoZSBzeXN0ZW0KKyAgICBwcm9wZXJ0eSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjwvY29kZT4KKyAgICAoc2VlIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNzeXNwcm9wcyI+SmF2YSBTeXN0ZW0gUHJvcGVydGllczwvYT4pOzwvbGk+CisgIDxsaT50aGVuIGl0IHNlYXJjaGVzIHdpdGggaXRzIGNsYXNzIGxvYWRlciBmb3IgYSA8Y29kZT5Qcm9qZWN0SGVscGVyPC9jb2RlPiBzZXJ2aWNlIGRlY2xhcmF0aW9ucworICAgIGluIHRoZSA8c2FtcD5NRVRBLUlORjwvc2FtcD46IGl0IHNlYXJjaGVzIGluIHRoZSBjbGFzc3BhdGggZm9yIGEKKyAgICBmaWxlIDxzYW1wPk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L3NhbXA+LiAgVGhpcyBmaWxlIHdpbGwganVzdAorICAgIGNvbnRhaW4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9qZWN0SGVscGVyPC9jb2RlPiB0byBpbnN0YW50aWF0ZTs8L2xpPgorICA8bGk+aXQgd2lsbCBhbHNvIHNlYXJjaCB3aXRoIHRoZSBzeXN0ZW0gY2xhc3MgbG9hZGVyIGZvciA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdEhlbHBlcjwvY29kZT4KKyAgICBzZXJ2aWNlIGRlY2xhcmF0aW9ucyBpbiB0aGUgPHNhbXA+TUVUQS1JTkY8L3NhbXA+OzwvbGk+CisgIDxsaT5sYXN0IGJ1dCBub3QgbGVhc3QgaXQgd2lsbCBhZGQgaXRzIGRlZmF1bHQgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3RIZWxwZXI8L2NvZGU+IHRoYXQgY2FuCisgICAgcGFyc2UgY2xhc3NpY2FsIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gZmlsZXMuPC9saT4KIDwvdWw+Ci1JbiBjYXNlIG9mIGFuIGVycm9yIHdoaWxlIHRyeWluZyB0byBpbnN0YW50aWF0ZSBhIDxjb2RlPlByb2plY3RIZWxwZXI8L2NvZGU+LCBBbnQKLXdpbGwgbG9nIGFuIGVycm9yIGJ1dCB3b24ndCBzdG9wLiAgSWYgeW91IHdhbnQgZnVydGhlciBkZWJ1Z2dpbmcKLWluZm8gYWJvdXQgdGhlIDxjb2RlPlByb2plY3RIZWxwZXI8L2NvZGU+IGludGVybmFsICdyZXBvc2l0b3J5JywgdXNlIHRoZSA8Yj5zeXN0ZW08L2I+Ci1wcm9wZXJ0eSA8Y29kZT5hbnQucHJvamVjdC1oZWxwZXItcmVwby5kZWJ1ZzwvY29kZT4gYW5kIHNldCBpdCB0bwotPGNvZGU+dHJ1ZTwvY29kZT47IHRoZSBmdWxsIHN0YWNrIHRyYWNlIHdpbGwgdGhlbiBhbHNvIGJlIHByaW50ZWQuCis8cD4KK0luIGNhc2Ugb2YgYW4gZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGEgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3RIZWxwZXI8L2NvZGU+LCBBbnQgd2lsbAorbG9nIGFuIGVycm9yIGJ1dCB3b24ndCBzdG9wLiAgSWYgeW91IHdhbnQgZnVydGhlciBkZWJ1Z2dpbmcgaW5mbyBhYm91dAordGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9qZWN0SGVscGVyPC9jb2RlPiBpbnRlcm5hbCAncmVwb3NpdG9yeScsIHVzZSB0aGUgPHN0cm9uZz5zeXN0ZW08L3N0cm9uZz4KK3Byb3BlcnR5IDxjb2RlPmFudC5wcm9qZWN0LWhlbHBlci1yZXBvLmRlYnVnPC9jb2RlPiBhbmQgc2V0IGl0IHRvIDxxPnRydWU8L3E+OyB0aGUgZnVsbCBzdGFjayB0cmFjZQord2lsbCB0aGVuIGFsc28gYmUgcHJpbnRlZC4KIDwvcD4KIAogPHA+Ci1XaGVuIEFudCBpcyBleHBlY3RlZCB0byBwYXJzZSBhIGZpbGUsIGl0IHdpbGwgYXNrIHRoZQotPGNvZGU+UHJvamVjdEhlbHBlcjwvY29kZT4gcmVwb3NpdG9yeSB0byBmaW5kIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBiZQotYWJsZSB0byBwYXJzZSB0aGUgaW5wdXQgZmlsZS4gQWN0dWFsbHkgaXQgd2lsbCBqdXN0IGl0ZXJhdGUgb3ZlciB0aGUgb3JkZXJlZCBsaXN0Ci1hbmQgdGhlIGZpcnN0IGltcGxlbWVudGF0aW9uIHRoYXQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiB0bwotPGNvZGU+c3VwcG9ydHNCdWlsZEZpbGUoRmlsZSBidWlsZEZpbGUpPC9jb2RlPiB3aWxsIGJlIHNlbGVjdGVkLgorV2hlbiBBbnQgaXMgZXhwZWN0ZWQgdG8gcGFyc2UgYSBmaWxlLCBpdCB3aWxsIGFzayB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3RIZWxwZXI8L2NvZGU+CityZXBvc2l0b3J5IHRvIGZpbmQgYW4gaW1wbGVtZW50YXRpb24gdGhhdCB3aWxsIGJlIGFibGUgdG8gcGFyc2UgdGhlIGlucHV0IGZpbGUuIEFjdHVhbGx5IGl0IHdpbGwKK2p1c3QgaXRlcmF0ZSBvdmVyIHRoZSBvcmRlcmVkIGxpc3QgYW5kIHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgPHE+dHJ1ZTwvcT4KK3RvIDxjb2RlIGNsYXNzPSJjb2RlIj5zdXBwb3J0c0J1aWxkRmlsZShGaWxlIGJ1aWxkRmlsZSk8L2NvZGU+IHdpbGwgYmUgc2VsZWN0ZWQuCiA8L3A+CiAKIDxwPgotV2hlbiBBbnQgaXMgc3RhcnRlZCBhbmQgbm8gaW5wdXQgZmlsZSBoYXMgYmVlbiBzcGVjaWZpZWQsIGl0IHdpbGwgc2VhcmNoIGZvcgotYSBkZWZhdWx0IGlucHV0IGZpbGUuIEl0IHdpbGwgaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgPGNvZGU+UHJvamVjdEhlbHBlcjwvY29kZT5zCi1hbmQgd2lsbCBzZWxlY3QgdGhlIGZpcnN0IG9uZSB0aGF0IGV4cGVjdHMgYSBkZWZhdWx0IGZpbGUgdGhhdCBhY3R1YWxseSBleGlzdC4KK1doZW4gQW50IGlzIHN0YXJ0ZWQgYW5kIG5vIGlucHV0IGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCBpdCB3aWxsIHNlYXJjaCBmb3IgYSBkZWZhdWx0IGlucHV0CitmaWxlLiBJdCB3aWxsIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9qZWN0SGVscGVyPC9jb2RlPnMgYW5kIHdpbGwgc2VsZWN0IHRoZQorZmlyc3Qgb25lIHRoYXQgZXhwZWN0cyBhIGRlZmF1bHQgZmlsZSB0aGF0IGFjdHVhbGx5IGV4aXN0LgogPC9wPgogCi08aDI+PGEgbmFtZT0id3JpdGluZyI+V3JpdGluZyB5b3VyIG93biBQcm9qZWN0SGVscGVyPC9hPjwvaDI+Cis8aDIgaWQ9IndyaXRpbmciPldyaXRpbmcgeW91ciBvd24gUHJvamVjdEhlbHBlcjwvaDI+CiAKIDxwPgotVGhlIGNsYXNzIDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+IGlzIHRoZSBBUEkgZXhwZWN0ZWQgdG8KLWJlIGltcGxlbWVudGVkLiBTbyB3cml0ZSB5b3VyIG93biA8Y29kZT5Qcm9qZWN0SGVscGVyPC9jb2RlPiBieSBleHRlbmRpbmcgdGhhdAotYWJzdHJhY3QgY2xhc3MuIFlvdSBhcmUgdGhlbiBleHBlY3RlZCB0byBpbXBsZW1lbnQgYXQgbGVhc3QgdGhlIGZ1bmN0aW9uCi08Y29kZT5wYXJzZShQcm9qZWN0IHByb2plY3QsIE9iamVjdCBzb3VyY2UpPC9jb2RlPi4gTm90ZSBhbHNvIHRoYXQgeW91cgotaW1wbGVtZW50YXRpb24gd2lsbCBiZSBpbnN0YW50aWF0ZWQgYnkgQW50LCBhbmQgaXQgaXMgZXhwZWN0aW5nIGEgZGVmYXVsdAotY29uc3RydWN0b3Igd2l0aCBubyBhcmd1bWVudHMuCitUaGUgY2xhc3MgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+IGlzIHRoZSBBUEkgZXhwZWN0ZWQgdG8gYmUKK2ltcGxlbWVudGVkLiBTbyB3cml0ZSB5b3VyIG93biA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdEhlbHBlcjwvY29kZT4gYnkgZXh0ZW5kaW5nIHRoYXQgYWJzdHJhY3QKK2NsYXNzLiBZb3UgYXJlIHRoZW4gZXhwZWN0ZWQgdG8gaW1wbGVtZW50IGF0IGxlYXN0IHRoZSBmdW5jdGlvbiA8Y29kZSBjbGFzcz0iY29kZSI+cGFyc2UoUHJvamVjdAorcHJvamVjdCwgT2JqZWN0IHNvdXJjZSk8L2NvZGU+LiBOb3RlIGFsc28gdGhhdCB5b3VyIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgaW5zdGFudGlhdGVkIGJ5IEFudCwgYW5kCitpdCBpcyBleHBlY3RpbmcgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggbm8gYXJndW1lbnRzLgogPC9wPgogCiA8cD4KLVRoZXJlIGFyZSBzb21lIGZ1bmN0aW9ucyB0aGF0IHdpbGwgaGVscCB5b3UgZGVmaW5lIHdoYXQgeW91ciBoZWxwZXIgaXMKLWNhcGFibGUgb2YgYW5kIHdoYXQgaXMgaXMgZXhwZWN0aW5nOgorVGhlcmUgYXJlIHNvbWUgZnVuY3Rpb25zIHRoYXQgd2lsbCBoZWxwIHlvdSBkZWZpbmUgd2hhdCB5b3VyIGhlbHBlciBpcyBjYXBhYmxlIG9mIGFuZCB3aGF0IGlzIGlzCitleHBlY3Rpbmc6Cis8L3A+CiA8dWw+Ci0gICAgPGxpPjxjb2RlPmdldERlZmF1bHRCdWlsZEZpbGUoKTwvY29kZT46IGRlZmluZXMgd2hpY2ggZmlsZSBuYW1lIGlzIGV4cGVjdGVkIGlmCi0gICAgbm9uZSBwcm92aWRlZDwvbGk+Ci0gICAgPGxpPjxjb2RlPnN1cHBvcnRzQnVpbGRGaWxlKEZpbGUgYnVpbGRGaWxlKTwvY29kZT46IGRlZmluZXMgaWYgeW91ciBwYXJzZXIKLSAgICBjYW4gcGFyc2UgdGhlIGlucHV0IGZpbGU8L2xpPgotCi0gICAgPGxpPjxjb2RlPmNhblBhcnNlQW50bGliRGVzY3JpcHRvcihVUkwgdXJsKTwvY29kZT46IHdoZXRoZXIgeW91cgotICAgICAgaW1wbGVtZW50YXRpb24gaXMgY2FwYWJsZSBvZiBwYXJzaW5nIGEgZ2l2ZW4gQW50bGliCi0gICAgICBkZXNjcmlwdG9yLiAgVGhlIGJhc2UgY2xhc3MgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT48L2xpPgotICAgIDxsaT48Y29kZT5wYXJzZUFudGxpYkRlc2NyaXB0b3IoUHJvamVjdCBjb250YWluaW5nUHJvamVjdCwgVVJMCi0gICAgICAgIHNvdXJjZSk8L2NvZGU+OiBpbnZva2VkIHRvIGFjdHVhbGx5IHBhcnNlIHRoZSBBbnRsaWIKLSAgICAgIGRlc2NyaXB0b3IgaWYgeW91ciBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCA8Y29kZT50cnVlPC9jb2RlPgotICAgICAgZm9yIHRoZSBwcmV2aW91cyBtZXRob2QuPC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5nZXREZWZhdWx0QnVpbGRGaWxlKCk8L2NvZGU+OiBkZWZpbmVzIHdoaWNoIGZpbGUgbmFtZSBpcyBleHBlY3RlZCBpZiBub25lCisgICAgcHJvdmlkZWQ8L2xpPgorICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPnN1cHBvcnRzQnVpbGRGaWxlKEZpbGUgYnVpbGRGaWxlKTwvY29kZT46IGRlZmluZXMgaWYgeW91ciBwYXJzZXIgY2FuIHBhcnNlCisgICAgdGhlIGlucHV0IGZpbGU8L2xpPgorICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPmNhblBhcnNlQW50bGliRGVzY3JpcHRvcihVUkwgdXJsKTwvY29kZT46IHdoZXRoZXIgeW91ciBpbXBsZW1lbnRhdGlvbiBpcworICAgIGNhcGFibGUgb2YgcGFyc2luZyBhIGdpdmVuIEFudGxpYiBkZXNjcmlwdG9yLiAgVGhlIGJhc2UgY2xhc3MgcmV0dXJucyA8cT5mYWxzZTwvcT48L2xpPgorICA8bGk+PGNvZGUgY2xhc3M9ImNvZGUiPnBhcnNlQW50bGliRGVzY3JpcHRvcihQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0LCBVUkwgc291cmNlKTwvY29kZT46CisgICAgaW52b2tlZCB0byBhY3R1YWxseSBwYXJzZSB0aGUgQW50bGliIGRlc2NyaXB0b3IgaWYgeW91ciBpbXBsZW1lbnRhdGlvbiByZXR1cm5lZCA8cT50cnVlPC9xPiBmb3IKKyAgICB0aGUgcHJldmlvdXMgbWV0aG9kLjwvbGk+CiA8L3VsPgotPC9wPgogCiA8cD4KLU5vdyB0aGF0IHlvdSBoYXZlIHlvdXIgaW1wbGVtZW50YXRpb24gcmVhZHksIHlvdSBoYXZlIHRvIGRlY2xhcmUgaXQgdG8gQW50LiBUaHJlZQotc29sdXRpb25zIGhlcmU6Ci08dWw+Ci0gICAgPGxpPnVzZSB0aGUgc3lzdGVtIHByb3BlcnR5IDxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+Ci0gICAgICAgIChzZWUgYWxzbyB0aGUgPGEgaHJlZj0icnVubmluZy5odG1sI3N5c3Byb3BzIj5KYXZhIFN5c3RlbSBQcm9wZXJ0aWVzPC9hPik7PC9saT4KLSAgICA8bGk+dXNlIHRoZSBzZXJ2aWNlIGZpbGUgaW4gTUVUQS1JTkY6IGluIHRoZSBqYXIgeW91IHdpbGwgYnVpbGQgd2l0aCB5b3VyCi0gICAgICAgIGltcGxlbWVudGF0aW9uLCBhZGQgYSBmaWxlCi0gICAgICAgIDxjb2RlPk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+LgotICAgICAgICBBbmQgdGhlbiBpbiB0aGlzIGZpbGUganVzdCBwdXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHlvdXIKLSAgICAgICAgaW1wbGVtZW50YXRpb248L2xpPgotICAgIDxsaT51c2UgdGhlIDxhIGhyZWY9IlRhc2tzL3Byb2plY3RoZWxwZXIuaHRtbCI+cHJvamVjdGhlbHBlcjwvYT4gdGFzayAoc2luY2UKLSAgICAgICAgQW50IDEuOC4yKSB3aGljaCB3aWxsIGluc3RhbGwgZHluYW1pY2FsbHkgYW4gaGVscGVyIGluIHRoZSBpbnRlcm5hbCBoZWxwZXIKLSAgICAgICAgJ3JlcG9zaXRvcnknLiBUaGVuIHlvdXIgaGVscGVyIGNhbiBiZSB1c2VkIG9uIHRoZSBuZXh0IGNhbGwgdG8gdGhlCi0gICAgICAgIDxhIGhyZWY9IlRhc2tzL2ltcG9ydC5odG1sIj5pbXBvcnQ8L2E+IHRhc2suPC9saT4KLTwvdWw+CitOb3cgdGhhdCB5b3UgaGF2ZSB5b3VyIGltcGxlbWVudGF0aW9uIHJlYWR5LCB5b3UgaGF2ZSB0byBkZWNsYXJlIGl0IHRvIEFudC4gVGhyZWUgc29sdXRpb25zIGhlcmU6CiA8L3A+Cis8dWw+CisgIDxsaT51c2UgdGhlIHN5c3RlbSBwcm9wZXJ0eSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjwvY29kZT4gKHNlZSBhbHNvCisgICAgdGhlIDxhIGhyZWY9InJ1bm5pbmcuaHRtbCNzeXNwcm9wcyI+SmF2YSBTeXN0ZW0gUHJvcGVydGllczwvYT4pOzwvbGk+CisgIDxsaT51c2UgdGhlIHNlcnZpY2UgZmlsZSBpbiA8c2FtcD5NRVRBLUlORjwvc2FtcD46IGluIHRoZSBqYXIgeW91IHdpbGwgYnVpbGQgd2l0aCB5b3VyCisgICAgaW1wbGVtZW50YXRpb24sIGFkZCBhIGZpbGUgPHNhbXA+TUVUQS1JTkYvc2VydmljZXMvb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlcjwvc2FtcD4uCisgICAgQW5kIHRoZW4gaW4gdGhpcyBmaWxlIGp1c3QgcHV0IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB5b3VyIGltcGxlbWVudGF0aW9uPC9saT4KKyAgPGxpPnVzZSB0aGUgPGEgaHJlZj0iVGFza3MvcHJvamVjdGhlbHBlci5odG1sIj5wcm9qZWN0aGVscGVyPC9hPiB0YXNrICg8ZW0+c2luY2UgQW50IDEuOC4yPC9lbT4pCisgICAgd2hpY2ggd2lsbCBpbnN0YWxsIGR5bmFtaWNhbGx5IGEgaGVscGVyIGluIHRoZSBpbnRlcm5hbCBoZWxwZXIgJ3JlcG9zaXRvcnknLiBUaGVuIHlvdXIgaGVscGVyCisgICAgY2FuIGJlIHVzZWQgb24gdGhlIG5leHQgY2FsbCB0byB0aGUgPGEgaHJlZj0iVGFza3MvaW1wb3J0Lmh0bWwiPmltcG9ydDwvYT4gdGFzay48L2xpPgorPC91bD4KIAogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9tYW51YWwvcHJvcGVydGllcy5odG1sIGIvbWFudWFsL3Byb3BlcnRpZXMuaHRtbAppbmRleCAyMjY5NzJhLi5jMDU4YWY5IDEwMDY0NAotLS0gYS9tYW51YWwvcHJvcGVydGllcy5odG1sCisrKyBiL21hbnVhbC9wcm9wZXJ0aWVzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIi8+CiAgIDx0aXRsZT5Qcm9wZXJ0aWVzIGFuZCBQcm9wZXJ0eUhlbHBlcnM8L3RpdGxlPgogPC9oZWFkPgpAQCAtMjUsMTUyICsyNSwxMzggQEAKIDxib2R5PgogICA8aDE+UHJvcGVydGllczwvaDE+CiAKLSAgPHA+UHJvcGVydGllcyBhcmUga2V5LXZhbHVlLXBhaXJzIHdoZXJlIEFwYWNoZSBBbnQgdHJpZXMgdG8KLSAgICBleHBhbmQgPGNvZGU+JHtrZXl9PC9jb2RlPiB0byA8Y29kZT52YWx1ZTwvY29kZT4gYXQgcnVudGltZS48L3A+CisgIDxwPlByb3BlcnRpZXMgYXJlIGtleS12YWx1ZSBwYWlycyB3aGVyZSBBcGFjaGUgQW50IHRyaWVzIHRvIGV4cGFuZCA8Y29kZT4ke2tleX08L2NvZGU+CisgICAgdG8gPGNvZGU+dmFsdWU8L2NvZGU+IGF0IHJ1biB0aW1lLjwvcD4KIAotICA8cD5UaGVyZSBhcmUgbWFueSB0YXNrcyB0aGF0IGNhbiBzZXQgcHJvcGVydGllcywgdGhlIG1vc3QgY29tbW9uIG9uZQotICAgIGlzIHRoZSA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzay4gIEluCi0gICAgYWRkaXRpb24gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZAotICAgIHZpYSA8YSBocmVmPSJydW5uaW5nLmh0bWwiPmNvbW1hbmQgbGluZSBhcmd1bWVudHM8L2E+IG9yIHNpbWlsYXIKLSAgICBtZWNoYW5pc21zIGZyb20gb3V0c2lkZSBvZiBBbnQuPC9wPgorICA8cD5UaGVyZSBhcmUgbWFueSB0YXNrcyB0aGF0IGNhbiBzZXQgcHJvcGVydGllczsgdGhlIG1vc3QgY29tbW9uIG9uZSBpcworICAgIHRoZSA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzay4gIEluIGFkZGl0aW9uIHByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQKKyAgICB2aWEgPGEgaHJlZj0icnVubmluZy5odG1sIj5jb21tYW5kIGxpbmUgYXJndW1lbnRzPC9hPiBvciBzaW1pbGFyIG1lY2hhbmlzbXMgZnJvbSBvdXRzaWRlIG9mCisgICAgQW50LjwvcD4KIAotICA8cD5Ob3JtYWxseSBwcm9wZXJ0eSB2YWx1ZXMgY2FuIG5vdCBiZSBjaGFuZ2VkLCBvbmNlIGEgcHJvcGVydHkgaXMKLSAgICBzZXQsIG1vc3QgdGFza3Mgd2lsbCBub3QgYWxsb3cgaXRzIHZhbHVlIHRvIGJlIG1vZGlmaWVkLiAgSW4KLSAgICBnZW5lcmFsIHByb3BlcnRpZXMgYXJlIG9mIGdsb2JhbCBzY29wZSwgaS5lLiBvbmNlIHRoZXkgaGF2ZSBiZWVuCi0gICAgZGVmaW5lZCB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIGFueSB0YXNrIG9yIHRhcmdldCBpbnZva2VkCi0gICAgc3Vic2VxdWVudGx5IC0gaXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBhIHByb3BlcnR5IGluIGEgY2hpbGQKLSAgICBidWlsZCBwcm9jZXNzIGNyZWF0ZWQgdmlhCi0gICAgdGhlIDxhIGhyZWY9IlRhc2tzL2FudC5odG1sIj5hbnQ8L2E+LCBhbnRjYWxsIG9yIHN1YmFudCB0YXNrcwotICAgIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB0byB0aGUgY2FsbGluZyBidWlsZCBwcm9jZXNzLCB0aG91Z2guPC9wPgorICA8cD5Ob3JtYWxseSBwcm9wZXJ0eSB2YWx1ZXMgY2FuIG5vdCBiZSBjaGFuZ2VkOiBvbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBtb3N0IHRhc2tzIHdpbGwgbm90IGFsbG93CisgICAgaXRzIHZhbHVlIHRvIGJlIG1vZGlmaWVkLiAgSW4gZ2VuZXJhbCBwcm9wZXJ0aWVzIGFyZSBvZiBnbG9iYWwgc2NvcGUsIGkuZS4sIG9uY2UgdGhleSBoYXZlIGJlZW4KKyAgICBkZWZpbmVkIHRoZXkgYXJlIGF2YWlsYWJsZSBmb3IgYW55IHRhc2sgb3IgdGFyZ2V0IGludm9rZWQgc3Vic2VxdWVudGx5Jm1kYXNoO2l0IGlzIG5vdCBwb3NzaWJsZQorICAgIHRvIHNldCBhIHByb3BlcnR5IGluIGEgY2hpbGQgYnVpbGQgcHJvY2VzcyBjcmVhdGVkIHZpYQorICAgIHRoZSA8YSBocmVmPSJUYXNrcy9hbnQuaHRtbCI+YW50PC9hPiwgPGEgaHJlZj0iVGFza3MvYW50Y2FsbC5odG1sIj5hbnRjYWxsPC9hPgorICAgIG9yIDxhIGhyZWY9IlRhc2tzL3N1YmFudC5odG1sIj5zdWJhbnQ8L2E+IHRhc2tzIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB0byB0aGUgY2FsbGluZyBidWlsZAorICAgIHByb2Nlc3MsIHRob3VnaC48L3A+CiAKLSAgPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS44LjAKLSAgICB0aGUgPGEgaHJlZj0iVGFza3MvbG9jYWwuaHRtbCI+bG9jYWw8L2E+IHRhc2sgY2FuIGJlIHVzZWQgdG8KLSAgICBjcmVhdGUgcHJvcGVydGllcyB0aGF0IGFyZSBsb2NhbGx5IHNjb3BlZCB0byBhIHRhcmdldCBvcgotICAgIGEgPGEgaHJlZj0iVGFza3Mvc2VxdWVudGlhbC5odG1sIj5zZXF1ZW50aWFsPC9hPiBlbGVtZW50IGxpa2UKLSAgICB0aGUgb25lIG9mIHRoZSA8YSBocmVmPSJUYXNrcy9tYWNyb2RlZi5odG1sIj5tYWNyb2RlZjwvYT4KLSAgICB0YXNrLjwvcD4KKyAgPHA+PGVtPlNpbmNlIEFudCAxLjguMDwvZW0+IHRoZSA8YSBocmVmPSJUYXNrcy9sb2NhbC5odG1sIj5sb2NhbDwvYT4gdGFzayBjYW4gYmUgdXNlZCB0byBjcmVhdGUKKyAgICBwcm9wZXJ0aWVzIHRoYXQgYXJlIGxvY2FsbHkgc2NvcGVkIHRvIGEgdGFyZ2V0IG9yCisgICAgYSA8YSBocmVmPSJUYXNrcy9zZXF1ZW50aWFsLmh0bWwiPnNlcXVlbnRpYWw8L2E+IGVsZW1lbnQgbGlrZSB0aGUgb25lIG9mCisgICAgdGhlIDxhIGhyZWY9IlRhc2tzL21hY3JvZGVmLmh0bWwiPm1hY3JvZGVmPC9hPiB0YXNrLjwvcD4KIAotICA8aDI+PGEgbmFtZT0iYnVpbHQtaW4tcHJvcHMiPkJ1aWx0LWluIFByb3BlcnRpZXM8L2E+PC9oMj4KKyAgPGgyIGlkPSJidWlsdC1pbi1wcm9wcyI+QnVpbHQtaW4gUHJvcGVydGllczwvaDI+CiAKLSAgPHA+QW50IHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgc3lzdGVtIHByb3BlcnRpZXMgYXMgaWYgdGhleSBoYWQgYmVlbgotICAgIGRlZmluZWQgdXNpbmcgYSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiB0YXNrLiAgRm9yCi0gICAgZXhhbXBsZSwgPGNvZGU+JHtvcy5uYW1lfTwvY29kZT4gZXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUKLSAgICBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLSAgPHA+Rm9yIGEgbGlzdCBvZiBzeXN0ZW0gcHJvcGVydGllcyBzZWUKLSAgICA8YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvbGFuZy9TeXN0ZW0uaHRtbCNnZXRQcm9wZXJ0aWVzJTI4JTI5Ij50aGUgSmF2YWRvYyBvZiBTeXN0ZW0uZ2V0UHJvcGVydGllczwvYT4uCisgIDxwPkFudCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHN5c3RlbSBwcm9wZXJ0aWVzIGFzIGlmIHRoZXkgaGFkIGJlZW4gZGVmaW5lZCB1c2luZworICAgIGEgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4gdGFzay4gIEZvciBleGFtcGxlLCA8c2FtcD4ke29zLm5hbWV9PC9zYW1wPiBleHBhbmRzIHRvIHRoZSBuYW1lCisgICAgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0uPC9wPgorCisgIDxwPkZvciBhIGxpc3Qgb2Ygc3lzdGVtIHByb3BlcnRpZXMsCisgICAgc2VlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvbGFuZy9TeXN0ZW0uaHRtbCNnZXRQcm9wZXJ0aWVzLS0iCisgICAgdGFyZ2V0PSJfdG9wIj50aGUgamF2YWRvYyBvZiBTeXN0ZW0uZ2V0UHJvcGVydGllczwvYT4uCiAgIDwvcD4KIAogICA8cD5JbiBhZGRpdGlvbiwgQW50IGhhcyBzb21lIGJ1aWx0LWluIHByb3BlcnRpZXM6PC9wPgotPHByZT48IS0tIFRPRE8gdXNlIDxkbD48ZHQ+PGNvZGU+Li4uPC9jb2RlPjwvZHQ+PGRkPi4uLjwvZGQ+PC9kbD4gaW5zdGVhZCAtLT4KLWJhc2VkaXIgICAgICAgICAgICAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHByb2plY3QncyBiYXNlZGlyIChhcyBzZXQKLSAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgYmFzZWRpciBhdHRyaWJ1dGUgb2YgPGEgaHJlZj0idXNpbmcuaHRtbCNwcm9qZWN0cyI+Jmx0O3Byb2plY3QmZ3Q7PC9hPikuCi1hbnQuZmlsZSAgICAgICAgICAgIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBidWlsZGZpbGUuCi1hbnQudmVyc2lvbiAgICAgICAgIHRoZSB2ZXJzaW9uIG9mIEFudAotYW50LnByb2plY3QubmFtZSAgICB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IGlzIGN1cnJlbnRseSBleGVjdXRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGl0IGlzIHNldCBpbiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgJmx0O3Byb2plY3QmZ3Q7LgotYW50LnByb2plY3QuZGVmYXVsdC10YXJnZXQKLSAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJvamVjdCdzCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgdGFyZ2V0OyAgaXQgaXMgc2V0IHZpYSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgb2YgJmx0O3Byb2plY3QmZ3Q7LgotYW50LnByb2plY3QuaW52b2tlZC10YXJnZXRzCi0gICAgICAgICAgICAgICAgICAgIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIHRhcmdldHMgdGhhdCBoYXZlCi0gICAgICAgICAgICAgICAgICAgIGJlZW4gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgKHRoZSBJREUsCi0gICAgICAgICAgICAgICAgICAgIGFuICZsdDthbnQmZ3Q7IHRhc2sgLi4uKSB3aGVuIGludm9raW5nIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvcGVydHkgaXMgc2V0IHByb3Blcmx5IHdoZW4gdGhlIGZpcnN0IHRhcmdldCBpcyBleGVjdXRlZC4KLSAgICAgICAgICAgICAgICAgICAgSWYgeW91IHVzZSBpdCBpbiB0aGUgaW1wbGljaXQgdGFyZ2V0IChkaXJlY3RseQotICAgICAgICAgICAgICAgICAgICB1bmRlciB0aGUgJmx0O3Byb2plY3QmZ3Q7IHRhZykgdGhlIGxpc3Qgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICBlbXB0eSBpZiBubyB0YXJnZXQgaGFzIGJlZW4gc3BlY2lmaWVkIHdoaWxlIGl0Ci0gICAgICAgICAgICAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0IGluIHRoaXMKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBmb3IgdGFza3MgbmVzdGVkIGludG8gdGFyZ2V0cy4uCi1hbnQuamF2YS52ZXJzaW9uICAgIHRoZSBKVk0gdmVyc2lvbiBBbnQgZGV0ZWN0ZWQ7IGN1cnJlbnRseSBpdCBjYW4gaG9sZAotICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWVzICZxdW90OzkmcXVvdDssICZxdW90OzEuOCZxdW90OywKLSAgICAgICAgICAgICAgICAgICAgJnF1b3Q7MS43JnF1b3Q7LCAmcXVvdDsxLjYmcXVvdDssICZxdW90OzEuNSZxdW90OywKLSAgICAgICAgICAgICAgICAgICAgJnF1b3Q7MS40JnF1b3Q7LCAmcXVvdDsxLjMmcXVvdDsgYW5kCi0gICAgICAgICAgICAgICAgICAgICZxdW90OzEuMiZxdW90Oy4KLWFudC5jb3JlLmxpYiAgICAgICAgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIDxjb2RlPmFudC5qYXI8L2NvZGU+IGZpbGUuCi08L3ByZT4KKyAgPGRsPgorICAgIDxkdD48Y29kZT5iYXNlZGlyPC9jb2RlPjwvZHQ+CisgICAgPGRkPnRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBwcm9qZWN0J3MgYmFzZWRpciAoYXMgc2V0IHdpdGgKKyAgICAgIHRoZSA8dmFyPmJhc2VkaXI8L3Zhcj4gYXR0cmlidXRlCisgICAgICBvZiA8YSBocmVmPSJ1c2luZy5odG1sI3Byb2plY3RzIj4mbHQ7cHJvamVjdCZndDs8L2E+KS48L2RkPgorICAgIDxkdD48Y29kZT5hbnQuZmlsZTwvY29kZT48L2R0PgorICAgIDxkZD50aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgYnVpbGRmaWxlLjwvZGQ+CisgICAgPGR0Pjxjb2RlPmFudC52ZXJzaW9uPC9jb2RlPjwvZHQ+CisgICAgPGRkPnRoZSB2ZXJzaW9uIG9mIEFudDwvZGQ+CisgICAgPGR0Pjxjb2RlPmFudC5wcm9qZWN0Lm5hbWU8L2NvZGU+PC9kdD4KKyAgICA8ZGQ+dGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nOyBpdCBpcyBzZXQgaW4gdGhlIDx2YXI+bmFtZTwvdmFyPgorICAgICAgYXR0cmlidXRlIG9mIDxjb2RlPiZsdDtwcm9qZWN0Jmd0OzwvY29kZT4uPC9kZD4KKyAgICA8ZHQ+PGNvZGU+YW50LnByb2plY3QuZGVmYXVsdC10YXJnZXQ8L2NvZGU+PC9kdD4KKyAgICA8ZGQ+dGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0OyBpdCBpcyBzZXQgdmlhCisgICAgICB0aGUgPHZhcj5kZWZhdWx0PC92YXI+IGF0dHJpYnV0ZSBvZiA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+LjwvZGQ+CisgICAgPGR0Pjxjb2RlPmFudC5wcm9qZWN0Lmludm9rZWQtdGFyZ2V0czwvY29kZT48L2R0PgorICAgIDxkZD5hIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSB0YXJnZXRzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCAob24gdGhlIGNvbW1hbmQgbGluZSwgaW5zaWRlCisgICAgICBvZiBhbiBJREUsIGJ5IGFuIDxjb2RlPiZsdDthbnQmZ3Q7PC9jb2RlPiB0YXNrLCBldGMuLi4pIHdoZW4gaW52b2tpbmcgdGhlIGN1cnJlbnQKKyAgICAgIHByb2plY3QuPGJyLz5UaGlzIHByb3BlcnR5IGlzIHNldCBwcm9wZXJseSB3aGVuIHRoZSBmaXJzdCB0YXJnZXQgaXMgZXhlY3V0ZWQuIElmIHlvdSB1c2UgaXQgaW4KKyAgICAgIHRoZSBpbXBsaWNpdCB0YXJnZXQgKGRpcmVjdGx5IHVuZGVyIHRoZSA8Y29kZT4mbHQ7cHJvamVjdCZndDs8L2NvZGU+IHRhZykgdGhlIGxpc3Qgd2lsbCBiZQorICAgICAgZW1wdHkgaWYgbm8gdGFyZ2V0IGhhcyBiZWVuIHNwZWNpZmllZCB3aGlsZSBpdCB3aWxsIGNvbnRhaW4gdGhlIHByb2plY3QncyBkZWZhdWx0IHRhcmdldCBpbgorICAgICAgdGhpcyBjYXNlIGZvciB0YXNrcyBuZXN0ZWQgaW50byB0YXJnZXRzLjwvZGQ+CisgICAgPGR0Pjxjb2RlPmFudC5qYXZhLnZlcnNpb248L2NvZGU+PC9kdD4KKyAgICA8ZGQ+dGhlIEpWTSB2ZXJzaW9uIEFudCBkZXRlY3RlZDsgY3VycmVudGx5IGl0IGNhbiBob2xkIHRoZQorICAgICAgdmFsdWVzIDxxPjk8L3E+LCA8cT4xLjg8L3E+LCA8cT4xLjc8L3E+LCA8cT4xLjY8L3E+LCA8cT4xLjU8L3E+LCA8cT4xLjQ8L3E+LCA8cT4xLjM8L3E+CisgICAgICBhbmQgPHE+MS4yPC9xPi48L2RkPgorICAgIDxkdD48Y29kZT5hbnQuY29yZS5saWI8L2NvZGU+PC9kdD4KKyAgICA8ZGQ+dGhlIGFic29sdXRlIHBhdGggb2YgdGhlIDxzYW1wPmFudC5qYXI8L3NhbXA+IGZpbGUuPC9kZD4KKyAgPC9kbD4KIAotICA8cD5UaGVyZSBpcyBhbHNvIGFub3RoZXIgcHJvcGVydHksIGJ1dCB0aGlzIGlzIHNldCBieSB0aGUgbGF1bmNoZXIKLSAgICBzY3JpcHQgYW5kIHRoZXJlZm9yZSBtYXliZSBub3Qgc2V0IGluc2lkZSBJREVzOjwvcD4KLTxwcmU+Ci1hbnQuaG9tZSAgICAgICAgICAgIGhvbWUgZGlyZWN0b3J5IG9mIEFudAotPC9wcmU+CisgIDxwPlRoZXJlIGlzIGFsc28gYW5vdGhlciBwcm9wZXJ0eSwgYnV0IHRoaXMgaXMgc2V0IGJ5IHRoZSBsYXVuY2hlciBzY3JpcHQgYW5kIHRoZXJlZm9yZSBtYXliZSBub3QKKyAgICBzZXQgaW5zaWRlIElERXM6PC9wPgorICA8ZGw+CisgICAgPGR0Pjxjb2RlPmFudC5ob21lPC9jb2RlPjwvZHQ+CisgICAgPGRkPmhvbWUgZGlyZWN0b3J5IG9mIEFudDwvZGQ+CisgIDwvZGw+CiAKLSAgPHA+VGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpcyBvbmx5IHNldCBpZiBBbnQgaXMgc3RhcnRlZCB2aWEgdGhlCi0gICAgTGF1bmNoZXIgY2xhc3MgKHdoaWNoIG1lYW5zIGl0IG1heSBub3QgYmUgc2V0IGluc2lkZSBJREVzCi0gICAgZWl0aGVyKTo8L3A+Ci08cHJlPgotYW50LmxpYnJhcnkuZGlyICAgICB0aGUgZGlyZWN0b3J5IHRoYXQgaGFzIGJlZW4gdXNlZCB0byBsb2FkIEFudCdzCi0gICAgICAgICAgICAgICAgICAgIGphcnMgZnJvbS4gIEluIG1vc3QgY2FzZXMgdGhpcyBpcyBBTlRfSE9NRS9saWIuCi08L3ByZT4KKyAgPHA+VGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpcyBvbmx5IHNldCBpZiBBbnQgaXMgc3RhcnRlZCB2aWEgdGhlIExhdW5jaGVyIGNsYXNzICh3aGljaCBtZWFucyBpdCBtYXkKKyAgICBub3QgYmUgc2V0IGluc2lkZSBJREVzIGVpdGhlcik6PC9wPgorICA8ZGw+CisgICAgPGR0Pjxjb2RlPmFudC5saWJyYXJ5LmRpcjwvY29kZT48L2R0PgorICAgIDxkZD50aGUgZGlyZWN0b3J5IHRoYXQgaGFzIGJlZW4gdXNlZCB0byBsb2FkIEFudCdzIGphcnMgZnJvbS4gIEluIG1vc3QgY2FzZXMgdGhpcworICAgICAgaXMgPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPi48L2RkPgorICA8L2RsPgogCi0gIDxoMT48YSBuYW1lPSJwcm9wZXJ0eUhlbHBlciI+UHJvcGVydHlIZWxwZXJzPC9hPjwvaDE+CisgIDxoMSBpZD0icHJvcGVydHlIZWxwZXIiPlByb3BlcnR5SGVscGVyczwvaDE+CiAKLSAgPHA+QW50J3MgcHJvcGVydHkgaGFuZGxpbmcgaXMgYWNjb21wbGlzaGVkIGJ5IGFuIGluc3RhbmNlIG9mCi0gICAgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aAotICAgIHRoZSBjdXJyZW50IFByb2plY3QuICBZb3UgY2FuIGxlYXJuIG1vcmUgYWJvdXQgdGhpcyBjbGFzcyBieQotICAgIGV4YW1pbmluZyBBbnQncyBKYXZhIEFQSS4gSW4gQW50IDEuOCB0aGUgUHJvcGVydHlIZWxwZXIgY2xhc3Mgd2FzCi0gICAgbXVjaCByZXdvcmtlZCBhbmQgbm93IGl0c2VsZiBlbXBsb3lzIGEgbnVtYmVyIG9mIGhlbHBlciBjbGFzc2VzCi0gICAgKGFjdHVhbGx5IGluc3RhbmNlcyBvZgotICAgIHRoZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciREZWxlZ2F0ZTwvY29kZT4KLSAgICBtYXJrZXIgaW50ZXJmYWNlKSB0byB0YWtlIGNhcmUgb2YgZGlzY3JldGUgdGFza3Mgc3VjaCBhcyBwcm9wZXJ0eQotICAgIHNldHRpbmcsIHJldHJpZXZhbCwgcGFyc2luZywgZXRjLiBUaGlzIG1ha2VzIEFudCdzIHByb3BlcnR5Ci0gICAgaGFuZGxpbmcgaGlnaGx5IGV4dGVuc2libGU7IGFsc28gb2YgaW50ZXJlc3QgaXMgdGhlCi0gICAgbmV3IDxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5aGVscGVyLmh0bWwiPnByb3BlcnR5aGVscGVyPC9hPgotICAgIHRhc2sgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBQcm9wZXJ0eUhlbHBlciBhbmQgaXRzIGRlbGVnYXRlcyBmcm9tCi0gICAgdGhlIGNvbnRleHQgb2YgdGhlIEFudCBidWlsZGZpbGUuCisgIDxwPkFudCdzIHByb3BlcnR5IGhhbmRsaW5nIGlzIGFjY29tcGxpc2hlZCBieSBhbiBpbnN0YW5jZQorICAgIG9mIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50CisgICAgUHJvamVjdC4gIFlvdSBjYW4gbGVhcm4gbW9yZSBhYm91dCB0aGlzIGNsYXNzIGJ5IGV4YW1pbmluZyBBbnQncyBKYXZhIEFQSS4gSW4gQW50IDEuOCB0aGUKKyAgICA8Y29kZSBjbGFzcz0iY29kZSI+UHJvcGVydHlIZWxwZXI8L2NvZGU+IGNsYXNzIHdhcyBtdWNoIHJld29ya2VkIGFuZCBub3cgaXRzZWxmIGVtcGxveXMgYSBudW1iZXIKKyAgICBvZiBoZWxwZXIgY2xhc3NlcyAoYWN0dWFsbHkgaW5zdGFuY2VzIG9mCisgICAgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciREZWxlZ2F0ZTwvY29kZT4gbWFya2VyIGludGVyZmFjZSkgdG8KKyAgICB0YWtlIGNhcmUgb2YgZGlzY3JldGUgdGFza3Mgc3VjaCBhcyBwcm9wZXJ0eSBzZXR0aW5nLCByZXRyaWV2YWwsIHBhcnNpbmcsIGV0Yy4gVGhpcyBtYWtlcyBBbnQncworICAgIHByb3BlcnR5IGhhbmRsaW5nIGhpZ2hseSBleHRlbnNpYmxlOyBhbHNvIG9mIGludGVyZXN0IGlzIHRoZQorICAgIG5ldyA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eWhlbHBlci5odG1sIj5wcm9wZXJ0eWhlbHBlcjwvYT4gdGFzayB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlCisgICAgUHJvcGVydHlIZWxwZXIgYW5kIGl0cyBkZWxlZ2F0ZXMgZnJvbSB0aGUgY29udGV4dCBvZiB0aGUgQW50IGJ1aWxkZmlsZS48L3A+CiAKLSAgPHA+VGhlcmUgYXJlIHRocmVlIHN1Yi1pbnRlcmZhY2VzIG9mIDxjb2RlPkRlbGVnYXRlPC9jb2RlPiB0aGF0IG1heSBiZQotICAgIHVzZWZ1bCB0byBpbXBsZW1lbnQuPC9wPgorICA8cD5UaGVyZSBhcmUgdGhyZWUgc3ViLWludGVyZmFjZXMgb2YgPGNvZGUgY2xhc3M9ImNvZGUiPkRlbGVnYXRlPC9jb2RlPiB0aGF0IG1heSBiZSB1c2VmdWwgdG8KKyAgaW1wbGVtZW50OjwvcD4KIAogICA8dWw+Ci0gICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LlByb3BlcnR5RXhwYW5kZXI8L2NvZGU+IGlzCi0gICAgICByZXNwb25zaWJsZSBmb3IgZmluZGluZyB0aGUgcHJvcGVydHkgbmFtZSBpbnNpZGUgYSBzdHJpbmcgaW4gdGhlCi0gICAgICBmaXJzdCBwbGFjZSAodGhlIGRlZmF1bHQgZXh0cmFjdHMgPGNvZGU+Zm9vPC9jb2RlPgotICAgICAgZnJvbSA8Y29kZT4ke2Zvb308L2NvZGU+KS4KKyAgICA8bGk+PGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuUHJvcGVydHlFeHBhbmRlcjwvY29kZT4gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgdGhlCisgICAgICBwcm9wZXJ0eSBuYW1lIGluc2lkZSBhIHN0cmluZyBpbiB0aGUgZmlyc3QgcGxhY2UgKHRoZSBkZWZhdWx0IGV4dHJhY3RzIDxzYW1wPmZvbzwvc2FtcD4KKyAgICAgIGZyb20gPHNhbXA+JHtmb299PC9zYW1wPikuCiAKLSAgICAgIDxwPlRoaXMgaXMgdGhlIGludGVyZmFjZSB5b3UnZCBpbXBsZW1lbnQgaWYgeW91IHdhbnRlZCB0byBpbnZlbnQKLSAgICAgICAgeW91ciBvd24gcHJvcGVydHkgc3ludGF4IC0gb3IgYWxsb3cgbmVzdGVkIHByb3BlcnR5IGV4cGFuc2lvbnMKLSAgICAgICAgc2luY2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBiYWxhbmNlIGJyYWNlcwotICAgICAgICAoc2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZj9wPWFudC1hbnRsaWJzLXByb3BzLmdpdDthPWJsb2I7Zj1zcmMvbWFpbi9vcmcvYXBhY2hlL2FudC9wcm9wcy9OZXN0ZWRQcm9wZXJ0eUV4cGFuZGVyLmphdmE7aGI9SEVBRCI+PGNvZGU+TmVzdGVkUHJvcGVydHlFeHBhbmRlcjwvY29kZT4KLSAgICAgICAgaW4gdGhlICJwcm9wcyIgQW50bGliPC9hPiBmb3IgYW4gZXhhbXBsZSkuPC9wPgorICAgICAgPHA+VGhpcyBpcyB0aGUgaW50ZXJmYWNlIHlvdSdkIGltcGxlbWVudCBpZiB5b3Ugd2FudGVkIHRvIGludmVudCB5b3VyIG93biBwcm9wZXJ0eQorICAgICAgICBzeW50YXgmbWRhc2g7b3IgYWxsb3cgbmVzdGVkIHByb3BlcnR5IGV4cGFuc2lvbnMgc2luY2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lc24ndAorICAgICAgICBiYWxhbmNlIGJyYWNlcworICAgICAgICAoc2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9YW50LWFudGxpYnMtcHJvcHMuZ2l0O2E9YmxvYjtmPXNyYy9tYWluL29yZy9hcGFjaGUvYW50L3Byb3BzL05lc3RlZFByb3BlcnR5RXhwYW5kZXIuamF2YTtoYj1IRUFEIgorICAgICAgICB0YXJnZXQ9Il90b3AiPjxjb2RlIGNsYXNzPSJjb2RlIj5OZXN0ZWRQcm9wZXJ0eUV4cGFuZGVyPC9jb2RlPiBpbiB0aGUgPHNhbXA+cHJvcHM8L3NhbXA+IEFudGxpYjwvYT4gZm9yCisgICAgICAgIGFuIGV4YW1wbGUpLjwvcD4KICAgICA8L2xpPgogCi0gICAgPGxpPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyJFByb3BlcnR5RXZhbHVhdG9yPC9jb2RlPgotICAgICAgaXMgdXNlZCB0byBleHBhbmQgPGNvZGU+JHtzb21lLXN0cmluZ308L2NvZGU+IGludG8KLSAgICAgIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCisgICAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciRQcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT4gaXMgdXNlZCB0bworICAgICAgZXhwYW5kIDxzYW1wPiR7c29tZS1zdHJpbmd9PC9zYW1wPiBpbnRvIGFuIDxjb2RlPk9iamVjdDwvY29kZT4uCiAKLSAgICAgIDxwPlRoaXMgaXMgdGhlIGludGVyZmFjZSB5b3UnZCBpbXBsZW1lbnQgaWYgeW91IHdhbnQgdG8gcHJvdmlkZQotICAgICAgICB5b3VyIG93biBzdG9yYWdlIGluZGVwZW5kZW50IG9mIEFudCdzIHByb2plY3QgaW5zdGFuY2UgLSB0aGUKLSAgICAgICAgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIHJlYWRpbmcgZW5kLiAgQW4gZXhhbXBsZSBmb3IgdGhpcwotICAgICAgICB3b3VsZAotICAgICAgICBiZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5Mb2NhbFByb3BlcnRpZXM8L2NvZGU+Ci0gICAgICAgIHdoaWNoIGltcGxlbWVudHMgc3RvcmFnZQotICAgICAgICBmb3IgPGEgaHJlZj0iVGFza3MvbG9jYWwuaHRtbCI+bG9jYWwgcHJvcGVydGllczwvYT4uPC9wPgorICAgICAgPHA+VGhpcyBpcyB0aGUgaW50ZXJmYWNlIHlvdSdkIGltcGxlbWVudCBpZiB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIHN0b3JhZ2UgaW5kZXBlbmRlbnQKKyAgICAgICAgb2YgQW50J3MgcHJvamVjdCBpbnN0YW5jZSZtZGFzaDt0aGUgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIHJlYWRpbmcgZW5kLiAgQW4gZXhhbXBsZSBmb3IKKyAgICAgICAgdGhpcyB3b3VsZCBiZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuTG9jYWxQcm9wZXJ0aWVzPC9jb2RlPiB3aGljaAorICAgICAgICBpbXBsZW1lbnRzIHN0b3JhZ2UgZm9yIDxhIGhyZWY9IlRhc2tzL2xvY2FsLmh0bWwiPmxvY2FsIHByb3BlcnRpZXM8L2E+LjwvcD4KIAotICAgICAgPHA+QW5vdGhlciByZWFzb24gdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGlzIGlmIHlvdSB3YW50ZWQKLSAgICAgICAgdG8gcHJvdmlkZSB5b3VyIG93biAicHJvcGVydHkgcHJvdG9jb2wiIGxpa2UKLSAgICAgICAgZXhwYW5kaW5nIDxjb2RlPnRvU3RyaW5nOmZvbzwvY29kZT4gYnkgbG9va2luZyB1cCB0aGUgcHJvamVjdAotICAgICAgICByZWZlcmVuY2UgZm9vIGFuZCBpbnZva2luZyA8Y29kZT50b1N0cmluZygpPC9jb2RlPiBvbiBpdAotICAgICAgICAod2hpY2ggaXMgYWxyZWFkeSBpbXBsZW1lbnRlZCBpbiBBbnQsIHNlZSBiZWxvdykuPC9wPgorICAgICAgPHA+QW5vdGhlciByZWFzb24gdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGlzIGlmIHlvdSB3YW50ZWQgdG8gcHJvdmlkZSB5b3VyIG93biAicHJvcGVydHkKKyAgICAgICAgcHJvdG9jb2wiIGxpa2UgZXhwYW5kaW5nIDxjb2RlPnRvU3RyaW5nOmZvbzwvY29kZT4gYnkgbG9va2luZyB1cCB0aGUgcHJvamVjdAorICAgICAgICByZWZlcmVuY2UgPHNhbXA+Zm9vPC9zYW1wPiBhbmQgaW52b2tpbmcgPGNvZGUgY2xhc3M9ImNvZGUiPnRvU3RyaW5nKCk8L2NvZGU+IG9uIGl0ICh3aGljaCBpcworICAgICAgICBhbHJlYWR5IGltcGxlbWVudGVkIGluIEFudCwgc2VlIGJlbG93KS48L3A+CiAgICAgPC9saT4KIAotICAgIDxsaT48Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciRQcm9wZXJ0eVNldHRlcjwvY29kZT4KLSAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHByb3BlcnRpZXMuCisgICAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlciRQcm9wZXJ0eVNldHRlcjwvY29kZT4gaXMgcmVzcG9uc2libGUKKyAgICAgIGZvciBzZXR0aW5nIHByb3BlcnRpZXMuCiAKLSAgICAgIDxwPlRoaXMgaXMgdGhlIGludGVyZmFjZSB5b3UnZCBpbXBsZW1lbnQgaWYgeW91IHdhbnQgdG8gcHJvdmlkZQotICAgICAgICB5b3VyIG93biBzdG9yYWdlIGluZGVwZW5kZW50IG9mIEFudCdzIHByb2plY3QgaW5zdGFuY2UgLSB0aGUKLSAgICAgICAgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIHJlYWRpbmcgZW5kLiAgQW4gZXhhbXBsZSBmb3IgdGhpcwotICAgICAgICB3b3VsZAotICAgICAgICBiZSA8Y29kZT5vcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5Mb2NhbFByb3BlcnRpZXM8L2NvZGU+Ci0gICAgICAgIHdoaWNoIGltcGxlbWVudHMgc3RvcmFnZQotICAgICAgICBmb3IgPGEgaHJlZj0iVGFza3MvbG9jYWwuaHRtbCI+bG9jYWwgcHJvcGVydGllczwvYT4uPC9wPgorICAgICAgPHA+VGhpcyBpcyB0aGUgaW50ZXJmYWNlIHlvdSdkIGltcGxlbWVudCBpZiB5b3Ugd2FudCB0byBwcm92aWRlIHlvdXIgb3duIHN0b3JhZ2UgaW5kZXBlbmRlbnQKKyAgICAgICAgb2YgQW50J3MgcHJvamVjdCBpbnN0YW5jZSZtZGFzaDt0aGUgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIHdyaXRpbmcgZW5kLiAgQW4gZXhhbXBsZSBmb3IKKyAgICAgICAgdGhpcyB3b3VsZCBiZSA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuTG9jYWxQcm9wZXJ0aWVzPC9jb2RlPiB3aGljaAorICAgICAgICBpbXBsZW1lbnRzIHN0b3JhZ2UgZm9yIDxhIGhyZWY9IlRhc2tzL2xvY2FsLmh0bWwiPmxvY2FsIHByb3BlcnRpZXM8L2E+LjwvcD4KICAgICA8L2xpPgotCiAgIDwvdWw+CiAKLSAgPHA+VGhlIGRlZmF1bHQgPGNvZGU+UHJvcGVydHlFeHBhbmRlcjwvY29kZT4gbG9va3Mgc2ltaWxhciB0bzo8L3A+CisgIDxwPlRoZSBkZWZhdWx0IDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9wZXJ0eUV4cGFuZGVyPC9jb2RlPiBsb29rcyBzaW1pbGFyIHRvOjwvcD4KIAogPHByZT4KIHB1YmxpYyBjbGFzcyBEZWZhdWx0RXhwYW5kZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUV4cGFuZGVyIHsKQEAgLTE3OSw3ICsxNjUsNyBAQAogICAgICAgICBpbnQgaW5kZXggPSBwb3MuZ2V0SW5kZXgoKTsKICAgICAgICAgaWYgKHMuaW5kZXhPZigiJHsiLCBpbmRleCkgPT0gaW5kZXgpIHsKICAgICAgICAgICAgIGludCBlbmQgPSBzLmluZGV4T2YoJ30nLCBpbmRleCk7Ci0gICAgICAgICAgICBpZiAoZW5kIDwgMCkgeworICAgICAgICAgICAgaWYgKGVuZCAmbHQ7IDApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlN5bnRheCBlcnJvciBpbiBwcm9wZXJ0eTogIiArIHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50IHN0YXJ0ID0gaW5kZXggKyAyOwpAQCAtMTg4LDEzICsxNzQsMTIgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9Ci19Ci08L3ByZT4KK308L3ByZT4KIAotICA8cD5UaGUgbG9naWMgdGhhdCByZXBsYWNlcyA8Y29kZT4ke3RvU3RyaW5nOnNvbWUtaWR9PC9jb2RlPiB3aXRoIHRoZQotICAgIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3Qgd2l0aAotICAgIGlkIDxjb2RlPnNvbWUtaWQ8L2NvZGU+IGluc2lkZSB0aGUgY3VycmVudCBidWlsZCBpcyBjb250YWluZWQgaW4gYQotICAgIFByb3BlcnR5RXZhbHVhdG9yIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBjb2RlOjwvcD4KKyAgPHA+VGhlIGxvZ2ljIHRoYXQgcmVwbGFjZXMgPHNhbXA+JHt0b1N0cmluZzo8aT5zb21lLWlkPC9pPn08L3NhbXA+IHdpdGggdGhlIHN0cmluZ2lmaWVkCisgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdCB3aXRoIDx2YXI+aWQ8L3Zhcj4gPHNhbXA+PGk+c29tZS1pZDwvaT48L3NhbXA+IGluc2lkZSB0aGUgY3VycmVudAorICAgIGJ1aWxkIGlzIGNvbnRhaW5lZCBpbiBhIDxjb2RlIGNsYXNzPSJjb2RlIj5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT4gc2ltaWxhciB0byB0aGUgZm9sbG93aW5nCisgICAgY29kZTo8L3A+CiAKIDxwcmU+CiBwdWJsaWMgY2xhc3MgVG9TdHJpbmdFdmFsdWF0b3IgaW1wbGVtZW50cyBQcm9wZXJ0eUhlbHBlci5Qcm9wZXJ0eUV2YWx1YXRvciB7CkBAIC0yMDcsMTk4ICsxOTIsMTYzIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG8gPT0gbnVsbCA/IG51bGwgOiBvLnRvU3RyaW5nKCk7CiAgICAgfQotfQotPC9wcmU+Ci0KK308L3ByZT4KIAogICA8aDE+UHJvcGVydHkgRXhwYW5zaW9uPC9oMT4KIAotICA8cD5XaGVuIEFudCBlbmNvdW50ZXJzIGEgY29uc3RydWN0IDxjb2RlPiR7c29tZS10ZXh0fTwvY29kZT4gdGhlCi0gICAgZXhhY3QgcGFyc2luZyBzZW1hbnRpY3MgYXJlIHN1YmplY3QgdG8gdGhlIGNvbmZpZ3VyZWQgcHJvcGVydHkKLSAgICBoZWxwZXIgZGVsZWdhdGVzLjwvcD4KKyAgPHA+V2hlbiBBbnQgZW5jb3VudGVycyBhIGNvbnN0cnVjdCA8c2FtcD4ke3NvbWUtdGV4dH08L3NhbXA+IHRoZSBleGFjdCBwYXJzaW5nIHNlbWFudGljcyBhcmUKKyAgICBzdWJqZWN0IHRvIHRoZSBjb25maWd1cmVkIHByb3BlcnR5IGhlbHBlciBkZWxlZ2F0ZXMuPC9wPgogCiAgIDxoMj48Y29kZT4kJDwvY29kZT4gRXhwYW5zaW9uPC9oMj4KIAotICA8cD5JbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIEFudCB3aWxsIGV4cGFuZCB0aGUKLSAgICB0ZXh0IDxjb2RlPiQkPC9jb2RlPiB0byBhIHNpbmdsZSA8Y29kZT4kPC9jb2RlPiBhbmQgc3VwcHJlc3MgdGhlCi0gICAgbm9ybWFsIHByb3BlcnR5IGV4cGFuc2lvbiBtZWNoYW5pc20gZm9yIHRoZSB0ZXh0IGltbWVkaWF0ZWx5Ci0gICAgZm9sbG93aW5nIGl0LCBpLmUuIDxjb2RlPiQke2tleX08L2NvZGU+IGV4cGFuZHMKLSAgICB0byA8Y29kZT4ke2tleX08L2NvZGU+IGFuZCBub3QgPGNvZGU+dmFsdWU8L2NvZGU+IGV2ZW4gdGhvdWdoIGEKLSAgICBwcm9wZXJ0eSBuYW1lZCA8Y29kZT5rZXk8L2NvZGU+IHdhcyBkZWZpbmVkIGFuZCBoYWQgdGhlCi0gICAgdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+LiAgVGhpcyBjYW4gYmUgdXNlZCB0byBlc2NhcGUKLSAgICBsaXRlcmFsIDxjb2RlPiQ8L2NvZGU+IGNoYXJhY3RlcnMgYW5kIGlzIHVzZWZ1bCBpbiBjb25zdHJ1Y3RzIHRoYXQKLSAgICBvbmx5IGxvb2sgbGlrZSBwcm9wZXJ0eSBleHBhbnNpb25zIG9yIHdoZW4geW91IHdhbnQgdG8gcHJvdmlkZQotICAgIGRpYWdub3N0aWMgb3V0cHV0IGxpa2UgaW48L3A+CisgIDxwPkluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gQW50IHdpbGwgZXhwYW5kIHRoZSB0ZXh0IDxxPiQkPC9xPiB0byBhIHNpbmdsZSA8cT4kPC9xPiBhbmQKKyAgICBzdXBwcmVzcyB0aGUgbm9ybWFsIHByb3BlcnR5IGV4cGFuc2lvbiBtZWNoYW5pc20gZm9yIHRoZSB0ZXh0IGltbWVkaWF0ZWx5IGZvbGxvd2luZyBpdCwKKyAgICBpLmUuLCA8c2FtcD4kJHtrZXl9PC9zYW1wPiBleHBhbmRzIHRvIDxzYW1wPiR7a2V5fTwvc2FtcD4gYW5kIG5vdCA8Y29kZT52YWx1ZTwvY29kZT4gZXZlbiB0aG91Z2gKKyAgICBhIHByb3BlcnR5IG5hbWVkIDxjb2RlPmtleTwvY29kZT4gd2FzIGRlZmluZWQgYW5kIGhhZCB0aGUgdmFsdWUgPHNhbXA+dmFsdWU8L3NhbXA+LiAgVGhpcyBjYW4gYmUKKyAgICB1c2VkIHRvIGVzY2FwZSBsaXRlcmFsIDxxPiQ8L3E+IGNoYXJhY3RlcnMgYW5kIGlzIHVzZWZ1bCBpbiBjb25zdHJ1Y3RzIHRoYXQgb25seSBsb29rIGxpa2UKKyAgICBwcm9wZXJ0eSBleHBhbnNpb25zIG9yIHdoZW4geW91IHdhbnQgdG8gcHJvdmlkZSBkaWFnbm9zdGljIG91dHB1dCBsaWtlIGluPC9wPgogCi08cHJlPiAgJmx0O2VjaG8mZ3Q7JCR7YnVpbGRkaXJ9PSR7YnVpbGRkaXJ9Jmx0Oy9lY2hvJmd0OzwvcHJlPgorPHByZT4mbHQ7ZWNobyZndDskJHtidWlsZGRpcn09JHtidWlsZGRpcn0mbHQ7L2VjaG8mZ3Q7PC9wcmU+CiAKLSAgICA8cD53aGljaCB3aWxsIGVjaG8gdGhpcyBtZXNzYWdlOjwvcD4KKyAgPHA+d2hpY2ggd2lsbCBlY2hvIHRoaXMgbWVzc2FnZTo8L3A+CiAKLTxwcmU+ICAke2J1aWxkZGlyfT1idWlsZC9jbGFzc2VzPC9wcmU+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPiR7YnVpbGRkaXJ9PWJ1aWxkL2NsYXNzZXM8L3ByZT4KIAotICA8cD5pZiB0aGUgcHJvcGVydHkgPGNvZGU+YnVpbGRkaXI8L2NvZGU+IGhhcyB0aGUKLSAgICB2YWx1ZSA8Y29kZT5idWlsZC9jbGFzc2VzPC9jb2RlPi48L3A+Ci0gICAgCi0gIDxwPkluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBbnQKLSAgICByZWxlYXNlcywgYSBzaW5nbGUgJyQnIGNoYXJhY3RlciBlbmNvdW50ZXJlZCBhcGFydCBmcm9tIGEKLSAgICBwcm9wZXJ0eS1saWtlIGNvbnN0cnVjdCAoaW5jbHVkaW5nIGEgbWF0Y2hlZCBwYWlyIG9mIGZyZW5jaAotICAgIGJyYWNlcykgd2lsbCBiZSBpbnRlcnByZXRlZCBsaXRlcmFsbHk7IHRoYXQgaXMsIGFzICckJy4gIFRoZQotICAgICJjb3JyZWN0IiB3YXkgdG8gc3BlY2lmeSB0aGlzIGxpdGVyYWwgY2hhcmFjdGVyLCBob3dldmVyLCBpcyBieQotICAgIHVzaW5nIHRoZSBlc2NhcGluZyBtZWNoYW5pc20gdW5jb25kaXRpb25hbGx5LCBzbyB0aGF0ICIkJCIgaXMKLSAgICBvYnRhaW5lZCBieSBzcGVjaWZ5aW5nICIkJCQkIi4gIE1peGluZyB0aGUgdHdvIGFwcHJvYWNoZXMgeWllbGRzCi0gICAgdW5wcmVkaWN0YWJsZSByZXN1bHRzLCBhcyAiJCQkIiByZXN1bHRzIGluICIkJCIuPC9wPgorICA8cD5pZiB0aGUgcHJvcGVydHkgPGNvZGU+YnVpbGRkaXI8L2NvZGU+IGhhcyB0aGUgdmFsdWUgPHNhbXA+YnVpbGQvY2xhc3Nlczwvc2FtcD4uPC9wPgorCisgIDxwPkluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBBbnQgcmVsZWFzZXMsIGEgc2luZ2xlIDxxPiQ8L3E+CisgICAgY2hhcmFjdGVyIGVuY291bnRlcmVkIGFwYXJ0IGZyb20gYSBwcm9wZXJ0eS1saWtlIGNvbnN0cnVjdCAoaW5jbHVkaW5nIGEgbWF0Y2hlZCBwYWlyIG9mIGZyZW5jaAorICAgIGJyYWNlcykgd2lsbCBiZSBpbnRlcnByZXRlZCBsaXRlcmFsbHksIHRoYXQgaXMsIGFzIDxxPiQ8L3E+LiAgVGhlICJjb3JyZWN0IiB3YXkgdG8gc3BlY2lmeSB0aGlzCisgICAgbGl0ZXJhbCBjaGFyYWN0ZXIsIGhvd2V2ZXIsIGlzIGJ5IHVzaW5nIHRoZSBlc2NhcGluZyBtZWNoYW5pc20gdW5jb25kaXRpb25hbGx5LCBzbworICAgIHRoYXQgPHE+JCQ8L3E+IGlzIG9idGFpbmVkIGJ5IHNwZWNpZnlpbmcgPHE+JCQkJDwvcT4uICBNaXhpbmcgdGhlIHR3byBhcHByb2FjaGVzIHlpZWxkcworICAgIHVucHJlZGljdGFibGUgcmVzdWx0cywgYXMgPHE+JCQkPC9xPiByZXN1bHRzIGluIDxxPiQkPC9xPi48L3A+CiAKICAgPGgyPk5lc3Rpbmcgb2YgQnJhY2VzPC9oMj4KIAotICA8cD5JbiBpdHMgZGVmYXVsdCBjb25maWd1cmF0aW9uIEFudCB3aWxsIG5vdCB0cnkgdG8gYmFsYW5jZSBicmFjZXMKLSAgICBpbiBwcm9wZXJ0eSBleHBhbnNpb25zLCBpdCB3aWxsIG9ubHkgY29uc3VtZSB0aGUgdGV4dCB1cCB0byB0aGUKLSAgICBmaXJzdCBjbG9zaW5nIGJyYWNlIHdoZW4gY3JlYXRpbmcgYSBwcm9wZXJ0eSBuYW1lLiAgSS5lLiB3aGVuCi0gICAgZXhwYW5kaW5nIHNvbWV0aGluZyBsaWtlIDxjb2RlPiR7YSR7Yn19PC9jb2RlPiBpdCB3aWxsIGJlCi0gICAgdHJhbnNsYXRlZCBpbnRvIHR3byBwYXJ0czo8L3A+CisgIDxwPkluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gQW50IHdpbGwgbm90IHRyeSB0byBiYWxhbmNlIGJyYWNlcyBpbiBwcm9wZXJ0eSBleHBhbnNpb25zLCBpdCB3aWxsCisgICAgb25seSBjb25zdW1lIHRoZSB0ZXh0IHVwIHRvIHRoZSBmaXJzdCBjbG9zaW5nIGJyYWNlIHdoZW4gY3JlYXRpbmcgYSBwcm9wZXJ0eSBuYW1lLiAgSS5lLiB3aGVuCisgICAgZXhwYW5kaW5nIHNvbWV0aGluZyBsaWtlIDxzYW1wPiR7YSR7Yn19PC9zYW1wPiBpdCB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byB0d28gcGFydHM6PC9wPgogCiAgIDxvbD4KLSAgICA8bGk+dGhlIGV4cGFuc2lvbiBvZiBwcm9wZXJ0eSA8Y29kZT5hJHtiPC9jb2RlPiAtIGxpa2VseSBub3RoaW5nCi0gICAgICB1c2VmdWwuPC9saT4KLSAgICA8bGk+dGhlIGxpdGVyYWwgdGV4dCA8Y29kZT59PC9jb2RlPiByZXN1bHRpbmcgZnJvbSB0aGUgc2Vjb25kCi0gICAgICBjbG9zaW5nIGJyYWNlPC9saT4KKyAgICA8bGk+dGhlIGV4cGFuc2lvbiBvZiBwcm9wZXJ0eSA8c2FtcD5hJHtiPC9zYW1wPiZtZGFzaDtsaWtlbHkgbm90aGluZyB1c2VmdWwuPC9saT4KKyAgICA8bGk+dGhlIGxpdGVyYWwgdGV4dCA8c2FtcD59PC9zYW1wPiByZXN1bHRpbmcgZnJvbSB0aGUgc2Vjb25kIGNsb3NpbmcgYnJhY2U8L2xpPgogICA8L29sPgogCi0gIDxwPlRoaXMgbWVhbnMgeW91IGNhbid0IHVzZSBlYXNpbHkgZXhwYW5kIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgYXJlCi0gICAgZ2l2ZW4gYnkgcHJvcGVydGllcywgYnV0IHRoZXJlCi0gICAgYXJlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCNwcm9wZXJ0eXZhbHVlLWFzLW5hbWUtZm9yLXByb3BlcnR5Ij5zb21lCi0gICAgd29ya2Fyb3VuZHM8L2E+IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBbnQuICBXaXRoIEFudCAxLjguMCBhbmQgdGhlCi0gICAgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudGxpYi9wcm9wcy8iPnRoZSBwcm9wcyBBbnRsaWI8L2E+Ci0gICAgeW91IGNhbiBjb25maWd1cmUgQW50IHRvIHVzZQotICAgIHRoZSA8Y29kZT5OZXN0ZWRQcm9wZXJ0eUV4cGFuZGVyPC9jb2RlPiBkZWZpbmVkIHRoZXJlIGlmIHlvdSBuZWVkCi0gICAgc3VjaCBhIGZlYXR1cmUuPC9wPgorICA8cD5UaGlzIG1lYW5zIHlvdSBjYW4ndCB1c2UgZWFzaWx5IGV4cGFuZCBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIGFyZSBzdG9yZWQgaW4gcHJvcGVydGllcywgYnV0CisgICAgdGhlcmUgYXJlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvZmFxLmh0bWwjcHJvcGVydHl2YWx1ZS1hcy1uYW1lLWZvci1wcm9wZXJ0eSIKKyAgICB0YXJnZXQ9Il90b3AiPnNvbWUgd29ya2Fyb3VuZHM8L2E+IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBBbnQuIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPiB1c2luZworICAgIHRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudGxpYnMvcHJvcHMvIiB0YXJnZXQ9Il90b3AiPnByb3BzIEFudGxpYjwvYT4geW91IGNhbgorICAgIGNvbmZpZ3VyZSBBbnQgdG8gdXNlIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+TmVzdGVkUHJvcGVydHlFeHBhbmRlcjwvY29kZT4gZGVmaW5lZCB0aGVyZSBpZiB5b3UKKyAgICBuZWVkIHN1Y2ggYSBmZWF0dXJlLjwvcD4KIAotICA8aDI+RXhwYW5kaW5nIGEgIlByb3BlcnR5IE5hbWUiPC9oMj4KKyAgPGgyPkV4cGFuZGluZyBhIFByb3BlcnR5IFJlZmVyZW5jZTwvaDI+CiAKLSAgPHA+SW4gaXRzIG1vc3Qgc2ltcGxlIGZvcm0gPGNvZGU+JHtrZXl9PC9jb2RlPiBpcyBzdXBwb3NlZCB0byBsb29rCi0gICAgdXAgYSBwcm9wZXJ0eSBuYW1lZCA8Y29kZT5rZXk8L2NvZGU+IGFuZCBleHBhbmQgdG8gdGhlIHZhbHVlIG9mCi0gICAgdGhlIHByb3BlcnR5LiAgQWRkaXRpb25hbCA8Y29kZT5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT5zIG1heQotICAgIHJlc3VsdCBpbiBhIGRpZmZlcmVudCBpbnRlcnByZXRhdGlvbiBvZiA8Y29kZT5rZXk8L2NvZGU+LAotICAgIHRob3VnaC48L3A+CisgIDxwPkluIGl0cyBtb3N0IHNpbXBsZSBmb3JtIDxzYW1wPiR7a2V5fTwvc2FtcD4gaXMgc3VwcG9zZWQgdG8gbG9vayB1cCBhIHByb3BlcnR5CisgICAgbmFtZWQgPGNvZGU+a2V5PC9jb2RlPiBhbmQgZXhwYW5kIHRvIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgQWRkaXRpb25hbCA8Y29kZT5Qcm9wZXJ0eUV2YWx1YXRvcjwvY29kZT5zIG1heSByZXN1bHQgaW4gYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24KKyAgICBvZiA8Y29kZT5rZXk8L2NvZGU+LCB0aG91Z2guPC9wPgogCi0gIDxwPlRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9wcm9wcy8iPnByb3BzCi0gICAgICBBbnRsaWI8L2E+IHByb3ZpZGVzIGEgZmV3IGludGVyZXN0aW5nIGV2YWx1YXRvcnMgYnV0IHRoZXJlIGFyZQotICAgICAgYWxzbyBhIGZldyBidWlsdC1pbiBvbmVzLjwvcD4KKyAgPHA+VGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvYW50bGlicy9wcm9wcy8iIHRhcmdldD0iX3RvcCI+cHJvcHMgQW50bGliPC9hPiBwcm92aWRlcyBhCisgICAgZmV3IGludGVyZXN0aW5nIGV2YWx1YXRvcnMgYnV0IHRoZXJlIGFyZSBhbHNvIGEgZmV3IGJ1aWx0LWluIG9uZXMuPC9wPgogCi0gIDxoMz48YSBuYW1lPSJ0b1N0cmluZyI+R2V0dGluZyB0aGUgdmFsdWUgb2YgYSBSZWZlcmVuY2Ugd2l0aAotICAgICAgJHt0b1N0cmluZzp9PC9hPjwvaDM+CisgIDxoMyBpZD0idG9TdHJpbmciPkdldHRpbmcgdGhlIHZhbHVlIG9mIGEgUmVmZXJlbmNlIHdpdGggPHNhbXA+JHt0b1N0cmluZzp9PC9zYW1wPjwvaDM+CiAKLSAgPHA+QW55IEFudCB0eXBlIHdoaWNoIGhhcyBiZWVuIGRlY2xhcmVkIHdpdGggYSByZWZlcmVuY2UgY2FuIGFsc28KLSAgICBpdHMgc3RyaW5nIHZhbHVlIGV4dHJhY3RlZCBieSB1c2luZyB0aGUgPGNvZGU+JHt0b1N0cmluZzp9PC9jb2RlPgotICAgIG9wZXJhdGlvbiwgd2l0aCB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIGxpc3RlZCBhZnRlcgotICAgIHRoZSA8Y29kZT50b1N0cmluZzo8L2NvZGU+IHRleHQuICBUaGUgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4KLSAgICBtZXRob2Qgb2YgdGhlIEphdmEgY2xhc3MgaW5zdGFuY2UgdGhhdCBpcyByZWZlcmVuY2VkIGlzIGludm9rZWQKLSAgICAtYWxsIGJ1aWx0IGluIHR5cGVzIHN0cml2ZSB0byBwcm9kdWNlIHVzZWZ1bCBhbmQgcmVsZXZhbnQgb3V0cHV0Ci0gICAgaW4gc3VjaCBhbiBpbnN0YW5jZS48L3A+CisgIDxwPkFueSBBbnQgdHlwZSBpdGVtIHdoaWNoIGhhcyBiZWVuIGRlY2xhcmVkIHdpdGggYSByZWZlcmVuY2UgY2FuIGFsc28gaXRzIHN0cmluZyB2YWx1ZSBleHRyYWN0ZWQKKyAgICBieSB1c2luZyB0aGUgPHNhbXA+JHt0b1N0cmluZzp9PC9zYW1wPiBvcGVyYXRpb24sIHdpdGggdGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSBsaXN0ZWQgYWZ0ZXIKKyAgICB0aGUgPGNvZGU+dG9TdHJpbmc6PC9jb2RlPiB0ZXh0LiAgVGhlIDxjb2RlIGNsYXNzPSJjb2RlIj50b1N0cmluZygpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIEphdmEKKyAgICBjbGFzcyBpbnN0YW5jZSB0aGF0IGlzIHJlZmVyZW5jZWQgaXMgaW52b2tlZCZtZGFzaDthbGwgYnVpbHQgaW4gdHlwZXMgc3RyaXZlIHRvIHByb2R1Y2UgdXNlZnVsCisgICAgYW5kIHJlbGV2YW50IG91dHB1dCBpbiBzdWNoIGFuIGluc3RhbmNlLjwvcD4KIAotICA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBob3cgdG8gZ2V0IGEgbGlzdGluZyBvZiB0aGUgZmlsZXMgaW4gYSBmaWxlc2V0LDxwPgorICA8cD5Gb3IgZXhhbXBsZSwgaGVyZSBpcyBob3cgdG8gZ2V0IGEgbGlzdGluZyBvZiB0aGUgZmlsZXMgaW4gYSBmaWxlc2V0OjxwPgogCiA8cHJlPgotJmx0O2ZpbGVzZXQgaWQ9JnF1b3Q7c291cmNlZmlsZXMmcXVvdDsgZGlyPSZxdW90O3NyYyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsgLyZndDsKLSZsdDtlY2hvJmd0OyBzb3VyY2VmaWxlcyA9ICR7dG9TdHJpbmc6c291cmNlZmlsZXN9ICZsdDsvZWNobyZndDsKLTwvcHJlPgorJmx0O2ZpbGVzZXQgaWQ9JnF1b3Q7c291cmNlZmlsZXMmcXVvdDsgZGlyPSZxdW90O3NyYyZxdW90OyBpbmNsdWRlcz0mcXVvdDsqKi8qLmphdmEmcXVvdDsvJmd0OworJmx0O2VjaG8mZ3Q7IHNvdXJjZWZpbGVzID0gJHt0b1N0cmluZzpzb3VyY2VmaWxlc30gJmx0Oy9lY2hvJmd0OzwvcHJlPgogCi0gIDxwPlRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGV4dGVybmFsIHR5cGVzIHByb3ZpZGUgbWVhbmluZ2Z1bAotICAgIGluZm9ybWF0aW9uIGluIHN1Y2ggYSBzaXR1YXRpb248L3A+CisgIDxwPlRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGV4dGVybmFsIHR5cGVzIHByb3ZpZGUgbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbiBpbiBzdWNoIGEKKyAgICBzaXR1YXRpb248L3A+CiAKLSAgPGgzPjxhIG5hbWU9ImFudC5yZWZpZCI+R2V0dGluZyB0aGUgdmFsdWUgb2YgYSBSZWZlcmVuY2Ugd2l0aAotICAgICAgJHthbnQucmVmaWQ6fTwvYT48L2gzPgorICA8aDMgaWQ9ImFudC5yZWZpZCI+R2V0dGluZyB0aGUgdmFsdWUgb2YgYSBSZWZlcmVuY2Ugd2l0aCA8c2FtcD4ke2FudC5yZWZpZDp9PC9zYW1wPjwvaDM+CiAKLSAgPHA+QW55IEFudCB0eXBlIHdoaWNoIGhhcyBiZWVuIGRlY2xhcmVkIHdpdGggYSByZWZlcmVuY2UgY2FuIGFsc28gYmUKLSAgICB1c2VkIGFzIGEgcHJvcGVydHkgYnkgdXNpbmcgdGhlIDxjb2RlPiR7YW50LnJlZmlkOn08L2NvZGU+Ci0gICAgb3BlcmF0aW9uLCB3aXRoIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgbGlzdGVkIGFmdGVyCi0gICAgdGhlIDxjb2RlPmFudC5yZWZpZDo8L2NvZGU+IHRleHQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKLSAgICBvcGVyYXRpb24gYW5kIDxhIGhyZWY9IiN0b1N0cmluZyI+PGNvZGU+JHt0b1N0cmluZzp9PC9jb2RlPjwvYT4gaXMKLSAgICB0aGF0IDxjb2RlPiR7YW50LnJlZmlkOn08L2NvZGU+IHdpbGwgZXhwYW5kIHRvIHRoZSByZWZlcmVuY2VkCi0gICAgb2JqZWN0IGl0c2VsZi4gIEluIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGUgdG9TdHJpbmcgbWV0aG9kIHdpbGwgYmUKLSAgICBpbnZva2VkIGFueXdheSwgZm9yIGV4YW1wbGUgaWYgdGhlIDxjb2RlPiR7YW50LnJlZmlkOn08L2NvZGU+IGlzCi0gICAgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LjwvcD4KKyAgPHA+QW55IEFudCB0eXBlIGl0ZW0gd2hpY2ggaGFzIGJlZW4gZGVjbGFyZWQgd2l0aCBhIHJlZmVyZW5jZSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgcHJvcGVydHkgYnkKKyAgICB1c2luZyB0aGUgPHNhbXA+JHthbnQucmVmaWQ6fTwvc2FtcD4gb3BlcmF0aW9uLCB3aXRoIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgbGlzdGVkIGFmdGVyCisgICAgdGhlIDxjb2RlPmFudC5yZWZpZDo8L2NvZGU+IHRleHQuICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgb3BlcmF0aW9uCisgICAgYW5kIDxhIGhyZWY9IiN0b1N0cmluZyI+PHNhbXA+JHt0b1N0cmluZzp9PC9zYW1wPjwvYT4gaXMgdGhhdCA8c2FtcD4ke2FudC5yZWZpZDp9PC9zYW1wPiB3aWxsCisgICAgZXhwYW5kIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdCBpdHNlbGYuICBJbiBtb3N0IGNpcmN1bXN0YW5jZXMKKyAgICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPnRvU3RyaW5nKCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYW55d2F5LCBmb3IgZXhhbXBsZSBpZgorICAgIHRoZSA8c2FtcD4ke2FudC5yZWZpZDp9PC9zYW1wPiBpcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuPC9wPgogCi0gIDxwPlRoaXMgc3ludGF4IGlzIG1vc3QgdXNlZnVsIHdoZW4gdXNpbmcgYSB0YXNrIHdpdGggYXR0cmlidXRlCi0gICAgc2V0dGVycyB0aGF0IGFjY2VwdCBvYmplY3RzIG90aGVyIHRoYW4gU3RyaW5nLiAgRm9yIGV4YW1wbGUgaWYgdGhlCi0gICAgc2V0dGVyIGFjY2VwdHMgYSBSZXNvdXJjZSBvYmplY3QgYXMgaW48L3A+CisgIDxwPlRoaXMgc3ludGF4IGlzIG1vc3QgdXNlZnVsIHdoZW4gdXNpbmcgYSB0YXNrIHdpdGggYXR0cmlidXRlIHNldHRlcnMgdGhhdCBhY2NlcHQgb2JqZWN0cyBvdGhlcgorICAgIHRoYW4gPGNvZGUgY2xhc3M9ImNvZGUiPlN0cmluZzwvY29kZT4uICBGb3IgZXhhbXBsZSwgaWYgdGhlIHNldHRlciBhY2NlcHRzCisgICAgYSA8Y29kZSBjbGFzcz0iY29kZSI+UmVzb3VyY2U8L2NvZGU+IG9iamVjdCBhcyBpbjwvcD4KKworICA8cHJlPnB1YmxpYyB2b2lkIHNldEF0dHIoUmVzb3VyY2UgcikgeyAuLi4gfTwvcHJlPgorCisgIDxwPnRoZW4gdGhlIHN5bnRheCBjYW4gYmUgdXNlZCB0byBwYXNzIGluIHJlc291cmNlIHN1YmNsYXNzZXMgcHJldmlvdXNseSBkZWZpbmVkIGFzIHJlZmVyZW5jZXMKKyAgICBsaWtlPC9wPgogPHByZT4KLXB1YmxpYyB2b2lkIHNldEF0dHIoUmVzb3VyY2UgcikgeyAuLi4gfQotPC9wcmU+CismbHQ7dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iIGlkPSJhbnR1cmwiLyZndDsKKyZsdDtteTp0YXNrIGF0dHI9IiR7YW50LnJlZmlkOmFudHVybH0iLyZndDs8L3ByZT4KIAotICA8cD50aGVuIHRoZSBzeW50YXggY2FuIGJlIHVzZWQgdG8gcGFzcyBpbiByZXNvdXJjZSBzdWJjbGFzc2VzCi0gICAgcHJldmlvdXNseSBkZWZpbmVkIGFzIHJlZmVyZW5jZXMgbGlrZTwvcD4KLTxwcmU+Ci0gICZsdDt1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIiBpZD0iYW50dXJsIi8mZ3Q7Ci0gICZsdDtteTp0YXNrIGF0dHI9IiR7YW50LnJlZmlkOmFudHVybH0iLyZndDsKLTwvcHJlPgotCi0gIDxoMj48YSBuYW1lPSJpZit1bmxlc3MiPklmL1VubGVzcyBBdHRyaWJ1dGVzPC9hPjwvaDI+CisgIDxoMiBpZD0iaWYrdW5sZXNzIj5JZi9Vbmxlc3MgQXR0cmlidXRlczwvaDI+CiAgIDxwPgotICAgICAgVGhlIDxjb2RlPiZsdDt0YXJnZXQ+PC9jb2RlPiBlbGVtZW50IGFuZCB2YXJpb3VzIHRhc2tzIChzdWNoIGFzCi0gICAgICA8Y29kZT4mbHQ7ZmFpbD48L2NvZGU+KSBhbmQgdGFzayBlbGVtZW50cyAoc3VjaCBhcyA8Y29kZT4mbHQ7dGVzdD48L2NvZGU+Ci0gICAgICBpbiA8Y29kZT4mbHQ7anVuaXQ+PC9jb2RlPikgc3VwcG9ydCA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPnVubGVzczwvY29kZT4KLSAgICAgIGF0dHJpYnV0ZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29udHJvbCB3aGV0aGVyIHRoZSBpdGVtIGlzIHJ1biBvciBvdGhlcndpc2UKLSAgICAgIHRha2VzIGVmZmVjdC4KKyAgICBUaGUgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+IGVsZW1lbnQgYW5kIHZhcmlvdXMgdGFza3MgKHN1Y2ggYXMgPGNvZGU+Jmx0O2ZhaWwmZ3Q7PC9jb2RlPikKKyAgICBhbmQgdGFzayBlbGVtZW50cyAoc3VjaCBhcyA8Y29kZT4mbHQ7dGVzdCZndDs8L2NvZGU+IGluIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+KQorICAgIHN1cHBvcnQgPHZhcj5pZjwvdmFyPiBhbmQgPHZhcj51bmxlc3M8L3Zhcj4gYXR0cmlidXRlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlCisgICAgaXRlbSBpcyBydW4gb3Igb3RoZXJ3aXNlIHRha2VzIGVmZmVjdC4KICAgPC9wPgogICA8cD4KLSAgICAgIEluIEFudCAxLjcuMSBhbmQgZWFybGllciwgdGhlc2UgYXR0cmlidXRlcyBjb3VsZCBvbmx5IGJlIHByb3BlcnR5IG5hbWVzLgotICAgICAgVGhlIGl0ZW0gd2FzIGVuYWJsZWQgaWYgYSBwcm9wZXJ0eSB3aXRoIHRoYXQgbmFtZSB3YXMgZGVmaW5lZCAtIGV2ZW4gdG8gYmUKLSAgICAgIHRoZSBlbXB0eSBzdHJpbmcgb3IgPHR0PmZhbHNlPC90dD4gLSBhbmQgZGlzYWJsZWQgaWYgdGhlIHByb3BlcnR5IHdhcyBub3QKLSAgICAgIGRlZmluZWQuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdvcmtzIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gb3ZlcnJpZGUKLSAgICAgIHRoZSBmaWxlIGV4aXN0ZW5jZSBjaGVjayBuZWdhdGl2ZWx5IChvbmx5IHBvc2l0aXZlbHkpOgorICAgIEluIEFudCAxLjcuMSBhbmQgZWFybGllciwgdGhlc2UgYXR0cmlidXRlcyBjb3VsZCBvbmx5IGJlIHByb3BlcnR5IG5hbWVzLiAgVGhlIGl0ZW0gd2FzIGVuYWJsZWQKKyAgICBpZiBhIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lIHdhcyBkZWZpbmVkJm1kYXNoO2V2ZW4gdG8gYmUgdGhlIGVtcHR5IHN0cmluZworICAgIG9yIDxxPmZhbHNlPC9xPiZtZGFzaDthbmQgZGlzYWJsZWQgaWYgdGhlIHByb3BlcnR5IHdhcyBub3QgZGVmaW5lZC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKKyAgICB3b3JrcyBidXQgdGhlcmUgaXMgbm8gd2F5IHRvIG92ZXJyaWRlIHRoZSBmaWxlIGV4aXN0ZW5jZSBjaGVjayBuZWdhdGl2ZWx5IChvbmx5IHBvc2l0aXZlbHkpOgogICA8L3A+CiAgIDxwcmU+Ci0mbHQ7dGFyZ2V0IG5hbWU9Ii1jaGVjay11c2UtZmlsZSI+Ci0gICAgJmx0O2F2YWlsYWJsZSBwcm9wZXJ0eT0iZmlsZS5leGlzdHMiIGZpbGU9InNvbWUtZmlsZSIvPgorJmx0O3RhcmdldCBuYW1lPSItY2hlY2stdXNlLWZpbGUiJmd0OworICAgICZsdDthdmFpbGFibGUgcHJvcGVydHk9ImZpbGUuZXhpc3RzIiBmaWxlPSJzb21lLWZpbGUiLyZndDsKKyZsdDsvdGFyZ2V0Jmd0OworJmx0O3RhcmdldCBuYW1lPSJ1c2UtZmlsZSIgZGVwZW5kcz0iLWNoZWNrLXVzZS1maWxlIiA8c3Ryb25nPmlmPSJmaWxlLmV4aXN0cyI8L3N0cm9uZz4mZ3Q7CisgICAgJmx0OyEtLSBkbyBzb21ldGhpbmcgcmVxdWlyaW5nIHRoYXQgZmlsZS4uLiAtLSZndDsKICZsdDsvdGFyZ2V0PgotJmx0O3RhcmdldCBuYW1lPSJ1c2UtZmlsZSIgZGVwZW5kcz0iLWNoZWNrLXVzZS1maWxlIiA8Yj5pZj0iZmlsZS5leGlzdHMiPC9iPj4KLSAgICAmbHQ7IS0tIGRvIHNvbWV0aGluZyByZXF1aXJpbmcgdGhhdCBmaWxlLi4uIC0tPgotJmx0Oy90YXJnZXQ+Ci0mbHQ7dGFyZ2V0IG5hbWU9ImxvdHMtb2Ytc3R1ZmYiIGRlcGVuZHM9InVzZS1maWxlLG90aGVyLXVuY29uZGl0aW9uYWwtc3R1ZmYiLz4KLSAgPC9wcmU+CismbHQ7dGFyZ2V0IG5hbWU9ImxvdHMtb2Ytc3R1ZmYiIGRlcGVuZHM9InVzZS1maWxlLG90aGVyLXVuY29uZGl0aW9uYWwtc3R1ZmYiLyZndDs8L3ByZT4KICAgPHA+Ci0gICAgICBBcyBvZiBBbnQgMS44LjAsIHlvdSBtYXkgaW5zdGVhZCB1c2UgcHJvcGVydHkgZXhwYW5zaW9uOyBhIHZhbHVlIG9mCi0gICAgICA8dHQ+dHJ1ZTwvdHQ+IChvciA8dHQ+b248L3R0PiBvciA8dHQ+eWVzPC90dD4pIHdpbGwgZW5hYmxlIHRoZQotICAgICAgaXRlbSwgd2hpbGUgPHR0PmZhbHNlPC90dD4gKG9yIDx0dD5vZmY8L3R0PiBvciA8dHQ+bm88L3R0Pikgd2lsbAotICAgICAgZGlzYWJsZSBpdC4gT3RoZXIgdmFsdWVzIGFyZSBzdGlsbCBhc3N1bWVkIHRvIGJlIHByb3BlcnR5Ci0gICAgICBuYW1lcyBhbmQgc28gdGhlIGl0ZW0gaXMgZW5hYmxlZCBvbmx5IGlmIHRoZSBuYW1lZCBwcm9wZXJ0eSBpcyBkZWZpbmVkLgorICAgIDxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPiwgeW91IG1heSBpbnN0ZWFkIHVzZSBwcm9wZXJ0eSBleHBhbnNpb247IGEgdmFsdWUgb2YgPHE+dHJ1ZTwvcT4KKyAgICAob3IgPHE+b248L3E+IG9yIDxxPnllczwvcT4pIHdpbGwgZW5hYmxlIHRoZSBpdGVtLCB3aGlsZSA8cT5mYWxzZTwvcT4gKG9yIDxxPm9mZjwvcT4KKyAgICBvciA8cT5ubzwvcT4pIHdpbGwgZGlzYWJsZSBpdC4gT3RoZXIgdmFsdWVzIGFyZSBzdGlsbCBhc3N1bWVkIHRvIGJlIHByb3BlcnR5IG5hbWVzIGFuZCBzbyB0aGUKKyAgICBpdGVtIGlzIGVuYWJsZWQgb25seSBpZiB0aGUgbmFtZWQgcHJvcGVydHkgaXMgZGVmaW5lZC4KICAgPC9wPgogICA8cD4KLSAgICAgIENvbXBhcmVkIHRvIHRoZSBvbGRlciBzdHlsZSwgdGhpcyBnaXZlcyB5b3UgYWRkaXRpb25hbCBmbGV4aWJpbGl0eSwgYmVjYXVzZQotICAgICAgeW91IGNhbiBvdmVycmlkZSB0aGUgY29uZGl0aW9uIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvciBwYXJlbnQgc2NyaXB0czoKKyAgICBDb21wYXJlZCB0byB0aGUgb2xkZXIgc3R5bGUsIHRoaXMgZ2l2ZXMgeW91IGFkZGl0aW9uYWwgZmxleGliaWxpdHksIGJlY2F1c2UgeW91IGNhbiBvdmVycmlkZSB0aGUKKyAgICBjb25kaXRpb24gZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHBhcmVudCBzY3JpcHRzOgogICA8L3A+CiAgIDxwcmU+Ci0mbHQ7dGFyZ2V0IG5hbWU9Ii1jaGVjay11c2UtZmlsZSIgPGI+dW5sZXNzPSJmaWxlLmV4aXN0cyI8L2I+PgotICAgICZsdDthdmFpbGFibGUgcHJvcGVydHk9ImZpbGUuZXhpc3RzIiBmaWxlPSJzb21lLWZpbGUiLz4KKyZsdDt0YXJnZXQgbmFtZT0iLWNoZWNrLXVzZS1maWxlIiA8c3Ryb25nPnVubGVzcz0iZmlsZS5leGlzdHMiPC9zdHJvbmc+Jmd0OworICAgICZsdDthdmFpbGFibGUgcHJvcGVydHk9ImZpbGUuZXhpc3RzIiBmaWxlPSJzb21lLWZpbGUiLyZndDsKICZsdDsvdGFyZ2V0PgotJmx0O3RhcmdldCBuYW1lPSJ1c2UtZmlsZSIgZGVwZW5kcz0iLWNoZWNrLXVzZS1maWxlIiA8Yj5pZj0iJHtmaWxlLmV4aXN0c30iPC9iPj4KLSAgICAmbHQ7IS0tIGRvIHNvbWV0aGluZyByZXF1aXJpbmcgdGhhdCBmaWxlLi4uIC0tPgorJmx0O3RhcmdldCBuYW1lPSJ1c2UtZmlsZSIgZGVwZW5kcz0iLWNoZWNrLXVzZS1maWxlIiA8c3Ryb25nPmlmPSIke2ZpbGUuZXhpc3RzfSI8L3N0cm9uZz4mZ3Q7CisgICAgJmx0OyEtLSBkbyBzb21ldGhpbmcgcmVxdWlyaW5nIHRoYXQgZmlsZS4uLiAtLSZndDsKICZsdDsvdGFyZ2V0PgotJmx0O3RhcmdldCBuYW1lPSJsb3RzLW9mLXN0dWZmIiBkZXBlbmRzPSJ1c2UtZmlsZSxvdGhlci11bmNvbmRpdGlvbmFsLXN0dWZmIi8+Ci0gIDwvcHJlPgorJmx0O3RhcmdldCBuYW1lPSJsb3RzLW9mLXN0dWZmIiBkZXBlbmRzPSJ1c2UtZmlsZSxvdGhlci11bmNvbmRpdGlvbmFsLXN0dWZmIi8mZ3Q7PC9wcmU+CiAgIDxwPgotICAgICAgTm93IDxjb2RlPmFudCAtRGZpbGUuZXhpc3RzPWZhbHNlIGxvdHMtb2Ytc3R1ZmY8L2NvZGU+IHdpbGwgcnVuCi0gICAgICA8Y29kZT5vdGhlci11bmNvbmRpdGlvbmFsLXN0dWZmPC9jb2RlPiBidXQgbm90IDxjb2RlPnVzZS1maWxlPC9jb2RlPiwKLSAgICAgIGFzIHlvdSBtaWdodCBleHBlY3QsIGFuZCB5b3UgY2FuIGRpc2FibGUgdGhlIGNvbmRpdGlvbiBmcm9tIGFub3RoZXIgc2NyaXB0Ci0gICAgICB0b286CisgICAgTm93IDxrYmQ+YW50IC1EZmlsZS5leGlzdHM9ZmFsc2UgbG90cy1vZi1zdHVmZjwva2JkPiB3aWxsIHJ1biA8cT5vdGhlci11bmNvbmRpdGlvbmFsLXN0dWZmPC9xPgorICAgIGJ1dCBub3QgPHE+dXNlLWZpbGU8L3E+LCBhcyB5b3UgbWlnaHQgZXhwZWN0LCBhbmQgeW91IGNhbiBkaXNhYmxlIHRoZSBjb25kaXRpb24gZnJvbSBhbm90aGVyCisgICAgc2NyaXB0IHRvbzoKICAgPC9wPgogICA8cHJlPgotJmx0O2FudGNhbGwgdGFyZ2V0PSJsb3RzLW9mLXN0dWZmIj4KLSAgICAmbHQ7cGFyYW0gbmFtZT0iZmlsZS5leGlzdHMiIHZhbHVlPSJmYWxzZSIvPgotJmx0Oy9hbnRjYWxsPgotICA8L3ByZT4KKyZsdDthbnRjYWxsIHRhcmdldD0ibG90cy1vZi1zdHVmZiImZ3Q7CisgICAgJmx0O3BhcmFtIG5hbWU9ImZpbGUuZXhpc3RzIiB2YWx1ZT0iZmFsc2UiLyZndDsKKyZsdDsvYW50Y2FsbCZndDs8L3ByZT4KICAgPHA+Ci0gICAgICBTaW1pbGFybHksIGFuIDxjb2RlPnVubGVzczwvY29kZT4gYXR0cmlidXRlIGRpc2FibGVzIHRoZSBpdGVtIGlmIGl0IGlzCi0gICAgICBlaXRoZXIgdGhlIG5hbWUgb2YgcHJvcGVydHkgd2hpY2ggaXMgZGVmaW5lZCwgb3IgaWYgaXQgZXZhbHVhdGVzIHRvIGEKLSAgICAgIDx0dD50cnVlPC90dD4tbGlrZSB2YWx1ZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYWxsb3dzIHlvdSB0byBkZWZpbmUKLSAgICAgIDx0dD5za2lwLnByaW50aW5nLm1lc3NhZ2U9dHJ1ZTwvdHQ+IGluIDx0dD5teS1wcmVmcy5wcm9wZXJ0aWVzPC90dD4gd2l0aAotICAgICAgdGhlIHJlc3VsdHMgeW91IG1pZ2h0IGV4cGVjdDoKKyAgICBTaW1pbGFybHksIGFuIDx2YXI+dW5sZXNzPC92YXI+IGF0dHJpYnV0ZSBkaXNhYmxlcyB0aGUgaXRlbSBpZiBpdCBpcyBlaXRoZXIgdGhlIG5hbWUgb2YgcHJvcGVydHkKKyAgICB3aGljaCBpcyBkZWZpbmVkLCBvciBpZiBpdCBldmFsdWF0ZXMgdG8gYSA8cT50cnVlPC9xPi1saWtlIHZhbHVlLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZworICAgIGFsbG93cyB5b3UgdG8gZGVmaW5lIDxjb2RlPnNraXAucHJpbnRpbmcubWVzc2FnZT10cnVlPC9jb2RlPiBpbiA8c2FtcD5teS1wcmVmcy5wcm9wZXJ0aWVzPC9zYW1wPgorICAgIHdpdGggdGhlIHJlc3VsdHMgeW91IG1pZ2h0IGV4cGVjdDoKICAgPC9wPgogICA8cHJlPgotJmx0O3Byb3BlcnR5IGZpbGU9Im15LXByZWZzLnByb3BlcnRpZXMiLz4KLSZsdDt0YXJnZXQgbmFtZT0icHJpbnQtbWVzc2FnZSIgPGI+dW5sZXNzPSIke3NraXAucHJpbnRpbmcubWVzc2FnZX0iPC9iPj4KKyZsdDtwcm9wZXJ0eSBmaWxlPSJteS1wcmVmcy5wcm9wZXJ0aWVzIi8mZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9InByaW50LW1lc3NhZ2UiIDxzdHJvbmc+dW5sZXNzPSIke3NraXAucHJpbnRpbmcubWVzc2FnZX0iPC9zdHJvbmc+Jmd0OwogICAgICZsdDtlY2hvPmhlbGxvISZsdDsvZWNobz4KLSZsdDsvdGFyZ2V0PgotICA8L3ByZT4KKyZsdDsvdGFyZ2V0Jmd0OzwvcHJlPgogCiA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvcHJveHkuaHRtbCBiL21hbnVhbC9wcm94eS5odG1sCmluZGV4IDEzZWY2ZTguLjc2Y2EzMGIgMTAwNjQ0Ci0tLSBhL21hbnVhbC9wcm94eS5odG1sCisrKyBiL21hbnVhbC9wcm94eS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMTAgKzE1LDkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPlByb3h5IENvbmZpZ3VyYXRpb248L3RpdGxlPgogPC9oZWFkPgpAQCAtMjYsODQgKzI2LDgzIEBACiA8aDI+UHJveHkgQ29uZmlndXJhdGlvbjwvaDI+CiAKIDxwPgotVGhpcyBwYWdlIGRpc2N1c3NpbmcgcHJveHkgaXNzdWVzIG9uIGNvbW1hbmQtbGluZSBBcGFjaGUgQW50LgotQ29uc3VsdCB5b3VyIElERSBkb2N1bWVudGF0aW9uIGZvciBJREUtc3BlY2lmaWMgaW5mb3JtYXRpb24gdXBvbiBwcm94eSBzZXR1cC4KKyAgVGhpcyBwYWdlIGRpc2N1c3NpbmcgcHJveHkgaXNzdWVzIG9uIGNvbW1hbmQtbGluZSBBcGFjaGUgQW50LgorICBDb25zdWx0IHlvdXIgSURFIGRvY3VtZW50YXRpb24gZm9yIElERS1zcGVjaWZpYyBpbmZvcm1hdGlvbiB1cG9uCisgIHByb3h5IHNldHVwLgogPC9wPgogCiA8cD4KLQotQWxsIHRhc2tzIGFuZCB0aHJlYWRzIHJ1bm5pbmcgaW4gQW50J3MgSlZNIHNoYXJlIHRoZSBzYW1lIEhUVFAvRlRQL1NvY2tzCi1wcm94eSBjb25maWd1cmF0aW9uLgorICBBbGwgdGFza3MgYW5kIHRocmVhZHMgcnVubmluZyBpbiBBbnQncyBKVk0gc2hhcmUgdGhlIHNhbWUKKyAgSFRUUC9GVFAvU29ja3MgcHJveHkgY29uZmlndXJhdGlvbi4KIDwvcD4KIAogPHA+Ci0gICAgV2hlbiBhbnkgdGFzayB0cmllcyB0byByZXRyaWV2ZSBjb250ZW50IGZyb20gYW4gSFRUUCBwYWdlLCBpbmNsdWRpbmcgdGhlCi0gICAgPGNvZGU+Jmx0O2dldCZndDs8L2NvZGU+IHRhc2ssIGFueSBhdXRvbWF0ZWQgVVJMIHJldHJpZXZhbCBpbgotICAgIGFuIFhNTC9YU0wgdGFzaywgb3IgYW55IHRoaXJkLXBhcnR5IHRhc2sgdGhhdCB1c2VzIHRoZSA8Y29kZT5qYXZhLm5ldC5VUkw8L2NvZGU+Ci0gICAgY2xhc3NlcywgdGhlIHByb3h5IHNldHRpbmdzIG1heSBtYWtlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZS4KKyAgV2hlbiBhbnkgdGFzayB0cmllcyB0byByZXRyaWV2ZSBjb250ZW50IGZyb20gYW4gSFRUUCBwYWdlLCBpbmNsdWRpbmcKKyAgdGhlIDxjb2RlPiZsdDtnZXQmZ3Q7PC9jb2RlPiB0YXNrLCBhbnkgYXV0b21hdGVkIFVSTCByZXRyaWV2YWwgaW4gYW4KKyAgWE1ML1hTTCB0YXNrLCBvciBhbnkgdGhpcmQtcGFydHkgdGFzayB0aGF0IHVzZXMKKyAgdGhlIDxjb2RlPmphdmEubmV0LlVSTDwvY29kZT4gY2xhc3NlcywgdGhlIHByb3h5IHNldHRpbmdzIG1heSBtYWtlCisgIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VjY2VzcyBhbmQgZmFpbHVyZS4KIDwvcD4KIDxwPgotICAgIEFueW9uZSBhdXRob3JpbmcgYSBidWlsZCBmaWxlIGJlaGluZCBhIGJsb2NraW5nIGZpcmV3YWxsIHdpbGwgaW1tZWRpYXRlbHkgYXBwcmVjaWF0ZQotICAgIHRoZSBwcm9ibGVtcyBhbmQgbWF5IHdhbnQgdG8gd3JpdGUgYSBidWlsZCBmaWxlIHRvIGRlYWwgd2l0aCB0aGUgcHJvYmxlbSwgYnV0Ci0gICAgdXNlcnMgb2YgdGhpcmQgcGFydHkgYnVpbGQgYnVpbGQgZmlsZXMgbWF5IGZpbmQgdGhhdCB0aGUgYnVpbGQgZmlsZSBpdHNlbGYKLSAgICBkb2VzIG5vdCB3b3JrIGJlaGluZCB0aGUgZmlyZXdhbGwuCisgIEFueW9uZSBhdXRob3JpbmcgYSBidWlsZCBmaWxlIGJlaGluZCBhIGJsb2NraW5nIGZpcmV3YWxsIHdpbGwKKyAgaW1tZWRpYXRlbHkgYXBwcmVjaWF0ZSB0aGUgcHJvYmxlbXMgYW5kIG1heSB3YW50IHRvIHdyaXRlIGEgYnVpbGQKKyAgZmlsZSB0byBkZWFsIHdpdGggdGhlIHByb2JsZW0sIGJ1dCB1c2VycyBvZiB0aGlyZCBwYXJ0eSBidWlsZCBidWlsZAorICBmaWxlcyBtYXkgZmluZCB0aGF0IHRoZSBidWlsZCBmaWxlIGl0c2VsZiBkb2VzIG5vdCB3b3JrIGJlaGluZCB0aGUKKyAgZmlyZXdhbGwuCiA8L3A+CiA8cD4KLSAgICBUaGlzIGlzIGEgbG9uZyBzdGFuZGluZyBwcm9ibGVtIHdpdGggSmF2YSBhbmQgQW50LiBUaGUgb25seSB3YXkgdG8gZml4Ci0gICAgaXQgaXMgdG8gZXhwbGljaXRseSBjb25maWd1cmUgQW50IHdpdGggdGhlIHByb3h5IHNldHRpbmdzLCBlaXRoZXIKLSAgICBieSBwYXNzaW5nIGRvd24gdGhlIHByb3h5IGRldGFpbHMgYXMgSlZNIHByb3BlcnRpZXMsIG9yIHRvCi0gICAgdGVsbCBBbnQgb24gYSBKYXZhMS41KyBzeXN0ZW0gdG8gaGF2ZSB0aGUgSlZNIHdvcmsgaXQgb3V0IGZvciBpdHNlbGYuCi0KKyAgVGhpcyBpcyBhIGxvbmcgc3RhbmRpbmcgcHJvYmxlbSB3aXRoIEphdmEgYW5kIEFudC4gVGhlIG9ubHkgd2F5IHRvCisgIGZpeCBpdCBpcyB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSBBbnQgd2l0aCB0aGUgcHJveHkgc2V0dGluZ3MsCisgIGVpdGhlciBieSBwYXNzaW5nIGRvd24gdGhlIHByb3h5IGRldGFpbHMgYXMgSlZNIHByb3BlcnRpZXMsIG9yIHRvCisgIHRlbGwgQW50IG9uIGEgSmF2YSA1KyBzeXN0ZW0gdG8gaGF2ZSB0aGUgSlZNIHdvcmsgaXQgb3V0IGZvciBpdHNlbGYuCiA8L3A+CiAKLQotCi08aDM+SmF2YTEuNSsgcHJveHkgc3VwcG9ydCAobmV3IGZvciBBbnQxLjcpPC9oMz4KKzxoMz5KYXZhIDUrIHByb3h5IHN1cHBvcnQ8L2gzPgorPHA+PGVtPlNpbmNlIEFudCAxLjc8L2VtPjwvcD4KIDxwPgotICAgIFdoZW4gQW50IHN0YXJ0cyB1cCwgaWYgdGhlIDxjb2RlPi1hdXRvcHJveHk8L2NvZGU+Ci0gICAgY29tbWFuZCBpcyBzdXBwbGllZCwgQW50IHNldHMgdGhlCi0gICAgPGNvZGU+amF2YS5uZXQudXNlU3lzdGVtUHJveGllczwvY29kZT4gc3lzdGVtIHByb3BlcnR5LiBUaGlzIHRlbGxzIAotICAgIGEgSmF2YTEuNSsgSlZNIHRvIHVzZSB0aGUgY3VycmVudCBzZXQgb2YgcHJvcGVydHkgc2V0dGluZ3Mgb2YgdGhlIGhvc3QKLSAgICBlbnZpcm9ubWVudC4gT3RoZXIgSlZNcywgc3VjaCBhcyB0aGUgS2FmZmUgYW5kIEFwYWNoZSBIYXJtb255IHJ1bnRpbWVzLAotICAgIG1heSBhbHNvIHVzZSB0aGlzIHByb3BlcnR5IGluIGZ1dHVyZS4KLSAgICBJdCBpcyBpZ25vcmVkIG9uIHRoZSBKYXZhMS40IGFuZCBlYXJsaWVyIHJ1bnRpbWVzLgorICBXaGVuIEFudCBzdGFydHMgdXAsIGlmIHRoZSA8a2JkPi1hdXRvcHJveHk8L2tiZD4gY29tbWFuZCBpcworICBzdXBwbGllZCwgQW50IHNldHMgdGhlIDxjb2RlPmphdmEubmV0LnVzZVN5c3RlbVByb3hpZXM8L2NvZGU+IHN5c3RlbQorICBwcm9wZXJ0eS4gVGhpcyB0ZWxscyBhIEphdmEgNSsgcnVudGltZSB0byB1c2UgdGhlIGN1cnJlbnQgc2V0IG9mCisgIHByb3BlcnR5IHNldHRpbmdzIG9mIHRoZSBob3N0IGVudmlyb25tZW50LiBPdGhlciBKVk1zLCBzdWNoIGFzCisgIEthZmZlIGFuZCBBcGFjaGUgSGFybW9ueSwgbWF5IGFsc28gdXNlIHRoaXMgcHJvcGVydHkgaW4KKyAgZnV0dXJlLiAgSXQgaXMgaWdub3JlZCBvbiB0aGUgSmF2YSAxLjQgYW5kIGVhcmxpZXIgcnVudGltZXMuCiA8L3A+CiA8cD4KLSAgICBUaGlzIHByb3BlcnR5IG1heWJlIGVub3VnaCB0byBnaXZlIGNvbW1hbmQtbGluZSBBbnQKLSAgICBidWlsZHMgbmV0d29yayBhY2Nlc3MsIGFsdGhvdWdoIGluIHByYWN0aXNlIHRoZSByZXN1bHRzCi0gICAgYXJlIGluY29uc2lzdGVudC4KKyAgVGhpcyBwcm9wZXJ0eSBtYXliZSBlbm91Z2ggdG8gZ2l2ZSBjb21tYW5kLWxpbmUgQW50IGJ1aWxkcyBuZXR3b3JrCisgIGFjY2VzcywgYWx0aG91Z2ggaW4gcHJhY3Rpc2UgdGhlIHJlc3VsdHMgYXJlIGluY29uc2lzdGVudC4KIDwvcD4KIDxwPgotICAgIEl0IGlzIGhhcyBhbHNvIGJlZW4gcmVwb3J0ZWQgYSBicmVha2luZyB0aGUgSUJNIEphdmEgNSBKUkUgb24gQUlYLAotICAgIGFuZCBkb2VzIG5vdCBhbHdheXMgd29yayBvbiBMaW51eCAocHJlc3VtYWJseSBkdWUgdG8gbWlzc2luZyBnY29uZiBzZXR0aW5ncykKLSAgICBPdGhlciBvZGQgdGhpbmdzIGNhbiBnbyB3cm9uZywgbGlrZSBPcmFjbGUgSkRCQyBkcml2ZXJzIG9yIHB1cmUgSmF2YSBTVk4gY2xpZW50cy4KKyAgSXQgaXMgaGFzIGFsc28gYmVlbiByZXBvcnRlZCBhIGJyZWFraW5nIHRoZSBJQk0gSmF2YSA1IHJ1bnRpbWUgb24gQUlYLAorICBhbmQgZG9lcyBub3QgYWx3YXlzIHdvcmsgb24gTGludXggKHByZXN1bWFibHkgZHVlIHRvCisgIG1pc3NpbmcgPGNvZGU+Z2NvbmY8L2NvZGU+IHNldHRpbmdzKSBPdGhlciBvZGQgdGhpbmdzIGNhbiBnbyB3cm9uZywKKyAgbGlrZSBPcmFjbGUgSkRCQyBkcml2ZXJzIG9yIHB1cmUgSmF2YSBTVk4gY2xpZW50cy4KIDwvcD4KLQogPHA+Ci0gICAgVG8gbWFrZSB0aGUgPGNvZGU+LWF1dG9wcm94eTwvY29kZT4gb3B0aW9uIHRoZSBkZWZhdWx0LCBhZGQgaXQgdG8gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCi0gICAgPGNvZGU+QU5UX0FSR1M8L2NvZGU+LCB3aGljaCBjb250YWlucyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gQW50IG9uIGV2ZXJ5Ci0gICAgY29tbWFuZCBsaW5lIHJ1bi4KKyAgVG8gbWFrZSB0aGUgPGtiZD4tYXV0b3Byb3h5PC9rYmQ+IG9wdGlvbiB0aGUgZGVmYXVsdCwgYWRkIGl0IHRvCisgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5BTlRfQVJHUzwvY29kZT4sIHdoaWNoIGNvbnRhaW5zIGEKKyAgbGlzdCBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byBBbnQgb24gZXZlcnkgY29tbWFuZCBsaW5lIHJ1bi4KIDwvcD4KIAogPGg0PkhvdyBBdXRvcHJveHkgd29ya3M8L2g0PgogPHA+Ci1UaGUgPGNvZGU+amF2YS5uZXQudXNlU3lzdGVtUHJveGllczwvY29kZT4gaXMgY2hlY2tlZCBvbmx5Ci1vbmNlLCBhdCBzdGFydHVwIHRpbWUsIHRoZSBvdGhlciBjaGVja3MgKHJlZ2lzdHJ5LCBnY29uZiwgc3lzdGVtIHByb3BlcnRpZXMpIGFyZSBkb25lCi1keW5hbWljYWxseSB3aGVuZXZlciBuZWVkZWQgKHNvY2tldCBjb25uZWN0aW9uLCBVUkwgY29ubmVjdGlvbiBldGMuLikuCisgIFRoZSA8Y29kZT5qYXZhLm5ldC51c2VTeXN0ZW1Qcm94aWVzPC9jb2RlPiBpcyBjaGVja2VkIG9ubHkgb25jZSwgYXQKKyAgc3RhcnR1cCB0aW1lLCB0aGUgb3RoZXIgY2hlY2tzIChyZWdpc3RyeSwgPGNvZGU+Z2NvbmY8L2NvZGU+LCBzeXN0ZW0KKyAgcHJvcGVydGllcykgYXJlIGRvbmUgZHluYW1pY2FsbHkgd2hlbmV2ZXIgbmVlZGVkIChzb2NrZXQgY29ubmVjdGlvbiwKKyAgVVJMIGNvbm5lY3Rpb24gZXRjLi4pLgogPC9wPgotPGg1PldpbmRvd3M8L2g1PgogCis8aDU+V2luZG93czwvaDU+CiA8cD4KLVRoZSBKVk0gZ29lcyBzdHJhaWdodCB0byB0aGUgcmVnaXN0cnksIGJ5cGFzc2luZyBXaW5JbmV0LCBhcyBpdCBpcyBub3QKLXByZXNlbnQvY29uc2lzdGVudCBvbiBhbGwgc3VwcG9ydGVkIFdpbmRvd3MgcGxhdGZvcm1zIChpdCBpcyBwYXJ0IG9mIElFLAotcmVhbGx5KS4gSmF2YSA3IG1heSB1c2UgdGhlIFdpbmRvd3MgQVBJcyBvbiB0aGUgcGxhdGZvcm1zIHdoZW4gaXQgaXMgcHJlc2VudC4KKyAgVGhlIEpWTSBnb2VzIHN0cmFpZ2h0IHRvIHRoZSByZWdpc3RyeSwgYnlwYXNzaW5nIFdpbkluZXQsIGFzIGl0IGlzCisgIG5vdCBwcmVzZW50L2NvbnNpc3RlbnQgb24gYWxsIHN1cHBvcnRlZCBXaW5kb3dzIHBsYXRmb3JtcyAoaXQgaXMKKyAgcGFydCBvZiBJRSwgcmVhbGx5KS4gSmF2YSA3IG1heSB1c2UgdGhlIFdpbmRvd3MgQVBJcyBvbiB0aGUKKyAgcGxhdGZvcm1zIHdoZW4gaXQgaXMgcHJlc2VudC4KIDwvcD4KIAogPGg1PkxpbnV4PC9oNT4KLQogPHA+Ci1UaGUgSlZNIHVzZXMgdGhlIGdjb25mIGxpYnJhcnkgdG8gbG9vayBhdCBzcGVjaWZpYyBlbnRyaWVzLgotVGhlIEdDb25mLTIgc2V0dGluZ3MgdXNlZCBhcmU6CisgIFRoZSBKVk0gdXNlcyB0aGUgPGNvZGU+Z2NvbmY8L2NvZGU+IGxpYnJhcnkgdG8gbG9vayBhdCBzcGVjaWZpYworICBlbnRyaWVzLiAgVGhlIDxjb2RlPkdDb25mLTI8L2NvZGU+IHNldHRpbmdzIHVzZWQgYXJlOgogPC9wPgogPHByZT4KICAtIC9zeXN0ZW0vaHR0cF9wcm94eS91c2VfaHR0cF9wcm94eSAgICAgICAgICAgIGJvb2xlYW4KQEAgLTEyNCwxNjggKzEyMywxNjcgQEAKICAtIC9zeXN0ZW0vcHJveHkvZ29waGVyX3BvcnQgICAgICAgICAgICAgICAgICAgIGludAogPC9wcmU+CiA8cD4KLUlmIHlvdSBhcmUgdXNpbmcgS0RFIG9yIGFub3RoZXIgR1VJIHRoYW4gR25vbWUsIHlvdSBjYW4gc3RpbGwgdXNlIHRoZQotPGNvZGU+Z2NvbmYtZWRpdG9yPC9jb2RlPiB0b29sIHRvIGFkZCB0aGVzZSBlbnRyaWVzLgorICBJZiB5b3UgYXJlIHVzaW5nIEtERSBvciBhbm90aGVyIEdVSSB0aGFuIEdub21lLCB5b3UgY2FuIHN0aWxsIHVzZQorICB0aGUgPGNvZGU+Z2NvbmYtZWRpdG9yPC9jb2RlPiB0b29sIHRvIGFkZCB0aGVzZSBlbnRyaWVzLgogPC9wPgogCi0KIDxoMz5NYW51YWwgSlZNIG9wdGlvbnM8L2gzPgogPHA+Ci0gICAgQW55IEpWTSBjYW4gaGF2ZSBpdHMgcHJveHkgb3B0aW9ucyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgYnkgcGFzc2luZwotICAgIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT4tRDwvY29kZT4gc3lzdGVtIHByb3BlcnR5IG9wdGlvbnMgdG8gdGhlIHJ1bnRpbWUuCi0gICAgQW50IGNhbiBiZSBjb25maWd1cmVkIHRocm91Z2ggYWxsIGl0cyBzaGVsbCBzY3JpcHRzIHZpYSB0aGUKLSAgICA8Y29kZT5BTlRfT1BUUzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHdoaWNoIGlzIGEgbGlzdCBvZiBvcHRpb25zIHRvCi0gICAgc3VwcGx5IHRvIEFudCdzIEpWTToKKyAgQW55IEpWTSBjYW4gaGF2ZSBpdHMgcHJveHkgb3B0aW9ucyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgYnkgcGFzc2luZworICB0aGUgYXBwcm9wcmlhdGUgPGtiZD4tRDwva2JkPiBzeXN0ZW0gcHJvcGVydHkgb3B0aW9ucyB0byB0aGUKKyAgcnVudGltZS4gIEFudCBjYW4gYmUgY29uZmlndXJlZCB0aHJvdWdoIGFsbCBpdHMgc2hlbGwgc2NyaXB0cyB2aWEKKyAgdGhlIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2hpY2ggaXMgYSBsaXN0IG9mCisgIG9wdGlvbnMgdG8gc3VwcGx5IHRvIEFudCdzIEpWTToKIDwvcD4KIDxwPgogICBGb3IgYmFzaDoKLTwvcD4gIAotPHByZT4KLSAgICBleHBvcnQgQU5UX09QVFM9Ii1EaHR0cC5wcm94eUhvc3Q9cHJveHkgLURodHRwLnByb3h5UG9ydD04MDgwIgotPC9wcmU+Ci0gIEZvciBjc2gvdGNzaDoKLTxwcmU+Ci0gICAgc2V0ZW52IEFOVF9PUFRTICItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCIKLTwvcHJlPgorPC9wPgorPHByZT5leHBvcnQgQU5UX09QVFM9Ii1EaHR0cC5wcm94eUhvc3Q9cHJveHkgLURodHRwLnByb3h5UG9ydD04MDgwIjwvcHJlPgogPHA+Ci1JZiB5b3UgaW5zZXJ0IHRoaXMgbGluZSBpbnRvIHRoZSBBbnQgc2hlbGwgc2NyaXB0IGl0c2VsZiwgaXQgZ2V0cyBwaWNrZWQgdXAKLWJ5IGFsbCBjb250aW51b3VzIGludGVncmF0aW9uIHRvb2xzIHJ1bm5pbmcgb24gdGhlIHN5c3RlbSB0aGF0IGNhbGwgQW50IHZpYSB0aGUKLWNvbW1hbmQgbGluZS4KK0ZvciBjc2gvdGNzaDoKKzwvcD4KKzxwcmU+c2V0ZW52IEFOVF9PUFRTICItRGh0dHAucHJveHlIb3N0PXByb3h5IC1EaHR0cC5wcm94eVBvcnQ9ODA4MCI8L3ByZT4KKzxwPgorICBJZiB5b3UgaW5zZXJ0IHRoaXMgbGluZSBpbnRvIHRoZSBBbnQgc2hlbGwgc2NyaXB0IGl0c2VsZiwgaXQgZ2V0cworICBwaWNrZWQgdXAgYnkgYWxsIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gdG9vbHMgcnVubmluZyBvbiB0aGUgc3lzdGVtCisgIHRoYXQgY2FsbCBBbnQgdmlhIHRoZSBjb21tYW5kIGxpbmUuCiA8L3A+CiA8cD4KLSAgRm9yIFdpbmRvd3MsIHNldCB0aGUgPGNvZGU+QU5UX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZSBhcHByb3ByaWF0ZSAiTXkgQ29tcHV0ZXIiIAotICBwcm9wZXJ0aWVzIGRpYWxvZyBib3ggKHdpblhQKSwgIkNvbXB1dGVyIiBwcm9wZXJ0aWVzIChWaXN0YSkKKyAgRm9yIFdpbmRvd3MsIHNldCB0aGUgPGNvZGU+QU5UX09QVFM8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGluCisgIHRoZSBhcHByb3ByaWF0ZSAiTXkgQ29tcHV0ZXIiIHByb3BlcnRpZXMgZGlhbG9nIGJveCAoWFApLCAiQ29tcHV0ZXIiCisgIHByb3BlcnRpZXMgKFZpc3RhKQogPC9wPgogPHA+Ci0gIFRoaXMgbWVjaGFuaXNtIHdvcmtzIGFjcm9zcyBKYXZhIHZlcnNpb25zLCBpcyBjcm9zcy1wbGF0Zm9ybSBhbmQgcmVsaWFibGUuIAotICBPbmNlIHNldCwgYWxsIGJ1aWxkIGZpbGVzIHJ1biB2aWEgdGhlIGNvbW1hbmQgbGluZSB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZQotICB0aGVpciBwcm94eSBzZXR1cCBjb3JyZWN0bHksIHdpdGhvdXQgbmVlZGluZyBhbnkgYnVpbGQgZmlsZSBjaGFuZ2VzLiBJdCBhbHNvCi0gIGFwcGFyZW50bHkgb3ZlcnJpZGVzIEFudCdzIGF1dG9tYXRpYyBwcm94eSBzZXR0aW5ncyBvcHRpb25zLgorICBUaGlzIG1lY2hhbmlzbSB3b3JrcyBhY3Jvc3MgSmF2YSB2ZXJzaW9ucywgaXMgY3Jvc3MtcGxhdGZvcm0gYW5kCisgIHJlbGlhYmxlLiAgT25jZSBzZXQsIGFsbCBidWlsZCBmaWxlcyBydW4gdmlhIHRoZSBjb21tYW5kIGxpbmUgd2lsbAorICBhdXRvbWF0aWNhbGx5IGhhdmUgdGhlaXIgcHJveHkgc2V0dXAgY29ycmVjdGx5LCB3aXRob3V0IG5lZWRpbmcgYW55CisgIGJ1aWxkIGZpbGUgY2hhbmdlcy4gSXQgYWxzbyBhcHBhcmVudGx5IG92ZXJyaWRlcyBBbnQncyBhdXRvbWF0aWMKKyAgcHJveHkgc2V0dGluZ3Mgb3B0aW9ucy4KIDwvcD4KLTxwPiAgCis8cD4KICAgSXQgaXMgbGltaXRlZCBpbiB0aGUgZm9sbG93aW5nIHdheXM6Ci08L3A+ICAKLSAgPG9sPgorPC9wPgorPG9sPgogICA8bGk+RG9lcyBub3Qgd29yayB1bmRlciBJREVzLiBUaGVzZSBuZWVkIHRoZWlyIG93biBwcm94eSBzZXR0aW5ncyBjaGFuZ2VkPC9saT4KICAgPGxpPk5vdCBkeW5hbWljIGVub3VnaCB0byBkZWFsIHdpdGggbGFwdG9wIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy48L2xpPgotICA8L29sPgotCis8L29sPgogCiA8aDM+U2V0UHJveHkgVGFzazwvaDM+CiA8cD4KLSAgICBUaGUgPGEgaHJlZj0iVGFza3Mvc2V0cHJveHkuaHRtbCI+c2V0cHJveHkgdGFzazwvYT4gY2FuIGJlIHVzZWQgdG8KLSAgICBleHBsaWNpdGx5IHNldCBhIHByb3h5IGluIGEgYnVpbGQgZmlsZS4gVGhpcyBtYW5pcHVsYXRlcyB0aGUgbWFueSBwcm94eSAKLSAgICBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb2YgYSBKVk0sIGFuZCBjb250cm9scyB0aGUgcHJveHkgc2V0dGluZ3MgZm9yIGFsbCAKLSAgICBuZXR3b3JrIG9wZXJhdGlvbnMgaW4gdGhlIHNhbWUgSlZNIGZyb20gdGhhdCBtb21lbnQuIAorICBUaGUgPGEgaHJlZj0iVGFza3Mvc2V0cHJveHkuaHRtbCI+c2V0cHJveHkgdGFzazwvYT4gY2FuIGJlIHVzZWQgdG8KKyAgZXhwbGljaXRseSBzZXQgYSBwcm94eSBpbiBhIGJ1aWxkIGZpbGUuIFRoaXMgbWFuaXB1bGF0ZXMgdGhlIG1hbnkKKyAgcHJveHkgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIGEgSlZNLCBhbmQgY29udHJvbHMgdGhlIHByb3h5CisgIHNldHRpbmdzIGZvciBhbGwgbmV0d29yayBvcGVyYXRpb25zIGluIHRoZSBzYW1lIEpWTSBmcm9tIHRoYXQKKyAgbW9tZW50LgogPC9wPgogPHA+Ci0gICAgSWYgeW91IGhhdmUgYSBidWlsZCBmaWxlIHRoYXQgaXMgb25seSB0byBiZSB1c2VkIGluLWhvdXNlLCBiZWhpbmQgYSBmaXJld2FsbCwgb24KLSAgICBhbiBvbGRlciBKVk0sIDxpPmFuZCB5b3UgY2Fubm90IGNoYW5nZSBBbnQncyBKVk0gcHJveHkgc2V0dGluZ3M8L2k+LCB0aGVuCi0gICAgdGhpcyBpcyB5b3VyIGJlc3Qgb3B0aW9uLiBJdCBpcyB1Z2x5IGFuZCBicml0dGxlLCBiZWNhdXNlIHRoZSBidWlsZCBmaWxlIG5vdyBjb250YWlucwotICAgIHN5c3RlbSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBJdCBpcyBhbHNvIGhhcmQgdG8gZ2V0IHRoaXMgcmlnaHQgYWNyb3NzCi0gICAgdGhlIG1hbnkgcG9zc2libGUgcHJveHkgb3B0aW9ucyBvZiBkaWZmZXJlbnQgdXNlcnMgKG5vbmUsIEhUVFAsIFNPQ0tTKS4KKyAgSWYgeW91IGhhdmUgYSBidWlsZCBmaWxlIHRoYXQgaXMgb25seSB0byBiZSB1c2VkIGluLWhvdXNlLCBiZWhpbmQgYQorICBmaXJld2FsbCwgb24gYW4gb2xkZXIgSlZNLCA8ZW0+YW5kIHlvdSBjYW5ub3QgY2hhbmdlIEFudCdzIEpWTSBwcm94eQorICBzZXR0aW5nczwvZW0+LCB0aGVuIHRoaXMgaXMgeW91ciBiZXN0IG9wdGlvbi4gSXQgaXMgdWdseSBhbmQKKyAgYnJpdHRsZSwgYmVjYXVzZSB0aGUgYnVpbGQgZmlsZSBub3cgY29udGFpbnMgc3lzdGVtIGNvbmZpZ3VyYXRpb24KKyAgaW5mb3JtYXRpb24uIEl0IGlzIGFsc28gaGFyZCB0byBnZXQgdGhpcyByaWdodCBhY3Jvc3MgdGhlIG1hbnkKKyAgcG9zc2libGUgcHJveHkgb3B0aW9ucyBvZiBkaWZmZXJlbnQgdXNlcnMgKG5vbmUsIEhUVFAsIFNPQ0tTKS4KIDwvcD4KLQotCiA8cD4KLSAgICBOb3RlIHRoYXQgcHJveHkgY29uZmlndXJhdGlvbnMgc2V0IHdpdGggdGhpcyB0YXNrIHdpbGwgcHJvYmFibHkgb3ZlcnJpZGUKLSAgICBhbnkgc2V0IGJ5IG90aGVyIG1lY2hhbmlzbXMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBmYW5jeSB0cmlja3MgdG8gCi0gICAgb25seSBzZXQgYSBwcm94eSBpZiB0aGUgcHJveHkgaXMgY29uc2lkZXJlZCByZWFjaGFibGU6CisgIE5vdGUgdGhhdCBwcm94eSBjb25maWd1cmF0aW9ucyBzZXQgd2l0aCB0aGlzIHRhc2sgd2lsbCBwcm9iYWJseQorICBvdmVycmlkZSBhbnkgc2V0IGJ5IG90aGVyIG1lY2hhbmlzbXMuIEl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBmYW5jeQorICB0cmlja3MgdG8gb25seSBzZXQgYSBwcm94eSBpZiB0aGUgcHJveHkgaXMgY29uc2lkZXJlZCByZWFjaGFibGU6CiA8L3A+CiAKIDxwcmU+Ci0gICZsdDt0YXJnZXQgbmFtZT0icHJvYmUtcHJveHkiIGRlcGVuZHM9ImluaXQiJmd0OwotICAgICZsdDtjb25kaXRpb24gcHJvcGVydHk9InByb3h5LmVuYWJsZWQiJmd0OwotICAgICAgJmx0O2FuZCZndDsKLSAgICAgICAgJmx0O2lzc2V0IHByb3BlcnR5PSJwcm94eS5ob3N0Ii8mZ3Q7Ci0gICAgICAgICZsdDtpc3JlYWNoYWJsZSBob3N0PSIke3Byb3h5Lmhvc3R9Ii8mZ3Q7Ci0gICAgICAmbHQ7L2FuZCZndDsKLSAgICAmbHQ7L2NvbmRpdGlvbiZndDsKLSAgJmx0Oy90YXJnZXQmZ3Q7CismbHQ7dGFyZ2V0IG5hbWU9InByb2JlLXByb3h5IiBkZXBlbmRzPSJpbml0IiZndDsKKyAgJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0icHJveHkuZW5hYmxlZCImZ3Q7CisgICAgJmx0O2FuZCZndDsKKyAgICAgICZsdDtpc3NldCBwcm9wZXJ0eT0icHJveHkuaG9zdCIvJmd0OworICAgICAgJmx0O2lzcmVhY2hhYmxlIGhvc3Q9IiR7cHJveHkuaG9zdH0iLyZndDsKKyAgICAmbHQ7L2FuZCZndDsKKyAgJmx0Oy9jb25kaXRpb24mZ3Q7CismbHQ7L3RhcmdldCZndDsKIAotICAmbHQ7dGFyZ2V0IG5hbWU9InByb3h5IiBkZXBlbmRzPSJwcm9iZS1wcm94eSIgaWY9InByb3h5LmVuYWJsZWQiJmd0OwotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJwcm94eS5wb3J0IiB2YWx1ZT0iODAiLyZndDsKLSAgICAmbHQ7cHJvcGVydHkgbmFtZT0icHJveHkudXNlciIgdmFsdWU9IiIvJmd0OwotICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJwcm94eS5wYXNzIiB2YWx1ZT0iIi8mZ3Q7Ci0gICAgJmx0O3NldHByb3h5IHByb3h5aG9zdD0iJHtwcm94eS5ob3N0fSIgcHJveHlwb3J0PSIke3Byb3h5LnBvcnR9IgotICAgICAgcHJveHl1c2VyPSIke3Byb3h5LnVzZXJ9IiBwcm94eXBhc3N3b3JkPSIke3Byb3h5LnBhc3N9Ii8mZ3Q7Ci0gICZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+CismbHQ7dGFyZ2V0IG5hbWU9InByb3h5IiBkZXBlbmRzPSJwcm9iZS1wcm94eSIgaWY9InByb3h5LmVuYWJsZWQiJmd0OworICAmbHQ7cHJvcGVydHkgbmFtZT0icHJveHkucG9ydCIgdmFsdWU9IjgwIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJwcm94eS51c2VyIiB2YWx1ZT0iIi8mZ3Q7CisgICZsdDtwcm9wZXJ0eSBuYW1lPSJwcm94eS5wYXNzIiB2YWx1ZT0iIi8mZ3Q7CisgICZsdDtzZXRwcm94eSBwcm94eWhvc3Q9IiR7cHJveHkuaG9zdH0iIHByb3h5cG9ydD0iJHtwcm94eS5wb3J0fSIKKyAgICAgICAgICAgIHByb3h5dXNlcj0iJHtwcm94eS51c2VyfSIgcHJveHlwYXNzd29yZD0iJHtwcm94eS5wYXNzfSIvJmd0OworJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKIDxoMz5DdXN0b20gUHJveHlTZWxlY3RvciBpbXBsZW1lbnRhdGlvbnM8L2gzPgogPHA+Ci0gICAgQXMgSmF2YSBsZXRzIGRldmVsb3BlcnMgd3JpdGUgdGhlaXIgb3duIFByb3h5U2VsZWN0b3IgaW1wbGVtZW50YXRpb25zLCBpdCAKLSAgICBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIGZvciBzb21lb25lIHRvIHdyaXRlIHRoZWlyIG93biBwcm94eSBzZWxlY3RvciBjbGFzcyB0aGF0IHVzZXMKLSAgICBkaWZmZXJlbnQgcG9saWNpZXMgdG8gZGV0ZXJtaW5lIHByb3h5IHNldHRpbmdzLiBUaGVyZSBpcyBubyBleHBsaWNpdCBzdXBwb3J0Ci0gICAgZm9yIHRoaXMgaW4gQW50LCBhbmQgaXQgaGFzIG5vdCwgdG8gdGhlIHRlYW0ncyBrbm93bGVkZ2UsIGJlZW4gYXR0ZW1wdGVkLiAKKyAgQXMgSmF2YSBsZXRzIGRldmVsb3BlcnMgd3JpdGUgdGhlaXIgb3duIFByb3h5U2VsZWN0b3IKKyAgaW1wbGVtZW50YXRpb25zLCBpdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIGZvciBzb21lb25lIHRvIHdyaXRlCisgIHRoZWlyIG93biBwcm94eSBzZWxlY3RvciBjbGFzcyB0aGF0IHVzZXMgZGlmZmVyZW50IHBvbGljaWVzIHRvCisgIGRldGVybWluZSBwcm94eSBzZXR0aW5ncy4gVGhlcmUgaXMgbm8gZXhwbGljaXQgc3VwcG9ydCBmb3IgdGhpcyBpbgorICBBbnQsIGFuZCBpdCBoYXMgbm90LCB0byB0aGUgdGVhbSdzIGtub3dsZWRnZSwgYmVlbiBhdHRlbXB0ZWQuCiA8L3A+CiA8cD4KLSAgICBUaGlzIGNvdWxkIGJlIHRoZSBtb3N0IGZsZXhpYmxlIG9mIHNvbHV0aW9ucywgYXMgb25lIGNvdWxkIGVhc2lseSBpbWFnaW5lCi0gICAgYW4gQW50LXNwZWNpZmljIHByb3h5IHNlbGVjdG9yIHRoYXQgd2FzIGRyaXZlbiBvZmYgYW50IHByb3BlcnRpZXMsIHJhdGhlcgotICAgIHRoYW4gc3lzdGVtIHByb3BlcnRpZXMuIERldmVsb3BlcnMgY291bGQgc2V0IHByb3h5IG9wdGlvbnMgaW4gdGhlaXIKLSAgICBjdXN0b20gYnVpbGQucHJvcGVydGllcyBmaWxlcywgYW5kIGhhdmUgdGhpcyBwcm9wYWdhdGUuCisgIFRoaXMgY291bGQgYmUgdGhlIG1vc3QgZmxleGlibGUgb2Ygc29sdXRpb25zLCBhcyBvbmUgY291bGQgZWFzaWx5CisgIGltYWdpbmUgYW4gQW50LXNwZWNpZmljIHByb3h5IHNlbGVjdG9yIHRoYXQgd2FzIGRyaXZlbiBvZmYgYW50CisgIHByb3BlcnRpZXMsIHJhdGhlciB0aGFuIHN5c3RlbSBwcm9wZXJ0aWVzLiBEZXZlbG9wZXJzIGNvdWxkIHNldAorICBwcm94eSBvcHRpb25zIGluIHRoZWlyIGN1c3RvbSBidWlsZC5wcm9wZXJ0aWVzIGZpbGVzLCBhbmQgaGF2ZSB0aGlzCisgIHByb3BhZ2F0ZS4KIDwvcD4KIDxwPgotICAgIE9uZSBpc3N1ZSBoZXJlIGlzIHdpdGggY29uY3VycmVuY3k6IHRoZSBkZWZhdWx0IHByb3h5IHNlbGVjdG9yIGlzIHBlci1KVk0sCi0gICAgbm90IHBlci10aHJlYWQsIGFuZCBzbyB0aGUgcHJveHkgc2V0dGluZ3Mgd2lsbCBhcHBseSB0byBhbGwgc29ja2V0cyBvcGVuZWQKLSAgICBvbiBhbGwgdGhyZWFkczsgd2UgYWxzbyBoYXZlIHRoZSBwcm9ibGVtIG9mIGhvdyB0byBwcm9wYWdhdGUgb3B0aW9ucyBmcm9tCi0gICAgb25lIGJ1aWxkIHRvIHRoZSBKVk0td2lkZSBzZWxlY3Rvci4KKyAgT25lIGlzc3VlIGhlcmUgaXMgd2l0aCBjb25jdXJyZW5jeTogdGhlIGRlZmF1bHQgcHJveHkgc2VsZWN0b3IgaXMKKyAgcGVyLUpWTSwgbm90IHBlci10aHJlYWQsIGFuZCBzbyB0aGUgcHJveHkgc2V0dGluZ3Mgd2lsbCBhcHBseSB0byBhbGwKKyAgc29ja2V0cyBvcGVuZWQgb24gYWxsIHRocmVhZHM7IHdlIGFsc28gaGF2ZSB0aGUgcHJvYmxlbSBvZiBob3cgdG8KKyAgcHJvcGFnYXRlIG9wdGlvbnMgZnJvbSBvbmUgYnVpbGQgdG8gdGhlIEpWTS13aWRlIHNlbGVjdG9yLgogPC9wPgogCiA8aDM+Q29uZmlndXJpbmcgdGhlIFByb3h5IHNldHRpbmdzIG9mIEphdmEgcHJvZ3JhbXMgdW5kZXIgQW50PC9oMz4KIAogPHA+Ci0gICAgQW55IHByb2dyYW0gdGhhdCBpcyBleGVjdXRlZCB3aXRoIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gd2l0aG91dCBzZXR0aW5nCi0gICAgPGNvZGU+Zm9yaz0idHJ1ZSI8L2NvZGU+IHdpbGwgcGljayB1cCB0aGUgQW50J3Mgc2V0dGluZ3MuIElmIHlvdSBuZWVkCi0gICAgZGlmZmVyZW50IHZhbHVlcywgc2V0IDxjb2RlPmZvcms9ImZhbHNlIjwvY29kZT4gYW5kIHByb3ZpZGUgdGhlIHZhbHVlcwotICAgIGluIDxjb2RlPiZsdDtzeXNwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnRzLgotPC9wPiAgICAKLSAgICBJZiB5b3Ugd2lzaCB0byBoYXZlCi0gICAgYSBmb3JrZWQgcHJvY2VzcyBwaWNrIHVwIHRoZSBBbnQncyBzZXR0aW5ncywgdXNlIHRoZSAKLSAgICA8YSBocmVmPSJUeXBlcy9wcm9wZXJ0eXNldC5odG1sIj48Y29kZT4mbHQ7c3lzcHJvcGVydHlzZXQmZ3Q7PC9jb2RlPjwvYT4KLSAgICBlbGVtZW50IHRvIHByb3BhZ2F0ZSB0aGUgbm9ybWFsIHByb3h5IHNldHRpbmdzLiBUaGUgZm9sbG93aW5nIHByb3BlcnR5c2V0Ci0gICAgaXMgYSBkYXRhdHlwZSB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbiBhIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gdGFzayB0bwotICAgIHBhc3MgZG93biB0aGUgY3VycmVudCB2YWx1ZXMuCi0gICAgCisgIEFueSBwcm9ncmFtIHRoYXQgaXMgZXhlY3V0ZWQgd2l0aCA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IHdpdGhvdXQKKyAgc2V0dGluZyA8dmFyPmZvcms8L3Zhcj49PHE+dHJ1ZTwvcT4gd2lsbCBwaWNrIHVwIHRoZSBBbnQncworICBzZXR0aW5ncy4gSWYgeW91IG5lZWQgZGlmZmVyZW50IHZhbHVlcywKKyAgc2V0IDx2YXI+Zm9yazwvdmFyPj08cT5mYWxzZTwvcT4gYW5kIHByb3ZpZGUgdGhlIHZhbHVlcworICBpbiA8Y29kZT4mbHQ7c3lzcHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50cy4KKzwvcD4KKzxwPgorICBJZiB5b3Ugd2lzaCB0byBoYXZlIGEgZm9ya2VkIHByb2Nlc3MgcGljayB1cCB0aGUgQW50J3Mgc2V0dGluZ3MsIHVzZQorICB0aGUgPGEgaHJlZj0iVHlwZXMvcHJvcGVydHlzZXQuaHRtbCI+PGNvZGU+Jmx0O3N5c3Byb3BlcnR5c2V0Jmd0OzwvY29kZT48L2E+CisgIGVsZW1lbnQgdG8gcHJvcGFnYXRlIHRoZSBub3JtYWwgcHJveHkgc2V0dGluZ3MuIFRoZSBmb2xsb3dpbmcKKyAgcHJvcGVydHlzZXQgaXMgYSBkYXRhdHlwZSB3aGljaCBjYW4gYmUgcmVmZXJlbmNlZCBpbgorICBhIDxjb2RlPiZsdDtqYXZhJmd0OzwvY29kZT4gdGFzayB0byBwYXNzIGRvd24gdGhlIGN1cnJlbnQgdmFsdWVzLgogPC9wPgogPHByZT4KLSZsdDtwcm9wZXJ0eXNldCBpZD0icHJveHkucHJvcGVydGllcyI+Ci0gICZsdDtwcm9wZXJ0eXJlZiBwcmVmaXg9ImphdmEubmV0LnVzZVN5c3RlbVByb3hpZXMiLz4KLSAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iaHR0cC4iLz4KLSAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iaHR0cHMuIi8+Ci0gICZsdDtwcm9wZXJ0eXJlZiBwcmVmaXg9ImZ0cC4iLz4KLSAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0ic29ja3NQcm94eSIvPgotJmx0Oy9wcm9wZXJ0eXNldD4KLTwvcHJlPgorJmx0O3Byb3BlcnR5c2V0IGlkPSJwcm94eS5wcm9wZXJ0aWVzIiZndDsKKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iamF2YS5uZXQudXNlU3lzdGVtUHJveGllcyIvJmd0OworICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJodHRwLiIvJmd0OworICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJodHRwcy4iLyZndDsKKyAgJmx0O3Byb3BlcnR5cmVmIHByZWZpeD0iZnRwLiIvJmd0OworICAmbHQ7cHJvcGVydHlyZWYgcHJlZml4PSJzb2Nrc1Byb3h5Ii8mZ3Q7CismbHQ7L3Byb3BlcnR5c2V0Jmd0OzwvcHJlPgogCiA8aDM+U3VtbWFyeSBhbmQgY29uY2x1c2lvbnM8L2gzPgogPHA+Ci1UaGVyZSBhcmUgZm91ciB3YXlzIHRvIHNldCB1cCBwcm94aWVzIGluIEFudC4KKyAgVGhlcmUgYXJlIGZvdXIgd2F5cyB0byBzZXQgdXAgcHJveGllcyBpbiBBbnQuCiA8L3A+CiA8b2w+Ci08bGk+V2l0aCBBbnQxLjcgYW5kIEphdmEgMS41KyB1c2luZyB0aGUgPGNvZGU+LWF1dG9wcm94eTwvY29kZT4gcGFyYW1ldGVyLjwvbGk+Ci08bGk+VmlhIEpWTSBzeXN0ZW0gcHJvcGVydGllcyAtc2V0IHRoZXNlIGluIHRoZSBBTlRfQVJHUyBlbnZpcm9ubWVudCB2YXJpYWJsZS48L2xpPgotPGxpPlZpYSB0aGUgJmx0O3NldHByb3h5Jmd0OyB0YXNrLjwvbGk+Ci08bGk+Q3VzdG9tIFByb3h5U2VsZWN0b3IgaW1wbGVtZW50YXRpb25zPC9saT4KKyAgPGxpPldpdGggQW50IDEuNyBhbmQgSmF2YSA1KyB1c2luZyB0aGUgPGtiZD4tYXV0b3Byb3h5PC9rYmQ+IHBhcmFtZXRlci48L2xpPgorICA8bGk+VmlhIEpWTSBzeXN0ZW0gcHJvcGVydGllcyZtZGFzaDtzZXQgdGhlc2UgaW4gdGhlIDxjb2RlPkFOVF9BUkdTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L2xpPgorICA8bGk+VmlhIHRoZSA8Y29kZT4mbHQ7c2V0cHJveHkmZ3Q7PC9jb2RlPiB0YXNrLjwvbGk+CisgIDxsaT5DdXN0b20gUHJveHlTZWxlY3RvciBpbXBsZW1lbnRhdGlvbnM8L2xpPgogPC9vbD4KIDxwPgotUHJveHkgc2V0dGluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgc2hhcmVkIHdpdGggSmF2YSBwcm9ncmFtcyBzdGFydGVkIHVuZGVyIEFudCA8aT4KLXRoYXQgYXJlIG5vdCBmb3JrZWQ8L2k+OyB0byBwYXNzIHByb3h5IHNldHRpbmdzIGRvd24gdG8gc3Vic2lkaWFyeSBwcm9ncmFtcywgdXNlCi1hIHByb3BlcnR5c2V0LgorICBQcm94eSBzZXR0aW5ncyBhcmUgYXV0b21hdGljYWxseSBzaGFyZWQgd2l0aCBKYXZhIHByb2dyYW1zIHN0YXJ0ZWQKKyAgdW5kZXIgQW50IDxlbT50aGF0IGFyZSBub3QgZm9ya2VkPC9lbT47IHRvIHBhc3MgcHJveHkgc2V0dGluZ3MgZG93bgorICB0byBzdWJzaWRpYXJ5IHByb2dyYW1zLCB1c2UgYSBwcm9wZXJ0eXNldC4KIDwvcD4KIDxwPgotT3ZlciB0aW1lLCB3ZSBleHBlY3QgdGhlIEphdmEgNSsgcHJveHkgZmVhdHVyZXMgdG8gc3RhYmlsaXplLCBhbmQgZm9yIEphdmEgY29kZQotdG8gYWRhcHQgdG8gdGhlbS4gSG93ZXZlciwgZ2l2ZW4gdGhlIGZhY3QgdGhhdCBpdCBjdXJyZW50bHkgZG9lcyBicmVhayBzb21lCi1idWlsZHMsIGl0IHdpbGwgYmUgc29tZSB0aW1lIGJlZm9yZSBBbnQgZW5hYmxlcyB0aGUgYXV0b21hdGljIHByb3h5IGZlYXR1cmUgYnkKLWRlZmF1bHQuIFVudGlsIHRoZW4sIHlvdSBoYXZlIHRvIGVuYWJsZSB0aGUgPGNvZGU+LWF1dG9wcm94eTwvY29kZT4gb3B0aW9uIG9yCi11c2Ugb25lIG9mIHRoZSBhbHRlcm5hdGUgbWVjaGFuaXNtcyB0byBjb25maWd1cmUgdGhlIEpWTS4KKyAgT3ZlciB0aW1lLCB3ZSBleHBlY3QgdGhlIEphdmEgNSsgcHJveHkgZmVhdHVyZXMgdG8gc3RhYmlsaXplLCBhbmQKKyAgZm9yIEphdmEgY29kZSB0byBhZGFwdCB0byB0aGVtLiBIb3dldmVyLCBnaXZlbiB0aGUgZmFjdCB0aGF0IGl0CisgIGN1cnJlbnRseSBkb2VzIGJyZWFrIHNvbWUgYnVpbGRzLCBpdCB3aWxsIGJlIHNvbWUgdGltZSBiZWZvcmUgQW50CisgIGVuYWJsZXMgdGhlIGF1dG9tYXRpYyBwcm94eSBmZWF0dXJlIGJ5IGRlZmF1bHQuIFVudGlsIHRoZW4sIHlvdSBoYXZlCisgIHRvIGVuYWJsZSB0aGUgPGtiZD4tYXV0b3Byb3h5PC9rYmQ+IG9wdGlvbiBvciB1c2Ugb25lIG9mIHRoZQorICBhbHRlcm5hdGUgbWVjaGFuaXNtcyB0byBjb25maWd1cmUgdGhlIEpWTS4KKzwvcD4KIAogPGg0PkZ1cnRoZXIgcmVhZGluZzwvaDQ+CiAKIDx1bD4KLTxsaT48YSBocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9uZXQvcHJvcGVydGllcy5odG1sIj4KLUphdmEgTmV0d29ya2luZyBQcm9wZXJ0aWVzPC9hPi4KLTwvbGk+CisgIDxsaT48YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvbmV0L3Byb3BlcnRpZXMuaHRtbCIKKyAgICAgICAgIHRhcmdldD0iX3RvcCI+SmF2YSBOZXR3b3JraW5nIFByb3BlcnRpZXM8L2E+LjwvbGk+CiA8L3VsPgogCiA8L2JvZHk+CmRpZmYgLS1naXQgYS9tYW51YWwvcnVubmluZy5odG1sIGIvbWFudWFsL3J1bm5pbmcuaHRtbAppbmRleCBiMzgxNWE3Li5hYjQ4Zjk1IDEwMDY0NAotLS0gYS9tYW51YWwvcnVubmluZy5odG1sCisrKyBiL21hbnVhbC9ydW5uaW5nLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CiA8dGl0bGU+UnVubmluZyBBcGFjaGUgQW50PC90aXRsZT4KIDwvaGVhZD4KQEAgLTI1LDgwICsyNSw3NCBAQAogPGJvZHk+CiAKIDxoMT5SdW5uaW5nIEFwYWNoZSBBbnQ8L2gxPgotPGgyPjxhIG5hbWU9ImNvbW1hbmRsaW5lIj5Db21tYW5kIExpbmU8L2E+PC9oMj4KLTxwPiBJZiB5b3UndmUgaW5zdGFsbGVkIEFwYWNoZSBBbnQgYXMgZGVzY3JpYmVkIGluIHRoZQotPGEgaHJlZj0iaW5zdGFsbC5odG1sIj4gSW5zdGFsbGluZyBBbnQ8L2E+IHNlY3Rpb24sCi1ydW5uaW5nIEFudCBmcm9tIHRoZSBjb21tYW5kLWxpbmUgaXMgc2ltcGxlOiBqdXN0IHR5cGUKLTxjb2RlPmFudDwvY29kZT4uPC9wPgotPHA+V2hlbiBubyBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgQW50IGxvb2tzIGZvciBhIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4KLWZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCwgaWYgZm91bmQsIHVzZXMgdGhhdCBmaWxlIGFzIHRoZQotYnVpbGQgZmlsZSBhbmQgcnVucyB0aGUgdGFyZ2V0IHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+ZGVmYXVsdDwvY29kZT4KLWF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiB0YWcuCi1UbyBtYWtlIEFudCB1c2UKLWEgYnVpbGQgZmlsZSBvdGhlciB0aGFuIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4sIHVzZSB0aGUgY29tbWFuZC1saW5lCi1vcHRpb24gPG5vYnI+PGNvZGU+LWJ1aWxkZmlsZSA8aT5maWxlPC9pPjwvY29kZT48L25vYnI+LAotd2hlcmUgPGk+ZmlsZTwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIGZpbGUgeW91IHdhbnQgdG8gdXNlCi0ob3IgYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4gZmlsZSkuPC9wPgotSWYgeW91IHVzZSB0aGUgPG5vYnI+PGNvZGU+LWZpbmQgWzxpPmZpbGU8L2k+XTwvY29kZT48L25vYnI+IG9wdGlvbiwKLUFudCB3aWxsIHNlYXJjaCBmb3IgYSBidWlsZCBmaWxlIGZpcnN0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhlbiBpbgotdGhlIHBhcmVudCBkaXJlY3RvcnksIGFuZCBzbyBvbiwgdW50aWwgZWl0aGVyIGEgYnVpbGQgZmlsZSBpcyBmb3VuZCBvciB0aGUgcm9vdAotb2YgdGhlIGZpbGVzeXN0ZW0gaGFzIGJlZW4gcmVhY2hlZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCBsb29rIGZvciBhIGJ1aWxkIGZpbGUKLWNhbGxlZCA8Y29kZT5idWlsZC54bWw8L2NvZGU+LiBUbyBoYXZlIGl0IHNlYXJjaCBmb3IgYSBidWlsZCBmaWxlIG90aGVyCi10aGFuIDxjb2RlPmJ1aWxkLnhtbDwvY29kZT4sIHNwZWNpZnkgYSBmaWxlIGFyZ3VtZW50LgotPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJZiB5b3UgaW5jbHVkZSBhbnkgb3RoZXIgZmxhZ3Mgb3IgYXJndW1lbnRzCi1vbiB0aGUgY29tbWFuZCBsaW5lIGFmdGVyCi10aGUgPG5vYnI+PGNvZGU+LWZpbmQ8L2NvZGU+PC9ub2JyPiBmbGFnLCB5b3UgbXVzdCBpbmNsdWRlIHRoZSBmaWxlIGFyZ3VtZW50Ci1mb3IgdGhlIDxub2JyPjxjb2RlPi1maW5kPC9jb2RlPjwvbm9icj4gZmxhZywgZXZlbiBpZiB0aGUgbmFtZSBvZiB0aGUKLWJ1aWxkIGZpbGUgeW91IHdhbnQgdG8gZmluZCBpcyA8Y29kZT5idWlsZC54bWw8L2NvZGU+LgorPGgyIGlkPSJjb21tYW5kbGluZSI+Q29tbWFuZCBMaW5lPC9oMj4KIAotPHA+WW91IGNhbiBhbHNvIHNldCA8YSBocmVmPSJ1c2luZy5odG1sI3Byb3BlcnRpZXMiPnByb3BlcnRpZXM8L2E+IG9uIHRoZQotY29tbWFuZCBsaW5lLiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoCi10aGUgPG5vYnI+PGNvZGU+LUQ8aT5wcm9wZXJ0eTwvaT49PGk+dmFsdWU8L2k+PC9jb2RlPjwvbm9icj4gb3B0aW9uLAotd2hlcmUgPGk+cHJvcGVydHk8L2k+IGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSwKLWFuZCA8aT52YWx1ZTwvaT4gaXMgdGhlIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5LiBJZiB5b3Ugc3BlY2lmeSBhCi1wcm9wZXJ0eSB0aGF0IGlzIGFsc28gc2V0IGluIHRoZSBidWlsZCBmaWxlCi0oc2VlIHRoZSA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzayksCi10aGUgdmFsdWUgc3BlY2lmaWVkIG9uIHRoZQotY29tbWFuZCBsaW5lIHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUKLWJ1aWxkIGZpbGUuCi1EZWZpbmluZyBwcm9wZXJ0aWVzIG9uIHRoZSBjb21tYW5kIGxpbmUgY2FuIGFsc28gYmUgdXNlZCB0byBwYXNzIGluCi10aGUgdmFsdWUgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzOyBqdXN0IHBhc3MKLTxub2JyPjxjb2RlPi1ETVlWQVI9JU1ZVkFSJTwvY29kZT48L25vYnI+IChXaW5kb3dzKSBvcgotPG5vYnI+PGNvZGU+LURNWVZBUj0kTVlWQVI8L2NvZGU+PC9ub2JyPiAoVW5peCkKLXRvIEFudC4gWW91IGNhbiB0aGVuIGFjY2VzcwotdGhlc2UgdmFyaWFibGVzIGluc2lkZSB5b3VyIGJ1aWxkIGZpbGUgYXMgPGNvZGU+JHtNWVZBUn08L2NvZGU+LgotWW91IGNhbiBhbHNvIGFjY2VzcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNpbmcgdGhlCi08YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj4gcHJvcGVydHk8L2E+IHRhc2sncwotPGNvZGU+ZW52aXJvbm1lbnQ8L2NvZGU+IGF0dHJpYnV0ZS4KLTwvcD4KKzxwPklmIHlvdSd2ZSBpbnN0YWxsZWQgQXBhY2hlIEFudCBhcyBkZXNjcmliZWQgaW4KK3RoZSA8YSBocmVmPSJpbnN0YWxsLmh0bWwiPkluc3RhbGxpbmcgQW50PC9hPiBzZWN0aW9uLCBydW5uaW5nIEFudAorZnJvbSB0aGUgY29tbWFuZC1saW5lIGlzIHNpbXBsZToganVzdCB0eXBlIDxrYmQ+YW50PC9rYmQ+LjwvcD4KIAotPHA+T3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYW1vdW50IG9mIGxvZ2dpbmcgb3V0cHV0IGJ5IEFudCBhcmU6Ci08bm9icj48Y29kZT4tcXVpZXQ8L2NvZGU+PC9ub2JyPiwKLXdoaWNoIGluc3RydWN0cyBBbnQgdG8gcHJpbnQgbGVzcwotaW5mb3JtYXRpb24gdG8gdGhlIGNvbnNvbGU7Ci08bm9icj48Y29kZT4tdmVyYm9zZTwvY29kZT48L25vYnI+LCB3aGljaCBjYXVzZXMgQW50IHRvIHByaW50Ci1hZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIHRoZSBjb25zb2xlOyA8bm9icj48Y29kZT4tZGVidWc8L2NvZGU+PC9ub2JyPiwKLXdoaWNoIGNhdXNlcyBBbnQgdG8gcHJpbnQgY29uc2lkZXJhYmx5IG1vcmUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjsgYW5kCi08bm9icj48Y29kZT4tc2lsZW50PC9jb2RlPjwvbm9icj4gd2hpY2ggbWFrZXMgQW50IHByaW50IG5vdGhpbmcgYnV0IHRhc2sKLW91dHB1dCBhbmQgYnVpbGQgZmFpbHVyZXMgKHVzZWZ1bCB0byBjYXB0dXJlIEFudCBvdXRwdXQgYnkgc2NyaXB0cykuCi08L3A+Cis8cD5XaGVuIG5vIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkLCBBbnQgbG9va3MgZm9yCithIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kLCBpZiBmb3VuZCwKK3VzZXMgdGhhdCBmaWxlIGFzIHRoZSBidWlsZCBmaWxlIGFuZCBydW5zIHRoZSB0YXJnZXQgc3BlY2lmaWVkIGluCit0aGUgPHZhcj5kZWZhdWx0PC92YXI+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPgordGFnLiAgVG8gbWFrZSBBbnQgdXNlIGEgYnVpbGQgZmlsZSBvdGhlciB0aGFuIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4sCit1c2UgdGhlIGNvbW1hbmQtbGluZSBvcHRpb24gPGtiZD4tYnVpbGRmaWxlIDxpPmZpbGU8L2k+PC9rYmQ+LAord2hlcmUgPGNvZGU+PGk+ZmlsZTwvaT48L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBmaWxlIHlvdSB3YW50IHRvIHVzZSAob3IKK2EgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSA8c2FtcD5idWlsZC54bWw8L3NhbXA+IGZpbGUpLjwvcD4KIAotPHA+SXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhcmdldHMgdGhhdCBzaG91bGQgYmUgZXhlY3V0ZWQuCi1XaGVuIG9taXR0ZWQsIHRoZSB0YXJnZXQgdGhhdCBpcyBzcGVjaWZpZWQgaW4gdGhlCi08Y29kZT5kZWZhdWx0PC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlCi08YSBocmVmPSJ1c2luZy5odG1sI3Byb2plY3RzIj48Y29kZT5wcm9qZWN0PC9jb2RlPjwvYT4gdGFnIGlzCis8cD5JZiB5b3UgdXNlIHRoZSA8a2JkPi1maW5kIFs8aT5maWxlPC9pPl08L2tiZD4gb3B0aW9uLCBBbnQgd2lsbAorc2VhcmNoIGZvciBhIGJ1aWxkIGZpbGUgZmlyc3QgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIGluIHRoZQorcGFyZW50IGRpcmVjdG9yeSwgYW5kIHNvIG9uLCB1bnRpbCBlaXRoZXIgYSBidWlsZCBmaWxlIGlzIGZvdW5kIG9yIHRoZQorcm9vdCBvZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiByZWFjaGVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGxvb2sgZm9yCithIGJ1aWxkIGZpbGUgY2FsbGVkIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4uIFRvIGhhdmUgaXQgc2VhcmNoIGZvciBhCitidWlsZCBmaWxlIG90aGVyIHRoYW4gPHNhbXA+YnVpbGQueG1sPC9zYW1wPiwgc3BlY2lmeSBhIGZpbGUKK2FyZ3VtZW50LiA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBpbmNsdWRlIGFueSBvdGhlciBmbGFncyBvcgorYXJndW1lbnRzIG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIgdGhlIDxrYmQ+LWZpbmQ8L2tiZD4gZmxhZywgeW91CittdXN0IGluY2x1ZGUgdGhlIGZpbGUgYXJndW1lbnQgZm9yIHRoZSA8a2JkPi1maW5kPC9rYmQ+IGZsYWcsIGV2ZW4KK2lmIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBmaWxlIHlvdSB3YW50IHRvIGZpbmQKK2lzIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4uPC9wPgorCis8cD5Zb3UgY2FuIGFsc28gc2V0IDxhIGhyZWY9InVzaW5nLmh0bWwjcHJvcGVydGllcyI+cHJvcGVydGllczwvYT4gb24KK3RoZSBjb21tYW5kIGxpbmUuICBUaGlzIGNhbiBiZSBkb25lIHdpdGgKK3RoZSA8a2JkPi1EPGk+cHJvcGVydHk8L2k+PTxpPnZhbHVlPC9pPjwva2JkPiBvcHRpb24sCit3aGVyZSA8ZW0+cHJvcGVydHk8L2VtPiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHksCithbmQgPGVtPnZhbHVlPC9lbT4gaXMgdGhlIHZhbHVlIGZvciB0aGF0IHByb3BlcnR5LiBJZiB5b3Ugc3BlY2lmeSBhCitwcm9wZXJ0eSB0aGF0IGlzIGFsc28gc2V0IGluIHRoZSBidWlsZCBmaWxlIChzZWUKK3RoZSA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzayksIHRoZSB2YWx1ZQorc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoZQorYnVpbGQgZmlsZS4gIERlZmluaW5nIHByb3BlcnRpZXMgb24gdGhlIGNvbW1hbmQgbGluZSBjYW4gYWxzbyBiZSB1c2VkCit0byBwYXNzIGluIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXM7IGp1c3QKK3Bhc3MgPGtiZD4tRE1ZVkFSPSVNWVZBUiU8L2tiZD4gKFdpbmRvd3MpCitvciA8a2JkPi1ETVlWQVI9JE1ZVkFSPC9rYmQ+IChVbml4KSB0byBBbnQuIFlvdSBjYW4gdGhlbiBhY2Nlc3MKK3RoZXNlIHZhcmlhYmxlcyBpbnNpZGUgeW91ciBidWlsZCBmaWxlIGFzIDxjb2RlPiR7TVlWQVJ9PC9jb2RlPi4gIFlvdQorY2FuIGFsc28gYWNjZXNzIGVudmlyb25tZW50IHZhcmlhYmxlcyB1c2luZwordGhlIDxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPgordGFzaydzIDx2YXI+ZW52aXJvbm1lbnQ8L3Zhcj4gYXR0cmlidXRlLjwvcD4KKworPHA+T3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUgYW1vdW50IG9mIGxvZ2dpbmcgb3V0cHV0IGJ5IEFudAorYXJlOiA8a2JkPi1xdWlldDwva2JkPiwgd2hpY2ggaW5zdHJ1Y3RzIEFudCB0byBwcmludCBsZXNzCitpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZTsgPGtiZD4tdmVyYm9zZTwva2JkPiwgd2hpY2ggY2F1c2VzIEFudCB0bworcHJpbnQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0byB0aGUgY29uc29sZTsgPGtiZD4tZGVidWc8L2tiZD4sCit3aGljaCBjYXVzZXMgQW50IHRvIHByaW50IGNvbnNpZGVyYWJseSBtb3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb247CithbmQgPGtiZD4tc2lsZW50PC9rYmQ+IHdoaWNoIG1ha2VzIEFudCBwcmludCBub3RoaW5nIGJ1dCB0YXNrIG91dHB1dAorYW5kIGJ1aWxkIGZhaWx1cmVzICh1c2VmdWwgdG8gY2FwdHVyZSBBbnQgb3V0cHV0IGJ5IHNjcmlwdHMpLjwvcD4KKworPHA+SXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHRhcmdldHMgdGhhdCBzaG91bGQgYmUKK2V4ZWN1dGVkLiBXaGVuIG9taXR0ZWQsIHRoZSB0YXJnZXQgdGhhdCBpcyBzcGVjaWZpZWQgaW4KK3RoZSA8dmFyPmRlZmF1bHQ8L3Zhcj4gYXR0cmlidXRlIG9mCit0aGUgPGEgaHJlZj0idXNpbmcuaHRtbCNwcm9qZWN0cyI+PGNvZGU+cHJvamVjdDwvY29kZT48L2E+IHRhZyBpcwogdXNlZC48L3A+CiAKLTxwPlRoZSA8bm9icj48Y29kZT4tcHJvamVjdGhlbHA8L2NvZGU+PC9ub2JyPiBvcHRpb24gcHJpbnRzIG91dCBhIGxpc3QKLW9mIHRoZSBidWlsZCBmaWxlJ3MgdGFyZ2V0cy4gVGFyZ2V0cyB0aGF0IGluY2x1ZGUgYQotPGNvZGU+ZGVzY3JpcHRpb248L2NvZGU+IGF0dHJpYnV0ZSBhcmUgbGlzdGVkIGFzICZxdW90O01haW4gdGFyZ2V0cyZxdW90OywKLXRob3NlIHdpdGhvdXQgYSA8Y29kZT5kZXNjcmlwdGlvbjwvY29kZT4gYXJlIGxpc3RlZCBhcwotJnF1b3Q7T3RoZXIgdGFyZ2V0cyZxdW90OywgdGhlbiB0aGUgJnF1b3Q7RGVmYXVsdCZxdW90OyB0YXJnZXQgaXMgbGlzdGVkCi0oIk90aGVyIHRhcmdldHMiIGFyZSBvbmx5IGRpc3BsYXllZCBpZiB0aGVyZSBhcmUgbm8gbWFpbgotdGFyZ2V0cywgb3IgaWYgQW50IGlzIGludm9rZWQgaW4gLXZlcmJvc2Ugb3IgLWRlYnVnIG1vZGUpLgorPHA+VGhlIDxrYmQ+LXByb2plY3RoZWxwPC9rYmQ+IG9wdGlvbiBwcmludHMgb3V0IGEgbGlzdCBvZiB0aGUgYnVpbGQKK2ZpbGUncyB0YXJnZXRzLiBUYXJnZXRzIHRoYXQgaW5jbHVkZSBhIDx2YXI+ZGVzY3JpcHRpb248L3Zhcj4KK2F0dHJpYnV0ZSBhcmUgbGlzdGVkIGFzICZxdW90O01haW4gdGFyZ2V0cyZxdW90OywgdGhvc2Ugd2l0aG91dAorYSA8dmFyPmRlc2NyaXB0aW9uPC92YXI+IGFyZSBsaXN0ZWQgYXMgJnF1b3Q7T3RoZXIgdGFyZ2V0cyZxdW90OywgdGhlbgordGhlICZxdW90O0RlZmF1bHQmcXVvdDsgdGFyZ2V0IGlzIGxpc3RlZCAoIk90aGVyIHRhcmdldHMiIGFyZSBvbmx5CitkaXNwbGF5ZWQgaWYgdGhlcmUgYXJlIG5vIG1haW4gdGFyZ2V0cywgb3IgaWYgQW50IGlzIGludm9rZWQKK2luIDxrYmQ+LXZlcmJvc2U8L2tiZD4gb3IgPGtiZD4tZGVidWc8L2tiZD4gbW9kZSkuPC9wPgogCi08aDM+PGEgbmFtZT0ib3B0aW9ucyI+Q29tbWFuZC1saW5lIE9wdGlvbnMgU3VtbWFyeTwvYT48L2gzPgotPHByZT5hbnQgW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uLl1dCis8aDMgaWQ9Im9wdGlvbnMiPkNvbW1hbmQtbGluZSBPcHRpb25zIFN1bW1hcnk8L2gzPgorPHByZSBjbGFzcz0ib3V0cHV0Ij5hbnQgW29wdGlvbnNdIFt0YXJnZXQgW3RhcmdldDIgW3RhcmdldDNdIC4uLl1dCiBPcHRpb25zOgogICAtaGVscCwgLWggICAgICAgICAgICAgIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAogICAtcHJvamVjdGhlbHAsIC1wICAgICAgIHByaW50IHByb2plY3QgaGVscCBpbmZvcm1hdGlvbiBhbmQgZXhpdApAQCAtMTMxLDM2NCArMTI1LDM0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIDEgKGxvd2VzdCkgdG8gMTAgKGhpZ2hlc3QpOyA1IGlzIHRoZSBkZWZhdWx0CiAgIC1ub3VzZXJsaWIgICAgICAgICAgICAgUnVuIGFudCB3aXRob3V0IHVzaW5nIHRoZSBqYXIgZmlsZXMgZnJvbSAke3VzZXIuaG9tZX0vLmFudC9saWIKICAgLW5vY2xhc3NwYXRoICAgICAgICAgICBSdW4gYW50IHdpdGhvdXQgdXNpbmcgQ0xBU1NQQVRICi0gIC1hdXRvcHJveHkgICAgICAgICAgICAgSmF2YSAxLjUrIDogdXNlIHRoZSBPUyBwcm94aWVzCisgIC1hdXRvcHJveHkgICAgICAgICAgICAgSmF2YSA1KyA6IHVzZSB0aGUgT1MgcHJveGllcwogICAtbWFpbiAmbHQ7Y2xhc3MmZ3Q7ICAgICAgICAgIG92ZXJyaWRlIEFudCdzIG5vcm1hbCBlbnRyeSBwb2ludAogPC9wcmU+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8Y29kZT4tbG9nZ2VyPC9jb2RlPiBhbmQKLTxjb2RlPi1saXN0ZW5lcjwvY29kZT4gc2VlCi08YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCI+TG9nZ2VycyAmYW1wOyBMaXN0ZW5lcnM8L2E+LgotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgPGNvZGU+LWlucHV0aGFuZGxlcjwvY29kZT4gc2VlCi08YSBocmVmPSJpbnB1dGhhbmRsZXIuaHRtbCI+SW5wdXRIYW5kbGVyPC9hPi4KLTxwPkVhc2llc3Qgd2F5IG9mIGNoYW5naW5nIHRoZSBleGl0LWJlaGF2aW91ciBpcyBzdWJjbGFzc2luZyB0aGUgb3JpZ2luYWwgbWFpbiBjbGFzczoKKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxrYmQ+LWxvZ2dlcjwva2JkPgorYW5kIDxrYmQ+LWxpc3RlbmVyPC9rYmQ+IHNlZSA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCI+TG9nZ2VycyAmYW1wOworTGlzdGVuZXJzPC9hPi4KKzxwPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IDxrYmQ+LWlucHV0aGFuZGxlcjwva2JkPgorc2VlIDxhIGhyZWY9ImlucHV0aGFuZGxlci5odG1sIj5JbnB1dEhhbmRsZXI8L2E+LgorPHA+RWFzaWVzdCB3YXkgb2YgY2hhbmdpbmcgdGhlIGV4aXQtYmVoYXZpb3VyIGlzIHN1YmNsYXNzaW5nIHRoZQorb3JpZ2luYWwgbWFpbiBjbGFzczo8L3A+CiA8cHJlPgogcHVibGljIGNsYXNzIEN1c3RvbUV4aXRDb2RlIGV4dGVuZHMgb3JnLmFwYWNoZS50b29scy5hbnQuTWFpbiB7CiAgICAgcHJvdGVjdGVkIHZvaWQgZXhpdChpbnQgZXhpdENvZGUpIHsKICAgICAgICAgLy8gaW1wbGVtZW50IHlvdXIgb3duIGJlaGF2aW91ciwgZS5nLiBOT1QgZXhpdGluZyB0aGUgSlZNCiAgICAgfQogfQotPC9wcmU+IGFuZCBzdGFydGluZyBBbnQgd2l0aCBhY2Nlc3MgKDx0dD4tbGliIHBhdGgtdG8tY2xhc3M8L3R0PikgdG8gdGhpcyBjbGFzcy4KLTwvcD4KKzwvcHJlPgorPHA+YW5kIHN0YXJ0aW5nIEFudCB3aXRoIGFjY2VzcyAoPGtiZD4tbGliIDxpPnBhdGgtdG8tY2xhc3M8L2k+PC9rYmQ+KQordG8gdGhpcyBjbGFzcy48L3A+CiAKLTxoMz48YSBuYW1lPSJsaWJzIj5MaWJyYXJ5IERpcmVjdG9yaWVzPC9hPjwvaDM+Ci08cD4KLVByaW9yIHRvIEFudCAxLjYsIGFsbCBqYXJzIGluIHRoZSBBTlRfSE9NRS9saWIgd291bGQgYmUgYWRkZWQgdG8gdGhlIENMQVNTUEFUSAotdXNlZCB0byBydW4gQW50LiBUaGlzIHdhcyBkb25lIGluIHRoZSBzY3JpcHRzIHRoYXQgc3RhcnRlZCBBbnQuIEZyb20gQW50IDEuNiwKLXR3byBkaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCBieSBkZWZhdWx0IGFuZCBtb3JlIGNhbiBiZSBhZGRlZCBhcyByZXF1aXJlZC4gVGhlCi1kZWZhdWx0IGRpcmVjdG9yaWVzIHNjYW5uZWQgYXJlIEFOVF9IT01FL2xpYiBhbmQgYSB1c2VyIHNwZWNpZmljIGRpcmVjdG9yeSwKLSR7dXNlci5ob21lfS8uYW50L2xpYi4gVGhpcyBhcnJhbmdlbWVudCBhbGxvd3MgdGhlIEFudCBpbnN0YWxsYXRpb24gdG8gYmUKLXNoYXJlZCBieSBtYW55IHVzZXJzIHdoaWxlIHN0aWxsIGFsbG93aW5nIGVhY2ggdXNlciB0byBkZXBsb3kgYWRkaXRpb25hbCBqYXJzLgotU3VjaCBhZGRpdGlvbmFsIGphcnMgY291bGQgYmUgc3VwcG9ydCBqYXJzIGZvciBBbnQncyBvcHRpb25hbCB0YXNrcyBvciBqYXJzCi1jb250YWluaW5nIHRoaXJkLXBhcnR5IHRhc2tzIHRvIGJlIHVzZWQgaW4gdGhlIGJ1aWxkLiBJdCBhbHNvIGFsbG93cyB0aGUgbWFpbiBBbnQgaW5zdGFsbGF0aW9uIHRvIGJlIGxvY2tlZCBkb3duIHdoaWNoIHdpbGwgcGxlYXNlIHN5c3RlbSBhZG1pbmlzdHJhdG9ycy4KLTwvcD4KKzxoMyBpZD0ibGlicyI+TGlicmFyeSBEaXJlY3RvcmllczwvaDM+CiAKLTxwPgotQWRkaXRpb25hbCBkaXJlY3RvcmllcyB0byBiZSBzZWFyY2hlZCBtYXkgYmUgYWRkZWQgYnkgdXNpbmcgdGhlIC1saWIgb3B0aW9uLgotVGhlIC1saWIgb3B0aW9uIHNwZWNpZmllcyBhIHNlYXJjaCBwYXRoLiBBbnkgamFycyBvciBjbGFzc2VzIGluIHRoZSBkaXJlY3Rvcmllcwotb2YgdGhlIHBhdGggd2lsbCBiZSBhZGRlZCB0byBBbnQncyBjbGFzc2xvYWRlci4gVGhlIG9yZGVyIGluIHdoaWNoIGphcnMgYXJlCi1hZGRlZCB0byB0aGUgY2xhc3NwYXRoIGlzIGFzIGZvbGxvd3M6Ci08L3A+Cis8cD5QcmlvciB0byBBbnQgMS42LCBhbGwgamFycyBpbiB0aGUgPHNhbXA+QU5UX0hPTUUvbGliPC9zYW1wPiB3b3VsZAorYmUgYWRkZWQgdG8gdGhlIDxzYW1wPkNMQVNTUEFUSDwvc2FtcD4gdXNlZCB0byBydW4gQW50LiBUaGlzIHdhcyBkb25lCitpbiB0aGUgc2NyaXB0cyB0aGF0IHN0YXJ0ZWQgQW50LiA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LCB0d28KK2RpcmVjdG9yaWVzIGFyZSBzY2FubmVkIGJ5IGRlZmF1bHQgYW5kIG1vcmUgY2FuIGJlIGFkZGVkIGFzCityZXF1aXJlZC4gVGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMgc2Nhbm5lZAorYXJlIDxzYW1wPkFOVF9IT01FL2xpYjwvc2FtcD4gYW5kIGEgdXNlciBzcGVjaWZpYworZGlyZWN0b3J5LCA8c2FtcD4ke3VzZXIuaG9tZX0vLmFudC9saWI8L3NhbXA+LiBUaGlzIGFycmFuZ2VtZW50IGFsbG93cwordGhlIEFudCBpbnN0YWxsYXRpb24gdG8gYmUgc2hhcmVkIGJ5IG1hbnkgdXNlcnMgd2hpbGUgc3RpbGwgYWxsb3dpbmcKK2VhY2ggdXNlciB0byBkZXBsb3kgYWRkaXRpb25hbCBqYXJzLiAgU3VjaCBhZGRpdGlvbmFsIGphcnMgY291bGQgYmUKK3N1cHBvcnQgamFycyBmb3IgQW50J3Mgb3B0aW9uYWwgdGFza3Mgb3IgamFycyBjb250YWluaW5nIHRoaXJkLXBhcnR5Cit0YXNrcyB0byBiZSB1c2VkIGluIHRoZSBidWlsZC4gSXQgYWxzbyBhbGxvd3MgdGhlIG1haW4gQW50CitpbnN0YWxsYXRpb24gdG8gYmUgbG9ja2VkIGRvd24gd2hpY2ggd2lsbCBwbGVhc2Ugc3lzdGVtCithZG1pbmlzdHJhdG9ycy48L3A+CisKKzxwPkFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdG8gYmUgc2VhcmNoZWQgbWF5IGJlIGFkZGVkIGJ5IHVzaW5nCit0aGUgPGtiZD4tbGliPC9rYmQ+IG9wdGlvbi4gIFRoZSA8a2JkPi1saWI8L2tiZD4gb3B0aW9uIHNwZWNpZmllcworYSBzZWFyY2ggcGF0aC4gQW55IGphcnMgb3IgY2xhc3NlcyBpbiB0aGUgZGlyZWN0b3JpZXMgb2YgdGhlIHBhdGggd2lsbAorYmUgYWRkZWQgdG8gQW50J3MgY2xhc3Nsb2FkZXIuIFRoZSBvcmRlciBpbiB3aGljaCBqYXJzIGFyZSBhZGRlZCB0bwordGhlIGNsYXNzcGF0aCBpcyBhcyBmb2xsb3dzOjwvcD4KIAogPHVsPgotICA8bGk+LWxpYiBqYXJzIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIC1saWIgZWxlbWVudHMgb24gdGhlIGNvbW1hbmQgbGluZTwvbGk+Ci0gIDxsaT5qYXJzIGZyb20gJHt1c2VyLmhvbWV9Ly5hbnQvbGliICh1bmxlc3MgLW5vdXNlcmxpYiBpcyBzZXQpPC9saT4KLSAgPGxpPmphcnMgZnJvbSBBTlRfSE9NRS9saWI8L2xpPgorICA8bGk+amFycyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSA8a2JkPi1saWI8L2tiZD4gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lPC9saT4KKyAgPGxpPmphcnMgZnJvbSA8c2FtcD4ke3VzZXIuaG9tZX0vLmFudC9saWI8L3NhbXA+ICh1bmxlc3MgPGtiZD4tbm91c2VybGliPC9rYmQ+IGlzIHNldCk8L2xpPgorICA8bGk+amFycyBmcm9tIDxzYW1wPkFOVF9IT01FL2xpYjwvc2FtcD48L2xpPgogPC91bD4KIAotPHA+Ci1Ob3RlIHRoYXQgdGhlIENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBwYXNzZWQgdG8gQW50IHVzaW5nIGEgLWxpYgotb3B0aW9uLiBBbnQgaXRzZWxmIGlzIHN0YXJ0ZWQgd2l0aCBhIHZlcnkgbWluaW1hbGlzdGljIGNsYXNzcGF0aC4KLUFudCBzaG91bGQgd29yayBwZXJmZWN0bHkgd2VsbCB3aXRoIGFuIGVtcHR5IENMQVNTUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSwKLXNvbWV0aGluZyB0aGUgdGhlIC1ub2NsYXNzcGF0aCBvcHRpb24gYWN0dWFsbHkgZW5mb3JjZXMuIFdlIGdldCBtYW55IG1vcmUgc3VwcG9ydCBjYWxscyByZWxhdGVkIHRvIGNsYXNzcGF0aCBwcm9ibGVtcyAoZXNwZWNpYWxseSBxdW90aW5nIHByb2JsZW1zKSB0aGFuCi13ZSBsaWtlLgorPHA+Tm90ZSB0aGF0IHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHBhc3NlZAordG8gQW50IHVzaW5nIGEgPGtiZD4tbGliPC9rYmQ+IG9wdGlvbi4gQW50IGl0c2VsZiBpcyBzdGFydGVkIHdpdGggYQordmVyeSBtaW5pbWFsaXN0aWMgY2xhc3NwYXRoLiAgQW50IHNob3VsZCB3b3JrIHBlcmZlY3RseSB3ZWxsIHdpdGggYW4KK2VtcHR5IDxjb2RlPkNMQVNTUEFUSDwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvbWV0aGluZyB0aGUKK3RoZSA8a2JkPi1ub2NsYXNzcGF0aDwva2JkPiBvcHRpb24gYWN0dWFsbHkgZW5mb3JjZXMuIFdlIGdldCBtYW55IG1vcmUKK3N1cHBvcnQgY2FsbHMgcmVsYXRlZCB0byBjbGFzc3BhdGggcHJvYmxlbXMgKGVzcGVjaWFsbHkgcXVvdGluZworcHJvYmxlbXMpIHRoYW4gd2UgbGlrZS48L3A+CiAKLTwvcD4KLQotPHA+Ci1UaGUgbG9jYXRpb24gb2YgJHt1c2VyLmhvbWV9Ly5hbnQvbGliIGlzIHNvbWV3aGF0IGRlcGVuZGVudCBvbiB0aGUgSlZNLiBPbiBVbml4Ci1zeXN0ZW1zICR7dXNlci5ob21lfSBtYXBzIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgd2hpbHN0IG9uIHJlY2VudAotdmVyc2lvbnMgb2YgV2luZG93cyBpdCB3aWxsIGJlIHNvbWV3aGVyZSBzdWNoIGFzCi1DOlxEb2N1bWVudHMmbmJzcDthbmQmbmJzcDtTZXR0aW5nc1x1c2VybmFtZVwuYW50XGxpYi4gWW91IHNob3VsZCBjb25zdWx0IHlvdXIKLUpWTSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCi08L3A+Cis8cD5UaGUgbG9jYXRpb24gb2YgPHNhbXA+JHt1c2VyLmhvbWV9Ly5hbnQvbGliPC9zYW1wPiBpcyBzb21ld2hhdAorZGVwZW5kZW50IG9uIHRoZSBKVk0uIE9uIFVuaXggc3lzdGVtcyA8c2FtcD4ke3VzZXIuaG9tZX08L3NhbXA+IG1hcHMKK3RvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3Rvcnkgd2hpbHN0IG9uIHJlY2VudCB2ZXJzaW9ucyBvZiBXaW5kb3dzIGl0Cit3aWxsIGJlIHNvbWV3aGVyZSBzdWNoCithcyA8Y29kZT5DOlxVc2Vyc1w8aT51c2VybmFtZTwvaT5cLmFudFxsaWI8L2NvZGU+LiBZb3Ugc2hvdWxkIGNvbnN1bHQKK3lvdXIgSlZNIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy48L3A+CiAKIDxoMz5FeGFtcGxlczwvaDM+Ci08YmxvY2txdW90ZT4KLSAgPHByZT5hbnQ8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8Y29kZT5idWlsZC54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbgotdGhlIGRlZmF1bHQgdGFyZ2V0LjwvcD4KIAotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+YW50IC1idWlsZGZpbGUgdGVzdC54bWw8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8Y29kZT50ZXN0LnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG9uCi10aGUgZGVmYXVsdCB0YXJnZXQuPC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmFudDwvcHJlPgorPHA+cnVucyBBbnQgdXNpbmcgdGhlIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gZmlsZSBpbiB0aGUgY3VycmVudAorZGlyZWN0b3J5LCBvbiB0aGUgZGVmYXVsdCB0YXJnZXQuPC9wPgogCi08YmxvY2txdW90ZT4KLSAgPHByZT5hbnQgLWJ1aWxkZmlsZSB0ZXN0LnhtbCBkaXN0PC9wcmU+Ci08L2Jsb2NrcXVvdGU+Ci08cD5ydW5zIEFudCB1c2luZyB0aGUgPGNvZGU+dGVzdC54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBvbgotdGhlIHRhcmdldCBjYWxsZWQgPGNvZGU+ZGlzdDwvY29kZT4uPC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmFudCAtYnVpbGRmaWxlIHRlc3QueG1sPC9wcmU+Cis8cD5ydW5zIEFudCB1c2luZyB0aGUgPHNhbXA+dGVzdC54bWw8L3NhbXA+IGZpbGUgaW4gdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSwgb24gdGhlIGRlZmF1bHQgdGFyZ2V0LjwvcD4KIAotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+YW50IC1idWlsZGZpbGUgdGVzdC54bWwgLURidWlsZD1idWlsZC9jbGFzc2VzIGRpc3Q8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8Y29kZT50ZXN0LnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG9uCi10aGUgdGFyZ2V0IGNhbGxlZCA8Y29kZT5kaXN0PC9jb2RlPiwgc2V0dGluZyB0aGUgPGNvZGU+YnVpbGQ8L2NvZGU+IHByb3BlcnR5Ci10byB0aGUgdmFsdWUgPGNvZGU+YnVpbGQvY2xhc3NlczwvY29kZT4uPC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmFudCAtYnVpbGRmaWxlIHRlc3QueG1sIGRpc3Q8L3ByZT4KKzxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8c2FtcD50ZXN0LnhtbDwvc2FtcD4gZmlsZSBpbiB0aGUgY3VycmVudAorZGlyZWN0b3J5LCBvbiB0aGUgdGFyZ2V0IGNhbGxlZCA8c2FtcD5kaXN0PC9zYW1wPi48L3A+CiAKLTxibG9ja3F1b3RlPgotICA8cHJlPmFudCAtbGliIC9ob21lL2FudC9leHRyYXM8L3ByZT4KLTwvYmxvY2txdW90ZT4KLTxwPnJ1bnMgQW50IHBpY2tpbmcgdXAgYWRkaXRpb25hbCB0YXNrIGFuZCBzdXBwb3J0IGphcnMgZnJvbSB0aGUKLS9ob21lL2FudC9leHRyYXMgbG9jYXRpb248L3A+Cis8cHJlIGNsYXNzPSJpbnB1dCI+YW50IC1idWlsZGZpbGUgdGVzdC54bWwgLURidWlsZD1idWlsZC9jbGFzc2VzIGRpc3Q8L3ByZT4KKzxwPnJ1bnMgQW50IHVzaW5nIHRoZSA8c2FtcD50ZXN0LnhtbDwvc2FtcD4gZmlsZSBpbiB0aGUgY3VycmVudAorZGlyZWN0b3J5LCBvbiB0aGUgdGFyZ2V0IGNhbGxlZCA8c2FtcD5kaXN0PC9zYW1wPiwgc2V0dGluZwordGhlIDxjb2RlPmJ1aWxkPC9jb2RlPiBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgPHE+YnVpbGQvY2xhc3NlczwvcT4uPC9wPgogCi08YmxvY2txdW90ZT4KLSAgPHByZT5hbnQgLWxpYiBvbmUuamFyO2Fub3RoZXIuamFyPC9wcmU+Ci0gIDxwcmU+YW50IC1saWIgb25lLmphciAtbGliIGFub3RoZXIuamFyPC9wcmU+Ci08L2Jsb2NrcXVvdGU+Cis8cHJlIGNsYXNzPSJpbnB1dCI+YW50IC1saWIgL2hvbWUvYW50L2V4dHJhczwvcHJlPgorPHA+cnVucyBBbnQgcGlja2luZyB1cCBhZGRpdGlvbmFsIHRhc2sgYW5kIHN1cHBvcnQgamFycyBmcm9tCit0aGUgPHNhbXA+L2hvbWUvYW50L2V4dHJhczwvc2FtcD4gbG9jYXRpb248L3A+CisKKzxwcmUgY2xhc3M9ImlucHV0Ij5hbnQgLWxpYiBvbmUuamFyO2Fub3RoZXIuamFyPC9wcmU+Cis8cHJlIGNsYXNzPSJpbnB1dCI+YW50IC1saWIgb25lLmphciAtbGliIGFub3RoZXIuamFyPC9wcmU+CiA8cD5hZGRzIHR3byBqYXJzIHRvIEFudHMgY2xhc3NwYXRoLjwvcD4KIAotCi0KLTxoMz48YSBuYW1lPSJmaWxlcyI+RmlsZXM8L2E+PC9oMz4KKzxoMyBpZD0iZmlsZXMiPkZpbGVzPC9oMz4KIAogPHA+VGhlIEFudCB3cmFwcGVyIHNjcmlwdCBmb3IgVW5peCB3aWxsIHNvdXJjZSAocmVhZCBhbmQgZXZhbHVhdGUpIHRoZQotZmlsZSA8Y29kZT5+Ly5hbnRyYzwvY29kZT4gYmVmb3JlIGl0IGRvZXMgYW55dGhpbmcuIE9uIFdpbmRvd3MsIHRoZSBBbnQKLXdyYXBwZXIgYmF0Y2gtZmlsZSBpbnZva2VzIDxjb2RlPiVIT01FJVxhbnRyY19wcmUuYmF0PC9jb2RlPiBhdCB0aGUgc3RhcnQgYW5kCi08Y29kZT4lSE9NRSVcYW50cmNfcG9zdC5iYXQ8L2NvZGU+IGF0IHRoZSBlbmQuICBZb3UgY2FuIHVzZSB0aGVzZQotZmlsZXMsIGZvciBleGFtcGxlLCB0byBzZXQvdW5zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgc2hvdWxkIG9ubHkgYmUKLXZpc2libGUgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgQW50LiAgU2VlIHRoZSBuZXh0IHNlY3Rpb24gZm9yIGV4YW1wbGVzLjwvcD4KK2ZpbGUgPHNhbXA+fi8uYW50cmM8L3NhbXA+IGJlZm9yZSBpdCBkb2VzIGFueXRoaW5nLiBPbiBXaW5kb3dzLCB0aGUKK0FudCB3cmFwcGVyIGJhdGNoLWZpbGUgaW52b2tlcyA8c2FtcD4lSE9NRSVcYW50cmNfcHJlLmJhdDwvc2FtcD4gYXQKK3RoZSBzdGFydCBhbmQgPHNhbXA+JUhPTUUlXGFudHJjX3Bvc3QuYmF0PC9zYW1wPiBhdCB0aGUgZW5kLiAgWW91IGNhbgordXNlIHRoZXNlIGZpbGVzLCBmb3IgZXhhbXBsZSwgdG8gc2V0L3Vuc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0CitzaG91bGQgb25seSBiZSB2aXNpYmxlIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mIEFudC4gIFNlZSB0aGUgbmV4dAorc2VjdGlvbiBmb3IgZXhhbXBsZXMuPC9wPgogCi08aDM+PGEgbmFtZT0iZW52dmFycyI+RW52aXJvbm1lbnQgVmFyaWFibGVzPC9hPjwvaDM+Cis8aDMgaWQ9ImVudnZhcnMiPkVudmlyb25tZW50IFZhcmlhYmxlczwvaDM+CiAKLTxwPlRoZSB3cmFwcGVyIHNjcmlwdHMgdXNlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpZgotc2V0KTo8L3A+Cis8cD5UaGUgd3JhcHBlciBzY3JpcHRzIHVzZSB0aGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyAoaWYgc2V0KTo8L3A+CiAKIDx1bD4KLSAgPGxpPjxjb2RlPkpBVkFDTUQ8L2NvZGU+IC0gZnVsbCBwYXRoIG9mIHRoZSBKYXZhIGV4ZWN1dGFibGUuICBVc2UgdGhpcwotICB0byBpbnZva2UgYSBkaWZmZXJlbnQgSlZNIHRoYW4gPGNvZGU+SkFWQV9IT01FL2Jpbi9qYXZhKC5leGUpPC9jb2RlPi48L2xpPgorICA8bGk+PGNvZGU+SkFWQUNNRDwvY29kZT4mbWRhc2g7ZnVsbCBwYXRoIG9mIHRoZSBKYXZhIGV4ZWN1dGFibGUuICBVc2UgdGhpcworICB0byBpbnZva2UgYSBkaWZmZXJlbnQgSlZNIHRoYW4gPHNhbXA+SkFWQV9IT01FL2Jpbi9qYXZhKC5leGUpPC9zYW1wPi48L2xpPgogCi0gIDxsaT48Y29kZT5BTlRfT1BUUzwvY29kZT4gLSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlCisgIDxsaT48Y29kZT5BTlRfT1BUUzwvY29kZT4mbWRhc2g7Y29tbWFuZC1saW5lIGFyZ3VtZW50cyB0aGF0IHNob3VsZCBiZQogICBwYXNzZWQgdG8gdGhlIEpWTS4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGVmaW5lIHN5c3RlbSBwcm9wZXJ0aWVzIG9yIHNldAogICB0aGUgbWF4aW11bSBKYXZhIGhlYXAgc2l6ZSBoZXJlLjwvbGk+CiAKLSAgPGxpPjxjb2RlPkFOVF9BUkdTPC9jb2RlPiAtIEFudCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiBGb3IgZXhhbXBsZSwKKyAgPGxpPjxjb2RlPkFOVF9BUkdTPC9jb2RlPiZtZGFzaDtBbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUsCiAgIHNldCA8Y29kZT5BTlRfQVJHUzwvY29kZT4gdG8gcG9pbnQgdG8gYSBkaWZmZXJlbnQgbG9nZ2VyLCBpbmNsdWRlIGEKLSAgbGlzdGVuZXIsIGFuZCB0byBpbmNsdWRlIHRoZSA8Y29kZT4tZmluZDwvY29kZT4gZmxhZy48L2xpPgotICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IElmIHlvdSBpbmNsdWRlIDxjb2RlPi1maW5kPC9jb2RlPgorICBsaXN0ZW5lciwgYW5kIHRvIGluY2x1ZGUgdGhlIDxrYmQ+LWZpbmQ8L2tiZD4gZmxhZy48YnIvPgorICA8c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSBpbmNsdWRlIDxrYmQ+LWZpbmQ8L2tiZD4KICAgaW4gPGNvZGU+QU5UX0FSR1M8L2NvZGU+LCB5b3Ugc2hvdWxkIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIGZpbGUKLSAgdG8gZmluZCwgZXZlbiBpZiB0aGUgZmlsZSBpcyBjYWxsZWQgPGNvZGU+YnVpbGQueG1sPC9jb2RlPi4KKyAgdG8gZmluZCwgZXZlbiBpZiB0aGUgZmlsZSBpcyBjYWxsZWQgPHNhbXA+YnVpbGQueG1sPC9zYW1wPi48L2xpPgogPC91bD4KIAotPGgzPjxhIG5hbWU9InN5c3Byb3BzIj5KYXZhIFN5c3RlbSBQcm9wZXJ0aWVzPC9hPjwvaDM+Cis8aDMgaWQ9InN5c3Byb3BzIj5KYXZhIFN5c3RlbSBQcm9wZXJ0aWVzPC9oMz4KIDxwPlNvbWUgb2YgQW50J3MgY29yZSBjbGFzc2VzIGNhbiBiZSBjb25maWd1cmVkIHZpYSBzeXN0ZW0gcHJvcGVydGllcy48L3A+Ci08cD5IZXJlIGlzIHRoZSByZXN1bHQgb2YgYSBzZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJhc2UuIEJlY2F1c2Ugc3lzdGVtIHByb3BlcnRpZXMgYXJlCi1hdmFpbGFibGUgdmlhIFByb2plY3QgaW5zdGFuY2UsIEkgc2VhcmNoZWQgZm9yIHRoZW0gd2l0aCBhCi08cHJlPgotICAgIGdyZXAgLXIgLW4gImdldFByb3BlcnQiICogJmd0OyAuLlxncmVwLnR4dAotPC9wcmU+Ci1jb21tYW5kLiBBZnRlciB0aGF0IEkgZmlsdGVyZWQgb3V0IHRoZSBvZnRlbi11c2VkIGJ1dCBub3Qtc28taW1wb3J0YW50IHZhbHVlcyAobW9zdCBvZiB0aGVtCi1yZWFkLW9ubHkgdmFsdWVzKTogPGk+cGF0aC5zZXBhcmF0b3IsIGFudC5ob21lLCBiYXNlZGlyLCB1c2VyLmRpciwgb3MubmFtZSwKLWxpbmUuc2VwYXJhdG9yLCBqYXZhLmhvbWUsIGphdmEudmVyc2lvbiwgamF2YS52ZXJzaW9uLCB1c2VyLmhvbWUsIGphdmEuY2xhc3MucGF0aDwvaT48YnI+Ci1BbmQgSSBmaWx0ZXJlZCBvdXQgdGhlIDxpPmdldFByb3BlcnR5SGVscGVyPC9pPiBhY2Nlc3MuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSI+Cis8cD5IZXJlIGlzIHRoZSByZXN1bHQgb2YgYSBzZWFyY2ggdGhyb3VnaCB0aGUgY29kZWJhc2UuIEJlY2F1c2Ugc3lzdGVtCitwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUgdmlhIFByb2plY3QgaW5zdGFuY2UsIEkgc2VhcmNoZWQgZm9yIHRoZW0gd2l0aCBhPC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPmdyZXAgLXIgLW4gImdldFByb3BlcnQiICogJmd0OyAuLlxncmVwLnR4dDwvcHJlPgorPHA+Y29tbWFuZC4gQWZ0ZXIgdGhhdCBJIGZpbHRlcmVkIG91dCB0aGUgb2Z0ZW4tdXNlZCBidXQKK25vdC1zby1pbXBvcnRhbnQgdmFsdWVzIChtb3N0IG9mIHRoZW0gcmVhZC1vbmx5Cit2YWx1ZXMpOiA8Y29kZT5wYXRoLnNlcGFyYXRvcjwvY29kZT4sIDxjb2RlPmFudC5ob21lPC9jb2RlPiwgPGNvZGU+YmFzZWRpcjwvY29kZT4sCis8Y29kZT51c2VyLmRpcjwvY29kZT4sIDxjb2RlPm9zLm5hbWU8L2NvZGU+LCA8Y29kZT5saW5lLnNlcGFyYXRvcjwvY29kZT4sCis8Y29kZT5qYXZhLmhvbWU8L2NvZGU+LCA8Y29kZT5qYXZhLnZlcnNpb248L2NvZGU+LCA8Y29kZT5qYXZhLnZlcnNpb248L2NvZGU+LAorPGNvZGU+dXNlci5ob21lPC9jb2RlPiwgPGNvZGU+amF2YS5jbGFzcy5wYXRoPC9jb2RlPjxici8+CitBbmQgSSBmaWx0ZXJlZCBvdXQgdGhlIDxjb2RlPmdldFByb3BlcnR5SGVscGVyPC9jb2RlPiBhY2Nlc3MuPC9wPgorCis8dGFibGU+CiA8dHI+Ci0gIDx0aD5wcm9wZXJ0eSBuYW1lPC90aD4KLSAgPHRoPnZhbGlkIHZhbHVlcyAvZGVmYXVsdCB2YWx1ZTwvdGg+Ci0gIDx0aD5kZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5wcm9wZXJ0eSBuYW1lPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPnZhbGlkIHZhbHVlcy9kZWZhdWx0IHZhbHVlPC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPmRlc2NyaXB0aW9uPC90aD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5hbnQuYnVpbGQuamF2YWMuc291cmNlPC9jb2RlPjwvdGQ+CiAgIDx0ZD5Tb3VyY2UtbGV2ZWwgdmVyc2lvbiBudW1iZXI8L3RkPgotICA8dGQ+RGVmYXVsdCA8ZW0+c291cmNlPC9lbT4gdmFsdWUgZm9yICZsdDtqYXZhYyZndDsvJmx0O2phdmFkb2MmZ3Q7PC90ZD4KKyAgPHRkPkRlZmF1bHQgPHZhcj5zb3VyY2U8L3Zhcj4gdmFsdWUKKyAgZm9yIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+Lzxjb2RlPiZsdDtqYXZhZG9jJmd0OzwvY29kZT48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5idWlsZC5qYXZhYy50YXJnZXQ8L2NvZGU+PC90ZD4KICAgPHRkPkNsYXNzLWNvbXBhdGliaWxpdHkgdmVyc2lvbiBudW1iZXI8L3RkPgotICA8dGQ+RGVmYXVsdCA8ZW0+dGFyZ2V0PC9lbT4gdmFsdWUgZm9yICZsdDtqYXZhYyZndDs8L3RkPgorICA8dGQ+RGVmYXVsdCA8dmFyPnRhcmdldDwvdmFyPiB2YWx1ZSBmb3IgPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5leGVjdXRvci5jbGFzczwvY29kZT48L3RkPgotICA8dGQ+Y2xhc3NuYW1lOyBkZWZhdWx0IGlzIG9yZy4gYXBhY2hlLiB0b29scy4gYW50LiBoZWxwZXIuIERlZmF1bHRFeGVjdXRvcjwvdGQ+Ci0gIDx0ZD48Yj5TaW5jZSBBbnQgMS42LjM8L2I+IEFudCB3aWxsIGRlbGVnYXRlIFRhcmdldCBpbnZvY2F0aW9uIHRvIHRoZQotb3JnLmFwYWNoZS50b29scy5hbnQuRXhlY3V0b3IgaW1wbGVtZW50YXRpb24gc3BlY2lmaWVkIGhlcmUuCi0gIDwvdGQ+CisgIDx0ZD5jbGFzc25hbWU7IGRlZmF1bHQgaXMgPHE+b3JnLjx3YnI+YXBhY2hlLjx3YnI+dG9vbHMuPHdicj5hbnQuPHdicj5oZWxwZXIuPHdicj5EZWZhdWx0RXhlY3V0b3I8L3E+PC90ZD4KKyAgPHRkPjxlbT5TaW5jZSBBbnQgMS42LjM8L2VtPiBBbnQgd2lsbCBkZWxlZ2F0ZSBUYXJnZXQgaW52b2NhdGlvbiB0bworICB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LkV4ZWN1dG9yPC9jb2RlPgorICBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpZWQgaGVyZS48L3RkPgogPC90cj4KLQotPHRyPgorICA8dHI+CiAgIDx0ZD48Y29kZT5hbnQuZmlsZTwvY29kZT48L3RkPgogICA8dGQ+cmVhZCBvbmx5OiBmdWxsIGZpbGVuYW1lIG9mIHRoZSBidWlsZCBmaWxlPC90ZD4KLSAgPHRkPlRoaXMgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBmaWxlLiBJbgotICA8YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+Ci0gICZsdDtpbXBvcnQmZ3Q7LWVkPC9hPiBmaWxlcywgdGhpcyBpcyBzZXQgdG8gdGhlIGNvbnRhaW5pbmcgYnVpbGQgZmlsZS4KLSAgPC90ZD4KKyAgPHRkPlRoaXMgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBidWlsZAorICBmaWxlLiBJbiA8YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+Jmx0O2ltcG9ydCZndDstZWQ8L2E+IGZpbGVzLAorICB0aGlzIGlzIHNldCB0byB0aGUgY29udGFpbmluZyBidWlsZCBmaWxlLjwvdGQ+CiA8L3RyPgotCi08dHI+CisgIDx0cj4KICAgPHRkPjxjb2RlPmFudC5maWxlLio8L2NvZGU+PC90ZD4KLSAgPHRkPnJlYWQgb25seTogZnVsbCBmaWxlbmFtZSBvZiB0aGUgYnVpbGQgZmlsZSBvZiBBbnQgcHJvamVjdHMKLSAgPC90ZD4KLSAgPHRkPlRoaXMgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIGEgZmlsZSBieSBwcm9qZWN0OwotICB0aGlzIGxldHMgeW91IGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgPGEgaHJlZj0iVGFza3MvaW1wb3J0Lmh0bWwiPgotICAmbHQ7aW1wb3J0Jmd0Oy1lZDwvYT4gZmlsZXMsCi0gIDwvdGQ+CisgIDx0ZD5yZWFkIG9ubHk6IGZ1bGwgZmlsZW5hbWUgb2YgdGhlIGJ1aWxkIGZpbGUgb2YgQW50IHByb2plY3RzPC90ZD4KKyAgPHRkPlRoaXMgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIGEgZmlsZSBieSBwcm9qZWN0OyB0aGlzIGxldHMgeW91CisgIGRldGVybWluZSB0aGUgbG9jYXRpb24KKyAgb2YgPGEgaHJlZj0iVGFza3MvaW1wb3J0Lmh0bWwiPiZsdDtpbXBvcnQmZ3Q7LWVkPC9hPiBmaWxlcy48L3RkPgogPC90cj4KLQotPHRyPgorICA8dHI+CiAgIDx0ZD48Y29kZT5hbnQuaW5wdXQucHJvcGVydGllczwvY29kZT48L3RkPgogICA8dGQ+ZmlsZW5hbWUgKHJlcXVpcmVkKTwvdGQ+Ci0gIDx0ZD5OYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIHZhbHVlcyBmb3IgdGhlCi0gICAgICA8YSBocmVmPSJpbnB1dGhhbmRsZXIuaHRtbCI+UHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyPC9hPi4KLSAgPC90ZD4KKyAgPHRkPk5hbWUgb2YgdGhlIGZpbGUgaG9sZGluZyB0aGUgdmFsdWVzIGZvcgorICB0aGUgPGEgaHJlZj0iaW5wdXRoYW5kbGVyLmh0bWwiPlByb3BlcnR5RmlsZUlucHV0SGFuZGxlcjwvYT4uPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5hbnQubG9nZ2VyLmRlZmF1bHRzPC9jb2RlPjwvdGQ+Ci0gIDwhLS0gYWRkIHRoZSBibGFuayBhZnRlciB0aGUgc2xhc2gsIHNvIHRoZSBicm93c2VyIGNhbiBkbyBhIGxpbmUgYnJlYWsgLS0+Ci0gIDx0ZD5maWxlbmFtZSAob3B0aW9uYWwsIGRlZmF1bHQgJy9vcmcvIGFwYWNoZS8gdG9vbHMvIGFudC8gbGlzdGVuZXIvIGRlZmF1bHRzLnByb3BlcnRpZXMnKTwvdGQ+Ci0gIDx0ZD5OYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIGNvbG9yIG1hcHBpbmdzIGZvciB0aGUKLSAgICAgIDxhIGhyZWY9Imxpc3RlbmVycy5odG1sI0Fuc2lDb2xvckxvZ2dlciI+QW5zaUNvbG9yTG9nZ2VyPC9hPi4KLSAgPC90ZD4KKyAgPHRkPmZpbGVuYW1lIChvcHRpb25hbCwgZGVmYXVsdCA8cT4vb3JnLzx3YnI+YXBhY2hlLzx3YnI+dG9vbHMvPHdicj5hbnQvPHdicj5saXN0ZW5lci88d2JyPmRlZmF1bHRzLnByb3BlcnRpZXM8L3E+KTwvdGQ+CisgIDx0ZD5OYW1lIG9mIHRoZSBmaWxlIGhvbGRpbmcgdGhlIGNvbG9yIG1hcHBpbmdzIGZvcgorICB0aGUgPGEgaHJlZj0ibGlzdGVuZXJzLmh0bWwjQW5zaUNvbG9yTG9nZ2VyIj5BbnNpQ29sb3JMb2dnZXI8L2E+LjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+YW50Lm5ldHJleHhjLio8L2NvZGU+PC90ZD4KICAgPHRkPnNldmVyYWwgZm9ybWF0czwvdGQ+Ci0gIDx0ZD5Vc2Ugc3BlY2lmaWVkIHZhbHVlcyBhcyBkZWZhdWx0cyBmb3IgPGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+bmV0cmV4eGM8L2E+LgotICA8L3RkPgorICA8dGQ+VXNlIHNwZWNpZmllZCB2YWx1ZXMgYXMgZGVmYXVsdHMKKyAgZm9yIDxhIGhyZWY9IlRhc2tzL25ldHJleHhjLmh0bWwiPm5ldHJleHhjPC9hPi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5Qcm9wZXJ0eUhlbHBlcjwvY29kZT48L3RkPgotICA8dGQ+YW50LXJlZmVyZW5jZS1uYW1lIChvcHRpb25hbCk8L3RkPgotICA8dGQ+U3BlY2lmeSB0aGUgUHJvcGVydHlIZWxwZXIgdG8gdXNlLiBUaGUgb2JqZWN0IG11c3QgYmUgb2YgdGhlIHR5cGUKLSAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyLiBJZiBub3QgZGVmaW5lZCBhbiBvYmplY3Qgb2YKLSAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyIHdpbGwgYmUgdXNlZCBhcyBQcm9wZXJ0eUhlbHBlci4KLSAgPC90ZD4KKyAgPHRkPkFudCByZWZlcmVuY2UgbmFtZSAob3B0aW9uYWwpPC90ZD4KKyAgPHRkPlNwZWNpZnkgdGhlIFByb3BlcnR5SGVscGVyIHRvIHVzZS4gVGhlIG9iamVjdCBtdXN0IGJlIG9mIHRoZQorICB0eXBlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9wZXJ0eUhlbHBlcjwvY29kZT4uIEJ5CisgIGRlZmF1bHQsIGFuIG9iamVjdAorICBvZiA8Y29kZSBjbGFzcz0iY29kZSI+b3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI8L2NvZGU+CisgIHdpbGwgYmUgdXNlZCBhcyBQcm9wZXJ0eUhlbHBlci48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5yZWdleHAucmVnZXhwaW1wbDwvY29kZT48L3RkPgogICA8dGQ+Y2xhc3NuYW1lPC90ZD4KLSAgPHRkPmNsYXNzbmFtZSBmb3IgYSBSZWdFeHAgaW1wbGVtZW50YXRpb247IGlmIG5vdCBzZXQgQW50IHVzZXMgSkRLIDEuNCdzIGltcGxlbWVudGF0aW9uOwotICAgICAgPGEgaHJlZj0iVHlwZXMvbWFwcGVyLmh0bWwjcmVnZXhwLW1hcHBlciI+UmVnRXhwLU1hcHBlcjwvYT4KLSAgICAgICJDaG9pY2Ugb2YgcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIgotICA8L3RkPgorICA8dGQ+Y2xhc3NuYW1lIGZvciBhIFJlZ0V4cCBpbXBsZW1lbnRhdGlvbjsgYnkgZGVmYXVsdCwgSkRLIDEuNCsKKyAgaW1wbGVtZW50YXRpb247IDxhIGhyZWY9IlR5cGVzL21hcHBlci5odG1sI3JlZ2V4cC1tYXBwZXIiPlJlZ0V4cAorICBNYXBwZXI8L2E+ICJDaG9pY2Ugb2YgcmVndWxhciBleHByZXNzaW9uIGltcGxlbWVudGF0aW9uIi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5yZXVzZS5sb2FkZXI8L2NvZGU+PC90ZD4KICAgPHRkPmJvb2xlYW48L3RkPgotICA8dGQ+YWxsb3cgdG8gcmV1c2UgY2xhc3Nsb2FkZXJzCi0gICAgICB1c2VkIGluIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ2xhc3NwYXRoVXRpbAotICA8L3RkPgorICA8dGQ+YWxsb3cgdG8gcmV1c2UgY2xhc3Nsb2FkZXJzIHVzZWQKKyAgaW4gPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ2xhc3NwYXRoVXRpbDwvY29kZT4uPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5hbnQuWG1sTG9nZ2VyLnN0eWxlc2hlZXQudXJpPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5maWxlbmFtZSAoZGVmYXVsdCAnbG9nLnhzbCcpPC90ZD4KLSAgPHRkPk5hbWUgZm9yIHRoZSBzdHlsZXNoZWV0IHRvIGluY2x1ZGUgaW4gdGhlIGxvZ2ZpbGUgYnkKLSAgICAgIDxhIGhyZWY9Imxpc3RlbmVycy5odG1sI1htbExvZ2dlciI+WG1sTG9nZ2VyPC9hPi4KLSAgPC90ZD4KKyAgPHRkPmZpbGVuYW1lIChkZWZhdWx0IDxxPmxvZy54c2w8L3E+KTwvdGQ+CisgIDx0ZD5OYW1lIGZvciB0aGUgc3R5bGVzaGVldCB0byBpbmNsdWRlIGluIHRoZSBsb2dmaWxlCisgIGJ5IDxhIGhyZWY9Imxpc3RlbmVycy5odG1sI1htbExvZ2dlciI+WG1sTG9nZ2VyPC9hPi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyPC9jb2RlPjwvdGQ+CiAgIDx0ZD5uYW1lPC90ZD4KLSAgPHRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgY29tcGlsZXIgdG8gdXNlLgotICAgICAgc2VlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwiPmphdmFjPC9hPiwKLSAgICAgIDxhIGhyZWY9IlRhc2tzL2VqYi5odG1sI2VqYmphcl93ZWJsb2dpYyI+RUpCIFRhc2tzPC9hPgotICAgICAgKGNvbXBpbGVyIGF0dHJpYnV0ZSksCi0gICAgICA8YSBocmVmPSJUYXNrcy9qYXZhaC5odG1sIj5qYXZhaDwvYT4KLSAgPC90ZD4KKyAgPHRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgY29tcGlsZXIgdG8gdXNlOworICBzZWUgPGEgaHJlZj0iVGFza3MvamF2YWMuaHRtbCI+amF2YWM8L2E+LCA8YSBocmVmPSJUYXNrcy9lamIuaHRtbCNlamJqYXJfd2VibG9naWMiPkVKQgorICBUYXNrczwvYT4gKDx2YXI+Y29tcGlsZXI8L3Zhcj4KKyAgYXR0cmlidXRlKSwgPGEgaHJlZj0iVGFza3MvamF2YWguaHRtbCI+amF2YWg8L2E+LjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+YnVpbGQuY29tcGlsZXIuZW1hY3M8L2NvZGU+PC90ZD4KLSAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgZmFsc2UpPC90ZD4KLSAgPHRkPkVuYWJsZSBlbWFjcy1jb21wYXRpYmxlIGVycm9yIG1lc3NhZ2VzLgotICAgICAgc2VlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwiPmphdmFjPC9hPiAiSmlrZXMgTm90ZXMiCi0gIDwvdGQ+CisgIDx0ZD5ib29sZWFuIChkZWZhdWx0IDxxPmZhbHNlPC9xPik8L3RkPgorICA8dGQ+RW5hYmxlIGVtYWNzLWNvbXBhdGlibGUgZXJyb3IgbWVzc2FnZXM7CisgIHNlZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sI2ppa2VzIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLmZ1bGxkZXBlbmQ8L2NvZGU+PC90ZD4KICAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgZmFsc2UpPC90ZD4KLSAgPHRkPkVuYWJsZSBmdWxsIGRlcGVuZGVuY3kgY2hlY2tpbmcKLSAgICAgIHNlZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIgotICA8L3RkPgorICA8dGQ+RW5hYmxlIGZ1bGwgZGVwZW5kZW5jeSBjaGVja2luZzsKKyAgc2VlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwjamlrZXMiPmphdmFjPC9hPiAiSmlrZXMgTm90ZXMiLjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+YnVpbGQuY29tcGlsZXIuanZjLmV4dGVuc2lvbnM8L2NvZGU+PC90ZD4KLSAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgdHJ1ZSk8L3RkPgotICA8dGQ+ZW5hYmxlIE1pY3Jvc29mdCBleHRlbnNpb25zIG9mIHRoZWlyIGphdmEgY29tcGlsZXIKLSAgICAgIHNlZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkp2YyBOb3RlcyIKLSAgPC90ZD4KKyAgPHRkPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+PC90ZD4KKyAgPHRkPkVuYWJsZSBNaWNyb3NvZnQgZXh0ZW5zaW9ucyBvZiB0aGVpciBKYXZhIGNvbXBpbGVyOworICBzZWUgPGEgaHJlZj0iVGFza3MvamF2YWMuaHRtbCNqdmMiPmphdmFjPC9hPiAiSnZjIE5vdGVzIi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLnBlZGFudGljPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5ib29sZWFuIChkZWZhdWx0IGZhbHNlKTwvdGQ+Ci0gIDx0ZD5FbmFibGUgcGVkYW50aWMgd2FybmluZ3MuCi0gICAgICBzZWUgPGEgaHJlZj0iVGFza3MvamF2YWMuaHRtbCI+amF2YWM8L2E+ICJKaWtlcyBOb3RlcyIKLSAgPC90ZD4KKyAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgPHE+ZmFsc2U8L3E+KTwvdGQ+CisgIDx0ZD5FbmFibGUgcGVkYW50aWMgd2FybmluZ3M7CisgIHNlZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sI2ppa2VzIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmJ1aWxkLmNvbXBpbGVyLndhcm5pbmdzPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5EZXByZWNhdGVkIGZsYWc8L3RkPgotICA8dGQ+IHNlZSA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5qYXZhYzwvYT4gIkppa2VzIE5vdGVzIiA8L3RkPgorICA8dGQ+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT48L3RkPgorICA8dGQ+U2VlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwjamlrZXMiPmphdmFjPC9hPiAiSmlrZXMgTm90ZXMiPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5idWlsZC5ybWljPC9jb2RlPjwvdGQ+CiAgIDx0ZD5uYW1lPC90ZD4KLSAgPHRkPmNvbnRyb2wgdGhlIDxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+cm1pYzwvYT4gY29tcGlsZXIgPC90ZD4KKyAgPHRkPkNvbnRyb2wgdGhlIDxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+cm1pYzwvYT4gY29tcGlsZXI8L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmJ1aWxkLnN5c2NsYXNzcGF0aDwvY29kZT48L3RkPgotICA8dGQ+c2VlIDxhIGhyZWY9InN5c2NsYXNzcGF0aC5odG1sIj5pdHMgZGVkaWNhdGVkIHBhZ2U8L2E+LCBubwotICAgIGRlZmF1bHQgdmFsdWU8L3RkPgotICA8dGQ+c2VlIDxhIGhyZWY9InN5c2NsYXNzcGF0aC5odG1sIj5pdHMgZGVkaWNhdGVkIHBhZ2U8L2E+PC90ZD4KKyAgPHRkPk5vIGRlZmF1bHQgdmFsdWU8L3RkPgorICA8dGQ+U2VlIDxhIGhyZWY9InN5c2NsYXNzcGF0aC5odG1sIj5pdHMgZGVkaWNhdGVkIHBhZ2U8L2E+PC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5maWxlLmVuY29kaW5nPC9jb2RlPjwvdGQ+CiAgIDx0ZD5uYW1lIG9mIGEgc3VwcG9ydGVkIGNoYXJhY3RlciBzZXQgKGUuZy4gVVRGLTgsIElTTy04ODU5LTEsIFVTLUFTQ0lJKTwvdGQ+Ci0gIDx0ZD51c2UgYXMgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IG9mIGVtYWlsIG1lc3NhZ2VzOyB1c2UgYXMgZGVmYXVsdCBmb3Igc291cmNlLSwgZGVzdC0gYW5kIGJ1bmRsZWVuY29kaW5nCi0gICAgICBpbiA8YSBocmVmPSJUYXNrcy90cmFuc2xhdGUuaHRtbCI+dHJhbnNsYXRlPC9hPiA8YnI+Ci0gICAgICBzZWUgSmF2YURvYyBvZiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL25pby9jaGFyc2V0L0NoYXJzZXQuaHRtbCI+amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0PC9hPgotICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY2hhcmFjdGVyIHNldHMgKG5vdCB1c2VkIGluIEFudCwgYnV0IGhhcyBuaWNlIGRvY3MpLgotICA8L3RkPgorICA8dGQ+dXNlIGFzIGRlZmF1bHQgY2hhcmFjdGVyIHNldCBvZiBlbWFpbCBtZXNzYWdlczsgdXNlIGFzIGRlZmF1bHQKKyAgZm9yIDx2YXI+c3JjZW5jb2Rpbmc8L3Zhcj4sIDx2YXI+ZGVzdGVuY29kaW5nPC92YXI+CisgIGFuZCA8dmFyPmJ1bmRsZWVuY29kaW5nPC92YXI+CisgIGluIDxhIGhyZWY9IlRhc2tzL3RyYW5zbGF0ZS5odG1sIj50cmFuc2xhdGU8L2E+PGJyLz4gc2VlIEphdmFEb2MKKyAgb2YgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS9uaW8vY2hhcnNldC9DaGFyc2V0Lmh0bWwiCisgIHRhcmdldD0iX3RvcCI+amF2YS5uaW8uY2hhcnNldC5DaGFyc2V0PC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICBhYm91dCBjaGFyYWN0ZXIgc2V0cyAobm90IHVzZWQgaW4gQW50LCBidXQgaGFzIG5pY2UgZG9jcykuPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5qaWtlcy5jbGFzcy5wYXRoPC9jb2RlPjwvdGQ+CiAgIDx0ZD5wYXRoPC90ZD4KLSAgPHRkPlRoZSBzcGVjaWZpZWQgcGF0aCBpcyBhZGRlZCB0byB0aGUgY2xhc3NwYXRoIGlmIGppa2VzIGlzIHVzZWQgYXMgY29tcGlsZXIuPC90ZD4KKyAgPHRkPlRoZSBzcGVjaWZpZWQgcGF0aCBpcyBhZGRlZCB0byB0aGUgY2xhc3NwYXRoIGlmIEppa2VzIGlzIHVzZWQgYXMgY29tcGlsZXIuPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnByb3BlcnRpZXMuZmlsZSwgTWFpbExvZ2dlci4qPC9jb2RlPjwvdGQ+CisgIDx0ZD48Y29kZT5NYWlsTG9nZ2VyLnByb3BlcnRpZXMuZmlsZTwvY29kZT4sIDxjb2RlPk1haWxMb2dnZXIuKjwvY29kZT48L3RkPgogICA8dGQ+ZmlsZW5hbWUgKG9wdGlvbmFsLCBkZWZhdWx0cyBkZXJpdmVkIGZyb20gUHJvamVjdCBpbnN0YW5jZSk8L3RkPgotICA8dGQ+TmFtZSBvZiB0aGUgZmlsZSBob2xkaW5nIHByb3BlcnRpZXMgZm9yIHNlbmRpbmcgZW1haWxzIGJ5IHRoZQotICAgICAgPGEgaHJlZj0ibGlzdGVuZXJzLmh0bWwjTWFpbExvZ2dlciI+TWFpbExvZ2dlcjwvYT4uIE92ZXJyaWRlIHByb3BlcnRpZXMgc2V0Ci0gICAgICBpbnNpZGUgdGhlIGJ1aWxkZmlsZSBvciB2aWEgY29tbWFuZCBsaW5lLgotICA8L3RkPgorICA8dGQ+TmFtZSBvZiB0aGUgZmlsZSBob2xkaW5nIHByb3BlcnRpZXMgZm9yIHNlbmRpbmcgZW1haWxzIGJ5CisgIHRoZSA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCNNYWlsTG9nZ2VyIj5NYWlsTG9nZ2VyPC9hPi4gT3ZlcnJpZGUKKyAgcHJvcGVydGllcyBzZXQgaW5zaWRlIHRoZSBidWlsZGZpbGUgb3IgdmlhIGNvbW1hbmQgbGluZS48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+PC90ZD4KLSAgPCEtLSBhZGQgdGhlIGJsYW5rIGFmdGVyIHRoZSBzbGFzaCwgc28gdGhlIGJyb3dzZXIgY2FuIGRvIGEgbGluZSBicmVhayAtLT4KLSAgPHRkPmNsYXNzbmFtZSAob3B0aW9uYWwsIGRlZmF1bHQgJ29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXIyJyk8L3RkPgotICA8dGQ+c3BlY2lmaWVzIHRoZSBjbGFzc25hbWUgdG8gdXNlIGFzIFByb2plY3RIZWxwZXIuIFRoZSBjbGFzcyBtdXN0IGV4dGVuZAotICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlci4KLSAgPC90ZD4KKyAgPHRkPmNsYXNzbmFtZSAob3B0aW9uYWwsIGRlZmF1bHQgPHE+b3JnLjx3YnI+YXBhY2hlLjx3YnI+dG9vbHMuPHdicj5hbnQuPHdicj5Qcm9qZWN0SGVscGVyMjwvcT4pPC90ZD4KKyAgPHRkPnNwZWNpZmllcyB0aGUgY2xhc3NuYW1lIHRvIHVzZSBhcyBQcm9qZWN0SGVscGVyLiBUaGUgY2xhc3MgbXVzdAorICBleHRlbmQgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI8L2NvZGU+LjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuQXJndW1lbnRQcm9jZXNzb3I8L2NvZGU+PC90ZD4KICAgPHRkPmNsYXNzbmFtZSAob3B0aW9uYWwpPC90ZD4KLSAgPHRkPnNwZWNpZmllcyB0aGUgY2xhc3NuYW1lIHRvIHVzZSBhcyBBcmd1bWVudFByb2Nlc3Nvci4gVGhlIGNsYXNzIG11c3QgZXh0ZW5kCi0gICAgICBvcmcuYXBhY2hlLnRvb2xzLmFudC5Bcmd1bWVudFByb2Nlc3Nvci4KLSAgPC90ZD4KKyAgPHRkPnNwZWNpZmllcyB0aGUgY2xhc3NuYW1lIHRvIHVzZSBhcyBBcmd1bWVudFByb2Nlc3Nvci4gVGhlIGNsYXNzCisgIG11c3QgZXh0ZW5kIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5Bcmd1bWVudFByb2Nlc3NvcjwvY29kZT4uPC90ZD4KIDwvdHI+Ci0KIDx0cj4KICAgPHRkPjxjb2RlPndlYnNwaGVyZS5ob21lPC9jb2RlPjwvdGQ+CiAgIDx0ZD5wYXRoPC90ZD4KLSAgPHRkPlBvaW50cyB0byBob21lIGRpcmVjdG9yeSBvZiB3ZWJzcGhlcmUuCi0gICAgICBzZWUgPGEgaHJlZj0iVGFza3MvZWpiLmh0bWwjZWpiamFyX3dlYnNwaGVyZSI+RUpCIFRhc2tzPC9hPgotICA8L3RkPgorICA8dGQ+UG9pbnRzIHRvIGhvbWUgZGlyZWN0b3J5IG9mIFdlYlNwaGVyZTsKKyAgc2VlIDxhIGhyZWY9IlRhc2tzL2VqYi5odG1sI2VqYmphcl93ZWJzcGhlcmUiPkVKQiBUYXNrczwvYT48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPlhtbExvZ2dlci5maWxlPC9jb2RlPjwvdGQ+Ci0gIDx0ZD5maWxlbmFtZSAoZGVmYXVsdCAnbG9nLnhtbCcpPC90ZD4KLSAgPHRkPk5hbWUgZm9yIHRoZSBsb2dmaWxlIGZvciA8YSBocmVmPSJsaXN0ZW5lcnMuaHRtbCNNYWlsTG9nZ2VyIj5NYWlsTG9nZ2VyPC9hPi4KLSAgPC90ZD4KKyAgPHRkPmZpbGVuYW1lIChkZWZhdWx0IDxxPmxvZy54bWw8L3E+KTwvdGQ+CisgIDx0ZD5OYW1lIGZvciB0aGUgbG9nZmlsZQorICBmb3IgPGEgaHJlZj0ibGlzdGVuZXJzLmh0bWwjTWFpbExvZ2dlciI+TWFpbExvZ2dlcjwvYT4uPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5hbnQucHJvamVjdC1oZWxwZXItcmVwby5kZWJ1ZzwvY29kZT48L3RkPgotICA8dGQ+Ym9vbGVhbiAoZGVmYXVsdCAnZmFsc2UnKTwvdGQ+Ci0gIDx0ZD5TZXQgaXQgdG8gdHJ1ZSB0byBlbmFibGUgZGVidWdnaW5nIHdpdGggQW50J3MKLSAgPGEgaHJlZj0icHJvamVjdGhlbHBlci5odG1sI3JlcG9zaXRvcnkiPlByb2plY3RIZWxwZXIgaW50ZXJuYWwgcmVwb3NpdG9yeTwvYT4uCi0gIDwvdGQ+CisgIDx0ZD5ib29sZWFuIChkZWZhdWx0IDxxPmZhbHNlPC9xPik8L3RkPgorICA8dGQ+U2V0IGl0IHRvIDxxPnRydWU8L3E+IHRvIGVuYWJsZSBkZWJ1Z2dpbmcgd2l0aAorICBBbnQncyA8YSBocmVmPSJwcm9qZWN0aGVscGVyLmh0bWwjcmVwb3NpdG9yeSI+UHJvamVjdEhlbHBlciBpbnRlcm5hbAorICByZXBvc2l0b3J5PC9hPi48L3RkPgogPC90cj4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC5hcmd1bWVudC1wcm9jZXNzb3ItcmVwby5kZWJ1ZzwvY29kZT48L3RkPgotICA8dGQ+Ym9vbGVhbiAoZGVmYXVsdCAnZmFsc2UnKTwvdGQ+Ci0gIDx0ZD5TZXQgaXQgdG8gdHJ1ZSB0byBlbmFibGUgZGVidWdnaW5nIHdpdGggQW50J3MKLSAgPGEgaHJlZj0iYXJndW1lbnRwcm9jZXNzb3IuaHRtbCNyZXBvc2l0b3J5Ij5Bcmd1bWVudFByb2Nlc3NvciBpbnRlcm5hbCByZXBvc2l0b3J5PC9hPi4KLSAgPC90ZD4KKyAgPHRkPmJvb2xlYW4gKGRlZmF1bHQgPHE+ZmFsc2U8L3E+KTwvdGQ+CisgIDx0ZD5TZXQgaXQgdG8gPHE+dHJ1ZTwvcT4gdG8gZW5hYmxlIGRlYnVnZ2luZyB3aXRoCisgIEFudCdzIDxhIGhyZWY9ImFyZ3VtZW50cHJvY2Vzc29yLmh0bWwjcmVwb3NpdG9yeSI+QXJndW1lbnRQcm9jZXNzb3IKKyAgaW50ZXJuYWwgcmVwb3NpdG9yeTwvYT4uPC90ZD4KIDwvdHI+CiA8dHI+CiAgIDx0ZD48Y29kZT5hbnQudHN0YW1wLm5vdzwvY29kZT48L3RkPgogICA8dGQ+bnVtYmVyLCBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCAobWlkbmlnaHQgMTk3MC0wMS0wMSk8L3RkPgotICA8dGQ+VGhlIHZhbHVlIHRvIHVzZSBhcyBjdXJyZW50IHRpbWUgYW5kIGRhdGUgZm9yICZsdDt0c3RhbXAmZ3Q7PC90ZD4KKyAgPHRkIHJvd3NwYW49IjIiPlRoZSB2YWx1ZSB0byB1c2UgYXMgY3VycmVudCB0aW1lIGFuZCBkYXRlCisgIGZvciA8Y29kZT4mbHQ7dHN0YW1wJmd0OzwvY29kZT48L3RkPgorPC90cj4KKzx0cj4KKyAgPHRkPjxjb2RlPmFudC50c3RhbXAubm93LmlzbzwvY29kZT48L3RkPgorICA8dGQ+SVNPLTg2MDEgdGltZXN0YW1wIHN0cmluZyBsaWtlIDxjb2RlPjE5NzItMDQtMTdUMDg6MDc6MDBaPC9jb2RlPjwvdGQ+CiA8L3RyPgogPHRyPgogICA8dGQ+PGNvZGU+amF2YS5pby50bXBkaXI8L2NvZGU+PC90ZD4KQEAgLTQ5OSw3ICs0NjksNyBAQAogPC90YWJsZT4KIDx0cj4KICAgPHRkPjxjb2RlPmFudC50bXBkaXI8L2NvZGU+PC90ZD4KLSAgPHRkPjxlbT5TaW5jZSBBbnQgMS45LjE1PC9lbT48YnIvPgorICA8dGQ+PGVtPlNpbmNlIEFudCAxLjEwLjg8L2VtPjxici8+CiAgIFNvbWUgdGFza3MgbmVlZCB0byBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzIGFuZCB3aWxsIHdyaXRlIHRoZW0gdG8KICAgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgdGhpcyBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSB0YWtlcwogICBwcmVjZWRlbmNlIG92ZXIgPGNvZGU+amF2YS5pby50bXBkaXI8L2NvZGU+IGlmIGl0IGhhcyBiZWVuCkBAIC01MDksMTkgKzQ3OSwyMSBAQAogPC90YWJsZT4KIAogPHA+Ci1JZiBuZXcgcHJvcGVydGllcyBnZXQgYWRkZWQgKGl0IGhhcHBlbnMpLCBleHBlY3QgdGhlbSB0byBhcHBlYXIgdW5kZXIgdGhlCi0iYW50LiIgYW5kICJvcmcuYXBhY2hlLnRvb2xzLmFudCIgcHJlZml4ZXMsIHVubGVzcyB0aGUgZGV2ZWxvcGVycyBoYXZlIGEKLXZlcnkgZ29vZCByZWFzb24gdG8gdXNlIGFub3RoZXIgcHJlZml4LiBBY2NvcmRpbmdseSwgcGxlYXNlIGF2b2lkIHVzaW5nCi1wcm9wZXJ0aWVzIHRoYXQgYmVnaW4gd2l0aCB0aGVzZSBwcmVmaXhlcy4gVGhpcyBwcm90ZWN0cyB5b3UgZnJvbSBmdXR1cmUKLUFudCByZWxlYXNlcyBicmVha2luZyB5b3VyIGJ1aWxkIGZpbGUuCitJZiBuZXcgcHJvcGVydGllcyBnZXQgYWRkZWQgKGl0IGhhcHBlbnMpLCBleHBlY3QgdGhlbSB0byBhcHBlYXIgdW5kZXIKK3RoZSA8Y29kZT5hbnQuPC9jb2RlPiBhbmQgPGNvZGU+b3JnLmFwYWNoZS50b29scy5hbnQuPC9jb2RlPiBwcmVmaXhlcywKK3VubGVzcyB0aGUgZGV2ZWxvcGVycyBoYXZlIGEgdmVyeSBnb29kIHJlYXNvbiB0byB1c2UgYW5vdGhlcgorcHJlZml4LiBBY2NvcmRpbmdseSwgcGxlYXNlIGF2b2lkIHVzaW5nIHByb3BlcnRpZXMgdGhhdCBiZWdpbiB3aXRoCit0aGVzZSBwcmVmaXhlcy4gVGhpcyBwcm90ZWN0cyB5b3UgZnJvbSBmdXR1cmUgQW50IHJlbGVhc2VzIGJyZWFraW5nCit5b3VyIGJ1aWxkIGZpbGUuCiA8L3A+CiA8aDM+cmV0dXJuIGNvZGU8L2gzPgotPHA+dGhlIGFudCBzdGFydCB1cCBzY3JpcHRzIChpbiB0aGVpciBXaW5kb3dzIGFuZCBVbml4IHZlcnNpb24pIHJldHVybgotdGhlIHJldHVybiBjb2RlIG9mIHRoZSBqYXZhIHByb2dyYW0uIFNvIGEgc3VjY2Vzc2Z1bCBidWlsZCByZXR1cm5zIDAsCi1mYWlsZWQgYnVpbGRzIHJldHVybiBvdGhlciB2YWx1ZXMuCis8cD4KK0FudCBzdGFydCB1cCBzY3JpcHRzIChpbiB0aGVpciBXaW5kb3dzIGFuZCBVbml4IHZlcnNpb24pIHJldHVybiB0aGUKK3JldHVybiBjb2RlIG9mIHRoZSA8Y29kZT5qYXZhPC9jb2RlPiBwcm9ncmFtLiBTbyBhIHN1Y2Nlc3NmdWwgYnVpbGQKK3JldHVybnMgPHE+MDwvcT4sIGZhaWxlZCBidWlsZHMgcmV0dXJuIG90aGVyIHZhbHVlcy4KIDwvcD4KIAotPGgyPjxhIG5hbWU9InRtcGRpciI+VGVtcG9yYXJ5IERpcmVjdG9yaWVzPC9hPjwvaDI+Cis8aDIgaWQ9InRtcGRpciI+VGVtcG9yYXJ5IERpcmVjdG9yaWVzPC9oMj4KIAogU29tZSBBbnQgdGFza3MgYW5kIHR5cGVzIG5lZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlcy4gQnkgZGVmYXVsdAogdGhleSB1c2UgdGhlIGRlZmF1bHQgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvZiB0aGUgSmF2YSBWTSB0aGV5IGFyZQpAQCAtNTM1LDcgKzUwNyw3IEBACiAgIHRoZSA8Y29kZT5hbnQoLmNtZCk8L2NvZGU+IHdyYXBwZXIgc2NyaXB0cyB5b3UgY2FuIGRvIHNvIHdpdGggdGhlCiAgIGhlbHAgb2YgdGhlIDxjb2RlPkFOVF9PUFRTPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZS48L3A+CiAKLTxwPlN0YXJ0aW5nIHdpdGggQW50IDEuOS4xNSB3ZSd2ZSBpbnRyb2R1Y2VkIGEgbmV3IEFudAorPHA+U3RhcnRpbmcgd2l0aCBBbnQgMS4xMC44IHdlJ3ZlIGludHJvZHVjZWQgYSBuZXcgQW50CiAgIHByb3BlcnR5IDxjb2RlPmFudC50bXBkaXI8L2NvZGU+IHRoYXQgdGFrZXMgcHJlY2VkZW5jZQogICBvdmVyIDxjb2RlPmphdmEuaW8udG1wZGlyPC9jb2RlPiB3aGVuIHNldC4gQXMgdGhpcyBpcyBhIG5vcm1hbCBBbnQKICAgcHJvcGVydHkgaXQgY2FuIGJlIHNldCB2aWEgdGhlIGNvbW1hbmQgbGluZSBvciBldmVuIGZyb20gd2l0aGluIGEKQEAgLTU0OSwyOCArNTIxLDM2IEBACiA8cD5UYXNrcyBub3QgcHJvdmlkZWQgd2l0aCB0aGUgQW50IGRpc3RyaWJ1dGlvbiB3aWxsIGlnbm9yZQogICB0aGUgPGNvZGU+YW50LnRtcGRpcjwvY29kZT4gcHJvcGVydHkgYW5kCiAgIHVzZSA8Y29kZT5qYXZhLmlvLnRtcGRpcjwvY29kZT4gdW5sZXNzIHRoZXkgaGF2ZSBiZWVuIGFkYXB0ZWQgdG8gdGhlCi0gIGNoYW5nZWQgQVBJIG9mIEFudCAxLjkuMTUuPC9wPgorICBjaGFuZ2VkIEFQSSBvZiBBbnQgMS4xMC44LjwvcD4KIAotPGgyPjxhIG5hbWU9ImN5Z3dpbiI+Q3lnd2luIFVzZXJzPC9hPjwvaDI+Ci08cD5UaGUgVW5peCBsYXVuY2ggc2NyaXB0IHRoYXQgY29tZSB3aXRoIEFudCB3b3JrcyBjb3JyZWN0bHkgd2l0aCBDeWd3aW4uIFlvdQotc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9ibGVtcyBsYXVuY2hpbmcgQW50IGZyb20gdGhlIEN5Z3dpbiBzaGVsbC4gSXQgaXMKLWltcG9ydGFudCB0byBub3RlLCBob3dldmVyLCB0aGF0IG9uY2UgQW50IGlzIHJ1bm5pbmcgaXQgaXMgcGFydCBvZiB0aGUgSkRLCi13aGljaCBvcGVyYXRlcyBhcyBhIG5hdGl2ZSBXaW5kb3dzIGFwcGxpY2F0aW9uLiBUaGUgSkRLIGlzIG5vdCBhIEN5Z3dpbgotZXhlY3V0YWJsZSwgYW5kIGl0IHRoZXJlZm9yZSBoYXMgbm8ga25vd2xlZGdlIG9mIEN5Z3dpbiBwYXRocywgZXRjLiBJbgotcGFydGljdWxhciB3aGVuIHVzaW5nIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+IHRhc2ssIGV4ZWN1dGFibGUgbmFtZXMgc3VjaAotYXMgJnF1b3Q7L2Jpbi9zaCZxdW90OyB3aWxsIG5vdCB3b3JrLCBldmVuIHRob3VnaCB0aGVzZSB3b3JrIGZyb20gdGhlIEN5Z3dpbgotc2hlbGwgZnJvbSB3aGljaCBBbnQgd2FzIGxhdW5jaGVkLiBZb3UgY2FuIHVzZSBhbiBleGVjdXRhYmxlIG5hbWUgc3VjaCBhcwotJnF1b3Q7c2gmcXVvdDsgYW5kIHJlbHkgb24gdGhhdCBjb21tYW5kIGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgV2luZG93cyBwYXRoLgorCis8aDIgaWQ9ImN5Z3dpbiI+Q3lnd2luIFVzZXJzPC9oMj4KKzxwPgorVW5peCBsYXVuY2ggc2NyaXB0IHRoYXQgY29tZSB3aXRoIEFudCB3b3JrcyBjb3JyZWN0bHkgd2l0aCBDeWd3aW4uIFlvdQorc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9ibGVtcyBsYXVuY2hpbmcgQW50IGZyb20gdGhlIEN5Z3dpbiBzaGVsbC4gSXQKK2lzIGltcG9ydGFudCB0byBub3RlLCBob3dldmVyLCB0aGF0IG9uY2UgQW50IGlzIHJ1bm5pbmcgaXQgaXMgcGFydCBvZgordGhlIEpESyB3aGljaCBvcGVyYXRlcyBhcyBhIG5hdGl2ZSBXaW5kb3dzIGFwcGxpY2F0aW9uLiBUaGUgSkRLIGlzIG5vdAorYSBDeWd3aW4gZXhlY3V0YWJsZSwgYW5kIGl0IHRoZXJlZm9yZSBoYXMgbm8ga25vd2xlZGdlIG9mIEN5Z3dpbgorcGF0aHMsIGV0Yy4gSW4gcGFydGljdWxhciB3aGVuIHVzaW5nIHRoZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+Cit0YXNrLCBleGVjdXRhYmxlIG5hbWVzIHN1Y2ggYXMgPHE+L2Jpbi9zaDwvcT4gd2lsbCBub3Qgd29yaywgZXZlbgordGhvdWdoIHRoZXNlIHdvcmsgZnJvbSB0aGUgQ3lnd2luIHNoZWxsIGZyb20gd2hpY2ggQW50IHdhcworbGF1bmNoZWQuIFlvdSBjYW4gdXNlIGFuIGV4ZWN1dGFibGUgbmFtZSBzdWNoIGFzIDxxPnNoPC9xPiBhbmQgcmVseSBvbgordGhhdCBjb21tYW5kIGJlaW5nIGF2YWlsYWJsZSBpbiB0aGUgV2luZG93cyBwYXRoLgorCis8aDIgaWQ9Im9zMiI+T1MvMiBVc2VyczwvaDI+Cis8cD4KK1RoZSBPUy8yIGxhdW5jaCBzY3JpcHQgd2FzIGRldmVsb3BlZCB0byBwZXJmb3JtIGNvbXBsZXggdGFza3MuIEl0IGhhcwordHdvIHBhcnRzOiA8a2JkPmFudC5jbWQ8L2tiZD4gd2hpY2ggY2FsbHMgQW50CithbmQgPGtiZD5hbnRlbnYuY21kPC9rYmQ+IHdoaWNoIHNldHMgdGhlIGVudmlyb25tZW50IGZvciBBbnQuICBNb3N0CitvZnRlbiB5b3Ugd2lsbCBqdXN0IGNhbGwgPGtiZD5hbnQuY21kPC9rYmQ+IHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQKK2xpbmUgb3B0aW9ucyBhcyBkZXNjcmliZWQgYWJvdmUuIFRoZSBiZWhhdmlvdXIgY2FuIGJlIG1vZGlmaWVkIGJ5IGEKK251bWJlciBvZiB3YXlzIGV4cGxhaW5lZCBiZWxvdy4KIDwvcD4KIAotPGgyPjxhIG5hbWU9Im9zMiI+T1MvMiBVc2VyczwvYT48L2gyPgotPHA+VGhlIE9TLzIgbGF1bmNoIHNjcmlwdCB3YXMgZGV2ZWxvcGVkIHRvIHBlcmZvcm0gY29tcGxleCB0YXNrcy4gSXQgaGFzIHR3byBwYXJ0czoKLTxjb2RlPmFudC5jbWQ8L2NvZGU+IHdoaWNoIGNhbGxzIEFudCBhbmQgPGNvZGU+YW50ZW52LmNtZDwvY29kZT4gd2hpY2ggc2V0cyB0aGUgZW52aXJvbm1lbnQgZm9yIEFudC4KLU1vc3Qgb2Z0ZW4geW91IHdpbGwganVzdCBjYWxsIDxjb2RlPmFudC5jbWQ8L2NvZGU+IHVzaW5nIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBvcHRpb25zIGFzIGRlc2NyaWJlZAotYWJvdmUuIFRoZSBiZWhhdmlvdXIgY2FuIGJlIG1vZGlmaWVkIGJ5IGEgbnVtYmVyIG9mIHdheXMgZXhwbGFpbmVkIGJlbG93LjwvcD4KLQotPHA+U2NyaXB0IDxjb2RlPmFudC5jbWQ8L2NvZGU+IGZpcnN0IHZlcmlmaWVzIHdoZXRoZXIgdGhlIEFudCBlbnZpcm9ubWVudCBpcyBzZXQgY29ycmVjdGx5LiBUaGUKLXJlcXVpcmVtZW50cyBhcmU6PC9wPgorPHA+CitTY3JpcHQgPGtiZD5hbnQuY21kPC9rYmQ+IGZpcnN0IHZlcmlmaWVzIHdoZXRoZXIgdGhlIEFudCBlbnZpcm9ubWVudAoraXMgc2V0IGNvcnJlY3RseS4gVGhlIHJlcXVpcmVtZW50cyBhcmU6Cis8L3A+CiA8b2w+CiA8bGk+RW52aXJvbm1lbnQgdmFyaWFibGUgPGNvZGU+SkFWQV9IT01FPC9jb2RlPiBpcyBzZXQuPC9saT4KIDxsaT5FbnZpcm9ubWVudCB2YXJpYWJsZSA8Y29kZT5BTlRfSE9NRTwvY29kZT4gaXMgc2V0LjwvbGk+CkBAIC01NzgsODIgKzU1OCw5NCBAQAogPGNvZGU+SkFWQV9IT01FPC9jb2RlPiBhbmQgYXQgbGVhc3Qgb25lIGVsZW1lbnQgZnJvbSA8Y29kZT5BTlRfSE9NRTwvY29kZT4uPC9saT4KIDwvb2w+CiAKLTxwPklmIGFueSBvZiB0aGVzZSBjb25kaXRpb25zIGlzIHZpb2xhdGVkLCBzY3JpcHQgPGNvZGU+YW50ZW52LmNtZDwvY29kZT4gaXMgY2FsbGVkLiBUaGlzIHNjcmlwdAotZmlyc3QgaW52b2tlcyBjb25maWd1cmF0aW9uIHNjcmlwdHMgaWYgdGhlcmUgZXhpc3Q6IHRoZSBzeXN0ZW0td2lkZSBjb25maWd1cmF0aW9uCi08Y29kZT5hbnRjb25mLmNtZDwvY29kZT4gZnJvbSB0aGUgPGNvZGU+JUVUQyU8L2NvZGU+IGRpcmVjdG9yeSBhbmQgdGhlbiB0aGUgdXNlciBjb25maWd1cmF0aW9uCi08Y29kZT5hbnRyYy5jbWQ8L2NvZGU+IGZyb20gdGhlIDxjb2RlPiVIT01FJTwvY29kZT4gZGlyZWN0b3J5LiBBdCB0aGlzIG1vbWVudCBib3RoCi08Y29kZT5KQVZBX0hPTUU8L2NvZGU+IGFuZCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gbXVzdCBiZSBkZWZpbmVkIGJlY2F1c2UgPGNvZGU+YW50ZW52LmNtZDwvY29kZT4KLW5vdyBhZGRzIDxjb2RlPmNsYXNzZXMuemlwPC9jb2RlPiBvciA8Y29kZT50b29scy5qYXI8L2NvZGU+IChkZXBlbmRpbmcgb24gdmVyc2lvbiBvZiBKVk0pIGFuZAotZXZlcnl0aGluZyBmcm9tIDxjb2RlPiVBTlRfSE9NRSVcbGliPC9jb2RlPiBleGNlcHQgPGNvZGU+YW50LSouamFyPC9jb2RlPiB0bwotPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi4gRmluYWxseSA8Y29kZT5hbnQuY21kPC9jb2RlPiBjYWxscyBwZXItZGlyZWN0b3J5IGNvbmZpZ3VyYXRpb24KLTxjb2RlPmFudHJjLmNtZDwvY29kZT4uIEFsbCBzZXR0aW5ncyBtYWRlIGJ5IDxjb2RlPmFudC5jbWQ8L2NvZGU+IGFyZSBsb2NhbCBhbmQgYXJlIHVuZG9uZSB3aGVuIHRoZQotc2NyaXB0IGVuZHMuIFRoZSBzZXR0aW5ncyBtYWRlIGJ5IDxjb2RlPmFudGVudi5jbWQ8L2NvZGU+IGFyZSBwZXJzaXN0ZW50IGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlCi1zaGVsbCAob2YgY291cnNlIHVubGVzcyBjYWxsZWQgYXV0b21hdGljYWxseSBmcm9tIDxjb2RlPmFudC5jbWQ8L2NvZGU+KS4gSXQgaXMgdGh1cyBwb3NzaWJsZSB0byBjYWxsCi08Y29kZT5hbnRlbnYuY21kPC9jb2RlPiBtYW51YWxseSBhbmQgbW9kaWZ5IHNvbWUgc2V0dGluZ3MgYmVmb3JlIGNhbGxpbmcgPGNvZGU+YW50LmNtZDwvY29kZT4uPC9wPgotCi08cD5TY3JpcHRzIDxjb2RlPmVudnNldC5jbWQ8L2NvZGU+IGFuZCA8Y29kZT5ydW5yYy5jbWQ8L2NvZGU+IHBlcmZvcm0gYXV4aWxpYXJ5IHRhc2tzLiBBbGwgc2NyaXB0cwotaGF2ZSBzb21lIGRvY3VtZW50YXRpb24gaW5zaWRlLjwvcD4KLQotPGgyPjxhIG5hbWU9ImJhY2tncm91bmQiPlJ1bm5pbmcgQW50IGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIG9uCi0gICAgVW5peCgtbGlrZSkgc3lzdGVtczwvYT48L2gyPgotCi08cD5JZiB5b3Ugc3RhcnQgQW50IGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIChsaWtlIGluIDxjb2RlPmFudAotICAgICZhbXA7PC9jb2RlPikgYW5kIHRoZSBidWlsZCBwcm9jZXNzIGNyZWF0ZXMgYW5vdGhlciBwcm9jZXNzLCBBbnQgd2lsbAotICAgIGltbWVkaWF0ZWx5IHRyeSB0byByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQsIHdoaWNoIGluIHR1cm4gd2lsbAotICAgIG1vc3QgbGlrZWx5IHN1c3BlbmQgdGhlIHByb2Nlc3MuICBJbiBvcmRlciB0byBhdm9pZCB0aGlzLCB5b3UgbXVzdAotICAgIHJlZGlyZWN0IEFudCdzIHN0YW5kYXJkIGlucHV0IG9yIGV4cGxpY2l0bHkgcHJvdmlkZSBpbnB1dCB0byBlYWNoCi0gICAgc3Bhd25lZCBwcm9jZXNzIHZpYSB0aGUgaW5wdXQgcmVsYXRlZCBhdHRyaWJ1dGVzIG9mIHRoZQotICAgIGNvcnJlc3BvbmRpbmcgdGFza3MuPC9wPgotCi08cD5UYXNrcyB0aGF0IGNyZWF0ZSBzdWNoIG5ldyBwcm9jZXNzZXMKLSAgaW5jbHVkZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPgotICBvciA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IHdoZW4gdGhlIDxjb2RlPmZvcms8L2NvZGU+IGF0dHJpYnV0ZSBpcwotICA8Y29kZT50cnVlPC9jb2RlPi48L3A+Ci0KLTxoMj48YSBuYW1lPSJ2aWFqYXZhIj5SdW5uaW5nIEFudCB2aWEgSmF2YTwvYT48L2gyPgotPHA+SWYgeW91IGhhdmUgaW5zdGFsbGVkIEFudCBpbiB0aGUgZG8taXQteW91cnNlbGYgd2F5LCBBbnQgY2FuIGJlIHN0YXJ0ZWQKLWZyb20gb25lIG9mIHR3byBlbnRyeSBwb2ludHM6PC9wPgotPGJsb2NrcXVvdGU+Ci0gIDxwcmU+amF2YSAtRGFudC5ob21lPWM6XGFudCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIFtvcHRpb25zXSBbdGFyZ2V0XTwvcHJlPgotPC9ibG9ja3F1b3RlPgotCi08YmxvY2txdW90ZT4KLSAgPHByZT5qYXZhIC1EYW50LmhvbWU9YzpcYW50IG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciBbb3B0aW9uc10gW3RhcmdldF08L3ByZT4KLTwvYmxvY2txdW90ZT4KKzxwPgorSWYgYW55IG9mIHRoZXNlIGNvbmRpdGlvbnMgaXMgdmlvbGF0ZWQsIHNjcmlwdCA8a2JkPmFudGVudi5jbWQ8L2tiZD4KK2lzIGNhbGxlZC4gVGhpcyBzY3JpcHQgZmlyc3QgaW52b2tlcyBjb25maWd1cmF0aW9uIHNjcmlwdHMgaWYgdGhlcmUKK2V4aXN0OiB0aGUgc3lzdGVtLXdpZGUgY29uZmlndXJhdGlvbiA8a2JkPmFudGNvbmYuY21kPC9rYmQ+IGZyb20KK3RoZSA8c2FtcD4lRVRDJTwvc2FtcD4gZGlyZWN0b3J5IGFuZCB0aGVuIHRoZSB1c2VyCitjb25maWd1cmF0aW9uIDxrYmQ+YW50cmMuY21kPC9rYmQ+IGZyb20gdGhlIDxzYW1wPiVIT01FJTwvc2FtcD4KK2RpcmVjdG9yeS4gQXQgdGhpcyBtb21lbnQgYm90aCA8Y29kZT5KQVZBX0hPTUU8L2NvZGU+CithbmQgPGNvZGU+QU5UX0hPTUU8L2NvZGU+IG11c3QgYmUgZGVmaW5lZAorYmVjYXVzZSA8a2JkPmFudGVudi5jbWQ8L2tiZD4gbm93IGFkZHMgPHNhbXA+Y2xhc3Nlcy56aXA8L3NhbXA+CitvciA8c2FtcD50b29scy5qYXI8L3NhbXA+IChkZXBlbmRpbmcgb24gdmVyc2lvbiBvZiBKVk0pIGFuZCBldmVyeXRoaW5nCitmcm9tIDxzYW1wPiVBTlRfSE9NRSVcbGliPC9zYW1wPiBleGNlcHQgPHNhbXA+YW50LSouamFyPC9zYW1wPgordG8gPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPi4gRmluYWxseSA8a2JkPmFudC5jbWQ8L2tiZD4gY2FsbHMKK3Blci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiA8a2JkPmFudHJjLmNtZDwva2JkPi4gQWxsIHNldHRpbmdzIG1hZGUKK2J5IDxrYmQ+YW50LmNtZDwva2JkPiBhcmUgbG9jYWwgYW5kIGFyZSB1bmRvbmUgd2hlbiB0aGUgc2NyaXB0CitlbmRzLiBUaGUgc2V0dGluZ3MgbWFkZSBieSA8a2JkPmFudGVudi5jbWQ8L2tiZD4gYXJlIHBlcnNpc3RlbnQKK2R1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHNoZWxsIChvZiBjb3Vyc2UgdW5sZXNzIGNhbGxlZAorYXV0b21hdGljYWxseSBmcm9tIDxrYmQ+YW50LmNtZDwva2JkPikuIEl0IGlzIHRodXMgcG9zc2libGUgdG8KK2NhbGwgPGtiZD5hbnRlbnYuY21kPC9rYmQ+IG1hbnVhbGx5IGFuZCBtb2RpZnkgc29tZSBzZXR0aW5ncyBiZWZvcmUKK2NhbGxpbmcgPGtiZD5hbnQuY21kPC9rYmQ+LgorPC9wPgogCiA8cD4KLVRoZSBmaXJzdCBtZXRob2QgcnVucyBBbnQncyB0cmFkaXRpb25hbCBlbnRyeSBwb2ludC4gVGhlIHNlY29uZCBtZXRob2QgdXNlcwotdGhlIEFudCBMYXVuY2hlciBpbnRyb2R1Y2VkIGluIEFudCAxLjYuIFRoZSBmb3JtZXIgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQKLXRoZSAtbGliIG9wdGlvbiBhbmQgYWxsIHJlcXVpcmVkIGNsYXNzZXMgYXJlIGxvYWRlZCBmcm9tIHRoZSBDTEFTU1BBVEguIFlvdSBtdXN0Ci1lbnN1cmUgdGhhdCBhbGwgcmVxdWlyZWQgamFycyBhcmUgYXZhaWxhYmxlLiBBdCBhIG1pbmltdW0gdGhlIENMQVNTUEFUSCBzaG91bGQKLWluY2x1ZGU6CitTY3JpcHRzIDxrYmQ+ZW52c2V0LmNtZDwva2JkPiBhbmQgPGtiZD5ydW5yYy5jbWQ8L2tiZD4gcGVyZm9ybQorYXV4aWxpYXJ5IHRhc2tzLiBBbGwgc2NyaXB0cyBoYXZlIHNvbWUgZG9jdW1lbnRhdGlvbiBpbnNpZGUuCis8L3A+CisKKzxoMiBpZD0iYmFja2dyb3VuZCI+UnVubmluZyBBbnQgYXMgYSBiYWNrZ3JvdW5kIHByb2Nlc3Mgb24gVW5peCgtbGlrZSkgc3lzdGVtczwvaDI+CisKKzxwPgorSWYgeW91IHN0YXJ0IEFudCBhcyBhIGJhY2tncm91bmQgcHJvY2VzcyAobGlrZSBpbiA8a2JkPmFudAorJmFtcDs8L2tiZD4pIGFuZCB0aGUgYnVpbGQgcHJvY2VzcyBjcmVhdGVzIGFub3RoZXIgcHJvY2VzcywgQW50IHdpbGwKK2ltbWVkaWF0ZWx5IHRyeSB0byByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQsIHdoaWNoIGluIHR1cm4gd2lsbCBtb3N0CitsaWtlbHkgc3VzcGVuZCB0aGUgcHJvY2Vzcy4gIEluIG9yZGVyIHRvIGF2b2lkIHRoaXMsIHlvdSBtdXN0IHJlZGlyZWN0CitBbnQncyBzdGFuZGFyZCBpbnB1dCBvciBleHBsaWNpdGx5IHByb3ZpZGUgaW5wdXQgdG8gZWFjaCBzcGF3bmVkCitwcm9jZXNzIHZpYSB0aGUgaW5wdXQgcmVsYXRlZCBhdHRyaWJ1dGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRhc2tzLgorPC9wPgorCis8cD4KK1Rhc2tzIHRoYXQgY3JlYXRlIHN1Y2ggbmV3IHByb2Nlc3NlcworaW5jbHVkZSA8Y29kZT4mbHQ7ZXhlYyZndDs8L2NvZGU+LCA8Y29kZT4mbHQ7YXBwbHkmZ3Q7PC9jb2RlPgorb3IgPGNvZGU+Jmx0O2phdmEmZ3Q7PC9jb2RlPiB3aGVuIHRoZSA8dmFyPmZvcms8L3Zhcj4gYXR0cmlidXRlCitpcyA8cT50cnVlPC9xPi4KKzwvcD4KKworPGgyIGlkPSJ2aWFqYXZhIj5SdW5uaW5nIEFudCB2aWEgSmF2YTwvaDI+Cis8cD4KK0lmIHlvdSBoYXZlIGluc3RhbGxlZCBBbnQgaW4gdGhlIGRvLWl0LXlvdXJzZWxmIHdheSwgQW50IGNhbiBiZQorc3RhcnRlZCBmcm9tIG9uZSBvZiB0d28gZW50cnkgcG9pbnRzOgorPC9wPgorCis8cHJlIGNsYXNzPSJpbnB1dCI+amF2YSAtRGFudC5ob21lPWM6XGFudCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluIFtvcHRpb25zXSBbdGFyZ2V0XTwvcHJlPgorPHByZSBjbGFzcz0iaW5wdXQiPmphdmEgLURhbnQuaG9tZT1jOlxhbnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxhdW5jaGVyIFtvcHRpb25zXSBbdGFyZ2V0XTwvcHJlPgorCis8cD4KK1RoZSBmaXJzdCBtZXRob2QgcnVucyBBbnQncyB0cmFkaXRpb25hbCBlbnRyeSBwb2ludC4gVGhlIHNlY29uZCBtZXRob2QKK3VzZXMgdGhlIEFudCBMYXVuY2hlciBpbnRyb2R1Y2VkIGluIEFudCAxLjYuIFRoZSBmb3JtZXIgbWV0aG9kIGRvZXMKK25vdCBzdXBwb3J0IHRoZSA8a2JkPi1saWI8L2tiZD4gb3B0aW9uIGFuZCBhbGwgcmVxdWlyZWQgY2xhc3NlcyBhcmUKK2xvYWRlZCBmcm9tIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LiBZb3UgbXVzdCBlbnN1cmUgdGhhdCBhbGwKK3JlcXVpcmVkIGphcnMgYXJlIGF2YWlsYWJsZS4gQXQgYSBtaW5pbXVtIHRoZSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+CitzaG91bGQgaW5jbHVkZToKIDwvcD4KIAogPHVsPgotPGxpPjxjb2RlPmFudC5qYXI8L2NvZGU+IGFuZCA8Y29kZT5hbnQtbGF1bmNoZXIuamFyPC9jb2RlPjwvbGk+Cis8bGk+PHNhbXA+YW50Lmphcjwvc2FtcD4gYW5kIDxzYW1wPmFudC1sYXVuY2hlci5qYXI8L3NhbXA+PC9saT4KIDxsaT5qYXJzL2NsYXNzZXMgZm9yIHlvdXIgWE1MIHBhcnNlcjwvbGk+CiA8bGk+dGhlIEpESydzIHJlcXVpcmVkIGphci96aXAgZmlsZXM8L2xpPgogPC91bD4KIAogPHA+Ci1UaGUgbGF0dGVyIG1ldGhvZCBzdXBwb3J0cyB0aGUgLWxpYiwgLW5vdXNlcmxpYiwgLW5vY2xhc3NwYXRoIG9wdGlvbnMgYW5kIHdpbGwKLSAgICBsb2FkIGphcnMgZnJvbSB0aGUgc3BlY2lmaWVkIEFOVF9IT01FLiBZb3Ugc2hvdWxkIHN0YXJ0IHRoZSBsYXR0ZXIgd2l0aCB0aGUgbW9zdCBtaW5pbWFsCi1jbGFzc3BhdGggcG9zc2libGUsIGdlbmVyYWxseSBqdXN0IHRoZSBhbnQtbGF1bmNoZXIuamFyLgorVGhlIGxhdHRlciBtZXRob2Qgc3VwcG9ydHMKK3RoZSA8a2JkPi1saWI8L2tiZD4sIDxrYmQ+LW5vdXNlcmxpYjwva2JkPiwgPGtiZD4tbm9jbGFzc3BhdGg8L2tiZD4KK29wdGlvbnMgYW5kIHdpbGwgbG9hZCBqYXJzIGZyb20gdGhlCitzcGVjaWZpZWQgPGNvZGU+QU5UX0hPTUU8L2NvZGU+LiBZb3Ugc2hvdWxkIHN0YXJ0IHRoZSBsYXR0ZXIgd2l0aCB0aGUKK21vc3QgbWluaW1hbCBjbGFzc3BhdGggcG9zc2libGUsIGdlbmVyYWxseSBqdXN0Cit0aGUgPHNhbXA+YW50LWxhdW5jaGVyLmphcjwvc2FtcD4uCiA8L3A+CiAKLTxhIG5hbWU9InZpYWFudCIvPgotCis8cCBpZD0idmlhYW50Ij4KIEFudCBjYW4gYmUgc3RhcnRlZCBpbiBBbnQgdmlhIHRoZSA8Y29kZT4mbHQ7amF2YSZndDs8L2NvZGU+IGNvbW1hbmQuCiBIZXJlIGlzIGFuIGV4YW1wbGU6Ci0KKzwvcD4KIDxwcmU+Ci0mbHQ7amF2YQotICAgICAgICBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlciIKLSAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgZmFpbG9uZXJyb3I9InRydWUiCi0gICAgICAgIGRpcj0iJHtzdWIuYnVpbGRkaXJ9IgotICAgICAgICB0aW1lb3V0PSI0MDAwMDAwIgotICAgICAgICB0YXNrbmFtZT0ic3RhcnRBbnQiJmd0OworJmx0O2phdmEgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIiCisgICAgICBmb3JrPSJ0cnVlIgorICAgICAgZmFpbG9uZXJyb3I9InRydWUiCisgICAgICBkaXI9IiR7c3ViLmJ1aWxkZGlyfSIKKyAgICAgIHRpbWVvdXQ9IjQwMDAwMDAiCisgICAgICB0YXNrbmFtZT0ic3RhcnRBbnQiJmd0OwogICAgICZsdDtjbGFzc3BhdGgmZ3Q7CiAgICAgICAgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHthbnQuaG9tZX0vbGliL2FudC1sYXVuY2hlci5qYXIiLyZndDsKICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKQEAgLTY2Niw4ICs2NTgsNiBAQAogICAgICZsdDthcmcgdmFsdWU9IiR7c3ViLnRhcmdldH0iLyZndDsKICZsdDsvamF2YSZndDsKIDwvcHJlPgotPGJyPgotCiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC9ydW5uaW5nbGlzdC5odG1sIGIvbWFudWFsL3J1bm5pbmdsaXN0Lmh0bWwKaW5kZXggZTJiODAxMC4uYTUzZDQ4ZCAxMDA2NDQKLS0tIGEvbWFudWFsL3J1bm5pbmdsaXN0Lmh0bWwKKysrIGIvbWFudWFsL3J1bm5pbmdsaXN0Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KIDx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CkBAIC0yOSwxOCArMjksMTYgQEAKIAogPGgzPlJ1bm5pbmcgQXBhY2hlIEFudDwvaDM+CiA8dWwgY2xhc3M9ImlubGluZWxpc3QiPgotPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNjb21tYW5kbGluZSI+Q29tbWFuZCBMaW5lPC9hPjwvbGk+Ci08ZGl2IHN0eWxlPSJwYWRkaW5nLWxlZnQ6MWVtIj4KLSAgPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJydW5uaW5nLmh0bWwjbGlicyI+TGlicmFyeSBEaXJlY3RvcmllczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0icnVubmluZy5odG1sI2ZpbGVzIj5GaWxlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0icnVubmluZy5odG1sI2VudnZhcnMiPkVudmlyb25tZW50IFZhcmlhYmxlczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0icnVubmluZy5odG1sI3N5c3Byb3BzIj5KYXZhIFN5c3RlbSBQcm9wZXJ0aWVzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJydW5uaW5nLmh0bWwjY3lnd2luIj5DeWd3aW4gVXNlcnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvczIiPk9TLzIgVXNlcnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNiYWNrZ3JvdW5kIj5SdW5uaW5nICJpbiB0aGUgYmFja2dyb3VuZCI8L2E+PC9saT4KLTwvZGl2PgotPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCN2aWFqYXZhIj5SdW5uaW5nIEFudCB2aWEgSmF2YTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0icnVubmluZy5odG1sI2NvbW1hbmRsaW5lIj5Db21tYW5kIExpbmU8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvcHRpb25zIj5PcHRpb25zPC9hPjwvbGk+CisgIDxsaSBjbGFzcz0iaW5kZW50Ij48YSBocmVmPSJydW5uaW5nLmh0bWwjbGlicyI+TGlicmFyeSBEaXJlY3RvcmllczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0icnVubmluZy5odG1sI2ZpbGVzIj5GaWxlczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0icnVubmluZy5odG1sI2VudnZhcnMiPkVudmlyb25tZW50IFZhcmlhYmxlczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0icnVubmluZy5odG1sI3N5c3Byb3BzIj5KYXZhIFN5c3RlbSBQcm9wZXJ0aWVzPC9hPjwvbGk+CisgIDxsaSBjbGFzcz0iaW5kZW50Ij48YSBocmVmPSJydW5uaW5nLmh0bWwjY3lnd2luIj5DeWd3aW4gVXNlcnM8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNvczIiPk9TLzIgVXNlcnM8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCNiYWNrZ3JvdW5kIj5SdW5uaW5nICJpbiB0aGUgYmFja2dyb3VuZCI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9InJ1bm5pbmcuaHRtbCN2aWFqYXZhIj5SdW5uaW5nIEFudCB2aWEgSmF2YTwvYT48L2xpPgogPC91bD4KIAogPC9ib2R5PgpkaWZmIC0tZ2l0IGEvbWFudWFsL3N0eWxlc2hlZXRzL3N0eWxlLmNzcyBiL21hbnVhbC9zdHlsZXNoZWV0cy9zdHlsZS5jc3MKaW5kZXggY2YyNmM2MC4uODNlZTRiYiAxMDA2NDQKLS0tIGEvbWFudWFsL3N0eWxlc2hlZXRzL3N0eWxlLmNzcworKysgYi9tYW51YWwvc3R5bGVzaGVldHMvc3R5bGUuY3NzCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTUsNTMgKzE1LDE4NyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqLworYm9keSB7CisgICAgZm9udC1mYW1pbHk6ICJQYWxhdGlubyBMaW5vdHlwZSIsIFBhbGF0aW5vLCBHZW9yZ2lhLCAiQ2VudHVyeSBTY2hvb2xib29rIiwgc2VyaWY7Cit9CisKIGgyIHsKICAgZm9udC1zaXplOiAyMDAlOwotICBiYWNrZ3JvdW5kLWNvbG9yOiBmZmZmZmY7CisgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogfQogCiBoMyB7CiAgIGZvbnQtc2l6ZTogMTMwJTsKLSAgY29sb3I6ICAgICAjZmZmZmZmOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTI1RDc2OworICBjb2xvcjogd2hpdGU7CisgIGJhY2tncm91bmQtY29sb3I6ICM1MjVkNzY7CiB9CiAKIGg0IHsKLSAgY29sb3I6ICAjZmZmZmZmOwotICBiYWNrZ3JvdW5kLWNvbG9yOiAjODI4REE2OworICBjb2xvcjogd2hpdGU7CisgIGJhY2tncm91bmQtY29sb3I6ICM4MjhkYTY7CiB9CiAKLXRkIHsKLSAgIGJhY2tncm91bmQtY29sb3I6IGVlZWVlZTsKLSAgIGNvbG9yOiAgICAgICAgICAgIDAwMDAwMDsKK2g1IHsKKyAgZm9udC1zaXplOiAxMDAlOworICBjb2xvcjogd2hpdGU7CisgIGJhY2tncm91bmQtY29sb3I6ICNhNmFkYmU7CisgIG1hcmdpbi10b3A6IC41cmVtOworICBtYXJnaW4tYm90dG9tOiAuNXJlbTsKIH0KIAotLyogZmlyc3Qgcm93ICovCi10YWJsZSB0cjpmaXJzdC1jaGlsZCB0ZCB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiBjY2NjY2M7Ci0gICBjb2xvcjogICAgICAgICAgICAwMDAwMDA7CitoNiB7CisgIGZvbnQtc2l6ZTogMTAwJTsKKyAgY29sb3I6IHdoaXRlOworICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzFjNWQxOworICBtYXJnaW4tdG9wOiAuNXJlbTsKKyAgbWFyZ2luLWJvdHRvbTogLjVyZW07CiB9CiAKLS8qIG9yIHRoIGFzIGZpcnN0IHJvdyAqLwotdGFibGUgdGggewotICAgYmFja2dyb3VuZC1jb2xvcjogY2NjY2NjOwotICAgY29sb3I6ICAgICAgICAgICAgMDAwMDAwOworaDUgKyBwLCBoNiArIHAgeworICBtYXJnaW4tdG9wOiAuNXJlbTsKKyAgbWFyZ2luLWJvdHRvbTogLjVyZW07Cit9CisKK2gzID4gYSwgaDQgPiBhLCBoNSA+IGEsIGg2ID4gYSB7CisgICBjb2xvcjogd2hpdGU7Cit9CisKK2gzID4gYTp2aXNpdGVkLCBoNCA+IGE6dmlzaXRlZCwgaDUgPiBhOnZpc2l0ZWQsIGg2ID4gYTp2aXNpdGVkLAoraDMgPiBhOmhvdmVyLCBoNCA+IGE6aG92ZXIsIGg1ID4gYTpob3ZlciwgaDYgPiBhOmhvdmVyIHsKKyAgIGNvbG9yOiBsaWdodHNreWJsdWU7Cit9CisKK3ZhciB7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsKKyAgICBmb250LXNpemU6IDAuOHJlbTsKK30KKworcSB7CisgICAgZm9udC1mYW1pbHk6ICJMdWNpZGEgQ29uc29sZSIsIE1vbmFjbywgbW9ub3NwYWNlOworICAgIGZvbnQtc2l6ZTogMC44cmVtOworfQorCitxLm5vLWJyZWFrIHsKKyAgICB3aGl0ZS1zcGFjZTogbm93cmFwOworICAgIGh5cGhlbnM6IG5vbmU7Cit9CisKK2NvZGUsIHNhbXAsIGtiZCB7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKKyAgICBoeXBoZW5zOiBub25lOworICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07Cit9CisKK2gyID4gY29kZSwgaDIgPiBzYW1wIHsKKyAgICBmb250LXNpemU6IDJyZW07Cit9CisKK2gzID4gY29kZSwgaDMgPiBzYW1wIHsKKyAgICBmb250LXNpemU6IDEuNXJlbTsKK30KKworaDMgPiB2YXIgeworICAgIGZvbnQtc2l6ZTogMS4xMjVyZW07CiB9CiAKIHByZSB7Ci0gICBiYWNrZ3JvdW5kLWNvbG9yOiBlZmVmZWY7CisgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWZlZmVmOworICAgbWFyZ2luLXJpZ2h0OiA0cmVtOworICAgbWFyZ2luLWxlZnQ6IDRyZW07CisgICBmb250LXNpemU6IDEuMTI1cmVtOworfQorCitwcmUgdmFyLCBjb2RlIHZhciB7CisgICAgZm9udC1zaXplOiAwLjY1cmVtOwogfQogCiAvKiBjb2RlIHNuaXBwZXRzIGluIGV4YW1wbGVzIGFuZCB0dXRvcmlhbHMgKi8KLS5jb2RlIHsgCi0gICBiYWNrZ3JvdW5kOiAjRUZFRkVGOyAKLSAgIG1hcmdpbi10b3A6IAorLmNvZGUgeworICAgYmFja2dyb3VuZDogI2VmZWZlZjsKK30KKworLyogaGlnaGxpZ2h0IGNvbnNvbGUgaW5wdXQgKi8KKy5pbnB1dCwga2JkIHsKKyAgIGNvbG9yOiB3aGl0ZTsKKyAgIGJhY2tncm91bmQ6IGRhcmtzZWFncmVlbjsKKyAgIG92ZXJmbG93OiBoaWRkZW47CisgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKIH0KIAogLyogaGlnaGxpZ2h0IGNvbnNvbGUgb3V0cHV0ICovCi0ub3V0cHV0IHsgCi0gICBjb2xvcjogI0ZGRkZGRjsgCi0gICBiYWNrZ3JvdW5kOiAjODM3QTY3OyAKKy5vdXRwdXQgeworICAgY29sb3I6IHdoaXRlOworICAgYmFja2dyb3VuZDogIzgzN2E2NzsKKyAgIG92ZXJmbG93OiBoaWRkZW47CisgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKK30KKworLyogYSB3b3JrYXJvdW5kIGZvciBpbnZpc2libGUKKyAgICh3aGl0ZSBvbiB3aGl0ZSkgb3ZlcmZsb3dzICovCitwcmUuaW5wdXQ6aG92ZXIsIHByZS5vdXRwdXQ6aG92ZXIgeworICAgIG1hcmdpbi1yaWdodDogMDsKKyAgICBtYXJnaW4tbGVmdDogMDsKKyAgICBvdmVyZmxvdzogc2Nyb2xsOworICAgIHRleHQtb3ZlcmZsb3c6IGluaXRpYWw7Cit9CisKK3RkIHsKKyAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlZWVlOworICAgY29sb3I6IGJsYWNrOworfQorCit0cjpob3ZlciA+IHRkIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlOworfQorCit0aCB7CisgICBiYWNrZ3JvdW5kLWNvbG9yOiBzaWx2ZXI7CisgICBjb2xvcjogYmxhY2s7CisgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOworfQorCit0ZCBwcmUgeworICAgIG1hcmdpbjogMCAwIDAgMDsKKyAgICBmb250LXNpemU6IDFyZW07Cit9CisKK3RoZWFkLm5vLWJvbGQgdGggeworICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CisgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKK30KKwordGFibGUuYXR0ciB7CisgICAgd2lkdGg6IDEwMCU7Cit9CisKK3RhYmxlLmF0dHIgdGQ6Zmlyc3QtY2hpbGQgeworICAgIGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIHNhbnMtc2VyaWY7CisgICAgZm9udC1zaXplOiAwLjhyZW07CisgICAgZm9udC1zdHlsZTogaXRhbGljOworfQorCit0YWJsZS5hdHRyIHRkOmxhc3QtY2hpbGQgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKwordGFibGUuYXR0ciB0ZC5jZW50ZXIsIGgxLmNlbnRlciwgcC5jZW50ZXIgeworICAgIHRleHQtYWxpZ246IGNlbnRlcjsKK30KKwordGFibGUuYXR0ciB0ZC5sZWZ0IHsKKyAgICBmb250LWZhbWlseTogIlBhbGF0aW5vIExpbm90eXBlIiwgUGFsYXRpbm8sIEdlb3JnaWEsICJDZW50dXJ5IFNjaG9vbGJvb2siLCBzZXJpZjsKKyAgICBmb250LXNpemU6IDFyZW07CisgICAgZm9udC1zdHlsZTogbm9ybWFsOworICAgIHRleHQtYWxpZ246IGxlZnQ7Cit9CisKK3RhYmxlLmF0dHIgdGQudmFyIHsKKyAgICB0ZXh0LWFsaWduOiBsZWZ0OworfQorCit0ZFtyb3dzcGFuXSB7CisgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogfQogCiB1bC5pbmxpbmVsaXN0IHsKQEAgLTcwLDMgKzIwNCw2MCBAQAogICAgcGFkZGluZzogMDsKIH0KIAorbGkuaW5kZW50IHsKKyAgICBwYWRkaW5nLWxlZnQ6IDFyZW07Cit9CisKK2Rpdi5mbG9hdCB7CisgICAgbWFyZ2luLXRvcDogMC41cmVtOworICAgIHdpZHRoOiAxMDAlOworICAgIG1pbi1oZWlnaHQ6IDEuNXJlbTsKKyAgICBsaW5lLWhlaWdodDogMS41cmVtOworICAgIGJhY2tncm91bmQtY29sb3I6IHNpbHZlcjsKK30KKworZGl2LmZsb2F0ICsgdGFibGUgeworICAgIHdpZHRoOiAxMDAlOworICAgIHRhYmxlLWxheW91dDogZml4ZWQ7Cit9CisKK2Rpdi5mbG9hdCArIHRhYmxlIHRoOmZpcnN0LWNoaWxkIHsKKyAgICB3aWR0aDogMjAlOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK2Rpdi5mbG9hdCArIHRhYmxlIHRyOmZpcnN0LWNoaWxkIHsKKyAgICB3aWR0aDogMjAlOworICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Cit9CisKK3NwYW4ubGVmdCB7CisgICAgZmxvYXQ6IGxlZnQ7CisgICAgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgc2Fucy1zZXJpZjsKKyAgICBmb250LXdlaWdodDogYm9sZDsKK30KKworc3Bhbi5yaWdodCB7CisgICAgZmxvYXQ6IHJpZ2h0OworfQorCitzcGFuLmxlZnQsIHNwYW4ucmlnaHQgeworICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CisgICAgYmFja2dyb3VuZC1jb2xvcjogc2lsdmVyOworfQorCitvbC5yZWZzIHsKKyAgICBjb3VudGVyLXJlc2V0OiByZWZzOworfQorCitvbC5yZWZzID4gbGkgeworICAgIGxpc3Qtc3R5bGU6IG5vbmU7CisgICAgcG9zaXRpb246IHJlbGF0aXZlOworfQorCitvbC5yZWZzID4gbGk6YmVmb3JlIHsKKyAgICBjb250ZW50OiAiWyIgY291bnRlcihyZWZzLCBkZWNpbWFsKSAiXSI7CisgICAgY291bnRlci1pbmNyZW1lbnQ6IHJlZnM7CisgICAgcG9zaXRpb246IGFic29sdXRlOworICAgIGxlZnQ6IC0ycmVtOworfQpkaWZmIC0tZ2l0IGEvbWFudWFsL3N5c2NsYXNzcGF0aC5odG1sIGIvbWFudWFsL3N5c2NsYXNzcGF0aC5odG1sCmluZGV4IDVlZmIyMDguLmM3NmZmODcgMTAwNjQ0Ci0tLSBhL21hbnVhbC9zeXNjbGFzc3BhdGguaHRtbAorKysgYi9tYW51YWwvc3lzY2xhc3NwYXRoLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwyOCArMTUsMjcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LUxhbmd1YWdlIiBjb250ZW50PSJlbi11cyI+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogPHRpdGxlPmJ1aWxkLnN5c2NsYXNzcGF0aDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogCi08aDI+PGEgbmFtZT0ic3lzY2xhc3NwYXRoIj5idWlsZC5zeXNjbGFzc3BhdGg8L2E+PC9oMj4KLTxwPlRoZSB2YWx1ZSBvZiB0aGUgYnVpbGQuc3lzY2xhc3NwYXRoIHByb3BlcnR5Cis8aDIgaWQ9InN5c2NsYXNzcGF0aCI+YnVpbGQuc3lzY2xhc3NwYXRoPC9oMj4KKzxwPlRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YnVpbGQuc3lzY2xhc3NwYXRoPC9jb2RlPiBwcm9wZXJ0eQogY29udHJvbHMgaG93IHRoZSBzeXN0ZW0gY2xhc3NwYXRoLCBpLmUuIHRoZSBjbGFzc3BhdGggaW4gZWZmZWN0IHdoZW4KIEFwYWNoZSBBbnQgaXMgcnVuLCBhZmZlY3RzIHRoZSBiZWhhdmlvciBvZiBjbGFzc3BhdGhzIGluIEFudC4KIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHZhcmllcyBmcm9tIHRhc2sgdG8gdGFzay48L3A+CiAKIFRoZSB2YWx1ZXMgYW5kIHRoZWlyIG1lYW5pbmdzIGFyZToKIAotPHRhYmxlIGNlbGxzcGFjaW5nPSIyMCI+Ci08dHI+PHRoPnZhbHVlPC90aD48dGg+bWVhbmluZzwvdGg+PC90cj4KKzx0YWJsZT4KKzx0cj48dGggc2NvcGU9ImNvbCI+dmFsdWU8L3RoPjx0aCBzY29wZT0iY29sIj5tZWFuaW5nPC90aD48L3RyPgogPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+b25seTwvdGQ+Cis8dGQ+b25seTwvdGQ+CiA8dGQ+T25seSB0aGUgc3lzdGVtIGNsYXNzcGF0aCBpcyB1c2VkIGFuZCBjbGFzc3BhdGhzIHNwZWNpZmllZCBpbiBidWlsZCBmaWxlcywKIGV0YyBhcmUgaWdub3JlZC4gVGhpcyBzaXR1YXRpb24gY291bGQgYmUgY29uc2lkZXJlZCBhcyB0aGUgcGVyc29uIHJ1bm5pbmcKIHRoZSBidWlsZCBmaWxlIGtub3dzIG1vcmUgYWJvdXQgdGhlIGVudmlyb25tZW50IHRoYW4gdGhlIHBlcnNvbiB3cml0aW5nIHRoZQpAQCAtNDQsNyArNDQsNyBAQAogPC90cj4KIAogPHRyPgotPHRkIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+aWdub3JlPC90ZD4KKzx0ZD5pZ25vcmU8L3RkPgogPHRkPgogVGhlIHN5c3RlbSBjbGFzc3BhdGggaXMgaWdub3JlZC4gVGhpcyBzaXR1YXRpb24gaXMgdGhlIHJldmVyc2Ugb2YgdGhlCiBhYm92ZS4gVGhlIHBlcnNvbiBydW5uaW5nIHRoZSBidWlsZCB0cnVzdHMgdGhlIGJ1aWxkIGZpbGUgd3JpdGVyIHRvIGdldCB0aGUKQEAgLTUzLDcgKzUzLDcgQEAKIDwvdHI+CiAKIDx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPmxhc3Q8L3RkPgorPHRkPmxhc3Q8L3RkPgogPHRkPgogVGhlIGNsYXNzcGF0aCBpcyBjb25jYXRlbmF0ZWQgdG8gYW55IHNwZWNpZmllZCBjbGFzc3BhdGhzIGF0IHRoZSBlbmQuIFRoaXMKIGlzIGEgY29tcHJvbWlzZSwgd2hlcmUgdGhlIGJ1aWxkIGZpbGUgd3JpdGVyIGhhcyBwcmlvcml0eS4KQEAgLTYxLDcgKzYxLDcgQEAKIDwvdHI+CiAKIDx0cj4KLTx0ZCBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPmZpcnN0PC90ZD4KKzx0ZD5maXJzdDwvdGQ+CiA8dGQ+CiBBbnkgc3BlY2lmaWVkIGNsYXNzcGF0aHMgYXJlIGNvbmNhdGVuYXRlZCB0byB0aGUgc3lzdGVtIGNsYXNzcGF0aC4gVGhpcyBpcwogdGhlIG90aGVyIGZvcm0gb2YgY29tcHJvbWlzZSB3aGVyZSB0aGUgYnVpbGQgcnVubmVyIGhhcyBwcmlvcml0eS4KQEAgLTcwLDkgKzcwLDkgQEAKIDwvdGFibGU+CiAKIDxwPjxlbT5TaW5jZSBBbnQgMS43PC9lbT4gdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgYWxzbyBhZmZlY3RzIHRoZQotYm9vdGNsYXNzcGF0aCBzZXR0aW5ncy0taXQgY29tYmluZXMgdGhlIGJvb3RjbGFzc3BhdGggdGhhdCBoYXMgYmVlbgotc3BlY2lmaWVkIGZvciBhIHRhc2sgd2l0aCB0aGUgYm9vdGNsYXNzcGF0aCBvZiB0aGUgSmF2YSBWTSBydW5uaW5nCi1BbnQuICBJZiB0aGUgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldCwgaXQgZGVmYXVsdHMgdG8gImlnbm9yZSIgaW4KK2Jvb3RjbGFzc3BhdGggc2V0dGluZ3MmbWRhc2g7aXQgY29tYmluZXMgdGhlIGJvb3RjbGFzc3BhdGggdGhhdCBoYXMgYmVlbgorc3BlY2lmaWVkIGZvciBhIHRhc2sgd2l0aCB0aGUgYm9vdGNsYXNzcGF0aCBvZiB0aGUgSlZNIHJ1bm5pbmcKK0FudC4gIElmIHRoZSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LCBpdCBkZWZhdWx0cyB0byA8cT5pZ25vcmU8L3E+IGluCiB0aGlzIGNhc2UuPC9wPgogCiA8L2JvZHk+CmRpZmYgLS1naXQgYS9tYW51YWwvdGFyZ2V0cy5odG1sIGIvbWFudWFsL3RhcmdldHMuaHRtbAppbmRleCBhNzc4Yzk1Li5mOGQ2ZmYyIDEwMDY0NAotLS0gYS9tYW51YWwvdGFyZ2V0cy5odG1sCisrKyBiL21hbnVhbC90YXJnZXRzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxNiArMTUsMTUgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIAogPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogICA8dGl0bGU+VGFyZ2V0cyBhbmQgRXh0ZW5zaW9uLVBvaW50czwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgotICA8aDE+PGEgbmFtZT0idGFyZ2V0cyI+VGFyZ2V0czwvYT48L2gxPgorICA8aDEgaWQ9InRhcmdldHMiPlRhcmdldHM8L2gxPgogCiAgIDxwPkEgdGFyZ2V0IGlzIGEgY29udGFpbmVyIG9mIHRhc2tzIHRoYXQgY29vcGVyYXRlIHRvIHJlYWNoIGEKICAgICBkZXNpcmVkIHN0YXRlIGR1cmluZyB0aGUgYnVpbGQgcHJvY2Vzcy48L3A+CkBAIC0zMywyNyArMzMsMjUgQEAKICAgICBleGFtcGxlIHlvdSBtaWdodCBoYXZlIGEgdGFyZ2V0IGZvciBjb21waWxpbmcgYW5kIGEKICAgICB0YXJnZXQgZm9yIGNyZWF0aW5nIGEgZGlzdHJpYnV0YWJsZS4gWW91IGNhbiBvbmx5IGJ1aWxkIGEKICAgICBkaXN0cmlidXRhYmxlIHdoZW4geW91IGhhdmUgY29tcGlsZWQgZmlyc3QsIHNvIHRoZSBkaXN0cmlidXRlCi0gICAgdGFyZ2V0IDxpPmRlcGVuZHMgb248L2k+IHRoZSBjb21waWxlIHRhcmdldC48L3A+CisgICAgdGFyZ2V0IDxlbT5kZXBlbmRzIG9uPC9lbT4gdGhlIGNvbXBpbGUgdGFyZ2V0LjwvcD4KIAotICA8cD5BbnQgdHJpZXMgdG8gZXhlY3V0ZSB0aGUgdGFyZ2V0cyBpbiB0aGUgPGNvZGU+ZGVwZW5kczwvY29kZT4KKyAgPHA+QW50IHRyaWVzIHRvIGV4ZWN1dGUgdGhlIHRhcmdldHMgaW4gdGhlIDx2YXI+ZGVwZW5kczwvdmFyPgogICAgIGF0dHJpYnV0ZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgKGZyb20gbGVmdCB0byByaWdodCkuIEtlZXAgaW4KICAgICBtaW5kIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCBhIHRhcmdldCBjYW4gZ2V0IGV4ZWN1dGVkIGVhcmxpZXIKICAgICB3aGVuIGFuIGVhcmxpZXIgdGFyZ2V0IGRlcGVuZHMgb24gaXQ6PC9wPgogCi08YmxvY2txdW90ZT4KLTxwcmU+Jmx0O3RhcmdldCBuYW1lPSZxdW90O0EmcXVvdDsvJmd0OworICA8cHJlPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtBJnF1b3Q7LyZndDsKICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtCJnF1b3Q7IGRlcGVuZHM9JnF1b3Q7QSZxdW90Oy8mZ3Q7CiAmbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7QyZxdW90OyBkZXBlbmRzPSZxdW90O0ImcXVvdDsvJmd0OwogJmx0O3RhcmdldCBuYW1lPSZxdW90O0QmcXVvdDsgZGVwZW5kcz0mcXVvdDtDLEIsQSZxdW90Oy8mZ3Q7PC9wcmU+Ci08L2Jsb2NrcXVvdGU+CiAKICAgPHA+U3VwcG9zZSB3ZSB3YW50IHRvIGV4ZWN1dGUgdGFyZ2V0IEQuIEZyb20gaXRzCi0gICAgPGNvZGU+ZGVwZW5kczwvY29kZT4gYXR0cmlidXRlLCB5b3UgbWlnaHQgdGhpbmsgdGhhdCBmaXJzdCB0YXJnZXQKKyAgICA8dmFyPmRlcGVuZHM8L3Zhcj4gYXR0cmlidXRlLCB5b3UgbWlnaHQgdGhpbmsgdGhhdCBmaXJzdCB0YXJnZXQKICAgICBDLCB0aGVuIEIgYW5kIHRoZW4gQSBpcyBleGVjdXRlZC4gIFdyb25nISBDIGRlcGVuZHMgb24gQiwgYW5kIEIKICAgICBkZXBlbmRzIG9uIEEsIHNvIGZpcnN0IEEgaXMgZXhlY3V0ZWQsIHRoZW4gQiwgdGhlbiBDLCBhbmQgZmluYWxseQogICAgIEQuPC9wPgotICAgIAotICA8YmxvY2txdW90ZT48cHJlPjxiPkNhbGwtR3JhcGg6PC9iPiAgQSAtLT4gQiAtLT4gQyAtLT4gRDwvcHJlPjwvYmxvY2txdW90ZT4KKworICA8cHJlPjxiPkNhbGwtR3JhcGg6PC9iPiAgQSAmcmFycjsgQiAmcmFycjsgQyAmcmFycjsgRDwvcHJlPgogCiAgIDxwPkluIGEgY2hhaW4gb2YgZGVwZW5kZW5jaWVzIHN0cmV0Y2hpbmcgYmFjayBmcm9tIGEgZ2l2ZW4gdGFyZ2V0CiAgICAgc3VjaCBhcyBEIGFib3ZlLCBlYWNoIHRhcmdldCBnZXRzIGV4ZWN1dGVkIG9ubHkgb25jZSwgZXZlbiB3aGVuCkBAIC02MSw3ICs1OSw3IEBACiAgICAgd2lsbCBmaXJzdCByZXN1bHQgaW4gQyBiZWluZyBjYWxsZWQsIHdoaWNoIGluIHR1cm4gd2lsbCBmaXJzdCBjYWxsCiAgICAgQiwgd2hpY2ggaW4gdHVybiB3aWxsIGZpcnN0IGNhbGwgQS4gQWZ0ZXIgQSwgdGhlbiBCLCB0aGVuIEMgaGF2ZQogICAgIGV4ZWN1dGVkLCBleGVjdXRpb24gcmV0dXJucyB0byB0aGUgZGVwZW5kZW5jeSBsaXN0IG9mIEQsIHdoaWNoCi0gICAgd2lsbCA8dT5ub3Q8L3U+IGNhbGwgQiBhbmQgQSwgc2luY2UgdGhleSB3ZXJlIGFscmVhZHkgY2FsbGVkIGluCisgICAgd2lsbCA8c3Ryb25nPm5vdDwvc3Ryb25nPiBjYWxsIEIgYW5kIEEsIHNpbmNlIHRoZXkgd2VyZSBhbHJlYWR5IGNhbGxlZCBpbgogICAgIHByb2Nlc3Mgb2YgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGZvciBDIGFuZCBCIHJlc3BlY3RpdmVseSBhcwogICAgIGRlcGVuZGVuY2llcyBvZiBELiBIYWQgbm8gc3VjaCBkZXBlbmRlbmNpZXMgYmVlbiBkaXNjb3ZlcmVkIGluCiAgICAgcHJvY2Vzc2luZyBDIGFuZCBCLCBCIGFuZCBBIHdvdWxkIGhhdmUgYmVlbiBleGVjdXRlZCBhZnRlciBDIGluCkBAIC03MCw5ICs2OCw5IEBACiAgIDxwPkEgdGFyZ2V0IGFsc28gaGFzIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gaXRzIGV4ZWN1dGlvbiBpZiAob3IKICAgICB1bmxlc3MpIGEgcHJvcGVydHkgaGFzIGJlZW4gc2V0LiBUaGlzIGFsbG93cywgZm9yIGV4YW1wbGUsIGJldHRlcgogICAgIGNvbnRyb2wgb24gdGhlIGJ1aWxkaW5nIHByb2Nlc3MgZGVwZW5kaW5nIG9uIHRoZSBzdGF0ZSBvZiB0aGUKLSAgICBzeXN0ZW0gKGphdmEgdmVyc2lvbiwgT1MsIGNvbW1hbmQtbGluZSBwcm9wZXJ0eSBkZWZpbmVzLCBldGMuKS4KLSAgICBUbyBtYWtlIGEgdGFyZ2V0IDxpPnNlbnNlPC9pPiB0aGlzIHByb3BlcnR5LCB5b3Ugc2hvdWxkIGFkZAotICAgIHRoZSA8Y29kZT5pZjwvY29kZT4gKG9yIDxjb2RlPnVubGVzczwvY29kZT4pIGF0dHJpYnV0ZSB3aXRoIHRoZQorICAgIHN5c3RlbSAoSmF2YSB2ZXJzaW9uLCBPUywgY29tbWFuZC1saW5lIHByb3BlcnR5IGRlZmluZXMsIGV0Yy4pLgorICAgIFRvIG1ha2UgYSB0YXJnZXQgPGVtPnNlbnNlPC9lbT4gdGhpcyBwcm9wZXJ0eSwgeW91IHNob3VsZCBhZGQKKyAgICB0aGUgPHZhcj5pZjwvdmFyPiAob3IgPHZhcj51bmxlc3M8L3Zhcj4pIGF0dHJpYnV0ZSB3aXRoIHRoZQogICAgIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgdGhlIHRhcmdldCBzaG91bGQgcmVhY3QKICAgICB0by4gPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBJbiB0aGUgbW9zdCBzaW1wbGUgY2FzZSBBbnQgd2lsbCBvbmx5CiAgICAgY2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0LCB0aGUgdmFsdWUgZG9lc24ndCBtYXR0ZXIsCkBAIC04MSwyNSArNzksMjQgQEAKICAgICA8YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj50aGUgcHJvcGVydGllcyBwYWdlPC9hPiBmb3IKICAgICBtb3JlIGRldGFpbHMuICBGb3IgZXhhbXBsZTo8L3A+CiAKLTxibG9ja3F1b3RlPgogICA8cHJlPiZsdDt0YXJnZXQgbmFtZT0mcXVvdDtidWlsZC1tb2R1bGUtQSZxdW90OyBpZj0mcXVvdDttb2R1bGUtQS1wcmVzZW50JnF1b3Q7LyZndDs8L3ByZT4KICAgPHByZT4mbHQ7dGFyZ2V0IG5hbWU9JnF1b3Q7YnVpbGQtb3duLWZha2UtbW9kdWxlLUEmcXVvdDsgdW5sZXNzPSZxdW90O21vZHVsZS1BLXByZXNlbnQmcXVvdDsvJmd0OzwvcHJlPgotPC9ibG9ja3F1b3RlPgogCiAgIDxwPkluIHRoZSBmaXJzdCBleGFtcGxlLCBpZiB0aGUgPGNvZGU+bW9kdWxlLUEtcHJlc2VudDwvY29kZT4KLSAgICBwcm9wZXJ0eSBpcyBzZXQgKHRvIGFueSB2YWx1ZSwgZS5nLiA8aT5mYWxzZTwvaT4pLCB0aGUgdGFyZ2V0IHdpbGwKKyAgICBwcm9wZXJ0eSBpcyBzZXQgKHRvIGFueSB2YWx1ZSwgZS5nLiA8cT5mYWxzZTwvcT4pLCB0aGUgdGFyZ2V0IHdpbGwKICAgICBiZSBydW4uIEluIHRoZSBzZWNvbmQgZXhhbXBsZSwgaWYKICAgICB0aGUgPGNvZGU+bW9kdWxlLUEtcHJlc2VudDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IChhZ2FpbiwgdG8gYW55CiAgICAgdmFsdWUpLCB0aGUgdGFyZ2V0IHdpbGwgbm90IGJlIHJ1bi48L3A+CiAKLSAgPHA+T25seSBvbmUgcHJvcGVydHluYW1lIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIGlmL3VubGVzcwotICAgIGNsYXVzZS4gSWYgeW91IHdhbnQgdG8gY2hlY2sgbXVsdGlwbGUgY29uZGl0aW9ucywgeW91IGNhbiB1c2UgYQotICAgIGRlcGVuZGVudCB0YXJnZXQgZm9yIGNvbXB1dGluZyB0aGUgcmVzdWx0IGZvciB0aGUgY2hlY2s6PC9wPgorICA8cD5Pbmx5IG9uZSBwcm9wZXJ0eSBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgaW4KKyAgICB0aGUgPHZhcj5pZjwvdmFyPi88dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGUuIElmIHlvdSB3YW50IHRvCisgICAgY2hlY2sgbXVsdGlwbGUgY29uZGl0aW9ucywgeW91IGNhbiB1c2UgYSBkZXBlbmRlbnQgdGFyZ2V0IGZvcgorICAgIGNvbXB1dGluZyB0aGUgcmVzdWx0IGZvciB0aGUgY2hlY2s6PC9wPgogCi08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDt0YXJnZXQgbmFtZT0ibXlUYXJnZXQiIGRlcGVuZHM9Im15VGFyZ2V0LmNoZWNrIiBpZj0ibXlUYXJnZXQucnVuIiZndDsKICAgICAmbHQ7ZWNobyZndDtGaWxlcyBmb28udHh0IGFuZCBiYXIudHh0IGFyZSBwcmVzZW50LiZsdDsvZWNobyZndDsKLSZsdC90YXJnZXQmZ3Q7CismbHQ7L3RhcmdldCZndDsKIAogJmx0O3RhcmdldCBuYW1lPSJteVRhcmdldC5jaGVjayImZ3Q7CiAgICAgJmx0O2NvbmRpdGlvbiBwcm9wZXJ0eT0ibXlUYXJnZXQucnVuIiZndDsKQEAgLTEwOCwxNjIgKzEwNSwxNjMgQEAKICAgICAgICAgICAgICZsdDthdmFpbGFibGUgZmlsZT0iYmFyLnR4dCIvJmd0OwogICAgICAgICAmbHQ7L2FuZCZndDsKICAgICAmbHQ7L2NvbmRpdGlvbiZndDsKLSZsdC90YXJnZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3RhcmdldCZndDs8L3ByZT4KIAotICA8YmxvY2txdW90ZT48cHJlPjxiPkNhbGwtR3JhcGg6PC9iPiAgbXlUYXJnZXQuY2hlY2sgLS0+IG1heWJlKG15VGFyZ2V0KTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPHByZT48Yj5DYWxsLUdyYXBoOjwvYj4gIG15VGFyZ2V0LmNoZWNrICZyYXJyOyBtYXliZShteVRhcmdldCk8L3ByZT4KIAotICA8cD5JZiBubyA8Y29kZT5pZjwvY29kZT4gYW5kIG5vIDxjb2RlPnVubGVzczwvY29kZT4gYXR0cmlidXRlIGlzCisgIDxwPklmIG5vIDx2YXI+aWY8L3Zhcj4gYW5kIG5vIDx2YXI+dW5sZXNzPC92YXI+IGF0dHJpYnV0ZSBpcwogICAgIHByZXNlbnQsIHRoZSB0YXJnZXQgd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQuPC9wPgogCi0gIDxwPjxiPkltcG9ydGFudDo8L2I+IHRoZSA8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPnVubGVzczwvY29kZT4KKyAgPHA+PHN0cm9uZz5JbXBvcnRhbnQ8L3N0cm9uZz46IHRoZSA8dmFyPmlmPC92YXI+IGFuZCA8dmFyPnVubGVzczwvdmFyPgogICAgIGF0dHJpYnV0ZXMgb25seSBlbmFibGUgb3IgZGlzYWJsZSB0aGUgdGFyZ2V0IHRvIHdoaWNoIHRoZXkgYXJlCiAgICAgYXR0YWNoZWQuIFRoZXkgZG8gbm90IGNvbnRyb2wgd2hldGhlciBvciBub3QgdGFyZ2V0cyB0aGF0IGEKICAgICBjb25kaXRpb25hbCB0YXJnZXQgZGVwZW5kcyB1cG9uIGdldCBleGVjdXRlZC4gIEluIGZhY3QsIHRoZXkgZG8KICAgICBub3QgZXZlbiBnZXQgZXZhbHVhdGVkIHVudGlsIHRoZSB0YXJnZXQgaXMgYWJvdXQgdG8gYmUgZXhlY3V0ZWQsCiAgICAgYW5kIGFsbCBpdHMgcHJlZGVjZXNzb3JzIGhhdmUgYWxyZWFkeSBydW4uCiAKLSAgPHA+VGhlIG9wdGlvbmFsIDxjb2RlPmRlc2NyaXB0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KKyAgPHA+VGhlIG9wdGlvbmFsIDx2YXI+ZGVzY3JpcHRpb248L3Zhcj4gYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvCiAgICAgcHJvdmlkZSBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoaXMgdGFyZ2V0LCB3aGljaCBpcyBwcmludGVkIGJ5Ci0gICAgdGhlIDxjb2RlPi1wcm9qZWN0aGVscDwvY29kZT4gY29tbWFuZC1saW5lIG9wdGlvbi4gVGFyZ2V0cyB3aXRob3V0CisgICAgdGhlIDxrYmQ+LXByb2plY3RoZWxwPC9rYmQ+IGNvbW1hbmQtbGluZSBvcHRpb24uIFRhcmdldHMgd2l0aG91dAogICAgIHN1Y2ggYSBkZXNjcmlwdGlvbiBhcmUgZGVlbWVkIGludGVybmFsIGFuZCB3aWxsIG5vdCBiZSBsaXN0ZWQsCi0gICAgdW5sZXNzIGVpdGhlciB0aGUgPGNvZGU+LXZlcmJvc2U8L2NvZGU+IG9yIDxjb2RlPi1kZWJ1ZzwvY29kZT4KKyAgICB1bmxlc3MgZWl0aGVyIHRoZSA8a2JkPi12ZXJib3NlPC9rYmQ+IG9yIDxrYmQ+LWRlYnVnPC9rYmQ+CiAgICAgb3B0aW9uIGlzIHVzZWQuPC9wPgogCiAgIDxwPkl0IGlzIGEgZ29vZCBwcmFjdGljZSB0byBwbGFjZQogICAgIHlvdXIgPGEgaHJlZj0iVGFza3MvdHN0YW1wLmh0bWwiPnRzdGFtcDwvYT4gdGFza3MgaW4gYQotICAgIHNvLWNhbGxlZCA8aT5pbml0aWFsaXphdGlvbjwvaT4gdGFyZ2V0LCBvbiB3aGljaCBhbGwgb3RoZXIgdGFyZ2V0cworICAgIHNvLWNhbGxlZCA8ZW0+aW5pdGlhbGl6YXRpb248L2VtPiB0YXJnZXQsIG9uIHdoaWNoIGFsbCBvdGhlciB0YXJnZXRzCiAgICAgZGVwZW5kLiBNYWtlIHN1cmUgdGhhdCB0YXJnZXQgaXMgYWx3YXlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlCiAgICAgZGVwZW5kcyBsaXN0IG9mIHRoZSBvdGhlciB0YXJnZXRzLiBJbiB0aGlzIG1hbnVhbCwgbW9zdAogICAgIGluaXRpYWxpemF0aW9uIHRhcmdldHMgaGF2ZSB0aGUgbmFtZSA8Y29kZT4mcXVvdDtpbml0JnF1b3Q7PC9jb2RlPi48L3A+Ci0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7cHJvamVjdCZndDsKLSAgICAgICAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2luaXQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7dHN0YW1wLyZndDsKLSAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7Ci0gICAgICAgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtvdGhlclRhcmdldCZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAuLi4KLSAgICAgICAgJmx0Oy90YXJnZXQmZ3Q7Ci0gICAgJmx0Oy9wcm9qZWN0Jmd0OwotICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICA8cHJlPgorJmx0O3Byb2plY3QmZ3Q7CisgICAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2luaXQmcXVvdDsmZ3Q7CisgICAgICAgICZsdDt0c3RhbXAvJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0OworICAgICZsdDt0YXJnZXQgbmFtZT0mcXVvdDtvdGhlclRhcmdldCZxdW90OyBkZXBlbmRzPSZxdW90O2luaXQmcXVvdDsmZ3Q7CisgICAgICAgIC4uLgorICAgICZsdDsvdGFyZ2V0Jmd0OworJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCiAgIDxwPkVzcGVjaWFsbHkgaWYgeW91IG9ubHkgaGF2ZSBhIGZldyB0YXNrcyB5b3UgYWxzbyBjb3VsZCBwbGFjZSB0aGVzZQotICAgIHRhc2tzIGRpcmVjdGx5IHVuZGVyIHRoZSBwcm9qZWN0IHRhZyAoc2luY2UgQW50IDEuNi4wKTo8L3A+Ci0gICAgPGJsb2NrcXVvdGU+PHByZT4KLSAgICAmbHQ7cHJvamVjdCZndDsKLSAgICAgICAgJmx0O3RzdGFtcC8mZ3Q7Ci0gICAgJmx0Oy9wcm9qZWN0Jmd0OwotICAgIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAgICB0YXNrcyBkaXJlY3RseSB1bmRlciB0aGUgcHJvamVjdCB0YWcgKDxlbT5zaW5jZSBBbnQgMS42LjA8L2VtPik6PC9wPgorICA8cHJlPgorJmx0O3Byb2plY3QmZ3Q7CisgICAgJmx0O3RzdGFtcC8mZ3Q7CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLSAgPHA+SWYgdGhlIGRlcGVuZHMgYXR0cmlidXRlIGFuZCB0aGUgaWYvdW5sZXNzIGF0dHJpYnV0ZSBhcmUgc2V0LCB0aGUKLSAgICBkZXBlbmRzIGF0dHJpYnV0ZSBpcyBleGVjdXRlZCBmaXJzdC48L3A+CisgIDxwPklmIHRoZSA8dmFyPmRlcGVuZHM8L3Zhcj4gYXR0cmlidXRlIGFuZAorICB0aGUgPHZhcj5pZjwvdmFyPi88dmFyPnVubGVzczwvdmFyPiBhdHRyaWJ1dGUgYXJlIHNldCwKKyAgdGhlIDx2YXI+ZGVwZW5kczwvdmFyPiBhdHRyaWJ1dGUgaXMgZXhlY3V0ZWQgZmlyc3QuPC9wPgogCiAgIDxwPkEgdGFyZ2V0IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6PC9wPgogCi0gIDx0YWJsZSBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSIyIiBjZWxsc3BhY2luZz0iMCI+CisgIDx0YWJsZSBjbGFzcz0iYXR0ciI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+PGI+RGVzY3JpcHRpb248L2I+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgICAgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPm5hbWU8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgdGFyZ2V0LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPlllczwvdGQ+CisgICAgICA8dGQ+bmFtZTwvdGQ+CisgICAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHRhcmdldC48L3RkPgorICAgICAgPHRkPlllczwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmRlcGVuZHM8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5hIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIHRhcmdldHMgb24KKyAgICAgIDx0ZD5kZXBlbmRzPC90ZD4KKyAgICAgIDx0ZD5hIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIHRhcmdldHMgb24KICAgICAgICAgd2hpY2ggdGhpcyB0YXJnZXQgZGVwZW5kcy48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5pZjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IG11c3QgYmUgc2V0IGluCisgICAgICA8dGQ+aWY8L3RkPgorICAgICAgPHRkPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IG11c3QgYmUgc2V0IGluCiAgICAgICAgIG9yZGVyIGZvciB0aGlzIHRhcmdldCB0byBleGVjdXRlLAogICAgICAgICBvciA8YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5zb21ldGhpbmcgZXZhbHVhdGluZyB0bwotICAgICAgICAgIHRydWU8L2E+LjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vPC90ZD4KKyAgICAgICAgICA8cT50cnVlPC9xPjwvYT4uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnVubGVzczwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IG11c3Qgbm90IGJlIHNldAorICAgICAgPHRkPnVubGVzczwvdGQ+CisgICAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgbXVzdCBub3QgYmUgc2V0CiAgICAgICAgIGluIG9yZGVyIGZvciB0aGlzIHRhcmdldCB0byBleGVjdXRlLAogICAgICAgICBvciA8YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjaWYrdW5sZXNzIj5zb21ldGhpbmcgZXZhbHVhdGluZyB0bwotICAgICAgICBmYWxzZTwvYT4uPC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8cT5mYWxzZTwvcT48L2E+LjwvdGQ+CisgICAgICA8dGQ+Tm88L3RkPgogICAgIDwvdHI+CiAgICAgPHRyPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5kZXNjcmlwdGlvbjwvdGQ+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPmEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyB0YXJnZXQncyBmdW5jdGlvbi48L3RkPgotICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj5ObzwvdGQ+CisgICAgICA8dGQ+ZGVzY3JpcHRpb248L3RkPgorICAgICAgPHRkPmEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyB0YXJnZXQncyBmdW5jdGlvbi48L3RkPgorICAgICAgPHRkPk5vPC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+ZXh0ZW5zaW9uT2Y8L3RkPgotICAgICAgPHRkIHZhbGlnbj0idG9wIj5BZGRzIHRoZSBjdXJyZW50IHRhcmdldCB0byB0aGUgZGVwZW5kcyBsaXN0IG9mCisgICAgICA8dGQ+ZXh0ZW5zaW9uT2Y8L3RkPgorICAgICAgPHRkPkFkZHMgdGhlIGN1cnJlbnQgdGFyZ2V0IHRvIHRoZSBkZXBlbmRzIGxpc3Qgb2YKICAgICAgICAgdGhlIG5hbWVkIDxhIGhyZWY9IiNleHRlbnNpb24tcG9pbnRzIj5leHRlbnNpb24tcG9pbnQ8L2E+LgotICAgICAgICA8ZW0+c2luY2UgQW50IDEuOC4wLjwvZW0+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgICAgICA8ZW0+c2luY2UgQW50IDEuOC4wPC9lbT4uPC90ZD4KKyAgICAgIDx0ZD5ObzwvdGQ+CiAgICAgPC90cj4KICAgICA8dHI+Ci0gICAgICA8dGQgdmFsaWduPSJ0b3AiPm9uTWlzc2luZ0V4dGVuc2lvblBvaW50PC90ZD4KLSAgICAgIDx0ZCB2YWxpZ249InRvcCI+V2hhdCB0byBkbyBpZiB0aGlzIHRhcmdldCB0cmllcyB0byBleHRlbmQgYQorICAgICAgPHRkPm9uTWlzc2luZ0V4dGVuc2lvblBvaW50PC90ZD4KKyAgICAgIDx0ZD5XaGF0IHRvIGRvIGlmIHRoaXMgdGFyZ2V0IHRyaWVzIHRvIGV4dGVuZCBhCiAgICAgICAgIG1pc3NpbmcKLSAgICAgICAgPGEgaHJlZj0iI2V4dGVuc2lvbi1wb2ludHMiPmV4dGVuc2lvbi1wb2ludDwvYT4uICgiZmFpbCIsCi0gICAgICAgICJ3YXJuIiwgImlnbm9yZSIpLgotICAgICAgICA8ZW0+c2luY2UgQW50IDEuOC4yLjwvZW0+PC90ZD4KLSAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm8uIE5vdCBhbGxvd2VkIHVubGVzcwotICAgICAgICA8Y29kZT5leHRlbnNpb25PZjwvY29kZT4gaXMgcHJlc2VudC4gRGVmYXVsdHMgdG8gPGNvZGU+ZmFpbDwvY29kZT4uIAorICAgICAgICA8YSBocmVmPSIjZXh0ZW5zaW9uLXBvaW50cyI+ZXh0ZW5zaW9uLXBvaW50PC9hPi4gKDxxPmZhaWw8L3E+LAorICAgICAgICA8cT53YXJuPC9xPiwgPHE+aWdub3JlPC9xPikuCisgICAgICAgIDxlbT5zaW5jZSBBbnQgMS44LjI8L2VtPi48L3RkPgorICAgICAgPHRkPk5vOyBub3QgYWxsb3dlZCB1bmxlc3MKKyAgICAgICAgPHZhcj5leHRlbnNpb25PZjwvdmFyPiBpcyBwcmVzZW50LCBkZWZhdWx0cyB0byA8cT5mYWlsPC9xPi4KICAgICAgIDwvdGQ+CiAgICAgPC90cj4KICAgPC90YWJsZT4KIAogICA8cD5BIHRhcmdldCBuYW1lIGNhbiBiZSBhbnkgYWxwaGFudW1lcmljIHN0cmluZyB2YWxpZCBpbiB0aGUKLSAgICBlbmNvZGluZyBvZiB0aGUgWE1MIGZpbGUuIFRoZSBlbXB0eSBzdHJpbmcgJnF1b3Q7JnF1b3Q7IGlzIGluIHRoaXMKLSAgICBzZXQsIGFzIGlzIGNvbW1hICZxdW90OywmcXVvdDsgYW5kIHNwYWNlICZxdW90OyAmcXVvdDsuICBQbGVhc2UKLSAgICBhdm9pZCB1c2luZyB0aGVzZSwgYXMgdGhleSB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIEFudAotICAgIHZlcnNpb25zIGJlY2F1c2Ugb2YgYWxsIHRoZSBjb25mdXNpb24gdGhleSBjYXVzZSBvbiBjb21tYW5kIGxpbmUgYW5kIElERS4gSURFIHN1cHBvcnQgb2YKLSAgICB1bnVzdWFsIHRhcmdldCBuYW1lcywgb3IgYW55IHRhcmdldCBuYW1lIGNvbnRhaW5pbmcgc3BhY2VzLCB2YXJpZXMKLSAgICB3aXRoIHRoZSBJREUuPC9wPgorICAgIGVuY29kaW5nIG9mIHRoZSBYTUwgZmlsZS4gVGhlIGVtcHR5IHN0cmluZyA8cT48L3E+IGlzIGluIHRoaXMgc2V0LAorICAgIGFzIGlzIGNvbW1hIDxxPiw8L3E+IGFuZCBzcGFjZSA8cT4mbmJzcDs8L3E+LiBQbGVhc2UgYXZvaWQgdXNpbmcKKyAgICB0aGVzZSwgYXMgdGhleSB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gZnV0dXJlIEFudCB2ZXJzaW9ucworICAgIGJlY2F1c2Ugb2YgYWxsIHRoZSBjb25mdXNpb24gdGhleSBjYXVzZSBvbiBjb21tYW5kIGxpbmUgYW5kCisgICAgSURFLiBJREUgc3VwcG9ydCBvZiB1bnVzdWFsIHRhcmdldCBuYW1lcywgb3IgYW55IHRhcmdldCBuYW1lCisgICAgY29udGFpbmluZyBzcGFjZXMsIHZhcmllcyB3aXRoIHRoZSBJREUuPC9wPgogCi0gIDxwPlRhcmdldHMgYmVnaW5uaW5nIHdpdGggYSBoeXBoZW4gc3VjaAotICAgIGFzIDxjb2RlPiZxdW90Oy1yZXN0YXJ0JnF1b3Q7PC9jb2RlPiBhcmUgdmFsaWQsIGFuZCBjYW4gYmUgdXNlZCB0bwotICAgIG5hbWUgdGFyZ2V0cyB0aGF0IHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQKLSAgICBsaW5lLiA8YnI+Ci0gICAgRm9yIEFudHMgbWFpbiBjbGFzcyBldmVyeSBvcHRpb24gc3RhcnRpbmcgd2l0aCBoeXBoZW4gaXMgYW4KLSAgICBvcHRpb24gZm9yIEFudCBpdHNlbGYgYW5kIG5vdCBhIHRhcmdldC4gRm9yIHRoYXQgcmVhc29uIGNhbGxpbmcgdGhlc2UKLSAgICB0YXJnZXQgZnJvbSBjb21tYW5kIGxpbmUgaXMgbm90IHBvc3NpYmxlLiBPbiB0aGUgb3RoZXIgaGFuZCBJREVzIHVzdWFsbHkKLSAgICBkb24ndCB1c2UgQW50cyBtYWluIGNsYXNzIGFzIGVudHJ5IHBvaW50IGFuZCBjYWxsaW5nIHRoZW0gZnJvbSB0aGUgSURFCi0gICAgaXMgdXN1YWxseSBwb3NzaWJsZS48L3A+CisgIDxwPlRhcmdldHMgYmVnaW5uaW5nIHdpdGggYSBoeXBoZW4gc3VjaCBhcyA8cT4tcmVzdGFydDwvcT4gYXJlCisgICAgdmFsaWQsIGFuZCBjYW4gYmUgdXNlZCB0byBuYW1lIHRhcmdldHMgdGhhdCBzaG91bGQgbm90IGJlIGNhbGxlZAorICAgIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZS48YnIvPgorICAgIEZvciBBbnQncyBtYWluIGNsYXNzIGV2ZXJ5IG9wdGlvbiBzdGFydGluZyB3aXRoIGh5cGhlbiBpcyBhbgorICAgIG9wdGlvbiBmb3IgQW50IGl0c2VsZiBhbmQgbm90IGEgdGFyZ2V0LiBGb3IgdGhhdCByZWFzb24gY2FsbGluZworICAgIHRoZXNlIHRhcmdldHMgZnJvbSBjb21tYW5kIGxpbmUgaXMgbm90IHBvc3NpYmxlLiBPbiB0aGUgb3RoZXIKKyAgICBoYW5kLCBJREVzIHVzdWFsbHkgZG9uJ3QgdXNlIEFudCdzIG1haW4gY2xhc3MgYXMgZW50cnkgcG9pbnQgYW5kCisgICAgY2FsbGluZyB0aGVtIGZyb20gdGhlIElERSBpcyB1c3VhbGx5IHBvc3NpYmxlLjwvcD4KIAotICA8aDE+PGEgbmFtZT0iZXh0ZW5zaW9uLXBvaW50cyI+RXh0ZW5zaW9uLVBvaW50czwvYT48L2gxPgorICA8aDEgaWQ9ImV4dGVuc2lvbi1wb2ludHMiPkV4dGVuc2lvbi1Qb2ludHM8L2gxPgogCi0gIDxwPjxlbT5zaW5jZSBBbnQgMS44LjAuPC9lbT48L3A+CisgIDxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPi48L3A+CiAKLSAgPHA+RXh0ZW5zaW9uLVBvaW50cyBhcmUgc2ltaWxhciB0byB0YXJnZXRzIGluIHRoYXQgdGhleSBoYXZlIGEgbmFtZSBhbmQKLSAgICBhIGRlcGVuZHMgbGlzdCBhbmQgY2FuIGJlIGV4ZWN1dGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gIEp1c3QKLSAgICBsaWtlIHRhcmdldHMgdGhleSByZXByZXNlbnQgYSBzdGF0ZSBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuPC9wPgorICA8cD5FeHRlbnNpb24tUG9pbnRzIGFyZSBzaW1pbGFyIHRvIHRhcmdldHMgaW4gdGhhdCB0aGV5IGhhdmUgYSBuYW1lCisgICAgYW5kIGEgPHZhcj5kZXBlbmRzPC92YXI+IGxpc3QgYW5kIGNhbiBiZSBleGVjdXRlZCBmcm9tIHRoZSBjb21tYW5kCisgICAgbGluZS4gIEp1c3QgbGlrZSB0YXJnZXRzIHRoZXkgcmVwcmVzZW50IGEgc3RhdGUgZHVyaW5nIHRoZSBidWlsZAorICAgIHByb2Nlc3MuPC9wPgogCiAgIDxwPlVubGlrZSB0YXJnZXRzIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgdGFza3MsIHRoZWlyIG1haW4gcHVycG9zZQogICAgIGlzIHRvIGNvbGxlY3QgdGFyZ2V0cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgc3RhdGUgaW4KLSAgICB0aGVpciBkZXBlbmRzIGxpc3QuPC9wPgorICAgIHRoZWlyIDx2YXI+ZGVwZW5kczwvdmFyPiBsaXN0LjwvcD4KIAotICA8cD5UYXJnZXRzIGNhbiBhZGQgdGhlbXNlbHZlcyB0byBhbiBleHRlbnNpb24tcG9pbnRzJ3MgZGVwZW5kcyBsaXN0IHZpYQotICAgIHRoZWlyIGV4dGVuc2lvbk9mIGF0dHJpYnV0ZS4gIFRoZSB0YXJnZXRzIHRoYXQgYWRkIHRoZW1zZWx2ZXMgd2lsbCBiZQotICAgIGFkZGVkIGFmdGVyIHRoZSB0YXJnZXRzIG9mIHRoZSBleHBsaWNpdCBkZXBlbmRzLWF0dHJpYnV0ZSBvZiB0aGUKLSAgICBleHRlbnNpb24tcG9pbnQsIGlmIG11bHRpcGxlIHRhcmdldHMgYWRkIHRoZW1zZWx2ZXMsIHRoZWlyIHJlbGF0aXZlCi0gICAgb3JkZXIgaXMgbm90IGRlZmluZWQuPC9wPgorICA8cD5UYXJnZXRzIGNhbiBhZGQgdGhlbXNlbHZlcyB0byBhbgorICAgIGV4dGVuc2lvbi1wb2ludCdzIDx2YXI+ZGVwZW5kczwvdmFyPiBsaXN0IHZpYQorICAgIHRoZWlyIDx2YXI+ZXh0ZW5zaW9uT2Y8L3Zhcj4gYXR0cmlidXRlLiAgVGhlIHRhcmdldHMgdGhhdCBhZGQKKyAgICB0aGVtc2VsdmVzIHdpbGwgYmUgYWRkZWQgYWZ0ZXIgdGhlIHRhcmdldHMgb2YgdGhlCisgICAgZXhwbGljaXQgPHZhcj5kZXBlbmRzPC92YXI+IGF0dHJpYnV0ZSBvZiB0aGUgZXh0ZW5zaW9uLXBvaW50LCBpZgorICAgIG11bHRpcGxlIHRhcmdldHMgYWRkIHRoZW1zZWx2ZXMsIHRoZWlyIHJlbGF0aXZlIG9yZGVyIGlzIG5vdAorICAgIGRlZmluZWQuPC9wPgogCiAgIDxwPlRoZSBtYWluIHB1cnBvc2Ugb2YgYW4gZXh0ZW5zaW9uLXBvaW50IGlzIHRvIGFjdCBhcyBhbiBleHRlbnNpb24KICAgICBwb2ludCBmb3IgYnVpbGQgZmlsZXMgZGVzaWduZWQgdG8KICAgICBiZSA8YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+aW1wb3J0ZWQ8L2E+LiAgSW4gdGhlIGltcG9ydGVkCi0gICAgZmlsZSBhbiBleHRlbnNpb24tcG9pbnQgZGVmaW5lcyBhIHN0YXRlIHRoYXQgbXVzdCBiZSByZWFjaGVkIGFuZAotICAgIHRhcmdldHMgZnJvbSBvdGhlciBidWlsZCBmaWxlcyBjYW4gam9pbiB0aGUgZGVwZW5kcyBsaXN0IG9mIHNhaWQKLSAgICBleHRlbnNpb24tcG9pbnQgaW4gb3JkZXIgdG8gY29udHJpYnV0ZSB0byB0aGF0IHN0YXRlLjwvcD4KKyAgICBmaWxlLCBhbiBleHRlbnNpb24tcG9pbnQgZGVmaW5lcyBhIHN0YXRlIHRoYXQgbXVzdCBiZSByZWFjaGVkIGFuZAorICAgIHRhcmdldHMgZnJvbSBvdGhlciBidWlsZCBmaWxlcyBjYW4gam9pbiB0aGUgPHZhcj5kZXBlbmRzPC92YXI+CisgICAgbGlzdCBvZiBzYWlkIGV4dGVuc2lvbi1wb2ludCBpbiBvcmRlciB0byBjb250cmlidXRlIHRvIHRoYXQKKyAgICBzdGF0ZS48L3A+CiAKICAgPHA+Rm9yIGV4YW1wbGUgeW91ciBpbXBvcnRlZCBidWlsZCBmaWxlIG1heSBuZWVkIHRvIGNvbXBpbGUgY29kZSwgaXQKICAgICBtaWdodCBsb29rIGxpa2U6PC9wPgotPGJsb2NrcXVvdGU+PHByZT4KKzxwcmU+CiAmbHQ7dGFyZ2V0IG5hbWU9ImNyZWF0ZS1kaXJlY3RvcnktbGF5b3V0IiZndDsKICAgIC4uLgogJmx0Oy90YXJnZXQmZ3Q7CkBAIC0yNzEsMzAgKzI2OSwyNiBAQAogICAgICAgICAgICAgICBkZXBlbmRzPSJjcmVhdGUtZGlyZWN0b3J5LWxheW91dCIvJmd0OwogJmx0O3RhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJyZWFkeS10by1jb21waWxlIiZndDsKICAgIC4uLgotJmx0Oy90YXJnZXQmZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+CismbHQ7L3RhcmdldCZndDs8L3ByZT4KIAotICA8YmxvY2txdW90ZT48cHJlPjxiPkNhbGwtR3JhcGg6PC9iPiAgY3JlYXRlLWRpcmVjdG9yeS1sYXlvdXQgLS0+ICdlbXB0eSBzbG90JyAtLT4gY29tcGlsZTwvcHJlPjwvYmxvY2txdW90ZT4KLQorICA8cHJlPjxiPkNhbGwtR3JhcGg6PC9iPiAgY3JlYXRlLWRpcmVjdG9yeS1sYXlvdXQgJnJhcnI7ICdlbXB0eSBzbG90JyAmcmFycjsgY29tcGlsZTwvcHJlPgogCiAgIDxwPkFuZCB5b3UgbmVlZCB0byBnZW5lcmF0ZSBzb21lIHNvdXJjZSBiZWZvcmUgY29tcGlsYXRpb24sIHRoZW4gaW4KICAgICB5b3VyIG1haW4gYnVpbGQgZmlsZSB5b3UgbWF5IHVzZSBzb21ldGhpbmcgbGlrZTwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Cis8cHJlPgogJmx0O3RhcmdldCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIgogICAgICAgICBleHRlbnNpb25PZj0icmVhZHktdG8tY29tcGlsZSImZ3Q7CiAgICAuLi4KLSZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgorJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKLSAgPGJsb2NrcXVvdGU+PHByZT48Yj5DYWxsLUdyYXBoOjwvYj4gIGNyZWF0ZS1kaXJlY3RvcnktbGF5b3V0IC0tPiBnZW5lcmF0ZS1zb3VyY2VzICAtLT4gY29tcGlsZTwvcHJlPjwvYmxvY2txdW90ZT4KKyAgPHByZT48Yj5DYWxsLUdyYXBoOjwvYj4gIGNyZWF0ZS1kaXJlY3RvcnktbGF5b3V0ICZyYXJyOyBnZW5lcmF0ZS1zb3VyY2VzICAmcmFycjsgY29tcGlsZTwvcHJlPgogCi0KLSAgPHA+VGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSA8ZW0+Z2VuZXJhdGUtc291cmNlczwvZW0+IHRhcmdldCBpcwotICAgIGV4ZWN1dGVkIGJlZm9yZSB0aGUgPGVtPmNvbXBpbGU8L2VtPiB0YXJnZXQuPC9wPgorICA8cD5UaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIDxxPmdlbmVyYXRlLXNvdXJjZXM8L3E+IHRhcmdldCBpcworICAgIGV4ZWN1dGVkIGJlZm9yZSB0aGUgPHE+Y29tcGlsZTwvcT4gdGFyZ2V0LjwvcD4KIAogICA8cD5Eb24ndCByZWx5IG9uIHRoZSBvcmRlciBvZiB0aGUgZGVwZW5kcyBsaXN0LAotICAgIGlmIDxlbT5nZW5lcmF0ZS1zb3VyY2VzPC9lbT4gZGVwZW5kcwotICAgIG9uIDxlbT5jcmVhdGUtZGlyZWN0b3J5LWxheW91dDwvZW0+IHRoZW4gaXQgbXVzdCBleHBsaWNpdGx5IGRlcGVuZAorICAgIGlmIDxxPmdlbmVyYXRlLXNvdXJjZXM8L3E+IGRlcGVuZHMKKyAgICBvbiA8cT5jcmVhdGUtZGlyZWN0b3J5LWxheW91dDwvcT4gdGhlbiBpdCBtdXN0IGV4cGxpY2l0bHkgZGVwZW5kCiAgICAgb24gaXQgdmlhIGl0cyBvd24gZGVwZW5kcyBhdHRyaWJ1dGUuPC9wPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL3Rhc2tsaXN0Lmh0bWwgYi9tYW51YWwvdGFza2xpc3QuaHRtbAppbmRleCA2NTc4ZTU1Li41NTNhZmIzIDEwMDY0NAotLS0gYS9tYW51YWwvdGFza2xpc3QuaHRtbAorKysgYi9tYW51YWwvdGFza2xpc3QuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KQEAgLTM0LDE2MiArMzQsMTY2IEBACiAKIDxoMz5UYXNrczwvaDM+CiA8dWwgY2xhc3M9ImlubGluZWxpc3QiPgotPGxpPjxhIGhyZWY9IlRhc2tzL2FudC5odG1sIj5BbnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hbnRjYWxsLmh0bWwiPkFudENhbGw8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hbnRsci5odG1sIj5BTlRMUjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2FudHN0cnVjdHVyZS5odG1sIj5BbnRTdHJ1Y3R1cmU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hbnR2ZXJzaW9uLmh0bWwiPkFudFZlcnNpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hcHBseS5odG1sIj5BcHBseS88aT5FeGVjT248L2k+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvYXB0Lmh0bWwiPkFwdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2F0dHJpYi5odG1sIj5BdHRyaWI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hdWdtZW50Lmh0bWwiPkF1Z21lbnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9hdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvYmFzZW5hbWUuaHRtbCI+QmFzZW5hbWU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9iaW5kdGFyZ2V0cy5odG1sIj5CaW5kdGFyZ2V0czwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2J1aWxkbnVtYmVyLmh0bWwiPkJ1aWxkTnVtYmVyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvdW5wYWNrLmh0bWwiPkJVbnppcDI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9wYWNrLmh0bWwiPkJaaXAyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvY2FiLmh0bWwiPkNhYjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NjbS5odG1sIj5Db250aW51dXMvU3luZXJneSBUYXNrczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NoYW5nZWxvZy5odG1sIj5DdnNDaGFuZ2VMb2c8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jaGVja3N1bS5odG1sIj5DaGVja3N1bTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NoZ3JwLmh0bWwiPkNoZ3JwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvY2htb2QuaHRtbCI+Q2htb2Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jaG93bi5odG1sIj5DaG93bjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NsZWFyY2FzZS5odG1sIj5DbGVhcmNhc2UgVGFza3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jb21wb25lbnRkZWYuaHRtbCI+Q29tcG9uZW50ZGVmPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvY29uY2F0Lmh0bWwiPkNvbmNhdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NvbmRpdGlvbi5odG1sIj5Db25kaXRpb248L2E+PC9saT4KLTxkaXYgc3R5bGU9InBhZGRpbmctbGVmdDoxZW0iPgotICA8bGk+PGEgaHJlZj0iVGFza3MvY29uZGl0aW9ucy5odG1sIj5TdXBwb3J0ZWQgY29uZGl0aW9uczwvYT48L2xpPgotPC9kaXY+Ci08bGk+PGEgaHJlZj0iVGFza3MvY29weS5odG1sIj5Db3B5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvY29weWRpci5odG1sIj48aT5Db3B5ZGlyPC9pPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2NvcHlmaWxlLmh0bWwiPjxpPkNvcHlmaWxlPC9pPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2N2cy5odG1sIj5DdnM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jdnNwYXNzLmh0bWwiPkNWU1Bhc3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jdnN0YWdkaWZmLmh0bWwiPkN2c1RhZ0RpZmY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9jdnN2ZXJzaW9uLmh0bWwiPkN2c1ZlcnNpb248L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbCI+RGVmYXVsdGV4Y2x1ZGVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZGVsZXRlLmh0bWwiPkRlbGV0ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2RlbHRyZWUuaHRtbCI+PGk+RGVsdHJlZTwvaT48L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9kZXBlbmQuaHRtbCI+RGVwZW5kPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZGVwZW5kc2V0Lmh0bWwiPkRlcGVuZHNldDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2RpYWdub3N0aWNzLmh0bWwiPkRpYWdub3N0aWNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZGlybmFtZS5odG1sIj5EaXJuYW1lPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZWFyLmh0bWwiPkVhcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2VjaG8uaHRtbCI+RWNobzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwiPkVjaG9wcm9wZXJ0aWVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZWNob3htbC5odG1sIj5FY2hvWE1MPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZWpiLmh0bWwiPkVKQiBUYXNrczwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2V4ZWMuaHRtbCI+RXhlYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2ZhaWwuaHRtbCI+RmFpbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2ZpbHRlci5odG1sIj5GaWx0ZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9maXhjcmxmLmh0bWwiPkZpeENSTEY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9mdHAuaHRtbCI+RlRQPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvZ2Vua2V5Lmh0bWwiPkdlbktleTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2dldC5odG1sIj5HZXQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy91bnBhY2suaHRtbCI+R1VuemlwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcGFjay5odG1sIj5HWmlwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvaG9zdGluZm8uaHRtbCI+SG9zdGluZm88L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9pbWFnZS5odG1sIj5JbWFnZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2ltcG9ydC5odG1sIj5JbXBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9pbmNsdWRlLmh0bWwiPkluY2x1ZGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9pbnB1dC5odG1sIj5JbnB1dDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2phci5odG1sIj5KYXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwiPkphcmxpYi1hdmFpbGFibGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItZGlzcGxheS5odG1sIj5KYXJsaWItZGlzcGxheTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2phcmxpYi1tYW5pZmVzdC5odG1sIj5KYXJsaWItbWFuaWZlc3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItcmVzb2x2ZS5odG1sIj5KYXJsaWItcmVzb2x2ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+SmF2YTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwiPkphdmFjPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvamF2YWNjLmh0bWwiPkphdmFDQzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2phdmFkb2MuaHRtbCI+SmF2YWRvYy88aT5KYXZhZG9jMjwvaT48L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9qYXZhaC5odG1sIj5KYXZhaDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2pkZXBlbmQuaHRtbCI+SkRlcGVuZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2pqZG9jLmh0bWwiPkpKRG9jPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvamp0cmVlLmh0bWwiPkpKVHJlZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2psaW5rLmh0bWwiPjxpPkpsaW5rPC9pPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2pzcGMuaHRtbCI+SnNwQzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2p1bml0Lmh0bWwiPkpVbml0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvanVuaXRyZXBvcnQuaHRtbCI+SlVuaXRSZXBvcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9sZW5ndGguaHRtbCI+TGVuZ3RoPC9hPjxici8+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9sb2FkZmlsZS5odG1sIj5Mb2FkRmlsZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2xvYWRwcm9wZXJ0aWVzLmh0bWwiPkxvYWRQcm9wZXJ0aWVzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvbG9hZHJlc291cmNlLmh0bWwiPkxvYWRSZXNvdXJjZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL2xvY2FsLmh0bWwiPkxvY2FsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvbWFjcm9kZWYuaHRtbCI+TWFjcm9EZWY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9tYWtldXJsLmh0bWwiPk1ha2VVUkw8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9tYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwiPk1hbmlmZXN0Q2xhc3NQYXRoPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvbWltZW1haWwuaHRtbCI+PGk+TWltZU1haWw8L2k+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvbWtkaXIuaHRtbCI+TWtkaXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9tb3ZlLmh0bWwiPk1vdmU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9uYXRpdmUyYXNjaWkuaHRtbCI+TmF0aXZlMkFzY2lpPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+TmV0UmV4eEM8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9uaWNlLmh0bWwiPk5pY2U8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9wYXJhbGxlbC5odG1sIj5QYXJhbGxlbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3BhdGNoLmh0bWwiPlBhdGNoPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcGF0aGNvbnZlcnQuaHRtbCI+UGF0aENvbnZlcnQ8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlU2V0RGVmPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcHJvamVjdGhlbHBlci5odG1sIj5Qcm9qZWN0SGVscGVyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcHJvcGVydHkuaHRtbCI+UHJvcGVydHk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbCI+UHJvcGVydHlGaWxlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbCI+UHJvcGVydHlIZWxwZXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9wdmNzdGFzay5odG1sIj5QdmNzPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmVjb3JkZXIuaHRtbCI+UmVjb3JkPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmVuYW1lLmh0bWwiPjxpPlJlbmFtZTwvaT48L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwiPjxpPlJlbmFtZUV4dGVuc2lvbnM8L2k+PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmVwbGFjZS5odG1sIj5SZXBsYWNlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIj5SZXBsYWNlUmVnRXhwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmVzb3VyY2Vjb3VudC5odG1sIj5SZXNvdXJjZUNvdW50PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvcmV0cnkuaHRtbCI+UmV0cnk8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9yZXhlYy5odG1sIj5SRXhlYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+Um1pYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3JwbS5odG1sIj5ScG08L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zY2hlbWF2YWxpZGF0ZS5odG1sIj5TY2hlbWFWYWxpZGF0ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NjcC5odG1sIj5TY3A8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zY3JpcHQuaHRtbCI+U2NyaXB0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvc2NyaXB0ZGVmLmh0bWwiPlNjcmlwdGRlZjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NlcXVlbnRpYWwuaHRtbCI+U2VxdWVudGlhbDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NlcnZlcmRlcGxveS5odG1sIj5TZXJ2ZXJEZXBsb3k8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zZXRwcm94eS5odG1sIj5TZXRwcm94eTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NpZ25qYXIuaHRtbCI+U2lnbkphcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NsZWVwLmh0bWwiPlNsZWVwPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvc29zLmh0bWwiPlNvdXJjZU9mZlNpdGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zb3VuZC5odG1sIj5Tb3VuZDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3NwbGFzaC5odG1sIj5TcGxhc2g8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zcWwuaHRtbCI+U3FsPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvc3NoZXhlYy5odG1sIj5Tc2hleGVjPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvc3Noc2Vzc2lvbi5odG1sIj5Tc2hzZXNzaW9uPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvc3ViYW50Lmh0bWwiPlN1YmFudDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3N5bWxpbmsuaHRtbCI+U3ltbGluazwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3N5bmMuaHRtbCI+U3luYzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3Rhci5odG1sIj5UYXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy90YXNrZGVmLmh0bWwiPlRhc2tkZWY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy90ZWxuZXQuaHRtbCI+VGVsbmV0PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvdGVtcGZpbGUuaHRtbCI+VGVtcGZpbGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy90b3VjaC5odG1sIj5Ub3VjaDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3RyYW5zbGF0ZS5odG1sIj5UcmFuc2xhdGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy90cnVuY2F0ZS5odG1sIj5UcnVuY2F0ZTwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3RzdGFtcC5odG1sIj5UU3RhbXA8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy90eXBlZGVmLmh0bWwiPlR5cGVkZWY8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbmphcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3VuemlwLmh0bWwiPlVudGFyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvdW56aXAuaHRtbCI+VW53YXI8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbnppcDwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3VwdG9kYXRlLmh0bWwiPlVwdG9kYXRlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MvdmVyaWZ5amFyLmh0bWwiPlZlcmlmeUphcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3Zzcy5odG1sI3Rhc2tzIj5NaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgVGFza3M8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy93YWl0Zm9yLmh0bWwiPldhaXRmb3I8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy93YXIuaHRtbCI+V2FyPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sIj5XaGljaFJlc291cmNlPC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3Mvd2xqc3BjLmh0bWwiPldlYmxvZ2ljIEpTUCBDb21waWxlcjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3htbHByb3BlcnR5Lmh0bWwiPlhtbFByb3BlcnR5PC9hPjwvbGk+Ci08bGk+PGEgaHJlZj0iVGFza3MveG1sdmFsaWRhdGUuaHRtbCI+WG1sVmFsaWRhdGU8L2E+PC9saT4KLTxsaT48YSBocmVmPSJUYXNrcy9zdHlsZS5odG1sIj5YU0xULzxpPlN0eWxlPC9pPjwvYT48L2xpPgotPGxpPjxhIGhyZWY9IlRhc2tzL3ppcC5odG1sIj5aaXA8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2FudC5odG1sIj5BbnQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2FudGNhbGwuaHRtbCI+QW50Q2FsbDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvYW50bHIuaHRtbCI+QU5UTFI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2FudHN0cnVjdHVyZS5odG1sIj5BbnRTdHJ1Y3R1cmU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2FudHZlcnNpb24uaHRtbCI+QW50VmVyc2lvbjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvYXBwbHkuaHRtbCI+QXBwbHkvPGVtPkV4ZWNPbjwvZW0+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9hdHRyaWIuaHRtbCI+QXR0cmliPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9hdWdtZW50Lmh0bWwiPkF1Z21lbnQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2F2YWlsYWJsZS5odG1sIj5BdmFpbGFibGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2Jhc2VuYW1lLmh0bWwiPkJhc2VuYW1lPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9iaW5kdGFyZ2V0cy5odG1sIj5CaW5kdGFyZ2V0czwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvYnVpbGRudW1iZXIuaHRtbCI+QnVpbGROdW1iZXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3VucGFjay5odG1sIj5CVW56aXAyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9wYWNrLmh0bWwiPkJaaXAyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jYWIuaHRtbCI+Q2FiPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jY20uaHRtbCI+Q29udGludXVzL1N5bmVyZ3kgVGFza3M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2NoYW5nZWxvZy5odG1sIj5DdnNDaGFuZ2VMb2c8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2NoZWNrc3VtLmh0bWwiPkNoZWNrc3VtPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jaGdycC5odG1sIj5DaGdycDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvY2htb2QuaHRtbCI+Q2htb2Q8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2Nob3duLmh0bWwiPkNob3duPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jbGVhcmNhc2UuaHRtbCI+Q2xlYXJDYXNlIFRhc2tzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jb21wb25lbnRkZWYuaHRtbCI+Q29tcG9uZW50ZGVmPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jb25jYXQuaHRtbCI+Q29uY2F0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jb25kaXRpb24uaHRtbCI+Q29uZGl0aW9uPC9hPjwvbGk+CisgIDxsaSBjbGFzcz0iaW5kZW50Ij48YSBocmVmPSJUYXNrcy9jb25kaXRpb25zLmh0bWwiPlN1cHBvcnRlZCBjb25kaXRpb25zPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jb3B5Lmh0bWwiPkNvcHk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2NvcHlkaXIuaHRtbCI+PGVtPkNvcHlkaXI8L2VtPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvY29weWZpbGUuaHRtbCI+PGVtPkNvcHlmaWxlPC9lbT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2N2cy5odG1sIj5DdnM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2N2c3Bhc3MuaHRtbCI+Q1ZTUGFzczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvY3ZzdGFnZGlmZi5odG1sIj5DdnNUYWdEaWZmPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9jdnN2ZXJzaW9uLmh0bWwiPkN2c1ZlcnNpb248L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2RlZmF1bHRleGNsdWRlcy5odG1sIj5EZWZhdWx0ZXhjbHVkZXM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2RlbGV0ZS5odG1sIj5EZWxldGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2RlbHRyZWUuaHRtbCI+PGVtPkRlbHRyZWU8L2VtPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZGVwZW5kLmh0bWwiPkRlcGVuZDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZGVwZW5kc2V0Lmh0bWwiPkRlcGVuZHNldDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZGlhZ25vc3RpY3MuaHRtbCI+RGlhZ25vc3RpY3M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2Rpcm5hbWUuaHRtbCI+RGlybmFtZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZWFyLmh0bWwiPkVhcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZWNoby5odG1sIj5FY2hvPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9lY2hvcHJvcGVydGllcy5odG1sIj5FY2hvcHJvcGVydGllczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZWNob3htbC5odG1sIj5FY2hvWE1MPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9lamIuaHRtbCI+RUpCIFRhc2tzPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9leGVjLmh0bWwiPkV4ZWM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2ZhaWwuaHRtbCI+RmFpbDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZmlsdGVyLmh0bWwiPkZpbHRlcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvZml4Y3JsZi5odG1sIj5GaXhDUkxGPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9mdHAuaHRtbCI+RlRQPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9nZW5rZXkuaHRtbCI+R2VuS2V5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9nZXQuaHRtbCI+R2V0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy91bnBhY2suaHRtbCI+R1VuemlwPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9wYWNrLmh0bWwiPkdaaXA8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2hvc3RpbmZvLmh0bWwiPkhvc3RpbmZvPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9pbWFnZS5odG1sIj48ZW0+SW1hZ2U8L2VtPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvaW1hZ2Vpby5odG1sIj5JbWFnZUlPPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+SW1wb3J0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9pbmNsdWRlLmh0bWwiPkluY2x1ZGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2lucHV0Lmh0bWwiPklucHV0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXIuaHRtbCI+SmFyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItYXZhaWxhYmxlLmh0bWwiPkphcmxpYi1hdmFpbGFibGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2phcmxpYi1kaXNwbGF5Lmh0bWwiPkphcmxpYi1kaXNwbGF5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItbWFuaWZlc3QuaHRtbCI+SmFybGliLW1hbmlmZXN0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXJsaWItcmVzb2x2ZS5odG1sIj5KYXJsaWItcmVzb2x2ZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvamF2YS5odG1sIj5KYXZhPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5KYXZhYzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvamF2YWNjLmh0bWwiPkphdmFDQzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvamF2YWRvYy5odG1sIj5KYXZhZG9jLzxlbT5KYXZhZG9jMjwvZW0+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qYXZhaC5odG1sIj5KYXZhaDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvamRlcGVuZC5odG1sIj5KRGVwZW5kPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qamRvYy5odG1sIj5KSkRvYzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvamp0cmVlLmh0bWwiPkpKVHJlZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvamxpbmsuaHRtbCI+PGVtPkpsaW5rPC9lbT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2ptb2QuaHRtbCI+Sm1vZDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvanNwYy5odG1sIj48ZW0+SnNwQzwvZW0+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9qdW5pdC5odG1sIj5KVW5pdDwvYT4gKDMgJmFtcDsgNCk8L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvanVuaXRsYXVuY2hlci5odG1sIj5KVW5pdExhdW5jaGVyPC9hPiAoSlVuaXQgNSk8L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvanVuaXRyZXBvcnQuaHRtbCI+SlVuaXRSZXBvcnQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2xlbmd0aC5odG1sIj5MZW5ndGg8L2E+PGJyLz48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbGluay5odG1sIj5MaW5rPC9hPjxici8+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL2xvYWRmaWxlLmh0bWwiPkxvYWRGaWxlPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9sb2FkcHJvcGVydGllcy5odG1sIj5Mb2FkUHJvcGVydGllczwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbG9hZHJlc291cmNlLmh0bWwiPkxvYWRSZXNvdXJjZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbG9jYWwuaHRtbCI+TG9jYWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL21hY3JvZGVmLmh0bWwiPk1hY3JvRGVmPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL21ha2V1cmwuaHRtbCI+TWFrZVVSTDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbWFuaWZlc3QuaHRtbCI+TWFuaWZlc3Q8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL21hbmlmZXN0Y2xhc3NwYXRoLmh0bWwiPk1hbmlmZXN0Q2xhc3NQYXRoPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9taW1lbWFpbC5odG1sIj48ZW0+TWltZU1haWw8L2VtPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbWtkaXIuaHRtbCI+TWtkaXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL21vdmUuaHRtbCI+TW92ZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbmF0aXZlMmFzY2lpLmh0bWwiPk5hdGl2ZTJBc2NpaTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+TmV0UmV4eEM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL25pY2UuaHRtbCI+TmljZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcGFyYWxsZWwuaHRtbCI+UGFyYWxsZWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3BhdGNoLmh0bWwiPlBhdGNoPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9wYXRoY29udmVydC5odG1sIj5QYXRoQ29udmVydDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcHJlc2V0ZGVmLmh0bWwiPlByZVNldERlZjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcHJvamVjdGhlbHBlci5odG1sIj5Qcm9qZWN0SGVscGVyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5Qcm9wZXJ0eTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcHJvcGVydHlmaWxlLmh0bWwiPlByb3BlcnR5RmlsZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcHJvcGVydHloZWxwZXIuaHRtbCI+UHJvcGVydHlIZWxwZXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3B2Y3N0YXNrLmh0bWwiPlB2Y3M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3JlY29yZGVyLmh0bWwiPlJlY29yZDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcmVuYW1lLmh0bWwiPjxlbT5SZW5hbWU8L2VtPjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcmVuYW1lZXh0ZW5zaW9ucy5odG1sIj48ZW0+UmVuYW1lRXh0ZW5zaW9uczwvZW0+PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9yZXBsYWNlLmh0bWwiPlJlcGxhY2U8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3JlcGxhY2VyZWdleHAuaHRtbCI+UmVwbGFjZVJlZ0V4cDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcmVzb3VyY2Vjb3VudC5odG1sIj5SZXNvdXJjZUNvdW50PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9yZXRyeS5odG1sIj5SZXRyeTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcmV4ZWMuaHRtbCI+UkV4ZWM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+Um1pYzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvcnBtLmh0bWwiPlJwbTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvc2NoZW1hdmFsaWRhdGUuaHRtbCI+U2NoZW1hVmFsaWRhdGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NjcC5odG1sIj5TY3A8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NjcmlwdGRlZi5odG1sIj5TY3JpcHRkZWY8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NlcXVlbnRpYWwuaHRtbCI+U2VxdWVudGlhbDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvc2VydmVyZGVwbG95Lmh0bWwiPlNlcnZlckRlcGxveTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvc2V0cGVybWlzc2lvbnMuaHRtbCI+U2V0UGVybWlzc2lvbnM8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NldHByb3h5Lmh0bWwiPlNldFByb3h5PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9zaWduamFyLmh0bWwiPlNpZ25KYXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NsZWVwLmh0bWwiPlNsZWVwPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9zb3MuaHRtbCI+U291cmNlT2ZmU2l0ZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvc291bmQuaHRtbCI+U291bmQ8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NwbGFzaC5odG1sIj5TcGxhc2g8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NxbC5odG1sIj5TcWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3NzaGV4ZWMuaHRtbCI+U3NoZXhlYzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvc3Noc2Vzc2lvbi5odG1sIj5Tc2hzZXNzaW9uPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9zdWJhbnQuaHRtbCI+U3ViYW50PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy9zeW1saW5rLmh0bWwiPlN5bWxpbms8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3N5bmMuaHRtbCI+U3luYzwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvdGFyLmh0bWwiPlRhcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvdGFza2RlZi5odG1sIj5UYXNrZGVmPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy90ZWxuZXQuaHRtbCI+VGVsbmV0PC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy90ZW1wZmlsZS5odG1sIj5UZW1wZmlsZTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvdG91Y2guaHRtbCI+VG91Y2g8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3RyYW5zbGF0ZS5odG1sIj5UcmFuc2xhdGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3RydW5jYXRlLmh0bWwiPlRydW5jYXRlPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy90c3RhbXAuaHRtbCI+VFN0YW1wPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy90eXBlZGVmLmh0bWwiPlR5cGVkZWY8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3VuemlwLmh0bWwiPlVuamFyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbnRhcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvdW56aXAuaHRtbCI+VW53YXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3VucGFjay5odG1sIj5VblhaPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbnppcDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MvdXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3ZlcmlmeWphci5odG1sIj5WZXJpZnlKYXI8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3Zzcy5odG1sI3Rhc2tzIj5NaWNyb3NvZnQgVmlzdWFsIFNvdXJjZVNhZmUgVGFza3M8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3dhaXRmb3IuaHRtbCI+V2FpdGZvcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvd2FyLmh0bWwiPldhcjwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sIj5XaGljaFJlc291cmNlPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy93bGpzcGMuaHRtbCI+V2ViTG9naWMgSlNQIENvbXBpbGVyPC9hPjwvbGk+CisgIDxsaT48YSBocmVmPSJUYXNrcy94bWxwcm9wZXJ0eS5odG1sIj5YbWxQcm9wZXJ0eTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iVGFza3MveG1sdmFsaWRhdGUuaHRtbCI+WG1sVmFsaWRhdGU8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3BhY2suaHRtbCI+WFo8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3N0eWxlLmh0bWwiPlhTTFQvPGVtPlN0eWxlPC9lbT48L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9IlRhc2tzL3ppcC5odG1sIj5aaXA8L2E+PC9saT4KIDwvdWw+CiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvdGFza3NvdmVydmlldy5odG1sIGIvbWFudWFsL3Rhc2tzb3ZlcnZpZXcuaHRtbAppbmRleCA5OWFhMTFiLi5mOGUzNmMzIDEwMDY0NAotLS0gYS9tYW51YWwvdGFza3NvdmVydmlldy5odG1sCisrKyBiL21hbnVhbC90YXNrc292ZXJ2aWV3Lmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCw0MTYgKzE1LDM2NSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogPGhlYWQ+Ci0gIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIj4KICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5PdmVydmlldyBvZiBBcGFjaGUgQW50IFRhc2tzPC90aXRsZT4KICAgPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiPgogPC9oZWFkPgogCiA8Ym9keT4KLTxhIG5hbWU9InRvcCI+PC9hPgotPGgyPk92ZXJ2aWV3IG9mIEFwYWNoZSBBbnQgVGFza3M8L2gyPgorPGgyIGlkPSJ0b3AiPk92ZXJ2aWV3IG9mIEFwYWNoZSBBbnQgVGFza3M8L2gyPgogPHA+R2l2ZW4gdGhlIGxhcmdlIG51bWJlciBvZiB0YXNrcyBhdmFpbGFibGUgd2l0aCBBbnQsIGl0IG1heSBiZQogZGlmZmljdWx0IHRvIGdldCBhbiBvdmVyYWxsIHZpZXcgb2Ygd2hhdCBlYWNoIHRhc2sgY2FuIGRvLiAgVGhlIGZvbGxvd2luZwogdGFibGVzIHByb3ZpZGUgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiBlYWNoIHRhc2sgYW5kIGEgbGluayB0byB0aGUgY29tcGxldGUKIGRvY3VtZW50YXRpb24uPC9wPgogCi08YSBocmVmPSIjYXJjaGl2ZSI+QXJjaGl2ZSBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjYXVkaXQiPkF1ZGl0L0NvdmVyYWdlIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNjb21waWxlIj5Db21waWxlIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNkZXBsb3kiPkRlcGxveW1lbnQgVGFza3M8L2E+PGJyPgotPGEgaHJlZj0iI2RvYyI+RG9jdW1lbnRhdGlvbiBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjZWpiIj5FSkIgVGFza3M8L2E+PGJyPgotPGEgaHJlZj0iI2V4ZWMiPkV4ZWN1dGlvbiBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjZmlsZSI+RmlsZSBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjZXh0ZW5zaW9ucyI+SmF2YTIgRXh0ZW5zaW9ucyBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjbG9nIj5Mb2dnaW5nIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNtYWlsIj5NYWlsIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNtaXNjIj5NaXNjZWxsYW5lb3VzIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNwcmVwcm9jIj5QcmUtcHJvY2VzcyBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjcHJvcCI+UHJvcGVydHkgVGFza3M8L2E+PGJyPgotPGEgaHJlZj0iI3JlbW90ZSI+UmVtb3RlIFRhc2tzPC9hPjxicj4KLTxhIGhyZWY9IiNzY20iPlNDTSBUYXNrczwvYT48YnI+Ci08YSBocmVmPSIjdGVzdGluZyI+VGVzdGluZyBUYXNrczwvYT48YnI+Cis8YSBocmVmPSIjYXJjaGl2ZSI+QXJjaGl2ZSBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI2F1ZGl0Ij5BdWRpdC9Db3ZlcmFnZSBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI2NvbXBpbGUiPkNvbXBpbGUgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNkZXBsb3kiPkRlcGxveW1lbnQgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNkb2MiPkRvY3VtZW50YXRpb24gVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNlamIiPkVKQiBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI2V4ZWMiPkV4ZWN1dGlvbiBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI2ZpbGUiPkZpbGUgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNleHRlbnNpb25zIj5KYXZhIEV4dGVuc2lvbnMgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNsb2ciPkxvZ2dpbmcgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNtYWlsIj5NYWlsIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSIjbWlzYyI+TWlzY2VsbGFuZW91cyBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI3ByZXByb2MiPlByZS1wcm9jZXNzIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSIjcHJvcCI+UHJvcGVydHkgVGFza3M8L2E+PGJyLz4KKzxhIGhyZWY9IiNyZW1vdGUiPlJlbW90ZSBUYXNrczwvYT48YnIvPgorPGEgaHJlZj0iI3NjbSI+U0NNIFRhc2tzPC9hPjxici8+Cis8YSBocmVmPSIjdGVzdGluZyI+VGVzdGluZyBUYXNrczwvYT48YnIvPgogCis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9ImFyY2hpdmUiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5BcmNoaXZlIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9ImFyY2hpdmUiPkFyY2hpdmUgVGFza3M8L2E+Ci08L2ZvbnQ+Ci08L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aCBub3dyYXA+RGVzY3JpcHRpb248L3RoPgorPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdW5wYWNrLmh0bWwiPkJVbnppcDI8L2E+PC90ZD4KLSAgICA8dGQ+PHA+RXhwYW5kcyBhIGZpbGUgcGFja2VkIHVzaW5nIEdaaXAgb3IgQlppcDIuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvdW5wYWNrLmh0bWwiPkdVbnppcC9CVW56aXAyL1VuWFo8L2E+PC90ZD4KKyAgICA8dGQ+PHA+RXhwYW5kcyBhIGZpbGUgcGFja2VkIHVzaW5nIEdaaXAsIEJaaXAyIG9yIFhaLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wYWNrLmh0bWwiPkJaaXAyPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlBhY2tzIGEgZmlsZSB1c2luZyB0aGUgR1ppcCBvciBCWmlwMiBhbGdvcml0aG0uIFRoaXMgdGFzaworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3BhY2suaHRtbCI+R1ppcC9CWmlwMi9YWjwvYT48L3RkPgorICAgIDx0ZD48cD5QYWNrcyBhIGZpbGUgdXNpbmcgdGhlIEdaaXAsIEJaaXAyIG9yIFhaIGFsZ29yaXRobS4gVGhpcyB0YXNrCiAgICAgIGRvZXMgbm90IGRvIGFueSBkZXBlbmRlbmN5IGNoZWNraW5nOyB0aGUgb3V0cHV0IGZpbGUgaXMgYWx3YXlzCiAgICAgIGdlbmVyYXRlZDwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9jYWIuaHRtbCI+Q2FiPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNyZWF0ZXMgTWljcm9zb2Z0IENBQiBhcmNoaXZlIGZpbGVzLiBJdCBpcyBpbnZva2VkCi0gICAgIHNpbWlsYXIgdG8gdGhlIDxhIGhyZWY9IlRhc2tzL2phci5odG1sIj5KYXI8L2E+IG9yCi0gICAgIDxhIGhyZWY9IlRhc2tzL3ppcC5odG1sIj5aaXA8L2E+IHRhc2tzLiBUaGlzIHRhc2sgd2lsbCB3b3JrIG9uCi0gICAgIFdpbmRvd3MgdXNpbmcgdGhlIGV4dGVybmFsIDxpPmNhYmFyYzwvaT4gdG9vbCAocHJvdmlkZWQgYnkgTWljcm9zb2Z0KSwKLSAgICAgd2hpY2ggbXVzdCBiZSBsb2NhdGVkIGluIHlvdXIgZXhlY3V0YWJsZSBwYXRoLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2NhYi5odG1sIj5DYWI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q3JlYXRlcyBNaWNyb3NvZnQgQ0FCIGFyY2hpdmUgZmlsZXMuIEl0IGlzIGludm9rZWQgc2ltaWxhcgorICAgICB0byB0aGUgPGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT4KKyAgICAgb3IgPGEgaHJlZj0iVGFza3MvemlwLmh0bWwiPlppcDwvYT4gdGFza3MuIFRoaXMgdGFzayB3aWxsIHdvcmsgb24KKyAgICAgV2luZG93cyB1c2luZyB0aGUgZXh0ZXJuYWwgPGNvZGU+Y2FiYXJjPC9jb2RlPiB0b29sIChwcm92aWRlZCBieQorICAgICBNaWNyb3NvZnQpLCB3aGljaCBtdXN0IGJlIGxvY2F0ZWQgaW4geW91ciBleGVjdXRhYmxlCisgICAgIHBhdGguPC9wPjwvdGQ+CiAgICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9lYXIuaHRtbCI+RWFyPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT4gdGFzayB3aXRoCi0gICAgIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gYW4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9lYXIuaHRtbCI+RWFyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT4gdGFzaworICAgICB3aXRoIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gYW4KICAgICAgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBhcmNoaXZlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9ndW56aXAuaHRtbCI+R1VuemlwPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkV4cGFuZHMgYSBHWmlwIGZpbGUuPC9wPjwvdGQ+Ci0gIDwvdHI+Ci0KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2d6aXAuaHRtbCI+R1ppcDwvYT48L3RkPgotICAgIDx0ZD48cD5HWmlwcyBhIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KLSAgPC90cj4KLQotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2phci5odG1sIj5KYXI8L2E+PC90ZD4KICAgICA8dGQ+PHA+SmFycyBhIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvamxpbmsuaHRtbCI+Smxpbms8L2E+PC90ZD4KLSAgICA8dGQ+PHA+PGk+RGVwcmVjYXRlZC48L2k+IFVzZSB0aGUgPGNvZGU+emlwZmlsZXNldDwvY29kZT4KLSAgICAgYW5kIDxjb2RlPnppcGdyb3VwZmlsZXNldDwvY29kZT4gYXR0cmlidXRlcyBvZiB0aGUKLSAgICAgPGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT4gb3IKLSAgICAgPGEgaHJlZj0iVGFza3MvemlwLmh0bWwiPlppcDwvYT4gdGFza3MgaW5zdGVhZC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qbGluay5odG1sIj5KbGluazwvYT48L3RkPgorICAgIDx0ZD48cD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gVXNlIHRoZSA8Y29kZT56aXBmaWxlc2V0PC9jb2RlPgorICAgICBhbmQgPGNvZGU+emlwZ3JvdXBmaWxlc2V0PC9jb2RlPiBhdHRyaWJ1dGVzIG9mCisgICAgIHRoZSA8YSBocmVmPSJUYXNrcy9qYXIuaHRtbCI+SmFyPC9hPgorICAgICBvciA8YSBocmVmPSJUYXNrcy96aXAuaHRtbCI+WmlwPC9hPiB0YXNrcyBpbnN0ZWFkLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9tYW5pZmVzdC5odG1sIj5NYW5pZmVzdDwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL21hbmlmZXN0Lmh0bWwiPk1hbmlmZXN0PC9hPjwvdGQ+CiAgICAgPHRkPjxwPkNyZWF0ZXMgYSBtYW5pZmVzdCBmaWxlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9ycG0uaHRtbCI+UnBtPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkludm9rZXMgdGhlIDxpPnJwbTwvaT4gZXhlY3V0YWJsZSB0byBidWlsZCBhIExpbnV4IGluc3RhbGxhdGlvbgotICAgICBmaWxlLiBUaGlzIHRhc2sgY3VycmVudGx5IG9ubHkgd29ya3Mgb24gTGludXggb3Igb3RoZXIgVW5peCBwbGF0Zm9ybXMKLSAgICAgd2l0aCBSUE0gc3VwcG9ydC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9ycG0uaHRtbCI+UnBtPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMgdGhlIDxrYmQ+cnBtPC9rYmQ+IGV4ZWN1dGFibGUgdG8gYnVpbGQgYSBMaW51eAorICAgICBpbnN0YWxsYXRpb24gZmlsZS4gVGhpcyB0YXNrIGN1cnJlbnRseSBvbmx5IHdvcmtzIG9uIExpbnV4IG9yCisgICAgIG90aGVyIFVuaXggcGxhdGZvcm1zIHdpdGggUlBNIHN1cHBvcnQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NpZ25qYXIuaHRtbCI+U2lnbkphcjwvYT48L3RkPgotICAgIDx0ZD48cD5TaWducyBhIGphciBvciB6aXAgZmlsZSB3aXRoIHRoZSA8aT5qYXZhc2lnbjwvaT4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zaWduamFyLmh0bWwiPlNpZ25KYXI8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U2lnbnMgYSBqYXIgb3IgemlwIGZpbGUgd2l0aCB0aGUgPGtiZD5qYXZhc2lnbjwva2JkPgogICAgICBjb21tYW5kLWxpbmUgdG9vbC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdGFyLmh0bWwiPlRhcjwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3Rhci5odG1sIj5UYXI8L2E+PC90ZD4KICAgICA8dGQ+PHA+Q3JlYXRlcyBhIHRhciBhcmNoaXZlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbmphcjwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3VuemlwLmh0bWwiPlVuamFyPC9hPjwvdGQ+CiAgICAgPHRkPjxwPlVuemlwcyBhIGphcmZpbGUuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3VudGFyLmh0bWwiPlVudGFyPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvdW56aXAuaHRtbCI+VW50YXI8L2E+PC90ZD4KICAgICA8dGQ+PHA+VW50YXJzIGEgdGFyZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdW56aXAuaHRtbCI+VW53YXI8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbndhcjwvYT48L3RkPgogICAgIDx0ZD48cD5VbnppcHMgYSB3YXJmaWxlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy91bnppcC5odG1sIj5VbnppcDwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3VuemlwLmh0bWwiPlVuemlwPC9hPjwvdGQ+CiAgICAgPHRkPjxwPlVuemlwcyBhIHppcGZpbGUuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3dhci5odG1sIj5XYXI8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy93YXIuaHRtbCI+V2FyPC9hPjwvdGQ+CiAgICAgPHRkPjxwPkFuIGV4dGVuc2lvbiBvZiB0aGUgPGEgaHJlZj0iVGFza3MvamFyLmh0bWwiPkphcjwvYT4gdGFzawotICAgICB3aXRoIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4gdGhlCi0gICAgIDxjb2RlPldFQi1JTkYvbGliPC9jb2RlPiwgPGNvZGU+V0VCLUlORi9jbGFzc2VzPC9jb2RlPiwgb3IKLSAgICAgPGNvZGU+V0VCLUlORjwvY29kZT4gZGlyZWN0b3JpZXMgb2YgdGhlIFdlYiBBcHBsaWNhdGlvbiBBcmNoaXZlLjwvcD48L3RkPgorICAgICB3aXRoIHNwZWNpYWwgdHJlYXRtZW50IGZvciBmaWxlcyB0aGF0IHNob3VsZCBlbmQgdXAgaW4KKyAgICAgdGhlIDxzYW1wPldFQi1JTkYvbGliPC9zYW1wPiwgPHNhbXA+V0VCLUlORi9jbGFzc2VzPC9zYW1wPiwKKyAgICAgb3IgPHNhbXA+V0VCLUlORjwvc2FtcD4gZGlyZWN0b3JpZXMgb2YgdGhlIFdlYiBBcHBsaWNhdGlvbgorICAgICBBcmNoaXZlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy96aXAuaHRtbCI+WmlwPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvemlwLmh0bWwiPlppcDwvYT48L3RkPgogICAgIDx0ZD48cD5DcmVhdGVzIGEgemlwZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0iYXVkaXQiPkF1ZGl0L0NvdmVyYWdlIFRhc2tzPC9hPgotPC9mb250PjwvdGg+Ci08Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KLTwvZm9udD4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKzxkaXYgY2xhc3M9ImZsb2F0IiBpZD0iYXVkaXQiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5BdWRpdC9Db3ZlcmFnZSBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvamRlcGVuZC5odG1sIj5KRGVwZW5kPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPgotICAgICBKRGVwZW5kPC9hPiBwYXJzZXIuIFRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhIHNldCBvZiBKYXZhIHNvdXJjZS1maWxlCi0gICAgIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduLXF1YWxpdHkgbWV0cmljcyBmb3IgZWFjaCBKYXZhCi0gICAgIHBhY2thZ2UmcXVvdDsuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvamRlcGVuZC5odG1sIj5KRGVwZW5kPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMKKyAgICAgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jbGFya3dhcmUvamRlcGVuZCIKKyAgICAgdGFyZ2V0PSJfdG9wIj5KRGVwZW5kPC9hPiBwYXJzZXIuIFRoaXMgcGFyc2VyICZxdW90O3RyYXZlcnNlcyBhCisgICAgIHNldCBvZiBKYXZhIHNvdXJjZS1maWxlIGRpcmVjdG9yaWVzIGFuZCBnZW5lcmF0ZXMgZGVzaWduLXF1YWxpdHkKKyAgICAgbWV0cmljcyBmb3IgZWFjaCBKYXZhIHBhY2thZ2UmcXVvdDsuPC9wPjwvdGQ+CiAgICA8L3RyPgotCiA8L3RhYmxlPgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9ImNvbXBpbGUiPkNvbXBpbGUgVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJjb21waWxlIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+Q29tcGlsZSBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvZGVwZW5kLmh0bWwiPkRlcGVuZDwvYT48L3RkPgotICAgIDx0ZD48cD5EZXRlcm1pbmVzIHdoaWNoIGNsYXNzZmlsZXMgYXJlIG91dC1vZi1kYXRlIHdpdGggcmVzcGVjdCB0byB0aGVpcgotICAgICBzb3VyY2UsIHJlbW92aW5nIHRoZSBjbGFzc2ZpbGVzIG9mIGFueSBvdGhlciBjbGFzc2VzIHRoYXQgZGVwZW5kIG9uIHRoZQotICAgICBvdXQtb2YtZGF0ZSBjbGFzc2VzLCBmb3JjaW5nIHRoZSByZS1jb21waWxlIG9mIHRoZSByZW1vdmVkIGNsYXNzZmlsZXMuCi0gICAgIFR5cGljYWxseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZGVwZW5kLmh0bWwiPkRlcGVuZDwvYT48L3RkPgorICAgIDx0ZD48cD5EZXRlcm1pbmVzIHdoaWNoIGNsYXNzIGZpbGVzIGFyZSBvdXQtb2YtZGF0ZSB3aXRoIHJlc3BlY3QKKyAgICAgdG8gdGhlaXIgc291cmNlLCByZW1vdmluZyB0aGUgY2xhc3MgZmlsZXMgb2YgYW55IG90aGVyIGNsYXNzZXMKKyAgICAgdGhhdCBkZXBlbmQgb24gdGhlIG91dC1vZi1kYXRlIGNsYXNzZXMsIGZvcmNpbmcgdGhlIHJlLWNvbXBpbGUgb2YKKyAgICAgdGhlIHJlbW92ZWQgY2xhc3MgZmlsZXMuICBUeXBpY2FsbHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQogICAgICA8YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5KYXZhYzwvYT4gdGFzay48L3A+PC90ZD4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvamF2YWMuaHRtbCI+SmF2YWM8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qYXZhYy5odG1sIj5KYXZhYzwvYT48L3RkPgogICAgIDx0ZD48cD5Db21waWxlcyB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlKHMpIHdpdGhpbiB0aGUgcnVubmluZwotICAgICAoQW50KSBWTSwgb3IgaW4gYW5vdGhlciBWTSBpZiB0aGUgPGNvZGU+Zm9yazwvY29kZT4gYXR0cmlidXRlIGlzCisgICAgIChBbnQpIEpWTSwgb3IgaW4gYW5vdGhlciBKVk0gaWYgdGhlIDx2YXI+Zm9yazwvdmFyPiBhdHRyaWJ1dGUgaXMKICAgICAgc3BlY2lmaWVkLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9hcHQuaHRtbCI+QXB0PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlJ1bnMgdGhlIGFubm90YXRpb24gcHJvY2Vzc29yIHRvb2wgKGFwdCksIGFuZCB0aGVuIG9wdGlvbmFsbHkgY29tcGlsZXMKLSAgIHRoZSBvcmlnaW5hbCBjb2RlLCBhbmQgYW55IGdlbmVyYXRlZCBzb3VyY2UgY29kZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qc3BjLmh0bWwiPkpzcEM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+UnVucyB0aGUgSlNQIGNvbXBpbGVyLiBJdCBjYW4gYmUgdXNlZCB0byBwcmVjb21waWxlIEpTUAorICAgICBwYWdlcyBmb3IgZmFzdCBpbml0aWFsIGludm9jYXRpb24gb2YgSlNQIHBhZ2VzLCBkZXBsb3ltZW50IG9uIGEKKyAgICAgc2VydmVyIHdpdGhvdXQgdGhlIGZ1bGwgSkRLIGluc3RhbGxlZCwgb3Igc2ltcGx5IHRvIHN5bnRheC1jaGVjaworICAgICB0aGUgcGFnZXMgd2l0aG91dCBkZXBsb3lpbmcKKyAgICAgdGhlbS4gVGhlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwiPkphdmFjPC9hPiB0YXNrIGNhbiBiZSB1c2VkCisgICAgIHRvIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZS4gIChGb3IgV2ViTG9naWMgSlNQCisgICAgIGNvbXBpbGVyLCBzZWUgdGhlIDxhIGhyZWY9IlRhc2tzL3dsanNwYy5odG1sIj5XbGpzcGM8L2E+CisgICAgIHRhc2suKTwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9qc3BjLmh0bWwiPkpzcEM8L2E+PC90ZD4KLSAgICA8dGQ+PHA+UnVucyB0aGUgSlNQIGNvbXBpbGVyLiBJdCBjYW4gYmUgdXNlZCB0byBwcmVjb21waWxlIEpTUCBwYWdlcwotICAgICBmb3IgZmFzdCBpbml0aWFsIGludm9jYXRpb24gb2YgSlNQIHBhZ2VzLCBkZXBsb3ltZW50IG9uIGEgc2VydmVyIHdpdGhvdXQKLSAgICAgdGhlIGZ1bGwgSkRLIGluc3RhbGxlZCwgb3Igc2ltcGx5IHRvIHN5bnRheC1jaGVjayB0aGUgcGFnZXMgd2l0aG91dAotICAgICBkZXBsb3lpbmcgdGhlbS4gVGhlIDxhIGhyZWY9IlRhc2tzL2phdmFjLmh0bWwiPkphdmFjPC9hPiB0YXNrCi0gICAgIGNhbiBiZSB1c2VkIHRvIGNvbXBpbGUgdGhlIGdlbmVyYXRlZCBKYXZhIHNvdXJjZS4KLSAgICAgKEZvciBXZWJsb2dpYyBKU1AgY29tcGlsZXMsCi0gICAgIHNlZSB0aGUgPGEgaHJlZj0iVGFza3Mvd2xqc3BjLmh0bWwiPldsanNwYzwvYT4gdGFzay4pPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbmV0cmV4eGMuaHRtbCI+TmV0UmV4eEM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q29tcGlsZXMKKyAgICAgYSA8YSBocmVmPSJodHRwczovL3d3dy5pYm0uY29tL3NvZnR3YXJlL2F3ZHRvb2xzL25ldHJleHgvbGlicmFyeS5odG1sIgorICAgICB0YXJnZXQ9Il90b3AiPk5ldFJleHg8L2E+IHNvdXJjZSB0cmVlIHdpdGhpbiB0aGUgcnVubmluZyAoQW50KQorICAgICBKVk0uPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL25ldHJleHhjLmh0bWwiPk5ldFJleHhDPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNvbXBpbGVzIGEKLSAgICAgPGEgaHJlZj0iaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL25ldHJleHgiIHRhcmdldD0iX3RvcCI+TmV0UmV4eDwvYT4KLSAgICAgc291cmNlIHRyZWUgd2l0aGluIHRoZSBydW5uaW5nIChBbnQpIFZNLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3JtaWMuaHRtbCI+Um1pYzwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIHRoZSA8a2JkPnJtaWM8L2tiZD4gY29tcGlsZXIgb24gdGhlIHNwZWNpZmllZCBmaWxlKHMpLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9ybWljLmh0bWwiPlJtaWM8L2E+PC90ZD4KLSAgICA8dGQ+PHA+UnVucyB0aGUgPGk+cm1pYzwvaT4gY29tcGlsZXIgb24gdGhlIHNwZWNpZmllZCBmaWxlKHMpLjwvcD48L3RkPgotICA8L3RyPgotCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy93bGpzcGMuaHRtbCI+V2xqc3BjPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNvbXBpbGVzIEpTUCBwYWdlcyB1c2luZyBXZWJsb2dpYydzIEpTUCBjb21waWxlciwKLSAgICAgPGk+d2VibG9naWMuanNwYzwvaT4uIChGb3Igbm9uLVdlYmxvZ2ljIEpTUCBjb21waWxlcywgc2VlIHRoZQotICAgICA8YSBocmVmPSJUYXNrcy9qc3BjLmh0bWwiPkpzcEM8L2E+IHRhc2suPC9wPjwvdGQ+Ci0gIDwvdHI+Ci0KLTwvdGFibGU+Ci0KLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0iZGVwbG95Ij5EZXBsb3ltZW50IFRhc2tzPC9hPgotPC9mb250PjwvdGg+Ci08Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KLTwvZm9udD4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KLSAgPC90cj4KLQotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc2VydmVyZGVwbG95Lmh0bWwiPlNlcnZlckRlcGxveTwvYT48L3RkPgotICAgIDx0ZD48cD5UYXNrIHRvIHJ1biBhICZxdW90O2hvdCZxdW90OyBkZXBsb3ltZW50IHRvb2wgZm9yIHZlbmRvci1zcGVjaWZpYwotICAgICBKMkVFIHNlcnZlci4KLSAgICA8L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy93bGpzcGMuaHRtbCI+V2xqc3BjPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvbXBpbGVzIEpTUCBwYWdlcyB1c2luZyBXZWJMb2dpYyBKU1AKKyAgICAgY29tcGlsZXIsIDxjb2RlPndlYmxvZ2ljLmpzcGM8L2NvZGU+LiAoRm9yIG5vbi1XZWJMb2dpYyBKU1AKKyAgICAgY29tcGlsZXIsIHNlZSB0aGUgPGEgaHJlZj0iVGFza3MvanNwYy5odG1sIj5Kc3BDPC9hPgorICAgICB0YXNrLjwvcD48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+PC9wPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci08dGggYWxpZ249ImxlZnQiPgotPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08YSBuYW1lPSJkb2MiPkRvY3VtZW50YXRpb24gVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJkZXBsb3kiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5EZXBsb3ltZW50IFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9qYXZhZG9jLmh0bWwiPkphdmFkb2MvPGk+SmF2YWRvYzI8L2k+PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkdlbmVyYXRlcyBjb2RlIGRvY3VtZW50YXRpb24gdXNpbmcgdGhlIDxpPmphdmFkb2M8L2k+IHRvb2wuCi0gICAgIFRoZSBKYXZhZG9jMiB0YXNrIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgSmF2YWRvYyB0YXNrIGluc3RlYWQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvc2VydmVyZGVwbG95Lmh0bWwiPlNlcnZlckRlcGxveTwvYT48L3RkPgorICAgIDx0ZD48cD5SdW5zIGEgJnF1b3Q7aG90JnF1b3Q7IGRlcGxveW1lbnQgdG9vbCBmb3IgdmVuZG9yLXNwZWNpZmljCisgICAgIEoyRUUgc2VydmVyLjwvcD48L3RkPgogICA8L3RyPgotCiA8L3RhYmxlPgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9ImVqYiI+RUpCIFRhc2tzPC9hPgotPC9mb250PjwvdGg+Ci08Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KLTwvZm9udD4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKzxkaXYgY2xhc3M9ImZsb2F0IiBpZD0iZG9jIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+RG9jdW1lbnRhdGlvbiBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvZWpiLmh0bWwiPkVKQiBUYXNrczwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2phdmFkb2MuaHRtbCI+SmF2YWRvYzwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgY29kZSBkb2N1bWVudGF0aW9uIHVzaW5nIHRoZSA8a2JkPmphdmFkb2M8L2tiZD4KKyAgICAgdG9vbC4gPGVtPlRoZSA8Y29kZT5KYXZhZG9jMjwvY29kZT4gdGFzayBpcyA8dT5kZXByZWNhdGVkPC91PjsgdXNlCisgICAgIHRoZSA8Y29kZT5KYXZhZG9jPC9jb2RlPiB0YXNrIGluc3RlYWQuPC9lbT48L3A+PC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxkaXYgY2xhc3M9ImZsb2F0IiBpZD0iZWpiIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+RUpCIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgorICA8L3RyPgorCisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZWpiLmh0bWwiPkVKQiBUYXNrczwvYT48L3RkPgogICAgIDx0ZD48cD4oU2VlIHRoZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJpbmcgdGhlIEVKQiB0YXNrcy4pPC9wPjwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9ImV4ZWMiPkV4ZWN1dGlvbiBUYXNrczwvYT4KLTwvZm9udD48L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Cis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9ImV4ZWMiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5FeGVjdXRpb24gVGFza3M8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9InJpZ2h0Ij48YSBocmVmPSIjdG9wIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij4mI3gxZjUxZDs8L2E+PC9zcGFuPgorPC9kaXY+CisKKzx0YWJsZT4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXNrIE5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2FudC5odG1sIj5BbnQ8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9hbnQuaHRtbCI+QW50PC9hPjwvdGQ+CiAgICAgPHRkPjxwPlJ1bnMgQW50IG9uIGEgc3VwcGxpZWQgYnVpbGRmaWxlLCBvcHRpb25hbGx5CiAgICAgIHBhc3NpbmcgcHJvcGVydGllcyAod2l0aCBwb3NzaWJseSBuZXcgdmFsdWVzKS4KICAgICAgVGhpcyB0YXNrIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHN1Yi1wcm9qZWN0cy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvYW50Y2FsbC5odG1sIj5BbnRDYWxsPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvYW50Y2FsbC5odG1sIj5BbnRDYWxsPC9hPjwvdGQ+CiAgICAgPHRkPjxwPlJ1bnMgYW5vdGhlciB0YXJnZXQgd2l0aGluIHRoZSBzYW1lIGJ1aWxkZmlsZSwgb3B0aW9uYWxseQogICAgICBwYXNzaW5nIHByb3BlcnRpZXMgKHdpdGggcG9zc2libHkgbmV3IHZhbHVlcykuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2FwcGx5Lmh0bWwiPkFwcGx5LzxpPkV4ZWNPbjwvaT48L2E+PC90ZD4KLSAgICA8dGQ+PHA+RXhlY3V0ZXMgYSBzeXN0ZW0gY29tbWFuZC4gV2hlbiB0aGUgPGNvZGU+b3M8L2NvZGU+IGF0dHJpYnV0ZSBpcworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2FwcGx5Lmh0bWwiPkFwcGx5LzxlbT5FeGVjT248L2VtPjwvYT48L3RkPgorICAgIDx0ZD48cD5FeGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kLiBXaGVuIHRoZSA8dmFyPm9zPC92YXI+IGF0dHJpYnV0ZSBpcwogICAgICBzcGVjaWZpZWQsIHRoZSBjb21tYW5kIGlzIG9ubHkgZXhlY3V0ZWQgd2hlbiBBbnQgaXMgcnVuIG9uIG9uZQogICAgICBvZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGluZyBzeXN0ZW1zLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9kZXBlbmRzZXQuaHRtbCI+RGVwZW5kc2V0PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlRoaXMgdGFzayBjb21wYXJlcyBhIHNldCBvZiBzb3VyY2UgZmlsZXMgd2l0aCBhIHNldCBvZiB0YXJnZXQKKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9kZXBlbmRzZXQuaHRtbCI+RGVwZW5kc2V0PC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvbXBhcmVzIGEgc2V0IG9mIHNvdXJjZSBmaWxlcyB3aXRoIGEgc2V0IG9mIHRhcmdldAogICAgICBmaWxlcy4gIElmIGFueSBvZiB0aGUgc291cmNlIGZpbGVzIGlzIG5ld2VyIHRoYW4gYW55IG9mCi0gICAgIHRoZSB0YXJnZXQgZmlsZXMsIGFsbCB0aGUgdGFyZ2V0IGZpbGVzIGFyZSByZW1vdmVkLiA8L3A+PC90ZD4KKyAgICAgdGhlIHRhcmdldCBmaWxlcywgYWxsIHRoZSB0YXJnZXQgZmlsZXMgYXJlIHJlbW92ZWQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2V4ZWMuaHRtbCI+RXhlYzwvYT48L3RkPgotICAgIDx0ZD48cD5FeGVjdXRlcyBhIHN5c3RlbSBjb21tYW5kLiBXaGVuIHRoZSA8Y29kZT5vczwvY29kZT4gYXR0cmlidXRlCisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZXhlYy5odG1sIj5FeGVjPC9hPjwvdGQ+CisgICAgPHRkPjxwPkV4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQuIFdoZW4gdGhlIDx2YXI+b3M8L3Zhcj4gYXR0cmlidXRlCiAgICAgIGlzIHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgaXMgb25seSBleGVjdXRlZCB3aGVuIEFudCBpcyBydW4gb24gb25lIG9mCiAgICAgIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW5nIHN5c3RlbXMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+SmF2YTwvYT48L3RkPgotICAgIDx0ZD48cD5FeGVjdXRlcyBhIEphdmEgY2xhc3Mgd2l0aGluIHRoZSBydW5uaW5nIChBbnQpIFZNLCBvciBpbgotICAgICBhbm90aGVyIFZNIGlmIHRoZSA8Y29kZT5mb3JrPC9jb2RlPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+SmF2YTwvYT48L3RkPgorICAgIDx0ZD48cD5FeGVjdXRlcyBhIEphdmEgY2xhc3Mgd2l0aGluIHRoZSBydW5uaW5nIChBbnQpIEpWTSwgb3IgaW4KKyAgICAgYW5vdGhlciBKVk0gaWYgdGhlIDx2YXI+Zm9yazwvdmFyPiBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wYXJhbGxlbC5odG1sIj5QYXJhbGxlbDwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3BhcmFsbGVsLmh0bWwiPlBhcmFsbGVsPC9hPjwvdGQ+CiAgICAgPHRkPjxwPkEgY29udGFpbmVyIHRhc2sgdGhhdCBjYW4gY29udGFpbiBvdGhlciBBbnQgdGFza3MuCiAgICAgIEVhY2ggbmVzdGVkIHRhc2sgc3BlY2lmaWVkIHdpdGhpbiB0aGUgPGNvZGU+Jmx0O3BhcmFsbGVsJmd0OzwvY29kZT4KICAgICAgdGFnIHdpbGwgYmUgZXhlY3V0ZWQgaW4gaXRzIG93biB0aHJlYWQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NlcXVlbnRpYWwuaHRtbCI+U2VxdWVudGlhbDwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3NlcXVlbnRpYWwuaHRtbCI+U2VxdWVudGlhbDwvYT48L3RkPgogICAgIDx0ZD48cD5BIGNvbnRhaW5lciB0YXNrIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgQW50IHRhc2tzLgogICAgICBUaGUgbmVzdGVkIHRhc2tzIGFyZSBzaW1wbHkgZXhlY3V0ZWQgaW4gc2VxdWVuY2UuIEl0cyBwcmltYXJ5IHVzZSBpcwogICAgICB0byBzdXBwb3J0IHRoZSBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiBhIHN1YnNldCBvZiB0YXNrcyB3aXRoaW4KICAgICAgdGhlIDxjb2RlPiZsdDtwYXJhbGxlbCZndDs8L2NvZGU+IHRhZy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc2xlZXAuaHRtbCI+U2xlZXA8L2E+PC90ZD4KLSAgICA8dGQ+PHA+IEEgdGFzayBmb3Igc3VzcGVuZGluZyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIHBlcmlvZCBvZiB0aW1lLgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3NsZWVwLmh0bWwiPlNsZWVwPC9hPjwvdGQ+CisgICAgPHRkPjxwPlN1c3BlbmRzIGV4ZWN1dGlvbiBmb3IgYSBzcGVjaWZpZWQgcGVyaW9kIG9mIHRpbWUuCiAgICAgIFVzZWZ1bCB3aGVuIGEgYnVpbGQgb3IgZGVwbG95bWVudCBwcm9jZXNzIHJlcXVpcmVzIGFuIGludGVydmFsIGJldHdlZW4KICAgICAgdGFza3MuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3N1YmFudC5odG1sIj5TdWJhbnQ8L2E+PC90ZD4KLSAgICA8dGQ+PHA+IENhbGxzIGEgZ2l2ZW4gdGFyZ2V0IGZvciBhbGwgZGVmaW5lZCBzdWItYnVpbGRzLiBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiBhbnQgZm9yIGJ1bGsgcHJvamVjdCBleGVjdXRpb24uPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvc3ViYW50Lmh0bWwiPlN1YmFudDwvYT48L3RkPgorICAgIDx0ZD48cD5DYWxscyBhIGdpdmVuIHRhcmdldCBmb3IgYWxsIGRlZmluZWQgc3ViLWJ1aWxkcy4gVGhpcyBpcyBhbgorICAgICBleHRlbnNpb24gb2YgYW50IGZvciBidWxrIHByb2plY3QgZXhlY3V0aW9uLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy93YWl0Zm9yLmh0bWwiPldhaXRmb3I8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy93YWl0Zm9yLmh0bWwiPldhaXRmb3I8L2E+PC90ZD4KICAgICA8dGQ+PHA+QmxvY2tzIGV4ZWN1dGlvbiB1bnRpbCBhIHNldCBvZiBzcGVjaWZpZWQgY29uZGl0aW9ucyBiZWNvbWUgdHJ1ZS4KICAgICAgVGhpcyB0YXNrIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUKICAgICAgPGEgaHJlZj0iVGFza3MvcGFyYWxsZWwuaHRtbCI+UGFyYWxsZWw8L2E+IHRhc2sgdG8gc3luY2hyb25pemUKQEAgLTQzMSw3NjggKzM4MSw3MjEgQEAKICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0iZmlsZSI+RmlsZSBUYXNrczwvYT4KLTwvZm9udD48L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Cis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9ImZpbGUiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5GaWxlIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9hdHRyaWIuaHRtbCI+QXR0cmliPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvYXR0cmliLmh0bWwiPkF0dHJpYjwvYT48L3RkPgogICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBwZXJtaXNzaW9ucyBhbmQvb3IgYXR0cmlidXRlcyBvZiBhIGZpbGUgb3IgYWxsCi0gICAgZmlsZXMgaW5zaWRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIEN1cnJlbnRseSwgaXQgaGFzIGVmZmVjdAotICAgIG9ubHkgdW5kZXIgV2luZG93cy48L3A+PC90ZD4KKyAgICAgZmlsZXMgaW5zaWRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIEN1cnJlbnRseSwgaXQgaGFzIGVmZmVjdAorICAgICBvbmx5IHVuZGVyIFdpbmRvd3MuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NoZWNrc3VtLmh0bWwiPkNoZWNrc3VtPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY2hlY2tzdW0uaHRtbCI+Q2hlY2tzdW08L2E+PC90ZD4KICAgICA8dGQ+PHA+R2VuZXJhdGVzIGEgY2hlY2tzdW0gZm9yIGEgZmlsZSBvciBzZXQgb2YgZmlsZXMuIFRoaXMgdGFzayBjYW4KICAgICAgYWxzbyBiZSB1c2VkIHRvIHBlcmZvcm0gY2hlY2tzdW0gdmVyaWZpY2F0aW9ucy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvY2hncnAuaHRtbCI+Q2hncnA8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9jaGdycC5odG1sIj5DaGdycDwvYT48L3RkPgogICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBncm91cCBvd25lcnNoaXAgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUKLSAgICB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBDdXJyZW50bHksIGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlcgotICAgIFVuaXguPC9wPjwvdGQ+CisgICAgIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIEN1cnJlbnRseSwgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyCisgICAgIFVuaXguPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NobW9kLmh0bWwiPkNobW9kPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY2htb2QuaHRtbCI+Q2htb2Q8L2E+PC90ZD4KICAgICA8dGQ+PHA+Q2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYSBmaWxlIG9yIGFsbCBmaWxlcyBpbnNpZGUgdGhlCiAgICAgIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4gQ3VycmVudGx5LCBpdCBoYXMgZWZmZWN0IG9ubHkgdW5kZXIgVW5peC4KICAgICAgVGhlIHBlcm1pc3Npb25zIGFyZSBhbHNvIFVOSVggc3R5bGUsIGxpa2UgdGhlIGFyZ3VtZW50cyBmb3IgdGhlCi0gICAgPGk+Y2htb2Q8L2k+IGNvbW1hbmQuPC9wPjwvdGQ+CisgICAgIDxrYmQ+Y2htb2Q8L2tiZD4gY29tbWFuZC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvY2hvd24uaHRtbCI+Q2hvd248L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9jaG93bi5odG1sIj5DaG93bjwvYT48L3RkPgogICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBvd25lciBvZiBhIGZpbGUgb3IgYWxsIGZpbGVzIGluc2lkZSB0aGUKLSAgICBzcGVjaWZpZWQgZGlyZWN0b3JpZXMuIEN1cnJlbnRseSwgaXQgaGFzIGVmZmVjdCBvbmx5IHVuZGVyCi0gICAgVW5peC48L3A+PC90ZD4KKyAgICAgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLiBDdXJyZW50bHksIGl0IGhhcyBlZmZlY3Qgb25seSB1bmRlcgorICAgICBVbml4LjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9jb25jYXQuaHRtbCI+Q29uY2F0PC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY29uY2F0Lmh0bWwiPkNvbmNhdDwvYT48L3RkPgogICAgIDx0ZD48cD5Db25jYXRlbmF0ZXMgbXVsdGlwbGUgZmlsZXMgaW50byBhIHNpbmdsZSBvbmUgb3IgdG8gQW50J3MKICAgICAgbG9nZ2luZyBzeXN0ZW0uPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT48L3RkPgogICAgIDx0ZD48cD5Db3BpZXMgYSBmaWxlIG9yIEZpbGVzZXQgdG8gYSBuZXcgZmlsZSBvciBkaXJlY3RvcnkuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NvcHlkaXIuaHRtbCI+PGk+Q29weWRpcjwvaT48L2E+PC90ZD4KLSAgICA8dGQ+PHA+PGk+RGVwcmVjYXRlZC48L2k+ICBVc2UgdGhlCi0gICAgIDxhIGhyZWY9IlRhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT4gdGFzayBpbnN0ZWFkLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2NvcHlkaXIuaHRtbCI+PGVtPkNvcHlkaXI8L2VtPjwvYT48L3RkPgorICAgIDx0ZD48cD48ZW0+PHU+RGVwcmVjYXRlZDwvdT48L2VtPi4gIFVzZQorICAgICB0aGUgPGEgaHJlZj0iVGFza3MvY29weS5odG1sIj5Db3B5PC9hPiB0YXNrIGluc3RlYWQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NvcHlmaWxlLmh0bWwiPjxpPkNvcHlmaWxlPC9pPjwvYT48L3RkPgotICAgIDx0ZD48cD48aT5EZXByZWNhdGVkLjwvaT4gIFVzZSB0aGUKLSAgICAgPGEgaHJlZj0iVGFza3MvY29weS5odG1sIj5Db3B5PC9hPiB0YXNrIGluc3RlYWQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY29weWZpbGUuaHRtbCI+PGVtPkNvcHlmaWxlPC9lbT48L2E+PC90ZD4KKyAgICA8dGQ+PHA+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uICBVc2UKKyAgICAgdGhlIDxhIGhyZWY9IlRhc2tzL2NvcHkuaHRtbCI+Q29weTwvYT4gdGFzayBpbnN0ZWFkLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9kZWxldGUuaHRtbCI+RGVsZXRlPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZGVsZXRlLmh0bWwiPkRlbGV0ZTwvYT48L3RkPgogICAgIDx0ZD48cD5EZWxldGVzIGVpdGhlciBhIHNpbmdsZSBmaWxlLCBhbGwgZmlsZXMgYW5kIHN1Yi1kaXJlY3RvcmllcwotICAgICBpbiBhIHNwZWNpZmllZCBkaXJlY3RvcnksIG9yIGEgc2V0IG9mIGZpbGVzIHNwZWNpZmllZCBieSBvbmUgb3IgbW9yZQotICAgICA8YSBocmVmPSJUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cy48L3A+PC90ZD4KKyAgICAgaW4gYSBzcGVjaWZpZWQgZGlyZWN0b3J5LCBvciBhIHNldCBvZiBmaWxlcyBzcGVjaWZpZWQgYnkgb25lIG9yCisgICAgIG1vcmUgPGEgaHJlZj0iVHlwZXMvZmlsZXNldC5odG1sIj5GaWxlU2V0PC9hPnMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2RlbHRyZWUuaHRtbCI+PGk+RGVsdHJlZTwvaT48L2E+PC90ZD4KLSAgICA8dGQ+PHA+PGk+RGVwcmVjYXRlZC48L2k+ICBVc2UgdGhlCi0gICAgIDxhIGhyZWY9IlRhc2tzL2RlbGV0ZS5odG1sIj5EZWxldGU8L2E+IHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9kZWx0cmVlLmh0bWwiPjxlbT5EZWx0cmVlPC9lbT48L2E+PC90ZD4KKyAgICA8dGQ+PHA+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uICBVc2UKKyAgICAgdGhlIDxhIGhyZWY9IlRhc2tzL2RlbGV0ZS5odG1sIj5EZWxldGU8L2E+IHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvZmlsdGVyLmh0bWwiPkZpbHRlcjwvYT48L3RkPgotICAgIDx0ZD48cD5TZXRzIGEgdG9rZW4gZmlsdGVyIGZvciB0aGlzIHByb2plY3QsIG9yIHJlYWRzIG11bHRpcGxlIHRva2VuCi0gICAgIGZpbHRlcnMgZnJvbSBhIHNwZWNpZmllZCBmaWxlIGFuZCBzZXRzIHRoZXNlIGFzIGZpbHRlcnMuIFRva2VuIGZpbHRlcnMKLSAgICAgYXJlIHVzZWQgYnkgYWxsIHRhc2tzIHRoYXQgcGVyZm9ybSBmaWxlLWNvcHlpbmcgb3BlcmF0aW9ucy48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9maWx0ZXIuaHRtbCI+RmlsdGVyPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgYSB0b2tlbiBmaWx0ZXIgZm9yIHRoaXMgcHJvamVjdCwgb3IgcmVhZHMgbXVsdGlwbGUKKyAgICAgdG9rZW4gZmlsdGVycyBmcm9tIGEgc3BlY2lmaWVkIGZpbGUgYW5kIHNldHMgdGhlc2UgYXMKKyAgICAgZmlsdGVycy4gVG9rZW4gZmlsdGVycyBhcmUgdXNlZCBieSBhbGwgdGFza3MgdGhhdCBwZXJmb3JtCisgICAgIGZpbGUtY29weWluZyBvcGVyYXRpb25zLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9maXhjcmxmLmh0bWwiPkZpeENSTEY8L2E+PC90ZD4KLSAgICA8dGQ+PHA+TW9kaWZpZXMgYSBmaWxlIHRvIGFkZCBvciByZW1vdmUgdGFicywgY2FycmlhZ2UgcmV0dXJucywgbGluZWZlZWRzLAotICAgICBhbmQgRU9GIGNoYXJhY3RlcnMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZml4Y3JsZi5odG1sIj5GaXhDUkxGPC9hPjwvdGQ+CisgICAgPHRkPjxwPk1vZGlmaWVzIGEgZmlsZSB0byBhZGQgb3IgcmVtb3ZlIHRhYnMsIGNhcnJpYWdlIHJldHVybnMsCisgICAgIGxpbmVmZWVkcywgYW5kIEVPRiBjaGFyYWN0ZXJzLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9nZXQuaHRtbCI+R2V0PC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZ2V0Lmh0bWwiPkdldDwvYT48L3RkPgogICAgIDx0ZD48cD5HZXRzIGEgZmlsZSBmcm9tIGEgVVJMLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9ta2Rpci5odG1sIj5Na2RpcjwvYT48L3RkPgotICAgIDx0ZD48cD5DcmVhdGVzIGEgZGlyZWN0b3J5LiBOb24tZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkLAotICAgICB3aGVuIG5lY2Vzc2FyeS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9ta2Rpci5odG1sIj5Na2RpcjwvYT48L3RkPgorICAgIDx0ZD48cD5DcmVhdGVzIGEgZGlyZWN0b3J5LiBOb24tZXhpc3RlbnQgcGFyZW50IGRpcmVjdG9yaWVzIGFyZQorICAgICBjcmVhdGVkLCB3aGVuIG5lY2Vzc2FyeS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPk1vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3IgYSBzZXQocykgb2YgZmlsZShzKSB0bwotICAgICBhIG5ldyBkaXJlY3RvcnkuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPjwvdGQ+CisgICAgPHRkPjxwPk1vdmVzIGEgZmlsZSB0byBhIG5ldyBmaWxlIG9yIGRpcmVjdG9yeSwgb3IgYSBzZXQocykgb2YKKyAgICAgZmlsZShzKSB0byBhIG5ldyBkaXJlY3RvcnkuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3BhdGNoLmh0bWwiPlBhdGNoPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkFwcGxpZXMgYSAmcXVvdDtkaWZmJnF1b3Q7IGZpbGUgdG8gb3JpZ2luYWxzLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3BhdGNoLmh0bWwiPlBhdGNoPC9hPjwvdGQ+CisgICAgICA8dGQ+PHA+QXBwbGllcyBhIDxxPmRpZmY8L3E+IGZpbGUgdG8gb3JpZ2luYWxzLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9yZW5hbWUuaHRtbCI+PGk+UmVuYW1lPC9pPjwvYT48L3RkPgotICAgIDx0ZD48cD48aT5EZXByZWNhdGVkLjwvaT4gIFVzZSB0aGUgPGEgaHJlZj0iVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPgotICAgIHRhc2sgaW5zdGVhZC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9yZW5hbWUuaHRtbCI+PGVtPlJlbmFtZTwvZW0+PC9hPjwvdGQ+CisgICAgPHRkPjxwPjxlbT48dT5EZXByZWNhdGVkPC91PjwvZW0+LiAgVXNlCisgICAgdGhlIDxhIGhyZWY9IlRhc2tzL21vdmUuaHRtbCI+TW92ZTwvYT4gdGFzayBpbnN0ZWFkLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwiPgotICAgICA8aT5SZW5hbWVFeHRlbnNpb25zPC9pPjwvYT48L3RkPgotICAgIDx0ZD48cD48aT5EZXByZWNhdGVkPC9pPi4gVXNlIHRoZSA8YSBocmVmPSJUYXNrcy9tb3ZlLmh0bWwiPk1vdmU8L2E+Ci0gICAgIHRhc2sgd2l0aCBhIDxhIGhyZWY9IlR5cGVzL21hcHBlci5odG1sI2dsb2ItbWFwcGVyIj5nbG9iIG1hcHBlcjwvYT4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9yZW5hbWVleHRlbnNpb25zLmh0bWwiPjxlbT5SZW5hbWVFeHRlbnNpb25zPC9lbT48L2E+PC90ZD4KKyAgICA8dGQ+PHA+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uIFVzZQorICAgICB0aGUgPGEgaHJlZj0iVGFza3MvbW92ZS5odG1sIj5Nb3ZlPC9hPiB0YXNrIHdpdGgKKyAgICAgYSA8YSBocmVmPSJUeXBlcy9tYXBwZXIuaHRtbCNnbG9iLW1hcHBlciI+Z2xvYiBtYXBwZXI8L2E+CiAgICAgIGluc3RlYWQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3JlcGxhY2UuaHRtbCI+UmVwbGFjZTwvYT48L3RkPgotICAgIDx0ZD48cD5SZXBsYWNlIGlzIGEgZGlyZWN0b3J5LWJhc2VkIHRhc2sgZm9yIHJlcGxhY2luZyB0aGUgb2NjdXJyZW5jZQotICAgICBvZiBhIGdpdmVuIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nIGluIHNlbGVjdGVkIGZpbGUuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvcmVwbGFjZS5odG1sIj5SZXBsYWNlPC9hPjwvdGQ+CisgICAgPHRkPjxwPlJlcGxhY2VzIHRoZSBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4gc3RyaW5nIHdpdGggYW5vdGhlcgorICAgICBzdHJpbmcgaW4gYSBmaWxlIG9yIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvcmVwbGFjZXJlZ2V4cC5odG1sIj4KLSAgICAgUmVwbGFjZVJlZ0V4cDwvYT48L3RkPgotICAgIDx0ZD48cD5EaXJlY3RvcnktYmFzZWQgdGFzayBmb3IgcmVwbGFjaW5nIHRoZSBvY2N1cnJlbmNlIG9mIGEgZ2l2ZW4KLSAgICAgcmVndWxhciBleHByZXNzaW9uIHdpdGggYSBzdWJzdGl0dXRpb24gcGF0dGVybiBpbiBhIGZpbGUgb3Igc2V0IG9mCi0gICAgIGZpbGVzLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3JlcGxhY2VyZWdleHAuaHRtbCI+UmVwbGFjZVJlZ0V4cDwvYT48L3RkPgorICAgIDx0ZD48cD5SZXBsYWNlcyB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aXRoCisgICAgIGEgc3Vic3RpdHV0aW9uIHBhdHRlcm4gaW4gYSBmaWxlIG9yIHNldCBvZiBmaWxlcy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc3luYy5odG1sIj5TeW5jPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlN5bmNocm9uaXplIHR3byBkaXJlY3RvcnkgdHJlZXMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvc2V0cGVybWlzc2lvbnMuaHRtbCI+U2V0UGVybWlzc2lvbnM8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgYSBjb2xsZWN0aW9uIG9mIHJlc291cmNlcy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdGVtcGZpbGUuaHRtbCI+VGVtcGZpbGU8L2E+PC90ZD4KLSAgICA8dGQ+PHA+R2VuZXJhdGVzIGEgbmFtZSBmb3IgYSBuZXcgdGVtcG9yYXJ5IGZpbGUgYW5kIHNldHMgdGhlIHNwZWNpZmllZAotICAgICBwcm9wZXJ0eSB0byB0aGF0IG5hbWUuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvc3luYy5odG1sIj5TeW5jPC9hPjwvdGQ+CisgICAgPHRkPjxwPlN5bmNocm9uaXplcyB0d28gZGlyZWN0b3J5IHRyZWVzLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy90b3VjaC5odG1sIj5Ub3VjaDwvYT48L3RkPgotICAgIDx0ZD48cD5DaGFuZ2VzIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZiBhIGZpbGUgYW5kIHBvc3NpYmx5IGNyZWF0ZXMgaXQgYXQKLSAgICAgdGhlIHNhbWUgdGltZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy90ZW1wZmlsZS5odG1sIj5UZW1wZmlsZTwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBuYW1lIGZvciBhIG5ldyB0ZW1wb3JhcnkgZmlsZSBhbmQgc2V0cyB0aGUKKyAgICAgc3BlY2lmaWVkIHByb3BlcnR5IHRvIHRoYXQgbmFtZS48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3RvdWNoLmh0bWwiPlRvdWNoPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNoYW5nZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSBhbmQgcG9zc2libHkKKyAgICAgY3JlYXRlcyBpdCBhdCB0aGUgc2FtZSB0aW1lLjwvcD48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+PC9wPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci08dGggYWxpZ249ImxlZnQiPgotPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08YSBuYW1lPSJleHRlbnNpb25zIj5KYXZhMiBFeHRlbnNpb25zIFRhc2tzPC9hPgotPC9mb250PjwvdGg+Ci08Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KLTwvZm9udD4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKzxkaXYgY2xhc3M9ImZsb2F0IiBpZD0iZXh0ZW5zaW9ucyI+CisgICAgPHNwYW4gY2xhc3M9ImxlZnQiPkphdmEgRXh0ZW5zaW9ucyBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+CisgIDx0cj4KKyAgICA8dGQ+CiAgICAgPGEgaHJlZj0iVGFza3MvamFybGliLWF2YWlsYWJsZS5odG1sIj5KYXJsaWItYXZhaWxhYmxlPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNoZWNrIHdoZXRoZXIgYW4gZXh0ZW5zaW9uIGlzIHByZXNlbnQgaW4gYSBGaWxlU2V0IG9yIGFuCi0gICAgICBFeHRlbnNpb25TZXQuIElmIHRoZSBleHRlbnNpb24gaXMgcHJlc2VudCwgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBpcwotICAgICBzZXQuPC9wPgorICAgIDx0ZD48cD5DaGVja3Mgd2hldGhlciBhbiBleHRlbnNpb24gaXMgcHJlc2VudCBpbiBhIEZpbGVTZXQgb3IgYW4KKyAgICAgIEV4dGVuc2lvblNldC4gSWYgdGhlIGV4dGVuc2lvbiBpcyBwcmVzZW50LCB0aGUgc3BlY2lmaWVkCisgICAgICBwcm9wZXJ0eSBpcyBzZXQuPC9wPgogICAgIDwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPgorICA8dHI+CisgICAgPHRkPgogICAgIDxhIGhyZWY9IlRhc2tzL2phcmxpYi1kaXNwbGF5Lmh0bWwiPkphcmxpYi1kaXNwbGF5PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkRpc3BsYXkgdGhlICZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsgYW5kCi0gICAgICAmcXVvdDtQYWNrYWdlIFNwZWNpZmljYXRpb24mcXVvdDsgaW5mb3JtYXRpb24gY29udGFpbmVkIHdpdGhpbiB0aGUKLSAgICAgIHNwZWNpZmllZCBqYXJzLjwvcD4KKyAgICA8dGQ+PHA+RGlzcGxheXMgdGhlIDxxPk9wdGlvbmFsIFBhY2thZ2U8L3E+IGFuZCA8cT5QYWNrYWdlCisgICAgIFNwZWNpZmljYXRpb248L3E+IGluZm9ybWF0aW9uIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNwZWNpZmllZAorICAgICBqYXJzLjwvcD4KICAgICA8L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD4KKyAgPHRyPgorICAgIDx0ZD4KICAgICA8YSBocmVmPSJUYXNrcy9qYXJsaWItbWFuaWZlc3QuaHRtbCI+SmFybGliLW1hbmlmZXN0PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlRhc2sgdG8gZ2VuZXJhdGUgYSBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIGFsbCB0aGUgZGVwZW5kZW5jaWVzCi0gICAgICBpbiBtYW5pZmVzdC4gVGhlIGRlcGVuZGVuY2llcyBhcmUgZGV0ZXJtaW5lZCBieSBsb29raW5nIGluIHRoZQotICAgICAgc3BlY2lmaWVkIHBhdGggYW5kIHNlYXJjaGluZyBmb3IgRXh0ZW5zaW9uLyZxdW90O09wdGlvbmFsIFBhY2thZ2UmcXVvdDsKLSAgICAgIHNwZWNpZmljYXRpb25zIGluIHRoZSBtYW5pZmVzdHMgb2YgdGhlIGphcnMuPC9wPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBtYW5pZmVzdCB0aGF0IGRlY2xhcmVzIGFsbCB0aGUgZGVwZW5kZW5jaWVzIGluCisgICAgIG1hbmlmZXN0LiBUaGUgZGVwZW5kZW5jaWVzIGFyZSBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgaW4gdGhlCisgICAgIHNwZWNpZmllZCBwYXRoIGFuZCBzZWFyY2hpbmcgZm9yIDxxPkV4dGVuc2lvbjwvcT4vPHE+T3B0aW9uYWwKKyAgICAgUGFja2FnZTwvcT4gc3BlY2lmaWNhdGlvbnMgaW4gdGhlIG1hbmlmZXN0cyBvZiB0aGUgamFycy48L3A+CiAgICAgPC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+CisgIDx0cj4KKyAgICA8dGQ+CiAgICAgPGEgaHJlZj0iVGFza3MvamFybGliLXJlc29sdmUuaHRtbCI+SmFybGliLXJlc29sdmU8L2E+PC90ZD4KLSAgICA8dGQ+PHA+VHJ5IHRvIGxvY2F0ZSBhIGphciB0byBzYXRpc2Z5IGFuIGV4dGVuc2lvbiwgYW5kIHBsYWNlIHRoZQotICAgICAgbG9jYXRpb24gb2YgdGhlIGphciBpbnRvIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuPC9wPgorICAgIDx0ZD48cD5UcmllcyB0byBsb2NhdGUgYSBqYXIgdG8gc2F0aXNmeSBhbiBleHRlbnNpb24sIGFuZCBwbGFjZXMgdGhlCisgICAgIGxvY2F0aW9uIG9mIHRoZSBqYXIgaW50byB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LjwvcD4KICAgICA8L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+PC9wPgotPHA+PC9wPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci08dGggYWxpZ249ImxlZnQiPgotPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08YSBuYW1lPSJsb2ciPkxvZ2dpbmcgVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJsb2ciPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5Mb2dnaW5nIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9yZWNvcmRlci5odG1sIj5SZWNvcmQ8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9yZWNvcmRlci5odG1sIj5SZWNvcmQ8L2E+PC90ZD4KICAgICA8dGQ+PHA+UnVucyBhIGxpc3RlbmVyIHRoYXQgcmVjb3JkcyB0aGUgbG9nZ2luZyBvdXRwdXQgb2YgdGhlCi0gICAgIGJ1aWxkLXByb2Nlc3MgZXZlbnRzIHRvIGEgZmlsZS4gU2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0CisgICAgIGJ1aWxkIHByb2Nlc3MgZXZlbnRzIHRvIGEgZmlsZS4gU2V2ZXJhbCByZWNvcmRlcnMgY2FuIGV4aXN0CiAgICAgIGF0IHRoZSBzYW1lIHRpbWUuIEVhY2ggcmVjb3JkZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0ibWFpbCI+TWFpbCBUYXNrczwvYT4KLTwvZm9udD48L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Cis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9Im1haWwiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5NYWlsIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+PC90ZD4KLSAgICA8dGQ+PHA+QSB0YXNrIHRvIHNlbmQgU01UUCBlbWFpbC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9tYWlsLmh0bWwiPk1haWw8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U2VuZHMgU01UUCBlbWFpbC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvbWltZW1haWwuaHRtbCI+TWltZU1haWw8L2E+PC90ZD4KLSAgICA8dGQ+PHA+PGk+RGVwcmVjYXRlZDwvaT4uIFVzZSB0aGUgPGEgaHJlZj0iVGFza3MvbWFpbC5odG1sIj5NYWlsPC9hPgotICAgICB0YXNrIGluc3RlYWQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbWltZW1haWwuaHRtbCI+PGVtPk1pbWVNYWlsPC9lbT48L2E+PC90ZD4KKyAgICA8dGQ+PHA+PGVtPjx1PkRlcHJlY2F0ZWQ8L3U+PC9lbT4uIFVzZQorICAgICB0aGUgPGEgaHJlZj0iVGFza3MvbWFpbC5odG1sIj5NYWlsPC9hPiB0YXNrIGluc3RlYWQuPC9wPjwvdGQ+CiAgIDwvdHI+Ci0KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0ibWlzYyI+TWlzY2VsbGFuZW91cyBUYXNrczwvYT4KLTwvZm9udD48L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Cis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9Im1pc2MiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5NaXNjZWxsYW5lb3VzIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9kZWZhdWx0ZXhjbHVkZXMuaHRtbCI+RGVmYXVsdGV4Y2x1ZGVzPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPk1vZGlmeSB0aGUgbGlzdCBvZiBkZWZhdWx0IGV4Y2x1ZGUgcGF0dGVybnMgZnJvbSB3aXRoaW4KLSAgICB5b3VyIGJ1aWxkIGZpbGUuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZGVmYXVsdGV4Y2x1ZGVzLmh0bWwiPkRlZmF1bHRleGNsdWRlczwvYT48L3RkPgorICAgIDx0ZD48cD5Nb2RpZmllcyB0aGUgbGlzdCBvZiBkZWZhdWx0IGV4Y2x1ZGUgcGF0dGVybnMgZnJvbSB3aXRoaW4KKyAgICAgeW91ciBidWlsZCBmaWxlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9lY2hvLmh0bWwiPkVjaG88L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9lY2hvLmh0bWwiPkVjaG88L2E+PC90ZD4KICAgICA8dGQ+PHA+RWNob2VzIHRleHQgdG8gPGNvZGU+U3lzdGVtLm91dDwvY29kZT4gb3IgdG8gYSBmaWxlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9mYWlsLmh0bWwiPkZhaWw8L2E+PC90ZD4KLSAgICA8dGQ+PHA+RXhpdHMgdGhlIGN1cnJlbnQgYnVpbGQgYnkgdGhyb3dpbmcgYSBCdWlsZEV4Y2VwdGlvbiwKLSAgICAgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2ZhaWwuaHRtbCI+RmFpbDwvYT48L3RkPgorICAgIDx0ZD48cD5FeGl0cyB0aGUgY3VycmVudCBidWlsZCBieSB0aHJvd2luZworICAgICBhIDxjb2RlPkJ1aWxkRXhjZXB0aW9uPC9jb2RlPiwgb3B0aW9uYWxseSBwcmludGluZyBhZGRpdGlvbmFsCisgICAgIGluZm9ybWF0aW9uLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9nZW5rZXkuaHRtbCI+R2VuS2V5PC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZ2Vua2V5Lmh0bWwiPkdlbktleTwvYT48L3RkPgogICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBrZXkgaW4ga2V5c3RvcmUuPC9wPjwvdGQ+CiAgIDwvdHI+Ci0gIAotICAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2hvc3RpbmZvLmh0bWwiPkhvc3RJbmZvPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlNldHMgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBwcm92aWRlZCBob3N0LCBvciB0bwotICAgIHRoZSBob3N0IHRoZSBwcm9jZXNzIGlzIHJ1biBvbi48L3A+PC90ZD4KKworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2hvc3RpbmZvLmh0bWwiPkhvc3RJbmZvPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgcHJvcGVydGllcyByZWxhdGVkIHRvIHRoZSBwcm92aWRlZCBob3N0LCBvciB0byB0aGUKKyAgICAgaG9zdCB0aGUgcHJvY2VzcyBpcyBydW4gb24uPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2lucHV0Lmh0bWwiPklucHV0PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkFsbG93cyB1c2VyIGludGVyYWN0aW9uIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcyBieSBkaXNwbGF5aW5nIGEKLSAgICAgbWVzc2FnZSBhbmQgcmVhZGluZyBhIGxpbmUgb2YgaW5wdXQgZnJvbSB0aGUgY29uc29sZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9pbnB1dC5odG1sIj5JbnB1dDwvYT48L3RkPgorICAgIDx0ZD48cD5BbGxvd3MgdXNlciBpbnRlcmFjdGlvbiBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MgYnkKKyAgICAgZGlzcGxheWluZyBhIG1lc3NhZ2UgYW5kIHJlYWRpbmcgYSBsaW5lIG9mIGlucHV0IGZyb20gdGhlCisgICAgIGNvbnNvbGUuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NjcmlwdC5odG1sIj5TY3JpcHQ8L2E+PC90ZD4KLSAgICA8dGQ+PHA+RXhlY3V0ZXMgYSBzY3JpcHQgaW4gYQotICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2JzZi8iCi0gICAgICB0YXJnZXQ9Il90b3AiPkFwYWNoZSBCU0Y8L2E+LXN1cHBvcnRlZCBsYW5ndWFnZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zY3JpcHQuaHRtbCI+U2NyaXB0PC9hPjwvdGQ+CisgICAgPHRkPjxwPkV4ZWN1dGVzIGEgc2NyaXB0IGluCisgICAgIGEgPGEgaHJlZj0iaHR0cHM6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYnNmLyIgdGFyZ2V0PSJfdG9wIj5BcGFjaGUKKyAgICAgQlNGPC9hPi1zdXBwb3J0ZWQgbGFuZ3VhZ2UuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NvdW5kLmh0bWwiPlNvdW5kPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlBsYXlzIGEgc291bmQgZmlsZSBhdCB0aGUgZW5kIG9mIHRoZSBidWlsZCwgYWNjb3JkaW5nIHRvIHdoZXRoZXIKLSAgICAgdGhlIGJ1aWxkIGZhaWxlZCBvciBzdWNjZWVkZWQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvc291bmQuaHRtbCI+U291bmQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+UGxheXMgYSBzb3VuZCBmaWxlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1aWxkLCBhY2NvcmRpbmcgdG8KKyAgICAgd2hldGhlciB0aGUgYnVpbGQgZmFpbGVkIG9yIHN1Y2NlZWRlZC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc3BsYXNoLmh0bWwiPlNwbGFzaDwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3NwbGFzaC5odG1sIj5TcGxhc2g8L2E+PC90ZD4KICAgICA8dGQ+PHA+RGlzcGxheXMgYSBzcGxhc2ggc2NyZWVuLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9zcWwuaHRtbCI+U3FsPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkV4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHZpYSBKREJDIHRvIGEgZGF0YWJhc2UuCi0gICAgIFN0YXRlbWVudHMgY2FuIGVpdGhlciBiZSByZWFkIGluIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcgdGhlCi0gICAgIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlLCBvciBmcm9tIGJldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwKKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zcWwuaHRtbCI+U3FsPC9hPjwvdGQ+CisgICAgPHRkPjxwPkV4ZWN1dGVzIGEgc2VyaWVzIG9mIFNRTCBzdGF0ZW1lbnRzIHZpYSBKREJDIHRvIGEKKyAgICAgZGF0YWJhc2UuIFN0YXRlbWVudHMgY2FuIGVpdGhlciBiZSByZWFkIGluIGZyb20gYSB0ZXh0IGZpbGUgdXNpbmcKKyAgICAgdGhlIDxjb2RlPnNyYzwvY29kZT4gYXR0cmlidXRlLCBvciBmcm9tIGJldHdlZW4gdGhlIGVuY2xvc2luZyBTUUwKICAgICAgdGFncy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdGFza2RlZi5odG1sIj5UYXNrZGVmPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkFkZHMgYSB0YXNrIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdCwgc3VjaCB0aGF0IHRoaXMKLSAgICAgbmV3IHRhc2sgY2FuIGJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy90YXNrZGVmLmh0bWwiPlRhc2tkZWY8L2E+PC90ZD4KKyAgICA8dGQ+PHA+QWRkcyBhIHRhc2sgZGVmaW5pdGlvbiB0byB0aGUgY3VycmVudCBwcm9qZWN0LCBzdWNoIHRoYXQKKyAgICAgdGhpcyBuZXcgdGFzayBjYW4gYmUgdXNlZCBpbiB0aGUgY3VycmVudCBwcm9qZWN0LjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy90c3RhbXAuaHRtbCI+VFN0YW1wPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlNldHMgdGhlIDxjb2RlPkRTVEFNUDwvY29kZT4sIDxjb2RlPlRTVEFNUDwvY29kZT4sIGFuZAotICAgICA8Y29kZT5UT0RBWTwvY29kZT4gcHJvcGVydGllcyBpbiB0aGUgY3VycmVudCBwcm9qZWN0LCBiYXNlZCBvbgotICAgICB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3RzdGFtcC5odG1sIj5UU3RhbXA8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U2V0cyB0aGUgPGNvZGU+RFNUQU1QPC9jb2RlPiwgPGNvZGU+VFNUQU1QPC9jb2RlPiwKKyAgICAgYW5kIDxjb2RlPlRPREFZPC9jb2RlPiBwcm9wZXJ0aWVzIGluIHRoZSBjdXJyZW50IHByb2plY3QsIGJhc2VkCisgICAgIG9uIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3R5cGVkZWYuaHRtbCI+VHlwZWRlZjwvYT48L3RkPgotICAgIDx0ZD48cD5BZGRzIGEgZGF0YS10eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdCwgc3VjaCB0aGF0IHRoaXMKLSAgICAgbmV3IHR5cGUgY2FuIGJlIHVzZWQgaW4gdGhlIGN1cnJlbnQgcHJvamVjdC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy90eXBlZGVmLmh0bWwiPlR5cGVkZWY8L2E+PC90ZD4KKyAgICA8dGQ+PHA+QWRkcyBhIGRhdGEtdHlwZSBkZWZpbml0aW9uIHRvIHRoZSBjdXJyZW50IHByb2plY3QsIHN1Y2gKKyAgICAgdGhhdCB0aGlzIG5ldyB0eXBlIGNhbiBiZSB1c2VkIGluIHRoZSBjdXJyZW50IHByb2plY3QuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3htbHZhbGlkYXRlLmh0bWwiPlhtbFZhbGlkYXRlPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNoZWNrcyB0aGF0IFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbC1mb3JtZWQpLiBUaGlzIHRhc2sKLSAgICAgdXNlcyB0aGUgWE1MIHBhcnNlciB0aGF0IGlzIGN1cnJlbnRseSB1c2VkIGJ5IEFudCBieSBkZWZhdWx0LCBidXQgYW55IFNBWDEvMgotICAgICBwYXJzZXIgY2FuIGJlIHNwZWNpZmllZCwgaWYgbmVlZGVkLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3htbHZhbGlkYXRlLmh0bWwiPlhtbFZhbGlkYXRlPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNoZWNrcyB0aGF0IFhNTCBmaWxlcyBhcmUgdmFsaWQgKG9yIG9ubHkgd2VsbC1mb3JtZWQpLiBUaGlzCisgICAgIHRhc2sgdXNlcyB0aGUgWE1MIHBhcnNlciB0aGF0IGlzIGN1cnJlbnRseSB1c2VkIGJ5IEFudCBieQorICAgICBkZWZhdWx0LCBidXQgYW55IFNBWDEvMiBwYXJzZXIgY2FuIGJlIHNwZWNpZmllZCwgaWYKKyAgICAgbmVlZGVkLjwvcD48L3RkPgogICA8L3RyPgogPC90YWJsZT4KIAotPHA+PC9wPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci08dGggYWxpZ249ImxlZnQiPgotPGZvbnQgc2l6ZT0iKzAiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08YSBuYW1lPSJwcmVwcm9jIj5QcmUtcHJvY2VzcyBUYXNrczwvYT4KLTwvZm9udD48L3RoPgotPGZvbnQgc2l6ZT0iLTEiIGZhY2U9ImFyaWFsLGhlbHZldGljYSxzYW5zZXJpZiI+Ci08dGggYWxpZ249InJpZ2h0Ij48YSBocmVmPSIjdG9wIj5bQmFjayB0byB0b3BdPC9hPjwvdGg+Ci08L2ZvbnQ+Ci08L3RhYmxlPgotPHRhYmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI0IiBjZWxsc3BhY2luZz0iMCI+Ci0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRoIG5vd3JhcD5UYXNrIE5hbWU8L3RoPgotICAgIDx0aD5EZXNjcmlwdGlvbjwvdGg+Cis8ZGl2IGNsYXNzPSJmbG9hdCIgaWQ9InByZXByb2MiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5QcmUtcHJvY2VzcyBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvYW50bHIuaHRtbCI+QU5UTFI8L2E+PC90ZD4KLSAgICA8dGQ+PHA+SW52b2tlcyB0aGUgPGEgSFJFRj0iaHR0cDovL3d3dy5hbnRsci5vcmcvIiB0YXJnZXQ9Il90b3AiPkFOVExSPC9hPgotICAgICBUcmFuc2xhdG9yIGdlbmVyYXRvciBvbiBhIGdyYW1tYXIgZmlsZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9hbnRsci5odG1sIj5BTlRMUjwvYT48L3RkPgorICAgIDx0ZD48cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy5hbnRsci5vcmcvIgorICAgICB0YXJnZXQ9Il90b3AiPkFOVExSPC9hPiBUcmFuc2xhdG9yIGdlbmVyYXRvciBvbiBhIGdyYW1tYXIKKyAgICAgZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvYW50c3RydWN0dXJlLmh0bWwiPkFudFN0cnVjdHVyZTwvYT48L3RkPgotICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBEVEQgZm9yIEFudCBidWlsZGZpbGVzIHRoYXQgY29udGFpbnMgaW5mb3JtYXRpb24KLSAgICAgYWJvdXQgYWxsIHRhc2tzIGN1cnJlbnRseSBrbm93biB0byBBbnQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvYW50c3RydWN0dXJlLmh0bWwiPkFudFN0cnVjdHVyZTwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYSBEVEQgZm9yIEFudCBidWlsZGZpbGVzIHRoYXQgY29udGFpbnMKKyAgICAgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRhc2tzIGN1cnJlbnRseSBrbm93biB0byBBbnQuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2ltcG9ydC5odG1sIj5JbXBvcnQ8L2E+PC90ZD4KLSAgICA8dGQ+PHA+SW1wb3J0IGFub3RoZXIgYnVpbGQgZmlsZSBhbmQgcG90ZW50aWFsbHkgb3ZlcnJpZGUgdGFyZ2V0cwotICAgIGluIGl0IHdpdGggdGFyZ2V0cyBvZiB5b3VyIG93bi48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9pbXBvcnQuaHRtbCI+SW1wb3J0PC9hPjwvdGQ+CisgICAgPHRkPjxwPkltcG9ydHMgYW5vdGhlciBidWlsZCBmaWxlIGFuZCBwb3RlbnRpYWxseSBvdmVycmlkZXMKKyAgICAgdGFyZ2V0cyBpbiBpdCB3aXRoIHRhcmdldHMgb2YgeW91ciBvd24uPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2luY2x1ZGUuaHRtbCI+SW5jbHVkZTwvYT48L3RkPgotICAgIDx0ZD48cD5JbmNsdWRlIGFub3RoZXIgYnVpbGQgZmlsZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9pbmNsdWRlLmh0bWwiPkluY2x1ZGU8L2E+PC90ZD4KKyAgICA8dGQ+PHA+SW5jbHVkZXMgYW5vdGhlciBidWlsZCBmaWxlLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9qYXZhY2MuaHRtbCI+SmF2YUNDPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkludm9rZXMgdGhlCi0gICAgIDxhIEhSRUY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyIgdGFyZ2V0PSJfdG9wIj4KLSAgICAgSmF2YUNDPC9hPiBjb21waWxlci1jb21waWxlciBvbiBhIGdyYW1tYXIgZmlsZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qYXZhY2MuaHRtbCI+SmF2YUNDPC9hPjwvdGQ+CisgICAgPHRkPjxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vamF2YWNjLm9yZy8iCisgICAgIHRhcmdldD0iX3RvcCI+SmF2YUNDPC9hPiBjb21waWxlci1jb21waWxlciBvbiBhIGdyYW1tYXIKKyAgICAgZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvamF2YWguaHRtbCI+SmF2YWg8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9qYXZhaC5odG1sIj5KYXZhaDwvYT48L3RkPgogICAgIDx0ZD48cD5HZW5lcmF0ZXMgSk5JIGhlYWRlcnMgZnJvbSBhIEphdmEgY2xhc3MuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2pqZG9jLmh0bWwiPkpKRG9jPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkludm9rZXMgdGhlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhY2MuZGV2LmphdmEubmV0LyI+Ci0gICAgIEpKRG9jPC9hPiBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBmb3IgdGhlIEphdmFDQyBjb21waWxlci1jb21waWxlci4KLSAgICAgSkpEb2MgdGFrZXMgYSBKYXZhQ0MgcGFyc2VyIHNwZWNpZmljYXRpb24gYW5kIHByb2R1Y2VzIGRvY3VtZW50YXRpb24KLSAgICAgZm9yIHRoZSBCTkYgZ3JhbW1hci4gIEl0IGNhbiBvcGVyYXRlIGluIHRocmVlIG1vZGVzLCBkZXRlcm1pbmVkIGJ5Ci0gICAgIGNvbW1hbmQgbGluZSBvcHRpb25zLiBUaGlzIHRhc2sgb25seSBpbnZva2VzIEpKRG9jIGlmIHRoZSBncmFtbWFyIGZpbGUKLSAgICAgaXMgbmV3ZXIgdGhhbiB0aGUgZ2VuZXJhdGVkIEJORiBncmFtbWFyIGRvY3VtZW50YXRpb24uPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvampkb2MuaHRtbCI+SkpEb2M8L2E+PC90ZD4KKyAgICA8dGQ+PHA+SW52b2tlcyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9qYXZhY2Mub3JnLyIKKyAgICAgdGFyZ2V0PSJfdG9wIj5KSkRvYzwvYT4gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IgZm9yIHRoZSBKYXZhQ0MKKyAgICAgY29tcGlsZXItY29tcGlsZXIuICBKSkRvYyB0YWtlcyBhIEphdmFDQyBwYXJzZXIgc3BlY2lmaWNhdGlvbiBhbmQKKyAgICAgcHJvZHVjZXMgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEJORiBncmFtbWFyLiAgSXQgY2FuIG9wZXJhdGUgaW4KKyAgICAgdGhyZWUgbW9kZXMsIGRldGVybWluZWQgYnkgY29tbWFuZCBsaW5lIG9wdGlvbnMuIFRoaXMgdGFzayBvbmx5CisgICAgIGludm9rZXMgSkpEb2MgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBnZW5lcmF0ZWQgQk5GCisgICAgIGdyYW1tYXIgZG9jdW1lbnRhdGlvbi48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvamp0cmVlLmh0bWwiPkpKVHJlZTwvYT48L3RkPgotICAgIDx0ZD48cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YWNjLmRldi5qYXZhLm5ldC8iPgotICAgICBKSlRyZWU8L2E+IHByZXByb2Nlc3NvciBmb3IgdGhlIEphdmFDQyBjb21waWxlci1jb21waWxlci4gSXQgaW5zZXJ0cwotICAgICBwYXJzZS10cmVlIGJ1aWxkaW5nIGFjdGlvbnMgYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIEphdmFDQyBzb3VyY2UgdGhhdAotICAgICBpdCBnZW5lcmF0ZXMuIFRoZSBvdXRwdXQgb2YgSkpUcmVlIGlzIHJ1biB0aHJvdWdoIEphdmFDQyB0byBjcmVhdGUgdGhlCi0gICAgIHBhcnNlci4gVGhpcyB0YXNrIG9ubHkgaW52b2tlcyBKSlRyZWUgaWYgdGhlIGdyYW1tYXIgZmlsZSBpcyBuZXdlciB0aGFuCi0gICAgIHRoZSBnZW5lcmF0ZWQgSmF2YUNDIGZpbGUuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvamp0cmVlLmh0bWwiPkpKVHJlZTwvYT48L3RkPgorICAgIDx0ZD48cD5JbnZva2VzIHRoZSA8YSBocmVmPSJodHRwczovL2phdmFjYy5vcmcvIgorICAgICB0YXJnZXQ9Il90b3AiPkpKVHJlZTwvYT4gcHJlcHJvY2Vzc29yIGZvciB0aGUgSmF2YUNDCisgICAgIGNvbXBpbGVyLWNvbXBpbGVyLiBJdCBpbnNlcnRzIHBhcnNlLXRyZWUgYnVpbGRpbmcgYWN0aW9ucyBhdAorICAgICB2YXJpb3VzIHBsYWNlcyBpbiB0aGUgSmF2YUNDIHNvdXJjZSB0aGF0IGl0IGdlbmVyYXRlcy4gVGhlIG91dHB1dAorICAgICBvZiBKSlRyZWUgaXMgcnVuIHRocm91Z2ggSmF2YUNDIHRvIGNyZWF0ZSB0aGUgcGFyc2VyLiBUaGlzIHRhc2sKKyAgICAgb25seSBpbnZva2VzIEpKVHJlZSBpZiB0aGUgZ3JhbW1hciBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlCisgICAgIGdlbmVyYXRlZCBKYXZhQ0MgZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvbWFjcm9kZWYuaHRtbCI+TWFjcm9kZWY8L2E+PC90ZD4KLSAgICA8dGQ+PHA+RGVmaW5lIGEgbmV3IHRhc2sgYXMgYSBtYWNybyBidWlsdC11cCB1cG9uIG90aGVyIHRhc2tzLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL21hY3JvZGVmLmh0bWwiPk1hY3JvZGVmPC9hPjwvdGQ+CisgICAgPHRkPjxwPkRlZmluZXMgYSBuZXcgdGFzayBhcyBhIG1hY3JvIGJ1aWx0LXVwIHVwb24gb3RoZXIgdGFza3MuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL25hdGl2ZTJhc2NpaS5odG1sIj4KLSAgICAgTmF0aXZlMkFzY2lpPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkNvbnZlcnRzIGZpbGVzIGZyb20gbmF0aXZlIGVuY29kaW5ncyB0byBBU0NJSSB3aXRoIGVzY2FwZWQgVW5pY29kZS4KLSAgICAgIEEgY29tbW9uIHVzYWdlIGlzIHRvIGNvbnZlcnQgc291cmNlIGZpbGVzIG1haW50YWluZWQgaW4gYSBuYXRpdmUKLSAgICAgIG9wZXJhdGluZyBzeXN0ZW0gZW5jb2RpbmcgdG8gQVNDSUksIHByaW9yIHRvIGNvbXBpbGF0aW9uLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL25hdGl2ZTJhc2NpaS5odG1sIj5OYXRpdmUyQXNjaWk8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q29udmVydHMgZmlsZXMgZnJvbSBuYXRpdmUgZW5jb2RpbmdzIHRvIEFTQ0lJIHdpdGggZXNjYXBlZAorICAgICBVbmljb2RlLiAgQSBjb21tb24gdXNhZ2UgaXMgdG8gY29udmVydCBzb3VyY2UgZmlsZXMgbWFpbnRhaW5lZCBpbgorICAgICBhIG5hdGl2ZSBvcGVyYXRpbmcgc3lzdGVtIGVuY29kaW5nIHRvIEFTQ0lJLCBwcmlvciB0bworICAgICBjb21waWxhdGlvbi48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvcHJlc2V0ZGVmLmh0bWwiPlByZXNldGRlZjwvYT48L3RkPgotICAgIDx0ZD48cD5EZWZpbmUgYSBuZXcgdGFzayBieSBpbnN0cnVtZW50aW5nIGFuIGV4aXN0aW5nIHRhc2sgd2l0aAotICAgIGRlZmF1bHQgdmFsdWVzIGZvciBhdHRyaWJ1dGVzIG9yIGNoaWxkIGVsZW1lbnRzLjwvcD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9wcmVzZXRkZWYuaHRtbCI+UHJlc2V0ZGVmPC9hPjwvdGQ+CisgICAgPHRkPjxwPkRlZmluZXMgYSBuZXcgdGFzayBieSBpbnN0cnVtZW50aW5nIGFuIGV4aXN0aW5nIHRhc2sgd2l0aAorICAgICBkZWZhdWx0IHZhbHVlcyBmb3IgYXR0cmlidXRlcyBvciBjaGlsZCBlbGVtZW50cy48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdHJhbnNsYXRlLmh0bWwiPlRyYW5zbGF0ZTwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3RyYW5zbGF0ZS5odG1sIj5UcmFuc2xhdGU8L2E+PC90ZD4KICAgICA8dGQ+PHA+SWRlbnRpZmllcyBrZXlzIGluIGZpbGVzLCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCB0b2tlbnMsIGFuZAogICAgICB0cmFuc2xhdGVzIHRoZW0gd2l0aCB2YWx1ZXMgcmVhZCBmcm9tIHJlc291cmNlIGJ1bmRsZXMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3N0eWxlLmh0bWwiPlhTTFQ8L2E+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zdHlsZS5odG1sIj5YU0xUPC9hPjwvdGQ+CiAgICAgPHRkPjxwPlByb2Nlc3NlcyBhIHNldCBvZiBkb2N1bWVudHMgdmlhIFhTTFQuPC9wPjwvdGQ+CiAgIDwvdHI+Ci0KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0icHJvcCI+UHJvcGVydHkgVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJwcm9wIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+UHJvcGVydHkgVGFza3M8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9InJpZ2h0Ij48YSBocmVmPSIjdG9wIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij4mI3gxZjUxZDs8L2E+PC9zcGFuPgorPC9kaXY+CisKKzx0YWJsZT4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXNrIE5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2F2YWlsYWJsZS5odG1sIj5BdmFpbGFibGU8L2E+PC90ZD4KLSAgICA8dGQ+PHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgc3BlY2lmaWVkIGZpbGUsIGRpcmVjdG9yeSwgY2xhc3MgaW4gdGhlCi0gICAgIGNsYXNzcGF0aCwgb3IgSlZNIHN5c3RlbSByZXNvdXJjZSBpcyBhdmFpbGFibGUgYXQgcnVudGltZS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9hdmFpbGFibGUuaHRtbCI+QXZhaWxhYmxlPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSBpZiBhIHNwZWNpZmllZCBmaWxlLCBkaXJlY3RvcnksIGNsYXNzIGluCisgICAgIHRoZSBjbGFzc3BhdGgsIG9yIEpWTSBzeXN0ZW0gcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0CisgICAgIHJ1biB0aW1lLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9iYXNlbmFtZS5odG1sIj5CYXNlbmFtZTwvYT48L3RkPgotICAgIDx0ZD48cD5TZXRzIGEgcHJvcGVydHkgdG8gdGhlIGxhc3QgZWxlbWVudCBvZiBhIHNwZWNpZmllZCBwYXRoLgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2Jhc2VuYW1lLmh0bWwiPkJhc2VuYW1lPC9hPjwvdGQ+CisgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSB0byB0aGUgbGFzdCBlbGVtZW50IG9mIGEgc3BlY2lmaWVkIHBhdGguPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2J1aWxkbnVtYmVyLmh0bWwiPkJ1aWxkTnVtYmVyPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlRhc2sgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjayBidWlsZCBudW1iZXJzLgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2J1aWxkbnVtYmVyLmh0bWwiPkJ1aWxkTnVtYmVyPC9hPjwvdGQ+CisgICAgPHRkPjxwPkhlbHBzIHRyYWNraW5nIGJ1aWxkIG51bWJlcnMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NvbmRpdGlvbi5odG1sIj5Db25kaXRpb248L2E+PC90ZD4KLSAgICA8dGQ+PHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgY2VydGFpbiBjb25kaXRpb24gaG9sZHMgdHJ1ZTsgdGhpcyBpcyBhCi0gICAgIGdlbmVyYWxpemF0aW9uIG9mIDxhIGhyZWY9IlRhc2tzL2F2YWlsYWJsZS5odG1sIj5BdmFpbGFibGU8L2E+IGFuZAotICAgICA8YSBocmVmPSJUYXNrcy91cHRvZGF0ZS5odG1sIj5VcHRvZGF0ZTwvYT4uPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY29uZGl0aW9uLmh0bWwiPkNvbmRpdGlvbjwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIGEgcHJvcGVydHkgaWYgYSBjZXJ0YWluIGNvbmRpdGlvbiBob2xkcyB0cnVlOyB0aGlzIGlzCisgICAgIGEgZ2VuZXJhbGl6YXRpb24gb2YgPGEgaHJlZj0iVGFza3MvYXZhaWxhYmxlLmh0bWwiPkF2YWlsYWJsZTwvYT4KKyAgICAgYW5kIDxhIGhyZWY9IlRhc2tzL3VwdG9kYXRlLmh0bWwiPlVwdG9kYXRlPC9hPi48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvZGlybmFtZS5odG1sIj5EaXJuYW1lPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvZGlybmFtZS5odG1sIj5EaXJuYW1lPC9hPjwvdGQ+CiAgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSB0byB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWxlIHVwIHRvLAotICAgICBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgcGF0aCBlbGVtZW50LgorICAgICBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgcGF0aCBlbGVtZW50LjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD4KLSAgICA8YSBocmVmPSJUYXNrcy9lY2hvcHJvcGVydGllcy5odG1sIj5FY2hvcHJvcGVydGllczwvYT48YnI+Ci0KLSAgICA8L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2VjaG9wcm9wZXJ0aWVzLmh0bWwiPkVjaG9wcm9wZXJ0aWVzPC9hPjwvdGQ+CiAgICAgPHRkPjxwPkxpc3RzIHRoZSBjdXJyZW50IHByb3BlcnRpZXMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2xvYWRmaWxlLmh0bWwiPkxvYWRGaWxlPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbG9hZGZpbGUuaHRtbCI+TG9hZEZpbGU8L2E+PC90ZD4KICAgICA8dGQ+PHA+TG9hZHMgYSBmaWxlIGludG8gYSBwcm9wZXJ0eS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvbG9hZHByb3BlcnRpZXMuaHRtbCI+TG9hZFByb3BlcnRpZXM8L2E+PC90ZD4KLSAgICA8dGQ+PHA+TG9hZCBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy4gVGhpcyB0YXNrIGlzCi0gICAgIGVxdWl2YWxlbnQgdG8gdXNpbmcgPGNvZGU+Jmx0O3Byb3BlcnR5IGZpbGU9JnF1b3Q7Li4uJnF1b3Q7LyZndDs8L2NvZGU+Ci0gICAgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cywKLSAgICAgYW5kIGl0IGNhbm5vdCBiZSBzcGVjaWZpZWQgb3V0c2lkZSBhIHRhcmdldC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9sb2FkcHJvcGVydGllcy5odG1sIj5Mb2FkUHJvcGVydGllczwvYT48L3RkPgorICAgIDx0ZD48cD5Mb2FkcyBhIGZpbGUncyBjb250ZW50cyBhcyBBbnQgcHJvcGVydGllcy4gVGhpcyB0YXNrIGlzCisgICAgIGVxdWl2YWxlbnQgdG8gdXNpbmcgPGNvZGU+Jmx0O3Byb3BlcnR5CisgICAgIGZpbGU9JnF1b3Q7Li4uJnF1b3Q7LyZndDs8L2NvZGU+IGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzCisgICAgIG5lc3RlZCA8Y29kZT4mbHQ7ZmlsdGVyY2hhaW4mZ3Q7PC9jb2RlPiBlbGVtZW50cywgYW5kIGl0IGNhbm5vdAorICAgICBiZSBzcGVjaWZpZWQgb3V0c2lkZSBhIHRhcmdldC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvbWFrZXVybC5odG1sIj5NYWtlVVJMPC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvbWFrZXVybC5odG1sIj5NYWtlVVJMPC9hPjwvdGQ+CiAgICAgPHRkPjxwPkNyZWF0ZXMgYSBVUkwgKGxpc3QpIGZyb20gYSBmaWxlL2ZpbGVzZXQgb3IgcGF0aDwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wYXRoY29udmVydC5odG1sIj5QYXRoQ29udmVydDwvYT48L3RkPgotICAgIDx0ZD48cD5Db252ZXJ0cyBhIG5lc3RlZCBwYXRoLCBwYXRoIHJlZmVyZW5jZSwgZmlsZWxpc3QgcmVmZXJlbmNlLCBvcgotICAgICBmaWxlc2V0IHJlZmVyZW5jZSB0byB0aGUgZm9ybSB1c2FibGUgb24gYSBzcGVjaWZpZWQgcGxhdGZvcm0gYW5kL29yCi0gICAgIHRvIGEgbGlzdCBvZiBpdGVtcyBzZXBhcmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBzZXBhcmF0b3IgYW5kIHN0b3JlcwotICAgICB0aGUgcmVzdWx0IGluIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvcGF0aGNvbnZlcnQuaHRtbCI+UGF0aENvbnZlcnQ8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q29udmVydHMgYSBuZXN0ZWQgcGF0aCwgcGF0aCByZWZlcmVuY2UsIGZpbGVsaXN0IHJlZmVyZW5jZSwKKyAgICAgb3IgZmlsZXNldCByZWZlcmVuY2UgdG8gdGhlIGZvcm0gdXNhYmxlIG9uIGEgc3BlY2lmaWVkIHBsYXRmb3JtCisgICAgIGFuZC9vciB0byBhIGxpc3Qgb2YgaXRlbXMgc2VwYXJhdGVkIGJ5IHRoZSBzcGVjaWZpZWQgc2VwYXJhdG9yCisgICAgIGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5Qcm9wZXJ0eTwvYT48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5Lmh0bWwiPlByb3BlcnR5PC9hPjwvdGQ+CiAgICAgPHRkPjxwPlNldHMgYSBwcm9wZXJ0eSAoYnkgbmFtZSBhbmQgdmFsdWUpLCBvciBzZXQgb2YgcHJvcGVydGllcwogICAgICAoZnJvbSBhIGZpbGUgb3IgcmVzb3VyY2UpIGluIHRoZSBwcm9qZWN0LjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wcm9wZXJ0eWZpbGUuaHRtbCI+Ci0gICAgIFByb3BlcnR5RmlsZTwvYT48L3RkPgotICAgIDx0ZD48cD5DcmVhdGVzIG9yIG1vZGlmaWVzIHByb3BlcnR5IGZpbGVzLiBVc2VmdWwgd2hlbiB3YW50aW5nIHRvIG1ha2UKLSAgICAgdW5hdHRlbmRlZCBtb2RpZmljYXRpb25zIHRvIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yIGFwcGxpY2F0aW9uCi0gICAgIHNlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucy4gVHlwaWNhbGx5IHVzZWQgZm9yIHRoaW5ncyBzdWNoIGFzCi0gICAgIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGluZyBhIGJ1aWxkIG51bWJlciBhbmQgc2F2aW5nIGl0IHRvIGEgYnVpbGQKLSAgICAgcHJvcGVydGllcyBmaWxlLCBvciBkb2luZyBkYXRlIG1hbmlwdWxhdGlvbi48cD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5ZmlsZS5odG1sIj5Qcm9wZXJ0eUZpbGU8L2E+PC90ZD4KKyAgICA8dGQ+PHA+Q3JlYXRlcyBvciBtb2RpZmllcyBwcm9wZXJ0eSBmaWxlcy4gVXNlZnVsIHdoZW4gd2FudGluZyB0bworICAgICBtYWtlIHVuYXR0ZW5kZWQgbW9kaWZpY2F0aW9ucyB0byBjb25maWd1cmF0aW9uIGZpbGVzIGZvcgorICAgICBhcHBsaWNhdGlvbiBzZXJ2ZXJzIGFuZCBhcHBsaWNhdGlvbnMuIFR5cGljYWxseSB1c2VkIGZvciB0aGluZ3MKKyAgICAgc3VjaCBhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgYSBidWlsZCBudW1iZXIgYW5kIHNhdmluZyBpdCB0bworICAgICBhIGJ1aWxkIHByb3BlcnRpZXMgZmlsZSwgb3IgZG9pbmcgZGF0ZSBtYW5pcHVsYXRpb24uPHA+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+PC90ZD4KLSAgICA8dGQ+PHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgZ2l2ZW4gdGFyZ2V0IGZpbGUgaXMgbmV3ZXIgdGhhbiBhIHNldCBvZgotICAgICBzb3VyY2UgZmlsZXMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvdXB0b2RhdGUuaHRtbCI+VXB0b2RhdGU8L2E+PC90ZD4KKyAgICA8dGQ+PHA+U2V0cyBhIHByb3BlcnR5IGlmIGEgZ2l2ZW4gdGFyZ2V0IGZpbGUgaXMgbmV3ZXIgdGhhbiBhIHNldAorICAgICBvZiBzb3VyY2UgZmlsZXMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3doaWNocmVzb3VyY2UuaHRtbCI+V2hpY2hyZXNvdXJjZTwvYT48L3RkPgotICAgIDx0ZD48cD5GaW5kIGEgY2xhc3Mgb3IgcmVzb3VyY2UuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3Mvd2hpY2hyZXNvdXJjZS5odG1sIj5XaGljaHJlc291cmNlPC9hPjwvdGQ+CisgICAgPHRkPjxwPkZpbmRzIGEgY2xhc3Mgb3IgcmVzb3VyY2UuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3htbHByb3BlcnR5Lmh0bWwiPlhtbFByb3BlcnR5PC9hPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MveG1scHJvcGVydHkuaHRtbCI+WG1sUHJvcGVydHk8L2E+PC90ZD4KICAgICA8dGQ+PHA+TG9hZHMgcHJvcGVydHkgdmFsdWVzIGZyb20gYSB3ZWxsLWZvcm1lZCBYTUwgZmlsZS48L3A+PC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPjwvcD4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotPHRoIGFsaWduPSJsZWZ0Ij4KLTxmb250IHNpemU9IiswIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPGEgbmFtZT0icmVtb3RlIj5SZW1vdGUgVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgotPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJyZW1vdGUiPgorICAgIDxzcGFuIGNsYXNzPSJsZWZ0Ij5SZW1vdGUgVGFza3M8L3NwYW4+CisgICAgPHNwYW4gY2xhc3M9InJpZ2h0Ij48YSBocmVmPSIjdG9wIiBzdHlsZT0idGV4dC1kZWNvcmF0aW9uOm5vbmU7Ij4mI3gxZjUxZDs8L2E+PC9zcGFuPgorPC9kaXY+CisKKzx0YWJsZT4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5UYXNrIE5hbWU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2Z0cC5odG1sIj5GVFA8L2E+PC90ZD4KLSAgICA8dGQ+PHA+SW1wbGVtZW50cyBhIGJhc2ljIEZUUCBjbGllbnQgdGhhdCBjYW4gc2VuZCwgcmVjZWl2ZSwKLSAgICAgbGlzdCwgYW5kIGRlbGV0ZSBmaWxlcywgYW5kIGNyZWF0ZSBkaXJlY3Rvcmllcy48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9mdHAuaHRtbCI+RlRQPC9hPjwvdGQ+CisgICAgPHRkPjxwPkltcGxlbWVudHMgYSBiYXNpYyBGVFAgY2xpZW50IHRoYXQgY2FuIHNlbmQsIHJlY2VpdmUsIGxpc3QsCisgICAgIGFuZCBkZWxldGUgZmlsZXMsIGFuZCBjcmVhdGUgZGlyZWN0b3JpZXMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3JleGVjLmh0bWwiPlJleGVjPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlRhc2sgdG8gYXV0b21hdGUgYSByZW1vdGUgcmV4ZWMgc2Vzc2lvbi48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9yZXhlYy5odG1sIj5SZXhlYzwvYT48L3RkPgorICAgIDx0ZD48cD5BdXRvbWF0ZXMgYSA8Y29kZT5yZXhlYzwvY29kZT4gc2Vzc2lvbi48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc2NwLmh0bWwiPlNjcDwvYT48L3RkPgotICAgIDx0ZD48cD5Db3B5IGZpbGVzIHRvIG9yIGZyb20gYSByZW1vdGUgc2VydmVyIHVzaW5nIFNTSC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zY3AuaHRtbCI+U2NwPC9hPjwvdGQ+CisgICAgPHRkPjxwPkNvcGllcyBmaWxlcyB0byBvciBmcm9tIGEgcmVtb3RlIHNlcnZlciB1c2luZyBTU0guPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NldHByb3h5Lmh0bWwiPnNldHByb3h5PC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlNldHMgSmF2YSdzIHdlYiBwcm94eSBwcm9wZXJ0aWVzLCBzbyB0aGF0IHRhc2tzIGFuZCBjb2RlIHJ1bgotIGluIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSB0aHJvdWdoLXRoZS1maXJld2FsbCBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcy48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9zZXRwcm94eS5odG1sIj5zZXRwcm94eTwvYT48L3RkPgorICAgIDx0ZD48cD5TZXRzIEphdmEncyBIVFRQIHByb3h5IHByb3BlcnRpZXMsIHNvIHRoYXQgdGFza3MgYW5kIGNvZGUKKyAgICAgcnVuIGluIHRoZSBzYW1lIEpWTSBjYW4gaGF2ZSBhY2Nlc3MgdG8gcmVtb3RlIHdlYiBzaXRlcyB0aHJvdWdoIGEKKyAgICAgZmlyZXdhbGwuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3NzaGV4ZWMuaHRtbCI+U3NoZXhlYzwvYT48L3RkPgotICAgIDx0ZD48cD5FeGVjdXRlIGEgY29tbWFuZCBvbiBhIHJlbW90ZSBzZXJ2ZXIgdXNpbmcgU1NILjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3NzaGV4ZWMuaHRtbCI+U3NoZXhlYzwvYT48L3RkPgorICAgIDx0ZD48cD5FeGVjdXRlcyBhIGNvbW1hbmQgb24gYSByZW1vdGUgc2VydmVyIHVzaW5nIFNTSC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvdGVsbmV0Lmh0bWwiPlRlbG5ldDwvYT48L3RkPgotICAgIDx0ZD48cD5UYXNrIHRvIGF1dG9tYXRlIGEgcmVtb3RlIDxpPnRlbG5ldDwvaT4gc2Vzc2lvbi4gVGhpcyB0YXNrIHVzZXMKLSAgICAgbmVzdGVkIDxjb2RlPiZsdDtyZWFkJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt3cml0ZSZndDs8L2NvZGU+IHRhZ3MKLSAgICAgdG8gaW5kaWNhdGUgc3RyaW5ncyB0byB3YWl0IGZvciBhbmQgc3BlY2lmeSB0ZXh0IHRvIHNlbmQuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvdGVsbmV0Lmh0bWwiPlRlbG5ldDwvYT48L3RkPgorICAgIDx0ZD48cD5BdXRvbWF0ZXMgYSA8Y29kZT50ZWxuZXQ8L2NvZGU+IHNlc3Npb24uIFRoaXMgdGFzayB1c2VzCisgICAgIG5lc3RlZCA8Y29kZT4mbHQ7cmVhZCZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7d3JpdGUmZ3Q7PC9jb2RlPgorICAgICB0YWdzIHRvIGluZGljYXRlIHN0cmluZ3MgdG8gd2FpdCBmb3IgYW5kIHNwZWNpZnkgdGV4dCB0bworICAgICBzZW5kLjwvcD48L3RkPgogICA8L3RyPgotCiA8L3RhYmxlPgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9InNjbSI+U0NNIFRhc2tzPC9hPgotPC9mb250PjwvdGg+Ci08Zm9udCBzaXplPSItMSIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTx0aCBhbGlnbj0icmlnaHQiPjxhIGhyZWY9IiN0b3AiPltCYWNrIHRvIHRvcF08L2E+PC90aD4KLTwvZm9udD4KLTwvdGFibGU+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGggbm93cmFwPlRhc2sgTmFtZTwvdGg+Ci0gICAgPHRoPkRlc2NyaXB0aW9uPC90aD4KKzxkaXYgY2xhc3M9ImZsb2F0IiBpZD0ic2NtIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+U0NNIFRhc2tzPC9zcGFuPgorICAgIDxzcGFuIGNsYXNzPSJyaWdodCI+PGEgaHJlZj0iI3RvcCIgc3R5bGU9InRleHQtZGVjb3JhdGlvbjpub25lOyI+JiN4MWY1MWQ7PC9hPjwvc3Bhbj4KKzwvZGl2PgorCis8dGFibGU+CisgIDx0cj4KKyAgICA8dGggc2NvcGU9ImNvbCI+VGFzayBOYW1lPC90aD4KKyAgICA8dGggc2NvcGU9ImNvbCI+RGVzY3JpcHRpb248L3RoPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9jdnMuaHRtbCI+Q3ZzPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkhhbmRsZXMgcGFja2FnZXMvbW9kdWxlcyByZXRyaWV2ZWQgZnJvbSBhCi0gICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9jdnMuaHRtbCI+Q3ZzPC9hPjwvdGQ+CisgICAgPHRkPjxwPkhhbmRsZXMgcGFja2FnZXMvbW9kdWxlcyByZXRyaWV2ZWQgZnJvbQorICAgICBhIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+CiAgICAgIHJlcG9zaXRvcnkuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2NoYW5nZWxvZy5odG1sIj5DdnNDaGFuZ2VMb2c8L2E+PC90ZD4KLSAgICA8dGQ+PHA+R2VuZXJhdGVzIGFuIFhNTCByZXBvcnQgb2YgdGhlIGNoYW5nZXMgcmVjb3JkZWQgaW4gYQotICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY2hhbmdlbG9nLmh0bWwiPkN2c0NoYW5nZUxvZzwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYW4gWE1MIHJlcG9ydCBvZiB0aGUgY2hhbmdlcyByZWNvcmRlZCBpbgorICAgICBhIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5vbmdudS5vcmcvY3ZzLyIgdGFyZ2V0PSJfdG9wIj5DVlM8L2E+CiAgICAgIHJlcG9zaXRvcnkuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL2N2c3Bhc3MuaHRtbCI+Q1ZTUGFzczwvYT48L3RkPgotICAgIDx0ZD48cD5BZGRzIGVudHJpZXMgdG8gYSAuY3ZzcGFzcyBmaWxlLiBBZGRpbmcgZW50cmllcyB0byB0aGlzIGZpbGUKLSAgICAgaGFzIHRoZSBzYW1lIGFmZmVjdCBhcyBhIDxpPmN2cyBsb2dpbjwvaT4gY29tbWFuZC48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9jdnNwYXNzLmh0bWwiPkNWU1Bhc3M8L2E+PC90ZD4KKyAgICA8dGQ+PHA+QWRkcyBlbnRyaWVzIHRvIGEgPHNhbXA+LmN2c3Bhc3M8L3NhbXA+IGZpbGUuIEFkZGluZworICAgICBlbnRyaWVzIHRvIHRoaXMgZmlsZSBoYXMgdGhlIHNhbWUgYWZmZWN0IGFzIGEgPGtiZD5jdnMKKyAgICAgbG9naW48L2tiZD4gY29tbWFuZC48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvY3ZzdGFnZGlmZi5odG1sIj5DdnNUYWdEaWZmPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkdlbmVyYXRlcyBhbiBYTUwtZm9ybWF0dGVkIHJlcG9ydCBmaWxlIG9mIHRoZSBjaGFuZ2VzIGJldHdlZW4KLSAgICB0d28gdGFncyBvciBkYXRlcyByZWNvcmRlZCBpbiBhIDxhIGhyZWY9Imh0dHA6Ly93d3cubm9uZ251Lm9yZy9jdnMvIgotICAgIHRhcmdldD0iX3RvcCI+Q1ZTPC9hPiByZXBvc2l0b3J5LjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2N2c3RhZ2RpZmYuaHRtbCI+Q3ZzVGFnRGlmZjwvYT48L3RkPgorICAgIDx0ZD48cD5HZW5lcmF0ZXMgYW4gWE1MLWZvcm1hdHRlZCByZXBvcnQgZmlsZSBvZiB0aGUgY2hhbmdlcworICAgICBiZXR3ZWVuIHR3byB0YWdzIG9yIGRhdGVzIHJlY29yZGVkIGluCisgICAgIGEgPGEgaHJlZj0iaHR0cHM6Ly93d3cubm9uZ251Lm9yZy9jdnMvIiB0YXJnZXQ9Il90b3AiPkNWUzwvYT4KKyAgICAgcmVwb3NpdG9yeS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3MvY2xlYXJjYXNlLmh0bWwiPkNsZWFyQ2FzZTwvYT48L3RkPgotICAgIDx0ZD48cD5UYXNrcyB0byBwZXJmb3JtIHRoZSBDbGVhckNhc2UgY2xlYXJ0b29sIDxpPmNoZWNraW48L2k+LCA8aT5jaGVja291dDwvaT4sCi0gICAgIDxpPnVuY2hlY2tvdXQ8L2k+LCA8aT51cGRhdGU8L2k+LCA8aT5sb2NrPC9pPiwgPGk+dW5sb2NrPC9pPiwgPGk+bWtsYnR5cGU8L2k+LCA8aT5ybXR5cGU8L2k+LCA8aT5ta2xhYmVsPC9pPiwgPGk+bWthdHRyPC9pPiwgPGk+bWtkaXI8L2k+LCA8aT5ta2VsZW08L2k+LCBhbmQgPGk+bWtibDwvaT4gY29tbWFuZHMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY2xlYXJjYXNlLmh0bWwiPkNsZWFyQ2FzZTwvYT48L3RkPgorICAgIDx0ZD48cD5UYXNrcyB0byBwZXJmb3JtIHRoZSBDbGVhckNhc2UgPGtiZD5jbGVhcnRvb2wgY2hlY2tpbjwva2JkPiwKKyAgICAgPGtiZD5jaGVja291dDwva2JkPiwgPGtiZD51bmNoZWNrb3V0PC9rYmQ+LCA8a2JkPnVwZGF0ZTwva2JkPiwKKyAgICAgPGtiZD5sb2NrPC9rYmQ+LCA8a2JkPnVubG9jazwva2JkPiwgPGtiZD5ta2xidHlwZTwva2JkPiwgPGtiZD5ybXR5cGU8L2tiZD4sCisgICAgIDxrYmQ+bWtsYWJlbDwva2JkPiwgPGtiZD5ta2F0dHI8L2tiZD4sIDxrYmQ+bWtkaXI8L2tiZD4sIDxrYmQ+bWtlbGVtPC9rYmQ+LAorICAgICBhbmQgPGtiZD5ta2JsPC9rYmQ+IGNvbW1hbmRzLjwvcD48L3RkPgogICA8L3RyPgogCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9jY20uaHRtbCI+Q29udGludXVzL1N5bmVyZ3k8L2E+PC90ZD4KLSAgICA8dGQ+PHA+VGFza3MgdG8gcGVyZm9ybSB0aGUgQ29udGludXVzIDxpPmNjbWNoZWNraW48L2k+LAotICAgICA8aT5jY21jaGVja291dDwvaT4sIDxpPmNjbWNoZWNraW50YXNrPC9pPiwgPGk+Y2NtcmVjb25maWd1cmU8L2k+LCBhbmQKLSAgICAgPGk+Y2NtY3JlYXRlVGFzazwvaT4gY29tbWFuZHMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvY2NtLmh0bWwiPkNvbnRpbnV1cy9TeW5lcmd5PC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2tzIHRvIHBlcmZvcm0gdGhlIENvbnRpbnV1cyA8a2JkPmNjbSBjaGVja2luPC9rYmQ+LAorICAgICA8a2JkPmNoZWNrb3V0PC9rYmQ+LCA8a2JkPnJlY29uZmlndXJlPC9rYmQ+LCA8ZW0+Y2NtY2hlY2tpbnRhc2s8L2VtPiwKKyAgICAgYW5kIDxlbT5jY21jcmVhdGV0YXNrPC9lbT4gY29tbWFuZHMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLSAgPHRyIHZhbGlnbj0idG9wIj4KLSAgICA8dGQgbm93cmFwPjxhIGhyZWY9IlRhc2tzL3Zzcy5odG1sIj4KLSAgICAgTWljcm9zb2Z0IFZpc3VhbCBTb3VyY2VTYWZlPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPlRhc2tzIHRvIHBlcmZvcm0gdGhlIFZpc3VhbCBTb3VyY2VTYWZlIDxpPnZzc2dldDwvaT4sCi0gICAgIDxpPnZzc2xhYmVsPC9pPiwgPGk+dnNzaGlzdG9yeTwvaT4sIDxpPnZzc2NoZWNraW48L2k+LAotICAgICA8aT52c3NjaGVja291dDwvaT4sIDxpPnZzc2FkZDwvaT4sIDxpPnZzc2NwPC9pPiwgYW5kIDxpPnZzc2NyZWF0ZTwvaT4KLSAgICAgY29tbWFuZHMuPC9wPjwvdGQ+CisgIDx0cj4KKyAgICA8dGQ+PGEgaHJlZj0iVGFza3MvdnNzLmh0bWwiPk1pY3Jvc29mdCBWaXN1YWwgU291cmNlU2FmZTwvYT48L3RkPgorICAgIDx0ZD48cD5UYXNrcyB0byBwZXJmb3JtIHRoZSBWaXN1YWwgU291cmNlU2FmZSA8a2JkPnNzIGdldDwva2JkPiwKKyAgICAgPGtiZD5sYWJlbDwva2JkPiwgPGtiZD5oaXN0b3J5PC9rYmQ+LCA8a2JkPmNoZWNraW48L2tiZD4sCisgICAgIDxrYmQ+Y2hlY2tvdXQ8L2tiZD4sIDxrYmQ+YWRkPC9rYmQ+LCA8a2JkPmNwPC9rYmQ+LAorICAgICBhbmQgPGtiZD5jcmVhdGU8L2tiZD4gY29tbWFuZHMuPC9wPjwvdGQ+CiAgIDwvdHI+CiAKLQotCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9wdmNzdGFzay5odG1sIj5QdmNzPC9hPjwvdGQ+Ci0gICAgPHRkPjxwPkFsbG93cyB0aGUgdXNlciBleHRyYWN0IHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUKLSAgICAgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS48L3A+PC90ZD4KKyAgPHRyPgorICAgIDx0ZD48YSBocmVmPSJUYXNrcy9wdmNzdGFzay5odG1sIj5QdmNzPC9hPjwvdGQ+CisgICAgPHRkPjxwPkFsbG93cyB0aGUgdXNlciBleHRyYWN0IHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlCisgICAgIGNvZGUgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS48L3A+PC90ZD4KICAgPC90cj4KIAotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0ZCBub3dyYXA+PGEgaHJlZj0iVGFza3Mvc29zLmh0bWwiPlNvdXJjZU9mZlNpdGU8L2E+PC90ZD4KLSAgICA8dGQ+PHA+VGFza3MgdG8gcGVyZm9ybSB0aGUgU291cmNlT2ZmU2l0ZSA8aT5zb3NnZXQ8L2k+LCA8aT5zb3NsYWJlbDwvaT4sCi0gICAgIDxpPnNvc2NoZWNraW48L2k+LCBhbmQgPGk+c29zY2hlY2tvdXQ8L2k+IGNvbW1hbmRzLjwvcD48L3RkPgorICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL3Nvcy5odG1sIj5Tb3VyY2VPZmZTaXRlPC9hPjwvdGQ+CisgICAgPHRkPjxwPlRhc2tzIHRvIHBlcmZvcm0gdGhlIFNvdXJjZU9mZlNpdGUgPGtiZD5zb3MgZ2V0PC9rYmQ+LCA8a2JkPmxhYmVsPC9rYmQ+LAorICAgICA8a2JkPmNoZWNraW48L2tiZD4sIGFuZCA8a2JkPmNoZWNrb3V0PC9rYmQ+IGNvbW1hbmRzLjwvcD48L3RkPgogICA8L3RyPgotCiA8L3RhYmxlPgogCi08cD48L3A+Ci08dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjQiIGNlbGxzcGFjaW5nPSIwIj4KLTx0aCBhbGlnbj0ibGVmdCI+Ci08Zm9udCBzaXplPSIrMCIgZmFjZT0iYXJpYWwsaGVsdmV0aWNhLHNhbnNlcmlmIj4KLTxhIG5hbWU9InRlc3RpbmciPlRlc3RpbmcgVGFza3M8L2E+Ci08L2ZvbnQ+PC90aD4KLTxmb250IHNpemU9Ii0xIiBmYWNlPSJhcmlhbCxoZWx2ZXRpY2Esc2Fuc2VyaWYiPgotPHRoIGFsaWduPSJyaWdodCI+PGEgaHJlZj0iI3RvcCI+W0JhY2sgdG8gdG9wXTwvYT48L3RoPgotPC9mb250PgorPGRpdiBjbGFzcz0iZmxvYXQiIGlkPSJ0ZXN0aW5nIj4KKyAgICA8c3BhbiBjbGFzcz0ibGVmdCI+VGVzdGluZyBUYXNrczwvc3Bhbj4KKyAgICA8c3BhbiBjbGFzcz0icmlnaHQiPjxhIGhyZWY9IiN0b3AiIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246bm9uZTsiPiYjeDFmNTFkOzwvYT48L3NwYW4+Cis8L2Rpdj4KKworPHRhYmxlPgorICA8dHI+CisgICAgPHRoIHNjb3BlPSJjb2wiPlRhc2sgTmFtZTwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPkRlc2NyaXB0aW9uPC90aD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2p1bml0Lmh0bWwiPkp1bml0PC9hPjwvdGQ+CisgICAgPHRkPjxwPlJ1bnMgdGVzdHMgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9qdW5pdC5vcmciCisgICAgIHRhcmdldD0iX3RvcCI+SnVuaXQ8L2E+IHRlc3RpbmcgZnJhbWV3b3JrLiBUaGlzIHRhc2sgaGFzIGJlZW4KKyAgICAgdGVzdGVkIHdpdGggSlVuaXQgMy4wIGFuZCBsYXRlcjsgaXQgd29uJ3Qgd29yayB3aXRoIHZlcnNpb25zCisgICAgIHByaW9yIHRvIEpVbml0IDMuMC48L3A+PC90ZD4KKyAgPC90cj4KKworICA8dHI+CisgICAgPHRkPjxhIGhyZWY9IlRhc2tzL2p1bml0cmVwb3J0Lmh0bWwiPkp1bml0UmVwb3J0PC9hPjwvdGQ+CisgICAgPHRkPjxwPk1lcmdlcyB0aGUgaW5kaXZpZHVhbCBYTUwgZmlsZXMgZ2VuZXJhdGVkIGJ5CisgICAgIHRoZSA8YSBocmVmPSJUYXNrcy9qdW5pdC5odG1sIj5KdW5pdDwvYT4gdGFzayBhbmQgYXBwbGllcyBhCisgICAgIHN0eWxlc2hlZXQgb24gdGhlIHJlc3VsdGluZyBtZXJnZWQgZG9jdW1lbnQgdG8gcHJvdmlkZSBhCisgICAgIGJyb3dzYWJsZSByZXBvcnQgb2YgdGhlIHRlc3RjYXNlcyByZXN1bHRzLjwvcD48L3RkPgorICA8L3RyPgogPC90YWJsZT4KLTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNCIgY2VsbHNwYWNpbmc9IjAiPgotICA8dHIgdmFsaWduPSJ0b3AiPgotICAgIDx0aCBub3dyYXA+VGFzayBOYW1lPC90aD4KLSAgICA8dGg+RGVzY3JpcHRpb248L3RoPgotICA8L3RyPgotCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9qdW5pdC5odG1sIj5KdW5pdDwvYT48L3RkPgotICAgIDx0ZD48cD5SdW5zIHRlc3RzIGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnIj5KdW5pdDwvYT4KLSAgICAgdGVzdGluZyBmcmFtZXdvcmsuIFRoaXMgdGFzayBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBKVW5pdCAzLjAgdXAgdG8KLSAgICAgSlVuaXQgMy43OyBpdCB3b24ndCB3b3JrIHdpdGggdmVyc2lvbnMgcHJpb3IgdG8gSlVuaXQgMy4wLjwvcD48L3RkPgotICA8L3RyPgotCi0gIDx0ciB2YWxpZ249InRvcCI+Ci0gICAgPHRkIG5vd3JhcD48YSBocmVmPSJUYXNrcy9qdW5pdHJlcG9ydC5odG1sIj5KdW5pdFJlcG9ydDwvYT48L3RkPgotICAgIDx0ZD48cD5NZXJnZXMgdGhlIGluZGl2aWR1YWwgWE1MIGZpbGVzIGdlbmVyYXRlZCBieSB0aGUKLSAgICAgPGEgaHJlZj0iVGFza3MvanVuaXQuaHRtbCI+SnVuaXQ8L2E+IHRhc2sgYW5kIGFwcGxpZXMgYQotICAgICBzdHlsZXNoZWV0IG9uIHRoZSByZXN1bHRpbmcgbWVyZ2VkIGRvY3VtZW50IHRvIHByb3ZpZGUgYSBicm93c2FibGUKLSAgICAgcmVwb3J0IG9mIHRoZSB0ZXN0Y2FzZXMgcmVzdWx0cy48L3A+PC90ZD4KLSAgPC90cj4KLQotPC90YWJsZT4KLQotCi0KIAogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL3RvYy5odG1sIGIvbWFudWFsL3RvYy5odG1sCmluZGV4IDkxZDk4MjQuLjNlNDQ2OTQgMTAwNjQ0Ci0tLSBhL21hbnVhbC90b2MuaHRtbAorKysgYi9tYW51YWwvdG9jLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsOSBAQAogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KLTxodG1sPgorPGh0bWwgbGFuZz0iZW4iPgogCiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIi8+CiA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiLz4KIDx0aXRsZT5BcGFjaGUgQW50IFVzZXIgTWFudWFsPC90aXRsZT4KIDxiYXNlIHRhcmdldD0ibWFpbkZyYW1lIi8+CkBAIC00OCw0ICs0OCwzIEBACiAKIDwvYm9keT4KIDwvaHRtbD4KLQpkaWZmIC0tZ2l0IGEvbWFudWFsL3R1dG9yaWFsLUhlbGxvV29ybGRXaXRoQW50Lmh0bWwgYi9tYW51YWwvdHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbAppbmRleCBiYWJkOWI0Li5kYzI0NGY0IDEwMDY0NAotLS0gYS9tYW51YWwvdHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbAorKysgYi9tYW51YWwvdHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogICA8dGl0bGU+VHV0b3JpYWw6IEhlbGxvIFdvcmxkIHdpdGggQXBhY2hlIEFudDwvdGl0bGU+CiAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyI+CkBAIC0yMiw4NCArMjMsNzAgQEAKIDxib2R5PgogPGgxPlR1dG9yaWFsOiBIZWxsbyBXb3JsZCB3aXRoIEFwYWNoZSBBbnQ8L2gxPgogCi08cD5UaGlzIGRvY3VtZW50IHByb3ZpZGVzIGEgc3RlcCBieSBzdGVwIHR1dG9yaWFsIGZvciBzdGFydGluZyBqYXZhIHByb2dyYW1taW5nIHdpdGggQXBhY2hlIEFudC4KLUl0IGRvZXMgPGI+bm90PC9iPiBjb250YWluIGRlZXBlciBrbm93bGVkZ2UgYWJvdXQgSmF2YSBvciBBbnQuIFRoaXMgdHV0b3JpYWwgaGFzIHRoZSBnb2FsCi10byBsZXQgeW91IHNlZSwgaG93IHRvIGRvIHRoZSBlYXNpZXN0IHN0ZXBzIGluIEFudC48L3A+Ci0KLQorPHA+VGhpcyBkb2N1bWVudCBwcm92aWRlcyBhIHN0ZXAgYnkgc3RlcCB0dXRvcmlhbCBmb3Igc3RhcnRpbmcgSmF2YSBwcm9ncmFtbWluZyB3aXRoIEFwYWNoZSBBbnQuIEl0Citkb2VzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGNvbnRhaW4gZGVlcGVyIGtub3dsZWRnZSBhYm91dCBKYXZhIG9yIEFudC4gVGhpcyB0dXRvcmlhbCBoYXMgdGhlIGdvYWwgdG8gbGV0IHlvdSBzZWUsIGhvdyB0bworZG8gdGhlIGVhc2llc3Qgc3RlcHMgaW4gQW50LjwvcD4KIAogPGgyPkNvbnRlbnQ8L2gyPgotPHA+PHVsPgorPHVsPgogPGxpPjxhIGhyZWY9IiNwcmVwYXJlIj5QcmVwYXJpbmcgdGhlIHByb2plY3Q8L2E+PC9saT4KLTxsaT48YSBocmVmPSIjZm91ci1zdGVwcyI+RW5oYW5jZSB0aGUgYnVpbGQgZmlsZTwvYT48L2xpPgorPGxpPjxhIGhyZWY9IiNmb3VyLXN0ZXBzIj5Gb3VyIHN0ZXBzIHRvIGEgcnVubmluZyBhcHBsaWNhdGlvbjwvYT48L2xpPgogPGxpPjxhIGhyZWY9IiNlbmhhbmNlIj5FbmhhbmNlIHRoZSBidWlsZCBmaWxlPC9hPjwvbGk+CiA8bGk+PGEgaHJlZj0iI2V4dC1saWJzIj5Vc2luZyBleHRlcm5hbCBsaWJyYXJpZXM8L2E+PC9saT4KIDxsaT48YSBocmVmPSIjcmVzb3VyY2VzIj5SZXNvdXJjZXM8L2E+PC9saT4KLTwvdWw+PC9wPgorPC91bD4KIAorPGgyIGlkPSJwcmVwYXJlIj5QcmVwYXJpbmcgdGhlIHByb2plY3Q8L2gyPgorPHA+V2Ugd2FudCB0byBzZXBhcmF0ZSB0aGUgc291cmNlIGZyb20gdGhlIGdlbmVyYXRlZCBmaWxlcywgc28gb3VyIEphdmEgc291cmNlIGZpbGVzIHdpbGwgYmUgaW4gPHNhbXA+c3JjPC9zYW1wPgorZm9sZGVyLiBBbGwgZ2VuZXJhdGVkIGZpbGVzIHNob3VsZCBiZSB1bmRlciA8c2FtcD5idWlsZDwvc2FtcD4sIGFuZCB0aGVyZSBzcGxpdCBpbnRvIHNldmVyYWwgc3ViZGlyZWN0b3JpZXMgZm9yIHRoZQoraW5kaXZpZHVhbCBzdGVwczogPHNhbXA+Y2xhc3Nlczwvc2FtcD4gZm9yIG91ciBjb21waWxlZCBmaWxlcyBhbmQgPHNhbXA+amFyPC9zYW1wPiBmb3Igb3VyIG93biBKQVItZmlsZS48L3A+CiAKLTxhIG5hbWU9InByZXBhcmUiPjwvYT4KLTxoMj5QcmVwYXJpbmcgdGhlIHByb2plY3Q8L2gyPgotPHA+V2Ugd2FudCB0byBzZXBhcmF0ZSB0aGUgc291cmNlIGZyb20gdGhlIGdlbmVyYXRlZCBmaWxlcywgc28gb3VyIGphdmEgc291cmNlIGZpbGVzIHdpbGwKLWJlIGluIDx0dD5zcmM8L3R0PiBmb2xkZXIuIEFsbCBnZW5lcmF0ZWQgZmlsZXMgc2hvdWxkIGJlIHVuZGVyIDx0dD5idWlsZDwvdHQ+LCBhbmQgdGhlcmUKLXNwbGl0dGVkIGludG8gc2V2ZXJhbCBzdWJkaXJlY3RvcmllcyBmb3IgdGhlIGluZGl2aWR1YWwgc3RlcHM6IDx0dD5jbGFzc2VzPC90dD4gZm9yIG91ciBjb21waWxlZAotZmlsZXMgYW5kIDx0dD5qYXI8L3R0PiBmb3Igb3VyIG93biBKQVItZmlsZS48L3A+Ci08cD5XZSBoYXZlIHRvIGNyZWF0ZSBvbmx5IHRoZSA8dHQ+c3JjPC90dD4gZGlyZWN0b3J5LiAoQmVjYXVzZSBJIGFtIHdvcmtpbmcgb24gV2luZG93cywgaGVyZSBpcyAKLXRoZSB3aW4tc3ludGF4IC0gdHJhbnNsYXRlIHRvIHlvdXIgc2hlbGwpOjwvcD4KKzxwPldlIGhhdmUgdG8gY3JlYXRlIG9ubHkgdGhlIDxzYW1wPnNyYzwvc2FtcD4gZGlyZWN0b3J5LiAoQmVjYXVzZSBJIGFtIHdvcmtpbmcgb24gV2luZG93cywgaGVyZSBpcyB0aGUgV2luZG93cworc3ludGF4Jm1kYXNoO3RyYW5zbGF0ZSB0byB5b3VyIHNoZWxsKTo8L3A+CiAKLTxwcmUgY2xhc3M9ImNvZGUiPgotbWQgc3JjCi08L3ByZT4KKzxwcmUgY2xhc3M9ImlucHV0Ij5tZCBzcmM8L3ByZT4KIAotPHA+VGhlIGZvbGxvd2luZyBzaW1wbGUgSmF2YSBjbGFzcyBqdXN0IHByaW50cyBhIGZpeGVkIG1lc3NhZ2Ugb3V0IHRvIFNURE9VVCwKLXNvIGp1c3Qgd3JpdGUgdGhpcyBjb2RlIGludG8gPHR0PnNyY1xvYXRhXEhlbGxvV29ybGQuamF2YTwvdHQ+LjwvcD4KKzxwPlRoZSBmb2xsb3dpbmcgc2ltcGxlIEphdmEgY2xhc3MganVzdCBwcmludHMgYSBmaXhlZCBtZXNzYWdlIG91dCB0byBTVERPVVQsIHNvIGp1c3Qgd3JpdGUgdGhpcyBjb2RlCitpbnRvIDxzYW1wPnNyY1xvYXRhXEhlbGxvV29ybGQuamF2YTwvc2FtcD4uPC9wPgogCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmU+CiBwYWNrYWdlIG9hdGE7CiAKIHB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKICAgICB9Ci19Ci08L3ByZT4KK308L3ByZT4KIAotPHA+Tm93IGp1c3QgdHJ5IHRvIGNvbXBpbGUgYW5kIHJ1biB0aGF0OgotPHByZSBjbGFzcz0iY29kZSI+Cis8cD5Ob3cganVzdCB0cnkgdG8gY29tcGlsZSBhbmQgcnVuIHRoYXQ6PC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPgogbWQgYnVpbGRcY2xhc3NlcwogamF2YWMgLXNvdXJjZXBhdGggc3JjIC1kIGJ1aWxkXGNsYXNzZXMgc3JjXG9hdGFcSGVsbG9Xb3JsZC5qYXZhCi1qYXZhIC1jcCBidWlsZFxjbGFzc2VzIG9hdGEuSGVsbG9Xb3JsZAotPC9wcmU+CitqYXZhIC1jcCBidWlsZFxjbGFzc2VzIG9hdGEuSGVsbG9Xb3JsZDwvcHJlPgogd2hpY2ggd2lsbCByZXN1bHQgaW4KLTxwcmUgY2xhc3M9Im91dHB1dCI+Ci1IZWxsbyBXb3JsZAotPC9wcmU+Ci08L3A+Cis8cHJlIGNsYXNzPSJvdXRwdXQiPkhlbGxvIFdvcmxkPC9wcmU+CiAKLTxwPkNyZWF0aW5nIGEgamFyLWZpbGUgaXMgbm90IHZlcnkgZGlmZmljdWx0LiBCdXQgY3JlYXRpbmcgYSA8aT5zdGFydGFibGU8L2k+IGphci1maWxlIG5lZWRzIG1vcmUgc3RlcHM6IGNyZWF0ZSBhCis8cD5DcmVhdGluZyBhIGphci1maWxlIGlzIG5vdCB2ZXJ5IGRpZmZpY3VsdC4gQnV0IGNyZWF0aW5nIGEgPGVtPnN0YXJ0YWJsZTwvZW0+IGphci1maWxlIG5lZWRzIG1vcmUgc3RlcHM6IGNyZWF0ZSBhCiBtYW5pZmVzdC1maWxlIGNvbnRhaW5pbmcgdGhlIHN0YXJ0IGNsYXNzLCBjcmVhdGluZyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgYXJjaGl2aW5nIHRoZSBmaWxlcy48L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmUgY2xhc3M9ImlucHV0Ij4KIGVjaG8gTWFpbi1DbGFzczogb2F0YS5IZWxsb1dvcmxkJmd0O215TWFuaWZlc3QKIG1kIGJ1aWxkXGphcgogamFyIGNmbSBidWlsZFxqYXJcSGVsbG9Xb3JsZC5qYXIgbXlNYW5pZmVzdCAtQyBidWlsZFxjbGFzc2VzIC4KLWphdmEgLWphciBidWlsZFxqYXJcSGVsbG9Xb3JsZC5qYXIKLTwvcHJlPgoramF2YSAtamFyIGJ1aWxkXGphclxIZWxsb1dvcmxkLmphcjwvcHJlPgogCi08cD48Yj5Ob3RlOjwvYj4gRG8gbm90IGhhdmUgYmxhbmtzIGFyb3VuZCB0aGUgJmd0Oy1zaWduIGluIHRoZSA8dHQ+ZWNobyBNYWluLUNsYXNzPC90dD4gaW5zdHJ1Y3Rpb24gYmVjYXVzZSBpdCB3b3VsZCAKLWZhbHNpZnkgaXQhPC9wPgorPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBEbyBub3QgaGF2ZSBibGFua3MgYXJvdW5kIHRoZSAmZ3Q7LXNpZ24gaW4gdGhlIDxrYmQ+ZWNobyBNYWluLUNsYXNzPC9rYmQ+IGluc3RydWN0aW9uIGJlY2F1c2UKK2l0IHdvdWxkIGZhbHNpZnkgaXQhPC9wPgogCis8aDIgaWQ9ImZvdXItc3RlcHMiPkZvdXIgc3RlcHMgdG8gYSBydW5uaW5nIGFwcGxpY2F0aW9uPC9oMj4KKzxwPkFmdGVyIGZpbmlzaGluZyB0aGUgSmF2YS1vbmx5IHN0ZXAgd2UgaGF2ZSB0byB0aGluayBhYm91dCBvdXIgYnVpbGQgcHJvY2Vzcy4gV2UgPGVtPmhhdmU8L2VtPiB0byBjb21waWxlIG91ciBjb2RlLAorb3RoZXJ3aXNlIHdlIGNvdWxkbid0IHN0YXJ0IHRoZSBwcm9ncmFtLiBPaCZtZGFzaDs8cT5zdGFydDwvcT4mbWRhc2g7eWVzLCB3ZSBjb3VsZCBwcm92aWRlIGEgdGFyZ2V0IGZvcgordGhhdC4gV2UgPGVtPnNob3VsZDwvZW0+IHBhY2thZ2Ugb3VyIGFwcGxpY2F0aW9uLiAgTm93IGl0J3Mgb25seSBvbmUgY2xhc3MmbWRhc2g7YnV0IGlmIHlvdSB3YW50IHRvIHByb3ZpZGUgYSBkb3dubG9hZCwKK25vIG9uZSB3b3VsZCBkb3dubG9hZCBzZXZlcmFsIGh1bmRyZWRzIGZpbGVzIC4uLiAgKHRoaW5rIGFib3V0IGEgY29tcGxleCBTd2luZyBHVUkmbWRhc2g7c28gbGV0IHVzIGNyZWF0ZSBhIGphciBmaWxlLiBBCitzdGFydGFibGUgamFyIGZpbGUgd291bGQgYmUgbmljZSAuLi4gQW5kIGl0J3MgYSBnb29kIHByYWN0aXNlIHRvIGhhdmUgYSA8cT5jbGVhbjwvcT4gdGFyZ2V0LCB3aGljaCBkZWxldGVzIGFsbCB0aGUKK2dlbmVyYXRlZCBzdHVmZi4gTWFueSBmYWlsdXJlcyBjb3VsZCBiZSBzb2x2ZWQganVzdCBieSBhICJjbGVhbiBidWlsZCIuPC9wPgogCi08YSBuYW1lPSJmb3VyLXN0ZXBzIj48L2E+Ci08aDI+Rm91ciBzdGVwcyB0byBhIHJ1bm5pbmcgYXBwbGljYXRpb248L2gyPgotPHA+QWZ0ZXIgZmluaXNoaW5nIHRoZSBqYXZhLW9ubHkgc3RlcCB3ZSBoYXZlIHRvIHRoaW5rIGFib3V0IG91ciBidWlsZCBwcm9jZXNzLiBXZSA8aT5oYXZlPC9pPiB0byBjb21waWxlIG91ciBjb2RlLCBvdGhlcndpc2Ugd2UgY291bGRuJ3QKLXN0YXJ0IHRoZSBwcm9ncmFtLiBPaCAtICJzdGFydCIgLSB5ZXMsIHdlIGNvdWxkIHByb3ZpZGUgYSB0YXJnZXQgZm9yIHRoYXQuIFdlIDxpPnNob3VsZDwvaT4gcGFja2FnZSBvdXIgYXBwbGljYXRpb24uCi1Ob3cgaXQncyBvbmx5IG9uZSBjbGFzcyAtIGJ1dCBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGEgZG93bmxvYWQsIG5vIG9uZSB3b3VsZCBkb3dubG9hZCBzZXZlcmFsIGh1bmRyZWRzIGZpbGVzIC4uLgotKHRoaW5rIGFib3V0IGEgY29tcGxleCBTd2luZyBHVUkgLSBzbyBsZXQgdXMgY3JlYXRlIGEgamFyIGZpbGUuIEEgc3RhcnRhYmxlIGphciBmaWxlIHdvdWxkIGJlIG5pY2UgLi4uIEFuZCBpdCdzIGEKLWdvb2QgcHJhY3Rpc2UgdG8gaGF2ZSBhICJjbGVhbiIgdGFyZ2V0LCB3aGljaCBkZWxldGVzIGFsbCB0aGUgZ2VuZXJhdGVkIHN0dWZmLiBNYW55IGZhaWx1cmVzIGNvdWxkIGJlIHNvbHZlZCBqdXN0Ci1ieSBhICJjbGVhbiBidWlsZCIuPC9wPgotCi08cD5CeSBkZWZhdWx0IEFudCB1c2VzIDx0dD5idWlsZC54bWw8L3R0PiBhcyB0aGUgbmFtZSBmb3IgYSBidWlsZGZpbGUsIHNvIG91ciA8dHQ+LlxidWlsZC54bWw8L3R0PiB3b3VsZCBiZTo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKzxwPkJ5IGRlZmF1bHQgQW50IHVzZXMgPHNhbXA+YnVpbGQueG1sPC9zYW1wPiBhcyB0aGUgbmFtZSBmb3IgYSBidWlsZGZpbGUsIHNvIG91ciA8c2FtcD4uXGJ1aWxkLnhtbDwvc2FtcD4gd291bGQgYmU6PC9wPgorPHByZT4KICZsdDtwcm9qZWN0Jmd0OwogCiAgICAgJmx0O3RhcmdldCBuYW1lPSJjbGVhbiImZ3Q7CkBAIC0xMjQsMjggKzExMSwyNCBAQAogICAgICAgICAmbHQ7amF2YSBqYXI9ImJ1aWxkL2phci9IZWxsb1dvcmxkLmphciIgZm9yaz0idHJ1ZSIvJmd0OwogICAgICZsdDsvdGFyZ2V0Jmd0OwogCi0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAogPHA+Tm93IHlvdSBjYW4gY29tcGlsZSwgcGFja2FnZSBhbmQgcnVuIHRoZSBhcHBsaWNhdGlvbiB2aWE8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmUgY2xhc3M9ImlucHV0Ij4KIGFudCBjb21waWxlCiBhbnQgamFyCi1hbnQgcnVuCi08L3ByZT4KK2FudCBydW48L3ByZT4KIDxwPk9yIHNob3J0ZXIgd2l0aDwvcD4KLTxwcmUgY2xhc3M9ImNvZGUiPgotYW50IGNvbXBpbGUgamFyIHJ1bgotPC9wcmU+Cis8cHJlIGNsYXNzPSJpbnB1dCI+YW50IGNvbXBpbGUgamFyIHJ1bjwvcHJlPgogCi08cD5XaGlsZSBoYXZpbmcgYSBsb29rIGF0IHRoZSBidWlsZGZpbGUsIHdlIHdpbGwgc2VlIHNvbWUgc2ltaWxhciBzdGVwcyBiZXR3ZWVuIEFudCBhbmQgdGhlIGphdmEtb25seSBjb21tYW5kczoKKzxwPldoaWxlIGhhdmluZyBhIGxvb2sgYXQgdGhlIGJ1aWxkZmlsZSwgd2Ugd2lsbCBzZWUgc29tZSBzaW1pbGFyIHN0ZXBzIGJldHdlZW4gQW50IGFuZCB0aGUgSmF2YS1vbmx5IGNvbW1hbmRzOjwvcD4KIDx0YWJsZT4KIDx0cj4KLSAgPHRoPmphdmEtb25seTwvdGg+Ci0gIDx0aD5BbnQ8L3RoPgorICA8dGggc2NvcGU9ImNvbCI+SmF2YS1vbmx5PC90aD4KKyAgPHRoIHNjb3BlPSJjb2wiPkFudDwvdGg+CiA8L3RyPgogPHRyPgotICA8dGQgdmFsaWduPSJ0b3AiPjxwcmUgY2xhc3M9ImNvZGUiPgorICA8dGQ+PHByZSBjbGFzcz0iaW5wdXQiPgogbWQgYnVpbGRcY2xhc3NlcwogamF2YWMKICAgICAtc291cmNlcGF0aCBzcmMKQEAgLTE2MSwxNSArMTQ0LDE0IEBACiAKIAogCi1qYXZhIC1qYXIgYnVpbGRcamFyXEhlbGxvV29ybGQuamFyCi0gIDwvcHJlPjwvdGQ+Ci0gIDx0ZCB2YWxpZ249InRvcCI+PHByZSBjbGFzcz0iY29kZSI+CitqYXZhIC1qYXIgYnVpbGRcamFyXEhlbGxvV29ybGQuamFyPC9wcmU+PC90ZD4KKyAgPHRkPjxwcmU+CiAmbHQ7bWtkaXIgZGlyPSJidWlsZC9jbGFzc2VzIi8mZ3Q7CiAmbHQ7amF2YWMKICAgICBzcmNkaXI9InNyYyIKICAgICBkZXN0ZGlyPSJidWlsZC9jbGFzc2VzIi8mZ3Q7Ci08aT4mbHQ7IS0tIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgLS0mZ3Q7PC9pPgotPGk+Jmx0OyEtLSBvYnNvbGV0ZTsgZG9uZSB2aWEgbWFuaWZlc3QgdGFnIC0tJmd0OzwvaT4KKzxlbT4mbHQ7IS0tIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgLS0mZ3Q7PC9lbT4KKzxlbT4mbHQ7IS0tIG9ic29sZXRlOyBkb25lIHZpYSBtYW5pZmVzdCB0YWcgLS0mZ3Q7PC9lbT4KICZsdDtta2RpciBkaXI9ImJ1aWxkL2phciIvJmd0OwogJmx0O2phcgogICAgIGRlc3RmaWxlPSJidWlsZC9qYXIvSGVsbG9Xb3JsZC5qYXIiCkBAIC0xNzksMjMgKzE2MSwxOCBAQAogICAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Ik1haW4tQ2xhc3MiIHZhbHVlPSJvYXRhLkhlbGxvV29ybGQiLyZndDsKICAgICAmbHQ7L21hbmlmZXN0Jmd0OwogJmx0Oy9qYXImZ3Q7Ci0mbHQ7amF2YSBqYXI9ImJ1aWxkL2phci9IZWxsb1dvcmxkLmphciIgZm9yaz0idHJ1ZSIvJmd0OwotICA8L3ByZT48L3RkPgotPC90cj48L3RhYmxlPgotPC9wPgorJmx0O2phdmEgamFyPSJidWlsZC9qYXIvSGVsbG9Xb3JsZC5qYXIiIGZvcms9InRydWUiLyZndDs8L3ByZT48L3RkPgorPC90cj4KKzwvdGFibGU+CiAKKzxoMiBpZD0iZW5oYW5jZSI+RW5oYW5jZSB0aGUgYnVpbGQgZmlsZTwvaDI+Cis8cD5Ob3cgdGhhdCB3ZSBoYXZlIGEgd29ya2luZyBidWlsZGZpbGUsIHdlIGNvdWxkIGRvIHNvbWUgZW5oYW5jZW1lbnRzOiBtYW55IHRpbWVzIHlvdSBhcmUgcmVmZXJlbmNpbmcgdGhlIHNhbWUKK2RpcmVjdG9yaWVzLCBtYWluLWNsYXNzIGFuZCBqYXItbmFtZSBhcmUgaGFyZGNvZGVkLCBhbmQgd2hpbGUgaW52b2tpbmcgeW91IGhhdmUgdG8gcmVtZW1iZXIgdGhlIHJpZ2h0IG9yZGVyIG9mIGJ1aWxkCitzdGVwcy48L3A+Cis8cD5UaGUgZmlyc3QgYW5kIHNlY29uZCBwb2ludCB3b3VsZCBiZSBhZGRyZXNzZWQgd2l0aCA8ZW0+cHJvcGVydGllczwvZW0+LCB0aGUgdGhpcmQgd2l0aCBhIHNwZWNpYWwgcHJvcGVydHkmbWRhc2g7YW4KK2F0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3Byb2plY3QmZ3Q7PC9jb2RlPiB0YWcgYW5kIHRoZSBmb3VydGggcHJvYmxlbSBjYW4gYmUgc29sdmVkIHVzaW5nIGRlcGVuZGVuY2llcy48L3A+CiAKLQotPGEgbmFtZT0iZW5oYW5jZSI+PC9hPgotPGgyPkVuaGFuY2UgdGhlIGJ1aWxkIGZpbGU8L2gyPgotPHA+Tm93IHdlIGhhdmUgYSB3b3JraW5nIGJ1aWxkZmlsZSB3ZSBjb3VsZCBkbyBzb21lIGVuaGFuY2VtZW50czogbWFueSB0aW1lIHlvdSBhcmUgcmVmZXJlbmNpbmcgdGhlCi1zYW1lIGRpcmVjdG9yaWVzLCBtYWluLWNsYXNzIGFuZCBqYXItbmFtZSBhcmUgaGFyZCBjb2RlZCwgYW5kIHdoaWxlIGludm9jYXRpb24geW91IGhhdmUgdG8gcmVtZW1iZXIKLXRoZSByaWdodCBvcmRlciBvZiBidWlsZCBzdGVwcy48L3A+Ci08cD5UaGUgZmlyc3QgYW5kIHNlY29uZCBwb2ludCB3b3VsZCBiZSBhZGRyZXNzZWQgd2l0aCA8aT5wcm9wZXJ0aWVzPC9pPiwgdGhlIHRoaXJkIHdpdGggYSBzcGVjaWFsIHByb3BlcnR5IC0gYW4gYXR0cmlidXRlCi1vZiB0aGUgJmx0O3Byb2plY3QmZ3Q7LXRhZyBhbmQgdGhlIGZvdXJ0aCBwcm9ibGVtIGNhbiBiZSBzb2x2ZWQgdXNpbmcgZGVwZW5kZW5jaWVzLjwvcD4KLQotCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmU+CiAmbHQ7cHJvamVjdCBuYW1lPSJIZWxsb1dvcmxkIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIiZndDsKIAogICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgdmFsdWU9InNyYyIvJmd0OwpAQCAtMjM0LDExICsyMTEsOSBAQAogCiAgICAgJmx0O3RhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJjbGVhbixydW4iLyZndDsKIAotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLQotPHA+Tm93IGl0J3MgZWFzaWVyLCBqdXN0IGRvIGEgPHR0IGNsYXNzPSJjb2RlIj5hbnQ8L3R0PiBhbmQgeW91IHdpbGwgZ2V0PC9wPgorPHA+Tm93IGl0J3MgZWFzaWVyLCBqdXN0IGRvIGEgPGtiZD5hbnQ8L2tiZD4gYW5kIHlvdSB3aWxsIGdldDwvcD4KIDxwcmUgY2xhc3M9Im91dHB1dCI+CiBCdWlsZGZpbGU6IGJ1aWxkLnhtbAogCkBAIC0yNTcsMjkgKzIzMiwyOCBAQAogCiBtYWluOgogCi1CVUlMRCBTVUNDRVNTRlVMCi08L3ByZT4KK0JVSUxEIFNVQ0NFU1NGVUw8L3ByZT4KIAotCi08YSBuYW1lPSJleHQtbGlicyI+PC9hPgotPGgyPlVzaW5nIGV4dGVybmFsIGxpYnJhcmllczwvaDI+Ci08cD5Tb21laG93IHRvbGQgdXMgbm90IHRvIHVzZSBzeXNvLXN0YXRlbWVudHMuIEZvciBsb2ctU3RhdGVtZW50cyB3ZSBzaG91bGQgdXNlIGEgTG9nZ2luZy1BUEkgLSBjdXN0b21pemFibGUgb24gYSBoaWdoCi1kZWdyZWUgKGluY2x1ZGluZyBzd2l0Y2hpbmcgb2ZmIGR1cmluZyB1c3VhbCBsaWZlICg9IG5vdCBkZXZlbG9wbWVudCkgZXhlY3V0aW9uKS4gV2UgdXNlIExvZzRKIGZvciB0aGF0LCBiZWNhdXNlIDx1bD4KKzxoMiBpZD0iZXh0LWxpYnMiPlVzaW5nIGV4dGVybmFsIGxpYnJhcmllczwvaDI+Cis8cD5Tb21lYm9keSB0b2xkIHVzIG5vdCB0byB1c2UgPGNvZGU+U3lzdGVtPC9jb2RlPi1zdGF0ZW1lbnRzLiBGb3Igb3V0cHV0LCB3ZSBzaG91bGQgdXNlIGEgTG9nZ2luZworQVBJJm1kYXNoO2N1c3RvbWl6YWJsZSB0byBhIGhpZ2ggZGVncmVlIChpbmNsdWRpbmcgc3dpdGNoaW5nIG9mZiBkdXJpbmcgdXN1YWwgbGlmZSAoPSBub3QgZGV2ZWxvcG1lbnQpIGV4ZWN1dGlvbikuIFdlCit1c2UgTG9nNEogZm9yIHRoYXQsIGJlY2F1c2U8L3A+Cis8dWw+CiA8bGk+aXQgaXMgbm90IHBhcnQgb2YgdGhlIEpESyAoMS40KykgYW5kIHdlIHdhbnQgdG8gc2hvdyBob3cgdG8gdXNlIGV4dGVybmFsIGxpYnM8L2xpPgogPGxpPml0IGNhbiBydW4gdW5kZXIgSkRLIDEuMiAoYXMgQW50KTwvbGk+CiA8bGk+aXQncyBoaWdobHkgY29uZmlndXJhYmxlPC9saT4KIDxsaT5pdCdzIGZyb20gQXBhY2hlIDstKTwvbGk+Ci08L3VsPjwvcD4KLTxwPldlIHN0b3JlIG91ciBleHRlcm5hbCBsaWJyYXJpZXMgaW4gYSBuZXcgZGlyZWN0b3J5IDx0dD5saWI8L3R0Pi4gTG9nNEogY2FuIGJlCi08YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9sb2dnaW5nL2xvZzRqLzEuMi4xMy9sb2dnaW5nLWxvZzRqLTEuMi4xMy56aXAiPmRvd25sb2FkZWQgWzFdPC9hPiBmcm9tIExvZ2dpbmcncyBIb21lcGFnZS4KLUNyZWF0ZSB0aGUgPHR0PmxpYjwvdHQ+IGRpcmVjdG9yeSBhbmQgZXh0cmFjdCB0aGUgbG9nNGotMS4yLjkuamFyIGludG8gdGhhdCBsaWItZGlyZWN0b3J5LiBBZnRlciB0aGF0IHdlIGhhdmUgdG8gbW9kaWZ5Ci1vdXIgamF2YSBzb3VyY2UgdG8gdXNlIHRoYXQgbGlicmFyeSBhbmQgb3VyIGJ1aWxkZmlsZSBzbyB0aGF0IHRoaXMgbGlicmFyeSBjb3VsZCBiZSBhY2Nlc3NlZCBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJ1bi4KLTwvcD4KLTxwPldvcmtpbmcgd2l0aCBMb2c0SiBpcyBkb2N1bWVudGVkIGluc2lkZSBpdHMgbWFudWFsLiBIZXJlIHdlIHVzZSB0aGUgPGk+TXlBcHA8L2k+LWV4YW1wbGUgZnJvbSB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovZG9jcy9tYW51YWwuaHRtbCI+U2hvcnQgTWFudWFsIFsyXTwvYT4uIEZpcnN0IHdlIGhhdmUgdG8gbW9kaWZ5IHRoZSBqYXZhIHNvdXJjZSB0bwotdXNlIHRoZSBsb2dnaW5nIGZyYW1ld29yazo8L3A+Cis8L3VsPgorPHA+V2Ugc3RvcmUgb3VyIGV4dGVybmFsIGxpYnJhcmllcyBpbiBhIG5ldyBkaXJlY3RvcnkgPHNhbXA+bGliPC9zYW1wPi4gTG9nNEogY2FuCitiZSA8YSBocmVmPSJodHRwczovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2xvZ2dpbmcvbG9nNGovMS4yLjE3L2xvZzRqLTEuMi4xNy56aXAiIHRhcmdldD0iX3RvcCI+ZG93bmxvYWRlZAorWzFdPC9hPiBmcm9tIExvZ2dpbmcncyBIb21lcGFnZS4gIENyZWF0ZSB0aGUgPHNhbXA+bGliPC9zYW1wPiBkaXJlY3RvcnkgYW5kIGV4dHJhY3QgdGhlIDxzYW1wPmxvZzRqLTEuMi4xNy5qYXI8L3NhbXA+CitpbnRvIHRoYXQgZGlyZWN0b3J5LiBBZnRlciB0aGF0IHdlIGhhdmUgdG8gbW9kaWZ5IG91ciBKYXZhIHNvdXJjZSBmaWxlIHRvIHVzZSB0aGF0IGxpYnJhcnkgYW5kIG91ciBidWlsZGZpbGUgc28gdGhhdAordGhpcyBsaWJyYXJ5IGNvdWxkIGJlIGFjY2Vzc2VkIGR1cmluZyBjb21waWxhdGlvbiBhbmQgcnVuLjwvcD4KKzxwPldvcmtpbmcgd2l0aCBMb2c0SiBpcyBkb2N1bWVudGVkIGluc2lkZSBpdHMgbWFudWFsLiBIZXJlIHdlIHVzZSB0aGUgPHNhbXA+TXlBcHA8L3NhbXA+LWV4YW1wbGUgZnJvbQordGhlIDxhIGhyZWY9Imh0dHBzOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqLzEuMi9tYW51YWwuaHRtbCIgdGFyZ2V0PSJfdG9wIj5TaG9ydCBNYW51YWwgWzJdPC9hPi4gRmlyc3Qgd2UgaGF2ZSB0bworbW9kaWZ5IHRoZSBqYXZhIHNvdXJjZSB0byB1c2UgdGhlIGxvZ2dpbmcgZnJhbWV3b3JrOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogcGFja2FnZSBvYXRhOwogCiA8Yj5pbXBvcnQgb3JnLmFwYWNoZS5sb2c0ai5Mb2dnZXI7PC9iPgpAQCAtMjkwLDE5ICsyNjQsMTkgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgPGI+QmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7PC9iPgotICAgICAgICA8Zm9udCBjb2xvcj0iYmx1ZSI+PGI+bG9nZ2VyLmluZm8oIkhlbGxvIFdvcmxkIik7PC9iPjwvZm9udD4gICAgICAgICAgLy8gdGhlIG9sZCBTeXNPLXN0YXRlbWVudAorICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+PGI+bG9nZ2VyLmluZm8oIkhlbGxvIFdvcmxkIik7PC9iPjwvc3Bhbj4gICAgICAgICAgLy8gdGhlIG9sZCBTeXNPLXN0YXRlbWVudAogICAgIH0KLX0KLTwvcHJlPgorfTwvcHJlPgogCiA8cD5Nb3N0IG9mIHRoZSBtb2RpZmljYXRpb25zIGFyZSAiZnJhbWV3b3JrIG92ZXJoZWFkIiB3aGljaCBoYXMgdG8gYmUgZG9uZSBvbmNlLiBUaGUgYmx1ZSBsaW5lIGlzIG91ciAib2xkIFN5c3RlbS1vdXQiCiBzdGF0ZW1lbnQuPC9wPgotPHA+RG9uJ3QgdHJ5IHRvIHJ1biA8dHQ+YW50PC90dD4gLSB5b3Ugd2lsbCBvbmx5IGdldCBsb3Qgb2YgY29tcGlsZXIgZXJyb3JzLiBMb2c0SiBpcyBub3QgaW5zaWRlIHRoZSBjbGFzc3BhdGggc28gd2UgaGF2ZQotdG8gZG8gYSBsaXR0bGUgd29yayBoZXJlLiBCdXQgZG8gbm90IGNoYW5nZSB0aGUgQ0xBU1NQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlISBUaGlzIGlzIG9ubHkgZm9yIHRoaXMgcHJvamVjdCBhbmQgbWF5YmUKLXlvdSB3b3VsZCBicmVhayBvdGhlciBlbnZpcm9ubWVudHMgKHRoaXMgaXMgb25lIG9mIHRoZSBtb3N0IGZhbW91cyBtaXN0YWtlcyB3aGVuIHdvcmtpbmcgd2l0aCBBbnQpLiBXZSBpbnRyb2R1Y2UgTG9nNEoKLShvciB0byBiZSBtb3JlIHByZWNpc2U6IGFsbCBsaWJyYXJpZXMgKGphci1maWxlcykgd2hpY2ggYXJlIHNvbWV3aGVyZSB1bmRlciA8dHQ+LlxsaWI8L3R0PikgaW50byBvdXIgYnVpbGRmaWxlOjwvcD4KKzxwPkRvbid0IHRyeSB0byBydW4gPGtiZD5hbnQ8L2tiZD4mbWRhc2g7eW91IHdpbGwgb25seSBnZXQgbG90IG9mIGNvbXBpbGVyIGVycm9ycy4gTG9nNEogaXMgbm90IG9uIHRoZSBjbGFzc3BhdGggc28gd2UKK2hhdmUgdG8gZG8gYSBsaXR0bGUgd29yayBoZXJlLiBCdXQgZG8gbm90IGNoYW5nZSB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSEgVGhpcyBpcyBvbmx5IGZvciB0aGlzCitwcm9qZWN0IGFuZCBtYXliZSB5b3Ugd291bGQgYnJlYWsgb3RoZXIgZW52aXJvbm1lbnRzICh0aGlzIGlzIG9uZSBvZiB0aGUgbW9zdCBmYW1vdXMgbWlzdGFrZXMgd2hlbiB3b3JraW5nIHdpdGggQW50KS4gV2UKK2ludHJvZHVjZSBMb2c0SiAob3IgdG8gYmUgbW9yZSBwcmVjaXNlOiBhbGwgbGlicmFyaWVzIChqYXItZmlsZXMpIHdoaWNoIGFyZSBzb21ld2hlcmUgdW5kZXIgPHNhbXA+LlxsaWI8L3NhbXA+KSBpbnRvIG91cgorYnVpbGRmaWxlOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogJmx0O3Byb2plY3QgbmFtZT0iSGVsbG9Xb3JsZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiImZ3Q7CiAgICAgLi4uCiAgICAgPGI+Jmx0O3Byb3BlcnR5IG5hbWU9ImxpYi5kaXIiICAgICB2YWx1ZT0ibGliIi8mZ3Q7PC9iPgpAQCAtMzIyLDU5ICsyOTYsNTcgQEAKICAgICAgICAgJmx0O2phdmEgZm9yaz0idHJ1ZSIgPGI+Y2xhc3NuYW1lPSIke21haW4tY2xhc3N9IjwvYj4mZ3Q7CiAgICAgICAgICAgICA8Yj4mbHQ7Y2xhc3NwYXRoJmd0OzwvYj4KICAgICAgICAgICAgICAgICA8Yj4mbHQ7cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8mZ3Q7PC9iPgotICAgICAgICAgICAgICAgIDxmb250IGNvbG9yPSJyZWQiPjxiPiZsdDtwYXRoIGxvY2F0aW9uPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7PC9iPjwvZm9udD4KKyAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj48Yj4mbHQ7cGF0aCBsb2NhdGlvbj0iJHtqYXIuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvJmd0OzwvYj48L3NwYW4+CiAgICAgICAgICAgICA8Yj4mbHQ7L2NsYXNzcGF0aCZndDs8L2I+CiAgICAgICAgICZsdDsvamF2YSZndDsKICAgICAmbHQ7L3RhcmdldCZndDsKIAogICAgIC4uLgogCi0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAotPHA+SW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IG91ciBhcHBsaWNhdGlvbiBub3QgdmlhIGl0cyBNYWluLUNsYXNzIG1hbmlmZXN0LWF0dHJpYnV0ZSwgYmVjYXVzZSB3ZSBjb3VsZCBub3QgcHJvdmlkZQotYSBqYXJuYW1lIDxpPmFuZDwvaT4gYSBjbGFzc3BhdGguIFNvIGFkZCBvdXIgY2xhc3MgaW4gdGhlIHJlZCBsaW5lIHRvIHRoZSBhbHJlYWR5IGRlZmluZWQgcGF0aCBhbmQgc3RhcnQgYXMgdXN1YWwuIFJ1bm5pbmcKLTx0dD5hbnQ8L3R0PiB3b3VsZCBnaXZlIChhZnRlciB0aGUgdXN1YWwgY29tcGlsZSBzdHVmZik6PC9wPgorPHA+SW4gdGhpcyBleGFtcGxlIHdlIHN0YXJ0IG91ciBhcHBsaWNhdGlvbiBub3QgdmlhIGl0cyA8Y29kZT5NYWluLUNsYXNzPC9jb2RlPiBtYW5pZmVzdC1hdHRyaWJ1dGUsIGJlY2F1c2Ugd2UgY291bGQgbm90Citwcm92aWRlIGEgamFyLW5hbWUgPGVtPmFuZDwvZW0+IGEgY2xhc3NwYXRoLiBTbyBhZGQgb3VyIGNsYXNzIGluIHRoZSByZWQgbGluZSB0byB0aGUgYWxyZWFkeSBkZWZpbmVkIHBhdGggYW5kIHN0YXJ0IGFzCit1c3VhbC4gUnVubmluZyA8a2JkPmFudDwva2JkPiB3b3VsZCBnaXZlIChhZnRlciB0aGUgdXN1YWwgY29tcGlsZSBzdHVmZik6PC9wPgogCi08cHJlIGNsYXNzPSJvdXRwdXQiPgotW2phdmFdIDAgW21haW5dIElORk8gb2F0YS5IZWxsb1dvcmxkICAtIEhlbGxvIFdvcmxkCi08L3ByZT4KKzxwcmUgY2xhc3M9Im91dHB1dCI+W2phdmFdIDAgW21haW5dIElORk8gb2F0YS5IZWxsb1dvcmxkICAtIEhlbGxvIFdvcmxkPC9wcmU+CiAKLTxwPldoYXQncyB0aGF0PyA8dWw+Ci08bGk+PGk+W2phdmFdPC9pPiBBbnQgdGFzayBydW5uaW5nIGF0IHRoZSBtb21lbnQ8L2xpPgotPGxpPjxpPjA8L2k+IDxmb250IHNpemU9Ii0xIj5zb3JyeSBkb24ndCBrbm93IC0gc29tZSBMb2c0SiBzdHVmZjwvZm9udD48L2xpPgotPGxpPjxpPlttYWluXTwvaT4gdGhlIHJ1bm5pbmcgdGhyZWFkIGZyb20gb3VyIGFwcGxpY2F0aW9uIDwvbGk+Ci08bGk+PGk+SU5GTzwvaT4gbG9nIGxldmVsIG9mIHRoYXQgc3RhdGVtZW50PC9pPgotPGxpPjxpPm9hdGEuSGVsbG9Xb3JsZDwvaT4gc291cmNlIG9mIHRoYXQgc3RhdGVtZW50PC9pPgotPGxpPjxpPi08L2k+IHNlcGFyYXRvcjwvbGk+Ci08bGk+PGk+SGVsbG8gV29ybGQ8L2k+IHRoZSBtZXNzYWdlPC9saT4KKzxwPldoYXQncyB0aGF0PzwvcD4KKzx1bD4KKzxsaT48Y29kZT5bamF2YV08L2NvZGU+IEFudCB0YXNrIHJ1bm5pbmcgYXQgdGhlIG1vbWVudDwvbGk+Cis8bGk+PGNvZGU+MDwvY29kZT4gPHNtYWxsPnNvcnJ5LCBkb24ndCBrbm93Jm1kYXNoO3NvbWUgTG9nNEogc3R1ZmY8L3NtYWxsPjwvbGk+Cis8bGk+PGNvZGU+W21haW5dPC9jb2RlPiB0aGUgcnVubmluZyB0aHJlYWQgZnJvbSBvdXIgYXBwbGljYXRpb248L2xpPgorICAgIDxsaT48Y29kZT5JTkZPPC9jb2RlPiBsb2cgbGV2ZWwgb2YgdGhhdCBzdGF0ZW1lbnQ8L2xpPgorICAgIDxsaT48Y29kZT5vYXRhLkhlbGxvV29ybGQ8L2NvZGU+IHNvdXJjZSBvZiB0aGF0IHN0YXRlbWVudDwvbGk+Cis8bGk+PGNvZGU+LTwvY29kZT4gc2VwYXJhdG9yPC9saT4KKzxsaT48Y29kZT5IZWxsbyBXb3JsZDwvY29kZT4gdGhlIG1lc3NhZ2U8L2xpPgogPC91bD4KLUZvciBhbm90aGVyIGxheW91dCAuLi4gaGF2ZSBhIGxvb2sgaW5zaWRlIExvZzRKJ3MgZG9jdW1lbnRhdGlvbiBhYm91dCB1c2luZyBvdGhlciBQYXR0ZXJuTGF5b3V0J3MuPC9wPgorPHA+Rm9yIGFub3RoZXIgbGF5b3V0IC4uLiBoYXZlIGEgbG9vayBpbnNpZGUgTG9nNEoncyBkb2N1bWVudGF0aW9uIGFib3V0IHVzaW5nIG90aGVyIFBhdHRlcm5MYXlvdXRzLjwvcD4KIAorPGgyIGlkPSJjb25maWctZmlsZXMiPkNvbmZpZ3VyYXRpb24gZmlsZXM8L2gyPgorPHA+V2h5IHdlIGhhdmUgdXNlZCBMb2c0Sj8gIkl0J3MgaGlnaGx5IGNvbmZpZ3VyYWJsZSI/IE5vJm1kYXNoO2FsbCBpcyBoYXJkY29kZWQhIEJ1dCB0aGF0IGlzIG5vdCB0aGUgZmF1bHQgb2YKK0xvZzRKJm1kYXNoO2l0J3Mgb3Vycy4gV2UgaGFkIGNvZGVkIDxjb2RlIGNsYXNzPSJjb2RlIj5CYXNpY0NvbmZpZ3VyYXRvci5jb25maWd1cmUoKTs8L2NvZGU+IHdoaWNoIGltcGxpZXMgYSBzaW1wbGUsIGJ1dAoraGFyZGNvZGVkIGNvbmZpZ3VyYXRpb24uIE1vcmUgY29tZm9ydGFibGUgd291bGQgYmUgdXNpbmcgYSBwcm9wZXJ0eSBmaWxlLiBJbiB0aGUgSmF2YSBzb3VyY2UgZmlsZSwgZGVsZXRlCit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPkJhc2ljQ29uZmlndXJhdGlvbjwvY29kZT4gbGluZSBmcm9tIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+bWFpbigpPC9jb2RlPiBtZXRob2QgKGFuZCB0aGUKK3JlbGF0ZWQgPGNvZGU+aW1wb3J0PC9jb2RlPiBzdGF0ZW1lbnQpLiBMb2c0SiB3aWxsIHNlYXJjaCB0aGVuIGZvciBhIGNvbmZpZ3VyYXRpb24gYXMgZGVzY3JpYmVkIGluIGl0cyBtYW51YWwuIFRoZW4KK2NyZWF0ZSBhIG5ldyBmaWxlIDxzYW1wPnNyYy9sb2c0ai5wcm9wZXJ0aWVzPC9zYW1wPi4gVGhhdCdzIHRoZSBkZWZhdWx0IG5hbWUgZm9yIExvZzRKJ3MgY29uZmlndXJhdGlvbiBhbmQgdXNpbmcgdGhhdAorbmFtZSB3b3VsZCBtYWtlIGxpZmUgZWFzaWVyJm1kYXNoO25vdCBvbmx5IHRoZSBmcmFtZXdvcmsga25vd3Mgd2hhdCBpcyBpbnNpZGUsIHlvdSB0b28hPC9wPgogCi08YSBuYW1lPSJjb25maWctZmlsZXMiPgotPGgyPkNvbmZpZ3VyYXRpb24gZmlsZXM8L2gyPgotPHA+V2h5IHdlIGhhdmUgdXNlZCBMb2c0Sj8gIkl0J3MgaGlnaGx5IGNvbmZpZ3VyYWJsZSI/IE5vIC0gYWxsIGlzIGhhcmQgY29kZWQhIEJ1dCB0aGF0IGlzIG5vdCB0aGUgZGVidCBvZiBMb2c0SiAtIGl0J3MKLW91cnMuIFdlIGhhZCBjb2RlZCA8dHQ+QmFzaWNDb25maWd1cmF0b3IuY29uZmlndXJlKCk7PC90dD4gd2hpY2ggaW1wbGllcyBhIHNpbXBsZSwgYnV0IGhhcmQgY29kZWQgY29uZmlndXJhdGlvbi4gTW9yZQotY29tZm9ydGFibGUgd291bGQgYmUgdXNpbmcgYSBwcm9wZXJ0eSBmaWxlLiBJbiB0aGUgamF2YSBzb3VyY2UgZGVsZXRlIHRoZSBCYXNpY0NvbmZpZ3VyYXRpb24tbGluZSBmcm9tIHRoZSBtYWluKCkgbWV0aG9kCi0oYW5kIHRoZSByZWxhdGVkIGltcG9ydC1zdGF0ZW1lbnQpLiBMb2c0SiB3aWxsIHNlYXJjaCB0aGVuIGZvciBhIGNvbmZpZ3VyYXRpb24gYXMgZGVzY3JpYmVkIGluIGl0J3MgbWFudWFsLiBUaGVuIGNyZWF0ZSAKLWEgbmV3IGZpbGUgPHR0PnNyYy9sb2c0ai5wcm9wZXJ0aWVzPC90dD4uIFRoYXQncyB0aGUgZGVmYXVsdCBuYW1lIGZvciBMb2c0SidzIGNvbmZpZ3VyYXRpb24gYW5kIHVzaW5nIHRoYXQgbmFtZSB3b3VsZCBtYWtlIAotbGlmZSBlYXNpZXIgLSBub3Qgb25seSB0aGUgZnJhbWV3b3JrIGtub3dzIHdoYXQgaXMgaW5zaWRlLCB5b3UgdG9vITwvcD4KLQotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgPGI+c3Rkb3V0PC9iPgogCiBsb2c0ai5hcHBlbmRlci48Yj5zdGRvdXQ8L2I+PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCiAKIGxvZzRqLmFwcGVuZGVyLjxiPnN0ZG91dDwvYj4ubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuPGI+c3Rkb3V0PC9iPi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49PGZvbnQgY29sb3I9ImJsdWUiPjxiPiVtJW48L2I+PC9mb250PgorbG9nNGouYXBwZW5kZXIuPGI+c3Rkb3V0PC9iPi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49PHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPjxiPiVtJW48L2I+PC9zcGFuPgogPC9wcmU+CiAKLTxwPlRoaXMgY29uZmlndXJhdGlvbiBjcmVhdGVzIGFuIG91dHB1dCBjaGFubmVsICgiQXBwZW5kZXIiKSB0byBjb25zb2xlIG5hbWVkIGFzIDx0dD5zdGRvdXQ8L3R0PiB3aGljaCBwcmludHMgdGhlCi1tZXNzYWdlICglbSkgZm9sbG93ZWQgYnkgYSBsaW5lIGZlZWQgKCVuKSAtIHNhbWUgYXMgdGhlIGVhcmxpZXIgU3lzdGVtLm91dC5wcmludGxuKCkgOi0pIE9vb2gga2F5IC0gYnV0IHdlIGhhdmVuJ3QKLWZpbmlzaGVkIHlldC4gV2Ugc2hvdWxkIGRlbGl2ZXIgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwgdG9vLiBTbyB3ZSBjaGFuZ2UgdGhlIGJ1aWxkZmlsZTo8L3A+Cis8cD5UaGlzIGNvbmZpZ3VyYXRpb24gY3JlYXRlcyBhbiBvdXRwdXQgY2hhbm5lbCAoPHE+QXBwZW5kZXI8L3E+KSB0byBjb25zb2xlIG5hbWVkIGFzIDxjb2RlPnN0ZG91dDwvY29kZT4gd2hpY2ggcHJpbnRzCit0aGUgbWVzc2FnZSAoPHE+JW08L3E+KSBmb2xsb3dlZCBieSBhIGxpbmUgZmVlZCAoPHE+JW48L3E+KSZtZGFzaDtzYW1lIGFzIHRoZQorZWFybGllciA8Y29kZSBjbGFzcz0iY29kZSI+U3lzdGVtLm91dC5wcmludGxuKCk8L2NvZGU+IDotKSBPb29oIGtheSZtZGFzaDtidXQgd2UgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQuIFdlIHNob3VsZCBkZWxpdmVyCit0aGUgY29uZmlndXJhdGlvbiBmaWxlLCB0b28uIFNvIHdlIGNoYW5nZSB0aGUgYnVpbGRmaWxlOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogICAgIC4uLgogICAgICZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSImZ3Q7CiAgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CkBAIC0zODMsMzUgKzM1NSw0MSBAQAogICAgICAgICAgICAgPGI+Jmx0O2ZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBleGNsdWRlcz0iKiovKi5qYXZhIi8mZ3Q7PC9iPgogICAgICAgICA8Yj4mbHQ7L2NvcHkmZ3Q7PC9iPgogICAgICZsdDsvdGFyZ2V0Jmd0OwotICAgIC4uLgotPC9wcmU+CisgICAgLi4uPC9wcmU+CiAKLTxwPlRoaXMgY29waWVzIGFsbCByZXNvdXJjZXMgKGFzIGxvbmcgYXMgdGhleSBoYXZlbid0IHRoZSBzdWZmaXggIi5qYXZhIikgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgc28gd2UgY291bGQKKzxwPlRoaXMgY29waWVzIGFsbCByZXNvdXJjZXMgKGFzIGxvbmcgYXMgdGhleSBoYXZlbid0IHRoZSBzdWZmaXggPHNhbXA+LmphdmE8L3NhbXA+KSB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LCBzbyB3ZSBjb3VsZAogc3RhcnQgdGhlIGFwcGxpY2F0aW9uIGZyb20gdGhhdCBkaXJlY3RvcnkgYW5kIHRoZXNlIGZpbGVzIHdpbGwgaW5jbHVkZWQgaW50byB0aGUgamFyLjwvcD4KIAorPGgyIGlkPSJqdW5pdCI+VGVzdGluZyB0aGUgY2xhc3M8L2gyPgorPHA+SW4gdGhpcyBzdGVwIHdlIHdpbGwgaW50cm9kdWNlIHRoZSB1c2FnZSBvZiB0aGUgSlVuaXQgWzNdIHRlc3QgZnJhbWV3b3JrIGluIGNvbWJpbmF0aW9uIHdpdGggQW50LiBCZWNhdXNlIEFudCBoYXMgYQorYnVpbHQtaW4gSlVuaXQgNC4xMyB5b3UgY291bGQgc3RhcnQgZGlyZWN0bHkgdXNpbmcgaXQuIFdyaXRlIGEgdGVzdCBjbGFzcworaW4gPHNhbXA+c3JjXG9hdGFcSGVsbG9Xb3JsZFRlc3QuamF2YTwvc2FtcD46PC9wPgogCi08YSBuYW1lPSJqdW5pdCI+Ci08aDI+VGVzdGluZyB0aGUgY2xhc3M8L2gyPgotPHA+SW4gdGhpcyBzdGVwIHdlIHdpbGwgaW50cm9kdWNlIHRoZSB1c2FnZSBvZiB0aGUgSlVuaXQgWzNdIHRlc3RmcmFtZXdvcmsgaW4gY29tYmluYXRpb24gd2l0aCBBbnQuIEJlY2F1c2UgQW50Ci1oYXMgYSBidWlsdC1pbiBKVW5pdCAzLjguMiB5b3UgY291bGQgc3RhcnQgZGlyZWN0bHkgdXNpbmcgaXQuIFdyaXRlIGEgdGVzdCBjbGFzcyBpbiA8dHQ+c3JjXEhlbGxvV29ybGRUZXN0LmphdmE8L3R0PjogPC9wPgorPHByZT4KK3BhY2thZ2Ugb2F0YTsKIAotPHByZSBjbGFzcz0iY29kZSI+Ci1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgeworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IHsKKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vdGhpbmcoKSB7CiAgICAgfQotICAgIAorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2lsbEFsd2F5c0ZhaWwoKSB7CiAgICAgICAgIGZhaWwoIkFuIGVycm9yIG1lc3NhZ2UiKTsKICAgICB9Ci0gICAgCisKIH08L3ByZT4KIAotPHA+QmVjYXVzZSB3ZSBkb250IGhhdmUgcmVhbCBidXNpbmVzcyBsb2dpYyB0byB0ZXN0LCB0aGlzIHRlc3QgY2xhc3MgaXMgdmVyeSBzbWFsbDoganVzdCBzaG93IGhvdyB0byBzdGFydC4gRm9yIAotZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIEpVbml0IGRvY3VtZW50YXRpb24gWzNdIGFuZCB0aGUgbWFudWFsIG9mIDxhIGhyZWY9IlRhc2tzL2p1bml0Lmh0bWwiPmp1bml0PC9hPiB0YXNrLgotTm93IHdlIGFkZCBhIGp1bml0IGluc3RydWN0aW9uIHRvIG91ciBidWlsZGZpbGU6PC9wPgorPHA+QmVjYXVzZSB3ZSBkb24ndCBoYXZlIHJlYWwgYnVzaW5lc3MgbG9naWMgdG8gdGVzdCwgdGhpcyB0ZXN0IGNsYXNzIGlzIHZlcnkgc21hbGw6IGp1c3Qgc2hvd2luZyBob3cgdG8gc3RhcnQuIEZvcgorZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIEpVbml0IGRvY3VtZW50YXRpb24gWzNdIGFuZCB0aGUgbWFudWFsIG9mIDxhIGhyZWY9IlRhc2tzL2p1bml0Lmh0bWwiPmp1bml0PC9hPiB0YXNrLiAgTm93IHdlCithZGQgYSA8Y29kZT5qdW5pdDwvY29kZT4gaW5zdHJ1Y3Rpb24gdG8gb3VyIGJ1aWxkZmlsZTo8L3A+CiAKLTxwcmUgY2xhc3M9ImNvZGUiPgorPHByZT4KICAgICAuLi4KIAogICAgICZsdDtwYXRoIDxiPmlkPSJhcHBsaWNhdGlvbiI8L2I+IGxvY2F0aW9uPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIi8mZ3Q7CkBAIC00MjQsNDggKzQwMiw0NSBAQAogICAgICAgICAgICAgJmx0Oy9jbGFzc3BhdGgmZ3Q7CiAgICAgICAgICZsdDsvamF2YSZndDsKICAgICAmbHQ7L3RhcmdldCZndDsKLSAgICAKKwogICAgIDxiPiZsdDt0YXJnZXQgbmFtZT0ianVuaXQiIGRlcGVuZHM9ImphciImZ3Q7CiAgICAgICAgICZsdDtqdW5pdCBwcmludHN1bW1hcnk9InllcyImZ3Q7CiAgICAgICAgICAgICAmbHQ7Y2xhc3NwYXRoJmd0OwogICAgICAgICAgICAgICAgICZsdDtwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLyZndDsKICAgICAgICAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0iYXBwbGljYXRpb24iLyZndDsKICAgICAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OwotICAgICAgICAgICAgCisKICAgICAgICAgICAgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiZndDsKLSAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqVGVzdC5qYXZhIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvJmd0OwogICAgICAgICAgICAgJmx0Oy9iYXRjaHRlc3QmZ3Q7CiAgICAgICAgICZsdDsvanVuaXQmZ3Q7CiAgICAgJmx0Oy90YXJnZXQmZ3Q7PC9iPgogCi0gICAgLi4uCisgICAgLi4uPC9wcmU+CiAKLTwvcHJlPgorPHA+V2UgcmV1c2UgdGhlIHBhdGggdG8gb3VyIG93biBqYXIgZmlsZSBhcyBkZWZpbmVkIGluIDxxPnJ1bjwvcT4tdGFyZ2V0IGJ5IGdpdmluZyBpdCBhbiA8dmFyPmlkPC92YXI+IGFuZCBtYWtpbmcgaXQKK2dsb2JhbGx5IGF2YWlsYWJsZS4gIFRoZSA8dmFyPnByaW50c3VtbWFyeTwvdmFyPj08cT55ZXM8L3E+IGxldHMgdXMgc2VlIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gdGhhbiBqdXN0IGEgIkZBSUxFRCIKK29yICJQQVNTRUQiIG1lc3NhZ2UuICBIb3cgbXVjaCB0ZXN0cyBmYWlsZWQ/IFNvbWUgZXJyb3JzPyA8dmFyPnByaW50c3VtbWFyeTwvdmFyPiBsZXRzIHVzIGtub3cuICBUaGUgY2xhc3NwYXRoIGlzIHNldCB1cAordG8gZmluZCBvdXIgY2xhc3Nlcy4gIFRvIHJ1biB0ZXN0cyB0aGUgPGNvZGU+YmF0Y2h0ZXN0PC9jb2RlPiBoZXJlIGlzIHVzZWQsIHNvIHlvdSBjb3VsZCBlYXNpbHkgYWRkIG1vcmUgdGVzdCBjbGFzc2VzIGluCit0aGUgZnV0dXJlIGp1c3QgYnkgbmFtaW5nIHRoZW0gPGNvZGU+KlRlc3QuamF2YTwvY29kZT4uICBUaGlzIGlzIGEgY29tbW9uIG5hbWluZyBzY2hlbWUuPC9wPgogCi08cD5XZSByZXVzZSB0aGUgcGF0aCB0byBvdXIgb3duIGphciBmaWxlIGFzIGRlZmluZWQgaW4gcnVuLXRhcmdldCBieQotICBnaXZpbmcgaXQgYW4gSUQgYW5kIG1ha2luZyBpdCBnbG9iYWxseSBhdmFpbGFibGUuCi1UaGUgPHR0PnByaW50c3VtbWFyeT15ZXM8L3R0PiBsZXRzIHVzIHNlZSBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHRoYW4ganVzdCBhICJGQUlMRUQiIG9yICJQQVNTRUQiIG1lc3NhZ2UuCi1Ib3cgbXVjaCB0ZXN0cyBmYWlsZWQ/IFNvbWUgZXJyb3JzPyBQcmludHN1bW1hcnkgbGV0cyB1cyBrbm93LiBUaGUgY2xhc3NwYXRoIGlzIHNldCB1cCB0byBmaW5kIG91ciBjbGFzc2VzLgotVG8gcnVuIHRlc3RzIHRoZSA8dHQ+YmF0Y2h0ZXN0PC90dD4gaGVyZSBpcyB1c2VkLCBzbyB5b3UgY291bGQgZWFzaWx5IGFkZCBtb3JlIHRlc3QgY2xhc3NlcyBpbiB0aGUgZnV0dXJlIGp1c3QKLWJ5IG5hbWluZyB0aGVtIDx0dD4qVGVzdC5qYXZhPC90dD4uIFRoaXMgaXMgYSBjb21tb24gbmFtaW5nIHNjaGVtZS48L3A+Ci0KLTxwPkFmdGVyIGEgPHR0IGNsYXNzPSJjb2RlIj5hbnQganVuaXQ8L3R0PiB5b3UnbGwgZ2V0OjwvcD4KKzxwPkFmdGVyIGEgPGtiZD5hbnQganVuaXQ8L2tiZD4geW91J2xsIGdldDo8L3A+CiAKIDxwcmUgY2xhc3M9Im91dHB1dCI+CiAuLi4KIGp1bml0OgotICAgIFtqdW5pdF0gUnVubmluZyBIZWxsb1dvcmxkVGVzdAotICAgIFtqdW5pdF0gVGVzdHMgcnVuOiAyLCBGYWlsdXJlczogMSwgRXJyb3JzOiAwLCBUaW1lIGVsYXBzZWQ6IDAsMDEgc2VjCi0gICAgW2p1bml0XSBUZXN0IEhlbGxvV29ybGRUZXN0IEZBSUxFRAorICAgIFtqdW5pdF0gUnVubmluZyBvYXRhLkhlbGxvV29ybGRUZXN0CisgICAgW2p1bml0XSBUZXN0cyBydW46IDIsIEZhaWx1cmVzOiAxLCBFcnJvcnM6IDAsIFNraXBwZWQ6IDAsIFRpbWUgZWxhcHNlZDogMCwwMSBzZWMKKyAgICBbanVuaXRdIFRlc3Qgb2F0YS5IZWxsb1dvcmxkVGVzdCBGQUlMRUQKIAogQlVJTEQgU1VDQ0VTU0ZVTAotLi4uCi08L3ByZT4KKy4uLjwvcHJlPgogCi08cD5XZSBjYW4gYWxzbyBwcm9kdWNlIGEgcmVwb3J0LiBTb21ldGhpbmcgdGhhdCB5b3UgKGFuZCBvdGhlcikgY291bGQgcmVhZCBhZnRlciBjbG9zaW5nIHRoZSBzaGVsbCAuLi4uIAotVGhlcmUgYXJlIHR3byBzdGVwczogMS4gbGV0ICZsdDtqdW5pdCZndDsgbG9nIHRoZSBpbmZvcm1hdGlvbiBhbmQgMi4gY29udmVydCB0aGVzZSB0byBzb21ldGhpbmcgcmVhZGFibGUgKGJyb3dzYWJsZSkuPHA+Cis8cD5XZSBjYW4gYWxzbyBwcm9kdWNlIGEgcmVwb3J0LiBTb21ldGhpbmcgdGhhdCB5b3UgKGFuZCBvdGhlcnMpIGNvdWxkIHJlYWQgYWZ0ZXIgY2xvc2luZyB0aGUgc2hlbGwgLi4uICBUaGVyZSBhcmUgdHdvCitzdGVwczogMS4gbGV0IDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIDIuIGNvbnZlcnQgdGhlc2UgbG9nIGZpbGVzIHRvIHNvbWV0aGluZyByZWFkYWJsZQorKGJyb3dzYWJsZSkuPHA+CiAKLTxwcmUgY2xhc3M9ImNvZGUiPgorPHByZT4KICAgICAuLi4KICAgICA8Yj4mbHQ7cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgIHZhbHVlPSIke2J1aWxkLmRpcn0vanVuaXRyZXBvcnQiLyZndDs8L2I+CiAgICAgLi4uCkBAIC00NzYsNDUgKzQ1MSwzOCBAQAogICAgICAgICAgICAgICAgICZsdDtwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLyZndDsKICAgICAgICAgICAgICAgICAmbHQ7cGF0aCByZWZpZD0iYXBwbGljYXRpb24iLyZndDsKICAgICAgICAgICAgICZsdDsvY2xhc3NwYXRoJmd0OwotICAgICAgICAgICAgCisKICAgICAgICAgICAgIDxiPiZsdDtmb3JtYXR0ZXIgdHlwZT0ieG1sIi8mZ3Q7PC9iPgotICAgICAgICAgICAgCisKICAgICAgICAgICAgICZsdDtiYXRjaHRlc3QgZm9yaz0ieWVzIiA8Yj50b2Rpcj0iJHtyZXBvcnQuZGlyfSI8L2I+Jmd0OwotICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IipUZXN0LmphdmEiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8mZ3Q7CiAgICAgICAgICAgICAmbHQ7L2JhdGNodGVzdCZndDsKICAgICAgICAgJmx0Oy9qdW5pdCZndDsKICAgICAmbHQ7L3RhcmdldCZndDsKLSAgICAKKwogICAgIDxiPiZsdDt0YXJnZXQgbmFtZT0ianVuaXRyZXBvcnQiJmd0OwogICAgICAgICAmbHQ7anVuaXRyZXBvcnQgdG9kaXI9IiR7cmVwb3J0LmRpcn0iJmd0OwogICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke3JlcG9ydC5kaXJ9IiBpbmNsdWRlcz0iVEVTVC0qLnhtbCIvJmd0OwogICAgICAgICAgICAgJmx0O3JlcG9ydCB0b2Rpcj0iJHtyZXBvcnQuZGlyfSIvJmd0OwogICAgICAgICAmbHQ7L2p1bml0cmVwb3J0Jmd0OwotICAgICZsdDsvdGFyZ2V0Jmd0OzwvYj4KLTwvcHJlPgorICAgICZsdDsvdGFyZ2V0Jmd0OzwvYj48L3ByZT4KIAotPHA+QmVjYXVzZSB3ZSB3b3VsZCBwcm9kdWNlIGEgbG90IG9mIGZpbGVzIGFuZCB0aGVzZSBmaWxlcyB3b3VsZCBiZSB3cml0dGVuIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBieSBkZWZhdWx0LAotd2UgZGVmaW5lIGEgcmVwb3J0IGRpcmVjdG9yeSwgY3JlYXRlIGl0IGJlZm9yZSBydW5uaW5nIHRoZSA8dHQ+anVuaXQ8L3R0PiBhbmQgcmVkaXJlY3QgdGhlIGxvZ2dpbmcgdG8gaXQuIFRoZSBsb2cgZm9ybWF0Ci1pcyBYTUwgc28gPHR0Pmp1bml0cmVwb3J0PC90dD4gY291bGQgcGFyc2UgaXQuIEluIGEgc2Vjb25kIHRhcmdldCA8dHQ+anVuaXRyZXBvcnQ8L3R0PiBzaG91bGQgY3JlYXRlIGEgYnJvd3NhYmxlIAotSFRNTC1yZXBvcnQgZm9yIGFsbCBnZW5lcmF0ZWQgeG1sLWxvZyBmaWxlcyBpbiB0aGUgcmVwb3J0IGRpcmVjdG9yeS4gTm93IHlvdSBjYW4gb3BlbiB0aGUgJHtyZXBvcnQuZGlyfVxpbmRleC5odG1sIGFuZAotc2VlIHRoZSByZXN1bHQgKGxvb2tzIHNvbWV0aGluZyBsaWtlIEphdmFEb2MpLjxicj4KLVBlcnNvbmFsbHkgSSB1c2UgdHdvIGRpZmZlcmVudCB0YXJnZXRzIGZvciBqdW5pdCBhbmQganVuaXRyZXBvcnQuIEdlbmVyYXRpbmcgdGhlIEhUTUwgcmVwb3J0IG5lZWRzIHNvbWUgdGltZSBhbmQgeW91IGRvbnQKLW5lZWQgdGhlIEhUTUwgcmVwb3J0IGp1c3QgZm9yIHRlc3RpbmcsIGUuZy4gaWYgeW91IGFyZSBmaXhpbmcgYW4gZXJyb3Igb3IgYSBpbnRlZ3JhdGlvbiBzZXJ2ZXIgaXMgZG9pbmcgYSBqb2IuCi08L3A+Cis8cD5CZWNhdXNlIHdlIHdvdWxkIHByb2R1Y2UgYSBsb3Qgb2YgZmlsZXMgYW5kIHRoZXNlIGZpbGVzIHdvdWxkIGJlIHdyaXR0ZW4gdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGJ5IGRlZmF1bHQsIHdlCitkZWZpbmUgYSByZXBvcnQgZGlyZWN0b3J5LCBjcmVhdGUgaXQgYmVmb3JlIHJ1bm5pbmcgdGhlIDxxPmp1bml0PC9xPiBhbmQgcmVkaXJlY3QgdGhlIGxvZ2dpbmcgdG8gaXQuIFRoZSBsb2cgZm9ybWF0IGlzCitYTUwgc28gPHE+anVuaXRyZXBvcnQ8L3E+IGNvdWxkIHBhcnNlIGl0LiBJbiBhIHNlY29uZCB0YXJnZXQgPHE+anVuaXRyZXBvcnQ8L3E+IHNob3VsZCBjcmVhdGUgYSBicm93c2FibGUgSFRNTCByZXBvcnQKK2ZvciBhbGwgZ2VuZXJhdGVkIFhNTCBsb2cgZmlsZXMgaW4gdGhlIHJlcG9ydCBkaXJlY3RvcnkuIE5vdyB5b3UgY2FuIG9wZW4gdGhlIDxzYW1wPiR7cmVwb3J0LmRpcn1caW5kZXguaHRtbDwvc2FtcD4gYW5kCitzZWUgdGhlIHJlc3VsdCAobG9va3Mgc29tZXRoaW5nIGxpa2UgSmF2YURvYykuPGJyLz4gIFBlcnNvbmFsbHkgSSB1c2UgdHdvIGRpZmZlcmVudCB0YXJnZXRzCitmb3IgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtqdW5pdHJlcG9ydCZndDs8L2NvZGU+LiBHZW5lcmF0aW5nIHRoZSBIVE1MIHJlcG9ydCBuZWVkcyBzb21lIHRpbWUgYW5kIHlvdQorZG9uJ3QgbmVlZCB0aGUgSFRNTCByZXBvcnQganVzdCBmb3IgdGVzdGluZywgZS5nLiBpZiB5b3UgYXJlIGZpeGluZyBhbiBlcnJvciBvciBhIGludGVncmF0aW9uIHNlcnZlciBpcyBkb2luZyBhIGpvYi48L3A+CiAKLQotCi0KLTxhIG5hbWU9InJlc291cmNlcyI+PC9hPgotPGgyPlJlc291cmNlczwvaDI+Ci08cHJlPgotICAgIFsxXSA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9sb2dnaW5nL2xvZzRqLzEuMi4xMy9sb2dnaW5nLWxvZzRqLTEuMi4xMy56aXAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L2xvZ2dpbmcvbG9nNGovMS4yLjEzL2xvZ2dpbmctbG9nNGotMS4yLjEzLnppcDwvYT4KLSAgICBbMl0gPGEgaHJlZj0iaHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai9kb2NzL21hbnVhbC5odG1sIj5odHRwOi8vbG9nZ2luZy5hcGFjaGUub3JnL2xvZzRqL2RvY3MvbWFudWFsLmh0bWw8L2E+Ci0gICAgWzNdIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnL2luZGV4Lmh0bSI+aHR0cDovL3d3dy5qdW5pdC5vcmcvaW5kZXguaHRtPC9hPgotPC9wcmU+Ci0KLQotCis8aDIgaWQ9InJlc291cmNlcyI+UmVzb3VyY2VzPC9oMj4KKzxvbCBjbGFzcz0icmVmcyI+CisgIDxsaT48YSBocmVmPSJodHRwczovL2FyY2hpdmUuYXBhY2hlLm9yZy9kaXN0L2xvZ2dpbmcvbG9nNGovMS4yLjE3L2xvZzRqLTEuMi4xNy56aXAiCisgICAgICAgICB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvbG9nZ2luZy9sb2c0ai8xLjIuMTcvbG9nNGotMS4yLjE3LnppcDwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovMS4yL21hbnVhbC5odG1sIgorICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai8xLjIvbWFudWFsLmh0bWw8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vanVuaXQub3JnL2p1bml0NCIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2p1bml0Lm9yZy9qdW5pdDQ8L2E+PC9saT4KKzwvb2w+CiAKIDwvYm9keT4KIDwvaHRtbD4KZGlmZiAtLWdpdCBhL21hbnVhbC90dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLmh0bWwgYi9tYW51YWwvdHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy5odG1sCmluZGV4IDNhMzZlN2UuLmI5ODkyZmYgMTAwNjQ0Ci0tLSBhL21hbnVhbC90dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLmh0bWwKKysrIGIvbWFudWFsL3R1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE1LDcgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiPgogICA8dGl0bGU+VHV0b3JpYWw6IFRhc2tzIHVzaW5nIFByb3BlcnRpZXMsIEZpbGVzZXRzICZhbXA7IFBhdGhzPC90aXRsZT4KQEAgLTIyLDEyICsyMywxMiBAQAogPGJvZHk+CiA8aDE+VHV0b3JpYWw6IFRhc2tzIHVzaW5nIFByb3BlcnRpZXMsIEZpbGVzZXRzICZhbXA7IFBhdGhzPC9oMT4KIAotPHA+QWZ0ZXIgcmVhZGluZyB0aGUgdHV0b3JpYWwgYWJvdXQgPGEgaHJlZj0idHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sIj53cml0aW5nCi10YXNrcyBbMV08L2E+IHRoaXMgdHV0b3JpYWwgZXhwbGFpbnMgaG93IHRvIGdldCBhbmQgc2V0IHByb3BlcnRpZXMgYW5kIGhvdyB0byB1c2UKLW5lc3RlZCBmaWxlc2V0cyBhbmQgcGF0aHMuIEZpbmFsbHkgaXQgZXhwbGFpbnMgaG93IHRvIGNvbnRyaWJ1dGUgdGFza3MgdG8gQXBhY2hlIEFudC48L3A+Cis8cD5BZnRlciByZWFkaW5nIHRoZSB0dXRvcmlhbCBhYm91dCA8YSBocmVmPSJ0dXRvcmlhbC13cml0aW5nLXRhc2tzLmh0bWwiPndyaXRpbmcgdGFza3MgWzFdPC9hPiB0aGlzIHR1dG9yaWFsIGV4cGxhaW5zCitob3cgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcyBhbmQgaG93IHRvIHVzZSBuZXN0ZWQgZmlsZXNldHMgYW5kIHBhdGhzLiBGaW5hbGx5IGl0IGV4cGxhaW5zIGhvdyB0byBjb250cmlidXRlIHRhc2tzIHRvCitBcGFjaGUgQW50LjwvcD4KIAogPGgyPkNvbnRlbnQ8L2gyPgotPHA+PHVsPgorPHVsPgogPGxpPjxhIGhyZWY9IiNnb2FsIj5UaGUgZ29hbDwvYT48L2xpPgogPGxpPjxhIGhyZWY9IiNidWlsZGVudmlyb25tZW50Ij5CdWlsZCBlbnZpcm9ubWVudDwvYT48L2xpPgogPGxpPjxhIGhyZWY9IiNwcm9wZXJ0eWFjY2VzcyI+UHJvcGVydHkgYWNjZXNzPC9hPjwvbGk+CkBAIC0zNywxOSArMzgsMTcgQEAKIDxsaT48YSBocmVmPSIjZG9jdW1lbnRhdGlvbiI+RG9jdW1lbnRhdGlvbjwvYT48L2xpPgogPGxpPjxhIGhyZWY9IiNjb250cmlidXRlIj5Db250cmlidXRlIHRoZSBuZXcgdGFzazwvYT48L2xpPgogPGxpPjxhIGhyZWY9IiNyZXNvdXJjZXMiPlJlc291cmNlczwvYT48L2xpPgotPC91bD48L3A+Cis8L3VsPgogCis8aDIgaWQ9ImdvYWwiPlRoZSBnb2FsPC9oMj4KKzxwPlRoZSBnb2FsIGlzIHRvIHdyaXRlIGEgdGFzaywgd2hpY2ggc2VhcmNoZXMgaW4gYSBwYXRoIGZvciBhIGZpbGUgYW5kIHNhdmVzIHRoZSBsb2NhdGlvbiBvZiB0aGF0IGZpbGUgaW4gYQorcHJvcGVydHkuPC9wPgogCi08aDI+PGEgbmFtZT0iZ29hbCI+VGhlIGdvYWw8L2E+PC9oMj4KLTxwPlRoZSBnb2FsIGlzIHRvIHdyaXRlIGEgdGFzaywgd2hpY2ggc2VhcmNocyBpbiBhIHBhdGggZm9yIGEgZmlsZSBhbmQgc2F2ZXMgdGhlCi1sb2NhdGlvbiBvZiB0aGF0IGZpbGUgaW4gYSBwcm9wZXJ0eS48L3A+Ci0KLQotPGgyPjxhIG5hbWU9ImJ1aWxkZW52aXJvbm1lbnQiPkJ1aWxkIGVudmlyb25tZW50PC9hPjwvaDI+Ci08cD5XZSBjYW4gdXNlIHRoZSBidWlsZGZpbGUgZnJvbSB0aGUgb3RoZXIgdHV0b3JpYWwgYW5kIG1vZGlmeSBpdCBhIGxpdHRsZSBiaXQuCi1UaGF0J3MgdGhlIGFkdmFudGFnZSBvZiB1c2luZyBwcm9wZXJ0aWVzIC0gd2UgY2FuIHJldXNlIG5lYXJseSB0aGUgd2hvbGUgc2NyaXB0LiA6LSk8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPyZndDsKKzxoMiBpZD0iYnVpbGRlbnZpcm9ubWVudCI+QnVpbGQgZW52aXJvbm1lbnQ8L2gyPgorPHA+V2UgY2FuIHVzZSB0aGUgYnVpbGRmaWxlIGZyb20gdGhlIG90aGVyIHR1dG9yaWFsIGFuZCBtb2RpZnkgaXQgYSBsaXR0bGUgYml0LiAgVGhhdCdzIHRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcKK3Byb3BlcnRpZXMmbWRhc2g7d2UgY2FuIHJldXNlIG5lYXJseSB0aGUgd2hvbGUgc2NyaXB0LiA6LSk8L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKICZsdDtwcm9qZWN0IG5hbWU9IjxiPkZpbmRUYXNrPC9iPiIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdCImZ3Q7CiAgICAgLi4uCiAgICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UuaW5pdCIgZGVzY3JpcHRpb249IlRhc2tkZWYncyB0aGUgPGI+RmluZDwvYj4tVGFzayIgZGVwZW5kcz0iamFyIiZndDsKQEAgLTU4LDMxICs1NywyOCBAQAogCiAgICAgPGI+Jmx0OyEtLSB0aGUgb3RoZXIgdXNlLiogdGFyZ2V0cyBhcmUgZGVsZXRlZCAtLSZndDs8L2I+CiAgICAgLi4uCi0mbHQ7L3Byb2plY3QmZ3Q7Ci08L3ByZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIAotPHA+VGhlIGJ1aWxkZmlsZSBpcyBpbiB0aGUgYXJjaGl2ZSA8YSBocmVmPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCI+Ci10dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCBbMl08L2E+IGluIDx0dD4vYnVpbGQueG1sLjAxLXByb3BlcnR5YWNjZXNzPC90dD4KLShmdXR1cmUgdmVyc2lvbiBzYXZlZCBhcyAqLjAyLi4uLCBmaW5hbCB2ZXJzaW9uIGFzIGJ1aWxkLnhtbDsgc2FtZSBmb3Igc291cmNlcykuPC9wPgorPHA+VGhlIGJ1aWxkZmlsZSBpcyBpbiB0aGUKK2FyY2hpdmUgPGEgaHJlZj0idHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy56aXAiPnR1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuemlwIFsyXTwvYT4KK2luIDxzYW1wPi9idWlsZC54bWwuMDEtcHJvcGVydHlhY2Nlc3M8L3NhbXA+IChmdXR1cmUgdmVyc2lvbiBzYXZlZCBhcyAqLjAyLi4uLCBmaW5hbCB2ZXJzaW9uIGFzIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD47CitzYW1lIGZvciBzb3VyY2VzKS48L3A+CiAKLQotPGgyPjxhIG5hbWU9InByb3BlcnR5YWNjZXNzIj5Qcm9wZXJ0eSBhY2Nlc3M8L2E+PC9oMj4KLTxwPk91ciBmaXJzdCBzdGVwIGlzIHRvIHNldCBhIHByb3BlcnR5IHRvIGEgdmFsdWUgYW5kIHByaW50IHRoZSB2YWx1ZSBvZiB0aGF0IHByb3BlcnR5LgotU28gb3VyIHNjZW5hcmlvIHdvdWxkIGJlCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxoMiBpZD0icHJvcGVydHlhY2Nlc3MiPlByb3BlcnR5IGFjY2VzczwvaDI+Cis8cD5PdXIgZmlyc3Qgc3RlcCBpcyB0byBzZXQgYSBwcm9wZXJ0eSB0byBhIHZhbHVlIGFuZCBwcmludCB0aGUgdmFsdWUgb2YgdGhhdCBwcm9wZXJ0eS4gIFNvCitvdXIgc2NlbmFyaW8gd291bGQgYmU8L3A+Cis8cHJlPgogICAgICZsdDtmaW5kIHByb3BlcnR5PSJ0ZXN0IiB2YWx1ZT0idGVzdC12YWx1ZSIvJmd0OwotICAgICZsdDtmaW5kIHByaW50PSJ0ZXN0Ii8mZ3Q7Ci08L3ByZT4KLW9rLCBjYW4gYmUgcmV3cml0dGVuIHdpdGggdGhlIGNvcmUgdGFza3MKLTxwcmUgY2xhc3M9ImNvZGUiPgorICAgICZsdDtmaW5kIHByaW50PSJ0ZXN0Ii8mZ3Q7PC9wcmU+Cis8cD5PaywgaXQgY2FuIGJlIHJld3JpdHRlbiB3aXRoIHRoZSBjb3JlIHRhc2tzPC9wPgorPHByZT4KICAgICAmbHQ7cHJvcGVydHkgbmFtZT0idGVzdCIgdmFsdWU9InRlc3QtdmFsdWUiLyZndDsKLSAgICAmbHQ7ZWNobyBtZXNzYWdlPSIke3Rlc3R9Ii8mZ3Q7Ci08L3ByZT4KLWJ1dCBJIGhhdmUgdG8gc3RhcnQgb24ga25vd24gZ3JvdW5kIDotKTwvcD4KLTxwPlNvIHdoYXQgdG8gZG8/IEhhbmRsaW5nIHRocmVlIGF0dHJpYnV0ZXMgKHByb3BlcnR5LCB2YWx1ZSwgcHJpbnQpIGFuZCBhbiBleGVjdXRlIG1ldGhvZC4KLUJlY2F1c2UgdGhpcyBpcyBvbmx5IGFuIGludHJvZHVjdGlvbiBleGFtcGxlIEkgZG9uJ3QgZG8gbXVjaCBjaGVja2luZzoKKyAgICAmbHQ7ZWNobyBtZXNzYWdlPSIke3Rlc3R9Ii8mZ3Q7PC9wcmU+Cis8cD5idXQgSSBoYXZlIHRvIHN0YXJ0IG9uIGtub3duIGdyb3VuZCA6LSk8L3A+Cis8cD5TbyB3aGF0IHRvIGRvPyBIYW5kbGluZyB0aHJlZSBhdHRyaWJ1dGVzICg8dmFyPnByb3BlcnR5PC92YXI+LCA8dmFyPnZhbHVlPC92YXI+LCA8dmFyPnByaW50PC92YXI+KSBhbmQgYW4gZXhlY3V0ZQorbWV0aG9kLiAgQmVjYXVzZSB0aGlzIGlzIG9ubHkgYW4gaW50cm9kdWN0aW9uIGV4YW1wbGUgSSBkb24ndCBkbyBtdWNoIGNoZWNraW5nOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgRmluZCBleHRlbmRzIFRhc2sgewpAQCAtMTA3LDQ3ICsxMDMsNDAgQEAKICAgICAgICAgICAgIDxiPmdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpPC9iPjsKICAgICAgICAgfQogICAgIH0KLX0KLTwvcHJlPgorfTwvcHJlPgogCi1BcyBzYWlkIGluIHRoZSBvdGhlciB0dXRvcmlhbCwgdGhlIHByb3BlcnR5IGFjY2VzcyBpcyBkb25lIHZpYSBQcm9qZWN0IGluc3RhbmNlLgotV2UgZ2V0IHRoaXMgaW5zdGFuY2UgdmlhIHRoZSBwdWJsaWMgPHR0PmdldFByb2plY3QoKTwvdHQ+IG1ldGhvZCB3aGljaCB3ZSBpbmhlcml0IGZyb20KLTx0dD5UYXNrPC90dD4gKG1vcmUgcHJlY2lzZSBmcm9tIFByb2plY3RDb21wb25lbnQpLiBSZWFkaW5nIGEgcHJvcGVydHkgaXMgZG9uZSB2aWEKLTx0dD5nZXRQcm9wZXJ0eSg8aT5wcm9wZXJ0eW5hbWU8L2k+KTwvdHQ+ICh2ZXJ5IHNpbXBsZSwgaXNuJ3QgaXQ/KS4gVGhpcyBwcm9wZXJ0eSByZXR1cm5zCi10aGUgdmFsdWUgYXMgU3RyaW5nIG9yIDxpPm51bGw8L2k+IGlmIG5vdCBzZXQuPGJyPgotU2V0dGluZyBhIHByb3BlcnR5IGlzIC4uLiBub3QgcmVhbGx5IGRpZmZpY3VsdCwgYnV0IHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2V0dGVyLiBZb3UgY2FuCi11c2UgdGhlIDx0dD5zZXRQcm9wZXJ0eSgpPC90dD4gbWV0aG9kIHdoaWNoIHdpbGwgZG8gdGhlIGpvYiBsaWtlIGV4cGVjdGVkLiBCdXQgdGhlcmUgaXMKLWEgZ29sZGVuIHJ1bGUgaW4gQW50OiA8aT5wcm9wZXJ0aWVzIGFyZSBpbW11dGFibGU8L2k+LiBBbmQgdGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvcGVydHkKLXRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgLSB3aGV0aGVyIGl0IGhhcyBhIHZhbHVlIGJlZm9yZSB0aGF0IG9yIG5vdC4gU28gd2UgdXNlIGFub3RoZXIKLXdheS4gPHR0PnNldE5ld1Byb3BlcnR5KCk8L3R0PiBzZXRzIHRoZSBwcm9wZXJ0eSBvbmx5IGlmIHRoZXJlIGlzIG5vIHByb3BlcnR5IHdpdGggdGhhdAotbmFtZS4gT3RoZXJ3aXNlIGEgbWVzc2FnZSBpcyBsb2dnZWQuPC9wPgorPHA+QXMgc2FpZCBpbiB0aGUgb3RoZXIgdHV0b3JpYWwsIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgaXMgZG9uZSB2aWEgPGNvZGUgY2xhc3M9ImNvZGUiPlByb2plY3Q8L2NvZGU+IGluc3RhbmNlLiAgV2UgZ2V0Cit0aGlzIGluc3RhbmNlIHZpYSB0aGUgcHVibGljIDxjb2RlIGNsYXNzPSJjb2RlIj5nZXRQcm9qZWN0KCk8L2NvZGU+IG1ldGhvZCB3aGljaCB3ZSBpbmhlcml0Citmcm9tIDxjb2RlIGNsYXNzPSJjb2RlIj5UYXNrPC9jb2RlPiAobW9yZSBwcmVjaXNlbHkgZnJvbSA8Y29kZSBjbGFzcz0iY29kZSI+UHJvamVjdENvbXBvbmVudDwvY29kZT4pLiBSZWFkaW5nIGEgcHJvcGVydHkKK2lzIGRvbmUgdmlhIDxjb2RlIGNsYXNzPSJjb2RlIj5nZXRQcm9wZXJ0eSg8aT5wcm9wZXJ0eW5hbWU8L2k+KTwvY29kZT4gKHZlcnkgc2ltcGxlLCBpc24ndCBpdD8pLiBUaGlzIHByb3BlcnR5IHJldHVybnMKK3RoZSB2YWx1ZSBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBzZXQuPGJyLz4gIFNldHRpbmcgYSBwcm9wZXJ0eSBpcyAuLi4gbm90IHJlYWxseSBkaWZmaWN1bHQsCitidXQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBzZXR0ZXIuIFlvdSBjYW4gdXNlIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+c2V0UHJvcGVydHkoKTwvY29kZT4gbWV0aG9kIHdoaWNoIHdpbGwgZG8gdGhlIGpvYgorYXMgZXhwZWN0ZWQuIEJ1dCB0aGVyZSBpcyBhIGdvbGRlbiBydWxlIGluIEFudDogPGVtPnByb3BlcnRpZXMgYXJlIGltbXV0YWJsZTwvZW0+LiBBbmQgdGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvcGVydHkgdG8KK3RoZSBzcGVjaWZpZWQgdmFsdWUmbWRhc2g7d2hldGhlciBpdCBoYXMgYSB2YWx1ZSBiZWZvcmUgdGhhdCBvciBub3QuIFNvIHdlIHVzZSBhbm90aGVyCit3YXkuIDxjb2RlIGNsYXNzPSJjb2RlIj5zZXROZXdQcm9wZXJ0eSgpPC9jb2RlPiBzZXRzIHRoZSBwcm9wZXJ0eSBvbmx5IGlmIHRoZXJlIGlzIG5vIHByb3BlcnR5IHdpdGggdGhhdCBuYW1lLiBPdGhlcndpc2UKK2EgbWVzc2FnZSBpcyBsb2dnZWQuPC9wPgogCi08cD48aT4oYnkgdGhlIHdheTogYSBzaG9ydCB3b3JkIHRvIGFudHMgIm5hbWVzcGFjZXMiIChkb24ndAotYmUgY29uZnVzZWQgd2l0aCB4bWwgbmFtZXNwYWNlczoKLWFuIDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gY3JlYXRlcyBhIG5ldyBzcGFjZSBmb3IgcHJvcGVydHkgbmFtZXMuIEFsbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGNhbGxlcgotYXJlIHBhc3NlZCB0byB0aGUgY2FsbGVlLCBidXQgdGhlIGNhbGxlZSBjYW4gc2V0IGl0cyBvd24gcHJvcGVydGllcyB3aXRob3V0IG5vdGljZSBieSB0aGUKLWNhbGxlci4pPC9pPjwvcD4KKzxwPjxlbT4oQnkgdGhlIHdheSwgYSBzaG9ydCBleHBsYW5hdGlvbiBvZiBBbnQncyAibmFtZXNwYWNlcyImbWRhc2g7bm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggWE1MIG5hbWVzcGFjZXM6CithbiA8Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+IGNyZWF0ZXMgYSBuZXcgc3BhY2UgZm9yIHByb3BlcnR5IG5hbWVzLiBBbGwgcHJvcGVydGllcyBmcm9tIHRoZSBjYWxsZXIgYXJlIHBhc3NlZCB0byB0aGUKK2NhbGxlZSwgYnV0IHRoZSBjYWxsZWUgY2FuIHNldCBpdHMgb3duIHByb3BlcnRpZXMgd2l0aG91dCBub3RpY2UgYnkgdGhlIGNhbGxlci4pPC9lbT48L3A+CiAKLTxwPlRoZXJlIGFyZSBzb21lIG90aGVyIHNldHRlciwgdG9vIChidXQgSSBoYXZlbid0IHVzZWQgdGhlbSwgc28gSSBjYW4ndCBzYXkgc29tZXRoaW5nCi10byB0aGVtLCBzb3JyeSA6LSk8L3A+Cis8cD5UaGVyZSBhcmUgc29tZSBvdGhlciBzZXR0ZXJzLCB0b28gKGJ1dCBJIGhhdmVuJ3QgdXNlZCB0aGVtLCBzbyBJIGNhbid0IHNheSBzb21ldGhpbmcgdG8gdGhlbSwgc29ycnkgOi0pPC9wPgogCi08cD5BZnRlciBwdXR0aW5nIG91ciB0d28gbGluZSBleGFtcGxlIGZyb20gYWJvdmUgaW50byBhIHRhcmdldCBuYW1lcyA8dHQ+dXNlLnNpbXBsZTwvdHQ+Ci13ZSBjYW4gY2FsbCB0aGF0IGZyb20gb3VyIHRlc3RjYXNlOgorPHA+QWZ0ZXIgcHV0dGluZyBvdXIgdHdvIGxpbmUgZXhhbXBsZSBmcm9tIGFib3ZlIGludG8gYSB0YXJnZXQgbmFtZXMgPGNvZGU+dXNlLnNpbXBsZTwvY29kZT4gd2UgY2FuIGNhbGwgdGhhdCBmcm9tIG91cgordGVzdCBjYXNlOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIAotCiBwdWJsaWMgY2xhc3MgRmluZFRlc3QgewogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCi0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGNvbmZpZ3VyZVByb2plY3QoImJ1aWxkLnhtbCIpOwpAQCAtMTU1LDM4ICsxNDQsMzIgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZSgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVzZVNpbWdsZSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlU2ltcGxlIik7CiAgICAgICAgIDxiPkFzc2VydC5hc3NlcnRFcXVhbHMoInRlc3QtdmFsdWUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOzwvYj4KICAgICB9Ci19Ci08L3ByZT4KK308L3ByZT4KIAotYW5kIGFsbCB3b3JrcyBmaW5lLjwvcD4KKzxwPmFuZCBhbGwgd29ya3MgZmluZS48L3A+CiAKLQotCi08aDI+PGEgbmFtZT0iZmlsZXNldHMiPlVzaW5nIGZpbGVzZXRzPC9hPjwvaDI+Ci08cD5BbnQgcHJvdmlkZXMgYSBjb21tb24gd2F5IG9mIGJ1bmRsaW5nIGZpbGVzOiB0aGUgZmlsZXNldC4gQmVjYXVzZSB5b3UgYXJlIHJlYWRpbmcKLXRoaXMgdHV0b3JpYWwgSSB0aGluayB5b3Uga25vdyB0aGVtIGFuZCBJIGRvbid0IGhhdmUgdG8gc3BlbmQgbW9yZSBleHBsYW5hdGlvbnMgYWJvdXQKLXRoZWlyIHVzYWdlIGluIGJ1aWxkZmlsZXMuIE91ciBnb2FsIGlzIHRvIHNlYXJjaCBhIGZpbGUgaW4gcGF0aC4gQW5kIG9uIHRoaXMgc3RlcCB0aGUKLXBhdGggaXMgc2ltcGx5IGEgZmlsZXNldCAob3IgbW9yZSBwcmVjaXNlOiBhIGNvbGxlY3Rpb24gb2YgZmlsZXNldHMpLiBTbyBvdXIgdXNhZ2UKLXdvdWxkIGJlCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxoMiBpZD0iZmlsZXNldHMiPlVzaW5nIGZpbGVzZXRzPC9oMj4KKzxwPkFudCBwcm92aWRlcyBhIGNvbW1vbiB3YXkgb2YgYnVuZGxpbmcgZmlsZXM6IHRoZSBmaWxlc2V0LiBCZWNhdXNlIHlvdSBhcmUgcmVhZGluZyB0aGlzIHR1dG9yaWFsIEkgdGhpbmsgeW91IGtub3cgdGhlbQorYW5kIEkgZG9uJ3QgaGF2ZSB0byBzcGVuZCBtb3JlIGV4cGxhbmF0aW9ucyBhYm91dCB0aGVpciB1c2FnZSBpbiBidWlsZGZpbGVzLiBPdXIgZ29hbCBpcyB0byBzZWFyY2ggZm9yIGEgZmlsZSBpbgorcGF0aC4gQW5kIGluIHRoaXMgc3RlcCB0aGUgcGF0aCBpcyBzaW1wbHkgYSBmaWxlc2V0IChvciBtb3JlIHByZWNpc2U6IGEgY29sbGVjdGlvbiBvZiBmaWxlc2V0cykuIFNvIG91ciB1c2FnZSB3b3VsZAorYmU8L3A+Cis8cHJlPgogICAgICZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIiZndDsKICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSIke2FudC5ob21lfSIgaW5jbHVkZXM9IioqLyouamFyIi8mZ3Q7Ci0gICAgJmx0Oy9maW5kJmd0OwotPC9wcmU+Ci08L3A+CisgICAgJmx0Oy9maW5kJmd0OzwvcHJlPgogCi08cD5XaGF0IGRvIHdlIG5lZWQ/IEEgdGFzayB3aXRoIHR3byBhdHRyaWJ1dGVzIChmaWxlLCBsb2NhdGlvbikgYW5kIG5lc3RlZAotZmlsZXNldHMuIEJlY2F1c2Ugd2UgaGFkIGF0dHJpYnV0ZSBoYW5kbGluZyBhbHJlYWR5IGV4cGxhaW5lZCBpbiB0aGUgZXhhbXBsZSBhYm92ZSBhbmQgdGhlCi1oYW5kbGluZyBvZiBuZXN0ZWQgZWxlbWVudHMgaXMgZGVzY3JpYmVkIGluIHRoZSBvdGhlciB0dXRvcmlhbCB0aGUgY29kZSBzaG91bGQgYmUgdmVyeSBlYXN5OgotPHByZSBjbGFzcz0iY29kZSI+Cis8cD5XaGF0IGRvIHdlIG5lZWQ/IEEgdGFzayB3aXRoIHR3byBhdHRyaWJ1dGVzICg8dmFyPmZpbGU8L3Zhcj4sIDx2YXI+bG9jYXRpb248L3Zhcj4pIGFuZCBuZXN0ZWQgZmlsZXNldHMuIEJlY2F1c2Ugd2UKK2hhZCBhdHRyaWJ1dGUgaGFuZGxpbmcgYWxyZWFkeSBleHBsYWluZWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUgYW5kIHRoZSBoYW5kbGluZyBvZiBuZXN0ZWQgZWxlbWVudHMgaXMgZGVzY3JpYmVkIGluIHRoZQorb3RoZXIgdHV0b3JpYWwsIHRoZSBjb2RlIHNob3VsZCBiZSB2ZXJ5IGVhc3k6PC9wPgorPHByZT4KIHB1YmxpYyBjbGFzcyBGaW5kIGV4dGVuZHMgVGFzayB7CiAKICAgICBwcml2YXRlIFN0cmluZyBmaWxlOwogICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgTGlzdCZsdDtGaWxlU2V0Jmd0OyBmaWxlc2V0cyA9IG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygpOwogCiAgICAgcHVibGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgewogICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwpAQCAtMjAyLDY2ICsxODUsNTcgQEAKIAogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgfQotfQotPC9wcmU+Ci1PayAtIHRoYXQgdGFzayB3b3VsZG4ndCBkbyB2ZXJ5IG11Y2gsIGJ1dCB3ZSBjYW4gdXNlIGl0IGluIHRoZSBkZXNjcmliZWQgbWFubmVyIHdpdGhvdXQKLWZhaWx1cmUuIE9uIG5leHQgc3RlcCB3ZSBoYXZlIHRvIGltcGxlbWVudCB0aGUgZXhlY3V0ZSBtZXRob2QuIEFuZCBiZWZvcmUgdGhhdCB3ZSB3aWxsCi1pbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHRlc3RjYXNlcyAoVEREIC0gdGVzdCBkcml2ZW4gZGV2ZWxvcG1lbnQpLjwvcD4KK308L3ByZT4KKzxwPk9rJm1kYXNoO3RoYXQgdGFzayB3b3VsZG4ndCBkbyB2ZXJ5IG11Y2gsIGJ1dCB3ZSBjYW4gdXNlIGl0IGluIHRoZSBkZXNjcmliZWQgbWFubmVyIHdpdGhvdXQgZmFpbHVyZS4gSW4gdGhlIG5leHQgc3RlcAord2UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIGV4ZWN1dGUgbWV0aG9kLiBBbmQgYmVmb3JlIHRoYXQgd2Ugd2lsbCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIHRlc3QgY2FzZXMgKFRERCZtZGFzaDt0ZXN0Citkcml2ZW4gZGV2ZWxvcG1lbnQpLjwvcD4KIAotPHA+SW4gdGhlIG90aGVyIHR1dG9yaWFsIHdlIGhhdmUgcmV1c2VkIHRoZSBhbHJlYWR5IHdyaXR0ZW4gdGFyZ2V0cyBvZiBvdXIgYnVpbGRmaWxlLgotTm93IHdlIHdpbGwgY29uZmlndXJlIG1vc3Qgb2YgdGhlIHRlc3RjYXNlcyB2aWEgamF2YSBjb2RlIChzb21ldGltZXMgaXQncyBtdWNoIGVhc2llcgotdG8gd3JpdGUgYSB0YXJnZXQgdGhhbiBkb2luZyBpdCB2aWEgamF2YSBjb2RpbmcpLiBXaGF0IGNhbiBiZSB0ZXN0ZWQ/PHVsPgotPGxpPm5vdCB2YWxpZCBjb25maWd1cmVkIHRhc2sgKG1pc3NpbmcgZmlsZSwgbWlzc2luZyBsb2NhdGlvbiwgbWlzc2luZyBmaWxlc2V0KTwvbGk+Cis8cD5JbiB0aGUgb3RoZXIgdHV0b3JpYWwgd2UgaGF2ZSByZXVzZWQgdGhlIGFscmVhZHkgd3JpdHRlbiB0YXJnZXRzIG9mIG91ciBidWlsZGZpbGUuICBOb3cgd2Ugd2lsbCBjb25maWd1cmUgbW9zdCBvZiB0aGUKK3Rlc3QgY2FzZXMgdmlhIEphdmEgY29kZSAoc29tZXRpbWVzIGl0J3MgbXVjaCBlYXNpZXIgdG8gd3JpdGUgYSB0YXJnZXQgdGhhbiBkb2luZyBpdCB2aWEgSmF2YSBjb2RpbmcpLiBXaGF0IGNhbiBiZQordGVzdGVkPzwvcD4KKzx1bD4KKzxsaT5pbnZhbGlkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhc2sgKG1pc3NpbmcgZmlsZSwgbWlzc2luZyBsb2NhdGlvbiwgbWlzc2luZyBmaWxlc2V0KTwvbGk+CiA8bGk+ZG9uJ3QgZmluZCBhIHByZXNlbnQgZmlsZTwvbGk+CiA8bGk+YmVoYXZpb3VyIGlmIGZpbGUgY2FuJ3QgYmUgZm91bmQ8L2xpPgogPC91bD4KLU1heWJlIHlvdSBmaW5kIHNvbWUgbW9yZSB0ZXN0Y2FzZXMuIEJ1dCB0aGlzIGlzIGVub3VnaCBmb3Igbm93Ljxicj4KLUZvciBlYWNoIG9mIHRoZXNlIHBvaW50cyB3ZSBjcmVhdGUgYSA8dHQ+dGVzdFhYPC90dD4gbWV0aG9kLjwvcD4KKzxwPk1heWJlIHlvdSBmaW5kIHNvbWUgbW9yZSB0ZXN0IGNhc2VzLiBCdXQgdGhpcyBpcyBlbm91Z2ggZm9yIG5vdy48YnIvPiAgRm9yIGVhY2ggb2YgdGhlc2UgcG9pbnRzIHdlIGNyZWF0ZQorYSA8Y29kZSBjbGFzcz0iY29kZSI+dGVzdFhYPC9jb2RlPiBtZXRob2QuPC9wPgogCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmU+CiBwdWJsaWMgY2xhc3MgRmluZFRlc3QgewogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdHJpZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICAuLi4gLy8gY29uc3RydWN0b3IsIHNldFVwIGFzIGFib3ZlCiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRmlsZSgpIHsKKyAgICAgICAgdHJpZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdHJpZWQuZXhwZWN0TWVzc2FnZSgiZmlsZSBub3Qgc2V0Iik7CiAgICAgICAgIDxiPkZpbmQgZmluZCA9IG5ldyBGaW5kKCk7PC9iPgotICAgICAgICB0cnkgewotICAgICAgICAgICAgPGI+ZmluZC5leGVjdXRlKCk7PC9iPgotICAgICAgICAgICAgZmFpbCgiTm8gJ25vLWZpbGUnLWV4Y2VwdGlvbiB0aHJvd24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleGNlcHRpb24gZXhwZWN0ZWQKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9ICJmaWxlIG5vdCBzZXQiOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBleGNlcHRpb24gbWVzc2FnZS4iLCBleHBlY3RlZCwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIDxiPmZpbmQuZXhlY3V0ZSgpOzwvYj4KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTG9jYXRpb24oKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImxvY2F0aW9uIG5vdCBzZXQiKTsKICAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKICAgICAgICAgPGI+ZmluZC5zZXRGaWxlKCJhbnQuamFyIik7PC9iPgotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluZC5leGVjdXRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJObyAnbm8tbG9jYXRpb24nLWV4Y2VwdGlvbiB0aHJvd24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAuLi4gLy8gc2ltaWxhciB0byB0ZXN0TWlzc2luZ0ZpbGUoKQotICAgICAgICB9CisgICAgICAgIGZpbmQuZXhlY3V0ZSgpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlc2V0KCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJmaWxlc2V0IG5vdCBzZXQiKTsKICAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKICAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CiAgICAgICAgIGZpbmQuc2V0TG9jYXRpb24oImxvY2F0aW9uLmFudC1qYXIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmQuZXhlY3V0ZSgpOwotICAgICAgICAgICAgZmFpbCgiTm8gJ25vLWZpbGVzZXQnLWV4Y2VwdGlvbiB0aHJvd24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAuLi4gLy8gc2ltaWxhciB0byB0ZXN0TWlzc2luZ0ZpbGUoKQotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3OCw2NSArMjUyLDYwIEBACiAgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZmlsZSBmb3VuZC4iLCByZXN1bHQuZW5kc1dpdGgoImFudC5qYXIiKSk7CiAgICAgfQotfQotPC9wcmU+Cit9PC9wcmU+CiAKLTxwPklmIHdlIHJ1biB0aGlzIHRlc3QgY2xhc3MgYWxsIHRlc3QgY2FzZXMgKGV4Y2VwdCA8aT50ZXN0RmlsZU5vdFByZXNlbnQ8L2k+KSBmYWlsLiBOb3cgd2UKLWNhbiBpbXBsZW1lbnQgb3VyIHRhc2ssIHNvIHRoYXQgdGhlc2UgdGVzdCBjYXNlcyB3aWxsIHBhc3MuPC9wPgorPHA+SWYgd2UgcnVuIHRoaXMgdGVzdCBjbGFzcyBhbGwgdGVzdCBjYXNlcyAoZXhjZXB0IDxjb2RlIGNsYXNzPSJjb2RlIj50ZXN0RmlsZU5vdFByZXNlbnQ8L2NvZGU+KSBmYWlsLiBOb3cgd2UgY2FuCitpbXBsZW1lbnQgb3VyIHRhc2ssIHNvIHRoYXQgdGhlc2UgdGVzdCBjYXNlcyB3aWxsIHBhc3MuPC9wPgogCi08cHJlIGNsYXNzPSJjb2RlIj4KKzxwcmU+CiAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7Ci0gICAgICAgIGlmIChmaWxlPT1udWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgbm90IHNldCIpOwotICAgICAgICBpZiAobG9jYXRpb249PW51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibG9jYXRpb24gbm90IHNldCIpOwotICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpJmx0OzEpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZXNldCBub3Qgc2V0Iik7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSBub3Qgc2V0Iik7CisgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImxvY2F0aW9uIG5vdCBzZXQiKTsKKyAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSAmbHQ7IDEpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZXNldCBub3Qgc2V0Iik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAgdmFsaWRhdGUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQogICAgICAgICBTdHJpbmcgZm91bmRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpdEZTZXRzID0gZmlsZXNldHMuaXRlcmF0b3IoKTsgaXRGU2V0cy5oYXNOZXh0KCk7ICkgeyAgICAgIC8vIDIKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldClpdEZTZXRzLm5leHQoKTsKKyAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogZmlsZXNldHMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgogICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsgICAgICAgICAvLyAzCi0gICAgICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZEZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yKGludCBpPTA7IGkmbHQ7aW5jbHVkZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGluY2x1ZGVkRmlsZXNbaV0ucmVwbGFjZSgnXFwnLCcvJyk7ICAgICAgICAgICAvLyA0Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoIi8iKSsxKTsKLSAgICAgICAgICAgICAgICBpZiAoZm91bmRMb2NhdGlvbj09bnVsbCAmYW1wOyZhbXA7IGZpbGUuZXF1YWxzKGZpbGVuYW1lKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaW5jbHVkZWRGaWxlIDogZHMuZ2V0SW5jbHVkZWRGaWxlcygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlLnJlcGxhY2UoJ1xcJywnLycpOyAgICAgICAgICAgICAgIC8vIDQKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kTG9jYXRpb24gPT0gbnVsbCAmYW1wOyZhbXA7IGZpbGUuZXF1YWxzKGZpbGVuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBGaWxlIGJhc2UgID0gZHMuZ2V0QmFzZWRpcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA1Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZm91bmQgPSBuZXcgRmlsZShiYXNlLCBpbmNsdWRlZEZpbGVzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmb3VuZCA9IG5ldyBGaWxlKGJhc2UsIGluY2x1ZGVkRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kTG9jYXRpb24gPSBmb3VuZC5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZvdW5kTG9jYXRpb24hPW51bGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNgorICAgICAgICBpZiAoZm91bmRMb2NhdGlvbiAhPSBudWxsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA2CiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobG9jYXRpb24sIGZvdW5kTG9jYXRpb24pOwotICAgIH0KLTwvcHJlPgorICAgIH08L3ByZT4KIAotPHA+T24gPGI+Ly8xPC9iPiB3ZSBjaGVjayB0aGUgcHJlcmVxdWlzaXRlcyBmb3Igb3VyIHRhc2suIERvaW5nIHRoYXQgaW4gYSA8dHQ+dmFsaWRhdGU8L3R0Pi1tZXRob2QKLWlzIGEgY29tbW9uIHdheSwgYmVjYXVzZSB3ZSBzZXBhcmF0ZSB0aGUgcHJlcmVxdWlzaXRlcyBmcm9tIHRoZSByZWFsIHdvcmsuIE9uIDxiPi8vMjwvYj4gd2UgaXRlcmF0ZQotb3ZlciBhbGwgbmVzdGVkIGZpbGVzZXRzLiBJZiB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSBtdWx0aXBsZSBmaWxlc2V0cywgdGhlIDx0dD5hZGRGaWxlc2V0KCk8L3R0PgotbWV0aG9kIGhhcyB0byByZWplY3QgdGhlIGZ1cnRoZXIgY2FsbHMuIFdlIGNhbiBnZXQgdGhlIHJlc3VsdCBvZiBhIGZpbGVzZXQgdmlhIGl0cyBEaXJlY3RvcnlTY2FubmVyCi1saWtlIGRvbmUgaW4gPGI+Ly8zPC9iPi4gQWZ0ZXIgdGhhdCB3ZSBjcmVhdGUgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKLXRoZSBmaWxlIHBhdGggKDxiPi8vNDwvYj4sIGNhbiBiZSBkb25lIGluIG90aGVyIHdheXMgb2YgY291cnNlKS4gV2UgaGF2ZSB0byBkbyB0aGUgPHR0PnJlcGxhY2UoKTwvdHQ+LAotYmVjYXVzZSB3ZSB3b3JrIHdpdGggYSBzaW1wbGUgc3RyaW5nIGNvbXBhcmlzb24uIEFudCBpdHNlbGYgaXMgcGxhdGZvcm0gaW5kZXBlbmRlbnQgYW5kIGNhbgotdGhlcmVmb3JlIHJ1biBvbiBmaWxlc3lzdGVtcyB3aXRoIHNsYXNoICgvLCBlLmcuIExpbnV4KSBvciBiYWNrc2xhc2ggKFwsIGUuZy4gV2luZG93cykgYXMKLXBhdGggc2VwYXJhdG9yLiBUaGVyZWZvcmUgd2UgaGF2ZSB0byB1bmlmeSB0aGF0LiBJZiB3ZSBmb3VuZCBvdXIgZmlsZSB3ZSBjcmVhdGUgYW4gYWJzb2x1dGUKLXBhdGggcmVwcmVzZW50YXRpb24gb24gPGI+Ly81PC9iPiwgc28gdGhhdCB3ZSBjYW4gdXNlIHRoYXQgaW5mb3JtYXRpb24gd2l0aG91dCBrbm93aW5nIHRoZSBiYXNlZGlyLgotKFRoaXMgaXMgdmVyeSBpbXBvcnRhbnQgb24gdXNlIHdpdGggbXVsdGlwbGUgZmlsZXNldHMsIGJlY2F1c2UgdGhleSBjYW4gaGF2ZSBkaWZmZXJlbnQgYmFzZWRpcnMKLWFuZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkaXJlY3Rvcnkgc2Nhbm5lciBpcyByZWxhdGl2ZSB0byBpdHMgYmFzZWRpci4pIEZpbmFsbHkgd2Ugc3RvcmUgdGhlCi1sb2NhdGlvbiBvZiB0aGUgZmlsZSBhcyBwcm9wZXJ0eSwgaWYgd2UgaGFkIGZvdW5kIG9uZSAoPGI+Ly82PC9iPikuPC9wPgorPHA+T24gPHN0cm9uZz4vLzE8L3N0cm9uZz4gd2UgY2hlY2sgdGhlIHByZXJlcXVpc2l0ZXMgZm9yIG91ciB0YXNrLiBEb2luZyB0aGF0IGluIGEgPGNvZGUgY2xhc3M9ImNvZGUiPnZhbGlkYXRlKCk8L2NvZGU+CittZXRob2QgaXMgYSBjb21tb24gd2F5LCBiZWNhdXNlIHdlIHNlcGFyYXRlIHRoZSBwcmVyZXF1aXNpdGVzIGZyb20gdGhlIHJlYWwgd29yay4gT24gPHN0cm9uZz4vLzI8L3N0cm9uZz4gd2UgaXRlcmF0ZQorb3ZlciBhbGwgbmVzdGVkIGZpbGVzZXRzLiBJZiB3ZSBkb24ndCB3YW50IHRvIGhhbmRsZSBtdWx0aXBsZSBmaWxlc2V0cywgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5hZGRGaWxlc2V0KCk8L2NvZGU+CittZXRob2QgaGFzIHRvIHJlamVjdCB0aGUgZnVydGhlciBjYWxscy4gV2UgY2FuIGdldCB0aGUgcmVzdWx0IG9mIGEgZmlsZXNldCB2aWEKK2l0cyA8Y29kZSBjbGFzcz0iY29kZSI+RGlyZWN0b3J5U2Nhbm5lcjwvY29kZT4gbGlrZSBkb25lIGluIDxzdHJvbmc+Ly8zPC9zdHJvbmc+LiBBZnRlciB0aGF0IHdlIGNyZWF0ZSBhIHBsYXRmb3JtCitpbmRlcGVuZGVudCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpbGUgcGF0aCAoPHN0cm9uZz4vLzQ8L3N0cm9uZz4sIGNhbiBiZSBkb25lIGluIG90aGVyIHdheXMgb2YgY291cnNlKS4gV2UgaGF2ZQordG8gZG8gdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5yZXBsYWNlKCk8L2NvZGU+LCBiZWNhdXNlIHdlIHdvcmsgd2l0aCBhIHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi4gQW50IGl0c2VsZiBpcyBwbGF0Zm9ybQoraW5kZXBlbmRlbnQgYW5kIGNhbiB0aGVyZWZvcmUgcnVuIG9uIGZpbGVzeXN0ZW1zIHdpdGggc2xhc2ggKDxxPi88L3E+LCBlLmcuIExpbnV4KSBvciBiYWNrc2xhc2ggKDxxPlw8L3E+LCBlLmcuIFdpbmRvd3MpCithcyBwYXRoIHNlcGFyYXRvci4gVGhlcmVmb3JlIHdlIGhhdmUgdG8gdW5pZnkgdGhhdC4gSWYgd2UgZmluZCBvdXIgZmlsZSwgd2UgY3JlYXRlIGFuIGFic29sdXRlIHBhdGggcmVwcmVzZW50YXRpb24KK29uIDxzdHJvbmc+Ly81PC9zdHJvbmc+LCBzbyB0aGF0IHdlIGNhbiB1c2UgdGhhdCBpbmZvcm1hdGlvbiB3aXRob3V0IGtub3dpbmcgdGhlIDx2YXI+YmFzZWRpcjwvdmFyPi4gIChUaGlzIGlzIHZlcnkKK2ltcG9ydGFudCBvbiB1c2Ugd2l0aCBtdWx0aXBsZSBmaWxlc2V0cywgYmVjYXVzZSB0aGV5IGNhbiBoYXZlIGRpZmZlcmVudCA8dmFyPmJhc2VkaXI8L3Zhcj5zIGFuZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQorZGlyZWN0b3J5IHNjYW5uZXIgaXMgcmVsYXRpdmUgdG8gaXRzIDx2YXI+YmFzZWRpcjwvdmFyPi4pICBGaW5hbGx5IHdlIHN0b3JlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSBhcyBwcm9wZXJ0eSwgaWYgd2UKK2hhZCBmb3VuZCBvbmUgKDxzdHJvbmc+Ly82PC9zdHJvbmc+KS48L3A+CiAKLTxwPk9rLCBtdWNoIG1vcmUgZWFzaWVyIGluIHRoaXMgc2ltcGxlIGNhc2Ugd291bGQgYmUgdG8gYWRkIHRoZSA8aT5maWxlPC9pPiBhcyBhZGRpdGlvbmFsCi08aT5pbmNsdWRlPC9pPiBlbGVtZW50IHRvIGFsbCBmaWxlc2V0cy4gQnV0IEkgd2FudGVkIHRvIHNob3cgaG93IHRvIGhhbmRsZSBjb21wbGV4IHNpdHVhdGlvbnMKLXdpdGhvdXQgYmVpbmcgY29tcGxleCA6LSk8L3A+Cis8cD5PaywgbXVjaCBtb3JlIGVhc2llciBpbiB0aGlzIHNpbXBsZSBjYXNlIHdvdWxkIGJlIHRvIGFkZCB0aGUgPHZhcj5maWxlPC92YXI+IGFzIGFkZGl0aW9uYWwgPGNvZGU+aW5jbHVkZTwvY29kZT4KK2VsZW1lbnQgdG8gYWxsIGZpbGVzZXRzLiBCdXQgSSB3YW50ZWQgdG8gc2hvdyBob3cgdG8gaGFuZGxlIGNvbXBsZXggc2l0dWF0aW9ucyB3aXRob3V0IGJlaW5nIGNvbXBsZXggOi0pPC9wPgogCi08cD5UaGUgdGVzdCBjYXNlIHVzZXMgdGhlIGFudCBwcm9wZXJ0eSA8aT5hbnQuaG9tZTwvaT4gYXMgcmVmZXJlbmNlLiBUaGlzIHByb3BlcnR5IGlzIHNldCBieSB0aGUKLTx0dD5MYXVuY2hlcjwvdHQ+IGNsYXNzIHdoaWNoIHN0YXJ0cyBhbnQuIFdlIGNhbiB1c2UgdGhhdCBwcm9wZXJ0eSBpbiBvdXIgYnVpbGRmaWxlcyBhcyBhCi08YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHMiPmJ1aWxkLWluIHByb3BlcnR5IFszXTwvYT4uIEJ1dCBpZiB3ZSBjcmVhdGUgYSBuZXcgYW50Ci1lbnZpcm9ubWVudCB3ZSBoYXZlIHRvIHNldCB0aGF0IHZhbHVlIGZvciBvdXIgb3duLiBBbmQgd2UgdXNlIHRoZSA8Y29kZT4mbHQ7anVuaXQmZ3Q7PC9jb2RlPiB0YXNrIGluIGZvcmstbW9kZS4KLVRoZXJlZm9yZSB3ZSBoYXZlIGRvIG1vZGlmeSBvdXIgYnVpbGRmaWxlOgotPHByZSBjbGFzcz0iY29kZSI+Cis8cD5UaGUgdGVzdCBjYXNlIHVzZXMgdGhlIEFudCBwcm9wZXJ0eSA8Y29kZT5hbnQuaG9tZTwvY29kZT4gYXMgcmVmZXJlbmNlLiBUaGlzIHByb3BlcnR5IGlzIHNldCBieQordGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5MYXVuY2hlcjwvY29kZT4gY2xhc3Mgd2hpY2ggc3RhcnRzIGFudC4gV2UgY2FuIHVzZSB0aGF0IHByb3BlcnR5IGluIG91ciBidWlsZGZpbGVzIGFzCithIDxhIGhyZWY9InByb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyI+YnVpbGQtaW4gcHJvcGVydHkgWzNdPC9hPi4gQnV0IGlmIHdlIGNyZWF0ZSBhIG5ldyBBbnQgZW52aXJvbm1lbnQgd2UgaGF2ZSB0bworc2V0IHRoYXQgdmFsdWUgZm9yIG91ciBvd24uIEFuZCB3ZSB1c2UgdGhlIDxjb2RlPiZsdDtqdW5pdCZndDs8L2NvZGU+IHRhc2sgaW4gPHZhcj5mb3JrPC92YXI+IG1vZGUuICBUaGVyZWZvcmUgd2UgaGF2ZQorZG8gbW9kaWZ5IG91ciBidWlsZGZpbGU6PC9wPgorPHByZT4KICAgICAmbHQ7dGFyZ2V0IG5hbWU9Imp1bml0IiBkZXNjcmlwdGlvbj0iUnVucyB0aGUgdW5pdCB0ZXN0cyIgZGVwZW5kcz0iamFyIiZndDsKICAgICAgICAgJmx0O2RlbGV0ZSBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ii8mZ3Q7CiAgICAgICAgICZsdDtta2RpciAgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIvJmd0OwpAQCAtMzQ4LDExNCArMzE3LDEwOSBAQAogICAgICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLyZndDsKICAgICAgICAgICAgICZsdDsvYmF0Y2h0ZXN0Jmd0OwogICAgICAgICAmbHQ7L2p1bml0Jmd0OwotICAgICZsdDsvdGFyZ2V0Jmd0OwotPC9wcmU+CisgICAgJmx0Oy90YXJnZXQmZ3Q7PC9wcmU+CiAKLQotPGgyPjxhIG5hbWU9InBhdGgiPlVzaW5nIG5lc3RlZCBwYXRoczwvYT48L2gyPgotPHA+QSB0YXNrIHByb3ZpZGluZyBzdXBwb3J0IGZvciBmaWxlc2V0cyBpcyBhIHZlcnkgY29tZm9ydGFibGUgb25lLiBCdXQgdGhlcmUgaXMgYW5vdGhlcgotcG9zc2liaWxpdHkgb2YgYnVuZGxpbmcgZmlsZXM6IHRoZSA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+LiBGaWxlc2V0IGFyZSBlYXN5IGlmIHRoZSBmaWxlcyBhcmUgYWxsIHVuZGVyCi1hIGNvbW1vbiBiYXNlIGRpcmVjdG9yeS4gQnV0IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlIHlvdSBoYXZlIGEgcHJvYmxlbS4gQW5vdGhlciBkaXNhZHZhbnRhZ2UKLWlzIGl0cyBzcGVlZDogaWYgeW91IGhhdmUgb25seSBhIGZldyBmaWxlcyBpbiBhIGh1Z2UgZGlyZWN0b3J5IHN0cnVjdHVyZSwgd2h5IG5vdCB1c2UgYQotPGNvZGU+Jmx0O2ZpbGVsaXN0Jmd0OzwvY29kZT4gaW5zdGVhZD8gPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPnMgY29tYmluZXMgdGhlc2UgZGF0YXR5cGVzIGluIHRoYXQgd2F5IHRoYXQgYSBwYXRoIGNvbnRhaW5zCi1vdGhlciBwYXRocywgZmlsZXNldHMsIGRpcnNldHMgYW5kIGZpbGVsaXN0cy4gVGhpcyBpcyB3aHkgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC8iPgotQW50LUNvbnRyaWJzIFs0XTwvYT4gPGNvZGU+Jmx0O2ZvcmVhY2gmZ3Q7PC9jb2RlPiB0YXNrIGlzIG1vZGlmaWVkIHRvIHN1cHBvcnQgcGF0aHMgaW5zdGVhZCBvZiBmaWxlc2V0cy4gU28gd2Ugd2FudCB0aGF0LAotdG9vLjwvcD4KKzxoMiBpZD0icGF0aCI+VXNpbmcgbmVzdGVkIHBhdGhzPC9oMj4KKzxwPkEgdGFzayBwcm92aWRpbmcgc3VwcG9ydCBmb3IgZmlsZXNldHMgaXMgYSB2ZXJ5IGNvbWZvcnRhYmxlIG9uZS4gQnV0IHRoZXJlIGlzIGFub3RoZXIgcG9zc2liaWxpdHkgb2YgYnVuZGxpbmcgZmlsZXM6Cit0aGUgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPi4gRmlsZXNldHMgYXJlIGVhc3kgaWYgdGhlIGZpbGVzIGFyZSBhbGwgdW5kZXIgYSBjb21tb24gYmFzZSBkaXJlY3RvcnkuIEJ1dCBpZiB0aGlzIGlzIG5vdAordGhlIGNhc2UsIHlvdSBoYXZlIGEgcHJvYmxlbS4gQW5vdGhlciBkaXNhZHZhbnRhZ2UgaXMgaXRzIHNwZWVkOiBpZiB5b3UgaGF2ZSBvbmx5IGEgZmV3IGZpbGVzIGluIGEgaHVnZSBkaXJlY3RvcnkKK3N0cnVjdHVyZSwgd2h5IG5vdCB1c2UgYSA8Y29kZT4mbHQ7ZmlsZWxpc3QmZ3Q7PC9jb2RlPiBpbnN0ZWFkPyA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+cyBjb21iaW5lcyB0aGVzZSBkYXRhdHlwZXMgaW4KK3RoYXQgd2F5IHRoYXQgYSBwYXRoIGNvbnRhaW5zIG90aGVyIHBhdGhzLCBmaWxlc2V0cywgZGlyc2V0cyBhbmQgZmlsZWxpc3RzLiBUaGlzIGlzCit3aHkgPGEgaHJlZj0iaHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC8iIHRhcmdldD0iX3RvcCI+QW50LUNvbnRyaWIgWzRdPC9hPiA8Y29kZT4mbHQ7Zm9yZWFjaCZndDs8L2NvZGU+IHRhc2sgaXMKK21vZGlmaWVkIHRvIHN1cHBvcnQgcGF0aHMgaW5zdGVhZCBvZiBmaWxlc2V0cy4gU28gd2Ugd2FudCB0aGF0LCB0b28uPC9wPgogCiA8cD5DaGFuZ2luZyBmcm9tIGZpbGVzZXQgdG8gcGF0aCBzdXBwb3J0IGlzIHZlcnkgZWFzeTo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KLTxpPjxiPkNoYW5nZSBqYXZhIGNvZGUgZnJvbTo8L2I+PC9pPgotICAgIHByaXZhdGUgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworPGVtPjxzdHJvbmc+Q2hhbmdlIEphdmEgY29kZSBmcm9tOjwvc3Ryb25nPjwvZW0+Cis8cHJlPgorICAgIHByaXZhdGUgTGlzdCZsdDtGaWxlU2V0Jmd0OyBmaWxlc2V0cyA9IG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygpOwogICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmaWxlc2V0KSB7CiAgICAgICAgIGZpbGVzZXRzLmFkZChmaWxlc2V0KTsKLSAgICB9Ci08aT48Yj50bzo8L2I+PC9pPgotICAgIHByaXZhdGUgVmVjdG9yIHBhdGhzID0gbmV3IFZlY3RvcigpOyAgICAgICAgICAgICAgICAgICAgICAqMQorICAgIH08L3ByZT4KKzxlbT48c3Ryb25nPnRvOjwvc3Ryb25nPjwvZW0+Cis8cHJlPgorICAgIHByaXZhdGUgTGlzdCZsdDtQYXRoJmd0OyBwYXRocyA9IG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygpOyAgICAgICAgICAgICAqMQogICAgIHB1YmxpYyB2b2lkIGFkZDxiPlBhdGg8L2I+KDxiPlBhdGg8L2I+IHBhdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICoyCiAgICAgICAgIHBhdGhzLmFkZChwYXRoKTsKLSAgICB9Ci08aT48Yj5hbmQgYnVpbGQgZmlsZSBmcm9tOjwvYj48L2k+CisgICAgfTwvcHJlPgorPGVtPjxzdHJvbmc+YW5kIGJ1aWxkIGZpbGUgZnJvbTo8L3N0cm9uZz48L2VtPgorPHByZT4KICAgICAmbHQ7ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciImZ3Q7CiAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OwotICAgICZsdDsvZmluZCZndDsKLTxpPjxiPnRvOjwvYj48L2k+CisgICAgJmx0Oy9maW5kJmd0OzwvcHJlPgorPGVtPjxzdHJvbmc+dG86PC9zdHJvbmc+PC9lbT4KKzxwcmU+CiAgICAgJmx0O2ZpbmQgZmlsZT0iYW50LmphciIgbG9jYXRpb249ImxvY2F0aW9uLmFudC1qYXIiJmd0OwogICAgICAgICA8Yj4mbHQ7cGF0aCZndDs8L2I+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjMKICAgICAgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvJmd0OwogICAgICAgICAmbHQ7L3BhdGgmZ3Q7Ci0gICAgJmx0Oy9maW5kJmd0OwotPC9wcmU+Ci08cD5PbiA8Yj4qMTwvYj4gd2UgcmVuYW1lIG9ubHkgdGhlIHZlY3Rvci4gSXTvv71zIGp1c3QgZm9yIGJldHRlciByZWFkaW5nIHRoZSBzb3VyY2UuIE9uIDxiPioyPC9iPgotd2UgaGF2ZSB0byBwcm92aWRlIHRoZSByaWdodCBtZXRob2Q6IGFuIGFkZDxpPk5hbWU8L2k+KDxpPlR5cGU8L2k+IHQpLiBUaGVyZWZvcmUgcmVwbGFjZSB0aGUKLWZpbGVzZXQgd2l0aCBwYXRoIGhlcmUuIEZpbmFsbHkgd2UgaGF2ZSB0byBtb2RpZnkgb3VyIGJ1aWxkZmlsZSBvbiA8Yj4qMzwvYj4gYmVjYXVzZSBvdXIgdGFzawotZG9lc27vv710IHN1cHBvcnQgbmVzdGVkIGZpbGVzZXRzIGFueSBsb25nZXIuIFNvIHdlIHdyYXAgdGhlIGZpbGVzZXQgaW5zaWRlIGEgcGF0aC48L3A+CisgICAgJmx0Oy9maW5kJmd0OzwvcHJlPgorPHA+T24gPHN0cm9uZz4qMTwvc3Ryb25nPiB3ZSByZW5hbWUgb25seSB0aGUgbGlzdC4gSXQncyBqdXN0IGZvciBiZXR0ZXIgcmVhZGluZyB0aGUgc291cmNlLiBPbiA8c3Ryb25nPioyPC9zdHJvbmc+IHdlCitoYXZlIHRvIHByb3ZpZGUgdGhlIHJpZ2h0IG1ldGhvZDogYW4gPGNvZGU+YWRkPGk+TmFtZTwvaT4oPGk+VHlwZTwvaT4gdCk8L2NvZGU+LiBUaGVyZWZvcmUgcmVwbGFjZSB0aGUgZmlsZXNldCB3aXRoIHBhdGgKK2hlcmUuIEZpbmFsbHkgd2UgaGF2ZSB0byBtb2RpZnkgb3VyIGJ1aWxkZmlsZSBvbiA8c3Ryb25nPiozPC9zdHJvbmc+IGJlY2F1c2Ugb3VyIHRhc2sgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCBmaWxlc2V0cworYW55IGxvbmdlci4gU28gd2Ugd3JhcCB0aGUgZmlsZXNldCBpbnNpZGUgYSBwYXRoLjwvcD4KIAotPHA+QW5kIG5vdyB3ZSBtb2RpZnkgdGhlIHRlc3RjYXNlLiBPaCwgbm90IHZlcnkgbXVjaCB0byBkbyA6LSkgUmVuYW1pbmcgdGhlIDx0dD50ZXN0TWlzc2luZ0ZpbGVzZXQoKTwvdHQ+Ci0obm90IHJlYWxseSBhIDxpPm11c3QtYmU8L2k+IGJ1dCBiZXR0ZXIgaXTvv71zIG5hbWVkIGxpa2UgdGhlIHRoaW5rIGl0IGRvZXMpIGFuZCB1cGRhdGUgdGhlCi08aT5leHBlY3RlZDwvaT4tU3RyaW5nIGluIHRoYXQgbWV0aG9kIChub3cgYSA8dHQ+cGF0aCBub3Qgc2V0PC90dD4gbWVzc2FnZSBpcyBleHBlY3RlZCkuIFRoZSBtb3JlIGNvbXBsZXgKLXRlc3QgY2FzZXMgYmFzZSBvbiB0aGUgYnVpbGRzY3JpcHQuIFNvIHRoZSB0YXJnZXRzIDx0dD50ZXN0RmlsZU5vdFByZXNlbnQ8L3R0PiBhbmQgPHR0PnRlc3RGaWxlUHJlc2VudDwvdHQ+IGhhdmUgdG8gYmUKLW1vZGlmaWVkIGluIHRoZSBtYW5uZXIgZGVzY3JpYmVkIGFib3ZlLjwvcD4KKzxwPkFuZCBub3cgd2UgbW9kaWZ5IHRoZSB0ZXN0IGNhc2UuIE9oLCBub3QgdmVyeSBtdWNoIHRvIGRvIDotKSBSZW5hbWluZwordGhlIDxjb2RlIGNsYXNzPSJjb2RlIj50ZXN0TWlzc2luZ0ZpbGVzZXQoKTwvY29kZT4gKG5vdCByZWFsbHkgYSA8ZW0+bXVzdC1iZTwvZW0+IGJ1dCBiZXR0ZXIgaXQncyBuYW1lZCBsaWtlIHRoZSB0aGluZworaXQgZG9lcykgYW5kIHVwZGF0ZSB0aGUgPHZhcj5leHBlY3RlZDwvdmFyPi1TdHJpbmcgaW4gdGhhdCBtZXRob2QgKG5vdyBhIDxzYW1wPnBhdGggbm90IHNldDwvc2FtcD4gbWVzc2FnZSBpcworZXhwZWN0ZWQpLiBUaGUgbW9yZSBjb21wbGV4IHRlc3QgY2FzZXMgYmFzZSBvbiB0aGUgYnVpbGQgc2NyaXB0LiBTbyB0aGUgdGFyZ2V0cyA8dmFyPnRlc3RGaWxlTm90UHJlc2VudDwvdmFyPgorYW5kIDx2YXI+dGVzdEZpbGVQcmVzZW50PC92YXI+IGhhdmUgdG8gYmUgbW9kaWZpZWQgaW4gdGhlIG1hbm5lciBkZXNjcmliZWQgYWJvdmUuPC9wPgogCi08cD5UaGUgdGVzdCBhcmUgZmluaXNoZWQuIE5vdyB3ZSBoYXZlIHRvIGFkYXB0IHRoZSB0YXNrIGltcGxlbWVudGF0aW9uLiBUaGUgZWFzaWVzdCBtb2RpZmljYXRpb24gaXMKLWluIHRoZSA8dHQ+dmFsaWRhdGUoKTwvdHQ+IG1ldGhvZCB3aGVyZSB3ZSBjaGFuZ2UgbGUgbGFzdCBsaW5lIHRvIDx0dD5pZiAocGF0aHMuc2l6ZSgpJmx0OzEpIHRocm93IG5ldwotQnVpbGRFeGNlcHRpb24oInBhdGggbm90IHNldCIpOzwvdHQ+LiBJbiB0aGUgPHR0PmV4ZWN1dGUoKTwvdHQ+IG1ldGhvZCB3ZSBoYXZlIGEgbGl0dGxlIG1vcmUgd29yay4KLS4uLiBtbW1oIC4uLiBpbiByZWFsaXR5IGl0J3MgbGVzc2VyIHdvcmssIGJlY2F1c2UgdGhlIFBhdGggY2xhc3MgZG9lcyB0aGUgd2hvbGUgRGlyZWN0b3J5U2Nhbm5lci1oYW5kbGluZwotYW5kIGNyZWF0aW5nLWFic29sdXRlLXBhdGhzIHN0dWZmIGZvciB1cy4gU28gdGhlIGV4ZWN1dGUgbWV0aG9kIGlzIGp1c3Q6PC9wPgorPHA+VGhlIHRlc3QgYXJlIGZpbmlzaGVkLiBOb3cgd2UgaGF2ZSB0byBhZGFwdCB0aGUgdGFzayBpbXBsZW1lbnRhdGlvbi4gVGhlIGVhc2llc3QgbW9kaWZpY2F0aW9uIGlzIGluCit0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPnZhbGlkYXRlKCk8L2NvZGU+IG1ldGhvZCB3aGVyZSB3ZSBjaGFuZ2UgdGhlIGxhc3QgbGluZSB0byA8Y29kZSBjbGFzcz0iY29kZSI+aWYKKyhwYXRocy5zaXplKCkmbHQ7MSkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXRoIG5vdCBzZXQiKTs8L2NvZGU+LiBJbiB0aGUgPGNvZGUgY2xhc3M9ImNvZGUiPmV4ZWN1dGUoKTwvY29kZT4gbWV0aG9kCit3ZSBoYXZlIGEgbGl0dGxlIG1vcmUgd29yay4gIC4uLiBtbW1oIC4uLiBpbiByZWFsaXR5IGl0J3MgbGVzcyB3b3JrLCBiZWNhdXNlIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+UGF0aDwvY29kZT4gY2xhc3MKK2RvZXMgdGhlIHdob2xlIDxjb2RlIGNsYXNzPSJjb2RlIj5EaXJlY3RvcnlTY2FubmVyPC9jb2RlPi1oYW5kbGluZyBhbmQgY3JlYXRpbmctYWJzb2x1dGUtcGF0aHMgc3R1ZmYgZm9yIHVzLiBTbyB0aGUKK2V4ZWN1dGUgbWV0aG9kIGJlY29tZXMganVzdDo8L3A+CiAKLTxwcmUgY2xhc3M9ImNvZGUiPgorPHByZT4KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICBTdHJpbmcgZm91bmRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIGZvcihJdGVyYXRvciBpdFBhdGhzID0gcGF0aHMuaXRlcmF0b3IoKTsgaXRQYXRocy5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGF0aCBwYXRoID0gKDxiPlBhdGg8L2I+KWl0UGF0aHMubmV4dCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQotICAgICAgICAgICAgU3RyaW5nW10gaW5jbHVkZWRGaWxlcyA9IDxiPnBhdGgubGlzdCgpPC9iPjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgotICAgICAgICAgICAgZm9yKGludCBpPTA7IGkmbHQ7aW5jbHVkZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGluY2x1ZGVkRmlsZXNbaV0ucmVwbGFjZSgnXFwnLCcvJyk7Ci0gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoIi8iKSsxKTsKLSAgICAgICAgICAgICAgICBpZiAoZm91bmRMb2NhdGlvbj09bnVsbCAmYW1wOyZhbXA7IGZpbGUuZXF1YWxzKGZpbGVuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICA8Yj5mb3VuZExvY2F0aW9uID0gaW5jbHVkZWRGaWxlc1tpXTs8L2I+ICAgICAgICAgICAgICAgICAgICAgICAgLy8gMworICAgICAgICBmb3IgKFBhdGggcGF0aCA6IHBhdGhzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGluY2x1ZGVkRmlsZSA6IDxiPnBhdGgubGlzdCgpPC9iPikgeyAgICAgICAgICAgICAgICAgICAgLy8gMgorICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGluY2x1ZGVkRmlsZS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kTG9jYXRpb24gPT0gbnVsbCAmYW1wOyZhbXA7IGZpbGUuZXF1YWxzKGZpbGVuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICA8Yj5mb3VuZExvY2F0aW9uID0gaW5jbHVkZWRGaWxlOzwvYj4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChmb3VuZExvY2F0aW9uIT1udWxsKQorICAgICAgICBpZiAoZm91bmRMb2NhdGlvbiAhPSBudWxsKQogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGxvY2F0aW9uLCBmb3VuZExvY2F0aW9uKTsKICAgICB9CiA8L3ByZT4KIAotPHA+T2YgY291cnNlIHdlIGhhdmUgdG8gZG8gdGhlIHR5cGVjYXNlIHRvIFBhdGggb24gPGI+Ly8xPC9iPi4gT24gPGI+Ly8yPC9iPiBhbmQgPGI+Ly8zPC9iPgotd2Ugc2VlIHRoYXQgdGhlIFBhdGggY2xhc3MgZG9lcyB0aGUgd29yayBmb3IgdXM6IG5vIERpcmVjdG9yeVNjYW5uZXIgKHdhcyBhdCAyKSBhbmQgbm8KLWNyZWF0aW5nIG9mIHRoZSBhYnNvbHV0ZSBwYXRoICh3YXMgYXQgMykuPC9wPgorPHA+T2YgY291cnNlIHdlIGhhdmUgdG8gaXRlcmF0ZSB0aHJvdWdoIHBhdGhzIG9uIDxzdHJvbmc+Ly8xPC9zdHJvbmc+LiBPbiA8c3Ryb25nPi8vMjwvc3Ryb25nPiBhbmQgPHN0cm9uZz4vLzM8L3N0cm9uZz4KK3dlIHNlZSB0aGF0IHRoZSBQYXRoIGNsYXNzIGRvZXMgdGhlIHdvcmsgZm9yIHVzOiBubyBEaXJlY3RvcnlTY2FubmVyICh3YXMgYXQgMikgYW5kIG5vIGNyZWF0aW5nIG9mIHRoZSBhYnNvbHV0ZSBwYXRoCisod2FzIGF0IDMpLjwvcD4KIAorPGgyIGlkPSJyZXR1cm5pbmctbGlzdCI+UmV0dXJuaW5nIGEgbGlzdDwvaDI+Cis8cD5TbyBmYXIgc28gZ29vZC4gQnV0IGNvdWxkIGEgZmlsZSBiZSBvbiBtb3JlIHRoYW4gb25lIHBsYWNlIGluIHRoZSBwYXRoPyZtZGFzaDtPZiBjb3Vyc2UuPGJyLz4KK0FuZCB3b3VsZCBpdCBiZSBnb29kIHRvIGdldCBhbGwgb2YgdGhlbT8mbWRhc2g7SXQgZGVwZW5kcyAuLi48cD4KIAotCi08aDI+PGEgbmFtZT0icmV0dXJuaW5nLWxpc3QiPlJldHVybmluZyBhIGxpc3Q8L2E+PC9oMj4KLTxwPlNvIGZhciBzbyBnb29kLiBCdXQgY291bGQgYSBmaWxlIGJlIG9uIG1vcmUgdGhhbiBvbmUgcGxhY2UgaW4gdGhlIHBhdGg/IC0gT2YgY291cnNlLjxicj4KLUFuZCB3b3VsZCBpdCBiZSBnb29kIHRvIGdldCBhbGwgb2YgdGhlbT8gLSBJdCBkZXBlbmRzIG9uIC4uLjxwPgotCi08cD5JbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBleHRlbmQgdGhhdCB0YXNrIHRvIHN1cHBvcnQgcmV0dXJuaW5nIGEgbGlzdCBvZiBhbGwgZmlsZXMuCi1MaXN0cyBhcyBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgQW50IG5hdGl2ZWx5LiBTbyB3ZSBoYXZlIHRvIHNlZSBob3cgb3RoZXIKLXRhc2tzIHVzZSBsaXN0cy4gVGhlIG1vc3QgZmFtb3VzIHRhc2sgdXNpbmcgbGlzdHMgaXMgQW50LUNvbnRyaWJzIDxjb2RlPiZsdDtmb3JlYWNoJmd0OzwvY29kZT4uIEFsbCBsaXN0Ci1lbGVtZW50cyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBzZXBhcmF0ZWQgd2l0aCBhIGN1c3RvbWl6YWJsZSBzZXBhcmF0b3IgKGRlZmF1bHQgJywnKS48L3A+Cis8cD5JbiB0aGlzIHNlY3Rpb24gd2Ugd2lsbCBleHRlbmQgdGhhdCB0YXNrIHRvIHN1cHBvcnQgcmV0dXJuaW5nIGEgbGlzdCBvZiBhbGwgZmlsZXMuICBMaXN0cyBhcyBwcm9wZXJ0eSB2YWx1ZXMgYXJlIG5vdAorc3VwcG9ydGVkIGJ5IEFudCBuYXRpdmVseS4gU28gd2UgaGF2ZSB0byBzZWUgaG93IG90aGVyIHRhc2tzIHVzZSBsaXN0cy4gVGhlIG1vc3QgZmFtb3VzIHRhc2sgdXNpbmcgbGlzdHMgaXMKK0FudC1Db250cmliJ3MgPGNvZGU+Jmx0O2ZvcmVhY2gmZ3Q7PC9jb2RlPi4gQWxsIGxpc3QgZWxlbWVudHMgYXJlIGNvbmNhdGVuYXRlZCBhbmQgc2VwYXJhdGVkIHdpdGggYSBjdXN0b21pemFibGUKK3NlcGFyYXRvciAoZGVmYXVsdCA8cT4sPC9xPikuPC9wPgogCiA8cD5TbyB3ZSBkbyB0aGUgZm9sbG93aW5nOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Ci0gICAgJmx0O2ZpbmQgLi4uIDxiPmRlbGltaXRlcj0iIjwvYj4vJmd0OyAuLi4gJmx0Oy9maW5kJmd0OwotPC9wcmU+Cis8cHJlPiZsdDtmaW5kIC4uLiA8Yj5kZWxpbWl0ZXI9IiI8L2I+LyZndDsgLi4uICZsdDsvZmluZCZndDs8L3ByZT4KIAotPHA+SWYgdGhlIGRlbGltaXRlciBpcyBzZXQgd2Ugd2lsbCByZXR1cm4gYWxsIGZvdW5kIGZpbGVzIGFzIGxpc3Qgd2l0aCB0aGF0IGRlbGltaXRlci48L3A+Cis8cD5pZiB0aGUgZGVsaW1pdGVyIGlzIHNldCwgd2Ugd2lsbCByZXR1cm4gYWxsIGZvdW5kIGZpbGVzIGFzIGxpc3Qgd2l0aCB0aGF0IGRlbGltaXRlci48L3A+CiAKLTxwPlRoZXJlZm9yZSB3ZSBoYXZlIHRvPHVsPgorPHA+VGhlcmVmb3JlIHdlIGhhdmUgdG88L3A+Cis8dWw+CiA8bGk+cHJvdmlkZSBhIG5ldyBhdHRyaWJ1dGU8L2xpPgogPGxpPmNvbGxlY3QgbW9yZSB0aGFuIHRoZSBmaXJzdCBmaWxlPC9saT4KIDxsaT5kZWxldGUgZHVwbGljYXRlczwvbGk+CiA8bGk+Y3JlYXRlIHRoZSBsaXN0IGlmIG5lY2Vzc2FyeTwvbGk+CiA8bGk+cmV0dXJuIHRoYXQgbGlzdDwvbGk+Ci08L3VsPjwvcD4KKzwvdWw+CiAKLTxwPlNvIHdlIGFkZCBhcyB0ZXN0Y2FzZTo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KLTxiPjxpPmluIHRoZSBidWlsZGZpbGU6PC9pPjwvYj4KKzxwPlNvIHdlIGFkZCBhcyB0ZXN0IGNhc2U6PC9wPgorPHN0cm9uZz48ZW0+aW4gdGhlIGJ1aWxkZmlsZTo8L2VtPjwvc3Ryb25nPgorPHByZT4KICAgICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QuaW5pdCImZ3Q7CiAgICAgICAgICZsdDtta2RpciBkaXI9InRlc3QxL2RpcjExL2RpcjExMSIvJmd0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKjEKICAgICAgICAgJmx0O21rZGlyIGRpcj0idGVzdDEvZGlyMTEvZGlyMTEyIi8mZ3Q7CkBAIC00ODQsMjcgKzQ0OCwyNSBAQAogICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJ0ZXN0MSIvJmd0OwogICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJ0ZXN0MiIvJmd0OwogICAgICAgICAmbHQ7L2RlbGV0ZSZndDsKLSAgICAmbHQ7L3RhcmdldCZndDsKLQotPGI+PGk+aW4gdGhlIHRlc3QgY2xhc3M6PC9pPjwvYj4KKyAgICAmbHQ7L3RhcmdldCZndDs8L3ByZT4KKzxzdHJvbmc+PGVtPmluIHRoZSB0ZXN0IGNsYXNzOjwvZW0+PC9zdHJvbmc+Cis8cHJlPgogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUZpbGVzKCkgewogICAgICAgICBleGVjdXRlVGFyZ2V0KCJ0ZXN0TXVsdGlwbGVGaWxlcyIpOwogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbi50ZXN0Iik7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiT25seSBvbmUgZmlsZSBmb3VuZC4iLCByZXN1bHQuaW5kZXhPZigiOyIpICZndDsgLTEpOwotICAgIH0KLTwvcHJlPgorICAgIH08L3ByZT4KIAotPHA+Tm93IHdlIG5lZWQgYSBkaXJlY3Rvcnkgc3RydWN0dXJlIHdoZXJlIHdlIENBTiBmaW5kIGZpbGVzIHdpdGggdGhlIHNhbWUKLW5hbWUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBCZWNhdXNlIHdlIGNhbid0IHN1cmUgdG8gaGF2ZSBvbmUgd2UgY3JlYXRlCi1vbmUgb24gPGI+KjE8L2I+IGFuZCA8Yj4qMjwvYj4uIEFuZCBvZiBjb3Vyc2Ugd2UgY2xlYW4gdXAgdGhhdCBvbiA8Yj4qNDwvYj4uIFRoZSBjcmVhdGlvbgotY2FuIGJlIGRvbmUgaW5zaWRlIG91ciB0ZXN0IHRhcmdldCBvciBpbiBhIHNlcGFyYXRlIG9uZSwgd2hpY2ggd2lsbCBiZSBiZXR0ZXIKLWZvciByZXVzZSBsYXRlciAoPGI+KjM8L2I+KS4KKzxwPk5vdyB3ZSBuZWVkIGEgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aGVyZSB3ZSBDQU4gZmluZCBmaWxlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IGRpcmVjdG9yaWVzLiBCZWNhdXNlIHdlCitjYW4ndCBzdXJlIHRvIGhhdmUgb25lIHdlIGNyZWF0ZSBvbmUgb24gPHN0cm9uZz4qMTwvc3Ryb25nPiBhbmQgPHN0cm9uZz4qMjwvc3Ryb25nPi4gQW5kIG9mIGNvdXJzZSB3ZSBjbGVhbiB1cCB0aGF0CitvbiA8c3Ryb25nPio0PC9zdHJvbmc+LiBUaGUgY3JlYXRpb24gY2FuIGJlIGRvbmUgaW5zaWRlIG91ciB0ZXN0IHRhcmdldCBvciBpbiBhIHNlcGFyYXRlIG9uZSwgd2hpY2ggd2lsbCBiZSBiZXR0ZXIgZm9yCityZXVzZSBsYXRlciAoPHN0cm9uZz4qMzwvc3Ryb25nPikuCiAKIDxwPlRoZSB0YXNrIGltcGxlbWVudGF0aW9uIGlzIG1vZGlmaWVkIGFzIGZvbGxvd2VkOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZm91bmRGaWxlcyA9IG5ldyBWZWN0b3IoKTsKKzxwcmU+CisgICAgcHJpdmF0ZSBMaXN0Jmx0O1N0cmluZyZndDsgZm91bmRGaWxlcyA9IG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygpOwogICAgIC4uLgogICAgIHByaXZhdGUgU3RyaW5nIGRlbGltaXRlciA9IG51bGw7CiAgICAgLi4uCkBAIC01MTUsOTkgKzQ3Nyw5MSBAQAogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIC8vIGZpbmQgYWxsIGZpbGVzCi0gICAgICAgIGZvcihJdGVyYXRvciBpdFBhdGhzID0gcGF0aHMuaXRlcmF0b3IoKTsgaXRQYXRocy5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGF0aCBwYXRoID0gKFBhdGgpaXRQYXRocy5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZEZpbGVzID0gcGF0aC5saXN0KCk7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaSZsdDtpbmNsdWRlZEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlc1tpXS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgZm9yIChQYXRoIHBhdGggOiBwYXRocykgeworICAgICAgICAgICAgZm9yIChGaWxlIGluY2x1ZGVkRmlsZSA6IHBhdGgubGlzdCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlLnJlcGxhY2UoJ1xcJywnLycpOwogICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKGZpbGVuYW1lLmxhc3RJbmRleE9mKCIvIikrMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKGZpbGVuYW1lKSAmYW1wOyZhbXA7IDxiPiFmb3VuZEZpbGVzLmNvbnRhaW5zKGluY2x1ZGVkRmlsZXNbaV08L2I+KSkgeyAgIC8vIDEKLSAgICAgICAgICAgICAgICAgICAgZm91bmRGaWxlcy5hZGQoaW5jbHVkZWRGaWxlc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKGZpbGVuYW1lKSAmYW1wOyZhbXA7IDxiPiFmb3VuZEZpbGVzLmNvbnRhaW5zKGluY2x1ZGVkRmlsZSk8L2I+KSB7ICAvLyAxCisgICAgICAgICAgICAgICAgICAgIGZvdW5kRmlsZXMuYWRkKGluY2x1ZGVkRmlsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIHRoZSByZXR1cm4gdmFsdWUgKGxpc3Qvc2luZ2xlKQogICAgICAgICBTdHJpbmcgcnYgPSBudWxsOwotICAgICAgICBpZiAoZm91bmRGaWxlcy5zaXplKCkgJmd0OyAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKLSAgICAgICAgICAgIGlmIChkZWxpbWl0ZXI9PW51bGwpIHsKKyAgICAgICAgaWYgKCFmb3VuZEZpbGVzLmlzRW1wdHkoKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIKKyAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIG9ubHkgdGhlIGZpcnN0Ci0gICAgICAgICAgICAgICAgcnYgPSAoU3RyaW5nKWZvdW5kRmlsZXMuZWxlbWVudEF0KDApOworICAgICAgICAgICAgICAgIHJ2ID0gZm91bmRGaWxlcy5nZXQoMCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yKEl0ZXJhdG9yIGl0PWZvdW5kRmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsgICAgLy8gMworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZvdW5kRmlsZXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzCiAgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICg8Yj5pdC5oYXNOZXh0KCk8L2I+KSBsaXN0LmFwcGVuZChkZWxpbWl0ZXIpOyAgICAgICAgICAgICAgIC8vIDQKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICg8Yj5saXN0Lmxlbmd0aCgpID4gMDwvYj4pIGxpc3QuYXBwZW5kKGRlbGltaXRlcik7ICAgICAgICAgICAgICAgICAgLy8gNAorICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcnYgPSBsaXN0LnRvU3RyaW5nKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjcmVhdGUgdGhlIHByb3BlcnR5Ci0gICAgICAgIGlmIChydiE9bnVsbCkKKyAgICAgICAgaWYgKHJ2ICE9IG51bGwpCiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobG9jYXRpb24sIHJ2KTsKLSAgICB9Ci08L3ByZT4KKyAgICB9PC9wcmU+CiAKLTxwPlRoZSBhbGdvcml0aG0gZG9lczogZmluZGluZyBhbGwgZmlsZXMsIGNyZWF0aW5nIHRoZSByZXR1cm4gdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSB1c2Vycwotd2lzaCwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcyBwcm9wZXJ0eS4gT24gPGI+Ly8xPC9iPiB3ZSBlbGltaW5hdGVzIHRoZSBkdXBsaWNhdGVzLiA8Yj4vLzI8L2I+Ci1lbnN1cmVzIHRoYXQgd2UgY3JlYXRlIHRoZSByZXR1cm4gdmFsdWUgb25seSBpZiB3ZSBoYXZlIGZvdW5kIG9uZSBmaWxlLiBPbiA8Yj4vLzM8L2I+IHdlCi1pdGVyYXRlIG92ZXIgYWxsIGZvdW5kIGZpbGVzIGFuZCA8Yj4vLzQ8L2I+IGVuc3VyZXMgdGhhdCB0aGUgbGFzdCBlbnRyeSBoYXMgbm8gdHJhaWxpbmcKLWRlbGltaXRlci48L3A+Cis8cD5UaGUgYWxnb3JpdGhtIGRvZXM6IGZpbmRpbmcgYWxsIGZpbGVzLCBjcmVhdGluZyB0aGUgcmV0dXJuIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUgdXNlcnMgd2lzaCwgcmV0dXJuaW5nIHRoZSB2YWx1ZSBhcworcHJvcGVydHkuIE9uIDxzdHJvbmc+Ly8xPC9zdHJvbmc+IHdlIGVsaW1pbmF0ZXMgdGhlIGR1cGxpY2F0ZXMuIDxzdHJvbmc+Ly8yPC9zdHJvbmc+IGVuc3VyZXMgdGhhdCB3ZSBjcmVhdGUgdGhlIHJldHVybgordmFsdWUgb25seSBpZiB3ZSBoYXZlIGZvdW5kIG9uZSBmaWxlLiBPbiA8c3Ryb25nPi8vMzwvc3Ryb25nPiB3ZSBpdGVyYXRlIG92ZXIgYWxsIGZvdW5kIGZpbGVzIGFuZCA8c3Ryb25nPi8vNDwvc3Ryb25nPgorZW5zdXJlcyB0aGF0IHRoZSBsYXN0IGVudHJ5IGhhcyBubyB0cmFpbGluZyBkZWxpbWl0ZXIuPC9wPgogCi08cD5PaywgZmlyc3Qgc2VhcmNoaW5nIGZvciBhbGwgZmlsZXMgYW5kIHRoZW4gcmV0dXJuaW5nIG9ubHkgdGhlIGZpcnN0IG9uZSAuLi4gWW91IGNhbgotdHVuZSB0aGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBvd24gOi0pPC9wPgorPHA+T2ssIGZpcnN0IHNlYXJjaGluZyBmb3IgYWxsIGZpbGVzIGFuZCB0aGVuIHJldHVybmluZyBvbmx5IHRoZSBmaXJzdCBvbmUgLi4uIFlvdSBjYW4gdHVuZSB0aGUgcGVyZm9ybWFuY2Ugb2YgeW91ciBvd24KKzotKTwvcD4KIAorPGgyIGlkPSJkb2N1bWVudGF0aW9uIj5Eb2N1bWVudGF0aW9uPC9oMj4KKzxwPkEgdGFzayBpcyB1c2VsZXNzIGlmIHRoZSBvbmx5IHdobyBpcyBhYmxlIHRvIGNvZGUgdGhlIGJ1aWxkZmlsZSBpcyB0aGUgdGFzayBkZXZlbG9wZXIgKGFuZCBoZSBvbmx5IHRoZSBuZXh0IGZldyB3ZWVrcworOi0pLiBTbyBkb2N1bWVudGF0aW9uIGlzIGFsc28gdmVyeSBpbXBvcnRhbnQuIEluIHdoaWNoIGZvcm0geW91IGRvIHRoYXQgZGVwZW5kcyBvbiB5b3VyIGZhdm91cml0ZS4gQnV0IGluc2lkZSBBbnQgdGhlcmUKK2lzIGEgY29tbW9uIGZvcm1hdCBhbmQgaXQgaGFzIGFkdmFudGFnZXMgaWYgeW91IHVzZSB0aGF0OiBhbGwgdGFzayB1c2VycyBrbm93IHRoYXQgZm9ybSwgdGhpcyBmb3JtIGlzIHJlcXVlc3RlZCBpZiB5b3UKK2RlY2lkZSB0byBjb250cmlidXRlIHlvdXIgdGFzay4gU28gd2Ugd2lsbCBkb2Mgb3VyIHRhc2sgaW4gdGhhdCBmb3JtLjwvcD4KIAotPGgyPjxhIG5hbWU9ImRvY3VtZW50YXRpb24iPkRvY3VtZW50YXRpb248L2E+PC9oMj4KLTxwPkEgdGFzayBpcyB1c2VsZXNzIGlmIHRoZSBvbmx5IHdobyBpcyBhYmxlIHRvIGNvZGUgdGhlIGJ1aWxkZmlsZSBpcyB0aGUgdGFzayBkZXZlbG9wZXIKLShhbmQgaGUgb25seSB0aGUgbmV4dCBmZXcgd2Vla3MgOi0pLiBTbyBkb2N1bWVudGF0aW9uIGlzIGFsc28gdmVyeSBpbXBvcnRhbnQuIEluIHdoaWNoCi1mb3JtIHlvdSBkbyB0aGF0IGRlcGVuZHMgb24geW91ciBmYXZvdXJpdGUuIEJ1dCBpbnNpZGUgQW50IHRoZXJlIGlzIGEgY29tbW9uIGZvcm1hdCBhbmQKLWl0IGhhcyBhZHZhbnRhZ2VzIGlmIHlvdSB1c2UgdGhhdDogYWxsIHRhc2sgdXNlcnMga25vdyB0aGF0IGZvcm0sIHRoaXMgZm9ybSBpcyByZXF1ZXN0ZWQgaWYKLXlvdSBkZWNpZGUgdG8gY29udHJpYnV0ZSB5b3VyIHRhc2suIFNvIHdlIHdpbGwgZG9jIG91ciB0YXNrIGluIHRoYXQgZm9ybS48L3A+Ci0KLTxwPklmIHlvdSBoYXZlIGEgbG9vayBhdCB0aGUgbWFudWFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+SmF2YSB0YXNrIFs1XTwvYT4KLSAgIHlvdSB3aWxsIHNlZSB0aGF0IGl0Ojx1bD4KKzxwPklmIHlvdSBoYXZlIGEgbG9vayBhdCB0aGUgbWFudWFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+SmF2YSB0YXNrIFs1XTwvYT4geW91IHdpbGwgc2VlIHRoYXQgaXQ6PC9wPgorPHVsPgogPGxpPmlzIHBsYWluIGh0bWw8L2xpPgogPGxpPnN0YXJ0cyB3aXRoIHRoZSBuYW1lPC9saT4KLTxsaT5oYXMgc2VjdGlvbnM6IGRlc2NyaXB0aW9uLCBwYXJhbWV0ZXJzLCBuZXN0ZWQgZWxlbWVudHMsIChtYXliZSByZXR1cm4gY29kZXMpIGFuZCAobW9zdAotaW1wb3J0YW50IDotKSBleGFtcGxlczwvbGk+Ci08bGk+cGFyYW1ldGVycyBhcmUgbGlzdGVkIGluIGEgdGFibGUgd2l0aCBjb2x1bW5zIGZvciBhdHRyaWJ1dGUgbmFtZSwgaXRzIGRlc2NyaXB0aW9uIGFuZCB3aGV0aGVyCi0gIGl0J3MgcmVxdWlyZWQgKGlmIHlvdSBhZGQgYSBmZWF0dXJlIGFmdGVyIGFuIEFudCByZWxlYXNlLCBwcm92aWRlIGEgPHR0PnNpbmNlIEFudCB4eDwvdHQ+Ci0gIHN0YXRlbWVudCB3aGVuIGl0J3MgaW50cm9kdWNlZCk8L2xpPgorPGxpPmhhcyBzZWN0aW9uczogZGVzY3JpcHRpb24sIHBhcmFtZXRlcnMsIG5lc3RlZCBlbGVtZW50cywgKG1heWJlIHJldHVybiBjb2RlcykgYW5kIChtb3N0IGltcG9ydGFudCA6LSkgZXhhbXBsZXM8L2xpPgorPGxpPnBhcmFtZXRlcnMgYXJlIGxpc3RlZCBpbiBhIHRhYmxlIHdpdGggY29sdW1ucyBmb3IgYXR0cmlidXRlIG5hbWUsIGl0cyBkZXNjcmlwdGlvbiBhbmQgd2hldGhlciBpdCdzIHJlcXVpcmVkIChpZiB5b3UKK2FkZCBhIGZlYXR1cmUgYWZ0ZXIgYW4gQW50IHJlbGVhc2UsIHByb3ZpZGUgYSA8ZW0+c2luY2UgQW50IHh4PC9lbT4gc3RhdGVtZW50IHdoZW4gaXQncyBpbnRyb2R1Y2VkKTwvbGk+CiA8bGk+ZGVzY3JpYmUgdGhlIG5lc3RlZCBlbGVtZW50cyAoc2luY2Utc3RhdGVtZW50IGlmIG5lY2Vzc2FyeSk8L2xpPgogPGxpPnByb3ZpZGUgb25lIG9yIG1vcmUgdXNlZnVsIGV4YW1wbGVzOyBmaXJzdCBjb2RlLCB0aGVuIGRlc2NyaXB0aW9uLjwvbGk+CiA8L3VsPgotQXMgYSB0ZW1wbGF0ZSB3ZSBoYXZlOgorPHA+QXMgYSB0ZW1wbGF0ZSB3ZSBoYXZlOjwvcD4KIAotPHByZSBjbGFzcz0iY29kZSI+Ci0mbHQ7aHRtbCZndDsKKzxwcmU+CismbHQ7IURPQ1RZUEUgaHRtbCZndDsKKyZsdDtodG1sIGxhbmc9JnF1b3Q7ZW4mcXVvdDsmZ3Q7CiAKICZsdDtoZWFkJmd0OwotJmx0O21ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiJmd0OwogJmx0O3RpdGxlJmd0OzxiPlRhc2tuYW1lPC9iPiBUYXNrJmx0Oy90aXRsZSZndDsKICZsdDsvaGVhZCZndDsKIAogJmx0O2JvZHkmZ3Q7CiAKLSZsdDtoMiZndDsmbHQ7YSBuYW1lPSI8Yj50YXNrbmFtZTwvYj4iJmd0OzxiPlRhc2tuYW1lPC9iPiZsdDsvYSZndDsmbHQ7L2gyJmd0OworJmx0O2gyIGlkPSZxdW90OzxiPnRhc2tuYW1lPC9iPiZxdW90OyZndDs8Yj5UYXNrbmFtZTwvYj4mbHQ7L2gyJmd0OwogJmx0O2gzJmd0O0Rlc2NyaXB0aW9uJmx0Oy9oMyZndDsKLSZsdDtwJmd0OyA8Yj5EZXNjcmliZSB0aGUgdGFzay48L2I+Jmx0Oy9wJmd0OworJmx0O3AmZ3Q7PGI+RGVzY3JpYmUgdGhlIHRhc2suPC9iPiZsdDsvcCZndDsKIAogJmx0O2gzJmd0O1BhcmFtZXRlcnMmbHQ7L2gzJmd0OwotJmx0O3RhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIiZndDsKKyZsdDt0YWJsZSBjbGFzcz0mcXVvdDthdHRyJnF1b3Q7Jmd0OwogICAmbHQ7dHImZ3Q7Ci0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDsmbHQ7YiZndDtBdHRyaWJ1dGUmbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0OyZsdDtiJmd0O0Rlc2NyaXB0aW9uJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7Ci0gICAgJmx0O3RkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiZndDsmbHQ7YiZndDtSZXF1aXJlZCZsdDsvYiZndDsmbHQ7L3RkJmd0OworICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7QXR0cmlidXRlJmx0Oy90aCZndDsKKyAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0O0Rlc2NyaXB0aW9uJmx0Oy90aCZndDsKKyAgICAmbHQ7dGggc2NvcGU9JnF1b3Q7Y29sJnF1b3Q7Jmd0O1JlcXVpcmVkJmx0Oy90aCZndDsKICAgJmx0Oy90ciZndDsKIAogICA8Yj5kbyB0aGlzIGh0bWwgcm93IGZvciBlYWNoIGF0dHJpYnV0ZSAoaW5jbHVkaW5nIGluaGVyaXRlZCBhdHRyaWJ1dGVzKTwvYj4KICAgJmx0O3RyJmd0OwotICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7Y2xhc3NuYW1lJmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O3RoZSBKYXZhIGNsYXNzIHRvIGV4ZWN1dGUuJmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiJmd0O0VpdGhlciBqYXIgb3IgY2xhc3NuYW1lJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQmZ3Q7Y2xhc3NuYW1lJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQmZ3Q7dGhlIEphdmEgY2xhc3MgdG8gZXhlY3V0ZS4mbHQ7L3RkJmd0OworICAgICZsdDt0ZCZndDtFaXRoZXIgamFyIG9yIGNsYXNzbmFtZSZsdDsvdGQmZ3Q7CiAgICZsdDsvdHImZ3Q7CiAKICZsdDsvdGFibGUmZ3Q7CkBAIC02MjYsNDYgKzU4MCw0NSBAQAogPGI+V2hhdCBzaG91bGQgdGhhdCBleGFtcGxlIGRvPzwvYj4KIAogJmx0Oy9ib2R5Jmd0OwotJmx0Oy9odG1sJmd0OwotPC9wcmU+CismbHQ7L2h0bWwmZ3Q7PC9wcmU+CiAKIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBkb2N1bWVudGF0aW9uIHBhZ2UgZm9yIG91ciB0YXNrOjwvcD4KLTxwcmUgY2xhc3M9ImNvZGUiPgotJmx0O2h0bWwmZ3Q7Cis8cHJlPgorJmx0OyFET0NUWVBFIGh0bWwmZ3Q7CismbHQ7aHRtbCBsYW5nPSZxdW90O2VuJnF1b3Q7Jmd0OwogCiAmbHQ7aGVhZCZndDsKLSZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtTGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuLXVzIiZndDsKICZsdDt0aXRsZSZndDtGaW5kIFRhc2smbHQ7L3RpdGxlJmd0OwogJmx0Oy9oZWFkJmd0OwogCiAmbHQ7Ym9keSZndDsKIAotJmx0O2gyJmd0OyZsdDthIG5hbWU9ImZpbmQiJmd0O0ZpbmQmbHQ7L2EmZ3Q7Jmx0Oy9oMiZndDsKKyZsdDtoMiBpZD0iZmluZCImZ3Q7RmluZCZsdDsvaDImZ3Q7CiAmbHQ7aDMmZ3Q7RGVzY3JpcHRpb24mbHQ7L2gzJmd0OwotJmx0O3AmZ3Q7U2VhcmNocyBpbiBhIGdpdmVuIHBhdGggZm9yIGEgZmlsZSBhbmQgcmV0dXJucyB0aGUgYWJzb2x1dGUgdG8gaXQgYXMgcHJvcGVydHkuCismbHQ7cCZndDtTZWFyY2hlcyBpbiBhIGdpdmVuIHBhdGggZm9yIGEgZmlsZSBhbmQgcmV0dXJucyB0aGUgYWJzb2x1dGUgdG8gaXQgYXMgcHJvcGVydHkuCiBJZiBkZWxpbWl0ZXIgaXMgc2V0IHRoaXMgdGFzayByZXR1cm5zIGFsbCBmb3VuZCBsb2NhdGlvbnMuJmx0Oy9wJmd0OwogCiAmbHQ7aDMmZ3Q7UGFyYW1ldGVycyZsdDsvaDMmZ3Q7Ci0mbHQ7dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiJmd0OworJmx0O3RhYmxlIGNsYXNzPSZxdW90O2F0dHImcXVvdDsmZ3Q7CiAgICZsdDt0ciZndDsKLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0OyZsdDtiJmd0O0F0dHJpYnV0ZSZsdDsvYiZndDsmbHQ7L3RkJmd0OwotICAgICZsdDt0ZCB2YWxpZ249InRvcCImZ3Q7Jmx0O2ImZ3Q7RGVzY3JpcHRpb24mbHQ7L2ImZ3Q7Jmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiJmd0OyZsdDtiJmd0O1JlcXVpcmVkJmx0Oy9iJmd0OyZsdDsvdGQmZ3Q7CisgICAgJmx0O3RoIHNjb3BlPSZxdW90O2NvbCZxdW90OyZndDtBdHRyaWJ1dGUmbHQ7L3RoJmd0OworICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7RGVzY3JpcHRpb24mbHQ7L3RoJmd0OworICAgICZsdDt0aCBzY29wZT0mcXVvdDtjb2wmcXVvdDsmZ3Q7UmVxdWlyZWQmbHQ7L3RoJmd0OwogICAmbHQ7L3RyJmd0OwogICAmbHQ7dHImZ3Q7Ci0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDtmaWxlJmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O1RoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHNlYXJjaC4mbHQ7L3RkJmd0OwotICAgICZsdDt0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCImZ3Q7eWVzJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQmZ3Q7ZmlsZSZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O1RoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHNlYXJjaC4mbHQ7L3RkJmd0OworICAgICZsdDt0ZCZndDt5ZXMmbHQ7L3RkJmd0OwogICAmbHQ7L3RyJmd0OwogICAmbHQ7dHImZ3Q7Ci0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDtsb2NhdGlvbiZsdDsvdGQmZ3Q7Ci0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDtUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hlcmUgdG8gc3RvcmUgdGhlIGxvY2F0aW9uJmx0Oy90ZCZndDsKLSAgICAmbHQ7dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiJmd0O3llcyZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O2xvY2F0aW9uJmx0Oy90ZCZndDsKKyAgICAmbHQ7dGQmZ3Q7VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdoZXJlIHRvIHN0b3JlIHRoZSBsb2NhdGlvbiZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O3llcyZsdDsvdGQmZ3Q7CiAgICZsdDsvdHImZ3Q7CiAgICZsdDt0ciZndDsKLSAgICAmbHQ7dGQgdmFsaWduPSJ0b3AiJmd0O2RlbGltaXRlciZsdDsvdGQmZ3Q7Ci0gICAgJmx0O3RkIHZhbGlnbj0idG9wIiZndDtBIGRlbGltaXRlciB0byB1c2Ugd2hlbiByZXR1cm5pbmcgdGhlIGxpc3QmbHQ7L3RkJmd0OwotICAgICZsdDt0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCImZ3Q7b25seSBpZiB0aGUgbGlzdCBpcyByZXF1aXJlZCZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O2RlbGltaXRlciZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O0EgZGVsaW1pdGVyIHRvIHVzZSB3aGVuIHJldHVybmluZyB0aGUgbGlzdCZsdDsvdGQmZ3Q7CisgICAgJmx0O3RkJmd0O29ubHkgaWYgdGhlIGxpc3QgaXMgcmVxdWlyZWQmbHQ7L3RkJmd0OwogICAmbHQ7L3RyJmd0OwogJmx0Oy90YWJsZSZndDsKIApAQCAtNjc2LDMxOCArNjI5LDI1MCBAQAogCiAmbHQ7aDMmZ3Q7RXhhbXBsZXMmbHQ7L2gzJmd0OwogJmx0O3ByZSZndDsKLSAgICAmbHQ7ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jIiZndDsKLSAgICAgICAgJmx0O3BhdGgmZ3Q7Ci0gICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9Ii8mZ3Q7Ci0gICAgICAgICZsdDtwYXRoJmd0OwotICAgICZsdDsvZmluZCZndDsKLSZsdDsvcHJlJmd0OwotU2VhcmNoZXMgaW4gQW50cyBob21lIGRpcmVjdG9yeSBmb3IgYSBmaWxlICZsdDtpJmd0O2FudC5qYXImbHQ7L2kmZ3Q7IGFuZCBzdG9yZXMgaXRzIGxvY2F0aW9uIGluCi1wcm9wZXJ0eSAmbHQ7aSZndDtsb2MmbHQ7L2kmZ3Q7IChzaG91bGQgYmUgQU5UX0hPTUUvYmluL2FudC5qYXIpLgorJmx0O2ZpbmQgZmlsZT0iYW50LmphciIgbG9jYXRpb249ImxvYyImZ3Q7CisgICAgJmx0O3BhdGgmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iLyZndDsKKyAgICAmbHQ7cGF0aCZndDsKKyZsdDsvZmluZCZndDsmbHQ7L3ByZSZndDsKK1NlYXJjaGVzIGluIEFudCdzIGhvbWUgZGlyZWN0b3J5IGZvciBhIGZpbGUgJmx0O3NhbXAmZ3Q7YW50LmphciZsdDsvc2FtcCZndDsgYW5kIHN0b3JlcyBpdHMgbG9jYXRpb24gaW4KK3Byb3BlcnR5ICZsdDtjb2RlJmd0O2xvYyZsdDsvY29kZSZndDsgKHNob3VsZCBiZSAmbHQ7c2FtcCZndDtBTlRfSE9NRS9iaW4vYW50LmphciZsdDsvc2FtcCZndDspLgogCiAmbHQ7cHJlJmd0OwotICAgICZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2MiIGRlbGltaXRlcj0iOyImZ3Q7Ci0gICAgICAgICZsdDtwYXRoJmd0OwotICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJDOi8iLyZndDsKLSAgICAgICAgJmx0O3BhdGgmZ3Q7Ci0gICAgJmx0Oy9maW5kJmd0OwotICAgICZsdDtlY2hvJmd0O2FudC5qYXIgZm91bmQgaW46ICR7bG9jfSZsdDsvZWNobyZndDsKLSZsdDsvcHJlJmd0OwotU2VhcmNoZXMgaW4gV2luZG93cyBDOiBkcml2ZSBmb3IgYWxsICZsdDtpJmd0O2FudC5qYXImbHQ7L2kmZ3Q7IGFuZCBzdG9yZXMgdGhlaXIgbG9jYXRpb25zIGluCi1wcm9wZXJ0eSAmbHQ7aSZndDtsb2MmbHQ7L2kmZ3Q7IGRlbGltaXRlZCB3aXRoICZsdDtpJmd0Oyc7JyZsdDsvaSZndDsuIChzaG91bGQgbmVlZCBhIGxvbmcgdGltZSA6LSkKLUFmdGVyIHRoYXQgaXQgcHJpbnRzIG91dCB0aGUgcmVzdWx0IChlLmcuIEM6L2FudC0xLjUuNC9iaW4vYW50LmphcjtDOi9hbnQtMS42L2Jpbi9hbnQuamFyKS4KKyZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2MiIGRlbGltaXRlcj0iOyImZ3Q7CisgICAgJmx0O3BhdGgmZ3Q7CisgICAgICAgICZsdDtmaWxlc2V0IGRpcj0iQzovIi8mZ3Q7CisgICAgJmx0O3BhdGgmZ3Q7CismbHQ7L2ZpbmQmZ3Q7CismbHQ7ZWNobyZndDthbnQuamFyIGZvdW5kIGluOiAke2xvY30mbHQ7L2VjaG8mZ3Q7Jmx0Oy9wcmUmZ3Q7CitTZWFyY2hlcyBpbiBXaW5kb3dzIEM6IGRyaXZlIGZvciBhbGwgJmx0O3NhbXAmZ3Q7YW50LmphciZsdDsvc2FtcCZndDsgYW5kIHN0b3JlcyB0aGVpciBsb2NhdGlvbnMgaW4KK3Byb3BlcnR5ICZsdDtjb2RlJmd0O2xvYyZsdDsvY29kZSZndDsgZGVsaW1pdGVkIHdpdGggJmx0O3EmZ3Q7OyZsdDsvcSZndDsuIChzaG91bGQgbmVlZCBhIGxvbmcgdGltZSA6LSkKK0FmdGVyIHRoYXQgaXQgcHJpbnRzIG91dCB0aGUgcmVzdWx0IChlLmcuICZsdDtzYW1wJmd0O0M6L2FudC0xLjUuNC9iaW4vYW50LmphcjtDOi9hbnQtMS42L2Jpbi9hbnQuamFyJmx0Oy9zYW1wJmd0OykuCiAKICZsdDsvYm9keSZndDsKLSZsdDsvaHRtbCZndDsKLTwvcHJlPgorJmx0Oy9odG1sJmd0OzwvcHJlPgogCi0KLTxoMj48YSBuYW1lPSJjb250cmlidXRlIj5Db250cmlidXRlIHRoZSBuZXcgdGFzazwvYT48L2gyPgotSWYgd2UgZGVjaWRlIHRvIGNvbnRyaWJ1dGUgb3VyIHRhc2ssIHdlIHNob3VsZCBkbyBzb21lIHRoaW5nczo8dWw+Cis8aDIgaWQ9ImNvbnRyaWJ1dGUiPkNvbnRyaWJ1dGUgdGhlIG5ldyB0YXNrPC9oMj4KKzxwPklmIHdlIGRlY2lkZSB0byBjb250cmlidXRlIG91ciB0YXNrLCB3ZSBzaG91bGQgZG8gc29tZSB0aGluZ3M6PC9wPgorPHVsPgogPGxpPmlzIG91ciB0YXNrIHdlbGNvbWU/IDotKSBTaW1wbHkgYXNrIG9uIHRoZSB1c2VyIGxpc3Q8L2xpPgotPGxpPmlzIHRoZSByaWdodCBwYWNrYWdlIHVzZWQ/IDwvbGk+Cis8bGk+aXMgdGhlIHJpZ2h0IHBhY2thZ2UgdXNlZD88L2xpPgogPGxpPmRvZXMgdGhlIGNvZGUgY29uZm9ybSB0byB0aGUgc3R5bGVndWlkZT88L2xpPgotPGxpPmRvIGFsbCB0ZXN0cyBwYXNzPyA8L2xpPgotPGxpPmRvZXMgdGhlIGNvZGUgY29tcGlsZSBvbiBKREsgMS4yIChhbmQgcGFzc2VzIGFsbCB0ZXN0cyB0aGVyZSk/PC9saT4KKzxsaT5kbyBhbGwgdGVzdHMgcGFzcz88L2xpPgorPGxpPmRvZXMgdGhlIGNvZGUgY29tcGlsZSBvbiBKREsgNSAoYW5kIHBhc3NlcyBhbGwgdGVzdHMgdGhlcmUpPzwvbGk+CiA8bGk+Y29kZSB1bmRlciBBcGFjaGUgbGljZW5zZTwvbGk+CiA8bGk+Y3JlYXRlIGEgcGF0Y2ggZmlsZTwvbGk+CiA8bGk+cHVibGlzaGluZyB0aGF0IHBhdGNoIGZpbGU8L2xpPgogPC91bD4KLVRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIj5BbnQgVGFzayBHdWlkZWxpbmVzIFs2XTwvYT4gc3VwcG9ydCBhZGRpdGlvbmFsCi1pbmZvcm1hdGlvbiBvbiB0aGF0LjwvcD4KKzxwPlRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5BbnQgVGFzayBHdWlkZWxpbmVzIFs2XTwvYT4gc3VwcG9ydAorYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGF0LjwvcD4KIAotPHA+Tm93IHdlIHdpbGwgY2hlY2sgdGhlICJDaGVja2xpc3QgYmVmb3JlIHN1Ym1pdHRpbmcgYSBuZXcgdGFzayIgZGVzY3JpYmVkIGluIHRoYXQgZ3VpZGVsaW5lLgorPHA+Tm93IHdlIHdpbGwgY2hlY2sgdGhlICJDaGVja2xpc3QgYmVmb3JlIHN1Ym1pdHRpbmcgYSBuZXcgdGFzayIgZGVzY3JpYmVkIGluIHRoYXQgZ3VpZGVsaW5lLjwvcD4KIDx1bD4KLTxsaT5KYXZhIGZpbGUgYmVnaW5zIHdpdGggQXBhY2hlIGxpY2Vuc2Ugc3RhdGVtZW50LiA8Yj48aT5tdXN0IGRvIHRoYXQ8L2k+PC9iPjwvbGk+Ci08bGk+VGFzayBkb2VzIG5vdCBkZXBlbmQgb24gR1BMIG9yIExHUEwgY29kZS4gPGI+PGk+b2s8L2k+PC9iPjwvbGk+Ci08bGk+U291cmNlIGNvZGUgY29tcGxpZXMgd2l0aCBzdHlsZSBndWlkZWxpbmVzIDxiPjxpPmhhdmUgdG8gY2hlY2sgKGNoZWNrc3R5bGUpPC9pPjwvYj48L2xpPgotPGxpPkNvZGUgY29tcGlsZXMgYW5kIHJ1bnMgb24gSmF2YTEuMiA8Yj48aT5oYXZlIHRvIHRyeTwvaT48L2I+PC9saT4KLTxsaT5NZW1iZXIgdmFyaWFibGVzIGFyZSBwcml2YXRlLCBhbmQgcHJvdmlkZSBwdWJsaWMgYWNjZXNzb3IgbWV0aG9kcwotICAgICAgICBpZiBhY2Nlc3MgaXMgYWN0dWFsbHkgbmVlZGVkLiA8Yj48aT5oYXZlIHRvIGNoZWNrIChjaGVja3N0eWxlKTwvaT48L2I+PC9saT4KLTxsaT48aT5NYXliZTwvaT4gVGFzayBoYXMgZmFpbG9uZXJyb3IgYXR0cmlidXRlIHRvIGNvbnRyb2wgZmFpbHVyZSBiZWhhdmlvdXIgPGI+PGk+aGFzbid0PC9pPjwvYj48L2xpPgotPGxpPk5ldyB0ZXN0IGNhc2VzIHdyaXR0ZW4gYW5kIHN1Y2NlZWQgPGI+PGk+cGFzc2VkIG9uIEpESyAxLjQsIGhhdmUgdG8gdHJ5IG9uIEpESyAxLjI8L2k+PC9iPjwvbGk+Ci08bGk+RG9jdW1lbnRhdGlvbiBwYWdlIHdyaXR0ZW4gPGI+PGk+b2s8L2k+PC9iPjwvbGk+Ci08bGk+RXhhbXBsZSB0YXNrIGRlY2xhcmF0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiB0ZXN0ZWQuIDxiPjxpPm9rICh1c2VkIGluIHRlc3RzKTwvaT48L2I+PC9saT4KLTxsaT5QYXRjaCBmaWxlcyBnZW5lcmF0ZWQgdXNpbmcgY3ZzIGRpZmYgLXUgPGI+PGk+dG8gZG88L2k+PC9iPjwvbGk+Ci08bGk+cGF0Y2ggZmlsZXMgaW5jbHVkZSBhIHBhdGNoIHRvIGRlZmF1bHRzLnByb3BlcnRpZXMgdG8gcmVnaXN0ZXIgdGhlCi10YXNrcyA8Yj48aT50byBkbzwvaT48L2I+PC9saT4KLTxsaT5wYXRjaCBmaWxlcyBpbmNsdWRlIGEgcGF0Y2ggdG8gdGFza2xpc3QuaHRtbCB0byBsaW5rIHRvIHRoZSBuZXcgdGFzayBwYWdlIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgotPGxpPk1lc3NhZ2UgdG8gZGV2IGNvbnRhaW5zIFtTVUJNSVRdIGFuZCB0YXNrIG5hbWUgaW4gc3ViamVjdCA8Yj48aT50byBkbzwvaT48L2I+PC9saT4KLTxsaT5NZXNzYWdlIGJvZHkgY29udGFpbnMgYSByYXRpb25hbGUgZm9yIHRoZSB0YXNrIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgotPGxpPk1lc3NhZ2UgYXR0YWNobWVudHMgY29udGFpbiB0aGUgcmVxdWlyZWQgZmlsZXMgLXNvdXJjZSwgZG9jdW1lbnRhdGlvbiwKLXRlc3QgYW5kIHBhdGNoZXMgemlwcGVkIHVwIHRvIGVzY2FwZSB0aGUgSFRNTCBmaWx0ZXIuIDxiPjxpPnRvIGRvPC9pPjwvYj48L2xpPgorPGxpPkphdmEgZmlsZSBiZWdpbnMgd2l0aCBBcGFjaGUgbGljZW5zZSBzdGF0ZW1lbnQuIDxzdHJvbmc+PGVtPm11c3QgZG8gdGhhdDwvZW0+PC9zdHJvbmc+PC9saT4KKzxsaT5UYXNrIGRvZXMgbm90IGRlcGVuZCBvbiBHUEwgb3IgTEdQTCBjb2RlLiA8c3Ryb25nPjxlbT5vazwvZW0+PC9zdHJvbmc+PC9saT4KKzxsaT5Tb3VyY2UgY29kZSBjb21wbGllcyB3aXRoIHN0eWxlIGd1aWRlbGluZXMgPHN0cm9uZz48ZW0+aGF2ZSB0byBjaGVjayAoY2hlY2tzdHlsZSk8L2VtPjwvc3Ryb25nPjwvbGk+Cis8bGk+Q29kZSBjb21waWxlcyBhbmQgcnVucyBvbiBKYXZhIDUgPHN0cm9uZz48ZW0+aGF2ZSB0byB0cnk8L2VtPjwvc3Ryb25nPjwvbGk+Cis8bGk+TWVtYmVyIHZhcmlhYmxlcyBhcmUgcHJpdmF0ZSwgYW5kIHByb3ZpZGUgcHVibGljIGFjY2Vzc29yIG1ldGhvZHMgaWYgYWNjZXNzIGlzIGFjdHVhbGx5IG5lZWRlZC4gPHN0cm9uZz48ZW0+aGF2ZSB0bworY2hlY2sgKGNoZWNrc3R5bGUpPC9lbT48L3N0cm9uZz48L2xpPgorPGxpPjxlbT5NYXliZTwvZW0+IFRhc2sgaGFzIDx2YXI+ZmFpbG9uZXJyb3I8L3Zhcj4gYXR0cmlidXRlIHRvIGNvbnRyb2wgZmFpbHVyZQorYmVoYXZpb3VyIDxzdHJvbmc+PGVtPmhhc24ndDwvZW0+PC9zdHJvbmc+PC9saT4KKzxsaT5OZXcgdGVzdCBjYXNlcyB3cml0dGVuIGFuZCBzdWNjZWVkIDxzdHJvbmc+PGVtPnBhc3NlZCBvbiBKREsgOCwgaGF2ZSB0byB0cnkgb24gSkRLIDU8L2VtPjwvc3Ryb25nPjwvbGk+Cis8bGk+RG9jdW1lbnRhdGlvbiBwYWdlIHdyaXR0ZW4gPHN0cm9uZz48ZW0+b2s8L2VtPjwvc3Ryb25nPjwvbGk+Cis8bGk+RXhhbXBsZSB0YXNrIGRlY2xhcmF0aW9ucyBpbiB0aGUgZG9jdW1lbnRhdGlvbiB0ZXN0ZWQuIDxzdHJvbmc+PGVtPm9rICh1c2VkIGluIHRlc3RzKTwvZW0+PC9zdHJvbmc+PC9saT4KKzxsaT5NZXNzYWdlIHRvIGRldiBjb250YWlucyBbU1VCTUlUXSBhbmQgdGFzayBuYW1lIGluIHN1YmplY3QgPHN0cm9uZz48ZW0+dG8gZG88L2VtPjwvc3Ryb25nPjwvbGk+Cis8bGk+TWVzc2FnZSBib2R5IGNvbnRhaW5zIGEgcmF0aW9uYWxlIGZvciB0aGUgdGFzayA8c3Ryb25nPjxlbT50byBkbzwvZW0+PC9zdHJvbmc+PC9saT4KKzxsaT5NZXNzYWdlIGJvZHkgY29udGFpbnMgdGhlIFVSTCB0byBHaXRIdWIgcHVsbCByZXF1ZXN0LiA8c3Ryb25nPjxlbT50byBkbzwvZW0+PC9zdHJvbmc+PC9saT4KIDwvdWw+CiAKLQogPGgzPlBhY2thZ2UgLyBEaXJlY3RvcmllczwvaDM+Ci08cD5UaGlzIHRhc2sgZG9lcyBub3QgZGVwZW5kIG9uIGFueSBleHRlcm5hbCBsaWJyYXJ5LiBUaGVyZWZvcmUgd2UgY2FuIHVzZSB0aGlzIGFzCi1hIGNvcmUgdGFzay4gVGhpcyB0YXNrIGNvbnRhaW5zIG9ubHkgb25lIGNsYXNzLiBTbyB3ZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCBwYWNrYWdlCi1mb3IgY29yZSB0YXNrczogPHR0Pm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzPC90dD4uIEltcGxlbWVudGF0aW9ucyBhcmUgaW4gdGhlCi1kaXJlY3RvcnkgPHR0PnNyYy9tYWluPC90dD4sIHRlc3RzIGluIDx0dD5zcmMvdGVzdGNhc2VzPC90dD4gYW5kIGJ1aWxkZmlsZXMgZm9yCi10ZXN0cyBpbiA8dHQ+c3JjL2V0Yy90ZXN0Y2FzZXM8L3R0Pi48L3A+Cis8cD5UaGlzIHRhc2sgZG9lcyBub3QgZGVwZW5kIG9uIGFueSBleHRlcm5hbCBsaWJyYXJ5LiBUaGVyZWZvcmUgd2UgY2FuIHVzZSB0aGlzIGFzIGEgY29yZSB0YXNrLiBUaGlzIHRhc2sgY29udGFpbnMgb25seQorb25lIGNsYXNzLiBTbyB3ZSBjYW4gdXNlIHRoZSBzdGFuZGFyZCBwYWNrYWdlIGZvciBjb3JlCit0YXNrczogPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzPC9jb2RlPi4gSW1wbGVtZW50YXRpb25zIGFyZSBpbiB0aGUKK2RpcmVjdG9yeSA8c2FtcD5zcmMvbWFpbjwvc2FtcD4sIHRlc3RzIGluIDxzYW1wPnNyYy90ZXN0Y2FzZXM8L3NhbXA+IGFuZCBidWlsZGZpbGVzIGZvciB0ZXN0cworaW4gPHNhbXA+c3JjL2V0Yy90ZXN0Y2FzZXM8L3NhbXA+LjwvcD4KIAotPHA+Tm93IHdlIGludGVncmF0ZSBvdXIgd29yayBpbnRvIEFudHMgZGlzdHJpYnV0aW9uLiBTbyBmaXJzdCB3ZSBkbyBhbiB1cGRhdGUgb2Ygb3VyCi1jdnMgdHJlZS4gSWYgbm90IGRvbmUgeWV0LCB5b3UgaGF2ZSB0byBjaGVja291dCB0aGUgYW50IG1vZHVsZSBmcm9tIEFwYWNoZXMgY3ZzIHNlcnZlcgotYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9jdnMuaHRtbCI+QWNjZXNzIHRoZSBTb3VyY2UgVHJlZSAoQW5vbkNWUykKLVs3XTwvYT4gKHBhc3N3b3JkIGlzIDxpPmFub25jdnM8L2k+KTo8cHJlIGNsYXNzPSJvdXRwdXQiPgotY3ZzIC1kIDpwc2VydmVyOmFub25jdnNAY3ZzLmFwYWNoZS5vcmc6L2hvbWUvY3ZzcHVibGljIGxvZ2luICAgICAgICAgICAgICAgICAvLzEKLWN2cyAtZCA6cHNlcnZlcjphbm9uY3ZzQGN2cy5hcGFjaGUub3JnOi9ob21lL2N2c3B1YmxpYyBjaGVja291dCBhbnQgICAgICAgICAgLy8yCi08L3ByZT4KLUlmIHlvdSBoYXZlIGEgbG9jYWwgY29weSBvZiBBbnRzIHNvdXJjZXMganVzdCBkbyBhbiB1cGRhdGUKLTxwcmUgY2xhc3M9Im91dHB1dCI+Ci1jdnMgLWQgOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgbG9naW4KLWNkIGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8zCi1jdnMgLWQgOnBzZXJ2ZXI6YW5vbmN2c0BjdnMuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgdXBkYXRlICAgICAgICAgICAgICAgIC8vNAotPC9wcmU+PC9wPgorPHA+Tm93IHdlIGludGVncmF0ZSBvdXIgd29yayBpbnRvIEFudCBkaXN0cmlidXRpb24uIFNvIGZpcnN0IHdlIGRvIGFuIHVwZGF0ZSBvZiBvdXIgR2l0IHRyZWUuIElmIG5vdCBkb25lIHlldCwgeW91CitzaG91bGQgY2xvbmUgdGhlIEFudCByZXBvc2l0b3J5IG9uIEdpdEh1Yls3XSwgdGhlbiBjcmVhdGUgYSBsb2NhbCBjbG9uZTo8L3A+Cis8cHJlIGNsYXNzPSJpbnB1dCI+Z2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS88ZW0+eW91ci1zaWc8L2VtPi9hbnQuZ2l0PC9wcmU+CiAKLTxwPldlIHVzZSB0aGUgPGk+LWQ8L2k+IGZsYWcgb24gPGI+Ly8xPC9iPiB0byBzcGVjaWZ5IHRoZSBjdnMgZGlyZWN0b3J5LiBZb3UgY2FuCi1zcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBDVlNST09UIHdpdGggdGhhdCB2YWx1ZSBhbmQgYWZ0ZXIgdGhhdCB5b3UgaGF2ZW7vv710Ci10byB1c2UgdGhhdCBmbGFnIGFueSBtb3JlLiBPbiA8Yj4vLzI8L2I+IHdlIGdldCB0aGUgd2hvbGUgY3ZzIHRyZWUgb2YgYW50LiAoU29ycnksCi1idXQgdGhhdCB1c2VzIGEgbG90IG9mIHRpbWUgLi4uIDEwIHVwIHRvIDMwIG1pbnV0ZXMgYXJlIG5vdCB1bnVzdWFsIC4uLiBidXQgdGhpcyBoYXMKLXRvIGJlIGRvbmUgb25seSBvbmNlIDotKS4gQSBjdnMgdXBkYXRlIGRvZXNuJ3QgdXNlIGEgbW9kdWxlbmFtZSBidXQgeW91IGhhdmUgdG8gYmUKLWluc2lkZSB0aGUgZGlyZWN0b3J5LiBUaGVyZWZvcmUgd2UgZ28gaW50byB0aGF0IG9uIDxiPi8vMzwvYj4gYW5kIGRvIHRoZSB1cGRhdGUKLW9uIDxiPi8vNDwvYj4uPC9wPgorPHA+Tm93IHdlIHdpbGwgYnVpbGQgb3VyIEFudCBkaXN0cmlidXRpb24gYW5kIGRvIGEgdGVzdC4gU28gd2UgY2FuIHNlZSBpZiB0aGVyZSBhcmUgYW55IHRlc3RzIGZhaWxpbmcgb24gb3VyCittYWNoaW5lLiAoV2UgY2FuIGlnbm9yZSB0aGVzZSBmYWlsaW5nIHRlc3RzIG9uIGxhdGVyIHN0ZXBzOyBXaW5kb3dzIHN5bnRheCB1c2VkIGhlcmUmbWRhc2g7dHJhbnNsYXRlIHRvIFVOSVggaWYKK25lZWRlZCk6PC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPgorQU5UUkVQTyZndDsgYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorQU5UUkVQTyZndDsgc2V0IEFOVF9IT01FPSVDRCVcZGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgorQU5UUkVQTyZndDsgYW50IHRlc3QgLUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2UgICAgICAgICAgICAgICAgICAgICAgLy8gMzwvcHJlPgogCi08cD5Ob3cgd2Ugd2lsbCBidWlsZCBvdXIgQW50IGRpc3RyaWJ1dGlvbiBhbmQgZG8gYSB0ZXN0LiBTbyB3ZSBjYW4gc2VlIGlmIHRoZXJlCi1hcmUgYW55IHRlc3RzIGZhaWxpbmcgb24gb3VyIG1hY2hpbmUuIChXZSBjYW4gaWdub3JlIHRoZXNlIGZhaWxpbmcgdGVzdHMgb24gbGF0ZXIKLXN0ZXBzOyB3aW5kb3dzIHN5bnRheCB1c2VkIGhlcmUtIHRyYW5zbGF0ZSB0byB4TklYIGlmIG5lZWRlZCk6Ci08cHJlIGNsYXNzPSJvdXRwdXQiPgotQU5USE9NRSZndDsgYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQotQU5USE9NRSZndDsgc2V0IEFOVF9IT01FPSVDRCVcZGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMgotQU5USE9NRSZndDsgYW50IHRlc3QgLUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2UgICAgICAgICAgICAgICAgICAgICAgLy8gMwotPC9wcmU+Cis8cD5GaXJzdCB3ZSBoYXZlIHRvIGJ1aWxkIG91ciBBbnQgZGlzdHJpYnV0aW9uICg8c3Ryb25nPi8vMTwvc3Ryb25nPikuIE9uIDxzdHJvbmc+Ly8yPC9zdHJvbmc+IHdlIHNldAordGhlIDxjb2RlPkFOVF9IT01FPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgY3JlYXRlZCBkaXN0cmlidXRpb24gaXMgc3RvcmVkCisoPGNvZGU+JUNEJTwvY29kZT4gaXMgZXhwYW5kZWQgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9uIFdpbmRvd3MgMjAwMCBhbmQgbGF0ZXIpLiBPbiA8c3Ryb25nPi8vMzwvc3Ryb25nPiB3ZSBsZXQgQW50CitkbyBhbGwgdGhlIHRlc3RzICh3aGljaCBlbmZvcmNlZCBhIGNvbXBpbGUgb2YgYWxsIHRlc3RzKSB3aXRob3V0IHN0b3BwaW5nIG9uIGZpcnN0IGZhaWx1cmUuPC9wPgogCi1GaXJzdCB3ZSBoYXZlIHRvIGJ1aWxkIG91ciBBbnQgZGlzdHJpYnV0aW9uICg8Yj4vLzE8L2I+KS4gT24gPGI+Ly8yPC9iPiB3ZSBzZXQgdGhlIEFOVF9IT01FCi1lbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBuZXcgY3JlYXRlZCBkaXN0cmlidXRpb24gaXMgc3RvcmVkCi0oJUNEJSBpcyBleHBhbmRlZCB0byB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb24gV2luZG93cyAyMDAwIGFuZCBYUCwgb24gOXggYW5kIE5UCi13cml0ZSBpdCBvdXQpLiBPbiA8Yj4vLzM8L2I+IHdlIGxldCBBbnQgZG8gYWxsIHRoZSB0ZXN0cyAod2hpY2ggZW5mb3JjZWQgYSBjb21waWxlCi1vZiBhbGwgdGVzdHMpIHdpdGhvdXQgc3RvcHBpbmcgb24gZmlyc3QgZmFpbHVyZS48L3A+Ci0KLTxwPk5leHQgd2UgYXBwbHkgb3VyIHdvcmsgb250byBBbnRzIHNvdXJjZXMuIEJlY2F1c2Ugd2UgaGF2ZW4ndCBtb2RpZmllZCBhbnksIHRoaXMgaXMKLWEgcmVsYXRpdmUgc2ltcGxlIHN0ZXAuIDxpPihCZWNhdXNlIEkgaGF2ZSBhIGxvY2FsIGNvcHkgb2YgQW50IGFuZCB1c3VhbGx5IGNvbnRyaWJ1dGUgbXkKLXdvcmssIEkgd29yayBvbiB0aGUgbG9jYWwgY29weSBqdXN0IGZyb20gdGhlIGJlZ2lubmluZy4gVGhlIGFkdmFudGFnZTogdGhpcyBzdGVwIGlzbid0Ci1uZWNlc3NhcnkgYW5kIHNhdmVzIGEgbG90IG9mIHdvcmsgaWYgeW91IG1vZGlmeSBleGlzdGluZyBzb3VyY2UgOi0pPC9pPi4KKzxwPk5leHQgd2UgYXBwbHkgb3VyIHdvcmsgb250byBBbnQgc291cmNlcy4gQmVjYXVzZSB3ZSBoYXZlbid0IG1vZGlmaWVkIGFueSwgdGhpcyBpcyBhIHJlbGF0aXZlbHkgc2ltcGxlCitzdGVwLiA8ZW0+KEJlY2F1c2UgSSBoYXZlIGEgbG9jYWwgR2l0IGNsb25lIG9mIEFudCBhbmQgdXN1YWxseSBjb250cmlidXRlIG15IHdvcmssIEkgd29yayBvbiB0aGUgbG9jYWwgY29weSBqdXN0IGZyb20KK3RoZSBiZWdpbm5pbmcuIFRoZSBhZHZhbnRhZ2U6IHRoaXMgc3RlcCBpc24ndCBuZWNlc3NhcnkgYW5kIHNhdmVzIGEgbG90IG9mIHdvcmsgaWYgeW91IG1vZGlmeSBleGlzdGluZyBzb3VyY2VzIDotKTwvZW0+LgogCiA8dWw+Ci08bGk+bW92ZSB0aGUgRmluZC5qYXZhIHRvIEFOVEhPTUUvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmluZC5qYXZhIDwvbGk+Ci08bGk+bW92ZSB0aGUgRmluZFRlc3QuamF2YSB0byBBTlRIT01FL3NyYy90ZXN0Y2FzZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmluZFRlc3QuamF2YSA8L2xpPgotPGxpPm1vdmUgdGhlIGJ1aWxkLnhtbCB0byBBTlRIT01FL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzLzxiPmZpbmQueG1sPC9iPiAoISEhIHJlbmFtZWQgISEhKTwvbGk+Ci08bGk+YWRkIGEgPHR0PnBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7PC90dD4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdHdvIGphdmEgZmlsZXMgPC9saT4KLTxsaT5kZWxldGUgYWxsIHN0dWZmIGZyb20gZmluZC54bWwga2VlcGluZyB0aGUgdGFyZ2V0cyAidGVzdEZpbGVOb3RQcmVzZW50IiwgInRlc3RGaWxlUHJlc2VudCIsCi0gICAgInRlc3QuaW5pdCIgYW5kICJ0ZXN0TXVsdGlwbGVGaWxlcyIgPC9saT4KLTxsaT5kZWxldGUgdGhlIGRlcGVuZGVuY3kgdG8gInVzZS5pbml0IiBpbiB0aGUgZmluZC54bWwgPC9saT4KLTxsaT5pbiBGaW5kVGVzdC5qYXZhIGNoYW5nZSB0aGUgbGluZSA8dHQ+Y29uZmlndXJlUHJvamVjdCgiYnVpbGQueG1sIik7PC90dD4gdG8KLSAgICA8dHQ+Y29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmluZC54bWwiKTs8L3R0PiA8L2xpPgotPGxpPm1vdmUgdGhlIGZpbmQuaHRtbCB0byBBTlRIT01FL2RvY3MvbWFudWFsL1Rhc2tzL2ZpbmQuaHRtbCA8L2xpPgotPGxpPmFkZCBhIDx0dD4mbHQ7YSBocmVmPSJUYXNrcy9maW5kLmh0bWwiJmd0O0ZpbmQmbHQ7L2EmZ3Q7Jmx0O2JyJmd0OzwvdHQ+Ci0gICAgaW4gdGhlIEFOVEhPTUUvZG9jcy9tYW51YWwvdGFza2xpc3QuaHRtbCA8L2xpPgorICAgIDxsaT5tb3ZlIHRoZSA8c2FtcD5GaW5kLmphdmE8L3NhbXA+IHRvIDxzYW1wPkFOVFJFUE8vc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmluZC5qYXZhPC9zYW1wPjwvbGk+CisgICAgPGxpPm1vdmUgdGhlIDxzYW1wPkZpbmRUZXN0LmphdmE8L3NhbXA+IHRvIDxzYW1wPkFOVFJFUE8vc3JjL3Rlc3RjYXNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaW5kVGVzdC5qYXZhPC9zYW1wPjwvbGk+CisgICAgPGxpPm1vdmUgdGhlIDxzYW1wPmJ1aWxkLnhtbDwvc2FtcD4gdG8gPHNhbXA+QU5UUkVQTy9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy88c3Ryb25nPmZpbmQueG1sPC9zdHJvbmc+PC9zYW1wPiAoISEhIHJlbmFtZWQgISEhKTwvbGk+CisgICAgPGxpPmFkZCBhIDxjb2RlPnBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7PC9jb2RlPiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0d28gamF2YSBmaWxlczwvbGk+CisgICAgPGxpPmRlbGV0ZSBhbGwgc3R1ZmYgZnJvbSA8c2FtcD5maW5kLnhtbDwvc2FtcD4ga2VlcGluZyB0aGUKKyAgICB0YXJnZXRzIDxxPnRlc3RGaWxlTm90UHJlc2VudDwvcT4sIDxxPnRlc3RGaWxlUHJlc2VudDwvcT4sIDxxPnRlc3QuaW5pdDwvcT4gYW5kIDxxPnRlc3RNdWx0aXBsZUZpbGVzPC9xPjwvbGk+CisgICAgPGxpPmRlbGV0ZSB0aGUgZGVwZW5kZW5jeSB0byA8cT51c2UuaW5pdDwvcT4gaW4gdGhlIDxzYW1wPmZpbmQueG1sPC9zYW1wPjwvbGk+CisgICAgPGxpPmluIDxzYW1wPkZpbmRUZXN0LmphdmE8L3NhbXA+IGNoYW5nZSB0aGUgbGluZSA8Y29kZT5jb25maWd1cmVQcm9qZWN0KCJidWlsZC54bWwiKTs8L2NvZGU+CisgICAgdG8gPGNvZGU+Y29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmluZC54bWwiKTs8L2NvZGU+PC9saT4KKyAgICA8bGk+bW92ZSB0aGUgPHNhbXA+ZmluZC5odG1sPC9zYW1wPiB0byA8c2FtcD5BTlRSRVBPL2RvY3MvbWFudWFsL1Rhc2tzL2ZpbmQuaHRtbDwvc2FtcD48L2xpPgorICAgIDxsaT5hZGQgYSA8Y29kZT4mbHQ7YSBocmVmPSJUYXNrcy9maW5kLmh0bWwiJmd0O0ZpbmQmbHQ7L2EmZ3Q7Jmx0O2JyJmd0OzwvY29kZT4gaW4KKyAgICB0aGUgPHNhbXA+QU5UUkVQTy9kb2NzL21hbnVhbC90YXNrbGlzdC5odG1sPC9zYW1wPjwvbGk+CiA8L3VsPgogCi1Ob3cgb3VyIG1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgYW5kIHdlIHdpbGwgcmV0ZXN0IGl0OgotPHByZSBjbGFzcz0ib3V0cHV0Ij4KLUFOVEhPTUUmZ3Q7IGJ1aWxkCi1BTlRIT01FJmd0OyBhbnQgcnVuLXNpbmdsZS10ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCis8cD5Ob3cgb3VyIG1vZGlmaWNhdGlvbnMgYXJlIGRvbmUgYW5kIHdlIHdpbGwgcmV0ZXN0IGl0OjwvcD4KKzxwcmUgY2xhc3M9ImlucHV0Ij4KK0FOVFJFUE8mZ3Q7IGJ1aWxkCitBTlRSRVBPJmd0OyBhbnQgcnVuLXNpbmdsZS10ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCiAgICAgICAgICAgICAgLUR0ZXN0Y2FzZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaW5kVGVzdCAgICAvLyAyCi0gICAgICAgICAgICAgLUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2UKLTwvcHJlPgotQmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gdGVzdCBvdXIgbmV3IGNsYXNzLCB3ZSB1c2UgdGhlIHRhcmdldCBmb3Igc2luZ2xlIHRlc3RzLCBzcGVjaWZ5Ci10aGUgdGVzdCB0byB1c2UgYW5kIGNvbmZpZ3VyZSBub3QgdG8gaGFsdCBvbiB0aGUgZmlyc3QgZmFpbHVyZSAtIHdlIHdhbnQgdG8gc2VlIGFsbAotZmFpbHVyZXMgb2Ygb3VyIG93biB0ZXN0ICg8Yj4vLzEgKyAyPC9iPikuPC9wPgorICAgICAgICAgICAgIC1EdGVzdC5oYWx0b25mYWlsdXJlPWZhbHNlPC9wcmU+Cis8cD5CZWNhdXNlIHdlIG9ubHkgd2FudCB0byB0ZXN0IG91ciBuZXcgY2xhc3MsIHdlIHVzZSB0aGUgdGFyZ2V0IGZvciBzaW5nbGUgdGVzdHMsIHNwZWNpZnkgdGhlIHRlc3QgdG8gdXNlIGFuZCBjb25maWd1cmUKK25vdCB0byBoYWx0IG9uIHRoZSBmaXJzdCBmYWlsdXJlJm1kYXNoO3dlIHdhbnQgdG8gc2VlIGFsbCBmYWlsdXJlcyBvZiBvdXIgb3duIHRlc3QgKDxzdHJvbmc+Ly8xICsgMjwvc3Ryb25nPikuPC9wPgogCi08cD5BbmQgLi4uIG9oLCBhbGwgdGVzdHMgZmFpbDogPGk+QW50IGNvdWxkIG5vdCBmaW5kIHRoZSB0YXNrIG9yIGEgY2xhc3MgdGhpcyB0YXNrIHJlbGllcyB1cG9uLjwvaT48L3A+Cis8cD5BbmQgLi4uIG9oLCBhbGwgdGVzdHMgZmFpbDogPGVtPkFudCBjb3VsZCBub3QgZmluZCB0aGUgdGFzayBvciBhIGNsYXNzIHRoaXMgdGFzayByZWxpZXMgdXBvbi48L2VtPjwvcD4KIAotPHA+T2s6IGluIHRoZSBlYXJsaWVyIHN0ZXBzIHdlIHRvbGQgQW50IHRvIHVzZSB0aGUgRmluZCBjbGFzcyBmb3IgdGhlIDxjb2RlPiZsdDtmaW5kJmd0OzwvY29kZT4gdGFzayAocmVtZW1iZXIgdGhlCi08Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IHN0YXRlbWVudCBpbiB0aGUgInVzZS5pbml0IiB0YXJnZXQpLiBCdXQgbm93IHdlIHdhbnQgdG8gaW50cm9kdWNlIHRoYXQgdGFzayBhcwotYSBjb3JlIHRhc2suIEFuZCBub2JvZHkgd2FudHMgdG8gdGFza2RlZiB0aGUgamF2YWMsIGVjaG8sIC4uLiBTbyB3aGF0IHRvIGRvPyBUaGUgYW5zd2VyIGlzIHRoZQotc3JjL21haW4vLi4uL3Rhc2tkZWZzL2RlZmF1bHQucHJvcGVydGllcy4gSGVyZSBpcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRhc2tuYW1lIGFuZCBpbXBsZW1lbnRpbmcKLWNsYXNzIGRvbmUuIFNvIHdlIGFkZCBhIDx0dD5maW5kPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkZpbmQ8L3R0PiBhcyB0aGUgbGFzdCBjb3JlCi10YXNrIChqdXN0IGJlZm9yZSB0aGUgPHR0PiMgb3B0aW9uYWwgdGFza3M8L3R0PiBsaW5lKS4gTm93IGEgc2Vjb25kIHRyeToKLTxwcmUgY2xhc3M9Im91dHB1dCI+Ci1BTlRIT01FJmd0OyBidWlsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxCi1BTlRIT01FJmd0OyBhbnQgcnVuLXNpbmdsZS10ZXN0Cis8cD5PazogaW4gdGhlIGVhcmxpZXIgc3RlcHMgd2UgdG9sZCBBbnQgdG8gdXNlIHRoZSBGaW5kIGNsYXNzIGZvciB0aGUgPGNvZGU+Jmx0O2ZpbmQmZ3Q7PC9jb2RlPiB0YXNrIChyZW1lbWJlcgordGhlIDxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4gc3RhdGVtZW50IGluIHRoZSA8cT51c2UuaW5pdDwvcT4gdGFyZ2V0KS4gQnV0IG5vdyB3ZSB3YW50IHRvIGludHJvZHVjZSB0aGF0IHRhc2sgYXMgYQorY29yZSB0YXNrLiBBbmQgbm9ib2R5IHdhbnRzIHRvIDxjb2RlPnRhc2tkZWY8L2NvZGU+IHRoZSA8Y29kZT5qYXZhYzwvY29kZT4sIDxjb2RlPmVjaG88L2NvZGU+LCAuLi4gU28gd2hhdCB0byBkbz8gVGhlCithbnN3ZXIgaXMgdGhlIDxzYW1wPnNyYy9tYWluLy4uLi90YXNrZGVmcy9kZWZhdWx0LnByb3BlcnRpZXM8L3NhbXA+LiBIZXJlIGlzIHRoZSBtYXBwaW5nIGJldHdlZW4gdGFza25hbWUgYW5kCitpbXBsZW1lbnRpbmcgY2xhc3MgZG9uZS4gU28gd2UgYWRkIGEgPGNvZGU+ZmluZD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5GaW5kPC9jb2RlPiBhcyB0aGUgbGFzdCBjb3JlIHRhc2sgKGp1c3QKK2JlZm9yZSB0aGUgPGNvZGU+IyBvcHRpb25hbCB0YXNrczwvY29kZT4gbGluZSkuIE5vdyBhIHNlY29uZCB0cnk6PC9wPgorPHByZSBjbGFzcz0iaW5wdXQiPgorQU5UUkVQTyZndDsgYnVpbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMQorQU5UUkVQTyZndDsgYW50IHJ1bi1zaW5nbGUtdGVzdAogICAgICAgICAgICAgIC1EdGVzdGNhc2U9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRmluZFRlc3QKLSAgICAgICAgICAgICAtRHRlc3QuaGFsdG9uZmFpbHVyZT1mYWxzZQotPC9wcmU+Ci1XZSBoYXZlIHRvIHJlYnVpbGQgKDxiPi8vMTwvYj4pIEFudCBiZWNhdXNlIHRoZSB0ZXN0IGxvb2sgaW4gdGhlICVBTlRfSE9NRSVcbGliXGFudC5qYXIKLShtb3JlIHByZWNpc2U6IG9uIHRoZSBjbGFzc3BhdGgpIGZvciB0aGUgcHJvcGVydGllcyBmaWxlLiBBbmQgd2UgaGF2ZSBvbmx5IG1vZGlmaWVkIGl0IGluIHRoZQotc291cmNlIHBhdGguIFNvIHdlIGhhdmUgdG8gcmVidWlsZCB0aGF0IGphci4gQnV0IG5vdyBhbGwgdGVzdHMgcGFzcyBhbmQgd2UgY2hlY2sgd2hldGhlciBvdXIgY2xhc3MKLWJyZWFrcyBzb21lIG90aGVyIHRlc3RzLgotPHByZSBjbGFzcz0ib3V0cHV0Ij4KLUFOVEhPTUUmZ3Q7IGFudCB0ZXN0IC1EdGVzdC5oYWx0b25mYWlsdXJlPWZhbHNlCi08L3ByZT4KLUJlY2F1c2UgdGhlcmUgYXJlIGEgbG90IG9mIHRlc3RzIHRoaXMgc3RlcCByZXF1aXJlcyBhIGxpdHRsZSBiaXQgb2YgdGltZS4gU28gdXNlIHRoZSA8aT5ydW4tc2luZ2xlLXRlc3Q8L2k+Ci1kdXJpbmcgZGV2ZWxvcG1lbnQgYW5kIGRvIHRoZSA8aT50ZXN0PC9pPiBvbmx5IGF0IHRoZSBlbmQgKG1heWJlIHNvbWV0aW1lcyBkdXJpbmcgZGV2ZWxvcG1lbnQgdG9vKS4KLVdlIHVzZSB0aGUgPGk+LUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2U8L2k+IGhlcmUgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlciB0ZXN0cyBmYWlsIGFuZCB3ZSBoYXZlCi10byBsb29rIGludG8gdGhlbS48L3A+CisgICAgICAgICAgICAgLUR0ZXN0LmhhbHRvbmZhaWx1cmU9ZmFsc2U8L3ByZT4KKzxwPldlIGhhdmUgdG8gcmVidWlsZCAoPHN0cm9uZz4vLzE8L3N0cm9uZz4pIEFudCBiZWNhdXNlIHRoZSB0ZXN0IGxvb2sgaW4gdGhlIDxzYW1wPiVBTlRfSE9NRSVcbGliXGFudC5qYXI8L3NhbXA+IChtb3JlCitwcmVjaXNlOiBvbiB0aGUgY2xhc3NwYXRoKSBmb3IgdGhlIHByb3BlcnRpZXMgZmlsZS4gQW5kIHdlIGhhdmUgb25seSBtb2RpZmllZCBpdCBpbiB0aGUgc291cmNlIHBhdGguIFNvIHdlIGhhdmUgdG8KK3JlYnVpbGQgdGhhdCBqYXIuIEJ1dCBub3cgYWxsIHRlc3RzIHBhc3MgYW5kIHdlIGNoZWNrIHdoZXRoZXIgb3VyIGNsYXNzIGJyZWFrcyBzb21lIG90aGVyIHRlc3RzLjwvcD4KKzxwcmUgY2xhc3M9ImlucHV0Ij5BTlRSRVBPJmd0OyBhbnQgdGVzdCAtRHRlc3QuaGFsdG9uZmFpbHVyZT1mYWxzZTwvcHJlPgorPHA+QmVjYXVzZSB0aGVyZSBhcmUgYSBsb3Qgb2YgdGVzdHMgdGhpcyBzdGVwIHJlcXVpcmVzIGEgbGl0dGxlIGJpdCBvZiB0aW1lLiBTbyB1c2UgdGhlIDxxPnJ1bi1zaW5nbGUtdGVzdDwvcT4gZHVyaW5nCitkZXZlbG9wbWVudCBhbmQgZG8gdGhlIDxxPnRlc3Q8L3E+IG9ubHkgYXQgdGhlIGVuZCAobWF5YmUgc29tZXRpbWVzIGR1cmluZyBkZXZlbG9wbWVudCB0b28pLiAgV2UgdXNlCit0aGUgPGtiZD4tRHRlc3QuaGFsdG9uZmFpbHVyZT1mYWxzZTwva2JkPiBoZXJlIGJlY2F1c2UgdGhlcmUgY291bGQgYmUgb3RoZXIgdGVzdHMgZmFpbCBhbmQgd2UgaGF2ZSB0byBsb29rIGludG8KK3RoZW0uPC9wPgogCi08cD5UaGlzIHRlc3QgcnVuIHNob3VsZCBzaG93IHVzIHR3byB0aGluZ3M6IG91ciB0ZXN0IHdpbGwgcnVuIGFuZCB0aGUgbnVtYmVyIG9mIGZhaWxpbmcgdGVzdHMKLWlzIHRoZSBzYW1lIGFzIGRpcmVjdGx5IGFmdGVyIHRoZSBjdnMgdXBkYXRlICh3aXRob3V0IG91ciBtb2RpZmljYXRpb25zKS48L3A+Ci0KLQorPHA+VGhpcyB0ZXN0IHJ1biBzaG91bGQgc2hvdyB1cyB0d28gdGhpbmdzOiBvdXIgdGVzdCB3aWxsIHJ1biBhbmQgdGhlIG51bWJlciBvZiBmYWlsaW5nIHRlc3RzIGlzIHRoZSBzYW1lIGFzIGRpcmVjdGx5CithZnRlciA8Y29kZT5naXQgY2xvbmU8L2NvZGU+ICh3aXRob3V0IG91ciBtb2RpZmljYXRpb25zKS48L3A+CiAKIDxoMz5BcGFjaGUgbGljZW5zZSBzdGF0ZW1lbnQ8L2gzPgogPHA+U2ltcGx5IGNvcHkgdGhlIGxpY2Vuc2UgdGV4dCBmcm9tIG9uZSB0aGUgb3RoZXIgc291cmNlIGZyb20gdGhlIEFudCBzb3VyY2UgdHJlZS48L3A+CiAKKzxoMz5UZXN0IG9uIEpESyA1PC9oMz4KKzxwPkFudCAxLjEwIHVzZXMgSmF2YSA4IGZvciBkZXZlbG9wbWVudCwgYnV0IEFudCAxLjkgaXMgYWN0aXZlbHkgbWFpbnRhaW5lZCwgdG9vLiAgVGhhdCBtZWFucyB0aGF0IEFudCBjb2RlIG11c3QgYmUgYWJsZQordG8gcnVuIG9uIGEgSkRLIDUuIFNvIHdlIGhhdmUgdG8gdGVzdCB0aGF0LiBZb3UgY2FuIGRvd25sb2FkIG9sZGVyIEpES3MKK2Zyb20gPGEgaHJlZj0iaHR0cHM6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2FyY2hpdmUtMTM5MjEwLmh0bWwiIHRhcmdldD0iX3RvcCI+T3JhY2xlIFs4XTwvYT4uPC9wPgogCi08aDM+VGVzdCBvbiBKREsgMS4yPC9oMz4KLTxwPlVudGlsIHZlcnNpb24gMS41IEFudCBtdXN0IGJlIGFibGUgdG8gcnVuIG9uIGEgSkRLIDEuMS4gV2l0aCB2ZXJzaW9uIDEuNiB0aGlzIGlzIG5vdCBhCi1yZXF1aXNpdGUgYW55IG1vcmUuIEJ1dCBKREsgMS4yIGlzIGEgbXVzdC10by13b3JrLXdpdGguIFNvIHdlIGhhdmUgdG8gdGVzdCB0aGF0LiBZb3UgY2FuIGRvd25sb2FkIG9sZGVyCi1KREtzIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvYXJjaGl2ZS0xMzkyMTAuaHRtbCI+T3JhY2xlIFs4XTwvYT4uPC9wPgotCi08cD5DbGVhbiB0aGUgQU5UX0hPTUUgdmFyaWFibGUsIGRlbGV0ZSB0aGUgPGk+YnVpbGQsIGJvb3RzdHJhcDwvaT4gYW5kIDxpPmRpc3Q8L2k+IGRpcmVjdG9yeQotYW5kIHBvaW50IEpBVkFfSE9NRSB0byB0aGUgSkRLIDEuMiBob21lIGRpcmVjdG9yeS4gVGhlbiBkbyB0aGUgPHR0PmJ1aWxkPC90dD4sIHNldCBBTlRfSE9NRQotYW5kIHJ1biA8dHQ+YW50IHRlc3Q8L3R0PiAobGlrZSBhYm92ZSkuPC9wPgorPHA+Q2xlYW4gdGhlIDxjb2RlPkFOVF9IT01FPC9jb2RlPiB2YXJpYWJsZSwgZGVsZXRlIHRoZSA8c2FtcD5idWlsZDwvc2FtcD4sIDxzYW1wPmJvb3RzdHJhcDwvc2FtcD4gYW5kIDxzYW1wPmRpc3Q8L3NhbXA+CitkaXJlY3RvcmllcywgYW5kIHBvaW50IDxjb2RlPkpBVkFfSE9NRTwvY29kZT4gdG8gdGhlIEpESyA1IGhvbWUgZGlyZWN0b3J5LiBUaGVuIGNyZWF0ZSB0aGUgcGF0Y2ggd2l0aCB5b3VyIGNvbW1pdCwKK2NoZWNrb3V0IDEuOS54IGJyYW5jaCBpbiBHaXQsIGFwcGx5IHlvdXIgcGF0Y2ggYW5kIGRvIHRoZSA8Y29kZT5idWlsZDwvY29kZT4sIHNldCA8Y29kZT5BTlRfSE9NRTwvY29kZT4gYW5kCitydW4gPGtiZD5hbnQgdGVzdDwva2JkPiAobGlrZSBhYm92ZSkuPC9wPgogCiA8cD5PdXIgdGVzdCBzaG91bGQgcGFzcy48L3A+CiAKLQotCiA8aDM+Q2hlY2tzdHlsZTwvaDM+Ci08cD5UaGVyZSBhcmUgbWFueSB0aGluZ3Mgd2UgaGF2ZSB0byBlbnN1cmUuIEluZGVudGF0aW9uIHdpdGggNCBzcGFjZXMsIGJsYW5rcyBoZXJlIGFuZCB0aGVyZSwgLi4uCi0oYWxsIGRlc2NyaWJlZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCI+QW50IFRhc2sgR3VpZGVsaW5lcyBbNl08L2E+IHdoaWNoCi1pbmNsdWRlcyB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvY29kZWNvbnZ0b2MtMTM2MDU3Lmh0bWwiPlN1biBjb2RlIHN0eWxlCi1bOV08L2E+KS4gQmVjYXVzZSB0aGVyZSBhcmUgc28gbWFueSB0aGluZ3Mgd2Ugd291bGQgYmUgaGFwcHkgdG8gaGF2ZSBhIHRvb2wgZm9yIGRvIHRoZSBjaGVja3MuCi1UaGVyZSBpcyBvbmU6IGNoZWNrc3R5bGUuIENoZWNrc3R5bGUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9jaGVja3N0eWxlLnNvdXJjZWZvcmdlLm5ldC8iPgotU291cmNlZm9yZ2UgWzEwXTwvYT4gYW5kIEFudCBwcm92aWRlcyB3aXRoIHRoZSA8dHQ+Y2hlY2sueG1sPC90dD4gYSBidWlsZGZpbGUgd2hpY2ggd2lsbCBkbyB0aGUgam9iCi1mb3IgdXMuPC9wPgorPHA+VGhlcmUgYXJlIG1hbnkgdGhpbmdzIHdlIGhhdmUgdG8gZW5zdXJlLiBJbmRlbnRhdGlvbiB3aXRoIDQgc3BhY2VzLCBibGFua3MgaGVyZSBhbmQgdGhlcmUsIC4uLiAgKGFsbCBkZXNjcmliZWQgaW4KK3RoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCIgdGFyZ2V0PSJfdG9wIj5BbnQgVGFzayBHdWlkZWxpbmVzIFs2XTwvYT4gd2hpY2ggaW5jbHVkZXMKK3RoZSA8YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvY29kZWNvbnZ0b2MtMTM2MDU3Lmh0bWwiIHRhcmdldD0iX3RvcCI+U3VuIGNvZGUgc3R5bGUKK1s5XTwvYT4pLiBCZWNhdXNlIHRoZXJlIGFyZSBzbyBtYW55IHRoaW5ncyB3ZSB3b3VsZCBiZSBoYXBweSB0byBoYXZlIGEgdG9vbCBmb3IgZG8gdGhlIGNoZWNrcy4gIFRoZXJlIGlzIG9uZToKK2NoZWNrc3R5bGUuIENoZWNrc3R5bGUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHBzOi8vY2hlY2tzdHlsZS5vcmcvIiB0YXJnZXQ9Il90b3AiPlNvdXJjZWZvcmdlIFsxMF08L2E+CithbmQgQW50IHByb3ZpZGVzIHdpdGggdGhlIDxzYW1wPmNoZWNrLnhtbDwvc2FtcD4gYSBidWlsZGZpbGUgd2hpY2ggd2lsbCBkbyB0aGUgam9iIGZvciB1cy48L3A+CiAKLTxwPkRvd25sb2FkIGl0IGFuZCBwdXQgdGhlIGNoZWNrc3R5bGUtKi1hbGwuamFyIGludG8geW91ciAlVVNFUlBST0ZJTEUlXC5hbnRcbGliIGRpcmVjdG9yeS4KLUFsbCBqYXIncyBzdG9yZWQgdGhlcmUgYXJlIGF2YWlsYWJsZSB0byBBbnQgc28geW91IGhhdmVuJ3QgdG8gYWRkIGl0IHRvIHlvdSAlQU5UX0hPTUUlXGxpYgotZGlyZWN0b3J5ICh0aGlzIGZlYXR1cmUgd2FzIGFkZGVkIHdpdGggQW50IDEuNikuPC9wPgorPHA+RG93bmxvYWQgaXQgYW5kIHB1dCB0aGUgPHNhbXA+Y2hlY2tzdHlsZS0qLWFsbC5qYXI8L3NhbXA+IGludG8geW91ciA8c2FtcD4lVVNFUlBST0ZJTEUlXC5hbnRcbGliPC9zYW1wPiBkaXJlY3RvcnkuCitBbGwgamFyJ3Mgc3RvcmVkIHRoZXJlIGFyZSBhdmFpbGFibGUgdG8gQW50IHNvIHlvdSBoYXZlbid0IHRvIGFkZCBpdCB0byB5b3UgPHNhbXA+JUFOVF9IT01FJVxsaWI8L3NhbXA+IGRpcmVjdG9yeSAodGhpcworZmVhdHVyZSBpcyBhdmFpbGFibGUgPGVtPnNpbmNlIEFudCAxLjY8L2VtPikuPC9wPgogCi08cD5TbyB3ZSB3aWxsIHJ1biB0aGUgdGVzdHMgd2l0aAotPHByZSBjbGFzcz0ib3V0cHV0Ij4KLUFOVEhPTUUmZ3Q7IGFudCAtZiBjaGVjay54bWwgY2hlY2tzdHlsZSBodG1scmVwb3J0Ci08L3ByZT4KLUkgcHJlZmVyIHRoZSBIVE1MIHJlcG9ydCBiZWNhdXNlIHRoZXJlIGFyZSBsb3RzIG9mIG1lc3NhZ2VzIGFuZCB3ZSBjYW4gbmF2aWdhdGUgZmFzdGVyLgotT3BlbiB0aGUgQU5USE9NRS9idWlsZC9yZXBvcnRzL2NoZWNrc3R5bGUvaHRtbC9pbmRleC5odG1sIGFuZCBuYXZpZ2F0ZSB0byB0aGUgRmluZC5qYXZhLiBOb3cgd2UKLXNlZSB0aGF0IHRoZXJlIGFyZSBzb21lIGVycm9yczogbWlzc2luZyB3aGl0ZXNwYWNlcywgdW51c2VkIGltcG9ydHMsIG1pc3NpbmcgamF2YWRvY3MuIFNvIHdlIGhhdmUKLXRvIGRvIHRoYXQuPC9wPgorPHA+U28gd2Ugd2lsbCBydW4gdGhlIHRlc3RzIHdpdGg8L3A+Cis8cHJlIGNsYXNzPSJpbnB1dCI+QU5UUkVQTyZndDsgYW50IC1mIGNoZWNrLnhtbCBjaGVja3N0eWxlIGh0bWxyZXBvcnQ8L3ByZT4KKzxwPkkgcHJlZmVyIHRoZSBIVE1MIHJlcG9ydCBiZWNhdXNlIHRoZXJlIGFyZSBsb3RzIG9mIG1lc3NhZ2VzIGFuZCB3ZSBjYW4gbmF2aWdhdGUgZmFzdGVyLiAgT3BlbgordGhlIDxzYW1wPkFOVFJFUE8vYnVpbGQvcmVwb3J0cy9jaGVja3N0eWxlL2h0bWwvaW5kZXguaHRtbDwvc2FtcD4gYW5kIG5hdmlnYXRlIHRvIHRoZSA8c2FtcD5GaW5kLmphdmE8L3NhbXA+LiBOb3cgd2Ugc2VlCit0aGF0IHRoZXJlIGFyZSBzb21lIGVycm9yczogbWlzc2luZyB3aGl0ZXNwYWNlcywgdW51c2VkIGltcG9ydHMsIG1pc3NpbmcgamF2YWRvY3MuIFNvIHdlIGhhdmUgdG8gZG8gdGhhdC48L3A+CiAKLTxwPkhpbnQ6IHN0YXJ0IGF0IHRoZSA8Yj5idXR0b208L2I+IG9mIHRoZSBmaWxlIHNvIHRoZSBsaW5lIG51bWJlcnMgaW4gdGhlIHJlcG9ydCB3aWxsIGtlZXAKLXVwIHRvIGRhdGUgYW5kIHlvdSB3aWxsIGZpbmQgdGhlIG5leHQgZXJyb3IgcGxhY2UgbXVjaCBtb3JlIGVhc2llciB3aXRob3V0IHJlZG9pbmcgdGhlIGNoZWNrc3R5bGUuPC9wPgorPHA+SGludDogc3RhcnQgYXQgdGhlIDxzdHJvbmc+Ym90dG9tPC9zdHJvbmc+IG9mIHRoZSBmaWxlIHNvIHRoZSBsaW5lIG51bWJlcnMgaW4gdGhlIHJlcG9ydCB3aWxsIGtlZXAgdXAgdG8gZGF0ZSBhbmQgeW91Cit3aWxsIGZpbmQgdGhlIG5leHQgZXJyb3IgcGxhY2UgbXVjaCBtb3JlIGVhc2llciB3aXRob3V0IHJlZG9pbmcgdGhlIGNoZWNrc3R5bGUuPC9wPgogCi08cD5BZnRlciBjbGVhbmluZyB1cCB0aGUgY29kZSBhY2NvcmRpbmcgdG8gdGhlIG1lc3NhZ2VzIHdlIGRlbGV0ZSB0aGUgcmVwb3J0cyBkaXJlY3RvcnkgYW5kCi1kbyBhIHNlY29uZCBjaGVja3N0eWxlIHJ1bi4gTm93IG91ciB0YXNrIGlzbid0IGxpc3RlZC4gVGhhdCdzIGZpbmUgOi0pPC9wPgotCi0KLQotPCEtLQotICBDb3VsZG50IGNyZWF0ZSB0aGUgZGlmZiB0aGF0IHdheSBmb3IgbXlzZWxmLCBidXQgdGhhdCBzaG91bGQgYmUgZG9jdW1lbnRlZC4KLSAgQnV0IG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgdHV0b3JpYWwgc2hvdWxkIG5vdCBiZSBmb3Jnb3R0ZW4gYW55IGxvbmdlciBzbyBJCi0gIGNvbW1lbnQgdGhhdCBvdXQuICBKSE0KLTxoMz5DcmVhdGluZyB0aGUgZGlmZjwvaDM+Ci08cD5DcmVhdGluZyBhIGRpZmYgZm9yIEFudCBpcyB2ZXJ5IGVhc3k6IGp1c3Qgc3RhcnQgPHR0PmFudCAtZiBwYXRjaC54bWw8L3R0PiBhbmQgYWxsIGlzIGRvbmUKLWF1dG9tYXRpY2FsbHkuIFRoaXMgc3RlcCByZXF1aXJlcyBhIGN2cyBleGVjdXRhYmxlIGluIHlvdXIgcGF0aCBhbmQgaW50ZXJuZXQgYWNjZXNzIChtb3JlIHByZWNpc2U6Ci1jdnMgYWNjZXNzKS4gQXMgYSByZXN1bHQgd2UgZ2V0IGEgZmlsZSA8aT4gVE9ETyA8L2k+LjwvcD4KLS0tPgotCis8cD5BZnRlciBjbGVhbmluZyB1cCB0aGUgY29kZSBhY2NvcmRpbmcgdG8gdGhlIG1lc3NhZ2VzIHdlIGRlbGV0ZSB0aGUgcmVwb3J0cyBkaXJlY3RvcnkgYW5kIGRvIGEgc2Vjb25kIGNoZWNrc3R5bGUKK3J1bi4gTm93IG91ciB0YXNrIGlzbid0IGxpc3RlZC4gVGhhdCdzIGZpbmUgOi0pPC9wPgogCiA8aDM+UHVibGlzaCB0aGUgdGFzazwvaDM+Ci08cD5GaW5hbGx5IHdlIHB1Ymxpc2ggdGhhdCBhcmNoaXZlLiBBcyBkZXNjcmliZWQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRfdGFza19ndWlkZWxpbmVzLmh0bWwiPgotQW50IFRhc2sgR3VpZGVsaW5lcyBbN108L2E+IHdlIGNhbiBwb3N0IGl0IG9uIHRoZSBkZXZlbG9wZXIgbWFpbGluZ2xpc3Qgb3Igd2UgY3JlYXRlIGEgQnVnWmlsbGEKLWVudHJ5LiBGb3IgYm90aCB3ZSBuZWVkIHNvbWUgaW5mb3JtYXRpb246PC9wPgorPHA+RmluYWxseSB3ZSBwdWJsaXNoIHRoYXQgYXJjaGl2ZS4gQXMgZGVzY3JpYmVkIGluIHRoZSA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCIKK3RhcmdldD0iX3RvcCI+QW50IFRhc2sgR3VpZGVsaW5lcyBbN108L2E+IHdlIGNhbiBhbm5vdW5jZSBpdCBvbiB0aGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCwgY3JlYXRlIGEgQnVnWmlsbGEgZW50cnkgYW5kCitvcGVuIGEgR2l0SHViIHB1bGwgcmVxdWVzdC4gRm9yIGJvdGggd2UgbmVlZCBzb21lIGluZm9ybWF0aW9uOjwvcD4KIAotPHRhYmxlIGJvcmRlcj0iMSI+Cis8dGFibGU+CiA8dHI+Ci0gIDx0aD5zdWJqZWN0PC90aD4KLSAgPHRkPjxpPnNob3J0IGRlc2NyaXB0aW9uPC9pPjwvdGQ+CisgIDx0aCBzY29wZT0icm93Ij5zdWJqZWN0PC90aD4KKyAgPHRkPjxlbT5zaG9ydCBkZXNjcmlwdGlvbjwvZW0+PC90ZD4KICAgPHRkPlRhc2sgZm9yIGZpbmRpbmcgZmlsZXMgaW4gYSBwYXRoPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0aD5ib2R5PC90aD4KLSAgPHRkPjxpPm1vcmUgZGV0YWlscyBhYm91dCB0aGUgcGF0aDwvaT48L3RkPgotICA8dGQ+VGhpcyBuZXcgdGFzayBsb29rcyBpbnNpZGUgYSBuZXN0ZWQgPGNvZGU+Jmx0O3BhdGgvJmd0OzwvY29kZT4gZm9yIG9jY3VycmVuY2VzIG9mIGEgZmlsZSBhbmQgc3RvcmVzCi0gICAgICBhbGwgbG9jYXRpb25zIGFzIGEgcHJvcGVydHkuIFNlZSB0aGUgaW5jbHVkZWQgbWFudWFsIGZvciBkZXRhaWxzLjwvdGQ+CisgIDx0aCBzY29wZT0icm93Ij5ib2R5PC90aD4KKyAgPHRkPjxlbT5tb3JlIGRldGFpbHMgYWJvdXQgdGhlIHBhdGg8L2VtPjwvdGQ+CisgIDx0ZD5UaGlzIG5ldyB0YXNrIGxvb2tzIGluc2lkZSBhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aC8mZ3Q7PC9jb2RlPiBmb3Igb2NjdXJyZW5jZXMgb2YgYSBmaWxlIGFuZCBzdG9yZXMgYWxsIGxvY2F0aW9ucworICAgICAgYXMgYSBwcm9wZXJ0eS4gU2VlIHRoZSBpbmNsdWRlZCBtYW51YWwgZm9yIGRldGFpbHMuPC90ZD4KIDwvdHI+CiA8dHI+Ci0gIDx0aD5hdHRhY2htZW50czwvdGg+Ci0gIDx0ZD48aT5hbGwgZmlsZXMgbmVlZGVkIHRvIGFwcGx5IHRoZSBwYXRoPC9pPjwvdGQ+Ci0gIDx0ZD5BcmNoaXZlIGNvbnRhaW5pbmcgYSBwYXRjaCB3aXRoIHRoZSBuZXcgYW5kIG1vZGlmaWVkIHJlc291cmNlczwvdGQ+CisgIDx0aCBzY29wZT0icm93Ij5wdWxsIHJlcXVlc3QgcmVmZXJlbmNlPC90aD4KKyAgPHRkPjxlbT5HaXRIdWIgcHVsbCByZXF1ZXN0IFVSTDwvZW0+PC90ZD4KKyAgPHRkPmh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvYW50L3B1bGwvMDwvdGQ+CiA8L3RyPgogPC90YWJsZT4KIAotPHA+U2VuZGluZyBhbiBlbWFpbCB3aXRoIHRoZXNlIGluZm9ybWF0aW9uIGlzIHZlcnkgZWFzeSBhbmQgSSB0aGluayBJIGhhdmVuJ3QgdG8gc2hvdyB0aGF0LgotVGhlIG90aGVyIHdheSAtIEJ1Z1ppbGxhIC0gaXMgc2xpZ2h0bHkgbW9yZSBkaWZmaWN1bHQuIEJ1dCBpdCBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGVudHJpZXMKLXdpbGwgbm90IGJlIGZvcmdvdHRlbiAob25jZSBwZXIgd2VlayBhIHJlcG9ydCBpcyBnZW5lcmF0ZWQpLiBTbyBJIHdpbGwgc2hvdyB0aGlzIHdheS48L3A+Cis8cD5TZW5kaW5nIGFuIGVtYWlsIHdpdGggdGhpcyBpbmZvcm1hdGlvbiBpcyB2ZXJ5IGVhc3kgYW5kIEkgdGhpbmsgSSBoYXZlbid0IHRvIGRlc2NyaWJlIHRoYXQuICBCdWdaaWxsYSBpcyBzbGlnaHRseQorbW9yZSBkaWZmaWN1bHQuICBCdXQgdGhlIGFkdmFudGFnZSBpcyB0aGF0IGVudHJpZXMgd2lsbCBub3QgYmUgZm9yZ290dGVuIChhIHJlcG9ydCBpcyBnZW5lcmF0ZWQgb25jZSBldmVyeSB3ZWVrZW5kKS4gIFNvCitJIHdpbGwgZGVzY3JpYmUgdGhlIHByb2Nlc3MuPC9wPgogCi08cD5Zb3UgbXVzdCBoYXZlIGEgQnVnWmlsbGEgYWNjb3VudCBmb3IgdGhhdC4gU28gb3BlbiB0aGUgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhLyI+Ci1CdWdaaWxsYSBNYWluIFBhZ2UgWzExXTwvYT4gYW5kIGZvbGxvdyB0aGUgbGluawotPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2NyZWF0ZWFjY291bnQuY2dpIj5PcGVuIGEgbmV3IEJ1Z3ppbGxhIGFjY291bnQgWzEyXTwvYT4KKzxwPkZpcnN0LCB5b3UgbXVzdCBoYXZlIGEgQnVnWmlsbGEgYWNjb3VudC4gU28gb3BlbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iCit0YXJnZXQ9Il90b3AiPkJ1Z1ppbGxhIE1haW4gUGFnZSBbMTFdPC9hPiBhbmQgZm9sbG93IHRoZQorbGluayA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2NyZWF0ZWFjY291bnQuY2dpIiB0YXJnZXQ9Il90b3AiPk9wZW4gYSBuZXcgQnVnemlsbGEgYWNjb3VudCBbMTJdPC9hPgogYW5kIHRoZSBzdGVwcyBkZXNjcmliZWQgdGhlcmUgaWYgeW91IGhhdmVuJ3Qgb25lLjwvcD4KIAogPG9sPgotPGxpPkZyb20gdGhlIEJ1Z1ppbGxhIG1haW4gcGFnZSBjaG9vc2UgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2kiPkVudGVyCi0gICAgYSBuZXcgYnVnIHJlcG9ydCBbMTNdPC9hPjwvbGk+Ci08bGk+Q2hvb3NlICJBbnQiIGFzIHByb2R1Y3QgPC9saT4KLTxsaT5WZXJzaW9uIGlzIHRoZSBsYXN0ICJBbHBoYSAobmlnaHRseSkiIChhdCB0aGlzIHRpbWUgMS43KTwvbGk+Cis8bGk+RnJvbSB0aGUgQnVnWmlsbGEgbWFpbiBwYWdlIGNob29zZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2kiIHRhcmdldD0iX3RvcCI+RW50ZXIgYQorICAgIG5ldyBidWcgcmVwb3J0IFsxM108L2E+PC9saT4KKzxsaT5DaG9vc2UgIkFudCIgYXMgcHJvZHVjdDwvbGk+Cis8bGk+VmVyc2lvbiBpcyB0aGUgbGFzdCAiQWxwaGEgKG5pZ2h0bHkpIiAoYXQgdGhpcyB0aW1lIDEuMTApPC9saT4KIDxsaT5Db21wb25lbnQgaXMgIkNvcmUgdGFza3MiPC9saT4KIDxsaT5QbGF0Zm9ybSBhbmQgU2V2ZXJpdHkgYXJlIG9rIHdpdGggIk90aGVyIiBhbmQgIk5vcm1hbCI8L2xpPgogPGxpPkluaXRpYWwgU3RhdGUgaXMgb2sgd2l0aCAiTmV3IjwvbGk+CiA8bGk+U2FtZSB3aXRoIHRoZSBlbXB0eSAiQXNzaWduZWQgdG8iPC9saT4KLTxsaT5JdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIHlvdXJzZWxmIGFzIENDLCBiZWNhdXNlIHlvdSBhcmUgdGhlIHJlcG9ydGVyIGFuZCB0aGVyZWZvcmUgd2lsbCBiZQotICAgIGluZm9ybWVkIG9uIGNoYW5nZXM8L2xpPgotPGxpPlVSTDogbm8gdXJsIHJlcXVpcmVkPC9saT4KLTxsaT5TdW1tYXJ5OiBhZGQgdGhlIDxpPnN1YmplY3Q8L2k+IGZyb20gdGhlIHRhYmxlPC9saT4KLTxsaT5EZXNjcmlwdGlvbjogYWRkIHRoZSA8aT5ib2R5PC9pPiBmcm9tIHRoZSB0YWJsZTwvbGk+Ci08bGk+VGhlbiBwcmVzcyAiQ29tbWl0IjwvbGk+Ci08bGk+QWZ0ZXIgcmVkaXJlY3RpbmcgdG8gdGhlIG5ldyBjcmVhdGVkIGJ1ZyBlbnRyeSBjbGljayAiQ3JlYXRlIGEgTmV3IEF0dGFjaG1lbnQiPC9saT4KLTxsaT5FbnRlciB0aGUgcGF0aCB0byB5b3VyIGxvY2FsIHBhdGggZmlsZSBpbnRvICJGaWxlIiBvciBjaG9vc2UgaXQgdmlhIHRoZSAiRmlsZSIncwotICAgIGJ1dHRvbi48L2xpPgotPGxpPkVudGVyIGEgc2hvcnQgZGVzY3JpcHRpb24gaW50byAiRGVzY3JpcHRpb24iLCBzbyB0aGF0IHlvdSBjb3VsZCBndWVzcywgd2hhdCB0aGUKLSAgICBwYXRoIGZpbGUgaW5jbHVkZXMuIEhlcmUgd2UgY291bGQgYWRkICJJbml0aWFsIFBhdGNoIi48L2xpPgotPGxpPlRoZSAiQ29udGVudCBUeXBlIiBpcyAiYXV0by1kZXRlY3QiLiBZb3UgY291bGQgdXNlIHRoZSAicGF0Y2giIHR5cGUsIGlmIHlvdSBvbmx5Ci0gICAgcHJvdmlkZSBhIHNpbmdsZSBwYXRoIGZpbGUsIGJ1dCB3ZSB3YW50IGRvIHVwbG9hZCBtb3JlIHRoYXQgb25lLCBpbmNsdWRlZCBpbiBvdXIKLSAgICBwYXRjaC56aXAuPC9saT4KKzxsaT5JdCBpcyBub3QgcmVxdWlyZWQgdG8gYWRkIHlvdXJzZWxmIGFzIENDLCBiZWNhdXNlIHlvdSBhcmUgdGhlIHJlcG9ydGVyIGFuZCB0aGVyZWZvcmUgd2lsbCBiZSBpbmZvcm1lZCBvbgorICAgIGNoYW5nZXM8L2xpPgorPGxpPlVSTDogR2l0SHViIHB1bGwgcmVxdWVzdCBVUkw8L2xpPgorPGxpPlN1bW1hcnk6IGFkZCB0aGUgPHZhcj5zdWJqZWN0PC92YXI+IGZyb20gdGhlIHRhYmxlPC9saT4KKzxsaT5EZXNjcmlwdGlvbjogYWRkIHRoZSA8dmFyPmJvZHk8L3Zhcj4gZnJvbSB0aGUgdGFibGU8L2xpPgogPGxpPlRoZW4gcHJlc3MgIkNvbW1pdCI8L2xpPgogPC9vbD4KLU5vdyB0aGUgbmV3IHRhc2sgaXMgdXBsb2FkZWQgaW50byB0aGUgYnVnIGRhdGFiYXNlLgogCis8cD5Ob3cgdGhlIG5ldyB0YXNrIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGJ1ZyBkYXRhYmFzZS48L3A+CiAKLTxoMj48YSBuYW1lPSJyZXNvdXJjZXMiPlJlc291cmNlczwvYT48L2gyPgotJm5ic3A7Jm5ic3A7WzFdIDxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+dHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sPC9hPjxicj4KLSZuYnNwOyZuYnNwO1syXSA8YSBocmVmPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcCI+dHV0b3JpYWwtdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy56aXA8L2E+PGJyPgotJm5ic3A7Jm5ic3A7WzNdIDxhIGhyZWY9InByb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyI+cHJvcGVydGllcy5odG1sI2J1aWx0LWluLXByb3BzPC9hPjxicj4KLSZuYnNwOyZuYnNwO1s0XSA8YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2FudC1jb250cmliLnNvdXJjZWZvcmdlLm5ldC88L2E+PGJyPgotJm5ic3A7Jm5ic3A7WzVdIDxhIGhyZWY9IlRhc2tzL2phdmEuaHRtbCI+VGFza3MvamF2YS5odG1sPC9hPjxicj4KLSZuYnNwOyZuYnNwO1s2XSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sIj5odHRwOi8vYW50LmFwYWNoZS5vcmcvYW50X3Rhc2tfZ3VpZGVsaW5lcy5odG1sPC9hPjxicj4KLSZuYnNwOyZuYnNwO1s3XSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvY3ZzLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9jdnMuaHRtbDwvYT48YnI+Ci0mbmJzcDsmbmJzcDtbOF0gPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvYXJjaGl2ZS0xMzkyMTAuaHRtbCI+aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvYXJjaGl2ZS0xMzkyMTAuaHRtbDwvYT48YnI+Ci0mbmJzcDsmbmJzcDtbOV0gPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvY29kZWNvbnZ0b2MtMTM2MDU3Lmh0bWwiPmh0dHA6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2NvZGVjb252dG9jLTEzNjA1Ny5odG1sPC9hPjxicj4KLSZuYnNwOyZuYnNwO1sxMF0gPGEgaHJlZj0iaHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LyI+aHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0LzwvYT48YnI+Ci0mbmJzcDsmbmJzcDtbMTFdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS8iPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS88L2E+PGJyPgotJm5ic3A7Jm5ic3A7WzEyXSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvY3JlYXRlYWNjb3VudC5jZ2kiPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9jcmVhdGVhY2NvdW50LmNnaTwvYT48YnI+Ci0mbmJzcDsmbmJzcDtbMTNdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpIj5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaTwvYT48YnI+Ci0KLQotPCEtLQotICBUT0RPOgotICAtIGhvdyB0byBjcmVhdGUgYSBwYXRoIChwYXRoLnhtbCAvIGNvbW1hbmQgbGluZSkKLS0tPgotCi0KLQotCis8aDIgaWQ9InJlc291cmNlcyI+UmVzb3VyY2VzPC9oMj4KKzxvbCBjbGFzcz0icmVmcyI+CisgICAgPGxpPjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+dHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9InR1dG9yaWFsLXRhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMuemlwIj50dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLnppcDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHMiPnByb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wczwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LyIgdGFyZ2V0PSJfdG9wIj5odHRwOi8vYW50LWNvbnRyaWIuc291cmNlZm9yZ2UubmV0LzwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJUYXNrcy9qYXZhLmh0bWwiPlRhc2tzL2phdmEuaHRtbDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbCIKKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL2FudC5hcGFjaGUub3JnL2FudF90YXNrX2d1aWRlbGluZXMuaHRtbDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2FudCIgdGFyZ2V0PSJfdG9wIj5odHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2FudDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvYXJjaGl2ZS0xMzkyMTAuaHRtbCIKKyAgICAgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvYXJjaGl2ZS0xMzkyMTAuaHRtbDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvY29kZWNvbnZ0b2MtMTM2MDU3Lmh0bWwiCisgICAgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly93d3cub3JhY2xlLmNvbS90ZWNobmV0d29yay9qYXZhL2NvZGVjb252dG9jLTEzNjA1Ny5odG1sPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY2hlY2tzdHlsZS5vcmcvIiB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vY2hlY2tzdHlsZS5vcmcvPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvIiB0YXJnZXQ9Il90b3AiPmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvY3JlYXRlYWNjb3VudC5jZ2kiCisgICAgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9jcmVhdGVhY2NvdW50LmNnaTwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2kiCisgICAgICAgICAgIHRhcmdldD0iX3RvcCI+aHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9lbnRlcl9idWcuY2dpPC9hPjwvbGk+Cis8L29sPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvdHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sIGIvbWFudWFsL3R1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbAppbmRleCBjM2I4YTZhLi45NjBlNDFkIDEwMDY0NAotLS0gYS9tYW51YWwvdHV0b3JpYWwtd3JpdGluZy10YXNrcy5odG1sCisrKyBiL21hbnVhbC90dXRvcmlhbC13cml0aW5nLXRhc2tzLmh0bWwKQEAgLTEsMyArMSw0IEBACis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC02LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNCwxMCArMTUsMTAgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Ci08aHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KIDxoZWFkPgogICA8dGl0bGU+VHV0b3JpYWw6IFdyaXRpbmcgVGFza3M8L3RpdGxlPgotICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZXNoZWV0cy9zdHlsZS5jc3MiIC8+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogPC9oZWFkPgogPGJvZHk+CiA8aDE+VHV0b3JpYWw6IFdyaXRpbmcgVGFza3M8L2gxPgpAQCAtNDEsMjIgKzQyLDIwIEBACiA8bGk+PGEgaHJlZj0iI3Jlc291cmNlcyI+UmVzb3VyY2VzPC9hPjwvbGk+CiA8L3VsPgogCi08YSBuYW1lPSJidWlsZGVudmlyb25tZW50Ij48L2E+Ci08aDI+U2V0IHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudDwvaDI+Ci08cD5BcGFjaGUgQW50IGJ1aWxkcyBpdHNlbGYsIHdlIGFyZSB1c2luZyBBbnQgdG9vICh3aHkgd2Ugd291bGQgd3JpdGUKLWEgdGFzayBpZiBub3Q/IDotKSB0aGVyZWZvcmUgd2Ugc2hvdWxkIHVzZSBBbnQgZm9yIG91ciBidWlsZC48L3A+Ci08cD5XZSBjaG9vc2UgYSBkaXJlY3RvcnkgYXMgcm9vdCBkaXJlY3RvcnkuIEFsbCB0aGluZ3Mgd2lsbCBiZSBkb25lCi1oZXJlIGlmIEkgc2F5IG5vdGhpbmcgZGlmZmVyZW50LiBJIHdpbGwgcmVmZXJlbmNlIHRoaXMgZGlyZWN0b3J5Ci1hcyA8aT5yb290LWRpcmVjdG9yeTwvaT4gb2Ygb3VyIHByb2plY3QuIEluIHRoaXMgcm9vdC1kaXJlY3Rvcnkgd2UKLWNyZWF0ZSBhIHRleHQgZmlsZSBuYW1lcyA8aT5idWlsZC54bWw8L2k+LiBXaGF0IHNob3VsZCBBbnQgZG8gZm9yIHVzPzwvcD4KKzxoMiBpZD0iYnVpbGRlbnZpcm9ubWVudCI+U2V0IHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudDwvaDI+Cis8cD5BcGFjaGUgQW50IGJ1aWxkcyBpdHNlbGYsIHdlIGFyZSB1c2luZyBBbnQgdG9vICh3aHkgd2Ugd291bGQgd3JpdGUgYSB0YXNrIGlmIG5vdD8gOi0pIHRoZXJlZm9yZSB3ZSBzaG91bGQgdXNlIEFudCBmb3IKK291ciBidWlsZC48L3A+Cis8cD5XZSBjaG9vc2UgYSBkaXJlY3RvcnkgYXMgcm9vdCBkaXJlY3RvcnkuIEFsbCB0aGluZ3Mgd2lsbCBiZSBkb25lIGhlcmUgaWYgSSBzYXkgbm90aGluZyBkaWZmZXJlbnQuIEkgd2lsbCByZWZlcmVuY2UKK3RoaXMgZGlyZWN0b3J5IGFzIDxlbT5yb290LWRpcmVjdG9yeTwvZW0+IG9mIG91ciBwcm9qZWN0LiBJbiB0aGlzIHJvb3QtZGlyZWN0b3J5IHdlIGNyZWF0ZSBhIHRleHQgZmlsZQorbmFtZXMgPHNhbXA+YnVpbGQueG1sPC9zYW1wPi4gV2hhdCBzaG91bGQgQW50IGRvIGZvciB1cz88L3A+CiA8dWw+CiA8bGk+Y29tcGlsZXMgbXkgc3R1ZmY8L2xpPgogPGxpPm1ha2UgdGhlIGphciwgc28gdGhhdCBJIGNhbiBkZXBsb3kgaXQ8L2xpPgogPGxpPmNsZWFuIHVwIGV2ZXJ5dGhpbmc8L2xpPgogPC91bD4KIFNvIHRoZSBidWlsZGZpbGUgY29udGFpbnMgdGhyZWUgdGFyZ2V0cy4KLTxwcmUgY2xhc3M9ImNvZGUiPgotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworPHByZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7CiAmbHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciImZ3Q7CiAKICAgICAmbHQ7dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXNjcmlwdGlvbj0iRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMiJmd0OwpAQCAtNzIsMTYgKzcxLDE1IEBACiAgICAgICAgICZsdDtqYXIgZGVzdGZpbGU9Ik15VGFzay5qYXIiIGJhc2VkaXI9ImNsYXNzZXMiLyZndDsKICAgICAmbHQ7L3RhcmdldCZndDsKIAotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+CiAKLVRoaXMgYnVpbGRmaWxlIHVzZXMgb2Z0ZW4gdGhlIHNhbWUgdmFsdWUgKHNyYywgY2xhc3NlcywgTXlUYXNrLmphciksIHNvIHdlIHNob3VsZCByZXdyaXRlIHRoYXQKLXVzaW5nIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+cy4gT24gc2Vjb25kIHRoZXJlIGFyZSBzb21lIGhhbmRpY2FwczogPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4gcmVxdWlyZXMgdGhhdCB0aGUgZGVzdGluYXRpb24KLWRpcmVjdG9yeSBleGlzdHM7IGEgY2FsbCBvZiAiY2xlYW4iIHdpdGggYSBub24gZXhpc3RpbmcgY2xhc3NlcyBkaXJlY3Rvcnkgd2lsbCBmYWlsOyAiamFyIiByZXF1aXJlcwotdGhlIGV4ZWN1dGlvbiBvZiBzb21lIHN0ZXBzIGJlZm9yZS4gU28gdGhlIHJlZmFjdG9yZWQgY29kZSBpczoKK1RoaXMgYnVpbGRmaWxlIHVzZXMgb2Z0ZW4gdGhlIHNhbWUgdmFsdWUgKDxzYW1wPnNyYzwvc2FtcD4sIDxzYW1wPmNsYXNzZXM8L3NhbXA+LCA8c2FtcD5NeVRhc2suamFyPC9zYW1wPiksIHNvIHdlIHNob3VsZAorcmV3cml0ZSB0aGF0IHVzaW5nIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+cy4gT24gc2Vjb25kIHRoZXJlIGFyZSBzb21lIGhhbmRpY2FwczogPGNvZGU+Jmx0O2phdmFjJmd0OzwvY29kZT4KK3JlcXVpcmVzIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHM7IGEgY2FsbCBvZiA8cT5jbGVhbjwvcT4gd2l0aCBhIG5vbiBleGlzdGluZyBjbGFzc2VzIGRpcmVjdG9yeSB3aWxsCitmYWlsOyA8cT5qYXI8L3E+IHJlcXVpcmVzIHRoZSBleGVjdXRpb24gb2Ygc29tZSBzdGVwcyBiZWZvcmUuIFNvIHRoZSByZWZhY3RvcmVkIGNvZGUgaXM6CiAKLTxwcmUgY2xhc3M9ImNvZGUiPgotJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Jmd0OworPHByZT4KKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8mZ3Q7CiAmbHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciImZ3Q7CiAKICAgICA8Yj4mbHQ7cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9InNyYyIvJmd0OzwvYj4KQEAgLTEwMSwzOCArOTksMjkgQEAKICAgICAgICAgJmx0O2phciBkZXN0ZmlsZT0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7CiAgICAgJmx0Oy90YXJnZXQmZ3Q7CiAKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgotPGk+YW50LnByb2plY3QubmFtZTwvaT4gaXMgb25lIG9mIHRoZQotPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9wcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHMiIHRhcmdldD0iX2JsYW5rIj4KLWJ1aWxkLWluIHByb3BlcnRpZXMgWzFdPC9hPiBvZiBBbnQuCismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+Cis8cD48Y29kZT5hbnQucHJvamVjdC5uYW1lPC9jb2RlPiBpcyBvbmUgb2YgdGhlIDxhIGhyZWY9InByb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyIgdGFyZ2V0PSJfdG9wIj5idWlsZC1pbgorcHJvcGVydGllcyBbMV08L2E+IG9mIEFudC48L3A+CiAKKzxoMiBpZD0id3JpdGUxIj5Xcml0ZSB0aGUgVGFzazwvaDI+CiAKLTxhIG5hbWU9IndyaXRlMSI+PC9hPgotPGgyPldyaXRlIHRoZSBUYXNrPC9oMj4KLQotTm93IHdlIHdyaXRlIHRoZSBzaW1wbGVzdCBUYXNrIC0gYSBIZWxsb1dvcmxkLVRhc2sgKHdoYXQgZWxzZT8pLiBDcmVhdGUgYSB0ZXh0IGZpbGUKLTxpPkhlbGxvV29ybGQuamF2YTwvaT4gaW4gdGhlIHNyYy1kaXJlY3Rvcnkgd2l0aDoKLTxwcmUgY2xhc3M9ImNvZGUiPgorPHA+Tm93IHdlIHdyaXRlIHRoZSBzaW1wbGVzdCBUYXNrJm1kYXNoO2EgSGVsbG9Xb3JsZCBUYXNrICh3aGF0IGVsc2U/KS4gQ3JlYXRlIGEgdGV4dCBmaWxlIDxzYW1wPkhlbGxvV29ybGQuamF2YTwvc2FtcD4KK2luIHRoZSBzcmMtZGlyZWN0b3J5IHdpdGg6PC9wPgorPHByZT4KIHB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlbGxvIFdvcmxkIik7CiAgICAgfQotfQotPC9wcmU+Ci1hbmQgd2UgY2FuIGNvbXBpbGUgYW5kIGphciBpdCB3aXRoIDx0dD5hbnQ8L3R0PiAoZGVmYXVsdCB0YXJnZXQgaXMgImphciIgYW5kIHZpYQotaXRzIDxpPmRlcGVuZHM8L2k+LWNsYXVzZSB0aGUgImNvbXBpbGUiIGlzIGV4ZWN1dGVkIGJlZm9yZSkuCit9PC9wcmU+Cis8cD5hbmQgd2UgY2FuIGNvbXBpbGUgYW5kIGphciBpdCB3aXRoIDxrYmQ+YW50PC9rYmQ+IChkZWZhdWx0IHRhcmdldCBpcyA8cT5qYXI8L3E+IGFuZCB2aWEgaXRzIDx2YXI+ZGVwZW5kczwvdmFyPgorYXR0cmlidXRlIHRoZSA8cT5jb21waWxlPC9xPiBpcyBleGVjdXRlZCBiZWZvcmUpLjwvcD4KIAotCi0KLTxhIG5hbWU9InVzZTEiPjwvYT4KLTxoMj5Vc2UgdGhlIFRhc2s8L2gyPgotPHA+QnV0IGFmdGVyIGNyZWF0aW5nIHRoZSBqYXIgd2Ugd2FudCB0byB1c2Ugb3VyIG5ldyBUYXNrLiBUaGVyZWZvcmUgd2UgbmVlZCBhCi1uZXcgdGFyZ2V0ICJ1c2UiLiBCZWZvcmUgd2UgY2FuIHVzZSBvdXIgbmV3IHRhc2sgd2UgaGF2ZSB0byBkZWNsYXJlIGl0IHdpdGgKLTxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVGFza3MvdGFza2RlZi5odG1sIiB0YXJnZXQ9Il9ibGFuayI+Ci08Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+IFsyXTwvYT4uIEFuZCBmb3IgZWFzaWVyIHByb2Nlc3Mgd2UgY2hhbmdlIHRoZSBkZWZhdWx0IGNsYXVzZTo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KLSZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPyZndDsKKzxoMiBpZD0idXNlMSI+VXNlIHRoZSBUYXNrPC9oMj4KKzxwPkJ1dCBhZnRlciBjcmVhdGluZyB0aGUgamFyIHdlIHdhbnQgdG8gdXNlIG91ciBuZXcgVGFzay4gVGhlcmVmb3JlIHdlIG5lZWQgYSBuZXcgdGFyZ2V0IDxxPnVzZTwvcT4uIEJlZm9yZSB3ZSBjYW4gdXNlCitvdXIgbmV3IHRhc2sgd2UgaGF2ZSB0byBkZWNsYXJlIGl0IHdpdGggPGEgaHJlZj0iVGFza3MvdGFza2RlZi5odG1sIiB0YXJnZXQ9Il90b3AiPjxjb2RlPiZsdDt0YXNrZGVmJmd0OzwvY29kZT4KK1syXTwvYT4uICBBbmQgZm9yIGVhc2llciBwcm9jZXNzIHdlIGNoYW5nZSB0aGUgPHZhcj5kZWZhdWx0PC92YXI+IGF0dHJpYnV0ZTo8L3A+Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKICZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0iPGI+dXNlPC9iPiImZ3Q7CiAKICAgICAuLi4KQEAgLTE0MiwxMyArMTMxLDEyIEBACiAgICAgICAgICZsdDtoZWxsb3dvcmxkLyZndDsKICAgICAmbHQ7L3RhcmdldCZndDs8L2I+CiAKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5JbXBvcnRhbnQgaXMgdGhlIDxpPmNsYXNzcGF0aDwvaT4tYXR0cmlidXRlLiBBbnQgc2VhcmNoZXMgaW4gaXRzIC9saWIgZGlyZWN0b3J5IGZvcgotdGFza3MgYW5kIG91ciB0YXNrIGlzbid0IHRoZXJlLiBTbyB3ZSBoYXZlIHRvIHByb3ZpZGUgdGhlIHJpZ2h0IGxvY2F0aW9uLiA8L3A+Cis8cD5JbXBvcnRhbnQgaXMgdGhlIDx2YXI+Y2xhc3NwYXRoPC92YXI+IGF0dHJpYnV0ZS4gQW50IHNlYXJjaGVzIGluIGl0cyA8c2FtcD4vbGliPC9zYW1wPiBkaXJlY3RvcnkgZm9yIHRhc2tzIGFuZCBvdXIKK3Rhc2sgaXNuJ3QgdGhlcmUuIFNvIHdlIGhhdmUgdG8gcHJvdmlkZSB0aGUgcmlnaHQgbG9jYXRpb24uPC9wPgogCi08cD5Ob3cgd2UgY2FuIHR5cGUgaW4gPHR0PmFudDwvdHQ+IGFuZCBhbGwgc2hvdWxkIHdvcmsgLi4uPC9wPgorPHA+Tm93IHdlIGNhbiB0eXBlIGluIDxrYmQ+YW50PC9rYmQ+IGFuZCBhbGwgc2hvdWxkIHdvcmsgLi4uPC9wPgogPHByZSBjbGFzcz0ib3V0cHV0Ij4KIEJ1aWxkZmlsZTogYnVpbGQueG1sCiAKQEAgLTE2MywyMyArMTUxLDE4IEBACiBbaGVsbG93b3JsZF0gSGVsbG8gV29ybGQKIAogQlVJTEQgU1VDQ0VTU0ZVTAotVG90YWwgdGltZTogMyBzZWNvbmRzCi08L3ByZT4KK1RvdGFsIHRpbWU6IDMgc2Vjb25kczwvcHJlPgogCis8aDIgaWQ9IlRhc2tBZGFwdGVyIj5JbnRlZ3JhdGlvbiB3aXRoIFRhc2tBZGFwdGVyPC9oMj4KKzxwPk91ciBjbGFzcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIEFudC4gSXQgZXh0ZW5kcyBubyBzdXBlcmNsYXNzIGFuZCBpbXBsZW1lbnRzIG5vIGludGVyZmFjZS4gSG93IGRvZXMgQW50IGtub3cgdG8KK2ludGVncmF0ZT8gVmlhIG5hbWUgY29udmVudGlvbjogb3VyIGNsYXNzIHByb3ZpZGVzIGEgbWV0aG9kIHdpdGggc2lnbmF0dXJlIDxjb2RlIGNsYXNzPSJjb2RlIj5wdWJsaWMgdm9pZAorZXhlY3V0ZSgpPC9jb2RlPi4gVGhpcyBjbGFzcyBpcyB3cmFwcGVkIGJ5IEFudCdzIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQWRhcHRlcjwvY29kZT4gd2hpY2ggaXMgYQordGFzayBhbmQgdXNlcyByZWZsZWN0aW9uIGZvciBzZXR0aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IGFuZCBjYWxsaW5nIHRoZSA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZSgpPC9jb2RlPgorbWV0aG9kLjwvcD4KIAotCi08YSBuYW1lPSJUYXNrQWRhcHRlciI+PC9hPgotPGgyPkludGVncmF0aW9uIHdpdGggVGFza0FkYXB0ZXI8L2gyPgotPHA+T3VyIGNsYXNzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggQW50LiBJdCBleHRlbmRzIG5vIHN1cGVyY2xhc3MgYW5kIGltcGxlbWVudHMKLW5vIGludGVyZmFjZS4gSG93IGRvZXMgQW50IGtub3cgdG8gaW50ZWdyYXRlPyBWaWEgbmFtZSBjb252ZW50aW9uOiBvdXIgY2xhc3MgcHJvdmlkZXMKLWEgbWV0aG9kIHdpdGggc2lnbmF0dXJlIDx0dD5wdWJsaWMgdm9pZCBleGVjdXRlKCk8L3R0Pi4gVGhpcyBjbGFzcyBpcyB3cmFwcGVkIGJ5IEFudCdzCi08dHQ+b3JnLmFwYWNoZS50b29scy5hbnQuVGFza0FkYXB0ZXI8L3R0PiB3aGljaCBpcyBhIHRhc2sgYW5kIHVzZXMgcmVmbGVjdGlvbiBmb3IKLXNldHRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3QgYW5kIGNhbGxpbmcgdGhlIDxpPmV4ZWN1dGUoKTwvaT4gbWV0aG9kLjwvcD4KLQotPHA+PGk+U2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUgcHJvamVjdDwvaT4/IENvdWxkIGJlIGludGVyZXN0aW5nLiBUaGUgUHJvamVjdCBjbGFzcwotZ2l2ZXMgdXMgc29tZSBuaWNlIGFiaWxpdGllczogYWNjZXNzIHRvIEFudCdzIGxvZ2dpbmcgZmFjaWxpdGllcyBnZXR0aW5nIGFuZCBzZXR0aW5nCi1wcm9wZXJ0aWVzIGFuZCBtdWNoIG1vcmUuIFNvIHdlIHRyeSB0byB1c2UgdGhhdCBjbGFzczo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KKzxwPjxlbT5TZXR0aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0PC9lbT4/IENvdWxkIGJlIGludGVyZXN0aW5nLiBUaGUgUHJvamVjdCBjbGFzcyBnaXZlcyB1cyBzb21lIG5pY2UgYWJpbGl0aWVzOgorYWNjZXNzIHRvIEFudCdzIGxvZ2dpbmcgZmFjaWxpdGllcyBnZXR0aW5nIGFuZCBzZXR0aW5nIHByb3BlcnRpZXMgYW5kIG11Y2ggbW9yZS4gU28gd2UgdHJ5IHRvIHVzZSB0aGF0IGNsYXNzOjwvcD4KKzxwcmU+CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIAogcHVibGljIGNsYXNzIEhlbGxvV29ybGQgewpAQCAtMTk0LDI0ICsxNzcsMTkgQEAKICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQucHJvamVjdC5uYW1lIik7CiAgICAgICAgIHByb2plY3QubG9nKCJIZXJlIGlzIHByb2plY3QgJyIgKyBtZXNzYWdlICsgIicuIiwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgfQotfQotPC9wcmU+Ci1hbmQgdGhlIGV4ZWN1dGlvbiB3aXRoIDx0dD5hbnQ8L3R0PiB3aWxsIHNob3cgdXMgdGhlIGV4cGVjdGVkCit9PC9wcmU+Cis8cD5hbmQgdGhlIGV4ZWN1dGlvbiB3aXRoIDxrYmQ+YW50PC9rYmQ+IHdpbGwgc2hvdyB1cyB0aGUgZXhwZWN0ZWQ8L3A+CiA8cHJlIGNsYXNzPSJvdXRwdXQiPgogdXNlOgotSGVyZSBpcyBwcm9qZWN0ICdNeVRhc2snLgotPC9wcmU+CitIZXJlIGlzIHByb2plY3QgJ015VGFzaycuPC9wcmU+CiAKKzxoMiBpZD0iZGVyaXZpbmdGcm9tVGFzayI+RGVyaXZpbmcgZnJvbSBBbnQncyBUYXNrPC9oMj4KKzxwPk9rLCB0aGF0IHdvcmtzIC4uLiBCdXQgdXN1YWxseSB5b3Ugd2lsbCBleHRlbmQgPGNvZGUgY2xhc3M9ImNvZGUiPm9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s8L2NvZGU+LiAgVGhhdCBjbGFzcyBpcworaW50ZWdyYXRlZCBpbiBBbnQsIGdldHMgdGhlIHByb2plY3QgcmVmZXJlbmNlLCBwcm92aWRlcyBkb2N1bWVudGF0aW9uIGZpZWxkcywgcHJvdmlkZXMgZWFzaWVyIGFjY2VzcyB0byB0aGUgbG9nZ2luZworZmFjaWxpdHkgYW5kICh2ZXJ5IHVzZWZ1bCkgZ2l2ZXMgeW91IHRoZSBleGFjdCBsb2NhdGlvbiB3aGVyZSA8ZW0+aW4gdGhlIGJ1aWxkZmlsZTwvZW0+IHRoaXMgdGFzayBpbnN0YW5jZSBpcyB1c2VkLjwvcD4KIAotPGEgbmFtZT0iZGVyaXZpbmdGcm9tVGFzayI+PC9hPgotPGgyPkRlcml2aW5nIGZyb20gQW50J3MgVGFzazwvaDI+Ci08cD5PaywgdGhhdCB3b3JrcyAuLi4gQnV0IHVzdWFsbHkgeW91IHdpbGwgZXh0ZW5kIDx0dD5vcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrPC90dD4uCi1UaGF0IGNsYXNzIGlzIGludGVncmF0ZWQgaW4gQW50LCBnZXQncyB0aGUgcHJvamVjdC1yZWZlcmVuY2UsIHByb3ZpZGVzIGRvY3VtZW50YXRpb24KLWZpZWxkcywgcHJvdmlkZXMgZWFzaWVyIGFjY2VzcyB0byB0aGUgbG9nZ2luZyBmYWNpbGl0eSBhbmQgKHZlcnkgdXNlZnVsKSBnaXZlcyB5b3UKLXRoZSBleGFjdCBsb2NhdGlvbiB3aGVyZSA8aT5pbiB0aGUgYnVpbGRmaWxlPC9pPiB0aGlzIHRhc2sgaW5zdGFuY2UgaXMgdXNlZC48L3A+Ci0KLTxwPk9raS1kb2tpIC0gbGV0J3MgdXMgdXNlIHNvbWUgb2YgdGhlc2U6PC9wPgotPHByZSBjbGFzcz0iY29kZSI+Cis8cD5Pa2ktZG9raSZtZGFzaDtsZXQncyB1cyB1c2Ugc29tZSBvZiB0aGVzZTo8L3A+Cis8cHJlPgogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiAKIHB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgVGFzayB7CkBAIC0yMjUsMzUgKzIwMywzMyBAQAogICAgICAgICAvLyB3aGVyZSB0aGlzIHRhc2sgaXMgdXNlZD8KICAgICAgICAgbG9nKCJJIGFtIHVzZWQgaW46ICIgKyAgZ2V0TG9jYXRpb24oKSApOwogICAgIH0KLX0KLTwvcHJlPgorfTwvcHJlPgogPHA+d2hpY2ggZ2l2ZXMgdXMgd2hlbiBydW5uaW5nPC9wPgogPHByZSBjbGFzcz0ib3V0cHV0Ij4KIHVzZToKIFtoZWxsb3dvcmxkXSBIZXJlIGlzIHByb2plY3QgJ015VGFzaycuCi1baGVsbG93b3JsZF0gSSBhbSB1c2VkIGluOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcYnVpbGQueG1sOjIzOgotPC9wcmU+CitbaGVsbG93b3JsZF0gSSBhbSB1c2VkIGluOiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcYnVpbGQueG1sOjIzOjwvcHJlPgogCi08YSBuYW1lPSJhY2Nlc3NUYXNrUHJvamVjdCI+PC9hPgotPGgyPkFjY2Vzc2luZyB0aGUgVGFzaydzIFByb2plY3Q8L2gyPgotPHA+VGhlIHBhcmVudCBwcm9qZWN0IG9mIHlvdXIgY3VzdG9tIHRhc2sgbWF5IGJlIGFjY2Vzc2VkIHRocm91Z2ggbWV0aG9kIDxjb2RlPmdldFByb2plY3QoKTwvY29kZT4uICBIb3dldmVyLCBkbyBub3QgY2FsbCB0aGlzIGZyb20gdGhlIGN1c3RvbSB0YXNrIGNvbnN0cnVjdG9yLCBhcyB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgbnVsbC4gIExhdGVyLCB3aGVuIG5vZGUgYXR0cmlidXRlcyBvciB0ZXh0IGFyZSBzZXQsIG9yIG1ldGhvZCA8Y29kZT5leGVjdXRlKCk8L2NvZGU+IGlzIGNhbGxlZCwgdGhlIFByb2plY3Qgb2JqZWN0IGlzIGF2YWlsYWJsZS48L3A+Cis8aDIgaWQ9ImFjY2Vzc1Rhc2tQcm9qZWN0Ij5BY2Nlc3NpbmcgdGhlIFRhc2sncyBQcm9qZWN0PC9oMj4KKzxwPlRoZSBwYXJlbnQgcHJvamVjdCBvZiB5b3VyIGN1c3RvbSB0YXNrIG1heSBiZSBhY2Nlc3NlZCB0aHJvdWdoIG1ldGhvZCA8Y29kZSBjbGFzcz0iY29kZSI+Z2V0UHJvamVjdCgpPC9jb2RlPi4KK0hvd2V2ZXIsIGRvIG5vdCBjYWxsIHRoaXMgZnJvbSB0aGUgY3VzdG9tIHRhc2sgY29uc3RydWN0b3IsIGFzIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBudWxsLiAgTGF0ZXIsIHdoZW4gbm9kZQorYXR0cmlidXRlcyBvciB0ZXh0IGFyZSBzZXQsIG9yIG1ldGhvZCA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZSgpPC9jb2RlPiBpcyBjYWxsZWQsIHRoZSBQcm9qZWN0IG9iamVjdCBpcworYXZhaWxhYmxlLjwvcD4KIDxwPkhlcmUgYXJlIHR3byB1c2VmdWwgbWV0aG9kcyBmcm9tIGNsYXNzIFByb2plY3Q6PC9wPgogPHVsPgotICA8bGk+PGNvZGU+U3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpPC9jb2RlPjwvbGk+Ci0gIDxsaT4KLSAgICA8Y29kZT5TdHJpbmcgcmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHZhbHVlKTwvY29kZT4KLSAgPC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5TdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk8L2NvZGU+PC9saT4KKyAgPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5TdHJpbmcgcmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHZhbHVlKTwvY29kZT48L2xpPgogPC91bD4KIAotPHA+VGhlIG1ldGhvZCA8Y29kZT5yZXBsYWNlUHJvcGVydGllcygpPC9jb2RlPiBpcyBkaXNjdXNzZWQgZnVydGhlciBpbiBzZWN0aW9uIDxhIGhyZWY9IiNOZXN0ZWRUZXh0Ij5OZXN0ZWQgVGV4dDwvYT4uPC9wPgorPHA+VGhlIG1ldGhvZCA8Y29kZSBjbGFzcz0iY29kZSI+cmVwbGFjZVByb3BlcnRpZXMoKTwvY29kZT4gaXMgZGlzY3Vzc2VkIGZ1cnRoZXIgaW4gc2VjdGlvbiA8YSBocmVmPSIjTmVzdGVkVGV4dCI+TmVzdGVkCitUZXh0PC9hPi48L3A+CiAKLTxhIG5hbWU9ImF0dHJpYnV0ZXMiPjwvYT4KLTxoMj5BdHRyaWJ1dGVzPC9oMj4KLTxwPk5vdyB3ZSB3YW50IHRvIHNwZWNpZnkgdGhlIHRleHQgb2Ygb3VyIG1lc3NhZ2UgKGl0IHNlZW1zIHRoYXQgd2UgYXJlCi1yZXdyaXRpbmcgdGhlIDxjb2RlPiZsdDtlY2hvLyZndDs8L2NvZGU+IHRhc2sgOi0pLiBGaXJzdCB3ZSB3ZWxsIGRvIHRoYXQgd2l0aCBhbiBhdHRyaWJ1dGUuCi1JdCBpcyB2ZXJ5IGVhc3kgLSBmb3IgZWFjaCBhdHRyaWJ1dGUgcHJvdmlkZSBhIDx0dD5wdWJsaWMgdm9pZCBzZXQ8Y29kZT4mbHQ7YXR0cmlidXRlbmFtZSZndDs8L2NvZGU+KDxjb2RlPiZsdDt0eXBlJmd0OzwvY29kZT4KLW5ld1ZhbHVlKTwvdHQ+IG1ldGhvZCBhbmQgQW50IHdpbGwgZG8gdGhlIHJlc3QgdmlhIHJlZmxlY3Rpb24uPC9wPgotPHByZSBjbGFzcz0iY29kZSI+Cis8aDIgaWQ9ImF0dHJpYnV0ZXMiPkF0dHJpYnV0ZXM8L2gyPgorPHA+Tm93IHdlIHdhbnQgdG8gc3BlY2lmeSB0aGUgdGV4dCBvZiBvdXIgbWVzc2FnZSAoaXQgc2VlbXMgdGhhdCB3ZSBhcmUgcmV3cml0aW5nIHRoZSA8Y29kZT4mbHQ7ZWNoby8mZ3Q7PC9jb2RlPiB0YXNrCis6LSkuIEZpcnN0IHdlIHdlbGwgZG8gdGhhdCB3aXRoIGFuIGF0dHJpYnV0ZS4gIEl0IGlzIHZlcnkgZWFzeSZtZGFzaDtmb3IgZWFjaCBhdHRyaWJ1dGUgcHJvdmlkZQorYSA8Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIHZvaWQgc2V0PGk+QXR0cmlidXRlbmFtZTwvaT4oPGk+VHlwZTwvaT4gbmV3VmFsdWUpPC9jb2RlPiBtZXRob2QgYW5kIEFudCB3aWxsIGRvIHRoZSByZXN0Cit2aWEgcmVmbGVjdGlvbi48L3A+Cis8cHJlPgogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiAKQEAgLTI2NSw1MSArMjQxLDQ4IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2U9PW51bGwpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBtZXNzYWdlIHNldC4iKTsKICAgICAgICAgfQogICAgICAgICBsb2cobWVzc2FnZSk7CiAgICAgfQogCi19Ci08L3ByZT4KLTxwPk9oLCB3aGF0J3MgdGhhdCBpbiBleGVjdXRlKCk/IFRocm93IGEgPGk+QnVpbGRFeGNlcHRpb248L2k+PyBZZXMsIHRoYXQncyB0aGUgdXN1YWwKLXdheSB0byBzaG93IEFudCB0aGF0IHNvbWV0aGluZyBpbXBvcnRhbnQgaXMgbWlzc2VkIGFuZCBjb21wbGV0ZSBidWlsZCBzaG91bGQgZmFpbC4gVGhlCi1zdHJpbmcgcHJvdmlkZWQgdGhlcmUgaXMgd3JpdHRlbiBhcyBidWlsZC1mYWlsZXMtbWVzc2FnZS4gSGVyZSBpdCdzIG5lY2Vzc2FyeSBiZWNhdXNlCi10aGUgbG9nKCkgbWV0aG9kIGNhbid0IGhhbmRsZSBhIDxpPm51bGw8L2k+IHZhbHVlIGFzIHBhcmFtZXRlciBhbmQgdGhyb3dzIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uCi0oT2YgY291cnNlIHlvdSBjYW4gaW5pdGlhbGl6ZSB0aGUgPGk+bWVzc2FnZTwvaT4gd2l0aCBhIGRlZmF1bHQgc3RyaW5nLik8L3A+Cit9PC9wcmU+Cis8cD5PaCwgd2hhdCdzIHRoYXQgaW4gPGNvZGUgY2xhc3M9ImNvZGUiPmV4ZWN1dGUoKTwvY29kZT4/IFRocm93IGEgPGNvZGU+QnVpbGRFeGNlcHRpb248L2NvZGU+PyBZZXMsIHRoYXQncyB0aGUgdXN1YWwKK3dheSB0byBzaG93IEFudCB0aGF0IHNvbWV0aGluZyBpbXBvcnRhbnQgaXMgbWlzc2VkIGFuZCBjb21wbGV0ZSBidWlsZCBzaG91bGQgZmFpbC4gVGhlIHN0cmluZyBwcm92aWRlZCB0aGVyZSBpcyB3cml0dGVuCithcyBidWlsZC1mYWlscy1tZXNzYWdlLiBIZXJlIGl0J3MgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIDxjb2RlIGNsYXNzPSJjb2RlIj5sb2coKTwvY29kZT4gbWV0aG9kIGNhbid0IGhhbmRsZQorYSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBhcyBwYXJhbWV0ZXIgYW5kIHRocm93cyBhIDxjb2RlPk51bGxQb2ludGVyRXhjZXB0aW9uPC9jb2RlPi4gIChPZiBjb3Vyc2UgeW91IGNhbiBpbml0aWFsaXplCit0aGUgPHZhcj5tZXNzYWdlPC92YXI+IHdpdGggYSBkZWZhdWx0IHN0cmluZy4pPC9wPgogCiA8cD5BZnRlciB0aGF0IHdlIGhhdmUgdG8gbW9kaWZ5IG91ciBidWlsZGZpbGU6PC9wPgotPHByZSBjbGFzcz0iY29kZSI+Cis8cHJlPgogICAgICZsdDt0YXJnZXQgbmFtZT0idXNlIiBkZXNjcmlwdGlvbj0iVXNlIHRoZSBUYXNrIiBkZXBlbmRzPSJqYXIiJmd0OwogICAgICAgICAmbHQ7dGFza2RlZiBuYW1lPSJoZWxsb3dvcmxkIgogICAgICAgICAgICAgICAgICBjbGFzc25hbWU9IkhlbGxvV29ybGQiCiAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLyZndDsKICAgICAgICAgJmx0O2hlbGxvd29ybGQgPGI+bWVzc2FnZT0iSGVsbG8gV29ybGQiPC9iPi8mZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7Ci08L3ByZT4KKyAgICAmbHQ7L3RhcmdldCZndDs8L3ByZT4KIDxwPlRoYXQncyBhbGwuPC9wPgogCi08cD5Tb21lIGJhY2tncm91bmQgZm9yIHdvcmtpbmcgd2l0aCBhdHRyaWJ1dGVzOiBBbnQgc3VwcG9ydHMgYW55IG9mIHRoZXNlIGRhdGF0eXBlcyBhcwotYXJndW1lbnRzIG9mIHRoZSBzZXQtbWV0aG9kOjwvcD48dWw+Ci08bGk+ZWxlbWVudGFyeSBkYXRhIHR5cGUgbGlrZSA8aT5pbnQ8L2k+LCA8aT5sb25nPC9pPiwgLi4uPC9saT4KLTxsaT5pdHMgd3JhcHBlciBjbGFzc2VzIGxpa2UgPGk+amF2YS5sYW5nLkludGVnZXI8L2k+LCA8aT5qYXZhLmxhbmcuTG9uZzwvaT4sIC4uLjwvbGk+Ci08bGk+PGk+amF2YS5sYW5nLlN0cmluZzwvaT48L2xpPgotPGxpPnNvbWUgbW9yZSBjbGFzc2VzIChlLmcuIDxpPmphdmEuaW8uRmlsZTwvaT47IHNlZQotICAgIDxhIGhyZWY9ImRldmVsb3AuaHRtbCNzZXQtbWFnaWMiPk1hbnVhbAotICAgICdXcml0aW5nIFlvdXIgT3duIFRhc2snIFszXTwvYT4pPC9saT4KKzxwPlNvbWUgYmFja2dyb3VuZCBmb3Igd29ya2luZyB3aXRoIGF0dHJpYnV0ZXM6IEFudCBzdXBwb3J0cyBhbnkgb2YgdGhlc2UgZGF0YXR5cGVzIGFzIGFyZ3VtZW50cyBvZiB0aGUgc2V0LW1ldGhvZDo8L3A+Cis8dWw+Cis8bGk+cHJpbWl0aXZlIGRhdGEgdHlwZXMgbGlrZSA8Y29kZSBjbGFzcz0iY29kZSI+aW50PC9jb2RlPiwgPGNvZGUgY2xhc3M9ImNvZGUiPmxvbmc8L2NvZGU+LCAuLi48L2xpPgorPGxpPnRoZWlyIHdyYXBwZXIgY2xhc3NlcyBsaWtlIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLmxhbmcuTG9uZzwvY29kZT4sCisuLi48L2xpPgorPGxpPjxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPjwvbGk+Cis8bGk+c29tZSBvdGhlciBjbGFzc2VzIChlLmcuIDxjb2RlIGNsYXNzPSJjb2RlIj5qYXZhLmlvLkZpbGU8L2NvZGU+OyBzZWUgPGEgaHJlZj0iZGV2ZWxvcC5odG1sI3NldC1tYWdpYyI+TWFudWFsCisnV3JpdGluZyBZb3VyIE93biBUYXNrJyBbM108L2E+KTwvbGk+CiA8bGk+QW55IEphdmEgT2JqZWN0IHBhcnNlZCBmcm9tIEFudCAxLjgncyA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eWhlbHBlci5odG1sIj5Qcm9wZXJ0eQogSGVscGVyPC9hPjwvbGk+CiA8L3VsPgotQmVmb3JlIGNhbGxpbmcgdGhlIHNldC1tZXRob2QgYWxsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkLiBTbyBhIDx0dD4mbHQ7aGVsbG93b3JsZCBtZXNzYWdlPSIke21zZ30iLyZndDs8L3R0Pgotd291bGQgbm90IHNldCB0aGUgbWVzc2FnZSBzdHJpbmcgdG8gIiR7bXNnfSIgaWYgdGhlcmUgaXMgYSBwcm9wZXJ0eSAibXNnIiB3aXRoIGEgc2V0IHZhbHVlLgorPHA+QmVmb3JlIGNhbGxpbmcgdGhlIHNldC1tZXRob2QgYWxsIHByb3BlcnRpZXMgYXJlIHJlc29sdmVkLiBTbyBhIDxjb2RlPiZsdDtoZWxsb3dvcmxkIG1lc3NhZ2U9IiR7bXNnfSIvJmd0OzwvY29kZT4KK3dvdWxkIG5vdCBzZXQgdGhlIG1lc3NhZ2Ugc3RyaW5nIHRvIDxxPiR7bXNnfTwvcT4gaWYgdGhlcmUgaXMgYSBwcm9wZXJ0eSA8Y29kZT5tc2c8L2NvZGU+IHdpdGggYSBzZXQgdmFsdWUuPC9wPgogCi0KLTxhIG5hbWU9Ik5lc3RlZFRleHQiPjwvYT4KLTxoMj5OZXN0ZWQgVGV4dDwvaDI+Ci08cD5NYXliZSB5b3UgaGF2ZSB1c2VkIHRoZSA8Y29kZT4mbHQ7ZWNobyZndDs8L2NvZGU+IHRhc2sgaW4gYSB3YXkgbGlrZSA8dHQ+Jmx0O2VjaG8mZ3Q7SGVsbG8gV29ybGQmbHQ7L2VjaG8mZ3Q7PC90dD4uCi1Gb3IgdGhhdCB5b3UgaGF2ZSB0byBwcm92aWRlIGEgPHR0PnB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpPC90dD4gbWV0aG9kLjwvcD4KLTxwcmUgY2xhc3M9ImNvZGUiPgorPGgyIGlkPSJOZXN0ZWRUZXh0Ij5OZXN0ZWQgVGV4dDwvaDI+Cis8cD5NYXliZSB5b3UgaGF2ZSB1c2VkIHRoZSA8Y29kZT4mbHQ7ZWNobyZndDs8L2NvZGU+IHRhc2sgaW4gYSB3YXkgbGlrZSA8Y29kZT4mbHQ7ZWNobyZndDtIZWxsbworV29ybGQmbHQ7L2VjaG8mZ3Q7PC9jb2RlPi4gIEZvciB0aGF0IHlvdSBoYXZlIHRvIHByb3ZpZGUgYSA8Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCk8L2NvZGU+CittZXRob2QuPC9wPgorPHByZT4KIC4uLgogcHVibGljIGNsYXNzIEhlbGxvV29ybGQgZXh0ZW5kcyBUYXNrIHsKICAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOwpAQCAtMzE4LDQ2ICsyOTEsNDIgQEAKICAgICAgICAgbWVzc2FnZSA9IHRleHQ7CiAgICAgfQogICAgIC4uLgotfQotPC9wcmU+Ci08cD5CdXQgaGVyZSBwcm9wZXJ0aWVzIGFyZSA8Yj5ub3Q8L2I+IHJlc29sdmVkISBGb3IgcmVzb2x2aW5nIHByb3BlcnRpZXMgd2UgaGF2ZSB0byB1c2UKLVByb2plY3QncyA8dHQ+cmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHByb3BuYW1lKSA6IFN0cmluZzwvdHQ+IG1ldGhvZCB3aGljaCB0YWtlcyB0aGUKLXByb3BlcnR5IG5hbWUgYXMgYXJndW1lbnQgYW5kIHJldHVybnMgaXRzIHZhbHVlIChvciAke3Byb3BuYW1lfSBpZiBub3Qgc2V0KS48L3A+Ci08cD5UaHVzLCB0byByZXBsYWNlIHByb3BlcnRpZXMgaW4gdGhlIG5lc3RlZCBub2RlIHRleHQsIG91ciBtZXRob2QgPGNvZGU+YWRkVGV4dCgpPC9jb2RlPiBjYW4gYmUgd3JpdHRlbiBhczo8L3A+Ci08cHJlIGNsYXNzPSJjb2RlIj4KK308L3ByZT4KKzxwPkJ1dCBoZXJlIHByb3BlcnRpZXMgYXJlIDxzdHJvbmc+bm90PC9zdHJvbmc+IHJlc29sdmVkISBGb3IgcmVzb2x2aW5nIHByb3BlcnRpZXMgd2UgaGF2ZSB0byB1c2UKK1Byb2plY3QncyA8Y29kZSBjbGFzcz0iY29kZSI+cmVwbGFjZVByb3BlcnRpZXMoU3RyaW5nIHByb3BuYW1lKTwvY29kZT4gbWV0aG9kIHdoaWNoIHRha2VzIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIGFyZ3VtZW50CithbmQgcmV0dXJucyBpdHMgdmFsdWUgKG9yIDxjb2RlPiR7cHJvcG5hbWV9PC9jb2RlPiBpZiBub3Qgc2V0KS48L3A+Cis8cD5UaHVzLCB0byByZXBsYWNlIHByb3BlcnRpZXMgaW4gdGhlIG5lc3RlZCBub2RlIHRleHQsIG91ciBtZXRob2QgPGNvZGUgY2xhc3M9ImNvZGUiPmFkZFRleHQoKTwvY29kZT4gY2FuIGJlIHdyaXR0ZW4KK2FzOjwvcD4KKzxwcmU+CiAgICAgcHVibGljIHZvaWQgYWRkVGV4dChTdHJpbmcgdGV4dCkgewogICAgICAgICBtZXNzYWdlID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHRleHQpOwotICAgIH0KLTwvcHJlPgorICAgIH08L3ByZT4KIAotCi08YSBuYW1lPSJOZXN0ZWRFbGVtZW50cyI+PC9hPgotPGgyPk5lc3RlZCBFbGVtZW50czwvaDI+Cis8aDIgaWQ9Ik5lc3RlZEVsZW1lbnRzIj5OZXN0ZWQgRWxlbWVudHM8L2gyPgogPHA+VGhlcmUgYXJlIHNldmVyYWwgd2F5cyBmb3IgaW5zZXJ0aW5nIHRoZSBhYmlsaXR5IG9mIGhhbmRsaW5nIG5lc3RlZCBlbGVtZW50cy4gU2VlCi10aGUgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzIj5NYW51YWwgWzRdPC9hPiBmb3Igb3RoZXIuCi1XZSB1c2UgdGhlIGZpcnN0IHdheSBvZiB0aGUgdGhyZWUgZGVzY3JpYmVkIHdheXMuIFRoZXJlIGFyZSBzZXZlcmFsIHN0ZXBzIGZvciB0aGF0OjwvcD48b2w+Ci08bGk+V2UgY3JlYXRlIGEgY2xhc3MgZm9yIGNvbGxlY3RpbmcgYWxsIHRoZSBpbmZvIHRoZSBuZXN0ZWQgZWxlbWVudCBzaG91bGQgY29udGFpbi4KLSAgVGhpcyBjbGFzcyBpcyBjcmVhdGVkIGJ5IHRoZSBzYW1lIHJ1bGVzIGZvciBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMKLSAgYXMgZm9yIHRoZSB0YXNrICg8Y29kZT5zZXQmbHQ7YXR0cmlidXRlbmFtZSZndDs8L2NvZGU+KCkgbWV0aG9kcykuIDwvbGk+Cit0aGUgPGEgaHJlZj0iZGV2ZWxvcC5odG1sI25lc3RlZC1lbGVtZW50cyI+TWFudWFsIFs0XTwvYT4gZm9yIG90aGVyLiAgV2UgdXNlIHRoZSBmaXJzdCB3YXkgb2YgdGhlIHRocmVlIGRlc2NyaWJlZAord2F5cy4gVGhlcmUgYXJlIHNldmVyYWwgc3RlcHMgZm9yIHRoYXQ6PC9wPgorPG9sPgorPGxpPldlIGNyZWF0ZSBhIGNsYXNzIGZvciBjb2xsZWN0aW5nIGFsbCB0aGUgaW5mbyB0aGUgbmVzdGVkIGVsZW1lbnQgc2hvdWxkIGNvbnRhaW4uICBUaGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIHNhbWUKK3J1bGVzIGZvciBhdHRyaWJ1dGVzIGFuZCBuZXN0ZWQgZWxlbWVudHMgYXMgZm9yIHRoZSB0YXNrICg8Y29kZSBjbGFzcz0iY29kZSI+c2V0PGk+QXR0cmlidXRlbmFtZTwvaT4oKTwvY29kZT4KK21ldGhvZHMpLjwvbGk+CiA8bGk+VGhlIHRhc2sgaG9sZHMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaW4gYSBsaXN0LjwvbGk+Ci08bGk+QSBmYWN0b3J5IG1ldGhvZCBpbnN0YW50aWF0ZXMgYW4gb2JqZWN0LCBzYXZlcyB0aGUgcmVmZXJlbmNlIGluIHRoZSBsaXN0Ci0gIGFuZCByZXR1cm5zIGl0IHRvIEFudCBDb3JlLjwvbGk+Ci08bGk+VGhlIGV4ZWN1dGUoKSBtZXRob2QgaXRlcmF0ZXMgb3ZlciB0aGUgbGlzdCBhbmQgZXZhbHVhdGVzIGl0cyB2YWx1ZXMuPC9saT4KKzxsaT5BIGZhY3RvcnkgbWV0aG9kIGluc3RhbnRpYXRlcyBhbiBvYmplY3QsIHNhdmVzIHRoZSByZWZlcmVuY2UgaW4gdGhlIGxpc3QgYW5kIHJldHVybnMgaXQgdG8gQW50IENvcmUuPC9saT4KKzxsaT5UaGUgPGNvZGUgY2xhc3M9ImNvZGUiPmV4ZWN1dGUoKTwvY29kZT4gbWV0aG9kIGl0ZXJhdGVzIG92ZXIgdGhlIGxpc3QgYW5kIGV2YWx1YXRlcyBpdHMgdmFsdWVzLjwvbGk+CiA8L29sPgotPHByZSBjbGFzcz0iY29kZSI+Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Cis8cHJlPgoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAuLi4KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBpZiAobWVzc2FnZSE9bnVsbCkgbG9nKG1lc3NhZ2UpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0PW1lc3NhZ2VzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7ICAgICAgPGI+Ly8gNDwvYj4KLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gKE1lc3NhZ2UpaXQubmV4dCgpOworICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSBsb2cobWVzc2FnZSk7CisgICAgICAgIGZvciAoTWVzc2FnZSBtc2cgOiBtZXNzYWdlcykgeyAgICAgIDxiPi8vIDQ8L2I+CiAgICAgICAgICAgICBsb2cobXNnLmdldE1zZygpKTsKICAgICAgICAgfQogICAgIH0KIAogCi0gICAgVmVjdG9yIG1lc3NhZ2VzID0gbmV3IFZlY3RvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj4vLyAyPC9iPgorICAgIExpc3QmbHQ7TWVzc2FnZSZndDsgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0Jmx0OyZndDsoKTsgICAgICAgICAgICAgICAgICAgICAgPGI+Ly8gMjwvYj4KIAogICAgIHB1YmxpYyBNZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGI+Ly8gMzwvYj4KICAgICAgICAgTWVzc2FnZSBtc2cgPSBuZXcgTWVzc2FnZSgpOwpAQCAtMzcyLDI2ICszNDEsMjIgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2V0TXNnKFN0cmluZyBtc2cpIHsgdGhpcy5tc2cgPSBtc2c7IH0KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRNc2coKSB7IHJldHVybiBtc2c7IH0KICAgICB9Ci0uLi4KLTwvcHJlPgotPHA+VGhlbiB3ZSBjYW4gdXNlIHRoZSBuZXcgbmVzdGVkIGVsZW1lbnQuIEJ1dCB3aGVyZSBpcyB4bWwtbmFtZSBmb3IgdGhhdCBkZWZpbmVkPwotVGhlIG1hcHBpbmcgWE1MLW5hbWUgOiBjbGFzc25hbWUgaXMgZGVmaW5lZCBpbiB0aGUgZmFjdG9yeSBtZXRob2Q6Ci08dHQ+cHVibGljIDxpPmNsYXNzbmFtZTwvaT4gY3JlYXRlPGk+WE1MLW5hbWU8L2k+KCk8L3R0Pi4gVGhlcmVmb3JlIHdlIHdyaXRlIGluCi10aGUgYnVpbGRmaWxlPC9wPgotPHByZSBjbGFzcz0iY29kZSI+CisuLi48L3ByZT4KKzxwPlRoZW4gd2UgY2FuIHVzZSB0aGUgbmV3IG5lc3RlZCBlbGVtZW50LiBCdXQgd2hlcmUgaXMgWE1MLW5hbWUgZm9yIHRoYXQgZGVmaW5lZD8gIFRoZSBtYXBwaW5nIFhNTC1uYW1lICZyYXJyOworY2xhc3NuYW1lIGlzIGRlZmluZWQgaW4gdGhlIGZhY3RvcnkgbWV0aG9kOiA8Y29kZSBjbGFzcz0iY29kZSI+cHVibGljIDxpPmNsYXNzbmFtZTwvaT4KK2NyZWF0ZTxpPlhNTC1uYW1lPC9pPigpPC9jb2RlPi4gVGhlcmVmb3JlIHdlIHdyaXRlIGluIHRoZSBidWlsZGZpbGU8L3A+Cis8cHJlPgogICAgICAgICAmbHQ7aGVsbG93b3JsZCZndDsKICAgICAgICAgICAgICZsdDttZXNzYWdlIG1zZz0iTmVzdGVkIEVsZW1lbnQgMSIvJmd0OwogICAgICAgICAgICAgJmx0O21lc3NhZ2UgbXNnPSJOZXN0ZWQgRWxlbWVudCAyIi8mZ3Q7Ci0gICAgICAgICZsdDsvaGVsbG93b3JsZCZndDsKLTwvcHJlPgotPHA+Tm90ZSB0aGF0IGlmIHlvdSBjaG9vc2UgdG8gdXNlIG1ldGhvZHMgMiBvciAzLCB0aGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBuZXN0ZWQKLWVsZW1lbnQgbXVzdCBiZSBkZWNsYXJlZCBhcyA8Y29kZT5zdGF0aWM8L2NvZGU+PC9wPgorICAgICAgICAmbHQ7L2hlbGxvd29ybGQmZ3Q7PC9wcmU+Cis8cD5Ob3RlIHRoYXQgaWYgeW91IGNob29zZSB0byB1c2UgbWV0aG9kcyAyIG9yIDMsIHRoZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIG5lc3RlZCBlbGVtZW50IG11c3QgYmUgZGVjbGFyZWQKK2FzIDxjb2RlPnN0YXRpYzwvY29kZT48L3A+CiAKLTxhIG5hbWU9ImNvbXBsZXgiPjwvYT4KLTxoMj5PdXIgdGFzayBpbiBhIGxpdHRsZSBtb3JlIGNvbXBsZXggdmVyc2lvbjwvaDI+Cis8aDIgaWQ9ImNvbXBsZXgiPk91ciB0YXNrIGluIGEgbGl0dGxlIG1vcmUgY29tcGxleCB2ZXJzaW9uPC9oMj4KIDxwPkZvciByZWNhcGl0dWxhdGlvbiBub3cgYSBsaXR0bGUgcmVmYWN0b3JlZCBidWlsZGZpbGU6PC9wPgotPHByZSBjbGFzcz0iY29kZSI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8mZ3Q7Cis8cHJlPgorJmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKICZsdDtwcm9qZWN0IG5hbWU9Ik15VGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idXNlIiZndDsKIAogICAgICZsdDtwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0ic3JjIi8mZ3Q7CkBAIC00NTcsMTggKzQyMiwxNSBAQAogCiAgICAgJmx0O3RhcmdldCBuYW1lPSJ1c2UiCiAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVHJ5IGFsbCAody9vdXQgdXNlLmZhaWwpIgotICAgICAgICAgICAgZGVwZW5kcz0idXNlLndpdGhvdXQsdXNlLm1lc3NhZ2UsdXNlLm5lc3RlZFRleHQsdXNlLm5lc3RlZEVsZW1lbnQiCi0gICAgLyZndDsKKyAgICAgICAgICAgIGRlcGVuZHM9InVzZS53aXRob3V0LHVzZS5tZXNzYWdlLHVzZS5uZXN0ZWRUZXh0LHVzZS5uZXN0ZWRFbGVtZW50Ii8mZ3Q7CiAKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgotCi1BbmQgdGhlIGNvZGUgb2YgdGhlIHRhc2s6Ci08cHJlIGNsYXNzPSJjb2RlIj4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KKzxwPkFuZCB0aGUgY29kZSBvZiB0aGUgdGFzazo8L3A+Cis8cHJlPgogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBUaGUgdGFzayBvZiB0aGUgdHV0b3JpYWwuCkBAIC01MDIsMTggKzQ2NCwxNyBAQAogICAgICAgICBpZiAoZmFpbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsIHJlcXVlc3RlZC4iKTsKIAogICAgICAgICAvLyBoYW5kbGUgYXR0cmlidXRlICdtZXNzYWdlJyBhbmQgbmVzdGVkIHRleHQKLSAgICAgICAgaWYgKG1lc3NhZ2UhPW51bGwpIGxvZyhtZXNzYWdlKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkgbG9nKG1lc3NhZ2UpOwogCiAgICAgICAgIC8vIGhhbmRsZSBuZXN0ZWQgZWxlbWVudHMKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdD1tZXNzYWdlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgTWVzc2FnZSBtc2cgPSAoTWVzc2FnZSlpdC5uZXh0KCk7CisgICAgICAgIGZvciAoTWVzc2FnZSBtc2cgOiBtZXNzYWdlcykgewogICAgICAgICAgICAgbG9nKG1zZy5nZXRNc2coKSk7CiAgICAgICAgIH0KICAgICB9CiAKIAogICAgIC8qKiBTdG9yZSBuZXN0ZWQgJ21lc3NhZ2Uncy4gKi8KLSAgICBWZWN0b3IgbWVzc2FnZXMgPSBuZXcgVmVjdG9yKCk7CisgICAgTGlzdCZsdDtNZXNzYWdlJmd0OyBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QmbHQ7Jmd0OygpOwogCiAgICAgLyoqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBuZXN0ZWQgJ21lc3NhZ2Uncy4gKi8KICAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgewpAQCAtNTMzLDEwICs0OTQsOCBAQAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1zZygpIHsgcmV0dXJuIG1zZzsgfQogICAgIH0KIAotfQotPC9wcmU+Ci0KLUFuZCBpdCB3b3JrczoKK308L3ByZT4KKzxwPkFuZCBpdCB3b3Jrczo8L3A+CiA8cHJlIGNsYXNzPSJvdXRwdXQiPgogQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0O2FudAogQnVpbGRmaWxlOiBidWlsZC54bWwKQEAgLTU4NSwzNiArNTQ0LDI2IEBACiBDOlx0bXBcYW50dGVzdHNcTXlGaXJzdFRhc2tcYnVpbGQueG1sOjM2OiBGYWlsIHJlcXVlc3RlZC4KIAogVG90YWwgdGltZTogMSBzZWNvbmQKLUM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDsKLTwvcHJlPgotTmV4dCBzdGVwOiB0ZXN0IC4uLgorQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0OzwvcHJlPgorPHA+TmV4dCBzdGVwOiB0ZXN0IC4uLjwvcD4KIAorPGgyIGlkPSJUZXN0aW5nVGFza3MiPlRlc3QgdGhlIFRhc2s8L2gyPgorPHA+V2UgaGF2ZSB3cml0dGVuIGEgdGVzdCBhbHJlYWR5OiB0aGUgPHE+dXNlLio8L3E+IHRhcmdldHMgaW4gdGhlIGJ1aWxkZmlsZS4gQnV0IGl0J3MgZGlmZmljdWx0IHRvIHRlc3QgdGhhdAorYXV0b21hdGljYWxseS4gQ29tbW9ubHkgKGFuZCBpbiBBbnQpIEpVbml0IGlzIHVzZWQgZm9yIHRoYXQuIEZvciB0ZXN0aW5nIHRhc2tzIEFudCBwcm92aWRlcyBhIEpVbml0CitSdWxlIDxjb2RlIGNsYXNzPSJjb2RlIj5vcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlPC9jb2RlPi4gIFRoaXMgY2xhc3MgcHJvdmlkZXMgc29tZSBmb3IgdGVzdGluZyB0YXNrcyB1c2VmdWwKK21ldGhvZHM6IGluaXRpYWxpemUgQW50LCBsb2FkIGEgYnVpbGRmaWxlLCBleGVjdXRlIHRhcmdldHMsIGNhcHR1cmUgZGVidWcgYW5kIHJ1biBsb2dzIC4uLjwvcD4KIAotCi08YSBuYW1lPSJUZXN0aW5nVGFza3MiPjwvYT4KLTxoMj5UZXN0IHRoZSBUYXNrPC9oMj4KLTxwPldlIGhhdmUgd3JpdHRlbiBhIHRlc3QgYWxyZWFkeTogdGhlIHVzZS4qIHRhc2tzIGluIHRoZSBidWlsZGZpbGUuIEJ1dCBpdHMKLWRpZmZpY3VsdCB0byB0ZXN0IHRoYXQgYXV0b21hdGljYWxseS4gQ29tbW9uIChhbmQgaW4gQW50KSB1c2VkIGlzIEpVbml0IGZvcgotdGhhdC4gRm9yIHRlc3RpbmcgdGFza3MgQW50IHByb3ZpZGVzIGEgSlVuaXQgUnVsZSA8dHQ+b3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTwvdHQ+LgotVGhpcyBjbGFzcyBwcm92aWRlcyBzb21lIGZvciB0ZXN0aW5nIHRhc2tzIHVzZWZ1bCBtZXRob2RzOgotaW5pdGlhbGl6ZSBBbnQsIGxvYWQgYSBidWlsZGZpbGUsIGV4ZWN1dGUgdGFyZ2V0cywgY2FwdHVyaW5nIGRlYnVnIGFuZCBydW4gbG9ncyAuLi48L3A+Ci0KLTxwPkluIEFudCBpdCBpcyB1c3VhbCB0aGF0IHRoZSB0ZXN0Y2FzZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgdGFzayB3aXRoIGEgcHJlcGVuZGluZwotPGk+VGVzdDwvaT4sIHRoZXJlZm9yZSB3ZSB3aWxsIGNyZWF0ZSBhIGZpbGUgPGk+SGVsbG9Xb3JsZFRlc3QuamF2YTwvaT4uIEJlY2F1c2Ugd2UKLWhhdmUgYSB2ZXJ5IHNtYWxsIHByb2plY3Qgd2UgY2FuIHB1dCB0aGlzIGZpbGUgaW50byA8aT5zcmM8L2k+IGRpcmVjdG9yeSAoQW50J3Mgb3duCi10ZXN0Y2xhc3NlcyBhcmUgaW4gL3NyYy90ZXN0Y2FzZXMvLi4uKS4gQmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgd3JpdHRlbiBvdXIgdGVzdHMKLWZvciAiaGFuZC10ZXN0IiB3ZSBjYW4gdXNlIHRoYXQgZm9yIGF1dG9tYXRpYyB0ZXN0cywgdG9vLiBCdXQgdGhlcmUgaXMgb25lIGxpdHRsZQotcHJvYmxlbSB3ZSBoYXZlIHRvIHNvbHZlOiBhbGwgdGVzdCBzdXBwb3J0aW5nIGNsYXNzZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBiaW5hcnkKLWRpc3RyaWJ1dGlvbiBvZiBBbnQuIFNvIHlvdSBjYW4gYnVpbGQgdGhlIHNwZWNpYWwgamFyIGZpbGUgZnJvbSBzb3VyY2UgZGlzdHJvIHdpdGgKLXRhcmdldCAidGVzdC1qYXIiIG9yIHlvdSBjYW4gZG93bmxvYWQgYSBuaWdodGx5IGJ1aWxkIGZyb20KLTxhIGhyZWY9Imh0dHA6Ly9ndW1wLmNvdmFsZW50Lm5ldC9qYXJzL2xhdGVzdC9hbnQvYW50LXRlc3R1dGlsLmphciI+Ci1odHRwOi8vZ3VtcC5jb3ZhbGVudC5uZXQvamFycy9sYXRlc3QvYW50L2FudC10ZXN0dXRpbC5qYXIgWzVdPC9hPi48L3A+Cis8cD5JbiBBbnQgaXQgaXMgdXN1YWwgdGhhdCB0aGUgdGVzdGNhc2UgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHRhc2sgd2l0aCBhIHByZXBlbmRlZCA8Y29kZT5UZXN0PC9jb2RlPiwgdGhlcmVmb3JlIHdlCit3aWxsIGNyZWF0ZSBhIGZpbGUgPHNhbXA+SGVsbG9Xb3JsZFRlc3QuamF2YTwvc2FtcD4uIEJlY2F1c2Ugd2UgaGF2ZSBhIHZlcnkgc21hbGwgcHJvamVjdCB3ZSBjYW4gcHV0IHRoaXMgZmlsZQoraW50byA8c2FtcD5zcmM8L3NhbXA+IGRpcmVjdG9yeSAoQW50J3Mgb3duIHRlc3RjbGFzc2VzIGFyZSBpbiA8c2FtcD4vc3JjL3Rlc3RjYXNlcy8uLi48L3NhbXA+KS4gQmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkKK3dyaXR0ZW4gb3VyIHRlc3RzIGZvciAiaGFuZC10ZXN0IiB3ZSBjYW4gdXNlIHRoYXQgZm9yIGF1dG9tYXRpYyB0ZXN0cywgdG9vLiBBbGwgdGVzdCBzdXBwb3J0aW5nIGNsYXNzZXMgYXJlIGEgcGFydCBvZgordGhlIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IDxlbT5zaW5jZSBBbnQgMS43LjA8L2VtPiBpbiBmb3JtIG9mIDxzYW1wPmFudC10ZXN0dXRpbC5qYXI8L3NhbXA+LiBZb3UgY2FuIGFsc28gYnVpbGQgdGhlCitqYXIgZmlsZSBmcm9tIHNvdXJjZSBkaXN0cm8gd2l0aCB0YXJnZXQgInRlc3QtamFyIi4KIAogPHA+Rm9yIGV4ZWN1dGluZyB0aGUgdGVzdCBhbmQgY3JlYXRpbmcgYSByZXBvcnQgd2UgbmVlZCB0aGUgb3B0aW9uYWwgdGFza3MgPGNvZGU+Jmx0O2p1bml0Jmd0OzwvY29kZT4KIGFuZCA8Y29kZT4mbHQ7anVuaXRyZXBvcnQmZ3Q7PC9jb2RlPi4gU28gd2UgYWRkIHRvIHRoZSBidWlsZGZpbGU6PC9wPgotPHByZSBjbGFzcz0iY29kZSI+Ci0uLi4KLTxmb250IGNvbG9yPSIjOUY5RjlGIj4mbHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIDwvZm9udD5kZWZhdWx0PSJ0ZXN0Ijxmb250IGNvbG9yPSIjOUY5RjlGIj4mZ3Q7PC9mb250PgorPHByZT4KKzxzcGFuIHN0eWxlPSJjb2xvcjpncmF5Ij4mbHQ7cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIDwvc3Bhbj5kZWZhdWx0PSJ0ZXN0IjxzcGFuIHN0eWxlPSJjb2xvcjpncmF5Ij4mZ3Q7PC9zcGFuPgogLi4uCiAgICAgJmx0O3Byb3BlcnR5IG5hbWU9ImFudC50ZXN0LmxpYiIgdmFsdWU9ImFudC10ZXN0dXRpbC5qYXIiLyZndDsKICAgICAmbHQ7cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgICB2YWx1ZT0icmVwb3J0Ii8mZ3Q7CkBAIC02MzksMTAgKzU4OCwxMCBAQAogICAgICAgICAmbHQ7L2RlbGV0ZSZndDsKICAgICAmbHQ7L3RhcmdldCZndDsKIAotICAgIDxmb250IGNvbG9yPSIjOUY5RjlGIj4mbHQ7dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayImZ3Q7CisgICAgPHNwYW4gc3R5bGU9ImNvbG9yOmdyYXkiPiZsdDt0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIFZlY3RvciB0aGUgVGFzayImZ3Q7CiAgICAgICAgICZsdDtta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8mZ3Q7Ci0gICAgICAgICZsdDtqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiA8L2ZvbnQ+Y2xhc3NwYXRoPSIke2FudC50ZXN0LmxpYn0iPGZvbnQgY29sb3I9IiM5RjlGOUYiPi8mZ3Q7Ci0gICAgJmx0Oy90YXJnZXQmZ3Q7PC9mb250PgorICAgICAgICAmbHQ7amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgPC9zcGFuPmNsYXNzcGF0aD0iJHthbnQudGVzdC5saWJ9IjxzcGFuIHN0eWxlPSJjb2xvcjpncmF5Ij4vJmd0OworICAgICZsdDsvdGFyZ2V0Jmd0Ozwvc3Bhbj4KIC4uLgogICAgICZsdDt0YXJnZXQgbmFtZT0ianVuaXQiIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSB1bml0IHRlc3RzIiBkZXBlbmRzPSJqYXIiJmd0OwogICAgICAgICAmbHQ7ZGVsZXRlIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iLyZndDsKQEAgLTY2OCwxNyArNjE3LDE2IEBACiAKICAgICAmbHQ7dGFyZ2V0IG5hbWU9InRlc3QiCiAgICAgICAgICAgICBkZXBlbmRzPSJqdW5pdCxqdW5pdHJlcG9ydCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiCi0gICAgLyZndDsKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiLyZndDsKIC4uLgotPC9wcmU+Cis8c3BhbiBzdHlsZT0iY29sb3I6Z3JheSI+Jmx0Oy9wcm9qZWN0Jmd0Ozwvc3Bhbj48L3ByZT4KIAotPHA+QmFjayB0byB0aGUgPGk+c3JjL0hlbGxvV29ybGRUZXN0LmphdmE8L2k+LiBXZSBjcmVhdGUgYSBjbGFzcyB3aXRoIGEgcHVibGljCi08aT5CdWlsZEZpbGVSdWxlPC9pPiBmaWVsZCBhbm5vdGF0ZWQgd2l0aCBKVW5pdCdzIDxpPkBSdWxlPC9pPiBhbm5vdGF0aW9uLiBBcyBwZXIKLWNvbnZlbnRpb25hbCBKVW5pdDQgdGVzdHMsIHRoaXMgY2xhc3Mgc2hvdWxkIGhhdmUgbm8gY29uc3RydWN0b3JzLCBvciBhIGRlZmF1bHQgbm8tYXJncwotY29uc3RydWN0b3IsIHNldHVwIG1ldGhvZHMgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIDxpPkBCZWZvcmU8L2k+LCB0ZWFyIGRvd24gbWV0aG9kcwotYW5ub3RhdGVkIHdpdGggPGk+QEFmdGVyPC9pPiBhbmQgYW55IHRlc3QgbWV0aG9kIGFubm90YXRlZCB3aXRoIDxpPkBUZXN0PC9pPi4KLTxwcmUgY2xhc3M9ImNvZGUiPgorPHA+QmFjayB0byB0aGUgPHNhbXA+c3JjL0hlbGxvV29ybGRUZXN0LmphdmE8L3NhbXA+LiBXZSBjcmVhdGUgYSBjbGFzcyB3aXRoIGEKK3B1YmxpYyA8Y29kZSBjbGFzcz0iY29kZSI+QnVpbGRGaWxlUnVsZTwvY29kZT4gZmllbGQgYW5ub3RhdGVkIHdpdGggSlVuaXQncyA8Y29kZSBjbGFzcz0iY29kZSI+QFJ1bGU8L2NvZGU+Cithbm5vdGF0aW9uLiBBcyBwZXIgY29udmVudGlvbmFsIEpVbml0NCB0ZXN0cywgdGhpcyBjbGFzcyBzaG91bGQgaGF2ZSBubyBjb25zdHJ1Y3RvcnMsIG5vciBhIGRlZmF1bHQgbm8tYXJncyBjb25zdHJ1Y3RvciwKK3NldHVwIG1ldGhvZHMgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIDxjb2RlIGNsYXNzPSJjb2RlIj5AQmVmb3JlPC9jb2RlPiwgdGVhciBkb3duIG1ldGhvZHMgYW5ub3RhdGVkCit3aXRoIDxjb2RlIGNsYXNzPSJjb2RlIj5AQWZ0ZXI8L2NvZGU+IGFuZCBhbnkgdGVzdCBtZXRob2QgYW5ub3RhdGVkIHdpdGggPGNvZGUgY2xhc3M9ImNvZGUiPkBUZXN0PC9jb2RlPi4KKzxwcmU+CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNzM2LDExICs2ODQsOSBAQAogICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIk5lc3RlZCBFbGVtZW50IDEiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIk5lc3RlZCBFbGVtZW50IDIiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgIH0KLX0KLTwvcHJlPgorfTwvcHJlPgogCi08cD5XaGVuIHN0YXJ0aW5nIDx0dD5hbnQ8L3R0PiB3ZSdsbCBnZXQgYSBzaG9ydCBtZXNzYWdlIHRvIFNURE9VVCBhbmQKLWEgbmljZSBIVE1MLXJlcG9ydC48L3A+Cis8cD5XaGVuIHN0YXJ0aW5nIDxrYmQ+YW50PC9rYmQ+IHdlJ2xsIGdldCBhIHNob3J0IG1lc3NhZ2UgdG8gU1RET1VUIGFuZCBhIG5pY2UgSFRNTCByZXBvcnQuPC9wPgogPHByZSBjbGFzcz0ib3V0cHV0Ij4KIEM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDthbnQKIEJ1aWxkZmlsZTogYnVpbGQueG1sCkBAIC03NjgsMzAgKzcxNCwyOSBAQAogCiBCVUlMRCBTVUNDRVNTRlVMCiBUb3RhbCB0aW1lOiA3IHNlY29uZHMKLUM6XHRtcFxhbnR0ZXN0c1xNeUZpcnN0VGFzayZndDsKLTwvcHJlPgorQzpcdG1wXGFudHRlc3RzXE15Rmlyc3RUYXNrJmd0OzwvcHJlPgogCis8aDIgaWQ9IkRlYnVnZ2luZyI+RGVidWdnaW5nPC9oMj4KIAotPGEgbmFtZT0iRGVidWdnaW5nIj48L2E+Ci08aDI+RGVidWdnaW5nPC9oMj4KLQotPHA+VHJ5IHJ1bm5pbmcgQW50IHdpdGggdGhlIGZsYWcgPGNvZGU+LXZlcmJvc2U8L2NvZGU+LiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHRyeSBmbGFnIDxjb2RlPi1kZWJ1ZzwvY29kZT4uPC9wPgotPHA+Rm9yIGRlZXBlciBpc3N1ZXMsIHlvdSBtYXkgbmVlZCB0byBydW4gdGhlIGN1c3RvbSB0YXNrIGNvZGUgaW4gYSBKYXZhIGRlYnVnZ2VyLiAgRmlyc3QsIGdldCB0aGUgc291cmNlIGZvciBBbnQgYW5kIGJ1aWxkIGl0IHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLjwvcD4KLTxwPlNpbmNlIEFudCBpcyBhIGxhcmdlIHByb2plY3QsIGl0IGNhbiBiZSBhIGxpdHRsZSB0cmlja3kgdG8gc2V0IHRoZSByaWdodCBicmVha3BvaW50cy4gIEhlcmUgYXJlIHR3byBpbXBvcnRhbnQgYnJlYWtwb2ludHMgZm9yIHZlcnNpb24gMS44OjwvcD4KKzxwPlRyeSBydW5uaW5nIEFudCB3aXRoIHRoZSBmbGFnIDxrYmQ+LXZlcmJvc2U8L2tiZD4uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdHJ5IGZsYWcgPGtiZD4tZGVidWc8L2tiZD4uPC9wPgorPHA+Rm9yIGRlZXBlciBpc3N1ZXMsIHlvdSBtYXkgbmVlZCB0byBydW4gdGhlIGN1c3RvbSB0YXNrIGNvZGUgaW4gYSBKYXZhIGRlYnVnZ2VyLiAgRmlyc3QsIGdldCB0aGUgc291cmNlIGZvciBBbnQgYW5kCitidWlsZCBpdCB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi48L3A+Cis8cD5TaW5jZSBBbnQgaXMgYSBsYXJnZSBwcm9qZWN0LCBpdCBjYW4gYmUgYSBsaXR0bGUgdHJpY2t5IHRvIHNldCB0aGUgcmlnaHQgYnJlYWtwb2ludHMuICBIZXJlIGFyZSB0d28gaW1wb3J0YW50CiticmVha3BvaW50cyBmb3IgdmVyc2lvbiAxLjg6PC9wPgogPHVsPgotICA8bGk+SW5pdGlhbCA8Y29kZT5tYWluKCk8L2NvZGU+IGZ1bmN0aW9uOiA8Y29kZT5jb20uYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIubWFpbigpPC9jb2RlPjwvbGk+Ci0gIDxsaT5UYXNrIGVudHJ5IHBvaW50OiA8Y29kZT5jb20uYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudC5leGVjdXRlKCk8L2NvZGU+PC9saT4KKyAgPGxpPkluaXRpYWwgPGNvZGUgY2xhc3M9ImNvZGUiPm1haW4oKTwvY29kZT4KKyAgZnVuY3Rpb246IDxjb2RlIGNsYXNzPSJjb2RlIj5jb20uYXBhY2hlLnRvb2xzLmFudC5sYXVuY2guTGF1bmNoZXIubWFpbigpPC9jb2RlPjwvbGk+CisgIDxsaT5UYXNrIGVudHJ5IHBvaW50OiA8Y29kZSBjbGFzcz0iY29kZSI+Y29tLmFwYWNoZS50b29scy5hbnQuVW5rbm93bkVsZW1lbnQuZXhlY3V0ZSgpPC9jb2RlPjwvbGk+CiA8L3VsPgogCi08cD5JZiB5b3UgbmVlZCB0byBkZWJ1ZyB3aGVuIGEgdGFzayBhdHRyaWJ1dGUgb3IgdGhlIHRleHQgaXMgc2V0LCBiZWdpbiBieSBkZWJ1Z2dpbmcgaW50byBtZXRob2QgPGNvZGU+ZXhlY3V0ZSgpPC9jb2RlPiBvZiB5b3VyIGN1c3RvbSB0YXNrLiAgVGhlbiBzZXQgYnJlYWtwb2ludHMgaW4gb3RoZXIgbWV0aG9kcy4gIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGNsYXNzIGJ5dGUtY29kZSBoYXMgYmVlbiBsb2FkZWQgYnkgdGhlIEphdmEgVk0uPC9wPgorPHA+SWYgeW91IG5lZWQgdG8gZGVidWcgd2hlbiBhIHRhc2sgYXR0cmlidXRlIG9yIHRoZSB0ZXh0IGlzIHNldCwgYmVnaW4gYnkgZGVidWdnaW5nIGludG8KK21ldGhvZCA8Y29kZSBjbGFzcz0iY29kZSI+ZXhlY3V0ZSgpPC9jb2RlPiBvZiB5b3VyIGN1c3RvbSB0YXNrLiAgVGhlbiBzZXQgYnJlYWtwb2ludHMgaW4gb3RoZXIgbWV0aG9kcy4gIFRoaXMgd2lsbAorZW5zdXJlIHRoZSBjbGFzcyBieXRlY29kZSBoYXMgYmVlbiBsb2FkZWQgYnkgSlZNLjwvcD4KIAotCi0KLTxhIG5hbWU9InJlc291cmNlcyI+PC9hPgotPGgyPlJlc291cmNlczwvaDI+Ci08cD5UaGlzIHR1dG9yaWFsIGFuZCBpdHMgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgdmlhCi08YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTIyNTcwIj5CdWdaaWxsYSBbNl08L2E+LgotVGhlIFpJUCBwcm92aWRlZCB0aGVyZSBjb250YWluczwvcD48dWw+Cis8aDIgaWQ9InJlc291cmNlcyI+UmVzb3VyY2VzPC9oMj4KKzxwPlRoaXMgdHV0b3JpYWwgYW5kIGl0cyByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSB2aWEgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzAiCit0YXJnZXQ9Il90b3AiPkJ1Z1ppbGxhIFs1XTwvYT4uICBUaGUgWklQIHByb3ZpZGVkIHRoZXJlIGNvbnRhaW5zPC9wPgorPHVsPgogPGxpPnRoaXMgaW5pdGlhbCB2ZXJzaW9uIG9mIHRoaXMgdHV0b3JpYWw8L2xpPgogPGxpPnRoZSBidWlsZGZpbGUgKGxhc3QgdmVyc2lvbik8L2xpPgogPGxpPnRoZSBzb3VyY2Ugb2YgdGhlIHRhc2sgKGxhc3QgdmVyc2lvbik8L2xpPgpAQCAtODAxLDE5ICs3NDYsMTkgQEAKIDxsaT5nZW5lcmF0ZWQgamFyPC9saT4KIDxsaT5nZW5lcmF0ZWQgcmVwb3J0czwvbGk+CiA8L3VsPgotPHA+VGhlIGxhc3Qgc291cmNlcyBhbmQgdGhlIGJ1aWxkZmlsZSBhcmUgYWxzbyBhdmFpbGFibGUKLTxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCI+aGVyZSBbN108L2E+IGluc2lkZSB0aGUgbWFudWFsLgotPC9wPgorPHA+VGhlIGxhc3Qgc291cmNlcyBhbmQgdGhlIGJ1aWxkZmlsZSBhcmUgYWxzbyBhdmFpbGFibGUgPGEgaHJlZj0idHV0b3JpYWwtd3JpdGluZy10YXNrcy1zcmMuemlwIj5oZXJlIFs2XTwvYT4gaW5zaWRlCit0aGUgbWFudWFsLjwvcD4KIAotPHA+VXNlZCBMaW5rczo8YnIgLz4KLSZuYnNwOyZuYnNwO1sxXSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL3Byb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9wcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHM8L2E+PGJyIC8+Ci0mbmJzcDsmbmJzcDtbMl0gPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9UYXNrcy90YXNrZGVmLmh0bWwiPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvVGFza3MvdGFza2RlZi5odG1sPC9hPjxiciAvPgotJm5ic3A7Jm5ic3A7WzNdIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sI3NldC1tYWdpYyI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjc2V0LW1hZ2ljPC9hPjxiciAvPgotJm5ic3A7Jm5ic3A7WzRdIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9tYW51YWwvZGV2ZWxvcC5odG1sI25lc3RlZC1lbGVtZW50cyI+aHR0cDovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzPC9hPjxiciAvPgotJm5ic3A7Jm5ic3A7WzVdIDxhIGhyZWY9Imh0dHA6Ly9ndW1wLmNvdmFsZW50Lm5ldC9qYXJzL2xhdGVzdC9hbnQvYW50LXRlc3R1dGlsLmphciI+aHR0cDovL2d1bXAuY292YWxlbnQubmV0L2phcnMvbGF0ZXN0L2FudC9hbnQtdGVzdHV0aWwuamFyPC9hPjxiciAvPgotJm5ic3A7Jm5ic3A7WzZdIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzAiPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzA8L2E+PGJyIC8+Ci0mbmJzcDsmbmJzcDtbN10gPGEgaHJlZj0idHV0b3JpYWwtd3JpdGluZy10YXNrcy1zcmMuemlwIj50dXRvcmlhbC13cml0aW5nLXRhc2tzLXNyYy56aXA8L2E+PGJyIC8+Ci08L3A+Cis8cD5Vc2VkIExpbmtzOjwvcD4KKzxvbCBjbGFzcz0icmVmcyI+Cis8bGk+PGEgaHJlZj0icHJvcGVydGllcy5odG1sI2J1aWx0LWluLXByb3BzIj5odHRwczovL2FudC5hcGFjaGUub3JnL21hbnVhbC9wcm9wZXJ0aWVzLmh0bWwjYnVpbHQtaW4tcHJvcHM8L2E+PC9saT4KKzxsaT48YSBocmVmPSJUYXNrcy90YXNrZGVmLmh0bWwiPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL1Rhc2tzL3Rhc2tkZWYuaHRtbDwvYT48L2xpPgorPGxpPjxhIGhyZWY9ImRldmVsb3AuaHRtbCNzZXQtbWFnaWMiPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFudWFsL2RldmVsb3AuaHRtbCNzZXQtbWFnaWM8L2E+PC9saT4KKzxsaT48YSBocmVmPSJkZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzIj5odHRwczovL2FudC5hcGFjaGUub3JnL21hbnVhbC9kZXZlbG9wLmh0bWwjbmVzdGVkLWVsZW1lbnRzPC9hPjwvbGk+Cis8bGk+PGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjI1NzAiCisgICAgICAgdGFyZ2V0PSJfdG9wIj5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yMjU3MDwvYT48L2xpPgorPGxpPjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3Mtc3JjLnppcCI+dHV0b3JpYWwtd3JpdGluZy10YXNrcy1zcmMuemlwPC9hPjwvbGk+Cis8L29sPgogCiA8L2JvZHk+CiA8L2h0bWw+CmRpZmYgLS1naXQgYS9tYW51YWwvdHV0b3JpYWxzLmh0bWwgYi9tYW51YWwvdHV0b3JpYWxzLmh0bWwKaW5kZXggNTcyMDQ3My4uY2JmZGFmZiAxMDA2NDQKLS0tIGEvbWFudWFsL3R1dG9yaWFscy5odG1sCisrKyBiL21hbnVhbC90dXRvcmlhbHMuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogPHRpdGxlPlR1dG9yaWFsczwvdGl0bGU+CiA8YmFzZSB0YXJnZXQ9Im1haW5GcmFtZSIvPgpAQCAtMzAsMTYgKzMwLDE0IEBACiA8aDM+VHV0b3JpYWxzPC9oMz4KIAogPHA+PGEgaHJlZj0idHV0b3JpYWwtSGVsbG9Xb3JsZFdpdGhBbnQuaHRtbCI+SGVsbG8gV29ybGQgd2l0aCBBcGFjaGUgQW50PC9hPjxici8+Ci1BIHN0ZXAgYnkgc3RlcCB0dXRvcmlhbCBmb3Igc3RhcnRpbmcgamF2YSBwcm9ncmFtbWluZyB3aXRoIEFudC48L3A+CitBIHN0ZXAgYnkgc3RlcCB0dXRvcmlhbCBmb3Igc3RhcnRpbmcgSmF2YSBwcm9ncmFtbWluZyB3aXRoIEFudC48L3A+CiAKIDxwPjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+V3JpdGluZyBUYXNrczwvYT48YnIvPgogQSBzdGVwIGJ5IHN0ZXAgdHV0b3JpYWwgZm9yIHdyaXRpbmcgdGFza3MuPC9wPgogCiA8cD48YSBocmVmPSJ0dXRvcmlhbC10YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLmh0bWwiPlRhc2tzIHVzaW5nIFByb3BlcnRpZXMsIEZpbGVzZXRzICZhbXA7IFBhdGhzPC9hPjxici8+Ci1Ib3cgdG8gZ2V0IGFuZCBzZXQgcHJvcGVydGllcyBhbmQgaG93IHRvIHVzZSBuZXN0ZWQgZmlsZXNldHMgYW5kIHBhdGhzIAorSG93IHRvIGdldCBhbmQgc2V0IHByb3BlcnRpZXMgYW5kIGhvdyB0byB1c2UgbmVzdGVkIGZpbGVzZXRzIGFuZCBwYXRocwogd2hpbGUgd3JpdGluZyB0YXNrcy4gRmluYWxseSBpdCBleHBsYWlucyBob3cgdG8gY29udHJpYnV0ZSB0YXNrcyB0byBBbnQuPC9wPgogCi0KLQogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWFudWFsL3VzaW5nLmh0bWwgYi9tYW51YWwvdXNpbmcuaHRtbAppbmRleCA1YTNjMDZjLi43MjAzZTUxIDEwMDY0NAotLS0gYS9tYW51YWwvdXNpbmcuaHRtbAorKysgYi9tYW51YWwvdXNpbmcuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDE1NiArMTUsMTI1IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiPgogPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3R5bGVzaGVldHMvc3R5bGUuY3NzIj4KIDx0aXRsZT5Xcml0aW5nIGEgU2ltcGxlIEJ1aWxkZmlsZTwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5PgogPGgxPlVzaW5nIEFwYWNoZSBBbnQ8L2gxPgotPGgyPjxhIG5hbWU9ImJ1aWxkZmlsZSI+V3JpdGluZyBhIFNpbXBsZSBCdWlsZGZpbGU8L2E+PC9oMj4KLTxwPkFwYWNoZSBBbnQncyBidWlsZGZpbGVzIGFyZSB3cml0dGVuIGluIFhNTC4gRWFjaCBidWlsZGZpbGUgY29udGFpbnMgb25lIHByb2plY3QKLWFuZCBhdCBsZWFzdCBvbmUgKGRlZmF1bHQpIHRhcmdldC4gVGFyZ2V0cyBjb250YWluIHRhc2sgZWxlbWVudHMuCi1FYWNoIHRhc2sgZWxlbWVudCBvZiB0aGUgYnVpbGRmaWxlIGNhbiBoYXZlIGFuIDxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUgYW5kCi1jYW4gbGF0ZXIgYmUgcmVmZXJyZWQgdG8gYnkgdGhlIHZhbHVlIHN1cHBsaWVkIHRvIHRoaXMuIFRoZSB2YWx1ZSBoYXMKLXRvIGJlIHVuaXF1ZS4gKEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzZWUgdGhlCi08YSBocmVmPSIjdGFza3MiPiBUYXNrczwvYT4gc2VjdGlvbiBiZWxvdy4pPC9wPgotPGgzPjxhIG5hbWU9InByb2plY3RzIj5Qcm9qZWN0czwvYT48L2gzPgotPHA+QSA8aT5wcm9qZWN0PC9pPiBoYXMgdGhyZWUgYXR0cmlidXRlczo8L3A+Ci08dGFibGUgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iMiIgY2VsbHNwYWNpbmc9IjAiPgorPGgyIGlkPSJidWlsZGZpbGUiPldyaXRpbmcgYSBTaW1wbGUgQnVpbGRmaWxlPC9oMj4KKzxwPkFwYWNoZSBBbnQncyBidWlsZGZpbGVzIGFyZSB3cml0dGVuIGluIFhNTC4gRWFjaCBidWlsZGZpbGUgY29udGFpbnMgb25lIHByb2plY3QgYW5kIGF0IGxlYXN0IG9uZSAoZGVmYXVsdCkKK3RhcmdldC4gVGFyZ2V0cyBjb250YWluIHRhc2sgZWxlbWVudHMuICBFYWNoIHRhc2sgZWxlbWVudCBvZiB0aGUgYnVpbGRmaWxlIGNhbiBoYXZlIGFuIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlIGFuZCBjYW4KK2xhdGVyIGJlIHJlZmVycmVkIHRvIGJ5IHRoZSB2YWx1ZSBzdXBwbGllZCB0byB0aGlzLiBUaGUgdmFsdWUgaGFzIHRvIGJlIHVuaXF1ZS4gKEZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzZWUKK3RoZSA8YSBocmVmPSIjdGFza3MiPlRhc2tzPC9hPiBzZWN0aW9uIGJlbG93Lik8L3A+CisKKzxoMyBpZD0icHJvamVjdHMiPlByb2plY3RzPC9oMz4KKzxwPkEgPGVtPnByb2plY3Q8L2VtPiBoYXMgdGhyZWUgYXR0cmlidXRlczo8L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj48Yj5BdHRyaWJ1dGU8L2I+PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIj48Yj5SZXF1aXJlZDwvYj48L3RkPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bmFtZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj50aGUgbmFtZSBvZiB0aGUgcHJvamVjdC48L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5uYW1lPC90ZD4KKyAgICA8dGQ+dGhlIG5hbWUgb2YgdGhlIHByb2plY3QuPC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5kZWZhdWx0PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBkZWZhdWx0IHRhcmdldCB0byB1c2Ugd2hlbiBubyB0YXJnZXQgaXMgc3VwcGxpZWQuPC90ZD4KLSAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiPk5vOyBob3dldmVyLCA8Yj5zaW5jZSBBbnQgMS42LjA8L2I+LAotICAgICAgICBldmVyeSBwcm9qZWN0IGluY2x1ZGVzIGFuIGltcGxpY2l0IHRhcmdldCB0aGF0IGNvbnRhaW5zIGFueSBhbmQKLSAgICAgICAgYWxsIHRvcC1sZXZlbCB0YXNrcyBhbmQvb3IgdHlwZXMuIFRoaXMgdGFyZ2V0IHdpbGwgYWx3YXlzIGJlCi0gICAgICAgIGV4ZWN1dGVkIGFzIHBhcnQgb2YgdGhlIHByb2plY3QncyBpbml0aWFsaXphdGlvbiwgZXZlbiB3aGVuIEFudCBpcwotICAgICAgICBydW4gd2l0aCB0aGUgPGEgaHJlZj0icnVubmluZy5odG1sI29wdGlvbnMiPi1wcm9qZWN0aGVscDwvYT4gb3B0aW9uLgorICAgIDx0ZD5kZWZhdWx0PC90ZD4KKyAgICA8dGQ+dGhlIGRlZmF1bHQgdGFyZ2V0IHRvIHVzZSB3aGVuIG5vIHRhcmdldCBpcyBzdXBwbGllZC48L3RkPgorICAgIDx0ZD5ObzsgaG93ZXZlciwgPGVtPnNpbmNlIEFudCAxLjYuMDwvZW0+LCBldmVyeSBwcm9qZWN0IGluY2x1ZGVzIGFuIGltcGxpY2l0IHRhcmdldCB0aGF0IGNvbnRhaW5zIGFueSBhbmQgYWxsCisgICAgICB0b3AtbGV2ZWwgdGFza3MgYW5kL29yIHR5cGVzLiBUaGlzIHRhcmdldCB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSBwcm9qZWN0J3MgaW5pdGlhbGl6YXRpb24sIGV2ZW4KKyAgICAgIHdoZW4gQW50IGlzIHJ1biB3aXRoIHRoZSA8YSBocmVmPSJydW5uaW5nLmh0bWwjb3B0aW9ucyI+PGtiZD4tcHJvamVjdGhlbHA8L2tiZD48L2E+IG9wdGlvbi4KICAgICA8L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5iYXNlZGlyPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGFsbCBwYXRoIGNhbGN1bGF0aW9ucyBhcmUKLSAgICAgIGRvbmUuIFRoaXMgYXR0cmlidXRlIG1pZ2h0IGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZwotICAgICAgdGhlICZxdW90O2Jhc2VkaXImcXVvdDsKLSAgICAgIHByb3BlcnR5IGJlZm9yZWhhbmQuIFdoZW4gdGhpcyBpcyBkb25lLCBpdCBtdXN0IGJlIG9taXR0ZWQgaW4gdGhlCi0gICAgICBwcm9qZWN0IHRhZy4gSWYgbmVpdGhlciB0aGUgYXR0cmlidXRlIG5vciB0aGUgcHJvcGVydHkgaGF2ZQotICAgICAgYmVlbiBzZXQsIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBidWlsZGZpbGUgd2lsbCBiZSB1c2VkLjxici8+Ci0gICAgICBBIHJlbGF0aXZlIHBhdGggaXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCi0gICAgICB0aGUgYnVpbGQgZmlsZS4KKyAgICA8dGQ+YmFzZWRpcjwvdGQ+CisgICAgPHRkPnRoZSBiYXNlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGFsbCBwYXRoIGNhbGN1bGF0aW9ucyBhcmUgZG9uZS4gQSByZWxhdGl2ZSBwYXRoIGlzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZQorICAgICAgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGJ1aWxkZmlsZS4KICAgICA8L3RkPgotICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCI+Tm88L3RkPgorICAgIDx0ZD5ObzsgZGVmYXVsdHMgdG8gdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWxkZmlsZSwgdW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlIHByb2plY3QncyA8dmFyPmJhc2VkaXI8L3Zhcj4gb3IKKyAgICAgIHRoZSA8Y29kZT5iYXNlZGlyPC9jb2RlPiBwcm9wZXJ0eTwvdGQ+CiAgIDwvdHI+CiA8L3RhYmxlPgotPHA+T3B0aW9uYWxseSwgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHByb2plY3QgY2FuIGJlIHByb3ZpZGVkIGFzIGEKLXRvcC1sZXZlbCA8Y29kZT4mbHQ7ZGVzY3JpcHRpb24mZ3Q7PC9jb2RlPiBlbGVtZW50IChzZWUgdGhlIDxhCi1ocmVmPSJUeXBlcy9kZXNjcmlwdGlvbi5odG1sIj5kZXNjcmlwdGlvbjwvYT4gdHlwZSkuPC9wPgorPHA+T3B0aW9uYWxseSwgYSBkZXNjcmlwdGlvbiBmb3IgdGhlIHByb2plY3QgY2FuIGJlIHByb3ZpZGVkIGFzIGEgdG9wLWxldmVsIDxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+IGVsZW1lbnQKKyhzZWUgdGhlIDxhIGhyZWY9IlR5cGVzL2Rlc2NyaXB0aW9uLmh0bWwiPmRlc2NyaXB0aW9uPC9hPiB0eXBlKS48L3A+CiAKLTxwPkVhY2ggcHJvamVjdCBkZWZpbmVzIG9uZSBvciBtb3JlIDxpPnRhcmdldHM8L2k+LgotQSB0YXJnZXQgaXMgYSBzZXQgb2YgPGk+dGFza3M8L2k+IHlvdSB3YW50Ci10byBiZSBleGVjdXRlZC4gV2hlbiBzdGFydGluZyBBbnQsIHlvdSBjYW4gc2VsZWN0IHdoaWNoIHRhcmdldChzKSB5b3UKLXdhbnQgdG8gaGF2ZSBleGVjdXRlZC4gV2hlbiBubyB0YXJnZXQgaXMgZ2l2ZW4sCi10aGUgcHJvamVjdCdzIGRlZmF1bHQgaXMgdXNlZC48L3A+Cis8cD5FYWNoIHByb2plY3QgZGVmaW5lcyBvbmUgb3IgbW9yZSA8ZW0+dGFyZ2V0czwvZW0+LiAgQSB0YXJnZXQgaXMgYSBzZXQgb2YgPGVtPnRhc2tzPC9lbT4geW91IHdhbnQgdG8gYmUgZXhlY3V0ZWQuIFdoZW4KK3N0YXJ0aW5nIEFudCwgeW91IGNhbiBzZWxlY3Qgd2hpY2ggdGFyZ2V0KHMpIHlvdSB3YW50IHRvIGhhdmUgZXhlY3V0ZWQuIFdoZW4gbm8gdGFyZ2V0IGlzIGdpdmVuLCB0aGUKK3Byb2plY3QncyA8dmFyPmRlZmF1bHQ8L3Zhcj4gaXMgdXNlZC48L3A+CiAKLTxoMz48YSBuYW1lPSJ0YXJnZXRzIj5UYXJnZXRzPC9hPjwvaDM+Ci08cD5BIHRhcmdldCBjYW4gZGVwZW5kIG9uIG90aGVyIHRhcmdldHMuIFlvdSBtaWdodCBoYXZlIGEgdGFyZ2V0IGZvciBjb21waWxpbmcsCi1mb3IgZXhhbXBsZSwgYW5kIGEgdGFyZ2V0IGZvciBjcmVhdGluZyBhIGRpc3RyaWJ1dGFibGUuIFlvdSBjYW4gb25seSBidWlsZCBhCi1kaXN0cmlidXRhYmxlIHdoZW4geW91IGhhdmUgY29tcGlsZWQgZmlyc3QsIHNvIHRoZSBkaXN0cmlidXRlIHRhcmdldAotPGk+ZGVwZW5kcyBvbjwvaT4gdGhlIGNvbXBpbGUgdGFyZ2V0LiBBbnQgcmVzb2x2ZXMgdGhlc2UgZGVwZW5kZW5jaWVzLjwvcD4KLTxwPkl0IHNob3VsZCBiZSBub3RlZCwgaG93ZXZlciwgdGhhdCBBbnQncyA8Y29kZT5kZXBlbmRzPC9jb2RlPiBhdHRyaWJ1dGUKLW9ubHkgc3BlY2lmaWVzIHRoZSA8aT5vcmRlcjwvaT4gaW4gd2hpY2ggdGFyZ2V0cyBzaG91bGQgYmUgZXhlY3V0ZWQgLSBpdAotZG9lcyBub3QgYWZmZWN0IHdoZXRoZXIgdGhlIHRhcmdldCB0aGF0IHNwZWNpZmllcyB0aGUgZGVwZW5kZW5jeShzKSBnZXRzCi1leGVjdXRlZCBpZiB0aGUgZGVwZW5kZW50IHRhcmdldChzKSBkaWQgbm90IChuZWVkIHRvKSBydW4uCi08L3A+Cis8aDMgaWQ9InRhcmdldHMiPlRhcmdldHM8L2gzPgorPHA+QSB0YXJnZXQgY2FuIGRlcGVuZCBvbiBvdGhlciB0YXJnZXRzLiBZb3UgbWlnaHQgaGF2ZSBhIHRhcmdldCBmb3IgY29tcGlsaW5nLCBmb3IgZXhhbXBsZSwgYW5kIGEgdGFyZ2V0IGZvciBjcmVhdGluZyBhCitkaXN0cmlidXRhYmxlLiBZb3UgY2FuIG9ubHkgYnVpbGQgYSBkaXN0cmlidXRhYmxlIHdoZW4geW91IGhhdmUgY29tcGlsZWQgZmlyc3QsIHNvIHRoZSA8cT5kaXN0cmlidXRlPC9xPgordGFyZ2V0IDxlbT5kZXBlbmRzIG9uPC9lbT4gdGhlIDxxPmNvbXBpbGU8L3E+IHRhcmdldC4gQW50IHJlc29sdmVzIHRoZXNlIGRlcGVuZGVuY2llcy48L3A+Cis8cD5JdCBzaG91bGQgYmUgbm90ZWQsIGhvd2V2ZXIsIHRoYXQgQW50J3MgPHZhcj5kZXBlbmRzPC92YXI+IGF0dHJpYnV0ZSBvbmx5IHNwZWNpZmllcyB0aGUgPGVtPm9yZGVyPC9lbT4gaW4gd2hpY2gKK3RhcmdldHMgc2hvdWxkIGJlIGV4ZWN1dGVkJm1kYXNoO2l0IGRvZXMgbm90IGFmZmVjdCB3aGV0aGVyIHRoZSB0YXJnZXQgdGhhdCBzcGVjaWZpZXMgdGhlIGRlcGVuZGVuY3kocykgZ2V0cyBleGVjdXRlZCBpZgordGhlIGRlcGVuZGVudCB0YXJnZXQocykgZGlkIG5vdCAobmVlZCB0bykgcnVuLjwvcD4KIAotPHA+TW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCi0gIGRlZGljYXRlZCA8YSBocmVmPSJ0YXJnZXRzLmh0bWwiPm1hbnVhbCBwYWdlPC9hPi48L3A+Cis8cD5Nb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUgZGVkaWNhdGVkIDxhIGhyZWY9InRhcmdldHMuaHRtbCI+bWFudWFsIHBhZ2U8L2E+LjwvcD4KIAotPGgzPjxhIG5hbWU9InRhc2tzIj5UYXNrczwvYT48L2gzPgorPGgzIGlkPSJ0YXNrcyI+VGFza3M8L2gzPgogPHA+QSB0YXNrIGlzIGEgcGllY2Ugb2YgY29kZSB0aGF0IGNhbiBiZSBleGVjdXRlZC48L3A+Ci08cD5BIHRhc2sgY2FuIGhhdmUgbXVsdGlwbGUgYXR0cmlidXRlcyAob3IgYXJndW1lbnRzLCBpZiB5b3UgcHJlZmVyKS4gVGhlIHZhbHVlCi1vZiBhbiBhdHRyaWJ1dGUgbWlnaHQgY29udGFpbiByZWZlcmVuY2VzIHRvIGEgcHJvcGVydHkuIFRoZXNlIHJlZmVyZW5jZXMgd2lsbCBiZQotcmVzb2x2ZWQgYmVmb3JlIHRoZSB0YXNrIGlzIGV4ZWN1dGVkLjwvcD4KKzxwPkEgdGFzayBjYW4gaGF2ZSBtdWx0aXBsZSBhdHRyaWJ1dGVzIChvciBhcmd1bWVudHMsIGlmIHlvdSBwcmVmZXIpLiBUaGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIG1pZ2h0IGNvbnRhaW4gcmVmZXJlbmNlcwordG8gYSBwcm9wZXJ0eS4gVGhlc2UgcmVmZXJlbmNlcyB3aWxsIGJlIHJlc29sdmVkIGJlZm9yZSB0aGUgdGFzayBpcyBleGVjdXRlZC48L3A+CiA8cD5UYXNrcyBoYXZlIGEgY29tbW9uIHN0cnVjdHVyZTo8L3A+Ci08YmxvY2txdW90ZT4KLSAgPHByZT4mbHQ7PGk+bmFtZTwvaT4gPGk+YXR0cmlidXRlMTwvaT49JnF1b3Q7PGk+dmFsdWUxPC9pPiZxdW90OyA8aT5hdHRyaWJ1dGUyPC9pPj0mcXVvdDs8aT52YWx1ZTI8L2k+JnF1b3Q7IC4uLiAvJmd0OzwvcHJlPgotPC9ibG9ja3F1b3RlPgotPHA+d2hlcmUgPGk+bmFtZTwvaT4gaXMgdGhlIG5hbWUgb2YgdGhlIHRhc2ssCi08aT5hdHRyaWJ1dGVOPC9pPiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsIGFuZAotPGk+dmFsdWVOPC9pPiBpcyB0aGUgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlLjwvcD4KLTxwPlRoZXJlIGlzIGEgc2V0IG9mIDxhIGhyZWY9InRhc2tsaXN0Lmh0bWwiIHRhcmdldD0ibmF2RnJhbWUiPmJ1aWx0LWluIHRhc2tzPC9hPiwgYnV0IGl0IGlzIGFsc28gdmVyeQotZWFzeSB0byA8YSBocmVmPSJkZXZlbG9wLmh0bWwjd3JpdGluZ293bnRhc2siPndyaXRlIHlvdXIgb3duPC9hPi48L3A+Ci08cD5BbGwgdGFza3Mgc2hhcmUgYSB0YXNrIG5hbWUgYXR0cmlidXRlLiBUaGUgdmFsdWUgb2YKLXRoaXMgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCBpbiB0aGUgbG9nZ2luZyBtZXNzYWdlcyBnZW5lcmF0ZWQgYnkKLUFudC48L3A+Ci1UYXNrcyBjYW4gYmUgYXNzaWduZWQgYW4gPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZToKLTxibG9ja3F1b3RlPgotPHByZT4mbHQ7PGk+dGFza25hbWU8L2k+IGlkPSI8aT50YXNrSUQ8L2k+IiAuLi4gLyZndDs8L3ByZT4KLTwvYmxvY2txdW90ZT4KLXdoZXJlIDxpPnRhc2tuYW1lPC9pPiBpcyB0aGUgbmFtZSBvZiB0aGUgdGFzaywgYW5kIDxpPnRhc2tJRDwvaT4gaXMKLWEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzay4KLVlvdSBjYW4gcmVmZXIgdG8gdGhlCi1jb3JyZXNwb25kaW5nIHRhc2sgb2JqZWN0IGluIHNjcmlwdHMgb3Igb3RoZXIgdGFza3MgdmlhIHRoaXMgbmFtZS4KLUZvciBleGFtcGxlLCBpbiBzY3JpcHRzIHlvdSBjb3VsZCBkbzoKLTxibG9ja3F1b3RlPgorCis8cHJlPiZsdDs8aT5uYW1lPC9pPiA8dmFyPmF0dHJpYnV0ZTE8L3Zhcj49JnF1b3Q7PGk+dmFsdWUxPC9pPiZxdW90OyA8dmFyPmF0dHJpYnV0ZTI8L3Zhcj49JnF1b3Q7PGk+dmFsdWUyPC9pPiZxdW90OyAuLi4gLyZndDs8L3ByZT4KKworPHA+d2hlcmUgPGNvZGU+PGk+bmFtZTwvaT48L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSB0YXNrLCA8dmFyPmF0dHJpYnV0ZU48L3Zhcj4gaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLAorYW5kIDxjb2RlPjxpPnZhbHVlTjwvaT48L2NvZGU+IGlzIHRoZSB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuPC9wPgorPHA+VGhlcmUgaXMgYSBzZXQgb2YgPGEgaHJlZj0idGFza2xpc3QuaHRtbCIgdGFyZ2V0PSJuYXZGcmFtZSI+YnVpbHQtaW4gdGFza3M8L2E+LCBidXQgaXQgaXMgYWxzbyB2ZXJ5IGVhc3kKK3RvIDxhIGhyZWY9ImRldmVsb3AuaHRtbCN3cml0aW5nb3dudGFzayI+d3JpdGUgeW91ciBvd248L2E+LjwvcD4KKzxwPkFsbCB0YXNrcyBjYW4gaGF2ZSBhIDx2YXI+bmFtZTwvdmFyPiBhdHRyaWJ1dGUuIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW4gdGhlIGxvZ2dpbmcgbWVzc2FnZXMKK2dlbmVyYXRlZCBieSBBbnQuPC9wPgorPHA+VGFza3MgY2FuIGJlIGFzc2lnbmVkIGFuIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlOjwvcD4KKworPHByZT4mbHQ7PGk+dGFza25hbWU8L2k+IDx2YXI+aWQ8L3Zhcj49IjxpPnRhc2tJRDwvaT4iIC4uLiAvJmd0OzwvcHJlPgorCis8cD53aGVyZSA8Y29kZT48aT50YXNrbmFtZTwvaT48L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSB0YXNrLCBhbmQgPGNvZGU+PGk+dGFza0lEPC9pPjwvY29kZT4gaXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IKK3RoaXMgdGFzay4gIFlvdSBjYW4gcmVmZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFzayBvYmplY3QgaW4gc2NyaXB0cyBvciBvdGhlciB0YXNrcyB2aWEgdGhpcyBuYW1lLiAgRm9yIGV4YW1wbGUsIGluCitzY3JpcHRzIHlvdSBjb3VsZCBkbzo8L3A+CisKIDxwcmU+CiAmbHQ7c2NyaXB0IC4uLiAmZ3Q7CiAgIHRhc2sxLnNldEZvbygiYmFyIik7Ci0mbHQ7L3NjcmlwdCZndDsKLTwvcHJlPgotPC9ibG9ja3F1b3RlPgotdG8gc2V0IHRoZSA8Y29kZT5mb288L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGlzIHBhcnRpY3VsYXIgdGFzayBpbnN0YW5jZS4KLUluIGFub3RoZXIgdGFzayAod3JpdHRlbiBpbiBKYXZhKSwgeW91IGNhbiBhY2Nlc3MgdGhlIGluc3RhbmNlIHZpYQotPGNvZGU+cHJvamVjdC5nZXRSZWZlcmVuY2UoInRhc2sxIik8L2NvZGU+LgotPHA+Ci1Ob3RlPHN1cD4xPC9zdXA+OiBJZiAmcXVvdDt0YXNrMSZxdW90OyBoYXMgbm90IGJlZW4gcnVuIHlldCwgdGhlbgotaXQgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgKGllLiwgbm8gYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0KSwgYW5kIGlmIGl0IGlzCi1nb2luZyB0byBiZSBjb25maWd1cmVkIGxhdGVyLCBhbnl0aGluZyB5b3UndmUgZG9uZSB0byB0aGUgaW5zdGFuY2UgbWF5Ci1iZSBvdmVyd3JpdHRlbi4KLTwvcD4KLTxwPgotTm90ZTxzdXA+Mjwvc3VwPjogRnV0dXJlIHZlcnNpb25zIG9mIEFudCB3aWxsIG1vc3QgbGlrZWx5IDxpPm5vdDwvaT4KLWJlIGJhY2t3YXJkLWNvbXBhdGlibGUgd2l0aCB0aGlzIGJlaGF2aW91ciwgc2luY2UgdGhlcmUgd2lsbCBsaWtlbHkgYmUgbm8KLXRhc2sgaW5zdGFuY2VzIGF0IGFsbCwgb25seSBwcm94aWVzLgotPC9wPgorJmx0Oy9zY3JpcHQmZ3Q7PC9wcmU+Cis8cD50byBzZXQgdGhlIDxjb2RlPmZvbzwvY29kZT4gYXR0cmlidXRlIG9mIHRoaXMgcGFydGljdWxhciB0YXNrIGluc3RhbmNlLiAgSW4gYW5vdGhlciB0YXNrICh3cml0dGVuIGluIEphdmEpLCB5b3UgY2FuCithY2Nlc3MgdGhlIGluc3RhbmNlIHZpYSA8Y29kZSBjbGFzcz0iY29kZSI+cHJvamVjdC5nZXRSZWZlcmVuY2UoInRhc2sxIik8L2NvZGU+LjwvcD4KKzxwPk5vdGUgMTogSWYgPHE+dGFzazE8L3E+IGhhcyBub3QgYmVlbiBydW4geWV0LCB0aGVuIGl0IGhhcyBub3QgYmVlbiBjb25maWd1cmVkIChpZS4sIG5vIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldCksIGFuZAoraWYgaXQgaXMgZ29pbmcgdG8gYmUgY29uZmlndXJlZCBsYXRlciwgYW55dGhpbmcgeW91J3ZlIGRvbmUgdG8gdGhlIGluc3RhbmNlIG1heSBiZSBvdmVyd3JpdHRlbi48L3A+Cis8cD5Ob3RlIDI6IEZ1dHVyZSB2ZXJzaW9ucyBvZiBBbnQgd2lsbCBtb3N0IGxpa2VseSA8ZW0+bm90PC9lbT4gYmUgYmFja3dhcmQtY29tcGF0aWJsZSB3aXRoIHRoaXMgYmVoYXZpb3VyLCBzaW5jZSB0aGVyZQord2lsbCBsaWtlbHkgYmUgbm8gdGFzayBpbnN0YW5jZXMgYXQgYWxsLCBvbmx5IHByb3hpZXMuPC9wPgogCi08aDM+PGEgbmFtZT0icHJvcGVydGllcyI+UHJvcGVydGllczwvYT48L2gzPgorPGgzIGlkPSJwcm9wZXJ0aWVzIj5Qcm9wZXJ0aWVzPC9oMz4KIAogPHA+UHJvcGVydGllcyBhcmUgYW4gaW1wb3J0YW50IHdheSB0byBjdXN0b21pemUgYSBidWlsZCBwcm9jZXNzIG9yCiAgIHRvIGp1c3QgcHJvdmlkZSBzaG9ydGN1dHMgZm9yIHN0cmluZ3MgdGhhdCBhcmUgdXNlZCByZXBlYXRlZGx5Ci0gIGluc2lkZSBhIGJ1aWxkIGZpbGUuPC9wPgorICBpbnNpZGUgYSBidWlsZGZpbGUuPC9wPgogCi08cD5JbiBpdHMgbW9zdCBzaW1wbGUgZm9ybSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHRoZSBidWlsZCBmaWxlCis8cD5JbiBpdHMgbW9zdCBzaW1wbGUgZm9ybSBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHRoZSBidWlsZGZpbGUKICAgKGZvciBleGFtcGxlIGJ5IHRoZSA8YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4KICAgdGFzaykgb3IgbWlnaHQgYmUgc2V0IG91dHNpZGUgQW50LiAgQSBwcm9wZXJ0eSBoYXMgYSBuYW1lIGFuZCBhCiAgIHZhbHVlOyB0aGUgbmFtZSBpcyBjYXNlLXNlbnNpdGl2ZS4gUHJvcGVydGllcyBtYXkgYmUgdXNlZCBpbiB0aGUKICAgdmFsdWUgb2YgdGFzayBhdHRyaWJ1dGVzIG9yIGluIHRoZSBuZXN0ZWQgdGV4dCBvZiB0YXNrcyB0aGF0IHN1cHBvcnQKICAgdGhlbS4gIFRoaXMgaXMgZG9uZSBieSBwbGFjaW5nIHRoZSBwcm9wZXJ0eSBuYW1lIGJldHdlZW4KLSAgJnF1b3Q7PGNvZGU+JHs8L2NvZGU+JnF1b3Q7IGFuZCAmcXVvdDs8Y29kZT59PC9jb2RlPiZxdW90OyBpbiB0aGUKLSAgYXR0cmlidXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSAmcXVvdDtidWlsZGRpciZxdW90OwotICBwcm9wZXJ0eSB3aXRoIHRoZSB2YWx1ZSAmcXVvdDtidWlsZCZxdW90OywgdGhlbiB0aGlzIGNvdWxkIGJlIHVzZWQKLSAgaW4gYW4gYXR0cmlidXRlIGxpa2UgdGhpczogPGNvZGU+JHtidWlsZGRpcn0vY2xhc3NlczwvY29kZT4uICBUaGlzCi0gIGlzIHJlc29sdmVkIGF0IHJ1bi10aW1lIGFzIDxjb2RlPmJ1aWxkL2NsYXNzZXM8L2NvZGU+LjwvcD4KKyAgPHE+JHs8L3E+IGFuZCA8cT59PC9xPiBpbiB0aGUKKyAgYXR0cmlidXRlIHZhbHVlLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYSA8Y29kZT5idWlsZGRpcjwvY29kZT4KKyAgcHJvcGVydHkgd2l0aCB0aGUgdmFsdWUgPHE+YnVpbGQ8L3E+LCB0aGVuIHRoaXMgY291bGQgYmUgdXNlZAorICBpbiBhbiBhdHRyaWJ1dGUgbGlrZSB0aGlzOiA8c2FtcD4ke2J1aWxkZGlyfS9jbGFzc2VzPC9zYW1wPi4gIFRoaXMKKyAgaXMgcmVzb2x2ZWQgYXQgcnVuLXRpbWUgYXMgPHNhbXA+YnVpbGQvY2xhc3Nlczwvc2FtcD4uPC9wPgogCi08cD5XaXRoIEFudCAxLjguMCBwcm9wZXJ0eSBleHBhbnNpb24gaGFzIGJlY29tZSBtdWNoIG1vcmUgcG93ZXJmdWwKKzxwPjxlbT5TaW5jZSBBbnQgMS44LjA8L2VtPiwgcHJvcGVydHkgZXhwYW5zaW9uIGhhcyBiZWNvbWUgbXVjaCBtb3JlIHBvd2VyZnVsCiAgIHRoYW4gc2ltcGxlIGtleSB2YWx1ZSBwYWlycywgbW9yZSBkZXRhaWxzIGNhbiBiZQogICBmb3VuZCA8YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwiPmluIHRoZSBjb25jZXB0cyBzZWN0aW9uPC9hPiBvZiB0aGlzCiAgIG1hbnVhbC48L3A+CiAKLTxoMz48YSBuYW1lPSJleGFtcGxlIj5FeGFtcGxlIEJ1aWxkZmlsZTwvYT48L2gzPgorPGgzIGlkPSJleGFtcGxlIj5FeGFtcGxlIEJ1aWxkZmlsZTwvaDM+CiA8cHJlPgogJmx0O3Byb2plY3QgbmFtZT0mcXVvdDtNeVByb2plY3QmcXVvdDsgZGVmYXVsdD0mcXVvdDtkaXN0JnF1b3Q7IGJhc2VkaXI9JnF1b3Q7LiZxdW90OyZndDsKICAgJmx0O2Rlc2NyaXB0aW9uJmd0OwpAQCAtMTgzLDcgKzE1Myw3IEBACiAKICAgJmx0O3RhcmdldCBuYW1lPSZxdW90O2NvbXBpbGUmcXVvdDsgZGVwZW5kcz0mcXVvdDtpbml0JnF1b3Q7CiAgICAgICAgIGRlc2NyaXB0aW9uPSZxdW90O2NvbXBpbGUgdGhlIHNvdXJjZSZxdW90OyZndDsKLSAgICAmbHQ7IS0tIENvbXBpbGUgdGhlIGphdmEgY29kZSBmcm9tICR7c3JjfSBpbnRvICR7YnVpbGR9IC0tJmd0OworICAgICZsdDshLS0gQ29tcGlsZSB0aGUgSmF2YSBjb2RlIGZyb20gJHtzcmN9IGludG8gJHtidWlsZH0gLS0mZ3Q7CiAgICAgJmx0O2phdmFjIHNyY2Rpcj0mcXVvdDske3NyY30mcXVvdDsgZGVzdGRpcj0mcXVvdDske2J1aWxkfSZxdW90Oy8mZ3Q7CiAgICZsdDsvdGFyZ2V0Jmd0OwogCkBAIC0yMDIsMjY4ICsxNzIsMTk5IEBACiAgICAgJmx0O2RlbGV0ZSBkaXI9JnF1b3Q7JHtidWlsZH0mcXVvdDsvJmd0OwogICAgICZsdDtkZWxldGUgZGlyPSZxdW90OyR7ZGlzdH0mcXVvdDsvJmd0OwogICAmbHQ7L3RhcmdldCZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPgorJmx0Oy9wcm9qZWN0Jmd0OzwvcHJlPgogCi08cD5Ob3RpY2UgdGhhdCB3ZSBhcmUgZGVjbGFyaW5nIHByb3BlcnRpZXMgb3V0c2lkZSBhbnkgdGFyZ2V0LiAgQXMgb2YKLUFudCAxLjYgYWxsIHRhc2tzIGNhbiBiZSBkZWNsYXJlZCBvdXRzaWRlIHRhcmdldHMgKGVhcmxpZXIgdmVyc2lvbgotb25seSBhbGxvd2VkIDx0dD4mbHQ7cHJvcGVydHkmZ3Q7PC90dD4sPHR0PiZsdDt0eXBlZGVmJmd0OzwvdHQ+IGFuZAotPHR0PiZsdDt0YXNrZGVmJmd0OzwvdHQ+KS4gIFdoZW4geW91IGRvIHRoaXMgdGhleSBhcmUgZXZhbHVhdGVkIGJlZm9yZQotYW55IHRhcmdldHMgYXJlIGV4ZWN1dGVkLiAgU29tZSB0YXNrcyB3aWxsIGdlbmVyYXRlIGJ1aWxkIGZhaWx1cmVzIGlmCi10aGV5IGFyZSB1c2VkIG91dHNpZGUgb2YgdGFyZ2V0cyBhcyB0aGV5IG1heSBjYXVzZSBpbmZpbml0ZSBsb29wcwotb3RoZXJ3aXNlICg8Y29kZT4mbHQ7YW50Y2FsbCZndDs8L2NvZGU+IGZvciBleGFtcGxlKS48L3A+Cis8cD5Ob3RpY2UgdGhhdCB3ZSBhcmUgZGVjbGFyaW5nIHByb3BlcnRpZXMgb3V0c2lkZSBhbnkgdGFyZ2V0LiA8ZW0+U2luY2UgQW50IDEuNjwvZW0+LCBhbGwgdGFza3MgY2FuIGJlIGRlY2xhcmVkIG91dHNpZGUKK3RhcmdldHMgKGVhcmxpZXIgdmVyc2lvbiBvbmx5IGFsbG93ZWQgPGNvZGU+Jmx0O3Byb3BlcnR5Jmd0OzwvY29kZT4sIDxjb2RlPiZsdDt0eXBlZGVmJmd0OzwvY29kZT4KK2FuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+KS4gIFdoZW4geW91IGRvIHRoaXMgdGhleSBhcmUgZXZhbHVhdGVkIGJlZm9yZSBhbnkgdGFyZ2V0cyBhcmUgZXhlY3V0ZWQuICBTb21lIHRhc2tzCit3aWxsIGdlbmVyYXRlIGJ1aWxkIGZhaWx1cmVzIGlmIHRoZXkgYXJlIHVzZWQgb3V0c2lkZSBvZiB0YXJnZXRzIGFzIHRoZXkgbWF5IGNhdXNlIGluZmluaXRlIGxvb3BzIG90aGVyd2lzZQorKDxjb2RlPiZsdDthbnRjYWxsJmd0OzwvY29kZT4gZm9yIGV4YW1wbGUpLjwvcD4KIAotPHA+Ci1XZSBoYXZlIGdpdmVuIHNvbWUgdGFyZ2V0cyBkZXNjcmlwdGlvbnM7IHRoaXMgY2F1c2VzIHRoZSA8dHQ+cHJvamVjdGhlbHA8L3R0PgotaW52b2NhdGlvbiBvcHRpb24gdG8gbGlzdCB0aGVtIGFzIHB1YmxpYyB0YXJnZXRzIHdpdGggdGhlIGRlc2NyaXB0aW9uczsgdGhlCi1vdGhlciB0YXJnZXQgaXMgaW50ZXJuYWwgYW5kIG5vdCBsaXN0ZWQuCi08cD4KLUZpbmFsbHksIGZvciB0aGlzIHRhcmdldCB0byB3b3JrIHRoZSBzb3VyY2UgaW4gdGhlIDx0dD5zcmM8L3R0PiBzdWJkaXJlY3RvcnkKLXNob3VsZCBiZSBzdG9yZWQgaW4gYSBkaXJlY3RvcnkgdHJlZSB3aGljaCBtYXRjaGVzIHRoZSBwYWNrYWdlIG5hbWVzLiBDaGVjayB0aGUKLTx0dD4mbHQ7amF2YWMmZ3Q7PC90dD4gdGFzayBmb3IgZGV0YWlscy4KKzxwPldlIGhhdmUgZ2l2ZW4gc29tZSB0YXJnZXRzIGRlc2NyaXB0aW9uczsgdGhpcyBjYXVzZXMgdGhlIDxrYmQ+LXByb2plY3RoZWxwPC9rYmQ+IGludm9jYXRpb24gb3B0aW9uIHRvIGxpc3QgdGhlbSBhcworcHVibGljIHRhcmdldHMgd2l0aCB0aGUgZGVzY3JpcHRpb25zOyB0aGUgb3RoZXIgdGFyZ2V0IGlzIGludGVybmFsIGFuZCBub3QgbGlzdGVkLjwvcD4KKzxwPkZpbmFsbHksIGZvciB0aGlzIHRhcmdldCB0byB3b3JrIHRoZSBzb3VyY2UgaW4gdGhlIDxzYW1wPnNyYzwvc2FtcD4gc3ViZGlyZWN0b3J5IHNob3VsZCBiZSBzdG9yZWQgaW4gYSBkaXJlY3RvcnkgdHJlZQord2hpY2ggbWF0Y2hlcyB0aGUgcGFja2FnZSBuYW1lcy4gQ2hlY2sgdGhlIDxjb2RlPiZsdDtqYXZhYyZndDs8L2NvZGU+IHRhc2sgZm9yIGRldGFpbHMuPC9wPgogCi08aDM+PGEgbmFtZT0iZmlsdGVycyI+VG9rZW4gRmlsdGVyczwvYT48L2gzPgotPHA+QSBwcm9qZWN0IGNhbiBoYXZlIGEgc2V0IG9mIHRva2VucyB0aGF0IG1pZ2h0IGJlIGF1dG9tYXRpY2FsbHkgZXhwYW5kZWQgaWYKLWZvdW5kIHdoZW4gYSBmaWxlIGlzIGNvcGllZCwgd2hlbiB0aGUgZmlsdGVyaW5nLWNvcHkgYmVoYXZpb3IgaXMgc2VsZWN0ZWQgaW4gdGhlCi10YXNrcyB0aGF0IHN1cHBvcnQgdGhpcy4gVGhlc2UgbWlnaHQgYmUgc2V0IGluIHRoZSBidWlsZGZpbGUKLWJ5IHRoZSA8YSBocmVmPSJUYXNrcy9maWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrLjwvcD4KLTxwPlNpbmNlIHRoaXMgY2FuIHBvdGVudGlhbGx5IGJlIGEgdmVyeSBoYXJtZnVsIGJlaGF2aW9yLAotdGhlIHRva2VucyBpbiB0aGUgZmlsZXMgPGI+bXVzdDwvYj4KLWJlIG9mIHRoZSBmb3JtIDxjb2RlPkA8L2NvZGU+PGk+dG9rZW48L2k+PGNvZGU+QDwvY29kZT4sIHdoZXJlCi08aT50b2tlbjwvaT4gaXMgdGhlIHRva2VuIG5hbWUgdGhhdCBpcyBzZXQKLWluIHRoZSA8Y29kZT4mbHQ7ZmlsdGVyJmd0OzwvY29kZT4gdGFzay4gVGhpcyB0b2tlbiBzeW50YXggbWF0Y2hlcyB0aGUgc3ludGF4IG9mIG90aGVyIGJ1aWxkIHN5c3RlbXMKLXRoYXQgcGVyZm9ybSBzdWNoIGZpbHRlcmluZyBhbmQgcmVtYWlucyBzdWZmaWNpZW50bHkgb3J0aG9nb25hbCB0byBtb3N0Ci1wcm9ncmFtbWluZyBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlcywgYXMgd2VsbCBhcyB3aXRoIGRvY3VtZW50YXRpb24gc3lzdGVtcy48L3A+Ci08cD5Ob3RlOiBJZiBhIHRva2VuIHdpdGggdGhlIGZvcm1hdCA8Y29kZT5APC9jb2RlPjxpPnRva2VuPC9pPjxjb2RlPkA8L2NvZGU+Ci1pcyBmb3VuZCBpbiBhIGZpbGUsIGJ1dCBubwotZmlsdGVyIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHRva2VuLCBubyBjaGFuZ2VzIHRha2UgcGxhY2U7Ci10aGVyZWZvcmUsIG5vIGVzY2FwaW5nCi1tZXRob2QgaXMgYXZhaWxhYmxlIC0gYnV0IGFzIGxvbmcgYXMgeW91IGNob29zZSBhcHByb3ByaWF0ZSBuYW1lcyBmb3IgeW91cgotdG9rZW5zLCB0aGlzIHNob3VsZCBub3QgY2F1c2UgcHJvYmxlbXMuPC9wPgotPHA+PGI+V2FybmluZzo8L2I+IElmIHlvdSBjb3B5IGJpbmFyeSBmaWxlcyB3aXRoIGZpbHRlcmluZyB0dXJuZWQgb24sIHlvdSBjYW4gY29ycnVwdCB0aGUKLWZpbGVzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgd2l0aCB0ZXh0IGZpbGVzIDxlbT5vbmx5PC9lbT4uPC9wPgorPGgzIGlkPSJmaWx0ZXJzIj5Ub2tlbiBGaWx0ZXJzPC9oMz4KKzxwPkEgcHJvamVjdCBjYW4gaGF2ZSBhIHNldCBvZiB0b2tlbnMgdGhhdCBtaWdodCBiZSBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIGlmIGZvdW5kIHdoZW4gYSBmaWxlIGlzIGNvcGllZCwgd2hlbiB0aGUKK2ZpbHRlcmluZy1jb3B5IGJlaGF2aW9yIGlzIHNlbGVjdGVkIGluIHRoZSB0YXNrcyB0aGF0IHN1cHBvcnQgdGhpcy4gVGhlc2UgbWlnaHQgYmUgc2V0IGluIHRoZSBidWlsZGZpbGUgYnkKK3RoZSA8YSBocmVmPSJUYXNrcy9maWx0ZXIuaHRtbCI+ZmlsdGVyPC9hPiB0YXNrLjwvcD4KKzxwPlNpbmNlIHRoaXMgY2FuIHBvdGVudGlhbGx5IGJlIGEgdmVyeSBoYXJtZnVsIGJlaGF2aW9yLCB0aGUgdG9rZW5zIGluIHRoZSBmaWxlcyA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgb2YgdGhlCitmb3JtIDxjb2RlPkA8dmFyPnRva2VuPC92YXI+QDwvY29kZT4sIHdoZXJlIDx2YXI+dG9rZW48L3Zhcj4gaXMgdGhlIHRva2VuIG5hbWUgdGhhdCBpcyBzZXQgaW4KK3RoZSA8Y29kZT4mbHQ7ZmlsdGVyJmd0OzwvY29kZT4gdGFzay4gVGhpcyB0b2tlbiBzeW50YXggbWF0Y2hlcyB0aGUgc3ludGF4IG9mIG90aGVyIGJ1aWxkIHN5c3RlbXMgdGhhdCBwZXJmb3JtIHN1Y2gKK2ZpbHRlcmluZyBhbmQgcmVtYWlucyBzdWZmaWNpZW50bHkgb3J0aG9nb25hbCB0byBtb3N0IHByb2dyYW1taW5nIGFuZCBzY3JpcHRpbmcgbGFuZ3VhZ2VzLCBhcyB3ZWxsIGFzIHdpdGggZG9jdW1lbnRhdGlvbgorc3lzdGVtcy48L3A+Cis8cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIGEgdG9rZW4gd2l0aCB0aGUgZm9ybWF0IDxjb2RlPkA8dmFyPnRva2VuPC92YXI+QDwvY29kZT4gaXMgZm91bmQgaW4gYSBmaWxlLCBidXQgbm8gZmlsdGVyCitpcyBhc3NvY2lhdGVkIHdpdGggdGhhdCB0b2tlbiwgbm8gY2hhbmdlcyB0YWtlIHBsYWNlOyB0aGVyZWZvcmUsIG5vIGVzY2FwaW5nIG1ldGhvZCBpcyBhdmFpbGFibGUmbWRhc2g7YnV0IGFzIGxvbmcgYXMKK3lvdSBjaG9vc2UgYXBwcm9wcmlhdGUgbmFtZXMgZm9yIHlvdXIgdG9rZW5zLCB0aGlzIHNob3VsZCBub3QgY2F1c2UgcHJvYmxlbXMuPC9wPgorPHA+PHN0cm9uZz5XYXJuaW5nPC9zdHJvbmc+OiBJZiB5b3UgY29weSBiaW5hcnkgZmlsZXMgd2l0aCBmaWx0ZXJpbmcgdHVybmVkIG9uLCB5b3UgY2FuIGNvcnJ1cHQgdGhlIGZpbGVzLiBUaGlzIGZlYXR1cmUKK3Nob3VsZCBiZSB1c2VkIHdpdGggdGV4dCBmaWxlcyA8ZW0+b25seTwvZW0+LjwvcD4KIAotPGgzPjxhIG5hbWU9InBhdGgiPlBhdGgtbGlrZSBTdHJ1Y3R1cmVzPC9hPjwvaDM+Ci08cD5Zb3UgY2FuIHNwZWNpZnkgPGNvZGU+UEFUSDwvY29kZT4tIGFuZCA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+LXR5cGUKLXJlZmVyZW5jZXMgdXNpbmcgYm90aAotJnF1b3Q7PGNvZGU+OjwvY29kZT4mcXVvdDsgYW5kICZxdW90Ozxjb2RlPjs8L2NvZGU+JnF1b3Q7IGFzIHNlcGFyYXRvcgotY2hhcmFjdGVycy4gQW50IHdpbGwKLWNvbnZlcnQgdGhlIHNlcGFyYXRvciB0byB0aGUgY29ycmVjdCBjaGFyYWN0ZXIgb2YgdGhlIGN1cnJlbnQgb3BlcmF0aW5nCi1zeXN0ZW0uPC9wPgotPHA+V2hlcmV2ZXIgcGF0aC1saWtlIHZhbHVlcyBuZWVkIHRvIGJlIHNwZWNpZmllZCwgYSBuZXN0ZWQgZWxlbWVudCBjYW4KLWJlIHVzZWQuIFRoaXMgdGFrZXMgdGhlIGdlbmVyYWwgZm9ybSBvZjo8L3A+Cis8aDMgaWQ9InBhdGgiPlBhdGgtbGlrZSBTdHJ1Y3R1cmVzPC9oMz4KKzxwPllvdSBjYW4gc3BlY2lmeSA8Y29kZT5QQVRIPC9jb2RlPi0gYW5kIDxjb2RlPkNMQVNTUEFUSDwvY29kZT4tdHlwZSByZWZlcmVuY2VzIHVzaW5nIGJvdGggPHE+OjwvcT4gYW5kIDxxPjs8L3E+IGFzCitzZXBhcmF0b3IgY2hhcmFjdGVycy4gQW50IHdpbGwgY29udmVydCB0aGUgc2VwYXJhdG9yIHRvIHRoZSBjb3JyZWN0IGNoYXJhY3RlciBvZiB0aGUgY3VycmVudCBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KKzxwPldoZXJldmVyIHBhdGgtbGlrZSB2YWx1ZXMgbmVlZCB0byBiZSBzcGVjaWZpZWQsIGEgbmVzdGVkIGVsZW1lbnQgY2FuIGJlIHVzZWQuIFRoaXMgdGFrZXMgdGhlIGdlbmVyYWwgZm9ybSBvZjo8L3A+CiA8cHJlPgotICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2xpYi9oZWxwZXIuamFyJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLTwvcHJlPgotPHA+VGhlIDxjb2RlPmxvY2F0aW9uPC9jb2RlPiBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgc2luZ2xlIGZpbGUgb3IKLWRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcHJvamVjdCdzIGJhc2UgZGlyZWN0b3J5IChvciBhbiBhYnNvbHV0ZQotZmlsZW5hbWUpLCB3aGlsZSB0aGUgPGNvZGU+cGF0aDwvY29kZT4gYXR0cmlidXRlIGFjY2VwdHMgY29sb24tCi1vciBzZW1pY29sb24tc2VwYXJhdGVkIGxpc3RzIG9mIGxvY2F0aW9ucy4gVGhlIDxjb2RlPnBhdGg8L2NvZGU+Ci1hdHRyaWJ1dGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHByZWRlZmluZWQgcGF0aHMgLSBpbiBhbnkgb3RoZXIKLWNhc2UsIG11bHRpcGxlIGVsZW1lbnRzIHdpdGggPGNvZGU+bG9jYXRpb248L2NvZGU+IGF0dHJpYnV0ZXMgc2hvdWxkIGJlCi1wcmVmZXJyZWQuPC9wPgotPHA+PGVtPlNpbmNlIEFudCAxLjguMjwvZW0+IHRoZSBsb2NhdGlvbiBhdHRyaWJ1dGUgY2FuIGFsc28gY29udGFpbiBhCi0gIHdpbGRjYXJkIGluIGl0cyBsYXN0IHBhdGggY29tcG9uZW50IChpLmUuIGl0IGNhbiBlbmQgaW4gYQotICAmcXVvdDsqJnF1b3Q7KSBpbiBvcmRlciB0byBzdXBwb3J0IHdpbGRjYXJkIENMQVNTUEFUSHMgaW50cm9kdWNlZAotICB3aXRoIEphdmE2LiAgQW50IHdpbGwgbm90IGV4cGFuZCBvciBldmFsdWF0ZSB0aGUgd2lsZGNhcmRzIGFuZCB0aGUKLSAgcmVzdWx0aW5nIHBhdGggbWF5IG5vdCB3b3JrIGFzIGFueXRoaW5nIGVsc2UgYnV0IGEgQ0xBU1NQQVRIIC0gb3IKLSAgZXZlbiBhcyBhIENMQVNTUEFUSCBmb3IgYSBKYXZhIFZNIHByaW9yIHRvIEphdmE2LjwvcD4KKyZsdDtjbGFzc3BhdGgmZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDtsaWIvaGVscGVyLmphciZxdW90Oy8mZ3Q7CismbHQ7L2NsYXNzcGF0aCZndDs8L3ByZT4KKzxwPlRoZSA8dmFyPmxvY2F0aW9uPC92YXI+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgYSBzaW5nbGUgZmlsZSBvciBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyBiYXNlIGRpcmVjdG9yeSAob3IKK2FuIGFic29sdXRlIGZpbGVuYW1lKSwgd2hpbGUgdGhlIDx2YXI+cGF0aDwvdmFyPiBhdHRyaWJ1dGUgYWNjZXB0cyBjb2xvbi0gb3Igc2VtaWNvbG9uLXNlcGFyYXRlZCBsaXN0cyBvZgorbG9jYXRpb25zLiBUaGUgPHZhcj5wYXRoPC92YXI+IGF0dHJpYnV0ZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggcHJlZGVmaW5lZCBwYXRocyZtZGFzaDtpbiBhbnkgb3RoZXIgY2FzZSwgbXVsdGlwbGUKK2VsZW1lbnRzIHdpdGggPHZhcj5sb2NhdGlvbjwvdmFyPiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBwcmVmZXJyZWQuPC9wPgorPHA+PGVtPlNpbmNlIEFudCAxLjguMjwvZW0+IHRoZSA8dmFyPmxvY2F0aW9uPC92YXI+IGF0dHJpYnV0ZSBjYW4gYWxzbyBjb250YWluIGEgd2lsZGNhcmQgaW4gaXRzIGxhc3QgcGF0aCBjb21wb25lbnQKKyhpLmUuIGl0IGNhbiBlbmQgaW4gYSA8cT4qPC9xPikgaW4gb3JkZXIgdG8gc3VwcG9ydCB3aWxkY2FyZCA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+cyBpbnRyb2R1Y2VkIHdpdGggSmF2YSA2LiAgQW50IHdpbGwKK25vdCBleHBhbmQgb3IgZXZhbHVhdGUgdGhlIHdpbGRjYXJkcyBhbmQgdGhlIHJlc3VsdGluZyBwYXRoIG1heSBub3Qgd29yayBhcyBhbnl0aGluZyBlbHNlIGJ1dAorYSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+Jm1kYXNoO29yIGV2ZW4gYXMgYSA8Y29kZT5DTEFTU1BBVEg8L2NvZGU+IGZvciBKVk0gcHJpb3IgdG8gSmF2YSA2LjwvcD4KIDxwPkFzIGEgc2hvcnRjdXQsIHRoZSA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gdGFnCi1zdXBwb3J0cyA8Y29kZT5wYXRoPC9jb2RlPiBhbmQKLTxjb2RlPmxvY2F0aW9uPC9jb2RlPiBhdHRyaWJ1dGVzIG9mIGl0cyBvd24sIHNvOjwvcD4KK3N1cHBvcnRzIDx2YXI+cGF0aDwvdmFyPiBhbmQKKzx2YXI+bG9jYXRpb248L3Zhcj4gYXR0cmlidXRlcyBvZiBpdHMgb3duLCBzbzo8L3A+CiA8cHJlPgotICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OwotICAgICZsdDsvY2xhc3NwYXRoJmd0OworJmx0O2NsYXNzcGF0aCZndDsKKyAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyZsdDsvY2xhc3NwYXRoJmd0OwogPC9wcmU+CiA8cD5jYW4gYmUgYWJicmV2aWF0ZWQgdG86PC9wPgorPHByZT4mbHQ7Y2xhc3NwYXRoIHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDs8L3ByZT4KKzxwPkluIGFkZGl0aW9uLCBvbmUgb3IgbW9yZSA8YSBocmVmPSJUeXBlcy9yZXNvdXJjZXMuaHRtbCNjb2xsZWN0aW9uIj5yZXNvdXJjZSBjb2xsZWN0aW9uczwvYT4gY2FuIGJlIHNwZWNpZmllZCBhcworbmVzdGVkIGVsZW1lbnRzICh0aGVzZSBtdXN0IGNvbnNpc3Qgb2YgPGEgaHJlZj0iVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZSI+ZmlsZTwvYT4tdHlwZSByZXNvdXJjZXMgb25seSkuICBBZGRpdGlvbmFsbHksCitpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBhbHRob3VnaCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgcHJvY2Vzc2VkIGluIHRoZSBvcmRlciBlbmNvdW50ZXJlZCwgY2VydGFpbiByZXNvdXJjZQorY29sbGVjdGlvbiB0eXBlcyBzdWNoIGFzIDxhIGhyZWY9IlR5cGVzL2ZpbGVzZXQuaHRtbCI+ZmlsZXNldDwvYT4sIDxhIGhyZWY9IlR5cGVzL2RpcnNldC5odG1sIj5kaXJzZXQ8L2E+CithbmQgPGEgaHJlZj0iVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZXMiPmZpbGVzPC9hPiBhcmUgdW5kZWZpbmVkIGluIHRlcm1zIG9mIG9yZGVyLjwvcD4KIDxwcmU+Ci0gICAgJmx0O2NsYXNzcGF0aCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7Ci08L3ByZT4KLTxwPkluIGFkZGl0aW9uLCBvbmUgb3IgbW9yZQotPGEgaHJlZj0iVHlwZXMvcmVzb3VyY2VzLmh0bWwjY29sbGVjdGlvbiI+UmVzb3VyY2UgQ29sbGVjdGlvbjwvYT5zCi1jYW4gYmUgc3BlY2lmaWVkIGFzIG5lc3RlZCBlbGVtZW50cyAodGhlc2UgbXVzdCBjb25zaXN0IG9mCi08YSBocmVmPSJUeXBlcy9yZXNvdXJjZXMuaHRtbCNmaWxlIj5maWxlPC9hPi10eXBlIHJlc291cmNlcyBvbmx5KS4KLUFkZGl0aW9uYWxseSwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgYWx0aG91Z2ggcmVzb3VyY2UgY29sbGVjdGlvbnMgYXJlCi1wcm9jZXNzZWQgaW4gdGhlIG9yZGVyIGVuY291bnRlcmVkLCBjZXJ0YWluIHJlc291cmNlIGNvbGxlY3Rpb24gdHlwZXMKLXN1Y2ggYXMgPGEgaHJlZj0iVHlwZXMvZmlsZXNldC5odG1sIj5maWxlc2V0PC9hPiwKLTxhIGhyZWY9IlR5cGVzL2RpcnNldC5odG1sIj5kaXJzZXQ8L2E+IGFuZAotPGEgaHJlZj0iVHlwZXMvcmVzb3VyY2VzLmh0bWwjZmlsZXMiPmZpbGVzPC9hPgotYXJlIHVuZGVmaW5lZCBpbiB0ZXJtcyBvZiBvcmRlci48L3A+Ci08cHJlPgotICAgICZsdDtjbGFzc3BhdGgmZ3Q7Ci0gICAgICAmbHQ7cGF0aGVsZW1lbnQgcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OwotICAgICAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2xpYiZxdW90OyZndDsKLSAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L2ZpbGVzZXQmZ3Q7Ci0gICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7Y2xhc3NlcyZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi9jbGFzc2VzJnF1b3Q7LyZndDsKLSAgICAgICAgJmx0O2V4Y2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqLypUZXN0KiZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7L2RpcnNldCZndDsKLSAgICAgICZsdDtmaWxlbGlzdCByZWZpZD0mcXVvdDt0aGlyZC1wYXJ0eV9qYXJzJnF1b3Q7LyZndDsKLSAgICAmbHQ7L2NsYXNzcGF0aCZndDsKLTwvcHJlPgotPHA+VGhpcyBidWlsZHMgYSBwYXRoIHRoYXQgaG9sZHMgdGhlIHZhbHVlIG9mIDxjb2RlPiR7Y2xhc3NwYXRofTwvY29kZT4sCi1mb2xsb3dlZCBieSBhbGwgamFyIGZpbGVzIGluIHRoZSA8Y29kZT5saWI8L2NvZGU+IGRpcmVjdG9yeSwKLXRoZSA8Y29kZT5jbGFzc2VzPC9jb2RlPiBkaXJlY3RvcnksIGFsbCBkaXJlY3RvcmllcyBuYW1lZAotPGNvZGU+Y2xhc3NlczwvY29kZT4gdW5kZXIgdGhlIDxjb2RlPmFwcHM8L2NvZGU+IHN1YmRpcmVjdG9yeSBvZgotPGNvZGU+JHtidWlsZC5kaXJ9PC9jb2RlPiwgZXhjZXB0IHRob3NlCi10aGF0IGhhdmUgdGhlIHRleHQgPGNvZGU+VGVzdDwvY29kZT4gaW4gdGhlaXIgbmFtZSwgYW5kCi10aGUgZmlsZXMgc3BlY2lmaWVkIGluIHRoZSByZWZlcmVuY2VkIEZpbGVMaXN0LjwvcD4KLTxwPklmIHlvdSB3YW50IHRvIHVzZSB0aGUgc2FtZSBwYXRoLWxpa2Ugc3RydWN0dXJlIGZvciBzZXZlcmFsIHRhc2tzLAoteW91IGNhbiBkZWZpbmUgdGhlbSB3aXRoIGEgPGNvZGU+Jmx0O3BhdGgmZ3Q7PC9jb2RlPiBlbGVtZW50IGF0IHRoZQotc2FtZSBsZXZlbCBhcyA8aT50YXJnZXQ8L2k+cywgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGVpcgotPGk+aWQ8L2k+IGF0dHJpYnV0ZS0tc2VlIDxhIGhyZWY9IiNyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPiBmb3IgYW4KKyZsdDtjbGFzc3BhdGgmZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7CisgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtsaWImcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDsqKi8qLmphciZxdW90Oy8mZ3Q7CisgICZsdDsvZmlsZXNldCZndDsKKyAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2NsYXNzZXMmcXVvdDsvJmd0OworICAmbHQ7ZGlyc2V0IGRpcj0mcXVvdDske2J1aWxkLmRpcn0mcXVvdDsmZ3Q7CisgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDthcHBzLyoqL2NsYXNzZXMmcXVvdDsvJmd0OworICAgICZsdDtleGNsdWRlIG5hbWU9JnF1b3Q7YXBwcy8qKi8qVGVzdComcXVvdDsvJmd0OworICAmbHQ7L2RpcnNldCZndDsKKyAgJmx0O2ZpbGVsaXN0IHJlZmlkPSZxdW90O3RoaXJkLXBhcnR5X2phcnMmcXVvdDsvJmd0OworJmx0Oy9jbGFzc3BhdGgmZ3Q7PC9wcmU+Cis8cD5UaGlzIGJ1aWxkcyBhIHBhdGggdGhhdCBob2xkcyB0aGUgdmFsdWUgb2YgPHNhbXA+JHtjbGFzc3BhdGh9PC9zYW1wPiwgZm9sbG93ZWQgYnkgYWxsIGphciBmaWxlcyBpbgordGhlIDxzYW1wPmxpYjwvc2FtcD4gZGlyZWN0b3J5LCB0aGUgPHNhbXA+Y2xhc3Nlczwvc2FtcD4gZGlyZWN0b3J5LCBhbGwgZGlyZWN0b3JpZXMgbmFtZWQgPHNhbXA+Y2xhc3Nlczwvc2FtcD4gdW5kZXIKK3RoZSA8c2FtcD5hcHBzPC9zYW1wPiBzdWJkaXJlY3Rvcnkgb2YgPHNhbXA+JHtidWlsZC5kaXJ9PC9zYW1wPiwgZXhjZXB0IHRob3NlIHRoYXQgaGF2ZSB0aGUgdGV4dCA8Y29kZT5UZXN0PC9jb2RlPiBpbgordGhlaXIgbmFtZSwgYW5kIHRoZSBmaWxlcyBzcGVjaWZpZWQgaW4gdGhlIHJlZmVyZW5jZWQgRmlsZUxpc3QuPC9wPgorPHA+SWYgeW91IHdhbnQgdG8gdXNlIHRoZSBzYW1lIHBhdGgtbGlrZSBzdHJ1Y3R1cmUgZm9yIHNldmVyYWwgdGFza3MsIHlvdSBjYW4gZGVmaW5lIHRoZW0gd2l0aAorYSA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgPGNvZGU+Jmx0O3RhcmdldCZndDs8L2NvZGU+cywgYW5kIHJlZmVyZW5jZSB0aGVtIHZpYSB0aGVpcgorPHZhcj5pZDwvdmFyPiBhdHRyaWJ1dGUmbWRhc2g7c2VlIDxhIGhyZWY9IiNyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPiBmb3IgYW4KIGV4YW1wbGUuPC9wPgogCi08cD5CeSBkZWZhdWx0IGEgcGF0aCBsaWtlIHN0cnVjdHVyZSB3aWxsIHJlLWV2YWx1YXRlIGFsbCBuZXN0ZWQKLSAgcmVzb3VyY2UgY29sbGVjdGlvbnMgd2hlbmV2ZXIgaXQgaXMgdXNlZCwgd2hpY2ggbWF5IGxlYWQgdG8KLSAgdW5uZWNlc3NhcnkgcmUtc2Nhbm5pbmcgb2YgdGhlIGZpbGVzeXN0ZW0uICBTaW5jZSBBbnQgMS44LjAgcGF0aCBoYXMKLSAgYW4gb3B0aW9uYWwgPGk+Y2FjaGU8L2k+IGF0dHJpYnV0ZSwgaWYgaXQgaXMgc2V0IHRvIHRydWUsIHRoZSBwYXRoCi0gIGluc3RhbmNlIHdpbGwgb25seSBzY2FuIGl0cyBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbnMgb25jZSBhbmQKLSAgYXNzdW1lIGl0IGRvZXNuJ3QgY2hhbmdlIGR1cmluZyB0aGUgYnVpbGQgYW55bW9yZSAodGhlIGRlZmF1bHQKLSAgZm9yIDxpPmNhY2hlPC9pPiBzdGlsbCBpcyA8aT5mYWxzZTwvaT4pLiAgRXZlbiBpZiB5b3UgYXJlIHVzaW5nIHRoZQotICBwYXRoIG9ubHkgaW4gYSBzaW5nbGUgdGFzayBpdCBtYXkgaW1wcm92ZSBvdmVyYWxsIHBlcmZvcm1hbmNlIHRvIHNldAotICA8aT5jYWNoZTwvaT4gdG8gPGk+dHJ1ZTwvaT4gaWYgeW91IGFyZSB1c2luZyBjb21wbGV4IG5lc3RlZAotICBjb25zdHJ1Y3RzLjwvcD4KKzxwPkJ5IGRlZmF1bHQgYSBwYXRoLWxpa2Ugc3RydWN0dXJlIHdpbGwgcmUtZXZhbHVhdGUgYWxsIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9ucyB3aGVuZXZlciBpdCBpcyB1c2VkLCB3aGljaCBtYXkgbGVhZAordG8gdW5uZWNlc3NhcnkgcmUtc2Nhbm5pbmcgb2YgdGhlIGZpbGVzeXN0ZW0uICA8ZW0+U2luY2UgQW50IDEuOC4wPC9lbT4sIHBhdGggaGFzIGFuIG9wdGlvbmFsIDx2YXI+Y2FjaGU8L3Zhcj4KK2F0dHJpYnV0ZSwgaWYgaXQgaXMgc2V0IHRvIDxxPnRydWU8L3E+LCB0aGUgcGF0aCBpbnN0YW5jZSB3aWxsIG9ubHkgc2NhbiBpdHMgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIG9uY2UgYW5kIGFzc3VtZQoraXQgZG9lc24ndCBjaGFuZ2UgZHVyaW5nIHRoZSBidWlsZCBhbnltb3JlICh0aGUgZGVmYXVsdCBmb3IgPHZhcj5jYWNoZTwvdmFyPiBzdGlsbCBpcyA8cT5mYWxzZTwvcT4pLiAgRXZlbiBpZiB5b3UgYXJlCit1c2luZyB0aGUgcGF0aCBvbmx5IGluIGEgc2luZ2xlIHRhc2sgaXQgbWF5IGltcHJvdmUgb3ZlcmFsbCBwZXJmb3JtYW5jZSB0byBzZXQgPHZhcj5jYWNoZTwvdmFyPiB0byA8cT50cnVlPC9xPiBpZiB5b3UKK2FyZSB1c2luZyBjb21wbGV4IG5lc3RlZCBjb25zdHJ1Y3RzLjwvcD4KIAotPHA+QSBwYXRoLWxpa2Ugc3RydWN0dXJlIGNhbiBpbmNsdWRlIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgcGF0aC1saWtlCi1zdHJ1Y3R1cmUgKGEgcGF0aCBiZWluZyBpdHNlbGYgYSByZXNvdXJjZSBjb2xsZWN0aW9uKQotdmlhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KKzxwPkEgcGF0aC1saWtlIHN0cnVjdHVyZSBjYW4gaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBhbm90aGVyIHBhdGgtbGlrZSBzdHJ1Y3R1cmUgKGEgcGF0aCBiZWluZyBpdHNlbGYgYSByZXNvdXJjZQorY29sbGVjdGlvbikgdmlhIG5lc3RlZCA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+IGVsZW1lbnRzOjwvcD4KIDxwcmU+Ci0gICAgJmx0O3BhdGggaWQ9JnF1b3Q7YmFzZS5wYXRoJnF1b3Q7Jmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKLSAgICAgICZsdDtmaWxlc2V0IGRpcj0mcXVvdDtsaWImcXVvdDsmZ3Q7Ci0gICAgICAgICZsdDtpbmNsdWRlIG5hbWU9JnF1b3Q7KiovKi5qYXImcXVvdDsvJmd0OwotICAgICAgJmx0Oy9maWxlc2V0Jmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O2NsYXNzZXMmcXVvdDsvJmd0OwotICAgICZsdDsvcGF0aCZndDsKKyZsdDtwYXRoIGlkPSZxdW90O2Jhc2UucGF0aCZxdW90OyZndDsKKyAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSZxdW90O2xpYiZxdW90OyZndDsKKyAgICAmbHQ7aW5jbHVkZSBuYW1lPSZxdW90OyoqLyouamFyJnF1b3Q7LyZndDsKKyAgJmx0Oy9maWxlc2V0Jmd0OworICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7Y2xhc3NlcyZxdW90Oy8mZ3Q7CismbHQ7L3BhdGgmZ3Q7CiAKLSAgICAmbHQ7cGF0aCBpZD0mcXVvdDt0ZXN0cy5wYXRoJnF1b3Q7IGNhY2hlPSZxdW90O3RydWUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7cGF0aCByZWZpZD0mcXVvdDtiYXNlLnBhdGgmcXVvdDsvJmd0OwotICAgICAgJmx0O3BhdGhlbGVtZW50IGxvY2F0aW9uPSZxdW90O3Rlc3RjbGFzc2VzJnF1b3Q7LyZndDsKLSAgICAmbHQ7L3BhdGgmZ3Q7Ci08L3ByZT4KLSBUaGUgc2hvcnRjdXRzIHByZXZpb3VzbHkgbWVudGlvbmVkIGZvciA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYXJlIGFsc28gdmFsaWQgZm9yIDxjb2RlPiZsdDtwYXRoJmd0OzwvY29kZT4uRm9yIGV4YW1wbGU6CismbHQ7cGF0aCBpZD0mcXVvdDt0ZXN0cy5wYXRoJnF1b3Q7IGNhY2hlPSZxdW90O3RydWUmcXVvdDsmZ3Q7CisgICZsdDtwYXRoIHJlZmlkPSZxdW90O2Jhc2UucGF0aCZxdW90Oy8mZ3Q7CisgICZsdDtwYXRoZWxlbWVudCBsb2NhdGlvbj0mcXVvdDt0ZXN0Y2xhc3NlcyZxdW90Oy8mZ3Q7CismbHQ7L3BhdGgmZ3Q7PC9wcmU+Cis8cD5UaGUgc2hvcnRjdXRzIHByZXZpb3VzbHkgbWVudGlvbmVkIGZvciA8Y29kZT4mbHQ7Y2xhc3NwYXRoJmd0OzwvY29kZT4gYXJlIGFsc28gdmFsaWQKK2ZvciA8Y29kZT4mbHQ7cGF0aCZndDs8L2NvZGU+LiBGb3IgZXhhbXBsZTo8L3A+CiA8cHJlPgotICAgICZsdDtwYXRoIGlkPSZxdW90O2Jhc2UucGF0aCZxdW90OyZndDsKLSAgICAgICZsdDtwYXRoZWxlbWVudCBwYXRoPSZxdW90OyR7Y2xhc3NwYXRofSZxdW90Oy8mZ3Q7Ci0gICAgJmx0Oy9wYXRoJmd0OwotPC9wcmU+Ci1jYW4gYmUgd3JpdHRlbiBhczoKKyZsdDtwYXRoIGlkPSZxdW90O2Jhc2UucGF0aCZxdW90OyZndDsKKyAgJmx0O3BhdGhlbGVtZW50IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDsKKyZsdDsvcGF0aCZndDs8L3ByZT4KKzxwPmNhbiBiZSB3cml0dGVuIGFzOjwvcD4KKzxwcmU+Jmx0O3BhdGggaWQ9JnF1b3Q7YmFzZS5wYXRoJnF1b3Q7IHBhdGg9JnF1b3Q7JHtjbGFzc3BhdGh9JnF1b3Q7LyZndDs8L3ByZT4KKzxoNCBpZD0icGF0aHNob3J0Y3V0Ij5QYXRoIFNob3J0Y3V0PC9oND4KKzxwPjxlbT5TaW5jZSBBbnQgMS42PC9lbT4sIHRoZXJlIGlzIGEgc2hvcnRjdXQgZm9yIGNvbnZlcnRpbmcgcGF0aHMgdG8gT1Mgc3BlY2lmaWMgc3RyaW5ncyBpbiBwcm9wZXJ0aWVzLiBPbmUgY2FuIHVzZQordGhlIGV4cHJlc3Npb24gPHNhbXA+JHt0b1N0cmluZzo8ZW0+cGF0aHJlZmVyZW5jZTwvZW0+fTwvc2FtcD4gdG8gY29udmVydCBhIHBhdGggZWxlbWVudCByZWZlcmVuY2UgdG8gYSBzdHJpbmcgdGhhdCBjYW4KK2JlIHVzZWQgZm9yIGEgcGF0aCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6PC9wPgogPHByZT4KLSAgICAmbHQ7cGF0aCBpZD0mcXVvdDtiYXNlLnBhdGgmcXVvdDsgcGF0aD0mcXVvdDske2NsYXNzcGF0aH0mcXVvdDsvJmd0OwotPC9wcmU+CismbHQ7cGF0aCBpZD0ibGliLnBhdGgucmVmIiZndDsKKyAgJmx0O2ZpbGVzZXQgZGlyPSJsaWIiIGluY2x1ZGVzPSIqLmphciIvJmd0OworJmx0Oy9wYXRoJmd0OworJmx0O2phdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSJjbGFzc2VzIiZndDsKKyAgJmx0O2NvbXBpbGVyYXJnIGFyZz0iLVhib290Y2xhc3NwYXRoL3A6JHt0b1N0cmluZzpsaWIucGF0aC5yZWZ9Ii8mZ3Q7CismbHQ7L2phdmFjJmd0OzwvcHJlPgogCi0gIDxoND48YSBuYW1lPSJwYXRoc2hvcnRjdXQiPlBhdGggU2hvcnRjdXQ8L2E+PC9oND4KLSAgPHA+Ci0gICAgSW4gQW50IDEuNiBhIHNob3J0Y3V0IGZvciBjb252ZXJ0aW5nIHBhdGhzIHRvIE9TIHNwZWNpZmljIHN0cmluZ3MKLSAgICBpbiBwcm9wZXJ0aWVzIGhhcyBiZWVuIGFkZGVkLiBPbmUgY2FuIHVzZSB0aGUgZXhwcmVzc2lvbiAKLSAgICAke3RvU3RyaW5nOjxlbT5wYXRocmVmZXJlbmNlPC9lbT59IHRvIGNvbnZlcnQgYSBwYXRoIGVsZW1lbnQKLSAgICByZWZlcmVuY2UgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBwYXRoIGFyZ3VtZW50LgotICAgIEZvciBleGFtcGxlOgotICA8L3A+Ci08cHJlPgotICAmbHQ7cGF0aCBpZD0ibGliLnBhdGgucmVmIiZndDsKLSAgICAmbHQ7ZmlsZXNldCBkaXI9ImxpYiIgaW5jbHVkZXM9IiouamFyIi8mZ3Q7Ci0gICZsdDsvcGF0aCZndDsKLSAgJmx0O2phdmFjIHNyY2Rpcj0ic3JjIiBkZXN0ZGlyPSJjbGFzc2VzIiZndDsKLSAgICAmbHQ7Y29tcGlsZXJhcmcgYXJnPSItWGJvb3RjbGFzc3BhdGgvcDoke3RvU3RyaW5nOmxpYi5wYXRoLnJlZn0iLyZndDsKLSAgJmx0Oy9qYXZhYyZndDsKLTwvcHJlPgotCi0KLTxoMz48YSBuYW1lPSJhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+PC9oMz4KLTxwPlNldmVyYWwgdGFza3MgdGFrZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBhbm90aGVyCi1wcm9jZXNzIG9uIHRoZSBjb21tYW5kIGxpbmUuIFRvIG1ha2UgaXQgZWFzaWVyIHRvIHNwZWNpZnkgYXJndW1lbnRzCi10aGF0IGNvbnRhaW4gc3BhY2UgY2hhcmFjdGVycywgbmVzdGVkIDxjb2RlPmFyZzwvY29kZT4gZWxlbWVudHMgY2FuIGJlIHVzZWQuPC9wPgotPHRhYmxlIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjIiIGNlbGxzcGFjaW5nPSIwIj4KKzxoMyBpZD0iYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9oMz4KKzxwPlNldmVyYWwgdGFza3MgdGFrZSBhcmd1bWVudHMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBhbm90aGVyIHByb2Nlc3Mgb24gdGhlIGNvbW1hbmQgbGluZS4gVG8gbWFrZSBpdCBlYXNpZXIgdG8gc3BlY2lmeQorYXJndW1lbnRzIHRoYXQgY29udGFpbiBzcGFjZSBjaGFyYWN0ZXJzLCBuZXN0ZWQgPGNvZGU+YXJnPC9jb2RlPiBlbGVtZW50cyBjYW4gYmUgdXNlZC48L3A+Cis8dGFibGUgY2xhc3M9ImF0dHIiPgogPHRyPgotICA8dGQgd2lkdGg9IjEyJSIgdmFsaWduPSJ0b3AiPjxiPkF0dHJpYnV0ZTwvYj48L3RkPgotICA8dGQgd2lkdGg9Ijc4JSIgdmFsaWduPSJ0b3AiPjxiPkRlc2NyaXB0aW9uPC9iPjwvdGQ+Ci0gIDx0ZCB3aWR0aD0iMTAlIiB2YWxpZ249InRvcCI+PGI+UmVxdWlyZWQ8L2I+PC90ZD4KKyAgPHRoIHNjb3BlPSJjb2wiPkF0dHJpYnV0ZTwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgIDx0aCBzY29wZT0iY29sIj5SZXF1aXJlZDwvdGg+CiA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj52YWx1ZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hIHNpbmdsZSBjb21tYW5kLWxpbmUgYXJndW1lbnQ7IGNhbiBjb250YWluIHNwYWNlCi0gICAgICBjaGFyYWN0ZXJzLjwvdGQ+Ci0gICAgPHRkIGFsaWduPSJjZW50ZXIiIHJvd3NwYW49IjUiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CisgICAgPHRkPnZhbHVlPC90ZD4KKyAgICA8dGQ+YSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50OyBjYW4gY29udGFpbiBzcGFjZSBjaGFyYWN0ZXJzLjwvdGQ+CisgICAgPHRkIHJvd3NwYW49IjUiPkV4YWN0bHkgb25lIG9mIHRoZXNlLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPmZpbGU8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+VGhlIG5hbWUgb2YgYSBmaWxlIGFzIGEgc2luZ2xlIGNvbW1hbmQtbGluZQotICAgICAgYXJndW1lbnQ7IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWJzb2x1dGUgZmlsZW5hbWUgb2YgdGhlIGZpbGUuPC90ZD4KKyAgICA8dGQ+ZmlsZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5UaGUgbmFtZSBvZiBhIGZpbGUgYXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50OyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGFic29sdXRlIGZpbGVuYW1lCisgICAgICBvZiB0aGUgZmlsZS48L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5wYXRoPC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgc3RyaW5nIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcGF0aC1saWtlCi0gICAgICBzdHJpbmcgYXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50OyB5b3UgY2FuIHVzZSA8Y29kZT47PC9jb2RlPgotICAgICAgb3IgPGNvZGU+OjwvY29kZT4gYXMKLSAgICAgIHBhdGggc2VwYXJhdG9ycyBhbmQgQW50IHdpbGwgY29udmVydCBpdCB0byB0aGUgcGxhdGZvcm0ncyBsb2NhbAotICAgICAgY29udmVudGlvbnMuPC90ZD4KKyAgICA8dGQ+cGF0aDwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5BIHN0cmluZyB0aGF0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHBhdGgtbGlrZSBzdHJpbmcgYXMgYSBzaW5nbGUgY29tbWFuZC1saW5lIGFyZ3VtZW50OyB5b3UgY2FuCisgICAgICB1c2UgPHE+OzwvcT4gb3IgPHE+OjwvcT4gYXMgcGF0aCBzZXBhcmF0b3JzIGFuZCBBbnQgd2lsbCBjb252ZXJ0IGl0IHRvIHRoZSBwbGF0Zm9ybSdzIGxvY2FsIGNvbnZlbnRpb25zLjwvdGQ+CiAgIDwvdHI+CiAgIDx0cj4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPnBhdGhyZWY8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+PGEgaHJlZj0iI3JlZmVyZW5jZXMiPlJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoCi0gICAgICBkZWZpbmVkIGVsc2V3aGVyZS4gIEFudCB3aWxsIGNvbnZlcnQgaXQgdG8gdGhlIHBsYXRmb3JtJ3MgbG9jYWwKLSAgICAgIGNvbnZlbnRpb25zLjwvdGQ+CisgICAgPHRkPnBhdGhyZWY8L3RkPgorICAgIDx0ZCBjbGFzcz0ibGVmdCI+PGEgaHJlZj0iI3JlZmVyZW5jZXMiPlJlZmVyZW5jZTwvYT4gdG8gYSBwYXRoIGRlZmluZWQgZWxzZXdoZXJlLiAgQW50IHdpbGwgY29udmVydCBpdCB0byB0aGUKKyAgICAgIHBsYXRmb3JtJ3MgbG9jYWwgY29udmVudGlvbnMuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+bGluZTwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5hIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuPC90ZD4KKyAgICA8dGQ+bGluZTwvdGQ+CisgICAgPHRkIGNsYXNzPSJsZWZ0Ij5hIHNwYWNlLWRlbGltaXRlZCBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuPC90ZD4KICAgPC90cj4KICAgPHRyPgotICAgIDx0ZCB2YWxpZ249InRvcCI+cHJlZml4PC90ZD4KLSAgICA8dGQgdmFsaWduPSJ0b3AiPkEgZml4ZWQgc3RyaW5nIHRvIGJlIHBsYWNlZCBpbiBmcm9udCBvZiB0aGUKLSAgICAgIGFyZ3VtZW50LiBJbiB0aGUgY2FzZSBvZiBhIGxpbmUgYnJva2VuIGludG8gcGFydHMsIGl0IHdpbGwgYmUKLSAgICAgIHBsYWNlZCBpbiBmcm9udCBvZiBldmVyeSBwYXJ0LiA8ZW0+U2luY2UgQW50IDEuOC48L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPnByZWZpeDwvdGQ+CisgICAgPHRkPkEgZml4ZWQgc3RyaW5nIHRvIGJlIHBsYWNlZCBpbiBmcm9udCBvZiB0aGUgYXJndW1lbnQuIEluIHRoZSBjYXNlIG9mIGEgbGluZSBicm9rZW4gaW50byBwYXJ0cywgaXQgd2lsbCBiZSBwbGFjZWQKKyAgICAgIGluIGZyb250IG9mIGV2ZXJ5IHBhcnQuIDxlbT5TaW5jZSBBbnQgMS44LjwvZW0+PC90ZD4KKyAgICA8dGQ+Tm88L3RkPgogICA8L3RyPgogICA8dHI+Ci0gICAgPHRkIHZhbGlnbj0idG9wIj5zdWZmaXg8L3RkPgotICAgIDx0ZCB2YWxpZ249InRvcCI+QSBmaXhlZCBzdHJpbmcgdG8gYmUgcGxhY2VkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQotICAgICAgYXJndW1lbnQuIEluIHRoZSBjYXNlIG9mIGEgbGluZSBicm9rZW4gaW50byBwYXJ0cywgaXQgd2lsbCBiZQorICAgIDx0ZD5zdWZmaXg8L3RkPgorICAgIDx0ZD5BIGZpeGVkIHN0cmluZyB0byBiZSBwbGFjZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGFyZ3VtZW50LiBJbiB0aGUgY2FzZSBvZiBhIGxpbmUgYnJva2VuIGludG8gcGFydHMsIGl0IHdpbGwgYmUKICAgICAgIHBsYWNlZCBhZnRlciBldmVyeSBwYXJ0LiA8ZW0+U2luY2UgQW50IDEuOC48L2VtPjwvdGQ+Ci0gICAgPHRkIHZhbGlnbj0idG9wIiBhbGlnbj0iY2VudGVyIj5ObzwvdGQ+CisgICAgPHRkPk5vPC90ZD4KICAgPC90cj4KIDwvdGFibGU+CiAKLTxwPkl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBhdm9pZCB0aGUgPGNvZGU+bGluZTwvY29kZT4gdmVyc2lvbgotd2hlbiBwb3NzaWJsZS4gIEFudCB3aWxsIHRyeSB0byBzcGxpdCB0aGUgY29tbWFuZCBsaW5lIGluIGEgd2F5Ci1zaW1pbGFyIHRvIHdoYXQgYSAoVW5peCkgc2hlbGwgd291bGQgZG8sIGJ1dCBtYXkgY3JlYXRlIHNvbWV0aGluZyB0aGF0Ci1pcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIHdoYXQgeW91IGV4cGVjdCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMuPC9wPgorPHA+SXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIGF2b2lkIHRoZSA8dmFyPmxpbmU8L3Zhcj4gdmVyc2lvbiB3aGVuIHBvc3NpYmxlLiAgQW50IHdpbGwgdHJ5IHRvIHNwbGl0IHRoZSBjb21tYW5kIGxpbmUKK2luIGEgd2F5IHNpbWlsYXIgdG8gd2hhdCBhIChVbml4KSBzaGVsbCB3b3VsZCBkbywgYnV0IG1heSBjcmVhdGUgc29tZXRoaW5nIHRoYXQgaXMgdmVyeSBkaWZmZXJlbnQgZnJvbSB3aGF0IHlvdSBleHBlY3QKK3VuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcy48L3A+CiAKIDxoND5FeGFtcGxlczwvaDQ+Ci08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7YXJnIHZhbHVlPSZxdW90Oy1sIC1hJnF1b3Q7LyZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KLTxwPmlzIGEgc2luZ2xlIGNvbW1hbmQtbGluZSBhcmd1bWVudCBjb250YWluaW5nIGEgc3BhY2UgY2hhcmFjdGVyLAotPGk+bm90PC9pPiBzZXBhcmF0ZSBjb21tYW5kcyAiLWwiIGFuZCAiLWEiLjwvcD4KLTxibG9ja3F1b3RlPjxwcmU+Ci0gICZsdDthcmcgbGluZT0mcXVvdDstbCAtYSZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5UaGlzIGlzIGEgY29tbWFuZCBsaW5lIHdpdGggdHdvIHNlcGFyYXRlIGFyZ3VtZW50cywgIi1sIiBhbmQgIi1hIi48L3A+Ci08YmxvY2txdW90ZT48cHJlPgotICAmbHQ7YXJnIHBhdGg9JnF1b3Q7L2RpcjsvZGlyMjpcZGlyMyZxdW90Oy8mZ3Q7Ci08L3ByZT48L2Jsb2NrcXVvdGU+Ci08cD5pcyBhIHNpbmdsZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgd2l0aCB0aGUgdmFsdWUKLTxjb2RlPlxkaXI7XGRpcjI7XGRpcjM8L2NvZGU+IG9uIERPUy1iYXNlZCBzeXN0ZW1zIGFuZAotPGNvZGU+L2RpcjovZGlyMjovZGlyMzwvY29kZT4gb24gVW5peC1saWtlIHN5c3RlbXMuPC9wPgorPHByZT4mbHQ7YXJnIHZhbHVlPSZxdW90Oy1sIC1hJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmlzIGEgc2luZ2xlIGNvbW1hbmQtbGluZSBhcmd1bWVudCBjb250YWluaW5nIGEgc3BhY2UgY2hhcmFjdGVyLCA8ZW0+bm90PC9lbT4gc2VwYXJhdGUgb3B0aW9ucyA8cT4tbDwvcT4KK2FuZCA8cT4tYTwvcT4uPC9wPgorPHByZT4mbHQ7YXJnIGxpbmU9JnF1b3Q7LWwgLWEmcXVvdDsvJmd0OzwvcHJlPgorPHA+VGhpcyBpcyBhIGNvbW1hbmQgbGluZSB3aXRoIHR3byBzZXBhcmF0ZSBvcHRpb25zLCA8cT4tbDwvcT4gYW5kIDxxPi1hPC9xPi48L3A+Cis8cHJlPiZsdDthcmcgcGF0aD0mcXVvdDsvZGlyOy9kaXIyOlxkaXIzJnF1b3Q7LyZndDs8L3ByZT4KKzxwPmlzIGEgc2luZ2xlIGNvbW1hbmQtbGluZSBhcmd1bWVudCB3aXRoIHRoZSB2YWx1ZSA8Y29kZT5cZGlyO1xkaXIyO1xkaXIzPC9jb2RlPiBvbiBET1MtYmFzZWQgc3lzdGVtcworYW5kIDxjb2RlPi9kaXI6L2RpcjI6L2RpcjM8L2NvZGU+IG9uIFVuaXgoLWxpa2UpIHN5c3RlbXMuPC9wPgogCi08aDM+PGEgbmFtZT0icmVmZXJlbmNlcyI+UmVmZXJlbmNlczwvYT48L2gzPgorPGgzIGlkPSJyZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9oMz4KIAotPHA+QW55IHByb2plY3QgZWxlbWVudCBjYW4gYmUgYXNzaWduZWQgYW4gaWRlbnRpZmllciB1c2luZyBpdHMKLTxjb2RlPmlkPC9jb2RlPiBhdHRyaWJ1dGUuIEluIG1vc3QgY2FzZXMgdGhlIGVsZW1lbnQgY2FuIHN1YnNlcXVlbnRseQotYmUgcmVmZXJlbmNlZCBieSBzcGVjaWZ5aW5nIHRoZSA8Y29kZT5yZWZpZDwvY29kZT4gYXR0cmlidXRlIG9uIGFuCi1lbGVtZW50IG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSBnb2luZyB0bwotcmVwbGljYXRlIHRoZSBzYW1lIHNuaXBwZXQgb2YgWE1MIG92ZXIgYW5kIG92ZXIgYWdhaW4tLXVzaW5nIGEKLTxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBzdHJ1Y3R1cmUgbW9yZSB0aGFuIG9uY2UsIGZvciBleGFtcGxlLjwvcD4KKzxwPkFueSBwcm9qZWN0IGVsZW1lbnQgY2FuIGJlIGFzc2lnbmVkIGFuIGlkZW50aWZpZXIgdXNpbmcgaXRzIDx2YXI+aWQ8L3Zhcj4gYXR0cmlidXRlLiBJbiBtb3N0IGNhc2VzIHRoZSBlbGVtZW50IGNhbgorc3Vic2VxdWVudGx5IGJlIHJlZmVyZW5jZWQgYnkgc3BlY2lmeWluZyB0aGUgPHZhcj5yZWZpZDwvdmFyPiBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBjYW4gYmUKK3VzZWZ1bCBpZiB5b3UgYXJlIGdvaW5nIHRvIHJlcGxpY2F0ZSB0aGUgc2FtZSBzbmlwcGV0IG9mIFhNTCBvdmVyIGFuZCBvdmVyIGFnYWluJm1kYXNoO3VzaW5nCithIDxjb2RlPiZsdDtjbGFzc3BhdGgmZ3Q7PC9jb2RlPiBzdHJ1Y3R1cmUgbW9yZSB0aGFuIG9uY2UsIGZvciBleGFtcGxlLjwvcD4KIDxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwcm9qZWN0IC4uLiAmZ3Q7CiAgICZsdDt0YXJnZXQgLi4uICZndDsKICAgICAmbHQ7cm1pYyAuLi4mZ3Q7CkBAIC00ODQsMTAgKzM4NSw5IEBACiAgICAgICAmbHQ7L2NsYXNzcGF0aCZndDsKICAgICAmbHQ7L2phdmFjJmd0OwogICAmbHQ7L3RhcmdldCZndDsKLSZsdDsvcHJvamVjdCZndDsKLTwvcHJlPjwvYmxvY2txdW90ZT4KKyZsdDsvcHJvamVjdCZndDs8L3ByZT4KIDxwPmNvdWxkIGJlIHJld3JpdHRlbiBhczo8L3A+Ci08YmxvY2txdW90ZT48cHJlPgorPHByZT4KICZsdDtwcm9qZWN0IC4uLiAmZ3Q7CiAgICZsdDtwYXRoIGlkPSZxdW90O3Byb2plY3QuY2xhc3MucGF0aCZxdW90OyZndDsKICAgICAmbHQ7cGF0aGVsZW1lbnQgbG9jYXRpb249JnF1b3Q7bGliLyZxdW90Oy8mZ3Q7CkBAIC01MDYsNzIgKzQwNiw1OCBAQAogICAgICAgJmx0O2NsYXNzcGF0aCByZWZpZD0mcXVvdDtwcm9qZWN0LmNsYXNzLnBhdGgmcXVvdDsvJmd0OwogICAgICZsdDsvamF2YWMmZ3Q7CiAgICZsdDsvdGFyZ2V0Jmd0OwotJmx0Oy9wcm9qZWN0Jmd0OwotPC9wcmU+PC9ibG9ja3F1b3RlPgotPHA+QWxsIHRhc2tzIHRoYXQgdXNlIG5lc3RlZCBlbGVtZW50cyBmb3IgCi08YSBocmVmPSJUeXBlcy9wYXR0ZXJuc2V0Lmh0bWwiPlBhdHRlcm5TZXQ8L2E+cywgCi08YSBocmVmPSJUeXBlcy9maWxlc2V0Lmh0bWwiPkZpbGVTZXQ8L2E+cywgCi08YSBocmVmPSJUeXBlcy96aXBmaWxlc2V0Lmh0bWwiPlppcEZpbGVTZXQ8L2E+cyBvciAKLTxhIGhyZWY9IiNwYXRoIj5wYXRoLWxpa2Ugc3RydWN0dXJlczwvYT4gYWNjZXB0IHJlZmVyZW5jZXMgdG8gdGhlc2Ugc3RydWN0dXJlcyAKLWFzIHNob3duIGluIHRoZSBleGFtcGxlcy4gVXNpbmcgPGNvZGU+cmVmaWQ8L2NvZGU+IG9uIGEgdGFzayB3aWxsIG9yZGluYXJpbHkgCi1oYXZlIHRoZSBzYW1lIGVmZmVjdCAocmVmZXJlbmNpbmcgYSB0YXNrIGFscmVhZHkgZGVjbGFyZWQpLCBidXQgdGhlIHVzZXIgCi1zaG91bGQgYmUgYXdhcmUgdGhhdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUgaXMgZGVwZW5kZW50IG9uIHRoZSAKLWltcGxlbWVudGF0aW9uIG9mIHRoZSBlbGVtZW50IHVwb24gd2hpY2ggaXQgaXMgc3BlY2lmaWVkLiBTb21lIHRhc2tzICh0aGUgCi08YSBocmVmPSJUYXNrcy9wcm9wZXJ0eS5odG1sIj5wcm9wZXJ0eTwvYT4gdGFzayBpcyBhIGhhbmR5IGV4YW1wbGUpIAotZGVsaWJlcmF0ZWx5IGFzc2lnbiBhIGRpZmZlcmVudCBtZWFuaW5nIHRvIDxjb2RlPnJlZmlkPC9jb2RlPi48L3A+CismbHQ7L3Byb2plY3QmZ3Q7PC9wcmU+Cis8cD5BbGwgdGFza3MgdGhhdCB1c2UgbmVzdGVkIGVsZW1lbnRzCitmb3IgPGEgaHJlZj0iVHlwZXMvcGF0dGVybnNldC5odG1sIj5QYXR0ZXJuU2V0PC9hPnMsIDxhIGhyZWY9IlR5cGVzL2ZpbGVzZXQuaHRtbCI+RmlsZVNldDwvYT5zLCA8YSBocmVmPSJUeXBlcy96aXBmaWxlc2V0Lmh0bWwiPlppcEZpbGVTZXQ8L2E+cworb3IgPGEgaHJlZj0iI3BhdGgiPnBhdGgtbGlrZSBzdHJ1Y3R1cmVzPC9hPiBhY2NlcHQgcmVmZXJlbmNlcyB0byB0aGVzZSBzdHJ1Y3R1cmVzIGFzIHNob3duIGluIHRoZQorZXhhbXBsZXMuIFVzaW5nIDx2YXI+cmVmaWQ8L3Zhcj4gb24gYSB0YXNrIHdpbGwgb3JkaW5hcmlseSBoYXZlIHRoZSBzYW1lIGVmZmVjdCAocmVmZXJlbmNpbmcgYSB0YXNrIGFscmVhZHkgZGVjbGFyZWQpLAorYnV0IHRoZSB1c2VyIHNob3VsZCBiZSBhd2FyZSB0aGF0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBkZXBlbmRlbnQgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlbGVtZW50Cit1cG9uIHdoaWNoIGl0IGlzIHNwZWNpZmllZC4gU29tZSB0YXNrcyAodGhlIDxhIGhyZWY9IlRhc2tzL3Byb3BlcnR5Lmh0bWwiPnByb3BlcnR5PC9hPiB0YXNrIGlzIGEgaGFuZHkgZXhhbXBsZSkKK2RlbGliZXJhdGVseSBhc3NpZ24gYSBkaWZmZXJlbnQgbWVhbmluZyB0byA8dmFyPnJlZmlkPC92YXI+LjwvcD4KIAotCi08aDM+PGEgbmFtZT0iZXh0ZXJuYWwtdGFza3MiPlVzZSBvZiBleHRlcm5hbCB0YXNrczwvYT48L2gzPiAKLUFudCBzdXBwb3J0cyBhIHBsdWdpbiBtZWNoYW5pc20gZm9yIHVzaW5nIHRoaXJkIHBhcnR5IHRhc2tzLiBGb3IgdXNpbmcgdGhlbSB5b3UgCi1oYXZlIHRvIGRvIHR3byBzdGVwczogCis8aDMgaWQ9ImV4dGVybmFsLXRhc2tzIj5Vc2Ugb2YgZXh0ZXJuYWwgdGFza3M8L2gzPgorPHA+QW50IHN1cHBvcnRzIGEgcGx1Z2luIG1lY2hhbmlzbSBmb3IgdXNpbmcgdGhpcmQgcGFydHkgdGFza3MuIEZvciB1c2luZyB0aGVtIHlvdSBoYXZlIHRvIGRvIHR3byBzdGVwczo8L3A+CiA8b2w+Ci0gIDxsaT5wbGFjZSB0aGVpciBpbXBsZW1lbnRhdGlvbiBzb21ld2hlcmUgd2hlcmUgQW50IGNhbiBmaW5kIHRoZW08L2xpPgorICA8bGk+cGxhY2UgdGhlaXIgaW1wbGVtZW50YXRpb24gc29tZXdoZXJlIHdoZXJlIEFudCBjYW4gZmluZCB0aGVtLjwvbGk+CiAgIDxsaT5kZWNsYXJlIHRoZW0uPC9saT4KLTwvb2w+IAotRG9uJ3QgYWRkIGFueXRoaW5nIHRvIHRoZSBDTEFTU1BBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgLSB0aGlzIGlzIG9mdGVuIHRoZSAgCi1yZWFzb24gZm9yIHZlcnkgb2JzY3VyZSBlcnJvcnMuIFVzZSBBbnQncyBvd24gPGEgaHJlZj0iaW5zdGFsbC5odG1sI29wdGlvbmFsVGFza3MiPm1lY2hhbmlzbXM8L2E+IAotZm9yIGFkZGluZyBsaWJyYXJpZXM6IAorPC9vbD4KKzxwPkRvbid0IGFkZCBhbnl0aGluZyB0byB0aGUgPGNvZGU+Q0xBU1NQQVRIPC9jb2RlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSZtZGFzaDt0aGlzIGlzIG9mdGVuIHRoZSByZWFzb24gZm9yIHZlcnkgb2JzY3VyZQorZXJyb3JzLiBVc2UgQW50J3Mgb3duIDxhIGhyZWY9Imluc3RhbGwuaHRtbCNvcHRpb25hbFRhc2tzIj5tZWNoYW5pc21zPC9hPiBmb3IgYWRkaW5nIGxpYnJhcmllczo8L3A+CiA8dWw+Ci0gIDxsaT52aWEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IDxjb2RlPi1saWI8L2NvZGU+PC9saT4KKyAgPGxpPnZpYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgPGtiZD4tbGliPC9rYmQ+PC9saT4KICAgPGxpPmFkZGluZyB0byA8Y29kZT4ke3VzZXIuaG9tZX0vLmFudC9saWI8L2NvZGU+PC9saT4KICAgPGxpPmFkZGluZyB0byA8Y29kZT4ke2FudC5ob21lfS9saWI8L2NvZGU+PC9saT4KIDwvdWw+Ci1Gb3IgdGhlIGRlY2xhcmF0aW9uIHRoZXJlIGFyZSBzZXZlcmFsIHdheXM6Cis8cD5Gb3IgdGhlIGRlY2xhcmF0aW9uIHRoZXJlIGFyZSBzZXZlcmFsIHdheXM6PC9wPgogPHVsPgotICA8bGk+ZGVjbGFyZSBhIHNpbmdsZSB0YXNrIHBlciB1c2luZyBpbnN0cnVjdGlvbiB1c2luZyAgCi0gICAgICA8Y29kZT4mbHQ7PGEgaHJlZj0iVGFza3MvdGFza2RlZi5odG1sIj50YXNrZGVmPC9hPiBuYW1lPSZxdW90O3Rhc2tuYW1lJnF1b3Q7IAotICAgICAgY2xhc3NuYW1lPSZxdW90O0ltcGxlbWVudGF0aW9uQ2xhc3MmcXVvdDsvJmd0OzwvY29kZT4KLSAgICAgIDxicj4KLSAgICAgIDxjb2RlPiZsdDt0YXNrZGVmIG5hbWU9JnF1b3Q7Zm9yJnF1b3Q7IGNsYXNzbmFtZT0mcXVvdDtuZXQuc2YuYW50Y29udHJpYi5sb2dpYy5Gb3ImcXVvdDsgLyZndDsgCi0gICAgICAmbHQ7Zm9yIC4uLiAvJmd0OzwvY29kZT4KKyAgPGxpPmRlY2xhcmUgYSBzaW5nbGUgdGFzayBwZXIgdXNpbmcgaW5zdHJ1Y3Rpb24gdXNpbmcKKyAgICA8Y29kZT4mbHQ7PGEgaHJlZj0iVGFza3MvdGFza2RlZi5odG1sIj50YXNrZGVmPC9hPiBuYW1lPSZxdW90O3Rhc2tuYW1lJnF1b3Q7CisgICAgICBjbGFzc25hbWU9JnF1b3Q7SW1wbGVtZW50YXRpb25DbGFzcyZxdW90Oy8mZ3Q7PC9jb2RlPjxici8+CisgICAgPGNvZGUgY2xhc3M9ImNvZGUiPiZsdDt0YXNrZGVmIG5hbWU9JnF1b3Q7Zm9yJnF1b3Q7IGNsYXNzbmFtZT0mcXVvdDtuZXQuc2YuYW50Y29udHJpYi5sb2dpYy5Gb3ImcXVvdDsvJmd0OyAmbHQ7Zm9yCisgICAgICAuLi4gLyZndDs8L2NvZGU+CiAgIDwvbGk+Ci0gIDxsaT5kZWNsYXJlIGEgYnVuZGxlIG9mIHRhc2tzIHVzaW5nIGEgcHJvcGVydGllcy1maWxlIGhvbGRpbmcgdGhlc2UgCi0gICAgICB0YXNrbmFtZS1JbXBsZW1lbnRhdGlvbkNsYXNzLXBhaXJzIGFuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+Ci0gICAgICA8YnI+Ci0gICAgICA8Y29kZT4mbHQ7dGFza2RlZiByZXNvdXJjZT0mcXVvdDtuZXQvc2YvYW50Y29udHJpYi9hbnRjb250cmliLnByb3BlcnRpZXMmcXVvdDsgLyZndDsgCi0gICAgICAmbHQ7Zm9yIC4uLiAvJmd0OzwvY29kZT4KKyAgPGxpPmRlY2xhcmUgYSBidW5kbGUgb2YgdGFza3MgdXNpbmcgYSA8c2FtcD5wcm9wZXJ0aWVzPC9zYW1wPiBmaWxlIGhvbGRpbmcgdGhlc2UgdGFza25hbWUmbmRhc2g7SW1wbGVtZW50YXRpb25DbGFzcworICAgIHBhaXJzIGFuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+PGJyLz4KKyAgICA8Y29kZSBjbGFzcz0iY29kZSI+Jmx0O3Rhc2tkZWYgcmVzb3VyY2U9JnF1b3Q7bmV0L3NmL2FudGNvbnRyaWIvYW50Y29udHJpYi5wcm9wZXJ0aWVzJnF1b3Q7LyZndDsgJmx0O2ZvcgorICAgIC4uLiAvJmd0OzwvY29kZT4KICAgPC9saT4KLSAgPGxpPmRlY2xhcmUgYSBidW5kbGUgb2YgdGFza3MgdXNpbmcgYSA8YSBocmVmPSJUeXBlcy9hbnRsaWIuaHRtbCI+eG1sLWZpbGU8L2E+IGhvbGRpbmcgdGhlc2UgIAotICAgICAgdGFza25hbWUtSW1wbGVtZW50YXRpb25DbGFzcy1wYWlycyBhbmQgPGNvZGU+Jmx0O3Rhc2tkZWYmZ3Q7PC9jb2RlPgotICAgICAgPGJyPgotICAgICAgPGNvZGU+Jmx0O3Rhc2tkZWYgcmVzb3VyY2U9JnF1b3Q7bmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCZxdW90OyAvJmd0OyAKLSAgICAgICZsdDtmb3IgLi4uIC8mZ3Q7PC9jb2RlPgorICA8bGk+ZGVjbGFyZSBhIGJ1bmRsZSBvZiB0YXNrcyB1c2luZyBhbiA8YSBocmVmPSJUeXBlcy9hbnRsaWIuaHRtbCI+eG1sIGZpbGU8L2E+IGhvbGRpbmcgdGhlc2UKKyAgICB0YXNrbmFtZS1JbXBsZW1lbnRhdGlvbkNsYXNzLXBhaXJzIGFuZCA8Y29kZT4mbHQ7dGFza2RlZiZndDs8L2NvZGU+PGJyLz4KKyAgICA8Y29kZSBjbGFzcz0iY29kZSI+Jmx0O3Rhc2tkZWYgcmVzb3VyY2U9JnF1b3Q7bmV0L3NmL2FudGNvbnRyaWIvYW50bGliLnhtbCZxdW90Oy8mZ3Q7ICZsdDtmb3IgLi4uIC8mZ3Q7PC9jb2RlPgogICA8L2xpPgotICA8bGk+ZGVjbGFyZSBhIGJ1bmRsZSBvZiB0YXNrcyB1c2luZyBhIHhtbC1maWxlIG5hbWVkIGFudGxpYi54bWwsIFhNTC1uYW1lc3BhY2UgYW5kIAotICAgICAgPGEgaHJlZj0iVHlwZXMvYW50bGliLmh0bWwjYW50bGlibmFtZXNwYWNlIj48Y29kZT5hbnRsaWI6PC9jb2RlPiBwcm90b2NvbCBoYW5kbGVyPC9hPiAKLSAgICAgIDxicj4KLSAgICAgIDxjb2RlPiZsdDtwcm9qZWN0IHhtbG5zOmFjPSZxdW90O2FudGxpYjpuZXQuc2YuYW50Y29udHJpYiZxdW90Oy8mZ3Q7IAotICAgICAgJmx0O2FjOmZvciAuLi4gLyZndDs8L2NvZGU+CisgIDxsaT5kZWNsYXJlIGEgYnVuZGxlIG9mIHRhc2tzIHVzaW5nIGFuIHhtbCBmaWxlIG5hbWVkIDxzYW1wPmFudGxpYi54bWw8L3NhbXA+LCBYTUwgbmFtZXNwYWNlCisgICAgYW5kIDxhIGhyZWY9IlR5cGVzL2FudGxpYi5odG1sI2FudGxpYm5hbWVzcGFjZSI+PGNvZGU+YW50bGliOjwvY29kZT4gcHJvdG9jb2wgaGFuZGxlcjwvYT48YnIvPgorICAgIDxjb2RlIGNsYXNzPSJjb2RlIj4mbHQ7cHJvamVjdCB4bWxuczphYz0mcXVvdDthbnRsaWI6bmV0LnNmLmFudGNvbnRyaWImcXVvdDsvJmd0OyAmbHQ7YWM6Zm9yIC4uLiAvJmd0OzwvY29kZT4KICAgPC9saT4KIDwvdWw+CiAKIElmIHlvdSBuZWVkIGEgc3BlY2lhbCBmdW5jdGlvbiwgeW91IHNob3VsZAogPG9sPgogICA8bGk+aGF2ZSBhIGxvb2sgYXQgdGhpcyBtYW51YWwsIGJlY2F1c2UgQW50IHByb3ZpZGVzIGxvdCBvZiB0YXNrczwvbGk+Ci0gIDxsaT5oYXZlIGEgbG9vayBhdCB0aGUgZXh0ZXJuYWwgdGFzayBwYWdlIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9leHRlcm5hbC5odG1sIj5vbmxpbmU8L2E+PC9saT4KKyAgPGxpPmhhdmUgYSBsb29rIGF0IHRoZSBleHRlcm5hbCB0YXNrIHBhZ2UgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9leHRlcm5hbC5odG1sIiB0YXJnZXQ9Il90b3AiPm9ubGluZTwvYT48L2xpPgogICA8bGk+aGF2ZSBhIGxvb2sgYXQgdGhlIGV4dGVybmFsIHRhc2sgPGEgaHJlZj0iaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9BTlQvQW50RXh0ZXJuYWxUYXNrZGVmcyIgdGFyZ2V0PSJfdG9wIj53aWtpCiAgICAgcGFnZTwvYT48L2xpPgotICA8bGk+YXNrIG9uIHRoZSA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sI1VzZXIlMjBMaXN0Ij5BbnQgdXNlcjwvYT4gbGlzdDwvbGk+CisgIDxsaT5hc2sgb24gdGhlIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvbWFpbC5odG1sI1VzZXIlMjBMaXN0IiB0YXJnZXQ9Il90b3AiPkFudCB1c2VyPC9hPiBsaXN0PC9saT4KICAgPGxpPjxhIGhyZWY9InR1dG9yaWFsLXdyaXRpbmctdGFza3MuaHRtbCI+aW1wbGVtZW50PC9hPiAoYW5kIHNoYXJlKSB5b3VyIG93bjwvbGk+CiA8L29sPgogCmRpZmYgLS1naXQgYS9tYW51YWwvdXNpbmdsaXN0Lmh0bWwgYi9tYW51YWwvdXNpbmdsaXN0Lmh0bWwKaW5kZXggOTE2OWQ2Zi4uY2I3MGMyYiAxMDA2NDQKLS0tIGEvbWFudWFsL3VzaW5nbGlzdC5odG1sCisrKyBiL21hbnVhbC91c2luZ2xpc3QuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDEwICsxNSw5IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgotPGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+CiAKIDxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1MYW5ndWFnZSIgY29udGVudD0iZW4tdXMiLz4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN0eWxlc2hlZXRzL3N0eWxlLmNzcyIvPgogPHRpdGxlPkFwYWNoZSBBbnQgVXNlciBNYW51YWw8L3RpdGxlPgogPGJhc2UgdGFyZ2V0PSJtYWluRnJhbWUiLz4KQEAgLTI5LDIyICsyOSwxOSBAQAogCiA8aDM+VXNpbmcgQXBhY2hlIEFudDwvaDM+CiA8dWwgY2xhc3M9ImlubGluZWxpc3QiPgotPGxpPjxhIGhyZWY9InVzaW5nLmh0bWwjYnVpbGRmaWxlIj5Xcml0aW5nIGEgU2ltcGxlIEJ1aWxkZmlsZTwvYT48L2xpPgotPGRpdiBzdHlsZT0icGFkZGluZy1sZWZ0OjFlbSI+Ci0gIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI3Byb2plY3RzIj5Qcm9qZWN0czwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0idGFyZ2V0cy5odG1sI3RhcmdldHMiPlRhcmdldHM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InVzaW5nLmh0bWwjdGFza3MiPlRhc2tzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI3Byb3BlcnRpZXMiPlByb3BlcnRpZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InByb3BlcnRpZXMuaHRtbCNidWlsdC1pbi1wcm9wcyI+QnVpbHQtaW4gUHJvcGVydGllczwvYT48L2xpPgotICA8bGk+PGEgaHJlZj0icHJvcGVydGllcy5odG1sI3Byb3BlcnR5SGVscGVyIj5Qcm9wZXJ0eSBIZWxwZXJzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI2V4YW1wbGUiPkV4YW1wbGUgQnVpbGRmaWxlPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI2ZpbHRlcnMiPlRva2VuIEZpbHRlcnM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InVzaW5nLmh0bWwjcGF0aCI+UGF0aC1saWtlIFN0cnVjdHVyZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InVzaW5nLmh0bWwjYXJnIj5Db21tYW5kLWxpbmUgQXJndW1lbnRzPC9hPjwvbGk+Ci0gIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI3JlZmVyZW5jZXMiPlJlZmVyZW5jZXM8L2E+PC9saT4KLSAgPGxpPjxhIGhyZWY9InVzaW5nLmh0bWwjZXh0ZXJuYWwtdGFza3MiPlVzZSBvZiBleHRlcm5hbCB0YXNrczwvYT48L2xpPgotPC9kaXY+CisgIDxsaT48YSBocmVmPSJ1c2luZy5odG1sI2J1aWxkZmlsZSI+V3JpdGluZyBhIFNpbXBsZSBCdWlsZGZpbGU8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InVzaW5nLmh0bWwjcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+CisgIDxsaSBjbGFzcz0iaW5kZW50Ij48YSBocmVmPSJ0YXJnZXRzLmh0bWwjdGFyZ2V0cyI+VGFyZ2V0czwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0idXNpbmcuaHRtbCN0YXNrcyI+VGFza3M8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InVzaW5nLmh0bWwjcHJvcGVydGllcyI+UHJvcGVydGllczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0icHJvcGVydGllcy5odG1sI2J1aWx0LWluLXByb3BzIj5CdWlsdC1pbiBQcm9wZXJ0aWVzPC9hPjwvbGk+CisgIDxsaSBjbGFzcz0iaW5kZW50Ij48YSBocmVmPSJwcm9wZXJ0aWVzLmh0bWwjcHJvcGVydHlIZWxwZXIiPlByb3BlcnR5IEhlbHBlcnM8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InVzaW5nLmh0bWwjZXhhbXBsZSI+RXhhbXBsZSBCdWlsZGZpbGU8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InVzaW5nLmh0bWwjZmlsdGVycyI+VG9rZW4gRmlsdGVyczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0idXNpbmcuaHRtbCNwYXRoIj5QYXRoLWxpa2UgU3RydWN0dXJlczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0idXNpbmcuaHRtbCNhcmciPkNvbW1hbmQtbGluZSBBcmd1bWVudHM8L2E+PC9saT4KKyAgPGxpIGNsYXNzPSJpbmRlbnQiPjxhIGhyZWY9InVzaW5nLmh0bWwjcmVmZXJlbmNlcyI+UmVmZXJlbmNlczwvYT48L2xpPgorICA8bGkgY2xhc3M9ImluZGVudCI+PGEgaHJlZj0idXNpbmcuaHRtbCNleHRlcm5hbC10YXNrcyI+VXNlIG9mIGV4dGVybmFsIHRhc2tzPC9hPjwvbGk+CiA8L3VsPgogPC9ib2R5PgogPC9odG1sPgotCmRpZmYgLS1naXQgYS9wYXRjaC54bWwgYi9wYXRjaC54bWwKaW5kZXggOTEwYjEyMy4uN2FkYmUwNCAxMDA2NDQKLS0tIGEvcGF0Y2gueG1sCisrKyBiL3BhdGNoLnhtbApAQCAtOCw3ICs4LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvcmVsZWFzZS5zaCBiL3JlbGVhc2Uuc2gKaW5kZXggZDEwNDNkNS4uY2RhZWMwNiAxMDA3NTUKLS0tIGEvcmVsZWFzZS5zaAorKysgYi9yZWxlYXNlLnNoCkBAIC02LDcgKzYsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3JlbGVhc2UvYnVpbGQtb3N4LXBrZy5weSBiL3JlbGVhc2UvYnVpbGQtb3N4LXBrZy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDE0NGEwMy4uMDAwMDAwMAotLS0gYS9yZWxlYXNlL2J1aWxkLW9zeC1wa2cucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCi0KLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBCdWlsZHMgYSBNYWMgT1MgWCAucGtnIGZyb20gYSBiaW5hcnkgWklQIGFyY2hpdmUgb2YgQXBhY2hlIEFudC4KLQotaW1wb3J0IGNvbGxlY3Rpb25zCi1pbXBvcnQgY29udGV4dGxpYgotaW1wb3J0IG9zCi0KLUFwYWNoZUFudFVSTCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCi0gICAgJ0FwYWNoZUFudFVSTCcsCi0gICAgKCd1cmwnLCAndXJsX3NjaGVtZScsICd2ZXJzaW9uJywgJ2RpcmVjdG9yeV9uYW1lJykpCi0KLUBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCi1kZWYgbWFrZV90ZW1wX2RpcmVjdG9yeSgpOgotICAgICcnJ0NyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdoaWNoIGlzIHJlY3Vyc2l2ZWx5IGRlbGV0ZWQgd2hlbiBvdXQgb2Ygc2NvcGUuJycnCi0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCB0ZW1wZmlsZQotICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0gICAgeWllbGQgdGVtcF9kaXIKLSAgICBzaHV0aWwucm10cmVlKHRlbXBfZGlyKQotCi1AY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgotZGVmIHNlbGZfY2xvc2luZ191cmwodXJsKToKLSAgICAnJydPcGVucyBhIFVSTCBhbmQgcmV0dXJucyBhIHNlbGYtY2xvc2luZyBmaWxlLWxpa2Ugb2JqZWN0LicnJwotICAgIGltcG9ydCB1cmxsaWIyCi0gICAgdXJsX2ZwID0gdXJsbGliMi51cmxvcGVuKHVybCkKLSAgICB5aWVsZCB1cmxfZnAKLSAgICB1cmxfZnAuY2xvc2UoKQotCi1kZWYgYXBhY2hlX2FudF91cmwodXJsX3N0cmluZyk6Ci0gICAgJycnUGFyc2VzIGEgVVJMIHN0cmluZyBpbnRvIGFuIEFwYWNoZUFudFVSTCBvYmplY3QuJycnCi0gICAgaW1wb3J0IGFyZ3BhcnNlLCBjb2xsZWN0aW9ucywgb3MucGF0aCwgdXJscGFyc2UKLSAgICBwYXJzZV9yZXN1bHQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmxfc3RyaW5nKQotICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChwYXJzZV9yZXN1bHQucGF0aClbMV0KLSAgICBpZiBub3QgKGZpbGVuYW1lLnN0YXJ0c3dpdGgoJ2FwYWNoZS1hbnQtJykgYW5kIGZpbGVuYW1lLmVuZHN3aXRoKCctYmluLnppcCcpKToKLSAgICAgICAgcmFpc2UgYXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoCi0gICAgICAgICAgICAnRXhwZWN0ZWQgWyVzXSB0byBlbmQgd2l0aCBhcGFjaGUtYW50LVguWS5aLWJpbi56aXAnICUgKHVybF9zdHJpbmcpKQotICAgIGV4dHJhY3RlZF9kaXJlY3RvcnkgPSBmaWxlbmFtZS5yZXBsYWNlKCctYmluLnppcCcsICcnKQotICAgIGV4dHJhY3RlZF92ZXJzaW9uID0gZXh0cmFjdGVkX2RpcmVjdG9yeS5yZXBsYWNlKCdhcGFjaGUtYW50LScsICcnKQotICAgIHJldHVybiBBcGFjaGVBbnRVUkwoCi0gICAgICAgIHVybD11cmxfc3RyaW5nLAotICAgICAgICB1cmxfc2NoZW1lPXBhcnNlX3Jlc3VsdC5zY2hlbWUsCi0gICAgICAgIHZlcnNpb249ZXh0cmFjdGVkX3ZlcnNpb24sCi0gICAgICAgIGRpcmVjdG9yeV9uYW1lPWV4dHJhY3RlZF9kaXJlY3RvcnkpCi0KLWRlZiBmZXRjaF91cmwodXJsLCBsb2NhbF9vdXRwdXRfZmlsZSk6Ci0gICAgJycnRG93bmxvYWRzIHRoZSBjb250ZW50cyBvZiAndXJsJyBhbmQgd3JpdGVzIHRoZW0gdGhlIG9wZW5lZCBmaWxlICdvdXRwdXRfZmlsZScuJycnCi0gICAgaW1wb3J0IHNodXRpbAotICAgIGltcG9ydCB1cmxsaWIyCi0gICAgQ0hVTktfU0laRSA9IDE2ICogMTAyNAotICAgIHByaW50ICdGZXRjaGluZyB7dXJsfS4uLicuZm9ybWF0KHVybD11cmwpCi0gICAgd2l0aCBzZWxmX2Nsb3NpbmdfdXJsKHVybCkgYXMgdXJsX2lucHV0X2ZpbGU6Ci0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICBjaHVuayA9IHVybF9pbnB1dF9maWxlLnJlYWQoQ0hVTktfU0laRSkKLSAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgbG9jYWxfb3V0cHV0X2ZpbGUud3JpdGUoY2h1bmspCi0gICAgICAgIGxvY2FsX291dHB1dF9maWxlLnNlZWsoMCkKLQotZGVmIGZldGNoX2FwYWNoZV9hbnRfdXJsKGFwYWNoZV9hbnRfdXJsLCB0ZW1wX2Rpcik6Ci0gICAgJycnSWYgdGhlIEFwYWNoZUFudFVSTCBvYmplY3QgaXMgcmVtb3RlLCBmZXRjaGVzIGFuZCByZXR1cm5zIHRoZSBsb2NhbCBmaWxlIG9iamVjdC4KLSAgICBPdGhlcndpc2UsIG9wZW5zIGFuZCByZXR1cm5zIGEgZmlsZSBvYmplY3QuJycnCi0gICAgaW1wb3J0IHRlbXBmaWxlCi0gICAgaWYgYXBhY2hlX2FudF91cmwudXJsX3NjaGVtZSA9PSAnJyBvciBhcGFjaGVfYW50X3VybC51cmxfc2NoZW1lID09ICdmaWxlJzoKLSAgICAgICAgcmV0dXJuIG9wZW4oYXBhY2hlX2FudF91cmwudXJsLCAncmInKQotICAgIGVsc2U6Ci0gICAgICAgIGZwID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZShkaXI9dGVtcF9kaXIpCi0gICAgICAgIGZldGNoX3VybChhcGFjaGVfYW50X3VybC51cmwsIGZwKQotICAgICAgICByZXR1cm4gZnAKLQotZGVmIHVuY29tcHJlc3NfY29udGVudHModGVtcF9kaXIsIGFyY2hpdmVfZmlsZSwgZGlyZWN0b3J5X25hbWUsIHBhdGhfcHJlZml4KToKLSAgICAnJydVbmNvbXByZXNzZXMgdGhlIGNvbnRlbnRzIG9mICdhcmNoaXZlX2ZpbGUnIHRvICd0ZW1wX2RpcicuCi0KLSAgICBTdHJpcHMgdGhlIHByZWZpeCAnZGlyZWN0b3J5X25hbWUnIGFuZCBwcmVwZW5kcyAncGF0aF9wcmVmaXgnIHRvIGVhY2ggZW50cnkKLSAgICBvZiB0aGUgemlwIGZpbGUuCi0gICAgJycnCi0gICAgaW1wb3J0IHNodXRpbCwgemlwZmlsZQotICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAncGtnJykKLSAgICBvcy5ta2RpcihvdXRwdXRfcGF0aCkKLSAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGFyY2hpdmVfZmlsZSkKLSAgICBwcmludCAnRXh0cmFjdGluZyBhcmNoaXZlIHRvIHtvdXRwdXRfcGF0aH0uLi4nLmZvcm1hdCgKLSAgICAgICAgb3V0cHV0X3BhdGg9b3V0cHV0X3BhdGgpCi0gICAgZm9yIGVudHJ5IGluIHouaW5mb2xpc3QoKToKLSAgICAgICAgIyBXZSBjYW4ndCBqdXN0IGV4dHJhY3QgZGlyZWN0bHksIHNpbmNlIHdlIHdhbnQgdG8gbWFwOgotICAgICAgICAjCi0gICAgICAgICMgYXBhY2hlLWFudC1YLlkuWi9iaW4vZm9vCi0gICAgICAgICMKLSAgICAgICAgIyB0bwotICAgICAgICAjCi0gICAgICAgICMgdXNyL2xvY2FsL2FudC9iaW4vZm9vCi0gICAgICAgICMKLSAgICAgICAgIyBTbywgd2Ugc3RyaXAgb3V0IHRoZSBhcGFjaGUtYW50LVguWS5aIHByZWZpeCwgdGhlbiBpbnN0ZWFkIG9mCi0gICAgICAgICMgdXNpbmcgWmlwRmlsZS5leHRyYWN0KCksIHdlIHVzZSBaaXBGaWxlLm9wZW4oKSB0byBnZXQgYSByZWFkIGZkIHRvCi0gICAgICAgICMgdGhlIHNvdXJjZSBmaWxlLCB0aGVuIG9zLmZkb3BlbigpIHdpdGggdGhlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zCi0gICAgICAgICMgdG8gZ2V0YSB3cml0ZSBmZCB0byB0aGUgbW9kaWZpZWQgZGVzdGluYXRpb24gcGF0aC4KLSAgICAgICAgZXhwZWN0ZWRfcHJlZml4ID0gZGlyZWN0b3J5X25hbWUgKyAnLycKLSAgICAgICAgaWYgbm90IGVudHJ5LmZpbGVuYW1lLnN0YXJ0c3dpdGgoZXhwZWN0ZWRfcHJlZml4KToKLSAgICAgICAgICAgIHJhaXNlIEV4ZXB0aW9uKCdVbmV4cGVjdGVkIGVudHJ5IGluIHppcCBmaWxlOiBbe2ZpbGVuYW1lfV0nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9ZW50cnkuZmlsZW5hbWUpKQotICAgICAgICBlbnRyeV9wYXRoID0gZW50cnkuZmlsZW5hbWUucmVwbGFjZShleHBlY3RlZF9wcmVmaXgsICcnLCAxKQotCi0gICAgICAgICMgVXNpbmcgb3MucGF0aC5qb2luIGlzIGFubm95aW5nIGhlcmUgKHdlJ2QgaGF2ZSB0byBleHBsb2RlIG91dHB1dF9wYXRoCi0gICAgICAgICMgYW5kIGVudHJ5X3BhdGgpLgotICAgICAgICBlbnRyeV9vdXRwdXRfcGF0aCA9IG91dHB1dF9wYXRoICsgcGF0aF9wcmVmaXggKyAnLycgKyBlbnRyeV9wYXRoCi0KLSAgICAgICAgIyBaaXAgZmlsZSBwYXRocyBhcmUgbm9ybWFsaXplZCB3aXRoICcvJyBhdCB0aGUgZW5kIGZvciBkaXJlY3Rvcmllcy4KLSAgICAgICAgaWYgZW50cnlfb3V0cHV0X3BhdGguZW5kc3dpdGgoJy8nKToKLSAgICAgICAgICAgIHByaW50ICdDcmVhdGluZyBkaXJlY3Rvcnkge3BhdGh9Jy5mb3JtYXQocGF0aD1lbnRyeV9vdXRwdXRfcGF0aCkKLSAgICAgICAgICAgIG9zLm1ha2VkaXJzKGVudHJ5X291dHB1dF9wYXRoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBZZXMsIHRoaXMgaXMgcmVhbGx5IGhvdyB5b3UgZXh0cmFjdCBwZXJtaXNzaW9ucyBmcm9tIGEgWmlwSW5mbyBlbnRyeS4KLSAgICAgICAgICAgIHBlcm1zID0gKGVudHJ5LmV4dGVybmFsX2F0dHIgPj4gMTZMKSAmIDA3NzcKLSAgICAgICAgICAgIHByaW50ICdFeHRyYWN0aW5nIHtlbnRyeV9maWxlbmFtZX0gdG8ge3BhdGh9IHdpdGggbW9kZSAwe21vZGU6b30nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICBlbnRyeV9maWxlbmFtZT1lbnRyeS5maWxlbmFtZSwgcGF0aD1lbnRyeV9vdXRwdXRfcGF0aCwgbW9kZT1wZXJtcykKLSAgICAgICAgICAgIHdpdGggei5vcGVuKGVudHJ5KSBhcyBzb3VyY2U6Ci0gICAgICAgICAgICAgICAgd2l0aCBvcy5mZG9wZW4oCi0gICAgICAgICAgICAgICAgICAgIG9zLm9wZW4oZW50cnlfb3V0cHV0X3BhdGgsIG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCwgcGVybXMpLCAndycpIFwKLSAgICAgICAgICAgICAgICAgICAgYXMgZGVzdGluYXRpb246Ci0gICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIGRlc3RpbmF0aW9uKQotICAgIHJldHVybiBvdXRwdXRfcGF0aAotCi1kZWYgd3JpdGVfcGF0aHNfZF9lbnRyeShwYXRoc19kX2RpcmVjdG9yeSwgZmlsZW5hbWUpOgotICAgIG9zLm1ha2VkaXJzKHBhdGhzX2RfZGlyZWN0b3J5KQotICAgIG91dHB1dF9maWxlID0gb3MucGF0aC5qb2luKHBhdGhzX2RfZGlyZWN0b3J5LCBmaWxlbmFtZSkKLSAgICB3aXRoIG9wZW4ob3V0cHV0X2ZpbGUsICd3JykgYXMgZjoKLSAgICAgICAgcHJpbnQgPj5mLCAnL3Vzci9sb2NhbC9hbnQvYmluJwotCi1kZWYgbWFrZV9wa2cocGtnX2RpciwgcGtnX2lkZW50aWZpZXIsIHBrZ192ZXJzaW9uLCBvdXRwdXRfcGtnX3BhdGgpOgotICAgIGltcG9ydCBzdWJwcm9jZXNzCi0gICAgcHJpbnQgJ0J1aWxkaW5nIHBhY2thZ2UgYXQge291dHB1dF9wa2dfcGF0aH0uLi4nLmZvcm1hdCgKLSAgICAgICAgb3V0cHV0X3BrZ19wYXRoPW91dHB1dF9wa2dfcGF0aCkKLSAgICBzdWJwcm9jZXNzLmNhbGwoCi0gICAgICAgIFsncGtnYnVpbGQnLAotICAgICAgICAgJy0tcm9vdCcsIHBrZ19kaXIsCi0gICAgICAgICAnLS1pZGVudGlmaWVyJywgcGtnX2lkZW50aWZpZXIsCi0gICAgICAgICAnLS12ZXJzaW9uJywgcGtnX3ZlcnNpb24sCi0gICAgICAgICBvdXRwdXRfcGtnX3BhdGhdKQotCi1kZWYgbWFpbigpOgotICAgIGltcG9ydCBhcmdwYXJzZQotICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSdCdWlsZHMgYSBNYWMgT1MgWCAucGtnIG9mIGFudC4nKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICdhcGFjaGVfYW50X3VybCcsCi0gICAgICAgIG1ldGF2YXI9J2ZpbGUtb3ItdXJsJywKLSAgICAgICAgaGVscD0nU291cmNlIGZpbGUgb3IgVVJMIGZyb20gd2hpY2ggdG8gdW5jb21wcmVzcyBhcGFjaGUtYW50LVguWS5aLWJpbi56aXAnLAotICAgICAgICB0eXBlPWFwYWNoZV9hbnRfdXJsKQotICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCi0gICAgICAgICctLW91dHB1dC1kaXInLAotICAgICAgICBkZWZhdWx0PScuJywKLSAgICAgICAgaGVscD0nRGlyZWN0b3J5IHRvIHdoaWNoIC5wa2cgd2lsbCBiZSB3cml0dGVuLiBEZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeS4nKQotICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCi0gICAgd2l0aCBtYWtlX3RlbXBfZGlyZWN0b3J5KCkgYXMgdGVtcF9kaXI6Ci0gICAgICAgIGFyY2hpdmVfZmlsZSA9IGZldGNoX2FwYWNoZV9hbnRfdXJsKGFyZ3MuYXBhY2hlX2FudF91cmwsIHRlbXBfZGlyKQotICAgICAgICBwa2dfZGlyID0gdW5jb21wcmVzc19jb250ZW50cygKLSAgICAgICAgICAgIHRlbXBfZGlyLCBhcmNoaXZlX2ZpbGUsIGFyZ3MuYXBhY2hlX2FudF91cmwuZGlyZWN0b3J5X25hbWUsICcvdXNyL2xvY2FsL2FudCcpCi0gICAgICAgIGV0Y19wYXRoc19kX2RpciA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnZXRjJywgJ3BhdGhzLmQnKQotICAgICAgICB3cml0ZV9wYXRoc19kX2VudHJ5KGV0Y19wYXRoc19kX2RpciwgJ29yZy5hcGFjaGUuYW50JykKLSAgICAgICAgcGtnX2lkZW50aWZpZXIgPSAnb3JnLmFwYWNoZS5hbnQnCi0gICAgICAgIG91dHB1dF9wa2dfcGF0aCA9IG9zLnBhdGguam9pbigKLSAgICAgICAgICAgIGFyZ3Mub3V0cHV0X2RpciwgYXJncy5hcGFjaGVfYW50X3VybC5kaXJlY3RvcnlfbmFtZSArICcucGtnJykKLSAgICAgICAgbWFrZV9wa2cocGtnX2RpciwgcGtnX2lkZW50aWZpZXIsIGFyZ3MuYXBhY2hlX2FudF91cmwudmVyc2lvbiwgb3V0cHV0X3BrZ19wYXRoKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9pdnkueG1sIGIvcmVsZWFzZS9pdnkueG1sCmluZGV4IGRiMDAwZWYuLjk2MzRmMDUgMTAwNjQ0Ci0tLSBhL3JlbGVhc2UvaXZ5LnhtbAorKysgYi9yZWxlYXNlL2l2eS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iaHR0cDovL2FudC5hcGFjaGUub3JnL2l2eS9zY2hlbWFzL2l2eS54c2QiPgogICA8aW5mbyBvcmdhbmlzYXRpb249Im9yZy9hcGFjaGUiCi0gICAgICAgIG1vZHVsZT0iYW50IiByZXZpc2lvbj0iMS45LjE1Ii8+CisgICAgICAgIG1vZHVsZT0iYW50IiByZXZpc2lvbj0iMS4xMC44Ii8+CiAgIDxwdWJsaWNhdGlvbnMgeG1sbnM6ZT0idXJuOmFudC5hcGFjaGUub3JnOml2eS1leHRyYXMiPgogICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtcGFyZW50IiB0eXBlPSJwb20iIGV4dD0icG9tIi8+CiAgICAgPGFydGlmYWN0IG5hbWU9ImFudC1wYXJlbnQiIHR5cGU9InBvbS5hc2MiIGV4dD0icG9tLmFzYyIvPgpAQCAtOTEsNiArOTEsMTIgQEAKICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWNvbW1vbnMtbmV0IiB0eXBlPSJqYXIuYXNjIiBleHQ9Imphci5hc2MiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWNvbW1vbnMtbmV0IiB0eXBlPSJzb3VyY2UiIGV4dD0iamFyIiBlOmNsYXNzaWZpZXI9InNvdXJjZXMiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWNvbW1vbnMtbmV0IiB0eXBlPSJzb3VyY2UuYXNjIiBleHQ9Imphci5hc2MiIGU6Y2xhc3NpZmllcj0ic291cmNlcyIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtaW1hZ2VpbyIgdHlwZT0icG9tIiBleHQ9InBvbSIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtaW1hZ2VpbyIgdHlwZT0icG9tLmFzYyIgZXh0PSJwb20uYXNjIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC1pbWFnZWlvIiB0eXBlPSJqYXIiIGV4dD0iamFyIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC1pbWFnZWlvIiB0eXBlPSJqYXIuYXNjIiBleHQ9Imphci5hc2MiLz4KKyAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWltYWdlaW8iIHR5cGU9InNvdXJjZSIgZXh0PSJqYXIiIGU6Y2xhc3NpZmllcj0ic291cmNlcyIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtaW1hZ2VpbyIgdHlwZT0ic291cmNlLmFzYyIgZXh0PSJqYXIuYXNjIiBlOmNsYXNzaWZpZXI9InNvdXJjZXMiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWphaSIgdHlwZT0icG9tIiBleHQ9InBvbSIvPgogICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtamFpIiB0eXBlPSJwb20uYXNjIiBleHQ9InBvbS5hc2MiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWphaSIgdHlwZT0iamFyIiBleHQ9ImphciIvPgpAQCAtMTMzLDYgKzEzOSwxMiBAQAogICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtanVuaXQ0IiB0eXBlPSJqYXIuYXNjIiBleHQ9Imphci5hc2MiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWp1bml0NCIgdHlwZT0ic291cmNlIiBleHQ9ImphciIgZTpjbGFzc2lmaWVyPSJzb3VyY2VzIi8+CiAgICAgPGFydGlmYWN0IG5hbWU9ImFudC1qdW5pdDQiIHR5cGU9InNvdXJjZS5hc2MiIGV4dD0iamFyLmFzYyIgZTpjbGFzc2lmaWVyPSJzb3VyY2VzIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC1qdW5pdGxhdW5jaGVyIiB0eXBlPSJwb20iIGV4dD0icG9tIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC1qdW5pdGxhdW5jaGVyIiB0eXBlPSJwb20uYXNjIiBleHQ9InBvbS5hc2MiLz4KKyAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWp1bml0bGF1bmNoZXIiIHR5cGU9ImphciIgZXh0PSJqYXIiLz4KKyAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWp1bml0bGF1bmNoZXIiIHR5cGU9Imphci5hc2MiIGV4dD0iamFyLmFzYyIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtanVuaXRsYXVuY2hlciIgdHlwZT0ic291cmNlIiBleHQ9ImphciIgZTpjbGFzc2lmaWVyPSJzb3VyY2VzIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC1qdW5pdGxhdW5jaGVyIiB0eXBlPSJzb3VyY2UuYXNjIiBleHQ9Imphci5hc2MiIGU6Y2xhc3NpZmllcj0ic291cmNlcyIvPgogICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQtbGF1bmNoZXIiIHR5cGU9InBvbSIgZXh0PSJwb20iLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWxhdW5jaGVyIiB0eXBlPSJwb20uYXNjIiBleHQ9InBvbS5hc2MiLz4KICAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LWxhdW5jaGVyIiB0eXBlPSJqYXIiIGV4dD0iamFyIi8+CkBAIC0xNTcsNiArMTY5LDEyIEBACiAgICAgPGFydGlmYWN0IG5hbWU9ImFudC10ZXN0dXRpbCIgdHlwZT0iamFyLmFzYyIgZXh0PSJqYXIuYXNjIi8+CiAgICAgPGFydGlmYWN0IG5hbWU9ImFudC10ZXN0dXRpbCIgdHlwZT0ic291cmNlIiBleHQ9ImphciIgZTpjbGFzc2lmaWVyPSJzb3VyY2VzIi8+CiAgICAgPGFydGlmYWN0IG5hbWU9ImFudC10ZXN0dXRpbCIgdHlwZT0ic291cmNlLmFzYyIgZXh0PSJqYXIuYXNjIiBlOmNsYXNzaWZpZXI9InNvdXJjZXMiLz4KKyAgICA8YXJ0aWZhY3QgbmFtZT0iYW50LXh6IiB0eXBlPSJwb20iIGV4dD0icG9tIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC14eiIgdHlwZT0icG9tLmFzYyIgZXh0PSJwb20uYXNjIi8+CisgICAgPGFydGlmYWN0IG5hbWU9ImFudC14eiIgdHlwZT0iamFyIiBleHQ9ImphciIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQteHoiIHR5cGU9Imphci5hc2MiIGV4dD0iamFyLmFzYyIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQteHoiIHR5cGU9InNvdXJjZSIgZXh0PSJqYXIiIGU6Y2xhc3NpZmllcj0ic291cmNlcyIvPgorICAgIDxhcnRpZmFjdCBuYW1lPSJhbnQteHoiIHR5cGU9InNvdXJjZS5hc2MiIGV4dD0iamFyLmFzYyIgZTpjbGFzc2lmaWVyPSJzb3VyY2VzIi8+CiAgIDwvcHVibGljYXRpb25zPgotICA8ZGVwZW5kZW5jaWVzLz4gCisgIDxkZXBlbmRlbmNpZXMvPgogPC9pdnktbW9kdWxlPgpkaWZmIC0tZ2l0IGEvcmVsZWFzZS9pdnlzZXR0aW5ncy54bWwgYi9yZWxlYXNlL2l2eXNldHRpbmdzLnhtbAppbmRleCBkNDBjNDYxLi4yNDUyMGM3IDEwMDY0NAotLS0gYS9yZWxlYXNlL2l2eXNldHRpbmdzLnhtbAorKysgYi9yZWxlYXNlL2l2eXNldHRpbmdzLnhtbApAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvcmVsZWFzZS9zaWduaXQueG1sIGIvcmVsZWFzZS9zaWduaXQueG1sCmluZGV4IDhhYzIwY2YuLjVmYzIyNGYgMTAwNjQ0Ci0tLSBhL3JlbGVhc2Uvc2lnbml0LnhtbAorKysgYi9yZWxlYXNlL3NpZ25pdC54bWwKQEAgLTgsNyArOCw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3JlbGVhc2UvdXBsb2FkLnhtbCBiL3JlbGVhc2UvdXBsb2FkLnhtbAppbmRleCA1NjMxY2ZkLi5jZDA1OGRjIDEwMDY0NAotLS0gYS9yZWxlYXNlL3VwbG9hZC54bWwKKysrIGIvcmVsZWFzZS91cGxvYWQueG1sCkBAIC02LDcgKzYsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zbmFwL3NuYXBjcmFmdC55YW1sIGIvc25hcC9zbmFwY3JhZnQueWFtbAppbmRleCBkZDU3MmIwLi5iZThhNTcyIDEwMDY0NAotLS0gYS9zbmFwL3NuYXBjcmFmdC55YW1sCisrKyBiL3NuYXAvc25hcGNyYWZ0LnlhbWwKQEAgLTE0LDcgKzE0LDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIG5hbWU6IGFudAotdmVyc2lvbjogIjEuOS4xNWFscGhhIgordmVyc2lvbjogIjEuMTAuOGFscGhhIgogc3VtbWFyeTogQXBhY2hlIEFudAogZGVzY3JpcHRpb246IHwKICAgQXBhY2hlIEFudOKEoiBpcyBhIEphdmEgbGlicmFyeSBhbmQgY29tbWFuZC1saW5lIHRvb2wgd2hvc2UgbWlzc2lvbiBpcwpAQCAtMjcsNyArMjcsNyBAQAogICBwaWxvdCBhbnkgdHlwZSBvZiBwcm9jZXNzIHdoaWNoIGNhbiBiZSBkZXNjcmliZWQgaW4gdGVybXMgb2YgdGFyZ2V0cwogICBhbmQgdGFza3MuCiAKLSAgQW50IGlzIHdyaXR0ZW4gaW4gSmF2YSBhbmQgdGh1cyByZXF1aXJlcyBKYXZhIDUgb3IgYSBsYXRlciBydW50aW1lCisgIEFudCBpcyB3cml0dGVuIGluIEphdmEgYW5kIHRodXMgcmVxdWlyZXMgSmF2YSA4IG9yIGEgbGF0ZXIgcnVudGltZQogICBlbnZpcm9ubWVudCB0byBiZSBpbnN0YWxsZWQuIElmIHlvdSB3YW50IHRvIGJ1aWxkIGEgSmF2YSBwcm9qZWN0IHlvdQogICB3aWxsIG5lZWQgYSBKYXZhIERldmVsb3BtZW50IEtpdCByYXRoZXIgdGhhbiBqdXN0IGEgSmF2YSBSdW50aW1lCiAgIEVudmlyb25tZW50LgpkaWZmIC0tZ2l0IGEvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzIGIvc29uYXItcHJvamVjdC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTgxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zb25hci1wcm9qZWN0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMCBAQAorc29uYXIucHJvamVjdEtleT1hbnQtbWFzdGVyCitzb25hci5vcmdhbml6YXRpb249YXBhY2hlCitzb25hci5wcm9qZWN0TmFtZT1BcGFjaGUgQW50Citzb25hci5zb3VyY2VzPXNyYy9tYWluCitzb25hci50ZXN0cz1zcmMvdGVzdHMvanVuaXQKK3NvbmFyLnByb2plY3RWZXJzaW9uPTEuMTAuMC1TTkFQU0hPVAorc29uYXIuamF2YS5zb3VyY2U9OAorc29uYXIuamF2YS5iaW5hcmllcz1idWlsZC9jbGFzc2VzCitzb25hci5qYXZhLnRlc3QuYmluYXJpZXM9YnVpbGQvdGVzdGNhc2VzCitzb25hci5qYXZhLmxpYnJhcmllcz1saWIvb3B0aW9uYWwvKi5qYXIKZGlmZiAtLWdpdCBhL3NvbmFycXViZS54bWwgYi9zb25hcnF1YmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTcxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb25hcnF1YmUueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzxwcm9qZWN0IGRlZmF1bHQ9InNvbmFyIiBiYXNlZGlyPSIuIj4KKworICA8IS0tIGdldHMgb3ZlcnJpZGRlbiBieSB0aGUgamVua2lucyBqb2IgLS0+CisgIDxwcm9wZXJ0eSBuYW1lPSJzb25hci5ob3N0LnVybCIgdmFsdWU9Imh0dHA6Ly9sb2NhbGhvc3Q6OTAwMCIgLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvbmFyLmxvZ2luIiB2YWx1ZT0ieHh4IiAvPgorCisgIDwhLS0gc291cmNlIFNvbmFyUXViZSBwcm9qZWN0IHByb3BlcnRpZXMgLS0+CisgIDxwcm9wZXJ0eSBmaWxlPSJzb25hci1wcm9qZWN0LnByb3BlcnRpZXMiLz4KKworICA8cHJvcGVydHkgbmFtZT0iZG93bmxvYWRzIiBsb2NhdGlvbj0iYnVpbGQvZG93bmxvYWRzIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJzb25hcnF1YmUtYW50LXRhc2stamFyIiBsb2NhdGlvbj0iJHtkb3dubG9hZHN9L3NvbmFycXViZS1hbnQtdGFzay5qYXIiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNvbmFycXViZS1hbnQtdGFzay11cmwiCisgICAgICAgICAgICB2YWx1ZT0iaHR0cHM6Ly9iaW5hcmllcy5zb25hcnNvdXJjZS5jb20vRGlzdHJpYnV0aW9uL3NvbmFycXViZS1hbnQtdGFzay9zb25hcnF1YmUtYW50LXRhc2stMi42LjAuMTQyNi5qYXIiLz4KKworICA8dGFyZ2V0IG5hbWU9ImRvd25sb2FkIj4KKyAgICA8bWtkaXIgZGlyPSIke2Rvd25sb2Fkc30iLz4KKyAgICA8Z2V0IGRlc3Q9IiR7c29uYXJxdWJlLWFudC10YXNrLWphcn0iIHNyYz0iJHtzb25hcnF1YmUtYW50LXRhc2stdXJsfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLWNsYXNzZXMiPgorICAgIDxhbnQgYW50ZmlsZT0ibGF1bmNoLWJ1aWxkLnhtbCI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iYXJncyIgdmFsdWU9Ii1EamVua2lucz10Ii8+CisgICAgPC9hbnQ+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic29uYXIiIGRlcGVuZHM9ImJ1aWxkLWNsYXNzZXMsZG93bmxvYWQiPgorICAgIDx0YXNrZGVmIHVyaT0iYW50bGliOm9yZy5zb25hci5hbnQiIHJlc291cmNlPSJvcmcvc29uYXIvYW50L2FudGxpYi54bWwiPgorICAgICAgICA8Y2xhc3NwYXRoIHBhdGg9IiR7c29uYXJxdWJlLWFudC10YXNrLWphcn0iIC8+CisgICAgPC90YXNrZGVmPgorCisgICAgPHNvbmFyOnNvbmFyIHhtbG5zOnNvbmFyPSJhbnRsaWI6b3JnLnNvbmFyLmFudCIvPgorICA8L3RhcmdldD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvYW50LWJpbi53eHMgYi9zcmMvZXRjL2FudC1iaW4ud3hzCmluZGV4IDc0ZWQ3NGYuLjU4N2FhYmEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvYW50LWJpbi53eHMKKysrIGIvc3JjL2V0Yy9hbnQtYmluLnd4cwpAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDM2LDE2ICs0MzYsMTggQEAKICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTk0IiBOYW1lPSJKVU5JVC1fMy5YU0wiIExvbmdOYW1lPSJqdW5pdC1mcmFtZXMteGFsYW4xLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGp1bml0LWZyYW1lcy14YWxhbjEueHNsIiAvPgogICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTUiIE5hbWU9IkpVTklULV8xLlhTTCIgTG9uZ05hbWU9Imp1bml0LWZyYW1lcy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xqdW5pdC1mcmFtZXMueHNsIiAvPgogICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTYiIE5hbWU9IkpVTklULV8yLlhTTCIgTG9uZ05hbWU9Imp1bml0LW5vZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGp1bml0LW5vZnJhbWVzLnhzbCIgLz4KLSAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTk3IiBOYW1lPSJsb2cueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcbG9nLnhzbCIgLz4KLSAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNTk4IiBOYW1lPSJNQVVESVRfMS5YU0wiIExvbmdOYW1lPSJtYXVkaXQtZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXG1hdWRpdC1mcmFtZXMueHNsIiAvPgotICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTkiIE5hbWU9Ik1NRVRSSV8xLlhTTCIgTG9uZ05hbWU9Im1tZXRyaWNzLWZyYW1lcy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xtbWV0cmljcy1mcmFtZXMueHNsIiAvPgotICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MDAiIE5hbWU9InRhZ2RpZmYueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcdGFnZGlmZi54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU5NyIgTmFtZT0iSlVOSVQtXzQuWFNMIiBMb25nTmFtZT0ianVuaXQtZnJhbWVzLXNheG9uLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGp1bml0LWZyYW1lcy1zYXhvbi54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTU5OCIgTmFtZT0iSlVOSVQtXzUuWFNMIiBMb25nTmFtZT0ianVuaXQtbm9mcmFtZXMtc2F4b24ueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcanVuaXQtbm9mcmFtZXMtc2F4b24ueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU1OTkiIE5hbWU9ImxvZy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xsb2cueHNsIiAvPgorICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MDAiIE5hbWU9Ik1BVURJVF8xLlhTTCIgTG9uZ05hbWU9Im1hdWRpdC1mcmFtZXMueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcbWF1ZGl0LWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwMSIgTmFtZT0iTU1FVFJJXzEuWFNMIiBMb25nTmFtZT0ibW1ldHJpY3MtZnJhbWVzLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXG1tZXRyaWNzLWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwMiIgTmFtZT0idGFnZGlmZi54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1x0YWdkaWZmLnhzbCIgLz4KICAgICAgICAgPC9Db21wb25lbnQ+CiAgICAgICAgIDxEaXJlY3RvcnkgSWQ9ImRpcmVjdG9yeTk4IiBOYW1lPSJDSEVDS1NfMSIgTG9uZ05hbWU9ImNoZWNrc3R5bGUiPgogICAgICAgICAgIDxDb21wb25lbnQgSWQ9ImNvbXBvbmVudDk1IiBEaXNrSWQ9IjEiIEd1aWQ9IjJBRUI1OUM3LTVDRUYtNDAxYy05QUI5LTkxMUI5OTVGMDBGQyI+Ci0gICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjAxIiBOYW1lPSJDSEVDS1NfMS5YU0wiIExvbmdOYW1lPSJjaGVja3N0eWxlLWZyYW1lcy54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjaGVja3N0eWxlXGNoZWNrc3R5bGUtZnJhbWVzLnhzbCIgLz4KLSAgICAgICAgICAgIDxGaWxlIERpc2tJZD0iMSIgSWQ9ImZpbGU2MDIiIE5hbWU9IkNIRUNLU18zLlhTTCIgTG9uZ05hbWU9ImNoZWNrc3R5bGUtdGV4dC54c2wiIFZpdGFsPSJ5ZXMiIHNyYz0iJCh2YXIuZGlzdC5kaXIpL2V0Y1xjaGVja3N0eWxlXGNoZWNrc3R5bGUtdGV4dC54c2wiIC8+Ci0gICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjAzIiBOYW1lPSJDSEVDS1NfMi5YU0wiIExvbmdOYW1lPSJjaGVja3N0eWxlLXhkb2MueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcY2hlY2tzdHlsZVxjaGVja3N0eWxlLXhkb2MueHNsIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwMyIgTmFtZT0iQ0hFQ0tTXzEuWFNMIiBMb25nTmFtZT0iY2hlY2tzdHlsZS1mcmFtZXMueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcY2hlY2tzdHlsZVxjaGVja3N0eWxlLWZyYW1lcy54c2wiIC8+CisgICAgICAgICAgICA8RmlsZSBEaXNrSWQ9IjEiIElkPSJmaWxlNjA0IiBOYW1lPSJDSEVDS1NfMy5YU0wiIExvbmdOYW1lPSJjaGVja3N0eWxlLXRleHQueHNsIiBWaXRhbD0ieWVzIiBzcmM9IiQodmFyLmRpc3QuZGlyKS9ldGNcY2hlY2tzdHlsZVxjaGVja3N0eWxlLXRleHQueHNsIiAvPgorICAgICAgICAgICAgPEZpbGUgRGlza0lkPSIxIiBJZD0iZmlsZTYwNSIgTmFtZT0iQ0hFQ0tTXzIuWFNMIiBMb25nTmFtZT0iY2hlY2tzdHlsZS14ZG9jLnhzbCIgVml0YWw9InllcyIgc3JjPSIkKHZhci5kaXN0LmRpcikvZXRjXGNoZWNrc3R5bGVcY2hlY2tzdHlsZS14ZG9jLnhzbCIgLz4KICAgICAgICAgICA8L0NvbXBvbmVudD4KICAgICAgICAgPC9EaXJlY3Rvcnk+CiAgICAgICA8L0RpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvYW50LW1zaS53eHMgYi9zcmMvZXRjL2FudC1tc2kud3hzCmluZGV4IDM0YjU5ZWIuLjA0ZTlmZTkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvYW50LW1zaS53eHMKKysrIGIvc3JjL2V0Yy9hbnQtbXNpLnd4cwpAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9hbnQtdXBkYXRlLnhzbCBiL3NyYy9ldGMvYW50LXVwZGF0ZS54c2wKaW5kZXggYzgxYTM5Zi4uZWMzYTYxZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9hbnQtdXBkYXRlLnhzbAorKysgYi9zcmMvZXRjL2FudC11cGRhdGUueHNsCkBAIC05LDcgKzksNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL2NoYW5nZWxvZy54c2wgYi9zcmMvZXRjL2NoYW5nZWxvZy54c2wKaW5kZXggYzZhZWY4Zi4uNmE1OTA0ZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9jaGFuZ2Vsb2cueHNsCisrKyBiL3NyYy9ldGMvY2hhbmdlbG9nLnhzbApAQCAtMTIsNyArMTIsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC03Niw3ICs3Niw3IEBACiAgICAgICAgIDxoMT4KICAgICAgICAgICA8YSBuYW1lPSJ0b3AiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGl0bGUiLz48L2E+CiAgICAgICAgIDwvaDE+Ci0gICAgICAgIDxwIHN0eWxlPSJ0ZXh0LWFsaWduOiByaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+LjwvcD4KKyAgICAgICAgPHAgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iPkFwYWNoZSBBbnQ8L2E+LjwvcD4KICAgICAgICAgPGhyLz4KICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIxIj4KICAgICAgICAgICAKZGlmZiAtLWdpdCBhL3NyYy9ldGMvY2hlY2tzdHlsZS9SZXF1aXJlZEhlYWRlci50eHQgYi9zcmMvZXRjL2NoZWNrc3R5bGUvUmVxdWlyZWRIZWFkZXIudHh0CmluZGV4IDZhNWJiOWEuLjcwNzRiYWYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvY2hlY2tzdHlsZS9SZXF1aXJlZEhlYWRlci50eHQKKysrIGIvc3JjL2V0Yy9jaGVja3N0eWxlL1JlcXVpcmVkSGVhZGVyLnR4dApAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWNvbmZpZyBiL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWNvbmZpZwppbmRleCA1MDhhODgyLi5mMGI0NmM1IDEwMDY0NAotLS0gYS9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1jb25maWcKKysrIGIvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtY29uZmlnCkBAIC0xLDUgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4zLy9FTiIgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMy5kdGQiPgorPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKKyAgICAiLS8vQ2hlY2tzdHlsZS8vRFREIENoZWNrc3R5bGUgQ29uZmlndXJhdGlvbiAxLjMvL0VOIgorICAgICJodHRwczovL2NoZWNrc3R5bGUub3JnL2R0ZHMvY29uZmlndXJhdGlvbl8xXzMuZHRkIj4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC04LDcgKzEwLDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTggKzIwLDE1IEBACiAtLT4KIAogPG1vZHVsZSBuYW1lPSJDaGVja2VyIj4KLQogICA8IS0tIHJlcXVpcmVkIGxpY2VuY2UgZmlsZSAtLT4KICAgPG1vZHVsZSBuYW1lPSJIZWFkZXIiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NvbmZpZy5kaXJ9L1JlcXVpcmVkSGVhZGVyLnR4dCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUxpbmVzIiB2YWx1ZT0iMiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLnNyYy5kaXJ9L1JlcXVpcmVkSGVhZGVyLnR4dCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVMaW5lcyIgdmFsdWU9IjIiLz4KICAgPC9tb2R1bGU+Ci0gIAorCiAgIDwhLS0gc2l6ZSBsaW1pdHMgLS0+CiAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgotCiAgIDxtb2R1bGUgbmFtZT0iRmlsZVRhYkNoYXJhY3RlciIvPgotICAKIAogICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgogICAgIDwhLS0gSmF2YWRvYyByZXF1aXJlbWVudHMgLS0+CkBAIC05Myw3ICs5Miw3IEBACiAgICAgPG1vZHVsZSBuYW1lPSJSaWdodEN1cmx5Ii8+CiAKICAgICA8IS0tIENoZWNrcyBmb3IgY29tbW9uIGNvZGluZyBwcm9ibGVtcyAtLT4KLSAgICA8IS0tPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KKyAgICA8IS0tIDxtb2R1bGUgbmFtZT0iQXZvaWRJbmxpbmVDb25kaXRpb25hbHMiLz4gLS0+CiAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgogICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KQEAgLTEwMiwxMSArMTAxLDExIEBACiAgICAgPCEtLSA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCIvPiAtLT4KICAgICA8IS0tIDxtb2R1bGUgbmFtZT0iTWFnaWNOdW1iZXIiLz4gLS0+CiAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgIDwhLS0gQWxsb3cgcmVkdW5kYW50IHRocm93IGRlY2xhcmF0aW9ucyBmb3IgZG9jIHB1cnBvc2VzIAorICAgIDwhLS0gQWxsb3cgcmVkdW5kYW50IHRocm93IGRlY2xhcmF0aW9ucyBmb3IgZG9jIHB1cnBvc2VzCiAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRUaHJvd3MiPgogICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VW5jaGVja2VkIiB2YWx1ZT0idHJ1ZSIvPgogICAgIDwvbW9kdWxlPgotICAgICAgICAgLS0+CisgICAgLS0+CiAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+CiAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5SZXR1cm4iLz4KIApAQCAtMTI5LDcgKzEyOCw3IEBACiAgICAgPCEtLSBccyBtYXRjaGVzIHdoaXRlc3BhY2UgY2hhcmFjdGVyLCAkIG1hdGNoZXMgZW5kIG9mIGxpbmUuIC0tPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+CiAgIDwvbW9kdWxlPgotICAKKwogICA8IS0tIDxtb2R1bGUgbmFtZT0iYXUuY29tLnJlZGhpbGxjb25zdWx0aW5nLnNpbWlhbi5TaW1pYW5DaGVjayIvPiAtLT4KICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc2lvbkNvbW1lbnRGaWx0ZXIiPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJvZmZDb21tZW50Rm9ybWF0IiB2YWx1ZT0iQ2hlY2tTdHlsZVw6KFtcd1x8XSspICpPRkYiLz4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWZyYW1lcy1zb3J0YnktY2hlY2sueHNsIGIvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLXNvcnRieS1jaGVjay54c2wKaW5kZXggMDYwZjg3OC4uZTdhMTliMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLXNvcnRieS1jaGVjay54c2wKKysrIGIvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLXNvcnRieS1jaGVjay54c2wKQEAgLTEyLDcgKzEyLDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjQsOCArNjQsOCBAQAogICAgICAgICAgICAgPGJvZHkgb25sb2FkPSJqYXZhc2NyaXB0Om9wZW5GaXJzdCgpOyI+CiAgICAgICAgICAgICAgICAgPGgxPkNoZWNrU3R5bGUgQXVkaXQ8L2gxPgogICAgICAgICAgICAgICAgIDxwPkRlc2lnbmVkIGZvciB1c2Ugd2l0aAotICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cDovL2NoZWNrc3R5bGUuc291cmNlZm9yZ2UubmV0Lyc+Q2hlY2tTdHlsZTwvYT4gYW5kCi0gICAgICAgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vYW50LmFwYWNoZS5vcmcvJz5BbnQ8L2E+LgorICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9jaGVja3N0eWxlLm9yZy8nPkNoZWNrU3R5bGU8L2E+IGFuZAorICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8nPkFudDwvYT4uCiAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0ibmF2aWdhdGlvbiIvPgogICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iZGF0YSIvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLnhzbCBiL3NyYy9ldGMvY2hlY2tzdHlsZS9jaGVja3N0eWxlLWZyYW1lcy54c2wKaW5kZXggYzc5YzBiNy4uYzAzNTFlMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtZnJhbWVzLnhzbAorKysgYi9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1mcmFtZXMueHNsCkBAIC0xMiw3ICsxMiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc4LDggKzc4LDggQEAKICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGgKLSAgICAgICAgICAgICAgICAgIDxhIGhyZWY9J2h0dHA6Ly9jaGVja3N0eWxlLnNvdXJjZWZvcmdlLm5ldC8nPkNoZWNrU3R5bGU8L2E+IGFuZAotICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cDovL2FudC5hcGFjaGUub3JnLyc+QW50PC9hPi48L3RkPgorICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9jaGVja3N0eWxlLm9yZy8nPkNoZWNrU3R5bGU8L2E+IGFuZAorICAgICAgICAgICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8nPkFudDwvYT4uPC90ZD4KICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgIDwvdGFibGU+CiAgICAgICAgIDxociBzaXplPSIxIi8+CkBAIC0yOTYsNCArMjk2LDQgQEAKICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0icG9zaXRpb24oKSBtb2QgMiA9IDAiPmV2ZW5yb3c8L3hzbDppZj4KICAgICAgICAgPC94c2w6YXR0cmlidXRlPgogICAgIDwveHNsOnRlbXBsYXRlPgotPC94c2w6c3R5bGVzaGVldD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUtdGV4dC54c2wgYi9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbAppbmRleCA3MzU5ZTQxLi42NTk0M2EzIDEwMDY0NAotLS0gYS9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbAorKysgYi9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS10ZXh0LnhzbApAQCAtOSw3ICs5LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9jaGVja3N0eWxlL2NoZWNrc3R5bGUteGRvYy54c2wgYi9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS14ZG9jLnhzbAppbmRleCA1ZmM2ZWFiLi41ZjdiMzY3IDEwMDY0NAotLS0gYS9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS14ZG9jLnhzbAorKysgYi9zcmMvZXRjL2NoZWNrc3R5bGUvY2hlY2tzdHlsZS14ZG9jLnhzbApAQCAtMTIsNyArMTIsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL2NvbW1vbjJtYXN0ZXIueHNsIGIvc3JjL2V0Yy9jb21tb24ybWFzdGVyLnhzbAppbmRleCBkYTE1MjdlLi4yNDY2ZDJlIDEwMDY0NAotLS0gYS9zcmMvZXRjL2NvbW1vbjJtYXN0ZXIueHNsCisrKyBiL3NyYy9ldGMvY29tbW9uMm1hc3Rlci54c2wKQEAgLTE3LDcgKzE3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9jb3B5cmlnaHRjaGVjay5zaCBiL3NyYy9ldGMvY29weXJpZ2h0Y2hlY2suc2gKaW5kZXggNTFjNWU5OS4uOWNhYjJjOCAxMDA3NTUKLS0tIGEvc3JjL2V0Yy9jb3B5cmlnaHRjaGVjay5zaAorKysgYi9zcmMvZXRjL2NvcHlyaWdodGNoZWNrLnNoCkBAIC03LDcgKzcsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvY292ZXJhZ2UtZnJhbWVzLnhzbCBiL3NyYy9ldGMvY292ZXJhZ2UtZnJhbWVzLnhzbAppbmRleCA5NjAzNTk3Li5jMjM3OWRlIDEwMDY0NAotLS0gYS9zcmMvZXRjL2NvdmVyYWdlLWZyYW1lcy54c2wKKysrIGIvc3JjL2V0Yy9jb3ZlcmFnZS1mcmFtZXMueHNsCkBAIC0xMyw3ICsxMyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5MiwxNCArMzkyLDE0IEBACiAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgogICA8dHI+CiAgICAgPHRkIGNsYXNzPSJiYW5uZXJjZWxsIiByb3dzcGFuPSIyIj4KLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj4KLSAgICAgIDxpbWcgc3JjPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmIiBhbHQ9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciIGFsaWduPSJsZWZ0IiBib3JkZXI9IjAiLz4KKyAgICAgIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgIDxpbWcgc3JjPSJodHRwczovL2FudC5hcGFjaGUub3JnL2ltYWdlcy9ncm91cC1sb2dvLmdpZiIgYWx0PSJodHRwczovL2FudC5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CiAgICAgICA8L2E+CiAgICAgPC90ZD4KICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgQ292ZXJhZ2U8L2gyPjwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5zaXRyYWthLmNvbS9qcHJvYmUnPlNpdHJha2EgSlByb2JlPC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2pha2FydGEuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCBTaXRyYWthIEpQcm9iZSBhbmQgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgogICAgICAgICA8L3RyPgogICA8L3RhYmxlPgogICAgIDxociBzaXplPSIxIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL2pkZXBlbmQtZnJhbWVzLnhzbCBiL3NyYy9ldGMvamRlcGVuZC1mcmFtZXMueHNsCmluZGV4IDgwMjg3MzQuLmQzNTQ0NGIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvamRlcGVuZC1mcmFtZXMueHNsCisrKyBiL3NyYy9ldGMvamRlcGVuZC1mcmFtZXMueHNsCkBAIC0xMiw3ICsxMiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM2MCw3ICszNjAsNyBAQAogICBbZXhwbGFuYXRpb25zXQogICAgPC90ZD48L3RyPjwvdGFibGU+CiAKLSAgPHA+VGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbnMgYXJlIGZvciBxdWljayByZWZlcmVuY2UgYW5kIGFyZSBsaWZ0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgb3JpZ2luYWwgPGEgaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+SkRlcGVuZCBkb2N1bWVudGF0aW9uPC9hPi48L3A+CisgIDxwPlRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBmb3IgcXVpY2sgcmVmZXJlbmNlIGFuZCBhcmUgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jbGFya3dhcmUvamRlcGVuZCI+SkRlcGVuZCBkb2N1bWVudGF0aW9uPC9hPi48L3A+CiAKICAgPGgzPjxhIG5hbWU9IkVYbnVtYmVyIj5OdW1iZXIgb2YgQ2xhc3NlczwvYT48L2gzPgogICAgIDxwPlRoZSBudW1iZXIgb2YgY29uY3JldGUgYW5kIGFic3RyYWN0IGNsYXNzZXMgKGFuZCBpbnRlcmZhY2VzKSBpbiB0aGUgcGFja2FnZSBpcyBhbiBpbmRpY2F0b3Igb2YgdGhlIGV4dGVuc2liaWxpdHkgb2YgdGhlIHBhY2thZ2UuPC9wPgpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgIDx0cj4KICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL3d3dy5jbGFya3dhcmUuY29tL3NvZnR3YXJlL0pEZXBlbmQuaHRtbCI+SkRlcGVuZDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciPkFudDwvYT4uPC90ZD4KKyAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQiPkpEZXBlbmQ8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnIj5BbnQ8L2E+LjwvdGQ+CiAgIDwvdHI+CiAgIDwvdGFibGU+CiAgIDxociBzaXplPSIxIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL2pkZXBlbmQueHNsIGIvc3JjL2V0Yy9qZGVwZW5kLnhzbAppbmRleCBiM2EzNzc4Li42OGFhYTJmIDEwMDY0NAotLS0gYS9zcmMvZXRjL2pkZXBlbmQueHNsCisrKyBiL3NyYy9ldGMvamRlcGVuZC54c2wKQEAgLTksNyArOSw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg5LDcgKzg5LDcgQEAKICAgICA8L3VsLS0+CiAgICAgCiAgICAgPGgxPjxhIG5hbWU9InRvcCI+SkRlcGVuZCBBbmFseXNpczwvYT48L2gxPgotICAgIDxwIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQ8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnIj5BbnQ8L2E+LjwvcD4KKyAgICA8cCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQiPkpEZXBlbmQ8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnIj5BbnQ8L2E+LjwvcD4KICAgICA8aHIgc2l6ZT0iMiIgLz4KICAgICAKICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPjx0cj48dGQ+CkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICBbPGEgaHJlZj0iI05WZXhwbGFuYXRpb25zIj5leHBsYW5hdGlvbnM8L2E+XQogICAgIDwvdGQ+PC90cj48L3RhYmxlPgogICAgIAotICAgIDxwPlRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBmb3IgcXVpY2sgcmVmZXJlbmNlIGFuZCBhcmUgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIDxhIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPkpEZXBlbmQgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgorICAgIDxwPlRoZSBmb2xsb3dpbmcgZXhwbGFuYXRpb25zIGFyZSBmb3IgcXVpY2sgcmVmZXJlbmNlIGFuZCBhcmUgbGlmdGVkIGRpcmVjdGx5IGZyb20gdGhlIG9yaWdpbmFsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jbGFya3dhcmUvamRlcGVuZCI+SkRlcGVuZCBkb2N1bWVudGF0aW9uPC9hPi48L3A+CiAgICAgCiAgICAgPGgzPjxhIG5hbWU9IkVYbnVtYmVyIj5OdW1iZXIgb2YgQ2xhc3NlczwvYT48L2gzPgogICAgICAgICA8cD5UaGUgbnVtYmVyIG9mIGNvbmNyZXRlIGFuZCBhYnN0cmFjdCBjbGFzc2VzIChhbmQgaW50ZXJmYWNlcykgaW4gdGhlIHBhY2thZ2UgaXMgYW4gaW5kaWNhdG9yIG9mIHRoZSBleHRlbnNpYmlsaXR5IG9mIHRoZSBwYWNrYWdlLjwvcD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvanVuaXQtZnJhbWVzLXNheG9uLnhzbCBiL3NyYy9ldGMvanVuaXQtZnJhbWVzLXNheG9uLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwODRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy9qdW5pdC1mcmFtZXMtc2F4b24ueHNsCkBAIC0wLDAgKzEsMTAyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4cyIKKyAgICB2ZXJzaW9uPSIyLjAiPgorICAgIDx4c2w6Y2hhcmFjdGVyLW1hcCBuYW1lPSJuby1jb250cm9sLWNoYXJhY3RlcnMiPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEyNzsiIHN0cmluZz0iJmFtcDsjMTI3OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEyODsiIHN0cmluZz0iJmFtcDsjMTI4OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEyOTsiIHN0cmluZz0iJmFtcDsjMTI5OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzMDsiIHN0cmluZz0iJmFtcDsjMTMwOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzMTsiIHN0cmluZz0iJmFtcDsjMTMxOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzMjsiIHN0cmluZz0iJmFtcDsjMTMyOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzMzsiIHN0cmluZz0iJmFtcDsjMTMzOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzNDsiIHN0cmluZz0iJmFtcDsjMTM0OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzNTsiIHN0cmluZz0iJmFtcDsjMTM1OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzNjsiIHN0cmluZz0iJmFtcDsjMTM2OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzNzsiIHN0cmluZz0iJmFtcDsjMTM3OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzODsiIHN0cmluZz0iJmFtcDsjMTM4OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzEzOTsiIHN0cmluZz0iJmFtcDsjMTM5OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0MDsiIHN0cmluZz0iJmFtcDsjMTQwOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0MTsiIHN0cmluZz0iJmFtcDsjMTQxOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0MjsiIHN0cmluZz0iJmFtcDsjMTQyOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0MzsiIHN0cmluZz0iJmFtcDsjMTQzOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0NDsiIHN0cmluZz0iJmFtcDsjMTQ0OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0NTsiIHN0cmluZz0iJmFtcDsjMTQ1OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0NjsiIHN0cmluZz0iJmFtcDsjMTQ2OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0NzsiIHN0cmluZz0iJmFtcDsjMTQ3OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0ODsiIHN0cmluZz0iJmFtcDsjMTQ4OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE0OTsiIHN0cmluZz0iJmFtcDsjMTQ5OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1MDsiIHN0cmluZz0iJmFtcDsjMTUwOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1MTsiIHN0cmluZz0iJmFtcDsjMTUxOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1MjsiIHN0cmluZz0iJmFtcDsjMTUyOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1MzsiIHN0cmluZz0iJmFtcDsjMTUzOyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1NDsiIHN0cmluZz0iJmFtcDsjMTU0OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1NTsiIHN0cmluZz0iJmFtcDsjMTU1OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1NjsiIHN0cmluZz0iJmFtcDsjMTU2OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1NzsiIHN0cmluZz0iJmFtcDsjMTU3OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1ODsiIHN0cmluZz0iJmFtcDsjMTU4OyIvPgorICAgICAgICA8eHNsOm91dHB1dC1jaGFyYWN0ZXIgY2hhcmFjdGVyPSImIzE1OTsiIHN0cmluZz0iJmFtcDsjMTU5OyIvPgorICAgIDwveHNsOmNoYXJhY3Rlci1tYXA+CisgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVURi04IiB1c2UtY2hhcmFjdGVyLW1hcHM9Im5vLWNvbnRyb2wtY2hhcmFjdGVycyIvPgorICAgIDx4c2w6ZGVjaW1hbC1mb3JtYXQgZGVjaW1hbC1zZXBhcmF0b3I9Ii4iIGdyb3VwaW5nLXNlcGFyYXRvcj0iLCIvPgorICAgIDwhLS0KKyAgICAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgICAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworICAgIDwhLS0KKworICAgICBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworICAgICBJdCBjcmVhdGVzIGEgc2V0IG9mIEhUTUwgZmlsZXMgYSBsYSBqYXZhZG9jIHdoZXJlIHlvdSBjYW4gYnJvd3NlIGVhc2lseQorICAgICB0aHJvdWdoIGFsbCBwYWNrYWdlcyBhbmQgY2xhc3Nlcy4KKworICAgIC0tPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ib3V0cHV0LmRpciIgc2VsZWN0PSInLiciLz4KKyAgICA8eHNsOnBhcmFtIG5hbWU9IlRJVExFIj5Vbml0IFRlc3QgUmVzdWx0cy48L3hzbDpwYXJhbT4KKworCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyI+CisgICAgICAgIDwhLS0gY3JlYXRlIHRoZSBpbmRleC5odG1sIC0tPgorICAgICAgICA8eHNsOnJlc3VsdC1kb2N1bWVudCBocmVmPSJmaWxlOi8vL3skb3V0cHV0LmRpcn0vaW5kZXguaHRtbCI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaW5kZXguaHRtbCIvPgorICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIHN0eWxlc2hlZXQuY3NzIC0tPgorICAgICAgICA8eHNsOnJlc3VsdC1kb2N1bWVudCBocmVmPSJmaWxlOi8vL3skb3V0cHV0LmRpcn0vc3R5bGVzaGVldC5jc3MiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN0eWxlc2hlZXQuY3NzIi8+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgb3ZlcnZpZXctcGFja2FnZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L292ZXJ2aWV3LXN1bW1hcnkuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9Im92ZXJ2aWV3LnBhY2thZ2VzIi8+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXBhY2thZ2VzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS9vdmVydmlldy1mcmFtZS5odG1sIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnBhY2thZ2VzIi8+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLWNsYXNzZXMuaHRtbCBhdCB0aGUgcm9vdCAtLT4KKyAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L2FsbGNsYXNzZXMtZnJhbWUuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC5jbGFzc2VzIi8+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsLXRlc3RzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS9hbGwtdGVzdHMuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyIvPgorICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgdGhlIGFsbHRlc3RzLWZhaWxzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS9hbGx0ZXN0cy1mYWlscy5odG1sIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInZmFpbHMnIi8+CisgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSB0aGUgYWxsdGVzdHMtZXJyb3JzLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS9hbGx0ZXN0cy1lcnJvcnMuaHRtbCI+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9ImFsbC50ZXN0cyI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InR5cGUiIHNlbGVjdD0iJ2Vycm9ycyciLz4KKyAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgPC94c2w6cmVzdWx0LWRvY3VtZW50PgorCisgICAgICAgIDwhLS0gY3JlYXRlIHRoZSBhbGx0ZXN0cy1za2lwcGVkLmh0bWwgYXQgdGhlIHJvb3QgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS9hbGx0ZXN0cy1za2lwcGVkLmh0bWwiPgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJhbGwudGVzdHMiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9Iidza2lwcGVkJyIvPgorICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisKKyAgICAgICAgPCEtLSBwcm9jZXNzIGFsbCBwYWNrYWdlcyAtLT4KKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZSI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UuZGlyIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRuYW1lID0gJycpIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRuYW1lLCcuJywnLycpIi8+PC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IiRuYW1lID0gJyciPi48L3hzbDppZj4KKyAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgIDwhLS1Qcm9jZXNzaW5nIHBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+IGluIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkb3V0cHV0LmRpciIvPiAtLT4KKyAgICAgICAgPCEtLSBjcmVhdGUgYSBjbGFzc2VzLWxpc3QuaHRtbCBpbiB0aGUgcGFja2FnZSBkaXJlY3RvcnkgLS0+CisgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS9wYWNrYWdlLWZyYW1lLmh0bWwiPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzZXMubGlzdCI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hbWUiIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKworICAgICAgICA8IS0tIGNyZWF0ZSBhIHBhY2thZ2Utc3VtbWFyeS5odG1sIGluIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSAtLT4KKyAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3BhY2thZ2Utc3VtbWFyeS5odG1sIj4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlLnN1bW1hcnkiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisKKyAgICAgICAgPCEtLSBmb3IgZWFjaCBjbGFzcywgY3JlYXRlcyBhIEBuYW1lLmh0bWwgLS0+CisgICAgICAgIDwhLS0gQGJ1ZyB0aGVyZSB3aWxsIGJlIGEgcHJvYmxlbSB3aXRoIGlubmVyIGNsYXNzZXMgaGF2aW5nIHRoZSBzYW1lIG5hbWUsIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gLS0+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgICAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0uaHRtbCI+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIi8+CisgICAgICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9InN0cmluZy1sZW5ndGgoLi9zeXN0ZW0tb3V0KSE9MCI+CisgICAgICAgICAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tb3V0Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5TdGFuZGFyZCBPdXRwdXQgZnJvbSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi9zeXN0ZW0tb3V0Ii8+PC9wcmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbD4KKyAgICAgICAgICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgICAgICAgICAgICA8eHNsOnJlc3VsdC1kb2N1bWVudCBocmVmPSJmaWxlOi8vL3skb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1lcnIuaHRtbCI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sPgorICAgICAgICAgICAgICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlN0YW5kYXJkIEVycm9yIGZyb20gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcmU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4vc3lzdGVtLWVyciIvPjwvcHJlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw+CisgICAgICAgICAgICAgICAgPC94c2w6cmVzdWx0LWRvY3VtZW50PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBmYWlsdXJlcyAhPSAwIj4KKyAgICAgICAgICAgICAgICA8eHNsOnJlc3VsdC1kb2N1bWVudCBocmVmPSJmaWxlOi8vL3skb3V0cHV0LmRpcn0veyRwYWNrYWdlLmRpcn0ve0BpZH1fe0BuYW1lfS1mYWlscy5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidmYWlscyciLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwveHNsOnJlc3VsdC1kb2N1bWVudD4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAZXJyb3JzICE9IDAiPgorICAgICAgICAgICAgICAgIDx4c2w6cmVzdWx0LWRvY3VtZW50IGhyZWY9ImZpbGU6Ly8veyRvdXRwdXQuZGlyfS97JHBhY2thZ2UuZGlyfS97QGlkfV97QG5hbWV9LWVycm9ycy5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidlcnJvcnMnIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3hzbDpyZXN1bHQtZG9jdW1lbnQ+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iQHNraXBwZWQgIT0gMCI+CisgICAgICAgICAgICAgICAgPHhzbDpyZXN1bHQtZG9jdW1lbnQgaHJlZj0iZmlsZTovLy97JG91dHB1dC5kaXJ9L3skcGFja2FnZS5kaXJ9L3tAaWR9X3tAbmFtZX0tc2tpcHBlZC5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiBtb2RlPSJjbGFzcy5kZXRhaWxzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9Iidza2lwcGVkJyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgPC94c2w6cmVzdWx0LWRvY3VtZW50PgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJpbmRleC5odG1sIj4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRUSVRMRSIvPjwvdGl0bGU+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8ZnJhbWVzZXQgY29scz0iMjAlLDgwJSI+CisgICAgICAgICAgICAgICAgPGZyYW1lc2V0IHJvd3M9IjMwJSw3MCUiPgorICAgICAgICAgICAgICAgICAgICA8ZnJhbWUgc3JjPSJvdmVydmlldy1mcmFtZS5odG1sIiBuYW1lPSJwYWNrYWdlTGlzdEZyYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9ImFsbGNsYXNzZXMtZnJhbWUuaHRtbCIgbmFtZT0iY2xhc3NMaXN0RnJhbWUiLz4KKyAgICAgICAgICAgICAgICA8L2ZyYW1lc2V0PgorICAgICAgICAgICAgICAgIDxmcmFtZSBzcmM9Im92ZXJ2aWV3LXN1bW1hcnkuaHRtbCIgbmFtZT0iY2xhc3NGcmFtZSIvPgorICAgICAgICAgICAgICAgIDxub2ZyYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgPGgyPkZyYW1lIEFsZXJ0PC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRvY3VtZW50IGlzIGRlc2lnbmVkIHRvIGJlIHZpZXdlZCB1c2luZyB0aGUgZnJhbWVzIGZlYXR1cmUuIElmIHlvdSBzZWUgdGhpcyBtZXNzYWdlLCB5b3UgYXJlIHVzaW5nIGEgbm9uLWZyYW1lLWNhcGFibGUgd2ViIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDwvbm9mcmFtZXM+CisgICAgICAgICAgICA8L2ZyYW1lc2V0PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIHRoaXMgaXMgdGhlIHN0eWxlc2hlZXQgY3NzIHRvIHVzZSBmb3IgbmVhcmx5IGV2ZXJ5dGhpbmcgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJzdHlsZXNoZWV0LmNzcyI+CisgICAgICAgIGJvZHkgeworICAgICAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgICAgIH0KKyAgICAgICAgdGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsKKyAgICAgICAgZm9udC1zaXplOiA2OCU7CisgICAgICAgIH0KKyAgICAgICAgdGFibGUuZGV0YWlscyB0ciB0aHsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgYmFja2dyb3VuZDojYTZjYWYwOworICAgICAgICB9CisgICAgICAgIHRhYmxlLmRldGFpbHMgdHIgdGR7CisgICAgICAgIGJhY2tncm91bmQ6I2VlZWVlMDsKKyAgICAgICAgfQorCisgICAgICAgIHAgeworICAgICAgICBsaW5lLWhlaWdodDoxLjVlbTsKKyAgICAgICAgbWFyZ2luLXRvcDowLjVlbTsgbWFyZ2luLWJvdHRvbToxLjBlbTsKKyAgICAgICAgfQorICAgICAgICBoMSB7CisgICAgICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgICAgfQorICAgICAgICBoMiB7CisgICAgICAgIG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTI1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgICB9CisgICAgICAgIGgzIHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgICB9CisgICAgICAgIGg0IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgICB9CisgICAgICAgIGg1IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgICB9CisgICAgICAgIGg2IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgICB9CisgICAgICAgIC5FcnJvciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICAgICAgfQorICAgICAgICAuRmFpbHVyZSB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnB1cnBsZTsKKyAgICAgICAgfQorICAgICAgICAuUHJvcGVydGllcyB7CisgICAgICAgIHRleHQtYWxpZ246cmlnaHQ7CisgICAgICAgIH0KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gQ3JlYXRlIGxpc3Qgb2YgYWxsL2ZhaWxlZC9lcnJvcmVkL3NraXBwZWQgdGVzdHMgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLnRlc3RzIj4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ0eXBlIiBzZWxlY3Q9IidhbGwnIi8+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aXRsZSI+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PkFsbCBGYWlsdXJlczwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5BbGwgRXJyb3JzPC94c2w6dGV4dD4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ3NraXBwZWQnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dGV4dD5BbGwgU2tpcHBlZDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp0ZXh0PkFsbCBUZXN0czwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDp2YXJpYWJsZT4KKyAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0aXRsZSIvPjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9Im9ubG9hZCI+b3BlbignYWxsY2xhc3Nlcy1mcmFtZS5odG1sJywnY2xhc3NMaXN0RnJhbWUnKTwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgICAgIDxoMj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHRpdGxlIi8+PC9oMj4KKworICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQorICAgICAgICAgICAgICAgICAgICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9Ii4vZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0Y2FzZVtmYWlsdXJlXSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzaG93LmNsYXNzIiBzZWxlY3Q9Iid5ZXMnIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdlcnJvcnMnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RzdWl0ZVtlcnJvcl0iIG1vZGU9ImFsbHRlc3RzLmVycm9yLnJvdyIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi8vdGVzdGNhc2VbZXJyb3JdIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ3NraXBwZWQnIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlW3NraXBwZWRdIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLy90ZXN0c3VpdGVbZXJyb3JdIiBtb2RlPSJhbGx0ZXN0cy5lcnJvci5yb3ciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJ3llcyciLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDphcHBseS10ZW1wbGF0ZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICBUaGlzIHBhZ2UgaXMgY3JlYXRlZCBmb3IgZXZlcnkgdGVzdHN1aXRlIGNsYXNzLgorICAgICAgICBJdCBwcmludHMgYSBzdW1tYXJ5IG9mIHRoZSB0ZXN0c3VpdGUgYW5kIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0CisgICAgICAgIHRlc3RjYXNlIG1ldGhvZHMuCisgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iY2xhc3MuZGV0YWlscyI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0idHlwZSIgc2VsZWN0PSInYWxsJyIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNsYXNzLm5hbWUiPjx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWUgPSAnJykiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkcGFja2FnZS5uYW1lIi8+LjwveHNsOmlmPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwveHNsOnZhcmlhYmxlPgorICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Vbml0IFRlc3QgUmVzdWx0czogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjbGFzcy5uYW1lIi8+PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iJHBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KKyAgICAgICAgICAgICAgICAgICAgdmFyIFRlc3RDYXNlcyA9IG5ldyBBcnJheSgpOworICAgICAgICAgICAgICAgICAgICB2YXIgY3VyOworICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9InByb3BlcnRpZXMiLz4KKyAgICAgICAgICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPjwhW0NEQVRBWworICAgICAgICBmdW5jdGlvbiBkaXNwbGF5UHJvcGVydGllcyAobmFtZSkgeworICAgICAgICAgIHZhciB3aW4gPSB3aW5kb3cub3BlbignJywnSlVuaXRTeXN0ZW1Qcm9wZXJ0aWVzJywnc2Nyb2xsYmFycz0xLHJlc2l6YWJsZT0xJyk7CisgICAgICAgICAgdmFyIGRvYyA9IHdpbi5kb2N1bWVudDsKKyAgICAgICAgICBkb2Mub3BlbigpOworICAgICAgICAgIGRvYy53cml0ZSgiPGh0bWw+PGhlYWQ+PHRpdGxlPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC90aXRsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImJvZHkge2ZvbnQ6bm9ybWFsIDY4JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYTsgY29sb3I6IzAwMDAwMDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUgdHIgdGQsIHRhYmxlIHRyIHRoIHsgZm9udC1zaXplOiA2OCU7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlLnByb3BlcnRpZXMgeyBib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7IGJvcmRlci1sZWZ0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLXRvcDpzb2xpZCAxICNjY2NjY2M7IHBhZGRpbmc6NXB4OyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRoIHsgdGV4dC1hbGlnbjpsZWZ0OyBib3JkZXItcmlnaHQ6c29saWQgMSAjY2NjY2NjOyBib3JkZXItYm90dG9tOnNvbGlkIDEgI2NjY2NjYzsgYmFja2dyb3VuZC1jb2xvcjojZWVlZWVlOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHRkIHsgZm9udDpub3JtYWw7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZmY7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoImgzIHsgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTE1JSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYSB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8L3N0eWxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9oZWFkPjxib2R5PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPGgzPlByb3BlcnRpZXMgb2YgIiArIG5hbWUgKyAiPC9oMz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxkaXYgYWxpZ249XCJyaWdodFwiPjxhIGhyZWY9XCJqYXZhc2NyaXB0OndpbmRvdy5jbG9zZSgpO1wiPkNsb3NlPC9hPjwvZGl2PiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHRhYmxlIGNsYXNzPSdwcm9wZXJ0aWVzJz4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+TmFtZTwvdGg+PHRoPlZhbHVlPC90aD48L3RyPiIpOworICAgICAgICAgIGZvciAocHJvcCBpbiBUZXN0Q2FzZXNbbmFtZV0pIHsKKyAgICAgICAgICAgIGRvYy53cml0ZSgiPHRyPjx0aD4iICsgcHJvcCArICI8L3RoPjx0ZD4iICsgVGVzdENhc2VzW25hbWVdW3Byb3BdICsgIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZG9jLndyaXRlKCI8L3RhYmxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgICBkb2MuY2xvc2UoKTsKKyAgICAgICAgICB3aW4uZm9jdXMoKTsKKyAgICAgICAgfQorICAgICAgXV0+CisgICAgICAgICAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciIvPgorICAgICAgICAgICAgICAgIDxoMz5DbGFzcyA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGNsYXNzLm5hbWUiLz48L2gzPgorCisKKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIG1vZGU9InByaW50LnRlc3QiLz4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorCisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdmYWlscyciPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkZhaWx1cmVzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPkVycm9yczwvaDI+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkdHlwZSA9ICdza2lwcGVkJyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aDI+U2tpcHBlZDwvaDI+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGgyPlRlc3RzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0IGNhbiBldmVuIG5vdCBiZSBzdGFydGVkIGF0IGFsbCAoZmFpbHVyZSB0byBsb2FkIHRoZSBjbGFzcykKKyAgICAgICAgICAgICAgICAgICAgc28gcmVwb3J0IHRoZSBlcnJvciBkaXJlY3RseQorICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIuL2Vycm9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSI0Ij48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4vZXJyb3IiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2ZhaWxzJyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlW2ZhaWx1cmVdIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiR0eXBlID0gJ2Vycm9ycyciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZVtlcnJvcl0iIG1vZGU9InByaW50LnRlc3QiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJHR5cGUgPSAnc2tpcHBlZCciPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZVtza2lwcGVkXSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi90ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJQcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj5qYXZhc2NyaXB0OmRpc3BsYXlQcm9wZXJ0aWVzKCc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+Jyk7PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyAmIzE4NzsKKyAgICAgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1vdXQpIT0wIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LW91dC5odG1sPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQgJiMxODc7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ic3RyaW5nLWxlbmd0aCguL3N5c3RlbS1lcnIpIT0wIj4KKyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4uLzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAaWQiLz5fPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+LWVyci5odG1sPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIgJiMxODc7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tCisgICAgIFdyaXRlIHByb3BlcnRpZXMgaW50byBhIEphdmFTY3JpcHQgZGF0YSBzdHJ1Y3R1cmUuCisgICAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGlkZWEgYnkgRXJpayBIYXRjaGVyIChlaGF0Y2hlckBhcGFjaGUub3JnKQorICAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwcm9wZXJ0aWVzIj4KKyAgICAgICAgY3VyID0gVGVzdENhc2VzWyc8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLi4vQHBhY2thZ2UiLz4uPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+J10gPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KKyAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIFRoaXMgcGFnZSBpcyBjcmVhdGVkIGZvciBldmVyeSBwYWNrYWdlLgorICAgICAgICBJdCBwcmludHMgdGhlIG5hbWUgb2YgYWxsIGNsYXNzZXMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgcGFja2FnZS4KKyAgICAgICAgQHBhcmFtIG5hbWUgdGhlIHBhY2thZ2UgbmFtZSB0byBwcmludCBjbGFzc2VzLgorICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKyAgICA8IS0tIGxpc3Qgb2YgY2xhc3NlcyBpbiBhIHBhY2thZ2UgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzLmxpc3QiPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9Im5hbWUiLz4KKyAgICAgICAgPGh0bWw+CisgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VW5pdCBUZXN0IENsYXNzZXM6IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkbmFtZSIvPjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNyZWF0ZS5zdHlsZXNoZWV0LmxpbmsiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIiBzZWxlY3Q9IiRuYW1lIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvaGVhZD4KKyAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBub3dyYXA9Im5vd3JhcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPjxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSIkbmFtZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+PC9oMj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSAkbmFtZV0iPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgbm93cmFwPSJub3dyYXAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiIHRhcmdldD0iY2xhc3NGcmFtZSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDwhLS0KKyAgICAgICAgQ3JlYXRlcyBhbiBhbGwtY2xhc3Nlcy5odG1sIGZpbGUgdGhhdCBjb250YWlucyBhIGxpbmsgdG8gYWxsIHBhY2thZ2Utc3VtbWFyeS5odG1sCisgICAgICAgIG9uIGVhY2ggY2xhc3MuCisgICAgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdHN1aXRlcyIgbW9kZT0iYWxsLmNsYXNzZXMiPgorICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgIDx0aXRsZT5BbGwgVW5pdCBUZXN0IENsYXNzZXM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICA8aDI+Q2xhc3NlczwvaDI+CisgICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmFwcGx5LXRlbXBsYXRlcz4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImFsbC5jbGFzc2VzIj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJwYWNrYWdlLm5hbWUiIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJocmVmIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KCRwYWNrYWdlLm5hbWU9JycpIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idHJhbnNsYXRlKCRwYWNrYWdlLm5hbWUsJy4nLCcvJykiLz48eHNsOnRleHQ+LzwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDppZj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGlkIi8+Xzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjx4c2w6dGV4dD4uaHRtbDwveHNsOnRleHQ+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgICAgPCEtLQorICAgICAgICBDcmVhdGVzIGFuIGh0bWwgZmlsZSB0aGF0IGNvbnRhaW5zIGEgbGluayB0byBhbGwgcGFja2FnZS1zdW1tYXJ5Lmh0bWwgZmlsZXMgb24KKyAgICAgICAgZWFjaCBwYWNrYWdlIGV4aXN0aW5nIG9uIHRlc3RzdWl0ZXMuCisgICAgICAgIEBidWcgdGhlcmUgd2lsbCBiZSBhIHByb2JsZW0gaGVyZSwgSSBkb24ndCBrbm93IHlldCBob3cgdG8gaGFuZGxlIHVubmFtZWQgcGFja2FnZSA6KAorICAgIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZXMiIG1vZGU9ImFsbC5wYWNrYWdlcyI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPHRpdGxlPkFsbCBVbml0IFRlc3QgUGFja2FnZXM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICA8aDI+PGEgaHJlZj0ib3ZlcnZpZXctc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPkhvbWU8L2E+PC9oMj4KKyAgICAgICAgICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIiBtb2RlPSJhbGwucGFja2FnZXMiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgIDwvaHRtbD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsLnBhY2thZ2VzIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIG5vd3JhcD0ibm93cmFwIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSIuL3t0cmFuc2xhdGUoQHBhY2thZ2UsJy4nLCcvJyl9L3BhY2thZ2Utc3VtbWFyeS5odG1sIiB0YXJnZXQ9ImNsYXNzRnJhbWUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJAcGFja2FnZSA9ICcnIj4mbHQ7bm9uZSZndDs8L3hzbDppZj4KKyAgICAgICAgICAgICAgICA8L2E+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIiBtb2RlPSJvdmVydmlldy5wYWNrYWdlcyI+CisgICAgICAgIDxodG1sPgorICAgICAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICAgICAgPHRpdGxlPlVuaXQgVGVzdCBSZXN1bHRzOiBTdW1tYXJ5PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYWNrYWdlLm5hbWUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ib25sb2FkIj5vcGVuKCdhbGxjbGFzc2VzLWZyYW1lLmh0bWwnLCdjbGFzc0xpc3RGcmFtZScpPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisgICAgICAgICAgICAgICAgPGgyPlN1bW1hcnk8L2gyPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZXJyb3JDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BlcnJvcnMpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmYWlsdXJlQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZmFpbHVyZXMpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lwcGVkQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9Ac2tpcHBlZCkiIC8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InN1Y2Nlc3NSYXRlIiBzZWxlY3Q9IigkdGVzdENvdW50IC0gJGZhaWx1cmVDb3VudCAtICRlcnJvckNvdW50KSBkaXYgJHRlc3RDb3VudCIvPgorICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5GYWlsdXJlczwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Ta2lwcGVkPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TdWNjZXNzIHJhdGU8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlRpbWU8L3RoPgorICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPlBhc3M8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCB0ZXN0cyIgaHJlZj0iYWxsLXRlc3RzLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC9hPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIGZhaWx1cmVzIiBocmVmPSJhbGx0ZXN0cy1mYWlscy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCBlcnJvcnMiIGhyZWY9ImFsbHRlc3RzLWVycm9ycy5odG1sIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48YSB0aXRsZT0iRGlzcGxheSBhbGwgc2tpcHBlZCB0ZXN0IiBocmVmPSJhbGx0ZXN0cy1za2lwcGVkLmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tpcHBlZENvdW50IiAvPjwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iJHN1Y2Nlc3NSYXRlIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkdGltZUNvdW50Ii8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5OyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogPGVtPmZhaWx1cmVzPC9lbT4gYXJlIGFudGljaXBhdGVkIGFuZCBjaGVja2VkIGZvciB3aXRoIGFzc2VydGlvbnMgd2hpbGUgPGVtPmVycm9yczwvZW0+IGFyZSB1bmFudGljaXBhdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICA8L3RhYmxlPgorCisgICAgICAgICAgICAgICAgPGgyPlBhY2thZ2VzPC9oMj4KKyAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0idGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBwYWNrYWdlIiBvcmRlcj0iYXNjZW5kaW5nIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdldCB0aGUgbm9kZSBzZXQgY29udGFpbmluZyBhbGwgdGVzdHN1aXRlcyB0aGF0IGhhdmUgdGhlIHNhbWUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5zYW1lcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9IGN1cnJlbnQoKS9AcGFja2FnZV0iLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNwbGF5IGEgZmFpbHVyZSBpZiB0aGVyZSBpcyBhbnkgZmFpbHVyZS9lcnJvciBpbiB0aGUgcGFja2FnZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZXJyb3JzKSAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJzdW0oJGluc2FtZXBhY2thZ2UvQGZhaWx1cmVzKSAmZ3Q7IDAiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi97dHJhbnNsYXRlKEBwYWNrYWdlLCcuJywnLycpfS9wYWNrYWdlLXN1bW1hcnkuaHRtbCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9IkBwYWNrYWdlID0gJyciPiZsdDtub25lJmd0OzwveHNsOmlmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0B0ZXN0cykiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3VtKCRpbnNhbWVwYWNrYWdlL0BlcnJvcnMpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AZmFpbHVyZXMpIi8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9Ac2tpcHBlZCkiIC8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9InN1bSgkaW5zYW1lcGFja2FnZS9AdGltZSkiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGluc2FtZXBhY2thZ2UvQHRpbWVzdGFtcCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaW5zYW1lcGFja2FnZS9AaG9zdG5hbWUiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgPC9odG1sPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhY2thZ2Uuc3VtbWFyeSI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ibmFtZSIvPgorICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjcmVhdGUuc3R5bGVzaGVldC5saW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InBhY2thZ2UubmFtZSIgc2VsZWN0PSIkbmFtZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJvbmxvYWQiPm9wZW4oJ3BhY2thZ2UtZnJhbWUuaHRtbCcsJ2NsYXNzTGlzdEZyYW1lJyk8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiLz4KKyAgICAgICAgICAgICAgICA8aDM+UGFja2FnZSA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iJG5hbWUiLz48L2gzPgorCisgICAgICAgICAgICAgICAgPCEtLXRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImNsYXNzLm1ldHJpY3MuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgbW9kZT0icHJpbnQubWV0cmljcyIvPgorICAgICAgICAgICAgICAgIDwvdGFibGUtLT4KKworICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iaW5zYW1lcGFja2FnZSIgc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbLi9AcGFja2FnZSA9ICRuYW1lXSIvPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQoJGluc2FtZXBhY2thZ2UpICZndDsgMCI+CisgICAgICAgICAgICAgICAgICAgIDxoMj5DbGFzc2VzPC9oMj4KKyAgICAgICAgICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImRldGFpbHMiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjUiIGNlbGxzcGFjaW5nPSIyIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIkaW5zYW1lcGFja2FnZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6c29ydCBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6YXBwbHktdGVtcGxhdGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICA8L2h0bWw+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDwhLS0KKyAgICAgICAgdHJhbnNmb3JtIHN0cmluZyBsaWtlIGEuYi5jIHRvIC4uLy4uLy4uLworICAgICAgICBAcGFyYW0gcGF0aCB0aGUgcGF0aCB0byB0cmFuc2Zvcm0gaW50byBhIGRlc2NlbmRpbmcgZGlyZWN0b3J5IHBhdGgKKyAgICAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InBhdGgiLz4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb250YWlucygkcGF0aCwnLicpIj4KKyAgICAgICAgICAgIDx4c2w6dGV4dD4uLi88L3hzbDp0ZXh0PgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIj48eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCRwYXRoLCcuJykiLz48L3hzbDp3aXRoLXBhcmFtPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDx4c2w6aWYgdGVzdD0ibm90KGNvbnRhaW5zKCRwYXRoLCcuJykpIGFuZCBub3QoJHBhdGggPSAnJykiPgorICAgICAgICAgICAgPHhzbDp0ZXh0Pi4uLzwveHNsOnRleHQ+CisgICAgICAgIDwveHNsOmlmPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgICA8IS0tIGNyZWF0ZSB0aGUgbGluayB0byB0aGUgc3R5bGVzaGVldCBiYXNlZCBvbiB0aGUgcGFja2FnZSBuYW1lIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iY3JlYXRlLnN0eWxlc2hlZXQubGluayI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0icGFja2FnZS5uYW1lIi8+CisgICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJTdHlsZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+PHhzbDppZiB0ZXN0PSJub3QoJHBhY2thZ2UubmFtZSA9ICd1bm5hbWVkIHBhY2thZ2UnKSI+PHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhdGgiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJwYXRoIiBzZWxlY3Q9IiRwYWNrYWdlLm5hbWUiLz48L3hzbDpjYWxsLXRlbXBsYXRlPjwveHNsOmlmPnN0eWxlc2hlZXQuY3NzPC94c2w6YXR0cmlidXRlPjwvbGluaz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgICAgPCEtLSBQYWdlIEhFQURFUiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9InBhZ2VIZWFkZXIiPgorICAgICAgICA8aDE+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRUSVRMRSIvPjwvaDE+CisgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgorICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwczovL3d3dy5qdW5pdC5vcmcvIj5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LjwvdGQ+CisgICAgICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8aHIgc2l6ZT0iMSIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBjbGFzcyBoZWFkZXIgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ0ZXN0c3VpdGUudGVzdC5oZWFkZXIiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICAgICAgPHRoPlRlc3RzPC90aD4KKyAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgICAgIDx0aD5Ta2lwcGVkPC90aD4KKyAgICAgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUgU3RhbXA8L3RoPgorICAgICAgICAgICAgPHRoPkhvc3Q8L3RoPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBtZXRob2QgaGVhZGVyIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idGVzdGNhc2UudGVzdC5oZWFkZXIiPgorICAgICAgICA8eHNsOnBhcmFtIG5hbWU9InNob3cuY2xhc3MiIHNlbGVjdD0iJyciLz4KKyAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iYm9vbGVhbigkc2hvdy5jbGFzcykiPgorICAgICAgICAgICAgICAgIDx0aD5DbGFzczwvdGg+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx0aD5OYW1lPC90aD4KKyAgICAgICAgICAgIDx0aD5TdGF0dXM8L3RoPgorICAgICAgICAgICAgPHRoIHdpZHRoPSI4MCUiPlR5cGU8L3RoPgorICAgICAgICAgICAgPHRoIG5vd3JhcD0ibm93cmFwIj5UaW1lKHMpPC90aD4KKyAgICAgICAgPC90cj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworCisgICAgPCEtLSBjbGFzcyBpbmZvcm1hdGlvbiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGVycm9yc1suJmd0OyAwXSI+RXJyb3I8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzWy4mZ3Q7IDBdIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+UGFzczwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8dGQ+PGEgdGl0bGU9IkRpc3BsYXkgYWxsIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9Lmh0bWwiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPjxhIHRpdGxlPSJEaXNwbGF5IGFsbCB0ZXN0cyIgaHJlZj0ie0BpZH1fe0BuYW1lfS5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB0ZXN0cyIvPjwvYT48L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGVycm9ycyAhPSAwIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPSJEaXNwbGF5IG9ubHkgZXJyb3JzIiBocmVmPSJ7QGlkfV97QG5hbWV9LWVycm9ycy5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBlcnJvcnMiLz48L2E+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAZXJyb3JzIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iQGZhaWx1cmVzICE9IDAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBmYWlsdXJlcyIgaHJlZj0ie0BpZH1fe0BuYW1lfS1mYWlscy5odG1sIj48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBmYWlsdXJlcyIvPgorICAgICAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBza2lwcGVkICE9IDAiPgorICAgICAgICAgICAgICAgICAgICAgICAgPGEgdGl0bGU9IkRpc3BsYXkgb25seSBza2lwcGVkIHRlc3RzIiBocmVmPSJ7QGlkfV97QG5hbWV9LXNraXBwZWQuaHRtbCI+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAc2tpcHBlZCIvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBza2lwcGVkIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAdGltZXN0YW1wIi8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkBob3N0bmFtZSIvPjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0Y2FzZSIgbW9kZT0icHJpbnQudGVzdCI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ic2hvdy5jbGFzcyIgc2VsZWN0PSInJyIvPgorICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9ImZhaWx1cmUiPkZhaWx1cmU8L3hzbDp3aGVuPgorICAgICAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT5UYWJsZVJvd0NvbG9yPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY2xhc3MuaHJlZiI+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCh0cmFuc2xhdGUoLi4vQHBhY2thZ2UsJy4nLCcvJyksICcvJywgLi4vQGlkLCAnXycsIC4uL0BuYW1lLCAnLmh0bWwnKSIvPgorICAgICAgICAgICAgPC94c2w6dmFyaWFibGU+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImJvb2xlYW4oJHNob3cuY2xhc3MpIj4KKyAgICAgICAgICAgICAgICA8dGQ+PGEgaHJlZj0ieyRjbGFzcy5ocmVmfSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BuYW1lIi8+PC9hPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7QG5hbWV9Ii8+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJib29sZWFuKCRzaG93LmNsYXNzKSI+CisgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJ7Y29uY2F0KCRjbGFzcy5ocmVmLCAnIycsIEBuYW1lKX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6b3RoZXJ3aXNlPgorICAgICAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgICAgIDwvdGQ+CisgICAgICAgICAgICA8eHNsOmNob29zZT4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD5GYWlsdXJlPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iZmFpbHVyZSIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZXJyb3IiPgorICAgICAgICAgICAgICAgICAgICA8dGQ+RXJyb3I8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvciIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0ic2tpcHBlZCI+CisgICAgICAgICAgICAgICAgICAgIDx0ZD5Ta2lwcGVkPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0ic2tpcHBlZCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICAgICAgPHRkPlN1Y2Nlc3M8L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSJAdGltZSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisKKyAgICA8IS0tIE5vdGUgOiB0aGUgYmVsb3cgdGVtcGxhdGUgc2tpcHBlZCwgZXJyb3IgYW5kIGZhaWx1cmUgYXJlIHRoZSBzYW1lIHN0eWxlCisgICAgICAgICAgICAgICAgc28ganVzdCBjYWxsIHRoZSBzYW1lIHN0eWxlIHN0b3JlIGluIHRoZSB0b29sa2l0IHRlbXBsYXRlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImZhaWx1cmUiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iZXJyb3IiPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2tpcHBlZCI+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIFN0eWxlIGZvciB0aGUgZXJyb3IgYW5kIGZhaWx1cmUgaW4gdGhlIHRlc3RjYXNlIHRlbXBsYXRlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+CisgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9Im5vdChAbWVzc2FnZSkiPk4vQTwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG1lc3NhZ2UiLz4KKyAgICAgICAgICAgIDwveHNsOm90aGVyd2lzZT4KKyAgICAgICAgPC94c2w6Y2hvb3NlPgorICAgICAgICA8IS0tIGRpc3BsYXkgdGhlIHN0YWNrdHJhY2UgLS0+CisgICAgICAgIDxici8+PGJyLz4KKyAgICAgICAgPGNvZGU+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iLiIvPgorICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgPC9jb2RlPgorICAgICAgICA8IS0tIHRoZSBsYXR0ZXIgaXMgYmV0dGVyIGJ1dCBtaWdodCBiZSBwcm9ibGVtYXRpYyBmb3Igbm9uLTIxIiBtb25pdG9ycy4uLiAtLT4KKyAgICAgICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG5hbWU9IkpTLWVzY2FwZSI+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG1wMSIgc2VsZWN0PSJyZXBsYWNlKCRzdHJpbmcsJ1xcJywnXFxcXCcpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG1wMiIgc2VsZWN0PSJyZXBsYWNlKCR0bXAxLCZxdW90OycmcXVvdDssJnF1b3Q7XFwmYXBvczsmcXVvdDspIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG1wMyIgc2VsZWN0PSJyZXBsYWNlKCR0bXAyLCZxdW90OyYjMTA7JnF1b3Q7LCdcXG4nKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRtcDQiIHNlbGVjdD0icmVwbGFjZSgkdG1wMywmcXVvdDsmIzEzOyZxdW90OywnXFxyJykiLz4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0bXA0Ii8+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDwhLS0KKyAgICAgICAgdGVtcGxhdGUgdGhhdCB3aWxsIGNvbnZlcnQgYSBjYXJyaWFnZSByZXR1cm4gaW50byBhIGJyIHRhZworICAgICAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCisgICAgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgICAgIDx4c2w6cGFyYW0gbmFtZT0ic3BsaXRsaW1pdCI+MzI8L3hzbDpwYXJhbT4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWNvbmRoYWxmc3RhcnRpbmRleCIgc2VsZWN0PSIoc3RyaW5nLWxlbmd0aCgkd29yZCkrKHN0cmluZy1sZW5ndGgoJHdvcmQpIG1vZCAyKSkgZGl2IDIiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWNvbmRoYWxmd29yZCIgc2VsZWN0PSJzdWJzdHJpbmcoJHdvcmQsICRzZWNvbmRoYWxmc3RhcnRpbmRleCkiLz4KKyAgICAgICAgPCEtLSBXaGVuIHdvcmQgaXMgdmVyeSBiaWcsIGEgcmVjdXJzaXZlIHJlcGxhY2UgaXMgdmVyeSBoZWFwL3N0YWNrIGV4cGVuc2l2ZSwgc28gc3ViZGl2aWRlIG9uIGxpbmUgYnJlYWsgYWZ0ZXIgbWlkZGxlIG9mIHN0cmluZyAtLT4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iKHN0cmluZy1sZW5ndGgoJHdvcmQpID4gJHNwbGl0bGltaXQpIGFuZCAoY29udGFpbnMoJHNlY29uZGhhbGZ3b3JkLCAnJiN4YTsnKSkiPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2Vjb25kaGFsZmVuZCIgc2VsZWN0PSJzdWJzdHJpbmctYWZ0ZXIoJHNlY29uZGhhbGZ3b3JkLCAnJiN4YTsnKSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RoYWxmbGVuIiBzZWxlY3Q9InN0cmluZy1sZW5ndGgoJHdvcmQpIC0gc3RyaW5nLWxlbmd0aCgkc2Vjb25kaGFsZndvcmQpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJmaXJzdGhhbGZ3b3JkIiBzZWxlY3Q9InN1YnN0cmluZygkd29yZCwgMSwgJGZpcnN0aGFsZmxlbikiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZpcnN0aGFsZmVuZCIgc2VsZWN0PSJzdWJzdHJpbmctYmVmb3JlKCRzZWNvbmRoYWxmd29yZCwgJyYjeGE7JykiLz4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9ImNvbmNhdCgkZmlyc3RoYWxmd29yZCwkZmlyc3RoYWxmZW5kKSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICAgICAgPGJyLz4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9IiRzZWNvbmRoYWxmZW5kIi8+CisgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iY29udGFpbnMoJHdvcmQsICcmI3hhOycpIj4KKyAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd29yZCwgJyYjeGE7JykiLz4KKyAgICAgICAgICAgICAgICA8YnIvPgorICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0ic3Vic3RyaW5nLWFmdGVyKCR3b3JkLCAnJiN4YTsnKSIvPgorICAgICAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDpvdGhlcndpc2U+CisgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JkIi8+CisgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgIDwveHNsOmNob29zZT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAwJykiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1wZXJjZW50Ij4KKyAgICAgICAgPHhzbDpwYXJhbSBuYW1lPSJ2YWx1ZSIvPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InRlc3RzdWl0ZSIgbW9kZT0iYWxsdGVzdHMuZXJyb3Iucm93Ij4KKyAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0icGFja2FnZS5kaXIiPgorICAgICAgICA8eHNsOmlmIHRlc3Q9Im5vdChAcGFja2FnZSA9ICcnKSI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRyYW5zbGF0ZShAcGFja2FnZSwnLicsJy8nKSIvPjx4c2w6dGV4dD4vPC94c2w6dGV4dD48L3hzbDppZj4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjbGFzcy5ocmVmIj4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgkcGFja2FnZS5kaXIsIEBpZCwgJ18nLCBAbmFtZSwgJy5odG1sJykiLz4KKyAgICAgIDwveHNsOnZhcmlhYmxlPgorICAgICAgPHRyIGNsYXNzPSJFcnJvciI+CisgICAgICAgIDx0ZD48YSBocmVmPSJ7JGNsYXNzLmhyZWZ9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz48L2E+PC90ZD4KKyAgICAgICAgPHRkIGNvbHNwYW49IjMiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+CisgICAgICA8L3RyPgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbCBiL3NyYy9ldGMvanVuaXQtZnJhbWVzLXhhbGFuMS54c2wKaW5kZXggZmJjMjhlMS4uYmM0MWE3YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9qdW5pdC1mcmFtZXMteGFsYW4xLnhzbAorKysgYi9zcmMvZXRjL2p1bml0LWZyYW1lcy14YWxhbjEueHNsCkBAIC0zLDYgKzMsNyBAQAogICAgIHhtbG5zOmx4c2x0PSJodHRwOi8veG1sLmFwYWNoZS5vcmcveHNsdCIKICAgICB4bWxuczpyZWRpcmVjdD0ib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiCiAgICAgeG1sbnM6c3RyaW5nPSJ4YWxhbjovL2phdmEubGFuZy5TdHJpbmciCisgICAgeG1sbnM6c3RyaW5ndXRpbHM9InhhbGFuOi8vb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlscyIKICAgICBleHRlbnNpb24tZWxlbWVudC1wcmVmaXhlcz0icmVkaXJlY3QiPgogPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVURi04Ii8+CiA8eHNsOmRlY2ltYWwtZm9ybWF0IGRlY2ltYWwtc2VwYXJhdG9yPSIuIiBncm91cGluZy1zZXBhcmF0b3I9IiwiLz4KQEAgLTE0LDcgKzE1LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDQzLDcgKzQ0NCw3IEBACiAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQHRlc3RzKSIvPgogICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AZXJyb3JzKSIvPgogICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BmYWlsdXJlcykiLz4KLSAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lwcGVkQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9Ac2tpcHBlZCkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lwQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9Ac2tpcHBlZCkiLz4KICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CkBAIC01OTIsNyArNTkzLDcgQEAKICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgogICAgIDx0cj4KICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgotICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cDovL3d3dy5qdW5pdC5vcmcvIj5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC90ZD4KKyAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC90ZD4KICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAgICAgPGhyIHNpemU9IjEiLz4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbCBiL3NyYy9ldGMvanVuaXQtZnJhbWVzLnhzbAppbmRleCA0OWZjNjY3Li43MzJlMDQwIDEwMDY0NAotLS0gYS9zcmMvZXRjL2p1bml0LWZyYW1lcy54c2wKKysrIGIvc3JjL2V0Yy9qdW5pdC1mcmFtZXMueHNsCkBAIC0xNCw3ICsxNCw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc0Miw3ICs3NDIsNyBAQAogICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgICAgPHRyPgogICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgogICAgIDwvdHI+CiAgICAgPC90YWJsZT4KICAgICA8aHIgc2l6ZT0iMSIvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9qdW5pdC1ub2ZyYW1lcy1zYXhvbi54c2wgYi9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLXNheG9uLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTdlZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy9qdW5pdC1ub2ZyYW1lcy1zYXhvbi54c2wKQEAgLTAsMCArMSw1NDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0ieHMiCisgICAgdmVyc2lvbj0iMi4wIj4KKyAgICA8eHNsOmNoYXJhY3Rlci1tYXAgbmFtZT0ibm8tY29udHJvbC1jaGFyYWN0ZXJzIj4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMjc7IiBzdHJpbmc9IiZhbXA7IzEyNzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMjg7IiBzdHJpbmc9IiZhbXA7IzEyODsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMjk7IiBzdHJpbmc9IiZhbXA7IzEyOTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzA7IiBzdHJpbmc9IiZhbXA7IzEzMDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzE7IiBzdHJpbmc9IiZhbXA7IzEzMTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzI7IiBzdHJpbmc9IiZhbXA7IzEzMjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzM7IiBzdHJpbmc9IiZhbXA7IzEzMzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzQ7IiBzdHJpbmc9IiZhbXA7IzEzNDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzU7IiBzdHJpbmc9IiZhbXA7IzEzNTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzY7IiBzdHJpbmc9IiZhbXA7IzEzNjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzc7IiBzdHJpbmc9IiZhbXA7IzEzNzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzg7IiBzdHJpbmc9IiZhbXA7IzEzODsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxMzk7IiBzdHJpbmc9IiZhbXA7IzEzOTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDA7IiBzdHJpbmc9IiZhbXA7IzE0MDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDE7IiBzdHJpbmc9IiZhbXA7IzE0MTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDI7IiBzdHJpbmc9IiZhbXA7IzE0MjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDM7IiBzdHJpbmc9IiZhbXA7IzE0MzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDQ7IiBzdHJpbmc9IiZhbXA7IzE0NDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDU7IiBzdHJpbmc9IiZhbXA7IzE0NTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDY7IiBzdHJpbmc9IiZhbXA7IzE0NjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDc7IiBzdHJpbmc9IiZhbXA7IzE0NzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDg7IiBzdHJpbmc9IiZhbXA7IzE0ODsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNDk7IiBzdHJpbmc9IiZhbXA7IzE0OTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTA7IiBzdHJpbmc9IiZhbXA7IzE1MDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTE7IiBzdHJpbmc9IiZhbXA7IzE1MTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTI7IiBzdHJpbmc9IiZhbXA7IzE1MjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTM7IiBzdHJpbmc9IiZhbXA7IzE1MzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTQ7IiBzdHJpbmc9IiZhbXA7IzE1NDsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTU7IiBzdHJpbmc9IiZhbXA7IzE1NTsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTY7IiBzdHJpbmc9IiZhbXA7IzE1NjsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTc7IiBzdHJpbmc9IiZhbXA7IzE1NzsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTg7IiBzdHJpbmc9IiZhbXA7IzE1ODsiLz4KKyAgICAgICAgPHhzbDpvdXRwdXQtY2hhcmFjdGVyIGNoYXJhY3Rlcj0iJiMxNTk7IiBzdHJpbmc9IiZhbXA7IzE1OTsiLz4KKyAgICA8L3hzbDpjaGFyYWN0ZXItbWFwPgorPHhzbDpvdXRwdXQgbWV0aG9kPSJodG1sIiBpbmRlbnQ9InllcyIgZW5jb2Rpbmc9IlVURi04IiB1c2UtY2hhcmFjdGVyLW1hcHM9Im5vLWNvbnRyb2wtY2hhcmFjdGVycyIKKyAgZG9jdHlwZS1wdWJsaWM9Ii0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAvPgorPHhzbDpkZWNpbWFsLWZvcm1hdCBkZWNpbWFsLXNlcGFyYXRvcj0iLiIgZ3JvdXBpbmctc2VwYXJhdG9yPSIsIiAvPgorPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgLS0+CisKKzx4c2w6cGFyYW0gbmFtZT0iVElUTEUiPlVuaXQgVGVzdCBSZXN1bHRzLjwveHNsOnBhcmFtPgorCis8IS0tCisKKyBTYW1wbGUgc3R5bGVzaGVldCB0byBiZSB1c2VkIHdpdGggQW50IEpVbml0UmVwb3J0IG91dHB1dC4KKworIEl0IGNyZWF0ZXMgYSBub24tZnJhbWVkIHJlcG9ydCB0aGF0IGNhbiBiZSB1c2VmdWwgdG8gc2VuZCB2aWEKKyBlLW1haWwgb3Igc3VjaC4KKworLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGVzIj4KKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8dGl0bGU+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRUSVRMRSIvPjwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgICAgIGJvZHkgeworICAgICAgICBmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7CisgICAgICAgIGNvbG9yOiMwMDAwMDA7CisgICAgICB9CisgICAgICB0YWJsZSB0ciB0ZCwgdGFibGUgdHIgdGggeworICAgICAgICAgIGZvbnQtc2l6ZTogNjglOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0aHsKKyAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CisgICAgICAgIHRleHQtYWxpZ246bGVmdDsKKyAgICAgICAgYmFja2dyb3VuZDojYTZjYWYwOworICAgICAgfQorICAgICAgdGFibGUuZGV0YWlscyB0ciB0ZHsKKyAgICAgICAgYmFja2dyb3VuZDojZWVlZWUwOworICAgICAgfQorCisgICAgICBwIHsKKyAgICAgICAgbGluZS1oZWlnaHQ6MS41ZW07CisgICAgICAgIG1hcmdpbi10b3A6MC41ZW07IG1hcmdpbi1ib3R0b206MS4wZW07CisgICAgICB9CisgICAgICBoMSB7CisgICAgICAgIG1hcmdpbjogMHB4IDBweCA1cHg7IGZvbnQ6IDE2NSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGgyIHsKKyAgICAgICAgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMjUlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoMyB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIGg0IHsKKyAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41ZW07IGZvbnQ6IGJvbGQgMTAwJSB2ZXJkYW5hLGFyaWFsLGhlbHZldGljYQorICAgICAgfQorICAgICAgaDUgeworICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsgZm9udDogYm9sZCAxMDAlIHZlcmRhbmEsYXJpYWwsaGVsdmV0aWNhCisgICAgICB9CisgICAgICBoNiB7CisgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDEwMCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EKKyAgICAgIH0KKyAgICAgIC5FcnJvciB7CisgICAgICAgIGZvbnQtd2VpZ2h0OmJvbGQ7IGNvbG9yOnJlZDsKKyAgICAgIH0KKyAgICAgIC5GYWlsdXJlIHsKKyAgICAgICAgZm9udC13ZWlnaHQ6Ym9sZDsgY29sb3I6cHVycGxlOworICAgICAgfQorICAgICAgLlByb3BlcnRpZXMgeworICAgICAgICB0ZXh0LWFsaWduOnJpZ2h0OworICAgICAgfQorICAgICAgPC9zdHlsZT4KKyAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgICAgICAgIHZhciBUZXN0Q2FzZXMgPSBuZXcgQXJyYXkoKTsKKyAgICAgICAgdmFyIGN1cjsKKyAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlIj4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0icHJvcGVydGllcyIvPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKworICAgICAgIDwvc2NyaXB0PgorICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+PCFbQ0RBVEFbCisgICAgICAgIGZ1bmN0aW9uIGRpc3BsYXlQcm9wZXJ0aWVzIChuYW1lKSB7CisgICAgICAgICAgdmFyIHdpbiA9IHdpbmRvdy5vcGVuKCcnLCdKVW5pdFN5c3RlbVByb3BlcnRpZXMnLCdzY3JvbGxiYXJzPTEscmVzaXphYmxlPTEnKTsKKyAgICAgICAgICB2YXIgZG9jID0gd2luLmRvY3VtZW50OworICAgICAgICAgIGRvYy5vcGVuKCk7CisgICAgICAgICAgZG9jLndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+UHJvcGVydGllcyBvZiAiICsgbmFtZSArICI8L3RpdGxlPiIpOworICAgICAgICAgIGRvYy53cml0ZSgiPHN0eWxlPiIpCisgICAgICAgICAgZG9jLndyaXRlKCJib2R5IHtmb250Om5vcm1hbCA2OCUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2E7IGNvbG9yOiMwMDAwMDA7IH0iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoInRhYmxlIHRyIHRkLCB0YWJsZSB0ciB0aCB7IGZvbnQtc2l6ZTogNjglOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJ0YWJsZS5wcm9wZXJ0aWVzIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyBib3JkZXItbGVmdDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci10b3A6c29saWQgMSAjY2NjY2NjOyBwYWRkaW5nOjVweDsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0aCB7IHRleHQtYWxpZ246bGVmdDsgYm9yZGVyLXJpZ2h0OnNvbGlkIDEgI2NjY2NjYzsgYm9yZGVyLWJvdHRvbTpzb2xpZCAxICNjY2NjY2M7IGJhY2tncm91bmQtY29sb3I6I2VlZWVlZTsgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgidGFibGUucHJvcGVydGllcyB0ZCB7IGZvbnQ6bm9ybWFsOyB0ZXh0LWFsaWduOmxlZnQ7IGJvcmRlci1yaWdodDpzb2xpZCAxICNjY2NjY2M7IGJvcmRlci1ib3R0b206c29saWQgMSAjY2NjY2NjOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmZmOyB9Iik7CisgICAgICAgICAgZG9jLndyaXRlKCJoMyB7IG1hcmdpbi1ib3R0b206IDAuNWVtOyBmb250OiBib2xkIDExNSUgdmVyZGFuYSxhcmlhbCxoZWx2ZXRpY2EgfSIpOworICAgICAgICAgIGRvYy53cml0ZSgiPC9zdHlsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvaGVhZD48Ym9keT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjxoMz5Qcm9wZXJ0aWVzIG9mICIgKyBuYW1lICsgIjwvaDM+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8ZGl2IGFsaWduPVwicmlnaHRcIj48YSBocmVmPVwiamF2YXNjcmlwdDp3aW5kb3cuY2xvc2UoKTtcIj5DbG9zZTwvYT48L2Rpdj4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjx0YWJsZSBjbGFzcz0ncHJvcGVydGllcyc+Iik7CisgICAgICAgICAgZG9jLndyaXRlKCI8dHI+PHRoPk5hbWU8L3RoPjx0aD5WYWx1ZTwvdGg+PC90cj4iKTsKKyAgICAgICAgICBmb3IgKHByb3AgaW4gVGVzdENhc2VzW25hbWVdKSB7CisgICAgICAgICAgICBkb2Mud3JpdGUoIjx0cj48dGg+IiArIHByb3AgKyAiPC90aD48dGQ+IiArIFRlc3RDYXNlc1tuYW1lXVtwcm9wXSArICI8L3RkPjwvdHI+Iik7CisgICAgICAgICAgfQorICAgICAgICAgIGRvYy53cml0ZSgiPC90YWJsZT4iKTsKKyAgICAgICAgICBkb2Mud3JpdGUoIjwvYm9keT48L2h0bWw+Iik7CisgICAgICAgICAgZG9jLmNsb3NlKCk7CisgICAgICAgICAgd2luLmZvY3VzKCk7CisgICAgICAgIH0KKyAgICAgIF1dPgorICAgICAgPC9zY3JpcHQ+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgPGJvZHk+CisgICAgICAgICAgICA8YSBuYW1lPSJ0b3AiPjwvYT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWdlSGVhZGVyIi8+CisKKyAgICAgICAgICAgIDwhLS0gU3VtbWFyeSBwYXJ0IC0tPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InN1bW1hcnkiLz4KKyAgICAgICAgICAgIDxociBzaXplPSIxIiB3aWR0aD0iOTUlIiBhbGlnbj0ibGVmdCIvPgorCisgICAgICAgICAgICA8IS0tIFBhY2thZ2UgTGlzdCBwYXJ0IC0tPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InBhY2thZ2VsaXN0Ii8+CisgICAgICAgICAgICA8aHIgc2l6ZT0iMSIgd2lkdGg9Ijk1JSIgYWxpZ249ImxlZnQiLz4KKworICAgICAgICAgICAgPCEtLSBGb3IgZWFjaCBwYWNrYWdlIGNyZWF0ZSBpdHMgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJwYWNrYWdlcyIvPgorICAgICAgICAgICAgPGhyIHNpemU9IjEiIHdpZHRoPSI5NSUiIGFsaWduPSJsZWZ0Ii8+CisKKyAgICAgICAgICAgIDwhLS0gRm9yIGVhY2ggY2xhc3MgY3JlYXRlIHRoZSAgcGFydCAtLT4KKyAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJjbGFzc2VzIi8+CisKKyAgICAgICAgPC9ib2R5PgorICAgIDwvaHRtbD4KKzwveHNsOnRlbXBsYXRlPgorCisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gV3JpdGUgYSBsaXN0IG9mIGFsbCBwYWNrYWdlcyB3aXRoIGFuIGh5cGVybGluayB0byB0aGUgYW5jaG9yIG9mICAgIC0tPgorICAgIDwhLS0gb2YgdGhlIHBhY2thZ2UgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZWxpc3QiPgorICAgICAgICA8aDI+UGFja2FnZXM8L2gyPgorICAgICAgICBOb3RlOiBwYWNrYWdlIHN0YXRpc3RpY3MgYXJlIG5vdCBjb21wdXRlZCByZWN1cnNpdmVseSwgdGhleSBvbmx5IHN1bSB1cCBhbGwgb2YgaXRzIHRlc3RzdWl0ZXMgbnVtYmVycy4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisgICAgICAgICAgICA8IS0tIGxpc3QgYWxsIHBhY2thZ2VzIHJlY3Vyc2l2ZWx5IC0tPgorICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9Ii4vdGVzdHN1aXRlW25vdCguL0BwYWNrYWdlID0gcHJlY2VkaW5nLXNpYmxpbmc6OnRlc3RzdWl0ZS9AcGFja2FnZSldIj4KKyAgICAgICAgICAgICAgICA8eHNsOnNvcnQgc2VsZWN0PSJAcGFja2FnZSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdHN1aXRlcy1pbi1wYWNrYWdlIiBzZWxlY3Q9Ii90ZXN0c3VpdGVzL3Rlc3RzdWl0ZVsuL0BwYWNrYWdlID0gY3VycmVudCgpL0BwYWNrYWdlXSIvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGVzdENvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0ZXN0cykiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImVycm9yQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQGVycm9ycykiLz4KKyAgICAgICAgICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImZhaWx1cmVDb3VudCIgc2VsZWN0PSJzdW0oJHRlc3RzdWl0ZXMtaW4tcGFja2FnZS9AZmFpbHVyZXMpIi8+CisgICAgICAgICAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJza2lwcGVkQ291bnQiIHNlbGVjdD0ic3VtKCR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQHNraXBwZWQpIiAvPgorICAgICAgICAgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idGltZUNvdW50IiBzZWxlY3Q9InN1bSgkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0aW1lKSIvPgorCisgICAgICAgICAgICAgICAgPCEtLSB3cml0ZSBhIHN1bW1hcnkgZm9yIHRoZSBwYWNrYWdlIC0tPgorICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gc2V0IGEgbmljZSBjb2xvciBkZXBlbmRpbmcgaWYgdGhlcmUgaXMgYW4gZXJyb3IvZmFpbHVyZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IiRmYWlsdXJlQ291bnQgJmd0OyAwIj5GYWlsdXJlPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iJGVycm9yQ291bnQgJmd0OyAwIj5FcnJvcjwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IiN7QHBhY2thZ2V9Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHBhY2thZ2UiLz48L2E+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdENvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZXJyb3JDb3VudCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGZhaWx1cmVDb3VudCIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJHNraXBwZWRDb3VudCIgLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXRpbWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiR0aW1lQ291bnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdGVzdHN1aXRlcy1pbi1wYWNrYWdlL0B0aW1lc3RhbXAiLz48L3RkPgorICAgICAgICAgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0c3VpdGVzLWluLXBhY2thZ2UvQGhvc3RuYW1lIi8+PC90ZD4KKyAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKworICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDwhLS0gV3JpdGUgYSBwYWNrYWdlIGxldmVsIHJlcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gSXQgY3JlYXRlcyBhIHRhYmxlIHdpdGggdmFsdWVzIGZyb20gdGhlIGRvY3VtZW50OiAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gTmFtZSB8IFRlc3RzIHwgRXJyb3JzIHwgRmFpbHVyZXMgfCBUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0icGFja2FnZXMiPgorICAgICAgICA8IS0tIGNyZWF0ZSBhbiBhbmNob3IgdG8gdGhpcyBwYWNrYWdlIG5hbWUgLS0+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSIvdGVzdHN1aXRlcy90ZXN0c3VpdGVbbm90KC4vQHBhY2thZ2UgPSBwcmVjZWRpbmctc2libGluZzo6dGVzdHN1aXRlL0BwYWNrYWdlKV0iPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQHBhY2thZ2UiLz4KKyAgICAgICAgICAgICAgICA8YSBuYW1lPSJ7QHBhY2thZ2V9Ij48L2E+CisgICAgICAgICAgICAgICAgPGgzPlBhY2thZ2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBwYWNrYWdlIi8+PC9oMz4KKworICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iZGV0YWlscyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iNSIgY2VsbHNwYWNpbmc9IjIiIHdpZHRoPSI5NSUiPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idGVzdHN1aXRlLnRlc3QuaGVhZGVyIi8+CisKKyAgICAgICAgICAgICAgICAgICAgPCEtLSBtYXRjaCB0aGUgdGVzdHN1aXRlcyBvZiB0aGlzIHBhY2thZ2UgLS0+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iL3Rlc3RzdWl0ZXMvdGVzdHN1aXRlWy4vQHBhY2thZ2UgPSBjdXJyZW50KCkvQHBhY2thZ2VdIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSIjdG9wIj5CYWNrIHRvIHRvcDwvYT4KKyAgICAgICAgICAgICAgICA8cC8+CisgICAgICAgICAgICAgICAgPHAvPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0iY2xhc3NlcyI+CisgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJ0ZXN0c3VpdGUiPgorICAgICAgICAgICAgPHhzbDpzb3J0IHNlbGVjdD0iQG5hbWUiLz4KKyAgICAgICAgICAgIDwhLS0gY3JlYXRlIGFuIGFuY2hvciB0byB0aGlzIGNsYXNzIG5hbWUgLS0+CisgICAgICAgICAgICA8YSBuYW1lPSJ7QG5hbWV9Ij48L2E+CisgICAgICAgICAgICA8aDM+VGVzdENhc2UgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC9oMz4KKworICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ0ZXN0Y2FzZS50ZXN0LmhlYWRlciIvPgorICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgIHRlc3QgY2FuIGV2ZW4gbm90IGJlIHN0YXJ0ZWQgYXQgYWxsIChmYWlsdXJlIHRvIGxvYWQgdGhlIGNsYXNzKQorICAgICAgICAgICAgICBzbyByZXBvcnQgdGhlIGVycm9yIGRpcmVjdGx5CisgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iLi9lcnJvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iRXJyb3IiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjQiPjx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi9lcnJvciIvPjwvdGQ+CisgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuL3Rlc3RjYXNlIiBtb2RlPSJwcmludC50ZXN0Ii8+CisgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgPGRpdiBjbGFzcz0iUHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgPGE+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmphdmFzY3JpcHQ6ZGlzcGxheVByb3BlcnRpZXMoJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAcGFja2FnZSIvPi48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQG5hbWUiLz4nKTs8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgJiMxODc7CisgICAgICAgICAgICAgICAgPC9hPgorICAgICAgICAgICAgPC9kaXY+CisgICAgICAgICAgICA8cC8+CisKKyAgICAgICAgICAgIDxhIGhyZWY9IiN0b3AiPkJhY2sgdG8gdG9wPC9hPgorICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0ic3VtbWFyeSI+CisgICAgICAgIDxoMj5TdW1tYXJ5PC9oMj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0ZXN0Q291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGVzdHMpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZXJyb3JDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0BlcnJvcnMpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmFpbHVyZUNvdW50IiBzZWxlY3Q9InN1bSh0ZXN0c3VpdGUvQGZhaWx1cmVzKSIvPgorICAgICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InNraXBwZWRDb3VudCIgc2VsZWN0PSJzdW0odGVzdHN1aXRlL0Bza2lwcGVkKSIgLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0aW1lQ291bnQiIHNlbGVjdD0ic3VtKHRlc3RzdWl0ZS9AdGltZSkiLz4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzdWNjZXNzUmF0ZSIgc2VsZWN0PSIoJHRlc3RDb3VudCAtICRmYWlsdXJlQ291bnQgLSAkZXJyb3JDb3VudCkgZGl2ICR0ZXN0Q291bnQiLz4KKyAgICAgICAgPHRhYmxlIGNsYXNzPSJkZXRhaWxzIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSI1IiBjZWxsc3BhY2luZz0iMiIgd2lkdGg9Ijk1JSI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgICAgIDx0aD5FcnJvcnM8L3RoPgorICAgICAgICAgICAgPHRoPlNraXBwZWQ8L3RoPgorICAgICAgICAgICAgPHRoPlN1Y2Nlc3MgcmF0ZTwvdGg+CisgICAgICAgICAgICA8dGg+VGltZTwvdGg+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyI+CisgICAgICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZmFpbHVyZUNvdW50ICZndDsgMCI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSIkZXJyb3JDb3VudCAmZ3Q7IDAiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgICAgICA8L3hzbDpjaG9vc2U+CisgICAgICAgICAgICA8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR0ZXN0Q291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZmFpbHVyZUNvdW50Ii8+PC90ZD4KKyAgICAgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iJGVycm9yQ291bnQiLz48L3RkPgorICAgICAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkc2tpcHBlZENvdW50IiAvPjwvdGQ+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktcGVyY2VudCI+CisgICAgICAgICAgICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ2YWx1ZSIgc2VsZWN0PSIkc3VjY2Vzc1JhdGUiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgPC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IiR0aW1lQ291bnQiLz4KKyAgICAgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICAgICAgPC90ZD4KKworICAgICAgICA8L3RyPgorICAgICAgICA8L3RhYmxlPgorICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iOTUlIj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnk7Ij4KKyAgICAgICAgTm90ZTogPGk+ZmFpbHVyZXM8L2k+IGFyZSBhbnRpY2lwYXRlZCBhbmQgY2hlY2tlZCBmb3Igd2l0aCBhc3NlcnRpb25zIHdoaWxlIDxpPmVycm9yczwvaT4gYXJlIHVuYW50aWNpcGF0ZWQuCisgICAgICAgIDwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDwvdGFibGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgPCEtLQorICAgV3JpdGUgcHJvcGVydGllcyBpbnRvIGEgSmF2YVNjcmlwdCBkYXRhIHN0cnVjdHVyZS4KKyAgIFRoaXMgaXMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGlkZWEgYnkgRXJpayBIYXRjaGVyIChlaGF0Y2hlckBhcGFjaGUub3JnKQorICAgLS0+CisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InByb3BlcnRpZXMiPgorICAgIGN1ciA9IFRlc3RDYXNlc1snPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4uL0BwYWNrYWdlIi8+Ljx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9AbmFtZSIvPiddID0gbmV3IEFycmF5KCk7CisgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9InByb3BlcnR5Ij4KKyAgICA8eHNsOnNvcnQgc2VsZWN0PSJAbmFtZSIvPgorICAgICAgICBjdXJbJzx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPiddID0gJzx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPjx4c2w6d2l0aC1wYXJhbSBuYW1lPSJzdHJpbmciIHNlbGVjdD0iQHZhbHVlIi8+PC94c2w6Y2FsbC10ZW1wbGF0ZT4nOworICAgIDwveHNsOmZvci1lYWNoPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBQYWdlIEhFQURFUiAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0icGFnZUhlYWRlciI+CisgICAgPGgxPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkVElUTEUiLz48L2gxPgorICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CisgICAgPHRyPgorICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwczovL3d3dy5qdW5pdC5vcmcnPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnQnPkFudDwvYT4uPC90ZD4KKyAgICA8L3RyPgorICAgIDwvdGFibGU+CisgICAgPGhyIHNpemU9IjEiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9ImhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoPlNraXBwZWQ8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBjbGFzcyBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RzdWl0ZS50ZXN0LmhlYWRlciI+CisgICAgPHRyIHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRoIHdpZHRoPSI4MCUiPk5hbWU8L3RoPgorICAgICAgICA8dGg+VGVzdHM8L3RoPgorICAgICAgICA8dGg+RXJyb3JzPC90aD4KKyAgICAgICAgPHRoPkZhaWx1cmVzPC90aD4KKyAgICAgICAgPHRoPlNraXBwZWQ8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUocyk8L3RoPgorICAgICAgICA8dGggbm93cmFwPSJub3dyYXAiPlRpbWUgU3RhbXA8L3RoPgorICAgICAgICA8dGg+SG9zdDwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCis8IS0tIG1ldGhvZCBoZWFkZXIgLS0+Cis8eHNsOnRlbXBsYXRlIG5hbWU9InRlc3RjYXNlLnRlc3QuaGVhZGVyIj4KKyAgICA8dHIgdmFsaWduPSJ0b3AiPgorICAgICAgICA8dGg+TmFtZTwvdGg+CisgICAgICAgIDx0aD5TdGF0dXM8L3RoPgorICAgICAgICA8dGggd2lkdGg9IjgwJSI+VHlwZTwvdGg+CisgICAgICAgIDx0aCBub3dyYXA9Im5vd3JhcCI+VGltZShzKTwvdGg+CisgICAgPC90cj4KKzwveHNsOnRlbXBsYXRlPgorCisKKzwhLS0gY2xhc3MgaW5mb3JtYXRpb24gLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJ0ZXN0c3VpdGUiIG1vZGU9InByaW50LnRlc3QiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDwhLS0gc2V0IGEgbmljZSBjb2xvciBkZXBlbmRpbmcgaWYgdGhlcmUgaXMgYW4gZXJyb3IvZmFpbHVyZSAtLT4KKyAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgICAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBmYWlsdXJlc1suJmd0OyAwXSI+RmFpbHVyZTwveHNsOndoZW4+CisgICAgICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9IkBlcnJvcnNbLiZndDsgMF0iPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorCisgICAgICAgIDwhLS0gcHJpbnQgdGVzdHN1aXRlIGluZm9ybWF0aW9uIC0tPgorICAgICAgICA8dGQ+PGEgaHJlZj0iI3tAbmFtZX0iPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIvPjwvYT48L3RkPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB0ZXN0cyIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGVycm9ycyIvPjwvdGQ+CisgICAgICAgIDx0ZD48eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGZhaWx1cmVzIi8+PC90ZD4KKyAgICAgICAgPHRkPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAc2tpcHBlZCIgLz48L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICAgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0idmFsdWUiIHNlbGVjdD0iQHRpbWUiLz4KKyAgICAgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkB0aW1lc3RhbXAiLz48L3RkPgorICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAaG9zdG5hbWUiLz48L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBtYXRjaD0idGVzdGNhc2UiIG1vZGU9InByaW50LnRlc3QiPgorICAgIDx0ciB2YWxpZ249InRvcCI+CisgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImNsYXNzIj4KKyAgICAgICAgICAgIDx4c2w6Y2hvb3NlPgorICAgICAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJmYWlsdXJlIHwgZXJyb3IiPkVycm9yPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPC94c2w6YXR0cmlidXRlPgorICAgICAgICA8dGQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+PC90ZD4KKyAgICAgICAgPHhzbDpjaG9vc2U+CisgICAgICAgICAgICA8eHNsOndoZW4gdGVzdD0iZmFpbHVyZSI+CisgICAgICAgICAgICAgICAgPHRkPkZhaWx1cmU8L3RkPgorICAgICAgICAgICAgICAgIDx0ZD48eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImZhaWx1cmUiLz48L3RkPgorICAgICAgICAgICAgPC94c2w6d2hlbj4KKyAgICAgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJlcnJvciI+CisgICAgICAgICAgICAgICAgPHRkPkVycm9yPC90ZD4KKyAgICAgICAgICAgICAgICA8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJlcnJvciIvPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDp3aGVuPgorICAgICAgICAgICAgPHhzbDp3aGVuIHRlc3Q9InNraXBwZWQiPgorICAgICAgICAgICAgCTx0ZD5Ta2lwcGVkPC90ZD4KKyAgICAgICAgICAgIAk8dGQ+PHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJza2lwcGVkIi8+PC90ZD4KKyAgICAgICAgICAgIDwveHNsOndoZW4+CisgICAgICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgICAgICA8dGQ+U3VjY2VzczwvdGQ+CisgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgICAgIDwveHNsOmNob29zZT4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImRpc3BsYXktdGltZSI+CisgICAgICAgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InZhbHVlIiBzZWxlY3Q9IkB0aW1lIi8+CisgICAgICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3hzbDp0ZW1wbGF0ZT4KKworCis8eHNsOnRlbXBsYXRlIG1hdGNoPSJmYWlsdXJlIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImVycm9yIj4KKyAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyIvPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9InNraXBwZWQiPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LWZhaWx1cmVzIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPCEtLSBTdHlsZSBmb3IgdGhlIGVycm9yLCBmYWlsdXJlIGFuZCBza2lwcGVkIGluIHRoZSB0ZXN0Y2FzZSB0ZW1wbGF0ZSAtLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS1mYWlsdXJlcyI+CisgICAgPHhzbDpjaG9vc2U+CisgICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJub3QoQG1lc3NhZ2UpIj5OL0E8L3hzbDp3aGVuPgorICAgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbWVzc2FnZSIvPgorICAgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorICAgIDwhLS0gZGlzcGxheSB0aGUgc3RhY2t0cmFjZSAtLT4KKyAgICA8Y29kZT4KKyAgICAgICAgPGJyLz48YnIvPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id29yZCIgc2VsZWN0PSIuIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9jb2RlPgorICAgIDwhLS0gdGhlIGxhdGVyIGlzIGJldHRlciBidXQgbWlnaHQgYmUgcHJvYmxlbWF0aWMgZm9yIG5vbi0yMSIgbW9uaXRvcnMuLi4gLS0+CisgICAgPCEtLXByZT48eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIvPjwvcHJlLS0+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJKUy1lc2NhcGUiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0ic3RyaW5nIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJ0bXAxIiBzZWxlY3Q9InJlcGxhY2UoJHN0cmluZywnXFwnLCdcXFxcJykiLz4KKyAgICA8eHNsOnZhcmlhYmxlIG5hbWU9InRtcDIiIHNlbGVjdD0icmVwbGFjZSgkdG1wMSwmcXVvdDsnJnF1b3Q7LCZxdW90O1xcJmFwb3M7JnF1b3Q7KSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG1wMyIgc2VsZWN0PSJyZXBsYWNlKCR0bXAyLCZxdW90OyYjMTA7JnF1b3Q7LCdcXG4nKSIvPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0idG1wNCIgc2VsZWN0PSJyZXBsYWNlKCR0bXAzLCZxdW90OyYjMTM7JnF1b3Q7LCdcXHInKSIvPgorICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkdG1wNCIvPgorPC94c2w6dGVtcGxhdGU+CisKKworPCEtLQorICAgIHRlbXBsYXRlIHRoYXQgd2lsbCBjb252ZXJ0IGEgY2FycmlhZ2UgcmV0dXJuIGludG8gYSBiciB0YWcKKyAgICBAcGFyYW0gd29yZCB0aGUgdGV4dCBmcm9tIHdoaWNoIHRvIGNvbnZlcnQgQ1IgdG8gQlIgdGFnCistLT4KKzx4c2w6dGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJ3b3JkIi8+CisgICAgPHhzbDpwYXJhbSBuYW1lPSJzcGxpdGxpbWl0Ij4zMjwveHNsOnBhcmFtPgorICAgIDx4c2w6dmFyaWFibGUgbmFtZT0ic2Vjb25kaGFsZnN0YXJ0aW5kZXgiIHNlbGVjdD0iKHN0cmluZy1sZW5ndGgoJHdvcmQpKyhzdHJpbmctbGVuZ3RoKCR3b3JkKSBtb2QgMikpIGRpdiAyIi8+CisgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWNvbmRoYWxmd29yZCIgc2VsZWN0PSJzdWJzdHJpbmcoJHdvcmQsICRzZWNvbmRoYWxmc3RhcnRpbmRleCkiLz4KKyAgICA8IS0tIFdoZW4gd29yZCBpcyB2ZXJ5IGJpZywgYSByZWN1cnNpdmUgcmVwbGFjZSBpcyB2ZXJ5IGhlYXAvc3RhY2sgZXhwZW5zaXZlLCBzbyBzdWJkaXZpZGUgb24gbGluZSBicmVhayBhZnRlciBtaWRkbGUgb2Ygc3RyaW5nIC0tPgorICAgIDx4c2w6Y2hvb3NlPgorICAgICAgPHhzbDp3aGVuIHRlc3Q9IihzdHJpbmctbGVuZ3RoKCR3b3JkKSA+ICRzcGxpdGxpbWl0KSBhbmQgKGNvbnRhaW5zKCRzZWNvbmRoYWxmd29yZCwgJyYjeGE7JykpIj4KKyAgICAgICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJzZWNvbmRoYWxmZW5kIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkc2Vjb25kaGFsZndvcmQsICcmI3hhOycpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RoYWxmbGVuIiBzZWxlY3Q9InN0cmluZy1sZW5ndGgoJHdvcmQpIC0gc3RyaW5nLWxlbmd0aCgkc2Vjb25kaGFsZndvcmQpIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RoYWxmd29yZCIgc2VsZWN0PSJzdWJzdHJpbmcoJHdvcmQsIDEsICRmaXJzdGhhbGZsZW4pIi8+CisgICAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iZmlyc3RoYWxmZW5kIiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUoJHNlY29uZGhhbGZ3b3JkLCAnJiN4YTsnKSIvPgorICAgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYnItcmVwbGFjZSI+CisgICAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9IndvcmQiIHNlbGVjdD0iY29uY2F0KCRmaXJzdGhhbGZ3b3JkLCRmaXJzdGhhbGZlbmQpIi8+CisgICAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICAgIDxici8+CisgICAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJici1yZXBsYWNlIj4KKyAgICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0id29yZCIgc2VsZWN0PSIkc2Vjb25kaGFsZmVuZCIvPgorICAgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgPC94c2w6d2hlbj4KKyAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucygkd29yZCwgJyYjeGE7JykiPgorICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSgkd29yZCwgJyYjeGE7JykiLz4KKyAgICAgICAgPGJyLz4KKyAgICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJyLXJlcGxhY2UiPgorICAgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJ3b3JkIiBzZWxlY3Q9InN1YnN0cmluZy1hZnRlcigkd29yZCwgJyYjeGE7JykiLz4KKyAgICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDwveHNsOndoZW4+CisgICAgICA8eHNsOm90aGVyd2lzZT4KKyAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiR3b3JkIi8+CisgICAgICA8L3hzbDpvdGhlcndpc2U+CisgICAgPC94c2w6Y2hvb3NlPgorPC94c2w6dGVtcGxhdGU+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iZGlzcGxheS10aW1lIj4KKyAgICA8eHNsOnBhcmFtIG5hbWU9InZhbHVlIi8+CisgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImZvcm1hdC1udW1iZXIoJHZhbHVlLCcwLjAwMCcpIi8+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPHhzbDp0ZW1wbGF0ZSBuYW1lPSJkaXNwbGF5LXBlcmNlbnQiPgorICAgIDx4c2w6cGFyYW0gbmFtZT0idmFsdWUiLz4KKyAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iZm9ybWF0LW51bWJlcigkdmFsdWUsJzAuMDAlJykiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9qdW5pdC1ub2ZyYW1lcy54c2wgYi9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLnhzbAppbmRleCBmYTNhYzNlLi4wZDAzZWIzIDEwMDY0NAotLS0gYS9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLnhzbAorKysgYi9zcmMvZXRjL2p1bml0LW5vZnJhbWVzLnhzbApAQCAtMTMsNyArMTMsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMTgsNyArMzE4LDcgQEAKICAgICA8dGFibGUgd2lkdGg9IjEwMCUiPgogICAgIDx0cj4KICAgICAgICAgPHRkIGFsaWduPSJsZWZ0Ij48L3RkPgotICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy5qdW5pdC5vcmcnPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2FudC5hcGFjaGUub3JnL2FudCc+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cHM6Ly93d3cuanVuaXQub3JnJz5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9J2h0dHBzOi8vYW50LmFwYWNoZS5vcmcvYW50Jz5BbnQ8L2E+LjwvdGQ+CiAgICAgPC90cj4KICAgICA8L3RhYmxlPgogICAgIDxociBzaXplPSIxIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL2xvZy54c2wgYi9zcmMvZXRjL2xvZy54c2wKaW5kZXggNTA0MDk5My4uOWZlNjBmYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9sb2cueHNsCisrKyBiL3NyYy9ldGMvbG9nLnhzbApAQCAtOSw3ICs5LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTA5LDEyICsxMDksMTIgQEAKICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICA8dHI+CiAgICAgICA8dGQgdmFsaWduPSJ0b3AiIGNsYXNzPSJiYW5uZXJjZWxsIj4KLSAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy8iPgotICAgICAgICA8aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWx0PSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CisgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvaW1hZ2VzL2dyb3VwLWxvZ28uZ2lmIiBhbHQ9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmciIGFsaWduPSJsZWZ0IiBib3JkZXI9IjAiLz4KICAgICAgICAgPC9hPgogICAgICAgPC90ZD4KICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodDt2ZXJ0aWNhbC1hbGlnbjpib3R0b20iPgotICAgICAgICA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BcGFjaGUgQW50PC9hPgorICAgICAgICA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnLyI+QXBhY2hlIEFudDwvYT4KICAgICAgIDwvdGQ+CiAgICAgPC90cj4KICAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9tYW5pZmVzdCBiL3NyYy9ldGMvbWFuaWZlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGJjMGYuLjAwMDAwMDAKLS0tIGEvc3JjL2V0Yy9tYW5pZmVzdAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9tYXVkaXQtZnJhbWVzLnhzbCBiL3NyYy9ldGMvbWF1ZGl0LWZyYW1lcy54c2wKaW5kZXggYzgxZjhkYy4uYWEzNmIzOCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9tYXVkaXQtZnJhbWVzLnhzbAorKysgYi9zcmMvZXRjL21hdWRpdC1mcmFtZXMueHNsCkBAIC0xMyw3ICsxMyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM0MywxMSArMzQzLDExIEBACiAgICAgICAgIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeTsiPgogICAgICAgICBOb3RlOiBSdWxlcyBjaGVja2VkIGhhdmUgb3JpZ2luYXRlZCBmcm9tIHN0eWxlIGd1aWRlbGluZXMgc3VnZ2VzdGVkIGJ5IHRoZSBsYW5ndWFnZSBkZXNpZ25lcnMsCiAgICAgICAgIGV4cGVyaWVuY2UgZnJvbSB0aGUgSmF2YSBkZXZlbG9wbWVudCBjb21tdW5pdHkgYW5kIGluc2l0ZSBleHBlcmllbmNlLiBWaW9sYXRpb25zIGFyZSBnZW5lcmFsbHkKLSAgICAgICAgcmVwb3J0ZWQgd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL2pscy9zZWNvbmRfZWRpdGlvbi9odG1sL2pUT0MuZG9jLmh0bWwiPkphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbnM8L2E+IChKTFMgeC54LngpCisgICAgICAgIHJlcG9ydGVkIHdpdGggYSByZWZlcmVuY2UgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS9zcGVjcy8iPkphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbnM8L2E+IChKTFMgeC54LngpCiAgICAgICAgIGFuZCBNZXRhbWF0YSBBdWRpdCBydWxlcyAoeC54KS4KICAgICAgICAgUGxlYXNlIGNvbnN1bHQgdGhlc2UgZG9jdW1lbnRzIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHZpb2xhdGlvbnMuCiAgICAgICAgIDxwLz4KLSAgICAgICAgUnVsZXMgY2hlY2tlZCBhbHNvIGVuZm9yY2UgYWRoZXJlbmNlIHRvIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sIj5TdW4gSmF2YSBjb2RpbmcgZ3VpZGVsaW5lczwvYT4gaW4gdXNlIGF0IEpha2FydGEuCisgICAgICAgIFJ1bGVzIGNoZWNrZWQgYWxzbyBlbmZvcmNlIGFkaGVyZW5jZSB0byA8YSBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvY29kZWNvbnZ0b2MtMTM2MDU3Lmh0bWwiPlN1biBKYXZhIGNvZGluZyBndWlkZWxpbmVzPC9hPiBpbiB1c2UgYXQgSmFrYXJ0YS4KICAgICAgICAgPHAvPgogICAgICAgICBPbmUgc2hvdWxkIG5vdGUgdGhhdCB0aGVzZSB2aW9sYXRpb25zIGRvIG5vdCBuZWNlc3NhcnkgdW5kZXJsaW5lIGVycm9ycyBidXQgc2hvdWxkIGJlIHVzZWQKICAgICAgICAgYXMgYW4gaW5kaWNhdGlvbiBmb3IgPGk+cG9zc2libGU8L2k+IGVycm9ycy4gQXMgYWx3YXlzLCB1c2UgeW91ciBiZXN0IGp1ZGdtZW50IGFuZCByZXZpZXcKQEAgLTQzOCwxNCArNDM4LDE0IEBACiAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgd2lkdGg9IjEwMCUiPgogICA8dHI+CiAgICAgPHRkIGNsYXNzPSJiYW5uZXJjZWxsIiByb3dzcGFuPSIyIj4KLSAgICAgIDxhIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvIj4KLSAgICAgIDxpbWcgc3JjPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2ltYWdlcy9qYWthcnRhLWxvZ28uZ2lmIiBhbHQ9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmciIGFsaWduPSJsZWZ0IiBib3JkZXI9IjAiLz4KKyAgICAgIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj4KKyAgICAgIDxpbWcgc3JjPSJodHRwczovL2FudC5hcGFjaGUub3JnL2ltYWdlcy9ncm91cC1sb2dvLmdpZiIgYWx0PSJodHRwczovL2FudC5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CiAgICAgICA8L2E+CiAgICAgPC90ZD4KICAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgQXVkaXQ8L2gyPjwvdGQ+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDx0cj4KLSAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cDovL3d3dy53ZWJnYWluLmNvbS9wcm9kdWN0cy9xdWFsaXR5X2FuYWx5emVyLyc+V2ViZ2FpbiBRQS9NZXRhbWF0YSBBdWRpdDwvYT4gYW5kIDxhIGhyZWY9J2h0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcnPkFudDwvYT4uPC90ZD4KKyAgICAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggV2ViZ2FpbiBRQS9NZXRhbWF0YSBBdWRpdCBhbmQgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZyc+QW50PC9hPi48L3RkPgogICAgICAgICA8L3RyPgogICA8L3RhYmxlPgogICAgIDxociBzaXplPSIxIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wgYi9zcmMvZXRjL21tZXRyaWNzLWZyYW1lcy54c2wKaW5kZXggMmIwZjZiOC4uMDI2MTZiZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9tbWV0cmljcy1mcmFtZXMueHNsCisrKyBiL3NyYy9ldGMvbW1ldHJpY3MtZnJhbWVzLnhzbApAQCAtMTUsNyArMTUsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC03ODIsMTQgKzc4MiwxNCBAQAogICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgPHRyPgogICAgIDx0ZCBjbGFzcz0iYmFubmVyY2VsbCIgcm93c3Bhbj0iMiI+Ci0gICAgICA8YSBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnLyI+Ci0gICAgICA8aW1nIHNyYz0iaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9pbWFnZXMvamFrYXJ0YS1sb2dvLmdpZiIgYWx0PSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnIiBhbGlnbj0ibGVmdCIgYm9yZGVyPSIwIi8+CisgICAgICA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnLyI+CisgICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbWFnZXMvZ3JvdXAtbG9nby5naWYiIGFsdD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZyIgYWxpZ249ImxlZnQiIGJvcmRlcj0iMCIvPgogICAgICAgPC9hPgogICAgIDwvdGQ+CiAgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij48aDI+U291cmNlIENvZGUgTWV0cmljczwvaDI+PC90ZD4KICAgICA8L3RyPgogICAgIDx0cj4KLSAgICA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSdodHRwOi8vd3d3LndlYmdhaW4uY29tL3Byb2R1Y3RzL3F1YWxpdHlfYW5hbHl6ZXIvJz5XZWJnYWluIFFBL01ldGFtYXRhIE1ldHJpY3M8L2E+IGFuZCA8YSBocmVmPSdodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+CisgICAgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggV2ViZ2FpbiBRQS9NZXRhbWF0YSBNZXRyaWNzIGFuZCA8YSBocmVmPSdodHRwczovL2FudC5hcGFjaGUub3JnJz5BbnQ8L2E+LjwvdGQ+CiAgICAgPC90cj4KICAgPC90YWJsZT4KICAgPGhyIHNpemU9IjEiLz4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcGVyZm9ybWFuY2UvYnVpbGQueG1sIGIvc3JjL2V0Yy9wZXJmb3JtYW5jZS9idWlsZC54bWwKaW5kZXggYzNlM2VkOS4uZjVmMjBmOSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wZXJmb3JtYW5jZS9idWlsZC54bWwKKysrIGIvc3JjL2V0Yy9wZXJmb3JtYW5jZS9idWlsZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvcGVyZm9ybWFuY2UvZGlyc2Nhbm5lci54bWwgYi9zcmMvZXRjL3BlcmZvcm1hbmNlL2RpcnNjYW5uZXIueG1sCmluZGV4IDU2MjhhNDYuLjQ1NzM4MzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcGVyZm9ybWFuY2UvZGlyc2Nhbm5lci54bWwKKysrIGIvc3JjL2V0Yy9wZXJmb3JtYW5jZS9kaXJzY2FubmVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjcsNyArNjcsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL1JFQURNRS50eHQgYi9zcmMvZXRjL3BvbXMvUkVBRE1FLnR4dAppbmRleCAyNmZjMWI1Li5kMjgyYTZiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvUkVBRE1FLnR4dAorKysgYi9zcmMvZXRjL3BvbXMvUkVBRE1FLnR4dApAQCAtNDYsNCArNDYsNCBAQAogUkVGRVJFTkNFUyA6CiAKIGFib3V0IHNraXBwaW5nIHRlc3RzIDoKLWh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tc3VyZWZpcmUtcGx1Z2luL2V4YW1wbGVzL3NraXBwaW5nLXRlc3QuaHRtbAoraHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tc3VyZWZpcmUtcGx1Z2luL2V4YW1wbGVzL3NraXBwaW5nLXRlc3QuaHRtbApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1hbnRsci9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1hbnRsci9wb20ueG1sCmluZGV4IDY3ZWQ5MDguLmNkOWY1OWEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtYW50bHIvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWFudGxyL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDIyICsxOCwyMiBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgogICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1hbnRscjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBBTlRMUjwvbmFtZT4KICAgPGRlc2NyaXB0aW9uPmFudGxyIHNwZWNpZmljIHRhc2suCiAgICAgVGhlIGltcGxlbWVudGF0aW9uIGZvcmtzIGEgamF2YSBwcm9jZXNzLCB0aGVyZWZvcmUgdGhlIGFudGxyIGphciBmaWxlIGlzIG9ubHkgbmVlZGVkIGF0IHJ1bnRpbWU8L2Rlc2NyaXB0aW9uPgpAQCAtNDEsMTUgKzQxLDE0IEBACiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8IS0tIGFkZCBhIGRlcGVuZGVuY3kgd2l0aCBhbnRsciAyLjcuMiBjb25zaXN0ZW50IHdpdGggbGlicmFyaWVzLnByb3BlcnRpZXMgYW50bHIgMi43LjYgaXMgYWxzbyBhdmFpbGFibGUgb24gaWJpYmxpby0tPgogICAgICAgPGdyb3VwSWQ+YW50bHI8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNy4yPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Mi43Ljc8L3ZlcnNpb24+CiAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CiAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgpAQCAtNjMsMTEgKzYyLDUyIEBACiAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFIqPC9pbmNsdWRlPgogICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPHRlc3RJbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSKjwvaW5jbHVkZT4KKyAgICAgICAgICA8L3Rlc3RJbmNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YmFzZWRpcj4uLi8uLi8uLi8uLjwvYmFzZWRpcj4KKyAgICAgICAgICA8d29ya2luZ0RpcmVjdG9yeT4uLi8uLi8uLi8uLjwvd29ya2luZ0RpcmVjdG9yeT4KKyAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+YW50LnRlc3QuYmFzZWRpci5pZ25vcmU8L25hbWU+CisgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdHMvanVuaXQ8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KICAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWJjZWwvcG9tLnhtbCBiL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWJjZWwvcG9tLnhtbAppbmRleCA0ZjE0YjM2Li41MzIwYWQyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1iY2VsL3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtYmNlbC9wb20ueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwzNCArMTgsMzQgQEAKIDwhLS0KICAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCiAgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KLSAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKIC0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPgorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtYXBhY2hlLWJjZWw8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgQkNFTDwvbmFtZT4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmJjZWw8L2dyb3VwSWQ+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmJjZWw8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5iY2VsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+NS4xPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+Ni40LjE8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KQEAgLTU5LDExICs1OSw1MiBAQAogICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlcio8L2luY2x1ZGU+CiAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsLyo8L2luY2x1ZGU+CiAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICA8dGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldCo8L2V4Y2x1ZGU+CisgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGJhc2VkaXI+Li4vLi4vLi4vLi48L2Jhc2VkaXI+CisgICAgICAgICAgPHdvcmtpbmdEaXJlY3Rvcnk+Li4vLi4vLi4vLi48L3dvcmtpbmdEaXJlY3Rvcnk+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmFudC50ZXN0LmJhc2VkaXIuaWdub3JlPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgorICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi48L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgogICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5PgogICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtYnNmL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1ic2YvcG9tLnhtbAppbmRleCA4Y2Y3NTE3Li4xZWFlM2U4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1ic2YvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1ic2YvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjggKzE4LDI4IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPgogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1ic2Y8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgQlNGPC9uYW1lPgogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgpAQCAtNTYsMTUgKzU2LDM2IEBACiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NyaXB0KjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsLypTY3JpcHQqPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHQqPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9TY3JpcHQqPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXIuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvU2NyaXB0UnVubmVyLmphdmE8L2luY2x1ZGU+CiAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+CiAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtbG9nNGovcG9tLnhtbCBiL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLWxvZzRqL3BvbS54bWwKaW5kZXggMDhhODg2OC4uNTYxZjZiZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtbG9nNGovcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1sb2c0ai9wb20ueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwyNyArMTgsMjcgQEAKIDwhLS0KICAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCiAgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KLSAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKIC0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1sb2c0ajwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBMb2c0SjwvbmFtZT4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KQEAgLTU5LDcgKzU5LDMxIEBACiAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+CiAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtb3JvL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1vcm8vcG9tLnhtbAppbmRleCAxZjc0ZGUwLi5hNzE0MDc0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1vcm8vcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1vcm8vcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjggKzE4LDI4IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPgogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1vcm88L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgQXBhY2hlIE9ybzwvbmFtZT4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KQEAgLTQ4LDEyICs0OCw2IEBACiAgICAgICA8dmVyc2lvbj4yLjAuODwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+NC4xMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CkBAIC03MCw3ICs2NCwzMSBAQAogICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdHMvanVuaXQ8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXJlZ2V4cC9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVnZXhwL3BvbS54bWwKaW5kZXggYmQwNWQ0ZS4uMjdmNjAzMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVnZXhwL3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVnZXhwL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDI3ICsxOCwyNyBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1hcGFjaGUtcmVnZXhwPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPG5hbWU+QXBhY2hlIEFudCArIEFwYWNoZSBSZWdleHA8L25hbWU+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC01NywxMSArNTcsMzggQEAKICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwKjwvaW5jbHVkZT4KICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgIDx0ZXN0SW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwKjwvaW5jbHVkZT4KKyAgICAgICAgICA8L3Rlc3RJbmNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdHMvanVuaXQ8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KICAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXJlc29sdmVyL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS1yZXNvbHZlci9wb20ueG1sCmluZGV4IGI2MzNkNzQuLmI4MjcxZGQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXJlc29sdmVyL3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1hcGFjaGUtcmVzb2x2ZXIvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjcgKzE4LDI3IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Cit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPgogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS1yZXNvbHZlcjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBBcGFjaGUgUmVzb2x2ZXI8L25hbWU+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC01NSwxMSArNTUsMzUgQEAKICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci8qKjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyLyouamF2YTwvaW5jbHVkZT4KICAgICAgICAgICA8L2luY2x1ZGVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgogICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LWFwYWNoZS14YWxhbjIvcG9tLnhtbCBiL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXhhbGFuMi9wb20ueG1sCmluZGV4IDA4YWRmZWQuLmQ3ZDJjYzAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXhhbGFuMi9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtYXBhY2hlLXhhbGFuMi9wb20ueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwyOCArMTgsMjggQEAKIDwhLS0KICAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCiAgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KLSAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKIC0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50LWFwYWNoZS14YWxhbjI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgWGFsYW4gMjwvbmFtZT4KICAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIFhhbGFuMi1zcGVjaWZpYyBmZWF0dXJlczwvZGVzY3JpcHRpb24+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC01Miw0MSArNTIsNzYgQEAKICAgPGJ1aWxkPgogICAgIDxwbHVnaW5zPgogICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5jcmVhdGUtdGltZXN0YW1wLWZpbGU8L2lkPgotICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9Ii8+Ci0gICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3hzbCI+Ci0gICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5zb3VyY2VEaXJlY3Rvcnl9Ly4uL2V0YyI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Imp1bml0LWZyYW1lcy54c2wiLz4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtbm9mcmFtZXMueHNsIi8+Ci0gICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PiAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwvdGFza3M+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW4yVHJhY2VTdXBwb3J0KjwvaW5jbHVkZT4KICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgIDx0ZXN0SW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbio8L2luY2x1ZGU+CisgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGJhc2VkaXI+Li4vLi4vLi4vLi48L2Jhc2VkaXI+CisgICAgICAgICAgPHdvcmtpbmdEaXJlY3Rvcnk+Li4vLi4vLi4vLi48L3dvcmtpbmdEaXJlY3Rvcnk+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmFudC50ZXN0LmJhc2VkaXIuaWdub3JlPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMS4wPC92ZXJzaW9uPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8ZW5jb2Rpbmc+SVNPLTg4NTktMTwvZW5jb2Rpbmc+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDx0ZXN0UmVzb3VyY2VzPgorICAgICAgPHRlc3RSZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvZXRjL3Rlc3RjYXNlczwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+dGFza2RlZnMvb3B0aW9uYWwveGFsYW4qPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPnRhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uKjwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICA8L3Rlc3RSZXNvdXJjZXM+CiAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgotICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RzL2p1bml0PC90ZXN0U291cmNlRGlyZWN0b3J5PgogICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CiAgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+CiAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LWNvbW1vbnMtbG9nZ2luZy9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1jb21tb25zLWxvZ2dpbmcvcG9tLnhtbAppbmRleCA5MGI3YWVhLi4xZjE1YzQ5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWNvbW1vbnMtbG9nZ2luZy9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1sb2dnaW5nL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDI4ICsxOCwyOCBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgQ29tbW9ucyBMb2dnaW5nPC9uYW1lPgogICA8ZGVzY3JpcHRpb24+QW50IExpc3RlbmVyIGJhc2VkIG9uIGNvbW1vbnMtbG9nZ2luZzwvZGVzY3JpcHRpb24+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC02MCw3ICs2MCwzMSBAQAogICAgICAgICAgIDwvaW5jbHVkZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi48L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CiAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgogICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1uZXQvcG9tLnhtbCBiL3NyYy9ldGMvcG9tcy9hbnQtY29tbW9ucy1uZXQvcG9tLnhtbAppbmRleCAwYzIyMDhmLi5iOTUyYWZiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWNvbW1vbnMtbmV0L3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1jb21tb25zLW5ldC9wb20ueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwzNCArMTgsMzQgQEAKIDwhLS0KICAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCiAgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KLSAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKIC0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPgorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtY29tbW9ucy1uZXQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgQ29tbW9ucyBOZXQ8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj5mdHAsIHJleGVjIGFuZCB0ZWxuZXQgdGFza3M8L2Rlc2NyaXB0aW9uPgogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1uZXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW5ldDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjMuNjwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgpAQCAtNjUsOSArNjUsNDMgQEAKICAgICAgICAgICA8L3Rlc3RJbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YmFzZWRpcj4uLi8uLi8uLi8uLjwvYmFzZWRpcj4KKyAgICAgICAgICA8d29ya2luZ0RpcmVjdG9yeT4uLi8uLi8uLi8uLjwvd29ya2luZ0RpcmVjdG9yeT4KKyAgICAgICAgICA8IS0tIHRlc3RzIGFzc3VtZSBhbiBGVFAgc2VydmVyIGxpc3RlbmluZyBvbiBsb2NhbGhvc3QgLS0+CisgICAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgogICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5PgogICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1pbWFnZWlvL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWltYWdlaW8vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWRkOTkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1pbWFnZWlvL3BvbS54bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgorICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgPHBhcmVudD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPC9wYXJlbnQ+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+YW50LWltYWdlaW88L2FydGlmYWN0SWQ+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPG5hbWU+QXBhY2hlIEFudCArIEltYWdlSU88L25hbWU+CisgIDxkZXNjcmlwdGlvbj5pbWFnZWlvIHRhc2sgYW5kIGNvcnJlc3BvbmRpbmcgdHlwZXMuPC9kZXNjcmlwdGlvbj4KKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9JbWFnZUlPVGFzay5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby8qPC9pbmNsdWRlPgorICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPHRlc3RJbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlSU9UZXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGJhc2VkaXI+Li4vLi4vLi4vLi48L2Jhc2VkaXI+CisgICAgICAgICAgPHdvcmtpbmdEaXJlY3Rvcnk+Li4vLi4vLi4vLi48L3dvcmtpbmdEaXJlY3Rvcnk+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmFudC50ZXN0LmJhc2VkaXIuaWdub3JlPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KKyAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RzL2p1bml0PC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+CisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LWphaS9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1qYWkvcG9tLnhtbAppbmRleCA5OTllMGFjLi5lMzBjMWEwIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWphaS9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtamFpL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDIyICsxOCwyMiBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgogICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1qYWk8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgSkFJPC9uYW1lPgogICA8ZGVzY3JpcHRpb24+aW1hZ2UgdGFzayBhbmQgY29ycmVzcG9uZGluZyB0eXBlcy4KICAgPC9kZXNjcmlwdGlvbj4KQEAgLTQxLDcgKzQxLDcgQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KQEAgLTU3LDExICs1NywxMSBAQAogICA8L2RlcGVuZGVuY2llcz4KICAgPCEtLSBDZW50cmFsIGhhcyBqYXZheC5tZWRpYTpqYWktY29yZToxLjEuMyBidXQgb25seSBjb20uc3VuLm1lZGlhOmphaS1jb2RlYzoxLjEuMl8wMSAtLT4KICAgPHJlcG9zaXRvcmllcz4KLSAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5qYm9zczwvaWQ+Ci0gICAgICAgICAgPG5hbWU+SkJvc3M8L25hbWU+Ci0gICAgICAgICAgPHVybD5odHRwczovL3JlcG9zaXRvcnkuamJvc3Mub3JnL25leHVzL2NvbnRlbnQvZ3JvdXBzL3B1YmxpYy88L3VybD4KLSAgICAgIDwvcmVwb3NpdG9yeT4KKyAgICA8cmVwb3NpdG9yeT4KKyAgICAgIDxpZD5qYm9zczwvaWQ+CisgICAgICA8bmFtZT5KQm9zczwvbmFtZT4KKyAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5Lmpib3NzLm9yZy9uZXh1cy9jb250ZW50L2dyb3Vwcy9wdWJsaWMvPC91cmw+CisgICAgPC9yZXBvc2l0b3J5PgogICA8L3JlcG9zaXRvcmllcz4KICAgPGJ1aWxkPgogICAgIDxwbHVnaW5zPgpAQCAtNzAsMTQgKzcwLDU1IEBACiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvKjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlLmphdmE8L2luY2x1ZGU+CiAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS8qPC9pbmNsdWRlPgogICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgPHRlc3RJbmNsdWRlcz4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlVGVzdC5qYXZhPC9pbmNsdWRlPgorICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxiYXNlZGlyPi4uLy4uLy4uLy4uPC9iYXNlZGlyPgorICAgICAgICAgIDx3b3JraW5nRGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC93b3JraW5nRGlyZWN0b3J5PgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5hbnQudGVzdC5iYXNlZGlyLmlnbm9yZTwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgogICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5PgogICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1qYXZhbWFpbC9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1qYXZhbWFpbC9wb20ueG1sCmluZGV4IDU5MjEwZjEuLjYxZWQzNDEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtamF2YW1haWwvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWphdmFtYWlsL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDIxICsxOCwyMSBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKK3hzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1qYXZhbWFpbDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBKYXZhTWFpbDwvbmFtZT4KICAgPGRlc2NyaXB0aW9uPmltcGxlbWVudGF0aW9uIG9mIHRoZSBtYWlsIHRhc2sgYmFzZWQgb24gamF2YW1haWwuCiAgICAgUmVxdWlyZWQgdG8gc2VuZCBlbWFpbHMgdG8gU01UUCBzZXJ2ZXJzIHVzaW5nIHVzZXIvcGFzc3dvcmQgY29tYmluYXRpb25zCkBAIC00MSwxOCArNDEsMTggQEAKICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDwhLS0gVGhpcyBicmluZ3MgaW4gdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMuCi0gICAgICBTZWUgaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2phdmFtYWlsLyNEb3dubG9hZF9KYXZhTWFpbF9SZWxlYXNlIC0tPgorICAgICAgU2VlIGh0dHBzOi8vZWNsaXBzZS1lZTRqLmdpdGh1Yi5pby9tYWlsLyAtLT4KICAgICAgIDxncm91cElkPmNvbS5zdW4ubWFpbDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmphdmF4Lm1haWw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjUuNjwvdmVyc2lvbj4KKyAgICAgIDxhcnRpZmFjdElkPmpha2FydGEubWFpbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNi40PC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+IAorICA8L2RlcGVuZGVuY2llcz4KICAgPGJ1aWxkPgogICAgIDxwbHVnaW5zPgogICAgICAgPHBsdWdpbj4KQEAgLTY0LDcgKzY0LDMxIEBACiAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+CiAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1qZGVwZW5kL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWpkZXBlbmQvcG9tLnhtbAppbmRleCA5Y2I1MjQzLi4zMThmZmVjIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWpkZXBlbmQvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWpkZXBlbmQvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjIgKzE4LDIyIEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1qZGVwZW5kPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPG5hbWU+QXBhY2hlIEFudCArIEpEZXBlbmQ8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj50YXNrIGpkZXBlbmQgaW52b2tpbmcgdGhlIGpkZXBlbmQgcGFyc2VyLiBUaGVyZSBpcyBhbHNvIGEgdmVyc2lvbiAyLjkuMSBvZiB0aGUKICAgICBqZGVwZW5kIHBhcnNlciBhdmFpbGFibGUgb24gdGhlIG1hdmVuIHJlcG9zaXRvcnk8L2Rlc2NyaXB0aW9uPgpAQCAtNDEsNyArNDEsNyBAQAogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgpAQCAtNTgsMTMgKzU4LDU5IEBACiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC8qPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC88L2luY2x1ZGU+CiAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICA8dGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC88L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS88L2luY2x1ZGU+CisgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxiYXNlZGlyPi4uLy4uLy4uLy4uPC9iYXNlZGlyPgorICAgICAgICAgIDx3b3JraW5nRGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC93b3JraW5nRGlyZWN0b3J5PgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5idWlsZC50ZXN0cy52YWx1ZTwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5hbnQudGVzdC5iYXNlZGlyLmlnbm9yZTwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi48L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CiAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgotICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CisgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RzL2p1bml0PC90ZXN0U291cmNlRGlyZWN0b3J5PgogICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CiAgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+CiAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LWptZi9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1qbWYvcG9tLnhtbAppbmRleCAxNDhiYzA2Li5jMTFjMWYxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWptZi9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtam1mL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDI5ICsxOCwyOSBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtam1mPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPG5hbWU+QXBhY2hlIEFudCArIEpNRjwvbmFtZT4KICAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIHRoZSBzb3VuZCB0YXNrIGFuZCBhIHNvdW5kcGxheWVyIGxpc3RlbmVyCi0gICAgZG93bmxvYWQgdGhlIGRlcGVuZGVuY3kgZnJvbSBodHRwOi8vamF2YS5zdW4uY29tL3Byb2R1Y3RzL2phdmEtbWVkaWEvam1mLzwvZGVzY3JpcHRpb24+CisgICAgZG93bmxvYWQgdGhlIGRlcGVuZGVuY3kgZnJvbSBodHRwczovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2ptZi88L2Rlc2NyaXB0aW9uPgogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KQEAgLTU1LDcgKzU1LDMxIEBACiAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+CiAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1qc2NoL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWpzY2gvcG9tLnhtbAppbmRleCAxZGFiYmQ5Li44NjQ3MmY2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWpzY2gvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWpzY2gvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjEgKzE4LDIxIEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAoteHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Cit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1qc2NoPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPG5hbWU+QXBhY2hlIEFudCArIEpTY2g8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj5jb250YWlucyB0aGUgc3NoZXhlYyBhbmQgc2NwIHRhc2tzCiAgIDwvZGVzY3JpcHRpb24+CkBAIC00MCw3ICs0MCw3IEBACiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CkBAIC02NCw5ICs2NCw0NyBAQAogICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxiYXNlZGlyPi4uLy4uLy4uLy4uPC9iYXNlZGlyPgorICAgICAgICAgIDx3b3JraW5nRGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC93b3JraW5nRGlyZWN0b3J5PgorICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICA8bmFtZT5zY3AudG1wPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+JHtqYXZhLmlvLnRtcGRpcn08L3ZhbHVlPgorICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KLSAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgogICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5PgogICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfTwvZGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1qdW5pdC9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1qdW5pdC9wb20ueG1sCmluZGV4IDMxNDJmMzYuLmNlOGYyMTMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtanVuaXQvcG9tLnhtbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LWp1bml0L3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDM2ICsxOCw0OCBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtanVuaXQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50ICsgSlVuaXQ8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj5jb250YWlucyB0aGUganVuaXQgYW5kIGp1bmlycmVwb3J0IHRhc2tzPC9kZXNjcmlwdGlvbj4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+NC4xMzwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xMi4wPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnhhbGFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+eGFsYW48L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjcuMjwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CkBAIC01NSwyNCArNjcsMjQgQEAKICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5jcmVhdGUtdGltZXN0YW1wLWZpbGU8L2lkPgotICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICA8aWQ+Y29weS1qdW5pdC14c2w8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CiAgICAgICAgICAgICA8Z29hbHM+CiAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KICAgICAgICAgICAgIDwvZ29hbHM+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgIDxta2RpciBkaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9Ii8+CisgICAgICAgICAgICAgIDx0YXJnZXQ+CiAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3hzbCI+Ci0gICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5zb3VyY2VEaXJlY3Rvcnl9Ly4uL2V0YyI+CisgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5zY3JpcHRTb3VyY2VEaXJlY3Rvcnl9Ij4KICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtZnJhbWVzLnhzbCIvPgogICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1ub2ZyYW1lcy54c2wiLz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ianVuaXQtZnJhbWVzLXNheG9uLnhzbCIvPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1ub2ZyYW1lcy1zYXhvbi54c2wiLz4KICAgICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgICAgICAgICA8L2NvcHk+ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPC90YXNrcz4KKyAgICAgICAgICAgICAgPC90YXJnZXQ+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPC9leGVjdXRpb24+Ci0KICAgICAgICAgPC9leGVjdXRpb25zPgogICAgICAgPC9wbHVnaW4+CiAgICAgICA8cGx1Z2luPgpAQCAtODIsMTggKzk0LDk1IEBACiAgICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvKjwvaW5jbHVkZT4KICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIqPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9DdXN0b21KVW5pdDRUZXN0QWRhcHRlckNhY2hlKjwvZXhjbHVkZT4KLSAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgIDx0ZXN0SW5jbHVkZXM+CiAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC88L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZXhhbXBsZS9qdW5pdC88L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZXhhbXBsZS90YXNrcy8qLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZXhhbXBsZS90eXBlcy88L2luY2x1ZGU+CiAgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8IS0tIENhbm5vdCBleGNsdWRlIEpVbml0IDQtc3BlY2lmaWMgY2xhc3NlcyBmcm9tIGNvbXBpbGF0aW9uIGJlY2F1c2UgdGVzdHMgZGVwZW5kIG9uIHRoZW0gLS0+CisgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSo8L2V4Y2x1ZGU+CisgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGJhc2VkaXI+Li4vLi4vLi4vLi48L2Jhc2VkaXI+CisgICAgICAgICAgPHdvcmtpbmdEaXJlY3Rvcnk+Li4vLi4vLi4vLi48L3dvcmtpbmdEaXJlY3Rvcnk+CisgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmJ1aWxkLnRlc3RzLnZhbHVlPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vdGVzdGNhc2VzPC92YWx1ZT4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgIDxuYW1lPmFudC50ZXN0LmJhc2VkaXIuaWdub3JlPC9uYW1lPgorICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZXhhbXBsZS9qdW5pdC8qPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvKiQqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSB0ZXN0IGZhaWxzIGFzIGNsYXNzbG9hZGVycyBhcmUgZGlmZmVyZW50IHdoZW4gcnVuIHZpYSBNYXZlbiAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza1Rlc3QqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRDbGFzc0xvYWRlclRlc3QqPC9leGNsdWRlPgorICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDx0ZXN0UmVzb3VyY2VzPgorICAgICAgPHRlc3RSZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvZXRjL3Rlc3RjYXNlczwvZGlyZWN0b3J5PgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICA8aW5jbHVkZT50YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qKjwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT50YXNrZGVmcy9vcHRpb25hbC9qdW5pdC54bWw8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+dGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQueG1sPC9pbmNsdWRlPgorICAgICAgICAgPGluY2x1ZGU+YnVpbGRmaWxldGVzdC1iYXNlLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvdGVzdFJlc291cmNlPgorICAgICAgPHRlc3RSZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmM8L2RpcmVjdG9yeT4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPnRlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LypUZXN0LmphdmE8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RzL2p1bml0PC9kaXJlY3Rvcnk+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5vcmcvZXhhbXBsZS90YXNrcy8qLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvdGVzdFJlc291cmNlPgorICAgIDwvdGVzdFJlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy9tYWluPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RjYXNlczwvdGVzdFNvdXJjZURpcmVjdG9yeT4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdHMvanVuaXQ8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CisgICAgPHNjcmlwdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvZXRjPC9zY3JpcHRTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KICAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtanVuaXQ0L3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWp1bml0NC9wb20ueG1sCmluZGV4IGY5OTllYzAuLjhjODk3ZjQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvcG9tcy9hbnQtanVuaXQ0L3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1qdW5pdDQvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMzQgKzE4LDM0IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgICA8cGFyZW50PgogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDwvcGFyZW50PgogICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LWp1bml0NDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgIDxuYW1lPkFwYWNoZSBBbnQgKyBKVW5pdCA0PC9uYW1lPgogICAgIDxkZXNjcmlwdGlvbj5jb250YWlucyBKVW5pdCA0Lnggc3VwcG9ydDwvZGVzY3JpcHRpb24+CiAgICAgPGRlcGVuZGVuY2llcz4KICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgICAgICAgPHZlcnNpb24+NC4xMzwvdmVyc2lvbj4KICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgIDwvZGVwZW5kZW5jaWVzPgpAQCAtNjEsNyArNjEsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLypJZ25vcmVkKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgogICAgICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgogICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC1qdW5pdGxhdW5jaGVyL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LWp1bml0bGF1bmNoZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY4MDlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1qdW5pdGxhdW5jaGVyL3BvbS54bWwKQEAgLTAsMCArMSwxNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLQorICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KKyAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgorICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCistLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5hbnQtanVuaXRsYXVuY2hlcjwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPG5hbWU+QXBhY2hlIEFudCArIEpVbml0IDU8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPmNvbnRhaW5zIEpVbml0IDUueCBzdXBwb3J0PC9kZXNjcmlwdGlvbj4KKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0LnBsYXRmb3JtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtcGxhdGZvcm0tbGF1bmNoZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qdW5pdC5qdXBpdGVyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtanVwaXRlci1lbmdpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj41LjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qdW5pdC52aW50YWdlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQtdmludGFnZS1lbmdpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj41LjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8dGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci88L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyLzwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPC90ZXN0SW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxiYXNlZGlyPi4uLy4uLy4uLy4uPC9iYXNlZGlyPgorICAgICAgICAgICAgICAgICAgICA8d29ya2luZ0RpcmVjdG9yeT4uLi8uLi8uLi8uLjwvd29ya2luZ0RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQudGVzdHMudmFsdWU8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmFudC50ZXN0LmJhc2VkaXIuaWdub3JlPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdCBmYWlscyBhcyBjbGFzc2xvYWRlcnMgYXJlIGRpZmZlcmVudCB3aGVuIHJ1biB2aWEgTWF2ZW4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0pVbml0TGF1bmNoZXJUYXNrVGVzdCo8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8dGVzdFJlc291cmNlcz4KKyAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvZXRjL3Rlc3RjYXNlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+dGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmJ1aWxkZmlsZXRlc3QtYmFzZS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDwvdGVzdFJlc291cmNlPgorICAgICAgICA8L3Rlc3RSZXNvdXJjZXM+CisgICAgICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL3Rlc3RzL2p1bml0PC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH0vY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtbGF1bmNoZXIvcG9tLnhtbCBiL3NyYy9ldGMvcG9tcy9hbnQtbGF1bmNoZXIvcG9tLnhtbAppbmRleCBjNDM1ZGI5Li5hOWQzZTQ3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3BvbXMvYW50LWxhdW5jaGVyL3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1sYXVuY2hlci9wb20ueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwyMiArMTgsMjIgQEAKIDwhLS0KICAgVGhpcyBQT00gaGFzIGJlZW4gY3JlYXRlZCBtYW51YWxseSBieSB0aGUgQW50IERldmVsb3BtZW50IFRlYW0uCiAgIFBsZWFzZSBjb250YWN0IHVzIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGlzIFBPTS4KLSAgVVJMIDogaHR0cDovL2FudC5hcGFjaGUub3JnCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKIC0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHBzOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgogICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPgorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtbGF1bmNoZXI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8bmFtZT5BcGFjaGUgQW50IExhdW5jaGVyPC9uYW1lPgogICA8YnVpbGQ+CiAgICAgPHBsdWdpbnM+CkBAIC00NCwxNCArNDQsMzkgQEAKICAgICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvKi5qYXZhPC9pbmNsdWRlPgogICAgICAgICAgIDwvaW5jbHVkZXM+Ci0KKyAgICAgICAgICA8dGVzdEluY2x1ZGVzPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoLyouamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICA8L3Rlc3RJbmNsdWRlcz4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlcjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KKyAgICA8IS0tIHRlc3RzIGRlcGVuZCBvbiBBbnQgKE9zKSAtLT4KICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgotICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC1sYXVuY2hlci9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudC1sYXVuY2hlci90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+Ci0gICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvYW50LWxhdW5jaGVyPC9kaXJlY3Rvcnk+CisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KICAgPC9idWlsZD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9hbnQtbmV0cmV4eC9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC1uZXRyZXh4L3BvbS54bWwKaW5kZXggNmVlNWJiOC4uN2E2ZjZjMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC1uZXRyZXh4L3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL2FudC1uZXRyZXh4L3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDI5ICsxOCwyOSBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgoreHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmFudC1wYXJlbnQ8L2FydGlmYWN0SWQ+CiAgICAgPHJlbGF0aXZlUGF0aD4uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHVybD5odHRwOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPiAgCiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtbmV0cmV4eDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBOZXRSZXh4PC9uYW1lPgogICA8ZGVzY3JpcHRpb24+TmV0UmV4eEMgdGFzawotICAgIGRlcGVuZGVuY3kgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSBodHRwOi8vd3d3LmlibS5jb20vc29mdHdhcmUvYXdkdG9vbHMvbmV0cmV4eC9kb3dubG9hZC5odG1sPC9kZXNjcmlwdGlvbj4KKyAgICBkZXBlbmRlbmN5IGNhbiBiZSBkb3dubG9hZGVkIGZyb20gaHR0cHM6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9hd2R0b29scy9uZXRyZXh4L2Rvd25sb2FkLmh0bWw8L2Rlc2NyaXB0aW9uPgogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDwhLS0gUHJvY2Vzc2VkIHRvbyBlYXJseSwgYmVmb3JlIG1hdmVuLWFudHJ1bi1wbHVnaW4gZ2V0cyBhIGNoYW5jZSB0byB3b3JrOgpAQCAtNzAsMTcgKzcwLDMwIEBACiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CiAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPgogICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgPHRhcmdldD4KICAgICAgICAgICAgICAgICA8YW50IGRpcj0iJHtiYXNlZGlyfS8uLi8uLi8uLi8uLiIgYW50ZmlsZT0iZmV0Y2gueG1sIiB0YXJnZXQ9Im5ldHJleHgiPgogICAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlc3QiIHZhbHVlPSJvcHRpb25hbCIvPgogICAgICAgICAgICAgICAgIDwvYW50PgotICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICA8L3RhcmdldD4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDxnb2Fscz4KICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgpAQCAtODksNiArMTAyLDE2IEBACiAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgogICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KICAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgogICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LXN3aW5nL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LXN3aW5nL3BvbS54bWwKaW5kZXggMTBkZjkyMC4uMGI0YzU3MCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC1zd2luZy9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtc3dpbmcvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjkgKzE4LDI5IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC1zd2luZzwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgKyBTd2luZzwvbmFtZT4KICAgPGRlc2NyaXB0aW9uPmEgbGlzdGVuZXIgYW5kIGEgc3BsYXNoIHRhc2sgYmFzZWQgb24gU3dpbmc8L2Rlc2NyaXB0aW9uPgogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICA8L2RlcGVuZGVuY2llcz4KQEAgLTU1LDEyICs1NSwzNSBAQAogICAgICAgICAgIDwvaW5jbHVkZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPGFkZEV4dGVuc2lvbnM+dHJ1ZTwvYWRkRXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KKyAgICAgICAgICAgICAgPGFkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+CisgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgIDwvYXJjaGl2ZT4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CiAgICAgPC9wbHVnaW5zPgorICAgIDxyZXNvdXJjZXM+CisgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi48L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+CiAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgogICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0Y2FzZXM8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+CiAgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KICAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KICAgPC9idWlsZD4KLSAgCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50LXRlc3R1dGlsL3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50LXRlc3R1dGlsL3BvbS54bWwKaW5kZXggNjg1NzlmMy4uZmUzYWRjOSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC10ZXN0dXRpbC9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQtdGVzdHV0aWwvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMzUgKzE4LDM1IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4gIAorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+ICAKICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgIDxhcnRpZmFjdElkPmFudC10ZXN0dXRpbDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxuYW1lPkFwYWNoZSBBbnQgVGVzdCBVdGlsaXRpZXM8L25hbWU+CiAgIDxkZXNjcmlwdGlvbj50ZXN0IHV0aWxpdHkgY2xhc3NlczwvZGVzY3JpcHRpb24+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xNS1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KICAgICA8L2RlcGVuZGVuY3k+CiAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjQuMTI8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj40LjEzPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CkBAIC01Nyw3ICs1NywxMCBAQAogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVRlc3QqPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvQW50QXNzZXJ0KjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZSo8L2luY2x1ZGU+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9GaWxlVXRpbGl0aWVzKjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L01hZ2ljVGVzdE5hbWVzKjwvaW5jbHVkZT4KICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJUZXN0KjwvaW5jbHVkZT4KICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cFRlc3QqPC9pbmNsdWRlPgogICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QqPC9pbmNsdWRlPgpAQCAtNjUsMTAgKzY4LDMzIEBACiAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICA8YWRkRXh0ZW5zaW9ucz50cnVlPC9hZGRFeHRlbnNpb25zPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgorICAgICAgICAgICAgICA8YWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRTcGVjaWZpY2F0aW9uRW50cmllcz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KICAgICA8L3BsdWdpbnM+CisgICAgPHJlc291cmNlcz4KKyAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLjwvZGlyZWN0b3J5PgorICAgICAgICA8dGFyZ2V0UGF0aD5NRVRBLUlORjwvdGFyZ2V0UGF0aD4KKyAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgIDxpbmNsdWRlPkxJQ0VOU0U8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+Tk9USUNFPC9pbmNsdWRlPgorICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgPC9yZXNvdXJjZT4KKyAgICA8L3Jlc291cmNlcz4KICAgICA8c291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvc291cmNlRGlyZWN0b3J5PgogICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CiAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CiAgIDwvYnVpbGQ+Ci0gIAogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wb21zL2FudC14ei9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL2FudC14ei9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3BvbXMvYW50LXh6L3BvbS54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tCisgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgorICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCisgIFVSTCA6IGh0dHBzOi8vYW50LmFwYWNoZS5vcmcKKy0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgCit4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8dmVyc2lvbj4xLjEwLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDx1cmw+aHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmFudC14ejwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8bmFtZT5BcGFjaGUgQW50ICsgWFogZm9yIEphdmE8L25hbWU+CisgIDxkZXNjcmlwdGlvbj5jb250YWlucyB0aGUgeHogY29tcHJlc3Npb24gc3VwcG9ydDwvZGVzY3JpcHRpb24+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcudHVrYWFuaTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnh6PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS44PC92ZXJzaW9uPgorICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgPC9kZXBlbmRlbmNpZXM+CisgIDxidWlsZD4KKyAgICA8cGx1Z2lucz4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC94ei8qPC9pbmNsdWRlPgorICAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwveHovKjwvaW5jbHVkZT4KKyAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICA8L3BsdWdpbj4KKyAgICAgIDxwbHVnaW4+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgIDwvcGx1Z2lucz4KKyAgICA8cmVzb3VyY2VzPgorICAgICAgPHJlc291cmNlPgorICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC9kaXJlY3Rvcnk+CisgICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgorICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgPGluY2x1ZGU+TElDRU5TRTwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5OT1RJQ0U8L2luY2x1ZGU+CisgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICA8L3Jlc291cmNlPgorICAgIDwvcmVzb3VyY2VzPgorICAgIDxzb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L3NvdXJjZURpcmVjdG9yeT4KKyAgICA8dGVzdFNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvdGVzdGNhc2VzPC90ZXN0U291cmNlRGlyZWN0b3J5PgorICAgIDxvdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS9jbGFzc2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgPHRlc3RPdXRwdXREaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3Rlc3RPdXRwdXREaXJlY3Rvcnk+CisgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9kaXJlY3Rvcnk+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3BvbXMvYW50L3BvbS54bWwgYi9zcmMvZXRjL3BvbXMvYW50L3BvbS54bWwKaW5kZXggN2UwY2RlMC4uNjc4YWZlZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL2FudC9wb20ueG1sCisrKyBiL3NyYy9ldGMvcG9tcy9hbnQvcG9tLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNDAgKzE4LDM3IEBACiA8IS0tCiAgIFRoaXMgUE9NIGhhcyBiZWVuIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIEFudCBEZXZlbG9wbWVudCBUZWFtLgogICBQbGVhc2UgY29udGFjdCB1cyBpZiB5b3UgYXJlIG5vdCBzYXRpc2ZpZWQgd2l0aCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBQT00uCi0gIFVSTCA6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZworICBVUkwgOiBodHRwczovL2FudC5hcGFjaGUub3JnCiAtLT4KIDxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCiAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwczovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5hbnQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+YW50LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgICA8cmVsYXRpdmVQYXRoPi4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9hbnQuYXBhY2hlLm9yZy88L3VybD4KKyAgPHVybD5odHRwczovL2FudC5hcGFjaGUub3JnLzwvdXJsPgogICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+YW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPG5hbWU+QXBhY2hlIEFudCBDb3JlPC9uYW1lPgorICA8cHJvcGVydGllcz4KKyAgICA8bW9kdWxlcy5leGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL21vZHVsZXMvPC9tb2R1bGVzLmV4Y2x1ZGU+CisgIDwvcHJvcGVydGllcz4KICAgPGRlcGVuZGVuY2llcz4KICAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50LWxhdW5jaGVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS45LjE1LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+MS4xMC44LVNOQVBTSE9UPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+YW50LWFudHVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjM8L3ZlcnNpb24+CisgICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICA8ZXhjbHVzaW9ucz4KICAgICAgICAgPGV4Y2x1c2lvbj4KQEAgLTY0LDYgKzYxLDI0IEBACiAgICAgICAgIDwvZXhjbHVzaW9uPgogICAgICAgPC9leGNsdXNpb25zPgogICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjEyLjA8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5tYWlsPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amF2YXgubWFpbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuNi4yPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5iZWFuc2hlbGw8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ic2g8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjBiNTwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CiAgIDwvZGVwZW5kZW5jaWVzPgogICA8YnVpbGQ+CiAgICAgPGZpbHRlcnM+CkBAIC03MSwxMSArODYsNiBAQAogICAgIDwvZmlsdGVycz4KICAgICA8cGx1Z2lucz4KICAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+IDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KQEAgLTg1LDEzICs5NSw0NiBAQAogICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CiAgICAgICAgICAgICA8L2dvYWxzPgogICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgPHRhcmdldD4KICAgICAgICAgICAgICAgICA8dHN0YW1wLz4KICAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSIvPgogICAgICAgICAgICAgICAgIDx0b3VjaCBmaWxlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uYnVpbGQudGltZXN0YW1wLnByb3BlcnRpZXMiLz4KICAgICAgICAgICAgICAgICA8ZWNobyBmaWxlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uYnVpbGQudGltZXN0YW1wLnByb3BlcnRpZXMiIGFwcGVuZD0iZmFsc2UiCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJUT0RBWT0ke1RPREFZfSIvPgotICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICA8L3RhcmdldD4KKyAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgPGlkPmNyZWF0ZS1hbnRsaWItdGVzdC1qYXI8L2lkPgorICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8dGFyZ2V0PgorICAgICAgICAgICAgICAgIDxqYXIgamFyZmlsZT0iJHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3Rlc3QyLWFudGxpYi5qYXIiPgorICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkV4dGVuc2lvbi1uYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudCIvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVGl0bGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkFwYWNoZSBBbnQiLz4KKyAgICAgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJTcGVjaWZpY2F0aW9uLVZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7cHJvamVjdC52ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IlNwZWNpZmljYXRpb24tVmVuZG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVRpdGxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudCIvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IiR7cHJvamVjdC52ZXJzaW9ufSIvPgorICAgICAgICAgICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iLz4KKyAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICA8emlwZmlsZXNldCBkaXI9IiR7cHJvamVjdC5idWlsZC5zY3JpcHRTb3VyY2VEaXJlY3Rvcnl9L3Rlc3RjYXNlcyIgZnVsbHBhdGg9InRhc2tkZWZzL3Rlc3QuYW50bGliLnhtbCI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRhc2tkZWZzL3Rlc3QyLmFudGxpYi54bWwiLz4KKyAgICAgICAgICAgICAgICAgIDwvemlwZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8L2phcj4KKyAgICAgICAgICAgICAgICA8ZWNob3Byb3BlcnRpZXMgcHJlZml4PSJtYXZlbi4iLz4KKyAgICAgICAgICAgICAgPC90YXJnZXQ+CiAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICAgICAgPC9leGVjdXRpb24+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KQEAgLTEwMSw5ICsxNDQsOSBAQAogICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CiAgICAgICAgICAgICA8L2dvYWxzPgogICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KKyAgICAgICAgICAgICAgPHRhcmdldD4KICAgICAgICAgICAgICAgICA8ZGVsZXRlIGZpbGU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9Ly5idWlsZC50aW1lc3RhbXAucHJvcGVydGllcyIvPgotICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICA8L3RhcmdldD4KICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICA8L2V4ZWN1dGlvbj4KICAgICAgICAgPC9leGVjdXRpb25zPgpAQCAtMTE0LDcxICsxNTcsMTQxIEBACiAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgIDxleGNsdWRlcz4KICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9KYXZhQ2xhc3NIZWxwZXIqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC88L2V4Y2x1ZGU+CiAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHAqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9ybyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyKjwvZXhjbHVkZT4KICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01pbWVNYWlsZXIqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+JHttb2R1bGVzLmV4Y2x1ZGV9PC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW4yVHJhY2VTdXBwb3J0KjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlLzwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci88L2V4Y2x1ZGU+CiAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQKjwvZXhjbHVkZT4KICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9SRXhlYyo8L2V4Y2x1ZGU+CiAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvVGVsbmV0VGFzayo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoLyo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS8qPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdCo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC8qU2NyaXB0KjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kLzwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwveHovPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC94ei88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsLzwvZXhjbHVkZT4KICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVyLmphdmE8L2V4Y2x1ZGU+CiAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1NjcmlwdFJ1bm5lci5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlcio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsLyo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OZXRSZXh4Qyo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbjJUcmFjZVN1cHBvcnQqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC8qPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9ybyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwKjwvZXhjbHVkZT4KICAgICAgICAgICA8L2V4Y2x1ZGVzPgogICAgICAgICAgIDx0ZXN0RXhjbHVkZXM+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL3V0aWwvSmF2YUNsYXNzSGVscGVyKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHQqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTG9nNGpMaXN0ZW5lcio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIGxhdW5jaGVyIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoLzwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gY29tbW9ucy1sb2dnaW5nIC0tPgogICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvQ29tbW9uc0xvZ2dpbmdMaXN0ZW5lcio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm8qPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHAqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWltZU1haWxlcio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIGxvZzRqIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTG9nNGpMaXN0ZW5lcio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIG9ic29sZXRlIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQWJzdHJhY3RDdnMqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBFUlJPUjogImRlZmF1bHQgdmFsdWUiIHdoZW4gamF2YWMgY2Fubm90IGNyb3NzLWNvbXBpbGUgdG8gSmF2YSA1IC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWMqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBzZWUgWHNsdFRlc3QgLS0+CiAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHlsZVRlc3QqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBFUlJPUjogVW5leHBlY3RlZCByZWNpcGllbnRzIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gSmF2YTkrIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+JHttb2R1bGVzLmV4Y2x1ZGV9PC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBhbnRsciAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gb2Jzb2xldGUgLS0+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Kc3BjKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3MqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSB4YWxhbjogd29ya2Fyb3VuZCBmb3IgZGlmZmVyZW50IHJlc291cmNlIGVuY29kaW5nIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb24qPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBFUlJPUjogVW5rbm93bkhvc3RFeGNlcHRpb246IGNoZW1pY2FsIChYTUwgcGFyc2VyLWRlcGVuZGVudCkgLS0+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YbWxWYWxpZGF0ZUNhdGFsb2cqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBpbWFnZS9pbWFnZWlvIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBqZGVwZW5kIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIGp1bml0IC0tPgogICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBqdW5pdGxhdW5jaGVyIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIG5ldCAtLT4KICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFAqPC9leGNsdWRlPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoLyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIHN3aW5nIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoLzwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0ganNjaCAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIGRlcGVuZGVudCBvbiBqdW5pdCAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnMqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBiY2VsIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldCo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIEVSUk9SOiBkZWZhdWx0cy5wcm9wZXJ0aWVzIGFyZSBpbiBib3RoIGNvbXBpbGUgYW5kIHRlc3QgZmlsZSB0cmVlIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlscyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xvYWRlclV0aWxzKjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwhLS0gb3JvIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9ybyo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIHJlZ2V4cCAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHAqPC9leGNsdWRlPgorICAgICAgICAgICAgPCEtLSBkZXBlbmRlbnQgb24gSW5jbHVkZVRlc3QuY2xhc3M6IGNoZWNrcyBwcmVzZW5jZSAtLT4KKyAgICAgICAgICAgIDxleGNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyRGVsZWdhdGlvbio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIEVSUk9SOiAgTW9yZSBwc2V1ZG8gYXR0cmlidXRlcyBhcmUgZXhwZWN0ZWQgKGVuY29kaW5nPSJVVEYtOCIpOworICAgICAgICAgICAgIGZhaWx1cmUgbW9kZSBpcyBYTUwgcGFyc2VyLWRlcGVuZGVudCAoc2VlIHRvIGRvIGZvciBmYWlsdXJlcyBpbiBJREUpIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvSW5jbHVkZSo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIGRlcGVuZGVudCBvbiBKVW5pdCA1IC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8IS0tIHJlcXVpcmVzIHN0cnVjdHVyZSBvZiBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgQW50IGluIEFOVF9IT01FIC0tPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhVGVzdCo8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9kaWZpZWRTZWxlY3RvclRlc3QqPC9leGNsdWRlPgorICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlVGVzdCo8L2V4Y2x1ZGU+CiAgICAgICAgICAgPC90ZXN0RXhjbHVkZXM+CiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgIDwvcGx1Z2luPgogICAgICAgPHBsdWdpbj4KICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8YXJjaGl2ZT4KKyAgICAgICAgICAgIDxpbmRleD50cnVlPC9pbmRleD4KKyAgICAgICAgICAgIDxtYW5pZmVzdD4KKyAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgIDxhZGRFeHRlbnNpb25zPnRydWU8L2FkZEV4dGVuc2lvbnM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPnRydWU8L2FkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+CisgICAgICAgICAgICAgIDxhZGREZWZhdWx0U3BlY2lmaWNhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdFNwZWNpZmljYXRpb25FbnRyaWVzPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgIDxiYXNlZGlyPi4uLy4uLy4uLy4uPC9iYXNlZGlyPgorICAgICAgICAgIDx3b3JraW5nRGlyZWN0b3J5Pi4uLy4uLy4uLy4uPC93b3JraW5nRGlyZWN0b3J5PgogICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgogICAgICAgICAgICAgPHByb3BlcnR5PgogICAgICAgICAgICAgICA8bmFtZT5hbnQuaG9tZTwvbmFtZT4KICAgICAgICAgICAgICAgPHZhbHVlPiR7ZW52LkFOVF9IT01FfTwvdmFsdWU+CiAgICAgICAgICAgICA8L3Byb3BlcnR5PgogICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICA8bmFtZT5idWlsZC50ZXN0czwvbmFtZT4KLSAgICAgICAgICAgICAgPHZhbHVlPi4uLy4uLy4uLy4uL3RhcmdldC9hbnQvdGVzdGNhc2VzPC92YWx1ZT4KKyAgICAgICAgICAgICAgPG5hbWU+YnVpbGQuY2xhc3Nlcy52YWx1ZTwvbmFtZT4KKyAgICAgICAgICAgICAgPHZhbHVlPiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L3ZhbHVlPgogICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAgIDxwcm9wZXJ0eT4KICAgICAgICAgICAgICAgPG5hbWU+YnVpbGQudGVzdHMudmFsdWU8L25hbWU+Ci0gICAgICAgICAgICAgIDx2YWx1ZT4uLi8uLi8uLi8uLi90YXJnZXQvYW50L3Rlc3RjYXNlczwvdmFsdWU+CisgICAgICAgICAgICAgIDx2YWx1ZT4ke3Byb2plY3QuYmFzZWRpcn0vLi4vLi4vLi4vLi4vdGFyZ2V0LyR7cHJvamVjdC5hcnRpZmFjdElkfS90ZXN0Y2FzZXM8L3ZhbHVlPgogICAgICAgICAgICAgPC9wcm9wZXJ0eT4KICAgICAgICAgICAgIDxwcm9wZXJ0eT4KICAgICAgICAgICAgICAgPG5hbWU+b2ZmbGluZTwvbmFtZT4KICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgogICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgPG5hbWU+YW50LnRlc3QuYmFzZWRpci5pZ25vcmU8L25hbWU+CisgICAgICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvcHJvcGVydHk+CiAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgogICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KQEAgLTE4OSwxMiArMzAyLDIxIEBACiAgICAgPC9wbHVnaW5zPgogICAgIDxyZXNvdXJjZXM+CiAgICAgICA8cmVzb3VyY2U+CisgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi48L2RpcmVjdG9yeT4KKyAgICAgICAgPHRhcmdldFBhdGg+TUVUQS1JTkY8L3RhcmdldFBhdGg+CisgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPk5PVElDRTwvaW5jbHVkZT4KKyAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgIDwvcmVzb3VyY2U+CisgICAgICA8cmVzb3VyY2U+CiAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL21haW48L2RpcmVjdG9yeT4KICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CiAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0LnByb3BlcnRpZXM8L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdC5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHQucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9kZWZhdWx0cy5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllczwvaW5jbHVkZT4KKyAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRsaWIueG1sPC9pbmNsdWRlPgogICAgICAgICAgIDxpbmNsdWRlPm9yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2NvbmRpdGlvbnMvYW50bGliLnhtbDwvaW5jbHVkZT4KICAgICAgICAgICA8aW5jbHVkZT5vcmcvYXBhY2hlL3Rvb2xzL2FudC9kZWZhdWx0TWFuaWZlc3QubWY8L2luY2x1ZGU+CiAgICAgICAgICAgPGluY2x1ZGU+b3JnL2FwYWNoZS90b29scy9hbnQvdmVyc2lvbi50eHQ8L2luY2x1ZGU+CkBAIC0yMDUsMTAgKzMyNywxMSBAQAogICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KICAgICAgICAgPGluY2x1ZGVzPgogICAgICAgICAgIDxpbmNsdWRlPioqL2FudGxpYi54bWw8L2luY2x1ZGU+CisgICAgICAgICAgPGluY2x1ZGU+KiovamF2YWRvYy1mcmFtZS1pbmplY3Rpb25zLWZpeC50eHQ8L2luY2x1ZGU+CiAgICAgICAgIDwvaW5jbHVkZXM+CiAgICAgICA8L3Jlc291cmNlPgogICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL2RvY3M8L2RpcmVjdG9yeT4KKyAgICAgICAgPGRpcmVjdG9yeT4uLi8uLi8uLi8uLi9tYW51YWw8L2RpcmVjdG9yeT4KICAgICAgICAgPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgogICAgICAgICA8aW5jbHVkZXM+CiAgICAgICAgICAgPGluY2x1ZGU+aW1hZ2VzL2FudF9sb2dvX2xhcmdlLmdpZjwvaW5jbHVkZT4KQEAgLTIzMCw4ICszNTMsMjEgQEAKICAgICA8L3Rlc3RSZXNvdXJjZXM+CiAgICAgPHNvdXJjZURpcmVjdG9yeT4uLi8uLi8uLi8uLi9zcmMvbWFpbjwvc291cmNlRGlyZWN0b3J5PgogICAgIDx0ZXN0U291cmNlRGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3NyYy90ZXN0cy9qdW5pdDwvdGVzdFNvdXJjZURpcmVjdG9yeT4KLSAgICA8b3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC9hbnQvY2xhc3Nlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDx0ZXN0T3V0cHV0RGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC9hbnQvdGVzdGNhc2VzPC90ZXN0T3V0cHV0RGlyZWN0b3J5PgotICAgIDxkaXJlY3Rvcnk+Li4vLi4vLi4vLi4vdGFyZ2V0L2FudDwvZGlyZWN0b3J5PgorICAgIDxzY3JpcHRTb3VyY2VEaXJlY3Rvcnk+Li4vLi4vLi4vLi4vc3JjL2V0Yzwvc2NyaXB0U291cmNlRGlyZWN0b3J5PgorICAgIDwhLS0gZGlyZWN0b3J5IG5hbWUgaXMgaGFyZGNvZGVkIGluIEFudFRlc3QgLS0+CisgICAgPG91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L2NsYXNzZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICA8dGVzdE91dHB1dERpcmVjdG9yeT4uLi8uLi8uLi8uLi90YXJnZXQvJHtwcm9qZWN0LmFydGlmYWN0SWR9L3Rlc3RjYXNlczwvdGVzdE91dHB1dERpcmVjdG9yeT4KKyAgICA8ZGlyZWN0b3J5Pi4uLy4uLy4uLy4uL3RhcmdldC8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2RpcmVjdG9yeT4KICAgPC9idWlsZD4KKyAgPHByb2ZpbGVzPgorICAgIDxwcm9maWxlPgorICAgICAgPGlkPmphdmE5KzwvaWQ+CisgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgPGpkaz5bOSwpPC9qZGs+CisgICAgICA8L2FjdGl2YXRpb24+CisgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1vZHVsZXMuZXhjbHVkZT5ub3QvaGVyZTwvbW9kdWxlcy5leGNsdWRlPgorICAgICAgPC9wcm9wZXJ0aWVzPgorICAgIDwvcHJvZmlsZT4KKyAgPC9wcm9maWxlcz4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvcG9tcy9wb20ueG1sIGIvc3JjL2V0Yy9wb21zL3BvbS54bWwKaW5kZXggMGEzZTA1Yi4uNWYzYTU5MCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy9wb21zL3BvbS54bWwKKysrIGIvc3JjL2V0Yy9wb21zL3BvbS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDQ3ICsxOCw0NyBAQAogPCEtLQogICBUaGlzIFBPTSBoYXMgYmVlbiBjcmVhdGVkIG1hbnVhbGx5IGJ5IHRoZSBBbnQgRGV2ZWxvcG1lbnQgVGVhbS4KICAgUGxlYXNlIGNvbnRhY3QgdXMgaWYgeW91IGFyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMgUE9NLgotICBVUkwgOiBodHRwOi8vYW50LmFwYWNoZS5vcmcKKyAgVVJMIDogaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZwogLS0+CiA8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgogICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cHM6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgogICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CiAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5hbnQtcGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjkuMTUtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDx2ZXJzaW9uPjEuMTAuOC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KICAgPGRlc2NyaXB0aW9uPm1hc3RlciBQT008L2Rlc2NyaXB0aW9uPgogICA8bGljZW5zZXM+CiAgICAgPGxpY2Vuc2U+CiAgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgotICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CisgICAgICA8dXJsPmh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAudHh0PC91cmw+CiAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KICAgICA8L2xpY2Vuc2U+CiAgIDwvbGljZW5zZXM+CiAgIDxuYW1lPkFwYWNoZSBBbnQ8L25hbWU+Ci0gIDx1cmw+aHR0cDovL2FudC5hcGFjaGUub3JnLzwvdXJsPgorICA8dXJsPmh0dHBzOi8vYW50LmFwYWNoZS5vcmcvPC91cmw+CiAgIDxpbmNlcHRpb25ZZWFyPjIwMDA8L2luY2VwdGlvblllYXI+CiAgIDxvcmdhbml6YXRpb24+CiAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnLzwvdXJsPgorICAgIDx1cmw+aHR0cHM6Ly93d3cuYXBhY2hlLm9yZy88L3VybD4KICAgPC9vcmdhbml6YXRpb24+CiAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgogICAgIDwhLS0gTnVsbCBvdXQgaW5oZXJpdGVkIGFwYWNoZSBkaXN0cmlidXRpb24gcmVwbyBieSBkZWZhdWx0IC0tPgogICAgIDxyZXBvc2l0b3J5PgogICAgICAgPGlkPmR1bW15PC9pZD4KICAgICAgIDxuYW1lPkR1bW15IHRvIGF2b2lkIGFjY2lkZW50YWwgZGVwbG95czwvbmFtZT4KLSAgICAgIDx1cmw+aHR0cDovL25vd2hlcmUubmV0LzwvdXJsPgorICAgICAgPHVybD5odHRwczovL25vd2hlcmUubmV0LzwvdXJsPgogICAgIDwvcmVwb3NpdG9yeT4KICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgogICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpnaXQ6aHR0cHM6Ly9naXQtd2lwLXVzLmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC5naXQ8L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50LmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQuZ2l0PC91cmw+CisgICAgPGNvbm5lY3Rpb24+c2NtOmdpdDpodHRwczovL2dpdGJveC5hcGFjaGUub3JnL3JlcG9zL2FzZi9hbnQuZ2l0PC9jb25uZWN0aW9uPgorICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpnaXQ6aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvYW50LmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmL2FudC5naXQ8L3VybD4KICAgPC9zY20+CiAgIDxjaU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5odWRzb248L3N5c3RlbT4KLSAgICA8dXJsPmh0dHBzOi8vYnVpbGRzLmFwYWNoZS5vcmcvam9iL0FudF9CdWlsZEZyb21QT01zLzwvdXJsPgorICAgIDxzeXN0ZW0+amVua2luczwvc3lzdGVtPgorICAgIDx1cmw+aHR0cHM6Ly9idWlsZHMuYXBhY2hlLm9yZy9qb2IvQW50LUJ1aWxkLWZyb20tUE9Ncy88L3VybD4KICAgPC9jaU1hbmFnZW1lbnQ+CiAgIDxtYWlsaW5nTGlzdHM+CiAgICAgPG1haWxpbmdMaXN0PgpAQCAtNjYsMTkgKzY2LDE5IEBACiAgICAgICA8c3Vic2NyaWJlPmRldi1zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmc8L3N1YnNjcmliZT4KICAgICAgIDx1bnN1YnNjcmliZT5kZXYtdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgogICAgICAgPHBvc3Q+ZGV2QGFudC5hcGFjaGUub3JnPC9wb3N0PgotICAgICAgPGFyY2hpdmU+aHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtZGV2PC9hcmNoaXZlPgorICAgICAgPGFyY2hpdmU+aHR0cHM6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYW50LWRldjwvYXJjaGl2ZT4KICAgICA8L21haWxpbmdMaXN0PgogICAgIDxtYWlsaW5nTGlzdD4KICAgICAgIDxuYW1lPkFudCBVc2VycyBMaXN0PC9uYW1lPgogICAgICAgPHN1YnNjcmliZT51c2VyLXN1YnNjcmliZUBhbnQuYXBhY2hlLm9yZzwvc3Vic2NyaWJlPgogICAgICAgPHVuc3Vic2NyaWJlPnVzZXItdW5zdWJzY3JpYmVAYW50LmFwYWNoZS5vcmc8L3Vuc3Vic2NyaWJlPgogICAgICAgPHBvc3Q+dXNlckBhbnQuYXBhY2hlLm9yZzwvcG9zdD4KLSAgICAgIDxhcmNoaXZlPmh0dHA6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYW50LXVzZXI8L2FyY2hpdmU+CisgICAgICA8YXJjaGl2ZT5odHRwczovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtdXNlcjwvYXJjaGl2ZT4KICAgICA8L21haWxpbmdMaXN0PgogICA8L21haWxpbmdMaXN0cz4KICAgPGlzc3VlTWFuYWdlbWVudD4KICAgICA8c3lzdGVtPmJ1Z3ppbGxhPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvPC91cmw+CisgICAgPHVybD5odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhLzwvdXJsPgogICA8L2lzc3VlTWFuYWdlbWVudD4KICAgPG1vZHVsZXM+CiAgICAgPG1vZHVsZT5hbnQ8L21vZHVsZT4KQEAgLTkyLDYgKzkyLDcgQEAKICAgICA8bW9kdWxlPmFudC1hcGFjaGUteGFsYW4yPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtY29tbW9ucy1sb2dnaW5nPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtY29tbW9ucy1uZXQ8L21vZHVsZT4KKyAgICA8bW9kdWxlPmFudC1pbWFnZWlvPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtamFpPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtamF2YW1haWw8L21vZHVsZT4KICAgICA8bW9kdWxlPmFudC1qZGVwZW5kPC9tb2R1bGU+CkBAIC05OSwxNiArMTAwLDI0IEBACiAgICAgPG1vZHVsZT5hbnQtanNjaDwvbW9kdWxlPgogICAgIDxtb2R1bGU+YW50LWp1bml0PC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtanVuaXQ0PC9tb2R1bGU+CisgICAgPG1vZHVsZT5hbnQtanVuaXRsYXVuY2hlcjwvbW9kdWxlPgogICAgIDxtb2R1bGU+YW50LWxhdW5jaGVyPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtbmV0cmV4eDwvbW9kdWxlPgogICAgIDxtb2R1bGU+YW50LXN3aW5nPC9tb2R1bGU+CiAgICAgPG1vZHVsZT5hbnQtdGVzdHV0aWw8L21vZHVsZT4KKyAgICA8bW9kdWxlPmFudC14ejwvbW9kdWxlPgogICA8L21vZHVsZXM+CiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgorICAgICAgPHZlcnNpb24+NC4xMzwvdmVyc2lvbj4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgogICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgogICAgIDwvZGVwZW5kZW5jeT4KICAgPC9kZXBlbmRlbmNpZXM+CkBAIC0xMjIsMjYgKzEzMSwzMSBAQAogICAgICAgICA8cGx1Z2luPgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4zLjI8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+My44LjA8L3ZlcnNpb24+CiAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KKyAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgICA8dGFyZ2V0PjEuODwvdGFyZ2V0PgogICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMS4wPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMTI8L3ZlcnNpb24+CisgICAgICAgICAgPHZlcnNpb24+Mi4yMi4xPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjEyPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjIuMjIuMTwvdmVyc2lvbj4KKyAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgPHZlcnNpb24+MS44PC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KICAgICAgIDwvcGx1Z2lucz4KICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CkBAIC0xNDksNCArMTYzLDIxIEBACiAgIDxwcm9wZXJ0aWVzPgogICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgogICA8L3Byb3BlcnRpZXM+CisgIDxwcm9maWxlcz4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5qYXZhYy04PC9pZD4KKyAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICA8amRrPjEuODwvamRrPgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bjwvZ3JvdXBJZD4KKyAgICAgICAgICA8YXJ0aWZhY3RJZD50b29sczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4xLjguMDwvdmVyc2lvbj4KKyAgICAgICAgICA8c2NvcGU+c3lzdGVtPC9zY29wZT4KKyAgICAgICAgICA8c3lzdGVtUGF0aD4ke2phdmEuaG9tZX0vLi4vbGliL3Rvb2xzLmphcjwvc3lzdGVtUGF0aD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPC9wcm9maWxlPgorICA8L3Byb2ZpbGVzPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy9wcmludEZhaWxpbmdUZXN0cy54c2wgYi9zcmMvZXRjL3ByaW50RmFpbGluZ1Rlc3RzLnhzbAppbmRleCA3ZDMyMzQwLi4xZGZiMzMzIDEwMDY0NAotLS0gYS9zcmMvZXRjL3ByaW50RmFpbGluZ1Rlc3RzLnhzbAorKysgYi9zcmMvZXRjL3ByaW50RmFpbGluZ1Rlc3RzLnhzbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90YWdkaWZmLnhzbCBiL3NyYy9ldGMvdGFnZGlmZi54c2wKaW5kZXggNWQ0MzBhNy4uNDJjOTU2OSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90YWdkaWZmLnhzbAorKysgYi9zcmMvZXRjL3RhZ2RpZmYueHNsCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgPC9oMT4KICAgICAgICAgICBUYWdkaWZmIGJldHdlZW4gPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdGFydFRhZyIvPiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQHN0YXJ0RGF0ZSIvPiBhbmQKIAkJCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZW5kVGFnIi8+IDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAZW5kRGF0ZSIvPgotICAgICAgICAgIDxwIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC9wPgorICAgICAgICAgIDxwIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LjwvcD4KICAgICAgICAgICA8aHIgc2l6ZT0iMiIvPgogCTxhIG5hbWU9IlRPUCIvPgogCTx0YWJsZSB3aWR0aD0iMTAwJSI+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvYnVpbGRmaWxldGVzdC1iYXNlLnhtbAppbmRleCBmYzFlOGIwLi4xZGNhMGU1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9idWlsZGZpbGV0ZXN0LWJhc2UueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2J1aWxkZmlsZXRlc3QtYmFzZS54bWwKQEAgLTEsMyArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgogPHByb2plY3QgbmFtZT0iYnVpbGRmaWxldGVzdC1iYXNlIj4KICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkZmlsZXRlc3QudG1wZGlyIiBsb2NhdGlvbj0iJHtqYXZhLmlvLnRtcGRpcn0iLz4KICAgPHByb3BlcnR5IG5hbWU9ImlucHV0IiBsb2NhdGlvbj0iJHtidWlsZGZpbGV0ZXN0LnRtcGRpcn0vdGVzdGlucHV0XyR7YW50LnByb2Nlc3NpZH1fJHthbnQudGhyZWFkbmFtZX0iLz4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvYW50Y2xhc3Nsb2FkZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9hbnRjbGFzc2xvYWRlci54bWwKaW5kZXggY2FmYzgyMy4uYWQ2NTFlMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9hbnRjbGFzc2xvYWRlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9hbnRjbGFzc2xvYWRlci54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU2LDExICs1Niw3IEBACiBwYWNrYWdlIG9yZy5leGFtcGxlOwogcHVibGljIGNsYXNzIEZvbyB7fQogXV0+PC9lY2hvPgotICAgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrMS42KyIgY2xhc3NuYW1lPSJqYXZhLm5ldC5Db29raWVTdG9yZSIvPgotICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic291cmNlIiB2YWx1ZT0iNiI+Ci0gICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamRrMS42KyIvPgotICAgICAgPC9jb25kaXRpb24+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlIiB2YWx1ZT0iMS40Ii8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlIiB2YWx1ZT0iOCIvPgogICAgICAgPGphdmFjIHNyY2Rpcj0iJHt0bXAuZGlyLm5vbmFzY2lpfSIKICAgICAgICAgICAgICBkZXN0ZGlyPSIke3RtcC5kaXIubm9uYXNjaWl9IiBzb3VyY2U9IiR7c291cmNlfSIvPgogICAgICAgPHRlbXBmaWxlIHByb3BlcnR5PSJ0ZXN0LmphciIgZGVzdGRpcj0iJHt0bXAuZGlyfSIgc3VmZml4PSJ0ZXN0IiBwcmVmaXg9Ii5qYXIiIGRlbGV0ZW9uZXhpdD0idHJ1ZSIvPgpAQCAtNzcsNCArNzMsNTIgQEAKICAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZU5vbkphciI+CiAgICAgICA8dG91Y2ggZmlsZT0iJHt0bXAuZGlyfS9mb28uamFyIi8+CiAgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RNUkphciIgZGVzY3JpcHRpb249InRlc3RzIEFudENsYXNzTG9hZGVyIHN1cHBvcnQgZm9yIG11bHRpLXJlbGVhc2UgamFycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02Mjk1MiI+CisgICAgICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0vbXJqYXIvb3JnL2V4YW1wbGUiLz4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHt0bXAuZGlyfS9tcmphci05L29yZy9leGFtcGxlIi8+CisgICAgICAgIDwhLS0gZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBjbGFzcyAtLT4KKyAgICAgICAgPGVjaG8gZmlsZT0iJHt0bXAuZGlyfS9tcmphci9vcmcvZXhhbXBsZS9NUkphclRlc3QuamF2YSI+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuZXhhbXBsZTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgTVJKYXJUZXN0IHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtcmphciB0ZXN0IHJlc3VsdCA9IGRlZmF1bHQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF1dPgorICAgICAgICA8L2VjaG8+CisgICAgICAgIDwhLS0gSmF2YSBydW50aW1lIHZlcnNpb24gOSBvZiB0aGUgY2xhc3MgLS0+CisgICAgICAgIDxlY2hvIGZpbGU9IiR7dG1wLmRpcn0vbXJqYXItOS9vcmcvZXhhbXBsZS9NUkphclRlc3QuamF2YSI+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgcGFja2FnZSBvcmcuZXhhbXBsZTsKKyAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgTVJKYXJUZXN0IHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtcmphciB0ZXN0IHJlc3VsdCA9IDkiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF1dPgorICAgICAgICA8L2VjaG8+CisgICAgICAgIDwhLS0gY29tcGlsZSB0aGVzZSBjbGFzc2VzIC0tPgorICAgICAgICA8amF2YWMgc3JjZGlyPSIke3RtcC5kaXJ9L21yamFyIiBkZXN0ZGlyPSIke3RtcC5kaXJ9L21yamFyIi8+CisgICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7dG1wLmRpcn0vbXJqYXItOSIgZGVzdGRpcj0iJHt0bXAuZGlyfS9tcmphci05Ii8+CisKKyAgICAgICAgPCEtLSBjcmVhdGUgbXVsdGktcmVsZWFzZSBqYXIgZmlsZSAtLT4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHt0bXAuZGlyfS9tcmphci5qYXIiPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTXVsdGktUmVsZWFzZSIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgICAgICA8IS0tIGRlZmF1bHQgY2xhc3NlcyAtLT4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0bXAuZGlyfS9tcmphciIgaW5jbHVkZXM9IioqLyouY2xhc3MiLz4KKyAgICAgICAgICAgIDwhLS0gSmF2YSA5IHNwZWNpZmljIGNsYXNzZXMgLS0+CisgICAgICAgICAgICA8emlwZmlsZXNldCBwcmVmaXg9Ik1FVEEtSU5GL3ZlcnNpb25zLzkvIiBkaXI9IiR7dG1wLmRpcn0vbXJqYXItOSIgaW5jbHVkZXM9IioqLyouY2xhc3MiLz4KKyAgICAgICAgPC9qYXI+CisKKyAgICAgICAgPCEtLSBub3cgcnVuIHRoZSBjbGFzcyBwcmVzZW50IGluIHRoZSBtdWx0aS1yZWxlYXNlIGphciAtLT4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5NUkphclRlc3QiIGZhaWxvbmVycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RtcC5kaXJ9L21yamFyLmphciIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YT4KKworICAgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9jYXNlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY2FzZS54bWwKaW5kZXggZWE0YWMxZC4uZWVjYjMyMSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9jYXNlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Nhc2UueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2NvbnRhaW5lcnNyYy90ZXN0L1NwZWNpYWxTZXEuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY29udGFpbmVyc3JjL3Rlc3QvU3BlY2lhbFNlcS5qYXZhCmluZGV4IGYzZjAxNzYuLjUyMjU0ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY29udGFpbmVyc3JjL3Rlc3QvU3BlY2lhbFNlcS5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvY29udGFpbmVyc3JjL3Rlc3QvU3BlY2lhbFNlcS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMTIgKzIzLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvOwogCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIHB1YmxpYyBjbGFzcyBTcGVjaWFsU2VxIGV4dGVuZHMgVGFzayBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgewogICAgIC8qKiBPcHRpb25hbCBWZWN0b3IgaG9sZGluZyB0aGUgbmVzdGVkIHRhc2tzICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8VGFzaz4gbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIHByaXZhdGUgRmlsZVNldCBmaWxlc2V0OwogCkBAIC01MCwxMCArNDksNyBAQAogICAgICAgICBpZiAoZmlsZXNldCA9PSBudWxsIHx8IGZpbGVzZXQuZ2V0RGlyKGdldFByb2plY3QoKSkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlc2V0IHdhcyBub3QgY29uZmlndXJlZCIpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IG5lc3RlZFRhc2tzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBUYXNrIG5lc3RlZFRhc2sgPSAoVGFzaykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgbmVzdGVkVGFzay5wZXJmb3JtKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbmVzdGVkVGFza3MuZm9yRWFjaChUYXNrOjpwZXJmb3JtKTsKICAgICAgICAgbmVzdGVkRWNoby5yZWNvbmZpZ3VyZSgpOwogICAgICAgICBuZXN0ZWRFY2hvLnBlcmZvcm0oKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2RpcmVjdG9yeXNjYW5uZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXJlY3RvcnlzY2FubmVyLnhtbAppbmRleCA3ZTg2ODNhLi5lMTFhZjA4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2RpcmVjdG9yeXNjYW5uZXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZGlyZWN0b3J5c2Nhbm5lci54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZGlzcGF0Y2gvZGlzcGF0Y2gueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXNwYXRjaC9kaXNwYXRjaC54bWwKaW5kZXggZDUyOTY0NC4uMGQ3M2FkMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXNwYXRjaC9kaXNwYXRjaC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXNwYXRjaC9kaXNwYXRjaC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE0ICsxOSwxMiBAQAogPHByb2plY3QgbmFtZT0iZGlzcGF0Y2gtdGVzdCIgZGVmYXVsdD0iZGlzcCI+CiAKICAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0iZGlzcCI+Ci0gICAgPHRhc2tkZWYgbmFtZT0iZGlzcHRhc2siCi0gICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QaWNrT25lVGFzayI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICA8dGFza2RlZiBuYW1lPSJkaXNwdGFzayIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5QaWNrT25lVGFzayI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIvPgogICAgIDwvdGFza2RlZj4KICAgICA8ZGlzcHRhc2sgYWN0aW9uPSJsaXN0Ii8+CiAgIDwvdGFyZ2V0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LWltcG9ydGVkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZHVwbGljYXRlLXRhcmdldC1pbXBvcnRlZC54bWwKaW5kZXggZmM5NDVmNy4uMzJhODRkNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LWltcG9ydGVkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2R1cGxpY2F0ZS10YXJnZXQtaW1wb3J0ZWQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2R1cGxpY2F0ZS10YXJnZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LnhtbAppbmRleCAwYTI5NTI2Li5jOTY4NTEwIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2R1cGxpY2F0ZS10YXJnZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZHVwbGljYXRlLXRhcmdldC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZHVwbGljYXRlLXRhcmdldDIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwKaW5kZXggNmQ5NmJjYS4uNTVjMjlhOCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXhlY3V0b3IueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9leGVjdXRvci54bWwKaW5kZXggMDgwYzhkYy4uMDViODIzMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9leGVjdXRvci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9leGVjdXRvci54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXh0ZW5kZWQtdGFza2RlZi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2V4dGVuZGVkLXRhc2tkZWYueG1sCmluZGV4IDU4Y2E5NzkuLjg5OWM4ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXh0ZW5kZWQtdGFza2RlZi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9leHRlbmRlZC10YXNrZGVmLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbW11dGFibGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbW11dGFibGUueG1sCmluZGV4IDI2ZmRhMDguLmYwYTU4NGYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW1tdXRhYmxlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2ltbXV0YWJsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLmluYyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLmluYwppbmRleCA5NjA3OTJkLi5lMzVhNGQ2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS5pbmMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL2luY2x1ZGUuaW5jCkBAIC02LDcgKzYsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvaW5jbHVkZS54bWwKaW5kZXggMmMxMzFiMS4uNDlmMTNlYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL2luY2x1ZGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9pbmNsdWRlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL3JlbGF0aXZlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9iYXNpYy9yZWxhdGl2ZS54bWwKaW5kZXggNjk3Yzg0MS4uM2Y2ODk4YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL3JlbGF0aXZlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvYmFzaWMvcmVsYXRpdmUueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgImEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLmluYyIgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLmluYyIKaW5kZXggOTYwNzkyZC4uZTM1YTRkNiAxMDA2NDQKLS0tICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS5pbmMiCisrKyAiYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUuaW5jIgpAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0ICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS54bWwiICJiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvaW5jbHVkZS54bWwiCmluZGV4IDQwMGExNWMuLjZhNmExMzEgMTAwNjQ0Ci0tLSAiYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L2luY2x1ZGUueG1sIgorKysgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9pbmNsdWRlLnhtbCIKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCAiYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L3JlbGF0aXZlLnhtbCIgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9yZWxhdGl2ZS54bWwiCmluZGV4IDA1YmJjOWUuLmJmMjZmNGUgMTAwNjQ0Ci0tLSAiYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvZnJhZ1wwNDNtZW50L3JlbGF0aXZlLnhtbCIKKysrICJiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvcmVsYXRpdmUueG1sIgpAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0ICJhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9mcmFnXDA0M21lbnQvc2ltcGxlLnhtbCIgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgppbmRleCBkMzM3MjM0Li42NGY3NDZkIDEwMDY0NAotLS0gImEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgorKysgImIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2ZyYWdcMDQzbWVudC9zaW1wbGUueG1sIgpAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sCmluZGV4IGQ3NTc0N2MuLjVjMjcwYWIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV9wYXJzZV9lcnJvci9idWlsZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3BhcnNlX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKaW5kZXggNWZiZDNmNS4uMWU0MzI3ZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKaW5kZXggZDc1NzQ3Yy4uNWMyNzBhYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3Rhc2tfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV90YXNrX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sCmluZGV4IGQ0MGQzOTcuLjNhYzA1YzIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRlZF9maWxlX3Rhc2tfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfdGFza19lcnJvci9pbmNsdWRlZF9maWxlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV9wYXJzZV9lcnJvci9idWlsZC54bWwKaW5kZXggN2RlNTI2NC4uNzY3MGYzYyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKaW5kZXggYzYwN2JiYy4uOGRjYzEyZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3BhcnNlX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV9wYXJzZV9lcnJvci9pbmNsdWRlZF9maWxlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sCmluZGV4IDY4N2I4Y2YuLmM2Njg0NDcgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV90YXNrX2Vycm9yL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfdGFza19lcnJvci9idWlsZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS9pbmNsdWRpbmdfZmlsZV90YXNrX2Vycm9yL2luY2x1ZGVkX2ZpbGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKaW5kZXggYzYwN2JiYy4uOGRjYzEyZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvaW5jbHVkZWRfZmlsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL2luY2x1ZGUuaW5jIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS5pbmMKaW5kZXggZDhmZDYzOC4uMGY0MTg4NSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS5pbmMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS5pbmMKQEAgLTYsNyArNiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL2luY2x1ZGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS54bWwKaW5kZXggNGI2OTNjZC4uOTRkM2U1MSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvaW5jbHVkZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL3JlbGF0aXZlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL3JlbGF0aXZlLnhtbAppbmRleCA4MWY1MDJhLi41Mzc2MDY3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9yZWxhdGl2ZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2UvcmVsYXRpdmUueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9zaW1wbGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL3dpdGggc3BhY2Uvc2ltcGxlLnhtbAppbmRleCA0MDkyY2U3Li5iMmIzN2UwIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvd2l0aCBzcGFjZS9zaW1wbGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvaW5jbHVkZS93aXRoIHNwYWNlL3NpbXBsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL2xvYWRlcnJlZi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9sb2FkZXJyZWYueG1sCmluZGV4IDgzOTc0OTcuLjliNWY5M2YgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL2xvYWRlcnJlZi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2FkZXJyZWYvbG9hZGVycmVmLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2FkZXJyZWYvc3JjL1Rhc2sxLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9zcmMvVGFzazEuamF2YQppbmRleCBjYjM3NGJkLi5jNWJkOTNiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9zcmMvVGFzazEuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvYWRlcnJlZi9zcmMvVGFzazEuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9sb2NhdGlvbi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvY2F0aW9uLnhtbAppbmRleCA3ZThmNjM5Li4yMGY0YWZkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvY2F0aW9uLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2xvY2F0aW9uLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsMTIgKzM2LDkgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJkZWZpbmUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3NlcyIKLSAgICAgIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+CiAgICAgPHRhc2tkZWYgbmFtZT0iZWNob2xvYyIKLSAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb25UZXN0JEVjaG9Mb2NhdGlvbiI+CisgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5Mb2NhdGlvblRlc3QkRWNob0xvY2F0aW9uIj4KICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2xhc3Nlc30iIC8+CiAgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgICAgIDwvY2xhc3NwYXRoPgogICAgIDwvdGFza2RlZj4KQEAgLTcwLDUgKzY3LDQgQEAKICAgICA8ZWNobyBpZD0iZWNobzQiPkhlbGxvPC9lY2hvPgogICAgIDxlY2hvbG9jMy8+CiAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90YXNrY29udGFpbmVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdGFza2NvbnRhaW5lci54bWwKaW5kZXggNGEyMTM3My4uNWYwMjA5YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90YXNrY29udGFpbmVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Rhc2tjb250YWluZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3Mvbm90YXJnZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL25vdGFyZ2V0LnhtbAppbmRleCAyNTQzNzUxLi5iMGExNmFkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3Mvbm90YXJnZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy9ub3RhcmdldC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90YXJnZXRsZXZlbGFudC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdGFyZ2V0bGV2ZWxhbnQueG1sCmluZGV4IDliMWJiMWQuLmU0YzMyYjkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90YXJnZXRsZXZlbGFudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL3RhcmdldGxldmVsYW50LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL3RvcGxldmVsYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90b3BsZXZlbGFudC54bWwKaW5kZXggOTY4YWQ2Yy4uMTJlYWQxZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL3RvcGxldmVsYW50LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdG9wbGV2ZWxhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3Vua25vd25lbGVtZW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdW5rbm93bmVsZW1lbnQueG1sCmluZGV4IGI2ZDg5MzkuLjY1MjYwMjMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdW5rbm93bmVsZW1lbnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdW5rbm93bmVsZW1lbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw3ICsyMSw2IEBACiAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5Vbmtub3duRWxlbWVudFRlc3QkUGFyZW50IgogICAgICAgICAgICAgIGxvYWRlcnJlZj0idW5rbm93bi5pZCI+CiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgogICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgICAgICA8L2NsYXNzcGF0aD4KICAgICA8L3Rhc2tkZWY+CkBAIC0zMyw2ICszMiw3IEBACiAgICAgICA8Y2hpbGQvPgogICAgIDwvcGFyZW50PgogICA8L3RhcmdldD4KKwogICA8dGFyZ2V0IG5hbWU9ImVjaG8iPgogICAgIDxlY2hvIG1lc3NhZ2U9IkhlbGxvLCB3b3JsZCEiLz4KICAgPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2J1aWxkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sCmluZGV4IGI3MGI3NzguLjM3MWFmM2EgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvYnVpbGQueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNiwxMiArMTYsMTMgQEAKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8cHJvamVjdCBkZWZhdWx0PSJ0ZWFyRG93biIgYmFzZWRpcj0iLiI+CisKICAgPGltcG9ydCBmaWxlPSIuLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CisKICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CiAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgogICA8L3RhcmdldD4KIAotCiAgIDx0YXJnZXQgbmFtZT0idGVzdExpbmVDb250YWlucyIgZGVwZW5kcz0ic2V0VXAiPgogICAgIDxjb3B5IHRvZGlyPSIke291dHB1dH0iPgogICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCI+CkBAIC03OSw4ICs4MCw4IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFJlcGxhY2VUb2tlbnMiIGRlcGVuZHM9InNldFVwIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtvdXRwdXR9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iaW5wdXQiIGluY2x1ZGVzPSJyZXBsYWNldG9rZW5zLnRlc3QiIC8+CisgICAgPGNvcHkgIHRvZmlsZT0iJHtvdXRwdXR9L3JlcGxhY2VUb2tlbnMudGVzdCI+CisgICAgICA8ZmlsZXNldCBkaXI9ImlucHV0IiBpbmNsdWRlcz0icmVwbGFjZXRva2Vucy50ZXN0Ii8+CiAgICAgICA8ZmlsdGVyY2hhaW4+CiAgICAgICAgIDxyZXBsYWNldG9rZW5zPgogICAgICAgICAgIDx0b2tlbiBrZXk9ImZvbyIgdmFsdWU9IiIvPgpAQCAtOTAsMTkgKzkxLDE5IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFJlcGxhY2VUb2tlbnNQcm9wZXJ0eUZpbGUiIGRlcGVuZHM9InNldFVwIj4KLSAgICA8Y29weSB0b2ZpbGU9IiR7b3V0cHV0fS9yZXBsYWNldG9rZW5zUHJvcGVydHlGaWxlLnRlc3QiPgotICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMudGVzdCIgLz4KKyAgICA8Y29weSB0b2ZpbGU9IiR7b3V0cHV0fS9yZXBsYWNlVG9rZW5zUHJvcGVydHlGaWxlLnRlc3QiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMudGVzdCIvPgogICAgICAgPGZpbHRlcmNoYWluPgogICAgICAgCTxmaWx0ZXJyZWFkZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlJlcGxhY2VUb2tlbnMiPgogICAgICAgICAgIDxwYXJhbSB0eXBlPSJwcm9wZXJ0aWVzZmlsZSIgdmFsdWU9IiR7YmFzZWRpcn0vaW5wdXQvc2FtcGxlLnByb3BlcnRpZXMiLz4KLSAgICAJICA8L2ZpbHRlcnJlYWRlcj4KKyAgICAgICAgPC9maWx0ZXJyZWFkZXI+CiAgICAgICA8L2ZpbHRlcmNoYWluPgogICAgIDwvY29weT4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVwbGFjZVRva2Vuc0RvdWJsZUVuY29kZWQiIGRlcGVuZHM9InNldFVwIj4KLSAgICA8Y29weSB0b2Rpcj0iJHtvdXRwdXR9Ij4KLSAgICAgIDxmaWxlc2V0IGRpcj0iaW5wdXQiIGluY2x1ZGVzPSJyZXBsYWNldG9rZW5zLmRvdWJsZS50ZXN0IiAvPgorICAgIDxjb3B5IHRvZmlsZT0iJHtvdXRwdXR9L3JlcGxhY2VUb2tlbnNEb3VibGVFbmNvZGVkLnRlc3QiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMuZG91YmxlLnRlc3QiLz4KICAgICAgIDxmaWx0ZXJjaGFpbj4KICAgICAgICAgPHJlcGxhY2V0b2tlbnM+CiAgICAgICAgICAgPHRva2VuIGtleT0iZm9vIiB2YWx1ZT0iIi8+CkBAIC0xMTIsOCArMTEzLDggQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVwbGFjZVRva2Vuc0RvdWJsZUVuY29kZWRUb1NpbXBsZSIgZGVwZW5kcz0ic2V0VXAiPgotICAgIDxjb3B5IHRvZGlyPSIke291dHB1dH0iPgotICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMuZG91YmxlLnRlc3QiIC8+CisgICAgPGNvcHkgdG9maWxlPSIke291dHB1dH0vcmVwbGFjZVRva2Vuc0RvdWJsZUVuY29kZWRUb1NpbXBsZS50ZXN0Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iaW5wdXQiIGluY2x1ZGVzPSJyZXBsYWNldG9rZW5zLmRvdWJsZS50ZXN0Ii8+CiAgICAgICA8ZmlsdGVyY2hhaW4+CiAgICAgICAgIDxyZXBsYWNldG9rZW5zIGJlZ2ludG9rZW49IkBAIiBlbmR0b2tlbj0iQEAiPgogICAgICAgICAgIDx0b2tlbiBrZXk9ImZvbyIgdmFsdWU9IiIvPgpAQCAtMTIzLDggKzEyNCw4IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFJlcGxhY2VUb2tlbnNNdXN0YWNoZVN0eWxlIiBkZXBlbmRzPSJzZXRVcCI+Ci0gICAgPGNvcHkgdG9kaXI9IiR7b3V0cHV0fSI+Ci0gICAgICA8ZmlsZXNldCBkaXI9ImlucHV0IiBpbmNsdWRlcz0icmVwbGFjZXRva2Vucy5tdXN0YWNoZS50ZXN0IiAvPgorICAgIDxjb3B5IHRvZmlsZT0iJHtvdXRwdXR9L3JlcGxhY2VUb2tlbnNNdXN0YWNoZVN0eWxlLnRlc3QiPgorICAgICAgPGZpbGVzZXQgZGlyPSJpbnB1dCIgaW5jbHVkZXM9InJlcGxhY2V0b2tlbnMubXVzdGFjaGUudGVzdCIvPgogICAgICAgPGZpbHRlcmNoYWluPgogICAgICAgICA8cmVwbGFjZXRva2VucyBiZWdpbnRva2VuPSJ7eyIgZW5kdG9rZW49In19Ij4KICAgICAgICAgICA8dG9rZW4ga2V5PSJmb28iIHZhbHVlPSIiLz4KQEAgLTE0NCw0ICsxNDUsMzEgQEAKICAgICA8ZmFpbCB1bmxlc3M9ImZpbHRlcmNoYWluLmZpbGVzLmFyZS5zYW1lIj5GaWxlIHdhcyBtb2RpZmllZDwvZmFpbD4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0TWF0Y2hBbnkiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8Y29weSB0b2Rpcj0iJHtvdXRwdXR9Ij4KKyAgICAgIDxmaWxlc2V0IGRpcj0iaW5wdXQiPgorICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaW5lY29udGFpbnMudGVzdCIvPgorICAgICAgPC9maWxlc2V0PgorICAgICAgPGZpbHRlcmNoYWluPgorICAgICAgICA8bGluZWNvbnRhaW5zIG1hdGNoQW55PSJ0cnVlIj4KKyAgICAgICAgICA8Y29udGFpbnMgdmFsdWU9ImJldGEiLz4KKyAgICAgICAgICA8Y29udGFpbnMgdmFsdWU9ImFscGhhIi8+CisgICAgICAgIDwvbGluZWNvbnRhaW5zPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hdGNoQW55TmVnYXRlIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGNvcHkgdG9kaXI9IiR7b3V0cHV0fSI+CisgICAgICA8ZmlsZXNldCBkaXI9ImlucHV0Ij4KKyAgICAgICAgPGluY2x1ZGUgbmFtZT0ibGluZWNvbnRhaW5zLnRlc3QiLz4KKyAgICAgIDwvZmlsZXNldD4KKyAgICAgIDxmaWx0ZXJjaGFpbj4KKyAgICAgICAgPGxpbmVjb250YWlucyBtYXRjaEFueT0idHJ1ZSIgbmVnYXRlPSJ0cnVlIj4KKyAgICAgICAgICA8Y29udGFpbnMgdmFsdWU9ImJldGEiLz4KKyAgICAgICAgICA8Y29udGFpbnMgdmFsdWU9ImFscGhhIi8+CisgICAgICAgIDwvbGluZWNvbnRhaW5zPgorICAgICAgPC9maWx0ZXJjaGFpbj4KKyAgICA8L2NvcHk+CisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9jb25jYXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9jb25jYXQueG1sCmluZGV4IDI2MmRkMTYuLjM4NzdmNDYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvY29uY2F0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2NvbmNhdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZHluYW1pY2ZpbHRlci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2R5bmFtaWNmaWx0ZXIueG1sCmluZGV4IGNiNTJkMjEuLmJkOTYyMGYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZHluYW1pY2ZpbHRlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9keW5hbWljZmlsdGVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTcgKzIwLDE1IEBACiAgIDxpbXBvcnQgZmlsZT0iLi4vYnVpbGRmaWxldGVzdC1iYXNlLnhtbCIvPgogCiAgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgotICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIgLz4KKyAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJkeW5hbWljZmlsdGVyIj4KICAgICA8cGF0aCBpZD0idGVzdC1jbGFzc2VzIj4KLSAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgotICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgICA8L3BhdGg+Ci0gICAgPHR5cGVkZWYgCi0gICAgICBuYW1lPSJjdXN0b21maWx0ZXIiIAotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkR5bmFtaWNGaWx0ZXJUZXN0JEN1c3RvbUZpbHRlciI+CisgICAgPHR5cGVkZWYgbmFtZT0iY3VzdG9tZmlsdGVyIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5EeW5hbWljRmlsdGVyVGVzdCRDdXN0b21GaWx0ZXIiPgogICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC1jbGFzc2VzIi8+CiAgICAgPC90eXBlZGVmPgogICAgIApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9saW5lY29udGFpbnMtbWF0Y2hhbnktbmVnYXRlLnRlc3QgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2xpbmVjb250YWlucy1tYXRjaGFueS1uZWdhdGUudGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGFjYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9leHBlY3RlZC9saW5lY29udGFpbnMtbWF0Y2hhbnktbmVnYXRlLnRlc3QKQEAgLTAsMCArMSwyIEBACitUaGlzIGlzIGxpbmUgNCB3aXRoIGdhbW1hLgorVGhpcyBpcyBsaW5lIDYgd2l0aCBkZWx0YS4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvZXhwZWN0ZWQvbGluZWNvbnRhaW5zLW1hdGNoYW55LnRlc3QgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2xpbmVjb250YWlucy1tYXRjaGFueS50ZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDcyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2V4cGVjdGVkL2xpbmVjb250YWlucy1tYXRjaGFueS50ZXN0CkBAIC0wLDAgKzEsNSBAQAorVGhpcyBpcyBsaW5lIDEgd2l0aCBhbHBoYS4KK1RoaXMgaXMgbGluZSAyIHdpdGggYmV0YS4KK1RoaXMgaXMgbGluZSAzIHdpdGggYmV0YS4KK1RoaXMgaXMgbGluZSA1IHdpdGggYmV0YS4KK1RoaXMgaXMgbGluZSA3IHdpdGggYmV0YS4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaGVhZC10YWlsLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaGVhZC10YWlsLnhtbAppbmRleCBlMGZmZWQ3Li41YmIzNDkyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2hlYWQtdGFpbC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9oZWFkLXRhaWwueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw2IEBACiAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgogICA8L3RhcmdldD4KIAotCiAgIDwhLS0gVGVzdGNhc2VzIGZvciBIZWFkRmlsdGVyIC0tPgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdEhlYWQiIGRlcGVuZHM9InNldFVwIj4KQEAgLTEzNSw3ICsxMzQsNyBAQAogICA8IS0tIFRlc3RjYXNlcyBmb3IgY29tYmluZWQgc2NlbmFyaW9zIC0tPgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdEhlYWRUYWlsIiBkZXBlbmRzPSJzZXRVcCI+Ci0gICAgPGNvcHkgZmlsZT0iaW5wdXQvaGVhZC10YWlsLnRlc3QiIHRvZmlsZT0iJHtvdXRwdXR9L2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0Ij4KKyAgICA8Y29weSBmaWxlPSJpbnB1dC9oZWFkLXRhaWwudGVzdCIgdG9maWxlPSIke291dHB1dH0vaGVhZC10YWlsLmhlYWRUYWlsLnRlc3QiPgogICAgICAgPGZpbHRlcmNoYWluPgogICAgICAgICA8aGVhZGZpbHRlciBsaW5lcz0iNCIvPgogICAgICAgICA8dGFpbGZpbHRlciBsaW5lcz0iMiIvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9zYW1wbGUucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvaW5wdXQvc2FtcGxlLnByb3BlcnRpZXMKaW5kZXggNTcyZTc5ZC4uM2QzMTZmNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy9pbnB1dC9zYW1wbGUucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL2lucHV0L3NhbXBsZS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL2ZpbHRlcnMvdG9rZW5maWx0ZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy90b2tlbmZpbHRlci54bWwKaW5kZXggYjFiNWFlZi4uY2M0YjIzNCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy90b2tlbmZpbHRlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvZmlsdGVycy90b2tlbmZpbHRlci54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDcgKzIwLDcgQEAKICAgPGltcG9ydCBmaWxlPSIuLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CiAKICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+Ci0gICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRva2VuZmlsdGVyIj4KQEAgLTMxNCwxNCArMzE0LDExIEBACiAKICAgPHRhcmdldCBuYW1lPSJjdXN0b210b2tlbmZpbHRlciI+CiAgICAgPHBhdGggaWQ9InRlc3QtY2xhc3NlcyI+Ci0gICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgICAgPC9wYXRoPgogCi0KLSAgICA8dHlwZWRlZiAKLSAgICAgIG5hbWU9ImNhcGl0YWxpemUiIAotICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLlRva2VuRmlsdGVyVGVzdCRDYXBpdGFsaXplIj4KKyAgICA8dHlwZWRlZiBuYW1lPSJjYXBpdGFsaXplIgorICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Ub2tlbkZpbHRlclRlc3QkQ2FwaXRhbGl6ZSI+CiAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LWNsYXNzZXMiLz4KICAgICA8L3R5cGVkZWY+CiAgICAgCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hYnN0cmFjdGN2c3Rhc2sueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYWJzdHJhY3RjdnN0YXNrLnhtbAppbmRleCA1ZGU4YjVlLi5jNjNmYzAyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hYnN0cmFjdGN2c3Rhc2sueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Fic3RyYWN0Y3ZzdGFzay54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC50b3BsZXZlbHRlc3QueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnRvcGxldmVsdGVzdC54bWwKaW5kZXggNjViYzcyOS4uYzQzZDNmMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnRvcGxldmVsdGVzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnRvcGxldmVsdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQueG1sCmluZGV4IDMzZWYxZGEuLmM2NTllM2MgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50L2FudC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvYW50LnhtbAppbmRleCA1MmM5YTcwLi40ODZkNmUyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvYW50LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvYW50LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50L3JlZmVyZW5jZXMueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50L3JlZmVyZW5jZXMueG1sCmluZGV4IDBmM2E2OTMuLmQ5MWU2NjAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudC9yZWZlcmVuY2VzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnQvcmVmZXJlbmNlcy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudGxpYi5jdXJyZW50LXRlc3QueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLmN1cnJlbnQtdGVzdC54bWwKaW5kZXggMGFkNDRkYi4uYzE2YmVlNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLmN1cnJlbnQtdGVzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLmN1cnJlbnQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudGxpYi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRsaWIueG1sCmluZGV4IGQxYzQwNjEuLmRhNDZkOTMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudGxpYi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50bGliLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTEgKzE3LDggQEAKIC0tPgogPHByb2plY3QgbmFtZT0idGVzdCI+CiAKLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjYXNlcy5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiLz4KLQogICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2FzZXMuZGlyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0iYW50bGliLmZpbGUiPgpAQCAtMzIsMTQgKzI5LDE0IEBACiAKICAgPHRhcmdldCBuYW1lPSJhbnRsaWIucmVzb3VyY2UiPgogICAgIDx0eXBlZGVmIHJlc291cmNlPSJ0YXNrZGVmcy90ZXN0LmFudGxpYi54bWwiPgotICAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICAgICAgPCEtLSBUbyBsb2FkIHRoZSB0YXNrIGNsYXNzZXM6IC0tPgotICAgICAgICAgICAgPHBhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+Ci0gICAgICAgICAgICA8IS0tIEZvciB0ZXN0LmFudGxpYi54bWw6IC0tPgotICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLiIvPgotICAgICAgICAgICAgPCEtLSBGb3IgdGVzdDIuYW50bGliLnhtbDogLS0+Ci0gICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdGNhc2VzLmRpcn0vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvdGVzdDItYW50bGliLmphciIvPgotICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDwhLS0gVG8gbG9hZCB0aGUgdGFzayBjbGFzc2VzOiAtLT4KKyAgICAgICAgPHBhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+CisgICAgICAgIDwhLS0gRm9yIHRlc3QuYW50bGliLnhtbDogLS0+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4iLz4KKyAgICAgICAgPCEtLSBGb3IgdGVzdDIuYW50bGliLnhtbDogLS0+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC50ZXN0cy52YWx1ZX0vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvdGVzdDItYW50bGliLmphciIvPgorICAgICAgPC9jbGFzc3BhdGg+CiAgICAgPC90eXBlZGVmPgogICAgIDxteXRhc2svPgogICAgIDxlY2hvPi1hbmQtdGhlbi08L2VjaG8+CkBAIC01OSw3ICs1Niw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJhbnRsaWJfdXJpX2F1dG8iIHhtbG5zOmV4PSJhbnRsaWI6b3JnLmV4YW1wbGUudGFza3MiPgogICAgIDxleDpzaW1wbGU+Ci0gICAgICA8ZWNobyBtZXNzYWdlPSJpbnNpZGUgc2ltcGxlIiAvPgorICAgICAgPGVjaG8gbWVzc2FnZT0iaW5zaWRlIHNpbXBsZSIvPgogICAgIDwvZXg6c2ltcGxlPgogICA8L3RhcmdldD4KIApAQCAtNjksNCArNjYsNCBAQAogICAgIDwvZXg6c2ltcGxlPgogICA8L3RhcmdldD4KICAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50c3RydWN0dXJlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2FudHN0cnVjdHVyZS54bWwKaW5kZXggNTE2YTk3My4uNzFiMWMxYSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYW50c3RydWN0dXJlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hbnRzdHJ1Y3R1cmUueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYXZhaWxhYmxlLnhtbAppbmRleCAzMjRjMDU0Li43OGIxOTgxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9hdmFpbGFibGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2F2YWlsYWJsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Jhci5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFyLnByb3BlcnRpZXMKaW5kZXggYzY0YjkxZS4uMjg5OWZlNCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFyLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFyLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFzZW5hbWUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYmFzZW5hbWUueG1sCmluZGV4IGM1ZmQyYWIuLjYyN2IyZmYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Jhc2VuYW1lLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iYXNlbmFtZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J1bnppcDIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYnVuemlwMi54bWwKaW5kZXggOGFlMTc1OC4uMTFlMTVmNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYnVuemlwMi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYnVuemlwMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J6aXAyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2J6aXAyLnhtbAppbmRleCBlMTMzZGFlLi44ZGRmOGViIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9iemlwMi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvYnppcDIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jYWxsdGFyZ2V0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NhbGx0YXJnZXQueG1sCmluZGV4IDRjM2FmOTIuLjc5MjdlYzkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NhbGx0YXJnZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NhbGx0YXJnZXQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jaGVja3N1bS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jaGVja3N1bS54bWwKaW5kZXggZTgyZmI2OS4uMTAxM2Q1NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2hlY2tzdW0ueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NoZWNrc3VtLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2xhc3Nsb2FkZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY2xhc3Nsb2FkZXIueG1sCmluZGV4IDAyZTQ3YWIuLjM2ODlhOTAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NsYXNzbG9hZGVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jbGFzc2xvYWRlci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25jYXQueG1sCmluZGV4IDIzNWIxNTIuLjg4NzlmNGYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmNhdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uY2F0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9uLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbi54bWwKaW5kZXggODE2NjBhZS4uYWI1Njg4NCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9uLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb24ueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2FudHZlcnNpb24ueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9hbnR2ZXJzaW9uLnhtbAppbmRleCAzOGJmYzg4Li4zOWU4NzM5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2FudHZlcnNpb24ueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvYW50dmVyc2lvbi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDExICszMiwxMCBAQAogICAgICAgICAgICAgICAgIDxmYWlsPgogICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50dmVyc2lvbiBleGFjdGx5PSIxLjkuMTUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudHZlcnNpb24gZXhhY3RseT0iMS4xMC44IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2hvdWxkIGJlIGV4YWN0bHkgMS45LjE1Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSBleGFjdGx5IDEuMTAuOAogICAgICAgICAgICAgICAgIDwvZmFpbD4KICAgICAgICAgPC90YXJnZXQ+CiAKQEAgLTQ1LDEwICs0NCwxMCBAQAogICAgICAgICAgICAgICAgIDxmYWlsPgogICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50dmVyc2lvbiBhdGxlYXN0PSIxLjkuMTUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudHZlcnNpb24gYXRsZWFzdD0iMS45LjgiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90PgogICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgU2hvdWxkIGJlIGF0IGxlYXN0IDEuOS4xNQorICAgICAgICAgICAgICAgIFNob3VsZCBiZSBhdCBsZWFzdCAxLjkuOAogICAgICAgICAgICAgICAgIDwvZmFpbD4KICAgICAgICAgPC90YXJnZXQ+CiAKQEAgLTU3LDEwICs1NiwxMCBAQAogICAgICAgICAgICAgICAgIDxmYWlsPgogICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmRpdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YW50dmVyc2lvbiBleGFjdGx5PSIxLjkuMTUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFudHZlcnNpb24gZXhhY3RseT0iMS45LjgiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90PgogICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgICBTaG91bGQgYmUgZXhhY3RseSAxLjkuMTUKKyAgICAgICAgICAgICAgICAgIFNob3VsZCBiZSBleGFjdGx5IDEuOS44CiAgICAgICAgICAgICAgICAgPC9mYWlsPgogICAgICAgICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaHR0cC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2h0dHAueG1sCmluZGV4IDc2ZTg3Y2IuLjc2YWU5ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaHR0cC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9odHRwLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMzQgKzIzLDM0IEBACiAKICAgPHRhcmdldCBuYW1lPSJiYXNpYy1uby1tZXRob2QiPgogICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYmFzaWMtbm8tbWV0aG9kIj4KLSAgICAgICAgICA8aHR0cCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iLz4KKyAgICAgICAgICA8aHR0cCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIi8+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImJhc2ljLW5vLW1ldGhvZC1iYWQtdXJsIj4KLSAgICAgICAgICA8aHR0cCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy90aGlzLXBhZ2UtZG9lcy1ub3QtZXhpc3QiLz4KKyAgICAgICAgICA8aHR0cCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvdGhpcy1wYWdlLWRvZXMtbm90LWV4aXN0Ii8+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWhlYWQtcmVxdWVzdCI+CiAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0LWhlYWQtcmVxdWVzdCI+Ci0gICAgICAgICAgPGh0dHAgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIiByZXF1ZXN0TWV0aG9kPSJIRUFEIi8+CisgICAgICAgICAgPGh0dHAgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnLyIgcmVxdWVzdE1ldGhvZD0iSEVBRCIvPgogICAgICAgPC9jb25kaXRpb24+CiAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ0ZXN0LWhlYWQtcmVxdWVzdC1iYWQtdXJsIj4KLSAgICAgICAgICA8aHR0cCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy90aGlzLXBhZ2UtZG9lcy1ub3QtZXhpc3QiIHJlcXVlc3RNZXRob2Q9IkhFQUQiLz4KKyAgICAgICAgICA8aHR0cCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvdGhpcy1wYWdlLWRvZXMtbm90LWV4aXN0IiByZXF1ZXN0TWV0aG9kPSJIRUFEIi8+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWdldC1yZXF1ZXN0Ij4KICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3QtZ2V0LXJlcXVlc3QiPgotICAgICAgICAgIDxodHRwIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnLyIgcmVxdWVzdE1ldGhvZD0iR0VUIi8+CisgICAgICAgICAgPGh0dHAgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnLyIgcmVxdWVzdE1ldGhvZD0iR0VUIi8+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InRlc3QtZ2V0LXJlcXVlc3QtYmFkLXVybCI+Ci0gICAgICAgICAgPGh0dHAgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvdGhpcy1wYWdlLWRvZXMtbm90LWV4aXN0IiByZXF1ZXN0TWV0aG9kPSJHRVQiLz4KKyAgICAgICAgICA8aHR0cCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvdGhpcy1wYWdlLWRvZXMtbm90LWV4aXN0IiByZXF1ZXN0TWV0aG9kPSJHRVQiLz4KICAgICAgIDwvY29uZGl0aW9uPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImJhZC1yZXF1ZXN0LW1ldGhvZCI+CiAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJiYWQtcmVxdWVzdC1tZXRob2QiPgotICAgICAgICAgIDxodHRwIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnIiByZXF1ZXN0TWV0aG9kPSJVTktOT1dOIi8+CisgICAgICAgICAgPGh0dHAgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnIiByZXF1ZXN0TWV0aG9kPSJVTktOT1dOIi8+CiAgICAgICA8L2NvbmRpdGlvbj4KICAgPC90YXJnZXQ+CiAKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmYWlsdXJlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmYWlsdXJlLnhtbAppbmRleCBiNWQxYTZhLi4wMDUxMzljIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzZmFpbHVyZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc2ZhaWx1cmUueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzZmlsZXNlbGVjdGVkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmaWxlc2VsZWN0ZWQueG1sCmluZGV4IDA2MjZlZWQuLjc5Yzg4YjUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmaWxlc2VsZWN0ZWQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmaWxlc2VsZWN0ZWQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVhY2hhYmxlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWFjaGFibGUueG1sCmluZGV4IDNmNzRhZWYuLjQzNjlkYjYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWFjaGFibGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWFjaGFibGUueG1sCkBAIC04LDcgKzgsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVmZXJlbmNlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UueG1sCmluZGV4IGQxZjg2ZGIuLjk0MjE3YzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzc2lnbmVkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNzaWduZWQueG1sCmluZGV4IDdjYmYzMjguLjE1NTRhZWMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNzaWduZWQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNzaWduZWQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3BhcnNlcnN1cHBvcnRzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvcGFyc2Vyc3VwcG9ydHMueG1sCmluZGV4IGM4MGZkMzUuLmZlYWRjZjMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvcGFyc2Vyc3VwcG9ydHMueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvcGFyc2Vyc3VwcG9ydHMueG1sCkBAIC04LDcgKzgsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy90eXBlZm91bmQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy90eXBlZm91bmQueG1sCmluZGV4IDA1NGNhNjcuLjA4MGM5MzkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvdHlwZWZvdW5kLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3R5cGVmb3VuZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMveG9yLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMveG9yLnhtbAppbmRleCA4OTVkY2NkLi44MjI3OTQ5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3hvci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy94b3IueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkueG1sCmluZGV4IDI2MDE1NTYuLjg3ODA5ODAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHkueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZGlyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCmluZGV4IDhhOGFiZDMuLjhjZjA4NzMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlkaXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb3B5ZmlsZS54bWwKaW5kZXggMGY4YzlhYi4uNDA2ZTBmMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29weWZpbGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvcHlmaWxlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY3ZzcGFzcy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbAppbmRleCBiYmNhMTEwLi42YWRlY2MxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVmYXVsdGV4Y2x1ZGVzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlZmF1bHRleGNsdWRlcy54bWwKaW5kZXggNDYyOTI1MC4uNjViZjM3ZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVmYXVsdGV4Y2x1ZGVzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWZhdWx0ZXhjbHVkZXMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWxldGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbAppbmRleCBkNzRjOGJhLi5lZTRjN2ZhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9kZWxldGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbGV0ZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDcgKzIwLDYgQEAKIAogICA8aW1wb3J0IGZpbGU9Ii4uL2J1aWxkZmlsZXRlc3QtYmFzZS54bWwiLz4KIAotCiAgIDxwcm9wZXJ0eSBuYW1lPSJkaXIiIGxvY2F0aW9uPSIke291dHB1dH0iIC8+CiAgIDxiYXNlbmFtZSBwcm9wZXJ0eT0iZGlybmFtZSIgZmlsZT0iJHtvdXRwdXR9Ii8+CiAKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2RlbHRyZWUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsdHJlZS54bWwKaW5kZXggYzY5ZDUxZi4uZjM1MzM0MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsdHJlZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsdHJlZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Rpcm5hbWUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGlybmFtZS54bWwKaW5kZXggMTAyN2RiMS4uZGFmYWU5MiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGlybmFtZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGlybmFtZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2R5bmFtaWN0YXNrLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2R5bmFtaWN0YXNrLnhtbAppbmRleCAzMDcxODFmLi41MGUzM2Y2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9keW5hbWljdGFzay54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZHluYW1pY3Rhc2sueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxNCArMTksMTMgQEAKIDxwcm9qZWN0IG5hbWU9ImR5bmFtaWMtdGVzdCIgZGVmYXVsdD0ic2ltcGxlIj4KIAogICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgogICA8L3BhdGg+CiAKICAgPHRhcmdldCBuYW1lPSJzaW1wbGUiPgogICAgIDx0YXNrZGVmIG5hbWU9ImR5bmEiCiAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EeW5hbWljVGFzayI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+CiAgICAgPC90YXNrZGVmPgogICAgIDxkeW5hIHByb3AxPSIxIiBwcm9wMj0iMiI+CiAgICAgICA8c3ViIHByb3AzPSIzIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lY2hveG1sLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sCmluZGV4IGVjNTNhYmIuLjllZTgxOWEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VjaG94bWwueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9lbWFpbC9tYWlsLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sCmluZGV4IDUxNDRiN2EuLjEyYzMxNWIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2JsYWJsYS5zaCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvYmxhYmxhLnNoCmluZGV4IGM5OTZkNmEuLjc2YTQxODkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvYmxhYmxhLnNoCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvYmxhYmxhLnNoCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvZXhlYy13aXRoLXJlZGlyZWN0b3IueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLXdpdGgtcmVkaXJlY3Rvci54bWwKaW5kZXggMjdiNjgwZC4uOGZiY2M4YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLXdpdGgtcmVkaXJlY3Rvci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLXdpdGgtcmVkaXJlY3Rvci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvZXhlYy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4ZWMueG1sCmluZGV4IDIwZTU2NTYuLjk5OGNiMDYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvZXhlYy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9leGVjLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9wYXJyb3Quc2ggYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3BhcnJvdC5zaAppbmRleCBjMDY0YzM4Li5jMmMwODdiIDEwMDc1NQotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3BhcnJvdC5zaAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3BhcnJvdC5zaApAQCAtNiw3ICs2LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3NwYXduLnNoIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy9zcGF3bi5zaAppbmRleCBhNjM5Y2U1Li4wOTU1NmY4IDEwMDc1NQotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL3NwYXduLnNoCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4ZWMvc3Bhd24uc2gKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnh6IGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnh6Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWVlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYueHoKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmFpbC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mYWlsLnhtbAppbmRleCAwYTY1NjFlLi5iNWVhYmE0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mYWlsLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mYWlsLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlci54bWwKaW5kZXggMzAzZWZhNy4uMGUxMDliZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXJkZWZzLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maWx0ZXJkZWZzLnByb3BlcnRpZXMKaW5kZXggZjA5OWRmMy4uMDQ2YWQ3OSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZmlsdGVyZGVmcy5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpbHRlcmRlZnMucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2J1aWxkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvYnVpbGQueG1sCmluZGV4IGUyZmVjYWMuLmMyZDlkYzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvYnVpbGQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ZpeGNybGYvYnVpbGQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mb28ucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Zvby5wcm9wZXJ0aWVzCmluZGV4IGU0YTgxNTIuLjRlMjA1NDkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Zvby5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Zvby5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2dldC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nZXQueG1sCmluZGV4IGI3NGU5MmEuLmExMGE0MTQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2dldC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ2V0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzUsMTEgKzM1LDExIEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDxnZXQgc3JjPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiBkZXN0PSIiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy8iIGRlc3Q9IiIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3Q2Ij4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgZGVzdD0iZ2V0LnRtcCIgdXNlckFnZW50PSJBcGFjaGUgQW50L3Rlc3QiLz4KKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy8iIGRlc3Q9ImdldC50bXAiIHVzZXJBZ2VudD0iQXBhY2hlIEFudC90ZXN0Ii8+CiAKICAgICA8ZmlsZXNldCBpZD0idDYiIGZpbGU9ImdldC50bXAiIC8+CiAgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJ0NiIgcmVmaWQ9InQ2IiBzZXRvbmVtcHR5PSJmYWxzZSIgLz4KQEAgLTgwLDcgKzgwLDcgQEAKIAogICAgIDx0b3VjaCBmaWxlPSJnZXQudG1wIiBkYXRldGltZT0iJHtkdH0iIHBhdHRlcm49IiR7cGF0fSIgLz4KIAotICAgIDxnZXQgc3JjPSJodHRwOi8vd3d3LnczLm9yZy9NYXJrVXAiIGRlc3Q9ImdldC50bXAiCisgICAgPGdldCBzcmM9Imh0dHBzOi8vd3d3LnczLm9yZy9NYXJrVXAiIGRlc3Q9ImdldC50bXAiCiAgICAgICAgICB1c2V0aW1lc3RhbXA9InRydWUiIHZlcmJvc2U9InRydWUiIC8+CiAKICAgICA8ZmlsZXNldCBpZD0idHMiIGZpbGU9ImdldC50bXAiPgpAQCAtOTgsNiArOTgsMzQgQEAKICAgICA8L2ZhaWw+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0idGVzdFR3b0hlYWRlcnNBcmVBZGRlZE9LIj4KKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy8iIGRlc3Q9ImdldC50bXAiPgorICAgICAgPGhlYWRlciBuYW1lPSJoZWFkZXIxIiB2YWx1ZT0iaGVhZGVyMVZhbHVlIi8+CisgICAgICA8aGVhZGVyIG5hbWU9ImhlYWRlcjIiIHZhbHVlPSJoZWFkZXIyVmFsdWUiLz4KKyAgICA8L2dldD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RW1wdHlIZWFkZXJzQXJlTmV2ZXJBZGRlZCI+CisgICAgPGdldCBzcmM9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvIiBkZXN0PSJnZXQudG1wIj4KKyAgICAgIDxoZWFkZXIgbmFtZT0iIiB2YWx1ZT0iaGVhZGVyVmFsdWUiLz4KKyAgICAgIDxoZWFkZXIgbmFtZT0iaGVhZGVyMiIgdmFsdWU9IiIvPgorICAgIDwvZ2V0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RUaGF0V2hlbk1vcmVUaGFuT25lSGVhZGVySGF2ZVNhbWVOYW1lT25seUxhc3RPbmVJc0FkZGVkIj4KKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy8iIGRlc3Q9ImdldC50bXAiPgorICAgICAgPGhlYWRlciBuYW1lPSJoZWFkZXIxIiB2YWx1ZT0iaGVhZGVyVmFsdWUxIi8+CisgICAgICA8aGVhZGVyIG5hbWU9ImhlYWRlcjEiIHZhbHVlPSJoZWFkZXJWYWx1ZTIiLz4KKyAgICAgIDxoZWFkZXIgbmFtZT0iaGVhZGVyMSIgdmFsdWU9ImhlYWRlclZhbHVlMyIvPgorICAgIDwvZ2V0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RIZWFkZXJTcGFjZVRyaW1tZWQiPgorICAgIDxnZXQgc3JjPSJodHRwczovL3d3dy5hcGFjaGUub3JnLyIgZGVzdD0iZ2V0LnRtcCI+CisgICAgICA8aGVhZGVyIG5hbWU9IiAgaGVhZGVyMSAgICAgIiB2YWx1ZT0iICBoZWFkZXJWYWx1ZTEgICIvPgorICAgIDwvZ2V0PgorICA8L3RhcmdldD4KKwogICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgogICAgIDxkZWxldGU+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVzPSJnZXQudG1wIiAvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3VuemlwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d1bnppcC54bWwKaW5kZXggZWE3NWQ1NC4uMmI5NDAyYSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZ3VuemlwLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ndW56aXAueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nemlwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCmluZGV4IGYxYzQyNjIuLmM3MDQ2Y2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2d6aXAueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYS54bWwKaW5kZXggY2Y0ZTdhNS4uMzVlMjgwNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2EueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9hLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2IueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2IueG1sCmluZGV4IGY5NWNmMDEuLmYzZjk0M2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9iLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9iYWQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2JhZC54bWwKaW5kZXggYTNhMDY0Ny4uZjAyZjM3MCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2JhZC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2JhZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9jLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9jLnhtbAppbmRleCBkOTJmYmM3Li4yNTk1MDU0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvYy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2MueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnQueG1sCmluZGV4IGY4NGQ4ZTMuLjIwNzBjNjcgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0X2JhZF9pbXBvcnQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9iYWRfaW1wb3J0LnhtbAppbmRleCA4ZmY1MzY3Li44MmY1ZjU2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0X2JhZF9pbXBvcnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfYmFkX2ltcG9ydC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRfc2FtZV90YXJnZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9zYW1lX3RhcmdldC54bWwKaW5kZXggZjJiMTkzMy4uNTA5MjNhYyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9zYW1lX3RhcmdldC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9zYW1lX3RhcmdldC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRlZC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0ZWQueG1sCmluZGV4IDE5ZGZkYjAuLmRjYmI5YWEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnRlZC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydGVkLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydHRhcmdldGZpcnN0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9pbXBvcnR0YXJnZXRmaXJzdC54bWwKaW5kZXggODM1MTkxYi4uNTY4OWJhOSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydHRhcmdldGZpcnN0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0dGFyZ2V0Zmlyc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvcmVjdXJzaXZlLXNlbGZpbXBvcnQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3JlY3Vyc2l2ZS1zZWxmaW1wb3J0LnhtbAppbmRleCBkNWFlM2IyLi42Y2Q4YjkxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvcmVjdXJzaXZlLXNlbGZpbXBvcnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9yZWN1cnNpdmUtc2VsZmltcG9ydC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zYW1lX3RhcmdldC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc2FtZV90YXJnZXQueG1sCmluZGV4IDFhMTRmZTUuLjI2NGI3ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zYW1lX3RhcmdldC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3NhbWVfdGFyZ2V0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnNlcXVlbnRpYWwtaW5uZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnNlcXVlbnRpYWwtaW5uZXIueG1sCmluZGV4IGNjMmE2ODEuLmM0NjJiOGIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLWlubmVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGluc2VxdWVudGlhbC1pbm5lci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW5zZXF1ZW50aWFsLnhtbAppbmRleCBmZGQ2OGIwLi44NTMzMzRjIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGluc2VxdWVudGlhbC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9pbXBvcnRpbnNlcXVlbnRpYWwueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LWlubmVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQtaW5uZXIueG1sCmluZGV4IGNkNTA4NmUuLjI0YzFiMjggMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQtaW5uZXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQtaW5uZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQueG1sCmluZGV4IDJkZmEzNzAuLjUwODQ3Y2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvaW1wb3J0aW50YXJnZXQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL3NlcmlhbC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL3NlcmlhbC54bWwKaW5kZXggMzYwZjlkMS4uOTljNjM3MiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9zZXJpYWwueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zdWJkaXIvc2VyaWFsLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QxL3AxLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kMS9wMS54bWwKaW5kZXggZDFiNzkyYy4uNWNjYTJmNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QxL3AxLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDEvcDEueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDIvcDIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QyL3AyLnhtbAppbmRleCA1MTk0OGM5Li43OTA4MzU1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDIvcDIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kMi9wMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kM2EvcDMueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYS9wMy54bWwKaW5kZXggMzE4NTg0NS4uM2YwOGJhMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYS9wMy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYS9wMy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC90YXJnZXRmaXJzdC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdGFyZ2V0Zmlyc3QueG1sCmluZGV4IDA2YzFmYmUuLmQ1YTU0NWMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC90YXJnZXRmaXJzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3RhcmdldGZpcnN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWQxLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMS54bWwKaW5kZXggNmZjN2ZkZS4uZDkyMzcxOSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWQxLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZDEueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZDIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWQyLnhtbAppbmRleCBjMGZkN2M2Li40MDBjYzcxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZDIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkSW1wb3J0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC91bm5hbWVkSW1wb3J0LnhtbAppbmRleCAxM2IzYTg1Li45ZTE4NDVmIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZEltcG9ydC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3VubmFtZWRJbXBvcnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbml0aWFsaXplY2xhc3MueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5pdGlhbGl6ZWNsYXNzLnhtbAppbmRleCA2ZTA3OTkxLi4yNGJkMzcwIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbml0aWFsaXplY2xhc3MueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2luaXRpYWxpemVjbGFzcy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDEwICsyMiw5IEBACiAgIDx0YXJnZXQgbmFtZT0iZm9ya2VkIj4KICAgICA8amF2YSBmb3JrPSJ0cnVlIiBvdXRwdXQ9ImZvcmtlZG91dCIgZmFpbG9uZXJyb3I9InRydWUiCiAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5kaXIxLkIiPgotCiAgICAgICA8Y2xhc3NwYXRoPgotICAgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIi8+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9jbGFzc2VzLnppcCIgLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7YnVpbGQudGVzdHMudmFsdWV9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYi9jbGFzc2VzLnppcCIvPgogICAgICAgPC9jbGFzc3BhdGg+CiAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KQEAgLTMzLDggKzMyLDggQEAKICAgPHRhcmdldCBuYW1lPSJ1bmZvcmtlZCI+CiAgICAgPGphdmEgY2xhc3NOYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5kaXIxLkIiPgogICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IHBhdGg9Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIvY2xhc3Nlcy56aXAiIC8+CisgICAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2J1aWxkLnRlc3RzLnZhbHVlfSIvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIvY2xhc3Nlcy56aXAiLz4KICAgICAgIDwvY2xhc3NwYXRoPgogICAgIDwvamF2YT4KICAgPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQucHJvcGVydGllcwppbmRleCBjMDAyNWEzLi41ZTkzYTZlIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2lucHV0LnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW5wdXQueG1sCmluZGV4IGQyMDRiNzkuLmNmNDE5ODUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2lucHV0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbnB1dC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXIueG1sCmluZGV4IDc4ZDFhYmMuLmMxOTFlZDIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamFyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICAgICBkZXN0ZmlsZT0iJHt0bXAuamFyfSIKICAgICAgICAgIGJhc2VkaXI9Ii4iCiAgICAgICAgICBpbmNsdWRlcz0iaioueG1sIgotICAgICAgICAgZXhjbHVkZXM9ImphdmEueG1sIgorICAgICAgICAgZXhjbHVkZXM9ImphdmEueG1sLGptb2QueG1sIgogICAgICAgICAgdXBkYXRlPSJ0cnVlIgogICAgIC8+CiAgIDwvdGFyZ2V0PgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICBkZXN0ZmlsZT0iJHt0bXAuamFyfSIKICAgICAgICAgIGJhc2VkaXI9Ii4iCiAgICAgICAgICBpbmNsdWRlcz0iaioueG1sIgotICAgICAgICAgZXhjbHVkZXM9ImphdmEueG1sIgorICAgICAgICAgZXhjbHVkZXM9ImphdmEueG1sLGptb2QueG1sIgogICAgIC8+CiAgIDwvdGFyZ2V0PgogCkBAIC0xNDQsMTQgKzE0NCwxNCBAQAogICAgICAgICAgIGRlcGVuZHM9Im1ha2V6aXAiPgogICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iCiAgICAgICAgICB1cGRhdGU9InRydWUiPgotICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3RtcC56aXB9IiBleGNsdWRlcz0iamF2YS54bWwiLz4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt0bXAuemlwfSIgZXhjbHVkZXM9ImphdmEueG1sLGptb2QueG1sIi8+CiAgICAgPC9qYXI+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdE5vUmVjcmVhdGVaaXBmaWxlc2V0RXhjbHVkZXNXaXRob3V0VXBkYXRlIgogICAgICAgICAgIGRlcGVuZHM9Im1ha2V6aXAiPgogICAgIDxqYXIgZGVzdGZpbGU9IiR7dG1wLmphcn0iPgotICAgICAgPHppcGZpbGVzZXQgc3JjPSIke3RtcC56aXB9IiBleGNsdWRlcz0iamF2YS54bWwiLz4KKyAgICAgIDx6aXBmaWxlc2V0IHNyYz0iJHt0bXAuemlwfSIgZXhjbHVkZXM9ImphdmEueG1sLGptb2QueG1sIi8+CiAgICAgPC9qYXI+CiAgIDwvdGFyZ2V0PgogCkBAIC0yNjksNyArMjY5LDcgQEAKICAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IiBiYXNlZGlyPSIke3RtcC5kaXJ9IiBzdHJpY3Q9Indhcm4iLz4KICAgPC90YXJnZXQ+ICAKICAgICAKLSAgPCEtLSBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL3ZlcnNpb25pbmcvc3BlYy9WZXJzaW9uaW5nU3BlY2lmaWNhdGlvbi5odG1sI1BhY2thZ2VWZXJzaW9uaW5nIC0tPiAgCisgIDwhLS0gc2VlIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS90dXRvcmlhbC9kZXBsb3ltZW50L2phci9wYWNrYWdlbWFuLmh0bWwgLS0+ICAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0SGFzVmVyc2lvbkluZm8iPgogICAgIDxta2RpciBkaXI9IiR7dG1wLmRpcn0iLz4KICAgICA8amFyIGRlc3RmaWxlPSIke3RtcC5qYXJ9IiBiYXNlZGlyPSIke3RtcC5kaXJ9IiBzdHJpY3Q9ImZhaWwiPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhLnhtbAppbmRleCBhM2QzNzc4Li4xOWY2YWFlIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDI0LDQgKzQyNCw2NiBAQAogCiAgICAgPHRhcmdldCBuYW1lPSJmb28iIC8+CiAKKyAgICA8dGFyZ2V0IG5hbWU9InNpbXBsZVNvdXJjZUZpbGUiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGVzdHMgdGhhdCB0aGUgc2luZ2xlIHNvdXJjZSBmaWxlIHByb2dyYW1zLCBpbnRyb2R1Y2VkIGluIEphdmEgMTEsIHdvcmtzIGFzIGV4cGVjdGVkIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9L2phdmFzb3VyY2UiLz4KKyAgICAgICAgPGVjaG8gZmlsZT0iJHtvdXRwdXR9L2phdmFzb3VyY2UvQS5qYXZhIj4KKyAgICAgICAgICAgIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworICAgICAgICAgICAgaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisgICAgICAgICAgICBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKKyAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBBIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG91dEZpbGUgPSBhcmdzWzBdOworICAgICAgICAgICAgICAgICAgICB0cnkoQnVmZmVyZWRXcml0ZXIgYncgPSBGaWxlcy5uZXdCdWZmZXJlZFdyaXRlcihQYXRocy5nZXQob3V0RmlsZSkpOykgeworICAgICAgICAgICAgICAgICAgICAgICAgYncud3JpdGUoIkhlbGxvIHdvcmxkISIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICA8L2VjaG8+CisgICAgICAgIDxqYXZhIHNvdXJjZWZpbGU9IiR7b3V0cHV0fS9qYXZhc291cmNlL0EuamF2YSIgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiIGxvZ2Vycm9yPSJ0cnVlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9IiR7b3V0cHV0fS9qYXZhc291cmNlL3NpbXBsZVNvdXJjZUZpbGVPdXRwdXQudHh0Ii8+CisgICAgICAgIDwvamF2YT4KKyAgICAgICAgPGxvYWRmaWxlIHByb3BlcnR5PSJzaW1wbGVTb3VyY2VGaWxlLnByb2cub3V0cHV0IiBzcmNmaWxlPSIke291dHB1dH0vamF2YXNvdXJjZS9zaW1wbGVTb3VyY2VGaWxlT3V0cHV0LnR4dCIvPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzaW1wbGVTb3VyY2VGaWxlLmV4ZWN1dGlvbi5zdWNjZXNzIj4KKyAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHtzaW1wbGVTb3VyY2VGaWxlLnByb2cub3V0cHV0fSIgYXJnMj0iSGVsbG8gd29ybGQhIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8ZmFpbCB1bmxlc3M9InNpbXBsZVNvdXJjZUZpbGUuZXhlY3V0aW9uLnN1Y2Nlc3MiPkphdmEgc291cmNlLWZpbGUgZXhlY3V0aW9uIGRpZCBub3QgeWllbGQgdGhlIGV4cGVjdGVkCisgICAgICAgICAgICByZXN1bHQ8L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKworICAgIDx0YXJnZXQgbmFtZT0iZ2VuZXJhdGVEdW1teUphdmFTb3VyY2UiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0vamF2YXNvdXJjZSIvPgorICAgICAgICA8ZWNobyBmaWxlPSIke291dHB1dH0vamF2YXNvdXJjZS9UaHJvd3NFeGNlcHRpb24uamF2YSI+CisgICAgICAgICAgICBwdWJsaWMgY2xhc3MgVGhyb3dzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldhc24ndCBleHBlY3RlZCB0byBiZSBydW4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIDwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ic291cmNlRmlsZVJlcXVpcmVzRm9yayIgZGVwZW5kcz0iZ2VuZXJhdGVEdW1teUphdmFTb3VyY2UiPgorICAgICAgICA8amF2YSBzb3VyY2VmaWxlPSIke291dHB1dH0vamF2YXNvdXJjZS9UaHJvd3NFeGNlcHRpb24uamF2YSIgZmFpbG9uZXJyb3I9InRydWUiIGxvZ2Vycm9yPSJ0cnVlIi8+CisgICAgICAgIDxmYWlsPkV4ZWN1dGlvbiBvZiBqYXZhIHRhc2ssIGZvciBzb3VyY2VmaWxlLCB3YXMgZXhwZWN0ZWQgdG8gZmFpbCBzaW5jZSBmb3JrIHdhc24ndCBzZXQ8L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNvdXJjZUZpbGVDYW50VXNlQ2xhc3NuYW1lIiBkZXBlbmRzPSJnZW5lcmF0ZUR1bW15SmF2YVNvdXJjZSI+CisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iZm9vLmJhciIgc291cmNlZmlsZT0iJHtvdXRwdXR9L2phdmFzb3VyY2UvVGhyb3dzRXhjZXB0aW9uLmphdmEiCisgICAgICAgICAgICAgIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIiBsb2dlcnJvcj0idHJ1ZSIvPgorICAgICAgICA8ZmFpbD5FeGVjdXRpb24gb2YgamF2YSB0YXNrLCBmb3Igc291cmNlZmlsZSwgd2FzIGV4cGVjdGVkIHRvIGZhaWwgc2luY2UgY2xhc3NuYW1lIGF0dHJpYnV0ZSB3YXMgc2V0PC9mYWlsPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJzb3VyY2VGaWxlQ2FudFVzZUphciIgZGVwZW5kcz0iZ2VuZXJhdGVEdW1teUphdmFTb3VyY2UiPgorICAgICAgICA8amF2YSBqYXI9ImlycmVsZXZhbnQuamFyIiBzb3VyY2VmaWxlPSIke291dHB1dH0vamF2YXNvdXJjZS9UaHJvd3NFeGNlcHRpb24uamF2YSIKKyAgICAgICAgICAgICAgZm9yaz0idHJ1ZSIgZmFpbG9uZXJyb3I9InRydWUiIGxvZ2Vycm9yPSJ0cnVlIi8+CisgICAgICAgIDxmYWlsPkV4ZWN1dGlvbiBvZiBqYXZhIHRhc2ssIGZvciBzb3VyY2VmaWxlLCB3YXMgZXhwZWN0ZWQgdG8gZmFpbCBzaW5jZSBqYXIgYXR0cmlidXRlIHdhcyBzZXQ8L2ZhaWw+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNvdXJjZUZpbGVDYW50VXNlTW9kdWxlIiBkZXBlbmRzPSJnZW5lcmF0ZUR1bW15SmF2YVNvdXJjZSI+CisgICAgICAgIDxqYXZhIG1vZHVsZT0iaXJyZWxldmFudCIgc291cmNlZmlsZT0iJHtvdXRwdXR9L2phdmFzb3VyY2UvVGhyb3dzRXhjZXB0aW9uLmphdmEiCisgICAgICAgICAgICAgIGZvcms9InRydWUiIGZhaWxvbmVycm9yPSJ0cnVlIiBsb2dlcnJvcj0idHJ1ZSIvPgorICAgICAgICA8ZmFpbD5FeGVjdXRpb24gb2YgamF2YSB0YXNrLCBmb3Igc291cmNlZmlsZSwgd2FzIGV4cGVjdGVkIHRvIGZhaWwgc2luY2UgbW9kdWxlIGF0dHJpYnV0ZSB3YXMgc2V0PC9mYWlsPgorICAgIDwvdGFyZ2V0PgorCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmEvQ2xhc3NUb0phdmFkb2MuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YS9DbGFzc1RvSmF2YWRvYy5qYXZhCmluZGV4IGJkOGNhYjYuLjQyMzkzNGUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YS9DbGFzc1RvSmF2YWRvYy5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YS9DbGFzc1RvSmF2YWRvYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsMTUgKzI1LDE5IEBACiAgICAgLyoqCiAgICAgICogQHBhcmFtIGFuQXJndW1lbnQgQSBTdHJpbmcgdGhhdCBpcyBpZ25vcmVkCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgbWV0aG9kVG9KYXZhZG9jKFN0cmluZyBhbkFyZ3VtZW50KSB7IH0KKyAgICBwdWJsaWMgdm9pZCBtZXRob2RUb0phdmFkb2MoU3RyaW5nIGFuQXJndW1lbnQpIHt9CiAKICAgICAvKioKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOyB9CisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBBbiBhcmJpdHJhcnkgc3RyaW5nLgogICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgYW5vdGhlclN0cmluZygpIHtyZXR1cm4gIkFuIGFyYml0cmFyeSBzdHJpbmcuIjt9CisgICAgcHVibGljIFN0cmluZyBhbm90aGVyU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkFuIGFyYml0cmFyeSBzdHJpbmcuIjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmFkb2MueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvamF2YWRvYy9qYXZhZG9jLnhtbAppbmRleCAyYTA1ZWMwLi40ODkzY2I2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qYXZhZG9jL2phdmFkb2MueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YWRvYy54bWwKQEAgLTcsNyArNyw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qbW9kLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ptb2QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YWIzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qbW9kLnhtbApAQCAtMCwwICsxLDE0MTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9Imptb2R0ZXN0IiBkZWZhdWx0PSJuaWwiID4KKyAgPGltcG9ydCBmaWxlPSIuLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CisKKyAgPHRhcmdldCBuYW1lPSJuaWwiLz4KKworICA8dGFyZ2V0IG5hbWU9Ii1kaXJzIj4KKyAgICA8bWtkaXIgZGlyPSIke2lucHV0fSIvPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqbW9kIiB2YWx1ZT0iJHtvdXRwdXR9L3Rlc3Quam1vZCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uIiB2YWx1ZT0iMS4wLjEtKzk5Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiIGRlcGVuZHM9Ii1kaXJzIj4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBDcmVhdGVzIHNpbXBsZSBtb2R1bGFyIGphciwgd2l0aCBvbmx5IEphdmEgU0UgZGVwZW5kZW5jaWVzLiAtLT4KKyAgPHRhcmdldCBuYW1lPSItaGVsbG8iIGRlcGVuZHM9Ii1kaXJzIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5yb290IiB2YWx1ZT0iJHtpbnB1dH0vaGVsbG8iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5zcmMiIHZhbHVlPSIke2hlbGxvLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5jbGFzc2VzIiB2YWx1ZT0iJHtoZWxsby5yb290fS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlbGxvLmphci5kaXIiIHZhbHVlPSIke2hlbGxvLnJvb3R9L2phcnMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8uamFyIiB2YWx1ZT0iJHtoZWxsby5qYXIuZGlyfS9oZWxsby5qYXIiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5wa2ciICAgICB2YWx1ZT0gICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRlc3QuaGVsbG8iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8ucGtnLmRpciIgdmFsdWU9IiR7aGVsbG8uc3JjfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90ZXN0L2hlbGxvIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8ubWFpbi1jbGFzcyIgdmFsdWU9IiR7aGVsbG8ucGtnfS5IZWxsb1dvcmxkIi8+CisKKyAgICA8bWtkaXIgZGlyPSIke2hlbGxvLnBrZy5kaXJ9Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtoZWxsby5wa2cuZGlyfS9IZWxsb1dvcmxkLmphdmEiPgorcGFja2FnZSAke2hlbGxvLnBrZ307CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGQuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkhFTExPIFdPUkxEIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBuZXcgSGVsbG9Xb3JsZCgpLnJ1bigpOworICAgIH0KK30KKyAgICA8L2VjaG8+CisgICAgPGVjaG8gZmlsZT0iJHtoZWxsby5zcmN9L21vZHVsZS1pbmZvLmphdmEiPgorbW9kdWxlICR7aGVsbG8ucGtnfSB7CisgICAgZXhwb3J0cyAke2hlbGxvLnBrZ307CisgICAgcmVxdWlyZXMgamF2YS5sb2dnaW5nOworfQorICAgIDwvZWNobz4KKworICAgIDxta2RpciBkaXI9IiR7aGVsbG8uY2xhc3Nlc30iLz4KKyAgICA8amF2YWMgc3JjZGlyPSIke2hlbGxvLnNyY30iIGRlc3RkaXI9IiR7aGVsbG8uY2xhc3Nlc30iIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtoZWxsby5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7aGVsbG8uamFyfSIgYmFzZWRpcj0iJHtoZWxsby5jbGFzc2VzfSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIENyZWF0ZXMgbW9kdWxhciBqYXIgd2l0aCBkZXBlbmRlbmN5IG9uIGhlbGxvIG1vZHVsZS4gLS0+CisgIDx0YXJnZXQgbmFtZT0iLXNtaWxlIiBkZXBlbmRzPSItZGlycywtaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5yb290IiB2YWx1ZT0iJHtpbnB1dH0vc21pbGUiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5zcmMiIHZhbHVlPSIke3NtaWxlLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5jbGFzc2VzIiB2YWx1ZT0iJHtzbWlsZS5yb290fS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNtaWxlLmphci5kaXIiIHZhbHVlPSIke3NtaWxlLnJvb3R9L2phcnMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUuamFyIiB2YWx1ZT0iJHtzbWlsZS5qYXIuZGlyfS9zbWlsZS5qYXIiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5wa2ciICAgICB2YWx1ZT0gICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRlc3Quc21pbGUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUucGtnLmRpciIgdmFsdWU9IiR7c21pbGUuc3JjfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC90ZXN0L3NtaWxlIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUubWFpbi1jbGFzcyIgdmFsdWU9IiR7c21pbGUucGtnfS5TbWlsZSIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtzbWlsZS5wa2cuZGlyfSIvPgorICAgIDxlY2hvIGZpbGU9IiR7c21pbGUucGtnLmRpcn0vU21pbGUuamF2YSI+CitwYWNrYWdlICR7c21pbGUucGtnfTsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCAke2hlbGxvLnBrZ30uSGVsbG9Xb3JsZDsKKworcHVibGljIGNsYXNzIFNtaWxlIHsKKyAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNtaWxlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJcdTI2M2FcdTI2M2JcdTI2M2FcdTI2M2IiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIG5ldyBTbWlsZSgpLnJ1bigpOworICAgICAgICBuZXcgSGVsbG9Xb3JsZCgpLnJ1bigpOworICAgIH0KK30KKyAgICA8L2VjaG8+CisgICAgPGVjaG8gZmlsZT0iJHtzbWlsZS5zcmN9L21vZHVsZS1pbmZvLmphdmEiPgorbW9kdWxlICR7c21pbGUucGtnfSB7CisgICAgZXhwb3J0cyAke3NtaWxlLnBrZ307CisgICAgcmVxdWlyZXMgamF2YS5sb2dnaW5nOworICAgIHJlcXVpcmVzICR7aGVsbG8ucGtnfTsKK30KKyAgICA8L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke3NtaWxlLmNsYXNzZXN9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtzbWlsZS5zcmN9IiBkZXN0ZGlyPSIke3NtaWxlLmNsYXNzZXN9IgorICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiCisgICAgICAgICAgIG1vZHVsZXBhdGg9IiR7aGVsbG8uamFyfSIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtzbWlsZS5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7c21pbGUuamFyfSIgYmFzZWRpcj0iJHtzbWlsZS5jbGFzc2VzfSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIENyZWF0ZXMgYWRkaXRpb25hbCBtb2R1bGFyIGphciwgd2l0aCBvbmx5IEphdmEgU0UgZGVwZW5kZW5jaWVzLiAtLT4KKyAgPHRhcmdldCBuYW1lPSItZm9vYmFyIiBkZXBlbmRzPSItc21pbGUiPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImZvb2Jhci5yb290IiB2YWx1ZT0iJHtpbnB1dH0vZm9vYmFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vYmFyLnNyYyIgdmFsdWU9IiR7Zm9vYmFyLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJmb29iYXIuY2xhc3NlcyIgdmFsdWU9IiR7Zm9vYmFyLnJvb3R9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vYmFyLmphci5kaXIiIHZhbHVlPSIke2Zvb2Jhci5yb290fS9qYXJzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZvb2Jhci5qYXIiIHZhbHVlPSIke2Zvb2Jhci5qYXIuZGlyfS9mb29iYXIuamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vYmFyLnBrZyIgICAgIHZhbHVlPSAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5mb29iYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vYmFyLnBrZy5kaXIiIHZhbHVlPSIke2Zvb2Jhci5zcmN9L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rlc3QvZm9vYmFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iZm9vYmFyLm1haW4tY2xhc3MiIHZhbHVlPSIke2Zvb2Jhci5wa2d9LkZvb0JhciIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtmb29iYXIucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke2Zvb2Jhci5wa2cuZGlyfS9Gb29CYXIuamF2YSI+CitwYWNrYWdlICR7Zm9vYmFyLnBrZ307CisKK2ltcG9ydCAke2hlbGxvLm1haW4tY2xhc3N9OworaW1wb3J0ICR7c21pbGUubWFpbi1jbGFzc307CisKK3B1YmxpYyBjbGFzcyBGb29CYXIgeworICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgbmV3IEhlbGxvV29ybGQoKS5ydW4oKTsKKyAgICAgICAgbmV3IFNtaWxlKCkucnVuKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBuZXcgRm9vQmFyKCkucnVuKCk7CisgICAgfQorfQorICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2Zvb2Jhci5zcmN9L21vZHVsZS1pbmZvLmphdmEiPgorbW9kdWxlICR7Zm9vYmFyLnBrZ30geworICAgIGV4cG9ydHMgJHtmb29iYXIucGtnfTsKKyAgICByZXF1aXJlcyBqYXZhLmxvZ2dpbmc7CisgICAgcmVxdWlyZXMgJHtoZWxsby5wa2d9OworICAgIHJlcXVpcmVzICR7c21pbGUucGtnfTsKK30KKyAgICA8L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke2Zvb2Jhci5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7Zm9vYmFyLnNyY30iIGRlc3RkaXI9IiR7Zm9vYmFyLmNsYXNzZXN9IgorICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiIG1vZHVsZXBhdGg9IiR7aGVsbG8uamFyfTske3NtaWxlLmphcn0iLz4KKworICAgIDxta2RpciBkaXI9IiR7Zm9vYmFyLmphci5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtmb29iYXIuamFyfSIgYmFzZWRpcj0iJHtmb29iYXIuY2xhc3Nlc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZXN0QW5kQ2xhc3NwYXRoTm9KbW9kIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImRlc3RBbmRDbGFzc3BhdGhPbGRlclRoYW5KbW9kIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRlZm9ybWF0IiB2YWx1ZT0ieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLz4KKyAgICA8dHN0YW1wPgorICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iZnV0dXJlIiBwYXR0ZXJuPSIke2RhdGVmb3JtYXR9IiBvZmZzZXQ9IjEiIHVuaXQ9ImhvdXIiLz4KKyAgICA8L3RzdGFtcD4KKyAgICA8dG91Y2ggZmlsZT0iJHtqbW9kfSIgZGF0ZXRpbWU9IiR7ZnV0dXJlfSIgcGF0dGVybj0iJHtkYXRlZm9ybWF0fSIvPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9EZXN0RmlsZSI+CisgICAgPGptb2QgY2xhc3NwYXRoPSIuIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9DbGFzc3BhdGgiPgorICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZW1wdHlDbGFzc3BhdGgiPgorICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5vbmV4aXN0ZW50Q2xhc3NwYXRoIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSJkdW1teTpkdW1teTIiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGFzc3BhdGhyZWYiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aHJlZi50ZXN0cGF0aCI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aGVsbG8uamFyfSIvPgorICAgIDwvcGF0aD4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aHJlZi50ZXN0cGF0aCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNsYXNzcGF0aC1uZXN0ZWQiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2hlbGxvLmphcn0iLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjbGFzc3BhdGgtYm90aCIgZGVwZW5kcz0iLXNtaWxlIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iPgorICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3NtaWxlLmNsYXNzZXN9Ii8+CisgICAgICA8L2NsYXNzcGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbW9kdWxlcGF0aCB0YXJnZXRzIC0tPgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcGF0aCIgZGVwZW5kcz0iLXNtaWxlIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke3NtaWxlLmphcn0iCisgICAgICAgIG1vZHVsZXBhdGg9IiR7aGVsbG8uamFyLmRpcn0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2R1bGVwYXRocmVmIiBkZXBlbmRzPSItc21pbGUiPgorICAgIDxwYXRoIGlkPSJtb2R1bGVwYXRocmVmLnRlc3RwYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtoZWxsby5qYXIuZGlyfSIvPgorICAgIDwvcGF0aD4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7c21pbGUuamFyfSIKKyAgICAgICAgICBtb2R1bGVwYXRocmVmPSJtb2R1bGVwYXRocmVmLnRlc3RwYXRoIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcGF0aC1uZXN0ZWQiIGRlcGVuZHM9Ii1zbWlsZSI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtzbWlsZS5qYXJ9Ij4KKyAgICAgIDxtb2R1bGVwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7aGVsbG8uamFyLmRpcn0iLz4KKyAgICAgIDwvbW9kdWxlcGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcGF0aC1ib3RoIiBkZXBlbmRzPSItc21pbGUsLWZvb2JhciI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtmb29iYXIuamFyfSIKKyAgICAgICAgICBtb2R1bGVwYXRoPSIke2hlbGxvLmphci5kaXJ9Ij4KKyAgICAgIDxtb2R1bGVwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7c21pbGUuamFyLmRpcn0iLz4KKyAgICAgIDwvbW9kdWxlcGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcGF0aG5vbmRpciIgZGVwZW5kcz0iLXNtaWxlIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke3NtaWxlLmphcn0iCisgICAgICAgICAgbW9kdWxlcGF0aD0iJHtoZWxsby5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gY29tbWFuZHBhdGggdGFyZ2V0cyAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImNvbW1hbmRwYXRoIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tYW5kcyIgdmFsdWU9IiR7b3V0cHV0fS9jb21tYW5kcyIvPgorICAgIDxta2RpciBkaXI9IiR7Y29tbWFuZHN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbWFuZDEiIHZhbHVlPSIke2NvbW1hbmRzfS9jb21tYW5kMSIvPgorCisgICAgPGVjaG8gZmlsZT0iJHtjb21tYW5kMX0iPgorIyEvYmluL2Jhc2gKK2BkaXJuYW1lICIkMCJgL2phdmEgLW0gJHtoZWxsby5wa2d9LyR7aGVsbG8ucGtnfS5IZWxsb1dvcmxkCisgICAgPC9lY2hvPgorICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI3NzciIG5vblBvc2l4TW9kZT0idHJ5RG9zT3JQYXNzIj4KKyAgICAgIDxmaWxlIGZpbGU9IiR7Y29tbWFuZDF9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIKKyAgICAgICAgICBjb21tYW5kcGF0aD0iJHtjb21tYW5kc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21tYW5kcGF0aHJlZiIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbWFuZHMiIHZhbHVlPSIke291dHB1dH0vY29tbWFuZHMiLz4KKyAgICA8bWtkaXIgZGlyPSIke2NvbW1hbmRzfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1hbmQyIiB2YWx1ZT0iJHtjb21tYW5kc30vY29tbWFuZDIiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7Y29tbWFuZDJ9Ij4KKyMhL2Jpbi9iYXNoCitgZGlybmFtZSAiJDAiYC9qYXZhIC1tICR7aGVsbG8ucGtnfS8ke2hlbGxvLnBrZ30uSGVsbG9Xb3JsZAorICAgIDwvZWNobz4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNzc3IiBub25Qb3NpeE1vZGU9InRyeURvc09yUGFzcyI+CisgICAgICA8ZmlsZSBmaWxlPSIke2NvbW1hbmQyfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CisKKyAgICA8cGF0aCBpZD0iY29tbWFuZHBhdGhyZWYudGVzdHBhdGgiPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1hbmRzfSIvPgorICAgIDwvcGF0aD4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIKKyAgICAgICAgICBjb21tYW5kcGF0aHJlZj0iY29tbWFuZHBhdGhyZWYudGVzdHBhdGgiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21tYW5kcGF0aC1uZXN0ZWQiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1hbmRzIiB2YWx1ZT0iJHtvdXRwdXR9L2NvbW1hbmRzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjb21tYW5kc30iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tYW5kMyIgdmFsdWU9IiR7Y29tbWFuZHN9L2NvbW1hbmQzIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke2NvbW1hbmQzfSI+CisjIS9iaW4vYmFzaAorYGRpcm5hbWUgIiQwImAvamF2YSAtbSAke2hlbGxvLnBrZ30vJHtoZWxsby5wa2d9LkhlbGxvV29ybGQKKyAgICA8L2VjaG8+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc3NyIgbm9uUG9zaXhNb2RlPSJ0cnlEb3NPclBhc3MiPgorICAgICAgPGZpbGUgZmlsZT0iJHtjb21tYW5kM30iLz4KKyAgICA8L3NldHBlcm1pc3Npb25zPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDxjb21tYW5kcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1hbmRzfSIvPgorICAgICAgPC9jb21tYW5kcGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29tbWFuZHBhdGgtYm90aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbWFuZHMxIiB2YWx1ZT0iJHtvdXRwdXR9L2NvbW1hbmRzMSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tYW5kczIiIHZhbHVlPSIke291dHB1dH0vY29tbWFuZHMyIi8+CisgICAgPG1rZGlyIGRpcj0iJHtjb21tYW5kczF9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjb21tYW5kczJ9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iY29tbWFuZDQiIHZhbHVlPSIke2NvbW1hbmRzMX0vY29tbWFuZDQiLz4KKyAgICA8ZWNobyBmaWxlPSIke2NvbW1hbmQ0fSI+CisjIS9iaW4vYmFzaAorYGRpcm5hbWUgIiQwImAvamF2YSAtbSAke2hlbGxvLnBrZ30vJHtoZWxsby5wa2d9LkhlbGxvV29ybGQKKyAgICA8L2VjaG8+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc3NyIgbm9uUG9zaXhNb2RlPSJ0cnlEb3NPclBhc3MiPgorICAgICAgPGZpbGUgZmlsZT0iJHtjb21tYW5kNH0iLz4KKyAgICA8L3NldHBlcm1pc3Npb25zPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1hbmQ1IiB2YWx1ZT0iJHtjb21tYW5kczJ9L2NvbW1hbmQ1Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtjb21tYW5kNX0iPgorIyEvYmluL2Jhc2gKK2BkaXJuYW1lICIkMCJgL2phdmEgLW0gJHtoZWxsby5wa2d9LyR7aGVsbG8ucGtnfS5IZWxsb1dvcmxkCisgICAgPC9lY2hvPgorICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI3NzciIG5vblBvc2l4TW9kZT0idHJ5RG9zT3JQYXNzIj4KKyAgICAgIDxmaWxlIGZpbGU9IiR7Y29tbWFuZDV9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIKKyAgICAgICAgICBjb21tYW5kcGF0aD0iJHtjb21tYW5kczF9Ij4KKyAgICAgIDxjb21tYW5kcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbW1hbmRzMn0iLz4KKyAgICAgIDwvY29tbWFuZHBhdGg+CisgICAgPC9qbW9kPgorICA8L3RhcmdldD4KKworICA8IS0tIGhlYWRlcnBhdGggdGFyZ2V0cyAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImhlYWRlcnBhdGgiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnMiIHZhbHVlPSIke291dHB1dH0vaGVhZGVycyIvPgorICAgIDxta2RpciBkaXI9IiR7aGVhZGVyc30iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIxIiB2YWx1ZT0iJHtoZWFkZXJzfS9oZWFkZXIxLmgiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7aGVhZGVyMX0iPgordHlwZWRlZiBpbnQgaW5kZXhfdDsKKyAgICA8L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgaGVhZGVycGF0aD0iJHtoZWFkZXJzfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImhlYWRlcnBhdGhyZWYiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnMiIHZhbHVlPSIke291dHB1dH0vaGVhZGVycyIvPgorICAgIDxta2RpciBkaXI9IiR7aGVhZGVyc30iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIyIiB2YWx1ZT0iJHtoZWFkZXJzfS9oZWFkZXIyLmgiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7aGVhZGVyMn0iPgordHlwZWRlZiBjaGFyICogc3RyaW5nX3Q7CisgICAgPC9lY2hvPgorCisgICAgPHBhdGggaWQ9ImhlYWRlcnBhdGhyZWYudGVzdHBhdGgiPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2hlYWRlcnN9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IgorICAgICAgICAgIGhlYWRlcnBhdGhyZWY9ImhlYWRlcnBhdGhyZWYudGVzdHBhdGgiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJoZWFkZXJwYXRoLW5lc3RlZCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVycyIgdmFsdWU9IiR7b3V0cHV0fS9oZWFkZXJzIi8+CisgICAgPG1rZGlyIGRpcj0iJHtoZWFkZXJzfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcjMiIHZhbHVlPSIke2hlYWRlcnN9L2hlYWRlcjMuaCIvPgorCisgICAgPGVjaG8gZmlsZT0iJHtoZWFkZXIzfSI+Cit0eXBlZGVmIGNoYXIgKiBzdHJpbmdfdDsKKyAgICA8L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iPgorICAgICAgPGhlYWRlcnBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtoZWFkZXJzfSIvPgorICAgICAgPC9oZWFkZXJwYXRoPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJoZWFkZXJwYXRoLWJvdGgiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnM0IiB2YWx1ZT0iJHtvdXRwdXR9L2hlYWRlcnM0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcnM1IiB2YWx1ZT0iJHtvdXRwdXR9L2hlYWRlcnM1Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtoZWFkZXJzNH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2hlYWRlcnM1fSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlcjQiIHZhbHVlPSIke2hlYWRlcnM0fS9oZWFkZXI0LmgiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyNSIgdmFsdWU9IiR7aGVhZGVyczV9L2hlYWRlcjUuaCIvPgorCisgICAgPGVjaG8gZmlsZT0iJHtoZWFkZXI0fSI+Cit0eXBlZGVmIGludCBpbmRleF90OworICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2hlYWRlcjV9Ij4KK3R5cGVkZWYgY2hhciAqIHN0cmluZ190OworICAgIDwvZWNobz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIgaGVhZGVycGF0aD0iJHtoZWFkZXJzNH0iPgorICAgICAgPGhlYWRlcnBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtoZWFkZXJzNX0iLz4KKyAgICAgIDwvaGVhZGVycGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gY29uZmlncGF0aCB0YXJnZXRzIC0tPgorCisgIDx0YXJnZXQgbmFtZT0iY29uZmlncGF0aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29uZmlnIiB2YWx1ZT0iJHtvdXRwdXR9L2NvbmZpZyIvPgorICAgIDxta2RpciBkaXI9IiR7Y29uZmlnfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbmZpZzEiIHZhbHVlPSIke2NvbmZpZ30vY29uZmlnMS5wcm9wZXJ0aWVzIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke2NvbmZpZzF9Ij4KK3RpbWVvdXQ9MzYwMAorICAgIDwvZWNobz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIgY29uZmlncGF0aD0iJHtjb25maWd9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29uZmlncGF0aHJlZiIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29uZmlnIiB2YWx1ZT0iJHtvdXRwdXR9L2NvbmZpZyIvPgorICAgIDxta2RpciBkaXI9IiR7Y29uZmlnfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbmZpZzIiIHZhbHVlPSIke2NvbmZpZ30vY29uZmlnMi5wcm9wZXJ0aWVzIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke2NvbmZpZzJ9Ij4KK3RpbWVvdXQ9NzIwMAorICAgIDwvZWNobz4KKworICAgIDxwYXRoIGlkPSJjb25maWdwYXRocmVmLnRlc3RwYXRoIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb25maWd9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IgorICAgICAgICAgIGNvbmZpZ3BhdGhyZWY9ImNvbmZpZ3BhdGhyZWYudGVzdHBhdGgiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb25maWdwYXRoLW5lc3RlZCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29uZmlnIiB2YWx1ZT0iJHtvdXRwdXR9L2NvbmZpZyIvPgorICAgIDxta2RpciBkaXI9IiR7Y29uZmlnfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbmZpZzMiIHZhbHVlPSIke2NvbmZpZ30vY29uZmlnMy5wcm9wZXJ0aWVzIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke2NvbmZpZzN9Ij4KK3RpbWVvdXQ9NzIwMAorICAgIDwvZWNobz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSI+CisgICAgICA8Y29uZmlncGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2NvbmZpZ30iLz4KKyAgICAgIDwvY29uZmlncGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iY29uZmlncGF0aC1ib3RoIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25maWc0IiB2YWx1ZT0iJHtvdXRwdXR9L2NvbmZpZzQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY29uZmlnNSIgdmFsdWU9IiR7b3V0cHV0fS9jb25maWc1Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtjb25maWc0fSIvPgorICAgIDxta2RpciBkaXI9IiR7Y29uZmlnNX0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJjb25maWdmaWxlNCIgdmFsdWU9IiR7Y29uZmlnNH0vY29uZmlnNC5wcm9wZXJ0aWVzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNvbmZpZ2ZpbGU1IiB2YWx1ZT0iJHtjb25maWc1fS9jb25maWc1LnByb3BlcnRpZXMiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7Y29uZmlnZmlsZTR9Ij4KK3RpbWVvdXQ9MzYwMAorICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2NvbmZpZ2ZpbGU1fSI+Cit0aW1lb3V0PTcyMDAKKyAgICA8L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iIGNvbmZpZ3BhdGg9IiR7Y29uZmlnNH0iPgorICAgICAgPGNvbmZpZ3BhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtjb25maWc1fSIvPgorICAgICAgPC9jb25maWdwYXRoPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBsZWdhbHBhdGggdGFyZ2V0cyAtLT4KKworICA8dGFyZ2V0IG5hbWU9ImxlZ2FscGF0aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGVnYWwiIHZhbHVlPSIke291dHB1dH0vbGVnYWwiLz4KKyAgICA8bWtkaXIgZGlyPSIke2xlZ2FsfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImxlZ2FsMSIgdmFsdWU9IiR7bGVnYWx9L2xlZ2FsMS50eHQiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7bGVnYWwxfSI+CitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iIGxlZ2FscGF0aD0iJHtsZWdhbH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsZWdhbHBhdGhyZWYiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImxlZ2FsIiB2YWx1ZT0iJHtvdXRwdXR9L2xlZ2FsIi8+CisgICAgPG1rZGlyIGRpcj0iJHtsZWdhbH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWdhbDIiIHZhbHVlPSIke2xlZ2FsfS9sZWdhbDIudHh0Ii8+CisKKyAgICA8ZWNobyBmaWxlPSIke2xlZ2FsMn0iPgorTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCitjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKK3RoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KK1RoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAordGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgPC9lY2hvPgorCisgICAgPHBhdGggaWQ9ImxlZ2FscGF0aHJlZi50ZXN0cGF0aCI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7bGVnYWx9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IgorICAgICAgICAgIGxlZ2FscGF0aHJlZj0ibGVnYWxwYXRocmVmLnRlc3RwYXRoIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibGVnYWxwYXRoLW5lc3RlZCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGVnYWwiIHZhbHVlPSIke291dHB1dH0vbGVnYWwiLz4KKyAgICA8bWtkaXIgZGlyPSIke2xlZ2FsfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImxlZ2FsMyIgdmFsdWU9IiR7bGVnYWx9L2xlZ2FsMy50eHQiLz4KKworICAgIDxlY2hvIGZpbGU9IiR7bGVnYWwzfSI+CitMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKK2NvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAordGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCit0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICA8L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iPgorICAgICAgPGxlZ2FscGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xlZ2FsfSIvPgorICAgICAgPC9sZWdhbHBhdGg+CisgICAgPC9qbW9kPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxlZ2FscGF0aC1ib3RoIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWdhbDQiIHZhbHVlPSIke291dHB1dH0vbGVnYWw0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxlZ2FsNSIgdmFsdWU9IiR7b3V0cHV0fS9sZWdhbDUiLz4KKyAgICA8bWtkaXIgZGlyPSIke2xlZ2FsNH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke2xlZ2FsNX0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWdhbGZpbGU0IiB2YWx1ZT0iJHtsZWdhbDR9L2xlZ2FsNC50eHQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGVnYWxmaWxlNSIgdmFsdWU9IiR7bGVnYWw1fS9sZWdhbDUudHh0Ii8+CisKKyAgICA8ZWNobyBmaWxlPSIke2xlZ2FsZmlsZTR9Ij4KK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgIDwvZWNobz4KKyAgICA8Y29weSBmaWxlPSIke2xlZ2FsZmlsZTR9IiB0b2ZpbGU9IiR7bGVnYWxmaWxlNX0iLz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIgbGVnYWxwYXRoPSIke2xlZ2FsNH0iPgorICAgICAgPGxlZ2FscGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2xlZ2FsNX0iLz4KKyAgICAgIDwvbGVnYWxwYXRoPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSBtYW5wYXRoIHRhcmdldHMgLS0+CisKKyAgPHRhcmdldCBuYW1lPSJtYW5wYXRoIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5wYWdlcyIgdmFsdWU9IiR7b3V0cHV0fS9tYW5wYWdlcyIvPgorICAgIDxta2RpciBkaXI9IiR7bWFucGFnZXN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuMSIgdmFsdWU9IiR7bWFucGFnZXN9L21hbjEuMSIvPgorCisgICAgPGVjaG8gZmlsZT0iJHttYW4xfSI+PCEtLQorLS0+PCFbQ0RBVEFbLlRIICJDSEZOIiAiMSIgIjA1LzE3LzIwMTciICJzaGFkb3dcLXV0aWxzIDRcJi40IiAiVXNlciBDb21tYW5kcyIKKy5pZSBcbiguZyAuZHMgQXEgXChhcQorLmVsICAgICAgIC5kcyBBcSAnCisuXCIgZGlzYWJsZSBoeXBoZW5hdGlvbgorLm5oCisuXCIgZGlzYWJsZSBqdXN0aWZpY2F0aW9uIChhZGp1c3QgdGV4dCB0byBsZWZ0IG1hcmdpbiBvbmx5KQorLmFkIGwKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlwiICogTUFJTiBDT05URU5UIFNUQVJUUyBIRVJFICoKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIICJOQU1FIgorY2hmbiBcLSBjaGFuZ2UgcmVhbCB1c2VyIG5hbWUgYW5kIGluZm9ybWF0aW9uCisuU0ggIlNZTk9QU0lTIgorLkhQIFx3J1xmQmNoZm5cZlJcICd1CitcZkJjaGZuXGZSIFtcZklvcHRpb25zXGZSXSBbXGZJTE9HSU5cZlJdCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUKK1xmQmNoZm5cZlIKK2NvbW1hbmQgY2hhbmdlcyB1c2VyIGZ1bGxuYW1lLCBvZmZpY2Ugcm9vbSBudW1iZXIsIG9mZmljZSBwaG9uZSBudW1iZXIsIGFuZCBob21lIHBob25lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYSB1c2VyXCooQXFzIGFjY291bnRcJi4gVGhpcyBpbmZvcm1hdGlvbiBpcyB0eXBpY2FsbHkgcHJpbnRlZCBieQorXGZCZmluZ2VyXGZSKDEpCithbmQgc2ltaWxhciBwcm9ncmFtc1wmLiBBIG5vcm1hbCB1c2VyIG1heSBvbmx5IGNoYW5nZSB0aGUgZmllbGRzIGZvciBoZXIgb3duIGFjY291bnQsIHN1YmplY3QgdG8gdGhlIHJlc3RyaWN0aW9ucyBpbgorL2V0Yy9sb2dpblwmLmRlZnNcJi4gKFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIGNoYW5naW5nIHRoZWlyIGZ1bGxuYW1lXCYuKSBUaGUgc3VwZXJ1c2VyIG1heSBjaGFuZ2UgYW55IGZpZWxkIGZvciBhbnkgYWNjb3VudFwmLiBBZGRpdGlvbmFsbHksIG9ubHkgdGhlIHN1cGVydXNlciBtYXkgdXNlIHRoZQorXGZCXC1vXGZSCitvcHRpb24gdG8gY2hhbmdlIHRoZSB1bmRlZmluZWQgcG9ydGlvbnMgb2YgdGhlIEdFQ09TIGZpZWxkXCYuCisuUFAKK1RoZXNlIGZpZWxkcyBtdXN0IG5vdCBjb250YWluIGFueSBjb2xvbnNcJi4gRXhjZXB0IGZvciB0aGUKK1xmSW90aGVyXGZSCitmaWVsZCwgdGhleSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGNvbW1hIG9yIGVxdWFsIHNpZ25cJi4gSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0byBhdm9pZCBub25cLVVTXC1BU0NJSSBjaGFyYWN0ZXJzLCBidXQgdGhpcyBpcyBvbmx5IGVuZm9yY2VkIGZvciB0aGUgcGhvbmUgbnVtYmVyc1wmLiBUaGUKK1xmSW90aGVyXGZSCitmaWVsZCBpcyB1c2VkIHRvIHN0b3JlIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnNcJi4KKy5TSCAiT1BUSU9OUyIKKy5QUAorVGhlIG9wdGlvbnMgd2hpY2ggYXBwbHkgdG8gdGhlCitcZkJjaGZuXGZSCitjb21tYW5kIGFyZToKKy5QUAorXGZCXC1mXGZSLCBcZkJcLVwtZnVsbFwtbmFtZVxmUlwgXCZcZklGVUxMX05BTUVcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgZnVsbCBuYW1lXCYuCisuUkUKKy5QUAorXGZCXC1oXGZSLCBcZkJcLVwtaG9tZVwtcGhvbmVcZlJcIFwmXGZJSE9NRV9QSE9ORVxmUgorLlJTIDQKK0NoYW5nZSB0aGUgdXNlclwqKEFxcyBob21lIHBob25lIG51bWJlclwmLgorLlJFCisuUFAKK1xmQlwtb1xmUiwgXGZCXC1cLW90aGVyXGZSXCBcJlxmSU9USEVSXGZSCisuUlMgNAorQ2hhbmdlIHRoZSB1c2VyXCooQXFzIG90aGVyIEdFQ09TIGluZm9ybWF0aW9uXCYuIFRoaXMgZmllbGQgaXMgdXNlZCB0byBzdG9yZSBhY2NvdW50aW5nIGluZm9ybWF0aW9uIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zLCBhbmQgY2FuIGJlIGNoYW5nZWQgb25seSBieSBhIHN1cGVydXNlclwmLgorLlJFCisuUFAKK1xmQlwtclxmUiwgXGZCXC1cLXJvb21cZlJcIFwmXGZJUk9PTV9OVU1CRVJcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgcm9vbSBudW1iZXJcJi4KKy5SRQorLlBQCitcZkJcLVJcZlIsIFxmQlwtXC1yb290XGZSXCBcJlxmSUNIUk9PVF9ESVJcZlIKKy5SUyA0CitBcHBseSBjaGFuZ2VzIGluIHRoZQorXGZJQ0hST09UX0RJUlxmUgorZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeVwmLgorLlJFCisuUFAKK1xmQlwtdVxmUiwgXGZCXC1cLWhlbHBcZlIKKy5SUyA0CitEaXNwbGF5IGhlbHAgbWVzc2FnZSBhbmQgZXhpdFwmLgorLlJFCisuUFAKK1xmQlwtd1xmUiwgXGZCXC1cLXdvcmtcLXBob25lXGZSXCBcJlxmSVdPUktfUEhPTkVcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgb2ZmaWNlIHBob25lIG51bWJlclwmLgorLlJFCisuUFAKK0lmIG5vbmUgb2YgdGhlIG9wdGlvbnMgYXJlIHNlbGVjdGVkLAorXGZCY2hmblxmUgorb3BlcmF0ZXMgaW4gYW4gaW50ZXJhY3RpdmUgZmFzaGlvbiwgcHJvbXB0aW5nIHRoZSB1c2VyIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzIGZvciBhbGwgb2YgdGhlIGZpZWxkc1wmLiBFbnRlciB0aGUgbmV3IHZhbHVlIHRvIGNoYW5nZSB0aGUgZmllbGQsIG9yIGxlYXZlIHRoZSBsaW5lIGJsYW5rIHRvIHVzZSB0aGUgY3VycmVudCB2YWx1ZVwmLiBUaGUgY3VycmVudCB2YWx1ZSBpcyBkaXNwbGF5ZWQgYmV0d2VlbiBhIHBhaXIgb2YKK1xmQlsgXVxmUgorbWFya3NcJi4gV2l0aG91dCBvcHRpb25zLAorXGZCY2hmblxmUgorcHJvbXB0cyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhY2NvdW50XCYuCisuU0ggIkNPTkZJR1VSQVRJT04iCisuUFAKK1RoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4KKy9ldGMvbG9naW5cJi5kZWZzCitjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoaXMgdG9vbDoKKy5QUAorXGZCQ0hGTl9SRVNUUklDVFxmUiAoc3RyaW5nKQorLlJTIDQKK1RoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCB2YWx1ZXMgaW4gdGhlCitcZklnZWNvc1xmUgorZmllbGQgb2YgdGhlCisvZXRjL3Bhc3N3ZAorZmlsZSBtYXkgYmUgY2hhbmdlZCBieSByZWd1bGFyIHVzZXJzIHVzaW5nIHRoZQorXGZCY2hmblxmUgorcHJvZ3JhbVwmLiBJdCBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMKK1xmSWZcZlIsCitcZklyXGZSLAorXGZJd1xmUiwKK1xmSWhcZlIsIGZvciBGdWxsIG5hbWUsIFJvb20gbnVtYmVyLCBXb3JrIHBob25lLCBhbmQgSG9tZSBwaG9uZSwgcmVzcGVjdGl2ZWx5XCYuIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorXGZJeWVzXGZSCitpcyBlcXVpdmFsZW50IHRvCitcZklyd2hcZlIKK2FuZAorXGZJbm9cZlIKK2lzIGVxdWl2YWxlbnQgdG8KK1xmSWZyd2hcZlJcJi4gSWYgbm90IHNwZWNpZmllZCwgb25seSB0aGUgc3VwZXJ1c2VyIGNhbiBtYWtlIGFueSBjaGFuZ2VzXCYuIFRoZSBtb3N0IHJlc3RyaWN0aXZlIHNldHRpbmcgaXMgYmV0dGVyIGFjaGlldmVkIGJ5IG5vdCBpbnN0YWxsaW5nCitcZkJjaGZuXGZSCitTVUlEXCYuCisuUkUKKy5TSCAiRklMRVMiCisuUFAKKy9ldGMvbG9naW5cJi5kZWZzCisuUlMgNAorU2hhZG93IHBhc3N3b3JkIHN1aXRlIGNvbmZpZ3VyYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3Bhc3N3ZAorLlJTIDQKK1VzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJjaHNoXGZSKDEpLAorXGZCbG9naW4uZGVmc1xmUig1KSwKK1xmQnBhc3N3ZFxmUig1KVwmLgorXV0+PCEtLQorICAgIC0tPjwvZWNobz4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIgbWFucGF0aD0iJHttYW5wYWdlc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtYW5wYXRocmVmIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5wYWdlcyIgdmFsdWU9IiR7b3V0cHV0fS9tYW5wYWdlcyIvPgorICAgIDxta2RpciBkaXI9IiR7bWFucGFnZXN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuMiIgdmFsdWU9IiR7bWFucGFnZXN9L21hbjIuMSIvPgorCisgICAgPGVjaG8gZmlsZT0iJHttYW4yfSI+PCEtLQorLS0+PCFbQ0RBVEFbLlRIICJWSVBXIiAiOCIgIjA1LzE3LzIwMTciICJzaGFkb3dcLXV0aWxzIDRcJi40IiAiU3lzdGVtIE1hbmFnZW1lbnQgQ29tbWFuZHMiCisuaWUgXG4oLmcgLmRzIEFxIFwoYXEKKy5lbCAgICAgICAuZHMgQXEgJworLlwiIGRpc2FibGUgaHlwaGVuYXRpb24KKy5uaAorLlwiIGRpc2FibGUganVzdGlmaWNhdGlvbiAoYWRqdXN0IHRleHQgdG8gbGVmdCBtYXJnaW4gb25seSkKKy5hZCBsCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5cIiAqIE1BSU4gQ09OVEVOVCBTVEFSVFMgSEVSRSAqCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCAiTkFNRSIKK3ZpcHcsIHZpZ3IgXC0gZWRpdCB0aGUgcGFzc3dvcmQsIGdyb3VwLCBzaGFkb3dcLXBhc3N3b3JkIG9yIHNoYWRvd1wtZ3JvdXAgZmlsZQorLlNIICJTWU5PUFNJUyIKKy5IUCBcdydcZkJ2aXB3XGZSXCAndQorXGZCdmlwd1xmUiBbXGZJb3B0aW9uc1xmUl0KKy5IUCBcdydcZkJ2aWdyXGZSXCAndQorXGZCdmlnclxmUiBbXGZJb3B0aW9uc1xmUl0KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZQorXGZCdmlwd1xmUgorYW5kCitcZkJ2aWdyXGZSCitjb21tYW5kcyBlZGl0cyB0aGUgZmlsZXMKKy9ldGMvcGFzc3dkCithbmQKKy9ldGMvZ3JvdXAsIHJlc3BlY3RpdmVseVwmLiBXaXRoIHRoZQorXGZCXC1zXGZSCitmbGFnLCB0aGV5IHdpbGwgZWRpdCB0aGUgc2hhZG93IHZlcnNpb25zIG9mIHRob3NlIGZpbGVzLAorL2V0Yy9zaGFkb3cKK2FuZAorL2V0Yy9nc2hhZG93LCByZXNwZWN0aXZlbHlcJi4gVGhlIHByb2dyYW1zIHdpbGwgc2V0IHRoZSBhcHByb3ByaWF0ZSBsb2NrcyB0byBwcmV2ZW50IGZpbGUgY29ycnVwdGlvblwmLiBXaGVuIGxvb2tpbmcgZm9yIGFuIGVkaXRvciwgdGhlIHByb2dyYW1zIHdpbGwgZmlyc3QgdHJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCJFZJU1VBTFxmUiwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK1xmQiRFRElUT1JcZlIsIGFuZCBmaW5hbGx5IHRoZSBkZWZhdWx0IGVkaXRvciwKK1xmQnZpXGZSKDEpXCYuCisuU0ggIk9QVElPTlMiCisuUFAKK1RoZSBvcHRpb25zIHdoaWNoIGFwcGx5IHRvIHRoZQorXGZCdmlwd1xmUgorYW5kCitcZkJ2aWdyXGZSCitjb21tYW5kcyBhcmU6CisuUFAKK1xmQlwtZ1xmUiwgXGZCXC1cLWdyb3VwXGZSCisuUlMgNAorRWRpdCBncm91cCBkYXRhYmFzZVwmLgorLlJFCisuUFAKK1xmQlwtaFxmUiwgXGZCXC1cLWhlbHBcZlIKKy5SUyA0CitEaXNwbGF5IGhlbHAgbWVzc2FnZSBhbmQgZXhpdFwmLgorLlJFCisuUFAKK1xmQlwtcFxmUiwgXGZCXC1cLXBhc3N3ZFxmUgorLlJTIDQKK0VkaXQgcGFzc3dkIGRhdGFiYXNlXCYuCisuUkUKKy5QUAorXGZCXC1xXGZSLCBcZkJcLVwtcXVpZXRcZlIKKy5SUyA0CitRdWlldCBtb2RlXCYuCisuUkUKKy5QUAorXGZCXC1SXGZSLCBcZkJcLVwtcm9vdFxmUlwgXCZcZklDSFJPT1RfRElSXGZSCisuUlMgNAorQXBwbHkgY2hhbmdlcyBpbiB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeSBhbmQgdXNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gdGhlCitcZklDSFJPT1RfRElSXGZSCitkaXJlY3RvcnlcJi4KKy5SRQorLlBQCitcZkJcLXNcZlIsIFxmQlwtXC1zaGFkb3dcZlIKKy5SUyA0CitFZGl0IHNoYWRvdyBvciBnc2hhZG93IGRhdGFiYXNlXCYuCisuUkUKKy5TSCAiRU5WSVJPTk1FTlQiCisuUFAKK1xmQlZJU1VBTFxmUgorLlJTIDQKK0VkaXRvciB0byBiZSB1c2VkXCYuCisuUkUKKy5QUAorXGZCRURJVE9SXGZSCisuUlMgNAorRWRpdG9yIHRvIGJlIHVzZWQgaWYKK1xmQlZJU1VBTFxmUgoraXMgbm90IHNldFwmLgorLlJFCisuU0ggIkZJTEVTIgorLlBQCisvZXRjL2dyb3VwCisuUlMgNAorR3JvdXAgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuUFAKKy9ldGMvZ3NoYWRvdworLlJTIDQKK1NlY3VyZSBncm91cCBhY2NvdW50IGluZm9ybWF0aW9uXCYuCisuUkUKKy5QUAorL2V0Yy9wYXNzd2QKKy5SUyA0CitVc2VyIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3NoYWRvdworLlJTIDQKK1NlY3VyZSB1c2VyIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZCdmlcZlIoMSksCitcZkJncm91cFxmUig1KSwKK1xmQmdzaGFkb3dcZlIoNSkKKywKK1xmQnBhc3N3ZFxmUig1KSwgLAorXGZCc2hhZG93XGZSKDUpXCYuCitdXT48IS0tCisgICAgLS0+PC9lY2hvPgorCisgICAgPHBhdGggaWQ9Im1hbnBhdGhyZWYudGVzdHBhdGgiPgorICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21hbnBhZ2VzfSIvPgorICAgIDwvcGF0aD4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIKKyAgICAgICAgICBtYW5wYXRocmVmPSJtYW5wYXRocmVmLnRlc3RwYXRoIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWFucGF0aC1uZXN0ZWQiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPHByb3BlcnR5IG5hbWU9Im1hbnBhZ2VzIiB2YWx1ZT0iJHtvdXRwdXR9L21hbnBhZ2VzIi8+CisgICAgPG1rZGlyIGRpcj0iJHttYW5wYWdlc30iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW4zIiB2YWx1ZT0iJHttYW5wYWdlc30vbWFuMy4xIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke21hbjN9Ij48IS0tCistLT48IVtDREFUQVsuVEggIlZJUFciICI4IiAiMDUvMTcvMjAxNyIgInNoYWRvd1wtdXRpbHMgNFwmLjQiICJTeXN0ZW0gTWFuYWdlbWVudCBDb21tYW5kcyIKKy5pZSBcbiguZyAuZHMgQXEgXChhcQorLmVsICAgICAgIC5kcyBBcSAnCisuXCIgZGlzYWJsZSBoeXBoZW5hdGlvbgorLm5oCisuXCIgZGlzYWJsZSBqdXN0aWZpY2F0aW9uIChhZGp1c3QgdGV4dCB0byBsZWZ0IG1hcmdpbiBvbmx5KQorLmFkIGwKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlwiICogTUFJTiBDT05URU5UIFNUQVJUUyBIRVJFICoKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIICJOQU1FIgordmlwdywgdmlnciBcLSBlZGl0IHRoZSBwYXNzd29yZCwgZ3JvdXAsIHNoYWRvd1wtcGFzc3dvcmQgb3Igc2hhZG93XC1ncm91cCBmaWxlCisuU0ggIlNZTk9QU0lTIgorLkhQIFx3J1xmQnZpcHdcZlJcICd1CitcZkJ2aXB3XGZSIFtcZklvcHRpb25zXGZSXQorLkhQIFx3J1xmQnZpZ3JcZlJcICd1CitcZkJ2aWdyXGZSIFtcZklvcHRpb25zXGZSXQorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlCitcZkJ2aXB3XGZSCithbmQKK1xmQnZpZ3JcZlIKK2NvbW1hbmRzIGVkaXRzIHRoZSBmaWxlcworL2V0Yy9wYXNzd2QKK2FuZAorL2V0Yy9ncm91cCwgcmVzcGVjdGl2ZWx5XCYuIFdpdGggdGhlCitcZkJcLXNcZlIKK2ZsYWcsIHRoZXkgd2lsbCBlZGl0IHRoZSBzaGFkb3cgdmVyc2lvbnMgb2YgdGhvc2UgZmlsZXMsCisvZXRjL3NoYWRvdworYW5kCisvZXRjL2dzaGFkb3csIHJlc3BlY3RpdmVseVwmLiBUaGUgcHJvZ3JhbXMgd2lsbCBzZXQgdGhlIGFwcHJvcHJpYXRlIGxvY2tzIHRvIHByZXZlbnQgZmlsZSBjb3JydXB0aW9uXCYuIFdoZW4gbG9va2luZyBmb3IgYW4gZWRpdG9yLCB0aGUgcHJvZ3JhbXMgd2lsbCBmaXJzdCB0cnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitcZkIkVklTVUFMXGZSLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCJEVESVRPUlxmUiwgYW5kIGZpbmFsbHkgdGhlIGRlZmF1bHQgZWRpdG9yLAorXGZCdmlcZlIoMSlcJi4KKy5TSCAiT1BUSU9OUyIKKy5QUAorVGhlIG9wdGlvbnMgd2hpY2ggYXBwbHkgdG8gdGhlCitcZkJ2aXB3XGZSCithbmQKK1xmQnZpZ3JcZlIKK2NvbW1hbmRzIGFyZToKKy5QUAorXGZCXC1nXGZSLCBcZkJcLVwtZ3JvdXBcZlIKKy5SUyA0CitFZGl0IGdyb3VwIGRhdGFiYXNlXCYuCisuUkUKKy5QUAorXGZCXC1oXGZSLCBcZkJcLVwtaGVscFxmUgorLlJTIDQKK0Rpc3BsYXkgaGVscCBtZXNzYWdlIGFuZCBleGl0XCYuCisuUkUKKy5QUAorXGZCXC1wXGZSLCBcZkJcLVwtcGFzc3dkXGZSCisuUlMgNAorRWRpdCBwYXNzd2QgZGF0YWJhc2VcJi4KKy5SRQorLlBQCitcZkJcLXFcZlIsIFxmQlwtXC1xdWlldFxmUgorLlJTIDQKK1F1aWV0IG1vZGVcJi4KKy5SRQorLlBQCitcZkJcLVJcZlIsIFxmQlwtXC1yb290XGZSXCBcJlxmSUNIUk9PVF9ESVJcZlIKKy5SUyA0CitBcHBseSBjaGFuZ2VzIGluIHRoZQorXGZJQ0hST09UX0RJUlxmUgorZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeVwmLgorLlJFCisuUFAKK1xmQlwtc1xmUiwgXGZCXC1cLXNoYWRvd1xmUgorLlJTIDQKK0VkaXQgc2hhZG93IG9yIGdzaGFkb3cgZGF0YWJhc2VcJi4KKy5SRQorLlNIICJFTlZJUk9OTUVOVCIKKy5QUAorXGZCVklTVUFMXGZSCisuUlMgNAorRWRpdG9yIHRvIGJlIHVzZWRcJi4KKy5SRQorLlBQCitcZkJFRElUT1JcZlIKKy5SUyA0CitFZGl0b3IgdG8gYmUgdXNlZCBpZgorXGZCVklTVUFMXGZSCitpcyBub3Qgc2V0XCYuCisuUkUKKy5TSCAiRklMRVMiCisuUFAKKy9ldGMvZ3JvdXAKKy5SUyA0CitHcm91cCBhY2NvdW50IGluZm9ybWF0aW9uXCYuCisuUkUKKy5QUAorL2V0Yy9nc2hhZG93CisuUlMgNAorU2VjdXJlIGdyb3VwIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3Bhc3N3ZAorLlJTIDQKK1VzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuUFAKKy9ldGMvc2hhZG93CisuUlMgNAorU2VjdXJlIHVzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJ2aVxmUigxKSwKK1xmQmdyb3VwXGZSKDUpLAorXGZCZ3NoYWRvd1xmUig1KQorLAorXGZCcGFzc3dkXGZSKDUpLCAsCitcZkJzaGFkb3dcZlIoNSlcJi4KK11dPjwhLS0KKyAgICAtLT48L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iPgorICAgICAgPG1hbnBhdGg+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHttYW5wYWdlc30iLz4KKyAgICAgIDwvbWFucGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWFucGF0aC1ib3RoIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW5wYWdlczQiIHZhbHVlPSIke291dHB1dH0vbWFucGFnZXM0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Im1hbnBhZ2VzNSIgdmFsdWU9IiR7b3V0cHV0fS9tYW5wYWdlczUiLz4KKyAgICA8bWtkaXIgZGlyPSIke21hbnBhZ2VzNH0iLz4KKyAgICA8bWtkaXIgZGlyPSIke21hbnBhZ2VzNX0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW40IiB2YWx1ZT0iJHttYW5wYWdlczR9L21hbjQuMSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW41IiB2YWx1ZT0iJHttYW5wYWdlczV9L21hbjUuMSIvPgorCisgICAgPGVjaG8gZmlsZT0iJHttYW40fSI+PCEtLQorLS0+PCFbQ0RBVEFbLlRIICJDSEZOIiAiMSIgIjA1LzE3LzIwMTciICJzaGFkb3dcLXV0aWxzIDRcJi40IiAiVXNlciBDb21tYW5kcyIKKy5pZSBcbiguZyAuZHMgQXEgXChhcQorLmVsICAgICAgIC5kcyBBcSAnCisuXCIgZGlzYWJsZSBoeXBoZW5hdGlvbgorLm5oCisuXCIgZGlzYWJsZSBqdXN0aWZpY2F0aW9uIChhZGp1c3QgdGV4dCB0byBsZWZ0IG1hcmdpbiBvbmx5KQorLmFkIGwKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlwiICogTUFJTiBDT05URU5UIFNUQVJUUyBIRVJFICoKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIICJOQU1FIgorY2hmbiBcLSBjaGFuZ2UgcmVhbCB1c2VyIG5hbWUgYW5kIGluZm9ybWF0aW9uCisuU0ggIlNZTk9QU0lTIgorLkhQIFx3J1xmQmNoZm5cZlJcICd1CitcZkJjaGZuXGZSIFtcZklvcHRpb25zXGZSXSBbXGZJTE9HSU5cZlJdCisuU0ggIkRFU0NSSVBUSU9OIgorLlBQCitUaGUKK1xmQmNoZm5cZlIKK2NvbW1hbmQgY2hhbmdlcyB1c2VyIGZ1bGxuYW1lLCBvZmZpY2Ugcm9vbSBudW1iZXIsIG9mZmljZSBwaG9uZSBudW1iZXIsIGFuZCBob21lIHBob25lIG51bWJlciBpbmZvcm1hdGlvbiBmb3IgYSB1c2VyXCooQXFzIGFjY291bnRcJi4gVGhpcyBpbmZvcm1hdGlvbiBpcyB0eXBpY2FsbHkgcHJpbnRlZCBieQorXGZCZmluZ2VyXGZSKDEpCithbmQgc2ltaWxhciBwcm9ncmFtc1wmLiBBIG5vcm1hbCB1c2VyIG1heSBvbmx5IGNoYW5nZSB0aGUgZmllbGRzIGZvciBoZXIgb3duIGFjY291bnQsIHN1YmplY3QgdG8gdGhlIHJlc3RyaWN0aW9ucyBpbgorL2V0Yy9sb2dpblwmLmRlZnNcJi4gKFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdG8gcHJldmVudCB1c2VycyBmcm9tIGNoYW5naW5nIHRoZWlyIGZ1bGxuYW1lXCYuKSBUaGUgc3VwZXJ1c2VyIG1heSBjaGFuZ2UgYW55IGZpZWxkIGZvciBhbnkgYWNjb3VudFwmLiBBZGRpdGlvbmFsbHksIG9ubHkgdGhlIHN1cGVydXNlciBtYXkgdXNlIHRoZQorXGZCXC1vXGZSCitvcHRpb24gdG8gY2hhbmdlIHRoZSB1bmRlZmluZWQgcG9ydGlvbnMgb2YgdGhlIEdFQ09TIGZpZWxkXCYuCisuUFAKK1RoZXNlIGZpZWxkcyBtdXN0IG5vdCBjb250YWluIGFueSBjb2xvbnNcJi4gRXhjZXB0IGZvciB0aGUKK1xmSW90aGVyXGZSCitmaWVsZCwgdGhleSBzaG91bGQgbm90IGNvbnRhaW4gYW55IGNvbW1hIG9yIGVxdWFsIHNpZ25cJi4gSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0byBhdm9pZCBub25cLVVTXC1BU0NJSSBjaGFyYWN0ZXJzLCBidXQgdGhpcyBpcyBvbmx5IGVuZm9yY2VkIGZvciB0aGUgcGhvbmUgbnVtYmVyc1wmLiBUaGUKK1xmSW90aGVyXGZSCitmaWVsZCBpcyB1c2VkIHRvIHN0b3JlIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnNcJi4KKy5TSCAiT1BUSU9OUyIKKy5QUAorVGhlIG9wdGlvbnMgd2hpY2ggYXBwbHkgdG8gdGhlCitcZkJjaGZuXGZSCitjb21tYW5kIGFyZToKKy5QUAorXGZCXC1mXGZSLCBcZkJcLVwtZnVsbFwtbmFtZVxmUlwgXCZcZklGVUxMX05BTUVcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgZnVsbCBuYW1lXCYuCisuUkUKKy5QUAorXGZCXC1oXGZSLCBcZkJcLVwtaG9tZVwtcGhvbmVcZlJcIFwmXGZJSE9NRV9QSE9ORVxmUgorLlJTIDQKK0NoYW5nZSB0aGUgdXNlclwqKEFxcyBob21lIHBob25lIG51bWJlclwmLgorLlJFCisuUFAKK1xmQlwtb1xmUiwgXGZCXC1cLW90aGVyXGZSXCBcJlxmSU9USEVSXGZSCisuUlMgNAorQ2hhbmdlIHRoZSB1c2VyXCooQXFzIG90aGVyIEdFQ09TIGluZm9ybWF0aW9uXCYuIFRoaXMgZmllbGQgaXMgdXNlZCB0byBzdG9yZSBhY2NvdW50aW5nIGluZm9ybWF0aW9uIHVzZWQgYnkgb3RoZXIgYXBwbGljYXRpb25zLCBhbmQgY2FuIGJlIGNoYW5nZWQgb25seSBieSBhIHN1cGVydXNlclwmLgorLlJFCisuUFAKK1xmQlwtclxmUiwgXGZCXC1cLXJvb21cZlJcIFwmXGZJUk9PTV9OVU1CRVJcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgcm9vbSBudW1iZXJcJi4KKy5SRQorLlBQCitcZkJcLVJcZlIsIFxmQlwtXC1yb290XGZSXCBcJlxmSUNIUk9PVF9ESVJcZlIKKy5SUyA0CitBcHBseSBjaGFuZ2VzIGluIHRoZQorXGZJQ0hST09UX0RJUlxmUgorZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeVwmLgorLlJFCisuUFAKK1xmQlwtdVxmUiwgXGZCXC1cLWhlbHBcZlIKKy5SUyA0CitEaXNwbGF5IGhlbHAgbWVzc2FnZSBhbmQgZXhpdFwmLgorLlJFCisuUFAKK1xmQlwtd1xmUiwgXGZCXC1cLXdvcmtcLXBob25lXGZSXCBcJlxmSVdPUktfUEhPTkVcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgb2ZmaWNlIHBob25lIG51bWJlclwmLgorLlJFCisuUFAKK0lmIG5vbmUgb2YgdGhlIG9wdGlvbnMgYXJlIHNlbGVjdGVkLAorXGZCY2hmblxmUgorb3BlcmF0ZXMgaW4gYW4gaW50ZXJhY3RpdmUgZmFzaGlvbiwgcHJvbXB0aW5nIHRoZSB1c2VyIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzIGZvciBhbGwgb2YgdGhlIGZpZWxkc1wmLiBFbnRlciB0aGUgbmV3IHZhbHVlIHRvIGNoYW5nZSB0aGUgZmllbGQsIG9yIGxlYXZlIHRoZSBsaW5lIGJsYW5rIHRvIHVzZSB0aGUgY3VycmVudCB2YWx1ZVwmLiBUaGUgY3VycmVudCB2YWx1ZSBpcyBkaXNwbGF5ZWQgYmV0d2VlbiBhIHBhaXIgb2YKK1xmQlsgXVxmUgorbWFya3NcJi4gV2l0aG91dCBvcHRpb25zLAorXGZCY2hmblxmUgorcHJvbXB0cyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhY2NvdW50XCYuCisuU0ggIkNPTkZJR1VSQVRJT04iCisuUFAKK1RoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4KKy9ldGMvbG9naW5cJi5kZWZzCitjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHRoaXMgdG9vbDoKKy5QUAorXGZCQ0hGTl9SRVNUUklDVFxmUiAoc3RyaW5nKQorLlJTIDQKK1RoaXMgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGljaCB2YWx1ZXMgaW4gdGhlCitcZklnZWNvc1xmUgorZmllbGQgb2YgdGhlCisvZXRjL3Bhc3N3ZAorZmlsZSBtYXkgYmUgY2hhbmdlZCBieSByZWd1bGFyIHVzZXJzIHVzaW5nIHRoZQorXGZCY2hmblxmUgorcHJvZ3JhbVwmLiBJdCBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIGxldHRlcnMKK1xmSWZcZlIsCitcZklyXGZSLAorXGZJd1xmUiwKK1xmSWhcZlIsIGZvciBGdWxsIG5hbWUsIFJvb20gbnVtYmVyLCBXb3JrIHBob25lLCBhbmQgSG9tZSBwaG9uZSwgcmVzcGVjdGl2ZWx5XCYuIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorXGZJeWVzXGZSCitpcyBlcXVpdmFsZW50IHRvCitcZklyd2hcZlIKK2FuZAorXGZJbm9cZlIKK2lzIGVxdWl2YWxlbnQgdG8KK1xmSWZyd2hcZlJcJi4gSWYgbm90IHNwZWNpZmllZCwgb25seSB0aGUgc3VwZXJ1c2VyIGNhbiBtYWtlIGFueSBjaGFuZ2VzXCYuIFRoZSBtb3N0IHJlc3RyaWN0aXZlIHNldHRpbmcgaXMgYmV0dGVyIGFjaGlldmVkIGJ5IG5vdCBpbnN0YWxsaW5nCitcZkJjaGZuXGZSCitTVUlEXCYuCisuUkUKKy5TSCAiRklMRVMiCisuUFAKKy9ldGMvbG9naW5cJi5kZWZzCisuUlMgNAorU2hhZG93IHBhc3N3b3JkIHN1aXRlIGNvbmZpZ3VyYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3Bhc3N3ZAorLlJTIDQKK1VzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJjaHNoXGZSKDEpLAorXGZCbG9naW4uZGVmc1xmUig1KSwKK1xmQnBhc3N3ZFxmUig1KVwmLgorXV0+PCEtLQorICAgIC0tPjwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke21hbjV9Ij48IS0tCistLT48IVtDREFUQVsuVEggIlZJUFciICI4IiAiMDUvMTcvMjAxNyIgInNoYWRvd1wtdXRpbHMgNFwmLjQiICJTeXN0ZW0gTWFuYWdlbWVudCBDb21tYW5kcyIKKy5pZSBcbiguZyAuZHMgQXEgXChhcQorLmVsICAgICAgIC5kcyBBcSAnCisuXCIgZGlzYWJsZSBoeXBoZW5hdGlvbgorLm5oCisuXCIgZGlzYWJsZSBqdXN0aWZpY2F0aW9uIChhZGp1c3QgdGV4dCB0byBsZWZ0IG1hcmdpbiBvbmx5KQorLmFkIGwKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlwiICogTUFJTiBDT05URU5UIFNUQVJUUyBIRVJFICoKKy5cIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLlNIICJOQU1FIgordmlwdywgdmlnciBcLSBlZGl0IHRoZSBwYXNzd29yZCwgZ3JvdXAsIHNoYWRvd1wtcGFzc3dvcmQgb3Igc2hhZG93XC1ncm91cCBmaWxlCisuU0ggIlNZTk9QU0lTIgorLkhQIFx3J1xmQnZpcHdcZlJcICd1CitcZkJ2aXB3XGZSIFtcZklvcHRpb25zXGZSXQorLkhQIFx3J1xmQnZpZ3JcZlJcICd1CitcZkJ2aWdyXGZSIFtcZklvcHRpb25zXGZSXQorLlNIICJERVNDUklQVElPTiIKKy5QUAorVGhlCitcZkJ2aXB3XGZSCithbmQKK1xmQnZpZ3JcZlIKK2NvbW1hbmRzIGVkaXRzIHRoZSBmaWxlcworL2V0Yy9wYXNzd2QKK2FuZAorL2V0Yy9ncm91cCwgcmVzcGVjdGl2ZWx5XCYuIFdpdGggdGhlCitcZkJcLXNcZlIKK2ZsYWcsIHRoZXkgd2lsbCBlZGl0IHRoZSBzaGFkb3cgdmVyc2lvbnMgb2YgdGhvc2UgZmlsZXMsCisvZXRjL3NoYWRvdworYW5kCisvZXRjL2dzaGFkb3csIHJlc3BlY3RpdmVseVwmLiBUaGUgcHJvZ3JhbXMgd2lsbCBzZXQgdGhlIGFwcHJvcHJpYXRlIGxvY2tzIHRvIHByZXZlbnQgZmlsZSBjb3JydXB0aW9uXCYuIFdoZW4gbG9va2luZyBmb3IgYW4gZWRpdG9yLCB0aGUgcHJvZ3JhbXMgd2lsbCBmaXJzdCB0cnkgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCitcZkIkVklTVUFMXGZSLCB0aGVuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCJEVESVRPUlxmUiwgYW5kIGZpbmFsbHkgdGhlIGRlZmF1bHQgZWRpdG9yLAorXGZCdmlcZlIoMSlcJi4KKy5TSCAiT1BUSU9OUyIKKy5QUAorVGhlIG9wdGlvbnMgd2hpY2ggYXBwbHkgdG8gdGhlCitcZkJ2aXB3XGZSCithbmQKK1xmQnZpZ3JcZlIKK2NvbW1hbmRzIGFyZToKKy5QUAorXGZCXC1nXGZSLCBcZkJcLVwtZ3JvdXBcZlIKKy5SUyA0CitFZGl0IGdyb3VwIGRhdGFiYXNlXCYuCisuUkUKKy5QUAorXGZCXC1oXGZSLCBcZkJcLVwtaGVscFxmUgorLlJTIDQKK0Rpc3BsYXkgaGVscCBtZXNzYWdlIGFuZCBleGl0XCYuCisuUkUKKy5QUAorXGZCXC1wXGZSLCBcZkJcLVwtcGFzc3dkXGZSCisuUlMgNAorRWRpdCBwYXNzd2QgZGF0YWJhc2VcJi4KKy5SRQorLlBQCitcZkJcLXFcZlIsIFxmQlwtXC1xdWlldFxmUgorLlJTIDQKK1F1aWV0IG1vZGVcJi4KKy5SRQorLlBQCitcZkJcLVJcZlIsIFxmQlwtXC1yb290XGZSXCBcJlxmSUNIUk9PVF9ESVJcZlIKKy5SUyA0CitBcHBseSBjaGFuZ2VzIGluIHRoZQorXGZJQ0hST09UX0RJUlxmUgorZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeVwmLgorLlJFCisuUFAKK1xmQlwtc1xmUiwgXGZCXC1cLXNoYWRvd1xmUgorLlJTIDQKK0VkaXQgc2hhZG93IG9yIGdzaGFkb3cgZGF0YWJhc2VcJi4KKy5SRQorLlNIICJFTlZJUk9OTUVOVCIKKy5QUAorXGZCVklTVUFMXGZSCisuUlMgNAorRWRpdG9yIHRvIGJlIHVzZWRcJi4KKy5SRQorLlBQCitcZkJFRElUT1JcZlIKKy5SUyA0CitFZGl0b3IgdG8gYmUgdXNlZCBpZgorXGZCVklTVUFMXGZSCitpcyBub3Qgc2V0XCYuCisuUkUKKy5TSCAiRklMRVMiCisuUFAKKy9ldGMvZ3JvdXAKKy5SUyA0CitHcm91cCBhY2NvdW50IGluZm9ybWF0aW9uXCYuCisuUkUKKy5QUAorL2V0Yy9nc2hhZG93CisuUlMgNAorU2VjdXJlIGdyb3VwIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3Bhc3N3ZAorLlJTIDQKK1VzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuUFAKKy9ldGMvc2hhZG93CisuUlMgNAorU2VjdXJlIHVzZXIgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuU0ggIlNFRSBBTFNPIgorLlBQCitcZkJ2aVxmUigxKSwKK1xmQmdyb3VwXGZSKDUpLAorXGZCZ3NoYWRvd1xmUig1KQorLAorXGZCcGFzc3dkXGZSKDUpLCAsCitcZkJzaGFkb3dcZlIoNSlcJi4KK11dPjwhLS0KKyAgICAtLT48L2VjaG8+CisKKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iIG1hbnBhdGg9IiR7bWFucGFnZXM0fSI+CisgICAgICA8bWFucGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21hbnBhZ2VzNX0iLz4KKyAgICAgIDwvbWFucGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbmF0aXZlbGlicGF0aCB0YXJnZXRzIC0tPgorCisgIDx0YXJnZXQgbmFtZT0ibmF0aXZlbGlicGF0aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ibmF0aXZlbGliIiBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2xpYjske2phdmEuaG9tZX0vYmluIi8+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IgorICAgICAgICAgIG5hdGl2ZWxpYnBhdGg9IiR7bmF0aXZlbGlifSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5hdGl2ZWxpYnBhdGhyZWYiIGRlcGVuZHM9Ii1oZWxsbyI+CisKKyAgICA8cGF0aCBpZD0ibmF0aXZlbGlicGF0aHJlZi50ZXN0cGF0aCI+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIiLz4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqYXZhLmhvbWV9L2JpbiIvPgorICAgIDwvcGF0aD4KKworICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSIKKyAgICAgICAgICBuYXRpdmVsaWJwYXRocmVmPSJuYXRpdmVsaWJwYXRocmVmLnRlc3RwYXRoIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibmF0aXZlbGlicGF0aC1uZXN0ZWQiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDxuYXRpdmVsaWJwYXRoPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7amF2YS5ob21lfS9saWIiLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2phdmEuaG9tZX0vYmluIi8+CisgICAgICA8L25hdGl2ZWxpYnBhdGg+CisgICAgPC9qbW9kPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5hdGl2ZWxpYnBhdGgtYm90aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgbmF0aXZlbGlicGF0aD0iJHtqYXZhLmhvbWV9L2xpYjske2phdmEuaG9tZX0vYmluIj4KKyAgICAgIDxuYXRpdmVsaWJwYXRoPgorICAgICAgICA8ZGlyc2V0IGRpcj0iJHtqYXZhLmhvbWV9Ij4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJsaWIvc2VydmVyIi8+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iYmluL3NlcnZlciIvPgorICAgICAgICA8L2RpcnNldD4KKyAgICAgIDwvbmF0aXZlbGlicGF0aD4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gbm9uLXBhdGggdGFyZ2V0cyAtLT4KKworICA8dGFyZ2V0IG5hbWU9InZlcnNpb24iIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IiB2ZXJzaW9uPSIke3ZlcnNpb259Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmVyc2lvbi1uZXN0ZWQiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDx2ZXJzaW9uIG51bWJlcj0iMS4wLjEiIGJ1aWxkPSI5OSIvPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2ZXJzaW9uLW5lc3RlZC1udW1iZXIiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDx2ZXJzaW9uIG51bWJlcj0iMS4wLjEiLz4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmVyc2lvbi1uZXN0ZWQtbm8tbnVtYmVyIiBkZXBlbmRzPSItaGVsbG8iPgorICAgIDxqbW9kIGRlc3RmaWxlPSIke2ptb2R9IiBjbGFzc3BhdGg9IiR7aGVsbG8uamFyfSI+CisgICAgICA8dmVyc2lvbiBidWlsZD0iOTkiLz4KKyAgICA8L2ptb2Q+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idmVyc2lvbi1uZXN0ZWQtaW52YWxpZC1udW1iZXIiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDx2ZXJzaW9uIG51bWJlcj0iMS0wLTEiIGJ1aWxkPSI5OSIvPgorICAgIDwvam1vZD4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2ZXJzaW9uLW5lc3RlZC1pbnZhbGlkLXByZXJlbGVhc2UiIGRlcGVuZHM9Ii1oZWxsbyI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9Ij4KKyAgICAgIDx2ZXJzaW9uIG51bWJlcj0iMS4wLjEiIGJ1aWxkPSI5OSIgcHJlcmVsZWFzZT0idW5pdCt0ZXN0aW5nIi8+CisgICAgPC9qbW9kPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InZlcnNpb24tYm90aCIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iIHZlcnNpb249IiR7dmVyc2lvbn0iPgorICAgICAgPHZlcnNpb24gbnVtYmVyPSIxLjAuMSIgYnVpbGQ9Ijk5Ii8+CisgICAgPC9qbW9kPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1haW5jbGFzcyIgZGVwZW5kcz0iLWhlbGxvIj4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgbWFpbmNsYXNzPSIke2hlbGxvLm1haW4tY2xhc3N9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icGxhdGZvcm0iIGRlcGVuZHM9Ii1zbWlsZSI+CisgICAgPHByb3BlcnR5IG5hbWU9InRhcmdldC1wbGF0Zm9ybSIgdmFsdWU9IndpbmRvd3MtYW1kNjQiLz4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHtqbW9kfSIgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgcGxhdGZvcm09IiR7dGFyZ2V0LXBsYXRmb3JtfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Imhhc2hpbmciIGRlcGVuZHM9Ii1zbWlsZSI+CisgICAgPGptb2QgZGVzdGZpbGU9IiR7am1vZH0iIGNsYXNzcGF0aD0iJHtoZWxsby5qYXJ9IgorICAgICAgICAgIG1vZHVsZXBhdGg9IiR7c21pbGUuamFyLmRpcn0iCisgICAgICAgICAgaGFzaE1vZHVsZXNQYXR0ZXJuPSIuKnNtaWxlLioiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9saW5rLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2xpbmsueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDc5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9saW5rLnhtbApAQCAtMCwwICsxLDEyNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9Imxpbmt0ZXN0IiBkZWZhdWx0PSJuaWwiIHhtbG5zOnVubGVzcz0iYW50OnVubGVzcyI+CisgIDxpbXBvcnQgZmlsZT0iLi4vYnVpbGRmaWxldGVzdC1iYXNlLnhtbCIvPgorCisgIDx0YXJnZXQgbmFtZT0ibmlsIi8+CisKKyAgPHRhcmdldCBuYW1lPSItZGlycyI+CisgICAgPG1rZGlyIGRpcj0iJHtpbnB1dH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJqbW9kcyIgdmFsdWU9IiR7b3V0cHV0fS9qbW9kcyIvPgorICAgIDxta2RpciBkaXI9IiR7am1vZHN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFucGFnZXMiIHZhbHVlPSIke291dHB1dH0vbWFucGFnZXMiLz4KKyAgICA8bWtkaXIgZGlyPSIke21hbnBhZ2VzfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImltYWdlIiB2YWx1ZT0iJHtvdXRwdXR9L2ltYWdlIi8+CisKKyAgICA8IS0tCisgICAgICBCZWZvcmUgSmF2YSAxMCwgSkRLJ3Mgam1vZHMgZGlyZWN0b3J5IG11c3QgYmUgZXhwbGljaXRseSBpbmNsdWRlZAorICAgICAgaW4gbW9kdWxlIHBhdGhzLgorICAgICAtLT4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqZGttb2RzIiB2YWx1ZT0iIgorICAgICAgICAgICAgICAgZWxzZT0iJHtqYXZhLmhvbWV9L2ptb2RzJHtwYXRoLnNlcGFyYXRvcn0iPgorICAgICAgPGhhc21ldGhvZCBjbGFzc25hbWU9ImphdmEudXRpbC5MaXN0IiBtZXRob2Q9ImNvcHlPZiIvPgorICAgIDwvY29uZGl0aW9uPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InNldFVwIiBkZXBlbmRzPSItZGlycyI+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gQ3JlYXRlcyBzaW1wbGUgbW9kdWxhciBqYXIsIHdpdGggb25seSBKYXZhIFNFIGRlcGVuZGVuY2llcy4gLS0+CisgIDx0YXJnZXQgbmFtZT0iLWhlbGxvIiBkZXBlbmRzPSItZGlycyI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8ucm9vdCIgdmFsdWU9IiR7aW5wdXR9L2hlbGxvIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8uc3JjIiB2YWx1ZT0iJHtoZWxsby5yb290fS9zcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8uY2xhc3NlcyIgdmFsdWU9IiR7aGVsbG8ucm9vdH0vY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5qYXIuZGlyIiB2YWx1ZT0iJHtoZWxsby5yb290fS9qYXJzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlbGxvLmphciIgdmFsdWU9IiR7aGVsbG8uamFyLmRpcn0vaGVsbG8uamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlbGxvLmxlZ2FsIiB2YWx1ZT0iJHtoZWxsby5yb290fS9sZWdhbCIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImhlbGxvLm1vZCIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5oZWxsbyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5wa2ciICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRlc3QuaGVsbG8iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaGVsbG8ucGtnLnBhdGgiIHZhbHVlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90ZXN0L2hlbGxvIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImhlbGxvLnBrZy5kaXIiIHZhbHVlPSIke2hlbGxvLnNyY30vJHtoZWxsby5wa2cucGF0aH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5tYWluLWNsYXNzIiB2YWx1ZT0iJHtoZWxsby5wa2d9LkhlbGxvV29ybGQiLz4KKworICAgIDxta2RpciBkaXI9IiR7aGVsbG8ucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke2hlbGxvLnBrZy5kaXJ9L0hlbGxvV29ybGQuamF2YSI+CitwYWNrYWdlICR7aGVsbG8ucGtnfTsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworcHVibGljIGNsYXNzIEhlbGxvV29ybGQgeworICAgIHB1YmxpYyB2b2lkIHJ1bihTdHJpbmdbXSByZXNvdXJjZXMpIHsKKyAgICAgICAgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZC5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBsb2dnZXIuaW5mbygiSEVMTE8gV09STEQiKTsKKworICAgICAgICBmb3IgKFN0cmluZyByZXNvdXJjZSA6IHJlc291cmNlcykgeworICAgICAgICAgICAgT2JqZWN0IHVybCA9IEhlbGxvV29ybGQuY2xhc3MuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8ocmVzb3VyY2UgKyAiICIgKyAodXJsICE9IG51bGwgPyAicHJlc2VudCIgOiAiYWJzZW50IikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBuZXcgSGVsbG9Xb3JsZCgpLnJ1bihhcmdzKTsKKyAgICB9Cit9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7aGVsbG8uc3JjfS9tb2R1bGUtaW5mby5qYXZhIj4KK21vZHVsZSAke2hlbGxvLm1vZH0geworICAgIGV4cG9ydHMgJHtoZWxsby5wa2d9OworICAgIHJlcXVpcmVzIGphdmEubG9nZ2luZzsKK30KKyAgICA8L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke2hlbGxvLmNsYXNzZXN9Ii8+CisgICAgPGphdmFjIHNyY2Rpcj0iJHtoZWxsby5zcmN9IiBkZXN0ZGlyPSIke2hlbGxvLmNsYXNzZXN9IgorICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiIGRlYnVnPSJ0cnVlIi8+CisgICAgPGVjaG8gZmlsZT0iJHtoZWxsby5jbGFzc2VzfS8ke2hlbGxvLnBrZy5wYXRofS9yZXNvdXJjZTEudHh0IgorICAgICAgICAgIG1lc3NhZ2U9IkZpcnN0IEhlbGxvV29ybGQgcmVzb3VyY2UuIi8+CisgICAgPGVjaG8gZmlsZT0iJHtoZWxsby5jbGFzc2VzfS8ke2hlbGxvLnBrZy5wYXRofS9yZXNvdXJjZTIudHh0IgorICAgICAgICAgIG1lc3NhZ2U9IlNlY29uZCBIZWxsb1dvcmxkIHJlc291cmNlLiIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtoZWxsby5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7aGVsbG8uamFyfSIgYmFzZWRpcj0iJHtoZWxsby5jbGFzc2VzfSIvPgorICA8L3RhcmdldD4KKworICA8IS0tIENyZWF0ZXMgbW9kdWxhciBqYXIgd2l0aCBkZXBlbmRlbmN5IG9uIGhlbGxvIG1vZHVsZS4gLS0+CisgIDx0YXJnZXQgbmFtZT0iLXNtaWxlIiBkZXBlbmRzPSItZGlycywtaGVsbG8iPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5yb290IiB2YWx1ZT0iJHtpbnB1dH0vc21pbGUiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5zcmMiIHZhbHVlPSIke3NtaWxlLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5jbGFzc2VzIiB2YWx1ZT0iJHtzbWlsZS5yb290fS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNtaWxlLmphci5kaXIiIHZhbHVlPSIke3NtaWxlLnJvb3R9L2phcnMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUuamFyIiB2YWx1ZT0iJHtzbWlsZS5qYXIuZGlyfS9zbWlsZS5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUubGVnYWwiIHZhbHVlPSIke3NtaWxlLnJvb3R9L2xlZ2FsIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUubW9kIiAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50ZXN0LnNtaWxlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InNtaWxlLnBrZyIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5zbWlsZSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5wa2cucGF0aCIgdmFsdWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rlc3Qvc21pbGUiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic21pbGUucGtnLmRpciIgdmFsdWU9IiR7c21pbGUuc3JjfS8ke3NtaWxlLnBrZy5wYXRofSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNtaWxlLm1haW4tY2xhc3MiIHZhbHVlPSIke3NtaWxlLnBrZ30uU21pbGUiLz4KKworICAgIDxta2RpciBkaXI9IiR7c21pbGUucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke3NtaWxlLnBrZy5kaXJ9L1NtaWxlLmphdmEiPgorcGFja2FnZSAke3NtaWxlLnBrZ307CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgJHtoZWxsby5wa2d9LkhlbGxvV29ybGQ7CisKK3B1YmxpYyBjbGFzcyBTbWlsZSB7CisgICAgcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIHJlc291cmNlcykgeworICAgICAgICBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihTbWlsZS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBsb2dnZXIuaW5mbygiXHUyNjNhXHUyNjNiXHUyNjNhXHUyNjNiIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIE9iamVjdCB1cmwgPSBIZWxsb1dvcmxkLmNsYXNzLmdldFJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHJlc291cmNlICsgIiAiICsgKHVybCAhPSBudWxsID8gInByZXNlbnQiIDogImFic2VudCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgbmV3IFNtaWxlKCkucnVuKGFyZ3MpOworICAgICAgICBuZXcgSGVsbG9Xb3JsZCgpLnJ1bihhcmdzKTsKKyAgICB9Cit9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7c21pbGUuc3JjfS9tb2R1bGUtaW5mby5qYXZhIj4KK21vZHVsZSAke3NtaWxlLm1vZH0geworICAgIGV4cG9ydHMgJHtzbWlsZS5wa2d9OworICAgIHJlcXVpcmVzIGphdmEubG9nZ2luZzsKKyAgICByZXF1aXJlcyAke2hlbGxvLm1vZH07Cit9CisgICAgPC9lY2hvPgorCisgICAgPG1rZGlyIGRpcj0iJHtzbWlsZS5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7c21pbGUuc3JjfSIgZGVzdGRpcj0iJHtzbWlsZS5jbGFzc2VzfSIKKyAgICAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIiBkZWJ1Zz0idHJ1ZSIKKyAgICAgICAgICAgbW9kdWxlcGF0aD0iJHtoZWxsby5qYXJ9Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtzbWlsZS5jbGFzc2VzfS8ke3NtaWxlLnBrZy5wYXRofS9yZXNvdXJjZTEudHh0IgorICAgICAgICAgIG1lc3NhZ2U9IkZpcnN0IFNtaWxlIHJlc291cmNlLiIvPgorICAgIDxlY2hvIGZpbGU9IiR7c21pbGUuY2xhc3Nlc30vJHtzbWlsZS5wa2cucGF0aH0vcmVzb3VyY2UyLnR4dCIKKyAgICAgICAgICBtZXNzYWdlPSJTZWNvbmQgU21pbGUgcmVzb3VyY2UuIi8+CisKKyAgICA8bWtkaXIgZGlyPSIke3NtaWxlLmphci5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtzbWlsZS5qYXJ9IiBiYXNlZGlyPSIke3NtaWxlLmNsYXNzZXN9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iLW1hbnBhZ2VzIiBkZXBlbmRzPSItZGlycyI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFuMSIgdmFsdWU9IiR7bWFucGFnZXN9L21hbjEuMSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtYW4yIiB2YWx1ZT0iJHttYW5wYWdlc30vbWFuMi4xIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke21hbjF9Ij48IS0tCistLT48IVtDREFUQVsuVEggIkNIRk4iICIxIiAiMDUvMTcvMjAxNyIgInNoYWRvd1wtdXRpbHMgNFwmLjQiICJVc2VyIENvbW1hbmRzIgorLmllIFxuKC5nIC5kcyBBcSBcKGFxCisuZWwgICAgICAgLmRzIEFxICcKKy5cIiBkaXNhYmxlIGh5cGhlbmF0aW9uCisubmgKKy5cIiBkaXNhYmxlIGp1c3RpZmljYXRpb24gKGFkanVzdCB0ZXh0IHRvIGxlZnQgbWFyZ2luIG9ubHkpCisuYWQgbAorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuXCIgKiBNQUlOIENPTlRFTlQgU1RBUlRTIEhFUkUgKgorLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisuU0ggIk5BTUUiCitjaGZuIFwtIGNoYW5nZSByZWFsIHVzZXIgbmFtZSBhbmQgaW5mb3JtYXRpb24KKy5TSCAiU1lOT1BTSVMiCisuSFAgXHcnXGZCY2hmblxmUlwgJ3UKK1xmQmNoZm5cZlIgW1xmSW9wdGlvbnNcZlJdIFtcZklMT0dJTlxmUl0KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZQorXGZCY2hmblxmUgorY29tbWFuZCBjaGFuZ2VzIHVzZXIgZnVsbG5hbWUsIG9mZmljZSByb29tIG51bWJlciwgb2ZmaWNlIHBob25lIG51bWJlciwgYW5kIGhvbWUgcGhvbmUgbnVtYmVyIGluZm9ybWF0aW9uIGZvciBhIHVzZXJcKihBcXMgYWNjb3VudFwmLiBUaGlzIGluZm9ybWF0aW9uIGlzIHR5cGljYWxseSBwcmludGVkIGJ5CitcZkJmaW5nZXJcZlIoMSkKK2FuZCBzaW1pbGFyIHByb2dyYW1zXCYuIEEgbm9ybWFsIHVzZXIgbWF5IG9ubHkgY2hhbmdlIHRoZSBmaWVsZHMgZm9yIGhlciBvd24gYWNjb3VudCwgc3ViamVjdCB0byB0aGUgcmVzdHJpY3Rpb25zIGluCisvZXRjL2xvZ2luXCYuZGVmc1wmLiAoVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyB0byBwcmV2ZW50IHVzZXJzIGZyb20gY2hhbmdpbmcgdGhlaXIgZnVsbG5hbWVcJi4pIFRoZSBzdXBlcnVzZXIgbWF5IGNoYW5nZSBhbnkgZmllbGQgZm9yIGFueSBhY2NvdW50XCYuIEFkZGl0aW9uYWxseSwgb25seSB0aGUgc3VwZXJ1c2VyIG1heSB1c2UgdGhlCitcZkJcLW9cZlIKK29wdGlvbiB0byBjaGFuZ2UgdGhlIHVuZGVmaW5lZCBwb3J0aW9ucyBvZiB0aGUgR0VDT1MgZmllbGRcJi4KKy5QUAorVGhlc2UgZmllbGRzIG11c3Qgbm90IGNvbnRhaW4gYW55IGNvbG9uc1wmLiBFeGNlcHQgZm9yIHRoZQorXGZJb3RoZXJcZlIKK2ZpZWxkLCB0aGV5IHNob3VsZCBub3QgY29udGFpbiBhbnkgY29tbWEgb3IgZXF1YWwgc2lnblwmLiBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRvIGF2b2lkIG5vblwtVVNcLUFTQ0lJIGNoYXJhY3RlcnMsIGJ1dCB0aGlzIGlzIG9ubHkgZW5mb3JjZWQgZm9yIHRoZSBwaG9uZSBudW1iZXJzXCYuIFRoZQorXGZJb3RoZXJcZlIKK2ZpZWxkIGlzIHVzZWQgdG8gc3RvcmUgYWNjb3VudGluZyBpbmZvcm1hdGlvbiB1c2VkIGJ5IG90aGVyIGFwcGxpY2F0aW9uc1wmLgorLlNIICJPUFRJT05TIgorLlBQCitUaGUgb3B0aW9ucyB3aGljaCBhcHBseSB0byB0aGUKK1xmQmNoZm5cZlIKK2NvbW1hbmQgYXJlOgorLlBQCitcZkJcLWZcZlIsIFxmQlwtXC1mdWxsXC1uYW1lXGZSXCBcJlxmSUZVTExfTkFNRVxmUgorLlJTIDQKK0NoYW5nZSB0aGUgdXNlclwqKEFxcyBmdWxsIG5hbWVcJi4KKy5SRQorLlBQCitcZkJcLWhcZlIsIFxmQlwtXC1ob21lXC1waG9uZVxmUlwgXCZcZklIT01FX1BIT05FXGZSCisuUlMgNAorQ2hhbmdlIHRoZSB1c2VyXCooQXFzIGhvbWUgcGhvbmUgbnVtYmVyXCYuCisuUkUKKy5QUAorXGZCXC1vXGZSLCBcZkJcLVwtb3RoZXJcZlJcIFwmXGZJT1RIRVJcZlIKKy5SUyA0CitDaGFuZ2UgdGhlIHVzZXJcKihBcXMgb3RoZXIgR0VDT1MgaW5mb3JtYXRpb25cJi4gVGhpcyBmaWVsZCBpcyB1c2VkIHRvIHN0b3JlIGFjY291bnRpbmcgaW5mb3JtYXRpb24gdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnMsIGFuZCBjYW4gYmUgY2hhbmdlZCBvbmx5IGJ5IGEgc3VwZXJ1c2VyXCYuCisuUkUKKy5QUAorXGZCXC1yXGZSLCBcZkJcLVwtcm9vbVxmUlwgXCZcZklST09NX05VTUJFUlxmUgorLlJTIDQKK0NoYW5nZSB0aGUgdXNlclwqKEFxcyByb29tIG51bWJlclwmLgorLlJFCisuUFAKK1xmQlwtUlxmUiwgXGZCXC1cLXJvb3RcZlJcIFwmXGZJQ0hST09UX0RJUlxmUgorLlJTIDQKK0FwcGx5IGNoYW5nZXMgaW4gdGhlCitcZklDSFJPT1RfRElSXGZSCitkaXJlY3RvcnkgYW5kIHVzZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIHRoZQorXGZJQ0hST09UX0RJUlxmUgorZGlyZWN0b3J5XCYuCisuUkUKKy5QUAorXGZCXC11XGZSLCBcZkJcLVwtaGVscFxmUgorLlJTIDQKK0Rpc3BsYXkgaGVscCBtZXNzYWdlIGFuZCBleGl0XCYuCisuUkUKKy5QUAorXGZCXC13XGZSLCBcZkJcLVwtd29ya1wtcGhvbmVcZlJcIFwmXGZJV09SS19QSE9ORVxmUgorLlJTIDQKK0NoYW5nZSB0aGUgdXNlclwqKEFxcyBvZmZpY2UgcGhvbmUgbnVtYmVyXCYuCisuUkUKKy5QUAorSWYgbm9uZSBvZiB0aGUgb3B0aW9ucyBhcmUgc2VsZWN0ZWQsCitcZkJjaGZuXGZSCitvcGVyYXRlcyBpbiBhbiBpbnRlcmFjdGl2ZSBmYXNoaW9uLCBwcm9tcHRpbmcgdGhlIHVzZXIgd2l0aCB0aGUgY3VycmVudCB2YWx1ZXMgZm9yIGFsbCBvZiB0aGUgZmllbGRzXCYuIEVudGVyIHRoZSBuZXcgdmFsdWUgdG8gY2hhbmdlIHRoZSBmaWVsZCwgb3IgbGVhdmUgdGhlIGxpbmUgYmxhbmsgdG8gdXNlIHRoZSBjdXJyZW50IHZhbHVlXCYuIFRoZSBjdXJyZW50IHZhbHVlIGlzIGRpc3BsYXllZCBiZXR3ZWVuIGEgcGFpciBvZgorXGZCWyBdXGZSCittYXJrc1wmLiBXaXRob3V0IG9wdGlvbnMsCitcZkJjaGZuXGZSCitwcm9tcHRzIGZvciB0aGUgY3VycmVudCB1c2VyIGFjY291bnRcJi4KKy5TSCAiQ09ORklHVVJBVElPTiIKKy5QUAorVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpbgorL2V0Yy9sb2dpblwmLmRlZnMKK2NoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyB0b29sOgorLlBQCitcZkJDSEZOX1JFU1RSSUNUXGZSIChzdHJpbmcpCisuUlMgNAorVGhpcyBwYXJhbWV0ZXIgc3BlY2lmaWVzIHdoaWNoIHZhbHVlcyBpbiB0aGUKK1xmSWdlY29zXGZSCitmaWVsZCBvZiB0aGUKKy9ldGMvcGFzc3dkCitmaWxlIG1heSBiZSBjaGFuZ2VkIGJ5IHJlZ3VsYXIgdXNlcnMgdXNpbmcgdGhlCitcZkJjaGZuXGZSCitwcm9ncmFtXCYuIEl0IGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgbGV0dGVycworXGZJZlxmUiwKK1xmSXJcZlIsCitcZkl3XGZSLAorXGZJaFxmUiwgZm9yIEZ1bGwgbmFtZSwgUm9vbSBudW1iZXIsIFdvcmsgcGhvbmUsIGFuZCBIb21lIHBob25lLCByZXNwZWN0aXZlbHlcJi4gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCitcZkl5ZXNcZlIKK2lzIGVxdWl2YWxlbnQgdG8KK1xmSXJ3aFxmUgorYW5kCitcZklub1xmUgoraXMgZXF1aXZhbGVudCB0bworXGZJZnJ3aFxmUlwmLiBJZiBub3Qgc3BlY2lmaWVkLCBvbmx5IHRoZSBzdXBlcnVzZXIgY2FuIG1ha2UgYW55IGNoYW5nZXNcJi4gVGhlIG1vc3QgcmVzdHJpY3RpdmUgc2V0dGluZyBpcyBiZXR0ZXIgYWNoaWV2ZWQgYnkgbm90IGluc3RhbGxpbmcKK1xmQmNoZm5cZlIKK1NVSURcJi4KKy5SRQorLlNIICJGSUxFUyIKKy5QUAorL2V0Yy9sb2dpblwmLmRlZnMKKy5SUyA0CitTaGFkb3cgcGFzc3dvcmQgc3VpdGUgY29uZmlndXJhdGlvblwmLgorLlJFCisuUFAKKy9ldGMvcGFzc3dkCisuUlMgNAorVXNlciBhY2NvdW50IGluZm9ybWF0aW9uXCYuCisuUkUKKy5TSCAiU0VFIEFMU08iCisuUFAKK1xmQmNoc2hcZlIoMSksCitcZkJsb2dpbi5kZWZzXGZSKDUpLAorXGZCcGFzc3dkXGZSKDUpXCYuCitdXT48IS0tCisgICAgLS0+PC9lY2hvPgorCisgICAgPGVjaG8gZmlsZT0iJHttYW4yfSI+PCEtLQorLS0+PCFbQ0RBVEFbLlRIICJWSVBXIiAiOCIgIjA1LzE3LzIwMTciICJzaGFkb3dcLXV0aWxzIDRcJi40IiAiU3lzdGVtIE1hbmFnZW1lbnQgQ29tbWFuZHMiCisuaWUgXG4oLmcgLmRzIEFxIFwoYXEKKy5lbCAgICAgICAuZHMgQXEgJworLlwiIGRpc2FibGUgaHlwaGVuYXRpb24KKy5uaAorLlwiIGRpc2FibGUganVzdGlmaWNhdGlvbiAoYWRqdXN0IHRleHQgdG8gbGVmdCBtYXJnaW4gb25seSkKKy5hZCBsCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5cIiAqIE1BSU4gQ09OVEVOVCBTVEFSVFMgSEVSRSAqCisuXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy5TSCAiTkFNRSIKK3ZpcHcsIHZpZ3IgXC0gZWRpdCB0aGUgcGFzc3dvcmQsIGdyb3VwLCBzaGFkb3dcLXBhc3N3b3JkIG9yIHNoYWRvd1wtZ3JvdXAgZmlsZQorLlNIICJTWU5PUFNJUyIKKy5IUCBcdydcZkJ2aXB3XGZSXCAndQorXGZCdmlwd1xmUiBbXGZJb3B0aW9uc1xmUl0KKy5IUCBcdydcZkJ2aWdyXGZSXCAndQorXGZCdmlnclxmUiBbXGZJb3B0aW9uc1xmUl0KKy5TSCAiREVTQ1JJUFRJT04iCisuUFAKK1RoZQorXGZCdmlwd1xmUgorYW5kCitcZkJ2aWdyXGZSCitjb21tYW5kcyBlZGl0cyB0aGUgZmlsZXMKKy9ldGMvcGFzc3dkCithbmQKKy9ldGMvZ3JvdXAsIHJlc3BlY3RpdmVseVwmLiBXaXRoIHRoZQorXGZCXC1zXGZSCitmbGFnLCB0aGV5IHdpbGwgZWRpdCB0aGUgc2hhZG93IHZlcnNpb25zIG9mIHRob3NlIGZpbGVzLAorL2V0Yy9zaGFkb3cKK2FuZAorL2V0Yy9nc2hhZG93LCByZXNwZWN0aXZlbHlcJi4gVGhlIHByb2dyYW1zIHdpbGwgc2V0IHRoZSBhcHByb3ByaWF0ZSBsb2NrcyB0byBwcmV2ZW50IGZpbGUgY29ycnVwdGlvblwmLiBXaGVuIGxvb2tpbmcgZm9yIGFuIGVkaXRvciwgdGhlIHByb2dyYW1zIHdpbGwgZmlyc3QgdHJ5IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQorXGZCJFZJU1VBTFxmUiwgdGhlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKK1xmQiRFRElUT1JcZlIsIGFuZCBmaW5hbGx5IHRoZSBkZWZhdWx0IGVkaXRvciwKK1xmQnZpXGZSKDEpXCYuCisuU0ggIk9QVElPTlMiCisuUFAKK1RoZSBvcHRpb25zIHdoaWNoIGFwcGx5IHRvIHRoZQorXGZCdmlwd1xmUgorYW5kCitcZkJ2aWdyXGZSCitjb21tYW5kcyBhcmU6CisuUFAKK1xmQlwtZ1xmUiwgXGZCXC1cLWdyb3VwXGZSCisuUlMgNAorRWRpdCBncm91cCBkYXRhYmFzZVwmLgorLlJFCisuUFAKK1xmQlwtaFxmUiwgXGZCXC1cLWhlbHBcZlIKKy5SUyA0CitEaXNwbGF5IGhlbHAgbWVzc2FnZSBhbmQgZXhpdFwmLgorLlJFCisuUFAKK1xmQlwtcFxmUiwgXGZCXC1cLXBhc3N3ZFxmUgorLlJTIDQKK0VkaXQgcGFzc3dkIGRhdGFiYXNlXCYuCisuUkUKKy5QUAorXGZCXC1xXGZSLCBcZkJcLVwtcXVpZXRcZlIKKy5SUyA0CitRdWlldCBtb2RlXCYuCisuUkUKKy5QUAorXGZCXC1SXGZSLCBcZkJcLVwtcm9vdFxmUlwgXCZcZklDSFJPT1RfRElSXGZSCisuUlMgNAorQXBwbHkgY2hhbmdlcyBpbiB0aGUKK1xmSUNIUk9PVF9ESVJcZlIKK2RpcmVjdG9yeSBhbmQgdXNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gdGhlCitcZklDSFJPT1RfRElSXGZSCitkaXJlY3RvcnlcJi4KKy5SRQorLlBQCitcZkJcLXNcZlIsIFxmQlwtXC1zaGFkb3dcZlIKKy5SUyA0CitFZGl0IHNoYWRvdyBvciBnc2hhZG93IGRhdGFiYXNlXCYuCisuUkUKKy5TSCAiRU5WSVJPTk1FTlQiCisuUFAKK1xmQlZJU1VBTFxmUgorLlJTIDQKK0VkaXRvciB0byBiZSB1c2VkXCYuCisuUkUKKy5QUAorXGZCRURJVE9SXGZSCisuUlMgNAorRWRpdG9yIHRvIGJlIHVzZWQgaWYKK1xmQlZJU1VBTFxmUgoraXMgbm90IHNldFwmLgorLlJFCisuU0ggIkZJTEVTIgorLlBQCisvZXRjL2dyb3VwCisuUlMgNAorR3JvdXAgYWNjb3VudCBpbmZvcm1hdGlvblwmLgorLlJFCisuUFAKKy9ldGMvZ3NoYWRvdworLlJTIDQKK1NlY3VyZSBncm91cCBhY2NvdW50IGluZm9ybWF0aW9uXCYuCisuUkUKKy5QUAorL2V0Yy9wYXNzd2QKKy5SUyA0CitVc2VyIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlBQCisvZXRjL3NoYWRvdworLlJTIDQKK1NlY3VyZSB1c2VyIGFjY291bnQgaW5mb3JtYXRpb25cJi4KKy5SRQorLlNIICJTRUUgQUxTTyIKKy5QUAorXGZCdmlcZlIoMSksCitcZkJncm91cFxmUig1KSwKK1xmQmdzaGFkb3dcZlIoNSkKKywKK1xmQnBhc3N3ZFxmUig1KSwgLAorXGZCc2hhZG93XGZSKDUpXCYuCitdXT48IS0tCisgICAgLS0+PC9lY2hvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Ii1sZWdhbCIgZGVwZW5kcz0iLXNtaWxlIj4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hhcmVkbGljZW5zZS5uYW1lIiB2YWx1ZT0iVVNFTEVTU0xJQ0VOU0UiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ic2hhcmVkbGljZW5zZS50ZXh0IgorICAgICAgICAgICAgICB2YWx1ZT0iVGhpcyBsaWNlbnNlIGdyYW50cyBubyBwYXJ0aWN1bGFyIHJpZ2h0cy4iLz4KKworICAgIDxta2RpciBkaXI9IiR7aGVsbG8ubGVnYWx9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtzbWlsZS5sZWdhbH0iLz4KKworICAgIDxlY2hvIGZpbGU9IiR7aGVsbG8ubGVnYWx9LyR7c2hhcmVkbGljZW5zZS5uYW1lfSIKKyAgICAgICAgICBtZXNzYWdlPSIke3NoYXJlZGxpY2Vuc2UudGV4dH0iLz4KKyAgICA8ZWNobyBmaWxlPSIke3NtaWxlLmxlZ2FsfS8ke3NoYXJlZGxpY2Vuc2UubmFtZX0iCisgICAgICAgICAgbWVzc2FnZT0iJHtzaGFyZWRsaWNlbnNlLnRleHR9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0idW5pcXVlbGljZW5zZS5uYW1lIiB2YWx1ZT0iVU5JUVVFTElDRU5TRSIvPgorICAgIDxlY2hvIGZpbGU9IiR7aGVsbG8ubGVnYWx9LyR7dW5pcXVlbGljZW5zZS5uYW1lfSIKKyAgICAgICAgICBtZXNzYWdlPSJMaWNlbnNlIGZvciAke2hlbGxvLm1vZH0uIi8+CisgICAgPGVjaG8gZmlsZT0iJHtzbWlsZS5sZWdhbH0vJHt1bmlxdWVsaWNlbnNlLm5hbWV9IgorICAgICAgICAgIG1lc3NhZ2U9IkxpY2Vuc2UgZm9yICR7c21pbGUubW9kfS4iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSItam1vZHMiIGRlcGVuZHM9Ii1zbWlsZSwtbGVnYWwiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWxsby5qbW9kIiB2YWx1ZT0iJHtqbW9kc30vaGVsbG8uam1vZCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzbWlsZS5qbW9kIiB2YWx1ZT0iJHtqbW9kc30vc21pbGUuam1vZCIvPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7aGVsbG8uam1vZH0iCisgICAgICAgICAgY2xhc3NwYXRoPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgbGVnYWxwYXRoPSIke2hlbGxvLmxlZ2FsfSIKKyAgICAgICAgICBtYW5wYXRoPSIke21hbnBhZ2VzfSIvPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7c21pbGUuam1vZH0iCisgICAgICAgICAgY2xhc3NwYXRoPSIke3NtaWxlLmphcn0iCisgICAgICAgICAgbGVnYWxwYXRoPSIke3NtaWxlLmxlZ2FsfSIKKyAgICAgICAgICBtYW5wYXRoPSIke21hbnBhZ2VzfSIKKyAgICAgICAgICBtb2R1bGVwYXRoPSIke2hlbGxvLmphci5kaXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcGF0aCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbWFnZU5ld2VyVGhhbkptb2RzIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIvPgorCisgICAgPGNobW9kIHBlcm09ImErdyI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7aW1hZ2V9Ii8+CisgICAgPC9jaG1vZD4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRlZm9ybWF0IiB2YWx1ZT0ieXl5eS1NTS1kZCBISDptbTpzcy5TU1MiLz4KKyAgICA8dHN0YW1wPgorICAgICAgPGZvcm1hdCBwcm9wZXJ0eT0iZnV0dXJlIiBwYXR0ZXJuPSIke2RhdGVmb3JtYXR9IiBvZmZzZXQ9IjEiIHVuaXQ9ImhvdXIiLz4KKyAgICA8L3RzdGFtcD4KKyAgICA8dG91Y2ggZGF0ZXRpbWU9IiR7ZnV0dXJlfSIgcGF0dGVybj0iJHtkYXRlZm9ybWF0fSI+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7aW1hZ2V9Ii8+CisgICAgPC90b3VjaD4KKworICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im5vbW9kdWxlcGF0aCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibm9tb2R1bGVzIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2R1bGVwYXRocmVmIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxwYXRoIGlkPSJtb2R1bGVzIj4KKyAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZGttb2RzfSIgdW5sZXNzOmJsYW5rPSIke2pka21vZHN9Ii8+CisgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7am1vZHN9Ii8+CisgICAgPC9wYXRoPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRocmVmPSJtb2R1bGVzIgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2R1bGVwYXRoLW5lc3RlZCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8bW9kdWxlcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2pka21vZHN9IiB1bmxlc3M6Ymxhbms9IiR7amRrbW9kc30iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2ptb2RzfSIvPgorICAgICAgPC9tb2R1bGVwYXRoPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJtb2R1bGVwYXRoLWJvdGgiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPHByb3BlcnR5IG5hbWU9Im1vZDEiIHZhbHVlPSIke291dHB1dH0vbW9kMSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJtb2QyIiB2YWx1ZT0iJHtvdXRwdXR9L21vZDIiLz4KKworICAgIDxta2RpciBkaXI9IiR7bW9kMX0iLz4KKyAgICA8bWtkaXIgZGlyPSIke21vZDJ9Ii8+CisKKyAgICA8Y29weSBmaWxlPSIke2hlbGxvLmptb2R9IiB0b2Rpcj0iJHttb2QxfSIvPgorICAgIDxjb3B5IGZpbGU9IiR7c21pbGUuam1vZH0iIHRvZGlyPSIke21vZDJ9Ii8+CisKKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7bW9kMX0iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8bW9kdWxlcGF0aD4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke21vZDJ9Ii8+CisgICAgICA8L21vZHVsZXBhdGg+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1vZHVsZXMtbmVzdGVkIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iPgorICAgICAgPG1vZHVsZSBuYW1lPSIke2hlbGxvLm1vZH0iLz4KKyAgICAgIDxtb2R1bGUgbmFtZT0iJHtzbWlsZS5tb2R9Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1vZHVsZXMtbmVzdGVkLW1pc3NpbmctbmFtZSIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9Ij4KKyAgICAgIDxtb2R1bGUvPgorICAgICAgPG1vZHVsZSBuYW1lPSIke3NtaWxlLm1vZH0iLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibW9kdWxlcy1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSI+CisgICAgICA8bW9kdWxlIG5hbWU9IiR7c21pbGUubW9kfSIvPgorICAgICAgPCEtLQorICAgICAgICBBZGRpbmcgdGhpcyBsYXVuY2hlciBndWFyYW50ZWVzIGFuIGVycm9yIG9jY3VycyB1bmxlc3MKKyAgICAgICAgYm90aCBtb2R1bGVzIGFyZSBmb3VuZC4KKyAgICAgIC0tPgorICAgICAgPGxhdW5jaGVyIG5hbWU9IlNtaWxlIiBtb2R1bGU9IiR7c21pbGUubW9kfSIgbWFpbmNsYXNzPSIke3NtaWxlLm1haW4tY2xhc3N9Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9ic2VydmFibGUiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7am1vZHN9OyR7amF2YS5ob21lfS9qbW9kcyIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9IgorICAgICAgICAgIG9ic2VydmFibGVNb2R1bGVzPSJqYXZhLmJhc2UiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJvYnNlcnZhYmxlLW5lc3RlZCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqbW9kc307JHtqYXZhLmhvbWV9L2ptb2RzIgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iPgorICAgICAgICA8b2JzZXJ2YWJsZU1vZHVsZSBuYW1lPSJqYXZhLmJhc2UiLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib2JzZXJ2YWJsZS1uZXN0ZWQtbWlzc2luZy1uYW1lIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2ptb2RzfTske2phdmEuaG9tZX0vam1vZHMiCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICAgIDxvYnNlcnZhYmxlTW9kdWxlLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib2JzZXJ2YWJsZS1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2ptb2RzfTske2phdmEuaG9tZX0vam1vZHMiCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICBvYnNlcnZhYmxlTW9kdWxlcz0iamF2YS5iYXNlIj4KKyAgICAgICAgPG9ic2VydmFibGVNb2R1bGUgbmFtZT0iamF2YS5sb2dnaW5nIi8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxhdW5jaGVycyIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgbGF1bmNoZXJzPSJIZWxsbz0ke2hlbGxvLm1vZH0vJHtoZWxsby5tYWluLWNsYXNzfSxTbWlsZT0ke3NtaWxlLm1vZH0vJHtzbWlsZS5tYWluLWNsYXNzfSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxhdW5jaGVycy1uZXN0ZWQiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxsYXVuY2hlciBuYW1lPSJIZWxsbyIgbW9kdWxlPSIke2hlbGxvLm1vZH0iIG1haW5DbGFzcz0iJHtoZWxsby5tYWluLWNsYXNzfSIvPgorICAgICAgPGxhdW5jaGVyIG5hbWU9IlNtaWxlIiBtb2R1bGU9IiR7c21pbGUubW9kfSIgbWFpbkNsYXNzPSIke3NtaWxlLm1haW4tY2xhc3N9Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxhdW5jaGVycy1uZXN0ZWQtbWlzc2luZy1uYW1lIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8bGF1bmNoZXIgICAgICAgICAgICAgIG1vZHVsZT0iJHtoZWxsby5tb2R9IiBtYWluQ2xhc3M9IiR7aGVsbG8ubWFpbi1jbGFzc30iLz4KKyAgICAgIDxsYXVuY2hlciBuYW1lPSJTbWlsZSIgbW9kdWxlPSIke3NtaWxlLm1vZH0iIG1haW5DbGFzcz0iJHtzbWlsZS5tYWluLWNsYXNzfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsYXVuY2hlcnMtbmVzdGVkLW1pc3NpbmctbW9kdWxlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8bGF1bmNoZXIgbmFtZT0iSGVsbG8iICAgICAgICAgICAgICAgICAgICAgICBtYWluQ2xhc3M9IiR7aGVsbG8ubWFpbi1jbGFzc30iLz4KKyAgICAgIDxsYXVuY2hlciBuYW1lPSJTbWlsZSIgbW9kdWxlPSIke3NtaWxlLm1vZH0iIG1haW5DbGFzcz0iJHtzbWlsZS5tYWluLWNsYXNzfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsYXVuY2hlcnMtYm90aCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgbGF1bmNoZXJzPSJIZWxsbz0ke2hlbGxvLm1vZH0vJHtoZWxsby5tYWluLWNsYXNzfSI+CisgICAgICA8bGF1bmNoZXIgbmFtZT0iU21pbGUiIG1vZHVsZT0iJHtzbWlsZS5tb2R9IiBtYWluQ2xhc3M9IiR7c21pbGUubWFpbi1jbGFzc30iLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iLWxvY2FsZWZpbmRlciIgZGVwZW5kcz0iLWRpcnMiPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImxvY2FsZWZpbmRlci5yb290IiB2YWx1ZT0iJHtpbnB1dH0vbG9jYWxlZmluZGVyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLnNyYyIgdmFsdWU9IiR7bG9jYWxlZmluZGVyLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsb2NhbGVmaW5kZXIuY2xhc3NlcyIgdmFsdWU9IiR7bG9jYWxlZmluZGVyLnJvb3R9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLmphci5kaXIiIHZhbHVlPSIke2xvY2FsZWZpbmRlci5yb290fS9qYXJzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxvY2FsZWZpbmRlci5qYXIiIHZhbHVlPSIke2xvY2FsZWZpbmRlci5qYXIuZGlyfS9sb2NhbGVmaW5kZXIuamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLm1vZCIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5sb2NhbGVmaW5kZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLnBrZyIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5sb2NhbGVmaW5kZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLnBrZy5wYXRoIiB2YWx1ZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGVzdC9sb2NhbGVmaW5kZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLnBrZy5kaXIiIHZhbHVlPSIke2xvY2FsZWZpbmRlci5zcmN9LyR7bG9jYWxlZmluZGVyLnBrZy5wYXRofSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImxvY2FsZWZpbmRlci5tYWluLWNsYXNzIiB2YWx1ZT0iJHtsb2NhbGVmaW5kZXIucGtnfS5Mb2NhbGVGaW5kZXIiLz4KKworICAgIDxta2RpciBkaXI9IiR7bG9jYWxlZmluZGVyLnBrZy5kaXJ9Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtsb2NhbGVmaW5kZXIucGtnLmRpcn0vTG9jYWxlRmluZGVyLmphdmEiPjwhW0NEQVRBWworcGFja2FnZSAke2xvY2FsZWZpbmRlci5wa2d9OworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK3B1YmxpYyBjbGFzcyBMb2NhbGVGaW5kZXIgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGxhbmd1YWdlc1RvRmluZCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBsYW5ndWFnZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoTG9jYWxlIGxvY2FsZSA6IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCkpIHsKKyAgICAgICAgICAgIGxhbmd1YWdlcy5hZGQobG9jYWxlLmdldExhbmd1YWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gbGFuZ3VhZ2VzLmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QobGFuZ3VhZ2VzVG9GaW5kKSk7CisgICAgICAgIFN5c3RlbS5leGl0KG1hdGNoZWQgPyAwIDogMSk7CisgICAgfQorfV1dPgorICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2xvY2FsZWZpbmRlci5zcmN9L21vZHVsZS1pbmZvLmphdmEiPgorbW9kdWxlICR7bG9jYWxlZmluZGVyLm1vZH0geworICAgIGV4cG9ydHMgJHtsb2NhbGVmaW5kZXIucGtnfTsKKyAgICByZXF1aXJlcyBqZGsubG9jYWxlZGF0YTsKK30KKyAgICA8L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke2xvY2FsZWZpbmRlci5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7bG9jYWxlZmluZGVyLnNyY30iCisgICAgICAgICAgIGRlc3RkaXI9IiR7bG9jYWxlZmluZGVyLmNsYXNzZXN9IgorICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiCisgICAgICAgICAgIGRlYnVnPSJ0cnVlIi8+CisKKyAgICA8bWtkaXIgZGlyPSIke2xvY2FsZWZpbmRlci5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7bG9jYWxlZmluZGVyLmphcn0iIGJhc2VkaXI9IiR7bG9jYWxlZmluZGVyLmNsYXNzZXN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWxlZmluZGVyLmptb2QiIHZhbHVlPSIke2ptb2RzfS9sb2NhbGVmaW5kZXIuam1vZCIvPgorICAgIDxqbW9kIGRlc3RmaWxlPSIke2xvY2FsZWZpbmRlci5qbW9kfSIgY2xhc3NwYXRoPSIke2xvY2FsZWZpbmRlci5qYXJ9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibG9jYWxlcyIgZGVwZW5kcz0iLWxvY2FsZWZpbmRlciI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7am1vZHN9OyR7amF2YS5ob21lfS9qbW9kcyIKKyAgICAgICAgICBtb2R1bGVzPSIke2xvY2FsZWZpbmRlci5tb2R9LGpkay5sb2NhbGVkYXRhIgorICAgICAgICAgIGxvY2FsZXM9InpoLGluIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibG9jYWxlcy1uZXN0ZWQiIGRlcGVuZHM9Ii1sb2NhbGVmaW5kZXIiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2ptb2RzfTske2phdmEuaG9tZX0vam1vZHMiCisgICAgICAgICAgbW9kdWxlcz0iJHtsb2NhbGVmaW5kZXIubW9kfSxqZGsubG9jYWxlZGF0YSI+CisgICAgICA8bG9jYWxlIG5hbWU9InpoIi8+CisgICAgICA8bG9jYWxlIG5hbWU9ImluIi8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImxvY2FsZXMtbmVzdGVkLW1pc3NpbmctbmFtZSIgZGVwZW5kcz0iLWxvY2FsZWZpbmRlciI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7am1vZHN9OyR7amF2YS5ob21lfS9qbW9kcyIKKyAgICAgICAgICBtb2R1bGVzPSIke2xvY2FsZWZpbmRlci5tb2R9LGpkay5sb2NhbGVkYXRhIj4KKyAgICAgIDxsb2NhbGUvPgorICAgICAgPGxvY2FsZSBuYW1lPSJpbiIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJsb2NhbGVzLWJvdGgiIGRlcGVuZHM9Ii1sb2NhbGVmaW5kZXIiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2ptb2RzfTske2phdmEuaG9tZX0vam1vZHMiCisgICAgICAgICAgbW9kdWxlcz0iJHtsb2NhbGVmaW5kZXIubW9kfSxqZGsubG9jYWxlZGF0YSIKKyAgICAgICAgICBsb2NhbGVzPSJ6aCI+CisgICAgICA8bG9jYWxlIG5hbWU9ImluIi8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9yZGVyaW5nIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICByZXNvdXJjZU9yZGVyPSIqKi9yZXNvdXJjZTEudHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3JkZXJpbmctbmVzdGVkIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVzb3VyY2VPcmRlciBwYXR0ZXJuPSIqKi9yZXNvdXJjZTEudHh0Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im9yZGVyaW5nLW5lc3RlZC1maWxlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDx0ZW1wZmlsZSBwcm9wZXJ0eT0ibGlzdGZpbGUiIGRlc3RkaXI9IiR7b3V0cHV0fSIgc3VmZml4PSIubHN0Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtsaXN0ZmlsZX0iIG1lc3NhZ2U9IioqL3Jlc291cmNlMS50eHQiLz4KKworICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVzb3VyY2VPcmRlciBsaXN0ZmlsZT0iJHtsaXN0ZmlsZX0iLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3JkZXJpbmctbmVzdGVkLW5vLWF0dHIiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZXNvdXJjZU9yZGVyLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ib3JkZXJpbmctbmVzdGVkLWJvdGgiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPHRlbXBmaWxlIHByb3BlcnR5PSJsaXN0ZmlsZSIgZGVzdGRpcj0iJHtvdXRwdXR9IiBzdWZmaXg9Ii5sc3QiLz4KKyAgICA8ZWNobyBmaWxlPSIke2xpc3RmaWxlfSIgbWVzc2FnZT0iKiovcmVzb3VyY2UxLnR4dCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZXNvdXJjZU9yZGVyIHBhdHRlcm49IioqL3Jlc291cmNlMS50eHQiIGxpc3RmaWxlPSIke2xpc3RmaWxlfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJvcmRlcmluZy1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICByZXNvdXJjZU9yZGVyPSIqKi9yZXNvdXJjZTEudHh0Ij4KKyAgICAgIDxyZXNvdXJjZU9yZGVyIHBhdHRlcm49IioqL3Jlc291cmNlMi50eHQiLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXhjbHVkZXJlc291cmNlcyIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgZXhjbHVkZVJlc291cmNlcz0iKiovcmVzb3VyY2UxLnR4dCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVyZXNvdXJjZXMtbmVzdGVkIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8ZXhjbHVkZVJlc291cmNlcyBwYXR0ZXJuPSIqKi9yZXNvdXJjZTEudHh0Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVyZXNvdXJjZXMtbmVzdGVkLWZpbGUiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPHRlbXBmaWxlIHByb3BlcnR5PSJsaXN0ZmlsZSIgZGVzdGRpcj0iJHtvdXRwdXR9IiBzdWZmaXg9Ii5sc3QiLz4KKyAgICA8ZWNobyBmaWxlPSIke2xpc3RmaWxlfSIgbWVzc2FnZT0iKiovcmVzb3VyY2UxLnR4dCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxleGNsdWRlUmVzb3VyY2VzIGxpc3RmaWxlPSIke2xpc3RmaWxlfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJleGNsdWRlcmVzb3VyY2VzLW5lc3RlZC1uby1hdHRyIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8ZXhjbHVkZVJlc291cmNlcy8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVyZXNvdXJjZXMtbmVzdGVkLWJvdGgiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPHRlbXBmaWxlIHByb3BlcnR5PSJsaXN0ZmlsZSIgZGVzdGRpcj0iJHtvdXRwdXR9IiBzdWZmaXg9Ii5sc3QiLz4KKyAgICA8ZWNobyBmaWxlPSIke2xpc3RmaWxlfSIgbWVzc2FnZT0iKiovcmVzb3VyY2UxLnR4dCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxleGNsdWRlUmVzb3VyY2VzIHBhdHRlcm49IioqL3Jlc291cmNlMS50eHQiIGxpc3RmaWxlPSIke2xpc3RmaWxlfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJleGNsdWRlcmVzb3VyY2VzLWJvdGgiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9IgorICAgICAgICAgIGV4Y2x1ZGVSZXNvdXJjZXM9IioqL3Jlc291cmNlMS50eHQiPgorICAgICAgPGV4Y2x1ZGVSZXNvdXJjZXMgcGF0dGVybj0iKiovcmVzb3VyY2UyLnR4dCIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJleGNsdWRlZmlsZXMiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9IgorICAgICAgICAgIGV4Y2x1ZGVGaWxlcz0iKiovZmlsZTEudHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXhjbHVkZWZpbGVzLW5lc3RlZCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iPgorICAgICAgPGV4Y2x1ZGVGaWxlcyBwYXR0ZXJuPSIqKi9maWxlMS50eHQiLz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZXhjbHVkZWZpbGVzLW5lc3RlZC1maWxlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDx0ZW1wZmlsZSBwcm9wZXJ0eT0ibGlzdGZpbGUiIGRlc3RkaXI9IiR7b3V0cHV0fSIgc3VmZml4PSIubHN0Ii8+CisgICAgPGVjaG8gZmlsZT0iJHtsaXN0ZmlsZX0iIG1lc3NhZ2U9IioqL2ZpbGUxLnR4dCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxleGNsdWRlRmlsZXMgbGlzdGZpbGU9IiR7bGlzdGZpbGV9Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVmaWxlcy1uZXN0ZWQtbm8tYXR0ciIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iPgorICAgICAgPGV4Y2x1ZGVGaWxlcy8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVmaWxlcy1uZXN0ZWQtYm90aCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8dGVtcGZpbGUgcHJvcGVydHk9Imxpc3RmaWxlIiBkZXN0ZGlyPSIke291dHB1dH0iIHN1ZmZpeD0iLmxzdCIvPgorICAgIDxlY2hvIGZpbGU9IiR7bGlzdGZpbGV9IiBtZXNzYWdlPSIqKi9maWxlMS50eHQiLz4KKworICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8ZXhjbHVkZUZpbGVzIHBhdHRlcm49IioqL2ZpbGUxLnR4dCIgbGlzdGZpbGU9IiR7bGlzdGZpbGV9Ii8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImV4Y2x1ZGVmaWxlcy1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICBleGNsdWRlRmlsZXM9IioqL2ZpbGUxLnR4dCI+CisgICAgICA8ZXhjbHVkZUZpbGVzIHBhdHRlcm49IioqL2ZpbGUyLnR4dCIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpbmNsdWRlaGVhZGVycyIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgaW5jbHVkZUhlYWRlcnM9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iaW5jbHVkZW1hbnBhZ2VzIiBkZXBlbmRzPSItbWFucGFnZXMsLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgaW5jbHVkZU1hblBhZ2VzPSJmYWxzZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImluY2x1ZGVuYXRpdmVjb21tYW5kcyIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgaW5jbHVkZU5hdGl2ZUNvbW1hbmRzPSJmYWxzZSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXByZXNzaW9uIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbXByZXNzZWQtaW1hZ2UiIHZhbHVlPSIke291dHB1dH0vaW1hZ2UyIi8+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtjb21wcmVzc2VkLWltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgY29tcHJlc3M9InppcCIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXByZXNzaW9uLW5lc3RlZCIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21wcmVzc2VkLWltYWdlIiB2YWx1ZT0iJHtvdXRwdXR9L2ltYWdlMiIvPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7Y29tcHJlc3NlZC1pbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxjb21wcmVzcyBsZXZlbD0iemlwIi8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9ImNvbXByZXNzaW9uLW5lc3RlZC1uby1hdHRyIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8Y29tcHJlc3MvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJjb21wcmVzc2lvbi1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImNvbXByZXNzZWQtaW1hZ2UiIHZhbHVlPSIke291dHB1dH0vaW1hZ2UyIi8+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtjb21wcmVzc2VkLWltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iCisgICAgICAgICAgY29tcHJlc3M9InppcCI+CisgICAgICA8Y29tcHJlc3MgbGV2ZWw9InppcCIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJlbmRpYW4iIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9IiBlbmRpYW5uZXNzPSJsaXR0bGUiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ2bSIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iIHZtVHlwZT0ic2VydmVyIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZWluZm8tZmlsZSIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvcHMiIHZhbHVlPSIke291dHB1dH0vYXBwLnByb3BlcnRpZXMiLz4KKyAgICA8ZWNobyBmaWxlPSIke3Byb3BzfSIgbWVzc2FnZT0idGVzdD10cnVlIiBlbmNvZGluZz0iSVNPLTg4NTktMSIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbyBmaWxlPSIke3Byb3BzfSIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWxlYXNlaW5mby1kZWxldGUiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCBrZXk9InRlc3QiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8L3JlbGVhc2VpbmZvPgorICAgICAgPHJlbGVhc2VpbmZvIGRlbGV0ZT0idGVzdCIvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWxlYXNlaW5mby1uZXN0ZWQtZGVsZXRlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVsZWFzZWluZm8+CisgICAgICAgIDxhZGQga2V5PSJ0ZXN0IiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPC9yZWxlYXNlaW5mbz4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGRlbGV0ZSBrZXk9InRlc3QiLz4KKyAgICAgIDwvcmVsZWFzZWluZm8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlbGVhc2VpbmZvLW5lc3RlZC1kZWxldGUtbm8ta2V5IiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVsZWFzZWluZm8+CisgICAgICAgIDxkZWxldGUvPgorICAgICAgPC9yZWxlYXNlaW5mbz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZWluZm8tbmVzdGVkLWRlbGV0ZS1ib3RoIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVsZWFzZWluZm8+CisgICAgICAgIDxhZGQga2V5PSJ0ZXN0IiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8YWRkIGtleT0iZm9vIiB2YWx1ZT0iYmFyIi8+CisgICAgICA8L3JlbGVhc2VpbmZvPgorICAgICAgPHJlbGVhc2VpbmZvIGRlbGV0ZT0idGVzdCI+CisgICAgICAgIDxkZWxldGUga2V5PSJmb28iLz4KKyAgICAgIDwvcmVsZWFzZWluZm8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlbGVhc2VpbmZvLWFkZC1maWxlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wcyIgdmFsdWU9IiR7b3V0cHV0fS9hcHAucHJvcGVydGllcyIvPgorICAgIDxlY2hvIGZpbGU9IiR7cHJvcHN9IiBtZXNzYWdlPSJ0ZXN0PXMmI3hlZDsiIGVuY29kaW5nPSJJU08tODg1OS0xIi8+CisKKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aGVsbG8ubW9kfSwke3NtaWxlLm1vZH0iPgorICAgICAgPHJlbGVhc2VpbmZvPgorICAgICAgICA8YWRkIGZpbGU9IiR7cHJvcHN9Ii8+CisgICAgICA8L3JlbGVhc2VpbmZvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWxlYXNlaW5mby1hZGQtZmlsZS1jaGFyc2V0IiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wcyIgdmFsdWU9IiR7b3V0cHV0fS9hcHAucHJvcGVydGllcyIvPgorICAgIDxlY2hvIGZpbGU9IiR7cHJvcHN9IiBtZXNzYWdlPSJ0ZXN0PXMmI3hlZDsiIGVuY29kaW5nPSJVVEYtOCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCBmaWxlPSIke3Byb3BzfSIgY2hhcnNldD0iVVRGLTgiLz4KKyAgICAgIDwvcmVsZWFzZWluZm8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlbGVhc2VpbmZvLWFkZC1rZXkiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCBrZXk9InRlc3QiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8L3JlbGVhc2VpbmZvPgorICAgIDwvbGluaz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJyZWxlYXNlaW5mby1hZGQtbm8tdmFsdWUiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCBrZXk9InRlc3QiLz4KKyAgICAgIDwvcmVsZWFzZWluZm8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InJlbGVhc2VpbmZvLWFkZC1uby1rZXkiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPC9yZWxlYXNlaW5mbz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZWluZm8tYWRkLWZpbGUtYW5kLWtleSIgZGVwZW5kcz0iLWptb2RzIj4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvcHMiIHZhbHVlPSIke291dHB1dH0vYXBwLnByb3BlcnRpZXMiLz4KKyAgICA8ZWNobyBmaWxlPSIke3Byb3BzfSIgbWVzc2FnZT0idGVzdD1zJiN4ZWQ7IiBlbmNvZGluZz0iVVRGLTgiLz4KKworICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSI+CisgICAgICA8cmVsZWFzZWluZm8+CisgICAgICAgIDxhZGQgZmlsZT0iJHtwcm9wc30iIGtleT0idGVzdCIvPgorICAgICAgPC9yZWxlYXNlaW5mbz4KKyAgICA8L2xpbms+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0icmVsZWFzZWluZm8tYWRkLWZpbGUtYW5kLXZhbHVlIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wcyIgdmFsdWU9IiR7b3V0cHV0fS9hcHAucHJvcGVydGllcyIvPgorICAgIDxlY2hvIGZpbGU9IiR7cHJvcHN9IiBtZXNzYWdlPSJ0ZXN0PXMmI3hlZDsiIGVuY29kaW5nPSJVVEYtOCIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ij4KKyAgICAgIDxyZWxlYXNlaW5mbz4KKyAgICAgICAgPGFkZCBmaWxlPSIke3Byb3BzfSIgdmFsdWU9InRydWUiLz4KKyAgICAgIDwvcmVsZWFzZWluZm8+CisgICAgPC9saW5rPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Ii10aHJvd2VyIiBkZXBlbmRzPSItZGlycyI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0idGhyb3dlci5yb290IiB2YWx1ZT0iJHtpbnB1dH0vdGhyb3dlciIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InRocm93ZXIuc3JjIiB2YWx1ZT0iJHt0aHJvd2VyLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLmNsYXNzZXMiIHZhbHVlPSIke3Rocm93ZXIucm9vdH0vY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLmphci5kaXIiIHZhbHVlPSIke3Rocm93ZXIucm9vdH0vamFycyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLmphciIgdmFsdWU9IiR7dGhyb3dlci5qYXIuZGlyfS90aHJvd2VyLmphciIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InRocm93ZXIubW9kIiAgICAgIHZhbHVlPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50ZXN0LnRocm93ZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGhyb3dlci5wa2ciICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRlc3QudGhyb3dlciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLnBrZy5wYXRoIiB2YWx1ZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGVzdC90aHJvd2VyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRocm93ZXIucGtnLmRpciIgdmFsdWU9IiR7dGhyb3dlci5zcmN9LyR7dGhyb3dlci5wa2cucGF0aH0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLm1haW4tY2xhc3MiIHZhbHVlPSIke3Rocm93ZXIucGtnfS5UaHJvd2VyIi8+CisKKyAgICA8bWtkaXIgZGlyPSIke3Rocm93ZXIucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke3Rocm93ZXIucGtnLmRpcn0vVGhyb3dlci5qYXZhIj4KK3BhY2thZ2UgJHt0aHJvd2VyLnBrZ307CisKK3B1YmxpYyBjbGFzcyBUaHJvd2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEZWxpYmVyYXRlIGV4Y2VwdGlvbi4iKTsKKyAgICB9Cit9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7dGhyb3dlci5zcmN9L21vZHVsZS1pbmZvLmphdmEiPgorbW9kdWxlICR7dGhyb3dlci5tb2R9IHsKKyAgICBleHBvcnRzICR7dGhyb3dlci5wa2d9OworfQorICAgIDwvZWNobz4KKworICAgIDxta2RpciBkaXI9IiR7dGhyb3dlci5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7dGhyb3dlci5zcmN9IiBkZXN0ZGlyPSIke3Rocm93ZXIuY2xhc3Nlc30iCisgICAgICAgICAgIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIgZGVidWc9InRydWUiLz4KKworICAgIDxta2RpciBkaXI9IiR7dGhyb3dlci5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7dGhyb3dlci5qYXJ9IiBiYXNlZGlyPSIke3Rocm93ZXIuY2xhc3Nlc30iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJkZWJ1ZyIgZGVwZW5kcz0iLXRocm93ZXIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ0aHJvd2VyLmptb2QiIHZhbHVlPSIke2ptb2RzfS90aHJvd2VyLmptb2QiLz4KKyAgICA8am1vZCBkZXN0ZmlsZT0iJHt0aHJvd2VyLmptb2R9IiBjbGFzc3BhdGg9IiR7dGhyb3dlci5qYXJ9Ii8+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke3Rocm93ZXIubW9kfSIgZGVidWc9ImZhbHNlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGVkdXAiIGRlcGVuZHM9Ii1qbW9kcyI+CisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZX0iIG1vZHVsZXBhdGg9IiR7amRrbW9kc30ke2ptb2RzfSIKKyAgICAgICAgICBtb2R1bGVzPSIke2hlbGxvLm1vZH0sJHtzbWlsZS5tb2R9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iZGVkdXAtaWRlbnRpY2FsIiBkZXBlbmRzPSItam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICBjaGVja0R1cGxpY2F0ZUxlZ2FsPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iLXNpZ24iIGRlcGVuZHM9Ii1zbWlsZSwtbGVnYWwiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJrZXlzdG9yZS5maWxlIiB2YWx1ZT0iJHtvdXRwdXR9L2tleXN0b3JlIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImtleXN0b3JlLmFsaWFzIiB2YWx1ZT0idGVzdCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJrZXlzdG9yZS5wYXNzd29yZCIgdmFsdWU9InN3b3JkZmlzaCIvPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iZXhlY3N1ZmZpeCIgdmFsdWU9Ii5leGUiIGVsc2U9IiI+CisgICAgICA8b3MgZmFtaWx5PSJ3aW5kb3dzIi8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHtqYXZhLmhvbWV9L2Jpbi9rZXl0b29sJHtleGVjc3VmZml4fSIgZmFpbG9uZXJyb3I9InRydWUiPgorICAgICAgPGFyZyB2YWx1ZT0iLWdlbmtleXBhaXIiLz4KKyAgICAgIDxhcmcgdmFsdWU9Ii1rZXlzdG9yZSIvPgorICAgICAgPGFyZyBmaWxlPSIke2tleXN0b3JlLmZpbGV9Ii8+CisgICAgICA8YXJnIHZhbHVlPSItc3RvcmVwYXNzIi8+CisgICAgICA8YXJnIHZhbHVlPSIke2tleXN0b3JlLnBhc3N3b3JkfSIvPgorICAgICAgPGFyZyB2YWx1ZT0iLWtleXBhc3MiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7a2V5c3RvcmUucGFzc3dvcmR9Ii8+CisgICAgICA8YXJnIHZhbHVlPSItYWxpYXMiLz4KKyAgICAgIDxhcmcgdmFsdWU9IiR7a2V5c3RvcmUuYWxpYXN9Ii8+CisgICAgICA8YXJnIHZhbHVlPSItZG5hbWUiLz4KKyAgICAgIDxhcmcgdmFsdWU9IkNOPUFudCBVbml0IFRlc3QsIE9VPUFudCwgTz1BcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgTD1Vbmtub3duLCBTVD1Vbmtub3duLCBDPVVTIi8+CisgICAgPC9leGVjPgorCisgICAgPHNpZ25qYXIgamFyPSIke2hlbGxvLmphcn0iCisgICAgICAgICAgICAga2V5c3RvcmU9IiR7a2V5c3RvcmUuZmlsZX0iCisgICAgICAgICAgICAgYWxpYXM9IiR7a2V5c3RvcmUuYWxpYXN9IgorICAgICAgICAgICAgIHN0b3JlcGFzcz0iJHtrZXlzdG9yZS5wYXNzd29yZH0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJpZ25vcmVzaWduaW5nIiBkZXBlbmRzPSItc2lnbiwtam1vZHMiPgorICAgIDxsaW5rIGRlc3RkaXI9IiR7aW1hZ2V9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtoZWxsby5tb2R9LCR7c21pbGUubW9kfSIKKyAgICAgICAgICBpZ25vcmVTaWduaW5nPSJ0cnVlIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0iYmluZHNlcnZpY2VzIiBkZXBlbmRzPSItZGlycyI+CisgICAgPHByb3BlcnR5IG5hbWU9ImluYy5yb290IiB2YWx1ZT0iJHtpbnB1dH0vaW5jIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLnNyYyIgdmFsdWU9IiR7aW5jLnJvb3R9L3NyYyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmMuY2xhc3NlcyIgdmFsdWU9IiR7aW5jLnJvb3R9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLmphci5kaXIiIHZhbHVlPSIke2luYy5yb290fS9qYXJzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImluYy5qYXIiIHZhbHVlPSIke2luYy5qYXIuZGlyfS9pbmMuamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLm1vZCIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5pbmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLnBrZyIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5pbmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLnBrZy5wYXRoIiB2YWx1ZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGVzdC9pbmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLnBrZy5kaXIiIHZhbHVlPSIke2luYy5zcmN9LyR7aW5jLnBrZy5wYXRofSIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImluYy5tYWluLWNsYXNzIiB2YWx1ZT0iJHtpbmMucGtnfS5JbmNyZW1lbnRlciIvPgorCisgICAgPG1rZGlyIGRpcj0iJHtpbmMucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke2luYy5wa2cuZGlyfS9JbmNyZW1lbnRQcm92aWRlci5qYXZhIj4KK3BhY2thZ2UgJHtpbmMucGtnfTsKKworcHVibGljIGludGVyZmFjZSBJbmNyZW1lbnRQcm92aWRlciB7CisgICAgaW50IGdldEluY3JlbWVudCgpOworfQorICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke2luYy5wa2cuZGlyfS9JbmNyZW1lbnRlci5qYXZhIj4KK3BhY2thZ2UgJHtpbmMucGtnfTsKKworaW1wb3J0IGphdmEudXRpbC5TZXJ2aWNlTG9hZGVyOworCitwdWJsaWMgY2xhc3MgSW5jcmVtZW50ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgZm9yIChJbmNyZW1lbnRQcm92aWRlciBwcm92aWRlciA6IFNlcnZpY2VMb2FkZXIubG9hZChJbmNyZW1lbnRQcm92aWRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgNTsgaSsrKSB7CisgICAgICAgICAgICAgICAgbiArPSBwcm92aWRlci5nZXRJbmNyZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisgICAgPC9lY2hvPgorICAgIDxlY2hvIGZpbGU9IiR7aW5jLnNyY30vbW9kdWxlLWluZm8uamF2YSI+Cittb2R1bGUgJHtpbmMubW9kfSB7CisgICAgZXhwb3J0cyAke2luYy5wa2d9OworICAgIHVzZXMgJHtpbmMucGtnfS5JbmNyZW1lbnRQcm92aWRlcjsKK30KKyAgICA8L2VjaG8+CisKKyAgICA8bWtkaXIgZGlyPSIke2luYy5jbGFzc2VzfSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7aW5jLnNyY30iIGRlc3RkaXI9IiR7aW5jLmNsYXNzZXN9IgorICAgICAgICAgICBpbmNsdWRlQW50UnVudGltZT0iZmFsc2UiIGRlYnVnPSJ0cnVlIi8+CisKKyAgICA8bWtkaXIgZGlyPSIke2luYy5qYXIuZGlyfSIvPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7aW5jLmphcn0iIGJhc2VkaXI9IiR7aW5jLmNsYXNzZXN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0icHJvdmlkZXIucm9vdCIgdmFsdWU9IiR7aW5wdXR9L3Byb3ZpZGVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3ZpZGVyLnNyYyIgdmFsdWU9IiR7cHJvdmlkZXIucm9vdH0vc3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3ZpZGVyLmNsYXNzZXMiIHZhbHVlPSIke3Byb3ZpZGVyLnJvb3R9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvdmlkZXIuamFyLmRpciIgdmFsdWU9IiR7cHJvdmlkZXIucm9vdH0vamFycyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm92aWRlci5qYXIiIHZhbHVlPSIke3Byb3ZpZGVyLmphci5kaXJ9L3Byb3ZpZGVyLmphciIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9InByb3ZpZGVyLm1vZCIgICAgICB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGVzdC5wcm92aWRlciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm92aWRlci5wa2ciICAgICAgdmFsdWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRlc3QucHJvdmlkZXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icHJvdmlkZXIucGtnLnBhdGgiIHZhbHVlPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90ZXN0L3Byb3ZpZGVyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InByb3ZpZGVyLnBrZy5kaXIiIHZhbHVlPSIke3Byb3ZpZGVyLnNyY30vJHtwcm92aWRlci5wa2cucGF0aH0iLz4KKworICAgIDxta2RpciBkaXI9IiR7cHJvdmlkZXIucGtnLmRpcn0iLz4KKyAgICA8ZWNobyBmaWxlPSIke3Byb3ZpZGVyLnBrZy5kaXJ9L0J5VHdvUHJvdmlkZXIuamF2YSI+CitwYWNrYWdlICR7cHJvdmlkZXIucGtnfTsKKworaW1wb3J0ICR7aW5jLnBrZ30uSW5jcmVtZW50UHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBCeVR3b1Byb3ZpZGVyCitpbXBsZW1lbnRzIEluY3JlbWVudFByb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEluY3JlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorfQorICAgIDwvZWNobz4KKyAgICA8ZWNobyBmaWxlPSIke3Byb3ZpZGVyLnNyY30vbW9kdWxlLWluZm8uamF2YSI+Cittb2R1bGUgJHtwcm92aWRlci5tb2R9IHsKKyAgICBleHBvcnRzICR7cHJvdmlkZXIucGtnfTsKKyAgICByZXF1aXJlcyB0cmFuc2l0aXZlICR7aW5jLm1vZH07CisgICAgcHJvdmlkZXMgJHtpbmMucGtnfS5JbmNyZW1lbnRQcm92aWRlciB3aXRoICR7cHJvdmlkZXIucGtnfS5CeVR3b1Byb3ZpZGVyOworfQorICAgIDwvZWNobz4KKworICAgIDxta2RpciBkaXI9IiR7cHJvdmlkZXIuY2xhc3Nlc30iLz4KKyAgICA8amF2YWMgc3JjZGlyPSIke3Byb3ZpZGVyLnNyY30iIGRlc3RkaXI9IiR7cHJvdmlkZXIuY2xhc3Nlc30iCisgICAgICAgICAgIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSIgZGVidWc9InRydWUiCisgICAgICAgICAgIG1vZHVsZXBhdGg9IiR7aW5jLmNsYXNzZXN9Ii8+CisKKyAgICA8bWtkaXIgZGlyPSIke3Byb3ZpZGVyLmphci5kaXJ9Ii8+CisgICAgPGphciBkZXN0ZmlsZT0iJHtwcm92aWRlci5qYXJ9IiBiYXNlZGlyPSIke3Byb3ZpZGVyLmNsYXNzZXN9Ii8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jLmptb2QiIHZhbHVlPSIke2ptb2RzfS9pbmMuam1vZCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm92aWRlci5qbW9kIiB2YWx1ZT0iJHtqbW9kc30vcHJvdmlkZXIuam1vZCIvPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7aW5jLmptb2R9IgorICAgICAgICAgIGNsYXNzcGF0aD0iJHtpbmMuamFyfSIvPgorCisgICAgPGptb2QgZGVzdGZpbGU9IiR7cHJvdmlkZXIuam1vZH0iCisgICAgICAgICAgY2xhc3NwYXRoPSIke3Byb3ZpZGVyLmphcn0iCisgICAgICAgICAgbW9kdWxlcGF0aD0iJHtpbmMuamFyLmRpcn0iLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJpbWFnZTIiIHZhbHVlPSIke291dHB1dH0vaW1hZ2UyIi8+CisKKyAgICA8bGluayBkZXN0ZGlyPSIke2ltYWdlfSIgbW9kdWxlcGF0aD0iJHtqZGttb2RzfSR7am1vZHN9IgorICAgICAgICAgIG1vZHVsZXM9IiR7aW5jLm1vZH0iCisgICAgICAgICAgYmluZFNlcnZpY2VzPSJmYWxzZSIvPgorCisgICAgPGxpbmsgZGVzdGRpcj0iJHtpbWFnZTJ9IiBtb2R1bGVwYXRoPSIke2pka21vZHN9JHtqbW9kc30iCisgICAgICAgICAgbW9kdWxlcz0iJHtpbmMubW9kfSIKKyAgICAgICAgICBiaW5kU2VydmljZXM9InRydWUiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkZmlsZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9sb2FkZmlsZS54bWwKaW5kZXggNjZjOWNlNC4uNGU5N2Q5ZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbG9hZGZpbGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2xvYWRmaWxlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFjcm9kZWYueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFjcm9kZWYueG1sCmluZGV4IGY3YTM1NmYuLmNjNTM5NWUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hY3JvZGVmLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYWNyb2RlZi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21ha2V1cmwueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwKaW5kZXggZGFmZDAwYS4uNzZmNzQzYSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFrZXVybC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0LnhtbAppbmRleCBhZWNhZjk2Li4xMDRhYTFlIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdGNsYXNzcGF0aC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdGNsYXNzcGF0aC54bWwKaW5kZXggZjhhNDc5NS4uZjljMzU2ZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQWxwaGEuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0FscGhhLmphdmEKaW5kZXggOWYwMGE5My4uY2MzODlmYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQWxwaGEuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdGNsYXNzcGF0aC9BbHBoYS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQmV0YS5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgvQmV0YS5qYXZhCmluZGV4IDdmZmVmZmUuLmRjN2ZjNDcgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoL0JldGEuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYW5pZmVzdGNsYXNzcGF0aC9CZXRhLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ta2Rpci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ta2Rpci54bWwKaW5kZXggMWVjYzI3NC4uM2RkMzBlNyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21rZGlyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbW92ZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tb3ZlLnhtbAppbmRleCA4YjRhNmM4Li5lMDk0NzU1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tb3ZlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tb3ZlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbXVsdGltYXAueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbXVsdGltYXAueG1sCmluZGV4IGNlNGIxMjEuLmVkY2ZlNDggMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL211bHRpbWFwLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tdWx0aW1hcC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDggKzIwLDcgQEAKICAgPGltcG9ydCBmaWxlPSIuLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CiAKICAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDxtYXBwZXIgaWQ9InRlc3RtYXBwZXIiCkBAIC0xODgsNSArMTg3LDQgQEAKICAgICA8ZmFpbCB1bmxlc3M9Im1vdmV3aXRoZW1wdHkub3V0Y29tZSI+bW92ZXdpdGhlbXB0eSBmYWlsZWQ8L2ZhaWw+CiAgIDwvdGFyZ2V0PgogCi0KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL25pY2UueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbmljZS54bWwKaW5kZXggZTY3ZWUxOS4uZTgwNWY1YSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbmljZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbmljZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL1RFU1Qtb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyLkp1cGl0ZXJTYW1wbGVUZXN0RmFpbGluZ0JlZm9yZUFsbC50eHQgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9URVNULW9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9URVNULW9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwudHh0CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci5nIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIuZwppbmRleCA5ZjcyNDkzLi45MTJhY2FmIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci5nCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2FudGxyLmcKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2FudGxyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2FudGxyLnhtbAppbmRleCBjMTM2ZDA2Li5kZTRhYmMyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9hbnRsci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvYW50bHIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9leHRlbmRlZC5jYWxjLmcgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9hbnRsci9leHRlbmRlZC5jYWxjLmcKaW5kZXggMDBjMTk5My4uMmVlYzAwOCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvYW50bHIvZXh0ZW5kZWQuY2FsYy5nCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2V4dGVuZGVkLmNhbGMuZwpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2RlcGVuZC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbAppbmRleCA4NDY1YmIwLi4wNGU0MmEyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzMsNiArMzMsMTEgQEAKICAgPHByb3BlcnR5IG5hbWU9InNyYzMuZGlyIiB2YWx1ZT0ic3JjMyIvPgogICA8cHJvcGVydHkgbmFtZT0ic3JjNC5kaXIiIHZhbHVlPSJzcmM0Ii8+CiAgIDxwcm9wZXJ0eSBuYW1lPSJzcmM1LmRpciIgdmFsdWU9InNyYzUiLz4KKyAgPHByb3BlcnR5IG5hbWU9InNyYzYuZGlyIiB2YWx1ZT0ic3JjNiIvPgorCisgIDxjb25kaXRpb24gcHJvcGVydHk9ImF0bGVhc3QuamF2YTkiPgorICAgIDxqYXZhdmVyc2lvbiBhdGxlYXN0PSI5Ii8+CisgIDwvY29uZGl0aW9uPgogCiAgIDx0YXJnZXQgbmFtZT0iaGVscCI+CiAgICAgPGVjaG8+VGhpcyBidWlsZGZpbGUgaXMgdXNlZCBhcyBwYXJ0IG9mIEFudCdzIHRlc3Qgc3VpdGUuPC9lY2hvPgpAQCAtMTkzLDQgKzE5OCwxMCBAQAogICAgIDxkZXBlbmQgc3JjZGlyPSIke3RlbXBzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsb3N1cmU9InllcyIvPgogICAgIDxmaWxlc2V0IGlkPSJyZXN1bHQiIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KICAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0bW9kdWxlaW5mbyIgaWY9IiR7YXRsZWFzdC5qYXZhOX0iPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fS9qYXZhOSIvPgorICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjNi5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0vamF2YTkiIHNvdXJjZT0iOSIgdGFyZ2V0PSI5Ii8+CisgICAgPGRlcGVuZCBzcmNkaXI9IiR7c3JjNi5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0vamF2YTkiLz4KKyAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9BLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9BLmphdmEKaW5kZXggZGM2ZGYyMy4uYmI4ZTllZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQS5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0EuamF2YQpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQi5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQi5qYXZhCmluZGV4IDRiZTUxZjcuLjM0ZGMzMzYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0IuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9CLmphdmEKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0MuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0MuamF2YQppbmRleCBkMmJmY2E5Li4xYzJhYjljIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9DLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvQy5qYXZhCkBAIC02LDcgKzYsNyBAQAogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9ELmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9ELmphdmEKaW5kZXggMTI3ZGU1Ny4uODRiODU3MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvRC5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvRS5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzEvRS5qYXZhCmluZGV4IDBlZmQ2MTMuLjhmYjZkNjkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMxL0UuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMS9FLmphdmEKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMyL0EuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMyL0EuamF2YQppbmRleCAwMmIzNWJlLi5jOTQwMTczIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9BLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzIvQS5qYXZhCkBAIC02LDcgKzYsNyBAQAogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9CLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMi9CLmphdmEKaW5kZXggYmM3YjdkMi4uZmU5ZDIzNCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzIvQi5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMyL0IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzMvQS5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzMvQS5qYXZhCmluZGV4IDFkOTczYjEuLjQ0MGM2YjMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0EuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMy9BLmphdmEKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0IuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmMzL0IuamF2YQppbmRleCBiYzdiN2QyLi5mZTlkMjM0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjMy9CLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzMvQi5qYXZhCkBAIC02LDcgKzYsNyBAQAogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L0NvbnRhaW5zT25seUlubmVyLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L0NvbnRhaW5zT25seUlubmVyLmphdmEKaW5kZXggOTY5NGRkZC4uNjA5NmEyYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9Db250YWluc09ubHlJbm5lci5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvQ29udGFpbnNPbmx5SW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9NZXRob2RQYXJhbS5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9NZXRob2RQYXJhbS5qYXZhCmluZGV4IDI3NmYwMTYuLmNkYTM0MWIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvTWV0aG9kUGFyYW0uamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L01ldGhvZFBhcmFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvT3V0ZXIuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM0L3Rlc3QvT3V0ZXIuamF2YQppbmRleCAwYjcwOTAwLi4zNDg5M2M2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNC90ZXN0L091dGVyLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzQvdGVzdC9PdXRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNS9BLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNS9BLmphdmEKaW5kZXggMTk1MjFhMS4uNmRhZDQzNCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzUvQS5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM1L0EuamF2YQpAQCAtNiw3ICs2LDcgQEAKICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzUvQi5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzUvQi5qYXZhCmluZGV4IGJjN2I3ZDIuLmZlOWQyMzQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM1L0IuamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNS9CLmphdmEKQEAgLTYsNyArNiw3IEBACiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9zcmM2L21vZHVsZS1pbmZvLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNi9tb2R1bGUtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YjI1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNi9tb2R1bGUtaW5mby5qYXZhCkBAIC0wLDAgKzEsNCBAQAorbW9kdWxlIGR1bW15IHsKKyAgICByZXF1aXJlcyBqYXZhLmJhc2U7CisgICAgZXhwb3J0cyBvcmcuZHVtbXk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzYvb3JnLmR1bW15L0Zvby5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL3NyYzYvb3JnLmR1bW15L0Zvby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjhjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvc3JjNi9vcmcuZHVtbXkvRm9vLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKK0xpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCit0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCitUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKK3RoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworcGFja2FnZSBvcmcuZHVtbXk7CisKK3B1YmxpYyBjbGFzcyBGb28geworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmb28iKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZWNob3Byb3BlcnRpZXMucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnByb3BlcnRpZXMKaW5kZXggNGM5NzBlNy4uMGUyNzM2NSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZWNob3Byb3BlcnRpZXMucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9lY2hvcHJvcGVydGllcy5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnhtbAppbmRleCA3YjFiOGJiLi40NDlmMTcxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9lY2hvcHJvcGVydGllcy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvZWNob3Byb3BlcnRpZXMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS9pbnB1dC9yZXNvdXJjZXNfZ2VyX0RFLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS9pbnB1dC9yZXNvdXJjZXNfZ2VyX0RFLnByb3BlcnRpZXMKaW5kZXggN2VmZTliMC4uOTI1NzhkZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUvaW5wdXQvcmVzb3VyY2VzX2dlcl9ERS5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL2lucHV0L3Jlc291cmNlc19nZXJfREUucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS90cmFuc2xhdGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi90cmFuc2xhdGUvdHJhbnNsYXRlLnhtbAppbmRleCBlNmRlYmQ1Li5kMmM4MDdhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pMThuL3RyYW5zbGF0ZS90cmFuc2xhdGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vdHJhbnNsYXRlL3RyYW5zbGF0ZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL2ltYWdlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL2ltYWdlLnhtbAppbmRleCAyZmVmYTA0Li5kOTRhNjlkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9pbWFnZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvaW1hZ2UueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw0NyArMjMsNDggQEAKICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CiAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CiAgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIvPgorICAgIDxhdmFpbGFibGUgY2xhc3NuYW1lPSJjb20uc3VuLmltYWdlLmNvZGVjLmpwZWcuSlBFR0NvZGVjIiBwcm9wZXJ0eT0ianBlZy5jb2RlYy5hdmFpbGFibGUiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJ0ZXN0U2ltcGxlU2NhbGUiPgogICA8L3RhcmdldD4KIAogICA8IS0tIHRoaXMgc2hvdWxkIHByb2R1Y2UgYSBzaW5nbGUgZmlsZSBpbiB0aGUgZGVzdCBkaXIgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdFNpbXBsZVNjYWxlIiBkZXBlbmRzPSJzZXRVcCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdFNpbXBsZVNjYWxlIiBkZXBlbmRzPSJzZXRVcCIgaWY9ImpwZWcuY29kZWMuYXZhaWxhYmxlIj4KICAgICA8aW1hZ2UgaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7b3V0cHV0fSIgb3ZlcndyaXRlPSJubyIgZmFpbG9uZXJyb3I9Im5vIj4KICAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KICAgICA8L2ltYWdlPgogICA8L3RhcmdldD4KIAogICA8IS0tIHRoaXMgc2hvdWxkIHB1dCBzb21lIHRleHQgaW4gdGhlIGxvZyAtLT4KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1RvTG9nIiBkZXBlbmRzPSJzZXRVcCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdEVjaG9Ub0xvZyIgZGVwZW5kcz0ic2V0VXAiIGlmPSJqcGVnLmNvZGVjLmF2YWlsYWJsZSI+CiAgICAgPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0iIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJubyI+CiAgICAgICA8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CiAgICAgPC9pbWFnZT4KICAgPC90YXJnZXQ+CiAKICAgPCEtLSB0aGlzIHNob3VsZCBwcm9kdWNlIGEgc2luZ2xlIGZpbGUgaW4gdGhlIGRlc3QgZGlyIC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsT25FcnJvciIgZGVwZW5kcz0ic2V0VXAiPgorICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsT25FcnJvciIgZGVwZW5kcz0ic2V0VXAiIGlmPSJqcGVnLmNvZGVjLmF2YWlsYWJsZSI+CiAgICAgPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0iIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJ5ZXMiPgogICAgICAgPHNjYWxlIHdpZHRoPSIzMDAiIHByb3BvcnRpb25zPSJ3aWR0aCIvPgogICAgIDwvaW1hZ2U+CiAgIDwvdGFyZ2V0PgogCiAgIDwhLS0gdGhpcyBzaG91bGQgcHJvZHVjZSBhIHNpbmdsZSBmaWxlIGluIHRoZSBkZXN0IGRpciwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGZpbGUgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdE92ZXJ3cml0ZVRydWUiIGRlcGVuZHM9InNldFVwIj4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3ZlcndyaXRlVHJ1ZSIgZGVwZW5kcz0ic2V0VXAiIGlmPSJqcGVnLmNvZGVjLmF2YWlsYWJsZSI+CiAgICAgPGltYWdlIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0iIG92ZXJ3cml0ZT0idHJ1ZSIgZmFpbG9uZXJyb3I9Im5vIj4KICAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KICAgICA8L2ltYWdlPgogICA8L3RhcmdldD4KIAogICA8IS0tIHRoaXMgc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGZpbGUgLS0+Ci0gIDx0YXJnZXQgbmFtZT0idGVzdE92ZXJ3cml0ZUZhbHNlIiBkZXBlbmRzPSJzZXRVcCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdE92ZXJ3cml0ZUZhbHNlIiBkZXBlbmRzPSJzZXRVcCIgaWY9ImpwZWcuY29kZWMuYXZhaWxhYmxlIj4KICAgICA8aW1hZ2UgaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7b3V0cHV0fSIgb3ZlcndyaXRlPSJmYWxzZSIgZmFpbG9uZXJyb3I9Im5vIj4KICAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KICAgICA8L2ltYWdlPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InRlc3RTaW1wbGVTY2FsZVdpdGhNYXBwZXIiIGRlcGVuZHM9InNldFVwIj4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2ltcGxlU2NhbGVXaXRoTWFwcGVyIiBkZXBlbmRzPSJzZXRVcCIgaWY9ImpwZWcuY29kZWMuYXZhaWxhYmxlIj4KICAgICA8aW1hZ2UgaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iCiAgICAgICAgICAgIGRlc3RkaXI9IiR7b3V0cHV0fSIgb3ZlcndyaXRlPSJubyIgZmFpbG9uZXJyb3I9Im5vIj4KICAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL2ltYWdlaW8ueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvaW1hZ2Vpby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0MmRmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL2ltYWdlaW8ueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPHByb2plY3QgbmFtZT0iaW1hZ2UtdGVzdCIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLiI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi8uLi8uLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CisKKyAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIGxvY2F0aW9uPSIke2Jhc2VkaXJ9L3NyYyIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9InRlc3RTaW1wbGVTY2FsZSIvPgorCisgIDwhLS0gdGhpcyBzaG91bGQgcHJvZHVjZSBhIHNpbmdsZSBmaWxlIGluIHRoZSBkZXN0IGRpciAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0U2ltcGxlU2NhbGUiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8aW1hZ2VpbyBpbmNsdWRlcz0iKi5qcGciIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtvdXRwdXR9IgorICAgICAgICAgICAgIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJubyI+CisgICAgICA8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisgICAgPC9pbWFnZWlvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgc2hvdWxkIHB1dCBzb21lIHRleHQgaW4gdGhlIGxvZyAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RWNob1RvTG9nIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGltYWdlaW8gaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7b3V0cHV0fSIKKyAgICAgICAgICAgICBvdmVyd3JpdGU9Im5vIiBmYWlsb25lcnJvcj0ibm8iPgorICAgICAgPHNjYWxlIHdpZHRoPSIzMDAiIHByb3BvcnRpb25zPSJ3aWR0aCIvPgorICAgIDwvaW1hZ2Vpbz4KKyAgPC90YXJnZXQ+CisKKyAgPCEtLSB0aGlzIHNob3VsZCBwcm9kdWNlIGEgc2luZ2xlIGZpbGUgaW4gdGhlIGRlc3QgZGlyIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsT25FcnJvciIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxpbWFnZWlvIGluY2x1ZGVzPSIqLmpwZyIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke291dHB1dH0iCisgICAgICAgICAgICAgb3ZlcndyaXRlPSJubyIgZmFpbG9uZXJyb3I9InllcyI+CisgICAgICA8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisgICAgPC9pbWFnZWlvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgc2hvdWxkIHByb2R1Y2UgYSBzaW5nbGUgZmlsZSBpbiB0aGUgZGVzdCBkaXIsIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBmaWxlIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3RPdmVyd3JpdGVUcnVlIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGltYWdlaW8gaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7b3V0cHV0fSIKKyAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyIgZmFpbG9uZXJyb3I9Im5vIj4KKyAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KKyAgICA8L2ltYWdlaW8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGhpcyBzaG91bGQgcHJvZHVjZSBhIHNpbmdsZSBmaWxlIGluIHRoZSBkZXN0IGRpciwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGZpbGUgLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdERyYXdPdmVyd3JpdGVUcnVlIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGltYWdlaW8gaW5jbHVkZXM9IiouanBnIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7b3V0cHV0fSIKKyAgICAgICAgICAgICBvdmVyd3JpdGU9InllcyIgZmFpbG9uZXJyb3I9Im5vIj4KKyAgICAgIDxzY2FsZSB3aWR0aD0iMzAwIiBwcm9wb3J0aW9ucz0id2lkdGgiLz4KKyAgICAgIDxkcmF3IHhsb2M9IjEwIiB5bG9jPSIxMCI+CisgICAgICAgIDxyZWN0YW5nbGUgaGVpZ2h0PSI1MCIgd2lkdGg9IjUwIiBzdHJva2V3aWR0aD0iMiIvPgorICAgICAgICA8dGV4dCBzdHJpbmc9IlRlc3QiLz4KKyAgICAgIDwvZHJhdz4KKyAgICA8L2ltYWdlaW8+CisgIDwvdGFyZ2V0PgorCisgIDwhLS0gdGhpcyBzaG91bGQgbm90IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZmlsZSAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3ZlcndyaXRlRmFsc2UiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8aW1hZ2VpbyBpbmNsdWRlcz0iKi5qcGciIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtvdXRwdXR9IgorICAgICAgICAgICAgIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJubyI+CisgICAgICA8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisgICAgPC9pbWFnZWlvPgorICA8L3RhcmdldD4KKworICA8IS0tIHRoaXMgdGVzdHMgYSBzcGVjaWFsIGNhc2Ugb2Ygcm90YXRpb24gLS0+CisgIDx0YXJnZXQgbmFtZT0idGVzdEZsaXAiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8aW1hZ2VpbyBpbmNsdWRlcz0iKi5qcGciIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtvdXRwdXR9IgorICAgICAgICAgICAgIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJubyI+CisgICAgICA8cm90YXRlIGFuZ2xlPSItMTgwIi8+CisgICAgPC9pbWFnZWlvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RTaW1wbGVTY2FsZVdpdGhNYXBwZXIiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8aW1hZ2VpbyBpbmNsdWRlcz0iKi5qcGciIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtvdXRwdXR9IgorICAgICAgICAgICAgIG92ZXJ3cml0ZT0ibm8iIGZhaWxvbmVycm9yPSJubyI+CisgICAgICA8c2NhbGUgd2lkdGg9IjMwMCIgcHJvcG9ydGlvbnM9IndpZHRoIi8+CisgICAgICA8Z2xvYm1hcHBlciBmcm9tPSIqIiB0bz0ic2NhbGVkLSoiLz4KKyAgICA8L2ltYWdlaW8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvYnVpbGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvYnVpbGQueG1sCmluZGV4IGVhNzBiOWUuLmVjMTUwNjMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9idWlsZC54bWwKQEAgLTgsNyArOCw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL2lucHV0L29yZy9leGFtcGxlL0Zvby5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvaW5wdXQvb3JnL2V4YW1wbGUvRm9vLmphdmEKaW5kZXggNTlkMDNmNy4uNjBhZDlhMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvaW5wdXQvb3JnL2V4YW1wbGUvRm9vLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvaW5wdXQvb3JnL2V4YW1wbGUvRm9vLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL2pkZXBlbmQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9qZGVwZW5kLnhtbAppbmRleCA4NDE4MjI2Li41NGJkZTQ0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL2pkZXBlbmQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvamRlcGVuZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE2LDE5ICsxNiwxNyBAQAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogPHByb2plY3Q+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0Y2xhc3NlcyIgbG9jYXRpb249Ii4uLy4uLy4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIvPgotICAKICAgPHBhdGggaWQ9ImFsbC10ZXN0LWNsYXNzZXMuaWQiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3RzLnZhbHVlfSIvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDxwYXRoIGlkPSJleGFtcGxlLWNsYXNzZXMuaWQiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2xhc3Nlc30vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUiIC8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3RzLnZhbHVlfS9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZSIvPgogICA8L3BhdGg+CiAKICAgPHBhdGggaWQ9InRlc3QtY2xhc3Nlcy5pZCI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3Rlc3RjbGFzc2VzfSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHMudmFsdWV9Ii8+CiAgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9InNpbXBsZSI+CkBAIC02Niw1ICs2NCw0IEBACiAgICAgICA8Y2xhc3Nlc3BhdGggcmVmaWQ9ImV4YW1wbGUtY2xhc3Nlcy5pZCIvPgogICAgIDwvamRlcGVuZD4KICAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvMW52YWxpZC1jbGFzc25hbWUuanNwIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwLzFudmFsaWQtY2xhc3NuYW1lLmpzcAppbmRleCBmNWI0MmUyLi4zY2RmOGI4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvMW52YWxpZC1jbGFzc25hbWUuanNwCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC8xbnZhbGlkLWNsYXNzbmFtZS5qc3AKQEAgLTYsNyArNiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XRUItSU5GL3dlYi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvV0VCLUlORi93ZWIueG1sCmluZGV4IDJlZjE5OWQuLjBiODZiMjEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XRUItSU5GL3dlYi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dFQi1JTkYvd2ViLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL2RlZmF1bHQuanNwIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL2RlZmF1bHQuanNwCmluZGV4IGM3Mjk2YjIuLjQ1N2M2N2EgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9kZWZhdWx0LmpzcAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvZGVmYXVsdC5qc3AKQEAgLTYsNyArNiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9taXNzaW5nX3RsZC5qc3AgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvbWlzc2luZ190bGQuanNwCmluZGV4IGI4MzdmYjEuLjE4NjA2YTkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9taXNzaW5nX3RsZC5qc3AKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL21pc3NpbmdfdGxkLmpzcApAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3NpbXBsZS5qc3AgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3Avc2ltcGxlLmpzcAppbmRleCBjNzI5NmIyLi40NTdjNjdhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3Avc2ltcGxlLmpzcAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3Avc2ltcGxlLmpzcApAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3VyaXJvb3QuanNwIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3VyaXJvb3QuanNwCmluZGV4IGM3Mjk2YjIuLjQ1N2M2N2EgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC91cmlyb290LmpzcAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qc3AvdXJpcm9vdC5qc3AKQEAgLTYsNyArNiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcC94bWwuanNwIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3htbC5qc3AKaW5kZXggN2JiOWU0OS4uNTkxNDVmNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3htbC5qc3AKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwL3htbC5qc3AKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcGMueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwYy54bWwKaW5kZXggZjEyMDc5MC4uNDhiNzYxZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwYy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanNwYy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LnhtbAppbmRleCAzNGQ4Y2IyLi5jNGU1N2Q2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw4NSArMjAsODUgQEAKICAgPGltcG9ydCBmaWxlPSIuLi8uLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CiAKICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+Ci0gICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgogICA8L3RhcmdldD4KIAotICA8cHJvcGVydHkgbmFtZT0ic2hvd291dHB1dCIgdmFsdWU9ImZhbHNlIiAvPgorICA8cHJvcGVydHkgbmFtZT0ic2hvd291dHB1dCIgdmFsdWU9ImZhbHNlIi8+CisKICAgPHBhdGggaWQ9InRlc3QiPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC50ZXN0cy52YWx1ZX0iLz4KICAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdEZvcmtlZE91dHB1dCI+CiAgICAgPGp1bml0IGZvcms9InllcyIgaGFsdG9uZXJyb3I9InRydWUiIGhhbHRvbmZhaWx1cmU9InRydWUiIAogICAgICAgICAgICBzaG93b3V0cHV0PSIke3Nob3dvdXRwdXR9Ij4KLSAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0Lk91dHB1dCIgLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5PdXRwdXQiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KICAgICA8L2p1bml0PgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3ROb25Gb3JrZWRPdXRwdXQiPgogICAgIDxqdW5pdCBmb3JrPSJmYWxzZSIgaGFsdG9uZXJyb3I9InRydWUiIGhhbHRvbmZhaWx1cmU9InRydWUiCiAgICAgICAgICAgIHNob3dvdXRwdXQ9IiR7c2hvd291dHB1dH0iPgotICAgICAgPHRlc3QgbmFtZT0ib3JnLmV4YW1wbGUuanVuaXQuT3V0cHV0IiAvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIgLz4KKyAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0Lk91dHB1dCIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgIDwvanVuaXQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdEZvcmtlZFRocmVhZGVkT3V0cHV0Ij4KICAgICA8anVuaXQgZm9yaz0ieWVzIiBoYWx0b25lcnJvcj0idHJ1ZSIgaGFsdG9uZmFpbHVyZT0idHJ1ZSIKICAgICAgICAgICAgc2hvd291dHB1dD0iJHtzaG93b3V0cHV0fSI+Ci0gICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5UaHJlYWRlZE91dHB1dCIgLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5UaHJlYWRlZE91dHB1dCIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgIDwvanVuaXQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdE5vbkZvcmtlZFRocmVhZGVkT3V0cHV0Ij4KICAgICA8anVuaXQgZm9yaz0iZmFsc2UiIGhhbHRvbmVycm9yPSJ0cnVlIiBoYWx0b25mYWlsdXJlPSJ0cnVlIgogICAgICAgICAgICBzaG93b3V0cHV0PSIke3Nob3dvdXRwdXR9Ij4KLSAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0LlRocmVhZGVkT3V0cHV0IiAvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIgLz4KKyAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0LlRocmVhZGVkT3V0cHV0Ii8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Ii8+CiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJvdXRwdXRUZXN0cyIgCi0gICAgICAgICAgZGVwZW5kcz0idGVzdEZvcmtlZE91dHB1dCx0ZXN0Tm9uRm9ya2VkT3V0cHV0LHRlc3RGb3JrZWRUaHJlYWRlZE91dHB1dCx0ZXN0Tm9uRm9ya2VkVGhyZWFkZWRPdXRwdXQiIC8+CisgICAgICAgICAgZGVwZW5kcz0idGVzdEZvcmtlZE91dHB1dCx0ZXN0Tm9uRm9ya2VkT3V0cHV0LHRlc3RGb3JrZWRUaHJlYWRlZE91dHB1dCx0ZXN0Tm9uRm9ya2VkVGhyZWFkZWRPdXRwdXQiLz4KIAogICA8dGFyZ2V0IG5hbWU9ImNyYXNoIj4KICAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZXJyb3Jwcm9wZXJ0eT0iY3Jhc2hlZCI+CiAgICAgICA8dGVzdCBuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5WbUNyYXNoIi8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgIDwvanVuaXQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0ibm9jcmFzaCI+CiAgICAgPGp1bml0IGZvcms9InRydWUiIGVycm9ycHJvcGVydHk9ImNyYXNoZWQiPgogICAgICAgPHRlc3QgbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuTm9WbUNyYXNoIi8+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0IiAvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgIDwvanVuaXQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGltZW91dCI+CiAgICAgPGp1bml0IGZvcms9InRydWUiIGVycm9ycHJvcGVydHk9InRpbWVvdXQiIHRpbWVvdXQ9IjEwMDAiPgogICAgICAgPHRlc3QgbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuU2xlZXBlciIvPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIgLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KICAgICA8L2p1bml0PgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9Im5vdGltZW91dCI+CiAgICAgPGp1bml0IGZvcms9InRydWUiIGVycm9ycHJvcGVydHk9InRpbWVvdXQiIHRpbWVvdXQ9IjE1MDAwIj4KICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlNsZWVwZXIiLz4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiIC8+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Ii8+CiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJjYXB0dXJlIiBkZXBlbmRzPSJzZXRVcCI+CiAgICAgPHByb3BlcnR5IG5hbWU9ImZvcmsiIHZhbHVlPSJmYWxzZSIvPgogICAgIDxqdW5pdCBmb3JrPSIke2Zvcmt9Ij4KLSAgICAgIDx0ZXN0Ci0gICAgICAgIG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlByaW50ZXIiCi0gICAgICAgIHRvZGlyPSIke291dHB1dH0iCi0gICAgICAgIG91dGZpbGU9InRlc3Rsb2ciLz4KKyAgICAgIDx0ZXN0IG5hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlByaW50ZXIiCisgICAgICAgICAgICB0b2Rpcj0iJHtvdXRwdXR9IgorICAgICAgICAgICAgb3V0ZmlsZT0idGVzdGxvZyIvPgogICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIvPgogICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgIDwvanVuaXQ+CkBAIC0xMjAsOCArMTIwLDcgQEAKICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KICAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7b3V0cHV0fSI+CiAgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vdGVzdHMvanVuaXQiPgotICAgICAgICAgIDxpbmNsdWRlCi0gICAgICAgICAgICBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvKlRlc3QuamF2YSIvPgogICAgICAgICAgIDwhLS0gdGVzdHMgcmVtb3ZlIG91dC1kaXIgb24gdGVhckRvd24gLS0+CiAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovSlVuaXRUZXN0TGlzdGVuZXJUZXN0LmphdmEiLz4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFRhc2tUZXN0LmphdmEiLz4KQEAgLTEzOSw4ICsxMzgsNyBAQAogICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHtvdXRwdXR9Ij4KICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+Ci0gICAgICAgICAgPGluY2x1ZGUKLSAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LypUZXN0LmphdmEiLz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qVGVzdC5qYXZhIi8+CiAgICAgICAgICAgPCEtLSB0ZXN0cyByZW1vdmUgb3V0LWRpciBvbiB0ZWFyRG93biAtLT4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFRlc3RMaXN0ZW5lclRlc3QuamF2YSIvPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0pVbml0VGFza1Rlc3QuamF2YSIvPgpAQCAtMTU0LDEyICsxNTIsMTEgQEAKICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KICAgICA8anVuaXQgZm9yaz0idHJ1ZSIgZm9ya21vZGU9Im9uY2UiPgogICAgICAgPGZvcm1hdHRlciBleHRlbnNpb249ImZvbyIKLSAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5UZXN0Rm9ybWF0dGVyIi8+CisgICAgICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuVGVzdEZvcm1hdHRlciIvPgogICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgogICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHtvdXRwdXR9Ij4KICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+Ci0gICAgICAgICAgPGluY2x1ZGUKLSAgICAgICAgICAgIG5hbWU9Im9yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0LypUZXN0LmphdmEiLz4KKyAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC8qVGVzdC5qYXZhIi8+CiAgICAgICAgICAgPCEtLSB0ZXN0cyByZW1vdmUgb3V0LWRpciBvbiB0ZWFyRG93biAtLT4KICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9KVW5pdFRlc3RMaXN0ZW5lclRlc3QuamF2YSIvPgogICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0pVbml0VGFza1Rlc3QuamF2YSIvPgpAQCAtMjQ0LDggKzI0MSw3IEBACiAgICAgPGFudCB0YXJnZXQ9ImZhaWx1cmVSZWNvcmRlci5pbnRlcm5hbCIKICAgICAgICAgIGFudGZpbGU9Imp1bml0LnhtbCIgCiAgICAgICAgICBpbmhlcml0QWxsPSJmYWxzZSIKLSAgICAgICAgIGluaGVyaXRSZWZzPSJmYWxzZSIgCi0gICAgLz4KKyAgICAgICAgIGluaGVyaXRSZWZzPSJmYWxzZSIvPgogICA8L3RhcmdldD4KICAgCiAgIDx0YXJnZXQgbmFtZT0iZmFpbHVyZVJlY29yZGVyLmZpeGluZyI+CkBAIC0yODEsNDcgKzI3Nyw0NiBAQAogICA8dGFyZ2V0IG5hbWU9InRlc3RTa2lwcGFibGVUZXN0cyI+CiAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CiAgICAgPGp1bml0PgotICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KLSAgICAgICAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7b3V0cHV0fSI+Ci0gICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9leGFtcGxlL2p1bml0L0pVbml0NFNraXBwYWJsZS5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdHMgcmVtb3ZlIG91dC1kaXIgb24gdGVhckRvd24gLS0+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgorICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHtvdXRwdXR9Ij4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvSlVuaXQ0U2tpcHBhYmxlLmphdmEiLz4KKyAgICAgICAgICA8IS0tIHRlc3RzIHJlbW92ZSBvdXQtZGlyIG9uIHRlYXJEb3duIC0tPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L2JhdGNodGVzdD4KICAgICA8L2p1bml0PgogICA8L3RhcmdldD4KIAotCiAgIDwhLS0gU2tpcHBpbmcgY2xhc3NlcyB0aGF0IGFyZSBub3QgdGVzdHMgLS0+CiAgIDx0YXJnZXQgbmFtZT0idGVzdE5vblRlc3RzIj4KICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KLSAgICAgICAgPGp1bml0PgotICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KLSAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KLSAgICAgICAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7b3V0cHV0fSIgc2tpcE5vblRlc3RzPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uLy4uL3Rlc3RzL2p1bml0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvKk1pc3NlZC5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdHMgcmVtb3ZlIG91dC1kaXIgb24gdGVhckRvd24gLS0+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgPGp1bml0PgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7b3V0cHV0fSIgc2tpcE5vblRlc3RzPSJ0cnVlIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi90ZXN0cy9qdW5pdCI+CisgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvKk1pc3NlZC5qYXZhIi8+CisgICAgICAgICAgPCEtLSB0ZXN0cyByZW1vdmUgb3V0LWRpciBvbiB0ZWFyRG93biAtLT4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9iYXRjaHRlc3Q+CiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CiAKLSAgICA8IS0tIE5vdCBza2lwcGluZyBjbGFzc2VzIHRoYXQgYXJlIG5vdCB0ZXN0cyAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3ROb25UZXN0c1J1biI+Ci0gICAgICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgotICAgICAgICA8anVuaXQ+Ci0gICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgotICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdCIvPgotICAgICAgICAgICAgPGJhdGNodGVzdCB0b2Rpcj0iJHtvdXRwdXR9IiBza2lwTm9uVGVzdHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uLy4uL3Rlc3RzL2p1bml0Ij4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvKk1pc3NlZC5qYXZhIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwhLS0gdGVzdHMgcmVtb3ZlIG91dC1kaXIgb24gdGVhckRvd24gLS0+Ci0gICAgICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICAgICAgPC9iYXRjaHRlc3Q+Ci0gICAgICAgIDwvanVuaXQ+Ci0gICAgPC90YXJnZXQ+CisgIDwhLS0gTm90IHNraXBwaW5nIGNsYXNzZXMgdGhhdCBhcmUgbm90IHRlc3RzIC0tPgorICA8dGFyZ2V0IG5hbWU9InRlc3ROb25UZXN0c1J1biI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPGp1bml0PgorICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QiLz4KKyAgICAgIDxiYXRjaHRlc3QgdG9kaXI9IiR7b3V0cHV0fSIgc2tpcE5vblRlc3RzPSJmYWxzZSI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vdGVzdHMvanVuaXQiPgorICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9yZy9leGFtcGxlL2p1bml0LypNaXNzZWQuamF2YSIvPgorICAgICAgICAgIDwhLS0gdGVzdHMgcmVtb3ZlIG91dC1kaXIgb24gdGVhckRvd24gLS0+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvYmF0Y2h0ZXN0PgorICAgIDwvanVuaXQ+CisgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFRlc3RNZXRob2RzIiA+CiAgICAgPHByb3BlcnR5IG5hbWU9InRtcC5kaXIiIHZhbHVlPSIke291dHB1dH0iLz4KQEAgLTMzOSwzNiArMzM0LDMxIEBACiAgICAgICBwdWJsaWMgdm9pZCBiYWQoKSB7CiAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmFpbGVkIik7fQogICAgICAgfTwvZWNobz4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjYrIiBjbGFzc25hbWU9ImphdmEubmV0LkNvb2tpZVN0b3JlIi8+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic291cmNlIiB2YWx1ZT0iNiI+Ci0gICAgICA8aXNzZXQgcHJvcGVydHk9ImpkazEuNisiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlIiB2YWx1ZT0iNSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UiIHZhbHVlPSI4Ii8+CiAgICAgPGphdmFjIHNyY2Rpcj0iJHt0bXAuZGlyfSIgZGVzdGRpcj0iJHt0bXAuZGlyfSIgaW5jbHVkZXM9IlQxLmphdmEsVDIuamF2YSIKICAgICAgICAgICAgc291cmNlPSIke3NvdXJjZX0iPgotCiAgICAgPC9qYXZhYz4KICAgICA8anVuaXQgZm9yaz0iZmFsc2UiIHByaW50c3VtbWFyeT0idHJ1ZSIgaGFsdG9uZXJyb3I9InRydWUiPgogICAgICAgPGNsYXNzcGF0aD4KLSAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RtcC5kaXJ9IiAvPgotICAgICAgICA8cGF0aCByZWZpZD0idGVzdCIgLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke3RtcC5kaXJ9Ii8+CisgICAgICAgIDxwYXRoIHJlZmlkPSJ0ZXN0Ii8+CiAgICAgICA8L2NsYXNzcGF0aD4KLSAgICAgIDx0ZXN0IG5hbWU9IlQxIiBtZXRob2RzPSJ0ZXN0T0siIC8+Ci0gICAgICA8dGVzdCBuYW1lPSJUMiIgbWV0aG9kcz0ib2siIC8+CisgICAgICA8dGVzdCBuYW1lPSJUMSIgbWV0aG9kcz0idGVzdE9LIi8+CisgICAgICA8dGVzdCBuYW1lPSJUMiIgbWV0aG9kcz0ib2siLz4KICAgICA8L2p1bml0PgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3RDaGVja0ZvcmtlZFBhdGgiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlYW50cnVudGltZSIgdmFsdWU9InllcyIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZWFudHJ1bnRpbWUiIHZhbHVlPSJ5ZXMiLz4KICAgICA8IS0tIGR1cGxpY2F0ZSB0aGUgQW50IGNsYXNzZXMgaW50byBhIGphciAtLT4KLSAgICA8amFyIGRlc3RmaWxlPSIke291dHB1dH0vYW50LmphciIgYmFzZWRpcj0iJHthbnRjbGFzc2VzfSIgLz4KKyAgICA8amFyIGRlc3RmaWxlPSIke291dHB1dH0vYW50LmphciIgYmFzZWRpcj0iJHthbnRjbGFzc2VzfSIvPgogICAgIDxqdW5pdCBmb3JrPSJ5ZXMiIGhhbHRvbmVycm9yPSJ0cnVlIiBoYWx0b25mYWlsdXJlPSJ0cnVlIgotICAgICAgICAgICAgIHNob3dvdXRwdXQ9IiR7c2hvd291dHB1dH0iIGluY2x1ZGVhbnRydW50aW1lPSIke2luY2x1ZGVhbnRydW50aW1lfSI+Ci0gICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5PdXRwdXQiIC8+CisgICAgICAgICAgIHNob3dvdXRwdXQ9IiR7c2hvd291dHB1dH0iIGluY2x1ZGVhbnRydW50aW1lPSIke2luY2x1ZGVhbnRydW50aW1lfSI+CisgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdC5PdXRwdXQiLz4KICAgICAgIDxjbGFzc3BhdGg+Ci0gICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7anVuaXRqYXJ9IiAvPgotICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7b3V0cHV0fS9hbnQuamFyIiAvPgorICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YnVpbGQudGVzdHMudmFsdWV9Ii8+CisgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqdW5pdGphcn0iLz4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke291dHB1dH0vYW50LmphciIvPgogICAgICAgPC9jbGFzc3BhdGg+CiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9jZGF0YW91dHB1dC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9jZGF0YW91dHB1dC54bWwKaW5kZXggYWI1NDA5Yi4uYTk5NDAxZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvY2RhdGFvdXRwdXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2NkYXRhb3V0cHV0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvbWF0Y2hlcy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9tYXRjaGVzLnhtbAppbmRleCAyNDUxY2Y4Li43NDE4NTYxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9tYXRjaGVzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9tYXRjaGVzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvdGVhcmRvd25saXN0ZW5lci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC90ZWFyZG93bmxpc3RlbmVyLnhtbAppbmRleCBhYmI2YTQxLi44M2ZlMGU0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC90ZWFyZG93bmxpc3RlbmVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC90ZWFyZG93bmxpc3RlbmVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTUgKzE4LDE1IEBACiA8cHJvamVjdD4KIAogICA8cGF0aCBpZD0idGVzdCI+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CisgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLnRlc3RzLnZhbHVlfSIvPgogICA8L3BhdGg+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9UZWFyZG93biI+CiAgICAgPGp1bml0IGhhbHRvbmVycm9yPSJmYWxzZSIgZXJyb3Jwcm9wZXJ0eT0iZXJyb3IiIGZvcms9InRydWUiIHRpbWVvdXQ9IjEwMDAiPgogICAgICAgPGZvcm1hdHRlciB0eXBlPSJwbGFpbiIgdXNlZmlsZT0iZmFsc2UiLz4KICAgICAgIDxiYXRjaHRlc3Q+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLnRlc3RzLnZhbHVlfSI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvVGltZW91dCoiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9iYXRjaHRlc3Q+CkBAIC00MCwxMSArNDAsMTIgQEAKICAgICAgIDxmb3JtYXR0ZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5UZWFyRG93bk9uVm1DcmFzaCIKICAgICAgICAgICAgICAgICAgdXNlZmlsZT0iZmFsc2UiLz4KICAgICAgIDxiYXRjaHRlc3Q+Ci0gICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLnRlc3RzLnZhbHVlfSI+CiAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXQvVGltZW91dCoiLz4KICAgICAgICAgPC9maWxlc2V0PgogICAgICAgPC9iYXRjaHRlc3Q+CiAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Ii8+CiAgICAgPC9qdW5pdD4KICAgPC90YXJnZXQ+CisKIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2ZGRjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIueG1sCkBAIC0wLDAgKzEsMzc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9qZWN0IG5hbWU9Imp1bml0bGF1bmNoZXItdGVzdCIgYmFzZWRpcj0iLiI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LmRpciIgbG9jYXRpb249IiR7amF2YS5pby50bXBkaXJ9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC50ZXN0cy52YWx1ZX0iLz4KKyAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dC5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8cGF0aCBpZD0ianVuaXQucGxhdGZvcm0uY2xhc3NwYXRoIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIuLi8uLi8uLi8uLi8uLi9saWIvb3B0aW9uYWwiIGluY2x1ZGVzPSJqdW5pdC1wbGF0Zm9ybSouamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPHBhdGggaWQ9Imp1bml0LmVuZ2luZS52aW50YWdlLmNsYXNzcGF0aCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vLi4vbGliL29wdGlvbmFsIiBpbmNsdWRlcz0ianVuaXQtdmludGFnZS1lbmdpbmUqLmphciIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uLy4uLy4uL2xpYi9vcHRpb25hbCIgaW5jbHVkZXM9Imp1bml0LSouamFyIi8+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iLi4vLi4vLi4vLi4vLi4vbGliL29wdGlvbmFsIiBpbmNsdWRlcz0iaGFtY3Jlc3QqLmphciIvPgorICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uLy4uLy4uL2xpYi9vcHRpb25hbCIgaW5jbHVkZXM9Im9wZW50ZXN0NGoqLmphciIvPgorICAgIDwvcGF0aD4KKworICAgIDxwYXRoIGlkPSJqdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGgiPgorICAgICAgICA8ZmlsZXNldCBkaXI9Ii4uLy4uLy4uLy4uLy4uL2xpYi9vcHRpb25hbCI+CisgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJqdW5pdC1qdXBpdGVyKi5qYXIiLz4KKyAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Im9wZW50ZXN0NGoqLmphciIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgPC9wYXRoPgorCisgICAgPHBhdGggaWQ9InRlc3QuY2xhc3NwYXRoIj4KKyAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgorICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuZW5naW5lLnZpbnRhZ2UuY2xhc3NwYXRoIi8+CisgICAgICAgIDxwYXRoIHJlZmlkPSJqdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGgiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtZmFpbHVyZS1zdG9wcy1idWlsZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcj0iJHtvdXRwdXQuZGlyfSIKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWxlPSIke3Rlc3QtZmFpbHVyZS1zdG9wcy1idWlsZC50cmFja2VyfSIKKyAgICAgICAgICAgICAgICAgICAgICBpZj0idGVzdC1mYWlsdXJlLXN0b3BzLWJ1aWxkLnRyYWNrZXIiLz4KKworICAgICAgICAgICAgPCEtLSBBIHNwZWNpZmljIHRlc3QgbWVhbnQgdG8gZmFpbCAtLT4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZS5BbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCIgaGFsdE9uRmFpbHVyZT0idHJ1ZSIvPgorICAgICAgICAgICAgPCEtLSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhlIHRlc3RzIC0tPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9qdW5pdGxhdW5jaGVyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWZhaWx1cmUtY29udGludWVzLWJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke291dHB1dC5kaXJ9IgorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1mYWlsdXJlLWNvbnRpbnVlcy1idWlsZC50cmFja2VyfSIKKyAgICAgICAgICAgICAgICAgICAgICBpZj0idGVzdC1mYWlsdXJlLWNvbnRpbnVlcy1idWlsZC50cmFja2VyIi8+CisKKyAgICAgICAgICAgIDwhLS0gQSBzcGVjaWZpYyB0ZXN0IG1lYW50IHRvIGZhaWwgLS0+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2UuQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1zdWNjZXNzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke291dHB1dC5kaXJ9IgorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1zdWNjZXNzLnRyYWNrZXJ9IgorICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LXN1Y2Nlc3MudHJhY2tlciIvPgorICAgICAgICAgICAgPCEtLSBBIHNwZWNpZmljIHRlc3QgbWVhbnQgdG8gcGFzcyAtLT4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZS5KVW5pdDRTYW1wbGVUZXN0Ii8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lLXNwZWNpZmljLW1ldGhvZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcj0iJHtvdXRwdXQuZGlyfSIKKyAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWxlPSIke3Rlc3Qtb25lLXNwZWNpZmljLW1ldGhvZC50cmFja2VyfSIKKyAgICAgICAgICAgICAgICAgICAgICBpZj0idGVzdC1vbmUtc3BlY2lmaWMtbWV0aG9kLnRyYWNrZXIiLz4KKworICAgICAgICAgICAgPHRlc3QgbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci52aW50YWdlLkpVbml0NFNhbXBsZVRlc3QiIG1ldGhvZHM9InRlc3RCYXIiIGhhbHRvbmZhaWx1cmU9InRydWUiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1tdWx0aXBsZS1zcGVjaWZpYy1tZXRob2RzIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke291dHB1dC5kaXJ9IgorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1tdWx0aXBsZS1zcGVjaWZpYy1tZXRob2RzLnRyYWNrZXJ9IgorICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LW11bHRpcGxlLXNwZWNpZmljLW1ldGhvZHMudHJhY2tlciIvPgorCisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2UuSlVuaXQ0U2FtcGxlVGVzdCIgbWV0aG9kcz0iIHRlc3RGb28sIHRlc3RGb29CYXIgIgorICAgICAgICAgICAgICAgICAgaGFsdG9uZmFpbHVyZT0idHJ1ZSIvPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgPC9qdW5pdGxhdW5jaGVyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW11bHRpcGxlLWluZGl2aWR1YWwiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anVuaXRsYXVuY2hlcj4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZS5BbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCI+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1tdWx0aXBsZS1pbmRpdmlkdWFsLTEudHJhY2tlcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LW11bHRpcGxlLWluZGl2aWR1YWwtMS50cmFja2VyIi8+CisgICAgICAgICAgICA8L3Rlc3Q+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2UuSlVuaXQ0U2FtcGxlVGVzdCI+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1tdWx0aXBsZS1pbmRpdmlkdWFsLTIudHJhY2tlcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LW11bHRpcGxlLWluZGl2aWR1YWwtMi50cmFja2VyIi8+CisgICAgICAgICAgICA8L3Rlc3Q+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0LmNsYXNzcGF0aCIvPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYmF0Y2giIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ianVuaXRsYXVuY2hlci50ZXN0LnRyYWNrZXIuYXBwZW5kLmZpbGUiIHZhbHVlPSIke291dHB1dC5kaXJ9LyR7dGVzdC1iYXRjaC50cmFja2VyfSIvPgorICAgICAgICA8anVuaXRsYXVuY2hlcj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8dGVzdGNsYXNzZXMgb3V0cHV0ZGlyPSIke291dHB1dC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LWJhdGNoLnRyYWNrZXIiLz4KKworICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvZXhhbXBsZS8qKi9qdW5pdGxhdW5jaGVyLyoqLyIvPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSJvcmcvZXhhbXBsZS8qKi9qdW5pdGxhdW5jaGVyLyoqL0ZvcmtlZFRlc3QuY2xhc3MiLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIHR5cGU9ImxlZ2FjeS1icmllZiIgc2VuZFN5c091dD0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDxsaXN0ZW5lciB0eXBlPSJsZWdhY3kteG1sIiBzZW5kU3lzRXJyPSJ0cnVlIiBzZW5kU3lzT3V0PSJ0cnVlIi8+CisgICAgICAgICAgICA8L3Rlc3RjbGFzc2VzPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYmFzaWMtZm9yayIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdC5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZS5Gb3JrZWRUZXN0IiBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iPgorICAgICAgICAgICAgICAgIDxsaXN0ZW5lciBjbGFzc25hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuVHJhY2tlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke291dHB1dC5kaXJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWxlPSIke3Rlc3QtYmFzaWMtZm9yay50cmFja2VyfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWY9InRlc3QtYmFzaWMtZm9yay50cmFja2VyIi8+CisKKyAgICAgICAgICAgICAgICA8Zm9yayBkaXI9IiR7YmFzZWRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJqdW5pdGxhdW5jaGVyLnRlc3Quc3lzcHJvcC5vbmUiIHZhbHVlPSJmb3JrZWQiLz4KKyAgICAgICAgICAgICAgICA8L2Zvcms+CisKKyAgICAgICAgICAgICAgICA8bGlzdGVuZXIgdHlwZT0ibGVnYWN5LXhtbCIgc2VuZFN5c0Vycj0idHJ1ZSIgc2VuZFN5c091dD0idHJ1ZSIvPgorICAgICAgICAgICAgPC90ZXN0PgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtanVuaXQtcGxhdGZvcm0tbGliLWV4Y2x1ZGVkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJqdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3QiIG91dHB1dGRpcj0iJHtvdXRwdXQuZGlyfSI+CisgICAgICAgICAgICAgICAgPCEtLSBleHBlY3QgdGhlIHRlc3QgdG8gbm90IGJlIGxhdW5jaGVkIGR1ZSB0byBDTkZFIG9uIEpVbml0IHBsYXRmb3JtIGNsYXNzZXMgLS0+CisgICAgICAgICAgICAgICAgPGZvcmsgZGlyPSIke2Jhc2VkaXJ9IiBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllcz0iZmFsc2UiLz4KKyAgICAgICAgICAgIDwvdGVzdD4KKyAgICAgICAgPC9qdW5pdGxhdW5jaGVyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWp1bml0LWFudC1ydW50aW1lLWxpYi1leGNsdWRlZCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ianVuaXQuZW5naW5lLmp1cGl0ZXIuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyLkp1cGl0ZXJTYW1wbGVUZXN0IiBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iPgorICAgICAgICAgICAgICAgIDwhLS0gZXhwZWN0IHRoZSB0ZXN0IHRvIG5vdCBiZSBsYXVuY2hlZCBkdWUgdG8gQ05GRSBvbiBBbnQgcnVudGltZSBjbGFzc2VzIC0tPgorICAgICAgICAgICAgICAgIDxmb3JrIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZUFudFJ1bnRpbWVMaWJyYXJpZXM9ImZhbHNlIi8+CisgICAgICAgICAgICA8L3Rlc3Q+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJqdW5pdC5lbmdpbmUuanVwaXRlci5jbGFzc3BhdGgiLz4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8IS0tIHdlIHNldCBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllcz1mYWxzZSBvbiB0aGUgZm9yayBlbGVtZW50CisgICAgICAgICAgICBhbmQgdGhlbiBleHBsaWNpdGx5IHNwZWNpZnkgYSBsb2NhdGlvbiBvZiB0aGUgSlVuaXQgcGxhdGZvcm0gbGlicmFyaWVzIC0tPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0ianVuaXQucGxhdGZvcm0uY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3QiIG91dHB1dGRpcj0iJHtvdXRwdXQuZGlyfSI+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uLnRyYWNrZXJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZj0idGVzdC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uLnRyYWNrZXIiLz4KKyAgICAgICAgICAgICAgICA8Zm9yayBkaXI9IiR7YmFzZWRpcn0iIGluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzPSJmYWxzZSIvPgorICAgICAgICAgICAgPC90ZXN0PgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYW50LXJ1bnRpbWUtbGliLWN1c3RvbS1sb2NhdGlvbiIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDwhLS0gZHVwbGljYXRlIHRoZSBBbnQgY2xhc3NlcyBpbnRvIGEgamFyIC0tPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke291dHB1dC5kaXJ9L2FudC1ydW50aW1lLWR1cGxpY2F0ZWQuamFyIiBiYXNlZGlyPSIke2FudC5ydW50aW1lLmNsYXNzZXMub3JpZ2luYWwucGF0aH0iLz4KKworICAgICAgICA8cHJvcGVydHkgbmFtZT0ianVuaXRsYXVuY2hlci50ZXN0LnRyYWNrZXIuYXBwZW5kLmZpbGUiIHZhbHVlPSIke291dHB1dC5kaXJ9LyR7dGVzdC1hbnQtcnVudGltZS1saWItY3VzdG9tLWxvY2F0aW9uLnRyYWNrZXJ9Ii8+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuZW5naW5lLmp1cGl0ZXIuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LmVuZ2luZS52aW50YWdlLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgICAgICA8IS0tIG91ciBkdXBsaWNhdGVkIEFudCBydW50aW1lIGNsYXNzZXMgamFyLCBzaW5jZSB3ZQorICAgICAgICAgICAgICAgIGV4Y2x1ZGUgdGhlIG9yaWdpbmFsIEFudCBydW50aW1lIGNsYXNzZXMgb24gdGhlIGZvcmsgZWxlbWVudAorICAgICAgICAgICAgICAgIGJ5IHNldHRpbmcgaW5jbHVkZUFudFJ1bnRpbWVMaWJyYXJpZXM9ZmFsc2UgLS0+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke291dHB1dC5kaXJ9L2FudC1ydW50aW1lLWR1cGxpY2F0ZWQuamFyIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgICAgIDx0ZXN0Y2xhc3NlcyBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvZXhhbXBsZS8qKi9qdW5pdGxhdW5jaGVyLyoqLyIvPgorICAgICAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LWFudC1ydW50aW1lLWxpYi1jdXN0b20tbG9jYXRpb24udHJhY2tlciIvPgorICAgICAgICAgICAgICAgIDxmb3JrIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZUFudFJ1bnRpbWVMaWJyYXJpZXM9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0ianVuaXRsYXVuY2hlci50ZXN0LnN5c3Byb3Aub25lIiB2YWx1ZT0iZm9ya2VkIi8+CisgICAgICAgICAgICAgICAgPC9mb3JrPgorICAgICAgICAgICAgPC90ZXN0Y2xhc3Nlcz4KKyAgICAgICAgPC9qdW5pdGxhdW5jaGVyPgorICAgIDwvdGFyZ2V0PgorCisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYW50LWFuZC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPCEtLSBkdXBsaWNhdGUgdGhlIEFudCBjbGFzc2VzIGludG8gYSBqYXIgLS0+CisgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7b3V0cHV0LmRpcn0vYW50LXJ1bnRpbWUtZHVwbGljYXRlZC5qYXIiIGJhc2VkaXI9IiR7YW50LnJ1bnRpbWUuY2xhc3Nlcy5vcmlnaW5hbC5wYXRofSIvPgorCisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0ianVuaXQuZW5naW5lLnZpbnRhZ2UuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMuZGlyfSIvPgorICAgICAgICAgICAgICAgIDwhLS0gb3VyIGR1cGxpY2F0ZWQgQW50IHJ1bnRpbWUgY2xhc3NlcyBqYXIsIHNpbmNlIHdlCisgICAgICAgICAgICAgICAgZXhjbHVkZSB0aGUgb3JpZ2luYWwgQW50IHJ1bnRpbWUgY2xhc3NlcyBvbiB0aGUgZm9yayBlbGVtZW50CisgICAgICAgICAgICAgICAgYnkgc2V0dGluZyBpbmNsdWRlQW50UnVudGltZUxpYnJhcmllcz1mYWxzZSAtLT4KKyAgICAgICAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7b3V0cHV0LmRpcn0vYW50LXJ1bnRpbWUtZHVwbGljYXRlZC5qYXIiLz4KKyAgICAgICAgICAgICAgICA8IS0tIHdlIHNldCBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllcz1mYWxzZSBvbiB0aGUgZm9yayBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIGFuZCB0aGVuIGV4cGxpY2l0bHkgc3BlY2lmeSBhIGxvY2F0aW9uIG9mIHRoZSBKVW5pdCBwbGF0Zm9ybSBsaWJyYXJpZXMgLS0+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9Imp1bml0LnBsYXRmb3JtLmNsYXNzcGF0aCIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgICAgICA8dGVzdGNsYXNzZXMgb3V0cHV0ZGlyPSIke291dHB1dC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvKiovanVuaXRsYXVuY2hlci8qKi9KVW5pdDRTYW1wbGVUZXN0LmNsYXNzIi8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDxsaXN0ZW5lciBjbGFzc25hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuVHJhY2tlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyPSIke291dHB1dC5kaXJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWxlPSIke3Rlc3QtYW50LWFuZC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uLnRyYWNrZXJ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZj0idGVzdC1hbnQtYW5kLWp1bml0LXBsYXRmb3JtLWxpYi1jdXN0b20tbG9jYXRpb24udHJhY2tlciIvPgorICAgICAgICAgICAgICAgIDxmb3JrIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZUFudFJ1bnRpbWVMaWJyYXJpZXM9ImZhbHNlIiBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllcz0iZmFsc2UiLz4KKyAgICAgICAgICAgIDwvdGVzdGNsYXNzZXM+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworCTx0YXJnZXQgbmFtZT0idGVzdC1tZXRob2Qtd2l0aC1pbmNsdWRlLXRhZyIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDwhLS0ganVuaXRsYXVuY2hlciAgaW5jbHVkZVRhZ3M9ImZhc3QsIHN1cGVyZmFzdCIgZXhjbHVkZVRhZ3M9InNsb3ciLS0+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyIGluY2x1ZGVUYWdzPSIgICBmYXN0ICAgLCBzdXBlcmZhc3QiIGV4Y2x1ZGVUYWdzPSIgICBzbG93Ij4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyU2FtcGxlVGVzdCIgb3V0cHV0ZGlyPSIke291dHB1dC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiIG91dHB1dERpcj0iJHtvdXRwdXQuZGlyfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RmlsZT0iJHt0ZXN0LW1ldGhvZC13aXRoLWluY2x1ZGUtdGFnLnRyYWNrZXJ9IiBpZj0idGVzdC1tZXRob2Qtd2l0aC1pbmNsdWRlLXRhZy50cmFja2VyIiAvPgorICAgICAgICAgICAgPC90ZXN0PgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbWV0aG9kLXdpdGgtZXhjbHVkZS10YWciIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anVuaXRsYXVuY2hlciBleGNsdWRlVGFncz0ic2xvdyI+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3QiIG91dHB1dGRpcj0iJHtvdXRwdXQuZGlyfSI+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIiBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1tZXRob2Qtd2l0aC1leGNsdWRlLXRhZy50cmFja2VyfSIgaWY9InRlc3QtbWV0aG9kLXdpdGgtZXhjbHVkZS10YWcudHJhY2tlciIgLz4KKyAgICAgICAgICAgIDwvdGVzdD4KKyAgICAgICAgPC9qdW5pdGxhdW5jaGVyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW1ldGhvZC13aXRoLXRhZy0yLWNsYXNzZXMiIGRlcGVuZHM9ImluaXQiPgorICAgICAgICA8anVuaXRsYXVuY2hlciBpbmNsdWRlVGFncz0iZmFzdCI+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3QiIG91dHB1dGRpcj0iJHtvdXRwdXQuZGlyfSI+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIiBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7dGVzdC1tZXRob2Qtd2l0aC10YWctMi1jbGFzc2VzMS50cmFja2VyfSIgaWY9InRlc3QtbWV0aG9kLXdpdGgtdGFnLTItY2xhc3NlczEudHJhY2tlciIgLz4KKyAgICAgICAgICAgIDwvdGVzdD4KKyAgICAgICAgICAgIDx0ZXN0IG5hbWU9Im9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyVGFnU2FtcGxlVGVzdCIgb3V0cHV0ZGlyPSIke291dHB1dC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiIG91dHB1dERpcj0iJHtvdXRwdXQuZGlyfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RmlsZT0iJHt0ZXN0LW1ldGhvZC13aXRoLXRhZy0yLWNsYXNzZXMyLnRyYWNrZXJ9IiBpZj0idGVzdC1tZXRob2Qtd2l0aC10YWctMi1jbGFzc2VzMi50cmFja2VyIiAvPgorICAgICAgICAgICAgPC90ZXN0PgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisJCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LWJlZm9yZWFsbC1mYWlsdXJlLXN0b3BzLWJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0bGF1bmNoZXIudGVzdC50cmFja2VyLmFwcGVuZC5maWxlIiB2YWx1ZT0iJHtvdXRwdXQuZGlyfS8ke3Rlc3QtYmVmb3JlYWxsLWZhaWx1cmUtc3RvcHMtYnVpbGQudHJhY2tlcn0iLz4KKyAgICAgICAgPGp1bml0bGF1bmNoZXI+CisgICAgICAgICAgICA8bGlzdGVuZXIgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIiCisgICAgICAgICAgICAgICAgICAgICAgaWY9InRlc3QtYmVmb3JlYWxsLWZhaWx1cmUtc3RvcHMtYnVpbGQudHJhY2tlciIvPgorICAgICAgICAgICAgPHRlc3QgbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyLkp1cGl0ZXJTYW1wbGVUZXN0RmFpbGluZ0JlZm9yZUFsbCIgaGFsdE9uRmFpbHVyZT0idHJ1ZSIvPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYmVmb3JlYWxsLWZhaWx1cmUtY29udGludWVzLWJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0bGF1bmNoZXIudGVzdC50cmFja2VyLmFwcGVuZC5maWxlIiB2YWx1ZT0iJHtvdXRwdXQuZGlyfS8ke3Rlc3QtYmVmb3JlYWxsLWZhaWx1cmUtY29udGludWVzLWJ1aWxkLnRyYWNrZXJ9Ii8+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyPgorICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LWJlZm9yZWFsbC1mYWlsdXJlLWNvbnRpbnVlcy1idWlsZC50cmFja2VyIi8+CisgICAgICAgICAgICA8dGVzdCBuYW1lPSJvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3RGYWlsaW5nQmVmb3JlQWxsIi8+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdC1tZXRob2Qtd2l0aC10YWctZmlsZXNldCIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdGxhdW5jaGVyLnRlc3QudHJhY2tlci5hcHBlbmQuZmlsZSIgdmFsdWU9IiR7b3V0cHV0LmRpcn0vJHt0ZXN0LW1ldGhvZC13aXRoLXRhZy1maWxlc2V0LnRyYWNrZXJ9Ii8+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyIGluY2x1ZGVUYWdzPSJmYXN0Ij4KKyAgICAgICAgICAgIDx0ZXN0Y2xhc3NlcyBvdXRwdXRkaXI9IiR7b3V0cHV0LmRpcn0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJvcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL2p1cGl0ZXIvKiIgLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIiBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LW1ldGhvZC13aXRoLXRhZy1maWxlc2V0LnRyYWNrZXIiIC8+CisgICAgICAgICAgICA8L3Rlc3RjbGFzc2VzPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QtbWV0aG9kLXdpdGgtdGFnLWZpbGVzZXQtZm9yayIgZGVwZW5kcz0iaW5pdCI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJqdW5pdGxhdW5jaGVyLnRlc3QudHJhY2tlci5hcHBlbmQuZmlsZSIgdmFsdWU9IiR7b3V0cHV0LmRpcn0vJHt0ZXN0LW1ldGhvZC13aXRoLXRhZy1maWxlc2V0LWZvcmsudHJhY2tlcn0iIC8+CisgICAgICAgIDxqdW5pdGxhdW5jaGVyIGluY2x1ZGVUYWdzPSJmYXN0Ij4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9Imp1bml0LmVuZ2luZS5qdXBpdGVyLmNsYXNzcGF0aCIgLz4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtidWlsZC5jbGFzc2VzLmRpcn0iIC8+CisgICAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJqdW5pdC5wbGF0Zm9ybS5jbGFzc3BhdGgiIC8+CisgICAgICAgICAgICA8dGVzdGNsYXNzZXMgb3V0cHV0ZGlyPSIke291dHB1dC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0ib3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyLyoiIC8+CisgICAgICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgICAgIDxmb3JrIGRpcj0iJHtiYXNlZGlyfSIgaW5jbHVkZUpVbml0UGxhdGZvcm1MaWJyYXJpZXM9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8L2Zvcms+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIiBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJ0ZXN0LW1ldGhvZC13aXRoLXRhZy1maWxlc2V0LWZvcmsudHJhY2tlciIgLz4KKyAgICAgICAgICAgIDwvdGVzdGNsYXNzZXM+CisgICAgICAgIDwvanVuaXRsYXVuY2hlcj4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iYnotNjM5NTgiPgorICAgICAgICA8anVuaXRsYXVuY2hlcj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3QuY2xhc3NwYXRoIi8+CisgICAgICAgICAgICA8dGVzdGNsYXNzZXM+CisgICAgICAgICAgICAgICAgPGxpc3RlbmVyIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyIgorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXI9IiR7b3V0cHV0LmRpcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZpbGU9IiR7YnotNjM5NTgudHJhY2tlcn0iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmPSJiei02Mzk1OC50cmFja2VyIi8+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2J1aWxkLmNsYXNzZXMuZGlyfSI+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL0ZvcmtlZFRlc3QuY2xhc3MiLz4KKyAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICAgICAgPGZvcms+CisgICAgICAgICAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9Imp1bml0bGF1bmNoZXIudGVzdC5zeXNwcm9wLm9uZSIgdmFsdWU9ImZvcmtlZCIvPgorICAgICAgICAgICAgICAgIDwvZm9yaz4KKyAgICAgICAgICAgIDwvdGVzdGNsYXNzZXM+CisgICAgICAgICAgICA8bGlzdGVuZXIgdHlwZT0ibGVnYWN5LXBsYWluIiBzZW5kU3lzT3V0PSJ0cnVlIiAvPgorICAgICAgICA8L2p1bml0bGF1bmNoZXI+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CisKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1mcmFtZXMueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQtd2l0aC1pbmNsdWRlL2p1bml0LWZyYW1lcy54c2wKaW5kZXggM2MwZDg1YS4uMTM1YWM4MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQtd2l0aC1pbmNsdWRlL2p1bml0LWZyYW1lcy54c2wKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQtd2l0aC1pbmNsdWRlL2p1bml0LWZyYW1lcy54c2wKQEAgLTE1LDcgKzE1LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjk2LDcgKzY5Niw3IEBACiAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KICAgICA8dHI+CiAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LjwvdGQ+CisgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwczovL3d3dy5qdW5pdC5vcmcvIj5KVW5pdDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIj5BbnQ8L2E+LjwvdGQ+CiAgICAgPC90cj4KICAgICA8L3RhYmxlPgogICAgIDxociBzaXplPSIxIi8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC13aXRoLWluY2x1ZGUvanVuaXQtaW1wb3J0LnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1pbXBvcnQueHNsCmluZGV4IGVjYmE0N2IuLmNjZmNjYjggMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1pbXBvcnQueHNsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LXdpdGgtaW5jbHVkZS9qdW5pdC1pbXBvcnQueHNsCkBAIC0xMiw3ICsxMiw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0LnhtbAppbmRleCA2MDgwNjYyLi44N2YwZjE3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9JTkNPTVBMRVRFLXNhbXBsZXByb2plY3QuaW5jb21wbGV0ZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9JTkNPTVBMRVRFLXNhbXBsZXByb2plY3QuaW5jb21wbGV0ZS54bWwKaW5kZXggNTZhZjAxNC4uMTA4ZWE3MiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvSU5DT01QTEVURS1zYW1wbGVwcm9qZWN0LmluY29tcGxldGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L0lOQ09NUExFVEUtc2FtcGxlcHJvamVjdC5pbmNvbXBsZXRlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvTkFNRVNQQUNFLXNhbXBsZXByb2plY3QubmFtZXNwYWNlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L05BTUVTUEFDRS1zYW1wbGVwcm9qZWN0Lm5hbWVzcGFjZS54bWwKaW5kZXggNDFlN2RiZi4uOWM3NmFlMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvTkFNRVNQQUNFLXNhbXBsZXByb2plY3QubmFtZXNwYWNlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9OQU1FU1BBQ0Utc2FtcGxlcHJvamVjdC5uYW1lc3BhY2UueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9URVNULXNhbXBsZXByb2plY3QuY29pbnMuQ29pblRlc3QueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LmNvaW5zLkNvaW5UZXN0LnhtbAppbmRleCA2YmM5OWYyLi5jYjMxMTU5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9URVNULXNhbXBsZXByb2plY3QuY29pbnMuQ29pblRlc3QueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1RFU1Qtc2FtcGxlcHJvamVjdC5jb2lucy5Db2luVGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1RFU1Qtc2FtcGxlcHJvamVjdC51dGlsLlVuaXF1ZVN0cmluZ1Rlc3QueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LnV0aWwuVW5pcXVlU3RyaW5nVGVzdC54bWwKaW5kZXggZjQwMTZjMi4uMDk0MDhlZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LnV0aWwuVW5pcXVlU3RyaW5nVGVzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvVEVTVC1zYW1wbGVwcm9qZWN0LnV0aWwuVW5pcXVlU3RyaW5nVGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1dST05HRUxFTUVOVC1zYW1wbGVwcm9qZWN0Lndyb25nZWxlbWVudC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9XUk9OR0VMRU1FTlQtc2FtcGxlcHJvamVjdC53cm9uZ2VsZW1lbnQueG1sCmluZGV4IDljYjVhMTQuLjkyNmVmYzQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L1dST05HRUxFTUVOVC1zYW1wbGVwcm9qZWN0Lndyb25nZWxlbWVudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvV1JPTkdFTEVNRU5ULXNhbXBsZXByb2plY3Qud3JvbmdlbGVtZW50LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvanVuaXQtZnJhbWVzLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L2p1bml0LWZyYW1lcy54c2wKaW5kZXggY2EzMTNhZi4uNTVkZDc3NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRyZXBvcnQvanVuaXQtZnJhbWVzLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qdW5pdHJlcG9ydC9qdW5pdC1mcmFtZXMueHNsCkBAIC0xNCw3ICsxNCw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY5Niw3ICs2OTYsNyBAQAogICAgIDx0YWJsZSB3aWR0aD0iMTAwJSI+CiAgICAgPHRyPgogICAgICAgICA8dGQgYWxpZ249ImxlZnQiPjwvdGQ+Ci0gICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPkRlc2lnbmVkIGZvciB1c2Ugd2l0aCA8YSBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZy8iPkpVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly93d3cuanVuaXQub3JnLyI+SlVuaXQ8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgogICAgIDwvdHI+CiAgICAgPC90YWJsZT4KICAgICA8aHIgc2l6ZT0iMSIvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL2J1aWxkLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9idWlsZC54bWwKaW5kZXggMjdiNDAzMS4uNDhmOGIwMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvYnVpbGQueG1sCkBAIC04LDcgKzgsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uZXQvZnRwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25ldC9mdHAueG1sCmluZGV4IGFhZjRiOGUuLjVjOTI2NDMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25ldC9mdHAueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25ldC9mdHAueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHJvcGVydHlmaWxlLnhtbAppbmRleCAyMGExNzI3Li4xZWU3MWI2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy54bWwKaW5kZXggOTliZmNmZi4uNTUzOTIwNyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDcgKzM3LDcgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0NSIgZGVzY3JpcHRpb249IkdldCB0aGUgbGF0ZXN0IGZyb20gUFZDUyI+Ci0gICAgPHB2Y3MgcHZjc2Jpbj0iL2hvbWUvY3ZzL3B2Y3NhbnQvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMiIAorICAgIDxwdmNzIHB2Y3NiaW49Ii9ob21lL2N2cy9wdmNzYW50L3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzIgogCQkJIHJlcG9zaXRvcnk9Ii8vY3Q0c2VydjIvcHZjcy9tb25pdG9yIi8+CiAgIDwvdGFyZ2V0PgogCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMKaW5kZXggZDdmMDU3ZS4uM2M4ZDE0NyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cC5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAueG1sCmluZGV4IDU4ZmRjNTkuLjkwMmQyODMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMSArMTgsOSBAQAogPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iZGVmIiBiYXNlZGlyPSIuIj4KICAgPGltcG9ydCBmaWxlPSIuLi8uLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CiAKLSAgPHByb3BlcnR5IG5hbWU9InJvb3QiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi8uLiIvPgotCiAgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgotICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIgLz4KLSAgICA8Y29weSBmaWxlPSJyZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMiIHRvZmlsZT0iJHtvdXRwdXR9L3Rlc3QucHJvcGVydGllcyIgLz4KKyAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KKyAgICA8Y29weSBmaWxlPSJyZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMiIHRvZmlsZT0iJHtvdXRwdXR9L3Rlc3QucHJvcGVydGllcyIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImRlZiI+CkBAIC0zMCwzOSArMjgsMzkgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJzZXRVcC1ubCI+Ci0gICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgotICAgIDxjb3B5IGZpbGU9InJlcGxhY2VyZWdleHAyLnByb3BlcnRpZXMiIHRvZmlsZT0iJHtvdXRwdXR9L3Rlc3QucHJvcGVydGllcyIgLz4KKyAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KKyAgICA8Y29weSBmaWxlPSJyZXBsYWNlcmVnZXhwMi5wcm9wZXJ0aWVzIiB0b2ZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVwbGFjZSIgZGVwZW5kcz0ic2V0VXAiPgogICAgIDxyZXBsYWNlcmVnZXhwIGZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiIGJ5bGluZT0idHJ1ZSI+Ci0gICAgICA8cmVnZXhwIHBhdHRlcm49Ik9sZCguKik9KC4qKSIgLz4KLSAgICAgIDxzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0iTmV3UHJvcD1cMVwyIiAvPgorICAgICAgPHJlZ2V4cCBwYXR0ZXJuPSJPbGQoLiopPSguKikiLz4KKyAgICAgIDxzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0iTmV3UHJvcD1cMVwyIi8+CiAgICAgPC9yZXBsYWNlcmVnZXhwPgogICA8L3RhcmdldD4KICAgPCEtLSB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0ZXN0RGlyZWN0b3J5RGF0ZURvZXNOb3RDaGFuZ2UgdG8gbWFrZSBzdXJlIHNvbWV0aGluZyB3aWxsIGhhcHBlbiAtLT4KICAgPHRhcmdldCBuYW1lPSJ0b3VjaERpcmVjdG9yeSI+Ci0gICAgPGNvcHkgZmlsZT0icmVwbGFjZXJlZ2V4cC5wcm9wZXJ0aWVzIiB0b2ZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiIC8+CisgICAgPGNvcHkgZmlsZT0icmVwbGFjZXJlZ2V4cC5wcm9wZXJ0aWVzIiB0b2ZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiLz4KIAogICA8L3RhcmdldD4KICAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyZWN0b3J5RGF0ZURvZXNOb3RDaGFuZ2UiPgogICAgIDxyZXBsYWNlcmVnZXhwIGZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiIGJ5bGluZT0idHJ1ZSI+Ci0gICAgICA8cmVnZXhwIHBhdHRlcm49ImZvbyIgLz4KKyAgICAgIDxyZWdleHAgcGF0dGVybj0iZm9vIi8+CiAgICAgICAgIDxzdWJzdGl0dXRpb24gZXhwcmVzc2lvbj0iYmFyIi8+CiAgICAgICA8L3JlcGxhY2VyZWdleHA+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdERvbnRBZGROZXdsaW5lMSIgZGVwZW5kcz0ic2V0VXAtbmwiPgogICAgIDxyZXBsYWNlcmVnZXhwIGZpbGU9IiR7b3V0cHV0fS90ZXN0LnByb3BlcnRpZXMiIGJ5bGluZT0iZmFsc2UiPgotICAgICAgPHJlZ2V4cCBwYXR0ZXJuPSJPbGQoLiopPSguKikiIC8+Ci0gICAgICA8c3Vic3RpdHV0aW9uIGV4cHJlc3Npb249Ik5ld1Byb3A9XDFcMiIgLz4KKyAgICAgIDxyZWdleHAgcGF0dGVybj0iT2xkKC4qKT0oLiopIi8+CisgICAgICA8c3Vic3RpdHV0aW9uIGV4cHJlc3Npb249Ik5ld1Byb3A9XDFcMiIvPgogICAgIDwvcmVwbGFjZXJlZ2V4cD4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0RG9udEFkZE5ld2xpbmUyIiBkZXBlbmRzPSJzZXRVcC1ubCI+CiAgICAgPHJlcGxhY2VyZWdleHAgZmlsZT0iJHtvdXRwdXR9L3Rlc3QucHJvcGVydGllcyIgYnlsaW5lPSJ0cnVlIj4KLSAgICAgIDxyZWdleHAgcGF0dGVybj0iT2xkKC4qKT0oLiopIiAvPgotICAgICAgPHN1YnN0aXR1dGlvbiBleHByZXNzaW9uPSJOZXdQcm9wPVwxXDIiIC8+CisgICAgICA8cmVnZXhwIHBhdHRlcm49Ik9sZCguKik9KC4qKSIvPgorICAgICAgPHN1YnN0aXR1dGlvbiBleHByZXNzaW9uPSJOZXdQcm9wPVwxXDIiLz4KICAgICA8L3JlcGxhY2VyZWdleHA+CiAgIDwvdGFyZ2V0PgogCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucHJvcGVydGllcwppbmRleCBhZGE3NzI3Li40ODkyMmFiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAyLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cDIucmVzdWx0LnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcwppbmRleCA2MzkzY2Q3Li41YWI2YmM1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwMi5yZXN1bHQucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY2hlbWF2YWxpZGF0ZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY2hlbWF2YWxpZGF0ZS54bWwKaW5kZXggZjQzMjAxZS4uMTUyZjJmOCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NoZW1hdmFsaWRhdGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjaGVtYXZhbGlkYXRlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC54bWwKaW5kZXggODQxZjcwZC4uMGNjMDhiMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNywyMiArMTcsMjIgQEAKIC0tPgogPHByb2plY3QgbmFtZT0idGVzdHByb2plY3QiIGRlZmF1bHQ9ImRlZiIgYmFzZWRpcj0iLiI+CiAKKyAgPGltcG9ydCBmaWxlPSIuLi8uLi9idWlsZGZpbGV0ZXN0LWJhc2UueG1sIi8+CisKICAgPHRhcmdldCBuYW1lPSJkZWYiPgogICAgIDxmYWlsPlRoaXMgYnVpbGQtZmlsZSBpcyBpbnRlbmRlZCB0byBiZSBydW4gZnJvbSB0aGUgdGVzdCBjYXNlczwvZmFpbD4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJzZXR1cDEiPgotCi0gICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+IDwhW0NEQVRBWwotCisgICAgPHNjcmlwdCBsYW5ndWFnZT0iamF2YXNjcmlwdCI+CisgICAgICA8IVtDREFUQVsKICAgICAgIGZvciAoaT0xOyBpPD0xMDsgaSsrKSB7CiAgICAgICAgIGVjaG8gPSB0ZXN0cHJvamVjdC5jcmVhdGVUYXNrKCJlY2hvIik7CiAgICAgICAgIHNldHVwMS5hZGRUYXNrKGVjaG8pOwogICAgICAgICBlY2hvLnNldE1lc3NhZ2UoaSppKTsKICAgICAgIH0KLQotICAgIF1dPiA8L3NjcmlwdD4KLQorICAgICAgXV0+CisgICAgPC9zY3JpcHQ+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZXhhbXBsZTEiIGRlcGVuZHM9InNldHVwMSIvPgpAQCAtNDMsNCArNDMsMjIgQEAKICAgICBdXT48L3NjcmlwdD4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJ1c2VTcmNBbmRFbmNvZGluZyI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InVzZVNyY0FuZEVuY29kaW5nLmVuY29kaW5nIiB2YWx1ZT0iVVRGLTgiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlU3JjQW5kRW5jb2RpbmcucmVhZGVyLmVuY29kaW5nIiB2YWx1ZT0iJHt1c2VTcmNBbmRFbmNvZGluZy5lbmNvZGluZ30iCisgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTZXQgYSBkaWZmZXJlbnQgZW5jb2RpbmcgdG8gcmFpc2UgYSBmYWlsdXJlIChleC4gSVNPLTg4NTktMSkiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlU3JjQW5kRW5jb2RpbmcuZmlsZSIgbG9jYXRpb249IiR7b3V0cHV0fS9zY3JpcHQudXNlU3JjQW5kRW5jb2RpbmcuanMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlU3JjQW5kRW5jb2RpbmcuZXhwZWN0ZWRQcm9wIiB2YWx1ZT0iZWFjdXRlIFsmIzIzMztdIi8+CisKKyAgICA8ZWNobyBmaWxlPSIke3VzZVNyY0FuZEVuY29kaW5nLmZpbGV9IiBlbmNvZGluZz0iJHt1c2VTcmNBbmRFbmNvZGluZy5lbmNvZGluZ30iCisgICAgICAgICAgbWVzc2FnZT0icHJvamVjdC5zZXROZXdQcm9wZXJ0eSgndXNlU3JjQW5kRW5jb2RpbmcucHJvcCcsICcke3VzZVNyY0FuZEVuY29kaW5nLmV4cGVjdGVkUHJvcH0nKTsiLz4KKworICAgIDxzY3JpcHQgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iJHt1c2VTcmNBbmRFbmNvZGluZy5maWxlfSIgZW5jb2Rpbmc9IiR7dXNlU3JjQW5kRW5jb2RpbmcucmVhZGVyLmVuY29kaW5nfSIvPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9InVzZVNyY0FuZEVuY29kaW5nLnRlc3RPSyIgPgorICAgICAgPGVxdWFscyBhcmcxPSIke3VzZVNyY0FuZEVuY29kaW5nLmV4cGVjdGVkUHJvcH0iIGFyZzI9IiR7dXNlU3JjQW5kRW5jb2RpbmcucHJvcH0iLz4KKyAgICA8L2NvbmRpdGlvbj4KKyAgICA8ZmFpbCBtZXNzYWdlPSJleHBlY3RlZCAmbHQ7JHt1c2VTcmNBbmRFbmNvZGluZy5leHBlY3RlZFByb3B9Jmd0OyBidXQgd2FzICZsdDske3VzZVNyY0FuZEVuY29kaW5nLnByb3B9Jmd0OyIgdW5sZXNzPSJ1c2VTcmNBbmRFbmNvZGluZy50ZXN0T0siLz4KKyAgPC90YXJnZXQ+CisKIDwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvaGVhdnktc2NyaXB0LmpzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L2hlYXZ5LXNjcmlwdC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjU3NjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L2hlYXZ5LXNjcmlwdC5qcwpAQCAtMCwwICsxLDg1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCit2YXIgZnVuY3Rpb25zID0gWworZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0sZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB2YWx1ZTsgfSxmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuIHZhbHVlOyB9LAorXTsKKwordmFyIHYgPSAnYSc7Citmb3IgKHZhciBpIGluIGZ1bmN0aW9ucykgeworICB2ID0gZnVuY3Rpb25zW2ldKHYpOworfQorCit2YXIgZWNobyA9IHByb2plY3QuY3JlYXRlVGFzaygiZWNobyIpOworZWNoby5zZXRNZXNzYWdlKCJoZWF2eS1zY3JpcHQgZG9uZSIpOworZWNoby5wZXJmb3JtKCk7CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvc2NyaXB0ZGVmLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYueG1sCmluZGV4IDBkMDUxZWEuLjM3ODI5YzUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw4IEBACiAtLT4KIDxwcm9qZWN0IG5hbWU9InRlc3Rwcm9qZWN0IiBkZWZhdWx0PSJkZWYiIGJhc2VkaXI9Ii4iPgogCisgIDxpbXBvcnQgZmlsZT0iLi4vLi4vLi4vYnVpbGRmaWxldGVzdC1iYXNlLnhtbCIvPgorCiAgIDx0YXJnZXQgbmFtZT0iZGVmIj4KICAgICA8ZmFpbD5UaGlzIGJ1aWxkLWZpbGUgaXMgaW50ZW5kZWQgdG8gYmUgcnVuIGZyb20gdGhlIHRlc3QgY2FzZXM8L2ZhaWw+CiAgIDwvdGFyZ2V0PgpAQCAtMjYsMTEgKzI4LDkgQEAKICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KICAgICAgIDxlbGVtZW50IG5hbWU9ImZpbGVzZXQiIHR5cGU9ImZpbGVzZXQiLz4KICAgICAgIDwhW0NEQVRBWwotICAgICAgICAKICAgICAgICAgcHJvamVjdC5sb2coIkF0dHJpYnV0ZSBhdHRyMSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CiAgICAgICAgIHByb2plY3QubG9nKCJGaWxlc2V0IGJhc2VkaXIgPSAiCiAgICAgICAgICAgKyBlbGVtZW50cy5nZXQoImZpbGVzZXQiKS5nZXQoMCkuZ2V0RGlyKHByb2plY3QpKTsKLSAgICAgICAgCiAgICAgICBdXT4KICAgICA8L3NjcmlwdGRlZj4KICAgICAKQEAgLTYxLDExICs2MSw5IEBACiAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF0dHIxIi8+CiAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiLz4KICAgICAgIDwhW0NEQVRBWwotICAgICAgICAKICAgICAgICAgcHJvamVjdC5sb2coIkF0dHJpYnV0ZSBhdHRyMSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CiAgICAgICAgIHByb2plY3QubG9nKCJGaWxlc2V0IGJhc2VkaXIgPSAiCiAgICAgICAgICAgKyBlbGVtZW50cy5nZXQoImZpbGVzZXQiKS5nZXQoMCkuZ2V0RGlyKHByb2plY3QpKTsKLSAgICAgICAgCiAgICAgICBdXT4KICAgICA8L3NjcmlwdGRlZj4KICAgICAKQEAgLTkzLDExICs5MSw5IEBACiAgICAgICA8YXR0cmlidXRlIG5hbWU9ImF0dHIxIi8+CiAgICAgICA8ZWxlbWVudCBuYW1lPSJmaWxlc2V0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQiLz4KICAgICAgIDwhW0NEQVRBWwotICAgICAgICAKICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiQXR0cmlidXRlIGF0dHIxID0gIiArIGF0dHJpYnV0ZXMuZ2V0KCJhdHRyMSIpKTsKICAgICAgICAgamF2YS5sYW5nLlN5c3RlbS5vdXQucHJpbnRsbigiRmlsZXNldCBiYXNlZGlyID0gIgogICAgICAgICAgICsgZWxlbWVudHMuZ2V0KCJmaWxlc2V0IikuZ2V0KDApLmdldERpcihwcm9qZWN0KSk7Ci0gICAgICAgIAogICAgICAgXV0+CiAgICAgPC9zY3JpcHRkZWY+CiAgICAgCkBAIC0xMzEsNyArMTI3LDYgQEAKICAgICA8c2NyaXB0ZGVmIG5hbWU9InNjcmlwdHRlc3QiIGxhbmd1YWdlPSJqYXZhc2NyaXB0Ij4KICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXR0cjEiLz4KICAgICAgIDwhW0NEQVRBWwotICAgICAgICAKICAgICAgICAgcHJvamVjdC5sb2coIkF0dHJpYnV0ZSB2YWx1ZSA9ICIgKyBhdHRyaWJ1dGVzLmdldCgiYXR0cjEiKSk7CiAgICAgICBdXT4KICAgICA8L3NjcmlwdGRlZj4KQEAgLTE0MSw1ICsxMzYsODEgQEAKICAgICA8L3NjcmlwdHRlc3Q+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0idXNlQmVhbnNoZWxsIj4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPSJiZWFuc2hlbGwiPjwhW0NEQVRBWworICAgICAgIHNlbGYubG9nKCJJJ20gaGVyZSIsIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QuTVNHX0lORk8pOworICAgIF1dPjwvc2NyaXB0PgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InVzZVNyY0FuZEVuY29kaW5nIj4KKyAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idXNlU3JjQW5kRW5jb2RpbmcuZW5jb2RpbmciIHZhbHVlPSJVVEYtOCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VTcmNBbmRFbmNvZGluZy5yZWFkZXIuZW5jb2RpbmciIHZhbHVlPSIke3VzZVNyY0FuZEVuY29kaW5nLmVuY29kaW5nfSIKKyAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNldCBhIGRpZmZlcmVudCBlbmNvZGluZyB0byByYWlzZSBhIGZhaWx1cmUgKGV4LiBJU08tODg1OS0xKSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VTcmNBbmRFbmNvZGluZy5maWxlIiBsb2NhdGlvbj0iJHtvdXRwdXR9L3NjcmlwdC51c2VTcmNBbmRFbmNvZGluZy5qcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VTcmNBbmRFbmNvZGluZy5leHBlY3RlZFByb3AiIHZhbHVlPSJlYWN1dGUgWyYjMjMzO10iLz4KKworICAgIDxlY2hvIGZpbGU9IiR7dXNlU3JjQW5kRW5jb2RpbmcuZmlsZX0iIGVuY29kaW5nPSIke3VzZVNyY0FuZEVuY29kaW5nLmVuY29kaW5nfSIKKyAgICAgICAgICBtZXNzYWdlPSJwcm9qZWN0LnNldE5ld1Byb3BlcnR5KCd1c2VTcmNBbmRFbmNvZGluZy5wcm9wJywgJyR7dXNlU3JjQW5kRW5jb2RpbmcuZXhwZWN0ZWRQcm9wfScpOyIvPgorCisgICAgPHNjcmlwdGRlZiBuYW1lPSJ1c2VTcmNBbmRFbmNvZGluZyIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iJHt1c2VTcmNBbmRFbmNvZGluZy5maWxlfSIgZW5jb2Rpbmc9IiR7dXNlU3JjQW5kRW5jb2RpbmcucmVhZGVyLmVuY29kaW5nfSIvPgorICAgIDx1c2VTcmNBbmRFbmNvZGluZy8+CisKKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1c2VTcmNBbmRFbmNvZGluZy50ZXN0T0siID4KKyAgICAgIDxlcXVhbHMgYXJnMT0iJHt1c2VTcmNBbmRFbmNvZGluZy5leHBlY3RlZFByb3B9IiBhcmcyPSIke3VzZVNyY0FuZEVuY29kaW5nLnByb3B9Ii8+CisgICAgPC9jb25kaXRpb24+CisgICAgPGZhaWwgbWVzc2FnZT0iZXhwZWN0ZWQgJmx0OyR7dXNlU3JjQW5kRW5jb2RpbmcuZXhwZWN0ZWRQcm9wfSZndDsgYnV0IHdhcyAmbHQ7JHt1c2VTcmNBbmRFbmNvZGluZy5wcm9wfSZndDsiIHVubGVzcz0idXNlU3JjQW5kRW5jb2RpbmcudGVzdE9LIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idXNlQ29tcGlsZWQiPgorICAgIDwhLS0gVGVzdCB3aXRoICdqYXZheCcgbWFuYWdlciwgJ2JzZicgbWFuYWdlciBhbHJlYWR5IGNvbXBpbGVzIHRoZSBzY3JpcHQuIC0tPgorICAgIDxzY3JpcHRkZWYgbWFuYWdlcj0iamF2YXgiIG5hbWU9ImhlYXZ5c2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgc3JjPSJoZWF2eS1zY3JpcHQuanMiIGVuY29kaW5nPSJVVEYtOCIgY29tcGlsZWQ9InRydWUiLz4KKworICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgICA8aGVhdnlzY3JpcHQvPgorICAgIDxoZWF2eXNjcmlwdC8+CisgICAgPGhlYXZ5c2NyaXB0Lz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ1c2VOb3RDb21waWxlZCI+CisgICAgPHNjcmlwdGRlZiBtYW5hZ2VyPSJqYXZheCIgbmFtZT0iaGVhdnlzY3JpcHROb3RDb21waWxlZCIgbGFuZ3VhZ2U9ImphdmFzY3JpcHQiIHNyYz0iaGVhdnktc2NyaXB0LmpzIiBlbmNvZGluZz0iVVRGLTgiIGNvbXBpbGVkPSJmYWxzZSIvPgorCisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgICA8aGVhdnlzY3JpcHROb3RDb21waWxlZC8+CisgICAgPGhlYXZ5c2NyaXB0Tm90Q29tcGlsZWQvPgorICAgIDxoZWF2eXNjcmlwdE5vdENvbXBpbGVkLz4KKyAgPC90YXJnZXQ+CiAKIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdF9yZWZlcmVuY2UueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwKaW5kZXggODJjY2IxZi4uMGI3NTQ4NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0X3JlZmVyZW5jZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc29zL3Nvcy54bWwKaW5kZXggOTgyYjQ3Yy4uN2Q1NGRjNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc29zL3Nvcy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc29zL3Nvcy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC10ZXN0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC10ZXN0LnhtbAppbmRleCA1YjViYmUyLi43YzNmMTU0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gtdGVzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC91bml4L3N5bWxpbmsueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9zeW1saW5rLnhtbAppbmRleCBmMDM5YTYyLi45OWMwYmJiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC91bml4L3N5bWxpbmsueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwMiw3ICszMDIsNyBAQAogCiAgICAgPHNsZWVwIHNlY29uZHM9IiR7ZGVsYXl9Ii8+ICA8IS0tIG1ha2Ugc3VyZSBPUyBoYXMgdGltZSB0byBkbyB0aGUgZXhlY3MgLS0+CiAKLSAgICA8c3ltbGluayBhY3Rpb249InJlY3JlYXRlIj4KKyAgICA8c3ltbGluayBhY3Rpb249InJlY3JlYXRlIiBvdmVyd3JpdGU9InRydWUiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0vc3ltdGVzdDEiIGluY2x1ZGVzPSIqKi9yZWNvcmRlZC5saW5rcyIvPgogICAgIDwvc3ltbGluaz4KIApAQCAtMzUwLDUgKzM1MCwxNyBAQAogICAgICAgPGRlbGV0ZSBmaWxlPSIke291dHB1dH0vZmlsZTIiLz4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0LW92ZXJ3cml0ZS1saW5rIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9L3Rlc3Qtb3ZlcndyaXRlIi8+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9L3Rlc3Qtb3ZlcndyaXRlL2RpcjEiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0idGVzdC5vdmVyd3JpdGUubGluay50YXJnZXQuZGlyIiBsb2NhdGlvbj0iJHtvdXRwdXR9L3Rlc3Qtb3ZlcndyaXRlL2RpcjEiLz4KKyAgICA8IS0tIENyZWF0ZSBhIHN5bWxpbmsgdG8gdGhlIGRpciwgdGhpcyBzaG91bGQgd29yayBmaW5lIC0tPgorICAgIDxzeW1saW5rIGxpbms9IiR7b3V0cHV0fS90ZXN0LW92ZXJ3cml0ZS9zeW1saW5rZWQxIiByZXNvdXJjZT0iJHt0ZXN0Lm92ZXJ3cml0ZS5saW5rLnRhcmdldC5kaXJ9Ii8+CisgICAgPCEtLSBDcmVhdGUgYSBzeW1saW5rIGF0IHRoZSBwcmV2aW91c2x5IGNyZWF0ZWQgc3ltbGluayBwYXRoIHdpdGggb3ZlcndyaXRlID0gZmFsc2UuCisgICAgICBUaGlzICpzaG91bGRuJ3QqIGNyZWF0ZSBhIG5ldyBsaW5rICh3aXRoaW4gdGhlIHRhcmdldCByZXNvdXJjZSkuIFNlZSBodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTU4NjgzIC0tPgorICAgIDxzeW1saW5rIGxpbms9IiR7b3V0cHV0fS90ZXN0LW92ZXJ3cml0ZS9zeW1saW5rZWQxIiByZXNvdXJjZT0iJHt0ZXN0Lm92ZXJ3cml0ZS5saW5rLnRhcmdldC5kaXJ9Ii8+CisKKworICA8L3RhcmdldD4KIAogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbAppbmRleCA3YzZjMGQzLi5iZDA3ZDJhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveGFsYW4tcmVkaXJlY3QtaW4ueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveGFsYW4tcmVkaXJlY3QtaW4ueHNsCmluZGV4IGI5ZDA3OTQuLmVmMGJlNWYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hhbGFuLXJlZGlyZWN0LWluLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94YWxhbi1yZWRpcmVjdC1pbi54c2wKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYWJvdXQueG1sCmluZGV4IGY2YTlkYWIuLjc2MmQ2YTQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Fib3V0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2FwYWNoZS54c2wgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYXBhY2hlLnhzbAppbmRleCAxMjBhZGRmLi44NzI1MDhhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYXBhY2hlLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYXBhY2hlLnhzbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Jvb2tzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9ib29rcy54bWwKaW5kZXggMTc5MjNkNy4uOWJhYzM5NCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Jvb2tzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYm9va3MueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLWluLW5zLnhzZCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MtaW4tbnMueHNkCmluZGV4IGIzNDE0N2MuLjcyYTkxYjEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MtaW4tbnMueHNkCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MtaW4tbnMueHNkCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLmR0ZCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkCmluZGV4IDUxNjI5ZDUuLmZhZWIyYjYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkCkBAIC02LDcgKzYsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLnhzZCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNkCmluZGV4IGVlZWRiY2EuLjNmNTU3NDcgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNkCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNkCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNsCmluZGV4IDNkOWMyYTQuLmIwOWRlYTIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MueHNsCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jd2l0aGVudGl0eS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jd2l0aGVudGl0eS54bWwKaW5kZXggNjQzNWMzMi4uM2QxODZiMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvY3dpdGhlbnRpdHkueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2N3aXRoZW50aXR5LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5vU2NoZW1hLWludmFsaWQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5vU2NoZW1hLWludmFsaWQueG1sCmluZGV4IGVjNTgwODUuLmJjZWJlNmUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ub1NjaGVtYS1pbnZhbGlkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2Utbm9TY2hlbWEtaW52YWxpZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2Utbm9TY2hlbWEueG1sCmluZGV4IDdhZTU1OWQuLjNjYjgwOTQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ub1NjaGVtYS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5vU2NoZW1hLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS1ucy1uby1sb2NhdGlvbi54bWwKaW5kZXggM2ZlOTNjNy4uNzNhZGM3NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLW5zLW5vLWxvY2F0aW9uLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UtbnMtbm8tbG9jYXRpb24ueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlLnhtbAppbmRleCAzZmU5M2M3Li43M2FkYzc2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZW5kcGllY2UueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbmRwaWVjZTIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlMi54bWwKaW5kZXggZWVjNDlmNi4uNjI2OTY5YSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlMi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VuZHBpZWNlMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9lbnRpdHkueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VudGl0eS54bWwKaW5kZXggYTkzNDBlNS4uNjAxMzVlZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VudGl0eS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2VudGl0eS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9pc28tMjAyMi1qcC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvaXNvLTIwMjItanAueG1sCmluZGV4IGIzMjVlNmQuLjJjZGQ2YmYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9pc28tMjAyMi1qcC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2lzby0yMDIyLWpwLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3N0eWxlc2hlZXRfaW5jbHVkZS54c2wgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF9pbmNsdWRlLnhzbAppbmRleCA5YzFmZmFkLi4wYWMzYjBmIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF9pbmNsdWRlLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF9pbmNsdWRlLnhzbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3N0eWxlc2hlZXRfd2l0aF9pbmNsdWRlLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9zdHlsZXNoZWV0X3dpdGhfaW5jbHVkZS54c2wKaW5kZXggYjFmZWFjYS4uZGFmMjM0YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3N0eWxlc2hlZXRfd2l0aF9pbmNsdWRlLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvc3R5bGVzaGVldF93aXRoX2luY2x1ZGUueHNsCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdGVzdC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdGVzdC54bWwKaW5kZXggN2YyYWJlMC4uMGQzNWIxYyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC90ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3Rlc3QueHNsCmluZGV4IDhkMjhlYjMuLjllMzRmODAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC90ZXN0LnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdGVzdC54c2wKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC91dGYtOC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdXRmLTgueG1sCmluZGV4IGRiNDQyYTMuLjZlNjBmMGQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC91dGYtOC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3V0Zi04LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3ZhbGlkYXRlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC92YWxpZGF0ZS54bWwKaW5kZXggY2FkZTcyMi4uMmEwNDZkNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL3ZhbGlkYXRlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvdmFsaWRhdGUueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWx2YWxpZGF0ZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWx2YWxpZGF0ZS54bWwKaW5kZXggY2Q3Y2M0NS4uYjNkZjgzNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sdmFsaWRhdGUueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbHZhbGlkYXRlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0LnhtbAppbmRleCBkODcyZWE4Li44OWJlN2ZkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueG1sCmluZGV4IDgwZDkzMzYuLmYzYzRiNjEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWVuY29kaW5nLWluLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWVuY29kaW5nLWluLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWVuY29kaW5nLWluLnhzbAppbmRleCBmMTliZjgyLi4wZTkwMzQ3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1lbmNvZGluZy1pbi54c2wKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24tZW5jb2RpbmctaW4ueHNsCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54bWwKaW5kZXggYTRiMDI0Ny4uZTY0Y2ZkMSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW4ueHNsCmluZGV4IDg1MmQzOGEuLmI4YzExZDggMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluLnhzbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94c2x0bGlhaXNvbi1pbi54c2wKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54bWwKaW5kZXggYWViZWYzMy4uOTlkMDhiMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3hzbHRsaWFpc29uLWluY2x1ZGUueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54c2wKaW5kZXggOTg2ZjFiMy4uOTUzYzU2YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54c2wKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdGxpYWlzb24taW5jbHVkZS54c2wKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbAppbmRleCA5YTM0MzRjLi4zMTU2NWJkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wYXJhbGxlbC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcGFyYWxsZWwueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wYXRoY29udmVydC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wYXRoY29udmVydC54bWwKaW5kZXggNWExY2RmNy4uM2NhMzEwMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcGF0aGNvbnZlcnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhdGhjb252ZXJ0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJlc2V0ZGVmLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ByZXNldGRlZi54bWwKaW5kZXggNjk1NzQ3ZS4uYjI0NzY2MCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJlc2V0ZGVmLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcmVzZXRkZWYueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNyw3IEBACiAtLT4KIDxwcm9qZWN0PgogICA8cGF0aCBpZD0idGVzdC1jbGFzc2VzIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogICAKICAgPHRhcmdldCBuYW1lPSJzaW1wbGUiPgpAQCAtMTE5LDcgKzExOCw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJjb3JyZWN0X3Rhc2tuYW1lX2JhZGF0dHIiPgogICAgIDxwcmVzZXRkZWYgbmFtZT0ibXl0YXNrIj4KLSAgICAgICA8amF2YWMgc3JjZGlyPSJ3aGF0ZXZlciIvPgorICAgICAgPGphdmFjIHNyY2Rpcj0id2hhdGV2ZXIiLz4KICAgICA8L3ByZXNldGRlZj4KIAogICAgIDxqYXZhYyBzcmNkaXI9IndoYXRldmVyIiBiYWRhdHRyPSJ3aGF0ZXZlciIvPgpAQCAtMTI3LDcgKzEyNiw3IEBACiAKICAgPHRhcmdldCBuYW1lPSJjb3JyZWN0X3Rhc2tuYW1lX2JhZGVsIj4KICAgICA8cHJlc2V0ZGVmIG5hbWU9Im15dGFzayI+Ci0gICAgICAgPGphdmFjIHNyY2Rpcj0id2hhdGV2ZXIiLz4KKyAgICAgIDxqYXZhYyBzcmNkaXI9IndoYXRldmVyIi8+CiAgICAgPC9wcmVzZXRkZWY+CiAKICAgICA8amF2YWMgc3JjZGlyPSJ3aGF0ZXZlciI+CkBAIC0xMzUsMTMgKzEzNCwxMiBAQAogICAgIDwvamF2YWM+CiAgIDwvdGFyZ2V0PgogCi0gICAgPHRhcmdldCBuYW1lPSJwcmVzZXRkZWYtd2l0aC1uZXN0ZWQtZWxlbWVudC10d2ljZSI+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIuIj4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9Im5vbmV4aXN0ZW50Ii8+Ci0gICAgICAgIDwvY29weT4KLSAgICAgICAgPHByZXNldGRlZiBuYW1lPSJjb3B5Ij4KLSAgICAgICAgICAgIDxjb3B5IHZlcmJvc2U9InRydWUiLz4KLSAgICAgICAgPC9wcmVzZXRkZWY+Ci0gICAgPC90YXJnZXQ+Ci0KKyAgPHRhcmdldCBuYW1lPSJwcmVzZXRkZWYtd2l0aC1uZXN0ZWQtZWxlbWVudC10d2ljZSI+CisgICAgPGNvcHkgdG9kaXI9Ii4iPgorICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0ibm9uZXhpc3RlbnQiLz4KKyAgICA8L2NvcHk+CisgICAgPHByZXNldGRlZiBuYW1lPSJjb3B5Ij4KKyAgICAgIDxjb3B5IHZlcmJvc2U9InRydWUiLz4KKyAgICA8L3ByZXNldGRlZj4KKyAgPC90YXJnZXQ+CiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eS54bWwKaW5kZXggMmUwYzgzNS4uNDdkYjJhYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkxLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTEucHJvcGVydGllcwppbmRleCBlZjNlYmQzLi4xYzY4YTlkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTEucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTEucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTIucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5Mi5wcm9wZXJ0aWVzCmluZGV4IDgxMjUzMTIuLmFjNWI5NzYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5Mi5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5Mi5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5My5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkzLnByb3BlcnRpZXMKaW5kZXggYWMyMTYxMi4uNDgwN2E0NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkzLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHkzLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcHJvcGVydHk0LnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTQucHJvcGVydGllcwppbmRleCA2NTUyNzEwLi5mZWU1MjBkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTQucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTQucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9wcm9wZXJ0eTUucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5NS5wcm9wZXJ0aWVzCmluZGV4IGUxZWJjZDMuLjVmNWU5M2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5NS5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Byb3BlcnR5NS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyLnhtbAppbmRleCAxYzA3MzExLi5jMDA1YWFiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlcjIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVjb3JkZXIyLnhtbAppbmRleCBlMDkzY2Y1Li4yMjYyZDM5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZWNvcmRlcjIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlY29yZGVyMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlbmFtZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZW5hbWUueG1sCmluZGV4IGEyM2E4MWUuLmIwN2NlNzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlbmFtZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVuYW1lLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcmVwbGFjZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbAppbmRleCBhNDAzOWU1Li5iYjExOTk0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9yZXBsYWNlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9ybWljLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvcm1pYy54bWwKaW5kZXggZmU5OTczZS4uMDRiM2Y0ZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9ybWljLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ybWljL3JtaWMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMTcsMTIgKzIxNyw2IEBACiAgICAgPC9jb25kaXRpb24+CiAgICAgPHByb3BlcnR5IG5hbWU9InJtaWMuY29tcGlsZXIiIHZhbHVlPSJzdW4iLz4KICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ3bHJtaWMucHJlc2VudCIgY2xhc3NuYW1lPSJ3ZWJsb2dpYy5ybWljIi8+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0icm1pYzYucHJlc2VudCI+Ci0gICAgICA8YW5kPgotICAgICAgICA8aXNzZXQgcHJvcGVydHk9InJtaWMucHJlc2VudCIvPgotICAgICAgICA8YXZhaWxhYmxlIGNsYXNzbmFtZT0iamF2YS51dGlsLlNlcnZpY2VMb2FkZXIiLz4KLSAgICAgIDwvYW5kPgotICAgIDwvY29uZGl0aW9uPgogICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmExNSsiPgogICAgICAgPGphdmF2ZXJzaW9uIGF0bGVhc3Q9IjE1Ii8+CiAgICAgPC9jb25kaXRpb24+CkBAIC00NDMsMjMgKzQzNyw2IEBACiAgICAgPGFzc2VydEJhc2VDb21waWxlZC8+CiAgIDwvdGFyZ2V0PgogCi0gIDwhLS0KLSAgVGhpcyB0ZXN0IHN0YW1wcyBvbiB0aGUgWE1MIHBhcnNlciBzZXR0aW5ncyBvbiBqYXZhNiwgc28gaXQgaXMgZGlzYWJsZWQuCi0gIC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3RYbmV3IiBpZj0icm1pYy5wcmVzZW50IiB1bmxlc3M9InJtaWM2LnByZXNlbnQiIGRlcGVuZHM9ImluaXQiPgotICAgIDxiYXNlLXJtaWMgY29tcGlsZXI9IiR7cm1pYy5jb21waWxlcn0iPgotICAgICAgPGNvbXBpbGVyYXJnIHZhbHVlPSItWG5ldyIvPgotICAgIDwvYmFzZS1ybWljPgotICAgIDxhc3NlcnRCYXNlQ29tcGlsZWQvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RYbmV3RGVzdCIgaWY9InJtaWMucHJlc2VudCIgdW5sZXNzPSJybWljNi5wcmVzZW50IiBkZXBlbmRzPSJpbml0Ij4KLSAgICA8ZGVzdC1ybWljIGNvbXBpbGVyPSIke3JtaWMuY29tcGlsZXJ9Ij4KLSAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhuZXciLz4KLSAgICA8L2Rlc3Qtcm1pYz4KLSAgICA8YXNzZXJ0QmFzZUNvbXBpbGVkSW5EZXN0Lz4KLSAgPC90YXJnZXQ+Ci0KICAgPHRhcmdldCBuYW1lPSJ0ZXN0WG5ld0ZvcmtlZCIgaWY9InJtaWMucHJlc2VudCIgZGVwZW5kcz0iaW5pdCI+CiAgICAgPGJhc2Utcm1pYyBjb21waWxlcj0iZm9ya2luZyI+CiAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbmV3Ii8+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ybWljL3NyYy9BbnRUaW1lc3RhbXAuamF2YSBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL0FudFRpbWVzdGFtcC5qYXZhCmluZGV4IDU3OWQyZWQuLjI1ZThmNzMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL0FudFRpbWVzdGFtcC5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL0FudFRpbWVzdGFtcC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjEgKzE0LDE3IEBACiAgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi1pbXBvcnQgamF2YS5ybWkuUmVtb3RlOwogaW1wb3J0IGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRhdGVVdGlsczsKIAotCiAvKioKICAqIFRoaXMgY2xhc3MgaW1wb3J0cyBhIGRlcGVuZGVuY3kgb24gdGhlIEFudCBydW50aW1lIGNsYXNzZXMsCiAgKiBzbyB0ZXN0cyB0aGF0IGNsYXNzcGF0aCBzZXR1cCBpbmNsdWRlIHRoZW0KICAqLwogcHVibGljIGNsYXNzIEFudFRpbWVzdGFtcCBpbXBsZW1lbnRzIFJlbW90ZVRpbWVzdGFtcCB7CiAKLQogICAgIC8qKgogICAgICAqIHJldHVybiB0aGUgcGhhc2Ugb2YgdGhlIG1vb24uCiAgICAgICogTm90ZSB0aGUgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWNzIG9mIHRoZSBvdGhlciBpbXBsZW1lbnRhdGlvbiwKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcC5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wLmphdmEKaW5kZXggNWM5YWZjOC4uMDE4MTI2ZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wLmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ybWljL3NyYy9SZW1vdGVUaW1lc3RhbXBJbXBsLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9ybWljL3NyYy9SZW1vdGVUaW1lc3RhbXBJbXBsLmphdmEKaW5kZXggZjM2MTQ1Mi4uM2E4ZGU5MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy9zcmMvUmVtb3RlVGltZXN0YW1wSW1wbC5qYXZhCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvc3JjL1JlbW90ZVRpbWVzdGFtcEltcGwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDcgKzE0LDYgQEAKICAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLWltcG9ydCBqYXZhLnJtaS5SZW1vdGU7CiBpbXBvcnQgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwogCiAvKioKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NpZ25qYXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2lnbmphci54bWwKaW5kZXggMzhhMTM1OS4uN2QwYWIyNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2lnbmphci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2lnbmphci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDQyICsyMCwzOCBAQAogICA8aW1wb3J0IGZpbGU9Ii4uL2J1aWxkZmlsZXRlc3QtYmFzZS54bWwiLz4KIAogICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KLSAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InN1YmRpciIgbG9jYXRpb249IiR7b3V0cHV0fS9zdWJkaXIiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iLi4vLi4vLi4vYnVpbGQvY2xhc3NlcyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXN0LmphciIgbG9jYXRpb249IiR7b3V0cHV0fS9zaWdudGVzdC5qYXIiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InN1YmRpcnRlc3QuamFyIiBsb2NhdGlvbj0iJHtzdWJkaXJ9L3NpZ250ZXN0LmphciIgLz4KLQorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWJkaXIiIGxvY2F0aW9uPSIke291dHB1dH0vc3ViZGlyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9InRlc3QuamFyIiBsb2NhdGlvbj0iJHtvdXRwdXR9L3NpZ250ZXN0LmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzdWJkaXJ0ZXN0LmphciIgbG9jYXRpb249IiR7c3ViZGlyfS9zaWdudGVzdC5qYXIiLz4KICAgPC90YXJnZXQ+CiAKIAogICA8bWFjcm9kZWYgbmFtZT0iYXNzZXJ0U2lnbmVkIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImphciIgZGVmYXVsdD0iJHt0ZXN0Lmphcn0iIC8+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXIiIGRlZmF1bHQ9IiR7dGVzdC5qYXJ9Ii8+CiAgICAgPHNlcXVlbnRpYWw+Ci0gICAgICA8ZmFpbCBtZXNzYWdlPSJub3Qgc2lnbmVkOiBAe2phcn0iID4KKyAgICAgIDxmYWlsIG1lc3NhZ2U9Im5vdCBzaWduZWQ6IEB7amFyfSI+CiAgICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgPG5vdD48aXNzaWduZWQgZmlsZT0iQHtqYXJ9IiAvPjwvbm90PgorICAgICAgICAgIDxub3Q+PGlzc2lnbmVkIGZpbGU9IkB7amFyfSIvPjwvbm90PgogICAgICAgICA8L2NvbmRpdGlvbj4KICAgICAgIDwvZmFpbD4KICAgICA8L3NlcXVlbnRpYWw+CiAgIDwvbWFjcm9kZWY+CiAKICAgPHByZXNldGRlZiBuYW1lPSJzaWduLWJhc2UiPgotICAgIDxzaWduamFyIGFsaWFzPSJ0ZXN0b25seSIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKLSAgICAgICAgICAgc3RvcmVwYXNzPSJhcGFjaGVhbnQiLz4KKyAgICA8c2lnbmphciBhbGlhcz0idGVzdG9ubHkiIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiIHN0b3JlcGFzcz0iYXBhY2hlYW50Ii8+CiAgIDwvcHJlc2V0ZGVmPgogCiAgIDxwcmVzZXRkZWYgbmFtZT0idmVyaWZ5LWJhc2UiPgotICAgIDx2ZXJpZnlqYXIga2V5c3RvcmU9InRlc3RrZXlzdG9yZSIKLSAgICAgICAgICAgc3RvcmVwYXNzPSJhcGFjaGVhbnQiLz4KKyAgICA8dmVyaWZ5amFyIGtleXN0b3JlPSJ0ZXN0a2V5c3RvcmUiIHN0b3JlcGFzcz0iYXBhY2hlYW50Ii8+CiAgIDwvcHJlc2V0ZGVmPgogCiAgIDxwcmVzZXRkZWYgbmFtZT0ic2lnbiI+Ci0gICAgPHNpZ24tYmFzZSBqYXI9IiR7dGVzdC5qYXJ9IiAvPgorICAgIDxzaWduLWJhc2UgamFyPSIke3Rlc3QuamFyfSIvPgogICA8L3ByZXNldGRlZj4KIAogICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0ic2V0VXAiPgotICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0Lmphcn0iIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBpbmNsdWRlcz0iKiovVGFzay5jbGFzcyIvPgorICAgIDxqYXIgamFyZmlsZT0iJHt0ZXN0Lmphcn0iIGJhc2VkaXI9IiR7YnVpbGQuY2xhc3Nlcy52YWx1ZX0iIGluY2x1ZGVzPSIqKi9UYXNrLmNsYXNzIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iaGVscCI+CkBAIC02Myw3ICs1OSw3IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iYmFzaWMiIGRlcGVuZHM9ImphciI+Ci0gICAgPHNpZ24gLz4KKyAgICA8c2lnbi8+CiAgICAgPGFzc2VydFNpZ25lZC8+CiAgIDwvdGFyZ2V0PgogCkBAIC04NCwxNCArODAsMTIgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ1cmxLZXlzdG9yZUhUVFAiIGRlcGVuZHM9ImphciI+Ci0gICAgPHNpZ24KLSAgICAgIGtleXN0b3JlPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC90ZXN0a2V5c3RvcmUiCi0gICAgICAvPgorICAgIDxzaWduIGtleXN0b3JlPSJodHRwczovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvdGVzdGtleXN0b3JlIi8+CiAgICAgPGFzc2VydFNpZ25lZC8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFRzYUxvY2FsaG9zdCIgZGVwZW5kcz0iamFyIj4KLSAgICA8c2lnbiB0c2F1cmw9Imh0dHA6Ly9sb2NhbGhvc3Q6MC8iIC8+CisgICAgPHNpZ24gdHNhdXJsPSJodHRwOi8vbG9jYWxob3N0OjAvIi8+CiAgIDwvdGFyZ2V0PgogCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9za2luY29uZmlnLmR0ZCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NraW5jb25maWcuZHRkCmluZGV4IGJhMWI0ZGUuLjRkM2U2MzYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NraW5jb25maWcuZHRkCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NraW5jb25maWcuZHRkCkBAIC02LDcgKzYsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwKaW5kZXggZTE2MTMyMi4uNjI3ODkxOCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc2xlZXAueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NsZWVwLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvYnVpbGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvYnVpbGQueG1sCmluZGV4IGM5MWQxMGYuLjQyYWQ5M2QgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL2J1aWxkLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS9idWlsZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL2RhdGEueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvZGF0YS54bWwKaW5kZXggMjFlMjM5Ny4uNDA1YWU3ZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvZGF0YS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvZGF0YS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3ByaW50RmlsZW5hbWUueHNsIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRGaWxlbmFtZS54c2wKaW5kZXggZWIyY2JjNy4uNjgwZWFjNSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRGaWxlbmFtZS54c2wKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRGaWxlbmFtZS54c2wKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3ByaW50UGFyYW1zLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3ByaW50UGFyYW1zLnhzbAppbmRleCAxMTBlNDljLi4yZWFhMGU2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS9wcmludFBhcmFtcy54c2wKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvcHJpbnRQYXJhbXMueHNsCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdHlsZS90ZXN0TmV3ZXJTdHlsZXNoZWV0LnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3Rlc3ROZXdlclN0eWxlc2hlZXQueHNsCmluZGV4IGRmZjgxMjAuLmMwNDc1ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3Rlc3ROZXdlclN0eWxlc2hlZXQueHNsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N0eWxlL3Rlc3ROZXdlclN0eWxlc2hlZXQueHNsCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50LnhtbAppbmRleCA3ZGI1NDdhLi41ZjUwNGMzIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9nZW5lcmljc3ViYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9nZW5lcmljc3ViYW50LnhtbAppbmRleCBjNWJmYmUyLi4yYWJlOWJkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQvZ2VuZXJpY3N1YmFudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3ViYW50L2dlbmVyaWNzdWJhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQvc3ViYW50LXRlc3QxL215c3ViYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDEvbXlzdWJhbnQueG1sCmluZGV4IGVjYzYyODguLjMyMDkwOTEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDEvbXlzdWJhbnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDEvbXlzdWJhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQvc3ViYW50LXRlc3QyL215c3ViYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDIvbXlzdWJhbnQueG1sCmluZGV4IDVlZTg3NWYuLmZlNzVlOGYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDIvbXlzdWJhbnQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N1YmFudC9zdWJhbnQtdGVzdDIvbXlzdWJhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zeW5jLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N5bmMueG1sCmluZGV4IGQyZWIxMjYuLjQ0NWJhODMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N5bmMueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3N5bmMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMzgsNCArMTM4LDIzIEBACiAgICAgPC9zeW5jPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9ImNhc2VzZW5zaXRpdml0eS10ZXN0IiBkZXBlbmRzPSJzZXRVcCIgZGVzY3JpcHRpb249IlRlc3RzIHRoZSBidWcgZml4IGZvciBiei02Mjg5MCI+CisgICAgPG1rZGlyIGRpcj0iJHtzcmN9L2Nhc2VjaGVjayIvPgorICAgIDxta2RpciBkaXI9IiR7ZGVzdH0vY2FzZWNoZWNrIi8+CisgICAgPCEtLSBsb3dlciBjYXNlIGZpbGUgaW4gc291cmNlIGRpciAtLT4KKyAgICA8dG91Y2ggZmlsZT0iJHtzcmN9L2Nhc2VjaGVjay9hLnR4dCIvPgorICAgIDwhLS0gdXBwZXIgY2FzZSBmaWxlIGluIGRlc3QgZGlyIC0tPgorICAgIDx0b3VjaCBmaWxlPSIke2Rlc3R9L2Nhc2VjaGVjay9BLnR4dCIvPgorICAgIDwhLS0gc29tZSByYW5kb20gZmlsZSBpbiBzb3VyY2UgZGlyIC0tPgorICAgIDx0b3VjaCBmaWxlPSIke3NyY30vY2FzZWNoZWNrL2Zvby50eHQiLz4KKyAgICA8IS0tIHNvbWUgcmFuZG9tIGZpbGUgaW4gZGVzdCBkaXIgLS0+CisgICAgPHRvdWNoIGZpbGU9IiR7ZGVzdH0vY2FzZWNoZWNrL2Jhci50eHQiLz4KKworICAgIDxzeW5jIHRvZGlyPSIke2Rlc3R9L2Nhc2VjaGVjayIKKyAgICAgICAgICBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIgorICAgICAgICAgIG92ZXJ3cml0ZT0iZmFsc2UiPgorICAgICAgPGZpbGVzZXQgZGlyPSIke3NyY30vY2FzZWNoZWNrIi8+CisgICAgPC9zeW5jPgorICA8L3RhcmdldD4KKwogPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXIueG1sCmluZGV4IDJlZGEwYjUuLmIwZjk5ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcyLDYgKzE3MiwxMiBAQAogICAgIDx1bnRhciBzcmM9IiR7b3V0cHV0fS90ZXN0MTEudGFyLmJ6MiIgZGVzdD0iJHtvdXRwdXR9L3VudGFyIiBjb21wcmVzc2lvbj0iYnppcDIiLz4KICAgPC90YXJnZXQ+CiAKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0VGFyRmlsZXNldFdpdGhSZWZlcmVuY2UiPgorICAgIDxmaWxlc2V0IGlkPSJ4bWwuZmlsZXNldCIgZGlyPSIuIiBpbmNsdWRlcz0iKi54bWwiLz4KKyAgICA8dGFyIGRlc3RmaWxlPSIke291dHB1dH0vdGVzdHRhci50YXIiPgorICAgICAgPHRhcmZpbGVzZXQgcHJlZml4PSJwcmUiIHJlZmlkPSJ4bWwuZmlsZXNldCIvPgorICAgIDwvdGFyPgorICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImZlYXRoZXIiPgogICAgIDx0YXIgZGVzdGZpbGU9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYudGFyIgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGFza2RlZi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbAppbmRleCA0YjA2NThlLi5mMTdiMGJlIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90YXNrZGVmLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTMgKzE5LDExIEBACiA8cHJvamVjdCBuYW1lPSJ4eHgtdGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdDEiPgogCiAgIDxwYXRoIGlkPSJ0ZXN0Y2xhc3NlcyI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgIDwvcGF0aD4KIAotICA8dGFza2RlZiBuYW1lPSJnbG9iYWwiCi0gICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUudGFza3MuVGFza2RlZlRlc3RDb250YWluZXJUYXNrIj4KLSAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgPHRhc2tkZWYgbmFtZT0iZ2xvYmFsIiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnRhc2tzLlRhc2tkZWZUZXN0Q29udGFpbmVyVGFzayI+CisgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiLz4KICAgPC90YXNrZGVmPgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdDEiPgpAQCAtNDUsNDEgKzQzLDM5IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdDUiPgotICAgIDx0YXNrZGVmIG5hbWU9InRlc3QiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCIgLz4KKyAgICA8dGFza2RlZiBuYW1lPSJ0ZXN0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0NWEiPgotICAgIDx0YXNrZGVmIG5hbWU9InRlc3QiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weSIgLz4KKyAgICA8dGFza2RlZiBuYW1lPSJ0ZXN0IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkNvcHkiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0NiI+Ci0gICAgPHRhc2tkZWYgbmFtZT0idGVzdDYiCi0gICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS50YXNrcy5UYXNrZGVmVGVzdFNpbXBsZVRhc2siPgotICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiIC8+CisgICAgPHRhc2tkZWYgbmFtZT0idGVzdDYiIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUudGFza3MuVGFza2RlZlRlc3RTaW1wbGVUYXNrIj4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+CiAgICAgPC90YXNrZGVmPgogICAgIDx0ZXN0Nj4KLSAgICAgIDxlY2hvIG1lc3NhZ2U9IndvcmtlZCIgLz4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9IndvcmtlZCIvPgogICAgIDwvdGVzdDY+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdDciPgotICAgIDx0YXNrZGVmIG5hbWU9InRlc3Q3IgotICAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUudGFza3MuVGFza2RlZlRlc3RDb250YWluZXJUYXNrIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIiAvPgorICAgIDx0YXNrZGVmIG5hbWU9InRlc3Q3IiBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnRhc2tzLlRhc2tkZWZUZXN0Q29udGFpbmVyVGFzayI+CisgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIvPgogICAgIDwvdGFza2RlZj4KICAgICA8dGVzdDc+Ci0gICAgICA8ZWNobyBtZXNzYWdlPSJ3b3JrZWQiIC8+CisgICAgICA8ZWNobyBtZXNzYWdlPSJ3b3JrZWQiLz4KICAgICA8L3Rlc3Q3PgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3RHbG9iYWwiPgogICAgIDxnbG9iYWw+Ci0gICAgICA8ZWNobyBtZXNzYWdlPSJ3b3JrZWQiIC8+CisgICAgICA8ZWNobyBtZXNzYWdlPSJ3b3JrZWQiLz4KICAgICA8L2dsb2JhbD4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0T3ZlcnJpZGUiPgotICAgIDx0YXNrZGVmIG5hbWU9ImNvcHkiIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobyIgLz4KKyAgICA8dGFza2RlZiBuYW1lPSJjb3B5IiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iLz4KICAgICA8Y29weT5JbiB0YXJnZXQ8L2NvcHk+CiAgICAgPHNlcXVlbnRpYWw+CiAgICAgICA8Y29weT5JbiBUYXNrQ29udGFpbmVyPC9jb3B5PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVtcGxhdGUueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVtcGxhdGUueG1sCmluZGV4IDlmMzUxYzcuLjJhMGEzNzIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RlbXBsYXRlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZW1wbGF0ZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3QuYW50bGliLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3QuYW50bGliLnhtbAppbmRleCAzN2ZmN2Y4Li4yMWQyMDVjIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0LmFudGxpYi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdC5hbnRsaWIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0Mi5hbnRsaWIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGVzdDIuYW50bGliLnhtbAppbmRleCA5YTI1MDllLi5lZDJlODI5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90ZXN0Mi5hbnRsaWIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rlc3QyLmFudGxpYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50LnhtbAppbmRleCBlNmI0NjZhLi4xMjg4OWJiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudGNhbGwueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxhbnRjYWxsLnhtbAppbmRleCAyY2NhYmU3Li5mZGJlNzdiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudGNhbGwueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50Y2FsbC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsc3ViYW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsc3ViYW50LnhtbAppbmRleCBiN2EzYTM1Li5lZmRlNzFhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbHN1YmFudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxzdWJhbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3VjaC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3VjaC54bWwKaW5kZXggM2I0MjZkOS4uNzUwMzExZCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG91Y2gueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvdWNoLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDUsOCArNDUsOCBAQAogICAgIDwhLS0gdGhpcyBvbmUgaXMgYWJvdXQgMjEgeWVhcnMgYWZ0ZXIgdGhlIGVwb2NoIC0tPgogICAgIDwhLS0gbGVzcyB0aGFuIDIwIHllYXJzIGFmdGVyIHRoZSBlcG9jaCwgdGVzdCBkb2VzIG5vdCBwYXNzIG9uIG15IFdpbjJLL0ZBVCAtLT4KICAgICA8IS0tIEFudG9pbmUgRmVicnVhcnkgOCwgMjAwNCAtLT4KLSAgICA8IS0tIHNlZSBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDE3NzQzMi5odG1sIC0tPgotICAgIDwhLS0gYW5kIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80Njk3NzkyLmh0bWwgLS0+CisgICAgPCEtLSBzZWUgaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy00MTc3NDMyIC0tPgorICAgIDwhLS0gYW5kIGh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstNDY5Nzc5MiAtLT4KICAgICA8IS0tIG5vdCBzdXJlIHdoeSAtLT4KICAgICA8dG91Y2ggZmlsZT0idG91Y2h0ZXN0IiBtaWxsaXM9IjY2MjI1NjAwMDAwMCIgLz4KICAgPC90YXJnZXQ+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90eXBlYWRhcHRlci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90eXBlYWRhcHRlci54bWwKaW5kZXggYzJhYTcwZS4uYjM4MTZmNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWFkYXB0ZXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3R5cGVhZGFwdGVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTAgKzE3LDggQEAKIC0tPgogCiA8cHJvamVjdCBuYW1lPSJ0ZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJpbnZhbGlkIj4KLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjYXNlcy5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiLz4KICAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7dGVzdGNhc2VzLmRpcn0iIC8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9InRhc2thZGFwdGVyIj4KQEAgLTc0LDYgKzcyLDUgQEAKICAgICAgIG9uZXJyb3I9Imlnbm9yZSIvPgogICA8L3RhcmdldD4KIAotCiA8L3Byb2plY3Q+CiAKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3R5cGVkZWYueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwKaW5kZXggMWM3OTIyYi4uNDMyNWY0MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdHlwZWRlZi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDE2ICsyMywxNiBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImVtcHR5Ij4KLSAgICA8dHlwZWRlZiAvPgorICAgIDx0eXBlZGVmLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJub0NsYXNzbmFtZSI+Ci0gICAgPHR5cGVkZWYgbmFtZT0iZHVtbXkiIC8+CisgICAgPHR5cGVkZWYgbmFtZT0iZHVtbXkiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJub05hbWUiPgogICAgIDx0eXBlZGVmIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUudHlwZXMuVHlwZWRlZlRlc3RUeXBlIj4KLSAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIiAvPgorICAgICAgPGNsYXNzcGF0aCByZWZpZD0idGVzdGNsYXNzZXMiLz4KICAgICA8L3R5cGVkZWY+CiAgIDwvdGFyZ2V0PgogCkBAIC00MSwyNSArNDEsMjQgQEAKICAgPC90YXJnZXQ+CiAKICAgPHBhdGggaWQ9InRlc3RjbGFzc2VzIj4KLSAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDx0eXBlZGVmIG5hbWU9Imdsb2JhbCIKICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuZXhhbXBsZS50eXBlcy5UeXBlZGVmVGVzdFR5cGUiPgotICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIiAvPgorICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+CiAgIDwvdHlwZWRlZj4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3RHbG9iYWwiPgotICAgIDxnbG9iYWwgaWQ9Imdsb2JhbCIgLz4KKyAgICA8Z2xvYmFsIGlkPSJnbG9iYWwiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0TG9jYWwiPgogICAgIDx0eXBlZGVmIG5hbWU9ImxvY2FsdHlwZSIKICAgICAgICAgICAgICBjbGFzc25hbWU9Im9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSI+Ci0gICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0Y2xhc3NlcyIgLz4KKyAgICAgIDxjbGFzc3BhdGggcmVmaWQ9InRlc3RjbGFzc2VzIi8+CiAgICAgPC90eXBlZGVmPgotICAgIDxsb2NhbHR5cGUgaWQ9ImxvY2FsIiAvPgorICAgIDxsb2NhbHR5cGUgaWQ9ImxvY2FsIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZG91YmxlLW5vdHByZXNlbnQiPgpAQCAtNzksNiArNzgsNyBAQAogICA8L3RhcmdldD4KICAgCiAgIDx0YXJnZXQgbmFtZT0ibm9yZXNvdXJjZW5vdGZhaWwiPgotICAJPHR5cGVkZWYgcmVzb3VyY2U9InNvbWVub3RwcmVzZW50ZmlsZS5wcm9wZXJ0aWVzIiAvPgorICAJPHR5cGVkZWYgcmVzb3VyY2U9InNvbWVub3RwcmVzZW50ZmlsZS5wcm9wZXJ0aWVzIi8+CiAgIDwvdGFyZ2V0PgorCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnRhci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnRhci54bWwKaW5kZXggMDRkNDRiMy4uYTQ0M2UxMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW50YXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VudGFyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW56aXAueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdW56aXAueG1sCmluZGV4IGVlOTZlZTEuLjYzM2ZjN2MgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuemlwLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91bnppcC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VwdG9kYXRlLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VwdG9kYXRlLnhtbAppbmRleCAwNGJiMzcwLi4wNTIyMWNhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy91cHRvZGF0ZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdXB0b2RhdGUueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93YXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2FyLnhtbAppbmRleCBiMDAwZWNmLi5lYzQ2NzY0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93YXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3dhci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3doaWNocmVzb3VyY2UueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS54bWwKaW5kZXggMzUyZTljMC4uNjczNzc1OSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbG5zLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbG5zLnhtbAppbmRleCBlNjk5MTY2Li4wYmUwN2NjIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxucy54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1sbnMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxOCArMTgsMTUgQEAKIDxwcm9qZWN0IG5hbWU9InRlc3QiIHhtbG5zOm90aGVyPSJ0aGlzIGlzIHRoZSBvdGhlciB1cmkiCiAgICAgICAgICBvdGhlcjphdHRyPSJ0aGlzIHNob3VsZCBiZSBpZ25vcmVkIGJ5IGFudCI+CiAKLSAgPHByb3BlcnR5IG5hbWU9InRlc3RjYXNlcy5kaXIiIGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiLz4KLQogICA8cGF0aCBpZD0idGVzdGNsYXNzZXMiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHt0ZXN0Y2FzZXMuZGlyfSIgLz4KLSAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9IiAvPgorICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KICAgPC9wYXRoPgogCiAgIDx0YXJnZXQgbmFtZT0ieG1sbnMiIHhtbG5zOnRlc3Q9InRoaXMuaXMuYW5vdGhlci50ZXN0LnVyaSI+CiAgICAgPHR5cGVkZWYgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YbWxuc1Rlc3QkTXlUYXNrIgogICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiCiAgICAgICAgICAgICAgbmFtZT0ibXl0YXNrIgotICAgICAgICAgICAgIHVyaT0idGhpcy5pcy5hbm90aGVyLnRlc3QudXJpIiAvPgorICAgICAgICAgICAgIHVyaT0idGhpcy5pcy5hbm90aGVyLnRlc3QudXJpIi8+CiAgICAgPHRlc3Q6bXl0YXNrLz4KICAgPC90YXJnZXQ+CiAKQEAgLTQ2LDIyICs0MywyMCBAQAogICA8dGFyZ2V0IG5hbWU9InhtbG5zLmZpbGUiIHhtbG5zOnRlc3Q9InRoaXMuaXMuYS50ZXN0LnVyaSI+CiAgICAgPHR5cGVkZWYgZmlsZT0idGVzdC5hbnRsaWIueG1sIgogICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiCi0gICAgICAgICAgICAgdXJpPSJ0aGlzLmlzLmEudGVzdC51cmkiIC8+CisgICAgICAgICAgICAgdXJpPSJ0aGlzLmlzLmEudGVzdC51cmkiLz4KICAgICA8dGVzdDpteXRhc2svPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9ImNvcmUiPgogICAgIDx0eXBlZGVmIGZpbGU9InRlc3QuYW50bGliLnhtbCIKICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgotICAgICAgICAgICAgIHVyaT0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50IiAvPgorICAgICAgICAgICAgIHVyaT0iYW50bGliOm9yZy5hcGFjaGUudG9vbHMuYW50Ii8+CiAgICAgPG15dGFzay8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZXhjbHVkZWQiPgogICAgIDx0eXBlZGVmIGZpbGU9InRlc3QuYW50bGliLnhtbCIKICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9InRlc3RjbGFzc2VzIgotICAgICAgICAgICAgIHVyaT0iYW50Om5vdGFsbG93ZWQiIC8+CisgICAgICAgICAgICAgdXJpPSJhbnQ6bm90YWxsb3dlZCIvPgogICA8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkueG1sCmluZGV4IGExOWViNmMuLjAxOTUyMjkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwppbmRleCBkNjBjYmFiLi5kYzE5ZjVjIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLWlucHV0MS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKaW5kZXggY2UwNWUxOC4uZDEyNzc4MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LWNvbGxhcHNlLW92ZXJyaWRlLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2Utb3ZlcnJpZGUucHJvcGVydGllcwppbmRleCAzM2Y4NjExLi5hYzE2YTQzIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2Utb3ZlcnJpZGUucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3QtY29sbGFwc2Utb3ZlcnJpZGUucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtbm9jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LW5vY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcwppbmRleCA0N2UwYzJkLi4yYjNkYWY0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtbm9jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWluY2x1ZGUucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1pbmNsdWRlLnByb3BlcnRpZXMKaW5kZXggZDYwY2JhYi4uZGMxOWY1YyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWluY2x1ZGUucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtc2VtYW50aWMtaW5jbHVkZS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1pbnB1dDEucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1pbnB1dDEucHJvcGVydGllcwppbmRleCA0NmI4MDdiLi41YjEzOWU2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMva2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLWlucHV0MS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9rZWVwcm9vdC1zZW1hbnRpYy1vdmVycmlkZS5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLW92ZXJyaWRlLnByb3BlcnRpZXMKaW5kZXggMzNmODYxMS4uYWMxNmE0MyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLW92ZXJyaWRlLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL2tlZXByb290LXNlbWFudGljLW92ZXJyaWRlLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3QtY29sbGFwc2UtaW5wdXQxLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwppbmRleCA3Y2ZkMjllLi5mM2EyYjU2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1pbnB1dDEucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3QtY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcwppbmRleCA1ODQyYzM4Li4wOTllOWIyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LWNvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1tdWx0aS5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1tdWx0aS5wcm9wZXJ0aWVzCmluZGV4IDllZjkwZWYuLmQzMTcwMmQgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LW5vY29sbGFwc2UtbXVsdGkucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1ub2NvbGxhcHNlLW11bHRpLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtbm9jb2xsYXBzZS1vcmlnaW5hbC5wcm9wZXJ0aWVzCmluZGV4IDU1MGYyMTMuLjQyMWVlNzYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LW5vY29sbGFwc2Utb3JpZ2luYWwucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1ub2NvbGxhcHNlLW9yaWdpbmFsLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5jbHVkZS1pbnB1dDEucHJvcGVydGllcyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLWluY2x1ZGUtaW5wdXQxLnByb3BlcnRpZXMKaW5kZXggN2NmZDI5ZS4uZjNhMmI1NiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5jbHVkZS1pbnB1dDEucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1pbmNsdWRlLWlucHV0MS5wcm9wZXJ0aWVzCkBAIC01LDcgKzUsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLWlucHV0MS5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKaW5kZXggNWRmY2ZiNS4uNjdhY2Q2MCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtaW5wdXQxLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtbG9jYXRpb25zLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1sb2NhdGlvbnMucHJvcGVydGllcwppbmRleCBmOTQ1ZDdjLi45YWJjNDZmIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1sb2NhdGlvbnMucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1sb2NhdGlvbnMucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1wYXRocy5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtcGF0aHMucHJvcGVydGllcwppbmRleCAxYmY1MWRlLi5iYTBmOTIwIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1wYXRocy5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXBhdGhzLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtcmVmZXJlbmNlcy5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvZ29sZGZpbGVzL25va2VlcHJvb3Qtc2VtYW50aWMtcmVmZXJlbmNlcy5wcm9wZXJ0aWVzCmluZGV4IGU1NTkxM2EuLjVkNTJhNDkgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2dvbGRmaWxlcy9ub2tlZXByb290LXNlbWFudGljLXJlZmVyZW5jZXMucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9nb2xkZmlsZXMvbm9rZWVwcm9vdC1zZW1hbnRpYy1yZWZlcmVuY2VzLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL2lucHV0MS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvaW5wdXQxLnhtbAppbmRleCAyODMyOGM1Li5lZWFiNThmIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvaW5wdXQxLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvaW5wdXQxLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL2xvY2F0aW9ucy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbG9jYXRpb25zLnhtbAppbmRleCBkNWNhY2U4Li5lMTE0ZmM3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbG9jYXRpb25zLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbG9jYXRpb25zLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL211bHRpLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9tdWx0aS54bWwKaW5kZXggNjY5MDRkNi4uNjYzZjBkYiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL211bHRpLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvbXVsdGkueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvb3JpZ2luYWwueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL29yaWdpbmFsLnhtbAppbmRleCBlZjI2MDNjLi5hNTM1YjY1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvb3JpZ2luYWwueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vcmlnaW5hbC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vdmVycmlkZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvb3ZlcnJpZGUueG1sCmluZGV4IGM3ZGE5YzQuLmQzY2E0NjcgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9vdmVycmlkZS54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL292ZXJyaWRlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3BhdGhzLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9wYXRocy54bWwKaW5kZXggODM0MjJkOS4uMzZmZjE5YiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3BhdGhzLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvcGF0aHMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvcmVmZXJlbmNlcy54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMvcmVmZXJlbmNlcy54bWwKaW5kZXggN2U4OGI3Yi4uMjFlMmQ5OCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHkvaW5wdXRzL3JlZmVyZW5jZXMueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5L2lucHV0cy9yZWZlcmVuY2VzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS5kdGQgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLmR0ZAppbmRleCA1ZDc1ZDZlLi40MWY3MjY1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLmR0ZAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLmR0ZApAQCAtNiw3ICs2LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfZGF0YS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLnhtbAppbmRleCA1ZjkyMjIxLi42N2E3MjFiIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9kYXRhLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfbmVlZHNjYXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfbmVlZHNjYXQueG1sCmluZGV4IDk0MmExODMuLjc3NWQ5ZjIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5X25lZWRzY2F0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eV9uZWVkc2NhdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3htbHByb3BlcnR5X3dpdGhkdGQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfd2l0aGR0ZC54bWwKaW5kZXggMWU5NmNkYi4uNGFmOTdiNiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfd2l0aGR0ZC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1scHJvcGVydHlfd2l0aGR0ZC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy96aXAueG1sCmluZGV4IDYxYTU0YTMuLjFjMDNlYjggMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ppcC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvemlwLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYWRkdHlwZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hZGR0eXBlLnhtbAppbmRleCBjYzhmZjI0Li5jZDQ5Njc4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hZGR0eXBlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hZGR0eXBlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTcsMzggKzU3LDM3IEBACiAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+CiAgICAgPHByb3BlcnR5IG5hbWU9Im5lc3RlZC5wYWNrYWdlIiB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuIi8+CiAgICAgPHBhdGggaWQ9InRlc3QtY2xhc3NlcyI+Ci0gICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249Ii4uLy4uLy4uLy4uL2J1aWxkL3Rlc3RjYXNlcyIgLz4KLSAgICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgICAgPC9wYXRoPgogICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIgY2xhc3NwYXRocmVmPSJ0ZXN0LWNsYXNzZXMiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuYSIKKyAgICAgICAgICAgICBuYW1lPSJuZXN0ZWQuYSIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkQUltcGwiLz4KICAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuYiIKKyAgICAgICAgICAgICBuYW1lPSJuZXN0ZWQuYiIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkQkltcGwiLz4KICAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuYyIKKyAgICAgICAgICAgICBuYW1lPSJuZXN0ZWQuYyIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkQ0ltcGwiLz4KICAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuYWIiCisgICAgICAgICAgICAgbmFtZT0ibmVzdGVkLmFiIgogICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRBQkltcGwiLz4KICAgICA8dGFza2RlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuY29udGFpbmVyIiAKKyAgICAgICAgICAgICBuYW1lPSJuZXN0ZWQuY29udGFpbmVyIgogICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCROZXN0ZWRDb250YWluZXIiLz4KICAgICA8dGFza2RlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuY29uZGl0aW9uLnRhc2siIAorICAgICAgICAgICAgIG5hbWU9Im5lc3RlZC5jb25kaXRpb24udGFzayIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkTXlDb25kaXRpb24iLz4KICAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJuZXN0ZWQuY29uZGl0aW9uLnR5cGUiIAorICAgICAgICAgICAgIG5hbWU9Im5lc3RlZC5jb25kaXRpb24udHlwZSIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkTXlDb25kaXRpb24iLz4KICAgICA8dHlwZWRlZiBsb2FkZXJyZWY9Im5lc3RlZC5sb2FkZXIiCi0gICAgICAgICAgICAgbmFtZSA9ICJteWFkZGNvbmZpZ3VyZWQiIAorICAgICAgICAgICAgIG5hbWU9Im15YWRkY29uZmlndXJlZCIKICAgICAgICAgICAgICBjbGFzc25hbWU9IiR7bmVzdGVkLnBhY2thZ2V9QWRkVHlwZVRlc3QkTXlBZGRDb25maWd1cmVkIi8+CiAgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJuZXN0ZWQubG9hZGVyIgotICAgICAgICAgICAgIG5hbWUgPSAibXlhZGRjb25maWd1cmVkdmFsdWUiIAorICAgICAgICAgICAgIG5hbWU9Im15YWRkY29uZmlndXJlZHZhbHVlIgogICAgICAgICAgICAgIGNsYXNzbmFtZT0iJHtuZXN0ZWQucGFja2FnZX1BZGRUeXBlVGVzdCRNeUFkZENvbmZpZ3VyZWRWYWx1ZSIvPgogICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0ibmVzdGVkLmxvYWRlciIKLSAgICAgICAgICAgICBuYW1lID0gIm15dmFsdWUiIAorICAgICAgICAgICAgIG5hbWU9Im15dmFsdWUiCiAgICAgICAgICAgICAgY2xhc3NuYW1lPSIke25lc3RlZC5wYWNrYWdlfUFkZFR5cGVUZXN0JE15VmFsdWUiLz4KICAgPC90YXJnZXQ+CiAKQEAgLTE2MCw0ICsxNTksNSBAQAogICAgICAgPHByZWZpeDplcSBhcmcxPSJhIiBhcmcyPSJiIi8+CiAgICAgPC9jb25kaXRpb24+CiAgIDwvdGFyZ2V0PgorCiA8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sCmluZGV4IGRlZTdjZTcuLjhiMWU2YmMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSwxMSArMjEsNyBAQAogICA8aW1wb3J0IGZpbGU9Ii4uL2J1aWxkZmlsZXRlc3QtYmFzZS54bWwiLz4KIAogICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KLSAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjYrIiBjbGFzc25hbWU9ImphdmEubmV0LkNvb2tpZVN0b3JlIi8+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ic291cmNlIiB2YWx1ZT0iNiI+Ci0gICAgICA8aXNzZXQgcHJvcGVydHk9ImpkazEuNisiLz4KLSAgICA8L2NvbmRpdGlvbj4KLSAgICA8cHJvcGVydHkgbmFtZT0ic291cmNlIiB2YWx1ZT0iMS40Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZSIgdmFsdWU9IjgiLz4KICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0iLz4KICAgICA8amF2YWMgc3JjZGlyPSIke3NyYy5kaXJ9IgogICAgICAgICAgICBpbmNsdWRlcz0iKi5qYXZhIgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25NYWluLmphdmEgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zL0Fzc2VydGlvbk1haW4uamF2YQppbmRleCBiYzg4NTNiLi5lZjJiMjc3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zL0Fzc2VydGlvbk1haW4uamF2YQorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hc3NlcnRpb25zL0Fzc2VydGlvbk1haW4uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMvQXNzZXJ0aW9uVGVzdC5qYXZhIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25UZXN0LmphdmEKaW5kZXggZDcxNzIwMy4uOTliNDFjMyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25UZXN0LmphdmEKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvYXNzZXJ0aW9ucy9Bc3NlcnRpb25UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjEueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24xLnhtbAppbmRleCA4NmEyYTE2Li5iNTZhYTFlIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjEueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjIueG1sCmluZGV4IDk0NWJjMjAuLjg2Yjc3MGMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24yLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24zLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMy54bWwKaW5kZXggYWY1ZGRhMS4uMzBjNmQ5ZSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb24zLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjMueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzY3JpcHRpb240LnhtbAppbmRleCAyMmRmOWMyLi42Y2FmMDY0IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uNC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVsaXN0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVsaXN0LnhtbAppbmRleCBmODU0ZGRiLi43ODFiNTc4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWxlbGlzdC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsZWxpc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWxlc2V0LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVzZXQueG1sCmluZGV4IGMwZjY5NDkuLmU2ZGM5ODUgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVzZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbGVzZXQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmlsdGVyc2V0LnhtbAppbmRleCBiZjI5MWU3Li5mNmI2OTk3IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWx0ZXJzZXQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZpbHRlcnNldC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZsZXhpbnRlZ2VyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2ZsZXhpbnRlZ2VyLnhtbAppbmRleCBhYTEwYWEwLi5kNWUyZTk4IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9mbGV4aW50ZWdlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZmxleGludGVnZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNSArMTgsMTMgQEAKIDxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9InRlc3QiIGJhc2VkaXI9Ii4iPgogCiAgIDxwYXRoIGlkPSJ0ZXN0Y2xhc3NlcyI+Ci0gICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIuLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiIC8+Ci0gICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIgLz4KKyAgICA8cGF0aGVsZW1lbnQgcGF0aD0iJHtqYXZhLmNsYXNzLnBhdGh9Ii8+CiAgIDwvcGF0aD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3QiPgogICAgIDx0YXNrZGVmIG5hbWU9ImZsZXhpbnQiCiAgICAgICAgICAgICAgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GbGV4SW50ZWdlclRlc3QiCi0gICAgICAgICAgICAgY2xhc3NwYXRocmVmPSJ0ZXN0Y2xhc3NlcyIKLSAgICAvPgorICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0idGVzdGNsYXNzZXMiLz4KICAgICAgICAgICAgIAogICAgIDxmbGV4aW50IHByb3BuYW1lPSJmbGV4aW50LnZhbHVlMSIgdmFsdWU9IjB4QSIvPgogICAgIDxmbGV4aW50IHByb3BuYW1lPSJmbGV4aW50LnZhbHVlMiIgdmFsdWU9IjAxMCIvPgpkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlci54bWwKaW5kZXggYTk2ZjEwYy4uMzdmNDBhMCAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2RlZmluZS5tYXBwZXJyZXN1bHQueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9kZWZpbmUubWFwcGVycmVzdWx0LnhtbAppbmRleCBkOTE1MmExLi4wYzI4YmZhIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2RlZmluZS5tYXBwZXJyZXN1bHQueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvZGVmaW5lLm1hcHBlcnJlc3VsdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDcgKzE3LDcgQEAKIC0tPgogPHByb2plY3Q+CiAgIDx0eXBlZGVmIG5hbWU9Im1hcHBlcnJlc3VsdCIKLSAgICAgICAgICAgY2xhc3NwYXRoPSIuLi8uLi8uLi8uLi8uLi9idWlsZC90ZXN0Y2FzZXMiCisgICAgICAgICAgIGNsYXNzcGF0aD0iJHtidWlsZC50ZXN0cy52YWx1ZX0iCiAgICAgICAgICAgIGNsYXNzbmFtZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMubWFwcGVycy5NYXBwZXJSZXN1bHQiLz4KIAogICA8IS0tIHRoaXMgaXMgd2hhdCB5b3UgZ2V0IHdpdGggbm8gcmVzdWx0IC0tPiAgICAgICAgICAgCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2dsb2JtYXBwZXIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9nbG9ibWFwcGVyLnhtbAppbmRleCAxNjY2ZDgxLi44ZDc5Nzk5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL2dsb2JtYXBwZXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvZ2xvYm1hcHBlci54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvcmVnZXhwbWFwcGVyLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvcmVnZXhwbWFwcGVyLnhtbAppbmRleCBhODVjNDljLi4wOGYwZGVkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3JlZ2V4cG1hcHBlci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9yZWdleHBtYXBwZXIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3NjcmlwdG1hcHBlci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9tYXBwZXJzL3NjcmlwdG1hcHBlci54bWwKaW5kZXggZDNlN2E4ZC4uMDViZDAzMiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvbWFwcGVycy9zY3JpcHRtYXBwZXIueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL21hcHBlcnMvc2NyaXB0bWFwcGVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcG9seS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wb2x5LnhtbAppbmRleCBjYWJmOWVjLi5iNzIwNDljIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wb2x5LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9wb2x5LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTkgKzIwLDE4IEBACiAgIDxwcm9wZXJ0eSBuYW1lPSJjIiB2YWx1ZT0ib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUG9seVRlc3QiLz4KICAgCiAgIDxwYXRoIGlkPSJ0ZXN0LWMiPgotICAgIDxwYXRoZWxlbWVudCBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvdGVzdGNhc2VzIiAvPgotICAgIDxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iIC8+CisgICAgPHBhdGhlbGVtZW50IHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgogICA8L3BhdGg+CiAKICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHlwZWRlZiBsb2FkZXJyZWY9InBvbHkiICAgY2xhc3NwYXRocmVmPSJ0ZXN0LWMiCi0gICAgICAgICAgICAgbmFtZSA9ICJteWZpbGVzZXQiIGNsYXNzbmFtZT0iJHtjfSRNeUZpbGVTZXQiLz4KKyAgICA8dHlwZWRlZiBsb2FkZXJyZWY9InBvbHkiIGNsYXNzcGF0aHJlZj0idGVzdC1jIgorICAgICAgICAgICAgIG5hbWU9Im15ZmlsZXNldCIgY2xhc3NuYW1lPSIke2N9JE15RmlsZVNldCIvPgogCiAgICAgPHR5cGVkZWYgbG9hZGVycmVmPSJwb2x5IiBjbGFzc3BhdGhyZWY9InRlc3QtYyIKLSAgICAgICAgICAgICBuYW1lID0gIm15cGF0aCIgIGNsYXNzbmFtZT0iJHtjfSRNeVBhdGgiLz4KKyAgICAgICAgICAgICBuYW1lPSJteXBhdGgiICAgIGNsYXNzbmFtZT0iJHtjfSRNeVBhdGgiLz4KIAogICAgIDx0eXBlZGVmIGxvYWRlcnJlZj0icG9seSIgY2xhc3NwYXRocmVmPSJ0ZXN0LWMiCi0gICAgICAgICAgICAgbmFtZSA9ICJteXRhc2siICBjbGFzc25hbWU9IiR7Y30kTXlUYXNrIi8+CisgICAgICAgICAgICAgbmFtZT0ibXl0YXNrIiAgICBjbGFzc25hbWU9IiR7Y30kTXlUYXNrIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0iZmlsZXNldCIgZGVwZW5kcz0iaW5pdCI+CmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9xdW90ZTEueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcXVvdGUxLnhtbAppbmRleCA4ZTc3MTIyLi40NDllZjg2IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9xdW90ZTEueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3F1b3RlMS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3F1b3RlMi54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9xdW90ZTIueG1sCmluZGV4IGVmOWEzYzMuLjE5N2M5NzYgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3F1b3RlMi54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcXVvdGUyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVkaXJlY3Rvci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZWRpcmVjdG9yLnhtbAppbmRleCA0Nzg0ZTlmLi5lNzBhMDU1IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZWRpcmVjdG9yLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZWRpcmVjdG9yLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL2phdmFyZXNvdXJjZS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLnhtbAppbmRleCA4MzI2NzYyLi5mNGI2MDYyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL3Jlc291cmNlbGlzdC54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VsaXN0LnhtbAppbmRleCBmMWFjNmRmLi42NjI4MzUyIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VsaXN0LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VsaXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL3RhcmVudHJ5LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy90YXJlbnRyeS54bWwKaW5kZXggYzBmYTM3OS4uNmQ1MmNjYSAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzL3RhcmVudHJ5LnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9yZXNvdXJjZXMvdGFyZW50cnkueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzLnhtbAppbmRleCA1YTgwZDA0Li4yY2E2Yzc5IDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zY3JpcHRzZWxlY3Rvci54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMvc2NyaXB0c2VsZWN0b3IueG1sCmluZGV4IDgwYWZlMzAuLjIzZjMzNjIgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zY3JpcHRzZWxlY3Rvci54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NjcmlwdHNlbGVjdG9yLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NpZ25lZHNlbGVjdG9yLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zaWduZWRzZWxlY3Rvci54bWwKaW5kZXggNjBmZTk0MC4uNmYxNzdmYyAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvc2VsZWN0b3JzL3NpZ25lZHNlbGVjdG9yLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9zZWxlY3RvcnMvc2lnbmVkc2VsZWN0b3IueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sCmluZGV4IDYzMjY5ZjcuLmQ5N2MxNDAgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhzbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueHNsCmluZGV4IGEyYzgzOWMuLjE2MDk2ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueHNsCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueHNsCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nMS54bWwgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nMS54bWwKaW5kZXggZDRiNTQ2MS4uMjQwNGVmZiAxMDA2NDQKLS0tIGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZzEueG1sCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cxLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZzIueG1sIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sY2F0YWxvZzIueG1sCmluZGV4IDlkMmJlZDAuLmU1N2E5YzEgMTAwNjQ0Ci0tLSBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cyLnhtbAorKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nMi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGZyYWdtZW50LnhtbCBiL3NyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGZyYWdtZW50LnhtbAppbmRleCA3NTIxNGQ2Li41ZGNmN2YxIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxmcmFnbWVudC54bWwKKysrIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMveG1sZnJhZ21lbnQueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3NpbXBsZS5wcm9wZXJ0aWVzIGIvc3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcwppbmRleCA1NTA5MDhjLi41YzhlYjljIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3NpbXBsZS5wcm9wZXJ0aWVzCisrKyBiL3NyYy9ldGMvdGVzdGNhc2VzL3V0aWwvc2ltcGxlLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC91bnVzdWFsLnByb3BlcnRpZXMgYi9zcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3VudXN1YWwucHJvcGVydGllcwppbmRleCAzYjYzZGU2Li5lN2Q1MDVkIDEwMDY0NAotLS0gYS9zcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3VudXN1YWwucHJvcGVydGllcworKysgYi9zcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3VudXN1YWwucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXIuamF2YQppbmRleCA3ZjM3ZmJjLi4xODkzNTFmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxMiArMjAsMTIgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkNvZGVTb3VyY2U7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm90ZWN0aW9uRG9tYWluOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKQEAgLTQyLDEzICs0MywxNiBAQAogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5Mb2NhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db2xsZWN0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Mb2FkZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlZmxlY3RVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5WZWN0b3JTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwTG9uZzsKQEAgLTc0LDYgKzc4LDMxIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfQVRMRUFTVF9KQVZBOSA9IEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KTsKKyAgICAvLyBjb25zdHJ1Y3RzIG5lZWRlZCB0byBjcmVhdGUgKHZpYSByZWZsZWN0aW9uKSBhIGphdmEudXRpbC5qYXIuSmFyRmlsZSBpbnN0YW5jZSB3aGVuIEphdmEgcnVudGltZSB2ZXJzaW9uIGlzID49IDkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc1tdIE1SX0pBUkZJTEVfQ1RPUl9BUkdTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBNUl9KQVJGSUxFX0NUT1JfUlVOVElNRV9WRVJTSU9OX1ZBTDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHJlZ2lzdGVyQXNQYXJhbGxlbENhcGFibGUoKTsKKyAgICAgICAgaWYgKElTX0FUTEVBU1RfSkFWQTkpIHsKKyAgICAgICAgICAgIENsYXNzW10gY3RvckFyZ3MgPSBudWxsOworICAgICAgICAgICAgT2JqZWN0IHJ1bnRpbWVWZXJzaW9uVmFsID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcnVudGltZVZlcnNpb25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEubGFuZy5SdW50aW1lJFZlcnNpb24iKTsKKyAgICAgICAgICAgICAgICBjdG9yQXJncyA9IG5ldyBDbGFzc1tdIHtGaWxlLmNsYXNzLCBib29sZWFuLmNsYXNzLCBpbnQuY2xhc3MsIHJ1bnRpbWVWZXJzaW9uQ2xhc3N9OworICAgICAgICAgICAgICAgIHJ1bnRpbWVWZXJzaW9uVmFsID0gUnVudGltZS5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgidmVyc2lvbiIpLmludm9rZShudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIC0gd2UgY29uc2lkZXIgdGhpcyBhcyBtdWx0aS1yZWxlYXNlIGphciB1bnN1cHBvcnRlZAorICAgICAgICAgICAgfQorICAgICAgICAgICAgTVJfSkFSRklMRV9DVE9SX0FSR1MgPSBjdG9yQXJnczsKKyAgICAgICAgICAgIE1SX0pBUkZJTEVfQ1RPUl9SVU5USU1FX1ZFUlNJT05fVkFMID0gcnVudGltZVZlcnNpb25WYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNUl9KQVJGSUxFX0NUT1JfQVJHUyA9IG51bGw7CisgICAgICAgICAgICBNUl9KQVJGSUxFX0NUT1JfUlVOVElNRV9WRVJTSU9OX1ZBTCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgcmVzb3VyY2VzIG9mIGEgZ2l2ZW4gbmFtZSBmb3VuZCB3aXRoaW4gdGhlCiAgICAgICogY2xhc3NwYXRoIG9mIHRoaXMgY2xhc3MgbG9hZGVyLiBUaGlzIGVudW1lcmF0aW9uIGlzIHVzZWQgYnkgdGhlCkBAIC0xNzQsNyArMjAzLDcgQEAKICAgICAgKiBUaGUgY29tcG9uZW50cyBvZiB0aGUgY2xhc3NwYXRoIHRoYXQgdGhlIGNsYXNzbG9hZGVyIHNlYXJjaGVzCiAgICAgICogZm9yIGNsYXNzZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsZT4gcGF0aENvbXBvbmVudHMgID0gbmV3IFZlY3RvclNldDxGaWxlPigpOworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEZpbGU+IHBhdGhDb21wb25lbnRzICA9IG5ldyBWZWN0b3JTZXQ8PigpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHByb2plY3QgdG8gd2hpY2ggdGhpcyBjbGFzcyBsb2FkZXIgYmVsb25ncy4KQEAgLTE5MiwxNCArMjIxLDE0IEBACiAgICAgICogbG9hZGVyIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBpcyBiZWluZyBzZWFyY2hlZAogICAgICAqIGZpcnN0IG9yIG5vdC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHN5c3RlbVBhY2thZ2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBzeXN0ZW1QYWNrYWdlcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogVGhlc2UgYXJlIHRoZSBwYWNrYWdlIHJvb3RzIHRoYXQgYXJlIHRvIGJlIGxvYWRlZCBieSB0aGlzIGNsYXNzIGxvYWRlcgogICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGFyZW50IGNsYXNzIGxvYWRlciBpcyBiZWluZyBzZWFyY2hlZCBmaXJzdAogICAgICAqIG9yIG5vdC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGxvYWRlclBhY2thZ2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBsb2FkZXJQYWNrYWdlcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogV2hldGhlciBvciBub3QgdGhpcyBjbGFzc2xvYWRlciB3aWxsIGlnbm9yZSB0aGUgYmFzZQpAQCAtMjE3LDExICsyNDYsMTEgQEAKICAgICAvKioKICAgICAgKiBBIGhhc2h0YWJsZSBvZiB6aXAgZmlsZXMgb3BlbmVkIGJ5IHRoZSBjbGFzc2xvYWRlciAoRmlsZSB0byBKYXJGaWxlKS4KICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZTxGaWxlLCBKYXJGaWxlPiBqYXJGaWxlcyA9IG5ldyBIYXNodGFibGU8RmlsZSwgSmFyRmlsZT4oKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxGaWxlLCBKYXJGaWxlPiBqYXJGaWxlcyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqIFN0YXRpYyBtYXAgb2YgamFyIGZpbGUvdGltZSB0byBtYW5pZmVzdCBjbGFzcy1wYXRoIGVudHJpZXMgKi8KICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhdGhNYXAgPQotICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkpOworICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8PigpKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBjb250ZXh0IGxvYWRlciBzYXZlZCB3aGVuIHNldHRpbmcgdGhlIHRocmVhZCdzIGN1cnJlbnQKQEAgLTI4OSw4ICszMTgsOCBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICBjbGFzc2xvYWRlciBzaG91bGQgYmUgY29uc3VsdGVkICBiZWZvcmUgdHJ5aW5nIHRvCiAgICAgICogICAgICAgICAgICAgICAgICAgIGxvYWQgdGhlIGEgY2xhc3MgdGhyb3VnaCB0aGlzIGxvYWRlci4KICAgICAgKi8KLSAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudCwgZmluYWwgUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBQYXRoIGNsYXNzcGF0aCwgZmluYWwgYm9vbGVhbiBwYXJlbnRGaXJzdCkgeworICAgIHB1YmxpYyBBbnRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBwYXJlbnQsIGZpbmFsIFByb2plY3QgcHJvamVjdCwKKyAgICAgICAgZmluYWwgUGF0aCBjbGFzc3BhdGgsIGZpbmFsIGJvb2xlYW4gcGFyZW50Rmlyc3QpIHsKICAgICAgICAgdGhpcyhwcm9qZWN0LCBjbGFzc3BhdGgpOwogICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIHNldFBhcmVudChwYXJlbnQpOwpAQCAtMzExLDcgKzM0MCw4IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgIGNsYXNzbG9hZGVyIHNob3VsZCBiZSBjb25zdWx0ZWQgYmVmb3JlIHRyeWluZyB0bwogICAgICAqICAgICAgICAgICAgICAgICAgICBsb2FkIHRoZSBhIGNsYXNzIHRocm91Z2ggdGhpcyBsb2FkZXIuCiAgICAgICovCi0gICAgcHVibGljIEFudENsYXNzTG9hZGVyKGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgUGF0aCBjbGFzc3BhdGgsIGZpbmFsIGJvb2xlYW4gcGFyZW50Rmlyc3QpIHsKKyAgICBwdWJsaWMgQW50Q2xhc3NMb2FkZXIoZmluYWwgUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBQYXRoIGNsYXNzcGF0aCwKKyAgICAgICAgZmluYWwgYm9vbGVhbiBwYXJlbnRGaXJzdCkgewogICAgICAgICB0aGlzKG51bGwsIHByb2plY3QsIGNsYXNzcGF0aCwgcGFyZW50Rmlyc3QpOwogICAgIH0KIApAQCAtNDE4LDcgKzQ0OCw3IEBACiAgICAgICAgIGlmIChMb2FkZXJVdGlscy5pc0NvbnRleHRMb2FkZXJBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgc2F2ZWRDb250ZXh0TG9hZGVyID0gTG9hZGVyVXRpbHMuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSB0aGlzOwotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAib25seSIuZXF1YWxzKHByb2plY3QuZ2V0UHJvcGVydHkoImJ1aWxkLnN5c2NsYXNzcGF0aCIpKSkgeworICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCAmJiAib25seSIuZXF1YWxzKHByb2plY3QuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9TWVNDTEFTU1BBVEgpKSkgewogICAgICAgICAgICAgICAgIGxvYWRlciA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgTG9hZGVyVXRpbHMuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CkBAIC00OTMsMTkgKzUyMywxMyBAQAogICAgICAgICAgICAgICAgICsgcGF0aENvbXBvbmVudC5sYXN0TW9kaWZpZWQoKSArICItIiArIHBhdGhDb21wb25lbnQubGVuZ3RoKCk7CiAgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBwYXRoTWFwLmdldChhYnNQYXRoUGx1c1RpbWVBbmRMZW5ndGgpOwogICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIEphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGphckZpbGUgPSBuZXcgSmFyRmlsZShwYXRoQ29tcG9uZW50KTsKKyAgICAgICAgICAgIHRyeSAoSmFyRmlsZSBqYXJGaWxlID0gbmV3SmFyRmlsZShwYXRoQ29tcG9uZW50KSkgewogICAgICAgICAgICAgICAgIGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0ID0gamFyRmlsZS5nZXRNYW5pZmVzdCgpOwogICAgICAgICAgICAgICAgIGlmIChtYW5pZmVzdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2xhc3NwYXRoID0gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKQogICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoQXR0cmlidXRlcy5OYW1lLkNMQVNTX1BBVEgpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoamFyRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGphckZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjbGFzc3BhdGggPSAiIjsKQEAgLTUxMyw3ICs1MzcsNyBAQAogICAgICAgICAgICAgcGF0aE1hcC5wdXQoYWJzUGF0aFBsdXNUaW1lQW5kTGVuZ3RoLCBjbGFzc3BhdGgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEiIi5lcXVhbHMoY2xhc3NwYXRoKSkgeworICAgICAgICBpZiAoIWNsYXNzcGF0aC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGZpbmFsIFVSTCBiYXNlVVJMID0gRklMRV9VVElMUy5nZXRGaWxlVVJMKHBhdGhDb21wb25lbnQpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc3BhdGgpOwogICAgICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewpAQCAtNTQyLDE1ICs1NjYsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKLSAgICAgICAgZmluYWwgRW51bWVyYXRpb248RmlsZT4gY29tcG9uZW50RW51bSA9IHBhdGhDb21wb25lbnRzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChjb21wb25lbnRFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKKyAgICAgICAgZm9yIChmaW5hbCBGaWxlIGNvbXBvbmVudCA6IHBhdGhDb21wb25lbnRzKSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoY29tcG9uZW50RW51bS5uZXh0RWxlbWVudCgpLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjb21wb25lbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KQEAgLTc0NywxNCArNzY3LDggQEAKICAgICBwcml2YXRlIElucHV0U3RyZWFtIGxvYWRSZXNvdXJjZShmaW5hbCBTdHJpbmcgbmFtZSkgewogICAgICAgICAvLyB3ZSBuZWVkIHRvIHNlYXJjaCB0aGUgY29tcG9uZW50cyBvZiB0aGUgcGF0aCB0byBzZWUgaWYgd2UgY2FuCiAgICAgICAgIC8vIGZpbmQgdGhlIGNsYXNzIHdlIHdhbnQuCi0gICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0KLSAgICAgICAgZmluYWwgRW51bWVyYXRpb248RmlsZT4gZSA9IHBhdGhDb21wb25lbnRzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpICYmIHN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIHBhdGhDb21wb25lbnQgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBzdHJlYW0gPSBnZXRSZXNvdXJjZVN0cmVhbShwYXRoQ29tcG9uZW50LCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgICByZXR1cm4gcGF0aENvbXBvbmVudHMuc3RyZWFtKCkubWFwKHBhdGggLT4gZ2V0UmVzb3VyY2VTdHJlYW0ocGF0aCwgbmFtZSkpCisgICAgICAgICAgICAgICAgLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03ODksMTIgKzgwMywxMiBAQAogICAgICAgICAgICAgaWYgKGphckZpbGUgPT0gbnVsbCAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHJlc291cmNlID0gbmV3IEZpbGUoZmlsZSwgcmVzb3VyY2VOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmlsZXMubmV3SW5wdXRTdHJlYW0ocmVzb3VyY2UudG9QYXRoKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGphckZpbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgamFyRmlsZSA9IG5ld0phckZpbGUoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlcy5wdXQoZmlsZSwgamFyRmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTgzNiwyNyArODUwLDEyIEBACiAKICAgICAgICAgLy8gVE9ETyAtIHNob3VsZG4ndCB0aGlzIGFsd2F5cyByZXR1cm4gZmFsc2UgaW4gaXNvbGF0ZWQgbW9kZT8KIAotICAgICAgICBib29sZWFuIHVzZVBhcmVudEZpcnN0ID0gcGFyZW50Rmlyc3Q7Ci0KLSAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBzeXN0ZW1QYWNrYWdlcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKHJlc291cmNlTmFtZS5zdGFydHNXaXRoKHBhY2thZ2VOYW1lKSkgewotICAgICAgICAgICAgICAgIHVzZVBhcmVudEZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmb3IgKGZpbmFsIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGxvYWRlclBhY2thZ2VzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAocmVzb3VyY2VOYW1lLnN0YXJ0c1dpdGgocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdXNlUGFyZW50Rmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXNlUGFyZW50Rmlyc3Q7CisgICAgICAgIHJldHVybiBsb2FkZXJQYWNrYWdlcy5zdHJlYW0oKS5ub25lTWF0Y2gocmVzb3VyY2VOYW1lOjpzdGFydHNXaXRoKQorICAgICAgICAgICAgICAgICYmIChzeXN0ZW1QYWNrYWdlcy5zdHJlYW0oKS5hbnlNYXRjaChyZXNvdXJjZU5hbWU6OnN0YXJ0c1dpdGgpIHx8IHBhcmVudEZpcnN0KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBVc2VkIGZvciBpc29sYXRlZCByZXNvdXJjZSBzZWFjaGluZy4KKyAgICAgKiBVc2VkIGZvciBpc29sYXRlZCByZXNvdXJjZSBzZWFyY2hpbmcuCiAgICAgICogQHJldHVybiB0aGUgcm9vdCBjbGFzc2xvYWRlciBvZiBBbnRDbGFzc0xvYWRlci4KICAgICAgKi8KICAgICBwcml2YXRlIENsYXNzTG9hZGVyIGdldFJvb3RMb2FkZXIoKSB7CkBAIC04OTIsMTIgKzg5MSwxMSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gdHJ5IGFuZCBsb2FkIGZyb20gdGhpcyBsb2FkZXIgaWYgdGhlIHBhcmVudCBlaXRoZXIgZGlkbid0IGZpbmQKICAgICAgICAgICAgIC8vIGl0IG9yIHdhc24ndCBjb25zdWx0ZWQuCi0gICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxGaWxlPiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpICYmIHVybCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYXRoQ29tcG9uZW50ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlIHBhdGhDb21wb25lbnQgOiBwYXRoQ29tcG9uZW50cykgewogICAgICAgICAgICAgICAgIHVybCA9IGdldFJlc291cmNlVVJMKHBhdGhDb21wb25lbnQsIG5hbWUpOwogICAgICAgICAgICAgICAgIGlmICh1cmwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBsb2coIlJlc291cmNlICIgKyBuYW1lICsgIiBsb2FkZWQgZnJvbSBhbnQgbG9hZGVyIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTk3NywxOCArOTc1LDIzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDbGFzc0xvYWRlci50aGlzLnBhcmVudCBpcyBhbHJlYWR5IGRlbGVnYXRlZCB0byBmb3IgZXhhbXBsZSBmcm9tCiAgICAgICAgICAgICAvLyBDbGFzc0xvYWRlci5nZXRSZXNvdXJjZXMsIG5vIG5lZWQ6Ci0gICAgICAgICAgICBiYXNlID0gbmV3IENvbGxlY3Rpb25VdGlscy5FbXB0eUVudW1lcmF0aW9uPFVSTD4oKTsKKyAgICAgICAgICAgIGJhc2UgPSBDb2xsZWN0aW9ucy5lbXB0eUVudW1lcmF0aW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzUGFyZW50Rmlyc3QobmFtZSkpIHsKICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlLgotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25VdGlscy5hcHBlbmQoYmFzZSwgbWluZSk7CisgICAgICAgICAgICByZXR1cm4gYXBwZW5kKGJhc2UsIG1pbmUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpZ25vcmVCYXNlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Um9vdExvYWRlcigpID09IG51bGwgPyBtaW5lIDogQ29sbGVjdGlvblV0aWxzLmFwcGVuZChtaW5lLCBnZXRSb290TG9hZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlcyhuYW1lKSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0Um9vdExvYWRlcigpID09IG51bGwgPyBtaW5lCisgICAgICAgICAgICAgICAgICAgIDogYXBwZW5kKG1pbmUsIGdldFJvb3RMb2FkZXIoKS5nZXRSZXNvdXJjZXMobmFtZSkpOwogICAgICAgICB9CiAgICAgICAgIC8vIHBhcmVudCBsYXN0OgotICAgICAgICByZXR1cm4gQ29sbGVjdGlvblV0aWxzLmFwcGVuZChtaW5lLCBiYXNlKTsKKyAgICAgICAgcmV0dXJuIGFwcGVuZChtaW5lLCBiYXNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxVUkw+IGFwcGVuZChFbnVtZXJhdGlvbjxVUkw+IG9uZSwgRW51bWVyYXRpb248VVJMPiB0d28pIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5jb25jYXQoQ29sbGVjdGlvbnMubGlzdChvbmUpLnN0cmVhbSgpLCBDb2xsZWN0aW9ucy5saXN0KHR3bykuc3RyZWFtKCkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5jb2xsZWN0aW5nQW5kVGhlbihDb2xsZWN0b3JzLnRvTGlzdCgpLCBDb2xsZWN0aW9uczo6ZW51bWVyYXRpb24pKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMjUsNyArMTAyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBqYXJGaWxlID0gbmV3SmFyRmlsZShmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGVzLnB1dChmaWxlLCBqYXJGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTM2MiwxMiArMTM2NSw4IEBACiAgICAgICAgIC8vIHdlIG5lZWQgdG8gc2VhcmNoIHRoZSBjb21wb25lbnRzIG9mIHRoZSBwYXRoIHRvIHNlZSBpZgogICAgICAgICAvLyB3ZSBjYW4gZmluZCB0aGUgY2xhc3Mgd2Ugd2FudC4KICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzRmlsZW5hbWUgPSBnZXRDbGFzc0ZpbGVuYW1lKG5hbWUpOwotICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxGaWxlPiBlID0gcGF0aENvbXBvbmVudHMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgcGF0aENvbXBvbmVudCA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGdldFJlc291cmNlU3RyZWFtKHBhdGhDb21wb25lbnQsIGNsYXNzRmlsZW5hbWUpOworICAgICAgICBmb3IgKGZpbmFsIEZpbGUgcGF0aENvbXBvbmVudCA6IHBhdGhDb21wb25lbnRzKSB7CisgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIHN0cmVhbSA9IGdldFJlc291cmNlU3RyZWFtKHBhdGhDb21wb25lbnQsIGNsYXNzRmlsZW5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiTG9hZGVkIGZyb20gIiArIHBhdGhDb21wb25lbnQgKyAiICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhc3NGaWxlbmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOwpAQCAtMTM3OSw4ICsxMzc4LDYgQEAKICAgICAgICAgICAgICAgICAvLyBpb2UucHJpbnRTdGFja1RyYWNlKCk7CiAgICAgICAgICAgICAgICAgbG9nKCJFeGNlcHRpb24gcmVhZGluZyBjb21wb25lbnQgIiArIHBhdGhDb21wb25lbnQgKyAiIChyZWFzb246ICIKICAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpICsgIikiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHN0cmVhbSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24obmFtZSk7CkBAIC0xNDEwLDE1ICsxNDA3LDEwIEBACiAgICAgICogZmlsZXMgYXJlIGNsb3NlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYW51cCgpIHsKLSAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxKYXJGaWxlPiBlID0gamFyRmlsZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGZpbmFsIEphckZpbGUgamFyRmlsZSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgamFyRmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgSmFyRmlsZSBqYXJGaWxlIDogamFyRmlsZXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShqYXJGaWxlKTsKICAgICAgICAgfQotICAgICAgICBqYXJGaWxlcyA9IG5ldyBIYXNodGFibGU8RmlsZSwgSmFyRmlsZT4oKTsKKyAgICAgICAgamFyRmlsZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcHJvamVjdC5yZW1vdmVCdWlsZExpc3RlbmVyKHRoaXMpOwogICAgICAgICB9CkBAIC0xNTMxLDEyICsxNTIzLDcgQEAKICAgICAgKiBoZXJlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSmF2YUxpYnJhcmllcygpIHsKLSAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gcGFja2FnZXMgPSBKYXZhRW52VXRpbHMuZ2V0SnJlUGFja2FnZXMoKTsKLSAgICAgICAgZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiBlID0gcGFja2FnZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFkZFN5c3RlbVBhY2thZ2VSb290KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgfQorICAgICAgICBKYXZhRW52VXRpbHMuZ2V0SnJlUGFja2FnZXMoKS5mb3JFYWNoKHRoaXM6OmFkZFN5c3RlbVBhY2thZ2VSb290KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OTIsOCArMTU3OSw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiByZWFkRnVsbHkoZmluYWwgRmlsZSBmLCBmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZik7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZi50b1BhdGgoKSkpIHsKICAgICAgICAgICAgIGZpbmFsIGludCBsZW4gPSBiLmxlbmd0aDsKICAgICAgICAgICAgIGludCBjb3VudCA9IDAsIHggPSAwOwogICAgICAgICAgICAgd2hpbGUgKGNvdW50ICE9IGxlbikgewpAQCAtMTYwNCw5ICsxNTkwLDIyIEBACiAgICAgICAgICAgICAgICAgY291bnQgKz0geDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBjb3VudCA9PSBsZW47Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBqYXIKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgYSB7QGxpbmsgSmFyRmlsZX0gaW5zdGFuY2UsIHdoaWNoIGlzIGNvbnN0cnVjdGVkIGJhc2VkIHVwb24gdGhlIEphdmEgcnVudGltZSB2ZXJzaW9uLgorICAgICAqICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBKYXZhIHJ1bnRpbWUgdmVyc2lvbiwgdGhlIHJldHVybmVkIGluc3RhbmNlIG1heSBvciBtYXkgbm90IGJlIHtAY29kZSBtdWx0aS1yZWxlYXNlfQorICAgICAqICAgICAgICAgYXdhcmUgKGEgZmVhdHVyZSBpbnRyb2R1Y2VkIGluIEphdmEgOSkKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSmFyRmlsZSBuZXdKYXJGaWxlKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFJU19BVExFQVNUX0pBVkE5IHx8IE1SX0pBUkZJTEVfQ1RPUl9BUkdTID09IG51bGwgfHwgTVJfSkFSRklMRV9DVE9SX1JVTlRJTUVfVkVSU0lPTl9WQUwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXJGaWxlKGZpbGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZWZsZWN0VXRpbC5uZXdJbnN0YW5jZShKYXJGaWxlLmNsYXNzLCBNUl9KQVJGSUxFX0NUT1JfQVJHUywKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ZpbGUsIHRydWUsIFppcEZpbGUuT1BFTl9SRUFELCBNUl9KQVJGSUxFX0NUT1JfUlVOVElNRV9WRVJTSU9OX1ZBTH0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudFR5cGVEZWZpbml0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRUeXBlRGVmaW5pdGlvbi5qYXZhCmluZGV4IGM3YjIyM2MuLmM2NDVhOTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FudFR5cGVEZWZpbml0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQW50VHlwZURlZmluaXRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwNywxMSArMzA3LDExIEBACiAgICAgICAgIC8vIERhdGFUeXBlIGNhbiBoYXZlIGEgIm5vIGFyZyIgY29uc3RydWN0b3Igb3IgdGFrZSBhIHNpbmdsZQogICAgICAgICAvLyBQcm9qZWN0IGFyZ3VtZW50LgogICAgICAgICB0cnkgewotICAgICAgICAgICAgY3RvciA9IG5ld2NsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICBjdG9yID0gbmV3Y2xhc3MuZ2V0Q29uc3RydWN0b3IoKTsKICAgICAgICAgICAgIG5vQXJnID0gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zZSkgewogICAgICAgICAgICAgLy9jYW4gdGhyb3cgdGhlIHNhbWUgZXhjZXB0aW9uLCBpZiB0aGVyZSBpcyBubyB0aGlzKFByb2plY3QpIGN0b3IuCi0gICAgICAgICAgICBjdG9yID0gbmV3Y2xhc3MuZ2V0Q29uc3RydWN0b3IobmV3IENsYXNzW10ge1Byb2plY3QuY2xhc3N9KTsKKyAgICAgICAgICAgIGN0b3IgPSBuZXdjbGFzcy5nZXRDb25zdHJ1Y3RvcihQcm9qZWN0LmNsYXNzKTsKICAgICAgICAgICAgIG5vQXJnID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgLy9ub3cgd2UgaW5zdGFudGlhdGUKQEAgLTM3Myw2ICszNzMsNiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGV4dHJhY3RDbGFzc25hbWUoQ2xhc3M8Pz4gYykgewotICAgICAgICByZXR1cm4gKGMgPT0gbnVsbCkgPyAiPG51bGw+IiA6IGMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIHJldHVybiAoYyA9PSBudWxsKSA/ICI8bnVsbD4iIDogYy5nZXROYW1lKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQXJndW1lbnRQcm9jZXNzb3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FyZ3VtZW50UHJvY2Vzc29yLmphdmEKaW5kZXggN2E1NDdmZC4uZWMwOGYwMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQXJndW1lbnRQcm9jZXNzb3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Bcmd1bWVudFByb2Nlc3Nvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQXJndW1lbnRQcm9jZXNzb3JSZWdpc3RyeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQXJndW1lbnRQcm9jZXNzb3JSZWdpc3RyeS5qYXZhCmluZGV4IGVkMzMzMWYuLjJhMzYzOTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0FyZ3VtZW50UHJvY2Vzc29yUmVnaXN0cnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Bcmd1bWVudFByb2Nlc3NvclJlZ2lzdHJ5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMSArMjMsMTEgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxvYWRlclV0aWxzOwogCiAvKioKQEAgLTU1LDcgKzU1LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIEFyZ3VtZW50UHJvY2Vzc29yUmVnaXN0cnkgaW5zdGFuY2UgPSBuZXcgQXJndW1lbnRQcm9jZXNzb3JSZWdpc3RyeSgpOwogCi0gICAgcHJpdmF0ZSBMaXN0PEFyZ3VtZW50UHJvY2Vzc29yPiBwcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdDxBcmd1bWVudFByb2Nlc3Nvcj4oKTsKKyAgICBwcml2YXRlIExpc3Q8QXJndW1lbnRQcm9jZXNzb3I+IHByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgQXJndW1lbnRQcm9jZXNzb3JSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwpAQCAtNzMsOSArNzMsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBMb2FkZXJVdGlscy5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKICAgICAgICAgICAgIGlmIChjbGFzc0xvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb248VVJMPiByZXNvdXJjZXMgPSBjbGFzc0xvYWRlci5nZXRSZXNvdXJjZXMoU0VSVklDRV9JRCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBVUkwgcmVzb3VyY2UgPSByZXNvdXJjZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFVSTCByZXNvdXJjZSA6IENvbGxlY3Rpb25zLmxpc3QoY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VzKFNFUlZJQ0VfSUQpKSkgewogICAgICAgICAgICAgICAgICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSByZXNvdXJjZS5vcGVuQ29ubmVjdGlvbigpOwogICAgICAgICAgICAgICAgICAgICBjb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFByb2Nlc3NvckJ5U2VydmljZShjb25uLmdldElucHV0U3RyZWFtKCkpOwpAQCAtMTI3LDcgKzEyNSw3IEBACiAgICAgICAgICAgICBwcm9jZXNzb3IgPSBwcm9jZXNzb3JDbGFzcy5nZXRDb25zdHJ1Y3RvcigpLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBhcmd1bWVudCBwcm9jZXNzb3IgY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICsgcHJvY2Vzc29yQ2xhc3MuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyBwcm9jZXNzb3JDbGFzcy5nZXROYW1lKCkKICAgICAgICAgICAgICAgICAgICAgKyAiIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRlZmF1bHQgY29uc3RydWN0b3IiLAogICAgICAgICAgICAgICAgICAgICBlKTsKICAgICAgICAgfQpAQCAtMTQ3LDIwICsxNDUsMTEgQEAKIAogICAgIHByaXZhdGUgQXJndW1lbnRQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yQnlTZXJ2aWNlKElucHV0U3RyZWFtIGlzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSkpIHsKICAgICAgICAgICAgIFN0cmluZyBwcm9jZXNzb3JDbGFzc05hbWUgPSByZC5yZWFkTGluZSgpOwotICAgICAgICAgICAgaWYgKHByb2Nlc3NvckNsYXNzTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHMocHJvY2Vzc29yQ2xhc3NOYW1lKSkgeworICAgICAgICAgICAgaWYgKHByb2Nlc3NvckNsYXNzTmFtZSAhPSBudWxsICYmICFwcm9jZXNzb3JDbGFzc05hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb2Nlc3Nvcihwcm9jZXNzb3JDbGFzc05hbWUpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzcik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFdmVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFdmVudC5qYXZhCmluZGV4IDYyM2FkMWUuLmQ0ZDcxZjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXZlbnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV2ZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRFeGNlcHRpb24uamF2YQppbmRleCBhNGVkMDVmLi42ZGMyYzEyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEV4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOCwxMyArMzgsMjYgQEAKICAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBkZXNjcmlwdGl2ZSBtZXNzYWdlLgogICAgICAqCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBkZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KKyAgICAgKiAgICAgICAgICAgIFNob3VsZCBub3QgYmUge0Bjb2RlIG51bGx9LgogICAgICAqLwogICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBmb3JtYXQgcGF0dGVybiBhbmQgYXJndW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gQSBkZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGZvcm1hdEFyZ3VtZW50cyBkaXR0bworICAgICAqIEBzZWUgU3RyaW5nI2Zvcm1hdChTdHJpbmcsIE9iamVjdC4uLikKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqLworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgcGF0dGVybiwgT2JqZWN0Li4uIGZvcm1hdEFyZ3VtZW50cykgeworICAgICAgICBzdXBlcihTdHJpbmcuZm9ybWF0KHBhdHRlcm4sIGZvcm1hdEFyZ3VtZW50cykpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBhcwogICAgICAqIGEgcm9vdCBjYXVzZS4KICAgICAgKgpAQCAtNjEsMTUgKzc0LDE1IEBACiAgICAgICogQ29uc3RydWN0cyBhbiBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGFzCiAgICAgICogYSByb290IGNhdXNlIGFuZCBhIGxvY2F0aW9uIGluIGEgZmlsZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBtc2cgQSBkZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgotICAgICAqICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgYSBjYXVzZSBpcyBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBkZXNjcmlwdGlvbiBvZiBvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uLgorICAgICAqICAgICAgICAgICAgICAgIFNob3VsZCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4gdW5sZXNzIGEgY2F1c2UgaXMgc3BlY2lmaWVkLgogICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgZXhjZXB0aW9uIHRoYXQgbWlnaHQgaGF2ZSBjYXVzZWQgdGhpcyBvbmUuCiAgICAgICogICAgICAgICAgICAgIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIGluIHRoZSBwcm9qZWN0IGZpbGUgd2hlcmUgdGhlIGVycm9yCiAgICAgICogICAgICAgICAgICAgICAgIG9jY3VycmVkLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRFeGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlLCBMb2NhdGlvbiBsb2NhdGlvbikgewotICAgICAgICB0aGlzKG1zZywgY2F1c2UpOworICAgIHB1YmxpYyBCdWlsZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlLCBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgICB0aGlzKG1lc3NhZ2UsIGNhdXNlKTsKICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMaXN0ZW5lci5qYXZhCmluZGV4IGVkNjczMWMuLjM3Yzg1MGUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTGlzdGVuZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExpc3RlbmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRMb2dnZXIuamF2YQppbmRleCAyNDlkOGY1Li4wODEyM2FhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZExvZ2dlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkTG9nZ2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Db21wb25lbnRIZWxwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0NvbXBvbmVudEhlbHBlci5qYXZhCmluZGV4IDY2NzJmZGEuLjVkOGMzZGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0NvbXBvbmVudEhlbHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0NvbXBvbmVudEhlbHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKQEAgLTM1LDEyICszNCwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5MYXVuY2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZWZpbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlByb3BlcnR5OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlR5cGVkZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogQ29tcG9uZW50IGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uLgpAQCAtNjAsMzEgKzU5LDMxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDb21wb25lbnRIZWxwZXIgIHsKICAgICAvKiogTWFwIG9mIGNvbXBvbmVudCBuYW1lIHRvIGxpc3RzIG9mIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbnMgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8QW50VHlwZURlZmluaXRpb24+PiByZXN0cmljdGVkRGVmaW5pdGlvbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8QW50VHlwZURlZmluaXRpb24+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4+IHJlc3RyaWN0ZWREZWZpbml0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIC8qKiBNYXAgZnJvbSBjb21wb25lbnQgbmFtZSB0byBhbnR0eXBlZGVmaW5pdGlvbiAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQW50VHlwZURlZmluaXRpb24+IGFudFR5cGVUYWJsZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBBbnRUeXBlRGVmaW5pdGlvbj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIEFudFR5cGVEZWZpbml0aW9uPiBhbnRUeXBlVGFibGUgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKiBNYXAgb2YgdGFza3MgZ2VuZXJhdGVkIGZyb20gYW50VHlwZVRhYmxlICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4gdGFza0NsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4gdGFza0NsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKiBmbGFnIHRvIHJlYnVpbGQgdGFza0NsYXNzRGVmaW5pdGlvbnMgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gcmVidWlsZFRhc2tDbGFzc0RlZmluaXRpb25zID0gdHJ1ZTsKIAogICAgIC8qKiBNYXAgb2YgdHlwZXMgZ2VuZXJhdGVkIGZyb20gYW50VHlwZVRhYmxlICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4gdHlwZUNsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4gdHlwZUNsYXNzRGVmaW5pdGlvbnMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKiBmbGFnIHRvIHJlYnVpbGQgdHlwZUNsYXNzRGVmaW5pdGlvbnMgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gcmVidWlsZFR5cGVDbGFzc0RlZmluaXRpb25zID0gdHJ1ZTsKIAogICAgIC8qKiBTZXQgb2YgbmFtZXNwYWNlcyB0aGF0IGhhdmUgYmVlbiBjaGVja2VkIGZvciBhbnRsaWJzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gY2hlY2tlZE5hbWVzcGFjZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoU2V0PFN0cmluZz4gY2hlY2tlZE5hbWVzcGFjZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAKICAgICAvKioKICAgICAgKiBTdGFjayBvZiBhbnRsaWIgY29udGV4dHMgdXNlZCB0byByZXNvbHZlIGRlZmluaXRpb25zIHdoaWxlCiAgICAgICogICBwcm9jZXNzaW5nIGFudGxpYgogICAgICAqLwotICAgIHByaXZhdGUgU3RhY2s8U3RyaW5nPiBhbnRMaWJTdGFjayA9IG5ldyBTdGFjazxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBTdGFjazxTdHJpbmc+IGFudExpYlN0YWNrID0gbmV3IFN0YWNrPD4oKTsKIAogICAgIC8qKiBjdXJyZW50IGFudGxpYiB1cmkgKi8KICAgICBwcml2YXRlIFN0cmluZyBhbnRMaWJDdXJyZW50VXJpID0gbnVsbDsKQEAgLTE5MCw3ICsxODksNiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0vLyAgICAgICAgYW50VHlwZVRhYmxlID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIEFudFR5cGVEZWZpbml0aW9uPihwcm9qZWN0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwNiwxMyArMjA0LDEzIEBACiAgICAgICogQHJldHVybiBBIGRlZXAgY29weSBvZiB0aGUgcmVzdHJpY3RlZERlZmluaXRpb24KICAgICAgKi8KICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8QW50VHlwZURlZmluaXRpb24+PiBnZXRSZXN0cmljdGVkRGVmaW5pdGlvbigpIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4+KCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8QW50VHlwZURlZmluaXRpb24+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAocmVzdHJpY3RlZERlZmluaXRpb25zKSB7CiAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8QW50VHlwZURlZmluaXRpb24+PiBlbnRyeSA6IHJlc3RyaWN0ZWREZWZpbml0aW9ucy5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4gZW50cnlWYWwgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZW50cnlWYWwpIHsKICAgICAgICAgICAgICAgICAgICAgLy9jb3B5IHRoZSBlbnRyeVZhbAotICAgICAgICAgICAgICAgICAgICBlbnRyeVZhbCA9IG5ldyBBcnJheUxpc3Q8QW50VHlwZURlZmluaXRpb24+IChlbnRyeVZhbCk7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5VmFsID0gbmV3IEFycmF5TGlzdDw+KGVudHJ5VmFsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnlWYWwpOwogICAgICAgICAgICAgfQpAQCAtMjMwLDcgKzIyOCw4IEBACiAgICAgcHVibGljIHZvaWQgaW5pdFN1YlByb2plY3QoQ29tcG9uZW50SGVscGVyIGhlbHBlcikgewogICAgICAgICAvLyBhZGQgdGhlIHR5cGVzIG9mIHRoZSBwYXJlbnQgcHJvamVjdAogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQW50VHlwZURlZmluaXRpb24+IHR5cGVUYWJsZSA9IChIYXNodGFibGU8U3RyaW5nLCBBbnRUeXBlRGVmaW5pdGlvbj4pIGhlbHBlci5hbnRUeXBlVGFibGUuY2xvbmUoKTsKKyAgICAgICAgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQW50VHlwZURlZmluaXRpb24+IHR5cGVUYWJsZQorICAgICAgICAgICAgICAgID0gKEhhc2h0YWJsZTxTdHJpbmcsIEFudFR5cGVEZWZpbml0aW9uPikgaGVscGVyLmFudFR5cGVUYWJsZS5jbG9uZSgpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKGFudFR5cGVUYWJsZSkgewogICAgICAgICAgICAgZm9yIChBbnRUeXBlRGVmaW5pdGlvbiBkZWYgOiB0eXBlVGFibGUudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICBhbnRUeXBlVGFibGUucHV0KGRlZi5nZXROYW1lKCksIGRlZik7CkBAIC0yNDEsNyArMjQwLDggQEAKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBjaGVja2VkTmFtZXNwYWNlcy5hZGRBbGwoaW5oZXJpdGVkQ2hlY2tlZE5hbWVzcGFjZSk7CiAgICAgICAgIH0KLSAgICAgICAgTWFwPFN0cmluZywgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4+IGluaGVyaXRlZFJlc3RyaWN0ZWREZWYgPSBoZWxwZXIuZ2V0UmVzdHJpY3RlZERlZmluaXRpb24oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4+IGluaGVyaXRlZFJlc3RyaWN0ZWREZWYKKyAgICAgICAgICAgICAgICA9IGhlbHBlci5nZXRSZXN0cmljdGVkRGVmaW5pdGlvbigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3RyaWN0ZWREZWZpbml0aW9ucykgewogICAgICAgICAgICAgcmVzdHJpY3RlZERlZmluaXRpb25zLnB1dEFsbChpbmhlcml0ZWRSZXN0cmljdGVkRGVmKTsKICAgICAgICAgfQpAQCAtNDAwLDE1ICs0MDAsMTEgQEAKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYW50VHlwZVRhYmxlKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJlYnVpbGRUYXNrQ2xhc3NEZWZpbml0aW9ucykgewogICAgICAgICAgICAgICAgICAgICB0YXNrQ2xhc3NEZWZpbml0aW9ucy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFudFR5cGVEZWZpbml0aW9uPiBlIDogYW50VHlwZVRhYmxlLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gZS5nZXRWYWx1ZSgpLmdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tDbGFzc0RlZmluaXRpb25zLnB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuZ2V0VHlwZUNsYXNzKHByb2plY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbnRUeXBlVGFibGUuZW50cnlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSAtPiBlLmdldFZhbHVlKCkuZ2V0RXhwb3NlZENsYXNzKHByb2plY3QpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFRhc2suY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShlLmdldFZhbHVlKCkuZ2V0RXhwb3NlZENsYXNzKHByb2plY3QpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChlIC0+IHRhc2tDbGFzc0RlZmluaXRpb25zLnB1dChlLmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRWYWx1ZSgpLmdldFR5cGVDbGFzcyhwcm9qZWN0KSkpOwogICAgICAgICAgICAgICAgICAgICByZWJ1aWxkVGFza0NsYXNzRGVmaW5pdGlvbnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC00MjgsMTUgKzQyNCwxMSBAQAogICAgICAgICAgICAgc3luY2hyb25pemVkIChhbnRUeXBlVGFibGUpIHsKICAgICAgICAgICAgICAgICBpZiAocmVidWlsZFR5cGVDbGFzc0RlZmluaXRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgIHR5cGVDbGFzc0RlZmluaXRpb25zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQW50VHlwZURlZmluaXRpb24+IGUgOiBhbnRUeXBlVGFibGUuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBlLmdldFZhbHVlKCkuZ2V0RXhwb3NlZENsYXNzKHByb2plY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghVGFzay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVDbGFzc0RlZmluaXRpb25zLnB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkuZ2V0VHlwZUNsYXNzKHByb2plY3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbnRUeXBlVGFibGUuZW50cnlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZSAtPiBlLmdldFZhbHVlKCkuZ2V0RXhwb3NlZENsYXNzKHByb2plY3QpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFUYXNrLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZS5nZXRWYWx1ZSgpLmdldEV4cG9zZWRDbGFzcyhwcm9qZWN0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goZSAtPiB0eXBlQ2xhc3NEZWZpbml0aW9ucy5wdXQoZS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VmFsdWUoKS5nZXRUeXBlQ2xhc3MocHJvamVjdCkpKTsKICAgICAgICAgICAgICAgICAgICAgcmVidWlsZFR5cGVDbGFzc0RlZmluaXRpb25zID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNjg0LDExICs2NzYsNyBAQAogICAgICAgICBTdHJpbmcgbmFtZSA9IGRlZi5nZXROYW1lKCk7CiAgICAgICAgIExpc3Q8QW50VHlwZURlZmluaXRpb24+IGxpc3QgPSBudWxsOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHJlc3RyaWN0ZWREZWZpbml0aW9ucykgewotICAgICAgICAgICAgbGlzdCA9IHJlc3RyaWN0ZWREZWZpbml0aW9ucy5nZXQobmFtZSk7Ci0gICAgICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8QW50VHlwZURlZmluaXRpb24+KCk7Ci0gICAgICAgICAgICAgICAgcmVzdHJpY3RlZERlZmluaXRpb25zLnB1dChuYW1lLCBsaXN0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QgPSByZXN0cmljdGVkRGVmaW5pdGlvbnMuY29tcHV0ZUlmQWJzZW50KG5hbWUsIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjbGFzc25hbWUgaXMgYWxyZWFkeSBwcmVzZW50IGFuZCByZW1vdmUgaXQKICAgICAgICAgLy8gaWYgaXQgaXMKQEAgLTc1MSw3ICs3MzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4aXRBbnRMaWIoKSB7CiAgICAgICAgIGFudExpYlN0YWNrLnBvcCgpOwotICAgICAgICBhbnRMaWJDdXJyZW50VXJpID0gKGFudExpYlN0YWNrLnNpemUoKSA9PSAwKSA/IG51bGwgOiAoU3RyaW5nKSBhbnRMaWJTdGFjay5wZWVrKCk7CisgICAgICAgIGFudExpYkN1cnJlbnRVcmkgPSAoYW50TGliU3RhY2suaXNFbXB0eSgpKSA/IG51bGwgOiBhbnRMaWJTdGFjay5wZWVrKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjAsMTMgKzc0OCwxMCBAQAogICAgIHByaXZhdGUgdm9pZCBpbml0VGFza3MoKSB7CiAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3NMb2FkZXIobnVsbCk7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXREZWZhdWx0RGVmaW5pdGlvbnMoZmFsc2UpOwotICAgICAgICBFbnVtZXJhdGlvbjw/PiBlID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gcHJvcHMuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwcm9wcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKICAgICAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IG5ldyBBbnRUeXBlRGVmaW5pdGlvbigpOwogICAgICAgICAgICAgZGVmLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICAgICBkZWYuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgICAgICBkZWYuc2V0Q2xhc3NOYW1lKHByb3BzLmdldFByb3BlcnR5KG5hbWUpKTsKICAgICAgICAgICAgIGRlZi5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CiAgICAgICAgICAgICBkZWYuc2V0QWRhcHRUb0NsYXNzKFRhc2suY2xhc3MpOwogICAgICAgICAgICAgZGVmLnNldEFkYXB0ZXJDbGFzcyhUYXNrQWRhcHRlci5jbGFzcyk7CkBAIC03OTksOSArNzg0LDcgQEAKICAgICAgICAgICAgIFN0cmluZyByZXNvdXJjZSA9IHR5cGUgPyBNYWdpY05hbWVzLlRZUEVERUZTX1BST1BFUlRJRVNfUkVTT1VSQ0UKICAgICAgICAgICAgICAgICAgICAgOiBNYWdpY05hbWVzLlRBU0tERUZfUFJPUEVSVElFU19SRVNPVVJDRTsKICAgICAgICAgICAgIFN0cmluZyBlcnJvclN0cmluZyA9IHR5cGUgPyBFUlJPUl9OT19UWVBFX0xJU1RfTE9BRCA6IEVSUk9SX05PX1RBU0tfTElTVF9MT0FEOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbiA9IENvbXBvbmVudEhlbHBlci5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHJlc291cmNlKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBDb21wb25lbnRIZWxwZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNvdXJjZSkpIHsKICAgICAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwogICAgICAgICAgICAgICAgIH0KQEAgLTgxMCw4ICs3OTMsNiBAQAogICAgICAgICAgICAgICAgIGRlZmF1bHREZWZpbml0aW9uc1tpZHhdID0gcDsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3JTdHJpbmcsIGUpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkZWZhdWx0RGVmaW5pdGlvbnNbaWR4XTsKQEAgLTgyMywxMyArODA0LDEwIEBACiAgICAgcHJpdmF0ZSB2b2lkIGluaXRUeXBlcygpIHsKICAgICAgICAgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBnZXRDbGFzc0xvYWRlcihudWxsKTsKICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldERlZmF1bHREZWZpbml0aW9ucyh0cnVlKTsKLSAgICAgICAgRW51bWVyYXRpb248Pz4gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogcHJvcHMuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7CiAgICAgICAgICAgICBBbnRUeXBlRGVmaW5pdGlvbiBkZWYgPSBuZXcgQW50VHlwZURlZmluaXRpb24oKTsKICAgICAgICAgICAgIGRlZi5zZXROYW1lKG5hbWUpOwotICAgICAgICAgICAgZGVmLnNldENsYXNzTmFtZShjbGFzc05hbWUpOworICAgICAgICAgICAgZGVmLnNldENsYXNzTmFtZShwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSk7CiAgICAgICAgICAgICBkZWYuc2V0Q2xhc3NMb2FkZXIoY2xhc3NMb2FkZXIpOwogICAgICAgICAgICAgYW50VHlwZVRhYmxlLnB1dChuYW1lLCBkZWYpOwogICAgICAgICB9CkBAIC04NDMsMTAgKzgyMSwxMCBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgY2hlY2tOYW1lc3BhY2UoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHsKICAgICAgICAgU3RyaW5nIHVyaSA9IFByb2plY3RIZWxwZXIuZXh0cmFjdFVyaUZyb21Db21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwotICAgICAgICBpZiAoIiIuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgaWYgKHVyaS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHVyaSA9IFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJOwogICAgICAgICB9Ci0gICAgICAgIGlmICghdXJpLnN0YXJ0c1dpdGgoUHJvamVjdEhlbHBlci5BTlRMSUJfVVJJKSkgeworICAgICAgICBpZiAoIXVyaS5zdGFydHNXaXRoKE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWCkpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gbmFtZXNwYWNlIHRoYXQgZG9lcyBub3QgY29udGFpbiBhbnRsaWIKICAgICAgICAgfQogICAgICAgICBpZiAoY2hlY2tlZE5hbWVzcGFjZXMuY29udGFpbnModXJpKSkgewpAQCAtODU0LDcgKzgzMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2hlY2tlZE5hbWVzcGFjZXMuYWRkKHVyaSk7CiAKLSAgICAgICAgaWYgKGFudFR5cGVUYWJsZS5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoYW50VHlwZVRhYmxlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gUHJvamVjdCBpbnN0YW5jZSBkb2Vzbid0IGtub3cgdGhlIHRhc2tzIGFuZCB0eXBlcwogICAgICAgICAgICAgLy8gZGVmaW5lZCBpbiBkZWZhdWx0cy5wcm9wZXJ0aWVzLCBsaWtlbHkgY3JlYXRlZCBieSB0aGUKICAgICAgICAgICAgIC8vIHVzZXIgLSB3aXRob3V0IHRob3NlIGRlZmluaXRpb25zIGl0IGNhbm5vdCBwYXJzZSBhbnRsaWIKQEAgLTkwMyw3ICs4ODEsNyBAQAogICAgICAgICAgICAgcHJvYmFibHlJREUgPSB0cnVlOwogICAgICAgICAgICAgYW50SG9tZUxpYiA9ICJBTlRfSE9NRSIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAibGliIjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgZGlyTGlzdGluZ1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZGlyTGlzdGluZ1RleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmaW5hbCBTdHJpbmcgdGFiID0gIiAgICAgICAgLSI7CiAgICAgICAgIGRpckxpc3RpbmdUZXh0LmFwcGVuZCh0YWIpOwogICAgICAgICBkaXJMaXN0aW5nVGV4dC5hcHBlbmQoYW50SG9tZUxpYik7CkBAIC0xMDI1LDE2ICsxMDAzLDkgQEAKICAgICAgICAgb3V0LnByaW50bG4oIkFjdGlvbjogQ2hlY2sgdGhhdCBhbnkgY3VzdG9tIHRhc2tzL3R5cGVzIGhhdmUgYmVlbiBkZWNsYXJlZC4iKTsKICAgICAgICAgb3V0LnByaW50bG4oIkFjdGlvbjogQ2hlY2sgdGhhdCBhbnkgPHByZXNldGRlZj4vPG1hY3JvZGVmPiIKICAgICAgICAgICAgICAgICArICIgZGVjbGFyYXRpb25zIGhhdmUgdGFrZW4gcGxhY2UuIik7Ci0gICAgICAgIGlmICh1cmkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmICghdXJpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZmluYWwgTGlzdDxBbnRUeXBlRGVmaW5pdGlvbj4gbWF0Y2hlcyA9IGZpbmRUeXBlTWF0Y2hlcyh1cmkpOwotICAgICAgICAgICAgaWYgKG1hdGNoZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlRoZSBkZWZpbml0aW9ucyBpbiB0aGUgbmFtZXNwYWNlICIgKyB1cmkgKyAiIGFyZToiKTsKLSAgICAgICAgICAgICAgICBmb3IgKEFudFR5cGVEZWZpbml0aW9uIGRlZiA6IG1hdGNoZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gUHJvamVjdEhlbHBlci5leHRyYWN0TmFtZUZyb21Db21wb25lbnROYW1lKGRlZi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgICIgKyBsb2NhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtYXRjaGVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJObyB0eXBlcyBvciB0YXNrcyBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSB5ZXQiKTsKICAgICAgICAgICAgICAgICBpZiAoaXNBbnRsaWIpIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKQEAgLTEwNDIsNiArMTAxMywxMyBAQAogICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQWN0aW9uOiBDaGVjayB0aGF0IHRoZSBpbXBsZW1lbnRpbmcgbGlicmFyeSBleGlzdHMgaW4gb25lIG9mOiIpOwogICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihkaXJMaXN0aW5nKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlRoZSBkZWZpbml0aW9ucyBpbiB0aGUgbmFtZXNwYWNlICIgKyB1cmkgKyAiIGFyZToiKTsKKyAgICAgICAgICAgICAgICBmb3IgKEFudFR5cGVEZWZpbml0aW9uIGRlZiA6IG1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvY2FsID0gUHJvamVjdEhlbHBlci5leHRyYWN0TmFtZUZyb21Db21wb25lbnROYW1lKGRlZi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiICAgICIgKyBsb2NhbCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTA4OSwxNCArMTA2Nyw5IEBACiAgICAgICogQHJldHVybiB0aGUgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIGRlZmluaXRpb25zCiAgICAgICovCiAgICAgcHJpdmF0ZSBMaXN0PEFudFR5cGVEZWZpbml0aW9uPiBmaW5kVHlwZU1hdGNoZXMoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBmaW5hbCBMaXN0PEFudFR5cGVEZWZpbml0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PEFudFR5cGVEZWZpbml0aW9uPigpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKGFudFR5cGVUYWJsZSkgewotICAgICAgICAgICAgZm9yIChBbnRUeXBlRGVmaW5pdGlvbiBkZWYgOiBhbnRUeXBlVGFibGUudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVmLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChkZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhbnRUeXBlVGFibGUudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKGRlZiAtPiBkZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZWZhdWx0RGVmaW5pdGlvbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHREZWZpbml0aW9ucy5qYXZhCmluZGV4IDA2MjAxOGQuLjVjYzliYjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHREZWZpbml0aW9ucy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHREZWZpbml0aW9ucy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjYsNyArNjYsNiBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNvbXBvbmVudERlZihTdHJpbmcgbnMsIFN0cmluZyBuYW1lLCBTdHJpbmcgY2xhc3NuYW1lKSB7CiAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IG5ldyBBbnRUeXBlRGVmaW5pdGlvbigpOwotICAgICAgICBTdHJpbmcgbiA9IFByb2plY3RIZWxwZXIuZ2VuQ29tcG9uZW50TmFtZShucywgbmFtZSk7CiAgICAgICAgIGRlZi5zZXROYW1lKFByb2plY3RIZWxwZXIuZ2VuQ29tcG9uZW50TmFtZShucywgbmFtZSkpOwogICAgICAgICBkZWYuc2V0Q2xhc3NOYW1lKGNsYXNzbmFtZSk7CiAgICAgICAgIGRlZi5zZXRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlci5qYXZhCmluZGV4IGU2ODNiMDUuLmFmNTAzZWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHRMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZWZhdWx0TG9nZ2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw5ICsyNCwxMCBAQAogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgpAQCAtNTcsNiArNTgsNyBAQAogCiAgICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPRkYgLSBiYwogICAgIC8qKiBMaW5lIHNlcGFyYXRvciAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbFNlcCA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQOwogICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT04KIApAQCAtMTM5LDcgKzE0MSw3IEBACiAgICAgICAgICAgICBTdHJpbmcgbXNnMSA9IGVycm9yLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBTdHJpbmcgbXNnMiA9IGNhdXNlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBpZiAobXNnMS5lbmRzV2l0aChtc2cyKSkgewotICAgICAgICAgICAgICAgIG0uYXBwZW5kKG1zZzEuc3Vic3RyaW5nKDAsIG1zZzEubGVuZ3RoKCkgLSBtc2cyLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgbS5hcHBlbmQobXNnMSwgMCwgbXNnMS5sZW5ndGgoKSAtIG1zZzIubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgIGVycm9yID0gY2F1c2U7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQ4LDcgKzE1MCw3IEBACiAgICAgICAgIGlmICh2ZXJib3NlIHx8ICEoZXJyb3IgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikpIHsKICAgICAgICAgICAgIG0uYXBwZW5kKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoZXJyb3IpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG0uYXBwZW5kKGVycm9yKS5hcHBlbmQobFNlcCk7CisgICAgICAgICAgICBtLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlcyVuIiwgZXJyb3IpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTY0LDE3ICsxNjYsMTMgQEAKICAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZ2V0QnVpbGRTdWNjZXNzZnVsTWVzc2FnZSgpKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVuJXMiLCBnZXRCdWlsZFN1Y2Nlc3NmdWxNZXNzYWdlKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGdldEJ1aWxkRmFpbGVkTWVzc2FnZSgpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVuJXMlbiIsIGdldEJ1aWxkRmFpbGVkTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICB0aHJvd2FibGVNZXNzYWdlKG1lc3NhZ2UsIGVycm9yLCBQcm9qZWN0Lk1TR19WRVJCT1NFIDw9IG1zZ091dHB1dExldmVsKTsKICAgICAgICAgfQotICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7Ci0gICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJUb3RhbCB0aW1lOiAiKTsKLSAgICAgICAgbWVzc2FnZS5hcHBlbmQoZm9ybWF0VGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSkpOworICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlblRvdGFsIHRpbWU6ICVzIiwKKyAgICAgICAgICAgICAgICBmb3JtYXRUaW1lKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSkpOwogCiAgICAgICAgIFN0cmluZyBtc2cgPSBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CkBAIC0yMTIsNyArMjEwLDcgQEAKICAgICAgICovCiAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChQcm9qZWN0Lk1TR19JTkZPIDw9IG1zZ091dHB1dExldmVsCi0gICAgICAgICAgICAgICAgJiYgIWV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgJiYgIWV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlbiVzOiIsIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBwcmludE1lc3NhZ2UobXNnLCBvdXQsIGV2ZW50LmdldFByaW9yaXR5KCkpOwogICAgICAgICAgICAgbG9nKG1zZyk7CkBAIC0yNTYsNDggKzI1NCwyNiBAQAogICAgICAgICAvLyBGaWx0ZXIgb3V0IG1lc3NhZ2VzIGJhc2VkIG9uIHByaW9yaXR5CiAgICAgICAgIGlmIChwcmlvcml0eSA8PSBtc2dPdXRwdXRMZXZlbCkgewogCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXNrKCkgIT0gbnVsbCAmJiAhZW1hY3NNb2RlKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhc2soKSA9PSBudWxsIHx8IGVtYWNzTW9kZSkgeworICAgICAgICAgICAgICAgIC8vIGVtYWNzIG1vZGUgb3IgdGhlcmUgaXMgbm8gdGFzaworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGV2ZW50LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFByaW50IG91dCB0aGUgbmFtZSBvZiB0aGUgdGFzayBpZiB3ZSdyZSBpbiBvbmUKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGV2ZW50LmdldFRhc2soKS5nZXRUYXNrTmFtZSgpOwogICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbCA9ICJbIiArIG5hbWUgKyAiXSAiOwogICAgICAgICAgICAgICAgIGludCBzaXplID0gTEVGVF9DT0xVTU5fU0laRSAtIGxhYmVsLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0bXAgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGxhYmVsKTsKLSAgICAgICAgICAgICAgICBsYWJlbCA9IHRtcC50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBzaXplID4gMCA/IFN0cmVhbS5nZW5lcmF0ZSgoKSAtPiAiICIpCisgICAgICAgICAgICAgICAgICAgIC5saW1pdChzaXplKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygpKSArIGxhYmVsIDogbGFiZWw7CiAKLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdSZWFkZXIoZXZlbnQuZ2V0TWVzc2FnZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChsYWJlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGxhYmVsKS5hcHBlbmQobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gci5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsaW5lICE9IG51bGwpOworICAgICAgICAgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGV2ZW50LmdldE1lc3NhZ2UoKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKHIubGluZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBwcmVmaXgsIHByZWZpeCwgIiIpKSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgYmUgcG9zc2libGUKICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQobGFiZWwpLmFwcGVuZChldmVudC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyKTsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9lbWFjcyBtb2RlIG9yIHRoZXJlIGlzIG5vIHRhc2sKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChldmVudC5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgVGhyb3dhYmxlIGV4ID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICBpZiAoUHJvamVjdC5NU0dfREVCVUcgPD0gbXNnT3V0cHV0TGV2ZWwgJiYgZXggIT0gbnVsbCkgewpAQCAtMzYxLDggKzMzNyw3IEBACiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7CiAgICAgICAgIERhdGUgZGF0ZSA9IG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBEYXRlRm9ybWF0LmdldERhdGVUaW1lSW5zdGFuY2UoRGF0ZUZvcm1hdC5TSE9SVCwgRGF0ZUZvcm1hdC5TSE9SVCk7Ci0gICAgICAgIFN0cmluZyBmaW5pc2hUaW1lID0gZm9ybWF0dGVyLmZvcm1hdChkYXRlKTsKLSAgICAgICAgcmV0dXJuIGZpbmlzaFRpbWU7CisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVtdXhJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVtdXhJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGVhMjYzY2EuLmE5NzhjN2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4SW5wdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eElucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw3IEBACiAKIC8qKgogICoKLSAqIFBhc3NlcyBpbnB1dCByZXF1ZXN0cyB0byB0aGUgcHJvamVjdCBvYmplY3QgZm9yIGRlbXV4aW5nIGludG8KKyAqIFBhc3NlcyBpbnB1dCByZXF1ZXN0cyB0byB0aGUgcHJvamVjdCBvYmplY3QgZm9yIGRlbXVsdGlwbGV4aW5nIGludG8KICAqIGluZGl2aWR1YWwgdGFza3MgYW5kIHRocmVhZHMuCiAgKgogICogQHNpbmNlIEFudCAxLjYKQEAgLTQ2LDEwICs0NiwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlYWQgYSBieXRlIGZyb20gdGhlIHByb2plY3QncyBkZW11eGVkIGlucHV0LgorICAgICAqIFJlYWQgYSBieXRlIGZyb20gdGhlIHByb2plY3QncyBkZW11bHRpcGxleGVkIGlucHV0LgogICAgICAqIEByZXR1cm4gdGhlIG5leHQgYnl0ZQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMV07CiAgICAgICAgIGlmIChwcm9qZWN0LmRlbXV4SW5wdXQoYnVmZmVyLCAwLCAxKSA9PSAtMSkgewpAQCAtNjAsMTMgKzYxLDE0IEBACiAKIAogICAgIC8qKgotICAgICAqIFJlYWQgYnl0ZXMgZnJvbSB0aGUgcHJvamVjdCdzIGRlbXV4ZWQgaW5wdXQuCisgICAgICogUmVhZCBieXRlcyBmcm9tIHRoZSBwcm9qZWN0J3MgZGVtdWx0aXBsZXhlZCBpbnB1dC4KICAgICAgKiBAcGFyYW0gYnVmZmVyIGFuIGFycmF5IG9mIGJ5dGVzIHRvIHJlYWQgaW50bwogICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgYXJyYXkgb2YgYnl0ZXMKICAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGFycmF5CiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBwcm9qZWN0LmRlbXV4SW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVtdXhPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RlbXV4T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggOTY0NWNhNy4uNjQ4ZWQzNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGVtdXhPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EZW11eE91dHB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjQsNyArNjQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRiA9IDB4MGE7CiAKICAgICAvKiogTWFwcGluZyBmcm9tIHRocmVhZCB0byBidWZmZXIgKFRocmVhZCB0byBCdWZmZXJJbmZvKS4gKi8KLSAgICBwcml2YXRlIFdlYWtIYXNoTWFwPFRocmVhZCwgQnVmZmVySW5mbz4gYnVmZmVycyA9IG5ldyBXZWFrSGFzaE1hcDxUaHJlYWQsIEJ1ZmZlckluZm8+KCk7CisgICAgcHJpdmF0ZSBXZWFrSGFzaE1hcDxUaHJlYWQsIEJ1ZmZlckluZm8+IGJ1ZmZlcnMgPSBuZXcgV2Vha0hhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHByb2plY3QgdG8gc2VuZCBvdXRwdXQgdG8uCkBAIC05OCwxNCArOTgsMTIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIEJ1ZmZlckluZm8gZ2V0QnVmZmVySW5mbygpIHsKICAgICAgICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgICAgICBCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSAoQnVmZmVySW5mbykgYnVmZmVycy5nZXQoY3VycmVudCk7Ci0gICAgICAgIGlmIChidWZmZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIGJ1ZmZlckluZm8gPSBuZXcgQnVmZmVySW5mbygpOworICAgICAgICByZXR1cm4gYnVmZmVycy5jb21wdXRlSWZBYnNlbnQoY3VycmVudCwgeCAtPiB7CisgICAgICAgICAgICBCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSBuZXcgQnVmZmVySW5mbygpOwogICAgICAgICAgICAgYnVmZmVySW5mby5idWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKElOSVRJQUxfU0laRSk7CiAgICAgICAgICAgICBidWZmZXJJbmZvLmNyU2VlbiA9IGZhbHNlOwotICAgICAgICAgICAgYnVmZmVycy5wdXQoY3VycmVudCwgYnVmZmVySW5mbyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1ZmZlckluZm87CisgICAgICAgICAgICByZXR1cm4gYnVmZmVySW5mbzsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTMsNyArMTExLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVzZXRCdWZmZXJJbmZvKCkgewogICAgICAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0gICAgICAgIEJ1ZmZlckluZm8gYnVmZmVySW5mbyA9IChCdWZmZXJJbmZvKSBidWZmZXJzLmdldChjdXJyZW50KTsKKyAgICAgICAgQnVmZmVySW5mbyBidWZmZXJJbmZvID0gYnVmZmVycy5nZXQoY3VycmVudCk7CiAgICAgICAgIEZpbGVVdGlscy5jbG9zZShidWZmZXJJbmZvLmJ1ZmZlcik7CiAgICAgICAgIGJ1ZmZlckluZm8uYnVmZmVyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBidWZmZXJJbmZvLmNyU2VlbiA9IGZhbHNlOwpAQCAtMTM0LDYgKzEzMiw3IEBACiAgICAgICogQHBhcmFtIGNjIGRhdGEgdG8gbG9nIChieXRlKS4KICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkYXRhIGNhbm5vdCBiZSB3cml0dGVuIHRvIHRoZSBzdHJlYW0KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGJ5dGUgYyA9IChieXRlKSBjYzsKIApAQCAtMTkyLDYgKzE5MSw3IEBACiAgICAgICoKICAgICAgKiBAc2VlICNmbHVzaAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgcmVtb3ZlQnVmZmVyKCk7CkBAIC0yMDMsNiArMjAzLDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGZsdXNoaW5nIHRoZSBzdHJlYW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSBnZXRCdWZmZXJJbmZvKCk7CiAgICAgICAgIGlmIChidWZmZXJJbmZvLmJ1ZmZlci5zaXplKCkgPiAwKSB7CkBAIC0yMTksNiArMjIwLDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW4gaW50byB0aGUgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyBmaW5kIHRoZSBsaW5lIGJyZWFrcyBhbmQgcGFzcyBvdGhlciBjaGFycyB0aHJvdWdoIGluIGJsb2NrcwogICAgICAgICBpbnQgb2Zmc2V0ID0gb2ZmOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlhZ25vc3RpY3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpYWdub3N0aWNzLmphdmEKaW5kZXggNDI0YTBkMi4uOTMzM2E1NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlhZ25vc3RpY3MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaWFnbm9zdGljcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTcgKzE4LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCkBAIC00Miw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KQVhQVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Qcm94eVNldHVwOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuamF2YTE1LlByb3h5RGlhZ25vc3RpY3M7CiBpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwogCiAvKioKQEAgLTUzLDkgKzUyLDYgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIERpYWdub3N0aWNzIHsKIAotICAgIC8qKiB0aGUgdmVyc2lvbiBudW1iZXIgZm9yIGphdmEgMS41IHJldHVybmVkIGZyb20gSmF2YUVudlV0aWxzICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfMV81X05VTUJFUiA9IDE1OwotCiAgICAgLyoqCiAgICAgICogdmFsdWUgZm9yIHdoaWNoIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGNsb2NrIGFuZCB0ZW1wIGZpbGUgdGltZSB0cmlnZ2VycwogICAgICAqIGEgd2FybmluZy4KQEAgLTg4LDcgKzg0LDcgQEAKICAgICAvKioKICAgICAgKiBEb2Vzbid0IGRvIGFueXRoaW5nLgogICAgICAqIEBkZXByZWNhdGVkIE9ic29sZXRlIHNpbmNlIEFudCAxLjguMgotICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc09wdGlvbmFsQXZhaWxhYmxlKCkgewpAQCAtMTA3LDE1ICsxMDMsMTQgQEAKICAgICAgKiByZXR1cm4gdGhlIGxpc3Qgb2YgamFyIGZpbGVzIGV4aXN0aW5nIGluIEFOVF9IT01FL2xpYgogICAgICAqIGFuZCB0aGF0IG11c3QgaGF2ZSBiZWVuIHBpY2tlZCB1cCBieSBBbnQgc2NyaXB0LgogICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgamFyIGZpbGVzIGV4aXN0aW5nIGluIGFudC5ob21lL2xpYiBvcgotICAgICAqIDx0dD5udWxsPC90dD4gaWYgYW4gZXJyb3Igb2NjdXJzLgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEZpbGVbXSBsaXN0TGlicmFyaWVzKCkgewogICAgICAgICBTdHJpbmcgaG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKTsKICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgRmlsZSBsaWJEaXIgPSBuZXcgRmlsZShob21lLCAibGliIik7Ci0gICAgICAgIHJldHVybiBsaXN0SmFyRmlsZXMobGliRGlyKTsKKyAgICAgICAgcmV0dXJuIGxpc3RKYXJGaWxlcyhuZXcgRmlsZShob21lLCAibGliIikpOwogCiAgICAgfQogCkBAIC0xMjUsMTMgKzEyMCw3IEBACiAgICAgICogQHJldHVybiBhcnJheSBvZiBmaWxlcyAob3IgbnVsbCBmb3Igbm8gc3VjaCBkaXJlY3RvcnkpCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIGxpc3RKYXJGaWxlcyhGaWxlIGxpYkRpcikgewotICAgICAgICBGaWxlbmFtZUZpbHRlciBmaWx0ZXIgPSBuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUuZW5kc1dpdGgoIi5qYXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgRmlsZVtdIGZpbGVzICA9IGxpYkRpci5saXN0RmlsZXMoZmlsdGVyKTsKLSAgICAgICAgcmV0dXJuIGZpbGVzOworICAgICAgICByZXR1cm4gbGliRGlyLmxpc3RGaWxlcygoZGlyLCBuYW1lKSAtPiBuYW1lLmVuZHNXaXRoKCIuamFyIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc0LDggKzE2Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gIkNvdWxkIG5vdCBjcmVhdGUgYW4gWE1MIFBhcnNlciI7CiAgICAgICAgIH0KICAgICAgICAgLy8gY2hlY2sgdG8gd2hhdCBpcyBpbiB0aGUgY2xhc3NuYW1lCi0gICAgICAgIFN0cmluZyBzYXhQYXJzZXJOYW1lID0gc2F4UGFyc2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gc2F4UGFyc2VyTmFtZTsKKyAgICAgICAgcmV0dXJuIHNheFBhcnNlci5nZXRDbGFzcygpLmdldE5hbWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4OCw4ICsxNzYsNyBAQAogICAgICAgICAgICAgcmV0dXJuICJDb3VsZCBub3QgY3JlYXRlIGFuIFhTTFQgUHJvY2Vzc29yIjsKICAgICAgICAgfQogICAgICAgICAvLyBjaGVjayB0byB3aGF0IGlzIGluIHRoZSBjbGFzc25hbWUKLSAgICAgICAgU3RyaW5nIHByb2Nlc3Nvck5hbWUgPSB0cmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3Nvck5hbWU7CisgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMSwxNyArMjA4LDE1IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgVHJhbnNmb3JtZXIgZ2V0WFNMVFByb2Nlc3NvcigpIHsKICAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBpZiAodHJhbnNmb3JtZXJGYWN0b3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodHJhbnNmb3JtZXJGYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICBpZ25vcmVUaHJvd2FibGUoZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICAgICAgaWdub3JlVGhyb3dhYmxlKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcjsKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzEsMTIgKzM1Niw4IEBACiAgICAgICAgICAgICBvdXQucHJpbnRsbigiQWNjZXNzIHRvIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkgYmxvY2tlZCAiICsgImJ5IGEgc2VjdXJpdHkgbWFuYWdlciIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4ga2V5cyA9IHN5c3Byb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIGtleXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGtleSArICIgOiAiICsgdmFsdWUpOwotICAgICAgICB9CisgICAgICAgIHN5c3Byb3BzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXAoa2V5IC0+IGtleSArICIgOiAiICsgZ2V0UHJvcGVydHkoa2V5KSkuZm9yRWFjaChvdXQ6OnByaW50bG4pOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDYzLDExICs0NDQsMTEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENsYXNzPD8+IHdoaWNoID0gQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5lbnYuV2hpY2giKTsKICAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSB3aGljaC5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgIm1haW4iLCBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9KTsKKyAgICAgICAgICAgICAgICAibWFpbiIsIFN0cmluZ1tdLmNsYXNzKTsKICAgICAgICAgICAgIG1ldGhvZC5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtde25ldyBTdHJpbmdbXXt9fSk7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgb3V0LnByaW50bG4oIk5vdCBhdmFpbGFibGUuIik7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiRG93bmxvYWQgaXQgYXQgaHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMvIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiRG93bmxvYWQgaXQgYXQgaHR0cHM6Ly94bWwuYXBhY2hlLm9yZy9jb21tb25zLyIpOwogICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGVycm9yID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKSA9PSBudWxsID8gZSA6IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CkBAIC00ODYsNyArNDY3LDcgQEAKICAgICAgKiBiZWNhdXNlIEFudCByZXF1aXJlcyBtdWx0aXBsZSBsaWJyYXJpZXMgdG8gY29tcGlsZSBhbmQgb25lIG9mIHRoZW0KICAgICAgKiB3YXMgbWlzc2luZyB3aGVuIGNvbXBpbGluZyBBbnQuCiAgICAgICogQHBhcmFtIG91dCB0aGUgc3RyZWFtIHRvIHByaW50IHRoZSB0YXNrcyByZXBvcnQgdG8KLSAgICAgKiA8dHQ+bnVsbDwvdHQ+IGZvciBhIG1pc3Npbmcgc3RyZWFtIChpZSBtYXBwaW5nKS4KKyAgICAgKiA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBtaXNzaW5nIHN0cmVhbSAoaWUgbWFwcGluZykuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb1JlcG9ydFRhc2tzQXZhaWxhYmlsaXR5KFByaW50U3RyZWFtIG91dCkgewogICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IE1haW4uY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgKQEAgLTQ5Nyw4ICs0NzgsNyBAQAogICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaXMpOwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4ga2V5cyA9IHByb3BzLmtleXMoKTsga2V5cy5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBwcm9wcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CkBAIC01ODAsMTIgKzU2MCwxMiBAQAogICAgICAgICAvL2NyZWF0ZSB0aGUgZmlsZQogICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBGaWxlIHRlbXBGaWxlID0gbnVsbDsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmaWxlb3V0ID0gbnVsbDsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVpbiA9IG51bGw7CisgICAgICAgIE91dHB1dFN0cmVhbSBmaWxlb3V0ID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gZmlsZWluID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlhZyIsICJ0eHQiLCB0ZW1wRGlyZWN0b3J5KTsKICAgICAgICAgICAgIC8vZG8gc29tZSB3cml0aW5nIHRvIGl0Ci0gICAgICAgICAgICBmaWxlb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcEZpbGUpOworICAgICAgICAgICAgZmlsZW91dCA9IEZpbGVzLm5ld091dHB1dFN0cmVhbSh0ZW1wRmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbS0lMT0JZVEVdOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBURVNUX0ZJTEVfU0laRTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZmlsZW91dC53cml0ZShidWZmZXIpOwpAQCAtNTk1LDcgKzU3NSw3IEBACiAKICAgICAgICAgICAgIC8vIHJlYWQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGhhcyBiZWVuIHdyaXR0ZW4gY29tcGxldGVseQogICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwotICAgICAgICAgICAgZmlsZWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0ZW1wRmlsZSk7CisgICAgICAgICAgICBmaWxlaW4gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbSh0ZW1wRmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICBpbnQgdG90YWwgPSAwOwogICAgICAgICAgICAgaW50IHJlYWQgPSAwOwogICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gZmlsZWluLnJlYWQoYnVmZmVyLCAwLCBLSUxPQllURSkpID4gMCkgewpAQCAtNjk2LDI1ICs2NzYsMTAgQEAKICAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuU09DS1NfUFJPWFlfVVNFUk5BTUUpOwogICAgICAgICBwcmludFByb3BlcnR5KG91dCwgUHJveHlTZXR1cC5TT0NLU19QUk9YWV9QQVNTV09SRCk7CiAKLSAgICAgICAgaWYgKEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbk51bWJlcigpIDwgSkFWQV8xXzVfTlVNQkVSKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KICAgICAgICAgcHJpbnRQcm9wZXJ0eShvdXQsIFByb3h5U2V0dXAuVVNFX1NZU1RFTV9QUk9YSUVTKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHByb3h5RGlhZ0NsYXNzbmFtZSA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmphdmExNS5Qcm94eURpYWdub3N0aWNzIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzPD8+IHByb3h5RGlhZ0NsYXNzID0gQ2xhc3MuZm9yTmFtZShwcm94eURpYWdDbGFzc25hbWUpOwotICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gcHJveHlEaWFnQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKCJKYXZhMS41KyBwcm94eSBzZXR0aW5nczoiKTsKLSAgICAgICAgICAgIG91dC5wcmludGxuKGluc3RhbmNlLnRvU3RyaW5nKCkpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vbm90IGluY2x1ZGVkLCBkbyBub3RoaW5nCi0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9ub3QgaW5jbHVkZWQsIGRvIG5vdGhpbmcKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL25vdCBpbmNsdWRlZCwgZG8gbm90aGluZwotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7Ci0gICAgICAgICAgICAvLyBub3QgaW5jbHVkZWQsIHRvIG5vdGhpbmcKLSAgICAgICAgfQorICAgICAgICBQcm94eURpYWdub3N0aWNzIHByb3h5RGlhZyA9IG5ldyBQcm94eURpYWdub3N0aWNzKCk7CisgICAgICAgIG91dC5wcmludGxuKCJKYXZhMS41KyBwcm94eSBzZXR0aW5nczoiKTsKKyAgICAgICAgb3V0LnByaW50bG4ocHJveHlEaWFnLnRvU3RyaW5nKCkpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lci5qYXZhCmluZGV4IGEwZTc4MzcuLjNiNTA0MDAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0RpcmVjdG9yeVNjYW5uZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxNSArMjAsMjIgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CkBAIC0zOSw5ICs0Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlRva2VuaXplZFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlRva2VuaXplZFBhdHRlcm47Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db2xsZWN0aW9uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TeW1ib2xpY0xpbmtVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlZlY3RvclNldDsKIAogLyoqCkBAIC0yMjQsMTYgKzIyOSwxMiBAQAogICAgIC8qKiBIZWxwZXIuICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKLSAgICAvKiogSGVscGVyLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN5bWJvbGljTGlua1V0aWxzIFNZTUxJTktfVVRJTFMgPQotICAgICAgICBTeW1ib2xpY0xpbmtVdGlscy5nZXRTeW1ib2xpY0xpbmtVdGlscygpOwotCiAgICAgLyoqCiAgICAgICogUGF0dGVybnMgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIGJ5IGRlZmF1bHQuCiAgICAgICoKICAgICAgKiBAc2VlICNhZGREZWZhdWx0RXhjbHVkZXMoKQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IGRlZmF1bHRFeGNsdWRlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBkZWZhdWx0RXhjbHVkZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgc3RhdGljIHsKICAgICAgICAgcmVzZXREZWZhdWx0RXhjbHVkZXMoKTsKICAgICB9CkBAIC0zMjYsNyArMzI3LDcgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBzY2FubmVkRGlycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHNjYW5uZWREaXJzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgLyoqCiAgICAgICogTWFwIG9mIGFsbCBpbmNsdWRlIHBhdHRlcm5zIHRoYXQgYXJlIGZ1bGwgZmlsZSBuYW1lcyBhbmQgZG9uJ3QKQEAgLTM0Myw3ICszNDQsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVG9rZW5pemVkUGF0aD4gaW5jbHVkZU5vblBhdHRlcm5zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUb2tlbml6ZWRQYXRoPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVG9rZW5pemVkUGF0aD4gaW5jbHVkZU5vblBhdHRlcm5zID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogTWFwIG9mIGFsbCBleGNsdWRlIHBhdHRlcm5zIHRoYXQgYXJlIGZ1bGwgZmlsZSBuYW1lcyBhbmQgZG9uJ3QKQEAgLTM2MCw3ICszNjEsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVG9rZW5pemVkUGF0aD4gZXhjbHVkZU5vblBhdHRlcm5zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUb2tlbml6ZWRQYXRoPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVG9rZW5pemVkUGF0aD4gZXhjbHVkZU5vblBhdHRlcm5zID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogQXJyYXkgb2YgYWxsIGluY2x1ZGUgcGF0dGVybnMgdGhhdCBjb250YWluIHdpbGRjYXJkcy4KQEAgLTQzOSwxMyArNDQwLDcgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG5vdEZvbGxvd2VkU3ltbGlua3MgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBTb2xlIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEaXJlY3RvcnlTY2FubmVyKCkgewotICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IG5vdEZvbGxvd2VkU3ltbGlua3MgPSBuZXcgSGFzaFNldDw+KCk7CiAKICAgICAvKioKICAgICAgKiBUZXN0IHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gcGF0aCBtYXRjaGVzIHRoZSBzdGFydCBvZiBhIGdpdmVuCkBAIC02MjEsOSArNjE2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXREZWZhdWx0RXhjbHVkZXMoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoZGVmYXVsdEV4Y2x1ZGVzKSB7CiAgICAgICAgICAgICBkZWZhdWx0RXhjbHVkZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgREVGQVVMVEVYQ0xVREVTLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEV4Y2x1ZGVzLmFkZChERUZBVUxURVhDTFVERVNbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKGRlZmF1bHRFeGNsdWRlcywgREVGQVVMVEVYQ0xVREVTKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjM1LDggKzYyOCw5IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gYmFzZWRpciBUaGUgYmFzZSBkaXJlY3RvcnkgdG8gc2Nhbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKGZpbmFsIFN0cmluZyBiYXNlZGlyKSB7Ci0gICAgICAgIHNldEJhc2VkaXIoYmFzZWRpciA9PSBudWxsID8gKEZpbGUpIG51bGwKKyAgICAgICAgc2V0QmFzZWRpcihiYXNlZGlyID09IG51bGwgPyBudWxsCiAgICAgICAgICAgICA6IG5ldyBGaWxlKGJhc2VkaXIucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgKICAgICAgICAgICAgICdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcikpKTsKICAgICB9CkBAIC02NDcsNiArNjQxLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBiYXNlZGlyIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3Igc2Nhbm5pbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEJhc2VkaXIoZmluYWwgRmlsZSBiYXNlZGlyKSB7CiAgICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7CiAgICAgfQpAQCAtNjU3LDYgKzY1Miw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIGRpcmVjdG9yeSB0byBiZSBzY2FubmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBnZXRCYXNlZGlyKCkgewogICAgICAgICByZXR1cm4gYmFzZWRpcjsKICAgICB9CkBAIC02NzgsNiArNjc0LDcgQEAKICAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIHN5c3RlbSBzaG91bGQgYmUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2FyZGVkIGFzIGEgY2FzZSBzZW5zaXRpdmUgb25lLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CiAgICAgICAgIHRoaXMuaXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwogICAgIH0KQEAgLTczNywxNCArNzM0LDEzIEBACiAgICAgICogICAgICAgICAgICAgICAgIGxpc3QgaXMgZ2l2ZW4sIGFsbCBlbGVtZW50cyBtdXN0IGJlCiAgICAgICogICAgICAgICAgICAgICAgIG5vbi08Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0SW5jbHVkZXMoZmluYWwgU3RyaW5nW10gaW5jbHVkZXMpIHsKICAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBudWxsOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IG5ldyBTdHJpbmdbaW5jbHVkZXMubGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVzW2ldID0gbm9ybWFsaXplUGF0dGVybihpbmNsdWRlc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gU3RyZWFtLm9mKGluY2x1ZGVzKQorICAgICAgICAgICAgICAgIC5tYXAoRGlyZWN0b3J5U2Nhbm5lcjo6bm9ybWFsaXplUGF0dGVybikudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzYwLDE0ICs3NTYsMTMgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4Y2x1ZGVkLiBJZiBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiBsaXN0IGlzCiAgICAgICogICAgICAgICAgICAgICAgIGdpdmVuLCBhbGwgZWxlbWVudHMgbXVzdCBiZSBub24tPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldEV4Y2x1ZGVzKGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzKSB7CiAgICAgICAgIGlmIChleGNsdWRlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gbnVsbDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBuZXcgU3RyaW5nW2V4Y2x1ZGVzLmxlbmd0aF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leGNsdWRlc1tpXSA9IG5vcm1hbGl6ZVBhdHRlcm4oZXhjbHVkZXNbaV0pOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IFN0cmVhbS5vZihleGNsdWRlcykubWFwKERpcmVjdG9yeVNjYW5uZXI6Om5vcm1hbGl6ZVBhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03ODYsMTcgKzc4MSwxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRFeGNsdWRlcyhmaW5hbCBTdHJpbmdbXSBleGNsdWRlcykgewogICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCAmJiBleGNsdWRlcy5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5leGNsdWRlcyAhPSBudWxsICYmIHRoaXMuZXhjbHVkZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRtcCA9IG5ldyBTdHJpbmdbZXhjbHVkZXMubGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRoaXMuZXhjbHVkZXMubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHRoaXMuZXhjbHVkZXMsIDAsIHRtcCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcFt0aGlzLmV4Y2x1ZGVzLmxlbmd0aCArIGldID0gbm9ybWFsaXplUGF0dGVybihleGNsdWRlc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSB0bXA7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHRoaXMuZXhjbHVkZXMgPT0gbnVsbCB8fCB0aGlzLmV4Y2x1ZGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgc2V0RXhjbHVkZXMoZXhjbHVkZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gU3RyZWFtLmNvbmNhdChTdHJlYW0ub2YodGhpcy5leGNsdWRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0ub2YoZXhjbHVkZXMpLm1hcChEaXJlY3RvcnlTY2FubmVyOjpub3JtYWxpemVQYXR0ZXJuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODI0LDYgKzgxNCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc2VsZWN0b3JzIHNwZWNpZmllcyB0aGUgc2VsZWN0b3JzIHRvIGJlIGludm9rZWQgb24gYSBzY2FuLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRTZWxlY3RvcnMoZmluYWwgRmlsZVNlbGVjdG9yW10gc2VsZWN0b3JzKSB7CiAgICAgICAgIHRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOwogICAgIH0KQEAgLTg0OSw2ICs4NDAsNyBAQAogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBiYXNlIGRpcmVjdG9yeSB3YXMgc2V0CiAgICAgICogICAgICAgICAgICBpbmNvcnJlY3RseSAoaS5lLiBpZiBpdCBkb2Vzbid0IGV4aXN0IG9yIGlzbid0IGEgZGlyZWN0b3J5KS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzY2FuKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoc2NhbkxvY2spIHsKICAgICAgICAgICAgIGlmIChzY2FubmluZykgewpAQCAtODcyLDEzICs4NjQsMTMgQEAKICAgICAgICAgICAgICAgICBjbGVhclJlc3VsdHMoKTsKIAogICAgICAgICAgICAgICAgIC8vIHNldCBpbi9leGNsdWRlcyB0byByZWFzb25hYmxlIGRlZmF1bHRzIGlmIG5lZWRlZDoKLSAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG51bGxJbmNsdWRlcyA9IChpbmNsdWRlcyA9PSBudWxsKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG51bGxJbmNsdWRlcyA9IGluY2x1ZGVzID09IG51bGw7CiAgICAgICAgICAgICAgICAgaW5jbHVkZXMgPSBudWxsSW5jbHVkZXMgPyBuZXcgU3RyaW5nW10ge1NlbGVjdG9yVXRpbHMuREVFUF9UUkVFX01BVENIfSA6IGluY2x1ZGVzOwotICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbnVsbEV4Y2x1ZGVzID0gKGV4Y2x1ZGVzID09IG51bGwpOworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbnVsbEV4Y2x1ZGVzID0gZXhjbHVkZXMgPT0gbnVsbDsKICAgICAgICAgICAgICAgICBleGNsdWRlcyA9IG51bGxFeGNsdWRlcyA/IG5ldyBTdHJpbmdbMF0gOiBleGNsdWRlczsKIAogICAgICAgICAgICAgICAgIGlmIChiYXNlZGlyICE9IG51bGwgJiYgIWZvbGxvd1N5bWxpbmtzCi0gICAgICAgICAgICAgICAgICAgICYmIFNZTUxJTktfVVRJTFMuaXNTeW1ib2xpY0xpbmsoYmFzZWRpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgRmlsZXMuaXNTeW1ib2xpY0xpbmsoYmFzZWRpci50b1BhdGgoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgbm90Rm9sbG93ZWRTeW1saW5rcy5hZGQoYmFzZWRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJhc2VkaXIgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KQEAgLTkwMSwyMiArODkzLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJhc2VkaXIuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWxsZWdhbCA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJhc2VkaXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlZGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeS4iKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaWxsZWdhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbGxlZ2FsOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKFRva2VuaXplZFBhdGguRU1QVFlfUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4Y2x1ZGVkKFRva2VuaXplZFBhdGguRU1QVFlfUEFUSCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKCIiLCBiYXNlZGlyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNJbmNsdWRlZC5hZGRFbGVtZW50KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0Rlc2VsZWN0ZWQuYWRkRWxlbWVudCgiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0V4Y2x1ZGVkKFRva2VuaXplZFBhdGguRU1QVFlfUEFUSCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KCIiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NlbGVjdGVkKCIiLCBiYXNlZGlyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0luY2x1ZGVkLmFkZEVsZW1lbnQoIiIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0Rlc2VsZWN0ZWQuYWRkRWxlbWVudCgiIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQuYWRkRWxlbWVudCgiIik7CkBAIC05MjYsOCArOTE1LDYgQEAKICAgICAgICAgICAgICAgICBpbmNsdWRlcyA9IG51bGxJbmNsdWRlcyA/IG51bGwgOiBpbmNsdWRlczsKICAgICAgICAgICAgICAgICBleGNsdWRlcyA9IG51bGxFeGNsdWRlcyA/IG51bGwgOiBleGNsdWRlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBiYXNlZGlyID0gc2F2ZWRCYXNlOwogICAgICAgICAgICAgc3luY2hyb25pemVkIChzY2FuTG9jaykgewpAQCAtOTQ0LDE3ICs5MzEsMTggQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY2hlY2tJbmNsdWRlUGF0dGVybnMoKSB7CiAgICAgICAgIGVuc3VyZU5vblBhdHRlcm5TZXRzUmVhZHkoKTsKLSAgICAgICAgZmluYWwgTWFwPFRva2VuaXplZFBhdGgsIFN0cmluZz4gbmV3cm9vdHMgPSBuZXcgSGFzaE1hcDxUb2tlbml6ZWRQYXRoLCBTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIE1hcDxUb2tlbml6ZWRQYXRoLCBTdHJpbmc+IG5ld3Jvb3RzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIC8vIHB1dCBpbiB0aGUgbmV3cm9vdHMgbWFwIHRoZSBpbmNsdWRlIHBhdHRlcm5zIHdpdGhvdXQKICAgICAgICAgLy8gd2lsZGNhcmQgdG9rZW5zCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0dGVybiA9IGluY2x1ZGVQYXR0ZXJuc1tpXS50b1N0cmluZygpOworICAgICAgICBmb3IgKFRva2VuaXplZFBhdHRlcm4gaW5jbHVkZVBhdHRlcm4gOiBpbmNsdWRlUGF0dGVybnMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuID0gaW5jbHVkZVBhdHRlcm4udG9TdHJpbmcoKTsKICAgICAgICAgICAgIGlmICghc2hvdWxkU2tpcFBhdHRlcm4ocGF0dGVybikpIHsKLSAgICAgICAgICAgICAgICBuZXdyb290cy5wdXQoaW5jbHVkZVBhdHRlcm5zW2ldLnJ0cmltV2lsZGNhcmRUb2tlbnMoKSwgcGF0dGVybik7CisgICAgICAgICAgICAgICAgbmV3cm9vdHMucHV0KGluY2x1ZGVQYXR0ZXJuLnJ0cmltV2lsZGNhcmRUb2tlbnMoKSwgcGF0dGVybik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBUb2tlbml6ZWRQYXRoPiBlbnRyeSA6IGluY2x1ZGVOb25QYXR0ZXJucy5lbnRyeVNldCgpKSB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgVG9rZW5pemVkUGF0aD4gZW50cnkgOiBpbmNsdWRlTm9uUGF0dGVybnMKKyAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0dGVybiA9IGVudHJ5LmdldEtleSgpOwogICAgICAgICAgICAgaWYgKCFzaG91bGRTa2lwUGF0dGVybihwYXR0ZXJuKSkgewogICAgICAgICAgICAgICAgIG5ld3Jvb3RzLnB1dChlbnRyeS5nZXRWYWx1ZSgpLCBwYXR0ZXJuKTsKQEAgLTEwMjcsOCArMTAxNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKGN1cnJlbnRQYXRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQoY3VycmVudFBhdGgpICYmICFjdXJyZW50ZWxlbWVudC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWREaXIoY3VycmVudFBhdGgsIG15ZmlsZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9ICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuZGlyKG15ZmlsZSwgY3VycmVudFBhdGgsIHRydWUpOwpAQCAtMTA1NiwzMSArMTA0MywyNSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRTa2lwUGF0dGVybihmaW5hbCBTdHJpbmcgcGF0dGVybikgewogICAgICAgICBpZiAoRmlsZVV0aWxzLmlzQWJzb2x1dGVQYXRoKHBhdHRlcm4pKSB7CiAgICAgICAgICAgICAvL3NraXAgYWJzLiBwYXRocyBub3QgdW5kZXIgYmFzZWRpciwgaWYgc2V0OgotICAgICAgICAgICAgaWYgKGJhc2VkaXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmICFTZWxlY3RvclV0aWxzLm1hdGNoUGF0dGVyblN0YXJ0KHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWRpci5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nhc2VTZW5zaXRpdmUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChiYXNlZGlyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vc2tpcCBub24tYWJzLiBwYXRocyBpZiBiYXNlZGlyID09IG51bGw6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAhKGJhc2VkaXIgPT0gbnVsbCB8fCBTZWxlY3RvclV0aWxzLm1hdGNoUGF0dGVyblN0YXJ0KHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgIGJhc2VkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIGlzQ2FzZVNlbnNpdGl2ZSgpKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHJldHVybiBiYXNlZGlyID09IG51bGw7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ2xlYXIgdGhlIHJlc3VsdCBjYWNoZXMgZm9yIGEgc2Nhbi4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJSZXN1bHRzKCkgewotICAgICAgICBmaWxlc0luY2x1ZGVkICAgID0gbmV3IFZlY3RvclNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGZpbGVzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZmlsZXNFeGNsdWRlZCAgICA9IG5ldyBWZWN0b3JTZXQ8U3RyaW5nPigpOwotICAgICAgICBmaWxlc0Rlc2VsZWN0ZWQgID0gbmV3IFZlY3RvclNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGRpcnNJbmNsdWRlZCAgICAgPSBuZXcgVmVjdG9yU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZGlyc05vdEluY2x1ZGVkICA9IG5ldyBWZWN0b3JTZXQ8U3RyaW5nPigpOwotICAgICAgICBkaXJzRXhjbHVkZWQgICAgID0gbmV3IFZlY3RvclNldDxTdHJpbmc+KCk7Ci0gICAgICAgIGRpcnNEZXNlbGVjdGVkICAgPSBuZXcgVmVjdG9yU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZmlsZXNJbmNsdWRlZCAgICA9IG5ldyBWZWN0b3JTZXQ8PigpOworICAgICAgICBmaWxlc05vdEluY2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgIGZpbGVzRXhjbHVkZWQgICAgPSBuZXcgVmVjdG9yU2V0PD4oKTsKKyAgICAgICAgZmlsZXNEZXNlbGVjdGVkICA9IG5ldyBWZWN0b3JTZXQ8PigpOworICAgICAgICBkaXJzSW5jbHVkZWQgICAgID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgIGRpcnNOb3RJbmNsdWRlZCAgPSBuZXcgVmVjdG9yU2V0PD4oKTsKKyAgICAgICAgZGlyc0V4Y2x1ZGVkICAgICA9IG5ldyBWZWN0b3JTZXQ8PigpOworICAgICAgICBkaXJzRGVzZWxlY3RlZCAgID0gbmV3IFZlY3RvclNldDw+KCk7CiAgICAgICAgIGV2ZXJ5dGhpbmdJbmNsdWRlZCA9IChiYXNlZGlyICE9IG51bGwpOwogICAgICAgICBzY2FubmVkRGlycy5jbGVhcigpOwogICAgICAgICBub3RGb2xsb3dlZFN5bWxpbmtzLmNsZWFyKCk7CkBAIC0xMTQ0LDEwICsxMTI1LDEwIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NTbG93U2NhbihmaW5hbCBTdHJpbmdbXSBhcnIpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFRva2VuaXplZFBhdGggcGF0aCAgPSBuZXcgVG9rZW5pemVkUGF0aChhcnJbaV0pOworICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogYXJyKSB7CisgICAgICAgICAgICBmaW5hbCBUb2tlbml6ZWRQYXRoIHBhdGggID0gbmV3IFRva2VuaXplZFBhdGgoZWxlbWVudCk7CiAgICAgICAgICAgICBpZiAoIWNvdWxkSG9sZEluY2x1ZGVkKHBhdGgpIHx8IGNvbnRlbnRzRXhjbHVkZWQocGF0aCkpIHsKLSAgICAgICAgICAgICAgICBzY2FuZGlyKG5ldyBGaWxlKGJhc2VkaXIsIGFycltpXSksIHBhdGgsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzY2FuZGlyKG5ldyBGaWxlKGJhc2VkaXIsIGVsZW1lbnQpLCBwYXRoLCBmYWxzZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjA1LDE5ICsxMTg2LDE5IEBACiAgICAgICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIgKyBET0VTX05PVF9FWElTVF9QT1NURklYKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRpciArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgaXMgbm90IGEgZGlyZWN0b3J5LiIsIGRpcik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSU8gZXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5ICciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyLmdldEFic29sdXRlUGF0aCgpICsgIiciKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklPIGVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBzY2FuZGlyKGRpciwgcGF0aCwgZmFzdCwgbmV3ZmlsZXMsIG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKSk7CisgICAgICAgIHNjYW5kaXIoZGlyLCBwYXRoLCBmYXN0LCBuZXdmaWxlcywgbmV3IExpbmtlZExpc3Q8PigpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2NhbmRpcihmaW5hbCBGaWxlIGRpciwgZmluYWwgVG9rZW5pemVkUGF0aCBwYXRoLCBmaW5hbCBib29sZWFuIGZhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3RmlsZXMsIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBkaXJlY3RvcnlOYW1lc0ZvbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbmV3RmlsZXMsIGZpbmFsIERlcXVlPFN0cmluZz4gZGlyZWN0b3J5TmFtZXNGb2xsb3dlZCkgewogICAgICAgICBTdHJpbmcgdnBhdGggPSBwYXRoLnRvU3RyaW5nKCk7Ci0gICAgICAgIGlmICh2cGF0aC5sZW5ndGgoKSA+IDAgJiYgIXZwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeworICAgICAgICBpZiAoIXZwYXRoLmlzRW1wdHkoKSAmJiAhdnBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CiAgICAgICAgICAgICB2cGF0aCArPSBGaWxlLnNlcGFyYXRvcjsKICAgICAgICAgfQogCkBAIC0xMjI2LDMwICsxMjA3LDI4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb2xsb3dTeW1saW5rcykgewotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbm9MaW5rcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gbm9MaW5rcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbmV3RmlsZSA6IG5ld0ZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNZTUxJTktfVVRJTFMuaXNTeW1ib2xpY0xpbmsoZGlyLCBuZXdGaWxlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB2cGF0aCArIG5ld0ZpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIG5ld0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnNFeGNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNFeGNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvck5vdEZvbGxvd2VkU3ltbGluayhuYW1lLCBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vTGlua3MuYWRkKG5ld0ZpbGUpOworICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggZmlsZVBhdGg7CisgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gUGF0aHMuZ2V0KG5ld0ZpbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gUGF0aHMuZ2V0KGRpci50b1BhdGgoKS50b1N0cmluZygpLCBuZXdGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKEZpbGVzLmlzU3ltYm9saWNMaW5rKGZpbGVQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IHZwYXRoICsgbmV3RmlsZTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBuZXdGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNFeGNsdWRlZC5hZGRFbGVtZW50KG5hbWUpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiSU9FeGNlcHRpb24gY2F1Z2h0IHdoaWxlIGNoZWNraW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZvciBsaW5rcywgY291bGRuJ3QgZ2V0IGNhbm9uaWNhbCBwYXRoISI7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgY2F1Z2h0IGFuZCByZWRpcmVjdGVkIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtCi0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtc2cpOworICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9yTm90Rm9sbG93ZWRTeW1saW5rKG5hbWUsIGZpbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG5vTGlua3MuYWRkKG5ld0ZpbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld0ZpbGVzID0gKG5vTGlua3MudG9BcnJheShuZXcgU3RyaW5nW25vTGlua3Muc2l6ZSgpXSkpOworICAgICAgICAgICAgbmV3RmlsZXMgPSBub0xpbmtzLnRvQXJyYXkobmV3IFN0cmluZ1tub0xpbmtzLnNpemUoKV0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGlyZWN0b3J5TmFtZXNGb2xsb3dlZC5hZGRGaXJzdChkaXIuZ2V0TmFtZSgpKTsKICAgICAgICAgfQpAQCAtMTMyOCw3ICsxMzA3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgYWNjb3VudEZvckluY2x1ZGVkRGlyKGZpbmFsIFRva2VuaXplZFBhdGggbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgYm9vbGVhbiBmYXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY2hpbGRyZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFN0cmluZz4gZGlyZWN0b3J5TmFtZXNGb2xsb3dlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVxdWU8U3RyaW5nPiBkaXJlY3RvcnlOYW1lc0ZvbGxvd2VkKSB7CiAgICAgICAgIHByb2Nlc3NJbmNsdWRlZChuYW1lLCBmaWxlLCBkaXJzSW5jbHVkZWQsIGRpcnNFeGNsdWRlZCwgZGlyc0Rlc2VsZWN0ZWQpOwogICAgICAgICBpZiAoZmFzdCAmJiBjb3VsZEhvbGRJbmNsdWRlZChuYW1lKSAmJiAhY29udGVudHNFeGNsdWRlZChuYW1lKSkgewogICAgICAgICAgICAgc2NhbmRpcihmaWxlLCBuYW1lLCBmYXN0LCBjaGlsZHJlbiwgZGlyZWN0b3J5TmFtZXNGb2xsb3dlZCk7CkBAIC0xMzQ3LDEzICsxMzI2LDEyIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlZChmaW5hbCBUb2tlbml6ZWRQYXRoIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGluYywgZmluYWwgVmVjdG9yPFN0cmluZz4gZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gZGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIExpc3Q8U3RyaW5nPiBpbmMsIGZpbmFsIExpc3Q8U3RyaW5nPiBleGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZGVzKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gcGF0aC50b1N0cmluZygpOwogICAgICAgICBpZiAoaW5jLmNvbnRhaW5zKG5hbWUpIHx8IGV4Yy5jb250YWlucyhuYW1lKSB8fCBkZXMuY29udGFpbnMobmFtZSkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCiAgICAgICAgIGJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKGlzRXhjbHVkZWQocGF0aCkpIHsKICAgICAgICAgICAgIGV4Yy5hZGQobmFtZSk7CkBAIC0xMzg5LDE3ICsxMzY3LDEyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5jbHVkZWQoZmluYWwgVG9rZW5pemVkUGF0aCBwYXRoKSB7CiAgICAgICAgIGVuc3VyZU5vblBhdHRlcm5TZXRzUmVhZHkoKTsKIAotICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlKCkKLSAgICAgICAgICAgID8gaW5jbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zS2V5KHBhdGgudG9TdHJpbmcoKSkKLSAgICAgICAgICAgIDogaW5jbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zS2V5KHBhdGgudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIFN0cmluZyB0b01hdGNoID0gcGF0aC50b1N0cmluZygpOworICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZSgpKSB7CisgICAgICAgICAgICB0b01hdGNoID0gdG9NYXRjaC50b1VwcGVyQ2FzZSgpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaW5jbHVkZVBhdHRlcm5zW2ldLm1hdGNoUGF0aChwYXRoLCBpc0Nhc2VTZW5zaXRpdmUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBpbmNsdWRlTm9uUGF0dGVybnMuY29udGFpbnNLZXkodG9NYXRjaCkKKyAgICAgICAgICAgIHx8IFN0cmVhbS5vZihpbmNsdWRlUGF0dGVybnMpLmFueU1hdGNoKHAgLT4gcC5tYXRjaFBhdGgocGF0aCwgaXNDYXNlU2Vuc2l0aXZlKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0MjMsMTkgKzEzOTYsOSBAQAogICAgICAqICAgICAgICAgbGVhc3Qgb25lIGluY2x1ZGUgcGF0dGVybiwgb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY291bGRIb2xkSW5jbHVkZWQoZmluYWwgVG9rZW5pemVkUGF0aCB0b2tlbml6ZWROYW1lKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY291bGRIb2xkSW5jbHVkZWQodG9rZW5pemVkTmFtZSwgaW5jbHVkZVBhdHRlcm5zW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8VG9rZW5pemVkUGF0aD4gaXRlciA9IGluY2x1ZGVOb25QYXR0ZXJucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaWYgKGNvdWxkSG9sZEluY2x1ZGVkKHRva2VuaXplZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5uZXh0KCkudG9QYXR0ZXJuKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gU3RyZWFtLmNvbmNhdChTdHJlYW0ub2YoaW5jbHVkZVBhdHRlcm5zKSwKKyAgICAgICAgICAgICAgICBpbmNsdWRlTm9uUGF0dGVybnMudmFsdWVzKCkuc3RyZWFtKCkubWFwKFRva2VuaXplZFBhdGg6OnRvUGF0dGVybikpCisgICAgICAgICAgICAgICAgLmFueU1hdGNoKHBhdCAtPiBjb3VsZEhvbGRJbmNsdWRlZCh0b2tlbml6ZWROYW1lLCBwYXQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0ODQsMTIgKzE0NDcsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBpc01vcmVQb3dlcmZ1bFRoYW5FeGNsdWRlcyhmaW5hbCBTdHJpbmcgbmFtZSkgewogICAgICAgICBmaW5hbCBTdHJpbmcgc291Z2h0ZXhjbHVkZSA9IG5hbWUgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyBTZWxlY3RvclV0aWxzLkRFRVBfVFJFRV9NQVRDSDsKLSAgICAgICAgZm9yIChpbnQgY291bnRlciA9IDA7IGNvdW50ZXIgPCBleGNsdWRlUGF0dGVybnMubGVuZ3RoOyBjb3VudGVyKyspIHsKLSAgICAgICAgICAgIGlmIChleGNsdWRlUGF0dGVybnNbY291bnRlcl0udG9TdHJpbmcoKS5lcXVhbHMoc291Z2h0ZXhjbHVkZSkpICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKGV4Y2x1ZGVQYXR0ZXJucykubWFwKE9iamVjdDo6dG9TdHJpbmcpCisgICAgICAgICAgICAubm9uZU1hdGNoKFByZWRpY2F0ZS5pc0VxdWFsKHNvdWdodGV4Y2x1ZGUpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OTgsMTQgKzE0NTcsMTAgQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYWxsIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5J3MgY29udGVudHMgYXJlIGV4Y2x1ZGVkLgogICAgICAqLwogICAgIC8qIHBhY2thZ2UgKi8gYm9vbGVhbiBjb250ZW50c0V4Y2x1ZGVkKGZpbmFsIFRva2VuaXplZFBhdGggcGF0aCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVQYXR0ZXJucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGV4Y2x1ZGVQYXR0ZXJuc1tpXS5lbmRzV2l0aChTZWxlY3RvclV0aWxzLkRFRVBfVFJFRV9NQVRDSCkKLSAgICAgICAgICAgICAgICAmJiBleGNsdWRlUGF0dGVybnNbaV0ud2l0aG91dExhc3RUb2tlbigpCi0gICAgICAgICAgICAgICAgICAgLm1hdGNoUGF0aChwYXRoLCBpc0Nhc2VTZW5zaXRpdmUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoZXhjbHVkZVBhdHRlcm5zKQorICAgICAgICAgICAgLmZpbHRlcihwIC0+IHAuZW5kc1dpdGgoU2VsZWN0b3JVdGlscy5ERUVQX1RSRUVfTUFUQ0gpKQorICAgICAgICAgICAgLm1hcChUb2tlbml6ZWRQYXR0ZXJuOjp3aXRob3V0TGFzdFRva2VuKQorICAgICAgICAgICAgLmFueU1hdGNoKHdsdCAtPiB3bHQubWF0Y2hQYXRoKHBhdGgsIGlzQ2FzZVNlbnNpdGl2ZSgpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTMxLDE3ICsxNDg2LDEyIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXhjbHVkZWQoZmluYWwgVG9rZW5pemVkUGF0aCBuYW1lKSB7CiAgICAgICAgIGVuc3VyZU5vblBhdHRlcm5TZXRzUmVhZHkoKTsKIAotICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlKCkKLSAgICAgICAgICAgID8gZXhjbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zS2V5KG5hbWUudG9TdHJpbmcoKSkKLSAgICAgICAgICAgIDogZXhjbHVkZU5vblBhdHRlcm5zLmNvbnRhaW5zS2V5KG5hbWUudG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIFN0cmluZyB0b01hdGNoID0gbmFtZS50b1N0cmluZygpOworICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZSgpKSB7CisgICAgICAgICAgICB0b01hdGNoID0gdG9NYXRjaC50b1VwcGVyQ2FzZSgpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZVBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZXhjbHVkZVBhdHRlcm5zW2ldLm1hdGNoUGF0aChuYW1lLCBpc0Nhc2VTZW5zaXRpdmUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBleGNsdWRlTm9uUGF0dGVybnMuY29udGFpbnNLZXkodG9NYXRjaCkKKyAgICAgICAgICAgIHx8IFN0cmVhbS5vZihleGNsdWRlUGF0dGVybnMpLmFueU1hdGNoKHAgLT4gcC5tYXRjaFBhdGgobmFtZSwgaXNDYXNlU2Vuc2l0aXZlKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NTMsMTQgKzE1MDMsOCBAQAogICAgICAqICAgICAgICAgc2hvdWxkIG5vdCBiZSBzZWxlY3RlZCwgPGNvZGU+dHJ1ZTwvY29kZT4gb3RoZXJ3aXNlLgogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGlzU2VsZWN0ZWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEZpbGUgZmlsZSkgewotICAgICAgICBpZiAoc2VsZWN0b3JzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RvcnNbaV0uaXNTZWxlY3RlZChiYXNlZGlyLCBuYW1lLCBmaWxlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gc2VsZWN0b3JzID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBTdHJlYW0ub2Yoc2VsZWN0b3JzKS5hbGxNYXRjaChzZWwgLT4gc2VsLmlzU2VsZWN0ZWQoYmFzZWRpciwgbmFtZSwgZmlsZSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU3MSwxNCArMTUxNSwxNCBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKICAgICAgKiAgICAgICAgIGluY2x1ZGUgcGF0dGVybnMgYW5kIG5vbmUgb2YgdGhlIGV4Y2x1ZGUgcGF0dGVybnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRmlsZXMoKSB7CiAgICAgICAgIFN0cmluZ1tdIGZpbGVzOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChmaWxlc0luY2x1ZGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGNhbGwgc2NhbigpIGZpcnN0Iik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaWxlcyA9IG5ldyBTdHJpbmdbZmlsZXNJbmNsdWRlZC5zaXplKCldOwotICAgICAgICAgICAgZmlsZXNJbmNsdWRlZC5jb3B5SW50byhmaWxlcyk7CisgICAgICAgICAgICBmaWxlcyA9IGZpbGVzSW5jbHVkZWQudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVzSW5jbHVkZWQuc2l6ZSgpXSk7CiAgICAgICAgIH0KICAgICAgICAgQXJyYXlzLnNvcnQoZmlsZXMpOwogICAgICAgICByZXR1cm4gZmlsZXM7CkBAIC0xNjA2LDExICsxNTUwLDEwIEBACiAgICAgICoKICAgICAgKiBAc2VlICNzbG93U2NhbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0Tm90SW5jbHVkZWRGaWxlcygpIHsKICAgICAgICAgc2xvd1NjYW4oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2ZpbGVzTm90SW5jbHVkZWQuc2l6ZSgpXTsKLSAgICAgICAgZmlsZXNOb3RJbmNsdWRlZC5jb3B5SW50byhmaWxlcyk7Ci0gICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgcmV0dXJuIGZpbGVzTm90SW5jbHVkZWQudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVzTm90SW5jbHVkZWQuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjI0LDExICsxNTY3LDEwIEBACiAgICAgICoKICAgICAgKiBAc2VlICNzbG93U2NhbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RXhjbHVkZWRGaWxlcygpIHsKICAgICAgICAgc2xvd1NjYW4oKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2ZpbGVzRXhjbHVkZWQuc2l6ZSgpXTsKLSAgICAgICAgZmlsZXNFeGNsdWRlZC5jb3B5SW50byhmaWxlcyk7Ci0gICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgcmV0dXJuIGZpbGVzRXhjbHVkZWQudG9BcnJheShuZXcgU3RyaW5nW2ZpbGVzRXhjbHVkZWQuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQyLDExICsxNTg0LDEwIEBACiAgICAgICoKICAgICAgKiBAc2VlICNzbG93U2NhbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZEZpbGVzKCkgewogICAgICAgICBzbG93U2NhbigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbZmlsZXNEZXNlbGVjdGVkLnNpemUoKV07Ci0gICAgICAgIGZpbGVzRGVzZWxlY3RlZC5jb3B5SW50byhmaWxlcyk7Ci0gICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgcmV0dXJuIGZpbGVzRGVzZWxlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZmlsZXNEZXNlbGVjdGVkLnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY1NywxNCArMTU5OCwxNCBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBkaXJlY3RvcmllcyB3aGljaCBtYXRjaGVkIGF0IGxlYXN0IG9uZSBvZiB0aGUKICAgICAgKiBpbmNsdWRlIHBhdHRlcm5zIGFuZCBub25lIG9mIHRoZSBleGNsdWRlIHBhdHRlcm5zLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkgewogICAgICAgICBTdHJpbmdbXSBkaXJlY3RvcmllczsKICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CiAgICAgICAgICAgICBpZiAoZGlyc0luY2x1ZGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNdXN0IGNhbGwgc2NhbigpIGZpcnN0Iik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbZGlyc0luY2x1ZGVkLnNpemUoKV07Ci0gICAgICAgICAgICBkaXJzSW5jbHVkZWQuY29weUludG8oZGlyZWN0b3JpZXMpOworICAgICAgICAgICAgZGlyZWN0b3JpZXMgPSBkaXJzSW5jbHVkZWQudG9BcnJheShuZXcgU3RyaW5nW2RpcnNJbmNsdWRlZC5zaXplKCldKTsKICAgICAgICAgfQogICAgICAgICBBcnJheXMuc29ydChkaXJlY3Rvcmllcyk7CiAgICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKQEAgLTE2OTIsMTEgKzE2MzMsMTAgQEAKICAgICAgKgogICAgICAqIEBzZWUgI3Nsb3dTY2FuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZERpcmVjdG9yaWVzKCkgewogICAgICAgICBzbG93U2NhbigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbZGlyc05vdEluY2x1ZGVkLnNpemUoKV07Ci0gICAgICAgIGRpcnNOb3RJbmNsdWRlZC5jb3B5SW50byhkaXJlY3Rvcmllcyk7Ci0gICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKKyAgICAgICAgcmV0dXJuIGRpcnNOb3RJbmNsdWRlZC50b0FycmF5KG5ldyBTdHJpbmdbZGlyc05vdEluY2x1ZGVkLnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcxMCwxMSArMTY1MCwxMCBAQAogICAgICAqCiAgICAgICogQHNlZSAjc2xvd1NjYW4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZ1tdIGdldEV4Y2x1ZGVkRGlyZWN0b3JpZXMoKSB7CiAgICAgICAgIHNsb3dTY2FuKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gbmV3IFN0cmluZ1tkaXJzRXhjbHVkZWQuc2l6ZSgpXTsKLSAgICAgICAgZGlyc0V4Y2x1ZGVkLmNvcHlJbnRvKGRpcmVjdG9yaWVzKTsKLSAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOworICAgICAgICByZXR1cm4gZGlyc0V4Y2x1ZGVkLnRvQXJyYXkobmV3IFN0cmluZ1tkaXJzRXhjbHVkZWQuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzI4LDExICsxNjY3LDEwIEBACiAgICAgICoKICAgICAgKiBAc2VlICNzbG93U2NhbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGVzZWxlY3RlZERpcmVjdG9yaWVzKCkgewogICAgICAgICBzbG93U2NhbigpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbZGlyc0Rlc2VsZWN0ZWQuc2l6ZSgpXTsKLSAgICAgICAgZGlyc0Rlc2VsZWN0ZWQuY29weUludG8oZGlyZWN0b3JpZXMpOwotICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXM7CisgICAgICAgIHJldHVybiBkaXJzRGVzZWxlY3RlZC50b0FycmF5KG5ldyBTdHJpbmdbZGlyc0Rlc2VsZWN0ZWQuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzU2LDIwICsxNjk0LDE0IEBACiAgICAgLyoqCiAgICAgICogQWRkIGRlZmF1bHQgZXhjbHVzaW9ucyB0byB0aGUgY3VycmVudCBleGNsdXNpb25zIHNldC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRGVmYXVsdEV4Y2x1ZGVzKCkgewotICAgICAgICBmaW5hbCBpbnQgZXhjbHVkZXNMZW5ndGggPSBleGNsdWRlcyA9PSBudWxsID8gMCA6IGV4Y2x1ZGVzLmxlbmd0aDsKLSAgICAgICAgU3RyaW5nW10gbmV3RXhjbHVkZXM7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGRlZmF1bHRFeGNsdWRlc1RlbXAgPSBnZXREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgbmV3RXhjbHVkZXMgPSBuZXcgU3RyaW5nW2V4Y2x1ZGVzTGVuZ3RoICsgZGVmYXVsdEV4Y2x1ZGVzVGVtcC5sZW5ndGhdOwotICAgICAgICBpZiAoZXhjbHVkZXNMZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGV4Y2x1ZGVzLCAwLCBuZXdFeGNsdWRlcywgMCwgZXhjbHVkZXNMZW5ndGgpOworICAgICAgICBTdHJlYW08U3RyaW5nPiBzID0gU3RyZWFtLm9mKGdldERlZmF1bHRFeGNsdWRlcygpKS5tYXAocCAtPiBwLnJlcGxhY2UoJy8nLAorICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhcikucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKKyAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHMgPSBTdHJlYW0uY29uY2F0KFN0cmVhbS5vZihleGNsdWRlcyksIHMpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmYXVsdEV4Y2x1ZGVzVGVtcC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgbmV3RXhjbHVkZXNbaSArIGV4Y2x1ZGVzTGVuZ3RoXSA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdEV4Y2x1ZGVzVGVtcFtpXS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQotICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgIH0KLSAgICAgICAgZXhjbHVkZXMgPSBuZXdFeGNsdWRlczsKKyAgICAgICAgZXhjbHVkZXMgPSBzLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzc5LDYgKzE3MTEsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgICAgICogQHNpbmNlIEFudCAxLjUuMgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoZmluYWwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UoYmFzZWRpciwgbmFtZSk7CiAgICAgfQpAQCAtMTg0MSwxMyArMTc3NCwxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgVG9rZW5pemVkUGF0dGVybltdIGZpbGxOb25QYXR0ZXJuU2V0KGZpbmFsIE1hcDxTdHJpbmcsIFRva2VuaXplZFBhdGg+IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXR0ZXJucykgewotICAgICAgICBmaW5hbCBBcnJheUxpc3Q8VG9rZW5pemVkUGF0dGVybj4gYWwgPSBuZXcgQXJyYXlMaXN0PFRva2VuaXplZFBhdHRlcm4+KHBhdHRlcm5zLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghU2VsZWN0b3JVdGlscy5oYXNXaWxkY2FyZHMocGF0dGVybnNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSBpc0Nhc2VTZW5zaXRpdmUoKSA/IHBhdHRlcm5zW2ldIDogcGF0dGVybnNbaV0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgICBtYXAucHV0KHMsIG5ldyBUb2tlbml6ZWRQYXRoKHMpKTsKKyAgICAgICAgZmluYWwgTGlzdDxUb2tlbml6ZWRQYXR0ZXJuPiBhbCA9IG5ldyBBcnJheUxpc3Q8PihwYXR0ZXJucy5sZW5ndGgpOworICAgICAgICBmb3IgKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybnMpIHsKKyAgICAgICAgICAgIGlmIChTZWxlY3RvclV0aWxzLmhhc1dpbGRjYXJkcyhwYXR0ZXJuKSkgeworICAgICAgICAgICAgICAgIGFsLmFkZChuZXcgVG9rZW5pemVkUGF0dGVybihwYXR0ZXJuKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsLmFkZChuZXcgVG9rZW5pemVkUGF0dGVybihwYXR0ZXJuc1tpXSkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzID0gaXNDYXNlU2Vuc2l0aXZlKCkgPyBwYXR0ZXJuIDogcGF0dGVybi50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgIG1hcC5wdXQocywgbmV3IFRva2VuaXplZFBhdGgocykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhbC50b0FycmF5KG5ldyBUb2tlbml6ZWRQYXR0ZXJuW2FsLnNpemUoKV0pOwpAQCAtMTg2NSwzNSArMTc5OCw0MCBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY2F1c2VzSWxsZWdhbFN5bWxpbmtMb29wKGZpbmFsIFN0cmluZyBkaXJOYW1lLCBmaW5hbCBGaWxlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBkaXJlY3RvcnlOYW1lc0ZvbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXF1ZTxTdHJpbmc+IGRpcmVjdG9yeU5hbWVzRm9sbG93ZWQpIHsKICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFBhdGggZGlyUGF0aDsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRpclBhdGggPSBQYXRocy5nZXQoZGlyTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpclBhdGggPSBQYXRocy5nZXQocGFyZW50LnRvUGF0aCgpLnRvU3RyaW5nKCksIGRpck5hbWUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGRpcmVjdG9yeU5hbWVzRm9sbG93ZWQuc2l6ZSgpID49IG1heExldmVsc09mU3ltbGlua3MKLSAgICAgICAgICAgICAgICAmJiBDb2xsZWN0aW9uVXRpbHMuZnJlcXVlbmN5KGRpcmVjdG9yeU5hbWVzRm9sbG93ZWQsIGRpck5hbWUpID49IG1heExldmVsc09mU3ltbGlua3MKLSAgICAgICAgICAgICAgICAmJiBTWU1MSU5LX1VUSUxTLmlzU3ltYm9saWNMaW5rKHBhcmVudCwgZGlyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAmJiBDb2xsZWN0aW9ucy5mcmVxdWVuY3koZGlyZWN0b3J5TmFtZXNGb2xsb3dlZCwgZGlyTmFtZSkgPj0gbWF4TGV2ZWxzT2ZTeW1saW5rcworICAgICAgICAgICAgICAgICYmIEZpbGVzLmlzU3ltYm9saWNMaW5rKGRpclBhdGgpKSB7CiAKLSAgICAgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgICAgIEZpbGUgZiA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUocGFyZW50LCBkaXJOYW1lKTsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0ID0gZi5nZXRDYW5vbmljYWxQYXRoKCk7CiAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHRhcmdldCk7CiAKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVsUGF0aCA9ICIiOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVsUGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZGlyIDogZGlyZWN0b3J5TmFtZXNGb2xsb3dlZCkgewotICAgICAgICAgICAgICAgICAgICByZWxQYXRoICs9ICIuLi8iOworICAgICAgICAgICAgICAgICAgICByZWxQYXRoLmFwcGVuZCgiLi4vIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJOYW1lLmVxdWFscyhkaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShwYXJlbnQsIHJlbFBhdGggKyBkaXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKGYuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlcy5zaXplKCkgPiBtYXhMZXZlbHNPZlN5bWxpbmtzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQ29sbGVjdGlvblV0aWxzLmZyZXF1ZW5jeShmaWxlcywgdGFyZ2V0KSA+IG1heExldmVsc09mU3ltbGlua3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDb2xsZWN0aW9ucy5mcmVxdWVuY3koZmlsZXMsIHRhcmdldCkgPiBtYXhMZXZlbHNPZlN5bWxpbmtzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2F1Z2h0IGVycm9yIHdoaWxlIGNoZWNraW5nIGZvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3ltYm9saWMgbGlua3MiLCBleCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhdWdodCBlcnJvciB3aGlsZSBjaGVja2luZyBmb3Igc3ltYm9saWMgbGlua3MiLCBleCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNBdHRyaWJ1dGUuamF2YQppbmRleCA0NDVjMzNlLi43OWVlMTc4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0F0dHJpYnV0ZU5TLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlTlMuamF2YQppbmRleCA3ZDZlODRlLi5lMmY2NTVmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlTlMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQXR0cmlidXRlTlMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNDb25maWd1cmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNDb25maWd1cmF0b3IuamF2YQppbmRleCBlNDgwNjJiLi4wNDk0YzBiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljQ29uZmlndXJhdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjYsNCArMjYsMyBAQAogcHVibGljIGludGVyZmFjZSBEeW5hbWljQ29uZmlndXJhdG9yCiAgICAgZXh0ZW5kcyBEeW5hbWljQXR0cmlidXRlLCBEeW5hbWljRWxlbWVudCB7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNDb25maWd1cmF0b3JOUy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvck5TLmphdmEKaW5kZXggNDBiM2Q2NS4uZjYzNWQyOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvck5TLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0NvbmZpZ3VyYXRvck5TLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnQuamF2YQppbmRleCBiOWNhZjBjLi5lMjg4YTVmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNFbGVtZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudE5TLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljRWxlbWVudE5TLmphdmEKaW5kZXggNTdiZmE1My4uYmQxMzFhYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY0VsZW1lbnROUy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNFbGVtZW50TlMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNPYmplY3RBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0R5bmFtaWNPYmplY3RBdHRyaWJ1dGUuamF2YQppbmRleCA5YTlhY2E5Li5mZTczMzE0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EeW5hbWljT2JqZWN0QXR0cmlidXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRHluYW1pY09iamVjdEF0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXZhbHVhYmxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FdmFsdWFibGUuamF2YQppbmRleCA0N2YwOWM3Li4zNjg4ZjU4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FdmFsdWFibGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FdmFsdWFibGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEzICsxNywxOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCiAvKioKICAqIEtpbmQgb2YgdGFzayBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgZXZhbHVhdGVkIGJlZm9yZSBiZWluZyBhc3NpZ25lZAorICogQHBhcmFtIDxUPiBhcyB7QGxpbmsgU3VwcGxpZXJ9CiAgKgogICogQHNlZSBSdW50aW1lQ29uZmlndXJhYmxlCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXZhbHVhYmxlIHsKK3B1YmxpYyBpbnRlcmZhY2UgRXZhbHVhYmxlPFQ+IGV4dGVuZHMgU3VwcGxpZXI8VD4gewogCi0gICAgT2JqZWN0IGV2YWwoKTsKKyAgICBUIGV2YWwoKTsKIAorICAgIGRlZmF1bHQgVCBnZXQoKSB7CisgICAgICAgIHJldHVybiBldmFsKCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhlY3V0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4ZWN1dG9yLmphdmEKaW5kZXggOWFmZjE0OC4uYjJjZGZhNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhlY3V0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdEV4Y2VwdGlvbi5qYXZhCmluZGV4IDExZTFiYzguLjljMjUxM2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0RXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0U3RhdHVzRXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGl0U3RhdHVzRXhjZXB0aW9uLmphdmEKaW5kZXggMWViNTEyNy4uZWYyZWU3YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXhpdFN0YXR1c0V4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4aXRTdGF0dXNFeGNlcHRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4dGVuc2lvblBvaW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeHRlbnNpb25Qb2ludC5qYXZhCmluZGV4IDMyYzhjNTUuLjc3M2ExODIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0V4dGVuc2lvblBvaW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRXh0ZW5zaW9uUG9pbnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ZpbGVTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9GaWxlU2Nhbm5lci5qYXZhCmluZGV4IGE3Y2I5ZGUuLjBhZmQ5MTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ZpbGVTY2FubmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXIuamF2YQppbmRleCBhZjdmMzEyLi4yNjljNTVkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbnRyb3NwZWN0aW9uSGVscGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvSW50cm9zcGVjdGlvbkhlbHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjQsNyArNjQsNyBAQAogICAgIC8qKgogICAgICAqIEhlbHBlciBpbnN0YW5jZXMgd2UndmUgYWxyZWFkeSBjcmVhdGVkIChDbGFzcy5nZXROYW1lKCkgdG8gSW50cm9zcGVjdGlvbkhlbHBlcikuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50cm9zcGVjdGlvbkhlbHBlcj4gSEVMUEVSUyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBJbnRyb3NwZWN0aW9uSGVscGVyPigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIEludHJvc3BlY3Rpb25IZWxwZXI+IEhFTFBFUlMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKgogICAgICAqIE1hcCBmcm9tIHByaW1pdGl2ZSB0eXBlcyB0byB3cmFwcGVyIGNsYXNzZXMgZm9yIHVzZSBpbgpAQCAtNzIsNyArNzIsNyBAQAogICAgICAqIGFuZCBib29sZWFuIGFyZSBpbiBoZXJlIGV2ZW4gdGhvdWdoIHRoZXkgZ2V0IHNwZWNpYWwgdHJlYXRtZW50CiAgICAgICogLSB0aGlzIHdheSB3ZSBvbmx5IG5lZWQgdG8gdGVzdCBmb3IgdGhlIHdyYXBwZXIgY2xhc3MuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8+LCBDbGFzczw/Pj4gUFJJTUlUSVZFX1RZUEVfTUFQID0gbmV3IEhhc2hNYXA8Q2xhc3M8Pz4sIENsYXNzPD8+Pig4KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8Pz4sIENsYXNzPD8+PiBQUklNSVRJVkVfVFlQRV9NQVAgPSBuZXcgSGFzaE1hcDw+KDgpOwogCiAgICAgLy8gU2V0IHVwIFBSSU1JVElWRV9UWVBFX01BUAogICAgIHN0YXRpYyB7CkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgIGZpbmFsIENsYXNzPD8+W10gd3JhcHBlcnMgPSB7Qm9vbGVhbi5jbGFzcywgQnl0ZS5jbGFzcywgQ2hhcmFjdGVyLmNsYXNzLCBTaG9ydC5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzLCBMb25nLmNsYXNzLCBGbG9hdC5jbGFzcywgRG91YmxlLmNsYXNzfTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcmltaXRpdmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBQUklNSVRJVkVfVFlQRV9NQVAucHV0IChwcmltaXRpdmVzW2ldLCB3cmFwcGVyc1tpXSk7CisgICAgICAgICAgICBQUklNSVRJVkVfVFlQRV9NQVAucHV0KHByaW1pdGl2ZXNbaV0sIHdyYXBwZXJzW2ldKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTIsMzAgKzkyLDMwIEBACiAgICAgICogTWFwIGZyb20gYXR0cmlidXRlIG5hbWVzIHRvIGF0dHJpYnV0ZSB0eXBlcwogICAgICAqIChTdHJpbmcgdG8gQ2xhc3MpLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IGF0dHJpYnV0ZVR5cGVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIENsYXNzPD8+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGF0dHJpYnV0ZVR5cGVzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gYXR0cmlidXRlIHNldHRlciBtZXRob2RzCiAgICAgICogKFN0cmluZyB0byBBdHRyaWJ1dGVTZXR0ZXIpLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQXR0cmlidXRlU2V0dGVyPiBhdHRyaWJ1dGVTZXR0ZXJzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIEF0dHJpYnV0ZVNldHRlcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZVNldHRlcj4gYXR0cmlidXRlU2V0dGVycyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqCiAgICAgICogTWFwIGZyb20gYXR0cmlidXRlIG5hbWVzIHRvIG5lc3RlZCB0eXBlcwogICAgICAqIChTdHJpbmcgdG8gQ2xhc3MpLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IG5lc3RlZFR5cGVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIENsYXNzPD8+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG5lc3RlZFR5cGVzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBNYXAgZnJvbSBhdHRyaWJ1dGUgbmFtZXMgdG8gbWV0aG9kcyB0byBjcmVhdGUgbmVzdGVkIHR5cGVzCiAgICAgICogKFN0cmluZyB0byBOZXN0ZWRDcmVhdG9yKS4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIE5lc3RlZENyZWF0b3I+IG5lc3RlZENyZWF0b3JzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE5lc3RlZENyZWF0b3I+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBOZXN0ZWRDcmVhdG9yPiBuZXN0ZWRDcmVhdG9ycyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqCiAgICAgICogVmVjdG9yIG9mIG1ldGhvZHMgbWF0Y2hpbmcgYWRkW0NvbmZpZ3VyZWRdKENsYXNzKSBwYXR0ZXJuLgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZXRob2Q+IGFkZFR5cGVNZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1ldGhvZD4gYWRkVHlwZU1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBtZXRob2QgdG8gaW52b2tlIHRvIGFkZCBQQ0RBVEEuCkBAIC0zMDcsMTMgKzMwNyw4IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzZXQgbWV0aG9kIGlzIHRvIGJlIGhpZGRlbi4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW5TZXRNZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKLSAgICAgICAgaWYgKCJzZXRMb2NhdGlvbiIuZXF1YWxzKG5hbWUpICYmIExvY2F0aW9uLmNsYXNzLmVxdWFscyh0eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCJzZXRUYXNrVHlwZSIuZXF1YWxzKG5hbWUpICYmIFN0cmluZy5jbGFzcy5lcXVhbHModHlwZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuICJzZXRMb2NhdGlvbiIuZXF1YWxzKG5hbWUpICYmIExvY2F0aW9uLmNsYXNzLmVxdWFscyh0eXBlKQorICAgICAgICAgICAgICAgIHx8ICJzZXRUYXNrVHlwZSIuZXF1YWxzKG5hbWUpICYmIFN0cmluZy5jbGFzcy5lcXVhbHModHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zODUsNyArMzgwLDcgQEAKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpUGx1c1ByZWZpeCA9IFByb2plY3RIZWxwZXIuZXh0cmFjdFVyaUZyb21Db21wb25lbnROYW1lKGF0dHJpYnV0ZU5hbWUpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmkgPSBQcm9qZWN0SGVscGVyLmV4dHJhY3RVcmlGcm9tQ29tcG9uZW50TmFtZSh1cmlQbHVzUHJlZml4KTsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gUHJvamVjdEhlbHBlci5leHRyYWN0TmFtZUZyb21Db21wb25lbnROYW1lKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxTmFtZSA9ICIiLmVxdWFscyh1cmkpID8gbG9jYWxOYW1lIDogdXJpICsgIjoiICsgbG9jYWxOYW1lOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxTmFtZSA9IHVyaS5pc0VtcHR5KCkgPyBsb2NhbE5hbWUgOiB1cmkgKyAiOiIgKyBsb2NhbE5hbWU7CiAgICAgICAgICAgICAgICAgZGMuc2V0RHluYW1pY0F0dHJpYnV0ZSh1cmksIGxvY2FsTmFtZSwgcU5hbWUsIHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTM5OSw3ICszOTQsNyBAQAogICAgICAgICAgICAgICAgIGRjLnNldER5bmFtaWNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCksIHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmluZGV4T2YoJzonKSA+PSAwKSB7CisgICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5jb250YWlucygiOiIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgYXR0cmlidXRlIGZyb20gdW5rbm93biB1cmkncwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IGdldEVsZW1lbnROYW1lKHAsIGVsZW1lbnQpCkBAIC00NjMsNyArNDU4LDcgQEAKICAgICAgICAgaWYgKGFkZFRleHQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpOwogICAgICAgICAgICAgLy8gRWxlbWVudCBkb2Vzbid0IGhhbmRsZSB0ZXh0IGNvbnRlbnQKLSAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGlmICh0ZXh0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIC8vIE9ubHkgd2hpdGVzcGFjZSAtIGlnbm9yZQogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTQ3Miw3ICs0NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICArICIgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCB0ZXh0IGRhdGEgKFwiIiArIGNvbmRlbnNlVGV4dCh0ZXh0KSArICJcIikuIik7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFkZFRleHQuaW52b2tlKGVsZW1lbnQsIG5ldyBPYmplY3RbXSB7dGV4dH0pOworICAgICAgICAgICAgYWRkVGV4dC5pbnZva2UoZWxlbWVudCwgdGV4dCk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7CkBAIC01MzUsMjEgKzUzMCwxNyBAQAogICAgICAgICAgICAgcGFyZW50VXJpID0gIiI7CiAgICAgICAgIH0KICAgICAgICAgTmVzdGVkQ3JlYXRvciBuYyA9IG51bGw7Ci0gICAgICAgIGlmICh1cmkuZXF1YWxzKHBhcmVudFVyaSkgfHwgdXJpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgaWYgKHVyaS5lcXVhbHMocGFyZW50VXJpKSB8fCB1cmkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBuYyA9IG5lc3RlZENyZWF0b3JzLmdldChuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG5jID09IG51bGwpIHsKICAgICAgICAgICAgIG5jID0gY3JlYXRlQWRkVHlwZUNyZWF0b3IocHJvamVjdCwgcGFyZW50LCBlbGVtZW50TmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG5jID09IG51bGwgJiYKLSAgICAgICAgICAgIChwYXJlbnQgaW5zdGFuY2VvZiBEeW5hbWljRWxlbWVudE5TCi0gICAgICAgICAgICAgfHwgcGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0VsZW1lbnQpCi0gICAgICAgICAgICApIHsKKyAgICAgICAgaWYgKG5jID09IG51bGwKKyAgICAgICAgICAgICAgICAmJiAocGFyZW50IGluc3RhbmNlb2YgRHluYW1pY0VsZW1lbnROUyB8fCBwYXJlbnQgaW5zdGFuY2VvZiBEeW5hbWljRWxlbWVudCkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxTmFtZSA9IGNoaWxkID09IG51bGwgPyBuYW1lIDogY2hpbGQuZ2V0UU5hbWUoKTsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBuZXN0ZWRFbGVtZW50ID0KLSAgICAgICAgICAgICAgICBjcmVhdGVEeW5hbWljRWxlbWVudChwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQgPT0gbnVsbCA/ICIiIDogY2hpbGQuZ2V0TmFtZXNwYWNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcU5hbWUpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5lc3RlZEVsZW1lbnQgPSBjcmVhdGVEeW5hbWljRWxlbWVudChwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkID09IG51bGwgPyAiIiA6IGNoaWxkLmdldE5hbWVzcGFjZSgpLCBuYW1lLCBxTmFtZSk7CiAgICAgICAgICAgICBpZiAobmVzdGVkRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbmMgPSBuZXcgTmVzdGVkQ3JlYXRvcihudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtNjE4LDEyICs2MDksOSBAQAogICAgICAgICAgICAgICAgIHByb2plY3Quc2V0UHJvamVjdFJlZmVyZW5jZShuZXN0ZWRFbGVtZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBuZXN0ZWRFbGVtZW50OwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGllKSB7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7CiAgICAgICAgICAgICAvLyBpbXBvc3NpYmxlIGFzIGdldE1ldGhvZHMgc2hvdWxkIG9ubHkgcmV0dXJuIHB1YmxpYyBtZXRob2RzCiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWUpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGluZSkgewotICAgICAgICAgICAgLy8gaW1wb3NzaWJsZSBhcyBnZXRNZXRob2RzIHNob3VsZCBvbmx5IHJldHVybiBwdWJsaWMgbWV0aG9kcwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGluZSk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7CiAgICAgICAgICAgICB0aHJvdyBleHRyYWN0QnVpbGRFeGNlcHRpb24oaXRlKTsKICAgICAgICAgfQpAQCAtNzA1LDEwICs2OTMsOCBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmVzdGVkIGVsZW1lbnQgaXMgc3VwcG9ydGVkCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOZXN0ZWRFbGVtZW50KGZpbmFsIFN0cmluZyBwYXJlbnRVcmksIGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSkgewotICAgICAgICBpZiAoaXNEeW5hbWljKCkgfHwgYWRkVHlwZU1ldGhvZHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRzUmVmbGVjdEVsZW1lbnQocGFyZW50VXJpLCBlbGVtZW50TmFtZSk7CisgICAgICAgIHJldHVybiBpc0R5bmFtaWMoKSB8fCAhYWRkVHlwZU1ldGhvZHMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgfHwgc3VwcG9ydHNSZWZsZWN0RWxlbWVudChwYXJlbnRVcmksIGVsZW1lbnROYW1lKTsKICAgICB9CiAKICAgICAvKioKQEAgLTczMCwxMSArNzE2LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c05lc3RlZEVsZW1lbnQoZmluYWwgU3RyaW5nIHBhcmVudFVyaSwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIE9iamVjdCBwYXJlbnQpIHsKLSAgICAgICAgaWYgKGFkZFR5cGVNZXRob2RzLnNpemUoKSA+IDAKLSAgICAgICAgICAgICYmIGNyZWF0ZUFkZFR5cGVDcmVhdG9yKHByb2plY3QsIHBhcmVudCwgZWxlbWVudE5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc0R5bmFtaWMoKSB8fCBzdXBwb3J0c1JlZmxlY3RFbGVtZW50KHBhcmVudFVyaSwgZWxlbWVudE5hbWUpOworICAgICAgICByZXR1cm4gIWFkZFR5cGVNZXRob2RzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICYmIGNyZWF0ZUFkZFR5cGVDcmVhdG9yKHByb2plY3QsIHBhcmVudCwgZWxlbWVudE5hbWUpICE9IG51bGwKKyAgICAgICAgICAgICAgICB8fCBpc0R5bmFtaWMoKSB8fCBzdXBwb3J0c1JlZmxlY3RFbGVtZW50KHBhcmVudFVyaSwgZWxlbWVudE5hbWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzUzLDEwICs3MzcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyB1cmkgPSBQcm9qZWN0SGVscGVyLmV4dHJhY3RVcmlGcm9tQ29tcG9uZW50TmFtZShlbGVtZW50TmFtZSk7Ci0gICAgICAgIGlmICh1cmkuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJKSkgewotICAgICAgICAgICAgdXJpID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCIiLmVxdWFscyh1cmkpKSB7CisgICAgICAgIGlmICh1cmkuZXF1YWxzKFByb2plY3RIZWxwZXIuQU5UX0NPUkVfVVJJKSB8fCB1cmkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyZW50VXJpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKQEAgLTc5NiwxMiArNzc3LDkgQEAKICAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgbnMuc3RvcmUocGFyZW50LCBjaGlsZCk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgIC8vIGltcG9zc2libGUgYXMgZ2V0TWV0aG9kcyBzaG91bGQgb25seSByZXR1cm4gcHVibGljIG1ldGhvZHMKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaW5lKSB7Ci0gICAgICAgICAgICAvLyBpbXBvc3NpYmxlIGFzIGdldE1ldGhvZHMgc2hvdWxkIG9ubHkgcmV0dXJuIHB1YmxpYyBtZXRob2RzCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW5lKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKICAgICAgICAgICAgIHRocm93IGV4dHJhY3RCdWlsZEV4Y2VwdGlvbihpdGUpOwogICAgICAgICB9CkBAIC04OTcsMTMgKzg3NSwxMyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kIGdldEVsZW1lbnRNZXRob2QoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBPYmplY3QgY3JlYXRvciA9IG5lc3RlZENyZWF0b3JzLmdldChlbGVtZW50TmFtZSk7CisgICAgICAgIGZpbmFsIE5lc3RlZENyZWF0b3IgY3JlYXRvciA9IG5lc3RlZENyZWF0b3JzLmdldChlbGVtZW50TmFtZSk7CiAgICAgICAgIGlmIChjcmVhdG9yID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVsZW1lbnRFeGNlcHRpb24oIkNsYXNzICIKICAgICAgICAgICAgICAgICAgICAgKyBiZWFuLmdldE5hbWUoKSArICIgZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQgXCIiCiAgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudE5hbWUgKyAiXCIgZWxlbWVudC4iLCBlbGVtZW50TmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoTmVzdGVkQ3JlYXRvcikgY3JlYXRvcikubWV0aG9kOworICAgICAgICByZXR1cm4gY3JlYXRvci5tZXRob2Q7CiAgICAgfQogCiAgICAgLyoqCkBAIC05MTgsMTMgKzg5NiwxMyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKICAgICAgKi8KICAgICBwdWJsaWMgTWV0aG9kIGdldEF0dHJpYnV0ZU1ldGhvZChmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IHNldHRlciA9IGF0dHJpYnV0ZVNldHRlcnMuZ2V0KGF0dHJpYnV0ZU5hbWUpOworICAgICAgICBmaW5hbCBBdHRyaWJ1dGVTZXR0ZXIgc2V0dGVyID0gYXR0cmlidXRlU2V0dGVycy5nZXQoYXR0cmlidXRlTmFtZSk7CiAgICAgICAgIGlmIChzZXR0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uKCJDbGFzcyAiCiAgICAgICAgICAgICAgICAgICAgICsgYmVhbi5nZXROYW1lKCkgKyAiIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgXCIiCiAgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlTmFtZSArICJcIiBhdHRyaWJ1dGUuIiwgYXR0cmlidXRlTmFtZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICgoQXR0cmlidXRlU2V0dGVyKSBzZXR0ZXIpLm1ldGhvZDsKKyAgICAgICAgcmV0dXJuIHNldHRlci5tZXRob2Q7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NDMsNyArOTIxLDcgQEAKICAgICAgKiBAc2VlICNnZXRBdHRyaWJ1dGVNYXAKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBdHRyaWJ1dGVzKCkgewotICAgICAgICByZXR1cm4gYXR0cmlidXRlU2V0dGVycy5rZXlzKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihhdHRyaWJ1dGVTZXR0ZXJzLmtleVNldCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk1NSw3ICs5MzMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZ2V0QXR0cmlidXRlTWFwKCkgewogICAgICAgICByZXR1cm4gYXR0cmlidXRlVHlwZXMuaXNFbXB0eSgpCi0gICAgICAgICAgICA/IENvbGxlY3Rpb25zLjxTdHJpbmcsIENsYXNzPD8+PiBlbXB0eU1hcCgpIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGF0dHJpYnV0ZVR5cGVzKTsKKyAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChhdHRyaWJ1dGVUeXBlcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NjcsNyArOTQ1LDcgQEAKICAgICAgKiBAc2VlICNnZXROZXN0ZWRFbGVtZW50TWFwCiAgICAgICovCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0TmVzdGVkRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiBuZXN0ZWRUeXBlcy5rZXlzKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihuZXN0ZWRUeXBlcy5rZXlTZXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05ODAsNyArOTU4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldE5lc3RlZEVsZW1lbnRNYXAoKSB7CiAgICAgICAgIHJldHVybiBuZXN0ZWRUeXBlcy5pc0VtcHR5KCkKLSAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPFN0cmluZywgQ2xhc3M8Pz4+IGVtcHR5TWFwKCkgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmVzdGVkVHlwZXMpOworICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG5lc3RlZFR5cGVzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDIsNyArOTgwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxNZXRob2Q+IGdldEV4dGVuc2lvblBvaW50cygpIHsKICAgICAgICAgcmV0dXJuIGFkZFR5cGVNZXRob2RzLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPE1ldGhvZD4gZW1wdHlMaXN0KCkgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGFkZFR5cGVNZXRob2RzKTsKKyAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChhZGRUeXBlTWV0aG9kcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQzLDggKzEwMjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0ck5hbWUpIHsKICAgICAgICAgLy8gdXNlIHdyYXBwZXJzIGZvciBwcmltaXRpdmUgY2xhc3NlcywgZS5nLiBpbnQgYW5kCiAgICAgICAgIC8vIEludGVnZXIgYXJlIHRyZWF0ZWQgaWRlbnRpY2FsbHkKLSAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmVmbGVjdGVkQXJnID0gUFJJTUlUSVZFX1RZUEVfTUFQLmNvbnRhaW5zS2V5KGFyZykKLSAgICAgICAgICAgID8gUFJJTUlUSVZFX1RZUEVfTUFQLmdldChhcmcpIDogYXJnOworICAgICAgICBmaW5hbCBDbGFzczw/PiByZWZsZWN0ZWRBcmcgPSBQUklNSVRJVkVfVFlQRV9NQVAuZ2V0T3JEZWZhdWx0KGFyZywgYXJnKTsKIAogICAgICAgICAvLyBPYmplY3QuY2xhc3MgLSBpdCBnZXRzIGhhbmRsZWQgZGlmZmVyZW50bHkgYnkgQXR0cmlidXRlU2V0dGVyCiAgICAgICAgIGlmIChqYXZhLmxhbmcuT2JqZWN0LmNsYXNzID09IHJlZmxlY3RlZEFyZykgewpAQCAtMTA3NCwxMSArMTA1MSwxMSBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBQcm9qZWN0IHAsIGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdmFsdWUgXCJcIiBpcyBub3QgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImxlZ2FsIHZhbHVlIGZvciBhdHRyaWJ1dGUgXCIiICsgYXR0ck5hbWUgKyAiXCIiKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIChPYmplY3RbXSkgbmV3IENoYXJhY3RlcltdIHtuZXcgQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdCgwKSl9KTsKKyAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCAoT2JqZWN0W10pIG5ldyBDaGFyYWN0ZXJbXSB7dmFsdWUuY2hhckF0KDApfSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKICAgICAgICAgfQpAQCAtMTEwMCw3ICsxMDc3LDcgQEAKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgUHJvamVjdCBwLCBmaW5hbCBPYmplY3QgcGFyZW50LCBmaW5hbCBTdHJpbmcgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge0NsYXNzLmZvck5hbWUodmFsdWUpfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIENsYXNzLmZvck5hbWUodmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTExMywxNyArMTA5MCwyOCBAQAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBQcm9qZWN0IHAsIGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge3AucmVzb2x2ZUZpbGUodmFsdWUpfSk7CisgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgcC5yZXNvbHZlRmlsZSh2YWx1ZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH07CiAgICAgICAgIH0KKyAgICAgICAgLy8gcmVzb2x2ZSByZWxhdGl2ZSBuaW8gcGF0aHMgdGhyb3VnaCBQcm9qZWN0CisgICAgICAgIGlmIChqYXZhLm5pby5maWxlLlBhdGguY2xhc3MuZXF1YWxzKHJlZmxlY3RlZEFyZykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXR0cmlidXRlU2V0dGVyKG0sIGFyZykgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBQcm9qZWN0IHAsIGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBwLnJlc29sdmVGaWxlKHZhbHVlKS50b1BhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHJlc29sdmUgUmVzb3VyY2VzL0ZpbGVQcm92aWRlcnMgYXMgRmlsZVJlc291cmNlcyByZWxhdGl2ZSB0byBQcm9qZWN0OgogICAgICAgICBpZiAoUmVzb3VyY2UuY2xhc3MuZXF1YWxzKHJlZmxlY3RlZEFyZykgfHwgRmlsZVByb3ZpZGVyLmNsYXNzLmVxdWFscyhyZWZsZWN0ZWRBcmcpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZVNldHRlcihtLCBhcmcpIHsKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICB2b2lkIHNldChmaW5hbCBQcm9qZWN0IHAsIGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtuZXcgRmlsZVJlc291cmNlKHAsIHAucmVzb2x2ZUZpbGUodmFsdWUpKX0pOworICAgICAgICAgICAgICAgIHZvaWQgc2V0KGZpbmFsIFByb2plY3QgcCwgZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgU3RyaW5nIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgbS5pbnZva2UocGFyZW50LCBuZXcgRmlsZVJlc291cmNlKHAsIHAucmVzb2x2ZUZpbGUodmFsdWUpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKICAgICAgICAgfQpAQCAtMTEzNiw3ICsxMTI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZWEgPSAoRW51bWVyYXRlZEF0dHJpYnV0ZSkgcmVmbGVjdGVkQXJnLm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBlYS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7ZWF9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgZWEpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWUpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMTU1LDE1ICsxMTQzLDEyIEBACiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIFByb2plY3QgcCwgZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgU3RyaW5nIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvbmcoU3RyaW5nVXRpbHMucGFyc2VIdW1hblNpemVzKHZhbHVlKSkgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIFN0cmluZ1V0aWxzLnBhcnNlSHVtYW5TaXplcyh2YWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBhc3NpZ24gbm9uLW51bWVyaWMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHZhbHVlICciICsgdmFsdWUgKyAiJyB0byIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXR0cmlidXRlICIgKyBhdHRyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CkBAIC0xMjA2LDcgKzExOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAocCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwLnNldFByb2plY3RSZWZlcmVuY2UoYXR0cmlidXRlKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7YXR0cmlidXRlfSk7CisgICAgICAgICAgICAgICAgICAgIG0uaW52b2tlKHBhcmVudCwgYXR0cmlidXRlKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pIHsKQEAgLTEyNDAsNyArMTIyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlID0gZW51bVZhbHVlOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy90aGVyZSBpcyBzcGVjaWZpYyBsb2dpYyBoZXJlIGZvciB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGEgc3BlY2lmaWMgbG9naWMgaGVyZSBmb3IgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBvdXQgb2YgdGhlIGFsbG93ZWQgc2V0IG9mIGVudW1lcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJyIgKyB2YWx1ZSArICInIGlzIG5vdCBhIHBlcm1pdHRlZCB2YWx1ZSBmb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlZmxlY3RlZEFyZy5nZXROYW1lKCkpOwpAQCAtMTM0NSw5ICsxMzMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRQcm9qZWN0UmVmZXJlbmNlKG5lc3RlZE9iamVjdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBuZXN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIGlmIChwb2x5VHlwZSA9PSBudWxsKSB7CkBAIC0xMzczLDkgKzEzNTYsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzdG9yZSgpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmVzdGVkQ3JlYXRvci5zdG9yZShwYXJlbnQsIG5lc3RlZE9iamVjdCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIGlmIChwb2x5VHlwZSA9PSBudWxsKSB7CkBAIC0xNDI0LDcgKzE0MDUsNyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgT2JqZWN0IGNyZWF0ZShmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIE9iamVjdCBpZ25vcmUpCiAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIGdldE1ldGhvZCgpLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7fSk7CisgICAgICAgICAgICByZXR1cm4gZ2V0TWV0aG9kKCkuaW52b2tlKHBhcmVudCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NzQsOCArMTQ1NSw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgaXN0b3JlKGZpbmFsIE9iamVjdCBwYXJlbnQsIGZpbmFsIE9iamVjdCBjaGlsZCkKLSAgICAgICAgICAgICAgICB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBnZXRNZXRob2QoKS5pbnZva2UocGFyZW50LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7CisgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICAgICAgZ2V0TWV0aG9kKCkuaW52b2tlKHBhcmVudCwgY2hpbGQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTA0LDcgKzE0ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICB1c2VUeXBlID0gUFJJTUlUSVZFX1RZUEVfTUFQLmdldCh0eXBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdXNlVHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHt2YWx1ZX0pOworICAgICAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKHBhcmVudCwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTUzMiwxNSArMTUxMywxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgTmVzdGVkQ3JlYXRvciBjcmVhdGVBZGRUeXBlQ3JlYXRvcigKICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoYWRkVHlwZU1ldGhvZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGFkZFR5cGVNZXRob2RzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgQ29tcG9uZW50SGVscGVyIGhlbHBlciA9IENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIocHJvamVjdCk7CiAKLSAgICAgICAgZmluYWwgTWV0aG9kQW5kT2JqZWN0IHJlc3RyaWN0ZWQgPSAgY3JlYXRlUmVzdHJpY3RlZCgKLSAgICAgICAgICAgIGhlbHBlciwgZWxlbWVudE5hbWUsIGFkZFR5cGVNZXRob2RzKTsKLSAgICAgICAgZmluYWwgTWV0aG9kQW5kT2JqZWN0IHRvcExldmVsID0gY3JlYXRlVG9wTGV2ZWwoCi0gICAgICAgICAgICBoZWxwZXIsIGVsZW1lbnROYW1lLCBhZGRUeXBlTWV0aG9kcyk7CisgICAgICAgIGZpbmFsIE1ldGhvZEFuZE9iamVjdCByZXN0cmljdGVkID0gIGNyZWF0ZVJlc3RyaWN0ZWQoaGVscGVyLCBlbGVtZW50TmFtZSwgYWRkVHlwZU1ldGhvZHMpOworICAgICAgICBmaW5hbCBNZXRob2RBbmRPYmplY3QgdG9wTGV2ZWwgPSBjcmVhdGVUb3BMZXZlbChoZWxwZXIsIGVsZW1lbnROYW1lLCBhZGRUeXBlTWV0aG9kcyk7CiAKICAgICAgICAgaWYgKHJlc3RyaWN0ZWQgPT0gbnVsbCAmJiB0b3BMZXZlbCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTE1NTIsOCArMTUzMSw3IEBACiAgICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBNZXRob2RBbmRPYmplY3QgbWV0aG9kQW5kT2JqZWN0Ci0gICAgICAgICAgICA9IHJlc3RyaWN0ZWQgIT0gbnVsbCA/IHJlc3RyaWN0ZWQgOiB0b3BMZXZlbDsKKyAgICAgICAgZmluYWwgTWV0aG9kQW5kT2JqZWN0IG1ldGhvZEFuZE9iamVjdCA9IHJlc3RyaWN0ZWQgPT0gbnVsbCA/IHRvcExldmVsIDogcmVzdHJpY3RlZDsKIAogICAgICAgICBPYmplY3Qgck9iamVjdCA9IG1ldGhvZEFuZE9iamVjdC5vYmplY3Q7CiAgICAgICAgIGlmIChtZXRob2RBbmRPYmplY3Qub2JqZWN0IGluc3RhbmNlb2YgUHJlU2V0RGVmLlByZVNldERlZmluaXRpb24pIHsKQEAgLTE1NjgsNyArMTU0Niw3IEBACiAgICAgICAgICAgICBPYmplY3QgY3JlYXRlKGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgT2JqZWN0IGlnbm9yZSkKICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gewogICAgICAgICAgICAgICAgIGlmICghZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCJDb25maWd1cmVkIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TWV0aG9kKCkuaW52b2tlKHBhcmVudCwgbmV3IE9iamVjdFtdIHtyZWFsT2JqZWN0fSk7CisgICAgICAgICAgICAgICAgICAgIGdldE1ldGhvZCgpLmludm9rZShwYXJlbnQsIHJlYWxPYmplY3QpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbmVzdGVkT2JqZWN0OwogICAgICAgICAgICAgfQpAQCAtMTU4Miw3ICsxNTYwLDcgQEAKICAgICAgICAgICAgIHZvaWQgc3RvcmUoZmluYWwgT2JqZWN0IHBhcmVudCwgZmluYWwgT2JqZWN0IGNoaWxkKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgaWYgKGdldE1ldGhvZCgpLmdldE5hbWUoKS5lbmRzV2l0aCgiQ29uZmlndXJlZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldE1ldGhvZCgpLmludm9rZShwYXJlbnQsIG5ldyBPYmplY3RbXSB7cmVhbE9iamVjdH0pOworICAgICAgICAgICAgICAgICAgICBnZXRNZXRob2QoKS5pbnZva2UocGFyZW50LCByZWFsT2JqZWN0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC0xNjAxLDcgKzE1NzksNyBAQAogICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IHNpemU7ICsrYykgewogICAgICAgICAgICAgZmluYWwgTWV0aG9kIGN1cnJlbnQgPSBhZGRUeXBlTWV0aG9kcy5nZXQoYyk7CiAgICAgICAgICAgICBpZiAoY3VycmVudC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLmVxdWFscyhhcmdDbGFzcykpIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImFkZENvbmZpZ3VyZWQiKSkgeworICAgICAgICAgICAgICAgIGlmICgiYWRkQ29uZmlndXJlZCIuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjb25maWd1cmVkIHJlcGxhY2VzIHRoZSBhZGQgbWV0aG9kCiAgICAgICAgICAgICAgICAgICAgIGFkZFR5cGVNZXRob2RzLnNldChjLCBtZXRob2QpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE3MTIsOSArMTY5MCw4IEBACiAgICAgICAgIGZpbmFsIE1ldGhvZCBhZGRNZXRob2QgPSBmaW5kTWF0Y2hpbmdNZXRob2QoCiAgICAgICAgICAgICByZXN0cmljdGVkRGVmaW5pdGlvbi5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCksIGFkZFR5cGVNZXRob2RzKTsKICAgICAgICAgaWYgKGFkZE1ldGhvZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkFudCBJbnRlcm5hbCBFcnJvciAtIGNvbnRyYWN0IG1pc21hdGNoIGZvciAiCi0gICAgICAgICAgICAgICAgKyBlbGVtZW50TmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFudCBJbnRlcm5hbCBFcnJvciAtIGNvbnRyYWN0IG1pc21hdGNoIGZvciAiCisgICAgICAgICAgICAgICAgICAgICsgZWxlbWVudE5hbWUpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIE9iamVjdCBhZGRlZE9iamVjdCA9IHJlc3RyaWN0ZWREZWZpbml0aW9uLmNyZWF0ZShwcm9qZWN0KTsKICAgICAgICAgaWYgKGFkZGVkT2JqZWN0ID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0xvY2F0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvbi5qYXZhCmluZGV4IDhlMjVkMTAuLjMyYmQ3YjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L0xvY2F0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTG9jYXRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDYgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7CkBAIC0xMzEsOCArMTMyLDkgQEAKICAgICAgKiAgICAgICAgIDxjb2RlPiJmaWxlTmFtZTogIjwvY29kZT4gaWYgb25seSB0aGUgZmlsZSBuYW1lIGlzIGtub3duLAogICAgICAqICAgICAgICAgYW5kIHRoZSBlbXB0eSBzdHJpbmcgZm9yIHVua25vd24gbG9jYXRpb25zLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgYnVmLmFwcGVuZChmaWxlTmFtZSk7CkBAIC0xNTUsMTcgKzE1NywxMCBAQAogICAgICAqICAgICAgICAgICAgICBhcyB0aGlzIG9iamVjdC4KICAgICAgKiBAc2luY2UgQW50IDEuNi4zCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotICAgICAgICBpZiAodGhpcyA9PSBvdGhlcikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvdGhlci5nZXRDbGFzcygpID09IGdldENsYXNzKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuZXF1YWxzKG90aGVyLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlciB8fCBvdGhlciAhPSBudWxsICYmIG90aGVyLmdldENsYXNzKCkgPT0gZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICYmIHRvU3RyaW5nKCkuZXF1YWxzKG90aGVyLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTczLDcgKzE2OCw4IEBACiAgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBsb2NhdGlvbi4KICAgICAgKiBAc2luY2UgQW50IDEuNi4zCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChmaWxlTmFtZSwgbGluZU51bWJlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFnaWNOYW1lcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFnaWNOYW1lcy5qYXZhCmluZGV4IGQxODk2NTQuLjI5YmJhZWUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01hZ2ljTmFtZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9NYWdpY05hbWVzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01Niw2ICs1NiwxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDUklQVF9SRVBPU0lUT1JZID0gIm9yZy5hcGFjaGUuYW50LnNjcmlwdHJlcG8iOwogCiAgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBjYWNoZSB1c2VkIGJ5IHRoZSBzY3JpcHQgcnVubmVyLgorICAgICAqIFZhbHVlIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0NBQ0hFID0gIm9yZy5hcGFjaGUuYW50LnNjcmlwdGNhY2hlIjsKKworICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2UgdG8gdGhlIFN5c3RlbSBDbGFzcyBMb2FkZXIuCiAgICAgICogVmFsdWUge0B2YWx1ZX0KICAgICAgKiovCkBAIC0yMTIsNyArMjE4LDcgQEAKICAgICAgKiBWYWx1ZToge0B2YWx1ZX0KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0hFTFBFUl9TRVJWSUNFID0KLSAgICAgICAgIk1FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXIiOworICAgICAgICAiTUVUQS1JTkYvc2VydmljZXMvIiArIFBST0pFQ1RfSEVMUEVSX0NMQVNTOwogCiAgICAgLyoqCiAgICAgICogTmFtZSBvZiBQcm9qZWN0SGVscGVyIHJlZmVyZW5jZSB0aGF0IHdlIGFkZCB0byBhIHByb2plY3QuCkBAIC0yOTksMTYgKzMwNSwyOSBAQAogICAgICAqIGFzIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLjwvcD4KICAgICAgKgogICAgICAqIFZhbHVlOiB7QHZhbHVlfQotICAgICAqIEBzaW5jZSBBbnQgMS45LjEwCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUU1RBTVBfTk9XID0gImFudC50c3RhbXAubm93IjsKIAogICAgIC8qKgorICAgICAqIE1hZ2ljIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCB0byBjb250YWluIGEgdmFsdWUgZm9yIHRzdGFtcCdzCisgICAgICogIm5vdyIgaW4gb3JkZXIgdG8gbWFrZSBidWlsZHMgdGhhdCB1c2UgdGhlIHRhc2sgY3JlYXRlCisgICAgICogcmVwcm9kdWNpYmxlIHJlc3VsdHMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgaW4gSVNPIHRpbWUgZm9ybWF0CisgICAgICogKDxpPjE5NzItMDQtMTdUMDg6MDc8L2k+KTwvcD4KKyAgICAgKgorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFNUQU1QX05PV19JU08gPSAiYW50LnRzdGFtcC5ub3cuaXNvIjsKKworICAgIC8qKgogICAgICAqIE1hZ2ljIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCB0byBvdmVycmlkZSB0aGUgamF2YS5pby50bXBkaXIKICAgICAgKiBzeXN0ZW0gcHJvcGVydHkgYXMgdGhlIGxvY2F0aW9uIGZvciBBbnQncyBkZWZhdWx0IHRlbXBvcmFyeQogICAgICAqIGRpcmVjdG9yeS4KICAgICAgKiBWYWx1ZToge0B2YWx1ZX0KLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC44CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE1QRElSID0gImFudC50bXBkaXIiOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTWFpbi5qYXZhCmluZGV4IDcwNGI1NjUuLmE5YTU0MGMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L01haW4uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9NYWluLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMSArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwpAQCAtMzMsMTAgKzMzLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXI7CkBAIC00NSwxMCArNDUsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LkdldFByb3BlcnR5OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LlJlc29sdmVQcm9wZXJ0eU1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNsYXNzcGF0aFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUHJveHlTZXR1cDsKLQoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogQ29tbWFuZCBsaW5lIGVudHJ5IHBvaW50IGludG8gQW50LiBUaGlzIGNsYXNzIGlzIGVudGVyZWQgdmlhIHRoZQpAQCAtNjgsNyArNjcsNyBAQAogICAgICAqIG5vdCBiZSBzZWVuIGJ5IE1haW4uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gTEFVTkNIX0NPTU1BTkRTID0gQ29sbGVjdGlvbnMKLSAgICAgICAgICAgIC51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KCItbGliIiwgIi1jcCIsICItbm9jbGFzc3BhdGgiLAorICAgICAgICAgICAgLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoIi1saWIiLCAiLWNwIiwgIi1ub2NsYXNzcGF0aCIsCiAgICAgICAgICAgICAgICAgICAgICItLW5vY2xhc3NwYXRoIiwgIi1ub3VzZXJsaWIiLCAiLW1haW4iKSkpOwogCiAgICAgLyoqIFRoZSBkZWZhdWx0IGJ1aWxkIGZpbGUgbmFtZS4ge0B2YWx1ZX0gKi8KQEAgLTg3LDE2ICs4NiwxNiBAQAogICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gZXJyID0gU3lzdGVtLmVycjsKIAogICAgIC8qKiBUaGUgYnVpbGQgdGFyZ2V0cy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHRhcmdldHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHRhcmdldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiBTZXQgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRhc2tzLiAqLwogICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBkZWZpbmVkUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogCiAgICAgLyoqIE5hbWVzIG9mIGNsYXNzZXMgdG8gYWRkIGFzIGxpc3RlbmVycyB0byBwcm9qZWN0LiAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gbGlzdGVuZXJzID0gbmV3IFZlY3RvcjxTdHJpbmc+KDEpOworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gbGlzdGVuZXJzID0gbmV3IFZlY3Rvcjw+KDEpOwogCiAgICAgLyoqIEZpbGUgbmFtZXMgb2YgcHJvcGVydHkgZmlsZXMgdG8gbG9hZCBvbiBzdGFydHVwLiAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gcHJvcGVydHlGaWxlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigxKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHByb3BlcnR5RmlsZXMgPSBuZXcgVmVjdG9yPD4oMSk7CiAKICAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBidWlsZCBpcyB0byBzdXBwb3J0IGludGVyYWN0aXZlIGlucHV0ICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93SW5wdXQgPSB0cnVlOwpAQCAtMTU1LDE3ICsxNTQsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBwcm94eSA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8Pz4sIExpc3Q8U3RyaW5nPj4gZXh0cmFBcmd1bWVudHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgTGlzdDxTdHJpbmc+PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBMaXN0PFN0cmluZz4+IGV4dHJhQXJndW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2V0UHJvcGVydHkgTk9QUk9QRVJUSUVTID0gbmV3IEdldFByb3BlcnR5KCkgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBhTmFtZSkgewotICAgICAgICAgICAgLy8gTm8gZXhpc3RpbmcgcHJvcGVydHkgdGFrZXMgcHJlY2VkZW5jZQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9OwotCi0KLQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdldFByb3BlcnR5IE5PUFJPUEVSVElFUyA9IGFOYW1lIC0+IG51bGw7CiAKICAgICAvKioKICAgICAgKiBQcmludHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIFRocm93YWJsZSBpZiBpdCAodGhlIG1lc3NhZ2UpIGlzIG5vdApAQCAtMjIxLDEyICsyMTIsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIEVudW1lcmF0aW9uPD8+IGUgPSBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMua2V5cygpOwotICAgICAgICAgICAgICAgICAgICBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5ID0gYWRkaXRpb25hbFVzZXJQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICAgICAgZGVmaW5lZFByb3BzLnB1dChrZXksIHByb3BlcnR5KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZGl0aW9uYWxVc2VyUHJvcGVydGllcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goa2V5IC0+IGRlZmluZWRQcm9wcy5wdXQoa2V5LCBhZGRpdGlvbmFsVXNlclByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KSkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZXhwZWN0IHRoZSB3b3JzdApAQCAtMzU1LDEwICszNDIsMTAgQEAKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGxvZ0ZpbGUgPSBuZXcgRmlsZShhcmdzW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgLy8gbGlmZS1jeWNsZSBvZiBGaWxlT3V0cHV0U3RyZWFtIGlzIGNvbnRyb2xsZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgLy8gbGlmZS1jeWNsZSBvZiBPdXRwdXRTdHJlYW0gaXMgY29udHJvbGxlZCBieQogICAgICAgICAgICAgICAgICAgICAvLyBsb2dUbyB3aGljaCBiZWNvbWVzICJvdXQiIGFuZCBpcyBjbG9zZWQgaW4KICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlTG9nZmlsZQotICAgICAgICAgICAgICAgICAgICBsb2dUbyA9IG5ldyBQcmludFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlKSk7IC8vTk9TT05BUgorICAgICAgICAgICAgICAgICAgICBsb2dUbyA9IG5ldyBQcmludFN0cmVhbShGaWxlcy5uZXdPdXRwdXRTdHJlYW0obG9nRmlsZS50b1BhdGgoKSkpOyAvL05PU09OQVIKICAgICAgICAgICAgICAgICAgICAgaXNMb2dGaWxlVXNlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAiQ2Fubm90IHdyaXRlIG9uIHRoZSBzcGVjaWZpZWQgbG9nIGZpbGUuICIKQEAgLTQxNCwxNCArNDAxLDggQEAKICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIEFyZ3VtZW50UHJvY2Vzc29yIHByb2Nlc3NvciA6IHByb2Nlc3NvclJlZ2lzdHJ5LmdldFByb2Nlc3NvcnMoKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV3SSA9IHByb2Nlc3Nvci5yZWFkQXJndW1lbnRzKGFyZ3MsIGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobmV3SSAhPSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4dHJhQXJncyA9IGV4dHJhQXJndW1lbnRzLmdldChwcm9jZXNzb3IuZ2V0Q2xhc3MoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFBcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUFyZ3VtZW50cy5wdXQocHJvY2Vzc29yLmdldENsYXNzKCksIGV4dHJhQXJncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IG5ld0kgJiYgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUFyZ3MuYWRkKGFyZ3NbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGV4dHJhQXJncyA9IGV4dHJhQXJndW1lbnRzLmNvbXB1dGVJZkFic2VudChwcm9jZXNzb3IuZ2V0Q2xhc3MoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUFyZ3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykuc3ViTGlzdChuZXdJLCBhcmdzLmxlbmd0aCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01NjgsOSArNTQ5LDkgQEAKICAgICAgICAgICogdG8gaGVscCBvciBub3QsIHNvIHdlIHNpbXBseSBsb29rIGZvciB0aGUgZXF1YWxzIHNpZ24uCiAgICAgICAgICAqLwogICAgICAgICBmaW5hbCBTdHJpbmcgYXJnID0gYXJnc1thcmdQb3NdOwotICAgICAgICBTdHJpbmcgbmFtZSA9IGFyZy5zdWJzdHJpbmcoMiwgYXJnLmxlbmd0aCgpKTsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKLSAgICAgICAgZmluYWwgaW50IHBvc0VxID0gbmFtZS5pbmRleE9mKCI9Iik7CisgICAgICAgIFN0cmluZyBuYW1lID0gYXJnLnN1YnN0cmluZygyKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgICBmaW5hbCBpbnQgcG9zRXEgPSBuYW1lLmluZGV4T2YoJz0nKTsKICAgICAgICAgaWYgKHBvc0VxID4gMCkgewogICAgICAgICAgICAgdmFsdWUgPSBuYW1lLnN1YnN0cmluZyhwb3NFcSArIDEpOwogICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIHBvc0VxKTsKQEAgLTY0MCw4ICs2MjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXJnc1twb3NdKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh0aHJlYWRQcmlvcml0eS5pbnRWYWx1ZSgpIDwgVGhyZWFkLk1JTl9QUklPUklUWQotICAgICAgICAgICAgfHwgdGhyZWFkUHJpb3JpdHkuaW50VmFsdWUoKSA+IFRocmVhZC5NQVhfUFJJT1JJVFkpIHsKKyAgICAgICAgaWYgKHRocmVhZFByaW9yaXR5IDwgVGhyZWFkLk1JTl9QUklPUklUWQorICAgICAgICAgICAgfHwgdGhyZWFkUHJpb3JpdHkgPiBUaHJlYWQuTUFYX1BSSU9SSVRZKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIk5pY2VuZXNzIHZhbHVlIGlzIG91dCBvZiB0aGUgcmFuZ2UgMS0xMCIpOwogICAgICAgICB9CkBAIC02NTYsMjUgKzYzNywxNyBAQAogICAgIHByaXZhdGUgdm9pZCBsb2FkUHJvcGVydHlGaWxlcygpIHsKICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsZW5hbWUgOiBwcm9wZXJ0eUZpbGVzKSB7CiAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KGZpbGVuYW1lKSkpIHsKICAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGZpcyk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgbG9hZCBwcm9wZXJ0eSBmaWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlbmFtZSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCAtRCBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZQotICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248Pz4gcHJvcGVydHlOYW1lcyA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChwcm9wZXJ0eU5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBwcm9wZXJ0eU5hbWVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlZmluZWRQcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmluZWRQcm9wcy5wdXQobmFtZSwgcHJvcHMuZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3BzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKG5hbWUgLT4gZGVmaW5lZFByb3BzLmdldFByb3BlcnR5KG5hbWUpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKG5hbWUgLT4gZGVmaW5lZFByb3BzLnB1dChuYW1lLCBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MDYsNyArNzc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJTZXR0aW5nIEFudCdzIHRocmVhZCBwcmlvcml0eSB0byAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhyZWFkUHJpb3JpdHksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRQcmlvcml0eSh0aHJlYWRQcmlvcml0eS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0UHJpb3JpdHkodGhyZWFkUHJpb3JpdHkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBTZWN1cml0eUV4Y2VwdGlvbiBzd2FsbG93ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHNldCB0aGUgcHJpb3JpdHkgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJBIHNlY3VyaXR5IG1hbmFnZXIgcmVmdXNlZCB0byBzZXQgdGhlIC1uaWNlIHZhbHVlIik7CkBAIC04NDgsNyArODIxLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgdGFyZ2V0IHRvIGV4ZWN1dGUKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0cy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmICh0YXJnZXRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAocHJvamVjdC5nZXREZWZhdWx0VGFyZ2V0KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGRFbGVtZW50KHByb2plY3QuZ2V0RGVmYXVsdFRhcmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODY2LDEyICs4MzksOSBAQAogICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoc2F2ZWRFcnIpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRJbihzYXZlZEluKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBleGMpIHsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4YykgewogICAgICAgICAgICAgZXJyb3IgPSBleGM7CiAgICAgICAgICAgICB0aHJvdyBleGM7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIEVycm9yIGUpIHsKLSAgICAgICAgICAgIGVycm9yID0gZTsKLSAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoIXByb2plY3RIZWxwKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTkxMSwxMSArODgxLDcgQEAKICAgICAgICAgcmVzb2x2ZXIucmVzb2x2ZUFsbFByb3BlcnRpZXMocHJvcHMsIG51bGwsIGZhbHNlKTsKIAogICAgICAgICAvLyBzZXQgdXNlci1kZWZpbmUgcHJvcGVydGllcwotICAgICAgICBmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnQgOiBwcm9wcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXJnID0gZW50LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShhcmcsIFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcHJvcHMuZm9yRWFjaCgoYXJnLCB2YWx1ZSkgLT4gcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoYXJnLCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpKTsKIAogICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9GSUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwpAQCAtOTMwLDcgKzg5Niw3IEBACiAgICAgICAgIC8vIFNldHRpbmcgaXQgaGVyZSBhbGxvd3MgdG9wLWxldmVsIHRhc2tzIHRvIGFjY2VzcyB0aGUKICAgICAgICAgLy8gcHJvcGVydHkuCiAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuUFJPSkVDVF9JTlZPS0VEX1RBUkdFVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25VdGlscy5mbGF0dGVuVG9TdHJpbmcodGFyZ2V0cykpOworICAgICAgICAgICAgICAgIFN0cmluZy5qb2luKCIsIiwgdGFyZ2V0cykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTQ5LDcgKzkxNSw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGxpc3RlbmVycy5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICBmaW5hbCBCdWlsZExpc3RlbmVyIGxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICAgICAgKEJ1aWxkTGlzdGVuZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1haW4uY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgQnVpbGRMaXN0ZW5lci5jbGFzcyk7CiAgICAgICAgICAgICBwcm9qZWN0LnNldFByb2plY3RSZWZlcmVuY2UobGlzdGVuZXIpOwogCkBAIC05NzAsNyArOTM2LDcgQEAKICAgICAgICAgaWYgKGlucHV0SGFuZGxlckNsYXNzbmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBoYW5kbGVyID0gbmV3IERlZmF1bHRJbnB1dEhhbmRsZXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXIgPSAoSW5wdXRIYW5kbGVyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgIGhhbmRsZXIgPSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICAgaW5wdXRIYW5kbGVyQ2xhc3NuYW1lLCBNYWluLmNsYXNzLmdldENsYXNzTG9hZGVyKCksCiAgICAgICAgICAgICAgICAgICAgIElucHV0SGFuZGxlci5jbGFzcyk7CiAgICAgICAgICAgICBwcm9qZWN0LnNldFByb2plY3RSZWZlcmVuY2UoaGFuZGxlcik7CkBAIC05OTIsNyArOTU4LDcgQEAKICAgICAgICAgICAgIGVtYWNzTW9kZSA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAobG9nZ2VyQ2xhc3NuYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyID0gKEJ1aWxkTG9nZ2VyKSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICBsb2dnZXIgPSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlckNsYXNzbmFtZSwgTWFpbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRMb2dnZXIuY2xhc3MpOwogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQnVpbGRFeGNlcHRpb24gZSkgewpAQCAtMTA5NiwxMyArMTA2MiwxMCBAQAogICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwogICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgc2hvcnRBbnRWZXJzaW9uID0gcHJvcHMuZ2V0UHJvcGVydHkoIlZFUlNJT04iKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiQXBhY2hlIEFudChUTSkgdmVyc2lvbiAiKTsKLSAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKHNob3J0QW50VmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiIGNvbXBpbGVkIG9uICIpOwotICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQocHJvcHMuZ2V0UHJvcGVydHkoIkRBVEUiKSk7Ci0gICAgICAgICAgICAgICAgYW50VmVyc2lvbiA9IG1zZy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGFudFZlcnNpb24gPSAiQXBhY2hlIEFudChUTSkgdmVyc2lvbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0QW50VmVyc2lvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbXBpbGVkIG9uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoIkRBVEUiKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgdGhlIHZlcnNpb24gaW5mb3JtYXRpb246IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCkpOwpAQCAtMTE1MywyNiArMTExNiwxOSBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIHRhcmdldHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgVGFyZ2V0PiByZW1vdmVEdXBsaWNhdGVUYXJnZXRzKGZpbmFsIE1hcDxTdHJpbmcsIFRhcmdldD4gdGFyZ2V0cykgewotICAgICAgICBmaW5hbCBNYXA8TG9jYXRpb24sIFRhcmdldD4gbG9jYXRpb25NYXAgPSBuZXcgSGFzaE1hcDxMb2NhdGlvbiwgVGFyZ2V0PigpOwotICAgICAgICBmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgVGFyZ2V0PiBlbnRyeSA6IHRhcmdldHMuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIFRhcmdldCB0YXJnZXQgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICBmaW5hbCBNYXA8TG9jYXRpb24sIFRhcmdldD4gbG9jYXRpb25NYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHRhcmdldHMuZm9yRWFjaCgobmFtZSwgdGFyZ2V0KSAtPiB7CiAgICAgICAgICAgICBmaW5hbCBUYXJnZXQgb3RoZXJUYXJnZXQgPSBsb2NhdGlvbk1hcC5nZXQodGFyZ2V0LmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgLy8gUGxhY2UgdGhpcyBlbnRyeSBpbiB0aGUgbG9jYXRpb24gbWFwIGlmCiAgICAgICAgICAgICAvLyAgYSkgbG9jYXRpb24gaXMgbm90IGluIHRoZSBtYXAKICAgICAgICAgICAgIC8vICBiKSBsb2NhdGlvbiBpcyBpbiBtYXAsIGJ1dCBpdHMgbmFtZSBpcyBsb25nZXIKICAgICAgICAgICAgIC8vICAgICAoYW4gaW1wb3J0ZWQgdGFyZ2V0IHdpbGwgaGF2ZSBhIG5hbWUuIHByZWZpeCkKLSAgICAgICAgICAgIGlmIChvdGhlclRhcmdldCA9PSBudWxsCi0gICAgICAgICAgICAgICAgfHwgb3RoZXJUYXJnZXQuZ2V0TmFtZSgpLmxlbmd0aCgpID4gbmFtZS5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIGxvY2F0aW9uTWFwLnB1dCgKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldExvY2F0aW9uKCksIHRhcmdldCk7IC8vIFNtYWxsZXN0IG5hbWUgd2lucworICAgICAgICAgICAgaWYgKG90aGVyVGFyZ2V0ID09IG51bGwgfHwgb3RoZXJUYXJnZXQuZ2V0TmFtZSgpLmxlbmd0aCgpID4gbmFtZS5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGxvY2F0aW9uTWFwLnB1dCh0YXJnZXQuZ2V0TG9jYXRpb24oKSwgdGFyZ2V0KTsgLy8gU21hbGxlc3QgbmFtZSB3aW5zCiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWFwPFN0cmluZywgVGFyZ2V0PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFRhcmdldD4oKTsKLSAgICAgICAgZm9yIChmaW5hbCBUYXJnZXQgdGFyZ2V0IDogbG9jYXRpb25NYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIHJldC5wdXQodGFyZ2V0LmdldE5hbWUoKSwgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGxvY2F0aW9uTWFwLnZhbHVlcygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChUYXJnZXQ6OmdldE5hbWUsIHRhcmdldCAtPiB0YXJnZXQsIChhLCBiKSAtPiBiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTkxLDE1ICsxMTQ3LDE1IEBACiAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFRhcmdldD4gcHRhcmdldHMgPSByZW1vdmVEdXBsaWNhdGVUYXJnZXRzKHByb2plY3QuZ2V0VGFyZ2V0cygpKTsKICAgICAgICAgLy8gc3BsaXQgdGhlIHRhcmdldHMgaW4gdG9wLWxldmVsIGFuZCBzdWItdGFyZ2V0cyBkZXBlbmRpbmcKICAgICAgICAgLy8gb24gdGhlIHByZXNlbmNlIG9mIGEgZGVzY3JpcHRpb24KLSAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gdG9wTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gdG9wRGVzY3JpcHRpb25zID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0gICAgICAgIGZpbmFsIFZlY3RvcjxFbnVtZXJhdGlvbjxTdHJpbmc+PiB0b3BEZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yPEVudW1lcmF0aW9uPFN0cmluZz4+KCk7Ci0gICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHN1Yk5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0gICAgICAgIGZpbmFsIFZlY3RvcjxFbnVtZXJhdGlvbjxTdHJpbmc+PiBzdWJEZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yPEVudW1lcmF0aW9uPFN0cmluZz4+KCk7CisgICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHRvcE5hbWVzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHRvcERlc2NyaXB0aW9ucyA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICBmaW5hbCBWZWN0b3I8RW51bWVyYXRpb248U3RyaW5nPj4gdG9wRGVwZW5kZW5jaWVzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHN1Yk5hbWVzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgIGZpbmFsIFZlY3RvcjxFbnVtZXJhdGlvbjxTdHJpbmc+PiBzdWJEZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgICAgICBmb3IgKGZpbmFsIFRhcmdldCBjdXJyZW50VGFyZ2V0IDogcHRhcmdldHMudmFsdWVzKCkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lID0gY3VycmVudFRhcmdldC5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0TmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0TmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXREZXNjcmlwdGlvbiA9IGN1cnJlbnRUYXJnZXQuZ2V0RGVzY3JpcHRpb24oKTsKQEAgLTEyMjcsNyArMTE4Myw3IEBACiAgICAgICAgICAgICAgICAgIk1haW4gdGFyZ2V0czoiLCBtYXhMZW5ndGgpOwogICAgICAgICAvL2lmIHRoZXJlIHdlcmUgbm8gbWFpbiB0YXJnZXRzLCB3ZSBsaXN0IGFsbCBzdWJ0YXJnZXRzCiAgICAgICAgIC8vYXMgaXQgbWVhbnMgbm90aGluZyBoYXMgYSBkZXNjcmlwdGlvbgotICAgICAgICBpZiAodG9wTmFtZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKHRvcE5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcHJpbnRTdWJUYXJnZXRzID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAocHJpbnRTdWJUYXJnZXRzKSB7CkBAIC0xMjM1LDcgKzExOTEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRUYXJnZXQgPSBwcm9qZWN0LmdldERlZmF1bHRUYXJnZXQoKTsKLSAgICAgICAgaWYgKGRlZmF1bHRUYXJnZXQgIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGRlZmF1bHRUYXJnZXQpKSB7CisgICAgICAgIGlmIChkZWZhdWx0VGFyZ2V0ICE9IG51bGwgJiYgIWRlZmF1bHRUYXJnZXQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGVjayBidXQuLi4KICAgICAgICAgICAgIHByb2plY3QubG9nKCJEZWZhdWx0IHRhcmdldDogIiArIGRlZmF1bHRUYXJnZXQpOwogICAgICAgICB9CkBAIC0xMjg3LDE0ICsxMjQzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heGxlbikgewogICAgICAgICAvLyBub3csIHN0YXJ0IHByaW50aW5nIHRoZSB0YXJnZXRzIGFuZCB0aGVpciBkZXNjcmlwdGlvbnMKLSAgICAgICAgZmluYWwgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBlb2wgPSBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOwogICAgICAgICAvLyBnb3QgYSBiaXQgYW5ub3llZCB0aGF0IEkgY291bGRuJ3QgZmluZCBhIHBhZCBmdW5jdGlvbgogICAgICAgICBTdHJpbmdCdWlsZGVyIHNwYWNlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCIgICAgIik7CiAgICAgICAgIHdoaWxlIChzcGFjZXMubGVuZ3RoKCkgPD0gbWF4bGVuKSB7CiAgICAgICAgICAgICBzcGFjZXMuYXBwZW5kKHNwYWNlcyk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtc2cuYXBwZW5kKGhlYWRpbmcpLmFwcGVuZChsU2VwKS5hcHBlbmQobFNlcCk7CisgICAgICAgIG1zZy5hcHBlbmQoaGVhZGluZykuYXBwZW5kKGVvbCkuYXBwZW5kKGVvbCk7CiAgICAgICAgIGZpbmFsIGludCBzaXplID0gbmFtZXMuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgbXNnLmFwcGVuZCgiICIpOwpAQCAtMTMwNCwxOSArMTI2MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBzcGFjZXMuc3Vic3RyaW5nKDAsIG1heGxlbiAtIG5hbWVzLmVsZW1lbnRBdChpKS5sZW5ndGgoKSArIDIpKTsKICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKGRlc2NyaXB0aW9ucy5lbGVtZW50QXQoaSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbXNnLmFwcGVuZChsU2VwKTsKLSAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFN0cmluZz4gZGVwcyA9IGRlcGVuZGVuY2llcy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiICAgZGVwZW5kcyBvbjogIik7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXBzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKGRlcHMubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZChsU2VwKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2cuYXBwZW5kKGVvbCk7CisgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY2llcy5pc0VtcHR5KCkgJiYgZGVwZW5kZW5jaWVzLmVsZW1lbnRBdChpKS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIG1zZy5hcHBlbmQoU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShkZXBlbmRlbmNpZXMuZWxlbWVudEF0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsICIgICBkZXBlbmRzIG9uOiAiLCBlb2wpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJvamVjdC5sb2cobXNnLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1dBUk4pOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTm9CYW5uZXJMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L05vQmFubmVyTG9nZ2VyLmphdmEKaW5kZXggYTA4NmJmNS4uYjJlNWMxNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvTm9CYW5uZXJMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ob0Jhbm5lckxvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKLQogLyoqCiAgKiBFeHRlbmRzIERlZmF1bHRMb2dnZXIgdG8gc3RyaXAgb3V0IGVtcHR5IHRhcmdldHMuCiAgKgpAQCAtODQsMTMgKzgyLDEzIEBACiAKICAgICAgICAgaWYgKGV2ZW50LmdldFByaW9yaXR5KCkgPiBtc2dPdXRwdXRMZXZlbAogICAgICAgICAgICAgfHwgbnVsbCA9PSBldmVudC5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgIHx8ICIiLmVxdWFscyhldmVudC5nZXRNZXNzYWdlKCkudHJpbSgpKSkgeworICAgICAgICAgICAgfHwgZXZlbnQuZ2V0TWVzc2FnZSgpLnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChudWxsICE9IHRhcmdldE5hbWUpIHsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihTdHJpbmdVdGlscy5MSU5FX1NFUCArIHRhcmdldE5hbWUgKyAiOiIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVuJXM6IiwgdGFyZ2V0TmFtZSkpOwogICAgICAgICAgICAgICAgIHRhcmdldE5hbWUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QYXRoVG9rZW5pemVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QYXRoVG9rZW5pemVyLmphdmEKaW5kZXggNmU2YmVhNi4uMGFmYjQyYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUGF0aFRva2VuaXplci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1BhdGhUb2tlbml6ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgzLDExICs4Myw3IEBACiAgICAgICogaW4gdGhlIHN0cmluZyBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbjsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotICAgICAgICBpZiAobG9va2FoZWFkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7CisgICAgICAgIHJldHVybiBsb29rYWhlYWQgIT0gbnVsbCB8fCB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI3LDcgKzEyMyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB3ZSBhcmUgb24gTmV0V2FyZSwgdG9rZW5pemluZyBpcyBoYW5kbGVkIGEgbGl0dGxlIGRpZmZlcmVudGx5LAogICAgICAgICAgICAgLy8gZHVlIHRvIHRoZSBmYWN0IHRoYXQgTmV0V2FyZSBoYXMgbXVsdGlwbGUtY2hhcmFjdGVyIHZvbHVtZSBuYW1lcy4KLSAgICAgICAgICAgIGlmICh0b2tlbi5lcXVhbHMoRmlsZS5wYXRoU2VwYXJhdG9yKSB8fCB0b2tlbi5lcXVhbHMoIjoiKSkgeworICAgICAgICAgICAgaWYgKHRva2VuLmVxdWFscyhGaWxlLnBhdGhTZXBhcmF0b3IpIHx8ICI6Ii5lcXVhbHModG9rZW4pKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlICI7IiBhbmQgZ2V0IHRoZSBuZXh0IHRva2VuCiAgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwogICAgICAgICAgICAgfQpAQCAtMTM4LDcgKzEzNCw3IEBACiAKICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2UgYXJlbid0IGdvaW5nIHRvIGdldCB0aGUgcGF0aCBzZXBhcmF0b3IgbmV4dAogICAgICAgICAgICAgICAgIGlmICghbmV4dFRva2VuLmVxdWFscyhGaWxlLnBhdGhTZXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0VG9rZW4uZXF1YWxzKCI6IikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCI6Ii5lcXVhbHMobmV4dFRva2VuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2tlbi5zdGFydHNXaXRoKCIvIikgJiYgIXRva2VuLnN0YXJ0c1dpdGgoIlxcIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdG9rZW4uc3RhcnRzV2l0aCgiLiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXRva2VuLnN0YXJ0c1dpdGgoIi4uIikpIHsKQEAgLTE2Myw0ICsxNTksMyBAQAogICAgICAgICByZXR1cm4gdG9rZW47CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0LmphdmEKaW5kZXggYjg2MzZkOS4uMWQzZTY5MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDggKzIzLDggQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIGltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLkRlZmF1bHRFeGVjdXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwpAQCAtNDYsMTAgKzQ3LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVmVjdG9yU2V0OwogCiAvKioKQEAgLTE0MSwxNyArMTQwLDIwIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CiAKIAorICAgIC8qKiBsb2NrIG9iamVjdCB1c2VkIHdoZW4gYWRkaW5nL3JlbW92aW5nIHJlZmVyZW5jZXMgKi8KKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCByZWZlcmVuY2VzTG9jayA9IG5ldyBPYmplY3QoKTsKKwogICAgIC8qKiBNYXAgb2YgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIHByb2plY3QgKHBhdGhzIGV0YykgKFN0cmluZyB0byBPYmplY3QpLiAqLwogICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiByZWZlcmVuY2VzID0gbmV3IEFudFJlZlRhYmxlKCk7CiAKICAgICAvKiogTWFwIG9mIGlkIHJlZmVyZW5jZXMgLSB1c2VkIGZvciBpbmRpY2F0aW5nIGJyb2tlbiBidWlsZCBmaWxlcyAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gaWRSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBpZFJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAvKiogTmFtZSBvZiB0aGUgcHJvamVjdCdzIGRlZmF1bHQgdGFyZ2V0LiAqLwogICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRUYXJnZXQ7CiAKICAgICAvKiogTWFwIGZyb20gdGFyZ2V0IG5hbWVzIHRvIHRhcmdldHMgKFN0cmluZyB0byBUYXJnZXQpLiAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgVGFyZ2V0PiB0YXJnZXRzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFRhcmdldD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIFRhcmdldD4gdGFyZ2V0cyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqIFNldCBvZiBnbG9iYWwgZmlsdGVycy4gKi8KICAgICBwcml2YXRlIGZpbmFsIEZpbHRlclNldCBnbG9iYWxGaWx0ZXJTZXQgPSBuZXcgRmlsdGVyU2V0KCk7CkBAIC0xNzksMTIgKzE4MSw3IEBACiAKICAgICAvKiogZm9yIGVhY2ggdGhyZWFkLCByZWNvcmQgd2hldGhlciBpdCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nCiAgICAgICAgIG1lc3NhZ2VMb2dnZWQgKi8KLSAgICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsPEJvb2xlYW4+IGlzTG9nZ2luZ01lc3NhZ2UgPSBuZXcgVGhyZWFkTG9jYWw8Qm9vbGVhbj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBCb29sZWFuIGluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICBwcml2YXRlIGZpbmFsIFRocmVhZExvY2FsPEJvb2xlYW4+IGlzTG9nZ2luZ01lc3NhZ2UgPSBUaHJlYWRMb2NhbC53aXRoSW5pdGlhbCgoKSAtPiBCb29sZWFuLkZBTFNFKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBBbnQgY29yZSBjbGFzc2xvYWRlci0tbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVzaW5nCkBAIC0xOTQsMTEgKzE5MSwxMSBAQAogCiAgICAgLyoqIFJlY29yZHMgdGhlIGxhdGVzdCB0YXNrIHRvIGJlIGV4ZWN1dGVkIG9uIGEgdGhyZWFkLiAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPFRocmVhZCwgVGFzaz4gdGhyZWFkVGFza3MKLSAgICAgICAgICAgID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUaHJlYWQsIFRhc2s+KCkpOworICAgICAgICAgICAgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IFdlYWtIYXNoTWFwPD4oKSk7CiAKICAgICAvKiogUmVjb3JkcyB0aGUgbGF0ZXN0IHRhc2sgdG8gYmUgZXhlY3V0ZWQgb24gYSB0aHJlYWQgZ3JvdXAuICovCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VGhyZWFkR3JvdXAsIFRhc2s+IHRocmVhZEdyb3VwVGFza3MKLSAgICAgICAgICAgID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDxUaHJlYWRHcm91cCxUYXNrPigpKTsKKyAgICAgICAgICAgID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBXZWFrSGFzaE1hcDw+KCkpOwogCiAgICAgLyoqCiAgICAgICogQ2FsbGVkIHRvIGhhbmRsZSBhbnkgaW5wdXQgcmVxdWVzdHMuCkBAIC00MzgsMTAgKzQzNSw4IEBACiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxCdWlsZExpc3RlbmVyPiBnZXRCdWlsZExpc3RlbmVycygpIHsKICAgICAgICAgc3luY2hyb25pemVkIChsaXN0ZW5lcnNMb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWZWN0b3I8QnVpbGRMaXN0ZW5lcj4gciA9IG5ldyBWZWN0b3I8QnVpbGRMaXN0ZW5lcj4obGlzdGVuZXJzLmxlbmd0aCk7Ci0gICAgICAgICAgICBmb3IgKEJ1aWxkTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLSAgICAgICAgICAgICAgICByLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBWZWN0b3I8QnVpbGRMaXN0ZW5lcj4gciA9IG5ldyBWZWN0b3I8PihsaXN0ZW5lcnMubGVuZ3RoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChyLCBsaXN0ZW5lcnMpOwogICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgIH0KICAgICB9CkBAIC05MzEsOCArOTI2LDggQEAKICAgICAgICAgc2V0UHJvcGVydHlJbnRlcm5hbChNYWdpY05hbWVzLkFOVF9KQVZBX1ZFUlNJT04sIGphdmFWZXJzaW9uKTsKIAogICAgICAgICAvLyBzYW5pdHkgY2hlY2sKLSAgICAgICAgaWYgKCFKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV81KSkgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQW50IGNhbm5vdCB3b3JrIG9uIEphdmEgcHJpb3IgdG8gMS41Iik7CisgICAgICAgIGlmICghSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfOCkpICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkFudCBjYW5ub3Qgd29yayBvbiBKYXZhIHByaW9yIHRvIDEuOCIpOwogICAgICAgICB9CiAgICAgICAgIGxvZygiRGV0ZWN0ZWQgSmF2YSB2ZXJzaW9uOiAiICsgamF2YVZlcnNpb24gKyAiIGluOiAiCiAgICAgICAgICAgICArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIiksIE1TR19WRVJCT1NFKTsKQEAgLTk0Niw5ICs5NDEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVByb3BlcnRpZXMoKSB7CiAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgc3lzdGVtUCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPD8+IGUgPSBzeXN0ZW1QLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSA6IHN5c3RlbVAuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBzeXN0ZW1QLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CiAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJvcGVydHlJbnRlcm5hbChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKQEAgLTEwNDcsNyArMTA0MCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMQogICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZ2V0Q29weU9mVGFza0RlZmluaXRpb25zKCkgewotICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBDbGFzczw/Pj4oZ2V0VGFza0RlZmluaXRpb25zKCkpOworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8PihnZXRUYXNrRGVmaW5pdGlvbnMoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDg5LDcgKzEwODIsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjEKICAgICAgKi8KICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldENvcHlPZkRhdGFUeXBlRGVmaW5pdGlvbnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PihnZXREYXRhVHlwZURlZmluaXRpb25zKCkpOworICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8PihnZXREYXRhVHlwZURlZmluaXRpb25zKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE2OSw3ICsxMTYyLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuOC4xCiAgICAgICovCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFRhcmdldD4gZ2V0Q29weU9mVGFyZ2V0cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPFN0cmluZywgVGFyZ2V0Pih0YXJnZXRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPD4odGFyZ2V0cyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjU3LDcgKzEyNTAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVUYXJnZXRzKGZpbmFsIFZlY3RvcjxTdHJpbmc+IG5hbWVzKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBzZXRVc2VyUHJvcGVydHkoTWFnaWNOYW1lcy5QUk9KRUNUX0lOVk9LRURfVEFSR0VUUywKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25VdGlscy5mbGF0dGVuVG9TdHJpbmcobmFtZXMpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcuam9pbigiLCIsIG5hbWVzKSk7CiAgICAgICAgIGdldEV4ZWN1dG9yKCkuZXhlY3V0ZVRhcmdldHModGhpcywgbmFtZXMudG9BcnJheShuZXcgU3RyaW5nW25hbWVzLnNpemUoKV0pKTsKICAgICB9CiAKQEAgLTEyNzQsMTIgKzEyNjcsMTAgQEAKICAgICAgICAgZmluYWwgVGFzayB0YXNrID0gZ2V0VGhyZWFkVGFzayhUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKICAgICAgICAgaWYgKHRhc2sgPT0gbnVsbCkgewogICAgICAgICAgICAgbG9nKG91dHB1dCwgaXNXYXJuaW5nID8gTVNHX1dBUk4gOiBNU0dfSU5GTyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNXYXJuaW5nKSB7CisgICAgICAgICAgICB0YXNrLmhhbmRsZUVycm9yT3V0cHV0KG91dHB1dCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNXYXJuaW5nKSB7Ci0gICAgICAgICAgICAgICAgdGFzay5oYW5kbGVFcnJvck91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXNrLmhhbmRsZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFzay5oYW5kbGVPdXRwdXQob3V0cHV0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI5OCwxMiArMTI4OSwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZGVmYXVsdElucHV0KGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChkZWZhdWx0SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGVmYXVsdElucHV0U3RyZWFtID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIk5vIGlucHV0IHByb3ZpZGVkIGZvciBwcm9qZWN0Iik7CiAgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOworICAgICAgICByZXR1cm4gZGVmYXVsdElucHV0U3RyZWFtLnJlYWQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIzLDkgKzEzMTMsOCBAQAogICAgICAgICBmaW5hbCBUYXNrIHRhc2sgPSBnZXRUaHJlYWRUYXNrKFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwogICAgICAgICBpZiAodGFzayA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdElucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHRhc2suaGFuZGxlSW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRhc2suaGFuZGxlSW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzQzLDEyICsxMzMyLDEwIEBACiAgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IGdldFRocmVhZFRhc2soVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSk7CiAgICAgICAgIGlmICh0YXNrID09IG51bGwpIHsKICAgICAgICAgICAgIGZpcmVNZXNzYWdlTG9nZ2VkKHRoaXMsIG91dHB1dCwgaXNFcnJvciA/IE1TR19FUlIgOiBNU0dfSU5GTyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNFcnJvcikgeworICAgICAgICAgICAgdGFzay5oYW5kbGVFcnJvckZsdXNoKG91dHB1dCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXNFcnJvcikgewotICAgICAgICAgICAgICAgIHRhc2suaGFuZGxlRXJyb3JGbHVzaChvdXRwdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YXNrLmhhbmRsZUZsdXNoKG91dHB1dCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrLmhhbmRsZUZsdXNoKG91dHB1dCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzODQsMTMgKzEzNzEsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlU29ydGVkVGFyZ2V0cyhmaW5hbCBWZWN0b3I8VGFyZ2V0PiBzb3J0ZWRUYXJnZXRzKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzdWNjZWVkZWRUYXJnZXRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzdWNjZWVkZWRUYXJnZXRzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBCdWlsZEV4Y2VwdGlvbiBidWlsZEV4Y2VwdGlvbiA9IG51bGw7IC8vIGZpcnN0IGJ1aWxkIGV4Y2VwdGlvbgogICAgICAgICBmb3IgKGZpbmFsIFRhcmdldCBjdXJ0YXJnZXQgOiBzb3J0ZWRUYXJnZXRzKSB7CiAgICAgICAgICAgICBib29sZWFuIGNhbkV4ZWN1dGUgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IGRlcEl0ZXIgPSBjdXJ0YXJnZXQuZ2V0RGVwZW5kZW5jaWVzKCk7Ci0gICAgICAgICAgICAgICAgIGRlcEl0ZXIuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlcGVuZGVuY3lOYW1lID0gZGVwSXRlci5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZGVwZW5kZW5jeU5hbWUgOiBDb2xsZWN0aW9ucy5saXN0KGN1cnRhcmdldC5nZXREZXBlbmRlbmNpZXMoKSkpIHsKICAgICAgICAgICAgICAgICBpZiAoIXN1Y2NlZWRlZFRhcmdldHMuY29udGFpbnMoZGVwZW5kZW5jeU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhbkV4ZWN1dGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgbG9nKGN1cnRhcmdldCwKQEAgLTE0MDYsMTIgKzEzOTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgY3VydGFyZ2V0LnBlcmZvcm1UYXNrcygpOwogICAgICAgICAgICAgICAgICAgICBzdWNjZWVkZWRUYXJnZXRzLmFkZChjdXJ0YXJnZXQuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGtlZXBHb2luZ01vZGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgha2VlcEdvaW5nTW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7IC8vIHRocm93IGZ1cnRoZXIKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0aHJvd25FeGNlcHRpb24gPSBleDsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2VlcEdvaW5nTW9kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFrZWVwR29pbmdNb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbiA9IGV4OwpAQCAtMTc1MCw5ICsxNzM1LDkgQEAKICAgICAgICAgICAgIHJldHVybiAoKFByb2plY3RDb21wb25lbnQpIG8pLmdldFByb2plY3QoKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgTWV0aG9kIG0gPSBvLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXRQcm9qZWN0IiwgKENsYXNzW10pIG51bGwpOwotICAgICAgICAgICAgaWYgKFByb2plY3QuY2xhc3MgPT0gbS5nZXRSZXR1cm5UeXBlKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFByb2plY3QpIG0uaW52b2tlKG8sIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgbSA9IG8uZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImdldFByb2plY3QiKTsKKyAgICAgICAgICAgIGlmIChQcm9qZWN0LmNsYXNzLmVxdWFscyhtLmdldFJldHVyblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFByb2plY3QpIG0uaW52b2tlKG8pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy90b28gYmFkCkBAIC0xODIwLDkgKzE4MDUsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBWZWN0b3I8VGFyZ2V0PiB0b3BvU29ydChmaW5hbCBTdHJpbmdbXSByb290cywgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgVGFyZ2V0PiB0YXJnZXRUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmV0dXJuQWxsKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBWZWN0b3I8VGFyZ2V0PiByZXQgPSBuZXcgVmVjdG9yU2V0PFRhcmdldD4oKTsKLSAgICAgICAgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBzdGF0ZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZpbmFsIFN0YWNrPFN0cmluZz4gdmlzaXRpbmcgPSBuZXcgU3RhY2s8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBWZWN0b3I8VGFyZ2V0PiByZXQgPSBuZXcgVmVjdG9yU2V0PD4oKTsKKyAgICAgICAgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBzdGF0ZSA9IG5ldyBIYXNodGFibGU8PigpOworICAgICAgICBmaW5hbCBTdGFjazxTdHJpbmc+IHZpc2l0aW5nID0gbmV3IFN0YWNrPD4oKTsKIAogICAgICAgICAvLyBXZSBmaXJzdCBydW4gYSBERlMgYmFzZWQgc29ydCB1c2luZyBlYWNoIHJvb3QgYXMgYSBzdGFydGluZyBub2RlLgogICAgICAgICAvLyBUaGlzIGNyZWF0ZXMgdGhlIG1pbmltdW0gc2VxdWVuY2Ugb2YgVGFyZ2V0cyB0byB0aGUgcm9vdCBub2RlKHMpLgpAQCAtMTg0MSwxNyArMTgyNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyByb290KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiQnVpbGQgc2VxdWVuY2UgZm9yIHRhcmdldChzKSIpOworICAgICAgICBsb2coIkJ1aWxkIHNlcXVlbmNlIGZvciB0YXJnZXQocykiCisgICAgICAgICAgICAgICAgKyBBcnJheXMuc3RyZWFtKHJvb3RzKS5tYXAocm9vdCAtPiBTdHJpbmcuZm9ybWF0KCIgYCVzJyIsIHJvb3QpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKQorICAgICAgICAgICAgICAgICsgIiBpcyAiICsgcmV0LCBNU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCByb290cy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgoaiA9PSAwKSA/ICIgYCIgOiAiLCBgIikuYXBwZW5kKHJvb3RzW2pdKS5hcHBlbmQoJ1wnJyk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZCgiIGlzICIpLmFwcGVuZChyZXQpOwotICAgICAgICBsb2coYnVmLnRvU3RyaW5nKCksIE1TR19WRVJCT1NFKTsKLQotICAgICAgICBmaW5hbCBWZWN0b3I8VGFyZ2V0PiBjb21wbGV0ZSA9IChyZXR1cm5BbGwpID8gcmV0IDogbmV3IFZlY3RvcjxUYXJnZXQ+KHJldCk7Ci0gICAgICAgIGZvciAoZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiBlbiA9IHRhcmdldFRhYmxlLmtleXMoKTsgZW4uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY3VyVGFyZ2V0ID0gZW4ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgZmluYWwgVmVjdG9yPFRhcmdldD4gY29tcGxldGUgPSAocmV0dXJuQWxsKSA/IHJldCA6IG5ldyBWZWN0b3I8PihyZXQpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXJUYXJnZXQgOiB0YXJnZXRUYWJsZS5rZXlTZXQoKSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0ID0gc3RhdGUuZ2V0KGN1clRhcmdldCk7CiAgICAgICAgICAgICBpZiAoc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRzb3J0KGN1clRhcmdldCwgdGFyZ2V0VGFibGUsIHN0YXRlLCB2aXNpdGluZywgY29tcGxldGUpOwpAQCAtMTkyOSw4ICsxOTEwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihuZXcgU3RyaW5nKHNiKSk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IGVuID0gdGFyZ2V0LmdldERlcGVuZGVuY2llcygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjdXIgPSBlbi5uZXh0RWxlbWVudCgpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjdXIgOiBDb2xsZWN0aW9ucy5saXN0KHRhcmdldC5nZXREZXBlbmRlbmNpZXMoKSkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtID0gc3RhdGUuZ2V0KGN1cik7CiAgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gTm90IGJlZW4gdmlzaXRlZApAQCAtMTk5NCwxNyArMTk3NCwxOSBAQAogICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoZmluYWwgU3RyaW5nIHJlZmVyZW5jZU5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBmaW5hbCBPYmplY3Qgb2xkID0gKChBbnRSZWZUYWJsZSkgcmVmZXJlbmNlcykuZ2V0UmVhbChyZWZlcmVuY2VOYW1lKTsKLSAgICAgICAgaWYgKG9sZCA9PSB2YWx1ZSkgewotICAgICAgICAgICAgLy8gbm8gd2FybmluZywgdGhpcyBpcyBub3QgY2hhbmdpbmcgYW55dGhpbmcKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzTG9jaykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9sZCA9ICgoQW50UmVmVGFibGUpIHJlZmVyZW5jZXMpLmdldFJlYWwocmVmZXJlbmNlTmFtZSk7CisgICAgICAgICAgICBpZiAob2xkID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gd2FybmluZywgdGhpcyBpcyBub3QgY2hhbmdpbmcgYW55dGhpbmcKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob2xkICE9IG51bGwgJiYgIShvbGQgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIk92ZXJyaWRpbmcgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiByZWZlcmVuY2UgdG8gIiArIHJlZmVyZW5jZU5hbWUsCisgICAgICAgICAgICAgICAgICAgIE1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiQWRkaW5nIHJlZmVyZW5jZTogIiArIHJlZmVyZW5jZU5hbWUsIE1TR19ERUJVRyk7CisgICAgICAgICAgICByZWZlcmVuY2VzLnB1dChyZWZlcmVuY2VOYW1lLCB2YWx1ZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG9sZCAhPSBudWxsICYmICEob2xkIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpKSB7Ci0gICAgICAgICAgICBsb2coIk92ZXJyaWRpbmcgcHJldmlvdXMgZGVmaW5pdGlvbiBvZiByZWZlcmVuY2UgdG8gIiArIHJlZmVyZW5jZU5hbWUsCi0gICAgICAgICAgICAgICAgTVNHX1ZFUkJPU0UpOwotICAgICAgICB9Ci0gICAgICAgIGxvZygiQWRkaW5nIHJlZmVyZW5jZTogIiArIHJlZmVyZW5jZU5hbWUsIE1TR19ERUJVRyk7Ci0gICAgICAgIHJlZmVyZW5jZXMucHV0KHJlZmVyZW5jZU5hbWUsIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMjUsNyArMjAwNyw5IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1JlZmVyZW5jZShmaW5hbCBTdHJpbmcga2V5KSB7Ci0gICAgICAgIHJldHVybiByZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGtleSk7CisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlc0xvY2spIHsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGtleSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTIwMzgsNyArMjAyMiw5IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMQogICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENvcHlPZlJlZmVyZW5jZXMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4ocmVmZXJlbmNlcyk7CisgICAgICAgIHN5bmNocm9uaXplZCAocmVmZXJlbmNlc0xvY2spIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDw+KHJlZmVyZW5jZXMpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDUyLDExICsyMDM4LDE0IEBACiAgICAgICogICAgICAgICB0aGVyZSBpcyBubyBzdWNoIHJlZmVyZW5jZSBpbiB0aGUgcHJvamVjdCwgd2l0aCB0eXBlIGluZmVyZW5jZS4KICAgICAgKi8KICAgICBwdWJsaWMgPFQ+IFQgZ2V0UmVmZXJlbmNlKGZpbmFsIFN0cmluZyBrZXkpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFQgcmV0ID0gKFQpIHJlZmVyZW5jZXMuZ2V0KGtleSk7Ci0gICAgICAgIGlmIChyZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc3luY2hyb25pemVkIChyZWZlcmVuY2VzTG9jaykgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBmaW5hbCBUIHJldCA9IChUKSByZWZlcmVuY2VzLmdldChrZXkpOworICAgICAgICAgICAgaWYgKHJldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIGlmICgha2V5LmVxdWFscyhNYWdpY05hbWVzLlJFRklEX1BST1BFUlRZX0hFTFBFUikpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaWYgKFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHRoaXMpLmNvbnRhaW5zUHJvcGVydGllcyhrZXkpKSB7CkBAIC0yMjM4LDggKzIyMjcsOCBAQAogICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBtZXNzYWdlID0gU3RyaW5nLnZhbHVlT2YobWVzc2FnZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1lc3NhZ2UuZW5kc1dpdGgoU3RyaW5nVXRpbHMuTElORV9TRVApKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZW5kSW5kZXggPSBtZXNzYWdlLmxlbmd0aCgpIC0gU3RyaW5nVXRpbHMuTElORV9TRVAubGVuZ3RoKCk7CisgICAgICAgIGlmIChtZXNzYWdlLmVuZHNXaXRoKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZW5kSW5kZXggPSBtZXNzYWdlLmxlbmd0aCgpIC0gU3lzdGVtLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGgoKTsKICAgICAgICAgICAgIGV2ZW50LnNldE1lc3NhZ2UobWVzc2FnZS5zdWJzdHJpbmcoMCwgZW5kSW5kZXgpLCBwcmlvcml0eSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBldmVudC5zZXRNZXNzYWdlKG1lc3NhZ2UsIHByaW9yaXR5KTsKQEAgLTIyNTQsNyArMjI0Myw3IEBACiAgICAgICAgICAgICAgKiBMb2c0akxpc3RlbmVyIHdoaWNoIGludm9rZXMgZ2V0TG9nZ2VyKCkgd2hpY2ggaW4KICAgICAgICAgICAgICAqIHR1cm4gd2FudHMgdG8gd3JpdGUgdG8gdGhlIGNvbnNvbGUpLgogICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBzZWUgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/dD0xMTA1Mzg2MjQyMDAwMDYmcj0xJnc9MgorICAgICAgICAgICAgICogQHNlZSBodHRwczovL21hcmMuaW5mby8/bD1hbnQtdXNlciZtPTExMTEwNTEyNzIwMDEwMSZ3PTIKICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiBXZSBub3cgKEFudCAxLjYuMyBhbmQgbGF0ZXIpIHNpbXBseSBzd2FsbG93IHRoZSBtZXNzYWdlLgogICAgICAgICAgICAgICovCkBAIC0yNDgxLDYgKzI0NzAsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbGUgcmVzb3VyY2UuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoZmluYWwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UoZ2V0QmFzZURpcigpLCBuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Q29tcG9uZW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0Q29tcG9uZW50LmphdmEKaW5kZXggODMwYzlkNi4uOGI1ZjVhNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RDb21wb25lbnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE2Myw2ICsxNjMsNyBAQAogICAgICAqIEB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZG9lcyBub3QgaGFwcGVuLAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGlzIGRlY2xhcmVkIHRvIGFsbG93IHN1YmNsYXNzZXMgdG8gZG8gc28uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb2plY3RDb21wb25lbnQgcGMgPSAoUHJvamVjdENvbXBvbmVudCkgc3VwZXIuY2xvbmUoKTsKICAgICAgICAgcGMuc2V0TG9jYXRpb24oZ2V0TG9jYXRpb24oKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyLmphdmEKaW5kZXggOTA3NDMwYS4uYTg0MDM4YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdEhlbHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RIZWxwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM4LDcgKzM4LDcgQEAKICAqLwogcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgewogICAgIC8qKiBUaGUgVVJJIGZvciBhbnQgbmFtZSBzcGFjZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9DT1JFX1VSSSAgICA9ICJhbnRsaWI6b3JnLmFwYWNoZS50b29scy5hbnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9DT1JFX1VSSSA9IE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWCArICJvcmcuYXBhY2hlLnRvb2xzLmFudCI7CiAKICAgICAvKiogVGhlIFVSSSBmb3IgYW50bGliIGN1cnJlbnQgZGVmaW5pdGlvbnMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfQ1VSUkVOVF9VUkkgICAgICA9ICJhbnQ6Y3VycmVudCI7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX0FUVFJJQlVURV9VUkkgICAgICA9ICJhbnQ6YXR0cmlidXRlIjsKIAogICAgIC8qKiBUaGUgVVJJIGZvciBkZWZpbmVkIHR5cGVzL3Rhc2tzIC0gdGhlIGZvcm1hdCBpcyBhbnRsaWI6Jmx0O3BhY2thZ2UmZ3Q7ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UTElCX1VSSSAgICAgPSAiYW50bGliOiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UTElCX1VSSSA9IE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWDsKIAogICAgIC8qKiBQb2x5bW9ycGhpYyBhdHRyaWJ1dGUgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5UX1RZUEUgPSAiYW50LXR5cGUiOwpAQCAtMTQ2LDE2ICsxNDYsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIFByb2plY3RIZWxwZXIoKSB7Ci0gICAgfQotCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29tbW9uIHByb3BlcnRpZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgLy8gVGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZCBieSBpbXBvcnQgKGFuZCBvdGhlciB0YXNrcwogICAgIC8vIHRoYXQgcmVhZCBidWlsZCBmaWxlcyB1c2luZyBQcm9qZWN0SGVscGVyKS4KIAotICAgIHByaXZhdGUgVmVjdG9yPE9iamVjdD4gaW1wb3J0U3RhY2sgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nW10+IGV4dGVuc2lvblN0YWNrID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nW10+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8T2JqZWN0PiBpbXBvcnRTdGFjayA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmdbXT4gZXh0ZW5zaW9uU3RhY2sgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiAgSW1wb3J0IHN0YWNrLgpAQCAtMTgxLDcgKzE3Nyw3IEBACiAgICAgICAgIHJldHVybiBleHRlbnNpb25TdGFjazsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxTdHJpbmc+IHRhcmdldFByZWZpeCA9IG5ldyBUaHJlYWRMb2NhbDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8U3RyaW5nPiB0YXJnZXRQcmVmaXggPSBuZXcgVGhyZWFkTG9jYWw8PigpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHByZWZpeCB0byBwcmVwZW5kIHRvIGltcG9ydGVkIHRhcmdldCBuYW1lcy4KQEAgLTIwNiwxMSArMjAyLDcgQEAKICAgICAgICAgdGFyZ2V0UHJlZml4LnNldChwcmVmaXgpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPFN0cmluZz4gcHJlZml4U2VwYXJhdG9yID0gbmV3IFRocmVhZExvY2FsPFN0cmluZz4oKSB7Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIi4iOwotICAgICAgICAgICAgfQotICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPFN0cmluZz4gcHJlZml4U2VwYXJhdG9yID0gVGhyZWFkTG9jYWwud2l0aEluaXRpYWwoKCkgLT4gIi4iKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgcHJlZml4IGFuZCB0aGUgdGFyZ2V0IG5hbWUuCkBAIC0yMzQsMTEgKzIyNiw3IEBACiAgICAgICAgIHByZWZpeFNlcGFyYXRvci5zZXQoc2VwKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxCb29sZWFuPiBpbkluY2x1ZGVNb2RlID0gbmV3IFRocmVhZExvY2FsPEJvb2xlYW4+KCkgewotICAgICAgICAgICAgcHJvdGVjdGVkIEJvb2xlYW4gaW5pdGlhbFZhbHVlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPEJvb2xlYW4+IGluSW5jbHVkZU1vZGUgPSBUaHJlYWRMb2NhbC53aXRoSW5pdGlhbCgoKSAtPiBCb29sZWFuLkZBTFNFKTsKIAogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgZmlsZSBzaG91bGQgYmUgcmVhZCBpbiBpbmNsdWRlIGFzIG9wcG9zZWQKQEAgLTI2OCw3ICsyNTYsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5JbmNsdWRlTW9kZShib29sZWFuIGluY2x1ZGVNb2RlKSB7Ci0gICAgICAgIGluSW5jbHVkZU1vZGUuc2V0KEJvb2xlYW4udmFsdWVPZihpbmNsdWRlTW9kZSkpOworICAgICAgICBpbkluY2x1ZGVNb2RlLnNldChpbmNsdWRlTW9kZSk7CiAgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFBhcnNlIG1ldGhvZCAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI5Nyw3ICsyODUsNyBAQAogICAgICAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlclJlcG9zaXRvcnkjZ2V0SGVscGVycygpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBQcm9qZWN0SGVscGVyIGdldFByb2plY3RIZWxwZXIoKSB7Ci0gICAgICAgIHJldHVybiAoUHJvamVjdEhlbHBlcikgUHJvamVjdEhlbHBlclJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5nZXRIZWxwZXJzKCkubmV4dCgpOworICAgICAgICByZXR1cm4gUHJvamVjdEhlbHBlclJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKS5nZXRIZWxwZXJzKCkubmV4dCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTA2LDcgKzQ5NCw3IEBACiAgICAgICogQHJldHVybiAgICAgIFRoZSBzdHJpbmdpZmllZCBmb3JtIG9mIHRoZSBucyBuYW1lCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuQ29tcG9uZW50TmFtZShTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAodXJpID09IG51bGwgfHwgdXJpLmVxdWFscygiIikgfHwgdXJpLmVxdWFscyhBTlRfQ09SRV9VUkkpKSB7CisgICAgICAgIGlmICh1cmkgPT0gbnVsbCB8fCB1cmkuaXNFbXB0eSgpIHx8IHVyaS5lcXVhbHMoQU5UX0NPUkVfVVJJKSkgewogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHVyaSArICI6IiArIG5hbWU7CkBAIC01NjgsMTAgKzU1Niw4IEBACiAgICAgICAgICAgICByZXR1cm4gZXg7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZQotICAgICAgICAgICAgPSAiVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiIKLSAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpCi0gICAgICAgICAgICArIGV4LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgKyBleC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICA9IFN0cmluZy5mb3JtYXQoIlRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgbGluZTolbiVzJXMiLAorICAgICAgICAgICAgICAgIGV4LmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgZXguZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgRXhpdFN0YXR1c0V4Y2VwdGlvbikgewogICAgICAgICAgICAgaW50IGV4aXRTdGF0dXMgPSAoKEV4aXRTdGF0dXNFeGNlcHRpb24pIGV4KS5nZXRTdGF0dXMoKTsKICAgICAgICAgICAgIGlmIChuZXdMb2NhdGlvbiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdEhlbHBlclJlcG9zaXRvcnkuamF2YQppbmRleCBkZjVkMWEwLi5lODc4MTczIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RIZWxwZXJSZXBvc2l0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxNCArMjMsMTcgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5Qcm9qZWN0SGVscGVyMjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxvYWRlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogUmVwb3NpdG9yeSBvZiB7QGxpbmsgUHJvamVjdEhlbHBlcn0gZm91bmQgaW4gdGhlIGNsYXNzcGF0aCBvciB2aWEKQEAgLTUzLDcgKzU2LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeSBpbnN0YW5jZSA9CiAgICAgICAgIG5ldyBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeSgpOwogCi0gICAgcHJpdmF0ZSBMaXN0PENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBQcm9qZWN0SGVscGVyPj4gaGVscGVycyA9IG5ldyBBcnJheUxpc3Q8Q29uc3RydWN0b3I8PyBleHRlbmRzIFByb2plY3RIZWxwZXI+PigpOworICAgIHByaXZhdGUgTGlzdDxDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgUHJvamVjdEhlbHBlcj4+IGhlbHBlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHByaXZhdGUgc3RhdGljIENvbnN0cnVjdG9yPFByb2plY3RIZWxwZXIyPiBQUk9KRUNUSEVMUEVSMl9DT05TVFJVQ1RPUjsKIApAQCAtNzYsMzEgKzc5LDI0IEBACiAKICAgICBwcml2YXRlIHZvaWQgY29sbGVjdFByb2plY3RIZWxwZXJzKCkgewogICAgICAgICAvLyBGaXJzdCwgdHJ5IHRoZSBzeXN0ZW0gcHJvcGVydHkKLSAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIFByb2plY3RIZWxwZXI+IHByb2plY3RIZWxwZXIgPSBnZXRQcm9qZWN0SGVscGVyQnlTeXN0ZW1Qcm9wZXJ0eSgpOwotICAgICAgICByZWdpc3RlclByb2plY3RIZWxwZXIocHJvamVjdEhlbHBlcik7CisgICAgICAgIHJlZ2lzdGVyUHJvamVjdEhlbHBlcihnZXRQcm9qZWN0SGVscGVyQnlTeXN0ZW1Qcm9wZXJ0eSgpKTsKIAogICAgICAgICAvLyBBIEpESzEuMyAnc2VydmljZScgKGxpa2UgaW4gSkFYUCkuIFRoYXQgd2lsbCBwbHVnIGEgaGVscGVyCiAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgaWYgaW4gQ0xBU1NQQVRILCB3aXRoIHRoZSByaWdodCBNRVRBLUlORi9zZXJ2aWNlcy4KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gTG9hZGVyVXRpbHMuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CiAgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VzKFByb2plY3RIZWxwZXIuU0VSVklDRV9JRCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBVUkwgcmVzb3VyY2UgPSByZXNvdXJjZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFVSTCByZXNvdXJjZSA6IENvbGxlY3Rpb25zLmxpc3QoY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VzKFByb2plY3RIZWxwZXIuU0VSVklDRV9JRCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHJlc291cmNlLm9wZW5Db25uZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdEhlbHBlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0SGVscGVyQnlTZXJ2aWNlKGNvbm4uZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvamVjdEhlbHBlcihwcm9qZWN0SGVscGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJQcm9qZWN0SGVscGVyKGdldFByb2plY3RIZWxwZXJCeVNlcnZpY2UoY29ubi5nZXRJbnB1dFN0cmVhbSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzeXN0ZW1SZXNvdXJjZSA9CiAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShQcm9qZWN0SGVscGVyLlNFUlZJQ0VfSUQpOwogICAgICAgICAgICAgaWYgKHN5c3RlbVJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0SGVscGVyID0gZ2V0UHJvamVjdEhlbHBlckJ5U2VydmljZShzeXN0ZW1SZXNvdXJjZSk7Ci0gICAgICAgICAgICAgICAgcmVnaXN0ZXJQcm9qZWN0SGVscGVyKHByb2plY3RIZWxwZXIpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyUHJvamVjdEhlbHBlcihnZXRQcm9qZWN0SGVscGVyQnlTZXJ2aWNlKHN5c3RlbVJlc291cmNlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVuYWJsZSB0byBsb2FkIFByb2plY3RIZWxwZXIgZnJvbSBzZXJ2aWNlICIKQEAgLTE4NSwxOCArMTgxLDEyIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgaXMgbmVlZGVkIGJ5IEVCQ0RJQyBhbmQgb3RoZXIgc3RyYW5nZSBzeXN0ZW1zLgogICAgICAgICAgICAgLy8gSXQncyBhIGZpeCBmb3IgYnVncyByZXBvcnRlZCBpbiB4ZXJjZXMKLSAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0KKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJkID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywKKyAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgICAgICAgU3RyaW5nIGhlbHBlckNsYXNzTmFtZSA9IHJkLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICByZC5jbG9zZSgpOwogCi0gICAgICAgICAgICBpZiAoaGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgISIiLmVxdWFscyhoZWxwZXJDbGFzc05hbWUpKSB7CisgICAgICAgICAgICBpZiAoaGVscGVyQ2xhc3NOYW1lICE9IG51bGwgJiYgIWhlbHBlckNsYXNzTmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SGVscGVyQ29uc3RydWN0b3IoaGVscGVyQ2xhc3NOYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTI1MiwyMCArMjQyLDE5IEBACiAgICAgICogQHJldHVybiB0aGUgZmlyc3QgUHJvamVjdEhlbHBlciB0aGF0IGZpdCB0aGUgcmVxdWlyZW1lbnQgKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KS4KICAgICAgKi8KICAgICBwdWJsaWMgUHJvamVjdEhlbHBlciBnZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKFJlc291cmNlIGJ1aWxkRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxQcm9qZWN0SGVscGVyPiBpdCA9IGdldEhlbHBlcnMoKTsgaXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgUHJvamVjdEhlbHBlciBoZWxwZXIgPSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoaGVscGVyLmNhblBhcnNlQnVpbGRGaWxlKGJ1aWxkRmlsZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0SGVscGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVscGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsZWN0ZWQgZm9yIHRoZSBidWlsZCBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVpbGRGaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgUHJvamVjdEhlbHBlciBwaCA9IFN0cmVhbVV0aWxzLml0ZXJhdG9yQXNTdHJlYW0oZ2V0SGVscGVycygpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoaGVscGVyIC0+IGhlbHBlci5jYW5QYXJzZUJ1aWxkRmlsZShidWlsZEZpbGUpKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisKKyAgICAgICAgaWYgKHBoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQlVHOiBhdCBsZWFzdCB0aGUgUHJvamVjdEhlbHBlcjIgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGF2ZSBzdXBwb3J0ZWQgdGhlIGZpbGUgIiArIGJ1aWxkRmlsZSk7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCVUc6IGF0IGxlYXN0IHRoZSBQcm9qZWN0SGVscGVyMiBzaG91bGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJoYXZlIHN1cHBvcnRlZCB0aGUgZmlsZSAiICsgYnVpbGRGaWxlKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3RIZWxwZXIgIiArIHBoLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBzZWxlY3RlZCBmb3IgdGhlIGJ1aWxkIGZpbGUgIiArIGJ1aWxkRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBoOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc2LDIwICsyNjUsMTkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBQcm9qZWN0SGVscGVyIHRoYXQgZml0IHRoZSByZXF1aXJlbWVudCAobmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4pLgogICAgICAqLwogICAgIHB1YmxpYyBQcm9qZWN0SGVscGVyIGdldFByb2plY3RIZWxwZXJGb3JBbnRsaWIoUmVzb3VyY2UgYW50bGliKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yPFByb2plY3RIZWxwZXI+IGl0ID0gZ2V0SGVscGVycygpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBQcm9qZWN0SGVscGVyIGhlbHBlciA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGlmIChoZWxwZXIuY2FuUGFyc2VBbnRsaWJEZXNjcmlwdG9yKGFudGxpYikpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0SGVscGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaGVscGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc2VsZWN0ZWQgZm9yIHRoZSBhbnRsaWIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhbnRsaWIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVyOwotICAgICAgICAgICAgfQorICAgICAgICBQcm9qZWN0SGVscGVyIHBoID0gU3RyZWFtVXRpbHMuaXRlcmF0b3JBc1N0cmVhbShnZXRIZWxwZXJzKCkpCisgICAgICAgICAgICAgICAgLmZpbHRlcihoZWxwZXIgLT4gaGVscGVyLmNhblBhcnNlQW50bGliRGVzY3JpcHRvcihhbnRsaWIpKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CisKKyAgICAgICAgaWYgKHBoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQlVHOiBhdCBsZWFzdCB0aGUgUHJvamVjdEhlbHBlcjIgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGF2ZSBzdXBwb3J0ZWQgdGhlIGZpbGUgIiArIGFudGxpYik7CiAgICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCVUc6IGF0IGxlYXN0IHRoZSBQcm9qZWN0SGVscGVyMiBzaG91bGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJoYXZlIHN1cHBvcnRlZCB0aGUgZmlsZSAiICsgYW50bGliKTsKKyAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3RIZWxwZXIgIiArIHBoLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBzZWxlY3RlZCBmb3IgdGhlIGFudGxpYiAiICsgYW50bGliKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGg7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMDAsNDAgKzI4OCwxNSBAQAogICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb2Yge0BsaW5rIFByb2plY3RIZWxwZXJ9CiAgICAgICovCiAgICAgcHVibGljIEl0ZXJhdG9yPFByb2plY3RIZWxwZXI+IGdldEhlbHBlcnMoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29uc3RydWN0aW5nSXRlcmF0b3IoaGVscGVycy5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25zdHJ1Y3RpbmdJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFByb2plY3RIZWxwZXI+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgUHJvamVjdEhlbHBlcj4+IG5lc3RlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVtcHR5ID0gZmFsc2U7Ci0KLSAgICAgICAgQ29uc3RydWN0aW5nSXRlcmF0b3IoSXRlcmF0b3I8Q29uc3RydWN0b3I8PyBleHRlbmRzIFByb2plY3RIZWxwZXI+PiBuZXN0ZWQpIHsKLSAgICAgICAgICAgIHRoaXMubmVzdGVkID0gbmVzdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXN0ZWQuaGFzTmV4dCgpIHx8ICFlbXB0eTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQcm9qZWN0SGVscGVyIG5leHQoKSB7Ci0gICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgUHJvamVjdEhlbHBlcj4gYzsKLSAgICAgICAgICAgIGlmIChuZXN0ZWQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgYyA9IG5lc3RlZC5uZXh0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGxhc3QgYnV0IG5vdCBsZWFzdCwgYW50IGRlZmF1bHQgcHJvamVjdCBoZWxwZXIKLSAgICAgICAgICAgICAgICBlbXB0eSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYyA9IFBST0pFQ1RIRUxQRVIyX0NPTlNUUlVDVE9SOwotICAgICAgICAgICAgfQorICAgICAgICBTdHJlYW0uQnVpbGRlcjxDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgUHJvamVjdEhlbHBlcj4+IGIgPSBTdHJlYW0uYnVpbGRlcigpOworICAgICAgICBoZWxwZXJzLmZvckVhY2goYjo6YWRkKTsKKyAgICAgICAgcmV0dXJuIGIuYWRkKFBST0pFQ1RIRUxQRVIyX0NPTlNUUlVDVE9SKS5idWlsZCgpLm1hcChjIC0+IHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGMubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW52b2tlIG5vLWFyZyBjb25zdHJ1Y3RvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9uICIgKyBjLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArICIgb24gIiArIGMuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigicmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICAgICAgfQorICAgICAgICB9KS5tYXAoUHJvamVjdEhlbHBlci5jbGFzczo6Y2FzdCkuaXRlcmF0b3IoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUhlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlIZWxwZXIuamF2YQppbmRleCBhNDQ3ZWY3Li45NGEwMzFmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUhlbHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb3BlcnR5SGVscGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNywyMCArMTcsMTggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAotaW1wb3J0IGphdmEudGV4dC5QYXJzZVBvc2l0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuR2V0UHJvcGVydHk7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuTnVsbFJldHVybjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5QYXJzZU5leHRQcm9wZXJ0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5wcm9wZXJ0eS5QYXJzZVByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHkuUHJvcGVydHlFeHBhbmRlcjsKIApAQCAtMTg0LDUyICsxODIsNDEgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUV4cGFuZGVyIERFRkFVTFRfRVhQQU5ERVIgPSBuZXcgUHJvcGVydHlFeHBhbmRlcigpIHsKLSAgICAgICAgcHVibGljIFN0cmluZyBwYXJzZVByb3BlcnR5TmFtZSgKLSAgICAgICAgICAgIFN0cmluZyBzLCBQYXJzZVBvc2l0aW9uIHBvcywgUGFyc2VOZXh0UHJvcGVydHkgbm90VXNlZCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5RXhwYW5kZXIgREVGQVVMVF9FWFBBTkRFUiA9CisgICAgICAgIChzLCBwb3MsIG5vdFVzZWQpIC0+IHsKICAgICAgICAgICAgIGludCBpbmRleCA9IHBvcy5nZXRJbmRleCgpOwogICAgICAgICAgICAgLy9kaXJlY3RseSBjaGVjayBuZWFyLCB0cmlnZ2VyaW5nIGNoYXJhY3RlcnM6Ci0gICAgICAgICAgICBpZiAocy5sZW5ndGgoKSAtIGluZGV4ID49IDMKLSAgICAgICAgICAgICAgICAgICAgJiYgJyQnID09IHMuY2hhckF0KGluZGV4KSAmJiAneycgPT0gcy5jaGFyQXQoaW5kZXggKyAxKSkgeworICAgICAgICAgICAgaWYgKHMubGVuZ3RoKCkgLSBpbmRleCA+PSAzICYmICckJyA9PSBzLmNoYXJBdChpbmRleCkKKyAgICAgICAgICAgICAgICAmJiAneycgPT0gcy5jaGFyQXQoaW5kZXggKyAxKSkgewogICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGluZGV4ICsgMjsKICAgICAgICAgICAgICAgICAvL2RlZmVyIHRvIFN0cmluZy5pbmRleE9mKCkgZm9yIHByb3RyYWN0ZWQgY2hlY2s6CiAgICAgICAgICAgICAgICAgaW50IGVuZCA9IHMuaW5kZXhPZignfScsIHN0YXJ0KTsKICAgICAgICAgICAgICAgICBpZiAoZW5kIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlN5bnRheCBlcnJvciBpbiBwcm9wZXJ0eTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy5zdWJzdHJpbmcoaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvciBpbiBwcm9wZXJ0eTogIiArIHMuc3Vic3RyaW5nKGluZGV4KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBvcy5zZXRJbmRleChlbmQgKyAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgPT0gZW5kID8gIiIgOiAgcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ID09IGVuZCA/ICIiIDogcy5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH07CisgICAgICAgIH07CiAKICAgICAvKiogZHVtbXkgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eUV4cGFuZGVyIFNLSVBfRE9VQkxFX0RPTExBUgotICAgICAgICA9IG5ldyBQcm9wZXJ0eUV4cGFuZGVyKCkgewotICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpMaW5lTGVuZ3RoQ2hlY2sgT0ZGIHNlZSB0b28gbG9uZwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LlByb3BlcnR5RXhwYW5kZXIjcGFyc2VQcm9wZXJ0eU5hbWUoamF2YS5sYW5nLlN0cmluZywgamF2YS50ZXh0LlBhcnNlUG9zaXRpb24sIG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LlBhcnNlTmV4dFByb3BlcnR5KQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGhDaGVjayBPTgotICAgICAgICAgICAgcHVibGljIFN0cmluZyBwYXJzZVByb3BlcnR5TmFtZSgKLSAgICAgICAgICAgICAgICBTdHJpbmcgcywgUGFyc2VQb3NpdGlvbiBwb3MsIFBhcnNlTmV4dFByb3BlcnR5IG5vdFVzZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBwb3MuZ2V0SW5kZXgoKTsKLSAgICAgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSAtIGluZGV4ID49IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgZm9yICQkOyBpZiBmb3VuZCwgYWR2YW5jZSBieSBvbmUtLQotICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGV4cGFuZGVyIGlzIGF0IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrCi0gICAgICAgICAgICAgICAgICAgICAqIGFuZCB3aWxsIHRodXMgYmUgdGhlIGxhc3QgY29uc3VsdGVkLAotICAgICAgICAgICAgICAgICAgICAgKiBzbyB0aGUgbmV4dCB0aGluZyB0aGF0IFBhcnNlUHJvcGVydGllcyB3aWxsIGRvCi0gICAgICAgICAgICAgICAgICAgICAqIGlzIGFkdmFuY2UgdGhlIHBhcnNlIHBvc2l0aW9uIGJleW9uZCB0aGUgc2Vjb25kICQKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgnJCcgPT0gcy5jaGFyQXQoaW5kZXgpICYmICckJyA9PSBzLmNoYXJBdCgrK2luZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9zLnNldEluZGV4KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5RXhwYW5kZXIgU0tJUF9ET1VCTEVfRE9MTEFSID0KKyAgICAgICAgKHMsIHBvcywgbm90VXNlZCkgLT4geworICAgICAgICAgICAgaW50IGluZGV4ID0gcG9zLmdldEluZGV4KCk7CisgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSAtIGluZGV4ID49IDIpIHsKKyAgICAgICAgICAgICAgICAvKiBjaGVjayBmb3IgJCQ7IGlmIGZvdW5kLCBhZHZhbmNlIGJ5IG9uZS0tCisgICAgICAgICAgICAgICAgICogdGhpcyBleHBhbmRlciBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaworICAgICAgICAgICAgICAgICAqIGFuZCB3aWxsIHRodXMgYmUgdGhlIGxhc3QgY29uc3VsdGVkLAorICAgICAgICAgICAgICAgICAqIHNvIHRoZSBuZXh0IHRoaW5nIHRoYXQgUGFyc2VQcm9wZXJ0aWVzIHdpbGwgZG8KKyAgICAgICAgICAgICAgICAgKiBpcyBhZHZhbmNlIHRoZSBwYXJzZSBwb3NpdGlvbiBiZXlvbmQgdGhlIHNlY29uZCAkCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCckJyA9PSBzLmNoYXJBdChpbmRleCkgJiYgJyQnID09IHMuY2hhckF0KCsraW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvcy5zZXRJbmRleChpbmRleCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH07CiAKICAgICAvKioKQEAgLTI0OCwyNCArMjM1LDI0IEBACiAKICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKICAgICBwcml2YXRlIFByb3BlcnR5SGVscGVyIG5leHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8Q2xhc3M8PyBleHRlbmRzIERlbGVnYXRlPiwgTGlzdDxEZWxlZ2F0ZT4+IGRlbGVnYXRlcyA9IG5ldyBIYXNodGFibGU8Q2xhc3M8PyBleHRlbmRzIERlbGVnYXRlPiwgTGlzdDxEZWxlZ2F0ZT4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8Q2xhc3M8PyBleHRlbmRzIERlbGVnYXRlPiwgTGlzdDxEZWxlZ2F0ZT4+IGRlbGVnYXRlcyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqIFByb2plY3QgcHJvcGVydGllcyBtYXAgKHVzdWFsbHkgU3RyaW5nIHRvIFN0cmluZykuICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBNYXAgb2YgInVzZXIiIHByb3BlcnRpZXMgKGFzIGNyZWF0ZWQgaW4gdGhlIEFudCB0YXNrLCBmb3IgZXhhbXBsZSkuCiAgICAgICogTm90ZSB0aGF0IHRoZXNlIGtleS92YWx1ZSBwYWlycyBhcmUgYWxzbyBhbHdheXMgcHV0IGludG8gdGhlCiAgICAgICogcHJvamVjdCBwcm9wZXJ0aWVzLCBzbyBvbmx5IHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgbmVlZCB0byBiZSBxdWVyaWVkLgogICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiB1c2VyUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHVzZXJQcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBNYXAgb2YgaW5oZXJpdGVkICJ1c2VyIiBwcm9wZXJ0aWVzIC0gdGhhdCBhcmUgdGhvc2UgInVzZXIiCiAgICAgICogcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRhc2tzIGFuZCBub3QgYmVlbiBzZXQKICAgICAgKiBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3IgYSBHVUkgdG9vbC4KICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gaW5oZXJpdGVkUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGluaGVyaXRlZFByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKgogICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCkBAIC0zOTQsOCArMzgxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBQcm9wZXJ0eUhlbHBlciBnZXRQcm9wZXJ0eUhlbHBlcihQcm9qZWN0IHByb2plY3QpIHsKICAgICAgICAgUHJvcGVydHlIZWxwZXIgaGVscGVyID0gbnVsbDsKICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaGVscGVyID0gKFByb3BlcnR5SGVscGVyKSBwcm9qZWN0LmdldFJlZmVyZW5jZShNYWdpY05hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5SRUZJRF9QUk9QRVJUWV9IRUxQRVIpOworICAgICAgICAgICAgaGVscGVyID0gcHJvamVjdC5nZXRSZWZlcmVuY2UoTWFnaWNOYW1lcy5SRUZJRF9QUk9QRVJUWV9IRUxQRVIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChoZWxwZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGhlbHBlcjsKQEAgLTQ1MywxMSArNDM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmhlcml0ZWQsIGJvb2xlYW4gdXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc05ldykgewogICAgICAgICBpZiAoZ2V0TmV4dCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc3Vic3QgPSBnZXROZXh0KCkuc2V0UHJvcGVydHlIb29rKG5zLCBuYW1lLCB2YWx1ZSwgaW5oZXJpdGVkLCB1c2VyLCBpc05ldyk7CiAgICAgICAgICAgICAvLyBJZiBuZXh0IGhhcyBoYW5kbGVkIHRoZSBwcm9wZXJ0eQotICAgICAgICAgICAgaWYgKHN1YnN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZ2V0TmV4dCgpLnNldFByb3BlcnR5SG9vayhucywgbmFtZSwgdmFsdWUsIGluaGVyaXRlZCwgdXNlciwgaXNOZXcpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC05MTEsNyArODk0LDcgQEAKICAgICBwdWJsaWMgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgewogICAgICAgICAvL2F2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uOgogICAgICAgICBzeW5jaHJvbml6ZWQgKHByb3BlcnRpZXMpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0Pihwcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaHRhYmxlPD4ocHJvcGVydGllcyk7CiAgICAgICAgIH0KICAgICAgICAgLy8gVGhlcmUgaXMgYSBiZXR0ZXIgd2F5IHRvIHNhdmUgdGhlIGNvbnRleHQuIFRoaXMgc2hvdWxkbid0CiAgICAgICAgIC8vIGRlbGVnYXRlIHRvIG5leHQsIGl0J3MgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4KQEAgLTkyOCw3ICs5MTEsNyBAQAogICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldFVzZXJQcm9wZXJ0aWVzKCkgewogICAgICAgICAvL2F2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uOgogICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4odXNlclByb3BlcnRpZXMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGU8Pih1c2VyUHJvcGVydGllcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0Myw3ICs5MjYsNyBAQAogICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IGdldEluaGVyaXRlZFByb3BlcnRpZXMoKSB7CiAgICAgICAgIC8vYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb246CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW5oZXJpdGVkUHJvcGVydGllcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KGluaGVyaXRlZFByb3BlcnRpZXMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNodGFibGU8Pihpbmhlcml0ZWRQcm9wZXJ0aWVzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTkxLDE0ICs5NzQsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBjb3B5SW5oZXJpdGVkUHJvcGVydGllcyhQcm9qZWN0IG90aGVyKSB7CiAgICAgICAgIC8vYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb246CiAgICAgICAgIHN5bmNocm9uaXplZCAoaW5oZXJpdGVkUHJvcGVydGllcykgewotICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gaW5oZXJpdGVkUHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSBlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXIuZ2V0VXNlclByb3BlcnR5KGFyZykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGluaGVyaXRlZFByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBhcmcgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBpZiAob3RoZXIuZ2V0VXNlclByb3BlcnR5KGFyZykgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdGhlci5zZXRJbmhlcml0ZWRQcm9wZXJ0eShhcmcsIGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGluaGVyaXRlZFByb3BlcnRpZXMuZ2V0KGFyZyk7Ci0gICAgICAgICAgICAgICAgb3RoZXIuc2V0SW5oZXJpdGVkUHJvcGVydHkoYXJnLCB2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEwMjEsMTQgKzEwMDEsMTEgQEAKICAgICBwdWJsaWMgdm9pZCBjb3B5VXNlclByb3BlcnRpZXMoUHJvamVjdCBvdGhlcikgewogICAgICAgICAvL2F2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uOgogICAgICAgICBzeW5jaHJvbml6ZWQgKHVzZXJQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSB1c2VyUHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBhcmcgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGluaGVyaXRlZFByb3BlcnRpZXMuY29udGFpbnNLZXkoYXJnKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IHVzZXJQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYXJnID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgaWYgKCFpbmhlcml0ZWRQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGFyZykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIuc2V0VXNlclByb3BlcnR5KGFyZywgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdXNlclByb3BlcnRpZXMuZ2V0KGFyZyk7Ci0gICAgICAgICAgICAgICAgb3RoZXIuc2V0VXNlclByb3BlcnR5KGFyZy50b1N0cmluZygpLCB2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEwNDcsNyArMTAyNCw3IEBACiAgICAgICAgIGludCBwcmV2ID0gMDsKICAgICAgICAgaW50IHBvczsKICAgICAgICAgLy9zZWFyY2ggZm9yIHRoZSBuZXh0IGluc3RhbmNlIG9mICQgZnJvbSB0aGUgJ3ByZXYnIHBvc2l0aW9uCi0gICAgICAgIHdoaWxlICgocG9zID0gdmFsdWUuaW5kZXhPZigiJCIsIHByZXYpKSA+PSAwKSB7CisgICAgICAgIHdoaWxlICgocG9zID0gdmFsdWUuaW5kZXhPZignJCcsIHByZXYpKSA+PSAwKSB7CiAKICAgICAgICAgICAgIC8vaWYgdGhlcmUgd2FzIGFueSB0ZXh0IGJlZm9yZSB0aGlzLCBhZGQgaXQgYXMgYSBmcmFnbWVudAogICAgICAgICAgICAgLy9UT0RPLCB0aGlzIGNoZWNrIGNvdWxkIGJlIG1vZGlmaWVkIHRvIGdvIGlmIHBvcz5wcmV2OwpAQCAtMTEwNywxMCArMTA4NCwxMCBAQAogICAgICAgICAgICAgZm9yIChDbGFzczw/IGV4dGVuZHMgRGVsZWdhdGU+IGtleSA6IGdldERlbGVnYXRlSW50ZXJmYWNlcyhkZWxlZ2F0ZSkpIHsKICAgICAgICAgICAgICAgICBMaXN0PERlbGVnYXRlPiBsaXN0ID0gZGVsZWdhdGVzLmdldChrZXkpOwogICAgICAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8RGVsZWdhdGU+KCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvL2NvcHkgb24gd3JpdGUsIHRvcCBwcmlvcml0eQotICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxEZWxlZ2F0ZT4obGlzdCk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4obGlzdCk7CiAgICAgICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGRlbGVnYXRlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbGlzdC5hZGQoMCwgZGVsZWdhdGUpOwpAQCAtMTEzMSw3ICsxMTA4LDcgQEAKICAgICBwcm90ZWN0ZWQgPEQgZXh0ZW5kcyBEZWxlZ2F0ZT4gTGlzdDxEPiBnZXREZWxlZ2F0ZXMoQ2xhc3M8RD4gdHlwZSkgewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgZmluYWwgTGlzdDxEPiByZXN1bHQgPSAoTGlzdDxEPikgZGVsZWdhdGVzLmdldCh0eXBlKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gQ29sbGVjdGlvbnMuPEQ+IGVtcHR5TGlzdCgpIDogcmVzdWx0OworICAgICAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTExNDAsMTYgKzExMTcsMTQgQEAKICAgICAgKiBAcmV0dXJuIFNldCZsdDtDbGFzcyZndDsKICAgICAgKiBAc2luY2UgQW50IDEuOC4wCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBTZXQ8Q2xhc3M8PyBleHRlbmRzIERlbGVnYXRlPj4gZ2V0RGVsZWdhdGVJbnRlcmZhY2VzKERlbGVnYXRlIGQpIHsKLSAgICAgICAgZmluYWwgSGFzaFNldDxDbGFzczw/IGV4dGVuZHMgRGVsZWdhdGU+PiByZXN1bHQgPSBuZXcgSGFzaFNldDxDbGFzczw/IGV4dGVuZHMgRGVsZWdhdGU+PigpOworICAgICAgICBmaW5hbCBIYXNoU2V0PENsYXNzPD8gZXh0ZW5kcyBEZWxlZ2F0ZT4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgQ2xhc3M8Pz4gYyA9IGQuZ2V0Q2xhc3MoKTsKICAgICAgICAgd2hpbGUgKGMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChDbGFzczw/PiBpZmMgOiBjLmdldEludGVyZmFjZXMoKSkgewogICAgICAgICAgICAgICAgIGlmIChEZWxlZ2F0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGlmYykpIHsKLSAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBEZWxlZ2F0ZT4gZGVsZWdhdGVJbnRlcmZhY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDbGFzczw/IGV4dGVuZHMgRGVsZWdhdGU+KSBpZmM7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoZGVsZWdhdGVJbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKChDbGFzczw/IGV4dGVuZHMgRGVsZWdhdGU+KSBpZmMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMgPSBjLmdldFN1cGVyY2xhc3MoKTsKQEAgLTExOTIsNyArMTE2Nyw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBudWxsT3JFbXB0eShPYmplY3QgdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKTsKLQogICAgIH0KIAogICAgIC8qKgpAQCAtMTIwNiw3ICsxMTgwLDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gZXZhbEFzQm9vbGVhbk9yUHJvcGVydHlOYW1lKE9iamVjdCB2YWx1ZSkgewogICAgICAgICBCb29sZWFuIGIgPSB0b0Jvb2xlYW4odmFsdWUpOwogICAgICAgICBpZiAoYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBiOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eShTdHJpbmcudmFsdWVPZih2YWx1ZSkpICE9IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvUnVudGltZUNvbmZpZ3VyYWJsZS5qYXZhCmluZGV4IGViZDZjMTEuLmJmODJmYjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1J1bnRpbWVDb25maWd1cmFibGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9SdW50aW1lQ29uZmlndXJhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCwxMiArMjQsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5hdHRyaWJ1dGUuRW5hYmxlQXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hY3JvRGVmLkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYWNyb0luc3RhbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5BdHRyaWJ1dGVMaXN0SW1wbDsKIApAQCAtNDMsMTYgKzQzLDEyIEBACiAgICAgLyoqIFNlcmlhbGl6YXRpb24gdmVyc2lvbiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0gICAgLyoqIEVtcHR5IEhhc2h0YWJsZS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IEVNUFRZX0hBU0hUQUJMRSA9Ci0gICAgICAgICAgICBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigwKTsKLQogICAgIC8qKiBOYW1lIG9mIHRoZSBlbGVtZW50IHRvIGNvbmZpZ3VyZS4gKi8KICAgICBwcml2YXRlIFN0cmluZyBlbGVtZW50VGFnID0gbnVsbDsKIAogICAgIC8qKiBMaXN0IG9mIGNoaWxkIGVsZW1lbnQgd3JhcHBlcnMuICovCiAgICAgLy8gcGlja2luZyBBcnJheUxpc3QgcmF0aGVyIHRoYW4gTGlzdCBhcyBhcnJheUxpc3QgaXMgU2VyaWFsaXphYmxlCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UnVudGltZUNvbmZpZ3VyYWJsZT4gY2hpbGRyZW4gPSBudWxsOworICAgIHByaXZhdGUgTGlzdDxSdW50aW1lQ29uZmlndXJhYmxlPiBjaGlsZHJlbiA9IG51bGw7CiAKICAgICAvKiogVGhlIGVsZW1lbnQgdG8gY29uZmlndXJlLiBJdCBpcyBvbmx5IHVzZWQgZHVyaW5nCiAgICAgICogbWF5YmVDb25maWd1cmUuCkBAIC0xMTksNiArMTE1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmFibGVBdHRyaWJ1dGVDb25zdW1lciB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRW5hYmxlQXR0cmlidXRlIGIpIHsKICAgICAgICAgICAgIC8vIElnbm9yZQogICAgICAgICB9CkBAIC0xNTQsNyArMTUxLDcgQEAKICAgICAgKiBAcmV0dXJuIEF0dHJpYnV0ZUNvbXBvbmVudEluZm9ybWF0aW9uIGluc3RhbmNlCiAgICAgICovCiAgICAgcHJpdmF0ZSBBdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbiBpc1Jlc3RyaWN0ZWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIENvbXBvbmVudEhlbHBlciBjb21wb25lbnRIZWxwZXIpIHsKLSAgICAgICAgaWYgKG5hbWUuaW5kZXhPZignOicpID09IC0xKSB7CisgICAgICAgIGlmICghbmFtZS5jb250YWlucygiOiIpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEF0dHJpYnV0ZUNvbXBvbmVudEluZm9ybWF0aW9uKG51bGwsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IGF0dHJUb0NvbXBvbmVudChuYW1lKTsKQEAgLTE3Niw2ICsxNzMsNyBAQAogICAgICAqICAgICAgICAgICAgICBmYWxzZS4KICAgICAgKiBAc2luY2UgMS45LjEKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChVbmtub3duRWxlbWVudCBvd25lcikgewogICAgICAgICBpZiAoIW5hbWVzcGFjZWRBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTgzLDE2ICsxODEsMTUgQEAKICAgICAgICAgQ29tcG9uZW50SGVscGVyIGNvbXBvbmVudEhlbHBlciA9IENvbXBvbmVudEhlbHBlcgogICAgICAgICAgICAgLmdldENvbXBvbmVudEhlbHBlcihvd25lci5nZXRQcm9qZWN0KCkpOwogCi0gICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWgKLSAgICAgICAgICAgID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoCi0gICAgICAgICAgICAgICAgb3duZXIuZ2V0UHJvamVjdCgpLCBFbmFibGVBdHRyaWJ1dGVDb25zdW1lci5jbGFzcyk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlTWFwLmtleVNldCgpLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5rZXlTZXQoKS50b0FycmF5KClbaV07Ci0gICAgICAgICAgICBBdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbiBhdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbiA9IGlzUmVzdHJpY3RlZEF0dHJpYnV0ZShuYW1lLCBjb21wb25lbnRIZWxwZXIpOworICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIob3duZXIuZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgIEVuYWJsZUF0dHJpYnV0ZUNvbnN1bWVyLmNsYXNzKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogYXR0cmlidXRlTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZUNvbXBvbmVudEluZm9ybWF0aW9uIGF0dHJpYnV0ZUNvbXBvbmVudEluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgID0gaXNSZXN0cmljdGVkQXR0cmlidXRlKGVudHJ5LmdldEtleSgpLCBjb21wb25lbnRIZWxwZXIpOwogICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbi5pc1Jlc3RyaWN0ZWQoKSkgIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGF0dHJpYnV0ZU1hcC5nZXQobmFtZSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgRW5hYmxlQXR0cmlidXRlIGVuYWJsZSA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGVuYWJsZSA9IChFbmFibGVBdHRyaWJ1dGUpCkBAIC0yODYsNyArMjgzLDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGF0dHJpYnV0ZSdzIHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICBpZiAobmFtZS5pbmRleE9mKCc6JykgIT0gLTEpIHsKKyAgICAgICAgaWYgKG5hbWUuY29udGFpbnMoIjoiKSkgewogICAgICAgICAgICAgbmFtZXNwYWNlZEF0dHJpYnV0ZSA9IHRydWU7CiAgICAgICAgIH0KICAgICAgICAgc2V0QXR0cmlidXRlKG5hbWUsIChPYmplY3QpIHZhbHVlKTsKQEAgLTMwNCwxNyArMzAxLDE3IEBACiAgICAgICAgICAgICB0aGlzLnBvbHlUeXBlID0gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiB2YWx1ZS50b1N0cmluZygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU1hcCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicmVmaWQiKSAmJiAhYXR0cmlidXRlTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld0F0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICAgICAgaWYgKCJyZWZpZCIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSAmJiAhYXR0cmlidXRlTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld0F0dHJpYnV0ZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICBuZXdBdHRyaWJ1dGVNYXAucHV0KG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgICBuZXdBdHRyaWJ1dGVNYXAucHV0QWxsKGF0dHJpYnV0ZU1hcCk7CiAgICAgICAgICAgICAgICAgYXR0cmlidXRlTWFwID0gbmV3QXR0cmlidXRlTWFwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVNYXAucHV0KG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiaWQiKSkgeworICAgICAgICAgICAgaWYgKCJpZCIuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzM1LDggKzMzMiw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gZ2V0QXR0cmlidXRlTWFwKCkgewotICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZU1hcCA9PSBudWxsKQotICAgICAgICAgICAgPyBFTVBUWV9IQVNIVEFCTEUgOiBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PihhdHRyaWJ1dGVNYXApOworICAgICAgICByZXR1cm4gbmV3IEhhc2h0YWJsZTw+KGF0dHJpYnV0ZU1hcCA9PSBudWxsID8gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSA6IGF0dHJpYnV0ZU1hcCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNTgsNyArMzU0LDcgQEAKICAgICAgKiAgICAgICAgICAgICAgTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENoaWxkKFJ1bnRpbWVDb25maWd1cmFibGUgY2hpbGQpIHsKLSAgICAgICAgY2hpbGRyZW4gPSAoY2hpbGRyZW4gPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0PFJ1bnRpbWVDb25maWd1cmFibGU+KCkgOiBjaGlsZHJlbjsKKyAgICAgICAgY2hpbGRyZW4gPSAoY2hpbGRyZW4gPT0gbnVsbCkgPyBuZXcgQXJyYXlMaXN0PD4oKSA6IGNoaWxkcmVuOwogICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwogICAgIH0KIApAQCAtMzgwLDcgKzM3Niw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIEVudW1lcmF0aW9uPFJ1bnRpbWVDb25maWd1cmFibGU+IGdldENoaWxkcmVuKCkgewotICAgICAgICByZXR1cm4gKGNoaWxkcmVuID09IG51bGwpID8gbmV3IENvbGxlY3Rpb25VdGlscy5FbXB0eUVudW1lcmF0aW9uPFJ1bnRpbWVDb25maWd1cmFibGU+KCkKKyAgICAgICAgcmV0dXJuIChjaGlsZHJlbiA9PSBudWxsKSA/IENvbGxlY3Rpb25zLmVtcHR5RW51bWVyYXRpb24oKQogICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihjaGlsZHJlbik7CiAgICAgfQogCkBAIC0zOTEsNyArMzg3LDcgQEAKICAgICAgKiAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVGV4dChTdHJpbmcgZGF0YSkgewotICAgICAgICBpZiAoZGF0YS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChkYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGNoYXJhY3RlcnMgPSAoY2hhcmFjdGVycyA9PSBudWxsKQpAQCAtNTAwLDcgKzQ5Niw3IEBACiAgICAgICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihwLCB0YXJnZXQuZ2V0Q2xhc3MoKSk7CiAgICAgICAgICBDb21wb25lbnRIZWxwZXIgY29tcG9uZW50SGVscGVyID0gQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcihwKTsKICAgICAgICAgaWYgKGF0dHJpYnV0ZU1hcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6IGF0dHJpYnV0ZU1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiBhdHRyaWJ1dGVNYXAuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCByZXN0cmljdGVkIGF0dHJpYnV0ZXMgc3VjaCBhcyBpZjpzZXQKICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbiBhdHRyaWJ1dGVDb21wb25lbnRJbmZvcm1hdGlvbiA9IGlzUmVzdHJpY3RlZEF0dHJpYnV0ZShuYW1lLCBjb21wb25lbnRIZWxwZXIpOwpAQCAtNTEyLDggKzUwOCw4IEBACiAgICAgICAgICAgICAgICAgLy8gTWFjcm9JbnN0YW5jZSB3aGVyZSBwcm9wZXJ0aWVzIGFyZSBleHBhbmRlZCBmb3IgdGhlCiAgICAgICAgICAgICAgICAgLy8gbmVzdGVkIHNlcXVlbnRpYWwKICAgICAgICAgICAgICAgICBPYmplY3QgYXR0clZhbHVlOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV2YWx1YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWUgPSAoKEV2YWx1YWJsZSkgdmFsdWUpLmV2YWwoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFdmFsdWFibGU8Pz4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlID0gKChFdmFsdWFibGU8Pz4pIHZhbHVlKS5ldmFsKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXR0clZhbHVlID0gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIocCkucGFyc2VQcm9wZXJ0aWVzKHZhbHVlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTUzMSwyMyArNTI3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0YXJnZXQsIG5hbWUsIGF0dHJWYWx1ZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRBdHRyaWJ1dGVFeGNlcHRpb24gYmUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaWQgYXR0cmlidXRlIG11c3QgYmUgc2V0IGV4dGVybmFsbHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCJpZCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0RWxlbWVudFRhZygpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGJlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEVsZW1lbnRUYWcoKSArICIgZG9lc24ndCBzdXBwb3J0IHRoZSBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJlLmdldEF0dHJpYnV0ZSgpICsgIlwiIGF0dHJpYnV0ZSIsIGJlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiaWQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEVsZW1lbnRUYWcoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudFRhZygpICsgIiBkb2Vzbid0IHN1cHBvcnQgdGhlIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGJlLmdldEF0dHJpYnV0ZSgpICsgIlwiIGF0dHJpYnV0ZSIsIGJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscygiaWQiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBub3Qgc3VwcG9ydGVkIGF0dHJpYnV0ZSB0eXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd24gZm9yIGV4YW1wbGUgYnkgYSBkeW5hbWljIGF0dHJpYnV0ZSB0YXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghImlkIi5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGJlOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gbm90IHN1cHBvcnRlZCBhdHRyaWJ1dGUgdHlwZQorICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd24gZm9yIGV4YW1wbGUgYnkgYSBkeW5hbWljIGF0dHJpYnV0ZSB0YXNrIC0tCisgICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU5Myw3ICs1ODgsNyBAQAogCiAgICAgICAgIC8vIENoaWxkcmVuICh0aGlzIGlzIGEgc2hhZG93IG9mIFVua25vd25FbGVtZW50I2NoaWxkcmVuKQogICAgICAgICBpZiAoci5jaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8UnVudGltZUNvbmZpZ3VyYWJsZT4gbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFJ1bnRpbWVDb25maWd1cmFibGU+KHIuY2hpbGRyZW4pOworICAgICAgICAgICAgTGlzdDxSdW50aW1lQ29uZmlndXJhYmxlPiBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8PihyLmNoaWxkcmVuKTsKICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbmV3Q2hpbGRyZW4uYWRkQWxsKGNoaWxkcmVuKTsKICAgICAgICAgICAgIH0KQEAgLTYwMyw3ICs1OTgsNyBAQAogICAgICAgICAvLyBUZXh0CiAgICAgICAgIGlmIChyLmNoYXJhY3RlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGNoYXJhY3RlcnMgPT0gbnVsbAotICAgICAgICAgICAgICAgIHx8IGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHx8IGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoci5jaGFyYWN0ZXJzLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9TdWJCdWlsZExpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9TdWJCdWlsZExpc3RlbmVyLmphdmEKaW5kZXggMTk2YTg4Yi4uOWE1ZWM2MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvU3ViQnVpbGRMaXN0ZW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1N1YkJ1aWxkTGlzdGVuZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1RhcmdldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKaW5kZXggMzNiOGI3Mi4uNTM0NzNjYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFyZ2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NSw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVwZW5kZW5jaWVzID0gbnVsbDsKIAogICAgIC8qKiBDaGlsZHJlbiBvZiB0aGlzIHRhcmdldCAodGFza3MgYW5kIGRhdGEgdHlwZXMpLiAqLwotICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKiBTaW5jZSBBbnQgMS42LjIgKi8KICAgICBwcml2YXRlIExvY2F0aW9uIGxvY2F0aW9uID0gTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTjsKQEAgLTE0NSwzNiArMTQ1LDM3IEBACiAgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VEZXBlbmRzKFN0cmluZyBkZXBlbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBpZiAoZGVwZW5kcy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPQotICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVwZW5kcywgIiwiLCB0cnVlKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgaWYgKGRlcGVuZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVwZW5kZW5jeSBpcyBub3QgZW1wdHkgc3RyaW5nCi0gICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0b2tlbikgfHwgIiwiLmVxdWFscyh0b2tlbikpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVwZW5kcywgIiwiLCB0cnVlKTsKKyAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGVwZW5kZW5jeSBpcyBub3QgZW1wdHkgc3RyaW5nCisgICAgICAgICAgICBpZiAodG9rZW4uaXNFbXB0eSgpIHx8ICIsIi5lcXVhbHModG9rZW4pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTeW50YXggRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGUgb2YgdGFyZ2V0IFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaXN0LmFkZCh0b2tlbik7CisKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGRlcGVuZHMgYXR0cmlidXRlIGRvZXMgbm90CisgICAgICAgICAgICAvLyBlbmQgaW4gYSAsCisgICAgICAgICAgICBpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIHRva2VuID0gdG9rLm5leHRUb2tlbigpOworICAgICAgICAgICAgICAgIGlmICghdG9rLmhhc01vcmVUb2tlbnMoKSB8fCAhIiwiLmVxdWFscyh0b2tlbikpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTeW50YXggRXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYXR0cmlidXRlTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0dHJpYnV0ZSBvZiB0YXJnZXQgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXR0cmlidXRlIGZvciB0YXJnZXQgXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh0b2tlbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBkZXBlbmRzIGF0dHJpYnV0ZSBkb2VzIG5vdAotICAgICAgICAgICAgICAgIC8vIGVuZCBpbiBhICwKLSAgICAgICAgICAgICAgICBpZiAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRvay5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF0b2suaGFzTW9yZVRva2VucygpIHx8ICEiLCIuZXF1YWxzKHRva2VuKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTeW50YXggRXJyb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXR0cmlidXRlIGZvciB0YXJnZXQgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZW5kcyB3aXRoIGEgXCIsXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNoYXJhY3RlciIpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBlbmRzIHdpdGggYSBcIixcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjaGFyYWN0ZXIiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIyNSw3ICsyMjYsNyBAQAogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHRhc2tzIGN1cnJlbnRseSB3aXRoaW4gdGhpcyB0YXJnZXQKICAgICAgKi8KICAgICBwdWJsaWMgVGFza1tdIGdldFRhc2tzKCkgewotICAgICAgICBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxUYXNrPihjaGlsZHJlbi5zaXplKCkpOworICAgICAgICBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDw+KGNoaWxkcmVuLnNpemUoKSk7CiAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBjaGlsZHJlbikgewogICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBUYXNrKSB7CiAgICAgICAgICAgICAgICAgdGFza3MuYWRkKChUYXNrKSBvKTsKQEAgLTI0Miw3ICsyNDMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZERlcGVuZGVuY3koU3RyaW5nIGRlcGVuZGVuY3kpIHsKICAgICAgICAgaWYgKGRlcGVuZGVuY2llcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMik7CisgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7CiAgICAgICAgIH0KICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChkZXBlbmRlbmN5KTsKICAgICB9CkBAIC0yNTMsOCArMjU0LDggQEAKICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyB0YXJnZXQgKGVudW1lcmF0aW9uIG9mIFN0cmluZykKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucwotICAgICAgICAgICAgICAgIC5lbnVtZXJhdGlvbihkZXBlbmRlbmNpZXMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxTdHJpbmc+IGVtcHR5TGlzdCgpIDogZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcyA9PSBudWxsID8gQ29sbGVjdGlvbnMuZW1wdHlFbnVtZXJhdGlvbigpCisgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGRlcGVuZGVuY2llcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yODQsNyArMjg1LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SWYoU3RyaW5nIHByb3BlcnR5KSB7CiAgICAgICAgIGlmU3RyaW5nID0gcHJvcGVydHkgPT0gbnVsbCA/ICIiIDogcHJvcGVydHk7Ci0gICAgICAgIHNldElmKG5ldyBJZlN0cmluZ0NvbmRpdGlvbihpZlN0cmluZykpOworICAgICAgICBzZXRJZigoKSAtPiB7CisgICAgICAgICAgICBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlciA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIE9iamVjdCBvID0gcHJvcGVydHlIZWxwZXIucGFyc2VQcm9wZXJ0aWVzKGlmU3RyaW5nKTsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eUhlbHBlci50ZXN0SWZDb25kaXRpb24obyk7CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjk1LDcgKzMwMSw3IEBACiAgICAgICogQHNpbmNlIDEuNi4yCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRJZigpIHsKLSAgICAgICAgcmV0dXJuICIiLmVxdWFscyhpZlN0cmluZykgPyBudWxsIDogaWZTdHJpbmc7CisgICAgICAgIHJldHVybiBpZlN0cmluZy5pc0VtcHR5KCkgPyBudWxsIDogaWZTdHJpbmc7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzIsNyArMzM4LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VW5sZXNzKFN0cmluZyBwcm9wZXJ0eSkgewogICAgICAgICB1bmxlc3NTdHJpbmcgPSBwcm9wZXJ0eSA9PSBudWxsID8gIiIgOiBwcm9wZXJ0eTsKLSAgICAgICAgc2V0VW5sZXNzKG5ldyBVbmxlc3NTdHJpbmdDb25kaXRpb24odW5sZXNzU3RyaW5nKSk7CisgICAgICAgIHNldFVubGVzcygoKSAtPiB7CisgICAgICAgICAgICBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlciA9CisgICAgICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIE9iamVjdCBvID0gcHJvcGVydHlIZWxwZXIucGFyc2VQcm9wZXJ0aWVzKHVubGVzc1N0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gIXByb3BlcnR5SGVscGVyLnRlc3RVbmxlc3NDb25kaXRpb24obyk7CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQzLDcgKzM1NCw3IEBACiAgICAgICogQHNpbmNlIDEuNi4yCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVbmxlc3MoKSB7Ci0gICAgICAgIHJldHVybiAiIi5lcXVhbHModW5sZXNzU3RyaW5nKSA/IG51bGwgOiB1bmxlc3NTdHJpbmc7CisgICAgICAgIHJldHVybiB1bmxlc3NTdHJpbmcuaXNFbXB0eSgpID8gbnVsbCA6IHVubGVzc1N0cmluZzsKICAgICB9CiAKICAgICAvKioKQEAgLTM5Miw2ICs0MDMsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB0YXJnZXQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQogICAgICAqICAgICAgICAgbmFtZSBoYXMgbm90IGJlZW4gc2V0IHlldC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CkBAIC00OTMsNDIgKzUwNSw0IEBACiAgICAgICAgICAgICBjaGlsZHJlbi5zZXQoaW5kZXgsIG8pOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uZGl0aW9uIGV2YWx1YXRpbmcgdGhlICdpZicgYXR0cmlidXRlIHdpdGggdGhlIFByb3BlcnR5SGVscGVyLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgSWZTdHJpbmdDb25kaXRpb24gaW1wbGVtZW50cyBDb25kaXRpb24gewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbmRpdGlvbjsKLQotICAgICAgICBwdWJsaWMgSWZTdHJpbmdDb25kaXRpb24oU3RyaW5nIGNvbmRpdGlvbikgewotICAgICAgICAgICAgdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyID0gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIE9iamVjdCBvID0gcHJvcGVydHlIZWxwZXIucGFyc2VQcm9wZXJ0aWVzKGNvbmRpdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gcHJvcGVydHlIZWxwZXIudGVzdElmQ29uZGl0aW9uKG8pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25kaXRpb24gZXZhbHVhdGluZyB0aGUgJ3VubGVzcycgYXR0cmlidXRlIHdpdGggdGhlIFByb3BlcnR5SGVscGVyLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgVW5sZXNzU3RyaW5nQ29uZGl0aW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBjb25kaXRpb247Ci0KLSAgICAgICAgcHVibGljIFVubGVzc1N0cmluZ0NvbmRpdGlvbihTdHJpbmcgY29uZGl0aW9uKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbmRpdGlvbiA9IGNvbmRpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIgPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgT2JqZWN0IG8gPSBwcm9wZXJ0eUhlbHBlci5wYXJzZVByb3BlcnRpZXMoY29uZGl0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiAhcHJvcGVydHlIZWxwZXIudGVzdFVubGVzc0NvbmRpdGlvbihvKTsKLSAgICAgICAgfQotCi0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFzay5qYXZhCmluZGV4IDdlMzQ5Y2IuLmVkMjJjMGEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZGlzcGF0Y2guRGlzcGF0Y2hVdGlsczsKIApAQCAtODUsMTAgKzg1LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaW52YWxpZDsKIAotICAgIC8qKiBTb2xlIGNvbnN0cnVjdG9yLiAqLwotICAgIHB1YmxpYyBUYXNrKCkgewotICAgIH0KLQogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHRhcmdldCBjb250YWluZXIgb2YgdGhpcyB0YXNrLgogICAgICAqCkBAIC0yMDEsMTIgKzE5NywxMCBAQAogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgY2Fubm90IGJlIGNvbmZpZ3VyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbWF5YmVDb25maWd1cmUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAoIWludmFsaWQpIHsKLSAgICAgICAgICAgIGlmICh3cmFwcGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB3cmFwcGVyLm1heWJlQ29uZmlndXJlKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpbnZhbGlkKSB7CiAgICAgICAgICAgICBnZXRSZXBsYWNlbWVudCgpOworICAgICAgICB9IGVsc2UgaWYgKHdyYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JhcHBlci5tYXliZUNvbmZpZ3VyZShnZXRQcm9qZWN0KCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yOTQsMTAgKzI4OCwxMCBAQAogICAgICAqICAgICAgICAgICAgICAgICBiZSBsb2dnZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIGludCBtc2dMZXZlbCkgewotICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codGhpcywgbXNnLCBtc2dMZXZlbCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewogICAgICAgICAgICAgc3VwZXIubG9nKG1zZywgbXNnTGV2ZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZyh0aGlzLCBtc2csIG1zZ0xldmVsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzI3LDEwICszMjEsMTAgQEAKICAgICAgKiBAc2luY2UgMS43CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFRocm93YWJsZSB0LCBpbnQgbXNnTGV2ZWwpIHsKLSAgICAgICAgaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKHRoaXMsIG1zZywgdCwgbXNnTGV2ZWwpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHN1cGVyLmxvZyhtc2csIG1zZ0xldmVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codGhpcywgbXNnLCB0LCBtc2dMZXZlbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM0NCw3ICszMzgsMTEgQEAKICAgICAgKiBpcyBzdGlsbCBmaXJlZCwgYnV0IHdpdGggdGhlIGV4Y2VwdGlvbiBhcyB0aGUgY2F1c2UuCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybSgpIHsKLSAgICAgICAgaWYgKCFpbnZhbGlkKSB7CisgICAgICAgIGlmIChpbnZhbGlkKSB7CisgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IGdldFJlcGxhY2VtZW50KCk7CisgICAgICAgICAgICBUYXNrIHRhc2sgPSB1ZS5nZXRUYXNrKCk7CisgICAgICAgICAgICB0YXNrLnBlcmZvcm0oKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGdldFByb2plY3QoKS5maXJlVGFza1N0YXJ0ZWQodGhpcyk7CiAgICAgICAgICAgICBUaHJvd2FibGUgcmVhc29uID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CkBAIC0zNjcsMTAgKzM2NSw2IEBACiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5maXJlVGFza0ZpbmlzaGVkKHRoaXMsIHJlYXNvbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IGdldFJlcGxhY2VtZW50KCk7Ci0gICAgICAgICAgICBUYXNrIHRhc2sgPSB1ZS5nZXRUYXNrKCk7Ci0gICAgICAgICAgICB0YXNrLnBlcmZvcm0oKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDMxLDExICs0MjUsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZXBsYWNlQ2hpbGRyZW4oUnVudGltZUNvbmZpZ3VyYWJsZSB3cmFwcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgcGFyZW50RWxlbWVudCkgewotICAgICAgICBFbnVtZXJhdGlvbjxSdW50aW1lQ29uZmlndXJhYmxlPiBlID0gd3JhcHBlci5nZXRDaGlsZHJlbigpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSBjaGlsZFdyYXBwZXIgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZEVsZW1lbnQgPQotICAgICAgICAgICAgICAgIG5ldyBVbmtub3duRWxlbWVudChjaGlsZFdyYXBwZXIuZ2V0RWxlbWVudFRhZygpKTsKKyAgICAgICAgZm9yIChSdW50aW1lQ29uZmlndXJhYmxlIGNoaWxkV3JhcHBlciA6IENvbGxlY3Rpb25zLmxpc3Qod3JhcHBlci5nZXRDaGlsZHJlbigpKSkgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbmV3IFVua25vd25FbGVtZW50KGNoaWxkV3JhcHBlci5nZXRFbGVtZW50VGFnKCkpOwogICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hZGRDaGlsZChjaGlsZEVsZW1lbnQpOwogICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRSdW50aW1lQ29uZmlndXJhYmxlV3JhcHBlcihjaGlsZFdyYXBwZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0FkYXB0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tBZGFwdGVyLmphdmEKaW5kZXggZDRkOGMzMi4uNzdkODY4OCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0FkYXB0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQWRhcHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtODEsNyArODEsNyBAQAogICAgICAgICAgICAgLy8gZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgaW50ZXJmYWNlLCBzaW5jZSB0aGVuCiAgICAgICAgICAgICAvLyB0YXNrQ2xhc3Mgd291bGQgYmUgYWJzdHJhY3QgdG9vLgogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgZXhlY3V0ZU0gPSB0YXNrQ2xhc3MuZ2V0TWV0aG9kKCJleGVjdXRlIiwgKENsYXNzW10pIG51bGwpOworICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBleGVjdXRlTSA9IHRhc2tDbGFzcy5nZXRNZXRob2QoImV4ZWN1dGUiKTsKICAgICAgICAgICAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBwdWJsaWMsIHNpbmNlCiAgICAgICAgICAgICAgICAgLy8gZ2V0TWV0aG9kIGZpbmRzIHB1YmxpYyBtZXRob2Qgb25seS4KICAgICAgICAgICAgICAgICAvLyBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciBhYnN0cmFjdCwgc2luY2UgdGhlbgpAQCAtMTIyLDEwICsxMjIsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBzZXRMb2NhdGlvbk0gPSBwcm94eS5nZXRDbGFzcygpLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAic2V0TG9jYXRpb24iLCBuZXcgQ2xhc3NbXSB7TG9jYXRpb24uY2xhc3N9KTsKKyAgICAgICAgICAgIE1ldGhvZCBzZXRMb2NhdGlvbk0gPQorICAgICAgICAgICAgICAgIHByb3h5LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRMb2NhdGlvbiIsIExvY2F0aW9uLmNsYXNzKTsKICAgICAgICAgICAgIGlmIChzZXRMb2NhdGlvbk0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldExvY2F0aW9uTS5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXSB7Z2V0TG9jYXRpb24oKX0pOworICAgICAgICAgICAgICAgIHNldExvY2F0aW9uTS5pbnZva2UocHJveHksIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgaWYgdGhlIGNsYXNzIGJlaW5nIHVzZWQgYXMgYSB0YXNrIGRvZXMgbm90IGhhdmUKQEAgLTEzNywxMCArMTM3LDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIHNldFByb2plY3RNID0gcHJveHkuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgInNldFByb2plY3QiLCBuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzc30pOworICAgICAgICAgICAgTWV0aG9kIHNldFByb2plY3RNID0KKyAgICAgICAgICAgICAgICBwcm94eS5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0UHJvamVjdCIsIFByb2plY3QuY2xhc3MpOwogICAgICAgICAgICAgaWYgKHNldFByb2plY3RNICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TS5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXSB7Z2V0UHJvamVjdCgpfSk7CisgICAgICAgICAgICAgICAgc2V0UHJvamVjdE0uaW52b2tlKHByb3h5LCBnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gaWdub3JlIHRoaXMgaWYgdGhlIGNsYXNzIGJlaW5nIHVzZWQgYXMgYSB0YXNrIGRvZXMgbm90IGhhdmUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb25maWd1cmF0aW9uQ2hlY2tlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbmZpZ3VyYXRpb25DaGVja2VyLmphdmEKaW5kZXggOWE1MjA0My4uYWE3MTFmOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbmZpZ3VyYXRpb25DaGVja2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbmZpZ3VyYXRpb25DaGVja2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw4ICsyMyw4IEBACiAvKioKICAqIDxwPkhlbHBlciBjbGFzcyBmb3IgdGhlIGNoZWNrIG9mIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFzay4KICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3IgbWFraW5nIGFzc3VtcHRpb25zIGFib3V0IHRoZSB0YXNrIGNvbmZpZ3VyYXRpb24uCi0gKiBBZnRlciBjb2xsZWN0aW5nIGFsbCB2aW9sYXRpb25zIHdpdGggPHR0PmFzc2VydCo8L3R0PiBhbmQgPHR0PmZhaWw8L3R0PgotICogbWV0aG9kcyB0aGUgPHR0PmNoZWNrRXJyb3JzPC90dD4gd2lsbCB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uIHdpdGggYWxsIGNvbGxlY3RlZAorICogQWZ0ZXIgY29sbGVjdGluZyBhbGwgdmlvbGF0aW9ucyB3aXRoIDxjb2RlPmFzc2VydCo8L2NvZGU+IGFuZCA8Y29kZT5mYWlsPC9jb2RlPgorICogbWV0aG9kcyB0aGUgPGNvZGU+Y2hlY2tFcnJvcnM8L2NvZGU+IHdpbGwgdGhyb3cgYSBCdWlsZEV4Y2VwdGlvbiB3aXRoIGFsbCBjb2xsZWN0ZWQKICAqIG1lc3NhZ2VzIG9yIGRvZXMgbm90aGluZyBpZiB0aGVyZSB3YXNuJ3QgYW55IGVycm9yLjwvcD4KICAqCiAgKiA8cD5FeGFtcGxlOjwvcD4KQEAgLTUwLDEyICs1MCwxMiBAQAogICogICAgIH0KICAqIDwvcHJlPgogICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL21hcnRpbmZvd2xlci5jb20vZWFhRGV2L05vdGlmaWNhdGlvbi5odG1sIj5Ob3RpZmljYXRpb24gUGF0dGVybjwvYT4KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9tYXJ0aW5mb3dsZXIuY29tL2VhYURldi9Ob3RpZmljYXRpb24uaHRtbCI+Tm90aWZpY2F0aW9uIFBhdHRlcm48L2E+CiAgKi8KIHB1YmxpYyBjbGFzcyBUYXNrQ29uZmlndXJhdGlvbkNoZWNrZXIgewogCiAgICAgLyoqIExpc3Qgb2YgYWxsIGNvbGxlY3RlZCBlcnJvciBtZXNzYWdlcy4gKi8KLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKiBUYXNrIGZvciB3aGljaCB0aGUgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgY2hlY2tlZC4gKi8KICAgICBwcml2YXRlIGZpbmFsIFRhc2sgdGFzazsKQEAgLTk0LDE1ICs5NCwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNoZWNrRXJyb3JzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIkNvbmZpZ3VyYXRpb24gZXJyb3Igb24gPCIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHRhc2suZ2V0VGFza05hbWUoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIj46Iik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KCJDb25maWd1cmF0aW9uIGVycm9yIG9uIDwlcz46JW4iLAorICAgICAgICAgICAgICAgICAgICB0YXNrLmdldFRhc2tOYW1lKCkpKTsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIG1zZyA6IGVycm9ycykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLSAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobXNnKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiLSAlcyVuIiwgbXNnKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oc2IudG9TdHJpbmcoKSwgdGFzay5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVGFza0NvbnRhaW5lci5qYXZhCmluZGV4IGY3NDJlOWUuLjIzOGViM2MgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29udGFpbmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UeXBlQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVHlwZUFkYXB0ZXIuamF2YQppbmRleCBiODUyMGZjLi40ZGM1ZTAzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UeXBlQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1R5cGVBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnQuamF2YQppbmRleCBmMGEyNzRlLi5mMzNkZDUyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vua25vd25FbGVtZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxMCArMjAsMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHJlU2V0RGVmOwogCkBAIC0yMzQsMTAgKzIzNSw4IEBACiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChyZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CiAgICAgICAgICAgICByZXR1cm4gKChUYXNrKSByZWFsVGhpbmcpLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICB9Ci0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmhhbmRsZUlucHV0KGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzExLDcgKzMxMCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2hpbGQoVW5rbm93bkVsZW1lbnQgY2hpbGQpIHsKICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLSAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxVbmtub3duRWxlbWVudD4oKTsKKyAgICAgICAgICAgIGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIH0KICAgICAgICAgY2hpbGRyZW4uYWRkKGNoaWxkKTsKICAgICB9CkBAIC0zNDEsNyArMzQwLDYgQEAKICAgICAgICAgQ2xhc3M8Pz4gcGFyZW50Q2xhc3MgPSBwYXJlbnQuZ2V0Q2xhc3MoKTsKICAgICAgICAgSW50cm9zcGVjdGlvbkhlbHBlciBpaCA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKGdldFByb2plY3QoKSwgcGFyZW50Q2xhc3MpOwogCi0KICAgICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKICAgICAgICAgICAgIEl0ZXJhdG9yPFVua25vd25FbGVtZW50PiBpdCA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaXQuaGFzTmV4dCgpOyBpKyspIHsKQEAgLTQwMCw3ICszOTgsNyBAQAogICAgICAgICAvLyBEbyB0aGUgcnVudGltZQogICAgICAgICBnZXRXcmFwcGVyKCkuYXBwbHlQcmVTZXQodS5nZXRXcmFwcGVyKCkpOwogICAgICAgICBpZiAodS5jaGlsZHJlbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PFVua25vd25FbGVtZW50PiBuZXdDaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VW5rbm93bkVsZW1lbnQ+KHUuY2hpbGRyZW4pOworICAgICAgICAgICAgTGlzdDxVbmtub3duRWxlbWVudD4gbmV3Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4odS5jaGlsZHJlbik7CiAgICAgICAgICAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG5ld0NoaWxkcmVuLmFkZEFsbChjaGlsZHJlbik7CiAgICAgICAgICAgICB9CkBAIC01MDUsOSArNTAzLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIHRvIHVzZSBpbiBsb2dnaW5nIG1lc3NhZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFza05hbWUoKSB7Ci0gICAgICAgIC8vcmV0dXJuIGVsZW1lbnROYW1lOwotICAgICAgICByZXR1cm4gcmVhbFRoaW5nID09IG51bGwKLSAgICAgICAgICAgIHx8ICEocmVhbFRoaW5nIGluc3RhbmNlb2YgVGFzaykgPyBzdXBlci5nZXRUYXNrTmFtZSgpCisgICAgICAgIHJldHVybiAhKHJlYWxUaGluZyBpbnN0YW5jZW9mIFRhc2spID8gc3VwZXIuZ2V0VGFza05hbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoVGFzaykgcmVhbFRoaW5nKS5nZXRUYXNrTmFtZSgpOwogICAgIH0KIApAQCAtNjAwLDcgKzU5Niw3IEBACiAgICAgLyoqCiAgICAgICogbGlrZSBjb250ZW50cyBlcXVhbHMsIGJ1dCBpZ25vcmVzIHByb2plY3QKICAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gY2hlY2sgYWdhaW5zdAotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHVua25vd25lbGVtZW50IGhhcyB0aGUgc2FtZSBjb250ZW50cyB0aGUgb3RoZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBVbmtub3duRWxlbWVudCBoYXMgdGhlIHNhbWUgY29udGVudHMgdGhlIG90aGVyCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2ltaWxhcihPYmplY3Qgb2JqKSB7CiAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewpAQCAtNjExLDcgKzYwNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgVW5rbm93bkVsZW1lbnQgb3RoZXIgPSAoVW5rbm93bkVsZW1lbnQpIG9iajsKICAgICAgICAgLy8gQXJlIHRoZSBuYW1lcyB0aGUgc2FtZSA/Ci0gICAgICAgIGlmICghZXF1YWxzU3RyaW5nKGVsZW1lbnROYW1lLCBvdGhlci5lbGVtZW50TmFtZSkpIHsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyhlbGVtZW50TmFtZSwgb3RoZXIuZWxlbWVudE5hbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFuYW1lc3BhY2UuZXF1YWxzKG90aGVyLm5hbWVzcGFjZSkpIHsKQEAgLTYzNiw3ICs2MzIsNyBAQAogICAgICAgICAvLyBBcmUgdGhlIHN1YiBlbGVtZW50cyB0aGUgc2FtZSA/CiAgICAgICAgIGZpbmFsIGludCBjaGlsZHJlblNpemUgPSBjaGlsZHJlbiA9PSBudWxsID8gMCA6IGNoaWxkcmVuLnNpemUoKTsKICAgICAgICAgaWYgKGNoaWxkcmVuU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3RoZXIuY2hpbGRyZW4gPT0gbnVsbCB8fCBvdGhlci5jaGlsZHJlbi5zaXplKCkgPT0gMDsKKyAgICAgICAgICAgIHJldHVybiBvdGhlci5jaGlsZHJlbiA9PSBudWxsIHx8IG90aGVyLmNoaWxkcmVuLmlzRW1wdHkoKTsKICAgICAgICAgfQogICAgICAgICBpZiAob3RoZXIuY2hpbGRyZW4gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjQ2LDcgKzY0Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblNpemU7ICsraSkgewogICAgICAgICAgICAgLy8gY2hpbGRyZW4gY2Fubm90IGJlIG51bGwgY2hpbGRyZW5TaXplIHdvdWxkIGhhdmUgYmVlbiAwCi0gICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZCA9IChVbmtub3duRWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOyAvL05PU09OQVIKKyAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOyAvL05PU09OQVIKICAgICAgICAgICAgIGlmICghY2hpbGQuc2ltaWxhcihvdGhlci5jaGlsZHJlbi5nZXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtNjU0LDEwICs2NTAsNiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFsc1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICAgICAgcmV0dXJuIChhID09IG51bGwpID8gKGIgPT0gbnVsbCkgOiBhLmVxdWFscyhiKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBNYWtlIGEgY29weSBvZiB0aGUgdW5rbm93biBlbGVtZW50IGFuZCBzZXQgaXQgaW4gdGhlIG5ldyBwcm9qZWN0LgogICAgICAqIEBwYXJhbSBuZXdQcm9qZWN0IHRoZSBwcm9qZWN0IHRvIGNyZWF0ZSB0aGUgVUUgaW4uCkBAIC02ODcsOCArNjc5LDcgQEAKICAgICAgICAgfQogICAgICAgICBjb3B5UkMuYWRkVGV4dChnZXRXcmFwcGVyKCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOwogCi0gICAgICAgIGZvciAoRW51bWVyYXRpb248UnVudGltZUNvbmZpZ3VyYWJsZT4gZSA9IGdldFdyYXBwZXIoKS5nZXRDaGlsZHJlbigpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgUnVudGltZUNvbmZpZ3VyYWJsZSByID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICBmb3IgKFJ1bnRpbWVDb25maWd1cmFibGUgciA6IENvbGxlY3Rpb25zLmxpc3QoZ2V0V3JhcHBlcigpLmdldENoaWxkcmVuKCkpKSB7CiAgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZUNoaWxkID0gKFVua25vd25FbGVtZW50KSByLmdldFByb3h5KCk7CiAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBjb3B5Q2hpbGQgPSB1ZUNoaWxkLmNvcHkobmV3UHJvamVjdCk7CiAgICAgICAgICAgICBjb3B5UkMuYWRkQ2hpbGQoY29weUNoaWxkLmdldFdyYXBwZXIoKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9VbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvVW5zdXBwb3J0ZWRBdHRyaWJ1dGVFeGNlcHRpb24uamF2YQppbmRleCAxZmQ5Y2U1Li4yMjYxMDhiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9VbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkQXR0cmlidXRlRXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9VbnN1cHBvcnRlZEVsZW1lbnRFeGNlcHRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbi5qYXZhCmluZGV4IDJhMzgxMjAuLjAzNTQ4OTIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L1Vuc3VwcG9ydGVkRWxlbWVudEV4Y2VwdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvWG1sTG9nZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YQppbmRleCA1MWQ0Nzc2Li5iNzVjZTJmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDIxICsxNywyNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CkBAIC0xMDgsMTYgKzExMSwxNiBAQAogICAgIHByaXZhdGUgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5uZXdEb2N1bWVudCgpOwogCiAgICAgLyoqIE1hcHBpbmcgZm9yIHdoZW4gdGFza3Mgc3RhcnRlZCAoVGFzayB0byBUaW1lZEVsZW1lbnQpLiAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFRhc2ssIFRpbWVkRWxlbWVudD4gdGFza3MgPSBuZXcgSGFzaHRhYmxlPFRhc2ssIFRpbWVkRWxlbWVudD4oKTsKKyAgICBwcml2YXRlIE1hcDxUYXNrLCBUaW1lZEVsZW1lbnQ+IHRhc2tzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKiogTWFwcGluZyBmb3Igd2hlbiB0YXJnZXRzIHN0YXJ0ZWQgKFRhcmdldCB0byBUaW1lZEVsZW1lbnQpLiAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFRhcmdldCwgVGltZWRFbGVtZW50PiB0YXJnZXRzID0gbmV3IEhhc2h0YWJsZTxUYXJnZXQsIFhtbExvZ2dlci5UaW1lZEVsZW1lbnQ+KCk7CisgICAgcHJpdmF0ZSBNYXA8VGFyZ2V0LCBUaW1lZEVsZW1lbnQ+IHRhcmdldHMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKgogICAgICAqIE1hcHBpbmcgb2YgdGhyZWFkcyB0byBzdGFja3Mgb2YgZWxlbWVudHMKICAgICAgKiAoVGhyZWFkIHRvIFN0YWNrIG9mIFRpbWVkRWxlbWVudCkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8VGhyZWFkLCBTdGFjazxUaW1lZEVsZW1lbnQ+PiB0aHJlYWRTdGFja3MgPSBuZXcgSGFzaHRhYmxlPFRocmVhZCwgU3RhY2s8VGltZWRFbGVtZW50Pj4oKTsKKyAgICBwcml2YXRlIE1hcDxUaHJlYWQsIFN0YWNrPFRpbWVkRWxlbWVudD4+IHRocmVhZFN0YWNrcyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqCiAgICAgICogV2hlbiB0aGUgYnVpbGQgc3RhcnRlZC4KQEAgLTEzMywyMyArMTM2LDIwIEBACiAgICAgICAgIHByaXZhdGUgbG9uZyBzdGFydFRpbWU7CiAgICAgICAgIC8qKiBFbGVtZW50IGNyZWF0ZWQgYXQgdGhlIHN0YXJ0IHRpbWUuICovCiAgICAgICAgIHByaXZhdGUgRWxlbWVudCBlbGVtZW50OworCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0VGFnTmFtZSgpICsgIjoiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqICBDb25zdHJ1Y3RzIGEgbmV3IEJ1aWxkTGlzdGVuZXIgdGhhdCBsb2dzIGJ1aWxkIGV2ZW50cyB0byBhbiBYTUwgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sTG9nZ2VyKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqIEZpcmVkIHdoZW4gdGhlIGJ1aWxkIHN0YXJ0cywgdGhpcyBidWlsZHMgdGhlIHRvcC1sZXZlbCBlbGVtZW50IGZvciB0aGUKICAgICAgKiBkb2N1bWVudCBhbmQgcmVtZW1iZXJzIHRoZSB0aW1lIG9mIHRoZSBzdGFydCBvZiB0aGUgYnVpbGQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZXZlbnQgSWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBidWlsZEVsZW1lbnQgPSBuZXcgVGltZWRFbGVtZW50KCk7CiAgICAgICAgIGJ1aWxkRWxlbWVudC5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKQEAgLTE2Myw2ICsxNjMsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGxvbmcgdG90YWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBidWlsZEVsZW1lbnQuc3RhcnRUaW1lOwogICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5zZXRBdHRyaWJ1dGUoVElNRV9BVFRSLCBEZWZhdWx0TG9nZ2VyLmZvcm1hdFRpbWUodG90YWxUaW1lKSk7CkBAIC0xNzksMjUgKzE4MCwxOSBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBvdXRGaWxlbmFtZSA9IGdldFByb3BlcnR5KGV2ZW50LCAiWG1sTG9nZ2VyLmZpbGUiLCAibG9nLnhtbCIpOwogICAgICAgICBTdHJpbmcgeHNsVXJpID0gZ2V0UHJvcGVydHkoZXZlbnQsICJhbnQuWG1sTG9nZ2VyLnN0eWxlc2hlZXQudXJpIiwgImxvZy54c2wiKTsKLSAgICAgICAgV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBzcGVjaWZ5IG91dHB1dCBpbiBVVEY4IG90aGVyd2lzZSBhY2NlbnRlZCBjaGFyYWN0ZXJzIHdpbGwgYmxvdwotICAgICAgICAgICAgLy8gdXAgZXZlcnl0aGluZwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG91dFN0cmVhbTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGVuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCAiVVRGOCIpOworCisgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIHN0cmVhbSA9CisgICAgICAgICAgICBvdXRTdHJlYW0gPT0gbnVsbCA/IEZpbGVzLm5ld091dHB1dFN0cmVhbShQYXRocy5nZXQob3V0RmlsZW5hbWUpKSA6IG91dFN0cmVhbTsKKyAgICAgICAgICAgICAgICBXcml0ZXIgb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0sIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSB7CiAgICAgICAgICAgICBvdXQud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIik7Ci0gICAgICAgICAgICBpZiAoeHNsVXJpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIG91dC53cml0ZSgiPD94bWwtc3R5bGVzaGVldCB0eXBlPVwidGV4dC94c2xcIiBocmVmPVwiIiArIHhzbFVyaSArICJcIj8+XG5cbiIpOworICAgICAgICAgICAgaWYgKCF4c2xVcmkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI8P3htbC1zdHlsZXNoZWV0IHR5cGU9XCJ0ZXh0L3hzbFwiIGhyZWY9XCIiICsgeHNsVXJpCisgICAgICAgICAgICAgICAgICAgICsgIlwiPz5cblxuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcigpLndyaXRlKGJ1aWxkRWxlbWVudC5lbGVtZW50LCBvdXQsIDAsICJcdCIpOwogICAgICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbG9nIGZpbGUiLCBleGMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CiAgICAgICAgIH0KICAgICAgICAgYnVpbGRFbGVtZW50ID0gbnVsbDsKICAgICB9CkBAIC0yMTUsMTYgKzIxMCwxMyBAQAogICAgICAqIEByZXR1cm4gdGhlIHN0YWNrIG9mIHRpbWVkIGVsZW1lbnRzIGZvciB0aGUgY3VycmVudCB0aHJlYWQKICAgICAgKi8KICAgICBwcml2YXRlIFN0YWNrPFRpbWVkRWxlbWVudD4gZ2V0U3RhY2soKSB7Ci0gICAgICAgIFN0YWNrPFRpbWVkRWxlbWVudD4gdGhyZWFkU3RhY2sgPSB0aHJlYWRTdGFja3MuZ2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotICAgICAgICBpZiAodGhyZWFkU3RhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyZWFkU3RhY2sgPSBuZXcgU3RhY2s8VGltZWRFbGVtZW50PigpOwotICAgICAgICAgICAgdGhyZWFkU3RhY2tzLnB1dChUaHJlYWQuY3VycmVudFRocmVhZCgpLCB0aHJlYWRTdGFjayk7Ci0gICAgICAgIH0KICAgICAgICAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB1bmNvbW1lbnQ6Ci0gICAgICAgIG9yZy53M2MuZG9tLkNvbW1lbnQgcyA9IGRvYy5jcmVhdGVDb21tZW50KCJzdGFjaz0iICsgdGhyZWFkU3RhY2spOwotICAgICAgICBidWlsZEVsZW1lbnQuZWxlbWVudC5hcHBlbmRDaGlsZChzKTsKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiB0aHJlYWRTdGFjazsKKyAgICAgICAgaWYgKHRocmVhZFN0YWNrcy5jb250YWluc0tleShUaHJlYWQuY3VycmVudFRocmVhZCgpKSkgeworICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudCBzID0gZG9jLmNyZWF0ZUNvbW1lbnQoInN0YWNrPSIgKyB0aHJlYWRTdGFja3MoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSkpOworICAgICAgICAgICAgYnVpbGRFbGVtZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQocyk7CisgICAgICAgIH0KKyAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHRocmVhZFN0YWNrcy5jb21wdXRlSWZBYnNlbnQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgayAtPiBuZXcgU3RhY2s8PigpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzNSw2ICsyMjcsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIFRhcmdldCB0YXJnZXQgPSBldmVudC5nZXRUYXJnZXQoKTsKICAgICAgICAgVGltZWRFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBuZXcgVGltZWRFbGVtZW50KCk7CkBAIC0yNTIsNiArMjQ1LDcgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCiAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgVGFyZ2V0IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldCgpOwogICAgICAgICBUaW1lZEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IHRhcmdldHMuZ2V0KHRhcmdldCk7CkBAIC0yODksNiArMjgzLDcgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCiAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgVGltZWRFbGVtZW50IHRhc2tFbGVtZW50ID0gbmV3IFRpbWVkRWxlbWVudCgpOwogICAgICAgICB0YXNrRWxlbWVudC5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKQEAgLTMxMiw2ICszMDcsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBBbiBldmVudCB3aXRoIGFueSByZWxldmFudCBleHRyYSBpbmZvcm1hdGlvbi4KICAgICAgKiAgICAgICAgICAgICAgV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwogICAgICAgICBUaW1lZEVsZW1lbnQgdGFza0VsZW1lbnQgPSB0YXNrcy5nZXQodGFzayk7CkBAIC0zNTIsMTIgKzM0OCwxMCBAQAogICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICAgfQotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPFRhc2s+IGUgPSB0YXNrcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBUYXNrIGtleSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgewotICAgICAgICAgICAgICAgIGlmICgoKFVua25vd25FbGVtZW50KSBrZXkpLmdldFRhc2soKSA9PSB0YXNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGZpbmFsIFNldDxUYXNrPiBrbm93blRhc2tzID0gbmV3IEhhc2hTZXQ8Pih0YXNrcy5rZXlTZXQoKSk7CisgICAgICAgIGZvciAoZmluYWwgVGFzayB0IDoga25vd25UYXNrcykgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCAmJiAoKFVua25vd25FbGVtZW50KSB0KS5nZXRUYXNrKCkgPT0gdGFzaykgeworICAgICAgICAgICAgICAgIHJldHVybiB0YXNrcy5nZXQodCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0zNzEsNiArMzY1LDcgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uCiAgICAgICogICAgICAgICAgICAgIFdpbGwgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBpbnQgcHJpb3JpdHkgPSBldmVudC5nZXRQcmlvcml0eSgpOwogICAgICAgICBpZiAocHJpb3JpdHkgPiBtc2dPdXRwdXRMZXZlbCkgewpAQCAtMzc4LDcgKzM3Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgRWxlbWVudCBtZXNzYWdlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KE1FU1NBR0VfVEFHKTsKIAotICAgICAgICBTdHJpbmcgbmFtZSA9ICJkZWJ1ZyI7CisgICAgICAgIFN0cmluZyBuYW1lOwogICAgICAgICBzd2l0Y2ggKHByaW9yaXR5KSB7CiAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0VSUjoKICAgICAgICAgICAgICAgICBuYW1lID0gImVycm9yIjsKQEAgLTQzMiw2ICs0MjcsNyBAQAogICAgICAqICAgICAgICBzZWUge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QjTVNHX0VSUiBQcm9qZWN0fQogICAgICAqICAgICAgICBjbGFzcyBmb3IgbGV2ZWwgZGVmaW5pdGlvbnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7CiAgICAgICAgIG1zZ091dHB1dExldmVsID0gbGV2ZWw7CiAgICAgfQpAQCAtNDQyLDYgKzQzOCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgUHJpbnRTdHJlYW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7CiAgICAgICAgIHRoaXMub3V0U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG91dHB1dCwgdHJ1ZSk7CiAgICAgfQpAQCAtNDUyLDYgKzQ0OSw3IEBACiAgICAgICogQHBhcmFtIGVtYWNzTW9kZSB0cnVlIGlmIGxvZ2dlciBzaG91bGQgcHJvZHVjZSBlbWFjcyBjb21wYXRpYmxlCiAgICAgICogICAgICAgIG91dHB1dAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVtYWNzTW9kZShib29sZWFuIGVtYWNzTW9kZSkgewogICAgIH0KIApAQCAtNDYyLDYgKzQ2MCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZXJyIHRoZSBzdHJlYW0gd2UgYXJlIGdvaW5nIHRvIGlnbm9yZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFcnJvclByaW50U3RyZWFtKFByaW50U3RyZWFtIGVycikgewogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYW50bGliLnhtbCBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2FudGxpYi54bWwKaW5kZXggOGVjNjcxNC4uNjhiZGFiMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYW50bGliLnhtbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hbnRsaWIueG1sCkBAIC04LDcgKzgsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0F0dHJpYnV0ZU5hbWVzcGFjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0F0dHJpYnV0ZU5hbWVzcGFjZS5qYXZhCmluZGV4IGZiYTRjOTkuLjU1ZDY0MzUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9BdHRyaWJ1dGVOYW1lc3BhY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvQXR0cmlidXRlTmFtZXNwYWNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvQmFzZUlmQXR0cmlidXRlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvQmFzZUlmQXR0cmlidXRlLmphdmEKaW5kZXggM2U4YjU2Ni4uMzQyNmQ2OCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0Jhc2VJZkF0dHJpYnV0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9CYXNlSWZBdHRyaWJ1dGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDExICsxOCwxMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmF0dHJpYnV0ZTsKIAotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5SdW50aW1lQ29uZmlndXJhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlVua25vd25FbGVtZW50OwogCiAKQEAgLTU3LDcgKzU2LDcgQEAKICAgICAgKiBAcmV0dXJuIHZhbCBpZiBwb3NpdGl2ZSBvciAhdmFsIGlmIG5vdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb252ZXJ0UmVzdWx0KGJvb2xlYW4gdmFsKSB7Ci0gICAgICAgIHJldHVybiBwb3NpdGl2ZSA/IHZhbCA6ICF2YWw7CisgICAgICAgIHJldHVybiBwb3NpdGl2ZSA9PSB2YWw7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NiwxOSArNjUsMTEgQEAKICAgICAgKiBAcGFyYW0gZWwgdGhlIGVsZW1lbnQgdGhpcyBhdHRyaWJ1dGUgaXMgaW4uCiAgICAgICogQHJldHVybiBhIG1hcCBvZiBhdHRyaWJ1dGVzLgogICAgICAqLwotICAgIHByb3RlY3RlZCBNYXAgZ2V0UGFyYW1zKFVua25vd25FbGVtZW50IGVsKSB7Ci0gICAgICAgIE1hcCByZXQgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHJjID0gZWwuZ2V0V3JhcHBlcigpOwotICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGF0dHJpYnV0ZXMgPSByYy5nZXRBdHRyaWJ1dGVNYXAoKTsgLy8gVGhpcyBkb2VzIGEgY29weSEKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogYXR0cmlidXRlcy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCJhbnQtYXR0cmlidXRlOnBhcmFtIikpIHsKLSAgICAgICAgICAgICAgICBpbnQgcG9zID0ga2V5Lmxhc3RJbmRleE9mKCc6Jyk7Ci0gICAgICAgICAgICAgICAgcmV0LnB1dChrZXkuc3Vic3RyaW5nKHBvcyArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgZWwuZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbXMoVW5rbm93bkVsZW1lbnQgZWwpIHsKKyAgICAgICAgLy8gdGhpcyBtYWtlcyBhIGNvcHkhCisgICAgICAgIHJldHVybiBlbC5nZXRXcmFwcGVyKCkuZ2V0QXR0cmlidXRlTWFwKCkuZW50cnlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoZSAtPiBlLmdldEtleSgpLnN0YXJ0c1dpdGgoImFudC1hdHRyaWJ1dGU6cGFyYW0iKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGUgLT4gZS5nZXRLZXkoKS5zdWJzdHJpbmcoZS5nZXRLZXkoKS5sYXN0SW5kZXhPZignOicpICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICBlIC0+IGVsLmdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcygoU3RyaW5nKSBlLmdldFZhbHVlKCkpLCAoYSwgYikgLT4gYikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9FbmFibGVBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9FbmFibGVBdHRyaWJ1dGUuamF2YQppbmRleCAwNmMxMTg2Li5hMDJjOTljIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvRW5hYmxlQXR0cmlidXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0VuYWJsZUF0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0lmQmxhbmtBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9JZkJsYW5rQXR0cmlidXRlLmphdmEKaW5kZXggMzg0NDc2Yy4uNDEwZjhjNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0lmQmxhbmtBdHRyaWJ1dGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvSWZCbGFua0F0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzQsNiArMzQsNiBAQAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoVW5rbm93bkVsZW1lbnQgZWwsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICByZXR1cm4gY29udmVydFJlc3VsdCgodmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpKSk7CisgICAgICAgIHJldHVybiBjb252ZXJ0UmVzdWx0KHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvSWZTZXRBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9JZlNldEF0dHJpYnV0ZS5qYXZhCmluZGV4IGQ0NTMxYzUuLjRhMzE5MTUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9JZlNldEF0dHJpYnV0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9JZlNldEF0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0lmVHJ1ZUF0dHJpYnV0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvYXR0cmlidXRlL0lmVHJ1ZUF0dHJpYnV0ZS5qYXZhCmluZGV4IDVjMTBlYTIuLjY1ZGU5YzAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2F0dHJpYnV0ZS9JZlRydWVBdHRyaWJ1dGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9hdHRyaWJ1dGUvSWZUcnVlQXR0cmlidXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaFRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVGFzay5qYXZhCmluZGV4IGI4OGI4NzMuLjljMDhkNmQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsNiArMzYsNyBAQAogICAgICAqIEdldCB0aGUgYWN0aW9uIHBhcmFtZXRlciBuYW1lLgogICAgICAqIEByZXR1cm4gdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gImFjdGlvbiIgYnkgZGVmYXVsdCAoY2FuIGJlIG92ZXJyaWRkZW4pLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9uUGFyYW1ldGVyTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJhY3Rpb24iOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoVXRpbHMuamF2YQppbmRleCA2MmRkODhmLi5iNzZjNzg5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kaXNwYXRjaC9EaXNwYXRjaFV0aWxzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hVdGlscy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDMsOSArNDMsOCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IChVbmtub3duRWxlbWVudCkgdGFzazsKICAgICAgICAgICAgICAgICBPYmplY3QgcmVhbFRoaW5nID0gdWUuZ2V0UmVhbFRoaW5nKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlYWxUaGluZyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIHJlYWxUaGluZyBpbnN0YW5jZW9mIERpc3BhdGNoYWJsZQotICAgICAgICAgICAgICAgICAgICAmJiByZWFsVGhpbmcgaW5zdGFuY2VvZiBUYXNrKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlYWxUaGluZyBpbnN0YW5jZW9mIERpc3BhdGNoYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVhbFRoaW5nIGluc3RhbmNlb2YgVGFzaykgewogICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGFibGUgPSAoRGlzcGF0Y2hhYmxlKSByZWFsVGhpbmc7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTMsNTcgKzUyLDUxIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIG1OYW1lID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGRpc3BhdGNoYWJsZS5nZXRBY3Rpb25QYXJhbWV0ZXJOYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSA9ICJnZXQiICsgbmFtZS50cmltKCkuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSArPSBuYW1lLnN1YnN0cmluZygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBEaXNwYXRjaGFibGU+IGMgPSBkaXNwYXRjaGFibGUuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBhY3Rpb25NID0gYy5nZXRNZXRob2QobU5hbWUsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uTSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBhY3Rpb25NLmludm9rZShkaXNwYXRjaGFibGUsIChPYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IG8udG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kTmFtZSA9IHMudHJpbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGV4ZWN1dGVNID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVNID0gZGlzcGF0Y2hhYmxlLmdldENsYXNzKCkuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1swXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY3V0ZU0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHB1YmxpYyAiICsgbWV0aG9kTmFtZSArICIoKSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlzcGF0Y2hhYmxlLmdldENsYXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU0uaW52b2tlKGRpc3BhdGNoYWJsZSwgKE9iamVjdFtdKSBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFVua25vd25FbGVtZW50KSB0YXNrKS5zZXRSZWFsVGhpbmcobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc3BhdGNoYWJsZSBUYXNrIGF0dHJpYnV0ZSAnIiArIG5hbWUudHJpbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBub3Qgc2V0IG9yIHZhbHVlIGlzIGVtcHR5LiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlzcGF0Y2hhYmxlIFRhc2sgYXR0cmlidXRlICciICsgbmFtZS50cmltKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIG5vdCBzZXQgb3IgdmFsdWUgaXMgZW1wdHkuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb24gUGFyYW1ldGVyIE5hbWUgbXVzdCBub3QgYmUgZW1wdHkgZm9yIERpc3BhdGNoYWJsZSBUYXNrLiIpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1OYW1lID0gImdldCIgKyBuYW1lLnRyaW0oKS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSArPSBuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRGlzcGF0Y2hhYmxlPiBjID0gZGlzcGF0Y2hhYmxlLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBhY3Rpb25NID0gYy5nZXRNZXRob2QobU5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uTSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbyA9IGFjdGlvbk0uaW52b2tlKGRpc3BhdGNoYWJsZSwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc3BhdGNoYWJsZSBUYXNrIGF0dHJpYnV0ZSAnIiArIG5hbWUudHJpbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIG5vdCBzZXQgb3IgdmFsdWUgaXMgZW1wdHkuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lID0gby50b1N0cmluZygpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc3BhdGNoYWJsZSBUYXNrIGF0dHJpYnV0ZSAnIiArIG5hbWUudHJpbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgbm90IHNldCBvciB2YWx1ZSBpcyBlbXB0eS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCBleGVjdXRlTSA9IGRpc3BhdGNoYWJsZS5nZXRDbGFzcygpLmdldE1ldGhvZChtZXRob2ROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsgIigpIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXNwYXRjaGFibGUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTS5pbnZva2UoZGlzcGF0Y2hhYmxlLCAoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVW5rbm93bkVsZW1lbnQpIHRhc2spLnNldFJlYWxUaGluZyhudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHVibGljICIgKyBtTmFtZSArICIoKSBpbiAiICsgdGFzay5nZXRDbGFzcygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIE1ldGhvZCBleGVjdXRlTSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZU0gPSB0YXNrLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZU0gPSB0YXNrLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUpOwogICAgICAgICAgICAgICAgIGlmIChleGVjdXRlTSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHVibGljICIgKyBtZXRob2ROYW1lICsgIigpIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgdGFzay5nZXRDbGFzcygpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZU0uaW52b2tlKHRhc2ssIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZU0uaW52b2tlKHRhc2spOwogICAgICAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgKChVbmtub3duRWxlbWVudCkgdGFzaykuc2V0UmVhbFRoaW5nKG51bGwpOwogICAgICAgICAgICAgICAgIH0KQEAgLTExNSw5ICsxMDgsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2Rpc3BhdGNoL0Rpc3BhdGNoYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hhYmxlLmphdmEKaW5kZXggNDE2ODRmNC4uZjdmYTRhZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hhYmxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZGlzcGF0Y2gvRGlzcGF0Y2hhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0Jhc2VGaWx0ZXJSZWFkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZUZpbHRlclJlYWRlci5qYXZhCmluZGV4IGRmZDE2ZjEuLmZkYjY0MTYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZUZpbHRlclJlYWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZUZpbHRlclJlYWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9CYXNlUGFyYW1GaWx0ZXJSZWFkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQmFzZVBhcmFtRmlsdGVyUmVhZGVyLmphdmEKaW5kZXggNTRiYzlmZi4uNDA2MzIxZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9CYXNlUGFyYW1GaWx0ZXJSZWFkZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0Jhc2VQYXJhbUZpbHRlclJlYWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTgsNyArNTgsNyBAQAogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHVzZWQgYnkgdGhpcyBmaWx0ZXIuCiAgICAgICogICAgICAgICAgICAgICAgICAgU2hvdWxkIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGZpbmFsIFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRQYXJhbWV0ZXJzKGZpbmFsIFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CiAgICAgICAgIHNldEluaXRpYWxpemVkKGZhbHNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NoYWluYWJsZVJlYWRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9DaGFpbmFibGVSZWFkZXIuamF2YQppbmRleCA2NzA2MDM5Li5lYjc3NzBmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NoYWluYWJsZVJlYWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ2hhaW5hYmxlUmVhZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NsYXNzQ29uc3RhbnRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NsYXNzQ29uc3RhbnRzLmphdmEKaW5kZXggYjY4OTRmOS4uMWVjNmZhMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9DbGFzc0NvbnN0YW50cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ2xhc3NDb25zdGFudHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDkgKzIxLDkgQEAKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7CiAKIC8qKgogICogQXNzZW1ibGVzIHRoZSBjb25zdGFudHMgZGVjbGFyZWQgaW4gYSBKYXZhIGNsYXNzIGluCkBAIC04Niw0OSArODYsMzMgQEAKICAgICAgKiBiZSByZWFkIChmb3IgZXhhbXBsZSBkdWUgdG8gdGhlIGNsYXNzIG5vdCBiZWluZyBmb3VuZCkuCiAgICAgICovCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQogICAgICAgICBpbnQgY2ggPSAtMTsKIAotICAgICAgICBpZiAocXVldWVkRGF0YSAhPSBudWxsICYmIHF1ZXVlZERhdGEubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAocXVldWVkRGF0YSAhPSBudWxsICYmIHF1ZXVlZERhdGEuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBxdWV1ZWREYXRhID0gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChxdWV1ZWREYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoID0gcXVldWVkRGF0YS5jaGFyQXQoMCk7Ci0gICAgICAgICAgICBxdWV1ZWREYXRhID0gcXVldWVkRGF0YS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICBpZiAocXVldWVkRGF0YS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChxdWV1ZWREYXRhID09IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGF6eiA9IHJlYWRGdWxseSgpOwotICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwgfHwgY2xhenoubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNsYXp6ID09IG51bGwgfHwgY2xhenouaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgY2ggPSAtMTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gY2xhenouZ2V0Qnl0ZXMoUmVzb3VyY2VVdGlscy5JU09fODg1OV8xKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBjbGF6ei5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEpOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGphdmFDbGFzc0hlbHBlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKEpBVkFfQ0xBU1NfSEVMUEVSKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzSGVscGVyID0gQ2xhc3MuZm9yTmFtZShKQVZBX0NMQVNTX0hFTFBFUik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChqYXZhQ2xhc3NIZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBwYXJhbXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdLmNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIGdldENvbnN0YW50cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzSGVscGVyLmdldE1ldGhvZCgiZ2V0Q29uc3RhbnRzIiwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3MgPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YUNsYXNzSGVscGVyLmdldE1ldGhvZCgiZ2V0Q29uc3RhbnRzIiwgYnl0ZVtdLmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldENvbnN0YW50cyBpcyBhIHN0YXRpYyBtZXRob2QsIG5vIG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhc3MgaW4gdGhlIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gKFN0cmluZ0J1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRzLmludm9rZShudWxsLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29uc3RhbnRzLmludm9rZShudWxsLCAoT2JqZWN0KSBieXRlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IGV4OwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciB8IFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpOwpAQCAtMTQzLDYgKzEyNywxMiBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNoID0gcXVldWVkRGF0YS5jaGFyQXQoMCk7CisgICAgICAgICAgICBxdWV1ZWREYXRhID0gcXVldWVkRGF0YS5zdWJzdHJpbmcoMSk7CisgICAgICAgICAgICBpZiAocXVldWVkRGF0YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZWREYXRhID0gbnVsbDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2g7CiAgICAgfQpAQCAtMTU4LDcgKzE0OCw2IEBACiAgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHJlYWRlcgogICAgICAqLwogICAgIHB1YmxpYyBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgewotICAgICAgICBDbGFzc0NvbnN0YW50cyBuZXdGaWx0ZXIgPSBuZXcgQ2xhc3NDb25zdGFudHMocmRyKTsKLSAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0NvbnN0YW50cyhyZHIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NvbmNhdEZpbHRlci5qYXZhCmluZGV4IDgxNzU3MmYuLjY1YmJmZGMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Db25jYXRGaWx0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5MiwxMyArMTkyLDExIEBACiAgICAgICAgIGZpbmFsIFBhcmFtZXRlcltdIHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtcykgewotICAgICAgICAgICAgICAgIGlmICgicHJlcGVuZCIuZXF1YWxzKHBhcmFtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmICgicHJlcGVuZCIuZXF1YWxzKHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0UHJlcGVuZChuZXcgRmlsZShwYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoImFwcGVuZCIuZXF1YWxzKHBhcmFtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJhcHBlbmQiLmVxdWFscyhwYXJhbU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNldEFwcGVuZChuZXcgRmlsZShwYXJhbS5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Fc2NhcGVVbmljb2RlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGUuamF2YQppbmRleCBkZDQ1NDM5Li5mNjg1Y2JmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgyLDcgKzgyLDEwIEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgY2ggPSAtMTsKLSAgICAgICAgaWYgKHVuaWNvZGVCdWYubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAodW5pY29kZUJ1Zi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGNoID0gKGludCkgdW5pY29kZUJ1Zi5jaGFyQXQoMCk7CisgICAgICAgICAgICB1bmljb2RlQnVmLmRlbGV0ZUNoYXJBdCgwKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOwogICAgICAgICAgICAgaWYgKGNoICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgY2hhciBhY2hhciA9IChjaGFyKSBjaDsKQEAgLTkxLDkgKzk0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgY2ggPSAnXFwnOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoID0gKGludCkgdW5pY29kZUJ1Zi5jaGFyQXQoMCk7Ci0gICAgICAgICAgICB1bmljb2RlQnVmLmRlbGV0ZUNoYXJBdCgwKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2g7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9FeHBhbmRQcm9wZXJ0aWVzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0V4cGFuZFByb3BlcnRpZXMuamF2YQppbmRleCA0OGQ5ZmZlLi43NTA2ODFiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0V4cGFuZFByb3BlcnRpZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0V4cGFuZFByb3BlcnRpZXMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDYgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtOTgsMTMgKzk3LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlTZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eSA9IFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKHByb2plY3QpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBwcm9wZXJ0eVNldC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldFByb3BlcnR5ID0gbmV3IEdldFByb3BlcnR5KCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0eSA9IHByb3BlcnR5U2V0LmdldFByb3BlcnRpZXMoKTo6Z2V0UHJvcGVydHk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE9iamVjdCBleHBhbmRlZCA9IG5ldyBQYXJzZVByb3BlcnRpZXMocHJvamVjdCwgUHJvcGVydHlIZWxwZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eUhlbHBlcihwcm9qZWN0KQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9GaXhDckxmRmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0ZpeENyTGZGaWx0ZXIuamF2YQppbmRleCBiNWEwYWQyLi5mYTM2MzY2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0ZpeENyTGZGaWx0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0ZpeENyTGZGaWx0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI3Myw4ICsyNzMsOCBAQAogICAgICAgICAgICAgICAgIGluID0gbmV3IE1hc2tKYXZhVGFiTGl0ZXJhbHNGaWx0ZXIoaW4pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gQWRkL1JlbW92ZSB0YWJzCi0gICAgICAgICAgICBpbiA9ICh0YWJzID09IEFkZEFzaXNSZW1vdmUuQUREKSA/IChSZWFkZXIpIG5ldyBBZGRUYWJGaWx0ZXIoaW4sIGdldFRhYmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICA6IChSZWFkZXIpIG5ldyBSZW1vdmVUYWJGaWx0ZXIoaW4sIGdldFRhYmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGluID0gKHRhYnMgPT0gQWRkQXNpc1JlbW92ZS5BREQpID8gbmV3IEFkZFRhYkZpbHRlcihpbiwgZ2V0VGFibGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlbW92ZVRhYkZpbHRlcihpbiwgZ2V0VGFibGVuZ3RoKCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIEFkZCBtaXNzaW5nIEVPRiBjaGFyYWN0ZXIKICAgICAgICAgaW4gPSAoY3RybHogPT0gQWRkQXNpc1JlbW92ZS5BREQpID8gbmV3IEFkZEVvZkZpbHRlcihpbikgOiBpbjsKQEAgLTQ0MiwxMSArNDQyLDExIEBACiAgICAgICAgICAgICByZXR1cm4gaW4gaW5zdGFuY2VvZiBTaW1wbGVGaWx0ZXJSZWFkZXIgJiYgKChTaW1wbGVGaWx0ZXJSZWFkZXIpIGluKS5lZGl0c0Jsb2NrZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHJldHVybiBwcmVlbXB0SW5kZXggPiAwID8gcHJlZW1wdFstLXByZWVtcHRJbmRleF0gOiBpbi5yZWFkKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaW4uY2xvc2UoKTsKICAgICAgICAgfQogCkBAIC00NTgsMjMgKzQ1OCwyMyBAQAogICAgICAgICAgICAgcmV0dXJuIGluLm1hcmtTdXBwb3J0ZWQoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICByZXR1cm4gaW4ucmVhZHkoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IGkpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGluLm1hcmsoaSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgaSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHJldHVybiBpbi5za2lwKGkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICByZXR1cm4gcmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGludCByZWFkKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgICAgIGludCBjID0gMDsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9IZWFkRmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0hlYWRGaWx0ZXIuamF2YQppbmRleCAyOTgwNmIzLi5lODIzODY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0hlYWRGaWx0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0hlYWRGaWx0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICB3aGlsZSAobGluZSA9PSBudWxsIHx8IGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICB3aGlsZSAobGluZSA9PSBudWxsIHx8IGxpbmUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CiAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTg4LDEzICsxODgsMTEgQEAKICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwogICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExJTkVTX0tFWS5lcXVhbHMocGFyYW0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUgPSBwYXJhbS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKExJTkVTX0tFWS5lcXVhbHMocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IExvbmcucGFyc2VMb25nKHBhcmFtLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFNLSVBfS0VZLmVxdWFscyhwYXJhbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTS0lQX0tFWS5lcXVhbHMocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBza2lwID0gTG9uZy5wYXJzZUxvbmcocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9MaW5lQ29udGFpbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zLmphdmEKaW5kZXggYTU0OTI1MS4uY2IyZmZlMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9MaW5lQ29udGFpbnMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWlucy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKIAogLyoqCi0gKiBGaWx0ZXIgd2hpY2ggaW5jbHVkZXMgb25seSB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gYWxsIHRoZSB1c2VyLXNwZWNpZmllZAorICogRmlsdGVyIHdoaWNoIGluY2x1ZGVzIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIHRoZSB1c2VyLXNwZWNpZmllZAogICogc3RyaW5ncy4KICAqCiAgKiBFeGFtcGxlOgpAQCAtNDUsNiArNDUsMTkgQEAKICAqIFRoaXMgd2lsbCBpbmNsdWRlIG9ubHkgdGhvc2UgbGluZXMgdGhhdCBjb250YWluIDxjb2RlPmZvbzwvY29kZT4gYW5kCiAgKiA8Y29kZT5iYXI8L2NvZGU+LgogICoKKyAqIFN0YXJ0aW5nIEFudCAxLjEwLjQsIHRoZSB7QGNvZGUgbWF0Y2hBbnl9IGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgYW55IG9uZQorICogb2YgdGhlIHVzZXItc3BlY2lmaWVkIHN0cmluZ3MgaXMgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkIGluIHRoZSBsaW5lIG9yIGFsbAorICogb2YgdGhlbSBhcmUgZXhwZWN0ZWQgdG8gYmUgY29udGFpbmVkLgorICoKKyAqIEZvciBleGFtcGxlOgorICoKKyAqIDxwcmU+Jmx0O2xpbmVjb250YWlucyBtYXRjaEFueT0mcXVvdDt0cnVlJnF1b3Q7Jmd0OworICogICogICAmbHQ7Y29udGFpbnMgdmFsdWU9JnF1b3Q7Zm9vJnF1b3Q7Jmd0OworICogICogICAmbHQ7Y29udGFpbnMgdmFsdWU9JnF1b3Q7YmFyJnF1b3Q7Jmd0OworICogICogJmx0Oy9saW5lY29udGFpbnMmZ3Q7PC9wcmU+CisgKgorICogVGhpcyB3aWxsIGluY2x1ZGUgb25seSB0aG9zZSBsaW5lcyB0aGF0IGNvbnRhaW4gZWl0aGVyIDxjb2RlPmZvbzwvY29kZT4gb3IgPGNvZGU+YmFyPC9jb2RlPi4KKyAqCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBMaW5lQ29udGFpbnMKICAgICBleHRlbmRzIEJhc2VQYXJhbUZpbHRlclJlYWRlcgpAQCAtNTYsNyArNjksNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORUdBVEVfS0VZID0gIm5lZ2F0ZSI7CiAKICAgICAvKiogVmVjdG9yIHRoYXQgaG9sZHMgdGhlIHN0cmluZ3MgdGhhdCBpbnB1dCBsaW5lcyBtdXN0IGNvbnRhaW4uICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBjb250YWlucyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gY29udGFpbnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFJlbWFpbmluZyBsaW5lIHRvIGJlIHJlYWQgZnJvbSB0aGlzIGZpbHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKQEAgLTY3LDYgKzgwLDggQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGUgPSBmYWxzZTsKIAorICAgIHByaXZhdGUgYm9vbGVhbiBtYXRjaEFueSA9IGZhbHNlOworCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IgZm9yICJkdW1teSIgaW5zdGFuY2VzLgogICAgICAqCkBAIC0xMTYsOSArMTMxLDI0IEBACiAKICAgICAgICAgICAgIGZvciAobGluZSA9IHJlYWRMaW5lKCk7IGxpbmUgIT0gbnVsbDsgbGluZSA9IHJlYWRMaW5lKCkpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBtYXRjaGVzICYmIGkgPCBjb250YWluc1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29udGFpbnNTdHIgPSAoU3RyaW5nKSBjb250YWlucy5lbGVtZW50QXQoaSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluc1NpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29udGFpbnNTdHIgPSBjb250YWlucy5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBsaW5lLmNvbnRhaW5zKGNvbnRhaW5zU3RyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXRjaEFueSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb25lIGRpZG4ndCBtYXRjaCwgYnV0IHdlIGFyZSBleHBlY3RlZCB0byBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55IG9uZSBvZiB0aGVtIG1hdGNoLiBzbyB0cnkgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgd2VyZSBleHBlY3RlZCB0byBtYXRjaCwgYnV0IHRoaXMgb25lIGRpZG4ndC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBubyBwb2ludCBjaGVja2luZyB0aGUgcmVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWF0Y2hBbnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgZXhwZWN0ZWQgdG8gbWF0Y2ggYW55IG9mIHRoZSBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgb25lIGRpZC4gc28gbm8gbW9yZSBjaGVja3MgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyBeIGlzTmVnYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTU4LDYgKzE4OCwzMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoQW55IFRydWUgaWYgdGhpcyB7QGxpbmsgTGluZUNvbnRhaW5zfSBpcyBjb25zaWRlcmVkIGEgbWF0Y2gsCisgICAgICogICAgICAgICAgICAgICAgIGlmIHtAY29kZSBhbnl9IG9mIHRoZSB7QGNvZGUgY29udGFpbnN9IHZhbHVlIG1hdGNoLiBGYWxzZQorICAgICAqICAgICAgICAgICAgICAgICBpZiB7QGNvZGUgYWxsfSBvZiB0aGUge0Bjb2RlIGNvbnRhaW5zfSB2YWx1ZSBhcmUgZXhwZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgdG8gbWF0Y2gKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNAorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWF0Y2hBbnkoZmluYWwgYm9vbGVhbiBtYXRjaEFueSkgeworICAgICAgICB0aGlzLm1hdGNoQW55ID0gbWF0Y2hBbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhpcyB7QGxpbmsgTGluZUNvbnRhaW5zfSBpcyBjb25zaWRlcmVkIGEgbWF0Y2gsCisgICAgICogaWYge0Bjb2RlIGFueX0gb2YgdGhlIHtAY29kZSBjb250YWluc30gdmFsdWUgbWF0Y2guIEZhbHNlCisgICAgICogaWYge0Bjb2RlIGFsbH0gb2YgdGhlIHtAY29kZSBjb250YWluc30gdmFsdWUgYXJlIGV4cGVjdGVkCisgICAgICogdG8gbWF0Y2gKKyAgICAgKgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC40CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXRjaEFueSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hBbnk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmVjdG9yIG9mIHdvcmRzIHdoaWNoIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIGxpbmUgcmVhZAogICAgICAqIGZyb20gdGhlIG9yaWdpbmFsIHN0cmVhbSBpbiBvcmRlciBmb3IgaXQgdG8gbWF0Y2ggdGhpcyBmaWx0ZXIuCiAgICAgICoKQEAgLTE5NSw2ICsyNTAsNyBAQAogICAgICAgICBMaW5lQ29udGFpbnMgbmV3RmlsdGVyID0gbmV3IExpbmVDb250YWlucyhyZHIpOwogICAgICAgICBuZXdGaWx0ZXIuc2V0Q29udGFpbnMoZ2V0Q29udGFpbnMoKSk7CiAgICAgICAgIG5ld0ZpbHRlci5zZXROZWdhdGUoaXNOZWdhdGVkKCkpOworICAgICAgICBuZXdGaWx0ZXIuc2V0TWF0Y2hBbnkoaXNNYXRjaEFueSgpKTsKICAgICAgICAgcmV0dXJuIG5ld0ZpbHRlcjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zUmVnRXhwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWluc1JlZ0V4cC5qYXZhCmluZGV4IGIxOGUzNjIuLjEzMTJmZjMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zUmVnRXhwLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9MaW5lQ29udGFpbnNSZWdFeHAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU4LDcgKzU4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NfS0VZID0gImNhc2VzZW5zaXRpdmUiOwogCiAgICAgLyoqIFZlY3RvciB0aGF0IGhvbGRzIHRoZSBleHByZXNzaW9ucyB0aGF0IGlucHV0IGxpbmVzIG11c3QgY29udGFpbi4gKi8KLSAgICBwcml2YXRlIFZlY3RvcjxSZWd1bGFyRXhwcmVzc2lvbj4gcmVnZXhwcyA9IG5ldyBWZWN0b3I8UmVndWxhckV4cHJlc3Npb24+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8UmVndWxhckV4cHJlc3Npb24+IHJlZ2V4cHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFJlbWFpbmluZyBsaW5lIHRvIGJlIHJlYWQgZnJvbSB0aGlzIGZpbHRlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKQEAgLTExNiwxNSArMTE2LDEzIEBACiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKDEpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluYWwgaW50IHJlZ2V4cHNTaXplID0gcmVnZXhwcy5zaXplKCk7Ci0KICAgICAgICAgICAgIGZvciAobGluZSA9IHJlYWRMaW5lKCk7IGxpbmUgIT0gbnVsbDsgbGluZSA9IHJlYWRMaW5lKCkpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIG1hdGNoZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBtYXRjaGVzICYmIGkgPCByZWdleHBzU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJFeHByZXNzaW9uIHJlZ2V4cAotICAgICAgICAgICAgICAgICAgICAgICAgPSAoUmVndWxhckV4cHJlc3Npb24pIHJlZ2V4cHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgICAgICBSZWdleHAgcmUgPSByZWdleHAuZ2V0UmVnZXhwKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMgPSByZS5tYXRjaGVzKGxpbmUsIHJlZ2V4cE9wdGlvbnMpOworICAgICAgICAgICAgICAgIGZvciAoUmVndWxhckV4cHJlc3Npb24gcmVnZXhwIDogcmVnZXhwcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4cC5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKS5tYXRjaGVzKGxpbmUsIHJlZ2V4cE9wdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyBeIGlzTmVnYXRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTg4LDEwICsxODYsOCBAQAogICAgICAgICBMaW5lQ29udGFpbnNSZWdFeHAgbmV3RmlsdGVyID0gbmV3IExpbmVDb250YWluc1JlZ0V4cChyZHIpOwogICAgICAgICBuZXdGaWx0ZXIuc2V0UmVnZXhwcyhnZXRSZWdleHBzKCkpOwogICAgICAgICBuZXdGaWx0ZXIuc2V0TmVnYXRlKGlzTmVnYXRlZCgpKTsKLSAgICAgICAgbmV3RmlsdGVyCi0gICAgICAgICAgICAuc2V0Q2FzZVNlbnNpdGl2ZSghUmVnZXhwVXRpbC5oYXNGbGFnKHJlZ2V4cE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2V4cC5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgbmV3RmlsdGVyLnNldENhc2VTZW5zaXRpdmUoIVJlZ2V4cFV0aWwuaGFzRmxhZyhyZWdleHBPcHRpb25zLAorICAgICAgICAgICAgICAgIFJlZ2V4cC5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFKSk7CiAgICAgICAgIHJldHVybiBuZXdGaWx0ZXI7CiAgICAgfQogCkBAIC0yMjMsNyArMjE5LDcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhcyBhbiBhdHRyaWJ1dGUuCiAgICAgICogQHBhcmFtIHBhdHRlcm4gU3RyaW5nCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTAKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlZ2V4cChTdHJpbmcgcGF0dGVybikgewogICAgICAgICBSZWd1bGFyRXhwcmVzc2lvbiByZWdleHAgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTmF0aXZlMkFzY2lpRmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL05hdGl2ZTJBc2NpaUZpbHRlci5qYXZhCmluZGV4IDJlNzY0YWUuLjczMjI4MjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTmF0aXZlMkFzY2lpRmlsdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9OYXRpdmUyQXNjaWlGaWx0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgICAgdGhpcy5yZXZlcnNlID0gcmV2ZXJzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgbGluZSkgewogICAgICAgICByZXR1cm4gcmV2ZXJzZQogICAgICAgICAgICAgPyBOYXRpdmUyQXNjaWlVdGlscy5hc2NpaTJuYXRpdmUobGluZSkKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUHJlZml4TGluZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUHJlZml4TGluZXMuamF2YQppbmRleCBlMTI1YWEzLi44OTgyM2M3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1ByZWZpeExpbmVzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9QcmVmaXhMaW5lcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtODYsMTQgKzg2LDE0IEBACiAKICAgICAgICAgaW50IGNoID0gLTE7CiAKLSAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCAmJiBxdWV1ZWREYXRhLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCAmJiBxdWV1ZWREYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocXVldWVkRGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjaCA9IHF1ZXVlZERhdGEuY2hhckF0KDApOwogICAgICAgICAgICAgcXVldWVkRGF0YSA9IHF1ZXVlZERhdGEuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgaWYgKHF1ZXVlZERhdGEubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHF1ZXVlZERhdGEuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1JlcGxhY2VUb2tlbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vucy5qYXZhCmluZGV4IGEyYWM3MzIuLjQ1NjIxNzUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vucy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vucy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwpAQCAtNjIsMTAgKzYxLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRU5EX1RPS0VOID0gIkAiOwogCiAgICAgLyoqIEhhc2h0YWJsZSB0byBob2xkcyB0aGUgb3JpZ2luYWwgcmVwbGFjZWUtcmVwbGFjZXIgcGFpcnMgKFN0cmluZyB0byBTdHJpbmcpLiAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBoYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gaGFzaCA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqIFRoaXMgbWFwIGhvbGRzIHRoZSAicmVzb2x2ZWQiIHRva2VucyAoYmVnaW4tIGFuZCBlbmQtdG9rZW5zIGFyZSBhZGRlZCB0byBtYWtlIHNlYXJjaGluZyBzaW1wbGVyKSAqLwotICAgIHByaXZhdGUgZmluYWwgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gcmVzb2x2ZWRUb2tlbnMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc29sdmVkVG9rZW5zID0gbmV3IFRyZWVNYXA8PigpOwogICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlZFRva2Vuc0J1aWx0ID0gZmFsc2U7CiAgICAgLyoqIFVzZWQgZm9yIGNvbXBhcmlzb25zIGFuZCBsb29rdXAgaW50byB0aGUgcmVzb2x2ZWRUb2tlbnMgbWFwLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIHJlYWRCdWZmZXIgPSAiIjsKQEAgLTEzNCw3ICsxMzMsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gaXMgdGhlIHJlYWQgYnVmZmVyIGVtcHR5PwotICAgICAgICBpZiAocmVhZEJ1ZmZlci5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChyZWFkQnVmZmVyLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgaW50IG5leHQgPSBpbi5yZWFkKCk7CiAgICAgICAgICAgICBpZiAobmV4dCA9PSAtMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OyAvLyBlbmQgb2Ygc3RyZWFtLiBhbGwgYnVmZmVycyBlbXB0eS4KQEAgLTE2OSwxMyArMTY4LDEzIEBACiAgICAgICogQHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIGZyb20gdGhlIHJlYWQgYnVmZmVyIG9yIC0xIGlmIHJlYWQgYnVmZmVyIGlzIGVtcHR5LgogICAgICAqLwogICAgIHByaXZhdGUgaW50IGdldEZpcnN0Q2hhcmFjdGVyRnJvbVJlYWRCdWZmZXIoKSB7Ci0gICAgICAgIGlmIChyZWFkQnVmZmVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaW50IGNociA9IHJlYWRCdWZmZXIuY2hhckF0KDApOwotICAgICAgICAgICAgcmVhZEJ1ZmZlciA9IHJlYWRCdWZmZXIuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgcmV0dXJuIGNocjsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlYWRCdWZmZXIuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKworICAgICAgICBpbnQgY2hyID0gcmVhZEJ1ZmZlci5jaGFyQXQoMCk7CisgICAgICAgIHJlYWRCdWZmZXIgPSByZWFkQnVmZmVyLnN1YnN0cmluZygxKTsKKyAgICAgICAgcmV0dXJuIGNocjsKICAgICB9CiAKICAgICAvKioKQEAgLTMzMCwxMSArMzI5LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBtYWtlVG9rZW5zRnJvbVByb3BlcnRpZXMoUmVzb3VyY2UgcikgewogICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gZ2V0UHJvcGVydGllcyhyKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbjw/PiBlID0gcHJvcHMua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0gICAgICAgICAgICBoYXNoLnB1dChrZXksIHZhbHVlKTsKLSAgICAgICAgfQorICAgICAgICBwcm9wcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkuZm9yRWFjaChrZXkgLT4gaGFzaC5wdXQoa2V5LCBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1NvcnRGaWx0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU29ydEZpbHRlci5qYXZhCmluZGV4IGJlMDhhY2IuLmEwMjdhNWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU29ydEZpbHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU29ydEZpbHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEzLDcgKzIxMyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobGluZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIFdlIHJlYWQgYWxsIGxpbmVzIGFuZCBzb3J0IHRoZW0KLSAgICAgICAgICAgICAgICBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgIGxpbmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICAgICAgZm9yIChsaW5lID0gcmVhZExpbmUoKTsgbGluZSAhPSBudWxsOyBsaW5lID0gcmVhZExpbmUoKSkgewogICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQobGluZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBsaW5lID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxpbmUgPSBudWxsOwogICAgICAgICAgICAgICAgIGxpbmVzID0gbnVsbDsKQEAgLTMxMCwzNCArMzEwLDI2IEBACiAgICAgLyoqCiAgICAgICogU2NhbnMgdGhlIHBhcmFtZXRlcnMgbGlzdAogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKICAgICAgICAgLy8gZ2V0IHBhcmFtZXRlcnMKICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gZ2V0UGFyYW1ldGVycygpOwogICAgICAgICBpZiAocGFyYW1zICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtIDogcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IHBhcmFtLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoUkVWRVJTRV9LRVkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UmV2ZXJzZShCb29sZWFuLnZhbHVlT2YocGFyYW0uZ2V0VmFsdWUoKSkuYm9vbGVhblZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENPTVBBUkFUT1JfS0VZLmVxdWFscyhwYXJhbU5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFJldmVyc2UoQm9vbGVhbi52YWx1ZU9mKHBhcmFtLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTVBBUkFUT1JfS0VZLmVxdWFscyhwYXJhbU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgcGFyYW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBwYXJhbS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21wYXJhdG9yPD8gc3VwZXIgU3RyaW5nPiBjb21wYXJhdG9ySW5zdGFuY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoQ29tcGFyYXRvcjw/IHN1cGVyIFN0cmluZz4pIChDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb21wYXJhdG9yKGNvbXBhcmF0b3JJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIFByb2JhYmx5IGEgaW5uZXIgbm9uLXN0YXRpYyBjbGFzcywgdGhpcyB0aGlzIGNhc2UgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAqIG5vdCBjb25zaWRlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBJQUUgcHJvYmFibHkgbWVhbnMgYW4gaW5uZXIgbm9uLXN0YXRpYyBjbGFzcywgdGhhdCBjYXNlIGlzIG5vdCBjb25zaWRlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlZhbHVlIG9mIGNvbXBhcmF0b3IgYXR0cmlidXRlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgaW1wbGVtZW50IgpAQCAtMzU4LDE3ICszNTAsMTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc29ydCgpIHsKICAgICAgICAgaWYgKGNvbXBhcmF0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKHJldmVyc2UpIHsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpbmVzLCBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgtczEuY29tcGFyZVRvKHMyKSk7IC8vTk9TT05BUgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChpc1JldmVyc2UoKSkgeworICAgICAgICAgICAgICAgIGxpbmVzLnNvcnQoQ29tcGFyYXRvci5yZXZlcnNlT3JkZXIoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGluZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaW5lcywgY29tcGFyYXRvcik7CisgICAgICAgICAgICBsaW5lcy5zb3J0KGNvbXBhcmF0b3IpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpbmdJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpbmdJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGUxNTBlOTYuLjEwNmM4NTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaW5nSW5wdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmluZ0lucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzLmphdmEKaW5kZXggNjViY2NkNy4uNjJjNDYyNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcEphdmFDb21tZW50cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBKYXZhQ29tbWVudHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEzOSw3ICsxMzksNiBAQAogICAgICAqLwogCiAgICAgcHVibGljIFJlYWRlciBjaGFpbihmaW5hbCBSZWFkZXIgcmRyKSB7Ci0gICAgICAgIFN0cmlwSmF2YUNvbW1lbnRzIG5ld0ZpbHRlciA9IG5ldyBTdHJpcEphdmFDb21tZW50cyhyZHIpOwotICAgICAgICByZXR1cm4gbmV3RmlsdGVyOworICAgICAgICByZXR1cm4gbmV3IFN0cmlwSmF2YUNvbW1lbnRzKHJkcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVCcmVha3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBMaW5lQnJlYWtzLmphdmEKaW5kZXggOWJhNzBkZC4uMzVkNjUyNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVCcmVha3MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwTGluZUJyZWFrcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVDb21tZW50cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcExpbmVDb21tZW50cy5qYXZhCmluZGV4IDBkYmIzMDcuLmE4NWNkZGMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3RyaXBMaW5lQ29tbWVudHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwTGluZUNvbW1lbnRzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NSw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRTX0tFWSA9ICJjb21tZW50IjsKIAogICAgIC8qKiBWZWN0b3IgdGhhdCBob2xkcyB0aGUgY29tbWVudCBwcmVmaXhlcy4gKi8KLSAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGNvbW1lbnRzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBjb21tZW50cyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIFRoZSBsaW5lIHRoYXQgaGFzIGJlZW4gcmVhZCBhaGVhZC4gKi8KICAgICBwcml2YXRlIFN0cmluZyBsaW5lID0gbnVsbDsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3VmZml4TGluZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvU3VmZml4TGluZXMuamF2YQppbmRleCA5YzIyZDJiLi43NjEyN2EzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N1ZmZpeExpbmVzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdWZmaXhMaW5lcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtODcsMTcgKzg3LDExIEBACiAKICAgICAgICAgaW50IGNoID0gLTE7CiAKLSAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCAmJiBxdWV1ZWREYXRhLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgaWYgKHF1ZXVlZERhdGEgIT0gbnVsbCAmJiBxdWV1ZWREYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcXVldWVkRGF0YSA9IG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocXVldWVkRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjaCA9IHF1ZXVlZERhdGEuY2hhckF0KDApOwotICAgICAgICAgICAgcXVldWVkRGF0YSA9IHF1ZXVlZERhdGEuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgaWYgKHF1ZXVlZERhdGEubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAocXVldWVkRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICBxdWV1ZWREYXRhID0gcmVhZExpbmUoKTsKICAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjaCA9IC0xOwpAQCAtMTE2LDYgKzExMCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCgpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2ggPSBxdWV1ZWREYXRhLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBxdWV1ZWREYXRhLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIGlmIChxdWV1ZWREYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHF1ZXVlZERhdGEgPSBudWxsOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjaDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1RhYnNUb1NwYWNlcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9UYWJzVG9TcGFjZXMuamF2YQppbmRleCAxNWM3YzUwLi40M2ZiZTU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1RhYnNUb1NwYWNlcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFic1RvU3BhY2VzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1RhaWxGaWx0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFpbEZpbHRlci5qYXZhCmluZGV4IDBmMjY0OTYuLmQ1MGE0NzMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFpbEZpbHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVGFpbEZpbHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjYsNyArNjYsNyBAQAogICAgIC8qKiB0aGUgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQgbGluZSAqLwogICAgIHByaXZhdGUgaW50ICAgICAgIGxpbmVQb3MgICA9IDA7CiAKLSAgICBwcml2YXRlIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lTGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5lTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIGZvciAiZHVtbXkiIGluc3RhbmNlcy4KQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQodHJ1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICB3aGlsZSAobGluZSA9PSBudWxsIHx8IGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICB3aGlsZSAobGluZSA9PSBudWxsIHx8IGxpbmUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CiAgICAgICAgICAgICBsaW5lID0gdGFpbEZpbHRlcihsaW5lKTsKICAgICAgICAgICAgIGlmIChsaW5lID09IG51bGwpIHsKQEAgLTE4OCwxMyArMTg4LDExIEBACiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IGdldFBhcmFtZXRlcnMoKTsKICAgICAgICAgaWYgKHBhcmFtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IHBhcmFtcykgewotICAgICAgICAgICAgICAgIGlmIChMSU5FU19LRVkuZXF1YWxzKHBhcmFtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW0uZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIGlmIChMSU5FU19LRVkuZXF1YWxzKHBhcmFtTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0TGluZXMoTG9uZy5wYXJzZUxvbmcocGFyYW0uZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFNLSVBfS0VZLmVxdWFscyhwYXJhbS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTS0lQX0tFWS5lcXVhbHMocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBza2lwID0gTG9uZy5wYXJzZUxvbmcocGFyYW0uZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlci5qYXZhCmluZGV4IDdkYTAwY2QuLjQ0MWNmOWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVG9rZW5GaWx0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1Rva2VuRmlsdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw2IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC01OSwxNSArNTgsMTUgQEAKIAogCiAgICAgLyoqIHN0cmluZyBmaWx0ZXJzICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8RmlsdGVyPiAgICBmaWx0ZXJzICAgPSBuZXcgVmVjdG9yPEZpbHRlcj4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWx0ZXI+IGZpbHRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAvKiogdGhlIHRva2VuaXplciB0byB1c2Ugb24gdGhlIGlucHV0IHN0cmVhbSAqLwogICAgIHByaXZhdGUgVG9rZW5pemVyIHRva2VuaXplciA9IG51bGw7CiAgICAgLyoqIHRoZSBvdXRwdXQgdG9rZW4gdGVybWluYXRpb24gKi8KLSAgICBwcml2YXRlIFN0cmluZyAgICBkZWxpbU91dHB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1PdXRwdXQgPSBudWxsOwogICAgIC8qKiB0aGUgY3VycmVudCBzdHJpbmcgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgICAgbGluZSAgICAgID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBsaW5lICAgID0gbnVsbDsKICAgICAvKiogdGhlIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IHN0cmluZyB0b2tlbiAqLwotICAgIHByaXZhdGUgaW50ICAgICAgIGxpbmVQb3MgICA9IDA7CisgICAgcHJpdmF0ZSBpbnQgICAgbGluZVBvcyA9IDA7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvciBmb3IgImR1bW15IiBpbnN0YW5jZXMuCkBAIC0xMDUsMjYgKzEwNCwyMyBAQAogICAgICAgICBpZiAodG9rZW5pemVyID09IG51bGwpIHsKICAgICAgICAgICAgIHRva2VuaXplciA9IG5ldyBMaW5lVG9rZW5pemVyKCk7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgd2hpbGUgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbGluZSA9IHRva2VuaXplci5nZXRUb2tlbihpbik7CiAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxGaWx0ZXI+IGUgPSBmaWx0ZXJzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGZvciAoRmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKICAgICAgICAgICAgICAgICBsaW5lID0gZmlsdGVyLmZpbHRlcihsaW5lKTsKICAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxpbmVQb3MgPSAwOwotICAgICAgICAgICAgaWYgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICh0b2tlbml6ZXIuZ2V0UG9zdFRva2VuKCkubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsaW1PdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyBkZWxpbU91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgdG9rZW5pemVyLmdldFBvc3RUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsICYmICF0b2tlbml6ZXIuZ2V0UG9zdFRva2VuKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGltT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSBkZWxpbU91dHB1dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaW5lICs9IHRva2VuaXplci5nZXRQb3N0VG9rZW4oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4MCw3ICszNzYsNyBAQAogICAgICAgICAgICAgd2hpbGUgKGZvdW5kID49IDApIHsKICAgICAgICAgICAgICAgICAvLyB3cml0ZSBldmVyeXRoaW5nIHVwIHRvIHRoZSBmcm9tCiAgICAgICAgICAgICAgICAgaWYgKGZvdW5kID4gc3RhcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChsaW5lLnN1YnN0cmluZyhzdGFydCwgZm91bmQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChsaW5lLCBzdGFydCwgZm91bmQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSByZXBsYWNlbWVudCB0bwpAQCAtMzk1LDcgKzM5MSw3IEBACiAKICAgICAgICAgICAgIC8vIHdyaXRlIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycwogICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiBzdGFydCkgewotICAgICAgICAgICAgICAgIHJldC5hcHBlbmQobGluZS5zdWJzdHJpbmcoc3RhcnQsIGxpbmUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICByZXQuYXBwZW5kKGxpbmUsIHN0YXJ0LCBsaW5lLmxlbmd0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHJldC50b1N0cmluZygpOwpAQCAtNTk0LDcgKzU5MCw3IEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIHRyaW1tZWQgbGluZQogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGluZS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbGluZTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVW5pcUZpbHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9VbmlxRmlsdGVyLmphdmEKaW5kZXggMjk4M2I2Yy4uZGZiODRmZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9VbmlxRmlsdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9VbmlxRmlsdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL3V0aWwvQ2hhaW5SZWFkZXJIZWxwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9DaGFpblJlYWRlckhlbHBlci5qYXZhCmluZGV4IGYxNzZjMzMuLjk5ZWM3NzMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9DaGFpblJlYWRlckhlbHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9DaGFpblJlYWRlckhlbHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsOSArMjMsMTMgQEAKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTM0LDcgKzM4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLkNoYWluYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BbnRGaWx0ZXJSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyQ2hhaW47Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcml6YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwpAQCAtNDQsNiArNDcsMzcgQEAKICAqCiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDaGFpblJlYWRlckhlbHBlciB7CisgICAgLyoqCisgICAgICogQ3JlYXRlZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBDaGFpblJlYWRlciBleHRlbmRzIEZpbHRlclJlYWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBMaXN0PEFudENsYXNzTG9hZGVyPiBjbGVhbnVwTG9hZGVyczsKKworICAgICAgICBwcml2YXRlIENoYWluUmVhZGVyKFJlYWRlciBpbiwgTGlzdDxBbnRDbGFzc0xvYWRlcj4gY2xlYW51cExvYWRlcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGluKTsKKyAgICAgICAgICAgIHRoaXMuY2xlYW51cExvYWRlcnMgPSBjbGVhbnVwTG9hZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZ1bGx5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBDaGFpblJlYWRlckhlbHBlci50aGlzLnJlYWRGdWxseSh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjbGVhblVwQ2xhc3NMb2FkZXJzKGNsZWFudXBMb2FkZXJzKTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAogICAgIC8vIGRlZmF1bHQgYnVmZmVyIHNpemUKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDgxOTI7CkBAIC02MSw3ICs5NSw3IEBACiAgICAgLyoqCiAgICAgICogQ2hhaW4gb2YgZmlsdGVycwogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KCk7CisgICAgcHVibGljIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogVGhlIEFudCBwcm9qZWN0ICovCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3QgPSBudWxsOwpAQCAtNjksNyArMTAzLDI1IEBACiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KIAogICAgIC8qKgotICAgICAqIFNldHMgdGhlIHByaW1hcnkgcmVhZGVyCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhaW5SZWFkZXJIZWxwZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHByb2plY3QgZGl0dG8KKyAgICAgKiBAcGFyYW0gcHJpbWFyeVJlYWRlciBkaXR0bworICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbnMgZGl0dG8KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhaW5SZWFkZXJIZWxwZXIoUHJvamVjdCBwcm9qZWN0LCBSZWFkZXIgcHJpbWFyeVJlYWRlciwKKyAgICAgICAgSXRlcmFibGU8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucykgeworICAgICAgICB3aXRoUHJvamVjdChwcm9qZWN0KS53aXRoUHJpbWFyeVJlYWRlcihwcmltYXJ5UmVhZGVyKQorICAgICAgICAgICAgLndpdGhGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcmltYXJ5IHtAbGluayBSZWFkZXJ9CiAgICAgICogQHBhcmFtIHJkciB0aGUgcmVhZGVyIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByaW1hcnlSZWFkZXIoUmVhZGVyIHJkcikgewpAQCAtNzcsNiArMTI5LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRmx1ZW50IHByaW1hcnkge0BsaW5rIFJlYWRlcn0gbXV0YXRvci4KKyAgICAgKiBAcGFyYW0gcmRyIFJlYWRlcgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisgICAgICovCisgICAgcHVibGljIENoYWluUmVhZGVySGVscGVyIHdpdGhQcmltYXJ5UmVhZGVyKFJlYWRlciByZHIpIHsKKyAgICAgICAgc2V0UHJpbWFyeVJlYWRlcihyZHIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIHByb2plY3QgdG8gd29yayB3aXRoCiAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdAogICAgICAqLwpAQCAtODUsNiArMTQ3LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRmx1ZW50IHtAbGluayBQcm9qZWN0fSBtdXRhdG9yLgorICAgICAqIEBwYXJhbSBwcm9qZWN0IGRpdHRvCisgICAgICogQHJldHVybiB7QGNvZGUgdGhpc30KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhaW5SZWFkZXJIZWxwZXIgd2l0aFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgogICAgICAqIEdldCB0aGUgcHJvamVjdAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBwcm9qZWN0CkBAIC0xMDMsNiArMTc1LDE2IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogRmx1ZW50IGJ1ZmZlciBzaXplIG11dGF0b3IuCisgICAgICogQHBhcmFtIHNpemUgZGl0dG8KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorICAgICAqLworICAgIHB1YmxpYyBDaGFpblJlYWRlckhlbHBlciB3aXRoQnVmZmVyU2l6ZShpbnQgc2l6ZSkgeworICAgICAgICBzZXRCdWZmZXJTaXplKHNpemUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb2xsZWN0aW9uIG9mIGZpbHRlciByZWFkZXIgc2V0cwogICAgICAqCiAgICAgICogQHBhcmFtIGZjaGFpbiB0aGUgZmlsdGVyIGNoYWlucyBjb2xsZWN0aW9uCkBAIC0xMTIsNDIgKzE5NCw1NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEZsdWVudCB7QGNvZGUgZmlsdGVyQ2hhaW5zfSBtdXRhdG9yLgorICAgICAqIEBwYXJhbSBmaWx0ZXJDaGFpbnMgZGl0dG8KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQorICAgICAqLworICAgIHB1YmxpYyBDaGFpblJlYWRlckhlbHBlciB3aXRoRmlsdGVyQ2hhaW5zKEl0ZXJhYmxlPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMpIHsKKyAgICAgICAgZmluYWwgVmVjdG9yPEZpbHRlckNoYWluPiBmY3M7CisgICAgICAgIGlmIChmaWx0ZXJDaGFpbnMgaW5zdGFuY2VvZiBWZWN0b3I8Pz4pIHsKKyAgICAgICAgICAgIGZjcyA9IChWZWN0b3I8RmlsdGVyQ2hhaW4+KSBmaWx0ZXJDaGFpbnM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmY3MgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAgICAgICAgIGZpbHRlckNoYWlucy5mb3JFYWNoKGZjczo6YWRkKTsKKyAgICAgICAgfQorICAgICAgICBzZXRGaWx0ZXJDaGFpbnMoZmNzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1ZW50IG1lY2hhbmlzbSB0byBhcHBseSBzb21lIHtAbGluayBDb25zdW1lcn0uCisgICAgICogQHBhcmFtIGNvbnN1bWVyIGRpdHRvCisgICAgICogQHJldHVybiB7QGNvZGUgdGhpc30KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhaW5SZWFkZXJIZWxwZXIgd2l0aChDb25zdW1lcjxDaGFpblJlYWRlckhlbHBlcj4gY29uc3VtZXIpIHsKKyAgICAgICAgY29uc3VtZXIuYWNjZXB0KHRoaXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBc3NlbWJsZSB0aGUgcmVhZGVyCiAgICAgICogQHJldHVybiB0aGUgYXNzZW1ibGVkIHJlYWRlcgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCi0gICAgcHVibGljIFJlYWRlciBnZXRBc3NlbWJsZWRSZWFkZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIHB1YmxpYyBDaGFpblJlYWRlciBnZXRBc3NlbWJsZWRSZWFkZXIoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAocHJpbWFyeVJlYWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByaW1hcnlSZWFkZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFJlYWRlciBpbnN0cmVhbSA9IHByaW1hcnlSZWFkZXI7Ci0gICAgICAgIGZpbmFsIGludCBmaWx0ZXJSZWFkZXJzQ291bnQgPSBmaWx0ZXJDaGFpbnMuc2l6ZSgpOwotICAgICAgICBmaW5hbCBWZWN0b3I8T2JqZWN0PiBmaW5hbEZpbHRlcnMgPSBuZXcgVmVjdG9yPE9iamVjdD4oKTsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFudENsYXNzTG9hZGVyPiBjbGFzc0xvYWRlcnNUb0NsZWFuVXAgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxBbnRDbGFzc0xvYWRlcj4oKTsKKyAgICAgICAgZmluYWwgTGlzdDxBbnRDbGFzc0xvYWRlcj4gY2xhc3NMb2FkZXJzVG9DbGVhblVwID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJSZWFkZXJzQ291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgRmlsdGVyQ2hhaW4gZmlsdGVyY2hhaW4gPQotICAgICAgICAgICAgICAgIGZpbHRlckNoYWlucy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBWZWN0b3I8T2JqZWN0PiBmaWx0ZXJSZWFkZXJzID0gZmlsdGVyY2hhaW4uZ2V0RmlsdGVyUmVhZGVycygpOwotICAgICAgICAgICAgZmluYWwgaW50IHJlYWRlckNvdW50ID0gZmlsdGVyUmVhZGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlYWRlckNvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbEZpbHRlcnMuYWRkRWxlbWVudChmaWx0ZXJSZWFkZXJzLmVsZW1lbnRBdChqKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGZpbmFsRmlsdGVycyA9CisgICAgICAgICAgICBmaWx0ZXJDaGFpbnMuc3RyZWFtKCkubWFwKEZpbHRlckNoYWluOjpnZXRGaWx0ZXJSZWFkZXJzKQorICAgICAgICAgICAgICAgIC5mbGF0TWFwKENvbGxlY3Rpb246OnN0cmVhbSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKIAotICAgICAgICBmaW5hbCBpbnQgZmlsdGVyc0NvdW50ID0gZmluYWxGaWx0ZXJzLnNpemUoKTsKLQotICAgICAgICBpZiAoZmlsdGVyc0NvdW50ID4gMCkgeworICAgICAgICBpZiAoIWZpbmFsRmlsdGVycy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnNDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZmluYWxGaWx0ZXJzLmVsZW1lbnRBdChpKTsKLQorICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBmaW5hbEZpbHRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBBbnRGaWx0ZXJSZWFkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RyZWFtID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRSZWFkZXIoKEFudEZpbHRlclJlYWRlcikgZmluYWxGaWx0ZXJzLmVsZW1lbnRBdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRSZWFkZXIoKEFudEZpbHRlclJlYWRlcikgbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJlYW0sIGNsYXNzTG9hZGVyc1RvQ2xlYW5VcCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIENoYWluYWJsZVJlYWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdE9uT2JqZWN0KG8pOwpAQCAtMTU3LDI2ICsyNTMsMTIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IHRydWU7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcyAmJiBjbGFzc0xvYWRlcnNUb0NsZWFuVXAuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmICghc3VjY2VzcyAmJiAhY2xhc3NMb2FkZXJzVG9DbGVhblVwLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBjbGVhblVwQ2xhc3NMb2FkZXJzKGNsYXNzTG9hZGVyc1RvQ2xlYW5VcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFJlYWRlciBmaW5hbFJlYWRlciA9IGluc3RyZWFtOwotICAgICAgICByZXR1cm4gY2xhc3NMb2FkZXJzVG9DbGVhblVwLnNpemUoKSA9PSAwID8gZmluYWxSZWFkZXIKLSAgICAgICAgICAgIDogbmV3IEZpbHRlclJlYWRlcihmaW5hbFJlYWRlcikgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5VcENsYXNzTG9hZGVycyhjbGFzc0xvYWRlcnNUb0NsZWFuVXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OworICAgICAgICByZXR1cm4gbmV3IENoYWluUmVhZGVyKGluc3RyZWFtLCBjbGFzc0xvYWRlcnNUb0NsZWFuVXApOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk5LDkgKzI4MSw3IEBACiAgICAgICogRGVyZWdpc3RlcnMgQ2xhc3Nsb2FkZXJzIGZyb20gdGhlIHByb2plY3Qgc28gR0MgY2FuIHJlbW92ZSB0aGVtIGxhdGVyLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW5VcENsYXNzTG9hZGVycyhMaXN0PEFudENsYXNzTG9hZGVyPiBsb2FkZXJzKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3I8QW50Q2xhc3NMb2FkZXI+IGl0ID0gbG9hZGVycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpdC5uZXh0KCkuY2xlYW51cCgpOwotICAgICAgICB9CisgICAgICAgIGxvYWRlcnMuZm9yRWFjaChBbnRDbGFzc0xvYWRlcjo6Y2xlYW51cCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTEsOCArMjkxLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZSBhcyBhIHN0cmluZwogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCi0gICAgcHVibGljIFN0cmluZyByZWFkRnVsbHkoUmVhZGVyIHJkcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRGdWxseShSZWFkZXIgcmRyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gRmlsZVV0aWxzLnJlYWRGdWxseShyZHIsIGJ1ZmZlclNpemUpOwogICAgIH0KIApAQCAtMjI3LDU3ICszMDYsNDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBbnRDbGFzc0xvYWRlcj4gY2xhc3NMb2FkZXJzVG9DbGVhblVwKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBmaWx0ZXIuZ2V0Q2xhc3NOYW1lKCk7CiAgICAgICAgIGZpbmFsIFBhdGggY2xhc3NwYXRoID0gZmlsdGVyLmdldENsYXNzcGF0aCgpOwotICAgICAgICBmaW5hbCBQcm9qZWN0IHBybyA9IGZpbHRlci5nZXRQcm9qZWN0KCk7CiAgICAgICAgIGlmIChjbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGFsID0gcHJvLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGNsYXNzTG9hZGVyc1RvQ2xlYW5VcC5hZGQoYWwpOwotICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBhbCk7CisgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEZpbHRlclJlYWRlcj4gY2xheno7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKEZpbHRlclJlYWRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NMb2FkZXJzVG9DbGVhblVwLmFkZChhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNTdWJjbGFzcyhGaWx0ZXJSZWFkZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgZG9lcyBub3QgZXh0ZW5kICVzIiwgY2xhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUmVhZGVyLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRmlsdGVyUmVhZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oY2xhc3NOYW1lICsgIiBkb2VzIG5vdCBleHRlbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGphdmEuaW8uRmlsdGVyUmVhZGVyIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz5bXSBjb25zdHJ1Y3RvcnMgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGogPSAwOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbnNQcmVzZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgY29uc3RydWN0b3JzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PltdIHR5cGVzID0gY29uc3RydWN0b3JzW2pdLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMubGVuZ3RoID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlc1swXS5pc0Fzc2lnbmFibGVGcm9tKFJlYWRlci5jbGFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zUHJlc2VudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25zUHJlc2VudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgZG9lcyBub3QgZGVmaW5lIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhIHB1YmxpYyBjb25zdHJ1Y3RvciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhhdCB0YWtlcyBpbiBhIFJlYWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgaXRzIHNpbmdsZSBhcmd1bWVudC4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWFkZXJbXSByZHIgPSB7YW5jZXN0b3J9OwotICAgICAgICAgICAgICAgICAgICBSZWFkZXIgaW5zdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgKFJlYWRlcikgY29uc3RydWN0b3JzW2pdLm5ld0luc3RhbmNlKChPYmplY3RbXSkgcmRyKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdE9uT2JqZWN0KGluc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBhcmFtZXRlcml6YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyW10gcGFyYW1zID0gZmlsdGVyLmdldFBhcmFtcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgKChQYXJhbWV0ZXJpemFibGUpIGluc3RyZWFtKS5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RyZWFtOworICAgICAgICAgICAgICAgIE9wdGlvbmFsPENvbnN0cnVjdG9yPD8+PiBjdG9yID0KKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtLm9mKGNsYXp6LmdldENvbnN0cnVjdG9ycygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IGMuZ2V0UGFyYW1ldGVyQ291bnQoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYy5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc0Fzc2lnbmFibGVGcm9tKFJlYWRlci5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgaW5zdHJlYW0gPSBjdG9yCisgICAgICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3QgZGVmaW5lIGEgcHVibGljIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgaW4gYSAlcyBhcyBpdHMgc2luZ2xlIGFyZ3VtZW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsIFJlYWRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoYW5jZXN0b3IpOworCisgICAgICAgICAgICAgICAgc2V0UHJvamVjdE9uT2JqZWN0KGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoUGFyYW1ldGVyaXphYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgICAgICgoUGFyYW1ldGVyaXphYmxlKSBpbnN0cmVhbSkuc2V0UGFyYW1ldGVycyhmaWx0ZXIuZ2V0UGFyYW1zKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihjbmZlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaWFlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGl0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIChSZWFkZXIpIGluc3RyZWFtOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gQW50IDEuNy4xIGFuZCBlYXJsaWVyIGlnbm9yZSA8ZmlsdGVycmVhZGVyPiB3aXRob3V0IGEKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9KYXZhQ2xhc3NIZWxwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvdXRpbC9KYXZhQ2xhc3NIZWxwZXIuamF2YQppbmRleCA0ZTk3NTIxLi5hOTg2NzhjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL3V0aWwvSmF2YUNsYXNzSGVscGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy91dGlsL0phdmFDbGFzc0hlbHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5jbGFzc2ZpbGUuQ2xhc3NQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5Db25zdGFudFZhbHVlOwogaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5jbGFzc2ZpbGUuRmllbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5KYXZhQ2xhc3M7CiAKIC8vIENoZWNrU3R5bGU6SGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yQ2hlY2sgT0ZGIC0gYmMKIC8qKgpAQCAtMzEsOSArMzAsNiBAQAogICoKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEphdmFDbGFzc0hlbHBlciB7Ci0gICAgLyoqIFN5c3RlbSBzcGVjaWZpYyBsaW5lIHNlcGFyYXRvci4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGNvbnN0YW50cyBkZWNsYXJlZCBpbiBhIGZpbGUgYXMgbmFtZT12YWx1ZQogICAgICAqCkBAIC00NiwyMSArNDIsMTYgQEAKICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwogICAgICAgICBmaW5hbCBDbGFzc1BhcnNlciBwYXJzZXIgPSBuZXcgQ2xhc3NQYXJzZXIoYmlzLCAiIik7Ci0gICAgICAgIGZpbmFsIEphdmFDbGFzcyBqYXZhQ2xhc3MgPSBwYXJzZXIucGFyc2UoKTsKLSAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBqYXZhQ2xhc3MuZ2V0RmllbGRzKCk7Ci0gICAgICAgIGZvciAoZmluYWwgRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBGaWVsZCBmaWVsZCA6IHBhcnNlci5wYXJzZSgpLmdldEZpZWxkcygpKSB7CiAgICAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0YW50VmFsdWUgY3YgPSBmaWVsZC5nZXRDb25zdGFudFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN2cyA9IGN2LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHN0YXJ0IGFuZCBlbmQgcXVvdGVzIGlmIGZpZWxkIGlzIGEgU3RyaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdGFydCBhbmQgZW5kIHF1b3RlcyBpZiBmaWVsZCBpcyBhIFN0cmluZwogICAgICAgICAgICAgICAgICAgICBpZiAoY3ZzLnN0YXJ0c1dpdGgoIlwiIikgJiYgY3ZzLmVuZHNXaXRoKCJcIiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjdnMgPSBjdnMuc3Vic3RyaW5nKDEsIGN2cy5sZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmaWVsZC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGN2cyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChMUyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlcz0lcyVuIiwgZmllbGQuZ2V0TmFtZSgpLCBjdnMpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9BbnRYTUxDb250ZXh0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvQW50WE1MQ29udGV4dC5qYXZhCmluZGV4IDM5M2FkNWMuLmUwZmFjYmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9BbnRYTUxDb250ZXh0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0FudFhNTENvbnRleHQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgKiBkZWZpbmVkLiBQcm9qZWN0IG1haW50YWlucyBhIEhhc2h0YWJsZSwgd2hpY2ggaXMgbm90IG9yZGVyZWQuCiAgICAgICogVGhpcyB3aWxsIGFsbG93IGRlc2NyaXB0aW9uIHRvIGtub3cgdGhlIG9yaWdpbmFsIG9yZGVyLgogICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yPFRhcmdldD4gdGFyZ2V0VmVjdG9yID0gbmV3IFZlY3RvcjxUYXJnZXQ+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8VGFyZ2V0PiB0YXJnZXRWZWN0b3IgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWxkIGZpbGUuIFVzZWQgZm9yIHJlc29sdmluZyBlbnRpdGllcwpAQCAtOTEsNyArOTEsNyBAQAogICAgIC8qKiBUaGUgc3RhY2sgb2YgUnVudGltZUNvbmZpZ3VyYWJsZTIgd3JhcHBpbmcgdGhlCiAgICAgICAgIG9iamVjdHMuCiAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxSdW50aW1lQ29uZmlndXJhYmxlPiB3U3RhY2sgPSBuZXcgVmVjdG9yPFJ1bnRpbWVDb25maWd1cmFibGU+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8UnVudGltZUNvbmZpZ3VyYWJsZT4gd1N0YWNrID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJvamVjdCB0YWcgYXR0cmlidXRlcyBhcmUgdG8gYmUgaWdub3JlZApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVByb2plY3RUYWcgPSBmYWxzZTsKIAogICAgIC8qKiBLZWVwcyB0cmFjayBvZiBwcmVmaXggLT4gdXJpIG1hcHBpbmcgZHVyaW5nIHBhcnNpbmcgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gcHJlZml4TWFwcGluZyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBwcmVmaXhNYXBwaW5nID0gbmV3IEhhc2hNYXA8PigpOwogCiAKICAgICAvKiogS2VlcHMgdHJhY2sgb2YgdGFyZ2V0cyBpbiBmaWxlcyAqLwpAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIGlmICh3U3RhY2suc2l6ZSgpIDwgMSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChSdW50aW1lQ29uZmlndXJhYmxlKSB3U3RhY2suZWxlbWVudEF0KHdTdGFjay5zaXplKCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIHdTdGFjay5lbGVtZW50QXQod1N0YWNrLnNpemUoKSAtIDEpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgIGlmICh3U3RhY2suc2l6ZSgpIDwgMikgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChSdW50aW1lQ29uZmlndXJhYmxlKSB3U3RhY2suZWxlbWVudEF0KHdTdGFjay5zaXplKCkgLSAyKTsKKyAgICAgICAgcmV0dXJuIHdTdGFjay5lbGVtZW50QXQod1N0YWNrLnNpemUoKSAtIDIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzYyLDExICszNjIsNyBAQAogICAgICAqIEBwYXJhbSB1cmkgICAgYSBuYW1lc3BhY2UgdXJpCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBwcmVmaXhNYXBwaW5nLmdldChwcmVmaXgpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBwcmVmaXhNYXBwaW5nLnB1dChwcmVmaXgsIGxpc3QpOwotICAgICAgICB9CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gcHJlZml4TWFwcGluZy5jb21wdXRlSWZBYnNlbnQocHJlZml4LCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKTsKICAgICAgICAgbGlzdC5hZGQodXJpKTsKICAgICB9CiAKQEAgLTM3Nyw3ICszNzMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVuZFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCkgewogICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IHByZWZpeE1hcHBpbmcuZ2V0KHByZWZpeCk7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwgfHwgbGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm47IC8vIFNob3VsZCBub3QgaGFwcGVuCiAgICAgICAgIH0KICAgICAgICAgbGlzdC5yZW1vdmUobGlzdC5zaXplKCkgLSAxKTsKQEAgLTM5MSwxMCArMzg3LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhNYXBwaW5nKFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBwcmVmaXhNYXBwaW5nLmdldChwcmVmaXgpOwotICAgICAgICBpZiAobGlzdCA9PSBudWxsIHx8IGxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmcpIGxpc3QuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7CisgICAgICAgIHJldHVybiBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0RlZmF1bHRFeGVjdXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL0RlZmF1bHRFeGVjdXRvci5qYXZhCmluZGV4IGRiZGQzNmUuLmE1NjU5OWIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9EZWZhdWx0RXhlY3V0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvRGVmYXVsdEV4ZWN1dG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvSWdub3JlRGVwZW5kZW5jaWVzRXhlY3V0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9JZ25vcmVEZXBlbmRlbmNpZXNFeGVjdXRvci5qYXZhCmluZGV4IGJlMGEyODkuLjk1MDM1MzAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9JZ25vcmVEZXBlbmRlbmNpZXNFeGVjdXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9JZ25vcmVEZXBlbmRlbmNpZXNFeGVjdXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXIyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlcjIuamF2YQppbmRleCBkMjAxNGIzLi4wOTljY2UwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlcjIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlcjIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTI2LDYgKzI1LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC04OSw2ICs4OSw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuOC4wCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY2FuUGFyc2VBbnRsaWJEZXNjcmlwdG9yKFJlc291cmNlIHJlc291cmNlKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTEwMyw2ICsxMDQsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBVbmtub3duRWxlbWVudCBwYXJzZUFudGxpYkRlc2NyaXB0b3IoUHJvamVjdCBjb250YWluaW5nUHJvamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlIHJlc291cmNlKSB7CiAgICAgICAgIFVSTFByb3ZpZGVyIHVwID0gcmVzb3VyY2UuYXMoVVJMUHJvdmlkZXIuY2xhc3MpOwpAQCAtMTQ0LDEwICsxNDYsMTEgQEAKICAgICAgKiBAcGFyYW0gc291cmNlICB0aGUgeG1sIHNvdXJjZQogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcGFyc2UoUHJvamVjdCBwcm9qZWN0LCBPYmplY3Qgc291cmNlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBnZXRJbXBvcnRTdGFjaygpLmFkZEVsZW1lbnQoc291cmNlKTsKICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgY29udGV4dCA9IChBbnRYTUxDb250ZXh0KSBwcm9qZWN0LmdldFJlZmVyZW5jZShSRUZJRF9DT05URVhUKTsKKyAgICAgICAgY29udGV4dCA9IHByb2plY3QuZ2V0UmVmZXJlbmNlKFJFRklEX0NPTlRFWFQpOwogICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb250ZXh0ID0gbmV3IEFudFhNTENvbnRleHQocHJvamVjdCk7CiAgICAgICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZShSRUZJRF9DT05URVhULCBjb250ZXh0KTsKQEAgLTE2NCw3ICsxNjcsNyBAQAogICAgICAgICAgICAgICAgIG5ld0N1cnJlbnQuc2V0UHJvamVjdChwcm9qZWN0KTsKICAgICAgICAgICAgICAgICBuZXdDdXJyZW50LnNldE5hbWUoIiIpOwogICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3VycmVudFRhcmdldChuZXdDdXJyZW50KTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKG5ldyBIYXNoTWFwPFN0cmluZywgVGFyZ2V0PigpKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKG5ldyBIYXNoTWFwPD4oKSk7CiAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbXBsaWNpdFRhcmdldChuZXdDdXJyZW50KTsKICAgICAgICAgICAgICAgICBwYXJzZShwcm9qZWN0LCBzb3VyY2UsIG5ldyBSb290SGFuZGxlcihjb250ZXh0LCBtYWluSGFuZGxlcikpOwogICAgICAgICAgICAgICAgIG5ld0N1cnJlbnQuZXhlY3V0ZSgpOwpAQCAtMTc1LDcgKzE3OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyB0b3AgbGV2ZWwgZmlsZQotICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50VGFyZ2V0cyhuZXcgSGFzaE1hcDxTdHJpbmcsIFRhcmdldD4oKSk7CisgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXRzKG5ldyBIYXNoTWFwPD4oKSk7CiAgICAgICAgICAgICBwYXJzZShwcm9qZWN0LCBzb3VyY2UsIG5ldyBSb290SGFuZGxlcihjb250ZXh0LCBtYWluSGFuZGxlcikpOwogICAgICAgICAgICAgLy8gRXhlY3V0ZSB0aGUgdG9wLWxldmVsIHRhcmdldAogICAgICAgICAgICAgY29udGV4dC5nZXRJbXBsaWNpdFRhcmdldCgpLmV4ZWN1dGUoKTsKQEAgLTIwNywxMyArMjEwLDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgVVJMKSB7CiAgICAgICAgICAgICB1cmwgPSAoVVJMKSBzb3VyY2U7CiAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgUmVzb3VyY2UpIHsKLSAgICAgICAgICAgIEZpbGVQcm92aWRlciBmcCA9Ci0gICAgICAgICAgICAgICAgKChSZXNvdXJjZSkgc291cmNlKS5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0gKChSZXNvdXJjZSkgc291cmNlKS5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwogICAgICAgICAgICAgaWYgKGZwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBidWlsZEZpbGUgPSBmcC5nZXRGaWxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFVSTFByb3ZpZGVyIHVwID0KLSAgICAgICAgICAgICAgICAgICAgKChSZXNvdXJjZSkgc291cmNlKS5hcyhVUkxQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgVVJMUHJvdmlkZXIgdXAgPSAoKFJlc291cmNlKSBzb3VyY2UpLmFzKFVSTFByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgICAgICAgICBpZiAodXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cC5nZXRVUkwoKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNDgsMTIgKzI0OSwxMSBAQAogICAgICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7CiAgICAgICAgICAgICBpZiAoYnVpbGRGaWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB1cmkgPSBGSUxFX1VUSUxTLnRvVVJJKGJ1aWxkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGJ1aWxkRmlsZSk7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShidWlsZEZpbGUudG9QYXRoKCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1cmkgPSB1cmwudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpbnQgcGxpbmcgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoImphcjpmaWxlIikKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBsaW5nID0gdXJpLmluZGV4T2YoIiEvIikpID4gLTEpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxpbmcgPSB1cmkuaW5kZXhPZigiIS8iKTsKKyAgICAgICAgICAgICAgICBpZiAodXJpLnN0YXJ0c1dpdGgoImphcjpmaWxlIikgJiYgcGxpbmcgPiAtMSkgewogICAgICAgICAgICAgICAgICAgICB6ZiA9IG5ldyBaaXBGaWxlKG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaC5Mb2NhdG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb21KYXJVUkkodXJpKSwgIlVURi04Iik7CiAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0KQEAgLTI3MywxMiArMjczLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICArIHVyaSArICh6ZiAhPSBudWxsID8gIiBmcm9tIGEgemlwIGZpbGUiIDogIiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgICAgIERlZmF1bHRIYW5kbGVyIGhiID0gaGFuZGxlcjsKLQotICAgICAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGhiKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihoYik7Ci0gICAgICAgICAgICBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGhiKTsKLSAgICAgICAgICAgIHBhcnNlci5zZXREVERIYW5kbGVyKGhiKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihoYW5kbGVyKTsKKyAgICAgICAgICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoaGFuZGxlcik7CisgICAgICAgICAgICBwYXJzZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKTsKICAgICAgICAgICAgIHBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSk7CiAgICAgICAgIH0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGV4YykgewogICAgICAgICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oZXhjLmdldFN5c3RlbUlkKCksIGV4Yy5nZXRMaW5lTnVtYmVyKCksIGV4YwpAQCAtNDY4LDcgKzQ2Niw3IEBACiAgICAgICAgICAgICB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGNvdW50KS50cmltKCk7CiAKLSAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKCFzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB0ZXh0IFwiIiArIHMgKyAiXCIiLCBjb250ZXh0LmdldExvY2F0b3IoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ4OCw3ICs0ODYsNyBAQAogICAgICAqIHdpdGggdGhlIGltcGxpY2l0IGV4ZWN1dGlvbiBzdGFjaykKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIFN0YWNrPEFudEhhbmRsZXI+IGFudEhhbmRsZXJzID0gbmV3IFN0YWNrPEFudEhhbmRsZXI+KCk7CisgICAgICAgIHByaXZhdGUgU3RhY2s8QW50SGFuZGxlcj4gYW50SGFuZGxlcnMgPSBuZXcgU3RhY2s8PigpOwogICAgICAgICBwcml2YXRlIEFudEhhbmRsZXIgY3VycmVudEhhbmRsZXIgPSBudWxsOwogICAgICAgICBwcml2YXRlIEFudFhNTENvbnRleHQgY29udGV4dDsKIApAQCAtNTIyLDYgKzUyMCw3IEBACiAgICAgICAgICAqICAgICAgICAgICAgICAgICBkb2N1bWVudC4gV2lsbCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICAgICAqIEByZXR1cm4gYW4gaW5wdXRzb3VyY2UgZm9yIHRoaXMgaWRlbnRpZmllcgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7CiAKICAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmxvZygicmVzb2x2aW5nIHN5c3RlbUlkOiAiICsgc3lzdGVtSWQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtNTM5LDEwICs1MzgsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkubG9nKCJmaWxlPSIgKyBmaWxlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoRklMRV9VVElMUy50b1VSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5lKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZm5lKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmxvZyhmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiBjb3VsZCBub3QgYmUgZm91bmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTY3LDYgKzU2Niw3IEBACiAgICAgICAgICAqIEBleGNlcHRpb24gb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIHRhZyBnaXZlbiBpcyBub3QKICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT4icHJvamVjdCI8L2NvZGU+CiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycykKICAgICAgICAgICAgIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBBbnRIYW5kbGVyIG5leHQgPSBjdXJyZW50SGFuZGxlci5vblN0YXJ0Q2hpbGQodXJpLCB0YWcsIHFuYW1lLCBhdHRycywgY29udGV4dCk7CkBAIC01ODEsNiArNTgxLDcgQEAKICAgICAgICAgICogQHBhcmFtIGxvY2F0b3IgVGhlIGxvY2F0b3IgdXNlZCBieSB0aGUgcGFyc2VyLgogICAgICAgICAgKiAgICAgICAgICAgICAgICBXaWxsIG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7CiAgICAgICAgICAgICBjb250ZXh0LnNldExvY2F0b3IobG9jYXRvcik7CiAgICAgICAgIH0KQEAgLTU5NiwxMCArNTk3LDEwIEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IgKG5vdCB0aHJvd24gaW4gdGhpcyBpbXBsZW1lbnRhdGlvbikKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcU5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAgICAgY3VycmVudEhhbmRsZXIub25FbmRFbGVtZW50KHVyaSwgbmFtZSwgY29udGV4dCk7Ci0gICAgICAgICAgICBBbnRIYW5kbGVyIHByZXYgPSAoQW50SGFuZGxlcikgYW50SGFuZGxlcnMucG9wKCk7Ci0gICAgICAgICAgICBjdXJyZW50SGFuZGxlciA9IHByZXY7CisgICAgICAgICAgICBjdXJyZW50SGFuZGxlciA9IGFudEhhbmRsZXJzLnBvcCgpOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRIYW5kbGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50SGFuZGxlci5vbkVuZENoaWxkKHVyaSwgbmFtZSwgcU5hbWUsIGNvbnRleHQpOwogICAgICAgICAgICAgfQpAQCAtNjEzLDYgKzYxNCw3IEBACiAgICAgICAgICAqIEBwYXJhbSBjb3VudCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZC4KICAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgY3VycmVudEhhbmRsZXIuY2hhcmFjdGVycyhidWYsIHN0YXJ0LCBjb3VudCwgY29udGV4dCk7CiAgICAgICAgIH0KQEAgLTYyMyw2ICs2MjUsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJlZml4IHRoZSBuYW1lc3BhY2UgcHJlZml4CiAgICAgICAgICAqIEBwYXJhbSB1cmkgdGhlIG5hbWVzcGFjZSB1cmkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFByZWZpeE1hcHBpbmcoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkgewogICAgICAgICAgICAgY29udGV4dC5zdGFydFByZWZpeE1hcHBpbmcocHJlZml4LCB1cmkpOwogICAgICAgICB9CkBAIC02MzIsNiArNjM1LDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4IHRoYXQgaXMgbm90IG1hcHBlZCBhbnltb3JlCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZW5kUHJlZml4TWFwcGluZyhTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgICAgICBjb250ZXh0LmVuZFByZWZpeE1hcHBpbmcocHJlZml4KTsKICAgICAgICAgfQpAQCAtNjU1LDEwICs2NTksMTEgQEAKICAgICAgICAgICogQHJldHVybiBUaGUgcHJvamVjdCBoYW5kbGVyIHRoYXQgaGFuZGxlcyBzdWJlbGVtZW50cyBvZiBwcm9qZWN0CiAgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgdGhlIHF1YWxpZmllZCBuYW1lIGlzIG5vdCAicHJvamVjdCIuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEFudEhhbmRsZXIgb25TdGFydENoaWxkKFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYTUxDb250ZXh0IGNvbnRleHQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoInByb2plY3QiLmVxdWFscyhuYW1lKQotICAgICAgICAgICAgICAgICYmICh1cmkuZXF1YWxzKCIiKSB8fCB1cmkuZXF1YWxzKEFOVF9DT1JFX1VSSSkpKSB7CisgICAgICAgICAgICAgICAgJiYgKHVyaS5pc0VtcHR5KCkgfHwgdXJpLmVxdWFscyhBTlRfQ09SRV9VUkkpKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBQcm9qZWN0SGVscGVyMi5wcm9qZWN0SGFuZGxlcjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuYW1lLmVxdWFscyhxbmFtZSkpIHsKQEAgLTY5NCw2ICs2OTksNyBAQAogICAgICAgICAgKiAgICAgICAgICAgIGVuY291bnRlcmVkIG9yIGlmIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IGF0dHJpYnV0ZQogICAgICAgICAgKiAgICAgICAgICAgIGlzIG1pc3NpbmcuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYTUxDb250ZXh0IGNvbnRleHQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBTdHJpbmcgYmFzZURpciA9IG51bGw7CkBAIC03MTYsNDggKzcyMiw1MiBAQAogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clVyaSA9IGF0dHJzLmdldFVSSShpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0clVyaSAhPSBudWxsICYmICFhdHRyVXJpLmVxdWFscygiIikgJiYgIWF0dHJVcmkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0clVyaSAhPSBudWxsICYmICFhdHRyVXJpLmlzRW1wdHkoKSAmJiAhYXR0clVyaS5lcXVhbHModXJpKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gSWdub3JlIGF0dHJpYnV0ZXMgZnJvbSB1bmtub3duIHVyaXMKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGF0dHJzLmdldExvY2FsTmFtZShpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKLQotICAgICAgICAgICAgICAgIGlmICgiZGVmYXVsdCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZWZhdWx0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm5hbWUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRQcm9qZWN0TmFtZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lQXR0cmlidXRlU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXROYW1lKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSh2YWx1ZSwgcHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW5JbmNsdWRlTW9kZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHModmFsdWUpICYmIGdldEN1cnJlbnRUYXJnZXRQcmVmaXgoKSE9IG51bGwgJiYgZ2V0Q3VycmVudFRhcmdldFByZWZpeCgpLmVuZHNXaXRoKFByb2plY3RIZWxwZXIuVVNFX1BST0pFQ1RfTkFNRV9BU19UQVJHRVRfUFJFRklYKSkgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1RhcmdldFByZWZpeCA9IGdldEN1cnJlbnRUYXJnZXRQcmVmaXgoKS5yZXBsYWNlKFByb2plY3RIZWxwZXIuVVNFX1BST0pFQ1RfTkFNRV9BU19UQVJHRVRfUFJFRklYLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlbHAgbmVzdGVkIGluY2x1ZGUgdGFza3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q3VycmVudFRhcmdldFByZWZpeChuZXdUYXJnZXRQcmVmaXgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXR0cnMuZ2V0TG9jYWxOYW1lKGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmF1bHQiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0RGVmYXVsdCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaWQiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGF0J3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBpZCBhbmQgbmFtZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKHZhbHVlLCBwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJuYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRDdXJyZW50UHJvamVjdE5hbWUodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVBdHRyaWJ1dGVTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3Quc2V0TmFtZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKHZhbHVlLCBwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW5JbmNsdWRlTW9kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpICYmIGdldEN1cnJlbnRUYXJnZXRQcmVmaXgoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0Q3VycmVudFRhcmdldFByZWZpeCgpLmVuZHNXaXRoKFByb2plY3RIZWxwZXIuVVNFX1BST0pFQ1RfTkFNRV9BU19UQVJHRVRfUFJFRklYKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5ld1RhcmdldFByZWZpeCA9IGdldEN1cnJlbnRUYXJnZXRQcmVmaXgoKS5yZXBsYWNlKFByb2plY3RIZWxwZXIuVVNFX1BST0pFQ1RfTkFNRV9BU19UQVJHRVRfUFJFRklYLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWxwIG5lc3RlZCBpbmNsdWRlIHRhc2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50VGFyZ2V0UHJlZml4KG5ld1RhcmdldFByZWZpeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJiYXNlZGlyIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpciA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBpZ25vcmUgYXR0cmlidXRlcyBpbiBhIGRpZmZlcmVudCBOUyAoIG1heWJlIHN0b3JlIHRoZW0gPyApCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsgYXR0cnMuZ2V0UU5hbWUoaSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIiwgY29udGV4dC5nZXRMb2NhdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImlkIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hhdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaWQgYW5kIG5hbWUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc0lnbm9yaW5nUHJvamVjdFRhZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKHZhbHVlLCBwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiYmFzZWRpciI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRleHQuaXNJZ25vcmluZ1Byb2plY3RUYWcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VEaXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBpZ25vcmUgYXR0cmlidXRlcyBpbiBhIGRpZmZlcmVudCBOUyAobWF5YmUgc3RvcmUgdGhlbSA/KQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBhdHRycy5nZXRRTmFtZShpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIsIGNvbnRleHQuZ2V0TG9jYXRvcigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTgxMCw4ICs4MjAsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHNldCBleHBsaWNpdGx5IGJlZm9yZSBzdGFydGluZyA/Ci0gICAgICAgICAgICBpZiAocHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIocHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFzZWRpciIpKTsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0LmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuUFJPSkVDVF9CQVNFRElSKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKHByb2plY3QuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBmb3IgYmFzZURpciBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGJ1aWxkIGZpbGUuCiAgICAgICAgICAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgewpAQCAtODUwLDEwICs4NjAsMTEgQEAKICAgICAgICAgICogICAgICAgICAgICA8Y29kZT4iZXh0ZW5zaW9uLXBvaW50IjwvY29kZT4KICAgICAgICAgICogICAgICAgICAgICBvciBhIGRhdGEgdHlwZSBkZWZpbml0aW9uCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEFudEhhbmRsZXIgb25TdGFydENoaWxkKFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRYTUxDb250ZXh0IGNvbnRleHQpIHRocm93cyBTQVhQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKCJ0YXJnZXQiKSB8fCBuYW1lLmVxdWFscygiZXh0ZW5zaW9uLXBvaW50IikpCi0gICAgICAgICAgICAgICAgJiYgKHVyaS5lcXVhbHMoIiIpIHx8IHVyaS5lcXVhbHMoQU5UX0NPUkVfVVJJKSkKKyAgICAgICAgICAgIHJldHVybiAoInRhcmdldCIuZXF1YWxzKG5hbWUpIHx8ICJleHRlbnNpb24tcG9pbnQiLmVxdWFscyhuYW1lKSkKKyAgICAgICAgICAgICAgICAmJiAodXJpLmlzRW1wdHkoKSB8fCB1cmkuZXF1YWxzKEFOVF9DT1JFX1VSSSkpCiAgICAgICAgICAgICAgICAgPyBQcm9qZWN0SGVscGVyMi50YXJnZXRIYW5kbGVyIDogUHJvamVjdEhlbHBlcjIuZWxlbWVudEhhbmRsZXI7CiAgICAgICAgIH0KICAgICB9CkBAIC04ODMsNiArODk0LDcgQEAKICAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiB1bmV4cGVjdGVkIGF0dHJpYnV0ZSBpcyBlbmNvdW50ZXJlZAogICAgICAgICAgKiAgICAgICAgICAgIG9yIGlmIHRoZSA8Y29kZT4ibmFtZSI8L2NvZGU+IGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyB0YWcsIFN0cmluZyBxbmFtZSwgQXR0cmlidXRlcyBhdHRycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwpAQCAtODk5LDQwICs5MTEsNDcgQEAKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJVcmkgPSBhdHRycy5nZXRVUkkoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJVcmkgIT0gbnVsbCAmJiAhYXR0clVyaS5lcXVhbHMoIiIpICYmICFhdHRyVXJpLmVxdWFscyh1cmkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF0dHJVcmkgIT0gbnVsbCAmJiAhYXR0clVyaS5pc0VtcHR5KCkgJiYgIWF0dHJVcmkuZXF1YWxzKHVyaSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIElnbm9yZSBhdHRyaWJ1dGVzIGZyb20gdW5rbm93biB1cmlzCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBhdHRycy5nZXRMb2NhbE5hbWUoaSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIm5hbWUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGF0dHJpYnV0ZSBtdXN0ICIgKyAibm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZXBlbmRzIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBkZXBlbmRzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaWYiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXRJZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgidW5sZXNzIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0VW5sZXNzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpZCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSh2YWx1ZSwgdGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImV4dGVuc2lvbk9mIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25Qb2ludCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm9uTWlzc2luZ0V4dGVuc2lvblBvaW50Ii5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUG9pbnRNaXNzaW5nID0gT25NaXNzaW5nRXh0ZW5zaW9uUG9pbnQudmFsdWVPZih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgb25NaXNzaW5nRXh0ZW5zaW9uUG9pbnQgIiArIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsga2V5ICsgIlwiIiwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldExvY2F0b3IoKSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhdHRycy5nZXRMb2NhbE5hbWUoaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibmFtZSI6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5hbWUgYXR0cmlidXRlIG11c3Qgbm90IGJlIGVtcHR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVwZW5kcyI6CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiaWYiOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldElmKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJ1bmxlc3MiOgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldFVubGVzcyh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiaWQiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJkZXNjcmlwdGlvbiI6CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24odmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImV4dGVuc2lvbk9mIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblBvaW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAib25NaXNzaW5nRXh0ZW5zaW9uUG9pbnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25Qb2ludE1pc3NpbmcgPSBPbk1pc3NpbmdFeHRlbnNpb25Qb2ludC52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIG9uTWlzc2luZ0V4dGVuc2lvblBvaW50ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsgYXR0cnMuZ2V0UU5hbWUoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiLCBjb250ZXh0LmdldExvY2F0b3IoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC05NjQsNyArOTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgVGFyZ2V0PiBwcm9qZWN0VGFyZ2V0cyA9IHByb2plY3QuZ2V0VGFyZ2V0cygpOwotICAgICAgICAgICAgYm9vbGVhbiAgIHVzZWRUYXJnZXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdXNlZFRhcmdldCA9IGZhbHNlOwogICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgaGFzIG5vdCBhbHJlYWR5IGJlZW4gZGVmaW5lZCBkZWZpbmUgaXQKICAgICAgICAgICAgIGlmIChwcm9qZWN0VGFyZ2V0cy5jb250YWluc0tleShuYW1lKSkgewogICAgICAgICAgICAgICAgIHByb2plY3QubG9nKCJBbHJlYWR5IGRlZmluZWQgaW4gbWFpbiBvciBhIHByZXZpb3VzIGltcG9ydCwgaWdub3JlICIgKyBuYW1lLApAQCAtOTc2LDcgKzk5NSw3IEBACiAgICAgICAgICAgICAgICAgdXNlZFRhcmdldCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChkZXBlbmRzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKCFkZXBlbmRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGlmICghaXNJbkluY2x1ZGVNb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5zZXREZXBlbmRzKGRlcGVuZHMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMDA3LDggKzEwMjYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGV4dGVuc2lvblBvaW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBQcm9qZWN0SGVscGVyIGhlbHBlciA9Ci0gICAgICAgICAgICAgICAgICAgIChQcm9qZWN0SGVscGVyKSBjb250ZXh0LmdldFByb2plY3QoKS4KLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVmZXJlbmNlKFByb2plY3RIZWxwZXIuUFJPSkVDVEhFTFBFUl9SRUZFUkVOQ0UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKFByb2plY3RIZWxwZXIuUFJPSkVDVEhFTFBFUl9SRUZFUkVOQ0UpOwogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGV4dFBvaW50TmFtZSA6IFRhcmdldC5wYXJzZURlcGVuZHMoZXh0ZW5zaW9uUG9pbnQsIG5hbWUsICJleHRlbnNpb25PZiIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb25Qb2ludE1pc3NpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUG9pbnRNaXNzaW5nID0gT25NaXNzaW5nRXh0ZW5zaW9uUG9pbnQuRkFJTDsKQEAgLTEwMzMsNyArMTA1MSw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0UHJlZml4KEFudFhNTENvbnRleHQgY29udGV4dCkgewogICAgICAgICAgICAgU3RyaW5nIGNvbmZpZ3VyZWRWYWx1ZSA9IGdldEN1cnJlbnRUYXJnZXRQcmVmaXgoKTsKLSAgICAgICAgICAgIGlmIChjb25maWd1cmVkVmFsdWUgIT0gbnVsbCAmJiBjb25maWd1cmVkVmFsdWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbmZpZ3VyZWRWYWx1ZSAhPSBudWxsICYmIGNvbmZpZ3VyZWRWYWx1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb25maWd1cmVkVmFsdWUgPSBudWxsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNvbmZpZ3VyZWRWYWx1ZSAhPSBudWxsKSB7CkBAIC0xMDQxLDcgKzEwNTksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBjb250ZXh0LmdldEN1cnJlbnRQcm9qZWN0TmFtZSgpOwotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhwcm9qZWN0TmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHByb2plY3ROYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHByb2plY3ROYW1lID0gbnVsbDsKICAgICAgICAgICAgIH0KIApAQCAtMTA2Myw2ICsxMDgxLDcgQEAKICAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMgd2hlbiBpbml0aWFsaXNpbmcKICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgY2hpbGQgaGFuZGxlcgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBBbnRIYW5kbGVyIG9uU3RhcnRDaGlsZChTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIyLmVsZW1lbnRIYW5kbGVyOwpAQCAtMTA3Niw2ICsxMDk1LDcgQEAKICAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KICAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgQW50WE1MQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICBjb250ZXh0LnNldEN1cnJlbnRUYXJnZXQoY29udGV4dC5nZXRJbXBsaWNpdFRhcmdldCgpKTsKICAgICAgICAgfQpAQCAtMTExMCw2ICsxMTMwLDcgQEAKICAgICAgICAgICogQGV4Y2VwdGlvbiBTQVhQYXJzZUV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yIChub3QgdGhyb3duIGluCiAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbXBsZW1lbnRhdGlvbikKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgdGFnLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgcGFyZW50V3JhcHBlciA9IGNvbnRleHQuY3VycmVudFdyYXBwZXIoKTsKQEAgLTExNTEsNyArMTE3Miw3IEBACiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGF0dHJzLmdldExvY2FsTmFtZShpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgYXR0clVyaSA9IGF0dHJzLmdldFVSSShpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0clVyaSAhPSBudWxsICYmICFhdHRyVXJpLmVxdWFscygiIikgJiYgIWF0dHJVcmkuZXF1YWxzKHVyaSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0clVyaSAhPSBudWxsICYmICFhdHRyVXJpLmlzRW1wdHkoKSAmJiAhYXR0clVyaS5lcXVhbHModXJpKSkgewogICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0clVyaSArICI6IiArIGF0dHJzLmdldFFOYW1lKGkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKQEAgLTExOTYsNiArMTIxNyw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBzZWUgUHJvamVjdEhlbHBlciNhZGRUZXh0KFByb2plY3QsamF2YS5sYW5nLk9iamVjdCxjaGFyW10saW50LGludCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudFhNTENvbnRleHQgY29udGV4dCkgdGhyb3dzIFNBWFBhcnNlRXhjZXB0aW9uIHsKICAgICAgICAgICAgIFJ1bnRpbWVDb25maWd1cmFibGUgd3JhcHBlciA9IGNvbnRleHQuY3VycmVudFdyYXBwZXIoKTsKQEAgLTEyMTksNiArMTI0MSw3IEBACiAgICAgICAgICAqIEBleGNlcHRpb24gU0FYUGFyc2VFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoZW4gaW5pdGlhbGlzaW5nCiAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIGNoaWxkIGhhbmRsZXIKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgQW50SGFuZGxlciBvblN0YXJ0Q2hpbGQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgU3RyaW5nIHFuYW1lLCBBdHRyaWJ1dGVzIGF0dHJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50WE1MQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgcmV0dXJuIFByb2plY3RIZWxwZXIyLmVsZW1lbnRIYW5kbGVyOwpAQCAtMTIzMiw2ICsxMjU1LDcgQEAKICAgICAgICAgICogQHBhcmFtIHRhZyBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudC4KICAgICAgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBvbkVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZywgQW50WE1MQ29udGV4dCBjb250ZXh0KSB7CiAgICAgICAgICAgICBjb250ZXh0LnBvcFdyYXBwZXIoKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1Byb2plY3RIZWxwZXJJbXBsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlckltcGwuamF2YQppbmRleCA0YjE1OWYzLi44YmY4ODlhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlckltcGwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvUHJvamVjdEhlbHBlckltcGwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE1ICsxOCwxNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlJ1bnRpbWVDb25maWd1cmFibGU7CkBAIC00Miw2ICs0NCw3IEBACiBpbXBvcnQgb3JnLnhtbC5zYXguSGFuZGxlckJhc2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKK2ltcG9ydCBvcmcueG1sLnNheC5QYXJzZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MUmVhZGVyQWRhcHRlcjsKQEAgLTYxLDcgKzY0LDcgQEAKICAgICAgKiBTQVggMSBzdHlsZSBwYXJzZXIgdXNlZCB0byBwYXJzZSB0aGUgZ2l2ZW4gZmlsZS4gVGhpcyBtYXkKICAgICAgKiBpbiBmYWN0IGJlIGEgU0FYIDIgWE1MUmVhZGVyIHdyYXBwZWQgaW4gYW4gWE1MUmVhZGVyQWRhcHRlci4KICAgICAgKi8KLSAgICBwcml2YXRlIG9yZy54bWwuc2F4LlBhcnNlciBwYXJzZXI7CisgICAgcHJpdmF0ZSBQYXJzZXIgcGFyc2VyOwogCiAgICAgLyoqIFRoZSBwcm9qZWN0IHRvIGNvbmZpZ3VyZS4gKi8KICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKQEAgLTExMCwyMiArMTEzLDIwIEBACiAgICAgICAgICAgICAgICAgKyAiZGVmYXVsdCBwbHVnaW4iKTsKICAgICAgICAgfQogICAgICAgICBGaWxlIGJGaWxlID0gKEZpbGUpIHNvdXJjZTsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLSAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBudWxsOwogCiAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgIHRoaXMuYnVpbGRGaWxlID0gbmV3IEZpbGUoYkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBidWlsZEZpbGVQYXJlbnQgPSBuZXcgRmlsZSh0aGlzLmJ1aWxkRmlsZS5nZXRQYXJlbnQoKSk7CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VyID0gSkFYUFV0aWxzLmdldFBhcnNlcigpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBYTUxSZWFkZXJBZGFwdGVyKEpBWFBVdGlscy5nZXRYTUxSZWFkZXIoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJzZXIgPSBKQVhQVXRpbHMuZ2V0UGFyc2VyKCk7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHBhcnNlciA9IG5ldyBYTUxSZWFkZXJBZGFwdGVyKEpBWFBVdGlscy5nZXRYTUxSZWFkZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oYkZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgdXJpID0gRklMRV9VVElMUy50b1VSSShiRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYkZpbGUpOwotICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaW5wdXRTdHJlYW0pOwogICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQodXJpKTsKICAgICAgICAgICAgIHByb2plY3QubG9nKCJwYXJzaW5nIGJ1aWxkZmlsZSAiICsgYkZpbGUgKyAiIHdpdGggVVJJID0gIiArIHVyaSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICBIYW5kbGVyQmFzZSBoYiA9IG5ldyBSb290SGFuZGxlcih0aGlzKTsKQEAgLTEzNSw4ICsxMzYsOCBAQAogICAgICAgICAgICAgcGFyc2VyLnNldERUREhhbmRsZXIoaGIpOwogICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHV0U291cmNlKTsKICAgICAgICAgfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihleGMuZ2V0U3lzdGVtSWQoKSwgZXhjLmdldExpbmVOdW1iZXIoKSwgZXhjCi0gICAgICAgICAgICAgICAgICAgIC5nZXRDb2x1bW5OdW1iZXIoKSk7CisgICAgICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihleGMuZ2V0U3lzdGVtSWQoKSwgZXhjLmdldExpbmVOdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXhjLmdldENvbHVtbk51bWJlcigpKTsKIAogICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBleGMuZ2V0RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CkBAIC0xNTksOCArMTYwLDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW5jb2Rpbmcgb2YgcHJvamVjdCBmaWxlIGlzIGludmFsaWQuIiwgZXhjKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgcHJvamVjdCBmaWxlOiAiICsgZXhjLmdldE1lc3NhZ2UoKSwgZXhjKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbnB1dFN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NCw3ICsyNDMsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBidWYsIGludCBzdGFydCwgaW50IGNvdW50KSB0aHJvd3MgU0FYUGFyc2VFeGNlcHRpb24gewogICAgICAgICAgICAgU3RyaW5nIHMgPSBuZXcgU3RyaW5nKGJ1Ziwgc3RhcnQsIGNvdW50KS50cmltKCk7CiAKLSAgICAgICAgICAgIGlmIChzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKCFzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCB0ZXh0IFwiIiArIHMgKyAiXCIiLCBoZWxwZXJJbXBsLmxvY2F0b3IpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zMDIsMTAgKzMwMSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgZm9yIGNvbXBsaWFuY2Ugd2l0aCBvdGhlciBYTUwgdG9vbHMiLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgICAgICAgICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2Uuc2V0U3lzdGVtSWQoRklMRV9VVElMUy50b1VSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dFNvdXJjZTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5lKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZm5lKSB7CiAgICAgICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5sb2coZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgY291bGQgbm90IGJlIGZvdW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zODcsMjMgKzM4NiwyNiBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGF0dHJzLmdldE5hbWUoaSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cnMuZ2V0VmFsdWUoaSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoImRlZmF1bHQiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlZiA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIm5hbWUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJpZCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJiYXNlZGlyIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBiYXNlRGlyID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBhdHRycy5nZXROYW1lKGkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiLCBoZWxwZXJJbXBsLmxvY2F0b3IpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlZmF1bHQiOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAibmFtZSI6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiaWQiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJiYXNlZGlyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VEaXIgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNBWFBhcnNlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGF0dHJpYnV0ZSBcIiIgKyBrZXkgKyAiXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLmxvY2F0b3IpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsICYmICFkZWYuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaWYgKGRlZiAhPSBudWxsICYmICFkZWYuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LnNldERlZmF1bHQoZGVmKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZGVmYXVsdCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKQEAgLTQxOCw4ICs0MjAsOCBAQAogICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5hZGRSZWZlcmVuY2UoaWQsIGhlbHBlckltcGwucHJvamVjdCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChoZWxwZXJJbXBsLnByb2plY3QuZ2V0UHJvcGVydHkoImJhc2VkaXIiKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LnNldEJhc2VkaXIoaGVscGVySW1wbC5wcm9qZWN0LmdldFByb3BlcnR5KCJiYXNlZGlyIikpOworICAgICAgICAgICAgaWYgKGhlbHBlckltcGwucHJvamVjdC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLlBST0pFQ1RfQkFTRURJUikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5zZXRCYXNlZGlyKGhlbHBlckltcGwucHJvamVjdC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLlBST0pFQ1RfQkFTRURJUikpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYmFzZURpciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5zZXRCYXNlZGlyKGhlbHBlckltcGwuYnVpbGRGaWxlUGFyZW50LmdldEFic29sdXRlUGF0aCgpKTsKQEAgLTUyMywyNiArNTI1LDMyIEBACiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gYXR0cnMuZ2V0TmFtZShpKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRycy5nZXRWYWx1ZShpKTsKLQotICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5hbWUgYXR0cmlidXRlIG11c3Qgbm90IiArICIgYmUgZW1wdHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYXRpb24oaGVscGVySW1wbC5sb2NhdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkZXBlbmRzIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBkZXBlbmRzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaWYiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmQ29uZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInVubGVzcyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdW5sZXNzQ29uZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImlkIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBpZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsga2V5ICsgIlwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXJJbXBsLmxvY2F0b3IpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIm5hbWUiOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBlbXB0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYXRpb24oaGVscGVySW1wbC5sb2NhdG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiZGVwZW5kcyI6CisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAiaWYiOgorICAgICAgICAgICAgICAgICAgICAgICAgaWZDb25kID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAidW5sZXNzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzc0NvbmQgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJpZCI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImRlc2NyaXB0aW9uIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTQVhQYXJzZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBhdHRyaWJ1dGUgXCIiICsga2V5ICsgIlwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVySW1wbC5sb2NhdG9yKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTU2MiwxMyArNTcwLDEzIEBACiAgICAgICAgICAgICB0YXJnZXQuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwogICAgICAgICAgICAgaGVscGVySW1wbC5wcm9qZWN0LmFkZFRhcmdldChuYW1lLCB0YXJnZXQpOwogCi0gICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGhlbHBlckltcGwucHJvamVjdC5hZGRSZWZlcmVuY2UoaWQsIHRhcmdldCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBkZXBlbmRlbmNpZXMKIAotICAgICAgICAgICAgaWYgKGRlcGVuZHMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWRlcGVuZHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgdGFyZ2V0LnNldERlcGVuZHMoZGVwZW5kcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9TaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9oZWxwZXIvU2luZ2xlQ2hlY2tFeGVjdXRvci5qYXZhCmluZGV4IDY1NzdjOTQuLjdmYjIyOGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2hlbHBlci9TaW5nbGVDaGVja0V4ZWN1dG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaGVscGVyL1NpbmdsZUNoZWNrRXhlY3V0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0RlZmF1bHRJbnB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0RlZmF1bHRJbnB1dEhhbmRsZXIuamF2YQppbmRleCBmYTY4MjIzLi40NmVkMDliIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9EZWZhdWx0SW5wdXRIYW5kbGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvRGVmYXVsdElucHV0SGFuZGxlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvR3JlZWR5SW5wdXRIYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9HcmVlZHlJbnB1dEhhbmRsZXIuamF2YQppbmRleCBjYjUyZjRmLi4yMDA1ZjM5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9HcmVlZHlJbnB1dEhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9HcmVlZHlJbnB1dEhhbmRsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXF1ZXN0LnNldElucHV0KG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICBpZiAoIShyZXF1ZXN0LmlzSW5wdXRWYWxpZCgpKSkgeworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0LmlzSW5wdXRWYWxpZCgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgaW52YWxpZCBjb25zb2xlIGlucHV0Iik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0lucHV0SGFuZGxlci5qYXZhCmluZGV4IGE3MTU0NmYuLjliMWVmYjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0lucHV0SGFuZGxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L0lucHV0SGFuZGxlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvSW5wdXRSZXF1ZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dFJlcXVlc3QuamF2YQppbmRleCA1N2E3N2RhLi41NTI4MjFhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dFJlcXVlc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9JbnB1dFJlcXVlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L011bHRpcGxlQ2hvaWNlSW5wdXRSZXF1ZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9NdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdC5qYXZhCmluZGV4IDRiYWFiOGYuLmExYjBhOWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L011bHRpcGxlQ2hvaWNlSW5wdXRSZXF1ZXN0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvTXVsdGlwbGVDaG9pY2VJbnB1dFJlcXVlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dDsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTMzLDI2ICszNCwzOSBAQAogICAgICAqIEBwYXJhbSBwcm9tcHQgVGhlIHByb21wdCB0byBzaG93IHRvIHRoZSB1c2VyLiAgTXVzdCBub3QgYmUgbnVsbC4KICAgICAgKiBAcGFyYW0gY2hvaWNlcyBob2xkcyBhbGwgaW5wdXQgdmFsdWVzIHRoYXQgYXJlIGFsbG93ZWQuCiAgICAgICogICAgICAgICAgICAgICAgTXVzdCBub3QgYmUgbnVsbC4KKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdChTdHJpbmcsQ29sbGVjdGlvbil9IGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdChTdHJpbmcgcHJvbXB0LCBWZWN0b3I8U3RyaW5nPiBjaG9pY2VzKSB7CisgICAgICAgIHRoaXMocHJvbXB0LCAoQ29sbGVjdGlvbjxTdHJpbmc+KSBjaG9pY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvbXB0IFRoZSBwcm9tcHQgdG8gc2hvdyB0byB0aGUgdXNlci4gIE11c3Qgbm90IGJlIG51bGwuCisgICAgICogQHBhcmFtIGNob2ljZXMgaG9sZHMgYWxsIGlucHV0IHZhbHVlcyB0aGF0IGFyZSBhbGxvd2VkLgorICAgICAqICAgICAgICAgICAgICAgIE11c3Qgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIE11bHRpcGxlQ2hvaWNlSW5wdXRSZXF1ZXN0KFN0cmluZyBwcm9tcHQsIENvbGxlY3Rpb248U3RyaW5nPiBjaG9pY2VzKSB7CiAgICAgICAgIHN1cGVyKHByb21wdCk7CiAgICAgICAgIGlmIChjaG9pY2VzID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNob2ljZXMgbXVzdCBub3QgYmUgbnVsbCIpOwogICAgICAgICB9Ci0gICAgICAgIHRoaXMuY2hvaWNlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oY2hvaWNlcyk7CisgICAgICAgIHRoaXMuY2hvaWNlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oY2hvaWNlcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgcG9zc2libGUgdmFsdWVzLgogICAgICAqLwogICAgIHB1YmxpYyBWZWN0b3I8U3RyaW5nPiBnZXRDaG9pY2VzKCkgewotICAgICAgICByZXR1cm4gbmV3IFZlY3RvcjxTdHJpbmc+KGNob2ljZXMpOworICAgICAgICByZXR1cm4gbmV3IFZlY3Rvcjw+KGNob2ljZXMpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW5wdXQgaXMgb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0lucHV0VmFsaWQoKSB7Ci0gICAgICAgIHJldHVybiBjaG9pY2VzLmNvbnRhaW5zKGdldElucHV0KCkpIHx8ICgiIi5lcXVhbHMoZ2V0SW5wdXQoKSkgJiYgZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCk7CisgICAgICAgIHJldHVybiBjaG9pY2VzLmNvbnRhaW5zKGdldElucHV0KCkpCisgICAgICAgICAgICB8fCAoZ2V0SW5wdXQoKS5pc0VtcHR5KCkgJiYgZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvaW5wdXQvUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9Qcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXIuamF2YQppbmRleCBlMWUzY2YxLi44MmRiNGZkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9Qcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9Qcm9wZXJ0eUZpbGVJbnB1dEhhbmRsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDggKzE4LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dDsKIAotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC04Miw3ICs4Myw3IEBACiAgICAgICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcHJvcHMubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BzRmlsZSkpOworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KHByb3BzRmlsZSkpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IGxvYWQgIiArIHByb3BzRmlsZSwgZSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9pbnB1dC9TZWN1cmVJbnB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1NlY3VyZUlucHV0SGFuZGxlci5qYXZhCmluZGV4IDdmYjBjMzQuLjlkOWNhMDMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1NlY3VyZUlucHV0SGFuZGxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2lucHV0L1NlY3VyZUlucHV0SGFuZGxlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTMgKzE3LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVmbGVjdFV0aWw7CiAKIC8qKgogICogUHJvbXB0cyBhbmQgcmVxdWVzdHMgaW5wdXQuICBNYXkgbG9vcCB1bnRpbCBhIHZhbGlkIGlucHV0IGhhcwotICogYmVlbiBlbnRlcmVkLiBEb2Vzbid0IGVjaG8gaW5wdXQgKHJlcXVpcmVzIEphdmE2KS4gSWYgSmF2YTYgaXMgbm90Ci0gKiBhdmFpbGFibGUsIGZhbGxzIGJhY2sgdG8gdGhlIERlZmF1bHRIYW5kbGVyIChpbnNlY3VyZSkuCisgKiBiZWVuIGVudGVyZWQuIERvZXNuJ3QgZWNobyBpbnB1dC4KICAqIEBzaW5jZSBBbnQgMS43LjEKICAqLwogcHVibGljIGNsYXNzIFNlY3VyZUlucHV0SGFuZGxlciBleHRlbmRzIERlZmF1bHRJbnB1dEhhbmRsZXIgewpAQCAtMzksMjkgKzM4LDE2IEBACiAgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gaGFuZGxlCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBub3QgcG9zc2libGUgdG8gcmVhZCBmcm9tIGNvbnNvbGUKICAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVJbnB1dChJbnB1dFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiBudWxsSW5wdXQgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIHByb21wdCA9IGdldFByb21wdChyZXF1ZXN0KTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBjb25zb2xlID0gUmVmbGVjdFV0aWwuaW52b2tlU3RhdGljKFN5c3RlbS5jbGFzcywgImNvbnNvbGUiKTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBjaGFyW10gaW5wdXQgPSAoY2hhcltdKSBSZWZsZWN0VXRpbC5pbnZva2UoCi0gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUsICJyZWFkUGFzc3dvcmQiLCBTdHJpbmcuY2xhc3MsIHByb21wdCwKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10uY2xhc3MsIChPYmplY3RbXSkgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVsbElucHV0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0SW5wdXQobmV3IFN0cmluZyhpbnB1dCkpOwotICAgICAgICAgICAgICAgIC8qIGZvciBzZWN1cml0eSB6ZXJvIGNoYXIgYXJyYXkgYWZ0ZXIgcmV0cmlldmluZyB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbChpbnB1dCwgJyAnKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKCFyZXF1ZXN0LmlzSW5wdXRWYWxpZCgpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8qIEphdmE2IG5vdCBwcmVzZW50IHVzZSBkZWZhdWx0IGhhbmRsZXIgKi8KLSAgICAgICAgICAgIHN1cGVyLmhhbmRsZUlucHV0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChudWxsSW5wdXQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHJlYWRpbmcgaW5wdXQiKTsKLSAgICAgICAgfQorICAgICAgICBkbyB7CisgICAgICAgICAgICBjaGFyW10gaW5wdXQgPSBTeXN0ZW0uY29uc29sZSgpLnJlYWRQYXNzd29yZChwcm9tcHQpOworICAgICAgICAgICAgaWYgKGlucHV0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSByZWFkaW5nIGlucHV0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0LnNldElucHV0KG5ldyBTdHJpbmcoaW5wdXQpKTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGlucHV0LCAnICcpOworICAgICAgICB9IHdoaWxlICghcmVxdWVzdC5pc0lucHV0VmFsaWQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0FudE1haW4uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9BbnRNYWluLmphdmEKaW5kZXggNDcwM2VhYS4uZDMxOWNjZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0FudE1haW4uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvQW50TWFpbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xhdW5jaEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xhdW5jaEV4Y2VwdGlvbi5qYXZhCmluZGV4IDFiYjM3ZjguLmI3YTVhMDUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoRXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hlci5qYXZhCmluZGV4IDk1Mzc5MmIuLjFmZjFiMDcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9MYXVuY2hlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsOSArMjUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiAKLQotCi0KIC8qKgogICogVGhpcyBpcyBhIGxhdW5jaGVyIGZvciBBbnQuCiAgKgpAQCAtMzUsOSArMzIsNiBAQAogICovCiBwdWJsaWMgY2xhc3MgTGF1bmNoZXIgewogCi0gICAgcHJpdmF0ZSBMYXVuY2hlcigpIHsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBUaGUgQW50IEhvbWUgKGluc3RhbGxhdGlvbikgRGlyZWN0b3J5IHByb3BlcnR5LgogICAgICAqIHtAdmFsdWV9CkBAIC02MywxMSArNTcsNiBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9QUklWQVRFTElCID0gImxpYiI7CiAKICAgICAvKioKLSAgICAgKiBsYXVuY2ggZGlhZ25vc3RpY3MgZmxhZzsgZm9yIGRlYnVnZ2luZyB0cm91YmxlIGF0IGxhdW5jaCB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGxhdW5jaERpYWcgPSBmYWxzZTsKLQotICAgIC8qKgogICAgICAqIFRoZSBsb2NhdGlvbiBvZiBhIHBlci11c2VyIGxpYnJhcnkgZGlyZWN0b3J5LgogICAgICAqIDxwPkl0J3MgdmFsdWUgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2Yge0BsaW5rICNBTlRfUFJJVkFURURJUn0KICAgICAgKiB3aXRoIHtAbGluayAjQU5UX1BSSVZBVEVMSUJ9LCB3aXRoIGFuIGFwcHJvcHJpYXRlIGZpbGUgc2VwYXJhdG9yCkBAIC0xMjYsNiArMTE1LDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBsYXVuY2ggZGlhZ25vc3RpY3MgZmxhZzsgZm9yIGRlYnVnZ2luZyB0cm91YmxlIGF0IGxhdW5jaCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGxhdW5jaERpYWcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgTGF1bmNoZXIoKSB7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogQWRkIGEgQ0xBU1NQQVRIIG9yIC1saWIgdG8gbGliIHBhdGggdXJscy4KQEAgLTE0Myw3ICsxMzksNyBAQAogICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CiAgICAgICAgICAgICBmaW5hbCBGaWxlIGVsZW1lbnQgPSBuZXcgRmlsZShlbGVtZW50TmFtZSk7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuaW5kZXhPZignJScpICE9IC0xICYmICFlbGVtZW50LmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudE5hbWUuY29udGFpbnMoIiUiKSAmJiAhZWxlbWVudC5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldEphcnMgJiYgZWxlbWVudC5pc0RpcmVjdG9yeSgpKSB7CkBAIC0xNTYsNyArMTUyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBMb2NhdG9yLmZpbGVUb1VSTChlbGVtZW50KTsKKyAgICAgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKGVsZW1lbnQudG9VUkkoKS50b0FTQ0lJU3RyaW5nKCkpOwogICAgICAgICAgICAgaWYgKGxhdW5jaERpYWcpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBsaWJyYXJ5IFVSTDogIiArIHVybCk7CiAgICAgICAgICAgICB9CkBAIC0xOTMsNDQgKzE4OSw0NSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFhbnRIb21lLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTGF1bmNoRXhjZXB0aW9uKCJBbnQgaG9tZSBpcyBzZXQgaW5jb3JyZWN0bHkgb3IgIgotICAgICAgICAgICAgICAgICsgImFudCBjb3VsZCBub3QgYmUgbG9jYXRlZCAoZXN0aW1hdGVkIHZhbHVlPSIrYW50SG9tZS5nZXRBYnNvbHV0ZVBhdGgoKSsiKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQW50IGhvbWUgaXMgc2V0IGluY29ycmVjdGx5IG9yIGFudCBjb3VsZCBub3QgYmUgbG9jYXRlZCAoZXN0aW1hdGVkIHZhbHVlPSIKKyAgICAgICAgICAgICAgICAgICAgKyBhbnRIb21lLmdldEFic29sdXRlUGF0aCgpICsgIikiKTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaWJQYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGliUGF0aHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU3RyaW5nIGNwU3RyaW5nID0gbnVsbDsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGFyZ0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU3RyaW5nW10gbmV3QXJnczsKICAgICAgICAgYm9vbGVhbiAgbm9Vc2VyTGliID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gIG5vQ2xhc3NQYXRoID0gZmFsc2U7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1saWIiKSkgeworICAgICAgICAgICAgaWYgKCItbGliIi5lcXVhbHMoYXJnc1tpXSkpIHsKICAgICAgICAgICAgICAgICBpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigiVGhlIC1saWIgYXJndW1lbnQgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJiZSBmb2xsb3dlZCBieSBhIGxpYnJhcnkgbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgLWxpYiBhcmd1bWVudCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbGlicmFyeSBsb2NhdGlvbiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsaWJQYXRocy5hZGQoYXJnc1srK2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1jcCIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItY3AiLmVxdWFscyhhcmdzW2ldKSkgewogICAgICAgICAgICAgICAgIGlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGF1bmNoRXhjZXB0aW9uKCJUaGUgLWNwIGFyZ3VtZW50IG11c3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgZm9sbG93ZWQgYnkgYSBjbGFzc3BhdGggZXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGF1bmNoRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAtY3AgYXJndW1lbnQgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGNsYXNzcGF0aCBleHByZXNzaW9uIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChjcFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMYXVuY2hFeGNlcHRpb24oIlRoZSAtY3AgYXJndW1lbnQgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYmUgcmVwZWF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExhdW5jaEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgLWNwIGFyZ3VtZW50IG11c3Qgbm90IGJlIHJlcGVhdGVkIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNwU3RyaW5nID0gYXJnc1srK2ldOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1ub3VzZXJsaWIiKSB8fCBhcmdzW2ldLmVxdWFscygiLW5vdXNlcmxpYiIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItLW5vdXNlcmxpYiIuZXF1YWxzKGFyZ3NbaV0pIHx8ICItbm91c2VybGliIi5lcXVhbHMoYXJnc1tpXSkpIHsKICAgICAgICAgICAgICAgICBub1VzZXJMaWIgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLS1sYXVuY2hkaWFnIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi0tbGF1bmNoZGlhZyIuZXF1YWxzKGFyZ3NbaV0pKSB7CiAgICAgICAgICAgICAgICAgbGF1bmNoRGlhZyA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItLW5vY2xhc3NwYXRoIikgfHwgYXJnc1tpXS5lcXVhbHMoIi1ub2NsYXNzcGF0aCIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItLW5vY2xhc3NwYXRoIi5lcXVhbHMoYXJnc1tpXSkgfHwgIi1ub2NsYXNzcGF0aCIuZXF1YWxzKGFyZ3NbaV0pKSB7CiAgICAgICAgICAgICAgICAgbm9DbGFzc1BhdGggPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLW1haW4iKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmICgiLW1haW4iLmVxdWFscyhhcmdzW2ldKSkgewogICAgICAgICAgICAgICAgIGlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTGF1bmNoRXhjZXB0aW9uKCJUaGUgLW1haW4gYXJndW1lbnQgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmUgZm9sbG93ZWQgYnkgYSBsaWJyYXJ5IGxvY2F0aW9uIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMYXVuY2hFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIC1tYWluIGFyZ3VtZW50IG11c3QgYmUgZm9sbG93ZWQgYnkgYSBsaWJyYXJ5IGxvY2F0aW9uIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1haW5DbGFzc25hbWUgPSBhcmdzWysraV07CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYyLDggKzI1OSw4IEBACiAgICAgICAgICAgICBsaWJVUkxzLCB1c2VyVVJMcywgc3lzdGVtVVJMcywgdG9vbHNKQVIpOwogCiAgICAgICAgIC8vIG5vdyB1cGRhdGUgdGhlIGNsYXNzLnBhdGggcHJvcGVydHkKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJhc2VDbGFzc1BhdGgKLSAgICAgICAgICAgID0gbmV3IFN0cmluZ0J1ZmZlcihTeXN0ZW0uZ2V0UHJvcGVydHkoSkFWQV9DTEFTU19QQVRIKSk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYmFzZUNsYXNzUGF0aAorICAgICAgICAgICAgPSBuZXcgU3RyaW5nQnVpbGRlcihTeXN0ZW0uZ2V0UHJvcGVydHkoSkFWQV9DTEFTU19QQVRIKSk7CiAgICAgICAgIGlmIChiYXNlQ2xhc3NQYXRoLmNoYXJBdChiYXNlQ2xhc3NQYXRoLmxlbmd0aCgpIC0gMSkKICAgICAgICAgICAgICAgICA9PSBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKSB7CiAgICAgICAgICAgICBiYXNlQ2xhc3NQYXRoLnNldExlbmd0aChiYXNlQ2xhc3NQYXRoLmxlbmd0aCgpIC0gMSk7CkBAIC0yNzgsMTIgKzI3NSwxMiBAQAogCiAgICAgICAgIGZpbmFsIFVSTENsYXNzTG9hZGVyIGxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihqYXJzLCBMYXVuY2hlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobG9hZGVyKTsKLSAgICAgICAgQ2xhc3M8Pz4gbWFpbkNsYXNzID0gbnVsbDsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFudE1haW4+IG1haW5DbGFzcyA9IG51bGw7CiAgICAgICAgIGludCBleGl0Q29kZSA9IDA7CiAgICAgICAgIFRocm93YWJsZSB0aHJvd24gPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFpbkNsYXNzID0gbG9hZGVyLmxvYWRDbGFzcyhtYWluQ2xhc3NuYW1lKTsKLSAgICAgICAgICAgIGZpbmFsIEFudE1haW4gbWFpbiA9IChBbnRNYWluKSBtYWluQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIG1haW5DbGFzcyA9IGxvYWRlci5sb2FkQ2xhc3MobWFpbkNsYXNzbmFtZSkuYXNTdWJjbGFzcyhBbnRNYWluLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIEFudE1haW4gbWFpbiA9IG1haW5DbGFzcy5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgbWFpbi5zdGFydEFudChuZXdBcmdzLCBudWxsLCBudWxsKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKApAQCAtMzIwLDcgKzMxNyw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBVUkxbXSBnZXRMaWJQYXRoVVJMcyhmaW5hbCBTdHJpbmcgY3BTdHJpbmcsIGZpbmFsIExpc3Q8U3RyaW5nPiBsaWJQYXRocykKICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIExpc3Q8VVJMPiBsaWJQYXRoVVJMcyA9IG5ldyBBcnJheUxpc3Q8VVJMPigpOworICAgICAgICBmaW5hbCBMaXN0PFVSTD4gbGliUGF0aFVSTHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICBpZiAoY3BTdHJpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgYWRkUGF0aChjcFN0cmluZywgZmFsc2UsIGxpYlBhdGhVUkxzKTsKQEAgLTM0Nyw3ICszNDQsNyBAQAogICAgICAgICBpZiAoYW50TGliRGlyUHJvcGVydHkgIT0gbnVsbCkgewogICAgICAgICAgICAgYW50TGliRGlyID0gbmV3IEZpbGUoYW50TGliRGlyUHJvcGVydHkpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoYW50TGliRGlyID09IG51bGwpIHx8ICFhbnRMaWJEaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgaWYgKGFudExpYkRpciA9PSBudWxsIHx8ICFhbnRMaWJEaXIuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIGFudExpYkRpciA9IGFudExhdW5jaGVyRGlyOwogICAgICAgICAgICAgc2V0UHJvcGVydHkoQU5UTElCRElSX1BST1BFUlRZLCBhbnRMaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CkBAIC0zODksNyArMzg2LDcgQEAKICAgICAgICAgICAgIHN5c3RlbUphcnMubGVuZ3RoKTsKIAogICAgICAgICBpZiAodG9vbHNKYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgamFyc1tqYXJzLmxlbmd0aCAtIDFdID0gTG9jYXRvci5maWxlVG9VUkwodG9vbHNKYXIpOworICAgICAgICAgICAgamFyc1tqYXJzLmxlbmd0aCAtIDFdID0gbmV3IFVSTCh0b29sc0phci50b1VSSSgpLnRvQVNDSUlTdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGphcnM7CiAgICAgfQpAQCAtNDA3LDggKzQwNCw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxvZ1BhdGgoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEZpbGUgcGF0aCkgewotICAgICAgICBpZihsYXVuY2hEaWFnKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmFtZSsiPSBcIiIrcGF0aCsiXCIiKTsKKyAgICAgICAgaWYgKGxhdW5jaERpYWcpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIj0gXCIiICsgcGF0aCArICJcIiIpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yLmphdmEKaW5kZXggMDUxM2U2NC4uZjc1NTgyNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTG9jYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTMgKzE5LDE0IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS50ZXh0LkNoYXJhY3Rlckl0ZXJhdG9yOwogaW1wb3J0IGphdmEudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGhDaGVjayBPRkYgLSB1cmxzIGFyZSBsb25nIQogLyoqCkBAIC0zNSw5ICszNiw5IEBACiAgKiBJdCBpcyB1c2VkIGF0IGJvb3QgdGltZSBpbiB0aGUgbGF1bmNoZXIsIGFuZCBjYW5ub3QgbWFrZSB1c2Ugb2YgYW55IG9mIEFudCdzIG90aGVyIGNsYXNzZXMuCiAgKiA8cD4KICAqIFRoaXMgaXMgYSBzdXJwcmlzaW5nbHkgYnJpdHRsZSBwaWVjZSBvZiBjb2RlLCBhbmQgaGFzIGhhZCBsb3RzIG9mIGJ1Z3MgZmlsZWQgYWdhaW5zdCBpdDoKLSAqIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDIyNzUiPnJ1bm5pbmcgYW50IG9mZiBhIG5ldHdvcmsgc2hhcmUgY2FuIGNhdXNlIEFudCB0byBmYWlsPC9hPiwKLSAqIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODAzMSI+dXNlIEZpbGUudG9VUkkoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk8L2E+LAotICogPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MjIyMiI+TG9jYXRvciBpbXBsZW1lbnRhdGlvbiBub3QgZW5jb2RpbmcgVVJJIHN0cmluZ3MgcHJvcGVybHk6IHNwYWNlcyBpbiBwYXRoczwvYT4uCisgKiA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00MjI3NSI+cnVubmluZyBhbnQgb2ZmIGEgbmV0d29yayBzaGFyZSBjYW4gY2F1c2UgQW50IHRvIGZhaWw8L2E+LAorICogPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODAzMSI+dXNlIEZpbGUudG9VUkkoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk8L2E+LAorICogPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDIyMjIiPkxvY2F0b3IgaW1wbGVtZW50YXRpb24gbm90IGVuY29kaW5nIFVSSSBzdHJpbmdzIHByb3Blcmx5OiBzcGFjZXMgaW4gcGF0aHM8L2E+LgogICogSXQgYWxzbyBicmVha3MgRWNsaXBzZSAzLjMgQmV0YXM6CiAgKiA8YSBocmVmPSJodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTgzMjgzIj5FeGNlcHRpb24gaWYgaW5zdGFsbGF0aW9uIHBhdGggaGFzIHNwYWNlczwvYT4uCiAgKiA8cD4KQEAgLTU5LDEwICs2MCw2IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNQQUNFID0gMHgyMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMID0gMHg3RjsKIAotICAgIC8qKgotICAgICAqIGVuY29kaW5nIHVzZWQgdG8gcmVwcmVzZW50IFVSSXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUklfRU5DT0RJTkcgPSAiVVRGLTgiOwogICAgIC8vIHN0b2xlbiBmcm9tIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRW50aXR5TWFuYWdlciNnZXRVc2VyRGlyKCkKICAgICAvLyBvZiB0aGUgWGVyY2VzLUogdGVhbQogICAgIC8vIHdoaWNoIEFTQ0lJIGNoYXJhY3RlcnMgbmVlZCB0byBiZSBlc2NhcGVkCkBAIC05NSwxMSArOTIsNiBAQAogICAgICAgICAgICAgZ0FmdGVyRXNjYXBpbmcyW2NoXSA9IGdIZXhDaHNbY2ggJiBOSUJCTEVfTUFTS107CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyoqCi0gICAgICogTm90IGluc3RhbnRpYWJsZQotICAgICAqLwotICAgIHByaXZhdGUgTG9jYXRvcigpIHsKLSAgICB9CiAKICAgICAvKioKICAgICAgKiBGaW5kIHRoZSBkaXJlY3Rvcnkgb3IgamFyIGZpbGUgdGhlIGNsYXNzIGhhcyBiZWVuIGxvYWRlZCBmcm9tLgpAQCAtMTMwLDcgKzEyMiw3IEBACiAgICAgICAgIGlmIChjID09IG51bGwpIHsKICAgICAgICAgICAgIGMgPSBMb2NhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCk7CiAgICAgICAgIH0KLSAgICAgICAgVVJMIHVybCA9IG51bGw7CisgICAgICAgIFVSTCB1cmw7CiAgICAgICAgIGlmIChjID09IG51bGwpIHsKICAgICAgICAgICAgIHVybCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKHJlc291cmNlKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTE0MSwyMSArMTMzLDE5IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmICh1LnN0YXJ0c1dpdGgoImphcjpmaWxlOiIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZShmcm9tSmFyVVJJKHUpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHUuc3RhcnRzV2l0aCgiZmlsZToiKSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCB0YWlsID0gdS5pbmRleE9mKHJlc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpck5hbWUgPSB1LnN1YnN0cmluZygwLCB0YWlsKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGZyb21VUkkoZGlyTmFtZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy91bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBVUkkgZm9yIHJlYXNvbnMgdW5rbm93bi4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLQotCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0cyBhIGZpbGUgcGF0aCBmcm9tIGEgPGNvZGU+ZmlsZTo8L2NvZGU+IFVSSS4KICAgICAgKgpAQCAtMTY0LDcgKzE1NCw3IEBACiAgICAgICogPHA+UHJpb3IgdG8gSmF2YSAxLjQsPCEtLSBUT0RPIGlzIEpESyB2ZXJzaW9uIGFjdHVhbGx5IHJlbGV2YW50PyAtLT4KICAgICAgKiBzd2FsbG93cyAnJScgdGhhdCBhcmUgbm90IGZvbGxvd2VkIGJ5IHR3byBjaGFyYWN0ZXJzLjwvcD4KICAgICAgKgotICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwxMS8jZHQtc3lzaWQiPmR0LXN5c2lkPC9hPgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIveG1sMTEvI2R0LXN5c2lkIj5kdC1zeXNpZDwvYT4KICAgICAgKiB3aGljaCBtYWtlcyBzb21lIG1lbnRpb24gb2YgaG93CiAgICAgICogY2hhcmFjdGVycyBub3Qgc3VwcG9ydGVkIGJ5IFVSSSBSZWZlcmVuY2Ugc3ludGF4IHNob3VsZCBiZSBlc2NhcGVkLgogICAgICAqCkBAIC0xNzQsNTcgKzE2NCw2IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9tVVJJKFN0cmluZyB1cmkpIHsKLSAgICAgICAgcmV0dXJuIGZyb21VUklKYXZhMTModXJpKTsKLSAgICAgICAgLy8gI2J1emlsbGE4MDMxOiBmaXJzdCB0cnkgSmF2YSAxLjQuCi0gICAgICAgIC8vIFRPRE8gc2hvdWxkIHVzZSBqYXZhLm5ldC5VUkkgbm93IHRoYXQgd2UgY2FuIHJlbHkgb24gMS40Li4uCi0gICAgICAgIC8vIGJ1dCBjaGVjayBmb3IgVU5DLXJlbGF0ZWQgcmVncmVzc2lvbnMsIGUuZy4gIzQyMjc1Ci0gICAgICAgIC8vIChhbmQgcmVtZW1iZXIgdGhhdCBcXHNlcnZlclxzaGFyZVxmaWxlIC0+IGZpbGU6Ly8vL3NlcnZlci9zaGFyZS9maWxlCi0gICAgICAgIC8vIHJhdGhlciB0aGFuIC0+IGZpbGU6Ly9zZXJ2ZXIvc2hhcmUvZmlsZSBhcyBpdCBzaG91bGQ7Ci0gICAgICAgIC8vIGZpeGVkIG9ubHkgaW4gSkRLIDcncyBqYXZhLm5pby5maWxlLlBhdGgudG9VcmkpCi0gICAgICAgIC8vIHJldHVybiBmcm9tVXJpSmF2YTE0KHVyaSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmF2YTEuNCsgY29kZSB0byBleHRyYWN0IHRoZSBwYXRoIGZyb20gdGhlIFVSSS4KLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogQHJldHVybiBudWxsIGlmIGEgY29udmVyc2lvbiB3YXMgbm90IHBvc3NpYmxlCi0gICAgICovCi0gICAgLyogY3VycmVudGx5IHVudXNlZDoKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnJvbVVyaUphdmExNChTdHJpbmcgdXJpKSB7Ci0gICAgICAgIC8vIEFsc28gY2hlY2sgZm9yIHByb3Blcmx5IGZvcm1lZCBVUklzLiBBbnQgZm9ybWVybHkgcmVjb21tZW5kZWQgdXNpbmcKLSAgICAgICAgLy8gbm9uc2Vuc2UgVVJJcyBzdWNoIGFzICJmaWxlOi4vZm9vLnhtbCIgaW4gWE1MIGluY2x1ZGVzLiBZb3Ugc2hvdWxkbid0Ci0gICAgICAgIC8vIGRvIHRoYXQgKGp1c3QgImZvby54bWwiIGlzIGNvcnJlY3QpIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSB3ZSBzcGVjaWFsLWNhc2UKLSAgICAgICAgLy8gdGhpbmdzIHdoZW4gdGhlIHBhdGggaXMgbm90IGFic29sdXRlLCBhbmQgZmFsbCBiYWNrIHRvIHRoZSBvbGQgcGFyc2luZyBiZWhhdmlvci4KLSAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJmaWxlOi8iKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShVUkkuY3JlYXRlKGVuY29kZVVSSSh1cmkpKSk7Ci0gICAgICAgICAgICAgICAgLy9idWcgIzQyMjI3IGZvcmdvdCB0byBkZWNvZGUgYmVmb3JlIHJldHVybmluZwotICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVVcmkoZi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIEJhZCBVUkksIHBhc3MgdGhpcyBvbi4KLSAgICAgICAgICAgICAgICAvLyBubywgdGhpcyBpcyBkb3duZ3JhZGVkIHRvIGEgd2FybmluZyBhZnRlciB2YXJpb3VzCi0gICAgICAgICAgICAgICAgLy8gSlJFIGJ1Z3Mgc3VyZmFjZWQuIEhhbmQgb2ZmCi0gICAgICAgICAgICAgICAgLy8gdG8gb3VyIGJ1aWx0IGluIGNvZGUgb24gYSBmYWlsdXJlCi0gICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIC8vICAgIkJhZCBVUkkgIiArIHVyaSArICI6IiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBVbmV4cGVjdGVkIGV4Y2VwdGlvbj8gU2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gdXJpIHVyaSB0byBleHBhbmQKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIFVSSQotICAgICAqIEBzaW5jZSBBbnQxLjcuMQotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmcm9tVVJJSmF2YTEzKFN0cmluZyB1cmkpIHsKLSAgICAgICAgLy8gRmFsbGJhY2sgbWV0aG9kIGZvciBKYXZhIDEuMyBvciBlYXJsaWVyLgotCiAgICAgICAgIFVSTCB1cmwgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdXJsID0gbmV3IFVSTCh1cmkpOwpAQCAtMjM0LDcgKzE3Myw3IEBACiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCB8fCAhKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihFUlJPUl9OT1RfRklMRV9VUkkgKyB1cmkpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHVybC5nZXRIb3N0KCkpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHVybC5nZXRIb3N0KCkpOwogICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgYnVmLmluc2VydCgwLCBGaWxlLnNlcGFyYXRvckNoYXIpLmluc2VydCgwLCBGaWxlLnNlcGFyYXRvckNoYXIpOwogICAgICAgICB9CkBAIC0yNTcsNyArMTk2LDcgQEAKICAgICAgICAgICAgIGludCBwb3NpID0gY3dkLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgIGJvb2xlYW4gcGF0aFN0YXJ0c1dpdGhGaWxlU2VwYXJhdG9yID0gcGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKTsKICAgICAgICAgICAgIGJvb2xlYW4gcGF0aFN0YXJ0c1dpdGhVTkMgPSBwYXRoLnN0YXJ0c1dpdGgoIiIgKyBGaWxlLnNlcGFyYXRvciArIEZpbGUuc2VwYXJhdG9yKTsKLSAgICAgICAgICAgIGlmICgocG9zaSA+IDApICYmIHBhdGhTdGFydHNXaXRoRmlsZVNlcGFyYXRvciAmJiAhcGF0aFN0YXJ0c1dpdGhVTkMpIHsKKyAgICAgICAgICAgIGlmIChwb3NpID4gMCAmJiBwYXRoU3RhcnRzV2l0aEZpbGVTZXBhcmF0b3IgJiYgIXBhdGhTdGFydHNXaXRoVU5DKSB7CiAgICAgICAgICAgICAgICAgcGF0aCA9IGN3ZC5zdWJzdHJpbmcoMCwgcG9zaSArIDEpICsgcGF0aDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleGMpIHsKQEAgLTI5Miw3ICsyMzEsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlVXJpKFN0cmluZyB1cmkpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHVyaS5pbmRleE9mKCclJykgPT0gLTEpIHsKKyAgICAgICAgaWYgKCF1cmkuY29udGFpbnMoIiUiKSkgewogICAgICAgICAgICAgcmV0dXJuIHVyaTsKICAgICAgICAgfQogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc2IgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKHVyaS5sZW5ndGgoKSk7CkBAIC0zMTIsMTEgKzI1MSwxMSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChjID49IDB4MDAwMCAmJiBjIDwgMHgwMDgwKSB7CiAgICAgICAgICAgICAgICAgc2Iud3JpdGUoYyk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyAjNTA1NDMKLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBTdHJpbmcudmFsdWVPZihjKS5nZXRCeXRlcyhVUklfRU5DT0RJTkcpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFN0cmluZy52YWx1ZU9mKGMpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgICAgICAgICAgICAgIHNiLndyaXRlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZyhVUklfRU5DT0RJTkcpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOC5uYW1lKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI0LDE0ICsyNjMsMTMgQEAKICAgICAgKiBUaGUgVVJJIGlzIGVzY2FwZWQKICAgICAgKiBAcGFyYW0gcGF0aCBTdHJpbmcgdG8gZW5jb2RlLgogICAgICAqIEByZXR1cm4gVGhlIGVuY29kZWQgc3RyaW5nLCBhY2NvcmRpbmcgdG8gVVJJIG5vcm1zCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIFVURi04IGlzIG5vdCBhdmFpbGFibGUKICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVVSSShTdHJpbmcgcGF0aCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZVVSSShTdHJpbmcgcGF0aCkgewogICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgIGludCBsZW4gPSBwYXRoLmxlbmd0aCgpOwogICAgICAgICBpbnQgY2ggPSAwOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBudWxsOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbnVsbDsKICAgICAgICAgZm9yICg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgY2ggPSBwYXRoLmNoYXJBdChpKTsKICAgICAgICAgICAgIC8vIGlmIGl0J3Mgbm90IGFuIEFTQ0lJIGNoYXJhY3RlciwgYnJlYWsgaGVyZSwgYW5kIHVzZSBVVEYtOCBlbmNvZGluZwpAQCAtMzQwLDcgKzI3OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ05lZWRFc2NhcGluZ1tjaF0pIHsKICAgICAgICAgICAgICAgICBpZiAoc2IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aC5zdWJzdHJpbmcoMCwgaSkpOworICAgICAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHBhdGguc3Vic3RyaW5nKDAsIGkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCclJyk7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGdBZnRlckVzY2FwaW5nMVtjaF0pOwpAQCAtMzU0LDE3ICsyOTIsMTUgQEAKICAgICAgICAgLy8gd2Ugc2F3IHNvbWUgbm9uLWFzY2lpIGNoYXJhY3RlcgogICAgICAgICBpZiAoaSA8IGxlbikgewogICAgICAgICAgICAgaWYgKHNiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aC5zdWJzdHJpbmcoMCwgaSkpOworICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIocGF0aC5zdWJzdHJpbmcoMCwgaSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZ2V0IFVURi04IGJ5dGVzIGZvciB0aGUgcmVtYWluaW5nIHN1Yi1zdHJpbmcKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG51bGw7Ci0gICAgICAgICAgICBieXRlIGI7Ci0gICAgICAgICAgICBieXRlcyA9IHBhdGguc3Vic3RyaW5nKGkpLmdldEJ5dGVzKFVSSV9FTkNPRElORyk7CisgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBwYXRoLnN1YnN0cmluZyhpKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAgICAgIGxlbiA9IGJ5dGVzLmxlbmd0aDsKIAogICAgICAgICAgICAgLy8gZm9yIGVhY2ggYnl0ZQogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYiA9IGJ5dGVzW2ldOworICAgICAgICAgICAgICAgIGJ5dGUgYiA9IGJ5dGVzW2ldOwogICAgICAgICAgICAgICAgIC8vIGZvciBub24tYXNjaWkgY2hhcmFjdGVyOiBtYWtlIGl0IHBvc2l0aXZlLCB0aGVuIGVzY2FwZQogICAgICAgICAgICAgICAgIGlmIChiIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBjaCA9IGIgKyBCWVRFX1NJWkU7CkBAIC00NjYsNyArNDAyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFVSTFtdIGdldExvY2F0aW9uVVJMcyhGaWxlIGxvY2F0aW9uKQogICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBnZXRMb2NhdGlvblVSTHMobG9jYXRpb24sIG5ldyBTdHJpbmdbXXsiLmphciJ9KTsKKyAgICAgICAgcmV0dXJuIGdldExvY2F0aW9uVVJMcyhsb2NhdGlvbiwgIi5qYXIiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4NCw4ICs0MjAsOCBAQAogICAgICAqICAgICAgICAgICAgZm9ybWVkLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0TG9jYXRpb25VUkxzKEZpbGUgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZXh0ZW5zaW9ucykKLSAgICAgICAgIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZy4uLiBleHRlbnNpb25zKQorICAgICAgICAgICAgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAgICAgICAgIFVSTFtdIHVybHMgPSBuZXcgVVJMWzBdOwogCiAgICAgICAgIGlmICghbG9jYXRpb24uZXhpc3RzKCkpIHsKQEAgLTUwMywyMiArNDM5LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdXJsczsKICAgICAgICAgfQotICAgICAgICBGaWxlW10gbWF0Y2hlcyA9IGxvY2F0aW9uLmxpc3RGaWxlcygKLSAgICAgICAgICAgIG5ldyBGaWxlbmFtZUZpbHRlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaXR0bGVOYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdHRsZU5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgIEZpbGVbXSBtYXRjaGVzID0gbG9jYXRpb24ubGlzdEZpbGVzKChkaXIsIG5hbWUpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBsaXR0bGVOYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtLm9mKGV4dGVuc2lvbnMpLmFueU1hdGNoKGxpdHRsZU5hbWU6OmVuZHNXaXRoKTsKKyAgICAgICAgfSk7CiAgICAgICAgIHVybHMgPSBuZXcgVVJMW21hdGNoZXMubGVuZ3RoXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRjaGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICB1cmxzW2ldID0gZmlsZVRvVVJMKG1hdGNoZXNbaV0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB1cmxzOwogICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdCBpbnN0YW50aWFibGUKKyAgICAgKi8KKyAgICBwcml2YXRlIExvY2F0b3IoKSB7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9BbnNpQ29sb3JMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0Fuc2lDb2xvckxvZ2dlci5qYXZhCmluZGV4IGZiMjJmNzUuLjM4NGYzNzAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0Fuc2lDb2xvckxvZ2dlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0Fuc2lDb2xvckxvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTAgKzE3LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EZWZhdWx0TG9nZ2VyOwpAQCAtMTYyLDcgKzE2Myw3IEBACiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3AgPSBuZXcgUHJvcGVydGllcygpOwogCiAgICAgICAgICAgICBpZiAodXNlckNvbG9yRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHVzZXJDb2xvckZpbGUpOworICAgICAgICAgICAgICAgIGluID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KHVzZXJDb2xvckZpbGUpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oc3lzdGVtQ29sb3JGaWxlKTsKICAgICAgICAgICAgIH0KQEAgLTIxMiw3ICsyMTMsNyBAQAogICAgICAgICAgICAgICAgIGNvbG9yc1NldCA9IHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKG1lc3NhZ2UpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcihtZXNzYWdlKTsKICAgICAgICAgICAgIHN3aXRjaCAocHJpb3JpdHkpIHsKICAgICAgICAgICAgICAgICBjYXNlIFByb2plY3QuTVNHX0VSUjoKICAgICAgICAgICAgICAgICAgICAgbXNnLmluc2VydCgwLCBlcnJDb2xvcik7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9CaWdQcm9qZWN0TG9nZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9CaWdQcm9qZWN0TG9nZ2VyLmphdmEKaW5kZXggN2Q2MThiYy4uOTUyYTY3ZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvQmlnUHJvamVjdExvZ2dlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0JpZ1Byb2plY3RMb2dnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEyICsxNyw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuU3ViQnVpbGRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvZ2dlciB0aGF0IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsKQEAgLTEyMCwxOCArMTE3LDExIEBACiAgICAgICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLiBNdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzdWJCdWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGV4dHJhY3ROYW1lT3JEZWZhdWx0KGV2ZW50KTsKICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgIEZpbGUgYmFzZSA9IHByb2plY3QgPT0gbnVsbCA/IG51bGwgOiBwcm9qZWN0LmdldEJhc2VEaXIoKTsKLSAgICAgICAgU3RyaW5nIHBhdGggPQotICAgICAgICAgICAgKGJhc2UgPT0gbnVsbCkKLSAgICAgICAgICAgID8gIldpdGggbm8gYmFzZSBkaXJlY3RvcnkiCi0gICAgICAgICAgICA6ICJJbiAiICsgYmFzZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgcHJpbnRNZXNzYWdlKFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgZ2V0SGVhZGVyKCkKLSAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgIkVudGVyaW5nIHByb2plY3QgIiArIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKyBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgZ2V0Rm9vdGVyKCksCisgICAgICAgIFN0cmluZyBwYXRoID0gKHByb2plY3QgPT0gbnVsbCkgPyAiV2l0aCBubyBiYXNlIGRpcmVjdG9yeSIKKyAgICAgICAgICAgICAgICA6ICJJbiAiICsgcHJvamVjdC5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHByaW50TWVzc2FnZShTdHJpbmcuZm9ybWF0KCIlbiVzJW5FbnRlcmluZyBwcm9qZWN0ICVzJW4lcyVuJXMiLCBnZXRIZWFkZXIoKSwKKyAgICAgICAgICAgICAgICBleHRyYWN0TmFtZU9yRGVmYXVsdChldmVudCksIHBhdGgsIGdldEZvb3RlcigpKSwKICAgICAgICAgICAgICAgICBvdXQsCiAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7CiAgICAgfQpAQCAtMTU0LDEyICsxNDQsOSBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgdm9pZCBzdWJCdWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBleHRyYWN0TmFtZU9yRGVmYXVsdChldmVudCk7Ci0gICAgICAgIFN0cmluZyBmYWlsZWQgPSBldmVudC5nZXRFeGNlcHRpb24oKSAhPSBudWxsID8gImZhaWxpbmcgIiA6ICIiOwotICAgICAgICBwcmludE1lc3NhZ2UoU3RyaW5nVXRpbHMuTElORV9TRVAgKyBnZXRIZWFkZXIoKQotICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKyAiRXhpdGluZyAiICsgZmFpbGVkICsgInByb2plY3QgIgotICAgICAgICAgICAgICAgICsgbmFtZQotICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKyBnZXRGb290ZXIoKSwKKyAgICAgICAgcHJpbnRNZXNzYWdlKFN0cmluZy5mb3JtYXQoIiVuJXMlbkV4aXRpbmcgJXNwcm9qZWN0ICVzJW4lcyIsCisgICAgICAgICAgICAgICAgZ2V0SGVhZGVyKCksIGV2ZW50LmdldEV4Y2VwdGlvbigpICE9IG51bGwgPyAiZmFpbGluZyAiIDogIiIsCisgICAgICAgICAgICAgICAgZXh0cmFjdE5hbWVPckRlZmF1bHQoZXZlbnQpLCBnZXRGb290ZXIoKSksCiAgICAgICAgICAgICAgICAgb3V0LAogICAgICAgICAgICAgICAgIGV2ZW50LmdldFByaW9yaXR5KCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0NvbW1vbnNMb2dnaW5nTGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0NvbW1vbnNMb2dnaW5nTGlzdGVuZXIuamF2YQppbmRleCBjYjRiYWExLi44N2IwOWQ2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Db21tb25zTG9nZ2luZ0xpc3RlbmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvQ29tbW9uc0xvZ2dpbmdMaXN0ZW5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICBpZiAoc3VmZml4ICE9IG51bGwpIHsKICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5yZXBsYWNlKCcuJywgJy0nKTsKICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5yZXBsYWNlKCcgJywgJy0nKTsKLSAgICAgICAgICAgIGNhdCA9IGNhdCArICIuIiArIHN1ZmZpeDsKKyAgICAgICAgICAgIGNhdCArPSAiLiIgKyBzdWZmaXg7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgUHJpbnRTdHJlYW0gdG1wT3V0ID0gU3lzdGVtLm91dDsKICAgICAgICAgZmluYWwgUHJpbnRTdHJlYW0gdG1wRXJyID0gU3lzdGVtLmVycjsKQEAgLTEwMiw2ICsxMDIsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGZpbmFsIExvZyBsb2cgPSBnZXRMb2coUFJPSkVDVF9MT0csIG51bGwpOwogCkBAIC0xMTEsNiArMTEyLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKGZpbmFsIEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICBmaW5hbCBMb2cgbG9nID0gZ2V0TG9nKFBST0pFQ1RfTE9HLCBldmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKQEAgLTEyOCw2ICsxMzAsNyBAQAogICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkCiAgICAgICoge0Bpbmhlcml0RG9jfS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKGZpbmFsIEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICBmaW5hbCBMb2cgbG9nID0gZ2V0TG9nKFRBUkdFVF9MT0csCkBAIC0xNDMsNiArMTQ2LDcgQEAKICAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKGZpbmFsIEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9IGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKTsKQEAgLTE2Miw2ICsxNjYsNyBAQAogICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZAogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoZmluYWwgQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IGV2ZW50LmdldFRhc2soKTsKQEAgLTE4NCw2ICsxODksNyBAQAogICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewogICAgICAgICAgICAgZmluYWwgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwpAQCAtMjEzLDE2ICsyMTksMTYgQEAKICAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZAogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChpbml0aWFsaXplZCkgewogICAgICAgICAgICAgT2JqZWN0IGNhdGVnb3J5T2JqZWN0ID0gZXZlbnQuZ2V0VGFzaygpOwotICAgICAgICAgICAgU3RyaW5nIGNhdGVnb3J5U3RyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeVN0cmluZzsKICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeURldGFpbCA9IG51bGw7CiAKICAgICAgICAgICAgIGlmIChjYXRlZ29yeU9iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2F0ZWdvcnlPYmplY3QgPSBldmVudC5nZXRUYXJnZXQoKTsKICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnlPYmplY3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFByb2plY3QoKTsKICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTdHJpbmcgPSBQUk9KRUNUX0xPRzsKICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlEZXRhaWwgPSBldmVudC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yOTgsNiArMzA0LDcgQEAKICAgICAgKiBUaGlzIGlzIG5vdCB1c2VkLCB0aGUgbG9nZ2VyIGNvbmZpZyBpcyB1c2VkIGluc3RlYWQuCiAgICAgICogQHBhcmFtIGxldmVsIGlnbm9yZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoZmluYWwgaW50IGxldmVsKSB7CiAgICAgICAgIC8vIFVzZSB0aGUgbG9nZ2VyIGNvbmZpZwogICAgIH0KQEAgLTMwNiw2ICszMTMsNyBAQAogICAgICAqIFNldCB0aGUgb3V0cHV0IHByaW50IHN0cmVhbS4KICAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgc3RyZWFtCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oZmluYWwgUHJpbnRTdHJlYW0gb3V0cHV0KSB7CiAgICAgICAgIHRoaXMub3V0ID0gb3V0cHV0OwogICAgIH0KQEAgLTMxNSw2ICszMjMsNyBAQAogICAgICAqIFRoaXMgaXMgaWdub3JlZC4KICAgICAgKiBAcGFyYW0gZW1hY3NNb2RlIGlnbm9yZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFbWFjc01vZGUoZmluYWwgYm9vbGVhbiBlbWFjc01vZGUpIHsKICAgICAgICAgLy8gRG9lc24ndCBtYWtlIHNlbnNlIGZvciBjLWwuIFVzZSB0aGUgbG9nZ2VyIGNvbmZpZwogICAgIH0KQEAgLTMyMyw2ICszMzIsNyBAQAogICAgICAqIFNldCB0aGUgZXJyb3IgcHJpbnQgc3RyZWFtLgogICAgICAqIEBwYXJhbSBlcnIgdGhlIGVycm9yIHN0cmVhbQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEVycm9yUHJpbnRTdHJlYW0oZmluYWwgUHJpbnRTdHJlYW0gZXJyKSB7CiAgICAgICAgIHRoaXMuZXJyID0gZXJyOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0xvZzRqTGlzdGVuZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL0xvZzRqTGlzdGVuZXIuamF2YQppbmRleCBiNjkxMzAwLi40OTJiOWM4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Mb2c0akxpc3RlbmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTG9nNGpMaXN0ZW5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDQsNiArNDQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBMb2c0akxpc3RlbmVyKCkgewogICAgICAgICAvLyB0cmlnZ2VyIHRoZSBsb2c0aiBpbml0aWFsaXphdGlvbiAoaWYgYXQgYWxsIGl0J3Mgbm90IHlldCBpbml0aWFsaXplZCkKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgICAgIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKExPR19BTlQpOwogICAgIH0KIApAQCAtNTEsNiArNTIsNyBAQAogICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciNidWlsZFN0YXJ0ZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgbG9nLmluZm8oIkJ1aWxkIHN0YXJ0ZWQuIik7CkBAIC02MCw2ICs2Miw3IEBACiAgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI2J1aWxkRmluaXNoZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoZmluYWwgQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihQcm9qZWN0LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKSB7CkBAIC03Myw2ICs3Niw3IEBACiAgICAgICogQHNlZSBCdWlsZExpc3RlbmVyI3RhcmdldFN0YXJ0ZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoZmluYWwgQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihUYXJnZXQuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgbG9nLmluZm8oIlRhcmdldCBcIiIgKyBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkgKyAiXCIgc3RhcnRlZC4iKTsKQEAgLTgyLDYgKzg2LDcgQEAKICAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFyZ2V0RmluaXNoZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKGZpbmFsIEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCk7CiAgICAgICAgIGZpbmFsIExvZ2dlciBjYXQgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRhcmdldC5jbGFzcy5nZXROYW1lKCkpOwpAQCAtOTcsNiArMTAyLDcgQEAKICAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjdGFza1N0YXJ0ZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKGZpbmFsIEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgZmluYWwgVGFzayB0YXNrID0gZXZlbnQuZ2V0VGFzaygpOwogICAgICAgICBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcih0YXNrLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKQEAgLTEwNyw2ICsxMTMsNyBAQAogICAgICAqIEBzZWUgQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IGV2ZW50LmdldFRhc2soKTsKICAgICAgICAgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIodGFzay5nZXRDbGFzcygpLmdldE5hbWUoKSk7CkBAIC0xMjIsNyArMTI5LDcgQEAKICAgICAgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZAogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCi0gICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChmaW5hbCBCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIE9iamVjdCBjYXRlZ29yeU9iamVjdCA9IGV2ZW50LmdldFRhc2soKTsKICAgICAgICAgaWYgKGNhdGVnb3J5T2JqZWN0ID09IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL01haWxMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL01haWxMb2dnZXIuamF2YQppbmRleCAyZGU1NWJmLi5kZTljZGEwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9NYWlsTG9nZ2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvTWFpbExvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMjkgKzE3LDI4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQubGlzdGVuZXI7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkVtYWlsQWRkcmVzczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuTWFpbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLk1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5DbGFzc3BhdGhVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRhdGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZTsKIAogLyoqCkBAIC05NiwyMSArOTUsMjIgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBNYWlsTG9nZ2VyIGV4dGVuZHMgRGVmYXVsdExvZ2dlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvcGxhaW4iOworCiAgICAgLyoqIEJ1ZmZlciBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb25zdHJ1Y3RlZCBwcmlvciB0byBzZW5kaW5nICovCiAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvcGxhaW4iOwotCiAgICAgLyoqCiAgICAgICogIFNlbmRzIGFuIGUtbWFpbCB3aXRoIHRoZSBsb2cgcmVzdWx0cy4KICAgICAgKgogICAgICAqIEBwYXJhbSBldmVudCB0aGUgYnVpbGQgZmluaXNoZWQgZXZlbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgc3VwZXIuYnVpbGRGaW5pc2hlZChldmVudCk7CiAKICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpOwotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBwcm9qZWN0LmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCk7CiAKICAgICAgICAgLy8gb3ZlcmxheSBzcGVjaWZpZWQgcHJvcGVydGllcyBmaWxlIChpZiBhbnkpLCB3aGljaCBvdmVycmlkZXMgcHJvamVjdAogICAgICAgICAvLyBzZXR0aW5ncwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIGlmIChmaWxlbmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgaXMgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShQYXRocy5nZXQoZmlsZW5hbWUpKTsKICAgICAgICAgICAgICAgICBmaWxlUHJvcGVydGllcy5sb2FkKGlzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBiZWNhdXNlIHByb3BlcnRpZXMgZmlsZSBpcyBub3QgcmVxdWlyZWQKQEAgLTEyOCwxMSArMTI4LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4gZSA9IGZpbGVQcm9wZXJ0aWVzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBmaWxlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoa2V5LCBwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKHZhbHVlKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZmlsZVByb3BlcnRpZXMuc3RyaW5nUHJvcGVydHlOYW1lcygpCisgICAgICAgICAgICAgICAgLmZvckVhY2goa2V5IC0+IHByb3BlcnRpZXMucHV0KGtleSwgcHJvamVjdC5yZXBsYWNlUHJvcGVydGllcyhmaWxlUHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpKSkpOwogCiAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IChldmVudC5nZXRFeGNlcHRpb24oKSA9PSBudWxsKTsKICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHN1Y2Nlc3MgPyAic3VjY2VzcyIgOiAiZmFpbHVyZSI7CkBAIC0xNjcsOCArMTY0LDggQEAKICAgICAgICAgICAgICAgICAuc3ViamVjdChnZXRWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcywgcHJlZml4ICsgIi5zdWJqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1Y2Nlc3MpID8gIkJ1aWxkIFN1Y2Nlc3MiIDogIkJ1aWxkIEZhaWx1cmUiKSk7Ci0gICAgICAgICAgICBpZiAodmFsdWVzLnVzZXIoKS5lcXVhbHMoIiIpCi0gICAgICAgICAgICAgICAgJiYgdmFsdWVzLnBhc3N3b3JkKCkuZXF1YWxzKCIiKQorICAgICAgICAgICAgaWYgKHZhbHVlcy51c2VyKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgdmFsdWVzLnBhc3N3b3JkKCkuaXNFbXB0eSgpCiAgICAgICAgICAgICAgICAgJiYgIXZhbHVlcy5zc2woKSAmJiAhdmFsdWVzLnN0YXJ0dGxzKCkpIHsKICAgICAgICAgICAgICAgICBzZW5kTWFpbCh2YWx1ZXMsIGJ1ZmZlci5zdWJzdHJpbmcoMCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTMwOSw4ICszMDYsOSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgYmVpbmcgbG9nZ2VyCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQobWVzc2FnZSkuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChtZXNzYWdlKS5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgfQogCiAKQEAgLTMyNCw3ICszMjIsNyBAQAogICAgICAqICAgICAgU2V0IHRvIG51bGwgdG8gbWFrZSByZXF1aXJlZC4KICAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIGRlZmF1bHQgdmFsdWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzLCBTdHJpbmcgbmFtZSwKKyAgICBwcml2YXRlIFN0cmluZyBnZXRWYWx1ZShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIFN0cmluZyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9ICJNYWlsTG9nZ2VyLiIgKyBuYW1lOwogICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwpAQCAtMzUzLDcgKzM1MSw3IEBACiAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcigiRGF0ZSIsIERhdGVVdGlscy5nZXREYXRlRm9ySGVhZGVyKCkpOwogCiAgICAgICAgIG1haWxNZXNzYWdlLmZyb20odmFsdWVzLmZyb20oKSk7Ci0gICAgICAgIGlmICghdmFsdWVzLnJlcGx5dG9MaXN0KCkuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoIXZhbHVlcy5yZXBseXRvTGlzdCgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHQgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAogICAgICAgICAgICAgICAgIHZhbHVlcy5yZXBseXRvTGlzdCgpLCAiLCAiLCBmYWxzZSk7CiAgICAgICAgICAgICB3aGlsZSAodC5oYXNNb3JlVG9rZW5zKCkpIHsKQEAgLTM2NywxNSArMzY1LDE1IEBACiAKICAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0U3ViamVjdCh2YWx1ZXMuc3ViamVjdCgpKTsKIAotICAgICAgICBpZiAodmFsdWVzLmNoYXJzZXQoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKHZhbHVlcy5jaGFyc2V0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtYWlsTWVzc2FnZS5zZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHZhbHVlcy5taW1lVHlwZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgdmFsdWVzLm1pbWVUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI7IGNoYXJzZXQ9XCIiICsgdmFsdWVzLmNoYXJzZXQoKSArICJcIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFpbE1lc3NhZ2Uuc2V0SGVhZGVyKCJDb250ZW50LVR5cGUiLCB2YWx1ZXMubWltZVR5cGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBQcmludFN0cmVhbSBwcyA9IG1haWxNZXNzYWdlLmdldFByaW50U3RyZWFtKCk7Ci0gICAgICAgIHBzLnByaW50bG4odmFsdWVzLmJvZHkoKS5sZW5ndGgoKSA+IDAgPyB2YWx1ZXMuYm9keSgpIDogbWVzc2FnZSk7CisgICAgICAgIHBzLnByaW50bG4odmFsdWVzLmJvZHkoKS5pc0VtcHR5KCkgPyBtZXNzYWdlIDogdmFsdWVzLmJvZHkoKSk7CiAKICAgICAgICAgbWFpbE1lc3NhZ2Uuc2VuZEFuZENsb3NlKCk7CiAgICAgfQpAQCAtMzg4LDcgKzM4Niw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHNlbmRNaW1lTWFpbChQcm9qZWN0IHByb2plY3QsIFZhbHVlcyB2YWx1ZXMsIFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIE1haWxlciBtYWlsZXIgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgbWFpbGVyID0gKE1haWxlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoCisgICAgICAgICAgICBtYWlsZXIgPSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLk1pbWVNYWlsZXIiLAogICAgICAgICAgICAgICAgICAgICBNYWlsTG9nZ2VyLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIE1haWxlci5jbGFzcyk7CiAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKQEAgLTM5Nyw3ICszOTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIC8vIGNvbnZlcnQgdGhlIHJlcGx5VG8gc3RyaW5nIGludG8gYSB2ZWN0b3Igb2YgZW1haWxhZGRyZXNzZXMKLSAgICAgICAgVmVjdG9yPEVtYWlsQWRkcmVzcz4gcmVwbHlUb0xpc3QgPSB2ZWN0b3JpemVFbWFpbEFkZHJlc3Nlcyh2YWx1ZXMucmVwbHl0b0xpc3QoKSk7CisgICAgICAgIFZlY3RvcjxFbWFpbEFkZHJlc3M+IHJlcGx5VG9MaXN0ID0gc3BsaXRFbWFpbEFkZHJlc3Nlcyh2YWx1ZXMucmVwbHl0b0xpc3QoKSk7CiAgICAgICAgIG1haWxlci5zZXRIb3N0KHZhbHVlcy5tYWlsaG9zdCgpKTsKICAgICAgICAgbWFpbGVyLnNldFBvcnQodmFsdWVzLnBvcnQoKSk7CiAgICAgICAgIG1haWxlci5zZXRVc2VyKHZhbHVlcy51c2VyKCkpOwpAQCAtNDA1LDM0ICs0MDMsMjkgQEAKICAgICAgICAgbWFpbGVyLnNldFNTTCh2YWx1ZXMuc3NsKCkpOwogICAgICAgICBtYWlsZXIuc2V0RW5hYmxlU3RhcnRUTFModmFsdWVzLnN0YXJ0dGxzKCkpOwogICAgICAgICBNZXNzYWdlIG15bWVzc2FnZSA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZSh2YWx1ZXMuYm9keSgpLmxlbmd0aCgpID4gMCA/IHZhbHVlcy5ib2R5KCkgOiBtZXNzYWdlKTsKKyAgICAgICAgICAgIG5ldyBNZXNzYWdlKCF2YWx1ZXMuYm9keSgpLmlzRW1wdHkoKSA/IHZhbHVlcy5ib2R5KCkgOiBtZXNzYWdlKTsKICAgICAgICAgbXltZXNzYWdlLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIG15bWVzc2FnZS5zZXRNaW1lVHlwZSh2YWx1ZXMubWltZVR5cGUoKSk7Ci0gICAgICAgIGlmICh2YWx1ZXMuY2hhcnNldCgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoIXZhbHVlcy5jaGFyc2V0KCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBteW1lc3NhZ2Uuc2V0Q2hhcnNldCh2YWx1ZXMuY2hhcnNldCgpKTsKICAgICAgICAgfQogICAgICAgICBtYWlsZXIuc2V0TWVzc2FnZShteW1lc3NhZ2UpOwogICAgICAgICBtYWlsZXIuc2V0RnJvbShuZXcgRW1haWxBZGRyZXNzKHZhbHVlcy5mcm9tKCkpKTsKICAgICAgICAgbWFpbGVyLnNldFJlcGx5VG9MaXN0KHJlcGx5VG9MaXN0KTsKLSAgICAgICAgVmVjdG9yPEVtYWlsQWRkcmVzcz4gdG9MaXN0ID0gdmVjdG9yaXplRW1haWxBZGRyZXNzZXModmFsdWVzLnRvTGlzdCgpKTsKKyAgICAgICAgVmVjdG9yPEVtYWlsQWRkcmVzcz4gdG9MaXN0ID0gc3BsaXRFbWFpbEFkZHJlc3Nlcyh2YWx1ZXMudG9MaXN0KCkpOwogICAgICAgICBtYWlsZXIuc2V0VG9MaXN0KHRvTGlzdCk7Ci0gICAgICAgIFZlY3RvcjxFbWFpbEFkZHJlc3M+IHRvQ2NMaXN0ID0gdmVjdG9yaXplRW1haWxBZGRyZXNzZXModmFsdWVzLnRvQ2NMaXN0KCkpOworICAgICAgICBWZWN0b3I8RW1haWxBZGRyZXNzPiB0b0NjTGlzdCA9IHNwbGl0RW1haWxBZGRyZXNzZXModmFsdWVzLnRvQ2NMaXN0KCkpOwogICAgICAgICBtYWlsZXIuc2V0Q2NMaXN0KHRvQ2NMaXN0KTsKLSAgICAgICAgVmVjdG9yPEVtYWlsQWRkcmVzcz4gdG9CY2NMaXN0ID0gdmVjdG9yaXplRW1haWxBZGRyZXNzZXModmFsdWVzLnRvQmNjTGlzdCgpKTsKKyAgICAgICAgVmVjdG9yPEVtYWlsQWRkcmVzcz4gdG9CY2NMaXN0ID0gc3BsaXRFbWFpbEFkZHJlc3Nlcyh2YWx1ZXMudG9CY2NMaXN0KCkpOwogICAgICAgICBtYWlsZXIuc2V0QmNjTGlzdCh0b0JjY0xpc3QpOwotICAgICAgICBtYWlsZXIuc2V0RmlsZXMobmV3IFZlY3RvcjxGaWxlPigpKTsKKyAgICAgICAgbWFpbGVyLnNldEZpbGVzKG5ldyBWZWN0b3I8PigpKTsKICAgICAgICAgbWFpbGVyLnNldFN1YmplY3QodmFsdWVzLnN1YmplY3QoKSk7Ci0gICAgICAgIG1haWxlci5zZXRIZWFkZXJzKG5ldyBWZWN0b3I8SGVhZGVyPigpKTsKKyAgICAgICAgbWFpbGVyLnNldEhlYWRlcnMobmV3IFZlY3Rvcjw+KCkpOwogICAgICAgICBtYWlsZXIuc2VuZCgpOwogICAgIH0KLSAgICBwcml2YXRlIFZlY3RvcjxFbWFpbEFkZHJlc3M+IHZlY3Rvcml6ZUVtYWlsQWRkcmVzc2VzKFN0cmluZyBsaXN0U3RyaW5nKSB7Ci0gICAgICAgIFZlY3RvcjxFbWFpbEFkZHJlc3M+IGVtYWlsTGlzdCA9IG5ldyBWZWN0b3I8RW1haWxBZGRyZXNzPigpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0U3RyaW5nLCAiLCIpOwotICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZW1haWxMaXN0LmFkZEVsZW1lbnQobmV3IEVtYWlsQWRkcmVzcyh0b2tlbnMubmV4dFRva2VuKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW1haWxMaXN0OworCisgICAgcHJpdmF0ZSBWZWN0b3I8RW1haWxBZGRyZXNzPiBzcGxpdEVtYWlsQWRkcmVzc2VzKFN0cmluZyBsaXN0U3RyaW5nKSB7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YobGlzdFN0cmluZy5zcGxpdCgiLCIpKS5tYXAoRW1haWxBZGRyZXNzOjpuZXcpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihWZWN0b3I6Om5ldykpOwogICAgIH0KIH0KLQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Qcm9maWxlTG9nZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9Qcm9maWxlTG9nZ2VyLmphdmEKaW5kZXggYmJmNWJiNC4uNTBhZDAxYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvUHJvZmlsZUxvZ2dlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1Byb2ZpbGVMb2dnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDcgKzIzLDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGVmYXVsdExvZ2dlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFRoaXMgaXMgYSBzcGVjaWFsIGxvZ2dlciB0aGF0IGlzIGRlc2lnbmVkIHRvIHByb2ZpbGUgYnVpbGRzLgpAQCAtMzIsNyArMzEsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgUHJvZmlsZUxvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewogCi0gICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBEYXRlPiBwcm9maWxlRGF0YSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxPYmplY3QsIERhdGU+KCk7CisgICAgcHJpdmF0ZSBNYXA8T2JqZWN0LCBEYXRlPiBwcm9maWxlRGF0YSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiBMb2dzIGEgbWVzc2FnZSB0byBzYXkgdGhhdCB0aGUgdGFyZ2V0IGhhcyBzdGFydGVkLgpAQCAtNDEsNiArNDAsNyBAQAogICAgICAqICAgICAgICAgICAgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlCiAgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICBTdHJpbmcgbmFtZSA9ICJUYXJnZXQgIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKTsKQEAgLTU1LDggKzU1LDkgQEAKICAgICAgKiAgICAgICAgICAgIEFuIGV2ZW50IHdpdGggYW55IHJlbGV2YW50IGV4dHJhIGluZm9ybWF0aW9uLiBNdXN0IG5vdCBiZQogICAgICAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBEYXRlIHN0YXJ0ID0gKERhdGUpIHByb2ZpbGVEYXRhLnJlbW92ZShldmVudC5nZXRUYXJnZXQoKSk7CisgICAgICAgIERhdGUgc3RhcnQgPSBwcm9maWxlRGF0YS5yZW1vdmUoZXZlbnQuZ2V0VGFyZ2V0KCkpOwogICAgICAgICBTdHJpbmcgbmFtZSA9ICJUYXJnZXQgIiArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKTsKICAgICAgICAgbG9nRmluaXNoKGV2ZW50LCBzdGFydCwgbmFtZSk7CiAgICAgfQpAQCAtNjgsNiArNjksNyBAQAogICAgICAqICAgICAgICAgICAgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlCiAgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCk7CiAgICAgICAgIERhdGUgbm93ID0gbmV3IERhdGUoKTsKQEAgLTgyLDI5ICs4NCwyOSBAQAogICAgICAqICAgICAgICAgICAgQW4gZXZlbnQgd2l0aCBhbnkgcmVsZXZhbnQgZXh0cmEgaW5mb3JtYXRpb24uIE11c3Qgbm90IGJlCiAgICAgICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICBEYXRlIHN0YXJ0ID0gKERhdGUpIHByb2ZpbGVEYXRhLnJlbW92ZShldmVudC5nZXRUYXNrKCkpOworICAgICAgICBEYXRlIHN0YXJ0ID0gcHJvZmlsZURhdGEucmVtb3ZlKGV2ZW50LmdldFRhc2soKSk7CiAgICAgICAgIFN0cmluZyBuYW1lID0gZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCk7CiAgICAgICAgIGxvZ0ZpbmlzaChldmVudCwgc3RhcnQsIG5hbWUpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBsb2dGaW5pc2goQnVpbGRFdmVudCBldmVudCwgRGF0ZSBzdGFydCwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOwotICAgICAgICBTdHJpbmcgbXNnID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIG1zZzsKICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgIGxvbmcgZGlmZiA9IG5vdy5nZXRUaW1lKCkgLSBzdGFydC5nZXRUaW1lKCk7Ci0gICAgICAgICAgICBtc2cgPSBTdHJpbmdVdGlscy5MSU5FX1NFUCArIG5hbWUgKyAiOiBmaW5pc2hlZCAiICsgbm93ICsgIiAoIgotICAgICAgICAgICAgICAgICAgICArIGRpZmYgKyAibXMpIjsKKyAgICAgICAgICAgIG1zZyA9IFN0cmluZy5mb3JtYXQoIiVuJXM6IGZpbmlzaGVkICVzICglZCkiLCBuYW1lLCBub3csIGRpZmYpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbXNnID0gU3RyaW5nVXRpbHMuTElORV9TRVAgKyBuYW1lICsgIjogZmluaXNoZWQgIiArIG5vdwotICAgICAgICAgICAgICAgICAgICArICIgKHVua25vd24gZHVyYXRpb24sIHN0YXJ0IG5vdCBkZXRlY3RlZCkiOworICAgICAgICAgICAgbXNnID0gU3RyaW5nLmZvcm1hdCgiJW4lczogZmluaXNoZWQgJXMgKHVua25vd24gZHVyYXRpb24sIHN0YXJ0IG5vdCBkZXRlY3RlZCkiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBub3cpOwogICAgICAgICB9CiAgICAgICAgIHByaW50TWVzc2FnZShtc2csIG91dCwgZXZlbnQuZ2V0UHJpb3JpdHkoKSk7CiAgICAgICAgIGxvZyhtc2cpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBsb2dTdGFydChCdWlsZEV2ZW50IGV2ZW50LCBEYXRlIHN0YXJ0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nVXRpbHMuTElORV9TRVAgKyBuYW1lICsgIjogc3RhcnRlZCAiICsgc3RhcnQ7CisgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlbiVzOiBzdGFydGVkICVzIiwgbmFtZSwgc3RhcnQpOwogICAgICAgICBwcmludE1lc3NhZ2UobXNnLCBvdXQsIGV2ZW50LmdldFByaW9yaXR5KCkpOwogICAgICAgICBsb2cobXNnKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9TaWxlbnRMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1NpbGVudExvZ2dlci5qYXZhCmluZGV4IDZkZGZkN2YuLjZlOWIyMjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1NpbGVudExvZ2dlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1NpbGVudExvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvU2ltcGxlQmlnUHJvamVjdExvZ2dlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvU2ltcGxlQmlnUHJvamVjdExvZ2dlci5qYXZhCmluZGV4IDE4ZjhkYzYuLmIyOWNkNjMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1NpbXBsZUJpZ1Byb2plY3RMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9TaW1wbGVCaWdQcm9qZWN0TG9nZ2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMywxNCArMzMsMTQgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHdvcmsgb24KICAgICAgKiBAcmV0dXJuIHRoZSB0YXJnZXQgbmFtZSAtaW5jbHVkaW5nIHRoZSBvd25pbmcgcHJvamVjdCBuYW1lIChpZiBub24tbnVsbCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RUYXJnZXROYW1lKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWUgPSBzdXBlci5leHRyYWN0VGFyZ2V0TmFtZShldmVudCk7CiAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9IGV4dHJhY3RQcm9qZWN0TmFtZShldmVudCk7Ci0gICAgICAgIGlmIChwcm9qZWN0TmFtZSAhPSBudWxsICYmIHRhcmdldE5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb2plY3ROYW1lICsgJy4nICsgdGFyZ2V0TmFtZTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgdGFyZ2V0TmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0TmFtZTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvamVjdE5hbWUgKyAnLicgKyB0YXJnZXROYW1lOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvVGltZXN0YW1wZWRMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL1RpbWVzdGFtcGVkTG9nZ2VyLmphdmEKaW5kZXggOTEyOTZlMy4uMDQ4OGI0NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvVGltZXN0YW1wZWRMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9UaW1lc3RhbXBlZExvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsMTMgKzMwLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0VSID0gIiAtIGF0ICI7CiAKLQogICAgIC8qKgogICAgICAqIFRoaXMgaXMgYW4gb3ZlcnJpZGUgcG9pbnQ6IHRoZSBtZXNzYWdlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgYSBidWlsZCBmYWlsZWQuCiAgICAgICogU3ViY2xhc3NlcyBjYW4gY2hhbmdlL2VuaGFuY2UgdGhlIG1lc3NhZ2UuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBjbGFzc2ljICJCVUlMRCBGQUlMRUQiIHBsdXMgYSB0aW1lc3RhbXAKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJ1aWxkRmFpbGVkTWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJ1aWxkRmFpbGVkTWVzc2FnZSgpICsgU1BBQ0VSICsgZ2V0VGltZXN0YW1wKCk7CiAgICAgfQpAQCAtNDcsNiArNDcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBUaGUgY2xhc3NpYyAiQlVJTEQgU1VDQ0VTU0ZVTCIgcGx1cyBhIHRpbWVzdGFtcAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QnVpbGRTdWNjZXNzZnVsTWVzc2FnZSgpIHsKICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEJ1aWxkU3VjY2Vzc2Z1bE1lc3NhZ2UoKSArIFNQQUNFUiArIGdldFRpbWVzdGFtcCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL2RlZmF1bHRzLnByb3BlcnRpZXMgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9saXN0ZW5lci9kZWZhdWx0cy5wcm9wZXJ0aWVzCmluZGV4IDI5OTQzODIuLjExOTk2ZDggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xpc3RlbmVyL2RlZmF1bHRzLnByb3BlcnRpZXMKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbGlzdGVuZXIvZGVmYXVsdHMucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sb2FkZXIvQW50Q2xhc3NMb2FkZXIyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sb2FkZXIvQW50Q2xhc3NMb2FkZXIyLmphdmEKaW5kZXggMWE0Y2FjNi4uMzNiYmM2MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbG9hZGVyL0FudENsYXNzTG9hZGVyMi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xvYWRlci9BbnRDbGFzc0xvYWRlcjIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDYgKzI1LDEwIEBACiAgKiAgICAgICAgICAgICBKdXN0IHVzZSB7QGxpbmsgQW50Q2xhc3NMb2FkZXJ9IGl0c2VsZi4KICAqLwogcHVibGljIGNsYXNzIEFudENsYXNzTG9hZGVyMiBleHRlbmRzIEFudENsYXNzTG9hZGVyIHsKKyAgICBzdGF0aWMgeworICAgICAgICByZWdpc3RlckFzUGFyYWxsZWxDYXBhYmxlKCk7CisgICAgfQorCiAgICAgLyoqIE5vIGFyZ3MgY29uc3RydWN0b3IuICovCiAgICAgcHVibGljIEFudENsYXNzTG9hZGVyMigpIHsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sb2FkZXIvQW50Q2xhc3NMb2FkZXI1LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sb2FkZXIvQW50Q2xhc3NMb2FkZXI1LmphdmEKaW5kZXggMTVjMjlkZi4uMGNjOGRmNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvbG9hZGVyL0FudENsYXNzTG9hZGVyNS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L2xvYWRlci9BbnRDbGFzc0xvYWRlcjUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI3LDYgKzI3LDEwIEBACiAgKiAgICAgICAgICAgICBKdXN0IHVzZSB7QGxpbmsgQW50Q2xhc3NMb2FkZXJ9IGl0c2VsZi4KICAqLwogcHVibGljIGNsYXNzIEFudENsYXNzTG9hZGVyNSBleHRlbmRzIEFudENsYXNzTG9hZGVyIHsKKyAgICBzdGF0aWMgeworICAgICAgICByZWdpc3RlckFzUGFyYWxsZWxDYXBhYmxlKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGNsYXNzbG9hZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCB1c2luZyB0aGUgY2xhc3NwYXRoIGdpdmVuLgogICAgICAqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9HZXRQcm9wZXJ0eS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvR2V0UHJvcGVydHkuamF2YQppbmRleCBjMDg4MDhhLi4xMWVmMjEzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9HZXRQcm9wZXJ0eS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0dldFByb3BlcnR5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9Mb2NhbFByb3BlcnRpZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0xvY2FsUHJvcGVydGllcy5qYXZhCmluZGV4IGM5Y2UzYWYuLjFkY2JjMjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0xvY2FsUHJvcGVydGllcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0xvY2FsUHJvcGVydGllcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsOCArMzYsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIGxvY2FscHJvcGVydGllcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBMb2NhbFByb3BlcnRpZXMgZ2V0KFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBMb2NhbFByb3BlcnRpZXMgbCA9IChMb2NhbFByb3BlcnRpZXMpIHByb2plY3QuZ2V0UmVmZXJlbmNlKAotICAgICAgICAgICAgTWFnaWNOYW1lcy5SRUZJRF9MT0NBTF9QUk9QRVJUSUVTKTsKKyAgICAgICAgTG9jYWxQcm9wZXJ0aWVzIGwgPQorICAgICAgICAgICAgcHJvamVjdC5nZXRSZWZlcmVuY2UoTWFnaWNOYW1lcy5SRUZJRF9MT0NBTF9QUk9QRVJUSUVTKTsKICAgICAgICAgaWYgKGwgPT0gbnVsbCkgewogICAgICAgICAgICAgbCA9IG5ldyBMb2NhbFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKE1hZ2ljTmFtZXMuUkVGSURfTE9DQUxfUFJPUEVSVElFUywgbCk7CkBAIC02MiwxNCArNjIsMTEgQEAKICAgICAgKiBHZXQgdGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICogQHJldHVybiBhIG5ldyBsb2NhbHByb3BlcnRpZXMgc3RhY2suCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBMb2NhbFByb3BlcnR5U3RhY2sgaW5pdGlhbFZhbHVlKCkgewogICAgICAgICByZXR1cm4gbmV3IExvY2FsUHJvcGVydHlTdGFjaygpOwogICAgIH0KIAotICAgIHByaXZhdGUgTG9jYWxQcm9wZXJ0eVN0YWNrIGN1cnJlbnQoKSB7Ci0gICAgICAgIHJldHVybiAoTG9jYWxQcm9wZXJ0eVN0YWNrKSBnZXQoKTsKLSAgICB9Ci0KICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vCiAgICAgLy8gIExvY2FsIHByb3BlcnR5IGFkZGluZyBhbmQgc2NvcGluZwpAQCAtODEsMTcgKzc4LDE3IEBACiAgICAgICogQHBhcmFtIHByb3BlcnR5IHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGFkZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRMb2NhbChTdHJpbmcgcHJvcGVydHkpIHsKLSAgICAgICAgY3VycmVudCgpLmFkZExvY2FsKHByb3BlcnR5KTsKKyAgICAgICAgZ2V0KCkuYWRkTG9jYWwocHJvcGVydHkpOwogICAgIH0KIAogICAgIC8qKiBlbnRlciB0aGUgc2NvcGUgKi8KICAgICBwdWJsaWMgdm9pZCBlbnRlclNjb3BlKCkgewotICAgICAgICBjdXJyZW50KCkuZW50ZXJTY29wZSgpOworICAgICAgICBnZXQoKS5lbnRlclNjb3BlKCk7CiAgICAgfQogCiAgICAgLyoqIGV4aXQgdGhlIHNjb3BlICovCiAgICAgcHVibGljIHZvaWQgZXhpdFNjb3BlKCkgewotICAgICAgICBjdXJyZW50KCkuZXhpdFNjb3BlKCk7CisgICAgICAgIGdldCgpLmV4aXRTY29wZSgpOwogICAgIH0KIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDUsNyArMTAyLDcgQEAKICAgICAgKiBUbyBiZSBjYWxsZWQgZnJvbSB0aGUgcGFyYWxsZWwgdGhyZWFkIGl0c2VsZi4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5KCkgewotICAgICAgICBzZXQoY3VycmVudCgpLmNvcHkoKSk7CisgICAgICAgIHNldChnZXQoKS5jb3B5KCkpOwogICAgIH0KIAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjAsOCArMTE3LDkgQEAKICAgICAgKiBAcGFyYW0gaGVscGVyIHRoZSBpbnZva2luZyBQcm9wZXJ0eUhlbHBlci4KICAgICAgKiBAcmV0dXJuIE9iamVjdCB2YWx1ZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKFN0cmluZyBwcm9wZXJ0eSwgUHJvcGVydHlIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50KCkuZXZhbHVhdGUocHJvcGVydHksIGhlbHBlcik7CisgICAgICAgIHJldHVybiBnZXQoKS5ldmFsdWF0ZShwcm9wZXJ0eSwgaGVscGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMSw5ICsxMjksMTAgQEAKICAgICAgKiBAcGFyYW0gcHJvcGVydHlIZWxwZXIgdGhlIGludm9raW5nIFByb3BlcnR5SGVscGVyLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVudGl0eSAnb3ducycgdGhlIHByb3BlcnR5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHNldE5ldygKICAgICAgICAgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUsIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyKSB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50KCkuc2V0TmV3KHByb3BlcnR5LCB2YWx1ZSwgcHJvcGVydHlIZWxwZXIpOworICAgICAgICByZXR1cm4gZ2V0KCkuc2V0TmV3KHByb3BlcnR5LCB2YWx1ZSwgcHJvcGVydHlIZWxwZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQzLDEwICsxNDIsOSBAQAogICAgICAqIEBwYXJhbSBwcm9wZXJ0eUhlbHBlciB0aGUgaW52b2tpbmcgUHJvcGVydHlIZWxwZXIuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgZW50aXR5ICdvd25zJyB0aGUgcHJvcGVydHkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gc2V0KAogICAgICAgICBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSwgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIpIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnQoKS5zZXQocHJvcGVydHksIHZhbHVlLCBwcm9wZXJ0eUhlbHBlcik7CisgICAgICAgIHJldHVybiBnZXQoKS5zZXQocHJvcGVydHksIHZhbHVlLCBwcm9wZXJ0eUhlbHBlcik7CiAgICAgfQogfQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L0xvY2FsUHJvcGVydHlTdGFjay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvTG9jYWxQcm9wZXJ0eVN0YWNrLmphdmEKaW5kZXggNDgyZjI4Yy4uM2I4MGI0MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvTG9jYWxQcm9wZXJ0eVN0YWNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvTG9jYWxQcm9wZXJ0eVN0YWNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQucHJvcGVydHk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKQEAgLTI5LDcgKzMwLDcgQEAKICAqIEBzaW5jZSBBbnQgMS44LjAKICAqLwogcHVibGljIGNsYXNzIExvY2FsUHJvcGVydHlTdGFjayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0YWNrID0gbmV3IExpbmtlZExpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIERlcXVlPE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0YWNrID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IExPQ0sgPSBuZXcgT2JqZWN0KCk7CiAKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYsNyArNTcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGVudGVyU2NvcGUoKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAoTE9DSykgewotICAgICAgICAgICAgc3RhY2suYWRkRmlyc3QobmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpKTsKKyAgICAgICAgICAgIHN0YWNrLmFkZEZpcnN0KG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9OdWxsUmV0dXJuLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9OdWxsUmV0dXJuLmphdmEKaW5kZXggMDY3YWE5Zi4uMjIzMmMxMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvTnVsbFJldHVybi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L051bGxSZXR1cm4uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9QYXJzZU5leHRQcm9wZXJ0eS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUGFyc2VOZXh0UHJvcGVydHkuamF2YQppbmRleCA1ZTVkZmMwLi45NDMwOTlmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9QYXJzZU5leHRQcm9wZXJ0eS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlTmV4dFByb3BlcnR5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9QYXJzZVByb3BlcnRpZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlUHJvcGVydGllcy5qYXZhCmluZGV4IGYwM2Y5NjYuLjQyMTkzN2UgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlUHJvcGVydGllcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1BhcnNlUHJvcGVydGllcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNiArMTksNyBAQAogCiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlUG9zaXRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogCkBAIC00OSw2ICs1MCw3IEBACiAgICAgICogR2V0IHRoZSBwcm9qZWN0LgogICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgQW50IHByb2plY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKICAgICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICAgfQpAQCAtOTAsNyArOTIsNyBAQAogICAgICAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG9yaWdpbmFsIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgT2JqZWN0IHBhcnNlUHJvcGVydGllcyhTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgIiIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBpbnQgbGVuID0gdmFsdWUubGVuZ3RoKCk7CkBAIC05OSw3ICsxMDEsNyBAQAogICAgICAgICBpZiAobyAhPSBudWxsICYmIHBvcy5nZXRJbmRleCgpID49IGxlbikgewogICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4gKiAyKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiAqIDIpOwogICAgICAgICBpZiAobyA9PSBudWxsKSB7CiAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWUuY2hhckF0KHBvcy5nZXRJbmRleCgpKSk7CiAgICAgICAgICAgICBwb3Muc2V0SW5kZXgocG9zLmdldEluZGV4KCkgKyAxKTsKQEAgLTE1Nyw2ICsxNTksNyBAQAogICAgICAqIHByb3BlcnR5IGRvZXNuJ3QgZXhwYW5kIHRvIGEgdmFsdWUsIHRoZSBwcm9wZXJ0eSdzIG5hbWUgaXMKICAgICAgKiByZXR1cm5lZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IHBhcnNlTmV4dFByb3BlcnR5KFN0cmluZyB2YWx1ZSwgUGFyc2VQb3NpdGlvbiBwb3MpIHsKICAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gcG9zLmdldEluZGV4KCk7CiAKQEAgLTE4MywxNCArMTg2LDkgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBwYXJzZVByb3BlcnR5TmFtZShTdHJpbmcgdmFsdWUsIFBhcnNlUG9zaXRpb24gcG9zKSB7Ci0gICAgICAgIGZvciAoUHJvcGVydHlFeHBhbmRlciBwcm9wZXJ0eUV4cGFuZGVyIDogZXhwYW5kZXJzKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lID0gcHJvcGVydHlFeHBhbmRlci5wYXJzZVByb3BlcnR5TmFtZSh2YWx1ZSwgcG9zLCB0aGlzKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGV4cGFuZGVycy5zdHJlYW0oKQorICAgICAgICAgICAgLm1hcCh4cCAtPiB4cC5wYXJzZVByb3BlcnR5TmFtZSh2YWx1ZSwgcG9zLCB0aGlzKSkKKyAgICAgICAgICAgIC5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuZmluZEZpcnN0KCkub3JFbHNlKG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1Byb3BlcnR5RXhwYW5kZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L1Byb3BlcnR5RXhwYW5kZXIuamF2YQppbmRleCBhMmI0ZDYzLi4xY2FkNDc0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9Qcm9wZXJ0eUV4cGFuZGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUHJvcGVydHlFeHBhbmRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvUmVzb2x2ZVByb3BlcnR5TWFwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9SZXNvbHZlUHJvcGVydHlNYXAuamF2YQppbmRleCA1YmRkMzU0Li5hNjVjYmY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9SZXNvbHZlUHJvcGVydHlNYXAuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9SZXNvbHZlUHJvcGVydHlNYXAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwLDcgKzMwLDcgQEAKICAqIEBzaW5jZSBBbnQgMS44LjAKICAqLwogcHVibGljIGNsYXNzIFJlc29sdmVQcm9wZXJ0eU1hcCBpbXBsZW1lbnRzIEdldFByb3BlcnR5IHsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHNlZW4gPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBzZWVuID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIHByaXZhdGUgZmluYWwgUGFyc2VQcm9wZXJ0aWVzIHBhcnNlUHJvcGVydGllczsKICAgICBwcml2YXRlIGZpbmFsIEdldFByb3BlcnR5IG1hc3RlcjsKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwOwpAQCAtNTgsMTAgKzU4LDExIEBACiAgICAgICogQHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkuCiAgICAgICogQHJldHVybiB0aGUgcHJvcGVydHkgdmFsdWUsIG9yIG51bGwgZm9yIG5vIG1hdGNoIG9yIGZvciBuYW1lIGJlaW5nIG51bGwuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAoc2Vlbi5jb250YWlucyhuYW1lKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm9wZXJ0eSAiICsgbmFtZSArICIgd2FzIGNpcmN1bGFybHkgIiArICJkZWZpbmVkLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9wZXJ0eSAlcyB3YXMgY2lyY3VsYXJseSBkZWZpbmVkLiIsCisgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewpAQCAtOTAsNyArOTEsNyBAQAogCiAgICAgICAgICAgICBTdHJpbmcgcmVjdXJzaXZlQ2FsbEtleSA9IG5hbWU7CiAgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgIWV4cGFuZGluZ0xIUyAmJiAhcHJlZml4VmFsdWVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBsb29rIHVwIHVucHJlZml4ZWQgcHJvcGVydGllcyBpbnNpZGUgdGhlIG1hcAorICAgICAgICAgICAgICAgIC8vIG9ubHkgbG9vayB1cCBub25wcmVmaXhlZCBwcm9wZXJ0aWVzIGluc2lkZSB0aGUgbWFwCiAgICAgICAgICAgICAgICAgLy8gaWYgcHJlZml4VmFsdWVzIGlzIHRydWUgb3Igd2UgYXJlIGV4cGFuZGluZyB0aGUga2V5CiAgICAgICAgICAgICAgICAgLy8gaXRzZWxmCiAgICAgICAgICAgICAgICAgcmVjdXJzaXZlQ2FsbEtleSA9IHByZWZpeCArIG5hbWU7CkBAIC0xMTAsNiArMTExLDcgQEAKICAgICAgKiBAcGFyYW0gbWFwIHRoZSBtYXAgdG8gcmVzb2x2ZSBwcm9wZXJ0aWVzIGluLgogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjguMiwgdXNlIHRoZSB0aHJlZS1hcmcgbWV0aG9kIGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCByZXNvbHZlQWxsUHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCkgewogICAgICAgICByZXNvbHZlQWxsUHJvcGVydGllcyhtYXAsIG51bGwsIGZhbHNlKTsKICAgICB9CkBAIC0xMjEsNiArMTIzLDcgQEAKICAgICAgKiB3aWxsIGZpbmFsbHkgcmVjZWl2ZSAtIG1heSBiZSBudWxsLgogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjguMiwgdXNlIHRoZSB0aHJlZS1hcmcgbWV0aG9kIGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCByZXNvbHZlQWxsUHJvcGVydGllcyhNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCwgU3RyaW5nIHByZWZpeCkgewogICAgICAgICByZXNvbHZlQWxsUHJvcGVydGllcyhtYXAsIG51bGwsIGZhbHNlKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9wYWNrYWdlLmh0bWwgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9wcm9wZXJ0eS9wYWNrYWdlLmh0bWwKaW5kZXggN2E0OTdlYy4uYTBkYjgwZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvcHJvcGVydHkvcGFja2FnZS5odG1sCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Byb3BlcnR5L3BhY2thZ2UuaHRtbApAQCAtMSwzICsxLDQgQEAKKzwhRE9DVFlQRSBodG1sPgogPCEtLQogICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCiAgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKQEAgLTYsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0LDYgKzE1LDExIEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDx0aXRsZT5IZWxwZXIgY2xhc3NlcyBmb3IgQW50IHByb3BlcnRpZXM8L3RpdGxlPgorPC9oZWFkPgogPGJvZHk+Ci0gIENvbnRhaW5zIGhlbHBlciBjbGFzc2VzIGZvciBhbnQgcHJvcGVydGllcy4KKyAgQ29udGFpbnMgaGVscGVyIGNsYXNzZXMgZm9yIEFudCBwcm9wZXJ0aWVzLgogPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQWJzdHJhY3RDdnNUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2suamF2YQppbmRleCA1OWY5MWM4Li4xMWI4OTI2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEzICsyMCwxNSBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0zNCw3ICszNiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBvcmlnaW5hbCBDdnMuamF2YSAxLjIwCkBAIC01NiwxMCArNTcsMTAgQEAKIAogICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CiAKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNb2R1bGU+IG1vZHVsZXMgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZT4oKTsKKyAgICBwcml2YXRlIExpc3Q8TW9kdWxlPiBtb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKiogbGlzdCBvZiBDb21tYW5kbGluZSBjaGlsZHJlbiAqLwotICAgIHByaXZhdGUgVmVjdG9yPENvbW1hbmRsaW5lPiB2ZWNDb21tYW5kbGluZXMgPSBuZXcgVmVjdG9yPENvbW1hbmRsaW5lPigpOworICAgIHByaXZhdGUgTGlzdDxDb21tYW5kbGluZT4gY29tbWFuZGxpbmVzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiB0aGUgQ1ZTUk9PVCB2YXJpYWJsZS4KQEAgLTE1NSwxMSArMTU2LDYgQEAKICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07CiAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZXJyb3JTdHJlYW07CiAKLSAgICAvKiogZW1wdHkgbm8tYXJnIGNvbnN0cnVjdG9yKi8KLSAgICBwdWJsaWMgQWJzdHJhY3RDdnNUYXNrKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIHNldHMgdGhlIGhhbmRsZXIKICAgICAgKiBAcGFyYW0gaGFuZGxlciBhIGhhbmRsZXIgYWJsZSBvZiBwcm9jZXNzaW5nIHRoZSBvdXRwdXQgYW5kIGVycm9yIHN0cmVhbXMgZnJvbSB0aGUgY3ZzIGV4ZQpAQCAtMjA3LDggKzIwMyw3IEBACiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0U3RyZWFtKG5ldyBQcmludFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMubmV3T3V0cHV0U3RyZWFtKFBhdGhzLmdldChvdXRwdXQuZ2V0UGF0aCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKSkpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKQEAgLTI0Nyw3ICsyNDIsNyBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHNldEVycm9yU3RyZWFtKG5ldyBQcmludFN0cmVhbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShlcnJvci5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLm5ld091dHB1dFN0cmVhbShQYXRocy5nZXQoZXJyb3IuZ2V0UGF0aCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQpKSkpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwpAQCAtMzU4LDEyICszNTMsOSBAQAogICAgICAgICAgICAgbG9nKCJyZXRDb2RlPSIgKyByZXRDb2RlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAKICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvciAmJiBFeGVjdXRlLmlzRmFpbHVyZShyZXRDb2RlKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY3ZzIGV4aXRlZCB3aXRoIGVycm9yIGNvZGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJldENvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJDb21tYW5kIGxpbmUgd2FzIFsiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWN0dWFsQ29tbWFuZExpbmUgKyAiXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoImN2cyBleGl0ZWQgd2l0aCBlcnJvciBjb2RlICVzJW5Db21tYW5kIGxpbmUgd2FzIFslc10iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRDb2RlLCBhY3R1YWxDb21tYW5kTGluZSksIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKQEAgLTM5MiwxMSArMzg0LDEyIEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBmYWlsb25lcnJvciBpcyBzZXQgdG8gdHJ1ZSBhbmQgdGhlCiAgICAgICogY3ZzIGNvbW1hbmQgZmFpbHMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgU3RyaW5nIHNhdmVkQ29tbWFuZCA9IGdldENvbW1hbmQoKTsKIAotICAgICAgICBpZiAodGhpcy5nZXRDb21tYW5kKCkgPT0gbnVsbCAmJiB2ZWNDb21tYW5kbGluZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKHRoaXMuZ2V0Q29tbWFuZCgpID09IG51bGwgJiYgY29tbWFuZGxpbmVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gcmUtaW1wbGVtZW50IGxlZ2FjeSBiZWhhdmlvdXI6CiAgICAgICAgICAgICB0aGlzLnNldENvbW1hbmQoQWJzdHJhY3RDdnNUYXNrLkRFRkFVTFRfQ09NTUFORCk7CiAgICAgICAgIH0KQEAgLTQxMCwxMCArNDAzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHZlY0NvbW1hbmRsaW5lcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIHRoaXMucnVuQ29tbWFuZCgoQ29tbWFuZGxpbmUpIHZlY0NvbW1hbmRsaW5lcy5lbGVtZW50QXQoaSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tbWFuZGxpbmVzLmZvckVhY2godGhpczo6cnVuQ29tbWFuZCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoY2xvbmVkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZW1vdmVDb21tYW5kbGluZShjbG9uZWQpOwpAQCAtNDI4LDI0ICs0MTgsMTUgQEAKIAogICAgICAgICBTdHJpbmcgY21kTGluZSA9IENvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZChleGVjdXRlCiAgICAgICAgICAgICAgICAgLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gcmVtb3ZlQ3ZzUGFzc3dvcmQoY21kTGluZSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gcmVtb3ZlQ3ZzUGFzc3dvcmQoY21kTGluZSk7CiAKLSAgICAgICAgU3RyaW5nIG5ld0xpbmUgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKICAgICAgICAgU3RyaW5nW10gdmFyaWFibGVBcnJheSA9IGV4ZWN1dGUuZ2V0RW52aXJvbm1lbnQoKTsKLQogICAgICAgICBpZiAodmFyaWFibGVBcnJheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG5ld0xpbmUpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoImVudmlyb25tZW50OiIpOwotICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZChuZXdMaW5lKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhcmlhYmxlIDogdmFyaWFibGVBcnJheSkgewotICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobmV3TGluZSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLmFwcGVuZCgiXHQiKTsKLSAgICAgICAgICAgICAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHZhcmlhYmxlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoQXJyYXlzLnN0cmVhbSh2YXJpYWJsZUFycmF5KS5tYXAodmFyaWFibGUgLT4gU3RyaW5nLmZvcm1hdCgiJW5cdCVzIiwgdmFyaWFibGUpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiIsIFN0cmluZy5mb3JtYXQoIiVuJW5lbnZpcm9ubWVudDolbiIpLCAiIikpKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU2LDI0ICs0MzcsMjMgQEAKICAgICAgKiBAcGFyYW0gY21kTGluZSB0aGUgQ1ZTIGNvbW1hbmQgbGluZQogICAgICAqIEByZXR1cm4gYSBTdHJpbmdCdWZmZXIgd2hlcmUgdGhlIHBhc3N3b3JkIGhhcyBiZWVuIHJlbW92ZWQgKGlmIGF2YWlsYWJsZSkKICAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciByZW1vdmVDdnNQYXNzd29yZChTdHJpbmcgY21kTGluZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihjbWRMaW5lKTsKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcmVtb3ZlQ3ZzUGFzc3dvcmQoU3RyaW5nIGNtZExpbmUpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcihjbWRMaW5lKTsKIAogICAgICAgICBpbnQgc3RhcnQgPSBjbWRMaW5lLmluZGV4T2YoIi1kOiIpOwogCiAgICAgICAgIGlmIChzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICBpbnQgc3RvcCA9IGNtZExpbmUuaW5kZXhPZigiQCIsIHN0YXJ0KTsKLSAgICAgICAgICAgIGludCBzdGFydHByb3RvID0gY21kTGluZS5pbmRleE9mKCI6Iiwgc3RhcnQpOwotICAgICAgICAgICAgaW50IHN0YXJ0dXNlciA9IGNtZExpbmUuaW5kZXhPZigiOiIsIHN0YXJ0cHJvdG8gKyAxKTsKLSAgICAgICAgICAgIGludCBzdGFydHBhc3MgPSBjbWRMaW5lLmluZGV4T2YoIjoiLCBzdGFydHVzZXIgKyAxKTsKLSAgICAgICAgICAgIHN0b3AgPSBjbWRMaW5lLmluZGV4T2YoIkAiLCBzdGFydCk7CisgICAgICAgICAgICBpbnQgc3RvcCA9IGNtZExpbmUuaW5kZXhPZignQCcsIHN0YXJ0KTsKKyAgICAgICAgICAgIGludCBzdGFydHByb3RvID0gY21kTGluZS5pbmRleE9mKCc6Jywgc3RhcnQpOworICAgICAgICAgICAgaW50IHN0YXJ0dXNlciA9IGNtZExpbmUuaW5kZXhPZignOicsIHN0YXJ0cHJvdG8gKyAxKTsKKyAgICAgICAgICAgIGludCBzdGFydHBhc3MgPSBjbWRMaW5lLmluZGV4T2YoJzonLCBzdGFydHVzZXIgKyAxKTsKICAgICAgICAgICAgIGlmIChzdG9wID49IDAgJiYgc3RhcnRwYXNzID4gc3RhcnRwcm90byAmJiBzdGFydHBhc3MgPCBzdG9wKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0cGFzcyArIDE7IGkgPCBzdG9wOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLnJlcGxhY2UoaSwgaSArIDEsICIqIik7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5yZXBsYWNlKGksIGkgKyAxLCAiKiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyOworICAgICAgICByZXR1cm4gYnVmOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDg1LDEwICs0NjUsOCBAQAogICAgIHB1YmxpYyB2b2lkIHNldEN2c1Jvb3QoU3RyaW5nIHJvb3QpIHsKIAogICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCBjdnNyb290ID0+IHNldCBpdCB0byBudWxsCi0gICAgICAgIGlmIChyb290ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyb290LnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgcm9vdCA9IG51bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChyb290ICE9IG51bGwgJiYgcm9vdC50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByb290ID0gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIHRoaXMuY3ZzUm9vdCA9IHJvb3Q7CkBAIC01MDksMTEgKzQ4Nyw4IEBACiAgICAgICogQHBhcmFtIHJzaCB0aGUgQ1ZTX1JTSCB2YXJpYWJsZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEN2c1JzaChTdHJpbmcgcnNoKSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIG5vdCByZWFsIGN2c3JzaCA9PiBzZXQgaXQgdG8gbnVsbAotICAgICAgICBpZiAocnNoICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChyc2gudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICByc2ggPSBudWxsOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAocnNoICE9IG51bGwgJiYgcnNoLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJzaCA9IG51bGw7CiAgICAgICAgIH0KIAogICAgICAgICB0aGlzLmN2c1JzaCA9IHJzaDsKQEAgLTU0Miw3ICs1MTcsNiBAQAogICAgICAqIEByZXR1cm4gdGhlIHBvcnQgb2YgQ1ZTCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRQb3J0KCkgewotCiAgICAgICAgIHJldHVybiB0aGlzLnBvcnQ7CiAgICAgfQogCkBAIC01NjAsNyArNTM0LDYgQEAKICAgICAgKiBAcmV0dXJuIHBhc3N3b3JkIGZpbGUKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZSBnZXRQYXNzRmlsZSgpIHsKLQogICAgICAgICByZXR1cm4gdGhpcy5wYXNzRmlsZTsKICAgICB9CiAKQEAgLTU4Myw3ICs1NTYsNiBAQAogICAgICAqIEByZXR1cm4gZGlyZWN0b3J5IHdoZXJlIHRoZSBjaGVja2VkIG91dCBmaWxlcyBzaG91bGQgYmUgcGxhY2VkCiAgICAgICovCiAgICAgcHVibGljIEZpbGUgZ2V0RGVzdCgpIHsKLQogICAgICAgICByZXR1cm4gdGhpcy5kZXN0OwogICAgIH0KIApAQCAtNjAyLDcgKzU3NCw2IEBACiAgICAgICogQHJldHVybiBwYWNrYWdlL21vZHVsZQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKLQogICAgICAgICByZXR1cm4gdGhpcy5jdnNQYWNrYWdlOwogICAgIH0KICAgICAvKioKQEAgLTYyMCw3ICs1OTEsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRhZyhTdHJpbmcgcCkgewogICAgICAgICAvLyBDaGVjayBpZiBub3QgcmVhbCB0YWcgPT4gc2V0IGl0IHRvIG51bGwKLSAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBwLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiAhcC50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0YWcgPSBwOwogICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KCItciIgKyBwKTsKICAgICAgICAgfQpAQCAtNjU2LDcgKzYyNyw3IEBACiAgICAgICogY2FuIHVuZGVyc3RhbmQgc2VlIG1hbiBjdnMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREYXRlKFN0cmluZyBwKSB7Ci0gICAgICAgIGlmIChwICE9IG51bGwgJiYgcC50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmIChwICE9IG51bGwgJiYgIXAudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KCItRCIpOwogICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KHApOwogICAgICAgICB9CkBAIC03MDIsNyArNjczLDYgQEAKICAgICAgICAgcmVhbGx5cXVpZXQgPSBxOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgcmVwb3J0IG9ubHkgYW5kIGRvbid0IGNoYW5nZSBhbnkgZmlsZXMuCiAgICAgICoKQEAgLTgwMSw3ICs3NzEsNyBAQAogICAgICAqIEBwYXJhbSBjIGNvbW1hbmQgbGluZSB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbW1hbmRsaW5lKENvbW1hbmRsaW5lIGMpIHsKLSAgICAgICAgdmVjQ29tbWFuZGxpbmVzLnJlbW92ZUVsZW1lbnQoYyk7CisgICAgICAgIGNvbW1hbmRsaW5lcy5yZW1vdmUoYyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MjUsOSArNzk1LDkgQEAKICAgICAgICAgfQogICAgICAgICB0aGlzLmNvbmZpZ3VyZUNvbW1hbmRsaW5lKGMpOwogICAgICAgICBpZiAoaW5zZXJ0QXRTdGFydCkgewotICAgICAgICAgICAgdmVjQ29tbWFuZGxpbmVzLmluc2VydEVsZW1lbnRBdChjLCAwKTsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lcy5hZGQoMCwgYyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2ZWNDb21tYW5kbGluZXMuYWRkRWxlbWVudChjKTsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lcy5hZGQoYyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg2MiwxMyArODMyLDEyIEBACiAgICAgfQogCiAgICAgcHJvdGVjdGVkIExpc3Q8TW9kdWxlPiBnZXRNb2R1bGVzKCkgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgZmluYWwgTGlzdDxNb2R1bGU+IGNsb25lID0gKExpc3Q8TW9kdWxlPikgbW9kdWxlcy5jbG9uZSgpOwotICAgICAgICByZXR1cm4gY2xvbmU7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4obW9kdWxlcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNb2R1bGUgewogICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHMpIHsKICAgICAgICAgICAgIG5hbWUgPSBzOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEphclNpZ25lclRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0SmFyU2lnbmVyVGFzay5qYXZhCmluZGV4IGU5ZThmMTYuLjE2ZDI3MTIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0SmFyU2lnbmVyVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0SmFyU2lnbmVyVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDAsNiArNDAsMTcgQEAKICAqLwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXJTaWduZXJUYXNrIGV4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1NPVVJDRSA9CisgICAgICAgICJqYXIgbXVzdCBiZSBzZXQgdGhyb3VnaCBqYXIgYXR0cmlidXRlIG9yIG5lc3RlZCBmaWxlc2V0cyI7CisKKyAgICAvKioKKyAgICAgKiBuYW1lIG9mIEpESyBwcm9ncmFtIHdlIGFyZSBsb29raW5nIGZvcgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUlNJR05FUl9DT01NQU5EID0gImphcnNpZ25lciI7CisKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBqYXIgZmlsZS4KQEAgLTgxLDEyICs5Miw3IEBACiAgICAgLyoqCiAgICAgICogdGhlIGZpbGVzZXRzIG9mIHRoZSBqYXJzIHRvIHNpZ24KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yPEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3RvcjxGaWxlU2V0PigpOwotICAgIC8qKgotICAgICAqIG5hbWUgb2YgSkRLIHByb2dyYW0gd2UgYXJlIGxvb2tpbmcgZm9yCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSU0lHTkVSX0NPTU1BTkQgPSAiamFyc2lnbmVyIjsKLQorICAgIHByb3RlY3RlZCBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgogCiAgICAgLyoqCkBAIC0xMDAsMTIgKzEwNiw2IEBACiAgICAgcHJpdmF0ZSBFbnZpcm9ubWVudCBzeXNQcm9wZXJ0aWVzID0gbmV3IEVudmlyb25tZW50KCk7CiAKICAgICAvKioKLSAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fU09VUkNFID0gImphciBtdXN0IGJlIHNldCB0aHJvdWdoIGphciBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgKyAib3IgbmVzdGVkIGZpbGVzZXRzIjsKLQotICAgIC8qKgogICAgICAqIFBhdGggaG9sZGluZyBhbGwgbm9uLWZpbGVzZXRzIG9mIGZpbGVzeXN0ZW0gcmVzb3VyY2VzIHdlIHdhbnQgdG8gc2lnbi4KICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS43CkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogICAgIC8qKgogICAgICAqIFZhbHVlcyBmb3IgdGhlIHByb3ZpZGVyTmFtZSwgcHJvdmlkZXJDbGFzcywgYW5kIHByb3ZpZGVyQXJnIG9wdGlvbnMuCiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXJOYW1lLCBwcm92aWRlckNsYXNzLCBwcm92aWRlckFyZzsKIAotICAgIHByaXZhdGUgTGlzdDxDb21tYW5kbGluZS5Bcmd1bWVudD4gYWRkaXRpb25hbEFyZ3MgPSBuZXcgQXJyYXlMaXN0PENvbW1hbmRsaW5lLkFyZ3VtZW50PigpOworICAgIHByaXZhdGUgTGlzdDxDb21tYW5kbGluZS5Bcmd1bWVudD4gYWRkaXRpb25hbEFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgbWF4aW11bSBtZW1vcnkgdG8gYmUgdXNlZCBieSB0aGUgamFyc2lnbmVyIHByb2Nlc3MKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHByb3ZpZGVyTmFtZSB0aGUgdmFsdWUgZm9yIHRoZSAtcHJvdmlkZXJOYW1lIGNvbW1hbmQgbGluZSBhcmd1bWVudAogICAgICAqCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByb3ZpZGVyTmFtZShTdHJpbmcgcHJvdmlkZXJOYW1lKSB7CiAgICAgICAgIHRoaXMucHJvdmlkZXJOYW1lID0gcHJvdmlkZXJOYW1lOwpAQCAtMjU4LDcgKzI1OCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvdmlkZXJDbGFzcyB0aGUgdmFsdWUgZm9yIHRoZSAtcHJvdmlkZXJDbGFzcyBjb21tYW5kIGxpbmUgYXJndW1lbnQKICAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlckNsYXNzKFN0cmluZyBwcm92aWRlckNsYXNzKSB7CiAgICAgICAgIHRoaXMucHJvdmlkZXJDbGFzcyA9IHByb3ZpZGVyQ2xhc3M7CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwcm92aWRlckFyZyB0aGUgdmFsdWUgZm9yIHRoZSAtcHJvdmlkZXJBcmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50CiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UHJvdmlkZXJBcmcoU3RyaW5nIHByb3ZpZGVyQXJnKSB7CiAgICAgICAgIHRoaXMucHJvdmlkZXJBcmcgPSBwcm92aWRlckFyZzsKQEAgLTI4MSw3ICsyODEsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGFyZyB0aGUgYXJndW1lbnQgdG8gYWRkCiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQXJnKENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZykgewogICAgICAgICBhZGRpdGlvbmFsQXJncy5hZGQoYXJnKTsKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgIHByaXZhdGUgUmVkaXJlY3RvckVsZW1lbnQgY3JlYXRlUmVkaXJlY3RvcigpIHsKICAgICAgICAgUmVkaXJlY3RvckVsZW1lbnQgcmVzdWx0ID0gbmV3IFJlZGlyZWN0b3JFbGVtZW50KCk7CiAgICAgICAgIGlmIChzdG9yZXBhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGlucHV0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdG9yZXBhc3MpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgaW5wdXQgPSBuZXcgU3RyaW5nQnVpbGRlcihzdG9yZXBhc3MpLmFwcGVuZCgnXG4nKTsKICAgICAgICAgICAgIGlmIChrZXlwYXNzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnB1dC5hcHBlbmQoa2V5cGFzcykuYXBwZW5kKCdcbicpOwogICAgICAgICAgICAgfQpAQCAtMzg1LDcgKzM4NSw2IEBACiAgICAgICAgIGFkZFZhbHVlKGNtZCwgIi1KLUQiICsgcHJvcGVydHkuZ2V0Q29udGVudCgpKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGJpbmQgdG8gYSBrZXlzdG9yZSBpZiB0aGUgYXR0cmlidXRlcyBhcmUgdGhlcmUKICAgICAgKiBAcGFyYW0gY21kIGNvbW1hbmQgdG8gY29uZmlndXJlCkBAIC00NDgsOCArNDQ3LDcgQEAKICAgICAgKiBAcmV0dXJuIGEgdmVjdG9yIG9mIEZpbGVTZXQgaW5zdGFuY2VzCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFZlY3RvcjxGaWxlU2V0PiBjcmVhdGVVbmlmaWVkU291cmNlcygpIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIFZlY3RvcjxGaWxlU2V0PiBzb3VyY2VzID0gKFZlY3RvcjxGaWxlU2V0PikgZmlsZXNldHMuY2xvbmUoKTsKKyAgICAgICAgVmVjdG9yPEZpbGVTZXQ+IHNvdXJjZXMgPSBuZXcgVmVjdG9yPD4oZmlsZXNldHMpOwogICAgICAgICBpZiAoamFyICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vd2UgY3JlYXRlIGEgZmlsZXNldCB3aXRoIHRoZSBzb3VyY2UgZmlsZS4KICAgICAgICAgICAgIC8vdGhpcyBsZXRzIHVzIGNvbWJpbmUgb3VyIGxvZ2ljIGZvciBoYW5kbGluZyBvdXRwdXQgZGlyZWN0b3JpZXMsCkBAIC00ODMsNyArNDgxLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIGhhc1Jlc291cmNlcygpIHsKLSAgICAgICAgcmV0dXJuIHBhdGggIT0gbnVsbCB8fCBmaWxlc2V0cy5zaXplKCkgPiAwOworICAgICAgICByZXR1cm4gIShwYXRoID09IG51bGwgJiYgZmlsZXNldHMuaXNFbXB0eSgpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50LmphdmEKaW5kZXggNzhkMDY4OS4uMjQ3MmVhNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxOSArMTksMTkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWluOwpAQCAtODgsMTAgKzg4LDEwIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGluaGVyaXRSZWZzID0gZmFsc2U7CiAKICAgICAvKiogdGhlIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxQcm9wZXJ0eT4gcHJvcGVydGllcyA9IG5ldyBWZWN0b3I8UHJvcGVydHk+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogdGhlIHJlZmVyZW5jZXMgdG8gcGFzcyB0byB0aGUgbmV3IHByb2plY3QgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxSZWZlcmVuY2U+IHJlZmVyZW5jZXMgPSBuZXcgVmVjdG9yPFJlZmVyZW5jZT4oKTsKKyAgICBwcml2YXRlIExpc3Q8UmVmZXJlbmNlPiByZWZlcmVuY2VzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogdGhlIHRlbXBvcmFyeSBwcm9qZWN0IGNyZWF0ZWQgdG8gcnVuIHRoZSBidWlsZCBmaWxlICovCiAgICAgcHJpdmF0ZSBQcm9qZWN0IG5ld1Byb2plY3Q7CkBAIC0xMDAsMTAgKzEwMCwxMCBAQAogICAgIHByaXZhdGUgUHJpbnRTdHJlYW0gb3V0ID0gbnVsbDsKIAogICAgIC8qKiB0aGUgc2V0cyBvZiBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIG5ldyBwcm9qZWN0ICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8UHJvcGVydHlTZXQ+IHByb3BlcnR5U2V0cyA9IG5ldyBWZWN0b3I8UHJvcGVydHlTZXQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5U2V0PiBwcm9wZXJ0eVNldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiB0aGUgdGFyZ2V0cyB0byBjYWxsIG9uIHRoZSBuZXcgcHJvamVjdCAqLwotICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gdGFyZ2V0cyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHRhcmdldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiB3aGV0aGVyIHRoZSB0YXJnZXQgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQgKiovCiAgICAgcHJpdmF0ZSBib29sZWFuIHRhcmdldEF0dHJpYnV0ZVNldCA9IGZhbHNlOwpAQCAtMTY1LDYgKzE2NSw3IEBACiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIFByb2plY3QgaW5zdGFuY2UgZm9yIHRoZSBwcm9qZWN0IHRvIGNhbGwuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKICAgICAgICAgbmV3UHJvamVjdCA9IGdldFByb2plY3QoKS5jcmVhdGVTdWJQcm9qZWN0KCk7CiAgICAgICAgIG5ld1Byb2plY3Quc2V0SmF2YVZlcnNpb25Qcm9wZXJ0eSgpOwpAQCAtMTk0LDIwICsxOTUsMTcgQEAKICAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVByb2plY3QoKSB7CiAgICAgICAgIG5ld1Byb2plY3Quc2V0SW5wdXRIYW5kbGVyKGdldFByb2plY3QoKS5nZXRJbnB1dEhhbmRsZXIoKSk7CiAKLSAgICAgICAgSXRlcmF0b3I8QnVpbGRMaXN0ZW5lcj4gaXRlciA9IGdldEJ1aWxkTGlzdGVuZXJzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbmV3UHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKChCdWlsZExpc3RlbmVyKSBpdGVyLm5leHQoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZ2V0UHJvamVjdCgpLmdldEJ1aWxkTGlzdGVuZXJzKCkuZm9yRWFjaChibCAtPiBuZXdQcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIoYmwpKTsKIAogICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgb3V0ZmlsZSA9IG51bGw7CisgICAgICAgICAgICBGaWxlIG91dGZpbGU7CiAgICAgICAgICAgICBpZiAoZGlyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBvdXRmaWxlID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShkaXIsIG91dHB1dCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG91dGZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUob3V0cHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dGZpbGUpKTsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRTdHJlYW0oRmlsZXMubmV3T3V0cHV0U3RyZWFtKG91dGZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICBEZWZhdWx0TG9nZ2VyIGxvZ2dlciA9IG5ldyBEZWZhdWx0TG9nZ2VyKCk7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLnNldE1lc3NhZ2VPdXRwdXRMZXZlbChQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgICAgICBsb2dnZXIuc2V0T3V0cHV0UHJpbnRTdHJlYW0ob3V0KTsKQEAgLTI0Nyw2ICsyNDUsNyBAQAogICAgICAqIEBzZWUgVGFzayNoYW5kbGVPdXRwdXQoU3RyaW5nKQogICAgICAqIEBzaW5jZSBBbnQgMS41CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBvdXRwdXRUb0hhbmRsZSkgewogICAgICAgICBpZiAobmV3UHJvamVjdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBuZXdQcm9qZWN0LmRlbXV4T3V0cHV0KG91dHB1dFRvSGFuZGxlLCBmYWxzZSk7CkBAIC0yNjksNiArMjY4LDcgQEAKICAgICAgKiBAc2VlIFRhc2sjaGFuZGxlSW5wdXQoYnl0ZVtdLCBpbnQsIGludCkKICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFuZGxlSW5wdXQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG5ld1Byb2plY3QgIT0gbnVsbCkgewpAQCAtMjg1LDYgKzI4NSw3IEBACiAgICAgICogQHNlZSBUYXNrI2hhbmRsZUZsdXNoKFN0cmluZykKICAgICAgKiBAc2luY2UgQW50IDEuNS4yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaGFuZGxlRmx1c2goU3RyaW5nIHRvRmx1c2gpIHsKICAgICAgICAgaWYgKG5ld1Byb2plY3QgIT0gbnVsbCkgewogICAgICAgICAgICAgbmV3UHJvamVjdC5kZW11eEZsdXNoKHRvRmx1c2gsIGZhbHNlKTsKQEAgLTMwMiw2ICszMDMsNyBAQAogICAgICAqIEBzZWUgVGFzayNoYW5kbGVFcnJvck91dHB1dChTdHJpbmcpCiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgZXJyb3JPdXRwdXRUb0hhbmRsZSkgewogICAgICAgICBpZiAobmV3UHJvamVjdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBuZXdQcm9qZWN0LmRlbXV4T3V0cHV0KGVycm9yT3V0cHV0VG9IYW5kbGUsIHRydWUpOwpAQCAtMzE4LDYgKzMyMCw3IEBACiAgICAgICogQHNlZSBUYXNrI2hhbmRsZUVycm9yRmx1c2goU3RyaW5nKQogICAgICAqIEBzaW5jZSBBbnQgMS41LjIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFcnJvckZsdXNoKFN0cmluZyBlcnJvck91dHB1dFRvRmx1c2gpIHsKICAgICAgICAgaWYgKG5ld1Byb2plY3QgIT0gbnVsbCkgewogICAgICAgICAgICAgbmV3UHJvamVjdC5kZW11eEZsdXNoKGVycm9yT3V0cHV0VG9GbHVzaCwgdHJ1ZSk7CkBAIC0zMzEsMTAgKzMzNCwxMSBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYSB0YXJnZXQgdHJpZXMgdG8gY2FsbCBpdHNlbGY7CiAgICAgICogcHJvYmFibHkgYWxzbyBpZiBhIEJ1aWxkRXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgbmV3IHByb2plY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgc2F2ZWREaXIgPSBkaXI7CiAgICAgICAgIFN0cmluZyBzYXZlZEFudEZpbGUgPSBhbnRGaWxlOwotICAgICAgICBWZWN0b3I8U3RyaW5nPiBsb2NhbHMgPSBuZXcgVmVjdG9yU2V0PFN0cmluZz4odGFyZ2V0cyk7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IGxvY2FscyA9IG5ldyBWZWN0b3JTZXQ8Pih0YXJnZXRzKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdldE5ld1Byb2plY3QoKTsKIApAQCAtMzY3LDI2ICszNzEsMjIgQEAKICAgICAgICAgICAgIGFudEZpbGUgPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwogCiAgICAgICAgICAgICBsb2coImNhbGxpbmcgdGFyZ2V0KHMpICIKLSAgICAgICAgICAgICAgICArICgobG9jYWxzLnNpemUoKSA+IDApID8gbG9jYWxzLnRvU3RyaW5nKCkgOiAiW2RlZmF1bHRdIikKKyAgICAgICAgICAgICAgICArIChsb2NhbHMuaXNFbXB0eSgpID8gIltkZWZhdWx0XSIgOiBsb2NhbHMudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICArICIgaW4gYnVpbGQgZmlsZSAiICsgYW50RmlsZSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICBuZXdQcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9GSUxFLCBhbnRGaWxlKTsKIAogICAgICAgICAgICAgU3RyaW5nIHRoaXNBbnRGaWxlID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUpOwogICAgICAgICAgICAgLy8gQXJlIHdlIHRyeWluZyB0byBjYWxsIHRoZSB0YXJnZXQgaW4gd2hpY2ggd2UgYXJlIGRlZmluZWQgKG9yCiAgICAgICAgICAgICAvLyB0aGUgYnVpbGQgZmlsZSBpZiB0aGlzIGlzIGEgdG9wIGxldmVsIHRhc2spPwotICAgICAgICAgICAgaWYgKHRoaXNBbnRGaWxlICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBmaWxlLmVxdWFscyhnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUodGhpc0FudEZpbGUpKQotICAgICAgICAgICAgICAgICYmIGdldE93bmluZ1RhcmdldCgpICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIGlmIChnZXRPd25pbmdUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VGFza05hbWUoKS5lcXVhbHMoImFudGNhbGwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhbnRjYWxsIG11c3Qgbm90IGJlIHVzZWQgYXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRoZSB0b3AgbGV2ZWwuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tOYW1lKCkgKyAiIHRhc2sgYXQgdGhlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdG9wIGxldmVsIG11c3Qgbm90IGludm9rZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGl0cyBvd24gYnVpbGQgZmlsZS4iKTsKKyAgICAgICAgICAgIGlmICh0aGlzQW50RmlsZSAhPSBudWxsICYmIGZpbGUuZXF1YWxzKGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0aGlzQW50RmlsZSkpCisgICAgICAgICAgICAgICAgICAgICYmIGdldE93bmluZ1RhcmdldCgpICE9IG51bGwgJiYgZ2V0T3duaW5nVGFyZ2V0KCkuZ2V0TmFtZSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmICgiYW50Y2FsbCIuZXF1YWxzKGdldFRhc2tOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW50Y2FsbCBtdXN0IG5vdCBiZSB1c2VkIGF0IHRoZSB0b3AgbGV2ZWwuIik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0YXNrIGF0IHRoZSB0b3AgbGV2ZWwgbXVzdCBub3QgaW52b2tlIGl0cyBvd24gYnVpbGQgZmlsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFza05hbWUoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRyeSB7CkBAIC0zOTYsNyArMzk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXgsIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobG9jYWxzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobG9jYWxzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VGFyZ2V0ID0gbmV3UHJvamVjdC5nZXREZWZhdWx0VGFyZ2V0KCk7CiAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRUYXJnZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBsb2NhbHMuYWRkKGRlZmF1bHRUYXJnZXQpOwpAQCAtNDEwLDMxICs0MTAsMjYgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgb3duaW5nVGFyZ2V0TmFtZSA9IGdldE93bmluZ1RhcmdldCgpLmdldE5hbWUoKTsKIAogICAgICAgICAgICAgICAgIGlmIChsb2NhbHMuY29udGFpbnMob3duaW5nVGFyZ2V0TmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tOYW1lKCkgKyAiIHRhc2sgY2FsbGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpdHMgb3duIHBhcmVudCB0YXJnZXQuIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyB0YXNrIGNhbGxpbmcgaXRzIG93biBwYXJlbnQgdGFyZ2V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYXNrTmFtZSgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBjaXJjdWxhciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGxvY2Fscy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgIWNpcmN1bGFyICYmIGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgVGFyZ2V0IG90aGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRUYXJnZXRzKCkuZ2V0KGl0Lm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNpcmN1bGFyIHw9IChvdGhlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBvdGhlci5kZXBlbmRzT24ob3duaW5nVGFyZ2V0TmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2lyY3VsYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0YXNrIGNhbGxpbmcgYSB0YXJnZXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhhdCBkZXBlbmRzIG9uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGl0cyBwYXJlbnQgdGFyZ2V0IFwnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvd25pbmdUYXJnZXROYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcJy4iKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFRhcmdldD4gdGFyZ2V0c01hcCA9IGdldFByb2plY3QoKS5nZXRUYXJnZXRzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAobG9jYWxzLnN0cmVhbSgpLm1hcCh0YXJnZXRzTWFwOjpnZXQpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKG90aGVyIC0+IG90aGVyLmRlcGVuZHNPbihvd25pbmdUYXJnZXROYW1lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHRhc2sgY2FsbGluZyBhIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gaXRzIHBhcmVudCB0YXJnZXQgJyVzJy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFza05hbWUoKSwgb3duaW5nVGFyZ2V0TmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhZGRSZWZlcmVuY2VzKCk7CiAKLSAgICAgICAgICAgIGlmIChsb2NhbHMuc2l6ZSgpID4gMCAmJiAhKGxvY2Fscy5zaXplKCkgPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIiIuZXF1YWxzKGxvY2Fscy5nZXQoMCkpKSkgeworICAgICAgICAgICAgaWYgKCFsb2NhbHMuaXNFbXB0eSgpICYmICEobG9jYWxzLnNpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxvY2Fscy5nZXQoMCkgIT0gbnVsbCAmJiBsb2NhbHMuZ2V0KDApLmlzRW1wdHkoKSkpIHsKICAgICAgICAgICAgICAgICBCdWlsZEV4Y2VwdGlvbiBiZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgbG9nKCJFbnRlcmluZyAiICsgYW50RmlsZSArICIuLi4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTQ2Nyw4ICs0NjIsOCBAQAogICAgIC8qKgogICAgICAqIEdldCB0aGUgZGVmYXVsdCBidWlsZCBmaWxlIG5hbWUgdG8gdXNlIHdoZW4gbGF1bmNoaW5nIHRoZSB0YXNrLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRlbiBieSBwcm92aWRlcnMgb2YgY3VzdG9tIFByb2plY3RIZWxwZXIgc28gdGhleSBjYW4gaW1wbGVtZW50IGVhc2lseSB0aGVpciBzdWIKLSAgICAgKiBsYXVuY2hlci4KKyAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBvdmVycmlkZGVuIGJ5IHByb3ZpZGVycyBvZiBjdXN0b20gUHJvamVjdEhlbHBlciBzbyB0aGV5IGNhbiBlYXNpbHkKKyAgICAgKiBpbXBsZW1lbnQgdGhlaXIgc3VibGF1bmNoZXIuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZpbGUKICAgICAgKiBAc2luY2UgQW50IDEuOC4wCkBAIC00ODUsMTAgKzQ4MCwxMCBAQAogICAgIHByaXZhdGUgdm9pZCBvdmVycmlkZVByb3BlcnRpZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyByZW1vdmUgZHVwbGljYXRlIHByb3BlcnRpZXMgLSBsYXN0IHByb3BlcnR5IHdpbnMKICAgICAgICAgLy8gTmVlZGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKGludCBpID0gcHJvcGVydGllcy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgUHJvcGVydHkgcCA9IHByb3BlcnRpZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKHAuZ2V0TmFtZSgpICE9IG51bGwgJiYgIXAuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGlmIChwLmdldE5hbWUoKSAhPSBudWxsICYmICFwLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2V0LmNvbnRhaW5zKHAuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNDk2LDEyICs0OTEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBFbnVtZXJhdGlvbjxQcm9wZXJ0eT4gZSA9IHByb3BlcnRpZXMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5IHAgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwLnNldFByb2plY3QobmV3UHJvamVjdCk7Ci0gICAgICAgICAgICBwLmV4ZWN1dGUoKTsKLSAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzLnN0cmVhbSgpLnBlZWsocCAtPiBwLnNldFByb2plY3QobmV3UHJvamVjdCkpCisgICAgICAgICAgICAuZm9yRWFjaChQcm9wZXJ0eTo6ZXhlY3V0ZSk7CisKICAgICAgICAgaWYgKHVzZU5hdGl2ZUJhc2VkaXIpIHsKICAgICAgICAgICAgIGFkZEFsbW9zdEFsbChnZXRQcm9qZWN0KCkuZ2V0SW5oZXJpdGVkUHJvcGVydGllcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VHlwZS5JTkhFUklURUQpOwpAQCAtNTE4LDE0ICs1MTAsMTMgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcmVmZXJlbmNlIGRvZXMgbm90IGhhdmUgYSByZWZpZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYWRkUmVmZXJlbmNlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHRoaXNSZWZlcmVuY2VzCi0gICAgICAgICAgICA9IChIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlcygpLmNsb25lKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdGhpc1JlZmVyZW5jZXMgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8PihnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlcygpKTsKICAgICAgICAgZm9yIChSZWZlcmVuY2UgcmVmIDogcmVmZXJlbmNlcykgewogICAgICAgICAgICAgU3RyaW5nIHJlZmlkID0gcmVmLmdldFJlZklkKCk7CiAgICAgICAgICAgICBpZiAocmVmaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIHJlZmlkIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZvciByZWZlcmVuY2UgZWxlbWVudHMiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ0aGUgcmVmaWQgYXR0cmlidXRlIGlzIHJlcXVpcmVkIGZvciByZWZlcmVuY2UgZWxlbWVudHMiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghdGhpc1JlZmVyZW5jZXMuY29udGFpbnNLZXkocmVmaWQpKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJQYXJlbnQgcHJvamVjdCBkb2Vzbid0IGNvbnRhaW4gYW55IHJlZmVyZW5jZSAnIgpAQCAtNTQ1LDcgKzUzNiw3IEBACiAgICAgICAgIC8vIE5vdyBhZGQgYWxsIHJlZmVyZW5jZXMgdGhhdCBhcmUgbm90IGRlZmluZWQgaW4gdGhlCiAgICAgICAgIC8vIHN1YnByb2plY3QsIGlmIGluaGVyaXRSZWZzIGlzIHRydWUKICAgICAgICAgaWYgKGluaGVyaXRSZWZzKSB7Ci0gICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IG5ld1JlZmVyZW5jZXMgPSBuZXdQcm9qZWN0LmdldFJlZmVyZW5jZXMoKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbmV3UmVmZXJlbmNlcyA9IG5ld1Byb2plY3QuZ2V0UmVmZXJlbmNlcygpOwogICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogdGhpc1JlZmVyZW5jZXMua2V5U2V0KCkpIHsKICAgICAgICAgICAgICAgICBpZiAobmV3UmVmZXJlbmNlcy5jb250YWluc0tleShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTc3LDMyICs1NjgsMzIgQEAKICAgICAgICAgQ2xhc3M8Pz4gYyA9IG9yaWcuZ2V0Q2xhc3MoKTsKICAgICAgICAgT2JqZWN0IGNvcHkgPSBvcmlnOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIGNsb25lTSA9IGMuZ2V0TWV0aG9kKCJjbG9uZSIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICBNZXRob2QgY2xvbmVNID0gYy5nZXRNZXRob2QoImNsb25lIik7CiAgICAgICAgICAgICBpZiAoY2xvbmVNICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb3B5ID0gY2xvbmVNLmludm9rZShvcmlnLCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICBjb3B5ID0gY2xvbmVNLmludm9rZShvcmlnKTsKICAgICAgICAgICAgICAgICBsb2coIkFkZGluZyBjbG9uZSBvZiByZWZlcmVuY2UgIiArIG9sZEtleSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gbm90IENsb25hYmxlCiAgICAgICAgIH0KIAotCiAgICAgICAgIGlmIChjb3B5IGluc3RhbmNlb2YgUHJvamVjdENvbXBvbmVudCkgewogICAgICAgICAgICAgKChQcm9qZWN0Q29tcG9uZW50KSBjb3B5KS5zZXRQcm9qZWN0KG5ld1Byb2plY3QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBNZXRob2Qgc2V0UHJvamVjdE0gPQotICAgICAgICAgICAgICAgICAgICBjLmdldE1ldGhvZCgic2V0UHJvamVjdCIsIG5ldyBDbGFzc1tdIHtQcm9qZWN0LmNsYXNzfSk7CisgICAgICAgICAgICAgICAgICAgIGMuZ2V0TWV0aG9kKCJzZXRQcm9qZWN0IiwgUHJvamVjdC5jbGFzcyk7CiAgICAgICAgICAgICAgICAgaWYgKHNldFByb2plY3RNICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0UHJvamVjdE0uaW52b2tlKGNvcHksIG5ldyBPYmplY3RbXSB7bmV3UHJvamVjdH0pOworICAgICAgICAgICAgICAgICAgICBzZXRQcm9qZWN0TS5pbnZva2UoY29weSwgbmV3UHJvamVjdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhpcyBpZiB0aGUgY2xhc3MgYmVpbmcgcmVmZXJlbmNlZCBkb2VzIG5vdCBoYXZlCiAgICAgICAgICAgICAgICAgLy8gYSBzZXQgcHJvamVjdCBtZXRob2QuCiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkVycm9yIHNldHRpbmcgbmV3IHByb2plY3QgaW5zdGFuY2UgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgKyAicmVmZXJlbmNlIHdpdGggaWQgIiArIG9sZEtleTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlMiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXJyb3Igc2V0dGluZyBuZXcgcHJvamVjdCBpbnN0YW5jZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmZXJlbmNlIHdpdGggaWQgIiArIG9sZEtleSwKKyAgICAgICAgICAgICAgICAgICAgZTIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG5ld1Byb2plY3QuYWRkUmVmZXJlbmNlKG5ld0tleSwgY29weSk7CkBAIC02MTgsMjkgKzYwOSwzMSBAQAogICAgICAqIHVzZXIgcHJvcGVydHkgb3IgYW4gaW5oZXJpdGVkIHByb3BlcnR5KS4KICAgICAgKiBAc2luY2UgQW50IDEuOC4wCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEFsbW9zdEFsbChIYXNodGFibGU8PywgPz4gcHJvcHMsIFByb3BlcnR5VHlwZSB0eXBlKSB7Ci0gICAgICAgIEVudW1lcmF0aW9uPD8+IGUgPSBwcm9wcy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsbW9zdEFsbChNYXA8PywgPz4gcHJvcHMsIFByb3BlcnR5VHlwZSB0eXBlKSB7CisgICAgICAgIHByb3BzLmZvckVhY2goKGssIHYpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBpZiAoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIuZXF1YWxzKGtleSkKLSAgICAgICAgICAgICAgICB8fCBNYWdpY05hbWVzLkFOVF9GSUxFLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IE1hZ2ljTmFtZXMuQU5UX0ZJTEUuZXF1YWxzKGtleSkpIHsKICAgICAgICAgICAgICAgICAvLyBiYXNlZGlyIGFuZCBhbnQuZmlsZSBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gZXhlY3V0ZSgpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXQoa2V5KS50b1N0cmluZygpOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gUHJvcGVydHlUeXBlLlBMQUlOKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB2LnRvU3RyaW5nKCk7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUExBSU46CiAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgcmUtc2V0IHVzZXIgcHJvcGVydGllcywgYXZvaWQgdGhlIHdhcm5pbmcgbWVzc2FnZQogICAgICAgICAgICAgICAgIGlmIChuZXdQcm9qZWN0LmdldFByb3BlcnR5KGtleSkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAvLyBubyB1c2VyIHByb3BlcnR5CiAgICAgICAgICAgICAgICAgICAgIG5ld1Byb2plY3Quc2V0TmV3UHJvcGVydHkoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFByb3BlcnR5VHlwZS5VU0VSKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFVTRVI6CiAgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5zZXRVc2VyUHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUHJvcGVydHlUeXBlLklOSEVSSVRFRCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBJTkhFUklURUQ6CiAgICAgICAgICAgICAgICAgbmV3UHJvamVjdC5zZXRJbmhlcml0ZWRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKQEAgLTY3Miw3ICs2NjUsNyBAQAogICAgICAqIEBwYXJhbSB0YXJnZXRUb0FkZCB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHRvIGludm9rZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldFRvQWRkKSB7Ci0gICAgICAgIGlmICh0YXJnZXRUb0FkZC5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmICh0YXJnZXRUb0FkZC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGFyZ2V0IGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBlbXB0eSIpOwogICAgICAgICB9CiAgICAgICAgIHRhcmdldHMuYWRkKHRhcmdldFRvQWRkKTsKQEAgLTY5OCw3ICs2OTEsNyBAQAogICAgICAgICBQcm9wZXJ0eSBwID0gbmV3IFByb3BlcnR5KHRydWUsIGdldFByb2plY3QoKSk7CiAgICAgICAgIHAuc2V0UHJvamVjdChnZXROZXdQcm9qZWN0KCkpOwogICAgICAgICBwLnNldFRhc2tOYW1lKCJwcm9wZXJ0eSIpOwotICAgICAgICBwcm9wZXJ0aWVzLmFkZEVsZW1lbnQocCk7CisgICAgICAgIHByb3BlcnRpZXMuYWRkKHApOwogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKQEAgLTcwOCw3ICs3MDEsNyBAQAogICAgICAqIEBwYXJhbSByZWYgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPiB0byBhZGQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUmVmZXJlbmNlKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgcmVmZXJlbmNlcy5hZGRFbGVtZW50KHJlZik7CisgICAgICAgIHJlZmVyZW5jZXMuYWRkKHJlZik7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MjIsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICAibmVzdGVkIHRhcmdldCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0IGF0dHJpYnV0ZSIpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBuYW1lID0gdC5nZXROYW1lKCk7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKG5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmdldCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgICAgICAgIH0KICAgICAgICAgdGFyZ2V0cy5hZGQobmFtZSk7CkBAIC03MzUsNyArNzI4LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5c2V0KFByb3BlcnR5U2V0IHBzKSB7Ci0gICAgICAgIHByb3BlcnR5U2V0cy5hZGRFbGVtZW50KHBzKTsKKyAgICAgICAgcHJvcGVydHlTZXRzLmFkZChwcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NTEsMjQgKzc0NCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzaW5jZSBBbnQgMS42LjIKLSAgICAgKi8KLSAgICBwcml2YXRlIEl0ZXJhdG9yPEJ1aWxkTGlzdGVuZXI+IGdldEJ1aWxkTGlzdGVuZXJzKCkgewotICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldEJ1aWxkTGlzdGVuZXJzKCkuaXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBIZWxwZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBuZXN0ZWQgJmx0O3JlZmVyZW5jZSZndDsKICAgICAgKiBlbGVtZW50IG9mICZsdDthbnQmZ3Q7IGFuZCAmbHQ7YW50Y2FsbCZndDsuCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZmVyZW5jZQogICAgICAgICBleHRlbmRzIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZSB7CiAKLSAgICAgICAgLyoqIENyZWF0ZXMgYSByZWZlcmVuY2UgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuICovCi0gICAgICAgIHB1YmxpYyBSZWZlcmVuY2UoKSB7Ci0gICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0aWQgPSBudWxsOwogCiAgICAgICAgIC8qKgpAQCAtODI0LDEwICs4MDYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcGVydHlUeXBlIHsKLSAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0eVR5cGUoKSB7fQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0eVR5cGUgUExBSU4gPSBuZXcgUHJvcGVydHlUeXBlKCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5VHlwZSBJTkhFUklURUQgPSBuZXcgUHJvcGVydHlUeXBlKCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5VHlwZSBVU0VSID0gbmV3IFByb3BlcnR5VHlwZSgpOworICAgIHByaXZhdGUgZW51bSBQcm9wZXJ0eVR5cGUgeworICAgICAgICBQTEFJTiwgSU5IRVJJVEVELCBVU0VSCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50U3RydWN0dXJlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmUuamF2YQppbmRleCAzMzFjMWE5Li40ZDg5MDliIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE1ICsxOSwxOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkludHJvc3BlY3Rpb25IZWxwZXI7CkBAIC0zNiw3ICs0MCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCiAgKiBDcmVhdGVzIGEgcGFydGlhbCBEVEQgZm9yIEFudCBmcm9tIHRoZSBjdXJyZW50bHkga25vd24gdGFza3MuCkBAIC00OCw5ICs1MSw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBbnRTdHJ1Y3R1cmUgZXh0ZW5kcyBUYXNrIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUAotICAgICAgICA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQogICAgIHByaXZhdGUgRmlsZSBvdXRwdXQ7CiAgICAgcHJpdmF0ZSBTdHJ1Y3R1cmVQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcigpOwogCkBAIC04Myw1NCArODMsMzMgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib3V0cHV0IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgUHJpbnRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEY4IikpOwotICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmb3MpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogUGxhaW4gaW1wb3NzaWJsZSB3aXRoIFVURjgsIHNlZQotICAgICAgICAgICAgICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwKLSAgICAgICAgICAgICAgICAgKgotICAgICAgICAgICAgICAgICAqIGZhbGxiYWNrIHRvIHBsYXRmb3JtIHNwZWNpZmljIGFueXdheS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0cHV0KSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHRyeSAoUHJpbnRXcml0ZXIgb3V0ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgRmlsZXMubmV3T3V0cHV0U3RyZWFtKG91dHB1dC50b1BhdGgoKSksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSkgewogCiAgICAgICAgICAgICBwcmludGVyLnByaW50SGVhZChvdXQsIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4oZ2V0UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNodGFibGU8U3RyaW5nLCBDbGFzczw/Pj4oZ2V0UHJvamVjdCgpLmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKSkpOworICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaHRhYmxlPD4oZ2V0UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2h0YWJsZTw+KGdldFByb2plY3QoKS5nZXREYXRhVHlwZURlZmluaXRpb25zKCkpKTsKIAogICAgICAgICAgICAgcHJpbnRlci5wcmludFRhcmdldERlY2wob3V0KTsKIAotICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZU5hbWUgOiBnZXRQcm9qZWN0KCkuZ2V0Q29weU9mRGF0YVR5cGVEZWZpbml0aW9ucygpCi0gICAgICAgICAgICAgICAgLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRlci5wcmludEVsZW1lbnREZWNsKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgZ2V0UHJvamVjdCgpLCB0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0RGF0YVR5cGVEZWZpbml0aW9ucygpLmdldCh0eXBlTmFtZSkpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdHlwZU5hbWUgOiBnZXRQcm9qZWN0KCkuZ2V0Q29weU9mRGF0YVR5cGVEZWZpbml0aW9ucygpLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludEVsZW1lbnREZWNsKG91dCwgZ2V0UHJvamVjdCgpLCB0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXREYXRhVHlwZURlZmluaXRpb25zKCkuZ2V0KHR5cGVOYW1lKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHROYW1lIDogZ2V0UHJvamVjdCgpLmdldENvcHlPZlRhc2tEZWZpbml0aW9ucygpLmtleVNldCgpKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRlci5wcmludEVsZW1lbnREZWNsKG91dCwgZ2V0UHJvamVjdCgpLCB0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpLmdldCh0TmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpLmdldCh0TmFtZSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwcmludGVyLnByaW50VGFpbChvdXQpOwogCiAgICAgICAgICAgICBpZiAob3V0LmNoZWNrRXJyb3IoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRW5jb3VudGVyZWQgYW4gZXJyb3Igd3JpdGluZyBBbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzdHJ1Y3R1cmUiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuY291bnRlcmVkIGFuIGVycm9yIHdyaXRpbmcgQW50IHN0cnVjdHVyZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXQuZ2V0QWJzb2x1dGVQYXRoKCksIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKyBvdXRwdXQuZ2V0QWJzb2x1dGVQYXRoKCksIGlvZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE4NCwxNSArMTYzLDE3IEBACiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLUyA9ICIldGFza3M7IjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVTID0gIiV0eXBlczsiOwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiB2aXNpdGVkID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHZpc2l0ZWQgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRUYWlsKGZpbmFsIFByaW50V3JpdGVyIG91dCkgewogICAgICAgICAgICAgdmlzaXRlZC5jbGVhcigpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50SGVhZChmaW5hbCBQcmludFdyaXRlciBvdXQsIGZpbmFsIFByb2plY3QgcCwgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IHRhc2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IHR5cGVzKSB7Ci0gICAgICAgICAgICBwcmludEhlYWQob3V0LCB0YXNrcy5rZXlzKCksIHR5cGVzLmtleXMoKSk7CisgICAgICAgICAgICBwcmludEhlYWQob3V0LCB0YXNrcy5rZXlTZXQoKSwgdHlwZXMua2V5U2V0KCkpOwogICAgICAgICB9CiAKIApAQCAtMjAyLDM2ICsxODMsMTggQEAKICAgICAgICAgICogPHA+QmFzaWNhbGx5IHRoaXMgcHJpbnRzIHRoZSBYTUwgZGVjbGFyYXRpb24sIGRlZmluZXMgc29tZQogICAgICAgICAgKiBlbnRpdGllcyBhbmQgdGhlIHByb2plY3QgZWxlbWVudC48L3A+CiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgcHJpbnRIZWFkKGZpbmFsIFByaW50V3JpdGVyIG91dCwgZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiB0YXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IHR5cGVzKSB7CisgICAgICAgIHByaXZhdGUgdm9pZCBwcmludEhlYWQoZmluYWwgUHJpbnRXcml0ZXIgb3V0LCBmaW5hbCBTZXQ8U3RyaW5nPiB0YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB0eXBlcykgewogICAgICAgICAgICAgb3V0LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz4iKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKCI8IUVOVElUWSAlIGJvb2xlYW4gXCIodHJ1ZXxmYWxzZXxvbnxvZmZ8eWVzfG5vKVwiPiIpOwotICAgICAgICAgICAgb3V0LnByaW50KCI8IUVOVElUWSAlIHRhc2tzIFwiIik7Ci0gICAgICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlICh0YXNrcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0TmFtZSA9IHRhc2tzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5wcmludCh0TmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7Ci0gICAgICAgICAgICBvdXQucHJpbnQoIjwhRU5USVRZICUgdHlwZXMgXCIiKTsKLSAgICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlICh0eXBlcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IHR5cGVzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnQoIiB8ICIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5wcmludCh0eXBlTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiXCI+Iik7CiAKLSAgICAgICAgICAgIG91dC5wcmludGxuKCIiKTsKKyAgICAgICAgICAgIG91dC5wcmludGxuKHRhc2tzLnN0cmVhbSgpLmNvbGxlY3QoCisgICAgICAgICAgICAgICAgQ29sbGVjdG9ycy5qb2luaW5nKCIgfCAiLCAiPCFFTlRJVFkgJSB0YXNrcyBcIiIsICJcIj4iKSkpOworCisgICAgICAgICAgICBvdXQucHJpbnRsbih0eXBlcy5zdHJlYW0oKS5jb2xsZWN0KAorICAgICAgICAgICAgICAgIENvbGxlY3RvcnMuam9pbmluZygiIHwgIiwgIjwhRU5USVRZICUgdHlwZXMgXCIiLCAiXCI+IikpKTsKKworICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKIAogICAgICAgICAgICAgb3V0LnByaW50KCI8IUVMRU1FTlQgcHJvamVjdCAodGFyZ2V0IHwgZXh0ZW5zaW9uLXBvaW50IHwgIik7CiAgICAgICAgICAgICBvdXQucHJpbnQoVEFTS1MpOwpAQCAtMjQ4LDYgKzIxMSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBQcmludHMgdGhlIGRlZmluaXRpb24gZm9yIHRoZSB0YXJnZXQgZWxlbWVudC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBwcmludFRhcmdldERlY2woZmluYWwgUHJpbnRXcml0ZXIgb3V0KSB7CiAgICAgICAgICAgICBvdXQucHJpbnQoIjwhRUxFTUVOVCB0YXJnZXQgKCIpOwogICAgICAgICAgICAgb3V0LnByaW50KFRBU0tTKTsKQEAgLTI4MSw2ICsyNDUsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogUHJpbnQgdGhlIGRlZmluaXRpb24gZm9yIGEgZ2l2ZW4gZWxlbWVudC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBwcmludEVsZW1lbnREZWNsKGZpbmFsIFByaW50V3JpdGVyIG91dCwgZmluYWwgUHJvamVjdCBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzczw/PiBlbGVtZW50KSB7CiAKQEAgLTI4OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlzaXRlZC5wdXQobmFtZSwgIiIpOwogCi0gICAgICAgICAgICBJbnRyb3NwZWN0aW9uSGVscGVyIGloID0gbnVsbDsKKyAgICAgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIgaWg7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIocCwgZWxlbWVudCk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgewpAQCAtMzAxLDExMSArMjY2LDc4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8IUVMRU1FTlQgIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobmFtZSkuYXBwZW5kKCIgIik7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIjwhRUxFTUVOVCAiKS5hcHBlbmQobmFtZSkuYXBwZW5kKCIgIik7CiAKLSAgICAgICAgICAgIGlmIChvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2UuY2xhc3MuZXF1YWxzKGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJFTVBUWT4iKS5hcHBlbmQoTElORV9TRVApOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPCFBVFRMSVNUICIpLmFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoTElORV9TRVApLmFwcGVuZCgiICAgICAgICAgIGlkIElEICNJTVBMSUVEIik7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKExJTkVfU0VQKS5hcHBlbmQoIiAgICAgICAgICByZWZpZCBJRFJFRiAjSU1QTElFRCIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiPiIpLmFwcGVuZChMSU5FX1NFUCk7CisgICAgICAgICAgICBpZiAoUmVmZXJlbmNlLmNsYXNzLmVxdWFscyhlbGVtZW50KSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJFTVBUWT4lbjwhQVRUTElTVCAlcyVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgICAgICAgaWQgSUQgI0lNUExJRUQlbiAgICAgICAgICByZWZpZCBJRFJFRiAjSU1QTElFRD4lbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKSk7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oc2IpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIGlmIChpaC5zdXBwb3J0c0NoYXJhY3RlcnMoKSkgewotICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudCgiI1BDREFUQSIpOworICAgICAgICAgICAgICAgIHYuYWRkKCIjUENEQVRBIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChUYXNrQ29udGFpbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICB2LmFkZEVsZW1lbnQoVEFTS1MpOworICAgICAgICAgICAgICAgIHYuYWRkKFRBU0tTKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gaWguZ2V0TmVzdGVkRWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB2LmFkZEFsbChDb2xsZWN0aW9ucy5saXN0KGloLmdldE5lc3RlZEVsZW1lbnRzKCkpKTsKKworICAgICAgICAgICAgZmluYWwgQ29sbGVjdG9yPENoYXJTZXF1ZW5jZSwgPywgU3RyaW5nPiBqb2luQWx0cyA9CisgICAgICAgICAgICAgICAgQ29sbGVjdG9ycy5qb2luaW5nKCIgfCAiLCAiKCIsICIpIik7CiAKICAgICAgICAgICAgIGlmICh2LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiRU1QVFkiKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIoIik7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gdi5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIHwgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHYuZWxlbWVudEF0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIpIik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMSB8fCAhdi5lbGVtZW50QXQoMCkuZXF1YWxzKCIjUENEQVRBIikpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodi5zdHJlYW0oKS5jb2xsZWN0KGpvaW5BbHRzKSk7CisgICAgICAgICAgICAgICAgaWYgKHYuc2l6ZSgpID4gMSB8fCAhIiNQQ0RBVEEiLmVxdWFscyh2LmdldCgwKSkpIHsKICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIqIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2IuYXBwZW5kKCI+Iik7CiAgICAgICAgICAgICBvdXQucHJpbnRsbihzYik7CiAKLSAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiPCFBVFRMSVNUICIpOwotICAgICAgICAgICAgc2IuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKExJTkVfU0VQKS5hcHBlbmQoIiAgICAgICAgICBpZCBJRCAjSU1QTElFRCIpOworICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIjwhQVRUTElTVCAlcyVuICAgICAgICAgIGlkIElEICNJTVBMSUVEIiwgbmFtZSkpOwogCi0gICAgICAgICAgICBlID0gaWguZ2V0QXR0cmlidXRlcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXR0ck5hbWUgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBhdHRyTmFtZSA6IENvbGxlY3Rpb25zLmxpc3QoaWguZ2V0QXR0cmlidXRlcygpKSkgewogICAgICAgICAgICAgICAgIGlmICgiaWQiLmVxdWFscyhhdHRyTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKExJTkVfU0VQKS5hcHBlbmQoIiAgICAgICAgICAiKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGF0dHJOYW1lKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJW4gICAgICAgICAgJXMgIiwgYXR0ck5hbWUpKTsKICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlID0gaWguZ2V0QXR0cmlidXRlVHlwZShhdHRyTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlLmVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5UWVBFKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmVxdWFscyhCb29sZWFuLmNsYXNzKSB8fCB0eXBlLmVxdWFscyhCb29sZWFuLlRZUEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChCT09MRUFOKS5hcHBlbmQoIiAiKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJlZmVyZW5jZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSURSRUYgIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFbnVtZXJhdGVkQXR0cmlidXRlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0ZWRBdHRyaWJ1dGUgZWEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbnVtZXJhdGVkQXR0cmlidXRlKSB0eXBlLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5hc1N1YmNsYXNzKEVudW1lcmF0ZWRBdHRyaWJ1dGUuY2xhc3MpLm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMgPSBlYS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHZhbHVlcy5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFhcmVObXRva2Vucyh2YWx1ZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIoIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgfCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIpICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJlYW0ub2YodmFsdWVzKS5jb2xsZWN0KGpvaW5BbHRzKSkuYXBwZW5kKCIgIik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEluc3RhbnRpYXRpb25FeGNlcHRpb24gaWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0RBVEEgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0RBVEEgIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gdmFsdWVzID0gKE9iamVjdFtdKSB0eXBlLmdldE1ldGhvZCgidmFsdWVzIiwgKENsYXNzW10pICBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZva2UobnVsbCwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW08Pz5bXSB2YWx1ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbnVtPD8+W10pIHR5cGUuZ2V0TWV0aG9kKCJ2YWx1ZXMiKS5pbnZva2UobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJDREFUQSAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcoJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgfCAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodHlwZS5nZXRNZXRob2QoIm5hbWUiLCAoQ2xhc3NbXSkgbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZva2UodmFsdWVzW2ldLCAoT2JqZWN0W10pIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIpICIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJlYW0ub2YodmFsdWVzKS5tYXAoRW51bTo6bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoam9pbkFsdHMpKS5hcHBlbmQoIiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQ0RBVEEgIik7CkBAIC00MTUsMTIgKzM0NywxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiNJTVBMSUVEIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIj4iKS5hcHBlbmQoTElORV9TRVApOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIj4lbiIpKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKHNiKTsKIAotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gdi5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmVzdGVkTmFtZSA9IHYuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmVzdGVkTmFtZSA6IHYpIHsKICAgICAgICAgICAgICAgICBpZiAoISIjUENEQVRBIi5lcXVhbHMobmVzdGVkTmFtZSkKICAgICAgICAgICAgICAgICAgICAgJiYgIVRBU0tTLmVxdWFscyhuZXN0ZWROYW1lKQogICAgICAgICAgICAgICAgICAgICAmJiAhVFlQRVMuZXF1YWxzKG5lc3RlZE5hbWUpKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYi5qYXZhCmluZGV4IDhmZjgzNmEuLmUyZTNiZDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsOSArMjIsNyBAQAogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQ29tcG9uZW50SGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC05NCw3ICs5Miw3IEBACiAgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9CiAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlQW50bGliRGVzY3JpcHRvcihwcm9qZWN0LCBhbnRsaWJSZXNvdXJjZSk7CiAgICAgICAgICAgICAvLyBDaGVjayBuYW1lIGlzICJhbnRsaWIiCi0gICAgICAgICAgICBpZiAoISh1ZS5nZXRUYWcoKS5lcXVhbHMoVEFHKSkpIHsKKyAgICAgICAgICAgIGlmICghVEFHLmVxdWFscyh1ZS5nZXRUYWcoKSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIHRhZyAiICsgdWUuZ2V0VGFnKCkgKyAiIGV4cGVjdGluZyAiCiAgICAgICAgICAgICAgICAgICAgICsgVEFHLCB1ZS5nZXRMb2NhdGlvbigpKTsKQEAgLTExNiw3ICsxMTQsNyBAQAogICAgIC8vCiAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKICAgICBwcml2YXRlIFN0cmluZyB1cmkgPSAiIjsKLSAgICBwcml2YXRlIExpc3Q8T2JqZWN0PiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgIHByaXZhdGUgTGlzdDxUYXNrPiB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBjbGFzcyBsb2FkZXIgZm9yIHRoaXMgYW50bGliLgpAQCAtMTQ5LDYgKzE0Nyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayBOZXN0ZWQgdGFzayB0byBleGVjdXRlIGluIGFudGxpYgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7CiAgICAgICAgIHRhc2tzLmFkZChuZXN0ZWRUYXNrKTsKICAgICB9CkBAIC0xNTcsMTAgKzE1NiwxMiBAQAogICAgICAqIEV4ZWN1dGUgdGhlIG5lc3RlZCB0YXNrcywgc2V0dGluZyB0aGUgY2xhc3Nsb2FkZXIgZm9yCiAgICAgICogYW55IHRhc2tzIHRoYXQgZGVyaXZlIGZyb20gRGVmaW5lci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICAvL1RPRE8gaGFuZGxlIHRhc2tzIGFkZGVkIHZpYSAjYWRkVGFzaygpCi0gICAgICAgIGZvciAoSXRlcmF0b3I8T2JqZWN0PiBpID0gdGFza3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IChVbmtub3duRWxlbWVudCkgaS5uZXh0KCk7CisKKyAgICAgICAgZm9yIChUYXNrIHRhc2sgOiB0YXNrcykgeworICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgdWUgPSAoVW5rbm93bkVsZW1lbnQpIHRhc2s7CiAgICAgICAgICAgICBzZXRMb2NhdGlvbih1ZS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIHVlLm1heWJlQ29uZmlndXJlKCk7CiAgICAgICAgICAgICBPYmplY3QgY29uZmlndXJlZE9iamVjdCA9IHVlLmdldFJlYWxUaGluZygpOwpAQCAtMTY5LDkgKzE3MCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIShjb25maWd1cmVkT2JqZWN0IGluc3RhbmNlb2YgQW50bGliRGVmaW5pdGlvbikpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHRhc2sgaW4gYW50bGliICIgKyB1ZS5nZXRUYWcoKQotICAgICAgICAgICAgICAgICAgICArICIgIiArIGNvbmZpZ3VyZWRPYmplY3QuZ2V0Q2xhc3MoKSArICIgZG9lcyBub3QgIgotICAgICAgICAgICAgICAgICAgICArICJleHRlbmQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50bGliRGVmaW5pdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0YXNrIGluIGFudGxpYiAlcyAlcyBkb2VzIG5vdCBleHRlbmQgJXMiLAorICAgICAgICAgICAgICAgICAgICB1ZS5nZXRUYWcoKSwgY29uZmlndXJlZE9iamVjdC5nZXRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICBBbnRsaWJEZWZpbml0aW9uLmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBbnRsaWJEZWZpbml0aW9uIGRlZiA9IChBbnRsaWJEZWZpbml0aW9uKSBjb25maWd1cmVkT2JqZWN0OwogICAgICAgICAgICAgZGVmLnNldFVSSSh1cmkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliRGVmaW5pdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliRGVmaW5pdGlvbi5qYXZhCmluZGV4IGVlZjMzMzQuLmVkMzljYjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYkRlZmluaXRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWJEZWZpbml0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCwxMSArNDQsMTEgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcmVzZXJ2ZWQgVVJJIGlzIHVzZWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHVyaS5lcXVhbHMoUHJvamVjdEhlbHBlci5BTlRfQ09SRV9VUkkpKSB7CisgICAgICAgIGlmIChQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSS5lcXVhbHModXJpKSkgewogICAgICAgICAgICAgdXJpID0gIiI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJhbnQ6IikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXR0ZW1wdCB0byB1c2UgYSByZXNlcnZlZCBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0dGVtcHQgdG8gdXNlIGEgcmVzZXJ2ZWQgVVJJICVzIiwgdXJpKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLnVyaSA9IHVyaTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BcHQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FwdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjUyN2I4Li4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FwdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkFwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOwotCi0vKioKLSAqIEFwdCBUYXNrIGZvciBydW5uaW5nIHRoZSBBbm5vdGF0aW9uIHByb2Nlc3NpbmcgdG9vbCBmb3IgSkRLIDEuNS4gIEl0IGRlcml2ZXMKLSAqIGZyb20gdGhlIGV4aXN0aW5nIEphdmFjIHRhc2ssIGFuZCBmb3JjZXMgdGhlIGNvbXBpbGVyIGJhc2VkIG9uIHdoZXRoZXIgd2UncmUKLSAqIGV4ZWN1dGluZyBpbnRlcm5hbGx5LCBvciBleHRlcm5hbGx5LgotICoKLSAqIEBzaW5jZSBBbnQgMS43Ci0gKi8KLQotCi1wdWJsaWMgY2xhc3MgQXB0Ci0gICAgICAgIGV4dGVuZHMgSmF2YWMgewotICAgIHByaXZhdGUgYm9vbGVhbiBjb21waWxlID0gdHJ1ZTsKLSAgICBwcml2YXRlIFN0cmluZyBmYWN0b3J5OwotICAgIHByaXZhdGUgUGF0aCBmYWN0b3J5UGF0aDsKLSAgICBwcml2YXRlIFZlY3RvcjxPcHRpb24+IG9wdGlvbnMgPSBuZXcgVmVjdG9yPE9wdGlvbj4oKTsKLSAgICBwcml2YXRlIEZpbGUgcHJlcHJvY2Vzc0RpcjsKLSAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGFwdCB0b29sLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVEFCTEVfTkFNRSA9ICJhcHQiOwotICAgIC8qKiBBbiB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiBpZ25vcmluZyBjb21waWxlciBhdHRyaWJ1dGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfSUdOT1JJTkdfQ09NUElMRVJfT1BUSU9OCi0gICAgICAgID0gIklnbm9yaW5nIGNvbXBpbGVyIGF0dHJpYnV0ZSBmb3IgdGhlIEFQVCB0YXNrLCBhcyBpdCBpcyBmaXhlZCI7Ci0gICAgLyoqIEEgd2FybmluZyBtZXNzYWdlIGlmIHVzZWQgd2l0aCBqYXZhICZsdDsgMS41LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1dST05HX0pBVkFfVkVSU0lPTgotICAgICAgICA9ICJBcHQgdGFzayByZXF1aXJlcyBKYXZhIDEuNSsiOwotCi0gICAgLyoqCi0gICAgICogZXhwb3NlZCBmb3IgZGVidWcgbWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HX0lHTk9SSU5HX0ZPUksgPQotICAgICAgICAiQXB0IG9ubHkgcnVucyBpbiBpdHMgb3duIEpWTTsgZm9yaz1mYWxzZSBvcHRpb24gaWdub3JlZCI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbmVzdGVkIG9wdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT3B0aW9uIHsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLSAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBPcHRpb24gKi8KLSAgICAgICAgcHVibGljIE9wdGlvbigpIHsKLSAgICAgICAgICAgIC8vZGVmYXVsdAotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCi0gICAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgYXR0cmlidXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBuYW1lIGF0dHJpYnV0ZS4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG9wdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCi0gICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGF0dHJpYnV0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSB2YWx1ZSBhdHRyaWJ1dGUuCi0gICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIG9wdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IgZm9yIEFwdCB0YXNrLgotICAgICAqIFRoaXMgc2V0cyB0aGUgYXB0IGNvbXBpbGVyIGFkYXB0ZXIgYXMgdGhlIGNvbXBpbGVyIGluIHRoZSBzdXBlciBjbGFzcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQXB0KCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBzdXBlci5zZXRDb21waWxlcihBcHRFeHRlcm5hbENvbXBpbGVyQWRhcHRlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdXBlci5zZXRGb3JrKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXB0IGV4ZWN1dGFibGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXB0RXhlY3V0YWJsZSgpIHsKLSAgICAgICAgU3RyaW5nIGV4ZSA9IGdldEV4ZWN1dGFibGUoKTsKLSAgICAgICAgcmV0dXJuIGV4ZSAhPSBudWxsID8gZXhlIDoKLSAgICAgICAgICAgIEphdmFFbnZVdGlscy5nZXRKZGtFeGVjdXRhYmxlKEVYRUNVVEFCTEVfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb21waWxlci4KLSAgICAgKiBUaGlzIGlzIG5vdCBhbGxvd2VkIGFuZCBhIHdhcm5pbmcgbG9nIG1lc3NhZ2UgaXMgbWFkZS4KLSAgICAgKiBAcGFyYW0gY29tcGlsZXIgbm90IHVzZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKSB7Ci0gICAgICAgIGxvZyhFUlJPUl9JR05PUklOR19DT01QSUxFUl9PUFRJT04sIFByb2plY3QuTVNHX1dBUk4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZm9yayBhdHRyaWJ1dGUuCi0gICAgICogTm9uLWZvcmtpbmcgQVBUIGlzIGhpZ2hseSBjbGFzc3BhdGggZGVwZW5kZW50IGFuZCBhcHBlYXJzIHRvIGJlIHRvbwotICAgICAqIGJyaXR0bGUgdG8gd29yay4gVGhlIHNvbGUgcmVhc29uIHRoaXMgYXR0cmlidXRlIGlzIHJldGFpbmVkCi0gICAgICogaXMgdGhlIHN1cGVyY2xhc3MgZG9lcyBpdAotICAgICAqIEBwYXJhbSBmb3JrIGlmIGZhbHNlOyB3YXJuIHRoZSBvcHRpb24gaXMgaWdub3JlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gZm9yaykgewotICAgICAgICBpZiAoIWZvcmspIHsKLSAgICAgICAgICAgIGxvZyhXQVJOSU5HX0lHTk9SSU5HX0ZPUkssIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb21waWxlciBjbGFzcyBuYW1lLgotICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGVyIGNsYXNzIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDb21waWxlcigpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldENvbXBpbGVyKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjb21waWxlIG9wdGlvbiBmb3IgdGhlIGFwdCBjb21waWxlci4KLSAgICAgKiBJZiB0aGlzIGlzIGZhbHNlIHRoZSAiLW5vY29tcGlsZSIgYXJndW1lbnQgd2lsbCBiZSB1c2VkLgotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBjb21waWxlIG9wdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBpbGUoKSB7Ci0gICAgICAgIHJldHVybiBjb21waWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgY29tcGlsZSBvcHRpb24gZm9yIHRoZSBhcHQgY29tcGlsZXIuCi0gICAgICogRGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqIEBwYXJhbSBjb21waWxlIGlmIHRydWUgc2V0IHRoZSBjb21waWxlIG9wdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21waWxlKGJvb2xlYW4gY29tcGlsZSkgewotICAgICAgICB0aGlzLmNvbXBpbGUgPSBjb21waWxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmFjdG9yeSBvcHRpb24gZm9yIHRoZSBhcHQgY29tcGlsZXIuCi0gICAgICogSWYgdGhpcyBpcyBub24tbnVsbCB0aGUgIi1mYWN0b3J5IiBhcmd1bWVudCB3aWxsIGJlIHVzZWQuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZhY3Rvcnkgb3B0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBmYWN0b3J5IG9wdGlvbiBmb3IgdGhlIGFwdCBjb21waWxlci4KLSAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIG51bGwuCi0gICAgICogQHBhcmFtIGZhY3RvcnkgdGhlIGNsYXNzbmFtZSBvZiB0aGUgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3J5KFN0cmluZyBmYWN0b3J5KSB7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgcmVmZXJlbmNlIHRvIGEgcGF0aCB0byB0aGUgZmFjdG9yeVBhdGggYXR0cmlidXRlLgotICAgICAqIEBwYXJhbSByZWYgYSByZWZlcmVuY2UgdG8gYSBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnlQYXRoUmVmKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgY3JlYXRlRmFjdG9yeVBhdGgoKS5zZXRSZWZpZChyZWYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIHBhdGggdG8gdGhlIGZhY3RvcnlQYXRoIGF0dHJpYnV0ZS4KLSAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUZhY3RvcnlQYXRoKCkgewotICAgICAgICBpZiAoZmFjdG9yeVBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgZmFjdG9yeVBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWN0b3J5UGF0aC5jcmVhdGVQYXRoKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmYWN0b3J5IHBhdGggYXR0cmlidXRlLgotICAgICAqIElmIHRoaXMgaXMgbm90IG51bGwsIHRoZSAiLWZhY3RvcnlwYXRoIiBhcmd1bWVudCB3aWxsIGJlIHVzZWQuCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbnVsbC4KLSAgICAgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHBhdGggYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBQYXRoIGdldEZhY3RvcnlQYXRoKCkgewotICAgICAgICByZXR1cm4gZmFjdG9yeVBhdGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgbmVzdGVkIG9wdGlvbi4KLSAgICAgKiBAcmV0dXJuIGFuIG9wdGlvbiB0byBiZSBjb25maWd1cmVkLgotICAgICAqLwotICAgIHB1YmxpYyBPcHRpb24gY3JlYXRlT3B0aW9uKCkgewotICAgICAgICBPcHRpb24gb3B0ID0gbmV3IE9wdGlvbigpOwotICAgICAgICBvcHRpb25zLmFkZChvcHQpOwotICAgICAgICByZXR1cm4gb3B0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgb3B0aW9ucyB0byB0aGUgY29tcGlsZXIuCi0gICAgICogRWFjaCBvcHRpb24gd2lsbCB1c2UgJyItRSIgbmFtZSBbIj0iIHZhbHVlXScgYXJndW1lbnQuCi0gICAgICogQHJldHVybiB0aGUgb3B0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yPE9wdGlvbj4gZ2V0T3B0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIG9wdGlvbnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBwcmVwcm9jZXNzZGlyIGF0dHJpYnV0ZS4KLSAgICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSAiLXMiIGFyZ3VtZW50LgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuCi0gICAgICogQHJldHVybiB0aGUgcHJlcHJvY2Vzc2RpciBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIEZpbGUgZ2V0UHJlcHJvY2Vzc0RpcigpIHsKLSAgICAgICAgcmV0dXJuIHByZXByb2Nlc3NEaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBwcmVwcm9jZXNzZGlyIGF0dHJpYnV0ZS4KLSAgICAgKiBAcGFyYW0gcHJlcHJvY2Vzc0RpciB3aGVyZSB0byBwbGFjZSBwcm9jZXNzb3IgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQcmVwcm9jZXNzRGlyKEZpbGUgcHJlcHJvY2Vzc0RpcikgewotICAgICAgICB0aGlzLnByZXByb2Nlc3NEaXIgPSBwcmVwcm9jZXNzRGlyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIHRoZSBjb21waWxhdGlvbi4KLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzgpKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYXB0IGRvZXMgbm90IGV4aXN0IHVuZGVyIEphdmEgMS44IGFuZCBoaWdoZXIiKTsKLSAgICAgICAgfQotICAgICAgICBzdXBlci5leGVjdXRlKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXR0cmlidXRlTmFtZXNwYWNlRGVmLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdHRyaWJ1dGVOYW1lc3BhY2VEZWYuamF2YQppbmRleCBjMzc0ZDZmLi4xZGRjYTdjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdHRyaWJ1dGVOYW1lc3BhY2VEZWYuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdHRyaWJ1dGVOYW1lc3BhY2VEZWYuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F1Z21lbnRSZWZlcmVuY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F1Z21lbnRSZWZlcmVuY2UuamF2YQppbmRleCA3NDAyZDQ0Li42YTc2Njk3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdWdtZW50UmVmZXJlbmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXVnbWVudFJlZmVyZW5jZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGUuamF2YQppbmRleCBkOGViODJmLi5lY2Q0NWI2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMxLDcgKzMxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFdpbGwgc2V0IHRoZSBnaXZlbiBwcm9wZXJ0eSBpZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIGF2YWlsYWJsZSBhdApAQCAtMTYwLDcgKzE1OSw3IEBACiAgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgcmVxdWlyZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKLSAgICAgICAgaWYgKCEiIi5lcXVhbHMoY2xhc3NuYW1lKSkgeworICAgICAgICBpZiAoIWNsYXNzbmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRoaXMuY2xhc3NuYW1lID0gY2xhc3NuYW1lOwogICAgICAgICB9CiAgICAgfQpAQCAtMTkzLDkgKzE5Miw5IEBACiAgICAgICogICAgICAgICAgICAgdGhlIHR5cGUgaW4gaXRzIG93biBjbGFzcy4KICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiByZXNvdXJjZQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0VHlwZShTdHJpbmcpIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkLiIKLSAgICAgICAgICAgICsgIiBVc2Ugc2V0VHlwZShBdmFpbGFibGUuRmlsZURpcikgaW5zdGVhZC4iLAorICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0VHlwZShTdHJpbmcpIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2Ugc2V0VHlwZShBdmFpbGFibGUuRmlsZURpcikgaW5zdGVhZC4iLAogICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgIHRoaXMudHlwZSA9IG5ldyBGaWxlRGlyKCk7CiAgICAgICAgIHRoaXMudHlwZS5zZXRWYWx1ZSh0eXBlKTsKQEAgLTIyNyw2ICsyMjYsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFzayBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb3BlcnR5IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsCkBAIC0yMzksMTEgKzIzOSw4IEBACiAgICAgICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIgcGggPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIE9iamVjdCBvbGR2YWx1ZSA9IHBoLmdldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBvbGR2YWx1ZSAmJiAhb2xkdmFsdWUuZXF1YWxzKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSA8YXZhaWxhYmxlPiB1c2VkIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHByb3BlcnR5LiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgQnVpbGQgZmlsZSBzaG91bGQgbm90IHJldXNlIHRoZSBzYW1lIHByb3BlcnR5IgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5hbWUgZm9yIGRpZmZlcmVudCB2YWx1ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoIkRFUFJFQ0FURUQgLSA8YXZhaWxhYmxlPiB1c2VkIHRvIG92ZXJyaWRlIGFuIGV4aXN0aW5nIHByb3BlcnR5LiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgQnVpbGQgZmlsZSBzaG91bGQgbm90IHJldXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUgZm9yIGRpZmZlcmVudCB2YWx1ZXMuIiksCiAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gTkI6IHRoaXMgbWFrZXMgdXNlIG9mIFByb2plY3Qjc2V0UHJvcGVydHkgcmF0aGVyIHRoYW4gUHJvamVjdCNzZXROZXdQcm9wZXJ0eQpAQCAtMjYxLDE3ICsyNTgsMTkgQEAKICAgICAgKiBAcmV0dXJuIGJvb2xlYW4gaXMgdGhlIHJlc291cmNlIGlzIGF2YWlsYWJsZS4KICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IGNvbmZpZ3VyZWQgY29ycmVjdGx5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwgJiYgZmlsZSA9PSBudWxsICYmIHJlc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiAoY2xhc3NuYW1lfGZpbGV8IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXNvdXJjZSkgaXMgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgb2YgKGNsYXNzbmFtZXxmaWxlfHJlc291cmNlKSBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdHlwZSBhdHRyaWJ1dGUgaXMgb25seSB2YWxpZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHNwZWNpZnlpbmcgdGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHR5cGUgYXR0cmlidXRlIGlzIG9ubHkgdmFsaWQgd2hlbiBzcGVjaWZ5aW5nIHRoZSBmaWxlIGF0dHJpYnV0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CkBAIC0yODQsMTMgKzI4MywxMyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzZXRUYXNrTmFtZSgiYXZhaWxhYmxlIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGNsYXNzbmFtZSAhPSBudWxsKSAmJiAhY2hlY2tDbGFzcyhjbGFzc25hbWUpKSB7CisgICAgICAgICAgICBpZiAoY2xhc3NuYW1lICE9IG51bGwgJiYgIWNoZWNrQ2xhc3MoY2xhc3NuYW1lKSkgewogICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIGNsYXNzbmFtZSArIGFwcGVuZGl4LAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGZpbGUgIT0gbnVsbCkgJiYgIWNoZWNrRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIlVuYWJsZSB0byBmaW5kICIpOworICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiAhY2hlY2tGaWxlKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJVbmFibGUgdG8gZmluZCAiKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQodHlwZSkuYXBwZW5kKCcgJyk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjk4LDcgKzI5Nyw3IEBACiAgICAgICAgICAgICAgICAgbG9nKGJ1Zi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHJlc291cmNlICE9IG51bGwpICYmICFjaGVja1Jlc291cmNlKHJlc291cmNlKSkgeworICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwgJiYgIWNoZWNrUmVzb3VyY2UocmVzb3VyY2UpKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9hZCByZXNvdXJjZSAiICsgcmVzb3VyY2UgKyBhcHBlbmRpeCwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzM0LDYyICszMzMsNjQgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tGaWxlKCkgewogICAgICAgICBpZiAoZmlsZXBhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGNoZWNrRmlsZShmaWxlLCBmaWxlbmFtZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXRocyA9IGZpbGVwYXRoLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBsb2coIlNlYXJjaGluZyAiICsgcGF0aHNbaV0sIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgIEZpbGUgcGF0aCA9IG5ldyBGaWxlKHBhdGhzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdbXSBwYXRocyA9IGZpbGVwYXRoLmxpc3QoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcCA6IHBhdGhzKSB7CisgICAgICAgICAgICBsb2coIlNlYXJjaGluZyAiICsgcCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBGaWxlIHBhdGggPSBuZXcgRmlsZShwKTsKIAotICAgICAgICAgICAgICAgIC8vICoqICAgZnVsbC1wYXRobmFtZSBzcGVjaWZpZWQgPT0gcGF0aCBpbiBsaXN0Ci0gICAgICAgICAgICAgICAgLy8gKiogICBzaW1wbGUgbmFtZSBzcGVjaWZpZWQgICA9PSBwYXRoIGluIGxpc3QKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5leGlzdHMoKQotICAgICAgICAgICAgICAgICAgICAmJiAoZmlsZW5hbWUuZXF1YWxzKHBhdGhzW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZmlsZW5hbWUuZXF1YWxzKHBhdGguZ2V0TmFtZSgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZDogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0RpcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0aC5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kIGRpcmVjdG9yeTogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0ZpbGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhdGguaXNGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZmlsZTogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSByZXF1ZXN0ZWQgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAvLyAqKiAgIGZ1bGwtcGF0aG5hbWUgc3BlY2lmaWVkID09IHBhdGggaW4gbGlzdAorICAgICAgICAgICAgLy8gKiogICBzaW1wbGUgbmFtZSBzcGVjaWZpZWQgICA9PSBwYXRoIGluIGxpc3QKKyAgICAgICAgICAgIGlmIChwYXRoLmV4aXN0cygpCisgICAgICAgICAgICAgICAgJiYgKGZpbGVuYW1lLmVxdWFscyhwKQorICAgICAgICAgICAgICAgICAgICB8fCBmaWxlbmFtZS5lcXVhbHMocGF0aC5nZXROYW1lKCkpKSkgeworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZDogIiArIHBhdGgsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBwYXRoLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICAvLyAqKiAgIGZ1bGwtcGF0aG5hbWUgc3BlY2lmaWVkID09IHBhcmVudCBkaXIgb2YgcGF0aCBpbiBsaXN0Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5leGlzdHMoKQotICAgICAgICAgICAgICAgICAgICAmJiBmaWxlbmFtZS5lcXVhbHMocGFyZW50LmdldEFic29sdXRlUGF0aCgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kOiAiICsgcGFyZW50LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUuaXNEaXIoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBkaXJlY3Rvcnk6ICIgKyBwYXJlbnQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRoZSByZXF1ZXN0ZWQgdHlwZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUuaXNEaXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0aC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZGlyZWN0b3J5OiAiICsgcGF0aCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAqKiAgIHNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhdGggaW4gbGlzdCArIG5hbWUKLSAgICAgICAgICAgICAgICBpZiAocGF0aC5leGlzdHMoKSAmJiBwYXRoLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZShuZXcgRmlsZShwYXRoLCBmaWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAiIGluICIgKyBwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0ZpbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcGF0aC5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kIGZpbGU6ICIgKyBwYXRoLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIG5vdCB0aGUgcmVxdWVzdGVkIHR5cGUKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGaWxlIHBhcmVudCA9IHBhdGguZ2V0UGFyZW50RmlsZSgpOworICAgICAgICAgICAgLy8gKiogICBmdWxsLXBhdGhuYW1lIHNwZWNpZmllZCA9PSBwYXJlbnQgZGlyIG9mIHBhdGggaW4gbGlzdAorICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5leGlzdHMoKQorICAgICAgICAgICAgICAgICYmIGZpbGVuYW1lLmVxdWFscyhwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kOiAiICsgcGFyZW50LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzRGlyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBkaXJlY3Rvcnk6ICIgKyBwYXJlbnQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbm90IHRoZSByZXF1ZXN0ZWQgdHlwZQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vICoqICAgc2ltcGxlIG5hbWUgc3BlY2lmaWVkICAgPT0gcGF0aCBpbiBsaXN0ICsgbmFtZQorICAgICAgICAgICAgaWYgKHBhdGguZXhpc3RzKCkgJiYgcGF0aC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZShuZXcgRmlsZShwYXRoLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICIgaW4gIiArIHBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vICoqICAgc2ltcGxlIG5hbWUgc3BlY2lmaWVkICAgPT0gcGFyZW50IGRpciArIG5hbWUKLSAgICAgICAgICAgICAgICB3aGlsZSAoc2VhcmNoUGFyZW50cyAmJiBwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrRmlsZShuZXcgRmlsZShwYXJlbnQsIGZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSArICIgaW4gIiArIHBhcmVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnRGaWxlKCk7CisgICAgICAgICAgICAvLyAqKiAgIHNpbXBsZSBuYW1lIHNwZWNpZmllZCAgID09IHBhcmVudCBkaXIgKyBuYW1lCisgICAgICAgICAgICB3aGlsZSAoc2VhcmNoUGFyZW50cyAmJiBwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tGaWxlKG5ldyBGaWxlKHBhcmVudCwgZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAiIGluICIgKyBwYXJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50RmlsZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTQwNSw3ICs0MDYsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb2coIkZvdW5kIGRpcmVjdG9yeTogIiArIHRleHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZi5pc0RpcmVjdG9yeSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZS5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgIGlmIChmLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiRm91bmQgZmlsZTogIiArIHRleHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQ5NCw2ICs0OTYsNyBAQAogICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzCiAgICAgICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBWQUxVRVM7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDIuamF2YQppbmRleCBlNGE3OTk1Li5iMzY0YjU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CVW56aXAyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlVuemlwMi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsOSArMjAsMTAgQEAKIAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwpAQCAtNjAsMTIgKzYxLDEyIEBACiAgICAgICAgICAgICBsb2coIkV4cGFuZGluZyAiICsgc3JjUmVzb3VyY2UuZ2V0TmFtZSgpICsgIiB0byAiCiAgICAgICAgICAgICAgICAgKyBkZXN0LmdldEFic29sdXRlUGF0aCgpKTsKIAotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7CiAgICAgICAgICAgICBDQlppcDJJbnB1dFN0cmVhbSB6SW4gPSBudWxsOwogICAgICAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7CisgICAgICAgICAgICAgICAgb3V0ID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGRlc3QudG9QYXRoKCkpOwogICAgICAgICAgICAgICAgIGZpcyA9IHNyY1Jlc291cmNlLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmlzKTsKICAgICAgICAgICAgICAgICBpbnQgYiA9IGJpcy5yZWFkKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CWmlwMi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDIuamF2YQppbmRleCBmNTk0NGRmLi4wYjQxMGU3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CWmlwMi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JaaXAyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw4ICsyMCw4IEBACiAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICBDQlppcDJPdXRwdXRTdHJlYW0gek91dCA9IG51bGw7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPQotICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh6aXBGaWxlKSk7CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbSh6aXBGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgICAgICBib3Mud3JpdGUoJ0InKTsKICAgICAgICAgICAgIGJvcy53cml0ZSgnWicpOwogICAgICAgICAgICAgek91dCA9IG5ldyBDQlppcDJPdXRwdXRTdHJlYW0oYm9zKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Jhc2VuYW1lLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CYXNlbmFtZS5qYXZhCmluZGV4IDA0MTVhZjcuLjdiNmQ0MzQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Jhc2VuYW1lLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmFzZW5hbWUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg1LDYgKzg1LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHJlcXVpcmVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwbGllZAogICAgICAqIHByb3BlcnR5IGFuZCBhdHRyaWJ1dGUgYXJlIHJlcXVpcmVkIGF0dHJpYnV0ZXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvcGVydHkgYXR0cmlidXRlIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CkBAIC05MiwxOSArOTMsMjEgQEAKICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIGF0dHJpYnV0ZSByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbGUuZ2V0TmFtZSgpOwotICAgICAgICBpZiAoc3VmZml4ICE9IG51bGwgJiYgdmFsdWUuZW5kc1dpdGgoc3VmZml4KSkgewotICAgICAgICAgICAgLy8gaWYgdGhlIHN1ZmZpeCBkb2VzIG5vdCBzdGFydHMgd2l0aCBhICcuJyBhbmQgdGhlCi0gICAgICAgICAgICAvLyBjaGFyIHByZWNlZGluZyB0aGUgc3VmZml4IGlzIGEgJy4nLCB3ZSBhc3N1bWUgdGhlIHVzZXIKLSAgICAgICAgICAgIC8vIHdhbnRzIHRvIHJlbW92ZSB0aGUgJy4nIGFzIHdlbGwgKHNlZSBkb2NzKQotICAgICAgICAgICAgaW50IHBvcyA9IHZhbHVlLmxlbmd0aCgpIC0gc3VmZml4Lmxlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHBvcyA+IDAgJiYgc3VmZml4LmNoYXJBdCgwKSAhPSAnLicKLSAgICAgICAgICAgICAgICAmJiB2YWx1ZS5jaGFyQXQocG9zIC0gMSkgPT0gJy4nKSB7Ci0gICAgICAgICAgICAgICAgcG9zLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBwb3MpOworICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksCisgICAgICAgICAgICByZW1vdmVFeHRlbnNpb24oZmlsZS5nZXROYW1lKCksIHN1ZmZpeCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlbW92ZUV4dGVuc2lvbihTdHJpbmcgcywgU3RyaW5nIGV4dCkgeworICAgICAgICBpZiAoZXh0ID09IG51bGwgfHwgIXMuZW5kc1dpdGgoZXh0KSkgeworICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgIH0KLSAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIGludCBjbGlwRnJvbSA9IHMubGVuZ3RoKCkgLSBleHQubGVuZ3RoKCk7CisgICAgICAgIC8vIGlmIHRoZSBzdWZmaXggZG9lcyBub3Qgc3RhcnRzIHdpdGggYSAnLicgYW5kIHRoZQorICAgICAgICAvLyBjaGFyIHByZWNlZGluZyB0aGUgc3VmZml4IGlzIGEgJy4nLCB3ZSBhc3N1bWUgdGhlIHVzZXIKKyAgICAgICAgLy8gd2FudHMgdG8gcmVtb3ZlIHRoZSAnLicgYXMgd2VsbCAoc2VlIGRvY3MpCisgICAgICAgIGlmIChleHQuY2hhckF0KDApICE9ICcuJyAmJiBjbGlwRnJvbSA+IDAgJiYgcy5jaGFyQXQoY2xpcEZyb20gLSAxKSA9PSAnLicpIHsKKyAgICAgICAgICAgIGNsaXBGcm9tIC09IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIGNsaXBGcm9tKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JpbmRUYXJnZXRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CaW5kVGFyZ2V0cy5qYXZhCmluZGV4IDNjMDdlMjguLmE5YzE2MDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JpbmRUYXJnZXRzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmluZFRhcmdldHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDggKzE4LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CkBAIC0zMyw3ICszMyw3IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBleHRlbnNpb25Qb2ludDsKIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXJnZXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwcml2YXRlIE9uTWlzc2luZ0V4dGVuc2lvblBvaW50IG9uTWlzc2luZ0V4dGVuc2lvblBvaW50OwogCkBAIC01NCwxMyArNTQsOCBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldHMoZmluYWwgU3RyaW5nIHRhcmdldCkgewotICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbnB1dHMgPSB0YXJnZXQuc3BsaXQoIiwiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dCA9IGlucHV0c1tpXS50cmltKCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIFN0cmVhbS5vZih0YXJnZXQuc3BsaXQoIiwiKSkubWFwKFN0cmluZzo6dHJpbSkuZmlsdGVyKHMgLT4gIXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgLmZvckVhY2godGFyZ2V0czo6YWRkKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTcwLDIxICs2NSwxOSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGdldE93bmluZ1RhcmdldCgpID09IG51bGwKLSAgICAgICAgICAgICAgICB8fCAhIiIuZXF1YWxzKGdldE93bmluZ1RhcmdldCgpLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgImJpbmR0YXJnZXRzIG9ubHkgYWxsb3dlZCBhcyBhIHRvcC1sZXZlbCB0YXNrIik7CisgICAgICAgICAgICAgICAgfHwgIWdldE93bmluZ1RhcmdldCgpLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmluZHRhcmdldHMgb25seSBhbGxvd2VkIGFzIGEgdG9wLWxldmVsIHRhc2siKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChvbk1pc3NpbmdFeHRlbnNpb25Qb2ludCA9PSBudWxsKSB7CiAgICAgICAgICAgICBvbk1pc3NpbmdFeHRlbnNpb25Qb2ludCA9IE9uTWlzc2luZ0V4dGVuc2lvblBvaW50LkZBSUw7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgUHJvamVjdEhlbHBlciBoZWxwZXIgPSAoUHJvamVjdEhlbHBlcikgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgKKyAgICAgICAgZmluYWwgUHJvamVjdEhlbHBlciBoZWxwZXIgPSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKAogICAgICAgICAgICAgICAgIFByb2plY3RIZWxwZXIuUFJPSkVDVEhFTFBFUl9SRUZFUkVOQ0UpOwogCi0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdFRhcmdldCA9IHRhcmdldHMuaXRlcmF0b3IoKTsgaXRUYXJnZXQuaGFzTmV4dCgpOykgeworICAgICAgICBmb3IgKFN0cmluZyB0YXJnZXQgOiB0YXJnZXRzKSB7CiAgICAgICAgICAgICBoZWxwZXIuZ2V0RXh0ZW5zaW9uU3RhY2soKS5hZGQobmV3IFN0cmluZ1tdIHtleHRlbnNpb25Qb2ludCwKLSAgICAgICAgICAgICAgICAgICAgaXRUYXJnZXQubmV4dCgpLCBvbk1pc3NpbmdFeHRlbnNpb25Qb2ludC5uYW1lKCl9KTsKKyAgICAgICAgICAgICAgICB0YXJnZXQsIG9uTWlzc2luZ0V4dGVuc2lvblBvaW50Lm5hbWUoKX0pOwogICAgICAgICB9Ci0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CdWlsZE51bWJlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQnVpbGROdW1iZXIuamF2YQppbmRleCA3YTY2MTI1Li5jZTYxYWUyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CdWlsZE51bWJlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0J1aWxkTnVtYmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMyArMTgsMTMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogCkBAIC0zOSw4ICszOSw3IEBACiAgKiBAc2luY2UgQW50IDEuNQogICogQGFudC50YXNrIG5hbWU9ImJ1aWxkbnVtYmVyIgogICovCi1wdWJsaWMgY2xhc3MgQnVpbGROdW1iZXIKLSAgICAgZXh0ZW5kcyBUYXNrIHsKK3B1YmxpYyBjbGFzcyBCdWlsZE51bWJlciBleHRlbmRzIFRhc2sgewogICAgIC8qKgogICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB3aGljaCB0aGUgYnVpbGQgbnVtYmVyIGlzIHN0b3JlZC4KICAgICAgKi8KQEAgLTU0LDcgKzUzLDYgQEAKICAgICAvKiogVGhlIEZpbGUgaW4gd2hpY2ggdGhlIGJ1aWxkIG51bWJlciBpcyBzdG9yZWQuICAqLwogICAgIHByaXZhdGUgRmlsZSBteUZpbGU7CiAKLQogICAgIC8qKgogICAgICAqIFRoZSBmaWxlIGluIHdoaWNoIHRoZSBidWlsZCBudW1iZXIgaXMgc3RvcmVkLiBEZWZhdWx0cyB0bwogICAgICAqICJidWlsZC5udW1iZXIiIGlmIG5vdCBzcGVjaWZpZWQuCkBAIC02NSwxNCArNjMsMTMgQEAKICAgICAgICAgbXlGaWxlID0gZmlsZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFJ1biB0YXNrLgogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgc2F2ZWRGaWxlID0gbXlGaWxlOyAvLyBtYXkgYmUgYWx0ZXJlZCBpbiB2YWxpZGF0ZQogCiAgICAgICAgIHZhbGlkYXRlKCk7CkBAIC04NCwyNiArODEsMTIgQEAKICAgICAgICAgICAgIFN0cmluZy52YWx1ZU9mKGJ1aWxkTnVtYmVyICsgMSkpOwogCiAgICAgICAgIC8vIFdyaXRlIHRoZSBwcm9wZXJ0aWVzIGZpbGUgYmFjayBvdXQKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShteUZpbGUpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gIkJ1aWxkIE51bWJlciBmb3IgQU5ULiBEbyBub3QgZWRpdCEiOwotCi0gICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKG91dHB1dCwgaGVhZGVyKTsKKyAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gb3V0cHV0ID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKG15RmlsZS50b1BhdGgoKSkpIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc3RvcmUob3V0cHV0LCAiQnVpbGQgTnVtYmVyIGZvciBBTlQuIERvIG5vdCBlZGl0ISIpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkVycm9yIHdoaWxlIHdyaXRpbmcgIiArIG15RmlsZTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGlvZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHdoaWxlIHdyaXRpbmcgIiArIG15RmlsZSwgaW9lKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChudWxsICE9IG91dHB1dCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coImVycm9yIGNsb3Npbmcgb3V0cHV0IHN0cmVhbSAiICsgaW9lLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG15RmlsZSA9IHNhdmVkRmlsZTsKICAgICAgICAgfQogCkBAIC0xMTIsNyArOTUsNiBAQAogICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoYnVpbGROdW1iZXIpKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIHJldHJpZXZlIGJ1aWxkIG51bWJlciBmcm9tIHByb3BlcnRpZXMgb2JqZWN0LgogICAgICAqCkBAIC0xMjksNDMgKzExMSwyOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoYnVpbGROdW1iZXIpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgbXlGaWxlICsgIiBjb250YWlucyBhIG5vbiBpbnRlZ2VyIGJ1aWxkIG51bWJlcjogIiArIGJ1aWxkTnVtYmVyOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIG5mZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgbXlGaWxlICsgIiBjb250YWlucyBhIG5vbiBpbnRlZ2VyIGJ1aWxkIG51bWJlcjogIiArIGJ1aWxkTnVtYmVyLAorICAgICAgICAgICAgICAgIG5mZSk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIGxvYWQgcHJvcGVydGllcyBmcm9tIGZpbGUuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBsb2FkZWQgcHJvcGVydGllcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KLSAgICBwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoKQotICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQotICAgICAgICB0cnkgeworICAgIHByaXZhdGUgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5wdXQgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShteUZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0gICAgICAgICAgICBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obXlGaWxlKTsKICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChpbnB1dCk7CiAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllczsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChudWxsICE9IGlucHV0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJlcnJvciBjbG9zaW5nIGlucHV0IHN0cmVhbSAiICsgaW9lLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGUgdGhhdCB0aGUgdGFzayBwYXJhbWV0ZXJzIGFyZSB2YWxpZC4KICAgICAgKgpAQCAtMTgxLDIxICsxNDgsMTggQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVOZXdGaWxlKG15RmlsZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgIG15RmlsZSArICIgZG9lc24ndCBleGlzdCBhbmQgbmV3IGZpbGUgY2FuJ3QgYmUgY3JlYXRlZC4iOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBpb2UpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbXlGaWxlICsgIiBkb2Vzbid0IGV4aXN0IGFuZCBuZXcgZmlsZSBjYW4ndCBiZSBjcmVhdGVkLiIsCisgICAgICAgICAgICAgICAgICAgIGlvZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW15RmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byByZWFkIGZyb20gIiArIG15RmlsZSArICIuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgZnJvbSAiICsgbXlGaWxlICsgIi4iKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbXlGaWxlLmNhbldyaXRlKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuYWJsZSB0byB3cml0ZSB0byAiICsgbXlGaWxlICsgIi4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgdG8gIiArIG15RmlsZSArICIuIik7CiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NWU1Bhc3MuamF2YQppbmRleCAxZDNhZDgzLi41YzU4ZTAzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ1ZTUGFzcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIEFkZHMgYW4gbmV3IGVudHJ5IHRvIGEgQ1ZTIHBhc3N3b3JkIGZpbGUuCkBAIC04Miw2ICs4MSw3IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjdnNSb290ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY3Zzcm9vdCBpcyByZXF1aXJlZCIpOwpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwogICAgICAgICBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBudWxsOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogICAgICAgICAgICAgaWYgKHBhc3NGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHBhc3NGaWxlKSk7CkBAIC0xMDYsNyArMTA2LDcgQEAKIAogICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKGN2c1Jvb3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGxpbmUpLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGxpbmUpLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NhbGxUYXJnZXQuamF2YQppbmRleCBkOGEwZThjLi4wMTc0OTBkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2FsbFRhcmdldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUHJvcGVydHlTZXQ7CiAKQEAgLTk5LDcgKzEwMCw3IEBACiAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZSB0YXJnZXQgb3IgYXQgbGVhc3Qgb25lIG5lc3RlZCB0YXJnZXQgaXMgcmVxdWlyZWQuIiwKICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgY2FsbGVlLnNldEFudGZpbGUoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZSIpKTsKKyAgICAgICAgY2FsbGVlLnNldEFudGZpbGUoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUpKTsKICAgICAgICAgY2FsbGVlLnNldEluaGVyaXRBbGwoaW5oZXJpdEFsbCk7CiAgICAgICAgIGNhbGxlZS5zZXRJbmhlcml0UmVmcyhpbmhlcml0UmVmcyk7CiAgICAgICAgIGNhbGxlZS5leGVjdXRlKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2hlY2tzdW0uamF2YQppbmRleCBmZjk1ZGFjLi4yZmFmOTJlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NoZWNrc3VtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMCArMTksMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5EaWdlc3RJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CkBAIC00Nyw3ICs0OCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlVuaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFVzZWQgdG8gY3JlYXRlIG9yIHZlcmlmeSBmaWxlIGNoZWNrc3Vtcy4KQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgICAgICAgIHN1cGVyLmFkZCh1KTsKICAgICAgICAgICAgIHN1cGVyLmFkZChUeXBlLkZJTEUpOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CiAgICAgICAgICAgICB1LmFkZChyYyk7CiAgICAgICAgIH0KQEAgLTEwOSwxNCArMTEwLDE0IEBACiAgICAgICogS2V5OiAgIGphdmEudXRpbC5GaWxlIChzb3VyY2UgZmlsZSkKICAgICAgKiBWYWx1ZTogamF2YS5sYW5nLlN0cmluZyAoZGlnZXN0KQogICAgICAqLwotICAgIHByaXZhdGUgTWFwPEZpbGUsIGJ5dGVbXT4gYWxsRGlnZXN0cyA9IG5ldyBIYXNoTWFwPEZpbGUsIGJ5dGVbXT4oKTsKKyAgICBwcml2YXRlIE1hcDxGaWxlLCBieXRlW10+IGFsbERpZ2VzdHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgLyoqCiAgICAgICogSG9sZHMgcmVsYXRpdmUgZmlsZSBuYW1lcyBmb3IgYWxsIGZpbGVzIChhbHdheXMgd2l0aCBhIGZvcndhcmQgc2xhc2gpLgogICAgICAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHRvdGFsIGhhc2guCiAgICAgICogS2V5OiAgIGphdmEudXRpbC5GaWxlIChzb3VyY2UgZmlsZSkKICAgICAgKiBWYWx1ZTogamF2YS5sYW5nLlN0cmluZyAocmVsYXRpdmUgZmlsZSBuYW1lKQogICAgICAqLwotICAgIHByaXZhdGUgTWFwPEZpbGUsIFN0cmluZz4gcmVsYXRpdmVGaWxlUGF0aHMgPSBuZXcgSGFzaE1hcDxGaWxlLCBTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBNYXA8RmlsZSwgU3RyaW5nPiByZWxhdGl2ZUZpbGVQYXRocyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAvKioKICAgICAgKiBQcm9wZXJ0eSB3aGVyZSB0b3RhbENoZWNrc3VtIGdldHMgc2V0LgogICAgICAqLwpAQCAtMTM3LDcgKzEzOCw3IEBACiAgICAgLyoqCiAgICAgICogU3RvcmVzIFNvdXJjZUZpbGUsIERlc3RGaWxlIHBhaXJzIGFuZCBTb3VyY2VGaWxlLCBQcm9wZXJ0eSBTdHJpbmcgcGFpcnMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGU8RmlsZSwgT2JqZWN0PiBpbmNsdWRlRmlsZU1hcCA9IG5ldyBIYXNodGFibGU8RmlsZSwgT2JqZWN0PigpOworICAgIHByaXZhdGUgSGFzaHRhYmxlPEZpbGUsIE9iamVjdD4gaW5jbHVkZUZpbGVNYXAgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICAvKioKICAgICAgKiBNZXNzYWdlIERpZ2VzdCBpbnN0YW5jZQogICAgICAqLwpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgcHJpdmF0ZSBpbnQgcmVhZEJ1ZmZlclNpemUgPSBCVUZGRVJfU0laRTsKIAogICAgIC8qKgotICAgICAqIEZvcm1hdGVyIGZvciB0aGUgY2hlY2tzdW0gZmlsZS4KKyAgICAgKiBGb3JtYXR0ZXIgZm9yIHRoZSBjaGVja3N1bSBmaWxlLgogICAgICAqLwogICAgIHByaXZhdGUgTWVzc2FnZUZvcm1hdCBmb3JtYXQgPSBGb3JtYXRFbGVtZW50LmdldERlZmF1bHQoKS5nZXRGb3JtYXQoKTsKIApAQCAtMjYxLDEyICsyNjIsMTIgQEAKICAgICAgKiBTcGVjaWZ5IHRoZSBwYXR0ZXJuIHRvIHVzZSBhcyBhIE1lc3NhZ2VGb3JtYXQgcGF0dGVybi4KICAgICAgKgogICAgICAqIDxwPnswfSBnZXRzIHJlcGxhY2VkIGJ5IHRoZSBjaGVja3N1bSwgezF9IGJ5IHRoZSBmaWxlbmFtZS48L3A+Ci0gICAgICogQHBhcmFtIHAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCisgICAgICogQHBhcmFtIHBhdHRlcm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCiAgICAgICoKICAgICAgKiBAc2luY2UgMS43LjAKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwKSB7Ci0gICAgICAgIGZvcm1hdCA9IG5ldyBNZXNzYWdlRm9ybWF0KHApOworICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgZm9ybWF0ID0gbmV3IE1lc3NhZ2VGb3JtYXQocGF0dGVybik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yOTMsMTMgKzI5NCwxMyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0ocykuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpc0NvbmRpdGlvbiA9IGZhbHNlOwogICAgICAgICBib29sZWFuIHZhbHVlID0gdmFsaWRhdGVBbmRFeGVjdXRlKCk7CiAgICAgICAgIGlmICh2ZXJpZnlQcm9wZXJ0eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkoCi0gICAgICAgICAgICAgICAgdmVyaWZ5UHJvcGVydHksCi0gICAgICAgICAgICAgICAgKHZhbHVlID8gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkgOiBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eSh2ZXJpZnlQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxMCw2ICszMTEsNyBAQAogICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlzQ29uZGl0aW9uID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHZhbGlkYXRlQW5kRXhlY3V0ZSgpOwpAQCAtMzI1LDcgKzMyNyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZSAtIGEgZmlsZSBvciBhIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCEocmVzb3VyY2VzID09IG51bGwgfHwgcmVzb3VyY2VzLmlzRmlsZXN5c3RlbU9ubHkoKSkpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsICYmICFyZXNvdXJjZXMuaXNGaWxlc3lzdGVtT25seSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbiBvbmx5IGNhbGN1bGF0ZSBjaGVja3N1bXMgZm9yIGZpbGUtYmFzZWQgcmVzb3VyY2VzLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKQEAgLTM2OCwxMCArMzcwLDggQEAKICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtLCBwcm92aWRlcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gbm9hbGdvKSB7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gfCBOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBub2FsZ28pIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obm9hbGdvLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIG5vcHJvdmlkZXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obm9wcm92aWRlciwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzg1LDE0ICszODUsMTMgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoZmlsZWV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICBmaWxlZXh0ID0gIi4iICsgYWxnb3JpdGhtOwotICAgICAgICB9IGVsc2UgaWYgKGZpbGVleHQudHJpbSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgfSBlbHNlIGlmIChmaWxlZXh0LnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBleHRlbnNpb24gd2hlbiBzcGVjaWZpZWQgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nIik7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgciA6IHJlc291cmNlcykgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHNyYyA9IHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBzcmMgPSByLmFzKEZpbGVQcm92aWRlci5jbGFzcykuZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAodG90YWxwcm9wZXJ0eSAhPSBudWxsIHx8IHRvZGlyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSAnLycgdG8gY2FsY3VsYXRlIGRpZ2VzdCBiYXNlZCBvbiBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIGdldCB0aGUgc2FtZSByZXN1bHQKQEAgLTQ2Miw4ICs0NjEsNyBAQAogICAgICAgICAgICAgLy8gVGhpcyBkaXJlY3Rvcnkgd2lsbCBleGlzdAogICAgICAgICAgICAgZGlyZWN0b3J5ID0gZmlsZS5nZXRQYXJlbnRGaWxlKCk7CiAgICAgICAgIH0KLSAgICAgICAgRmlsZSBjaGVja3N1bUZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGUuZ2V0TmFtZSgpICsgZmlsZWV4dCk7Ci0gICAgICAgIHJldHVybiBjaGVja3N1bUZpbGU7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXJlY3RvcnksIGZpbGUuZ2V0TmFtZSgpICsgZmlsZWV4dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NzEsOCArNDY5LDggQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZ2VuZXJhdGVDaGVja3N1bXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBib29sZWFuIGNoZWNrc3VtTWF0Y2hlcyA9IHRydWU7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIElucHV0U3RyZWFtIGZpcyA9IG51bGw7CisgICAgICAgIE91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbcmVhZEJ1ZmZlclNpemVdOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RmlsZSwgT2JqZWN0PiBlIDogaW5jbHVkZUZpbGVNYXAuZW50cnlTZXQoKSkgewpAQCAtNDgxLDcgKzQ3OSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbmRpdGlvbikgewogICAgICAgICAgICAgICAgICAgICBsb2coIkNhbGN1bGF0aW5nICIgKyBhbGdvcml0aG0gKyAiIGNoZWNrc3VtIGZvciAiICsgc3JjLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOworICAgICAgICAgICAgICAgIGZpcyA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKHNyYy50b1BhdGgoKSk7CiAgICAgICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gZGlzID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGZpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCk7CiAgICAgICAgICAgICAgICAgd2hpbGUgKGRpcy5yZWFkKGJ1ZiwgMCwgcmVhZEJ1ZmZlclNpemUpICE9IC0xKSB7CkBAIC00OTcsNyArNDk1LDcgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgY2hlY2tzdW0gPSBjcmVhdGVEaWdlc3RTdHJpbmcoZmlsZURpZ2VzdCk7CiAgICAgICAgICAgICAgICAgLy9jYW4gZWl0aGVyIGJlIGEgcHJvcGVydHkgbmFtZSBzdHJpbmcgb3IgYSBmaWxlCiAgICAgICAgICAgICAgICAgT2JqZWN0IGRlc3RpbmF0aW9uID0gZS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdHJpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3AgPSAoU3RyaW5nKSBkZXN0aW5hdGlvbjsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bU1hdGNoZXMKQEAgLTUwNSw3ICs1MDMsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3AsIGNoZWNrc3VtKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBqYXZhLmlvLkZpbGUpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uIGluc3RhbmNlb2YgRmlsZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb25kaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZXhpc3RpbmdGaWxlID0gKEZpbGUpIGRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nRmlsZS5leGlzdHMoKSkgewpAQCAtNTIzLDcgKzUyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSAoRmlsZSkgZGVzdGluYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcyA9IEZpbGVzLm5ld091dHB1dFN0cmVhbShkZXN0LnRvUGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcy53cml0ZShmb3JtYXQuZm9ybWF0KG5ldyBPYmplY3RbXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmdldE5hbWUoKSwKQEAgLTUzNyw3ICs1MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZ2V0QWJzb2x1dGVQYXRoKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKFN0cmluZ1V0aWxzLkxJTkVfU0VQLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU0OSwxNCArNTQ3LDkgQEAKICAgICAgICAgICAgICAgICBGaWxlW10ga2V5QXJyYXkgPSBhbGxEaWdlc3RzLmtleVNldCgpLnRvQXJyYXkobmV3IEZpbGVbYWxsRGlnZXN0cy5zaXplKCldKTsKICAgICAgICAgICAgICAgICAvLyBGaWxlIGlzIENvbXBhcmFibGUsIGJ1dCBzb3J0LW9yZGVyIGlzIHBsYXRmb3JtCiAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW50IChjYXNlLWluc2Vuc2l0aXZlIG9uIFdpbmRvd3MpCi0gICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoa2V5QXJyYXksIG5ldyBDb21wYXJhdG9yPEZpbGU+KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKEZpbGUgZjEsIEZpbGUgZjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjEgPT0gbnVsbCA/IChmMiA9PSBudWxsID8gMCA6IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChmMiA9PSBudWxsID8gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFJlbGF0aXZlRmlsZVBhdGgoZjEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYXJlVG8oZ2V0UmVsYXRpdmVGaWxlUGF0aChmMikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgQXJyYXlzLnNvcnQoa2V5QXJyYXksIENvbXBhcmF0b3IubnVsbHNGaXJzdCgKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyYXRvci5jb21wYXJpbmcodGhpczo6Z2V0UmVsYXRpdmVGaWxlUGF0aCkpKTsKKwogICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciB0aGUgY2hlY2tzdW1zIGFuZCBnZW5lcmF0ZSBhIHRvdGFsIGhhc2guCiAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdC5yZXNldCgpOwogICAgICAgICAgICAgICAgIGZvciAoRmlsZSBzcmMgOiBrZXlBcnJheSkgewpAQCAtNTgzLDExICs1NzYsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZURpZ2VzdFN0cmluZyhieXRlW10gZmlsZURpZ2VzdCkgewogICAgICAgICBTdHJpbmdCdWlsZGVyIGNoZWNrc3VtU2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGJ5dGUgZGlnZXN0Qnl0ZSA6IGZpbGVEaWdlc3QpIHsKLSAgICAgICAgICAgIFN0cmluZyBoZXhTdHIgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKEJZVEVfTUFTSyAmIGRpZ2VzdEJ5dGUpOwotICAgICAgICAgICAgaWYgKGhleFN0ci5sZW5ndGgoKSA8IDIpIHsKLSAgICAgICAgICAgICAgICBjaGVja3N1bVNiLmFwcGVuZCgiMCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tzdW1TYi5hcHBlbmQoaGV4U3RyKTsKKyAgICAgICAgICAgIGNoZWNrc3VtU2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMngiLCBCWVRFX01BU0sgJiBkaWdlc3RCeXRlKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNoZWNrc3VtU2IudG9TdHJpbmcoKTsKICAgICB9CkBAIC02MTYsNyArNjA1LDcgQEAKICAgICAgICAgLy8gdHdvIGNoYXJhY3RlcnMgZm9ybSB0aGUgaGV4IHZhbHVlLgogICAgICAgICBmb3IgKGludCBpID0gMCwgaiA9IDA7IGogPCBsOyBpKyspIHsKICAgICAgICAgICAgIGludCBmID0gQ2hhcmFjdGVyLmRpZ2l0KGRhdGFbaisrXSwgV09SRCkgPDwgTklCQkxFOwotICAgICAgICAgICAgZiA9IGYgfCBDaGFyYWN0ZXIuZGlnaXQoZGF0YVtqKytdLCBXT1JEKTsKKyAgICAgICAgICAgIGYgfD0gQ2hhcmFjdGVyLmRpZ2l0KGRhdGFbaisrXSwgV09SRCk7CiAgICAgICAgICAgICBvdXRbaV0gPSAoYnl0ZSkgKGYgJiBCWVRFX01BU0spOwogICAgICAgICB9CiAKQEAgLTYyOSwyMCArNjE4LDE1IEBACiAgICAgICogQHNpbmNlIDEuNwogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIHJlYWRDaGVja3N1bShGaWxlIGYpIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgZGlza0NoZWNrc3VtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRpc2tDaGVja3N1bVJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgZGlza0NoZWNrc3VtUmVhZGVyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSkpIHsKICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IGZvcm1hdC5wYXJzZShkaXNrQ2hlY2tzdW1SZWFkZXIucmVhZExpbmUoKSk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwgfHwgcmVzdWx0Lmxlbmd0aCA9PSAwIHx8IHJlc3VsdFswXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmYWlsZWQgdG8gZmluZCBhIGNoZWNrc3VtIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcmVzdWx0WzBdOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgUGFyc2VFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZG4ndCByZWFkIGNoZWNrc3VtIGZpbGUgIiArIGYsIGUpOwotICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWQgY2hlY2tzdW0gZmlsZSAiICsgZiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZGlza0NoZWNrc3VtUmVhZGVyKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjUwLDEzICs2MzQsMTIgQEAKICAgICAgKiBAc2luY2UgQW50IDEuOC4yCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlUGF0aChGaWxlIGYpIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSAoU3RyaW5nKSByZWxhdGl2ZUZpbGVQYXRocy5nZXQoZik7CisgICAgICAgIFN0cmluZyBwYXRoID0gcmVsYXRpdmVGaWxlUGF0aHMuZ2V0KGYpOwogICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICAvL2J1ZyAzNzM4Ni4gdGhpcyBzaG91bGQgbm90IG9jY3VyLCBidXQgaXQgaGFzLCBvbmNlLgotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnRlcm5hbCBlcnJvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlbGF0aXZlRmlsZVBhdGhzIGNvdWxkIG5vdCBtYXRjaCBmaWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYgKyAiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IG9uIHRoaXMiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSW50ZXJuYWwgZXJyb3I6IHJlbGF0aXZlRmlsZVBhdGhzIGNvdWxkIG5vdCBtYXRjaCBmaWxlICVzXG5wbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgb24gdGhpcyIsCisgICAgICAgICAgICAgICAgZik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgfQpAQCAtNjY3LDcgKzY1MCw3IEBACiAgICAgICogQHNpbmNlIDEuNwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybWF0RWxlbWVudCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUZvcm1hdD4gZm9ybWF0TWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXNzYWdlRm9ybWF0PigpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgTWVzc2FnZUZvcm1hdD4gZm9ybWF0TWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hFQ0tTVU0gPSAiQ0hFQ0tTVU0iOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUQ1U1VNID0gIk1ENVNVTSI7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVkYgPSAiU1ZGIjsKQEAgLTY3OCwxMSArNjYxLDYgQEAKICAgICAgICAgICAgIGZvcm1hdE1hcC5wdXQoU1ZGLCBuZXcgTWVzc2FnZUZvcm1hdCgiTUQ1ICh7MX0pID0gezB9IikpOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciBGb3JtYXRFbGVtZW50ICovCi0gICAgICAgIHB1YmxpYyBGb3JtYXRFbGVtZW50KCkgewotICAgICAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXQgdGhlIGRlZmF1bHQgdmFsdWUgLSBDSEVDS1NVTS4KICAgICAgICAgICogQHJldHVybiB0aGUgZGVmYXVsIHZhbHVlLgpAQCAtNjk4LDEzICs2NzYsMTQgQEAKICAgICAgICAgICogQHJldHVybiBhIDxjb2RlPk1lc3NhZ2VGb3JtYXQ8L2NvZGU+IG9iamVjdC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBNZXNzYWdlRm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVzc2FnZUZvcm1hdCkgZm9ybWF0TWFwLmdldChnZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXRNYXAuZ2V0KGdldFZhbHVlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzLgogICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHZhbHVlcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Q0hFQ0tTVU0sIE1ENVNVTSwgU1ZGfTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2htb2QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NobW9kLmphdmEKaW5kZXggYWMwYzNkOC4uNDk3MWI3YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2htb2QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaG1vZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTgsNiArNTgsNyBAQAogICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBwcm9qZWN0IGZvciB0aGlzIHRhc2suCiAgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50I3NldFByb2plY3QKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewogICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOwogICAgICAgICBkZWZhdWx0U2V0LnNldFByb2plY3QocHJvamVjdCk7CkBAIC03Nyw2ICs3OCw3IEBACiAgICAgICogVGhlIGRpcmVjdG9yeSB3aGljaCBob2xkcyB0aGUgZmlsZXMgd2hvc2UgcGVybWlzc2lvbnMgbXVzdCBiZSBjaGFuZ2VkLgogICAgICAqIEBwYXJhbSBzcmMgdGhlIGRpcmVjdG9yeS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREaXIoRmlsZSBzcmMpIHsKICAgICAgICAgZGVmYXVsdFNldC5zZXREaXIoc3JjKTsKICAgICB9CkBAIC0xNTQsNiArMTU2LDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgYXR0cmlidXRlcyBhbmQgbmVzdGVkIGVsZW1lbnRzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgaWYgKCFoYXZlUGVybSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhdHRyaWJ1dGUgcGVybSBub3Qgc2V0IGluIGNobW9kIiwKQEAgLTE3MCw2ICsxNzMsNyBAQAogICAgICAqIENhcnJ5IG91dCB0aGUgY2htb2RpbmcuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLyoKICAgICAgICAgICogSW4gQW50IDEuMSwgPGNobW9kIGRpcj0iZm9vIiAvPiBtZWFucywgY2hhbmdlIHRoZSBwZXJtaXNzaW9ucwpAQCAtMTg2LDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRPcygpKSB7Ci0gICAgICAgICAgICAvLyB3ZSBhcmUgY2htb2RkaW5nIHRoZSBnaXZlbiBkaXJlY3RvcnkKKyAgICAgICAgICAgIC8vIHdlIGFyZSBjaG1vZGluZyB0aGUgZ2l2ZW4gZGlyZWN0b3J5CiAgICAgICAgICAgICBFeGVjdXRlIGV4ZWN1dGUgPSBwcmVwYXJlRXhlYygpOwogICAgICAgICAgICAgQ29tbWFuZGxpbmUgY2xvbmVkID0gKENvbW1hbmRsaW5lKSBjbWRsLmNsb25lKCk7CiAgICAgICAgICAgICBjbG9uZWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShkZWZhdWx0U2V0LmdldERpcihnZXRQcm9qZWN0KCkpCkBAIC0yMTAsNiArMjE0LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KICAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZSkgewogICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKQogICAgICAgICAgICAgKyAiIGRvZXNuXCd0IHN1cHBvcnQgdGhlIGV4ZWN1dGFibGUgYXR0cmlidXRlIiwgZ2V0TG9jYXRpb24oKSk7CkBAIC0yMjIsNiArMjI3LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KICAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChDb21tYW5kbGluZSBjbWRsKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgY29tbWFuZCBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKQEAgLTIzMyw2ICsyMzksNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWx3YXlzLgogICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTa2lwRW1wdHlGaWxlc2V0cyhib29sZWFuIHNraXApIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKICAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBza2lwZW1wdHlmaWxlc2V0IGF0dHJpYnV0ZSIsIGdldExvY2F0aW9uKCkpOwpAQCAtMjQ0LDYgKzI1MSw3IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMuCiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkZHNvdXJjZWZpbGUoYm9vbGVhbiBiKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgYWRkc291cmNlZmlsZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKQEAgLTI1NCw2ICsyNjIsNyBAQAogICAgICAqIEFsd2F5cyBpbmNsdWRlIHVuaXguCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcyBpcyB2YWxpZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkT3MoKSB7CiAgICAgICAgIHJldHVybiBnZXRPcygpID09IG51bGwgJiYgZ2V0T3NGYW1pbHkoKSA9PSBudWxsCiAgICAgICAgICAgICA/IE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9VTklYKSA6IHN1cGVyLmlzVmFsaWRPcygpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2xhc3Nsb2FkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NsYXNzbG9hZGVyLmphdmEKaW5kZXggYTdiOTY5MS4uZmJlZGYzNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2xhc3Nsb2FkZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DbGFzc2xvYWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzAsMTIgKzcwLDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gcGFyZW50Rmlyc3QgPSB0cnVlOwogICAgIHByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWUgPSBudWxsOwogCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAqLwotICAgIHB1YmxpYyBDbGFzc2xvYWRlcigpIHsKLSAgICB9Ci0KICAgICAvKiogTmFtZSBvZiB0aGUgbG9hZGVyLiBJZiBub25lLCB0aGUgZGVmYXVsdCBsb2FkZXIgd2lsbCBiZSBtb2RpZmllZAogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhpcyBsb2FkZXIKQEAgLTEwMSw2ICs5NSw3IEBACiAgICAgICogQHBhcmFtIGIgaWYgdHJ1ZSByZXZlcnNlIHRoZSBub3JtYWwgY2xhc3Nsb2FkZXIgbG9va3VwLgogICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRQYXJlbnRGaXJzdCB3aXRoIGEgbmVnYXRlZCBhcmd1bWVudCBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRSZXZlcnNlKGJvb2xlYW4gYikgewogICAgICAgICB0aGlzLnBhcmVudEZpcnN0ID0gIWI7CiAgICAgfQpAQCAtMTI5LDcgKzEyNCw3IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NwYXRoUmVmKFJlZmVyZW5jZSBwYXRoUmVmKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBjbGFzc3BhdGggPSAoUGF0aCkgcGF0aFJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGNsYXNzcGF0aCA9IHBhdGhSZWYuZ2V0UmVmZXJlbmNlZE9iamVjdChnZXRQcm9qZWN0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU2LDE3ICsxNTEsMTcgQEAKICAgICAgICAgcmV0dXJuIHRoaXMuY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGRvIHRoZSBjbGFzc2xvYWRlciBtYW5pcHVsYXRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIEd1bXAgZnJpZW5kbHkgLSBkb24ndCBtZXNzIHdpdGggdGhlIGNvcmUgbG9hZGVyIGlmIG9ubHkgY2xhc3NwYXRoCi0gICAgICAgICAgICBpZiAoIm9ubHkiLmVxdWFscyhnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImJ1aWxkLnN5c2NsYXNzcGF0aCIpKQorICAgICAgICAgICAgaWYgKCJvbmx5Ii5lcXVhbHMoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRIKSkKICAgICAgICAgICAgICAgICAmJiAobmFtZSA9PSBudWxsIHx8IFNZU1RFTV9MT0FERVJfUkVGLmVxdWFscyhuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkNoYW5naW5nIHRoZSBzeXN0ZW0gbG9hZGVyIGlzIGRpc2FibGVkICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYnkgYnVpbGQuc3lzY2xhc3NwYXRoPW9ubHkiLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBsb2coIkNoYW5naW5nIHRoZSBzeXN0ZW0gbG9hZGVyIGlzIGRpc2FibGVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgTWFnaWNOYW1lcy5CVUlMRF9TWVNDTEFTU1BBVEggKyAiPW9ubHkiLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKQEAgLTE4Niw2ICsxODEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGFjbCA9IChBbnRDbGFzc0xvYWRlcikgb2JqOwogICAgICAgICAgICAgYm9vbGVhbiBleGlzdGluZ0xvYWRlciA9IGFjbCAhPSBudWxsOwogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DbG9zZVJlc291cmNlcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2xvc2VSZXNvdXJjZXMuamF2YQppbmRleCA2OTE2YWJjLi4xYWFjMmVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DbG9zZVJlc291cmNlcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Nsb3NlUmVzb3VyY2VzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db21tYW5kTGF1bmNoZXJUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db21tYW5kTGF1bmNoZXJUYXNrLmphdmEKaW5kZXggMWUxYmY5NC4uMzVhYmFmYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tbWFuZExhdW5jaGVyVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbW1hbmRMYXVuY2hlclRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbXBvbmVudGRlZi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tcG9uZW50ZGVmLmphdmEKaW5kZXggMWM1NTkwYy4uZTkwYjk4MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tcG9uZW50ZGVmLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29tcG9uZW50ZGVmLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25jYXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdC5qYXZhCmluZGV4IGEwOTVhNGUuLjMzM2JhZDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNiBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTI3LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKQEAgLTU3LDcgKzU3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlYWRlcklucHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlICdjb25jYXQnIHRhc2ssIHVzZWQgdG8gY29uY2F0ZW5hdGUgYSBzZXJpZXMKQEAgLTEzMCw3ICsxMjksNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vIG5vbi1leGlzdGluZyBmaWxlcyBhcmUgbm90IGFsbG93ZWQKICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAiICsgZmlsZSArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICVzIGRvZXMgbm90IGV4aXN0LiIsIGZpbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwpAQCAtMTM5LDcgKzEzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmNvZGluZykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB2YWx1ZSA9IEZpbGVVdGlscy5zYWZlUmVhZEZ1bGx5KHJlYWRlcik7CkBAIC0xODEsNyArMTgwLDcgQEAKICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHZhbHVlLnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyaW1MZWFkaW5nKSB7CkBAIC0yMTQsNyArMjEzLDcgQEAKIAogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgcmVhZHMgZnJvbSBlYWNoIG9mIHRoZSBzb3VyY2UgZmlsZXMgaW4gdHVybi4KLSAgICAgKiBUaGUgY29uY2F0ZW50YXRlZCByZXN1bHQgY2FuIHRoZW4gYmUgZmlsdGVyZWQgYXMKKyAgICAgKiBUaGUgY29uY2F0ZW5hdGVkIHJlc3VsdCBjYW4gdGhlbiBiZSBmaWx0ZXJlZCBhcwogICAgICAqIGEgc2luZ2xlIHN0cmVhbS4KICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE11bHRpUmVhZGVyPFM+IGV4dGVuZHMgUmVhZGVyIHsKQEAgLTI1MCw2ICsyNDksNyBAQAogICAgICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIC0gcG9zc2libHkgdGhyb3duIGJ5IHRoZSByZWFkIGZvciBhIHJlYWRlcgogICAgICAgICAgKiAgICAgICAgICAgIG9iamVjdC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaWYgKG5lZWRBZGRTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgICBpZiAobGFzdFBvcyA+PSBlb2xTdHJpbmcubGVuZ3RoKCkpIHsKQEAgLTI4NCw2ICsyODQsNyBAQAogICAgICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIC0gcG9zc2libHkgdGhyb3duIGJ5IHRoZSByZWFkcyB0byB0aGUKICAgICAgICAgICogICAgICAgICAgICByZWFkZXIgb2JqZWN0cy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pCiAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCkBAIC0zMzEsMTQgKzMzMiwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFtb3VudFJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFtb3VudFJlYWQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYW1vdW50UmVhZDsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDbG9zZSB0aGUgY3VycmVudCByZWFkZXIKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKQEAgLTM1MCw5ICszNTEsNyBAQAogICAgICAgICAgKiBhZGQgYSBjaGFyYWN0ZXIgdG8gdGhlIGxhc3RjaGFycyBidWZmZXIKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgdm9pZCBhZGRMYXN0Q2hhcihjaGFyIGNoKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbGFzdENoYXJzLmxlbmd0aCAtIDI7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgICAgICAgICAgbGFzdENoYXJzW2ldID0gbGFzdENoYXJzW2kgKyAxXTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobGFzdENoYXJzLCAxLCBsYXN0Q2hhcnMsIDAsIGxhc3RDaGFycy5sZW5ndGggLSAyICsgMSk7CiAgICAgICAgICAgICBsYXN0Q2hhcnNbbGFzdENoYXJzLmxlbmd0aCAtIDFdID0gY2g7CiAgICAgICAgIH0KIApAQCAtMzgwLDYgKzM3OSw3IEBACiAgICAgICAgIHByaXZhdGUgQ29uY2F0UmVzb3VyY2UoUmVzb3VyY2VDb2xsZWN0aW9uIGMpIHsKICAgICAgICAgICAgIHRoaXMuYyA9IGM7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKICAgICAgICAgICAgIGlmIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtKGMpOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFJlYWRlciByZXNvdXJjZVJlYWRlciA9IGdldEZpbHRlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICBuZXcgTXVsdGlSZWFkZXI8UmVzb3VyY2U+KGMuaXRlcmF0b3IoKSwgcmVzb3VyY2VSZWFkZXJGYWN0b3J5KSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBNdWx0aVJlYWRlcjw+KGMuaXRlcmF0b3IoKSwgcmVzb3VyY2VSZWFkZXJGYWN0b3J5KSk7CiAgICAgICAgICAgICBSZWFkZXIgcmRyOwogICAgICAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsICYmIGZvb3RlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmRyID0gcmVzb3VyY2VSZWFkZXI7CkBAIC00MTUsMTIgKzQxNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyc1twb3NdID0gZ2V0RmlsdGVyZWRSZWFkZXIocmVhZGVyc1twb3NdKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZHIgPSBuZXcgTXVsdGlSZWFkZXI8UmVhZGVyPihBcnJheXMuYXNMaXN0KHJlYWRlcnMpLml0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgcmRyID0gbmV3IE11bHRpUmVhZGVyPD4oQXJyYXlzLmFzTGlzdChyZWFkZXJzKS5pdGVyYXRvcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHlSZWFkZXJGYWN0b3J5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBvdXRwdXRFbmNvZGluZyA9PSBudWxsID8gbmV3IFJlYWRlcklucHV0U3RyZWFtKHJkcikKICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVhZGVySW5wdXRTdHJlYW0ocmRyLCBvdXRwdXRFbmNvZGluZyk7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU5hbWUgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICA/ICJjb25jYXQgKCIgKyBTdHJpbmcudmFsdWVPZihjKSArICIpIiA6IHJlc291cmNlTmFtZTsKQEAgLTQ4OSw2ICs0OTAsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlTmFtZTsKIAogICAgIHByaXZhdGUgUmVhZGVyRmFjdG9yeTxSZXNvdXJjZT4gcmVzb3VyY2VSZWFkZXJGYWN0b3J5ID0gbmV3IFJlYWRlckZhY3Rvcnk8UmVzb3VyY2U+KCkgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoUmVzb3VyY2UgbykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gby5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihlbmNvZGluZyA9PSBudWxsCkBAIC00OTcsMTEgKzQ5OSw3IEBACiAgICAgICAgIH0KICAgICB9OwogCi0gICAgcHJpdmF0ZSBSZWFkZXJGYWN0b3J5PFJlYWRlcj4gaWRlbnRpdHlSZWFkZXJGYWN0b3J5ID0gbmV3IFJlYWRlckZhY3Rvcnk8UmVhZGVyPigpIHsKLSAgICAgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoUmVhZGVyIG8pIHsKLSAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICB9Ci0gICAgfTsKKyAgICBwcml2YXRlIFJlYWRlckZhY3Rvcnk8UmVhZGVyPiBpZGVudGl0eVJlYWRlckZhY3RvcnkgPSBvIC0+IG87CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgQ29uY2F0IHRhc2suCkBAIC01MjYsNyArNTI0LDcgQEAKICAgICAgICAgYmluYXJ5ID0gZmFsc2U7CiAgICAgICAgIG91dHB1dFdyaXRlciA9IG51bGw7CiAgICAgICAgIHRleHRCdWZmZXIgPSBudWxsOwotICAgICAgICBlb2xTdHJpbmcgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKKyAgICAgICAgZW9sU3RyaW5nID0gU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsKICAgICAgICAgcmMgPSBudWxsOwogICAgICAgICBpZ25vcmVFbXB0eSA9IHRydWU7CiAgICAgICAgIGZvcmNlID0gZmFsc2U7CkBAIC01OTEsNiArNTg5LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqIEBkZXByZWNhdGVkIHVzZSAjc2V0T3ZlcndyaXRlIGluc3RlYWQKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldEZvcmNlKGJvb2xlYW4gZm9yY2VPdmVyd3JpdGUpIHsKICAgICAgICAgdGhpcy5mb3JjZU92ZXJ3cml0ZSA9IGZvcmNlT3ZlcndyaXRlOwogICAgIH0KQEAgLTYyMiw3ICs2MjEsNyBAQAogICAgICAqIFNldHMgdGhlIGJlaGF2aW9yIHdoZW4gbm8gc291cmNlIHJlc291cmNlIGZpbGVzIGFyZSBhdmFpbGFibGUuIElmIHNldCB0bwogICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGUgZGVzdGluYXRpb24gZmlsZSB3aWxsIGFsd2F5cyBiZSBjcmVhdGVkLgogICAgICAqIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LgotICAgICAqIEBwYXJhbSBpZ25vcmVFbXB0eSBpZiBmYWxzZSBob25vdXIgZGVzdGluYXRpb25maWxlIGNyZWF0aW9uLgorICAgICAqIEBwYXJhbSBpZ25vcmVFbXB0eSBpZiBmYWxzZSwgaG9ub3VyIGRlc3RpbmF0aW9uIGZpbGUgY3JlYXRpb24uCiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUVtcHR5KGJvb2xlYW4gaWdub3JlRW1wdHkpIHsKQEAgLTY5MCwxNCArNjg5LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pIHsKICAgICAgICAgaWYgKGZpbHRlckNoYWlucyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yPEZpbHRlckNoYWluPigpOworICAgICAgICAgICAgZmlsdGVyQ2hhaW5zID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgICAgIH0KICAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZEVsZW1lbnQoZmlsdGVyQ2hhaW4pOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgbWV0aG9kIGFkZHMgdGV4dCB3aGljaCBhcHBlYXJzIGluIHRoZSAnY29uY2F0JyBlbGVtZW50LgotICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIGJlIGNvbmNhdGVkLgorICAgICAqIEBwYXJhbSB0ZXh0IHRoZSB0ZXh0IHRvIGJlIGNvbmNhdGVuYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7CiAgICAgICAgIGlmICh0ZXh0QnVmZmVyID09IG51bGwpIHsKQEAgLTc1MCwxMSArNzQ5LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RW9sKEZpeENSTEYuQ3JMZiBjcmxmKSB7CiAgICAgICAgIFN0cmluZyBzID0gY3JsZi5nZXRWYWx1ZSgpOwotICAgICAgICBpZiAocy5lcXVhbHMoImNyIikgfHwgcy5lcXVhbHMoIm1hYyIpKSB7CisgICAgICAgIGlmICgiY3IiLmVxdWFscyhzKSB8fCAibWFjIi5lcXVhbHMocykpIHsKICAgICAgICAgICAgIGVvbFN0cmluZyA9ICJcciI7Ci0gICAgICAgIH0gZWxzZSBpZiAocy5lcXVhbHMoImxmIikgfHwgcy5lcXVhbHMoInVuaXgiKSkgeworICAgICAgICB9IGVsc2UgaWYgKCJsZiIuZXF1YWxzKHMpIHx8ICJ1bml4Ii5lcXVhbHMocykpIHsKICAgICAgICAgICAgIGVvbFN0cmluZyA9ICJcbiI7Ci0gICAgICAgIH0gZWxzZSBpZiAocy5lcXVhbHMoImNybGYiKSB8fCBzLmVxdWFscygiZG9zIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICgiY3JsZiIuZXF1YWxzKHMpIHx8ICJkb3MiLmVxdWFscyhzKSkgewogICAgICAgICAgICAgZW9sU3RyaW5nID0gIlxyXG4iOwogICAgICAgICB9CiAgICAgfQpAQCAtNzgzLDYgKzc4Miw3IEBACiAgICAgLyoqCiAgICAgICogRXhlY3V0ZSB0aGUgY29uY2F0IHRhc2suCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKICAgICAgICAgaWYgKGJpbmFyeSAmJiBkZXN0ID09IG51bGwpIHsKQEAgLTc5NCw3ICs3OTQsNyBAQAogICAgICAgICAgICAgbG9nKGRlc3QgKyAiIGlzIHVwLXRvLWRhdGUuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGMuc2l6ZSgpID09IDAgJiYgaWdub3JlRW1wdHkpIHsKKyAgICAgICAgaWYgKGMuaXNFbXB0eSgpICYmIGlnbm9yZUVtcHR5KSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKQEAgLTgxMywxNSArODEzLDE5IEBACiAgICAgICogSW1wbGVtZW50IFJlc291cmNlQ29sbGVjdGlvbi4KICAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yJmx0O1Jlc291cmNlJmd0Oy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPFJlc291cmNlPnNpbmdsZXRvbkxpc3QobmV3IENvbmNhdFJlc291cmNlKGdldFJlc291cmNlcygpKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zCisgICAgICAgICAgICAuPFJlc291cmNlPiBzaW5nbGV0b25MaXN0KG5ldyBDb25jYXRSZXNvdXJjZShnZXRSZXNvdXJjZXMoKSkpCisgICAgICAgICAgICAuaXRlcmF0b3IoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBJbXBsZW1lbnQgUmVzb3VyY2VDb2xsZWN0aW9uLgogICAgICAqIEByZXR1cm4gMS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTgzMCw2ICs4MzQsNyBAQAogICAgICAqIEltcGxlbWVudCBSZXNvdXJjZUNvbGxlY3Rpb24uCiAgICAgICogQHJldHVybiBmYWxzZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtODUwLDggKzg1NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCB8fCBvdXRwdXRFbmNvZGluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBpbnB1dCBvciBvdXRwdXQgZW5jb2RpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggYmluYXJ5IgotICAgICAgICAgICAgICAgICAgICArICIgY29uY2F0ZW5hdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBpbnB1dCBvciBvdXRwdXQgZW5jb2RpbmcgaXMgaW5jb21wYXRpYmxlIHdpdGggYmluYXJ5IGNvbmNhdGVuYXRpb24iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKQEAgLTg5Nyw4ICs5MDEsOSBAQAogICAgICAgICAgICAgY2hlY2tEZXN0Tm90SW5Tb3VyY2VzLmFkZChyYyk7CiAgICAgICAgICAgICBjaGVja0Rlc3ROb3RJblNvdXJjZXMuYWRkKGRlc3QpOwogICAgICAgICAgICAgaWYgKGNoZWNrRGVzdE5vdEluU291cmNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiByZXNvdXJjZSAiICsgZGVzdAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBzcGVjaWZpZWQgYXMgYW4gaW5wdXQgcmVzb3VyY2UuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRGVzdGluYXRpb24gcmVzb3VyY2UgJXMgd2FzIHNwZWNpZmllZCBhcyBhbiBpbnB1dCByZXNvdXJjZS4iLAorICAgICAgICAgICAgICAgICAgICBkZXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBSZXN0cmljdCBub2V4aXN0UmMgPSBuZXcgUmVzdHJpY3QoKTsKQEAgLTkxNCwxNSArOTE5LDggQEAKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNVcFRvRGF0ZShSZXNvdXJjZUNvbGxlY3Rpb24gYykgewotICAgICAgICBpZiAoZGVzdCA9PSBudWxsIHx8IGZvcmNlT3ZlcndyaXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChSZXNvdXJjZSByIDogYykgewotICAgICAgICAgICAgaWYgKFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUociwgZGVzdCwgRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBkZXN0ICE9IG51bGwgJiYgIWZvcmNlT3ZlcndyaXRlCisgICAgICAgICAgICAgICAgJiYgYy5zdHJlYW0oKS5ub25lTWF0Y2gociAtPiBTZWxlY3RvclV0aWxzLmlzT3V0T2ZEYXRlKHIsIGRlc3QsIEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkzMiw3ICs5MzAsNyBAQAogICAgICAqIGZvciAmcXVvdDtpZ25vcmFibGUgd2hpdGVzcGFjZSZxdW90OyBhcyB3ZWxsLjwvcD4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2FuaXRpemVUZXh0KCkgewotICAgICAgICBpZiAodGV4dEJ1ZmZlciAhPSBudWxsICYmICIiLmVxdWFscyh0ZXh0QnVmZmVyLnRvU3RyaW5nKCkudHJpbSgpKSkgeworICAgICAgICBpZiAodGV4dEJ1ZmZlciAhPSBudWxsICYmIHRleHRCdWZmZXIudG9TdHJpbmcoKS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0ZXh0QnVmZmVyID0gbnVsbDsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRhc2suamF2YQppbmRleCA2MDkwNGUwLi43NGRkOWViIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTA3LDE2ICsxMDcsMTggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpID4gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBub3QgbmVzdCBtb3JlIHRoYW4gb25lIGNvbmRpdGlvbiBpbnRvIDwiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0VGFza05hbWUoKSArICI+Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIllvdSBtdXN0IG5vdCBuZXN0IG1vcmUgdGhhbiBvbmUgY29uZGl0aW9uIGludG8gPCVzPiIsCisgICAgICAgICAgICAgICAgZ2V0VGFza05hbWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNvdW50Q29uZGl0aW9ucygpIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBuZXN0IGEgY29uZGl0aW9uIGludG8gPCIgKyBnZXRUYXNrTmFtZSgpICsgIj4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvIDwlcz4iLAorICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIH0KLSAgICAgICAgQ29uZGl0aW9uIGMgPSAoQ29uZGl0aW9uKSBnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgQ29uZGl0aW9uIGMgPSBnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKTsKICAgICAgICAgaWYgKGMuZXZhbCgpKSB7CiAgICAgICAgICAgICBsb2coIkNvbmRpdGlvbiB0cnVlOyBzZXR0aW5nICIgKyBwcm9wZXJ0eSArICIgdG8gIiArIHZhbHVlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5LmphdmEKaW5kZXggMzcxYzM2Ni4uMDEzZjQ1OSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDExICsyMSwxMyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zOSw3ICs0MSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CkBAIC00OSw2ICs1MCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MaW5rZWRIYXNodGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZXNvdXJjZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU291cmNlRmlsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiA8cD5Db3BpZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBhIG5ldyBmaWxlCkBAIC02OSwxMyArNzEsMTQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1dIRU5fQ09QWUlOR19FTVBUWV9SQ19UT19GSUxFID0KICAgICAgICAgIkNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbiBmcm9tIGRpcmVjdG9yeSB0byBmaWxlLiI7CiAKKyAgICBARGVwcmVjYXRlZAorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKICAgICBzdGF0aWMgZmluYWwgRmlsZSBOVUxMX0ZJTEVfUExBQ0VIT0xERVIgPSBuZXcgRmlsZSgiL05VTExfRklMRSIpOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKICAgICBwcm90ZWN0ZWQgRmlsZSBmaWxlID0gbnVsbDsgICAgIC8vIHRoZSBzb3VyY2UgZmlsZQogICAgIHByb3RlY3RlZCBGaWxlIGRlc3RGaWxlID0gbnVsbDsgLy8gdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyID0gbnVsbDsgIC8vIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkKLSAgICBwcm90ZWN0ZWQgVmVjdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gcmNzID0gbmV3IFZlY3RvcjxSZXNvdXJjZUNvbGxlY3Rpb24+KCk7CisgICAgcHJvdGVjdGVkIFZlY3RvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IHJjcyA9IG5ldyBWZWN0b3I8PigpOwogICAgIC8vIGhlcmUgdG8gcHJvdmlkZSBBUEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICBwcm90ZWN0ZWQgVmVjdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gZmlsZXNldHMgPSByY3M7CiAKQEAgLTg4LDE1ICs5MSwxNSBAQAogICAgIHByb3RlY3RlZCBib29sZWFuIGluY2x1ZGVFbXB0eSA9IHRydWU7CiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbG9uZXJyb3IgPSB0cnVlOwogCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZ1tdPiBmaWxlQ29weU1hcCA9IG5ldyBMaW5rZWRIYXNodGFibGU8U3RyaW5nLCBTdHJpbmdbXT4oKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nW10+IGRpckNvcHlNYXAgPSBuZXcgTGlua2VkSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nW10+KCk7Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxGaWxlLCBGaWxlPiBjb21wbGV0ZURpck1hcCA9IG5ldyBMaW5rZWRIYXNodGFibGU8RmlsZSwgRmlsZT4oKTsKKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nW10+IGZpbGVDb3B5TWFwID0gbmV3IExpbmtlZEhhc2h0YWJsZTw+KCk7CisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZ1tdPiBkaXJDb3B5TWFwID0gbmV3IExpbmtlZEhhc2h0YWJsZTw+KCk7CisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxGaWxlLCBGaWxlPiBjb21wbGV0ZURpck1hcCA9IG5ldyBMaW5rZWRIYXNodGFibGU8PigpOwogCiAgICAgcHJvdGVjdGVkIE1hcHBlciBtYXBwZXJFbGVtZW50ID0gbnVsbDsKICAgICBwcm90ZWN0ZWQgRmlsZVV0aWxzIGZpbGVVdGlsczsKICAgICAvL0NoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsdGVyU2V0PiBmaWx0ZXJTZXRzID0gbmV3IFZlY3RvcjxGaWx0ZXJTZXQ+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEZpbHRlclNldD4gZmlsdGVyU2V0cyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByaXZhdGUgU3RyaW5nIGlucHV0RW5jb2RpbmcgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEVuY29kaW5nID0gbnVsbDsKICAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHkgPSAwOwpAQCAtNDc2LDE4ICs0NzksMTcgQEAKICAgICAgICAgICAgICAgIHNlcGFyYXRlIGxpc3RzIGFuZCB0aGVuIGVhY2ggbGlzdCBpcyBoYW5kbGVkIGluIG9uZSBnby4KICAgICAgICAgICAgICovCiAKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBmaWxlc0J5QmFzZWRpciA9IG5ldyBIYXNoTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4oKTsKLSAgICAgICAgICAgIGZpbmFsIEhhc2hNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBkaXJzQnlCYXNlZGlyID0gbmV3IEhhc2hNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PigpOwotICAgICAgICAgICAgZmluYWwgSGFzaFNldDxGaWxlPiBiYXNlRGlycyA9IG5ldyBIYXNoU2V0PEZpbGU+KCk7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IG5vbkZpbGVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSByY3Muc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSByY3MuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgZmluYWwgTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4gZmlsZXNCeUJhc2VkaXIgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmaW5hbCBNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBkaXJzQnlCYXNlZGlyID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZmluYWwgU2V0PEZpbGU+IGJhc2VEaXJzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gbm9uRmlsZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICBmb3IgKFJlc291cmNlQ29sbGVjdGlvbiByYyA6IHJjcykgewogCiAgICAgICAgICAgICAgICAgLy8gU3RlcCAoMSkgLSBiZXdhcmUgb2YgdGhlIFppcEZpbGVTZXQKICAgICAgICAgICAgICAgICBpZiAocmMgaW5zdGFuY2VvZiBGaWxlU2V0ICYmIHJjLmlzRmlsZXN5c3RlbU9ubHkoKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHJjOwotICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkczsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBCdWlsZEV4Y2VwdGlvbiBlKSB7CkBAIC00OTUsMjMgKzQ5NywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFnZXRNZXNzYWdlKGUpLmVuZHNXaXRoKERpcmVjdG9yeVNjYW5uZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRE9FU19OT1RfRVhJU1RfUE9TVEZJWCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXF1aWV0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIiArIGdldE1lc3NhZ2UoZSksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWlldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogIiArIGdldE1lc3NhZ2UoZSksIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZyb21EaXIgPSBmcy5nZXREaXIoZ2V0UHJvamVjdCgpKTsKIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzcmNGaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc3JjRGlycyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmbGF0dGVuICYmIG1hcHBlckVsZW1lbnQgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHMuaXNFdmVyeXRoaW5nSW5jbHVkZWQoKSAmJiAhZnMuaGFzUGF0dGVybnMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVEaXJNYXAucHV0KGZyb21EaXIsIGRlc3REaXIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFkZChmcm9tRGlyLCBzcmNGaWxlcywgZmlsZXNCeUJhc2VkaXIpOwotICAgICAgICAgICAgICAgICAgICBhZGQoZnJvbURpciwgc3JjRGlycywgZGlyc0J5QmFzZWRpcik7CisgICAgICAgICAgICAgICAgICAgIGFkZChmcm9tRGlyLCBkcy5nZXRJbmNsdWRlZEZpbGVzKCksIGZpbGVzQnlCYXNlZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkKGZyb21EaXIsIGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSwgZGlyc0J5QmFzZWRpcik7CiAgICAgICAgICAgICAgICAgICAgIGJhc2VEaXJzLmFkZChmcm9tRGlyKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBub3QgYSBmaWxlc2V0IG9yIGNvbnRhaW5zIG5vbi1maWxlIHJlc291cmNlcwogCkBAIC01NzYsNyArNTc1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChub25GaWxlUmVzb3VyY2VzLnNpemUoKSA+IDAgfHwgc2luZ2xlUmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFub25GaWxlUmVzb3VyY2VzLmlzRW1wdHkoKSB8fCBzaW5nbGVSZXNvdXJjZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VbXSBub25GaWxlcyA9CiAgICAgICAgICAgICAgICAgICAgIG5vbkZpbGVSZXNvdXJjZXMudG9BcnJheShuZXcgUmVzb3VyY2Vbbm9uRmlsZVJlc291cmNlcy5zaXplKCldKTsKICAgICAgICAgICAgICAgICAvLyByZXN0cmljdCB0byBvdXQtb2YtZGF0ZSByZXNvdXJjZXMKQEAgLTY0Nyw4ICs2NDYsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGl0ZXJhdGVPdmVyQmFzZURpcnMoCi0gICAgICAgIGZpbmFsIEhhc2hTZXQ8RmlsZT4gYmFzZURpcnMsIGZpbmFsIEhhc2hNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBkaXJzQnlCYXNlZGlyLCBmaW5hbCBIYXNoTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4gZmlsZXNCeUJhc2VkaXIpIHsKKyAgICBwcml2YXRlIHZvaWQgaXRlcmF0ZU92ZXJCYXNlRGlycyhmaW5hbCBTZXQ8RmlsZT4gYmFzZURpcnMsCisgICAgICAgIGZpbmFsIE1hcDxGaWxlLCBMaXN0PFN0cmluZz4+IGRpcnNCeUJhc2VkaXIsCisgICAgICAgIGZpbmFsIE1hcDxGaWxlLCBMaXN0PFN0cmluZz4+IGZpbGVzQnlCYXNlZGlyKSB7CiAKICAgICAgICAgZm9yIChmaW5hbCBGaWxlIGYgOiBiYXNlRGlycykgewogICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGZpbGVzID0gZmlsZXNCeUJhc2VkaXIuZ2V0KGYpOwpAQCAtNjc0LDcgKzY3NCw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiByY3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiByY3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZS0tYSBmaWxlIG9yIGEgcmVzb3VyY2UgY29sbGVjdGlvbi4iKTsKICAgICAgICAgfQpAQCAtNjg4LDM2ICs2ODgsMzYgQEAKICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVXNlIGEgcmVzb3VyY2UgY29sbGVjdGlvbiB0byBjb3B5IGRpcmVjdG9yaWVzLiIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsICYmIHJjcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsICYmICFyY3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAocmNzLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlLiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSByY3MuZWxlbWVudEF0KDApOwotICAgICAgICAgICAgICAgIGlmICghcmMuaXNGaWxlc3lzdGVtT25seSgpICYmICFzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgRmlsZVN5c3RlbSByZXNvdXJjZXMgYXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJjLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihNU0dfV0hFTl9DT1BZSU5HX0VNUFRZX1JDX1RPX0ZJTEUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzID0gcmMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVQcm92aWRlciByID0gcmVzLmFzKEZpbGVQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gci5nZXRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZVJlc291cmNlID0gcmVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmNzLnJlbW92ZUVsZW1lbnRBdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IHJjcy5lbGVtZW50QXQoMCk7CisgICAgICAgICAgICBpZiAoIXJjLmlzRmlsZXN5c3RlbU9ubHkoKSAmJiAhc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKE1TR19XSEVOX0NPUFlJTkdfRU1QVFlfUkNfVE9fRklMRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXMgPSByYy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlUHJvdmlkZXIgciA9IHJlcy5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHIuZ2V0RmlsZSgpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29uY2F0ZW5hdGUgbXVsdGlwbGUgZmlsZXMgaW50byBhIHNpbmdsZSBmaWxlLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlUmVzb3VyY2UgPSByZXM7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmNzLnJlbW92ZUVsZW1lbnRBdCgwKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbmNhdGVuYXRlIG11bHRpcGxlIGZpbGVzIGludG8gYSBzaW5nbGUgZmlsZS4iKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjb25jYXRlbmF0ZSBtdWx0aXBsZSBmaWxlcyBpbnRvIGEgc2luZ2xlIGZpbGUuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlc3RGaWxlICE9IG51bGwpIHsKQEAgLTc3Myw3ICs3NzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVOYW1lTWFwcGVyIG1hcHBlciwgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nW10+IG1hcCkgewogICAgICAgICBTdHJpbmdbXSB0b0NvcHkgPSBudWxsOwogICAgICAgICBpZiAoZm9yY2VPdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1hcHBlci5tYXBGaWxlTmFtZShuYW1lKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHYuYWRkKG5hbWUpOwpAQCAtODE1LDEwICs4MTUsMTAgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgTWFwPFJlc291cmNlLCBTdHJpbmdbXT4gYnVpbGRNYXAoZmluYWwgUmVzb3VyY2VbXSBmcm9tUmVzb3VyY2VzLCBmaW5hbCBGaWxlIHRvRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZU5hbWVNYXBwZXIgbWFwcGVyKSB7Ci0gICAgICAgIGZpbmFsIEhhc2hNYXA8UmVzb3VyY2UsIFN0cmluZ1tdPiBtYXAgPSBuZXcgSGFzaE1hcDxSZXNvdXJjZSwgU3RyaW5nW10+KCk7Ci0gICAgICAgIFJlc291cmNlW10gdG9Db3B5ID0gbnVsbDsKKyAgICAgICAgZmluYWwgTWFwPFJlc291cmNlLCBTdHJpbmdbXT4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBSZXNvdXJjZVtdIHRvQ29weTsKICAgICAgICAgaWYgKGZvcmNlT3ZlcndyaXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiB2ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgcmMgOiBmcm9tUmVzb3VyY2VzKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1hcHBlci5tYXBGaWxlTmFtZShyYy5nZXROYW1lKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdi5hZGQocmMpOwpAQCAtODI2LDE0ICs4MjYsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdG9Db3B5ID0gdi50b0FycmF5KG5ldyBSZXNvdXJjZVt2LnNpemUoKV0pOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdG9Db3B5ID0gUmVzb3VyY2VVdGlscy5zZWxlY3RPdXRPZkRhdGVTb3VyY2VzKHRoaXMsIGZyb21SZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNvdXJjZUZhY3RvcnkoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UodG9EaXIsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eSk7CisgICAgICAgICAgICB0b0NvcHkgPSBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXModGhpcywgZnJvbVJlc291cmNlcywgbWFwcGVyLAorICAgICAgICAgICAgICAgICAgICBuYW1lIC0+IG5ldyBGaWxlUmVzb3VyY2UodG9EaXIsIG5hbWUpLCBncmFudWxhcml0eSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChSZXNvdXJjZSByYyA6IHRvQ29weSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbWFwcGVkRmlsZXMgPSBtYXBwZXIubWFwRmlsZU5hbWUocmMuZ2V0TmFtZSgpKTsKQEAgLTg2MCw3ICs4NTQsNyBAQAogICAgICAqIFRoaXMgaXMgYSBnb29kIG1ldGhvZCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGVPcGVyYXRpb25zKCkgewotICAgICAgICBpZiAoZmlsZUNvcHlNYXAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIWZpbGVDb3B5TWFwLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBmaWxlQ29weU1hcC5zaXplKCkKICAgICAgICAgICAgICAgICArICIgZmlsZSIgKyAoZmlsZUNvcHlNYXAuc2l6ZSgpID09IDEgPyAiIiA6ICJzIikKICAgICAgICAgICAgICAgICArICIgdG8gIiArIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwpAQCAtOTEyLDEwICs5MDYsMTAgQEAKICAgICAgICAgaWYgKGluY2x1ZGVFbXB0eSkgewogICAgICAgICAgICAgaW50IGNyZWF0ZUNvdW50ID0gMDsKICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nW10gZGlycyA6IGRpckNvcHlNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBkID0gbmV3IEZpbGUoZGlyc1tpXSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZGlyIDogZGlycykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGQgPSBuZXcgRmlsZShkaXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGQubWtkaXJzKCkgfHwgZC5pc0RpcmVjdG9yeSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkLm1rZGlycygpICYmICFkLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk0Myw3ICs5MzcsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9SZXNvdXJjZU9wZXJhdGlvbnMoZmluYWwgTWFwPFJlc291cmNlLCBTdHJpbmdbXT4gbWFwKSB7Ci0gICAgICAgIGlmIChtYXAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIW1hcC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgbWFwLnNpemUoKQogICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZSIgKyAobWFwLnNpemUoKSA9PSAxID8gIiIgOiAicyIpCiAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKQEAgLTEwMjAsMTIgKzEwMTQsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkKEZpbGUgYmFzZURpciwgZmluYWwgU3RyaW5nW10gbmFtZXMsIGZpbmFsIE1hcDxGaWxlLCBMaXN0PFN0cmluZz4+IG0pIHsKICAgICAgICAgaWYgKG5hbWVzICE9IG51bGwpIHsKICAgICAgICAgICAgIGJhc2VEaXIgPSBnZXRLZXlGaWxlKGJhc2VEaXIpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGwgPSBtLmdldChiYXNlRGlyKTsKLSAgICAgICAgICAgIGlmIChsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KG5hbWVzLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbS5wdXQoYmFzZURpciwgbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsLmFkZEFsbChqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdChuYW1lcykpOworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGwgPSBtLmNvbXB1dGVJZkFic2VudChiYXNlRGlyLCBrIC0+IG5ldyBBcnJheUxpc3Q8PihuYW1lcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGwuYWRkQWxsKEFycmF5cy5hc0xpc3QobmFtZXMpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA4MSw3ICsxMDcxLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXREdWVUbyhmaW5hbCBFeGNlcHRpb24gZXgpIHsKICAgICAgICAgZmluYWwgYm9vbGVhbiBiYXNlSU9FeGNlcHRpb24gPSBleC5nZXRDbGFzcygpID09IElPRXhjZXB0aW9uLmNsYXNzOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgaWYgKCFiYXNlSU9FeGNlcHRpb24gfHwgZXguZ2V0TWVzc2FnZSgpID09IG51bGwpIHsKICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGV4LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgfQpAQCAtMTA5MiwxNSArMTA4MiwxMCBAQAogICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoZXguZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXguZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29udGFpbnMoIk1hbGZvcm1lZElucHV0IikpIHsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKAotICAgICAgICAgICAgICAgICJUaGlzIGlzIG5vcm1hbGx5IGR1ZSB0byB0aGUgaW5wdXQgZmlsZSBjb250YWluaW5nIGludmFsaWQiKTsKLSAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChMSU5FX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiYnl0ZXMgZm9yIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgdXNlZCA6ICIpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgKGlucHV0RW5jb2RpbmcgPT0gbnVsbAotICAgICAgICAgICAgICAgICA/IGZpbGVVdGlscy5nZXREZWZhdWx0RW5jb2RpbmcoKSA6IGlucHV0RW5jb2RpbmcpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICIlblRoaXMgaXMgbm9ybWFsbHkgZHVlIHRvIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgaW52YWxpZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIlbmJ5dGVzIGZvciB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIHVzZWQgOiAlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRFbmNvZGluZyA9PSBudWxsID8gZmlsZVV0aWxzLmdldERlZmF1bHRFbmNvZGluZygpIDogaW5wdXRFbmNvZGluZykpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtZXNzYWdlLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVBhdGguamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlQYXRoLmphdmEKaW5kZXggZTUwMDNkMS4uN2VhOWYxZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVBhdGguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5UGF0aC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjMsNiArNjMsNyBAQAogICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyOwogCiAgICAgLy8gVE9ETyBub3QgcmVhZCwgeWV0IGluIGEgcHVibGljIHNldHRlcgorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgbG9uZyBncmFudWxhcml0eSA9IEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCk7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQgPSBmYWxzZTsKQEAgLTE4MCw3ICsxODEsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBzb3VyY2VGaWxlTmFtZSA6IHNvdXJjZUZpbGVzKSB7CiAKICAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZUZpbGVOYW1lKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRvRmlsZXMgPSAoU3RyaW5nW10pIG1hcHBlci5tYXBGaWxlTmFtZShzb3VyY2VGaWxlTmFtZSk7CisgICAgICAgICAgICBTdHJpbmdbXSB0b0ZpbGVzID0gbWFwcGVyLm1hcEZpbGVOYW1lKHNvdXJjZUZpbGVOYW1lKTsKICAgICAgICAgICAgIGlmICh0b0ZpbGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlkaXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlkaXIuamF2YQppbmRleCAyNmZjNzE1Li4yN2E5NmUyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZGlyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzUsNiArMzUsNyBAQAogICogQGRlcHJlY2F0ZWQgVGhlIGNvcHlkaXIgdGFzayBpcyBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjIuICBVc2UgY29weSBpbnN0ZWFkLgogICovCiAKK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgQ29weWRpciBleHRlbmRzIE1hdGNoaW5nVGFzayB7CiAKICAgICBwcml2YXRlIEZpbGUgc3JjRGlyOwpAQCAtNDIsNyArNDMsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBmaWx0ZXJpbmcgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gZmxhdHRlbiA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZU92ZXJ3cml0ZSA9IGZhbHNlOwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBmaWxlY29weUxpc3QgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBmaWxlY29weUxpc3QgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBzcmMgYXR0cmlidXRlCkBAIC05NCw2ICs5NSw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZGlyIHRhc2sgaXMgZGVwcmVjYXRlZC4gIFVzZSBjb3B5IGluc3RlYWQuIik7CiAKQEAgLTExOSw4ICsxMjEsNyBAQAogICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyLCBmaWxlcyk7CisgICAgICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdERpciwgZHMuZ2V0SW5jbHVkZWRGaWxlcygpKTsKICAgICAgICAgICAgIGlmIChmaWxlY29weUxpc3Quc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgIGxvZygiQ29weWluZyAiICsgZmlsZWNvcHlMaXN0LnNpemUoKSArICIgZmlsZSIKICAgICAgICAgICAgICAgICAgICAgKyAoZmlsZWNvcHlMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGUuamF2YQppbmRleCBlOWFjYjFkLi4zMGI0OTZlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNCw2ICszNCw3IEBACiAgKiBjb3B5IGluc3RlYWQuCiAgKi8KIAorQERlcHJlY2F0ZWQKIHB1YmxpYyBjbGFzcyBDb3B5ZmlsZSBleHRlbmRzIFRhc2sgewogCiAgICAgcHJpdmF0ZSBGaWxlIHNyY0ZpbGU7CkBAIC04MCw2ICs4MSw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBjb3B5ZmlsZSB0YXNrIGlzIGRlcHJlY2F0ZWQuICBVc2UgY29weSBpbnN0ZWFkLiIpOwogCkBAIC0xMDcsOSArMTA5LDkgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmNvcHlGaWxlKHNyY0ZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJpbmcsIGZvcmNlT3ZlcndyaXRlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgY29weWluZyBmaWxlOiAiICsgc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQotICAgICAgICAgICAgICAgICAgICArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvcHlpbmcgZmlsZTogIiArIHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ3ZzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DdnMuamF2YQppbmRleCA4MjJhNGVhLi5iOTdkNTNmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DdnMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DdnMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlZkJhc2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlZkJhc2UuamF2YQppbmRleCBjYTM4ZmRkLi4wNTQwZjg0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZCYXNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmQmFzZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXMuamF2YQppbmRleCA2YjkxMmUyLi4zZjEyOTQzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDcgKzIyLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIC8qKgogICogQWx0ZXJzIHRoZSBkZWZhdWx0IGV4Y2x1ZGVzIGZvciB0aGUgPHN0cm9uZz5lbnRpcmU8L3N0cm9uZz4gYnVpbGQuLgpAQCAtNDUsMzIgKzQ3LDI2IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZGVmYXVsdHJlcXVlc3RlZCAmJiBhZGQuZXF1YWxzKCIiKSAmJiByZW1vdmUuZXF1YWxzKCIiKSAmJiAhZWNobykgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCI8ZGVmYXVsdGV4Y2x1ZGVzPiB0YXNrIG11c3Qgc2V0ICIKLSAgICAgICAgICAgICAgICArICJhdCBsZWFzdCBvbmUgYXR0cmlidXRlIChlY2hvPVwiZmFsc2VcIiIKLSAgICAgICAgICAgICAgICArICIgZG9lc24ndCBjb3VudCBzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0Iik7CisgICAgICAgIGlmICghZGVmYXVsdHJlcXVlc3RlZCAmJiBhZGQuaXNFbXB0eSgpICYmIHJlbW92ZS5pc0VtcHR5KCkgJiYgIWVjaG8pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiPGRlZmF1bHRleGNsdWRlcz4gdGFzayBtdXN0IHNldCBhdCBsZWFzdCBvbmUgYXR0cmlidXRlIChlY2hvPVwiZmFsc2VcIiBkb2Vzbid0IGNvdW50IHNpbmNlIHRoYXQgaXMgdGhlIGRlZmF1bHQiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGVmYXVsdHJlcXVlc3RlZCkgewogICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lci5yZXNldERlZmF1bHRFeGNsdWRlcygpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghYWRkLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKCFhZGQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlKGFkZCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFyZW1vdmUuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoIXJlbW92ZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIucmVtb3ZlRGVmYXVsdEV4Y2x1ZGUocmVtb3ZlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZWNobykgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICA9IG5ldyBTdHJpbmdCdWZmZXIoIkN1cnJlbnQgRGVmYXVsdCBFeGNsdWRlczoiKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIGV4Y2x1ZGVzID0gRGlyZWN0b3J5U2Nhbm5lci5nZXREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChleGNsdWRlc1tpXSk7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9nKG1lc3NhZ2UudG9TdHJpbmcoKSwgbG9nTGV2ZWwpOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBBcnJheXMuc3RyZWFtKERpcmVjdG9yeVNjYW5uZXIuZ2V0RGVmYXVsdEV4Y2x1ZGVzKCkpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoZXhjbHVkZSAtPiBTdHJpbmcuZm9ybWF0KCIgICVzJW4iLCBleGNsdWRlKSkKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIiLCAiQ3VycmVudCBEZWZhdWx0IEV4Y2x1ZGVzOiVuIiwgIiIpKTsKKyAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBsb2dMZXZlbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMSw1ICsxMDcsNCBAQAogICAgICAgICB0aGlzLmVjaG8gPSBlY2hvOwogICAgIH0KIAotCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZpbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZpbmVyLmphdmEKaW5kZXggOThhMjJiZS4uYWRmZGUzMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmaW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlZmluZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUwLDE1ICs1MCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogdGhlIGV4dGVuc2lvbiBvZiBhbiBhbnRsaWIgZmlsZSBmb3IgYXV0b2xvYWRpbmcuCi0gICAgICoge0B2YWx1ZVsKKyAgICAgKiB7QHZhbHVlIC9hbnRsaWIueG1sfQogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRMSUJfWE1MID0gIi9hbnRsaWIueG1sIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPE1hcDxVUkwsIExvY2F0aW9uPj4gUkVTT1VSQ0VfU1RBQ0sgPSBuZXcgVGhyZWFkTG9jYWw8TWFwPFVSTCwgTG9jYXRpb24+PigpIHsKLSAgICAgICAgcHJvdGVjdGVkIE1hcDxVUkwsIExvY2F0aW9uPiBpbml0aWFsVmFsdWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8VVJMLCBMb2NhdGlvbj4oKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8TWFwPFVSTCwgTG9jYXRpb24+PiBSRVNPVVJDRV9TVEFDSyA9IFRocmVhZExvY2FsLndpdGhJbml0aWFsKEhhc2hNYXA6Om5ldyk7CiAKICAgICBwcml2YXRlIFN0cmluZyBuYW1lOwogICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZTsKQEAgLTEyMCw5ICsxMTYsMTAgQEAKICAgICAgICAgICogZ2V0IHRoZSB2YWx1ZXMKICAgICAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgYWxsb3dlZCB2YWx1ZXMgZm9yIHRoaXMgYXR0cmlidXRlLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtQT0xJQ1lfRkFJTCwgUE9MSUNZX1JFUE9SVCwgUE9MSUNZX0lHTk9SRSwKLSAgICAgICAgICAgICAgICAgICAgUE9MSUNZX0ZBSUxBTEx9OworICAgICAgICAgICAgICAgIFBPTElDWV9GQUlMQUxMfTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM5LDYgKzEzNiw3IEBACiAgICAgICAgICAqIGdldCB0aGUgdmFsdWVzCiAgICAgICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGFsbG93ZWQgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InByb3BlcnRpZXMiLCAieG1sIn07CiAgICAgICAgIH0KQEAgLTIwMyw2ICsyMDEsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ2xhc3NMb2FkZXIgYWwgPSBjcmVhdGVMb2FkZXIoKTsKIApAQCAtMjI0LDIzICsyMjMsMjIgQEAKICAgICAgICAgICAgICAgICBzZXRSZXNvdXJjZShtYWtlUmVzb3VyY2VGcm9tVVJJKHVyaTEpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk9ubHkgYW50bGliIFVSSXMgY2FuIGJlIGxvY2F0ZWQgZnJvbSB0aGUgVVJJIGFsb25lLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCB0aGUgVVJJICciICsgZ2V0VVJJKCkgKyAiJyIpOworICAgICAgICAgICAgICAgICAgICAiT25seSBhbnRsaWIgVVJJcyBjYW4gYmUgbG9jYXRlZCBmcm9tIHRoZSBVUkkgYWxvbmUsIG5vdCB0aGUgVVJJICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGdldFVSSSgpICsgIiciKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSBhdHRyaWJ1dGUgb2YgIiArIGdldFRhc2tOYW1lKCkgKyAiIGVsZW1lbnQgIgotICAgICAgICAgICAgICAgICAgICArICJpcyB1bmRlZmluZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNsYXNzbmFtZSBhdHRyaWJ1dGUgb2YgIgorICAgICAgICAgICAgICAgICAgICArIGdldFRhc2tOYW1lKCkgKyAiIGVsZW1lbnQgaXMgdW5kZWZpbmVkIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhZGREZWZpbml0aW9uKGFsLCBuYW1lLCBjbGFzc25hbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGNsYXNzbmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJZb3UgbXVzdCBub3Qgc3BlY2lmeSBjbGFzc25hbWUgIgotICAgICAgICAgICAgICAgICAgICArICJ0b2dldGhlciB3aXRoIGZpbGUgb3IgcmVzb3VyY2UuIjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBub3Qgc3BlY2lmeSBjbGFzc25hbWUgdG9nZXRoZXIgd2l0aCBmaWxlIG9yIHJlc291cmNlLiIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248VVJMPiB1cmxzOwogICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewpAQCAtMjY0LDIxICsyNjIsMTkgQEAKICAgICAgICAgICAgICAgICBpZiAoZm10ID09IEZvcm1hdC5QUk9QRVJUSUVTKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKGFsLCB1cmwpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFJFU09VUkNFX1NUQUNLLmdldCgpLmdldCh1cmwpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBSZWN1cnNpdmUgbG9hZGluZyBvZiAiICsgdXJsCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaWdub3JlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdCAiICsgZ2V0TG9jYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9yaWdpbmFsbHkgbG9hZGVkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgUkVTT1VSQ0VfU1RBQ0suZ2V0KCkuZ2V0KHVybCksCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoUkVTT1VSQ0VfU1RBQ0suZ2V0KCkuZ2V0KHVybCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBSZWN1cnNpdmUgbG9hZGluZyBvZiAiICsgdXJsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0ICIgKyBnZXRMb2NhdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9yaWdpbmFsbHkgbG9hZGVkIGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFJFU09VUkNFX1NUQUNLLmdldCgpLmdldCh1cmwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRV9TVEFDSy5nZXQoKS5wdXQodXJsLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkQW50bGliKGFsLCB1cmwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRV9TVEFDSy5nZXQoKS5yZW1vdmUodXJsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFX1NUQUNLLmdldCgpLnB1dCh1cmwsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEFudGxpYihhbCwgdXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJFU09VUkNFX1NUQUNLLmdldCgpLnJlbW92ZSh1cmwpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjkxLDcgKzI4Nyw2IEBACiAgICAgICogQHBhcmFtIHVyaSB0aGUgeG1sIG5hbWVzcGFjZSB1cmkgdGhhdCB0byBjb252ZXJ0LgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgYSByZXNvdXJjZS4gSXQgbWF5IG5vdCBleGlzdAogICAgICAqLwotCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJlc291cmNlRnJvbVVSSShTdHJpbmcgdXJpKSB7CiAgICAgICAgIFN0cmluZyBwYXRoID0gdXJpLnN1YnN0cmluZyhNYWdpY05hbWVzLkFOVExJQl9QUkVGSVgubGVuZ3RoKCkpOwogICAgICAgICBTdHJpbmcgcmVzb3VyY2U7CkBAIC0zMDEsNyArMjk2LDcgQEAKICAgICAgICAgICAgIHJlc291cmNlID0gcGF0aC5zdWJzdHJpbmcoIi8vIi5sZW5ndGgoKSk7CiAgICAgICAgICAgICBpZiAoIXJlc291cmNlLmVuZHNXaXRoKCIueG1sIikpIHsKICAgICAgICAgICAgICAgICAvL2lmIHdlIGhhdmVuJ3QgYWxyZWFkeSBuYW1lZCBhbiBYTUwgZmlsZSwgaXQgZ2V0cyBhbnRsaWIueG1sCi0gICAgICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZSArIEFOVExJQl9YTUw7CisgICAgICAgICAgICAgICAgcmVzb3VyY2UgKz0gQU5UTElCX1hNTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vY29udmVydCBmcm9tIGEgcGFja2FnZSB0byBhIHBhdGgKQEAgLTMyMCw3ICszMTUsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgVVJMIGZpbGVUb1VSTCgpIHsKICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotICAgICAgICBpZiAoIShmaWxlLmV4aXN0cygpKSkgeworICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsZSAiICsgZmlsZSArICIgZG9lcyBub3QgZXhpc3QiOwogICAgICAgICB9CiAgICAgICAgIGlmIChtZXNzYWdlID09IG51bGwgJiYgIShmaWxlLmlzRmlsZSgpKSkgewpAQCAtMzkyLDkgKzM4Nyw3IEBACiAgICAgICogQHBhcmFtIHVybCB0aGUgdXJsIHRvIGdldCB0aGUgZGVmaW5pdGlvbnMgZnJvbQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGxvYWRQcm9wZXJ0aWVzKENsYXNzTG9hZGVyIGFsLCBVUkwgdXJsKSB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCkpIHsKICAgICAgICAgICAgIGlmIChpcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tICIgKyB1cmwsCiAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwpAQCAtNDAyLDE2ICszOTUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICAgICAgcHJvcHMubG9hZChpcyk7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbjw/PiBrZXlzID0gcHJvcHMua2V5cygpOwotICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gKChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBwcm9wcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0ga2V5OwogICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IHByb3BzLmdldFByb3BlcnR5KG5hbWUpOwogICAgICAgICAgICAgICAgIGFkZERlZmluaXRpb24oYWwsIG5hbWUsIGNsYXNzbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgsIGdldExvY2F0aW9uKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDczLDEyICs0NjMsMTIgQEAKICAgICAgICAgaWYgKGRlZmluZXJTZXQpIHsKICAgICAgICAgICAgIHRvb01hbnlEZWZpbml0aW9ucygpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghYW50bGliLnN0YXJ0c1dpdGgoImFudGxpYjoiKSkgeworICAgICAgICBpZiAoIWFudGxpYi5zdGFydHNXaXRoKE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBhbnRsaWIgYXR0cmlidXRlIC0gaXQgbXVzdCBzdGFydCB3aXRoIGFudGxpYjoiKTsKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBhbnRsaWIgYXR0cmlidXRlIC0gaXQgbXVzdCBzdGFydCB3aXRoICIgKyBNYWdpY05hbWVzLkFOVExJQl9QUkVGSVgpOwogICAgICAgICB9CiAgICAgICAgIHNldFVSSShhbnRsaWIpOwotICAgICAgICB0aGlzLnJlc291cmNlID0gYW50bGliLnN1YnN0cmluZygiYW50bGliOiIubGVuZ3RoKCkpLnJlcGxhY2UoJy4nLCAnLycpCisgICAgICAgIHRoaXMucmVzb3VyY2UgPSBhbnRsaWIuc3Vic3RyaW5nKE1hZ2ljTmFtZXMuQU5UTElCX1BSRUZJWC5sZW5ndGgoKSkucmVwbGFjZSgnLicsICcvJykKICAgICAgICAgICAgICsgIi9hbnRsaWIueG1sIjsKICAgICAgICAgZGVmaW5lclNldCA9IHRydWU7CiAgICAgfQpAQCAtNTYwLDcgKzU1MCw2IEBACiAgICAgICAgIHRoaXMuYWRhcHRUb0NsYXNzID0gYWRhcHRUb0NsYXNzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQWRkIGEgZGVmaW5pdGlvbiB1c2luZyB0aGUgYXR0cmlidXRlcyBvZiBEZWZpbmVyCiAgICAgICoKQEAgLTYwMiwxNSArNTkxLDE2IEBACiAgICAgICAgICAgICAgICAgQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEhlbHBlcihnZXRQcm9qZWN0KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGF0YVR5cGVEZWZpbml0aW9uKGRlZik7CiAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0VGFza05hbWUoKSArICIgY2xhc3MgIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSBmb3VuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuIHVzaW5nIHRoZSBjbGFzc2xvYWRlciAiICsgYWw7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgY25mZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBnZXRUYXNrTmFtZSgpICsgIiBjbGFzcyAiICsgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGJlIGZvdW5kXG4gdXNpbmcgdGhlIGNsYXNzbG9hZGVyICIgKyBhbCwKKyAgICAgICAgICAgICAgICAgICAgY25mZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBuY2RmZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRUYXNrTmFtZSgpICsgIiBBIGNsYXNzIG5lZWRlZCBieSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzbmFtZSArICIgY2Fubm90IGJlIGZvdW5kOiAiICsgbmNkZmUuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcbiB1c2luZyB0aGUgY2xhc3Nsb2FkZXIgIiArIGFsOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIG5jZGZlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkgKyAiIEEgY2xhc3MgbmVlZGVkIGJ5IGNsYXNzICIgKyBjbGFzc25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjYW5ub3QgYmUgZm91bmQ6ICIgKyBuY2RmZS5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuIHVzaW5nIHRoZSBjbGFzc2xvYWRlciAiICsgYWwsCisgICAgICAgICAgICAgICAgICAgIG5jZGZlLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHN3aXRjaCAob25FcnJvcikgewpAQCAtNjM0LDcgKzYyNCw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHRvb01hbnlEZWZpbml0aW9ucygpIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgIk9ubHkgb25lIG9mIHRoZSBhdHRyaWJ1dGVzIG5hbWUsIGZpbGUgYW5kIHJlc291cmNlIgotICAgICAgICAgICAgKyAiIGNhbiBiZSBzZXQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICJPbmx5IG9uZSBvZiB0aGUgYXR0cmlidXRlcyBuYW1lLCBmaWxlIGFuZCByZXNvdXJjZSBjYW4gYmUgc2V0IiwKKyAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlLmphdmEKaW5kZXggZjg4NzY5NS4uODJkODRlMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC02MCw3ICs2Myw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNpemVTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3ltYm9saWNMaW5rVXRpbHM7CiAKIC8qKgogICogRGVsZXRlcyBhIGZpbGUgb3IgZGlyZWN0b3J5LCBvciBzZXQgb2YgZmlsZXMgZGVmaW5lZCBieSBhIGZpbGVzZXQuCkBAIC03OSwzMyArODEsNDEgQEAKIHB1YmxpYyBjbGFzcyBEZWxldGUgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQ29tcGFyYXRvciBSRVZFUlNFX0ZJTEVTWVNURU0gPSBuZXcgUmV2ZXJzZShuZXcgRmlsZVN5c3RlbSgpKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yIEVYSVNUUyA9IG5ldyBFeGlzdHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJldmVyc2VEaXJzIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8Q29tcGFyYWJsZTw/Pj4gUkVWRVJTRSA9IG5ldyBDb21wYXJhdG9yPENvbXBhcmFibGU8Pz4+KCkgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKENvbXBhcmFibGU8Pz4gZm9vLCBDb21wYXJhYmxlPD8+IGJhcikgewotICAgICAgICAgICAgICAgIHJldHVybiAoKENvbXBhcmFibGUpIGZvbykuY29tcGFyZVRvKGJhcikgKiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKwogICAgICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKICAgICAgICAgcHJpdmF0ZSBGaWxlIGJhc2VkaXI7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nW10gZGlyczsKKwogICAgICAgICBSZXZlcnNlRGlycyhQcm9qZWN0IHByb2plY3QsIEZpbGUgYmFzZWRpciwgU3RyaW5nW10gZGlycykgewogICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7CiAgICAgICAgICAgICB0aGlzLmRpcnMgPSBkaXJzOwotICAgICAgICAgICAgQXJyYXlzLnNvcnQodGhpcy5kaXJzLCBSRVZFUlNFKTsKKyAgICAgICAgICAgIEFycmF5cy5zb3J0KHRoaXMuZGlycywgQ29tcGFyYXRvci5yZXZlcnNlT3JkZXIoKSk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IocHJvamVjdCwgYmFzZWRpciwgZGlycyk7CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgcHVibGljIGludCBzaXplKCkgeyByZXR1cm4gZGlycy5sZW5ndGg7IH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkaXJzLmxlbmd0aDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAgICAgcHJvdGVjdGVkIEZpbGUgZmlsZSA9IG51bGw7CiAgICAgcHJvdGVjdGVkIEZpbGUgZGlyID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yPEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3RvcjxGaWxlU2V0PigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiB1c2VkTWF0Y2hpbmdUYXNrID0gZmFsc2U7CiAgICAgLy8gYnkgZGVmYXVsdCwgcmVtb3ZlIG1hdGNoaW5nIGVtcHR5IGRpcnMKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpbmNsdWRlRW1wdHkgPSBmYWxzZTsKQEAgLTExNyw5ICsxMjcsNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVPbkV4aXQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gcmVtb3ZlTm90Rm9sbG93ZWRTeW1saW5rcyA9IGZhbHNlOwogICAgIHByaXZhdGUgUmVzb3VyY2VzIHJjcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgU3ltYm9saWNMaW5rVXRpbHMgU1lNTElOS19VVElMUyA9Ci0gICAgICAgIFN5bWJvbGljTGlua1V0aWxzLmdldFN5bWJvbGljTGlua1V0aWxzKCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1HYyA9IE9zLmlzRmFtaWx5KCJ3aW5kb3dzIik7CiAKICAgICAvKioKQEAgLTE3NSw5ICsxODIsOSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGZhaWxvbmVycm9yIHRydWUgb3IgZmFsc2UKICAgICAgKi8KLSAgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikgewotICAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZhaWxvbmVycm9yOwotICAgICB9CisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmYWlsb25lcnJvcikgeworICAgICAgICB0aGlzLmZhaWxvbmVycm9yID0gZmFpbG9uZXJyb3I7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgb24gZmFpbHVyZSB0byBkZWxldGUsIG5vdGUgdGhlIGVycm9yIGFuZCBzZXQKQEAgLTE4NSwxMCArMTkyLDkgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBkZWxldGVPbkV4aXQgdHJ1ZSBvciBmYWxzZQogICAgICAqLwotICAgICBwdWJsaWMgdm9pZCBzZXREZWxldGVPbkV4aXQoYm9vbGVhbiBkZWxldGVPbkV4aXQpIHsKLSAgICAgICAgIHRoaXMuZGVsZXRlT25FeGl0ID0gZGVsZXRlT25FeGl0OwotICAgICB9Ci0KKyAgICBwdWJsaWMgdm9pZCBzZXREZWxldGVPbkV4aXQoYm9vbGVhbiBkZWxldGVPbkV4aXQpIHsKKyAgICAgICAgdGhpcy5kZWxldGVPbkV4aXQgPSBkZWxldGVPbkV4aXQ7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgZGVsZXRlIGVtcHR5IGRpcmVjdG9yaWVzLgpAQCAtMjEzLDEwICsyMTksMTAgQEAKICAgICAgICAgcGVyZm9ybUdjID0gYjsKICAgICB9CiAKLSAgIC8qKgotICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyB0byBiZSBkZWxldGVkLgotICAgICogQHBhcmFtIHNldCB0aGUgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQKLSAgICAqLworICAgIC8qKgorICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgdG8gYmUgZGVsZXRlZC4KKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBzZXQgb2YgZmlsZXMgdG8gYmUgZGVsZXRlZAorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKICAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOwogICAgIH0KQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgbGlzdAogICAgICAqIEByZXR1cm4gYSBOYW1lRW50cnkgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZSgpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVJbmNsdWRlKCk7CkBAIC0yNDksNiArMjU2LDcgQEAKICAgICAgKiBhZGQgYSBuYW1lIGVudHJ5IG9uIHRoZSBpbmNsdWRlIGZpbGVzIGxpc3QKICAgICAgKiBAcmV0dXJuIGEgUGF0dGVybkZpbGVOYW1lRW50cnkgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGF0dGVyblNldC5OYW1lRW50cnkgY3JlYXRlSW5jbHVkZXNGaWxlKCkgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOwpAQCAtMjU4LDYgKzI2Niw3IEBACiAgICAgICogYWRkIGEgbmFtZSBlbnRyeSBvbiB0aGUgZXhjbHVkZSBsaXN0CiAgICAgICogQHJldHVybiBhIE5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlKCkgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUV4Y2x1ZGUoKTsKQEAgLTI2Nyw2ICsyNzYsNyBAQAogICAgICAqIGFkZCBhIG5hbWUgZW50cnkgb24gdGhlIGluY2x1ZGUgZmlsZXMgbGlzdAogICAgICAqIEByZXR1cm4gYSBQYXR0ZXJuRmlsZU5hbWVFbnRyeSBvYmplY3QgdG8gYmUgY29uZmlndXJlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBjcmVhdGVFeGNsdWRlc0ZpbGUoKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlRXhjbHVkZXNGaWxlKCk7CkBAIC0yNzYsNiArMjg2LDcgQEAKICAgICAgKiBhZGQgYSBzZXQgb2YgcGF0dGVybnMKICAgICAgKiBAcmV0dXJuIFBhdHRlcm5TZXQgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGF0dGVyblNldCBjcmVhdGVQYXR0ZXJuU2V0KCkgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVBhdHRlcm5TZXQoKTsKQEAgLTI4Nyw2ICsyOTgsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGluY2x1ZGVzIHRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgaW5jbHVkZSBwYXR0ZXJucwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKFN0cmluZyBpbmNsdWRlcykgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuc2V0SW5jbHVkZXMoaW5jbHVkZXMpOwpAQCAtMjk4LDYgKzMxMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZXhjbHVkZXMgdGhlIHN0cmluZyBjb250YWluaW5nIHRoZSBleGNsdWRlIHBhdHRlcm5zCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nIGV4Y2x1ZGVzKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7CkBAIC0zMTAsNiArMzIzLDcgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkLCAiZmFsc2UifCJvZmYifCJubyIgd2hlbiB0aGV5CiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRuJ3QgYmUgdXNlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0ZXhjbHVkZXMoYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLnNldERlZmF1bHRleGNsdWRlcyh1c2VEZWZhdWx0RXhjbHVkZXMpOwpAQCAtMzIxLDYgKzMzNSw3IEBACiAgICAgICogQHBhcmFtIGluY2x1ZGVzZmlsZSBBIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZSB0byBmZXRjaAogICAgICAqIHRoZSBpbmNsdWRlIHBhdHRlcm5zIGZyb20uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXNmaWxlKEZpbGUgaW5jbHVkZXNmaWxlKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5zZXRJbmNsdWRlc2ZpbGUoaW5jbHVkZXNmaWxlKTsKQEAgLTMzMiw2ICszNDcsNyBAQAogICAgICAqIEBwYXJhbSBleGNsdWRlc2ZpbGUgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWUgdG8gZmV0Y2gKICAgICAgKiB0aGUgaW5jbHVkZSBwYXR0ZXJucyBmcm9tLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzZmlsZShGaWxlIGV4Y2x1ZGVzZmlsZSkgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuc2V0RXhjbHVkZXNmaWxlKGV4Y2x1ZGVzZmlsZSk7CkBAIC0zNDMsNiArMzU5LDcgQEAKICAgICAgKiBAcGFyYW0gaXNDYXNlU2Vuc2l0aXZlICJ0cnVlInwib24ifCJ5ZXMiIGlmIGZpbGUgc3lzdGVtIGlzIGNhc2UKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbnNpdGl2ZSwgImZhbHNlInwib2ZmInwibm8iIHdoZW4gbm90LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENhc2VTZW5zaXRpdmUoYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLnNldENhc2VTZW5zaXRpdmUoaXNDYXNlU2Vuc2l0aXZlKTsKQEAgLTM1Myw2ICszNzAsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGZvbGxvd1N5bWxpbmtzIHdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEZvbGxvd1N5bWxpbmtzKGJvb2xlYW4gZm9sbG93U3ltbGlua3MpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLnNldEZvbGxvd1N5bWxpbmtzKGZvbGxvd1N5bWxpbmtzKTsKQEAgLTM3NCw2ICszOTIsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yKFNlbGVjdFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRTZWxlY3RvcihzZWxlY3Rvcik7CkBAIC0zODQsNiArNDAzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLmFkZEFuZChzZWxlY3Rvcik7CkBAIC0zOTQsNiArNDE0LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRPcihPclNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRPcihzZWxlY3Rvcik7CkBAIC00MDQsNiArNDI1LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLmFkZE5vdChzZWxlY3Rvcik7CkBAIC00MTQsNiArNDM2LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGROb25lKE5vbmVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkTm9uZShzZWxlY3Rvcik7CkBAIC00MjQsNiArNDQ3LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRNYWpvcml0eShzZWxlY3Rvcik7CkBAIC00MzQsNiArNDU4LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREYXRlKERhdGVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkRGF0ZShzZWxlY3Rvcik7CkBAIC00NDQsNiArNDY5LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRTaXplKFNpemVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkU2l6ZShzZWxlY3Rvcik7CkBAIC00NTQsNiArNDgwLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlbmFtZShGaWxlbmFtZVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRGaWxlbmFtZShzZWxlY3Rvcik7CkBAIC00NjQsNiArNDkxLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRDdXN0b20oRXh0ZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLmFkZEN1c3RvbShzZWxlY3Rvcik7CkBAIC00NzQsNiArNTAyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRDb250YWlucyhDb250YWluc1NlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRDb250YWlucyhzZWxlY3Rvcik7CkBAIC00ODQsNiArNTEzLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRQcmVzZW50KFByZXNlbnRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkUHJlc2VudChzZWxlY3Rvcik7CkBAIC00OTQsNiArNTI0LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREZXB0aChEZXB0aFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGREZXB0aChzZWxlY3Rvcik7CkBAIC01MDQsNiArNTM1LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmQoRGVwZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgdXNlZE1hdGNoaW5nVGFzayA9IHRydWU7CiAgICAgICAgIHN1cGVyLmFkZERlcGVuZChzZWxlY3Rvcik7CkBAIC01MTQsNiArNTQ2LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYmUgYWRkZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRDb250YWluc1JlZ2V4cChDb250YWluc1JlZ2V4cFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIHVzZWRNYXRjaGluZ1Rhc2sgPSB0cnVlOwogICAgICAgICBzdXBlci5hZGRDb250YWluc1JlZ2V4cChzZWxlY3Rvcik7CkBAIC01MjUsNiArNTU4LDcgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkTW9kaWZpZWQoTW9kaWZpZWRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkTW9kaWZpZWQoc2VsZWN0b3IpOwpAQCAtNTM2LDYgKzU3MCw3IEBACiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBiZSBhZGRlZAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICB1c2VkTWF0Y2hpbmdUYXNrID0gdHJ1ZTsKICAgICAgICAgc3VwZXIuYWRkKHNlbGVjdG9yKTsKQEAgLTU0NiwyMCArNTgxLDIxIEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAodXNlZE1hdGNoaW5nVGFzaykgewotICAgICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVXNlIG9mIHRoZSBpbXBsaWNpdCBGaWxlU2V0IGlzIGRlcHJlY2F0ZWQuICAiCi0gICAgICAgICAgICAgICAgKyAiVXNlIGEgbmVzdGVkIGZpbGVzZXQgZWxlbWVudCBpbnN0ZWFkLiIsIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IHZlcmJvc2l0eSk7CisgICAgICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBVc2Ugb2YgdGhlIGltcGxpY2l0IEZpbGVTZXQgaXMgZGVwcmVjYXRlZC4gIFVzZSBhIG5lc3RlZCBmaWxlc2V0IGVsZW1lbnQgaW5zdGVhZC4iLAorICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IHZlcmJvc2l0eSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIGRpciA9PSBudWxsICYmIGZpbGVzZXRzLnNpemUoKSA9PSAwICYmIHJjcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiB0aGUgZmlsZSBvciBkaXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMsIG9yIGEgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtdXN0IGJlIHNldC4iKTsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiBkaXIgPT0gbnVsbCAmJiBmaWxlc2V0cy5pc0VtcHR5KCkgJiYgcmNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQXQgbGVhc3Qgb25lIG9mIHRoZSBmaWxlIG9yIGRpciBhdHRyaWJ1dGVzLCBvciBhIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLCBtdXN0IGJlIHNldC4iKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChxdWlldCAmJiBmYWlsb25lcnJvcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJxdWlldCBhbmQgZmFpbG9uZXJyb3IgY2Fubm90IGJvdGggYmUgc2V0IHRvIHRydWUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAicXVpZXQgYW5kIGZhaWxvbmVycm9yIGNhbm5vdCBib3RoIGJlIHNldCB0byB0cnVlIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBkZWxldGUgdGhlIHNpbmdsZSBmaWxlCkBAIC01NjcsOCArNjAzLDggQEAKICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgICAgICBsb2coIkRpcmVjdG9yeSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSByZW1vdmVkIHVzaW5nIHRoZSBmaWxlIGF0dHJpYnV0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSBkaXIgaW5zdGVhZC4iLCBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiB2ZXJib3NpdHkpOworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNhbm5vdCBiZSByZW1vdmVkIHVzaW5nIHRoZSBmaWxlIGF0dHJpYnV0ZS4gIFVzZSBkaXIgaW5zdGVhZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKQEAgLTYyNiwxMSArNjYyLDEwIEBACiAgICAgICAgICAgICBmaWxlc2V0cy5hZGQoaW1wbGljaXQpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWxlc2V0cy5zaXplKCk7CiAgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CiAgICAgICAgICAgICBpZiAoZnMuZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGVzZXQgd2l0aCBubyBwcm9qZWN0IHNwZWNpZmllZDsiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bWluZyBleGVjdXRpbmcgcHJvamVjdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgZmlsZXNldCB3aXRoIG5vIHByb2plY3Qgc3BlY2lmaWVkOyBhc3N1bWluZyBleGVjdXRpbmcgcHJvamVjdCIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIGZzID0gKEZpbGVTZXQpIGZzLmNsb25lKCk7CiAgICAgICAgICAgICAgICAgZnMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgfQpAQCAtNjQ5LDE5ICs2ODQsMjIgQEAKICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpbmcsIGNhcHR1cmUgdGhlIHJlc3VsdHMgbm93IGFuZCBzdG9yZSB0aGVtCiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CiAgICAgICAgICAgICAgICAgcmVzb3VyY2VzVG9EZWxldGUuYWRkKG5ldyBSZXNvdXJjZUNvbGxlY3Rpb24oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZXMubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVzLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IoZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNEaXIsIGZpbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXRQcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzRGlyLCBmaWxlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVzZXREaXJzLmFkZChuZXcgUmV2ZXJzZURpcnMoZ2V0UHJvamVjdCgpLCBmc0RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpKTsKQEAgLTY3MiwxMiArNzEwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpbmtzID0gbmV3IFN0cmluZ1tuLmxlbmd0aF07CiAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG4sIDAsIGxpbmtzLCAwLCBuLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChsaW5rcywgUmV2ZXJzZURpcnMuUkVWRVJTRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuc29ydChsaW5rcywgQ29tcGFyYXRvci5yZXZlcnNlT3JkZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBsaW5rIDogbGlua3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWU1MSU5LX1VUSUxTLmRlbGV0ZVN5bWJvbGljTGluayhuZXcgRmlsZShsaW5rKSwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUoZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggZmlsZVBhdGggPSBQYXRocy5nZXQobGluayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaWxlcy5pc1N5bWJvbGljTGluayhmaWxlUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBub3QgYSBzeW1ib2xpYyBsaW5rLCBzbyBtb3ZlIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGEgc3ltYm9saWMgbGluaywgc28gZGVsZXRlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZWxldGVkID0gZmlsZVBhdGgudG9GaWxlKCkuZGVsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSgiQ291bGQgbm90IGRlbGV0ZSBzeW1ib2xpYyBsaW5rIGF0ICIgKyBmaWxlUGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC03MDQsNyArNzQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIShmLmlzRGlyZWN0b3J5KCkpIHx8IGYubGlzdCgpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi5pc0RpcmVjdG9yeSgpIHx8IGYubGlzdCgpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nICIgKyBmLCB2ZXJib3NpdHkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxldGUoZikgJiYgZmFpbG9uZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUoIlVuYWJsZSB0byBkZWxldGUgIgpAQCAtODMyLDE0ICs4NzUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RhbmdsaW5nU3ltbGluayhGaWxlIGYpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBTWU1MSU5LX1VUSUxTLmlzRGFuZ2xpbmdTeW1ib2xpY0xpbmsoZik7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgbG9nKCJFcnJvciB3aGlsZSB0cnlpbmcgdG8gZGV0ZWN0ICIgKyBmLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgKyAiIGFzIGJyb2tlbiBzeW1ib2xpYyBsaW5rLiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogdmVyYm9zaXR5KTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEYW5nbGluZ1N5bWxpbmsoZmluYWwgRmlsZSBmKSB7CisgICAgICAgIGlmICghRmlsZXMuaXNTeW1ib2xpY0xpbmsoZi50b1BhdGgoKSkpIHsKKyAgICAgICAgICAgIC8vIGl0J3Mgbm90IGEgc3ltbGluaywgc28gY2xlYXJseSBpdCdzIG5vdCBhIGRhbmdsaW5nIG9uZQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIC8vIGl0J3MgYSBzeW1ib2xpYyBsaW5rLCBub3cgIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgdGhlICh0YXJnZXQpIGZpbGUgKGJ5ICJmb2xsb3dpbmcgbGlua3MiKQorICAgICAgICBmaW5hbCBib29sZWFuIHRhcmdldEZpbGVFeGlzdHMgPSBGaWxlcy5leGlzdHMoZi50b1BhdGgoKSk7CisgICAgICAgIHJldHVybiAhdGFyZ2V0RmlsZUV4aXN0czsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlLmphdmEKaW5kZXggODY1N2Q3Ni4uNWMzNmY1YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsdHJlZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CkBAIC03MiwzMyArNzEsMjYgQEAKIAogICAgICAgICAgICAgbG9nKCJEZWxldGluZzogIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRGlyKGRpcik7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBkZWxldGUgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlbW92ZURpcihkaXIpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZURpcihGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRGlyKEZpbGUgZGlyKSB7CiAKICAgICAgICAgLy8gY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIGRpciBpc24ndCBhIHN5bWxpbmsKICAgICAgICAgLy8gdGhlIGNvbXBhcmlzb24gb2YgYWJzb2x1dGUgcGF0aCBhbmQgY2Fub25pY2FsIHBhdGgKICAgICAgICAgLy8gY2F0Y2hlcyB0aGlzCiAKLSAgICAgICAgLy8gICAgICAgIGlmIChkaXIuZ2V0Q2Fub25pY2FsUGF0aCgpLmVxdWFscyhkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKSB7CisgICAgICAgIC8vIGlmIChkaXIuZ2V0Q2Fub25pY2FsUGF0aCgpLmVxdWFscyhkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKSB7CiAgICAgICAgIC8vIChjb3N0aW4pIEl0IHdpbGwgbm90IHdvcmsgaWYgL2hvbWUvY29zdGluIGlzIHN5bWxpbmsgdG8KLSAgICAgICAgLy8gL2RhMC9ob21lL2Nvc3RpbiAoIHRheiBmb3IgZXhhbXBsZSApCisgICAgICAgIC8vIC9kYTAvaG9tZS9jb3N0aW4gKHRheiBmb3IgZXhhbXBsZSkKICAgICAgICAgZm9yIChTdHJpbmcgcyA6IGRpci5saXN0KCkpIHsKICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGRpciwgcyk7CiAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlRGlyKGYpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWYuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFmLmRlbGV0ZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoIWRpci5kZWxldGUoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVwZW5kU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YQppbmRleCA1NDllMGZmLi5jNmJjMTUxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZXBlbmRTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLkV4aXN0czsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLk5vdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlJlc291cmNlU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJlYW1VdGlsczsKIAogLyoqCiAgKiBFeGFtaW5lcyBhbmQgcmVtb3ZlcyBvdXQgb2YgZGF0ZSB0YXJnZXQgZmlsZXMuICBJZiBhbnkgb2YgdGhlIHRhcmdldCBmaWxlcwpAQCAtMTAyLDEyICsxMDMsMTUgQEAKICAgICAgICAgcHJpdmF0ZSBIaWRlTWlzc2luZ0Jhc2VkaXIoRmlsZVNldCBmcykgewogICAgICAgICAgICAgdGhpcy5mcyA9IGZzOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICAgICAgcmV0dXJuIGJhc2VkaXJFeGlzdHMoKSA/IGZzLml0ZXJhdG9yKCkgOiBSZXNvdXJjZXMuRU1QVFlfSVRFUkFUT1I7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBiYXNlZGlyRXhpc3RzKCkgPyBmcy5zaXplKCkgOiAwOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTE5MSw2ICsxOTUsNyBAQAogICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBlcnJvcnMgb2NjdXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzb3VyY2VzID09IG51bGwpIHsKICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCkBAIC0yMDEsMTIgKzIwNiwxMSBAQAogICAgICAgICAgICAgICAiQXQgbGVhc3Qgb25lIHNldCBvZiB0YXJnZXQgZmlsZXMgbXVzdCBiZSBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogICAgICAgICAvL25vIHNvdXJjZXMgPSBub3RoaW5nIHRvIGNvbXBhcmU7IG5vIHRhcmdldHMgPSBub3RoaW5nIHRvIGRlbGV0ZToKLSAgICAgICAgaWYgKHNvdXJjZXMuc2l6ZSgpID4gMCAmJiB0YXJnZXRzLnNpemUoKSA+IDAgJiYgIXVwdG9kYXRlKHNvdXJjZXMsIHRhcmdldHMpKSB7CisgICAgICAgIGlmICghc291cmNlcy5pc0VtcHR5KCkgJiYgIXRhcmdldHMuaXNFbXB0eSgpICYmICF1cHRvZGF0ZShzb3VyY2VzLCB0YXJnZXRzKSkgewogICAgICAgICAgICBsb2coIkRlbGV0aW5nIGFsbCB0YXJnZXQgZmlsZXMuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICBTdHJpbmdbXSB0ID0gdGFyZ2V0cy5saXN0KCk7Ci0gICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nICIgKyB0W2ldKTsKKyAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHQgOiB0YXJnZXRzLmxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgIiArIHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIERlbGV0ZSBkZWxldGUgPSBuZXcgRGVsZXRlKCk7CkBAIC0yMjIsNyArMjI2LDcgQEAKICAgICAgICAgZGF0ZXNlbC5zZXRNaWxsaXMoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwogICAgICAgICBkYXRlc2VsLnNldFdoZW4oVGltZUNvbXBhcmlzb24uQUZURVIpOwogICAgICAgICAvLyBkb24ndCB3aGluZSBiZWNhdXNlIGEgZmlsZSBoYXMgY2hhbmdlZCBkdXJpbmcgdGhlIGxhc3QKLSAgICAgICAgLy8gc2Vjb25kIChvciB3aGF0aGV2ZXIgb3VyIGN1cnJlbnQgZ3JhbnVsYXJpdHkgbWF5IGJlKQorICAgICAgICAvLyBzZWNvbmQgKG9yIHdoYXRldmVyIG91ciBjdXJyZW50IGdyYW51bGFyaXR5IG1heSBiZSkKICAgICAgICAgZGF0ZXNlbC5zZXRHcmFudWxhcml0eSgwKTsKICAgICAgICAgbG9nRnV0dXJlKHRhcmdldHMsIGRhdGVzZWwpOwogCkBAIC0yNDUsNyArMjQ5LDcgQEAKICAgICAgICAgICAgIGxvZ01pc3NpbmcobWlzc2luZ1NvdXJjZXMsICJzb3VyY2UiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBSZXNvdXJjZSBuZXdlc3RTb3VyY2UgPSAoUmVzb3VyY2UpIGdldE5ld2VzdChzb3VyY2VzKTsKKyAgICAgICAgUmVzb3VyY2UgbmV3ZXN0U291cmNlID0gZ2V0TmV3ZXN0KHNvdXJjZXMpOwogICAgICAgICBsb2dXaXRoTW9kaWZpY2F0aW9uVGltZShuZXdlc3RTb3VyY2UsICJuZXdlc3Qgc291cmNlIik7CiAgICAgICAgIHJldHVybiBvbGRlc3RUYXJnZXQuZ2V0TGFzdE1vZGlmaWVkKCkgPj0gbmV3ZXN0U291cmNlLmdldExhc3RNb2RpZmllZCgpOwogICAgIH0KQEAgLTI2MCwxOSArMjY0LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFJlc291cmNlIGdldFhlc3QoUmVzb3VyY2VDb2xsZWN0aW9uIHJjLCBSZXNvdXJjZUNvbXBhcmF0b3IgYykgewotICAgICAgICBJdGVyYXRvcjxSZXNvdXJjZT4gaSA9IHJjLml0ZXJhdG9yKCk7Ci0gICAgICAgIGlmICghaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIH0KLSAgICAgICAgUmVzb3VyY2UgeGVzdCA9IGkubmV4dCgpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIFJlc291cmNlIG5leHQgPSBpLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChjLmNvbXBhcmUoeGVzdCwgbmV4dCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgeGVzdCA9IG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHhlc3Q7CisgICAgICAgIHJldHVybiBTdHJlYW1VdGlscy5pdGVyYXRvckFzU3RyZWFtKHJjLml0ZXJhdG9yKCkpLm1heChjKS5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBSZXNvdXJjZSBnZXRPbGRlc3QoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EaWFnbm9zdGljc1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RpYWdub3N0aWNzVGFzay5qYXZhCmluZGV4IGM3NDVjZmIuLjA1MDQ0OTIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RpYWdub3N0aWNzVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RpYWdub3N0aWNzVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZS5qYXZhCmluZGV4IDllMDg1ZTcuLjhhMTcwNjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Rpcm5hbWUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EaXJuYW1lLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02OCwxNSArNjgsMTQgQEAKICAgICAgKiBFeGVjdXRlIHRoaXMgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSBhdHRyaWJ1dGUgcmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgfQorICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIGZpbGUuZ2V0UGFyZW50KCkpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCmluZGV4IDZlMDhlY2QuLjFhZGI4MTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Vhci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTUsNiArNTUsNyBAQAogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgogICAgICAqICAgICAgICAgICAgIFVzZSBzZXREZXN0RmlsZShkZXN0ZmlsZSkgaW5zdGVhZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldEVhcmZpbGUoRmlsZSBlYXJGaWxlKSB7CiAgICAgICAgIHNldERlc3RGaWxlKGVhckZpbGUpOwogICAgIH0KQEAgLTY2LDkgKzY3LDkgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRBcHB4bWwoRmlsZSBkZXNjcikgewogICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlc2NyOwogICAgICAgICBpZiAoIWRlcGxveW1lbnREZXNjcmlwdG9yLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVwbG95bWVudERlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogJXMgZG9lcyBub3QgZXhpc3QuIiwKKyAgICAgICAgICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvcik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDcmVhdGUgYSBaaXBGaWxlU2V0IGZvciB0aGlzIGZpbGUsIGFuZCBwYXNzIGl0IHVwLgpAQCAtNzgsNyArNzksNiBAQAogICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEFkZHMgemlwZmlsZXNldC4KICAgICAgKgpAQCAtOTEsMTMgKzkxLDEzIEBACiAgICAgICAgIHN1cGVyLmFkZEZpbGVzZXQoZnMpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgb3V0cHV0IHN0cmVhbS4KICAgICAgKiBAcGFyYW0gek91dCB0aGUgemlwIG91dHB1dCBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBJL08gZXJyb3JzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBvdGhlciBlcnJvcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBpbml0WmlwT3V0cHV0U3RyZWFtKFppcE91dHB1dFN0cmVhbSB6T3V0KQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gSWYgbm8gd2VieG1sIGZpbGUgaXMgc3BlY2lmaWVkLCBpdCdzIGFuIGVycm9yLgpAQCAtMTE2LDYgKzExNiw3IEBACiAgICAgICogQHBhcmFtIG1vZGUgdGhlIFVuaXggcGVybWlzc2lvbnMgdG8gc2V0LgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCB6aXBGaWxlKEZpbGUgZmlsZSwgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTQ3LDYgKzE0OCw3IEBACiAgICAgICogTWFrZSBzdXJlIHdlIGRvbid0IHRoaW5rIHdlIGFscmVhZHkgaGF2ZSBhIGFwcGxpY2F0aW9uLnhtbCBuZXh0CiAgICAgICogdGltZSB0aGlzIHRhc2sgZ2V0cyBleGVjdXRlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewogICAgICAgICBkZXNjcmlwdG9yQWRkZWQgPSBmYWxzZTsKICAgICAgICAgc3VwZXIuY2xlYW5VcCgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNoby5qYXZhCmluZGV4IGYxZTEzYzguLmRlNjU5OTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSw3ICszMSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkxvZ091dHB1dFJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5TdHJpbmdSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBXcml0ZXMgYSBtZXNzYWdlIHRvIHRoZSBBbnQgbG9nZ2luZyBmYWNpbGl0aWVzLgpAQCAtNjEsMTUgKzYwLDEyIEBACiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIiIuZXF1YWxzKG1lc3NhZ2UpID8gU3RyaW5nVXRpbHMuTElORV9TRVAgOiBtZXNzYWdlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVzb3VyY2VVdGlscwotICAgICAgICAgICAgICAgICAgICAuY29weVJlc291cmNlKG5ldyBTdHJpbmdSZXNvdXJjZShtc2cpLCBvdXRwdXQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IExvZ091dHB1dFJlc291cmNlKHRoaXMsIGxvZ0xldmVsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgYXBwZW5kLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiLmVxdWFscyhlbmNvZGluZykgPyBudWxsIDogZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLCBmb3JjZSk7CisgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmNvcHlSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1Jlc291cmNlKG1lc3NhZ2UuaXNFbXB0eSgpID8gU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSA6IG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPT0gbnVsbCA/IG5ldyBMb2dPdXRwdXRSZXNvdXJjZSh0aGlzLCBsb2dMZXZlbCkgOiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgYXBwZW5kLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy5pc0VtcHR5KCkgPyBudWxsIDogZW5jb2RpbmcsIGdldFByb2plY3QoKSwgZm9yY2UpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvWE1MLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvWE1MLmphdmEKaW5kZXggNTUyNGMwZC4uMTIwM2MzYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1hNTC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9YTUwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC01OCw3ICs1Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIG5hbWVzcGFjZSBwb2xpY3kgZm9yIHRoZSB4bWwgZmlsZQotICAgICAqIEBwYXJhbSBuIG5hbWVzcGFjZSBwb2xpY3k6ICJpZ25vcmUsIiAiZWxlbWVudHNPbmx5LCIgb3IgImFsbCIKKyAgICAgKiBAcGFyYW0gbiBuYW1lc3BhY2UgcG9saWN5OiAiaWdub3JlIiwgImVsZW1lbnRzT25seSIsIG9yICJhbGwiCiAgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlUG9saWN5KE5hbWVzcGFjZVBvbGljeSBuKSB7CkBAIC03NywyNiArNzYsMTkgQEAKICAgICAgKiBFeGVjdXRlIHRoZSB0YXNrLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0gICAgICAgIERPTUVsZW1lbnRXcml0ZXIgd3JpdGVyID0KLSAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyKCFhcHBlbmQsIG5hbWVzcGFjZVBvbGljeS5nZXRQb2xpY3koKSk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBhcHBlbmQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcyA9IG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOb2RlIG4gPSBnZXRGcmFnbWVudCgpLmdldEZpcnN0Q2hpbGQoKTsKLSAgICAgICAgICAgIGlmIChuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fWE1MKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgTm9kZSBuID0gZ2V0RnJhZ21lbnQoKS5nZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19YTUwpOworICAgICAgICB9CisKKyAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3cml0ZXIgPSBuZXcgRE9NRWxlbWVudFdyaXRlcighYXBwZW5kLCBuYW1lc3BhY2VQb2xpY3kuZ2V0UG9saWN5KCkpOworICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IChmaWxlID09IG51bGwpID8gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKQorICAgICAgICAgICAgICAgIDogRmlsZVV0aWxzLm5ld091dHB1dFN0cmVhbShmaWxlLnRvUGF0aCgpLCBhcHBlbmQpKSB7CiAgICAgICAgICAgICB3cml0ZXIud3JpdGUoKEVsZW1lbnQpIG4sIG9zKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIHRocm93IGJlOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG9zKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE0LDYgKzEwNiw3IEBACiAgICAgICAgIHB1YmxpYyBOYW1lc3BhY2VQb2xpY3koU3RyaW5nIHMpIHsKICAgICAgICAgICAgIHNldFZhbHVlKHMpOwogICAgICAgICB9CisKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewpAQCAtMTI0LDE0ICsxMTcsMTUgQEAKICAgICAgICAgICAgIFN0cmluZyBzID0gZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIGlmIChJR05PUkUuZXF1YWxzSWdub3JlQ2FzZShzKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeS5JR05PUkU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEVMRU1FTlRTLmVxdWFsc0lnbm9yZUNhc2UocykpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChFTEVNRU5UUy5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgIERPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5Lk9OTFlfUVVBTElGWV9FTEVNRU5UUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoQUxMLmVxdWFsc0lnbm9yZUNhc2UocykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kuUVVBTElGWV9BTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBuYW1lc3BhY2UgcG9saWN5OiAiICsgcyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQUxMLmVxdWFsc0lnbm9yZUNhc2UocykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kuUVVBTElGWV9BTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgbmFtZXNwYWNlIHBvbGljeTogIiArIHMpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlYy5qYXZhCmluZGV4IDgyNDcwMjMuLmU5MjY4MTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCw2ICs0NCw3IEBACiAgKiAgICAgICAgICAgICBkZWxlZ2F0ZSB0byB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZSBFeGVjdXRlfQogICogICAgICAgICAgICAgaW5zdGVhZC4KICAqLworQERlcHJlY2F0ZWQKIHB1YmxpYyBjbGFzcyBFeGVjIGV4dGVuZHMgVGFzayB7CiAgICAgcHJpdmF0ZSBTdHJpbmcgb3M7CiAgICAgcHJpdmF0ZSBTdHJpbmcgb3V0OwpAQCAtNzAsNiArNzEsNyBAQAogICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBydW4oY29tbWFuZCk7CiAgICAgfQpAQCAtMTYwLDkgKzE2Miw4IEBACiAgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGVjIHJldHVybmVkOiAiICsgZXJyLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coIlJlc3VsdDogIiArIGVyciwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nKCJSZXN1bHQ6ICIgKyBlcnIsIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBleGVjOiAiICsgY29tbWFuZCwgaW9lLCBnZXRMb2NhdGlvbigpKTsKQEAgLTI2Miw2ICsyNjMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjVGFzay5qYXZhCmluZGV4IDMwZjY3M2EuLmU5MjUzNjkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEyNSw3ICsxMjUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoSW50ZWdlciB2YWx1ZSkgewogICAgICAgICBzZXRUaW1lb3V0KAotICAgICAgICAgICAgKExvbmcpICgodmFsdWUgPT0gbnVsbCkgPyBudWxsIDogbmV3IExvbmcodmFsdWUuaW50VmFsdWUoKSkpKTsKKyAgICAgICAgICAgICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiAobG9uZykgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4LDggKzE2OCw3IEBACiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmQoQ29tbWFuZGxpbmUgY21kbCkgewotICAgICAgICBsb2coIlRoZSBjb21tYW5kIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLlxuIgotICAgICAgICAgICAgKyAiUGxlYXNlIHVzZSB0aGUgZXhlY3V0YWJsZSBhdHRyaWJ1dGUgYW5kIG5lc3RlZCBhcmcgZWxlbWVudHMuIiwKKyAgICAgICAgbG9nKCJUaGUgY29tbWFuZCBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC5cblBsZWFzZSB1c2UgdGhlIGV4ZWN1dGFibGUgYXR0cmlidXRlIGFuZCBuZXN0ZWQgYXJnIGVsZW1lbnRzLiIsCiAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgdGhpcy5jbWRsID0gY21kbDsKICAgICB9CkBAIC0xOTIsOCArMTkxLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChGaWxlIGlucHV0KSB7CiAgICAgICAgIGlmIChpbnB1dFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBcImlucHV0XCIgYW5kIFwiaW5wdXRzdHJpbmdcIiAiCi0gICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBjYW5ub3QgYm90aCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIFwiaW5wdXRcIiBhbmQgXCJpbnB1dHN0cmluZ1wiIGF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwogICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOwpAQCAtMjA2LDggKzIwNSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5wdXRTdHJpbmcoU3RyaW5nIGlucHV0U3RyaW5nKSB7CiAgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBcImlucHV0XCIgYW5kIFwiaW5wdXRzdHJpbmdcIiAiCi0gICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBjYW5ub3QgYm90aCBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIFwiaW5wdXRcIiBhbmQgXCJpbnB1dHN0cmluZ1wiIGF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5pbnB1dFN0cmluZyA9IGlucHV0U3RyaW5nOwogICAgICAgICBpbmNvbXBhdGlibGVXaXRoU3Bhd24gPSB0cnVlOwpAQCAtNDg1LDYgKzQ4NCw3IEBACiAgICAgICogPGxpPnRoaXMgbGlzdCBpcyBub3QgZXhoYXVzdGl2ZSBvciBsaW1pdGF0aXZlPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyBRdWljayBmYWlsIGlmIHRoaXMgaXMgbm90IGEgdmFsaWQgT1MgZm9yIHRoZSBjb21tYW5kCiAgICAgICAgIGlmICghaXNWYWxpZE9zKCkpIHsKQEAgLTYzNCw5ICs2MzQsOCBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGltZW91dDoga2lsbGVkIHRoZSBzdWItcHJvY2VzcyI7CiAgICAgICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1heWJlU2V0UmVzdWx0UHJvcGVydHlWYWx1ZShyZXR1cm5Db2RlKTsKICAgICAgICAgICAgIHJlZGlyZWN0b3IuY29tcGxldGUoKTsKQEAgLTY0NCw5ICs2NDMsOCBAQAogICAgICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKSArICIgcmV0dXJuZWQ6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0dXJuQ29kZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJSZXN1bHQ6ICIgKyByZXR1cm5Db2RlLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coIlJlc3VsdDogIiArIHJldHVybkNvZGUsIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBleGUuc3Bhd24oKTsKQEAgLTY3Myw5ICs2NzEsOCBAQAogICAgICAgICAgICAgaWYgKGZhaWxJZkV4ZWNGYWlscykgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhlY3V0ZSBmYWlsZWQ6ICIgKyBlLnRvU3RyaW5nKCksIGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkV4ZWN1dGUgZmFpbGVkOiAiICsgZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJFeGVjdXRlIGZhaWxlZDogIiArIGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIC8vIGNsb3NlIHRoZSBvdXRwdXQgZmlsZSBpZiByZXF1aXJlZAogICAgICAgICAgICAgbG9nRmx1c2goKTsKQEAgLTcwMiw3ICs2OTksNyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBFeGVjdXRlV2F0Y2hkb2cgY3JlYXRlV2F0Y2hkb2coKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gKHRpbWVvdXQgPT0gbnVsbCkKLSAgICAgICAgICAgID8gbnVsbCA6IG5ldyBFeGVjdXRlV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICA/IG51bGwgOiBuZXcgRXhlY3V0ZVdhdGNoZG9nKHRpbWVvdXQpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZS5qYXZhCmluZGV4IDliNGMyNjguLjQwMmYzYzcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCwxMSArMjQsMTAgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zOCw3ICszNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubGF1bmNoZXIuQ29tbWFuZExhdW5jaGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogUnVucyBhbiBleHRlcm5hbCBwcm9ncmFtLgpAQCAtNTQsMTggKzUyLDYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gSW50ZWdlci5NQVhfVkFMVUU7CiAKLSAgICBwcml2YXRlIFN0cmluZ1tdIGNtZGwgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nW10gZW52ID0gbnVsbDsKLSAgICBwcml2YXRlIGludCBleGl0VmFsdWUgPSBJTlZBTElEOwotICAgIHByaXZhdGUgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZzsKLSAgICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3QgPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBuZXdFbnZpcm9ubWVudCA9IGZhbHNlOwotCi0gICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIFZNIGlzIHVzZWQgdG8gbGF1bmNoIGNvbW1hbmRzLCB3aGVyZSBwb3NzaWJsZS4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlVk1MYXVuY2hlciA9IHRydWU7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYW50V29ya2luZ0RpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb2NFbnZpcm9ubWVudCA9IG51bGw7CiAKQEAgLTgxLDYgKzY3LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIFN0cmluZ1tdIGNtZGwgPSBudWxsOworICAgIHByaXZhdGUgU3RyaW5nW10gZW52ID0gbnVsbDsKKyAgICBwcml2YXRlIGludCBleGl0VmFsdWUgPSBJTlZBTElEOworICAgIHByaXZhdGUgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgc3RyZWFtSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZzsKKyAgICBwcml2YXRlIEZpbGUgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3QgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBuZXdFbnZpcm9ubWVudCA9IGZhbHNlOworCisgICAgLyoqIENvbnRyb2xzIHdoZXRoZXIgdGhlIFZNIGlzIHVzZWQgdG8gbGF1bmNoIGNvbW1hbmRzLCB3aGVyZSBwb3NzaWJsZS4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlVk1MYXVuY2hlciA9IHRydWU7CisKICAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciBvciBub3QgeW91IHdhbnQgdGhlIHByb2Nlc3MgdG8gYmUgc3Bhd25lZC4KICAgICAgKiBEZWZhdWx0IGlzIG5vdCBzcGF3bmVkLgpAQCAtMTA0LDcgKzEwMiw3IEBACiAgICAgICogQHJldHVybiBhIG1hcCBjb250YWluaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiAgICAgICogQHNpbmNlIEFudCAxLjguMgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpIHsKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEVudmlyb25tZW50VmFyaWFibGVzKCkgewogICAgICAgICBpZiAocHJvY0Vudmlyb25tZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7CiAgICAgICAgIH0KQEAgLTExNyw3ICsxMTUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJvY0Vudmlyb25tZW50ID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHByb2NFbnZpcm9ubWVudCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKG5ldyBQdW1wU3RyZWFtSGFuZGxlcihvdXQpKTsKQEAgLTEzNSwzMyArMTMzLDMzIEBACiAgICAgICAgICAgICAgICAgcHJvY0Vudmlyb25tZW50ID0gZ2V0Vk1TTG9naWNhbHMoaW4pOwogICAgICAgICAgICAgICAgIHJldHVybiBwcm9jRW52aXJvbm1lbnQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgdmFyID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lLCBsaW5lU2VwID0gU3RyaW5nVXRpbHMuTElORV9TRVA7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHZhciA9IG51bGw7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCc9JykgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2h1bmsgcGFydCBvZiBwcmV2aW91cyBlbnYgdmFyIChVTklYIGVudiB2YXJzIGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBjb250YWluIGVtYmVkZGVkIG5ldyBsaW5lcykuCi0gICAgICAgICAgICAgICAgICAgIGlmICh2YXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyID0gbGluZVNlcCArIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgKz0gbGluZVNlcCArIGxpbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChsaW5lLmNvbnRhaW5zKCI9IikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gTmV3IGVudiB2YXIuLi5hcHBlbmQgdGhlIHByZXZpb3VzIG9uZSBpZiB3ZSBoYXZlIGl0LgogICAgICAgICAgICAgICAgICAgICBpZiAodmFyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcSA9IHZhci5pbmRleE9mKCI9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXEgPSB2YXIudG9TdHJpbmcoKS5pbmRleE9mKCc9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jRW52aXJvbm1lbnQucHV0KHZhci5zdWJzdHJpbmcoMCwgZXEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIuc3Vic3RyaW5nKGVxICsgMSkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhciA9IGxpbmU7CisgICAgICAgICAgICAgICAgICAgIHZhciA9IG5ldyBTdHJpbmdCdWlsZGVyKGxpbmUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENodW5rIHBhcnQgb2YgcHJldmlvdXMgZW52IHZhciAoVU5JWCBlbnYgdmFycyBjYW4KKyAgICAgICAgICAgICAgICAgICAgLy8gY29udGFpbiBlbWJlZGRlZCBuZXcgbGluZXMpLgorICAgICAgICAgICAgICAgICAgICBpZiAodmFyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9IG5ldyBTdHJpbmdCdWlsZGVyKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkgKyBsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhci5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSkuYXBwZW5kKGxpbmUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gU2luY2Ugd2UgImxvb2sgYWhlYWQiIGJlZm9yZSBhZGRpbmcsIHRoZXJlJ3Mgb25lIGxhc3QgZW52IHZhci4KICAgICAgICAgICAgIGlmICh2YXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBlcSA9IHZhci5pbmRleE9mKCI9Iik7CisgICAgICAgICAgICAgICAgaW50IGVxID0gdmFyLnRvU3RyaW5nKCkuaW5kZXhPZignPScpOwogICAgICAgICAgICAgICAgIHByb2NFbnZpcm9ubWVudC5wdXQodmFyLnN1YnN0cmluZygwLCBlcSksIHZhci5zdWJzdHJpbmcoZXEgKyAxKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgewogICAgICAgICAgICAgZXhjLnByaW50U3RhY2tUcmFjZSgpOyAvL05PU09OQVIKICAgICAgICAgICAgIC8vIEp1c3QgdHJ5IHRvIHNlZSBob3cgbXVjaCB3ZSBnb3QKICAgICAgICAgfQpAQCAtMTc3LDEwICsxNzUsOCBAQAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgVmVjdG9yPFN0cmluZz4gZ2V0UHJvY0Vudmlyb25tZW50KCkgewotICAgICAgICBWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICB2LmFkZChlbnRyeS5nZXRLZXkoKSArICI9IiArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAgICAgZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoKS5mb3JFYWNoKChrZXksIHZhbHVlKSAtPiB2LmFkZChrZXkgKyAiPSIgKyB2YWx1ZSkpOwogICAgICAgICByZXR1cm4gdjsKICAgICB9CiAKQEAgLTE5NSwxNiArMTkxLDE3IEBACiAgICAgICAgIGlmIChPcy5pc0ZhbWlseSgib3MvMiIpKSB7CiAgICAgICAgICAgICAvLyBPUy8yIC0gdXNlIHNhbWUgbWVjaGFuaXNtIGFzIFdpbmRvd3MgMjAwMAogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImNtZCIsICIvYyIsICJzZXQifTsKLSAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgid2luZG93cyIpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJ3aW5kb3dzIikpIHsKICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSdyZSBydW5uaW5nIHVuZGVyIFhQLzIwMDAvTlQgb3IgOTgvOTUKICAgICAgICAgICAgIGlmIChPcy5pc0ZhbWlseSgid2luOXgiKSkgewogICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgOTgvOTUKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiY29tbWFuZC5jb20iLCAiL2MiLCAic2V0In07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MgWFAvMjAwMC9OVC8yMDAzCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImNtZCIsICIvYyIsICJzZXQifTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgiei9vcyIpIHx8IE9zLmlzRmFtaWx5KCJ1bml4IikpIHsKKyAgICAgICAgICAgIC8vIFdpbmRvd3MgWFAvMjAwMC9OVC8yMDAzCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiY21kIiwgIi9jIiwgInNldCJ9OworICAgICAgICB9CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgiei9vcyIpIHx8IE9zLmlzRmFtaWx5KCJ1bml4IikpIHsKICAgICAgICAgICAgIC8vIE9uIG1vc3Qgc3lzdGVtcyBvbmUgY291bGQgdXNlOiAvYmluL3NoIC1jIGVudgogCiAgICAgICAgICAgICAvLyBTb21lIHN5c3RlbXMgaGF2ZSAvYmluL2Vudiwgb3RoZXJzIC91c3IvYmluL2VudiwganVzdCB0cnkKQEAgLTIxOCwxNiArMjE1LDE3IEBACiAgICAgICAgICAgICAgICAgY21kWzBdID0gImVudiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gY21kOwotICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikgfHwgT3MuaXNGYW1pbHkoIm9zLzQwMCIpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJuZXR3YXJlIikgfHwgT3MuaXNGYW1pbHkoIm9zLzQwMCIpKSB7CiAgICAgICAgICAgICAvLyByZWx5IG9uIFBBVEgKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJlbnYifTsKLSAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsic2hvdyIsICJsb2dpY2FsIn07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBNQUMgT1MgOSBhbmQgcHJldmlvdXMKLSAgICAgICAgICAgIC8vIFRPRE86IEkgaGF2ZSBubyBpZGVhIGhvdyB0byBnZXQgaXQsIHNvbWVvbmUgbXVzdCBmaXggaXQKLSAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CisgICAgICAgIGlmIChPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsic2hvdyIsICJsb2dpY2FsIn07CisgICAgICAgIH0KKyAgICAgICAgLy8gTUFDIE9TIDkgYW5kIHByZXZpb3VzCisgICAgICAgIC8vIFRPRE86IEkgaGF2ZSBubyBpZGVhIGhvdyB0byBnZXQgaXQsIHNvbWVvbmUgbXVzdCBmaXggaXQKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDQsMTMgKzI0MiwxMyBAQAogICAgICAgICBpZiAoT3MuaXNGYW1pbHkoInovb3MiKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gYm9zLnRvU3RyaW5nKCJDcDEwNDciKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvLyBub29wIGRlZmF1bHQgZW5jb2RpbmcgdXNlZAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKE9zLmlzRmFtaWx5KCJvcy80MDAiKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXR1cm4gYm9zLnRvU3RyaW5nKCJDcDUwMCIpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIG5vb3AgZGVmYXVsdCBlbmNvZGluZyB1c2VkCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQxNyw3ICs0MTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZW52LCBGaWxlIGRpciwgYm9vbGVhbiB1c2VWTSkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGRpciAhPSBudWxsICYmICFkaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIgKyAiIGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGRvZXNuJ3QgZXhpc3QuIiwgZGlyKTsKICAgICAgICAgfQogCiAgICAgICAgIENvbW1hbmRMYXVuY2hlciB2bUxhdW5jaGVyID0gQ29tbWFuZExhdW5jaGVyLmdldFZNTGF1bmNoZXIocHJvamVjdCk7CkBAIC00MzAsMTIgKzQyOCwxMiBAQAogICAgICAqIFJ1bnMgYSBwcm9jZXNzIGRlZmluZWQgYnkgdGhlIGNvbW1hbmQgbGluZSBhbmQgcmV0dXJucyBpdHMgZXhpdCBzdGF0dXMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgc3VicHJvY2VzcyBvciA8Y29kZT5JTlZBTElEPC9jb2RlPi4KLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGlmIGxhdW5jaGluZworICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gVGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIGlmIGxhdW5jaGluZwogICAgICAqICAgICAgICAgICAgb2YgdGhlIHN1YnByb2Nlc3MgZmFpbGVkLgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICh3b3JraW5nRGlyZWN0b3J5ICE9IG51bGwgJiYgIXdvcmtpbmdEaXJlY3RvcnkuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih3b3JraW5nRGlyZWN0b3J5ICsgIiBkb2Vzbid0IGV4aXN0LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBkb2Vzbid0IGV4aXN0LiIsIHdvcmtpbmdEaXJlY3RvcnkpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IGxhdW5jaChwcm9qZWN0LCBnZXRDb21tYW5kbGluZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKSwgd29ya2luZ0RpcmVjdG9yeSwKQEAgLTQ4NiwxMyArNDg0LDEzIEBACiAgICAgICogU3RhcnRzIGEgcHJvY2VzcyBkZWZpbmVkIGJ5IHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICogQW50IHdpbGwgbm90IHdhaXQgZm9yIHRoaXMgcHJvY2Vzcywgbm9yIGxvZyBpdHMgb3V0cHV0LgogICAgICAqCi0gICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gaXMgdGhyb3duLCBpZiBsYXVuY2hpbmcKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRoZSBleGNlcHRpb24gaXMgdGhyb3duLCBpZiBsYXVuY2hpbmcKICAgICAgKiAgICAgICAgICAgIG9mIHRoZSBzdWJwcm9jZXNzIGZhaWxlZC4KICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNwYXduKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHdvcmtpbmdEaXJlY3RvcnkgIT0gbnVsbCAmJiAhd29ya2luZ0RpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHdvcmtpbmdEaXJlY3RvcnkgKyAiIGRvZXNuJ3QgZXhpc3QuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGRvZXNuJ3QgZXhpc3QuIiwgd29ya2luZ0RpcmVjdG9yeSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgUHJvY2VzcyBwcm9jZXNzID0gbGF1bmNoKHByb2plY3QsIGdldENvbW1hbmRsaW5lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnZpcm9ubWVudCgpLCB3b3JraW5nRGlyZWN0b3J5LApAQCAtNjExLDcgKzYwOSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZW52OwogICAgICAgICB9CiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3NFbnYgPQotICAgICAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KGdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOworICAgICAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8PihnZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpKTsKICAgICAgICAgZm9yIChTdHJpbmcga2V5VmFsdWUgOiBlbnYpIHsKICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlWYWx1ZS5zdWJzdHJpbmcoMCwga2V5VmFsdWUuaW5kZXhPZignPScpKTsKICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGtleSBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBjb3B5CkBAIC02MjMsNyArNjIxLDcgQEAKIAogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG9zRW52SXRlbSA6IG9zRW52LmtleVNldCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE5iOiB1c2luZyBkZWZhdWx0IGxvY2FsZSBhcyBrZXkgaXMgYSBlbnYgbmFtZQotICAgICAgICAgICAgICAgICAgICBpZiAob3NFbnZJdGVtLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGtleS50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3NFbnZJdGVtLmVxdWFsc0lnbm9yZUNhc2Uoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCBjYXNlIG9mIHRoZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IG9zRW52SXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjM1LDExICs2MzMsOCBAQAogICAgICAgICAgICAgb3NFbnYucHV0KGtleSwga2V5VmFsdWUuc3Vic3RyaW5nKGtleS5sZW5ndGgoKSArIDEpKTsKICAgICAgICAgfQogCi0gICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiBvc0Vudi5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBsLmFkZChlbnRyeS5nZXRLZXkoKSArICI9IiArIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsLnRvQXJyYXkobmV3IFN0cmluZ1tvc0Vudi5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIG9zRW52LmVudHJ5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgIC5tYXAoZSAtPiBlLmdldEtleSgpICsgIj0iICsgZS5nZXRWYWx1ZSgpKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjUwLDcgKzY0NSw3IEBACiAgICAgICogQHBhcmFtIGNtZGxpbmUgVGhlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGRvZXMgbm90IGV4aXQgc3VjY2Vzc2Z1bGx5LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBydW5Db21tYW5kKFRhc2sgdGFzaywgU3RyaW5nW10gY21kbGluZSkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcnVuQ29tbWFuZChUYXNrIHRhc2ssIFN0cmluZy4uLiBjbWRsaW5lKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgdGFzay5sb2coQ29tbWFuZGxpbmUuZGVzY3JpYmVDb21tYW5kKGNtZGxpbmUpLApAQCAtNjY0LDcgKzY1OSw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNtZGxpbmVbMF0KICAgICAgICAgICAgICAgICAgICAgKyAiIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICIgKyByZXR2YWwsIHRhc2suZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXhjKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgbGF1bmNoICIgKyBjbWRsaW5lWzBdICsgIjogIgogICAgICAgICAgICAgICAgICsgZXhjLCB0YXNrLmdldExvY2F0aW9uKCkpOwogICAgICAgICB9CkBAIC02OTQsOSArNjg5LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFZNU0xvZ2ljYWxzKEJ1ZmZlcmVkUmVhZGVyIGluKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBsb2dpY2FscyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvZ2ljYWxzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBTdHJpbmcgbG9nTmFtZSA9IG51bGwsIGxvZ1ZhbHVlID0gbnVsbCwgbmV3TG9nTmFtZTsKLSAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICBTdHJpbmcgbGluZTsKICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gcGFyc2UgdGhlIFZNUyBsb2dpY2FscyBpbnRvIHJlcXVpcmVkIGZvcm1hdCAoIlZBUj1WQUxbLFZBTDJdIikKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YS5qYXZhCmluZGV4IDA4ZmQ4Y2QuLjA5NjRjOTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZUphdmEuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTk3LDYgKzk3LDcgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueC4KICAgICAgKiAgICAgICAgICAgICBtYW5hZ2Ugb3V0cHV0IGF0IHRoZSB0YXNrIGxldmVsLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KFByaW50U3RyZWFtIG91dCkgewogICAgIH0KIApAQCAtMTIyLDcgKzEyMyw3IEBACiAgICAgICAgICAgICBpZiAoc3lzUHJvcGVydGllcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgc3lzUHJvcGVydGllcy5zZXRTeXN0ZW0oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENsYXNzPD8+IHRhcmdldCA9IG51bGw7CisgICAgICAgICAgICBDbGFzczw/PiB0YXJnZXQ7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CkBAIC0xMzcsMTggKzEzOCwxOCBAQAogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSwgdHJ1ZSwgbG9hZGVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kICIgKyBjbGFzc25hbWUgKyAiLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIE1ha2Ugc3VyZSB5b3UgaGF2ZSBpdCBpbiB5b3VyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgJXMuIE1ha2Ugc3VyZSB5b3UgaGF2ZSBpdCBpbiB5b3VyIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYWluID0gdGFyZ2V0LmdldE1ldGhvZCgibWFpbiIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzc30pOworICAgICAgICAgICAgbWFpbiA9IHRhcmdldC5nZXRNZXRob2QoIm1haW4iLCBTdHJpbmdbXS5jbGFzcyk7CiAgICAgICAgICAgICBpZiAobWFpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBtYWluKCkgbWV0aG9kIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgbWFpbigpIG1ldGhvZCBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKG1haW4uZ2V0TW9kaWZpZXJzKCkgJiBNb2RpZmllci5TVEFUSUMpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm1haW4oKSBtZXRob2QgaW4gIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGRlY2xhcmVkIHN0YXRpYyIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIm1haW4oKSBtZXRob2QgaW4gJXMgaXMgbm90IGRlY2xhcmVkIHN0YXRpYyIsIGNsYXNzbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcnVuKCk7IC8vTk9TT05BUgpAQCAtMTYzLDcgKzE2NCw3IEBACiAgICAgICAgICAgICAgICAgLy8gbWFpbiB0aHJlYWQgd2lsbCBzdGlsbCBiZSB0aGVyZSB0byBsZXQgdGhlIG5ldyB0aHJlYWQKICAgICAgICAgICAgICAgICAvLyBmaW5pc2gKICAgICAgICAgICAgICAgICB0aHJlYWQuc2V0RGFlbW9uKHRydWUpOwotICAgICAgICAgICAgICAgIFdhdGNoZG9nIHcgPSBuZXcgV2F0Y2hkb2codGltZW91dC5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgV2F0Y2hkb2cgdyA9IG5ldyBXYXRjaGRvZyh0aW1lb3V0KTsKICAgICAgICAgICAgICAgICB3LmFkZFRpbWVvdXRPYnNlcnZlcih0aGlzKTsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CkBAIC0xODcsMTIgKzE4OCw3IEBACiAgICAgICAgICAgICBpZiAoY2F1Z2h0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBjYXVnaHQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKFRocmVhZERlYXRoIGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gY291bGQgcGVyaGFwcyBhbHNvIGNhbGwgdGhyZWFkLnN0b3AoKTsgbm90IHN1cmUgaWYgYW55b25lIGNhcmVzCisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIHwgVGhyZWFkRGVhdGggfCBTZWN1cml0eUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwpAQCAtMjEyLDYgKzIwOCw3IEBACiAgICAgICogUnVuIHRoaXMgRXhlY3V0ZUphdmEgaW4gYSBUaHJlYWQuCiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3VtZW50ID0ge2phdmFDb21tYW5kLmdldEFyZ3VtZW50cygpfTsKICAgICAgICAgdHJ5IHsKQEAgLTI0Miw2ICsyMzksNyBAQAogICAgICAqIEBwYXJhbSB3IHRoZSByZXNwb25zaWJsZSBXYXRjaGRvZy4KICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB0aW1lb3V0T2NjdXJlZChXYXRjaGRvZyB3KSB7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gbnVsbCkgewogICAgICAgICAgICAgdGltZWRPdXQgPSB0cnVlOwpAQCAtMjg2LDcgKzI4NCw3IEBACiAgICAgICAgICAgICA9IG5ldyBFeGVjdXRlKHJlZGlyZWN0b3IuY3JlYXRlSGFuZGxlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IEV4ZWN1dGVXYXRjaGRvZyh0aW1lb3V0LmxvbmdWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IEV4ZWN1dGVXYXRjaGRvZyh0aW1lb3V0KSk7CiAgICAgICAgIGV4ZS5zZXRBbnRSdW4ocGMuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJvcGVudm1zIikpIHsKICAgICAgICAgICAgIHNldHVwQ29tbWFuZExpbmVGb3JWTVMoZXhlLCBjbWRsLmdldENvbW1hbmRsaW5lKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZU9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlT24uamF2YQppbmRleCA0NGE3OTc3Li42YjdmM2I5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlT24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlT24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDcgKzIwLDkgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC02MSw4ICs2Myw5IEBACiAgICAgLy8gc3dpdGNoaW5nIHR5cGUgdG8gImRpciIgd2hlbiB3ZSBlbmNvdW50ZXIgYSBEaXJTZXQgdGhhdCB3b3VsZAogICAgIC8vIGJlIG1vcmUgZGlmZmljdWx0IHRvIGFjaGlldmUgb3RoZXJ3aXNlLgogCi0gICAgcHJvdGVjdGVkIFZlY3RvcjxBYnN0cmFjdEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3RvcjxBYnN0cmFjdEZpbGVTZXQ+KCk7IC8vIGNvbnRhaW5zIEFic3RyYWN0RmlsZVNldAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChib3RoIERpclNldCBhbmQgRmlsZVNldCkKKyAgICAvLyAoYm90aCBEaXJTZXQgYW5kIEZpbGVTZXQpCisgICAgcHJvdGVjdGVkIFZlY3RvcjxBYnN0cmFjdEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3Rvcjw+KCk7CisKICAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlcyA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIHJlbGF0aXZlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIHBhcmFsbGVsID0gZmFsc2U7CkBAIC0yOTcsNiArMzAwLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIEV4ZWN1dGVPbiBpbnN0YW5jZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB7CiAvLyAgICAgKiBAVE9ETyB1c2luZyB0YXNrTmFtZSBoZXJlIGlzIGJyaXR0bGUsIGFzIGEgdXNlciBjb3VsZCBvdmVycmlkZSBpdC4KIC8vICAgICAqICAgICAgIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIG1vZGlmaWVkIHRvIHVzZSB0aGUgY2xhc3NuYW1lIGluc3RlYWQuCkBAIC0zMDQsNyArMzA4LDcgQEAKICAgICAgICAgICAgIGxvZygiISEgZXhlY29uIGlzIGRlcHJlY2F0ZWQuIFVzZSBhcHBseSBpbnN0ZWFkLiAhISIpOwogICAgICAgICB9CiAgICAgICAgIHN1cGVyLmNoZWNrQ29uZmlndXJhdGlvbigpOwotICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpID09IDAgJiYgcmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgICAgaWYgKGZpbGVzZXRzLmlzRW1wdHkoKSAmJiByZXNvdXJjZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyByZXNvdXJjZXMgc3BlY2lmaWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpAQCAtMzI3LDYgKzMzMSw3IEBACiAgICAgICogQHJldHVybiA8Y29kZT5FeGVjdXRlU3RyZWFtSGFuZGxlcjwvY29kZT4uCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgY3JlYXRlSGFuZGxlcigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vaWYgd2UgaGF2ZSBhIFJlZGlyZWN0b3JFbGVtZW50LCByZXR1cm4gYSBkZWNveQogICAgICAgICByZXR1cm4gKHJlZGlyZWN0b3JFbGVtZW50ID09IG51bGwpID8gc3VwZXIuY3JlYXRlSGFuZGxlcigpIDogbmV3IFB1bXBTdHJlYW1IYW5kbGVyKCk7CkBAIC0zMzUsNiArMzQwLDcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdXAgdGhlIEkvTyBSZWRpcmVjdG9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldHVwUmVkaXJlY3RvcigpIHsKICAgICAgICAgc3VwZXIuc2V0dXBSZWRpcmVjdG9yKCk7CiAgICAgICAgIHJlZGlyZWN0b3Iuc2V0QXBwZW5kUHJvcGVydGllcyh0cnVlKTsKQEAgLTM0NSwyMyArMzUxLDIxIEBACiAgICAgICogQHBhcmFtIGV4ZSB0aGUgRXhlY3V0ZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIGV4dGVybmFsIHByb2Nlc3MuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHJ1bkV4ZWMoRXhlY3V0ZSBleGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCB0b3RhbEZpbGVzID0gMDsKICAgICAgICAgaW50IHRvdGFsRGlycyA9IDA7CiAgICAgICAgIGJvb2xlYW4gaGF2ZUV4ZWN1dGVkID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBmaWxlTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgICAgIFZlY3RvcjxGaWxlPiBiYXNlRGlycyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gZmlsZXNldHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVOYW1lcyA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICAgICAgVmVjdG9yPEZpbGU+IGJhc2VEaXJzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgICAgICBmb3IgKEFic3RyYWN0RmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRUeXBlID0gdHlwZTsKLSAgICAgICAgICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZnMgPSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CiAgICAgICAgICAgICAgICAgaWYgKGZzIGluc3RhbmNlb2YgRGlyU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghRmlsZURpckJvdGguRElSLmVxdWFscyh0eXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGb3VuZCBhIG5lc3RlZCBkaXJzZXQgYnV0IHR5cGUgaXMgIiArIHR5cGUgKyAiLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGVtcG9yYXJpbHkgc3dpdGNoaW5nIHRvIHR5cGU9XCJkaXJcIiBvbiB0aGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzc3VtcHRpb24gdGhhdCB5b3UgcmVhbGx5IGRpZCBtZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiA8ZGlyc2V0PiBub3QgPGZpbGVzZXQ+LiIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUZW1wb3JhcmlseSBzd2l0Y2hpbmcgdG8gdHlwZT1cImRpclwiIG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91IHJlYWxseSBkaWQgbWVhbiA8ZGlyc2V0PiBub3QgPGZpbGVzZXQ+LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFR5cGUgPSBGaWxlRGlyQm90aC5ESVI7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0zODMsMjEgKzM4NywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMuYWRkKGJhc2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZXMuc2l6ZSgpID09IDAgJiYgc2tpcEVtcHR5KSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lcy5pc0VtcHR5KCkgJiYgc2tpcEVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZ1NraXBwaW5nRmlsZXNldChjdXJyZW50VHlwZSwgZHMsIGJhc2UpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbGxlbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmNvcHlJbnRvKHMpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBnZXRDb21tYW5kbGluZShzW2pdLCBiYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3JjRmlsZSA6IGZpbGVOYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gY29tbWFuZCA9IGdldENvbW1hbmRsaW5lKHNyY0ZpbGUsIGJhc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKENvbW1hbmRsaW5lLmRlc2NyaWJlQ29tbWFuZChjb21tYW5kKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY29tbWFuZCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dXBSZWRpcmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RvckVsZW1lbnQuY29uZmlndXJlKHJlZGlyZWN0b3IsIHNbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0b3JFbGVtZW50LmNvbmZpZ3VyZShyZWRpcmVjdG9yLCBzcmNGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRpcmVjdG9yRWxlbWVudCAhPSBudWxsIHx8IGhhdmVFeGVjdXRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gcmVzZXQgdGhlIHN0cmVhbSBoYW5kbGVyIHRvIHJlc3RhcnQKQEAgLTQwOCw4ICs0MTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUV4ZWN1dGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJhc2VEaXJzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC00NjMsMTIgKzQ2NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhlY3V0ZShleGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZUV4ZWN1dGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lcy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZURpcnMuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbGxlbCAmJiAoZmlsZU5hbWVzLnNpemUoKSA+IDAgfHwgIXNraXBFbXB0eSkpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbGxlbCAmJiAoIWZpbGVOYW1lcy5pc0VtcHR5KCkgfHwgIXNraXBFbXB0eSkpIHsKICAgICAgICAgICAgICAgICBydW5QYXJhbGxlbChleGUsIGZpbGVOYW1lcywgYmFzZURpcnMpOwogICAgICAgICAgICAgICAgIGhhdmVFeGVjdXRlZCA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC01MTMsMzEgKzUxNSwzMSBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb21tYW5kbGluZShTdHJpbmdbXSBzcmNGaWxlcywgRmlsZVtdIGJhc2VEaXJzKSB7CiAgICAgICAgIGZpbmFsIGNoYXIgZmlsZVNlcGFyYXRvciA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICAgICAgVmVjdG9yPFN0cmluZz4gdGFyZ2V0cyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBMaXN0PFN0cmluZz4gdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBpZiAodGFyZ2V0RmlsZVBvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBhZGRlZEZpbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gYWRkZWRGaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNyY0ZpbGUgOiBzcmNGaWxlcykgewogICAgICAgICAgICAgICAgIFN0cmluZ1tdIHN1YlRhcmdldHMgPSBtYXBwZXIubWFwRmlsZU5hbWUoc3JjRmlsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHN1YlRhcmdldHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHN1YlRhcmdldHMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVsYXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmV3IEZpbGUoZGVzdERpciwgc3ViVGFyZ2V0c1tqXSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHN1YlRhcmdldCA6IHN1YlRhcmdldHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN1YlRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN1YlRhcmdldHNbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5ldyBGaWxlKGRlc3REaXIsIHN1YlRhcmdldCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9yd2FyZFNsYXNoICYmIGZpbGVTZXBhcmF0b3IgIT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShmaWxlU2VwYXJhdG9yLCAnLycpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhZGRlZEZpbGVzLmNvbnRhaW5zKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHMuYWRkKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkRmlsZXMuYWRkKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHRhcmdldEZpbGVzID0gKFN0cmluZ1tdKSB0YXJnZXRzLnRvQXJyYXkobmV3IFN0cmluZ1t0YXJnZXRzLnNpemUoKV0pOworICAgICAgICBTdHJpbmdbXSB0YXJnZXRGaWxlcyA9IHRhcmdldHMudG9BcnJheShuZXcgU3RyaW5nW3RhcmdldHMuc2l6ZSgpXSk7CiAKICAgICAgICAgaWYgKCFhZGRTb3VyY2VGaWxlKSB7CiAgICAgICAgICAgICBzcmNGaWxlcyA9IG5ldyBTdHJpbmdbMF07CkBAIC02MTMsOCArNjE1LDggQEAKICAgICAgICAgICAgIGlmIChmb3J3YXJkU2xhc2ggJiYgZmlsZVNlcGFyYXRvciAhPSAnLycpIHsKICAgICAgICAgICAgICAgICBzcmMgPSBzcmMucmVwbGFjZShmaWxlU2VwYXJhdG9yLCAnLycpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY0ZpbGVQb3MgIT0gbnVsbCAmJiAoc3JjRmlsZVBvcy5nZXRQcmVmaXgoKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgc3JjRmlsZVBvcy5nZXRTdWZmaXgoKS5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICBpZiAoc3JjRmlsZVBvcyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmICghc3JjRmlsZVBvcy5nZXRQcmVmaXgoKS5pc0VtcHR5KCkgfHwgIXNyY0ZpbGVQb3MuZ2V0U3VmZml4KCkuaXNFbXB0eSgpKSkgewogICAgICAgICAgICAgICAgIHNyYyA9IHNyY0ZpbGVQb3MuZ2V0UHJlZml4KCkgKyBzcmMgKyBzcmNGaWxlUG9zLmdldFN1ZmZpeCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzdWx0W3NyY0luZGV4ICsgaV0gPSBzcmM7CkBAIC02ODUsMTAgKzY4Nyw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgcnVuUGFyYWxsZWwoRXhlY3V0ZSBleGUsIFZlY3RvcjxTdHJpbmc+IGZpbGVOYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8RmlsZT4gYmFzZURpcnMpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmdbXSBzID0gbmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXTsKLSAgICAgICAgZmlsZU5hbWVzLmNvcHlJbnRvKHMpOwotICAgICAgICBGaWxlW10gYiA9IG5ldyBGaWxlW2Jhc2VEaXJzLnNpemUoKV07Ci0gICAgICAgIGJhc2VEaXJzLmNvcHlJbnRvKGIpOworICAgICAgICBTdHJpbmdbXSBzID0gZmlsZU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWxlTmFtZXMuc2l6ZSgpXSk7CisgICAgICAgIEZpbGVbXSBiID0gYmFzZURpcnMudG9BcnJheShuZXcgRmlsZVtiYXNlRGlycy5zaXplKCldKTsKIAogICAgICAgICBpZiAobWF4UGFyYWxsZWwgPD0gMCB8fCBzLmxlbmd0aCA9PSAwIC8qIHRoaXMgaXMgc2tpcEVtcHR5ID09IGZhbHNlICovKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gZ2V0Q29tbWFuZGxpbmUocywgYik7CkBAIC03MzksNyArNzM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnNlcnRQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgpIHsKLSAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA9PSAwICYmIHN1ZmZpeC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChwcmVmaXguaXNFbXB0eSgpICYmIHN1ZmZpeC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodGFyZ2V0RmlsZXMsIDAsIGFyZ3VtZW50cywgaW5zZXJ0UG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldEZpbGVzLmxlbmd0aCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC03NTksMTEgKzc1OSwxMyBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFID0gImZpbGUiOwogICAgICAgICAvKiogRGlyIHZhbHVlICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUiA9ICJkaXIiOworCiAgICAgICAgIC8qKgorICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICAqIEBzZWUgRW51bWVyYXRlZEF0dHJpYnV0ZSNnZXRWYWx1ZXMKICAgICAgICAgICovCi0gICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLwotICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7RklMRSwgRElSLCAiYm90aCJ9OwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVN0cmVhbUhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVTdHJlYW1IYW5kbGVyLmphdmEKaW5kZXggMWM1Zjk3My4uMGU5MWZmNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVN0cmVhbUhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlU3RyZWFtSGFuZGxlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlV2F0Y2hkb2cuamF2YQppbmRleCBjYzM5MzNlLi43YTI5NjY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlV2F0Y2hkb2cuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlV2F0Y2hkb2cuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc0LDYgKzc0LDcgQEAKICAgICAgKiAgICAgICAgICAgICBVc2UgY29uc3RydWN0b3Igd2l0aCBhIGxvbmcgdHlwZSBpbnN0ZWFkLgogICAgICAqICgxLjQueCBjb21wYXRpYmlsaXR5KQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEV4ZWN1dGVXYXRjaGRvZyhpbnQgdGltZW91dCkgewogICAgICAgICB0aGlzKChsb25nKSB0aW1lb3V0KTsKICAgICB9CkBAIC04MSw3ICs4Miw3IEBACiAgICAgLyoqCiAgICAgICogV2F0Y2hlcyB0aGUgZ2l2ZW4gcHJvY2VzcyBhbmQgdGVybWluYXRlcyBpdCwgaWYgaXQgcnVucyBmb3IgdG9vIGxvbmcuCiAgICAgICogQWxsIGluZm9ybWF0aW9uIGZyb20gdGhlIHByZXZpb3VzIHJ1biBhcmUgcmVzZXQuCi0gICAgICogQHBhcmFtIHByb2Nlc3MgdGhlIHByb2Nlc3MgdG8gbW9uaXRvci4gSXQgY2Fubm90IGJlIDx0dD5udWxsPC90dD4KKyAgICAgKiBAcGFyYW0gcHJvY2VzcyB0aGUgcHJvY2VzcyB0byBtb25pdG9yLiBJdCBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBhIHByb2Nlc3MgaXMgc3RpbGwgYmVpbmcgbW9uaXRvcmVkLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChQcm9jZXNzIHByb2Nlc3MpIHsKQEAgLTExMiw2ICsxMTMsNyBAQAogICAgICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBpbiB0aGUgd2F0Y2hkb2cgdGhyZWFkCiAgICAgICogQHBhcmFtIHcgdGhlIHdhdGNoZG9nCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRpbWVvdXRPY2N1cmVkKFdhdGNoZG9nIHcpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0xNTgsOCArMTYwLDggQEAKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgd2F0Y2hkb2cgaXMgc3RpbGwgbW9uaXRvcmluZyB0aGUgcHJvY2Vzcy4KLSAgICAgKiBAcmV0dXJuICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcsIG90aGVyd2lzZQotICAgICAqICAgICAgICAgIDx0dD5mYWxzZTwvdHQ+LgorICAgICAqIEByZXR1cm4gIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9jZXNzIGlzIHN0aWxsIHJ1bm5pbmcsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1dhdGNoaW5nKCkgewogICAgICAgICByZXR1cm4gd2F0Y2g7CkBAIC0xNjcsMTEgKzE2OSwxMCBAQAogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGxhc3QgcHJvY2VzcyBydW4gd2FzIGtpbGxlZCBvbiB0aW1lb3V0IG9yIG5vdC4KLSAgICAgKiBAcmV0dXJuICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBwcm9jZXNzIHdhcyBraWxsZWQgb3RoZXJ3aXNlCi0gICAgICogICAgICAgICAgPHR0PmZhbHNlPC90dD4uCisgICAgICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByb2Nlc3Mgd2FzIGtpbGxlZCBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4ga2lsbGVkUHJvY2VzcygpIHsKICAgICAgICAgcmV0dXJuIGtpbGxlZFByb2Nlc3M7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGl0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGl0LmphdmEKaW5kZXggM2Y4MjMwMi4uNmVmMjc0YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhpdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4aXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUwLDEyICs1MCwxMyBAQAogcHVibGljIGNsYXNzIEV4aXQgZXh0ZW5kcyBUYXNrIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5lc3RlZENvbmRpdGlvbiBleHRlbmRzIENvbmRpdGlvbkJhc2UgaW1wbGVtZW50cyBDb25kaXRpb24geworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKICAgICAgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSAhPSAxKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiQSBzaW5nbGUgbmVzdGVkIGNvbmRpdGlvbiBpcyByZXF1aXJlZC4iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoKENvbmRpdGlvbikgKGdldENvbmRpdGlvbnMoKS5uZXh0RWxlbWVudCgpKSkuZXZhbCgpOworICAgICAgICAgICAgcmV0dXJuIGdldENvbmRpdGlvbnMoKS5uZXh0RWxlbWVudCgpLmV2YWwoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE2LDcgKzExNyw3IEBACiAgICAgICogQHBhcmFtIGkgICB0aGUgPGNvZGU+aW50PC9jb2RlPiBzdGF0dXMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IGkpIHsKLSAgICAgICAgc3RhdHVzID0gSW50ZWdlci52YWx1ZU9mKGkpOworICAgICAgICBzdGF0dXMgPSBpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTMxLDIwICsxMzIsMTkgQEAKICAgICAgKiB0aGUgaWYgYW5kIHVubGVzcyBwYXJhbWV0ZXJzIChpZiBwcmVzZW50KS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gZmFpbCA9IChuZXN0ZWRDb25kaXRpb25QcmVzZW50KCkpID8gdGVzdE5lc3RlZENvbmRpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgICA6ICh0ZXN0SWZDb25kaXRpb24oKSAmJiB0ZXN0VW5sZXNzQ29uZGl0aW9uKCkpOwogICAgICAgICBpZiAoZmFpbCkgewogICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIW1lc3NhZ2UudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRleHQgPSBtZXNzYWdlLnRyaW0oKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlmQ29uZGl0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyhpZkNvbmRpdGlvbikKLSAgICAgICAgICAgICAgICAgICAgJiYgdGVzdElmQ29uZGl0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoaWZDb25kaXRpb24pICYmIHRlc3RJZkNvbmRpdGlvbigpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiaWY9IiArIGlmQ29uZGl0aW9uOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodW5sZXNzQ29uZGl0aW9uICE9IG51bGwgJiYgISIiLmVxdWFscyh1bmxlc3NDb25kaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICYmIHRlc3RVbmxlc3NDb25kaXRpb24oKSkgeworICAgICAgICAgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eSh1bmxlc3NDb25kaXRpb24pICYmIHRlc3RVbmxlc3NDb25kaXRpb24oKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIiI7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNTQsMTggKzE1NCwyMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29uZGl0aW9uUHJlc2VudCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiY29uZGl0aW9uIHNhdGlzZmllZCI7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9ICJObyBtZXNzYWdlIjsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSAiTm8gbWVzc2FnZSI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9nKCJmYWlsaW5nIGR1ZSB0byAiICsgdGV4dCwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgdGhyb3cgKChzdGF0dXMgPT0gbnVsbCkgPyBuZXcgQnVpbGRFeGNlcHRpb24odGV4dCkKLSAgICAgICAgICAgICA6IG5ldyBFeGl0U3RhdHVzRXhjZXB0aW9uKHRleHQsIHN0YXR1cy5pbnRWYWx1ZSgpKSk7CisgICAgICAgICAgICB0aHJvdyBzdGF0dXMgPT0gbnVsbCA/IG5ldyBCdWlsZEV4Y2VwdGlvbih0ZXh0KQorICAgICAgICAgICAgICAgIDogbmV3IEV4aXRTdGF0dXNFeGNlcHRpb24odGV4dCwgc3RhdHVzKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgYm9vbGVhbiBpc051bGxPckVtcHR5KE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModmFsdWUpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldCBhIG11bHRpbGluZSBtZXNzYWdlLgogICAgICAqIEBwYXJhbSBtc2cgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQpAQCAtMjE3LDggKzIxOSw4IEBACiAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gbmVzdGVkQ29uZGl0aW9uUHJlc2VudCgpOwogCiAgICAgICAgIGlmIChyZXN1bHQgJiYgaWZDb25kaXRpb24gIT0gbnVsbCB8fCB1bmxlc3NDb25kaXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOZXN0ZWQgY29uZGl0aW9ucyAiCi0gICAgICAgICAgICAgICAgKyAibm90IHBlcm1pdHRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGlmL3VubGVzcyBhdHRyaWJ1dGVzIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk5lc3RlZCBjb25kaXRpb25zIG5vdCBwZXJtaXR0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCBpZi91bmxlc3MgYXR0cmlidXRlcyIpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlc3VsdCAmJiBuZXN0ZWRDb25kaXRpb24uZXZhbCgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhwYW5kLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeHBhbmQuamF2YQppbmRleCAwMzlmMjAzLi4xOWYyN2ZiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeHBhbmQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeHBhbmQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEzICsyMCwxNCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtNTgsMTIgKzU5LDE5IEBACiAgKiAgICAgICAgICAgbmFtZT0idW53YXIiCiAgKi8KIHB1YmxpYyBjbGFzcyBFeHBhbmQgZXh0ZW5kcyBUYXNrIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfRU5DT0RJTkcgPSAibmF0aXZlLWVuY29kaW5nIjsKKworICAgIC8qKiBFcnJvciBtZXNzYWdlIHdoZW4gbW9yZSB0aGF0IG9uZSBtYXBwZXIgaXMgZGVmaW5lZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01VTFRJUExFX01BUFBFUlMgPSAiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7CiAgICAgcHJpdmF0ZSBGaWxlIGRlc3Q7IC8vcmVxCiAgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZTsgLy8gcmVxCiAgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJ3cml0ZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBNYXBwZXIgbWFwcGVyRWxlbWVudCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBWZWN0b3I8UGF0dGVyblNldD4gcGF0dGVybnNldHMgPSBuZXcgVmVjdG9yPFBhdHRlcm5TZXQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFBhdHRlcm5TZXQ+IHBhdHRlcm5zZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgcHJpdmF0ZSBVbmlvbiByZXNvdXJjZXMgPSBuZXcgVW5pb24oKTsKICAgICBwcml2YXRlIGJvb2xlYW4gcmVzb3VyY2VzU3BlY2lmaWVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVtcHR5QXJjaGl2ZSA9IGZhbHNlOwpAQCAtNzEsMTMgKzc5LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gc2NhbkZvclVuaWNvZGVFeHRyYUZpZWxkcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBCb29sZWFuIGFsbG93RmlsZXNUb0VzY2FwZURlc3QgPSBudWxsOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFUSVZFX0VOQ09ESU5HID0gIm5hdGl2ZS1lbmNvZGluZyI7Ci0KICAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKLSAgICAvKiogRXJyb3IgbWVzc2FnZSB3aGVuIG1vcmUgdGhhdCBvbmUgbWFwcGVyIGlzIGRlZmluZWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9NVUxUSVBMRV9NQVBQRVJTID0gIkNhbm5vdCBkZWZpbmUgbW9yZSB0aGFuIG9uZSBtYXBwZXIiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFuIEV4cGFuZCBpbnN0YW5jZSBhbmQgc2V0cyBlbmNvZGluZyB0byBVVEYtOC4KQEAgLTEyMSwxNCArMTIzLDE1IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIFRocm93biBpbiB1bnJlY292ZXJhYmxlIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoImV4cGFuZCIuZXF1YWxzKGdldFRhc2tUeXBlKCkpKSB7CiAgICAgICAgICAgICBsb2coIiEhIGV4cGFuZCBpcyBkZXByZWNhdGVkLiBVc2UgdW56aXAgaW5zdGVhZC4gISEiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbCAmJiAhcmVzb3VyY2VzU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyBhdHRyaWJ1dGUgYW5kL29yIHJlc291cmNlcyBtdXN0IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic3JjIGF0dHJpYnV0ZSBhbmQvb3IgcmVzb3VyY2VzIG11c3QgYmUgc3BlY2lmaWVkIik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7CkBAIC0xNDQsMTMgKzE0NywxNCBAQAogICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcmMgbXVzdCBub3QgYmUgYSBkaXJlY3RvcnkuIgogICAgICAgICAgICAgICAgICAgICArICIgVXNlIG5lc3RlZCBmaWxlc2V0cyBpbnN0ZWFkLiIsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc291cmNlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgJyIgKyBzb3VyY2UgKyAiJyBkb2Vzbid0IGV4aXN0LiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc291cmNlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjICciICsgc291cmNlICsgIicgY2Fubm90IGJlIHJlYWQuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGV4cGFuZEZpbGUoRklMRV9VVElMUywgc291cmNlLCBkZXN0KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc291cmNlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgJyIgKyBzb3VyY2UgKyAiJyBkb2Vzbid0IGV4aXN0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzb3VyY2UuY2FuUmVhZCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzcmMgJyIgKyBzb3VyY2UgKyAiJyBjYW5ub3QgYmUgcmVhZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cGFuZEZpbGUoRklMRV9VVElMUywgc291cmNlLCBkZXN0KTsKICAgICAgICAgfQogICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByZXNvdXJjZXMpIHsKICAgICAgICAgICAgIGlmICghci5pc0V4aXN0cygpKSB7CkBAIC0xNzYsNyArMTgwLDYgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRGaWxlKEZpbGVVdGlscyBmaWxlVXRpbHMsIEZpbGUgc3JjRiwgRmlsZSBkaXIpIHsKICAgICAgICAgbG9nKCJFeHBhbmRpbmc6ICIgKyBzcmNGICsgIiBpbnRvICIgKyBkaXIsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICBaaXBGaWxlIHpmID0gbnVsbDsKICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyID0gZ2V0TWFwcGVyKCk7CiAgICAgICAgIGlmICghc3JjRi5leGlzdHMoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZXhwYW5kICIKQEAgLTE4NCwxMyArMTg3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICsgIiBhcyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCIsCiAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6ZiA9IG5ldyBaaXBGaWxlKHNyY0YsIGVuY29kaW5nLCBzY2FuRm9yVW5pY29kZUV4dHJhRmllbGRzKTsKKyAgICAgICAgdHJ5IChaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoc3JjRiwgZW5jb2RpbmcsIHNjYW5Gb3JVbmljb2RlRXh0cmFGaWVsZHMpKSB7CiAgICAgICAgICAgICBib29sZWFuIGVtcHR5ID0gdHJ1ZTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFppcEVudHJ5PiBlID0gemYuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgIEVudW1lcmF0aW9uPFppcEVudHJ5PiBlbnRyaWVzID0gemYuZ2V0RW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgICBlbXB0eSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFppcEVudHJ5IHplID0gZS5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKICAgICAgICAgICAgICAgICBsb2coImV4dHJhY3RpbmcgIiArIHplLmdldE5hbWUoKSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC0yMDMsNyArMjA1LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZW1wdHkgJiYgZ2V0RmFpbE9uRW1wdHlBcmNoaXZlKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFyY2hpdmUgJyIgKyBzcmNGICsgIicgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFyY2hpdmUgJyVzJyBpcyBlbXB0eSIsIHNyY0YpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9nKCJleHBhbmQgY29tcGxldGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CkBAIC0yMTEsOCArMjEzLDYgQEAKICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgZXhwYW5kaW5nICIgKyBzcmNGLmdldFBhdGgoKQogICAgICAgICAgICAgICAgICsgIlxuIiArIGlvZS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgIGlvZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBaaXBGaWxlLmNsb3NlUXVpZXRseSh6Zik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyMyw4ICsyMjMsOCBAQAogICAgICAqIEBwYXJhbSBkaXIgICAgICAgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGV4cGFuZFJlc291cmNlKFJlc291cmNlIHNyY1IsIEZpbGUgZGlyKSB7Ci0gICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBmaWxlc3lzdGVtIGJhc2VkIHJlc291cmNlcyBhcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3VwcG9ydGVkIGJ5IHRoaXMgdGFzay4iKTsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgIm9ubHkgZmlsZXN5c3RlbSBiYXNlZCByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIHRhc2suIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzIsMTMgKzIzMiwxMCBAQAogICAgICAqIEByZXR1cm4gYSBmaWxlbmFtZW1hcHBlciBmb3IgYSBmaWxlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbGVOYW1lTWFwcGVyIGdldE1hcHBlcigpIHsKLSAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyID0gbnVsbDsKICAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWFwcGVyID0gbmV3IElkZW50aXR5TWFwcGVyKCk7CisgICAgICAgICAgICByZXR1cm4gbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtYXBwZXI7CisgICAgICAgIHJldHVybiBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKICAgICB9CiAKICAgICAvLyBDaGVja1N0eWxlOlBhcmFtZXRlck51bWJlckNoZWNrIE9GRiAtIGJjCkBAIC0yNjAsNyArMjU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRGlyZWN0b3J5LCBGaWxlTmFtZU1hcHBlciBtYXBwZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAotICAgICAgICBmaW5hbCBib29sZWFuIGVudHJ5TmFtZVN0YXJ0c1dpdGhQYXRoU3BlYyA9IGVudHJ5TmFtZS5sZW5ndGgoKSA+IDAKKyAgICAgICAgZmluYWwgYm9vbGVhbiBlbnRyeU5hbWVTdGFydHNXaXRoUGF0aFNwZWMgPSAhZW50cnlOYW1lLmlzRW1wdHkoKQogICAgICAgICAgICAgJiYgKGVudHJ5TmFtZS5jaGFyQXQoMCkgPT0gRmlsZS5zZXBhcmF0b3JDaGFyCiAgICAgICAgICAgICAgICAgfHwgZW50cnlOYW1lLmNoYXJBdCgwKSA9PSAnLycKICAgICAgICAgICAgICAgICB8fCBlbnRyeU5hbWUuY2hhckF0KDApID09ICdcXCcpOwpAQCAtMjcyLDEzICsyNjksMTIgQEAKICAgICAgICAgYm9vbGVhbiBhbGxvd2VkT3V0c2lkZU9mRGVzdCA9IEJvb2xlYW4uVFJVRSA9PSBnZXRBbGxvd0ZpbGVzVG9Fc2NhcGVEZXN0KCkKICAgICAgICAgICAgIHx8IG51bGwgPT0gZ2V0QWxsb3dGaWxlc1RvRXNjYXBlRGVzdCgpICYmICFzdHJpcEFic29sdXRlUGF0aFNwZWMgJiYgZW50cnlOYW1lU3RhcnRzV2l0aFBhdGhTcGVjOwogCi0gICAgICAgIGlmIChwYXR0ZXJuc2V0cyAhPSBudWxsICYmIHBhdHRlcm5zZXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKHBhdHRlcm5zZXRzICE9IG51bGwgJiYgIXBhdHRlcm5zZXRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeU5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikKICAgICAgICAgICAgICAgICAucmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOwogCi0gICAgICAgICAgICBib29sZWFuIGluY2x1ZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBpbmNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlUGF0dGVybnMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICBmb3IgKFBhdHRlcm5TZXQgcCA6IHBhdHRlcm5zZXRzKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nW10gaW5jbHMgPSBwLmdldEluY2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIGlmIChpbmNscyA9PSBudWxsIHx8IGluY2xzLmxlbmd0aCA9PSAwKSB7CkBAIC0zMDgsMjAgKzMwNCwyMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBpbmNsdWRlUGF0dGVybnMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgIWluY2x1ZGVkICYmIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZWQgPSBTZWxlY3RvclV0aWxzLm1hdGNoUGF0aChwYXR0ZXJuLCBuYW1lKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhdHRlcm4gOiBpbmNsdWRlUGF0dGVybnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoU2VsZWN0b3JVdGlscy5tYXRjaFBhdGgocGF0dGVybiwgbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZXhjbHVkZVBhdHRlcm5zLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGluY2x1ZGVkICYmIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZWQgPSAhU2VsZWN0b3JVdGlscy5tYXRjaFBhdGgocGF0dGVybiwgbmFtZSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXR0ZXJuIDogZXhjbHVkZVBhdHRlcm5zKSB7CisgICAgICAgICAgICAgICAgaWYgKFNlbGVjdG9yVXRpbHMubWF0Y2hQYXRoKHBhdHRlcm4sIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFpbmNsdWRlZCkgewotICAgICAgICAgICAgICAgIC8vRG8gbm90IHByb2Nlc3MgdGhpcyBmaWxlCisgICAgICAgICAgICAgICAgLy8gRG8gbm90IHByb2Nlc3MgdGhpcyBmaWxlCiAgICAgICAgICAgICAgICAgbG9nKCJza2lwcGluZyAiICsgZW50cnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICsgIiBhcyBpdCBpcyBleGNsdWRlZCBvciBub3QgaW5jbHVkZWQuIiwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CkBAIC0zNTksMjAgKzM1OCwxMSBAQAogICAgICAgICAgICAgICAgIGYubWtkaXJzKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotCi0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkSW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gZm9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGYudG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGVuZ3RoID0gY29tcHJlc3NlZElucHV0U3RyZWFtLnJlYWQoYnVmZmVyKSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZmZlciwgMCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3MgPSBudWxsOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmb3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDE5LDcgKzQwOSw3IEBACiAgICAgICogQHBhcmFtIHNldCBhIHBhdHRlcm4gc2V0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGF0dGVybnNldChQYXR0ZXJuU2V0IHNldCkgewotICAgICAgICBwYXR0ZXJuc2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgICAgIHBhdHRlcm5zZXRzLmFkZChzZXQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQ0LDcgKzUzNCw3IEBACiAgICAgICogV2hldGhlciB0byBhbGxvdyB0aGUgZXh0cmFjdGVkIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlIG91dHNpZGUgb2YgdGhlIGRlc3QgZGlyZWN0b3J5LgogICAgICAqCiAgICAgICogQHBhcmFtIGIgdGhlIGZsYWcKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC40CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QWxsb3dGaWxlc1RvRXNjYXBlRGVzdChib29sZWFuIGIpIHsKICAgICAgICAgYWxsb3dGaWxlc1RvRXNjYXBlRGVzdCA9IGI7CkBAIC01NTUsNyArNTQ1LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIHRoZSBmbGFnIGhhc24ndCBiZWVuIHNldCBleHBsaWNpdGx5LAogICAgICAqIG90aGVyd2lzZSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyLgotICAgICAqIEBzaW5jZSBBbnQgMS45LjEyCisgICAgICogQHNpbmNlIEFudCAxLjEwLjQKICAgICAgKi8KICAgICBwdWJsaWMgQm9vbGVhbiBnZXRBbGxvd0ZpbGVzVG9Fc2NhcGVEZXN0KCkgewogICAgICAgICByZXR1cm4gYWxsb3dGaWxlc1RvRXNjYXBlRGVzdDsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpbHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKaW5kZXggMzkwYmE1Yi4uNzhhNWViZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02OSw2ICs2OSw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gaXNGaWx0ZXJzRnJvbUZpbGUgPQogICAgICAgICAgICAgZmlsdGVyc0ZpbGUgIT0gbnVsbCAmJiB0b2tlbiA9PSBudWxsICYmIHZhbHVlID09IG51bGw7CkBAIC03Niw5ICs3Nyw5IEBACiAgICAgICAgICAgICBmaWx0ZXJzRmlsZSA9PSBudWxsICYmIHRva2VuICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbDsKIAogICAgICAgICBpZiAoIWlzRmlsdGVyc0Zyb21GaWxlICYmICFpc1NpbmdsZUZpbHRlcikgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJib3RoIHRva2VuIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzLCBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBhIGZpbHRlcnNGaWxlIHBhcmFtZXRlciBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVxdWlyZWQiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYm90aCB0b2tlbiBhbmQgdmFsdWUgcGFyYW1ldGVycywgb3Igb25seSBhIGZpbHRlcnNGaWxlIHBhcmFtZXRlciBpcyByZXF1aXJlZCIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTaW5nbGVGaWx0ZXIpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpeENSTEYuamF2YQppbmRleCAyOTBmZTY2Li5jZmY3ZWQ4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDUkxGLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRml4Q1JMRi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTEgKzIwLDExIEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CkBAIC0xMTUsNiArMTE1LDcgQEAKICAgICAgKiBAcmV0dXJuIGEgUmVhZGVyLgogICAgICAqIEBzaW5jZSBBbnQgMS43PwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBSZWFkZXIgY2hhaW4oZmluYWwgUmVhZGVyIHJkcikgewogICAgICAgICByZXR1cm4gZmlsdGVyLmNoYWluKHJkcik7CiAgICAgfQpAQCAtMTgxLDE1ICsxODIsMTYgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjQueC4KICAgICAgKiAgICAgICAgICAgICBVc2Uge0BsaW5rICNzZXRFb2wgc2V0RW9sfSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0Q3IoQWRkQXNpc1JlbW92ZSBhdHRyKSB7CiAgICAgICAgIGxvZygiREVQUkVDQVRFRDogVGhlIGNyIGF0dHJpYnV0ZSBoYXMgYmVlbiBkZXByZWNhdGVkLCIsCiAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgbG9nKCJQbGVhc2UgdXNlIHRoZSBlb2wgYXR0cmlidXRlIGluc3RlYWQiLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGF0dHIuZ2V0VmFsdWUoKTsKICAgICAgICAgQ3JMZiBjID0gbmV3IENyTGYoKTsKLSAgICAgICAgaWYgKG9wdGlvbi5lcXVhbHMoInJlbW92ZSIpKSB7CisgICAgICAgIGlmICgicmVtb3ZlIi5lcXVhbHMob3B0aW9uKSkgewogICAgICAgICAgICAgYy5zZXRWYWx1ZSgibGYiKTsKLSAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uZXF1YWxzKCJhc2lzIikpIHsKKyAgICAgICAgfSBlbHNlIGlmICgiYXNpcyIuZXF1YWxzKG9wdGlvbikpIHsKICAgICAgICAgICAgIGMuc2V0VmFsdWUoImFzaXMiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG11c3QgYmUgImFkZCIKQEAgLTI4Miw2ICsyODQsNyBAQAogICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIGZpcnN0IG9mZiwgbWFrZSBzdXJlIHRoYXQgd2UndmUgZ290IGEgc3JjZGlyIGFuZCBkZXN0ZGlyCiAgICAgICAgIHZhbGlkYXRlKCk7CkBAIC0zMjEsMjIgKzMyNCwyMSBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghc3JjRGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgRklYQ1JMRl9FUlJPUiArICJzcmNkaXIgZG9lcyBub3QgZXhpc3Q6ICciICsgc3JjRGlyICsgIiciKTsKKyAgICAgICAgICAgICAgICBGSVhDUkxGX0VSUk9SICsgInNyY2RpciBkb2VzIG5vdCBleGlzdDogJyVzJyIsIHNyY0Rpcik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzcmNEaXIuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIEZJWENSTEZfRVJST1IgKyAic3JjZGlyIGlzIG5vdCBhIGRpcmVjdG9yeTogJyIgKyBzcmNEaXIgKyAiJyIpOworICAgICAgICAgICAgICAgIEZJWENSTEZfRVJST1IgKyAic3JjZGlyIGlzIG5vdCBhIGRpcmVjdG9yeTogJyVzJyIsIHNyY0Rpcik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlc3REaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBGSVhDUkxGX0VSUk9SICsgImRlc3RkaXIgZG9lcyBub3QgZXhpc3Q6ICciCi0gICAgICAgICAgICAgICAgICAgICsgZGVzdERpciArICInIik7CisgICAgICAgICAgICAgICAgICAgIEZJWENSTEZfRVJST1IgKyAiZGVzdGRpciBkb2VzIG5vdCBleGlzdDogJyVzJyIsIGRlc3REaXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIEZJWENSTEZfRVJST1IgKyAiZGVzdGRpciBpcyBub3QgYSBkaXJlY3Rvcnk6ICciCi0gICAgICAgICAgICAgICAgICAgICsgZGVzdERpciArICInIik7CisgICAgICAgICAgICAgICAgICAgIEZJWENSTEZfRVJST1IgKyAiZGVzdGRpciBpcyBub3QgYSBkaXJlY3Rvcnk6ICclcyciLAorICAgICAgICAgICAgICAgICAgICBkZXN0RGlyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM0OSw3ICszNTEsNyBAQAogICAgICAgICBpZiAoZmN2ID09IG51bGwpIHsKICAgICAgICAgICAgIEZpbHRlckNoYWluIGZjID0gbmV3IEZpbHRlckNoYWluKCk7CiAgICAgICAgICAgICBmYy5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIGZjdiA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KDEpOworICAgICAgICAgICAgZmN2ID0gbmV3IFZlY3Rvcjw+KDEpOwogICAgICAgICAgICAgZmN2LmFkZChmYyk7CiAgICAgICAgIH0KICAgICAgICAgRmlsZSB0bXBGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShnZXRQcm9qZWN0KCksICJmaXhjcmxmIiwgIiIsIG51bGwsIHRydWUsIHRydWUpOwpAQCAtMzkwLDYgKzM5Miw3IEBACiAgICAgICogRGVwcmVjYXRlZCwgdGhlIGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gbW92ZWQgdG8gZmlsdGVycy5GaXhDckxmRmlsdGVyLgogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4wLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGNsYXNzIE9uZUxpbmVyIGltcGxlbWVudHMgRW51bWVyYXRpb248T2JqZWN0PiB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTkRFRiA9IC0xOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9USkFWQSA9IDA7CkBAIC00MjAsNyArNDIzLDcgQEAKICAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgICgoZW5jb2RpbmcgPT0gbnVsbCkgPyBuZXcgRmlsZVJlYWRlcihzcmNGaWxlKQogICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKSwgZW5jb2RpbmcpKSwgSU5CVUZMRU4pOworICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShzcmNGaWxlLnRvUGF0aCgpKSwgZW5jb2RpbmcpKSwgSU5CVUZMRU4pOwogCiAgICAgICAgICAgICAgICAgbmV4dExpbmUoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTQ2NSw3ICs0NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1xyJzoKICAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gcmVhZGVyLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2hhcikgKGNoKSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNoYXIpIGNoID09ICdcbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xjb3VudCArPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVvbFN0ci5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01NDgsNiArNTUxLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBtb3JlIGVsZW1lbnRzLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKICAgICAgICAgICAgIHJldHVybiAhcmVhY2hlZEVvZjsKICAgICAgICAgfQpAQCAtNTU3LDYgKzU2MSw3IEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudC4KICAgICAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIG1vcmUuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpCiAgICAgICAgICAgICB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoIWhhc01vcmVFbGVtZW50cygpKSB7CkBAIC02NzIsMjIgKzY3NywyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkQXNpc1JlbW92ZSBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewogICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiYWRkIiwgImFzaXMiLCAicmVtb3ZlIn07CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgImFzaXMiLCAiY3IiLCAibGYiIGFuZCAiY3JsZiIuCisgICAgICogRW51bWVyYXRlZCBhdHRyaWJ1dGUgd2l0aCB0aGUgdmFsdWVzICJhc2lzIiwgImNyIiwgImxmIiwgImNybGYiLCAibWFjIiwgInVuaXgiIGFuZCAiZG9zLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3JMZiBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewogICAgICAgICAvKioKICAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcwogICAgICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiYXNpcyIsICJjciIsICJsZiIsICJjcmxmIiwgIm1hYyIsICJ1bml4IiwKLSAgICAgICAgICAgICAgICAgICAgImRvcyJ9OworICAgICAgICAgICAgICAgICJkb3MifTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQppbmRleCBiODkxYmFlLi5lYWQwZjExIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEzICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogRXhwYW5kcyBhIGZpbGUgdGhhdCBoYXMgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlIEdaSVAKQEAgLTQ0LDYgKzQzLDcgQEAKICAgICAgKiBHZXQgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uLgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlICIuZ3oiCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RXh0ZW5zaW9uKCkgewogICAgICAgICByZXR1cm4gREVGQVVMVF9FWFRFTlNJT047CiAgICAgfQpAQCAtNTEsMTggKzUxLDE0IEBACiAgICAgLyoqCiAgICAgICogSW1wbGVtZW50IHRoZSBndW56aXBwaW5nLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGV4dHJhY3QoKSB7CiAgICAgICAgIGlmIChzcmNSZXNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSA+IGRlc3QubGFzdE1vZGlmaWVkKCkpIHsKICAgICAgICAgICAgIGxvZygiRXhwYW5kaW5nICIgKyBzcmNSZXNvdXJjZS5nZXROYW1lKCkgKyAiIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgICAgIEdaSVBJbnB1dFN0cmVhbSB6SW4gPSBudWxsOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0gICAgICAgICAgICAgICAgZmlzID0gc3JjUmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB6SW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZGVzdC50b1BhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIEdaSVBJbnB1dFN0cmVhbSB6SW4gPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdaSVBJbnB1dFN0cmVhbShzcmNSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKSkgewogICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CiAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICAgICAgICAgICBkbyB7CkBAIC03MiwxMCArNjgsNiBAQAogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9ibGVtIGV4cGFuZGluZyBnemlwICIgKyBpb2UuZ2V0TWVzc2FnZSgpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaXMpOwotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh6SW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtOTEsNiArODMsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHRhc2sgc3VwcG9ydHMgbm9uIGZpbGUgcmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgewogICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5lcXVhbHMoR1VuemlwLmNsYXNzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HWmlwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HWmlwLmphdmEKaW5kZXggMDI5ZjQxNC4uMDUzMGE3NCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1ppcC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0daaXAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCiAgKiBDb21wcmVzc2VzIGEgZmlsZSB3aXRoIHRoZSBHWklQIGFsZ29yaXRobS4gTm9ybWFsbHkgdXNlZCB0byBjb21wcmVzcwpAQCAtMzgsMTYgKzM3LDE0IEBACiAgICAgLyoqCiAgICAgICogcGVyZm9ybSB0aGUgR1ppcCBjb21wcmVzc2lvbiBvcGVyYXRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgcGFjaygpIHsKLSAgICAgICAgR1pJUE91dHB1dFN0cmVhbSB6T3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHpPdXQgPSBuZXcgR1pJUE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh6aXBGaWxlKSk7CisgICAgICAgIHRyeSAoR1pJUE91dHB1dFN0cmVhbSB6T3V0ID0KKyAgICAgICAgICAgIG5ldyBHWklQT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbSh6aXBGaWxlLnRvUGF0aCgpKSkpIHsKICAgICAgICAgICAgIHppcFJlc291cmNlKGdldFNyY1Jlc291cmNlKCksIHpPdXQpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBjcmVhdGluZyBnemlwICIgKyBpb2UuZ2V0TWVzc2FnZSgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh6T3V0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjIsNiArNTksNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNhc2Ugc3VwcG9ydHMgbm9uIGZpbGUgcmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgewogICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5lcXVhbHMoR1ppcC5jbGFzcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dlbmVyYXRlS2V5LmphdmEKaW5kZXggMTQ3MDlhNC4uZTcxM2U4NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2VuZXJhdGVLZXkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZW5lcmF0ZUtleS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsOCArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwpAQCAtODMsNyArODYsNyBAQAogICAgICAqIEEgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgZG5hbWUgbmVzdGVkIGVsZW1lbnQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEaXN0aW5ndWlzaGVkTmFtZSB7Ci0gICAgICAgIHByaXZhdGUgVmVjdG9yPERuYW1lUGFyYW0+IHBhcmFtcyA9IG5ldyBWZWN0b3I8RG5hbWVQYXJhbT4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PERuYW1lUGFyYW0+IHBhcmFtcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDcmVhdGUgYSBwYXJhbSBuZXN0ZWQgZWxlbWVudC4KQEAgLTkxLDggKzk0LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlUGFyYW0oKSB7CiAgICAgICAgICAgICBEbmFtZVBhcmFtIHBhcmFtID0gbmV3IERuYW1lUGFyYW0oKTsKLSAgICAgICAgICAgIHBhcmFtcy5hZGRFbGVtZW50KHBhcmFtKTsKLQorICAgICAgICAgICAgcGFyYW1zLmFkZChwYXJhbSk7CiAgICAgICAgICAgICByZXR1cm4gcGFyYW07CiAgICAgICAgIH0KIApAQCAtMTAxLDcgKzEwMyw3IEBACiAgICAgICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIG5lc3RlZCBwYXJhbWV0ZXJzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPERuYW1lUGFyYW0+IGdldFBhcmFtcygpIHsKLSAgICAgICAgICAgIHJldHVybiBwYXJhbXMuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihwYXJhbXMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMTEsMjYgKzExMywxMCBAQAogICAgICAgICAgKiBUaGlzIGlzIHVzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KICAgICAgICAgICogQHJldHVybiBhIHN0cmluZyByZXAgb2YgdGhpcyBuYW1lCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gcGFyYW1zLnNpemUoKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RQYXNzID0gdHJ1ZTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0UGFzcykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpcnN0UGFzcyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgZmluYWwgRG5hbWVQYXJhbSBwYXJhbSA9IChEbmFtZVBhcmFtKSBwYXJhbXMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChwYXJhbS5pc0NvbXBsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVuY29kZShwYXJhbS5nZXROYW1lKCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc9Jyk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChlbmNvZGUocGFyYW0uZ2V0VmFsdWUoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1zLnN0cmVhbSgpLm1hcChwIC0+IGVuY29kZShwLmdldE5hbWUoKSkgKyAiPSIgKyBlbmNvZGUocC5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xNDEsMjYgKzEyNyw3IEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgdmFsdWUuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZShmaW5hbCBTdHJpbmcgc3RyaW5nKSB7Ci0gICAgICAgICAgICBpbnQgZW5kID0gc3RyaW5nLmluZGV4T2YoJywnKTsKLQotICAgICAgICAgICAgaWYgKC0xID09IGVuZCkgewotICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlICgtMSAhPSBlbmQpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcXCwiKTsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGVuZCArIDE7Ci0gICAgICAgICAgICAgICAgZW5kID0gc3RyaW5nLmluZGV4T2YoJywnLCBzdGFydCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5qb2luKCJcXCwiLCBzdHJpbmcuc3BsaXQoIiwiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE5OCwxMiArMTY1LDExIEBACiAgICAgICovCiAgICAgcHVibGljIERpc3Rpbmd1aXNoZWROYW1lIGNyZWF0ZURuYW1lKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgIT0gZXhwYW5kZWREbmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJETmFtZSBzdWItZWxlbWVudCBjYW4gb25seSBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3BlY2lmaWVkIG9uY2UuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkROYW1lIHN1Yi1lbGVtZW50IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBvbmNlLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChudWxsICE9IGRuYW1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGRuYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBib3RoIGFzIGF0dHJpYnV0ZSBhbmQgZWxlbWVudC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNwZWNpZnkgZG5hbWUgIGJvdGggYXMgYXR0cmlidXRlIGFuZCBlbGVtZW50LiIpOwogICAgICAgICB9CiAgICAgICAgIGV4cGFuZGVkRG5hbWUgPSBuZXcgRGlzdGluZ3Vpc2hlZE5hbWUoKTsKICAgICAgICAgcmV0dXJuIGV4cGFuZGVkRG5hbWU7CkBAIC0yMTYsOCArMTgyLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXREbmFtZShmaW5hbCBTdHJpbmcgZG5hbWUpIHsKICAgICAgICAgaWYgKG51bGwgIT0gZXhwYW5kZWREbmFtZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJdCBpcyBub3QgcG9zc2libGUgdG8gc3BlY2lmeSBkbmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYm90aCBhcyBhdHRyaWJ1dGUgYW5kIGVsZW1lbnQuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkl0IGlzIG5vdCBwb3NzaWJsZSB0byBzcGVjaWZ5IGRuYW1lICBib3RoIGFzIGF0dHJpYnV0ZSBhbmQgZWxlbWVudC4iKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLmRuYW1lID0gZG5hbWU7CiAgICAgfQpAQCAtMjI5LDEyICsxOTUsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2FuYW1lKGZpbmFsIFN0cmluZyBzYW5hbWUpIHsKLSAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzcpKSB7Ci0gICAgICAgICAgICB0aGlzLnNhbmFtZSA9IHNhbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiVGhlIFN1YmplY3RBbHRlcm5hdGl2ZU5hbWUgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yICIKLSAgICAgICAgICAgICAgICsidGhlIEphdmEgVmVyc2lvbiBiZWluZyB1c2VkLiIpOwotICAgICAgICB9CisgICAgICAgIHRoaXMuc2FuYW1lID0gc2FuYW1lOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQwLDYgKzMwMSw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKG51bGwgPT0gYWxpYXMpIHsKQEAgLTM1NCw3ICszMTYsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkbmFtZSBtdXN0IGJlIHNldCIpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAogICAgICAgICBzYi5hcHBlbmQoIi1nZW5rZXkgIik7CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0LmphdmEKaW5kZXggMWQ0YmE0Zi4uZTdkNTZkNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0yNyw3ICsyNiwxMCBAQAogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMzUsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1haW47CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsLkhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwpAQCAtNDMsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VUkxSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVOYW1lTWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogR2V0cyBhIHBhcnRpY3VsYXIgZmlsZSBmcm9tIGEgVVJMIHNvdXJjZS4KQEAgLTg5LDYgKzkzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQUdFTlRfUFJFRklYICsgIi8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIE1haW4uZ2V0U2hvcnRBbnRWZXJzaW9uKCkpOwogCisgICAgLy8gU3RvcmUgaGVhZGVycyBhcyBrZXkvdmFsdWUgcGFpciB3aXRob3V0IGR1cGxpY2F0ZSBpbiBrZXlzCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisKICAgICAvKioKICAgICAgKiBEb2VzIHRoZSB3b3JrLgogICAgICAqCkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZW5kc1dpdGgoIi8iKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzbGFzaCA9IHBhdGgubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNsYXNoID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhzbGFzaCArIDEpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMjEsMTEgKzEyOCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJza2lwcGluZyAiICsgciArICIgLSBtYXBwZXIgY2FuJ3QgaGFuZGxlIGl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJza2lwcGluZyAiICsgciArICIgLSBtYXBwZXIgcmV0dXJucyBubyBmaWxlIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZC5sZW5ndGggPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGQubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJza2lwcGluZyAiICsgciArICIgLSBtYXBwZXIgcmV0dXJucyBtdWx0aXBsZSBmaWxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBuYW1lcyIsIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzEsMTMgKzE4MCw5IEBACiAgICAgcHVibGljIGJvb2xlYW4gZG9HZXQoZmluYWwgaW50IGxvZ0xldmVsLCBmaW5hbCBEb3dubG9hZFByb2dyZXNzIHByb2dyZXNzKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgciA6IHNvdXJjZXMpIHsKLSAgICAgICAgICAgIGZpbmFsIFVSTFByb3ZpZGVyIHVwID0gci5hcyhVUkxQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICBmaW5hbCBVUkwgc291cmNlID0gdXAuZ2V0VVJMKCk7Ci0gICAgICAgICAgICByZXR1cm4gZG9HZXQoc291cmNlLCBkZXN0aW5hdGlvbiwgbG9nTGV2ZWwsIHByb2dyZXNzKTsKLSAgICAgICAgfQotICAgICAgICAvKk5PVFJFQUNIRUQqLwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBkb0dldChzb3VyY2VzLml0ZXJhdG9yKCkubmV4dCgpLmFzKFVSTFByb3ZpZGVyLmNsYXNzKS5nZXRVUkwoKSwKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwgbG9nTGV2ZWwsIHByb2dyZXNzKTsKKwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA3LDcgKzIxMiw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIC8vZG9udCBkbyBhbnkgcHJvZ3Jlc3MsIHVubGVzcyBhc2tlZAorICAgICAgICAvLyBkb24ndCBkbyBhbnkgcHJvZ3Jlc3MsIHVubGVzcyBhc2tlZAogICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgcHJvZ3Jlc3MgPSBuZXcgTnVsbFByb2dyZXNzKCk7CiAgICAgICAgIH0KQEAgLTI2OCw3ICsyNzMsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja0F0dHJpYnV0ZXMoKSB7CiAKLSAgICAgICAgaWYgKHVzZXJBZ2VudCA9PSBudWxsIHx8IHVzZXJBZ2VudC50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAodXNlckFnZW50ID09IG51bGwgfHwgdXNlckFnZW50LnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidXNlckFnZW50IG1heSBub3QgYmUgbnVsbCBvciBlbXB0eSIpOwogICAgICAgICB9CiAKQEAgLTI3OSw4ICsyODQsOCBAQAogICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHIgOiBzb3VyY2VzKSB7CiAgICAgICAgICAgICBmaW5hbCBVUkxQcm92aWRlciB1cCA9IHIuYXMoVVJMUHJvdmlkZXIuY2xhc3MpOwogICAgICAgICAgICAgaWYgKHVwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgVVJMUHJvdmlkZXIgcmVzb3VyY2VzIGFyZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHN1cHBvcnRlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk9ubHkgVVJMUHJvdmlkZXIgcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQiLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yOTAsOSArMjk1LDggQEAKIAogICAgICAgICBpZiAoZGVzdGluYXRpb24uZXhpc3RzKCkgJiYgc291cmNlcy5zaXplKCkgPiAxCiAgICAgICAgICAgICAmJiAhZGVzdGluYXRpb24uaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGlzIG5vdCBhIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaXJlY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmV4aXN0cygpICYmICFkZXN0aW5hdGlvbi5jYW5Xcml0ZSgpKSB7CkBAIC0zODMsNyArMzg3LDYgQEAKICAgICAgICAgdXNlVGltZXN0YW1wID0gdjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFVzZXJuYW1lIGZvciBiYXNpYyBhdXRoLgogICAgICAqCkBAIC00ODUsNiArNDg4LDIxIEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQWRkIGEgbmVzdGVkIGhlYWRlcgorICAgICAqIEBwYXJhbSBoZWFkZXIgdG8gYmUgYWRkZWQKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRIZWFkZXIoSGVhZGVyIGhlYWRlcikgeworICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKGhlYWRlci5nZXROYW1lKCkpOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChoZWFkZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBEZWZpbmUgdGhlIG1hcHBlciB0byBtYXAgc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGVzLgogICAgICAqIEByZXR1cm4gYSBtYXBwZXIgdG8gYmUgY29uZmlndXJlZC4KICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIG1vcmUgdGhhbiBvbmUgbWFwcGVyIGlzIGRlZmluZWQuCkBAIC01NDUsNiArNTYzLDcgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIGJlZ2luIGEgZG93bmxvYWQKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbkRvd25sb2FkKCkgewogICAgICAgICB9CiAKQEAgLTU1MiwxMiArNTcxLDE0IEBACiAgICAgICAgICAqIHRpY2sgaGFuZGxlcgogICAgICAgICAgKgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGljaygpIHsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBlbmQgYSBkb3dubG9hZAogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGVuZERvd25sb2FkKCkgewogICAgICAgICB9CiAgICAgfQpAQCAtNTgyLDYgKzYwMyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBiZWdpbiBhIGRvd25sb2FkCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgYmVnaW5Eb3dubG9hZCgpIHsKICAgICAgICAgICAgIGRvdHMgPSAwOwogICAgICAgICB9CkBAIC01OTAsNiArNjEyLDcgQEAKICAgICAgICAgICogdGljayBoYW5kbGVyCiAgICAgICAgICAqCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgb25UaWNrKCkgewogICAgICAgICAgICAgb3V0LnByaW50KCIuIik7CiAgICAgICAgICAgICBpZiAoZG90cysrID4gRE9UU19QRVJfTElORSkgewpAQCAtNjAxLDYgKzYyNCw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBlbmQgYSBkb3dubG9hZAogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGVuZERvd25sb2FkKCkgewogICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICAgICAgICAgIG91dC5mbHVzaCgpOwpAQCAtNzI3LDYgKzc1MSwxMiBAQAogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQtRW5jb2RpbmciLCBHWklQX0NPTlRFTlRfRU5DT0RJTkcpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgLy93ZSBkbyBub3QgbG9nIHRoZSBoZWFkZXIgdmFsdWUgYXMgaXQgbWF5IGNvbnRhaW4gc2Vuc2l0aXZlIGRhdGEgbGlrZSBwYXNzd29yZHMKKyAgICAgICAgICAgICAgICBsb2coU3RyaW5nLmZvcm1hdCgiQWRkaW5nIGhlYWRlciAnJXMnICIsIGhlYWRlci5nZXRLZXkoKSkpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KGhlYWRlci5nZXRLZXkoKSwgaGVhZGVyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBVUkxDb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgY29ubmVjdGlvbikuc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoZmFsc2UpOwogICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGh0dHBVc2VDYWNoZXMpOwpAQCAtNzcyLDkgKzgwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBsb2dMZXZlbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MTksNyArODQ4LDcgQEAKICAgICAgICAgICAgICAgICBpcyA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaXMpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOworICAgICAgICAgICAgb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZGVzdC50b1BhdGgoKSk7CiAgICAgICAgICAgICBwcm9ncmVzcy5iZWdpbkRvd25sb2FkKCk7CiAgICAgICAgICAgICBib29sZWFuIGZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSG9zdEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0hvc3RJbmZvLmphdmEKaW5kZXggMTM5MTI5OC4uMTRkODA5NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSG9zdEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ib3N0SW5mby5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNyArMjMsNyBAQAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCkBAIC0xMDUsOCArMTA1LDkgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgIiIuZXF1YWxzKGhvc3QpKSB7CisgICAgICAgIGlmIChob3N0ID09IG51bGwgfHwgaG9zdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGV4ZWN1dGVMb2NhbCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXhlY3V0ZVJlbW90ZSgpOwpAQCAtMTE1LDE1ICsxMTYsOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVMb2NhbCgpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluZXRBZGRycyA9IG5ldyBMaW5rZWRMaXN0PEluZXRBZGRyZXNzPigpOwotICAgICAgICAgICAgRW51bWVyYXRpb248TmV0d29ya0ludGVyZmFjZT4gaW50ZXJmYWNlcyA9IE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChpbnRlcmZhY2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgTmV0d29ya0ludGVyZmFjZSBjdXJyZW50aWYgPSBpbnRlcmZhY2VzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb248SW5ldEFkZHJlc3M+IGFkZHJzID0gY3VycmVudGlmLmdldEluZXRBZGRyZXNzZXMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYWRkcnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5ldEFkZHJzLmFkZChhZGRycy5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbmV0QWRkcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5saXN0KE5ldHdvcmtJbnRlcmZhY2UuZ2V0TmV0d29ya0ludGVyZmFjZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gobmV0SW50ZXJmYWNlIC0+IGluZXRBZGRycy5hZGRBbGwoQ29sbGVjdGlvbnMubGlzdChuZXRJbnRlcmZhY2UuZ2V0SW5ldEFkZHJlc3NlcygpKSkpOwogICAgICAgICAgICAgc2VsZWN0QWRkcmVzc2VzKCk7CiAKICAgICAgICAgICAgIGlmIChuYW1lQWRkciAhPSBudWxsICYmIGhhc0hvc3ROYW1lKG5hbWVBZGRyKSkgewpAQCAtMTc1LDM0ICsxNzAsMzIgQEAKICAgICAgICAgaWYgKGJlc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gbm9uZSBzZWxlY3RlZCBzbyBmYXIsIHNvIHRoaXMgb25lIGlzIGJldHRlci4KICAgICAgICAgICAgIGJlc3QgPSBjdXJyZW50OworICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT0gbnVsbCB8fCBjdXJyZW50LmlzTG9vcGJhY2tBZGRyZXNzKCkpIHsKKyAgICAgICAgICAgIC8vIGRlZmluaXRlbHkgbm90IGJldHRlciB0aGFuIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGFkZHJlc3MuCisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc0xpbmtMb2NhbEFkZHJlc3MoKSkgeworICAgICAgICAgICAgLy8gbGluayBsb2NhbCBjb25zaWRlcmVkIGJldHRlciB0aGFuIGxvb3BiYWNrCisgICAgICAgICAgICBpZiAoYmVzdC5pc0xvb3BiYWNrQWRkcmVzcygpKSB7CisgICAgICAgICAgICAgICAgYmVzdCA9IGN1cnJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc1NpdGVMb2NhbEFkZHJlc3MoKSkgeworICAgICAgICAgICAgLy8gc2l0ZSBsb2NhbCBjb25zaWRlcmVkIGJldHRlciB0aGFuIGxpbmsgbG9jYWwgKGFuZCBsb29wYmFjaykKKyAgICAgICAgICAgIC8vIGFkZHJlc3Mgd2l0aCBob3N0bmFtZSByZXNvbHZlZCBjb25zaWRlcmVkIGJldHRlciB0aGFuCisgICAgICAgICAgICAvLyBhZGRyZXNzIHdpdGhvdXQgaG9zdG5hbWUKKyAgICAgICAgICAgIGlmIChiZXN0LmlzTG9vcGJhY2tBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgYmVzdC5pc0xpbmtMb2NhbEFkZHJlc3MoKQorICAgICAgICAgICAgICAgICAgICB8fCAoYmVzdC5pc1NpdGVMb2NhbEFkZHJlc3MoKSAmJiAhaGFzSG9zdE5hbWUoYmVzdCkpKSB7CisgICAgICAgICAgICAgICAgYmVzdCA9IGN1cnJlbnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IGN1cnJlbnQuaXNMb29wYmFja0FkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgIC8vIGRlZmluaXRlbHkgbm90IGJldHRlciB0aGFuIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGFkZHJlc3MuCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnQuaXNMaW5rTG9jYWxBZGRyZXNzKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBsaW5rIGxvY2FsIGNvbnNpZGVyZWQgYmV0dGVyIHRoYW4gbG9vcGJhY2sKLSAgICAgICAgICAgICAgICBpZiAoYmVzdC5pc0xvb3BiYWNrQWRkcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5pc1NpdGVMb2NhbEFkZHJlc3MoKSkgewotICAgICAgICAgICAgICAgIC8vIHNpdGUgbG9jYWwgY29uc2lkZXJlZCBiZXR0ZXIgdGhhbiBsaW5rIGxvY2FsIChhbmQgbG9vcGJhY2spCi0gICAgICAgICAgICAgICAgLy8gYWRkcmVzcyB3aXRoIGhvc3RuYW1lIHJlc29sdmVkIGNvbnNpZGVyZWQgYmV0dGVyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIHdpdGhvdXQgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICBpZiAoYmVzdC5pc0xvb3BiYWNrQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBiZXN0LmlzTGlua0xvY2FsQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoYmVzdC5pc1NpdGVMb2NhbEFkZHJlc3MoKSAmJiAhaGFzSG9zdE5hbWUoYmVzdCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3QgPSBjdXJyZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VycmVudCBpcyBhICJHbG9iYWwgYWRkcmVzcyIsIGNvbnNpZGVyZWQgYmV0dGVyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyBzaXRlIGxvY2FsIChhbmQgYmV0dGVyIHRoYW4gbGluayBsb2NhbCwgbG9vcGJhY2spCi0gICAgICAgICAgICAgICAgLy8gYWRkcmVzcyB3aXRoIGhvc3RuYW1lIHJlc29sdmVkIGNvbnNpZGVyZWQgYmV0dGVyIHRoYW4KLSAgICAgICAgICAgICAgICAvLyBhZGRyZXNzIHdpdGhvdXQgaG9zdG5hbWUKLSAgICAgICAgICAgICAgICBpZiAoYmVzdC5pc0xvb3BiYWNrQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBiZXN0LmlzTGlua0xvY2FsQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBiZXN0LmlzU2l0ZUxvY2FsQWRkcmVzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAhaGFzSG9zdE5hbWUoYmVzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYmVzdCA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY3VycmVudCBpcyBhICJHbG9iYWwgYWRkcmVzcyIsIGNvbnNpZGVyZWQgYmV0dGVyIHRoYW4KKyAgICAgICAgICAgIC8vIHNpdGUgbG9jYWwgKGFuZCBiZXR0ZXIgdGhhbiBsaW5rIGxvY2FsLCBsb29wYmFjaykKKyAgICAgICAgICAgIC8vIGFkZHJlc3Mgd2l0aCBob3N0bmFtZSByZXNvbHZlZCBjb25zaWRlcmVkIGJldHRlciB0aGFuCisgICAgICAgICAgICAvLyBhZGRyZXNzIHdpdGhvdXQgaG9zdG5hbWUKKyAgICAgICAgICAgIGlmIChiZXN0LmlzTG9vcGJhY2tBZGRyZXNzKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgYmVzdC5pc0xpbmtMb2NhbEFkZHJlc3MoKQorICAgICAgICAgICAgICAgICAgICB8fCBiZXN0LmlzU2l0ZUxvY2FsQWRkcmVzcygpCisgICAgICAgICAgICAgICAgICAgIHx8ICFoYXNIb3N0TmFtZShiZXN0KSkgeworICAgICAgICAgICAgICAgIGJlc3QgPSBjdXJyZW50OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBiZXN0OwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGFzay5qYXZhCmluZGV4IDBkZGQ1OTcuLjYwNDVmZGUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydFRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbXBvcnRUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02MywxMiArNjMsMTMgQEAKICAqIEBhbnQudGFzayBjYXRlZ29yeT0iY29udHJvbCIKICAqLwogcHVibGljIGNsYXNzIEltcG9ydFRhc2sgZXh0ZW5kcyBUYXNrIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKwogICAgIHByaXZhdGUgU3RyaW5nIGZpbGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOwogICAgIHByaXZhdGUgU3RyaW5nIHRhcmdldFByZWZpeCA9IFByb2plY3RIZWxwZXIuVVNFX1BST0pFQ1RfTkFNRV9BU19UQVJHRVRfUFJFRklYOwogICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeFNlcGFyYXRvciA9ICIuIjsKICAgICBwcml2YXRlIGZpbmFsIFVuaW9uIHJlc291cmNlcyA9IG5ldyBVbmlvbigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwogCiAgICAgcHVibGljIEltcG9ydFRhc2soKSB7CiAgICAgICAgIHJlc291cmNlcy5zZXRDYWNoZSh0cnVlKTsKQEAgLTEyNiwxOCArMTI3LDE4IEBACiAgICAgICAgIHJlc291cmNlcy5hZGQocik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiaW1wb3J0IHJlcXVpcmVzIGZpbGUgYXR0cmlidXRlIG9yIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdCBsZWFzdCBvbmUgbmVzdGVkIHJlc291cmNlIik7CisgICAgICAgIGlmIChmaWxlID09IG51bGwgJiYgcmVzb3VyY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJpbXBvcnQgcmVxdWlyZXMgZmlsZSBhdHRyaWJ1dGUgb3IgYXQgbGVhc3Qgb25lIG5lc3RlZCByZXNvdXJjZSIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChnZXRPd25pbmdUYXJnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICB8fCAhIiIuZXF1YWxzKGdldE93bmluZ1RhcmdldCgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHx8ICFnZXRPd25pbmdUYXJnZXQoKS5nZXROYW1lKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImltcG9ydCBvbmx5IGFsbG93ZWQgYXMgYSB0b3AtbGV2ZWwgdGFzayIpOwogICAgICAgICB9CiAKLSAgICAgICAgUHJvamVjdEhlbHBlciBoZWxwZXIgPQotICAgICAgICAgICAgICAgIChQcm9qZWN0SGVscGVyKSBnZXRQcm9qZWN0KCkuCisgICAgICAgIFByb2plY3RIZWxwZXIgaGVscGVyID0gZ2V0UHJvamVjdCgpLgogICAgICAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UoUHJvamVjdEhlbHBlci5QUk9KRUNUSEVMUEVSX1JFRkVSRU5DRSk7CiAKICAgICAgICAgaWYgKGhlbHBlciA9PSBudWxsKSB7CkBAIC0xNDUsOSArMTQ2LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiaW1wb3J0IHJlcXVpcmVzIHN1cHBvcnQgaW4gUHJvamVjdEhlbHBlciIpOwogICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yPE9iamVjdD4gaW1wb3J0U3RhY2sgPSBoZWxwZXIuZ2V0SW1wb3J0U3RhY2soKTsKLQotICAgICAgICBpZiAoaW1wb3J0U3RhY2suc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGhlbHBlci5nZXRJbXBvcnRTdGFjaygpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIGlmIGFudCBpcyB1c2VkIHdpdGggYSBwcm9qZWN0CiAgICAgICAgICAgICAvLyBoZWxwZXIgdGhhdCBkb2Vzbid0IHNldCB0aGUgaW1wb3J0LgogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbXBvcnQgcmVxdWlyZXMgc3VwcG9ydCBpbiBQcm9qZWN0SGVscGVyIik7CkBAIC0xNjksOCArMTY4LDYgQEAKIAogICAgIHByaXZhdGUgdm9pZCBpbXBvcnRSZXNvdXJjZShQcm9qZWN0SGVscGVyIGhlbHBlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgaW1wb3J0ZWRSZXNvdXJjZSkgewotICAgICAgICBWZWN0b3I8T2JqZWN0PiBpbXBvcnRTdGFjayA9IGhlbHBlci5nZXRJbXBvcnRTdGFjaygpOwotCiAgICAgICAgIGdldFByb2plY3QoKS5sb2coIkltcG9ydGluZyBmaWxlICIgKyBpbXBvcnRlZFJlc291cmNlICsgIiBmcm9tICIKICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldExvY2F0aW9uKCkuZ2V0RmlsZU5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKQEAgLTE4MSwxMyArMTc4LDEyIEBACiAgICAgICAgICAgICBpZiAob3B0aW9uYWwpIHsKICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFpc0luSW5jbHVkZU1vZGUoKSAmJgotICAgICAgICAgICAgaGFzQWxyZWFkeUJlZW5JbXBvcnRlZChpbXBvcnRlZFJlc291cmNlLCBpbXBvcnRTdGFjaykpIHsKKyAgICAgICAgaWYgKCFpc0luSW5jbHVkZU1vZGUoKSAmJiBoYXNBbHJlYWR5QmVlbkltcG9ydGVkKGltcG9ydGVkUmVzb3VyY2UsCisgICAgICAgICAgICBoZWxwZXIuZ2V0SW1wb3J0U3RhY2soKSkpIHsKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coCiAgICAgICAgICAgICAgICAgIlNraXBwZWQgYWxyZWFkeSBpbXBvcnRlZCBmaWxlOlxuICAgIgogICAgICAgICAgICAgICAgICsgaW1wb3J0ZWRSZXNvdXJjZSArICJcbiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtMjA2LDEwICsyMDIsMTAgQEAKICAgICAgICAgICAgICAgICBwcmVmaXggPSBvbGRQcmVmaXggKyBvbGRTZXAgKyB0YXJnZXRQcmVmaXg7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW5JbmNsdWRlTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgcHJlZml4ID0gdGFyZ2V0UHJlZml4OwotICAgICAgICAgICAgfSBlbHNlIGlmICghUHJvamVjdEhlbHBlci5VU0VfUFJPSkVDVF9OQU1FX0FTX1RBUkdFVF9QUkVGSVguZXF1YWxzKHRhcmdldFByZWZpeCkpIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSB0YXJnZXRQcmVmaXg7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgfSBlbHNlIGlmIChQcm9qZWN0SGVscGVyLlVTRV9QUk9KRUNUX05BTUVfQVNfVEFSR0VUX1BSRUZJWC5lcXVhbHModGFyZ2V0UHJlZml4KSkgewogICAgICAgICAgICAgICAgIHByZWZpeCA9IG9sZFByZWZpeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJlZml4ID0gdGFyZ2V0UHJlZml4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0UHJvamVjdEhlbHBlclByb3BzKHByZWZpeCwgcHJlZml4U2VwYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5JbmNsdWRlTW9kZSgpKTsKQEAgLTI2Myw5ICsyNTksOCBAQAogICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgbG9nKGV4LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmYWlsZWQgdG8gcmVzb2x2ZSAiICsgZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZWxhdGl2ZSB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRMb2NhdGlvbigpLmdldEZpbGVOYW1lKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmYWlsZWQgdG8gcmVzb2x2ZSAlcyByZWxhdGl2ZSB0byAlcyIsCisgICAgICAgICAgICAgICAgZmlsZSwgZ2V0TG9jYXRpb24oKS5nZXRGaWxlTmFtZSgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0yNzcsMjIgKzI3MiwxNCBAQAogCiAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0FscmVhZHlCZWVuSW1wb3J0ZWQoUmVzb3VyY2UgaW1wb3J0ZWRSZXNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8T2JqZWN0PiBpbXBvcnRTdGFjaykgewotICAgICAgICBGaWxlIGltcG9ydGVkRmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGVQcm92aWRlciBmcCA9IGltcG9ydGVkUmVzb3VyY2UuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKGZwICE9IG51bGwpIHsKLSAgICAgICAgICAgIGltcG9ydGVkRmlsZSA9IGZwLmdldEZpbGUoKTsKLSAgICAgICAgfQotICAgICAgICBVUkwgaW1wb3J0ZWRVUkwgPSBudWxsOwotICAgICAgICBVUkxQcm92aWRlciB1cCA9IGltcG9ydGVkUmVzb3VyY2UuYXMoVVJMUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAodXAgIT0gbnVsbCkgewotICAgICAgICAgICAgaW1wb3J0ZWRVUkwgPSB1cC5nZXRVUkwoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKE9iamVjdCBvIDogaW1wb3J0U3RhY2spIHsKLSAgICAgICAgICAgIGlmIChpc09uZU9mKG8sIGltcG9ydGVkUmVzb3VyY2UsIGltcG9ydGVkRmlsZSwgaW1wb3J0ZWRVUkwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBGaWxlIGltcG9ydGVkRmlsZSA9IGltcG9ydGVkUmVzb3VyY2UuYXNPcHRpb25hbChGaWxlUHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAubWFwKEZpbGVQcm92aWRlcjo6Z2V0RmlsZSkub3JFbHNlKG51bGwpOworCisgICAgICAgIFVSTCBpbXBvcnRlZFVSTCA9IGltcG9ydGVkUmVzb3VyY2UuYXNPcHRpb25hbChVUkxQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAgIC5tYXAoVVJMUHJvdmlkZXI6OmdldFVSTCkub3JFbHNlKG51bGwpOworCisgICAgICAgIHJldHVybiBpbXBvcnRTdGFjay5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgIG8gLT4gaXNPbmVPZihvLCBpbXBvcnRlZFJlc291cmNlLCBpbXBvcnRlZEZpbGUsIGltcG9ydGVkVVJMKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzT25lT2YoT2JqZWN0IG8sIFJlc291cmNlIGltcG9ydGVkUmVzb3VyY2UsCkBAIC0zMTAsOSArMjk3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpbXBvcnRlZFVSTCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgVVJMUHJvdmlkZXIgdXAgPSAoKFJlc291cmNlKSBvKS5hcyhVUkxQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHVwICE9IG51bGwgJiYgdXAuZ2V0VVJMKCkuZXF1YWxzKGltcG9ydGVkVVJMKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHVwICE9IG51bGwgJiYgdXAuZ2V0VVJMKCkuZXF1YWxzKGltcG9ydGVkVVJMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbnB1dC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5wdXQuamF2YQppbmRleCAyZjVlZWEwLi5mMWY3MjEyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbnB1dC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0lucHV0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw4ICsxOCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyOwpAQCAtNTksNiArNTgsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChmaW5hbCBTdHJpbmcgcmVmaWQpIHsKICAgICAgICAgICAgIHRoaXMucmVmaWQgPSByZWZpZDsKICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXQgdGhlIHJlZmlkIG9mIHRoaXMgSGFuZGxlci4KICAgICAgICAgICogQHJldHVybiBTdHJpbmcgcmVmaWQuCkBAIC02Niw2ICs2Niw3IEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmaWQoKSB7CiAgICAgICAgICAgICByZXR1cm4gcmVmaWQ7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogU2V0IHRoZSBJbnB1dEhhbmRsZXIgY2xhc3NuYW1lLgogICAgICAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBTdHJpbmcgY2xhc3NuYW1lLgpAQCAtNzMsNiArNzQsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc25hbWUoZmluYWwgU3RyaW5nIGNsYXNzbmFtZSkgewogICAgICAgICAgICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogR2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIElucHV0SGFuZGxlci4KICAgICAgICAgICogQHJldHVybiBTdHJpbmcgY2xhc3NuYW1lLgpAQCAtODAsNiArODIsNyBAQAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiBjbGFzc25hbWU7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogU2V0IHRoZSBoYW5kbGVyIHR5cGUuCiAgICAgICAgICAqIEBwYXJhbSB0eXBlIGEgSGFuZGxlclR5cGUuCkBAIC04Nyw2ICs5MCw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoZmluYWwgSGFuZGxlclR5cGUgdHlwZSkgewogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBHZXQgdGhlIGhhbmRsZXIgdHlwZS4KICAgICAgICAgICogQHJldHVybiBhIEhhbmRsZXJUeXBlIG9iamVjdC4KQEAgLTk0LDIxICs5OCwyMiBAQAogICAgICAgICBwdWJsaWMgSGFuZGxlclR5cGUgZ2V0VHlwZSgpIHsKICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSBJbnB1dEhhbmRsZXIgZ2V0SW5wdXRIYW5kbGVyKCkgewogICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuZ2V0SW5wdXRIYW5kbGVyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocmVmaWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gKElucHV0SGFuZGxlcikgKGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UocmVmaWQpKTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShyZWZpZCk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWQgKyAiIGRvZXMgbm90IGRlbm90ZSBhbiBJbnB1dEhhbmRsZXIiLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgcmV0dXJuIChJbnB1dEhhbmRsZXIpIChDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZShjbGFzc25hbWUsCi0gICAgICAgICAgICAgICAgICAgY3JlYXRlTG9hZGVyKCksIElucHV0SGFuZGxlci5jbGFzcykpOworICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdGVMb2FkZXIoKSwgSW5wdXRIYW5kbGVyLmNsYXNzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IHJlZmlkLCBjbGFzc25hbWUgb3IgdHlwZSIpOwpAQCAtMTMyLDYgKzEzNyw3IEBACiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gVkFMVUVTOwogICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSBJbnB1dEhhbmRsZXIgZ2V0SW5wdXRIYW5kbGVyKCkgewogICAgICAgICAgICAgcmV0dXJuIEhBTkRMRVJTW2dldEluZGV4KCldOwogICAgICAgICB9CkBAIC0xOTIsMTkgKzE5OCwxMyBAQAogICAgICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoZmluYWwgU3RyaW5nIG1zZykgewotICAgICAgICBpZiAobWVzc2FnZUF0dHJpYnV0ZSAmJiAiIi5lcXVhbHMobXNnLnRyaW0oKSkpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2VBdHRyaWJ1dGUgJiYgbXNnLnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBtZXNzYWdlICs9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhtc2cpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIE5vIGFyZyBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW5wdXQgKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqIEFjdHVhbCBtZXRob2QgZXhlY3V0ZWQgYnkgYW50LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KQEAgLTIxOSw3ICsyMTksNyBAQAogCiAgICAgICAgIElucHV0UmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKICAgICAgICAgaWYgKHZhbGlkYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBWZWN0b3I8U3RyaW5nPiBhY2NlcHQgPSBTdHJpbmdVdGlscy5zcGxpdCh2YWxpZGFyZ3MsICcsJyk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYWNjZXB0ID0gU3RyaW5nVXRpbHMuc3BsaXQodmFsaWRhcmdzLCAnLCcpOwogICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBNdWx0aXBsZUNob2ljZUlucHV0UmVxdWVzdChtZXNzYWdlLCBhY2NlcHQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVxdWVzdCA9IG5ldyBJbnB1dFJlcXVlc3QobWVzc2FnZSk7CkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICAgICAgaC5oYW5kbGVJbnB1dChyZXF1ZXN0KTsKIAogICAgICAgICBTdHJpbmcgdmFsdWUgPSByZXF1ZXN0LmdldElucHV0KCk7Ci0gICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAgaWYgKCh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLnRyaW0oKS5pc0VtcHR5KCkpCiAgICAgICAgICAgICAmJiBkZWZhdWx0dmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0dmFsdWU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0pEQkNUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KREJDVGFzay5qYXZhCmluZGV4IDMxMjIxMTUuLmEyNzRkMzggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0pEQkNUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSkRCQ1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDcgKzI0LDYgQEAKIGltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwpAQCAtNjEsNyArNjAsNyBAQAogICAgICAgICBTdGF0ZW1lbnQgc3RtdD1udWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKHRhYmxlTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUYWJsZU5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiLGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRhYmxlTmFtZSBtdXN0IGJlIHNwZWNpZmllZCIsIGxvY2F0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZyBzcWwgPSAiU0VMRUNUICogRlJPTSAiK3RhYmxlTmFtZTsKICAgICAgICAgICAgIHN0bXQ9IGNvbm4uY3JlYXRlU3RhdGVtZW50KCk7CkBAIC05OCw3ICs5Nyw3IEBACiAgICAgICogZ2V0dGluZyBhbiBPdXRPZk1lbW9yeUVycm9yIHdoZW4gY2FsbGluZyB0aGlzIHRhc2sKICAgICAgKiBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdy4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBBbnRDbGFzc0xvYWRlcj4gTE9BREVSX01BUCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBBbnRDbGFzc0xvYWRlcj4oSEFTSF9UQUJMRV9TSVpFKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBBbnRDbGFzc0xvYWRlcj4gTE9BREVSX01BUCA9IG5ldyBIYXNodGFibGU8PihIQVNIX1RBQkxFX1NJWkUpOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hpbmcgPSB0cnVlOwogCkBAIC0xNTIsNyArMTUxLDcgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8UHJvcGVydHk+IGNvbm5lY3Rpb25Qcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eT4oKTsKKyAgICBwcml2YXRlIExpc3Q8UHJvcGVydHk+IGNvbm5lY3Rpb25Qcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjbGFzc3BhdGggZm9yIGxvYWRpbmcgdGhlIGRyaXZlci4KQEAgLTM0NCwyMCArMzQzLDE3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVybCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKLQogICAgICAgICAgICAgbG9nKCJjb25uZWN0aW5nIHRvICIgKyBnZXRVcmwoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIGluZm8gPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICAgICAgaW5mby5wdXQoInVzZXIiLCBnZXRVc2VySWQoKSk7CiAgICAgICAgICAgICBpbmZvLnB1dCgicGFzc3dvcmQiLCBnZXRQYXNzd29yZCgpKTsKIAotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxQcm9wZXJ0eT4gcHJvcHMgPSBjb25uZWN0aW9uUHJvcGVydGllcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBwcm9wcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHkgcCA9IHByb3BzLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoUHJvcGVydHkgcCA6IGNvbm5lY3Rpb25Qcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwLmdldFZhbHVlKCk7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiT25seSBuYW1lL3ZhbHVlIHBhaXJzIGFyZSBzdXBwb3J0ZWQgYXMgY29ubmVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0aWVzLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICBsb2coIk9ubHkgbmFtZS92YWx1ZSBwYWlycyBhcmUgc3VwcG9ydGVkIGFzIGNvbm5lY3Rpb24gcHJvcGVydGllcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbG9nKCJTZXR0aW5nIGNvbm5lY3Rpb24gcHJvcGVydHkgIiArIG5hbWUgKyAiIHRvICIgKyB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtMzc2LDE0ICszNzIsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBjb25uOwogICAgICAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gZmFpbGVkIHRvIGNvbm5lY3QKLSAgICAgICAgICAgIGlmICghZmFpbE9uQ29ubmVjdGlvbkVycm9yKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gY29ubmVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmFpbE9uQ29ubmVjdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gY29ubmVjdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKioKQEAgLTM5Nyw5ICszOTEsOSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEcml2ZXIgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgRHJpdmVyIGRyaXZlckluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgRHJpdmVyIGRyaXZlckluc3RhbmNlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3M8Pz4gZGM7CisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgRHJpdmVyPiBkYzsKICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZpcnN0IHRoYXQgaXQgaXMgbm90IGFscmVhZHkgbG9hZGVkIG90aGVyd2lzZQogICAgICAgICAgICAgICAgIC8vIGNvbnNlY3V0aXZlIHJ1bnMgc2VlbXMgdG8gZW5kIGludG8gYW4gT3V0T2ZNZW1vcnlFcnJvcgpAQCAtNDI1LDEzICs0MTksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGMgPSBsb2FkZXIubG9hZENsYXNzKGRyaXZlcik7CisgICAgICAgICAgICAgICAgZGMgPSBsb2FkZXIubG9hZENsYXNzKGRyaXZlcikuYXNTdWJjbGFzcyhEcml2ZXIuY2xhc3MpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsb2coIkxvYWRpbmcgIiArIGRyaXZlciArICIgdXNpbmcgc3lzdGVtIGxvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICBkYyA9IENsYXNzLmZvck5hbWUoZHJpdmVyKTsKKyAgICAgICAgICAgICAgICBkYyA9IENsYXNzLmZvck5hbWUoZHJpdmVyKS5hc1N1YmNsYXNzKERyaXZlci5jbGFzcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkcml2ZXJJbnN0YW5jZSA9IChEcml2ZXIpIGRjLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBkcml2ZXJJbnN0YW5jZSA9IGRjLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiQ2xhc3MgTm90IEZvdW5kOiBKREJDIGRyaXZlciAiICsgZHJpdmVyICsgIiBjb3VsZCBub3QgYmUgbG9hZGVkIiwKQEAgLTQ1MSw3ICs0NDUsNiBAQAogICAgICAgICByZXR1cm4gZHJpdmVySW5zdGFuY2U7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGNhY2hpbmcgYXR0cmlidXRlLgogICAgICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phci5qYXZhCmluZGV4IGFkZWE4NDEuLjQyZjE5ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwpAQCAtMjksMTIgKzI4LDE2IEBACiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwpAQCAtNTMsNiArNTYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc3BpLlNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJlYW1VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5KYXJNYXJrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRXh0cmFGaWVsZDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBPdXRwdXRTdHJlYW07CkBAIC03NCw3ICs3OCw3IEBACiAgICAgLyoqCiAgICAgICogTGlzdCBvZiBhbGwga25vd24gU1BJIFNlcnZpY2VzCiAgICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PFNlcnZpY2U+IHNlcnZpY2VMaXN0ID0gbmV3IEFycmF5TGlzdDxTZXJ2aWNlPigpOworICAgIHByaXZhdGUgTGlzdDxTZXJ2aWNlPiBzZXJ2aWNlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqIG1lcmdlZCBtYW5pZmVzdHMgYWRkZWQgdGhyb3VnaCBhZGRDb25maWd1cmVkTWFuaWZlc3QgKi8KICAgICBwcml2YXRlIE1hbmlmZXN0IGNvbmZpZ3VyZWRNYW5pZmVzdDsKQEAgLTEzOCw3ICsxNDIsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IHJvb3RFbnRyaWVzOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJvb3RFbnRyaWVzOwogCiAgICAgLyoqCiAgICAgICogUGF0aCBjb250YWluaW5nIGphcnMgdGhhdCBzaGFsbCBiZSBpbmRleGVkIGluIGFkZGl0aW9uIHRvIHRoaXMgYXJjaGl2ZS4KQEAgLTE4Miw3ICsxODYsNyBAQAogICAgICAgICBlbXB0eUJlaGF2aW9yID0gImNyZWF0ZSI7CiAgICAgICAgIHNldEVuY29kaW5nKCJVVEY4Iik7CiAgICAgICAgIHNldFppcDY0TW9kZShaaXA2NE1vZGVBdHRyaWJ1dGUuTkVWRVIpOwotICAgICAgICByb290RW50cmllcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICByb290RW50cmllcyA9IG5ldyBWZWN0b3I8PigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkwLDYgKzE5NCw3IEBACiAgICAgICogQHBhcmFtIHdlIG5vdCB1c2VkCiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFdoZW5lbXB0eShXaGVuRW1wdHkgd2UpIHsKICAgICAgICAgbG9nKCJKQVJzIGFyZSBuZXZlciBlbXB0eSwgdGhleSBjb250YWluIGF0IGxlYXN0IGEgbWFuaWZlc3QgZmlsZSIsCiAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKQEAgLTIyNSw2ICsyMzAsNyBAQAogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgogICAgICAqICAgICAgICAgICAgIFVzZSBzZXREZXN0RmlsZShGaWxlKSBpbnN0ZWFkLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0SmFyZmlsZShGaWxlIGphckZpbGUpIHsKICAgICAgICAgc2V0RGVzdEZpbGUoamFyRmlsZSk7CiAgICAgfQpAQCAtMjQ5LDcgKzI1NSw3IEBACiAgICAgICogamFycyBvbiBKYXZhIDEuNCBvciBlYXJsaWVyIEFudCB3aWxsIG5vdCBpbmNsdWRlIE1FVEEtSU5GCiAgICAgICogdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgdG8uPC9wPgogICAgICAqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vYnVncy5zdW4uY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00NDA4NTI2Ij4KKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstNDQwODUyNiI+CiAgICAgICogamFyIC1pIG9taXRzIHNlcnZpY2UgcHJvdmlkZXJzIGluIGluZGV4Lmxpc3Q8L2E+CiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqIEBwYXJhbSBmbGFnIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUsIGRlZmF1bHRzIHRvIGZhbHNlCkBAIC0zMDEsMjkgKzMwNywxMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoRmlsZSBtYW5pZmVzdEZpbGUpIHsKLQotICAgICAgICBNYW5pZmVzdCBuZXdNYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOwotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBtYW5pZmVzdEVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld01hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoaXNyKTsKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGVuY29kaW5nIHdoaWxlIHJlYWRpbmcgbWFuaWZlc3Q6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUudG9QYXRoKCkpLCBnZXRNYW5pZmVzdENoYXJzZXQoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNYW5pZmVzdChpc3IpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIG1hbmlmZXN0IGZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hbmlmZXN0RmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpc3IpOworICAgICAgICAgICAgICAgICsgbWFuaWZlc3RGaWxlICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiLCBlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3TWFuaWZlc3Q7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzIsMzggKzMyMiwyNSBAQAogICAgICAqIEBzaW5jZSBBbnQgMS41LjIKICAgICAgKi8KICAgICBwcml2YXRlIE1hbmlmZXN0IGdldE1hbmlmZXN0RnJvbUphcihGaWxlIGphckZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFppcEZpbGUgemYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgemYgPSBuZXcgWmlwRmlsZShqYXJGaWxlKTsKLQorICAgICAgICB0cnkgKFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZShqYXJGaWxlKSkgewogICAgICAgICAgICAgLy8gbXVzdCBub3QgdXNlIGdldEVudHJ5IGFzICJ3ZWxsIGJlaGF2aW5nIiBhcHBsaWNhdGlvbnMKICAgICAgICAgICAgIC8vIG11c3QgYWNjZXB0IHRoZSBtYW5pZmVzdCBpbiBhbnkgY2FwaXRhbGl6YXRpb24KLSAgICAgICAgICAgIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZSA9IHpmLmVudHJpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgWmlwRW50cnkgemUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHplLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1BTklGRVNUX05BTUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoemYuZ2V0SW5wdXRTdHJlYW0oemUpLCAiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE1hbmlmZXN0KGlzcik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgWmlwRW50cnkgemUgPSBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKHpmLmVudHJpZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihlbnRyeSAtPiBNQU5JRkVTVF9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoZW50cnkuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKKyAgICAgICAgICAgIGlmICh6ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgemYuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBsb2cgYW4gZXJyb3I/ICB0aHJvdyBhbiBleGNlcHRpb24/Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoemYuZ2V0SW5wdXRTdHJlYW0oemUpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRNYW5pZmVzdChpc3IpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBNYW5pZmVzdCBnZXRNYW5pZmVzdChSZWFkZXIgcikgewotCi0gICAgICAgIE1hbmlmZXN0IG5ld01hbmlmZXN0ID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ld01hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KHIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5pZmVzdChyKTsKICAgICAgICAgfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgbG9nKCJNYW5pZmVzdCBpcyBpbnZhbGlkOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgTWFuaWZlc3Q6ICIgKyBtYW5pZmVzdEZpbGUsCkBAIC0zNzIsMjkgKzM0OSwxMiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBtYW5pZmVzdCBmaWxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGUuZ2V0TWVzc2FnZSgpICsgIikiLCBlKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3TWFuaWZlc3Q7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGphckhhc0luZGV4KEZpbGUgamFyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgWmlwRmlsZSB6ZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6ZiA9IG5ldyBaaXBGaWxlKGphckZpbGUpOwotICAgICAgICAgICAgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlID0gemYuZW50cmllcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBpZiAoemUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSU5ERVhfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyAtIGxvZyBhbiBlcnJvcj8gIHRocm93IGFuIGV4Y2VwdGlvbj8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIHRyeSAoWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKGphckZpbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbSh6Zi5lbnRyaWVzKCkpCisgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaCh6ZSAtPiBJTkRFWF9OQU1FLmVxdWFsc0lnbm9yZUNhc2UoemUuZ2V0TmFtZSgpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxNiw3ICszNzYsNyBAQAogICAgICAgICBtZXJnZU1hbmlmZXN0c01haW4gPSBjb25maWcgIT0gbnVsbCAmJiAibWVyZ2UiLmVxdWFscyhjb25maWcuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgaWYgKGZpbGVzZXRNYW5pZmVzdENvbmZpZyAhPSBudWxsCi0gICAgICAgICAgICAmJiAhZmlsZXNldE1hbmlmZXN0Q29uZmlnLmdldFZhbHVlKCkuZXF1YWxzKCJza2lwIikpIHsKKyAgICAgICAgICAgICYmICEic2tpcCIuZXF1YWxzKGZpbGVzZXRNYW5pZmVzdENvbmZpZy5nZXRWYWx1ZSgpKSkgewogCiAgICAgICAgICAgICBkb3VibGVGaWxlUGFzcyA9IHRydWU7CiAgICAgICAgIH0KQEAgLTQ2MSwxOSArNDIxLDEyIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU2VydmljZXMoWmlwT3V0cHV0U3RyZWFtIHpPdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoU2VydmljZSBzZXJ2aWNlIDogc2VydmljZUxpc3QpIHsKLSAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgaXMgPSBzZXJ2aWNlLmdldEFzU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAvL3N0b2xlbiBmcm9tIHdyaXRlTWFuaWZlc3QKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBzZXJ2aWNlLmdldEFzU3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICAvL3N0b2xlbiBmcm9tIHdyaXRlTWFuaWZlc3QKICAgICAgICAgICAgICAgIHN1cGVyLnppcEZpbGUoaXMsIHpPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi9zZXJ2aWNlcy8iICsgc2VydmljZS5nZXRUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBGaWxlU2V0LkRFRkFVTFRfRklMRV9NT0RFKTsKLSAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgaXMgdW5uZWNlc3Nhcnkgc2luY2UKLSAgICAgICAgICAgICAgIC8vIFNlcnZpY2UuZ2V0QXNTdHJlYW0gcmV0dXJucyBhIEJ5dGVBcnJheUlucHV0U3RyZWFtCi0gICAgICAgICAgICAgICAvLyBhbmQgbm90IGNsb3NpbmcgaXQgd291bGRuJ3QgZG8gYW55IGhhcm0uCi0gICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MDUsNiArNDU4LDcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIEkvTyBlcnJvcnMKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIG90aGVyIGVycm9ycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGluaXRaaXBPdXRwdXRTdHJlYW0oWmlwT3V0cHV0U3RyZWFtIHpPdXQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewogCkBAIC01MTgsMTIgKzQ3MiwxMCBAQAogICAgIHByaXZhdGUgTWFuaWZlc3QgY3JlYXRlTWFuaWZlc3QoKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZW4ndCBnb3QgdGhlIG1hbmlmZXN0IHlldCwgYXR0ZW1wdCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaXQgbm93IGFuZCBoYXZlIG1hbmlmZXN0IGJlIHRoZSBmaW5hbCBtZXJnZQotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hbmlmZXN0ID09IG51bGwgJiYgbWFuaWZlc3RGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IGdvdCB0aGUgbWFuaWZlc3QgeWV0LCBhdHRlbXB0IHRvCisgICAgICAgICAgICAgICAgLy8gZ2V0IGl0IG5vdyBhbmQgaGF2ZSBtYW5pZmVzdCBiZSB0aGUgZmluYWwgbWVyZ2UKKyAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZpbGVzZXQgbWFuaWZlc3QgbXVzdCBjb21lIGV2ZW4gYmVmb3JlIHRoZSBkZWZhdWx0CkBAIC01NzQsMTUgKzUyNiwxNCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWFuaWZlc3QoWmlwT3V0cHV0U3RyZWFtIHpPdXQsIE1hbmlmZXN0IG1hbmlmZXN0KQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKFN0cmluZyB3YXJuaW5nIDogQ29sbGVjdGlvbnMubGlzdChtYW5pZmVzdC5nZXRXYXJuaW5ncygpKSkgewotICAgICAgICAgICAgbG9nKCJNYW5pZmVzdCB3YXJuaW5nOiAiICsgd2FybmluZywgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIH0KKyAgICAgICAgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShtYW5pZmVzdC5nZXRXYXJuaW5ncygpKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKHdhcm5pbmcgLT4gbG9nKCJNYW5pZmVzdCB3YXJuaW5nOiAiICsgd2FybmluZywgUHJvamVjdC5NU0dfV0FSTikpOwogCiAgICAgICAgIHppcERpcigoUmVzb3VyY2UpIG51bGwsIHpPdXQsICJNRVRBLUlORi8iLCBaaXBGaWxlU2V0LkRFRkFVTFRfRElSX01PREUsCiAgICAgICAgICAgICAgICBKQVJfTUFSS0VSKTsKICAgICAgICAgLy8gdGltZSB0byB3cml0ZSB0aGUgbWFuaWZlc3QKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJhb3MsIE1hbmlmZXN0LkpBUl9FTkNPRElORyk7CisgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGJhb3MsIE1hbmlmZXN0LkpBUl9DSEFSU0VUKTsKICAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG9zdyk7CiAgICAgICAgIG1hbmlmZXN0LndyaXRlKHdyaXRlciwgZmxhdHRlbkNsYXNzUGF0aHMpOwogICAgICAgICBpZiAod3JpdGVyLmNoZWNrRXJyb3IoKSkgewpAQCAtNjEwLDYgKzU2MSw3IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBJL08gZXJyb3JzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBvdGhlciBlcnJvcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbShaaXBPdXRwdXRTdHJlYW0gek91dCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBCdWlsZEV4Y2VwdGlvbiB7CiAKQEAgLTYyMSw3ICs1NzMsNyBAQAogICAgIC8qKgogICAgICAqIENyZWF0ZSB0aGUgaW5kZXggbGlzdCB0byBzcGVlZCB1cCBjbGFzc2xvYWRpbmcuCiAgICAgICogVGhpcyBpcyBhIEpESyAxLjMrIHNwZWNpZmljIGZlYXR1cmUgYW5kIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gU2VlCi0gICAgICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2phci9qYXIuaHRtbCNKQVIlMjBJbmRleCI+CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2phci9qYXIuaHRtbCNKQVJfSW5kZXgiPgogICAgICAqIHRoZSBKQVIgaW5kZXggc3BlY2lmaWNhdGlvbjwvYT4gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKgogICAgICAqIEBwYXJhbSB6T3V0IHRoZSB6aXAgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgamFyIGJlaW5nIGJ1aWx0LgpAQCAtNjMxLDggKzU4Myw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUluZGV4TGlzdChaaXBPdXRwdXRTdHJlYW0gek91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIC8vIGVuY29kaW5nIG11c3QgYmUgVVRGOCBhcyBzcGVjaWZpZWQgaW4gdGhlIHNwZWNzLgotICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihiYW9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGOCIpKTsKKyAgICAgICAgUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYmFvcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogCiAgICAgICAgIC8vIHZlcnNpb24taW5mbyBibGFua2xpbmUKICAgICAgICAgd3JpdGVyLnByaW50bG4oIkphckluZGV4LVZlcnNpb246IDEuMCIpOwpAQCAtNjQxLDcgKzU5Miw3IEBACiAgICAgICAgIC8vIGhlYWRlciBuZXdsaW5lCiAgICAgICAgIHdyaXRlci5wcmludGxuKHppcEZpbGUuZ2V0TmFtZSgpKTsKIAotICAgICAgICB3cml0ZUluZGV4TGlrZUxpc3QobmV3IEFycmF5TGlzdDxTdHJpbmc+KGFkZGVkRGlycy5rZXlTZXQoKSksCisgICAgICAgIHdyaXRlSW5kZXhMaWtlTGlzdChuZXcgQXJyYXlMaXN0PD4oYWRkZWREaXJzLmtleVNldCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbnRyaWVzLCB3cml0ZXIpOwogICAgICAgICB3cml0ZXIucHJpbnRsbigpOwogCkBAIC02NjIsOCArNjEzLDggQEAKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGluZGV4SmFyRW50cnkgOiBpbmRleEphcnMubGlzdCgpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaW5kSmFyTmFtZShpbmRleEphckVudHJ5LCBjcEVudHJpZXMpOwogICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gZGlycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBkaXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IGZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICAgICAgICAgIGdyYWJGaWxlc0FuZERpcnMoaW5kZXhKYXJFbnRyeSwgZGlycywgZmlsZXMpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZGlycy5zaXplKCkgKyBmaWxlcy5zaXplKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihuYW1lKTsKQEAgLTY3OCwxNCArNjI5LDEwIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuY291bnRlcmVkIGFuIGVycm9yIHdyaXRpbmcgamFyIGluZGV4Iik7CiAgICAgICAgIH0KICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPQotICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewogICAgICAgICAgICAgc3VwZXIuemlwRmlsZShiYWlzLCB6T3V0LCBJTkRFWF9OQU1FLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgWmlwRmlsZVNldC5ERUZBVUxUX0ZJTEVfTU9ERSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBub3QgcmVhbGx5IHJlcXVpcmVkCi0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoYmFpcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcwMSw2ICs2NDgsNyBAQAogICAgICAqIEBwYXJhbSBtb2RlIHRoZSBVbml4IHBlcm1pc3Npb25zIHRvIHNldC4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgemlwRmlsZShJbnB1dFN0cmVhbSBpcywgWmlwT3V0cHV0U3RyZWFtIHpPdXQsIFN0cmluZyB2UGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkLCBGaWxlIGZyb21BcmNoaXZlLCBpbnQgbW9kZSkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTcxNSw3ICs2NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaW5kZXggJiYgIXZQYXRoLmNvbnRhaW5zKCIvIikpIHsKLSAgICAgICAgICAgICAgICByb290RW50cmllcy5hZGRFbGVtZW50KHZQYXRoKTsKKyAgICAgICAgICAgICAgICByb290RW50cmllcy5hZGQodlBhdGgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3VwZXIuemlwRmlsZShpcywgek91dCwgdlBhdGgsIGxhc3RNb2RpZmllZCwgZnJvbUFyY2hpdmUsIG1vZGUpOwogICAgICAgICB9CkBAIC03MjYsNDAgKzY3NCwyOSBAQAogICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgc2FtZSBuYW1lIHNwZWNpZmllZCBpbiAnbWFuaWZlc3QnLCB0aGlzCiAgICAgICAgICAgICAvLyBpcyB0aGUgbWFuaWZlc3QgdG8gdXNlCiAgICAgICAgICAgICBsb2coIkZvdW5kIG1hbmlmZXN0ICIgKyBmaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RFbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBtYW5pZmVzdEVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtUmVhZGVyIGlzciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZ2V0TWFuaWZlc3RDaGFyc2V0KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoaXNyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IGdldE1hbmlmZXN0KGZpbGUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZW5jb2Rpbmcgd2hpbGUgcmVhZGluZyAiCi0gICAgICAgICAgICAgICAgICAgICsgIm1hbmlmZXN0OiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGZpbGVzZXRNYW5pZmVzdENvbmZpZyAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFmaWxlc2V0TWFuaWZlc3RDb25maWcuZ2V0VmFsdWUoKS5lcXVhbHMoInNraXAiKSkgeworICAgICAgICAgICAgICAgICAgICAmJiAhInNraXAiLmVxdWFscyhmaWxlc2V0TWFuaWZlc3RDb25maWcuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgIC8vIHdlIGFkZCB0aGlzIHRvIG91ciBncm91cCBvZiBmaWxlc2V0IG1hbmlmZXN0cwogICAgICAgICAgICAgbG9nV2hlbldyaXRpbmcoIkZvdW5kIG1hbmlmZXN0IHRvIG1lcmdlIGluIGZpbGUgIiArIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNYW5pZmVzdCBuZXdNYW5pZmVzdCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyOwotICAgICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RFbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBtYW5pZmVzdEVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBuZXdNYW5pZmVzdCA9IGdldE1hbmlmZXN0KGlzcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYW5pZmVzdCBuZXdNYW5pZmVzdDsKKyAgICAgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBuZXdNYW5pZmVzdCA9IGdldE1hbmlmZXN0KGZpbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZ2V0TWFuaWZlc3RDaGFyc2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYW5pZmVzdCA9IGdldE1hbmlmZXN0KGlzcik7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoZmlsZXNldE1hbmlmZXN0ID09IG51bGwpIHsKQEAgLTgxNSw2ICs3NTIsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBpdCBsaWtlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBBcmNoaXZlU3RhdGUgZ2V0UmVzb3VyY2VzVG9BZGQoUmVzb3VyY2VDb2xsZWN0aW9uW10gcmNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSB6aXBGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkc1VwZGF0ZSkKQEAgLTg4NSw1MCArODIzLDQ4IEBACiAgICAgICogQHJldHVybiB0cnVlIGZvciBoaXN0b3JpYyByZWFzb25zCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGNyZWF0ZUVtcHR5WmlwKEZpbGUgemlwRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFjcmVhdGVFbXB0eSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoInNraXAiKSkgeworICAgICAgICBpZiAoInNraXAiLmVxdWFscyhlbXB0eUJlaGF2aW9yKSkgewogICAgICAgICAgICAgaWYgKCFza2lwV3JpdGluZykgewogICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogc2tpcHBpbmcgIiArIGFyY2hpdmVUeXBlICsgIiBhcmNoaXZlICIKICAgICAgICAgICAgICAgICAgICAgKyB6aXBGaWxlICsgIiBiZWNhdXNlIG5vIGZpbGVzIHdlcmUgaW5jbHVkZWQuIiwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChlbXB0eUJlaGF2aW9yLmVxdWFscygiZmFpbCIpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJmYWlsIi5lcXVhbHMoZW1wdHlCZWhhdmlvcikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSAiICsgYXJjaGl2ZVR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJjaGl2ZSAiICsgemlwRmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogbm8gZmlsZXMgd2VyZSBpbmNsdWRlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgWmlwT3V0cHV0U3RyZWFtIHpPdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFza2lwV3JpdGluZykgewotICAgICAgICAgICAgICAgIGxvZygiQnVpbGRpbmcgTUFOSUZFU1Qtb25seSBqYXI6ICIKKyAgICAgICAgaWYgKCFza2lwV3JpdGluZykgeworICAgICAgICAgICAgbG9nKCJCdWlsZGluZyBNQU5JRkVTVC1vbmx5IGphcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldERlc3RGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgek91dCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0oZ2V0RGVzdEZpbGUoKSk7CiAKLSAgICAgICAgICAgIHpPdXQuc2V0RW5jb2RpbmcoZ2V0RW5jb2RpbmcoKSk7Ci0gICAgICAgICAgICB6T3V0LnNldFVzZVppcDY0KGdldFppcDY0TW9kZSgpLmdldE1vZGUoKSk7Ci0gICAgICAgICAgICBpZiAoaXNDb21wcmVzcygpKSB7Ci0gICAgICAgICAgICAgICAgek91dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgek91dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLlNUT1JFRCk7CisgICAgICAgICAgICB0cnkgKFppcE91dHB1dFN0cmVhbSB6T3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShnZXREZXN0RmlsZSgpKSkgeworICAgICAgICAgICAgICAgIHpPdXQuc2V0RW5jb2RpbmcoZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgICAgICAgICAgek91dC5zZXRVc2VaaXA2NChnZXRaaXA2NE1vZGUoKS5nZXRNb2RlKCkpOworICAgICAgICAgICAgICAgIGlmIChpc0NvbXByZXNzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgek91dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB6T3V0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uU1RPUkVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5pdFppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICAgICAgICAgICAgICBmaW5hbGl6ZVppcE91dHB1dFN0cmVhbSh6T3V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBhbG1vc3QgZW1wdHkgSkFSIGFyY2hpdmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIGlvZS5nZXRNZXNzYWdlKCkgKyAiKSIsIGlvZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUVtcHR5ID0gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbml0WmlwT3V0cHV0U3RyZWFtKHpPdXQpOwotICAgICAgICAgICAgZmluYWxpemVaaXBPdXRwdXRTdHJlYW0oek91dCk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGFsbW9zdCBlbXB0eSBKQVIgYXJjaGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKCIgKyBpb2UuZ2V0TWVzc2FnZSgpICsgIikiLCBpb2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh6T3V0KTsKLSAgICAgICAgICAgIGNyZWF0ZUVtcHR5ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtOTM5LDYgKzg3NSw3IEBACiAgICAgICoKICAgICAgKiBAc2VlIFppcCNjbGVhblVwCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY2xlYW5VcCgpIHsKICAgICAgICAgc3VwZXIuY2xlYW5VcCgpOwogICAgICAgICBjaGVja0phclNwZWMoKTsKQEAgLTk1MCwxOCArODg3LDE3IEBACiAgICAgICAgICAgICBmaWxlc2V0TWFuaWZlc3QgPSBudWxsOwogICAgICAgICAgICAgb3JpZ2luYWxNYW5pZmVzdCA9IG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdEVudHJpZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgcm9vdEVudHJpZXMuY2xlYXIoKTsKICAgICB9CiAKICAgICAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGggT0ZGIC0gTGluayBpcyB0b28gbG9uZy4KICAgICAvKioKICAgICAgKiBDaGVjayBhZ2FpbnN0IHBhY2thZ2luZyBzcGVjCi0gICAgICogQHNlZSAiaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL3ZlcnNpb25pbmcvc3BlYy9WZXJzaW9uaW5nU3BlY2lmaWNhdGlvbi5odG1sI1BhY2thZ2VWZXJzaW9uaW5nIgorICAgICAqIEBzZWUgImh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS90dXRvcmlhbC9kZXBsb3ltZW50L2phci9wYWNrYWdlbWFuLmh0bWwiCiAgICAgICovCiAgICAgLy8gQ2hlY2tTdHlsZTpMaW5lTGVuZ3RoIE9OCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSmFyU3BlYygpIHsKLSAgICAgICAgU3RyaW5nIGJyID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBTdHJpbmdCdWZmZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgU2VjdGlvbiBtYWluU2VjdGlvbiA9IChjb25maWd1cmVkTWFuaWZlc3QgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbmZpZ3VyZWRNYW5pZmVzdC5nZXRNYWluU2VjdGlvbigpOwpAQCAtOTgzLDE0ICs5MTksMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtZXNzYWdlLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoYnIpOwotICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoIkxvY2F0aW9uOiAiKS5hcHBlbmQoZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChicik7Ci0gICAgICAgICAgICBpZiAoc3RyaWN0LmdldFZhbHVlKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmFpbCIpKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlbkxvY2F0aW9uOiAlcyVuIiwgZ2V0TG9jYXRpb24oKSkpOworICAgICAgICAgICAgaWYgKCJmYWlsIi5lcXVhbHNJZ25vcmVDYXNlKHN0cmljdC5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLnRvU3RyaW5nKCksIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2dXaGVuV3JpdGluZyhtZXNzYWdlLnRvU3RyaW5nKCksIHN0cmljdC5nZXRMb2dMZXZlbCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZ1doZW5Xcml0aW5nKG1lc3NhZ2UudG9TdHJpbmcoKSwgc3RyaWN0LmdldExvZ0xldmVsKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDAxLDYgKzkzNCw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgMS40NCwgQW50IDEuNQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgICBzdXBlci5yZXNldCgpOwogICAgICAgICBlbXB0eUJlaGF2aW9yID0gImNyZWF0ZSI7CkBAIC0xMDE5LDYgKzk1Myw3IEBACiAgICAgICAgICAqIEdldCB0aGUgbGlzdCBvZiB2YWxpZCBzdHJpbmdzLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbHVlcyAtICJza2lwIiwgIm1lcmdlIiBhbmQgIm1lcmdld2l0aG91dG1haW4iCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJza2lwIiwgIm1lcmdlIiwgIm1lcmdld2l0aG91dG1haW4ifTsKICAgICAgICAgfQpAQCAtMTA1OCw3ICs5OTMsNyBAQAogICAgICAgICAgICAgLy8gYW5kIHRoZSBjaGVjayBpcyBub3QgY2FzZSBpbnNlbnNpdGl2ZS4KICAgICAgICAgICAgIC8vIHNlZSBzdW4ubWlzYy5KYXJJbmRleAogICAgICAgICAgICAgLy8gc2VlIGFsc28KLSAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ0MDg1MjYKKyAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstNDQwODUyNgogICAgICAgICAgICAgaWYgKCFpbmRleE1ldGFJbmYgJiYgZGlyLnN0YXJ0c1dpdGgoIk1FVEEtSU5GIikpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTEwNjYsOSArMTAwMSw3IEBACiAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihkaXIpOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICB3cml0ZXIucHJpbnRsbihmaWxlKTsKLSAgICAgICAgfQorICAgICAgICBmaWxlcy5mb3JFYWNoKHdyaXRlcjo6cHJpbnRsbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDk0LDM5ICsxMDI3LDI3IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZmluZEphck5hbWUoU3RyaW5nIGZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNsYXNzcGF0aCkgewogICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobmV3IEZpbGUoZmlsZU5hbWUpKS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZmlsZU5hbWUpLmdldE5hbWUoKTsKICAgICAgICAgfQogICAgICAgICBmaWxlTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotICAgICAgICBUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBtYXRjaGVzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KG5ldyBDb21wYXJhdG9yPE9iamVjdD4oKSB7Ci0gICAgICAgICAgICAgICAgLy8gbG9uZ2VzdCBtYXRjaCBjb21lcyBmaXJzdAotICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgICAgICBpZiAobzEgaW5zdGFuY2VvZiBTdHJpbmcgJiYgbzIgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFN0cmluZykgbzIpLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKFN0cmluZykgbzEpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOworICAgICAgICBTb3J0ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hdGNoZXMgPSBuZXcgVHJlZU1hcDw+KENvbXBhcmF0b3IKKyAgICAgICAgICAgIC48U3RyaW5nPiBjb21wYXJpbmdJbnQocyAtPiBzID09IG51bGwgPyAwIDogcy5sZW5ndGgoKSkucmV2ZXJzZWQoKSk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5lbmRzV2l0aChjbGFzc3BhdGhbaV0pKSB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXQoY2xhc3NwYXRoW2ldLCBjbGFzc3BhdGhbaV0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgc2xhc2ggPSBjbGFzc3BhdGhbaV0uaW5kZXhPZigiLyIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBjYW5kaWRhdGUgPSBjbGFzc3BhdGhbaV07Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNsYXNoID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnN1YnN0cmluZyhzbGFzaCArIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUuZW5kc1dpdGgoY2FuZGlkYXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXQoY2FuZGlkYXRlLCBjbGFzc3BhdGhbaV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2xhc2ggPSBjYW5kaWRhdGUuaW5kZXhPZigiLyIpOworICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogY2xhc3NwYXRoKSB7CisgICAgICAgICAgICBTdHJpbmcgY2FuZGlkYXRlID0gZWxlbWVudDsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXQoY2FuZGlkYXRlLCBlbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludCBzbGFzaCA9IGNhbmRpZGF0ZS5pbmRleE9mKCcvJyk7CisgICAgICAgICAgICAgICAgaWYgKHNsYXNoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnN1YnN0cmluZyhzbGFzaCArIDEpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1hdGNoZXMuc2l6ZSgpID09IDAKLSAgICAgICAgICAgID8gbnVsbCA6IChTdHJpbmcpIG1hdGNoZXMuZ2V0KG1hdGNoZXMuZmlyc3RLZXkoKSk7CisgICAgICAgIHJldHVybiBtYXRjaGVzLmlzRW1wdHkoKSA/IG51bGwgOiBtYXRjaGVzLmdldChtYXRjaGVzLmZpcnN0S2V5KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE0MSw1MSArMTA2Miw0MyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBncmFiRmlsZXNBbmREaXJzKFN0cmluZyBmaWxlLCBMaXN0PFN0cmluZz4gZGlycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZmlsZXMpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUgemYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgemYgPSBuZXcgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZShmaWxlLCAidXRmLTgiKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uPG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5PiBlbnRyaWVzID0gemYuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGRpclNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnkgemUgPQotICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgIHRyeSAob3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZSB6ZiA9IG5ldyBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlKGZpbGUsICJ1dGYtOCIpKSB7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBkaXJTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKHpmLmdldEVudHJpZXMoKSkuZm9yRWFjaCh6ZSAtPiB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSB6ZS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgZGlyU2V0LmFkZChuYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuaW5kZXhPZigiLyIpID09IC0xKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmFtZS5jb250YWlucygiLyIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChuYW1lKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBhIGZpbGUsIG5vdCBpbiB0aGUgcm9vdAogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgamFyIG1heSBiZSBvbmUgd2l0aG91dCBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcywgYWRkIHRoZSBwYXJlbnQgZGlyIG9mIHRoaXMgZmlsZSBhcwogICAgICAgICAgICAgICAgICAgICAvLyB3ZWxsLgotICAgICAgICAgICAgICAgICAgICBkaXJTZXQuYWRkKG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgZGlyU2V0LmFkZChuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBkaXJzLmFkZEFsbChkaXJTZXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBSZXNvdXJjZVtdW10gZ3JhYk1hbmlmZXN0cyhSZXNvdXJjZUNvbGxlY3Rpb25bXSByY3MpIHsKICAgICAgICAgUmVzb3VyY2VbXVtdIG1hbmlmZXN0cyA9IG5ldyBSZXNvdXJjZVtyY3MubGVuZ3RoXVtdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgUmVzb3VyY2VbXVtdIHJlc291cmNlcyA9IG51bGw7CisgICAgICAgICAgICBSZXNvdXJjZVtdW10gcmVzb3VyY2VzOwogICAgICAgICAgICAgaWYgKHJjc1tpXSBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKICAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBncmFiUmVzb3VyY2VzKG5ldyBGaWxlU2V0W10geyhGaWxlU2V0KSByY3NbaV19KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmVzb3VyY2VzID0gZ3JhYk5vbkZpbGVTZXRSZXNvdXJjZXMobmV3IFJlc291cmNlQ29sbGVjdGlvbltdIHtyY3NbaV19KTsKKyAgICAgICAgICAgICAgICByZXNvdXJjZXMgPSBncmFiTm9uRmlsZVNldFJlc291cmNlcygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQ29sbGVjdGlvbltdIHtyY3NbaV19KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzb3VyY2VzWzBdLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSByZXNvdXJjZXNbMF1bal0uZ2V0TmFtZSgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKICAgICAgICAgICAgICAgICBpZiAocmNzW2ldIGluc3RhbmNlb2YgQXJjaGl2ZUZpbGVTZXQpIHsKICAgICAgICAgICAgICAgICAgICAgQXJjaGl2ZUZpbGVTZXQgYWZzID0gKEFyY2hpdmVGaWxlU2V0KSByY3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKGFmcy5nZXRGdWxscGF0aChnZXRQcm9qZWN0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWFmcy5nZXRGdWxscGF0aChnZXRQcm9qZWN0KCkpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFmcy5nZXRGdWxscGF0aChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEiIi5lcXVhbHMoYWZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpKSkgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhZnMuZ2V0UHJlZml4KGdldFByb2plY3QoKSkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gYWZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVmaXguZW5kc1dpdGgoIi8iKSAmJiAhcHJlZml4LmVuZHNXaXRoKCJcXCIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICs9ICIvIjsKQEAgLTExOTMsNyArMTEwNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcHJlZml4ICsgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BTklGRVNUX05BTUUpKSB7CisgICAgICAgICAgICAgICAgaWYgKE1BTklGRVNUX05BTUUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdHNbaV0gPSBuZXcgUmVzb3VyY2VbXSB7cmVzb3VyY2VzWzBdW2pdfTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTIwNSwxMSArMTExOCwyNiBAQAogICAgICAgICByZXR1cm4gbWFuaWZlc3RzOwogICAgIH0KIAorICAgIHByaXZhdGUgQ2hhcnNldCBnZXRNYW5pZmVzdENoYXJzZXQoKSB7CisgICAgICAgIGlmIChtYW5pZmVzdEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDaGFyc2V0LmZvck5hbWUobWFuaWZlc3RFbmNvZGluZyk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGVuY29kaW5nIHdoaWxlIHJlYWRpbmcgbWFuaWZlc3Q6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBUaGUgc3RyaWN0IGVudW1lcmF0ZWQgdHlwZS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmljdE1vZGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKICAgICAgICAgLyoqIFB1YmxpYyBubyBhcmcgY29uc3RydWN0b3IuICovCiAgICAgICAgIHB1YmxpYyBTdHJpY3RNb2RlKCkgewogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdG9yIHdpdGggYW4gYXJnLgogICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGVudW1lcmF0ZWQgdmFsdWUgYXMgYSBzdHJpbmcuCkBAIC0xMjE3LDE4ICsxMTQ1LDIxIEBACiAgICAgICAgIHB1YmxpYyBTdHJpY3RNb2RlKFN0cmluZyB2YWx1ZSkgewogICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOwogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCBMaXN0IG9mIHZhbGlkIHN0cmluZ3MuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsdWVzLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiZmFpbCIsICJ3YXJuIiwgImlnbm9yZSJ9OwogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gVGhlIGxvZyBsZXZlbCBhY2NvcmRpbmcgdG8gdGhlIHN0cmljdCBtb2RlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRMb2dMZXZlbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAoZ2V0VmFsdWUoKS5lcXVhbHMoImlnbm9yZSIpKSA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19XQVJOOworICAgICAgICAgICAgcmV0dXJuICJpZ25vcmUiLmVxdWFscyhnZXRWYWx1ZSgpKSA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19XQVJOOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YS5qYXZhCmluZGV4IGE0OWEzNGYuLjdhY2RhZDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmEuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MCw2ICs1MCw4IEBACiAgKiBAYW50LnRhc2sgY2F0ZWdvcnk9ImphdmEiCiAgKi8KIHB1YmxpYyBjbGFzcyBKYXZhIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVPVVRfTUVTU0FHRSA9CisgICAgICAgICAgICAiVGltZW91dDoga2lsbGVkIHRoZSBzdWItcHJvY2VzcyI7CiAKICAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjbWRsID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwogICAgIHByaXZhdGUgRW52aXJvbm1lbnQgZW52ID0gbmV3IEVudmlyb25tZW50KCk7CkBAIC03Niw5ICs3OCw2IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHNwYXduID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIGluY29tcGF0aWJsZVdpdGhTcGF3biA9IGZhbHNlOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVPVVRfTUVTU0FHRSA9Ci0gICAgICAgICJUaW1lb3V0OiBraWxsZWQgdGhlIHN1Yi1wcm9jZXNzIjsKLQogICAgIC8qKgogICAgICAqIE5vcm1hbCBjb25zdHJ1Y3RvcgogICAgICAqLwpAQCAtOTgsNiArOTcsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZmFpbE9uRXJyb3IgaXMgc2V0IHRvIHRydWUgYW5kIHRoZSBhcHBsaWNhdGlvbgogICAgICAqIHJldHVybnMgYSBub256ZXJvIHJlc3VsdCBjb2RlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBGaWxlIHNhdmVkRGlyID0gZGlyOwogICAgICAgICBQZXJtaXNzaW9ucyBzYXZlZFBlcm1pc3Npb25zID0gcGVybTsKQEAgLTE0MiwzNCArMTQyLDQwIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGdldENvbW1hbmRMaW5lKCkuZ2V0Q2xhc3NuYW1lKCk7CiAgICAgICAgIFN0cmluZyBtb2R1bGUgPSBnZXRDb21tYW5kTGluZSgpLmdldE1vZHVsZSgpOwotICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwgJiYgZ2V0Q29tbWFuZExpbmUoKS5nZXRKYXIoKSA9PSBudWxsICYmIG1vZHVsZSA9PSBudWxsKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VGaWxlID0gZ2V0Q29tbWFuZExpbmUoKS5nZXRTb3VyY2VGaWxlKCk7CisgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCAmJiBnZXRDb21tYW5kTGluZSgpLmdldEphcigpID09IG51bGwgJiYgbW9kdWxlID09IG51bGwgJiYgc291cmNlRmlsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNsYXNzbmFtZSBtdXN0IG5vdCBiZSBudWxsLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmICghZm9yayAmJiBnZXRDb21tYW5kTGluZSgpLmdldEphcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGV4ZWN1dGUgYSBqYXIgaW4gbm9uLWZvcmtlZCBtb2RlLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUGxlYXNlIHNldCBmb3JrPSd0cnVlJy4gIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIGEgamFyIGluIG5vbi1mb3JrZWQgbW9kZS4gUGxlYXNlIHNldCBmb3JrPSd0cnVlJy4gIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmb3JrICYmIGdldENvbW1hbmRMaW5lKCkuZ2V0TW9kdWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZXhlY3V0ZSBhIG1vZHVsZSBpbiBub24tZm9ya2VkIG1vZGUuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQbGVhc2Ugc2V0IGZvcms9J3RydWUnLiAiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGV4ZWN1dGUgYSBtb2R1bGUgaW4gbm9uLWZvcmtlZCBtb2RlLiBQbGVhc2Ugc2V0IGZvcms9J3RydWUnLiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvcmsgJiYgc291cmNlRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBleGVjdXRlIHNvdXJjZWZpbGUgaW4gbm9uLWZvcmtlZCBtb2RlLiBQbGVhc2Ugc2V0IGZvcms9J3RydWUnIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNwYXduICYmICFmb3JrKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBzcGF3biBhIGphdmEgcHJvY2VzcyBpbiBub24tZm9ya2VkIG1vZGUuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBQbGVhc2Ugc2V0IGZvcms9J3RydWUnLiAiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNwYXduIGEgamF2YSBwcm9jZXNzIGluIG5vbi1mb3JrZWQgbW9kZS4gUGxlYXNlIHNldCBmb3JrPSd0cnVlJy4gIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0Q2xhc3NwYXRoKCkgIT0gbnVsbAogICAgICAgICAgICAgJiYgZ2V0Q29tbWFuZExpbmUoKS5nZXRKYXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb2coIldoZW4gdXNpbmcgJ2phcicgYXR0cmlidXRlIGNsYXNzcGF0aC1zZXR0aW5ncyBhcmUgaWdub3JlZC4gIgotICAgICAgICAgICAgICAgICsgIlNlZSB0aGUgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJXaGVuIHVzaW5nICdqYXInIGF0dHJpYnV0ZSBjbGFzc3BhdGgtc2V0dGluZ3MgYXJlIGlnbm9yZWQuIFNlZSB0aGUgbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNwYXduICYmIGluY29tcGF0aWJsZVdpdGhTcGF3bikgewotICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygic3Bhd24gZG9lcyBub3QgYWxsb3cgYXR0cmlidXRlcyByZWxhdGVkIHRvIGlucHV0LCAiCi0gICAgICAgICAgICArICJvdXRwdXQsIGVycm9yLCByZXN1bHQiLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygKKyAgICAgICAgICAgICAgICAic3Bhd24gZG9lcyBub3QgYWxsb3cgYXR0cmlidXRlcyByZWxhdGVkIHRvIGlucHV0LCBvdXRwdXQsIGVycm9yLCByZXN1bHQiLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJzcGF3biBhbHNvIGRvZXMgbm90IGFsbG93IHRpbWVvdXQiLCBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiZmluYWxseSwgc3Bhd24gaXMgbm90IGNvbXBhdGlibGUgIgotICAgICAgICAgICAgICAgICsgIndpdGggYSBuZXN0ZWQgSS9PIDxyZWRpcmVjdG9yPiIsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBoYXZlIHVzZWQgYW4gYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICArICJvciBuZXN0ZWQgZWxlbWVudCB3aGljaCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHNwYXduIik7CisgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKAorICAgICAgICAgICAgICAgICJmaW5hbGx5LCBzcGF3biBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGEgbmVzdGVkIEkvTyA8cmVkaXJlY3Rvcj4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0VSUik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIllvdSBoYXZlIHVzZWQgYW4gYXR0cmlidXRlIG9yIG5lc3RlZCBlbGVtZW50IHdoaWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggc3Bhd24iKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0Q29tbWFuZExpbmUoKS5nZXRBc3NlcnRpb25zKCkgIT0gbnVsbCAmJiAhZm9yaykgewogICAgICAgICAgICAgbG9nKCJBc3NlcnRpb24gc3RhdGVtZW50cyBhcmUgY3VycmVudGx5IGlnbm9yZWQgaW4gbm9uLWZvcmtlZCBtb2RlIik7CkBAIC0xODksOCArMTk1LDggQEAKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobmV3RW52aXJvbm1lbnQgfHwgbnVsbCAhPSBlbnYuZ2V0VmFyaWFibGVzKCkpIHsKLSAgICAgICAgICAgICAgICBsb2coIkNoYW5nZXMgdG8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBpZ25vcmVkIHdoZW4gc2FtZSAiCi0gICAgICAgICAgICAgICAgICAgICsgIkpWTSBpcyB1c2VkLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGxvZygiQ2hhbmdlcyB0byBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGlnbm9yZWQgd2hlbiBzYW1lIEpWTSBpcyB1c2VkLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0Qm9vdGNsYXNzcGF0aCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBsb2coImJvb3RjbGFzc3BhdGggaWdub3JlZCB3aGVuIHNhbWUgSlZNIGlzIHVzZWQuIiwKQEAgLTIxNSwxOSArMjIxLDE3IEBACiAgICAgcHJvdGVjdGVkIGludCBleGVjdXRlSmF2YShDb21tYW5kbGluZUphdmEgY29tbWFuZExpbmUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChmb3JrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzcGF3bikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yayhjb21tYW5kTGluZS5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzcGF3bikgewogICAgICAgICAgICAgICAgICAgICBzcGF3bihjb21tYW5kTGluZS5nZXRDb21tYW5kbGluZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBydW4oY29tbWFuZExpbmUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGl0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBleC5nZXRTdGF0dXMoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcmsoY29tbWFuZExpbmUuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGNhdGNoIChFeGl0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4LmdldFN0YXR1cygpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAoZS5nZXRMb2NhdGlvbigpID09IG51bGwgJiYgZ2V0TG9jYXRpb24oKSAhPSBudWxsKSB7CkBAIC0yMzUsMjMgKzIzOSwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKFRJTUVPVVRfTUVTU0FHRS5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhUSU1FT1VUX01FU1NBR0UpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFRJTUVPVVRfTUVTU0FHRS5lcXVhbHMoZS5nZXRNZXNzYWdlKCkpKSB7CisgICAgICAgICAgICAgICAgbG9nKFRJTUVPVVRfTUVTU0FHRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxvZyhlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfSBjYXRjaCAoVGhyZWFkRGVhdGggdCkgewogICAgICAgICAgICAgdGhyb3cgdDsgLy8gY2YuIE5CICM0NzE5MQogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHQsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2codCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKHQpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTcsMTIgKzM1OSwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGphcmZpbGUgdGhlIGphcmZpbGUgdG8gZXhlY3V0ZS4KICAgICAgKgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYWxzbyBhIG1haW4gY2xhc3Mgc3BlY2lmaWVkLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYWxzbyBhIHtAY29kZSBjbGFzc25hbWV9LCB7QGNvZGUgbW9kdWxlfQorICAgICAqICAgICAgICAgICAgICBvciB7QGNvZGUgc291cmNlZmlsZX0gYXR0cmlidXRlIHNwZWNpZmllZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEphcihGaWxlIGphcmZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldENsYXNzbmFtZSgpICE9IG51bGwgfHwgZ2V0Q29tbWFuZExpbmUoKS5nZXRNb2R1bGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCB1c2UgJ2phcicgd2l0aCAnY2xhc3NuYW1lJyBvciAnbW9kdWxlJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQuIik7CisgICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldENsYXNzbmFtZSgpICE9IG51bGwgfHwgZ2V0Q29tbWFuZExpbmUoKS5nZXRNb2R1bGUoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgZ2V0Q29tbWFuZExpbmUoKS5nZXRTb3VyY2VGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSBjb21iaW5hdGlvbiBvZiAnamFyJywgJ3NvdXJjZWZpbGUnLCAnY2xhc3NuYW1lJywgJ21vZHVsZScgYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQiKTsKICAgICAgICAgfQogICAgICAgICBnZXRDb21tYW5kTGluZSgpLnNldEphcihqYXJmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICB9CkBAIC0zNzIsMTIgKzM3NiwxMiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHMgdGhlIG5hbWUgb2YgdGhlIG1haW4gY2xhc3MuCiAgICAgICoKLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBqYXIgYXR0cmlidXRlIGhhcyBiZWVuIHNldC4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFsc28gYSB7QGNvZGUgamFyfSBvciB7QGNvZGUgc291cmNlZmlsZX0gYXR0cmlidXRlIHNwZWNpZmllZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENsYXNzbmFtZShTdHJpbmcgcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0SmFyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQiKTsKKyAgICAgICAgaWYgKGdldENvbW1hbmRMaW5lKCkuZ2V0SmFyKCkgIT0gbnVsbCB8fCBnZXRDb21tYW5kTGluZSgpLmdldFNvdXJjZUZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCB1c2UgY29tYmluYXRpb24gb2YgJ2phcicsICdjbGFzc25hbWUnLCBzb3VyY2VmaWxlIGF0dHJpYnV0ZXMgaW4gc2FtZSBjb21tYW5kIik7CiAgICAgICAgIH0KICAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5zZXRDbGFzc25hbWUocyk7CiAgICAgfQpAQCAtMzg3LDE4ICszOTEsMzggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBtb2R1bGUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAgKgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGphciBhdHRyaWJ1dGUgaGFzIGJlZW4gc2V0LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYWxzbyBhIHtAY29kZSBqYXJ9IG9yIHtAY29kZSBzb3VyY2VmaWxlfSBhdHRyaWJ1dGUgc3BlY2lmaWVkCiAgICAgICogQHNpbmNlIDEuOS43CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TW9kdWxlKFN0cmluZyBtb2R1bGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldEphcigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHVzZSAnamFyJyBhbmQgJ21vZHVsZScgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMgaW4gc2FtZSBjb21tYW5kIik7CisgICAgICAgIGlmIChnZXRDb21tYW5kTGluZSgpLmdldEphcigpICE9IG51bGwgfHwgZ2V0Q29tbWFuZExpbmUoKS5nZXRTb3VyY2VGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSBjb21iaW5hdGlvbiBvZiAnamFyJywgJ21vZHVsZScsIHNvdXJjZWZpbGUgYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQiKTsKICAgICAgICAgfQogICAgICAgICBnZXRDb21tYW5kTGluZSgpLnNldE1vZHVsZShtb2R1bGUpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCB0aGUgSmF2YSBzb3VyY2UtZmlsZSB0byBleGVjdXRlLiBTdXBwb3J0IGZvciBzaW5nbGUgZmlsZSBzb3VyY2UgcHJvZ3JhbQorICAgICAqIGV4ZWN1dGlvbiwgaW4gSmF2YSwgaXMgb25seSBhdmFpbGFibGUgc2luY2UgSmF2YSAxMS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYWxzbyBhIHtAY29kZSBqYXJ9LCB7QGNvZGUgY2xhc3NuYW1lfQorICAgICAqICAgICAgICAgICAgICBvciB7QGNvZGUgbW9kdWxlfSBhdHRyaWJ1dGUgc3BlY2lmaWVkCisgICAgICogQHNpbmNlIEFudCAxLjEwLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGaWxlKGZpbmFsIFN0cmluZyBzb3VyY2VGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgamFyID0gZ2V0Q29tbWFuZExpbmUoKS5nZXRKYXIoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGdldENvbW1hbmRMaW5lKCkuZ2V0Q2xhc3NuYW1lKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtb2R1bGUgPSBnZXRDb21tYW5kTGluZSgpLmdldE1vZHVsZSgpOworICAgICAgICBpZiAoamFyICE9IG51bGwgfHwgY2xhc3NOYW1lICE9IG51bGwgfHwgbW9kdWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IHVzZSAnc291cmNlZmlsZScgaW4gY29tYmluYXRpb24gd2l0aCAnamFyJyBvciAiICsKKyAgICAgICAgICAgICAgICAgICAgIidtb2R1bGUnIG9yICdjbGFzc25hbWUnIik7CisgICAgICAgIH0KKyAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5zZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUpOworICAgIH0KKworICAgIC8qKgogICAgICAqIERlcHJlY2F0ZWQ6IHVzZSBuZXN0ZWQgYXJnIGluc3RlYWQuCiAgICAgICogU2V0IHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgY2xhc3MuCiAgICAgICoKQEAgLTQwNyw4ICs0MzEsOCBAQAogICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRBcmdzKFN0cmluZyBzKSB7Ci0gICAgICAgIGxvZygiVGhlIGFyZ3MgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQuICIKLSAgICAgICAgICAgICsgIlBsZWFzZSB1c2UgbmVzdGVkIGFyZyBlbGVtZW50cy4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgbG9nKCJUaGUgYXJncyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBuZXN0ZWQgYXJnIGVsZW1lbnRzLiIsCisgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgZ2V0Q29tbWFuZExpbmUoKS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUocyk7CiAgICAgfQogCkBAIC00NzUsOCArNDk5LDggQEAKICAgICAgKiBAcGFyYW0gcyBqdm1hcmdzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEp2bWFyZ3MoU3RyaW5nIHMpIHsKLSAgICAgICAgbG9nKCJUaGUganZtYXJncyBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4gIgotICAgICAgICAgICAgKyAiUGxlYXNlIHVzZSBuZXN0ZWQganZtYXJnIGVsZW1lbnRzLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBsb2coIlRoZSBqdm1hcmdzIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG5lc3RlZCBqdm1hcmcgZWxlbWVudHMuIiwKKyAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICBnZXRDb21tYW5kTGluZSgpLmNyZWF0ZVZtQXJndW1lbnQoKS5zZXRMaW5lKHMpOwogICAgIH0KIApAQCAtNTU3LDggKzU4MSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SW5wdXQoRmlsZSBpbnB1dCkgewogICAgICAgICBpZiAoaW5wdXRTdHJpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgXCJpbnB1dFwiIGFuZCBcImlucHV0c3RyaW5nXCIgIgotICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBcImlucHV0XCIgYW5kIFwiaW5wdXRzdHJpbmdcIiBhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZCIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKICAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKQEAgLTU3MSw4ICs1OTUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldElucHV0U3RyaW5nKFN0cmluZyBpbnB1dFN0cmluZykgewogICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgXCJpbnB1dFwiIGFuZCBcImlucHV0c3RyaW5nXCIgIgotICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZXMgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBcImlucHV0XCIgYW5kIFwiaW5wdXRzdHJpbmdcIiBhdHRyaWJ1dGVzIGNhbm5vdCBib3RoIGJlIHNwZWNpZmllZCIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuaW5wdXRTdHJpbmcgPSBpbnB1dFN0cmluZzsKICAgICAgICAgaW5jb21wYXRpYmxlV2l0aFNwYXduID0gdHJ1ZTsKQEAgLTcyNiw2ICs3NTAsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVPdXRwdXQoU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAocmVkaXJlY3Rvci5nZXRPdXRwdXRTdHJlYW0oKSAhPSBudWxsKSB7CiAgICAgICAgICAgICByZWRpcmVjdG9yLmhhbmRsZU91dHB1dChvdXRwdXQpOwpAQCAtNzQ2LDYgKzc3MSw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZGF0YSBjYW5ub3QgYmUgcmVhZC4KICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFuZGxlSW5wdXQoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgLy8gU2hvdWxkIHdvcmsgd2hldGhlciBvciBub3QgcmVkaXJlY3Rvci5pbnB1dFN0cmVhbSA9PSBudWxsOgpAQCAtNzU5LDYgKzc4NSw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuNS4yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmx1c2goU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAocmVkaXJlY3Rvci5nZXRPdXRwdXRTdHJlYW0oKSAhPSBudWxsKSB7CiAgICAgICAgICAgICByZWRpcmVjdG9yLmhhbmRsZUZsdXNoKG91dHB1dCk7CkBAIC03NzQsNiArODAxLDcgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS41CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAocmVkaXJlY3Rvci5nZXRFcnJvclN0cmVhbSgpICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlZGlyZWN0b3IuaGFuZGxlRXJyb3JPdXRwdXQob3V0cHV0KTsKQEAgLTc4OSw2ICs4MTcsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjUuMgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUVycm9yRmx1c2goU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAocmVkaXJlY3Rvci5nZXRFcnJvclN0cmVhbSgpICE9IG51bGwpIHsKICAgICAgICAgICAgIHJlZGlyZWN0b3IuaGFuZGxlRXJyb3JGbHVzaChvdXRwdXQpOwpAQCAtODQwLDcgKzg2OSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZXMgdGhlIGdpdmVuIGNsYXNzbmFtZSB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMgaW4gYSBzZXBhcmF0ZSBWTS4KKyAgICAgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gc291cmNlLWZpbGUgb3IgY2xhc3NuYW1lIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cyBpbiBhIHNlcGFyYXRlIFZNLgogICAgICAqIEBwYXJhbSBjb21tYW5kIFN0cmluZ1tdIG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgZm9yayhTdHJpbmdbXSBjb21tYW5kKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewpAQCAtODk1LDggKzkyNCw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIHNldHVwRW52aXJvbm1lbnQoRXhlY3V0ZSBleGUpIHsKICAgICAgICAgU3RyaW5nW10gZW52aXJvbm1lbnQgPSBlbnYuZ2V0VmFyaWFibGVzKCk7CiAgICAgICAgIGlmIChlbnZpcm9ubWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudmlyb25tZW50Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJTZXR0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlOiAiICsgZW52aXJvbm1lbnRbaV0sCisgICAgICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogZW52aXJvbm1lbnQpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGU6ICIgKyBlbGVtZW50LAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTEyLDcgKzk0MSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHNldHVwV29ya2luZ0RpcihFeGVjdXRlIGV4ZSkgewogICAgICAgICBpZiAoZGlyID09IG51bGwpIHsKICAgICAgICAgICAgIGRpciA9IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWRpci5leGlzdHMoKSB8fCAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIuZ2V0QWJzb2x1dGVQYXRoKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKQEAgLTk2MCwxMCArOTg5LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBydW4oU3RyaW5nIGNsYXNzbmFtZSwgVmVjdG9yPFN0cmluZz4gYXJncykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGNtZGogPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CiAgICAgICAgIGNtZGouc2V0Q2xhc3NuYW1lKGNsYXNzbmFtZSk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gYXJncy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjbWRqLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJncy5lbGVtZW50QXQoaSkpOwotICAgICAgICB9CisgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgLT4gY21kai5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZykpOwogICAgICAgICBydW4oY21kaik7CiAgICAgfQogCkBAIC05ODcsNyArMTAxMyw3IEBACiAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKHRpbWVvdXQubG9uZ1ZhbHVlKCkpOworICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGVXYXRjaGRvZyh0aW1lb3V0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMTgsNCArMTA0NCw2IEBACiAgICAgcHVibGljIENvbW1hbmRsaW5lSmF2YS5TeXNQcm9wZXJ0aWVzIGdldFN5c1Byb3BlcnRpZXMoKSB7CiAgICAgICAgIHJldHVybiBnZXRDb21tYW5kTGluZSgpLmdldFN5c3RlbVByb3BlcnRpZXMoKTsKICAgICB9CisKKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjLmphdmEKaW5kZXggNTQ1ODcyMC4uYWQ0Y2UyYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTYgKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtODgsMTUgKzg3LDE1IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxMF9QTFVTID0gImphdmFjMTArIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUM5ID0gImphdmFjOSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMTkgPSAiamF2YWMxLjkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzE4ID0gImphdmFjMS44IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxNyA9ICJqYXZhYzEuNyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMTYgPSAiamF2YWMxLjYiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzE1ID0gImphdmFjMS41IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxNCA9ICJqYXZhYzEuNCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMTMgPSAiamF2YWMxLjMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzEyID0gImphdmFjMS4yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxMSA9ICJqYXZhYzEuMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDOV9BTElBUyA9ICJqYXZhYzEuOSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMV84ID0gImphdmFjMS44IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxXzcgPSAiamF2YWMxLjciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzFfNiA9ICJqYXZhYzEuNiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMV81ID0gImphdmFjMS41IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxXzQgPSAiamF2YWMxLjQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBQzFfMyA9ICJqYXZhYzEuMyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFDMV8yID0gImphdmFjMS4yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUMxXzEgPSAiamF2YWMxLjEiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RFUk4gPSAibW9kZXJuIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NJQyA9ICJjbGFzc2ljIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUSkFWQUMgPSAiZXh0SmF2YWMiOwpAQCAtMTM5LDcgKzEzOCw3IEBACiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOwogICAgIHByb3RlY3RlZCBib29sZWFuIGxpc3RGaWxlcyA9IGZhbHNlOwogICAgIHByb3RlY3RlZCBGaWxlW10gY29tcGlsZUxpc3QgPSBuZXcgRmlsZVswXTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExvbmc+IHBhY2thZ2VJbmZvcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExvbmc+IHBhY2thZ2VJbmZvcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgogCiAgICAgcHJpdmF0ZSBTdHJpbmcgc291cmNlOwpAQCAtMTYxLDIzICsxNjAsMTYgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBhc3N1bWVkSmF2YVZlcnNpb24oKSB7Ci0gICAgICAgIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQUMxNDsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQUMxNTsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzYpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQUMxNjsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQUMxNzsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gSkFWQUMxODsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjEwIikpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVZBQzEwX1BMVVM7Ci0gICAgICAgIH0gZWxzZSBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpIHsKLSAgICAgICAgICAgIHJldHVybiBKQVZBQzk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQ0xBU1NJQzsKKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzFfOCkpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzFfODsKICAgICAgICAgfQorICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBKQVZBQzEwX1BMVVM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1PREVSTjsgLy8gYXMgd2UgYXJlIGFzc3VtZWQgdG8gYmUgMS44KyBhbmQgY2xhc3NpYyByZWZlcnMgdG8gdGhlIHJlYWxseSBvbGQgb25lcywgIGRlZmF1bHQgdG8gbW9kZXJuCiAgICAgfQogCiAgICAgLyoqCkBAIC04MjMsNyArODE1LDcgQEAKICAgICAgKiBAcGFyYW0gaW5jbHVkZSBpZiB0cnVlLCBpbmNsdWRlcyBBbnQncyBvd24gY2xhc3NwYXRoIGluIHRoZSBjbGFzc3BhdGgKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlYW50cnVudGltZShmaW5hbCBib29sZWFuIGluY2x1ZGUpIHsKLSAgICAgICAgaW5jbHVkZUFudFJ1bnRpbWUgPSBCb29sZWFuLnZhbHVlT2YoaW5jbHVkZSk7CisgICAgICAgIGluY2x1ZGVBbnRSdW50aW1lID0gaW5jbHVkZTsKICAgICB9CiAKICAgICAvKioKQEAgLTgzMSw3ICs4MjMsNyBAQAogICAgICAqIEByZXR1cm4gd2hldGhlciBvciBub3QgdGhlIGFudCBjbGFzc3BhdGggaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVhbnRydW50aW1lKCkgewotICAgICAgICByZXR1cm4gaW5jbHVkZUFudFJ1bnRpbWUgIT0gbnVsbCA/IGluY2x1ZGVBbnRSdW50aW1lLmJvb2xlYW5WYWx1ZSgpIDogdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVBbnRSdW50aW1lID09IG51bGwgfHwgaW5jbHVkZUFudFJ1bnRpbWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NjcsMjkgKzk1OSwyNCBAQAogICAgIHByaXZhdGUgU3RyaW5nIGdldEFsdENvbXBpbGVyTmFtZShmaW5hbCBTdHJpbmcgYW5JbXBsZW1lbnRhdGlvbikgewogICAgICAgICBpZiAoSkFWQUMxMF9QTFVTLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKICAgICAgICAgICAgICAgICB8fCBKQVZBQzkuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTkuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTguZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTcuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTYuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTUuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTQuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQotICAgICAgICAgICAgICAgIHx8IEpBVkFDMTMuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKSkgeworICAgICAgICAgICAgICAgIHx8IEpBVkFDOV9BTElBUy5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pCisgICAgICAgICAgICAgICAgfHwgSkFWQUMxXzguZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQorICAgICAgICAgICAgICAgIHx8IEpBVkFDMV83LmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzFfNi5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pCisgICAgICAgICAgICAgICAgfHwgSkFWQUMxXzUuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQorICAgICAgICAgICAgICAgIHx8IEpBVkFDMV80LmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzFfMy5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pKSB7CiAgICAgICAgICAgICByZXR1cm4gTU9ERVJOOwogICAgICAgICB9Ci0gICAgICAgIGlmIChKQVZBQzEyLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKLSAgICAgICAgICAgICAgICB8fCBKQVZBQzExLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikpIHsKKyAgICAgICAgaWYgKEpBVkFDMV8yLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgICAgICB8fCBKQVZBQzFfMS5lcXVhbHNJZ25vcmVDYXNlKGFuSW1wbGVtZW50YXRpb24pKSB7CiAgICAgICAgICAgICByZXR1cm4gQ0xBU1NJQzsKICAgICAgICAgfQogICAgICAgICBpZiAoTU9ERVJOLmVxdWFsc0lnbm9yZUNhc2UoYW5JbXBsZW1lbnRhdGlvbikpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuZXh0U2VsZWN0ZWQgPSBhc3N1bWVkSmF2YVZlcnNpb24oKTsKICAgICAgICAgICAgIGlmIChKQVZBQzEwX1BMVVMuZXF1YWxzSWdub3JlQ2FzZShhbkltcGxlbWVudGF0aW9uKQogICAgICAgICAgICAgICAgICAgICB8fCBKQVZBQzkuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTguZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTcuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTYuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTUuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTQuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMTMuZXF1YWxzSWdub3JlQ2FzZShuZXh0U2VsZWN0ZWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IEpBVkFDMV84LmVxdWFsc0lnbm9yZUNhc2UobmV4dFNlbGVjdGVkKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXh0U2VsZWN0ZWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwOTEsOCArMTA3OCw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIENvbXBpbGVyQWRhcHRlciBhZGFwdGVyKSB7CiAgICAgICAgIGlmIChuZXN0ZWRBZGFwdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGNvbXBpbGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhZGFwdGVyIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBjb21waWxlciBhZGFwdGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbmVzdGVkQWRhcHRlciA9IGFkYXB0ZXI7CiAgICAgfQpAQCAtMTE0MCw3ICsxMTI3LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCByZXNldEZpbGVMaXN0cygpIHsKICAgICAgICAgY29tcGlsZUxpc3QgPSBuZXcgRmlsZVswXTsKLSAgICAgICAgcGFja2FnZUluZm9zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOworICAgICAgICBwYWNrYWdlSW5mb3MgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTgzLDkgKzExNzAsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKIAotICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGRlc3REaXIgIT0gbnVsbCA/IGRlc3REaXIgOiBzcmNEaXIsIGZpbGVzKTsKKyAgICAgICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyICE9IG51bGwgPyBkZXN0RGlyIDogc3JjRGlyLCBkcy5nZXRJbmNsdWRlZEZpbGVzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTkzLDggKzExNzksOCBAQAogICAgICAgICBmaW5hbCBGaWxlVXRpbHMgZnUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAgICAgICAgIGZvciAoU3RyaW5nIHBhdGhFbGVtZW50IDogbW9kdWxlU291cmNlcGF0aC5saXN0KCkpIHsKICAgICAgICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZyxDb2xsZWN0aW9uPEZpbGU+PiBtb2R1bGVzIDogcmVzb2x2ZU1vZHVsZVNvdXJjZVBhdGhFbGVtZW50KAotICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBwYXRoRWxlbWVudCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb2xsZWN0aW9uPEZpbGU+PiBtb2R1bGVzIDogcmVzb2x2ZU1vZHVsZVNvdXJjZVBhdGhFbGVtZW50KAorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHBhdGhFbGVtZW50KS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSBtb2R1bGVzLmdldEtleSgpOwogICAgICAgICAgICAgICAgIGZvciAoRmlsZSBzcmNEaXIgOiBtb2R1bGVzLmdldFZhbHVlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0Rpci5leGlzdHMoKSkgewpAQCAtMTI2MCwxNCArMTI0NiwxNCBAQAogICAgICAgICAgICAgfHwgQ0xBU1NJQy5lcXVhbHMoY29tcGlsZXJJbXBsKQogICAgICAgICAgICAgfHwgSkFWQUMxMF9QTFVTLmVxdWFscyhjb21waWxlckltcGwpCiAgICAgICAgICAgICB8fCBKQVZBQzkuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTguZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTcuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTYuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTUuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTQuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTMuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTIuZXF1YWxzKGNvbXBpbGVySW1wbCkKLSAgICAgICAgICAgIHx8IEpBVkFDMTEuZXF1YWxzKGNvbXBpbGVySW1wbCk7CisgICAgICAgICAgICB8fCBKQVZBQzFfOC5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxXzcuZXF1YWxzKGNvbXBpbGVySW1wbCkKKyAgICAgICAgICAgIHx8IEpBVkFDMV82LmVxdWFscyhjb21waWxlckltcGwpCisgICAgICAgICAgICB8fCBKQVZBQzFfNS5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxXzQuZXF1YWxzKGNvbXBpbGVySW1wbCkKKyAgICAgICAgICAgIHx8IEpBVkFDMV8zLmVxdWFscyhjb21waWxlckltcGwpCisgICAgICAgICAgICB8fCBKQVZBQzFfMi5lcXVhbHMoY29tcGlsZXJJbXBsKQorICAgICAgICAgICAgfHwgSkFWQUMxXzEuZXF1YWxzKGNvbXBpbGVySW1wbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzA2LDggKzEyOTIsOCBAQAogICAgICAgICAgICAgaWYgKGlzSmRrQ29tcGlsZXIoY29tcGlsZXJJbXBsKSkgewogICAgICAgICAgICAgICAgIGNvbXBpbGVySW1wbCA9IEVYVEpBVkFDOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIlNpbmNlIGNvbXBpbGVyIHNldHRpbmcgaXNuJ3QgY2xhc3NpYyBvciBtb2Rlcm4sICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaWdub3JpbmcgZm9yayBzZXR0aW5nLiIsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGxvZygiU2luY2UgY29tcGlsZXIgc2V0dGluZyBpc24ndCBjbGFzc2ljIG9yIG1vZGVybiwgaWdub3JpbmcgZm9yayBzZXR0aW5nLiIsCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjb21waWxlckltcGw7CkBAIC0xMzYyLDEzICsxMzQ4LDEyIEBACiAgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwgJiYgIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgXCIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0RGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgZXhpc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbmNsdWRlQW50UnVudGltZSA9PSBudWxsICYmIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYnVpbGQuc3lzY2xhc3NwYXRoIikgPT0gbnVsbCkgewotICAgICAgICAgICAgbG9nKGdldExvY2F0aW9uKCkgKyAid2FybmluZzogJ2luY2x1ZGVhbnRydW50aW1lJyB3YXMgbm90IHNldCwgIiArCi0gICAgICAgICAgICAgICAgICAgICJkZWZhdWx0aW5nIHRvIGJ1aWxkLnN5c2NsYXNzcGF0aD1sYXN0OyBzZXQgdG8gZmFsc2UgZm9yIHJlcGVhdGFibGUgYnVpbGRzIiwKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgIGlmIChpbmNsdWRlQW50UnVudGltZSA9PSBudWxsICYmIGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkJVSUxEX1NZU0NMQVNTUEFUSCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKGdldExvY2F0aW9uKCkgKyAid2FybmluZzogJ2luY2x1ZGVhbnRydW50aW1lJyB3YXMgbm90IHNldCwgZGVmYXVsdGluZyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNYWdpY05hbWVzLkJVSUxEX1NZU0NMQVNTUEFUSCArICI9bGFzdDsgc2V0IHRvIGZhbHNlIGZvciByZXBlYXRhYmxlIGJ1aWxkcyIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzODYsOSArMTM3MSw4IEBACiAgICAgICAgICAgICAgICAgKyAoZGVzdERpciAhPSBudWxsID8gIiB0byAiICsgZGVzdERpciA6ICIiKSk7CiAKICAgICAgICAgICAgIGlmIChsaXN0RmlsZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBjb21waWxlTGlzdFtpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgICAgICAgIGxvZyhmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgZm9yIChGaWxlIGVsZW1lbnQgOiBjb21waWxlTGlzdCkgeworICAgICAgICAgICAgICAgICAgbG9nKGVsZW1lbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTQyMyw5ICsxNDA3LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihGQUlMX01TRywgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKEZBSUxfTVNHLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coRkFJTF9NU0csIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQ3LDIwICsxNDMwLDE5IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxvb2tGb3JQYWNrYWdlSW5mb3MoZmluYWwgRmlsZSBzcmNEaXIsIGZpbmFsIEZpbGVbXSBuZXdGaWxlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXdGaWxlc1tpXTsKLSAgICAgICAgICAgIGlmICghZi5nZXROYW1lKCkuZXF1YWxzKCJwYWNrYWdlLWluZm8uamF2YSIpKSB7CisgICAgICAgIGZvciAoRmlsZSBmIDogbmV3RmlsZXMpIHsKKyAgICAgICAgICAgIGlmICghInBhY2thZ2UtaW5mby5qYXZhIi5lcXVhbHMoZi5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgoc3JjRGlyLCBmKS4KLSAgICAgICAgICAgICAgICAgICAgcmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgoc3JjRGlyLCBmKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4ID0gIi9wYWNrYWdlLWluZm8uamF2YSI7CiAgICAgICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoc3VmZml4KSkgewogICAgICAgICAgICAgICAgIGxvZygiYW5vbWFsb3VzIHBhY2thZ2UtaW5mby5qYXZhIHBhdGg6ICIgKyBwYXRoLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwa2cgPSBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gc3VmZml4Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgIHBhY2thZ2VJbmZvcy5wdXQocGtnLCBuZXcgTG9uZyhmLmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICBwYWNrYWdlSW5mb3MucHV0KHBrZywgZi5sYXN0TW9kaWZpZWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NzAsMjcgKzE0NTIsMjQgQEAKICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzMTE0Ij5CdWcgIzQzMTE0PC9hPgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBnZW5lcmF0ZU1pc3NpbmdQYWNrYWdlSW5mb0NsYXNzZXMoZmluYWwgRmlsZSBkZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgTG9uZz4gZW50cnkgOiBwYWNrYWdlSW5mb3MuZW50cnlTZXQoKSkgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IGVudHJ5IDogcGFja2FnZUluZm9zLmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwa2cgPSBlbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgIGZpbmFsIExvbmcgc291cmNlTGFzdE1vZCA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICBmaW5hbCBGaWxlIHBrZ0JpbkRpciA9IG5ldyBGaWxlKGRlc3QsIHBrZy5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7CiAgICAgICAgICAgICBwa2dCaW5EaXIubWtkaXJzKCk7CiAgICAgICAgICAgICBmaW5hbCBGaWxlIHBrZ0luZm9DbGFzcyA9IG5ldyBGaWxlKHBrZ0JpbkRpciwgInBhY2thZ2UtaW5mby5jbGFzcyIpOwotICAgICAgICAgICAgaWYgKHBrZ0luZm9DbGFzcy5pc0ZpbGUoKSAmJiBwa2dJbmZvQ2xhc3MubGFzdE1vZGlmaWVkKCkgPj0gc291cmNlTGFzdE1vZC5sb25nVmFsdWUoKSkgeworICAgICAgICAgICAgaWYgKHBrZ0luZm9DbGFzcy5pc0ZpbGUoKSAmJiBwa2dJbmZvQ2xhc3MubGFzdE1vZGlmaWVkKCkgPj0gc291cmNlTGFzdE1vZCkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9nKCJDcmVhdGluZyBlbXB0eSAiICsgcGtnSW5mb0NsYXNzKTsKLSAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHBrZ0luZm9DbGFzcyk7Ci0gICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ocGtnSW5mb0NsYXNzLnRvUGF0aCgpKSkgewogICAgICAgICAgICAgICAgIG9zLndyaXRlKFBBQ0tBR0VfSU5GT19DTEFTU19IRUFERVIpOwotICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBuYW1lID0gcGtnLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBuYW1lID0gcGtnLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBuYW1lLmxlbmd0aCArIC8qICIvcGFja2FnZS1pbmZvIiAqLyAxMzsKICAgICAgICAgICAgICAgICBvcy53cml0ZSgoYnl0ZSkgbGVuZ3RoIC8gMjU2KTsKICAgICAgICAgICAgICAgICBvcy53cml0ZSgoYnl0ZSkgbGVuZ3RoICUgMjU2KTsKICAgICAgICAgICAgICAgICBvcy53cml0ZShuYW1lKTsKICAgICAgICAgICAgICAgICBvcy53cml0ZShQQUNLQUdFX0lORk9fQ0xBU1NfRk9PVEVSKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1MDIsNyArMTQ4MSw3IEBACiAgICAgICogQHNpbmNlIDEuOS43CiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQYXRoKGZpbmFsIFBhdGggcGF0aCkgewotICAgICAgICByZXR1cm4gcGF0aCAhPSBudWxsICYmIHBhdGguc2l6ZSgpID4gMDsKKyAgICAgICAgcmV0dXJuIHBhdGggIT0gbnVsbCAmJiAhcGF0aC5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTEzLDEwICsxNDkyLDEwIEBACiAgICAgICogQHJldHVybiBhIG1hcHBpbmcgZnJvbSBtb2R1bGUgbmFtZSB0byBtb2R1bGUgc291cmNlIHJvb3RzCiAgICAgICogQHNpbmNlIDEuOS43CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZyxDb2xsZWN0aW9uPEZpbGU+PiByZXNvbHZlTW9kdWxlU291cmNlUGF0aEVsZW1lbnQoCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxGaWxlPj4gcmVzb2x2ZU1vZHVsZVNvdXJjZVBhdGhFbGVtZW50KAogICAgICAgICAgICAgZmluYWwgRmlsZSBwcm9qZWN0RGlyLAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVsZW1lbnQpIHsKLSAgICAgICAgZmluYWwgTWFwPFN0cmluZyxDb2xsZWN0aW9uPEZpbGU+PiByZXN1bHQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIENvbGxlY3Rpb248RmlsZT4+KCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248RmlsZT4+IHJlc3VsdCA9IG5ldyBUcmVlTWFwPD4oKTsKICAgICAgICAgZm9yIChDaGFyU2VxdWVuY2UgcmVzb2x2ZWRFbGVtZW50IDogZXhwYW5kR3JvdXBzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICBmaW5kTW9kdWxlcyhwcm9qZWN0RGlyLCByZXNvbHZlZEVsZW1lbnQudG9TdHJpbmcoKSwgcmVzdWx0KTsKICAgICAgICAgfQpAQCAtMTUzNiw3ICsxNTE1LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IGV4cGFuZEdyb3VwcygKICAgICAgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSBlbGVtZW50KSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nQnVpbGRlcj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmdCdWlsZGVyPigpOworICAgICAgICBMaXN0PFN0cmluZ0J1aWxkZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICByZXN1bHQuYWRkKG5ldyBTdHJpbmdCdWlsZGVyKCkpOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc29sdmVkID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aCgpOyBpKyspIHsKQEAgLTE1NTAsNyArMTUyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IHBhcnRzID0gcmVzb2x2ZUdyb3VwKGVsZW1lbnQuc3ViU2VxdWVuY2UoaSsxLCBlbmQpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hhclNlcXVlbmNlPiBwYXJ0cyA9IHJlc29sdmVHcm91cChlbGVtZW50LnN1YlNlcXVlbmNlKGkgKyAxLCBlbmQpKTsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwYXJ0cy5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE1NTksNyArMTUzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nQnVpbGRlcj4gb2xkUmVzID0gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nQnVpbGRlcj4ob2xkUmVzLnNpemUoKSAqIHBhcnRzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KG9sZFJlcy5zaXplKCkgKiBwYXJ0cy5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2hhclNlcXVlbmNlIHBhcnQgOiBwYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENoYXJTZXF1ZW5jZSBwcmVmaXggOiBvbGRSZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFN0cmluZ0J1aWxkZXIocHJlZml4KS5hcHBlbmQocmVzb2x2ZWQpLmFwcGVuZChwYXJ0KSk7CkBAIC0xNTg2LDcgKzE1NjUsNyBAQAogICAgICAqIEBzaW5jZSAxLjkuNwogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248PyBleHRlbmRzIENoYXJTZXF1ZW5jZT4gcmVzb2x2ZUdyb3VwKGZpbmFsIENoYXJTZXF1ZW5jZSBncm91cCkgewotICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENoYXJTZXF1ZW5jZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDaGFyU2VxdWVuY2U+KCk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q2hhclNlcXVlbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgaW50IHN0YXJ0ID0gMDsKICAgICAgICAgaW50IGRlcHRoID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cC5sZW5ndGgoKTsgaSsrKSB7CkBAIC0xNjQ4LDMyICsxNjI3LDMyIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kTW9kdWxlcygKICAgICAgICAgICAgIGZpbmFsIEZpbGUgcm9vdCwKICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuLAotICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZyxDb2xsZWN0aW9uPEZpbGU+PiBjb2xsZWN0b3IpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248RmlsZT4+IGNvbGxlY3RvcikgewogICAgICAgICBwYXR0ZXJuID0gcGF0dGVybgogICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKQogICAgICAgICAgICAgICAgIC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CiAgICAgICAgIGZpbmFsIGludCBzdGFydEluZGV4ID0gcGF0dGVybi5pbmRleE9mKE1PRFVMRV9NQVJLRVIpOwogICAgICAgICBpZiAoc3RhcnRJbmRleCA9PSAtMSkgewogICAgICAgICAgICAgZmluZE1vZHVsZXMocm9vdCwgcGF0dGVybiwgbnVsbCwgY29sbGVjdG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzdGFydEluZGV4ID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtb2R1bGVzb3VyY2VwYXRoIGVudHJ5IG11c3QgYmUgYSBmb2xkZXIuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgTU9EVUxFX01BUktFUi5sZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdChzdGFydEluZGV4IC0gMSkgIT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIG1vZHVsZSBtYXJrIG11c3QgYmUgcHJlY2VkZWQgYnkgc2VwYXJhdG9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZW5kSW5kZXggPCBwYXR0ZXJuLmxlbmd0aCgpICYmIHBhdHRlcm4uY2hhckF0KGVuZEluZGV4KSAhPSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtb2R1bGUgbWFyayBtdXN0IGJlIGZvbGxvd2VkIGJ5IHNlcGFyYXRvciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhdHRlcm4uaW5kZXhPZihNT0RVTEVfTUFSS0VSLCBlbmRJbmRleCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtb2R1bGVzb3VyY2VwYXRoIGVudHJ5IG11c3QgY29udGFpbiBhdCBtb3N0IG9uZSBtb2R1bGUgbWFyayIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhUb01vZHVsZSA9IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHN0YXJ0SW5kZXgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhJbk1vZHVsZSA9IGVuZEluZGV4ID09IHBhdHRlcm4ubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgPyBudWxsIDogcGF0dGVybi5zdWJzdHJpbmcoZW5kSW5kZXggKyAxKTsgIC8vKzEgdGhlIHNlcGFyYXRvcgotICAgICAgICAgICAgZmluZE1vZHVsZXMocm9vdCwgcGF0aFRvTW9kdWxlLCBwYXRoSW5Nb2R1bGUsIGNvbGxlY3Rvcik7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0SW5kZXggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgbW9kdWxlc291cmNlcGF0aCBlbnRyeSBtdXN0IGJlIGEgZm9sZGVyLiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyBNT0RVTEVfTUFSS0VSLmxlbmd0aCgpOworICAgICAgICBpZiAocGF0dGVybi5jaGFyQXQoc3RhcnRJbmRleCAtIDEpICE9IEZpbGUuc2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIG1vZHVsZSBtYXJrIG11c3QgYmUgcHJlY2VkZWQgYnkgc2VwYXJhdG9yIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuZEluZGV4IDwgcGF0dGVybi5sZW5ndGgoKSAmJiBwYXR0ZXJuLmNoYXJBdChlbmRJbmRleCkgIT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtb2R1bGUgbWFyayBtdXN0IGJlIGZvbGxvd2VkIGJ5IHNlcGFyYXRvciIpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXR0ZXJuLmluZGV4T2YoTU9EVUxFX01BUktFUiwgZW5kSW5kZXgpICE9IC0xKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtb2R1bGVzb3VyY2VwYXRoIGVudHJ5IG11c3QgY29udGFpbiBhdCBtb3N0IG9uZSBtb2R1bGUgbWFyayIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoVG9Nb2R1bGUgPSBwYXR0ZXJuLnN1YnN0cmluZygwLCBzdGFydEluZGV4KTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhJbk1vZHVsZSA9IGVuZEluZGV4ID09IHBhdHRlcm4ubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICA/IG51bGwgOiBwYXR0ZXJuLnN1YnN0cmluZyhlbmRJbmRleCArIDEpOyAgLy8rMSB0aGUgc2VwYXJhdG9yCisgICAgICAgIGZpbmRNb2R1bGVzKHJvb3QsIHBhdGhUb01vZHVsZSwgcGF0aEluTW9kdWxlLCBjb2xsZWN0b3IpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY4OSwyNiArMTY2OCwxNSBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aFRvTW9kdWxlLAogICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aEluTW9kdWxlLAogICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLENvbGxlY3Rpb248RmlsZT4+IGNvbGxlY3RvcikgewotICAgICAgICBmaW5hbCBGaWxlVXRpbHMgZnUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgZiA9IGZ1LnJlc29sdmVGaWxlKHJvb3QsIHBhdGhUb01vZHVsZSk7CisgICAgICAgIGZpbmFsIEZpbGUgZiA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShyb290LCBwYXRoVG9Nb2R1bGUpOwogICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEZpbGVbXSBtb2R1bGVzID0gZi5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXRobmFtZS5pc0RpcmVjdG9yeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgZm9yIChGaWxlIG1vZHVsZSA6IG1vZHVsZXMpIHsKKyAgICAgICAgZm9yIChGaWxlIG1vZHVsZSA6IGYubGlzdEZpbGVzKEZpbGU6OmlzRGlyZWN0b3J5KSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1vZHVsZU5hbWUgPSBtb2R1bGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgZmluYWwgRmlsZSBtb2R1bGVTb3VyY2VSb290ID0gcGF0aEluTW9kdWxlID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICBtb2R1bGUgOgotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShtb2R1bGUsIHBhdGhJbk1vZHVsZSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uPEZpbGU+IG1vZHVsZVJvb3RzID0gY29sbGVjdG9yLmdldChtb2R1bGVOYW1lKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGVSb290cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlUm9vdHMgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0gICAgICAgICAgICAgICAgY29sbGVjdG9yLnB1dChtb2R1bGVOYW1lLCBtb2R1bGVSb290cyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZVNvdXJjZVJvb3QgPSBwYXRoSW5Nb2R1bGUgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IG1vZHVsZSA6IG5ldyBGaWxlKG1vZHVsZSwgcGF0aEluTW9kdWxlKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248RmlsZT4gbW9kdWxlUm9vdHMgPSBjb2xsZWN0b3IuY29tcHV0ZUlmQWJzZW50KG1vZHVsZU5hbWUsIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpOwogICAgICAgICAgICAgbW9kdWxlUm9vdHMuYWRkKG1vZHVsZVNvdXJjZVJvb3QpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWRvYy5qYXZhCmluZGV4IGNlNzljMjcuLmQ3NjgwODggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxOCArMjAsMTcgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CkBAIC0zOSw4ICszOCwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CkBAIC02MCw3ICs2MSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIEdlbmVyYXRlcyBKYXZhZG9jIGRvY3VtZW50YXRpb24gZm9yIGEgY29sbGVjdGlvbgpAQCAtODYsMTAgKzg2LDYgQEAKICAqIEBhbnQudGFzayBjYXRlZ29yeT0iamF2YSIKICAqLwogcHVibGljIGNsYXNzIEphdmFkb2MgZXh0ZW5kcyBUYXNrIHsKLSAgICAvLyBXaGV0aGVyICp0aGlzIFZNKiBpcyAxLjQrIChidXQgYWxzbyBjaGVjayBleGVjdXRhYmxlICE9IG51bGwpLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBKQVZBRE9DXzUgPQotICAgICAgICAhSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV80KTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FEX0ZSQU1FID0gImZ1bmN0aW9uIGxvYWRGcmFtZXMoKSB7IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9BRF9GUkFNRV9MRU4gPSBMT0FEX0ZSQU1FLmxlbmd0aCgpOwpAQCAtMjI3LDcgKzIyMyw3IEBACiAgICAgcHVibGljIGNsYXNzIERvY2xldEluZm8gZXh0ZW5kcyBFeHRlbnNpb25JbmZvIHsKIAogICAgICAgICAvKiogQ29sbGVjdGlvbiBvZiBkb2NsZXQgcGFyYW1ldGVycy4gKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RG9jbGV0UGFyYW0+IHBhcmFtcyA9IG5ldyBWZWN0b3I8RG9jbGV0UGFyYW0+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxEb2NsZXRQYXJhbT4gcGFyYW1zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENyZWF0ZSBhIGRvY2xldCBwYXJhbWV0ZXIgdG8gYmUgY29uZmlndXJlZCBieSBBbnQuCkBAIC0yMzYsOCArMjMyLDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBEb2NsZXRQYXJhbSBjcmVhdGVQYXJhbSgpIHsKICAgICAgICAgICAgIGZpbmFsIERvY2xldFBhcmFtIHBhcmFtID0gbmV3IERvY2xldFBhcmFtKCk7Ci0gICAgICAgICAgICBwYXJhbXMuYWRkRWxlbWVudChwYXJhbSk7Ci0KKyAgICAgICAgICAgIHBhcmFtcy5hZGQocGFyYW0pOwogICAgICAgICAgICAgcmV0dXJuIHBhcmFtOwogICAgICAgICB9CiAKQEAgLTI0Nyw3ICsyNDIsNyBAQAogICAgICAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uIG9mIERvY2xldFBhcmFtIGluc3RhbmNlcy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxEb2NsZXRQYXJhbT4gZ2V0UGFyYW1zKCkgewotICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5lbGVtZW50cygpOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHBhcmFtcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4MCw4ICszNzUsMTEgQEAKICAgICAgKiBjb250YWlucyBzcGVjaWFsIGhhbmRsaW5nIGZvciBGaWxlU2V0cyB0aGF0IGhhcyB0byBvY2N1ciBhdAogICAgICAqIHRhc2sgcnVudGltZS48L3A+CiAgICAgICovCi0gICAgcHVibGljIGNsYXNzIFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gcmNzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+KCk7CisgICAgcHVibGljIGNsYXNzIFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lcgorICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhYmxlPFJlc291cmNlQ29sbGVjdGlvbj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJjcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICAqIEBwYXJhbSByYyB0aGUgY29sbGVjdGlvbiB0byBhZGQuCkBAIC0zOTQsNyArMzkyLDggQEAKICAgICAgICAgICogR2V0IGFuIGl0ZXJhdG9yIG9uIHRoZSBjb2xsZWN0aW9uLgogICAgICAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yLgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IGl0ZXJhdG9yKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gaXRlcmF0b3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gcmNzLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00MjQsMTIgKzQyMywxMiBAQAogICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXJndW1lbnQgdmFsdWUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGFkZEFyZ0lmTm90RW1wdHkoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGtleSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBMZWF2aW5nIG91dCBlbXB0eSBhcmd1bWVudCAnIiArIGtleSArICInIiwKICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGtleSk7CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ0NSwxMCArNDQ0LDEwIEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbldhcm5pbmcgPSBmYWxzZTsKICAgICBwcml2YXRlIFBhdGggc291cmNlUGF0aCA9IG51bGw7CiAgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXIgPSBudWxsOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFNvdXJjZUZpbGU+IHNvdXJjZUZpbGVzID0gbmV3IFZlY3RvcjxTb3VyY2VGaWxlPigpOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFBhY2thZ2VOYW1lPiBwYWNrYWdlTmFtZXMgPSBuZXcgVmVjdG9yPFBhY2thZ2VOYW1lPigpOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFBhY2thZ2VOYW1lPiBleGNsdWRlUGFja2FnZU5hbWVzID0gbmV3IFZlY3RvcjxQYWNrYWdlTmFtZT4oMSk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhY2thZ2VOYW1lPiBtb2R1bGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8UGFja2FnZU5hbWU+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFNvdXJjZUZpbGU+IHNvdXJjZUZpbGVzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhY2thZ2VOYW1lPiBwYWNrYWdlTmFtZXMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFja2FnZU5hbWU+IGV4Y2x1ZGVQYWNrYWdlTmFtZXMgPSBuZXcgVmVjdG9yPD4oMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhY2thZ2VOYW1lPiBtb2R1bGVOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgYm9vbGVhbiBhdXRob3IgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJzaW9uID0gdHJ1ZTsKICAgICBwcml2YXRlIERvY2xldEluZm8gZG9jbGV0ID0gbnVsbDsKQEAgLTQ1OCw5ICs0NTcsOSBAQAogICAgIHByaXZhdGUgUGF0aCBtb2R1bGVTb3VyY2VQYXRoID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyBncm91cCA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUxpc3QgPSBudWxsOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPExpbmtBcmd1bWVudD4gbGlua3MgPSBuZXcgVmVjdG9yPExpbmtBcmd1bWVudD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxHcm91cEFyZ3VtZW50PiBncm91cHMgPSBuZXcgVmVjdG9yPEdyb3VwQXJndW1lbnQ+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8T2JqZWN0PiB0YWdzID0gbmV3IFZlY3RvcjxPYmplY3Q+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpbmtBcmd1bWVudD4gbGlua3MgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8R3JvdXBBcmd1bWVudD4gZ3JvdXBzID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gdGFncyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMgPSB0cnVlOwogICAgIHByaXZhdGUgSHRtbCBkb2N0aXRsZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBIdG1sIGhlYWRlciA9IG51bGw7CkBAIC00ODAsNyArNDc5LDcgQEAKIAogICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyIG5lc3RlZFNvdXJjZUZpbGVzCiAgICAgICAgID0gbmV3IFJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lcigpOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPERpclNldD4gcGFja2FnZVNldHMgPSBuZXcgVmVjdG9yPERpclNldD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RGlyU2V0PiBwYWNrYWdlU2V0cyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogV29yayBhcm91bmQgY29tbWFuZCBsaW5lIGxlbmd0aCBsaW1pdCBieSB1c2luZyBhbiBleHRlcm5hbCBmaWxlCkBAIC01NzEsNyArNTcwLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBtcCBhIFBhdGggaW5zdGFuY2UgY29udGFpbmluZyB0aGUgbW9kdWxlcy4KICAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVQYXRoKGZpbmFsIFBhdGggbXApIHsKICAgICAgICAgaWYgKG1vZHVsZVBhdGggPT0gbnVsbCkgewpAQCAtNTg3LDcgKzU4Niw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgbmV3IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSB0aGUgQW50IGNvcmUuCiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHVibGljIFBhdGggY3JlYXRlTW9kdWxlUGF0aCgpIHsKICAgICAgICAgaWYgKG1vZHVsZVBhdGggPT0gbnVsbCkgewpAQCAtNjAxLDcgKzYwMCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSBwYXRoIGRlZmluaXRpb24uCiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TW9kdWxlUGF0aHJlZihmaW5hbCBSZWZlcmVuY2UgcikgewogICAgICAgICBjcmVhdGVNb2R1bGVQYXRoKCkuc2V0UmVmaWQocik7CkBAIC02MTIsNyArNjExLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBtcCBhIFBhdGggaW5zdGFuY2UgY29udGFpbmluZyB0aGUgc291cmNlcyBmb3IgbW9kdWxlcy4KICAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVTb3VyY2VQYXRoKGZpbmFsIFBhdGggbXApIHsKICAgICAgICAgaWYgKG1vZHVsZVNvdXJjZVBhdGggPT0gbnVsbCkgewpAQCAtNjI4LDcgKzYyNyw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgbmV3IFBhdGggaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZCBieSB0aGUgQW50IGNvcmUuCiAgICAgICoKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xNAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICovCiAgICAgcHVibGljIFBhdGggY3JlYXRlTW9kdWxlU291cmNlUGF0aCgpIHsKICAgICAgICAgaWYgKG1vZHVsZVNvdXJjZVBhdGggPT0gbnVsbCkgewpAQCAtNjQyLDcgKzY0MSw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIGNvbnRhaW5pbmcgdGhlIG1vZHVsZSBzb3VyY2UgcGF0aCBkZWZpbml0aW9uLgogICAgICAqCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVNvdXJjZVBhdGhyZWYoZmluYWwgUmVmZXJlbmNlIHIpIHsKICAgICAgICAgY3JlYXRlTW9kdWxlU291cmNlUGF0aCgpLnNldFJlZmlkKHIpOwpAQCAtNjgwLDcgKzY3OSw3IEBACiAgICAgICogQHBhcmFtIHNmIHRoZSBzb3VyY2UgZmlsZSB0byBiZSBwcm9jZXNzZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkU291cmNlKGZpbmFsIFNvdXJjZUZpbGUgc2YpIHsKLSAgICAgICAgc291cmNlRmlsZXMuYWRkRWxlbWVudChzZik7CisgICAgICAgIHNvdXJjZUZpbGVzLmFkZChzZik7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MDYsMTIgKzcwNSwxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1vZHVsZXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMKICAgICAgKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVuYW1lcyhmaW5hbCBTdHJpbmcgbW9kdWxlcykgewotICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2R1bGVzLCAiLCIpOwotICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG0gPSB0b2submV4dFRva2VuKCk7CisgICAgICAgIGZvciAoU3RyaW5nIG0gOiBtb2R1bGVzLnNwbGl0KCIsIikpIHsKICAgICAgICAgICAgIGZpbmFsIFBhY2thZ2VOYW1lIG1uID0gbmV3IFBhY2thZ2VOYW1lKCk7CiAgICAgICAgICAgICBtbi5zZXROYW1lKG0pOwogICAgICAgICAgICAgYWRkTW9kdWxlKG1uKTsKQEAgLTcyNyw3ICs3MjQsNyBAQAogICAgICAqIEBwYXJhbSBwbiB0aGUgcGFja2FnZSBuYW1lLCBwb3NzaWJseSB3aWxkY2FyZGVkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhY2thZ2UoZmluYWwgUGFja2FnZU5hbWUgcG4pIHsKLSAgICAgICAgcGFja2FnZU5hbWVzLmFkZEVsZW1lbnQocG4pOworICAgICAgICBwYWNrYWdlTmFtZXMuYWRkKHBuKTsKICAgICB9CiAKICAgICAvKioKQEAgLTczNSw3ICs3MzIsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1uIHRoZSBtb2R1bGUgbmFtZQogICAgICAqCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZE1vZHVsZShmaW5hbCBQYWNrYWdlTmFtZSBtbikgewogICAgICAgICBtb2R1bGVOYW1lcy5hZGQobW4pOwpAQCAtNzYzLDcgKzc2MCw3IEBACiAgICAgICogQHBhcmFtIHBuIHRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlICh3aWxkY2FyZHMgYXJlIG5vdCBwZXJtaXR0ZWQpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEV4Y2x1ZGVQYWNrYWdlKGZpbmFsIFBhY2thZ2VOYW1lIHBuKSB7Ci0gICAgICAgIGV4Y2x1ZGVQYWNrYWdlTmFtZXMuYWRkRWxlbWVudChwbik7CisgICAgICAgIGV4Y2x1ZGVQYWNrYWdlTmFtZXMuYWRkKHBuKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg4Nyw3ICs4ODQsNyBAQAogICAgICAqIEBwYXJhbSB0YWdsZXRJbmZvIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdsZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkVGFnbGV0KGZpbmFsIEV4dGVuc2lvbkluZm8gdGFnbGV0SW5mbykgewotICAgICAgICB0YWdzLmFkZEVsZW1lbnQodGFnbGV0SW5mbyk7CisgICAgICAgIHRhZ3MuYWRkKHRhZ2xldEluZm8pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE2NSw3ICsxMTYyLDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmtPZmZsaW5lRXJyb3IgPSAiVGhlIGxpbmtvZmZsaW5lIGF0dHJpYnV0ZSBtdXN0IGluY2x1ZGUiCiAgICAgICAgICAgICArICIgYSBVUkwgYW5kIGEgcGFja2FnZS1saXN0IGZpbGUgbG9jYXRpb24gc2VwYXJhdGVkIGJ5IGEiCiAgICAgICAgICAgICArICIgc3BhY2UiOwotICAgICAgICBpZiAoc3JjLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChzcmMudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGxpbmtPZmZsaW5lRXJyb3IpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNyYywgIiAiLCBmYWxzZSk7CkBAIC0xMzA2LDcgKzEzMDMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBMaW5rQXJndW1lbnQgY3JlYXRlTGluaygpIHsKICAgICAgICAgZmluYWwgTGlua0FyZ3VtZW50IGxhID0gbmV3IExpbmtBcmd1bWVudCgpOwotICAgICAgICBsaW5rcy5hZGRFbGVtZW50KGxhKTsKKyAgICAgICAgbGlua3MuYWRkKGxhKTsKICAgICAgICAgcmV0dXJuIGxhOwogICAgIH0KIApAQCAtMTQxOSw3ICsxNDE2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgVGFnQXJndW1lbnQgY3JlYXRlVGFnKCkgewogICAgICAgICBmaW5hbCBUYWdBcmd1bWVudCB0YSA9IG5ldyBUYWdBcmd1bWVudCgpOwotICAgICAgICB0YWdzLmFkZEVsZW1lbnQgKHRhKTsKKyAgICAgICAgdGFncy5hZGQodGEpOwogICAgICAgICByZXR1cm4gdGE7CiAgICAgfQogCkBAIC0xNDkyLDQ4ICsxNDg5LDQ3IEBACiAgICAgICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcih2ZXJib3NlU2NvcGUsICIsIik7CiAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuZXh0ID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dC5lcXVhbHMoImFsbCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCJhbGwiLmVxdWFscyhuZXh0KSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZ290QWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nICgiUmVwZWF0ZWQgdGFnIHNjb3BlIGVsZW1lbnQ6IGFsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJSZXBlYXRlZCB0YWcgc2NvcGUgZWxlbWVudDogYWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGdvdEFsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQ09QRV9FTEVNRU5UUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuZXF1YWxzIChTQ09QRV9FTEVNRU5UU1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTQ09QRV9FTEVNRU5UU1tpXS5lcXVhbHMobmV4dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSBTQ09QRV9FTEVNRU5UUy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiAoIlVucmVjb2duaXNlZCBzY29wZSBlbGVtZW50OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nICgiUmVwZWF0ZWQgdGFnIHNjb3BlIGVsZW1lbnQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG5leHQsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290Tm90QWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5yZWNvZ25pc2VkIHNjb3BlIGVsZW1lbnQ6ICVzIiwgbmV4dCk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJSZXBlYXRlZCB0YWcgc2NvcGUgZWxlbWVudDogIiArIG5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbaV0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBnb3ROb3RBbGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGdvdE5vdEFsbCAmJiBnb3RBbGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24gKCJNaXh0dXJlIG9mIFwiYWxsXCIgYW5kIG90aGVyIHNjb3BlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVsZW1lbnRzIGluIHRhZyBwYXJhbWV0ZXIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTWl4dHVyZSBvZiBcImFsbFwiIGFuZCBvdGhlciBzY29wZSBlbGVtZW50cyBpbiB0YWcgcGFyYW1ldGVyLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFnb3ROb3RBbGwgJiYgIWdvdEFsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbiAoIk5vIHNjb3BlIGVsZW1lbnRzIHNwZWNpZmllZCBpbiB0YWcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicGFyYW1ldGVyLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vIHNjb3BlIGVsZW1lbnRzIHNwZWNpZmllZCBpbiB0YWcgcGFyYW1ldGVyLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdvdEFsbCkgewogICAgICAgICAgICAgICAgIHRoaXMuc2NvcGUgPSAiYSI7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlciAoZWxlbWVudHMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVpbGRlcihlbGVtZW50cy5sZW5ndGgpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCAoU0NPUEVfRUxFTUVOVFNbaV0uY2hhckF0KDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKFNDT1BFX0VMRU1FTlRTW2ldLmNoYXJBdCgwKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy5zY29wZSA9IGJ1ZmYudG9TdHJpbmcoKTsKQEAgLTE1NTYsMTcgKzE1NTIsMTcgQEAKICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uICgiTm8gbmFtZSBzcGVjaWZpZWQgZm9yIGN1c3RvbSB0YWcuIik7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBuYW1lIHNwZWNpZmllZCBmb3IgY3VzdG9tIHRhZy4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXREZXNjcmlwdGlvbigpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSArICI6IiArIChlbmFibGVkID8gIiIgOiAiWCIpCiAgICAgICAgICAgICAgICAgICAgICsgc2NvcGUgKyAiOiIgKyBnZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghZW5hYmxlZCB8fCAhImEiLmVxdWFscyhzY29wZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZSArICI6IiArIChlbmFibGVkID8gIiIgOiAiWCIpICsgc2NvcGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFlbmFibGVkIHx8ICEiYSIuZXF1YWxzKHNjb3BlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lICsgIjoiICsgKGVuYWJsZWQgPyAiIiA6ICJYIikgKyBzY29wZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTc3LDIyICsxNTczLDE2IEBACiAgICAgICovCiAgICAgcHVibGljIEdyb3VwQXJndW1lbnQgY3JlYXRlR3JvdXAoKSB7CiAgICAgICAgIGZpbmFsIEdyb3VwQXJndW1lbnQgZ2EgPSBuZXcgR3JvdXBBcmd1bWVudCgpOwotICAgICAgICBncm91cHMuYWRkRWxlbWVudChnYSk7CisgICAgICAgIGdyb3Vwcy5hZGQoZ2EpOwogICAgICAgICByZXR1cm4gZ2E7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdyb3VwIG5lc3RlZCBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBHcm91cEFyZ3VtZW50IHsKICAgICAgICAgcHJpdmF0ZSBIdG1sIHRpdGxlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxQYWNrYWdlTmFtZT4gcGFja2FnZXMgPSBuZXcgVmVjdG9yPFBhY2thZ2VOYW1lPigpOwotCi0gICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgR3JvdXBBcmd1bWVudCAqLwotICAgICAgICBwdWJsaWMgR3JvdXBBcmd1bWVudCgpIHsKLSAgICAgICAgICAgIC8vZW1wdHkKLSAgICAgICAgfQorICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFja2FnZU5hbWU+IHBhY2thZ2VzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCB0aGUgdGl0bGUgYXR0cmlidXRlIHVzaW5nIGEgc3RyaW5nLgpAQCAtMTYwMyw2ICsxNTkzLDcgQEAKICAgICAgICAgICAgIGguYWRkVGV4dChzcmMpOwogICAgICAgICAgICAgYWRkVGl0bGUoaCk7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogU2V0IHRoZSB0aXRsZSBhdHRyaWJ1dGUgdXNpbmcgYSBuZXN0ZWQgSHRtbCB2YWx1ZS4KICAgICAgICAgICogQHBhcmFtIHRleHQgYSA8Y29kZT5IdG1sPC9jb2RlPiB2YWx1ZQpAQCAtMTYzMiwxMiArMTYyMywxMyBAQAogICAgICAgICAgICAgICAgIGFkZFBhY2thZ2UocG4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHBhY2thZ2UgbmVzdGVkIGVsZW1lbnQuCiAgICAgICAgICAqIEBwYXJhbSBwbiBhIG5lc3RlZCBlbGVtZW50IHNwZWNpZnlpbmcgdGhlIHBhY2thZ2UuCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBhZGRQYWNrYWdlKGZpbmFsIFBhY2thZ2VOYW1lIHBuKSB7Ci0gICAgICAgICAgICBwYWNrYWdlcy5hZGRFbGVtZW50KHBuKTsKKyAgICAgICAgICAgIHBhY2thZ2VzLmFkZChwbik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTE2NDUsMTUgKzE2MzcsOCBAQAogICAgICAgICAgKiBAcmV0dXJuIHRoZSBwYWNrYWdlcyBhcyBhIHN0cmluZwogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlcygpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBwID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBwYWNrYWdlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBwLmFwcGVuZCgiOiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwLmFwcGVuZChwYWNrYWdlcy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcC50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2VzLnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiOiIpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTcxNyw3ICsxNzAyLDcgQEAKICAgICAgKiBAc2luY2UgMS41CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUGFja2FnZXNldChmaW5hbCBEaXJTZXQgcGFja2FnZVNldCkgewotICAgICAgICBwYWNrYWdlU2V0cy5hZGRFbGVtZW50KHBhY2thZ2VTZXQpOworICAgICAgICBwYWNrYWdlU2V0cy5hZGQocGFja2FnZVNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODI0LDcgKzE4MDksNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBjaGVja1Rhc2tOYW1lKCk7CiAKLSAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gcGFja2FnZXNUb0RvYyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFja2FnZXNUb0RvYyA9IG5ldyBWZWN0b3I8PigpOwogICAgICAgICBmaW5hbCBQYXRoIHNvdXJjZURpcnMgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwogCiAgICAgICAgIGNoZWNrUGFja2FnZUFuZFNvdXJjZVBhdGgoKTsKQEAgLTE4MzYsOCArMTgyMSw3IEBACiAgICAgICAgIHBhcnNlUGFja2FnZXMocGFja2FnZXNUb0RvYywgc291cmNlRGlycyk7CiAgICAgICAgIGNoZWNrUGFja2FnZXMocGFja2FnZXNUb0RvYywgc291cmNlRGlycyk7CiAKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFZlY3RvcjxTb3VyY2VGaWxlPiBzb3VyY2VGaWxlc1RvRG9jID0gKFZlY3RvcjxTb3VyY2VGaWxlPikgc291cmNlRmlsZXMuY2xvbmUoKTsKKyAgICAgICAgZmluYWwgTGlzdDxTb3VyY2VGaWxlPiBzb3VyY2VGaWxlc1RvRG9jID0gbmV3IEFycmF5TGlzdDw+KHNvdXJjZUZpbGVzKTsKICAgICAgICAgYWRkU291cmNlRmlsZXMoc291cmNlRmlsZXNUb0RvYyk7CiAKICAgICAgICAgY2hlY2tQYWNrYWdlc1RvRG9jKHBhY2thZ2VzVG9Eb2MsIHNvdXJjZUZpbGVzVG9Eb2MpOwpAQCAtMTg2Miw4ICsxODQ2LDEyIEBACiAgICAgICAgIGRvRG9jRmlsZXNTdWJEaXJzKHRvRXhlY3V0ZSk7IC8vIGRvY2ZpbGVzc3ViZGlyIGF0dHJpYnV0ZQogICAgICAgICBkb01vZHVsZUFyZ3VtZW50cyh0b0V4ZWN1dGUpOwogCi0gICAgICAgIGRvSmF2YTE0KHRvRXhlY3V0ZSk7Ci0gICAgICAgIGlmIChicmVha2l0ZXJhdG9yICYmIChkb2NsZXQgPT0gbnVsbCB8fCBKQVZBRE9DXzUpKSB7CisgICAgICAgIGRvVGFncyh0b0V4ZWN1dGUpOworICAgICAgICBkb1NvdXJjZSh0b0V4ZWN1dGUpOworICAgICAgICBkb0xpbmtTb3VyY2UodG9FeGVjdXRlKTsKKyAgICAgICAgZG9Ob3F1YWxpZmllcih0b0V4ZWN1dGUpOworCQkKKyAgICAgICAgaWYgKGJyZWFraXRlcmF0b3IpIHsKICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYnJlYWtpdGVyYXRvciIpOwogICAgICAgICB9CiAgICAgICAgIC8vIElmIHVzaW5nIGFuIGV4dGVybmFsIGZpbGUsIHdyaXRlIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBpdApAQCAtMTk2NiwyNSArMTk1NCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFja2FnZXMoZmluYWwgVmVjdG9yPFN0cmluZz4gcGFja2FnZXNUb0RvYywgZmluYWwgUGF0aCBzb3VyY2VEaXJzKSB7Ci0gICAgICAgIGlmIChwYWNrYWdlc1RvRG9jLnNpemUoKSAhPSAwICYmIHNvdXJjZURpcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSAic291cmNlUGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgd2hlbiAiCi0gICAgICAgICAgICAgICAgKyAic3BlY2lmeWluZyBwYWNrYWdlIG5hbWVzLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQYWNrYWdlcyhmaW5hbCBMaXN0PFN0cmluZz4gcGFja2FnZXNUb0RvYywgZmluYWwgUGF0aCBzb3VyY2VEaXJzKSB7CisgICAgICAgIGlmICghcGFja2FnZXNUb0RvYy5pc0VtcHR5KCkgJiYgc291cmNlRGlycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic291cmNlUGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgd2hlbiBzcGVjaWZ5aW5nIHBhY2thZ2UgbmFtZXMuIik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tQYWNrYWdlc1RvRG9jKAotICAgICAgICBmaW5hbCBWZWN0b3I8U3RyaW5nPiBwYWNrYWdlc1RvRG9jLCBmaW5hbCBWZWN0b3I8U291cmNlRmlsZT4gc291cmNlRmlsZXNUb0RvYykgewotICAgICAgICBpZiAocGFja2FnZUxpc3QgPT0gbnVsbCAmJiBwYWNrYWdlc1RvRG9jLnNpemUoKSA9PSAwCi0gICAgICAgICAgICAmJiBzb3VyY2VGaWxlc1RvRG9jLnNpemUoKSA9PSAwICYmIG1vZHVsZU5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFja2FnZXNUb0RvYywgZmluYWwgTGlzdDxTb3VyY2VGaWxlPiBzb3VyY2VGaWxlc1RvRG9jKSB7CisgICAgICAgIGlmIChwYWNrYWdlTGlzdCA9PSBudWxsICYmIHBhY2thZ2VzVG9Eb2MuaXNFbXB0eSgpCisgICAgICAgICAgICAmJiBzb3VyY2VGaWxlc1RvRG9jLmlzRW1wdHkoKSAmJiBtb2R1bGVOYW1lcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc291cmNlIGZpbGVzLCBubyBwYWNrYWdlcyBhbmQgbm8gbW9kdWxlcyBoYXZlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZWVuIHNwZWNpZmllZC4iKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb1NvdXJjZVBhdGgoZmluYWwgQ29tbWFuZGxpbmUgdG9FeGVjdXRlLCBmaW5hbCBQYXRoIHNvdXJjZURpcnMpIHsKLSAgICAgICAgaWYgKHNvdXJjZURpcnMuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXNvdXJjZURpcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZXBhdGgiKTsKICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoc291cmNlRGlycyk7CiAgICAgICAgIH0KQEAgLTIwMDksNyArMTk5Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IChuZXcgUGF0aChnZXRQcm9qZWN0KCkpKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImxhc3QiKTsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKICAgICAgICAgfQpAQCAtMjAzNCwxNCArMjAyMSwxMiBAQAogICAgIHByaXZhdGUgdm9pZCBkb0RvY2xldChmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKICAgICAgICAgaWYgKGRvY2xldCAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoZG9jbGV0LmdldE5hbWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZG9jbGV0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgZG9jbGV0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRvY2xldCIpOwogICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZG9jbGV0LmdldE5hbWUoKSk7CiAgICAgICAgICAgICBpZiAoZG9jbGV0LmdldFBhdGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGF0aCBkb2NsZXRQYXRoCi0gICAgICAgICAgICAgICAgICAgID0gZG9jbGV0LmdldFBhdGgoKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpOworICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggZG9jbGV0UGF0aCA9IGRvY2xldC5nZXRQYXRoKCkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKICAgICAgICAgICAgICAgICBpZiAoZG9jbGV0UGF0aC5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWRvY2xldHBhdGgiKTsKICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChkb2NsZXRQYXRoKTsKQEAgLTIwNjIsNyArMjA0Nyw2IEBACiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRXh0ZXJuYWxBcmdzKGZpbmFsIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgewogICAgICAgICAvLyBJZiB1c2luZyBhbiBleHRlcm5hbCBmaWxlLCB3cml0ZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gaXQKICAgICAgICAgRmlsZSBvcHRpb25zVG1wRmlsZSA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG9wdGlvbnNMaXN0V3JpdGVyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG9wdGlvbnNUbXBGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgKICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksICJqYXZhZG9jT3B0aW9ucyIsICIiLCBudWxsLCB0cnVlLCB0cnVlKTsKQEAgLTIwNzAsMjMgKzIwNTQsMjAgQEAKICAgICAgICAgICAgIHRvRXhlY3V0ZS5jbGVhckFyZ3MoKTsKICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKAogICAgICAgICAgICAgICAgICJAIiArIG9wdGlvbnNUbXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlV3JpdGVyKG9wdGlvbnNUbXBGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RPcHQubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nID0gbGlzdE9wdFtpXTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoIi1KLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aCgiLSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdFdyaXRlci53cml0ZShzdHJpbmcpOworICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBvcHRpb25zTGlzdFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgICAgICBuZXcgRmlsZVdyaXRlcihvcHRpb25zVG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJ1ZSkpKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgb3B0IDogbGlzdE9wdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3B0LnN0YXJ0c1dpdGgoIi1KLSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShvcHQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9wdC5zdGFydHNXaXRoKCItIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyLndyaXRlKG9wdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdFdyaXRlci53cml0ZSgiICIpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc0xpc3RXcml0ZXIud3JpdGUocXVvdGVTdHJpbmcoc3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zTGlzdFdyaXRlci53cml0ZShxdW90ZVN0cmluZyhvcHQpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyLm5ld0xpbmUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wdGlvbnNMaXN0V3JpdGVyLmNsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBpZiAob3B0aW9uc1RtcEZpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG9wdGlvbnNUbXBGaWxlLmRlbGV0ZSgpOwpAQCAtMjA5NCw4ICsyMDc1LDYgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiRXJyb3IgY3JlYXRpbmcgb3Igd3JpdGluZyB0ZW1wb3JhcnkgZmlsZSBmb3IgamF2YWRvYyBvcHRpb25zIiwKICAgICAgICAgICAgICAgICBleCwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3B0aW9uc0xpc3RXcml0ZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTEyLDg1ICsyMDkxLDc4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRvTGlua3MoZmluYWwgQ29tbWFuZGxpbmUgdG9FeGVjdXRlKSB7Ci0gICAgICAgIGlmIChsaW5rcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxMaW5rQXJndW1lbnQ+IGUgPSBsaW5rcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIExpbmtBcmd1bWVudCBsYSA9IGUubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgIGlmIChsYS5nZXRIcmVmKCkgPT0gbnVsbCB8fCBsYS5nZXRIcmVmKCkubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBsb2coIk5vIGhyZWYgd2FzIGdpdmVuIGZvciB0aGUgbGluayAtIHNraXBwaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBmb3IgKGZpbmFsIExpbmtBcmd1bWVudCBsYSA6IGxpbmtzKSB7CisgICAgICAgICAgICBpZiAobGEuZ2V0SHJlZigpID09IG51bGwgfHwgbGEuZ2V0SHJlZigpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGxvZygiTm8gaHJlZiB3YXMgZ2l2ZW4gZm9yIHRoZSBsaW5rIC0gc2tpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsYS5zaG91bGRSZXNvbHZlTGluaygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBocmVmQXNGaWxlID0KKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxhLmdldEhyZWYoKSk7CisgICAgICAgICAgICAgICAgaWYgKGhyZWZBc0ZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSBGSUxFX1VUSUxTLmdldEZpbGVVUkwoaHJlZkFzRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9FeHRlcm5hbEZvcm0oKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBsaW5rIGxvY2F0aW9uIHdhcyBpbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhyZWZBc0ZpbGUsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBocmVmIGEgdmFsaWQgVVJMCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJMIGJhc2UgPSBuZXcgVVJMKCJmaWxlOi8vLiIpOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVkIGZvciB0aGUgc2lkZSBlZmZlY3Qgb2YgdGhyb3dpbmcgYSBNYWxmb3JtZWRVUkxFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgbmV3IFVSTChiYXNlLCBsYS5nZXRIcmVmKCkpOyAvL05PU09OQVIKKyAgICAgICAgICAgICAgICAgICAgbGluayA9IGxhLmdldEhyZWYoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9rIC0ganVzdCBza2lwCisgICAgICAgICAgICAgICAgICAgIGxvZygiTGluayBocmVmIFwiIiArIGxhLmdldEhyZWYoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGEgdmFsaWQgdXJsIC0gc2tpcHBpbmcgbGluayIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBsaW5rID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobGEuc2hvdWxkUmVzb2x2ZUxpbmsoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGhyZWZBc0ZpbGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGxhLmdldEhyZWYoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChocmVmQXNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSBGSUxFX1VUSUxTLmdldEZpbGVVUkwoaHJlZkFzRmlsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvRXh0ZXJuYWxGb3JtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgaW1wb3NzaWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogbGluayBsb2NhdGlvbiB3YXMgaW52YWxpZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaHJlZkFzRmlsZSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpcyB0aGUgaHJlZiBhIHZhbGlkIFVSTAotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJMIGJhc2UgPSBuZXcgVVJMKCJmaWxlOi8vLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlZCBmb3IgdGhlIHNpZGUgZWZmZWN0IG9mIHRocm93aW5nIGEgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVVJMKGJhc2UsIGxhLmdldEhyZWYoKSk7IC8vTk9TT05BUgotICAgICAgICAgICAgICAgICAgICAgICAgbGluayA9IGxhLmdldEhyZWYoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgLSBqdXN0IHNraXAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTGluayBocmVmIFwiIiArIGxhLmdldEhyZWYoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGlzIG5vdCBhIHZhbGlkIHVybCAtIHNraXBwaW5nIGxpbmsiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAobGEuaXNMaW5rT2ZmbGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgcGFja2FnZUxpc3RMb2NhdGlvbiA9IGxhLmdldFBhY2thZ2VsaXN0TG9jKCk7Ci0gICAgICAgICAgICAgICAgICAgIFVSTCBwYWNrYWdlTGlzdFVSTCA9IGxhLmdldFBhY2thZ2VsaXN0VVJMKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdExvY2F0aW9uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHBhY2thZ2VMaXN0VVJMID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHBhY2thZ2UgbGlzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbG9jYXRpb24gZm9yIGxpbmsgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGEuZ2V0SHJlZigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgcHJvdmlkZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIGxpbmsgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9mZmxpbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUxpc3RMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHBhY2thZ2VMaXN0RmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocGFja2FnZUxpc3RMb2NhdGlvbiwgInBhY2thZ2UtbGlzdCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VMaXN0RmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VMaXN0VVJMID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuZ2V0RmlsZVVSTChwYWNrYWdlTGlzdExvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBQYWNrYWdlIGxpc3QgbG9jYXRpb24gd2FzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImludmFsaWQgIiArIHBhY2thZ2VMaXN0TG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogTm8gcGFja2FnZSBsaXN0IHdhcyBmb3VuZCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZUxpc3RMb2NhdGlvbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VMaXN0VVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGlua29mZmxpbmUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxpbmspOwotICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VmFsdWUocGFja2FnZUxpc3RVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWxpbmsiKTsKLSAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobGluayk7CisgICAgICAgICAgICBpZiAobGEuaXNMaW5rT2ZmbGluZSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYWNrYWdlTGlzdExvY2F0aW9uID0gbGEuZ2V0UGFja2FnZWxpc3RMb2MoKTsKKyAgICAgICAgICAgICAgICBVUkwgcGFja2FnZUxpc3RVUkwgPSBsYS5nZXRQYWNrYWdlbGlzdFVSTCgpOworICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdExvY2F0aW9uID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFja2FnZUxpc3RVUkwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHBhY2thZ2UgbGlzdCBsb2NhdGlvbiBmb3IgbGluayAiICsgbGEuZ2V0SHJlZigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG11c3QgYmUgcHJvdmlkZWQgYmVjYXVzZSB0aGUgbGluayBpcyBvZmZsaW5lIik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlTGlzdExvY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYWNrYWdlTGlzdEZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocGFja2FnZUxpc3RMb2NhdGlvbiwgInBhY2thZ2UtbGlzdCIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGFja2FnZUxpc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VMaXN0VVJMID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5nZXRGaWxlVVJMKHBhY2thZ2VMaXN0TG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiBQYWNrYWdlIGxpc3QgbG9jYXRpb24gd2FzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW52YWxpZCAiICsgcGFja2FnZUxpc3RMb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IE5vIHBhY2thZ2UgbGlzdCB3YXMgZm91bmQgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFja2FnZUxpc3RMb2NhdGlvbiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhY2thZ2VMaXN0VVJMICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1saW5rb2ZmbGluZSIpOworICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShwYWNrYWdlTGlzdFVSTC50b0V4dGVybmFsRm9ybSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGluayIpOworICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxpbmspOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjIxMiw3ICsyMTg0LDcgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdyb3VwLCAiLCIsIGZhbHNlKTsKICAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdycCA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHNwYWNlID0gZ3JwLmluZGV4T2YoIiAiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhY2UgPSBncnAuaW5kZXhPZignICcpOwogICAgICAgICAgICAgICAgIGlmIChzcGFjZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBncnAuc3Vic3RyaW5nKDAsIHNwYWNlKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBrZ0xpc3QgPSBncnAuc3Vic3RyaW5nKHNwYWNlICsgMSk7CkBAIC0yMjI2LDk3ICsyMTk4LDg3IEBACiAKICAgICAvLyBhZGQgdGhlIGdyb3VwIGFyZ3VtZW50cwogICAgIHByaXZhdGUgdm9pZCBkb0dyb3VwcyhmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKLSAgICAgICAgaWYgKGdyb3Vwcy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxHcm91cEFyZ3VtZW50PiBlID0gZ3JvdXBzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgR3JvdXBBcmd1bWVudCBnYSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdGl0bGUgPSBnYS5nZXRUaXRsZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlcyA9IGdhLmdldFBhY2thZ2VzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgcGFja2FnZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0aXRsZSBhbmQgcGFja2FnZXMgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBzcGVjaWZpZWQgZm9yIGdyb3VwICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVsZW1lbnRzLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWdyb3VwIik7Ci0gICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKHRpdGxlKSk7Ci0gICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUocGFja2FnZXMpOworICAgICAgICBmb3IgKGZpbmFsIEdyb3VwQXJndW1lbnQgZ2EgOiBncm91cHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0aXRsZSA9IGdhLmdldFRpdGxlKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZXMgPSBnYS5nZXRQYWNrYWdlcygpOworICAgICAgICAgICAgaWYgKHRpdGxlID09IG51bGwgfHwgcGFja2FnZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoZSB0aXRsZSBhbmQgcGFja2FnZXMgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGdyb3VwIGVsZW1lbnRzLiIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ncm91cCIpOworICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZXhwYW5kKHRpdGxlKSk7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwYWNrYWdlcyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBEbyBqYXZhMS40IGFyZ3VtZW50cwotICAgIHByaXZhdGUgdm9pZCBkb0phdmExNChmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKLSAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbjxPYmplY3Q+IGUgPSB0YWdzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgZWxlbWVudCA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFnQXJndW1lbnQpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBUYWdBcmd1bWVudCB0YSA9IChUYWdBcmd1bWVudCkgZWxlbWVudDsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHRhZ0RpciA9IHRhLmdldERpcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIGlmICh0YWdEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGVsZW1lbnQgaXMgbm90IHVzZWQgYXMgYSBmaWxlc2V0LAotICAgICAgICAgICAgICAgICAgICAvLyBidXQgc3BlY2lmaWVzIHRoZSB0YWcgZGlyZWN0bHkuCi0gICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlICgiLXRhZyIpOwotICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZhbHVlICh0YS5nZXRQYXJhbWV0ZXIoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhZyBlbGVtZW50IGlzIHVzZWQgYXMgYQotICAgICAgICAgICAgICAgICAgICAvLyBmaWxlc2V0LiBQYXJzZSBhbGwgdGhlIGZpbGVzIGFuZCBjcmVhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gLXRhZyBhcmd1bWVudHMuCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgdGFnRGVmU2Nhbm5lciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0YS5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiB0YWdEZWZTY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB0YWdEZWZGaWxlID0gbmV3IEZpbGUodGFnRGlyLCBmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZVJlYWRlcih0YWdEZWZGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10YWciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobGluZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWQgIHRhZyBmaWxlIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YWdEZWZGaWxlLmdldEFic29sdXRlUGF0aCgpLCBpb2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25JbmZvIHRhZ2xldEluZm8gPSAoRXh0ZW5zaW9uSW5mbykgZWxlbWVudDsKLSAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXRhZ2xldCIpOwotICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhZ2xldEluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAodGFnbGV0SW5mby5nZXRQYXRoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIHRhZ2xldFBhdGggPSB0YWdsZXRJbmZvLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YWdsZXRQYXRoLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRWYWx1ZSgiLXRhZ2xldHBhdGgiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgodGFnbGV0UGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlQXJnID0gc291cmNlICE9IG51bGwgPyBzb3VyY2UKLSAgICAgICAgICAgIDogZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfSkFWQUNfU09VUkNFKTsKLSAgICAgICAgaWYgKHNvdXJjZUFyZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZSIpOwotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoc291cmNlQXJnKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5rc291cmNlICYmIGRvY2xldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWxpbmtzb3VyY2UiKTsKLSAgICAgICAgfQorICAgIHByaXZhdGUgdm9pZCBkb05vcXVhbGlmaWVyKGZpbmFsIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgewogICAgICAgICBpZiAobm9xdWFsaWZpZXIgIT0gbnVsbCAmJiBkb2NsZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ub3F1YWxpZmllciIpOwogICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobm9xdWFsaWZpZXIpOwogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGRvTGlua1NvdXJjZShmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKKyAgICAgICAgaWYgKGxpbmtzb3VyY2UgJiYgZG9jbGV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbGlua3NvdXJjZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvU291cmNlKGZpbmFsIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlQXJnID0gc291cmNlICE9IG51bGwgPyBzb3VyY2UgOiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19TT1VSQ0UpOworICAgICAgICBpZiAoc291cmNlQXJnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlIik7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShzb3VyY2VBcmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGFncyhmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHRhZ3MpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVGFnQXJndW1lbnQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUYWdBcmd1bWVudCB0YSA9IChUYWdBcmd1bWVudCkgZWxlbWVudDsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIHRhZ0RpciA9IHRhLmdldERpcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIGlmICh0YWdEaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGVsZW1lbnQgaXMgbm90IHVzZWQgYXMgYSBmaWxlc2V0LAorICAgICAgICAgICAgICAgICAgICAvLyBidXQgc3BlY2lmaWVzIHRoZSB0YWcgZGlyZWN0bHkuCisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdGFnIik7CisgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHRhLmdldFBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdGFnIGVsZW1lbnQgaXMgdXNlZCBhcyBhCisgICAgICAgICAgICAgICAgICAgIC8vIGZpbGVzZXQuIFBhcnNlIGFsbCB0aGUgZmlsZXMgYW5kIGNyZWF0ZQorICAgICAgICAgICAgICAgICAgICAvLyAtdGFnIGFyZ3VtZW50cy4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciB0YWdEZWZTY2FubmVyID0gdGEuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogdGFnRGVmU2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgdGFnRGVmRmlsZSA9IG5ldyBGaWxlKHRhZ0RpciwgZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHRhZ0RlZkZpbGUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLmxpbmVzKCkuZm9yRWFjaChsaW5lIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi10YWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWQgdGFnIGZpbGUgZnJvbSAiICsgdGFnRGVmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbkluZm8gdGFnbGV0SW5mbyA9IChFeHRlbnNpb25JbmZvKSBlbGVtZW50OworICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdGFnbGV0Iik7CisgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUodGFnbGV0SW5mby5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmICh0YWdsZXRJbmZvLmdldFBhdGgoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggdGFnbGV0UGF0aCA9IHRhZ2xldEluZm8uZ2V0UGF0aCgpLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFnbGV0UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItdGFnbGV0cGF0aCIpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aCh0YWdsZXRQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBkb0RvY0ZpbGVzU3ViRGlycyhmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKICAgICAgICAgaWYgKGRvY0ZpbGVzU3ViRGlycykgewogICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kb2NmaWxlc3N1YmRpcnMiKTsKLSAgICAgICAgICAgIGlmIChleGNsdWRlRG9jRmlsZXNTdWJEaXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGV4Y2x1ZGVEb2NGaWxlc1N1YkRpci50cmltKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoZXhjbHVkZURvY0ZpbGVzU3ViRGlyICE9IG51bGwgJiYgIWV4Y2x1ZGVEb2NGaWxlc1N1YkRpci50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leGNsdWRlZG9jZmlsZXNzdWJkaXIiKTsKICAgICAgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShleGNsdWRlRG9jRmlsZXNTdWJEaXIpOwogICAgICAgICAgICAgfQpAQCAtMjMyNSwxMCArMjI4NywxMCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGRvU291cmNlQW5kUGFja2FnZU5hbWVzKAogICAgICAgICBmaW5hbCBDb21tYW5kbGluZSB0b0V4ZWN1dGUsCi0gICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHBhY2thZ2VzVG9Eb2MsCi0gICAgICAgIGZpbmFsIFZlY3RvcjxTb3VyY2VGaWxlPiBzb3VyY2VGaWxlc1RvRG9jLAorICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFja2FnZXNUb0RvYywKKyAgICAgICAgZmluYWwgTGlzdDxTb3VyY2VGaWxlPiBzb3VyY2VGaWxlc1RvRG9jLAogICAgICAgICBmaW5hbCBib29sZWFuIHVzZUV4dGVybmFsRmlsZSwKLSAgICAgICAgZmluYWwgRmlsZSAgICB0bXBMaXN0LAorICAgICAgICBmaW5hbCBGaWxlIHRtcExpc3QsCiAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkV3JpdGVyIHNyY0xpc3RXcml0ZXIpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBhY2thZ2VOYW1lIDogcGFja2FnZXNUb0RvYykgewpAQCAtMjM2OSwxNSArMjMzMSwxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKICAgICAgICAgaWYgKCFjb250YWluc1doaXRlc3BhY2Uoc3RyKQotICAgICAgICAgICAgJiYgc3RyLmluZGV4T2YoJ1wnJykgPT0gLTEKLSAgICAgICAgICAgICYmIHN0ci5pbmRleE9mKCciJykgPT0gLTEpIHsKKyAgICAgICAgICAgICYmICFzdHIuY29udGFpbnMoIiciKSAmJiAhc3RyLmNvbnRhaW5zKCJcIiIpKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdHIuaW5kZXhPZignXCcnKSA9PSAtMSkgeworICAgICAgICBpZiAoIXN0ci5jb250YWlucygiJyIpKSB7CiAgICAgICAgICAgICByZXR1cm4gcXVvdGVTdHJpbmcoc3RyLCAnXCcnKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBxdW90ZVN0cmluZyhzdHIsICciJyk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHF1b3RlU3RyaW5nKHN0ciwgJyInKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNXaGl0ZXNwYWNlKGZpbmFsIFN0cmluZyBzKSB7CkBAIC0yMzkwLDcgKzIzNTAsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIHF1b3RlU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIsIGZpbmFsIGNoYXIgZGVsaW0pIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyLmxlbmd0aCgpICogMik7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoc3RyLmxlbmd0aCgpICogMik7CiAgICAgICAgIGJ1Zi5hcHBlbmQoZGVsaW0pOwogICAgICAgICBib29sZWFuIGxhc3RDaGFyV2FzQ1IgPSBmYWxzZTsKICAgICAgICAgZm9yIChmaW5hbCBjaGFyIGMgOiBzdHIudG9DaGFyQXJyYXkoKSkgewpAQCAtMjQzNiwxMyArMjM5NiwxMSBAQAogICAgICAqCiAgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRTb3VyY2VGaWxlcyhmaW5hbCBWZWN0b3I8U291cmNlRmlsZT4gc2YpIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3I8UmVzb3VyY2VDb2xsZWN0aW9uPiBlID0gbmVzdGVkU291cmNlRmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24gcmMgPSBlLm5leHQoKTsKKyAgICBwcml2YXRlIHZvaWQgYWRkU291cmNlRmlsZXMoZmluYWwgTGlzdDxTb3VyY2VGaWxlPiBzZikgeworICAgICAgICBmb3IgKFJlc291cmNlQ29sbGVjdGlvbiByYyA6IG5lc3RlZFNvdXJjZUZpbGVzKSB7CiAgICAgICAgICAgICBpZiAoIXJjLmlzRmlsZXN5c3RlbU9ubHkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBmaWxlIHN5c3RlbSBiYXNlZCByZXNvdXJjZXMgYXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgc3VwcG9ydGVkIGJ5IGphdmFkb2MiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJvbmx5IGZpbGUgc3lzdGVtIGJhc2VkIHJlc291cmNlcyBhcmUgc3VwcG9ydGVkIGJ5IGphdmFkb2MiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyYyBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHJjOwpAQCAtMjQ1Niw3ICsyNDE0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHIgOiByYykgewotICAgICAgICAgICAgICAgIHNmLmFkZEVsZW1lbnQobmV3IFNvdXJjZUZpbGUoci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpLmdldEZpbGUoKSkpOworICAgICAgICAgICAgICAgIHNmLmFkZChuZXcgU291cmNlRmlsZShyLmFzKEZpbGVQcm92aWRlci5jbGFzcykuZ2V0RmlsZSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDY5LDEwICsyNDI3LDkgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSAxLjUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcGFyc2VQYWNrYWdlcyhmaW5hbCBWZWN0b3I8U3RyaW5nPiBwbiwgZmluYWwgUGF0aCBzcCkgewotICAgICAgICBmaW5hbCBIYXNoU2V0PFN0cmluZz4gYWRkZWRQYWNrYWdlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFZlY3RvcjxEaXJTZXQ+IGRpclNldHMgPSAoVmVjdG9yPERpclNldD4pIHBhY2thZ2VTZXRzLmNsb25lKCk7CisgICAgcHJpdmF0ZSB2b2lkIHBhcnNlUGFja2FnZXMoZmluYWwgTGlzdDxTdHJpbmc+IHBuLCBmaW5hbCBQYXRoIHNwKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFkZGVkUGFja2FnZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8RGlyU2V0PiBkaXJTZXRzID0gbmV3IEFycmF5TGlzdDw+KHBhY2thZ2VTZXRzKTsKIAogICAgICAgICAvLyBmb3IgZWFjaCBzb3VyY2VQYXRoIGVudHJ5LCBhZGQgYSBkaXJlY3RvcnlzZXQgd2l0aCBpbmNsdWRlcwogICAgICAgICAvLyB0YWtlbiBmcm9tIHBhY2thZ2VuYW1lcyBhdHRyaWJ1dGUgYW5kIG5lc3RlZCBwYWNrYWdlCkBAIC0yNDgxLDUxICsyNDM4LDM1IEBACiAgICAgICAgIGlmIChzb3VyY2VQYXRoICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIFBhdHRlcm5TZXQgcHMgPSBuZXcgUGF0dGVyblNldCgpOwogICAgICAgICAgICAgcHMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248UGFja2FnZU5hbWU+IGUgPSBwYWNrYWdlTmFtZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYWNrYWdlTmFtZSBwID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gcC5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwa2cuZW5kc1dpdGgoIioiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcGtnICs9ICIqIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcy5jcmVhdGVJbmNsdWRlKCkuc2V0TmFtZShwa2cpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGFja2FnZU5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHBzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKCIqKiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZXMuc3RyZWFtKCkubWFwKFBhY2thZ2VOYW1lOjpnZXROYW1lKQorICAgICAgICAgICAgICAgICAgICAubWFwKHMgLT4gcy5yZXBsYWNlKCcuJywgJy8nKS5yZXBsYWNlRmlyc3QoIlxcKiQiLCAiKioiKSkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gocGtnIC0+IHBzLmNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHBrZykpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxQYWNrYWdlTmFtZT4gZSA9IGV4Y2x1ZGVQYWNrYWdlTmFtZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUGFja2FnZU5hbWUgcCA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGtnID0gcC5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJyk7Ci0gICAgICAgICAgICAgICAgaWYgKHBrZy5lbmRzV2l0aCgiKiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBrZyArPSAiKiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBzLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKHBrZyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBleGNsdWRlUGFja2FnZU5hbWVzLnN0cmVhbSgpLm1hcChQYWNrYWdlTmFtZTo6Z2V0TmFtZSkKKyAgICAgICAgICAgICAgICAubWFwKHMgLT4gcy5yZXBsYWNlKCcuJywgJy8nKS5yZXBsYWNlRmlyc3QoIlxcKiQiLCAiKioiKSkKKyAgICAgICAgICAgICAgICAuZm9yRWFjaChwa2cgLT4gcHMuY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUocGtnKSk7CiAKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gcGF0aEVsZW1lbnRzID0gc291cmNlUGF0aC5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGhFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZGlyID0gbmV3IEZpbGUocGF0aEVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhdGhFbGVtZW50IDogc291cmNlUGF0aC5saXN0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKHBhdGhFbGVtZW50KTsKICAgICAgICAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlyU2V0IGRzID0gbmV3IERpclNldCgpOwogICAgICAgICAgICAgICAgICAgICBkcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CiAgICAgICAgICAgICAgICAgICAgIGRzLnNldERlZmF1bHRleGNsdWRlcyh1c2VEZWZhdWx0RXhjbHVkZXMpOwogICAgICAgICAgICAgICAgICAgICBkcy5zZXREaXIoZGlyKTsKICAgICAgICAgICAgICAgICAgICAgZHMuY3JlYXRlUGF0dGVyblNldCgpLmFkZENvbmZpZ3VyZWRQYXR0ZXJuc2V0KHBzKTsKLSAgICAgICAgICAgICAgICAgICAgZGlyU2V0cy5hZGRFbGVtZW50KGRzKTsKKyAgICAgICAgICAgICAgICAgICAgZGlyU2V0cy5hZGQoZHMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIHBhdGhFbGVtZW50c1tpXQorICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBwYXRoRWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNpbmNlIGl0IGlzIG5vIGRpcmVjdG9yeS4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxEaXJTZXQ+IGUgPSBkaXJTZXRzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBEaXJTZXQgZHMgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIGZvciAoRGlyU2V0IGRzIDogZGlyU2V0cykgewogICAgICAgICAgICAgZmluYWwgRmlsZSBiYXNlRGlyID0gZHMuZ2V0RGlyKGdldFByb2plY3QoKSk7CiAgICAgICAgICAgICBsb2coInNjYW5uaW5nICIgKyBiYXNlRGlyICsgIiBmb3IgcGFja2FnZXMuIiwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBkc2MgPSBkcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CkBAIC0yNTMzLDIwICsyNDc0LDE0IEBACiAgICAgICAgICAgICBmb3IgKFN0cmluZyBkaXIgOiBkc2MuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKSB7CiAgICAgICAgICAgICAgICAgLy8gYXJlIHRoZXJlIGFueSBqYXZhIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5PwogICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgcGQgPSBuZXcgRmlsZShiYXNlRGlyLCBkaXIpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gcGQubGlzdChuZXcgRmlsZW5hbWVGaWx0ZXIgKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KGZpbmFsIEZpbGUgZGlyMSwgZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lbmRzV2l0aCgiLmphdmEiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoaW5jbHVkZU5vU291cmNlUGFja2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hbWUuZXF1YWxzKCJwYWNrYWdlLmh0bWwiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gcGQubGlzdCgoZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICBuYW1lKSAtPiBuYW1lLmVuZHNXaXRoKCIuamF2YSIpIHx8IChpbmNsdWRlTm9Tb3VyY2VQYWNrYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5lcXVhbHMoInBhY2thZ2UuaHRtbCIpKSk7CiAKICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGRpcikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpci5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhiYXNlRGlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRhaW5zIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlLCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgeW91IG11c3Qgc3BlY2lmeSB0aGVtIGFzIHNvdXJjZSBmaWxlcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHBhY2thZ2VzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNvbnRhaW5zIHNvdXJjZSBmaWxlcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlLCB5b3UgbXVzdCBzcGVjaWZ5IHRoZW0gYXMgc291cmNlIGZpbGVzIG5vdCBwYWNrYWdlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNQYWNrYWdlcyA9IHRydWU7CkBAIC0yNTU0LDcgKzI0ODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZGVkUGFja2FnZXMuY29udGFpbnMocGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRQYWNrYWdlcy5hZGQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuLmFkZEVsZW1lbnQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuLmFkZChwYWNrYWdlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNTc5LDE4ICsyNTE0LDE3IEBACiAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGZpeERhdGE7CiAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluID0gSmF2YWRvYy5jbGFzcwogICAgICAgICAgICAgLmdldFJlc291cmNlQXNTdHJlYW0oImphdmFkb2MtZnJhbWUtaW5qZWN0aW9ucy1maXgudHh0Iik7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJNaXNzaW5nIHJlc291cmNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJ2phdmFkb2MtZnJhbWUtaW5qZWN0aW9ucy1maXgudHh0JyBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNsYXNzcGF0aC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk1pc3NpbmcgcmVzb3VyY2UgJ2phdmFkb2MtZnJhbWUtaW5qZWN0aW9ucy1maXgudHh0JyBpbiBjbGFzc3BhdGguIik7CiAgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIGZpeERhdGE7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaXhEYXRhID0KICAgICAgICAgICAgICAgICBmaXhMaW5lRmVlZHMoRmlsZVV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkRnVsbHkobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCAiVVMtQVNDSUkiKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkRnVsbHkobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkpCiAgICAgICAgICAgICAgICAgLnRyaW0oKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CkBAIC0yNjE5LDE0ICsyNTUzLDEwIEBACiAgICAgICAgICAgICA6IEZJTEVfVVRJTFMuZ2V0RGVmYXVsdEVuY29kaW5nKCk7CiAgICAgICAgIC8vIHdlIGxvYWQgdGhlIHdob2xlIGZpbGUgYXMgb25lIFN0cmluZyAodG9jL2luZGV4IGZpbGVzIGFyZQogICAgICAgICAvLyBnZW5lcmFsbHkgc21hbGwsIGJlY2F1c2UgdGhleSBvbmx5IGNvbnRhaW4gZnJhbWVzZXQgZGVjbGFyYXRpb24pOgotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBmaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwogICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlsZUNvbnRlbnRzID0KLSAgICAgICAgICAgICAgICBmaXhMaW5lRmVlZHMoRmlsZVV0aWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zYWZlUmVhZEZ1bGx5KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaW4sIGVuYykpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaW4pOworICAgICAgICB0cnkgKElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSksIGVuYykpIHsKKyAgICAgICAgICAgIGZpbGVDb250ZW50cyA9IGZpeExpbmVGZWVkcyhGaWxlVXRpbHMuc2FmZVJlYWRGdWxseShyZWFkZXIpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIGlmIGZpbGUgbWF5IGJlIHZ1bG5lcmFibGUgYmVjYXVzZSBpdCB3YXMgbm90CkBAIC0yNjM1LDE0ICsyNTY1LDExIEBACiAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIHBhdGNoIHRoZSBmaWxlIQogICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGNoZWRGaWxlQ29udGVudHMgPSBwYXRjaENvbnRlbnQoZmlsZUNvbnRlbnRzLCBmaXhEYXRhKTsKICAgICAgICAgICAgIGlmICghcGF0Y2hlZEZpbGVDb250ZW50cy5lcXVhbHMoZmlsZUNvbnRlbnRzKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgZW5jKTsKKyAgICAgICAgICAgICAgICB0cnkgKGZpbmFsIE91dHB1dFN0cmVhbVdyaXRlciB3ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZmlsZS50b1BhdGgoKSksIGVuYykpIHsKICAgICAgICAgICAgICAgICAgICAgdy53cml0ZShwYXRjaGVkRmlsZUNvbnRlbnRzKTsKICAgICAgICAgICAgICAgICAgICAgdy5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZm9zKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2NTEsNyArMjU3OCw3IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBmaXhMaW5lRmVlZHMoZmluYWwgU3RyaW5nIG9yaWcpIHsKICAgICAgICAgcmV0dXJuIG9yaWcucmVwbGFjZSgiXHJcbiIsICJcbiIpCi0gICAgICAgICAgICAucmVwbGFjZSgiXG4iLCBTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICAucmVwbGFjZSgiXG4iLCBTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBwYXRjaENvbnRlbnQoZmluYWwgU3RyaW5nIGZpbGVDb250ZW50cywgZmluYWwgU3RyaW5nIGZpeERhdGEpIHsKQEAgLTI2NjYsMTYgKzI1OTMsMTAgQEAKIAogICAgIHByaXZhdGUgdm9pZCBkb01vZHVsZUFyZ3VtZW50cyhDb21tYW5kbGluZSB0b0V4ZWN1dGUpIHsKICAgICAgICAgaWYgKCFtb2R1bGVOYW1lcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBudWxsOwotICAgICAgICAgICAgZm9yIChQYWNrYWdlTmFtZSBtbiA6IG1vZHVsZU5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpLmFwcGVuZChtbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRvRXhlY3V0ZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItLW1vZHVsZSIpOwotICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0b0V4ZWN1dGUuY3JlYXRlQXJndW1lbnQoKQorICAgICAgICAgICAgICAgIC5zZXRWYWx1ZShtb2R1bGVOYW1lcy5zdHJlYW0oKS5tYXAoUGFja2FnZU5hbWU6OmdldE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1vZHVsZVBhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgdG9FeGVjdXRlLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tbW9kdWxlLXBhdGgiKTsKQEAgLTI3MjQsNyArMjY0NSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGxvZ0ZsdXNoKCkgewogICAgICAgICAgICAgaWYgKHF1ZXVlZExpbmUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHN1cGVyLnByb2Nlc3NMaW5lKHF1ZXVlZExpbmUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzLmphdmEKaW5kZXggN2MxZDYyZC4uZjQyOGE0ZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTAgKzIxLDEwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCkBAIC03OCwxOCArNzgsMTIgQEAKICAgICAgICAgRmlsZSB0bXBGaWxlID0gbnVsbDsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIG15b3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKTsKLQogICAgICAgICAgICAgLy8gV2luZG93cyBoYXMgYSAzMmsgbGltaXQgb24gdG90YWwgYXJnIHNpemUsIHNvCiAgICAgICAgICAgICAvLyBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB0byBzdG9yZSBhbGwgdGhlIGFyZ3VtZW50cwotCi0gICAgICAgICAgICBpZiAobXlvcy50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkuY29udGFpbnMoIndpbmRvd3MiKQotICAgICAgICAgICAgICAgICYmIGFyZ3MubGVuZ3RoID4gTUFYX0ZJTEVTX09OX0NPTU1BTkRfTElORSkgewotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgdG1wRmlsZSA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5jcmVhdGVUZW1wRmlsZShwcm9qZWN0LCAiamlrZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcih0bXBGaWxlKSk7CisgICAgICAgICAgICBpZiAoT3MuaXNGYW1pbHkoT3MuRkFNSUxZX1dJTkRPV1MpICYmIGFyZ3MubGVuZ3RoID4gTUFYX0ZJTEVTX09OX0NPTU1BTkRfTElORSkgeworICAgICAgICAgICAgICAgIHRtcEZpbGUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuY3JlYXRlVGVtcEZpbGUocHJvamVjdCwgImppa2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIodG1wRmlsZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKQEAgLTk4LDEwICs5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheSA9IG5ldyBTdHJpbmdbXSB7Y29tbWFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkAiICsgdG1wRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX07CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwgZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBjb21tYW5kQXJyYXkgPSBuZXcgU3RyaW5nW2FyZ3MubGVuZ3RoICsgMV07CkBAIC0xMjMsMTAgKzExNCw4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIEppa2VzIGNvbXBpbGVyIiwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAodG1wRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCF0bXBGaWxlLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRtcEZpbGUgIT0gbnVsbCAmJiAhdG1wRmlsZS5kZWxldGUoKSkgeworICAgICAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlT25FeGl0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlc091dHB1dFBhcnNlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmlrZXNPdXRwdXRQYXJzZXIuamF2YQppbmRleCA1ZmZiOTU0Li44YzgzOTk0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KaWtlc091dHB1dFBhcnNlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ppa2VzT3V0cHV0UGFyc2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMzMsNyArMTMzLDcgQEAKIAogICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgbG93ZXIgPSBsaW5lLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBpZiAobGluZS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaWYgKGxpbmUudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGxvd2VyLmNvbnRhaW5zKCJlcnJvciIpKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9LZXlTdWJzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvS2V5U3Vic3QuamF2YQppbmRleCBlZTQ3NmU3Li45MDk1YzVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9LZXlTdWJzdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0tleVN1YnN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00OCw3ICs0OCw3IEBACiAgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBGaWxlIGRlc3QgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIHNlcCA9ICIqIjsKLSAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gcmVwbGFjZW1lbnRzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gcmVwbGFjZW1lbnRzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBEbyB0aGUgZXhlY3V0aW9uLgpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgU3RyaW5nIG5ld2xpbmUgPSBudWxsOwogICAgICAgICAgICAgbGluZSA9IGJyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChsaW5lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICBidy5uZXdMaW5lKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbmV3bGluZSA9IEtleVN1YnN0LnJlcGxhY2UobGluZSwgcmVwbGFjZW1lbnRzKTsKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAqIEBwYXJhbSBrZXlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEtleXMoU3RyaW5nIGtleXMpIHsKLSAgICAgICAgaWYgKGtleXMgIT0gbnVsbCAmJiBrZXlzLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoa2V5cyAhPSBudWxsICYmICFrZXlzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9CiAgICAgICAgICAgICBuZXcgU3RyaW5nVG9rZW5pemVyKGtleXMsIHRoaXMuc2VwLCBmYWxzZSk7CiAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBoYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gaGFzaCA9IG5ldyBIYXNodGFibGU8PigpOwogICAgICAgICAgICAgaGFzaC5wdXQoIlZFUlNJT04iLCAiMS4wLjMiKTsKICAgICAgICAgICAgIGhhc2gucHV0KCJiIiwgImZmZmYiKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihLZXlTdWJzdC5yZXBsYWNlKCIkZiAke1ZFUlNJT059IGYgJHtifSBqaiAkIiwKQEAgLTE3Nyw3ICsxNzcsNyBAQAogICAgICAgICB3aGlsZSAoKGluZGV4ID0gb3JpZ1N0cmluZy5pbmRleE9mKCIkeyIsIGkpKSA+IC0xKSB7CiAgICAgICAgICAgICBrZXkgPSBvcmlnU3RyaW5nLnN1YnN0cmluZyhpbmRleCArIDIsIG9yaWdTdHJpbmcuaW5kZXhPZigifSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArIDMpKTsKLSAgICAgICAgICAgIGZpbmFsU3RyaW5nLmFwcGVuZChvcmlnU3RyaW5nLnN1YnN0cmluZyhpLCBpbmRleCkpOworICAgICAgICAgICAgZmluYWxTdHJpbmcuYXBwZW5kKG9yaWdTdHJpbmcsIGksIGluZGV4KTsKICAgICAgICAgICAgIGlmIChrZXlzLmNvbnRhaW5zS2V5KGtleSkpIHsKICAgICAgICAgICAgICAgICBmaW5hbFN0cmluZy5hcHBlbmQoa2V5cy5nZXQoa2V5KSk7CiAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTGVuZ3RoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9MZW5ndGguamF2YQppbmRleCA2OGZiMjBhLi40NWU4ZmU3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9MZW5ndGguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9MZW5ndGguamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAqIEBwYXJhbSBlbGwgdGhlIGxvbmcgbGVuZ3RoIHRvIGNvbXBhcmUgd2l0aC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0TGVuZ3RoKGxvbmcgZWxsKSB7Ci0gICAgICAgIGxlbmd0aCA9IG5ldyBMb25nKGVsbCk7CisgICAgICAgIGxlbmd0aCA9IGVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgICAqIEBwYXJhbSB0cmltIDxjb2RlPmJvb2xlYW48L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUcmltKGJvb2xlYW4gdHJpbSkgewotICAgICAgICB0aGlzLnRyaW0gPSB0cmltID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKKyAgICAgICAgdGhpcy50cmltID0gdHJpbTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MCwyNSArMTYwLDMxIEBACiAgICAgICogQHJldHVybiBib29sZWFuIHRyaW0gc2V0dGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmltKCkgewotICAgICAgICByZXR1cm4gdHJpbSAhPSBudWxsICYmIHRyaW0uYm9vbGVhblZhbHVlKCk7CisgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUUuZXF1YWxzKHRyaW0pOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEV4ZWN1dGUgdGhlIGxlbmd0aCB0YXNrLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKChwcm9wZXJ0eSAhPSBudWxsKQotICAgICAgICAgICAgPyAoT3V0cHV0U3RyZWFtKSBuZXcgUHJvcGVydHlPdXRwdXRTdHJlYW0oZ2V0UHJvamVjdCgpLCBwcm9wZXJ0eSkKLSAgICAgICAgICAgIDogKE91dHB1dFN0cmVhbSkgbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19JTkZPKSk7CisgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPQorICAgICAgICAgICAgcHJvcGVydHkgPT0gbnVsbCA/IG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfSU5GTykKKyAgICAgICAgICAgICAgICA6IG5ldyBQcm9wZXJ0eU91dHB1dFN0cmVhbShnZXRQcm9qZWN0KCksIHByb3BlcnR5KTsKKyAgICAgICAgUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0KTsKIAotICAgICAgICBpZiAoU1RSSU5HLmVxdWFscyhtb2RlKSkgeworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgY2FzZSBTVFJJTkc6CiAgICAgICAgICAgICBwcy5wcmludChnZXRMZW5ndGgoc3RyaW5nLCBnZXRUcmltKCkpKTsKICAgICAgICAgICAgIHBzLmNsb3NlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoRUFDSC5lcXVhbHMobW9kZSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVBQ0g6CiAgICAgICAgICAgICBoYW5kbGVSZXNvdXJjZXMobmV3IEVhY2hIYW5kbGVyKHBzKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoQUxMLmVxdWFscyhtb2RlKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMOgogICAgICAgICAgICAgaGFuZGxlUmVzb3VyY2VzKG5ldyBBbGxIYW5kbGVyKHBzKSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg3LDYgKzE5Myw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgewogICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICBpZiAobGVuZ3RoID09IG51bGwpIHsKQEAgLTE5NCwxMSArMjAxLDExIEBACiAgICAgICAgIH0KICAgICAgICAgTG9uZyBlbGw7CiAgICAgICAgIGlmIChTVFJJTkcuZXF1YWxzKG1vZGUpKSB7Ci0gICAgICAgICAgICBlbGwgPSBuZXcgTG9uZyhnZXRMZW5ndGgoc3RyaW5nLCBnZXRUcmltKCkpKTsKKyAgICAgICAgICAgIGVsbCA9IGdldExlbmd0aChzdHJpbmcsIGdldFRyaW0oKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBY2N1bUhhbmRsZXIgaCA9IG5ldyBBY2N1bUhhbmRsZXIoKTsKICAgICAgICAgICAgIGhhbmRsZVJlc291cmNlcyhoKTsKLSAgICAgICAgICAgIGVsbCA9IG5ldyBMb25nKGguZ2V0QWNjdW0oKSk7CisgICAgICAgICAgICBlbGwgPSBoLmdldEFjY3VtKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHdoZW4uZXZhbHVhdGUoZWxsLmNvbXBhcmVUbyhsZW5ndGgpKTsKICAgICB9CkBAIC0yMDYsMjUgKzIxMywyNiBAQAogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKICAgICAgICAgaWYgKHN0cmluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBzdHJpbmcgbGVuZ3RoIGZ1bmN0aW9uIgotICAgICAgICAgICAgICAgICAgICArICIgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGZpbGUvcmVzb3VyY2UgbGVuZ3RoIGZ1bmN0aW9uIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAidGhlIHN0cmluZyBsZW5ndGggZnVuY3Rpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGZpbGUvcmVzb3VyY2UgbGVuZ3RoIGZ1bmN0aW9uIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIShTVFJJTkcuZXF1YWxzKG1vZGUpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIG1vZGUgYXR0cmlidXRlIGlzIGZvciB1c2UiCi0gICAgICAgICAgICAgICAgICAgICsgIiB3aXRoIHRoZSBmaWxlL3Jlc291cmNlIGxlbmd0aCBmdW5jdGlvbiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRoZSBtb2RlIGF0dHJpYnV0ZSBpcyBmb3IgdXNlIHdpdGggdGhlIGZpbGUvcmVzb3VyY2UgbGVuZ3RoIGZ1bmN0aW9uIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghKEVBQ0guZXF1YWxzKG1vZGUpIHx8IEFMTC5lcXVhbHMobW9kZSkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnZhbGlkIG1vZGUgc2V0dGluZyBmb3IiCi0gICAgICAgICAgICAgICAgICAgICsgIiBmaWxlL3Jlc291cmNlIGxlbmd0aCBmdW5jdGlvbjogXCIiICsgbW9kZSArICJcIiIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmltICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSB0cmltIGF0dHJpYnV0ZSBpcyIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZvciB1c2Ugd2l0aCB0aGUgc3RyaW5nIGxlbmd0aCBmdW5jdGlvbiBvbmx5Iik7CisgICAgICAgICAgICBpZiAoIUVBQ0guZXF1YWxzKG1vZGUpICYmICFBTEwuZXF1YWxzKG1vZGUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtb2RlIHNldHRpbmcgZm9yIGZpbGUvcmVzb3VyY2UgbGVuZ3RoIGZ1bmN0aW9uOiBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbW9kZSArICJcIiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyaW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInRoZSB0cmltIGF0dHJpYnV0ZSBpcyBmb3IgdXNlIHdpdGggdGhlIHN0cmluZyBsZW5ndGggZnVuY3Rpb24gb25seSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgbXVzdCBzZXQgZWl0aGVyIHRoZSBzdHJpbmcgYXR0cmlidXRlIgotICAgICAgICAgICAgICAgICsgIiBvciBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIHVzaW5nIHRoZSBmaWxlIGF0dHJpYnV0ZSBvciIKLSAgICAgICAgICAgICAgICArICIgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInlvdSBtdXN0IHNldCBlaXRoZXIgdGhlIHN0cmluZyBhdHRyaWJ1dGUgb3Igc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyB1c2luZyB0aGUgZmlsZSBhdHRyaWJ1dGUgb3IgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1Myw2ICsyNjEsNyBAQAogICAgICAgICAgKiBSZXR1cm4gdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgRmlsZU1vZGUuCiAgICAgICAgICAqIEByZXR1cm4gPGNvZGU+U3RyaW5nW108L2NvZGU+LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gTU9ERVM7CiAgICAgICAgIH0KQEAgLTI2OCw2ICsyNzcsNyBAQAogCiAgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBIYW5kbGVyIHsKICAgICAgICAgcHJpdmF0ZSBQcmludFN0cmVhbSBwczsKKwogICAgICAgICBIYW5kbGVyKFByaW50U3RyZWFtIHBzKSB7CiAgICAgICAgICAgICB0aGlzLnBzID0gcHM7CiAgICAgICAgIH0KQEAgLTI4Nyw2ICsyOTcsOCBAQAogICAgICAgICBFYWNoSGFuZGxlcihQcmludFN0cmVhbSBwcykgewogICAgICAgICAgICAgc3VwZXIocHMpOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZShSZXNvdXJjZSByKSB7CiAgICAgICAgICAgICBnZXRQcygpLnByaW50KHIudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICBnZXRQcygpLnByaW50KCIgOiAiKTsKQEAgLTMwNiwxMiArMzE4LDE2IEBACiAgICAgICAgIEFjY3VtSGFuZGxlcigpIHsKICAgICAgICAgICAgIHN1cGVyKG51bGwpOwogICAgICAgICB9CisKICAgICAgICAgcHJvdGVjdGVkIEFjY3VtSGFuZGxlcihQcmludFN0cmVhbSBwcykgewogICAgICAgICAgICAgc3VwZXIocHMpOwogICAgICAgICB9CisKICAgICAgICAgcHJvdGVjdGVkIGxvbmcgZ2V0QWNjdW0oKSB7CiAgICAgICAgICAgICByZXR1cm4gYWNjdW07CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZShSZXNvdXJjZSByKSB7CiAgICAgICAgICAgICBsb25nIHNpemUgPSByLmdldFNpemUoKTsKICAgICAgICAgICAgIGlmIChzaXplID09IFJlc291cmNlLlVOS05PV05fU0laRSkgewpAQCAtMzI2LDYgKzM0Miw4IEBACiAgICAgICAgIEFsbEhhbmRsZXIoUHJpbnRTdHJlYW0gcHMpIHsKICAgICAgICAgICAgIHN1cGVyKHBzKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICB2b2lkIGNvbXBsZXRlKCkgewogICAgICAgICAgICAgZ2V0UHMoKS5wcmludChnZXRBY2N1bSgpKTsKICAgICAgICAgICAgIHN1cGVyLmNvbXBsZXRlKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZEZpbGUuamF2YQppbmRleCBjNDUwYTBlLi44OWJlZDA5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRGaWxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkUHJvcGVydGllcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFByb3BlcnRpZXMuamF2YQppbmRleCA2MDg2MzE4Li5lNDZkMzRhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkUHJvcGVydGllcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRQcm9wZXJ0aWVzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw3ICsyMiw5IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKQEAgLTMwLDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy51dGlsLkNoYWluUmVhZGVySGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbC5DaGFpblJlYWRlckhlbHBlci5DaGFpblJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWx0ZXJDaGFpbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKQEAgLTM3LDggKzQwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuSmF2YVJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlsczsKIAogLyoqCiAgKiBMb2FkIGEgZmlsZSdzIGNvbnRlbnRzIGFzIEFudCBwcm9wZXJ0aWVzLgpAQCAtNTYsNyArNTcsNyBAQAogICAgIC8qKgogICAgICAqIEhvbGRzIGZpbHRlcmNoYWlucwogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yPEZpbHRlckNoYWluPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBFbmNvZGluZyB0byB1c2UgZm9yIGlucHV0OyBkZWZhdWx0cyB0byB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGVuY29kaW5nLgpAQCAtOTIsOCArOTMsOCBAQAogICAgICAqIGVuY29kaW5nLiA8cD4KICAgICAgKgogICAgICAqIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZQotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPgotICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+CisgICAgICogaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwKICAgICAgKiA8L2E+LjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgbmV3IEVuY29kaW5nIHZhbHVlCkBAIC0xNTksNiArMTYwLDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy92YWxpZGF0aW9uCiAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewpAQCAtMTcyLDMwICsxNzQsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0OiAiICsgc3JjKTsKICAgICAgICAgfQotICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG51bGw7Ci0gICAgICAgIFJlYWRlciBpbnN0cmVhbSA9IG51bGw7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIHRpcyA9IG51bGw7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNyYy5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDaGFpblJlYWRlckhlbHBlciBjcmggPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoKTsKLSAgICAgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKGluc3RyZWFtKTsKLSAgICAgICAgICAgIGNyaC5zZXRGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKLSAgICAgICAgICAgIGNyaC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBpbnN0cmVhbSA9IGNyaC5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKKyAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gZW5jb2RpbmcgPT0gbnVsbCA/IENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSA6IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZyk7CiAKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gY3JoLnJlYWRGdWxseShpbnN0cmVhbSk7CisgICAgICAgIHRyeSAoQ2hhaW5SZWFkZXIgaW5zdHJlYW0gPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNyYy5nZXRJbnB1dFN0cmVhbSgpKSwgY2hhcnNldCksIGZpbHRlckNoYWlucykKKyAgICAgICAgICAgICAgICAuZ2V0QXNzZW1ibGVkUmVhZGVyKCkpIHsKIAotICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gaW5zdHJlYW0ucmVhZEZ1bGx5KCk7CisKKyAgICAgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0LmVuZHNXaXRoKCJcbiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgIlxuIjsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAiXG4iOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGV4dC5nZXRCeXRlcyhSZXNvdXJjZVV0aWxzLklTT184ODU5XzEpKTsKKyAgICAgICAgICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSB0aXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIHRleHQuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xKSk7CiAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICAgICAgcHJvcHMubG9hZCh0aXMpOwogCkBAIC0yMDcsOSArMjAwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIGZpbGU6ICIgKyBpb2UsIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoYmlzKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh0aXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTgsNyArMjA4LDcgQEAKICAgICAgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gYWRkCiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkRmlsdGVyQ2hhaW4oRmlsdGVyQ2hhaW4gZmlsdGVyKSB7Ci0gICAgICAgIGZpbHRlckNoYWlucy5hZGRFbGVtZW50KGZpbHRlcik7CisgICAgICAgIGZpbHRlckNoYWlucy5hZGQoZmlsdGVyKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFJlc291cmNlLmphdmEKaW5kZXggZjY4YjViYS4uYTllNGM2MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZFJlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxOSArMTksMTggQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWwuQ2hhaW5SZWFkZXJIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy51dGlsLkNoYWluUmVhZGVySGVscGVyLkNoYWluUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCiAgKiBMb2FkIGEgcmVzb3VyY2UgaW50byBhIHByb3BlcnR5CkBAIC03MCwxNSArNjksMTUgQEAKICAgICAvKioKICAgICAgKiBIb2xkcyBGaWx0ZXJDaGFpbnMKICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zID0gbmV3IFZlY3RvcjxGaWx0ZXJDaGFpbj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogRW5jb2RpbmcgdG8gdXNlIGZvciBpbnB1dCwgZGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdAogICAgICAqIGVuY29kaW5nLiA8cD4KICAgICAgKgogICAgICAqIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZQotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPgotICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+CisgICAgICogaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwKICAgICAgKiA8L2E+LjwvcD4KICAgICAgKgogICAgICAqIEBwYXJhbSBlbmNvZGluZyBUaGUgbmV3IEVuY29kaW5nIHZhbHVlCkBAIC0xMjQsNiArMTIzLDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy92YWxpZGF0aW9uCkBAIC0xMzQsODIgKzEzNCw2NyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvdXRwdXQgcHJvcGVydHkgbm90IGRlZmluZWQiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocXVpZXQgJiYgZmFpbE9uRXJyb3IpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicXVpZXQgYW5kIGZhaWxvbmVycm9yIGNhbm5vdCBib3RoIGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzZXQgdG8gdHJ1ZSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJxdWlldCBhbmQgZmFpbG9uZXJyb3IgY2Fubm90IGJvdGggYmUgc2V0IHRvIHRydWUiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXNyYy5pc0V4aXN0cygpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHNyYyArICIgZG9lc24ndCBleGlzdCI7CiAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBxdWlldCA/IFByb2plY3QuTVNHX1dBUk4gOiBQcm9qZWN0Lk1TR19FUlIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBxdWlldCA/IFByb2plY3QuTVNHX1dBUk4gOiBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBudWxsOwotICAgICAgICBSZWFkZXIgaW5zdHJlYW0gPSBudWxsOworCiAgICAgICAgIGxvZygibG9hZGluZyAiICsgc3JjICsgIiBpbnRvIHByb3BlcnR5ICIgKyBwcm9wZXJ0eSwKICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IGVuY29kaW5nID09IG51bGwgPyBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkKKyAgICAgICAgICAgIDogQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgbGVuID0gc3JjLmdldFNpemUoKTsKLSAgICAgICAgICAgIGxvZygicmVzb3VyY2Ugc2l6ZSA9ICIKLSAgICAgICAgICAgICAgICArIChsZW4gIT0gUmVzb3VyY2UuVU5LTk9XTl9TSVpFID8gU3RyaW5nLnZhbHVlT2YobGVuKQotICAgICAgICAgICAgICAgICAgIDogInVua25vd24iKSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgbG9nKCJyZXNvdXJjZSBzaXplID0gIiArIChsZW4gIT0gUmVzb3VyY2UuVU5LTk9XTl9TSVpFCisgICAgICAgICAgICAgICAgPyBTdHJpbmcudmFsdWVPZihsZW4pIDogInVua25vd24iKSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgLy9kaXNjYXJkIG1vc3Qgb2YgcmVhbGx5IGJpZyByZXNvdXJjZXMKICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gKGludCkgbGVuOwogICAgICAgICAgICAgLy9vcGVuIHVwIHRoZSByZXNvdXJjZQotICAgICAgICAgICAgaXMgPSBzcmMuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlzKTsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgdGV4dDsKICAgICAgICAgICAgIGlmIChzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBDaGFpblJlYWRlckhlbHBlciBjcmggPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAobGVuICE9IFJlc291cmNlLlVOS05PV05fU0laRSkgewotICAgICAgICAgICAgICAgICAgICBjcmguc2V0QnVmZmVyU2l6ZShzaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3JoLnNldFByaW1hcnlSZWFkZXIoaW5zdHJlYW0pOwotICAgICAgICAgICAgICAgIGNyaC5zZXRGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKLSAgICAgICAgICAgICAgICBjcmguc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIGluc3RyZWFtID0gY3JoLmdldEFzc2VtYmxlZFJlYWRlcigpOworICAgICAgICAgICAgICAgIHRyeSAoQ2hhaW5SZWFkZXIgY2hhaW5SZWFkZXIgPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoCisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3JjLmdldElucHV0U3RyZWFtKCkpLCBjaGFyc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ2hhaW5zKS53aXRoKGNyaCAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjLmdldFNpemUoKSAhPSBSZXNvdXJjZS5VTktOT1dOX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmguc2V0QnVmZmVyU2l6ZShzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkuZ2V0QXNzZW1ibGVkUmVhZGVyKCkpIHsKIAotICAgICAgICAgICAgICAgIHRleHQgPSBjcmgucmVhZEZ1bGx5KGluc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGNoYWluUmVhZGVyLnJlYWRGdWxseSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nKCJEbyBub3Qgc2V0IHByb3BlcnR5ICIgKyBwcm9wZXJ0eSArICIgYXMgaXRzIGxlbmd0aCBpcyAwLiIsCiAgICAgICAgICAgICAgICAgICAgIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIHRleHQgPSBudWxsOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygibG9hZGVkICIgKyB0ZXh0Lmxlbmd0aCgpICsgIiBjaGFyYWN0ZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgICAgICAgICBsb2cocHJvcGVydHkgKyAiIDo9ICIgKyB0ZXh0LCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIHRleHQpOworICAgICAgICAgICAgICAgIGxvZygibG9hZGVkICIgKyB0ZXh0Lmxlbmd0aCgpICsgIiBjaGFyYWN0ZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgbG9nKHByb3BlcnR5ICsgIiA6PSAiICsgdGV4dCwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgfQotCiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIKLSAgICAgICAgICAgICAgICArIGlvZS50b1N0cmluZygpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIGxvYWQgcmVzb3VyY2U6ICIgKyBpb2U7CiAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgaW9lLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgcXVpZXQgPyBQcm9qZWN0Lk1TR19WRVJCT1NFIDogUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgQnVpbGRFeGNlcHRpb24gYmUpIHsKICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewogICAgICAgICAgICAgICAgIHRocm93IGJlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coYmUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICBxdWlldCA/IFByb2plY3QuTVNHX1ZFUkJPU0UgOiBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzKTsKKyAgICAgICAgICAgIGxvZyhiZS5nZXRNZXNzYWdlKCksIHF1aWV0ID8gUHJvamVjdC5NU0dfVkVSQk9TRSA6IFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxOCw3ICsyMDMsNyBAQAogICAgICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB0byBhZGQKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBhZGRGaWx0ZXJDaGFpbihGaWx0ZXJDaGFpbiBmaWx0ZXIpIHsKLSAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZEVsZW1lbnQoZmlsdGVyKTsKKyAgICAgICAgZmlsdGVyQ2hhaW5zLmFkZChmaWx0ZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI3LDggKzIxMiw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgewogICAgICAgICBpZiAoYS5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KICAgICAgICAgc3JjID0gYS5pdGVyYXRvcigpLm5leHQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2NhbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9jYWwuamF2YQppbmRleCAzZmRmOWI1Li44OTA1NzFkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2NhbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvY2FsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2dPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCmluZGV4IDM3MGJjZGQuLjg0ZWIxNGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ091dHB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9nU3RyZWFtSGFuZGxlci5qYXZhCmluZGV4IGVkMTZjZjMuLjMzYWZlNDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvZ1N0cmVhbUhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2dTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMSArMTgsOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCiAgKiBMb2dzIHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3Igb2YgYSBzdWJwcm9jZXNzIHRvIHRoZSBsb2cgc3lzdGVtIG9mIGFudC4KQEAgLTU3LDE0ICs1NSwxMCBAQAogICAgIC8qKgogICAgICAqIFN0b3AgdGhlIGxvZyBzdHJlYW0gaGFuZGxlci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewogICAgICAgICBzdXBlci5zdG9wKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRFcnIoKS5jbG9zZSgpOwotICAgICAgICAgICAgZ2V0T3V0KCkuY2xvc2UoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gcGxhaW4gaW1wb3NzaWJsZQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICB9CisgICAgICAgIEZpbGVVdGlscy5jbG9zZShnZXRFcnIoKSk7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZShnZXRPdXQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9EZWYuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvRGVmLmphdmEKaW5kZXggNzliNjk4NC4uMTBlZGYwNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9EZWYuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudFR5cGVEZWZpbml0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNDIsMTMgKzQzLDEzIEBACiBwdWJsaWMgY2xhc3MgTWFjcm9EZWYgZXh0ZW5kcyBBbnRsaWJEZWZpbml0aW9uICB7CiAKICAgICBwcml2YXRlIE5lc3RlZFNlcXVlbnRpYWwgbmVzdGVkU2VxdWVudGlhbDsKLSAgICBwcml2YXRlIFN0cmluZyAgICAgbmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgYmFja1RyYWNlID0gdHJ1ZTsKLSAgICBwcml2YXRlIExpc3Q8QXR0cmlidXRlPiAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxBdHRyaWJ1dGU+KCk7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZW1wbGF0ZUVsZW1lbnQ+ICAgICAgICBlbGVtZW50cyAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUZW1wbGF0ZUVsZW1lbnQ+KCk7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgIHRleHROYW1lICAgPSBudWxsOwotICAgIHByaXZhdGUgVGV4dCAgICAgICB0ZXh0ICAgICAgID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gICAgaGFzSW1wbGljaXRFbGVtZW50ID0gZmFsc2U7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gYmFja1RyYWNlID0gdHJ1ZTsKKyAgICBwcml2YXRlIExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUZW1wbGF0ZUVsZW1lbnQ+IGVsZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgU3RyaW5nIHRleHROYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIFRleHQgdGV4dCA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc0ltcGxpY2l0RWxlbWVudCA9IGZhbHNlOwogCiAgICAgLyoqCiAgICAgICogTmFtZSBvZiB0aGUgZGVmaW5pdGlvbgpAQCAtNzYsOCArNzcsOCBAQAogICAgICAgICBmb3IgKEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICBpZiAodGV4dC5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAidGhlIG5hbWUgXCIiICsgdGV4dC5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgYWxyZWFkeSB1c2VkIGFzIGFuIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgICAgICAidGhlIG5hbWUgXCIlc1wiIGlzIGFscmVhZHkgdXNlZCBhcyBhbiBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICB0ZXh0LmdldE5hbWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKQEAgLTEzMiwxMyArMTMzLDE0IEBACiAgICAgICogVGhpcyBpcyBhIHNpbXBsZSB0YXNrIGNvbnRhaW5lci4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5lc3RlZFNlcXVlbnRpYWwgaW1wbGVtZW50cyBUYXNrQ29udGFpbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IG5lc3RlZCA9IG5ldyBBcnJheUxpc3Q8VGFzaz4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IG5lc3RlZCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSB0YXNrIG9yIHR5cGUgdG8gdGhlIGNvbnRhaW5lci4KICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIHRhc2sgYW4gdW5rbm93biBlbGVtZW50LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayB0YXNrKSB7CiAgICAgICAgICAgICBuZXN0ZWQuYWRkKHRhc2spOwogICAgICAgICB9CkBAIC0yMzUsNyArMjM3LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgY29uc2lzdHMgb2YgdmFsaWQgbmFtZSBjaGFyYWN0ZXJzCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkTmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAobmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgKytpKSB7CkBAIC0yNTgsMTYgKzI2MCwxNCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0TmFtZSgpLmVxdWFscyh0ZXh0TmFtZSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidGhlIG5hbWUgXCIiICsgYXR0cmlidXRlLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIlwiIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBieSB0aGUgdGV4dCBlbGVtZW50Iik7CisgICAgICAgICAgICAgICAgInRoZSBuYW1lIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYnkgdGhlIHRleHQgZWxlbWVudCIsCisgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldE5hbWUoKSk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBhdHRyaWJ1dGVzLnNpemUoKTsKICAgICAgICAgZm9yIChBdHRyaWJ1dGUgYXR0IDogYXR0cmlidXRlcykgewogICAgICAgICAgICAgaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAidGhlIG5hbWUgXCIiICsgYXR0cmlidXRlLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImFub3RoZXIgYXR0cmlidXRlIGVsZW1lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgInRoZSBuYW1lIFwiJXNcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gYW5vdGhlciBhdHRyaWJ1dGUgZWxlbWVudCIsCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7CkBAIC0yODUsMTEgKzI4NSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChlbGVtZW50cy5nZXQoZWxlbWVudC5nZXROYW1lKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidGhlIGVsZW1lbnQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIik7CisgICAgICAgICAgICAgICAgInRoZSBlbGVtZW50ICVzIGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkIiwgZWxlbWVudC5nZXROYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChoYXNJbXBsaWNpdEVsZW1lbnQKLSAgICAgICAgICAgIHx8IChlbGVtZW50LmlzSW1wbGljaXQoKSAmJiBlbGVtZW50cy5zaXplKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIHx8IChlbGVtZW50LmlzSW1wbGljaXQoKSAmJiAhZWxlbWVudHMuaXNFbXB0eSgpKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJPbmx5IG9uZSBlbGVtZW50IGFsbG93ZWQgd2hlbiB1c2luZyBpbXBsaWNpdCBlbGVtZW50cyIpOwogICAgICAgICB9CkBAIC0zMDAsNiArMjk5LDcgQEAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBuZXcgYW50IHR5cGUgYmFzZWQgb24gdGhlIGVtYmVkZGVkIHRhc2tzIGFuZCB0eXBlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICBpZiAobmVzdGVkU2VxdWVudGlhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3Npbmcgc2VxdWVudGlhbCBlbGVtZW50Iik7CkBAIC0zMjEsNyArMzIxLDYgQEAKICAgICAgICAgbG9nKCJjcmVhdGluZyBtYWNybyAgIiArIG5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQW4gYXR0cmlidXRlIGZvciB0aGUgTWFjcm9EZWYgdGFzay4KICAgICAgKgpAQCAtMzM5LDggKzMzOCw4IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBuYW1lIFsiICsgbmFtZSArICJdIGZvciBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklsbGVnYWwgbmFtZSBbJXNdIGZvciBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogICAgICAgICB9CkBAIC00MTEsNiArNDEwLDcgQEAKICAgICAgICAgICogQHBhcmFtIG9iaiBhbiA8Y29kZT5PYmplY3Q8L2NvZGU+IHZhbHVlCiAgICAgICAgICAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CiAgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC00MjYsMjEgKzQyNiwxNiBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAob3RoZXIuZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWRlZmF1bHRWYWx1ZS5lcXVhbHMob3RoZXIuZGVmYXVsdFZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSA9PSBudWxsID8gb3RoZXIuZGVmYXVsdFZhbHVlID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUuZXF1YWxzKG90aGVyLmRlZmF1bHRWYWx1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBvYmplY3RIYXNoQ29kZShkZWZhdWx0VmFsdWUpICsgb2JqZWN0SGFzaENvZGUobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShkZWZhdWx0VmFsdWUpICsgT2JqZWN0cy5oYXNoQ29kZShuYW1lKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDYyLDggKzQ1Nyw4IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAgICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiSWxsZWdhbCBuYW1lIFsiICsgbmFtZSArICJdIGZvciBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklsbGVnYWwgbmFtZSBbJXNdIGZvciBlbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgfQpAQCAtNTQzLDYgKzUzOCw3IEBACiAgICAgICAgICAqIEBwYXJhbSBvYmogYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQogICAgICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTUxLDI0ICs1NDcsMjEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBUZXh0IG90aGVyID0gKFRleHQpIG9iajsKLSAgICAgICAgICAgIHJldHVybiBzYWZlQ29tcGFyZShuYW1lLCBvdGhlci5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKG5hbWUsIG90aGVyLm5hbWUpCiAgICAgICAgICAgICAgICAgJiYgb3B0aW9uYWwgPT0gb3RoZXIub3B0aW9uYWwKICAgICAgICAgICAgICAgICAmJiB0cmltID09IG90aGVyLnRyaW0KLSAgICAgICAgICAgICAgICAmJiBzYWZlQ29tcGFyZShkZWZhdWx0U3RyaW5nLCBvdGhlci5kZWZhdWx0U3RyaW5nKTsKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhkZWZhdWx0U3RyaW5nLCBvdGhlci5kZWZhdWx0U3RyaW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG9iamVjdEhhc2hDb2RlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVDb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotICAgICAgICByZXR1cm4gYSA9PSBudWxsID8gYiA9PSBudWxsIDogYS5lcXVhbHMoYik7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQSBuZXN0ZWQgZWxlbWVudCBmb3IgdGhlIE1hY3JvRGVmIHRhc2suCiAgICAgICovCkBAIC01ODYsOCArNTc5LDggQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIG5hbWUgWyIgKyBuYW1lICsgIl0gZm9yIG1hY3JvIGVsZW1lbnQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklsbGVnYWwgbmFtZSBbJXNdIGZvciBtYWNybyBlbGVtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgfQpAQCAtNjY3LDYgKzY2MCw3IEBACiAgICAgICAgICAqIEBwYXJhbSBvYmogYW4gPGNvZGU+T2JqZWN0PC9jb2RlPiB2YWx1ZQogICAgICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogICAgICAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC02ODQsOCArNjc4LDkgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqZWN0SGFzaENvZGUobmFtZSkKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUpCiAgICAgICAgICAgICAgICAgKyAob3B0aW9uYWwgPyAxIDogMCkgKyAoaW1wbGljaXQgPyAxIDogMCk7CiAgICAgICAgIH0KIApAQCAtNzA0LDEyICs2OTksMTAgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCAhb2JqLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFvYmouZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorCiAgICAgICAgIE1hY3JvRGVmIG90aGVyID0gKE1hY3JvRGVmKSBvYmo7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBvdGhlci5uYW1lID09IG51bGw7CkBAIC03MjAsNDEgKzcxMywyOSBAQAogICAgICAgICAvLyBBbGxvdyB0d28gbWFjcm8gZGVmaW5pdGlvbnMgd2l0aCB0aGUgc2FtZSBsb2NhdGlvbgogICAgICAgICAvLyB0byBiZSB0cmVhdGVkIGFzIHNpbWlsYXIgLSBidWd6aWxsYSAzMTIxNQogICAgICAgICBpZiAob3RoZXIuZ2V0TG9jYXRpb24oKSAhPSBudWxsCi0gICAgICAgICAgICAmJiBvdGhlci5nZXRMb2NhdGlvbigpLmVxdWFscyhnZXRMb2NhdGlvbigpKQotICAgICAgICAgICAgJiYgIXNhbWUpIHsKKyAgICAgICAgICAgICAgICAmJiBvdGhlci5nZXRMb2NhdGlvbigpLmVxdWFscyhnZXRMb2NhdGlvbigpKQorICAgICAgICAgICAgICAgICYmICFzYW1lKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAodGV4dCA9PSBudWxsKSB7CiAgICAgICAgICAgICBpZiAob3RoZXIudGV4dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCF0ZXh0LmVxdWFscyhvdGhlci50ZXh0KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghdGV4dC5lcXVhbHMob3RoZXIudGV4dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotICAgICAgICBpZiAoZ2V0VVJJKCkgPT0gbnVsbCB8fCBnZXRVUkkoKS5lcXVhbHMoIiIpCi0gICAgICAgICAgICB8fCBnZXRVUkkoKS5lcXVhbHMoUHJvamVjdEhlbHBlci5BTlRfQ09SRV9VUkkpKSB7Ci0gICAgICAgICAgICBpZiAoIShvdGhlci5nZXRVUkkoKSA9PSBudWxsIHx8IG90aGVyLmdldFVSSSgpLmVxdWFscygiIikKLSAgICAgICAgICAgICAgICAgIHx8IG90aGVyLmdldFVSSSgpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpKSB7CisgICAgICAgIGlmIChnZXRVUkkoKSA9PSBudWxsIHx8IGdldFVSSSgpLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgIHx8IGdldFVSSSgpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5nZXRVUkkoKSAhPSBudWxsICYmICFvdGhlci5nZXRVUkkoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW90aGVyLmdldFVSSSgpLmVxdWFscyhQcm9qZWN0SGVscGVyLkFOVF9DT1JFX1VSSSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWdldFVSSSgpLmVxdWFscyhvdGhlci5nZXRVUkkoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIWdldFVSSSgpLmVxdWFscyhvdGhlci5nZXRVUkkoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbmVzdGVkU2VxdWVudGlhbC5zaW1pbGFyKG90aGVyLm5lc3RlZFNlcXVlbnRpYWwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmVxdWFscyhvdGhlci5hdHRyaWJ1dGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZWxlbWVudHMuZXF1YWxzKG90aGVyLmVsZW1lbnRzKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gbmVzdGVkU2VxdWVudGlhbC5zaW1pbGFyKG90aGVyLm5lc3RlZFNlcXVlbnRpYWwpCisgICAgICAgICAgICAgICAgJiYgYXR0cmlidXRlcy5lcXVhbHMob3RoZXIuYXR0cmlidXRlcykgJiYgZWxlbWVudHMuZXF1YWxzKG90aGVyLmVsZW1lbnRzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgwMCw2ICs3ODEsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CiAgICAgICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgb2JqZWN0CiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIE9iamVjdCBjcmVhdGUoUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgICAgICBPYmplY3QgbyA9IHN1cGVyLmNyZWF0ZShwcm9qZWN0KTsKICAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKQEAgLTgxNiw2ICs3OTgsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0CiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gc2FtZURlZmluaXRpb24oQW50VHlwZURlZmluaXRpb24gb3RoZXIsIFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgaWYgKCFzdXBlci5zYW1lRGVmaW5pdGlvbihvdGhlciwgcHJvamVjdCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC04MzEsNiArODE0LDcgQEAKICAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdAogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNpbWlsYXJEZWZpbml0aW9uKAogICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gb3RoZXIsIFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgaWYgKCFzdXBlci5zaW1pbGFyRGVmaW5pdGlvbihvdGhlciwgcHJvamVjdCkpIHsKQEAgLTg0MSwxMiArODI1LDQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBvYmplY3RIYXNoQ29kZShPYmplY3QgbykgewotICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBvLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvSW5zdGFuY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvSW5zdGFuY2UuamF2YQppbmRleCAxMjRmMDllLi4wNzdiNmQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0luc3RhbmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9JbnN0YW5jZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTUgKzE5LDEzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTUwLDEzICs0OCwxMyBAQAogICovCiBwdWJsaWMgY2xhc3MgTWFjcm9JbnN0YW5jZSBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBEeW5hbWljQXR0cmlidXRlLCBUYXNrQ29udGFpbmVyIHsKICAgICBwcml2YXRlIE1hY3JvRGVmIG1hY3JvRGVmOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiAgICAgIG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFjcm9EZWYuVGVtcGxhdGVFbGVtZW50PiAgICAgIG5zRWxlbWVudHMgPSBudWxsOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgVW5rbm93bkVsZW1lbnQ+ICAgICAgcHJlc2VudEVsZW1lbnRzOwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBsb2NhbEF0dHJpYnV0ZXM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgdGV4dCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgICAgaW1wbGljaXRUYWcgPSAgICAgbnVsbDsKLSAgICBwcml2YXRlIExpc3Q8VGFzaz4gICAgICB1bmtub3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudD4gbnNFbGVtZW50cyA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBVbmtub3duRWxlbWVudD4gcHJlc2VudEVsZW1lbnRzOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBsb2NhbEF0dHJpYnV0ZXM7CisgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgaW1wbGljaXRUYWcgPSBudWxsOworICAgIHByaXZhdGUgTGlzdDxUYXNrPiB1bmtub3duRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIENhbGxlZCBmcm9tIE1hY3JvRGVmLk15QW50VHlwZURlZmluaXRpb24jY3JlYXRlKCkKQEAgLTgwLDYgKzc4LDcgQEAKICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIG1hcC5wdXQobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCksIHZhbHVlKTsKICAgICB9CkBAIC05MSwyMiArOTAsMjIgQEAKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQgYW55IG1vcmUiKTsKICAgICB9CiAKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudD4gZ2V0TnNFbGVtZW50cygpIHsKICAgICAgICAgaWYgKG5zRWxlbWVudHMgPT0gbnVsbCkgewotICAgICAgICAgICAgbnNFbGVtZW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFjcm9EZWYuVGVtcGxhdGVFbGVtZW50PigpOwotICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudD4gZW50cnkgOiBtYWNyb0RlZi5nZXRFbGVtZW50cygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIG5zRWxlbWVudHMucHV0KChTdHJpbmcpIGVudHJ5LmdldEtleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICBNYWNyb0RlZi5UZW1wbGF0ZUVsZW1lbnQgdGUgPSAoTWFjcm9EZWYuVGVtcGxhdGVFbGVtZW50KQotICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICBpZiAodGUuaXNJbXBsaWNpdCgpKSB7Ci0gICAgICAgICAgICAgICAgaW1wbGljaXRUYWcgPSB0ZS5nZXROYW1lKCk7CisgICAgICAgICAgICBuc0VsZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYWNyb0RlZi5UZW1wbGF0ZUVsZW1lbnQ+IGVudHJ5IDogbWFjcm9EZWYKKyAgICAgICAgICAgICAgICAuZ2V0RWxlbWVudHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgbnNFbGVtZW50cy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIE1hY3JvRGVmLlRlbXBsYXRlRWxlbWVudCB0ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHRlLmlzSW1wbGljaXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFRhZyA9IHRlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5zRWxlbWVudHM7CiAgICAgfQpAQCAtMTE2LDYgKzExNSw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayBhIG5lc3RlZCBlbGVtZW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7CiAgICAgICAgIHVua25vd25FbGVtZW50cy5hZGQobmVzdGVkVGFzayk7CiAgICAgfQpAQCAtMTI0LDE1ICsxMjQsMTUgQEAKICAgICAgICAgaWYgKGltcGxpY2l0VGFnICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yPFRhc2s+IGkgPSB1bmtub3duRWxlbWVudHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IChVbmtub3duRWxlbWVudCkgaS5uZXh0KCk7CisgICAgICAgIGZvciAoVGFzayB0YXNrIDogdW5rbm93bkVsZW1lbnRzKSB7CisgICAgICAgICAgICBVbmtub3duRWxlbWVudCB1ZSA9IChVbmtub3duRWxlbWVudCkgdGFzazsKICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gUHJvamVjdEhlbHBlci5leHRyYWN0TmFtZUZyb21Db21wb25lbnROYW1lKAogICAgICAgICAgICAgICAgIHVlLmdldFRhZygpKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgICAgICAgICBpZiAoZ2V0TnNFbGVtZW50cygpLmdldChuYW1lKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBlbGVtZW50ICIgKyBuYW1lKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVuc3VwcG9ydGVkIGVsZW1lbnQgJXMiLCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwcmVzZW50RWxlbWVudHMuZ2V0KG5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVsZW1lbnQgIiArIG5hbWUgKyAiIGFscmVhZHkgcHJlc2VudCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRWxlbWVudCAlcyBhbHJlYWR5IHByZXNlbnQiLCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByZXNlbnRFbGVtZW50cy5wdXQobmFtZSwgdWUpOwogICAgICAgICB9CkBAIC0xNDIsMTMgKzE0MiwxNCBAQAogICAgICAqIEVtYmVkZGVkIGVsZW1lbnQgaW4gbWFjcm8gaW5zdGFuY2UKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnQgaW1wbGVtZW50cyBUYXNrQ29udGFpbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IHVua25vd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8VGFzaz4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IHVua25vd25FbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYW4gdW5rbm93biBlbGVtZW50ICh0byBiZSBzbmlwcGVkIGludG8gdGhlIG1hY3JvRGVmIGluc3RhbmNlKQogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gbmVzdGVkVGFzayBhbiB1bmtub3duIGVsZW1lbnQKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgewogICAgICAgICAgICAgdW5rbm93bkVsZW1lbnRzLmFkZChuZXN0ZWRUYXNrKTsKICAgICAgICAgfQpAQCAtMTY5LDggKzE3MCw4IEBACiAgICAgICAgIGlmIChzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZXQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBtYWNyb05hbWUgPSBudWxsOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWFjcm9OYW1lID0gbnVsbDsKIAogICAgICAgICBpbnQgc3RhdGUgPSBTVEFURV9OT1JNQUw7CiAgICAgICAgIGZvciAoZmluYWwgY2hhciBjaCA6IHMudG9DaGFyQXJyYXkoKSkgewpAQCAtMTg1LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9FWFBFQ1RfQlJBQ0tFVDoKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICd7JykgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVEFURV9FWFBFQ1RfTkFNRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hY3JvTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ0AnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX05PUk1BTDsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQoJ0AnKTsKQEAgLTIwMiw3ICsyMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gJ30nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFNUQVRFX05PUk1BTDsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbWFjcm9OYW1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvL05PU09OQVIKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hY3JvTWFwcGluZy5nZXQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtYWNyb01hcHBpbmcuZ2V0KG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYXBwZW5kKCJAeyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldC5hcHBlbmQobmFtZSk7CkBAIC0yNzYsOSArMjc3LDcgQEAKICAgICAgICAgcmMuYWRkVGV4dChtYWNyb1N1YnModWUuZ2V0V3JhcHBlcigpLmdldFRleHQoKS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEF0dHJpYnV0ZXMpKTsKIAotICAgICAgICBFbnVtZXJhdGlvbjxSdW50aW1lQ29uZmlndXJhYmxlPiBlID0gdWUuZ2V0V3JhcHBlcigpLmdldENoaWxkcmVuKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBSdW50aW1lQ29uZmlndXJhYmxlIHIgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIGZvciAoUnVudGltZUNvbmZpZ3VyYWJsZSByIDogQ29sbGVjdGlvbnMubGlzdCh1ZS5nZXRXcmFwcGVyKCkuZ2V0Q2hpbGRyZW4oKSkpIHsKICAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVua25vd25FbGVtZW50ID0gKFVua25vd25FbGVtZW50KSByLmdldFByb3h5KCk7CiAgICAgICAgICAgICBTdHJpbmcgdGFnID0gdW5rbm93bkVsZW1lbnQuZ2V0VGFza1R5cGUoKTsKICAgICAgICAgICAgIGlmICh0YWcgIT0gbnVsbCkgewpAQCAtMjkxLDQwICsyOTAsMzYgQEAKICAgICAgICAgICAgICAgICByYy5hZGRDaGlsZChjaGlsZC5nZXRXcmFwcGVyKCkpOwogICAgICAgICAgICAgICAgIHJldC5hZGRDaGlsZChjaGlsZCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlbXBsYXRlRWxlbWVudC5pc0ltcGxpY2l0KCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodW5rbm93bkVsZW1lbnRzLnNpemUoKSA9PSAwICYmICF0ZW1wbGF0ZUVsZW1lbnQuaXNPcHRpb25hbCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHVua25vd25FbGVtZW50cy5pc0VtcHR5KCkgJiYgIXRlbXBsYXRlRWxlbWVudC5pc09wdGlvbmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgbmVzdGVkIGVsZW1lbnRzIGZvciBpbXBsaWNpdCBlbGVtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgdGVtcGxhdGVFbGVtZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBuZXN0ZWQgZWxlbWVudHMgZm9yIGltcGxpY2l0IGVsZW1lbnQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50LmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8VGFzaz4gaSA9IHVua25vd25FbGVtZW50cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkCi0gICAgICAgICAgICAgICAgICAgICAgICA9IGNvcHkoKFVua25vd25FbGVtZW50KSBpLm5leHQoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZm9yIChUYXNrIHRhc2sgOiB1bmtub3duRWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgVW5rbm93bkVsZW1lbnQgY2hpbGQgPSBjb3B5KChVbmtub3duRWxlbWVudCkgdGFzaywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJjLmFkZENoaWxkKGNoaWxkLmdldFdyYXBwZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldC5hZGRDaGlsZChjaGlsZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBwcmVzZW50RWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgIChVbmtub3duRWxlbWVudCkgcHJlc2VudEVsZW1lbnRzLmdldCh0YWcpOworICAgICAgICAgICAgICAgICAgICBwcmVzZW50RWxlbWVudHMuZ2V0KHRhZyk7CiAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUVsZW1lbnQuaXNPcHRpb25hbCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVkIG5lc3RlZCBlbGVtZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRlbXBsYXRlRWxlbWVudC5nZXROYW1lKCkgKyAiIG1pc3NpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZWQgbmVzdGVkIGVsZW1lbnQgJXMgbWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVFbGVtZW50LmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFN0cmluZyBwcmVzZW50VGV4dCA9CiAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRFbGVtZW50LmdldFdyYXBwZXIoKS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwcmVzZW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXByZXNlbnRUZXh0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICByYy5hZGRUZXh0KG1hY3JvU3VicyhwcmVzZW50VGV4dCwgbG9jYWxBdHRyaWJ1dGVzKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIExpc3Q8VW5rbm93bkVsZW1lbnQ+IGxpc3QgPSBwcmVzZW50RWxlbWVudC5nZXRDaGlsZHJlbigpOwogICAgICAgICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxVbmtub3duRWxlbWVudD4gaSA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IGNoaWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3B5KGkubmV4dCgpLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChVbmtub3duRWxlbWVudCB1bmtub3duRWxlbWVudDIgOiBsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRWxlbWVudCBjaGlsZCA9IGNvcHkodW5rbm93bkVsZW1lbnQyLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJjLmFkZENoaWxkKGNoaWxkLmdldFdyYXBwZXIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQuYWRkQ2hpbGQoY2hpbGQpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNDAsMTQgKzMzNSwxNSBAQAogICAgICAqIGFuZCBjYWxscyBwZXJmb3JtIG9uIHRoZSB1bmtub3duIGVsZW1lbnQuCiAgICAgICoKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotICAgICAgICBwcmVzZW50RWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFVua25vd25FbGVtZW50PigpOworICAgICAgICBwcmVzZW50RWxlbWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGdldE5zRWxlbWVudHMoKTsKICAgICAgICAgcHJvY2Vzc1Rhc2tzKCk7Ci0gICAgICAgIGxvY2FsQXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGNvcHlLZXlzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihtYXAua2V5U2V0KCkpOworICAgICAgICBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gY29weUtleXMgPSBuZXcgSGFzaFNldDw+KG1hcC5rZXlTZXQoKSk7CiAgICAgICAgIGZvciAoQXR0cmlidXRlIGF0dHJpYnV0ZSA6IG1hY3JvRGVmLmdldEF0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gKFN0cmluZykgbWFwLmdldChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG1hcC5nZXQoYXR0cmlidXRlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAiZGVzY3JpcHRpb24iLmVxdWFscyhhdHRyaWJ1dGUuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RGVzY3JpcHRpb24oKTsKICAgICAgICAgICAgIH0KQEAgLTM1NiwyMSArMzUyLDE5IEBACiAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYWNyb1N1YnModmFsdWUsIGxvY2FsQXR0cmlidXRlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGF0dHJpYnV0ZSAiICsgYXR0cmlidXRlLmdldE5hbWUoKSArICIgbm90IHNldCIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicmVxdWlyZWQgYXR0cmlidXRlICVzIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvY2FsQXR0cmlidXRlcy5wdXQoYXR0cmlidXRlLmdldE5hbWUoKSwgdmFsdWUpOwogICAgICAgICAgICAgY29weUtleXMucmVtb3ZlKGF0dHJpYnV0ZS5nZXROYW1lKCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjb3B5S2V5cy5jb250YWlucygiaWQiKSkgewotICAgICAgICAgICAgY29weUtleXMucmVtb3ZlKCJpZCIpOwotICAgICAgICB9CisgICAgICAgIGNvcHlLZXlzLnJlbW92ZSgiaWQiKTsKKwogICAgICAgICBpZiAobWFjcm9EZWYuZ2V0VGV4dCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZGVmYXVsdFRleHQgPSAgbWFjcm9EZWYuZ2V0VGV4dCgpLmdldERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICBpZiAoIW1hY3JvRGVmLmdldFRleHQoKS5nZXRPcHRpb25hbCgpICYmIGRlZmF1bHRUZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIHRleHQgbWlzc2luZyIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlcXVpcmVkIHRleHQgbWlzc2luZyIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0ZXh0ID0gZGVmYXVsdFRleHQgPT0gbnVsbCA/ICIiIDogZGVmYXVsdFRleHQ7CiAgICAgICAgICAgICB9CkBAIC0zNzgsMjQgKzM3MiwyMCBAQAogICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyaW0oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvY2FsQXR0cmlidXRlcy5wdXQobWFjcm9EZWYuZ2V0VGV4dCgpLmdldE5hbWUoKSwgdGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LnRyaW0oKS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIFwiIiArIGdldFRhc2tOYW1lKCkgKyAiXCIgbWFjcm8gZG9lcyBub3Qgc3VwcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIG5lc3RlZCB0ZXh0IGRhdGEuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvcHlLZXlzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIH0gZWxzZSBpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LnRyaW0oKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVW5rbm93biBhdHRyaWJ1dGUiICsgKGNvcHlLZXlzLnNpemUoKSA+IDEgPyAicyAiIDogIiAiKQotICAgICAgICAgICAgICAgICsgY29weUtleXMpOworICAgICAgICAgICAgICAgICJUaGUgXCIlc1wiIG1hY3JvIGRvZXMgbm90IHN1cHBvcnQgbmVzdGVkIHRleHQgZGF0YS4iLAorICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghY29weUtleXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVua25vd24gYXR0cmlidXRlIgorICAgICAgICAgICAgICAgICsgKGNvcHlLZXlzLnNpemUoKSA+IDEgPyAicyAiIDogIiAiKSArIGNvcHlLZXlzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBwcm9qZWN0IG9uIHVua25vd24gZWxlbWVudAogICAgICAgICBVbmtub3duRWxlbWVudCBjID0gY29weShtYWNyb0RlZi5nZXROZXN0ZWRUYXNrKCksIGZhbHNlKTsKICAgICAgICAgYy5pbml0KCk7Ci0gICAgICAgIExvY2FsUHJvcGVydGllcyBsb2NhbFByb3BlcnRpZXMKLSAgICAgICAgICAgID0gTG9jYWxQcm9wZXJ0aWVzLmdldChnZXRQcm9qZWN0KCkpOworICAgICAgICBMb2NhbFByb3BlcnRpZXMgbG9jYWxQcm9wZXJ0aWVzID0gTG9jYWxQcm9wZXJ0aWVzLmdldChnZXRQcm9qZWN0KCkpOwogICAgICAgICBsb2NhbFByb3BlcnRpZXMuZW50ZXJTY29wZSgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYy5wZXJmb3JtKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWtlVXJsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWtlVXJsLmphdmEKaW5kZXggNWMxZTQ0Yy4uNjlhZjA3MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFrZVVybC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CkBAIC00Miw2ICs0MSwxMyBAQAogICovCiAKIHB1YmxpYyBjbGFzcyBNYWtlVXJsIGV4dGVuZHMgVGFzayB7CisgICAgLy8gZXJyb3IgbWVzc2FnZSBzdHJpbmdzCisgICAgLyoqIE1pc3NpbmcgZmlsZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX01JU1NJTkdfRklMRSA9ICJBIHNvdXJjZSBmaWxlIGlzIG1pc3Npbmc6ICI7CisgICAgLyoqIE5vIHByb3BlcnR5IGRlZmluZWQgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19QUk9QRVJUWSA9ICJObyBwcm9wZXJ0eSBkZWZpbmVkIjsKKyAgICAvKiogTm8gZmlsZXMgZGVmaW5lZCAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0ZJTEVTID0gIk5vIGZpbGVzIGRlZmluZWQiOwogCiAgICAgLyoqCiAgICAgICogbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0CkBAIC02MSwyNiArNjcsMTggQEAKICAgICAvKioKICAgICAgKiBmaWxlc2V0cyBvZiBuZXN0ZWQgZmlsZXMgdG8gYWRkIHRvIHRoaXMgdXJsCiAgICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IExpbmtlZExpc3Q8RmlsZVNldD4oKTsKKyAgICBwcml2YXRlIExpc3Q8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBwYXRocyB0byBhZGQKICAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8UGF0aD4gcGF0aHMgPSBuZXcgTGlua2VkTGlzdDxQYXRoPigpOworICAgIHByaXZhdGUgTGlzdDxQYXRoPiBwYXRocyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIHZhbGlkYXRpb24gZmxhZwogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSA9IHRydWU7CiAKLSAgICAvLyBlcnJvciBtZXNzYWdlIHN0cmluZ3MKLSAgICAvKiogTWlzc2luZyBmaWxlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUlTU0lOR19GSUxFID0gIkEgc291cmNlIGZpbGUgaXMgbWlzc2luZzogIjsKLSAgICAvKiogTm8gcHJvcGVydHkgZGVmaW5lZCAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1BST1BFUlRZID0gIk5vIHByb3BlcnR5IGRlZmluZWQiOwotICAgIC8qKiBObyBmaWxlcyBkZWZpbmVkICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fRklMRVMgPSAiTm8gZmlsZXMgZGVmaW5lZCI7Ci0KICAgICAvKioKICAgICAgKiBzZXQgdGhlIG5hbWUgb2YgYSBwcm9wZXJ0eSB0byBmaWxsIHdpdGggdGhlIFVSTAogICAgICAqCkBAIC0xNDksMTMgKzE0NywxMCBAQAogICAgICAgICB9CiAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgdXJscyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIExpc3RJdGVyYXRvcjxGaWxlU2V0PiBsaXN0ID0gZmlsZXNldHMubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgRmlsZVNldCBzZXQgPSBsaXN0Lm5leHQoKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IHNldC5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHNjYW5uZXIuZ2V0QmFzZWRpcigpLCBmaWxlc1tpXSk7CisgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzY2FubmVyLmdldEJhc2VkaXIoKSwgZmlsZSk7CiAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWxlKGYpOwogICAgICAgICAgICAgICAgIFN0cmluZyBhc1VybCA9IHRvVVJMKGYpOwogICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKGFzVXJsKTsKQEAgLTE4MSw5ICsxNzYsOCBAQAogICAgICAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgICAgICB1cmxzLmRlbGV0ZSh1cmxzLmxlbmd0aCgpIC0gc2VwYXJhdG9yLmxlbmd0aCgpLCB1cmxzLmxlbmd0aCgpKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHVybHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CisgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAKIApAQCAtMTk4LDEyICsxOTIsOSBAQAogICAgICAgICB9CiAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgdXJscyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIExpc3RJdGVyYXRvcjxQYXRoPiBsaXN0ID0gcGF0aHMubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChsaXN0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgUGF0aCBwYXRoID0gbGlzdC5uZXh0KCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHBhdGgubGlzdCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGVsZW1lbnRzW2ldKTsKKyAgICAgICAgZm9yIChQYXRoIHBhdGggOiBwYXRocykgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IHBhdGgubGlzdCgpKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWxlKGYpOwogICAgICAgICAgICAgICAgIFN0cmluZyBhc1VybCA9IHRvVVJMKGYpOwogICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKGFzVXJsKTsKQEAgLTIyNCw3ICsyMTUsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZUZpbGUoRmlsZSBmaWxlVG9DaGVjaykgewogICAgICAgICBpZiAodmFsaWRhdGUgJiYgIWZpbGVUb0NoZWNrLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTUlTU0lOR19GSUxFICsgZmlsZVRvQ2hlY2sudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTUlTU0lOR19GSUxFICsgZmlsZVRvQ2hlY2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDMsMjMgKzIzNCwyMyBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZyB1cmw7CiAgICAgICAgIFN0cmluZyBmaWxlc2V0VVJMID0gZmlsZXNldHNUb1VSTCgpOwotICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHVybCA9IGZpbGVzZXRVUkw7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB2YWxpZGF0ZUZpbGUoZmlsZSk7CiAgICAgICAgICAgICB1cmwgPSB0b1VSTChmaWxlKTsKICAgICAgICAgICAgIC8vYW5kIGFkZCBhbnkgZmlsZXMgaWYgYWxzbyBkZWZpbmVkCi0gICAgICAgICAgICBpZiAoZmlsZXNldFVSTC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBzZXBhcmF0b3IgKyBmaWxlc2V0VVJMOworICAgICAgICAgICAgaWYgKCFmaWxlc2V0VVJMLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHVybCArPSBzZXBhcmF0b3IgKyBmaWxlc2V0VVJMOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdXJsID0gZmlsZXNldFVSTDsKICAgICAgICAgfQogICAgICAgICAvL2FkZCBwYXRoIFVSTHMKICAgICAgICAgU3RyaW5nIHBhdGhVUkwgPSBwYXRoc1RvVVJMKCk7Ci0gICAgICAgIGlmIChwYXRoVVJMLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgaWYgKHVybC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBzZXBhcmF0b3IgKyBwYXRoVVJMOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFwYXRoVVJMLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKHVybC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB1cmwgPSBwYXRoVVJMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmwgKz0gc2VwYXJhdG9yICsgcGF0aFVSTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBsb2coIlNldHRpbmcgIiArIHByb3BlcnR5ICsgIiB0byBVUkwgIiArIHVybCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CkBAIC0yODcsMTIgKzI3OCw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmlsZSBjb252ZXJ0ZWQgdG8gYSBVUkwKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyB0b1VSTChGaWxlIGZpbGVUb0NvbnZlcnQpIHsKLSAgICAgICAgU3RyaW5nIHVybDsKICAgICAgICAgLy9jcmVhdGUgdGhlIFVSTAogICAgICAgICAvL2FudCBlcXVpdmFsZW50IG9mICBmaWxlVG9Db252ZXJ0LnRvVVJJKCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotICAgICAgICB1cmwgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkoZmlsZVRvQ29udmVydC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHVybDsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50b1VSSShmaWxlVG9Db252ZXJ0LmdldEFic29sdXRlUGF0aCgpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdC5qYXZhCmluZGV4IDFkYWY1MmYuLjY0MTdhOGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDIyICsyNSwyNSBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogSG9sZHMgdGhlIGRhdGEgb2YgYSBqYXIgbWFuaWZlc3QuCiAgKgogICogTWFuaWZlc3RzIGFyZSBwcm9jZXNzZWQgYWNjb3JkaW5nIHRvIHRoZQotICogPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvamFyL2phci5odG1sIj5KYXIKKyAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9qYXIvamFyLmh0bWwiPkphcgogICogZmlsZSBzcGVjaWZpY2F0aW9uPC9hPi4KICAqIFNwZWNpZmljYWxseSwgYSBtYW5pZmVzdCBlbGVtZW50IGNvbnNpc3RzIG9mCiAgKiBhIHNldCBvZiBhdHRyaWJ1dGVzIGFuZCBzZWN0aW9ucy4gVGhlc2Ugc2VjdGlvbnMgaW4gdHVybiBtYXkgY29udGFpbgpAQCAtODgsOCArOTEsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9GUk9NX0ZPUkJJRERFTiA9ICJNYW5pZmVzdCBhdHRyaWJ1dGVzIHNob3VsZCBub3Qgc3RhcnQgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBcIiIgKyBBVFRSSUJVVEVfRlJPTSArICJcIiBpbiBcIiI7CiAKKyAgICAvKiogQ2hhcnNldCB0byBiZSB1c2VkIGZvciBKQVIgZmlsZXMuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IEpBUl9DSEFSU0VUID0gU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKICAgICAvKiogRW5jb2RpbmcgdG8gYmUgdXNlZCBmb3IgSkFSIGZpbGVzLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FTkNPRElORyA9ICJVVEYtOCI7CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRU5DT0RJTkcgPSBKQVJfQ0hBUlNFVC5uYW1lKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT05fTEMgPQogICAgICAgICBBVFRSSUJVVEVfTUFOSUZFU1RfVkVSU0lPTi50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CkBAIC0xMjcsNyArMTMzLDcgQEAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CiAKICAgICAgICAgLyoqIFRoZSBhdHRyaWJ1dGUncyB2YWx1ZSAqLwotICAgICAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBGb3IgbXVsdGl2YWx1ZWQgYXR0cmlidXRlcywgdGhpcyBpcyB0aGUgaW5kZXggb2YgdGhlIGF0dHJpYnV0ZQpAQCAtMTY4LDE0ICsxNzQsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgICAgICBpbnQgaGFzaENvZGUgPSAwOwotCi0gICAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaGFzaENvZGUgKz0gZ2V0S2V5KCkuaGFzaENvZGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaGFzaENvZGUgKz0gdmFsdWVzLmhhc2hDb2RlKCk7Ci0gICAgICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGdldEtleSgpLCB2YWx1ZXMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xOTYsMTIgKzE5NSw4IEBACiAgICAgICAgICAgICBBdHRyaWJ1dGUgcmhzQXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgcmhzOwogICAgICAgICAgICAgU3RyaW5nIGxoc0tleSA9IGdldEtleSgpOwogICAgICAgICAgICAgU3RyaW5nIHJoc0tleSA9IHJoc0F0dHJpYnV0ZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGlmICgobGhzS2V5ID09IG51bGwgJiYgcmhzS2V5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgIHx8IChsaHNLZXkgIT0gbnVsbCAmJiAhbGhzS2V5LmVxdWFscyhyaHNLZXkpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5lcXVhbHMocmhzQXR0cmlidXRlLnZhbHVlcyk7CisgICAgICAgICAgICByZXR1cm4gKGxoc0tleSAhPSBudWxsIHx8IHJoc0tleSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAmJiAobGhzS2V5ID09IG51bGwgfHwgbGhzS2V5LmVxdWFscyhyaHNLZXkpKSAmJiB2YWx1ZXMuZXF1YWxzKHJoc0F0dHJpYnV0ZS52YWx1ZXMpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yMTYsOCArMjExLDcgQEAKICAgICAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZigiOiAiKTsKICAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbigiTWFuaWZlc3QgbGluZSBcIiIgKyBsaW5lCi0gICAgICAgICAgICAgICAgICAgICsgIlwiIGlzIG5vdCB2YWxpZCBhcyBpdCBkb2VzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICsgImNvbnRhaW4gYSBuYW1lIGFuZCBhIHZhbHVlIHNlcGFyYXRlZCBieSAnOiAnICIpOworICAgICAgICAgICAgICAgICAgICArICJcIiBpcyBub3QgdmFsaWQgYXMgaXQgZG9lcyBub3QgY29udGFpbiBhIG5hbWUgYW5kIGEgdmFsdWUgc2VwYXJhdGVkIGJ5ICc6ICciKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBsaW5lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICBzZXRWYWx1ZShsaW5lLnN1YnN0cmluZyhpbmRleCArIDIpKTsKQEAgLTI0NywxMCArMjQxLDcgQEAKICAgICAgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlJ3Mga2V5LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0gICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CisgICAgICAgICAgICByZXR1cm4gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yNzMsMTYgKzI2NCw4IEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGZ1bGxWYWx1ZSA9ICIiOwotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBnZXRWYWx1ZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZnVsbFZhbHVlICs9IHZhbHVlICsgIiAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZ1bGxWYWx1ZS50cmltKCk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmlzRW1wdHkoKSA/IG51bGwKKyAgICAgICAgICAgICAgICA6IFN0cmluZy5qb2luKCIgIiwgdmFsdWVzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMzE0LDggKzI5Nyw3IEBACiAgICAgICAgICAqIEBwYXJhbSBsaW5lIHRoZSBjb250aW51YXRpb24gbGluZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbnRpbnVhdGlvbihTdHJpbmcgbGluZSkgewotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IHZhbHVlcy5lbGVtZW50QXQoY3VycmVudEluZGV4KTsKLSAgICAgICAgICAgIHNldFZhbHVlKGN1cnJlbnRWYWx1ZSArIGxpbmUuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlcy5lbGVtZW50QXQoY3VycmVudEluZGV4KSArIGxpbmUuc3Vic3RyaW5nKDEpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMzQzLDEyICszMjUsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKFByaW50V3JpdGVyIHdyaXRlciwgYm9vbGVhbiBmbGF0dGVuKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICghZmxhdHRlbikgewotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBnZXRWYWx1ZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICB3cml0ZVZhbHVlKHdyaXRlciwgZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmxhdHRlbikgewogICAgICAgICAgICAgICAgIHdyaXRlVmFsdWUod3JpdGVyLCBnZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVWYWx1ZSh3cml0ZXIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzYyLDggKzM0NCw4IEBACiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVWYWx1ZShQcmludFdyaXRlciB3cml0ZXIsIFN0cmluZyB2YWx1ZSkKICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgaW50IG5hbWVMZW5ndGggPSBuYW1lLmdldEJ5dGVzKEpBUl9FTkNPRElORykubGVuZ3RoOworICAgICAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgICAgICBpbnQgbmFtZUxlbmd0aCA9IG5hbWUuZ2V0Qnl0ZXMoSkFSX0NIQVJTRVQpLmxlbmd0aDsKICAgICAgICAgICAgIGlmIChuYW1lTGVuZ3RoID4gTUFYX05BTUVfVkFMVUVfTEVOR1RIKSB7CiAgICAgICAgICAgICAgICAgaWYgKG5hbWVMZW5ndGggPiBNQVhfTkFNRV9MRU5HVEgpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbWFuaWZlc3QgbGluZSAiCkBAIC0zNzQsMTQgKzM1NiwxNCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsaW5lID0gbmFtZSArICI6ICIgKyB2YWx1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChsaW5lLmdldEJ5dGVzKEpBUl9FTkNPRElORykubGVuZ3RoID4gTUFYX1NFQ1RJT05fTEVOR1RIKSB7CisgICAgICAgICAgICB3aGlsZSAobGluZS5nZXRCeXRlcyhKQVJfQ0hBUlNFVCkubGVuZ3RoID4gTUFYX1NFQ1RJT05fTEVOR1RIKSB7CiAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgYSBNQVhfTElORV9MRU5HVEggYnl0ZSBzZWN0aW9uCiAgICAgICAgICAgICAgICAgaW50IGJyZWFrSW5kZXggPSBNQVhfU0VDVElPTl9MRU5HVEg7CiAgICAgICAgICAgICAgICAgaWYgKGJyZWFrSW5kZXggPj0gbGluZS5sZW5ndGgoKSkgewogICAgICAgICAgICAgICAgICAgICBicmVha0luZGV4ID0gbGluZS5sZW5ndGgoKSAtIDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uID0gbGluZS5zdWJzdHJpbmcoMCwgYnJlYWtJbmRleCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHNlY3Rpb24uZ2V0Qnl0ZXMoSkFSX0VOQ09ESU5HKS5sZW5ndGggPiBNQVhfU0VDVElPTl9MRU5HVEgKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2VjdGlvbi5nZXRCeXRlcyhKQVJfQ0hBUlNFVCkubGVuZ3RoID4gTUFYX1NFQ1RJT05fTEVOR1RICiAgICAgICAgICAgICAgICAgICAgICAmJiBicmVha0luZGV4ID4gMCkgewogICAgICAgICAgICAgICAgICAgICBicmVha0luZGV4LS07CiAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lLnN1YnN0cmluZygwLCBicmVha0luZGV4KTsKQEAgLTQwNCw3ICszODYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdGlvbiB7CiAgICAgICAgIC8qKiBXYXJuaW5ncyBmb3IgdGhpcyBzZWN0aW9uICovCi0gICAgICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gd2FybmluZ3MgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gd2FybmluZ3MgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIHNlY3Rpb24ncyBuYW1lIGlmIGFueS4gVGhlIG1haW4gc2VjdGlvbiBpbiBhCkBAIC00MTMsNyArMzk1LDcgQEAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CiAKICAgICAgICAgLyoqIFRoZSBzZWN0aW9uJ3MgYXR0cmlidXRlcy4qLwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgQXR0cmlidXRlPigpOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHNlY3Rpb247IG9wdGlvbmFsIC1kZWZhdWx0IGlzIHRoZSBtYWluIHNlY3Rpb24uCkBAIC00NTAsMjEgKzQzMiwyMCBAQAogICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IG51bGw7CiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUgPT0gbnVsbCB8fCBsaW5lLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobGluZSA9PSBudWxsIHx8IGxpbmUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT0gJyAnKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBsaW5lCiAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgY29udGludWF0aW9uIG9uIHRoZSBmaXJzdCBsaW5lIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gb2YgdGhlIG5hbWUgLSBjb25jYXRlbmF0ZSB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBhbmQgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICs9IGxpbmUuc3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oIkNhbid0IHN0YXJ0IGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIHdpdGggYSBjb250aW51YXRpb24gbGluZSAiICsgbGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNvbnRpbnVhdGlvbiBvbiB0aGUgZmlyc3QgbGluZSBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51YXRpb24gb2YgdGhlIG5hbWUgLSBjb25jYXRlbmF0ZSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lIGFuZCB0aGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSArPSBsaW5lLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5hZGRDb250aW51YXRpb24obGluZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUwNywyNSArNDg4LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICYmICEobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkKICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHNlY3Rpb24uZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkpKQogICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYW5pZmVzdEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1lcmdlIHNlY3Rpb25zICIKLSAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBkaWZmZXJlbnQgbmFtZXMiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gbWVyZ2Ugc2VjdGlvbnMgd2l0aCBkaWZmZXJlbnQgbmFtZXMiKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGVLZXlzKCk7CiAgICAgICAgICAgICBBdHRyaWJ1dGUgY2xhc3NwYXRoQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBhdHRyaWJ1dGVOYW1lIDogQ29sbGVjdGlvbnMubGlzdChzZWN0aW9uLmdldEF0dHJpYnV0ZUtleXMoKSkpIHsKICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gc2VjdGlvbi5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSSUJVVEVfQ0xBU1NQQVRIKSkgeworICAgICAgICAgICAgICAgIGlmIChBVFRSSUJVVEVfQ0xBU1NQQVRILmVxdWFsc0lnbm9yZUNhc2UoYXR0cmlidXRlTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEF0dHJpYnV0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhBdHRyaWJ1dGUgPSBuZXcgQXR0cmlidXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhBdHRyaWJ1dGUuc2V0TmFtZShBVFRSSUJVVEVfQ0xBU1NQQVRIKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGNwZSA9IGF0dHJpYnV0ZS5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNwZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gY3BlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhBdHRyaWJ1dGUuYWRkVmFsdWUodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmxpc3QoYXR0cmlidXRlLmdldFZhbHVlcygpKS5mb3JFYWNoKGNsYXNzcGF0aEF0dHJpYnV0ZTo6YWRkVmFsdWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXJnZSBmaWxlIGFsd2F5cyB3aW5zCiAgICAgICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CkBAIC01MzYsMjEgKzUxMSwxNCBAQAogICAgICAgICAgICAgICAgIGlmIChtZXJnZUNsYXNzUGF0aHMpIHsKICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlIGN1cnJlbnRDcCA9IGdldEF0dHJpYnV0ZShBVFRSSUJVVEVfQ0xBU1NQQVRIKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gYXR0cmliRW51bSA9IGN1cnJlbnRDcC5nZXRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmliRW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRyaWJFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQXR0cmlidXRlLmFkZFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmxpc3QoY3VycmVudENwLmdldFZhbHVlcygpKS5mb3JFYWNoKGNsYXNzcGF0aEF0dHJpYnV0ZTo6YWRkVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlKGNsYXNzcGF0aEF0dHJpYnV0ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGFkZCBpbiB0aGUgd2FybmluZ3MKLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gd2FybkVudW0gPSBzZWN0aW9uLndhcm5pbmdzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAod2FybkVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICB3YXJuaW5ncy5hZGRFbGVtZW50KHdhcm5FbnVtLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FybmluZ3MuYWRkQWxsKHNlY3Rpb24ud2FybmluZ3MpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01ODIsMTEgKzU1MCw4IEBACiAgICAgICAgICAgICAgICAgQXR0cmlidXRlIG5hbWVBdHRyID0gbmV3IEF0dHJpYnV0ZShBVFRSSUJVVEVfTkFNRSwgbmFtZSk7CiAgICAgICAgICAgICAgICAgbmFtZUF0dHIud3JpdGUod3JpdGVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGdldEF0dHJpYnV0ZUtleXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0QXR0cmlidXRlKGtleSk7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlLndyaXRlKHdyaXRlciwgZmxhdHRlbik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBDb2xsZWN0aW9ucy5saXN0KGdldEF0dHJpYnV0ZUtleXMoKSkpIHsKKyAgICAgICAgICAgICAgICBnZXRBdHRyaWJ1dGUoa2V5KS53cml0ZSh3cml0ZXIsIGZsYXR0ZW4pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgd3JpdGVyLnByaW50KEVPTCk7CiAgICAgICAgIH0KQEAgLTYxMCw3ICs1NzUsNyBAQAogICAgICAgICAgKiAgICAgICAgIGtleSBvZiBhbiBhdHRyaWJ1dGUgb2YgdGhlIHNlY3Rpb24uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRBdHRyaWJ1dGVLZXlzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25VdGlscy5hc0VudW1lcmF0aW9uKGF0dHJpYnV0ZXMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlcy5rZXlTZXQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTYyMywxMCArNTg4LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlLmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlID09IG51bGwgPyBudWxsIDogYXR0cmlidXRlLmdldFZhbHVlKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTY1MCw5ICs2MTIsOCBAQAogICAgICAgICAgICAgIHRocm93cyBNYW5pZmVzdEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBTdHJpbmcgY2hlY2sgPSBhZGRBdHRyaWJ1dGVBbmRDaGVjayhhdHRyaWJ1dGUpOwogICAgICAgICAgICAgaWYgKGNoZWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNwZWNpZnkgdGhlIHNlY3Rpb24gbmFtZSB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICsgInRoZSBcIm5hbWVcIiBhdHRyaWJ1dGUgb2YgdGhlIDxzZWN0aW9uPiBlbGVtZW50IHJhdGhlciAiCi0gICAgICAgICAgICAgICAgICAgICsgInRoYW4gdXNpbmcgYSBcIk5hbWVcIiBtYW5pZmVzdCBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJTcGVjaWZ5IHRoZSBzZWN0aW9uIG5hbWUgdXNpbmcgdGhlIFwibmFtZVwiIGF0dHJpYnV0ZSBvZiB0aGUgPHNlY3Rpb24+IGVsZW1lbnQgcmF0aGVyIHRoYW4gdXNpbmcgYSBcIk5hbWVcIiBtYW5pZmVzdCBhdHRyaWJ1dGUiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02NzQsMTUgKzYzNSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZS5nZXRLZXkoKTsKICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVLZXkuZXF1YWxzKEFUVFJJQlVURV9OQU1FX0xDKSkgewotICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZEVsZW1lbnQoIlwiIiArIEFUVFJJQlVURV9OQU1FICsgIlwiIGF0dHJpYnV0ZXMgIgotICAgICAgICAgICAgICAgICAgICArICJzaG91bGQgbm90IG9jY3VyIGluIHRoZSBtYWluIHNlY3Rpb24gYW5kIG11c3QgYmUgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZmlyc3QgZWxlbWVudCBpbiBhbGwgb3RoZXIgc2VjdGlvbnM6IFwiIgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZCgiXCIiICsgQVRUUklCVVRFX05BTUUKKyAgICAgICAgICAgICAgICAgICAgKyAiXCIgYXR0cmlidXRlcyBzaG91bGQgbm90IG9jY3VyIGluIHRoZSBtYWluIHNlY3Rpb24gYW5kIG11c3QgYmUgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYWxsIG90aGVyIHNlY3Rpb25zOiBcIiIKICAgICAgICAgICAgICAgICAgICAgKyBhdHRyaWJ1dGUuZ2V0TmFtZSgpICsgIjogIiArIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpICsgIlwiIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYXR0cmlidXRlS2V5LnN0YXJ0c1dpdGgoQVRUUklCVVRFX0ZST01fTEMpKSB7Ci0gICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudChFUlJPUl9GUk9NX0ZPUkJJRERFTgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZChFUlJPUl9GUk9NX0ZPUkJJRERFTgogICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZS5nZXROYW1lKCkgKyAiOiAiICsgYXR0cmlidXRlLmdldFZhbHVlKCkgKyAiXCIiKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gY2xhc3NwYXRoIGF0dHJpYnV0ZXMgZ28gaW50byBhIHZlY3RvcgpAQCAtNjkzLDIwICs2NTMsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEF0dHJpYnV0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudCgiTXVsdGlwbGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhcmUgc3VwcG9ydGVkIGJ1dCB2aW9sYXRlIHRoZSBKYXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmljYXRpb24gYW5kIG1heSBub3QgYmUgY29ycmVjdGx5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9jZXNzZWQgaW4gYWxsIGVudmlyb25tZW50cyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gYXR0cmlidXRlLmdldFZhbHVlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NwYXRoQXR0cmlidXRlLmFkZFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgQ2xhc3MtUGF0aCBhdHRyaWJ1dGVzIGFyZSBzdXBwb3J0ZWQgYnV0IHZpb2xhdGUgdGhlIEphciBzcGVjaWZpY2F0aW9uIGFuZCBtYXkgbm90IGJlIGNvcnJlY3RseSBwcm9jZXNzZWQgaW4gYWxsIGVudmlyb25tZW50cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMubGlzdChhdHRyaWJ1dGUuZ2V0VmFsdWVzKCkpLmZvckVhY2goY2xhc3NwYXRoQXR0cmlidXRlOjphZGRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMuY29udGFpbnNLZXkoYXR0cmlidXRlS2V5KSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFuaWZlc3RFeGNlcHRpb24oIlRoZSBhdHRyaWJ1dGUgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZS5nZXROYW1lKCkgKyAiXCIgbWF5IG5vdCBvY2N1ciBtb3JlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYW4gb25jZSBpbiB0aGUgc2FtZSBzZWN0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICArIGF0dHJpYnV0ZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIG1heSBub3Qgb2NjdXIgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgc2VjdGlvbiIpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHN0b3JlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzI0LDEzICs2NzgsOSBAQAogICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICAgICAgU2VjdGlvbiBjbG9uZWQgPSBuZXcgU2VjdGlvbigpOwogICAgICAgICAgICAgY2xvbmVkLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBnZXRBdHRyaWJ1dGVLZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEF0dHJpYnV0ZShrZXkpOwotICAgICAgICAgICAgICAgIGNsb25lZC5zdG9yZUF0dHJpYnV0ZShuZXcgQXR0cmlidXRlKGF0dHJpYnV0ZS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmdldFZhbHVlKCkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmVhbVV0aWxzLmVudW1lcmF0aW9uQXNTdHJlYW0oZ2V0QXR0cmlidXRlS2V5cygpKQorICAgICAgICAgICAgICAgICAgICAubWFwKGtleSAtPiBuZXcgQXR0cmlidXRlKGdldEF0dHJpYnV0ZShrZXkpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXR0cmlidXRlKGtleSkuZ2V0VmFsdWUoKSkpLmZvckVhY2goY2xvbmVkOjpzdG9yZUF0dHJpYnV0ZSk7CiAgICAgICAgICAgICByZXR1cm4gY2xvbmVkOwogICAgICAgICB9CiAKQEAgLTc0Myw4ICs2OTMsNyBAQAogICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZUtleSA9IGF0dHJpYnV0ZS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZUtleSwgYXR0cmlidXRlKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0KGF0dHJpYnV0ZS5nZXRLZXkoKSwgYXR0cmlidXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNzUzLDcgKzcwMiw3IEBACiAgICAgICAgICAqIEByZXR1cm4gYW4gRW51bWVyYXRpb24gb2Ygd2FybmluZyBzdHJpbmdzLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0V2FybmluZ3MoKSB7Ci0gICAgICAgICAgICByZXR1cm4gd2FybmluZ3MuZWxlbWVudHMoKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbih3YXJuaW5ncyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTc5NCw3ICs3NDMsNyBAQAogICAgIHByaXZhdGUgU2VjdGlvbiBtYWluU2VjdGlvbiA9IG5ldyBTZWN0aW9uKCk7CiAKICAgICAvKiogVGhlIG5hbWVkIHNlY3Rpb25zIG9mIHRoaXMgbWFuaWZlc3QgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFNlY3Rpb24+IHNlY3Rpb25zID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTZWN0aW9uPigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU2VjdGlvbj4gc2VjdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBtYW5pZmVzdCBmcm9tIEFudCdzIGRlZmF1bHQgbWFuaWZlc3QgZmlsZS4KQEAgLTgwNCwzOCArNzUzLDI1IEBACiAgICAgICogICAgICAgICAgICBkZWZhdWx0IG1hbmlmZXN0CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBNYW5pZmVzdCBnZXREZWZhdWx0TWFuaWZlc3QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGluc3IgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGRlZk1hbmlmZXN0ID0gIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kZWZhdWx0TWFuaWZlc3QubWYiOwotICAgICAgICAgICAgaW4gPSBNYW5pZmVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGRlZk1hbmlmZXN0KTsKKyAgICAgICAgU3RyaW5nIGRlZk1hbmlmZXN0ID0gIi9vcmcvYXBhY2hlL3Rvb2xzL2FudC9kZWZhdWx0TWFuaWZlc3QubWYiOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gTWFuaWZlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZNYW5pZmVzdCkpIHsKICAgICAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBkZWZhdWx0IG1hbmlmZXN0OiAiCi0gICAgICAgICAgICAgICAgICAgICsgZGVmTWFuaWZlc3QpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgZGVmYXVsdCBtYW5pZmVzdDogJXMiLAorICAgICAgICAgICAgICAgICAgICBkZWZNYW5pZmVzdCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sICJVVEYtOCIpOwotICAgICAgICAgICAgICAgIE1hbmlmZXN0IGRlZmF1bHRNYW5pZmVzdCA9IG5ldyBNYW5pZmVzdChpbnNyKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ydW50aW1lLnZlcnNpb24iKTsKLSAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgY3JlYXRlZEJ5ID0gbmV3IEF0dHJpYnV0ZSgiQ3JlYXRlZC1CeSIsCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24gKyAiICgiCi0gICAgICAgICAgICAgICAgICAgICsgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZtLnZlbmRvciIpICsgIikiKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0TWFuaWZlc3QuZ2V0TWFpblNlY3Rpb24oKS5zdG9yZUF0dHJpYnV0ZShjcmVhdGVkQnkpOwotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0TWFuaWZlc3Q7Ci0gICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBpbnNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hbmlmZXN0KGluc3IpOworICAgICAgICAgICAgTWFuaWZlc3QgZGVmYXVsdE1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgSkFSX0NIQVJTRVQpKTsKKyAgICAgICAgICAgIFN0cmluZyB2ZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnJ1bnRpbWUudmVyc2lvbiIpOworICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0udmVyc2lvbiIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQXR0cmlidXRlIGNyZWF0ZWRCeSA9IG5ldyBBdHRyaWJ1dGUoIkNyZWF0ZWQtQnkiLCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICsgIiAoIiArIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS52ZW5kb3IiKSArICIpIik7CisgICAgICAgICAgICBkZWZhdWx0TWFuaWZlc3QuZ2V0TWFpblNlY3Rpb24oKS5zdG9yZUF0dHJpYnV0ZShjcmVhdGVkQnkpOworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRNYW5pZmVzdDsKICAgICAgICAgfSBjYXRjaCAoTWFuaWZlc3RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZWZhdWx0IG1hbmlmZXN0IGlzIGludmFsaWQgISEiLCBlKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBkZWZhdWx0IG1hbmlmZXN0IiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW5zcik7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwogICAgICAgICB9CiAgICAgfQogCkBAIC04NjQsMjAgKzgwMCwyMCBAQAogICAgICAgICAgICAgbWFpblNlY3Rpb24ucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9NQU5JRkVTVF9WRVJTSU9OKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZyBsaW5lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGxpbmU7CiAgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGluZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgU2VjdGlvbiBzZWN0aW9uID0gbmV3IFNlY3Rpb24oKTsKICAgICAgICAgICAgIGlmIChuZXh0U2VjdGlvbk5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBzZWN0aW9uTmFtZSA9IG5ldyBBdHRyaWJ1dGUobGluZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzZWN0aW9uTmFtZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShBVFRSSUJVVEVfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKCJNYW5pZmVzdCBzZWN0aW9ucyBzaG91bGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3RhcnQgd2l0aCBhIFwiIiArIEFUVFJJQlVURV9OQU1FCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcIiBhdHRyaWJ1dGUgYW5kIG5vdCBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgc2VjdGlvbk5hbWUuZ2V0TmFtZSgpICsgIlwiIik7CisgICAgICAgICAgICAgICAgaWYgKCFBVFRSSUJVVEVfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHNlY3Rpb25OYW1lLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hbmlmZXN0RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIk1hbmlmZXN0IHNlY3Rpb25zIHNob3VsZCBzdGFydCB3aXRoIGEgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBBVFRSSUJVVEVfTkFNRSArICJcIiBhdHRyaWJ1dGUgYW5kIG5vdCBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlY3Rpb25OYW1lLmdldE5hbWUoKSArICJcIiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbk5hbWUgPSBzZWN0aW9uTmFtZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTkyMiw3ICs4NTgsNyBAQAogICAgICAgICBpZiAoYXR0cmlidXRlLmdldEtleSgpID09IG51bGwgfHwgYXR0cmlidXRlLmdldFZhbHVlKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdHRyaWJ1dGVzIG11c3QgaGF2ZSBuYW1lIGFuZCB2YWx1ZSIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhdHRyaWJ1dGUuZ2V0S2V5KCkuZXF1YWxzKEFUVFJJQlVURV9NQU5JRkVTVF9WRVJTSU9OX0xDKSkgeworICAgICAgICBpZiAoQVRUUklCVVRFX01BTklGRVNUX1ZFUlNJT05fTEMuZXF1YWxzKGF0dHJpYnV0ZS5nZXRLZXkoKSkpIHsKICAgICAgICAgICAgIG1hbmlmZXN0VmVyc2lvbiA9IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWFpblNlY3Rpb24uYWRkQ29uZmlndXJlZEF0dHJpYnV0ZShhdHRyaWJ1dGUpOwpAQCAtOTg2LDEyICs5MjIsOSBAQAogICAgICAgICAgICAgICAgICBtYW5pZmVzdFZlcnNpb24gPSBvdGhlci5tYW5pZmVzdFZlcnNpb247CiAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gb3RoZXIuZ2V0U2VjdGlvbk5hbWVzKCk7Ci0gICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNlY3Rpb25OYW1lIDogQ29sbGVjdGlvbnMubGlzdChvdGhlci5nZXRTZWN0aW9uTmFtZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgU2VjdGlvbiBvdXJTZWN0aW9uID0gc2VjdGlvbnMuZ2V0KHNlY3Rpb25OYW1lKTsKLSAgICAgICAgICAgICAgICAgU2VjdGlvbiBvdGhlclNlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgPSBvdGhlci5zZWN0aW9ucy5nZXQoc2VjdGlvbk5hbWUpOworICAgICAgICAgICAgICAgICBTZWN0aW9uIG90aGVyU2VjdGlvbiA9IG90aGVyLnNlY3Rpb25zLmdldChzZWN0aW9uTmFtZSk7CiAgICAgICAgICAgICAgICAgIGlmIChvdXJTZWN0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlclNlY3Rpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvbmZpZ3VyZWRTZWN0aW9uKChTZWN0aW9uKSBvdGhlclNlY3Rpb24uY2xvbmUoKSk7CkBAIC0xMDc3LDIyICsxMDEwLDE0IEBACiAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB3YXJuaW5nIHN0cmluZ3MKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXRXYXJuaW5ncygpIHsKLSAgICAgICAgVmVjdG9yPFN0cmluZz4gd2FybmluZ3MgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgLy8gY3JlYXRlIGEgdmVjdG9yIGFuZCBhZGQgaW4gdGhlIHdhcm5pbmdzIGZvciB0aGUgbWFpbiBzZWN0aW9uCisgICAgICAgIExpc3Q8U3RyaW5nPiB3YXJuaW5ncyA9IENvbGxlY3Rpb25zLmxpc3QobWFpblNlY3Rpb24uZ2V0V2FybmluZ3MoKSk7CiAKLSAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiB3YXJuRW51bSA9IG1haW5TZWN0aW9uLmdldFdhcm5pbmdzKCk7Ci0gICAgICAgIHdoaWxlICh3YXJuRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgd2FybmluZ3MuYWRkRWxlbWVudCh3YXJuRW51bS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQorICAgICAgICAvLyBhZGQgaW4gdGhlIHdhcm5pbmdzIGZvciBhbGwgdGhlIHNlY3Rpb25zCisgICAgICAgIHNlY3Rpb25zLnZhbHVlcygpLnN0cmVhbSgpLm1hcChzZWN0aW9uIC0+IENvbGxlY3Rpb25zLmxpc3Qoc2VjdGlvbi5nZXRXYXJuaW5ncygpKSkKKyAgICAgICAgICAgICAgICAuZm9yRWFjaCh3YXJuaW5nczo6YWRkQWxsKTsKIAotICAgICAgICAvLyBjcmVhdGUgYSB2ZWN0b3IgYW5kIGFkZCBpbiB0aGUgd2FybmluZ3MgZm9yIGFsbCB0aGUgc2VjdGlvbnMKLSAgICAgICAgZm9yIChTZWN0aW9uIHNlY3Rpb24gOiBzZWN0aW9ucy52YWx1ZXMoKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlMiA9IHNlY3Rpb24uZ2V0V2FybmluZ3MoKTsKLSAgICAgICAgICAgIHdoaWxlIChlMi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFkZEVsZW1lbnQoZTIubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gd2FybmluZ3MuZWxlbWVudHMoKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHdhcm5pbmdzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMzYsMTEgKzEwNjEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtYWluU2VjdGlvbi5lcXVhbHMocmhzTWFuaWZlc3QubWFpblNlY3Rpb24pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1haW5TZWN0aW9uLmVxdWFscyhyaHNNYW5pZmVzdC5tYWluU2VjdGlvbikgJiYgc2VjdGlvbnMuZXF1YWxzKHJoc01hbmlmZXN0LnNlY3Rpb25zKTsKIAotICAgICAgICByZXR1cm4gc2VjdGlvbnMuZXF1YWxzKHJoc01hbmlmZXN0LnNlY3Rpb25zKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNzgsNiArMTEwMCw2IEBACiAgICAgICogQHJldHVybiBhbiBFbnVtZXJhdGlvbiBvZiBzZWN0aW9uIG5hbWVzCiAgICAgICovCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0U2VjdGlvbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvblV0aWxzLmFzRW51bWVyYXRpb24oc2VjdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihzZWN0aW9ucy5rZXlTZXQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGguamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0Q2xhc3NQYXRoLmphdmEKaW5kZXggNGE0ZjIzMS4uYTE3MTBiZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdENsYXNzUGF0aC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwpAQCAtNTIsNiArNTEsNyBAQAogICAgICAqIHNlcGFyYXRlZCBsaXN0IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyByZWxhdGl2ZSB0byB0aGUgamFyCiAgICAgICogZmlsZSdzIHBhcmVudCBkaXJlY3RvcnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nICdwcm9wZXJ0eScgYXR0cmlidXRlISIpOwpAQCAtNjAsMTMgKzYwLDEzIEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgJ2phcmZpbGUnIGF0dHJpYnV0ZSEiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KG5hbWUpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvcGVydHkgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBzZXQhIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5ICclcycgYWxyZWFkeSBzZXQhIiwgbmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIG5lc3RlZCA8Y2xhc3NwYXRoPiEiKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZ0J1ZmZlciB0b29Mb25nU2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgdG9vTG9uZ1NiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhQYXJlbnRMZXZlbHMgKyAxOyBpKyspIHsKICAgICAgICAgICAgIHRvb0xvbmdTYi5hcHBlbmQoIi4uLyIpOwogICAgICAgICB9CkBAIC03NiwxMSArNzYsMTAgQEAKICAgICAgICAgZmluYWwgRmlsZVV0aWxzIGZpbGVVdGlscyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKICAgICAgICAgZGlyID0gZmlsZVV0aWxzLm5vcm1hbGl6ZShkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCi0gICAgICAgIFN0cmluZ1tdIGVsZW1lbnRzID0gcGF0aC5saXN0KCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogcGF0aC5saXN0KCkpIHsKICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgY3VycmVudCBmaWxlCi0gICAgICAgICAgICBGaWxlIHBhdGhFbnRyeSA9IG5ldyBGaWxlKGVsZW1lbnRzW2ldKTsKKyAgICAgICAgICAgIEZpbGUgcGF0aEVudHJ5ID0gbmV3IEZpbGUoZWxlbWVudCk7CiAgICAgICAgICAgICBTdHJpbmcgZnVsbFBhdGggPSBwYXRoRW50cnkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICBwYXRoRW50cnkgPSBmaWxlVXRpbHMubm9ybWFsaXplKGZ1bGxQYXRoKTsKIApAQCAtMTA4LDE4ICsxMDcsMTUgQEAKICAgICAgICAgICAgIC8vIE5vIG1hdGNoLCBzbyBiYWlsIG91dCEKICAgICAgICAgICAgIGlmIChyZWxQYXRoLmVxdWFscyhjYW5vbmljYWxQYXRoKQogICAgICAgICAgICAgICAgIHx8IHJlbFBhdGguc3RhcnRzV2l0aCh0b29Mb25nUHJlZml4KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gc3VpdGFibGUgcmVsYXRpdmUgcGF0aCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkaXIgKyAiIHRvICIgKyBmdWxsUGF0aCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm8gc3VpdGFibGUgcmVsYXRpdmUgcGF0aCBmcm9tICVzIHRvICVzIiwgZGlyLCBmdWxsUGF0aCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChwYXRoRW50cnkuaXNEaXJlY3RvcnkoKSAmJiAhcmVsUGF0aC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgcmVsUGF0aCA9IHJlbFBhdGggKyAnLyc7CisgICAgICAgICAgICAgICAgcmVsUGF0aCArPSAnLyc7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJlbFBhdGggPSBMb2NhdG9yLmVuY29kZVVSSShyZWxQYXRoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhjKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Yyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZWxQYXRoID0gTG9jYXRvci5lbmNvZGVVUkkocmVsUGF0aCk7CisKICAgICAgICAgICAgIC8vIE1hbmlmZXN0J3MgQ2xhc3NQYXRoOiBhdHRyaWJ1dGUgYWx3YXlzIHVzZXMgZm9yd2FyZAogICAgICAgICAgICAgLy8gc2xhc2hlcyAnLycsIGFuZCBpcyBzcGFjZS1zZXBhcmF0ZWQuIEFudCB3aWxsIHByb3Blcmx5CiAgICAgICAgICAgICAvLyBmb3JtYXQgaXQgb24gNzIgY29sdW1ucyB3aXRoIHByb3BlciBsaW5lIGNvbnRpbnVhdGlvbgpAQCAtMTQ5LDcgKzE0NSw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0SmFyRmlsZShGaWxlIGphcmZpbGUpIHsKICAgICAgICAgRmlsZSBwYXJlbnQgPSBqYXJmaWxlLmdldFBhcmVudEZpbGUoKTsKICAgICAgICAgaWYgKCFwYXJlbnQuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJKYXIncyBkaXJlY3Rvcnkgbm90IGZvdW5kOiAiICsgcGFyZW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSmFyJ3MgZGlyZWN0b3J5IG5vdCBmb3VuZDogJXMiLCBwYXJlbnQpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuZGlyID0gcGFyZW50OwogICAgIH0KQEAgLTE2Miw4ICsxNTgsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1heFBhcmVudExldmVscyhpbnQgbGV2ZWxzKSB7CiAgICAgICAgIGlmIChsZXZlbHMgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm1heFBhcmVudExldmVscyBtdXN0IG5vdCBiZSBhIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBudW1iZXIiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAibWF4UGFyZW50TGV2ZWxzIG11c3Qgbm90IGJlIGEgbmVnYXRpdmUgbnVtYmVyIik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5tYXhQYXJlbnRMZXZlbHMgPSBsZXZlbHM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RFeGNlcHRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0RXhjZXB0aW9uLmphdmEKaW5kZXggYzRlNzIxMy4uYzkyMDc0ZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdEV4Y2VwdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRhc2suamF2YQppbmRleCBmZjY5NjFiLi4yMzQ1YjMxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDIwICsxOSwxOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLk1hbmlmZXN0LkF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogQ3JlYXRlcyBhIG1hbmlmZXN0IGZpbGUgZm9yIGluY2x1c2lvbiBpbiBhIEpBUiwgQW50IHRhc2sgd3JhcHBlcgpAQCAtOTEsNiArODksNyBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIGEgU3RyaW5nIGFycmF5IG9mIHRoZSBhbGxvd2VkIHZhbHVlcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InVwZGF0ZSIsICJyZXBsYWNlIn07CiAgICAgICAgIH0KQEAgLTExMywxMiArMTEyLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2VjdGlvbihNYW5pZmVzdC5TZWN0aW9uIHNlY3Rpb24pCiAgICAgICAgICB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24gewotICAgICAgICBFbnVtZXJhdGlvbjxTdHJpbmc+IGF0dHJpYnV0ZUtleXMgPSBzZWN0aW9uLmdldEF0dHJpYnV0ZUtleXMoKTsKLSAgICAgICAgd2hpbGUgKGF0dHJpYnV0ZUtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzZWN0aW9uLmdldEF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVLZXlzLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgY2hlY2tBdHRyaWJ1dGUoYXR0cmlidXRlKTsKLSAgICAgICAgfQorICAgICAgICBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKHNlY3Rpb24uZ2V0QXR0cmlidXRlS2V5cygpKQorICAgICAgICAgICAgICAgIC5tYXAoc2VjdGlvbjo6Z2V0QXR0cmlidXRlKS5mb3JFYWNoKHRoaXM6OmNoZWNrQXR0cmlidXRlKTsKICAgICAgICAgbmVzdGVkTWFuaWZlc3QuYWRkQ29uZmlndXJlZFNlY3Rpb24oc2VjdGlvbik7CiAgICAgfQogCkBAIC0xNDMsNyArMTM4LDcgQEAKICAgICAgKiAgIGFscGhhbnVtOiAgIHtBLVp9IHwge2Eten0gfCB7MC05fQogICAgICAqICAgaGVhZGVyY2hhcjogYWxwaGFudW0gfCAtIHwgXwogICAgICAqIDwvcHJlPgotICAgICAqIFNvIHRoZSByZXN1bHRpbmcgcmVnZXhwIHdvdWxkIGJlIDx0dD5bQS1aYS16MC05XVtBLVphLXowLTktX10qPC90dD4uCisgICAgICogU28gdGhlIHJlc3VsdGluZyByZWdleHAgd291bGQgYmUgPGNvZGU+W0EtWmEtejAtOV1bQS1aYS16MC05LV9dKjwvY29kZT4uCiAgICAgICoKICAgICAgKiBCZWNhdXNlIG9mIEpESyAxLjIgY29tcGxpYW5jZSBhbmQgdGhlIHBvc3NpYmxlIGFic2VuY2Ugb2YgYQogICAgICAqIHJlZ2V4cCBtYXRjaGVyIHdlIGNhbiBub3QgdXNlIHJlZ2V4cHMgaGVyZS4gSW5zdGVhZCB3ZSBoYXZlIHRvCkBAIC0xNTcsMTMgKzE1MiwxNSBAQAogICAgICAgICBjaGFyIGNoID0gbmFtZS5jaGFyQXQoMCk7CiAKICAgICAgICAgaWYgKGNoID09ICctJyB8fCBjaCA9PSAnXycpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IHN0YXJ0IHdpdGggJyIgKyBjaCArICInLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCAnJWMnLiIsIGNoKTsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICBjaCA9IG5hbWUuY2hhckF0KGkpOwogICAgICAgICAgICAgaWYgKFZBTElEX0FUVFJJQlVURV9DSEFSUy5pbmRleE9mKGNoKSA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1hbmlmZXN0IGF0dHJpYnV0ZSBuYW1lcyBtdXN0IG5vdCBjb250YWluICciICsgY2ggKyAiJyIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1hbmlmZXN0IGF0dHJpYnV0ZSBuYW1lcyBtdXN0IG5vdCBjb250YWluICclYyciLCBjaCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTksNiArMjE2LDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIG1hbmlmZXN0IGNhbm5vdCBiZSB3cml0dGVuLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobWFuaWZlc3RGaWxlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIGZpbGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7CkBAIC0yMjksMTUgKzIyNyw5IEBACiAgICAgICAgIEJ1aWxkRXhjZXB0aW9uIGVycm9yID0gbnVsbDsKIAogICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3RGaWxlKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCAiVVRGLTgiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBlbmNvZGluZyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nID09IG51bGwgPyAiVVRGLTgiIDogZW5jb2RpbmcpOworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCisgICAgICAgICAgICAgICAgRmlsZXMubmV3SW5wdXRTdHJlYW0obWFuaWZlc3RGaWxlLnRvUGF0aCgpKSwgY2hhcnNldCkpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV3IE1hbmlmZXN0KGlzcik7CiAgICAgICAgICAgICB9IGNhdGNoIChNYW5pZmVzdEV4Y2VwdGlvbiBtKSB7CiAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQnVpbGRFeGNlcHRpb24oIkV4aXN0aW5nIG1hbmlmZXN0ICIgKyBtYW5pZmVzdEZpbGUKQEAgLTI0NSwxOSArMjM3LDE0IEBACiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byByZWFkICIgKyBtYW5pZmVzdEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpc3IpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy9sb29rIGZvciBhbmQgcHJpbnQgd2FybmluZ3MKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSBuZXN0ZWRNYW5pZmVzdC5nZXRXYXJuaW5ncygpOwotICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBsb2coIk1hbmlmZXN0IHdhcm5pbmc6ICIgKyBlLm5leHRFbGVtZW50KCksCi0gICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICB9CisgICAgICAgIC8vIGxvb2sgZm9yIGFuZCBwcmludCB3YXJuaW5ncworICAgICAgICBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKG5lc3RlZE1hbmlmZXN0LmdldFdhcm5pbmdzKCkpCisgICAgICAgICAgICAgICAgLmZvckVhY2goZSAtPiBsb2coIk1hbmlmZXN0IHdhcm5pbmc6ICIgKyBlLCBQcm9qZWN0Lk1TR19XQVJOKSk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobW9kZS5nZXRWYWx1ZSgpLmVxdWFscygidXBkYXRlIikgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICBpZiAoInVwZGF0ZSIuZXF1YWxzKG1vZGUuZ2V0VmFsdWUoKSkgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0b1dyaXRlLm1lcmdlKGN1cnJlbnQsIGZhbHNlLCBtZXJnZUNsYXNzUGF0aHMpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyb3IgIT0gbnVsbCkgewpAQCAtMjc2LDExICsyNjMsOCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgUHJpbnRXcml0ZXIgdyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsIE1hbmlmZXN0LkpBUl9FTkNPRElORyk7Ci0gICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKG9zdyk7CisgICAgICAgIHRyeSAoUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorICAgICAgICAgICAgRmlsZXMubmV3T3V0cHV0U3RyZWFtKG1hbmlmZXN0RmlsZS50b1BhdGgoKSksIE1hbmlmZXN0LkpBUl9DSEFSU0VUKSkpIHsKICAgICAgICAgICAgIHRvV3JpdGUud3JpdGUodywgZmxhdHRlbkNsYXNzUGF0aHMpOwogICAgICAgICAgICAgaWYgKHcuY2hlY2tFcnJvcigpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFbmNvdW50ZXJlZCBhbiBlcnJvciB3cml0aW5nIG1hbmlmZXN0Iik7CkBAIC0yODgsOCArMjcyLDYgQEAKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gd3JpdGUgIiArIG1hbmlmZXN0RmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hdGNoaW5nVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWF0Y2hpbmdUYXNrLmphdmEKaW5kZXggODcwN2EzOS4uMDYzYjcyMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWF0Y2hpbmdUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWF0Y2hpbmdUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02Miw2ICs2Miw3IEBACiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgIHN1cGVyLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIGZpbGVzZXQuc2V0UHJvamVjdChwcm9qZWN0KTsKQEAgLTEyOCwxNCArMTI5LDE0IEBACiAgICAgcHVibGljIHZvaWQgWHNldEl0ZW1zKFN0cmluZyBpdGVtU3RyaW5nKSB7CiAgICAgICAgIGxvZygiVGhlIGl0ZW1zIGF0dHJpYnV0ZSBpcyBkZXByZWNhdGVkLiAiCiAgICAgICAgICAgICArICJQbGVhc2UgdXNlIHRoZSBpbmNsdWRlcyBhdHRyaWJ1dGUuIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIGlmIChpdGVtU3RyaW5nID09IG51bGwgfHwgaXRlbVN0cmluZy5lcXVhbHMoIioiKQotICAgICAgICAgICAgfHwgaXRlbVN0cmluZy5lcXVhbHMoIi4iKSkgeworICAgICAgICBpZiAoaXRlbVN0cmluZyA9PSBudWxsIHx8ICIqIi5lcXVhbHMoaXRlbVN0cmluZykKKyAgICAgICAgICAgIHx8ICIuIi5lcXVhbHMoaXRlbVN0cmluZykpIHsKICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKCIqKiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaXRlbVN0cmluZywgIiwgIik7CiAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewogICAgICAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gdG9rLm5leHRUb2tlbigpLnRyaW0oKTsKLSAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBhdHRlcm4uaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUluY2x1ZGUoKS5zZXROYW1lKHBhdHRlcm4gKyAiLyoqIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTYxLDcgKzE2Miw3IEBACiAgICAgcHVibGljIHZvaWQgWHNldElnbm9yZShTdHJpbmcgaWdub3JlU3RyaW5nKSB7CiAgICAgICAgIGxvZygiVGhlIGlnbm9yZSBhdHRyaWJ1dGUgaXMgZGVwcmVjYXRlZC4iCiAgICAgICAgICAgICArICJQbGVhc2UgdXNlIHRoZSBleGNsdWRlcyBhdHRyaWJ1dGUuIiwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIGlmIChpZ25vcmVTdHJpbmcgIT0gbnVsbCAmJiBpZ25vcmVTdHJpbmcubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmIChpZ25vcmVTdHJpbmcgIT0gbnVsbCAmJiAhaWdub3JlU3RyaW5nLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaWdub3JlU3RyaW5nLCAiLCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKQEAgLTIzNyw2ICsyMzgsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB3aGV0aGVyIGFueSBzZWxlY3RvcnMgYXJlIGluIHRoaXMgY29udGFpbmVyCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzU2VsZWN0b3JzKCkgewogICAgICAgICByZXR1cm4gZmlsZXNldC5oYXNTZWxlY3RvcnMoKTsKICAgICB9CkBAIC0yNDYsNiArMjQ4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgaW4gdGhpcyBjb250YWluZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNlbGVjdG9yQ291bnQoKSB7CiAgICAgICAgIHJldHVybiBmaWxlc2V0LnNlbGVjdG9yQ291bnQoKTsKICAgICB9CkBAIC0yNTUsNiArMjU4LDcgQEAKICAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0CiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBzZWxlY3RvcnMgaW4gdGhpcyBjb250YWluZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZVNlbGVjdG9yW10gZ2V0U2VsZWN0b3JzKFByb2plY3QgcCkgewogICAgICAgICByZXR1cm4gZmlsZXNldC5nZXRTZWxlY3RvcnMocCk7CiAgICAgfQpAQCAtMjY0LDYgKzI2OCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0b3IgdGhhdCBnb2VzIHRocm91Z2ggZWFjaCBvZiB0aGUgc2VsZWN0b3JzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEZpbGVTZWxlY3Rvcj4gc2VsZWN0b3JFbGVtZW50cygpIHsKICAgICAgICAgcmV0dXJuIGZpbGVzZXQuc2VsZWN0b3JFbGVtZW50cygpOwogICAgIH0KQEAgLTI3Myw2ICsyNzgsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBuZXcgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYXBwZW5kU2VsZWN0b3IoRmlsZVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGZpbGVzZXQuYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTI4Myw2ICsyODksNyBAQAogICAgICAqIGFkZCBhICJTZWxlY3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3RvcihTZWxlY3RTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC0yOTEsNiArMjk4LDcgQEAKICAgICAgKiBhZGQgYW4gIkFuZCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEFuZChBbmRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZEFuZChzZWxlY3Rvcik7CiAgICAgfQpAQCAtMjk5LDYgKzMwNyw3IEBACiAgICAgICogYWRkIGFuICJPciIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGRPcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtMzA3LDYgKzMxNiw3IEBACiAgICAgICogYWRkIGEgIk5vdCIgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZE5vdChOb3RTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZE5vdChzZWxlY3Rvcik7CiAgICAgfQpAQCAtMzE1LDYgKzMyNSw3IEBACiAgICAgICogYWRkIGEgIk5vbmUiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGROb25lKE5vbmVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZE5vbmUoc2VsZWN0b3IpOwogICAgIH0KQEAgLTMyMyw2ICszMzQsNyBAQAogICAgICAqIGFkZCBhIG1ham9yaXR5IHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGZpbGVzZXQuYWRkTWFqb3JpdHkoc2VsZWN0b3IpOwogICAgIH0KQEAgLTMzMSw2ICszNDMsNyBAQAogICAgICAqIGFkZCBhIHNlbGVjdG9yIGRhdGUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZERhdGUoRGF0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGZpbGVzZXQuYWRkRGF0ZShzZWxlY3Rvcik7CiAgICAgfQpAQCAtMzM5LDYgKzM1Miw3IEBACiAgICAgICogYWRkIGEgc2VsZWN0b3Igc2l6ZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkU2l6ZShTaXplU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGRTaXplKHNlbGVjdG9yKTsKICAgICB9CkBAIC0zNDcsNiArMzYxLDcgQEAKICAgICAgKiBhZGQgYSBzZWxlY3RvciBmaWxlbmFtZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmlsZW5hbWUoRmlsZW5hbWVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZEZpbGVuYW1lKHNlbGVjdG9yKTsKICAgICB9CkBAIC0zNTUsNiArMzcwLDcgQEAKICAgICAgKiBhZGQgYW4gZXh0ZW5kZWQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbShFeHRlbmRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZEN1c3RvbShzZWxlY3Rvcik7CiAgICAgfQpAQCAtMzYzLDYgKzM3OSw3IEBACiAgICAgICogYWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZENvbnRhaW5zKENvbnRhaW5zU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGRDb250YWlucyhzZWxlY3Rvcik7CiAgICAgfQpAQCAtMzcxLDYgKzM4OCw3IEBACiAgICAgICogYWRkIGEgcHJlc2VudCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkUHJlc2VudChQcmVzZW50U2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGRQcmVzZW50KHNlbGVjdG9yKTsKICAgICB9CkBAIC0zNzksNiArMzk3LDcgQEAKICAgICAgKiBhZGQgYSBkZXB0aCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRGVwdGgoRGVwdGhTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZERlcHRoKHNlbGVjdG9yKTsKICAgICB9CkBAIC0zODcsNiArNDA2LDcgQEAKICAgICAgKiBhZGQgYSBkZXBlbmRzIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0CiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBhZGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmQoRGVwZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGREZXBlbmQoc2VsZWN0b3IpOwogICAgIH0KQEAgLTM5NSw2ICs0MTUsNyBAQAogICAgICAqIGFkZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gYWRkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnNSZWdleHAoQ29udGFpbnNSZWdleHBTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZENvbnRhaW5zUmVnZXhwKHNlbGVjdG9yKTsKICAgICB9CkBAIC00MDQsNiArNDI1LDcgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRGlmZmVyZW50KERpZmZlcmVudFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGZpbGVzZXQuYWRkRGlmZmVyZW50KHNlbGVjdG9yKTsKICAgICB9CkBAIC00MTMsNiArNDM1LDcgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkVHlwZShUeXBlU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgZmlsZXNldC5hZGRUeXBlKHNlbGVjdG9yKTsKICAgICB9CkBAIC00MjIsNiArNDQ1LDcgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkTW9kaWZpZWQoTW9kaWZpZWRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZE1vZGlmaWVkKHNlbGVjdG9yKTsKICAgICB9CkBAIC00MzEsNiArNDU1LDcgQEAKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBmaWxlc2V0LmFkZChzZWxlY3Rvcik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyLmphdmEKaW5kZXggNzFiNmM5NC4uYTY5MDUwZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2Rpci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDYsMjkgKzQ2LDMwIEBACiAgICAgICogY3JlYXRlIHRoZSBkaXJlY3RvcnkgYW5kIGFsbCBwYXJlbnRzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBkaXIgaXMgc29tZWhvdyBpbnZhbGlkLCBvciBjcmVhdGlvbiBmYWlsZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkaXIgYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGlyLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGFzIGEgZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWxyZWFkeSBleGlzdHMgd2l0aCB0aGF0IG5hbWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgZGlyZWN0b3J5IGFzIGEgZmlsZSBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoYXQgbmFtZTogJXMiLAorICAgICAgICAgICAgICAgIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIWRpci5leGlzdHMoKSkgewogICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBta2RpcnMoZGlyKTsKICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgaWYgKGRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIkEgZGlmZmVyZW50IHByb2Nlc3Mgb3IgdGFzayBoYXMgYWxyZWFkeSBjcmVhdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImRpciAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGxvZygiQSBkaWZmZXJlbnQgcHJvY2VzcyBvciB0YXNrIGhhcyBhbHJlYWR5IGNyZWF0ZWQgZGlyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkRpcmVjdG9yeSAiICsgZGlyLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiBjcmVhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGFuIHVua25vd24gcmVhc29uIjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJEaXJlY3RvcnkgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNyZWF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYW4gdW5rbm93biByZWFzb24iLAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvZygiQ3JlYXRlZCBkaXI6ICIgKyBkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTExLDQgKzExMiwzIEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZS5qYXZhCmluZGV4IDAxNDljYzguLjdkYWRjMWIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01vdmUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Nb3ZlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMjcsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsdGVyU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247CiAKIC8qKgpAQCAtODEsNiArNzksNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICBpZiAoKGRlc3RGaWxlICE9IG51bGwgJiYgZGVzdERpciAhPSBudWxsKQpAQCAtMTA0LDEyICsxMDMsMTMgQEAKICAgICAvKioKICAgICAgKiBPdmVycmlkZSBjb3B5J3MgZG9GaWxlT3BlcmF0aW9ucyB0byBtb3ZlIHRoZSBmaWxlcyBpbnN0ZWFkIG9mIGNvcHlpbmcgdGhlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkb0ZpbGVPcGVyYXRpb25zKCkgewogICAgICAgICAvL0F0dGVtcHQgY29tcGxldGUgZGlyZWN0b3J5IHJlbmFtZXMsIGlmIGFueSwgZmlyc3QuCiAgICAgICAgIGlmIChjb21wbGV0ZURpck1hcC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZyb21EaXJzID0gY29tcGxldGVEaXJNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgZnJvbURpcnMuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIEZpbGUgZnJvbURpciA9IChGaWxlKSBmcm9tRGlycy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgRmlsZSB0b0RpciA9IChGaWxlKSBjb21wbGV0ZURpck1hcC5nZXQoZnJvbURpcik7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWxlLCBGaWxlPiBlbnRyeSA6IGNvbXBsZXRlRGlyTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZyb21EaXIgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBGaWxlIHRvRGlyID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlbmFtZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBsb2coIkF0dGVtcHRpbmcgdG8gcmVuYW1lIGRpcjogIiArIGZyb21EaXIgKyAiIHRvICIgKyB0b0RpciwgdmVyYm9zaXR5KTsKQEAgLTEyNSw5ICsxMjUsNyBAQAogICAgICAgICAgICAgICAgICAgICBmcy5zZXREaXIoZnJvbURpcik7CiAgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVzZXQoZnMpOwogICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZGlycyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgc2Nhbihmcm9tRGlyLCB0b0RpciwgZmlsZXMsIGRpcnMpOworICAgICAgICAgICAgICAgICAgICBzY2FuKGZyb21EaXIsIHRvRGlyLCBkcy5nZXRJbmNsdWRlZEZpbGVzKCksIGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzYsMTQgKzEzNCwxNCBAQAogICAgICAgICAgICAgbG9nKCJNb3ZpbmcgIiArIG1vdmVDb3VudCArICIgZmlsZSIgKyAoKG1vdmVDb3VudCA9PSAxKSA/ICIiIDogInMiKQogICAgICAgICAgICAgICAgICAgICArICIgdG8gIiArIGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGZyb21GaWxlcyA9IGZpbGVDb3B5TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGZyb21GaWxlcy5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZyb21GaWxlID0gKFN0cmluZykgZnJvbUZpbGVzLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nW10+IGVudHJ5IDogZmlsZUNvcHlNYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmcm9tRmlsZSA9IGVudHJ5LmdldEtleSgpOwogICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZyb21GaWxlKTsKICAgICAgICAgICAgICAgICBib29sZWFuIHNlbGZNb3ZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgaWYgKGYuZXhpc3RzKCkpIHsgLy9JcyB0aGlzIGZpbGUgc3RpbGwgYXZhaWxhYmxlIHRvIGJlIG1vdmVkPwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b0ZpbGVzID0gKFN0cmluZ1tdKSBmaWxlQ29weU1hcC5nZXQoZnJvbUZpbGUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b0ZpbGVzID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b0ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9GaWxlID0gKFN0cmluZykgdG9GaWxlc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0b0ZpbGUgPSB0b0ZpbGVzW2ldOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbUZpbGUuZXF1YWxzKHRvRmlsZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIHNlbGYtbW92ZSBvZiAiICsgZnJvbUZpbGUsIHZlcmJvc2l0eSk7CkBAIC0xNzksNyArMTc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBGaWxlIGQgPSBuZXcgRmlsZSh0b0Rpck5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGQubWtkaXJzKCkgfHwgZC5leGlzdHMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZC5ta2RpcnMoKSAmJiAhZC5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGNyZWF0ZSBkaXJlY3RvcnkgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIxNCwxNiArMjEyLDE1IEBACiAgICAgICAgICAgICBsb2coIkF0dGVtcHRpbmcgdG8gcmVuYW1lOiAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUsIHZlcmJvc2l0eSk7CiAgICAgICAgICAgICBtb3ZlZCA9IHJlbmFtZUZpbGUoZnJvbUZpbGUsIHRvRmlsZSwgZmlsdGVyaW5nLCBmb3JjZU92ZXJ3cml0ZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gcmVuYW1lICIgKyBmcm9tRmlsZQotICAgICAgICAgICAgICAgICsgIiB0byAiICsgdG9GaWxlICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVuYW1lICIgKyBmcm9tRmlsZSArICIgdG8gIgorICAgICAgICAgICAgICAgICsgdG9GaWxlICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCksIGlvZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1vdmVkKSB7CiAgICAgICAgICAgICBjb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlLCBmaWx0ZXJpbmcsIG92ZXJ3cml0ZSk7CiAgICAgICAgICAgICBpZiAoIWdldEZpbGVVdGlscygpLnRyeUhhcmRUb0RlbGV0ZShmcm9tRmlsZSwgcGVyZm9ybUdjKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSAiICsgImZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBmcm9tRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICBmcm9tRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDMsOSArMjQwLDcgQEAKICAgICAgICAgICAgIGlmIChmaWx0ZXJpbmcpIHsKICAgICAgICAgICAgICAgICBleGVjdXRpb25GaWx0ZXJzLmFkZEZpbHRlclNldChnZXRQcm9qZWN0KCkuZ2V0R2xvYmFsRmlsdGVyU2V0KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBmaWx0ZXJJdGVyID0gZ2V0RmlsdGVyU2V0cygpLml0ZXJhdG9yKCk7IGZpbHRlckl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkZpbHRlcnMuYWRkRmlsdGVyU2V0KChGaWx0ZXJTZXQpIGZpbHRlckl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEZpbHRlclNldHMoKS5mb3JFYWNoKGV4ZWN1dGlvbkZpbHRlcnM6OmFkZEZpbHRlclNldCk7CiAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5jb3B5RmlsZShmcm9tRmlsZSwgdG9GaWxlLCBleGVjdXRpb25GaWx0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsdGVyQ2hhaW5zKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZU92ZXJ3cml0ZSwKQEAgLTI1NSw5ICsyNTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0RW5jb2RpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwgZ2V0Rm9yY2UoKSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gY29weSAiICsgZnJvbUZpbGUKLSAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyB0b0ZpbGUgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZSArICIgdG8gIgorICAgICAgICAgICAgICAgICsgdG9GaWxlICsgIiBkdWUgdG8gIiArIGlvZS5nZXRNZXNzYWdlKCksIGlvZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI3Miw4ICsyNjYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9ICAgICAvLyBtYXliZSBpbyBlcnJvcj8KIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gbGlzdFtpXTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IGxpc3QpIHsKICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGQsIHMpOwogICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgIGlmICghb2tUb0RlbGV0ZShmKSkgewpAQCAtMzA1LDIyICsyOTgsMjQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSAgICAgIC8vIG9uIGFuIGlvIGVycm9yIGxpc3QoKSBjYW4gcmV0dXJuIG51bGwKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gbGlzdFtpXTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IGxpc3QpIHsKICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGQsIHMpOwogICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgIGRlbGV0ZURpcihmKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsZXRlRmlsZXMgJiYgIWdldEZpbGVVdGlscygpLnRyeUhhcmRUb0RlbGV0ZShmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1HYykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZmlsZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbGV0ZUZpbGVzCisgICAgICAgICAgICAgICAgJiYgIWdldEZpbGVVdGlscygpLnRyeUhhcmRUb0RlbGV0ZShmLCBwZXJmb3JtR2MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICBmLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVTkVYUEVDVEVEIEVSUk9SIC0gVGhlIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBmLmdldEFic29sdXRlUGF0aCgpICsgIiBzaG91bGQgbm90IGV4aXN0ISIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVORVhQRUNURUQgRVJST1IgLSBUaGUgZmlsZSAlcyBzaG91bGQgbm90IGV4aXN0ISIsCisgICAgICAgICAgICAgICAgICAgIGYuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGxvZygiRGVsZXRpbmcgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpLCB2ZXJib3NpdHkpOwogICAgICAgICBpZiAoIWdldEZpbGVVdGlscygpLnRyeUhhcmRUb0RlbGV0ZShkLCBwZXJmb3JtR2MpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBkZWxldGUgZGlyZWN0b3J5ICIgKyBkLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBkaXJlY3RvcnkgJXMiLAorICAgICAgICAgICAgICAgIGQuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNDQsMTkgKzMzOSwyMSBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIHJlbmFtZUZpbGUoRmlsZSBzb3VyY2VGaWxlLCBGaWxlIGRlc3RGaWxlLCBib29sZWFuIGZpbHRlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGRlc3RGaWxlLmlzRGlyZWN0b3J5KCkgfHwgZmlsdGVyaW5nIHx8IGdldEZpbHRlclNldHMoKS5zaXplKCkgPiAwCi0gICAgICAgICAgICAgICAgfHwgZ2V0RmlsdGVyQ2hhaW5zKCkuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoZGVzdEZpbGUuaXNEaXJlY3RvcnkoKSB8fCBmaWx0ZXJpbmcgfHwgIWdldEZpbHRlclNldHMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICB8fCAhZ2V0RmlsdGVyQ2hhaW5zKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBpZGVudGljYWwgbG9naWMgbGl2ZXMgaW4gUmVzb3VyY2VVdGlscy5jb3B5UmVzb3VyY2UoKToKICAgICAgICAgaWYgKGRlc3RGaWxlLmlzRmlsZSgpICYmICFkZXN0RmlsZS5jYW5Xcml0ZSgpKSB7CiAgICAgICAgICAgICBpZiAoIWdldEZvcmNlKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNhbid0IHJlcGxhY2UgcmVhZC1vbmx5IGRlc3RpbmF0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZSAiICsgZGVzdEZpbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghZ2V0RmlsZVV0aWxzKCkudHJ5SGFyZFRvRGVsZXRlKGRlc3RGaWxlKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGRlbGV0ZSByZWFkLW9ubHkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkZXN0aW5hdGlvbiBmaWxlICIgKyBkZXN0RmlsZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJjYW4ndCByZXBsYWNlIHJlYWQtb25seSBkZXN0aW5hdGlvbiBmaWxlICVzIiwgZGVzdEZpbGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ2V0RmlsZVV0aWxzKCkudHJ5SGFyZFRvRGVsZXRlKGRlc3RGaWxlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGRlbGV0ZSByZWFkLW9ubHkgZGVzdGluYXRpb24gZmlsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRlc3RGaWxlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzczLDkgKzM3MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICArICIgaXMgYSBuby1vcC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKGdldEZpbGVVdGlscygpLmFyZVNhbWUoc291cmNlRmlsZSwgZGVzdEZpbGUpCi0gICAgICAgICAgICAgICAgICB8fCBnZXRGaWxlVXRpbHMoKS50cnlIYXJkVG9EZWxldGUoZGVzdEZpbGUsIHBlcmZvcm1HYykpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVtb3ZlIGV4aXN0aW5nIGZpbGUgIiArIGRlc3RGaWxlKTsKKyAgICAgICAgICAgIGlmICghZ2V0RmlsZVV0aWxzKCkuYXJlU2FtZShzb3VyY2VGaWxlLCBkZXN0RmlsZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIWdldEZpbGVVdGlscygpLnRyeUhhcmRUb0RlbGV0ZShkZXN0RmlsZSwgcGVyZm9ybUdjKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlbW92ZSBleGlzdGluZyBmaWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzdEZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzb3VyY2VGaWxlLnJlbmFtZVRvKGRlc3RGaWxlKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL05pY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL05pY2UuamF2YQppbmRleCA1ODk4Y2FlLi45NTUwMzE2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9OaWNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDgsMTIgKzQ4LDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFByaW9yaXR5OwogCi0KLQogICAgIC8qKgogICAgICAqIEV4ZWN1dGUgdGhlIHRhc2sKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggdGhlIGJ1aWxkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgVGhyZWFkIHNlbGYgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwpAQCAtNjMsOSArNjIsOSBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KGN1cnJlbnRQcmlvcml0eSwgY3VycmVudCk7CiAgICAgICAgIH0KICAgICAgICAgLy9pZiB0aGVyZSBpcyBhIG5ldyBwcmlvcml0eSwgYW5kIGl0IGlzIGRpZmZlcmVudCwgY2hhbmdlIGl0Ci0gICAgICAgIGlmIChuZXdQcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5ICE9IG5ld1ByaW9yaXR5LmludFZhbHVlKCkpIHsKKyAgICAgICAgaWYgKG5ld1ByaW9yaXR5ICE9IG51bGwgJiYgcHJpb3JpdHkgIT0gbmV3UHJpb3JpdHkpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgc2VsZi5zZXRQcmlvcml0eShuZXdQcmlvcml0eS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBzZWxmLnNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvL2NhdGNoIHBlcm1pc3Npb25zIGRlbmlhbCBhbmQga2VlcCBnb2luZwogICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIHNldCBuZXcgcHJpb3JpdHkgLWEgc2VjdXJpdHkgbWFuYWdlciBpcyBpbiB0aGUgd2F5IiwKQEAgLTkzLDcgKzkyLDcgQEAKICAgICAgICAgaWYgKG5ld1ByaW9yaXR5IDwgVGhyZWFkLk1JTl9QUklPUklUWSB8fCBuZXdQcmlvcml0eSA+IFRocmVhZC5NQVhfUFJJT1JJVFkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHRocmVhZCBwcmlvcml0eSBpcyBvdXQgb2YgdGhlIHJhbmdlIDEtMTAiKTsKICAgICAgICAgfQotICAgICAgICB0aGlzLm5ld1ByaW9yaXR5ID0gbmV3IEludGVnZXIobmV3UHJpb3JpdHkpOworICAgICAgICB0aGlzLm5ld1ByaW9yaXR5ID0gbmV3UHJpb3JpdHk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYWNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYWNrLmphdmEKaW5kZXggNjNkZmUwNS4uZWFmM2YzYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFjay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhY2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM4LDYgKzM4LDcgQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFBhY2sgZXh0ZW5kcyBUYXNrIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKKwogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAgICAgcHJvdGVjdGVkIEZpbGUgemlwRmlsZTsKICAgICBwcm90ZWN0ZWQgRmlsZSBzb3VyY2U7CkBAIC05MSwxMyArOTIsMTQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKFJlc291cmNlQ29sbGVjdGlvbiBhKSB7CiAgICAgICAgIGlmIChhLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHJlc291cmNlIHNlbGVjdGVkLCAiICsgZ2V0VGFza05hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgbmVlZHMgZXhhY3RseSBvbmUgcmVzb3VyY2UuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk5vIHJlc291cmNlIHNlbGVjdGVkLCAlcyBuZWVkcyBleGFjdGx5IG9uZSByZXNvdXJjZS4iLAorICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza05hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgY2Fubm90IGhhbmRsZSBtdWx0aXBsZSByZXNvdXJjZXMgYXQgb25jZS4gKCIgKyBhLnNpemUoKQotICAgICAgICAgICAgICAgICAgICArICIgcmVzb3VyY2VzIHdlcmUgc2VsZWN0ZWQuKSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgaGFuZGxlIG11bHRpcGxlIHJlc291cmNlcyBhdCBvbmNlLiAoJWQgcmVzb3VyY2VzIHdlcmUgc2VsZWN0ZWQuKSIsCisgICAgICAgICAgICAgICAgZ2V0VGFza05hbWUoKSwgYS5zaXplKCkpOwogICAgICAgICB9CiAgICAgICAgIHNldFNyY1Jlc291cmNlKGEuaXRlcmF0b3IoKS5uZXh0KCkpOwogICAgIH0KQEAgLTExMiwxMyArMTE0LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoemlwRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInppcGZpbGUgYXR0cmlidXRlIG11c3Qgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlcHJlc2VudCBhIGRpcmVjdG9yeSEiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiemlwZmlsZSBhdHRyaWJ1dGUgbXVzdCBub3QgcmVwcmVzZW50IGEgZGlyZWN0b3J5ISIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZ2V0U3JjUmVzb3VyY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNyYyBhdHRyaWJ1dGUgb3IgbmVzdGVkIHJlc291cmNlIGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJzcmMgYXR0cmlidXRlIG9yIG5lc3RlZCByZXNvdXJjZSBpcyByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMjYsNiArMTI5LDcgQEAKICAgICAgKiB2YWxpZGF0ZSwgdGhlbiBoYW5kIG9mZiB0byB0aGUgc3ViY2xhc3MKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAKQEAgLTE3NywxMSArMTgxLDggQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCB6aXBSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgT3V0cHV0U3RyZWFtIHpPdXQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIHJJbiA9IHJlc291cmNlLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gckluID0gcmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSkgewogICAgICAgICAgICAgemlwRmlsZShySW4sIHpPdXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgckluLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhcmFsbGVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbC5qYXZhCmluZGV4IGY0NmQ0YWQuLjc1N2M4MDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhcmFsbGVsLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC0yOCw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnByb3BlcnR5LkxvY2FsUHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIEV4ZWN1dGVzIHRoZSBjb250YWluZWQgdGFza3MgaW4gc2VwYXJhdGUgdGhyZWFkcywgY29udGludWluZwpAQCAtNTYsMjEgKzU0LDIyIEBACiAgICAgLyoqIENsYXNzIHdoaWNoIGhvbGRzIGEgbGlzdCBvZiB0YXNrcyB0byBleGVjdXRlICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgewogICAgICAgICAvKiogQ29sbGVjdGlvbiBob2xkaW5nIHRoZSBuZXN0ZWQgdGFza3MgKi8KLSAgICAgICAgcHJpdmF0ZSBMaXN0IHRhc2tzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwcml2YXRlIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBwYXJhbGxlbCAoYXN5bmNocm9uKS4KKyAgICAgICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gZXhlY3V0ZSBpbiBwYXJhbGxlbCAoYXN5bmNocm9ub3VzbHkpLgogICAgICAgICAgKiA8cD4KICAgICAgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgIE5lc3RlZCB0YXNrIHRvIGJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgogICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgYmUgbnVsbC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgewogICAgICAgICAgICAgdGFza3MuYWRkKG5lc3RlZFRhc2spOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqIENvbGxlY3Rpb24gaG9sZGluZyB0aGUgbmVzdGVkIHRhc2tzICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8VGFzaz4gbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiBTZW1hcGhvcmUgdG8gbm90aWZ5IG9mIGNvbXBsZXRlZCB0aHJlYWRzICovCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc2VtYXBob3JlID0gbmV3IE9iamVjdCgpOwpAQCAtOTYsNyArOTUsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsT25Bbnk7CiAKLSAgICAvKiogVGhlIGRhbWVvbiB0YXNrIGxpc3QgaWYgYW55ICovCisgICAgLyoqIFRoZSBkYWVtb24gdGFzayBsaXN0IGlmIGFueSAqLwogICAgIHByaXZhdGUgVGFza0xpc3QgZGFlbW9uVGFza3M7CiAKICAgICAvKiogQWNjdW11bGF0aW9uIG9mIGV4Y2VwdGlvbnMgbWVzc2FnZXMgZnJvbSBhbGwgbmVzdGVkIHRhc2tzICovCkBAIC0xNTAsNiArMTQ5LDcgQEAKICAgICAgKiBBZGQgYSBuZXN0ZWQgdGFzayB0byBleGVjdXRlIGluIHBhcmFsbGVsLgogICAgICAqIEBwYXJhbSBuZXN0ZWRUYXNrICBOZXN0ZWQgdGFzayB0byBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7CiAgICAgICAgIG5lc3RlZFRhc2tzLmFkZEVsZW1lbnQobmVzdGVkVGFzayk7CiAgICAgfQpAQCAtMTk1LDEzICsxOTUsMTIgQEAKICAgICAgICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDsKICAgICB9CiAKLQotCiAgICAgLyoqCiAgICAgICogRXhlY3V0ZSB0aGUgcGFyYWxsZWwgdGFza3MKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSB0aHJlYWRzIGZhaWxlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdXBkYXRlVGhyZWFkQ291bnRzKCk7CiAgICAgICAgIGlmIChudW1UaHJlYWRzID09IDApIHsKQEAgLTIxNSw4ICsyMTQsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaHJlYWRDb3VudHMoKSB7CiAgICAgICAgIGlmIChudW1UaHJlYWRzUGVyUHJvY2Vzc29yICE9IDApIHsKLSAgICAgICAgICAgIG51bVRocmVhZHMgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCkgKgotICAgICAgICAgICAgICAgICAgICBudW1UaHJlYWRzUGVyUHJvY2Vzc29yOworICAgICAgICAgICAgbnVtVGhyZWFkcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKQorICAgICAgICAgICAgICAgICAgICAqIG51bVRocmVhZHNQZXJQcm9jZXNzb3I7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyNCw4ICsyMjMsOCBAQAogICAgICAgICBpZiAocnVubmFibGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bm5hYmxlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBydW5uYWJsZXNbaV0uZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgIGZvciAoVGFza1J1bm5hYmxlIHJ1bm5hYmxlIDogcnVubmFibGVzKSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IHJ1bm5hYmxlLmdldEV4Y2VwdGlvbigpOwogICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG51bUV4Y2VwdGlvbnMrKzsKICAgICAgICAgICAgICAgICBpZiAoZmlyc3RFeGNlcHRpb24gPT0gbnVsbCkgewpAQCAtMjQzLDcgKzI0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIHNob3VsZCBtYXRjaCB0aGUgZXhpdCBzdGF0dXMKICAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2NhdGlvbiA9IGV4LmdldExvY2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1lc3NhZ2UuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZCh0LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI1NSwyOCArMjU0LDIxIEBACiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHRocmVhZHMgZmFpbGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBzcGluVGhyZWFkcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGludCBudW1UYXNrcyA9IG5lc3RlZFRhc2tzLnNpemUoKTsKLSAgICAgICAgVGFza1J1bm5hYmxlW10gcnVubmFibGVzID0gbmV3IFRhc2tSdW5uYWJsZVtudW1UYXNrc107CiAgICAgICAgIHN0aWxsUnVubmluZyA9IHRydWU7CiAgICAgICAgIHRpbWVkT3V0ID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSBmYWxzZTsKIAotICAgICAgICBpbnQgdGhyZWFkTnVtYmVyID0gMDsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbmVzdGVkVGFza3MuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTsKLSAgICAgICAgICAgICB0aHJlYWROdW1iZXIrKykgewotICAgICAgICAgICAgVGFzayBuZXN0ZWRUYXNrID0gKFRhc2spIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJ1bm5hYmxlc1t0aHJlYWROdW1iZXJdCi0gICAgICAgICAgICAgICAgPSBuZXcgVGFza1J1bm5hYmxlKG5lc3RlZFRhc2spOwotICAgICAgICB9CisgICAgICAgIFRhc2tSdW5uYWJsZVtdIHJ1bm5hYmxlcyA9IG5lc3RlZFRhc2tzLnN0cmVhbSgpLm1hcChUYXNrUnVubmFibGU6Om5ldykKKyAgICAgICAgICAgIC50b0FycmF5KFRhc2tSdW5uYWJsZVtdOjpuZXcpOwogCisgICAgICAgIGZpbmFsIGludCBudW1UYXNrcyA9IG5lc3RlZFRhc2tzLnNpemUoKTsKICAgICAgICAgZmluYWwgaW50IG1heFJ1bm5pbmcgPSBudW1UYXNrcyA8IG51bVRocmVhZHMgPyBudW1UYXNrcyA6IG51bVRocmVhZHM7Ci0gICAgICAgIFRhc2tSdW5uYWJsZVtdIHJ1bm5pbmcgPSBuZXcgVGFza1J1bm5hYmxlW21heFJ1bm5pbmddOwogCi0gICAgICAgIHRocmVhZE51bWJlciA9IDA7CisgICAgICAgIFRhc2tSdW5uYWJsZVtdIHJ1bm5pbmcgPSBuZXcgVGFza1J1bm5hYmxlW21heFJ1bm5pbmddOwogICAgICAgICBUaHJlYWRHcm91cCBncm91cCA9IG5ldyBUaHJlYWRHcm91cCgicGFyYWxsZWwiKTsKIAogICAgICAgICBUYXNrUnVubmFibGVbXSBkYWVtb25zID0gbnVsbDsKLSAgICAgICAgaWYgKGRhZW1vblRhc2tzICE9IG51bGwgJiYgZGFlbW9uVGFza3MudGFza3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgaWYgKGRhZW1vblRhc2tzICE9IG51bGwgJiYgIWRhZW1vblRhc2tzLnRhc2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZGFlbW9ucyA9IG5ldyBUYXNrUnVubmFibGVbZGFlbW9uVGFza3MudGFza3Muc2l6ZSgpXTsKICAgICAgICAgfQogCkBAIC0yOTIsNyArMjg0LDcgQEAKICAgICAgICAgICAgIC8vIHN0YXJ0IGFueSBkYWVtb24gdGhyZWFkcwogICAgICAgICAgICAgaWYgKGRhZW1vbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGFlbW9ucy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBkYWVtb25zW2ldID0gbmV3IFRhc2tSdW5uYWJsZSgoVGFzaykgZGFlbW9uVGFza3MudGFza3MuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgZGFlbW9uc1tpXSA9IG5ldyBUYXNrUnVubmFibGUoZGFlbW9uVGFza3MudGFza3MuZ2V0KGkpKTsKICAgICAgICAgICAgICAgICAgICAgVGhyZWFkIGRhZW1vblRocmVhZCA9ICBuZXcgVGhyZWFkKGdyb3VwLCBkYWVtb25zW2ldKTsKICAgICAgICAgICAgICAgICAgICAgZGFlbW9uVGhyZWFkLnNldERhZW1vbih0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgZGFlbW9uVGhyZWFkLnN0YXJ0KCk7CkBAIC0zMDEsNiArMjkzLDcgQEAKIAogICAgICAgICAgICAgLy8gbm93IHJ1biBtYWluIHRocmVhZHMgaW4gbGltaXRlZCBudW1iZXJzLi4uCiAgICAgICAgICAgICAvLyBzdGFydCBpbml0aWFsIGJhdGNoIG9mIHRocmVhZHMKKyAgICAgICAgICAgIGludCB0aHJlYWROdW1iZXIgPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhSdW5uaW5nOyArK2kpIHsKICAgICAgICAgICAgICAgICBydW5uaW5nW2ldID0gcnVubmFibGVzW3RocmVhZE51bWJlcisrXTsKICAgICAgICAgICAgICAgICBUaHJlYWQgdGhyZWFkID0gIG5ldyBUaHJlYWQoZ3JvdXAsIHJ1bm5pbmdbaV0pOwpAQCAtMzEwLDYgKzMwMyw3IEBACiAgICAgICAgICAgICBpZiAodGltZW91dCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gc3RhcnQgdGhlIHRpbWVvdXQgdGhyZWFkCiAgICAgICAgICAgICAgICAgVGhyZWFkIHRpbWVvdXRUaHJlYWQgPSBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMzkzLDE3ICszODcsMTYgQEAKICAgICAgICAgaWYgKG51bUV4Y2VwdGlvbnMgPT0gMSkgewogICAgICAgICAgICAgaWYgKGZpcnN0RXhjZXB0aW9uIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGZpcnN0RXhjZXB0aW9uOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZmlyc3RFeGNlcHRpb24pOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG51bUV4Y2VwdGlvbnMgPiAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZmlyc3RFeGNlcHRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChudW1FeGNlcHRpb25zID4gMSkgewogICAgICAgICAgICAgaWYgKGZpcnN0RXhpdFN0YXR1cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4Y2VwdGlvbk1lc3NhZ2UudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2NhdGlvbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGl0U3RhdHVzRXhjZXB0aW9uKGV4Y2VwdGlvbk1lc3NhZ2UudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEV4aXRTdGF0dXMsIGZpcnN0TG9jYXRpb24pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEV4aXRTdGF0dXNFeGNlcHRpb24oZXhjZXB0aW9uTWVzc2FnZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RFeGl0U3RhdHVzLCBmaXJzdExvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDUzLDYgKzQ0Niw3IEBACiAgICAgICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrIHdpdGhpbiBhIHRocmVhZCBhbmQgdGFrZXMgY2FyZSBhYm91dAogICAgICAgICAgKiBFeGNlcHRpb25zIHJhaXNlZCB3aXRoaW4gdGhlIHRhc2suCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBMb2NhbFByb3BlcnRpZXMuZ2V0KGdldFByb2plY3QoKSkuY29weSgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0Y2guamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGNoLmphdmEKaW5kZXggOTZhYjA4Mi4uMjcwOWU0YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0Y2guamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRjaC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTY1LDEyICsxNjUsMTMgQEAKICAgICAgKiBleGVjdXRlIHBhdGNoCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiB3aGVuIGl0IGFsbCBnb2VzIGEgYml0IHBlYXIgc2hhcGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghaGF2ZVBhdGNoZmlsZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXRjaGZpbGUgYXJndW1lbnQgaXMgcmVxdWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSA9IChDb21tYW5kbGluZSkgY21kLmNsb25lKCk7CisgICAgICAgIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSA9ICAoQ29tbWFuZGxpbmUpIGNtZC5jbG9uZSgpOwogICAgICAgICB0b0V4ZWN1dGUuc2V0RXhlY3V0YWJsZShQQVRDSCk7CiAKICAgICAgICAgaWYgKG9yaWdpbmFsRmlsZSAhPSBudWxsKSB7CkBAIC0xODIsMTggKzE4MywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUodG9FeGVjdXRlLmdldENvbW1hbmRsaW5lKCkpOwogCi0gICAgICAgIGlmIChkaXJlY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGRpcmVjdG9yeS5leGlzdHMoKSAmJiBkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICBpZiAoZGlyZWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFkaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXJlY3RvcnkgKyAiIGlzIG5vdCBhIGRpcmVjdG9yeS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkaXJlY3RvcnkgIiArIGRpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3QgZXhpc3QiLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkpOworICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5KTsKICAgICAgICAgfQogCiAgICAgICAgIGxvZyh0b0V4ZWN1dGUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtMjA0LDkgKzIwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICsgcmV0dXJuY29kZTsKICAgICAgICAgICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0aENvbnZlcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0LmphdmEKaW5kZXggMGZjMWY1Yi4uZmE2OGMzZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0aENvbnZlcnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKQEAgLTgxLDcgKzgwLDcgQEAKICAgICAvKioKICAgICAgKiBQYXRoIHByZWZpeCBtYXAKICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBwcmVmaXhNYXAgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PE1hcEVudHJ5PiBwcmVmaXhNYXAgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAvKioKICAgICAgKiBVc2VyIG92ZXJyaWRlIG9uIHBhdGggc2VwIGNoYXIKICAgICAgKi8KQEAgLTk3LDEyICs5Niw2IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHByZXNlcnZlRHVwbGljYXRlczsKIAogICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgUGF0aENvbnZlcnQgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGF0aENvbnZlcnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogSGVscGVyIGNsYXNzLCBob2xkcyB0aGUgbmVzdGVkICZsdDttYXAmZ3Q7IHZhbHVlcy4gRWxlbWVudHMgd2lsbCBsb29rIGxpa2UKICAgICAgKiB0aGlzOiAmbHQ7bWFwIGZyb209JnF1b3Q7ZDomcXVvdDsgdG89JnF1b3Q7L2ZvbyZxdW90Oy8mZ3Q7CiAgICAgICoKQEAgLTE0Miw4ICsxMzUsOCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShTdHJpbmcgZWxlbSkgewogICAgICAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCB0byA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJCb3RoICdmcm9tJyBhbmQgJ3RvJyBtdXN0IGJlIHNldCAiCi0gICAgICAgICAgICAgICAgICAgICArICJpbiBhIG1hcCBlbnRyeSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkJvdGggJ2Zyb20nIGFuZCAndG8nIG11c3QgYmUgc2V0IGluIGEgbWFwIGVudHJ5Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBvbiB3aW5kb3dzLCB0aGVuIGRvIHRoZSBjb21wYXJpc29uIGlnbm9yaW5nIGNhc2UKICAgICAgICAgICAgIC8vIGFuZCB0cmVhdCB0aGUgdHdvIGRpcmVjdG9yeSBjaGFyYWN0ZXJzIHRoZSBzYW1lCkBAIC0yMTMsNyArMjA2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgTWFwRW50cnkgY3JlYXRlTWFwKCkgewogICAgICAgICBNYXBFbnRyeSBlbnRyeSA9IG5ldyBNYXBFbnRyeSgpOwotICAgICAgICBwcmVmaXhNYXAuYWRkRWxlbWVudChlbnRyeSk7CisgICAgICAgIHByZWZpeE1hcC5hZGQoZW50cnkpOwogICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgfQogCkBAIC0yNTEsNyArMjQ0LDcgQEAKICAgICAgICAgLy8gdmFsaWRhdGVTZXR1cCBjb2RlLCB0aGUgc2FtZSBhc3N1bXB0aW9ucyBjYW4gYmUgbWFkZSBhcwogICAgICAgICAvLyB3aXRoIHdpbmRvd3MgLSB0aGF0IDsgaXMgdGhlIHBhdGggc2VwYXJhdG9yCiAKLSAgICAgICAgdGFyZ2V0V2luZG93cyA9ICF0YXJnZXRPUy5lcXVhbHMoInVuaXgiKSAmJiAhdGFyZ2V0T1MuZXF1YWxzKCJ0YW5kZW0iKTsKKyAgICAgICAgdGFyZ2V0V2luZG93cyA9ICEidW5peCIuZXF1YWxzKHRhcmdldE9TKSAmJiAhInRhbmRlbSIuZXF1YWxzKHRhcmdldE9TKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI5Myw3ICsyODYsNiBAQAogICAgICAgICBwYXRoU2VwID0gc2VwOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBzZXBhcmF0b3Igc3RyaW5nOwogICAgICAqIGRlZmF1bHRzIHRvIGN1cnJlbnQgSlZNIHtAbGluayBqYXZhLmlvLkZpbGUjc2VwYXJhdG9yIEZpbGUuc2VwYXJhdG9yfS4KQEAgLTM0NCw4ICszMzYsOSBAQAogICAgICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IHJlZmlkLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmVzb3VyY2VDb2xsZWN0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlZmlkICciICsgcmVmaWQuZ2V0UmVmSWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBkb2VzIG5vdCByZWZlciB0byBhIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZWZpZCAnJXMnIGRvZXMgbm90IHJlZmVyIHRvIGEgcmVzb3VyY2UgY29sbGVjdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVmaWQuZ2V0UmVmSWQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGdldFBhdGgoKS5hZGQoKFJlc291cmNlQ29sbGVjdGlvbikgbyk7CiAgICAgICAgICAgICB9CkBAIC0zNjEsMTAgKzM1NCwxMCBAQAogICAgICAgICAgICAgLy8gY2FzZS1pbnNlbnNpdGl2ZS4KICAgICAgICAgICAgIFN0cmluZyBmcm9tRGlyU2VwID0gb25XaW5kb3dzID8gIlxcIiA6ICIvIjsKIAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHJzbHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJzbHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCi0gICAgICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24gcmVzb3VyY2VzID0gaXNQcmVzZXJ2ZUR1cGxpY2F0ZXMoKSA/IChSZXNvdXJjZUNvbGxlY3Rpb24pIHBhdGggOiBuZXcgVW5pb24ocGF0aCk7Ci0gICAgICAgICAgICBMaXN0IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByZXNvdXJjZXMgPSBpc1ByZXNlcnZlRHVwbGljYXRlcygpID8gcGF0aCA6IG5ldyBVbmlvbihwYXRoKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlckltcGwgPSBtYXBwZXIgPT0gbnVsbCA/IG5ldyBJZGVudGl0eU1hcHBlcigpIDogbWFwcGVyLmdldEltcGxlbWVudGF0aW9uKCk7CiAgICAgICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByZXNvdXJjZXMpIHsKICAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXBwZWQgPSBtYXBwZXJJbXBsLm1hcEZpbGVOYW1lKFN0cmluZy52YWx1ZU9mKHIpKTsKQEAgLTM3Myw4ICszNjYsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBtYXBwZWRJdGVyID0gcmV0Lml0ZXJhdG9yKCk7IG1hcHBlZEl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtID0gbWFwRWxlbWVudCgoU3RyaW5nKSBtYXBwZWRJdGVyLm5leHQoKSk7IC8vIEFwcGx5IHRoZSBwYXRoIHByZWZpeCBtYXAKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHN0cmluZyA6IHJldCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbGVtID0gbWFwRWxlbWVudChzdHJpbmcpOyAvLyBBcHBseSB0aGUgcGF0aCBwcmVmaXggbWFwCiAKICAgICAgICAgICAgICAgICAvLyBOb3cgY29udmVydCB0aGUgcGF0aCBhbmQgZmlsZSBzZXBhcmF0b3IgY2hhcmFjdGVycyBmcm9tIHRoZQogICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgb3MgdG8gdGhlIHRhcmdldCBvcy4KQEAgLTQxOCwyNSArNDExLDE3IEBACiAgICAgICogQHJldHVybiBTdHJpbmcgVXBkYXRlZCBlbGVtZW50LgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIG1hcEVsZW1lbnQoU3RyaW5nIGVsZW0pIHsKKyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBtYXAgZW50cmllcyBhbmQgYXBwbHkgZWFjaCBvbmUuCisgICAgICAgIC8vIFN0b3Agd2hlbiBvbmUgb2YgdGhlIGVudHJpZXMgYWN0dWFsbHkgY2hhbmdlcyB0aGUgZWxlbWVudC4KIAotICAgICAgICBpbnQgc2l6ZSA9IHByZWZpeE1hcC5zaXplKCk7CisgICAgICAgIGZvciAoTWFwRW50cnkgZW50cnkgOiBwcmVmaXhNYXApIHsKKyAgICAgICAgICAgIFN0cmluZyBuZXdFbGVtID0gZW50cnkuYXBwbHkoZWxlbSk7CiAKLSAgICAgICAgaWYgKHNpemUgIT0gMCkgeworICAgICAgICAgICAgLy8gTm90ZSBJJ20gdXNpbmcgIiE9IiB0byBzZWUgaWYgd2UgZ290IGEgbmV3IG9iamVjdCBiYWNrIGZyb20KKyAgICAgICAgICAgIC8vIHRoZSBhcHBseSBtZXRob2QuCiAKLSAgICAgICAgICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbWFwIGVudHJpZXMgYW5kIGFwcGx5IGVhY2ggb25lLgotICAgICAgICAgICAgLy8gU3RvcCB3aGVuIG9uZSBvZiB0aGUgZW50cmllcyBhY3R1YWxseSBjaGFuZ2VzIHRoZSBlbGVtZW50LgotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIE1hcEVudHJ5IGVudHJ5ID0gKE1hcEVudHJ5KSBwcmVmaXhNYXAuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdFbGVtID0gZW50cnkuYXBwbHkoZWxlbSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RlIEknbSB1c2luZyAiIT0iIHRvIHNlZSBpZiB3ZSBnb3QgYSBuZXcgb2JqZWN0IGJhY2sgZnJvbQotICAgICAgICAgICAgICAgIC8vIHRoZSBhcHBseSBtZXRob2QuCi0KLSAgICAgICAgICAgICAgICBpZiAobmV3RWxlbSAhPSBlbGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBuZXdFbGVtOwotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gV2UgYXBwbGllZCBvbmUsIHNvIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV3RWxlbSAhPSBlbGVtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVsZW07CkBAIC01MDMsOSArNDg4LDggQEAKICAgICAgKiBAcmV0dXJuIEJ1aWxkRXhjZXB0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gbm9DaGlsZHJlbkFsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCAiCi0gICAgICAgICAgICAgKyAiZWxlbWVudHMgd2hlbiB1c2luZyB0aGUgcmVmaWQgYXR0cmlidXRlLiIpOworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHRoZSByZWZpZCBhdHRyaWJ1dGUuIik7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ByZVNldERlZi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmLmphdmEKaW5kZXggZmU1NzcwNC4uNjM1YjkzZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01Niw2ICs1Niw3IEBACiAgICAgICogQWRkIGEgbmVzdGVkIHRhc2sgdG8gcHJlZGVmaW5lIGF0dHJpYnV0ZXMgYW5kIGVsZW1lbnRzIG9uLgogICAgICAqIEBwYXJhbSBuZXN0ZWRUYXNrICBOZXN0ZWQgdGFzay90eXBlIHRvIGV4dGVuZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgbmVzdGVkVGFzaykgewogICAgICAgICBpZiAodGhpcy5uZXN0ZWRUYXNrICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgbmVzdGVkIGVsZW1lbnQgYWxsb3dlZCIpOwpAQCAtNzEsNiArNzIsNyBAQAogICAgIC8qKgogICAgICAqIE1ha2UgYSBuZXcgZGVmaW5pdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICBpZiAobmVzdGVkVGFzayA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3NpbmcgbmVzdGVkIGVsZW1lbnQiKTsKQEAgLTg5LDcgKzkxLDcgQEAKICAgICAgICAgQW50VHlwZURlZmluaXRpb24gZGVmID0gaGVscGVyLmdldERlZmluaXRpb24oY29tcG9uZW50TmFtZSk7CiAgICAgICAgIGlmIChkZWYgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCB0eXBlZGVmICIgKyBjb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZpbmQgdHlwZWRlZiAlcyIsIGNvbXBvbmVudE5hbWUpOwogICAgICAgICB9CiAgICAgICAgIFByZVNldERlZmluaXRpb24gbmV3RGVmID0gbmV3IFByZVNldERlZmluaXRpb24oZGVmLCBuZXN0ZWRUYXNrKTsKIApAQCAtMTI5LDcgKzEzMSw4IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjbGF6eiBhIDxjb2RlPkNsYXNzPC9jb2RlPiB2YWx1ZS4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzKENsYXNzIGNsYXp6KSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzcyhDbGFzczw/PiBjbGF6eikgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KIApAQCAtMTM4LDYgKzE0MSw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEBwYXJhbSBjbGFzc05hbWUgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQpAQCAtMTQ2LDYgKzE1MCw3IEBACiAgICAgICAgICAqIEdldCB0aGUgY2xhc3NuYW1lIG9mIHRoZSBkZWZpbml0aW9uLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB0aGlzIGRlZmluaXRpb24uCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CiAgICAgICAgICAgICByZXR1cm4gcGFyZW50LmdldENsYXNzTmFtZSgpOwogICAgICAgICB9CkBAIC0xNTUsNyArMTYwLDggQEAKICAgICAgICAgICogTk9UIFN1cHBvcnRlZAogICAgICAgICAgKiBAcGFyYW0gYWRhcHRlckNsYXNzIHRoZSBhZGFwdGVyQ2xhc3MuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyQ2xhc3MoQ2xhc3MgYWRhcHRlckNsYXNzKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyQ2xhc3MoQ2xhc3M8Pz4gYWRhcHRlckNsYXNzKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQogCkBAIC0xNjQsNyArMTcwLDggQEAKICAgICAgICAgICogTk9UIFNVUFBPUlRFRAogICAgICAgICAgKiBAcGFyYW0gYWRhcHRUb0NsYXNzIHRoZSBhc3NpZ25hYmxlIGNsYXNzLgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRUb0NsYXNzKENsYXNzIGFkYXB0VG9DbGFzcykgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWRhcHRUb0NsYXNzKENsYXNzPD8+IGFkYXB0VG9DbGFzcykgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KIApAQCAtMTc0LDYgKzE4MSw3IEBACiAgICAgICAgICAqIE5PVCBTVVBQT1JURUQKICAgICAgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIHRoZSBjbGFzc0xvYWRlci4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KQEAgLTE4Miw2ICsxOTAsNyBAQAogICAgICAgICAgKiBHZXQgdGhlIGNsYXNzbG9hZGVyIGZvciB0aGlzIGRlZmluaXRpb24uCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbG9hZGVyIGZvciB0aGlzIGRlZmluaXRpb24uCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewogICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRDbGFzc0xvYWRlcigpOwogICAgICAgICB9CkBAIC0xOTEsNyArMjAwLDggQEAKICAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KICAgICAgICAgICogQHJldHVybiB0aGUgZXhwb3NlZCBjbGFzcy4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDbGFzcyBnZXRFeHBvc2VkQ2xhc3MoUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RXhwb3NlZENsYXNzKFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRFeHBvc2VkQ2xhc3MocHJvamVjdCk7CiAgICAgICAgIH0KIApAQCAtMjAwLDcgKzIxMCw4IEBACiAgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBjdXJyZW50IHByb2plY3QuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGRlZmluaXRpb24uCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0VHlwZUNsYXNzKFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPD8+IGdldFR5cGVDbGFzcyhQcm9qZWN0IHByb2plY3QpIHsKICAgICAgICAgICAgIHJldHVybiBwYXJlbnQuZ2V0VHlwZUNsYXNzKHByb2plY3QpOwogICAgICAgICB9CiAKQEAgLTIwOSw2ICsyMjAsNyBAQAogICAgICAgICAgKiBDaGVjayBpZiB0aGUgYXR0cmlidXRlcyBhcmUgY29ycmVjdC4KICAgICAgICAgICogQHBhcmFtIHByb2plY3QgdGhlIGN1cnJlbnQgcHJvamVjdC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjaGVja0NsYXNzKFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgcGFyZW50LmNoZWNrQ2xhc3MocHJvamVjdCk7CiAgICAgICAgIH0KQEAgLTI0MCw2ICsyNTIsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgogICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KQEAgLTI1MSw2ICsyNjQsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBzYW1lRGVmaW5pdGlvbihBbnRUeXBlRGVmaW5pdGlvbiBvdGhlciwgUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgICAgICByZXR1cm4gKG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0Q2xhc3MoKSA9PSBnZXRDbGFzcygpICYmIHBhcmVudCAhPSBudWxsCiAgICAgICAgICAgICAgICAgJiYgcGFyZW50LnNhbWVEZWZpbml0aW9uKCgoUHJlU2V0RGVmaW5pdGlvbikgb3RoZXIpLnBhcmVudCwgcHJvamVjdCkKQEAgLTI2NCw2ICsyNzgsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgY3VycmVudCBwcm9qZWN0LgogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRlZmluaXRpb25zIGFyZSBzaW1pbGFyLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNpbWlsYXJEZWZpbml0aW9uKAogICAgICAgICAgICAgQW50VHlwZURlZmluaXRpb24gb3RoZXIsIFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAgICAgcmV0dXJuIChvdGhlciAhPSBudWxsICYmIG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2Nlc3NEZXN0cm95ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2Nlc3NEZXN0cm95ZXIuamF2YQppbmRleCBiYzNmZjQ5Li5mZDQ2ZTNjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9jZXNzRGVzdHJveWVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNyArMjEsNyBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiAvKioKICAqIERlc3Ryb3lzIGFsbCByZWdpc3RlcmVkIDxjb2RlPlByb2Nlc3M8L2NvZGU+ZXMgd2hlbiB0aGUgVk0gZXhpdHMuCkBAIC0zMCw3ICszMCw4IEBACiAgKi8KIGNsYXNzIFByb2Nlc3NEZXN0cm95ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUkVBRF9ESUVfVElNRU9VVCA9IDIwMDAwOwotICAgIHByaXZhdGUgSGFzaFNldCBwcm9jZXNzZXMgPSBuZXcgSGFzaFNldCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIC8vIG1ldGhvZHMgdG8gcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgc2h1dGRvd24gaG9va3MKICAgICBwcml2YXRlIE1ldGhvZCBhZGRTaHV0ZG93bkhvb2tNZXRob2Q7CiAgICAgcHJpdmF0ZSBNZXRob2QgcmVtb3ZlU2h1dGRvd25Ib29rTWV0aG9kOwpAQCAtNDksNiArNTAsNyBAQAogICAgICAgICBwdWJsaWMgUHJvY2Vzc0Rlc3Ryb3llckltcGwoKSB7CiAgICAgICAgICAgICBzdXBlcigiUHJvY2Vzc0Rlc3Ryb3llciBTaHV0ZG93biBIb29rIik7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKICAgICAgICAgICAgIGlmIChzaG91bGREZXN0cm95KSB7CiAgICAgICAgICAgICAgICAgUHJvY2Vzc0Rlc3Ryb3llci50aGlzLnJ1bigpOwpAQCAtNzQsMTIgKzc2LDExIEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhlIHNodXRkb3duIGhvb2sgbWV0aG9kcyBleGlzdHMKICAgICAgICAgICAgIC8vIChzdXBwb3J0IHByZS1KREsgMS4zIGFuZCBOb24tU3VuIFZNcykKLSAgICAgICAgICAgIENsYXNzW10gcGFyYW1UeXBlcyA9IHtUaHJlYWQuY2xhc3N9OwogICAgICAgICAgICAgYWRkU2h1dGRvd25Ib29rTWV0aG9kID0KLSAgICAgICAgICAgICAgICBSdW50aW1lLmNsYXNzLmdldE1ldGhvZCgiYWRkU2h1dGRvd25Ib29rIiwgcGFyYW1UeXBlcyk7CisgICAgICAgICAgICAgICAgUnVudGltZS5jbGFzcy5nZXRNZXRob2QoImFkZFNodXRkb3duSG9vayIsIFRocmVhZC5jbGFzcyk7CiAKICAgICAgICAgICAgIHJlbW92ZVNodXRkb3duSG9va01ldGhvZCA9Ci0gICAgICAgICAgICAgICAgUnVudGltZS5jbGFzcy5nZXRNZXRob2QoInJlbW92ZVNodXRkb3duSG9vayIsIHBhcmFtVHlwZXMpOworICAgICAgICAgICAgICAgIFJ1bnRpbWUuY2xhc3MuZ2V0TWV0aG9kKCJyZW1vdmVTaHV0ZG93bkhvb2siLCBUaHJlYWQuY2xhc3MpOwogICAgICAgICAgICAgLy8gd2FpdCB0byBhZGQgc2h1dGRvd24gaG9vayBhcyBuZWVkZWQKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGl0IGp1c3Qgd29uJ3QgYmUgYWRkZWQgYXMgYSBzaHV0ZG93biBob29rLi4uIDooCkBAIC05NSw5ICs5Niw4IEBACiAgICAgcHJpdmF0ZSB2b2lkIGFkZFNodXRkb3duSG9vaygpIHsKICAgICAgICAgaWYgKGFkZFNodXRkb3duSG9va01ldGhvZCAhPSBudWxsICYmICFydW5uaW5nKSB7CiAgICAgICAgICAgICBkZXN0cm95UHJvY2Vzc1RocmVhZCA9IG5ldyBQcm9jZXNzRGVzdHJveWVySW1wbCgpOwotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IHtkZXN0cm95UHJvY2Vzc1RocmVhZH07CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFkZFNodXRkb3duSG9va01ldGhvZC5pbnZva2UoUnVudGltZS5nZXRSdW50aW1lKCksIGFyZ3MpOworICAgICAgICAgICAgICAgIGFkZFNodXRkb3duSG9va01ldGhvZC5pbnZva2UoUnVudGltZS5nZXRSdW50aW1lKCksIGRlc3Ryb3lQcm9jZXNzVGhyZWFkKTsKICAgICAgICAgICAgICAgICBhZGRlZCA9IHRydWU7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAvL05PU09OQVIKQEAgLTExOSwxMyArMTE5LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlU2h1dGRvd25Ib29rKCkgewogICAgICAgICBpZiAocmVtb3ZlU2h1dGRvd25Ib29rTWV0aG9kICE9IG51bGwgJiYgYWRkZWQgJiYgIXJ1bm5pbmcpIHsKLSAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSB7ZGVzdHJveVByb2Nlc3NUaHJlYWR9OwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCb29sZWFuIHJlbW92ZWQgPQotICAgICAgICAgICAgICAgICAgICAoQm9vbGVhbikgcmVtb3ZlU2h1dGRvd25Ib29rTWV0aG9kLmludm9rZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgYXJncyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFyZW1vdmVkLmJvb2xlYW5WYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKHJlbW92ZVNodXRkb3duSG9va01ldGhvZAorICAgICAgICAgICAgICAgICAgICAuaW52b2tlKFJ1bnRpbWUuZ2V0UnVudGltZSgpLCBkZXN0cm95UHJvY2Vzc1RocmVhZCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IHJlbW92ZSBzaHV0ZG93biBob29rIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CkBAIC0xNDEsNyArMTM3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHN0YXJ0IHRoZSBob29rIHRocmVhZCwgYSB1bnN0YXJ0ZWQgdGhyZWFkIG1heSBub3QgYmUKICAgICAgICAgICAgIC8vIGVsaWdpYmxlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24KLSAgICAgICAgICAgIC8vIENmLjogaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQ1MzMwODcuaHRtbAorICAgICAgICAgICAgLy8gQ2YuOiBodHRwczovL2J1Z3Mub3Blbmpkay5qYXZhLm5ldC9icm93c2UvSkRLLTQ1MzMwODcKICAgICAgICAgICAgIGRlc3Ryb3lQcm9jZXNzVGhyZWFkLnNldFNob3VsZERlc3Ryb3koZmFsc2UpOwogICAgICAgICAgICAgaWYgKCFkZXN0cm95UHJvY2Vzc1RocmVhZC5nZXRUaHJlYWRHcm91cCgpLmlzRGVzdHJveWVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBzdGFydCgpIHdvdWxkIHRocm93IElsbGVnYWxUaHJlYWRTdGF0ZUV4Y2VwdGlvbiBmcm9tCkBAIC0xODAsNyArMTc2LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoUHJvY2VzcyBwcm9jZXNzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc2VzKSB7CiAgICAgICAgICAgICAvLyBpZiB0aGlzIGxpc3QgaXMgZW1wdHksIHJlZ2lzdGVyIHRoZSBzaHV0ZG93biBob29rCi0gICAgICAgICAgICBpZiAocHJvY2Vzc2VzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAocHJvY2Vzc2VzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGFkZFNodXRkb3duSG9vaygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3Nlcy5hZGQocHJvY2Vzcyk7CkBAIC0xOTgsNyArMTk0LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoUHJvY2VzcyBwcm9jZXNzKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc2VzKSB7CiAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NSZW1vdmVkID0gcHJvY2Vzc2VzLnJlbW92ZShwcm9jZXNzKTsKLSAgICAgICAgICAgIGlmIChwcm9jZXNzUmVtb3ZlZCAmJiBwcm9jZXNzZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChwcm9jZXNzUmVtb3ZlZCAmJiBwcm9jZXNzZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcmVtb3ZlU2h1dGRvd25Ib29rKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JlbW92ZWQ7CkBAIC0yMDgsMTMgKzIwNCwxMSBAQAogICAgIC8qKgogICAgICAqIEludm9rZWQgYnkgdGhlIFZNIHdoZW4gaXQgaXMgZXhpdGluZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHN5bmNocm9uaXplZCAocHJvY2Vzc2VzKSB7CiAgICAgICAgICAgICBydW5uaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGUgPSBwcm9jZXNzZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICgoUHJvY2VzcykgZS5uZXh0KCkpLmRlc3Ryb3koKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3Nlcy5mb3JFYWNoKFByb2Nlc3M6OmRlc3Ryb3kpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvamVjdEhlbHBlclRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2plY3RIZWxwZXJUYXNrLmphdmEKaW5kZXggOGYzNDhhNy4uN2VlMDQwNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvamVjdEhlbHBlclRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9qZWN0SGVscGVyVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zMyw3ICszMiw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVyVGFzayBleHRlbmRzIFRhc2sgewogCi0gICAgcHJpdmF0ZSBMaXN0IHByb2plY3RIZWxwZXJzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxQcm9qZWN0SGVscGVyPiBwcm9qZWN0SGVscGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZENvbmZpZ3VyZWQoUHJvamVjdEhlbHBlciBwcm9qZWN0SGVscGVyKSB7CiAgICAgICAgIHRoaXMucHJvamVjdEhlbHBlcnMuYWRkKHByb2plY3RIZWxwZXIpOwpAQCAtNDEsMTAgKzQwLDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeSByZXBvID0gUHJvamVjdEhlbHBlclJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IHByb2plY3RIZWxwZXJzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIFByb2plY3RIZWxwZXIgaGVscGVyID0gKFByb2plY3RIZWxwZXIpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIHJlcG8ucmVnaXN0ZXJQcm9qZWN0SGVscGVyKGhlbHBlci5nZXRDbGFzcygpKTsKLSAgICAgICAgfQorICAgICAgICBwcm9qZWN0SGVscGVycy5zdHJlYW0oKS5tYXAoUHJvamVjdEhlbHBlcjo6Z2V0Q2xhc3MpLmZvckVhY2goCisgICAgICAgICAgICBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpOjpyZWdpc3RlclByb2plY3RIZWxwZXIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eS5qYXZhCmluZGV4IGE2YjUxYTIuLmNkOTMwZGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCwxMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKQEAgLTIyNSw5ICsyMjQsOCBAQAogICAgICAgICAgICAgICAgIG1zZyA9IGN1cnJlbnRWYWx1ZSArIG1zZzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludGVybmFsU2V0VmFsdWUobXNnKTsKLSAgICAgICAgfSBlbHNlIGlmIChtc2cudHJpbSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW4ndCBjb21iaW5lIG5lc3RlZCB0ZXh0IHdpdGggdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGF0dHJpYnV0ZSIpOworICAgICAgICB9IGVsc2UgaWYgKCFtc2cudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW4ndCBjb21iaW5lIG5lc3RlZCB0ZXh0IHdpdGggdmFsdWUgYXR0cmlidXRlIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxNSw3ICs0MTMsNyBAQAogICAgICAqIEBwYXJhbSBwcmVmaXggcHJlZml4CiAgICAgICoKICAgICAgKiBAYW50LmF0dHJpYnV0ZSBncm91cD0ibm9uYW1lIgotICAgICAqIEBzaW5jZSBBbnQgMS45LjEyCisgICAgICogQHNpbmNlIEFudCAxLjEwLjQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSdW50aW1lKFN0cmluZyBwcmVmaXgpIHsKICAgICAgICAgdGhpcy5ydW50aW1lID0gcHJlZml4OwpAQCAtNDI0LDcgKzQyMiw3IEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBydW50aW1lIGF0dHJpYnV0ZS4KICAgICAgKiBAcmV0dXJuIHRoZSBydW50aW1lIGF0dHJpYnV0ZQotICAgICAqIEBzaW5jZSBBbnQgMS45LjEyCisgICAgICogQHNpbmNlIEFudCAxLjEwLjQKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFJ1bnRpbWUoKSB7CiAgICAgICAgIHJldHVybiBydW50aW1lOwpAQCAtNTA3LDI3ICs1MDUsMzEgQEAKIAogICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAodW50eXBlZFZhbHVlID09IG51bGwgJiYgcmVmID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgdmFsdWUsIGxvY2F0aW9uIG9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmaWQgd2l0aCB0aGUgbmFtZSBhdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IHZhbHVlLCBsb2NhdGlvbiBvciByZWZpZCB3aXRoIHRoZSBuYW1lIGF0dHJpYnV0ZSIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZSA9PSBudWxsICYmIGVudiA9PSBudWxsICYmIHJ1bnRpbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSB1cmwsIGZpbGUsIHJlc291cmNlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImVudmlyb25tZW50IG9yIHJ1bnRpbWUgd2hlbiBub3QgdXNpbmcgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibmFtZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIGlmICh1cmwgPT0gbnVsbCAmJiBmaWxlID09IG51bGwgJiYgcmVzb3VyY2UgPT0gbnVsbAorICAgICAgICAgICAgICAgICYmIGVudiA9PSBudWxsICYmIHJ1bnRpbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgdXJsLCBmaWxlLCByZXNvdXJjZSwgZW52aXJvbm1lbnQgb3IgcnVudGltZSB3aGVuIG5vdCB1c2luZyB0aGUgbmFtZSBhdHRyaWJ1dGUiLAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCAmJiBmaWxlID09IG51bGwgJiYgcmVzb3VyY2UgPT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcmVmaXggaXMgb25seSB2YWxpZCB3aGVuIGxvYWRpbmcgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSB1cmwsIGZpbGUgb3IgcmVzb3VyY2UiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiUHJlZml4IGlzIG9ubHkgdmFsaWQgd2hlbiBsb2FkaW5nIGZyb20gYSB1cmwsIGZpbGUgb3IgcmVzb3VyY2UiLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB1bnR5cGVkVmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHJlbGF0aXZlKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmcm9tID0gdW50eXBlZFZhbHVlIGluc3RhbmNlb2YgRmlsZSA/IChGaWxlKXVudHlwZWRWYWx1ZSA6IG5ldyBGaWxlKHVudHlwZWRWYWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmcm9tID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVudHlwZWRWYWx1ZSBpbnN0YW5jZW9mIEZpbGUgPyAoRmlsZSkgdW50eXBlZFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRmlsZSh1bnR5cGVkVmFsdWUudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgdG8gPSBiYXNlZGlyICE9IG51bGwgPyBiYXNlZGlyIDogZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlbFBhdGggPSBGaWxlVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKHRvLCBmcm9tKTsKICAgICAgICAgICAgICAgICAgICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CkBAIC01NjAsNyArNTYyLDcgQEAKICAgICAgICAgICAgIGxvYWRSdW50aW1lKHJ1bnRpbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChuYW1lICE9IG51bGwpICYmIChyZWYgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiByZWYgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0eShuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi5nZXRSZWZlcmVuY2VkT2JqZWN0KGdldFByb2plY3QoKSkudG9TdHJpbmcoKSk7CkBAIC01ODQsMTMgKzU4Niw4IEBACiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBsb2coIkxvYWRpbmcgIiArIHVybCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCkpIHsKICAgICAgICAgICAgICAgICBsb2FkUHJvcGVydGllcyhwcm9wcywgaXMsIHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi54bWwiKSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChpcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYWRkUHJvcGVydGllcyhwcm9wcyk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CkBAIC02MDQsNyArNjAxLDcgQEAKICAgICAgKiBkZWZpbml0aW9uLgogICAgICAqIEBwYXJhbSBwcm9wcyBUaGUgcHJvcGVydHkgb2JqZWN0IHRvIGxvYWQgaW50bwogICAgICAqIEBwYXJhbSBpcyAgICBUaGUgaW5wdXQgc3RyZWFtIGZyb20gd2hlcmUgdG8gbG9hZAotICAgICAqIEBwYXJhbSBpc1htbCA8dHQ+dHJ1ZTwvdHQ+IGlmIHdlIHNob3VsZCB0cnkgdG8gbG9hZCBmcm9tIHhtbAorICAgICAqIEBwYXJhbSBpc1htbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB3ZSBzaG91bGQgdHJ5IHRvIGxvYWQgZnJvbSB4bWwKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICogQHNpbmNlIDEuOC4wCiAgICAgICogQHNlZSAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvcHJvcGVydGllcy5kdGQiCkBAIC02MzEsMTIgKzYyOCw4IEBACiAgICAgICAgIGxvZygiTG9hZGluZyAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAoZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSAgZmlzID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgbG9hZFByb3BlcnRpZXMocHJvcHMsIGZpcywgZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi54bWwiKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZpcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFkZFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY1NSwzNCArNjQ4LDIwIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgbG9hZFJlc291cmNlKFN0cmluZyBuYW1lKSB7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBsb2coIlJlc291cmNlIExvYWRpbmcgIiArIG5hbWUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgIENsYXNzTG9hZGVyIGNMID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBjbGVhbnVwID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbGVhbnVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBjTCA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpOworICAgICAgICBDbGFzc0xvYWRlciBjTCA9IChjbGFzc3BhdGggPT0gbnVsbCkgPyB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKQorICAgICAgICAgICAgICAgIDogZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSAoY0wgPT0gbnVsbCkgPyBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKG5hbWUpCisgICAgICAgICAgICAgICAgOiBjTC5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2UgIiArIG5hbWUsIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjTCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY0wgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShuYW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBjTC5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGxvYWRQcm9wZXJ0aWVzKHByb3BzLCBpcywgbmFtZS5lbmRzV2l0aCgiLnhtbCIpKTsKICAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKHByb3BzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gZmluZCByZXNvdXJjZSAiICsgbmFtZSwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzKTsKLSAgICAgICAgICAgIGlmIChjbGVhbnVwICYmIGNMICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCAmJiBjTCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgKChBbnRDbGFzc0xvYWRlcikgY0wpLmNsZWFudXAoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjk4LDkgKzY3Nyw4IEBACiAgICAgICAgICAgICBwcmVmaXggKz0gIi4iOwogICAgICAgICB9CiAgICAgICAgIGxvZygiTG9hZGluZyBFbnZpcm9ubWVudCAiICsgcHJlZml4LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgTWFwIG9zRW52ID0gRXhlY3V0ZS5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGUgPSBvc0Vudi5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGUuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgZS5uZXh0KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3NFbnYgPSBFeGVjdXRlLmdldEVudmlyb25tZW50VmFyaWFibGVzKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG9zRW52LmVudHJ5U2V0KCkpIHsKICAgICAgICAgICAgIHByb3BzLnB1dChwcmVmaXggKyBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgYWRkUHJvcGVydGllcyhwcm9wcyk7CkBAIC03MDksNyArNjg3LDcgQEAKICAgICAvKioKICAgICAgKiBsb2FkIHRoZSBydW50aW1lIHZhbHVlcwogICAgICAqIEBwYXJhbSBwcmVmaXggcHJlZml4IHRvIHBsYWNlIGJlZm9yZSB0aGVtCi0gICAgICogQHNpbmNlIDEuOS4xMgorICAgICAqIEBzaW5jZSAxLjEwLjQKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkUnVudGltZShTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwpAQCAtNzMxLDE4ICs3MDksMTcgQEAKICAgICAgKiBAcGFyYW0gcHJvcHMgdGhlIHByb3BlcnRpZXMgdG8gaXRlcmF0ZSBvdmVyCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0gICAgICAgIEhhc2hNYXAgbSA9IG5ldyBIYXNoTWFwKHByb3BzKTsKLSAgICAgICAgcmVzb2x2ZUFsbFByb3BlcnRpZXMobSk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBtLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBrID0gaXQubmV4dCgpOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BzLmZvckVhY2goKGssIHYpIC0+IHsKICAgICAgICAgICAgIGlmIChrIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGs7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IHByZWZpeCArIHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkUHJvcGVydHkocHJvcGVydHlOYW1lLCBtLmdldChrKSk7CisgICAgICAgICAgICAgICAgbS5wdXQoKFN0cmluZykgaywgdik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJlc29sdmVBbGxQcm9wZXJ0aWVzKG0pOworICAgICAgICBtLmZvckVhY2goKGssIHYpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSBwcmVmaXggPT0gbnVsbCA/IGsgOiBwcmVmaXggKyBrOworICAgICAgICAgICAgYWRkUHJvcGVydHkocHJvcGVydHlOYW1lLCB2KTsKKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NzcsNyArNzU0LDcgQEAKICAgICAgKiByZXNvbHZlIHByb3BlcnRpZXMgaW5zaWRlIGEgcHJvcGVydGllcyBoYXNodGFibGUKICAgICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyBvYmplY3QgdG8gcmVzb2x2ZQogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZXNvbHZlQWxsUHJvcGVydGllcyhNYXAgcHJvcHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVBbGxQcm9wZXJ0aWVzKE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyCiAgICAgICAgICAgICA9IFByb3BlcnR5SGVscGVyLmdldFByb3BlcnR5SGVscGVyKGdldFByb2plY3QoKSk7CiAgICAgICAgIG5ldyBSZXNvbHZlUHJvcGVydHlNYXAoCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eUhlbHBlclRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5SGVscGVyVGFzay5qYXZhCmluZGV4IDVlODg2N2EuLjI3YmY3MTUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5SGVscGVyVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5SGVscGVyVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC02OSw3ICs2OCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlcjsKLSAgICBwcml2YXRlIExpc3QgZGVsZWdhdGVzOworICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGRlbGVnYXRlczsKIAogICAgIC8qKgogICAgICAqIEFkZCBhIG5ldyBQcm9wZXJ0eUhlbHBlciB0byBiZSBzZXQgb24gdGhlIFByb2plY3QuCkBAIC0xMDQsMTMgKzEwMywxNCBAQAogICAgICAqIEV4ZWN1dGUgdGhlIHRhc2suCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2plY3QgaW5zdGFuY2Ugbm90IHNldCIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwcm9wZXJ0eUhlbHBlciA9PSBudWxsICYmIGRlbGVnYXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVpdGhlciBhIG5ldyBQcm9wZXJ0eUhlbHBlciIKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9yIG9uZSBvciBtb3JlIFByb3BlcnR5SGVscGVyIGRlbGVnYXRlcyBhcmUgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRWl0aGVyIGEgbmV3IFByb3BlcnR5SGVscGVyIG9yIG9uZSBvciBtb3JlIFByb3BlcnR5SGVscGVyIGRlbGVnYXRlcyBhcmUgcmVxdWlyZWQiKTsKICAgICAgICAgfQogICAgICAgICBQcm9wZXJ0eUhlbHBlciBwaCA9IHByb3BlcnR5SGVscGVyOwogICAgICAgICBpZiAocGggPT0gbnVsbCkgewpAQCAtMTIwLDggKzEyMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3luY2hyb25pemVkIChwaCkgewogICAgICAgICAgICAgaWYgKGRlbGVnYXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gZGVsZWdhdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgbyA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiBkZWxlZ2F0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlIZWxwZXIuRGVsZWdhdGUgZGVsZWdhdGUgPSBvIGluc3RhbmNlb2YgRGVsZWdhdGVFbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKERlbGVnYXRlRWxlbWVudCkgbykucmVzb2x2ZSgpIDogKFByb3BlcnR5SGVscGVyLkRlbGVnYXRlKSBvOwogICAgICAgICAgICAgICAgICAgICBsb2coIkFkZGluZyBQcm9wZXJ0eUhlbHBlciBkZWxlZ2F0ZSAiICsgZGVsZWdhdGUsIFByb2plY3QuTVNHX0RFQlVHKTsKQEAgLTEzNiw5ICsxMzUsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBZGREZWxlZ2F0ZUxpc3QoKSB7CisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdDxPYmplY3Q+IGdldEFkZERlbGVnYXRlTGlzdCgpIHsKICAgICAgICAgaWYgKGRlbGVnYXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgICAgICBkZWxlZ2F0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZGVsZWdhdGVzOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QdW1wU3RyZWFtSGFuZGxlci5qYXZhCmluZGV4IGU3ZDI0YzcuLjBhODU2Y2IgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1B1bXBTdHJlYW1IYW5kbGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHVtcFN0cmVhbUhhbmRsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlci5qYXZhCmluZGV4IDI2NDBlOTAuLjA1YmViOGUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY3LDggKzY3LDcgQEAKICAgICAvKiogU3RyaXAgdGFzayBiYW5uZXJzIGlmIHRydWUuICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBlbWFjc01vZGUgPSBmYWxzZTsKICAgICAvKiogVGhlIGxpc3Qgb2YgcmVjb3JkZXIgZW50cmllcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBSZWNvcmRlckVudHJ5PiByZWNvcmRlckVudHJpZXMKLSAgICAgICAgICAgID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFJlY29yZGVyRW50cnk+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgUmVjb3JkZXJFbnRyeT4gcmVjb3JkZXJFbnRyaWVzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ09OU1RSVUNUT1JTIC8gSU5JVElBTElaRVJTCkBAIC0xNTgsNyArMTU3LDcgQEAKICAgICAgICAgcmVjb3JkZXIuc2V0TWVzc2FnZU91dHB1dExldmVsKGxvZ2xldmVsKTsKICAgICAgICAgcmVjb3JkZXIuc2V0RW1hY3NNb2RlKGVtYWNzTW9kZSk7CiAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnQuYm9vbGVhblZhbHVlKCkpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCkgewogICAgICAgICAgICAgICAgIHJlY29yZGVyLnJlb3BlbkZpbGUoKTsKICAgICAgICAgICAgICAgICByZWNvcmRlci5zZXRSZWNvcmRTdGF0ZShzdGFydCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjE1LDcgKzIxNCw3IEBACiAgICAgICAgICAgICBpZiAoYXBwZW5kID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBlbnRyeS5vcGVuRmlsZShmYWxzZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGVudHJ5Lm9wZW5GaWxlKGFwcGVuZC5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZW50cnkub3BlbkZpbGUoYXBwZW5kKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVudHJ5LnNldFByb2plY3QocHJvaik7CiAgICAgICAgICAgICByZWNvcmRlckVudHJpZXMucHV0KG5hbWUsIGVudHJ5KTsKQEAgLTMwNiwxNiArMzA1LDggQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJpdmF0ZSB2b2lkIGNsZWFudXAoKSB7Ci0gICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIFJlY29yZGVyRW50cnk+IGVudHJpZXMKLSAgICAgICAgICAgICAgICA9IChIYXNodGFibGU8U3RyaW5nLCBSZWNvcmRlckVudHJ5PikgcmVjb3JkZXJFbnRyaWVzLmNsb25lKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUmVjb3JkZXJFbnRyeT4gZW50cnkgOiBlbnRyaWVzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFJlY29yZGVyRW50cnkgcmUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHJlLmdldFByb2plY3QoKSA9PSBnZXRQcm9qZWN0KCkpIHsKLSAgICAgICAgICAgICAgICByZWNvcmRlckVudHJpZXMucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZWNvcmRlckVudHJpZXMuZW50cnlTZXQoKS5yZW1vdmVJZihlIC0+IGUuZ2V0VmFsdWUoKS5nZXRQcm9qZWN0KCkgPT0gZ2V0UHJvamVjdCgpKTsKICAgICAgICAgZ2V0UHJvamVjdCgpLnJlbW92ZUJ1aWxkTGlzdGVuZXIodGhpcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJFbnRyeS5qYXZhCmluZGV4IGFkYmIyNjUuLjYyMjM3ZWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyRW50cnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlckVudHJ5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw5ICsxNyw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMjcsNyArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5TdWJCdWlsZExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogVGhpcyBpcyBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHJlY29yZGVyLiBUaGlzIGlzIHRoZSBsaXN0ZW5lciB0byB0aGUKQEAgLTg0LDcgKzg0LDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRSZWNvcmRTdGF0ZShCb29sZWFuIHN0YXRlKSB7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmbHVzaCgpOwotICAgICAgICAgICAgcmVjb3JkID0gc3RhdGUuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICByZWNvcmQgPSBzdGF0ZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA3LDEwICsxMDcsOSBAQAogICAgICAgICAgICAgVGhyb3dhYmxlIGVycm9yID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7CiAKICAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oU3RyaW5nVXRpbHMuTElORV9TRVAgKyAiQlVJTEQgU1VDQ0VTU0ZVTCIpOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVuQlVJTEQgU1VDQ0VTU0ZVTCIpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oU3RyaW5nVXRpbHMuTElORV9TRVAgKyAiQlVJTEQgRkFJTEVEIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIiVuQlVJTEQgRkFJTEVEJW4iKSk7CiAgICAgICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKG91dCk7IC8vTk9TT05BUgogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDgsOCArMTQ3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgbG9nKCI+PiBUQVJHRVQgU1RBUlRFRCAtLSAiICsgZXZlbnQuZ2V0VGFyZ2V0KCksIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgbG9nKFN0cmluZ1V0aWxzLkxJTkVfU0VQICsgZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpICsgIjoiLAotICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgIGxvZyhTdHJpbmcuZm9ybWF0KCIlbiVzOiIsIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSksIFByb2plY3QuTVNHX0lORk8pOwogICAgICAgICB0YXJnZXRTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICB9CiAKQEAgLTM1Nyw3ICszNTUsNyBAQAogICAgIHByaXZhdGUgdm9pZCBvcGVuRmlsZUltcGwoYm9vbGVhbiBhcHBlbmQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChvdXQgPT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUsIGFwcGVuZCkpOworICAgICAgICAgICAgICAgIG91dCA9IG5ldyBQcmludFN0cmVhbShGaWxlVXRpbHMubmV3T3V0cHV0U3RyZWFtKFBhdGhzLmdldChmaWxlbmFtZSksIGFwcGVuZCkpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9ibGVtcyBvcGVuaW5nIGZpbGUgdXNpbmcgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlY29yZGVyIGVudHJ5IiwgaW9lKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlZGlyZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlZGlyZWN0b3IuamF2YQppbmRleCA5ODcxZDE2Li5lZTkxYWRiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWRpcmVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVkaXJlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzEsNiArMzEsNyBAQAogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtNDYsNyArNDcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtUmVkaXJlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLk91dHB1dFN0cmVhbUZ1bm5lbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVhZGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlRlZU91dHB1dFN0cmVhbTsKIAogLyoqCkBAIC01NDksMjQgKzU0OSwxMiBAQAogICAgICAqICAgICAgICAgICAgY29udGFpbnMgdGhlIHByb3BlcnR5IHZhbHVlLgogICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKICAgICAgKiAgICAgICAgICAgIHRoZSBwcm9wZXJ0eSBuYW1lLgotICAgICAqCi0gICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgcmVhZCBmb3JtIHRoZSBzdHJlYW0uCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNldFByb3BlcnR5RnJvbUJBT1MoZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoRXhlY3V0ZQotICAgICAgICAgICAgICAgIC50b1N0cmluZyhiYW9zKSkpOwotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciB2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHZhbC5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICBtYW5hZ2luZ1Rhc2suZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihFeGVjdXRlLnRvU3RyaW5nKGJhb3MpKSk7CisgICAgICAgIG1hbmFnaW5nVGFzay5nZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgIGluLmxpbmVzKCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU4NSw3ICs1NzMsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKG91dHB1dEZpbHRlckNoYWlucyAhPSBudWxsICYmIG91dHB1dEZpbHRlckNoYWlucy5zaXplKCkgPiAwKQotICAgICAgICAgICAgICAgICAgICB8fCAhKG91dHB1dEVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoaW5wdXRFbmNvZGluZykpKSB7CisgICAgICAgICAgICAgICAgICAgIHx8ICFvdXRwdXRFbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKGlucHV0RW5jb2RpbmcpKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGVhZFBpcGVJbnB1dFN0cmVhbSBzbmsgPSBuZXcgTGVhZFBpcGVJbnB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICBzbmsuc2V0TWFuYWdpbmdDb21wb25lbnQobWFuYWdpbmdUYXNrKTsKQEAgLTYyNyw3ICs2MTUsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKGVycm9yRmlsdGVyQ2hhaW5zICE9IG51bGwgJiYgZXJyb3JGaWx0ZXJDaGFpbnMuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgfHwgIShlcnJvckVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoaW5wdXRFbmNvZGluZykpKSB7CisgICAgICAgICAgICAgICAgICAgIHx8ICFlcnJvckVuY29kaW5nLmVxdWFsc0lnbm9yZUNhc2UoaW5wdXRFbmNvZGluZykpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBMZWFkUGlwZUlucHV0U3RyZWFtIHNuayA9IG5ldyBMZWFkUGlwZUlucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgICAgIHNuay5zZXRNYW5hZ2luZ0NvbXBvbmVudChtYW5hZ2luZ1Rhc2spOwpAQCAtNjc0LDggKzY2Miw3IEBACiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXllT2hFeCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXllT2hFeCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICgoQ29uY2F0RmlsZUlucHV0U3RyZWFtKSBpbnB1dFN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYW5hZ2luZ0NvbXBvbmVudChtYW5hZ2luZ1Rhc2spOworICAgICAgICAgICAgICAgICgoQ29uY2F0RmlsZUlucHV0U3RyZWFtKSBpbnB1dFN0cmVhbSkuc2V0TWFuYWdpbmdDb21wb25lbnQobWFuYWdpbmdUYXNrKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRTdHJpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJVc2luZyBpbnB1dCAiKTsKICAgICAgICAgICAgICAgICBpZiAobG9nSW5wdXRTdHJpbmcpIHsKQEAgLTcwOCw5ICs2OTUsOCBAQAogICAgIC8qKiBvdXRTdHJlYW1zICovCiAgICAgcHJpdmF0ZSB2b2lkIG91dFN0cmVhbXMoKSB7CiAgICAgICAgIGlmIChvdXQgIT0gbnVsbCAmJiBvdXQubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvZ0hlYWQgPSBuZXcgU3RyaW5nQnVmZmVyKCJPdXRwdXQgIikuYXBwZW5kKAotICAgICAgICAgICAgICAgICAgICAoKGFwcGVuZE91dCkgPyAiYXBwZW5kZWQiIDogInJlZGlyZWN0ZWQiKSkuYXBwZW5kKCIgdG8gIikKLSAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9nSGVhZCA9ICJPdXRwdXQgIgorICAgICAgICAgICAgICAgICAgICArICgoYXBwZW5kT3V0KSA/ICJhcHBlbmRlZCIgOiAicmVkaXJlY3RlZCIpICsgIiB0byAiOwogICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gZm9sZEZpbGVzKG91dCwgbG9nSGVhZCwgUHJvamVjdC5NU0dfVkVSQk9TRSwKICAgICAgICAgICAgICAgICAgICAgYXBwZW5kT3V0LCBjcmVhdGVFbXB0eUZpbGVzT3V0KTsKICAgICAgICAgfQpAQCAtNzMxLDkgKzcxNyw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgZXJyb3JTdHJlYW1zKCkgewogICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCAmJiBlcnJvci5sZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9nSGVhZCA9IG5ldyBTdHJpbmdCdWZmZXIoIkVycm9yICIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICAgICAgKChhcHBlbmRFcnIpID8gImFwcGVuZGVkIiA6ICJyZWRpcmVjdGVkIikpLmFwcGVuZCgiIHRvICIpCi0gICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvZ0hlYWQgPSAiRXJyb3IgIgorICAgICAgICAgICAgICAgICAgICArICgoYXBwZW5kRXJyKSA/ICJhcHBlbmRlZCIgOiAicmVkaXJlY3RlZCIpICsgIiB0byAiOwogICAgICAgICAgICAgZXJyb3JTdHJlYW0gPSBmb2xkRmlsZXMoZXJyb3IsIGxvZ0hlYWQsIFByb2plY3QuTVNHX1ZFUkJPU0UsCiAgICAgICAgICAgICAgICAgICAgIGFwcGVuZEVyciwgY3JlYXRlRW1wdHlGaWxlc0Vycik7CiAgICAgICAgIH0gZWxzZSBpZiAoIShsb2dFcnJvciB8fCBvdXRwdXRTdHJlYW0gPT0gbnVsbCkgJiYgZXJyb3JQcm9wZXJ0eSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCmluZGV4IGNjZTc0ZTIuLmIzMmZlNDMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZS5qYXZhCmluZGV4IDEyODkzM2YuLjY2Y2RlZjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlcGxhY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CkBAIC0zMCw4ICsyOCw4IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC00Niw3ICs0NCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuVW5pb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmVhbVV0aWxzOwogCiAvKioKICAqIFJlcGxhY2VzIGFsbCBvY2N1cnJlbmNlcyBvZiBvbmUgb3IgbW9yZSBzdHJpbmcgdG9rZW5zIHdpdGggZ2l2ZW4KQEAgLTcwLDcgKzY4LDcgQEAKICAgICBwcml2YXRlIFJlc291cmNlIHByb3BlcnR5UmVzb3VyY2UgPSBudWxsOwogICAgIHByaXZhdGUgUmVzb3VyY2UgcmVwbGFjZUZpbHRlclJlc291cmNlID0gbnVsbDsKICAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UmVwbGFjZWZpbHRlcj4gcmVwbGFjZWZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PFJlcGxhY2VmaWx0ZXI+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFJlcGxhY2VmaWx0ZXI+IHJlcGxhY2VmaWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwcml2YXRlIEZpbGUgZGlyID0gbnVsbDsKIApAQCAtMTQ2LDM5ICsxNDQsMzQgQEAKICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgLy9WYWxpZGF0ZSBtYW5kYXRvcnkgYXR0cmlidXRlcwogICAgICAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJ0b2tlbiBpcyBhIG1hbmRhdG9yeSBmb3IgcmVwbGFjZWZpbHRlci4iOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJ0b2tlbiBpcyBhIG1hbmRhdG9yeSBmb3IgcmVwbGFjZWZpbHRlci4iKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyh0b2tlbi5nZXRUZXh0KCkpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIHRva2VuIG11c3Qgbm90IGJlIGFuIGVtcHR5ICIKLSAgICAgICAgICAgICAgICAgICAgKyAic3RyaW5nLiI7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgaWYgKHRva2VuLmdldFRleHQoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgdG9rZW4gbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLiIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL3ZhbHVlIGFuZCBwcm9wZXJ0eSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIGlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHByb3BlcnR5ICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRWl0aGVyIHZhbHVlIG9yIHByb3BlcnR5ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiY2FuIGJlIHNwZWNpZmllZCwgYnV0IGEgcmVwbGFjZWZpbHRlciAiCi0gICAgICAgICAgICAgICAgICAgICsgImVsZW1lbnQgY2Fubm90IGhhdmUgYm90aC4iOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFaXRoZXIgdmFsdWUgb3IgcHJvcGVydHkgY2FuIGJlIHNwZWNpZmllZCwgYnV0IGEgcmVwbGFjZWZpbHRlciBlbGVtZW50IGNhbm5vdCBoYXZlIGJvdGguIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgocHJvcGVydHkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy90aGUgcHJvcGVydHkgYXR0cmlidXRlIG11c3QgaGF2ZSBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBmaWxlCiAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5UmVzb3VyY2UgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJUaGUgcmVwbGFjZWZpbHRlcidzIHByb3BlcnR5IGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIHJlcGxhY2V0YXNrJ3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJvcGVydHlGaWxlL1Jlc291cmNlIGF0dHJpYnV0ZS4iOwotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgcmVwbGFjZWZpbHRlcidzIHByb3BlcnR5IGF0dHJpYnV0ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIHJlcGxhY2V0YXNrJ3MgcHJvcGVydHlGaWxlL1Jlc291cmNlIGF0dHJpYnV0ZS4iKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvL01ha2Ugc3VyZSBwcm9wZXJ0eSBleGlzdHMgaW4gcHJvcGVydHkgZmlsZQogICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgfHwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJwcm9wZXJ0eSBcIiIgKyBwcm9wZXJ0eQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgd2FzIG5vdCBmb3VuZCBpbiAiICsgcHJvcGVydHlSZXNvdXJjZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5IFwiJXNcIiB3YXMgbm90IGZvdW5kIGluICVzIiwgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVJlc291cmNlLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xOTIsMTQgKzE4NSwxNSBAQAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcGxhY2VWYWx1ZSgpIHsKICAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoUmVwbGFjZS50aGlzLnZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmVwbGFjZS50aGlzLnZhbHVlLmdldFRleHQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9EZWZhdWx0IGlzIGVtcHR5IHN0cmluZwotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmdldFRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChSZXBsYWNlLnRoaXMudmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXBsYWNlLnRoaXMudmFsdWUuZ2V0VGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9EZWZhdWx0IGlzIGVtcHR5IHN0cmluZworICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yOTEsNyArMjg1LDcgQEAKICAgICAgICAgICogVGhlIGZpbHRlciBleHBlY3RzIGZyb20gdGhlIGNvbXBvbmVudCBwcm92aWRpbmcgdGhlIGlucHV0IHRoYXQgZGF0YQogICAgICAgICAgKiBpcyBvbmx5IGFkZGVkIGJ5IHRoYXQgY29tcG9uZW50IHRvIHRoZSBlbmQgb2YgdGhpcyBTdHJpbmdCdWZmZXIuCiAgICAgICAgICAqIFRoaXMgU3RyaW5nQnVmZmVyIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhpcyBmaWx0ZXIsIGFuZCBleHBlY3RzIHRoYXQKLSAgICAgICAgICogYW5vdGhlciBjb21wb25lbnQgd2lsbCBvbmx5IGFkZGVkIHRvIHRoaXMgU3RyaW5nQnVmZmVyLgorICAgICAgICAgKiBhbm90aGVyIGNvbXBvbmVudCB3aWxsIG9ubHkgYXBwZW5kIHRvIHRoaXMgU3RyaW5nQnVmZmVyLgogICAgICAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IGZvciB0aGlzIGZpbHRlci4KICAgICAgICAgICovCiAgICAgICAgIHZvaWQgc2V0SW5wdXRCdWZmZXIoU3RyaW5nQnVmZmVyIGlucHV0KSB7CkBAIC0zMTAsNyArMzA0LDcgQEAKICAgICAgICAgICAgIFN0cmluZyB0ID0gZ2V0VG9rZW4oKTsKICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlci5sZW5ndGgoKSA+IHQubGVuZ3RoKCkpIHsKICAgICAgICAgICAgICAgICBpbnQgcG9zID0gcmVwbGFjZSgpOwotICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWF4KChpbnB1dEJ1ZmZlci5sZW5ndGgoKSAtIHQubGVuZ3RoKCkpLCBwb3MpOworICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWF4KGlucHV0QnVmZmVyLmxlbmd0aCgpIC0gdC5sZW5ndGgoKSwgcG9zKTsKICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXIuYXBwZW5kKGlucHV0QnVmZmVyLnN1YnN0cmluZygwLCBwb3MpKTsKICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5kZWxldGUoMCwgcG9zKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM1NSwxMiArMzQ5LDEzIEBACiAgICAgICogYSBTdHJpbmdCdWZmZXIuIENvbXBhdGlibGUgd2l0aCB0aGUgUmVwbGFjZWZpbHRlci4KICAgICAgKiBAc2luY2UgMS43CiAgICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBGaWxlSW5wdXQgLyogSkRLIDU6IGltcGxlbWVudHMgQ2xvc2VhYmxlICovIHsKKyAgICBwcml2YXRlIGNsYXNzIEZpbGVJbnB1dCBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRl9TSVpFID0gNDA5NjsKKwogICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXI7CiAgICAgICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaXM7CiAgICAgICAgIHByaXZhdGUgUmVhZGVyIHJlYWRlcjsKICAgICAgICAgcHJpdmF0ZSBjaGFyW10gYnVmZmVyOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRl9TSVpFID0gNDA5NjsKIAogICAgICAgICAvKioKICAgICAgICAgICogQ29uc3RydWN0cyB0aGUgaW5wdXQgY29tcG9uZW50LiBPcGVucyB0aGUgZmlsZSBmb3IgcmVhZGluZy4KQEAgLTM3MCw5ICszNjUsMTEgQEAKICAgICAgICAgRmlsZUlucHV0KEZpbGUgc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgYnVmZmVyID0gbmV3IGNoYXJbQlVGRl9TSVpFXTsKLSAgICAgICAgICAgIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpOworICAgICAgICAgICAgaXMgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShzb3VyY2UudG9QYXRoKCkpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZW5jb2RpbmcgIT0gbnVsbCA/IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpIDogbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAhPSBudWxsID8gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CiAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOwpAQCAtMzk1LDggKzM5Miw3IEBACiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gV2hlbiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVhZCBmcm9tLgogICAgICAgICAgKi8KICAgICAgICAgYm9vbGVhbiByZWFkQ2h1bmsoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgaW50IGJ1ZmZlckxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBidWZmZXJMZW5ndGggPSByZWFkZXIucmVhZChidWZmZXIpOworICAgICAgICAgICAgaW50IGJ1ZmZlckxlbmd0aCA9IHJlYWRlci5yZWFkKGJ1ZmZlcik7CiAgICAgICAgICAgICBpZiAoYnVmZmVyTGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KQEAgLTQwOCw2ICs0MDQsNyBAQAogICAgICAgICAgKiBDbG9zZXMgdGhlIGZpbGUuCiAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gV2hlbiB0aGUgZmlsZSBjYW5ub3QgYmUgY2xvc2VkLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTQxOSw3ICs0MTYsNyBAQAogICAgICAqIFJlcGxhY2VmaWx0ZXIuCiAgICAgICogQHNpbmNlIDEuNwogICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgRmlsZU91dHB1dCAvKiBKREsgNTogaW1wbGVtZW50cyBDbG9zZWFibGUgKi8geworICAgIHByaXZhdGUgY2xhc3MgRmlsZU91dHB1dCBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUgewogICAgICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBpbnB1dEJ1ZmZlcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3M7CiAgICAgICAgIHByaXZhdGUgV3JpdGVyIHdyaXRlcjsKQEAgLTQzMCw5ICs0MjcsMTEgQEAKICAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBXaGVuIHRoZSBmaWxlIGNhbm5vdCBiZSByZWFkIGZyb20uCiAgICAgICAgICAqLwogICAgICAgICBGaWxlT3V0cHV0KEZpbGUgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpOworICAgICAgICAgICAgb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ob3V0LnRvUGF0aCgpKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKGVuY29kaW5nICE9IG51bGwgPyBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCBlbmNvZGluZykgOiBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAhPSBudWxsID8gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcywgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MpKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CkBAIC00NzgsNiArNDc3LDcgQEAKICAgICAgICAgICogQ2xvc2VzIHRoZSBmaWxlLgogICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIGNsb3NlZC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBvcy5jbG9zZSgpOwogICAgICAgICB9CkBAIC00ODgsOSArNDg4LDkgQEAKICAgICAgKiBEbyB0aGUgZXhlY3V0aW9uLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgd2UgY2FuJ3QgYnVpbGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBBcnJheUxpc3Qgc2F2ZWRGaWx0ZXJzID0gKEFycmF5TGlzdCkgcmVwbGFjZWZpbHRlcnMuY2xvbmUoKTsKKyAgICAgICAgTGlzdDxSZXBsYWNlZmlsdGVyPiBzYXZlZEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4ocmVwbGFjZWZpbHRlcnMpOwogICAgICAgICBQcm9wZXJ0aWVzIHNhdmVkUHJvcGVydGllcyA9CiAgICAgICAgICAgICBwcm9wZXJ0aWVzID09IG51bGwgPyBudWxsIDogKFByb3BlcnRpZXMpIHByb3BlcnRpZXMuY2xvbmUoKTsKIApAQCAtNDk4LDEyICs0OTgsMTIgQEAKICAgICAgICAgICAgIC8vIGxpbmUgc2VwYXJhdG9ycyBpbiB2YWx1ZXMgYW5kIHRva2VucyBhcmUgIlxuIgogICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gY29tcGFyZSB3aXRoIHRoZSBmaWxlIGNvbnRlbnRzLCByZXBsYWNlIHRoZW0KICAgICAgICAgICAgIC8vIGFzIG5lZWRlZAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIodmFsdWUuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsID0gbmV3IFN0cmluZ0J1aWxkZXIodmFsdWUuZ2V0VGV4dCgpKTsKICAgICAgICAgICAgIHN0cmluZ1JlcGxhY2UodmFsLCAiXHJcbiIsICJcbiIpOwotICAgICAgICAgICAgc3RyaW5nUmVwbGFjZSh2YWwsICJcbiIsIFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciB0b2sgPSBuZXcgU3RyaW5nQnVmZmVyKHRva2VuLmdldFRleHQoKSk7CisgICAgICAgICAgICBzdHJpbmdSZXBsYWNlKHZhbCwgIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHRvayA9IG5ldyBTdHJpbmdCdWlsZGVyKHRva2VuLmdldFRleHQoKSk7CiAgICAgICAgICAgICBzdHJpbmdSZXBsYWNlKHRvaywgIlxyXG4iLCAiXG4iKTsKLSAgICAgICAgICAgIHN0cmluZ1JlcGxhY2UodG9rLCAiXG4iLCBTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBzdHJpbmdSZXBsYWNlKHRvaywgIlxuIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGZpcnN0RmlsdGVyID0gY3JlYXRlUHJpbWFyeWZpbHRlcigpOwogICAgICAgICAgICAgZmlyc3RGaWx0ZXIuc2V0VG9rZW4odG9rLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgZmlyc3RGaWx0ZXIuc2V0VmFsdWUodmFsLnRvU3RyaW5nKCkpOwpAQCAtNTExLDE0ICs1MTEsMTIgQEAKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKHJlcGxhY2VGaWx0ZXJSZXNvdXJjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGdldFByb3BlcnRpZXMocmVwbGFjZUZpbHRlclJlc291cmNlKTsKLSAgICAgICAgICAgICAgICBJdGVyYXRvciBlID0gZ2V0T3JkZXJlZEl0ZXJhdG9yKHByb3BzKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRvayA9IGUubmV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydGllcyhyZXBsYWNlRmlsdGVyUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIFN0cmVhbVV0aWxzLml0ZXJhdG9yQXNTdHJlYW0oZ2V0T3JkZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMpKS5mb3JFYWNoKHRvayAtPiB7CiAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VmaWx0ZXIgcmVwbGFjZUZpbHRlciA9IGNyZWF0ZVJlcGxhY2VmaWx0ZXIoKTsKICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUZpbHRlci5zZXRUb2tlbih0b2spOwotICAgICAgICAgICAgICAgICAgICByZXBsYWNlRmlsdGVyLnNldFZhbHVlKHByb3BzLmdldFByb3BlcnR5KHRvaykpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUZpbHRlci5zZXRWYWx1ZShwcm9wZXJ0aWVzLmdldFByb3BlcnR5KHRvaykpOworICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKQEAgLTUzNywxOSArNTM1LDE1IEBACiAKICAgICAgICAgICAgIGlmIChkaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKGRpcik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc3JjcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Jjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIHNyY3NbaV0pOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHNyYyA6IGRzLmdldEluY2x1ZGVkRmlsZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXIsIHNyYyk7CiAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKGZpbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByIDogcmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVQcm92aWRlciBmcCA9Ci0gICAgICAgICAgICAgICAgICAgIHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUoZnAuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUoci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpLmdldEZpbGUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC01NzUsMjMgKzU2OSwyNCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzb3VyY2VGaWxlID09IG51bGwgJiYgZGlyID09IG51bGwgJiYgcmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVpdGhlciB0aGUgZmlsZSBvciB0aGUgZGlyIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgKyAib3IgbmVzdGVkIHJlc291cmNlcyBtdXN0IGJlIHNwZWNpZmllZCI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkVpdGhlciB0aGUgZmlsZSBvciB0aGUgZGlyIGF0dHJpYnV0ZSBvciBuZXN0ZWQgcmVzb3VyY2VzIG11c3QgYmUgc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHJvcGVydHlSZXNvdXJjZSAhPSBudWxsICYmICFwcm9wZXJ0eVJlc291cmNlLmlzRXhpc3RzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlByb3BlcnR5IGZpbGUgIiArIHByb3BlcnR5UmVzb3VyY2UuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0LiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5IGZpbGUgIgorICAgICAgICAgICAgICAgICsgcHJvcGVydHlSZXNvdXJjZS5nZXROYW1lKCkgKyAiIGRvZXMgbm90IGV4aXN0LiIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwgJiYgcmVwbGFjZWZpbHRlcnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVpdGhlciB0b2tlbiBvciBhIG5lc3RlZCByZXBsYWNlZmlsdGVyICIKLSAgICAgICAgICAgICAgICArICJtdXN0IGJlIHNwZWNpZmllZCI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsICYmIHJlcGxhY2VmaWx0ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJFaXRoZXIgdG9rZW4gb3IgYSBuZXN0ZWQgcmVwbGFjZWZpbHRlciBtdXN0IGJlIHNwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuICE9IG51bGwgJiYgIiIuZXF1YWxzKHRva2VuLmdldFRleHQoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSB0b2tlbiBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIGlmICh0b2tlbiAhPSBudWxsICYmIHRva2VuLmdldFRleHQoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIHRva2VuIGF0dHJpYnV0ZSBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjAzLDEyICs1OTgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlUmVwbGFjZWZpbHRlcnMoKQogICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSByZXBsYWNlZmlsdGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBSZXBsYWNlZmlsdGVyIGVsZW1lbnQgPQotICAgICAgICAgICAgICAgIChSZXBsYWNlZmlsdGVyKSByZXBsYWNlZmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBlbGVtZW50LnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVwbGFjZWZpbHRlcnMuZm9yRWFjaChSZXBsYWNlZmlsdGVyOjp2YWxpZGF0ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MzIsMTggKzYyMiwxMiBAQAogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKIAotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbiA9IHByb3BlcnR5UmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IHByb3BlcnR5UmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSkgewogICAgICAgICAgICAgcHJvcHMubG9hZChpbik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlByb3BlcnR5IHJlc291cmNlICgiICsgcHJvcGVydHlSZXNvdXJjZS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICArICIpIGNhbm5vdCBiZSBsb2FkZWQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5IHJlc291cmNlICglcykgY2Fubm90IGJlIGxvYWRlZC4iLAorICAgICAgICAgICAgICAgIHByb3BlcnR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBwcm9wczsKICAgICB9CiAKQEAgLTY2OCwyNiArNjUyLDE5IEBACiAgICAgICAgICAgICBGaWxlIHRlbXAgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKGdldFByb2plY3QoKSwgInJlcCIsICIudG1wIiwKICAgICAgICAgICAgICAgICAgICAgc3JjLmdldFBhcmVudEZpbGUoKSwgZmFsc2UsIHRydWUpOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlSW5wdXQgaW4gPSBuZXcgRmlsZUlucHV0KHNyYyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZU91dHB1dCBvdXQgPSBuZXcgRmlsZU91dHB1dCh0ZW1wKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5zZXRJbnB1dEJ1ZmZlcihidWlsZEZpbHRlckNoYWluKGluLmdldE91dHB1dEJ1ZmZlcigpKSk7CisgICAgICAgICAgICAgICAgdHJ5IChGaWxlSW5wdXQgaW4gPSBuZXcgRmlsZUlucHV0KHNyYyk7CisgICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0IG91dCA9IG5ldyBGaWxlT3V0cHV0KHRlbXApKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5zZXRJbnB1dEJ1ZmZlcihidWlsZEZpbHRlckNoYWluKGluLmdldE91dHB1dEJ1ZmZlcigpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpbi5yZWFkQ2h1bmsoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzRmlsdGVyQ2hhaW4oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJvY2VzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGluLnJlYWRDaHVuaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc0ZpbHRlckNoYWluKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJvY2VzcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEZpbHRlckNoYWluKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworCisgICAgICAgICAgICAgICAgICAgIGZsdXNoRmlsdGVyQ2hhaW4oKTsKKworICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VzID0gKHJlcGxhY2VDb3VudCAhPSByZXBDb3VudFN0YXJ0KTsKICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcykgewpAQCAtNzE0LDExICs2OTEsNyBAQAogICAgICAqIEZsdXNoZXMgYWxsIGZpbHRlcnMuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGZsdXNoRmlsdGVyQ2hhaW4oKSB7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gcmVwbGFjZWZpbHRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgUmVwbGFjZWZpbHRlciBmaWx0ZXIgPSAoUmVwbGFjZWZpbHRlcikgcmVwbGFjZWZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgZmlsdGVyLmZsdXNoKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVwbGFjZWZpbHRlcnMuZm9yRWFjaChSZXBsYWNlZmlsdGVyOjpmbHVzaCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MjYsMTQgKzY5OSw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWx0ZXIgY2hhaW4gcHJvZHVjZWQgbmV3IG91dHB1dC4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0ZpbHRlckNoYWluKCkgewotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlcGxhY2VmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFJlcGxhY2VmaWx0ZXIgZmlsdGVyID0gKFJlcGxhY2VmaWx0ZXIpIHJlcGxhY2VmaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmICghZmlsdGVyLnByb2Nlc3MoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHJlcGxhY2VmaWx0ZXJzLnN0cmVhbSgpLmFsbE1hdGNoKFJlcGxhY2VmaWx0ZXI6OnByb2Nlc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzU2LDEzICs3MjIsMTQgQEAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgbG9nRmlsdGVyQ2hhaW4oU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gcmVwbGFjZWZpbHRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgUmVwbGFjZWZpbHRlciBmaWx0ZXIgPSAoUmVwbGFjZWZpbHRlcikgcmVwbGFjZWZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgbG9nKCJSZXBsYWNpbmcgaW4gIiArIGZpbGVuYW1lICsgIjogIiArIGZpbHRlci5nZXRUb2tlbigpCi0gICAgICAgICAgICAgICAgICAgICsgIiAtLT4gIiArIGZpbHRlci5nZXRSZXBsYWNlVmFsdWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVwbGFjZWZpbHRlcnMKKyAgICAgICAgICAgIC5mb3JFYWNoKAorICAgICAgICAgICAgICAgIGZpbHRlciAtPiBsb2coCisgICAgICAgICAgICAgICAgICAgICJSZXBsYWNpbmcgaW4gIiArIGZpbGVuYW1lICsgIjogIiArIGZpbHRlci5nZXRUb2tlbigpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgLS0+ICIgKyBmaWx0ZXIuZ2V0UmVwbGFjZVZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpKTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHNvdXJjZSBmaWxlOyByZXF1aXJlZCB1bmxlc3MgPGNvZGU+ZGlyPC9jb2RlPiBpcyBzZXQuCiAgICAgICogQHBhcmFtIGZpbGUgc291cmNlIDxjb2RlPkZpbGU8L2NvZGU+LgpAQCAtOTUxLDcgKzkxOCw3IEBACiAgICAgICogQHBhcmFtIHN0cjEgU3RyaW5nCiAgICAgICogQHBhcmFtIHN0cjIgU3RyaW5nCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1JlcGxhY2UoU3RyaW5nQnVmZmVyIHN0ciwgU3RyaW5nIHN0cjEsIFN0cmluZyBzdHIyKSB7CisgICAgcHJpdmF0ZSB2b2lkIHN0cmluZ1JlcGxhY2UoU3RyaW5nQnVpbGRlciBzdHIsIFN0cmluZyBzdHIxLCBTdHJpbmcgc3RyMikgewogICAgICAgICBpbnQgZm91bmQgPSBzdHIuaW5kZXhPZihzdHIxKTsKICAgICAgICAgZmluYWwgaW50IHN0cjFMZW5ndGggPSBzdHIxLmxlbmd0aCgpOwogICAgICAgICBmaW5hbCBpbnQgc3RyMkxlbmd0aCA9IHN0cjIubGVuZ3RoKCk7CkBAIC05NjcsMTggKzkzNCw5IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcHJvcHMgUHJvcGVydGllcwogICAgICAqLwotICAgIHByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBnZXRPcmRlcmVkSXRlcmF0b3IoUHJvcGVydGllcyBwcm9wcykgewotICAgICAgICBMaXN0PE9iamVjdD4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0Pihwcm9wcy5rZXlTZXQoKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoa2V5cywgbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLSAgICAgICAgICAgICAgICAvL092ZXJyaWRlIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCBhcyBsb25nIGFzIHdlIHdhbnQgdG8gc3VwcG9ydCBidWlsZGluZyBBbnQgb24gSmF2YSAxLjUKLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGtleTEsIE9iamVjdCBrZXkyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlKGtleTEudG9TdHJpbmcoKSwga2V5Mi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIGludCBjb21wYXJlKFN0cmluZyBrZXkxLCBTdHJpbmcga2V5MikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5Mi5sZW5ndGgoKSAtIGtleTEubGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGdldE9yZGVyZWRJdGVyYXRvcihQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KHByb3BzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKSk7CisgICAgICAgIGtleXMuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZ0ludChTdHJpbmc6Omxlbmd0aCkucmV2ZXJzZWQoKSk7CiAgICAgICAgIHJldHVybiBrZXlzLml0ZXJhdG9yKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVzb3VyY2VDb3VudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVzb3VyY2VDb3VudC5qYXZhCmluZGV4IGIyOWI1N2IuLmEwZTAyMmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Jlc291cmNlQ291bnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXNvdXJjZUNvdW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02MSw4ICs2MSw4IEBACiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKICAgICAgICAgT2JqZWN0IG8gPSByLmdldFJlZmVyZW5jZWRPYmplY3QoKTsKICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJlc291cmNlQ29sbGVjdGlvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyLmdldFJlZklkKCkKLSAgICAgICAgICAgICAgICArICIgZG9lc25cJ3QgZGVub3RlIGEgUmVzb3VyY2VDb2xsZWN0aW9uIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGRvZXNuXCd0IGRlbm90ZSBhIFJlc291cmNlQ29sbGVjdGlvbiIsCisgICAgICAgICAgICAgICAgci5nZXRSZWZJZCgpKTsKICAgICAgICAgfQogICAgICAgICBhZGQoKFJlc291cmNlQ29sbGVjdGlvbikgbyk7CiAgICAgfQpAQCAtNzAsNiArNzAsNyBAQAogICAgIC8qKgogICAgICAqIEV4ZWN1dGUgYXMgYSBUYXNrLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIGlmIChyYyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oT05FX05FU1RFRF9NRVNTQUdFKTsKQEAgLTg2LDYgKzg3LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBSZXNvdXJjZUNvbGxlY3Rpb24gc2F0aXNmaWVzIHRoZSBzZXQgY3JpdGVyaWEuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHsKICAgICAgICAgaWYgKHJjID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihPTkVfTkVTVEVEX01FU1NBR0UpOwpAQCAtOTMsNyArOTUsNyBAQAogICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKENPVU5UX1JFUVVJUkVEKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gd2hlbi5ldmFsdWF0ZShuZXcgSW50ZWdlcihyYy5zaXplKCkpLmNvbXBhcmVUbyhjb3VudCkpOworICAgICAgICByZXR1cm4gd2hlbi5ldmFsdWF0ZShJbnRlZ2VyLnZhbHVlT2YocmMuc2l6ZSgpKS5jb21wYXJlVG8oY291bnQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMSw3ICsxMDMsNyBAQAogICAgICAqIEBwYXJhbSBjIG51bWJlciBvZiBSZXNvdXJjZXMgYXMgaW50LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENvdW50KGludCBjKSB7Ci0gICAgICAgIGNvdW50ID0gbmV3IEludGVnZXIoYyk7CisgICAgICAgIGNvdW50ID0gYzsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JldHJ5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXRyeS5qYXZhCmluZGV4IGJjYTVjMTUuLmUxNjgxZDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JldHJ5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmV0cnkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFza0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIFJldHJpZXMgdGhlIG5lc3RlZCB0YXNrIGEgc2V0IG51bWJlciBvZiB0aW1lcwpAQCAtNDgsMTEgKzQ3LDExIEBACiAgICAgICogc2V0IHRoZSB0YXNrCiAgICAgICogQHBhcmFtIHQgdGhlIHRhc2sgdG8gcmV0cnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFRhc2soVGFzayB0KSB7CiAgICAgICAgIGlmIChuZXN0ZWRUYXNrICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIHJldHJ5IHRhc2sgY29udGFpbmVyIGFjY2VwdHMgYSBzaW5nbGUgbmVzdGVkIHRhc2siCi0gICAgICAgICAgICAgICAgKyAiICh3aGljaCBtYXkgYmUgYSBzZXF1ZW50aWFsIHRhc2sgY29udGFpbmVyKSIpOworICAgICAgICAgICAgICAgICJUaGUgcmV0cnkgdGFzayBjb250YWluZXIgYWNjZXB0cyBhIHNpbmdsZSBuZXN0ZWQgdGFzayAod2hpY2ggbWF5IGJlIGEgc2VxdWVudGlhbCB0YXNrIGNvbnRhaW5lcikiKTsKICAgICAgICAgfQogICAgICAgICBuZXN0ZWRUYXNrID0gdDsKICAgICB9CkBAIC04MSw4ICs4MCw5IEBACiAgICAgICogcGVyZm9ybSB0aGUgd29yawogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBlcnJvck1lc3NhZ2VzID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGVycm9yTWVzc2FnZXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSByZXRyeUNvdW50OyBpKyspIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbmVzdGVkVGFzay5wZXJmb3JtKCk7CkBAIC05MCwxMyArOTAsOSBAQAogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VzLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGkgPj0gcmV0cnlDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgZXhjZXB0aW9uTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQoIlRhc2sgWyIpLmFwcGVuZChuZXN0ZWRUYXNrLmdldFRhc2tOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZCgiXSBmYWlsZWQgYWZ0ZXIgWyIpLmFwcGVuZChyZXRyeUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQoIl0gYXR0ZW1wdHM7IGdpdmluZyB1cC4iKS5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NZXNzYWdlLmFwcGVuZCgiRXJyb3IgbWVzc2FnZXM6IikuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWVzc2FnZS5hcHBlbmQoZXJyb3JNZXNzYWdlcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleGNlcHRpb25NZXNzYWdlLnRvU3RyaW5nKCksIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFzayBbJXNdIGZhaWxlZCBhZnRlciBbJWRdIGF0dGVtcHRzOyBnaXZpbmcgdXAuJW5FcnJvciBtZXNzYWdlczolbiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRUYXNrLmdldFRhc2tOYW1lKCksIHJldHJ5Q291bnQsIGVycm9yTWVzc2FnZXMpLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZzsKICAgICAgICAgICAgICAgICBpZiAocmV0cnlEZWxheSA+IDApIHsKQEAgLTEwNSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICBtc2cgPSAiQXR0ZW1wdCBbIiArIGkgKyAiXTogZXJyb3Igb2NjdXJyZWQ7IHJldHJ5aW5nLi4uIjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbG9nKG1zZywgZSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlcy5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZXMuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOwogICAgICAgICAgICAgICAgIGlmIChyZXRyeURlbGF5ID4gMCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHJldHJ5RGVsYXkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pYy5qYXZhCmluZGV4IGUyMDUxOGEuLmVjZTVhOTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnJtaS5SZW1vdGU7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNjcsMTYgKzY4LDE2IEBACiAgKgogICogPHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCBjb21waWxlcnMuIFRoaXMgY2FuIGJlIHNlbGVjdGVkCiAgKiB3aXRoIHRoZSAmcXVvdDtidWlsZC5ybWljJnF1b3Q7IHByb3BlcnR5IG9yIHRoZSA8Y29kZT5jb21waWxlcjwvY29kZT4KLSAqIGF0dHJpYnV0ZS4gPGEgbmFtZT0iY29tcGlsZXJ2YWx1ZXMiPlRoZXJlIGFyZSB0aHJlZSBjaG9pY2VzPC9hPjo8L3A+CisgKiBhdHRyaWJ1dGUuIDxzcGFuIGlkPSJjb21waWxlcnZhbHVlcyI+VGhlcmUgYXJlIHRocmVlIGNob2ljZXM8L3NwYW4+OjwvcD4KICAqCiAgKiA8dWw+CiAgKiAgIDxsaT5zdW4gKHRoZSBzdGFuZGFyZCBjb21waWxlciBvZiB0aGUgSkRLKTwvbGk+CiAgKiAgIDxsaT5rYWZmZSAodGhlIHN0YW5kYXJkIGNvbXBpbGVyIG9mCi0gKiAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmthZmZlLm9yZyI+S2FmZmU8L2E+KTwvbGk+CisgKiAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2FmZmUva2FmZmUiPkthZmZlPC9hPik8L2xpPgogICogICA8bGk+d2VibG9naWM8L2xpPgogICogPC91bD4KICAqCi0gKiA8cD5UaGUgPGEgaHJlZj0iaHR0cDovL2Rpb25lLnpjdS5jei9+dG9tYW40MC9taW5pUk1JLyI+bWluaVJNSTwvYT4KKyAqIDxwPlRoZSBtaW5pUk1JCiAgKiBwcm9qZWN0IGNvbnRhaW5zIGEgY29tcGlsZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgdGFzayBhcyB3ZWxsLAogICogcGxlYXNlIGNvbnN1bHQgbWluaVJNSSdzIGRvY3VtZW50YXRpb24gdG8gbGVhcm4gaG93IHRvIHVzZSBpdC48L3A+CiAgKgpAQCAtOTEsNiArOTIsMjMgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9STUlDX0ZBSUxFRAogICAgICAgICA9ICJSbWljIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuIjsKIAorICAgIC8qKiB1bmFibGUgdG8gdmVyaWZ5IG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9VTkFCTEVfVE9fVkVSSUZZX0NMQVNTID0gIlVuYWJsZSB0byB2ZXJpZnkgY2xhc3MgIjsKKyAgICAvKiogY291bGQgbm90IGJlIGZvdW5kIG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT1RfRk9VTkQgPSAiLiBJdCBjb3VsZCBub3QgYmUgZm91bmQuIjsKKyAgICAvKiogbm90IGRlZmluZWQgbWVzc2FnZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PVF9ERUZJTkVEID0gIi4gSXQgaXMgbm90IGRlZmluZWQuIjsKKyAgICAvKiogbG9hZGVkIGVycm9yIG1lc3NhZ2UgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9MT0FESU5HX0NBVVNFRF9FWENFUFRJT04gPSAiLiBMb2FkaW5nIGNhdXNlZCBFeGNlcHRpb246ICI7CisgICAgLyoqIGJhc2Ugbm90IGV4aXN0cyBtZXNzYWdlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQkFTRV9FWElTVFMgPSAiYmFzZSBvciBkZXN0ZGlyIGRvZXMgbm90IGV4aXN0OiAiOworICAgIC8qKiBiYXNlIG5vdCBhIGRpcmVjdG9yeSBtZXNzYWdlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9UX0FfRElSID0gImJhc2Ugb3IgZGVzdGRpciBpcyBub3QgYSBkaXJlY3Rvcnk6IjsKKyAgICAvKiogYmFzZSBhdHRyaWJ1dGUgbm90IHNldCBtZXNzYWdlICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfQkFTRV9OT1RfU0VUID0gImJhc2Ugb3IgZGVzdGRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCiAgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7CiAgICAgcHJpdmF0ZSBGaWxlIGRlc3REaXI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NuYW1lOwpAQCAtMTA5LDI4ICsxMjcsMTEgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUFudFJ1bnRpbWUgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlSmF2YVJ1bnRpbWUgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgVmVjdG9yIGNvbXBpbGVMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gY29tcGlsZUxpc3QgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIHByaXZhdGUgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKIAogICAgIHByaXZhdGUgRmFjYWRlVGFza0hlbHBlciBmYWNhZGU7Ci0gICAgLyoqIHVuYWJsZSB0byB2ZXJpZnkgbWVzc2FnZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1VOQUJMRV9UT19WRVJJRllfQ0xBU1MgPSAiVW5hYmxlIHRvIHZlcmlmeSBjbGFzcyAiOwotICAgIC8qKiBjb3VsZCBub3QgYmUgZm91bmQgbWVzc2FnZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PVF9GT1VORCA9ICIuIEl0IGNvdWxkIG5vdCBiZSBmb3VuZC4iOwotICAgIC8qKiBub3QgZGVmaW5lZCBtZXNzYWdlICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9UX0RFRklORUQgPSAiLiBJdCBpcyBub3QgZGVmaW5lZC4iOwotICAgIC8qKiBsb2FkZWQgZXJyb3IgbWVzc2FnZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0xPQURJTkdfQ0FVU0VEX0VYQ0VQVElPTiA9ICIuIExvYWRpbmcgY2F1c2VkIEV4Y2VwdGlvbjogIjsKLSAgICAvKiogYmFzZSBub3QgZXhpc3RzIG1lc3NhZ2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19CQVNFX0VYSVNUUyA9ICJiYXNlIG9yIGRlc3RkaXIgZG9lcyBub3QgZXhpc3Q6ICI7Ci0gICAgLyoqIGJhc2Ugbm90IGEgZGlyZWN0b3J5IG1lc3NhZ2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT1RfQV9ESVIgPSAiYmFzZSBvciBkZXN0ZGlyIGlzIG5vdCBhIGRpcmVjdG9yeToiOwotICAgIC8qKiBiYXNlIGF0dHJpYnV0ZSBub3Qgc2V0IG1lc3NhZ2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CQVNFX05PVF9TRVQgPSAiYmFzZSBvciBkZXN0ZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0KICAgICBwcml2YXRlIFN0cmluZyBleGVjdXRhYmxlID0gbnVsbDsKIAogICAgIHByaXZhdGUgYm9vbGVhbiBsaXN0RmlsZXMgPSBmYWxzZTsKQEAgLTQwNSw3ICs0MDYsNyBAQAogICAgICAqIEdldHMgZmlsZSBsaXN0IHRvIGNvbXBpbGUuCiAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0byBjb21waWxlLgogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0RmlsZUxpc3QoKSB7CisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldEZpbGVMaXN0KCkgewogICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7CiAgICAgfQogCkBAIC00ODQsNyArNDg1LDcgQEAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRoZSBjb21waWxlIGxpc3QuCiAgICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRDb21waWxlTGlzdCgpIHsKKyAgICBwdWJsaWMgVmVjdG9yPFN0cmluZz4gZ2V0Q29tcGlsZUxpc3QoKSB7CiAgICAgICAgIHJldHVybiBjb21waWxlTGlzdDsKICAgICB9CiAKQEAgLTQ5Niw3ICs0OTcsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS41CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZXIoU3RyaW5nIGNvbXBpbGVyKSB7Ci0gICAgICAgIGlmIChjb21waWxlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKCFjb21waWxlci5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGZhY2FkZS5zZXRJbXBsZW1lbnRhdGlvbihjb21waWxlcik7CiAgICAgICAgIH0KICAgICB9CkBAIC02MTIsOSArNjEzLDggQEAKICAgICAgICAgICAgIGlmICh2ZXJpZnkpIHsKICAgICAgICAgICAgICAgICBsb2coIlZlcmlmeSBoYXMgYmVlbiB0dXJuZWQgb24uIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBSbWljQWRhcHRlciBhZGFwdGVyID0KLSAgICAgICAgICAgICAgICBuZXN0ZWRBZGFwdGVyICE9IG51bGwgPyBuZXN0ZWRBZGFwdGVyIDoKLSAgICAgICAgICAgICAgICBSbWljQWRhcHRlckZhY3RvcnkuZ2V0Um1pYyhnZXRDb21waWxlcigpLCB0aGlzLAorICAgICAgICAgICAgUm1pY0FkYXB0ZXIgYWRhcHRlciA9IG5lc3RlZEFkYXB0ZXIgIT0gbnVsbCA/IG5lc3RlZEFkYXB0ZXIKKyAgICAgICAgICAgICAgICAgICAgOiBSbWljQWRhcHRlckZhY3RvcnkuZ2V0Um1pYyhnZXRDb21waWxlcigpLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUNvbXBpbGVyQ2xhc3NwYXRoKCkpOwogCiAgICAgICAgICAgICAvLyBub3cgd2UgbmVlZCB0byBwb3B1bGF0ZSB0aGUgY29tcGlsZXIgYWRhcHRlcgpAQCAtNjI3LDggKzYyNyw3IEBACiAgICAgICAgICAgICAvLyBzcGVjaWZpYyBjbGFzc25hbWUgaXMgbm90IGdpdmVuCiAgICAgICAgICAgICBpZiAoY2xhc3NuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKGJhc2VEaXIpOwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgICAgIHNjYW5EaXIoYmFzZURpciwgZmlsZXMsIGFkYXB0ZXIuZ2V0TWFwcGVyKCkpOworICAgICAgICAgICAgICAgIHNjYW5EaXIoYmFzZURpciwgZHMuZ2V0SW5jbHVkZWRGaWxlcygpLCBhZGFwdGVyLmdldE1hcHBlcigpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHBlcmZvcm0gYSB0aW1lc3RhbXAgY29tcGFyaXNvbiAtIGF0IGxlYXN0CiAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikKQEAgLTY1MSw5ICs2NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICArIG91dHB1dERpciwgUHJvamVjdC5NU0dfSU5GTyk7CiAKICAgICAgICAgICAgICAgICBpZiAobGlzdEZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhjb21waWxlTGlzdC5nZXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZUxpc3QuZm9yRWFjaCh0aGlzOjpsb2cpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIGZpbmFsbHksIGxldHMgZXhlY3V0ZSB0aGUgY29tcGlsZXIhIQpAQCAtNjc0LDExICs2NzEsOCBAQAogICAgICAgICAgICAgICAgICAgICBsb2coInNvdXJjZWJhc2UgYXR0cmlidXRlIHdpbGwgYmUgaWdub3JlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbW92ZUdlbmVyYXRlZEZpbGUob3V0cHV0RGlyLCBzb3VyY2VCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgY29tcGlsZUxpc3QuZWxlbWVudEF0KGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZUxpc3QuZm9yRWFjaChmIC0+IG1vdmVHZW5lcmF0ZWRGaWxlKG91dHB1dERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUJhc2UsIGYsIGFkYXB0ZXIpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC03MTMsMTYgKzcwNywxNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZW5lcmF0ZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdlbmVyYXRlZEZpbGUgPSBnZW5lcmF0ZWRGaWxlc1tpXTsKKyAgICAgICAgZm9yIChTdHJpbmcgZ2VuZXJhdGVkRmlsZSA6IGdlbmVyYXRlZEZpbGVzKSB7CiAgICAgICAgICAgICBpZiAoIWdlbmVyYXRlZEZpbGUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIHRoYXQgLSBhIElETCBmaWxlIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAvLyBoYXZlIGEgY29ycmVzcG9uZGluZyBKYXZhIHNvdXJjZSBmb3IgZXhhbXBsZS4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZSA9IFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChnZW5lcmF0ZWRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuY2xhc3MiKQotICAgICAgICAgICAgICAgICsgIi5qYXZhIjsKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlTmFtZSA9CisgICAgICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVtb3ZlU3VmZml4KGdlbmVyYXRlZEZpbGUsICIuY2xhc3MiKSArICIuamF2YSI7CiAKICAgICAgICAgICAgIEZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsIHNvdXJjZUZpbGVOYW1lKTsKICAgICAgICAgICAgIGlmICghb2xkRmlsZS5leGlzdHMoKSkgewpAQCAtNzM0LDE3ICs3MjYsMTUgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcmluZykgewogICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNvcHlGaWxlKG9sZEZpbGUsIG5ld0ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlclNldENvbGxlY3Rpb24oZ2V0UHJvamVjdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEdsb2JhbEZpbHRlclNldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbHRlclNldENvbGxlY3Rpb24oZ2V0UHJvamVjdCgpLmdldEdsb2JhbEZpbHRlclNldCgpKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5jb3B5RmlsZShvbGRGaWxlLCBuZXdGaWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb2xkRmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIG9sZEZpbGUgKyAiIHRvICIgKyBuZXdGaWxlCi0gICAgICAgICAgICAgICAgICAgICsgIiBkdWUgdG8gIgotICAgICAgICAgICAgICAgICAgICArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjb3B5ICIgKyBvbGRGaWxlICsgIiB0byAiCisgICAgICAgICAgICAgICAgICAgICsgbmV3RmlsZSArICIgZHVlIHRvICIgKyBpb2UuZ2V0TWVzc2FnZSgpLCBpb2UsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzY4LDExICs3NTgsOSBAQAogICAgICAgICAgICAgU291cmNlRmlsZVNjYW5uZXIgc2ZzID0gbmV3IFNvdXJjZUZpbGVTY2FubmVyKHRoaXMpOwogICAgICAgICAgICAgbmV3RmlsZXMgPSBzZnMucmVzdHJpY3QoZmlsZXMsIGJhc2VEaXIsIGdldE91dHB1dERpcigpLCBtYXBwZXIpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV3RmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gbmV3RmlsZXNbaV0ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sYXN0SW5kZXhPZigiLmNsYXNzIikpOwotICAgICAgICAgICAgY29tcGlsZUxpc3QuYWRkRWxlbWVudChuYW1lKTsKLSAgICAgICAgfQorICAgICAgICBTdHJlYW0ub2YobmV3RmlsZXMpLm1hcChzIC0+IHMucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJykpCisgICAgICAgICAgICAubWFwKHMgLT4gcy5zdWJzdHJpbmcoMCwgcy5sYXN0SW5kZXhPZigiLmNsYXNzIikpKQorICAgICAgICAgICAgLmZvckVhY2goY29tcGlsZUxpc3Q6OmFkZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03ODIsMTIgKzc3MCw5IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZFJtaVJlbW90ZShTdHJpbmcgY2xhc3NuYW1lKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyB0ZXN0Q2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICBDbGFzczw/PiB0ZXN0Q2xhc3MgPSBsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7CiAgICAgICAgICAgICAvLyBPbmUgY2Fubm90IFJNSUMgYW4gaW50ZXJmYWNlIGZvciAiY2xhc3NpYyIgUk1JIChKUk1QKQotICAgICAgICAgICAgaWYgKHRlc3RDbGFzcy5pc0ludGVyZmFjZSgpICYmICFpaW9wICYmICFpZGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaXNWYWxpZFJtaVJlbW90ZSh0ZXN0Q2xhc3MpOworICAgICAgICAgICAgcmV0dXJuICghdGVzdENsYXNzLmlzSW50ZXJmYWNlKCkgfHwgaWlvcCB8fCBpZGwpICYmIGlzVmFsaWRSbWlSZW1vdGUodGVzdENsYXNzKTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2coRVJST1JfVU5BQkxFX1RPX1ZFUklGWV9DTEFTUyArIGNsYXNzbmFtZSArIEVSUk9SX05PVF9GT1VORCwKICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKQEAgLTgxMCwyNiArNzk1LDE3IEBACiAgICAgICogQHJldHVybiB0aGUgdG9wbW9zdCBpbnRlcmZhY2UgdGhhdCBleHRlbmRzIFJlbW90ZSwgb3IgbnVsbCBpZiB0aGVyZQogICAgICAqICAgICAgICAgaXMgbm9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgQ2xhc3MgZ2V0UmVtb3RlSW50ZXJmYWNlKENsYXNzIHRlc3RDbGFzcykgewotICAgICAgICBpZiAoUmVtb3RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdENsYXNzKSkgewotICAgICAgICAgICAgQ2xhc3MgW10gaW50ZXJmYWNlcyA9IHRlc3RDbGFzcy5nZXRJbnRlcmZhY2VzKCk7Ci0gICAgICAgICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChSZW1vdGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbnRlcmZhY2VzW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludGVyZmFjZXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgcHVibGljIENsYXNzPD8+IGdldFJlbW90ZUludGVyZmFjZShDbGFzczw/PiB0ZXN0Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZih0ZXN0Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKQorICAgICAgICAgICAgLmZpbHRlcihSZW1vdGUuY2xhc3M6OmlzQXNzaWduYWJsZUZyb20pLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayB0byBzZWUgaWYgdGhlIGNsYXNzIG9yIChzdXBlcilpbnRlcmZhY2VzIGltcGxlbWVudAogICAgICAqIGphdmEucm1pLlJlbW90ZS4KICAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFJtaVJlbW90ZSAoQ2xhc3MgdGVzdENsYXNzKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW1vdGVJbnRlcmZhY2UodGVzdENsYXNzKSAhPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUm1pUmVtb3RlKENsYXNzPD8+IHRlc3RDbGFzcykgeworICAgICAgICByZXR1cm4gUmVtb3RlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdENsYXNzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0Niw3ICs4MjIsNyBAQAogICAgICAqIGltcGxlbWVudGF0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgZXh0ZW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCB7CisgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBPbmx5IHBhc3MgdGhlIHNwZWNpZmllZCBhcmd1bWVudCBpZiB0aGUKICAgICAgICAgICogY2hvc2VuIGNvbXBpbGVyIGltcGxlbWVudGF0aW9uIG1hdGNoZXMgdGhlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjLmphdmEKaW5kZXggMjViYzY4YS4uZGMxMTZhMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU1FMRXhlYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NRTEV4ZWMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDE0ICsyMCwxMyBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEuc3FsLkJsb2I7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7CkBAIC0zNiw3ICszNSw3IEBACiBpbXBvcnQgamF2YS5zcWwuU1FMV2FybmluZzsKIGltcG9ydCBqYXZhLnNxbC5TdGF0ZW1lbnQ7CiBpbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwpAQCAtMTI4LDcgKzEyNyw3IEBACiAgICAgLyoqCiAgICAgICogU1FMIHRyYW5zYWN0aW9ucyB0byBwZXJmb3JtCiAgICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgdHJhbnNhY3Rpb25zID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgTGlzdDxUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBTUUwgU3RhdGVtZW50IGRlbGltaXRlcgpAQCAtMzUyLDcgKzM1MSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFRyYW5zYWN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uKCkgewogICAgICAgICBUcmFuc2FjdGlvbiB0ID0gbmV3IFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIHRyYW5zYWN0aW9ucy5hZGRFbGVtZW50KHQpOworICAgICAgICB0cmFuc2FjdGlvbnMuYWRkKHQpOwogICAgICAgICByZXR1cm4gdDsKICAgICB9CiAKQEAgLTU2Miw4ICs1NjEsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldENzdlF1b3RlQ2hhcmFjdGVyKFN0cmluZyBzKSB7CiAgICAgICAgIGlmIChzICE9IG51bGwgJiYgcy5sZW5ndGgoKSA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHF1b3RlIGNoYXJhY3RlciBtdXN0IGJlIGEgc2luZ2xlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjaGFyYWN0ZXIuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBxdW90ZSBjaGFyYWN0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIuIik7CiAgICAgICAgIH0KICAgICAgICAgY3N2UXVvdGVDaGFyID0gczsKICAgICB9CkBAIC02MTQsMTcgKzYxMywxNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBWZWN0b3Igc2F2ZWRUcmFuc2FjdGlvbiA9IChWZWN0b3IpIHRyYW5zYWN0aW9ucy5jbG9uZSgpOworICAgICAgICBMaXN0PFRyYW5zYWN0aW9uPiBzYXZlZFRyYW5zYWN0aW9uID0gbmV3IFZlY3Rvcjw+KHRyYW5zYWN0aW9ucyk7CiAgICAgICAgIFN0cmluZyBzYXZlZFNxbENvbW1hbmQgPSBzcWxDb21tYW5kOwogCiAgICAgICAgIHNxbENvbW1hbmQgPSBzcWxDb21tYW5kLnRyaW0oKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHNyY0ZpbGUgPT0gbnVsbCAmJiBzcWxDb21tYW5kLmxlbmd0aCgpID09IDAgJiYgcmVzb3VyY2VzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25zLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU291cmNlIGZpbGUgb3IgcmVzb3VyY2UgY29sbGVjdGlvbiwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNhY3Rpb25zIG9yIHNxbCBzdGF0ZW1lbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBiZSBzZXQhIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICBpZiAoc3JjRmlsZSA9PSBudWxsICYmIHNxbENvbW1hbmQuaXNFbXB0eSgpICYmIHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNvdXJjZSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24sIHRyYW5zYWN0aW9ucyBvciBzcWwgc3RhdGVtZW50IG11c3QgYmUgc2V0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTY2MSw3ICs2NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmcC5nZXRGaWxlKCksIGFwcGVuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MgPSBGaWxlVXRpbHMubmV3T3V0cHV0U3RyZWFtKGZwLmdldEZpbGUoKS50b1BhdGgoKSwgYXBwZW5kKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFwcGVuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlbmRhYmxlIGEgPQpAQCAtNjg4LDEwICs2ODcsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHRyYW5zYWN0aW9ucy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICgoVHJhbnNhY3Rpb24pIGUubmV4dEVsZW1lbnQoKSkucnVuVHJhbnNhY3Rpb24ob3V0KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChUcmFuc2FjdGlvbiB0eG4gOiB0cmFuc2FjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4bi5ydW5UcmFuc2FjdGlvbihvdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F1dG9jb21taXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ29tbWl0dGluZyB0cmFuc2FjdGlvbiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbm5lY3Rpb24oKS5jb21taXQoKTsKQEAgLTcwMCwzMyArNjk3LDE5IEBACiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBTUUxFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGNsb3NlUXVpZXRseSgpOwogICAgICAgICAgICAgICAgIHNldEVycm9yUHJvcGVydHkoKTsKLSAgICAgICAgICAgICAgICBpZiAob25FcnJvci5lcXVhbHMoImFib3J0IikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2VRdWlldGx5KCk7Ci0gICAgICAgICAgICAgICAgc2V0RXJyb3JQcm9wZXJ0eSgpOwotICAgICAgICAgICAgICAgIGlmIChvbkVycm9yLmVxdWFscygiYWJvcnQiKSkgeworICAgICAgICAgICAgICAgIGlmICgiYWJvcnQiLmVxdWFscyhvbkVycm9yKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0U3RhdGVtZW50KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdGVtZW50KCkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZ2V0U3RhdGVtZW50KCkpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldENvbm5lY3Rpb24oKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGdldENvbm5lY3Rpb24oKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGxvZyhnb29kU3FsICsgIiBvZiAiICsgdG90YWxTcWwgKyAiIFNRTCBzdGF0ZW1lbnRzIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIpOwpAQCAtNzQ2LDEwICs3MjksMTAgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBydW5TdGF0ZW1lbnRzKFJlYWRlciByZWFkZXIsIFByaW50U3RyZWFtIG91dCkKICAgICAgICAgdGhyb3dzIFNRTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmdCdWZmZXIgc3FsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBTdHJpbmcgbGluZTsKIAogICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwogCisgICAgICAgIFN0cmluZyBsaW5lOwogICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoIWtlZXBmb3JtYXQpIHsKICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CkBAIC04MDEsNyArNzg0LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBleGVjU1FMKFN0cmluZyBzcWwsIFByaW50U3RyZWFtIG91dCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIENoZWNrIGFuZCBpZ25vcmUgZW1wdHkgc3RhdGVtZW50cwotICAgICAgICBpZiAoIiIuZXF1YWxzKHNxbC50cmltKCkpKSB7CisgICAgICAgIGlmIChzcWwudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTg0OSwyMCArODMyLDE0IEBACiAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2coIkZhaWxlZCB0byBleGVjdXRlOiAiICsgc3FsLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgc2V0RXJyb3JQcm9wZXJ0eSgpOwotICAgICAgICAgICAgaWYgKCFvbkVycm9yLmVxdWFscygiYWJvcnQiKSkgeworICAgICAgICAgICAgaWYgKCEiYWJvcnQiLmVxdWFscyhvbkVycm9yKSkgewogICAgICAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW9uRXJyb3IuZXF1YWxzKCJjb250aW51ZSIpKSB7CisgICAgICAgICAgICBpZiAoISJjb250aW51ZSIuZXF1YWxzKG9uRXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZXN1bHRTZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdFNldC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHJlc3VsdFNldCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg3NiwxMyArODUzLDggQEAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCB2b2lkIHByaW50UmVzdWx0cyhQcmludFN0cmVhbSBvdXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotICAgICAgICBSZXN1bHRTZXQgcnMgPSBnZXRTdGF0ZW1lbnQoKS5nZXRSZXN1bHRTZXQoKTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChSZXN1bHRTZXQgcnMgPSBnZXRTdGF0ZW1lbnQoKS5nZXRSZXN1bHRTZXQoKSkgewogICAgICAgICAgICAgcHJpbnRSZXN1bHRzKHJzLCBvdXQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBycy5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC05NTUsNyArOTI3LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjbG9zZVF1aWV0bHkoKSB7Ci0gICAgICAgIGlmICghaXNBdXRvY29tbWl0KCkgJiYgZ2V0Q29ubmVjdGlvbigpICE9IG51bGwgJiYgb25FcnJvci5lcXVhbHMoImFib3J0IikpIHsKKyAgICAgICAgaWYgKCFpc0F1dG9jb21taXQoKSAmJiBnZXRDb25uZWN0aW9uKCkgIT0gbnVsbCAmJiAiYWJvcnQiLmVxdWFscyhvbkVycm9yKSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBnZXRDb25uZWN0aW9uKCkucm9sbGJhY2soKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewpAQCAtOTY0LDcgKzkzNiw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENhY2hlcyB0aGUgY29ubmVjdGlvbiByZXR1cm5lZCBieSB0aGUgYmFzZSBjbGFzcydzIGdldENvbm5lY3Rpb24gbWV0aG9kLgogICAgICAqCkBAIC0xMDA0LDcgKzk3NSw2IEBACiAgICAgICAgICAgICBzdGF0ZW1lbnQgPSBnZXRDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7CiAgICAgICAgICAgICBzdGF0ZW1lbnQuc2V0RXNjYXBlUHJvY2Vzc2luZyhlc2NhcGVQcm9jZXNzaW5nKTsKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBzdGF0ZW1lbnQ7CiAgICAgfQogCkBAIC0xMDcxLDE4ICsxMDQxLDE1IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKFJlc291cmNlQ29sbGVjdGlvbiBhKSB7CiAgICAgICAgICAgICBpZiAoYS5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigib25seSBzaW5nbGUgYXJndW1lbnQgcmVzb3VyY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZSBzdXBwb3J0ZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRTcmNSZXNvdXJjZShhLml0ZXJhdG9yKCkubmV4dCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKgotICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIHJ1blRyYW5zYWN0aW9uKFByaW50U3RyZWFtIG91dCkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmICh0U3FsQ29tbWFuZC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIXRTcWxDb21tYW5kLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGxvZygiRXhlY3V0aW5nIGNvbW1hbmRzIiwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgICAgICAgICAgcnVuU3RhdGVtZW50cyhuZXcgU3RyaW5nUmVhZGVyKHRTcWxDb21tYW5kKSwgb3V0KTsKICAgICAgICAgICAgIH0KQEAgLTEwOTAsMTYgKzEwNTcsMTEgQEAKICAgICAgICAgICAgIGlmICh0U3JjUmVzb3VyY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGxvZygiRXhlY3V0aW5nIHJlc291cmNlOiAiICsgdFNyY1Jlc291cmNlLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpcyA9IHRTcmNSZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSAoZW5jb2RpbmcgPT0gbnVsbCkgPyBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIENoYXJzZXQgY2hhcnNldCA9IGVuY29kaW5nID09IG51bGwgPyBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgOiBDaGFyc2V0LmZvck5hbWUoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHRyeSAoUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgdFNyY1Jlc291cmNlLmdldElucHV0U3RyZWFtKCksIGNoYXJzZXQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJ1blN0YXRlbWVudHMocmVhZGVyLCBvdXQpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpcyk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyZWFkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTExNSwzMyArMTA3NywzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gbWF0Y2gKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBkID0gZGVsaW1pdGVyLnRyaW0oKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBpZiAoZGVsaW1pdGVyVHlwZS5lcXVhbHMoRGVsaW1pdGVyVHlwZS5OT1JNQUwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gc3RpbGwgdHJ5aW5nIHRvIGF2b2lkIHdhc3RlZnVsIGNvcHlpbmcsIHNlZQotICAgICAgICAgICAgICAgIC8vIFN0cmluZ1V0aWxzLmVuZHNXaXRoCi0gICAgICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gZGVsaW1pdGVyLmxlbmd0aCgpIC0gMTsKLSAgICAgICAgICAgICAgICBpbnQgYnVmZmVySW5kZXggPSBidWYubGVuZ3RoKCkgLSAxOwotICAgICAgICAgICAgICAgIHdoaWxlIChidWZmZXJJbmRleCA+PSAwICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYnVmLmNoYXJBdChidWZmZXJJbmRleCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC0tYnVmZmVySW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChidWZmZXJJbmRleCA8IGVuZEluZGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGQgPSBkZWxpbWl0ZXIudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgaWYgKERlbGltaXRlclR5cGUuTk9STUFMLmVxdWFscyhkZWxpbWl0ZXJUeXBlKSkgeworICAgICAgICAgICAgLy8gc3RpbGwgdHJ5aW5nIHRvIGF2b2lkIHdhc3RlZnVsIGNvcHlpbmcsIHNlZQorICAgICAgICAgICAgLy8gU3RyaW5nVXRpbHMuZW5kc1dpdGgKKyAgICAgICAgICAgIGludCBlbmRJbmRleCA9IGRlbGltaXRlci5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICBpbnQgYnVmZmVySW5kZXggPSBidWYubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgd2hpbGUgKGJ1ZmZlckluZGV4ID49IDAgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWYuY2hhckF0KGJ1ZmZlckluZGV4KSkpIHsKKyAgICAgICAgICAgICAgICAtLWJ1ZmZlckluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlckluZGV4IDwgZW5kSW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoZW5kSW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGlmIChidWYuc3Vic3RyaW5nKGJ1ZmZlckluZGV4LCBidWZmZXJJbmRleCArIDEpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNoYXJBdCgwKSAhPSBkLmNoYXJBdChlbmRJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZW5kSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmLnN1YnN0cmluZyhidWZmZXJJbmRleCwgYnVmZmVySW5kZXggKyAxKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hhckF0KDApICE9IGQuY2hhckF0KGVuZEluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlckluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIGVuZEluZGV4LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJJbmRleCArIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50TGluZS50cmltKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVxdWFscyhkKQotICAgICAgICAgICAgICAgICAgICA/IGJ1Zi5sZW5ndGgoKSAtIGN1cnJlbnRMaW5lLmxlbmd0aCgpIDogLTE7CisgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgtLTsKKyAgICAgICAgICAgICAgICBlbmRJbmRleC0tOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4ICsgMTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudExpbmUudHJpbSgpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lcXVhbHMoZCkKKyAgICAgICAgICAgID8gYnVmLmxlbmd0aCgpIC0gY3VycmVudExpbmUubGVuZ3RoKCkgOiAtMTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcHJpbnRXYXJuaW5ncyhTUUxXYXJuaW5nIHdhcm5pbmcsIGJvb2xlYW4gZm9yY2UpCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TZW5kRW1haWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhCmluZGV4IDFkYjhkZTMuLjNhNjFjMGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlbmRFbWFpbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2VxdWVudGlhbC5qYXZhCmluZGV4IGYyZjg4YTkuLmM1Y2VmZTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NlcXVlbnRpYWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TZXF1ZW50aWFsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNDEsMTUgKzQxLDE2IEBACiBwdWJsaWMgY2xhc3MgU2VxdWVudGlhbCBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBUYXNrQ29udGFpbmVyIHsKIAogICAgIC8qKiBPcHRpb25hbCBWZWN0b3IgaG9sZGluZyB0aGUgbmVzdGVkIHRhc2tzICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IG5lc3RlZFRhc2tzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBBZGQgYSBuZXN0ZWQgdGFzayB0byBTZXF1ZW50aWFsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5lc3RlZFRhc2sgIE5lc3RlZCB0YXNrIHRvIGV4ZWN1dGUgU2VxdWVudGlhbAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFRhc2soVGFzayBuZXN0ZWRUYXNrKSB7Ci0gICAgICAgIG5lc3RlZFRhc2tzLmFkZEVsZW1lbnQobmVzdGVkVGFzayk7CisgICAgICAgIG5lc3RlZFRhc2tzLmFkZChuZXN0ZWRUYXNrKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU3LDE1ICs1OCwxMyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBvbmUgb2YgdGhlIG5lc3RlZCB0YXNrcyBmYWlscy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgTG9jYWxQcm9wZXJ0aWVzIGxvY2FsUHJvcGVydGllcwogICAgICAgICAgICAgPSBMb2NhbFByb3BlcnRpZXMuZ2V0KGdldFByb2plY3QoKSk7CiAgICAgICAgIGxvY2FsUHJvcGVydGllcy5lbnRlclNjb3BlKCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXN0ZWRUYXNrcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBUYXNrIG5lc3RlZFRhc2sgPSAoVGFzaykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgbmVzdGVkVGFzay5wZXJmb3JtKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBuZXN0ZWRUYXNrcy5mb3JFYWNoKFRhc2s6OnBlcmZvcm0pOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbG9jYWxQcm9wZXJ0aWVzLmV4aXRTY29wZSgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TZXRQZXJtaXNzaW9ucy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2V0UGVybWlzc2lvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE3YTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2V0UGVybWlzc2lvbnMuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRG9zRmlsZUF0dHJpYnV0ZVZpZXc7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuUG9zaXhGaWxlUGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5QZXJtaXNzaW9uVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKKworLyoqCisgKiBTZXRzIHtAbGluayBQb3NpeEZpbGVQZXJtaXNzaW9ufXMgZm9yIHJlc291cmNlcy4KKyAqCisgKiA8cD5UaGlzIHRhc2sgcHJvdmlkZXMgYSBzdWJzZXQgb2Yge0BsaW5rIENobW9kfSdzIGFuZCB7QGxpbmsKKyAqIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLndpbmRvd3MuQXR0cmlifSdzIGFiaWxpdGllcworICogaW4gbGVzcyBwbGF0Zm9ybSBkZXBlbmRlbnQgd2F5LjwvcD4KKyAqCisgKiA8cD5JdCByZXF1aXJlcyBhIGZpbGUgc3lzdGVtIHRoYXQgc3VwcG9ydHMgUG9zaXhGaWxlUGVybWlzc2lvbnMgZm9yCisgKiBpdHMgZnVsbCBwb3RlbnRpYWwuIEl0IGNhbiBvcHRpb25hbGx5IGZhbGwgYmFjayB0bworICogRG9zRmlsZVBlcm1pc3Npb25zIChvbmx5IGNoYW5naW5nIHRoZSByZWFkb25seSBzdGF0ZSkgb24gZmlsZQorICogc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgUE9TSVggcGVybWlzc2lvbnMuIFNlZSB7QGxpbmsKKyAqIFNldFBlcm1pc3Npb25zLk5vblBvc2l4TW9kZX08L3A+CisgKgorICogQHNpbmNlIEFudCAxLjEwLjAKKyAqLworcHVibGljIGNsYXNzIFNldFBlcm1pc3Npb25zIGV4dGVuZHMgVGFzayB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcGVybWlzc2lvbnMgPQorICAgICAgICBFbnVtU2V0Lm5vbmVPZihQb3NpeEZpbGVQZXJtaXNzaW9uLmNsYXNzKTsKKyAgICBwcml2YXRlIFJlc291cmNlcyByZXNvdXJjZXMgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBmYWlsb25lcnJvciA9IHRydWU7CisgICAgcHJpdmF0ZSBOb25Qb3NpeE1vZGUgbm9uUG9zaXhNb2RlID0gTm9uUG9zaXhNb2RlLmZhaWw7CisKKyAgICAvKioKKyAgICAgKiBPcHRpb25zIGZvciBkZWFsaW5nIHdpdGggZmlsZSBzeXN0ZW1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCBQT1NJWAorICAgICAqIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIE5vblBvc2l4TW9kZSB7CisgICAgICAgIC8qKiBGYWlsIHRoZSBidWlsZC4gKi8KKyAgICAgICAgZmFpbCwKKyAgICAgICAgLyoqIExvZyBhbiBlcnJvciBhbmQgZ28gb24uICovCisgICAgICAgIHBhc3MsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnkgRG9zRmlsZVBlcm1pc3Npb25zIC0gc2V0dGluZyB0aGUgcmVhZC1vbmx5IGZsYWcgLSBhbmQKKyAgICAgICAgICogZmFpbCB0aGUgYnVpbGQgaWYgdGhhdCBmYWlscyBhcyB3ZWxsLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5RG9zT3JGYWlsLAorICAgICAgICAvKioKKyAgICAgICAgICogVHJ5IERvc0ZpbGVQZXJtaXNzaW9ucyAtIHNldHRpbmcgdGhlIHJlYWQtb25seSBmbGFnIC0gYW5kCisgICAgICAgICAqIGxvZyBhbiBlcnJvciBhbmQgZ28gb24gaWYgdGhhdCBmYWlscyBhcyB3ZWxsLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5RG9zT3JQYXNzCisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBwZXJtaXNzaW9ucyBhcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0LgorICAgICAqIEBwYXJhbSBwZXJtcyBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyBvZiB7QGxpbmsgUG9zaXhGaWxlUGVybWlzc2lvbn1zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb25zKFN0cmluZyBwZXJtcykgeworICAgICAgICBpZiAocGVybXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShwZXJtcy5zcGxpdCgiLCIpKSAvL05PU09OQVIKKyAgICAgICAgICAgICAgICAubWFwKFN0cmluZzo6dHJpbSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKHMgLT4gIXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIC5tYXAocyAtPiBFbnVtLnZhbHVlT2YoUG9zaXhGaWxlUGVybWlzc2lvbi5jbGFzcywgcykpCisgICAgICAgICAgICAgICAgLmZvckVhY2gocGVybWlzc2lvbnM6OmFkZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIDMgZGlnaXQgb2N0YWwgc3RyaW5nLCBzcGVjaWZ5IHRoZSB1c2VyLCBncm91cCBhbmQKKyAgICAgKiBvdGhlciBtb2RlcyBpbiB0aGUgc3RhbmRhcmQgVW5peCBmYXNoaW9uOworICAgICAqIEBwYXJhbSBvY3RhbFN0cmluZyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyBvY3RhbFN0cmluZykgeworICAgICAgICBpbnQgbW9kZSA9IEludGVnZXIucGFyc2VJbnQob2N0YWxTdHJpbmcsIDgpOworICAgICAgICBwZXJtaXNzaW9ucy5hZGRBbGwoUGVybWlzc2lvblV0aWxzLnBlcm1pc3Npb25zRnJvbU1vZGUobW9kZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIGZhaWwgd2hlbiBlcnJvcnMgYXJlIGVuY291bnRlcmVkLiBJZiBmYWxzZSwgbm90ZSBlcnJvcnMKKyAgICAgKiB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLiBEZWZhdWx0IGlzIHRydWUuCisgICAgICogPHA+T25seSBhcHBsaWVzIHRvIElPIGFuZCBTZWN1cml0eUV4Y2VwdGlvbnMsIHNlZSB7QGxpbmsKKyAgICAgKiAjc2V0Tm9uUG9zaXhNb2RlfSBmb3Igd2F5cyB0byBkZWFsIHdpdGggZmlsZS1zeXN0ZW1zIHRoYXQgZG9uJ3QKKyAgICAgKiBzdXBwb3J0IFBvc2l4UGVybWlzc2lvbnMuPC9wPgorICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciB0cnVlIG9yIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhaWxPbkVycm9yKGZpbmFsIGJvb2xlYW4gZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgdGhpcy5mYWlsb25lcnJvciA9IGZhaWxvbmVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGF0IHRvIGRvIGlmIGNoYW5naW5nIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUgaXMgbm90CisgICAgICogcG9zc2libGUgYmVjYXVzZSB0aGUgZmlsZS1zeXN0ZW0gZG9lc24ndCBzdXBwb3J0IFBPU0lYIGZpbGUKKyAgICAgKiBwZXJtaXNzaW9ucy4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCBpcyB7QGxpbmsgTm9uUG9zaXhNb2RlI2ZhaWx9LjwvcD4KKyAgICAgKiBAcGFyYW0gbSB3aGF0IHRvIGRvIGlmIGNoYW5naW5nIHRoZSBwZXJtaXNzaW9ucyBvZiBhIGZpbGUgaXMgbm90IHBvc3NpYmxlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Tm9uUG9zaXhNb2RlKE5vblBvc2l4TW9kZSBtKSB7CisgICAgICAgIHRoaXMubm9uUG9zaXhNb2RlID0gbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZXMgdG8gc2V0IHBlcm1pc3Npb25zIG9uLgorICAgICAqIEBwYXJhbSByYyBhIHJlc291cmNlIGNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOworICAgICAgICB9CisgICAgICAgIHJlc291cmNlcy5hZGQocmMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBdCBsZWFzdCBvbmUgcmVzb3VyY2UtY29sbGVjdGlvbiBpcyByZXF1aXJlZCIpOworICAgICAgICB9CisgICAgICAgIFJlc291cmNlIGN1cnJlbnRSZXNvdXJjZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50UmVzb3VyY2UgPSByOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25VdGlscy5zZXRQZXJtaXNzaW9ucyhyLCBwZXJtaXNzaW9ucywgdGhpczo6cG9zaXhQZXJtaXNzaW9uc05vdFN1cHBvcnRlZCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIG1heWJlVGhyb3dFeGNlcHRpb24oaW9lLCAiRmFpbGVkIHRvIHNldCBwZXJtaXNzaW9ucyBvbiAnJXMnIGR1ZSB0byAlcyIsIHIsIGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGNjZSkgeworICAgICAgICAgICAgbWF5YmVUaHJvd0V4Y2VwdGlvbihudWxsLAorICAgICAgICAgICAgICAgICJzb21lIHNwZWNpZmllZCBwZXJtaXNzaW9ucyBhcmUgbm90IG9mIHR5cGUgUG9zaXhGaWxlUGVybWlzc2lvbjogJXMiLAorICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmpvaW4ocGVybWlzc2lvbnMsICIsICIpKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIG1heWJlVGhyb3dFeGNlcHRpb24obnVsbCwKKyAgICAgICAgICAgICAgICAidGhlIFNlY3VyaXR5TWFuYWdlciBkZW5pZXMgcm9sZSBhY2Nlc3NVc2VySW5mb3JtYXRpb24gb3Igd3JpdGUgYWNjZXNzIGZvciBTZWN1cml0eU1hbmFnZXIuY2hlY2tXcml0ZSBmb3IgcmVzb3VyY2UgJyVzJyIsCisgICAgICAgICAgICAgICAgY3VycmVudFJlc291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKKyAgICAgICAgICAgIC8vIG1heWJlIHRocm93biBieSBjYWxsYmFjayBtZXRob2QgdGhpczo6cG9zaXhQZXJtaXNzaW9uc05vdFN1cHBvcnRlZC4KKyAgICAgICAgICAgIG1heWJlVGhyb3dFeGNlcHRpb24oYmUsIGJlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVUaHJvd0V4Y2VwdGlvbihFeGNlcHRpb24gZXhjLCBTdHJpbmcgbXNnRm9ybWF0LCBPYmplY3QuLi4gbXNnQXJncykgeworICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChtc2dGb3JtYXQsIG1zZ0FyZ3MpOworICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChleGMgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgZXhjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZXhjKTsKKyAgICAgICAgfQorICAgICAgICBsb2coIldhcm5pbmc6ICIgKyBtc2csIFByb2plY3QuTVNHX0VSUik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHBvc2l4UGVybWlzc2lvbnNOb3RTdXBwb3J0ZWQoUGF0aCBwKSB7CisgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgInRoZSBhc3NvY2lhdGVkIHBhdGggJyVzJyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBQb3NpeEZpbGVBdHRyaWJ1dGVWaWV3IiwKKyAgICAgICAgICAgIHApOworICAgICAgICBzd2l0Y2ggKG5vblBvc2l4TW9kZSkgeworICAgICAgICBjYXNlIGZhaWw6CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKKyAgICAgICAgY2FzZSBwYXNzOgorICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiAiICsgbXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdHJ5RG9zT3JGYWlsOgorICAgICAgICAgICAgdHJ5RG9zKHAsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgdHJ5RG9zT3JQYXNzOgorICAgICAgICAgICAgdHJ5RG9zKHAsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRyeURvcyhQYXRoIHAsIGJvb2xlYW4gZmFpbElmRG9zSXNOb3RTdXBwb3J0ZWQpIHsKKyAgICAgICAgbG9nKCJGYWxsaW5nIGJhY2sgdG8gRG9zRmlsZUF0dHJpYnV0ZVZpZXciKTsKKyAgICAgICAgYm9vbGVhbiByZWFkT25seSA9ICFpc1dyaXRhYmxlKCk7CisgICAgICAgIERvc0ZpbGVBdHRyaWJ1dGVWaWV3IHZpZXcgPSBGaWxlcy5nZXRGaWxlQXR0cmlidXRlVmlldyhwLCBEb3NGaWxlQXR0cmlidXRlVmlldy5jbGFzcyk7CisgICAgICAgIGlmICh2aWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmlldy5zZXRSZWFkT25seShyZWFkT25seSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBtYXliZVRocm93RXhjZXB0aW9uKGlvZSwgIkZhaWxlZCB0byBzZXQgcGVybWlzc2lvbnMgb24gJyVzJyBkdWUgdG8gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgaW9lLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiB1b2UpIHsKKyAgICAgICAgICAgICAgICBtYXliZVRocm93RXhjZXB0aW9uKG51bGwsCisgICAgICAgICAgICAgICAgICAgICJ0aGUgU2VjdXJpdHlNYW5hZ2VyIGRlbmllcyByb2xlIGFjY2Vzc1VzZXJJbmZvcm1hdGlvbiBvciB3cml0ZSBhY2Nlc3MgZm9yIFNlY3VyaXR5TWFuYWdlci5jaGVja1dyaXRlIGZvciByZXNvdXJjZSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAidGhlIGFzc29jaWF0ZWQgcGF0aCAnJXMnIGRvZXMgbm90IHN1cHBvcnQgdGhlIERvc0ZpbGVBdHRyaWJ1dGVWaWV3IiwKKyAgICAgICAgICAgICAgICBwKTsKKyAgICAgICAgICAgIGlmIChmYWlsSWZEb3NJc05vdFN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJXYXJuaW5nOiAiICsgbXNnLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzV3JpdGFibGUoKSB7CisgICAgICAgIHJldHVybiBwZXJtaXNzaW9ucy5jb250YWlucyhQb3NpeEZpbGVQZXJtaXNzaW9uLk9XTkVSX1dSSVRFKQorICAgICAgICAgICAgfHwgcGVybWlzc2lvbnMuY29udGFpbnMoUG9zaXhGaWxlUGVybWlzc2lvbi5HUk9VUF9XUklURSkKKyAgICAgICAgICAgIHx8IHBlcm1pc3Npb25zLmNvbnRhaW5zKFBvc2l4RmlsZVBlcm1pc3Npb24uT1RIRVJTX1dSSVRFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyLmphdmEKaW5kZXggYmIxNzE3NC4uNjA2NmQ4NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2lnbkphci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NpZ25KYXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM2LDE0ICszNiwxMyBAQAogLyoqCiAgKiBTaWducyBKQVIgb3IgWklQIGZpbGVzIHdpdGggdGhlIGphdmFzaWduIGNvbW1hbmQgbGluZSB0b29sLiBUaGUgdG9vbCBkZXRhaWxlZAogICogZGVwZW5kZW5jeSBjaGVja2luZzogZmlsZXMgYXJlIG9ubHkgc2lnbmVkIGlmIHRoZXkgYXJlIG5vdCBzaWduZWQuIFRoZQotICogPHR0PnNpZ25qYXI8L3R0PiBhdHRyaWJ1dGUgY2FuIHBvaW50IHRvIHRoZSBmaWxlIHRvIGdlbmVyYXRlOyBpZiB0aGlzIGZpbGUKKyAqIDxjb2RlPnNpZ25qYXI8L2NvZGU+IGF0dHJpYnV0ZSBjYW4gcG9pbnQgdG8gdGhlIGZpbGUgdG8gZ2VuZXJhdGU7IGlmIHRoaXMgZmlsZQogICogZXhpc3RzIHRoZW4gaXRzIG1vZGlmaWNhdGlvbiBkYXRlIGlzIHVzZWQgYXMgYSBjdWUgYXMgdG8gd2hldGhlciB0byByZXNpZ24KICAqIGFueSBKQVIgZmlsZS4KICAqCi0gKiBUaW1lc3RhbXAgZHJpdmVuIHNpZ25pbmcgaXMgYmFzZWQgb24gdGhlIHVuc3RhYmxlIGFuZCBpbmFkZXF1YXRlbHkgZG9jdW1lbnRlZAotICogaW5mb3JtYXRpb24gaW4gdGhlIEphdmExLjUgZG9jcwotICogQHNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9ndWlkZS9zZWN1cml0eS90aW1lLW9mLXNpZ25pbmctYmV0YTEuaHRtbCI+Ci0gKiBiZXRhIGRvY3VtZW50YXRpb248L2E+CisgKiBUaW1lc3RhbXAgc2lnbmF0dXJlIHN1cHBvcnQgaXMgYmFzZWQgb24gSmF2YSA4CisgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS90aW1lLW9mLXNpZ25pbmcuaHRtbCI+CisgKiBkb2N1bWVudGF0aW9uPC9hPgogICogQGFudC50YXNrIGNhdGVnb3J5PSJqYXZhIgogICogQHNpbmNlIEFudCAxLjEKICAqLwpAQCAtNTMsNiArNTIsMzggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKIAogICAgIC8qKgorICAgICAqIGVycm9yIHN0cmluZyBmb3IgdW5pdCB0ZXN0IHZlcmlmaWNhdGlvbjoge0B2YWx1ZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9UT0RJUl9BTkRfU0lHTkVESkFSCisgICAgICAgICAgICA9ICInZGVzdGRpcicgYW5kICdzaWduZWRqYXInIGNhbm5vdCBib3RoIGJlIHNldCI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RPT19NQU5ZX01BUFBFUlMgPSAiVG9vIG1hbnkgbWFwcGVycyI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uIHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lHTkVESkFSX0FORF9QQVRIUworICAgICAgICA9ICJZb3UgY2Fubm90IHNwZWNpZnkgdGhlIHNpZ25lZCBKQVIgd2hlbiB1c2luZyBwYXRocyBvciBmaWxlc2V0cyI7CisgICAgLyoqCisgICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0JBRF9NQVAgPSAiQ2Fubm90IG1hcCBzb3VyY2UgZmlsZSB0byBhbnl0aGluZyBzZW5zaWJsZTogIjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUFQUEVSX1dJVEhPVVRfREVTVAorICAgICAgICA9ICJUaGUgZGVzdERpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaWYgYSBtYXBwZXIgaXMgc2V0IjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQUxJQVMgPSAiYWxpYXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IjsKKyAgICAvKioKKyAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fU1RPUkVQQVNTID0gInN0b3JlcGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiOworCisgICAgLyoqCiAgICAgICogbmFtZSB0byBhIHNpZ25hdHVyZSBmaWxlCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBzaWdmaWxlOwpAQCAtMTI5LDM2ICsxNjAsMTAgQEAKICAgICBwcml2YXRlIFN0cmluZyBkaWdlc3RBbGc7CiAKICAgICAvKioKLSAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9CisgICAgICogdHNhIGRpZ2VzdCBhbGdvcml0aG0KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9UT0RJUl9BTkRfU0lHTkVESkFSCi0gICAgICAgICAgICA9ICInZGVzdGRpcicgYW5kICdzaWduZWRqYXInIGNhbm5vdCBib3RoIGJlIHNldCI7Ci0gICAgLyoqCi0gICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RPT19NQU5ZX01BUFBFUlMgPSAiVG9vIG1hbnkgbWFwcGVycyI7Ci0gICAgLyoqCi0gICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uIHtAdmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfU0lHTkVESkFSX0FORF9QQVRIUwotICAgICAgICA9ICJZb3UgY2Fubm90IHNwZWNpZnkgdGhlIHNpZ25lZCBKQVIgd2hlbiB1c2luZyBwYXRocyBvciBmaWxlc2V0cyI7Ci0gICAgLyoqCi0gICAgICogZXJyb3Igc3RyaW5nIGZvciB1bml0IHRlc3QgdmVyaWZpY2F0aW9uOiB7QHZhbHVlfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0JBRF9NQVAgPSAiQ2Fubm90IG1hcCBzb3VyY2UgZmlsZSB0byBhbnl0aGluZyBzZW5zaWJsZTogIjsKLSAgICAvKioKLSAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTUFQUEVSX1dJVEhPVVRfREVTVAotICAgICAgICA9ICJUaGUgZGVzdERpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgaWYgYSBtYXBwZXIgaXMgc2V0IjsKLSAgICAvKioKLSAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fQUxJQVMgPSAiYWxpYXMgYXR0cmlidXRlIG11c3QgYmUgc2V0IjsKLSAgICAvKioKLSAgICAgKiBlcnJvciBzdHJpbmcgZm9yIHVuaXQgdGVzdCB2ZXJpZmljYXRpb246IHtAdmFsdWV9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fU1RPUkVQQVNTID0gInN0b3JlcGFzcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiOworICAgIHByaXZhdGUgU3RyaW5nIHRzYURpZ2VzdEFsZzsKKwogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKICAgICAvKioKQEAgLTM2OSw2ICszNzQsMjYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUU0EgRGlnZXN0IEFsZ29yaXRobTsgb3B0aW9uYWwKKyAgICAgKgorICAgICAqIEBwYXJhbSBkaWdlc3RBbGcgdGhlIHRzYSBkaWdlc3QgYWxnb3JpdGhtCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUU0FEaWdlc3RBbGcoU3RyaW5nIGRpZ2VzdEFsZykgeworICAgICAgICB0aGlzLnRzYURpZ2VzdEFsZyA9IGRpZ2VzdEFsZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUU0EgRGlnZXN0IEFsZ29yaXRobTsgb3B0aW9uYWwKKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRTQURpZ2VzdEFsZygpIHsKKyAgICAgICAgcmV0dXJuIHRzYURpZ2VzdEFsZzsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBzaWduIHRoZSBqYXIocykKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3JzCkBAIC00MjQsMTQgKzQ0OSw3IEBACiAKICAgICAgICAgICAgIFBhdGggc291cmNlcyA9IGNyZWF0ZVVuaWZpZWRTb3VyY2VQYXRoKCk7CiAgICAgICAgICAgICAvL3NldCB1cCBvdXIgbWFwcGluZyBwb2xpY3kKLSAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIGRlc3RNYXBwZXI7Ci0gICAgICAgICAgICBpZiAoaGFzTWFwcGVyKSB7Ci0gICAgICAgICAgICAgICAgZGVzdE1hcHBlciA9IG1hcHBlcjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9ubyBtYXBwZXI/IHVzZSB0aGUgaWRlbnRpdHkgcG9saWN5Ci0gICAgICAgICAgICAgICAgZGVzdE1hcHBlciA9IG5ldyBJZGVudGl0eU1hcHBlcigpOwotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBkZXN0TWFwcGVyID0gaGFzTWFwcGVyID8gbWFwcGVyIDogbmV3IElkZW50aXR5TWFwcGVyKCk7CiAKICAgICAgICAgICAgIC8vYXQgdGhpcyBwb2ludCB0aGUgcGF0aHMgYXJlIHNldCB1cCB3aXRoIGxpc3RzIG9mIGZpbGVzLAogICAgICAgICAgICAgLy9hbmQgdGhlIG1hcHBlciBpcyByZWFkeSB0byBtYXAgZnJvbSBzb3VyY2UgZGlycyB0byBkZXN0IGZpbGVzCkBAIC01NzAsNiArNTg4LDExIEBACiAgICAgICAgICAgICAgICAgYWRkUHJveHlGb3IoY21kLCAiaHR0cCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKHRzYURpZ2VzdEFsZyAhPSBudWxsKSB7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsICItdHNhZGlnZXN0YWxnIik7CisgICAgICAgICAgICBhZGRWYWx1ZShjbWQsIHRzYURpZ2VzdEFsZyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcC5qYXZhCmluZGV4IDdmMTI0Y2MuLjVhZmQwYjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2xlZXAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY0LDE1ICs2NCwxMiBAQAogICAgICAqLwogICAgIHByaXZhdGUgaW50IG1pbGxpc2Vjb25kcyA9IDA7CiAKLQotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UKICAgICAgKi8KICAgICBwdWJsaWMgU2xlZXAoKSB7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgc2xlZXAgdGltZQogICAgICAqCkBAIC04Miw3ICs3OSw2IEBACiAgICAgICAgIHRoaXMuc2Vjb25kcyA9IHNlY29uZHM7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBob3VycyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUuCiAgICAgICoKQEAgLTkyLDcgKzg4LDYgQEAKICAgICAgICAgdGhpcy5ob3VycyA9IGhvdXJzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogbWludXRlcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKICAgICAgKgpAQCAtMTAyLDcgKzk3LDYgQEAKICAgICAgICAgdGhpcy5taW51dGVzID0gbWludXRlczsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIG1pbGxpc2Vjb25kcyB0byBhZGQgdG8gdGhlIHNsZWVwIHRpbWUKICAgICAgKgpAQCAtMTEyLDcgKzEwNiw2IEBACiAgICAgICAgIHRoaXMubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogc2xlZXAgZm9yIGEgcGVyaW9kIG9mIHRpbWUKICAgICAgKgpAQCAtMTI2LDcgKzExOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGZsYWcgY29udHJvbGxpbmcgd2hldGhlciB0byBicmVhayB0aGUgYnVpbGQgb24gYW4gZXJyb3IuCiAgICAgICoKQEAgLTEzNiw3ICsxMjgsNiBAQAogICAgICAgICB0aGlzLmZhaWxPbkVycm9yID0gZmFpbE9uRXJyb3I7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiByZXR1cm4gdGltZSB0byBzbGVlcAogICAgICAqCkBAIC0xNTAsNyArMTQxLDYgQEAKICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogdmVyaWZ5IHBhcmFtZXRlcnMKICAgICAgKgpAQCAtMTU5LDEyICsxNDksMTAgQEAKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChnZXRTbGVlcFRpbWUoKSA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVnYXRpdmUgc2xlZXAgcGVyaW9kcyBhcmUgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTmVnYXRpdmUgc2xlZXAgcGVyaW9kcyBhcmUgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBFeGVjdXRlcyB0aGlzIGJ1aWxkIHRhc2suCiAgICAgICoKQEAgLTE4MiwxMiArMTcwLDkgQEAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgbG9nKHRleHQsIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coZS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICB9CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N0cmVhbVB1bXBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3RyZWFtUHVtcGVyLmphdmEKaW5kZXggYzdhZmM0ZC4uMmM0YWFlZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3RyZWFtUHVtcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3RyZWFtUHVtcGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01OCw3ICs1OCw2IEBACiAgICAgICAgIHRoaXMoaXMsIG9zLCBjbG9zZVdoZW5FeGhhdXN0ZWQsIGZhbHNlKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5ldyBTdHJlYW1QdW1wZXIuCiAgICAgICogPHA+PGI+Tm90ZTo8L2I+IElmIHlvdSBzZXQgdXNlQXZhaWxhYmxlIHRvIHRydWUsIHlvdSBtdXN0CkBAIC0xMTQsNiArMTEzLDcgQEAKICAgICAgKgogICAgICAqIFRlcm1pbmF0ZXMgYXMgc29vbiBhcyB0aGUgaW5wdXQgc3RyZWFtIGlzIGNsb3NlZCBvciBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3ViQW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnQuamF2YQppbmRleCBhYzAyM2M0Li42ZTA5MDMyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC03MiwxNyArNzIsMTcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gZmFpbE9uRXJyb3IgPSB0cnVlOwogICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dCAgPSBudWxsOwogCi0gICAgcHJpdmF0ZSBWZWN0b3IgcHJvcGVydGllcyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFZlY3RvciByZWZlcmVuY2VzID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgVmVjdG9yIHByb3BlcnR5U2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIExpc3Q8QW50LlJlZmVyZW5jZT4gcmVmZXJlbmNlcyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVNldD4gcHJvcGVydHlTZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogdGhlIHRhcmdldHMgdG8gY2FsbCBvbiB0aGUgbmV3IHByb2plY3QgKi8KLSAgICBwcml2YXRlIFZlY3Rvci8qPFRhcmdldEVsZW1lbnQ+Ki8gdGFyZ2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8VGFyZ2V0RWxlbWVudD4gdGFyZ2V0cyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBkZWZhdWx0IGJ1aWxkIGZpbGUgbmFtZSB0byB1c2Ugd2hlbiBsYXVuY2hpbmcgdGhlIHRhc2suCiAgICAgICogPHA+Ci0gICAgICogVGhpcyBmdW5jdGlvbiBtYXkgYmUgb3ZlcnJpZGVuIGJ5IHByb3ZpZGVycyBvZiBjdXN0b20gUHJvamVjdEhlbHBlciBzbworICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkZXJzIG9mIGN1c3RvbSBQcm9qZWN0SGVscGVyIHNvCiAgICAgICogdGhleSBjYW4gaW1wbGVtZW50IGVhc2lseSB0aGVpciBzdWIgbGF1bmNoZXIuCiAgICAgICogPC9wPgogICAgICAqCkBAIC0yMjcsNyArMjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbG9nKCJMZWF2aW5nIGRpcmVjdG9yeTogIiArIHN1YmRpclBhdGggKyAiXG4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZ2V0UHJvamVjdCgpLmlzS2VlcEdvaW5nTW9kZSgpKSkgeworICAgICAgICAgICAgICAgIGlmICghZ2V0UHJvamVjdCgpLmlzS2VlcEdvaW5nTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlICYmIHN1YmRpclBhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJMZWF2aW5nIGRpcmVjdG9yeTogIiArIHN1YmRpclBhdGggKyAiXG4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjM1LDcgKzIzNSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRocm93bkV4Y2VwdGlvbiA9IGV4OwogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEoZ2V0UHJvamVjdCgpLmlzS2VlcEdvaW5nTW9kZSgpKSkgeworICAgICAgICAgICAgICAgIGlmICghZ2V0UHJvamVjdCgpLmlzS2VlcEdvaW5nTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlICYmIHN1YmRpclBhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJMZWF2aW5nIGRpcmVjdG9yeTogIiArIHN1YmRpclBhdGggKyAiXG4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjk3LDExICsyOTcsNyBAQAogICAgICAgICBhbnQgPSBjcmVhdGVBbnRUYXNrKGRpcmVjdG9yeSk7CiAgICAgICAgIFN0cmluZyBhbnRmaWxlbmFtZSA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIGFudC5zZXRBbnRmaWxlKGFudGZpbGVuYW1lKTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSB0YXJnZXRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFRhcmdldEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IChUYXJnZXRFbGVtZW50KSB0YXJnZXRzLmdldChpKTsKLSAgICAgICAgICAgIGFudC5hZGRDb25maWd1cmVkVGFyZ2V0KHRhcmdldEVsZW1lbnQpOwotICAgICAgICB9CisgICAgICAgIHRhcmdldHMuZm9yRWFjaChhbnQ6OmFkZENvbmZpZ3VyZWRUYXJnZXQpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSkgewpAQCAtMzMyLDEzICszMjgsOCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBpc0hhcmRFcnJvcihUaHJvd2FibGUgdCkgewogICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CiAgICAgICAgICAgICByZXR1cm4gaXNIYXJkRXJyb3IodC5nZXRDYXVzZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgT3V0T2ZNZW1vcnlFcnJvcikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIFRocmVhZERlYXRoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsgLy8gaW5jbC4gdCA9PSBudWxsCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBPdXRPZk1lbW9yeUVycm9yIHx8IHQgaW5zdGFuY2VvZiBUaHJlYWREZWF0aDsKICAgICB9CiAKICAgICAvKioKQEAgLTM5Myw4ICszODQsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFRhcmdldChUYXJnZXRFbGVtZW50IHQpIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSB0LmdldE5hbWUoKTsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhuYW1lKSkgeworICAgICAgICBpZiAodC5nZXROYW1lKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRhcmdldCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgICAgICAgIH0KICAgICAgICAgdGFyZ2V0cy5hZGQodCk7CkBAIC00NDYsNyArNDM2LDcgQEAKICAgICAgKiBAcGFyYW0gIHAgdGhlIHByb3BlcnR5IHRvIHBhc3Mgb24gZXhwbGljaXRseSB0byB0aGUgc3ViLWJ1aWxkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFByb3BlcnR5IHApIHsKLSAgICAgICAgcHJvcGVydGllcy5hZGRFbGVtZW50KHApOworICAgICAgICBwcm9wZXJ0aWVzLmFkZChwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ1Niw3ICs0NDYsNyBAQAogICAgICAqIEBwYXJhbSAgciB0aGUgcmVmZXJlbmNlIHRvIHBhc3Mgb24gZXhwbGljaXRseSB0byB0aGUgc3ViLWJ1aWxkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShBbnQuUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgcmVmZXJlbmNlcy5hZGRFbGVtZW50KHIpOworICAgICAgICByZWZlcmVuY2VzLmFkZChyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2NSw3ICs0NTUsNyBAQAogICAgICAqIEBwYXJhbSBwcyB0aGUgcHJvcGVydHlzZXQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eXNldChQcm9wZXJ0eVNldCBwcykgewotICAgICAgICBwcm9wZXJ0eVNldHMuYWRkRWxlbWVudChwcyk7CisgICAgICAgIHByb3BlcnR5U2V0cy5hZGQocHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTc5LDcgKzU2OSw3IEBACiAgICAgcHJpdmF0ZSBBbnQgY3JlYXRlQW50VGFzayhGaWxlIGRpcmVjdG9yeSkgewogICAgICAgICBBbnQgYW50VGFzayA9IG5ldyBBbnQodGhpcyk7CiAgICAgICAgIGFudFRhc2suaW5pdCgpOwotICAgICAgICBpZiAoc3ViVGFyZ2V0ICE9IG51bGwgJiYgc3ViVGFyZ2V0Lmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoc3ViVGFyZ2V0ICE9IG51bGwgJiYgIXN1YlRhcmdldC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGFudFRhc2suc2V0VGFyZ2V0KHN1YlRhcmdldCk7CiAgICAgICAgIH0KIApAQCAtNTk1LDE4ICs1ODUsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFudFRhc2suc2V0SW5oZXJpdEFsbChpbmhlcml0QWxsKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBpID0gcHJvcGVydGllcy5lbGVtZW50cygpOyBpLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgY29weVByb3BlcnR5KGFudFRhc2suY3JlYXRlUHJvcGVydHkoKSwgKFByb3BlcnR5KSBpLm5leHRFbGVtZW50KCkpOwotICAgICAgICB9CiAKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBpID0gcHJvcGVydHlTZXRzLmVsZW1lbnRzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBhbnRUYXNrLmFkZFByb3BlcnR5c2V0KChQcm9wZXJ0eVNldCkgaS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocCAtPiBjb3B5UHJvcGVydHkoYW50VGFzay5jcmVhdGVQcm9wZXJ0eSgpLCBwKSk7CisKKyAgICAgICAgcHJvcGVydHlTZXRzLmZvckVhY2goYW50VGFzazo6YWRkUHJvcGVydHlzZXQpOwogCiAgICAgICAgIGFudFRhc2suc2V0SW5oZXJpdFJlZnMoaW5oZXJpdFJlZnMpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGkgPSByZWZlcmVuY2VzLmVsZW1lbnRzKCk7IGkuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBhbnRUYXNrLmFkZFJlZmVyZW5jZSgoQW50LlJlZmVyZW5jZSkgaS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgfQorCisgICAgICAgIHJlZmVyZW5jZXMuZm9yRWFjaChhbnRUYXNrOjphZGRSZWZlcmVuY2UpOwogCiAgICAgICAgIHJldHVybiBhbnRUYXNrOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5bmMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N5bmMuamF2YQppbmRleCA1N2QyZjA5Li40OGViNjQ3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3luYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTIgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5FeGlzdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm9uZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogCiAvKioKICAqIFN5bmNocm9uaXplIGEgbG9jYWwgdGFyZ2V0IGRpcmVjdG9yeSBmcm9tIHRoZSBmaWxlcyBkZWZpbmVkCkBAIC0xMDUsNyArMTA2LDcgQEAKICAgICAgICAgRmlsZSB0b0RpciA9IG15Q29weS5nZXRUb0RpcigpOwogCiAgICAgICAgIC8vIFRoZSBjb21wbGV0ZSBsaXN0IG9mIGZpbGVzIHRvIGNvcHkKLSAgICAgICAgU2V0IGFsbEZpbGVzID0gbXlDb3B5Lm5vbk9ycGhhbnM7CisgICAgICAgIFNldDxTdHJpbmc+IGFsbEZpbGVzID0gbXlDb3B5Lm5vbk9ycGhhbnM7CiAKICAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBkaWRuJ3QgYWxyZWFkeSBleGlzdCwKICAgICAgICAgLy8gb3Igd2FzIGVtcHR5LCB0aGVuIG5vIHByZXZpb3VzIGZpbGUgcmVtb3ZhbCBpcyBuZWNlc3NhcnkhCkBAIC0xMjQsNyArMTI1LDcgQEAKICAgICAgICAgLy8gd2lsbCBob2xkIHRoZSBkaXJlY3RvcmllcyBtYXRjaGVkIGJ5IFN5bmNUYXJnZXQgaW4gcmV2ZXJzZWQKICAgICAgICAgLy8gbGV4aWNvZ3JhcGhpYyBvcmRlciAob3JkZXIgaXMgaW1wb3J0YW50LCB0aGF0J3Mgd2h5IHdlIHVzZQogICAgICAgICAvLyBhIExpbmtlZEhhc2hTZXQKLSAgICAgICAgU2V0IHByZXNlcnZlZERpcmVjdG9yaWVzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKKyAgICAgICAgU2V0PEZpbGU+IHByZXNlcnZlZERpcmVjdG9yaWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogCiAgICAgICAgIC8vIEdldCByaWQgb2YgYWxsIGZpbGVzIG5vdCBsaXN0ZWQgaW4gdGhlIHNvdXJjZSBmaWxlc2V0cy4KICAgICAgICAgbG9nKCJQQVNTIzI6IFJlbW92aW5nIG9ycGhhbiBmaWxlcyBmcm9tICIgKyB0b0RpciwgUHJvamVjdC5NU0dfREVCVUcpOwpAQCAtMTg2LDE1ICsxODcsMTUgQEAKICAgICAgKiBQb3NpdGlvbiAwIG9mIHRoZSBhcnJheSBpcyB0aGUgbnVtYmVyIG9mIG9ycGhhbmVkIGRpcmVjdG9yaWVzLgogICAgICAqIFBvc2l0aW9uIDEgb2YgdGhlIGFycmF5IGlzIHRoZSBudW1iZXIgb3Igb3JwaGFuZWQgZmlsZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnRbXSByZW1vdmVPcnBoYW5GaWxlcyhTZXQgbm9uT3JwaGFucywgRmlsZSB0b0RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCBwcmVzZXJ2ZWREaXJlY3RvcmllcykgeworICAgIHByaXZhdGUgaW50W10gcmVtb3ZlT3JwaGFuRmlsZXMoU2V0PFN0cmluZz4gbm9uT3JwaGFucywgRmlsZSB0b0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxGaWxlPiBwcmVzZXJ2ZWREaXJlY3RvcmllcykgewogICAgICAgICBpbnRbXSByZW1vdmVkQ291bnQgPSBuZXcgaW50W10gezAsIDB9OwogICAgICAgICBTdHJpbmdbXSBleGNscyA9Ci0gICAgICAgICAgICAoU3RyaW5nW10pIG5vbk9ycGhhbnMudG9BcnJheShuZXcgU3RyaW5nW25vbk9ycGhhbnMuc2l6ZSgpICsgMV0pOworICAgICAgICAgICAgbm9uT3JwaGFucy50b0FycmF5KG5ldyBTdHJpbmdbbm9uT3JwaGFucy5zaXplKCkgKyAxXSk7CiAgICAgICAgIC8vIHdhbnQgdG8ga2VlcCB0b0RpciBpdHNlbGYKICAgICAgICAgZXhjbHNbbm9uT3JwaGFucy5zaXplKCldID0gIiI7CiAKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG51bGw7CisgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHM7CiAgICAgICAgIGlmIChzeW5jVGFyZ2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSBzeW5jVGFyZ2V0LnRvRmlsZVNldChmYWxzZSk7CiAgICAgICAgICAgICBmcy5zZXREaXIodG9EaXIpOwpAQCAtMjEzLDggKzIxNCw4IEBACiAgICAgICAgICAgICBGaWxlU2VsZWN0b3JbXSBzID0gc3luY1RhcmdldC5nZXRTZWxlY3RvcnMoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgIGlmIChzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBOb25lU2VsZWN0b3IgbnMgPSBuZXcgTm9uZVNlbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5zLmFwcGVuZFNlbGVjdG9yKHNbaV0pOworICAgICAgICAgICAgICAgIGZvciAoRmlsZVNlbGVjdG9yIGVsZW1lbnQgOiBzKSB7CisgICAgICAgICAgICAgICAgICAgIG5zLmFwcGVuZFNlbGVjdG9yKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmcy5hcHBlbmRTZWxlY3Rvcihucyk7CiAgICAgICAgICAgICB9CkBAIC0yMjIsNiArMjIzLDEwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgICAgICBkcy5zZXRCYXNlZGlyKHRvRGlyKTsKKyAgICAgICAgICAgIC8vIHNldCB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAvLyBkaXJlY3Rvcnkgd2UgYXJlIHNjYW5uaW5nLCBpZiB3ZSBhcmUgYWJsZSB0byBkZXRlcm1pbmUgdGhhdCBkZXRhaWwuCisgICAgICAgICAgICAvLyBFbHNlIGxldCB0aGUgZGlyZWN0b3J5IHNjYW5uZXIgZGVmYXVsdCBpdCB0byB3aGF0ZXZlciBpdCBkb2VzIGludGVybmFsbHkKKyAgICAgICAgICAgIEZpbGVVdGlscy5pc0Nhc2VTZW5zaXRpdmVGaWxlU3lzdGVtKHRvRGlyLnRvUGF0aCgpKS5pZlByZXNlbnQoZHM6OnNldENhc2VTZW5zaXRpdmUpOwogICAgICAgICB9CiAgICAgICAgIGRzLmFkZEV4Y2x1ZGVzKGV4Y2xzKTsKIApAQCAtMjQ5LDcgKzI1NCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBCb29sZWFuIHBlZCA9IGdldEV4cGxpY2l0UHJlc2VydmVFbXB0eURpcnMoKTsKLSAgICAgICAgaWYgKHBlZCAhPSBudWxsICYmIHBlZC5ib29sZWFuVmFsdWUoKSAhPSBteUNvcHkuZ2V0SW5jbHVkZUVtcHR5RGlycygpKSB7CisgICAgICAgIGlmIChwZWQgIT0gbnVsbCAmJiBwZWQgIT0gbXlDb3B5LmdldEluY2x1ZGVFbXB0eURpcnMoKSkgewogICAgICAgICAgICAgRmlsZVNldCBmcyA9IHN5bmNUYXJnZXQudG9GaWxlU2V0KHRydWUpOwogICAgICAgICAgICAgZnMuc2V0RGlyKHRvRGlyKTsKICAgICAgICAgICAgIFN0cmluZ1tdIHByZXNlcnZlZERpcnMgPQpAQCAtMjgxLDcgKzI4Niw3IEBACiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVtcHR5IGRpcmVjdG9yaWVzIGFjdHVhbGx5IHJlbW92ZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBpbnQgcmVtb3ZlRW1wdHlEaXJlY3RvcmllcyhGaWxlIGRpciwgYm9vbGVhbiByZW1vdmVJZkVtcHR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHByZXNlcnZlZEVtcHR5RGlyZWN0b3JpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxGaWxlPiBwcmVzZXJ2ZWRFbXB0eURpcmVjdG9yaWVzKSB7CiAgICAgICAgIGludCByZW1vdmVkQ291bnQgPSAwOwogICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIEZpbGVbXSBjaGlsZHJlbiA9IGRpci5saXN0RmlsZXMoKTsKQEAgLTMyMCwxMSArMzI1LDkgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KLSAgICBwcml2YXRlIGludCByZW1vdmVFbXB0eURpcmVjdG9yaWVzKFNldCBwcmVzZXJ2ZWRFbXB0eURpcmVjdG9yaWVzKSB7CisgICAgcHJpdmF0ZSBpbnQgcmVtb3ZlRW1wdHlEaXJlY3RvcmllcyhTZXQ8RmlsZT4gcHJlc2VydmVkRW1wdHlEaXJlY3RvcmllcykgewogICAgICAgICBpbnQgcmVtb3ZlZENvdW50ID0gMDsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gcHJlc2VydmVkRW1wdHlEaXJlY3Rvcmllcy5pdGVyYXRvcigpOwotICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRmlsZSBmID0gKEZpbGUpIGl0ZXIubmV4dCgpOworICAgICAgICBmb3IgKEZpbGUgZiA6IHByZXNlcnZlZEVtcHR5RGlyZWN0b3JpZXMpIHsKICAgICAgICAgICAgIFN0cmluZ1tdIHMgPSBmLmxpc3QoKTsKICAgICAgICAgICAgIGlmIChzID09IG51bGwgfHwgcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgIGxvZygiUmVtb3ZpbmcgZW1wdHkgZGlyZWN0b3J5OiAiICsgZiwgUHJvamVjdC5NU0dfREVCVUcpOwpAQCAtNDMxLDggKzQzNCw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJlc2VydmVJblRhcmdldChTeW5jVGFyZ2V0IHMpIHsKICAgICAgICAgaWYgKHN5bmNUYXJnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgbXVzdCBub3Qgc3BlY2lmeSBtdWx0aXBsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJlc2VydmVpbnRhcmdldCBlbGVtZW50cy4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAieW91IG11c3Qgbm90IHNwZWNpZnkgbXVsdGlwbGUgcHJlc2VydmVpbnRhcmdldCBlbGVtZW50cy4iKTsKICAgICAgICAgfQogICAgICAgICBzeW5jVGFyZ2V0ID0gczsKICAgICB9CkBAIC00NTQsMTEgKzQ1Nyw3IEBACiAKICAgICAgICAgLy8gTGlzdCBvZiBmaWxlcyB0aGF0IG11c3QgYmUgY29waWVkLCBpcnJlbGV2YW50IGZyb20gdGhlCiAgICAgICAgIC8vIGZhY3QgdGhhdCB0aGV5IGFyZSBuZXdlciBvciBub3QgdGhhbiB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgIHByaXZhdGUgU2V0IG5vbk9ycGhhbnMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgTXlDb3B5LiAqLwotICAgICAgICBwdWJsaWMgTXlDb3B5KCkgewotICAgICAgICB9CisgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbm9uT3JwaGFucyA9IG5ldyBIYXNoU2V0PD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQHNlZSBDb3B5I3NjYW4oRmlsZSwgRmlsZSwgU3RyaW5nW10sIFN0cmluZ1tdKQpAQCAtNDcxLDEyICs0NzAsOCBAQAogCiAgICAgICAgICAgICBzdXBlci5zY2FuKGZyb21EaXIsIHRvRGlyLCBmaWxlcywgZGlycyk7CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBub25PcnBoYW5zLmFkZChmaWxlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBub25PcnBoYW5zLmFkZChkaXJzW2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChub25PcnBoYW5zLCBmaWxlcyk7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwobm9uT3JwaGFucywgZGlycyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQ4NCwxMiArNDc5LDExIEBACiAgICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgICovCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgTWFwIHNjYW4oUmVzb3VyY2VbXSByZXNvdXJjZXMsIEZpbGUgdG9EaXIpIHsKKyAgICAgICAgcHJvdGVjdGVkIE1hcDxSZXNvdXJjZSwgU3RyaW5nW10+IHNjYW4oUmVzb3VyY2VbXSByZXNvdXJjZXMsIEZpbGUgdG9EaXIpIHsKICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIG1hcHBlciIsIG1hcHBlckVsZW1lbnQgPT0gbnVsbCk7CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbm9uT3JwaGFucy5hZGQocmVzb3VyY2VzW2ldLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJlYW0ub2YocmVzb3VyY2VzKS5tYXAoUmVzb3VyY2U6OmdldE5hbWUpLmZvckVhY2gobm9uT3JwaGFuczo6YWRkKTsKKwogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNjYW4ocmVzb3VyY2VzLCB0b0Rpcik7CiAgICAgICAgIH0KIApAQCAtNTM2LDYgKzUzMCw3IEBACiAgICAgICAgICAqIFRoaXMganVzdCBjaGFuZ2VzIHRoZSBkZWZhdWx0IHZhbHVlIG9mICJkZWZhdWx0ZXhjbHVkZXMiIGZyb20KICAgICAgICAgICogdHJ1ZSB0byBmYWxzZS4KICAgICAgICAgICovCisgICAgICAgIC8vIFRPRE8gZG9lcyBpdD8gXgogICAgICAgICBwdWJsaWMgU3luY1RhcmdldCgpIHsKICAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgIH0KQEAgLTU0OCw4ICs1NDMsOCBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJlc2VydmVpbnRhcmdldCBkb2Vzbid0IHN1cHBvcnQgdGhlIGRpciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInByZXNlcnZlaW50YXJnZXQgZG9lc24ndCBzdXBwb3J0IHRoZSBkaXIgYXR0cmlidXRlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTU2MCw3ICs1NTUsNyBAQAogICAgICAgICAgKiBAc2luY2UgQW50IDEuOC4wCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmVzZXJ2ZUVtcHR5RGlycyhib29sZWFuIGIpIHsKLSAgICAgICAgICAgIHByZXNlcnZlRW1wdHlEaXJzID0gQm9vbGVhbi52YWx1ZU9mKGIpOworICAgICAgICAgICAgcHJlc2VydmVFbXB0eURpcnMgPSBiOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC01ODUsOCArNTgwLDggQEAKICAgICAgICAgICAgICAgICBQYXR0ZXJuU2V0IHBzID0gbWVyZ2VQYXR0ZXJucyhnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIGZzLmFwcGVuZEluY2x1ZGVzKHBzLmdldEluY2x1ZGVQYXR0ZXJucyhnZXRQcm9qZWN0KCkpKTsKICAgICAgICAgICAgICAgICBmcy5hcHBlbmRFeGNsdWRlcyhwcy5nZXRFeGNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gc2VsZWN0b3JFbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgICAgICBmcy5hcHBlbmRTZWxlY3RvcigoRmlsZVNlbGVjdG9yKSBlLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGZvciAoRmlsZVNlbGVjdG9yIHNlbCA6IGdldFNlbGVjdG9ycyhnZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZzLmFwcGVuZFNlbGVjdG9yKHNlbCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZzLnNldERlZmF1bHRleGNsdWRlcyhnZXREZWZhdWx0ZXhjbHVkZXMoKSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhCmluZGV4IDBkMzE5ZDEuLjFjNTZhNjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTQgKzIwLDE1IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtMTA5LDEwICsxMTAsMTAgQEAKICAgICBwcml2YXRlIFRhckxvbmdGaWxlTW9kZSBsb25nRmlsZU1vZGUgPSBuZXcgVGFyTG9uZ0ZpbGVNb2RlKCk7CiAKICAgICAvLyBuZWVkIHRvIGtlZXAgdGhlIHBhY2thZ2UgcHJpdmF0ZSB2ZXJzaW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICAgIFZlY3RvcjxUYXJGaWxlU2V0PiBmaWxlc2V0cyA9IG5ldyBWZWN0b3I8VGFyRmlsZVNldD4oKTsKKyAgICBWZWN0b3I8VGFyRmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAvLyB3ZSBtdXN0IGtlZXAgdHdvIGxpc3RzIHNpbmNlIG90aGVyIGNsYXNzZXMgbWF5IG1vZGlmeSB0aGUKICAgICAvLyBmaWxlc2V0cyBWZWN0b3IgKGl0IGlzIHBhY2thZ2UgcHJpdmF0ZSkgd2l0aG91dCB1cyBub3RpY2luZwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gcmVzb3VyY2VDb2xsZWN0aW9ucyA9IG5ldyBWZWN0b3I8UmVzb3VyY2VDb2xsZWN0aW9uPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJlc291cmNlQ29sbGVjdGlvbnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKQEAgLTE5OCw4ICsxOTksNyBAQAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0TG9uZ2ZpbGUoZmluYWwgU3RyaW5nIG1vZGUpIHsKLSAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldExvbmdmaWxlKFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgotICAgICAgICAgICAgKyAiIFVzZSBzZXRMb25nZmlsZShUYXIuVGFyTG9uZ0ZpbGVNb2RlKSBpbnN0ZWFkLiIpOworICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0TG9uZ2ZpbGUoU3RyaW5nKSBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHNldExvbmdmaWxlKFRhci5UYXJMb25nRmlsZU1vZGUpIGluc3RlYWQuIik7CiAgICAgICAgIHRoaXMubG9uZ0ZpbGVNb2RlID0gbmV3IFRhckxvbmdGaWxlTW9kZSgpOwogICAgICAgICBsb25nRmlsZU1vZGUuc2V0VmFsdWUobW9kZSk7CiAgICAgfQpAQCAtMjMwLDYgKzIzMCw3IEBACiAgICAgICogPGxpPiAgbm9uZSAtIG5vIGNvbXByZXNzaW9uCiAgICAgICogPGxpPiAgZ3ppcCAtIEd6aXAgY29tcHJlc3Npb24KICAgICAgKiA8bGk+ICBiemlwMiAtIEJ6aXAyIGNvbXByZXNzaW9uCisgICAgICogPGxpPnh6IC0gWFogY29tcHJlc3Npb24sIHJlcXVpcmVzIFhaIGZvciBKYXZhCiAgICAgICogPC91bD4KICAgICAgKiBAcGFyYW0gbW9kZSB0aGUgY29tcHJlc3Npb24gbWV0aG9kLgogICAgICAqLwpAQCAtMjQyLDcgKzI0Myw3IEBACiAgICAgICogZGVmYXVsdCBlbmNvZGluZy4KICAgICAgKgogICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KKyAgICAgKiBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KICAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIG5hbWUKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS45LjUKQEAgLTI3Miw4ICsyNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgIGZpbmFsIFZlY3RvcjxUYXJGaWxlU2V0PiBzYXZlZEZpbGVTZXRzID0gKFZlY3RvcjxUYXJGaWxlU2V0PikgZmlsZXNldHMuY2xvbmUoKTsKKyAgICAgICAgZmluYWwgVmVjdG9yPFRhckZpbGVTZXQ+IHNhdmVkRmlsZVNldHMgPSBuZXcgVmVjdG9yPD4oZmlsZXNldHMpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmICghYmFzZURpci5leGlzdHMoKSkgewpAQCAtMjg3LDIwICsyODcsMTkgQEAKICAgICAgICAgICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KG1haW5GaWxlU2V0KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSA9PSAwICYmIHJlc291cmNlQ29sbGVjdGlvbnMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IHN1cHBseSBlaXRoZXIgYSBiYXNlZGlyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIG9yIHNvbWUgbmVzdGVkIHJlc291cmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29sbGVjdGlvbnMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICBpZiAoZmlsZXNldHMuaXNFbXB0eSgpICYmIHJlc291cmNlQ29sbGVjdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiWW91IG11c3Qgc3VwcGx5IGVpdGhlciBhIGJhc2VkaXIgYXR0cmlidXRlIG9yIHNvbWUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb25zLiIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBjaGVjayBpZiB0YXIgaXMgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvIGVhY2gKICAgICAgICAgICAgIC8vIGZpbGVzZXQKICAgICAgICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOwotICAgICAgICAgICAgZm9yKGZpbmFsIFRhckZpbGVTZXQgdGZzIDogZmlsZXNldHMpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgVGFyRmlsZVNldCB0ZnMgOiBmaWxlc2V0cykgewogICAgICAgICAgICAgICAgIHVwVG9EYXRlICY9IGNoZWNrKHRmcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IoZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uIHJjb2wgOiByZXNvdXJjZUNvbGxlY3Rpb25zKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlQ29sbGVjdGlvbiByY29sIDogcmVzb3VyY2VDb2xsZWN0aW9ucykgewogICAgICAgICAgICAgICAgIHVwVG9EYXRlICY9IGNoZWNrKHJjb2wpOwogICAgICAgICAgICAgfQogCkBAIC0zMTMsMTkgKzMxMiwxNyBAQAogICAgICAgICAgICAgZmluYWwgRmlsZSBwYXJlbnQgPSB0YXJGaWxlLmdldFBhcmVudEZpbGUoKTsKICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICAmJiAhKHBhcmVudC5ta2RpcnMoKSB8fCBwYXJlbnQuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgbWlzc2luZyBwYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkaXJlY3RvcnkgZm9yICIgKyB0YXJGaWxlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIG1pc3NpbmcgcGFyZW50IGRpcmVjdG9yeSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICB0YXJGaWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbG9nKCJCdWlsZGluZyB0YXI6ICIgKyB0YXJGaWxlLmdldEFic29sdXRlUGF0aCgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKIAotICAgICAgICAgICAgVGFyT3V0cHV0U3RyZWFtIHRPdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0T3V0ID0gbmV3IFRhck91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24uY29tcHJlc3MoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyRmlsZSkpKSwKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOworICAgICAgICAgICAgdHJ5IChUYXJPdXRwdXRTdHJlYW0gdE91dCA9IG5ldyBUYXJPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgY29tcHJlc3Npb24uY29tcHJlc3MobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdPdXRwdXRTdHJlYW0odGFyRmlsZS50b1BhdGgoKSkpKSwKKyAgICAgICAgICAgICAgICBlbmNvZGluZykpIHsKICAgICAgICAgICAgICAgICB0T3V0LnNldERlYnVnKHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChsb25nRmlsZU1vZGUuaXNUcnVuY2F0ZU1vZGUoKSkgewogICAgICAgICAgICAgICAgICAgICB0T3V0LnNldExvbmdGaWxlTW9kZShUYXJPdXRwdXRTdHJlYW0uTE9OR0ZJTEVfVFJVTkNBVEUpOwpAQCAtMzQ5LDggKzM0Niw2IEBACiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgVEFSOiAiICsgaW9lLmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UodE91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBmaWxlc2V0cyA9IHNhdmVkRmlsZVNldHM7CkBAIC00MDQsMjAgKzM5OSwyMCBAQAogCiAgICAgICAgIGlmICh0YXJGaWxlU2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmdWxscGF0aCA9IHRhckZpbGVTZXQuZ2V0RnVsbHBhdGgodGhpcy5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHZQYXRoID0gZnVsbHBhdGg7Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZ1bGxwYXRoLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIC8vIGRvbid0IGFkZCAiIiB0byB0aGUgYXJjaGl2ZQotICAgICAgICAgICAgICAgIGlmICh2UGF0aC5sZW5ndGgoKSA8PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHZQYXRoLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IHRhckZpbGVTZXQuZ2V0UHJlZml4KHRoaXMuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgICAgICAvLyAnLycgaXMgYXBwZW5kZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgemlwIHRhc2suCi0gICAgICAgICAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgIXByZWZpeC5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArICIvIjsKKyAgICAgICAgICAgICAgICBpZiAoIXByZWZpeC5pc0VtcHR5KCkgJiYgIXByZWZpeC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCArPSAiLyI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHZQYXRoID0gcHJlZml4ICsgdlBhdGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZQYXRoID0gZnVsbHBhdGg7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHByZXNlcnZlTGVhZGluZ1NsYXNoZXMgPSB0YXJGaWxlU2V0LmdldFByZXNlcnZlTGVhZGluZ1NsYXNoZXMoKTsKQEAgLTQ2Niw5ICs0NjEsOSBAQAogICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBUYXJSZXNvdXJjZSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFRhclJlc291cmNlIHRyID0gKFRhclJlc291cmNlKSByOwogICAgICAgICAgICAgICAgIHRlLnNldFVzZXJOYW1lKHRyLmdldFVzZXJOYW1lKCkpOwotICAgICAgICAgICAgICAgIHRlLnNldFVzZXJJZCh0ci5nZXRVaWQoKSk7CisgICAgICAgICAgICAgICAgdGUuc2V0VXNlcklkKHRyLmdldExvbmdVaWQoKSk7CiAgICAgICAgICAgICAgICAgdGUuc2V0R3JvdXBOYW1lKHRyLmdldEdyb3VwKCkpOwotICAgICAgICAgICAgICAgIHRlLnNldEdyb3VwSWQodHIuZ2V0R2lkKCkpOworICAgICAgICAgICAgICAgIHRlLnNldEdyb3VwSWQodHIuZ2V0TG9uZ0dpZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC02MDAsOCArNTk1LDggQEAKICAgICAgICAgfSBlbHNlIGlmICghcmMuaXNGaWxlc3lzdGVtT25seSgpICYmICFzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IGZpbGVzeXN0ZW0gcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQiKTsKICAgICAgICAgfSBlbHNlIGlmIChyYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFNldDxGaWxlPiBiYXNlZGlycyA9IG5ldyBIYXNoU2V0PEZpbGU+KCk7Ci0gICAgICAgICAgICBmaW5hbCBNYXA8RmlsZSwgTGlzdDxTdHJpbmc+PiBiYXNlZGlyVG9GaWxlc01hcCA9IG5ldyBIYXNoTWFwPEZpbGUsIExpc3Q8U3RyaW5nPj4oKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxGaWxlPiBiYXNlZGlycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxGaWxlLCBMaXN0PFN0cmluZz4+IGJhc2VkaXJUb0ZpbGVzTWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZSByZXMgOiByYykgewogICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVSZXNvdXJjZSByID0gUmVzb3VyY2VVdGlscwogICAgICAgICAgICAgICAgICAgICAuYXNGaWxlUmVzb3VyY2UocmVzLmFzKEZpbGVQcm92aWRlci5jbGFzcykpOwpAQCAtNjEwLDExICs2MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBiYXNlID0gQ29weS5OVUxMX0ZJTEVfUExBQ0VIT0xERVI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJhc2VkaXJzLmFkZChiYXNlKTsKLSAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZmlsZXMgPSBiYXNlZGlyVG9GaWxlc01hcC5nZXQoYmFzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgYmFzZWRpclRvRmlsZXNNYXAucHV0KGJhc2UsIGZpbGVzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZpbGVzID0gYmFzZWRpclRvRmlsZXNNYXAuY29tcHV0ZUlmQWJzZW50KGJhc2UsIGsgLT4gbmV3IFZlY3Rvcjw+KCkpOwogICAgICAgICAgICAgICAgIGlmIChiYXNlID09IENvcHkuTlVMTF9GSUxFX1BMQUNFSE9MREVSKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChyLmdldEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYyNyw5ICs2MTgsNyBAQAogICAgICAgICAgICAgICAgIHVwVG9EYXRlICY9IGNoZWNrKHRtcEJhc2UsIGZpbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsgLy8gbm9uLWZpbGUgcmVzb3VyY2VzCi0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlciA9IHJjLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByYykgewogICAgICAgICAgICAgICAgIHVwVG9EYXRlID0gYXJjaGl2ZUlzVXBUb0RhdGUocik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY1MSwxMCArNjQwLDEwIEBACiAgICAgICAgICAgICB1cFRvRGF0ZSA9IGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgaWYgKHRhckZpbGUuZXF1YWxzKG5ldyBGaWxlKGJhc2VkaXIsIGZpbGVzW2ldKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkEgdGFyIGZpbGUgY2Fubm90IGluY2x1ZGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpdHNlbGYiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgICAgICBpZiAodGFyRmlsZS5lcXVhbHMobmV3IEZpbGUoYmFzZWRpciwgZmlsZSkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBIHRhciBmaWxlIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiB1cFRvRGF0ZTsKQEAgLTY5MiwyMCArNjgxLDE3IEBACiAgICAgICAgICAgICBhZnMgPSAoQXJjaGl2ZUZpbGVTZXQpIHJjOwogICAgICAgICB9CiAgICAgICAgIGlmIChhZnMgIT0gbnVsbCAmJiBhZnMuc2l6ZSgpID4gMQotICAgICAgICAgICAgJiYgYWZzLmdldEZ1bGxwYXRoKHRoaXMuZ2V0UHJvamVjdCgpKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZnVsbHBhdGggYXR0cmlidXRlIG1heSBvbmx5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJiZSBzcGVjaWZpZWQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmaWxlc2V0cyB0aGF0IHNwZWNpZnkgYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2luZ2xlIGZpbGUuIik7CisgICAgICAgICAgICAmJiAhYWZzLmdldEZ1bGxwYXRoKHRoaXMuZ2V0UHJvamVjdCgpKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiZnVsbHBhdGggYXR0cmlidXRlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgZmlsZXNldHMgdGhhdCBzcGVjaWZ5IGEgc2luZ2xlIGZpbGUuIik7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgVGFyRmlsZVNldCB0ZnMgPSBhc1RhckZpbGVTZXQoYWZzKTsKIAogICAgICAgICBpZiAoaXNGaWxlRmlsZVNldChyYykpIHsKICAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgcmM7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IGdldEZpbGVOYW1lcyhmcyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUoZnMuZ2V0RGlyKGdldFByb2plY3QoKSksIGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGZpbGVzW2ldLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGdldEZpbGVOYW1lcyhmcykpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZShmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwgZmlsZSk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaWxlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwogICAgICAgICAgICAgICAgIHRhckZpbGUoZiwgdE91dCwgbmFtZSwgdGZzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChyYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpIHsKQEAgLTc0Miw3ICs3MjgsNyBAQAogICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihmcy5nZXRQcm9qZWN0KCkpOwogICAgICAgICBmaW5hbCBTdHJpbmdbXSBkaXJlY3RvcmllcyA9IGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKICAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXNQZXJTZSA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nIFtkaXJlY3Rvcmllcy5sZW5ndGggKyBmaWxlc1BlclNlLmxlbmd0aF07CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1tkaXJlY3Rvcmllcy5sZW5ndGggKyBmaWxlc1BlclNlLmxlbmd0aF07CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGlyZWN0b3JpZXMsIDAsIGZpbGVzLCAwLCBkaXJlY3Rvcmllcy5sZW5ndGgpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGZpbGVzUGVyU2UsIDAsIGZpbGVzLCBkaXJlY3Rvcmllcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXNQZXJTZS5sZW5ndGgpOwpAQCAtNzU5LDggKzc0NSw4IEBACiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgVGFyRmlsZVNldCBhc1RhckZpbGVTZXQoZmluYWwgQXJjaGl2ZUZpbGVTZXQgYXJjaGl2ZUZpbGVTZXQpIHsKLSAgICAgICAgVGFyRmlsZVNldCB0ZnMgPSBudWxsOwotICAgICAgICBpZiAoYXJjaGl2ZUZpbGVTZXQgIT0gbnVsbCAmJiBhcmNoaXZlRmlsZVNldCBpbnN0YW5jZW9mIFRhckZpbGVTZXQpIHsKKyAgICAgICAgVGFyRmlsZVNldCB0ZnM7CisgICAgICAgIGlmIChhcmNoaXZlRmlsZVNldCBpbnN0YW5jZW9mIFRhckZpbGVTZXQpIHsKICAgICAgICAgICAgIHRmcyA9IChUYXJGaWxlU2V0KSBhcmNoaXZlRmlsZVNldDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRmcyA9IG5ldyBUYXJGaWxlU2V0KCk7CkBAIC04MzcsNyArODIzLDYgQEAKICAgICAgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZmlsZXMgPSBnZXRGaWxlTmFtZXModGhpcyk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHJldHVybiBmaWxlczsKICAgICAgICAgfQogCkBAIC04OTEsNyArODc2LDcgQEAKICAgICAgICAgICAgIFBPU0lYID0gInBvc2l4IiwKICAgICAgICAgICAgIE9NSVQgPSAib21pdCI7CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSB2YWxpZE1vZGVzID0geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9NT0RFUyA9IHsKICAgICAgICAgICAgIFdBUk4sIEZBSUwsIFRSVU5DQVRFLCBHTlUsIFBPU0lYLCBPTUlUCiAgICAgICAgIH07CiAKQEAgLTkwNiw3ICs4OTEsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsaWRNb2RlczsKKyAgICAgICAgICAgIHJldHVybiBWQUxJRF9NT0RFUzsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtOTcxLDcgKzk1NiwxMSBAQAogICAgICAgICAgKiAgICBCWklQMiBjb21wcmVzc2lvbgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJaSVAyID0gImJ6aXAyIjsKLQorICAgICAgICAvKioKKyAgICAgICAgICogIFhaIGNvbXByZXNzaW9uCisgICAgICAgICAqIEBzaW5jZSAxLjEwLjEKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYWiA9ICJ4eiI7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKQEAgLTk4Nyw3ICs5NzYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtOT05FLCBHWklQLCBCWklQMn07CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtOT05FLCBHWklQLCBCWklQMiwgWFp9OwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0xMDAzLDE0ICs5OTIsMzkgQEAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ID0gZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIGlmIChHWklQLmVxdWFscyh2KSkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR1pJUE91dHB1dFN0cmVhbShvc3RyZWFtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKEJaSVAyLmVxdWFscyh2KSkgewotICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKCdCJyk7Ci0gICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoJ1onKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDQlppcDJPdXRwdXRTdHJlYW0ob3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFhaLmVxdWFscyh2KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdYWk91dHB1dFN0cmVhbShvc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCWklQMi5lcXVhbHModikpIHsKKyAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKCdCJyk7CisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZSgnWicpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ0JaaXAyT3V0cHV0U3RyZWFtKG9zdHJlYW0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG9zdHJlYW07CiAgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBPdXRwdXRTdHJlYW0gbmV3WFpPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBmQ2xhenogPSBDbGFzcy5mb3JOYW1lKCJvcmcudHVrYWFuaS54ei5GaWx0ZXJPcHRpb25zIik7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gb0NsYXp6ID0gQ2xhc3MuZm9yTmFtZSgib3JnLnR1a2FhbmkueHouTFpNQTJPcHRpb25zIik7CisgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIE91dHB1dFN0cmVhbT4gc0NsYXp6ID0KKyAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLnR1a2FhbmkueHouWFpPdXRwdXRTdHJlYW0iKQorICAgICAgICAgICAgICAgICAgICAuYXNTdWJjbGFzcyhPdXRwdXRTdHJlYW0uY2xhc3MpOworICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBPdXRwdXRTdHJlYW0+IGMgPQorICAgICAgICAgICAgICAgICAgICBzQ2xhenouZ2V0Q29uc3RydWN0b3IoT3V0cHV0U3RyZWFtLmNsYXNzLCBmQ2xhenopOworICAgICAgICAgICAgICAgIHJldHVybiBjLm5ld0luc3RhbmNlKG9zdHJlYW0sIG9DbGF6ei5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInh6IGNvbXByZXNzaW9uIHJlcXVpcmVzIHRoZSBYWiBmb3IgSmF2YSBsaWJyYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmFpbGVkIHRvIGNyZWF0ZSBYWk91dHB1dFN0cmVhbSIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tPdXRwdXRTdHJlYW0uamF2YQppbmRleCAyYmE1YTYxLi4yMTFmMjM1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza091dHB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsOCArMjQsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiAKIC8qKgotICogUmVkaXJlY3RzIHRleHQgd3JpdHRlbiB0byBhIHN0cmVhbSB0aHJ1IHRoZSBzdGFuZGFyZAotICogYW50IGxvZ2dpbmcgbWVjaGFuaXNtLiBUaGlzIGNsYXNzIGlzIHVzZWZ1bCBmb3IgaW50ZWdyYXRpbmcKKyAqIFJlZGlyZWN0cyB0ZXh0IHdyaXR0ZW4gdG8gYSBzdHJlYW0gdGhyb3VnaCB0aGUgc3RhbmRhcmQKKyAqIEFudCBsb2dnaW5nIG1lY2hhbmlzbS4gVGhpcyBjbGFzcyBpcyB1c2VmdWwgZm9yIGludGVncmF0aW5nCiAgKiB3aXRoIHRvb2xzIHRoYXQgd3JpdGUgdG8gU3lzdGVtLm91dCBhbmQgU3lzdGVtLmVyci4gRm9yIGV4YW1wbGUsCiAgKiB0aGUgZm9sbG93aW5nIHdpbGwgY2F1c2UgYWxsIHRleHQgd3JpdHRlbiB0byBTeXN0ZW0ub3V0IHRvIGJlCiAgKiBsb2dnZWQgd2l0aCAiaW5mbyIgcHJpb3JpdHk6CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmLmphdmEKaW5kZXggYTdkMGI3MS4uMjk1MmVhNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWYuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQzLDcgKzQzLDYgQEAKICAgICAgKiBUaGlzIHNldHMgdGhlIGFkYXB0ZXIgYW5kIHRoZSBhZGFwdHRvIGNsYXNzZXMgdG8KICAgICAgKiBUYXNrQWRhcHRlciBhbmQgVGFzay4KICAgICAgKi8KLQogICAgIHB1YmxpYyBUYXNrZGVmKCkgewogICAgICAgICBzZXRBZGFwdGVyQ2xhc3MoVGFza0FkYXB0ZXIuY2xhc3MpOwogICAgICAgICBzZXRBZGFwdFRvQ2xhc3MoVGFzay5jbGFzcyk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZW1wRmlsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGVtcEZpbGUuamF2YQppbmRleCA2YzM2OTkxLi43YTE1NzBmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZW1wRmlsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RlbXBGaWxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04MCw3ICs4MCw2IEBACiAgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4gSWYgbm90IHNldCwKICAgICAgKiB0aGUgYmFzZWRpciBkaXJlY3RvcnkgaXMgdXNlZCBpbnN0ZWFkLgpAQCAtOTEsNyArOTAsNiBAQAogICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgb3B0aW9uYWwgcHJlZml4IHN0cmluZyBmb3IgdGhlIHRlbXAgZmlsZS4KICAgICAgKgpAQCAtMTAxLDcgKzk5LDYgQEAKICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBvcHRpb25hbCBzdWZmaXggc3RyaW5nIGZvciB0aGUgdGVtcCBmaWxlLgogICAgICAqCkBAIC0xNDksOCArMTQ2LDkgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gIEJ1aWxkRXhjZXB0aW9uICBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCB8fCBwcm9wZXJ0eS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsIHx8IHByb3BlcnR5LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyBwcm9wZXJ0eSBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ub3VjaC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2guamF2YQppbmRleCA2YWRlMGNkLi5hYTU1ZWEyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ub3VjaC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RvdWNoLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS50ZXh0LkRhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTY2LDkgKzY3LDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlRm9ybWF0RmFjdG9yeSBERUZBVUxUX0RGX0ZBQ1RPUlkKICAgICAgICAgPSBuZXcgRGF0ZUZvcm1hdEZhY3RvcnkoKSB7CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBEYXRlRm9ybWF0IGdldFByaW1hcnlGb3JtYXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLkVOX1VTX0RBVEVfRk9STUFUX01JTi5nZXQoKTsKICAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIERhdGVGb3JtYXQgZ2V0RmFsbGJhY2tGb3JtYXQoKSB7CiAgICAgICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLkVOX1VTX0RBVEVfRk9STUFUX1NFQy5nZXQoKTsKICAgICAgICAgfQpAQCAtNzgsNyArODEsNyBAQAogICAgIHByaXZhdGUgRmlsZSBmaWxlOwogICAgIHByaXZhdGUgbG9uZyBtaWxsaXMgPSAtMTsKICAgICBwcml2YXRlIFN0cmluZyBkYXRlVGltZTsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICBwcml2YXRlIFVuaW9uIHJlc291cmNlczsKICAgICBwcml2YXRlIGJvb2xlYW4gZGF0ZVRpbWVDb25maWd1cmVkOwogICAgIHByaXZhdGUgYm9vbGVhbiBta2RpcnM7CkBAIC04NywxMiArOTAsNiBAQAogICAgIHByaXZhdGUgRGF0ZUZvcm1hdEZhY3RvcnkgZGZGYWN0b3J5ID0gREVGQVVMVF9ERl9GQUNUT1JZOwogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IDxjb2RlPlRvdWNoPC9jb2RlPiB0YXNrLgotICAgICAqLwotICAgIHB1YmxpYyBUb3VjaCgpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBTZXRzIGEgc2luZ2xlIHNvdXJjZSBmaWxlIHRvIHRvdWNoLiAgSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QKICAgICAgKiBhbiBlbXB0eSBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgPGNvZGU+RmlsZTwvY29kZT4gdG8gdG91Y2guCkBAIC0xNTIsOSArMTQ5LDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihmaW5hbCBTdHJpbmcgcGF0dGVybikgewogICAgICAgICBkZkZhY3RvcnkgPSBuZXcgRGF0ZUZvcm1hdEZhY3RvcnkoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBEYXRlRm9ybWF0IGdldFByaW1hcnlGb3JtYXQoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KHBhdHRlcm4pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgRGF0ZUZvcm1hdCBnZXRGYWxsYmFja0Zvcm1hdCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KQEAgLTE3OCw4ICsxNzcsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHRoaXMuZmlsZU5hbWVNYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBtYXBwZXIgbWF5IGJlIGFkZGVkIHRvIHRoZSAiCi0gICAgICAgICAgICAgICAgKyBnZXRUYXNrTmFtZSgpICsgIiB0YXNrLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJPbmx5IG9uZSBtYXBwZXIgbWF5IGJlIGFkZGVkIHRvIHRoZSAlcyB0YXNrLiIsIGdldFRhc2tOYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuZmlsZU5hbWVNYXBwZXIgPSBmaWxlTmFtZU1hcHBlcjsKICAgICB9CkBAIC0yMTgsOCArMjE3LDggQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0tYSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZS0tYSBmaWxlIG9yIHJlc291cmNlIGNvbGxlY3Rpb24uIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2UgYSByZXNvdXJjZSBjb2xsZWN0aW9uIHRvIHRvdWNoIGRpcmVjdG9yaWVzLiIpOwpAQCAtMjQ5LDEwICsyNDgsOSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGUuZ2V0TWVzc2FnZSgpLCBwZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh3b3JrbWlsbGlzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRhdGUgb2YgIiArIGRhdGVUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHJlc3VsdHMgaW4gbmVnYXRpdmUgIiArICJtaWxsaXNlY29uZHMgdmFsdWUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlbGF0aXZlIHRvIGVwb2NoICIgKyAiKEphbnVhcnkgMSwgMTk3MCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjAwOjAwOjAwIEdNVCkuIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRlIG9mICVzIHJlc3VsdHMgaW4gbmVnYXRpdmUgbWlsbGlzZWNvbmRzIHZhbHVlIHJlbGF0aXZlIHRvIGVwb2NoIChKYW51YXJ5IDEsIDE5NzAsIDAwOjAwOjAwIEdNVCkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsb2coIlNldHRpbmcgbWlsbGlzIHRvICIgKyB3b3JrbWlsbGlzICsgIiBmcm9tIGRhdGV0aW1lIGF0dHJpYnV0ZSIsCkBAIC0yNjksNiArMjY3LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uCiAgICAgICogICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgdG91Y2goKTsKQEAgLTMwMCwxNiArMjk5LDEyIEBACiAgICAgICAgIC8vIGRlYWwgd2l0aCBmaWxlc2V0cyBpbiBhIHNwZWNpYWwgd2F5IHNpbmNlIHRoZSB0YXNrCiAgICAgICAgIC8vIG9yaWdpbmFsbHkgYWxzbyB1c2VkIHRoZSBkaXJlY3RvcmllcyBhbmQgVW5pb24gd29uJ3QgcmV0dXJuCiAgICAgICAgIC8vIHRoZW0uCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gZmlsZXNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgRmlsZSBmcm9tRGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7CiAKLSAgICAgICAgICAgIFN0cmluZ1tdIHNyY0RpcnMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjRGlycy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIHRvdWNoKG5ldyBGaWxlUmVzb3VyY2UoZnJvbURpciwgc3JjRGlyc1tqXSksIGRlZmF1bHRUaW1lc3RhbXApOworICAgICAgICAgICAgZm9yIChTdHJpbmcgc3JjRGlyIDogZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKSB7CisgICAgICAgICAgICAgICAgdG91Y2gobmV3IEZpbGVSZXNvdXJjZShmcm9tRGlyLCBzcmNEaXIpLCBkZWZhdWx0VGltZXN0YW1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMyMiw2ICszMTcsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCB2b2lkIHRvdWNoKEZpbGUgZmlsZSkgewogICAgICAgICB0b3VjaChmaWxlLCBnZXRUaW1lc3RhbXAoKSk7CiAgICAgfQpAQCAtMzY1LDggKzM2MSw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFmaWxlLmNhbldyaXRlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGRhdGUgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlYWQtb25seSBmaWxlICIgKyBmaWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2FuIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIGRhdGUgb2YgcmVhZC1vbmx5IGZpbGUgJXMiLCBmaWxlKTsKICAgICAgICAgfQogICAgICAgICBGSUxFX1VUSUxTLnNldEZpbGVMYXN0TW9kaWZpZWQoZmlsZSwgbW9kVGltZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHJhbnNmb3JtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcmFuc2Zvcm0uamF2YQppbmRleCA5ZmQxNWQxLi44ODgxOGMzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcmFuc2Zvcm0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcmFuc2Zvcm0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDcgKzIyLDcgQEAKICAqIEhhcyBiZWVuIG1lcmdlZCBpbnRvIEV4ZWN1dGVPbiwgZW1wdHkgY2xhc3MgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICogV2UgbGVhdmUgdGhhdCBpbiBjYXNlIHRoYXQgZXh0ZXJuYWwgcHJvZ3JhbXMgYWNjZXNzIHRoaXMgY2xhc3MgZGlyZWN0bHksCiAgKiBmb3IgZXhhbXBsZSB2aWEKLSAqICAgPHR0PiBUcmFuc2Zvcm0gdHIgPSAoVHJhbnNmb3JtKSBnZXRQcm9qZWN0KCkuY3JlYXRlVGFzaygiYXBwbHkiKSA8L3R0PgorICogICA8Y29kZT4gVHJhbnNmb3JtIHRyID0gKFRyYW5zZm9ybSkgZ2V0UHJvamVjdCgpLmNyZWF0ZVRhc2soImFwcGx5IikgPC9jb2RlPgogICoKICAqIEBhbnQudGFzayBpZ25vcmU9InRydWUiCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RydW5jYXRlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UcnVuY2F0ZS5qYXZhCmluZGV4IGNiOGZkNGEuLjFjMTUxYmMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RydW5jYXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHJ1bmNhdGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEwMjQ7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIFpFUk8gPSBuZXcgTG9uZygwTCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZyBaRVJPID0gMEw7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fQ0hJTEQgPSAiTm8gZmlsZXMgc3BlY2lmaWVkLiI7CiAKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoTG9uZyBsZW5ndGgpIHsKICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0gICAgICAgIGlmIChsZW5ndGggIT0gbnVsbCAmJiBsZW5ndGgubG9uZ1ZhbHVlKCkgPCAwKSB7CisgICAgICAgIGlmIChsZW5ndGggIT0gbnVsbCAmJiBsZW5ndGggPCAwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oSU5WQUxJRF9MRU5HVEggKyBsZW5ndGgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoRmlsZSBmKSB7CiAgICAgICAgIGxvbmcgbGVuID0gZi5sZW5ndGgoKTsKICAgICAgICAgbG9uZyBuZXdMZW5ndGggPSBsZW5ndGggPT0gbnVsbAotICAgICAgICAgICAgICAgID8gbGVuICsgYWRqdXN0LmxvbmdWYWx1ZSgpIDogbGVuZ3RoLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgICAgID8gbGVuICsgYWRqdXN0IDogbGVuZ3RoOwogCiAgICAgICAgIGlmIChsZW4gPT0gbmV3TGVuZ3RoKSB7CiAgICAgICAgICAgICAvL25vdGhpbmcgdG8gZG8hCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Uc3RhbXAuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCmluZGV4IGFlZTI2MDcuLmFhMTAzNGUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RzdGFtcC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTYgKzE5LDIwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CkBAIC00Niw3ICs1MCw5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUc3RhbXAgZXh0ZW5kcyBUYXNrIHsKIAotICAgIHByaXZhdGUgVmVjdG9yIGN1c3RvbUZvcm1hdHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVl9TT1VSQ0VfREFURV9FUE9DSCA9ICJTT1VSQ0VfREFURV9FUE9DSCI7CisKKyAgICBwcml2YXRlIExpc3Q8Q3VzdG9tRm9ybWF0PiBjdXN0b21Gb3JtYXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4ID0gIiI7CiAKICAgICAvKioKQEAgLTY3LDE1ICs3MywyNSBAQAogICAgICAqIHRoZSBzdGFuZGFyZCBvbmVzLCB0byBnZXQgdGhlaXIgcmV0YWxpYXRpb24gaW4gZWFybHkuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERhdGUgZCA9IGdldE5vdygpOwotCi0gICAgICAgICAgICBFbnVtZXJhdGlvbiBpID0gY3VzdG9tRm9ybWF0cy5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBDdXN0b21Gb3JtYXQgY3RzID0gKEN1c3RvbUZvcm1hdCkgaS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGN0cy5leGVjdXRlKGdldFByb2plY3QoKSwgZCwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAvLyBIb25vdXIgcmVwcm9kdWNpYmxlIGJ1aWxkcyBodHRwczovL3JlcHJvZHVjaWJsZS1idWlsZHMub3JnL3NwZWNzL3NvdXJjZS1kYXRlLWVwb2NoLyNpZG01NQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVwb2NoID0gU3lzdGVtLmdldGVudihFTlZfU09VUkNFX0RBVEVfRVBPQ0gpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZXBvY2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBWYWx1ZSBvZiBTT1VSQ0VfREFURV9FUE9DSCB3aWxsIGJlIGFuIGludGVnZXIsIHJlcHJlc2VudGluZyBzZWNvbmRzLgorICAgICAgICAgICAgICAgICAgICBkID0gbmV3IERhdGUoSW50ZWdlci5wYXJzZUludChlcG9jaCkgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJIb25vdXJpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUgIiArIEVOVl9TT1VSQ0VfREFURV9FUE9DSCArICIgd2hpY2ggaGFzIGJlZW4gc2V0IHRvICIgKyBlcG9jaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIGxvZygiSWdub3JpbmcgaW52YWxpZCB2YWx1ZSAnIiArIGVwb2NoICsgIicgZm9yICIgKyBFTlZfU09VUkNFX0RBVEVfRVBPQ0gKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBlbnZpcm9ubWVudCB2YXJpYWJsZSIsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IGQ7CisgICAgICAgICAgICBjdXN0b21Gb3JtYXRzLmZvckVhY2goY3RzIC0+IGN0cy5leGVjdXRlKGdldFByb2plY3QoKSwgZGF0ZSwgZ2V0TG9jYXRpb24oKSkpOwogCiAgICAgICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGRzdGFtcCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5TU1kZCIpOwogICAgICAgICAgICAgc2V0UHJvcGVydHkoIkRTVEFNUCIsIGRzdGFtcC5mb3JtYXQoZCkpOwpAQCAtOTgsNyArMTE0LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQ3VzdG9tRm9ybWF0IGNyZWF0ZUZvcm1hdCgpIHsKICAgICAgICAgQ3VzdG9tRm9ybWF0IGN0cyA9IG5ldyBDdXN0b21Gb3JtYXQoKTsKLSAgICAgICAgY3VzdG9tRm9ybWF0cy5hZGRFbGVtZW50KGN0cyk7CisgICAgICAgIGN1c3RvbUZvcm1hdHMuYWRkKGN0cyk7CiAgICAgICAgIHJldHVybiBjdHM7CiAgICAgfQogCkBAIC0xMTYsMTYgKzEzMiw0MSBAQAogICAgICAqIEByZXR1cm4gRGF0ZQogICAgICAqLwogICAgIHByb3RlY3RlZCBEYXRlIGdldE5vdygpIHsKLSAgICAgICAgU3RyaW5nIG1hZ2ljTm93ID0gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuVFNUQU1QX05PVyk7Ci0gICAgICAgIGlmIChtYWdpY05vdyAhPSBudWxsICYmIG1hZ2ljTm93Lmxlbmd0aCgpID4gMCkgeworICAgICAgICBPcHRpb25hbDxEYXRlPiBub3cgPSBnZXROb3coCisgICAgICAgICAgICBNYWdpY05hbWVzLlRTVEFNUF9OT1dfSVNPLAorICAgICAgICAgICAgcyAtPiBEYXRlLmZyb20oSW5zdGFudC5wYXJzZShzKSksCisgICAgICAgICAgICAoaywgdikgLT4gIm1hZ2ljIHByb3BlcnR5ICIgKyBrICsgIiBpZ25vcmVkIGFzICciICsgdiArICInIGlzIG5vdCBpbiB2YWxpZCBJU08gcGF0dGVybiIKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKG5vdy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5vdy5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIG5vdyA9IGdldE5vdygKKyAgICAgICAgICAgIE1hZ2ljTmFtZXMuVFNUQU1QX05PVywKKyAgICAgICAgICAgIHMgLT4gbmV3IERhdGUoMTAwMCAqIExvbmcucGFyc2VMb25nKHMpKSwKKyAgICAgICAgICAgIChrLCB2KSAtPiAibWFnaWMgcHJvcGVydHkgIiArIGsgKyAiIGlnbm9yZWQgYXMgIiArIHYgKyAiIGlzIG5vdCBhIHZhbGlkIG51bWJlciIKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIG5vdy5vckVsc2VHZXQoRGF0ZTo6bmV3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgYW5kIHJldHVybnMgYSBEYXRlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sKKyAgICAgKiBAcGFyYW0gbWFwIGNvbnZlcnNpb24gb2YgdGhlIHByb3BlcnR5IHZhbHVlIGFzIHN0cmluZyB0byBEYXRlCisgICAgICogQHBhcmFtIGxvZyBzdXBwbGllciBvZiB0aGUgbG9nIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUgaWYKKyAgICAgKiAgICAgdGhlIGNvbnZlcnNpb24gZmFpbHMKKyAgICAgKiBAcmV0dXJuIE9wdGlvbmFsIGNvbnRhaW5pbmcgdGhlIERhdGUgb3IgbnVsbAorICAgICAqLworICAgIHByb3RlY3RlZCBPcHRpb25hbDxEYXRlPiBnZXROb3coU3RyaW5nIHByb3BlcnR5TmFtZSwgRnVuY3Rpb248U3RyaW5nLCBEYXRlPiBtYXAsIEJpRnVuY3Rpb248U3RyaW5nLCBTdHJpbmcsIFN0cmluZz4gbG9nKSB7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCAmJiAhcHJvcGVydHkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgxMDAwICogTG9uZy5wYXJzZUxvbmcobWFnaWNOb3cpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGxvZygibWFnaWMgcHJvcGVydHkgIiArIE1hZ2ljTmFtZXMuVFNUQU1QX05PVyArICIgaWdub3JlZCBhcyAiCi0gICAgICAgICAgICAgICAgICAgICsgbWFnaWNOb3cgKyAiIGlzIG5vdCBhIHZhbGlkIG51bWJlciIpOworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKG1hcC5hcHBseShwcm9wZXJ0eSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBsb2cobG9nLmFwcGx5KHByb3BlcnR5TmFtZSwgcHJvcGVydHkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDgsMTIgKzE4OSw2IEBACiAgICAgICAgIHByaXZhdGUgaW50IGZpZWxkID0gQ2FsZW5kYXIuREFURTsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlIGEgZm9ybWF0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ3VzdG9tRm9ybWF0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCiAgICAgICAgICAqICBUaGUgcHJvcGVydHkgdG8gcmVjZWl2ZSB0aGUgZGF0ZS90aW1lIHN0cmluZyBpbiB0aGUgZ2l2ZW4gcGF0dGVybgogICAgICAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KICAgICAgICAgICovCkBAIC0yMjgsOSArMjYzLDkgQEAKICAgICAgICAgICogICAgICAgICAgICAgZW5jYXBzdWxhdGUgb3BlcmF0aW9ucyBvbiB0aGUgdW5pdCBpbiBpdHMgb3duCiAgICAgICAgICAqICAgICAgICAgICAgIGNsYXNzLgogICAgICAgICAgKi8KKyAgICAgICAgQERlcHJlY2F0ZWQKICAgICAgICAgcHVibGljIHZvaWQgc2V0VW5pdChTdHJpbmcgdW5pdCkgewotICAgICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldFVuaXQoU3RyaW5nKSBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZC4iCi0gICAgICAgICAgICAgICAgKyAiIFVzZSBzZXRVbml0KFRzdGFtcC5Vbml0KSBpbnN0ZWFkLiIpOworICAgICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldFVuaXQoU3RyaW5nKSBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHNldFVuaXQoVHN0YW1wLlVuaXQpIGluc3RlYWQuIik7CiAgICAgICAgICAgICBVbml0IHUgPSBuZXcgVW5pdCgpOwogICAgICAgICAgICAgdS5zZXRWYWx1ZSh1bml0KTsKICAgICAgICAgICAgIGZpZWxkID0gdS5nZXRDYWxlbmRhckZpZWxkKCk7CkBAIC0zMTcsMTkgKzM1MiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUVBUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgcHJpdmF0ZSBNYXAgY2FsZW5kYXJGaWVsZHMgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IGNhbGVuZGFyRmllbGRzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgVW5pdCBlbnVtZXJhdGVkIHR5cGUuICovCiAgICAgICAgIHB1YmxpYyBVbml0KCkgewogICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTExJU0VDT05ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1JTExJU0VDT05EKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoU0VDT05ELCBuZXcgSW50ZWdlcihDYWxlbmRhci5TRUNPTkQpKTsKLSAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChNSU5VVEUsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KEhPVVIsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoREFZLCBuZXcgSW50ZWdlcihDYWxlbmRhci5EQVRFKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoV0VFSywgbmV3IEludGVnZXIoQ2FsZW5kYXIuV0VFS19PRl9ZRUFSKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoTU9OVEgsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoWUVBUiwgbmV3IEludGVnZXIoQ2FsZW5kYXIuWUVBUikpOworICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5NSUxMSVNFQ09ORCk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoU0VDT05ELCBDYWxlbmRhci5TRUNPTkQpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTlVURSwgQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChIT1VSLCBDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoREFZLCBDYWxlbmRhci5EQVRFKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChXRUVLLCBDYWxlbmRhci5XRUVLX09GX1lFQVIpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1PTlRILCBDYWxlbmRhci5NT05USCk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoWUVBUiwgQ2FsZW5kYXIuWUVBUik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTMzOCwxNCArMzczLDE0IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGdldENhbGVuZGFyRmllbGQoKSB7CiAgICAgICAgICAgICBTdHJpbmcga2V5ID0gZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcikgY2FsZW5kYXJGaWVsZHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIGNhbGVuZGFyRmllbGRzLmdldChrZXkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSB2YWx1ZXMuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBVTklUUzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZi5qYXZhCmluZGV4IDg3Mjc2ZTIuLmNjODdhMGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVkZWYuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlZGVmLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw4ICsxOCw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLQotCiAvKioKICAqCiAgKiBBZGRzIGEgZGF0YSB0eXBlIGRlZmluaXRpb24gdG8gdGhlIGN1cnJlbnQgcHJvamVjdC4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VucGFjay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW5wYWNrLmphdmEKaW5kZXggY2NjNDU3Ny4uYmVlMGJkZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW5wYWNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW5wYWNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MCw2ICs1MCw3IEBACiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqIEBwYXJhbSBzcmMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRTcmMoU3RyaW5nIHNyYykgewogICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0U3JjKFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgogICAgICAgICAgICAgKyAiIFVzZSBzZXRTcmMoRmlsZSkgaW5zdGVhZC4iKTsKQEAgLTY1LDYgKzY2LDcgQEAKICAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCiAgICAgICogQHBhcmFtIGRlc3QgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXREZXN0KFN0cmluZyBkZXN0KSB7CiAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSBzZXREZXN0KFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgogICAgICAgICAgICAgKyAiIFVzZSBzZXREZXN0KEZpbGUpIGluc3RlYWQuIik7CkBAIC04NSwyMiArODcsMjAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTcmNSZXNvdXJjZShSZXNvdXJjZSBzcmMpIHsKICAgICAgICAgaWYgKCFzcmMuaXNFeGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJ0aGUgYXJjaGl2ZSAiICsgc3JjLmdldE5hbWUoKSArICIgZG9lc24ndCBleGlzdCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0aGUgYXJjaGl2ZSAlcyBkb2Vzbid0IGV4aXN0IiwKKyAgICAgICAgICAgICAgICBzcmMuZ2V0TmFtZSgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc3JjLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAidGhlIGFyY2hpdmUgIiArIHNyYy5nZXROYW1lKCkgKyAiIGNhbid0IGJlIGEgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBhcmNoaXZlICVzIGNhbid0IGJlIGEgZGlyZWN0b3J5IiwKKyAgICAgICAgICAgICAgICBzcmMuZ2V0TmFtZSgpKTsKICAgICAgICAgfQogICAgICAgICBGaWxlUHJvdmlkZXIgZnAgPSBzcmMuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgaWYgKGZwICE9IG51bGwpIHsKICAgICAgICAgICAgIHNvdXJjZSA9IGZwLmdldEZpbGUoKTsKICAgICAgICAgfSBlbHNlIGlmICghc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVGhlIHNvdXJjZSAiICsgc3JjLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSBGaWxlU3lzdGVtICIKLSAgICAgICAgICAgICAgICArICJPbmx5IEZpbGVTeXN0ZW0gcmVzb3VyY2VzIGFyZSIKLSAgICAgICAgICAgICAgICArICIgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgICJUaGUgc291cmNlICVzIGlzIG5vdCBhIEZpbGVTeXN0ZW0gT25seSBGaWxlU3lzdGVtIHJlc291cmNlcyBhcmUgc3VwcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgc3JjLmdldE5hbWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgc3JjUmVzb3VyY2UgPSBzcmM7CiAgICAgfQpAQCAtMTExLDggKzExMSw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChSZXNvdXJjZUNvbGxlY3Rpb24gYSkgewogICAgICAgICBpZiAoYS5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJlIHN1cHBvcnRlZCBhcyBhcmNoaXZlcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGFzIGFyY2hpdmVzIik7CiAgICAgICAgIH0KICAgICAgICAgc2V0U3JjUmVzb3VyY2UoYS5pdGVyYXRvcigpLm5leHQoKSk7CiAgICAgfQpAQCAtMTYzLDYgKzE2Myw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgc2F2ZWREZXN0ID0gZGVzdDsgLy8gbWF5IGJlIGFsdGVyZWQgaW4gdmFsaWRhdGUKICAgICAgICAgdHJ5IHsKQEAgLTE5OSw3ICsyMDAsNyBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TGFzdE5hbWVQYXJ0KFJlc291cmNlIHIpIHsKICAgICAgICAgU3RyaW5nIG4gPSByLmdldE5hbWUoKTsKLSAgICAgICAgaW50IGlkeCA9IG4ubGFzdEluZGV4T2YoIi8iKTsKKyAgICAgICAgaW50IGlkeCA9IG4ubGFzdEluZGV4T2YoJy8nKTsKICAgICAgICAgcmV0dXJuIGlkeCA8IDAgPyBuIDogbi5zdWJzdHJpbmcoaWR4ICsgMSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW50YXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyLmphdmEKaW5kZXggMjdkMmI3NC4uYzFiY2IzMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW50YXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnRhci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsOSArMjAsMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMzUsOCArMzcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMudGFyLlRhckVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMudGFyLlRhcklucHV0U3RyZWFtOwogCi0KLQogLyoqCiAgKiBVbnRhciBhIGZpbGUuCiAgKiA8cD5QYXR0ZXJuU2V0cyBhcmUgdXNlZCB0byBzZWxlY3QgZmlsZXMgdG8gZXh0cmFjdApAQCAtNzAsNiArNzAsNyBAQAogICAgICAqICAgPGxpPm5vbmUgLSBubyBjb21wcmVzc2lvbgogICAgICAqICAgPGxpPmd6aXAgLSBHemlwIGNvbXByZXNzaW9uCiAgICAgICogICA8bGk+YnppcDIgLSBCemlwMiBjb21wcmVzc2lvbgorICAgICAqICAgPGxpPnh6IC0gWFogY29tcHJlc3Npb24sIHJlcXVpcmVzIFhaIGZvciBKYXZhCiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXRob2QgY29tcHJlc3Npb24gbWV0aG9kCkBAIC04MywzMyArODQsMzIgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTY2FuRm9yVW5pY29kZUV4dHJhRmllbGRzKGJvb2xlYW4gYikgewotICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSAiICsgZ2V0VGFza05hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRhc2sgZG9lc24ndCBzdXBwb3J0IHRoZSBlbmNvZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgIlRoZSAiICsgZ2V0VGFza05hbWUoKQorICAgICAgICAgICAgICAgICsgIiB0YXNrIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZW5jb2RpbmcgYXR0cmlidXRlIiwKKyAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEBzZWUgRXhwYW5kI2V4cGFuZEZpbGUoRmlsZVV0aWxzLCBGaWxlLCBGaWxlKQogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRGaWxlKEZpbGVVdGlscyBmaWxlVXRpbHMsIEZpbGUgc3JjRiwgRmlsZSBkaXIpIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7CiAgICAgICAgIGlmICghc3JjRi5leGlzdHMoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gdW50YXIgIgogICAgICAgICAgICAgICAgICAgICArIHNyY0YKICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IiwKICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRik7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oc3JjRi50b1BhdGgoKSkpIHsKICAgICAgICAgICAgIGV4cGFuZFN0cmVhbShzcmNGLmdldFBhdGgoKSwgZmlzLCBkaXIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgZXhwYW5kaW5nICIgKyBzcmNGLmdldFBhdGgoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuIiArIGlvZS50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZmlzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIwLDYgKzEyMCw3IEBACiAgICAgICogQHBhcmFtIGRpciAgICAgICB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBleHBhbmRSZXNvdXJjZShSZXNvdXJjZSBzcmNSLCBGaWxlIGRpcikgewogICAgICAgICBpZiAoIXNyY1IuaXNFeGlzdHMoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gdW50YXIgIgpAQCAtMTI4LDE1ICsxMjksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogCi0gICAgICAgIElucHV0U3RyZWFtIGkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaSA9IHNyY1IuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpID0gc3JjUi5nZXRJbnB1dFN0cmVhbSgpKSB7CiAgICAgICAgICAgICBleHBhbmRTdHJlYW0oc3JjUi5nZXROYW1lKCksIGksIGRpcik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBleHBhbmRpbmcgIiArIHNyY1IuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NSwxNiArMTQyLDEzIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZFN0cmVhbShTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gc3RyZWFtLCBGaWxlIGRpcikKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgVGFySW5wdXRTdHJlYW0gdGlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRpcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFRhcklucHV0U3RyZWFtKGNvbXByZXNzaW9uLmRlY29tcHJlc3MobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW5jb2RpbmcoKSk7CisgICAgICAgIHRyeSAoVGFySW5wdXRTdHJlYW0gdGlzID0gbmV3IFRhcklucHV0U3RyZWFtKAorICAgICAgICAgICAgY29tcHJlc3Npb24uZGVjb21wcmVzcyhuYW1lLCBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pKSwKKyAgICAgICAgICAgIGdldEVuY29kaW5nKCkpKSB7CiAgICAgICAgICAgICBsb2coIkV4cGFuZGluZzogIiArIG5hbWUgKyAiIGludG8gIiArIGRpciwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICBUYXJFbnRyeSB0ZSA9IG51bGw7CiAgICAgICAgICAgICBib29sZWFuIGVtcHR5ID0gdHJ1ZTsKICAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IGdldE1hcHBlcigpOworICAgICAgICAgICAgVGFyRW50cnkgdGU7CiAgICAgICAgICAgICB3aGlsZSAoKHRlID0gdGlzLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBleHRyYWN0RmlsZShGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCksIG51bGwsIGRpciwgdGlzLApAQCAtMTYyLDExICsxNTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlLmlzRGlyZWN0b3J5KCksIG1hcHBlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZW1wdHkgJiYgZ2V0RmFpbE9uRW1wdHlBcmNoaXZlKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFyY2hpdmUgJyIgKyBuYW1lICsgIicgaXMgZW1wdHkiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImFyY2hpdmUgJyVzJyBpcyBlbXB0eSIsIG5hbWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9nKCJleHBhbmQgY29tcGxldGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh0aXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTAsNiArMTgyLDExIEBACiAgICAgICAgICAqICBCWklQMiBjb21wcmVzc2lvbgogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJaSVAyID0gImJ6aXAyIjsKKyAgICAgICAgLyoqCisgICAgICAgICAqICBYWiBjb21wcmVzc2lvbgorICAgICAgICAgKiBAc2luY2UgMS4xMC4xCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFogPSAieHoiOwogCiAKICAgICAgICAgLyoqCkBAIC0yMDUsOCArMjAyLDkgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiB2YWxpZCB2YWx1ZXMKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Tk9ORSwgR1pJUCwgQlpJUDJ9OworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7Tk9ORSwgR1pJUCwgQlpJUDIsIFhafTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMjI2LDggKzIyNCwxMiBAQAogICAgICAgICAgICAgaWYgKEdaSVAuZXF1YWxzKHYpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHWklQSW5wdXRTdHJlYW0oaXN0cmVhbSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoWFouZXF1YWxzKHYpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1haSW5wdXRTdHJlYW0oaXN0cmVhbSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoQlpJUDIuZXF1YWxzKHYpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjaGFyIGMgOiBuZXcgY2hhcltdIHsnQicsICdaJ30pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyW10gbWFnaWMgPSBuZXcgY2hhcltdIHsgJ0InLCAnWicgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNoYXIgYyA6IG1hZ2ljKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc3RyZWFtLnJlYWQoKSAhPSBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgYnoyIGZpbGUuIiArIG5hbWUpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMzYsNSArMjM4LDI2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaXN0cmVhbTsKICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIG5ld1haSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBJbnB1dFN0cmVhbT4gY2xhenogPQorICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJvcmcudHVrYWFuaS54ei5YWklucHV0U3RyZWFtIikKKyAgICAgICAgICAgICAgICAgICAgLmFzU3ViY2xhc3MoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgICAgICAgICAgICAgIENvbnN0cnVjdG9yPD8gZXh0ZW5kcyBJbnB1dFN0cmVhbT4gYyA9CisgICAgICAgICAgICAgICAgICAgIGNsYXp6LmdldENvbnN0cnVjdG9yKElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5uZXdJbnN0YW5jZShpc3RyZWFtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInh6IGRlY29tcHJlc3Npb24gcmVxdWlyZXMgdGhlIFhaIGZvciBKYXZhIGxpYnJhcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIFhaSW5wdXRTdHJlYW0iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGUuamF2YQppbmRleCBlNWM4NWNlLi41MTgzYzRmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VwVG9EYXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMSArMTksMTAgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uQ29uZGl0aW9uOwpAQCAtNTEsNyArNTAsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOwogICAgIHByaXZhdGUgRmlsZSBzb3VyY2VGaWxlOwogICAgIHByaXZhdGUgRmlsZSB0YXJnZXRGaWxlOwotICAgIHByaXZhdGUgVmVjdG9yIHNvdXJjZUZpbGVTZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgTGlzdDxGaWxlU2V0PiBzb3VyY2VGaWxlU2V0cyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByaXZhdGUgVW5pb24gc291cmNlUmVzb3VyY2VzID0gbmV3IFVuaW9uKCk7CiAKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwpAQCAtMTEwLDcgKzEwOSw3IEBACiAgICAgICogQHBhcmFtIGZzIHRoZSBzb3VyY2UgZmlsZXMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRTcmNmaWxlcyhmaW5hbCBGaWxlU2V0IGZzKSB7Ci0gICAgICAgIHNvdXJjZUZpbGVTZXRzLmFkZEVsZW1lbnQoZnMpOworICAgICAgICBzb3VyY2VGaWxlU2V0cy5hZGQoZnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTUwLDI0ICsxNDksMjMgQEAKICAgICAgKiBzZWUgaWYgdGhlIHRhcmdldChzKSBpcy9hcmUgdXAtdG8tZGF0ZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldChzKSBpcy9hcmUgdXAtdG8tZGF0ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB7Ci0gICAgICAgIGlmIChzb3VyY2VGaWxlU2V0cy5zaXplKCkgPT0gMCAmJiBzb3VyY2VSZXNvdXJjZXMuc2l6ZSgpID09IDAKKyAgICAgICAgaWYgKHNvdXJjZUZpbGVTZXRzLmlzRW1wdHkoKSAmJiBzb3VyY2VSZXNvdXJjZXMuaXNFbXB0eSgpCiAgICAgICAgICAgICAmJiBzb3VyY2VGaWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIHNyY2ZpbGUgb3IgYSBuZXN0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjxzcmNmaWxlcz4gb3IgPHNyY3Jlc291cmNlcz4gZWxlbWVudCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBiZSBzZXQuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkF0IGxlYXN0IG9uZSBzcmNmaWxlIG9yIGEgbmVzdGVkIDxzcmNmaWxlcz4gb3IgPHNyY3Jlc291cmNlcz4gZWxlbWVudCBtdXN0IGJlIHNldC4iKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgoc291cmNlRmlsZVNldHMuc2l6ZSgpID4gMCB8fCBzb3VyY2VSZXNvdXJjZXMuc2l6ZSgpID4gMCkKKyAgICAgICAgaWYgKCghc291cmNlRmlsZVNldHMuaXNFbXB0eSgpIHx8ICFzb3VyY2VSZXNvdXJjZXMuaXNFbXB0eSgpKQogICAgICAgICAgICAgJiYgc291cmNlRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBzcGVjaWZ5IGJvdGggdGhlIHNyY2ZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSBhbmQgYSBuZXN0ZWQgPHNyY2ZpbGVzPiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3IgPHNyY3Jlc291cmNlcz4gZWxlbWVudC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHNwZWNpZnkgYm90aCB0aGUgc3JjZmlsZSBhdHRyaWJ1dGUgYW5kIGEgbmVzdGVkIDxzcmNmaWxlcz4gb3IgPHNyY3Jlc291cmNlcz4gZWxlbWVudC4iKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICh0YXJnZXRGaWxlID09IG51bGwgJiYgbWFwcGVyRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSB0YXJnZXRmaWxlIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWFwcGVyIGVsZW1lbnQgbXVzdCBiZSBzZXQuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSB0YXJnZXRmaWxlIGF0dHJpYnV0ZSBvciBhIG5lc3RlZCBtYXBwZXIgZWxlbWVudCBtdXN0IGJlIHNldC4iKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgZmlsZSBpcyBub3QgdGhlcmUsIHRoZW4gaXQgY2FuJ3QgYmUgdXAtdG8tZGF0ZQpAQCAtMTc5LDggKzE3Nyw4IEBACiAKICAgICAgICAgLy8gaWYgdGhlIHNvdXJjZSBmaWxlIGlzbid0IHRoZXJlLCB0aHJvdyBhbiBleGNlcHRpb24KICAgICAgICAgaWYgKHNvdXJjZUZpbGUgIT0gbnVsbCAmJiAhc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHNvdXJjZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBub3QgZm91bmQuIiwKKyAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOwpAQCAtMjA0LDEyICsyMDIsMTMgQEAKICAgICAgICAgLy8gcmVhc29ucy4gIElmIHdlIHVzZSB0aGUgY29kZSBmb3IgdW5pb24gYmVsb3csIHdlJ2xsIGFsd2F5cwogICAgICAgICAvLyBzY2FuIGFsbCBmaWxlc2V0cywgZXZlbiBpZiB3ZSBrbm93IHRoZSB0YXJnZXQgaXMgb3V0IG9mCiAgICAgICAgIC8vIGRhdGUgYWZ0ZXIgdGhlIGZpcnN0IHRlc3QuCi0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBzb3VyY2VGaWxlU2V0cy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAodXBUb0RhdGUgJiYgZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgdXBUb0RhdGUgPSBzY2FuRGlyKGZzLmdldERpcihnZXRQcm9qZWN0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzLmdldEluY2x1ZGVkRmlsZXMoKSk7CisKKyAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogc291cmNlRmlsZVNldHMpIHsKKyAgICAgICAgICAgIGlmICghc2NhbkRpcihmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRmlsZXMoKSkpIHsKKyAgICAgICAgICAgICAgICB1cFRvRGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKHVwVG9EYXRlKSB7CkBAIC0yMjMsMTIgKzIyMiwxMiBAQAogICAgICAgICByZXR1cm4gdXBUb0RhdGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHByb3BlcnR5IHRvIHRydWUgaWYgdGFyZ2V0IGZpbGUocykgaGF2ZSBhIG1vcmUgcmVjZW50IHRpbWVzdGFtcAogICAgICAqIHRoYW4gKGVhY2ggb2YpIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlKHMpLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvcGVydHkgYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIsCkBAIC0yNjQsMTQgKzI2MywxMSBAQAogICAgIH0KIAogICAgIHByaXZhdGUgRmlsZU5hbWVNYXBwZXIgZ2V0TWFwcGVyKCkgewotICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBudWxsOwogICAgICAgICBpZiAobWFwcGVyRWxlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICBNZXJnaW5nTWFwcGVyIG1tID0gbmV3IE1lcmdpbmdNYXBwZXIoKTsKICAgICAgICAgICAgIG1tLnNldFRvKHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgbWFwcGVyID0gbW07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXBwZXIgPSBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gbW07CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1hcHBlcjsKKyAgICAgICAgcmV0dXJuIG1hcHBlckVsZW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9WZXJpZnlKYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ZlcmlmeUphci5qYXZhCmluZGV4IDc3NDA4ZGYuLjM5NWZjYmMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ZlcmlmeUphci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ZlcmlmeUphci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDUsNiArNDUsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0ZJTEUgPSAiTm90IGZvdW5kIDoiOwogCisgICAgLyoqIEVycm9yIG91dHB1dCBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgdG8gdmVyaWZ5IHRoZSBqYXIuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fVkVSSUZZID0gIkZhaWxlZCB0byB2ZXJpZnkgIjsKKwogICAgIC8qKgogICAgICAqIFRoZSBzdHJpbmcgd2UgbG9vayBmb3IgaW4gdGhlIHRleHQgdG8gaW5kaWNhdGUgZGlyZWN0IHZlcmlmaWNhdGlvbgogICAgICAqLwpAQCAtNTUsOCArNTgsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBjZXJ0aWZpY2F0ZXMgPSBmYWxzZTsKICAgICBwcml2YXRlIEJ1ZmZlcmluZ091dHB1dEZpbHRlciBvdXRwdXRDYWNoZSA9IG5ldyBCdWZmZXJpbmdPdXRwdXRGaWx0ZXIoKTsKLSAgICAvKiogRXJyb3Igb3V0cHV0IGlmIHRoZXJlIGlzIGEgZmFpbHVyZSB0byB2ZXJpZnkgdGhlIGphci4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19WRVJJRlkgPSAiRmFpbGVkIHRvIHZlcmlmeSAiOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgc2F2ZWRTdG9yZVBhc3MgPSBudWxsOwogCkBAIC03Miw2ICs3Myw3IEBACiAgICAgICogdmVyaWZ5IG91ciBqYXIgZmlsZXMKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvL3ZhbGlkYXRpb24gbG9naWMKICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXNKYXIgPSBqYXIgIT0gbnVsbDsKQEAgLTk0LDE1ICs5NiwxMyBAQAogICAgICAgICAgICAgICAgIEZpbGVQcm92aWRlciBmciA9IHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKICAgICAgICAgICAgICAgICB2ZXJpZnlPbmVKYXIoZnIuZ2V0RmlsZSgpKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgZW5kRXhlY3V0aW9uKCk7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzaW5jZSAxLjkuMTEKKyAgICAgKiBAc2luY2UgMS4xMC4zCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgYmVnaW5FeGVjdXRpb24oKSB7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAc2luY2UgMS45LjExCisgICAgICogQHNpbmNlIDEuMTAuMwogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGVuZEV4ZWN1dGlvbigpIHsKQEAgLTIwMCwxMSArMjAwLDEzIEBACiAKICAgICAgICAgcHJpdmF0ZSBCdWZmZXJpbmdPdXRwdXRGaWx0ZXJSZWFkZXIgYnVmZmVyOwogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUmVhZGVyIGNoYWluKFJlYWRlciByZHIpIHsKICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBCdWZmZXJpbmdPdXRwdXRGaWx0ZXJSZWFkZXIocmRyKTsKICAgICAgICAgICAgIHJldHVybiBidWZmZXI7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKICAgICAgICAgfQpAQCAtMjI5LDYgKzIzMSw3IEBACiAgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgcmVhZChjaGFyW10gY2J1ZiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIC8vaGFuZCBkb3duCiAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gbmV4dC5yZWFkKGNidWYsIG9mZiwgbGVuKTsKQEAgLTIzOCwxMCArMjQxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIG5leHQuY2xvc2UoKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XYWl0Rm9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XYWl0Rm9yLmphdmEKaW5kZXggM2Y5NGQ2Zi4uOTJlYTQwMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FpdEZvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhaXRGb3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg5LDcgKzg5LDYgQEAKICAgICAgICAgc3VwZXIoIndhaXRmb3IiKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIHRoYXQgdGFrZXMgdGhlIG5hbWUgb2YgdGhlIHRhc2sgaW4gdGhlIHRhc2sgbmFtZS4KICAgICAgKgpAQCAtMTA4LDcgKzEwNyw2IEBACiAgICAgICAgIG1heFdhaXQgPSB0aW1lOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBtYXggd2FpdCB0aW1lIHVuaXQKICAgICAgKiBAcGFyYW0gdW5pdCBhbiBlbnVtZXJhdGVkIDxjb2RlPlVuaXQ8L2NvZGU+IHZhbHVlCkBAIC0xMTcsOCArMTE1LDYgQEAKICAgICAgICAgbWF4V2FpdE11bHRpcGxpZXIgPSB1bml0LmdldE11bHRpcGxpZXIoKTsKICAgICB9CiAKLQotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0aW1lIGJldHdlZW4gZWFjaCBjaGVjawogICAgICAqIEBwYXJhbSB0aW1lIGEgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUKQEAgLTE1MCwxNSArMTQ2LDE1IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIGludG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0VGFza05hbWUoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIllvdSBtdXN0IG5vdCBuZXN0IG1vcmUgdGhhbiBvbmUgY29uZGl0aW9uIGludG8gJXMiLAorICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldFRhc2tOYW1lKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgbXVzdCBuZXN0IGEgY29uZGl0aW9uIGludG8gJXMiLAorICAgICAgICAgICAgICAgIGdldFRhc2tOYW1lKCkpOwogICAgICAgICB9Ci0gICAgICAgIENvbmRpdGlvbiBjID0gKENvbmRpdGlvbikgZ2V0Q29uZGl0aW9ucygpLm5leHRFbGVtZW50KCk7CisgICAgICAgIENvbmRpdGlvbiBjID0gZ2V0Q29uZGl0aW9ucygpLm5leHRFbGVtZW50KCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBsb25nIG1heFdhaXRNaWxsaXMgPSBjYWxjdWxhdGVNYXhXYWl0TWlsbGlzKCk7CiAgICAgICAgICAgICBsb25nIGNoZWNrRXZlcnlNaWxsaXMgPSBjYWxjdWxhdGVDaGVja0V2ZXJ5TWlsbGlzKCk7CkBAIC0yNDQsMzIgKzI0MCwzMiBAQAogICAgICAgICAgICAgTUlMTElTRUNPTkQsIFNFQ09ORCwgTUlOVVRFLCBIT1VSLCBEQVksIFdFRUsKICAgICAgICAgfTsKIAotICAgICAgICBwcml2YXRlIE1hcCB0aW1lVGFibGUgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExvbmc+IHRpbWVUYWJsZSA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICAvKiogQ29uc3RydWN0b3IgdGhlIFVuaXQgZW51bWVyYXRlZCB0eXBlLiAqLwogICAgICAgICBwdWJsaWMgVW5pdCgpIHsKLSAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoTUlMTElTRUNPTkQsIG5ldyBMb25nKDFMKSk7Ci0gICAgICAgICAgICB0aW1lVGFibGUucHV0KFNFQ09ORCwgICAgICBuZXcgTG9uZyhPTkVfU0VDT05EKSk7Ci0gICAgICAgICAgICB0aW1lVGFibGUucHV0KE1JTlVURSwgICAgICBuZXcgTG9uZyhPTkVfTUlOVVRFKSk7Ci0gICAgICAgICAgICB0aW1lVGFibGUucHV0KEhPVVIsICAgICAgICBuZXcgTG9uZyhPTkVfSE9VUikpOwotICAgICAgICAgICAgdGltZVRhYmxlLnB1dChEQVksICAgICAgICAgbmV3IExvbmcoT05FX0RBWSkpOwotICAgICAgICAgICAgdGltZVRhYmxlLnB1dChXRUVLLCAgICAgICAgbmV3IExvbmcoT05FX1dFRUspKTsKKyAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoTUlMTElTRUNPTkQsIDFMKTsKKyAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoU0VDT05ELCBPTkVfU0VDT05EKTsKKyAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoTUlOVVRFLCBPTkVfTUlOVVRFKTsKKyAgICAgICAgICAgIHRpbWVUYWJsZS5wdXQoSE9VUiwgT05FX0hPVVIpOworICAgICAgICAgICAgdGltZVRhYmxlLnB1dChEQVksIE9ORV9EQVkpOworICAgICAgICAgICAgdGltZVRhYmxlLnB1dChXRUVLLCBPTkVfV0VFSyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29udmVydCB0aGUgdmFsdWUgdG8gYSBtdWx0aXBsZXIgKG1pbGxpc2Vjb25kIHRvIHVuaXQpLgotICAgICAgICAgKiBAcmV0dXJuIGEgbXVsdGlwbGVyIChhIGxvbmcgdmFsdWUpCisgICAgICAgICAqIENvbnZlcnQgdGhlIHZhbHVlIHRvIGEgbXVsdGlwbGllciAobWlsbGlzZWNvbmQgdG8gdW5pdCkuCisgICAgICAgICAqIEByZXR1cm4gYSBtdWx0aXBsaWVyIChhIGxvbmcgdmFsdWUpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgbG9uZyBnZXRNdWx0aXBsaWVyKCkgewogICAgICAgICAgICAgU3RyaW5nIGtleSA9IGdldFZhbHVlKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgTG9uZyBsID0gKExvbmcpIHRpbWVUYWJsZS5nZXQoa2V5KTsKLSAgICAgICAgICAgIHJldHVybiBsLmxvbmdWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRpbWVUYWJsZS5nZXQoa2V5KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKICAgICAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gVU5JVFM7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyLmphdmEKaW5kZXggN2RhZjA4ZS4uMGQ1NTlmOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNyw3ICsyNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwT3V0cHV0U3RyZWFtOwogCi0KIC8qKgogICogPHA+QW4gZXh0ZW5zaW9uIG9mICZsdDtqYXImZ3Q7IHRvIGNyZWF0ZSBhIFdBUiBhcmNoaXZlLgogICogQ29udGFpbnMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIGZpbGVzIHRoYXQgc2hvdWxkIGVuZCB1cCBpbiB0aGUKQEAgLTQ5LDYgKzQ4LDEwIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBXYXIgZXh0ZW5kcyBKYXIgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgLyoqIHBhdGggdG8gd2ViLnhtbCBmaWxlICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ERVNDUklQVE9SX1BBVEggPSAiV0VCLUlORi93ZWIueG1sIjsKKwogICAgIC8qKgogICAgICAqIG91ciB3ZWIueG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcgogICAgICAqLwpAQCAtNjAsMTAgKzYzLDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHhtbGZpbGUgPSB0cnVlOwogICAgIHByaXZhdGUgRmlsZSBhZGRlZFdlYlhtbEZpbGU7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKLSAgICAvKiogcGF0aCB0byB3ZWIueG1sIGZpbGUgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFU0NSSVBUT1JfUEFUSCA9ICJXRUItSU5GL3dlYi54bWwiOwotCiAgICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgV2FyIFRhc2suICovCiAgICAgcHVibGljIFdhcigpIHsKICAgICAgICAgc3VwZXIoKTsKQEAgLTczLDcgKzcyLDcgQEAKIAogICAgIC8qKgogICAgICAqIDxpPkRlcHJlY2F0ZWQ8L2k+IG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlCi0gICAgICogLXVzZSA8dHQ+ZGVzdGZpbGU8L3R0PiBpbnN0ZWFkLgorICAgICAqIC11c2UgPGNvZGU+ZGVzdGZpbGU8L2NvZGU+IGluc3RlYWQuCiAgICAgICogQHBhcmFtIHdhckZpbGUgdGhlIGRlc3RpbmF0aW9uIGZpbGUKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KICAgICAgKiAgICAgICAgICAgICBVc2Ugc2V0RGVzdEZpbGUoRmlsZSkgaW5zdGVhZApAQCAtODYsMTUgKzg1LDE0IEBACiAKICAgICAvKioKICAgICAgKiBzZXQgdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvciB0byB1c2UgKFdFQi1JTkYvd2ViLnhtbCk7Ci0gICAgICogcmVxdWlyZWQgdW5sZXNzIDx0dD51cGRhdGU9dHJ1ZTwvdHQ+CisgICAgICogcmVxdWlyZWQgdW5sZXNzIDxjb2RlPnVwZGF0ZT10cnVlPC9jb2RlPgogICAgICAqIEBwYXJhbSBkZXNjciB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRXZWJ4bWwoRmlsZSBkZXNjcikgewogICAgICAgICBkZXBsb3ltZW50RGVzY3JpcHRvciA9IGRlc2NyOwogICAgICAgICBpZiAoIWRlcGxveW1lbnREZXNjcmlwdG9yLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGVwbG95bWVudERlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgZXhpc3QuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlcGxveW1lbnQgZGVzY3JpcHRvcjogIGRvZXMgbm90IGV4aXN0LiIsCisgICAgICAgICAgICAgICAgZGVwbG95bWVudERlc2NyaXB0b3IpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ3JlYXRlIGEgWmlwRmlsZVNldCBmb3IgdGhpcyBmaWxlLCBhbmQgcGFzcyBpdCB1cC4KQEAgLTEwNCw3ICsxMDIsNiBAQAogICAgICAgICBzdXBlci5hZGRGaWxlc2V0KGZzKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgcG9saWN5IG9uIHRoZSB3ZWIueG1sIGZpbGUsIHRoYXQgaXMsIHdoZXRoZXIgb3Igbm90IGl0IGlzIG5lZWRlZAogICAgICAqIEBwYXJhbSBuZWVkeG1sZmlsZSB3aGV0aGVyIGEgd2ViLnhtbCBmaWxlIGlzIG5lZWRlZC4gRGVmYXVsdDogdHJ1ZQpAQCAtMTE3LDcgKzExNCw2IEBACiAgICAgICogYWRkIGZpbGVzIHVuZGVyIFdFQi1JTkYvbGliLwogICAgICAqIEBwYXJhbSBmcyB0aGUgemlwIGZpbGUgc2V0IHRvIGFkZAogICAgICAqLwotCiAgICAgcHVibGljIHZvaWQgYWRkTGliKFppcEZpbGVTZXQgZnMpIHsKICAgICAgICAgLy8gV2UganVzdCBzZXQgdGhlIHByZWZpeCBmb3IgdGhpcyBmaWxlc2V0LCBhbmQgcGFzcyBpdCB1cC4KICAgICAgICAgZnMuc2V0UHJlZml4KCJXRUItSU5GL2xpYi8iKTsKQEAgLTE5MCwxMyArMTg2LDEwIEBACiAgICAgICAgICAgICAgICAgLy9jaGVjayB0byBzZWUgaWYgd2Ugd2FybiBvciBub3QKICAgICAgICAgICAgICAgICBpZiAoIUZJTEVfVVRJTFMuZmlsZU5hbWVFcXVhbHMoYWRkZWRXZWJYbWxGaWxlLCBmaWxlKSkgewogICAgICAgICAgICAgICAgICAgICBsb2dXaGVuV3JpdGluZygiV2FybmluZzogc2VsZWN0ZWQgIiArIGFyY2hpdmVUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaWxlcyBpbmNsdWRlIGEgc2Vjb25kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBYTUxfREVTQ1JJUFRPUl9QQVRICi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGljaCB3aWxsIGJlIGlnbm9yZWQuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBkdXBsaWNhdGUgZW50cnkgaXMgYXQgIiArIGZpbGUgKyAnXG4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIGlzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhZGRlZFdlYlhtbEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZpbGVzIGluY2x1ZGUgYSBzZWNvbmQgIiArIFhNTF9ERVNDUklQVE9SX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGljaCB3aWxsIGJlIGlnbm9yZWQuXG5UaGUgZHVwbGljYXRlIGVudHJ5IGlzIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZmlsZSArICJcblRoZSBmaWxlIHRoYXQgd2lsbCBiZSB1c2VkIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWRkZWRXZWJYbWxGaWxlLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vbm8gYWRkZWQgZmlsZSwgeWV0CkBAIC0yMTIsNyArMjA1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogTWFrZSBzdXJlIHdlIGRvbid0IHRoaW5rIHdlIGFscmVhZHkgaGF2ZSBhIHdlYi54bWwgbmV4dCB0aW1lIHRoaXMgdGFzawogICAgICAqIGdldHMgZXhlY3V0ZWQuCkBAIC0yMjQsOCArMjE2LDggQEAKICAgICAgICAgICAgICYmIG5lZWR4bWxmaWxlCiAgICAgICAgICAgICAmJiAhaXNJblVwZGF0ZU1vZGUoKQogICAgICAgICAgICAgJiYgaGFzVXBkYXRlZEZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBXRUItSU5GL3dlYi54bWwgZmlsZSB3YXMgYWRkZWQuXG4iCi0gICAgICAgICAgICAgICAgICAgICsgIklmIHRoaXMgaXMgeW91ciBpbnRlbnQsIHNldCBuZWVkeG1sZmlsZT0nZmFsc2UnICIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJObyBXRUItSU5GL3dlYi54bWwgZmlsZSB3YXMgYWRkZWQuXG5JZiB0aGlzIGlzIHlvdXIgaW50ZW50LCBzZXQgbmVlZHhtbGZpbGU9J2ZhbHNlJyAiKTsKICAgICAgICAgfQogICAgICAgICBhZGRlZFdlYlhtbEZpbGUgPSBudWxsOwogICAgICAgICBzdXBlci5jbGVhblVwKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XaGljaFJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XaGljaFJlc291cmNlLmphdmEKaW5kZXggM2YzMTVhOC4uMTAxMGI3YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2hpY2hSZXNvdXJjZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1doaWNoUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwNSwxNCArMTA1LDExIEBACiAgICAgICAgICAgICBzZXRjb3VudCsrOwogICAgICAgICB9CiAKLQogICAgICAgICBpZiAoc2V0Y291bnQgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmUgb2YgY2xhc3NuYW1lIG9yIHJlc291cmNlIG11c3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmUgb2YgY2xhc3NuYW1lIG9yIHJlc291cmNlIG11c3QgYmUgc3BlY2lmaWVkIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNldGNvdW50ID4gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBvZiBjbGFzc25hbWUgb3IgcmVzb3VyY2UgY2FuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgb2YgY2xhc3NuYW1lIG9yIHJlc291cmNlIGNhbiBiZSBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocHJvcGVydHkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBwcm9wZXJ0eSBkZWZpbmVkIik7CkBAIC0xMjMsNiArMTIwLDcgQEAKICAgICAgKiBleGVjdXRlIGl0CiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKQEAgLTEzNSwxMSArMTMzLDEwIEBACiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJ1c2luZyBzeXN0ZW0gY2xhc3NwYXRoOiAiICsgY2xhc3NwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgIH0KLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGxvYWRlciA9IEFudENsYXNzTG9hZGVyLm5ld0FudENsYXNzTG9hZGVyKGdldFByb2plY3QoKS5nZXRDb3JlTG9hZGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGgsIGZhbHNlKTsKKyAgICAgICAgdHJ5IChBbnRDbGFzc0xvYWRlciBsb2FkZXIgPQorICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyLm5ld0FudENsYXNzTG9hZGVyKGdldFByb2plY3QoKS5nZXRDb3JlTG9hZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aCwgZmFsc2UpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbG9jID0gbnVsbDsKICAgICAgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vY29udmVydCBhIGNsYXNzIG5hbWUgaW50byBhIHJlc291cmNlCkBAIC0xNTUsMTcgKzE1MiwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBsb2coIlNlYXJjaGluZyBmb3IgIiArIHJlc291cmNlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIFVSTCB1cmw7Ci0gICAgICAgICAgICB1cmwgPSBsb2FkZXIuZ2V0UmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgVVJMIHVybCA9IGxvYWRlci5nZXRSZXNvdXJjZShyZXNvdXJjZSk7CiAgICAgICAgICAgICBpZiAodXJsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvL3NldCB0aGUgcHJvcGVydHkKICAgICAgICAgICAgICAgICBsb2MgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsKICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHksIGxvYyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb24uamF2YQppbmRleCA2MTc3OTBhLi5jNTM2OTUwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSw3ICszMSw3IEBACiAgICAgLyoqCiAgICAgICogdGhlIGZpbGUgcHJvdG9jb2wgcHJlZml4IGZvciBzeXN0ZW1pZC4KICAgICAgKiBUaGlzIGZpbGUgcHJvdG9jb2wgbXVzdCBiZSBhcHBlbmRlZCB0byBhbiBhYnNvbHV0ZSBwYXRoLgotICAgICAqIFR5cGljYWxseTogPHR0PkZJTEVfUFJPVE9DT0xfUFJFRklYICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTwvdHQ+CisgICAgICogVHlwaWNhbGx5OiA8Y29kZT5GSUxFX1BST1RPQ09MX1BSRUZJWCArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk8L2NvZGU+CiAgICAgICogTm90ZSB0aGF0IG9uIFdpbmRvd3MsIGFuIGV4dHJhICcvJyBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZQogICAgICAqIHByb3RvY29sIHByZWZpeCBzbyB0aGF0IHRoZXJlIGlzIGFsd2F5cyAzIGNvbnNlY3V0aXZlIHNsYXNoZXMuCiAgICAgICogQHNpbmNlIEFudCAxLjQKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb24yLmphdmEKaW5kZXggMDY1M2I0MC4uYmMzYmFkNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb24yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb24yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMy5qYXZhCmluZGV4IDk2MzA5M2YuLjQzNGVmZDMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMaWFpc29uMy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExpYWlzb240LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjQuamF2YQppbmRleCA2ZTE2ZTYyLi45NWUxNGNkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTGlhaXNvbjQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMb2dnZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRMb2dnZXIuamF2YQppbmRleCA0ZGFkZWJjLi40MTExNjBkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVExvZ2dlckF3YXJlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyQXdhcmUuamF2YQppbmRleCBlZGYwZmNlLi4zNmQzMDAyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyQXdhcmUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUTG9nZ2VyQXdhcmUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRQcm9jZXNzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YU0xUUHJvY2Vzcy5qYXZhCmluZGV4IGVjZDI4ZjUuLjE0NWIwNGUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1hTTFRQcm9jZXNzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWFNMVFByb2Nlc3MuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CkBAIC0zMiw3ICszMyw2IEBACiBpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbjsKIGltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoVmFyaWFibGVSZXNvbHZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNzIsNiArNzIsMTUgQEAKICAqLwogCiBwdWJsaWMgY2xhc3MgWFNMVFByb2Nlc3MgZXh0ZW5kcyBNYXRjaGluZ1Rhc2sgaW1wbGVtZW50cyBYU0xUTG9nZ2VyIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgaXMgdHJheAorICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU09SX1RSQVggPSAidHJheCI7CisKKyAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworCiAgICAgLyoqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAqLwogICAgIHByaXZhdGUgRmlsZSBkZXN0RGlyID0gbnVsbDsKIApAQCAtOTQsNyArMTAzLDcgQEAKICAgICBwcml2YXRlIFN0cmluZyBmaWxlRGlyUGFyYW1ldGVyID0gbnVsbDsKIAogICAgIC8qKiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBzdHlsZXNoZWV0cyAqLwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbT4gcGFyYW1zID0gbmV3IEFycmF5TGlzdDxQYXJhbT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFyYW0+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqIElucHV0IFhNTCBkb2N1bWVudCB0byBiZSB1c2VkICovCiAgICAgcHJpdmF0ZSBGaWxlIGluRmlsZSA9IG51bGw7CkBAIC0xMjAsMTQgKzEyOSwxMSBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOwogCiAgICAgLyoqIFhTTCBvdXRwdXQgcHJvcGVydGllcyB0byBiZSB1c2VkICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8T3V0cHV0UHJvcGVydHk+IG91dHB1dFByb3BlcnRpZXMgPSBuZXcgVmVjdG9yPE91dHB1dFByb3BlcnR5PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdXRwdXRQcm9wZXJ0eT4gb3V0cHV0UHJvcGVydGllcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIGZvciByZXNvbHZpbmcgZW50aXRpZXMgc3VjaCBhcyBkdGRzICovCiAgICAgcHJpdmF0ZSBmaW5hbCBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOwogCi0gICAgLyoqIFV0aWxpdGllcyB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKLQogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdG8gc3R5bGUgYWxsIGZpbGVzIGluIHRoZSBpbmNsdWRlZCBkaXJlY3RvcmllcyBhcyB3ZWxsLgogICAgICAqCkBAIC0xODEsMTIgKzE4Nyw2IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIHVzZUltcGxpY2l0RmlsZXNldCA9IHRydWU7CiAKICAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBwcm9jZXNzb3IgaXMgdHJheAotICAgICAqIEBzaW5jZSBBbnQgMS43Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQ0VTU09SX1RSQVggPSAidHJheCI7Ci0KLSAgICAvKioKICAgICAgKiB3aGV0aGVyIHRvIHN1cHByZXNzIHdhcm5pbmdzLgogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjguMApAQCAtMjQ0LDEyICsyNDQsNiBAQAogICAgIHByaXZhdGUgVHJhY2VDb25maWd1cmF0aW9uIHRyYWNlQ29uZmlndXJhdGlvbjsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgWFNMVFByb2Nlc3MgVGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNMVFByb2Nlc3MoKSB7Ci0gICAgfSAvLy0tIFhTTFRQcm9jZXNzCi0KLSAgICAvKioKICAgICAgKiBXaGV0aGVyIHRvIHN0eWxlIGFsbCBmaWxlcyBpbiB0aGUgaW5jbHVkZWQgZGlyZWN0b3JpZXMgYXMgd2VsbDsKICAgICAgKiBvcHRpb25hbCwgZGVmYXVsdCBpcyB0cnVlLgogICAgICAqCkBAIC0zMDQsOCArMjk4LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU3R5bGUoZmluYWwgUmVzb3VyY2VzIHJjKSB7CiAgICAgICAgIGlmIChyYy5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgaGFuZGxlRXJyb3IoIlRoZSBzdHlsZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggZXhhY3RseSBvbmUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgbmVzdGVkIHJlc291cmNlLiIpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoCisgICAgICAgICAgICAgICAgIlRoZSBzdHlsZSBlbGVtZW50IG11c3QgYmUgc3BlY2lmaWVkIHdpdGggZXhhY3RseSBvbmUgbmVzdGVkIHJlc291cmNlLiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0WHNsUmVzb3VyY2UocmMuaXRlcmF0b3IoKS5uZXh0KCkpOwogICAgICAgICB9CkBAIC0zNDYsMTMgKzM0MCw4IEBACiAgICAgICAgIH0KICAgICAgICAgZmluYWwgRmlsZSBzYXZlZEJhc2VEaXIgPSBiYXNlRGlyOwogCi0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lcjsKLSAgICAgICAgU3RyaW5nW10gICAgICAgICBsaXN0OwotICAgICAgICBTdHJpbmdbXSAgICAgICAgIGRpcnM7Ci0KICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VNZXNzYWdlID0KLSAgICAgICAgICAgICJzcGVjaWZ5IHRoZSBzdHlsZXNoZWV0IGVpdGhlciBhcyBhIGZpbGVuYW1lIGluIHN0eWxlIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICArICJvciBhcyBhIG5lc3RlZCByZXNvdXJjZSI7CisgICAgICAgICAgICAic3BlY2lmeSB0aGUgc3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSBhdHRyaWJ1dGUgb3IgYXMgYSBuZXN0ZWQgcmVzb3VyY2UiOwogCiAgICAgICAgIGlmICh4c2xSZXNvdXJjZSA9PSBudWxsICYmIHhzbEZpbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgaGFuZGxlRXJyb3IoYmFzZU1lc3NhZ2UpOwpAQCAtMzk2LDggKzM4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAqIHRoZSB3cm9uZyB2ZXJzaW9uIGhhcyBiZWVuIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ZXJuYXRpdmUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBzaG91bGQgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0J3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIHRoZSAnc3R5bGUnIGF0dHJpYnV0ZSBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHByb2plY3QncyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCIgICAgICAgICAgICAgYmFzZWRpciwgbm90IHRoZSB0YXNrcydzIGJhc2VkaXIuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0ID0gYWx0ZXJuYXRpdmU7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTQyOCwzMyArNDE2LDMwIEBACiAgICAgICAgICAgICAvLy0tIG1ha2Ugc3VyZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLi4uCiAgICAgICAgICAgICBjaGVja0Rlc3QoKTsKIAorCiAgICAgICAgICAgICBpZiAodXNlSW1wbGljaXRGaWxlc2V0KSB7Ci0gICAgICAgICAgICAgICAgc2Nhbm5lciA9IGdldERpcmVjdG9yeVNjYW5uZXIoYmFzZURpcik7CisgICAgICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihiYXNlRGlyKTsKICAgICAgICAgICAgICAgICBsb2coIlRyYW5zZm9ybWluZyBpbnRvICIgKyBkZXN0RGlyLCBQcm9qZWN0Lk1TR19JTkZPKTsKIAogICAgICAgICAgICAgICAgIC8vIFByb2Nlc3MgYWxsIHRoZSBmaWxlcyBtYXJrZWQgZm9yIHN0eWxpbmcKLSAgICAgICAgICAgICAgICBsaXN0ID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoYmFzZURpciwgbGlzdFtpXSwgZGVzdERpciwgc3R5bGVSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MoYmFzZURpciwgZWxlbWVudCwgZGVzdERpciwgc3R5bGVSZXNvdXJjZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwZXJmb3JtRGlyZWN0b3J5U2NhbikgewogICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGFsbCB0aGUgZGlyZWN0b3JpZXMgbWFya2VkIGZvciBzdHlsaW5nCi0gICAgICAgICAgICAgICAgICAgIGRpcnMgPSBzY2FubmVyLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkaXJzLmxlbmd0aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEZpbGUoYmFzZURpciwgZGlyc1tqXSkubGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhiYXNlRGlyLCBkaXJzW2pdICsgRmlsZS5zZXBhcmF0b3IgKyBsaXN0W2ldLCBkZXN0RGlyLAorICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkaXIgOiBzY2FubmVyLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IG5ldyBGaWxlKGJhc2VEaXIsIGRpcikubGlzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyhiYXNlRGlyLCBkaXIgKyBGaWxlLnNlcGFyYXRvciArIGVsZW1lbnQsIGRlc3REaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVJlc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7IC8vIG9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbnMsIHRoZXJlIGJldHRlciBiZSBzb21lCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbE9uTm9SZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJubyByZXNvdXJjZXMgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSByZXNvdXJjZSBjb2xsZWN0aW9ucywgdGhlcmUgYmV0dGVyIGJlIHNvbWUKKyAgICAgICAgICAgICAgICBpZiAoZmFpbE9uTm9SZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIm5vIHJlc291cmNlcyBzcGVjaWZpZWQiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHJvY2Vzc1Jlc291cmNlcyhzdHlsZVJlc291cmNlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTQ5NSw3ICs0ODAsNyBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IGludG8gd2hpY2ggdGhlIFhTTCByZXN1bHQKICAgICAgKiBmaWxlcyBzaG91bGQgYmUgY29waWVkIHRvOwotICAgICAqIHJlcXVpcmVkLCB1bmxlc3MgPHR0PmluPC90dD4gYW5kIDx0dD5vdXQ8L3R0PiBhcmUKKyAgICAgKiByZXF1aXJlZCwgdW5sZXNzIDxjb2RlPmluPC9jb2RlPiBhbmQgPGNvZGU+b3V0PC9jb2RlPiBhcmUKICAgICAgKiBzcGVjaWZpZWQuCiAgICAgICogQHBhcmFtIGRpciB0aGUgbmFtZSBvZiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5CiAgICAgICoqLwpAQCAtNjg3LDggKzY3Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIFRyYWNlQ29uZmlndXJhdGlvbiBjcmVhdGVUcmFjZSgpIHsKICAgICAgICAgaWYgKHRyYWNlQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSB0cmFjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY29uZmlndXJhdGlvbiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgdHJhY2UgY29uZmlndXJhdGlvbiIpOwogICAgICAgICB9CiAgICAgICAgIHRyYWNlQ29uZmlndXJhdGlvbiA9IG5ldyBUcmFjZUNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgcmV0dXJuIHRyYWNlQ29uZmlndXJhdGlvbjsKQEAgLTcxMywxMiArNjk3LDEyIEBACiAgICAgICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIHByb2Nlc3NvciBjYW5ub3QgYmUgbG9hZGVkLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZXNvbHZlUHJvY2Vzc29yKGZpbmFsIFN0cmluZyBwcm9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHByb2MuZXF1YWxzKFBST0NFU1NPUl9UUkFYKSkgeworICAgICAgICBpZiAoUFJPQ0VTU09SX1RSQVguZXF1YWxzKHByb2MpKSB7CiAgICAgICAgICAgICBsaWFpc29uID0gbmV3IFRyYVhMaWFpc29uKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvL2FueXRoaW5nIGVsc2UgaXMgYSBjbGFzc25hbWUKLSAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0gbG9hZENsYXNzKHByb2MpOwotICAgICAgICAgICAgbGlhaXNvbiA9IChYU0xUTGlhaXNvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBYU0xUTGlhaXNvbj4gY2xhenogPSBsb2FkQ2xhc3MocHJvYykuYXNTdWJjbGFzcyhYU0xUTGlhaXNvbi5jbGFzcyk7CisgICAgICAgICAgICBsaWFpc29uID0gY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzMwLDcgKzcxNCw3IEBACiAgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gbG9hZC4KICAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgY2xhc3MuCiAgICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoZmluYWwgU3RyaW5nIGNsYXNzbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHByaXZhdGUgQ2xhc3M8Pz4gbG9hZENsYXNzKGZpbmFsIFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKICAgICAgICAgc2V0dXBMb2FkZXIoKTsKICAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwpAQCAtNzUyLDcgKzczNiw3IEBACiAKICAgICAvKioKICAgICAgKiBTcGVjaWZpZXMgdGhlIG91dHB1dCBuYW1lIGZvciB0aGUgc3R5bGVkIHJlc3VsdCBmcm9tIHRoZQotICAgICAqIDx0dD5pbjwvdHQ+IGF0dHJpYnV0ZTsgcmVxdWlyZWQgaWYgPHR0PmluPC90dD4gaXMgc2V0CisgICAgICogPGNvZGU+aW48L2NvZGU+IGF0dHJpYnV0ZTsgcmVxdWlyZWQgaWYgPGNvZGU+aW48L2NvZGU+IGlzIHNldAogICAgICAqCiAgICAgICogQHBhcmFtIG91dEZpbGUgdGhlIG91dHB1dCBGaWxlIGluc3RhbmNlLgogICAgICAqLwpAQCAtNzYyLDcgKzc0Niw3IEBACiAKICAgICAvKioKICAgICAgKiBzcGVjaWZpZXMgYSBzaW5nbGUgWE1MIGRvY3VtZW50IHRvIGJlIHN0eWxlZC4gU2hvdWxkIGJlIHVzZWQKLSAgICAgKiB3aXRoIHRoZSA8dHQ+b3V0PC90dD4gYXR0cmlidXRlOyByZXF1aXJlZCBpZiA8dHQ+b3V0PC90dD4gaXMgc2V0CisgICAgICogd2l0aCB0aGUgPGNvZGU+b3V0PC9jb2RlPiBhdHRyaWJ1dGU7IHJlcXVpcmVkIGlmIDxjb2RlPm91dDwvY29kZT4gaXMgc2V0CiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5GaWxlIHRoZSBpbnB1dCBmaWxlCiAgICAgICovCkBAIC04MjAsMjkgKzgwNCwyNSBAQAogICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAogICAgICAgICBGaWxlICAgb3V0RiA9IG51bGw7Ci0gICAgICAgIEZpbGUgICBpbkYgPSBudWxsOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBsb25nIHN0eWxlU2hlZXRMYXN0TW9kaWZpZWQgPSBzdHlsZXNoZWV0LmdldExhc3RNb2RpZmllZCgpOwotICAgICAgICAgICAgaW5GID0gbmV3IEZpbGUoYmFzZURpciwgeG1sRmlsZSk7CisgICAgICAgICAgICBGaWxlIGluRiA9IG5ldyBGaWxlKGJhc2VEaXIsIHhtbEZpbGUpOwogCiAgICAgICAgICAgICBpZiAoaW5GLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBpbkYgKyAiIGl0IGlzIGEgZGlyZWN0b3J5LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobWFwcGVyRWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgU3R5bGVNYXBwZXIoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG1hcHBlckVsZW1lbnQgPT0gbnVsbCA/IG5ldyBTdHlsZU1hcHBlcigpCisgICAgICAgICAgICAgICAgOiBtYXBwZXJFbGVtZW50LmdldEltcGxlbWVudGF0aW9uKCk7CiAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG91dEZpbGVOYW1lID0gbWFwcGVyLm1hcEZpbGVOYW1lKHhtbEZpbGUpOwogICAgICAgICAgICAgaWYgKG91dEZpbGVOYW1lID09IG51bGwgfHwgb3V0RmlsZU5hbWUubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBpbkZpbGUgKyAiIGl0IGNhbm5vdCBnZXQgbWFwcGVkIHRvIG91dHB1dC4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG91dEZpbGVOYW1lLmxlbmd0aCA+IDEpIHsKLSAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBpbkZpbGUgKyAiIGl0cyBtYXBwaW5nIGlzIGFtYmlndW9zLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dEZpbGVOYW1lLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBpbkZpbGUgKyAiIGl0cyBtYXBwaW5nIGlzIGFtYmlndW91cy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRGID0gbmV3IEZpbGUoZGVzdERpciwgb3V0RmlsZU5hbWVbMF0pOwpAQCAtOTA5LDExICs4ODksOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBlbnN1cmVEaXJlY3RvcnlGb3IoZmluYWwgRmlsZSB0YXJnZXRGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBGaWxlIGRpcmVjdG9yeSA9IHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKCEoZGlyZWN0b3J5Lm1rZGlycygpIHx8IGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RvcnkuZXhpc3RzKCkgJiYgIWRpcmVjdG9yeS5ta2RpcnMoKSAmJiAhZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUVycm9yKCJVbmFibGUgdG8gY3JlYXRlIGRpcmVjdG9yeTogIgorICAgICAgICAgICAgICAgICAgICArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0MSw3ICs5MTksNyBAQAogICAgICAqIEByZXR1cm4gdGhlIG91dHB1dHByb3BlcnRpZXMKICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248T3V0cHV0UHJvcGVydHk+IGdldE91dHB1dFByb3BlcnRpZXMoKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRQcm9wZXJ0aWVzLmVsZW1lbnRzKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihvdXRwdXRQcm9wZXJ0aWVzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNjksNyArMTE0Nyw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPFBhcmFtVHlwZSwgUU5hbWU+IFhQQVRIX1RZUEVTOwogCiAgICAgICAgIHN0YXRpYyB7Ci0gICAgICAgICAgICBmaW5hbCBNYXA8UGFyYW1UeXBlLCBRTmFtZT4gbSA9IG5ldyBFbnVtTWFwPFBhcmFtVHlwZSwgUU5hbWU+KFBhcmFtVHlwZS5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBNYXA8UGFyYW1UeXBlLCBRTmFtZT4gbSA9IG5ldyBFbnVtTWFwPD4oUGFyYW1UeXBlLmNsYXNzKTsKICAgICAgICAgICAgIG0ucHV0KFhQQVRIX1NUUklORywgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKICAgICAgICAgICAgIG0ucHV0KFhQQVRIX0JPT0xFQU4sIFhQYXRoQ29uc3RhbnRzLkJPT0xFQU4pOwogICAgICAgICAgICAgbS5wdXQoWFBBVEhfTlVNQkVSLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpOwpAQCAtMTE4NiwxMyArMTE2NCwxMyBAQAogICAgICAqLwogICAgIHB1YmxpYyBPdXRwdXRQcm9wZXJ0eSBjcmVhdGVPdXRwdXRQcm9wZXJ0eSgpIHsKICAgICAgICAgZmluYWwgT3V0cHV0UHJvcGVydHkgcCA9IG5ldyBPdXRwdXRQcm9wZXJ0eSgpOwotICAgICAgICBvdXRwdXRQcm9wZXJ0aWVzLmFkZEVsZW1lbnQocCk7CisgICAgICAgIG91dHB1dFByb3BlcnRpZXMuYWRkKHApOwogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTcGVjaWZ5IGhvdyB0aGUgcmVzdWx0IHRyZWUgc2hvdWxkIGJlIG91dHB1dCBhcyBzcGVjaWZpZWQKLSAgICAgKiBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveHNsdCNvdXRwdXQiPgorICAgICAqIGluIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIveHNsdCNvdXRwdXQiPgogICAgICAqIHNwZWNpZmljYXRpb248L2E+LgogICAgICAqIEBzaW5jZSBBbnQgMS41CiAgICAgICovCkBAIC0xMjQ3LDExICsxMjI1LDggQEAKIAogICAgICAgICB4cGF0aEZhY3RvcnkgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgeHBhdGggPSB4cGF0aEZhY3RvcnkubmV3WFBhdGgoKTsKLSAgICAgICAgeHBhdGguc2V0WFBhdGhWYXJpYWJsZVJlc29sdmVyKG5ldyBYUGF0aFZhcmlhYmxlUmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmVWYXJpYWJsZShmaW5hbCBRTmFtZSB2YXJpYWJsZU5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHZhcmlhYmxlTmFtZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CisgICAgICAgIHhwYXRoLnNldFhQYXRoVmFyaWFibGVSZXNvbHZlcigKKyAgICAgICAgICAgIHZhcmlhYmxlTmFtZSAtPiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkodmFyaWFibGVOYW1lLnRvU3RyaW5nKCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMTEsMTYgKzEyODYsMTUgQEAKICAgICAgICAgICAgICAgICBpZiAocC5zaG91bGRVc2UoKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZXZhbHVhdGVkUGFyYW0gPSBldmFsdWF0ZVBhcmFtKHApOwogICAgICAgICAgICAgICAgICAgICBpZiAobGlhaXNvbiBpbnN0YW5jZW9mIFhTTFRMaWFpc29uNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKChYU0xUTGlhaXNvbjQpIGxpYWlzb24pLmFkZFBhcmFtKHAuZ2V0TmFtZSgpLCBldmFsdWF0ZWRQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFhTTFRMaWFpc29uNCkgbGlhaXNvbikuYWRkUGFyYW0ocC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGVkUGFyYW0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlZFBhcmFtID09IG51bGwgfHwgZXZhbHVhdGVkUGFyYW0gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYWlzb24uYWRkUGFyYW0ocC5nZXROYW1lKCksIChTdHJpbmcpIGV2YWx1YXRlZFBhcmFtKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmFsdWF0ZWRQYXJhbSA9PSBudWxsIHx8IGV2YWx1YXRlZFBhcmFtIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlhaXNvbi5hZGRQYXJhbShwLmdldE5hbWUoKSwgKFN0cmluZykgZXZhbHVhdGVkUGFyYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlhTTFRMaWFpc29uICciICsgbGlhaXNvbi5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBzdXBwb3J0cyBvbmx5IFN0cmluZyBwYXJhbWV0ZXJzLiBDb252ZXJ0aW5nIHBhcmFtZXRlciAnIiArIHAuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHRvIGl0cyBTdHJpbmcgdmFsdWUgJyIgKyBldmFsdWF0ZWRQYXJhbSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlhaXNvbi5hZGRQYXJhbShwLmdldE5hbWUoKSwgU3RyaW5nLnZhbHVlT2YoZXZhbHVhdGVkUGFyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiWFNMVExpYWlzb24gJyIgKyBsaWFpc29uLmdldENsYXNzKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIicgc3VwcG9ydHMgb25seSBTdHJpbmcgcGFyYW1ldGVycy4gQ29udmVydGluZyBwYXJhbWV0ZXIgJyIgKyBwLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIHRvIGl0cyBTdHJpbmcgdmFsdWUgJyIgKyBldmFsdWF0ZWRQYXJhbSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgICAgICBsaWFpc29uLmFkZFBhcmFtKHAuZ2V0TmFtZSgpLCBTdHJpbmcudmFsdWVPZihldmFsdWF0ZWRQYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTM0Nyw3ICsxMzIxLDcgQEAKIAogICAgICAgICBQYXJhbVR5cGUgdHlwZTsKIAotICAgICAgICBpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCAiIi5lcXVhbHModHlwZU5hbWUpKSB7CisgICAgICAgIGlmICh0eXBlTmFtZSA9PSBudWxsIHx8IHR5cGVOYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdHlwZSA9IFBhcmFtVHlwZS5TVFJJTkc7IC8vIFN0cmluZyBpcyBkZWZhdWx0CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTM3MiwxMSArMTM0NiwxMCBAQAogICAgICAgICAgICAgICAgIGZpbmFsIFFOYW1lIHhwYXRoVHlwZSA9IFBhcmFtVHlwZS5YUEFUSF9UWVBFUy5nZXQodHlwZSk7CiAgICAgICAgICAgICAgICAgaWYgKHhwYXRoVHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgWFNMVCBwYXJhbWV0ZXIgdHlwZTogIiArIHR5cGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBYUGF0aEV4cHJlc3Npb24geHBlID0geHBhdGguY29tcGlsZShleHByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gbnVsbCA9IGV2YWx1YXRlIFhQYXRoIG9uIGVtcHR5IFhNTCBkb2N1bWVudAotICAgICAgICAgICAgICAgICAgICByZXR1cm4geHBlLmV2YWx1YXRlKChPYmplY3QpIG51bGwsIHhwYXRoVHlwZSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIFhQYXRoRXhwcmVzc2lvbiB4cGUgPSB4cGF0aC5jb21waWxlKGV4cHJlc3Npb24pOworICAgICAgICAgICAgICAgIC8vIG51bGwgPSBldmFsdWF0ZSBYUGF0aCBvbiBlbXB0eSBYTUwgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICByZXR1cm4geHBlLmV2YWx1YXRlKChPYmplY3QpIG51bGwsIHhwYXRoVHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0NDUsOSArMTQxOCw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXJyb3IoZmluYWwgVGhyb3dhYmxlIGV4KSB7CiAgICAgICAgIGlmIChmYWlsT25FcnJvcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGFuIGV4Y2VwdGlvbjogIiArIGV4LCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgfQorICAgICAgICBsb2coIkNhdWdodCBhbiBleGNlcHRpb246ICIgKyBleCwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDYxLDEwICsxNDMzLDkgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVUcmFuc2Zvcm1hdGlvbkVycm9yKGZpbmFsIEV4Y2VwdGlvbiBleCkgewogICAgICAgICBpZiAoZmFpbE9uRXJyb3IgJiYgZmFpbE9uVHJhbnNmb3JtYXRpb25FcnJvcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGFuIGVycm9yIGR1cmluZyB0cmFuc2Zvcm1hdGlvbjogIiArIGV4LAotICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICB9CisgICAgICAgIGxvZygiQ2F1Z2h0IGFuIGVycm9yIGR1cmluZyB0cmFuc2Zvcm1hdGlvbjogIiArIGV4LAorICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDc5LDEyICsxNDUwLDEyIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiB0aGUgbGlzdCBvZiBmYWN0b3J5IGF0dHJpYnV0ZXMgdG8gdXNlIGZvciBUcmFYTGlhaXNvbgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8QXR0cmlidXRlPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIHRoZSBsaXN0IG9mIGZhY3RvcnkgZmVhdHVyZXMgdG8gdXNlIGZvciBUcmFYTGlhaXNvbgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZlYXR1cmU+IGZlYXR1cmVzID0gbmV3IEFycmF5TGlzdDxGZWF0dXJlPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmVhdHVyZT4gZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmFjdG9yeS4KQEAgLTE1NDQsOCArMTUxNSw3IEBACiAgICAgICAgICAqICA8bGk+aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFuL2ZlYXR1cmVzL2luY3JlbWVudGFsICh0cnVlfGZhbHNlKSA8L2xpPgogICAgICAgICAgKiA8L3VsPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGUKLSAgICAgICAgICAgIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudAorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIFByb2plY3RDb21wb25lbnQKICAgICAgICAgICAgIGltcGxlbWVudHMgRHluYW1pY0NvbmZpZ3VyYXRvciB7CiAKICAgICAgICAgICAgIC8qKiBhdHRyaWJ1dGUgbmFtZSwgbW9zdGx5IHByb2Nlc3NvciBzcGVjaWZpYyAqLwpAQCAtMTU3NCw2ICsxNTQ0LDcgQEAKICAgICAgICAgICAgICAqIEByZXR1cm4gbnVsbAogICAgICAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBuZXZlcgogICAgICAgICAgICAgICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRHluYW1pY0VsZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC0xNTg1LDYgKzE1NTYsNyBAQAogICAgICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCiAgICAgICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgICAgIC8vIG9ubHkgJ25hbWUnIGFuZCAndmFsdWUnIGV4aXN0LgogICAgICAgICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkgewpAQCAtMTU5OCw3ICsxNTcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBCb29sZWFuLkZBTFNFOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gbmV3IEludGVnZXIodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNjExLDcgKzE1ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZTogIiArIG5hbWUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIGF0dHJpYnV0ZTogJXMiLCBuYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gLy8gLS0gY2xhc3MgQXR0cmlidXRlCkBAIC0xNjI0LDcgKzE1OTYsOSBAQAogICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiB2YWx1ZTsKIAotICAgICAgICAgICAgcHVibGljIEZlYXR1cmUoKSB7IH0KKyAgICAgICAgICAgIHB1YmxpYyBGZWF0dXJlKCkgeworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBwdWJsaWMgRmVhdHVyZShTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwpAQCAtMTY3MCwxMCArMTY0NCwxNSBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42LjIKICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIFN0eWxlTWFwcGVyIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbShmaW5hbCBTdHJpbmcgZnJvbSkgewogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRvKGZpbmFsIFN0cmluZyB0bykgewogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgeG1sRmlsZSkgewogICAgICAgICAgICAgZmluYWwgaW50IGRvdFBvcyA9IHhtbEZpbGUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgIGlmIChkb3RQb3MgPiAwKSB7CkBAIC0xNzk2LDcgKzE3NzUsNyBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIE91dHB1dFN0cmVhbQogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGphdmEuaW8uT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IExvZ091dHB1dFN0cmVhbShYU0xUUHJvY2Vzcy50aGlzKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxQcm9wZXJ0eS5qYXZhCmluZGV4IDlmZWIzNTcuLjRhODZjYTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sUHJvcGVydHkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDkgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CkBAIC0xNzYsMTkgKzE3OCw2IEBACiAgKiBAYW50LnRhc2sgbmFtZT0ieG1scHJvcGVydHkiIGNhdGVnb3J5PSJ4bWwiCiAgKi8KIHB1YmxpYyBjbGFzcyBYbWxQcm9wZXJ0eSBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZSBzcmM7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcHJlZml4ID0gIiI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGtlZXBSb290ID0gdHJ1ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gY29sbGFwc2VBdHRyaWJ1dGVzID0gZmFsc2U7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNlbWFudGljQXR0cmlidXRlcyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlU2VtYW50aWNBdHRyaWJ1dGUgPSBmYWxzZTsKLSAgICBwcml2YXRlIEZpbGUgcm9vdERpcmVjdG9yeSA9IG51bGw7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgYWRkZWRBdHRyaWJ1dGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHByaXZhdGUgWE1MQ2F0YWxvZyB4bWxDYXRhbG9nID0gbmV3IFhNTENhdGFsb2coKTsKLSAgICBwcml2YXRlIFN0cmluZyBkZWxpbWl0ZXIgPSAiLCI7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZfSUQgPSAicmVmaWQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBVElPTiA9ICJsb2NhdGlvbiI7CkBAIC0yMDEsMjQgKzE5MCwyOSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgWG1sUHJvcGVydHkoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQorICAgIHByaXZhdGUgUmVzb3VyY2Ugc3JjOworICAgIHByaXZhdGUgU3RyaW5nIHByZWZpeCA9ICIiOworICAgIHByaXZhdGUgYm9vbGVhbiBrZWVwUm9vdCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNlQXR0cmlidXRlcyA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBzZW1hbnRpY0F0dHJpYnV0ZXMgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVNlbWFudGljQXR0cmlidXRlID0gZmFsc2U7CisgICAgcHJpdmF0ZSBGaWxlIHJvb3REaXJlY3RvcnkgPSBudWxsOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhZGRlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKKyAgICBwcml2YXRlIFhNTENhdGFsb2cgeG1sQ2F0YWxvZyA9IG5ldyBYTUxDYXRhbG9nKCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyID0gIiwiOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZXMgdGhlIHRhc2suCiAgICAgICovCi0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0KCkgewogICAgICAgICBzdXBlci5pbml0KCk7CiAgICAgICAgIHhtbENhdGFsb2cuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHhtbENhdGFsb2cgYXMgdGhlIGVudGl0eXJlc29sdmVyLgorICAgICAqIEByZXR1cm4gdGhlIHhtbENhdGFsb2cgYXMgdGhlIEVudGl0eVJlc29sdmVyLgogICAgICAqLwogICAgIHByb3RlY3RlZCBFbnRpdHlSZXNvbHZlciBnZXRFbnRpdHlSZXNvbHZlcigpIHsKICAgICAgICAgcmV0dXJuIHhtbENhdGFsb2c7CkBAIC0yMzAsNiArMjI0LDcgQEAKICAgICAgKiBAdG9kbyB2YWxpZGF0ZSB0aGUgc291cmNlIGZpbGUgaXMgdmFsaWQgYmVmb3JlIG9wZW5pbmcsIHByaW50IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICAgICAgKiBAdG9kbyBhZGQgYSB2ZXJib3NlIGxldmVsIGxvZyBtZXNzYWdlIGxpc3RpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgbG9hZGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIFJlc291cmNlIHIgPSBnZXRSZXNvdXJjZSgpOwogCkBAIC0yNDYsNyArMjQxLDcgQEAKICAgICAgICAgICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CiAgICAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbnRpdHlSZXNvbHZlcihnZXRFbnRpdHlSZXNvbHZlcigpKTsKLSAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOworICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKICAgICAgICAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0gc3JjLmFzKEZpbGVQcm92aWRlci5jbGFzcyk7CiAgICAgICAgICAgICAgIGlmIChmcCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoZnAuZ2V0RmlsZSgpKTsKQEAgLTI1OSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAvLyBUaGlzIHRhc2sgaXMgYWxsb3cgdG8gb3ZlcnJpZGUgaXRzIG93biBwcm9wZXJ0aWVzCiAgICAgICAgICAgICAgIC8vIGJ1dCBub3Qgb3RoZXIgcHJvcGVydGllcy4gIFNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjawogICAgICAgICAgICAgICAvLyBvZiB3aGljaCBwcm9wZXJ0aWVzIHdlJ3ZlIGFkZGVkLgotICAgICAgICAgICAgICBhZGRlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAgIGFkZGVkQXR0cmlidXRlcyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgICAgICAgICAgIGlmIChrZWVwUm9vdCkgewogICAgICAgICAgICAgICAgICAgYWRkTm9kZVJlY3Vyc2l2ZWx5KHRvcEVsZW1lbnQsIHByZWZpeCwgbnVsbCk7CkBAIC0yOTUsNyArMjkwLDcgQEAKICAgICAgICAgLy8gU2V0IHRoZSBwcmVmaXggZm9yIHRoaXMgbm9kZSB0byBpbmNsdWRlIGl0cyB0YWcgbmFtZS4KICAgICAgICAgU3RyaW5nIG5vZGVQcmVmaXggPSBwcmVmaXg7CiAgICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpIHsKLSAgICAgICAgICAgIGlmIChwcmVmaXgudHJpbSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKCFwcmVmaXgudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIG5vZGVQcmVmaXggKz0gIi4iOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbm9kZVByZWZpeCArPSBub2RlLmdldE5vZGVOYW1lKCk7CkBAIC0zNjgsMzMgKzM2MywzMSBAQAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVOb2RlLmdldE5vZGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGF0dHJpYnV0ZU5vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgIFBhdGggY29udGFpbmluZ1BhdGggPQotICAgICAgICAgICAgICAgICAgICAgICAgKChjb250YWluZXIgIT0gbnVsbCkgJiYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIFBhdGgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAoUGF0aCkgY29udGFpbmVyCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgIFBhdGggY29udGFpbmluZ1BhdGggPSBjb250YWluZXIgaW5zdGFuY2VvZiBQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICA/IChQYXRoKSBjb250YWluZXIgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAgKiBUaGUgbWFpbiBjb25kaXRpb25hbCBsb2dpYyAtLSBpZiB0aGUgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgICAqIGlzIHNvbWVob3cgInNwZWNpYWwiIChpLmUuLCBpdCBoYXMga25vd24KICAgICAgICAgICAgICAgICAgICAgICogc2VtYW50aWMgbWVhbmluZykgdGhlbiBkZWFsIHdpdGggaXQKICAgICAgICAgICAgICAgICAgICAgICogYXBwcm9wcmlhdGVseS4KICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZS5lcXVhbHMoSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJRC5lcXVhbHMobm9kZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRCBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kIGFib3ZlLgogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5pbmdQYXRoICE9IG51bGwgJiYgbm9kZU5hbWUuZXF1YWxzKFBBVEgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluaW5nUGF0aCAhPSBudWxsICYmIFBBVEguZXF1YWxzKG5vZGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSAicGF0aCIgYXR0cmlidXRlIGZvciBhIG5vZGUgd2l0aGluIGEgUGF0aCBvYmplY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nUGF0aC5zZXRQYXRoKGF0dHJpYnV0ZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb250YWluaW5nUGF0aCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgUGF0aCAmJiBub2RlTmFtZS5lcXVhbHMoUkVGX0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIFBhdGggJiYgUkVGX0lELmVxdWFscyhub2RlTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgInJlZmlkIiBhdHRyaWJ1dGUgZm9yIGEgbm9kZSB3aXRoaW4gYSBQYXRoIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdQYXRoLnNldFBhdGgoYXR0cmlidXRlVmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRhaW5pbmdQYXRoICE9IG51bGwgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG5vZGVOYW1lLmVxdWFscyhMT0NBVElPTikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBMT0NBVElPTi5lcXVhbHMobm9kZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBICJsb2NhdGlvbiIgYXR0cmlidXRlIGZvciBhIG5vZGUgd2l0aGluIGEKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhdGggb2JqZWN0LgogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ1BhdGguc2V0TG9jYXRpb24ocmVzb2x2ZUZpbGUoYXR0cmlidXRlVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoUEFUSElEKSkgeworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFBBVEhJRC5lcXVhbHMobm9kZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG5vZGUgaWRlbnRpZnlpbmcgYSBuZXcgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJYbWxQcm9wZXJ0eSBkb2VzIG5vdCBzdXBwb3J0IG5lc3RlZCBwYXRocyIpOwpAQCAtNDMwLDcgKzQyMyw3IEBACiAgICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSkgewogCiAgICAgICAgICAgICBub2RlVGV4dCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhub2RlVGV4dCkgJiYgIXNlbWFudGljRW1wdHlPdmVycmlkZSkgeworICAgICAgICAgICAgaWYgKG5vZGVUZXh0LmlzRW1wdHkoKSAmJiAhc2VtYW50aWNFbXB0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICAgICAgZW1wdHlOb2RlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUKQEAgLTQ0MSw3ICs0MzQsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERQogICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMQogICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERQotICAgICAgICAgICAgICAgJiYgIiIuZXF1YWxzKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKQorICAgICAgICAgICAgICAgJiYgbm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkuaXNFbXB0eSgpCiAgICAgICAgICAgICAgICAmJiAhc2VtYW50aWNFbXB0eU92ZXJyaWRlKSB7CiAgICAgICAgICAgICBub2RlVGV4dCA9ICIiOwogICAgICAgICAgICAgZW1wdHlOb2RlID0gdHJ1ZTsKQEAgLTQ1MSw3ICs0NDQsNyBAQAogICAgICAgICAgICAgaWYgKHNlbWFudGljQXR0cmlidXRlcyAmJiBpZCA9PSBudWxsICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgIGlkID0gKFN0cmluZykgY29udGFpbmVyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGVUZXh0LnRyaW0oKS5sZW5ndGgoKSAhPSAwIHx8IGVtcHR5Tm9kZSkgeworICAgICAgICAgICAgaWYgKCFub2RlVGV4dC50cmltKCkuaXNFbXB0eSgpIHx8IGVtcHR5Tm9kZSkgewogICAgICAgICAgICAgICAgIGFkZFByb3BlcnR5KHByZWZpeCwgbm9kZVRleHQsIGlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDU5LDcgKzQ1Miw3IEBACiAgICAgICAgIC8vIGNoaWxkcmVuIHRvIHJlZmVyZW5jZSBpZiBuZWVkZWQuICBQYXRoIG9iamVjdHMgYXJlCiAgICAgICAgIC8vIGRlZmluaXRlbHkgdXNlZCBieSBjaGlsZCBwYXRoIGVsZW1lbnRzLCBhbmQgSUQgbWF5IGJlIHVzZWQKICAgICAgICAgLy8gZm9yIGEgY2hpbGQgdGV4dCBub2RlLgotICAgICAgICByZXR1cm4gKGFkZGVkUGF0aCAhPSBudWxsID8gYWRkZWRQYXRoIDogaWQpOworICAgICAgICByZXR1cm4gYWRkZWRQYXRoICE9IG51bGwgPyBhZGRlZFBhdGggOiBpZDsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4Miw3ICs0NzUsNyBAQAogICAgICAgICAgICAgLy8gd2hlbiB3ZSByZWFkIHRoZW0sIHRob3VnaCAoaW5zdGVhZCBvZiBrZWVwaW5nIHRoZW0KICAgICAgICAgICAgIC8vIG91dHNpZGUgb2YgdGhlIHByb2plY3QgYW5kIGJhdGNoIGFkZGluZyB0aGVtIGF0IHRoZSBlbmQpCiAgICAgICAgICAgICAvLyB0byBhbGxvdyBvdGhlciBwcm9wZXJ0aWVzIHRvIHJlZmVyZW5jZSB0aGVtLgotICAgICAgICAgICAgdmFsdWUgPSAoU3RyaW5nKSBhZGRlZEF0dHJpYnV0ZXMuZ2V0KG5hbWUpICsgZ2V0RGVsaW1pdGVyKCkgKyB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gYWRkZWRBdHRyaWJ1dGVzLmdldChuYW1lKSArIGdldERlbGltaXRlcigpICsgdmFsdWU7CiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgYWRkZWRBdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KG5hbWUpID09IG51bGwpIHsKQEAgLTUwOSw3ICs1MDIsNyBAQAogICAgICAgICBpZiAoc2VtYW50aWNBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAvLyBOZXZlciBpbmNsdWRlIHRoZSAicmVmaWQiIGF0dHJpYnV0ZSBhcyBwYXJ0IG9mIHRoZQogICAgICAgICAgICAgLy8gYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoUkVGX0lEKSkgeworICAgICAgICAgICAgaWYgKFJFRl9JRC5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiBpdCBhcHBlbmRlZCB1bmxlc3MgcHJvcGVydHkgdG8gaGlkZSBpdCBpcyBzZXQuCkBAIC01MjUsMTIgKzUxOCw3IEBACiAgICAgICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGF0dHJpYnV0ZSBuYW1lIGlzIHJlY29nbml6ZWQgb3Igbm90LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTZW1hbnRpY0F0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFUVFJJQlVURVMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhBVFRSSUJVVEVTW2ldKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoQVRUUklCVVRFUykuY29udGFpbnMoYXR0cmlidXRlTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01NTAsMTEgKzUzOCwxMSBAQAogICAgICAgICBpZiAoc2VtYW50aWNBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5vZGUuZ2V0Tm9kZU5hbWUoKTsKICAgICAgICAgICAgIG5vZGVWYWx1ZSA9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhub2RlVmFsdWUpOwotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKExPQ0FUSU9OKSkgeworICAgICAgICAgICAgaWYgKExPQ0FUSU9OLmVxdWFscyhhdHRyaWJ1dGVOYW1lKSkgewogICAgICAgICAgICAgICAgIEZpbGUgZiA9IHJlc29sdmVGaWxlKG5vZGVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGYuZ2V0UGF0aCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKFJFRl9JRCkpIHsKKyAgICAgICAgICAgIGlmIChSRUZfSUQuZXF1YWxzKGF0dHJpYnV0ZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgT2JqZWN0IHJlZiA9IGdldFByb2plY3QoKS5nZXRSZWZlcmVuY2Uobm9kZVZhbHVlKTsKICAgICAgICAgICAgICAgICBpZiAocmVmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZi50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXAuamF2YQppbmRleCBmOWU3YjExLi45ZWZhZTZkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXAuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDIyICsxOSwyMSBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC00NCw3ICs0Myw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQXJjaGl2ZUZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdHRlcm5TZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlppcEZpbGVTZXQ7CkBAIC04NiwxMyArODQsMjQgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9VTkRVUF9NSUxMSVMgPSBaSVBfRklMRV9USU1FU1RBTVBfR1JBTlVMQVJJVFkgLSAxOwogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIC8vIEZvciBkaXJlY3RvcmllczoKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX0NSQyA9IG5ldyBDUkMzMigpLmdldFZhbHVlKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yIE1JU1NJTkdfU0VMRUNUT1IgPQorICAgICAgICAgICAgdGFyZ2V0IC0+ICF0YXJnZXQuaXNFeGlzdHMoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVXRpbHMuUmVzb3VyY2VTZWxlY3RvclByb3ZpZGVyCisgICAgICAgIE1JU1NJTkdfRElSX1BST1ZJREVSID0gc3IgLT4gTUlTU0lOR19TRUxFQ1RPUjsKKwogICAgIHByb3RlY3RlZCBGaWxlIHppcEZpbGU7CiAgICAgLy8gdXNlIHRvIHNjYW4gb3duIGFyY2hpdmUKICAgICBwcml2YXRlIFppcFNjYW5uZXIgenM7CiAgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZW50cmllcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsZVNldD4gZ3JvdXBmaWxlc2V0cyA9IG5ldyBWZWN0b3I8RmlsZVNldD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxaaXBGaWxlU2V0PiBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzID0gbmV3IFZlY3RvcjxaaXBGaWxlU2V0PigpOworICAgIHByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZVNldD4gZ3JvdXBmaWxlc2V0cyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxaaXBGaWxlU2V0PiBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBkdXBsaWNhdGUgPSAiYWRkIjsKICAgICBwcml2YXRlIGJvb2xlYW4gZG9Db21wcmVzcyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIGRvVXBkYXRlID0gZmFsc2U7CkBAIC0xMDEsMjcgKzExMCwxMCBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBkb0ZpbGVzb25seSA9IGZhbHNlOwogICAgIHByb3RlY3RlZCBTdHJpbmcgYXJjaGl2ZVR5cGUgPSAiemlwIjsKIAotICAgIC8vIEZvciBkaXJlY3RvcmllczoKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX0NSQyA9IG5ldyBDUkMzMigpLmdldFZhbHVlKCk7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBlbXB0eUJlaGF2aW9yID0gInNraXAiOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gcmVzb3VyY2VzID0gbmV3IFZlY3RvcjxSZXNvdXJjZUNvbGxlY3Rpb24+KCk7Ci0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gYWRkZWREaXJzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGFkZGVkRmlsZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlU2VsZWN0b3IgTUlTU0lOR19TRUxFQ1RPUiA9Ci0gICAgICAgIG5ldyBSZXNvdXJjZVNlbGVjdG9yKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChmaW5hbCBSZXNvdXJjZSB0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIXRhcmdldC5pc0V4aXN0cygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVdGlscy5SZXNvdXJjZVNlbGVjdG9yUHJvdmlkZXIKLSAgICAgICAgTUlTU0lOR19ESVJfUFJPVklERVIgPSBuZXcgUmVzb3VyY2VVdGlscy5SZXNvdXJjZVNlbGVjdG9yUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFJlc291cmNlU2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0U2VsZWN0b3JGb3JTb3VyY2UoZmluYWwgUmVzb3VyY2Ugc3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1JU1NJTkdfU0VMRUNUT1I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiByZXNvdXJjZXMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBhZGRlZERpcnMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBhZGRlZEZpbGVzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICBwcml2YXRlIFN0cmluZyBmaXhlZE1vZFRpbWUgPSBudWxsOyAvLyBVc2VyLXByb3ZpZGVkLgogICAgIHByaXZhdGUgbG9uZyBtb2RUaW1lTWlsbGlzID0gMDsgLy8gQ2FsY3VsYXRlZC4KQEAgLTE1Nyw4ICsxNDksNiBAQAogICAgICAgICByZXR1cm4gIWRvdWJsZUZpbGVQYXNzIHx8IHNraXBXcml0aW5nOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotCiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KIAogICAgIC8vIFRoaXMgYm9vbGVhbiBpcyBzZXQgaWYgdGhlIHRhc2sgZGV0ZWN0cyB0aGF0IHRoZQpAQCAtMzY4LDcgKzM1OCw3IEBACiAgICAgICogQHBhcmFtIHNldCB0aGUgZ3JvdXAgKGEgZmlsZXNldCkgdG8gYWRkCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkWmlwR3JvdXBGaWxlc2V0KGZpbmFsIEZpbGVTZXQgc2V0KSB7Ci0gICAgICAgIGdyb3VwZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgICAgICBncm91cGZpbGVzZXRzLmFkZChzZXQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDE4LDcgKzQwOCw3IEBACiAgICAgICogZGVmYXVsdCBlbmNvZGluZy4KICAgICAgKgogICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KKyAgICAgKiBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+aHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LjwvcD4KICAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIG5hbWUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhmaW5hbCBTdHJpbmcgZW5jb2RpbmcpIHsKQEAgLTYwNiw3ICs1OTYsNyBAQAogICAgICAqICAgICAgICB0aGF0IHlvdSBtdXN0IGNob29zZSBvbmUgb2YgYSBvciBiLCBhbmQgW2NdIGluZGljYXRlcyB0aGF0IHlvdQogICAgICAqICAgICAgICBtYXkgdXNlIG9yIG9taXQgYy4gJnBsdXNtbjtaWlpaIGlzIHRoZSB0aW1lem9uZSBvZmZzZXQsIGFuZCBtYXkgYmUKICAgICAgKiAgICAgICAgbGl0ZXJhbGx5ICJaIiB0byBtZWFuIEdNVC4KLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TW9kaWZpY2F0aW9udGltZShTdHJpbmcgdGltZSkgewogICAgICAgICBmaXhlZE1vZFRpbWUgPSB0aW1lOwpAQCAtNjE2LDcgKzYwNiw3IEBACiAgICAgICogVGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgcHJldmlvdXNseSBwcm92aWRlZCB0bwogICAgICAqIHtAbGluayAjc2V0TW9kaWZpY2F0aW9udGltZShTdHJpbmcpfSBvciB7QGNvZGUgbnVsbH0gaWYgdW5zZXQuCiAgICAgICogQHJldHVybiBTdHJpbmcKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRNb2RpZmljYXRpb250aW1lKCkgewogICAgICAgICByZXR1cm4gZml4ZWRNb2RUaW1lOwpAQCAtNjY2LDIwICs2NTYsMTcgQEAKICAgICAgICAgcHJvY2Vzc0dyb3VwRmlsZXNldHMoKTsKIAogICAgICAgICAvLyBjb2xsZWN0IGZpbGVzZXRzIHRvIHBhc3MgdGhlbSB0byBnZXRSZXNvdXJjZXNUb0FkZAotICAgICAgICBmaW5hbCBWZWN0b3I8UmVzb3VyY2VDb2xsZWN0aW9uPiB2ZnNzID0gbmV3IFZlY3RvcjxSZXNvdXJjZUNvbGxlY3Rpb24+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiB2ZnNzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKICAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZ2V0SW1wbGljaXRGaWxlU2V0KCkuY2xvbmUoKTsKICAgICAgICAgICAgIGZzLnNldERpcihiYXNlRGlyKTsKLSAgICAgICAgICAgIHZmc3MuYWRkRWxlbWVudChmcyk7CisgICAgICAgICAgICB2ZnNzLmFkZChmcyk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSByZXNvdXJjZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gcmVzb3VyY2VzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIHZmc3MuYWRkRWxlbWVudChyYyk7Ci0gICAgICAgIH0KKyAgICAgICAgdmZzcy5hZGRBbGwocmVzb3VyY2VzKTsKIAotICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbGxlY3Rpb25bXSBmc3MgPSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uW3Zmc3Muc2l6ZSgpXTsKLSAgICAgICAgdmZzcy5jb3B5SW50byhmc3MpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbGxlY3Rpb25bXSBmc3MgPQorICAgICAgICAgICAgdmZzcy50b0FycmF5KG5ldyBSZXNvdXJjZUNvbGxlY3Rpb25bdmZzcy5zaXplKCldKTsKKwogICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGNhbiBhbHNvIGhhbmRsZSBlbXB0eSBhcmNoaXZlcwpAQCAtNjkzLDggKzY4MCw5IEBACiAgICAgICAgICAgICBmaW5hbCBGaWxlIHBhcmVudCA9IHppcEZpbGUuZ2V0UGFyZW50RmlsZSgpOwogICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmICFwYXJlbnQuaXNEaXJlY3RvcnkoKQogICAgICAgICAgICAgICAgICYmICEocGFyZW50Lm1rZGlycygpIHx8IHBhcmVudC5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBtaXNzaW5nIHBhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpcmVjdG9yeSBmb3IgIiArIHppcEZpbGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgbWlzc2luZyBwYXJlbnQgZGlyZWN0b3J5IGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgIHppcEZpbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1cGRhdGVkRmlsZSA9IHRydWU7CkBAIC03NDUsMzIgKzczMywyNSBAQAogICAgICAgICAgICAgICAgICAgICBvbGRGaWxlcy5zZXRTcmMocmVuYW1lZEZpbGUpOwogICAgICAgICAgICAgICAgICAgICBvbGRGaWxlcy5zZXREZWZhdWx0ZXhjbHVkZXMoZmFsc2UpOwogCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBhZGRTaXplID0gYWRkZWRGaWxlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXR0ZXJuU2V0Lk5hbWVFbnRyeSBuZSA9IG9sZEZpbGVzLmNyZWF0ZUV4Y2x1ZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5lLnNldE5hbWUoYWRkZWRGaWxlcy5lbGVtZW50QXQoaSkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhZGRlZEZpbGUgOiBhZGRlZEZpbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGRGaWxlcy5jcmVhdGVFeGNsdWRlKCkuc2V0TmFtZShhZGRlZEZpbGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgZHMgPQogICAgICAgICAgICAgICAgICAgICAgICAgb2xkRmlsZXMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgICAgICAoKFppcFNjYW5uZXIpIGRzKS5zZXRFbmNvZGluZyhlbmNvZGluZyk7CiAKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZiA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VbXSByID0gbmV3IFJlc291cmNlW2YubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByW2ldID0gZHMuZ2V0UmVzb3VyY2UoZltpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyZWFtPFN0cmluZz4gaW5jbHVkZWRSZXNvdXJjZU5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbS5vZihkcy5nZXRJbmNsdWRlZEZpbGVzKCkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghZG9GaWxlc29ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGQgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVtdIGRyID0gbmV3IFJlc291cmNlW2QubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyW2ldID0gZHMuZ2V0UmVzb3VyY2UoZFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVtdIHRtcCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByID0gbmV3IFJlc291cmNlW3RtcC5sZW5ndGggKyBkci5sZW5ndGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShkciwgMCwgciwgMCwgZHIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG1wLCAwLCByLCBkci5sZW5ndGgsIHRtcC5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWRSZXNvdXJjZU5hbWVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW0uY29uY2F0KGluY2x1ZGVkUmVzb3VyY2VOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtLm9mKGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSkpOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VbXSByID0gaW5jbHVkZWRSZXNvdXJjZU5hbWVzLm1hcChkczo6Z2V0UmVzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShSZXNvdXJjZVtdOjpuZXcpOworCiAgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlcyhvbGRGaWxlcywgciwgek91dCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh6T3V0ICE9IG51bGwpIHsKQEAgLTgyMiwxNiArODAzLDEwIEBACiAgICAgICAgICAgICBnZXRQcm9qZWN0KCksICJ6aXAiLCAiLnRtcCIsIHppcEZpbGUuZ2V0UGFyZW50RmlsZSgpLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlbmFtZSh6aXBGaWxlLCByZW5hbWVkRmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VjdXJpdHlFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIk5vdCBhbGxvd2VkIHRvIHJlbmFtZSBvbGQgZmlsZSAoIgotICAgICAgICAgICAgICAgICsgemlwRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQotICAgICAgICAgICAgICAgICsgIikgdG8gdGVtcG9yYXJ5IGZpbGUiKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVuYW1lIG9sZCBmaWxlICgiCi0gICAgICAgICAgICAgICAgKyB6aXBGaWxlLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgKyAiKSB0byB0ZW1wb3JhcnkgZmlsZSIpOworICAgICAgICAgICAgICAgICJVbmFibGUgdG8gcmVuYW1lIG9sZCBmaWxlICglcykgdG8gdGVtcG9yYXJ5IGZpbGUiLAorICAgICAgICAgICAgICAgIHppcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZW5hbWVkRmlsZTsKICAgICB9CkBAIC04NjIsMjMgKzgzNywyMiBAQAogCiAgICAgLyoqIENoZWNrIHRoZSBhdHRyaWJ1dGVzIGFuZCBlbGVtZW50cyAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja0F0dHJpYnV0ZXNBbmRFbGVtZW50cygpIHsKLSAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCAmJiByZXNvdXJjZXMuc2l6ZSgpID09IDAKLSAgICAgICAgICAgICYmIGdyb3VwZmlsZXNldHMuc2l6ZSgpID09IDAgJiYgInppcCIuZXF1YWxzKGFyY2hpdmVUeXBlKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJiYXNlZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIGF0IGxlYXN0IG9uZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVzb3VyY2UgY29sbGVjdGlvbiBtdXN0IGJlIGdpdmVuISIpOworICAgICAgICBpZiAoYmFzZURpciA9PSBudWxsICYmIHJlc291cmNlcy5pc0VtcHR5KCkgJiYgZ3JvdXBmaWxlc2V0cy5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmICJ6aXAiLmVxdWFscyhhcmNoaXZlVHlwZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYmFzZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQsIG9yIGF0IGxlYXN0IG9uZSByZXNvdXJjZSBjb2xsZWN0aW9uIG11c3QgYmUgZ2l2ZW4hIik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoemlwRmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFyY2hpdmVUeXBlICsgIiBmaWxlIHRvIGNyZWF0ZSEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgc3BlY2lmeSB0aGUgJXMgZmlsZSB0byBjcmVhdGUhIiwKKyAgICAgICAgICAgICAgICBhcmNoaXZlVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZml4ZWRNb2RUaW1lICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbW9kVGltZU1pbGxpcyA9IERhdGVVdGlscy5wYXJzZUxlbmllbnREYXRlVGltZShmaXhlZE1vZFRpbWUpLmdldFRpbWUoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgZGF0ZSBzdHJpbmcgIiArIGZpeGVkTW9kVGltZSArICIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgZGF0ZSBzdHJpbmcgJXMuIiwgZml4ZWRNb2RUaW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyb3VuZFVwKSB7CiAgICAgICAgICAgICAgICAgbW9kVGltZU1pbGxpcyArPSBST1VORFVQX01JTExJUzsKQEAgLTg4NiwxMSArODYwLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoemlwRmlsZS5leGlzdHMoKSAmJiAhemlwRmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHppcEZpbGUgKyAiIGlzIG5vdCBhIGZpbGUuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGlzIG5vdCBhIGZpbGUuIiwgemlwRmlsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoemlwRmlsZS5leGlzdHMoKSAmJiAhemlwRmlsZS5jYW5Xcml0ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oemlwRmlsZSArICIgaXMgcmVhZC1vbmx5LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBpcyByZWFkLW9ubHkuIiwgemlwRmlsZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkwOCwyMyArODgyLDE4IEBACiAgICAgLyoqIFByb2Nlc3MgZ3JvdXBmaWxlc2V0cyAqLwogICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzR3JvdXBGaWxlc2V0cygpIHsKICAgICAgICAgLy8gQWRkIHRoZSBmaWxlcyBmb3VuZCBpbiBncm91cGZpbGVzZXQgdG8gZmlsZXNldAotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGdyb3VwZmlsZXNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCisgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGdyb3VwZmlsZXNldHMpIHsKICAgICAgICAgICAgIGxvZ1doZW5Xcml0aW5nKCJQcm9jZXNzaW5nIGdyb3VwZmlsZXNldCAiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBncm91cGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKICAgICAgICAgICAgIGZpbmFsIEZpbGVTY2FubmVyIHNjYW5uZXIgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwogICAgICAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gc2Nhbm5lci5nZXRCYXNlZGlyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICBsb2dXaGVuV3JpdGluZygiQWRkaW5nIGZpbGUgIiArIGZpbGVzW2pdICsgIiB0byBmaWxlc2V0IiwKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkgeworICAgICAgICAgICAgICAgIGxvZ1doZW5Xcml0aW5nKCJBZGRpbmcgZmlsZSAiICsgZmlsZSArICIgdG8gZmlsZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgZmluYWwgWmlwRmlsZVNldCB6ZiA9IG5ldyBaaXBGaWxlU2V0KCk7CiAgICAgICAgICAgICAgICAgemYuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIHpmLnNldFNyYyhuZXcgRmlsZShiYXNlZGlyLCBmaWxlc1tqXSkpOworICAgICAgICAgICAgICAgIHpmLnNldFNyYyhuZXcgRmlsZShiYXNlZGlyLCBmaWxlKSk7CiAgICAgICAgICAgICAgICAgYWRkKHpmKTsKLSAgICAgICAgICAgICAgICBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzLmFkZEVsZW1lbnQoemYpOworICAgICAgICAgICAgICAgIGZpbGVzZXRzRnJvbUdyb3VwZmlsZXNldHMuYWRkKHpmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTk2NywxOCArOTM2LDE3IEBACiAgICAgICAgICAgICBmaWxlTW9kZSA9IHpmcy5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgZnVsbHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkJvdGggcHJlZml4IGFuZCBmdWxscGF0aCBhdHRyaWJ1dGVzIG11c3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG5vdCBiZSBzZXQgb24gdGhlIHNhbWUgZmlsZXNldC4iKTsKKyAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpICYmICFmdWxscGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQm90aCBwcmVmaXggYW5kIGZ1bGxwYXRoIGF0dHJpYnV0ZXMgbXVzdCBub3QgYmUgc2V0IG9uIHRoZSBzYW1lIGZpbGVzZXQuIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocmVzb3VyY2VzLmxlbmd0aCAhPSAxICYmIGZ1bGxwYXRoLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmdWxscGF0aCBhdHRyaWJ1dGUgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgZmlsZXNldHMgdGhhdCBzcGVjaWZ5IGEgc2luZ2xlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaWxlLiIpOworICAgICAgICBpZiAocmVzb3VyY2VzLmxlbmd0aCAhPSAxICYmICFmdWxscGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiZnVsbHBhdGggYXR0cmlidXRlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgZmlsZXNldHMgdGhhdCBzcGVjaWZ5IGEgc2luZ2xlIGZpbGUuIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocHJlZml4Lmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoIXByZWZpeC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmICghcHJlZml4LmVuZHNXaXRoKCIvIikgJiYgIXByZWZpeC5lbmRzV2l0aCgiXFwiKSkgewogICAgICAgICAgICAgICAgIHByZWZpeCArPSAiLyI7CiAgICAgICAgICAgICB9CkBAIC05OTcsMjYgKzk2NSwyNiBAQAogICAgICAgICAgICAgICAgIHpmID0gbmV3IFppcEZpbGUoemZzLmdldFNyYyhnZXRQcm9qZWN0KCkpLCBlbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChmdWxscGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxwYXRoOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgeworICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICAgICAgICAgIGlmIChmdWxscGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVzb3VyY2VzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxwYXRoOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKIAotICAgICAgICAgICAgICAgIGlmICgiIi5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRvRmlsZXNvbmx5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGhpc0Rpck1vZGUgPSB6ZnMgIT0gbnVsbCAmJiB6ZnMuaGFzRGlyTW9kZUJlZW5TZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBkaXJNb2RlIDogZ2V0VW5peE1vZGUocmVzb3VyY2VzW2ldLCB6ZiwgZGlyTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZERpcmVjdG9yeVJlc291cmNlKHJlc291cmNlc1tpXSwgbmFtZSwgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgPyBkaXJNb2RlIDogZ2V0VW5peE1vZGUocmVzb3VyY2UsIHpmLCBkaXJNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkRGlyZWN0b3J5UmVzb3VyY2UocmVzb3VyY2UsIG5hbWUsIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgek91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyTW9kZSwgdGhpc0Rpck1vZGUpOwogCkBAIC0xMDI2LDE0ICs5OTQsMTQgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZGVhbGluZ1dpdGhGaWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXNbaV0uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUoZiwgek91dCwgcHJlZml4ICsgbmFtZSwgZmlsZU1vZGUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRoaXNGaWxlTW9kZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemZzICE9IG51bGwgJiYgemZzLmhhc0ZpbGVNb2RlQmVlblNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWxlTW9kZSA6IGdldFVuaXhNb2RlKHJlc291cmNlc1tpXSwgemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWxlTW9kZSA6IGdldFVuaXhNb2RlKHJlc291cmNlLCB6ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2UocmVzb3VyY2VzW2ldLCBuYW1lLCBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZShyZXNvdXJjZSwgbmFtZSwgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgek91dCwgdGhpc0ZpbGVNb2RlLCB6ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmcyA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwgOiB6ZnMuZ2V0U3JjKGdldFByb2plY3QoKSkpOwpAQCAtMTA1OCwxMCArMTAyNiwxMCBAQAogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLyIpKSB7Ci0gICAgICAgICAgICBuYW1lID0gbmFtZSArICIvIjsKKyAgICAgICAgICAgIG5hbWUgKz0gIi8iOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgaW50IG5leHRUb0xhc3RTbGFzaCA9IG5hbWUubGFzdEluZGV4T2YoIi8iLCBuYW1lLmxlbmd0aCgpIC0gMik7CisgICAgICAgIGZpbmFsIGludCBuZXh0VG9MYXN0U2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCcvJywgbmFtZS5sZW5ndGgoKSAtIDIpOwogICAgICAgICBpZiAobmV4dFRvTGFzdFNsYXNoICE9IC0xKSB7CiAgICAgICAgICAgICBhZGRQYXJlbnREaXJzKGJhc2UsIG5hbWUuc3Vic3RyaW5nKDAsIG5leHRUb0xhc3RTbGFzaCArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB6T3V0LCBwcmVmaXgsIGRlZmF1bHREaXJNb2RlKTsKQEAgLTExMDcsMjUgKzEwNzUsMTggQEAKICAgICAgICAgICAgICAgICBpZiAoa2VlcENvbXByZXNzaW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIGRvQ29tcHJlc3MgPSAoemUuZ2V0TWV0aG9kKCkgPT0gWmlwRW50cnkuREVGTEFURUQpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSh6Zi5nZXRJbnB1dFN0cmVhbSh6ZSkpOworICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgQnVmZmVyZWRJbnB1dFN0cmVhbSBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHpmLmdldElucHV0U3RyZWFtKHplKSkpIHsKICAgICAgICAgICAgICAgICAgICAgemlwRmlsZShpcywgek91dCwgcHJlZml4ICsgbmFtZSwgemUuZ2V0VGltZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21BcmNoaXZlLCBtb2RlLCB6ZS5nZXRFeHRyYUZpZWxkcyh0cnVlKSk7CiAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgZG9Db21wcmVzcyA9IG9sZENvbXByZXNzOwotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgdHJ5IChmaW5hbCBCdWZmZXJlZElucHV0U3RyZWFtIGlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oci5nZXRJbnB1dFN0cmVhbSgpKSkgewogICAgICAgICAgICAgICAgIHppcEZpbGUoaXMsIHpPdXQsIHByZWZpeCArIG5hbWUsIHIuZ2V0TGFzdE1vZGlmaWVkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQXJjaGl2ZSwgbW9kZSwgciBpbnN0YW5jZW9mIFppcFJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoWmlwUmVzb3VyY2UpIHIpLmdldEV4dHJhRmllbGRzKCkgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGlzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExNDksMTUgKzExMTAsMTQgQEAKICAgICAgICAgICAgIGFkZFJlc291cmNlcygoRmlsZVNldCkgcmMsIHJlc291cmNlcywgek91dCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VzW2ldOworICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwogCi0gICAgICAgICAgICBpZiAoIiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpZiAobmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyZXNvdXJjZS5pc0RpcmVjdG9yeSgpICYmIGRvRmlsZXNvbmx5KSB7CkBAIC0xMjI0LDkgKzExODQsNyBAQAogICAgICAgICAgICAgbG9nKCJOb3RlOiBjcmVhdGluZyBlbXB0eSAiICsgYXJjaGl2ZVR5cGUgKyAiIGFyY2hpdmUgIiArIHppcEZpbGUsCiAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgIH0KLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oemlwRmlsZSk7CisgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIG9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHppcEZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgogICAgICAgICAgICAgLy8gQ2YuIFBLWklQIHNwZWNpZmljYXRpb24uCiAgICAgICAgICAgICBmaW5hbCBieXRlW10gZW1wdHkgPSBuZXcgYnl0ZVsyMl07CkBAIC0xMjQxLDggKzExOTksNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGVtcHR5IFpJUCBhcmNoaXZlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIoIiArIGlvZS5nZXRNZXNzYWdlKCkgKyAiKSIsIGlvZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvcyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTI5MSwxMyArMTI0NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSB6aXBGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc1VwZGF0ZSkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4oKTsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gcmVzdCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJjcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJjc1tpXSBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKLSAgICAgICAgICAgICAgICBmaWxlc2V0cy5hZGQocmNzW2ldKTsKKyAgICAgICAgZmluYWwgTGlzdDxGaWxlU2V0PiBmaWxlc2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gcmVzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFJlc291cmNlQ29sbGVjdGlvbiByYyA6IHJjcykgeworICAgICAgICAgICAgaWYgKHJjIGluc3RhbmNlb2YgRmlsZVNldCkgeworICAgICAgICAgICAgICAgIGZpbGVzZXRzLmFkZCgoRmlsZVNldCkgcmMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXN0LmFkZChyY3NbaV0pOworICAgICAgICAgICAgICAgIHJlc3QuYWRkKHJjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbGxlY3Rpb25bXSByYyA9CkBAIC0xMzA1LDggKzEyNjEsNyBAQAogICAgICAgICBBcmNoaXZlU3RhdGUgYXMgPSBnZXROb25GaWxlU2V0UmVzb3VyY2VzVG9BZGQocmMsIHppcEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSk7CiAKLSAgICAgICAgZmluYWwgRmlsZVNldFtdIGZzID0gZmlsZXNldHMudG9BcnJheShuZXcgRmlsZVNldFtmaWxlc2V0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaXplKCldKTsKKyAgICAgICAgZmluYWwgRmlsZVNldFtdIGZzID0gZmlsZXNldHMudG9BcnJheShuZXcgRmlsZVNldFtmaWxlc2V0cy5zaXplKCldKTsKICAgICAgICAgZmluYWwgQXJjaGl2ZVN0YXRlIGFzMiA9IGdldFJlc291cmNlc1RvQWRkKGZzLCB6aXBGaWxlLCBhcy5pc091dE9mRGF0ZSgpKTsKICAgICAgICAgaWYgKCFhcy5pc091dE9mRGF0ZSgpICYmIGFzMi5pc091dE9mRGF0ZSgpKSB7CiAgICAgICAgICAgICAvKgpAQCAtMTM0MCwxMiArMTI5NSw3IEBACiAgICAgICogdG8gbW92ZSB0aGUgd2l0aEVtcHR5IGJlaGF2aW9yIGNoZWNrcyAoc2luY2UgZWl0aGVyIHdvdWxkIGJyZWFrCiAgICAgICogc3ViY2xhc3NlcyBpbiBzZXZlcmFsIHdheXMpLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPEJvb2xlYW4+IEhBVkVfTk9OX0ZJTEVfU0VUX1JFU09VUkNFU19UT19BREQgPSBuZXcgVGhyZWFkTG9jYWw8Qm9vbGVhbj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBCb29sZWFuIGluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxCb29sZWFuPiBIQVZFX05PTl9GSUxFX1NFVF9SRVNPVVJDRVNfVE9fQUREID0gVGhyZWFkTG9jYWwud2l0aEluaXRpYWwoKCkgLT4gQm9vbGVhbi5GQUxTRSk7CiAKICAgICAvKioKICAgICAgKiBDb2xsZWN0IHRoZSByZXNvdXJjZXMgdGhhdCBhcmUgbmV3ZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZwpAQCAtMTM5OSw3ICsxMzQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcmNoaXZlU3RhdGUodHJ1ZSwgaW5pdGlhbFJlc291cmNlcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGVtcHR5QmVoYXZpb3IuZXF1YWxzKCJza2lwIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoInNraXAiLmVxdWFscyhlbXB0eUJlaGF2aW9yKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZG9VcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1doZW5Xcml0aW5nKGFyY2hpdmVUeXBlICsgIiBhcmNoaXZlICIgKyB6aXBGaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgbm90IHVwZGF0ZWQgYmVjYXVzZSBubyBuZXcgZmlsZXMgd2VyZSIKQEAgLTE0MTAsNyArMTM2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBubyBmaWxlcyB3ZXJlIGluY2x1ZGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW1wdHlCZWhhdmlvci5lcXVhbHMoImZhaWwiKSkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZhaWwiLmVxdWFscyhlbXB0eUJlaGF2aW9yKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgIiArIGFyY2hpdmVUeXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJjaGl2ZSAiICsgemlwRmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBubyBmaWxlcyB3ZXJlIGluY2x1ZGVkLiIsCkBAIC0xNDY4LDcgKzE0MTgsNyBAQAogICAgICAgICAgICAgaWYgKGZpbGVzZXRzW2ldIGluc3RhbmNlb2YgWmlwRmlsZVNldCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFppcEZpbGVTZXQgemZzID0gKFppcEZpbGVTZXQpIGZpbGVzZXRzW2ldOwogICAgICAgICAgICAgICAgIGlmICh6ZnMuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICF6ZnMuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICYmICF6ZnMuZ2V0RnVsbHBhdGgoZ2V0UHJvamVjdCgpKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhpcyBjYXNlIGFsbCBmaWxlcyBmcm9tIG9yaWdpbiBtYXAgdG8KICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZ1bGxQYXRoIGF0dHJpYnV0ZSBvZiB0aGUgemlwZmlsZXNldCBhdAogICAgICAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbgpAQCAtMTQ3Nyw3ICsxNDI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXlNYXBwZXIgPSBmbTsKIAogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoemZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF6ZnMuZ2V0UHJlZml4KGdldFByb2plY3QoKSkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXpmcy5nZXRQcmVmaXgoZ2V0UHJvamVjdCgpKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgR2xvYlBhdHRlcm5NYXBwZXIgZ20gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKICAgICAgICAgICAgICAgICAgICAgZ20uc2V0RnJvbSgiKiIpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gemZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpOwpAQCAtMTU0MSw3ICsxNDkxLDcgQEAKIAogICAgICAgICBmaW5hbCBSZXNvdXJjZVtdW10gaW5pdGlhbFJlc291cmNlcyA9IGdyYWJOb25GaWxlU2V0UmVzb3VyY2VzKHJjcyk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZW1wdHkgPSBpc0VtcHR5KGluaXRpYWxSZXNvdXJjZXMpOwotICAgICAgICBIQVZFX05PTl9GSUxFX1NFVF9SRVNPVVJDRVNfVE9fQURELnNldChCb29sZWFuLnZhbHVlT2YoIWVtcHR5KSk7CisgICAgICAgIEhBVkVfTk9OX0ZJTEVfU0VUX1JFU09VUkNFU19UT19BREQuc2V0KCFlbXB0eSk7CiAgICAgICAgIGlmIChlbXB0eSkgewogICAgICAgICAgICAgLy8gbm8gZW1wdHlCZWhhdmlvciBoYW5kbGluZyBzaW5jZSB0aGUgRmlsZVNldCB2ZXJzaW9uCiAgICAgICAgICAgICAvLyB3aWxsIHRha2UgY2FyZSBvZiBpdC4KQEAgLTE1NzEsOCArMTUyMSw4IEBACiAgICAgICAgICAgICAgICAgZmluYWwgRmlsZVByb3ZpZGVyIGZwID0KICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbFJlc291cmNlc1tpXVtqXS5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwogICAgICAgICAgICAgICAgIGlmIChmcCAhPSBudWxsICYmIHppcEZpbGUuZXF1YWxzKGZwLmdldEZpbGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBIHppcCBmaWxlIGNhbm5vdCBpbmNsdWRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIml0c2VsZiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkEgemlwIGZpbGUgY2Fubm90IGluY2x1ZGUgaXRzZWxmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTYwOSw4ICsxNTU5LDggQEAKICAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLnNlbGVjdFNvdXJjZXModGhpcywgdSwgbWFwcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRaaXBTY2FubmVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JU1NJTkdfRElSX1BST1ZJREVSKTsKLSAgICAgICAgICAgIGlmIChyYy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlPiBuZXdlciA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgICAgICAgICBpZiAoIXJjLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IG5ld2VyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICAgICAgbmV3ZXIuYWRkQWxsKEFycmF5cy5hc0xpc3QoKChVbmlvbikgcmMpLmxpc3RSZXNvdXJjZXMoKSkpOwogICAgICAgICAgICAgICAgIG5ld2VyLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc3VsdCkpOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ld2VyLnRvQXJyYXkocmVzdWx0KTsKQEAgLTE2MzMsMzIgKzE1ODMsMjggQEAKICAgICAgICAgICAgIGJvb2xlYW4gc2tpcEVtcHR5TmFtZXMgPSB0cnVlOwogICAgICAgICAgICAgaWYgKGZpbGVzZXRzW2ldIGluc3RhbmNlb2YgWmlwRmlsZVNldCkgewogICAgICAgICAgICAgICAgIGZpbmFsIFppcEZpbGVTZXQgemZzID0gKFppcEZpbGVTZXQpIGZpbGVzZXRzW2ldOwotICAgICAgICAgICAgICAgIHNraXBFbXB0eU5hbWVzID0gemZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLmVxdWFscygiIikKLSAgICAgICAgICAgICAgICAgICAgJiYgemZzLmdldEZ1bGxwYXRoKGdldFByb2plY3QoKSkuZXF1YWxzKCIiKTsKKyAgICAgICAgICAgICAgICBza2lwRW1wdHlOYW1lcyA9IHpmcy5nZXRQcmVmaXgoZ2V0UHJvamVjdCgpKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgemZzLmdldEZ1bGxwYXRoKGdldFByb2plY3QoKSkuaXNFbXB0eSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBycyA9CiAgICAgICAgICAgICAgICAgZmlsZXNldHNbaV0uZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgaWYgKHJzIGluc3RhbmNlb2YgWmlwU2Nhbm5lcikgewogICAgICAgICAgICAgICAgICgoWmlwU2Nhbm5lcikgcnMpLnNldEVuY29kaW5nKGVuY29kaW5nKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFZlY3RvcjxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IFZlY3RvcjxSZXNvdXJjZT4oKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBWZWN0b3I8PigpOwogICAgICAgICAgICAgaWYgKCFkb0ZpbGVzb25seSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGRpcmVjdG9yaWVzID0gcnMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGlyZWN0b3JpZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMoZGlyZWN0b3JpZXNbal0pIHx8ICFza2lwRW1wdHlOYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEVsZW1lbnQocnMuZ2V0UmVzb3VyY2UoZGlyZWN0b3JpZXNbal0pKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBkIDogcnMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZC5pc0VtcHR5KCkgfHwgIXNraXBFbXB0eU5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJzLmdldFJlc291cmNlKGQpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gcnMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmaWxlcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKGZpbGVzW2pdKSB8fCAhc2tpcEVtcHR5TmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZEVsZW1lbnQocnMuZ2V0UmVzb3VyY2UoZmlsZXNbal0pKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGYgOiBycy5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNFbXB0eSgpIHx8ICFza2lwRW1wdHlOYW1lcykgeworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJzLmdldFJlc291cmNlKGYpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlc3VsdFtpXSA9IG5ldyBSZXNvdXJjZVtyZXNvdXJjZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIHJlc291cmNlcy5jb3B5SW50byhyZXN1bHRbaV0pOworICAgICAgICAgICAgcmVzdWx0W2ldID0gcmVzb3VyY2VzLnRvQXJyYXkobmV3IFJlc291cmNlW3Jlc291cmNlcy5zaXplKCldKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE2NzQsMjUgKzE2MjAsMTkgQEAKICAgICBwcm90ZWN0ZWQgUmVzb3VyY2VbXVtdIGdyYWJOb25GaWxlU2V0UmVzb3VyY2VzKGZpbmFsIFJlc291cmNlQ29sbGVjdGlvbltdIHJjcykgewogICAgICAgICBmaW5hbCBSZXNvdXJjZVtdW10gcmVzdWx0ID0gbmV3IFJlc291cmNlW3Jjcy5sZW5ndGhdW107CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmNzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2U+IGRpcnMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOwotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBkaXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZSByIDogcmNzW2ldKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHIuaXNFeGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXJzLmFkZChyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZChyKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlycy5hZGQocik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBkaXJlY3RvcmllcyBhcmUgaW4gYWxwaGEtb3JkZXIgLSB0aGlzIGFsc28KICAgICAgICAgICAgIC8vIGVuc3VyZXMgcGFyZW50cyBjb21lIGJlZm9yZSB0aGVpciBjaGlsZHJlbgotICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChkaXJzLCBuZXcgQ29tcGFyYXRvcjxSZXNvdXJjZT4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBSZXNvdXJjZSByMSwgZmluYWwgUmVzb3VyY2UgcjIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByMS5nZXROYW1lKCkuY29tcGFyZVRvKHIyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxSZXNvdXJjZT4gcnMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPihkaXJzKTsKKyAgICAgICAgICAgIGRpcnMuc29ydChDb21wYXJhdG9yLmNvbXBhcmluZyhSZXNvdXJjZTo6Z2V0TmFtZSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gcnMgPSBuZXcgQXJyYXlMaXN0PD4oZGlycyk7CiAgICAgICAgICAgICBycy5hZGRBbGwoZmlsZXMpOwogICAgICAgICAgICAgcmVzdWx0W2ldID0gcnMudG9BcnJheShuZXcgUmVzb3VyY2VbcnMuc2l6ZSgpXSk7CiAgICAgICAgIH0KQEAgLTE3MjcsOCArMTY2Nyw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgemlwRGlyKGZpbmFsIEZpbGUgZGlyLCBmaW5hbCBaaXBPdXRwdXRTdHJlYW0gek91dCwgZmluYWwgU3RyaW5nIHZQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbW9kZSwgZmluYWwgWmlwRXh0cmFGaWVsZFtdIGV4dHJhKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB6aXBEaXIoZGlyID09IG51bGwgPyAoUmVzb3VyY2UpIG51bGwgOiBuZXcgRmlsZVJlc291cmNlKGRpciksCi0gICAgICAgICAgICAgICB6T3V0LCB2UGF0aCwgbW9kZSwgZXh0cmEpOworICAgICAgICB6aXBEaXIoZGlyID09IG51bGwgPyBudWxsIDogbmV3IEZpbGVSZXNvdXJjZShkaXIpLCB6T3V0LCB2UGF0aCwgbW9kZSwKKyAgICAgICAgICAgIGV4dHJhKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3OTEsNyArMTczMSw3IEBACiAgICAgICogc3VwcG9ydCBhIG5ldyBwYXJhbWV0ZXIgKGV4dHJhIGZpZWxkcyB0byBwcmVzZXJ2ZSkgd2l0aG91dAogICAgICAqIGJyZWFraW5nIHN1YmNsYXNzZXMgdGhhdCBvdmVycmlkZSB0aGUgb2xkIG1ldGhvZCBzaWduYXR1cmUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8WmlwRXh0cmFGaWVsZFtdPiBDVVJSRU5UX1pJUF9FWFRSQSA9IG5ldyBUaHJlYWRMb2NhbDxaaXBFeHRyYUZpZWxkW10+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8WmlwRXh0cmFGaWVsZFtdPiBDVVJSRU5UX1pJUF9FWFRSQSA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CiAKICAgICAvKioKICAgICAgKiBQcm92aWRlcyB0aGUgZXh0cmEgZmllbGRzIGZvciB0aGUgemlwIGVudHJ5IGN1cnJlbnRseSBiZWluZwpAQCAtMTgzNSwxOSArMTc3NSwxOSBAQAogCiAgICAgICAgIGlmIChlbnRyaWVzLmNvbnRhaW5zS2V5KHZQYXRoKSkgewogCi0gICAgICAgICAgICBpZiAoZHVwbGljYXRlLmVxdWFscygicHJlc2VydmUiKSkgeworICAgICAgICAgICAgaWYgKCJwcmVzZXJ2ZSIuZXF1YWxzKGR1cGxpY2F0ZSkpIHsKICAgICAgICAgICAgICAgICBsb2dXaGVuV3JpdGluZyh2UGF0aCArICIgYWxyZWFkeSBhZGRlZCwgc2tpcHBpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZHVwbGljYXRlLmVxdWFscygiZmFpbCIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEdXBsaWNhdGUgZmlsZSAiICsgdlBhdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdhcyBmb3VuZCBhbmQgdGhlIGR1cGxpY2F0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSBpcyAnZmFpbCcuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBlcXVhbCB0byBhZGQsIHNvIHdlIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgbG9nV2hlbldyaXRpbmcoImR1cGxpY2F0ZSBmaWxlICIgKyB2UGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3VuZCwgYWRkaW5nLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCJmYWlsIi5lcXVhbHMoZHVwbGljYXRlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBmaWxlICVzIHdhcyBmb3VuZCBhbmQgdGhlIGR1cGxpY2F0ZSBhdHRyaWJ1dGUgaXMgJ2ZhaWwnLiIsCisgICAgICAgICAgICAgICAgICAgIHZQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBlcXVhbCB0byBhZGQsIHNvIHdlIGNvbnRpbnVlCisgICAgICAgICAgICBsb2dXaGVuV3JpdGluZygiZHVwbGljYXRlIGZpbGUgIiArIHZQYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm91bmQsIGFkZGluZy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGxvZ1doZW5Xcml0aW5nKCJhZGRpbmcgZW50cnkgIiArIHZQYXRoLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgfQpAQCAtMTkwNCw3ICsxODQ0LDcgQEAKICAgICAgICAgICAgICAgICBjb3VudCA9IG1hcmthYmxlSW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gLTEpOwogICAgICAgICB9Ci0gICAgICAgIGFkZGVkRmlsZXMuYWRkRWxlbWVudCh2UGF0aCk7CisgICAgICAgIGFkZGVkRmlsZXMuYWRkKHZQYXRoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5NTcsMTQgKzE4OTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZpbmFsIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYkluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoZmluYWwgQnVmZmVyZWRJbnB1dFN0cmVhbSBiSW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShmaWxlLnRvUGF0aCgpKSkpIHsKICAgICAgICAgICAgIC8vIFpJUHMgc3RvcmUgdGltZSB3aXRoIGEgZ3JhbnVsYXJpdHkgb2YgMiBzZWNvbmRzLCByb3VuZCB1cAogICAgICAgICAgICAgemlwRmlsZShiSW4sIHpPdXQsIHZQYXRoLAogICAgICAgICAgICAgICAgICAgICBmaWxlLmxhc3RNb2RpZmllZCgpICsgKHJvdW5kVXAgPyBST1VORFVQX01JTExJUyA6IDApLAogICAgICAgICAgICAgICAgICAgICBudWxsLCBtb2RlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGJJbi5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTgzLDcgKzE5MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRpck1vZGUpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghZG9GaWxlc29ubHkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0YWNrPFN0cmluZz4gZGlyZWN0b3JpZXMgPSBuZXcgU3RhY2s8U3RyaW5nPigpOworICAgICAgICAgICAgZmluYWwgU3RhY2s8U3RyaW5nPiBkaXJlY3RvcmllcyA9IG5ldyBTdGFjazw+KCk7CiAgICAgICAgICAgICBpbnQgc2xhc2hQb3MgPSBlbnRyeS5sZW5ndGgoKTsKIAogICAgICAgICAgICAgd2hpbGUgKChzbGFzaFBvcyA9IGVudHJ5Lmxhc3RJbmRleE9mKCcvJywgc2xhc2hQb3MgLSAxKSkgIT0gLTEpIHsKQEAgLTE5OTYsNyArMTkzMyw3IEBACiAKICAgICAgICAgICAgIHdoaWxlICghZGlyZWN0b3JpZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRpciA9IGRpcmVjdG9yaWVzLnBvcCgpOwotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG51bGw7CisgICAgICAgICAgICAgICAgRmlsZSBmOwogICAgICAgICAgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBGaWxlKGJhc2VEaXIsIGRpcik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTIwMjMsMTYgKzE5NjAsMTIgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjbGVhblVwKCkgewogICAgICAgICBhZGRlZERpcnMuY2xlYXIoKTsKLSAgICAgICAgYWRkZWRGaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBhZGRlZEZpbGVzLmNsZWFyKCk7CiAgICAgICAgIGVudHJpZXMuY2xlYXIoKTsKICAgICAgICAgYWRkaW5nTmV3RmlsZXMgPSBmYWxzZTsKICAgICAgICAgZG9VcGRhdGUgPSBzYXZlZERvVXBkYXRlOwotICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxaaXBGaWxlU2V0PiBlID0gZmlsZXNldHNGcm9tR3JvdXBmaWxlc2V0cy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZmluYWwgWmlwRmlsZVNldCB6ZiA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHJlc291cmNlcy5yZW1vdmVFbGVtZW50KHpmKTsKLSAgICAgICAgfQotICAgICAgICBmaWxlc2V0c0Zyb21Hcm91cGZpbGVzZXRzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CisgICAgICAgIHJlc291cmNlcy5yZW1vdmVBbGwoZmlsZXNldHNGcm9tR3JvdXBmaWxlc2V0cyk7CisgICAgICAgIGZpbGVzZXRzRnJvbUdyb3VwZmlsZXNldHMuY2xlYXIoKTsKICAgICAgICAgSEFWRV9OT05fRklMRV9TRVRfUkVTT1VSQ0VTX1RPX0FERC5zZXQoQm9vbGVhbi5GQUxTRSk7CiAgICAgfQogCkBAIC0yMDQ1LDEwICsxOTc4LDEwIEBACiAgICAgICogQHNlZSAjY2xlYW5VcAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICByZXNvdXJjZXMucmVtb3ZlQWxsRWxlbWVudHMoKTsKKyAgICAgICAgcmVzb3VyY2VzLmNsZWFyKCk7CiAgICAgICAgIHppcEZpbGUgPSBudWxsOwogICAgICAgICBiYXNlRGlyID0gbnVsbDsKLSAgICAgICAgZ3JvdXBmaWxlc2V0cy5yZW1vdmVBbGxFbGVtZW50cygpOworICAgICAgICBncm91cGZpbGVzZXRzLmNsZWFyKCk7CiAgICAgICAgIGR1cGxpY2F0ZSA9ICJhZGQiOwogICAgICAgICBhcmNoaXZlVHlwZSA9ICJ6aXAiOwogICAgICAgICBkb0NvbXByZXNzID0gdHJ1ZTsKQEAgLTIwNjYsOCArMTk5OSw4IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUuMgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KGZpbmFsIFJlc291cmNlW11bXSByKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgci5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKHJbaV0ubGVuZ3RoID4gMCkgeworICAgICAgICBmb3IgKFJlc291cmNlW10gZWxlbWVudCA6IHIpIHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwODIsMTkgKzIwMTUsMTggQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVzb3VyY2VbXSBzZWxlY3RGaWxlUmVzb3VyY2VzKGZpbmFsIFJlc291cmNlW10gb3JpZykgewogICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzKG9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlU2VsZWN0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoZmluYWwgUmVzb3VyY2UgcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9GaWxlc29ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dXaGVuV3JpdGluZygiSWdub3JpbmcgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzIG9ubHkgZmlsZXMgd2lsbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYmUgYWRkZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb0ZpbGVzb25seSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nV2hlbldyaXRpbmcoIklnbm9yaW5nIGRpcmVjdG9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgb25seSBmaWxlcyB3aWxsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJlIGFkZGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0yMTA1LDEyICsyMDM3LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuOC4wCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFJlc291cmNlW10gc2VsZWN0RGlyZWN0b3J5UmVzb3VyY2VzKGZpbmFsIFJlc291cmNlW10gb3JpZykgewotICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzKG9yaWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlU2VsZWN0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoZmluYWwgUmVzb3VyY2UgcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuaXNEaXJlY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzKG9yaWcsIFJlc291cmNlOjppc0RpcmVjdG9yeSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTI1LDE4ICsyMDUyLDkgQEAKICAgICAgICAgaWYgKG9yaWcubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBvcmlnOwogICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlPiB2ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4ob3JpZy5sZW5ndGgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG9yaWcubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc1NlbGVjdGVkKG9yaWdbaV0pKSB7Ci0gICAgICAgICAgICAgICAgdi5hZGQob3JpZ1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodi5zaXplKCkgIT0gb3JpZy5sZW5ndGgpIHsKLSAgICAgICAgICAgIHJldHVybiB2LnRvQXJyYXkobmV3IFJlc291cmNlW3Yuc2l6ZSgpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG9yaWc7CisgICAgICAgIFJlc291cmNlW10gcmVzdWx0ID0gU3RyZWFtLm9mKG9yaWcpLmZpbHRlcihzZWxlY3Rvcjo6aXNTZWxlY3RlZCkKKyAgICAgICAgICAgIC50b0FycmF5KFJlc291cmNlW106Om5ldyk7CisgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09IG9yaWcubGVuZ3RoID8gb3JpZyA6IHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKQEAgLTIyMDcsMTEgKzIxMjUsOSBAQAogICAgICAgICAgICAgaWYgKHJlc291cmNlc1RvQWRkID09IG51bGwpICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IHJlc291cmNlc1RvQWRkLmxlbmd0aDsgY291bnRlcisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc1RvQWRkW2NvdW50ZXJdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc1RvQWRkW2NvdW50ZXJdLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChSZXNvdXJjZVtdIGVsZW1lbnQgOiByZXNvdXJjZXNUb0FkZCkgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIyMjUsNyArMjE0MSw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVW5pY29kZUV4dHJhRmllbGQgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgVW5pY29kZUV4dHJhRmllbGRQb2xpY3k+IFBPTElDSUVTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBVbmljb2RlRXh0cmFGaWVsZFBvbGljeT4oKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgVW5pY29kZUV4dHJhRmllbGRQb2xpY3k+IFBPTElDSUVTID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVWRVJfS0VZID0gIm5ldmVyIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMV0FZU19LRVkgPSAiYWx3YXlzIjsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5fRV9LRVkgPSAibm90LWVuY29kZWFibGUiOwpAQCAtMjI1OSw3ICsyMTc1LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGhlIGNob2ljZXMgZm9yIFppcDY0IGV4dGVuc2lvbnMuCiAgICAgICoKQEAgLTIyODEsMTMgKzIxOTYsMTMgQEAKICAgICAgKiBjZW50cmFsIGRpcmVjdG9yeSAtIHdoaWNoIGlzIHdoYXQgPGVtPmFzLW5lZWRlZDwvZW0+IG1heSByZXN1bHQKICAgICAgKiBpbi4gIEphdmE1IGFuZCBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbydzIEV4dGVuc2lvbiBsb2FkZXIgYXJlCiAgICAgICoga25vd24gdG8gZmNvbnNpZGVyIHRoZSBhcmNoaXZlIGJyb2tlbiBpbiBzdWNoIGNhc2VzLiAgSWYgeW91Ci0gICAgICogYXJlIHRhcmdldGluZyBzdWNoIGFuIGFyY2hpdmVyIHVzZXQgdGhlIHZhbHVlIDxlbT5uZXZlcjwvZW0+CisgICAgICogYXJlIHRhcmdldGluZyBzdWNoIGFuIGFyY2hpdmVyIHVzZSB0aGUgdmFsdWUgPGVtPm5ldmVyPC9lbT4KICAgICAgKiB1bmxlc3MgeW91IGtub3cgeW91IG5lZWQgWmlwNjQgZXh0ZW5zaW9ucy48L3A+CiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuOS4xCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBaaXA2NE1vZGVBdHRyaWJ1dGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgWmlwNjRNb2RlPiBNT0RFUyA9IG5ldyBIYXNoTWFwPFN0cmluZywgWmlwNjRNb2RlPigpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBaaXA2NE1vZGU+IE1PREVTID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBORVZFUl9LRVkgPSAibmV2ZXIiOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxXQVlTX0tFWSA9ICJhbHdheXMiOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdENvbXBpbGVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdENvbXBpbGVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAzYWMwLi4wMDAwMDAwCi0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRDb21waWxlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXB0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7Ci0KLQotLyoqCi0gKiA8cD5UaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGFwdCBjb21waWxlciBmb3IgSkRLIDEuNS48L3A+Ci0gKgotICogPHA+QXMgdXN1YWwsIHRoZSBsb3cgbGV2ZWwgZW50cnkgcG9pbnRzIGZvciBKYXZhIHRvb2xzIGFyZSBuZWl0aGVyIGRvY3VtZW50ZWQgb3IKLSAqIHN0YWJsZTsgdGhpcyBlbnRyeSBwb2ludCBtYXkgY2hhbmdlIGZyb20gdGhhdCBvZiAxLjUuMF8wMS1iMDggd2l0aG91dCBhbnkKLSAqIHdhcm5pbmcgYXQgYWxsLiBUaGUgSURFIGRlY29tcGlsZSBvZiB0aGUgdG9vbCBlbnRyeSBwb2ludHMgaXMgYXMgZm9sbG93czo8L3A+Ci0gKiA8cHJlPgotICogcHVibGljIGNsYXNzIE1haW4gewotICogcHVibGljIE1haW4oKSA7Ci0gKgotICogcHVibGljIHN0YXRpYyB0cmFuc2llbnQgdm9pZCBtYWluKFN0cmluZy4uLiBzdHJpbmdzKTsKLSAqCi0gKiBwdWJsaWMgc3RhdGljIHRyYW5zaWVudCBpbnQgcHJvY2VzcyhTdHJpbmcuLi4gc3RyaW5ncyk7Ci0gKgotICogcHVibGljIHN0YXRpYyB0cmFuc2llbnQgaW50IHByb2Nlc3MoUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIsCi0gKiAgICAgIFN0cmluZy4uLiBzdHJpbmdzKTsKLSAqIHB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGludCBwcm9jZXNzKAotICogICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSBhbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSwKLSAqICAgICAgU3RyaW5nLi4uIHN0cmluZ3MpOwotICoKLSAqIHB1YmxpYyBzdGF0aWMgdHJhbnNpZW50IGludCBwcm9jZXNzKAotICogICAgICBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSBhbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSwKLSAqICAgICAgUHJpbnRXcml0ZXIgcHJpbnRXcml0ZXIsCi0gKiAgICAgIFN0cmluZy4uLiBzdHJpbmdzKTsKLSAqIHByaXZhdGUgc3RhdGljIHRyYW5zaWVudCBpbnQgcHJvY2Vzc2luZygKLSAqICAgICAgQW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnkgYW5ub3RhdGlvblByb2Nlc3NvckZhY3RvcnksCi0gKiAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyLAotICogICAgICBTdHJpbmcuLi4gc3RyaW5ncykgOwotICogfQotICogPC9wcmU+Ci0gKgotICogVGhpcyBBZGFwdGVyIGlzIGRlc2lnbmVkIHRvIHJ1biBBcHQgaW4tSlZNLCBhbiBvcHRpb24gdGhhdCBpcyBub3QgYWN0dWFsbHkKLSAqIGV4cG9zZWQgdG8gZW5kLXVzZXJzLCBiZWNhdXNlIGl0IHdhcyB0b28gYnJpdHRsZSBkdXJpbmcgYmV0YSB0ZXN0aW5nOyBjbGFzc3BhdGgKLSAqIHByb2JsZW1zIGJlaW5nIHRoZSBjb3JlIGlzc3VlLgotICoKLSAqIEBzaW5jZSBBbnQgMS43Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHRDb21waWxlckFkYXB0ZXIgZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgcmV0dXJuZWQgYnkgdGhlIEFwdCBjb21waWxlciB0byBpbmRpY2F0ZSBzdWNjZXNzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBUFRfQ09NUElMRVJfU1VDQ0VTUyA9IDA7Ci0gICAgLyoqCi0gICAgICogY2xhc3MgaW4gdG9vbHMuamFyIHRoYXQgaW1wbGVtZW50cyBBUFQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFRfRU5UUllfUE9JTlQgPSAiY29tLnN1bi50b29scy5hcHQuTWFpbiI7Ci0KLSAgICAvKioKLSAgICAgKiBtZXRob2QgdXNlZCB0byBjb21waWxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQVF9NRVRIT0RfTkFNRSA9ICJwcm9jZXNzIjsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmFjYWRlIHRhc2sgdGhhdCBmcm9udHMgdGhpcyBhZGFwdGVyCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRhc2sgaW5zdGFuY2UKLSAgICAgKiBAc2VlIERlZmF1bHRDb21waWxlckFkYXB0ZXIjZ2V0SmF2YWMoKQotICAgICAqLwotICAgIHByb3RlY3RlZCBBcHQgZ2V0QXB0KCkgewotICAgICAgICByZXR1cm4gKEFwdCkgZ2V0SmF2YWMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2luZyB0aGUgZnJvbnQgZW5kIGFyZ3VtZW50cywgc2V0IHVwIHRoZSBjb21tYW5kIGxpbmUgdG8gcnVuIEFwdAotICAgICAqCi0gICAgICogQHBhcmFtIGFwdCB0YXNrCi0gICAgICogQHBhcmFtIGNtZCBjb21tYW5kIHRoYXQgaXMgc2V0IHVwIHdpdGggdGhlIHZhcmlvdXMgc3dpdGNoZXMgZnJvbSB0aGUgdGFzawotICAgICAqICAgICAgICAgICAgb3B0aW9ucwotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHNldEFwdENvbW1hbmRsaW5lU3dpdGNoZXMoZmluYWwgQXB0IGFwdCwgZmluYWwgQ29tbWFuZGxpbmUgY21kKSB7Ci0KLSAgICAgICAgaWYgKCFhcHQuaXNDb21waWxlKCkpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItbm9jb21waWxlIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcm9jZXNzIHRoZSBmYWN0b3J5IGNsYXNzCi0gICAgICAgIGZpbmFsIFN0cmluZyBmYWN0b3J5ID0gYXB0LmdldEZhY3RvcnkoKTsKLSAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1mYWN0b3J5Iik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShmYWN0b3J5KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIGZhY3RvcnkgcGF0aAotICAgICAgICBmaW5hbCBQYXRoIGZhY3RvcnlQYXRoID0gYXB0LmdldEZhY3RvcnlQYXRoKCk7Ci0gICAgICAgIGlmIChmYWN0b3J5UGF0aCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWZhY3RvcnlwYXRoIik7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKGZhY3RvcnlQYXRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZpbGUgcHJlcHJvY2Vzc0RpciA9IGFwdC5nZXRQcmVwcm9jZXNzRGlyKCk7Ci0gICAgICAgIGlmIChwcmVwcm9jZXNzRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItcyIpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShwcmVwcm9jZXNzRGlyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFByb2Nlc3MgdGhlIHByb2Nlc3NvciBvcHRpb25zCi0gICAgICAgIGZpbmFsIFZlY3RvciBvcHRpb25zID0gYXB0LmdldE9wdGlvbnMoKTsKLSAgICAgICAgZmluYWwgRW51bWVyYXRpb24gZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzKCk7Ci0gICAgICAgIEFwdC5PcHRpb24gb3B0OwotICAgICAgICBTdHJpbmdCdWZmZXIgYXJnID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKGVsZW1lbnRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBvcHQgPSAoQXB0Lk9wdGlvbikgZWxlbWVudHMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgIGFyZy5hcHBlbmQoIi1BIikuYXBwZW5kKG9wdC5nZXROYW1lKCkpOwotICAgICAgICAgICAgaWYgKG9wdC5nZXRWYWx1ZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmcuYXBwZW5kKCI9IikuYXBwZW5kKG9wdC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHVzaW5nIG91ciBmcm9udCBlbmQgdGFzaywgc2V0IHVwIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoZXMKLSAgICAgKgotICAgICAqIEBwYXJhbSBjbWQgY29tbWFuZCBsaW5lIHRvIHNldCB1cAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNldEFwdENvbW1hbmRsaW5lU3dpdGNoZXMoZmluYWwgQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIGZpbmFsIEFwdCBhcHQgPSBnZXRBcHQoKTsKLSAgICAgICAgc2V0QXB0Q29tbWFuZGxpbmVTd2l0Y2hlcyhhcHQsIGNtZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBjb21waWxhdGlvbi4KLSAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KLSAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBhcHQgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgLy9zZXQgdXAgdGhlIGphdmFjIG9wdGlvbnMKLSAgICAgICAgZmluYWwgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmQoKTsKLSAgICAgICAgLy90aGVuIGFkZCB0aGUgQXB0IG9wdGlvbnMKLSAgICAgICAgc2V0QXB0Q29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQpOwotCi0gICAgICAgIC8vZmluYWxseSBpbnZva2UgQVBUCi0gICAgICAgIC8vIFVzZSByZWZsZWN0aW9uIHRvIGJlIGFibGUgdG8gYnVpbGQgb24gYWxsIEpES3M6Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShBUFRfRU5UUllfUE9JTlQpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGNvbXBpbGVyID0gYy5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgZmluYWwgTWV0aG9kIGNvbXBpbGUgPSBjLmdldE1ldGhvZChBUFRfTUVUSE9EX05BTUUsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdeyhuZXcgU3RyaW5nW117fSkuZ2V0Q2xhc3MoKX0pOwotICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9ICgoSW50ZWdlcikgY29tcGlsZS5pbnZva2UKLSAgICAgICAgICAgICAgICAgICAgKGNvbXBpbGVyLCBuZXcgT2JqZWN0W117Y21kLmdldEFyZ3VtZW50cygpfSkpCi0gICAgICAgICAgICAgICAgICAgIC5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gQVBUX0NPTVBJTEVSX1NVQ0NFU1MpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9yZXRocm93IGJ1aWxkIGV4Y2VwdGlvbnMKLSAgICAgICAgICAgIHRocm93IGJlOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vY2FzdCBldmVyeXRoaW5nIGVsc2UgdG8gYSBidWlsZCBleGNlcHRpb24KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcgYXB0IGNvbXBpbGVyIiwKLSAgICAgICAgICAgICAgICAgICAgZXgsIGxvY2F0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9BcHRFeHRlcm5hbENvbXBpbGVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZGI1NWIuLjAwMDAwMDAKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0FwdEV4dGVybmFsQ29tcGlsZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BcHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7Ci0KLS8qKgotICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHQgY29tcGlsZXIgZm9yIEpESyAxLjUgdXNpbmcgYW4gZXh0ZXJuYWwgcHJvY2VzcwotICoKLSAqIEBzaW5jZSBBbnQgMS43Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcHRFeHRlcm5hbENvbXBpbGVyQWRhcHRlciBleHRlbmRzIERlZmF1bHRDb21waWxlckFkYXB0ZXIgewotCi0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZhY2FkZSB0YXNrIHRoYXQgZnJvbnRzIHRoaXMgYWRhcHRlcgotICAgICAqCi0gICAgICogQHJldHVybiB0YXNrIGluc3RhbmNlCi0gICAgICogQHNlZSBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyI2dldEphdmFjKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQXB0IGdldEFwdCgpIHsKLSAgICAgICAgcmV0dXJuIChBcHQpIGdldEphdmFjKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBKYXZhYyBleHRlcm5hbGx5LgotICAgICAqIEByZXR1cm4gdHJ1ZSAgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgZXh0ZXJuYWwgYXB0IGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLQotICAgICAgICAvLyBTZXR1cCB0aGUgYXB0IGV4ZWN1dGFibGUKLSAgICAgICAgQXB0IGFwdCA9IGdldEFwdCgpOwotICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoYXB0LmdldEFwdEV4ZWN1dGFibGUoKSk7Ci0gICAgICAgIHNldHVwTW9kZXJuSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKGNtZCk7Ci0gICAgICAgIEFwdENvbXBpbGVyQWRhcHRlci5zZXRBcHRDb21tYW5kbGluZVN3aXRjaGVzKGFwdCwgY21kKTsKLSAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpOwotICAgICAgICAvL2FkZCB0aGUgZmlsZXMKLSAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKLQotICAgICAgICAvL3J1bgotICAgICAgICByZXR1cm4gMCA9PSBleGVjdXRlRXh0ZXJuYWxDb21waWxlKGNtZC5nZXRDb21tYW5kbGluZSgpLAotICAgICAgICAgICAgICAgIGZpcnN0RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgdHJ1ZSk7Ci0KLSAgICB9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlci5qYXZhCmluZGV4IDVhMjc1YjguLjkzMTA3ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyRXh0ZW5zaW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyRXh0ZW5zaW9uLmphdmEKaW5kZXggMDM4YjljYi4uNjI1OTlhNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlckV4dGVuc2lvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXJFeHRlbnNpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IDQ4ZDkzYWQuLjZmMzBiM2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Db21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0NvbXBpbGVyQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTk2LDcwICs5Niw2MCBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbXBpbGVyQWRhcHRlciBnZXRDb21waWxlcihTdHJpbmcgY29tcGlsZXJUeXBlLCBUYXNrIHRhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBjbGFzc3BhdGgpCi0gICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImppa2VzIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEppa2VzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImV4dGphdmFjIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFjRXh0ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiY2xhc3NpYyIpCi0gICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMS4xIikKLSAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjIiKSkgewotICAgICAgICAgICAgICAgIHRhc2subG9nKCJUaGlzIHZlcnNpb24gb2YgamF2YSBkb2VzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibm90IHN1cHBvcnQgdGhlIGNsYXNzaWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJjb21waWxlcjsgdXBncmFkaW5nIHRvIG1vZGVybiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwotICAgICAgICAgICAgICAgIGNvbXBpbGVyVHlwZSA9ICJtb2Rlcm4iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9vbiBqYXZhPD0xLjMgdGhlIG1vZGVybiBmYWxscyBiYWNrIHRvIGNsYXNzaWMgaWYgaXQgaXMgbm90IGZvdW5kCi0gICAgICAgICAgICAvL2J1dCBvbiBqYXZhPj0xLjQgd2UganVzdCBiYWlsIG91dCBlYXJseQotICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJtb2Rlcm4iKQotICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuMyIpCi0gICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMS40IikKLSAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjUiKQotICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuNiIpCi0gICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMS43IikKLSAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgiamF2YWMxLjgiKQotICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhYzEuOSIpCi0gICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjOSIpCi0gICAgICAgICAgICAgICAgfHwgY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphdmFjMTArIikpIHsKLSAgICAgICAgICAgICAgICAvLyBkb2VzIHRoZSBtb2Rlcm4gY29tcGlsZXIgZXhpc3Q/Ci0gICAgICAgICAgICAgICAgaWYgKGRvZXNNb2Rlcm5Db21waWxlckV4aXN0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhYzEzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBhIGphdmFjICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbXBpbGVyO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNT0RFUk5fQ09NUElMRVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3Qgb24gdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNsYXNzcGF0aC5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlBlcmhhcHMgSkFWQV9IT01FIGRvZXMgbm90IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBvaW50IHRvIHRoZSBKREsuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiSXQgaXMgY3VycmVudGx5IHNldCB0byBcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEphdmFFbnZVdGlscy5nZXRKYXZhSG9tZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgianZjIikKLSAgICAgICAgICAgICAgICB8fCBjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgibWljcm9zb2Z0IikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEp2YygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJramMiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgS2pjKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImdjaiIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHY2ooKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb21waWxlclR5cGUuZXF1YWxzSWdub3JlQ2FzZSgic2oiKQotICAgICAgICAgICAgICAgIHx8IGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJzeW1hbnRlYyIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUoY29tcGlsZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5LUxlYWsgaW4gbGluZSBiZWxvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpKTsKKyAgICAgICAgUGF0aCBjbGFzc3BhdGgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgiamlrZXMiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKaWtlcygpOwogICAgICAgICB9CisgICAgICAgIGlmICgiZXh0amF2YWMiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhY0V4dGVybmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJjbGFzc2ljIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJqYXZhYzEuMSIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpCisgICAgICAgICAgICB8fCAiamF2YWMxLjIiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKSkgeworICAgICAgICAgICAgdGFzay5sb2coCisgICAgICAgICAgICAgICAgIlRoaXMgdmVyc2lvbiBvZiBqYXZhIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNsYXNzaWMgY29tcGlsZXI7IHVwZ3JhZGluZyB0byBtb2Rlcm4iLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgY29tcGlsZXJUeXBlID0gIm1vZGVybiI7CisgICAgICAgIH0KKyAgICAgICAgLy9vbiBqYXZhPD0xLjMgdGhlIG1vZGVybiBmYWxscyBiYWNrIHRvIGNsYXNzaWMgaWYgaXQgaXMgbm90IGZvdW5kCisgICAgICAgIC8vYnV0IG9uIGphdmE+PTEuNCB3ZSBqdXN0IGJhaWwgb3V0IGVhcmx5CisgICAgICAgIGlmICgibW9kZXJuIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJqYXZhYzEuMyIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpCisgICAgICAgICAgICB8fCAiamF2YWMxLjQiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKQorICAgICAgICAgICAgfHwgImphdmFjMS41Ii5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJqYXZhYzEuNiIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpCisgICAgICAgICAgICB8fCAiamF2YWMxLjciLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKQorICAgICAgICAgICAgfHwgImphdmFjMS44Ii5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJqYXZhYzEuOSIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpCisgICAgICAgICAgICB8fCAiamF2YWM5Ii5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJqYXZhYzEwKyIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpKSB7CisgICAgICAgICAgICAvLyBkb2VzIHRoZSBtb2Rlcm4gY29tcGlsZXIgZXhpc3Q/CisgICAgICAgICAgICBpZiAoZG9lc01vZGVybkNvbXBpbGVyRXhpc3QoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YWMxMygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBhIGphdmFjIGNvbXBpbGVyO1xuJXMgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGguXG5QZXJoYXBzIEpBVkFfSE9NRSBkb2VzIG5vdCBwb2ludCB0byB0aGUgSkRLLlxuSXQgaXMgY3VycmVudGx5IHNldCB0byBcIiVzXCIiLAorICAgICAgICAgICAgICAgIE1PREVSTl9DT01QSUxFUiwgSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJqdmMiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKQorICAgICAgICAgICAgfHwgIm1pY3Jvc29mdCIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEp2YygpOworICAgICAgICB9CisgICAgICAgIGlmICgia2pjIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgS2pjKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCJnY2oiLmVxdWFsc0lnbm9yZUNhc2UoY29tcGlsZXJUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBHY2ooKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoInNqIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyVHlwZSkKKyAgICAgICAgICAgIHx8ICJzeW1hbnRlYyIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNqKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc29sdmVDbGFzc05hbWUoY29tcGlsZXJUeXBlLAorICAgICAgICAgICAgLy8gTWVtb3J5LUxlYWsgaW4gbGluZSBiZWxvdworICAgICAgICAgICAgdGFzay5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogcXVlcnkgZm9yIHRoZSBNb2Rlcm4gY29tcGlsZXIgZXhpc3RpbmcKQEAgLTE5NSw3ICsxODUsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGVyQWRhcHRlciByZXNvbHZlQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKENvbXBpbGVyQWRhcHRlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAorICAgICAgICByZXR1cm4gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgIGxvYWRlciAhPSBudWxsID8gbG9hZGVyIDoKICAgICAgICAgICAgICAgICBDb21waWxlckFkYXB0ZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksCiAgICAgICAgICAgICAgICAgQ29tcGlsZXJBZGFwdGVyLmNsYXNzKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvRGVmYXVsdENvbXBpbGVyQWRhcHRlci5qYXZhCmluZGV4IGMwMjgzMDQuLjdiMzdhNTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0RlZmF1bHRDb21waWxlckFkYXB0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEzICsxOCwxMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbXBpbGVyczsKIAotLy9KYXZhNSBzdHlsZQotLy9pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHMuTElORV9TRVA7Ci0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CkBAIC02MSw2ICs2MSwxMiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKKyAgICAvL211c3Qga2VlcCBmb3Igc3ViY2xhc3MgQkMsIHRob3VnaCB1bnVzZWQ6CisgICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPRkYgLSBiYworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgbFNlcCA9IFN0cmluZ1V0aWxzLkxJTkVfU0VQOworICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT04KKwogICAgIHByb3RlY3RlZCBQYXRoIHNyYzsKICAgICBwcm90ZWN0ZWQgRmlsZSBkZXN0RGlyOwogICAgIHByb3RlY3RlZCBTdHJpbmcgZW5jb2Rpbmc7CkBAIC04OCwxMSArOTQsNiBAQAogICAgIHByb3RlY3RlZCBGaWxlW10gY29tcGlsZUxpc3Q7CiAgICAgcHJvdGVjdGVkIEphdmFjIGF0dHJpYnV0ZXM7CiAKLSAgICAvL211c3Qga2VlcCBmb3Igc3ViY2xhc3MgQkMsIHRob3VnaCB1bnVzZWQ6Ci0gICAgLy8gQ2hlY2tTdHlsZTpDb25zdGFudE5hbWVDaGVjayBPRkYgLSBiYwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGxTZXAgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKLQotICAgIC8vIENoZWNrU3R5bGU6Q29uc3RhbnROYW1lQ2hlY2sgT04KICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgogCiAgICAgLyoqCkBAIC0xMDEsNiArMTAyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGEgY29uZmlndXJlZCBKYXZhYyB0YXNrLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEphdmFjKGZpbmFsIEphdmFjIGF0dHJpYnV0ZXMpIHsKICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICAgICAgc3JjID0gYXR0cmlidXRlcy5nZXRTcmNkaXIoKTsKQEAgLTE0Nyw2ICsxNDksNyBAQAogICAgICAqIGJ1dCBzcGVjaWFsaXplZCBjb21waWxlcnMgY2FuIHJlY29nbml6ZSBtdWx0aXBsZSBraW5kcwogICAgICAqIG9mIGZpbGVzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRGaWxlRXh0ZW5zaW9ucygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImphdmEifTsKICAgICB9CkBAIC0yNTQsMTkgKzI1NywyMCBAQAogICAgICAgICBmaW5hbCBQYXRoIGNsYXNzcGF0aCA9IGdldENvbXBpbGVDbGFzc3BhdGgoKTsKICAgICAgICAgLy8gRm9yIC1zb3VyY2VwYXRoLCB1c2UgdGhlICJzb3VyY2VwYXRoIiB2YWx1ZSBpZiBwcmVzZW50LgogICAgICAgICAvLyBPdGhlcndpc2UgZGVmYXVsdCB0byB0aGUgInNyY2RpciIgdmFsdWUuCi0gICAgICAgIFBhdGggc291cmNlcGF0aCA9IG51bGw7CisgICAgICAgIFBhdGggc291cmNlcGF0aDsKICAgICAgICAgaWYgKGNvbXBpbGVTb3VyY2VwYXRoICE9IG51bGwpIHsKICAgICAgICAgICAgIHNvdXJjZXBhdGggPSBjb21waWxlU291cmNlcGF0aDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNvdXJjZXBhdGggPSBzcmM7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBTdHJpbmcgbWVtb3J5UGFyYW1ldGVyUHJlZml4ID0gYXNzdW1lSmF2YTExKCkgPyAiLUotIiA6ICItSi1YIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lbW9yeVBhcmFtZXRlclByZWZpeCA9IGFzc3VtZUphdmExXzJQbHVzKCkgPyAiLUotWCIgOiAiLUotIjsKKwogICAgICAgICBpZiAobWVtb3J5SW5pdGlhbFNpemUgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzLmlzRm9ya2VkSmF2YWMoKSkgewotICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJTaW5jZSBmb3JrIGlzIGZhbHNlLCBpZ25vcmluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWVtb3J5SW5pdGlhbFNpemUgc2V0dGluZy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKAorICAgICAgICAgICAgICAgICAgICAiU2luY2UgZm9yayBpcyBmYWxzZSwgaWdub3JpbmcgbWVtb3J5SW5pdGlhbFNpemUgc2V0dGluZy4iLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUobWVtb3J5UGFyYW1ldGVyUHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXMiICsgbWVtb3J5SW5pdGlhbFNpemUpOwpAQCAtMjc1LDkgKzI3OSw5IEBACiAKICAgICAgICAgaWYgKG1lbW9yeU1heGltdW1TaXplICE9IG51bGwpIHsKICAgICAgICAgICAgIGlmICghYXR0cmlidXRlcy5pc0ZvcmtlZEphdmFjKCkpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiU2luY2UgZm9yayBpcyBmYWxzZSwgaWdub3JpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1lbW9yeU1heGltdW1TaXplIHNldHRpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygKKyAgICAgICAgICAgICAgICAgICAgIlNpbmNlIGZvcmsgaXMgZmFsc2UsIGlnbm9yaW5nIG1lbW9yeU1heGltdW1TaXplIHNldHRpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKG1lbW9yeVBhcmFtZXRlclByZWZpeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm14IiArIG1lbW9yeU1heGltdW1TaXplKTsKQEAgLTMwMSwxMyArMzA1LDkgQEAKIAogICAgICAgICAvLyBKdXN0IGFkZCAic291cmNlcGF0aCIgdG8gY2xhc3NwYXRoIChmb3IgSkRLMS4xKQogICAgICAgICAvLyBhcyB3ZWxsIGFzICJib290Y2xhc3NwYXRoIiBhbmQgImV4dGRpcnMiCi0gICAgICAgIGlmIChhc3N1bWVKYXZhMTEoKSkgeworICAgICAgICBpZiAoIWFzc3VtZUphdmExXzJQbHVzKCkpIHsKICAgICAgICAgICAgIGZpbmFsIFBhdGggY3AgPSBuZXcgUGF0aChwcm9qZWN0KTsKLQotICAgICAgICAgICAgZmluYWwgUGF0aCBicCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKLSAgICAgICAgICAgIGlmIChicC5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY3AuYXBwZW5kKGJwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Qm9vdENsYXNzUGF0aCgpKS5pZlByZXNlbnQoY3A6OmFwcGVuZCk7CiAKICAgICAgICAgICAgIGlmIChleHRkaXJzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjcC5hZGRFeHRkaXJzKGV4dGRpcnMpOwpAQCAtMzMwLDEzICszMzAsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIGJwID0gZ2V0Qm9vdENsYXNzUGF0aCgpOwotICAgICAgICAgICAgICAgIGlmIChicC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFicC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1ib290Y2xhc3NwYXRoIik7CiAgICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoYnApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGV4dGRpcnMgIT0gbnVsbCAmJiBleHRkaXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChleHRkaXJzICE9IG51bGwgJiYgIWV4dGRpcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1leHRkaXJzIik7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChleHRkaXJzKTsKICAgICAgICAgICAgIH0KQEAgLTM0Nyw3ICszNDcsNyBAQAogICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZW5jb2RpbmcpOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZWJ1ZykgewotICAgICAgICAgICAgaWYgKHVzZURlYnVnTGV2ZWwgJiYgIWFzc3VtZUphdmExMSgpKSB7CisgICAgICAgICAgICBpZiAodXNlRGVidWdMZXZlbCAmJiBhc3N1bWVKYXZhMV8yUGx1cygpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlYnVnTGV2ZWwgPSBhdHRyaWJ1dGVzLmdldERlYnVnTGV2ZWwoKTsKICAgICAgICAgICAgICAgICBpZiAoZGVidWdMZXZlbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItZzoiICsgZGVidWdMZXZlbCk7CkBAIC0zNjUsMTMgKzM2NSwxNCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlcGVuZCkgewotICAgICAgICAgICAgaWYgKGFzc3VtZUphdmExMSgpKSB7CisgICAgICAgIAlpZiAoYXNzdW1lSmF2YTFfM1BsdXMoKSkgeworICAgICAgICAJCWF0dHJpYnV0ZXMubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgImRlcGVuZCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbW9kZXJuIGNvbXBpbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAJfSBlbHNlIGlmIChhc3N1bWVKYXZhMV8yUGx1cygpKSB7CisgICAgICAgIAkJY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1YZGVwZW5kIik7CisgICAgICAgIAl9IGVsc2UgeyAvL2phdmEgMS4xCiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1kZXBlbmQiKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNzdW1lSmF2YTEyKCkpIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLVhkZXBlbmQiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coImRlcGVuZCBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vZGVybiBjb21waWxlciIsIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM5MiwxMyArMzkzLDEzIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIHNldHVwTW9kZXJuSmF2YWNDb21tYW5kbGluZVN3aXRjaGVzKGZpbmFsIENvbW1hbmRsaW5lIGNtZCkgewogICAgICAgICBzZXR1cEphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQsIHRydWUpOwotICAgICAgICBpZiAoIWFzc3VtZUphdmExMygpKSB7IC8vIC1zb3VyY2UgYWRkZWQgd2l0aCBKREsgMS40CisgICAgICAgIGlmIChhc3N1bWVKYXZhMV80UGx1cygpKSB7IC8vIC1zb3VyY2UgYWRkZWQgd2l0aCBKREsgMS40CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdCA9IGF0dHJpYnV0ZXMuZ2V0VGFyZ2V0KCk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IGF0dHJpYnV0ZXMuZ2V0U291cmNlKCk7CiAgICAgICAgICAgICBpZiAocmVsZWFzZSA9PSBudWxsIHx8ICFhc3N1bWVKYXZhOVBsdXMoKSkgewogICAgICAgICAgICAgICAgIGlmIChyZWxlYXNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIlN1cHBvcnQgZm9yIGphdmFjIC0tcmVsZWFzZSBoYXMgYmVlbiBhZGRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGluIEphdmE5IGlnbm9yaW5nIGl0Iik7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnQgZm9yIGphdmFjIC0tcmVsZWFzZSBoYXMgYmVlbiBhZGRlZCBpbiBKYXZhOSBpZ25vcmluZyBpdCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItc291cmNlIik7CkBAIC00MDksMzQgKzQxMCwzMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEphdmEgOSsgYW5kIHJlbGVhc2UgaGFzIGJlZW4gc2V0CiAgICAgICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCB8fCBzICE9IG51bGwgfHwgZ2V0Qm9vdENsYXNzUGF0aCgpLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coIklnbm9yaW5nIHNvdXJjZSwgdGFyZ2V0IGFuZCBib290Y2xhc3NwYXRoIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgcmVsZWFzZSBoYXMgYmVlbiBzZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3Jpbmcgc291cmNlLCB0YXJnZXQgYW5kIGJvb3RjbGFzc3BhdGggYXMgcmVsZWFzZSBoYXMgYmVlbiBzZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItLXJlbGVhc2UiKTsKICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShyZWxlYXNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBmaW5hbCBQYXRoIG1zcCA9IGdldE1vZHVsZXNvdXJjZXBhdGgoKTsKLSAgICAgICAgaWYgKG1zcC5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghbXNwLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0tbW9kdWxlLXNvdXJjZS1wYXRoIik7CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKG1zcCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgUGF0aCBtcCA9IGdldE1vZHVsZXBhdGgoKTsKLSAgICAgICAgaWYgKG1wLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKCFtcC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItLW1vZHVsZS1wYXRoIik7CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRQYXRoKG1wKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBQYXRoIHVtcCA9IGdldFVwZ3JhZGVtb2R1bGVwYXRoKCk7Ci0gICAgICAgIGlmICh1bXAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXVtcC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItLXVwZ3JhZGUtbW9kdWxlLXBhdGgiKTsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgodW1wKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXROYXRpdmVIZWFkZXJEaXIoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXNzdW1lSmF2YTEzKCkgfHwgYXNzdW1lSmF2YTE0KCkgfHwgYXNzdW1lSmF2YTE1KCkgfHwgYXNzdW1lSmF2YTE2KCkKLSAgICAgICAgICAgICAgICAgICAgfHwgYXNzdW1lSmF2YTE3KCkpIHsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiU3VwcG9ydCBmb3IgamF2YWMgLWggaGFzIGJlZW4gYWRkZWQgaW4gSmF2YTgsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpZ25vcmluZyBpdCIpOworICAgICAgICAgICAgaWYgKCFhc3N1bWVKYXZhMV84UGx1cygpKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5sb2coCisgICAgICAgICAgICAgICAgICAgICJTdXBwb3J0IGZvciBqYXZhYyAtaCBoYXMgYmVlbiBhZGRlZCBpbiBKYXZhOCwgaWdub3JpbmcgaXQiKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1oIik7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0RmlsZShhdHRyaWJ1dGVzLmdldE5hdGl2ZUhlYWRlckRpcigpKTsKQEAgLTQ4NywyMyArNDg3LDEzIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoZmluYWwgQ29tbWFuZGxpbmUgY21kKSB7CiAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJDb21waWxhdGlvbiAiICsgY21kLmRlc2NyaWJlQXJndW1lbnRzKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBuaWNlU291cmNlTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoIkZpbGUiKTsKLSAgICAgICAgaWYgKGNvbXBpbGVMaXN0Lmxlbmd0aCAhPSAxKSB7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoInMiKTsKLSAgICAgICAgfQotICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiB0byBiZSBjb21waWxlZDoiKTsKKyAgICAgICAgYXR0cmlidXRlcy5sb2coU3RyaW5nLmZvcm1hdCgiJXMgdG8gYmUgY29tcGlsZWQ6IiwKKyAgICAgICAgICAgICAgICBjb21waWxlTGlzdC5sZW5ndGggPT0gMSA/ICJGaWxlIiA6ICJGaWxlcyIpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAotICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcGlsZUxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcmcgPSBjb21waWxlTGlzdFtpXS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChhcmcpOwotICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF0dHJpYnV0ZXMubG9nKG5pY2VTb3VyY2VMaXN0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBhdHRyaWJ1dGVzLmxvZyhTdHJlYW0ub2YoY29tcGlsZUxpc3QpLm1hcChGaWxlOjpnZXRBYnNvbHV0ZVBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAucGVlayhhcmcgLT4gY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYXJnIC0+IFN0cmluZy5mb3JtYXQoIiAgICAlcyVuIiwgYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiIikpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU1MywyOSArNTQzLDMwIEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChDb21tYW5kbGluZS50b1N0cmluZyhhcmdzKS5sZW5ndGgoKSA+IENPTU1BTkRfTElORV9MSU1JVAogICAgICAgICAgICAgICAgICYmIGZpcnN0RmlsZU5hbWUgPj0gMCkgewotICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgdG1wRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCksICJmaWxlcyIsICIiLCBnZXRKYXZhYygpLmdldFRlbXBkaXIoKSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcih0bXBGaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBmaXJzdEZpbGVOYW1lOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RlRmlsZXMgJiYgYXJnc1tpXS5jb250YWlucygiICIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3NbaV0ucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIgKyBhcmdzW2ldICsgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBvdXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHRtcEZpbGUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZpcnN0RmlsZU5hbWU7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1b3RlRmlsZXMgJiYgYXJnc1tpXS5jb250YWlucygiICIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1tpXS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCJcIiIgKyBhcmdzW2ldICsgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGFyZ3NbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQubmV3TGluZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZEFycmF5ID0gbmV3IFN0cmluZ1tmaXJzdEZpbGVOYW1lICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGNvbW1hbmRBcnJheSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEZpbGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheVtmaXJzdEZpbGVOYW1lXSA9ICJAIiArIHRtcEZpbGU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheSA9IG5ldyBTdHJpbmdbZmlyc3RGaWxlTmFtZSArIDFdOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIGNvbW1hbmRBcnJheSwgMCwgZmlyc3RGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheVtmaXJzdEZpbGVOYW1lXSA9ICJAIiArIHRtcEZpbGU7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHRlbXBvcmFyeSBmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUsIGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvbW1hbmRBcnJheSA9IGFyZ3M7CkBAIC02MzAsMTE5ICs2MjEsMjE5IEBACiAgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjEgY29tbWFuZCBsaW5lIHN3aXRjaGVzPwogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS4xCiAgICAgICogQHNpbmNlIEFudCAxLjUKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBBbnQgMS4xMC43LCB1c2UgYXNzdW1lSmF2YTFfMVBsdXMsIGlmIG5lY2Vzc2FyeSBjb21iaW5lZCB3aXRoICFhc3N1bWVKYXZhMV8yUGx1cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTExKCkgewotICAgICAgICByZXR1cm4gImphdmFjMS4xIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSk7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhMV8xUGx1cygpICYmICFhc3N1bWVKYXZhMV8yUGx1cygpOwogICAgIH0KLQorICAgIAorICAgIC8qKgorICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS4xKyBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjEgYW5kIGFib3ZlCisgICAgICogQHNpbmNlIEFudCAxLjEwLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMV8xUGx1cygpIHsKKyAgICAgICAgcmV0dXJuICJqYXZhYzEuMSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpIHx8IGFzc3VtZUphdmExXzJQbHVzKCkgOworICAgIH0KKyAgICAKICAgICAvKioKICAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuMiBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CiAgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjIKICAgICAgKiBAc2luY2UgQW50IDEuNQorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEwLjcsIHVzZSBhc3N1bWVKYXZhMV8yUGx1cywgaWYgbmVjZXNzYXJ5IGNvbWJpbmVkIHdpdGggIWFzc3VtZUphdmExXzNQbHVzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTIoKSB7Ci0gICAgICAgIHJldHVybiAiamF2YWMxLjIiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKTsKKyAgICAJcmV0dXJuIGFzc3VtZUphdmExXzJQbHVzKCkgJiYgIWFzc3VtZUphdmExXzNQbHVzKCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjIrIGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgamRrIDEuMiBhbmQgYWJvdmUKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmExXzJQbHVzKCkgeworICAgICAgICByZXR1cm4gImphdmFjMS4yIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkgfHwgYXNzdW1lSmF2YTFfM1BsdXMoKSA7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS4zIGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgamRrIDEuMwogICAgICAqIEBzaW5jZSBBbnQgMS41CisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuMTAuNywgdXNlIGFzc3VtZUphdmExXzNQbHVzLCBpZiBuZWNlc3NhcnkgY29tYmluZWQgd2l0aCAhYXNzdW1lSmF2YTFfNFBsdXMKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmExMygpIHsKLSAgICAgICAgcmV0dXJuICJqYXZhYzEuMyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpOworICAgIAlyZXR1cm4gYXNzdW1lSmF2YTFfM1BsdXMoKSAmJiAhYXNzdW1lSmF2YTFfNFBsdXMoKTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuMysgY29tbWFuZCBsaW5lIHN3aXRjaGVzPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS4zIGFuZCBhYm92ZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTFfM1BsdXMoKSB7CisgICAgICAgIHJldHVybiAiamF2YWMxLjMiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKSB8fCBhc3N1bWVKYXZhMV80UGx1cygpIDsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjQgY29tbWFuZCBsaW5lIHN3aXRjaGVzPwogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS40CiAgICAgICogQHNpbmNlIEFudCAxLjYuMworICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEwLjcsIHVzZSBhc3N1bWVKYXZhMV80UGx1cywgaWYgbmVjZXNzYXJ5IGNvbWJpbmVkIHdpdGggIWFzc3VtZUphdmExXzVQbHVzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTQoKSB7Ci0gICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS40IiwgSmF2YUVudlV0aWxzLkpBVkFfMV80KTsKKyAgICAJcmV0dXJuIGFzc3VtZUphdmExXzRQbHVzKCkgJiYgIWFzc3VtZUphdmExXzVQbHVzKCk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS40KyBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjQgYW5kIGFib3ZlCisgICAgICogQHNpbmNlIEFudCAxLjEwLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMV80UGx1cygpIHsKKyAgICAgICAgcmV0dXJuIGFzc3VtZUphdmFYWSgiamF2YWMxLjQiLCBKYXZhRW52VXRpbHMuSkFWQV8xXzQpIHx8IGFzc3VtZUphdmExXzVQbHVzKCkgOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS41IGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgSkRLIDEuNQogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBBbnQgMS4xMC43LCB1c2UgYXNzdW1lSmF2YTFfNVBsdXMsIGlmIG5lY2Vzc2FyeSBjb21iaW5lZCB3aXRoICFhc3N1bWVKYXZhMV82UGx1cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTE1KCkgewotICAgICAgICByZXR1cm4gYXNzdW1lSmF2YVhZKCJqYXZhYzEuNSIsIEphdmFFbnZVdGlscy5KQVZBXzFfNSk7CisgICAgCXJldHVybiBhc3N1bWVKYXZhMV81UGx1cygpICYmICFhc3N1bWVKYXZhMV82UGx1cygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuNSsgY29tbWFuZCBsaW5lIHN3aXRjaGVzPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS41IGFuZCBhYm92ZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTFfNVBsdXMoKSB7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS41IiwgSmF2YUVudlV0aWxzLkpBVkFfMV81KSB8fCBhc3N1bWVKYXZhMV82UGx1cygpIDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuNiBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CiAgICAgICogQHJldHVybiB0cnVlIGlmIEpESyAxLjYKICAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEwLjcsIHVzZSBhc3N1bWVKYXZhMV82UGx1cywgaWYgbmVjZXNzYXJ5IGNvbWJpbmVkIHdpdGggIWFzc3VtZUphdmExXzdQbHVzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTYoKSB7Ci0gICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS42IiwgSmF2YUVudlV0aWxzLkpBVkFfMV82KTsKKyAgICAJcmV0dXJuIGFzc3VtZUphdmExXzZQbHVzKCkgJiYgIWFzc3VtZUphdmExXzdQbHVzKCk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyAxLjYrIGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgamRrIDEuNiBhbmQgYWJvdmUKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmExXzZQbHVzKCkgeworICAgICAgICByZXR1cm4gYXNzdW1lSmF2YVhZKCJqYXZhYzEuNiIsIEphdmFFbnZVdGlscy5KQVZBXzFfNikgfHwgYXNzdW1lSmF2YTFfN1BsdXMoKSA7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS43IGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgSkRLIDEuNwogICAgICAqIEBzaW5jZSBBbnQgMS44LjIKKyAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSBBbnQgMS4xMC43LCB1c2UgYXNzdW1lSmF2YTFfN1BsdXMsIGlmIG5lY2Vzc2FyeSBjb21iaW5lZCB3aXRoICFhc3N1bWVKYXZhMV84UGx1cwogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTE3KCkgewotICAgICAgICByZXR1cm4gYXNzdW1lSmF2YVhZKCJqYXZhYzEuNyIsIEphdmFFbnZVdGlscy5KQVZBXzFfNyk7CisgICAgCXJldHVybiBhc3N1bWVKYXZhMV83UGx1cygpICYmICFhc3N1bWVKYXZhMV84UGx1cygpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuNysgY29tbWFuZCBsaW5lIHN3aXRjaGVzPworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBqZGsgMS43IGFuZCBhYm92ZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTFfN1BsdXMoKSB7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS43IiwgSmF2YUVudlV0aWxzLkpBVkFfMV83KSB8fCBhc3N1bWVKYXZhMV84UGx1cygpIDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTaGFsbCB3ZSBhc3N1bWUgSkRLIDEuOCBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CiAgICAgICogQHJldHVybiB0cnVlIGlmIEpESyAxLjgKICAgICAgKiBAc2luY2UgQW50IDEuOC4zCisgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgQW50IDEuMTAuNywgdXNlIGFzc3VtZUphdmExXzhQbHVzLCBpZiBuZWNlc3NhcnkgY29tYmluZWQgd2l0aCAhYXNzdW1lSmF2YTlQbHVzCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTgoKSB7Ci0gICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS44IiwgSmF2YUVudlV0aWxzLkpBVkFfMV84KTsKKyAgICAJcmV0dXJuIGFzc3VtZUphdmExXzhQbHVzKCkgJiYgIWFzc3VtZUphdmE5UGx1cygpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMS44KyBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CisgICAgICogQHJldHVybiB0cnVlIGlmIGpkayAxLjggYW5kIGFib3ZlCisgICAgICogQHNpbmNlIEFudCAxLjEwLjcKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMV84UGx1cygpIHsKKyAgICAgICAgcmV0dXJuIGFzc3VtZUphdmFYWSgiamF2YWMxLjgiLCBKYXZhRW52VXRpbHMuSkFWQV8xXzgpIHx8IGFzc3VtZUphdmE5UGx1cygpIDsKKyAgICB9CisgICAgCisgICAgLyoqCiAgICAgICogU2hhbGwgd2UgYXNzdW1lIEpESyA5IGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgSkRLIDkKICAgICAgKiBAc2luY2UgQW50IDEuOS40CiAgICAgICogQGRlcHJlY2F0ZWQgdXNlICNhc3N1bWVKYXZhOSBpbnN0ZWFkCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhc3N1bWVKYXZhMTkoKSB7Ci0gICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS45IiwgSmF2YUVudlV0aWxzLkpBVkFfOSkKLSAgICAgICAgICAgIHx8IGFzc3VtZUphdmFYWSgiamF2YWM5IiwgSmF2YUVudlV0aWxzLkpBVkFfOSk7CisgICAgCXJldHVybiBhc3N1bWVKYXZhOSgpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgOSBjb21tYW5kIGxpbmUgc3dpdGNoZXM/CiAgICAgICogQHJldHVybiB0cnVlIGlmIEpESyA5CiAgICAgICogQHNpbmNlIEFudCAxLjkuOAorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEwLjcsIHVzZSBhc3N1bWVKYXZhOVBsdXMsIGluIHRoZSBmdXR1cmUgaWYgbmVjZXNzYXJ5IGNvbWJpbmVkIHdpdGggIWFzc3VtZUphdmExMFBsdXMKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHByb3RlY3RlZCBib29sZWFuIGFzc3VtZUphdmE5KCkgewotICAgICAgICByZXR1cm4gYXNzdW1lSmF2YTE5KCk7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhOVBsdXMoKSAmJiAhYXNzdW1lSmF2YTEwUGx1cygpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgOSsgY29tbWFuZCBsaW5lIHN3aXRjaGVzPwogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBKREsgOSsKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTlQbHVzKCkgewotICAgICAgICByZXR1cm4gImphdmFjMS45Ii5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKLSAgICAgICAgICAgIHx8ICJqYXZhYzkiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQotICAgICAgICAgICAgfHwgImphdmFjMTArIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKLSAgICAgICAgICAgIHx8IChKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkKLSAgICAgICAgICAgICAgICAmJiAoImNsYXNzaWMiLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQotICAgICAgICAgICAgICAgIHx8ICJtb2Rlcm4iLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQotICAgICAgICAgICAgICAgIHx8ICJleHRKYXZhYyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpKSk7CisgICAgICAgIHJldHVybiBhc3N1bWVKYXZhWFkoImphdmFjMS45IiwgSmF2YUVudlV0aWxzLkpBVkFfOSkKKyAgICAgICAgICAgICAgICB8fCBhc3N1bWVKYXZhWFkoImphdmFjOSIsIEphdmFFbnZVdGlscy5KQVZBXzkpCisgICAgICAgICAgICAgICAgfHwgYXNzdW1lSmF2YTEwUGx1cygpOwogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNoYWxsIHdlIGFzc3VtZSBKREsgMTArIGNvbW1hbmQgbGluZSBzd2l0Y2hlcz8KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgSkRLIDEwKworICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXNzdW1lSmF2YTEwUGx1cygpIHsKKyAgICAgICAgcmV0dXJuICJqYXZhYzEwKyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgfHwgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCJjbGFzc2ljIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgIm1vZGVybiIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICJleHRKYXZhYyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpKSk7CisgICAgfQorICAgIAorICAgIC8qKgogICAgICAqIFNoYWxsIHdlIGFzc3VtZSBjb21tYW5kIGxpbmUgc3dpdGNoZXMgZm9yIHRoZSBnaXZlbiB2ZXJzaW9uIG9mIEphdmE/CiAgICAgICogQHNpbmNlIEFudCAxLjguMwogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBhc3N1bWVKYXZhWFkoZmluYWwgU3RyaW5nIGphdmFjWFksIGZpbmFsIFN0cmluZyBqYXZhRW52VmVyc2lvblhZKSB7Ci0gICAgICAgIHJldHVybiBqYXZhY1hZLmVxdWFscyhhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpKQotICAgICAgICAgICAgfHwgKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKGphdmFFbnZWZXJzaW9uWFkpCi0gICAgICAgICAgICAgICAgJiYgKCJjbGFzc2ljIi5lcXVhbHMoYXR0cmlidXRlcy5nZXRDb21waWxlclZlcnNpb24oKSkKLSAgICAgICAgICAgICAgICAgfHwgIm1vZGVybiIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpCi0gICAgICAgICAgICAgICAgIHx8ICJleHRKYXZhYyIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZXJWZXJzaW9uKCkpKSk7CisgICAgICAgIFN0cmluZyBjb21waWxlclZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldENvbXBpbGVyVmVyc2lvbigpOworICAgICAgICByZXR1cm4gamF2YWNYWS5lcXVhbHMoY29tcGlsZXJWZXJzaW9uKSB8fAorICAgICAgICAgICAgICAgIChKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihqYXZhRW52VmVyc2lvblhZKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCJjbGFzc2ljIi5lcXVhbHMoY29tcGlsZXJWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIm1vZGVybiIuZXF1YWxzKGNvbXBpbGVyVmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICJleHRKYXZhYyIuZXF1YWxzKGNvbXBpbGVyVmVyc2lvbikpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc3MSw3ICs4NjIsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vRGVidWdBcmd1bWVudCgpIHsKLSAgICAgICAgcmV0dXJuIGFzc3VtZUphdmExMSgpID8gbnVsbCA6ICItZzpub25lIjsKKyAgICAJcmV0dXJuIGFzc3VtZUphdmExXzJQbHVzKCkgPyAiLWc6bm9uZSIgOiBudWxsOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRJbXBsaWNpdFNvdXJjZVN3aXRjaChmaW5hbCBDb21tYW5kbGluZSBjbWQsCkBAIC03OTcsMTggKzg4OCwxOCBAQAogICAgICAqIHNlbGVjdGVkIEpESydzIGphdmFjLgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRTb3VyY2UoKSB7Ci0gICAgICAgIGlmIChhc3N1bWVKYXZhMTUoKSB8fCBhc3N1bWVKYXZhMTYoKSkgewotICAgICAgICAgICAgcmV0dXJuICIxLjUgaW4gSkRLIDEuNSBhbmQgMS42IjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXNzdW1lSmF2YTE3KCkpIHsKLSAgICAgICAgICAgIHJldHVybiAiMS43IGluIEpESyAxLjciOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhc3N1bWVKYXZhMTgoKSkgewotICAgICAgICAgICAgcmV0dXJuICIxLjggaW4gSkRLIDEuOCI7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKGFzc3VtZUphdmE5UGx1cygpKSB7CiAgICAgICAgICAgICByZXR1cm4gIjkgaW4gSkRLIDkiOwogICAgICAgICB9CisgICAgICAgIGlmIChhc3N1bWVKYXZhMV84UGx1cygpKSB7CisgICAgICAgICAgICByZXR1cm4gIjEuOCBpbiBKREsgMS44IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXNzdW1lSmF2YTFfN1BsdXMoKSkgeworICAgICAgICAgICAgcmV0dXJuICIxLjcgaW4gSkRLIDEuNyI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFzc3VtZUphdmExXzVQbHVzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiMS41IGluIEpESyAxLjUgYW5kIDEuNiI7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIApAQCAtODIyLDI5ICs5MTMsMjcgQEAKICAgICAgKiBAcGFyYW0gdCB0aGUgLXRhcmdldCB2YWx1ZSwgbXVzdCBub3QgYmUgbnVsbAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBtdXN0U2V0U291cmNlRm9yVGFyZ2V0KFN0cmluZyB0KSB7Ci0gICAgICAgIGlmIChhc3N1bWVKYXZhMTQoKSkgeworICAgICAgICBpZiAoIWFzc3VtZUphdmExXzVQbHVzKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBpZiAodC5zdGFydHNXaXRoKCIxLiIpKSB7CiAgICAgICAgICAgICB0ID0gdC5zdWJzdHJpbmcoMik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHQuZXF1YWxzKCIxIikgfHwgdC5lcXVhbHMoIjIiKSB8fCB0LmVxdWFscygiMyIpIHx8IHQuZXF1YWxzKCI0IikKLSAgICAgICAgICAgIHx8ICgodC5lcXVhbHMoIjUiKSB8fCB0LmVxdWFscygiNiIpKSAmJiAhYXNzdW1lSmF2YTE1KCkgJiYgIWFzc3VtZUphdmExNigpKQotICAgICAgICAgICAgfHwgKHQuZXF1YWxzKCI3IikgJiYgIWFzc3VtZUphdmExNygpKQotICAgICAgICAgICAgfHwgKHQuZXF1YWxzKCI4IikgJiYgIWFzc3VtZUphdmExOCgpKQotICAgICAgICAgICAgfHwgKHQuZXF1YWxzKCI5IikgJiYgIWFzc3VtZUphdmE5UGx1cygpKTsKKyAgICAgICAgcmV0dXJuICIxIi5lcXVhbHModCkgfHwgIjIiLmVxdWFscyh0KSB8fCAiMyIuZXF1YWxzKHQpIHx8ICI0Ii5lcXVhbHModCkKKyAgICAgICAgICAgICAgICB8fCAoKCI1Ii5lcXVhbHModCkgfHwgIjYiLmVxdWFscyh0KSkgJiYgYXNzdW1lSmF2YTFfN1BsdXMoKSkKKyAgICAgICAgICAgICAgICB8fCAoIjciLmVxdWFscyh0KSAmJiBhc3N1bWVKYXZhMV84UGx1cygpKQorICAgICAgICAgICAgICAgIHx8ICgiOCIuZXF1YWxzKHQpICYmIGFzc3VtZUphdmE5UGx1cygpKQorICAgICAgICAgICAgICAgIHx8ICgiOSIuZXF1YWxzKHQpICYmIGFzc3VtZUphdmExMFBsdXMoKSk7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBUdXJuIHRoZSB0YXNrJ3MgYXR0cmlidXRlIGZvciAtc291cmNlIGludG8gc29lbXRoaW5nIHRoYXQgaXMKKyAgICAgKiBUdXJuIHRoZSB0YXNrJ3MgYXR0cmlidXRlIGZvciAtc291cmNlIGludG8gc29tZXRoaW5nIHRoYXQgaXMKICAgICAgKiB1bmRlcnN0b29kIGJ5IGFsbCBqYXZhYydzIGFmdGVyIDEuNC4KICAgICAgKgogICAgICAqIDxwPnN1cHBvcnQgZm9yIC1zb3VyY2UgMS4xIGFuZCAtc291cmNlIDEuMiBoYXMgYmVlbiBhZGRlZCB3aXRoCiAgICAgICogSkRLIDEuNC4yIGJ1dCBpc24ndCBwcmVzZW50IGluIDEuNS4wKzwvcD4KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBhZGp1c3RTb3VyY2VWYWx1ZShmaW5hbCBTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiAoc291cmNlLmVxdWFscygiMS4xIikgfHwgc291cmNlLmVxdWFscygiMS4yIikpID8gIjEuMyIgOiBzb3VyY2U7CisgICAgICAgIHJldHVybiAiMS4xIi5lcXVhbHMoc291cmNlKSB8fCAiMS4yIi5lcXVhbHMoc291cmNlKSA/ICIxLjMiIDogc291cmNlOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0djai5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0djai5qYXZhCmluZGV4IGE2NjVlNDcuLjBkNDgyODYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9HY2ouamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvR2NqLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSwxNiArMzEsMTcgQEAKICAqIEBzaW5jZSBBbnQgMS40CiAgKi8KIHB1YmxpYyBjbGFzcyBHY2ogZXh0ZW5kcyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT05GTElDVF9XSVRIX0RBU0hfQyA9IHsiLW8iLCAiLS1tYWluPSIsICItRCIsICItZmpuaSIsICItTCJ9OwogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBnY2ogY29tcGlsZXIuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lIGNtZDsKICAgICAgICAgYXR0cmlidXRlcy5sb2coIlVzaW5nIGdjaiBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICBjbWQgPSBzZXR1cEdDSkNvbW1hbmQoKTsKKyAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBHQ0pDb21tYW5kKCk7CiAKICAgICAgICAgaW50IGZpcnN0RmlsZU5hbWUgPSBjbWQuc2l6ZSgpOwogICAgICAgICBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShjbWQpOwpAQCAtNjAsNyArNjEsNyBAQAogICAgICAgICAvLyBnY2ogZG9lc24ndCBzdXBwb3J0IGJvb3RjbGFzc3BhdGggZGlyICgtYm9vdGNsYXNzcGF0aCkKICAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCiAgICAgICAgIFBhdGggcCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKLSAgICAgICAgaWYgKHAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHApOwogICAgICAgICB9CiAKQEAgLTg5LDggKzkwLDggQEAKIAogICAgICAgICAgICAgaWYgKCFkZXN0RGlyLmV4aXN0cygpCiAgICAgICAgICAgICAgICAgJiYgIShkZXN0RGlyLm1rZGlycygpIHx8IGRlc3REaXIuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IG1ha2Ugb3V0cHV0IGRpcmVjdG9yaWVzLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1heWJlIHBlcm1pc3Npb24gaXMgd3JvbmcuICIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IG1ha2Ugb3V0cHV0IGRpcmVjdG9yaWVzLiBNYXliZSBwZXJtaXNzaW9uIGlzIHdyb25nLiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE1Miw2ICsxNTMsNCBAQAogICAgICAgICByZXR1cm4gbmF0aXZlQnVpbGQ7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09ORkxJQ1RfV0lUSF9EQVNIX0MgPSB7Ii1vIiwgIi0tbWFpbj0iLCAiLUQiLCAiLWZqbmkiLCAiLUwifTsKLQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEyLmphdmEKaW5kZXggNjM3Y2UwZS4uZmIwNDFhOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWMxMi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuTG9nT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOwogCiAvKioKQEAgLTUwLDIxICs0OSwxNiBAQAogICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgY2xhc3NpYyBjb21waWxlciIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cEphdmFjQ29tbWFuZCh0cnVlKTsKIAotICAgICAgICBPdXRwdXRTdHJlYW0gbG9nc3RyID0gbmV3IExvZ091dHB1dFN0cmVhbShhdHRyaWJ1dGVzLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gbG9nc3RyID0gbmV3IExvZ091dHB1dFN0cmVhbShhdHRyaWJ1dGVzLCBQcm9qZWN0Lk1TR19XQVJOKSkgewogICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjb21waWxlciwgcmVkaXJlY3Rpbmcgb3V0cHV0IHRvCiAgICAgICAgICAgICAvLyB0aGUgcHJvamVjdCBsb2cKICAgICAgICAgICAgIENsYXNzPD8+IGMgPSBDbGFzcy5mb3JOYW1lKENMQVNTSUNfQ09NUElMRVJfQ0xBU1NOQU1FKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnMgPQotICAgICAgICAgICAgICAgIGMuZ2V0Q29uc3RydWN0b3IoT3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgT2JqZWN0IGNvbXBpbGVyCi0gICAgICAgICAgICAgICAgPSBjb25zLm5ld0luc3RhbmNlKGxvZ3N0ciwgImphdmFjIik7CisgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zID0gYy5nZXRDb25zdHJ1Y3RvcihPdXRwdXRTdHJlYW0uY2xhc3MsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBPYmplY3QgY29tcGlsZXIgPSBjb25zLm5ld0luc3RhbmNlKGxvZ3N0ciwgImphdmFjIik7CiAKICAgICAgICAgICAgIC8vIENhbGwgdGhlIGNvbXBpbGUoKSBtZXRob2QKICAgICAgICAgICAgIE1ldGhvZCBjb21waWxlID0gYy5nZXRNZXRob2QoImNvbXBpbGUiLCBTdHJpbmdbXS5jbGFzcyk7Ci0gICAgICAgICAgICBCb29sZWFuIG9rID0gKEJvb2xlYW4pIGNvbXBpbGUuaW52b2tlKGNvbXBpbGVyLAotICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pOwotICAgICAgICAgICAgcmV0dXJuIG9rLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBjb21waWxlLmludm9rZShjb21waWxlciwgbmV3IE9iamVjdFtdIHtjbWQuZ2V0QXJndW1lbnRzKCl9KTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgdXNlIGNsYXNzaWMgY29tcGlsZXIsIGFzIGl0IGlzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYXZhaWxhYmxlLiBcbiIKQEAgLTgyLDggKzc2LDYgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIGNsYXNzaWMgY29tcGlsZXI6ICIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LCBsb2NhdGlvbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UobG9nc3RyKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWMxMy5qYXZhCmluZGV4IDZjYTA0YzUuLjU5MGVjMzUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhYzEzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjMTMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ0LDI3ICs0NCwyNSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgcmFuIHdpdGggYSB6ZXJvIGV4aXQgcmVzdWx0IChvaykKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBtb2Rlcm4gY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmQoKTsKIAogICAgICAgICAvLyBVc2UgcmVmbGVjdGlvbiB0byBiZSBhYmxlIHRvIGJ1aWxkIG9uIGFsbCBKREtzID49IDEuMToKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIGMgPSBDbGFzcy5mb3JOYW1lKCJjb20uc3VuLnRvb2xzLmphdmFjLk1haW4iKTsKLSAgICAgICAgICAgIE9iamVjdCBjb21waWxlciA9IGMubmV3SW5zdGFuY2UgKCk7Ci0gICAgICAgICAgICBNZXRob2QgY29tcGlsZSA9IGMuZ2V0TWV0aG9kICgiY29tcGlsZSIsCi0gICAgICAgICAgICAgICAgbmV3IENsYXNzIFtdIHsobmV3IFN0cmluZyBbXSB7fSkuZ2V0Q2xhc3MgKCl9KTsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAoKEludGVnZXIpIGNvbXBpbGUuaW52b2tlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChjb21waWxlciwgbmV3IE9iamVjdFtdIHtjbWQuZ2V0QXJndW1lbnRzKCl9KSkKLSAgICAgICAgICAgICAgICAuaW50VmFsdWUgKCk7Ci0gICAgICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBNT0RFUk5fQ09NUElMRVJfU1VDQ0VTUyk7CisgICAgICAgICAgICBDbGFzczw/PiBjID0gQ2xhc3MuZm9yTmFtZSgiY29tLnN1bi50b29scy5qYXZhYy5NYWluIik7CisgICAgICAgICAgICBPYmplY3QgY29tcGlsZXIgPSBjLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBNZXRob2QgY29tcGlsZSA9IGMuZ2V0TWV0aG9kKCJjb21waWxlIiwgU3RyaW5nW10uY2xhc3MpOworICAgICAgICAgICAgaW50IHJlc3VsdCA9IChJbnRlZ2VyKSBjb21waWxlLmludm9rZShjb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgKE9iamVjdCkgY21kLmdldEFyZ3VtZW50cygpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gTU9ERVJOX0NPTVBJTEVSX1NVQ0NFU1M7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIG1vZGVybiBjb21waWxlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LCBsb2NhdGlvbik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHN0YXJ0aW5nIG1vZGVybiBjb21waWxlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgsIGxvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhY0V4dGVybmFsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWNFeHRlcm5hbC5qYXZhCmluZGV4IGUyMjdlY2YuLjYzN2U5YmQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KYXZhY0V4dGVybmFsLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjRXh0ZXJuYWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQwLDMxICs0MCw3NiBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgZXh0ZXJuYWwgamF2YWMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAogICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBuZXcgQ29tbWFuZGxpbmUoKTsKICAgICAgICAgY21kLnNldEV4ZWN1dGFibGUoZ2V0SmF2YWMoKS5nZXRKYXZhY0V4ZWN1dGFibGUoKSk7Ci0gICAgICAgIGlmICghYXNzdW1lSmF2YTExKCkgJiYgIWFzc3VtZUphdmExMigpKSB7CisgICAgICAgIGlmIChhc3N1bWVKYXZhMV8zUGx1cygpKSB7CiAgICAgICAgICAgICBzZXR1cE1vZGVybkphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2V0dXBKYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kLCB0cnVlKTsKICAgICAgICAgfQotICAgICAgICBpbnQgZmlyc3RGaWxlTmFtZSA9IGFzc3VtZUphdmExMSgpID8gLTEgOiBjbWQuc2l6ZSgpOworCisgICAgICAgIGludCBvcGVuVm1zRmlyc3RGaWxlTmFtZSA9IGFzc3VtZUphdmExXzJQbHVzKCkgPyBjbWQuc2l6ZSgpIDogLTE7CisKICAgICAgICAgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoY21kKTsKICAgICAgICAgLy9PbiBWTVMgcGxhdGZvcm0sIHdlIG5lZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBqYXZhIG9wdGlvbnMgZmlsZQogICAgICAgICAvL2NvbnRhaW5pbmcgdGhlIGFyZ3VtZW50cyBhbmQgY2xhc3NwYXRoIGZvciB0aGUgamF2YWMgY29tbWFuZC4KICAgICAgICAgLy9UaGUgc3BlY2lhbCBmaWxlIGlzIHN1cHBvcnRlZCBieSB0aGUgIi1WIiBzd2l0Y2ggb24gdGhlIFZNUyBKVk0uCiAgICAgICAgIGlmIChPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXhlY09uVk1TKGNtZCwgZmlyc3RGaWxlTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gZXhlY09uVk1TKGNtZCwgb3BlblZtc0ZpcnN0RmlsZU5hbWUpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybgotICAgICAgICAgICAgICAgIGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoY21kLmdldENvbW1hbmRsaW5lKCksIGZpcnN0RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlKQorCisgICAgICAgIFN0cmluZ1tdIGNvbW1hbmRMaW5lID0gY21kLmdldENvbW1hbmRsaW5lKCk7CisgICAgICAgIGludCBmaXJzdEZpbGVOYW1lOworCisgICAgICAgIGlmIChhc3N1bWVKYXZhMV8yUGx1cygpKSB7CisgICAgICAgICAgICBmaXJzdEZpbGVOYW1lID0gbW92ZUFyZ0ZpbGVFbGlnaWJsZU9wdGlvbnNUb0VuZChjb21tYW5kTGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdEZpbGVOYW1lID0gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhlY3V0ZUV4dGVybmFsQ29tcGlsZShjb21tYW5kTGluZSwgZmlyc3RGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICB0cnVlKQogICAgICAgICAgICAgICAgID09IDA7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogTW92ZXMgYWxsIC1KIGFuZCBAYXJnZmlsZXMgYXJndW1lbnRzIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAgKiBTbyB0aGF0IGFsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gZmlsZSwgYnV0IC1KIGFuZCBAYXJnZmlsZQorICAgICAqIEFzIHBlciBqYXZhYyBkb2N1bWVudGF0aW9uOgorICAgICAqICAgICAgeW91IGNhbiBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIHRoYXQgY29udGFpbiBhcmd1bWVudHMgdG8gdGhlIGphdmFjIGNvbW1hbmQgKGV4Y2VwdCAtSiBvcHRpb25zKQorICAgICAqIEBwYXJhbSBjb21tYW5kTGluZSBjb21tYW5kIGxpbmUgdG8gcHJvY2VzcworICAgICAqIEByZXR1cm4gaW50IGluZGV4IG9mIGZpcnN0IGFyZ3VtZW50IHRoYXQgY291bGQgYmUgcHV0IGludG8gYXJnZmlsZQorICAgICAqLworICAgIHByaXZhdGUgaW50IG1vdmVBcmdGaWxlRWxpZ2libGVPcHRpb25zVG9FbmQoU3RyaW5nW10gY29tbWFuZExpbmUpIHsKKyAgICAgICAgaW50IG5vbkFyZ0ZpbGVPcHRpb25JZHggPSAxOyAvLyAwIGZvciBqYXZhYyBleGVjdXRhYmxlCisgICAgICAgIHdoaWxlKG5vbkFyZ0ZpbGVPcHRpb25JZHggPCBjb21tYW5kTGluZS5sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAhaXNBcmdGaWxlRWxpZ2libGUoY29tbWFuZExpbmVbbm9uQXJnRmlsZU9wdGlvbklkeF0pKSB7CisgICAgICAgICAgICBub25BcmdGaWxlT3B0aW9uSWR4Kys7CisgICAgICAgIH0KKworICAgICAgICBmb3IoaW50IGkgPSBub25BcmdGaWxlT3B0aW9uSWR4ICsgMTsgaSA8IGNvbW1hbmRMaW5lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWlzQXJnRmlsZUVsaWdpYmxlKGNvbW1hbmRMaW5lW2ldKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBvcHRpb24gPSBjb21tYW5kTGluZVtpXTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGogPSBpIC0gMTsgaiA+PSBub25BcmdGaWxlT3B0aW9uSWR4OyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZExpbmVbaiArIDFdID0gY29tbWFuZExpbmVbal07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbW1hbmRMaW5lW25vbkFyZ0ZpbGVPcHRpb25JZHhdID0gb3B0aW9uOworICAgICAgICAgICAgICAgIG5vbkFyZ0ZpbGVPcHRpb25JZHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBub25BcmdGaWxlT3B0aW9uSWR4OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNBcmdGaWxlRWxpZ2libGUoU3RyaW5nIG9wdGlvbikgeworICAgICAgICByZXR1cm4gIShvcHRpb24uc3RhcnRzV2l0aCgiLUoiKSB8fCBvcHRpb24uc3RhcnRzV2l0aCgiQCIpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBoZWxwZXIgbWV0aG9kIHRvIGV4ZWN1dGUgb3VyIGNvbW1hbmQgb24gVk1TLgogICAgICAqIEBwYXJhbSBjbWQgQ29tbWFuZGxpbmUKICAgICAgKiBAcGFyYW0gZmlyc3RGaWxlTmFtZSBpbnQKQEAgLTgyLDcgKzEyNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgZm9yIFwiLVZcIiBzd2l0Y2giKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciBcIi1WXCIgc3dpdGNoIik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlKHZtc0ZpbGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmlrZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KaWtlcy5qYXZhCmluZGV4IGVhYzFiY2YuLmU2YjVjMzcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KaWtlcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KaWtlcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDMsNiArNDMsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcgamlrZXMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIApAQCAtNTAsNyArNTEsNyBAQAogCiAgICAgICAgIC8vIEZvciAtc291cmNlcGF0aCwgdXNlIHRoZSAic291cmNlcGF0aCIgdmFsdWUgaWYgcHJlc2VudC4KICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlZmF1bHQgdG8gdGhlICJzcmNkaXIiIHZhbHVlLgotICAgICAgICBQYXRoIHNvdXJjZXBhdGggPSBudWxsOworICAgICAgICBQYXRoIHNvdXJjZXBhdGg7CiAgICAgICAgIGlmIChjb21waWxlU291cmNlcGF0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICBzb3VyY2VwYXRoID0gY29tcGlsZVNvdXJjZXBhdGg7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01OCwxNCArNTksMTQgQEAKICAgICAgICAgfQogICAgICAgICAvLyBJZiB0aGUgYnVpbGRmaWxlIHNwZWNpZmllcyBzb3VyY2VwYXRoPSIiLCB0aGVuIGRvbid0CiAgICAgICAgIC8vIG91dHB1dCBhbnkgc291cmNlcGF0aC4KLSAgICAgICAgaWYgKHNvdXJjZXBhdGguc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXNvdXJjZXBhdGguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZXBhdGgiKTsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoc291cmNlcGF0aCk7CiAgICAgICAgIH0KIAogICAgICAgICBQYXRoIGNsYXNzcGF0aCA9IG5ldyBQYXRoKHByb2plY3QpOwogCi0gICAgICAgIGlmIChib290Y2xhc3NwYXRoID09IG51bGwgfHwgYm9vdGNsYXNzcGF0aC5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoYm9vdGNsYXNzcGF0aCA9PSBudWxsIHx8IGJvb3RjbGFzc3BhdGguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAvLyBubyBib290Y2xhc3NwYXRoLCB0aGVyZWZvcmUsIGdldCBvbmUgZnJvbSB0aGUgamF2YSBydW50aW1lCiAgICAgICAgICAgICBpbmNsdWRlSmF2YVJ1bnRpbWUgPSB0cnVlOwogICAgICAgICB9IGVsc2UgewpAQCAtODIsNyArODMsNyBAQAogICAgICAgICAgICAgY2xhc3NwYXRoLmFwcGVuZChuZXcgUGF0aChwcm9qZWN0LCBqaWtlc1BhdGgpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChleHRkaXJzICE9IG51bGwgJiYgZXh0ZGlycy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmIChleHRkaXJzICE9IG51bGwgJiYgIWV4dGRpcnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWV4dGRpcnMiKTsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFBhdGgoZXh0ZGlycyk7CiAgICAgICAgIH0KQEAgLTEzNiw3ICsxMzcsNyBAQAogICAgICAgICBpZiAoYXR0cmlidXRlcy5nZXRTb3VyY2UoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLXNvdXJjZSIpOwogICAgICAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGF0dHJpYnV0ZXMuZ2V0U291cmNlKCk7Ci0gICAgICAgICAgICBpZiAoc291cmNlLmVxdWFscygiMS4xIikgfHwgc291cmNlLmVxdWFscygiMS4yIikpIHsKKyAgICAgICAgICAgIGlmICgiMS4xIi5lcXVhbHMoc291cmNlKSB8fCAiMS4yIi5lcXVhbHMoc291cmNlKSkgewogICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgZm9yIC1zb3VyY2UgMS4xIGFuZCAtc291cmNlIDEuMiBoYXMgYmVlbgogICAgICAgICAgICAgICAgIC8vIGFkZGVkIHdpdGggSkRLIDEuNC4yLCBKaWtlcyBkb2Vzbid0IGxpa2UgaXQKICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiSmlrZXMgZG9lc24ndCBzdXBwb3J0ICctc291cmNlICIgKyBzb3VyY2UKQEAgLTE1MSw3ICsxNTIsNyBAQAogICAgICAgICBpbnQgZmlyc3RGaWxlTmFtZSA9IGNtZC5zaXplKCk7CiAKICAgICAgICAgUGF0aCBib290ID0gZ2V0Qm9vdENsYXNzUGF0aCgpOwotICAgICAgICBpZiAoYm9vdC5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghYm9vdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCItYm9vdGNsYXNzcGF0aCIpOwogICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0UGF0aChib290KTsKICAgICAgICAgfQpAQCAtMTYxLDcgKzE2Miw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5UGFyYW1zKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICAvKioKKyAgICAgICAgLyoKICAgICAgICAgICogVE9ETwogICAgICAgICAgKiBQZXJoYXBzIHdlIHNob3VsZG4ndCB1c2UgcHJvcGVydGllcyBmb3IgdGhlc2UKICAgICAgICAgICogdGhyZWUgb3B0aW9ucyAoZW1hY3MgbW9kZSwgd2FybmluZ3MgYW5kIHBlZGFudGljKSwKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KdmMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9KdmMuamF2YQppbmRleCA4NWVjNDc5Li5mYjY1OWZlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSnZjLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0p2Yy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzcsNiArMzcsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgcmFuIHdpdGggYSB6ZXJvIGV4aXQgcmVzdWx0IChvaykKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21waWxhdGlvbiBoYXMgcHJvYmxlbXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBqdmMgY29tcGlsZXIiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIApAQCAtNDUsNyArNDYsNyBAQAogICAgICAgICAvLyBqdmMgZG9lc24ndCBzdXBwb3J0IGJvb3RjbGFzc3BhdGggZGlyICgtYm9vdGNsYXNzcGF0aCkKICAgICAgICAgLy8gc28gd2UnbGwgZW11bGF0ZSBpdCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgY29udmVuaWVuY2UuCiAgICAgICAgIFBhdGggcCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKLSAgICAgICAgaWYgKHAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHApOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9LamMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9LamMuamF2YQppbmRleCA2OGI1YmExLi5lYWFkZGFmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvS2pjLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0tqYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzgsNiArMzgsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsYXRpb24gc3VjY2VlZGVkCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tcGlsYXRpb24gaGFzIHByb2JsZW1zLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBhdHRyaWJ1dGVzLmxvZygiVXNpbmcga2pjIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwS2pjQ29tbWFuZCgpOwpAQCAtNjYsMTQgKzY3LDE0IEBACiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRGaWxlKGRlc3REaXIpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGNsc3NwYXRoCisgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBjbGFzc3BhdGgKICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jbGFzc3BhdGgiKTsKIAogICAgICAgICBQYXRoIGNwID0gbmV3IFBhdGgocHJvamVjdCk7CiAKICAgICAgICAgLy8ga2pjIGRvbid0IGhhdmUgYm9vdGNsYXNzcGF0aCBvcHRpb24uCiAgICAgICAgIFBhdGggcCA9IGdldEJvb3RDbGFzc1BhdGgoKTsKLSAgICAgICAgaWYgKHAuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBjcC5hcHBlbmQocCk7CiAgICAgICAgIH0KIApAQCAtMTE1LDUgKzExNiwzIEBACiAgICAgICAgIHJldHVybiBjbWQ7CiAgICAgfQogfQotCi0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9Tai5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEKaW5kZXggMGRjYzBlNC4uMjcyMGQxNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL1NqLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNSw2ICszNSw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGF0dHJpYnV0ZXMubG9nKCJVc2luZyBzeW1hbnRlYyBqYXZhIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKQEAgLTU0LDggKzU1LDggQEAKICAgICAgKiBAcmV0dXJuIG51bGwuCiAgICAgICogQHNpbmNlIEFudCAxLjYuMwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9EZWJ1Z0FyZ3VtZW50KCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbmQuamF2YQppbmRleCA5MWIzNGM4Li42YjUwZmYzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW5kLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FuZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOSArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogJmx0O2FuZCZndDsgY29uZGl0aW9uIGNvbnRhaW5lci4KQEAgLTM2LDE1ICszNSw5IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCB0aGUgY29udGFpbmVkIGNvbmRpdGlvbnMgZXZhbHVhdGVzIHRvIHRydWUKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBFbnVtZXJhdGlvbiBlID0gZ2V0Q29uZGl0aW9ucygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQ29uZGl0aW9uIGMgPSAoQ29uZGl0aW9uKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIWMuZXZhbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShnZXRDb25kaXRpb25zKCkpLmFsbE1hdGNoKENvbmRpdGlvbjo6ZXZhbCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW50VmVyc2lvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FudFZlcnNpb24uamF2YQppbmRleCAyNGE2YmQ4Li40NjY5Y2M4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW50VmVyc2lvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbnRWZXJzaW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw2ICsxOCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGV3ZXlEZWNpbWFsOwpAQCAtMzYsNiArMzcsNyBAQAogICAgICAqIFJ1biBhcyBhIHRhc2suCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm9wZXJ0eW5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIncHJvcGVydHknIG11c3QgYmUgc2V0LiIpOwpAQCAtNTYsNiArNTgsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIERld2V5RGVjaW1hbCBhY3R1YWwgPSBnZXRWZXJzaW9uKCk7CkBAIC04Miw4ICs4NSw4IEBACiAgICAgICAgICAgICAgICAgbmV3IERld2V5RGVjaW1hbChhdExlYXN0KTsgLy9OT1NPTkFSCiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSAnYXRsZWFzdCcgYXR0cmlidXRlIGlzIG5vdCBhIERld2V5IERlY2ltYWwgZWcgMS4xLjAgOiAiCi0gICAgICAgICAgICAgICAgICAgICsgYXRMZWFzdCk7CisgICAgICAgICAgICAgICAgICAgICJUaGUgJ2F0bGVhc3QnIGF0dHJpYnV0ZSBpcyBub3QgYSBEZXdleSBEZWNpbWFsIGVnIDEuMS4wIDogJXMiLAorICAgICAgICAgICAgICAgICAgICBhdExlYXN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC05MSw4ICs5NCw4IEBACiAgICAgICAgICAgICAgICAgbmV3IERld2V5RGVjaW1hbChleGFjdGx5KTsgLy9OT1NPTkFSCiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlRoZSAnZXhhY3RseScgYXR0cmlidXRlIGlzIG5vdCBhIERld2V5IERlY2ltYWwgZWcgMS4xLjAgOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZXhhY3RseSk7CisgICAgICAgICAgICAgICAgICAgICJUaGUgJ2V4YWN0bHknIGF0dHJpYnV0ZSBpcyBub3QgYSBEZXdleSBEZWNpbWFsIGVnIDEuMS4wIDogJXMiLAorICAgICAgICAgICAgICAgICAgICBleGFjdGx5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTEwMiw3ICsxMDUsNyBAQAogICAgICAgICBwLmluaXQoKTsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGJvb2xlYW4gZm91bmRGaXJzdERpZ2l0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoY2hhciB2ZXJzaW9uQ2hhciA6IHAuZ2V0UHJvcGVydHkoImFudC52ZXJzaW9uIikudG9DaGFyQXJyYXkoKSkgeworICAgICAgICBmb3IgKGNoYXIgdmVyc2lvbkNoYXIgOiBwLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX1ZFUlNJT04pLnRvQ2hhckFycmF5KCkpIHsKICAgICAgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNEaWdpdCh2ZXJzaW9uQ2hhcikpIHsKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodmVyc2lvbkNoYXIpOwogICAgICAgICAgICAgICAgIGZvdW5kRmlyc3REaWdpdCA9IHRydWU7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29uZGl0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29uZGl0aW9uLmphdmEKaW5kZXggNjJhZGJmMy4uNWZmNTljMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDQgKzMyLDMgQEAKICAgICAgKi8KICAgICBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29uZGl0aW9uQmFzZS5qYXZhCmluZGV4IGQwNTdiNDYuLjBkMjRmNDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db25kaXRpb25CYXNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbmRpdGlvbkJhc2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OwpAQCAtNDMsNyArNDUsNyBAQAogICAgIC8qKgogICAgICAqCiAgICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgY29uZGl0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8Q29uZGl0aW9uPiBjb25kaXRpb25zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBTaW1wbGUgY29uc3RydWN0b3IuCkBAIC03Nyw4ICs3OSw4IEBACiAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiB0byB1c2UgZm9yIGl0ZXJhdGlvbgogICAgICAqIEBzaW5jZSAxLjEKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgRW51bWVyYXRpb24gZ2V0Q29uZGl0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIGNvbmRpdGlvbnMuZWxlbWVudHMoKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRW51bWVyYXRpb248Q29uZGl0aW9uPiBnZXRDb25kaXRpb25zKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oY29uZGl0aW9ucyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDgsNyArMTEwLDcgQEAKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQXZhaWxhYmxlKEF2YWlsYWJsZSBhKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChhKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoYSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTgsNyArMTIwLDcgQEAKICAgICAgKiBAc2luY2UgMS40LCBBbnQgMS41CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ2hlY2tzdW0oQ2hlY2tzdW0gYykgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQoYyk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKGMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI4LDcgKzEzMCw3IEBACiAgICAgICogQHNpbmNlIDEuMQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFVwdG9kYXRlKFVwVG9EYXRlIHUpIHsKLSAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KHUpOworICAgICAgICBjb25kaXRpb25zLmFkZCh1KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzOCw3ICsxNDAsNyBAQAogICAgICAqIEBzaW5jZSAxLjEKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90IG4pIHsKLSAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KG4pOworICAgICAgICBjb25kaXRpb25zLmFkZChuKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE0OCw3ICsxNTAsNyBAQAogICAgICAqIEBzaW5jZSAxLjEKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kIGEpIHsKLSAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGEpOworICAgICAgICBjb25kaXRpb25zLmFkZChhKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OCw3ICsxNjAsNyBAQAogICAgICAqIEBzaW5jZSAxLjEKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRPcihPciBvKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChvKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQobyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgsNyArMTcwLDcgQEAKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRXF1YWxzKEVxdWFscyBlKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChlKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzgsNyArMTgwLDcgQEAKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkT3MoT3MgbykgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQobyk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKG8pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg4LDcgKzE5MCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJc1NldChJc1NldCBpKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChpKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoaSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTgsNyArMjAwLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEh0dHAoSHR0cCBoKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChoKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoaCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDgsNyArMjEwLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFNvY2tldChTb2NrZXQgcykgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQocyk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjE4LDcgKzIyMCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc01hdGNoKEZpbGVzTWF0Y2ggdGVzdCkgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKHRlc3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI4LDcgKzIzMCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRDb250YWlucyhDb250YWlucyB0ZXN0KSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudCh0ZXN0KTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQodGVzdCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzgsNyArMjQwLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZElzVHJ1ZShJc1RydWUgdGVzdCkgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKHRlc3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQ4LDcgKzI1MCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJc0ZhbHNlKElzRmFsc2UgdGVzdCkgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKHRlc3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRJc1JlZmVyZW5jZShJc1JlZmVyZW5jZSBpKSB7Ci0gICAgICAgIGNvbmRpdGlvbnMuYWRkRWxlbWVudChpKTsKKyAgICAgICAgY29uZGl0aW9ucy5hZGQoaSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjYsNyArMjY4LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdCB0aGUgY29uZGl0aW9uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkSXNGaWxlU2VsZWN0ZWQoSXNGaWxlU2VsZWN0ZWQgdGVzdCkgewotICAgICAgICBjb25kaXRpb25zLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIGNvbmRpdGlvbnMuYWRkKHRlc3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc1LDcgKzI3Nyw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoQ29uZGl0aW9uIGMpIHsKLSAgICAgICAgY29uZGl0aW9ucy5hZGRFbGVtZW50KGMpOworICAgICAgICBjb25kaXRpb25zLmFkZChjKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db250YWlucy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zLmphdmEKaW5kZXggMzQ3YzQ3NC4uOThiYzVjNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02MywxMCArNjMsMTEgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN1YnN0cmluZyBpcyB3aXRoaW4gdGhlIHN0cmluZwogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIG5vdCBzZXQgY29ycmVjdGx5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdHJpbmcgPT0gbnVsbCB8fCBzdWJTdHJpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJib3RoIHN0cmluZyBhbmQgc3Vic3RyaW5nIGFyZSByZXF1aXJlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaW4gY29udGFpbnMiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYm90aCBzdHJpbmcgYW5kIHN1YnN0cmluZyBhcmUgcmVxdWlyZWQgaW4gY29udGFpbnMiKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBjYXNlU2Vuc2l0aXZlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzLmphdmEKaW5kZXggMmQ5MzBmOS4uNDRlMzU2MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9FcXVhbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUwLDEwICs1MCwxMCBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgZmlyc3Qgc3RyaW5nCiAgICAgICoKLSAgICAgKiBAcGFyYW0gYTEgdGhlIGZpcnN0IHN0cmluZworICAgICAqIEBwYXJhbSBhcmcxIHRoZSBmaXJzdCBzdHJpbmcKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmcxKFN0cmluZyBhMSkgewotICAgICAgICBzZXRBcmcxSW50ZXJuYWwoYTEpOworICAgIHB1YmxpYyB2b2lkIHNldEFyZzEoU3RyaW5nIGFyZzEpIHsKKyAgICAgICAgc2V0QXJnMUludGVybmFsKGFyZzEpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRBcmcxSW50ZXJuYWwoT2JqZWN0IGFyZzEpIHsKQEAgLTc3LDEwICs3NywxMCBAQAogICAgIC8qKgogICAgICAqIFNldCB0aGUgc2Vjb25kIHN0cmluZwogICAgICAqCi0gICAgICogQHBhcmFtIGEyIHRoZSBzZWNvbmQgc3RyaW5nCisgICAgICogQHBhcmFtIGFyZzIgdGhlIHNlY29uZCBzdHJpbmcKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmcyKFN0cmluZyBhMikgewotICAgICAgICBzZXRBcmcySW50ZXJuYWwoYTIpOworICAgIHB1YmxpYyB2b2lkIHNldEFyZzIoU3RyaW5nIGFyZzIpIHsKKyAgICAgICAgc2V0QXJnMkludGVybmFsKGFyZzIpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZXRBcmcySW50ZXJuYWwoT2JqZWN0IGFyZzIpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9GaWxlc01hdGNoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRmlsZXNNYXRjaC5qYXZhCmluZGV4IDVlOTkzOTguLjQ1YTIzNWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9GaWxlc01hdGNoLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0ZpbGVzTWF0Y2guamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ0LDcgKzQ0LDYgQEAKIAogICAgIHByaXZhdGUgYm9vbGVhbiB0ZXh0ZmlsZSA9IGZhbHNlOwogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBGaWxlMSBhdHRyaWJ1dGUKICAgICAgKgpAQCAtNTQsNyArNTMsNiBAQAogICAgICAgICB0aGlzLmZpbGUxID0gZmlsZTE7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBGaWxlMiBhdHRyaWJ1dGUKICAgICAgKgpAQCAtNzgsMTMgKzc2LDE0IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlcyBhcmUgZXF1YWwKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGl0IGFsbCB3ZW50IHBlYXItc2hhcGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy92YWxpZGF0ZQogICAgICAgICBpZiAoZmlsZTEgPT0gbnVsbCB8fCBmaWxlMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggZmlsZTEgYW5kIGZpbGUyIGFyZSByZXF1aXJlZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmlsZXNtYXRjaCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJib3RoIGZpbGUxIGFuZCBmaWxlMiBhcmUgcmVxdWlyZWQgaW4gZmlsZXNtYXRjaCIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8jbm93IG1hdGNoIHRoZSBmaWxlcwpAQCAtOTgsNCArOTcsMyBAQAogICAgICAgICByZXR1cm4gbWF0Y2hlczsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNGcmVlU3BhY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNGcmVlU3BhY2UuamF2YQppbmRleCA0MjBjMTg5Li43Yjk0MzRhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSGFzRnJlZVNwYWNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0hhc0ZyZWVTcGFjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNiArNDEsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBlbm91Z2ggZnJlZSBzcGFjZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdmFsaWRhdGUoKTsKICAgICAgICAgdHJ5IHsKQEAgLTQ4LDExICs0OSwxMSBAQAogICAgICAgICAgICAgICAgIC8vcmVmbGVjdGlvbiB0byBhdm9pZCBib290c3RyYXAvYnVpbGQgcHJvYmxlbXMKICAgICAgICAgICAgICAgICBGaWxlIGZzID0gbmV3IEZpbGUocGFydGl0aW9uKTsKICAgICAgICAgICAgICAgICBSZWZsZWN0V3JhcHBlciB3ID0gbmV3IFJlZmxlY3RXcmFwcGVyKGZzKTsKLSAgICAgICAgICAgICAgICBsb25nIGZyZWUgPSAoKExvbmcpIHcuaW52b2tlKCJnZXRGcmVlU3BhY2UiKSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgbG9uZyBmcmVlID0gdy48TG9uZz5pbnZva2UoImdldEZyZWVTcGFjZSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBmcmVlID49IFN0cmluZ1V0aWxzLnBhcnNlSHVtYW5TaXplcyhuZWVkZWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkhhc0ZyZWVTcGFjZSBjb25kaXRpb24gbm90IHN1cHBvcnRlZCBvbiBKYXZhNSBvciBsZXNzLiIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJIYXNGcmVlU3BhY2UgY29uZGl0aW9uIG5vdCBzdXBwb3J0ZWQgb24gSmF2YTUgb3IgbGVzcy4iKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0hhc01ldGhvZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0hhc01ldGhvZC5qYXZhCmluZGV4IDZiOGQ4NWYuLjEwNDNlZWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IYXNNZXRob2QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSGFzTWV0aG9kLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNyw3ICszNyw2IEBACiAgICAgcHJpdmF0ZSBBbnRDbGFzc0xvYWRlciBsb2FkZXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVN5c3RlbUNsYXNzZXMgPSBmYWxzZTsKIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCB3aGVuIHNlYXJjaGluZyBmb3IgY2xhc3NlcyBhbmQgcmVzb3VyY2VzLgogICAgICAqCkBAIC0xMDQsNyArMTAzLDcgQEAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiBhIGdpdmVuIGNsYXNzIGNhbiBiZSBsb2FkZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSkgeworICAgIHByaXZhdGUgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBjbGFzc25hbWUpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChpZ25vcmVTeXN0ZW1DbGFzc2VzKSB7CiAgICAgICAgICAgICAgICAgbG9hZGVyID0gZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNsYXNzcGF0aCk7CkBAIC0xMTQsMjUgKzExMywyMyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVyLmZpbmRDbGFzcyhjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHNlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGZvdW5kIGJ1dCByZXN0cmljdGVkIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjbGFzcyBcIiIgKyBjbGFzc25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHdhcyBmb3VuZCBidXQgYSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBTZWN1cml0eUV4Y2VwdGlvbiBoYXMgYmVlbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByYWlzZWQgd2hpbGUgbG9hZGluZyBpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChsb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEhvdyBkbyB3ZSBldmVyIGdldCBoZXJlPwotICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyIGwgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBDYW4gcmV0dXJuIG51bGwgdG8gcmVwcmVzZW50IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyLgotICAgICAgICAgICAgICAgIC8vIHNlZSBBUEkgZG9jcyBvZiBDbGFzcy5nZXRDbGFzc0xvYWRlci4KLSAgICAgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSwgdHJ1ZSwgbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIFwiIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIHdhcyBmb3VuZCBidXQgYSBTZWN1cml0eUV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQgd2hpbGUgbG9hZGluZyBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSG93IGRvIHdlIGV2ZXIgZ2V0IGhlcmU/CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGwgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIC8vIENhbiByZXR1cm4gbnVsbCB0byByZXByZXNlbnQgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICAvLyBzZWUgQVBJIGRvY3Mgb2YgQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIuCisgICAgICAgICAgICBpZiAobCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoY2xhc3NuYW1lLCB0cnVlLCBsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzbmFtZSk7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjbGFzcyBcIiIgKyBjbGFzc25hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiB3YXMgbm90IGZvdW5kIik7CkBAIC0xNDMsMTUgKzE0MCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNsYXNzbmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGNsYXNzbmFtZSBkZWZpbmVkIik7CiAgICAgICAgIH0KICAgICAgICAgQ2xhc3NMb2FkZXIgcHJlTG9hZENsYXNzID0gbG9hZGVyOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBsb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbG9hZENsYXNzKGNsYXNzbmFtZSk7CiAgICAgICAgICAgICBpZiAobWV0aG9kICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaXNNZXRob2RGb3VuZChjbGF6eik7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSHR0cC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0h0dHAuamF2YQppbmRleCBjMTYzYWQ3Li4wZWI3OWMzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSHR0cC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IdHRwLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMSArMTgsMTMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Qcm90b2NvbEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTM0LDYgKzM2LDcgQEAKICAqICAgdXJsIC0gdGhlIFVSTCBvZiB0aGUgcmVxdWVzdC4KICAqICAgZXJyb3JzQmVnaW5BdCAtIG51bWJlciBhdCB3aGljaCBlcnJvcnMgYmVnaW4gYXQ7IGRlZmF1bHQ9NDAwLgogICogICByZXF1ZXN0TWV0aG9kIC0gSFRUUCByZXF1ZXN0IG1ldGhvZCB0byB1c2U7IEdFVCwgSEVBRCwgZXRjLiBkZWZhdWx0PUdFVAorICogICByZWFkVGltZW91dCAtIFRoZSByZWFkIHRpbWVvdXQgaW4gbXMuIGRlZmF1bHQ9MAogICogQHNpbmNlIEFudCAxLjUKICAqLwogcHVibGljIGNsYXNzIEh0dHAgZXh0ZW5kcyBQcm9qZWN0Q29tcG9uZW50IGltcGxlbWVudHMgQ29uZGl0aW9uIHsKQEAgLTQ0LDYgKzQ3LDkgQEAKICAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0TWV0aG9kID0gREVGQVVMVF9SRVFVRVNUX01FVEhPRDsKICAgICBwcml2YXRlIGJvb2xlYW4gZm9sbG93UmVkaXJlY3RzID0gdHJ1ZTsKIAorICAgIHByaXZhdGUgaW50IGVycm9yc0JlZ2luQXQgPSBFUlJPUl9CRUdJTlM7CisgICAgcHJpdmF0ZSBpbnQgcmVhZFRpbWVvdXQgPSAwOworCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB1cmwgYXR0cmlidXRlCiAgICAgICogQHBhcmFtIHVybCB0aGUgdXJsIG9mIHRoZSByZXF1ZXN0CkBAIC01Miw4ICs1OCw2IEBACiAgICAgICAgIHNwZWMgPSB1cmw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBpbnQgZXJyb3JzQmVnaW5BdCA9IEVSUk9SX0JFR0lOUzsKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgZXJyb3JzQmVnaW5BdCBhdHRyaWJ1dGUKICAgICAgKiBAcGFyYW0gZXJyb3JzQmVnaW5BdCBudW1iZXIgYXQgd2hpY2ggZXJyb3JzIGJlZ2luIGF0LCBkZWZhdWx0IGlzCkBAIC05Miw5ICs5NiwyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlYWQgdGltZW91dC4gQW55IHZhbHVlICZsdDsgMCB3aWxsIGJlIGlnbm9yZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSB0IHRoZSB0aW1lb3V0IHZhbHVlIGluIG1pbGxpIHNlY29uZHMKKyAgICAgKgorICAgICAqIEBzZWUgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24jc2V0UmVhZFRpbWVvdXQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWRUaW1lb3V0KGludCB0KSB7CisgICAgICAgIGlmKHQgPj0gMCkgeworICAgICAgICAgICAgdGhpcy5yZWFkVGltZW91dCA9IHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEhUVFAgcmVxdWVzdCBzdWNjZWVkcwogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzcGVjID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdXJsIHNwZWNpZmllZCBpbiBodHRwIGNvbmRpdGlvbiIpOwpAQCAtMTA4LDE4ICsxMjcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gaHR0cCA9IChIdHRwVVJMQ29ubmVjdGlvbikgY29ubjsKICAgICAgICAgICAgICAgICAgICAgaHR0cC5zZXRSZXF1ZXN0TWV0aG9kKHJlcXVlc3RNZXRob2QpOwogICAgICAgICAgICAgICAgICAgICBodHRwLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZvbGxvd1JlZGlyZWN0cyk7CisgICAgICAgICAgICAgICAgICAgIGh0dHAuc2V0UmVhZFRpbWVvdXQocmVhZFRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IGh0dHAuZ2V0UmVzcG9uc2VDb2RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiUmVzdWx0IGNvZGUgZm9yICIgKyBzcGVjICsgIiB3YXMgIiArIGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPiAwICYmIGNvZGUgPCBlcnJvcnNCZWdpbkF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlID4gMCAmJiBjb2RlIDwgZXJyb3JzQmVnaW5BdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBwZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBIVFRQIHByb3RvY29sOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVxdWVzdE1ldGhvZCwgcGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHN0ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGYWlsdXJlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGYWlsdXJlLmphdmEKaW5kZXggYjBmZmI5ZS4uODM4ODI4MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhaWx1cmUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhbHNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGYWxzZS5qYXZhCmluZGV4IDBiM2U2OWIuLjIzNjFiMGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhbHNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFsc2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm90aGluZyB0byB0ZXN0IGZvciBmYWxzZWhvb2QiKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gIXZhbHVlLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICByZXR1cm4gIXZhbHVlOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmlsZVNlbGVjdGVkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWQuamF2YQppbmRleCBlZmRiNjY0Li5lN2NkOWQ2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0xhc3RNb2RpZmllZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzTGFzdE1vZGlmaWVkLmphdmEKaW5kZXggYWMwNTQ3OC4uMDhlODBkYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzTGFzdE1vZGlmaWVkLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzTGFzdE1vZGlmaWVkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02OSw5ICs2OSwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgZGZGYWN0b3J5ID0gbmV3IFRvdWNoLkRhdGVGb3JtYXRGYWN0b3J5KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgRGF0ZUZvcm1hdCBnZXRQcmltYXJ5Rm9ybWF0KCkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdChwYXR0ZXJuKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIERhdGVGb3JtYXQgZ2V0RmFsbGJhY2tGb3JtYXQoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CkBAIC0xMDQsOCArMTA2LDggQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChtaWxsaXMgPj0gMCAmJiBkYXRlVGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIGRhdGVUaW1lIGFuZCBtaWxsaXMgY2FuIGJlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgb2YgZGF0ZVRpbWUgYW5kIG1pbGxpcyBjYW4gYmUgc2V0Iik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1pbGxpcyA8IDAgJiYgZGF0ZVRpbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJtaWxsaXMgb3IgZGF0ZVRpbWUgaXMgcmVxdWlyZWQiKTsKQEAgLTEyOSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICB9CiAgICAgICAgIERhdGVGb3JtYXQgZGYgPSBkZkZhY3RvcnkuZ2V0UHJpbWFyeUZvcm1hdCgpOwotICAgICAgICBQYXJzZUV4Y2VwdGlvbiBwZSA9IG51bGw7CisgICAgICAgIFBhcnNlRXhjZXB0aW9uIHBlOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIGRmLnBhcnNlKGRhdGVUaW1lKS5nZXRUaW1lKCk7CiAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlT25lKSB7CkBAIC0xNDQsMTEgKzE0Niw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChwZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGUuZ2V0TWVzc2FnZSgpLCBwZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogTk9UUkVBQ0hFRCAqLwotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHBlLmdldE1lc3NhZ2UoKSwgcGUsIGdldExvY2F0aW9uKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU2LDYgKzE1NCw3IEBACiAgICAgICogQHJldHVybiB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB0aGUgY29tcGFyaXNvbiBtb2RlIGFuZCB0aGUgdGltZSBvZiB0aGUgcmVzb3VyY2UKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIGxvbmcgZXhwZWN0ZWQgPSBnZXRNaWxsaXMoKTsKQEAgLTIwOSw2ICsyMDgsOCBAQAogICAgICAgICAgICAgc2V0VmFsdWUocyk7CiAgICAgICAgIH0KIAorICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICBFUVVBTFNfVEVYVCwgQkVGT1JFX1RFWFQsIEFGVEVSX1RFWFQsIE5PVF9CRUZPUkVfVEVYVCwKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlYWNoYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlLmphdmEKaW5kZXggZDgzZmNiZS4uYjZkNWY4ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVhY2hhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MCwxNiArNTAsMTMgQEAKICAqIEBzaW5jZSBBbnQgMS43CiAgKi8KIHB1YmxpYyBjbGFzcyBJc1JlYWNoYWJsZSBleHRlbmRzIFByb2plY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb25kaXRpb24gewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFQ09ORCA9IDEwMDA7IC8vIG1pbGxpcyBwZXIgc2Vjb25kCi0gICAgcHJpdmF0ZSBTdHJpbmcgaG9zdDsKLSAgICBwcml2YXRlIFN0cmluZyB1cmw7Ci0KICAgICAvKioKICAgICAgKiBUaGUgZGVmYXVsdCB0aW1lb3V0LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVElNRU9VVCA9IDMwOwotICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VDT05EID0gMTAwMDsgLy8gbWlsbGlzIHBlciBzZWNvbmQKKwogICAgIC8qKgogICAgICAqIEVycm9yIHdoZW4gbm8gaG9zdG5hbWUgaXMgZGVmaW5lZAogICAgICAqLwpAQCAtODgsMTEgKzg1LDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fSE9TVF9JTl9VUkwgPSAiTm8gaG9zdG5hbWUgaW4gVVJMICI7CiAgICAgLyoqCiAgICAgICogVGhlIG1ldGhvZCBuYW1lIHRvIGxvb2sgZm9yIGluIEluZXRBZGRyZXNzCi0gICAgICogQGRlcHJlY2F0ZWQgU2luY2UgMS45LjE0CisgICAgICogQGRlcHJlY2F0ZWQgU2luY2UgMS4xMC42CiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRIT0RfTkFNRSA9ICJpc1JlYWNoYWJsZSI7CiAKKyAgICBwcml2YXRlIFN0cmluZyBob3N0OworICAgIHByaXZhdGUgU3RyaW5nIHVybDsKKworICAgIHByaXZhdGUgaW50IHRpbWVvdXQgPSBERUZBVUxUX1RJTUVPVVQ7CisKICAgICAvKioKICAgICAgKiBTZXQgdGhlIGhvc3QgdG8gcGluZy4KICAgICAgKgpAQCAtMTI1LDEwICsxMjcsMTAgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBzdHJpbmcgcGFyYW0gdG8gY2hlY2sKICAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBlbXB0eQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBpc051bGxPckVtcHR5CiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGVtcHR5KGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwOworICAgIHByaXZhdGUgYm9vbGVhbiBpc051bGxPckVtcHR5KGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksMjMgKzE0MSwyNCBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGVtcHR5KGhvc3QpICYmIGVtcHR5KHVybCkpIHsKKyAgICAgICAgaWYgKGlzTnVsbE9yRW1wdHkoaG9zdCkgJiYgaXNOdWxsT3JFbXB0eSh1cmwpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfTk9fSE9TVE5BTUUpOwogICAgICAgICB9CiAgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX0JBRF9USU1FT1VUKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gaG9zdDsKLSAgICAgICAgaWYgKCFlbXB0eSh1cmwpKSB7Ci0gICAgICAgICAgICBpZiAoIWVtcHR5KGhvc3QpKSB7CisgICAgICAgIGlmICghaXNOdWxsT3JFbXB0eSh1cmwpKSB7CisgICAgICAgICAgICBpZiAoIWlzTnVsbE9yRW1wdHkoaG9zdCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfQk9USF9UQVJHRVRTKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGhvc3Qgb2YgYSB1cmwKICAgICAgICAgICAgICAgICBmaW5hbCBVUkwgcmVhbFVSTCA9IG5ldyBVUkwodXJsKTsKICAgICAgICAgICAgICAgICB0YXJnZXQgPSByZWFsVVJMLmdldEhvc3QoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW1wdHkodGFyZ2V0KSkgeworICAgICAgICAgICAgICAgIGlmIChpc051bGxPckVtcHR5KHRhcmdldCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX0hPU1RfSU5fVVJMICsgdXJsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWZlcmVuY2UuamF2YQppbmRleCBmMTcyODQ5Li43NjBkODY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWZlcmVuY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWZlcmVuY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU2LDM0ICs1NiwzMCBAQAogICAgICAqICAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIGlzIHRoZSBzYW1lIHR5cGUKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAocmVmID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcmVmZXJlbmNlIHNwZWNpZmllZCBmb3IgaXNyZWZlcmVuY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbmRpdGlvbiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm8gcmVmZXJlbmNlIHNwZWNpZmllZCBmb3IgaXNyZWZlcmVuY2UgY29uZGl0aW9uIik7CiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcga2V5ID0gcmVmLmdldFJlZklkKCk7CiAgICAgICAgIGlmICghZ2V0UHJvamVjdCgpLmhhc1JlZmVyZW5jZShrZXkpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShrZXkpOwotICAgICAgICAgICAgQ2xhc3MgdHlwZUNsYXNzID0KLSAgICAgICAgICAgICAgICAoQ2xhc3MpIGdldFByb2plY3QoKS5nZXREYXRhVHlwZURlZmluaXRpb25zKCkuZ2V0KHR5cGUpOwotCi0gICAgICAgICAgICBpZiAodHlwZUNsYXNzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0eXBlQ2xhc3MgPQotICAgICAgICAgICAgICAgICAgICAoQ2xhc3MpIGdldFByb2plY3QoKS5nZXRUYXNrRGVmaW5pdGlvbnMoKS5nZXQodHlwZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0eXBlQ2xhc3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGRvbid0IGtub3cgdGhlIHR5cGUsIHNob3VsZCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZD8KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0eXBlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ2xhc3M8Pz4gdHlwZUNsYXNzID0gZ2V0UHJvamVjdCgpLmdldERhdGFUeXBlRGVmaW5pdGlvbnMoKS5nZXQodHlwZSk7CisgICAgICAgIGlmICh0eXBlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZUNsYXNzID0gZ2V0UHJvamVjdCgpLmdldFRhc2tEZWZpbml0aW9ucygpLmdldCh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSB0eXBlIGlzIHVua25vd24sIHRocm93IGV4Y2VwdGlvbiBpbnN0ZWFkPworICAgICAgICByZXR1cm4gdHlwZUNsYXNzICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiB0eXBlQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGtleSkuZ2V0Q2xhc3MoKSk7CisKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1NldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2V0LmphdmEKaW5kZXggZDRhNTkxNC4uN2Q4YjBjMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSw5ICs0MSwxMSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvcGVydHkgZXhpc3RzCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcHJvcGVydHkgYXR0cmlidXRlIGlzIG5vdCBzZXQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcHJvcGVydHkgc3BlY2lmaWVkIGZvciBpc3NldCAiICsgImNvbmRpdGlvbiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJObyBwcm9wZXJ0eSBzcGVjaWZpZWQgZm9yIGlzc2V0IGNvbmRpdGlvbiIpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkocHJvcGVydHkpICE9IG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2lnbmVkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWQuamF2YQppbmRleCAyNzdhOTIxLi41NDg1N2NiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDEzICsxOSwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYW5pZmVzdFRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJlYW1VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlOwogCiAvKioKQEAgLTcxLDE5ICs3MCwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NpZ25lZChGaWxlIHppcEZpbGUsIFN0cmluZyBuYW1lKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBaaXBGaWxlIGphckZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGUpOworICAgICAgICB0cnkgKFppcEZpbGUgamFyRmlsZSA9IG5ldyBaaXBGaWxlKHppcEZpbGUpKSB7CiAgICAgICAgICAgICBpZiAobnVsbCA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBlTmFtZSA9ICgoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZU5hbWUuc3RhcnRzV2l0aChTSUdfU1RBUlQpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBlTmFtZS5lbmRzV2l0aChTSUdfRU5EKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKGphckZpbGUuZ2V0RW50cmllcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKGUgLT4gZS5nZXROYW1lKCkuc3RhcnRzV2l0aChTSUdfU1RBUlQpICYmIGUuZ2V0TmFtZSgpLmVuZHNXaXRoKFNJR19FTkQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5hbWUgPSByZXBsYWNlSW52YWxpZENoYXJzKG5hbWUpOwogICAgICAgICAgICAgYm9vbGVhbiBzaG9ydFNpZyA9IGphckZpbGUuZ2V0RW50cnkoU0lHX1NUQVJUCkBAIC05OCw4ICs4OCw2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBzaG9ydFNpZyB8fCBsb25nU2lnOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgWmlwRmlsZS5jbG9zZVF1aWV0bHkoamFyRmlsZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwOSw2ICs5Nyw3IEBACiAgICAgICogc3BlY2lmaWVkLCBpZiB0aGUgZmlsZSBjb250YWlucyBhIHNpZ25hdHVyZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgaXMgc2lnbmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB7CiAgICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGZpbGUgYXR0cmlidXRlIG11c3QgYmUgc2V0LiIpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzVHJ1ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzVHJ1ZS5qYXZhCmluZGV4IDc1M2I0NDEuLjczMmUyMjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1RydWUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNUcnVlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCwxMiArNDQsMTIgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZQogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZW9uZSBmb3Jnb3QgdG8gc3BlYyBhIHZhbHVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vdGhpbmcgdG8gdGVzdCBmb3IgdHJ1dGgiKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0phdmFWZXJzaW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSmF2YVZlcnNpb24uamF2YQppbmRleCA2OWE5MjkwLi5lMTIxYzMwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSmF2YVZlcnNpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSmF2YVZlcnNpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyoqCiAgKiBBbiBKYXZhIHZlcnNpb24gY29uZGl0aW9uLgotICogQHNpbmNlIEphdmEgMS45LjEwCisgKiBAc2luY2UgSmF2YSAxLjEwLjIKICAqLwogcHVibGljIGNsYXNzIEphdmFWZXJzaW9uIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL01hdGNoZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9NYXRjaGVzLmphdmEKaW5kZXggYWMzN2Y4Zi4uNDk2Njk1NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL01hdGNoZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vTWF0Y2hlcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL05vdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL05vdC5qYXZhCmluZGV4IGEzOWRjYmIuLjcxMjUwYzQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Ob3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vTm90LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNiwxNSArMzYsMTYgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA+IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSAiCi0gICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIGludG8gPG5vdD4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiWW91IG11c3Qgbm90IG5lc3QgbW9yZSB0aGFuIG9uZSBjb25kaXRpb24gaW50byA8bm90PiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjb3VudENvbmRpdGlvbnMoKSA8IDEpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvIDxub3Q+Iik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICEoKENvbmRpdGlvbikgZ2V0Q29uZGl0aW9ucygpLm5leHRFbGVtZW50KCkpLmV2YWwoKTsKKyAgICAgICAgcmV0dXJuICFnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKS5ldmFsKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pci5qYXZhCmluZGV4IGFlZGZlNzQuLmRkZGRkYWIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOSArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyZWFtVXRpbHM7CiAKIC8qKgogICogJmx0O29yJmd0OyBjb25kaXRpb24gY29udGFpbmVyLgpAQCAtMzYsMTUgKzM1LDkgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG9mIHRoZSBjb250YWluZWQgY29uZGl0aW9ucyBldmFsdWF0ZSB0byB0cnVlCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGdldENvbmRpdGlvbnMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIENvbmRpdGlvbiBjID0gKENvbmRpdGlvbikgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKGMuZXZhbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShnZXRDb25kaXRpb25zKCkpLmFueU1hdGNoKENvbmRpdGlvbjo6ZXZhbCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vT3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhCmluZGV4IGFjZTBjNjYuLmYyMmRjY2IgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Pcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNiArMTgsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zNCwyNiArMzUsOSBAQAogICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLmFyY2giKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1ZFUlNJT04gPQogICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLnZlcnNpb24iKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfU0VQID0KLSAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1NFUCA9IEZpbGUucGF0aFNlcGFyYXRvcjsKIAogICAgIC8qKgotICAgICAqIE9TIGZhbWlseSB0byBsb29rIGZvcgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGZhbWlseTsKLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIE9TCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAvKioKLSAgICAgKiB2ZXJzaW9uIG9mIE9TCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLSAgICAvKioKLSAgICAgKiBPUyBhcmNoaXRlY3R1cmUKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBhcmNoOwotICAgIC8qKgogICAgICAqIE9TIGZhbWlseSB0aGF0IGNhbiBiZSB0ZXN0ZWQgZm9yLiB7QHZhbHVlfQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTUlMWV9XSU5ET1dTID0gIndpbmRvd3MiOwpAQCAtMTA4LDYgKzkyLDIzIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBUldJTiA9ICJkYXJ3aW4iOwogCiAgICAgLyoqCisgICAgICogT1MgZmFtaWx5IHRvIGxvb2sgZm9yCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZmFtaWx5OworICAgIC8qKgorICAgICAqIE5hbWUgb2YgT1MKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIC8qKgorICAgICAqIHZlcnNpb24gb2YgT1MKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOworICAgIC8qKgorICAgICAqIE9TIGFyY2hpdGVjdHVyZQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGFyY2g7CisKKyAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICoKICAgICAgKi8KQEAgLTE3OSw2ICsxODAsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICogQHNlZSBPcyNzZXRGYW1pbHkoU3RyaW5nKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICByZXR1cm4gaXNPcyhmYW1pbHksIG5hbWUsIGFyY2gsIHZlcnNpb24pOwogICAgIH0KQEAgLTI3MCwzOSArMjcyLDUyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5jb250YWlucygiY2UiKSk7CiAgICAgICAgICAgICAgICAgICAgIGlzTlQgPSAhaXM5eDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1dJTkRPV1MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfOVgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzICYmIGlzOXg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9OVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBpc1dpbmRvd3MgJiYgaXNOVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX09TMikpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9PUzIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfTkVUV0FSRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9ORVRXQVJFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX0RPUykpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBQQVRIX1NFUC5lcXVhbHMoIjsiKSAmJiAhaXNGYW1pbHkoRkFNSUxZX05FVFdBUkUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfTUFDKSkgewotICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IE9TX05BTUUuY29udGFpbnMoRkFNSUxZX01BQykKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuY29udGFpbnMoREFSV0lOKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZhbWlseS5lcXVhbHMoRkFNSUxZX1RBTkRFTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKCJub25zdG9wX2tlcm5lbCIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmFtaWx5LmVxdWFscyhGQU1JTFlfVU5JWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBQQVRIX1NFUC5lcXVhbHMoIjoiKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzRmFtaWx5KEZBTUlMWV9WTVMpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWlzRmFtaWx5KEZBTUlMWV9NQUMpIHx8IE9TX05BTUUuZW5kc1dpdGgoIngiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuY29udGFpbnMoREFSV0lOKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9aT1MpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5jb250YWlucyhGQU1JTFlfWk9TKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgT1NfTkFNRS5jb250YWlucygib3MvMzkwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9PUzQwMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9PUzQwMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmYW1pbHkuZXF1YWxzKEZBTUlMWV9WTVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5jb250YWlucyhGQU1JTFlfVk1TKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRG9uXCd0IGtub3cgaG93IHRvIGRldGVjdCBvcyBmYW1pbHkgXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICArIGZhbWlseSArICJcIiIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZmFtaWx5KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkFNSUxZX1dJTkRPV1M6CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IGlzV2luZG93czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZBTUlMWV85WDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gaXNXaW5kb3dzICYmIGlzOXg7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQU1JTFlfTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IGlzV2luZG93cyAmJiBpc05UOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkFNSUxZX09TMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gT1NfTkFNRS5jb250YWlucyhGQU1JTFlfT1MyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZBTUlMWV9ORVRXQVJFOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9ORVRXQVJFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZBTUlMWV9ET1M6CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IFBBVEhfU0VQLmVxdWFscygiOyIpICYmICFpc0ZhbWlseShGQU1JTFlfTkVUV0FSRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQU1JTFlfTUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9NQUMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuY29udGFpbnMoREFSV0lOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZBTUlMWV9UQU5ERU06CisgICAgICAgICAgICAgICAgICAgICAgICBpc0ZhbWlseSA9IE9TX05BTUUuY29udGFpbnMoIm5vbnN0b3Bfa2VybmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQU1JTFlfVU5JWDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFtaWx5ID0gUEFUSF9TRVAuZXF1YWxzKCI6IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIWlzRmFtaWx5KEZBTUlMWV9WTVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICghaXNGYW1pbHkoRkFNSUxZX01BQykgfHwgT1NfTkFNRS5lbmRzV2l0aCgieCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuY29udGFpbnMoREFSV0lOKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQU1JTFlfWk9TOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9aT1MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IE9TX05BTUUuY29udGFpbnMoIm9zLzM5MCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRkFNSUxZX09TNDAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9PUzQwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQU1JTFlfVk1TOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNGYW1pbHkgPSBPU19OQU1FLmNvbnRhaW5zKEZBTUlMWV9WTVMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb25cJ3Qga25vdyBob3cgdG8gZGV0ZWN0IG9zIGZhbWlseSBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZhbWlseSArICJcIiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9QYXJzZXJTdXBwb3J0cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzLmphdmEKaW5kZXggZDI4MzQwMS4uNmY4NmE0YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSw5ICszMSw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBQYXJzZXJTdXBwb3J0cyBleHRlbmRzIFByb2plY3RDb21wb25lbnQgaW1wbGVtZW50cyBDb25kaXRpb24gewogCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZTsKLSAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKLSAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKICAgICAvLyBFcnJvciBtZXNzYWdlcwogICAgIC8qKiBlcnJvciAtIGNvbWJpbmVkIGF0dHJpYnV0ZXMgbm90IGFsbG93ZWQgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9CT1RIX0FUVFJJQlVURVMgPQpAQCAtNTYsNiArNTMsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19WQUxVRSA9CiAgICAgICAgICJBIHZhbHVlIGlzIG5lZWRlZCB3aGVuIHRlc3RpbmcgZm9yIHByb3BlcnR5IHN1cHBvcnQiOwogCisgICAgcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKwogICAgIC8qKgogICAgICAqIEZlYXR1cmUgdG8gcHJvYmUgZm9yLgogICAgICAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlIHRvIHByb2JlIGZvci4KQEAgLTgyLDYgKzgzLDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGZlYXR1cmUgIT0gbnVsbCAmJiBwcm9wZXJ0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfQk9USF9BVFRSSUJVVEVTKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUNvbnRhaW5zLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VDb250YWlucy5qYXZhCmluZGV4IGFlZDRjNDMuLjYwNTZjYjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUNvbnRhaW5zLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1Jlc291cmNlQ29udGFpbnMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg4LDggKzg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSByYy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJJbGxlZ2FsIHZhbHVlIGF0ICciICsgcmVmaWQgKyAiJzogIiArIFN0cmluZy52YWx1ZU9mKG8pKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbGxlZ2FsIHZhbHVlIGF0ICclcyc6ICVzIiwgcmVmaWQsIG8pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRoaXMucmVzb3VyY2UgPSAoUmVzb3VyY2UpIG87CkBAIC0xMjIsOCArMTIxLDggQEAKICAgICAgICAgICAgIHJlc29sdmVSZWZpZCgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHN1YnN0cmluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJvdGggcmVzb3VyY2UgYW5kIHN1YnN0cmluZyBhcmUgcmVxdWlyZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImluIDxyZXNvdXJjZWNvbnRhaW5zPiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJib3RoIHJlc291cmNlIGFuZCBzdWJzdHJpbmcgYXJlIHJlcXVpcmVkIGluIDxyZXNvdXJjZWNvbnRhaW5zPiIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzIsMTAgKzEzMSwxMSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3Vic3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVzb3VyY2UKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAKLSAgICAgICAgaWYgKHN1YnN0cmluZy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChzdWJzdHJpbmcuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJTdWJzdHJpbmcgaXMgZW1wdHk7IHJldHVybmluZyB0cnVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtMTQ2LDkgKzE0Niw4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlc291cmNlLmdldElucHV0U3RyZWFtKCkpKSkgewogICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZVV0aWxzLnNhZmVSZWFkRnVsbHkocmVhZGVyKTsKICAgICAgICAgICAgIFN0cmluZyBzdWIgPSBzdWJzdHJpbmc7CiAgICAgICAgICAgICBpZiAoIWNhc2VzZW5zaXRpdmUpIHsKQEAgLTE1OCw4ICsxNTcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRzLmNvbnRhaW5zKHN1Yik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlcmUgd2FzIGEgcHJvYmxlbSBhY2Nlc3NpbmcgcmVzb3VyY2UgOiAiICsgcmVzb3VyY2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHJlYWRlcik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VFeGlzdHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUV4aXN0cy5qYXZhCmluZGV4IDBlNGRlNTguLmRhZjY4NGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUV4aXN0cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9SZXNvdXJjZUV4aXN0cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1Jlc291cmNlc01hdGNoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VzTWF0Y2guamF2YQppbmRleCAyOWUzZTgwLi5jNGFiMzNiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VzTWF0Y2guamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUmVzb3VyY2VzTWF0Y2guamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIHJlc291cmNlcyBhcmUgZXF1YWwuCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCkBAIC03MiwxMSArNzMsMTEgQEAKICAgICAgICAgfQogICAgICAgICBpZiAocmVzb3VyY2VzLnNpemUoKSA+IDEpIHsKICAgICAgICAgICAgIEl0ZXJhdG9yPFJlc291cmNlPiBpID0gcmVzb3VyY2VzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBSZXNvdXJjZSByMSA9IChSZXNvdXJjZSkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBSZXNvdXJjZSByMiA9IG51bGw7CisgICAgICAgICAgICBSZXNvdXJjZSByMSA9IGkubmV4dCgpOworICAgICAgICAgICAgUmVzb3VyY2UgcjI7CiAKICAgICAgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHIyID0gKFJlc291cmNlKSBpLm5leHQoKTsKKyAgICAgICAgICAgICAgICByMiA9IGkubmV4dCgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghUmVzb3VyY2VVdGlscy5jb250ZW50RXF1YWxzKHIxLCByMiwgYXNUZXh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1NvY2tldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1NvY2tldC5qYXZhCmluZGV4IGQ2YTY5ZWMuLmRmNDM2YTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Tb2NrZXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vU29ja2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NywzMSArNTcsMjEgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSBzb2NrZXQgY2FuIGJlIGNyZWF0ZWQKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBub3Qgc2V0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBzZXJ2ZXIgc3BlY2lmaWVkIGluIHNvY2tldCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiY29uZGl0aW9uIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHNlcnZlciBzcGVjaWZpZWQgaW4gc29ja2V0IGNvbmRpdGlvbiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChwb3J0ID09IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gcG9ydCBzcGVjaWZpZWQgaW4gc29ja2V0IGNvbmRpdGlvbiIpOwogICAgICAgICB9CiAgICAgICAgIGxvZygiQ2hlY2tpbmcgZm9yIGxpc3RlbmVyIGF0ICIgKyBzZXJ2ZXIgKyAiOiIgKyBwb3J0LAogICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgIGphdmEubmV0LlNvY2tldCBzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMgPSBuZXcgamF2YS5uZXQuU29ja2V0KHNlcnZlciwgcG9ydCk7CisgICAgICAgIHRyeSAoamF2YS5uZXQuU29ja2V0IHMgPSBuZXcgamF2YS5uZXQuU29ja2V0KHNlcnZlciwgcG9ydCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKHMgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgcy5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBibGFuawotICAgICAgICAgICAgfQotICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9UeXBlRm91bmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9UeXBlRm91bmQuamF2YQppbmRleCBmOTdjN2Y0Li5hZjg2MjVhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vVHlwZUZvdW5kLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1R5cGVGb3VuZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTgsNyArNTgsNiBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZW5hbWUgZXhpc3RzCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gZG9lc1R5cGVFeGlzdChTdHJpbmcgdHlwZW5hbWUpIHsKLQogICAgICAgICBDb21wb25lbnRIZWxwZXIgaGVscGVyID0KICAgICAgICAgICAgIENvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRIZWxwZXIoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBQcm9qZWN0SGVscGVyLmdlbkNvbXBvbmVudE5hbWUodXJpLCB0eXBlbmFtZSk7CkBAIC04MSw2ICs4MCw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZQogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXZhbCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTm8gdHlwZSBzcGVjaWZpZWQiKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3IuamF2YQppbmRleCAyY2M4ZTRjLi4wNWRjNTFlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vWG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTIgKzE3LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJlYW1VdGlsczsKIAogLyoqCi0gKiBUaGUgPHR0PlhvcjwvdHQ+IGNvbmRpdGlvbiB0eXBlIHRvIGV4Y2x1c2l2ZSBvciBvcGVyYXRpb25zLgorICogVGhlIDxjb2RlPlhvcjwvY29kZT4gY29uZGl0aW9uIHR5cGUgdG8gZXhjbHVzaXZlIG9yIG9wZXJhdGlvbnMuCiAgKiBUaGlzIGRvZXMgbm90IHNob3J0Y3V0IHN0dWZmLgogICogQHNpbmNlIEFudCAxLjcKICAqLwpAQCAtMzQsMTYgKzMzLDExIEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbgogICAgICAqICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3Vycy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGdldENvbmRpdGlvbnMoKTsKLSAgICAgICAgLy9pbml0aWFsIHN0YXRlIGlzIGZhbHNlLgotICAgICAgICBib29sZWFuIHN0YXRlID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBDb25kaXRpb24gYyA9IChDb25kaXRpb24pIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIC8vZXZlcnkgY29uZGl0aW9uIGlzIHhvcmVkIGFnYWluc3QgdGhlIHByZXZpb3VzIG9uZQotICAgICAgICAgICAgc3RhdGUgXj0gYy5ldmFsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICAvLyBpbml0aWFsIHN0YXRlIGlzIGZhbHNlCisgICAgICAgIHJldHVybiBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKGdldENvbmRpdGlvbnMoKSkubWFwKENvbmRpdGlvbjo6ZXZhbCkKKyAgICAgICAgICAgICAgICAucmVkdWNlKChhLCBiKSAtPiBhIF4gYikub3JFbHNlKEJvb2xlYW4uRkFMU0UpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NWU0VudHJ5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ1ZTRW50cnkuamF2YQppbmRleCBiMWE5YTEyLi4xOTViNzhiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ1ZTRW50cnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ1ZTRW50cnkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDcgKzI4LDcgQEAKICAgICBwcml2YXRlIERhdGUgZGF0ZTsKICAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29tbWVudDsKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxSQ1NGaWxlPiBmaWxlcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhIENWU0VudHJ5CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICogQHBhcmFtIHJldmlzaW9uIHRoZSByZXZpc2lvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoZmluYWwgU3RyaW5nIGZpbGUsIGZpbmFsIFN0cmluZyByZXZpc2lvbikgewotICAgICAgICBmaWxlcy5hZGRFbGVtZW50KG5ldyBSQ1NGaWxlKGZpbGUsIHJldmlzaW9uKSk7CisgICAgICAgIGZpbGVzLmFkZChuZXcgUkNTRmlsZShmaWxlLCByZXZpc2lvbikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTgsNyArNTgsNyBAQAogICAgICAqIEBwYXJhbSBwcmV2aW91c1JldmlzaW9uIHRoZSBwcmV2aW91cyByZXZpc2lvbgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoZmluYWwgU3RyaW5nIGZpbGUsIGZpbmFsIFN0cmluZyByZXZpc2lvbiwgZmluYWwgU3RyaW5nIHByZXZpb3VzUmV2aXNpb24pIHsKLSAgICAgICAgZmlsZXMuYWRkRWxlbWVudChuZXcgUkNTRmlsZShmaWxlLCByZXZpc2lvbiwgcHJldmlvdXNSZXZpc2lvbikpOworICAgICAgICBmaWxlcy5hZGQobmV3IFJDU0ZpbGUoZmlsZSwgcmV2aXNpb24sIHByZXZpb3VzUmV2aXNpb24pKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgKiBHZXRzIHRoZSBmaWxlcyBpbiB0aGlzIENWU0VudHJ5CiAgICAgICogQHJldHVybiB0aGUgZmlsZXMKICAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldEZpbGVzKCkgeworICAgIHB1YmxpYyBWZWN0b3I8UkNTRmlsZT4gZ2V0RmlsZXMoKSB7CiAgICAgICAgIHJldHVybiBmaWxlczsKICAgICB9CiAKQEAgLTEwNSw2ICsxMDUsNyBAQAogICAgICAqIEdldHMgYSBTdHJpbmcgY29udGFpbmluZyBhdXRob3IsIGRhdGUsIGZpbGVzIGFuZCBjb21tZW50CiAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIENWU0VudHJ5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIGdldEF1dGhvcigpICsgIlxuIiArIGdldERhdGUoKSArICJcbiIgKyBnZXRGaWxlcygpICsgIlxuIgogICAgICAgICAgICAgKyBnZXRDb21tZW50KCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyLmphdmEKaW5kZXggYjA4ODEwNy4uYmIxOTE4YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NoYW5nZUxvZ1BhcnNlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDI0ICsyMCwyMyBAQAogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQWJzdHJhY3RDdnNUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkFic3RyYWN0Q3ZzVGFzay5Nb2R1bGU7CiAKIC8qKgogICogQSBjbGFzcyB1c2VkIHRvIHBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIENWUyBsb2cgY29tbWFuZC4KICAqCiAgKi8KIGNsYXNzIENoYW5nZUxvZ1BhcnNlciB7Ci0gICAgLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0VOVFJZID0gMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX0ZJTEUgPSAxOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfREFURSA9IDI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9DT01NRU5UID0gMzsKQEAgLTUzLDkgKzUyLDYgQEAKICAgICBwcml2YXRlIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgY3ZzMTEyOUlucHV0RGF0ZSA9CiAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzIFoiLCBMb2NhbGUuVVMpOwogCi0gICAgc3RhdGljIHsKLSAgICB9Ci0KICAgICAvL1RoZSBmb2xsb3dpbmcgaXMgZGF0YSB1c2VkIHdoaWxlIHByb2Nlc3Npbmcgc3Rkb3V0IG9mIENWUyBjb21tYW5kCiAgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZTsKICAgICBwcml2YXRlIFN0cmluZyBkYXRlOwpAQCAtNjcsMzIgKzYzLDI5IEBACiAgICAgcHJpdmF0ZSBpbnQgc3RhdHVzID0gR0VUX0ZJTEU7CiAKICAgICAvKiogcmNzIGVudHJpZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZSBlbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ1ZTRW50cnk+IGVudHJpZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZW1vdGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBtb2R1bGVOYW1lczsKICAgICBwcml2YXRlIGZpbmFsIGludFtdIG1vZHVsZU5hbWVMZW5ndGhzOwogCiAgICAgcHVibGljIENoYW5nZUxvZ1BhcnNlcigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSwgIiIsIENvbGxlY3Rpb25VdGlscy5FTVBUWV9MSVNUKTsKKyAgICAgICAgdGhpcyhmYWxzZSwgIiIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2hhbmdlTG9nUGFyc2VyKGJvb2xlYW4gcmVtb3RlLCBTdHJpbmcgcGFja2FnZU5hbWUsIExpc3QgbW9kdWxlcykgeworICAgIHB1YmxpYyBDaGFuZ2VMb2dQYXJzZXIoYm9vbGVhbiByZW1vdGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgTGlzdDxBYnN0cmFjdEN2c1Rhc2suTW9kdWxlPiBtb2R1bGVzKSB7CiAgICAgICAgIHRoaXMucmVtb3RlID0gcmVtb3RlOwogCi0gICAgICAgIEFycmF5TGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGlmIChwYWNrYWdlTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhY2thZ2VOYW1lKTsKICAgICAgICAgICAgICAgICAgdG9rLmhhc01vcmVUb2tlbnMoKTspIHsKICAgICAgICAgICAgICAgICBuYW1lcy5hZGQodG9rLm5leHRUb2tlbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtb2R1bGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgQWJzdHJhY3RDdnNUYXNrLk1vZHVsZSBtID0gKEFic3RyYWN0Q3ZzVGFzay5Nb2R1bGUpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgbmFtZXMuYWRkKG0uZ2V0TmFtZSgpKTsKLSAgICAgICAgfQorICAgICAgICBtb2R1bGVzLnN0cmVhbSgpLm1hcChNb2R1bGU6OmdldE5hbWUpLmZvckVhY2gobmFtZXM6OmFkZCk7CiAKLSAgICAgICAgbW9kdWxlTmFtZXMgPSAoU3RyaW5nW10pIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKKyAgICAgICAgbW9kdWxlTmFtZXMgPSBuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbbmFtZXMuc2l6ZSgpXSk7CiAgICAgICAgIG1vZHVsZU5hbWVMZW5ndGhzID0gbmV3IGludFttb2R1bGVOYW1lcy5sZW5ndGhdOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZU5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBtb2R1bGVOYW1lTGVuZ3Roc1tpXSA9IG1vZHVsZU5hbWVzW2ldLmxlbmd0aCgpOwpAQCAtMTA5LDEyICsxMDIsNyBAQAogICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHJjcyBlbnRyaWVzIGFzIGFuIGFycmF5CiAgICAgICovCiAgICAgcHVibGljIENWU0VudHJ5W10gZ2V0RW50cnlTZXRBc0FycmF5KCkgewotICAgICAgICBmaW5hbCBDVlNFbnRyeVtdIGFycmF5ID0gbmV3IENWU0VudHJ5WyBlbnRyaWVzLnNpemUoKSBdOwotICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGFycmF5W2krK10gPSAoQ1ZTRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgIHJldHVybiBlbnRyaWVzLnZhbHVlcygpLnRvQXJyYXkobmV3IENWU0VudHJ5W2VudHJpZXMuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjMsNyArMTExLDcgQEAKICAgICAgKiBAcGFyYW0gbGluZSB0aGUgbGluZSB0byBwcm9jZXNzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc3Rkb3V0KGZpbmFsIFN0cmluZyBsaW5lKSB7Ci0gICAgICAgIHN3aXRjaChzdGF0dXMpIHsKKyAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICAgICAgICAgIGNhc2UgR0VUX0ZJTEU6CiAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGF0dHJpYnV0ZXMgYXJlIHJlc2V0IHdoZW4KICAgICAgICAgICAgICAgICAvLyB3b3JraW5nIG9uIGEgJ25ldycgZmlsZS4KQEAgLTE1OCwyMyArMTQ2LDIwIEBACiAgICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbW1lbnQoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0gICAgICAgIGlmIChsaW5lLmVxdWFscygKLSAgICAgICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKSkgeworICAgICAgICBpZiAoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICAgICAgICAgLmVxdWFscyhsaW5lKSkgewogICAgICAgICAgICAgLy9XZSBoYXZlIGVuZGVkIGNoYW5nZWxvZyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGZpbGUKICAgICAgICAgICAgIC8vc28gd2UgY2FuIHNhdmUgaXQKLSAgICAgICAgICAgIGZpbmFsIGludCBlbmQKLSAgICAgICAgICAgICAgICA9IGNvbW1lbnQubGVuZ3RoKCkgLSBsaW5lU2VwYXJhdG9yLmxlbmd0aCgpOyAvL3dhcyAtMQorICAgICAgICAgICAgZmluYWwgaW50IGVuZCA9IGNvbW1lbnQubGVuZ3RoKCkgLSBTeXN0ZW0ubGluZVNlcGFyYXRvcigpLmxlbmd0aCgpOyAvL3dhcyAtMQogICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnQuc3Vic3RyaW5nKDAsIGVuZCk7CiAgICAgICAgICAgICBzYXZlRW50cnkoKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEdFVF9GSUxFOwotICAgICAgICB9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIikpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBlbmQKLSAgICAgICAgICAgICAgICA9IGNvbW1lbnQubGVuZ3RoKCkgLSBsaW5lU2VwYXJhdG9yLmxlbmd0aCgpOyAvL3dhcyAtMQorICAgICAgICB9IGVsc2UgaWYgKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIi5lcXVhbHMobGluZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBlbmQgPSBjb21tZW50Lmxlbmd0aCgpIC0gU3lzdGVtLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGgoKTsgLy93YXMgLTEKICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygwLCBlbmQpOwogICAgICAgICAgICAgc3RhdHVzID0gR0VUX1BSRVZJT1VTX1JFVjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbW1lbnQgKz0gbGluZSArIGxpbmVTZXBhcmF0b3I7CisgICAgICAgICAgICBjb21tZW50ICs9IGxpbmUgKyBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODYsNyArMTcxLDcgQEAKICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGUoZmluYWwgU3RyaW5nIGxpbmUpIHsKICAgICAgICAgaWYgKCFyZW1vdGUgJiYgbGluZS5zdGFydHNXaXRoKCJXb3JraW5nIGZpbGU6IikpIHsKICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCi0gICAgICAgICAgICBmaWxlID0gbGluZS5zdWJzdHJpbmcoMTQsIGxpbmUubGVuZ3RoKCkpOworICAgICAgICAgICAgZmlsZSA9IGxpbmUuc3Vic3RyaW5nKDE0KTsKICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KICAgICAgICAgICAgIHN0YXR1cyA9IEdFVF9SRVZJU0lPTjsKICAgICAgICAgfSBlbHNlIGlmIChyZW1vdGUgJiYgbGluZS5zdGFydHNXaXRoKCJSQ1MgZmlsZToiKSkgewpAQCAtMjc1LDE3ICsyNjAsOCBAQAogICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgc2F2ZXMgdGhlIGN1cnJlbnQgZW50cnkuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNhdmVFbnRyeSgpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVudHJ5S2V5ID0gZGF0ZSArIGF1dGhvciArIGNvbW1lbnQ7Ci0gICAgICAgIENWU0VudHJ5IGVudHJ5OwotICAgICAgICBpZiAoIWVudHJpZXMuY29udGFpbnNLZXkoZW50cnlLZXkpKSB7Ci0gICAgICAgICAgICBEYXRlIGRhdGVPYmplY3QgPSBwYXJzZURhdGUoZGF0ZSk7Ci0gICAgICAgICAgICBlbnRyeSA9IG5ldyBDVlNFbnRyeShkYXRlT2JqZWN0LCBhdXRob3IsIGNvbW1lbnQpOwotICAgICAgICAgICAgZW50cmllcy5wdXQoZW50cnlLZXksIGVudHJ5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVudHJ5ID0gKENWU0VudHJ5KSBlbnRyaWVzLmdldChlbnRyeUtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnRyeS5hZGRGaWxlKGZpbGUsIHJldmlzaW9uLCBwcmV2aW91c1JldmlzaW9uKTsKKyAgICAgICAgZW50cmllcy5jb21wdXRlSWZBYnNlbnQoZGF0ZSArIGF1dGhvciArIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgayAtPiBuZXcgQ1ZTRW50cnkocGFyc2VEYXRlKGRhdGUpLCBhdXRob3IsIGNvbW1lbnQpKS5hZGRGaWxlKGZpbGUsIHJldmlzaW9uLCBwcmV2aW91c1JldmlzaW9uKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nVGFzay5qYXZhCmluZGV4IDgxZGFkZmQuLjI5OTYyZjkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NoYW5nZUxvZ1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE1ICsxOCwxNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtMzUsNyArMzYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQWJzdHJhY3RDdnNUYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogRXhhbWluZXMgdGhlIG91dHB1dCBvZiBjdnMgbG9nIGFuZCBncm91cCByZWxhdGVkIGNoYW5nZXMgdG9nZXRoZXIuCkBAIC03MCw3ICs3MCw3IEBACiAgICAgcHJpdmF0ZSBGaWxlIHVzZXJzRmlsZTsKIAogICAgIC8qKiBVc2VyIGxpc3QgKi8KLSAgICBwcml2YXRlIFZlY3RvciBjdnNVc2VycyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8Q3ZzVXNlcj4gY3ZzVXNlcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiBJbnB1dCBkaXIgKi8KICAgICBwcml2YXRlIEZpbGUgaW5wdXREaXI7CkBAIC05OCw4ICs5OCw3IEBACiAgICAgICogcGVyZm9ybWVkLiBJZiBlbXB0eSB0aGVuIGFsbCBmaWxlcyBpbiB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2lsbAogICAgICAqIGJlIGNoZWNrZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7Ci0KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgYmFzZSBkaXIgZm9yIGN2cy4KQEAgLTExMCw3ICsxMDksNiBAQAogICAgICAgICB0aGlzLmlucHV0RGlyID0gaW5wdXREaXI7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIG91dHB1dCBmaWxlIGZvciB0aGUgbG9nLgogICAgICAqCkBAIC0xMjAsNyArMTE4LDYgQEAKICAgICAgICAgdGhpcy5kZXN0RmlsZSA9IGRlc3RGaWxlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IGEgbG9va3VwIGxpc3Qgb2YgdXNlciBuYW1lcyAmYW1wOyBhZGRyZXNzZXMKICAgICAgKgpAQCAtMTMwLDE3ICsxMjcsMTUgQEAKICAgICAgICAgdGhpcy51c2Vyc0ZpbGUgPSB1c2Vyc0ZpbGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBZGQgYSB1c2VyIHRvIGxpc3QgY2hhbmdlbG9nIGtub3dzIGFib3V0LgogICAgICAqCiAgICAgICogQHBhcmFtIHVzZXIgdGhlIHVzZXIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRVc2VyKGZpbmFsIEN2c1VzZXIgdXNlcikgewotICAgICAgICBjdnNVc2Vycy5hZGRFbGVtZW50KHVzZXIpOworICAgICAgICBjdnNVc2Vycy5hZGQodXNlcik7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGRhdGUgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RhcnQuCiAgICAgICoKQEAgLTE1MCw3ICsxNDUsNiBAQAogICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjaGFuZ2Vsb2cgc2hvdWxkIHN0b3AuCiAgICAgICoKQEAgLTE2MCw3ICsxNTQsNiBAQAogICAgICAgICB0aGlzLmVuZERhdGUgPSBlbmREYXRlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBudW1iZXIgb2YgZGF5cyB3b3J0aCBvZiBsb2cgZW50cmllcyB0byBwcm9jZXNzLgogICAgICAqCkBAIC0xOTUsNyArMTg4LDYgQEAKICAgICAgICAgdGhpcy5zdGFydFRhZyA9IHN0YXJ0OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0YWcgYXQgd2hpY2ggdGhlIGNoYW5nZWxvZyBzaG91bGQgc3RvcC4KICAgICAgKgpAQCAtMjExLDI5ICsyMDMsMjYgQEAKICAgICAgKiBAcGFyYW0gZmlsZVNldCBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBjdnMgbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KGZpbmFsIEZpbGVTZXQgZmlsZVNldCkgewotICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KGZpbGVTZXQpOworICAgICAgICBmaWxlc2V0cy5hZGQoZmlsZVNldCk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBFeGVjdXRlIHRhc2sKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZXhlY3V0aW5nIHRoZQogICAgICAqICAgICAgICAgICAgY3ZzIGNvbW1hbmQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBzYXZlZERpciA9IGlucHV0RGlyOyAvLyBtYXkgYmUgYWx0ZXJlZCBpbiB2YWxpZGF0ZQogCiAgICAgICAgIHRyeSB7Ci0KICAgICAgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHVzZXJMaXN0ID0gbmV3IFByb3BlcnRpZXMoKTsKIAogICAgICAgICAgICAgbG9hZFVzZXJsaXN0KHVzZXJMaXN0KTsKIAotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBjdnNVc2Vycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIEN2c1VzZXIgdXNlciA9IChDdnNVc2VyKSBjdnNVc2Vycy5nZXQoaSk7CisgICAgICAgICAgICBmb3IgKEN2c1VzZXIgdXNlciA6IGN2c1VzZXJzKSB7CiAgICAgICAgICAgICAgICAgdXNlci52YWxpZGF0ZSgpOwogICAgICAgICAgICAgICAgIHVzZXJMaXN0LnB1dCh1c2VyLmdldFVzZXJJRCgpLCB1c2VyLmdldERpc3BsYXluYW1lKCkpOwogICAgICAgICAgICAgfQpAQCAtMjgzLDE4ICsyNzIsMTEgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdCBvZiBmaWxlcyB0byBjaGVjayBoYXMgYmVlbiBzcGVjaWZpZWQKLSAgICAgICAgICAgIGlmICghZmlsZXNldHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb24gZSA9IGZpbGVzZXRzLmVsZW1lbnRzKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlU2V0IGZpbGVTZXQgPSAoRmlsZVNldCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ29tbWFuZEFyZ3VtZW50KGZpbGVzW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChGaWxlU2V0IGZpbGVTZXQgOiBmaWxlc2V0cykgeworICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9CisgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBhZGRDb21tYW5kQXJndW1lbnQoZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0zNDAsMjcgKzMyMiwyMCBAQAogICAgICAgICAgICAgaW5wdXREaXIgPSBnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpOwogICAgICAgICB9CiAgICAgICAgIGlmIChudWxsID09IGRlc3RGaWxlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJEZXN0ZmlsZSBtdXN0IGJlIHNldC4iOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3RmaWxlIG11c3QgYmUgc2V0LiIpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaW5wdXREaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkNhbm5vdCBmaW5kIGJhc2UgZGlyICIKLSAgICAgICAgICAgICAgICAgKyBpbnB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBiYXNlIGRpciAlcyIsCisgICAgICAgICAgICAgICAgaW5wdXREaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChudWxsICE9IHVzZXJzRmlsZSAmJiAhdXNlcnNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgZmluZCB1c2VyIGxvb2t1cCBsaXN0ICIKLSAgICAgICAgICAgICAgICAgKyB1c2Vyc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgdXNlciBsb29rdXAgbGlzdCAlcyIsCisgICAgICAgICAgICAgICAgdXNlcnNGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoKG51bGwgIT0gc3RhcnRUYWcgfHwgbnVsbCAhPSBlbmRUYWcpCiAgICAgICAgICAgICAmJiAobnVsbCAhPSBzdGFydERhdGUgfHwgbnVsbCAhPSBlbmREYXRlKSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiU3BlY2lmeSBlaXRoZXIgYSB0YWcgb3IgZGF0ZSByYW5nZSwiCi0gICAgICAgICAgICAgICAgKyAiIG5vdCBib3RoIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiU3BlY2lmeSBlaXRoZXIgYSB0YWcgb3IgZGF0ZSByYW5nZSwgbm90IGJvdGgiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc1LDcgKzM1MCw3IEBACiAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobnVsbCAhPSB1c2Vyc0ZpbGUpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdXNlckxpc3QubG9hZChuZXcgRmlsZUlucHV0U3RyZWFtKHVzZXJzRmlsZSkpOworICAgICAgICAgICAgICAgIHVzZXJMaXN0LmxvYWQoRmlsZXMubmV3SW5wdXRTdHJlYW0odXNlcnNGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLnRvU3RyaW5nKCksIGlvZSk7CiAgICAgICAgICAgICB9CkBAIC0zODksMjMgKzM2NCwxNiBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbHRlcmVkIGVudHJ5IHNldAogICAgICAqLwogICAgIHByaXZhdGUgQ1ZTRW50cnlbXSBmaWx0ZXJFbnRyeVNldChmaW5hbCBDVlNFbnRyeVtdIGVudHJ5U2V0KSB7Ci0gICAgICAgIGZpbmFsIFZlY3RvciByZXN1bHRzID0gbmV3IFZlY3RvcigpOworICAgICAgICBmaW5hbCBMaXN0PENWU0VudHJ5PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyeVNldC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgQ1ZTRW50cnkgY3ZzRW50cnkgPSBlbnRyeVNldFtpXTsKKyAgICAgICAgZm9yIChDVlNFbnRyeSBjdnNFbnRyeSA6IGVudHJ5U2V0KSB7CiAgICAgICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBjdnNFbnRyeS5nZXREYXRlKCk7CiAKICAgICAgICAgICAgIC8vYnVnIzMwNDcxCiAgICAgICAgICAgICAvL3RoaXMgaXMgY2F1c2VkIGJ5IERhdGUuYWZ0ZXIgdGhyb3dpbmcgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbgogICAgICAgICAgICAgLy9mb3Igc29tZSByZWFzb24gdGhlcmUncyBubyBkYXRlIHNldCBpbiB0aGUgQ1ZTRW50cnkKLSAgICAgICAgICAgIC8vSmF2YSAxLjMuMSBBUEkKLSAgICAgICAgICAgIC8vaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2FwaS9qYXZhL3V0aWwvRGF0ZS5odG1sI2FmdGVyKGphdmEudXRpbC5EYXRlKQotICAgICAgICAgICAgLy9kb2Vzbid0IHRocm93IE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICAgICAgICAvL0phdmEgMS40LjIgKyAxLjUgQVBJCi0gICAgICAgICAgICAvL2h0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjQuMi9kb2NzL2FwaS9qYXZhL3V0aWwvRGF0ZS5odG1sI2FmdGVyKGphdmEudXRpbC5EYXRlKQotICAgICAgICAgICAgLy9hY2NvcmRpbmcgdG8gdGhlIGRvY3MgaXQgZG9lc24ndCB0aHJvdywgYWNjb3JkaW5nIHRvIHRoZSBidWcgcmVwb3J0IGl0IGRvZXMKLSAgICAgICAgICAgIC8vaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvYXBpL2phdmEvdXRpbC9EYXRlLmh0bWwjYWZ0ZXIoamF2YS51dGlsLkRhdGUpCi0gICAgICAgICAgICAvL2FjY29yZGluZyB0byB0aGUgZG9jcyBpdCBkb2VzIHRocm93CisgICAgICAgICAgICAvL2h0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS8xLjUuMC9kb2NzL2FwaS9qYXZhL3V0aWwvRGF0ZS5odG1sI2FmdGVyKGphdmEudXRpbC5EYXRlKQorICAgICAgICAgICAgLy9hY2NvcmRpbmcgdG8gdGhlIGRvY3MgYXMgb2YgMS41IGl0IGRvZXMgdGhyb3cKIAogICAgICAgICAgICAgLy9mb3Igbm93IHNraXAgZW50cmllcyB3aGljaCBhcmUgbWlzc2luZyBhIGRhdGUKICAgICAgICAgICAgIGlmIChudWxsID09IGRhdGUpIHsKQEAgLTQyMCwxMyArMzg4LDEwIEBACiAgICAgICAgICAgICAgICAgLy9Ta2lwIGRhdGVzIHRoYXQgYXJlIHRvbyBsYXRlCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHRzLmFkZEVsZW1lbnQoY3ZzRW50cnkpOworICAgICAgICAgICAgcmVzdWx0cy5hZGQoY3ZzRW50cnkpOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgQ1ZTRW50cnlbXSByZXN1bHRBcnJheSA9IG5ldyBDVlNFbnRyeVtyZXN1bHRzLnNpemUoKV07Ci0KLSAgICAgICAgcmVzdWx0cy5jb3B5SW50byhyZXN1bHRBcnJheSk7Ci0gICAgICAgIHJldHVybiByZXN1bHRBcnJheTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMudG9BcnJheShuZXcgQ1ZTRW50cnlbcmVzdWx0cy5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzNCw5ICszOTksNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZXBsYWNlQXV0aG9ySWRXaXRoTmFtZShmaW5hbCBQcm9wZXJ0aWVzIHVzZXJMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDVlNFbnRyeVtdIGVudHJ5U2V0KSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cnlTZXQubGVuZ3RoOyBpKyspIHsKLQotICAgICAgICAgICAgZmluYWwgQ1ZTRW50cnkgZW50cnkgPSBlbnRyeVNldFsgaSBdOworICAgICAgICBmb3IgKGZpbmFsIENWU0VudHJ5IGVudHJ5IDogZW50cnlTZXQpIHsKICAgICAgICAgICAgIGlmICh1c2VyTGlzdC5jb250YWluc0tleShlbnRyeS5nZXRBdXRob3IoKSkpIHsKICAgICAgICAgICAgICAgICBlbnRyeS5zZXRBdXRob3IodXNlckxpc3QuZ2V0UHJvcGVydHkoZW50cnkuZ2V0QXV0aG9yKCkpKTsKICAgICAgICAgICAgIH0KQEAgLTQ1MSwxNyArNDE0LDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2hhbmdlTG9nKGZpbmFsIENWU0VudHJ5W10gZW50cnlTZXQpCiAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dHB1dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKKyAgICAgICAgdHJ5IChmaW5hbCBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoCisgICAgICAgICAgICBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKEZpbGVzLm5ld091dHB1dFN0cmVhbShkZXN0RmlsZS50b1BhdGgoKSksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSkgewogCi0gICAgICAgICAgICBmaW5hbCBQcmludFdyaXRlciB3cml0ZXIgPQotICAgICAgICAgICAgICAgIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dCwgIlVURi04IikpOwotCi0gICAgICAgICAgICBmaW5hbCBDaGFuZ2VMb2dXcml0ZXIgc2VyaWFsaXplciA9IG5ldyBDaGFuZ2VMb2dXcml0ZXIoKTsKLQotICAgICAgICAgICAgc2VyaWFsaXplci5wcmludENoYW5nZUxvZyh3cml0ZXIsIGVudHJ5U2V0KTsKKyAgICAgICAgICAgIG5ldyBDaGFuZ2VMb2dXcml0ZXIoKS5wcmludENoYW5nZUxvZyh3cml0ZXIsIGVudHJ5U2V0KTsKIAogICAgICAgICAgICAgaWYgKHdyaXRlci5jaGVja0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuY291bnRlcmVkIGFuIGVycm9yIHdyaXRpbmcgY2hhbmdlbG9nIik7CkBAIC00NzAsOSArNDI3LDYgQEAKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2codWVlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZS50b1N0cmluZygpLCBpb2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dHB1dCk7CiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dXcml0ZXIuamF2YQppbmRleCBjZTkyMzI3Li5jNjUyNjFkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NoYW5nZUxvZ1dyaXRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsOSArMjAsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5ET01FbGVtZW50V3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NVXRpbHM7CiBpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CkBAIC0zNiw5ICszNiwxMSBAQAogICAgIC8qKiBvdXRwdXQgZm9ybWF0IGZvciBkYXRlcyB3cml0dGVuIHRvIHhtbCBmaWxlICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IG91dHB1dERhdGUKICAgICAgICAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCIpOworCiAgICAgLyoqIG91dHB1dCBmb3JtYXQgZm9yIHRpbWVzIHdyaXR0ZW4gdG8geG1sIGZpbGUgKi8KICAgICBwcml2YXRlIFNpbXBsZURhdGVGb3JtYXQgb3V0cHV0VGltZQogICAgICAgICA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJISDptbSIpOworCiAgICAgLyoqIHN0YXRlbGVzcyBoZWxwZXIgZm9yIHdyaXRpbmcgdGhlIFhNTCBkb2N1bWVudCAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERPTUVsZW1lbnRXcml0ZXIgRE9NX1dSSVRFUiA9IG5ldyBET01FbGVtZW50V3JpdGVyKCk7CiAKQEAgLTYyLDIwICs2NCwxNyBAQAogICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoImNoYW5nZWxvZyIpOwogICAgICAgICAgICAgRE9NX1dSSVRFUi5vcGVuRWxlbWVudChyb290LCBvdXRwdXQsIDAsICJcdCIpOwogICAgICAgICAgICAgb3V0cHV0LnByaW50bG4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIENWU0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQorICAgICAgICAgICAgZm9yIChmaW5hbCBDVlNFbnRyeSBlbnRyeSA6IGVudHJpZXMpIHsKICAgICAgICAgICAgICAgICBwcmludEVudHJ5KGRvYywgb3V0cHV0LCBlbnRyeSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBET01fV1JJVEVSLmNsb3NlRWxlbWVudChyb290LCBvdXRwdXQsIDAsICJcdCIsIHRydWUpOwogICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCk7CiAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBQcmludCBvdXQgYW4gaW5kaXZpZHVhbCBlbnRyeSBpbiBjaGFuZ2Vsb2cuCiAgICAgICoKQEAgLTkyLDExICs5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFRpbWUuZm9ybWF0KGVudHJ5LmdldERhdGUoKSkpOwogICAgICAgICBET01VdGlscy5hcHBlbmRDREFUQUVsZW1lbnQoZW50LCAiYXV0aG9yIiwgZW50cnkuZ2V0QXV0aG9yKCkpOwogCi0gICAgICAgIGZpbmFsIEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZW50cnkuZ2V0RmlsZXMoKS5lbGVtZW50cygpOwotCi0gICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZmluYWwgUkNTRmlsZSBmaWxlID0gKFJDU0ZpbGUpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0KKyAgICAgICAgZm9yIChSQ1NGaWxlIGZpbGUgOiBlbnRyeS5nZXRGaWxlcygpKSB7CiAgICAgICAgICAgICBFbGVtZW50IGYgPSBET01VdGlscy5jcmVhdGVDaGlsZEVsZW1lbnQoZW50LCAiZmlsZSIpOwogICAgICAgICAgICAgRE9NVXRpbHMuYXBwZW5kQ0RBVEFFbGVtZW50KGYsICJuYW1lIiwgZmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgRE9NVXRpbHMuYXBwZW5kVGV4dEVsZW1lbnQoZiwgInJldmlzaW9uIiwgZmlsZS5nZXRSZXZpc2lvbigpKTsKQEAgLTExMSw0ICsxMDYsMyBAQAogICAgICAgICBET01fV1JJVEVSLndyaXRlKGVudCwgb3V0cHV0LCAxLCAiXHQiKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNUYWdEaWZmLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ3ZzVGFnRGlmZi5qYXZhCmluZGV4IDM5NDEzMDQuLmUwMWRkNmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNUYWdEaWZmLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0RpZmYuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDIyICsxOSwyMCBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQWJzdHJhY3RDdnNUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwpAQCAtMTUxLDcgKzE0OSw3IEBACiAgICAgLyoqCiAgICAgICogdGVtcG9yYXJ5IGxpc3Qgb2YgcGFja2FnZSBuYW1lcy4KICAgICAgKi8KLSAgICBwcml2YXRlIExpc3QgcGFja2FnZU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHBhY2thZ2VOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogdGVtcG9yYXJ5IGxpc3Qgb2YgIkZpbGU6IiArIHBhY2thZ2UgbmFtZSArICIvIiBmb3IgYWxsIHBhY2thZ2VzLgpAQCAtMjI4LDcgKzIyNiw2IEBACiAgICAgICAgIGlnbm9yZVJlbW92ZWQgPSBiOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRXhlY3V0ZSB0YXNrLgogICAgICAqCkBAIC0yOTYsMTAgKzI5Myw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBDdnNUYWdFbnRyeVtdIHBhcnNlUkRpZmYoRmlsZSB0bXBGaWxlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyBwYXJzZSB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG51bGw7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih0bXBGaWxlKSk7IC8vTk9TT05BUgorICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodG1wRmlsZSkpKSB7CiAKICAgICAgICAgICAgIC8vIGVudHJpZXMgYXJlIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgLy9DVlMgMS4xMQpAQCAtMzE1LDcgKzMxMSw3IEBACiAgICAgICAgICAgICAvLyBGaWxlIHRlc3RhbnRvaW5lL2FudG9pbmUuYmF0IGlzIHJlbW92ZWQ7IFRFU1RBTlRPSU5FXzEgcmV2aXNpb24gMS4xLjEuMQogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIGdldCByaWQgb2YgJ0ZpbGUgbW9kdWxlLyIKLSAgICAgICAgICAgIFZlY3RvciBlbnRyaWVzID0gbmV3IFZlY3RvcigpOworICAgICAgICAgICAgTGlzdDxDdnNUYWdFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwogCkBAIC0zMjQsNiArMzIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWVQcmVmaXhMZW5ndGhzKTsKICAgICAgICAgICAgICAgICBpZiAobGluZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB8fCBpbiBhIHBlcmwgbGlrZSBmYXNoaW9uCisgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NlZAogICAgICAgICAgICAgICAgICAgICAgICAgPSAgZG9GaWxlSXNOZXcoZW50cmllcywgbGluZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGRvRmlsZUhhc0NoYW5nZWQoZW50cmllcywgbGluZSkKQEAgLTMzMiwyNCArMzI5LDEzIEBACiAgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDdnNUYWdFbnRyeVtdIGFycmF5ID0gbmV3IEN2c1RhZ0VudHJ5W2VudHJpZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgIGVudHJpZXMuY29weUludG8oYXJyYXkpOwotCi0gICAgICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgICAgICAgICByZXR1cm4gZW50cmllcy50b0FycmF5KG5ldyBDdnNUYWdFbnRyeVtlbnRyaWVzLnNpemUoKV0pOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIGluIHBhcnNpbmciLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gZG9GaWxlSXNOZXcoVmVjdG9yIGVudHJpZXMsIFN0cmluZyBsaW5lKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZUlzTmV3KExpc3Q8Q3ZzVGFnRW50cnk+IGVudHJpZXMsIFN0cmluZyBsaW5lKSB7CiAgICAgICAgIGludCBpbmRleCA9IGxpbmUuaW5kZXhPZihGSUxFX0lTX05FVyk7CiAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzYzLDEyICszNDksMTIgQEAKICAgICAgICAgICAgIHJldiA9IGxpbmUuc3Vic3RyaW5nKGluZGV4cmV2ICsgUkVWSVNJT04ubGVuZ3RoKCkpOwogICAgICAgICB9CiAgICAgICAgIEN2c1RhZ0VudHJ5IGVudHJ5ID0gbmV3IEN2c1RhZ0VudHJ5KGZpbGVuYW1lLCByZXYpOwotICAgICAgICBlbnRyaWVzLmFkZEVsZW1lbnQoZW50cnkpOworICAgICAgICBlbnRyaWVzLmFkZChlbnRyeSk7CiAgICAgICAgIGxvZyhlbnRyeS50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZUhhc0NoYW5nZWQoVmVjdG9yIGVudHJpZXMsIFN0cmluZyBsaW5lKSB7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvRmlsZUhhc0NoYW5nZWQoTGlzdDxDdnNUYWdFbnRyeT4gZW50cmllcywgU3RyaW5nIGxpbmUpIHsKICAgICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKEZJTEVfSEFTX0NIQU5HRUQpOwogICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM4NCwxMiArMzcwLDEyIEBACiAgICAgICAgIEN2c1RhZ0VudHJ5IGVudHJ5ID0gbmV3IEN2c1RhZ0VudHJ5KGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZpc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlJldmlzaW9uKTsKLSAgICAgICAgZW50cmllcy5hZGRFbGVtZW50KGVudHJ5KTsKKyAgICAgICAgZW50cmllcy5hZGQoZW50cnkpOwogICAgICAgICBsb2coZW50cnkudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIHByaXZhdGUgYm9vbGVhbiBkb0ZpbGVXYXNSZW1vdmVkKFZlY3RvciBlbnRyaWVzLCBTdHJpbmcgbGluZSkgeworICAgIHByaXZhdGUgYm9vbGVhbiBkb0ZpbGVXYXNSZW1vdmVkKExpc3Q8Q3ZzVGFnRW50cnk+IGVudHJpZXMsIFN0cmluZyBsaW5lKSB7CiAgICAgICAgIGlmIChpZ25vcmVSZW1vdmVkKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTQwNSw3ICszOTEsNyBAQAogICAgICAgICAgICAgcmV2ID0gbGluZS5zdWJzdHJpbmcoaW5kZXhyZXYgKyBSRVZJU0lPTi5sZW5ndGgoKSk7CiAgICAgICAgIH0KICAgICAgICAgQ3ZzVGFnRW50cnkgZW50cnkgPSBuZXcgQ3ZzVGFnRW50cnkoZmlsZW5hbWUsIG51bGwsIHJldik7Ci0gICAgICAgIGVudHJpZXMuYWRkRWxlbWVudChlbnRyeSk7CisgICAgICAgIGVudHJpZXMuYWRkKGVudHJ5KTsKICAgICAgICAgbG9nKGVudHJ5LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC00MTcsMTEgKzQwMyw4IEBACiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVUYWdEaWZmKEN2c1RhZ0VudHJ5W10gZW50cmllcykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obXlkZXN0ZmlsZSk7Ci0gICAgICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsICJVVEYtOCIpKTsKKyAgICAgICAgdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgIEZpbGVzLm5ld091dHB1dFN0cmVhbShteWRlc3RmaWxlLnRvUGF0aCgpKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpKSB7CiAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7CiAgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBET01VdGlscy5uZXdEb2N1bWVudCgpOwogICAgICAgICAgICAgRWxlbWVudCByb290ID0gZG9jLmNyZWF0ZUVsZW1lbnQoInRhZ2RpZmYiKTsKQEAgLTQzOCw3ICs0MjEsNyBAQAogCiAgICAgICAgICAgICByb290LnNldEF0dHJpYnV0ZSgiY3Zzcm9vdCIsIGdldEN2c1Jvb3QoKSk7CiAgICAgICAgICAgICByb290LnNldEF0dHJpYnV0ZSgicGFja2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uVXRpbHMuZmxhdHRlblRvU3RyaW5nKHBhY2thZ2VOYW1lcykpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcuam9pbigiLCIsIHBhY2thZ2VOYW1lcykpOwogICAgICAgICAgICAgRE9NX1dSSVRFUi5vcGVuRWxlbWVudChyb290LCB3cml0ZXIsIDAsICJcdCIpOwogICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oKTsKICAgICAgICAgICAgIGZvciAoQ3ZzVGFnRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7CkBAIC00NDksMTkgKzQzMiwxMCBAQAogICAgICAgICAgICAgaWYgKHdyaXRlci5jaGVja0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuY291bnRlcmVkIGFuIGVycm9yIHdyaXRpbmcgdGFnZGlmZiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CiAgICAgICAgICAgICBsb2codWVlLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZS50b1N0cmluZygpLCBpb2UpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKG51bGwgIT0gb3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhpb2UudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5NCw3ICs0NjgsNyBAQAogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYSBwYXJhbWV0ZXIgaXMgbm90IGNvcnJlY3RseSBzZXQKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBpZiAobnVsbCA9PSBteXBhY2thZ2UgJiYgZ2V0TW9kdWxlcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmIChudWxsID09IG15cGFja2FnZSAmJiBnZXRNb2R1bGVzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBhY2thZ2UvbW9kdWxlIG11c3QgYmUgc2V0LiIpOwogICAgICAgICB9CiAKQEAgLTUwNyw4ICs0ODEsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG51bGwgIT0gbXlzdGFydFRhZyAmJiBudWxsICE9IG15c3RhcnREYXRlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIHN0YXJ0IHRhZyBhbmQgc3RhcnQgZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBiZSBzZXQuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIG9mIHN0YXJ0IHRhZyBhbmQgc3RhcnQgZGF0ZSBtdXN0IGJlIHNldC4iKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsID09IG15ZW5kVGFnICYmIG51bGwgPT0gbXllbmREYXRlKSB7CkBAIC01MTYsOCArNDkwLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsICE9IG15ZW5kVGFnICYmIG51bGwgIT0gbXllbmREYXRlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG9mIGVuZCB0YWcgYW5kIGVuZCBkYXRlIG11c3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIHNldC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgb2YgZW5kIHRhZyBhbmQgZW5kIGRhdGUgbXVzdCBiZSBzZXQuIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUzNSw4ICs1MDksNyBAQAogICAgICAgICAgICAgICAgIGFkZENvbW1hbmRBcmd1bWVudChwYWNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNb2R1bGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBYnN0cmFjdEN2c1Rhc2suTW9kdWxlIG0gPSAoQWJzdHJhY3RDdnNUYXNrLk1vZHVsZSkgaXRlci5uZXh0KCk7CisgICAgICAgIGZvciAoTW9kdWxlIG0gOiBnZXRNb2R1bGVzKCkpIHsKICAgICAgICAgICAgIHBhY2thZ2VOYW1lcy5hZGQobS5nZXROYW1lKCkpOwogICAgICAgICAgICAgLy8gd2lsbCBiZSBhZGRlZCB0byBjb21tYW5kIGxpbmUgaW4gc3VwZXIuZXhlY3V0ZSgpCiAgICAgICAgIH0KQEAgLTU0OCw3ICs1MjEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiByZW1vdmVzIGEgIkZpbGU6IG1vZHVsZS8iIHByZWZpeCBpZiBwcmVzZW50LgogICAgICAqCkBAIC01NjAsMTcgKzUzMiwxMSBAQAogICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA8IEZJTEVfU1RSSU5HX0xFTkdUSCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBtYXRjaGVkID0gZmFsc2U7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZVByZWZpeGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKHBhY2thZ2VQcmVmaXhlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdWJzdHJpbmcocHJlZml4TGVuZ3Roc1tpXSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuc3Vic3RyaW5nKHByZWZpeExlbmd0aHNbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICghbWF0Y2hlZCkgewotICAgICAgICAgICAgbGluZSA9IGxpbmUuc3Vic3RyaW5nKEZJTEVfU1RSSU5HX0xFTkdUSCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpbmU7CisgICAgICAgIHJldHVybiBsaW5lLnN1YnN0cmluZyhGSUxFX1NUUklOR19MRU5HVEgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNUYWdFbnRyeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0VudHJ5LmphdmEKaW5kZXggNmUzNDljNy4uZDFlNWQ3YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0VudHJ5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1RhZ0VudHJ5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04OSw4ICs4OSw5IEBACiAgICAgICogR2V0cyBhIFN0cmluZyBjb250YWluaW5nIGZpbGVuYW1lIGFuZCBkaWZmZXJlbmNlIGZyb20gcHJldmlvdXMgdmVyc2lvbgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBDVlNUYWdFbnRyeQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgYnVmZmVyLmFwcGVuZChmaWxlbmFtZSk7CiAgICAgICAgIGlmIChyZXZpc2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKCIgd2FzIHJlbW92ZWQiKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNVc2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ3ZzVXNlci5qYXZhCmluZGV4IDg1YTJmYzYuLjg1ZWRjOTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNVc2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1VzZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDEwICsyNiwxMCBAQAogcHVibGljIGNsYXNzIEN2c1VzZXIgewogICAgIC8qKiBUaGUgdXNlcidzIElkICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcklEOworCiAgICAgLyoqIFRoZSB1c2VyJ3MgZnVsbCBuYW1lICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgdXNlcidzIGZ1bGxuYW1lCiAgICAgICoKQEAgLTM5LDcgKzM5LDYgQEAKICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB1c2VyJ3MgaWQKICAgICAgKgpAQCAtNDksNyArNDgsNiBAQAogICAgICAgICB0aGlzLnVzZXJJRCA9IHVzZXJJRDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgdXNlcidzIGlkLgogICAgICAqCkBAIC01OSw3ICs1Nyw2IEBACiAgICAgICAgIHJldHVybiB1c2VySUQ7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHVzZXIncyBmdWxsIG5hbWUKICAgICAgKgpAQCAtNjksNyArNjYsNiBAQAogICAgICAgICByZXR1cm4gZGlzcGxheU5hbWU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBWYWxpZGF0ZSB0aGF0IHRoaXMgb2JqZWN0IGlzIGNvbmZpZ3VyZWQuCiAgICAgICoKQEAgLTc4LDE2ICs3NCwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgPT0gdXNlcklEKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJVc2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIjsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVc2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG51bGwgPT0gZGlzcGxheU5hbWUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICAiRGlzcGxheW5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciB1c2VySUQgIiArIHVzZXJJRDsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJEaXNwbGF5bmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHVzZXJJRCAlcyIsIHVzZXJJRCk7CiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNWZXJzaW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ3ZzVmVyc2lvbi5qYXZhCmluZGV4IDYxOGRhNGUuLmJhZDY4YjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DdnNWZXJzaW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0N2c1ZlcnNpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQzLDYgKzQzLDcgQEAKIHB1YmxpYyBjbGFzcyBDdnNWZXJzaW9uIGV4dGVuZHMgQWJzdHJhY3RDdnNUYXNrIHsKICAgICBzdGF0aWMgZmluYWwgbG9uZyBWRVJTSU9OXzFfMTFfMiA9IDExMTAyOwogICAgIHN0YXRpYyBmaW5hbCBsb25nIE1VTFRJUExZID0gMTAwOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgY2xpZW50VmVyc2lvbjsKICAgICBwcml2YXRlIFN0cmluZyBzZXJ2ZXJWZXJzaW9uOwogICAgIHByaXZhdGUgU3RyaW5nIGNsaWVudFZlcnNpb25Qcm9wZXJ0eTsKQEAgLTU1LDYgKzU2LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudFZlcnNpb24oKSB7CiAgICAgICAgIHJldHVybiBjbGllbnRWZXJzaW9uOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgQ1ZTIHNlcnZlciB2ZXJzaW9uCiAgICAgICogQHJldHVybiBDVlMgc2VydmVyIHZlcnNpb24KQEAgLTYyLDYgKzY0LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlclZlcnNpb24oKSB7CiAgICAgICAgIHJldHVybiBzZXJ2ZXJWZXJzaW9uOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldCBhIHByb3BlcnR5IHdoZXJlIHRvIHN0b3JlIHRoZSBDVlMgY2xpZW50IHZlcnNpb24KICAgICAgKiBAcGFyYW0gY2xpZW50VmVyc2lvblByb3BlcnR5ICBwcm9wZXJ0eSBmb3IgQ1ZTIGNsaWVudCB2ZXJzaW9uCkBAIC03Nyw2ICs4MCw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0U2VydmVyVmVyc2lvblByb3BlcnR5KFN0cmluZyBzZXJ2ZXJWZXJzaW9uUHJvcGVydHkpIHsKICAgICAgICAgdGhpcy5zZXJ2ZXJWZXJzaW9uUHJvcGVydHkgPSBzZXJ2ZXJWZXJzaW9uUHJvcGVydHk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogRmluZCBvdXQgaWYgdGhlIHNlcnZlciB2ZXJzaW9uIHN1cHBvcnRzIGxvZyB3aXRoIFMgb3B0aW9uCiAgICAgICogQHJldHVybiAgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBzZXJ2ZXIgdmVyc2lvbiBzdXBwb3J0cyBsb2cgd2l0aCBTIG9wdGlvbgpAQCAtOTAsMjQgKzk0LDI2IEBACiAgICAgICAgIGxvbmcgdmVyc2lvbiA9IDA7CiAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICBTdHJpbmcgcyA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgIGlmICghQ2hhcmFjdGVyLmlzRGlnaXQocy5jaGFyQXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZyBzMiA9IHMuc3Vic3RyaW5nKDAsIGkpOwotICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyBjb3VudGVyICogTG9uZy5wYXJzZUxvbmcoczIpOworICAgICAgICAgICAgdmVyc2lvbiArPSBjb3VudGVyICogTG9uZy5wYXJzZUxvbmcoczIpOwogICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT0gMSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgLyBNVUxUSVBMWTsKKyAgICAgICAgICAgIGNvdW50ZXIgLz0gTVVMVElQTFk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2ZXJzaW9uID49IFZFUlNJT05fMV8xMV8yKTsKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gPj0gVkVSU0lPTl8xXzExXzI7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogdGhlIGV4ZWN1dGUgbWV0aG9kIHJ1bm5pbmcgQ3ZzVmVyc2lvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRoaXMuc2V0T3V0cHV0U3RyZWFtKGJvcyk7CkBAIC0xMjcsOSArMTMzLDkgQEAKICAgICAgICAgd2hpbGUgKGhhdmVSZWFkQWhlYWQgfHwgc3QuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFRva2VuID0gaGF2ZVJlYWRBaGVhZCA/IGNhY2hlZFZlcnNpb24gOiBzdC5uZXh0VG9rZW4oKTsKICAgICAgICAgICAgIGhhdmVSZWFkQWhlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50VG9rZW4uZXF1YWxzKCJDbGllbnQ6IikpIHsKKyAgICAgICAgICAgIGlmICgiQ2xpZW50OiIuZXF1YWxzKGN1cnJlbnRUb2tlbikpIHsKICAgICAgICAgICAgICAgICBjbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50VG9rZW4uZXF1YWxzKCJTZXJ2ZXI6IikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIlNlcnZlcjoiLmVxdWFscyhjdXJyZW50VG9rZW4pKSB7CiAgICAgICAgICAgICAgICAgc2VydmVyID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRva2VuLnN0YXJ0c1dpdGgoIihDVlMiKQogICAgICAgICAgICAgICAgICAgICAgICAmJiBjdXJyZW50VG9rZW4uZW5kc1dpdGgoIikiKSkgewpAQCAtMTUxLDcgKzE1Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNlcnZlciA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGN2cyA9IG51bGw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoIihjbGllbnQvc2VydmVyKSIpCisgICAgICAgICAgICB9IGVsc2UgaWYgKCIoY2xpZW50L3NlcnZlcikiLmVxdWFscyhjdXJyZW50VG9rZW4pCiAgICAgICAgICAgICAgICAgICAgICAgICYmIGN2cyAhPSBudWxsICYmIGNhY2hlZFZlcnNpb24gIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAmJiAhY2xpZW50ICYmICFzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgICBjbGllbnQgPSBzZXJ2ZXIgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JDU0ZpbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9SQ1NGaWxlLmphdmEKaW5kZXggNzBhOGNmMy4uMmFhNDJjZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JDU0ZpbGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUkNTRmlsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjYsMTIgKzI2LDEwIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgcmV2aXNpb247CiAgICAgcHJpdmF0ZSBTdHJpbmcgcHJldmlvdXNSZXZpc2lvbjsKIAotCi0gICAgUkNTRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHJldikgewotICAgICAgICB0aGlzKG5hbWUsIHJldiwgbnVsbCk7CisgICAgUkNTRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHJldmlzaW9uKSB7CisgICAgICAgIHRoaXMobmFtZSwgcmV2aXNpb24sIG51bGwpOwogICAgIH0KIAotCiAgICAgUkNTRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwKICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXZpc2lvbiwKICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2aW91c1JldmlzaW9uKSB7CkBAIC02Niw0ICs2NCwzIEBACiAgICAgICAgIHJldHVybiBwcmV2aW91c1JldmlzaW9uOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JlZGlyZWN0aW5nT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdPdXRwdXRTdHJlYW0uamF2YQppbmRleCBmMmI2MWNmLi4yZjRjZGY1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdPdXRwdXRTdHJlYW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDggKzM5LDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBsaW5lIHRoZSBsaW5lIHRvIGxvZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShmaW5hbCBTdHJpbmcgbGluZSkgewogICAgICAgICBwYXJzZXIuc3Rkb3V0KGxpbmUpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JlZGlyZWN0aW5nU3RyZWFtSGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL1JlZGlyZWN0aW5nU3RyZWFtSGFuZGxlci5qYXZhCmluZGV4IDcxM2RlMGMuLjAyMWViNWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9SZWRpcmVjdGluZ1N0cmVhbUhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvUmVkaXJlY3RpbmdTdHJlYW1IYW5kbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMCArMTgsOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWI7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuUHVtcFN0cmVhbUhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogQSBkdW1teSBzdHJlYW0gaGFuZGxlciB0aGF0IGp1c3QgcGFzc2VzIHN0dWZmIHRvIHRoZSBwYXJzZXIuCkBAIC0zNCw3ICszMyw2IEBACiAgICAgICAgICAgICBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOwogICAgIH0KIAotCiAgICAgU3RyaW5nIGdldEVycm9ycygpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBlcnJvcgpAQCAtNDYsMTYgKzQ0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CiAgICAgICAgIHN1cGVyLnN0b3AoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGdldEVycigpLmNsb3NlKCk7Ci0gICAgICAgICAgICBnZXRPdXQoKS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBwbGFpbiBpbXBvc3NpYmxlCi0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGdldEVycigpKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGdldE91dCgpKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzCmluZGV4IDljZjE0OTkuLjc5MWQ4ZDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RlZmF1bHRzLnByb3BlcnRpZXMKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGVmYXVsdHMucHJvcGVydGllcwpAQCAtNSw3ICs1LDcgQEAKICMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw2IEBACiBhbnRzdHJ1Y3R1cmU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQW50U3RydWN0dXJlCiBhbnR2ZXJzaW9uPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5BbnRWZXJzaW9uCiBhcHBseT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5UcmFuc2Zvcm0KLWFwdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BcHQKIGF0dHJpYnV0ZW5hbWVzcGFjZWRlZj1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5BdHRyaWJ1dGVOYW1lc3BhY2VEZWYKIGF1Z21lbnQ9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQXVnbWVudFJlZmVyZW5jZQogYXZhaWxhYmxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkF2YWlsYWJsZQpAQCAtNjcsNiArNjYsOCBAQAogamF2YT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhCiBqYXZhYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYwogamF2YWRvYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhZG9jCitqbW9kPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm1vZHVsZXMuSm1vZAorbGluaz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5tb2R1bGVzLkxpbmsKIGxlbmd0aD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5MZW5ndGgKIGxvYWRmaWxlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvYWRGaWxlCiBsb2FkcHJvcGVydGllcz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5Mb2FkUHJvcGVydGllcwpAQCAtOTIsNiArOTMsNyBAQAogcmVzb3VyY2Vjb3VudD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXNvdXJjZUNvdW50CiByZXRyeT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SZXRyeQogcm1pYz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5SbWljCitzZXRwZXJtaXNzaW9ucz1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXRQZXJtaXNzaW9ucwogc2VxdWVudGlhbD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5TZXF1ZW50aWFsCiBzaWduamFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNpZ25KYXIKIHNsZWVwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlNsZWVwCkBAIC0xMDgsNiArMTEwLDcgQEAKIHVuamFyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZAogdW50YXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuVW50YXIKIHVud2FyPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4cGFuZAordW54ej1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC54ei5Vbnh6CiB1bnppcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeHBhbmQKIHVwdG9kYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlVwVG9EYXRlCiB3YWl0Zm9yPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLldhaXRGb3IKQEAgLTExNSw2ICsxMTgsNyBAQAogd2hpY2hyZXNvdXJjZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5XaGljaFJlc291cmNlCiB4bWxwcm9wZXJ0eT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YbWxQcm9wZXJ0eQogeHNsdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5YU0xUUHJvY2VzcworeHo9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwueHouWHoKIHppcD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5aaXAKIAogIyBvcHRpb25hbCB0YXNrcwpAQCAtMTQ2LDYgKzE1MCw3IEBACiBlamJqYXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkVqYkphcgogZnRwPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldC5GVFAKIGltYWdlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlCitpbWFnZWlvPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlSU9UYXNrCiBpcGxhbmV0LWVqYmM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLklQbGFuZXRFamJjVGFzawogamFybGliLWF2YWlsYWJsZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24uSmFyTGliQXZhaWxhYmxlVGFzawogamFybGliLWRpc3BsYXk9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLkphckxpYkRpc3BsYXlUYXNrCkBAIC0xNTgsNiArMTYzLDcgQEAKIGpqdHJlZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MuSkpUcmVlCiBqdW5pdD1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2sKIGp1bml0cmVwb3J0PW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTFJlc3VsdEFnZ3JlZ2F0b3IKK2p1bml0bGF1bmNoZXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5KVW5pdExhdW5jaGVyVGFzawogbmF0aXZlMmFzY2lpPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaQogbmV0cmV4eGM9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuTmV0UmV4eEMKIHByb3BlcnR5ZmlsZT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5Qcm9wZXJ0eUZpbGUKQEAgLTE5NCw3ICsyMDAsNiBAQAogd2xqc3BjPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5XTEpzcGMKIHhtbHZhbGlkYXRlPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlhNTFZhbGlkYXRlVGFzawogCi0KICMgZGVwcmVjYXRlZCBhbnQgdGFza3MgKGtlcHQgZm9yIGJhY2sgY29tcGF0aWJpbGl0eSkKIGNvcHlkaXI9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWRpcgogY29weWZpbGU9b3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuQ29weWZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsQWRkcmVzcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzLmphdmEKaW5kZXggMjVlMzU1NS4uMzU5Y2JjMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICBwcml2YXRlIFN0cmluZyB0cmltKFN0cmluZyB0LCBib29sZWFuIHRyaW1BbmdsZUJyYWNrZXRzKSB7CiAgICAgICAgIGludCBzdGFydCA9IDA7CiAgICAgICAgIGludCBlbmQgPSB0Lmxlbmd0aCgpOwotICAgICAgICBib29sZWFuIHRyaW0gPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiB0cmltOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICB0cmltID0gZmFsc2U7CiAgICAgICAgICAgICBpZiAodC5jaGFyQXQoZW5kIC0gMSkgPT0gJyknCkBAIC0xNDAsNyArMTQwLDYgQEAKICAgICAgICAgcmV0dXJuIHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcGVyc29uYWwgLyBkaXNwbGF5IG5hbWUgb2YgdGhlIGFkZHJlc3MuCiAgICAgICoKQEAgLTE1MCw3ICsxNDksNiBAQAogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgZW1haWwgYWRkcmVzcy4KICAgICAgKgpAQCAtMTYwLDIxICsxNTgsMTkgQEAKICAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENvbnN0cnVjdHMgYSBzdHJpbmcgIm5hbWUgJmx0O2FkZHJlc3MmZ3Q7IiBvciAiYWRkcmVzcyIKICAgICAgKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3MKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuYW1lICsgIiA8IiArIGFkZHJlc3MgKyAiPiI7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWUgKyAiIDwiICsgYWRkcmVzcyArICI+IjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFkZHJlc3MKICAgICAgKgpAQCAtMTg0LDcgKzE4MCw2IEBACiAgICAgICAgIHJldHVybiBhZGRyZXNzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgZGlzcGxheSBuYW1lCiAgICAgICoKQEAgLTE5NCw0ICsxODksMyBAQAogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrLmphdmEKaW5kZXggOTcxNWMxMi4uNTRmODExNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKQEAgLTYwLDYgKzU5LDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgdmFsaWQgZW50cmllcwogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtBVVRPLCBNSU1FLCBVVSwgUExBSU59OwogICAgICAgICB9CkBAIC04MiwxNiArODIsMTYgQEAKICAgICAvKiogc2VuZGVyICAqLwogICAgIHByaXZhdGUgRW1haWxBZGRyZXNzIGZyb20gPSBudWxsOwogICAgIC8qKiByZXBseXRvICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgcmVwbHlUb0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8RW1haWxBZGRyZXNzPiByZXBseVRvTGlzdCA9IG5ldyBWZWN0b3I8PigpOwogICAgIC8qKiBUTyByZWNpcGllbnRzICAqLwotICAgIHByaXZhdGUgVmVjdG9yIHRvTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvcjxFbWFpbEFkZHJlc3M+IHRvTGlzdCA9IG5ldyBWZWN0b3I8PigpOwogICAgIC8qKiBDQyAoQ2FyYm9uIENvcHkpIHJlY2lwaWVudHMgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgY2NMaXN0ID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yPEVtYWlsQWRkcmVzcz4gY2NMaXN0ID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgLyoqIEJDQyAoQmxpbmQgQ2FyYm9uIENvcHkpIHJlY2lwaWVudHMgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgYmNjTGlzdCA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvcjxFbWFpbEFkZHJlc3M+IGJjY0xpc3QgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiBnZW5lcmljIGhlYWRlcnMgKi8KLSAgICBwcml2YXRlIFZlY3RvciBoZWFkZXJzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgVmVjdG9yPEhlYWRlcj4gaGVhZGVycyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIGZpbGUgbGlzdCAgKi8KICAgICBwcml2YXRlIFBhdGggYXR0YWNobWVudHMgPSBudWxsOwpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICogQHBhcmFtIHBvcnQgVGhlIHBvcnQgdG8gdXNlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1haWxwb3J0KGludCBwb3J0KSB7Ci0gICAgICAgIHRoaXMucG9ydCA9IEludGVnZXIudmFsdWVPZihwb3J0KTsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICB9CiAKICAgICAvKioKQEAgLTE5Myw4ICsxOTMsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKICAgICAgICAgaWYgKHRoaXMubWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG1lc3NhZ2UgY2FuIGJlIHNlbnQgaW4gYW4gIgotICAgICAgICAgICAgICAgICArICJlbWFpbCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJPbmx5IG9uZSBtZXNzYWdlIGNhbiBiZSBzZW50IGluIGFuIGVtYWlsIik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5tZXNzYWdlID0gbmV3IE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgIHRoaXMubWVzc2FnZS5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CkBAIC0yMDcsOCArMjA3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlRmlsZShGaWxlIGZpbGUpIHsKICAgICAgICAgaWYgKHRoaXMubWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgb25lIG1lc3NhZ2UgY2FuIGJlIHNlbnQgaW4gYW4gIgotICAgICAgICAgICAgICAgICArICJlbWFpbCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJPbmx5IG9uZSBtZXNzYWdlIGNhbiBiZSBzZW50IGluIGFuIGVtYWlsIik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5tZXNzYWdlID0gbmV3IE1lc3NhZ2UoZmlsZSk7CiAgICAgICAgIHRoaXMubWVzc2FnZS5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CkBAIC0yODgsNyArMjg4LDcgQEAKICAgICAgKiBAcGFyYW0gYWRkcmVzcyBBbiBlbWFpbCBhZGRyZXNzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFRvKEVtYWlsQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgICAgIHRvTGlzdC5hZGRFbGVtZW50KGFkZHJlc3MpOworICAgICAgICB0b0xpc3QuYWRkKGFkZHJlc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzAwLDcgKzMwMCw3IEBACiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsICIsIik7CiAKICAgICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIHRvTGlzdC5hZGRFbGVtZW50KG5ldyBFbWFpbEFkZHJlc3ModG9rZW5zLm5leHRUb2tlbigpKSk7CisgICAgICAgICAgICB0b0xpc3QuYWRkKG5ldyBFbWFpbEFkZHJlc3ModG9rZW5zLm5leHRUb2tlbigpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZENjKEVtYWlsQWRkcmVzcyBhZGRyZXNzKSB7Ci0gICAgICAgIGNjTGlzdC5hZGRFbGVtZW50KGFkZHJlc3MpOworICAgICAgICBjY0xpc3QuYWRkKGFkZHJlc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzIyLDcgKzMyMiw3IEBACiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsICIsIik7CiAKICAgICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGNjTGlzdC5hZGRFbGVtZW50KG5ldyBFbWFpbEFkZHJlc3ModG9rZW5zLm5leHRUb2tlbigpKSk7CisgICAgICAgICAgICBjY0xpc3QuYWRkKG5ldyBFbWFpbEFkZHJlc3ModG9rZW5zLm5leHRUb2tlbigpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgICAqIEBwYXJhbSBhZGRyZXNzIFRoZSBlbWFpbCBhZGRyZXNzLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEJjYyhFbWFpbEFkZHJlc3MgYWRkcmVzcykgewotICAgICAgICBiY2NMaXN0LmFkZEVsZW1lbnQoYWRkcmVzcyk7CisgICAgICAgIGJjY0xpc3QuYWRkKGFkZHJlc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpc3QsICIsIik7CiAKICAgICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpIHsKLSAgICAgICAgICAgIGJjY0xpc3QuYWRkRWxlbWVudChuZXcgRW1haWxBZGRyZXNzKHRva2Vucy5uZXh0VG9rZW4oKSkpOworICAgICAgICAgICAgYmNjTGlzdC5hZGQobmV3IEVtYWlsQWRkcmVzcyh0b2tlbnMubmV4dFRva2VuKCkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDM5LDYgKzQzOSw3IEBACiAgICAgLyoqCiAgICAgICogU2VuZCBhbiBlbWFpbC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICBNZXNzYWdlIHNhdmVkTWVzc2FnZSA9IG1lc3NhZ2U7CiAKQEAgLTQ0OCwxNSArNDQ5LDE1IEBACiAgICAgICAgICAgICAvLyBwcmVwYXJlIGZvciB0aGUgYXV0byBzZWxlY3QgbWVjaGFuaXNtCiAgICAgICAgICAgICBib29sZWFuIGF1dG9Gb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgLy8gdHJ5IE1JTUUgZm9ybWF0Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKE1JTUUpCi0gICAgICAgICAgICAgICAgIHx8IChlbmNvZGluZy5lcXVhbHMoQVVUTykgJiYgIWF1dG9Gb3VuZCkpIHsKKyAgICAgICAgICAgIGlmIChNSU1FLmVxdWFscyhlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgfHwgKEFVVE8uZXF1YWxzKGVuY29kaW5nKSAmJiAhYXV0b0ZvdW5kKSkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgYWN0aXZhdGlvbi5qYXIKICAgICAgICAgICAgICAgICAgICAgLy9hbmQgbWFpbC5qYXIgYXJlIGF2YWlsYWJsZSAtIHNlZSBidWcgMzE5NjkKICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YXguYWN0aXZhdGlvbi5EYXRhSGFuZGxlciIpOwogICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZheC5tYWlsLmludGVybmV0Lk1pbWVNZXNzYWdlIik7CiAKLSAgICAgICAgICAgICAgICAgICAgbWFpbGVyID0gKE1haWxlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIG1haWxlciA9IENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NaW1lTWFpbGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWFpbFRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgTWFpbGVyLmNsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgYXV0b0ZvdW5kID0gdHJ1ZTsKQEAgLTQ2OCwyMCArNDY5LDIwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTTVRQIGF1dGggb25seSBhbGxvd2VkIHdpdGggTUlNRSBtYWlsCiAgICAgICAgICAgICBpZiAoIWF1dG9Gb3VuZCAmJiAoKHVzZXIgIT0gbnVsbCkgfHwgKHBhc3N3b3JkICE9IG51bGwpKQotICAgICAgICAgICAgICAgICYmIChlbmNvZGluZy5lcXVhbHMoVVUpIHx8IGVuY29kaW5nLmVxdWFscyhQTEFJTikpKSB7CisgICAgICAgICAgICAgICAgJiYgKFVVLmVxdWFscyhlbmNvZGluZykgfHwgUExBSU4uZXF1YWxzKGVuY29kaW5nKSkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNNVFAgYXV0aCBvbmx5IHBvc3NpYmxlIHdpdGggTUlNRSBtYWlsIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTU0wgb25seSBhbGxvd2VkIHdpdGggTUlNRSBtYWlsCiAgICAgICAgICAgICBpZiAoIWF1dG9Gb3VuZCAgJiYgKHNzbCB8fCBzdGFydHRscykKLSAgICAgICAgICAgICAgICAmJiAoZW5jb2RpbmcuZXF1YWxzKFVVKSB8fCBlbmNvZGluZy5lcXVhbHMoUExBSU4pKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU1NMIGFuZCBTVEFSVFRMUyBvbmx5IHBvc3NpYmxlIHdpdGgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBNSU1FIG1haWwiKTsKKyAgICAgICAgICAgICAgICAmJiAoVVUuZXF1YWxzKGVuY29kaW5nKSB8fCBQTEFJTi5lcXVhbHMoZW5jb2RpbmcpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlNTTCBhbmQgU1RBUlRUTFMgb25seSBwb3NzaWJsZSB3aXRoIE1JTUUgbWFpbCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gdHJ5IFVVIGZvcm1hdAotICAgICAgICAgICAgaWYgKGVuY29kaW5nLmVxdWFscyhVVSkKLSAgICAgICAgICAgICAgICAgfHwgKGVuY29kaW5nLmVxdWFscyhBVVRPKSAmJiAhYXV0b0ZvdW5kKSkgeworICAgICAgICAgICAgaWYgKFVVLmVxdWFscyhlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgfHwgKEFVVE8uZXF1YWxzKGVuY29kaW5nKSAmJiAhYXV0b0ZvdW5kKSkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1haWxlciA9IChNYWlsZXIpIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBtYWlsZXIgPSBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuVVVNYWlsZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtYWlsVGFzay5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLCBNYWlsZXIuY2xhc3MpOwogICAgICAgICAgICAgICAgICAgICBhdXRvRm91bmQgPSB0cnVlOwpAQCAtNDkxLDE2ICs0OTIsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyB0cnkgcGxhaW4gZm9ybWF0Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcuZXF1YWxzKFBMQUlOKQotICAgICAgICAgICAgICAgICB8fCAoZW5jb2RpbmcuZXF1YWxzKEFVVE8pICYmICFhdXRvRm91bmQpKSB7CisgICAgICAgICAgICBpZiAoUExBSU4uZXF1YWxzKGVuY29kaW5nKQorICAgICAgICAgICAgICAgICB8fCAoQVVUTy5lcXVhbHMoZW5jb2RpbmcpICYmICFhdXRvRm91bmQpKSB7CiAgICAgICAgICAgICAgICAgbWFpbGVyID0gbmV3IFBsYWluTWFpbGVyKCk7CiAgICAgICAgICAgICAgICAgYXV0b0ZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBsb2coIlVzaW5nIHBsYWluIG1haWwiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGEgdmFsaWQgbWFpbGVyIG11c3QgYmUgcHJlc2VudCBieSBub3cKICAgICAgICAgICAgIGlmIChtYWlsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGluaXRpYWxpc2UgZW5jb2Rpbmc6ICIKLSAgICAgICAgICAgICAgICAgICAgICsgZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIGluaXRpYWxpc2UgZW5jb2Rpbmc6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYSB2YWxpZCBtZXNzYWdlIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CkBAIC01MTMsMzMgKzUxNCwzMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gYXQgbGVhc3Qgb25lIGFkZHJlc3MgdG8gc2VuZCB0by9jYy9iY2MgaXMgcmVxdWlyZWQKICAgICAgICAgICAgIGlmICh0b0xpc3QuaXNFbXB0eSgpICYmIGNjTGlzdC5pc0VtcHR5KCkgJiYgYmNjTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBvZiB0bywgY2Mgb3IgYmNjIG11c3QgIgotICAgICAgICAgICAgICAgICAgICAgKyAiYmUgc3VwcGxpZWQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgb2YgdG8sIGNjIG9yIGJjYyBtdXN0IGJlIHN1cHBsaWVkIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBzZXQgdGhlIG1pbWV0eXBlIGlmIG5vdCBkb25lIGFscmVhZHkgKGFuZCByZXF1aXJlZCkKICAgICAgICAgICAgIGlmIChtZXNzYWdlTWltZVR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmlzTWltZVR5cGVTcGVjaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBtaW1lIHR5cGUgY2FuIG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmllZCBpbiBvbmUgbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBtaW1lIHR5cGUgY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGluIG9uZSBsb2NhdGlvbiIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldE1pbWVUeXBlKG1lc3NhZ2VNaW1lVHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBzZXQgdGhlIGNoYXJhY3RlciBzZXQgaWYgbm90IGRvbmUgYWxyZWFkeSAoYW5kIHJlcXVpcmVkKQogICAgICAgICAgICAgaWYgKGNoYXJzZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmdldENoYXJzZXQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGNoYXJzZXQgY2FuIG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInNwZWNpZmllZCBpbiBvbmUgbG9jYXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjaGFyc2V0IGNhbiBvbmx5IGJlIHNwZWNpZmllZCBpbiBvbmUgbG9jYXRpb24iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRDaGFyc2V0KGNoYXJzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbWVzc2FnZS5zZXRJbnB1dEVuY29kaW5nKG1lc3NhZ2VGaWxlSW5wdXRFbmNvZGluZyk7CiAKICAgICAgICAgICAgIC8vIGlkZW50aWZ5IHdoaWNoIGZpbGVzIHNob3VsZCBiZSBhdHRhY2hlZAotICAgICAgICAgICAgVmVjdG9yPEZpbGU+IGZpbGVzID0gbmV3IFZlY3RvcjxGaWxlPigpOworICAgICAgICAgICAgVmVjdG9yPEZpbGU+IGZpbGVzID0gbmV3IFZlY3Rvcjw+KCk7CisKICAgICAgICAgICAgIGlmIChhdHRhY2htZW50cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByIDogYXR0YWNobWVudHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkRWxlbWVudChyLmFzKEZpbGVQcm92aWRlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZXMuYWRkKHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKS5nZXRGaWxlKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGxldCB0aGUgdXNlciBrbm93IHdoYXQncyBnb2luZyB0byBoYXBwZW4KQEAgLTU1Myw3ICs1NTQsNyBAQAogICAgICAgICAgICAgLy8gcGFzcyB0aGUgcGFyYW1zIHRvIHRoZSBtYWlsZXIKICAgICAgICAgICAgIG1haWxlci5zZXRIb3N0KGhvc3QpOwogICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1haWxlci5zZXRQb3J0KHBvcnQuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgbWFpbGVyLnNldFBvcnQocG9ydCk7CiAgICAgICAgICAgICAgICAgbWFpbGVyLnNldFBvcnRFeHBsaWNpdGx5U3BlY2lmaWVkKHRydWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtYWlsZXIuc2V0UG9ydChTTVRQX1BPUlQpOwpAQCAtNjM2LDQgKzYzNywzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0hlYWRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvSGVhZGVyLmphdmEKaW5kZXggNmJjZmI2Ni4uMzZiYzhlYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvSGVhZGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvSGVhZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOwogCiAvKioKLSAqIENsYXNzIHJlcHJlc2VudGluZyBhIGdlbmVyaWMgZS1tYWlsIGhlYWRlci4KKyAqIENsYXNzIHJlcHJlc2VudGluZyBhIGdlbmVyaWMga2V5LXZhbHVlIGhlYWRlci4KKyAqIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIG91dCBvZiB0aGUgZW1haWwgcGFja2FnZQorICoKICAqIEBzaW5jZSBBbnQgMS43CiAgKi8KIHB1YmxpYyBjbGFzcyBIZWFkZXIgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWFpbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NYWlsZXIuamF2YQppbmRleCAzNTJhZTBiLi43YzAwMDM4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NYWlsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NYWlsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI3OSw0ICsyNzksMyBAQAogICAgICAgICByZXR1cm4gRGF0ZVV0aWxzLmdldERhdGVGb3JIZWFkZXIoKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01lc3NhZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01lc3NhZ2UuamF2YQppbmRleCA4ODY5ZWYxLi40NzdjNzM2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NZXNzYWdlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWVzc2FnZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTMgKzIwLDE0IEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKIApAQCAtNDcsNyArNDgsNiBAQAogICAgIHB1YmxpYyBNZXNzYWdlKCkgewogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBzdHJpbmcKICAgICAgKgpAQCAtNTcsNyArNTcsNiBAQAogICAgICAgICBhZGRUZXh0KHRleHQpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIG5ldyBtZXNzYWdlIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZS4KICAgICAgKgpAQCAtNjcsNyArNjYsNiBAQAogICAgICAgICBtZXNzYWdlU291cmNlID0gZmlsZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEFkZHMgYSB0ZXh0dWFsIHBhcnQgb2YgdGhlIG1lc3NhZ2UKICAgICAgKgpAQCAtNzcsNyArNzUsNiBAQAogICAgICAgICBidWZmZXIuYXBwZW5kKHRleHQpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgc291cmNlIGZpbGUgb2YgdGhlIG1lc3NhZ2UKICAgICAgKgpAQCAtODcsNyArODQsNiBAQAogICAgICAgICB0aGlzLm1lc3NhZ2VTb3VyY2UgPSBzcmM7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHR5cGUgZm9yIHRoZSBtZXNzYWdlCiAgICAgICoKQEAgLTk4LDcgKzk0LDYgQEAKICAgICAgICAgc3BlY2lmaWVkID0gdHJ1ZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZQogICAgICAqCkBAIC0xMDgsMzUgKzEwMywyOCBAQAogICAgICAgICByZXR1cm4gbWltZVR5cGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBQcmludHMgdGhlIG1lc3NhZ2Ugb250byBhbiBvdXRwdXQgc3RyZWFtCiAgICAgICoKICAgICAgKiBAcGFyYW0gcHMgVGhlIHByaW50IHN0cmVhbSB0byB3cml0ZSB0bwogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRTdHJlYW0gcHMpCi0gICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRTdHJlYW0gcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIC8vIFdlIG5lZWQgY2hhcmFjdGVyIGVuY29kaW5nIGF3YXJlIHByaW50aW5nIGhlcmUuCiAgICAgICAgIC8vIFNvLCB1c2luZyBCdWZmZXJlZFdyaXRlciBvdmVyIE91dHB1dFN0cmVhbVdyaXRlciBpbnN0ZWFkIG9mIFByaW50U3RyZWFtCiAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQKLSAgICAgICAgICAgICAgICA9IGNoYXJzZXQgIT0gbnVsbCA/IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHBzLCBjaGFyc2V0KSkKLSAgICAgICAgICAgICAgICA6IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHBzKSk7CisgICAgICAgICAgICBvdXQgPSBjaGFyc2V0ID09IG51bGwgPyBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihwcykpCisgICAgICAgICAgICAgICAgICAgIDogbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocHMsIGNoYXJzZXQpKTsKICAgICAgICAgICAgIGlmIChtZXNzYWdlU291cmNlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBSZWFkIG1lc3NhZ2UgZnJvbSBhIGZpbGUKLSAgICAgICAgICAgICAgICBSZWFkZXIgZnJlYWRlciA9IGdldFJlYWRlcihtZXNzYWdlU291cmNlKTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihnZXRSZWFkZXIobWVzc2FnZVNvdXJjZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lOwogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKGxpbmUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5uZXdMaW5lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBmcmVhZGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKGJ1ZmZlci5zdWJzdHJpbmcoMCkpKTsKQEAgLTE0OCw3ICsxMzYsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1pbWVUeXBlIGhhcyBiZWVuIHNldC4KICAgICAgKgpAQCAtMTY3LDYgKzE1NCw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0Q2hhcnNldChTdHJpbmcgY2hhcnNldCkgewogICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGNoYXJzZXQgb2YgbWFpbCBtZXNzYWdlLgogICAgICAqCkBAIC0xODksNyArMTc3LDcgQEAKIAogICAgIHByaXZhdGUgUmVhZGVyIGdldFJlYWRlcihGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbnB1dEVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZi50b1BhdGgoKSk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmlzLCBpbnB1dEVuY29kaW5nKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CkBAIC0yMDAsNCArMTg4LDMgQEAKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVhZGVyKGYpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWltZU1haWxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWltZU1haWxlci5qYXZhCmluZGV4IDFiMmE3MmQuLmUwNTJlN2EgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01pbWVNYWlsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9NaW1lTWFpbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCw4ICsyOCw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyaXR5OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwpAQCAtODMsNiArODEsNyBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKICAgICAgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0OwogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCAmJiBvdXQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gZGF0YSIpOwpAQCAtOTUsNiArOTQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhLmdldEJ5dGVzKGNoYXJzZXQpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBvdXQgPSAob3V0ID09IG51bGwpID8gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpIDogb3V0OwogICAgICAgICAgICAgcmV0dXJuIG91dDsKQEAgLTEwNCwxNiArMTA0LDE4IEBACiAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewogICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmluZGV4T2YoImNoYXJzZXQiKSA+IDAKICAgICAgICAgICAgICAgICAmJiB0eXBlLnN0YXJ0c1dpdGgoInRleHQvIikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIE11c3QgYmUgbGlrZSAidGV4dC9wbGFpbjsgY2hhcnNldD13aW5kb3dzLTEyNTEiCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1ZmZlcih0eXBlICE9IG51bGwgPyB0eXBlIDogInRleHQvcGxhaW4iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgIjsgY2hhcnNldD0iKS5hcHBlbmQoY2hhcnNldCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiAodHlwZSAhPSBudWxsID8gdHlwZSA6ICJ0ZXh0L3BsYWluIikgKworICAgICAgICAgICAgICAgICAgICAiOyBjaGFyc2V0PSIgKyBjaGFyc2V0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiAiU3RyaW5nRGF0YVNvdXJjZSI7CiAgICAgICAgIH0KQEAgLTEzMiw2ICsxMzQsNyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZW1haWwgY2FuJ3QgYmUgc2VudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZW5kKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CkBAIC0xNDYsMTMgKzE0OSwxMyBAQAogICAgICAgICAgICAgQXV0aGVudGljYXRvciBhdXRoID0gbnVsbDsKICAgICAgICAgICAgIGlmIChTU0wpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlciBwID0gKFByb3ZpZGVyKSBDbGFzcy5mb3JOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5zdW4ubmV0LnNzbC5pbnRlcm5hbC5zc2wuUHJvdmlkZXIiKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlciBwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImNvbS5zdW4ubmV0LnNzbC5pbnRlcm5hbC5zc2wuUHJvdmlkZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKFByb3ZpZGVyLmNsYXNzKS5uZXdJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgICAgICBTZWN1cml0eS5hZGRQcm92aWRlcihwKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBpbnN0YW50aWF0ZSBzc2wgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic2VjdXJpdHkgcHJvdmlkZXIsIGNoZWNrIHRoYXQgeW91IGhhdmUgSlNTRSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ5b3VyIGNsYXNzcGF0aCIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGluc3RhbnRpYXRlIHNzbCBzZWN1cml0eSBwcm92aWRlciwgY2hlY2sgdGhhdCB5b3UgaGF2ZSBKU1NFIGluIHlvdXIgY2xhc3NwYXRoIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIFNNVFAgcHJvdmlkZXIKICAgICAgICAgICAgICAgICBwcm9wcy5wdXQoIm1haWwuc210cC5zb2NrZXRGYWN0b3J5LmNsYXNzIiwgU1NMX0ZBQ1RPUlkpOwpAQCAtMjE5LDggKzIyMiw3IEBACiAgICAgICAgICAgICBtc2cuYWRkSGVhZGVyKCJEYXRlIiwgZ2V0RGF0ZSgpKTsKIAogICAgICAgICAgICAgaWYgKGhlYWRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgaXRlciA9IGhlYWRlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEhlYWRlciBoID0gKEhlYWRlcikgaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgZm9yIChIZWFkZXIgaCA6IGhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgbXNnLmFkZEhlYWRlcihoLmdldE5hbWUoKSwgaC5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzIsMTggKzIzNCwxMiBAQAogICAgICAgICAgICAgdGV4dGJvZHkuc2V0RGF0YUhhbmRsZXIobmV3IERhdGFIYW5kbGVyKHNkcykpOwogICAgICAgICAgICAgYXR0YWNobWVudHMuYWRkQm9keVBhcnQodGV4dGJvZHkpOwogCi0gICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBlID0gZmlsZXMuZWxlbWVudHMoKTsKLQotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSAoRmlsZSkgZS5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgTWltZUJvZHlQYXJ0IGJvZHk7Ci0KLSAgICAgICAgICAgICAgICBib2R5ID0gbmV3IE1pbWVCb2R5UGFydCgpOworICAgICAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgICAgIE1pbWVCb2R5UGFydCBib2R5ID0gbmV3IE1pbWVCb2R5UGFydCgpOwogICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIFwiIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlYWRhYmxlLiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBcIiVzXCIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHJlYWRhYmxlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURhdGFTb3VyY2UgZmlsZURhdGEgPSBuZXcgRmlsZURhdGFTb3VyY2UoZmlsZSk7CiAgICAgICAgICAgICAgICAgZmluYWwgRGF0YUhhbmRsZXIgZmlsZURhdGFIYW5kbGVyID0gbmV3IERhdGFIYW5kbGVyKGZpbGVEYXRhKTsKQEAgLTI2MSw3ICsyNTcsOCBAQAogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VuZEZhaWxlZEV4Y2VwdGlvbiBzZmUpIHsKICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZElnbm9yZUludmFsaWRSZWNpcGllbnRzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEdFTkVSSUNfRVJST1IsIHNmZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZmUuZ2V0VmFsaWRTZW50QWRkcmVzc2VzKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2ZlLmdldFZhbGlkU2VudEFkZHJlc3NlcygpID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHNmZS5nZXRWYWxpZFNlbnRBZGRyZXNzZXMoKS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWNoIGFueSByZWNpcGllbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZlKTsKQEAgLTI4MSwxNiArMjc4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIGRpZG50UmVhY2goYWRkcmVzcywgInZhbGlkIiwgc2ZlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIE1lc3NhZ2luZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oR0VORVJJQ19FUlJPUiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTWVzc2FnaW5nRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEdFTkVSSUNfRVJST1IsIGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgSW50ZXJuZXRBZGRyZXNzW10gaW50ZXJuZXRBZGRyZXNzZXMoZmluYWwgVmVjdG9yPEVtYWlsQWRkcmVzcz4gbGlzdCkKICAgICAgICAgdGhyb3dzIEFkZHJlc3NFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBMaXN0PEludGVybmV0QWRkcmVzcz4gYWRkcnMgPSBuZXcgQXJyYXlMaXN0PEludGVybmV0QWRkcmVzcz4oKTsKKworICAgICAgICBmaW5hbCBMaXN0PEludGVybmV0QWRkcmVzcz4gYWRkcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICBmb3IgKGZpbmFsIEVtYWlsQWRkcmVzcyBhZGRyIDogbGlzdCkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBhZGRyLmdldE5hbWUoKTsKQEAgLTMwNyw3ICszMDMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGludCBwb3MgPSB0eXBlLmluZGV4T2YoImNoYXJzZXQiKTsKICAgICAgICAgaWYgKHBvcyA8IDApIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIC8vIEFzc3VtaW5nIG1pbWUgdHlwZSBpbiBmb3JtICJ0ZXh0L1hYWFg7IGNoYXJzZXQ9WFhYWFhYIgogICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW4gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGUuc3Vic3RyaW5nKHBvcyksICI9OyAiKTsKQEAgLTMyOSwxMCArMzI1LDEzIEBACiAgICAgc3RhdGljIGNsYXNzIFNpbXBsZUF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBdXRoZW50aWNhdG9yIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlciA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkID0gbnVsbDsKKwogICAgICAgICBwdWJsaWMgU2ltcGxlQXV0aGVudGljYXRvcihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7CiAgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOwogICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFBhc3N3b3JkQXV0aGVudGljYXRpb24odXNlciwgcGFzc3dvcmQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9QbGFpbk1haWxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvUGxhaW5NYWlsZXIuamF2YQppbmRleCAyMDUyNGFjLi44MDYxMDJjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9QbGFpbk1haWxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL1BsYWluTWFpbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMSArMTksMTAgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMubWFpbC5NYWlsTWVzc2FnZTsKQEAgLTM5LDQ5ICszOCw0NCBAQAogICAgICAqCiAgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLm1haWwuTWFpbE1lc3NhZ2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZW5kKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTWFpbE1lc3NhZ2UgbWFpbE1lc3NhZ2UgPSBuZXcgTWFpbE1lc3NhZ2UoaG9zdCwgcG9ydCk7CiAKICAgICAgICAgICAgIG1haWxNZXNzYWdlLmZyb20oZnJvbS50b1N0cmluZygpKTsKIAotICAgICAgICAgICAgRW51bWVyYXRpb24gZTsKICAgICAgICAgICAgIGJvb2xlYW4gYXRMZWFzdE9uZVJjcHRSZWFjaGVkID0gZmFsc2U7CiAKLSAgICAgICAgICAgIGUgPSByZXBseVRvTGlzdC5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZS5yZXBseXRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSB0b0xpc3QuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRvID0gZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXBseVRvTGlzdC5zdHJlYW0oKS5tYXAoT2JqZWN0Ojp0b1N0cmluZykuZm9yRWFjaChtYWlsTWVzc2FnZTo6cmVwbHl0byk7CisKKyAgICAgICAgICAgIGZvciAoRW1haWxBZGRyZXNzIHRvIDogdG9MaXN0KSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UudG8odG8pOworICAgICAgICAgICAgICAgICAgICBtYWlsTWVzc2FnZS50byh0by50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZVJjcHRSZWFjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICBiYWRSZWNpcGllbnQodG8sIGV4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlID0gY2NMaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworCisgICAgICAgICAgICBmb3IgKEVtYWlsQWRkcmVzcyBjYyA6IGNjTGlzdCkgewogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLmNjKHRvKTsKKyAgICAgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuY2MoY2MudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIGF0TGVhc3RPbmVSY3B0UmVhY2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgYmFkUmVjaXBpZW50KHRvLCBleCk7CisgICAgICAgICAgICAgICAgICAgIGJhZFJlY2lwaWVudChjYywgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSBiY2NMaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyB0byA9IGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworCisgICAgICAgICAgICBmb3IgKEVtYWlsQWRkcmVzcyBiY2MgOiBiY2NMaXN0KSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuYmNjKHRvKTsKKyAgICAgICAgICAgICAgICAgICAgbWFpbE1lc3NhZ2UuYmNjKGJjYy50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgYXRMZWFzdE9uZVJjcHRSZWFjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICBiYWRSZWNpcGllbnQodG8sIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYmFkUmVjaXBpZW50KGJjYywgZXgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKCFhdExlYXN0T25lUmNwdFJlYWNoZWQpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkbid0IHJlYWNoIGFueSByZWNpcGllbnQiKTsKICAgICAgICAgICAgIH0KQEAgLTk2LDE4ICs5MCwxNyBAQAogICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgbWVzc2FnZS5nZXRNaW1lVHlwZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBlID0gaGVhZGVycy5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhlYWRlciBoID0gKEhlYWRlcikgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGZvciAoSGVhZGVyIGggOiBoZWFkZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgIG1haWxNZXNzYWdlLnNldEhlYWRlcihoLmdldE5hbWUoKSwgaC5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQcmludFN0cmVhbSBvdXQgPSBtYWlsTWVzc2FnZS5nZXRQcmludFN0cmVhbSgpOwogICAgICAgICAgICAgbWVzc2FnZS5wcmludChvdXQpOwogCi0gICAgICAgICAgICBlID0gZmlsZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgYXR0YWNoKChGaWxlKSBlLm5leHRFbGVtZW50KCksIG91dCk7CisgICAgICAgICAgICBpZiAoZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoRmlsZSBmIDogZmlsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0YWNoKGYsIG91dCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbWFpbE1lc3NhZ2Uuc2VuZEFuZENsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewpAQCAtMTI2LDkgKzExOSw5IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXR0YWNoKEZpbGUgZmlsZSwgUHJpbnRTdHJlYW0gb3V0KQogICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIFwiIiArIGZpbGUuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICsgInJlYWRhYmxlLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJGaWxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgcmVhZGFibGUuIiwKKyAgICAgICAgICAgICAgICBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbmNsdWRlRmlsZU5hbWVzKSB7CkBAIC0xNDQsMjMgKzEzNywyMCBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBsZW5ndGg7CiAgICAgICAgIGZpbmFsIGludCBtYXhCdWYgPSAxMDI0OwogICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbbWF4QnVmXTsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbnN0ciA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaW5zdHIsIGJ1Zi5sZW5ndGgpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGZpbnN0ciA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpOworICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaW5zdHIsIGJ1Zi5sZW5ndGgpKSB7CiAKKyAgICAgICAgICAgIGludCBsZW5ndGg7CiAgICAgICAgICAgICB3aGlsZSAoKGxlbmd0aCA9IGluLnJlYWQoYnVmKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmLCAwLCBsZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgZmluc3RyLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYmFkUmVjaXBpZW50KFN0cmluZyByY3B0LCBJT0V4Y2VwdGlvbiByZWFzb24pIHsKKyAgICBwcml2YXRlIHZvaWQgYmFkUmVjaXBpZW50KEVtYWlsQWRkcmVzcyByY3B0LCBJT0V4Y2VwdGlvbiByZWFzb24pIHsKICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgdG8gc2VuZCBtYWlsIHRvICIgKyByY3B0OwogICAgICAgICBpZiAoc2hvdWxkSWdub3JlSW52YWxpZFJlY2lwaWVudHMoKSkgewogICAgICAgICAgICAgbXNnICs9ICIgYmVjYXVzZSBvZiA6IiArIHJlYXNvbi5nZXRNZXNzYWdlKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9VVU1haWxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvVVVNYWlsZXIuamF2YQppbmRleCBkNjU0MmJlLi5jMGU0N2U3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9VVU1haWxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL1VVTWFpbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw5ICsxOSwxMCBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5VVUVuY29kZXI7CkBAIC0zMiwyNCArMzMsMTggQEAKICAqIEBzaW5jZSBBbnQgMS41CiAgKi8KIGNsYXNzIFVVTWFpbGVyIGV4dGVuZHMgUGxhaW5NYWlsZXIgeworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGF0dGFjaChGaWxlIGZpbGUsIFByaW50U3RyZWFtIG91dCkKICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSB8fCAhZmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBcIiIgKyBmaWxlLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgIgotICAgICAgICAgICAgICAgICArICJyZWFkYWJsZS4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRmlsZSBcIiVzIiArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgIiArICJyZWFkYWJsZS4iLAorICAgICAgICAgICAgICAgIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbnN0ciA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaW5zdHIpOwotICAgICAgICAgICAgVVVFbmNvZGVyIGVuY29kZXIgPSBuZXcgVVVFbmNvZGVyKGZpbGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgZW5jb2Rlci5lbmNvZGUoaW4sIG91dCk7Ci0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpbnN0ci5jbG9zZSgpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKSkgeworICAgICAgICAgICAgbmV3IFVVRW5jb2RlcihmaWxlLmdldE5hbWUoKSkuZW5jb2RlKGluLCBvdXQpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvQ29tbWFuZExhdW5jaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9Db21tYW5kTGF1bmNoZXIuamF2YQppbmRleCBjYzlmYjg4Li5lMTk5NTY5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9Db21tYW5kTGF1bmNoZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9Db21tYW5kTGF1bmNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwpAQCAtNDEsNyArNDIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbW1hbmRMYXVuY2hlciBzaGVsbExhdW5jaGVyID0gbnVsbDsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGlmKCFPcy5pc0ZhbWlseSgib3MvMiIpKSB7CisgICAgICAgIGlmICghT3MuaXNGYW1pbHkoIm9zLzIiKSkgewogICAgICAgICAgICAgdm1MYXVuY2hlciA9IG5ldyBKYXZhMTNDb21tYW5kTGF1bmNoZXIoKTsKICAgICAgICAgfQogCkBAIC05NCw3ICs5NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52KQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZihwcm9qZWN0ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewogICAgICAgICAgICAgcHJvamVjdC5sb2coIkV4ZWN1dGU6Q29tbWFuZExhdW5jaGVyOiAiCiAgICAgICAgICAgICAgICAgKyBDb21tYW5kbGluZS5kZXNjcmliZUNvbW1hbmQoY21kKSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICB9CkBAIC0xMjQsOCArMTI1LDggQEAKICAgICAgICAgaWYgKHdvcmtpbmdEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOwogICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGV4ZWN1dGUgYSBwcm9jZXNzIGluIGRpZmZlcmVudCAiCi0gICAgICAgICAgICArICJkaXJlY3RvcnkgdW5kZXIgdGhpcyBKVk0iKTsKKyAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKAorICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIGEgcHJvY2VzcyBpbiBkaWZmZXJlbnQgZGlyZWN0b3J5IHVuZGVyIHRoaXMgSlZNIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjMsMzcgKzE2NCwyNCBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29tbWFuZExhdW5jaGVyIGV4dHJhY3RMYXVuY2hlcihTdHJpbmcgcmVmZXJlbmNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCkgewotICAgICAgICBDb21tYW5kTGF1bmNoZXIgbGF1bmNoZXIgPSBudWxsOwotICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsYXVuY2hlciA9IChDb21tYW5kTGF1bmNoZXIpIHByb2plY3QuZ2V0UmVmZXJlbmNlKHJlZmVyZW5jZU5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxhdW5jaGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGxhdW5jaGVyID0gZ2V0U3lzdGVtTGF1bmNoZXIocmVmZXJlbmNlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxhdW5jaGVyOworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShwcm9qZWN0KQorICAgICAgICAgICAgLm1hcChwIC0+IHAuPENvbW1hbmRMYXVuY2hlcj4gZ2V0UmVmZXJlbmNlKHJlZmVyZW5jZU5hbWUpKQorICAgICAgICAgICAgLm9yRWxzZUdldCgoKSAtPiBnZXRTeXN0ZW1MYXVuY2hlcihyZWZlcmVuY2VOYW1lKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29tbWFuZExhdW5jaGVyIGdldFN5c3RlbUxhdW5jaGVyKFN0cmluZyBsYXVuY2hlclJlZklkKSB7Ci0gICAgICAgIENvbW1hbmRMYXVuY2hlciBsYXVuY2hlciA9IG51bGw7CiAgICAgICAgIFN0cmluZyBsYXVuY2hlckNsYXNzID0gU3lzdGVtLmdldFByb3BlcnR5KGxhdW5jaGVyUmVmSWQpOwogICAgICAgICBpZiAobGF1bmNoZXJDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxhdW5jaGVyID0gKENvbW1hbmRMYXVuY2hlcikgQ2xhc3MuZm9yTmFtZShsYXVuY2hlckNsYXNzKQotICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUobGF1bmNoZXJDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmFzU3ViY2xhc3MoQ29tbWFuZExhdW5jaGVyLmNsYXNzKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgfCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSBsYXVuY2hlciBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGF1bmNoZXJDbGFzcyArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGluc3RhbnRpYXRlIGxhdW5jaGVyIGNsYXNzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsYXVuY2hlckNsYXNzICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDb3VsZCBub3QgaW5zdGFudGlhdGUgbGF1bmNoZXIgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGxhdW5jaGVyQ2xhc3MgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICArIGxhdW5jaGVyQ2xhc3MgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxhdW5jaGVyOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL0NvbW1hbmRMYXVuY2hlclByb3h5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9Db21tYW5kTGF1bmNoZXJQcm94eS5qYXZhCmluZGV4IDdhMWM4NzcuLjAyMWU0YzEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL0NvbW1hbmRMYXVuY2hlclByb3h5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvQ29tbWFuZExhdW5jaGVyUHJveHkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL0phdmExM0NvbW1hbmRMYXVuY2hlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvSmF2YTEzQ29tbWFuZExhdW5jaGVyLmphdmEKaW5kZXggMTJlYzdkOS4uMDJmYmVkZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvSmF2YTEzQ29tbWFuZExhdW5jaGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvSmF2YTEzQ29tbWFuZExhdW5jaGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9NYWNDb21tYW5kTGF1bmNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL01hY0NvbW1hbmRMYXVuY2hlci5qYXZhCmluZGV4IDAyYThlNzguLmVjNDFhOWMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL01hY0NvbW1hbmRMYXVuY2hlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL01hY0NvbW1hbmRMYXVuY2hlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvT1MyQ29tbWFuZExhdW5jaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9PUzJDb21tYW5kTGF1bmNoZXIuamF2YQppbmRleCA3NWVjYWEzLi5iYWFkYzEzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9PUzJDb21tYW5kTGF1bmNoZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9PUzJDb21tYW5kTGF1bmNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL1BlcmxTY3JpcHRDb21tYW5kTGF1bmNoZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL1BlcmxTY3JpcHRDb21tYW5kTGF1bmNoZXIuamF2YQppbmRleCBkNWIwNmY3Li41OGMwZTA5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9QZXJsU2NyaXB0Q29tbWFuZExhdW5jaGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvUGVybFNjcmlwdENvbW1hbmRMYXVuY2hlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTgsMTUgKzU4LDE0IEBACiAgICAgICAgICAgICBpZiAod29ya2luZ0RpciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWMocHJvamVjdCwgY21kLCBlbnYpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJObyBwcm9qZWN0IHByb3ZpZGVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbm5vdCBsb2NhdGUgYW50UnVuIHNjcmlwdDogTm8gcHJvamVjdCBwcm92aWRlZCIpOwogICAgICAgICB9CiAgICAgICAgIC8vIExvY2F0ZSB0aGUgYXV4aWxpYXJ5IHNjcmlwdAogICAgICAgICBTdHJpbmcgYW50SG9tZSA9IHByb2plY3QuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSk7CiAgICAgICAgIGlmIChhbnRIb21lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGxvY2F0ZSBhbnRSdW4gc2NyaXB0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiUHJvcGVydHkgJyIgKyBNYWdpY05hbWVzLkFOVF9IT01FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2Fubm90IGxvY2F0ZSBhbnRSdW4gc2NyaXB0OiBQcm9wZXJ0eSAnIgorICAgICAgICAgICAgICAgICsgTWFnaWNOYW1lcy5BTlRfSE9NRSArICInIG5vdCBmb3VuZCIpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBhbnRSdW4gPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRIb21lICsgRmlsZS5zZXBhcmF0b3IKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL1NjcmlwdENvbW1hbmRMYXVuY2hlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvU2NyaXB0Q29tbWFuZExhdW5jaGVyLmphdmEKaW5kZXggOTM2Zjk0OC4uMGFhY2JiMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvU2NyaXB0Q29tbWFuZExhdW5jaGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvU2NyaXB0Q29tbWFuZExhdW5jaGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01OCwxNSArNTgsMTQgQEAKICAgICAgICAgICAgIGlmICh3b3JraW5nRGlyID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXhlYyhwcm9qZWN0LCBjbWQsIGVudik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBsb2NhdGUgYW50UnVuIHNjcmlwdDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk5vIHByb2plY3QgcHJvdmlkZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGxvY2F0ZSBhbnRSdW4gc2NyaXB0OiBObyBwcm9qZWN0IHByb3ZpZGVkIik7CiAgICAgICAgIH0KICAgICAgICAgLy8gTG9jYXRlIHRoZSBhdXhpbGlhcnkgc2NyaXB0CiAgICAgICAgIFN0cmluZyBhbnRIb21lID0gcHJvamVjdC5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKTsKICAgICAgICAgaWYgKGFudEhvbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm9wZXJ0eSAnIiArIE1hZ2ljTmFtZXMuQU5UX0hPTUUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIGFudFJ1biBzY3JpcHQ6IFByb3BlcnR5ICciCisgICAgICAgICAgICAgICAgKyBNYWdpY05hbWVzLkFOVF9IT01FICsgIicgbm90IGZvdW5kIik7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGFudFJ1biA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudEhvbWUgKyBGaWxlLnNlcGFyYXRvcgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvVm1zQ29tbWFuZExhdW5jaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9WbXNDb21tYW5kTGF1bmNoZXIuamF2YQppbmRleCA5N2YyN2M2Li5iZTVjNDRkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9WbXNDb21tYW5kTGF1bmNoZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9WbXNDb21tYW5kTGF1bmNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDEwICszMiw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBWbXNDb21tYW5kTGF1bmNoZXIgZXh0ZW5kcyBKYXZhMTNDb21tYW5kTGF1bmNoZXIgewogCi0gICAgcHVibGljIFZtc0NvbW1hbmRMYXVuY2hlcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBMYXVuY2hlcyB0aGUgZ2l2ZW4gY29tbWFuZCBpbiBhIG5ldyBwcm9jZXNzLgogICAgICAqCkBAIC01Myw3ICs0OSw4IEBACiAgICAgcHVibGljIFByb2Nlc3MgZXhlYyhQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIGNtZCwgU3RyaW5nW10gZW52KQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGNtZEZpbGUgPSBjcmVhdGVDb21tYW5kRmlsZShwcm9qZWN0LCBjbWQsIGVudik7Ci0gICAgICAgIFByb2Nlc3MgcCA9IHN1cGVyLmV4ZWMocHJvamVjdCwgbmV3IFN0cmluZ1tdIHtjbWRGaWxlLmdldFBhdGgoKX0sIGVudik7CisgICAgICAgIFByb2Nlc3MgcCA9CisgICAgICAgICAgICBzdXBlci5leGVjKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7Y21kRmlsZS5nZXRQYXRoKCl9LCBlbnYpOwogICAgICAgICBkZWxldGVBZnRlcihjbWRGaWxlLCBwKTsKICAgICAgICAgcmV0dXJuIHA7CiAgICAgfQpAQCAtODAsNyArNzcsOCBAQAogICAgIHB1YmxpYyBQcm9jZXNzIGV4ZWMoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBjbWRGaWxlID0gY3JlYXRlQ29tbWFuZEZpbGUocHJvamVjdCwgY21kLCBlbnYpOwotICAgICAgICBQcm9jZXNzIHAgPSBzdXBlci5leGVjKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7Y21kRmlsZS5nZXRQYXRoKCl9LCBlbnYsIHdvcmtpbmdEaXIpOworICAgICAgICBQcm9jZXNzIHAgPSBzdXBlci5leGVjKHByb2plY3QsIG5ldyBTdHJpbmdbXSB7Y21kRmlsZS5nZXRQYXRoKCl9LCBlbnYsCisgICAgICAgICAgICB3b3JraW5nRGlyKTsKICAgICAgICAgZGVsZXRlQWZ0ZXIoY21kRmlsZSwgcCk7CiAgICAgICAgIHJldHVybiBwOwogICAgIH0KQEAgLTk2LDkgKzk0LDcgQEAKICAgICBwcml2YXRlIEZpbGUgY3JlYXRlQ29tbWFuZEZpbGUoZmluYWwgUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSBjbWQsIFN0cmluZ1tdIGVudikKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBzY3JpcHQgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKHByb2plY3QsICJBTlQiLCAiLkNPTSIsIG51bGwsIHRydWUsIHRydWUpOwotICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHNjcmlwdCkpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihzY3JpcHQpKSkgewogCiAgICAgICAgICAgICAvLyBhZGQgdGhlIGVudmlyb25tZW50IGFzIGxvZ2ljYWxzIHRvIHRoZSBEQ0wgc2NyaXB0CiAgICAgICAgICAgICBpZiAoZW52ICE9IG51bGwpIHsKQEAgLTEyMSwyMyArMTE3LDE4IEBACiAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUoY21kW2ldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzY3JpcHQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZUFmdGVyKGZpbmFsIEZpbGUgZiwgZmluYWwgUHJvY2VzcyBwKSB7Ci0gICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBwLndhaXRGb3IoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGUoZik7CisgICAgICAgIG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwLndhaXRGb3IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgIH0KLSAgICAgICAgfS5zdGFydCgpOworICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZShmKTsKKyAgICAgICAgfSkuc3RhcnQoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9XaW5OVENvbW1hbmRMYXVuY2hlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbGF1bmNoZXIvV2luTlRDb21tYW5kTGF1bmNoZXIuamF2YQppbmRleCA2NWFiYWZjLi5iZDIyNWNlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9sYXVuY2hlci9XaW5OVENvbW1hbmRMYXVuY2hlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2xhdW5jaGVyL1dpbk5UQ29tbWFuZExhdW5jaGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0ptb2QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL21vZHVsZXMvSm1vZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjBlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0ptb2QuamF2YQpAQCAtMCwwICsxLDEyODQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubW9kdWxlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3BpLlRvb2xQcm92aWRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTWVyZ2luZ01hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlJlc291cmNlVXRpbHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTW9kdWxlVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5VbmlvbjsKKworLyoqCisgKiBDcmVhdGVzIGEgbGlua2FibGUgLmptb2QgZmlsZSBmcm9tIGEgbW9kdWxhciBqYXIgZmlsZSwgYW5kIG9wdGlvbmFsbHkgZnJvbQorICogb3RoZXIgcmVzb3VyY2UgZmlsZXMgc3VjaCBhcyBuYXRpdmUgbGlicmFyaWVzIGFuZCBkb2N1bWVudHMuICBFcXVpdmFsZW50CisgKiB0byB0aGUgSkRLJ3MKKyAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL3Rvb2xzL2ptb2QuaHRtbCI+am1vZDwvYT4KKyAqIHRvb2wuCisgKiA8cD4KKyAqIFN1cHBvcnRlZCBhdHRyaWJ1dGVzOgorICogPGRsPgorICogPGR0PntAY29kZSBkZXN0RmlsZX0KKyAqIDxkZD5SZXF1aXJlZCwgam1vZCBmaWxlIHRvIGNyZWF0ZS4KKyAqIDxkdD57QGNvZGUgY2xhc3NwYXRofQorICogPGR0PntAY29kZSBjbGFzc3BhdGhyZWZ9CisgKiA8ZGQ+V2hlcmUgdG8gbG9jYXRlIGZpbGVzIHRvIGJlIHBsYWNlZCBpbiB0aGUgam1vZCBmaWxlLgorICogPGR0PntAY29kZSBtb2R1bGVwYXRofQorICogPGR0PntAY29kZSBtb2R1bGVwYXRocmVmfQorICogPGRkPldoZXJlIHRvIGxvY2F0ZSBkZXBlbmRlbmNpZXMuCisgKiA8ZHQ+e0Bjb2RlIGNvbW1hbmRwYXRofQorICogPGR0PntAY29kZSBjb21tYW5kcGF0aHJlZn0KKyAqIDxkZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBjb21tYW5kcyB0byBpbmNsdWRlIGluIGptb2QuCisgKiA8ZHQ+e0Bjb2RlIGhlYWRlcnBhdGh9CisgKiA8ZHQ+e0Bjb2RlIGhlYWRlcnBhdGhyZWZ9CisgKiA8ZGQ+RGlyZWN0b3JpZXMgY29udGFpbmluZyBoZWFkZXIgZmlsZXMgdG8gaW5jbHVkZSBpbiBqbW9kLgorICogPGR0PntAY29kZSBjb25maWdwYXRofQorICogPGR0PntAY29kZSBjb25maWdwYXRocmVmfQorICogPGRkPkRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlci1lZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGVzCisgKiAgICAgdG8gaW5jbHVkZSBpbiBqbW9kLgorICogPGR0PntAY29kZSBsZWdhbHBhdGh9CisgKiA8ZHQ+e0Bjb2RlIGxlZ2FscGF0aHJlZn0KKyAqIDxkZD5EaXJlY3RvcmllcyBjb250YWluaW5nIGxlZ2FsIGxpY2Vuc2VzIGFuZCBub3RpY2VzIHRvIGluY2x1ZGUgaW4gam1vZC4KKyAqIDxkdD57QGNvZGUgbmF0aXZlbGlicGF0aH0KKyAqIDxkdD57QGNvZGUgbmF0aXZlbGlicGF0aHJlZn0KKyAqIDxkZD5EaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBsaWJyYXJpZXMgdG8gaW5jbHVkZSBpbiBqbW9kLgorICogPGR0PntAY29kZSBtYW5wYXRofQorICogPGR0PntAY29kZSBtYW5wYXRocmVmfQorICogPGRkPkRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbWFuIHBhZ2VzIHRvIGluY2x1ZGUgaW4gam1vZC4KKyAqIDxkdD57QGNvZGUgdmVyc2lvbn0KKyAqIDxkZD5Nb2R1bGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbGFuZy9tb2R1bGUvTW9kdWxlRGVzY3JpcHRvci5WZXJzaW9uLmh0bWwiPnZlcnNpb248L2E+LgorICogPGR0PntAY29kZSBtYWluY2xhc3N9CisgKiA8ZGQ+TWFpbiBjbGFzcyBvZiBtb2R1bGUuCisgKiA8ZHQ+e0Bjb2RlIHBsYXRmb3JtfQorICogPGRkPlRoZSB0YXJnZXQgcGxhdGZvcm0gZm9yIHRoZSBqbW9kLiAgQSBwYXJ0aWN1bGFyIEpESydzIHBsYXRmb3JtCisgKiBjYW4gYmUgc2VlbiBieSBydW5uaW5nCisgKiA8Y29kZT5qbW9kIGRlc2NyaWJlICRKREtfSE9NRS9qbW9kcy9qYXZhLmJhc2Uuam1vZCB8IGdyZXAgLWkgcGxhdGZvcm08L2NvZGU+LgorICogPGR0PntAY29kZSBoYXNoTW9kdWxlc1BhdHRlcm59CisgKiA8ZGQ+UmVndWxhciBleHByZXNzaW9uIGZvciBuYW1lcyBvZiBtb2R1bGVzIGluIHRoZSBtb2R1bGUgcGF0aAorICogICAgIHdoaWNoIGRlcGVuZCBvbiB0aGUgam1vZCBiZWluZyBjcmVhdGVkLCBhbmQgd2hpY2ggc2hvdWxkIGhhdmUKKyAqICAgICBoYXNoZXMgZ2VuZXJhdGVkIGZvciB0aGVtIGFuZCBpbmNsdWRlZCBpbiB0aGUgbmV3IGptb2QuCisgKiA8ZHQ+e0Bjb2RlIHJlc29sdmVCeURlZmF1bHR9CisgKiA8ZGQ+Qm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGptb2Qgc2hvdWxkIGJlIG9uZSBvZgorICogICAgIHRoZSBkZWZhdWx0IHJlc29sdmVkIG1vZHVsZXMgaW4gYW4gYXBwbGljYXRpb24uICBEZWZhdWx0IGlzIHRydWUuCisgKiA8ZHQ+e0Bjb2RlIG1vZHVsZVdhcm5pbmdzfQorICogPGRkPldoZXRoZXIgdG8gZW1pdCB3YXJuaW5ncyB3aGVuIHJlc29sdmluZyBtb2R1bGVzIHdoaWNoIGFyZQorICogICAgIG5vdCByZWNvbW1lbmRlZCBmb3IgdXNlLiAgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb25lIG9mIG1vcmUgb2YKKyAqICAgICB0aGUgZm9sbG93aW5nOgorICogICAgIDxkbD4KKyAqICAgICA8ZHQ+e0Bjb2RlIGRlcHJlY2F0ZWR9CisgKiAgICAgPGRkPldhcm4gaWYgbW9kdWxlIGlzIGRlcHJlY2F0ZWQKKyAqICAgICA8ZHQ+e0Bjb2RlIGxlYXZpbmd9CisgKiAgICAgPGRkPldhcm4gaWYgbW9kdWxlIGlzIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwKKyAqICAgICA8ZHQ+e0Bjb2RlIGluY3ViYXRpbmd9CisgKiAgICAgPGRkPldhcm4gaWYgbW9kdWxlIGlzIGFuIGluY3ViYXRpbmcgKG5vdCB5ZXQgb2ZmaWNpYWwpIG1vZHVsZQorICogICAgIDwvZGw+CisgKiA8L2RsPgorICoKKyAqIDxwPgorICogU3VwcG9ydGVkIG5lc3RlZCBlbGVtZW50czoKKyAqIDxkbD4KKyAqIDxkdD57QGNvZGUgPGNsYXNzcGF0aD59CisgKiA8ZGQ+UGF0aCBpbmRpY2F0aW5nIHdoZXJlIHRvIGxvY2F0ZSBmaWxlcyB0byBiZSBwbGFjZWQgaW4gdGhlIGptb2QgZmlsZS4KKyAqIDxkdD57QGNvZGUgPG1vZHVsZXBhdGg+fQorICogPGRkPlBhdGggaW5kaWNhdGluZyB3aGVyZSB0byBsb2NhdGUgZGVwZW5kZW5jaWVzLgorICogPGR0PntAY29kZSA8Y29tbWFuZHBhdGg+fQorICogPGRkPlBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBuYXRpdmUgY29tbWFuZHMgdG8gaW5jbHVkZSBpbiBqbW9kLgorICogPGR0PntAY29kZSA8aGVhZGVycGF0aD59CisgKiA8ZGQ+UGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGhlYWRlciBmaWxlcyB0byBpbmNsdWRlIGluIGptb2QuCisgKiA8ZHQ+e0Bjb2RlIDxjb25maWdwYXRoPn0KKyAqIDxkZD5QYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlci1lZGl0YWJsZSBjb25maWd1cmF0aW9uIGZpbGVzCisgKiAgICAgdG8gaW5jbHVkZSBpbiBqbW9kLgorICogPGR0PntAY29kZSA8bGVnYWxwYXRoPn0KKyAqIDxkZD5QYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbGVnYWwgbm90aWNlcyB0byBpbmNsdWRlIGluIGptb2QuCisgKiA8ZHQ+e0Bjb2RlIDxuYXRpdmVsaWJwYXRoPn0KKyAqIDxkZD5QYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbmF0aXZlIGxpYnJhcmllcyB0byBpbmNsdWRlIGluIGptb2QuCisgKiA8ZHQ+e0Bjb2RlIDxtYW5wYXRoPn0KKyAqIDxkZD5QYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbWFuIHBhZ2VzIHRvIGluY2x1ZGUgaW4gam1vZC4KKyAqIDxkdD57QGNvZGUgPHZlcnNpb24+fQorICogPGRkPjxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sIj5Nb2R1bGUgdmVyc2lvbjwvYT4gb2Ygam1vZC4KKyAqICAgICBNdXN0IGhhdmUgYSByZXF1aXJlZCB7QGNvZGUgbnVtYmVyfSBhdHRyaWJ1dGUuICBNYXkgYWxzbyBoYXZlIG9wdGlvbmFsCisgKiAgICAge0Bjb2RlIHByZVJlbGVhc2V9IGFuZCB7QGNvZGUgYnVpbGR9IGF0dHJpYnV0ZXMuCisgKiA8ZHQ+e0Bjb2RlIDxtb2R1bGVXYXJuaW5nPn0KKyAqIDxkZD5IYXMgb25lIHJlcXVpcmVkIGF0dHJpYnV0ZSwge0Bjb2RlIHJlYXNvbn0uICBTZWUge0Bjb2RlIG1vZHVsZVdhcm5pbmdzfQorICogICAgIGF0dHJpYnV0ZSBhYm92ZS4gIFRoaXMgZWxlbWVudCBtYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLgorICogPC9kbD4KKyAqIDxwPgorICogZGVzdEZpbGUgYW5kIGNsYXNzcGF0aCBhcmUgcmVxdWlyZWQgZGF0YS4KKyAqCisgKiBAc2luY2UgMS4xMC42CisgKi8KK3B1YmxpYyBjbGFzcyBKbW9kCitleHRlbmRzIFRhc2sgeworICAgIC8qKiBMb2NhdGlvbiBvZiBqbW9kIGZpbGUgdG8gYmUgY3JlYXRlZC4gKi8KKyAgICBwcml2YXRlIEZpbGUgam1vZEZpbGU7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIG9mIGZpbGVzICh1c3VhbGx5IGphciBmaWxlcyBvciBkaXJlY3RvcmllcyBjb250YWluaW5nCisgICAgICogY29tcGlsZWQgY2xhc3NlcykgZnJvbSB3aGljaCB0byBjcmVhdGUgam1vZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOworCisgICAgLyoqCisgICAgICogUGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG1vZHVsZXMgb24gd2hpY2ggdGhlIG1vZHVsZXMKKyAgICAgKiBpbiB0aGUgY2xhc3NwYXRoIGRlcGVuZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggbW9kdWxlUGF0aDsKKworICAgIC8qKgorICAgICAqIFBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBleGVjdXRhYmxlIGZpbGVzIHRvIGJ1bmRsZSBpbiB0aGUKKyAgICAgKiBjcmVhdGVkIGptb2QuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIGNvbW1hbmRQYXRoOworCisgICAgLyoqCisgICAgICogUGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgdG8gYnVuZGxlIGluIHRoZQorICAgICAqIGNyZWF0ZWQgam1vZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggY29uZmlnUGF0aDsKKworICAgIC8qKgorICAgICAqIFBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBpbmNsdWRhYmxlIGhlYWRlciBmaWxlcyAoc3VjaCBhcyBmb3IKKyAgICAgKiBvdGhlciBsYW5ndWFnZXMpIHRvIGJ1bmRsZSBpbiB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqLworICAgIHByaXZhdGUgUGF0aCBoZWFkZXJQYXRoOworCisgICAgLyoqCisgICAgICogUGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGxlZ2FsIGxpY2Vuc2UgZmlsZXMgdG8gYnVuZGxlCisgICAgICogaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFBhdGggbGVnYWxQYXRoOworCisgICAgLyoqCisgICAgICogUGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBsaWJyYXJpZXMgbmVlZGVkIGJ5IGNsYXNzZXMKKyAgICAgKiBpbiB0aGUgbW9kdWxlcyBjb21wcmlzaW5nIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIG5hdGl2ZUxpYlBhdGg7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbWFudWFsIHBhZ2VzIHRvIGJ1bmRsZQorICAgICAqIGluIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICovCisgICAgcHJpdmF0ZSBQYXRoIG1hblBhdGg7CisKKyAgICAvKioKKyAgICAgKiBNb2R1bGUgdmVyc2lvbiBvZiBqbW9kLiAgRWl0aGVyIHRoaXMgb3Ige0BsaW5rICNtb2R1bGVWZXJzaW9ufQorICAgICAqIG1heSBiZSBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKKworICAgIC8qKiBNb2R1bGUgdmVyc2lvbiBvZiBqbW9kLiAgRWl0aGVyIHRoaXMgb3Ige0BsaW5rICN2ZXJzaW9ufSBtYXkgYmUgc2V0LiAqLworICAgIHByaXZhdGUgTW9kdWxlVmVyc2lvbiBtb2R1bGVWZXJzaW9uOworCisgICAgLyoqCisgICAgICogTWFpbiBjbGFzcyB0byBleGVjdXRlLCBpZiBKYXZhIGF0dGVtcHRzIHRvIGV4ZWN1dGUgam1vZCdzIG1vZHVsZQorICAgICAqIHdpdGhvdXQgc3BlY2lmeWluZyBhIG1haW4gY2xhc3MgZXhwbGljaXRseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBtYWluQ2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBUYXJnZXQgcGxhdGZvcm0gb2YgY3JlYXRlZCBqbW9kLiAgRXhhbXBsZXMgYXJlIHtAY29kZSB3aW5kb3dzLWFtZDY0fQorICAgICAqIGFuZCB7QGNvZGUgbGludXgtYW1kNjR9LiAgVGFyZ2V0IHBsYXRmb3JtIGlzIGFuIGF0dHJpYnV0ZQorICAgICAqIG9mIGVhY2ggSkRLLCB3aGljaCBjYW4gYmUgc2VlbiBieSBleGVjdXRpbmcKKyAgICAgKiA8Y29kZT5qbW9kIGRlc2NyaWJlICRKREtfSE9NRS9qbW9kcy9qYXZhLmJhc2Uuam1vZDwvY29kZT4gYW5kCisgICAgICogc2VhcmNoaW5nIHRoZSBvdXRwdXQgZm9yIGEgbGluZSBzdGFydGluZyB3aXRoIHtAY29kZSBwbGF0Zm9ybX0uCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGxhdGZvcm07CisKKyAgICAvKioKKyAgICAgKiBSZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgbmFtZXMgb2YgbW9kdWxlcyB3aGljaCBkZXBlbmQgb24gdGhlCisgICAgICogdGhlIGNyZWF0ZWQgam1vZCdzIG1vZHVsZSwgZm9yIHdoaWNoIGhhc2hlcyBzaG91bGQgYmUgYWRkZWQgdG8gdGhlCisgICAgICogY3JlYXRlZCBqbW9kLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGhhc2hNb2R1bGVzUGF0dGVybjsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIGNyZWF0ZWQgam1vZCBzaG91bGQgYmUgc2VlbiBieSBKYXZhIHdoZW4gcHJlc2VudCBpbiBhCisgICAgICogbW9kdWxlIHBhdGgsIGV2ZW4gaWYgbm90IGV4cGxpY2l0bHkgbmFtZWQuICBOb3JtYWxseSB0cnVlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlQnlEZWZhdWx0ID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFJlYXNvbnMgd2h5IG1vZHVsZSByZXNvbHV0aW9uIGR1cmluZyBqbW9kIGNyZWF0aW9uIG1heSBlbWl0IHdhcm5pbmdzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvbHV0aW9uV2FybmluZ1NwZWM+IG1vZHVsZVdhcm5pbmdzID0KKyAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGptb2QgZmlsZSB0byBjcmVhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxvY2F0aW9uIG9mIGptb2QgZmlsZQorICAgICAqCisgICAgICogQHNlZSAjc2V0RGVzdEZpbGUoRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREZXN0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIGptb2RGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBqbW9kIGZpbGUgdG8gY3JlYXRlLgorICAgICAqIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSBsb2NhdGlvbiB3aGVyZSBqbW9kIGZpbGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlKGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICB0aGlzLmptb2RGaWxlID0gZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIHVuY29uZmlndXJlZCB7QGNvZGUgPGNsYXNzcGF0aD59IGNoaWxkIGVsZW1lbnQgd2hpY2ggY2FuCisgICAgICogc3BlY2lmeSB0aGUgZmlsZXMgd2hpY2ggd2lsbCBjb21wcmlzZSB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcsIHVuY29uZmlndXJlZCBjaGlsZCBlbGVtZW50CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDbGFzc3BhdGgoUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDbGFzc3BhdGgoKSB7CisgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NwYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2xhc3NwYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgd2hpY2ggc3BlY2lmaWVzIHRoZSBmaWxlcyAodXN1YWxseSBtb2R1bGFyIC5qYXIgZmlsZXMpCisgICAgICogd2hpY2ggd2lsbCBjb21wcmlzZSB0aGUgY3JlYXRlZCBqbW9kIGZpbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggb2YgY29uc3RpdHVlbnQgZmlsZXMKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENsYXNzcGF0aChQYXRoKQorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSBmaWxlcyB0aGF0IHdpbGwgY29tcHJpc2UgdGhlIGNyZWF0ZWQgam1vZAorICAgICAqIGZpbGUuICBVc3VhbGx5IHRoaXMgY29udGFpbnMgYSBzaW5nbGUgbW9kdWxhciAuamFyIGZpbGUuCisgICAgICogPHA+CisgICAgICogVGhlIGNsYXNzcGF0aCBpcyByZXF1aXJlZCBhbmQgbXVzdCBub3QgYmUgZW1wdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIG9mIGZpbGVzIHRoYXQgd2lsbCBjb21wcmlzZSBqbW9kCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVDbGFzc3BhdGgoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzcGF0aChmaW5hbCBQYXRoIHBhdGgpIHsKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzcGF0aCA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGFzc3BhdGguYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB7QGxpbmtwbGFpbiAjc2V0Q2xhc3NwYXRoKFBhdGgpIGNsYXNzcGF0aCBhdHRyaWJ1dGV9IGZyb20gYQorICAgICAqIHBhdGggcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZiByZWZlcmVuY2UgdG8gcGF0aCB3aGljaCB3aWxsIGFjdCBhcyBjbGFzc3BhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGhSZWYoZmluYWwgUmVmZXJlbmNlIHJlZikgeworICAgICAgICBjcmVhdGVDbGFzc3BhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjaGlsZCB7QGNvZGUgPG1vZHVsZVBhdGg+fSBlbGVtZW50IHdoaWNoIGNhbiBjb250YWluIGEKKyAgICAgKiBwYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbW9kdWxlcyB1cG9uIHdoaWNoIG1vZHVsZXMgaW4gdGhlCisgICAgICoge0BsaW5rcGxhaW4gI3NldENsYXNzcGF0aChQYXRoKSBjbGFzc3BhdGh9IGRlcGVuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0TW9kdWxlUGF0aChQYXRoKQorICAgICAqLworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZU1vZHVsZVBhdGgoKSB7CisgICAgICAgIGlmIChtb2R1bGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIG1vZHVsZVBhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtb2R1bGVQYXRoLmNyZWF0ZVBhdGgoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyBwYXRoIG9mIGRpcmVjdG9yaWVzIHdoaWNoIGNvbnRhaW4gbW9kdWxlcyBvbiB3aGljaAorICAgICAqIHRoZSBjcmVhdGVkIGptb2QncyB7QGxpbmtwbGFpbiAjc2V0Q2xhc3NwYXRoKFBhdGgpIGNvbnN0aXR1ZW50IG1vZHVsZXN9CisgICAgICogZGVwZW5kLgorICAgICAqCisgICAgICogQHJldHVybiBwYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgbW9kdWxlcyBuZWVkZWQgYnkKKyAgICAgKiAgICAgICAgIGNsYXNzcGF0aCBtb2R1bGVzCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRNb2R1bGVQYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0TW9kdWxlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG1vZHVsZVBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBwYXRoIG9mIGRpcmVjdG9yaWVzIHdoaWNoIGNvbnRhaW4gbW9kdWxlcworICAgICAqIG9uIHdoaWNoIHRoZSBjcmVhdGVkIGptb2QncworICAgICAqIHtAbGlua3BsYWluICNzZXRDbGFzc3BhdGgoUGF0aCkgY29uc3RpdHVlbnQgbW9kdWxlc30gZGVwZW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG1vZHVsZXMgbmVlZGVkIGJ5CisgICAgICogICAgICAgICAgICAgY2xhc3NwYXRoIG1vZHVsZXMKKyAgICAgKgorICAgICAqIEBzZWUgI2NyZWF0ZU1vZHVsZVBhdGgoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVBhdGgoZmluYWwgUGF0aCBwYXRoKSB7CisgICAgICAgIGlmIChtb2R1bGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubW9kdWxlUGF0aCA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2R1bGVQYXRoLmFwcGVuZChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMge0BsaW5rcGxhaW4gI3NldE1vZHVsZVBhdGgoUGF0aCkgbW9kdWxlIHBhdGh9CisgICAgICogZnJvbSBhIHBhdGggcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZiByZWZlcmVuY2UgdG8gcGF0aCB3aGljaCB3aWxsIGFjdCBhcyBtb2R1bGUgcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVBhdGhSZWYoZmluYWwgUmVmZXJlbmNlIHJlZikgeworICAgICAgICBjcmVhdGVNb2R1bGVQYXRoKCkuc2V0UmVmaWQocmVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2hpbGQgZWxlbWVudCB3aGljaCBjYW4gY29udGFpbiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMKKyAgICAgKiBjb250YWluaW5nIG5hdGl2ZSBleGVjdXRhYmxlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0Q29tbWFuZFBhdGgoUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDb21tYW5kUGF0aCgpIHsKKyAgICAgICAgaWYgKGNvbW1hbmRQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbW1hbmRQYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tbWFuZFBhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIHBhdGggb2YgZGlyZWN0b3JpZXMgd2hpY2ggY29udGFpbiBuYXRpdmUKKyAgICAgKiBleGVjdXRhYmxlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBleGVjdXRhYmxlcworICAgICAqCisgICAgICogQHNlZSAjc2V0Q29tbWFuZFBhdGgoUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRDb21tYW5kUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgcGF0aCBvZiBkaXJlY3RvcmllcyB3aGljaCBjb250YWluIG5hdGl2ZQorICAgICAqIGV4ZWN1dGFibGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggbGlzdCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIG5hdGl2ZSBleGVjdXRhYmxlcworICAgICAqCisgICAgICogQHNlZSAjY3JlYXRlQ29tbWFuZFBhdGgoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1hbmRQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAoY29tbWFuZFBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb21tYW5kUGF0aCA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21tYW5kUGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHtAbGlua3BsYWluICNzZXRDb21tYW5kUGF0aChQYXRoKSBjb21tYW5kIHBhdGh9CisgICAgICogZnJvbSBhIHBhdGggcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZiByZWZlcmVuY2UgdG8gcGF0aCB3aGljaCB3aWxsIGFjdCBhcyBjb21tYW5kIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21tYW5kUGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGNyZWF0ZUNvbW1hbmRQYXRoKCkuc2V0UmVmaWQocmVmKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2hpbGQgZWxlbWVudCB3aGljaCBjYW4gY29udGFpbiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMKKyAgICAgKiBjb250YWluaW5nIHVzZXIgY29uZmlndXJhdGlvbiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldENvbmZpZ1BhdGgoUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVDb25maWdQYXRoKCkgeworICAgICAgICBpZiAoY29uZmlnUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBjb25maWdQYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uZmlnUGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBjb250YWluCisgICAgICogdXNlciBjb25maWd1cmF0aW9uIGZpbGVzLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlciBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRDb25maWdQYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0Q29uZmlnUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIGNvbnRhaW4KKyAgICAgKiB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBsaXN0IG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgdXNlciBjb25maWd1cmF0aW9uIGZpbGVzCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVDb25maWdQYXRoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAoY29uZmlnUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmNvbmZpZ1BhdGggPSBwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uZmlnUGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHtAbGlua3BsYWluICNzZXRDb25maWdQYXRoKFBhdGgpIGNvbmZpZ3VyYXRpb24gZmlsZSBwYXRofQorICAgICAqIGZyb20gYSBwYXRoIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWYgcmVmZXJlbmNlIHRvIHBhdGggd2hpY2ggd2lsbCBhY3QgYXMgY29uZmlndXJhdGlvbiBmaWxlIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWdQYXRoUmVmKGZpbmFsIFJlZmVyZW5jZSByZWYpIHsKKyAgICAgICAgY3JlYXRlQ29uZmlnUGF0aCgpLnNldFJlZmlkKHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNoaWxkIGVsZW1lbnQgd2hpY2ggY2FuIGNvbnRhaW4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzCisgICAgICogY29udGFpbmluZyBjb21waWxlLXRpbWUgaGVhZGVyIGZpbGVzIGZvciB0aGlyZCBwYXJ0eSB1c2UsIHRvIGluY2x1ZGUKKyAgICAgKiBpbiB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcsIHVuY29uZmlndXJlZCBjaGlsZCBlbGVtZW50CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRIZWFkZXJQYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlSGVhZGVyUGF0aCgpIHsKKyAgICAgICAgaWYgKGhlYWRlclBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgaGVhZGVyUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhlYWRlclBhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIGEgcGF0aCBvZiBkaXJlY3RvcmllcyB3aGljaCBob2xkIGNvbXBpbGUtdGltZQorICAgICAqIGhlYWRlciBmaWxlcyBmb3IgdGhpcmQgcGFydHkgdXNlLCBhbGwgb2Ygd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgKiBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBoZWFkZXIgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRIZWFkZXJQYXRoKCkgeworICAgICAgICByZXR1cm4gaGVhZGVyUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIGEgcGF0aCBvZiBkaXJlY3RvcmllcyB3aGljaCBob2xkIGNvbXBpbGUtdGltZQorICAgICAqIGhlYWRlciBmaWxlcyBmb3IgdGhpcmQgcGFydHkgdXNlLCBhbGwgb2Ygd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKKyAgICAgKiBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIG9mIGRpcmVjdG9yaWVzIGNvbnRhaW5pbmcgaGVhZGVyIGZpbGVzCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVIZWFkZXJQYXRoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAoaGVhZGVyUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhdGggPSBwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyUGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHtAbGlua3BsYWluICNzZXRIZWFkZXJQYXRoKFBhdGgpIGhlYWRlciBwYXRofQorICAgICAqIGZyb20gYSBwYXRoIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWYgcmVmZXJlbmNlIHRvIHBhdGggd2hpY2ggd2lsbCBhY3QgYXMgaGVhZGVyIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXRoUmVmKGZpbmFsIFJlZmVyZW5jZSByZWYpIHsKKyAgICAgICAgY3JlYXRlSGVhZGVyUGF0aCgpLnNldFJlZmlkKHJlZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNoaWxkIGVsZW1lbnQgd2hpY2ggY2FuIGNvbnRhaW4gYSBsaXN0IG9mIGRpcmVjdG9yaWVzCisgICAgICogY29udGFpbmluZyBsaWNlbnNlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0TGVnYWxQYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlTGVnYWxQYXRoKCkgeworICAgICAgICBpZiAobGVnYWxQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIGxlZ2FsUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxlZ2FsUGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBob2xkIGxpY2Vuc2UgZmlsZXMKKyAgICAgKiB0byBpbmNsdWRlIGluIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggY29udGFpbmluZyBkaXJlY3RvcmllcyB3aGljaCBob2xkIGxpY2Vuc2UgZmlsZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRMZWdhbFBhdGgoKSB7CisgICAgICAgIHJldHVybiBsZWdhbFBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIGhvbGQgbGljZW5zZSBmaWxlcworICAgICAqIHRvIGluY2x1ZGUgaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHBhdGggY29udGFpbmluZyBkaXJlY3RvcmllcyB3aGljaCBob2xkIGxpY2Vuc2UgZmlsZXMKKyAgICAgKgorICAgICAqIEBzZWUgI2NyZWF0ZUxlZ2FsUGF0aCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TGVnYWxQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAobGVnYWxQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubGVnYWxQYXRoID0gcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlZ2FsUGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHtAbGlua3BsYWluICNzZXRMZWdhbFBhdGgoUGF0aCkgbGVnYWwgbGljZW5zZXMgcGF0aH0KKyAgICAgKiBmcm9tIGEgcGF0aCByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmIHJlZmVyZW5jZSB0byBwYXRoIHdoaWNoIHdpbGwgYWN0IGFzIGxlZ2FsIHBhdGgKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZWdhbFBhdGhSZWYoZmluYWwgUmVmZXJlbmNlIHJlZikgeworICAgICAgICBjcmVhdGVMZWdhbFBhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjaGlsZCBlbGVtZW50IHdoaWNoIGNhbiBjb250YWluIGEgbGlzdCBvZiBkaXJlY3RvcmllcworICAgICAqIGNvbnRhaW5pbmcgbmF0aXZlIGxpYnJhcmllcyB0byBpbmNsdWRlIGluIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldE5hdGl2ZUxpYlBhdGgoUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBjcmVhdGVOYXRpdmVMaWJQYXRoKCkgeworICAgICAgICBpZiAobmF0aXZlTGliUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBuYXRpdmVMaWJQYXRoID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmF0aXZlTGliUGF0aC5jcmVhdGVQYXRoKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBob2xkIG5hdGl2ZSBsaWJyYXJpZXMKKyAgICAgKiB0byBpbmNsdWRlIGluIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBuYXRpdmUgbGlicmFyaWVzCisgICAgICovCisgICAgcHVibGljIFBhdGggZ2V0TmF0aXZlTGliUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG5hdGl2ZUxpYlBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBsaXN0IG9mIGRpcmVjdG9yaWVzIHdoaWNoIGhvbGQgbmF0aXZlIGxpYnJhcmllcworICAgICAqIHRvIGluY2x1ZGUgaW4gdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBuYXRpdmUgbGlicmFyaWVzCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVOYXRpdmVMaWJQYXRoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYXRpdmVMaWJQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAobmF0aXZlTGliUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLm5hdGl2ZUxpYlBhdGggPSBwYXRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmF0aXZlTGliUGF0aC5hcHBlbmQocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHtAbGlua3BsYWluICNzZXROYXRpdmVMaWJQYXRoKFBhdGgpIG5hdGl2ZSBsaWJyYXJ5IHBhdGh9CisgICAgICogZnJvbSBhIHBhdGggcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZiByZWZlcmVuY2UgdG8gcGF0aCB3aGljaCB3aWxsIGFjdCBhcyBuYXRpdmUgbGlicmFyeSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmF0aXZlTGliUGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGNyZWF0ZU5hdGl2ZUxpYlBhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjaGlsZCBlbGVtZW50IHdoaWNoIGNhbiBjb250YWluIGEgbGlzdCBvZiBkaXJlY3RvcmllcworICAgICAqIGNvbnRhaW5pbmcgbWFuIHBhZ2VzIChwcm9ncmFtIG1hbnVhbHMsIHR5cGljYWxseSBpbiB0cm9mZiBmb3JtYXQpCisgICAgICogdG8gaW5jbHVkZSBpbiB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcsIHVuY29uZmlndXJlZCBjaGlsZCBlbGVtZW50CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRNYW5QYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlTWFuUGF0aCgpIHsKKyAgICAgICAgaWYgKG1hblBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbWFuUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hblBhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBtYW4gcGFnZXMKKyAgICAgKiB0byBpbmNsdWRlIGluIGNyZWF0ZWQgam1vZC4gIE1hbiBwYWdlcyBhcmUgdGV4dHVhbCBwcm9ncmFtIG1hbnVhbHMsCisgICAgICogdHlwaWNhbGx5IGluIHRyb2ZmIGZvcm1hdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcGF0aCBjb250YWluaW5nIGRpcmVjdG9yaWVzIHdoaWNoIGhvbGQgbWFuIHBhZ2VzIHRvIGluY2x1ZGUKKyAgICAgKiAgICAgICAgIGluIGptb2QKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRNYW5QYXRoKCkgeworICAgICAgICByZXR1cm4gbWFuUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIGxpc3Qgb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBtYW4gcGFnZXMKKyAgICAgKiB0byBpbmNsdWRlIGluIGNyZWF0ZWQgam1vZC4gIE1hbiBwYWdlcyBhcmUgdGV4dHVhbCBwcm9ncmFtIG1hbnVhbHMsCisgICAgICogdHlwaWNhbGx5IGluIHRyb2ZmIGZvcm1hdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHBhdGggY29udGFpbmluZyBkaXJlY3RvcmllcyB3aGljaCBob2xkIG1hbiBwYWdlcyB0byBpbmNsdWRlCisgICAgICogICAgICAgICAgICAgaW4gam1vZAorICAgICAqCisgICAgICogQHNlZSAjY3JlYXRlTWFuUGF0aCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuUGF0aChmaW5hbCBQYXRoIHBhdGgpIHsKKyAgICAgICAgaWYgKG1hblBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5tYW5QYXRoID0gcGF0aDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hblBhdGguYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB7QGxpbmtwbGFpbiAjc2V0TWFuUGF0aChQYXRoKSBtYW4gcGFnZXMgcGF0aH0KKyAgICAgKiBmcm9tIGEgcGF0aCByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmIHJlZmVyZW5jZSB0byBwYXRoIHdoaWNoIHdpbGwgYWN0IGFzIG1vZHVsZSBwYXRoCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuUGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGNyZWF0ZU1hblBhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjaGlsZCBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBvZgorICAgICAqIHRoZSBtb2R1bGUgcmVwcmVzZW50ZWQgYnkgdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIE1vZHVsZVZlcnNpb24gY3JlYXRlVmVyc2lvbigpIHsKKyAgICAgICAgaWYgKG1vZHVsZVZlcnNpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJObyBtb3JlIHRoYW4gb25lIDxtb2R1bGVWZXJzaW9uPiBlbGVtZW50IGlzIGFsbG93ZWQuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBtb2R1bGVWZXJzaW9uID0gbmV3IE1vZHVsZVZlcnNpb24oKTsKKyAgICAgICAgcmV0dXJuIG1vZHVsZVZlcnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIHdoaWNoIHNwZWNpZmllcworICAgICAqIGEgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbGFuZy9tb2R1bGUvTW9kdWxlRGVzY3JpcHRvci5WZXJzaW9uLmh0bWwiPm1vZHVsZSB2ZXJzaW9uPC9hPgorICAgICAqIGZvciBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1vZHVsZSB2ZXJzaW9uIGZvciBjcmVhdGVkIGptb2QKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sIj5tb2R1bGUgdmVyc2lvbjwvYT4KKyAgICAgKiBmb3IgdGhlIGNyZWF0ZWQgam1vZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIG1vZHVsZSB2ZXJzaW9uIG9mIGNyZWF0ZWQgam1vZAorICAgICAqCisgICAgICogQHNlZSAjY3JlYXRlVmVyc2lvbigpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihmaW5hbCBTdHJpbmcgdmVyc2lvbikgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBjbGFzcyB0aGF0IGFjdHMgYXMgdGhlIGV4ZWN1dGFibGUgZW50cnkgcG9pbnQKKyAgICAgKiBvZiB0aGUgY3JlYXRlZCBqbW9kLgorICAgICAqCisgICAgICogQHJldHVybiBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBqbW9kJ3MgbWFpbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gbWFpbkNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIHRoYXQgYWN0cyBhcyB0aGUKKyAgICAgKiBleGVjdXRhYmxlIGVudHJ5IHBvaW50IG9mIHRoZSBjcmVhdGVkIGptb2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGptb2QncyBtYWluIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFpbkNsYXNzKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgdGhpcy5tYWluQ2xhc3MgPSBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIHBsYXRmb3JtIGZvciB3aGljaCB0aGUgam1vZAorICAgICAqIHdpbGwgYmUgYnVpbHQuICBQbGF0Zm9ybSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gdGhlCisgICAgICoge0Bjb2RlIGphdmEuYmFzZS5qbW9kfSBvZiBKREtzLCBhbmQgdXN1YWxseSB0YWtlIHRoZSBmb3JtCisgICAgICogPHZhcj5PUzwvdmFyPntAY29kZSAtfTx2YXI+YXJjaGl0ZWN0dXJlPC92YXI+LiAgSWYgdW5zZXQsCisgICAgICogY3VycmVudCBwbGF0Zm9ybSBpcyB1c2VkLgorICAgICAqCisgICAgICogQHJldHVybiBPUyBhbmQgYXJjaGl0ZWN0dXJlIGZvciB3aGljaCBqbW9kIHdpbGwgYmUgYnVpbHQsIG9yIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGxhdGZvcm0oKSB7CisgICAgICAgIHJldHVybiBwbGF0Zm9ybTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIHRoZSBwbGF0Zm9ybSBmb3Igd2hpY2ggdGhlIGptb2QKKyAgICAgKiB3aWxsIGJlIGJ1aWx0LiAgUGxhdGZvcm0gdmFsdWVzIGFyZSBkZWZpbmVkIGluIHRoZQorICAgICAqIHtAY29kZSBqYXZhLmJhc2Uuam1vZH0gb2YgSkRLcywgYW5kIHVzdWFsbHkgdGFrZSB0aGUgZm9ybQorICAgICAqIDx2YXI+T1M8L3Zhcj57QGNvZGUgLX08dmFyPmFyY2hpdGVjdHVyZTwvdmFyPi4gIElmIHVuc2V0LAorICAgICAqIGN1cnJlbnQgcGxhdGZvcm0gaXMgdXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBBIEpESydzIHBsYXRmb3JtIGNhbiBiZSB2aWV3ZWQgd2l0aCBhIGNvbW1hbmQgbGlrZToKKyAgICAgKiA8Y29kZT5qbW9kIGRlc2NyaWJlICRKREtfSE9NRS9qbW9kcy9qYXZhLmJhc2Uuam1vZCB8IGdyZXAgLWkgcGxhdGZvcm08L2NvZGU+LgorbyAgICAqCisgICAgICogQHBhcmFtIHBsYXRmb3JtIHBsYXRmb3JtIGZvciB3aGljaCBqbW9kIHdpbGwgYmUgY3JlYXRlZCwgb3Ige0Bjb2RlIG51bGx9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGxhdGZvcm0oZmluYWwgU3RyaW5nIHBsYXRmb3JtKSB7CisgICAgICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBzcGVjaWZpZXMgd2hpY2gKKyAgICAgKiBvZiB0aGUgbW9kdWxlcyB0aGF0IGRlcGVuZCBvbiB0aGUgam1vZCBiZWluZyBjcmVhdGVkIHNob3VsZCBoYXZlCisgICAgICogaGFzaGVzIGdlbmVyYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGptb2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlZ2V4IHNwZWNpZnlpbmcgd2hpY2ggZGVwZW5kZW50IG1vZHVsZXMgc2hvdWxkIGhhdmUKKyAgICAgKiAgICAgICAgIHRoZWlyIGdlbmVyYXRlZCBoYXNoZXMgaW5jbHVkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhhc2hNb2R1bGVzUGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIGhhc2hNb2R1bGVzUGF0dGVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIGEgcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHNwZWNpZmllcyB3aGljaAorICAgICAqIG9mIHRoZSBtb2R1bGVzIHRoYXQgZGVwZW5kIG9uIHRoZSBqbW9kIGJlaW5nIGNyZWF0ZWQgc2hvdWxkIGhhdmUKKyAgICAgKiBoYXNoZXMgZ2VuZXJhdGVkIGFuZCBhZGRlZCB0byB0aGUgam1vZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuIHJlZ2V4IHNwZWNpZnlpbmcgd2hpY2ggZGVwZW5kZW50IG1vZHVsZXMgc2hvdWxkIGhhdmUKKyAgICAgKiAgICAgICAgIHRoZWlyIGdlbmVyYXRlZCBoYXNoZXMgaW5jbHVkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIYXNoTW9kdWxlc1BhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm4pIHsKKyAgICAgICAgdGhpcy5oYXNoTW9kdWxlc1BhdHRlcm4gPSBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNyZWF0ZWQgam1vZCBzaG91bGQgYmUgdmlzaWJsZQorICAgICAqIGluIGEgbW9kdWxlIHBhdGgsIGV2ZW4gd2hlbiBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkuICBUcnVlIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgam1vZCBzaG91bGQgYmUgdmlzaWJsZSBpbiBtb2R1bGUgcGF0aHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZXNvbHZlQnlEZWZhdWx0KCkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZUJ5RGVmYXVsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNyZWF0ZWQgam1vZCBzaG91bGQgYmUgdmlzaWJsZQorICAgICAqIGluIGEgbW9kdWxlIHBhdGgsIGV2ZW4gd2hlbiBub3Qgc3BlY2lmaWVkIGV4cGxpY2l0bHkuICBUcnVlIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZSB3aGV0aGVyIGptb2Qgc2hvdWxkIGJlIHZpc2libGUgaW4gbW9kdWxlIHBhdGhzCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZUJ5RGVmYXVsdChmaW5hbCBib29sZWFuIHJlc29sdmUpIHsKKyAgICAgICAgdGhpcy5yZXNvbHZlQnlEZWZhdWx0ID0gcmVzb2x2ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY2hpbGQgZWxlbWVudCB3aGljaCBjYW4gc3BlY2lmeSB0aGUgY2lyY3Vtc3RhbmNlcworICAgICAqIHVuZGVyIHdoaWNoIGptb2QgY3JlYXRpb24gZW1pdHMgd2FybmluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldE1vZHVsZVdhcm5pbmdzKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb2x1dGlvbldhcm5pbmdTcGVjIGNyZWF0ZU1vZHVsZVdhcm5pbmcoKSB7CisgICAgICAgIFJlc29sdXRpb25XYXJuaW5nU3BlYyB3YXJuaW5nU3BlYyA9IG5ldyBSZXNvbHV0aW9uV2FybmluZ1NwZWMoKTsKKyAgICAgICAgbW9kdWxlV2FybmluZ3MuYWRkKHdhcm5pbmdTcGVjKTsKKyAgICAgICAgcmV0dXJuIHdhcm5pbmdTcGVjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiByZWFzb25zIGZvcgorICAgICAqIGptb2QgY3JlYXRpb24gdG8gZW1pdCB3YXJuaW5ncy4gIFZhbGlkIHZhbHVlcyBpbiBsaXN0IGFyZToKKyAgICAgKiB7QGNvZGUgZGVwcmVjYXRlZH0sIHtAY29kZSBsZWF2aW5nfSwge0Bjb2RlIGluY3ViYXRpbmd9LgorICAgICAqCisgICAgICogQHBhcmFtIHdhcm5pbmdMaXN0IGxpc3QgY29udGFpbmluZyBvbmUgb3IgbW9yZSBvZiB0aGUgYWJvdmUgdmFsdWVzLAorICAgICAqICAgICAgICAgICAgICAgICAgICBzZXBhcmF0ZWQgYnkgY29tbWFzCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVNb2R1bGVXYXJuaW5nKCkKKyAgICAgKiBAc2VlIEptb2QuUmVzb2x1dGlvbldhcm5pbmdSZWFzb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVXYXJuaW5ncyhmaW5hbCBTdHJpbmcgd2FybmluZ0xpc3QpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgd2FybmluZyA6IHdhcm5pbmdMaXN0LnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgIG1vZHVsZVdhcm5pbmdzLmFkZChuZXcgUmVzb2x1dGlvbldhcm5pbmdTcGVjKHdhcm5pbmcpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcm1pc3NpYmxlIHJlYXNvbnMgZm9yIGptb2QgY3JlYXRpb24gdG8gZW1pdCB3YXJuaW5ncy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc29sdXRpb25XYXJuaW5nUmVhc29uCisgICAgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0cmluZyB2YWx1ZSBpbmRpY2F0aW5nIHdhcm5pbmdzIGFyZSBlbWl0dGVkIGZvciBtb2R1bGVzCisgICAgICAgICAqIG1hcmtlZCBhcyBkZXByZWNhdGVkIChidXQgbm90IGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVQUkVDQVRFRCA9ICJkZXByZWNhdGVkIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3RyaW5nIHZhbHVlIGluZGljYXRpbmcgd2FybmluZ3MgYXJlIGVtaXR0ZWQgZm9yIG1vZHVsZXMKKyAgICAgICAgICogbWFya2VkIGFzIGRlcHJlY2F0ZWQgZm9yIHJlbW92YWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUFWSU5HID0gImxlYXZpbmciOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdHJpbmcgdmFsdWUgaW5kaWNhdGluZyB3YXJuaW5ncyBhcmUgZW1pdHRlZCBmb3IgbW9kdWxlcworICAgICAgICAgKiBkZXNpZ25hdGVkIGFzICJpbmN1YmF0aW5nIiBpbiB0aGUgSkRLLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DVUJBVElORyA9ICJpbmN1YmF0aW5nIjsKKworICAgICAgICAvKiogTWFwcyBBbnQgdGFzayB2YWx1ZXMgdG8gam1vZCBvcHRpb24gdmFsdWVzLiAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IFZBTFVFU19UT19PUFRJT05TOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIG1hcC5wdXQoREVQUkVDQVRFRCwgImRlcHJlY2F0ZWQiKTsKKyAgICAgICAgICAgIG1hcC5wdXQoTEVBVklORywgICAgImRlcHJlY2F0ZWQtZm9yLXJlbW92YWwiKTsKKyAgICAgICAgICAgIG1hcC5wdXQoSU5DVUJBVElORywgImluY3ViYXRpbmciKTsKKworICAgICAgICAgICAgVkFMVUVTX1RPX09QVElPTlMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIFZBTFVFU19UT19PUFRJT05TLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QncyBjdXJyZW50IHZhbHVlIHRvIGEgam1vZCB0b29sCisgICAgICAgICAqIG9wdGlvbiB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBqbW9kIG9wdGlvbiB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHRvQ29tbWFuZExpbmVPcHRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gVkFMVUVTX1RPX09QVElPTlMuZ2V0KGdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEge0Bjb2RlIFJlc29sdXRpb25XYXJuaW5nUmVhc29ufSBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHMgc3RyaW5nIHRvIGNvbnZlcnQKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgUmVzb2x1dGlvbldhcm5pbmdSZWFzb259IGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgICAgICogICAgICAgICBzdHJpbmcgYXJndW1lbnQKKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXNvbHV0aW9uV2FybmluZ1JlYXNvbn0gdmFsdWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVzb2x1dGlvbldhcm5pbmdSZWFzb24gdmFsdWVPZihTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIChSZXNvbHV0aW9uV2FybmluZ1JlYXNvbikKKyAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZShSZXNvbHV0aW9uV2FybmluZ1JlYXNvbi5jbGFzcywgcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBlbGVtZW50IHdoaWNoIGVuYWJsZXMgam1vZCB0b29sIHdhcm5pbmdzLiAgJ3JlYXNvbicgYXR0cmlidXRlCisgICAgICogaXMgcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlc29sdXRpb25XYXJuaW5nU3BlYyB7CisgICAgICAgIC8qKiBDb25kaXRpb24gd2hpY2ggc2hvdWxkIHRyaWdnZXIgam1vZCB3YXJuaW5nIG91dHB1dC4gKi8KKyAgICAgICAgcHJpdmF0ZSBSZXNvbHV0aW9uV2FybmluZ1JlYXNvbiByZWFzb247CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBlbGVtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlc29sdXRpb25XYXJuaW5nU3BlYygpIHsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBlbXB0eS4KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gcmVhc29uIGF0dHJpYnV0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYXNvbiBub257QGNvZGUgbnVsbH0ge0BsaW5rIEptb2QuUmVzb2x1dGlvbldhcm5pbmdSZWFzb259CisgICAgICAgICAqICAgICAgICAgICAgICAgdmFsdWUKKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhcmd1bWVudCBpcyBub3QgYSB2YWxpZAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXNvbHV0aW9uV2FybmluZ1JlYXNvbn0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvbHV0aW9uV2FybmluZ1NwZWMoU3RyaW5nIHJlYXNvbikgeworICAgICAgICAgICAgc2V0UmVhc29uKFJlc29sdXRpb25XYXJuaW5nUmVhc29uLnZhbHVlT2YocmVhc29uKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVxdWlyZWQgYXR0cmlidXRlIGNvbnRhaW5pbmcgcmVhc29uIGZvciBlbWl0dGluZyBqbW9kIHdhcm5pbmdzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNvbmRpdGlvbiB3aGljaCB0cmlnZ2VycyBqbW9kIHdhcm5pbmdzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVzb2x1dGlvbldhcm5pbmdSZWFzb24gZ2V0UmVhc29uKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIHJlYXNvbiBmb3IgZW1pdHRpbmcgam1vZCB3YXJuaW5ncy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYXNvbiBjb25kaXRpb24gd2hpY2ggdHJpZ2dlcnMgam1vZCB3YXJuaW5ncworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhc29uKFJlc29sdXRpb25XYXJuaW5nUmVhc29uIHJlYXNvbikgeworICAgICAgICAgICAgdGhpcy5yZWFzb24gPSByZWFzb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmVyaWZpZXMgdGhpcyBvYmplY3QncyBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCdzIHJlYXNvbiBpcyB7QGNvZGUgbnVsbH0KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKHJlYXNvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJyZWFzb24gYXR0cmlidXRlIGlzIHJlcXVpcmVkIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3Mgd2hldGhlciBhIHJlc291cmNlIGlzIGEgZGlyZWN0b3J5LiAgVXNlZCBmb3IgY2hlY2tpbmcgdmFsaWRpdHkKKyAgICAgKiBvZiBqbW9kIHBhdGggYXJndW1lbnRzIHdoaWNoIGhhdmUgdG8gYmUgZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdG8gY2hlY2sKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByZXNvdXJjZSBleGlzdHMgYW5kIGlzIG5vdCBhIGRpcmVjdG9yeSwKKyAgICAgKiAgICAgICAgIGZhbHNlIGlmIGl0IGlzIGEgZGlyZWN0b3J5IG9yIGRvZXMgbm90IGV4aXN0CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlZ3VsYXJGaWxlKFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZS5pc0V4aXN0cygpICYmICFyZXNvdXJjZS5pc0RpcmVjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IGFsbCBwYXRocyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gYmUgZGlyZWN0b3JpZXMgb25seSwKKyAgICAgKiByZWZlciBvbmx5IHRvIGRpcmVjdG9yaWVzLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgcGF0aCBoYXMgYW4gZXhpc3RpbmcgZmlsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgYSBub24tZGlyZWN0b3J5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGlyUGF0aHMoKSB7CisgICAgICAgIGlmIChtb2R1bGVQYXRoICE9IG51bGwKKyAgICAgICAgICAgICYmIG1vZHVsZVBhdGguc3RyZWFtKCkuYW55TWF0Y2goSm1vZDo6aXNSZWd1bGFyRmlsZSkpIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNb2R1bGVQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21tYW5kUGF0aCAhPSBudWxsCisgICAgICAgICAgICAmJiBjb21tYW5kUGF0aC5zdHJlYW0oKS5hbnlNYXRjaChKbW9kOjppc1JlZ3VsYXJGaWxlKSkgeworCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNvbW1hbmRQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25maWdQYXRoICE9IG51bGwKKyAgICAgICAgICAgICYmIGNvbmZpZ1BhdGguc3RyZWFtKCkuYW55TWF0Y2goSm1vZDo6aXNSZWd1bGFyRmlsZSkpIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb25maWdQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXJQYXRoICE9IG51bGwKKyAgICAgICAgICAgICYmIGhlYWRlclBhdGguc3RyZWFtKCkuYW55TWF0Y2goSm1vZDo6aXNSZWd1bGFyRmlsZSkpIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJIZWFkZXJQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChsZWdhbFBhdGggIT0gbnVsbAorICAgICAgICAgICAgJiYgbGVnYWxQYXRoLnN0cmVhbSgpLmFueU1hdGNoKEptb2Q6OmlzUmVndWxhckZpbGUpKSB7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTGVnYWxQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChuYXRpdmVMaWJQYXRoICE9IG51bGwKKyAgICAgICAgICAgICYmIG5hdGl2ZUxpYlBhdGguc3RyZWFtKCkuYW55TWF0Y2goSm1vZDo6aXNSZWd1bGFyRmlsZSkpIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJOYXRpdmVMaWJQYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5QYXRoICE9IG51bGwKKyAgICAgICAgICAgICYmIG1hblBhdGguc3RyZWFtKCkuYW55TWF0Y2goSm1vZDo6aXNSZWd1bGFyRmlsZSkpIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNYW5QYXRoIG11c3QgY29udGFpbiBvbmx5IGRpcmVjdG9yaWVzLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGptb2QgZmlsZSBhY2NvcmRpbmcgdG8gdGhpcyB0YXNrJ3MgcHJvcGVydGllcworICAgICAqIGFuZCBjaGlsZCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgZGVzdEZpbGUgaXMgbm90IHNldAorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgY2xhc3NwYXRoIGlzIG5vdCBzZXQgb3IgaXMgZW1wdHkKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBwYXRoIG90aGVyIHRoYW4gY2xhc3NwYXRoIHJlZmVycyB0byBhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgZmlsZSB3aGljaCBpcyBub3QgYSBkaXJlY3RvcnkKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGJvdGgge0Bjb2RlIHZlcnNpb259IGF0dHJpYnV0ZSBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSA8dmVyc2lvbj59IGNoaWxkIGVsZW1lbnQgYXJlIHByZXNlbnQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHtAY29kZSBoYXNoTW9kdWxlc1BhdHRlcm59IGlzIHNldCwgYnV0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUgcGF0aCBpcyBub3QgZGVmaW5lZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGptb2RGaWxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVzdGluYXRpb24gZmlsZSBpcyByZXF1aXJlZC4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNsYXNzcGF0aCBpcyByZXF1aXJlZC4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNsYXNzcGF0aC5zdHJlYW0oKS5ub25lTWF0Y2goUmVzb3VyY2U6OmlzRXhpc3RzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDbGFzc3BhdGggbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbnRyeSB3aGljaCBleGlzdHMuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJzaW9uICE9IG51bGwgJiYgbW9kdWxlVmVyc2lvbiAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInZlcnNpb24gYXR0cmlidXRlIGFuZCBuZXN0ZWQgPHZlcnNpb24+IGVsZW1lbnQgIgorICAgICAgICAgICAgICAgICsgImNhbm5vdCBib3RoIGJlIHByZXNlbnQuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNoTW9kdWxlc1BhdHRlcm4gIT0gbnVsbCAmJiAhaGFzaE1vZHVsZXNQYXR0ZXJuLmlzRW1wdHkoKQorICAgICAgICAgICAgJiYgbW9kdWxlUGF0aCA9PSBudWxsKSB7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiaGFzaE1vZHVsZXNQYXR0ZXJuIHJlcXVpcmVzIGEgbW9kdWxlIHBhdGgsIHNpbmNlICIKKyAgICAgICAgICAgICAgICArICJpdCB3aWxsIGdlbmVyYXRlIGhhc2hlcyBvZiB0aGUgb3RoZXIgbW9kdWxlcyB3aGljaCBkZXBlbmQgIgorICAgICAgICAgICAgICAgICsgIm9uIHRoZSBtb2R1bGUgYmVpbmcgY3JlYXRlZC4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgY2hlY2tEaXJQYXRocygpOworCisgICAgICAgIFBhdGhbXSBkZXBlbmRlbnRQYXRocyA9IHsKKyAgICAgICAgICAgIGNsYXNzcGF0aCwKKyAgICAgICAgICAgIG1vZHVsZVBhdGgsCisgICAgICAgICAgICBjb21tYW5kUGF0aCwKKyAgICAgICAgICAgIGNvbmZpZ1BhdGgsCisgICAgICAgICAgICBoZWFkZXJQYXRoLAorICAgICAgICAgICAgbGVnYWxQYXRoLAorICAgICAgICAgICAgbmF0aXZlTGliUGF0aCwKKyAgICAgICAgICAgIG1hblBhdGgsCisgICAgICAgIH07CisgICAgICAgIFVuaW9uIGFsbFJlc291cmNlcyA9IG5ldyBVbmlvbihnZXRQcm9qZWN0KCkpOworICAgICAgICBmb3IgKFBhdGggcGF0aCA6IGRlcGVuZGVudFBhdGhzKSB7CisgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZW50cnkgOiBwYXRoLmxpc3QoKSkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIGVudHJ5RmlsZSA9IG5ldyBGaWxlKGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5RmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIldpbGwgY29tcGFyZSB0aW1lc3RhbXAgb2YgYWxsIGZpbGVzIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiIgKyBlbnRyeUZpbGUgKyAiXCIgd2l0aCB0aW1lc3RhbXAgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgam1vZEZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVNldCBmaWxlU2V0ID0gbmV3IEZpbGVTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQuc2V0RGlyKGVudHJ5RmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxSZXNvdXJjZXMuYWRkKGZpbGVTZXQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJXaWxsIGNvbXBhcmUgdGltZXN0YW1wIG9mIFwiIiArIGVudHJ5RmlsZSArICJcIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCB0aW1lc3RhbXAgb2YgIiArIGptb2RGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsUmVzb3VyY2VzLmFkZChuZXcgRmlsZVJlc291cmNlKGVudHJ5RmlsZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIG91dE9mRGF0ZSA9CisgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXModGhpcywgYWxsUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgIG5ldyBNZXJnaW5nTWFwcGVyKGptb2RGaWxlLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpOworCisgICAgICAgIGlmIChvdXRPZkRhdGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2coIlNraXBwaW5nIGptb2QgY3JlYXRpb24sIHNpbmNlIFwiIiArIGptb2RGaWxlICsgIlwiICIKKyAgICAgICAgICAgICAgICArICJpcyBhbHJlYWR5IG5ld2VyIHRoYW4gYWxsIGZpbGVzIGluIHBhdGhzLiIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gYXJncyA9IGJ1aWxkSm1vZEFyZ3MoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9nKCJEZWxldGluZyAiICsgam1vZEZpbGUgKyAiIGlmIGl0IGV4aXN0cy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIEZpbGVzLmRlbGV0ZUlmRXhpc3RzKGptb2RGaWxlLnRvUGF0aCgpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVtb3ZlIG9sZCBmaWxlIFwiIiArIGptb2RGaWxlICsgIlwiOiAiICsgZSwgZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIFRvb2xQcm92aWRlciBqbW9kID0gVG9vbFByb3ZpZGVyLmZpbmRGaXJzdCgiam1vZCIpLm9yRWxzZVRocm93KAorICAgICAgICAgICAgKCkgLT4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJqbW9kIHRvb2wgbm90IGZvdW5kIGluIEpESy4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpKTsKKworICAgICAgICBsb2coIkV4ZWN1dGluZzogam1vZCAiICsgU3RyaW5nLmpvaW4oIiAiLCBhcmdzKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBpbnQgZXhpdENvZGU7CisgICAgICAgIHRyeSAoUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKHN0ZG91dCk7CisgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKHN0ZGVycikpIHsKKworICAgICAgICAgICAgZXhpdENvZGUgPSBqbW9kLnJ1bihvdXQsIGVyciwgYXJncy50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGl0Q29kZSAhPSAwKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoImptb2QgZmFpbGVkIChleGl0IGNvZGUgIikuYXBwZW5kKGV4aXRDb2RlKS5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIGlmIChzdGRvdXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsIG91dHB1dCBpczogIikuYXBwZW5kKHN0ZG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RkZXJyLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCBlcnJvciBvdXRwdXQgaXM6ICIpLmFwcGVuZChzdGRlcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZS50b1N0cmluZygpLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZygiQ3JlYXRlZCAiICsgam1vZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIFByb2plY3QuTVNHX0lORk8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbGlzdCBvZiBhcmd1bWVudHMgdG8gPGNvZGU+am1vZDwvY29kZT4gdG9vbCwgYmFzZWQgb24gdGhpcworICAgICAqIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IGxpc3Qgb2YgPGNvZGU+am1vZDwvY29kZT4gYXJndW1lbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRKbW9kQXJncygpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBhcmdzLmFkZCgiY3JlYXRlIik7CisKKyAgICAgICAgYXJncy5hZGQoIi0tY2xhc3MtcGF0aCIpOworICAgICAgICBhcmdzLmFkZChjbGFzc3BhdGgudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gUGF0aHMKKworICAgICAgICBpZiAobW9kdWxlUGF0aCAhPSBudWxsICYmICFtb2R1bGVQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tbW9kdWxlLXBhdGgiKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkKG1vZHVsZVBhdGgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbW1hbmRQYXRoICE9IG51bGwgJiYgIWNvbW1hbmRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tY21kcyIpOworICAgICAgICAgICAgYXJncy5hZGQoY29tbWFuZFBhdGgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZ1BhdGggIT0gbnVsbCAmJiAhY29uZmlnUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLWNvbmZpZyIpOworICAgICAgICAgICAgYXJncy5hZGQoY29uZmlnUGF0aC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyUGF0aCAhPSBudWxsICYmICFoZWFkZXJQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0taGVhZGVyLWZpbGVzIik7CisgICAgICAgICAgICBhcmdzLmFkZChoZWFkZXJQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChsZWdhbFBhdGggIT0gbnVsbCAmJiAhbGVnYWxQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tbGVnYWwtbm90aWNlcyIpOworICAgICAgICAgICAgYXJncy5hZGQobGVnYWxQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChuYXRpdmVMaWJQYXRoICE9IG51bGwgJiYgIW5hdGl2ZUxpYlBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1saWJzIik7CisgICAgICAgICAgICBhcmdzLmFkZChuYXRpdmVMaWJQYXRoLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYW5QYXRoICE9IG51bGwgJiYgIW1hblBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1tYW4tcGFnZXMiKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkKG1hblBhdGgudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTdHJpbmdzCisKKyAgICAgICAgU3RyaW5nIHZlcnNpb25TdHIgPQorICAgICAgICAgICAgKG1vZHVsZVZlcnNpb24gIT0gbnVsbCA/IG1vZHVsZVZlcnNpb24udG9Nb2R1bGVWZXJzaW9uU3RyaW5nKCkgOiB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKHZlcnNpb25TdHIgIT0gbnVsbCAmJiAhdmVyc2lvblN0ci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLW1vZHVsZS12ZXJzaW9uIik7CisgICAgICAgICAgICBhcmdzLmFkZCh2ZXJzaW9uU3RyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYWluQ2xhc3MgIT0gbnVsbCAmJiAhbWFpbkNsYXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tbWFpbi1jbGFzcyIpOworICAgICAgICAgICAgYXJncy5hZGQobWFpbkNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGxhdGZvcm0gIT0gbnVsbCAmJiAhcGxhdGZvcm0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS10YXJnZXQtcGxhdGZvcm0iKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkKHBsYXRmb3JtKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFzaE1vZHVsZXNQYXR0ZXJuICE9IG51bGwgJiYgIWhhc2hNb2R1bGVzUGF0dGVybi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLWhhc2gtbW9kdWxlcyIpOworICAgICAgICAgICAgYXJncy5hZGQoaGFzaE1vZHVsZXNQYXR0ZXJuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJvb2xlYW5zCisKKyAgICAgICAgaWYgKCFyZXNvbHZlQnlEZWZhdWx0KSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1kby1ub3QtcmVzb2x2ZS1ieS1kZWZhdWx0Iik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZXNvbHV0aW9uV2FybmluZ1NwZWMgbW9kdWxlV2FybmluZyA6IG1vZHVsZVdhcm5pbmdzKSB7CisgICAgICAgICAgICBtb2R1bGVXYXJuaW5nLnZhbGlkYXRlKCk7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS13YXJuLWlmLXJlc29sdmVkIik7CisgICAgICAgICAgICBhcmdzLmFkZChtb2R1bGVXYXJuaW5nLmdldFJlYXNvbigpLnRvQ29tbWFuZExpbmVPcHRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0aW5hdGlvbiBmaWxlCisKKyAgICAgICAgYXJncy5hZGQoam1vZEZpbGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbW9kdWxlcy9MaW5rLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0xpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjVkNGMyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbW9kdWxlcy9MaW5rLmphdmEKQEAgLTAsMCArMSwyMTIyIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm1vZHVsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TaW1wbGVGaWxlVmlzaXRvcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3BpLlRvb2xQcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTG9nTGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db21wb3NpdGVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5NZXJnaW5nTWFwcGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5SZXNvdXJjZVV0aWxzOworCisvKioKKyAqIEFzc2VtYmxlcyBqbW9kIGZpbGVzIGludG8gYW4gZXhlY3V0YWJsZSBpbWFnZS4gIEVxdWl2YWxlbnQgdG8gdGhlCisgKiBKREsge0Bjb2RlIGpsaW5rfSBjb21tYW5kLgorICogPHA+CisgKiBTdXBwb3J0ZWQgYXR0cmlidXRlczoKKyAqIDxkbD4KKyAqIDxkdD57QGNvZGUgZGVzdERpcn0KKyAqIDxkZD5Sb290IGRpcmVjdG9yeSBvZiBjcmVhdGVkIGltYWdlLiAocmVxdWlyZWQpCisgKiA8ZHQ+e0Bjb2RlIG1vZHVsZVBhdGh9CisgKiA8ZGQ+UGF0aCBvZiBtb2R1bGVzLiAgU2hvdWxkIGJlIGEgbGlzdCBvZiAuam1vZCBmaWxlcy4gIFJlcXVpcmVkLCB1bmxlc3MKKyAqICAgICBuZXN0ZWQgbW9kdWxlIHBhdGggb3IgbW9kdWxlcGF0aHJlZiBpcyBwcmVzZW50LgorICogPGR0PntAY29kZSBtb2R1bGVQYXRoUmVmfQorICogPGRkPlJlZmVyZW5jZSB0byBwYXRoIG9mIG1vZHVsZXMuICBSZWZlcmVuY2VkIHBhdGggc2hvdWxkIGJlCisgKiAgICAgYSBsaXN0IG9mIC5qbW9kIGZpbGVzLgorICogPGR0PntAY29kZSBtb2R1bGVzfQorICogPGRkPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZXMgdG8gYXNzZW1ibGUuICBSZXF1aXJlZCwgdW5sZXNzCisgKiAgICAgb25lIG9yIG1vcmUgbmVzdGVkIHtAY29kZSA8bW9kdWxlPn0gZWxlbWVudHMgYXJlIHByZXNlbnQuCisgKiA8ZHQ+e0Bjb2RlIG9ic2VydmFibGVNb2R1bGVzfQorICogPGRkPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cGxpY2l0IG1vZHVsZXMgdGhhdCBjb21wcmlzZQorICogICAgICJ1bml2ZXJzZSIgdmlzaWJsZSB0byB0b29sIHdoaWxlIGxpbmtpbmcuCisgKiA8ZHQ+e0Bjb2RlIGxhdW5jaGVyc30KKyAqIDxkZD5Db21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb21tYW5kcywgZWFjaCBvZiB0aGUgZm9ybQorICogICAgIDx2YXI+bmFtZTwvdmFyPntAY29kZSA9fTx2YXI+bW9kdWxlPC92YXI+IG9yCisgKiAgICAgPHZhcj5uYW1lPC92YXI+e0Bjb2RlID19PHZhcj5tb2R1bGU8L3Zhcj57QGNvZGUgL308dmFyPm1haW5jbGFzczwvdmFyPgorICogPGR0PntAY29kZSBleGNsdWRlRmlsZXN9CisgKiA8ZGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgc3BlY2lmeWluZyBmaWxlcyB0byBleGNsdWRlIGZyb20KKyAqICAgICBsaW5rZWQgaW1hZ2UuCisgKiAgICAgRWFjaCBpcyBlaXRoZXIgYSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICogICAgIG9yIHtAY29kZSBAfTx2YXI+ZmlsZW5hbWU8L3Zhcj4uCisgKiA8ZHQ+e0Bjb2RlIGV4Y2x1ZGVSZXNvdXJjZXN9CisgKiA8ZGQ+Q29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMgc3BlY2lmeWluZyByZXNvdXJjZXMgdG8gZXhjbHVkZSBmcm9tIGptb2RzLgorICogICAgIEVhY2ggaXMgZWl0aGVyIGEgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbmlvL2ZpbGUvRmlsZVN5c3RlbS5odG1sI2dldFBhdGhNYXRjaGVyJTI4amF2YS5sYW5nLlN0cmluZyUyOSI+c3RhbmRhcmQgUGF0aE1hdGNoZXIgcGF0dGVybjwvYT4KKyAqICAgICBvciB7QGNvZGUgQH08dmFyPmZpbGVuYW1lPC92YXI+LgorICogPGR0PntAY29kZSBsb2NhbGVzfQorICogPGRkPkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4dHJhIGxvY2FsZXMgdG8gaW5jbHVkZSwKKyAqICAgICByZXF1aXJlcyB7QGNvZGUgamRrLmxvY2FsZWRhdGF9IG1vZHVsZQorICogPGR0PntAY29kZSByZXNvdXJjZU9yZGVyfQorICogPGR0PkNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIHNwZWNpZnlpbmcgcmVzb3VyY2Ugc2VhcmNoIG9yZGVyLgorICogICAgIEVhY2ggaXMgZWl0aGVyIGEgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbmlvL2ZpbGUvRmlsZVN5c3RlbS5odG1sI2dldFBhdGhNYXRjaGVyJTI4amF2YS5sYW5nLlN0cmluZyUyOSI+c3RhbmRhcmQgUGF0aE1hdGNoZXIgcGF0dGVybjwvYT4KKyAqICAgICBvciB7QGNvZGUgQH08dmFyPmZpbGVuYW1lPC92YXI+LgorICogPGR0PntAY29kZSBiaW5kU2VydmljZXN9CisgKiA8ZGQ+Ym9vbGVhbiwgd2hldGhlciB0byBsaW5rIHNlcnZpY2UgcHJvdmlkZXJzOyBkZWZhdWx0IGlzIGZhbHNlCisgKiA8ZHQ+e0Bjb2RlIGlnbm9yZVNpZ25pbmd9CisgKiA8ZGQ+Ym9vbGVhbiwgd2hldGhlciB0byBhbGxvdyBzaWduZWQgamFyIGZpbGVzOyBkZWZhdWx0IGlzIGZhbHNlCisgKiA8ZHQ+e0Bjb2RlIGluY2x1ZGVIZWFkZXJzfQorICogPGRkPmJvb2xlYW4sIHdoZXRoZXIgdG8gaW5jbHVkZSBoZWFkZXIgZmlsZXM7IGRlZmF1bHQgaXMgdHJ1ZQorICogPGR0PntAY29kZSBpbmNsdWRlTWFuUGFnZXN9CisgKiA8ZGQ+Ym9vbGVhbiwgd2hldGhlciB0byBpbmNsdWRlIG1hbiBwYWdlczsgZGVmYXVsdCBpcyB0cnVlCisgKiA8ZHQ+e0Bjb2RlIGluY2x1ZGVOYXRpdmVDb21tYW5kc30KKyAqIDxkZD5ib29sZWFuLCB3aGV0aGVyIHRvIGluY2x1ZGUgbmF0aXZlIGV4ZWN1dGFibGVzIG5vcm1hbGx5IGdlbmVyYXRlZAorICogICAgIGZvciBpbWFnZTsgZGVmYXVsdCBpcyB0cnVlCisgKiA8ZHQ+e0Bjb2RlIGRlYnVnfQorICogPGRkPmJvb2xlYW4sIHdoZXRoZXIgdG8gaW5jbHVkZSBkZWJ1ZyBpbmZvcm1hdGlvbjsgZGVmYXVsdCBpcyB0cnVlCisgKiA8ZHQ+e0Bjb2RlIHZlcmJvc2VMZXZlbH0KKyAqIDxkZD5JZiBzZXQsIGpsaW5rIHdpbGwgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCwgd2hpY2ggd2lsbCBiZSBsb2dnZWQgYXQKKyAqICAgICB0aGUgc3BlY2lmaWVkIEFudCBsb2cgbGV2ZWwgKHtAY29kZSBERUJVR30sIHtAY29kZSBWRVJCT1NFfSwKKyAqICAgICB7QGNvZGUgSU5GT319LCB7QGNvZGUgV0FSTn0sIG9yIHtAY29kZSBFUlJ9KS4KKyAqIDxkdD57QGNvZGUgY29tcHJlc3N9CisgKiA8ZGQ+Y29tcHJlc3Npb24gbGV2ZWwsIG9uZSBvZjoKKyAqICAgICA8ZGw+CisgKiAgICAgPGR0PntAY29kZSAwfQorICogICAgIDxkdD57QGNvZGUgbm9uZX0KKyAqICAgICA8ZGQ+bm8gY29tcHJlc3Npb24gKGRlZmF1bHQpCisgKiAgICAgPGR0PntAY29kZSAxfQorICogICAgIDxkdD57QGNvZGUgc3RyaW5nc30KKyAqICAgICA8ZGQ+Y29uc3RhbnQgc3RyaW5nIHNoYXJpbmcKKyAqICAgICA8ZHQ+e0Bjb2RlIDJ9CisgKiAgICAgPGR0PntAY29kZSB6aXB9CisgKiAgICAgPGRkPnppcCBjb21wcmVzc2lvbgorICogICAgIDwvZGw+CisgKiA8ZHQ+e0Bjb2RlIGVuZGlhbm5lc3N9CisgKiA8ZGQ+TXVzdCBiZSB7QGNvZGUgbGl0dGxlfSBvciB7QGNvZGUgYmlnfSwgZGVmYXVsdCBpcyBuYXRpdmUgZW5kaWFubmVzcworICogPGR0PntAY29kZSBjaGVja0R1cGxpY2F0ZUxlZ2FsfQorICogPGRkPkJvb2xlYW4uICBXaGVuIG1lcmdpbmcgbGVnYWwgbm90aWNlcyBmcm9tIGRpZmZlcmVudCBtb2R1bGVzCisgKiAgICAgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZSwgdmVyaWZ5IHRoYXQgdGhlaXIgY29udGVudHMKKyAqICAgICBhcmUgaWRlbnRpY2FsLiAgRGVmYXVsdCBpcyBmYWxzZSwgd2hpY2ggbWVhbnMgYW55IGxpY2Vuc2UgZmlsZXMKKyAqICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXJlIGFzc3VtZWQgdG8gaGF2ZSB0aGUgc2FtZSBjb250ZW50LCBhbmQgbm8KKyAqICAgICBjaGVja2luZyBpcyBkb25lLgorICogPGR0PntAY29kZSB2bVR5cGV9CisgKiA8ZGQ+SG90c3BvdCBWTSBpbiBpbWFnZSwgb25lIG9mOgorICogICAgIDx1bD4KKyAqICAgICA8bGk+e0Bjb2RlIGNsaWVudH0KKyAqICAgICA8bGk+e0Bjb2RlIHNlcnZlcn0KKyAqICAgICA8bGk+e0Bjb2RlIG1pbmltYWx9CisgKiAgICAgPGxpPntAY29kZSBhbGx9IChkZWZhdWx0KQorICogICAgIDwvdWw+CisgKiA8L2RsPgorICoKKyAqIDxwPgorICogU3VwcG9ydGVkIG5lc3RlZCBlbGVtZW50cworICogPGRsPgorICogPGR0PntAY29kZSA8bW9kdWxlcGF0aD59CisgKiA8ZGQ+cGF0aCBlbGVtZW50CisgKiA8ZHQ+e0Bjb2RlIDxtb2R1bGU+fQorICogPGRkPk1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCisgKiAgICAgT25seSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZS4KKyAqIDxkdD57QGNvZGUgPG9ic2VydmFibGVNb2R1bGU+fQorICogPGRkPk1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCisgKiAgICAgT25seSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZS4KKyAqIDxkdD57QGNvZGUgPGxhdW5jaGVyPn0KKyAqIDxkZD5NYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiAgQXR0cmlidXRlczoKKyAqICAgICA8dWw+CisgKiAgICAgPGxpPntAY29kZSBuYW1lfSAocmVxdWlyZWQpCisgKiAgICAgPGxpPntAY29kZSBtb2R1bGV9IChyZXF1aXJlZCkKKyAqICAgICA8bGk+e0Bjb2RlIG1haW5DbGFzc30gKG9wdGlvbmFsKQorICogICAgIDwvdWw+CisgKiA8ZHQ+e0Bjb2RlIDxsb2NhbGU+fQorICogPGRkPk1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCisgKiAgICAgT25seSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZS4KKyAqIDxkdD57QGNvZGUgPHJlc291cmNlT3JkZXI+fQorICogPGRkPkV4cGxpY2l0IHJlc291cmNlIHNlYXJjaCBvcmRlciBpbiBpbWFnZS4gIE1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUKKyAqICAgICB0aW1lcy4gIEV4YWN0bHkgb25lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgbXVzdCBiZSBzcGVjaWZpZWQ6CisgKiAgICAgPGRsPgorICogICAgIDxkdD57QGNvZGUgcGF0dGVybn0KKyAqICAgICA8ZGQ+QSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICogICAgIDxkdD57QGNvZGUgbGlzdEZpbGV9CisgKiAgICAgPGRkPlRleHQgZmlsZSBjb250YWluaW5nIGxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgKG5vdCBwYXR0ZXJucyksCisgKiAgICAgICAgIG9uZSBwZXIgbGluZQorICogICAgIDwvZGw+CisgKiAgICAgSWYgdGhlIHtAY29kZSByZXNvdXJjZU9yZGVyfSBhdHRyaWJ1dGUgaXMgYWxzbyBwcmVzZW50IG9uIHRoZSB0YXNrLCBpdHMKKyAqICAgICBwYXR0ZXJucyBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IG9jY3VyIGJlZm9yZSBwYXR0ZXJucyBpbiBuZXN0ZWQKKyAqICAgICB7QGNvZGUgPHJlc291cmNlT3JkZXI+fSBlbGVtZW50cy4KKyAqIDxkdD57QGNvZGUgPGV4Y2x1ZGVGaWxlcz59CisgKiA8ZGQ+RXhjbHVkZXMgZmlsZXMgZnJvbSBsaW5rZWQgaW1hZ2UgdHJlZS4gIE1heSBiZSBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuCisgKiAgICAgRXhhY3RseSBvbmUgb2YgdGhlc2UgYXR0cmlidXRlcyBpcyByZXF1aXJlZDoKKyAqICAgICA8ZGw+CisgKiAgICAgPGR0PntAY29kZSBwYXR0ZXJufQorICogICAgIDxkZD5BIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL25pby9maWxlL0ZpbGVTeXN0ZW0uaHRtbCNnZXRQYXRoTWF0Y2hlciUyOGphdmEubGFuZy5TdHJpbmclMjkiPnN0YW5kYXJkIFBhdGhNYXRjaGVyIHBhdHRlcm48L2E+CisgKiAgICAgPGR0PntAY29kZSBsaXN0RmlsZX0KKyAqICAgICA8ZGQ+VGV4dCBmaWxlIGNvbnRhaW5pbmcgbGlzdCBvZiBmaWxlIG5hbWVzIChub3QgcGF0dGVybnMpLAorICogICAgICAgICBvbmUgcGVyIGxpbmUKKyAqICAgICA8L2RsPgorICogPGR0PntAY29kZSA8ZXhjbHVkZVJlc291cmNlcz59CisgKiA8ZGQ+RXhjbHVkZXMgcmVzb3VyY2VzIGZyb20gam1vZHMuICBNYXkgYmUgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLgorICogICAgIEV4YWN0bHkgb25lIG9mIHRoZXNlIGF0dHJpYnV0ZXMgaXMgcmVxdWlyZWQ6CisgKiAgICAgPGRsPgorICogICAgIDxkdD57QGNvZGUgcGF0dGVybn0KKyAqICAgICA8ZGQ+QSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5zdGFuZGFyZCBQYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICogICAgIDxkdD57QGNvZGUgbGlzdEZpbGV9CisgKiAgICAgPGRkPlRleHQgZmlsZSBjb250YWluaW5nIGxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMgKG5vdCBwYXR0ZXJucyksCisgKiAgICAgICAgIG9uZSBwZXIgbGluZQorICogICAgIDwvZGw+CisgKiA8ZHQ+e0Bjb2RlIDxjb21wcmVzcz59CisgKiA8ZGQ+TXVzdCBoYXZlIHtAY29kZSBsZXZlbH0gYXR0cmlidXRlLCB3aG9zZSBwZXJtaXR0ZWQgdmFsdWVzIGFyZSB0aGUgc2FtZQorICogICAgIGFzIHRoZSB7QGNvZGUgY29tcHJlc3N9IHRhc2sgYXR0cmlidXRlIGRlc2NyaWJlZCBhYm92ZS4KKyAqICAgICBNYXkgYWxzbyBoYXZlIGEge0Bjb2RlIGZpbGVzfSBhdHRyaWJ1dGUsIHdoaWNoIGlzIGEgY29tbWEtc2VwYXJhdGVkCisgKiAgICAgbGlzdCBvZiBwYXR0ZXJucywgYW5kL29yIG5lc3RlZCB7QGNvZGUgPGZpbGVzPn0gZWxlbWVudHMsIGVhY2ggd2l0aAorICogICAgIGVpdGhlciBhIHtAY29kZSBwYXR0ZXJufSBhdHRyaWJ1dGUgb3Ige0Bjb2RlIGxpc3RGaWxlfSBhdHRyaWJ1dGUuCisgKiA8ZHQ+e0Bjb2RlIDxyZWxlYXNlSW5mbz59CisgKiA8ZGQ+UmVwbGFjZXMsIGF1Z21lbnRzLCBvciB0cmltcyB0aGUgaW1hZ2UncyByZWxlYXNlIGluZm8gcHJvcGVydGllcy4KKyAqICAgICBUaGlzIG1heSBzcGVjaWZ5IGFueSBvZiB0aGUgZm9sbG93aW5nOgorICogICAgIDx1bD4KKyAqICAgICA8bGk+QSB7QGNvZGUgZmlsZX0gYXR0cmlidXRlLCBwb2ludGluZyB0byBhIEphdmEgcHJvcGVydGllcyBmaWxlCisgKiAgICAgICAgIGNvbnRhaW5pbmcgbmV3IHJlbGVhc2UgaW5mbyBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBlbnRpcmVseSByZXBsYWNlCisgKiAgICAgICAgIHRoZSBjdXJyZW50IG9uZXMuCisgKiAgICAgPGxpPkEge0Bjb2RlIGRlbGV0ZX0gYXR0cmlidXRlLCBjb250YWluaW5nIGNvbW1hLXNlcGFyYXRlZCBwcm9wZXJ0eSBrZXlzCisgKiAgICAgICAgIHRvIHJlbW92ZSBmcm9tIGFwcGxpY2F0aW9uJ3MgcmVsZWFzZSBpbmZvLCBhbmQvb3IgYW55IG51bWJlciBvZgorICogICAgICAgICBuZXN0ZWQge0Bjb2RlIDxkZWxldGU+fSBlbGVtZW50cywgZWFjaCB3aXRoIGEgcmVxdWlyZWQge0Bjb2RlIGtleX0KKyAqICAgICAgICAgYXR0cmlidXRlLgorICogICAgIDxsaT5PbmUgb3IgbW9yZSBuZXN0ZWQge0Bjb2RlIDxhZGQ+fSBlbGVtZW50cywgY29udGFpbmluZyBlaXRoZXIKKyAqICAgICAgICAge0Bjb2RlIGtleX0gYW5kIHtAY29kZSB2YWx1ZX0gYXR0cmlidXRlcywgb3IgYSB7QGNvZGUgZmlsZX0KKyAqICAgICAgICAgYXR0cmlidXRlIGFuZCBhbiBvcHRpb25hbCB7QGNvZGUgY2hhcnNldH0gYXR0cmlidXRlLgorICogICAgIDwvdWw+CisgKiA8L2RsPgorICoKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTEvdG9vbHMvamxpbmsuaHRtbCI+PGNvZGU+amxpbms8L2NvZGU+IHRvb2wgcmVmZXJlbmNlPC9hPgorICoKKyAqIEBzaW5jZSAxLjEwLjYKKyAqLworcHVibGljIGNsYXNzIExpbmsKK2V4dGVuZHMgVGFzayB7CisgICAgLyoqCisgICAgICogRXJyb3IgbWVzc2FnZSBmb3IgaW1wcm9wZXJseSBmb3JtYXR0ZWQgbGF1bmNoZXIgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0xBVU5DSEVSX1NUUklORyA9CisgICAgICAgICJMYXVuY2hlciBjb21tYW5kIG11c3QgdGFrZSB0aGUgZm9ybSBuYW1lPW1vZHVsZSAiCisgICAgICAgICsgIm9yIG5hbWU9bW9kdWxlL21haW5jbGFzcyI7CisKKyAgICAvKiogUGF0aCBvZiBkaXJlY3RvcmllcyBjb250YWluaW5nIGxpbmthYmxlIG1vZHVsZXMuICovCisgICAgcHJpdmF0ZSBQYXRoIG1vZHVsZVBhdGg7CisKKyAgICAvKiogTW9kdWxlcyB0byBpbmNsdWRlIGluIGxpbmtlZCBpbWFnZS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TW9kdWxlU3BlYz4gbW9kdWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgLyoqIElmIG5vbi1lbXB0eSwgbGlzdCBvZiBhbGwgbW9kdWxlcyBsaW5rZXIgaXMgcGVybWl0dGVkIHRvIGtub3cgYWJvdXQuICovCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1vZHVsZVNwZWM+IG9ic2VydmFibGVNb2R1bGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRpdGlvbmFsIHJ1bm5hYmxlIHByb2dyYW1zIHdoaWNoIGxpbmtlciB3aWxsIHBsYWNlIGluIGltYWdlJ3MKKyAgICAgKiA8Y29kZT5iaW48L2NvZGU+IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TGF1bmNoZXI+IGxhdW5jaGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgLyoqCisgICAgICogTG9jYWxlcyB0byBleHBsaWNpdGx5IGluY2x1ZGUgZnJvbSB7QGNvZGUgamRrLmxvY2FsZGF0YX0gbW9kdWxlLgorICAgICAqIElmIGVtcHR5LCBhbGwgbG9jYWxlcyBhcmUgaW5jbHVkZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExvY2FsZVNwZWM+IGxvY2FsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qKiBSZXNvdXJjZSBvcmRlcmluZy4gKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGF0dGVybkxpc3RFbnRyeT4gb3JkZXJpbmcgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qKiBGaWxlcyB0byBleGNsdWRlIGZyb20gbGlua2VkIGltYWdlLiAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXR0ZXJuTGlzdEVudHJ5PiBleGNsdWRlZEZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZXMgaW4gbGlua2VkIG1vZHVsZXMgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gbGlua2VkIGltYWdlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXR0ZXJuTGlzdEVudHJ5PiBleGNsdWRlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBpbmNsdWRlIGFsbCBzZXJ2aWNlIHByb3ZpZGVzIGluIGxpbmtlZCBpbWFnZSB3aGljaCBhcmUKKyAgICAgKiBwcmVzZW50IGluIHRoZSBtb2R1bGUgcGF0aCBhbmQgd2hpY2ggYXJlIG5lZWRlZCBieSBtb2R1bGVzIGV4cGxpY2l0bHkKKyAgICAgKiBsaW5rZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGJpbmRTZXJ2aWNlczsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gaWdub3JlIHNpZ25lZCBqYXJzIChhbmQgam1vZHMgYmFzZWQgb24gc2lnbmVkIGphcnMpIHdoZW4KKyAgICAgKiBsaW5raW5nLCBpbnN0ZWFkIG9mIGVtaXR0aW5nIGFuIGVycm9yLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVTaWduaW5nOworCisgICAgLyoqIFdoZXRoZXIgdG8gaW5jbHVkZSBoZWFkZXIgZmlsZXMgZnJvbSBsaW5rZWQgbW9kdWxlcyBpbiBpbWFnZS4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUhlYWRlcnMgPSB0cnVlOworCisgICAgLyoqIFdoZXRoZXIgdG8gaW5jbHVkZSBtYW4gcGFnZXMgZnJvbSBsaW5rZWQgbW9kdWxlcyBpbiBpbWFnZS4gKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZU1hblBhZ2VzID0gdHJ1ZTsKKworICAgIC8qKiBXaGV0aGVyIHRvIGluY2x1ZGUgbmF0aXZlIGNvbW1hbmRzIGZyb20gbGlua2VkIG1vZHVsZXMgaW4gaW1hZ2UuICovCisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVOYXRpdmVDb21tYW5kcyA9IHRydWU7CisKKyAgICAvKiogV2hldGhlciB0byBpbmNsdWRlIGNsYXNzZXMnIGRlYnVnIGluZm9ybWF0aW9uIG9yIHN0cmlwIGl0LiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBkZWJ1ZyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQW50IGxvZ2dpbmcgbGV2ZWwgYXQgd2hpY2ggdmVyYm9zZSBvdXRwdXQgb2YgbGlua2VkIHNob3VsZCBiZQorICAgICAqIGVtaXR0ZWQuICBJZiBudWxsLCB2ZXJib3NlIG91dHB1dCBpcyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIExvZ0xldmVsIHZlcmJvc2VMZXZlbDsKKworICAgIC8qKiBEaXJlY3RvcnkgaW50byB3aGljaCBsaW5rZWQgaW1hZ2Ugd2lsbCBiZSBwbGFjZWQuICovCisgICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcjsKKworICAgIC8qKiBFbmRpYW5uZXNzIG9mIHNvbWUgZmlsZXMgKD8pIGluIGxpbmtlZCBpbWFnZS4gKi8KKyAgICBwcml2YXRlIEVuZGlhbm5lc3MgZW5kaWFubmVzczsKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBjb21wcmVzc2lvbiBsZXZlbCBhcHBsaWVkIHRvIGxpbmtlZCBpbWFnZS4KKyAgICAgKiBUaGlzIG9yIHtAbGluayAjY29tcHJlc3Npb259IG1heSBiZSBzZXQsIGJ1dCBub3QgYm90aC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXByZXNzaW9uTGV2ZWwgY29tcHJlc3Npb25MZXZlbDsKKworICAgIC8qKgorICAgICAqIERlc2NyaWJlcyB3aGljaCBmaWxlcyBpbiBpbWFnZSB0byBjb21wcmVzcywgYW5kIGhvdyB0byBjb21wcmVzcyB0aGVtLgorICAgICAqIFRoaXMgb3Ige0BsaW5rICNjb21wcmVzc2lvbkxldmVsfSBtYXkgYmUgc2V0LCBidXQgbm90IGJvdGguCisgICAgICovCisgICAgcHJpdmF0ZSBDb21wcmVzc2lvbiBjb21wcmVzc2lvbjsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gY2hlY2sgZHVwbGljYXRlIGxlZ2FsIG5vdGljZXMgZnJvbSBkaWZmZXJlbnQgbW9kdWxlcworICAgICAqIGFjdHVhbGx5IGhhdmUgaWRlbnRpY2FsIGNvbnRlbnQsIG5vdCBqdXN0IGluZGVudGljYWwgbmFtZXMsCisgICAgICogYmVmb3JlIG1lcmdpbmcgdGhlbS4KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQWRvcHRPcGVuSkRLL29wZW5qZGstamRrMTEvYmxvYi9tYXN0ZXIvc3JjL2pkay5qbGluay9zaGFyZS9jbGFzc2VzL2pkay90b29scy9qbGluay9pbnRlcm5hbC9KbGlua1Rhc2suamF2YSNMODAiPkZvcmNlZCB0byB0cnVlIGFzIG9mIEphdmEgMTEuPC9hPgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0R1cGxpY2F0ZUxlZ2FsOworCisgICAgLyoqIFR5cGUgb2YgVk0gaW4gbGlua2VkIGltYWdlLiAqLworICAgIHByaXZhdGUgVk1UeXBlIHZtVHlwZTsKKworICAgIC8qKiBDaGFuZ2VzIHRvIGxpbmtlZCBpbWFnZSdzIGRlZmF1bHQgcmVsZWFzZSBpbmZvLiAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZWxlYXNlSW5mbz4gcmVsZWFzZUluZm8gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgY2hpbGQge0Bjb2RlIDxtb2R1bGVQYXRoPn0gZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCBlbXB0eSBjaGlsZCBlbGVtZW50CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRNb2R1bGVQYXRoKFBhdGgpCisgICAgICovCisgICAgcHVibGljIFBhdGggY3JlYXRlTW9kdWxlUGF0aCgpIHsKKyAgICAgICAgaWYgKG1vZHVsZVBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgbW9kdWxlUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZHVsZVBhdGguY3JlYXRlUGF0aCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIHBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZyBsaW5rYWJsZSBtb2R1bGVzLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IG1vZHVsZSBwYXRoLCBwb3NzaWJseSB7QGNvZGUgbnVsbH0KKyAgICAgKgorICAgICAqIEBzZWUgI3NldE1vZHVsZVBhdGgoUGF0aCkKKyAgICAgKiBAc2VlICNjcmVhdGVNb2R1bGVQYXRoKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aCBnZXRNb2R1bGVQYXRoKCkgeworICAgICAgICByZXR1cm4gbW9kdWxlUGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIHBhdGggb2YgZGlyZWN0b3JpZXMgY29udGFpbmluZworICAgICAqIGxpbmthYmxlIG1vZHVsZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBuZXcgbW9kdWxlIHBhdGgKKyAgICAgKgorICAgICAqIEBzZWUgI2dldE1vZHVsZVBhdGgoKQorICAgICAqIEBzZWUgI3NldE1vZHVsZVBhdGhSZWYoUmVmZXJlbmNlKQorICAgICAqIEBzZWUgI2NyZWF0ZU1vZHVsZVBhdGgoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVBhdGgoZmluYWwgUGF0aCBwYXRoKSB7CisgICAgICAgIGlmIChtb2R1bGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMubW9kdWxlUGF0aCA9IHBhdGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtb2R1bGVQYXRoLmFwcGVuZChwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgbW9kdWxlIHBhdGggYXMgYSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmIHBhdGggcmVmZXJlbmNlCisgICAgICoKKyAgICAgKiBAc2VlICNzZXRNb2R1bGVQYXRoKFBhdGgpCisgICAgICogQHNlZSAjY3JlYXRlTW9kdWxlUGF0aCgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TW9kdWxlUGF0aFJlZihmaW5hbCBSZWZlcmVuY2UgcmVmKSB7CisgICAgICAgIGNyZWF0ZU1vZHVsZVBhdGgoKS5zZXRSZWZpZChyZWYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgY2hpbGQge0Bjb2RlIDxtb2R1bGU+fSBlbGVtZW50LCBzcGVjaWZ5aW5nIGEgbW9kdWxlIHRvIGxpbmsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldE1vZHVsZXMoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBNb2R1bGVTcGVjIGNyZWF0ZU1vZHVsZSgpIHsKKyAgICAgICAgTW9kdWxlU3BlYyBtb2R1bGUgPSBuZXcgTW9kdWxlU3BlYygpOworICAgICAgICBtb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICByZXR1cm4gbW9kdWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgbGlzdCBvZiBtb2R1bGVzIHRvIGxpbmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kdWxlTGlzdCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVzKGZpbmFsIFN0cmluZyBtb2R1bGVMaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIG1vZHVsZU5hbWUgOiBtb2R1bGVMaXN0LnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgIG1vZHVsZXMuYWRkKG5ldyBNb2R1bGVTcGVjKG1vZHVsZU5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgY2hpbGQge0Bjb2RlIDxvYnNlcnZhYmxlTW9kdWxlPn0gZWxlbWVudCB0aGF0IHJlcHJlc2VudHMKKyAgICAgKiBvbmUgb2YgdGhlIG1vZHVsZXMgdGhlIGxpbmtlciBpcyBwZXJtaXR0ZWQgdG8ga25vdyBhYm91dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBNb2R1bGVTcGVjIGNyZWF0ZU9ic2VydmFibGVNb2R1bGUoKSB7CisgICAgICAgIE1vZHVsZVNwZWMgbW9kdWxlID0gbmV3IE1vZHVsZVNwZWMoKTsKKyAgICAgICAgb2JzZXJ2YWJsZU1vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBtb2R1bGVzIGxpbmtlciBpcyBwZXJtaXR0ZWQgdG8ga25vdyBhYm91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtb2R1bGVMaXN0IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1vZHVsZSBuYW1lcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE9ic2VydmFibGVNb2R1bGVzKGZpbmFsIFN0cmluZyBtb2R1bGVMaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIG1vZHVsZU5hbWUgOiBtb2R1bGVMaXN0LnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgIG9ic2VydmFibGVNb2R1bGVzLmFkZChuZXcgTW9kdWxlU3BlYyhtb2R1bGVOYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGNoaWxkIHtAY29kZSA8bGF1bmNoZXI+fSBlbGVtZW50IHRoYXQgY2FuIGNvbnRhaW4gaW5mb3JtYXRpb24KKyAgICAgKiBvbiBhZGRpdGlvbmFsIGV4ZWN1dGFibGUgaW4gdGhlIGxpbmtlZCBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0TGF1bmNoZXJzKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTGF1bmNoZXIgY3JlYXRlTGF1bmNoZXIoKSB7CisgICAgICAgIExhdW5jaGVyIGNvbW1hbmQgPSBuZXcgTGF1bmNoZXIoKTsKKyAgICAgICAgbGF1bmNoZXJzLmFkZChjb21tYW5kKTsKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yCisgICAgICogYWRkaXRpb25hbCBleGVjdXRhYmxlcyBpbiB0aGUgbGlua2VkIGltYWdlLiAgRWFjaCBpdGVtIG11c3QgYmUgb2YgdGhlCisgICAgICogZm9ybSAqIDx2YXI+bmFtZTwvdmFyPntAY29kZSA9fTx2YXI+bW9kdWxlPC92YXI+IG9yCisgICAgICogPHZhcj5uYW1lPC92YXI+e0Bjb2RlID19PHZhcj5tb2R1bGU8L3Zhcj57QGNvZGUgL308dmFyPm1haW5jbGFzczwvdmFyPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYXVuY2hlckxpc3QgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbGF1bmNoZXIgZGF0YQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExhdW5jaGVycyhmaW5hbCBTdHJpbmcgbGF1bmNoZXJMaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIGxhdW5jaGVyU3BlYyA6IGxhdW5jaGVyTGlzdC5zcGxpdCgiLCIpKSB7CisgICAgICAgICAgICBsYXVuY2hlcnMuYWRkKG5ldyBMYXVuY2hlcihsYXVuY2hlclNwZWMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgY2hpbGQge0Bjb2RlIDxsb2NhbGU+fSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzIGEgSmF2YSBsb2NhbGUsCisgICAgICogb3Igc2V0IG9mIGxvY2FsZXMsIHRvIGluY2x1ZGUgZnJvbSB0aGUge0Bjb2RlIGpkay5sb2NhbGVkYXRhfSBtb2R1bGUKKyAgICAgKiBpbiB0aGUgbGlua2VkIGltYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcsIHVuY29uZmlndXJlZCBjaGlsZCBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIExvY2FsZVNwZWMgY3JlYXRlTG9jYWxlKCkgeworICAgICAgICBMb2NhbGVTcGVjIGxvY2FsZSA9IG5ldyBMb2NhbGVTcGVjKCk7CisgICAgICAgIGxvY2FsZXMuYWRkKGxvY2FsZSk7CisgICAgICAgIHJldHVybiBsb2NhbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBhIGxpc3Qgb2YgbG9jYWxlIHBhdHRlcm5zLCB0byBzcGVjaWZ5CisgICAgICogSmF2YSBsb2NhbGVzIHRvIGluY2x1ZGUgZnJvbSB7QGNvZGUgamRrLmxvY2FsZWRhdGF9IG1vZHVsZSBpbgorICAgICAqIGxpbmtlZCBpbWFnZS4gIEFzdGVyaXNrcyAoe0Bjb2RlICp9KSBhcmUgcGVybWl0dGVkIGZvciB3aWxkY2FyZAorICAgICAqIG1hdGNoZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWxlTGlzdCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGUgcGF0dGVybnMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGVzKGZpbmFsIFN0cmluZyBsb2NhbGVMaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIGxvY2FsZU5hbWUgOiBsb2NhbGVMaXN0LnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgIGxvY2FsZXMuYWRkKG5ldyBMb2NhbGVTcGVjKGxvY2FsZU5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgY2hpbGQge0Bjb2RlIDxleGNsdWRlRmlsZXM+fSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzCisgICAgICogZmlsZXMgdG8gZXhjbHVkZSBmcm9tIGxpbmtlZCBtb2R1bGVzIHdoZW4gYXNzZW1ibGluZyBsaW5rZWQgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEV4Y2x1ZGVGaWxlcyhTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5MaXN0RW50cnkgY3JlYXRlRXhjbHVkZUZpbGVzKCkgeworICAgICAgICBQYXR0ZXJuTGlzdEVudHJ5IGVudHJ5ID0gbmV3IFBhdHRlcm5MaXN0RW50cnkoKTsKKyAgICAgICAgZXhjbHVkZWRGaWxlcy5hZGQoZW50cnkpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBhIGxpc3Qgb2YgcGF0dGVybnMgZGVub3RpbmcgZmlsZXMKKyAgICAgKiB0byBleGNsdWRlIGZyb20gbGlua2VkIG1vZHVsZXMgd2hlbiBhc3NlbWJsaW5nIGxpbmtlZCBpbWFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuTGlzdCBjb21tYW4tc2VwYXJhdGVkIGxpc3Qgb2YgcGF0dGVybnMKKyAgICAgKgorICAgICAqIEBzZWUgTGluay5QYXR0ZXJuTGlzdEVudHJ5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZUZpbGVzKFN0cmluZyBwYXR0ZXJuTGlzdCkgeworICAgICAgICBmb3IgKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybkxpc3Quc3BsaXQoIiwiKSkgeworICAgICAgICAgICAgZXhjbHVkZWRGaWxlcy5hZGQobmV3IFBhdHRlcm5MaXN0RW50cnkocGF0dGVybikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBjaGlsZCB7QGNvZGUgPGV4Y2x1ZGVSZXNvdXJjZXM+fSBlbGVtZW50IHRoYXQgc3BlY2lmaWVzCisgICAgICogcmVzb3VyY2VzIGluIGxpbmtlZCBtb2R1bGVzIHRoYXQgd2lsbCBiZSBleGNsdWRlZCBmcm9tIGxpbmtlZCBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0RXhjbHVkZVJlc291cmNlcyhTdHJpbmcpCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5MaXN0RW50cnkgY3JlYXRlRXhjbHVkZVJlc291cmNlcygpIHsKKyAgICAgICAgUGF0dGVybkxpc3RFbnRyeSBlbnRyeSA9IG5ldyBQYXR0ZXJuTGlzdEVudHJ5KCk7CisgICAgICAgIGV4Y2x1ZGVkUmVzb3VyY2VzLmFkZChlbnRyeSk7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIGEgbGlzdCBvZiBwYXR0ZXJucyBkZW5vdGluZyByZXNvdXJjZXMKKyAgICAgKiB0byBleGNsdWRlIGZyb20gbGlua2VkIG1vZHVsZXMgaW4gbGlua2VkIGltYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm5MaXN0IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zCisgICAgICoKKyAgICAgKiBAc2VlICNjcmVhdGVFeGNsdWRlUmVzb3VyY2VzKCkKKyAgICAgKiBAc2VlIExpbmsuUGF0dGVybkxpc3RFbnRyeQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVSZXNvdXJjZXMoU3RyaW5nIHBhdHRlcm5MaXN0KSB7CisgICAgICAgIGZvciAoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJuTGlzdC5zcGxpdCgiLCIpKSB7CisgICAgICAgICAgICBleGNsdWRlZFJlc291cmNlcy5hZGQobmV3IFBhdHRlcm5MaXN0RW50cnkocGF0dGVybikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBjaGlsZCB7QGNvZGUgPHJlc291cmNlT3JkZXJ9IGVsZW1lbnQgdGhhdCBzcGVjaWZpZXMKKyAgICAgKiBleHBsaWNpdCBvcmRlcmluZyBvZiByZXNvdXJjZXMgaW4gbGlua2VkIGltYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcsIHVuY29uZmlndXJlZCBjaGlsZCBlbGVtZW50CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRSZXNvdXJjZU9yZGVyKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0dGVybkxpc3RFbnRyeSBjcmVhdGVSZXNvdXJjZU9yZGVyKCkgeworICAgICAgICBQYXR0ZXJuTGlzdEVudHJ5IG9yZGVyID0gbmV3IFBhdHRlcm5MaXN0RW50cnkoKTsKKyAgICAgICAgb3JkZXJpbmcuYWRkKG9yZGVyKTsKKyAgICAgICAgcmV0dXJuIG9yZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGNvbnRhaW5pbmcgYSBsaXN0IG9mIHBhdHRlcm5zIHRoYXQgZXhwbGljaXRseQorICAgICAqIG9yZGVyIHJlc291cmNlcyBpbiB0aGUgbGlua2VkIGltYWdlLiAgQW55IHBhdHRlcm5zIHNwZWNpZmllZCBoZXJlCisgICAgICogd2lsbCBiZSBwbGFjZWQgYmVmb3JlIGFueSBwYXR0ZXJucyBzcGVjaWZpZWQgYXMKKyAgICAgKiB7QGxpbmtwbGFpbiAjY3JlYXRlUmVzb3VyY2VPcmRlcigpIGNoaWxkIGVsZW1lbnRzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXR0ZXJuTGlzdCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwYXR0ZXJucworICAgICAqCisgICAgICogQHNlZSAjY3JlYXRlUmVzb3VyY2VPcmRlcigpCisgICAgICogQHNlZSBMaW5rLlBhdHRlcm5MaXN0RW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU9yZGVyKGZpbmFsIFN0cmluZyBwYXR0ZXJuTGlzdCkgeworICAgICAgICBMaXN0PFBhdHRlcm5MaXN0RW50cnk+IG9yZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZvciAoU3RyaW5nIHBhdHRlcm4gOiBwYXR0ZXJuTGlzdC5zcGxpdCgiLCIpKSB7CisgICAgICAgICAgICBvcmRlckxpc3QuYWRkKG5ldyBQYXR0ZXJuTGlzdEVudHJ5KHBhdHRlcm4pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSBjb21lcyBiZWZvcmUgbmVzdGVkIGVsZW1lbnRzLgorICAgICAgICBvcmRlcmluZy5hZGRBbGwoMCwgb3JkZXJMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIGxpbmtlZCBpbWFnZSBzaG91bGQgcHVsbCBpbiBwcm92aWRlcnMKKyAgICAgKiBpbiB0aGUgbW9kdWxlIHBhdGggb2Ygc2VydmljZXMgdXNlZCBieSBleHBsaWNpdGx5IGxpbmtlZCBtb2R1bGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGxpbmtlZCB3aWxsIHB1bGwgaW4gc2VydmljZSBwcm92aWRlcywgZmFsc2UgaWYgbm90CisgICAgICoKKyAgICAgKiBAc2VlICNzZXRCaW5kU2VydmljZXMoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCaW5kU2VydmljZXMoKSB7CisgICAgICAgIHJldHVybiBiaW5kU2VydmljZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIGxpbmtlZCBpbWFnZSBzaG91bGQgcHVsbCBpbiBwcm92aWRlcnMKKyAgICAgKiBpbiB0aGUgbW9kdWxlIHBhdGggb2Ygc2VydmljZXMgdXNlZCBieSBleHBsaWNpdGx5IGxpbmtlZCBtb2R1bGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmQgd2hldGhlciB0byBpbmNsdWRlIHNlcnZpY2UgcHJvdmlkZXJzCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRCaW5kU2VydmljZXMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJpbmRTZXJ2aWNlcyhmaW5hbCBib29sZWFuIGJpbmQpIHsKKyAgICAgICAgdGhpcy5iaW5kU2VydmljZXMgPSBiaW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbGlua2VyIHNob3VsZCBhbGxvdyBtb2R1bGVzIG1hZGUgZnJvbQorICAgICAqIHNpZ25lZCBqYXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHNpZ25lZCBqYXJzIGFyZSBhbGxvd2VkLCBmYWxzZSBpZiBtb2R1bGVzIGJhc2VkIG9uCisgICAgICogICAgICAgICBzaWduZWQgamFycyBjYXVzZSBhbiBlcnJvcgorICAgICAqCisgICAgICogQHNlZSAjc2V0SWdub3JlU2lnbmluZyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yZVNpZ25pbmcoKSB7CisgICAgICAgIHJldHVybiBpZ25vcmVTaWduaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBsaW5rZXIgc2hvdWxkIGFsbG93IG1vZHVsZXMgbWFkZSBmcm9tCisgICAgICogc2lnbmVkIGphcnMuCisgICAgICogPHA+CisgICAgICogTm90ZTogQXMgb2YgSmF2YSAxMSwgdGhpcyBhdHRyaWJ1dGUgaXMgaW50ZXJuYWxseSBmb3JjZWQgdG8gdHJ1ZS4gIFNlZQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9BZG9wdE9wZW5KREsvb3Blbmpkay1qZGsxMS9ibG9iL21hc3Rlci9zcmMvamRrLmpsaW5rL3NoYXJlL2NsYXNzZXMvamRrL3Rvb2xzL2psaW5rL2ludGVybmFsL0psaW5rVGFzay5qYXZhI0w4MCI+dGhlIHNvdXJjZTwvYT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3JlIHRydWUgdG8gaGF2ZSBsaW5rZXIgYWxsb3cgc2lnbmVkIGphcnMsCisgICAgICogICAgICAgICAgICAgICBmYWxzZSB0byBoYXZlIGxpbmtlciBlbWl0IGFuIGVycm9yIGZvciBzaWduZWQgamFycworICAgICAqCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRJZ25vcmVTaWduaW5nKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVTaWduaW5nKGZpbmFsIGJvb2xlYW4gaWdub3JlKSB7CisgICAgICAgIHRoaXMuaWdub3JlU2lnbmluZyA9IGlnbm9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgaGVhZGVyIGZpbGVzIGZyb20gbGlua2VkIG1vZHVsZXMKKyAgICAgKiBpbiBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkLCBmYWxzZSB0byBleGNsdWRlIHRoZW0KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEluY2x1ZGVIZWFkZXJzKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZUhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBpbmNsdWRlSGVhZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBoZWFkZXIgZmlsZXMgZnJvbQorICAgICAqIGxpbmtlZCBtb2R1bGVzIGluIGltYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGUgdHJ1ZSBpZiBoZWFkZXIgZmlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIHRvIGV4Y2x1ZGUgdGhlbQorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5jbHVkZUhlYWRlcnMoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVIZWFkZXJzKGZpbmFsIGJvb2xlYW4gaW5jbHVkZSkgeworICAgICAgICB0aGlzLmluY2x1ZGVIZWFkZXJzID0gaW5jbHVkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgbWFuIHBhZ2VzIGZyb20gbGlua2VkIG1vZHVsZXMKKyAgICAgKiBpbiBpbWFnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYW4gcGFnZXMgc2hvdWxkIGJlIGluY2x1ZGVkLCBmYWxzZSB0byBleGNsdWRlIHRoZW0KKyAgICAgKgorICAgICAqIEBzZWUgI3NldEluY2x1ZGVNYW5QYWdlcyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVNYW5QYWdlcygpIHsKKyAgICAgICAgcmV0dXJuIGluY2x1ZGVNYW5QYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gaW5jbHVkZSBtYW4gcGFnZXMgZnJvbQorICAgICAqIGxpbmtlZCBtb2R1bGVzIGluIGltYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGluY2x1ZGUgdHJ1ZSBpZiBtYW4gcGFnZXMgc2hvdWxkIGJlIGluY2x1ZGVkLAorICAgICAqICAgICAgICAgICAgICAgIGZhbHNlIHRvIGV4Y2x1ZGUgdGhlbQorICAgICAqCisgICAgICogQHNlZSAjZ2V0SW5jbHVkZU1hblBhZ2VzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlTWFuUGFnZXMoZmluYWwgYm9vbGVhbiBpbmNsdWRlKSB7CisgICAgICAgIHRoaXMuaW5jbHVkZU1hblBhZ2VzID0gaW5jbHVkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGluY2x1ZGUgZ2VuZXJhdGVkIG5hdGl2ZSBjb21tYW5kcywKKyAgICAgKiBhbmQgbmF0aXZlIGNvbW1hbmRzIGZyb20gbGlua2VkIG1vZHVsZXMsIGluIGltYWdlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIG5hdGl2ZSBjb21tYW5kcyBzaG91bGQgYmUgaW5jbHVkZWQsIGZhbHNlIHRvIGV4Y2x1ZGUgdGhlbQorICAgICAqCisgICAgICogQHNlZSAjc2V0SW5jbHVkZU5hdGl2ZUNvbW1hbmRzKGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZU5hdGl2ZUNvbW1hbmRzKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZU5hdGl2ZUNvbW1hbmRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciB0byBpbmNsdWRlIGdlbmVyYXRlZCBuYXRpdmUgY29tbWFuZHMsCisgICAgICogYW5kIG5hdGl2ZSBjb21tYW5kcyBmcm9tIGxpbmtlZCBtb2R1bGVzLCBpbiBpbWFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlIHRydWUgaWYgbmF0aXZlIGNvbW1hbmRzIHNob3VsZCBiZSBpbmNsdWRlZCwKKyAgICAgKiAgICAgICAgICAgICAgICBmYWxzZSB0byBleGNsdWRlIHRoZW0KKyAgICAgKgorICAgICAqIEBzZWUgI2dldEluY2x1ZGVOYXRpdmVDb21tYW5kcygpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZU5hdGl2ZUNvbW1hbmRzKGZpbmFsIGJvb2xlYW4gaW5jbHVkZSkgeworICAgICAgICB0aGlzLmluY2x1ZGVOYXRpdmVDb21tYW5kcyA9IGluY2x1ZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBsaW5rZXIgc2hvdWxkIGtlZXAgb3Igc3RyaXAKKyAgICAgKiBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGRlYnVnIGluZm9ybWF0aW9uIHdpbGwgYmUgcmV0YWluZWQsCisgICAgICogICAgICAgICBmYWxzZSBpZiBpdCB3aWxsIGJlIHN0cmlwcGVkCisgICAgICoKKyAgICAgKiBAc2VlICNzZXREZWJ1Zyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldERlYnVnKCkgeworICAgICAgICByZXR1cm4gZGVidWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIGxpbmtlciBzaG91bGQga2VlcCBvciBzdHJpcAorICAgICAqIGRlYnVnIGluZm9ybWF0aW9uIGluIGNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVidWcgdHJ1ZSBpZiBkZWJ1ZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcmV0YWluZWQsCisgICAgICogICAgICAgICAgICAgIGZhbHNlIGlmIGl0IHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAqCisgICAgICogQHNlZSAjZ2V0RGVidWcoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGZpbmFsIGJvb2xlYW4gZGVidWcpIHsKKyAgICAgICAgdGhpcy5kZWJ1ZyA9IGRlYnVnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBpbmRpY2F0aW5nIHdoZXRoZXIgbGlua2VyIHNob3VsZCBwcm9kdWNlIHZlcmJvc2Ugb3V0cHV0LAorICAgICAqIGFuZCBhdCB3aGF0IGxvZ2dpbmcgbGV2ZWwgdGhhdCBvdXRwdXQgc2hvdWxkIGJlIHNob3duLgorICAgICAqCisgICAgICogQHJldHVybiBsb2dnaW5nIGxldmVsIGF0IHdoaWNoIHRvIHNob3cgbGlua2VyJ3MgdmVyYm9zZSBvdXRwdXQsCisgICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0gdG8gZGlzYWJsZSB2ZXJib3NlIG91dHB1dAorICAgICAqCisgICAgICogQHNlZSAjc2V0VmVyYm9zZUxldmVsKExvZ0xldmVsKQorICAgICAqLworICAgIHB1YmxpYyBMb2dMZXZlbCBnZXRWZXJib3NlTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiB2ZXJib3NlTGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB3aGV0aGVyIGxpbmtlciBzaG91bGQgcHJvZHVjZSB2ZXJib3NlIG91dHB1dCwKKyAgICAgKiBhbmQgYXQgd2hhdCBsb2dnaW5nIGxldmVsIHRoYXQgb3V0cHV0IHNob3VsZCBiZSBzaG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbCBsZXZlbCBsb2dnaW5nIGxldmVsIGF0IHdoaWNoIHRvIHNob3cgbGlua2VyJ3MKKyAgICAgKiAgICAgICAgICAgICAgdmVyYm9zZSBvdXRwdXQsIG9yIHtAY29kZSBudWxsfSB0byBkaXNhYmxlIHZlcmJvc2Ugb3V0cHV0CisgICAgICoKKyAgICAgKiBAc2VlICNnZXRWZXJib3NlTGV2ZWwoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcmJvc2VMZXZlbChmaW5hbCBMb2dMZXZlbCBsZXZlbCkgeworICAgICAgICB0aGlzLnZlcmJvc2VMZXZlbCA9IGxldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVpcmVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGRpcmVjdG9yeSB3aGVyZSBsaW5rZWQgaW1hZ2Ugd2lsbCBiZQorICAgICAqIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRpcmVjdG9yeSB3aGVyZSBsaW5rZWQgaW1hZ2Ugd2lsbCByZXNpZGUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldERlc3REaXIoRmlsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSBnZXREZXN0RGlyKCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGluZGljYXRpbmcgZGlyZWN0b3J5IHdoZXJlIGxpbmtlZCBpbWFnZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIGRpcmVjdG9yeSBpbiB3aGljaCBpbWFnZSB3aWxsIGJlIGNyZWF0ZWQgYnkgbGlua2VyCisgICAgICoKKyAgICAgKiBAc2VlICNnZXREZXN0RGlyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0RGlyKGZpbmFsIEZpbGUgZGlyKSB7CisgICAgICAgIHRoaXMub3V0cHV0RGlyID0gZGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSBpbmRpY2F0aW5nIGxldmVsIG9mIGNvbXByZXNzaW9uIGxpbmtlciB3aWxsIGFwcGx5IHRvIGltYWdlLgorICAgICAqIFRoaXMgaXMgZXhjbHVzaXZlIHdpdGggcmVnYXJkIHRvIHtAbGluayAjY3JlYXRlQ29tcHJlc3MoKX06ICBvbmx5IG9uZQorICAgICAqIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tcHJlc3Npb24gbGV2ZWwgdG8gYXBwbHksIG9yIHtAY29kZSBudWxsfSBmb3Igbm9uZQorICAgICAqCisgICAgICogQHNlZSAjc2V0Q29tcHJlc3MoTGluay5Db21wcmVzc2lvbkxldmVsKQorICAgICAqIEBzZWUgI2NyZWF0ZUNvbXByZXNzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcHJlc3Npb25MZXZlbCBnZXRDb21wcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uTGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhdHRyaWJ1dGUgaW5kaWNhdGluZyBsZXZlbCBvZiBjb21wcmVzc2lvbiBsaW5rZXIgd2lsbCBhcHBseQorICAgICAqIHRvIGltYWdlLiBUaGlzIGlzIGV4Y2x1c2l2ZSB3aXRoIHJlZ2FyZCB0byB7QGxpbmsgI2NyZWF0ZUNvbXByZXNzKCl9OgorICAgICAqIG9ubHkgb25lIG9mIHRoZSB0d28gbWF5IGJlIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZXZlbCBjb21wcmVzc2lvbiBsZXZlbCB0byBhcHBseSwgb3Ige0Bjb2RlIG51bGx9IGZvciBub25lCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDb21wcmVzcygpCisgICAgICogQHNlZSAjY3JlYXRlQ29tcHJlc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGZpbmFsIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwpIHsKKyAgICAgICAgdGhpcy5jb21wcmVzc2lvbkxldmVsID0gbGV2ZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBjaGlsZCB7QGNvZGUgPGNvbXByZXNzPn0gZWxlbWVudCB0aGF0IHNwZWNpZmllcyB0aGUgbGV2ZWwgb2YKKyAgICAgKiBjb21wcmVzc2lvbiB0aGUgbGlua2VyIHdpbGwgYXBwbHksIGFuZCBvcHRpb25hbGx5LCB3aGljaCBmaWxlcyBpbiB0aGUKKyAgICAgKiBpbWFnZSB3aWxsIGJlIGNvbXByZXNzZWQuICBUaGlzIGlzIGV4Y2x1c2l2ZSB3aXRoIHJlZ2FyZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI3NldENvbXByZXNzIGNvbXByZXNzfSBhdHRyaWJ1dGU6ICBvbmx5IG9uZSBvZiB0aGUgdHdvIG1heSBiZQorICAgICAqIHNwZWNpZmllZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAqCisgICAgICogQHNlZSAjc2V0Q29tcHJlc3MoTGluay5Db21wcmVzc2lvbkxldmVsKQorICAgICAqLworICAgIHB1YmxpYyBDb21wcmVzc2lvbiBjcmVhdGVDb21wcmVzcygpIHsKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgbmVzdGVkIGNvbXByZXNzaW9uIGVsZW1lbnQgaXMgcGVybWl0dGVkLiIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY29tcHJlc3Npb24gPSBuZXcgQ29tcHJlc3Npb24oKTsKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzaW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dHJpYnV0ZSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBjZXJ0YWluIGZpbGVzIGluIHRoZSBsaW5rZWQgaW1hZ2UKKyAgICAgKiB3aWxsIGJlIGJpZy1lbmRpYW4gb3IgbGl0dGxlLWVuZGlhbi4gIElmIHtAY29kZSBudWxsfSwgdGhlIHVuZGVybHlpbmcKKyAgICAgKiBwbGF0Zm9ybSdzIGVuZGlhbm5lc3MgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW5kaWFubmVzcyB0byBhcHBseSwgb3Ige0Bjb2RlIG51bGx9IHRvIHBsYXRmb3JtIGRlZmF1bHQKKyAgICAgKgorICAgICAqIEBzZWUgI3NldEVuZGlhbm5lc3MoTGluay5FbmRpYW5uZXNzKQorICAgICAqLworICAgIHB1YmxpYyBFbmRpYW5uZXNzIGdldEVuZGlhbm5lc3MoKSB7CisgICAgICAgIHJldHVybiBlbmRpYW5uZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIGNlcnRhaW4gZmlsZXMgaW4gdGhlIGxpbmtlZCBpbWFnZQorICAgICAqIHdpbGwgYmUgYmlnLWVuZGlhbiBvciBsaXR0bGUtZW5kaWFuLiAgSWYge0Bjb2RlIG51bGx9LCB0aGUgdW5kZXJseWluZworICAgICAqIHBsYXRmb3JtJ3MgZW5kaWFubmVzcyBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGVuZGlhbm5lc3MgZW5kaWFubmVzcyB0byBhcHBseSwgb3Ige0Bjb2RlIG51bGx9IHRvIHVzZQorICAgICAqICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtIGRlZmF1bHQKKyAgICAgKgorICAgICAqIEBzZWUgI2dldEVuZGlhbm5lc3MoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuZGlhbm5lc3MoZmluYWwgRW5kaWFubmVzcyBlbmRpYW5uZXNzKSB7CisgICAgICAgIHRoaXMuZW5kaWFubmVzcyA9IGVuZGlhbm5lc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBsaW5rZXIgc2hvdWxkIGNoZWNrIGxlZ2FsIG5vdGljZXMgd2l0aAorICAgICAqIGR1cGxpY2F0ZSBuYW1lcywgYW5kIHJlZnVzZSB0byBtZXJnZSB0aGVtICh1c3VhbGx5IHVzaW5nIHN5bWJvbGljIGxpbmtzKQorICAgICAqIGlmIHRoZWlyIHJlc3BlY3RpdmUgY29udGVudCBpcyBub3QgaWRlbnRpY2FsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGxlZ2FsIG5vdGljZSBmaWxlcyB3aXRoIHNhbWUgbmFtZSBzaG91bGQgYmUgY2hlY2tlZAorICAgICAqICAgICAgICAgZm9yIGlkZW50aWNhbCBjb250ZW50LCBmYWxzZSB0byBzdXBwcmVzcyBjaGVjaworICAgICAqCisgICAgICogQHNlZSAjc2V0Q2hlY2tEdXBsaWNhdGVMZWdhbChib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGdldENoZWNrRHVwbGljYXRlTGVnYWwoKSB7CisgICAgICAgIHJldHVybiBjaGVja0R1cGxpY2F0ZUxlZ2FsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYXR0cmlidXRlIGluZGljYXRpbmcgd2hldGhlciBsaW5rZXIgc2hvdWxkIGNoZWNrIGxlZ2FsIG5vdGljZXMgd2l0aAorICAgICAqIGR1cGxpY2F0ZSBuYW1lcywgYW5kIHJlZnVzZSB0byBtZXJnZSB0aGVtICh1c3VhbGx5IHVzaW5nIHN5bWJvbGljIGxpbmtzKQorICAgICAqIGlmIHRoZWlyIHJlc3BlY3RpdmUgY29udGVudCBpcyBub3QgaWRlbnRpY2FsLgorICAgICAqCisgICAgICogQHBhcmFtIGNoZWNrIHRydWUgaWYgbGVnYWwgbm90aWNlIGZpbGVzIHdpdGggc2FtZSBuYW1lIHNob3VsZCBiZSBjaGVja2VkCisgICAgICogICAgICAgICBmb3IgaWRlbnRpY2FsIGNvbnRlbnQsIGZhbHNlIHRvIHN1cHByZXNzIGNoZWNrCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRDaGVja0R1cGxpY2F0ZUxlZ2FsKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaGVja0R1cGxpY2F0ZUxlZ2FsKGZpbmFsIGJvb2xlYW4gY2hlY2spIHsKKyAgICAgICAgdGhpcy5jaGVja0R1cGxpY2F0ZUxlZ2FsID0gY2hlY2s7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0cmlidXRlIGluZGljYXRpbmcgd2hhdCB0eXBlIG9mIEpWTSB0aGUgbGlua2VkIGltYWdlIHNob3VsZCBoYXZlLgorICAgICAqIElmIHtAY29kZSBudWxsfSwgYWxsIEpWTSB0eXBlcyBhcmUgaW5jbHVkZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHR5cGUgb2YgSlZNIGxpbmtlZCBpbWFnZSB3aWxsIGhhdmUKKyAgICAgKgorICAgICAqIEBzZWUgI3NldFZtVHlwZShMaW5rLlZNVHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgVk1UeXBlIGdldFZtVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHZtVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYXR0cmlidXRlIGluZGljYXRpbmcgd2hhdCB0eXBlIG9mIEpWTSB0aGUgbGlua2VkIGltYWdlIHNob3VsZCBoYXZlLgorICAgICAqIElmIHtAY29kZSBudWxsfSwgYWxsIEpWTSB0eXBlcyBhcmUgaW5jbHVkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIG9mIEpWTSBsaW5rZWQgaW1hZ2Ugd2lsbCBoYXZlCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRWbVR5cGUoKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZtVHlwZShmaW5hbCBWTVR5cGUgdHlwZSkgeworICAgICAgICB0aGlzLnZtVHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBjaGlsZCB7QGNvZGUgPHJlbGVhc2VJbmZvPn0gZWxlbWVudCB0aGF0IG1vZGlmaWVzIHRoZSBkZWZhdWx0CisgICAgICogcmVsZWFzZSBwcm9wZXJ0aWVzIG9mIHRoZSBsaW5rZWQgaW1hZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVsZWFzZUluZm8gY3JlYXRlUmVsZWFzZUluZm8oKSB7CisgICAgICAgIFJlbGVhc2VJbmZvIGluZm8gPSBuZXcgUmVsZWFzZUluZm8oKTsKKyAgICAgICAgcmVsZWFzZUluZm8uYWRkKGluZm8pOworICAgICAgICByZXR1cm4gaW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBlbGVtZW50IHRoYXQgZXhwbGljaXRseSBuYW1lcyBhIEphdmEgbW9kdWxlLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBNb2R1bGVTcGVjIHsKKyAgICAgICAgLyoqIE1vZHVsZSdzIG5hbWUuICBSZXF1aXJlZC4gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogQ3JlYXRlcyBhbiB1bmNvbmZpZ3VyZWQgZWxlbWVudC4gKi8KKyAgICAgICAgcHVibGljIE1vZHVsZVNwZWMoKSB7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZW1wdHkuCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG1vZHVsZSBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBtb2R1bGUncyBuYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTW9kdWxlU3BlYyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyBuYW1lIG9mIG1vZHVsZSB0aGlzIGVsZW1lbnQgcmVwcmVzZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuYW1lIG9mIG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhdHRyaWJ1dGUgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgbW9kdWxlIHRoaXMgZWxlbWVudAorICAgICAgICAgKiByZXByZXNlbnRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBtb2R1bGUncyBuYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZlcmlmaWVzIHRoaXMgZWxlbWVudCdzIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG5hbWUgaXMgbm90IHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGlzIHJlcXVpcmVkIGZvciBtb2R1bGUuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBlbGVtZW50IHRoYXQgY29udGFpbnMgYSBwYXR0ZXJuIG1hdGNoaW5nIEphdmEgbG9jYWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2xhc3MgTG9jYWxlU3BlYyB7CisgICAgICAgIC8qKiBQYXR0ZXJuIG9mIGxvY2FsZSBuYW1lcyB0byBtYXRjaC4gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICAvKiogQ3JlYXRlcyBhbiB1bmNvbmZpZ3VyZWQgZWxlbWVudC4gKi8KKyAgICAgICAgcHVibGljIExvY2FsZVNwZWMoKSB7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZW1wdHkuCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiBlbGVtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgcGF0dGVybi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgcGF0dGVybiBvZiBsb2NhbGUgbmFtZXMgdG8gbWF0Y2gKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb2NhbGVTcGVjKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBzZXROYW1lKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF0dHJpYnV0ZSBjb250YWluaW5nIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzIEphdmEgbG9jYWxlIG5hbWVzLgorICAgICAgICAgKiBNYXkgYmUgYW4gZXhwbGljaXQgSmF2YSBsb2NhbGUsIG9yIG1heSBjb250YWluIGFuIGFzdGVyaXNrCisgICAgICAgICAqICh7QGNvZGUgKil9IGZvciB3aWxkY2FyZCBtYXRjaGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIGVsZW1lbnQncyBsb2NhbGUgbmFtZSBwYXR0ZXJuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGF0dHJpYnV0ZSBjb250YWluaW5nIGEgcGF0dGVybiB3aGljaCBtYXRjaGVzIEphdmEgbG9jYWxlIG5hbWVzLgorICAgICAgICAgKiBNYXkgYmUgYW4gZXhwbGljaXQgSmF2YSBsb2NhbGUsIG9yIG1heSBjb250YWluIGFuIGFzdGVyaXNrCisgICAgICAgICAqICh7QGNvZGUgKil9IGZvciB3aWxkY2FyZCBtYXRjaGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgbmV3IGxvY2FsZSBuYW1lIG9yIHBhdHRlcm4gbWF0Y2hpbmcgbG9jYWxlIG5hbWVzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZlcmlmaWVzIHRoaXMgZWxlbWVudCdzIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG5hbWUgaXMgbm90IHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGlzIHJlcXVpcmVkIGZvciBsb2NhbGUuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBlbGVtZW50IHR5cGUgd2hpY2ggc3BlY2lmaWVzIGEgamxpbmsgZmlsZXMgcGF0dGVybi4gIEVhY2gKKyAgICAgKiBpbnN0YW5jZSBtYXkgc3BlY2lmeSBhIHN0cmluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL25pby9maWxlL0ZpbGVTeXN0ZW0uaHRtbCNnZXRQYXRoTWF0Y2hlciUyOGphdmEubGFuZy5TdHJpbmclMjkiPlBhdGhNYXRjaGVyIHBhdHRlcm48L2E+CisgICAgICogb3IgYSB0ZXh0IGZpbGUgY29udGFpbmluZyBhIGxpc3Qgb2Ygc3VjaCBwYXR0ZXJucywgb25lIHBlciBsaW5lLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBQYXR0ZXJuTGlzdEVudHJ5IHsKKyAgICAgICAgLyoqIFBhdGhNYXRjaGVyIHBhdHRlcm4gb2YgZmlsZXMgdG8gbWF0Y2guICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47CisKKyAgICAgICAgLyoqIFBsYWluIHRleHQgbGlzdCBmaWxlIHdpdGggb25lIFBhdGhNYXRjaGVyIHBhdHRlcm4gcGVyIGxpbmUuICovCisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgICAgIC8qKiBDcmVhdGVzIGFuIHVuY29uZmlndXJlZCBlbGVtZW50LiAqLworICAgICAgICBwdWJsaWMgUGF0dGVybkxpc3RFbnRyeSgpIHsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBlbXB0eS4KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgZnJvbSBlaXRoZXIgYSBwYXR0ZXJuIG9yIGxpc3RpbmcgZmlsZS4KKyAgICAgICAgICogSWYgdGhlIGFyZ3VtZW50IHN0YXJ0cyB3aXRoICJ7QGNvZGUgQH0iLCB0aGUgcmVtYWluZGVyIG9mIGl0CisgICAgICAgICAqIGlzIGFzc3VtZWQgdG8gYmUgYSBsaXN0aW5nIGZpbGU7ICBvdGhlcndpc2UsIGl0IGlzIHRyZWF0ZWQgYXMKKyAgICAgICAgICogYSBQYXRoTWF0Y2hlciBwYXR0ZXJuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0dGVybiBhIFBhdGhNYXRjaGVyIHBhdHRlcm4gb3Ige0Bjb2RlIEB9LWZpbGVuYW1lCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGF0dGVybkxpc3RFbnRyeShmaW5hbCBTdHJpbmcgcGF0dGVybikgeworICAgICAgICAgICAgaWYgKHBhdHRlcm4uc3RhcnRzV2l0aCgiQCIpKSB7CisgICAgICAgICAgICAgICAgc2V0TGlzdEZpbGUobmV3IEZpbGUocGF0dGVybi5zdWJzdHJpbmcoMSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0UGF0dGVybihwYXR0ZXJuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIFBhdGhNYXRjaGVyIHBhdHRlcm4gYXR0cmlidXRlLCBpZiBzZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50J3MgZmlsZXMgcGF0dGVybgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm47CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGlzIGVsZW1lbnQncworICAgICAgICAgKiA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMS9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9uaW8vZmlsZS9GaWxlU3lzdGVtLmh0bWwjZ2V0UGF0aE1hdGNoZXIlMjhqYXZhLmxhbmcuU3RyaW5nJTI5Ij5QYXRoTWF0Y2hlciBwYXR0ZXJuPC9hPgorICAgICAgICAgKiBhdHRyaWJ1dGUgZm9yIG1hdGNoaW5nIGZpbGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0dGVybiBuZXcgZmlsZXMgcGF0dGVybgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihmaW5hbCBTdHJpbmcgcGF0dGVybikgeworICAgICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIGxpc3QgZmlsZSBhdHRyaWJ1dGUsIGlmIHNldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIGVsZW1lbnQncyBsaXN0IGZpbGUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjc2V0TGlzdEZpbGUoRmlsZSkKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlIGdldExpc3RGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGlzIGVsZW1lbnQncyBsaXN0IGZpbGUgYXR0cmlidXRlLiAgVGhlIGZpbGUgbXVzdCBiZSBhCisgICAgICAgICAqIHBsYWluIHRleHQgZmlsZSB3aXRoIG9uZSBQYXRoTWF0Y2hlciBwYXR0ZXJuIHBlciBsaW5lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsZSBsaXN0IGZpbGUgY29udGFpbmluZyBwYXR0ZXJucworICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRMaXN0RmlsZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMaXN0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmVyaWZpZXMgdGhpcyBlbGVtZW50J3Mgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYm90aCBwYXR0ZXJuIGFuZCBmaWxlIGFyZSBzZXQKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBuZWl0aGVyIHBhdHRlcm4gbm9yIGZpbGUgaXMgc2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmICgocGF0dGVybiA9PSBudWxsICYmIGZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB8fCAocGF0dGVybiAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkpIHsKKworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkVhY2ggZW50cnkgaW4gYSBwYXR0ZXJuIGxpc3QgbXVzdCBzcGVjaWZ5ICIKKyAgICAgICAgICAgICAgICAgICAgKyAiZXhhY3RseSBvbmUgb2YgcGF0dGVybiBvciBmaWxlLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHRoaXMgZWxlbWVudCB0byBhIGpsaW5rIGNvbW1hbmQgbGluZSBhdHRyaWJ1dGUsCisgICAgICAgICAqIGVpdGhlciB0aGlzIGVsZW1lbnQncyBiYXJlIHBhdHRlcm4sIG9yIGl0cyBsaXN0IGZpbGUKKyAgICAgICAgICogcHJlY2VkZWQgYnkgIntAY29kZSBAfSIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50J3MgaW5mb3JtYXRpb24gY29udmVydGVkIHRvIGEgY29tbWFuZCBsaW5lIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvT3B0aW9uVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0dGVybiAhPSBudWxsID8gcGF0dGVybiA6ICgiQCIgKyBmaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoaWxkIGVsZW1lbnQgcmVwcmVzZW50aW5nIGEgY3VzdG9tIGxhdW5jaGVyIGNvbW1hbmQgaW4gYSBsaW5rZWQgaW1hZ2UuCisgICAgICogQSBsYXVuY2hlciBoYXMgYSBuYW1lLCB3aGljaCBpcyB0eXBpY2FsbHkgdXNlZCBhcyBhIGZpbGUgbmFtZSBmb3IgYW4KKyAgICAgKiBleGVjdXRhYmxlIGZpbGUsIGEgSmF2YSBtb2R1bGUgbmFtZSwgYW5kIG9wdGlvbmFsbHkgYSBjbGFzcyB3aXRoaW4KKyAgICAgKiB0aGF0IG1vZHVsZSB3aGljaCBjYW4gYWN0IGFzIGEgc3RhbmRhcmQgSmF2YSBtYWluIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBMYXVuY2hlciB7CisgICAgICAgIC8qKiBUaGlzIGxhdW5jaGVyJ3MgbmFtZSwgdXN1YWxseSB1c2VkIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGZpbGUuICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgLyoqIFRoZSBuYW1lIG9mIHRoZSBKYXZhIG1vZHVsZSB0aGlzIGxhdW5jaGVyIGxhdW5jaGVzLiAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBtb2R1bGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjbGFzcyB3aXRoaW4gdGhpcyBlbGVtZW50J3Mge0BsaW5rICNtb2R1bGV9IHRvIHJ1bi4KKyAgICAgICAgICogT3B0aW9uYWwgaWYgdGhlIEphdmEgbW9kdWxlIHNwZWNpZmllcyBpdHMgb3duIG1haW4gY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFN0cmluZyBtYWluQ2xhc3M7CisKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBuZXcsIHVuY29uZmlndXJlZCBlbGVtZW50LiAqLworICAgICAgICBwdWJsaWMgTGF1bmNoZXIoKSB7CisgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZW1wdHkuCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBlbGVtZW50IGZyb20gYSB7QGNvZGUgamxpbmt9LWNvbXBhdGlibGUgc3RyaW5nCisgICAgICAgICAqIHNwZWNpZmllciwgd2hpY2ggbXVzdCB0YWtlIHRoZSBmb3JtCisgICAgICAgICAqIDx2YXI+bmFtZTwvdmFyPntAY29kZSA9fTx2YXI+bW9kdWxlPC92YXI+IG9yCisgICAgICAgICAqIDx2YXI+bmFtZTwvdmFyPntAY29kZSA9fTx2YXI+bW9kdWxlPC92YXI+e0Bjb2RlIC99PHZhcj5tYWluY2xhc3M8L3Zhcj4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZXh0U3BlYyBuYW1lLCBtb2R1bGUsIGFuZCBvcHRpb25hbCBtYWluIGNsYXNzLCBhcyBkZXNjcmliZWQKKyAgICAgICAgICogICAgICAgICAgICAgICAgIGFib3ZlCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJndW1lbnQgaXMge0Bjb2RlIG51bGx9CisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYXJndW1lbnQgZG9lcyBub3QgY29uZm9ybSB0byBhYm92ZQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExhdW5jaGVyKGZpbmFsIFN0cmluZyB0ZXh0U3BlYykgeworICAgICAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh0ZXh0U3BlYywgIlRleHQgY2Fubm90IGJlIG51bGwiKTsKKworICAgICAgICAgICAgaW50IGVxdWFscyA9IHRleHRTcGVjLmxhc3RJbmRleE9mKCc9Jyk7CisgICAgICAgICAgICBpZiAoZXF1YWxzIDwgMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTlZBTElEX0xBVU5DSEVSX1NUUklORyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldE5hbWUodGV4dFNwZWMuc3Vic3RyaW5nKDAsIGVxdWFscykpOworCisgICAgICAgICAgICBpbnQgc2xhc2ggPSB0ZXh0U3BlYy5pbmRleE9mKCcvJywgZXF1YWxzKTsKKyAgICAgICAgICAgIGlmIChzbGFzaCA8IDApIHsKKyAgICAgICAgICAgICAgICBzZXRNb2R1bGUodGV4dFNwZWMuc3Vic3RyaW5nKGVxdWFscyArIDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2xhc2ggPiBlcXVhbHMgKyAxICYmIHNsYXNoIDwgdGV4dFNwZWMubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgICAgICAgICAgc2V0TW9kdWxlKHRleHRTcGVjLnN1YnN0cmluZyhlcXVhbHMgKyAxLCBzbGFzaCkpOworICAgICAgICAgICAgICAgIHNldE1haW5DbGFzcyh0ZXh0U3BlYy5zdWJzdHJpbmcoc2xhc2ggKyAxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTlZBTElEX0xBVU5DSEVSX1NUUklORyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGlzIGVsZW1lbnQncyBuYW1lIGF0dHJpYnV0ZSwgdHlwaWNhbGx5IHVzZWQgYXMgdGhlIGJhc2lzCisgICAgICAgICAqIG9mIGFuIGV4ZWN1dGFibGUgZmlsZSBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgZWxlbWVudCdzIG5hbWUKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoaXMgZWxlbWVudCdzIG5hbWUgYXR0cmlidXRlLCB3aGljaCBpcyB0eXBpY2FsbHkgdXNlZCBieSB0aGUKKyAgICAgICAgICogbGlua2VyIHRvIGNyZWF0ZSBhbiBleGVjdXRhYmxlIGZpbGUgd2l0aCBhIHNpbWlsYXIgbmFtZS4gIFRodXMsCisgICAgICAgICAqIHRoZSBuYW1lIHNob3VsZCBjb250YWluIG9ubHkgY2hhcmFjdGVycyBzYWZlIGZvciBmaWxlIG5hbWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIGxhdW5jaGVyCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBvZiB0aGlzIGVsZW1lbnQgd2hpY2ggY29udGFpbnMgdGhlCisgICAgICAgICAqIG5hbWUgb2YgdGhlIEphdmEgbW9kdWxlIHRvIGV4ZWN1dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50J3MgbW9kdWxlIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgb2YgdGhpcyBlbGVtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBuYW1lIG9mCisgICAgICAgICAqIGEgSmF2YSBtb2R1bGUgdG8gZXhlY3V0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZHVsZSBuYW1lIG9mIG1vZHVsZSB0byBleGVjdXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGUoZmluYWwgU3RyaW5nIG1vZHVsZSkgeworICAgICAgICAgICAgdGhpcy5tb2R1bGUgPSBtb2R1bGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgYXR0cmlidXRlIG9mIHRoaXMgZWxlbWVudCB3aGljaCBjb250YWlucyB0aGUgbWFpbiBjbGFzcworICAgICAgICAgKiB0byBleGVjdXRlIGluIHRoaXMgZWxlbWVudCdzIHtAbGlua3BsYWluICNnZXRNb2R1bGUoKSBtb2R1bGV9LCBpZgorICAgICAgICAgKiB0aGF0IG1vZHVsZSBkb2Vzbid0IGRlZmluZSBpdHMgbWFpbiBjbGFzcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuYW1lIG9mIG1haW4gY2xhc3MgdG8gZXhlY3V0ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFpbkNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZSB3aGljaCBjb250YWlucyB0aGUgbWFpbiBjbGFzcyB0byBleGVjdXRlIGluCisgICAgICAgICAqIHRoaXMgZWxlbWVudCdzIHtAbGlua3BsYWluICNnZXRNb2R1bGUoKSBtb2R1bGV9LCBpZiB0aGF0IG1vZHVsZQorICAgICAgICAgKiBkb2Vzbid0IGRlZmluZSBpdHMgbWFpbiBjbGFzcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsYXNzTmFtZSBuYW1lIG9mIGNsYXNzIHRvIGV4ZWN1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1haW5DbGFzcyhmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICB0aGlzLm1haW5DbGFzcyA9IGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJpZmllcyB0aGlzIGVsZW1lbnQncyBzdGF0ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBuYW1lIG9yIG1vZHVsZSBpcyBub3Qgc2V0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwgfHwgbmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkxhdW5jaGVyIG11c3QgaGF2ZSBhIG5hbWUiLAorICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gbnVsbCB8fCBtb2R1bGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJMYXVuY2hlciBtdXN0IGhhdmUgc3BlY2lmeSBhIG1vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhpcyBlbGVtZW50J3MgaW5mb3JtYXRpb24gaW4gamxpbmsgbGF1bmNoZXIgZm9ybWF0OgorICAgICAgICAgKiA8dmFyPm5hbWU8L3Zhcj57QGNvZGUgPX08dmFyPm1vZHVsZTwvdmFyPiBvcgorICAgICAgICAgKiA8dmFyPm5hbWU8L3Zhcj57QGNvZGUgPX08dmFyPm1vZHVsZTwvdmFyPntAY29kZSAvfTx2YXI+bWFpbmNsYXNzPC92YXI+LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5hbWUsIG1vZHVsZSBhbmQgb3B0aW9uYWwgbWFpbiBjbGFzcyBpbiBqbGluayBmb3JtYXQKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgaWYgKG1haW5DbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAiPSIgKyBtb2R1bGUgKyAiLyIgKyBtYWluQ2xhc3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lICsgIj0iICsgbW9kdWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9zc2libGUgdmFsdWVzIGZvciBsaW5rZWQgaW1hZ2UgZW5kaWFubmVzczoKKyAgICAgKiB7QGNvZGUgbGl0dGxlfSBhbmQge0Bjb2RlIGJpZ30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmRpYW5uZXNzCisgICAgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAibGl0dGxlIiwgImJpZyIKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIEpWTSB0eXBlIGluIGxpbmtlZCBpbWFnZToKKyAgICAgKiB7QGNvZGUgY2xpZW50fSwge0Bjb2RlIHNlcnZlcn0sIHtAY29kZSBtaW5pbWFsfSwgb3Ige0Bjb2RlIGFsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWTVR5cGUKKyAgICBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICJjbGllbnQiLCAic2VydmVyIiwgIm1pbmltYWwiLCAiYWxsIgorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvc3NpYmxlIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGNvbXByZXNzaW9uIGxldmVsIG9mIGEgbGlua2VkIGltYWdlOgorICAgICAqIDxkbD4KKyAgICAgKiA8ZHQ+e0Bjb2RlIDB9CisgICAgICogPGR0PntAY29kZSBub25lfQorICAgICAqIDxkZD5ubyBjb21wcmVzc2lvbiAoZGVmYXVsdCkKKyAgICAgKiA8ZHQ+e0Bjb2RlIDF9CisgICAgICogPGR0PntAY29kZSBzdHJpbmdzfQorICAgICAqIDxkZD5jb25zdGFudCBzdHJpbmcgc2hhcmluZworICAgICAqIDxkdD57QGNvZGUgMn0KKyAgICAgKiA8ZHQ+e0Bjb2RlIHppcH0KKyAgICAgKiA8ZGQ+emlwIGNvbXByZXNzaW9uCisgICAgICogPC9kbD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbXByZXNzaW9uTGV2ZWwKKyAgICBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IEtFWVdPUkRTOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIG1hcC5wdXQoIjAiLCAiMCIpOworICAgICAgICAgICAgbWFwLnB1dCgiMSIsICIxIik7CisgICAgICAgICAgICBtYXAucHV0KCIyIiwgIjIiKTsKKyAgICAgICAgICAgIG1hcC5wdXQoIm5vbmUiLCAiMCIpOworICAgICAgICAgICAgbWFwLnB1dCgic3RyaW5ncyIsICIxIik7CisgICAgICAgICAgICBtYXAucHV0KCJ6aXAiLCAiMiIpOworCisgICAgICAgICAgICBLRVlXT1JEUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtYXApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gS0VZV09SRFMua2V5U2V0KCkudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0cyB0aGlzIHZhbHVlIHRvIGEgc3RyaW5nIHN1aXRhYmxlIGZvciB1c2UgaW4gYQorICAgICAgICAgKiBqbGluayBjb21tYW5kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGpsaW5rIGtleXdvcmQgY29ycmVzcG9uZGluZyB0byB0aGlzIHZhbHVlCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgdG9Db21tYW5kTGluZU9wdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBLRVlXT1JEUy5nZXQoZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGlsZCBlbGVtZW50IGZ1bGx5IGRlc2NyaWJpbmcgY29tcHJlc3Npb24gb2YgYSBsaW5rZWQgaW1hZ2UuCisgICAgICogVGhpcyBpbmNsdWRlcyB0aGUgbGV2ZWwsIGFuZCBvcHRpb25hbGx5LCB0aGUgbmFtZXMgb2YgZmlsZXMgdG8gY29tcHJlc3MuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIENvbXByZXNzaW9uIHsKKyAgICAgICAgLyoqIENvbXByZXNzaW9uIGxldmVsLiAgUmVxdWlyZWQgYXR0cmlidXRlLiAqLworICAgICAgICBwcml2YXRlIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdHRlcm5zIHNwZWNpZnlpbmcgZmlsZXMgdG8gY29tcHJlc3MuICBJZiBlbXB0eSwgYWxsIGZpbGVzIGFyZQorICAgICAgICAgKiBjb21wcmVzc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhdHRlcm5MaXN0RW50cnk+IHBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVpcmVkIGF0dHJpYnV0ZSBjb250YWluaW5nIGxldmVsIG9mIGNvbXByZXNzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNvbXByZXNzaW9uIGxldmVsCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29tcHJlc3Npb25MZXZlbCBnZXRMZXZlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBsZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGF0dHJpYnV0ZSBpbmRpY2F0aW5nIGxldmVsIG9mIGNvbXByZXNzaW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGV2ZWwgdHlwZSBvZiBjb21wcmVzc2lvbiB0byBhcHBseSB0byBsaW5rZWQgaW1hZ2UKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldExldmVsKGZpbmFsIENvbXByZXNzaW9uTGV2ZWwgbGV2ZWwpIHsKKyAgICAgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmVzdGVkIGVsZW1lbnQgd2hpY2ggY2FuIHNwZWNpZnkgYSBwYXR0ZXJuIG9mIGZpbGVzCisgICAgICAgICAqIHRvIGNvbXByZXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5ldywgdW5jb25maWd1cmVkIGNoaWxkIGVsZW1lbnQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQYXR0ZXJuTGlzdEVudHJ5IGNyZWF0ZUZpbGVzKCkgeworICAgICAgICAgICAgUGF0dGVybkxpc3RFbnRyeSBwYXR0ZXJuID0gbmV3IFBhdHRlcm5MaXN0RW50cnkoKTsKKyAgICAgICAgICAgIHBhdHRlcm5zLmFkZChwYXR0ZXJuKTsKKyAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYW4gYXR0cmlidXRlIHRoYXQgcmVwcmVzZW50cyBhIGxpc3Qgb2YgZmlsZSBwYXR0ZXJucyB0bworICAgICAgICAgKiBjb21wcmVzcyBpbiB0aGUgbGlua2VkIGltYWdlLCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgICAqIFBhdGhNYXRjaGVyIHBhdHRlcm5zIG9yIHBhdHRlcm4gbGlzdCBmaWxlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdHRlcm5MaXN0IGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBhdHRlcm5zIGFuZC9vciBmaWxlIG5hbWVzCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgTGluay5QYXR0ZXJuTGlzdEVudHJ5CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlcyhmaW5hbCBTdHJpbmcgcGF0dGVybkxpc3QpIHsKKyAgICAgICAgICAgIHBhdHRlcm5zLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXR0ZXJuIDogcGF0dGVybkxpc3Quc3BsaXQoIiwiKSkgeworICAgICAgICAgICAgICAgIHBhdHRlcm5zLmFkZChuZXcgUGF0dGVybkxpc3RFbnRyeShwYXR0ZXJuKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmVyaWZpZXMgdGhpcyBlbGVtZW50J3Mgc3RhdGUuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgY29tcHJlc3Npb24gbGV2ZWwgaXMgbm90IHNldAorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBuZXN0ZWQgcGF0dGVybnMgYXJlIGludmFsaWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKGxldmVsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvbXByZXNzaW9uIGxldmVsIG11c3QgYmUgc3BlY2lmaWVkLiIsCisgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdHRlcm5zLmZvckVhY2goUGF0dGVybkxpc3RFbnRyeTo6dmFsaWRhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIHRoaXMgZWxlbWVudCB0byBhIHNpbmdsZSBqbGluayBvcHRpb24gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY29tbWFuZCBsaW5lIG9wdGlvbiByZXByZXNlbnRpbmcgdGhpcyBlbGVtZW50J3Mgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9Db21tYW5kTGluZU9wdGlvbigpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3B0aW9uID0KKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcihsZXZlbC50b0NvbW1hbmRMaW5lT3B0aW9uKCkpOworCisgICAgICAgICAgICBpZiAoIXBhdHRlcm5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzZXBhcmF0b3IgPSAiOmZpbHRlcj0iOworICAgICAgICAgICAgICAgIGZvciAoUGF0dGVybkxpc3RFbnRyeSBlbnRyeSA6IHBhdHRlcm5zKSB7CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbi5hcHBlbmQoc2VwYXJhdG9yKS5hcHBlbmQoZW50cnkudG9PcHRpb25WYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhbmRjaGlsZCBlbGVtZW50IHJlcHJlc2VudGluZyBkZWxldGFibGUga2V5IGluIGEgbGlua2VkIGltYWdlJ3MKKyAgICAgKiByZWxlYXNlIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlbGVhc2VJbmZvS2V5IHsKKyAgICAgICAgLyoqIFJlcXVpcmVkIGF0dHJpYnV0ZSBob2xkaW5nIHByb3BlcnR5IGtleSB0byBkZWxldGUuICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGtleTsKKworICAgICAgICAvKiogQ3JlYXRlcyBhIG5ldywgdW5jb25maWd1cmVkIGVsZW1lbnQuICovCisgICAgICAgIHB1YmxpYyBSZWxlYXNlSW5mb0tleSgpIHsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBlbXB0eS4KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBwcm9wZXJ0eSBrZXkgdG8gZGVsZXRlIGZyb20gcmVsZWFzZSBpbmZvCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVsZWFzZUluZm9LZXkoZmluYWwgU3RyaW5nIGtleSkgeworICAgICAgICAgICAgc2V0S2V5KGtleSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXR0cmlidXRlIGhvbGRpbmcgdGhlIHJlbGVhc2UgaW5mbyBwcm9wZXJ0eSBrZXkgdG8gZGVsZXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHByb3BlcnR5IGtleSB0byBiZSBkZWxldGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBwcm9wZXJ0eSBrZXkgdG8gZGVsZXRlIGZyb20KKyAgICAgICAgICogbGlua2VkIGltYWdlJ3MgcmVsZWFzZSBpbmZvLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IHByb3BlcnQga2V5IHRvIGJlIGRlbGV0ZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEtleShmaW5hbCBTdHJpbmcga2V5KSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJpZmllcyB0aGlzIGVsZW1lbnQncyBzdGF0ZSBpcyB2YWxpZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBrZXkgaXMgbm90IHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlIGluZm8ga2V5IG11c3QgZGVmaW5lIGEgJ2tleScgYXR0cmlidXRlLiIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR3JhbmRjaGlsZCBlbGVtZW50IGRlc2NyaWJpbmcgYWRkaXRpb25hbCByZWxlYXNlIGluZm8gcHJvcGVydGllcyBmb3IgYQorICAgICAqIGxpbmtlZCBpbWFnZS4gIFRvIGJlIHZhbGlkLCBhbiBpbnN0YW5jZSBtdXN0IGhhdmUgZWl0aGVyIGEgbm9uLW51bGwKKyAgICAgKiBrZXkgYW5kIHZhbHVlLCBvciBhIG5vbi1udWxsIGZpbGUuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlbGVhc2VJbmZvRW50cnkgeworICAgICAgICAvKiogTmV3IHJlbGVhc2UgcHJvcGVydHkncyBrZXkuICovCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGtleTsKKworICAgICAgICAvKiogTmV3IHJlbGVhc2UgcHJvcGVydHkncyB2YWx1ZS4gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgLyoqIEZpbGUgY29udGFpbmluZyBhZGRpdGlvbmFsIHJlbGVhc2UgcHJvcGVydGllcy4gKi8KKyAgICAgICAgcHJpdmF0ZSBGaWxlIGZpbGU7CisKKyAgICAgICAgLyoqIENoYXJzZXQgb2Yge0BsaW5rICNmaWxlfS4gKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hhcnNldCA9IFN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMS5uYW1lKCk7CisKKyAgICAgICAgLyoqIENyZWF0ZXMgYSBuZXcsIHVuY29uZmlndXJlZCBlbGVtZW50LiAqLworICAgICAgICBwdWJsaWMgUmVsZWFzZUluZm9FbnRyeSgpIHsKKyAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBlbXB0eS4KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgd2hpY2ggc3BlY2lmaWVzIGEgc2luZ2xlIGFkZGl0aW9uYWwgcHJvcGVydHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgbmV3IHByb3BlcnR5J3Mga2V5CisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBuZXcgcHJvcGVydHkncyB2YWx1ZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlbGVhc2VJbmZvRW50cnkoZmluYWwgU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBzZXRLZXkoa2V5KTsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyB0aGUga2V5IG9mIHRoaXMgZWxlbWVudCdzIGFkZGl0aW9uYWwgcHJvcGVydHkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYWRkaXRpb25hbCBwcm9wZXJ0eSdzIGtleQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNnZXRWYWx1ZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUga2V5IG9mIHRoaXMgZWxlbWVudCdzCisgICAgICAgICAqIGFkZGl0aW9uYWwgcHJvcGVydHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBrZXkgYWRkaXRpb25hbCBwcm9wZXJ0eSdzIGtleQorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRLZXkoZmluYWwgU3RyaW5nIGtleSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoaXMgZWxlbWVudCdzIGFkZGl0aW9uYWwgcHJvcGVydHkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gYWRkaXRpb25hbCBwcm9wZXJ0eSdzIHZhbHVlCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI2dldEtleSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYXR0cmlidXRlcyBjb250YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQncworICAgICAgICAgKiBhZGRpdGlvbmFsIHByb3BlcnR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgYWRkaXRpb25hbCBwcm9wZXJ0eSdzIHZhbHVlCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgI3NldEtleShTdHJpbmcpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdHRyaWJ1dGUgY29udGFpbmluZyBhIEphdmEgcHJvcGVydGllcyBmaWxlIHdoaWNoIGNvbnRhaW5zCisgICAgICAgICAqIGFkZGl0aW9uYWwgcmVsZWFzZSBpbmZvIHByb3BlcnRpZXMuICBUaGlzIGlzIGV4Y2x1c2l2ZSB3aXRoCisgICAgICAgICAqIHJlc3BlY3QgdG8gdGhlIHtAbGlua3BsYWluICNnZXRLZXkoKSBrZXl9IGFuZAorICAgICAgICAgKiB7QGxpbmtwbGFpbiAjZ2V0VmFsdWUoKSB2YWx1ZX0gb2YgdGhpcyBpbnN0YW5jZTogIGVpdGhlciB0aGUKKyAgICAgICAgICogZmlsZSBtdXN0IGJlIHNldCwgb3IgdGhlIGtleSBhbmQgdmFsdWUgbXVzdCBiZSBzZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBlbGVtZW50J3MgcHJvcGVydGllcyBmaWxlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyBhIEphdmEgcHJvcGVydGllcyBmaWxlIHdoaWNoIGNvbnRhaW5zCisgICAgICAgICAqIGFkZGl0aW9uYWwgcmVsZWFzZSBpbmZvIHByb3BlcnRpZXMuICBUaGlzIGlzIGV4Y2x1c2l2ZSB3aXRoCisgICAgICAgICAqIHJlc3BlY3QgdG8gdGhlIHtAbGlua3BsYWluICNzZXRLZXkoU3RyaW5nKSBrZXl9IGFuZAorICAgICAgICAgKiB7QGxpbmtwbGFpbiAjc2V0VmFsdWUoU3RyaW5nKSB2YWx1ZX0gb2YgdGhpcyBpbnN0YW5jZTogIGVpdGhlciB0aGUKKyAgICAgICAgICogZmlsZSBtdXN0IGJlIHNldCwgb3IgdGhlIGtleSBhbmQgdmFsdWUgbXVzdCBiZSBzZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWxlIHRoaXMgZWxlbWVudCdzIHByb3BlcnRpZXMgZmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhpcyBvYmplY3QncworICAgICAgICAgKiB7QGxpbmtwbGFpbiAjZ2V0RmlsZSgpIGZpbGV9LiAgVGhpcyBpcyB7QGNvZGUgSVNPXzg4NTlfMX0KKyAgICAgICAgICogYnkgZGVmYXVsdCwgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBqYXZhLnV0aWwuUHJvcGVydGllcyBkZWZhdWx0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNoYXJhY3RlciBzZXQgb2YgdGhpcyBlbGVtZW50J3MgZmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGFyc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGNoYXJzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhdHRyaWJ1dGUgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGlzIG9iamVjdCdzCisgICAgICAgICAqIHtAbGlua3BsYWluICNzZXRGaWxlKEZpbGUpIGZpbGV9LiAgSWYgbm90IHNldCwgdGhpcyBpcworICAgICAgICAgKiB7QGNvZGUgSVNPXzg4NTlfMX0gYnkgZGVmYXVsdCwgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQorICAgICAgICAgKiBqYXZhLnV0aWwuUHJvcGVydGllcyBkZWZhdWx0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2hhcnNldCBjaGFyYWN0ZXIgc2V0IG9mIHRoaXMgZWxlbWVudCdzIGZpbGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENoYXJzZXQoZmluYWwgU3RyaW5nIGNoYXJzZXQpIHsKKyAgICAgICAgICAgIHRoaXMuY2hhcnNldCA9IGNoYXJzZXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVmVyaWZpZXMgdGhlIHN0YXRlIG9mIHRoaXMgZWxlbWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBmaWxlIGlzIHNldCwgYW5kIGtleSBhbmQvb3IgdmFsdWUgYXJlIHNldAorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZpbGUgaXMgbm90IHNldCwgYW5kIGtleSBhbmQgdmFsdWUgYXJlIG5vdCBib3RoIHNldAorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGNoYXJzZXQgaXMgbm90IGEgdmFsaWQgSmF2YSBDaGFyc2V0IG5hbWUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJSZWxlYXNlIGluZm8gbXVzdCBkZWZpbmUgJ2tleScgYW5kICd2YWx1ZScgYXR0cmlidXRlcywgIgorICAgICAgICAgICAgICAgICAgICArICJvciBhICdmaWxlJyBhdHRyaWJ1dGUuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIChrZXkgIT0gbnVsbCB8fCB2YWx1ZSAhPSBudWxsKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlJlbGVhc2UgaW5mbyBjYW5ub3QgZGVmaW5lIGJvdGggYSBmaWxlIGF0dHJpYnV0ZSBhbmQgIgorICAgICAgICAgICAgICAgICAgICArICJrZXkvdmFsdWUgYXR0cmlidXRlcy4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBjYW4ndCBoYXBwZW4gZnJvbSBhIGJ1aWxkIGZpbGUsIGJ1dCBjYW4gdGhlb3JldGljYWxseQorICAgICAgICAgICAgLy8gaGFwcGVuIGlmIGNhbGxlZCBmcm9tIEphdmEgY29kZS4KKyAgICAgICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNoYXJzZXQgY2Fubm90IGJlIG51bGwuIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXQpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udmVydHMgdGhpcyBlbGVtZW50IHRvIGEgSmF2YSBwcm9wZXJ0aWVzIG9iamVjdCBjb250YWluaW5nCisgICAgICAgICAqIHRoZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMuICBJZiB0aGlzCisgICAgICAgICAqIGVsZW1lbnQncyBmaWxlIGlzIHNldCwgaXQgaXMgcmVhZDsgIG90aGVyd2lzZSwgYSBQcm9wZXJ0aWVzCisgICAgICAgICAqIG9iamVjdCBjb250YWluaW5nIGp1c3Qgb25lIHByb3BlcnR5LCBjb25zaXN0aW5nIG9mIHRoaXMgZWxlbWVudCdzCisgICAgICAgICAqIGtleSBhbmQgdmFsdWUsIGlzIHJldHVybmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyBQcm9wZXJ0aWVzIG9iamVjdCBvYnRhaW5lZCBmcm9tIHRoaXMgZWxlbWVudCdzIGZpbGUgb3IKKyAgICAgICAgICogICAgICAgICBpdHMga2V5IGFuZCB2YWx1ZQorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZpbGUgaXMgc2V0LCBidXQgY2Fubm90IGJlIHJlYWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzIHRvUHJvcGVydGllcygpIHsKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSAoUmVhZGVyIHJlYWRlciA9IEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBmaWxlLnRvUGF0aCgpLCBDaGFyc2V0LmZvck5hbWUoY2hhcnNldCkpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvcHMubG9hZChyZWFkZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHJlbGVhc2UgaW5mbyBmaWxlIFwiIiArIGZpbGUgKyAiXCI6ICIgKyBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb3BzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hpbGQgZWxlbWVudCBkZXNjcmliaW5nIGNoYW5nZXMgdG8gdGhlIGRlZmF1bHQgcmVsZWFzZSBwcm9wZXJ0aWVzCisgICAgICogb2YgYSBsaW5rZWQgaW1hZ2UuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFJlbGVhc2VJbmZvIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbGUgdGhhdCBjb250YWlucyByZXBsYWNlbWVudCByZWxlYXNlIHByb3BlcnRpZXMgZm9yIGxpbmtlZCBpbWFnZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9wZXJ0aWVzIHRvIGFkZCB0byBkZWZhdWx0IHJlbGVhc2UgcHJvcGVydGllcyBvZiBsaW5rZWQgaW1hZ2UuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVsZWFzZUluZm9FbnRyeT4gcHJvcGVydGllc1RvQWRkID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb3BlcnR5IGtleXMgdG8gcmVtb3ZlIGZyb20gcmVsZWFzZSBwcm9wZXJ0aWVzIG9mIGxpbmtlZCBpbWFnZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZWxlYXNlSW5mb0tleT4gcHJvcGVydGllc1RvRGVsZXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEF0dHJpYnV0ZSBzcGVjaWZ5aW5nIEphdmEgcHJvcGVydGllcyBmaWxlIHdoaWNoIHdpbGwgcmVwbGFjZSB0aGUKKyAgICAgICAgICogZGVmYXVsdCByZWxlYXNlIGluZm8gcHJvcGVydGllcyBmb3IgdGhlIGxpbmtlZCBpbWFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiByZWxlYXNlIHByb3BlcnRpZXMgZmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYXR0cmlidXRlIHNwZWNpZnlpbmcgSmF2YSBwcm9wZXJ0aWVzIGZpbGUgd2hpY2ggd2lsbCByZXBsYWNlCisgICAgICAgICAqIHRoZSBkZWZhdWx0IHJlbGVhc2UgaW5mbyBwcm9wZXJ0aWVzIGZvciB0aGUgbGlua2VkIGltYWdlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsZSByZXBsYWNlbWVudCByZWxlYXNlIHByb3BlcnRpZXMgZmlsZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGNoaWxkIGVsZW1lbnQgd2hpY2ggY2FuIHJlcHJlc2VudCBwcm9wZXJ0aWVzCisgICAgICAgICAqIHRvIGFkZCB0byB0aGUgZGVmYXVsdCByZWxlYXNlIHByb3BlcnRpZXMgb2YgYSBsaW5rZWQgaW1hZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlbGVhc2VJbmZvRW50cnkgY3JlYXRlQWRkKCkgeworICAgICAgICAgICAgUmVsZWFzZUluZm9FbnRyeSBwcm9wZXJ0eSA9IG5ldyBSZWxlYXNlSW5mb0VudHJ5KCk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzVG9BZGQuYWRkKHByb3BlcnR5KTsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY2hpbGQgZWxlbWVudCB3aGljaCBjYW4gcmVwcmVzZW50CisgICAgICAgICAqIGEgcHJvcGVydHkga2V5IHRvIGRlbGV0ZSBmcm9tIHRoZSByZWxlYXNlIHByb3BlcnRpZXMgb2YKKyAgICAgICAgICogYSBsaW5rZWQgaW1hZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3LCB1bmNvbmZpZ3VyZWQgY2hpbGQgZWxlbWVudAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlbGVhc2VJbmZvS2V5IGNyZWF0ZURlbGV0ZSgpIHsKKyAgICAgICAgICAgIFJlbGVhc2VJbmZvS2V5IGtleSA9IG5ldyBSZWxlYXNlSW5mb0tleSgpOworICAgICAgICAgICAgcHJvcGVydGllc1RvRGVsZXRlLmFkZChrZXkpOworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIGF0dHJpYnV0ZSB3aGljaCBjb250YWlucyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mCisgICAgICAgICAqIHByb3BlcnR5IGtleXMgdG8gZGVsZXRlIGZyb20gdGhlIHJlbGVhc2UgcHJvcGVydGllcyBvZgorICAgICAgICAgKiBhIGxpbmtlZCBpbWFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleUxpc3QgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkga2V5cworICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNjcmVhdGVEZWxldGUoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVsZXRlKGZpbmFsIFN0cmluZyBrZXlMaXN0KSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBrZXlMaXN0LnNwbGl0KCIsIikpIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVG9EZWxldGUuYWRkKG5ldyBSZWxlYXNlSW5mb0tleShrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBWZXJpZmllcyB0aGUgc3RhdGUgb2YgdGhpcyBlbGVtZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSBjaGlsZCBlbGVtZW50IGlzIGludmFsaWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBMaW5rLlJlbGVhc2VJbmZvRW50cnkjdmFsaWRhdGUoKQorICAgICAgICAgKiBAc2VlIExpbmsuUmVsZWFzZUluZm9LZXkjdmFsaWRhdGUoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzVG9BZGQuZm9yRWFjaChSZWxlYXNlSW5mb0VudHJ5Ojp2YWxpZGF0ZSk7CisgICAgICAgICAgICBwcm9wZXJ0aWVzVG9EZWxldGUuZm9yRWFjaChSZWxlYXNlSW5mb0tleTo6dmFsaWRhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnZlcnRzIGFsbCBvZiB0aGlzIGVsZW1lbnQncyBzdGF0ZSB0byBhIHNlcmllcyBvZgorICAgICAgICAgKiA8Y29kZT5qbGluazwvY29kZT4gb3B0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuZXcgY29sbGVjdGlvbiBvZiBqbGluayBvcHRpb25zIGJhc2VkIG9uIHRoaXMgZWxlbWVudCdzCisgICAgICAgICAqICAgICAgICAgYXR0cmlidXRlcyBhbmQgY2hpbGQgZWxlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gdG9Db21tYW5kTGluZU9wdGlvbnMoKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucy5hZGQoIi0tcmVsZWFzZS1pbmZvPSIgKyBmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcHJvcGVydGllc1RvQWRkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3B0aW9uID0gbmV3IFN0cmluZ0J1aWxkZXIoIi0tcmVsZWFzZS1pbmZvPWFkZCIpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWxlYXNlSW5mb0VudHJ5IGVudHJ5IDogcHJvcGVydGllc1RvQWRkKSB7CisgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBlbnRyeS50b1Byb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcHJvcHMuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uYXBwZW5kKCI6IikuYXBwZW5kKGtleSkuYXBwZW5kKCI9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uYXBwZW5kKHByb3BzLmdldFByb3BlcnR5KGtleSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3B0aW9ucy5hZGQob3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFwcm9wZXJ0aWVzVG9EZWxldGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBvcHRpb24gPQorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiLS1yZWxlYXNlLWluZm89ZGVsOmtleXM9Iik7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgc2VwYXJhdG9yID0gIiI7CisgICAgICAgICAgICAgICAgZm9yIChSZWxlYXNlSW5mb0tleSBrZXkgOiBwcm9wZXJ0aWVzVG9EZWxldGUpIHsKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAvLyBqbGluayBkb2NzIGFyZW4ndCBjbGVhciBvbiB3aGV0aGVyIHByb3BlcnR5IGtleXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gZGVsZXRlIHNob3VsZCBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzIG9yIGNvbG9ucy4KKyAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9wdGlvbnMuYWRkKG9wdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHRoZSBqbGluayB0b29sIHRvIGNyZWF0ZSBhIG5ldyBsaW5rZWQgaW1hZ2UsIHVubGVzcyB0aGUKKyAgICAgKiBvdXRwdXQgZGlyZWN0b3J5IGV4aXN0cyBhbmQgYWxsIG9mIGl0cyBmaWxlcyBhcmUgZmlsZXMgYXJlIG5ld2VyCisgICAgICogdGhhbiBhbGwgZmlsZXMgaW4gdGhlIG1vZHVsZSBwYXRoLgorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBkZXN0RGlyIGlzIG5vdCBzZXQKKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG1vZHVsZSBwYXRoIGlzIHVuc2V0IG9yIGVtcHR5CisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBtb2R1bGUgbGlzdCBpcyBlbXB0eQorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgY29tcHJlc3Npb25MZXZlbCBhdHRyaWJ1dGUgYW5kIGNvbXByZXNzaW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBlbGVtZW50IGFyZSBib3RoIHNwZWNpZmllZAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQorICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvdXRwdXREaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXMgcmVxdWlyZWQuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2R1bGVQYXRoID09IG51bGwgfHwgbW9kdWxlUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTW9kdWxlIHBhdGggaXMgcmVxdWlyZWQuIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobW9kdWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIG1vZHVsZSBtdXN0IGJlIHNwZWNpZmllZC4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERpci5leGlzdHMoKSkgeworICAgICAgICAgICAgQ29tcG9zaXRlTWFwcGVyIGltYWdlTWFwcGVyID0gbmV3IENvbXBvc2l0ZU1hcHBlcigpOworICAgICAgICAgICAgdHJ5IChTdHJlYW08amF2YS5uaW8uZmlsZS5QYXRoPiBpbWFnZVRyZWUgPQorICAgICAgICAgICAgICAgIEZpbGVzLndhbGsob3V0cHV0RGlyLnRvUGF0aCgpKSkgeworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBJcyB0aGlzIHN1ZmZpY2llbnQ/ICBXaGF0IGlmIHBhcnQgb2YgdGhlIGltYWdlIHRyZWUgd2FzCisgICAgICAgICAgICAgICAgICogZGVsZXRlZCBvciBhbHRlcmVkPyAgU2hvdWxkIHdlIGNoZWNrIGZvciBzdGFuZGFyZAorICAgICAgICAgICAgICAgICAqIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgbGlrZSAnYmluJywgJ2xpYicsICdjb25mJywgJ2xlZ2FsJywKKyAgICAgICAgICAgICAgICAgKiBhbmQgJ3JlbGVhc2UnPyAgKFNvbWUsIGxpa2UgJ2luY2x1ZGUnLCBtYXkgbm90IGJlIHByZXNlbnQsCisgICAgICAgICAgICAgICAgICogaWYgdGhlIGltYWdlIHdhcyBwcmV2aW91c2x5IGJ1aWx0IHdpdGggb3B0aW9ucyB0aGF0CisgICAgICAgICAgICAgICAgICogb21pdHRlZCB0aGVtLikKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbWFnZVRyZWUuZm9yRWFjaCgKKyAgICAgICAgICAgICAgICAgICAgcCAtPiBpbWFnZU1hcHBlci5hZGQobmV3IE1lcmdpbmdNYXBwZXIocC50b1N0cmluZygpKSkpOworCisgICAgICAgICAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIG91dE9mRGF0ZSA9CisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuc2VsZWN0T3V0T2ZEYXRlU291cmNlcyh0aGlzLCBtb2R1bGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VNYXBwZXIsIGdldFByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dE9mRGF0ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJTa2lwcGluZyBpbWFnZSBjcmVhdGlvbiwgc2luY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIiICsgb3V0cHV0RGlyICsgIlwiIGlzIGFscmVhZHkgbmV3ZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJhbGwgY29uc3RpdHVlbnQgbW9kdWxlcy4iLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2NhbiBcIiIgKyBvdXRwdXREaXIgKyAiXCIgIgorICAgICAgICAgICAgICAgICAgICArICJmb3IgYmVpbmcgdXAtdG8tZGF0ZTogIiArIGUsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbW9kdWxlcy5mb3JFYWNoKE1vZHVsZVNwZWM6OnZhbGlkYXRlKTsKKyAgICAgICAgb2JzZXJ2YWJsZU1vZHVsZXMuZm9yRWFjaChNb2R1bGVTcGVjOjp2YWxpZGF0ZSk7CisgICAgICAgIGxhdW5jaGVycy5mb3JFYWNoKExhdW5jaGVyOjp2YWxpZGF0ZSk7CisgICAgICAgIGxvY2FsZXMuZm9yRWFjaChMb2NhbGVTcGVjOjp2YWxpZGF0ZSk7CisgICAgICAgIG9yZGVyaW5nLmZvckVhY2goUGF0dGVybkxpc3RFbnRyeTo6dmFsaWRhdGUpOworICAgICAgICBleGNsdWRlZEZpbGVzLmZvckVhY2goUGF0dGVybkxpc3RFbnRyeTo6dmFsaWRhdGUpOworICAgICAgICBleGNsdWRlZFJlc291cmNlcy5mb3JFYWNoKFBhdHRlcm5MaXN0RW50cnk6OnZhbGlkYXRlKTsKKworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gYXJncyA9IGJ1aWxkSmxpbmtBcmdzKCk7CisKKyAgICAgICAgVG9vbFByb3ZpZGVyIGpsaW5rID0gVG9vbFByb3ZpZGVyLmZpbmRGaXJzdCgiamxpbmsiKS5vckVsc2VUaHJvdygKKyAgICAgICAgICAgICgpIC0+IG5ldyBCdWlsZEV4Y2VwdGlvbigiamxpbmsgdG9vbCBub3QgZm91bmQgaW4gSkRLLiIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSkpOworCisgICAgICAgIGlmIChvdXRwdXREaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGxvZygiRGVsZXRpbmcgZXhpc3RpbmcgIiArIG91dHB1dERpciwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICBkZWxldGVUcmVlKG91dHB1dERpci50b1BhdGgoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb2coIkV4ZWN1dGluZzogamxpbmsgIiArIFN0cmluZy5qb2luKCIgIiwgYXJncyksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdGRvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdGRlcnIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgaW50IGV4aXRDb2RlOworICAgICAgICB0cnkgKFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShzdGRvdXQpOworICAgICAgICAgICAgIFByaW50U3RyZWFtIGVyciA9IG5ldyBQcmludFN0cmVhbShzdGRlcnIpKSB7CisKKyAgICAgICAgICAgIGV4aXRDb2RlID0gamxpbmsucnVuKG91dCwgZXJyLCBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiamxpbmsgZmFpbGVkIChleGl0IGNvZGUgIikuYXBwZW5kKGV4aXRDb2RlKS5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgIGlmIChzdGRvdXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCIsIG91dHB1dCBpczogIikuYXBwZW5kKHN0ZG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RkZXJyLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCgiLCBlcnJvciBvdXRwdXQgaXM6ICIpLmFwcGVuZChzdGRlcnIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZS50b1N0cmluZygpLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJib3NlTGV2ZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGxldmVsID0gdmVyYm9zZUxldmVsLmdldExldmVsKCk7CisKKyAgICAgICAgICAgIGlmIChzdGRvdXQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGxvZyhzdGRvdXQudG9TdHJpbmcoKSwgbGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0ZGVyci5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbG9nKHN0ZGVyci50b1N0cmluZygpLCBsZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb2coIkNyZWF0ZWQgIiArIG91dHB1dERpci5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjdXJzaXZlbHkgZGVsZXRlcyBhIGZpbGUgdHJlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgcm9vdCBvZiB0cmVlIHRvIGRlbGV0ZQorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBkZWxldGlvbiBmYWlscworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBkZWxldGVUcmVlKGphdmEubmlvLmZpbGUuUGF0aCBkaXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVzLndhbGtGaWxlVHJlZShkaXIsIG5ldyBTaW1wbGVGaWxlVmlzaXRvcjxqYXZhLm5pby5maWxlLlBhdGg+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKGZpbmFsIGphdmEubmlvLmZpbGUuUGF0aCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBGaWxlcy5kZWxldGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCBwb3N0VmlzaXREaXJlY3RvcnkoZmluYWwgamF2YS5uaW8uZmlsZS5QYXRoIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLmRlbGV0ZShkaXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5wb3N0VmlzaXREaXJlY3RvcnkoZGlyLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGVsZXRlIFwiIiArIGRpciArICJcIjogIiArIGUsIGUsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBsaXN0IG9mIGFyZ3VtZW50cyB0byA8Y29kZT5qbGluazwvY29kZT4gdG9vbCwgYmFzZWQgb24gdGhpcworICAgICAqIGluc3RhbmNlJ3MgY3VycmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IGxpc3Qgb2YgPGNvZGU+amxpbms8L2NvZGU+IGFyZ3VtZW50cworICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbnkgaW5jb25zaXN0ZW5jaWVzIGF0dHJpYnV0ZXMvZWxlbWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGlzIGZvdW5kCisgICAgICovCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRKbGlua0FyZ3MoKSB7CisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBhcmdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgYXJncy5hZGQoIi0tb3V0cHV0Iik7CisgICAgICAgIGFyZ3MuYWRkKG91dHB1dERpci50b1N0cmluZygpKTsKKworICAgICAgICBhcmdzLmFkZCgiLS1tb2R1bGUtcGF0aCIpOworICAgICAgICBhcmdzLmFkZChtb2R1bGVQYXRoLnRvU3RyaW5nKCkpOworCisgICAgICAgIGFyZ3MuYWRkKCItLWFkZC1tb2R1bGVzIik7CisgICAgICAgIGFyZ3MuYWRkKG1vZHVsZXMuc3RyZWFtKCkubWFwKE1vZHVsZVNwZWM6OmdldE5hbWUpLmNvbGxlY3QoCisgICAgICAgICAgICBDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSkpOworCisgICAgICAgIGlmICghb2JzZXJ2YWJsZU1vZHVsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1saW1pdC1tb2R1bGVzIik7CisgICAgICAgICAgICBhcmdzLmFkZChvYnNlcnZhYmxlTW9kdWxlcy5zdHJlYW0oKS5tYXAoTW9kdWxlU3BlYzo6Z2V0TmFtZSkuY29sbGVjdCgKKyAgICAgICAgICAgICAgICBDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFsb2NhbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0taW5jbHVkZS1sb2NhbGVzPSIKKyAgICAgICAgICAgICAgICArIGxvY2FsZXMuc3RyZWFtKCkubWFwKExvY2FsZVNwZWM6OmdldE5hbWUpLmNvbGxlY3QoCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKExhdW5jaGVyIGxhdW5jaGVyIDogbGF1bmNoZXJzKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1sYXVuY2hlciIpOworICAgICAgICAgICAgYXJncy5hZGQobGF1bmNoZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9yZGVyaW5nLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tb3JkZXItcmVzb3VyY2VzPSIKKyAgICAgICAgICAgICAgICArIG9yZGVyaW5nLnN0cmVhbSgpLm1hcChQYXR0ZXJuTGlzdEVudHJ5Ojp0b09wdGlvblZhbHVlKS5jb2xsZWN0KAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSkpOworICAgICAgICB9CisgICAgICAgIGlmICghZXhjbHVkZWRGaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLWV4Y2x1ZGUtZmlsZXM9IgorICAgICAgICAgICAgICAgICsgZXhjbHVkZWRGaWxlcy5zdHJlYW0oKS5tYXAoUGF0dGVybkxpc3RFbnRyeTo6dG9PcHRpb25WYWx1ZSkuY29sbGVjdCgKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWV4Y2x1ZGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tZXhjbHVkZS1yZXNvdXJjZXM9IgorICAgICAgICAgICAgICAgICsgZXhjbHVkZWRSZXNvdXJjZXMuc3RyZWFtKCkubWFwKFBhdHRlcm5MaXN0RW50cnk6OnRvT3B0aW9uVmFsdWUpLmNvbGxlY3QoCisgICAgICAgICAgICAgICAgICAgIENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZFNlcnZpY2VzKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1iaW5kLXNlcnZpY2VzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlnbm9yZVNpZ25pbmcpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLWlnbm9yZS1zaWduaW5nLWluZm9ybWF0aW9uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbmNsdWRlSGVhZGVycykgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tbm8taGVhZGVyLWZpbGVzIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbmNsdWRlTWFuUGFnZXMpIHsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLW5vLW1hbi1wYWdlcyIpOworICAgICAgICB9CisgICAgICAgIGlmICghaW5jbHVkZU5hdGl2ZUNvbW1hbmRzKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1zdHJpcC1uYXRpdmUtY29tbWFuZHMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWRlYnVnKSB7CisgICAgICAgICAgICBhcmdzLmFkZCgiLS1zdHJpcC1kZWJ1ZyIpOworICAgICAgICB9CisgICAgICAgIGlmICh2ZXJib3NlTGV2ZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tdmVyYm9zZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZGlhbm5lc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tZW5kaWFuIik7CisgICAgICAgICAgICBhcmdzLmFkZChlbmRpYW5uZXNzLmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uTGV2ZWwgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvbXByZXNzaW9uTGV2ZWwgYXR0cmlidXRlICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYW5kIDxjb21wcmVzc2lvbj4gY2hpbGQgZWxlbWVudCBjYW5ub3QgYm90aCBiZSBwcmVzZW50LiIsCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJncy5hZGQoIi0tY29tcHJlc3M9IiArIGNvbXByZXNzaW9uTGV2ZWwudG9Db21tYW5kTGluZU9wdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcHJlc3Npb24gIT0gbnVsbCkgeworICAgICAgICAgICAgY29tcHJlc3Npb24udmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkKCItLWNvbXByZXNzPSIgKyBjb21wcmVzc2lvbi50b0NvbW1hbmRMaW5lT3B0aW9uKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh2bVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tdm09IiArIHZtVHlwZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tEdXBsaWNhdGVMZWdhbCkgeworICAgICAgICAgICAgYXJncy5hZGQoIi0tZGVkdXAtbGVnYWwtbm90aWNlcz1lcnJvci1pZi1ub3Qtc2FtZS1jb250ZW50Iik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSZWxlYXNlSW5mbyBpbmZvIDogcmVsZWFzZUluZm8pIHsKKyAgICAgICAgICAgIGluZm8udmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGFyZ3MuYWRkQWxsKGluZm8udG9Db21tYW5kTGluZU9wdGlvbnMoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXJnczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvbW9kdWxlcy9wYWNrYWdlLWluZm8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDc4JQpjb3B5IGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpjb3B5IHRvIHNyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL21vZHVsZXMvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggOWQ2ZmNiYS4uYjNhZWM0YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL3BhY2thZ2UtaW5mby5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTUsMTEgKzE1LDExIEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICovCisKIC8qKgorICogVGFza3MgZm9yIGRlYWxpbmcgd2l0aCBKYXZhIG1vZHVsZXMsIHdoaWNoIGFyZSBzdXBwb3J0ZWQgc3RhcnRpbmcgd2l0aAorICogSmF2YSA5LgorICoKKyAqIEBzaW5jZSAxLjEwLjYKICAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKLX0KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubW9kdWxlczsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUi5qYXZhCmluZGV4IDJmNzNjM2YuLmNlOTViZDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTExOCw4ICsxMTgsOSBAQAogICAgICAqIEBwYXJhbSBzdXBlckdyYW1tYXIgdGhlIHN1cGVyIGdyYW1tYXIgZmlsZW5hbWUKICAgICAgKiBAZGVwcmVjYXRlZCAgc2luY2UgYW50IDEuNgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0R2xpYihTdHJpbmcgc3VwZXJHcmFtbWFyKSB7Ci0gICAgICAgIFN0cmluZyBzZyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzZzsKICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSkgewogICAgICAgICAgICAgc2cgPSBzdXBlckdyYW1tYXIucmVwbGFjZSgnXFwnLCAnLycpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI3LDYgKzEyOCw3IEBACiAgICAgICAgIH0KICAgICAgICAgc2V0R2xpYihGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNnKSk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyBhbiBvcHRpb25hbCBzdXBlciBncmFtbWFyIGZpbGUKICAgICAgKiBAcGFyYW0gc3VwZXJHcmFtbWFyIHRoZSBzdXBlciBncmFtbWFyIGZpbGUKQEAgLTEzNSw2ICsxMzcsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldEdsaWIoRmlsZSBzdXBlckdyYW1tYXIpIHsKICAgICAgICAgdGhpcy5zdXBlckdyYW1tYXIgPSBzdXBlckdyYW1tYXI7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyBhIGZsYWcgdG8gZW5hYmxlIFBhcnNlVmlldyBkZWJ1Z2dpbmcKICAgICAgKiBAcGFyYW0gZW5hYmxlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKQEAgLTIwMCw3ICsyMDMsNiBAQAogICAgICAqIEBwYXJhbSBzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGb3JrKGJvb2xlYW4gcykgewotICAgICAgICAvL3RoaXMuZm9yayA9IHM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzUsNiArMjM3LDcgQEAKICAgICAgKiBzcGVjaWZ5IGl0IGRpcmVjdGx5LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgYWRkQ2xhc3NwYXRoRW50cnkoIi9hbnRsci9BTlRMUkdyYW1tYXJQYXJzZUJlaGF2aW9yLmNsYXNzIik7CiAgICAgfQpAQCAtMjc4LDYgKzI4MSw3IEBACiAgICAgICogRXhlY3V0ZSB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlcygpOwogCkBAIC0zNTYsNyArMzYwLDYgQEAKICAgICAgICAgaWYgKHRhcmdldEZpbGUgPT0gbnVsbCB8fCAhdGFyZ2V0RmlsZS5pc0ZpbGUoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIHRhcmdldDogIiArIHRhcmdldEZpbGUpOwogICAgICAgICB9Ci0KICAgICAgICAgLy8gaWYgbm8gb3V0cHV0IGRpcmVjdG9yeSBpcyBzcGVjaWZpZWQsIHVzZWQgdGhlIHRhcmdldCdzIGRpcmVjdG9yeQogICAgICAgICBpZiAob3V0cHV0RGlyZWN0b3J5ID09IG51bGwpIHsKICAgICAgICAgICAgIHNldE91dHB1dGRpcmVjdG9yeShuZXcgRmlsZSh0YXJnZXRGaWxlLmdldFBhcmVudCgpKSk7CkBAIC0zNjgsOCArMzcxLDggQEAKIAogICAgIHByaXZhdGUgRmlsZSBnZXRHZW5lcmF0ZWRGaWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGdlbmVyYXRlZEZpbGVOYW1lID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHRhcmdldEZpbGUpKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpbiA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIodGFyZ2V0RmlsZSkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbGluZTsKICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgZXh0ZW5kc0luZGV4ID0gbGluZS5pbmRleE9mKCIgZXh0ZW5kcyAiKTsKQEAgLTM3OSw3ICszODIsNiBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcyIsIGUpOwogICAgICAgICB9CkBAIC00MjEsMTcgKzQyMywxMiBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXMyNzIoKSB7Ci0gICAgICAgIEFudENsYXNzTG9hZGVyIGwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbCA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjb21tYW5kbGluZS5nZXRDbGFzc3BhdGgoKSk7CisgICAgICAgIHRyeSAoQW50Q2xhc3NMb2FkZXIgbCA9CisgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmNyZWF0ZUNsYXNzTG9hZGVyKGNvbW1hbmRsaW5lLmdldENsYXNzcGF0aCgpKSkgewogICAgICAgICAgICAgbC5sb2FkQ2xhc3MoImFudGxyLlZlcnNpb24iKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0NhYi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEKaW5kZXggMjcwYjVkNC4uN2JlM2IyOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQ2FiLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC00NiwxMiArNDYsMTMgQEAKIAogcHVibGljIGNsYXNzIENhYiBleHRlbmRzIE1hdGNoaW5nVGFzayB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkVTVUxUID0gLTk5OworCiAgICAgcHJpdmF0ZSBGaWxlIGNhYkZpbGU7CiAgICAgcHJpdmF0ZSBGaWxlIGJhc2VEaXI7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CiAgICAgcHJpdmF0ZSBib29sZWFuIGRvQ29tcHJlc3MgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBkb1ZlcmJvc2UgPSBmYWxzZTsKICAgICBwcml2YXRlIFN0cmluZyBjbWRPcHRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBmaWxlc2V0QWRkZWQgPSBmYWxzZTsKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAgICAgcHJvdGVjdGVkIFN0cmluZyBhcmNoaXZlVHlwZSA9ICJjYWIiOwpAQCAtMTAxLDEzICsxMDIsMTQgQEAKIAogICAgIC8qKgogICAgICAqIEFkZHMgYSBzZXQgb2YgZmlsZXMgdG8gYXJjaGl2ZS4KLSAgICAgKiBAcGFyYW0gc2V0IGEgc2V0IG9mIGZpbGVzIHRvIGFyY2hpdmUuCisgICAgICogQHBhcmFtIGZpbGVzZXQgYSBzZXQgb2YgZmlsZXMgdG8gYXJjaGl2ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7Ci0gICAgICAgIGlmIChmaWxlc2V0cy5zaXplKCkgPiAwKSB7CisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IGZpbGVzZXQpIHsKKyAgICAgICAgaWYgKGZpbGVzZXRBZGRlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBuZXN0ZWQgZmlsZXNldCBhbGxvd2VkIik7CiAgICAgICAgIH0KLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgICAgICBmaWxlc2V0QWRkZWQgPSB0cnVlOworICAgICAgICB0aGlzLmZpbGVzZXQgPSBmaWxlc2V0OwogICAgIH0KIAogICAgIC8qCkBAIC0xMjAsMTUgKzEyMiwxNSBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJiYXNlZGlyIGF0dHJpYnV0ZSBvciBvbmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5lc3RlZCBmaWxlc2V0IGlzIHJlcXVpcmVkISIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIGlmIChiYXNlRGlyID09IG51bGwgJiYgIWZpbGVzZXRBZGRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJiYXNlZGlyIGF0dHJpYnV0ZSBvciBvbmUgbmVzdGVkIGZpbGVzZXQgaXMgcmVxdWlyZWQhIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYmFzZURpciAhPSBudWxsICYmICFiYXNlRGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJhc2VkaXIgZG9lcyBub3QgZXhpc3QhIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmIChiYXNlRGlyICE9IG51bGwgJiYgZmlsZXNldEFkZGVkKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkJvdGggYmFzZWRpciBhdHRyaWJ1dGUgYW5kIGEgbmVzdGVkIGZpbGVzZXQgaXMgbm90IGFsbG93ZWQiKTsKICAgICAgICAgfQpAQCAtMTQ1LDggKzE0Nyw3IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRXhlY1Rhc2sgY3JlYXRlRXhlYygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEV4ZWNUYXNrIGV4ZWMgPSBuZXcgRXhlY1Rhc2sodGhpcyk7Ci0gICAgICAgIHJldHVybiBleGVjOworICAgICAgICByZXR1cm4gbmV3IEV4ZWNUYXNrKHRoaXMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU0LDE3ICsxNTUsMTAgQEAKICAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGxpc3Qgb2YgZmlsZXMgdG8gY2hlY2suCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjYWIgZmlsZSBpcyBuZXdlciB0aGFuIGl0cyBkZXBlbmRlbnRzLgogICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGlzVXBUb0RhdGUoVmVjdG9yIGZpbGVzKSB7Ci0gICAgICAgIGJvb2xlYW4gdXBUb0RhdGUgPSB0cnVlOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplICYmIHVwVG9EYXRlOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlID0gZmlsZXMuZWxlbWVudEF0KGkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoRklMRV9VVElMUy5yZXNvbHZlRmlsZShiYXNlRGlyLCBmaWxlKS5sYXN0TW9kaWZpZWQoKQotICAgICAgICAgICAgICAgICAgICA+IGNhYkZpbGUubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICB1cFRvRGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1cFRvRGF0ZTsKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1VwVG9EYXRlKFZlY3RvcjxTdHJpbmc+IGZpbGVzKSB7CisgICAgICAgIGZpbmFsIGxvbmcgY2FiTW9kaWZpZWQgPSBjYWJGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICByZXR1cm4gZmlsZXMuc3RyZWFtKCkubWFwKGYgLT4gRklMRV9VVElMUy5yZXNvbHZlRmlsZShiYXNlRGlyLCBmKSkKKyAgICAgICAgICAgIC5tYXBUb0xvbmcoRmlsZTo6bGFzdE1vZGlmaWVkKS5hbGxNYXRjaCh0IC0+IHQgPCBjYWJNb2RpZmllZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzcsMjMgKzE3MSwxOCBAQAogICAgICAqIEByZXR1cm4gdGhlIGxpc3QgZmlsZSBjcmVhdGVkLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEZpbGUgY3JlYXRlTGlzdEZpbGUoVmVjdG9yIGZpbGVzKQorICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZUxpc3RGaWxlKFZlY3RvcjxTdHJpbmc+IGZpbGVzKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBGaWxlIGxpc3RGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShnZXRQcm9qZWN0KCksICJhbnQiLCAiIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CiAKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihsaXN0RmlsZSkpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCdcIicgKyBmaWxlcy5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSArICdcIicpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobGlzdEZpbGUpKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgZiA6IGZpbGVzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBTdHJpbmcuZm9ybWF0KCJcIiVzXCIiLCBmKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUocyk7CiAgICAgICAgICAgICAgICAgd3JpdGVyLm5ld0xpbmUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3cml0ZXIpOwogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIGxpc3RGaWxlOwogICAgIH0KIApAQCAtMjAyLDEyICsxOTEsOCBAQAogICAgICAqIEBwYXJhbSBmaWxlcyB0aGUgdmVjdG9yIHRvIGFwcGVuZCB0aGUgZmlsZXMgdG8uCiAgICAgICogQHBhcmFtIGRzIHRoZSBzY2FubmVyIHRvIGdldCB0aGUgZmlsZXMgZnJvbS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGaWxlcyhWZWN0b3IgZmlsZXMsIERpcmVjdG9yeVNjYW5uZXIgZHMpIHsKLSAgICAgICAgU3RyaW5nW10gZHNmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRzZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZEVsZW1lbnQoZHNmaWxlc1tpXSk7Ci0gICAgICAgIH0KKyAgICBwcm90ZWN0ZWQgdm9pZCBhcHBlbmRGaWxlcyhWZWN0b3I8U3RyaW5nPiBmaWxlcywgRGlyZWN0b3J5U2Nhbm5lciBkcykgeworICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwoZmlsZXMsIGRzLmdldEluY2x1ZGVkRmlsZXMoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTcsMTggKzIwMiwxNiBAQAogICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGdldEZpbGVMaXN0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgVmVjdG9yIGZpbGVzID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8U3RyaW5nPiBnZXRGaWxlTGlzdCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IGZpbGVzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAgICAgaWYgKGJhc2VEaXIgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gZ2V0IGZpbGVzIGZyb20gb2xkIG1ldGhvZHMgLSBpbmNsdWRlcyBhbmQgbmVzdGVkIGluY2x1ZGUKICAgICAgICAgICAgIGFwcGVuZEZpbGVzKGZpbGVzLCBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKGJhc2VEaXIpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KDApOwotICAgICAgICAgICAgYmFzZURpciA9IGZzLmdldERpcigpOwotICAgICAgICAgICAgYXBwZW5kRmlsZXMoZmlsZXMsIGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICBiYXNlRGlyID0gZmlsZXNldC5nZXREaXIoKTsKKyAgICAgICAgICAgIGFwcGVuZEZpbGVzKGZpbGVzLCBmaWxlc2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKSk7CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmlsZXM7CiAgICAgfQogCkBAIC0yMzYsMTEgKzIxOSwxMiBAQAogICAgICAqIGV4ZWN1dGUgdGhpcyB0YXNrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgY2hlY2tDb25maWd1cmF0aW9uKCk7CiAKLSAgICAgICAgVmVjdG9yIGZpbGVzID0gZ2V0RmlsZUxpc3QoKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gZmlsZXMgPSBnZXRGaWxlTGlzdCgpOwogCiAgICAgICAgIC8vIHF1aWNrIGV4aXQgaWYgdGhlIHRhcmdldCBpcyB1cCB0byBkYXRlCiAgICAgICAgIGlmIChpc1VwVG9EYXRlKGZpbGVzKSkgewpAQCAtMjUyLDIwICsyMzYsMTcgQEAKICAgICAgICAgaWYgKCFPcy5pc0ZhbWlseSgid2luZG93cyIpKSB7CiAgICAgICAgICAgICBsb2coIlVzaW5nIGxpc3RjYWIvbGliY2FiaW5ldCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogCi0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAotICAgICAgICAgICAgRW51bWVyYXRpb24gZmlsZUVudW0gPSBmaWxlcy5lbGVtZW50cygpOworICAgICAgICAgICAgZmlsZXMuZm9yRWFjaChmIC0+IHNiLmFwcGVuZChmKS5hcHBlbmQoIlxuIikpOwogCi0gICAgICAgICAgICB3aGlsZSAoZmlsZUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmlsZUVudW0ubmV4dEVsZW1lbnQoKSkuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgc2IuYXBwZW5kKCJcbiIpLmFwcGVuZChjYWJGaWxlLmdldEFic29sdXRlUGF0aCgpKS5hcHBlbmQoIlxuIik7CiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgUHJvY2VzcyBwID0gRXhlY3V0ZS5sYXVuY2goZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7Imxpc3RjYWIifSwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlRGlyICE9IG51bGwgPyBiYXNlRGlyIDogZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibGlzdGNhYiJ9LCBudWxsLAorICAgICAgICAgICAgICAgICAgICBiYXNlRGlyICE9IG51bGwgPyBiYXNlRGlyIDogZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IHAuZ2V0T3V0cHV0U3RyZWFtKCk7CiAKICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN0cmVhbSBwdW1wZXJzIHRvIGZvcndhcmQgbGlzdGNhYidzIHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBsb2cKQEAgLTI3Nyw4ICsyNTgsOCBAQAogICAgICAgICAgICAgICAgIFN0cmVhbVB1bXBlciAgICBlcnJQdW1wID0gbmV3IFN0cmVhbVB1bXBlcihwLmdldEVycm9yU3RyZWFtKCksIGVyckxvZyk7CiAKICAgICAgICAgICAgICAgICAvLyBQdW1wIHN0cmVhbXMgYXN5bmNocm9ub3VzbHkKLSAgICAgICAgICAgICAgICAobmV3IFRocmVhZChvdXRQdW1wKSkuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAobmV3IFRocmVhZChlcnJQdW1wKSkuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKG91dFB1bXApLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgbmV3IFRocmVhZChlcnJQdW1wKS5zdGFydCgpOwogCiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CkBAIC0zMDUsOCArMjg2LDkgQEAKICAgICAgICAgICAgICAgICAgICAgbG9nKCJFcnJvciBleGVjdXRpbmcgbGlzdGNhYjsgZXJyb3IgY29kZTogIiArIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgIiArIGNhYkZpbGUgKyAiICIgKyBleC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSBjcmVhdGluZyAiICsgY2FiRmlsZSArICIgIiArIGV4LmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzQ4LDggKzMzMCw5IEBACiAKICAgICAgICAgICAgICAgICBsaXN0RmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiUHJvYmxlbSBjcmVhdGluZyAiICsgY2FiRmlsZSArICIgIiArIGlvZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSBjcmVhdGluZyAiICsgY2FiRmlsZSArICIgIiArIGlvZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0VjaG9Qcm9wZXJ0aWVzLmphdmEKaW5kZXggOGEwYTllMS4uNzQwNGJkYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9FY2hvUHJvcGVydGllcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMzkgKzE3LDM5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnVtZXJhdGVkQXR0cmlidXRlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlByb3BlcnR5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuQ29sbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRE9NRWxlbWVudFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwpAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxvbmVycm9yID0gdHJ1ZTsKIAotICAgIHByaXZhdGUgVmVjdG9yIHByb3BlcnR5U2V0cyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8UHJvcGVydHlTZXQ+IHByb3BlcnR5U2V0cyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0ID0gInRleHQiOwogCkBAIC0xNjAsMjMgKzE2MCwyMSBAQAogICAgICAgICB0aGlzLmRlc3RmaWxlID0gZGVzdGZpbGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBJZiB0cnVlLCB0aGUgdGFzayB3aWxsIGZhaWwgaWYgYW4gZXJyb3Igb2NjdXJzIHdyaXRpbmcgdGhlIHByb3BlcnRpZXMKICAgICAgKiBmaWxlLCBvdGhlcndpc2UgZXJyb3JzIGFyZSBqdXN0IGxvZ2dlZC4KICAgICAgKgotICAgICAqIEBwYXJhbSBmYWlsb25lcnJvciAgPHR0PnRydWU8L3R0PiBpZiBJTyBleGNlcHRpb25zIGFyZSByZXBvcnRlZCBhcyBidWlsZAotICAgICAqICAgICAgZXhjZXB0aW9ucywgb3IgPHR0PmZhbHNlPC90dD4gaWYgSU8gZXhjZXB0aW9ucyBhcmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gZmFpbG9uZXJyb3IgIDxjb2RlPnRydWU8L2NvZGU+IGlmIElPIGV4Y2VwdGlvbnMgYXJlIHJlcG9ydGVkIGFzIGJ1aWxkCisgICAgICogICAgICBleGNlcHRpb25zLCBvciA8Y29kZT5mYWxzZTwvY29kZT4gaWYgSU8gZXhjZXB0aW9ucyBhcmUgaWdub3JlZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnJvcihib29sZWFuIGZhaWxvbmVycm9yKSB7CiAgICAgICAgIHRoaXMuZmFpbG9uZXJyb3IgPSBmYWlsb25lcnJvcjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIElmIHRoZSBwcmVmaXggaXMgc2V0LCB0aGVuIG9ubHkgcHJvcGVydGllcyB3aGljaCBzdGFydCB3aXRoIHRoaXMKICAgICAgKiBwcmVmaXggc3RyaW5nIHdpbGwgYmUgcmVjb3JkZWQuIElmIHJlZ2V4IGlzIG5vdCBzZXQgYW5kICBpZiB0aGlzCi0gICAgICogaXMgbmV2ZXIgc2V0LCBvciBpdCBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIDx0dD5udWxsPC90dD4sCisgICAgICogaXMgbmV2ZXIgc2V0LCBvciBpdCBpcyBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIG9yIDxjb2RlPm51bGw8L2NvZGU+LAogICAgICAqIHRoZW4gYWxsIHByb3BlcnRpZXMgd2lsbCBiZSByZWNvcmRlZC4KICAgICAgKgogICAgICAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgYXR0cmlidXRlIGlzIHNldCBhczo8L3A+CkBAIC0xODcsNyArMTg1LDcgQEAKICAgICAgKiBAcGFyYW0gIHByZWZpeCAgVGhlIG5ldyBwcmVmaXggdmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmICFwcmVmaXguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnByZWZpeCA9IHByZWZpeDsKICAgICAgICAgICAgIFByb3BlcnR5U2V0IHBzID0gbmV3IFByb3BlcnR5U2V0KCk7CiAgICAgICAgICAgICBwcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CkBAIC0xOTksNyArMTk3LDcgQEAKICAgICAvKioKICAgICAgKiBJZiB0aGUgcmVnZXggaXMgc2V0LCB0aGVuIG9ubHkgcHJvcGVydGllcyB3aG9zZSBuYW1lcyBtYXRjaCBpdAogICAgICAqIHdpbGwgYmUgcmVjb3JkZWQuICBJZiBwcmVmaXggaXMgbm90IHNldCBhbmQgaWYgdGhpcyBpcyBuZXZlciBzZXQsCi0gICAgICogb3IgaXQgaXMgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LCB0aGVuIGFsbAorICAgICAqIG9yIGl0IGlzIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gYWxsCiAgICAgICogcHJvcGVydGllcyB3aWxsIGJlIHJlY29yZGVkLgogICAgICAqCiAgICAgICogPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBhdHRyaWJ1dGUgaXMgc2V0IGFzOjwvcD4KQEAgLTIxMiw3ICsyMTAsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVnZXgoU3RyaW5nIHJlZ2V4KSB7Ci0gICAgICAgIGlmIChyZWdleCAhPSBudWxsICYmIHJlZ2V4Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgaWYgKHJlZ2V4ICE9IG51bGwgJiYgIXJlZ2V4LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4OwogICAgICAgICAgICAgUHJvcGVydHlTZXQgcHMgPSBuZXcgUHJvcGVydHlTZXQoKTsKICAgICAgICAgICAgIHBzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKQEAgLTIyNyw3ICsyMjUsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJvcGVydHlzZXQoUHJvcGVydHlTZXQgcHMpIHsKLSAgICAgICAgcHJvcGVydHlTZXRzLmFkZEVsZW1lbnQocHMpOworICAgICAgICBwcm9wZXJ0eVNldHMuYWRkKHBzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI0OSw2ICsyNDcsNyBAQAogICAgICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzKCkKICAgICAgICAgICogQHJldHVybiBhY2NlcHRlZCB2YWx1ZXMKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHM7CiAgICAgICAgIH0KQEAgLTI1OSwyNyArMjU4LDI4IEBACiAgICAgICoKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uICB0cm91YmxlLCBwcm9iYWJseSBmaWxlIElPCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiByZWdleCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlBsZWFzZSBzcGVjaWZ5IGVpdGhlciBwcmVmaXgiCi0gICAgICAgICAgICAgICAgICAgICsgIiBvciByZWdleCwgYnV0IG5vdCBib3RoIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlBsZWFzZSBzcGVjaWZ5IGVpdGhlciBwcmVmaXggb3IgcmVnZXgsIGJ1dCBub3QgYm90aCIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICAgICAgLy9jb3B5IHRoZSBwcm9wZXJ0aWVzIGZpbGUKLSAgICAgICAgSGFzaHRhYmxlIGFsbFByb3BzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+IGFsbFByb3BzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAgICAgLyogbG9hZCBwcm9wZXJ0aWVzIGZyb20gZmlsZSBpZiBzcGVjaWZpZWQsIG90aGVyd2lzZQogICAgICAgICB1c2UgQW50J3MgcHJvcGVydGllcyAqLwotICAgICAgICBpZiAoaW5GaWxlID09IG51bGwgJiYgcHJvcGVydHlTZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmIChpbkZpbGUgPT0gbnVsbCAmJiBwcm9wZXJ0eVNldHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAvLyBhZGQgYW50IHByb3BlcnRpZXMKICAgICAgICAgICAgIGFsbFByb3BzLnB1dEFsbChnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKICAgICAgICAgfSBlbHNlIGlmIChpbkZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGluRmlsZS5leGlzdHMoKSAmJiBpbkZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgaWYgKGluRmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAic3JjZmlsZSBpcyBhIGRpcmVjdG9yeSEiOwogICAgICAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMjkzLDkgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5GaWxlKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShpbkZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7CiAgICAgICAgICAgICAgICAgYWxsUHJvcHMucHV0QWxsKHByb3BzKTsKQEAgLTMwNCw3NSArMzAyLDM4IEBACiAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBmaWxlICIgKyBpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBmbmZlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9CiAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCBmaWxlICIgKyBpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBpb2UsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wZXJ0eVNldHMuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFByb3BlcnR5U2V0IHBzID0gKFByb3BlcnR5U2V0KSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBhbGxQcm9wcy5wdXRBbGwocHMuZ2V0UHJvcGVydGllcygpKTsKLSAgICAgICAgfQorICAgICAgICBwcm9wZXJ0eVNldHMuc3RyZWFtKCkubWFwKFByb3BlcnR5U2V0OjpnZXRQcm9wZXJ0aWVzKQorICAgICAgICAgICAgLmZvckVhY2goYWxsUHJvcHM6OnB1dEFsbCk7CiAKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChkZXN0ZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgc2F2ZVByb3BlcnRpZXMoYWxsUHJvcHMsIG9zKTsKLSAgICAgICAgICAgICAgICBsb2cob3MudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZS5leGlzdHMoKSAmJiBkZXN0ZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5ISI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkZXN0ZmlsZS5leGlzdHMoKSAmJiAhZGVzdGZpbGUuY2FuV3JpdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FuIG5vdCB3cml0ZSB0byB0aGUgc3BlY2lmaWVkIGRlc3RmaWxlISI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGdldExvY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRoaXMuZGVzdGZpbGUpOworICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IGNyZWF0ZU91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHNhdmVQcm9wZXJ0aWVzKGFsbFByb3BzLCBvcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZyhpb2UuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvcyk7CisgICAgICAgICAgICBsb2coaW9lLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNlbmQgdGhlIGtleS92YWx1ZSBwYWlycyBpbiB0aGUgaGFzaHRhYmxlIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotICAgICAqIE9ubHkgdGhvc2UgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgPHR0PnByZWZpeDwvdHQ+IGNvbnN0cmFpbnQgd2lsbCBiZQorICAgICAqIE9ubHkgdGhvc2UgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgPGNvZGU+cHJlZml4PC9jb2RlPiBjb25zdHJhaW50IHdpbGwgYmUKICAgICAgKiBzZW50IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogICAgICAqIFRoZSBvdXRwdXQgc3RyZWFtIHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhpcyBtZXRob2QgcmV0dXJucy4KICAgICAgKgpAQCAtMzgxLDM3ICszNDIsMzcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgb24gb3V0cHV0IGVycm9ycwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gICBvbiBvdGhlciBlcnJvcnMKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlUHJvcGVydGllcyhIYXNodGFibGUgYWxsUHJvcHMsIE91dHB1dFN0cmVhbSBvcykKKyAgICBwcm90ZWN0ZWQgdm9pZCBzYXZlUHJvcGVydGllcyhIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+IGFsbFByb3BzLCBPdXRwdXRTdHJlYW0gb3MpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBMaXN0IGtleUxpc3QgPSBuZXcgQXJyYXlMaXN0KGFsbFByb3BzLmtleVNldCgpKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChrZXlMaXN0KTsKKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IGtleUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oYWxsUHJvcHMua2V5U2V0KCkpOworCiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpIHsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUwOTA5MzY0NDIzMDkyMDE2NTRMOwotICAgICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25VdGlscy5hc0VudW1lcmF0aW9uKGtleUxpc3QuaXRlcmF0b3IoKSk7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPE9iamVjdD4ga2V5cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5TGlzdC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuc29ydGVkKENvbXBhcmF0b3IuY29tcGFyaW5nKE9iamVjdDo6dG9TdHJpbmcpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmNvbGxlY3RpbmdBbmRUaGVuKENvbGxlY3RvcnMudG9MaXN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uczo6ZW51bWVyYXRpb24pKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0gICAgICAgICAgICAgICAgU2V0IHJlc3VsdCA9IHN1cGVyLmVudHJ5U2V0KCk7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+PiBlbnRyeVNldCgpIHsKKyAgICAgICAgICAgICAgICBTZXQ8TWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gcmVzdWx0ID0gc3VwZXIuZW50cnlTZXQoKTsKICAgICAgICAgICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgewotICAgICAgICAgICAgICAgICAgICBUcmVlU2V0IHQgPSBuZXcgVHJlZVNldChuZXcgQ29tcGFyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXkxID0gKFN0cmluZykgKChNYXAuRW50cnkpIG8xKS5nZXRLZXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5MiA9IChTdHJpbmcpICgoTWFwLkVudHJ5KSBvMikuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTEuY29tcGFyZVRvKGtleTIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgU2V0PE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4+IHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRyZWVTZXQ8PihDb21wYXJhdG9yLmNvbXBhcmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZ1bmN0aW9uPE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4sIE9iamVjdD4pIE1hcC5FbnRyeTo6Z2V0S2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYW5kVGhlbihPYmplY3Q6OnRvU3RyaW5nKSkpOwogICAgICAgICAgICAgICAgICAgICB0LmFkZEFsbChyZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBrZXlMaXN0LnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0ga2V5TGlzdC5nZXQoaSkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGFsbFByb3BzLmdldChuYW1lKS50b1N0cmluZygpOwotICAgICAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOwotICAgICAgICB9CisgICAgICAgIGFsbFByb3BzLmZvckVhY2goKGssIHYpIC0+IHByb3BzLnB1dChTdHJpbmcudmFsdWVPZihrKSwgU3RyaW5nLnZhbHVlT2YodikpKTsKKwogICAgICAgICBpZiAoInRleHQiLmVxdWFscyhmb3JtYXQpKSB7CiAgICAgICAgICAgICBqZGtTYXZlUHJvcGVydGllcyhwcm9wcywgb3MsICJBbnQgcHJvcGVydGllcyIpOwogICAgICAgICB9IGVsc2UgaWYgKCJ4bWwiLmVxdWFscyhmb3JtYXQpKSB7CkBAIC00MjIsNyArMzgzLDcgQEAKICAgICAvKioKICAgICAgKiBhIHR1cGxlIGZvciB0aGUgc29ydCBsaXN0LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFR1cGxlIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVHVwbGUgaW1wbGVtZW50cyBDb21wYXJhYmxlPFR1cGxlPiB7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIGtleTsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CiAKQEAgLTQzOSw5ICs0MDAsOSBAQAogICAgICAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCdzIHR5cGUgcHJldmVudHMgaXQKICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiZWluZyBjb21wYXJlZCB0byB0aGlzIE9iamVjdC4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7Ci0gICAgICAgICAgICBUdXBsZSB0aGF0ID0gKFR1cGxlKSBvOwotICAgICAgICAgICAgcmV0dXJuIGtleS5jb21wYXJlVG8odGhhdC5rZXkpOworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oVHVwbGUgbykgeworICAgICAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IuPFN0cmluZz4gbmF0dXJhbE9yZGVyKCkuY29tcGFyZShrZXksIG8ua2V5KTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtNDUzLDI2ICs0MTQsMjEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBUdXBsZSB0aGF0ID0gKFR1cGxlKSBvOwotICAgICAgICAgICAgcmV0dXJuIChrZXkgPT0gbnVsbCA/IHRoYXQua2V5ID09IG51bGwgOiBrZXkuZXF1YWxzKHRoYXQua2V5KSkKLSAgICAgICAgICAgICAgICAmJiAodmFsdWUgPT0gbnVsbCA/IHRoYXQudmFsdWUgPT0gbnVsbCA6IHZhbHVlLmVxdWFscyh0aGF0LnZhbHVlKSk7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoa2V5LCB0aGF0LmtleSkKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyh2YWx1ZSwgdGhhdC52YWx1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBrZXkgIT0gbnVsbCA/IGtleS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goa2V5KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgTGlzdCBzb3J0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgcHJpdmF0ZSBMaXN0PFR1cGxlPiBzb3J0UHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CiAgICAgICAgIC8vIHNvcnQgdGhlIGxpc3QuIE1ha2VzIFNDTSBhbmQgbWFudWFsIGRpZmZzIGVhc2llci4KLSAgICAgICAgTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KHByb3BzLnNpemUoKSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBwcm9wcy5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHNvcnRlZC5hZGQobmV3IFR1cGxlKG5hbWUsIHByb3BzLmdldFByb3BlcnR5KG5hbWUpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQpOwotICAgICAgICByZXR1cm4gc29ydGVkOworICAgICAgICByZXR1cm4gcHJvcHMuc3RyaW5nUHJvcGVydHlOYW1lcygpLnN0cmVhbSgpCisgICAgICAgICAgICAubWFwKGsgLT4gbmV3IFR1cGxlKGssIHByb3BzLmdldFByb3BlcnR5KGspKSkuc29ydGVkKCkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDg3LDM2ICs0NDMsMjkgQEAKICAgICAgICAgRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKICAgICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KFBST1BFUlRJRVMpOwogCi0gICAgICAgIExpc3Qgc29ydGVkID0gc29ydFByb3BlcnRpZXMocHJvcHMpOwotCisgICAgICAgIExpc3Q8VHVwbGU+IHNvcnRlZCA9IHNvcnRQcm9wZXJ0aWVzKHByb3BzKTsKIAogICAgICAgICAvLyBvdXRwdXQgcHJvcGVydGllcwotICAgICAgICBJdGVyYXRvciBpdGVuID0gc29ydGVkLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVuLmhhc05leHQoKSkgewotICAgICAgICAgICAgVHVwbGUgdHVwbGUgPSAoVHVwbGUpIGl0ZW4ubmV4dCgpOworICAgICAgICBmb3IgKFR1cGxlIHR1cGxlIDogc29ydGVkKSB7CiAgICAgICAgICAgICBFbGVtZW50IHByb3BFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoUFJPUEVSVFkpOwogICAgICAgICAgICAgcHJvcEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfTkFNRSwgdHVwbGUua2V5KTsKICAgICAgICAgICAgIHByb3BFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1ZBTFVFLCB0dXBsZS52YWx1ZSk7CiAgICAgICAgICAgICByb290RWxlbWVudC5hcHBlbmRDaGlsZChwcm9wRWxlbWVudCk7CiAgICAgICAgIH0KIAotICAgICAgICBXcml0ZXIgd3JpID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHdyaSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsICJVVEY4Iik7CisgICAgICAgIHRyeSAoV3JpdGVyIHdyaSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSB7CiAgICAgICAgICAgICB3cmkud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOwotICAgICAgICAgICAgKG5ldyBET01FbGVtZW50V3JpdGVyKCkpLndyaXRlKHJvb3RFbGVtZW50LCB3cmksIDAsICJcdCIpOworICAgICAgICAgICAgbmV3IERPTUVsZW1lbnRXcml0ZXIoKS53cml0ZShyb290RWxlbWVudCwgd3JpLCAwLCAiXHQiKTsKICAgICAgICAgICAgIHdyaS5mbHVzaCgpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIFhNTCBmaWxlIiwgaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3cmkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSkRLIDEuMiBhbGxvd3MgZm9yIHRoZSBzYWZlciBtZXRob2QKLSAgICAgKiA8dHQ+UHJvcGVydGllcy5zdG9yZShPdXRwdXRTdHJlYW0sIFN0cmluZyk8L3R0Piwgd2hpY2ggdGhyb3dzIGFuCi0gICAgICogPHR0PklPRXhjZXB0aW9uPC90dD4gb24gYW4gb3V0cHV0IGVycm9yLgorICAgICAqIDxjb2RlPlByb3BlcnRpZXMuc3RvcmUoT3V0cHV0U3RyZWFtLCBTdHJpbmcpPC9jb2RlPiwgd2hpY2ggdGhyb3dzIGFuCisgICAgICogPGNvZGU+SU9FeGNlcHRpb248L2NvZGU+IG9uIGFuIG91dHB1dCBlcnJvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcm9wcyB0aGUgcHJvcGVydGllcyB0byByZWNvcmQKICAgICAgKiBAcGFyYW0gb3MgcmVjb3JkIHRoZSBwcm9wZXJ0aWVzIHRvIHRoaXMgb3V0cHV0IHN0cmVhbQpAQCAtNTI3LDcgKzQ3Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBwcm9wcy5zdG9yZShvcywgaGVhZGVyKTsKLQogICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICB9IGZpbmFsbHkgewpAQCAtNTQxLDYgKzQ4OSwyOSBAQAogICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBjcmVhdGVPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZGVzdGZpbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RmaWxlLmV4aXN0cygpICYmIGRlc3RmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5ISI7CisgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0ZmlsZS5leGlzdHMoKSAmJiAhZGVzdGZpbGUuY2FuV3JpdGUoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICJDYW4gbm90IHdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGZpbGUhIjsKKyAgICAgICAgICAgIGlmIChmYWlsb25lcnJvcikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZpbGVzLm5ld091dHB1dFN0cmVhbSh0aGlzLmRlc3RmaWxlLnRvUGF0aCgpKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBVc2VzIHRoZSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IHRvIGdldCBhIERvY3VtZW50QnVpbGRlciBpbnN0YW5jZS4KQEAgLTU1NSw0ICs1MjYsMyBAQAogICAgICAgICB9CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9KYXZhaC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmF2YWguamF2YQppbmRleCBlOTc1M2RmLi5jNGUzMTU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9KYXZhaC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMCArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMzMsNyArMzQsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZS5GYWNhZGVUYXNrSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZmFjYWRlLkltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudDsKIApAQCAtNzAsNyArNzAsNyBAQAogCiBwdWJsaWMgY2xhc3MgSmF2YWggZXh0ZW5kcyBUYXNrIHsKIAotICAgIHByaXZhdGUgVmVjdG9yIGNsYXNzZXMgPSBuZXcgVmVjdG9yKDIpOworICAgIHByaXZhdGUgTGlzdDxDbGFzc0FyZ3VtZW50PiBjbGFzc2VzID0gbmV3IFZlY3Rvcjw+KDIpOwogICAgIHByaXZhdGUgU3RyaW5nIGNsczsKICAgICBwcml2YXRlIEZpbGUgZGVzdERpcjsKICAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoID0gbnVsbDsKQEAgLTgwLDkgKzgwLDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gb2xkICAgICA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBzdHVicyAgID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBQYXRoIGJvb3RjbGFzc3BhdGg7Ci0gICAgLy9wcml2YXRlIFBhdGggZXh0ZGlyczsKICAgICBwcml2YXRlIEZhY2FkZVRhc2tIZWxwZXIgZmFjYWRlID0gbnVsbDsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWxlU2V0PiBmaWxlcyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByaXZhdGUgSmF2YWhBZGFwdGVyIG5lc3RlZEFkYXB0ZXIgPSBudWxsOwogCiAgICAgLyoqCkBAIC0xMDYsNyArMTA1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQ2xhc3NBcmd1bWVudCBjcmVhdGVDbGFzcygpIHsKICAgICAgICAgQ2xhc3NBcmd1bWVudCBnYSA9IG5ldyBDbGFzc0FyZ3VtZW50KCk7Ci0gICAgICAgIGNsYXNzZXMuYWRkRWxlbWVudChnYSk7CisgICAgICAgIGNsYXNzZXMuYWRkKGdhKTsKICAgICAgICAgcmV0dXJuIGdhOwogICAgIH0KIApAQCAtMTE3LDEwICsxMTYsNiBAQAogICAgIHB1YmxpYyBjbGFzcyBDbGFzc0FyZ3VtZW50IHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKIAotICAgICAgICAvKiogQ29uc3RydWN0b3IgZm9yIENsYXNzQXJndW1lbnQuICovCi0gICAgICAgIHB1YmxpYyBDbGFzc0FyZ3VtZW50KCkgewotICAgICAgICB9Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCB0aGUgbmFtZSBhdHRyaWJ1dGUuCiAgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIGF0dHJpYnV0ZS4KQEAgLTE1MiwzMyArMTQ3LDIwIEBACiAgICAgICogQHNpbmNlIEFudCAxLjYuMwogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbGFzc2VzKCkgewotICAgICAgICBBcnJheUxpc3QgYWwgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIFN0cmVhbTxTdHJpbmc+IHN0cmVhbSA9IFN0cmVhbS5jb25jYXQoCisgICAgICAgICAgICBmaWxlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXAoZnMgLT4gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRmlsZXMoKSkKKyAgICAgICAgICAgICAgICAuZmxhdE1hcChTdHJlYW06Om9mKQorICAgICAgICAgICAgICAgIC5tYXAocyAtPiBzLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCcvJywgJy4nKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUZpcnN0KCJcXC5jbGFzcyQiLCAiIikpLAorICAgICAgICAgICAgY2xhc3Nlcy5zdHJlYW0oKS5tYXAoQ2xhc3NBcmd1bWVudDo6Z2V0TmFtZSkpOworCiAgICAgICAgIGlmIChjbHMgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xzLCAiLCIsIGZhbHNlKTsKLSAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgYWwuYWRkKHRvay5uZXh0VG9rZW4oKS50cmltKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyZWFtID0gU3RyZWFtLmNvbmNhdChTdHJlYW0ub2YoY2xzLnNwbGl0KCIsIikpLm1hcChTdHJpbmc6OnRyaW0pLAorICAgICAgICAgICAgICAgIHN0cmVhbSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZmlsZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZmlsZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbmNsdWRlZENsYXNzZXMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKAotICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkQ2xhc3Nlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkQ2xhc3Nlc1tpXS5yZXBsYWNlKCdcXCcsICcuJykucmVwbGFjZSgnLycsICcuJykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgaW5jbHVkZWRDbGFzc2VzW2ldLmxlbmd0aCgpIC0gNik7Ci0gICAgICAgICAgICAgICAgICAgIGFsLmFkZChjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFbnVtZXJhdGlvbiBlID0gY2xhc3Nlcy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQ2xhc3NBcmd1bWVudCBhcmcgPSAoQ2xhc3NBcmd1bWVudCkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgYWwuYWRkKGFyZy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGFsLnRvQXJyYXkobmV3IFN0cmluZ1thbC5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzkxLDggKzM3Myw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYuMwogICAgICAqLwogICAgIHB1YmxpYyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgY3JlYXRlQXJnKCkgewotICAgICAgICBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgYXJnID0KLSAgICAgICAgICAgIG5ldyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQoKTsKKyAgICAgICAgSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50IGFyZyA9IG5ldyBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQoKTsKICAgICAgICAgZmFjYWRlLmFkZEltcGxlbWVudGF0aW9uQXJndW1lbnQoYXJnKTsKICAgICAgICAgcmV0dXJuIGFyZzsKICAgICB9CkBAIC00MjYsOCArNDA3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoSmF2YWhBZGFwdGVyIGFkYXB0ZXIpIHsKICAgICAgICAgaWYgKG5lc3RlZEFkYXB0ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW4ndCBoYXZlIG1vcmUgdGhhbiBvbmUgamF2YWgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFkYXB0ZXIiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIGphdmFoIGFkYXB0ZXIiKTsKICAgICAgICAgfQogICAgICAgICBuZXN0ZWRBZGFwdGVyID0gYWRhcHRlcjsKICAgICB9CkBAIC00MzcsMTcgKzQxNywyMyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHRhc2sgZXhlY3V0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyBmaXJzdCBvZmYsIG1ha2Ugc3VyZSB0aGF0IHdlJ3ZlIGdvdCBhIHNyY2RpcgorICAgICAgICBmaW5hbCBTZXQ8U2V0dGluZ3M+IHNldHRpbmdzID0gRW51bVNldC5ub25lT2YoU2V0dGluZ3MuY2xhc3MpOwogCi0gICAgICAgIGlmICgoY2xzID09IG51bGwpICYmIChjbGFzc2VzLnNpemUoKSA9PSAwKSAmJiAoZmlsZXMuc2l6ZSgpID09IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNsYXNzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiLAotICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAoY2xzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldHRpbmdzLmFkZChTZXR0aW5ncy5jbHMpOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChjbHMgIT0gbnVsbCkgJiYgKGNsYXNzZXMuc2l6ZSgpID4gMCkgJiYgKGZpbGVzLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNldCBjbGFzcyBhdHRyaWJ1dGUgT1IgY2xhc3MgZWxlbWVudCBPUiBmaWxlc2V0LCAiCi0gICAgICAgICAgICAgICAgKyAibm90IDIgb3IgbW9yZSBvZiB0aGVtLiIsIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAoIWNsYXNzZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzZXR0aW5ncy5hZGQoU2V0dGluZ3MuY2xhc3Nlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaWxlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNldHRpbmdzLmFkZChTZXR0aW5ncy5maWxlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNldHRpbmdzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhhY3RseSBvbmUgb2YgIiArIFNldHRpbmdzLnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgICsgIiBhdHRyaWJ1dGVzIGlzIHJlcXVpcmVkIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVzdERpciAhPSBudWxsKSB7CkBAIC00NTYsMTMgKzQ0MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImRlc3RkaXIgYW5kIG91dHB1dEZpbGUgYXJlIG11dHVhbGx5ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZXhjbHVzaXZlIiwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0ZGlyIGFuZCBvdXRwdXRGaWxlIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY2xhc3NwYXRoID09IG51bGwpIHsKLSAgICAgICAgICAgIGNsYXNzcGF0aCA9IChuZXcgUGF0aChnZXRQcm9qZWN0KCkpKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImxhc3QiKTsKKyAgICAgICAgICAgIGNsYXNzcGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbGFzc3BhdGggPSBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKICAgICAgICAgfQpAQCAtNDkzLDIyICs0NzksMjAgQEAKICAgICAgICAgbG9nKCJDb21waWxhdGlvbiAiICsgY21kLmRlc2NyaWJlQXJndW1lbnRzKCksCiAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAotICAgICAgICBTdHJpbmdCdWZmZXIgbmljZUNsYXNzTGlzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgU3RyaW5nW10gYyA9IGdldENsYXNzZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShjW2ldKTsKLSAgICAgICAgICAgIG5pY2VDbGFzc0xpc3QuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICBuaWNlQ2xhc3NMaXN0LmFwcGVuZChjW2ldKTsKLSAgICAgICAgICAgIG5pY2VDbGFzc0xpc3QuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZ0J1ZmZlciBwcmVmaXggPSBuZXcgU3RyaW5nQnVmZmVyKCJDbGFzcyIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigiQ2xhc3MiKTsKICAgICAgICAgaWYgKGMubGVuZ3RoID4gMSkgewotICAgICAgICAgICAgcHJlZml4LmFwcGVuZCgiZXMiKTsKKyAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCJlcyIpOwogICAgICAgICB9Ci0gICAgICAgIHByZWZpeC5hcHBlbmQoIiB0byBiZSBjb21waWxlZDoiKTsKLSAgICAgICAgcHJlZml4LmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiB0byBiZSBjb21waWxlZDolbiIpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IGMpIHsKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGVsZW1lbnQpOworICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiICAgICVzJW4iLCBlbGVtZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nKG1lc3NhZ2UudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgfQogCi0gICAgICAgIGxvZyhwcmVmaXgudG9TdHJpbmcoKSArIG5pY2VDbGFzc0xpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgcHJpdmF0ZSBlbnVtIFNldHRpbmdzIHsKKyAgICAgICAgY2xzLCBmaWxlcywgY2xhc3NlcwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaS5qYXZhCmluZGV4IGFjYmVlODcuLmFkN2IxYmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTk4LDggKzE5OCw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkKE5hdGl2ZTJBc2NpaUFkYXB0ZXIgYWRhcHRlcikgewogICAgICAgICBpZiAobmVzdGVkQWRhcHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBuYXRpdmUyYXNjaWkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFkYXB0ZXIiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIG5hdGl2ZTJhc2NpaSBhZGFwdGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbmVzdGVkQWRhcHRlciA9IGFkYXB0ZXI7CiAgICAgfQpAQCAtMjA5LDYgKzIwOSw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlzIHRoZXJlIGlzIGEgcHJvYmxlbSBpbiB0aGUgdGFzayBleGVjdXRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbnVsbDsgLy8gU2Nhbm5lciB0byBmaW5kIG91ciBpbnB1dHMKQEAgLTIyOCwxMSArMjI5LDExIEBACiAgICAgICAgIC8vIHRvIGJlIHNldCwgc28gd2UgZG9uJ3Qgc3RvbXAgZXZlcnkgZmlsZS4gIE9uZSBjb3VsZCBzdGlsbAogICAgICAgICAvLyBpbmNsdWRlIGEgZmlsZSB3aXRoIHRoZSBzYW1lIGV4dGVuc2lvbiwgYnV0IC4uLi4KICAgICAgICAgaWYgKHNyY0Rpci5lcXVhbHMoZGVzdERpcikgJiYgZXh0ZW5zaW9uID09IG51bGwgJiYgbWFwcGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGV4dCBhdHRyaWJ1dGUgb3IgYSBtYXBwZXIgbXVzdCBiZSBzZXQgaWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNyYyBhbmQgZGVzdCBkaXJzIGFyZSB0aGUgc2FtZS4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGV4dCBhdHRyaWJ1dGUgb3IgYSBtYXBwZXIgbXVzdCBiZSBzZXQgaWYgc3JjIGFuZCBkZXN0IGRpcnMgYXJlIHRoZSBzYW1lLiIpOwogICAgICAgICB9CiAKLSAgICAgICAgRmlsZU5hbWVNYXBwZXIgbSA9IG51bGw7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIG07CiAgICAgICAgIGlmIChtYXBwZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbSA9IG5ldyBJZGVudGl0eU1hcHBlcigpOwpAQCAtMjc5LDggKzI4MCw3IEBACiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHdlJ3JlIG5vdCBhYm91dCB0byBjbG9iYmVyIHNvbWV0aGluZwogICAgICAgICBpZiAoc3JjRmlsZS5lcXVhbHMoZGVzdEZpbGUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgIiArIHNyY0ZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd291bGQgb3ZlcndyaXRlIGl0cyBzZWxmIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgJXMgd291bGQgb3ZlcndyaXRlIGl0c2VsZiIsIHNyY0ZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gTWFrZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMgaWYgbmVlZGVkCkBAIC0yOTEsOCArMjkxLDggQEAKIAogICAgICAgICAgICAgaWYgKCFwYXJlbnRGaWxlLmV4aXN0cygpCiAgICAgICAgICAgICAgICAgJiYgIShwYXJlbnRGaWxlLm1rZGlycygpIHx8IHBhcmVudEZpbGUuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhbm5vdCBjcmVhdGUgcGFyZW50IGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50TmFtZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjYW5ub3QgY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgJXMiLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMTcsMTggKzMxNywyMSBAQAogCiAgICAgcHJpdmF0ZSBjbGFzcyBFeHRNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIHMpIHsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgcykgewogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHsKICAgICAgICAgICAgIGludCBsYXN0RG90ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgIGlmIChsYXN0RG90ID49IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtmaWxlTmFtZS5zdWJzdHJpbmcoMCwgbGFzdERvdCkgKyBleHRlbnNpb259OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtmaWxlTmFtZSArIGV4dGVuc2lvbn07CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHtmaWxlTmFtZSArIGV4dGVuc2lvbn07CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OZXRSZXh4Qy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmV0UmV4eEMuamF2YQppbmRleCA1ZDdiOGIyLi4yNmI1ZTkxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OZXRSZXh4Qy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05ldFJleHhDLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMSArMjMsMTQgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG5ldHJleHgubGFuZy5SZXh4OwogCkBAIC0xNDIsOCArMTQ1LDggQEAKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19ERVBSRUNBVElPTiA9ICJoYXMgYmVlbiBkZXByZWNhdGVkIjsKIAogICAgIC8vIG90aGVyIGltcGxlbWVudGF0aW9uIHZhcmlhYmxlcwotICAgIHByaXZhdGUgVmVjdG9yIGNvbXBpbGVMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGZpbGVjb3B5TGlzdCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGNvbXBpbGVMaXN0ID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVjb3B5TGlzdCA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqCiAgICAgICogU2V0IHdoZXRoZXIgbGl0ZXJhbHMgYXJlIHRyZWF0ZWQgYXMgYmluYXJ5LCByYXRoZXIgdGhhbiBOZXRSZXh4IHR5cGVzLgpAQCAtMTU1LDcgKzE1OCw2IEBACiAgICAgICAgIHRoaXMuYmluYXJ5ID0gYmluYXJ5OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdXNlZCBmb3IgTmV0UmV4eCBjb21waWxhdGlvbi4KICAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlLgpAQCAtMTY0LDcgKzE2Niw2IEBACiAgICAgICAgIHRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHdoZXRoZXIgY29tbWVudHMgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBnZW5lcmF0ZWQgamF2YSBzb3VyY2UuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMTc1LDcgKzE3Niw2IEBACiAgICAgICAgIHRoaXMuY29tbWVudHMgPSBjb21tZW50czsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB3aGV0aGVyIGVycm9yIG1lc3NhZ2VzIGNvbWUgb3V0IGluIGNvbXBhY3Qgb3IgdmVyYm9zZSBmb3JtYXQuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMTg2LDcgKzE4Niw2IEBACiAgICAgICAgIHRoaXMuY29tcGFjdCA9IGNvbXBhY3Q7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciB0aGUgTmV0UmV4eCBjb21waWxlciBzaG91bGQgY29tcGlsZSB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZS4KICAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgInllcyIsICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCkBAIC0yMDEsNyArMjAwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHdoZXRoZXIgb3Igbm90IGNvbXBpbGVyIG1lc3NhZ2VzIHNob3VsZCBiZSBkaXNwbGF5ZWQgb24gdGhlICdjb25zb2xlJy4KICAgICAgKiBOb3RlIHRoYXQgdGhpcyB0YXNrIHdpbGwgcmVseSBvbiB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgZmlsdGVyaW5nIGNvbXBpbGUgbWVzc2FnZXMuCkBAIC0yMTMsNyArMjExLDYgQEAKICAgICAgICAgdGhpcy5jb25zb2xlID0gY29uc29sZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdmFyaWFibGUgY3Jvc3MgcmVmZXJlbmNlcyBhcmUgZ2VuZXJhdGVkLgogICAgICAqIFZhbGlkIHRydWUgdmFsdWVzIGFyZSAieWVzIiwgIm9uIiBvciAidHJ1ZSIuIEFueXRoaW5nIGVsc2Ugc2V0cyB0aGUgZmxhZyB0byBmYWxzZS4KQEAgLTIyNCw3ICsyMjEsNiBAQAogICAgICAgICB0aGlzLmNyb3NzcmVmID0gY3Jvc3NyZWY7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgd2hldGhlciBkZWNpbWFsIGFyaXRobWV0aWMgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBuZXRyZXh4IGNvZGUuCiAgICAgICogU2V0dGluZyB0aGlzIHRvIG9mZiB3aWxsIHJlcG9ydCBkZWNpbWFsIGFyaXRobWV0aWMgYXMgYW4gZXJyb3IsIGZvcgpAQCAtMjM3LDcgKzIzMyw2IEBACiAgICAgICAgIHRoaXMuZGVjaW1hbCA9IGRlY2ltYWw7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBpbnRvIHdoaWNoIHRoZSBOZXRSZXh4IHNvdXJjZSBmaWxlcwogICAgICAqIHNob3VsZCBiZSBjb3BpZWQgYW5kIHRoZW4gY29tcGlsZWQuCkBAIC0yNDcsNyArMjQyLDYgQEAKICAgICAgICAgZGVzdERpciA9IGRlc3REaXJOYW1lOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogV2hldGhlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21waWxlIGlzIGdlbmVyYXRlZAogICAgICAqIEBwYXJhbSBkaWFnIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCkBAIC0yNTYsNyArMjUwLDYgQEAKICAgICAgICAgdGhpcy5kaWFnID0gZGlhZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgd2hldGhlciB2YXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCBleHBsaWNpdGx5IGJlZm9yZSB1c2UuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMjY3LDcgKzI2MCw2IEBACiAgICAgICAgIHRoaXMuZXhwbGljaXQgPSBleHBsaWNpdDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIGdlbmVyYXRlZCBqYXZhIGNvZGUgaXMgZm9ybWF0dGVkIG5pY2VseSBvciBsZWZ0IHRvIG1hdGNoCiAgICAgICogTmV0UmV4eCBsaW5lIG51bWJlcnMgZm9yIGNhbGwgc3RhY2sgZGVidWdnaW5nLgpAQCAtMjc5LDcgKzI3MSw2IEBACiAgICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogV2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgY29kZSBpcyBwcm9kdWNlZC4KICAgICAgKiBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCkBAIC0yODksNyArMjgwLDYgQEAKICAgICAgICAgbG9nKCJUaGUgYXR0cmlidXRlIGphdmEgaXMgY3VycmVudGx5IHVudXNlZC4iLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGphdmEgc291cmNlIGZpbGUgc2hvdWxkIGJlIGtlcHQgYWZ0ZXIKICAgICAgKiBjb21waWxhdGlvbi4gVGhlIGdlbmVyYXRlZCBmaWxlcyB3aWxsIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5qYXZhLmtlZXAsCkBAIC0zMDMsNyArMjkzLDYgQEAKICAgICAgICAgdGhpcy5rZWVwID0ga2VlcDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIGNvbXBpbGVyIHRleHQgbG9nbyBpcyBkaXNwbGF5ZWQgd2hlbiBjb21waWxpbmcuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMzE0LDcgKzMwMyw2IEBACiAgICAgICAgIHRoaXMubG9nbyA9IGxvZ287CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSBnZW5lcmF0ZWQgLmphdmEgZmlsZSBzaG91bGQgYmUgcmVwbGFjZWQgd2hlbiBjb21waWxpbmcuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMzI1LDcgKzMxMyw2IEBACiAgICAgICAgIHRoaXMucmVwbGFjZSA9IHJlcGxhY2U7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIGNvbXBpbGVyIG1lc3NhZ2VzIHdpbGwgYmUgd3JpdHRlbiB0byBOZXRSZXh4Qy5sb2cgYXMKICAgICAgKiB3ZWxsIGFzIHRvIHRoZSBjb25zb2xlLgpAQCAtMzM3LDcgKzMyNCw2IEBACiAgICAgICAgIHRoaXMuc2F2ZWxvZyA9IHNhdmVsb2c7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlciB0byBzdG9yZSB0aGUgY2xhc3MgZmlsZXMgaW4gdGhlIHNhbWUKICAgICAgKiBkaXJlY3RvcnkgYXMgdGhlIHNvdXJjZSBmaWxlcy4gVGhlIGFsdGVybmF0aXZlIGlzIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KQEAgLTM0OSw3ICszMzUsNiBAQAogICAgICAgICB0aGlzLnNvdXJjZWRpciA9IHNvdXJjZWRpcjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgc291cmNlIGRpciB0byBmaW5kIHRoZSBzb3VyY2UgSmF2YSBmaWxlcy4KICAgICAgKiBAcGFyYW0gc3JjRGlyTmFtZSB0aGUgc291cmNlIGRpcmVjdG9yeS4KQEAgLTM1OCw3ICszNDMsNiBAQAogICAgICAgICBzcmNEaXIgPSBzcmNEaXJOYW1lOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCBtZXRob2QgY2FsbHMgYWx3YXlzIG5lZWQgcGFyZW50aGVzZXMsCiAgICAgICogZXZlbiBpZiBubyBhcmd1bWVudHMgYXJlIG5lZWRlZCwgZS5nLiA8Y29kZT5hU3RyaW5nVmFyLmdldEJ5dGVzPC9jb2RlPgpAQCAtMzcxLDcgKzM1NSw2IEBACiAgICAgICAgIHRoaXMuc3RyaWN0YXJncyA9IHN0cmljdGFyZ3M7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBUZWxscyB0aGUgTmV0UmV4eCBjb21waWxlIHRoYXQgYXNzaWdubWVudHMgbXVzdCBtYXRjaCBleGFjdGx5IG9uIHR5cGUuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtMzgyLDcgKzM2NSw2IEBACiAgICAgICAgIHRoaXMuc3RyaWN0YXNzaWduID0gc3RyaWN0YXNzaWduOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIE5ldFJleHggY29tcGlsZXIgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlIG9yIG5vdC4KICAgICAgKiBWYWxpZCB0cnVlIHZhbHVlcyBhcmUgInllcyIsICJvbiIgb3IgInRydWUiLiBBbnl0aGluZyBlbHNlIHNldHMgdGhlIGZsYWcgdG8gZmFsc2UuCkBAIC0zOTMsNyArMzc1LDYgQEAKICAgICAgICAgdGhpcy5zdHJpY3RjYXNlID0gc3RyaWN0Y2FzZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgd2hldGhlciBjbGFzc2VzIG5lZWQgdG8gYmUgaW1wb3J0ZWQgZXhwbGljaXRseSB1c2luZyBhbiA8Y29kZT5pbXBvcnQ8L2NvZGU+CiAgICAgICogc3RhdGVtZW50LiBCeSBkZWZhdWx0IHRoZSBOZXRSZXh4IGNvbXBpbGVyIHdpbGwgaW1wb3J0IGNlcnRhaW4gcGFja2FnZXMKQEAgLTQwNiw3ICszODcsNiBAQAogICAgICAgICB0aGlzLnN0cmljdGltcG9ydCA9IHN0cmljdGltcG9ydDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgd2hldGhlciBsb2NhbCBwcm9wZXJ0aWVzIG5lZWQgdG8gYmUgcXVhbGlmaWVkIGV4cGxpY2l0bHkgdXNpbmcKICAgICAgKiA8Y29kZT50aGlzPC9jb2RlPi4KQEAgLTQxOCw3ICszOTgsNiBAQAogICAgICAgICB0aGlzLnN0cmljdHByb3BzID0gc3RyaWN0cHJvcHM7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSBjb21waWxlciBzaG91bGQgZm9yY2UgY2F0Y2hpbmcgb2YgZXhjZXB0aW9ucyBieSBleHBsaWNpdGx5CiAgICAgICogbmFtZWQgdHlwZXMuCkBAIC00MzAsNyArNDA5LDYgQEAKICAgICAgICAgdGhpcy5zdHJpY3RzaWduYWwgPSBzdHJpY3RzaWduYWw7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHdoZXRoZXIgZGVidWcgc3ltYm9scyBzaG91bGQgYmUgZ2VuZXJhdGVkIGludG8gdGhlIGNsYXNzIGZpbGUuCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtNDQxLDcgKzQxOSw2IEBACiAgICAgICAgIHRoaXMuc3ltYm9scyA9IHN5bWJvbHM7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBc2tzIHRoZSBOZXRSZXh4IGNvbXBpbGVyIHRvIHByaW50IGNvbXBpbGF0aW9uIHRpbWVzIHRvIHRoZSBjb25zb2xlCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtNDcwLDEyICs0NDcsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUcmFjZShTdHJpbmcgdHJhY2UpIHsKICAgICAgICAgVHJhY2VBdHRyIHQgPSBuZXcgVHJhY2VBdHRyKCk7Ci0KICAgICAgICAgdC5zZXRWYWx1ZSh0cmFjZSk7CiAgICAgICAgIHNldFRyYWNlKHQpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGVsbHMgdGhlIE5ldFJleHggY29tcGlsZXIgdGhhdCB0aGUgc291cmNlIGlzIGluIFVURjguCiAgICAgICogVmFsaWQgdHJ1ZSB2YWx1ZXMgYXJlICJ5ZXMiLCAib24iIG9yICJ0cnVlIi4gQW55dGhpbmcgZWxzZSBzZXRzIHRoZSBmbGFnIHRvIGZhbHNlLgpAQCAtNDg2LDcgKzQ2MSw2IEBACiAgICAgICAgIHRoaXMudXRmOCA9IHV0Zjg7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBXaGV0aGVyIGxvdHMgb2Ygd2FybmluZ3MgYW5kIGVycm9yIG1lc3NhZ2VzIHNob3VsZCBiZSBnZW5lcmF0ZWQKICAgICAgKiBAcGFyYW0gdmVyYm9zZSB0aGUgdmFsdWUgdG8gc2V0IC0gdmVyYm9zZSZsdDtsZXZlbCZndDsgb3Igbm92ZXJib3NlLgpAQCAtNDk1LDE0ICs0NjksMTIgQEAKICAgICAgICAgdGhpcy52ZXJib3NlID0gdmVyYm9zZS5nZXRWYWx1ZSgpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogV2hldGhlciBsb3RzIG9mIHdhcm5pbmdzIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgZ2VuZXJhdGVkCiAgICAgICogQHBhcmFtIHZlcmJvc2UgdGhlIHZhbHVlIHRvIHNldCAtIHZlcmJvc2UmbHQ7bGV2ZWwmZ3Q7IG9yIG5vdmVyYm9zZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRWZXJib3NlKFN0cmluZyB2ZXJib3NlKSB7CiAgICAgICAgIFZlcmJvc2VBdHRyIHYgPSBuZXcgVmVyYm9zZUF0dHIoKTsKLQogICAgICAgICB2LnNldFZhbHVlKHZlcmJvc2UpOwogICAgICAgICBzZXRWZXJib3NlKHYpOwogICAgIH0KQEAgLTUxNyw3ICs0ODksNiBAQAogICAgICAgICB0aGlzLnN1cHByZXNzTWV0aG9kQXJndW1lbnROb3RVc2VkID0gc3VwcHJlc3NNZXRob2RBcmd1bWVudE5vdFVzZWQ7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSB0YXNrIHNob3VsZCBzdXBwcmVzcyB0aGUgIlByaXZhdGUgcHJvcGVydHkgaXMgZGVmaW5lZCBidXQKICAgICAgKiBub3QgdXNlZCIgaW4gc3RyaWN0YXJncy1Nb2RlLCB3aGljaCBjYW4gYmUgcXVpdGUgYW5ub3lpbmcgd2hpbGUKQEAgLTUyOCw3ICs0OTksNiBAQAogICAgICAgICB0aGlzLnN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZCA9IHN1cHByZXNzUHJpdmF0ZVByb3BlcnR5Tm90VXNlZDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIHRhc2sgc2hvdWxkIHN1cHByZXNzIHRoZSAiVmFyaWFibGUgaXMgc2V0IGJ1dCBub3QgdXNlZCIgaW4KICAgICAgKiBzdHJpY3RhcmdzLU1vZGUuIEJlIGNhcmVmdWwgd2l0aCB0aGlzIG9uZSEgVGhlIHdhcm5pbmcgaXMgbG9nZ2VkIGFzCkBAIC01MzksNyArNTA5LDYgQEAKICAgICAgICAgdGhpcy5zdXBwcmVzc1ZhcmlhYmxlTm90VXNlZCA9IHN1cHByZXNzVmFyaWFibGVOb3RVc2VkOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogV2hldGhlciB0aGUgdGFzayBzaG91bGQgc3VwcHJlc3MgdGhlICJGb29FeGNlcHRpb24gaXMgaW4gU0lHTkFMUyBsaXN0CiAgICAgICogYnV0IGlzIG5vdCBzaWduYWxsZWQgd2l0aGluIHRoZSBtZXRob2QiLCB3aGljaCBpcyBzb21ldGltZXMgcmF0aGVyCkBAIC01NTAsNyArNTE5LDYgQEAKICAgICAgICAgdGhpcy5zdXBwcmVzc0V4Y2VwdGlvbk5vdFNpZ25hbGxlZCA9IHN1cHByZXNzRXhjZXB0aW9uTm90U2lnbmFsbGVkOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGVsbHMgd2hldGhlciB3ZSBzaG91bGQgZmlsdGVyIG91dCBhbnkgZGVwcmVjYXRpb24tbWVzc2FnZXMKICAgICAgKiBvZiB0aGUgY29tcGlsZXIgb3V0LgpAQCAtNTYwLDcgKzUyOCw2IEBACiAgICAgICAgIHRoaXMuc3VwcHJlc3NEZXByZWNhdGlvbiA9IHN1cHByZXNzRGVwcmVjYXRpb247CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBUZWxscyB3aGV0aGVyIHRoZSB0cmFpbGluZyAua2VlcCBpbiBub2NvbXBpbGUtbW9kZSBzaG91bGQgYmUgcmVtb3ZlZAogICAgICAqIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBqYXZhIHNvdXJjZSByZWFsbHkgZW5kcyBvbiAuamF2YS4KQEAgLTU3MSwxMiArNTM4LDEyIEBACiAgICAgICAgIHRoaXMucmVtb3ZlS2VlcEV4dGVuc2lvbiA9IHJlbW92ZUtlZXBFeHRlbnNpb247CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBpbml0LU1ldGhvZCBzZXRzIGRlZmF1bHRzIGZyb20gUHJvcGVydGllcy4gVGhhdCB3YXksIHdoZW4gYW50IGlzIGNhbGxlZAogICAgICAqIHdpdGggYXJndW1lbnRzIGxpa2UgLURhbnQubmV0cmV4eGMudmVyYm9zZT12ZXJib3NlNSBvbmUgY2FuIGVhc2lseSB0YWtlCiAgICAgICogY29udHJvbCBvZiBhbGwgbmV0cmV4eGMtdGFza3MuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKICAgICAgICAgU3RyaW5nIHA7CiAKQEAgLTY4MSwxMSArNjQ4LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrIC0gcGVyZm9ybXMgdGhlIGFjdHVhbCBjb21waWxlciBjYWxsLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gZmlyc3Qgb2ZmLCBtYWtlIHN1cmUgdGhhdCB3ZSd2ZSBnb3QgYSBzcmNkaXIgYW5kIGRlc3RkaXIKQEAgLTY5NSwxOCArNjYyLDE1IEBACiAKICAgICAgICAgLy8gc2NhbiBzb3VyY2UgYW5kIGRlc3QgZGlycyB0byBidWlsZCB1cCBib3RoIGNvcHkgbGlzdHMgYW5kCiAgICAgICAgIC8vIGNvbXBpbGUgbGlzdHMKLSAgICAgICAgLy8gICAgICAgIHNjYW5EaXIoc3JjRGlyLCBkZXN0RGlyKTsKICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoc3JjRGlyKTsKIAotICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLQotICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdERpciwgZmlsZXMpOworICAgICAgICBzY2FuRGlyKHNyY0RpciwgZGVzdERpciwgZHMuZ2V0SW5jbHVkZWRGaWxlcygpKTsKIAogICAgICAgICAvLyBjb3B5IHRoZSBzb3VyY2UgYW5kIHN1cHBvcnQgZmlsZXMKICAgICAgICAgY29weUZpbGVzVG9EZXN0aW5hdGlvbigpOwogCiAgICAgICAgIC8vIGNvbXBpbGUgdGhlIHNvdXJjZSBmaWxlcwotICAgICAgICBpZiAoY29tcGlsZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIWNvbXBpbGVMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nKCJDb21waWxpbmcgIiArIGNvbXBpbGVMaXN0LnNpemUoKSArICIgc291cmNlIGZpbGUiCiAgICAgICAgICAgICAgICAgICsgKGNvbXBpbGVMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCiAgICAgICAgICAgICAgICAgICsgIiB0byAiICsgZGVzdERpcik7CkBAIC03MTcsMTYgKzY4MSwxNCBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTY2FucyB0aGUgZGlyZWN0b3J5IGxvb2tpbmcgZm9yIHNvdXJjZSBmaWxlcyB0byBiZSBjb21waWxlZCBhbmQgc3VwcG9ydAogICAgICAqIGZpbGVzIHRvIGJlIGNvcGllZC4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc2NhbkRpcihGaWxlIHNyY0RpciwgRmlsZSBkZXN0RGlyLCBTdHJpbmdbXSBmaWxlcykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmNEaXIsIGZpbGVzW2ldKTsKLSAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCBmaWxlc1tpXSk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsKKyAgICAgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBmaWxlcykgeworICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlbmFtZSk7CisgICAgICAgICAgICBGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoZGVzdERpciwgZmlsZW5hbWUpOwogICAgICAgICAgICAgLy8gaWYgaXQncyBhIG5vbiBzb3VyY2UgZmlsZSwgY29weSBpdCBpZiBhIGxhdGVyIGRhdGUgdGhhbiB0aGUKICAgICAgICAgICAgIC8vIGRlc3QKICAgICAgICAgICAgIC8vIGlmIGl0J3MgYSBzb3VyY2UgZmlsZSwgc2VlIGlmIHRoZSBkZXN0aW5hdGlvbiBjbGFzcyBmaWxlCkBAIC03NDksMTEyICs3MTEsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgZmlsZWNvcHlMaXN0LnB1dChzcmNGaWxlLmdldEFic29sdXRlUGF0aCgpLCBkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVMaXN0LmFkZEVsZW1lbnQoZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBkZXN0RmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBmaWxlY29weUxpc3QucHV0KHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBkZXN0RmlsZS5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbGVjb3B5TGlzdC5wdXQoc3JjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKiogQ29weSBlbGlnaWJsZSBmaWxlcyBmcm9tIHRoZSBzcmNEaXIgdG8gZGVzdERpciAgKi8KICAgICBwcml2YXRlIHZvaWQgY29weUZpbGVzVG9EZXN0aW5hdGlvbigpIHsKLSAgICAgICAgaWYgKGZpbGVjb3B5TGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghZmlsZWNvcHlMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nKCJDb3B5aW5nICIgKyBmaWxlY29weUxpc3Quc2l6ZSgpICsgIiBmaWxlIgogICAgICAgICAgICAgICAgICArIChmaWxlY29weUxpc3Quc2l6ZSgpID09IDEgPyAiIiA6ICJzIikKICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyBkZXN0RGlyLmdldEFic29sdXRlUGF0aCgpKTsKIAotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGZpbGVjb3B5TGlzdC5rZXlzKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZyb21GaWxlID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyB0b0ZpbGUgPSAoU3RyaW5nKSBmaWxlY29weUxpc3QuZ2V0KGZyb21GaWxlKTsKLQorICAgICAgICAgICAgZmlsZWNvcHlMaXN0LmZvckVhY2goKGZyb21GaWxlLCB0b0ZpbGUpIC0+IHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuY29weUZpbGUoZnJvbUZpbGUsIHRvRmlsZSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIHRvIGNvcHkgIiArIGZyb21GaWxlICsgIiB0byAiICsgdG9GaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjb3B5ICIgKyBmcm9tRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRvICIgKyB0b0ZpbGUgKyAiIGR1ZSB0byAiICsgaW9lLmdldE1lc3NhZ2UoKSwgaW9lKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmVuYW1lIC5qYXZhLmtlZXAgZmlsZXMgKGJhY2spIHRvIC5qYXZhLiBUaGUgbmV0cmV4eGMgcmVuYW1lcyBhbGwKICAgICAgKiAuamF2YSBmaWxlcyB0byAuamF2YS5rZWVwIGlmIGVpdGhlciAta2VlcCBvciAtbm9jb21waWxlIG9wdGlvbiBpcyBzZXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUtlZXBFeHRlbnNpb25zKCkgewotICAgICAgICBpZiAoY29tcGlsZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIWNvbXBpbGVMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nKCJSZW1vdmluZyAua2VlcCBleHRlbnNpb24gb24gIiArIGNvbXBpbGVMaXN0LnNpemUoKSArICIgZmlsZSIKICAgICAgICAgICAgICAgICAgKyAoY29tcGlsZUxpc3Quc2l6ZSgpID09IDEgPyAiIiA6ICJzIikpOwotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGNvbXBpbGVMaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBucnhOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9IG5yeE5hbWUuc3Vic3RyaW5nKDAsIG5yeE5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgICAgICAgICBjb21waWxlTGlzdC5mb3JFYWNoKG5yeE5hbWUgLT4geworICAgICAgICAgICAgICAgIFN0cmluZyBiYXNlTmFtZSA9CisgICAgICAgICAgICAgICAgICAgIG5yeE5hbWUuc3Vic3RyaW5nKDAsIG5yeE5hbWUubGFzdEluZGV4T2YoJy4nKSk7CiAgICAgICAgICAgICAgICAgRmlsZSBmcm9tRmlsZSA9IG5ldyBGaWxlKGJhc2VOYW1lICsgIi5qYXZhLmtlZXAiKTsKICAgICAgICAgICAgICAgICBGaWxlIHRvRmlsZSA9IG5ldyBGaWxlKGJhc2VOYW1lICsgIi5qYXZhIik7CiAgICAgICAgICAgICAgICAgaWYgKGZyb21GaWxlLnJlbmFtZVRvKHRvRmlsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJTdWNjZXNzZnVsbHkgcmVuYW1lZCAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICBsb2coIlN1Y2Nlc3NmdWxseSByZW5hbWVkICIgKyBmcm9tRmlsZSArICIgdG8gIiArIHRvRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHJlbmFtZSAiICsgZnJvbUZpbGUgKyAiIHRvICIgKyB0b0ZpbGUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKiogUGVyZm9ybXMgYSBjb21waWxlIHVzaW5nIHRoZSBOZXRSZXh4IDEuMS54IGNvbXBpbGVyICAqLwogICAgIHByaXZhdGUgdm9pZCBkb05ldFJleHhDb21waWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgbG9nKCJVc2luZyBOZXRSZXh4IGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKICAgICAgICAgU3RyaW5nIGNsYXNzcGF0aCA9IGdldENvbXBpbGVDbGFzc3BhdGgoKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGNvbXBpbGVPcHRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogCiAgICAgICAgIC8vIGNyZWF0ZSBhbiBhcnJheSBvZiBzdHJpbmdzIGZvciBpbnB1dCB0byB0aGUgY29tcGlsZXI6IG9uZSBhcnJheQogICAgICAgICAvLyBjb21lcyBmcm9tIHRoZSBjb21waWxlIG9wdGlvbnMsIHRoZSBvdGhlciBmcm9tIHRoZSBjb21waWxlTGlzdAogICAgICAgICBTdHJpbmdbXSBjb21waWxlT3B0aW9uc0FycmF5ID0gZ2V0Q29tcGlsZU9wdGlvbnNBc0FycmF5KCk7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVMaXN0QXJyYXkgPSBuZXcgU3RyaW5nW2NvbXBpbGVMaXN0LnNpemUoKV07Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBjb21waWxlTGlzdC5lbGVtZW50cygpOwotICAgICAgICBpbnQgaiA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGZpbGVMaXN0QXJyYXlbal0gPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY3JlYXRlIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cyBmb3IgdGhlIGNvbXBpbGVyCi0gICAgICAgIFN0cmluZ1tdIGNvbXBpbGVBcmdzID0gbmV3IFN0cmluZ1tjb21waWxlT3B0aW9uc0FycmF5Lmxlbmd0aCArIGZpbGVMaXN0QXJyYXkubGVuZ3RoXTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBpbGVPcHRpb25zQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXBpbGVBcmdzW2ldID0gY29tcGlsZU9wdGlvbnNBcnJheVtpXTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGNvbXBpbGVBcmdzW2kgKyBjb21waWxlT3B0aW9uc0FycmF5Lmxlbmd0aF0gPSBmaWxlTGlzdEFycmF5W2ldOwotICAgICAgICB9CiAKICAgICAgICAgLy8gcHJpbnQgbmljZSBvdXRwdXQgYWJvdXQgd2hhdCB3ZSBhcmUgZG9pbmcgZm9yIHRoZSBsb2cKLSAgICAgICAgY29tcGlsZU9wdGlvbnMuYXBwZW5kKCJDb21waWxhdGlvbiBhcmdzOiAiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21waWxlT3B0aW9uc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBjb21waWxlT3B0aW9ucy5hcHBlbmQoY29tcGlsZU9wdGlvbnNBcnJheVtpXSk7Ci0gICAgICAgICAgICBjb21waWxlT3B0aW9ucy5hcHBlbmQoIiAiKTsKLSAgICAgICAgfQotICAgICAgICBsb2coY29tcGlsZU9wdGlvbnMudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIGxvZyhTdHJlYW0ub2YoY29tcGlsZU9wdGlvbnNBcnJheSkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiICIsICJDb21waWxhdGlvbiBhcmdzOiAiLCAiIikpLAorICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgU3RyaW5nIGVvbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG5pY2VTb3VyY2VMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsZXMgdG8gYmUgY29tcGlsZWQ6IiArIGVvbCk7CisgICAgICAgIGxvZygiRmlsZXMgdG8gYmUgY29tcGlsZWQ6IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBjb21waWxlTGlzdC5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChjb21waWxlTGlzdC5lbGVtZW50QXQoaSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoZW9sKTsKLSAgICAgICAgfQorICAgICAgICBsb2coY29tcGlsZUxpc3Quc3RyZWFtKCkubWFwKHMgLT4gU3RyaW5nLmZvcm1hdCgiICAgICVzJW4iLCBzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiIikpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAotICAgICAgICBsb2cobmljZVNvdXJjZUxpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHNpbmdsZSBhcnJheSBvZiBhcmd1bWVudHMgZm9yIHRoZSBjb21waWxlcgorICAgICAgICBTdHJpbmdbXSBjb21waWxlQXJncyA9CisgICAgICAgICAgICAgICAgU3RyZWFtLmNvbmNhdChTdHJlYW0ub2YoY29tcGlsZU9wdGlvbnNBcnJheSksIGNvbXBpbGVMaXN0LnN0cmVhbSgpKQorICAgICAgICAgICAgICAgIC50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogCiAgICAgICAgIC8vIG5lZWQgdG8gc2V0IGphdmEuY2xhc3MucGF0aCBwcm9wZXJ0eSBhbmQgcmVzdG9yZSBpdCBsYXRlcgogICAgICAgICAvLyBzaW5jZSB0aGUgTmV0UmV4eCBjb21waWxlciBoYXMgbm8gb3B0aW9uIGZvciB0aGUgY2xhc3NwYXRoCkBAIC04NjUsNyArNzkyLDcgQEAKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nV3JpdGVyIG91dCA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIFByaW50V3JpdGVyIHcgPSBudWxsOworICAgICAgICAgICAgUHJpbnRXcml0ZXIgdzsKICAgICAgICAgICAgIGludCByYyA9CiAgICAgICAgICAgICAgICAgQ09NLmlibS5uZXRyZXh4LnByb2Nlc3MuTmV0UmV4eEMubWFpbihuZXcgUmV4eChjb21waWxlQXJncyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gbmV3IFByaW50V3JpdGVyKG91dCkpOyAvL05PU09OQVIKQEAgLTg3MywxNyArODAwLDE4IEBACiAgICAgICAgICAgICBTdHJpbmcgZGRpciA9IGRlc3REaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICBib29sZWFuIGRvUmVwbGFjZSA9ICEoc2Rpci5lcXVhbHMoZGRpcikpOwogICAgICAgICAgICAgaW50IGRsZW4gPSBkZGlyLmxlbmd0aCgpOwotICAgICAgICAgICAgU3RyaW5nIGw7CiAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKG91dC50b1N0cmluZygpKSk7CiAKICAgICAgICAgICAgIGxvZygicmVwbGFjaW5nIGRlc3RkaXIgJyIgKyBkZGlyICsgIicgdGhyb3VnaCBzb3VyY2VkaXIgJyIKICAgICAgICAgICAgICAgICArIHNkaXIgKyAiJyIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICBTdHJpbmcgbDsKICAgICAgICAgICAgIHdoaWxlICgobCA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpbnQgaWR4OwogCiAgICAgICAgICAgICAgICAgd2hpbGUgKGRvUmVwbGFjZSAmJiAoKGlkeCA9IGwuaW5kZXhPZihkZGlyKSkgIT0gLTEpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHBhdGggaXMgbWVudGlvbmVkIGluIHRoZSBtZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIGwgPSAobmV3IFN0cmluZ0J1ZmZlcihsKSkucmVwbGFjZShpZHgsIGlkeCArIGRsZW4sIHNkaXIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGwgPSBuZXcgU3RyaW5nQnVpbGRlcihsKS5yZXBsYWNlKGlkeCwgaWR4ICsgZGxlbiwgc2RpcikudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gdmVyYm9zZSBsZXZlbCBsb2dnaW5nIGZvciBzdXBwcmVzc2VkIG1lc3NhZ2VzCiAgICAgICAgICAgICAgICAgaWYgKHN1cHByZXNzTWV0aG9kQXJndW1lbnROb3RVc2VkCkBAIC05MTIsMjggKzg0MCwyNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChyYyA+IDEpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvbXBpbGUgZmFpbGVkLCBtZXNzYWdlcyBzaG91bGQgIgotICAgICAgICAgICAgICAgICAgICArICJoYXZlIGJlZW4gcHJvdmlkZWQuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiQ29tcGlsZSBmYWlsZWQsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gcHJvdmlkZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAody5jaGVja0Vycm9yKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkVuY291bnRlcmVkIGFuIGVycm9yIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmV4cGVjdGVkIElPRXhjZXB0aW9uIHdoaWxlICIKLSAgICAgICAgICAgICAgICArICJwbGF5aW5nIHdpdGggU3RyaW5ncyIsIGlvZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgSU9FeGNlcHRpb24gd2hpbGUgcGxheWluZyB3aXRoIFN0cmluZ3MiLCBpb2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgLy8gbmVlZCB0byByZXNldCBqYXZhLmNsYXNzLnBhdGggcHJvcGVydHkKICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBOZXRSZXh4IGNvbXBpbGVyIGhhcyBubyBvcHRpb24gZm9yIHRoZSBjbGFzc3BhdGgKICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0aWVzLnB1dCgiamF2YS5jbGFzcy5wYXRoIiwgY3VycmVudENsYXNzUGF0aCk7CiAgICAgICAgIH0KLQogICAgIH0KIAotCiAgICAgLyoqIEJ1aWxkcyB0aGUgY29tcGlsYXRpb24gY2xhc3NwYXRoLiAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXRDb21waWxlQ2xhc3NwYXRoKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgY2xhc3NwYXRoID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGNsYXNzcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKICAgICAgICAgLy8gYWRkIGRlc3QgZGlyIHRvIGNsYXNzcGF0aCBzbyB0aGF0IHByZXZpb3VzbHkgY29tcGlsZWQgYW5kCiAgICAgICAgIC8vIHVudG91Y2hlZCBjbGFzc2VzIGFyZSBvbiBjbGFzc3BhdGgKQEAgLTk0NSw0OSArODcxLDQzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBhZGQgdGhlIHN5c3RlbSBjbGFzc3BhdGgKLSAgICAgICAgLy8gYWRkRXhpc3RpbmdUb0NsYXNzcGF0aChjbGFzc3BhdGgsU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7CiAgICAgICAgIHJldHVybiBjbGFzc3BhdGgudG9TdHJpbmcoKTsKICAgICB9CiAKLQogICAgIC8qKiBUaGlzICAqLwogICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0Q29tcGlsZU9wdGlvbnNBc0FycmF5KCkgewotICAgICAgICBWZWN0b3Igb3B0aW9ucyA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG9wdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoYmluYXJ5ID8gIi1iaW5hcnkiIDogIi1ub2JpbmFyeSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tbWVudHMgPyAiLWNvbW1lbnRzIiA6ICItbm9jb21tZW50cyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tcGlsZSA/ICItY29tcGlsZSIgOiAiLW5vY29tcGlsZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29tcGFjdCA/ICItY29tcGFjdCIgOiAiLW5vY29tcGFjdCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY29uc29sZSA/ICItY29uc29sZSIgOiAiLW5vY29uc29sZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoY3Jvc3NyZWYgPyAiLWNyb3NzcmVmIiA6ICItbm9jcm9zc3JlZiIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZGVjaW1hbCA/ICItZGVjaW1hbCIgOiAiLW5vZGVjaW1hbCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZGlhZyA/ICItZGlhZyIgOiAiLW5vZGlhZyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZXhwbGljaXQgPyAiLWV4cGxpY2l0IiA6ICItbm9leHBsaWNpdCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoZm9ybWF0ID8gIi1mb3JtYXQiIDogIi1ub2Zvcm1hdCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoa2VlcCA/ICIta2VlcCIgOiAiLW5va2VlcCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQobG9nbyA/ICItbG9nbyIgOiAiLW5vbG9nbyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQocmVwbGFjZSA/ICItcmVwbGFjZSIgOiAiLW5vcmVwbGFjZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc2F2ZWxvZyA/ICItc2F2ZWxvZyIgOiAiLW5vc2F2ZWxvZyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc291cmNlZGlyID8gIi1zb3VyY2VkaXIiIDogIi1ub3NvdXJjZWRpciIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0YXJncyA/ICItc3RyaWN0YXJncyIgOiAiLW5vc3RyaWN0YXJncyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0YXNzaWduID8gIi1zdHJpY3Rhc3NpZ24iIDogIi1ub3N0cmljdGFzc2lnbiIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0Y2FzZSA/ICItc3RyaWN0Y2FzZSIgOiAiLW5vc3RyaWN0Y2FzZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0aW1wb3J0ID8gIi1zdHJpY3RpbXBvcnQiIDogIi1ub3N0cmljdGltcG9ydCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0cHJvcHMgPyAiLXN0cmljdHByb3BzIiA6ICItbm9zdHJpY3Rwcm9wcyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3RyaWN0c2lnbmFsID8gIi1zdHJpY3RzaWduYWwiIDogIi1ub3N0cmljdHNpZ25hbCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoc3ltYm9scyA/ICItc3ltYm9scyIgOiAiLW5vc3ltYm9scyIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQodGltZSA/ICItdGltZSIgOiAiLW5vdGltZSIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoIi0iICsgdHJhY2UpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQodXRmOCA/ICItdXRmOCIgOiAiLW5vdXRmOCIpOwotICAgICAgICBvcHRpb25zLmFkZEVsZW1lbnQoIi0iICsgdmVyYm9zZSk7CisgICAgICAgIG9wdGlvbnMuYWRkKGJpbmFyeSA/ICItYmluYXJ5IiA6ICItbm9iaW5hcnkiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoY29tbWVudHMgPyAiLWNvbW1lbnRzIiA6ICItbm9jb21tZW50cyIpOworICAgICAgICBvcHRpb25zLmFkZChjb21waWxlID8gIi1jb21waWxlIiA6ICItbm9jb21waWxlIik7CisgICAgICAgIG9wdGlvbnMuYWRkKGNvbXBhY3QgPyAiLWNvbXBhY3QiIDogIi1ub2NvbXBhY3QiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoY29uc29sZSA/ICItY29uc29sZSIgOiAiLW5vY29uc29sZSIpOworICAgICAgICBvcHRpb25zLmFkZChjcm9zc3JlZiA/ICItY3Jvc3NyZWYiIDogIi1ub2Nyb3NzcmVmIik7CisgICAgICAgIG9wdGlvbnMuYWRkKGRlY2ltYWwgPyAiLWRlY2ltYWwiIDogIi1ub2RlY2ltYWwiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoZGlhZyA/ICItZGlhZyIgOiAiLW5vZGlhZyIpOworICAgICAgICBvcHRpb25zLmFkZChleHBsaWNpdCA/ICItZXhwbGljaXQiIDogIi1ub2V4cGxpY2l0Iik7CisgICAgICAgIG9wdGlvbnMuYWRkKGZvcm1hdCA/ICItZm9ybWF0IiA6ICItbm9mb3JtYXQiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoa2VlcCA/ICIta2VlcCIgOiAiLW5va2VlcCIpOworICAgICAgICBvcHRpb25zLmFkZChsb2dvID8gIi1sb2dvIiA6ICItbm9sb2dvIik7CisgICAgICAgIG9wdGlvbnMuYWRkKHJlcGxhY2UgPyAiLXJlcGxhY2UiIDogIi1ub3JlcGxhY2UiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoc2F2ZWxvZyA/ICItc2F2ZWxvZyIgOiAiLW5vc2F2ZWxvZyIpOworICAgICAgICBvcHRpb25zLmFkZChzb3VyY2VkaXIgPyAiLXNvdXJjZWRpciIgOiAiLW5vc291cmNlZGlyIik7CisgICAgICAgIG9wdGlvbnMuYWRkKHN0cmljdGFyZ3MgPyAiLXN0cmljdGFyZ3MiIDogIi1ub3N0cmljdGFyZ3MiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoc3RyaWN0YXNzaWduID8gIi1zdHJpY3Rhc3NpZ24iIDogIi1ub3N0cmljdGFzc2lnbiIpOworICAgICAgICBvcHRpb25zLmFkZChzdHJpY3RjYXNlID8gIi1zdHJpY3RjYXNlIiA6ICItbm9zdHJpY3RjYXNlIik7CisgICAgICAgIG9wdGlvbnMuYWRkKHN0cmljdGltcG9ydCA/ICItc3RyaWN0aW1wb3J0IiA6ICItbm9zdHJpY3RpbXBvcnQiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoc3RyaWN0cHJvcHMgPyAiLXN0cmljdHByb3BzIiA6ICItbm9zdHJpY3Rwcm9wcyIpOworICAgICAgICBvcHRpb25zLmFkZChzdHJpY3RzaWduYWwgPyAiLXN0cmljdHNpZ25hbCIgOiAiLW5vc3RyaWN0c2lnbmFsIik7CisgICAgICAgIG9wdGlvbnMuYWRkKHN5bWJvbHMgPyAiLXN5bWJvbHMiIDogIi1ub3N5bWJvbHMiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQodGltZSA/ICItdGltZSIgOiAiLW5vdGltZSIpOworICAgICAgICBvcHRpb25zLmFkZCgiLSIgKyB0cmFjZSk7CisgICAgICAgIG9wdGlvbnMuYWRkKHV0ZjggPyAiLXV0ZjgiIDogIi1ub3V0ZjgiKTsKKyAgICAgICAgb3B0aW9ucy5hZGQoIi0iICsgdmVyYm9zZSk7CiAKLSAgICAgICAgU3RyaW5nW10gcmVzdWx0cyA9IG5ldyBTdHJpbmdbb3B0aW9ucy5zaXplKCldOwotCi0gICAgICAgIG9wdGlvbnMuY29weUludG8ocmVzdWx0cyk7Ci0gICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICByZXR1cm4gb3B0aW9ucy50b0FycmF5KG5ldyBTdHJpbmdbb3B0aW9ucy5zaXplKCldKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFRha2VzIGEgY2xhc3NwYXRoLWxpa2Ugc3RyaW5nLCBhbmQgYWRkcyBlYWNoIGVsZW1lbnQgb2YgdGhpcyBzdHJpbmcgdG8KICAgICAgKiBhIG5ldyBjbGFzc3BhdGgsIGlmIHRoZSBjb21wb25lbnRzIGV4aXN0LiBDb21wb25lbnRzIHRoYXQgZG9uJ3QgZXhpc3QsCkBAIC05OTgsOSArOTE4LDkgQEAKICAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gdGFyZ2V0IGNsYXNzcGF0aAogICAgICAqIEBwYXJhbSBzb3VyY2UgLSBzb3VyY2UgY2xhc3NwYXRoIHRvIGdldCBmaWxlIG9iamVjdHMuCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEV4aXN0aW5nVG9DbGFzc3BhdGgoU3RyaW5nQnVmZmVyIHRhcmdldCwgU3RyaW5nIHNvdXJjZSkgeworICAgIHByaXZhdGUgdm9pZCBhZGRFeGlzdGluZ1RvQ2xhc3NwYXRoKFN0cmluZ0J1aWxkZXIgdGFyZ2V0LCBTdHJpbmcgc291cmNlKSB7CiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNvdXJjZSwKLSAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgicGF0aC5zZXBhcmF0b3IiKSwgZmFsc2UpOworICAgICAgICAgICAgRmlsZS5wYXRoU2VwYXJhdG9yLCBmYWxzZSk7CiAKICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgIEZpbGUgZiA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZSh0b2submV4dFRva2VuKCkpOwpAQCAtMTAxMywxNSArOTMzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRW51bWVyYXRlZCBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0cmFjZSBhdHRyaWJ1dGUuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmFjZUF0dHIgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InRyYWNlIiwgInRyYWNlMSIsICJ0cmFjZTIiLCAibm90cmFjZSJ9OwogICAgICAgICB9CkBAIC0xMDMyLDkgKzk1MSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmVyYm9zZUF0dHIgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InZlcmJvc2UiLCAidmVyYm9zZTAiLCAidmVyYm9zZTEiLCAidmVyYm9zZTIiLAotICAgICAgICAgICAgICAgICAgICAidmVyYm9zZTMiLCAidmVyYm9zZTQiLCAidmVyYm9zZTUiLCAibm92ZXJib3NlIn07CisgICAgICAgICAgICAgICAgInZlcmJvc2UzIiwgInZlcmJvc2U0IiwgInZlcmJvc2U1IiwgIm5vdmVyYm9zZSJ9OwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQppbmRleCA3MWYyODQxLi43YzI0Yzk0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDE3ICsyMSwxNiBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudGV4dC5EYXRlRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CkBAIC0xNDcsNyArMTQ2LDcgQEAKICAgICBwcml2YXRlIEZpbGUgICAgICAgICAgICAgICAgcHJvcGVydHlmaWxlOwogICAgIHByaXZhdGUgYm9vbGVhbiAgICAgICAgICAgICB1c2VKREtQcm9wZXJ0aWVzOwogCi0gICAgcHJpdmF0ZSBWZWN0b3IgZW50cmllcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIFZlY3RvcjxFbnRyeT4gZW50cmllcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICoKQEAgLTE4MiwxMCArMTgxLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZU9wZXJhdGlvbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBlbnRyeS5leGVjdXRlT24ocHJvcGVydGllcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZW50cmllcy5mb3JFYWNoKGUgLT4gZS5leGVjdXRlT24ocHJvcGVydGllcykpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCByZWFkRmlsZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CkBAIC0yMDAsMjcgKzE5NiwxNiBAQAogICAgICAgICAgICAgaWYgKHByb3BlcnR5ZmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIGxvZygiVXBkYXRpbmcgcHJvcGVydHkgZmlsZTogIgogICAgICAgICAgICAgICAgICAgICArIHByb3BlcnR5ZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwcm9wZXJ0eWZpbGUpOwotICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZpcyk7CisgICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBmaXMgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShwcm9wZXJ0eWZpbGUudG9QYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShmaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChiaXMpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcgbmV3IHByb3BlcnR5IGZpbGU6ICIKICAgICAgICAgICAgICAgICAgICAgKyBwcm9wZXJ0eWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wZXJ0eWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgIHRyeSAoT3V0cHV0U3RyZWFtIG91dCA9CisgICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ocHJvcGVydHlmaWxlLnRvUGF0aCgpKSkgewogICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKQEAgLTI2OSwxMyArMjU0LDggQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih4LCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocHJvcGVydHlmaWxlKTsgLy9OT1NPTkFSCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG9zLndyaXRlKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvcyA9IEZpbGVzLm5ld091dHB1dFN0cmVhbShwcm9wZXJ0eWZpbGUudG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgb3Mud3JpdGUoYmFvcy50b0J5dGVBcnJheSgpKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsgLy8gcG9zc2libHkgY29ycnVwdAogICAgICAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50cnlIYXJkVG9EZWxldGUocHJvcGVydHlmaWxlKTsKICAgICAgICAgICAgICAgICB0aHJvdyB4OwpAQCAtMjg2LDcgKzI2Niw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrUGFyYW0oRmlsZSBwYXJhbSkgewotICAgICAgICByZXR1cm4gIShwYXJhbSA9PSBudWxsKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtICE9IG51bGw7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MDQsNyArMzg0LDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gVHlwZS5TVFJJTkdfVFlQRSkgewogICAgICAgICAgICAgICAgICAgICBleGVjdXRlU3RyaW5nKG9sZFZhbHVlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVua25vd24gb3BlcmF0aW9uIHR5cGU6ICIgKyB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmtub3duIG9wZXJhdGlvbiB0eXBlOiAlZCIsIHR5cGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewogICAgICAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gc3RyaW5nIHR5cGUKQEAgLTQ2Niw3ICs0NDYsNiBAQAogICAgICAgICAgICAgbmV3VmFsdWUgPSBmbXQuZm9ybWF0KGN1cnJlbnRWYWx1ZS5nZXRUaW1lKCkpOwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogSGFuZGxlIG9wZXJhdGlvbnMgZm9yIHR5cGUgPGNvZGU+aW50PC9jb2RlPi4KICAgICAgICAgICoKQEAgLTQ3OCw3ICs0NTcsNiBAQAogICAgICAgICAgICAgaW50IGN1cnJlbnRWYWx1ZSA9IERFRkFVTFRfSU5UX1ZBTFVFOwogICAgICAgICAgICAgaW50IG5ld1YgID0gREVGQVVMVF9JTlRfVkFMVUU7CiAKLQogICAgICAgICAgICAgRGVjaW1hbEZvcm1hdCBmbXQgPSAocGF0dGVybiAhPSBudWxsKSA/IG5ldyBEZWNpbWFsRm9ybWF0KHBhdHRlcm4pCiAgICAgICAgICAgICAgICAgOiBuZXcgRGVjaW1hbEZvcm1hdCgpOwogICAgICAgICAgICAgdHJ5IHsKQEAgLTQ4OCw5ICs0NjYsNyBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgewotICAgICAgICAgICAgICAgIC8vIHN3YWxsb3cKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSAgeworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHwgUGFyc2VFeGNlcHRpb24gbmZlKSB7CiAgICAgICAgICAgICAgICAgLy8gc3dhbGxvdwogICAgICAgICAgICAgfQogCkBAIC01MDEsOSArNDc3LDcgQEAKICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uVmFsdWUgPSBmbXQucGFyc2UodmFsdWUpLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN3YWxsb3cKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpICB7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB8IFBhcnNlRXhjZXB0aW9uIG5mZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dhbGxvdwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTU0LDE1ICs1MjgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicHJvcGVydGllcyAoa2V5OiIgKyBrZXkgKyAiKSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgZGVmYXVsdFZhbHVlID09IG51bGwgICYmIG9wZXJhdGlvbiAhPSBPcGVyYXRpb24uREVMRVRFX09QRVIpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwidmFsdWVcIiBhbmQvb3IgXCJkZWZhdWx0XCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGUgbXVzdCBiZSBzcGVjaWZpZWQgKGtleToiICsga2V5ICsgIikiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJcInZhbHVlXCIgYW5kL29yIFwiZGVmYXVsdFwiIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCAoa2V5OiAlcykiLAorICAgICAgICAgICAgICAgICAgICBrZXkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJrZXkgaXMgbWFuZGF0b3J5Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlLlNUUklOR19UWVBFICYmIHBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0dGVybiBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJwcm9wZXJ0aWVzIChrZXk6IiArIGtleSArICIpIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAicGF0dGVybiBpcyBub3Qgc3VwcG9ydGVkIGZvciBzdHJpbmcgcHJvcGVydGllcyAoa2V5OiAlcykiLAorICAgICAgICAgICAgICAgICAgICBrZXkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTYwMSw3ICs1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXQgPSAob2xkVmFsdWUgPT0gbnVsbCkgPyBkZWZhdWx0VmFsdWUgOiBvbGRWYWx1ZTsKKyAgICAgICAgICAgICAgICByZXQgPSBvbGRWYWx1ZSA9PSBudWxsID8gZGVmYXVsdFZhbHVlIDogb2xkVmFsdWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC02MzYsOSArNjEyLDExIEBACiAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGludCB0b09wZXJhdGlvbihTdHJpbmcgb3BlcikgewogICAgICAgICAgICAgICAgIGlmICgiKyIuZXF1YWxzKG9wZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTkNSRU1FTlRfT1BFUjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCItIi5lcXVhbHMob3BlcikpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCItIi5lcXVhbHMob3BlcikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ1JFTUVOVF9PUEVSOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImRlbCIuZXF1YWxzKG9wZXIpKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgiZGVsIi5lcXVhbHMob3BlcikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFTEVURV9PUEVSOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gRVFVQUxTX09QRVI7CkBAIC02NzIsNyArNjUwLDggQEAKICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHRvVHlwZShTdHJpbmcgdHlwZSkgewogICAgICAgICAgICAgICAgIGlmICgiaW50Ii5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVEVHRVJfVFlQRTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJkYXRlIi5lcXVhbHModHlwZSkpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCJkYXRlIi5lcXVhbHModHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERBVEVfVFlQRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUUklOR19UWVBFOwpAQCAtNjk5LDE5ICs2NzgsMTkgQEAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVU5JVFMgPSB7TUlMTElTRUNPTkQsIFNFQ09ORCwgTUlOVVRFLCBIT1VSLCBEQVksIFdFRUssIE1PTlRILAogICAgICAgICAgICAgICAgIFlFQVJ9OwogCi0gICAgICAgIHByaXZhdGUgTWFwIGNhbGVuZGFyRmllbGRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBjYWxlbmRhckZpZWxkcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICAvKiogbm8gYXJnIGNvbnN0cnVjdG9yICovCiAgICAgICAgIHB1YmxpYyBVbml0KCkgewogICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTExJU0VDT05ELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1JTExJU0VDT05EKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoU0VDT05ELCBuZXcgSW50ZWdlcihDYWxlbmRhci5TRUNPTkQpKTsKLSAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChNSU5VVEUsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1JTlVURSkpOwotICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KEhPVVIsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLkhPVVJfT0ZfREFZKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoREFZLCBuZXcgSW50ZWdlcihDYWxlbmRhci5EQVRFKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoV0VFSywgbmV3IEludGVnZXIoQ2FsZW5kYXIuV0VFS19PRl9ZRUFSKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoTU9OVEgsIG5ldyBJbnRlZ2VyKENhbGVuZGFyLk1PTlRIKSk7Ci0gICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoWUVBUiwgbmV3IEludGVnZXIoQ2FsZW5kYXIuWUVBUikpOworICAgICAgICAgICAgICAgICAgICBDYWxlbmRhci5NSUxMSVNFQ09ORCk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoU0VDT05ELCBDYWxlbmRhci5TRUNPTkQpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1JTlVURSwgQ2FsZW5kYXIuTUlOVVRFKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChIT1VSLCBDYWxlbmRhci5IT1VSX09GX0RBWSk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoREFZLCBDYWxlbmRhci5EQVRFKTsKKyAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzLnB1dChXRUVLLCBDYWxlbmRhci5XRUVLX09GX1lFQVIpOworICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHMucHV0KE1PTlRILCBDYWxlbmRhci5NT05USCk7CisgICAgICAgICAgICBjYWxlbmRhckZpZWxkcy5wdXQoWUVBUiwgQ2FsZW5kYXIuWUVBUik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTcxOSw5ICs2OTgsNyBAQAogICAgICAgICAgKiBAcmV0dXJuIHRoZSBjYWxlbmRhciB2YWx1ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q2FsZW5kYXJGaWVsZCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBnZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCk7Ci0gICAgICAgICAgICBJbnRlZ2VyIGkgPSAoSW50ZWdlcikgY2FsZW5kYXJGaWVsZHMuZ2V0KGtleSk7Ci0gICAgICAgICAgICByZXR1cm4gaS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIGNhbGVuZGFyRmllbGRzLmdldChnZXRWYWx1ZSgpLnRvTG93ZXJDYXNlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZW5hbWVFeHRlbnNpb25zLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZW5hbWVFeHRlbnNpb25zLmphdmEKaW5kZXggYzRhY2FkYi4uZTkyMWZjMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVuYW1lRXh0ZW5zaW9ucy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlbmFtZUV4dGVuc2lvbnMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQzLDYgKzQzLDcgQEAKICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNS54LgogICogICAgICAgICAgICAgVXNlICZsdDttb3ZlJmd0OyBpbnN0ZWFkCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgUmVuYW1lRXh0ZW5zaW9ucyBleHRlbmRzIE1hdGNoaW5nVGFzayB7CiAKICAgICBwcml2YXRlIFN0cmluZyBmcm9tRXh0ZW5zaW9uID0gIiI7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SZXBsYWNlUmVnRXhwLmphdmEKaW5kZXggNWVjOWNkMi4uNWI3ZTNlNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVwbGFjZVJlZ0V4cC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlcGxhY2VSZWdFeHAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDggKzIwLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTI5LDYgKzI3LDggQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0xNDQsNyArMTQ0LDYgQEAKICAgICAgICAgdGhpcy5zdWJzID0gbnVsbDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGZpbGUgZm9yIHdoaWNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc2hvdWxkIGJlIHJlcGxhY2VkOwogICAgICAqIHJlcXVpcmVkIHVubGVzcyBhIG5lc3RlZCBmaWxlc2V0IGlzIHN1cHBsaWVkLgpAQCAtMTU1LDcgKzE1NCw2IEBACiAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggaW4gdGhlIGZpbGUocyk7CiAgICAgICogcmVxdWlyZWQgaWYgbm8gbmVzdGVkICZsdDtyZWdleHAmZ3Q7IGlzIHVzZWQKQEAgLTE3MSw3ICsxNjksNiBAQAogICAgICAgICByZWdleC5zZXRQYXR0ZXJuKG1hdGNoKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFRoZSBzdWJzdGl0dXRpb24gcGF0dGVybiB0byBwbGFjZSBpbiB0aGUgZmlsZShzKSBpbiBwbGFjZQogICAgICAqIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCkBAIC0xODIsOCArMTc5LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2UoU3RyaW5nIHJlcGxhY2UpIHsKICAgICAgICAgaWYgKHN1YnMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJPbmx5IG9uZSBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbiBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWxsb3dlZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJPbmx5IG9uZSBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbiBpcyBhbGxvd2VkIik7CiAgICAgICAgIH0KIAogICAgICAgICBzdWJzID0gbmV3IFN1YnN0aXR1dGlvbigpOwpAQCAtMjEwLDcgKzIwNyw2IEBACiAgICAgICAgIHRoaXMuZmxhZ3MgPSBmbGFnczsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFByb2Nlc3MgdGhlIGZpbGUocykgb25lIGxpbmUgYXQgYSB0aW1lLCBleGVjdXRpbmcgdGhlIHJlcGxhY2VtZW50CiAgICAgICogb24gb25lIGxpbmUgYXQgYSB0aW1lLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CkBAIC0yMjQsMTIgKzIyMCw3IEBACiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRCeUxpbmUoU3RyaW5nIGJ5bGluZSkgewotICAgICAgICBCb29sZWFuIHJlcyA9IEJvb2xlYW4udmFsdWVPZihieWxpbmUpOwotCi0gICAgICAgIGlmIChyZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmJ5bGluZSA9IHJlcy5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgdGhpcy5ieWxpbmUgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihieWxpbmUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzA1LDggKzI5Niw4IEBACiAgICAgICovCiAgICAgcHVibGljIFN1YnN0aXR1dGlvbiBjcmVhdGVTdWJzdGl0dXRpb24oKSB7CiAgICAgICAgIGlmIChzdWJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBvbmUgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb24gaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFsbG93ZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiT25seSBvbmUgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb24gaXMgYWxsb3dlZCIpOwogICAgICAgICB9CiAKICAgICAgICAgc3VicyA9IG5ldyBTdWJzdGl0dXRpb24oKTsKQEAgLTM1MCw3ICszNDEsNiBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQgb24gYSBmaWxlCiAgICAgICoKQEAgLTM2NCwyNCArMzU0LDI1IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBib29sZWFuIGNoYW5nZXMgPSBmYWxzZTsKIAotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBSZWFkZXIgciA9IGVuY29kaW5nICE9IG51bGwgPyBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIGVuY29kaW5nKSA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGVtcCk7CisgICAgICAgICAgICBmaW5hbCBDaGFyc2V0IGNoYXJzZXQgPSBlbmNvZGluZyA9PSBudWxsID8gQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpIDogQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShmLnRvUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHRlbXAudG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgUmVhZGVyIHIgPSBudWxsOworICAgICAgICAgICAgICAgIFdyaXRlciB3ID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBXcml0ZXIgdyA9IGVuY29kaW5nICE9IG51bGwgPyBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCBlbmNvZGluZykgOiBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zKTsKLQorICAgICAgICAgICAgICAgICAgICByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBjaGFyc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MsIGNoYXJzZXQpOwogICAgICAgICAgICAgICAgICAgICBsb2coIlJlcGxhY2luZyBwYXR0ZXJuICciICsgcmVnZXguZ2V0UGF0dGVybihnZXRQcm9qZWN0KCkpCiAgICAgICAgICAgICAgICAgICAgICAgICArICInIHdpdGggJyIgKyBzdWJzLmdldEV4cHJlc3Npb24oZ2V0UHJvamVjdCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBpbiAnIiArIGYuZ2V0UGF0aCgpICsgIiciICsgKGJ5bGluZSA/ICIgYnkgbGluZSIgOiAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICsgKGZsYWdzLmxlbmd0aCgpID4gMCA/ICIgd2l0aCBmbGFnczogJyIgKyBmbGFncyArICInIiA6ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAoZmxhZ3MuaXNFbXB0eSgpID8gIiIgOiAiIHdpdGggZmxhZ3M6ICciICsgZmxhZ3MgKyAiJyIpCiAgICAgICAgICAgICAgICAgICAgICAgICArICIuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5bGluZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBuZXcgQnVmZmVyZWRXcml0ZXIodyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBsaW5lYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBsaW5lYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjOwogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNDUiA9IGZhbHNlOwogCkBAIC0zOTUsNyArMzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy53cml0ZSgnXHInKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFzQ1IgaXMgc3RpbGwgdHJ1ZSAoZm9yIHRoZSBzZWNvbmQgb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgQ1IgaW4gdGhpcyBsaW5lCkBAIC00MTEsOSArNDAyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LndyaXRlKCdcbicpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGFueSBvdGhlciBjaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaGFzQ1IpIHx8IChjIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0NSIHx8IGMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWMtc3R5bGUgbGluZWJyZWFrIG9yIEVPRiAob3IgYm90aCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gcmVwbGFjZUFuZFdyaXRlKGxpbmVidWYudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIG9wdGlvbnMpOwpAQCAtNDIyLDcgKzQxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ1IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gMCkgewpAQCAtNDM0LDE1ICs0MjUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBtdWx0aWxpbmVSZXBsYWNlKHIsIHcsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgci5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICB3LmNsb3NlKCk7Ci0KICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uocik7CisgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3KTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2hhbmdlcykgewogICAgICAgICAgICAgICAgIGxvZygiRmlsZSBoYXMgY2hhbmdlZDsgc2F2aW5nIHRoZSB1cGRhdGVkIGZpbGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTQ2Nyw3ICs0NTMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBFeGVjdXRlIHRoZSB0YXNrCiAgICAgICoKQEAgLTQ4Myw5ICs0NjgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiByZXNvdXJjZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJZb3UgY2Fubm90IHN1cHBseSB0aGUgJ2ZpbGUnIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYW5kIHJlc291cmNlIGNvbGxlY3Rpb25zIGF0IHRoZSBzYW1lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0aW1lLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJZb3UgY2Fubm90IHN1cHBseSB0aGUgJ2ZpbGUnIGF0dHJpYnV0ZSBhbmQgcmVzb3VyY2UgY29sbGVjdGlvbnMgYXQgdGhlIHNhbWUgdGltZS4iKTsKICAgICAgICAgfQogCiAgICAgICAgIGludCBvcHRpb25zID0gUmVnZXhwVXRpbC5hc09wdGlvbnMoZmxhZ3MpOwpAQCAtNTA1LDkgKzQ4OSw3IEBACiAKICAgICAgICAgaWYgKHJlc291cmNlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByZXNvdXJjZXMpIHsKLSAgICAgICAgICAgICAgICBGaWxlUHJvdmlkZXIgZnAgPQotICAgICAgICAgICAgICAgICAgICByLmFzKEZpbGVQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gZnAuZ2V0RmlsZSgpOworICAgICAgICAgICAgICAgIEZpbGUgZiA9IHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKS5nZXRGaWxlKCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZi5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewpAQCAtNTM3LDUgKzUxOSwzIEBACiAgICAgICAgIHJldHVybiAhcmVzLmVxdWFscyhzKTsKICAgICB9CiB9Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9ScG0uamF2YQppbmRleCBhODE2ZjZlLi5hZGRjNGQ2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9ScG0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9ScG0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDEwICsxOSwxMCBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTExMCw2ICsxMTAsNyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpcyB0aGVyZSBpcyBhIHByb2JsZW0gaW4gdGhlIHRhc2sgZXhlY3V0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogCiAgICAgICAgIENvbW1hbmRsaW5lIHRvRXhlY3V0ZSA9IG5ldyBDb21tYW5kbGluZSgpOwpAQCAtMTQ4LDkgKzE0OSw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0KTsgLy9OT1NPTkFSCisgICAgICAgICAgICAgICAgICAgIGZvcyA9IEZpbGVzLm5ld091dHB1dFN0cmVhbShvdXRwdXQudG9QYXRoKCkpOyAvL05PU09OQVIKICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGZvcyk7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dHN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShib3MpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTE2Myw5ICsxNjQsOSBAQAogICAgICAgICAgICAgICAgIG91dHB1dHN0cmVhbSA9IG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZXJyb3IpOworICAgICAgICAgICAgICAgICAgICBmb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZXJyb3IudG9QYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZm9zKTsKICAgICAgICAgICAgICAgICAgICAgZXJyb3JzdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0oYm9zKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0yMDQsNyArMjA1LDcgQEAKICAgICAgKiBUaGUgZGlyZWN0b3J5IHdoaWNoIHdpbGwgaGF2ZSB0aGUgZXhwZWN0ZWQKICAgICAgKiBzdWJkaXJlY3RvcmllcywgU1BFQ1MsIFNPVVJDRVMsIEJVSUxELCBTUlBNUzsgb3B0aW9uYWwuCiAgICAgICogSWYgdGhpcyBpc24ndCBzcGVjaWZpZWQsCi0gICAgICogdGhlIDx0dD5iYXNlRGlyPC90dD4gdmFsdWUgaXMgdXNlZAorICAgICAqIHRoZSA8Y29kZT5iYXNlRGlyPC9jb2RlPiB2YWx1ZSBpcyB1c2VkCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBub3JtYWwgUlBNIGRpcmVjdG9yaWVzLgogICAgICAqLwpAQCAtMjI2LDcgKzIyNyw3IEBACiAgICAgICogQHBhcmFtIHNmIHRoZSBzcGVjIGZpbGUgbmFtZSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U3BlY0ZpbGUoU3RyaW5nIHNmKSB7Ci0gICAgICAgIGlmICgoc2YgPT0gbnVsbCkgfHwgKHNmLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICBpZiAoc2YgPT0gbnVsbCB8fCBzZi50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBtdXN0IHNwZWNpZnkgYSBzcGVjIGZpbGUiLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLnNwZWNGaWxlID0gc2Y7CkBAIC0yNTIsNyArMjUzLDcgQEAKICAgICAvKioKICAgICAgKiBGbGFnIChvcHRpb25hbCwgZGVmYXVsdD1mYWxzZSkKICAgICAgKiB0byByZW1vdmUgdGhlIHNvdXJjZXMgYWZ0ZXIgdGhlIGJ1aWxkLgotICAgICAqIFNlZSB0aGUgPHR0Pi0tcm1zb3VyY2U8L3R0PiAgb3B0aW9uIG9mIHJwbWJ1aWxkLgorICAgICAqIFNlZSB0aGUgPGNvZGU+LS1ybXNvdXJjZTwvY29kZT4gIG9wdGlvbiBvZiBycG1idWlsZC4KICAgICAgKiBAcGFyYW0gcnMgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdmVTb3VyY2UoYm9vbGVhbiBycykgewpAQCAtMzE5LDIwICszMjAsMjAgQEAKICAgICAgKiBAc2luY2UgMS42CiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBndWVzc1JwbUJ1aWxkQ29tbWFuZCgpIHsKLSAgICAgICAgTWFwLyo8U3RyaW5nLCBTdHJpbmc+Ki8gZW52ID0gRXhlY3V0ZS5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGVudi5nZXQoUEFUSDEpOworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IEV4ZWN1dGUuZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoKTsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBlbnYuZ2V0KFBBVEgxKTsKICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgcGF0aCA9IChTdHJpbmcpIGVudi5nZXQoUEFUSDIpOworICAgICAgICAgICAgcGF0aCA9IGVudi5nZXQoUEFUSDIpOwogICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHBhdGggPSAoU3RyaW5nKSBlbnYuZ2V0KFBBVEgzKTsKKyAgICAgICAgICAgICAgICBwYXRoID0gZW52LmdldChQQVRIMyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCksIHBhdGgpOwogICAgICAgICAgICAgU3RyaW5nW10gcEVsZW1lbnRzID0gcC5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBFbGVtZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHBFbGVtZW50c1tpXSwKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBFbGVtZW50IDogcEVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocEVsZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJwbWJ1aWxkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKE9zLmlzRmFtaWx5KCJkb3MiKSA/ICIuZXhlIiA6ICIiKSk7CiAgICAgICAgICAgICAgICAgaWYgKGYuY2FuUmVhZCgpKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGUuamF2YQppbmRleCAzMDgwMWRlLi4zNTRkY2FiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjaGVtYVZhbGlkYXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw3ICsyMCw4IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKQEAgLTQwLDcgKzQxLDcgQEAKICAqIFRoaXMgdGFzayB2YWxpZGF0ZXMgWE1MIHNjaGVtYSBkb2N1bWVudHMuIEl0IHJlcXVpcmVzIGFuIFhNTCBwYXJzZXIKICAqIHRoYXQgaGFuZGxlcyB0aGUgcmVsZXZhbnQgU0FYLCBYZXJjZXMgb3IgSkFYUCBvcHRpb25zLgogICoKLSAqIFRvIHJlc29sdmUgcmVtb3RlIHJlZmVyZW5jaWVzLCBBbnQgbWF5IG5lZWQgaXRzIHByb3h5IHNldCB1cCwgdXNpbmcgdGhlCisgKiBUbyByZXNvbHZlIHJlbW90ZSByZWZlcmVuY2VzLCBBbnQgbWF5IG5lZWQgaXRzIHByb3h5IHNldCB1cCwgdXNpbmcgdGhlCiAgKiBzZXRwcm94eSB0YXNrLgogICoKICAqIEhhbmRzIG9mZiBtb3N0IG9mIHRoZSB3b3JrIHRvIGl0cyBwYXJlbnQsIHtAbGluayBYTUxWYWxpZGF0ZVRhc2t9CkBAIC00OCwyMyArNDksNiBAQAogICovCiAKIHB1YmxpYyBjbGFzcyBTY2hlbWFWYWxpZGF0ZSBleHRlbmRzIFhNTFZhbGlkYXRlVGFzayB7Ci0KLSAgICAvKiogbWFwIG9mIGFsbCBkZWNsYXJlZCBzY2hlbWFzOyB3ZSBjYXRjaCBhbmQgY29tcGxhaW4gYWJvdXQgcmVkZWZpbml0aW9ucyAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgLyoqIGZ1bGwgY2hlY2tpbmcgb2YgYSBzY2hlbWEgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZnVsbENoZWNraW5nID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIGZsYWcgdG8gZGlzYWJsZSBEVEQgc3VwcG9ydC4gQmVzdCBsZWZ0IGVuYWJsZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVEVEQgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgVVJMIGZvciBub25hbWVzcGFjZSBzY2hlbWFzCi0gICAgICovCi0gICAgcHJpdmF0ZSBTY2hlbWFMb2NhdGlvbiBhbm9ueW1vdXNTY2hlbWE7Ci0KICAgICAvLyBFcnJvciBzdHJpbmdzCiAgICAgLyoqIFNBWDEgbm90IHN1cHBvcnRlZCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NBWF8xID0gIlNBWDEgcGFyc2VycyBhcmUgbm90IHN1cHBvcnRlZCI7CkBAIC04OCwxMiArNzIsMjkgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9EVVBMSUNBVEVfU0NIRU1BCiAgICAgICAgID0gIkR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiBzY2hlbWEgIjsKIAorICAgIC8qKiBtYXAgb2YgYWxsIGRlY2xhcmVkIHNjaGVtYXM7IHdlIGNhdGNoIGFuZCBjb21wbGFpbiBhYm91dCByZWRlZmluaXRpb25zICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTY2hlbWFMb2NhdGlvbj4gc2NoZW1hTG9jYXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgLyoqIGZ1bGwgY2hlY2tpbmcgb2YgYSBzY2hlbWEgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZnVsbENoZWNraW5nID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIGZsYWcgdG8gZGlzYWJsZSBEVEQgc3VwcG9ydC4gQmVzdCBsZWZ0IGVuYWJsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGRpc2FibGVEVEQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIGRlZmF1bHQgVVJMIGZvciBub25hbWVzcGFjZSBzY2hlbWFzCisgICAgICovCisgICAgcHJpdmF0ZSBTY2hlbWFMb2NhdGlvbiBhbm9ueW1vdXNTY2hlbWE7CisKICAgICAvKioKICAgICAgKiBDYWxsZWQgYnkgdGhlIHByb2plY3QgdG8gbGV0IHRoZSB0YXNrIGluaXRpYWxpemUgcHJvcGVybHkuIFRoZSBkZWZhdWx0CiAgICAgICogaW1wbGVtZW50YXRpb24gaXMgYSBuby1vcC4KICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgYnVpbGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuaW5pdCgpOwogICAgICAgICAvL3ZhbGlkYXRpbmcKQEAgLTEyOSw3ICsxMzAsNyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0IHNjaGVtYSBhdHRyaWJ1dGVzIGluIGEgSkFYUCAxLjIgZW5naW5lLgotICAgICAqIEBzZWUgPEEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cC9jaGFuZ2UtcmVxdWVzdHMtMTEuaHRtbCI+CisgICAgICogQHNlZSA8QSBocmVmPSJodHRwczovL2phdmEuc3VuLmNvbS94bWwvamF4cC9jaGFuZ2UtcmVxdWVzdHMtMTEuaHRtbCI+CiAgICAgICogSkFYUCAxLjIgQXBwcm92ZWQgQ0hBTkdFUzwvQT4KICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbHVyZQogICAgICAqLwpAQCAtMTU1LDcgKzE1Niw3IEBACiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNjaGVtYShTY2hlbWFMb2NhdGlvbiBsb2NhdGlvbikgewogICAgICAgICBsb2coImFkZGluZyBzY2hlbWEgIiArIGxvY2F0aW9uLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgIGxvY2F0aW9uLnZhbGlkYXRlTmFtZXNwYWNlKCk7Ci0gICAgICAgIFNjaGVtYUxvY2F0aW9uIG9sZCA9IChTY2hlbWFMb2NhdGlvbikgc2NoZW1hTG9jYXRpb25zLmdldChsb2NhdGlvbi5nZXROYW1lc3BhY2UoKSk7CisgICAgICAgIFNjaGVtYUxvY2F0aW9uIG9sZCA9IHNjaGVtYUxvY2F0aW9ucy5nZXQobG9jYXRpb24uZ2V0TmFtZXNwYWNlKCkpOwogICAgICAgICBpZiAob2xkICE9IG51bGwgJiYgIW9sZC5lcXVhbHMobG9jYXRpb24pKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfRFVQTElDQVRFX1NDSEVNQSArIGxvY2F0aW9uKTsKICAgICAgICAgfQpAQCAtMjEzLDYgKzIxNCw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdFZhbGlkYXRvcigpIHsKICAgICAgICAgc3VwZXIuaW5pdFZhbGlkYXRvcigpOwogICAgICAgICAvL3ZhbGlkYXRlIHRoZSBwYXJzZXIgdHlwZQpAQCAtMjIxLDcgKzIyMyw2IEBACiAgICAgICAgIH0KIAogICAgICAgICAvL2VuYWJsZSBzY2hlbWEKLSAgICAgICAgLy9zZXRGZWF0dXJlKFhtbENvbnN0YW50cy5GRUFUVVJFX1ZBTElEQVRJT04sIGZhbHNlKTsKICAgICAgICAgc2V0RmVhdHVyZShYbWxDb25zdGFudHMuRkVBVFVSRV9OQU1FU1BBQ0VTLCB0cnVlKTsKICAgICAgICAgaWYgKCFlbmFibGVYZXJjZXNTY2hlbWFWYWxpZGF0aW9uKCkgJiYgIWVuYWJsZUpBWFAxMlNjaGVtYVZhbGlkYXRpb24oKSkgewogICAgICAgICAgICAgLy9jb3VsZCBub3QgdXNlIHhlcmNlcyBvciBqYXhwIGNhbGxzCkBAIC0yNDQsNiArMjQ1LDcgQEAKICAgICAgKiBjcmVhdGUgb3VyIG93biBmYWN0b3J5IHdpdGggb3VyIG93biBvcHRpb25zLgogICAgICAqIEByZXR1cm4gYSBkZWZhdWx0IFhNTCBwYXJzZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZURlZmF1bHRSZWFkZXIoKSB7CiAgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwpAQCAtMjUyLDkgKzI1NCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKICAgICAgICAgICAgIHJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oRVJST1JfUEFSU0VSX0NSRUFUSU9OX0ZBSUxVUkUsIGUpOwotICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHwgU0FYRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9QQVJTRVJfQ1JFQVRJT05fRkFJTFVSRSwgZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlYWRlcjsKQEAgLTI2NSwyMyArMjY1LDE0IEBACiAgICAgICogcHJvcGVydHkuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkU2NoZW1hTG9jYXRpb25zKCkgewotICAgICAgICBJdGVyYXRvciBpdCA9IHNjaGVtYUxvY2F0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2NoZW1hTG9jYXRpb24gc2NoZW1hTG9jYXRpb24gPSAoU2NoZW1hTG9jYXRpb24pIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIFN0cmluZyB0dXBsZSA9IHNjaGVtYUxvY2F0aW9uLmdldFVSSWFuZExvY2F0aW9uKCk7Ci0gICAgICAgICAgICBidWZmZXIuYXBwZW5kKHR1cGxlKTsKLSAgICAgICAgICAgIGxvZygiQWRkaW5nIHNjaGVtYSAiICsgdHVwbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgICAgICBzZXRQcm9wZXJ0eShYbWxDb25zdGFudHMuUFJPUEVSVFlfU0NIRU1BX0xPQ0FUSU9OLCBidWZmZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCFzY2hlbWFMb2NhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgam9pbmVkVmFsdWUgPSBzY2hlbWFMb2NhdGlvbnMudmFsdWVzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKFNjaGVtYUxvY2F0aW9uOjpnZXRVUklhbmRMb2NhdGlvbikKKyAgICAgICAgICAgICAgICAucGVlayh0dXBsZSAtPiBsb2coIkFkZGluZyBzY2hlbWEgIiArIHR1cGxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiAiKSk7CiAKKyAgICAgICAgICAgIHNldFByb3BlcnR5KFhtbENvbnN0YW50cy5QUk9QRVJUWV9TQ0hFTUFfTE9DQVRJT04sIGpvaW5lZFZhbHVlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMjg5LDExICsyODAsOCBAQAogICAgICAqIEByZXR1cm4gdGhlIHNjaGVtYSBVUkwKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vTmFtZXNwYWNlU2NoZW1hVVJMKCkgewotICAgICAgICBpZiAoYW5vbnltb3VzU2NoZW1hID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGFub255bW91c1NjaGVtYS5nZXRTY2hlbWFMb2NhdGlvblVSTCgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBhbm9ueW1vdXNTY2hlbWEgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgIDogYW5vbnltb3VzU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uVVJMKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTcsNiArMzA1LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlUHJvY2Vzc2VkIG51bWJlciBvZiBmaWxlcyBwcm9jZXNzZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25TdWNjZXNzZnVsVmFsaWRhdGlvbihpbnQgZmlsZVByb2Nlc3NlZCkgewogICAgICAgICBsb2coZmlsZVByb2Nlc3NlZCArIE1FU1NBR0VfRklMRVNfVkFMSURBVEVELCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICB9CkBAIC0zNTAsMTAgKzMzOSw2IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX0xPQ0FUSU9OCiAgICAgICAgICAgICA9ICJObyBmaWxlIG9yIFVSTCBzdXBwbGllZCBmb3IgdGhlIHNjaGVtYSAiOwogCi0gICAgICAgIC8qKiBObyBhcmcgY29uc3RydWN0b3IgKi8KLSAgICAgICAgcHVibGljIFNjaGVtYUxvY2F0aW9uKCkgewotICAgICAgICB9Ci0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgbmFtZXNwYWNlLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lc3BhY2UuCkBAIC00NDIsMTEgKzQyNyw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVSSWFuZExvY2F0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHZhbGlkYXRlTmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChuYW1lc3BhY2UpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChnZXRTY2hlbWFMb2NhdGlvblVSTCgpKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlICsgJyAnICsgZ2V0U2NoZW1hTG9jYXRpb25VUkwoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNDY1LDcgKzQ0Niw3IEBACiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBub3QgbnVsbCBvciBlbXB0eQogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2V0KFN0cmluZyBwcm9wZXJ0eSkgewotICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5ICE9IG51bGwgJiYgcHJvcGVydHkubGVuZ3RoKCkgIT0gMDsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eSAhPSBudWxsICYmICFwcm9wZXJ0eS5pc0VtcHR5KCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQ3NCw2ICs0NTUsNyBAQAogICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWZmIHRoZSBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGluIHZhbHVlCiAgICAgICAgICAqLwogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ4NCwzMCArNDY2LDIyIEBACiAKICAgICAgICAgICAgIGZpbmFsIFNjaGVtYUxvY2F0aW9uIHNjaGVtYUxvY2F0aW9uID0gKFNjaGVtYUxvY2F0aW9uKSBvOwogCi0gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsID8gIWZpbGUuZXF1YWxzKHNjaGVtYUxvY2F0aW9uLmZpbGUpIDogc2NoZW1hTG9jYXRpb24uZmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSAhPSBudWxsID8gIW5hbWVzcGFjZS5lcXVhbHMoc2NoZW1hTG9jYXRpb24ubmFtZXNwYWNlKQotICAgICAgICAgICAgICAgICAgICA6IHNjaGVtYUxvY2F0aW9uLm5hbWVzcGFjZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHVybCAhPSBudWxsID8gIXVybC5lcXVhbHMoc2NoZW1hTG9jYXRpb24udXJsKSA6IHNjaGVtYUxvY2F0aW9uLnVybCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiAoZmlsZSA9PSBudWxsID8gc2NoZW1hTG9jYXRpb24uZmlsZSA9PSBudWxsIDogZmlsZS5lcXVhbHMoc2NoZW1hTG9jYXRpb24uZmlsZSkpCisgICAgICAgICAgICAgICAgICAgICYmIChuYW1lc3BhY2UgPT0gbnVsbCA/IHNjaGVtYUxvY2F0aW9uLm5hbWVzcGFjZSA9PSBudWxsIDogbmFtZXNwYWNlLmVxdWFscyhzY2hlbWFMb2NhdGlvbi5uYW1lc3BhY2UpKQorICAgICAgICAgICAgICAgICAgICAmJiAodXJsID09IG51bGwgPyBzY2hlbWFMb2NhdGlvbi51cmwgPT0gbnVsbCA6IHVybC5lcXVhbHMoc2NoZW1hTG9jYXRpb24udXJsKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKICAgICAgICAgICogR2VuZXJhdGUgYSBoYXNoY29kZSBkZXBlbmRpbmcgb24gdGhlIG5hbWVzcGFjZSwgdXJsIGFuZCBmaWxlIG5hbWUuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGhhc2hjb2RlLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgICAgICBpbnQgcmVzdWx0OwogICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKLSAgICAgICAgICAgIHJlc3VsdCA9IChuYW1lc3BhY2UgIT0gbnVsbCA/IG5hbWVzcGFjZS5oYXNoQ29kZSgpIDogMCk7Ci0gICAgICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChmaWxlICE9IG51bGwgPyBmaWxlLmhhc2hDb2RlKCkgOiAwKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKHVybCAhPSBudWxsID8gdXJsLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IChuYW1lc3BhY2UgPT0gbnVsbCA/IDAgOiBuYW1lc3BhY2UuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXN1bHQgPSAyOSAqIHJlc3VsdCArIChmaWxlID09IG51bGwgPyAwIDogZmlsZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDI5ICogcmVzdWx0ICsgKHVybCA9PSBudWxsID8gMCA6IHVybC5oYXNoQ29kZSgpKTsKICAgICAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CkBAIC01MTcsMTMgKzQ5MSwxMSBAQAogICAgICAgICAgKiBhbmQgdGhlIGxpa2UKICAgICAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChuYW1lc3BhY2UgIT0gbnVsbCA/IG5hbWVzcGFjZSA6ICIoYW5vbnltb3VzKSIpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnICcpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCh1cmwgIT0gbnVsbCA/ICh1cmwgKyAiICIpIDogIiIpOwotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChmaWxlICE9IG51bGwgPyBmaWxlLmdldEFic29sdXRlUGF0aCgpIDogIiIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIChuYW1lc3BhY2UgPT0gbnVsbCA/ICIoYW5vbnltb3VzKSIgOiBuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgICAgICsgKHVybCA9PSBudWxsID8gIiIgOiAiICIgKyB1cmwpCisgICAgICAgICAgICAgICAgICAgICsgKGZpbGUgPT0gbnVsbCA/ICIiIDogIiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KLSAgICB9IC8vU2NoZW1hTG9jYXRpb24KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY3JpcHQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5qYXZhCmluZGV4IGEyOTM0N2YuLjQxNmE4ZjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjcmlwdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTMwLDQgKzEzMCwxNSBAQAogICAgIHB1YmxpYyB2b2lkIHNldFNldEJlYW5zKGJvb2xlYW4gc2V0QmVhbnMpIHsKICAgICAgICAgaGVscGVyLnNldFNldEJlYW5zKHNldEJlYW5zKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlOyBvcHRpb25hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICBoZWxwZXIuc2V0RW5jb2RpbmcoZW5jb2RpbmcpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uLmphdmEKaW5kZXggZTUyNzEzMS4uMjNkYjRiMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTUgKzIxLDEzIEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTY1LDYgKzYzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmVhbVV0aWxzOwogaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwogaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKQEAgLTEyMiwxNiArMTIxLDE2IEBACiAgICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKIAogICAgIC8qKiB0cmFuc2Zvcm1lciBvdXRwdXQgcHJvcGVydGllcyAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZ1tdPiBvdXRwdXRQcm9wZXJ0aWVzID0gbmV3IFZlY3RvcjxTdHJpbmdbXT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmdbXT4gb3V0cHV0UHJvcGVydGllcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIHN0eWxlc2hlZXQgcGFyYW1ldGVycyAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKiBmYWN0b3J5IGF0dHJpYnV0ZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T2JqZWN0W10+IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdFtdPigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPYmplY3RbXT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqIGZhY3RvcnkgZmVhdHVyZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEJvb2xlYW4+IGZlYXR1cmVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gZmVhdHVyZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAvKiogd2hldGhlciB0byBzdXBwcmVzcyB3YXJuaW5ncyAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc1dhcm5pbmdzID0gZmFsc2U7CkBAIC0xODgsMjcgKzE4NywxOCBAQAogICAgICAgICAgICAgY3JlYXRlVHJhbnNmb3JtZXIoKTsKICAgICAgICAgfQogCi0gICAgICAgIElucHV0U3RyZWFtIGZpcyA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShpbmZpbGUpKTsKLSAgICAgICAgICAgIGZvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmaWxlKSk7CisgICAgICAgIC8vIGF1dG9jbG9zZSBhbGwgaGFuZGxlcywgb3RoZXJ3aXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB3aWxsIGNsb3NlIHRoZW0uLi4KKyAgICAgICAgLy8gYW5kIFdpbmRvd3MgbWF5IGNvbXBsYWluIGFib3V0IG5vdCBiZWluZyBhYmxlIHRvIGRlbGV0ZSBmaWxlcy4KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBmaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShpbmZpbGUudG9QYXRoKCkpKTsKKyAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbShvdXRmaWxlLnRvUGF0aCgpKSkpIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmVhbVJlc3VsdCByZXMgPSBuZXcgU3RyZWFtUmVzdWx0KGZvcyk7CiAgICAgICAgICAgICAvLyBub3Qgc3VyZSB3aGF0IGNvdWxkIGJlIHRoZSBuZWVkIG9mIHRoaXMuLi4KICAgICAgICAgICAgIHJlcy5zZXRTeXN0ZW1JZChKQVhQVXRpbHMuZ2V0U3lzdGVtSWQob3V0ZmlsZSkpOwotICAgICAgICAgICAgZmluYWwgU291cmNlIHNyYyA9IGdldFNvdXJjZShmaXMsIGluZmlsZSk7Ci0KICAgICAgICAgICAgIC8vIHNldCBwYXJhbWV0ZXJzIG9uIGVhY2ggdHJhbnNmb3JtYXRpb24sIG1heWJlIHNvbWV0aGluZyBoYXMgY2hhbmdlZAogICAgICAgICAgICAgLy8oZS5nLiB2YWx1ZSBvZiBmaWxlIG5hbWUgcGFyYW1ldGVyKQogICAgICAgICAgICAgc2V0VHJhbnNmb3JtYXRpb25QYXJhbWV0ZXJzKCk7CiAKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzcmMsIHJlcyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gY2xvc2UgYWxsIGhhbmRsZXMsIG90aGVyd2lzZSB0aGUgZ2FyYmFnZQotICAgICAgICAgICAgLy8gY29sbGVjdG9yIHdpbGwgY2xvc2UgdGhlbS4uLndoZW5ldmVyIHBvc3NpYmxlIGFuZAotICAgICAgICAgICAgLy8gV2luZG93cyBtYXkgY29tcGxhaW4gYWJvdXQgbm90IGJlaW5nIGFibGUgdG8gZGVsZXRlIGZpbGVzLgotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZpcyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZm9zKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShnZXRTb3VyY2UoZmlzLCBpbmZpbGUpLCByZXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDEsMTcgKzI5MSwxMSBAQAogICAgICAgICAvLyBhbmQgYXZvaWQga2VlcGluZyB0aGUgaGFuZGxlIHVudGlsIHRoZSBvYmplY3QgaXMgZ2FyYmFnZWQuCiAgICAgICAgIC8vIChhbHdheXMga2VlcCBjb250cm9sKSwgb3RoZXJ3aXNlIHlvdSB3b24ndCBiZSBhYmxlIHRvIGRlbGV0ZQogICAgICAgICAvLyB0aGUgZmlsZSBxdWlja2x5IG9uIHdpbmRvd3MuCi0gICAgICAgIElucHV0U3RyZWFtIHhzbFN0cmVhbSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB4c2xTdHJlYW0KLSAgICAgICAgICAgICAgICA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0eWxlc2hlZXQuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0geHNsU3RyZWFtID0KKyAgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHlsZXNoZWV0LmdldElucHV0U3RyZWFtKCkpKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZXNNb2RUaW1lID0gc3R5bGVzaGVldC5nZXRMYXN0TW9kaWZpZWQoKTsKICAgICAgICAgICAgIGZpbmFsIFNvdXJjZSBzcmMgPSBnZXRTb3VyY2UoeHNsU3RyZWFtLCBzdHlsZXNoZWV0KTsKICAgICAgICAgICAgIHRlbXBsYXRlcyA9IGdldEZhY3RvcnkoKS5uZXdUZW1wbGF0ZXMoc3JjKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh4c2xTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHhzbFN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzQsNyArMzE4LDcgQEAKICAgICAgICAgaWYgKHVyaVJlc29sdmVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFVSSVJlc29sdmVyKHVyaVJlc29sdmVyKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKFN0cmluZ1tdIHBhaXIgOiBvdXRwdXRQcm9wZXJ0aWVzKSB7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nW10gcGFpciA6IG91dHB1dFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KHBhaXJbMF0sIHBhaXJbMV0pOwogICAgICAgICB9CiAKQEAgLTM0Miw3ICszMjYsNyBAQAogICAgICAgICAgICAgaWYgKCJvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyLlRyYW5zZm9ybWVySW1wbCIgLy9OT1NPTkFSCiAgICAgICAgICAgICAgICAgLmVxdWFscyh0cmFuc2Zvcm1lci5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyB0cmFjZVN1cHBvcnQgPQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0cmFjZVN1cHBvcnQgPQogICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJYYWxhbjJUcmFjZVN1cHBvcnQiLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpCkBAIC0zNzQsOSArMzU4LDcgQEAKICAgICAgKiBTZXRzIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgdHJhbnNmb3JtZXIuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNldFRyYW5zZm9ybWF0aW9uUGFyYW1ldGVycygpIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcGFyYW1zLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcGFyYW1zLmZvckVhY2goKGtleSwgdmFsdWUpIC0+IHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcihrZXksIHZhbHVlKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zOTYsNyArMzc4LDcgQEAKICAgICAgICAgICAgIHRmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IG51bGw7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgY2xhenogPQogICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShmYWN0b3J5TmFtZSwgdHJ1ZSwKQEAgLTQyOSw3ICs0MTEsNiBAQAogICAgICAgICB0ZmFjdG9yeS5zZXRFcnJvckxpc3RlbmVyKHRoaXMpOwogCiAgICAgICAgIC8vIHNwZWNpZmljIGF0dHJpYnV0ZXMgZm9yIHRoZSB0cmFuc2Zvcm1lcgotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGF0dHJpYnV0ZXMuc2l6ZSgpOwogICAgICAgICBmb3IgKGZpbmFsIE9iamVjdFtdIHBhaXIgOiBhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICB0ZmFjdG9yeS5zZXRBdHRyaWJ1dGUoKFN0cmluZykgcGFpclswXSwgcGFpclsxXSk7CiAgICAgICAgIH0KQEAgLTYyOCwxNiArNjA5LDExIEBACiAgICAgICAgIGZpbmFsIFhTTFRQcm9jZXNzLkZhY3RvcnkgZmFjdG9yeSA9IHhzbHRUYXNrLmdldEZhY3RvcnkoKTsKICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgewogICAgICAgICAgICAgc2V0RmFjdG9yeShmYWN0b3J5LmdldE5hbWUoKSk7Ci0KICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZSBmYWN0b3J5IGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIGZvciAoZmluYWwgWFNMVFByb2Nlc3MuRmFjdG9yeS5BdHRyaWJ1dGUgYXR0cgotICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmxpc3QoZmFjdG9yeS5nZXRBdHRyaWJ1dGVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0QXR0cmlidXRlKGF0dHIuZ2V0TmFtZSgpLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChmaW5hbCBYU0xUUHJvY2Vzcy5GYWN0b3J5LkZlYXR1cmUgZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICAgOiBmYWN0b3J5LmdldEZlYXR1cmVzKCkpIHsKLSAgICAgICAgICAgICAgICBzZXRGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpLCBmZWF0dXJlLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShmYWN0b3J5LmdldEF0dHJpYnV0ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goYXR0ciAtPiBzZXRBdHRyaWJ1dGUoYXR0ci5nZXROYW1lKCksIGF0dHIuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgZmFjdG9yeS5nZXRGZWF0dXJlcygpCisgICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGZlYXR1cmUgLT4gc2V0RmVhdHVyZShmZWF0dXJlLmdldE5hbWUoKSwgZmVhdHVyZS5nZXRWYWx1ZSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBmaW5hbCBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSB4c2x0VGFzay5nZXRYTUxDYXRhbG9nKCk7CkBAIC02NDcsMTIgKzYyMyw5IEBACiAgICAgICAgICAgICBzZXRVUklSZXNvbHZlcih4bWxDYXRhbG9nKTsKICAgICAgICAgfQogCi0KICAgICAgICAgLy8gY29uZmlndXJlIG91dHB1dCBwcm9wZXJ0aWVzCi0gICAgICAgIGZvciAoZmluYWwgWFNMVFByb2Nlc3MuT3V0cHV0UHJvcGVydHkgcHJvcAotICAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMubGlzdCh4c2x0VGFzay5nZXRPdXRwdXRQcm9wZXJ0aWVzKCkpKSB7Ci0gICAgICAgICAgICBzZXRPdXRwdXRQcm9wZXJ0eShwcm9wLmdldE5hbWUoKSwgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQorICAgICAgICBTdHJlYW1VdGlscy5lbnVtZXJhdGlvbkFzU3RyZWFtKHhzbHRUYXNrLmdldE91dHB1dFByb3BlcnRpZXMoKSkKKyAgICAgICAgICAgICAgICAuZm9yRWFjaChwcm9wIC0+IHNldE91dHB1dFByb3BlcnR5KHByb3AuZ2V0TmFtZSgpLCBwcm9wLmdldFZhbHVlKCkpKTsKIAogICAgICAgICBzdXBwcmVzc1dhcm5pbmdzID0geHNsdFRhc2suZ2V0U3VwcHJlc3NXYXJuaW5ncygpOwogCkBAIC02NjEsOCArNjM0LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBhcHBseVJlZmxlY3Rpb25IYWNrRm9yRXh0ZW5zaW9uTWV0aG9kcygpIHsKICAgICAgICAgLy8gSmlnc2F3IGRvZXNuJ3QgYWxsb3cgcmVmbGVjdGlvbiB0byB3b3JrLCBzbyB3ZSBjYW4gc3RvcCB0cnlpbmcKLSAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzcpCi0gICAgICAgICAgICAmJiAhSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKSB7CisgICAgICAgIGlmICghSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKSB7CiAgICAgICAgICAgICB0cnkgeyAvLyAjNTE2NjgsICM1MjM4MgogICAgICAgICAgICAgICAgIGZpbmFsIEZpZWxkIF9pc05vdFNlY3VyZVByb2Nlc3NpbmcgPSB0ZmFjdG9yeS5nZXRDbGFzcygpLmdldERlY2xhcmVkRmllbGQoIl9pc05vdFNlY3VyZVByb2Nlc3NpbmciKTsKICAgICAgICAgICAgICAgICBfaXNOb3RTZWN1cmVQcm9jZXNzaW5nLnNldEFjY2Vzc2libGUodHJ1ZSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YTUxWYWxpZGF0ZVRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhCmluZGV4IGY0N2VjNTcuLjJlZGFiZGEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hNTFZhbGlkYXRlVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwpAQCAtNzQsNyArNzQsNyBAQAogICAgIC8qKiBmaWxlIHRvIGJlIHZhbGlkYXRlZCAqLwogICAgIHByb3RlY3RlZCBGaWxlIGZpbGUgPSBudWxsOwogICAgIC8qKiBzZXRzIG9mIGZpbGUgdG8gYmUgdmFsaWRhdGVkICovCi0gICAgcHJvdGVjdGVkIFZlY3RvcjxGaWxlU2V0PiBmaWxlc2V0cyA9IG5ldyBWZWN0b3I8RmlsZVNldD4oKTsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yPEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgcHJvdGVjdGVkIFBhdGggY2xhc3NwYXRoOwogCiAgICAgLyoqCkBAIC05MCwxMiArOTAsMTIgQEAKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgogCiAgICAgLyoqIFRoZSB2ZWN0b3IgdG8gc3RvcmUgYWxsIGF0dHJpYnV0ZXMgKGZlYXR1cmVzKSB0byBiZSBzZXQgb24gdGhlIHBhcnNlci4gKiovCi0gICAgcHJpdmF0ZSBWZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0ID0gbmV3IFZlY3RvcjxBdHRyaWJ1dGU+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0ID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBMaXN0IG9mIHByb3BlcnRpZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8UHJvcGVydHk+IHByb3BlcnR5TGlzdCA9IG5ldyBWZWN0b3I8UHJvcGVydHk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8UHJvcGVydHk+IHByb3BlcnR5TGlzdCA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgcHJpdmF0ZSBYTUxDYXRhbG9nIHhtbENhdGFsb2cgPSBuZXcgWE1MQ2F0YWxvZygpOwogICAgIC8qKiBNZXNzYWdlIGZvciBzdWNjZXNzZnVsIHZhbGlkYXRpb24gKi8KQEAgLTI4OCw3ICsyODgsNyBAQAogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaW50IGZpbGVQcm9jZXNzZWQgPSAwOwotICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiAoZmlsZXNldHMuc2l6ZSgpID09IDApKSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIGZpbGVzZXRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIlNwZWNpZnkgYXQgbGVhc3Qgb25lIHNvdXJjZSAtICIgKyAiYSBmaWxlIG9yIGEgZmlsZXNldC4iKTsKICAgICAgICAgICAgIH0KQEAgLTMwNywxMiArMzA3LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKEZpbGVTZXQgZnMgOiBmaWxlc2V0cykgeworICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlU2V0IGZzIDogZmlsZXNldHMpIHsKICAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVOYW1lIDogZHMuZ2V0SW5jbHVkZWRGaWxlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKGZzLmdldERpcihnZXRQcm9qZWN0KCkpLCBmaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGRvVmFsaWRhdGUoc3JjRmlsZSk7Ci0gICAgICAgICAgICAgICAgICBmaWxlUHJvY2Vzc2VkKys7CisgICAgICAgICAgICAgICAgICAgIGZpbGVQcm9jZXNzZWQrKzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvblN1Y2Nlc3NmdWxWYWxpZGF0aW9uKGZpbGVQcm9jZXNzZWQpOwpAQCAtMzQ4LDEyICszNDgsMTIgQEAKICAgICAgICAgICAgICAgICBzZXRGZWF0dXJlKFhtbENvbnN0YW50cy5GRUFUVVJFX1ZBTElEQVRJT04sIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gc2V0IHRoZSBmZWF0dXJlIGZyb20gdGhlIGF0dHJpYnV0ZSBsaXN0Ci0gICAgICAgICAgICBmb3IgKEF0dHJpYnV0ZSBmZWF0dXJlIDogYXR0cmlidXRlTGlzdCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBBdHRyaWJ1dGUgZmVhdHVyZSA6IGF0dHJpYnV0ZUxpc3QpIHsKICAgICAgICAgICAgICAgICBzZXRGZWF0dXJlKGZlYXR1cmUuZ2V0TmFtZSgpLCBmZWF0dXJlLmdldFZhbHVlKCkpOwogCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTZXRzIHByb3BlcnRpZXMKLSAgICAgICAgICAgIGZvciAoUHJvcGVydHkgcHJvcCA6IHByb3BlcnR5TGlzdCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBQcm9wZXJ0eSBwcm9wIDogcHJvcGVydHlMaXN0KSB7CiAgICAgICAgICAgICAgICAgc2V0UHJvcGVydHkocHJvcC5nZXROYW1lKCksIHByb3AuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM4MSw3ICszODEsNyBAQAogICAgICAgICAgICAgcmVhZGVyID0gY3JlYXRlRGVmYXVsdFJlYWRlck9yUGFyc2VyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAKLSAgICAgICAgICAgIENsYXNzIHJlYWRlckNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzPD8+IHJlYWRlckNsYXNzID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgLy8gbG9hZCB0aGUgcGFyc2VyIGNsYXNzCiAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aCAhPSBudWxsKSB7CkBAIC0zOTMsMTEgKzM5Myw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihJTklUX0ZBSUxFRF9NU0cgKyByZWFkZXJDbGFzc05hbWUsIGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKElOSVRfRkFJTEVEX01TRyArIHJlYWRlckNsYXNzTmFtZSwgZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKElOSVRfRkFJTEVEX01TRyArIHJlYWRlckNsYXNzTmFtZSwgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU0MSw3ICs1MzcsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9nKCJWYWxpZGF0aW5nICIgKyBhZmlsZS5nZXROYW1lKCkgKyAiLi4uICIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgZXJyb3JIYW5kbGVyLmluaXQoYWZpbGUpOwotICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShhZmlsZSkpOworICAgICAgICAgICAgSW5wdXRTb3VyY2UgaXMgPSBuZXcgSW5wdXRTb3VyY2UoRmlsZXMubmV3SW5wdXRTdHJlYW0oYWZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBGSUxFX1VUSUxTLnRvVVJJKGFmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIGlzLnNldFN5c3RlbUlkKHVyaSk7CiAgICAgICAgICAgICB4bWxSZWFkZXIucGFyc2UoaXMpOwpAQCAtNjQ1LDcgKzY0MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludCBsaW5lID0gZS5nZXRMaW5lTnVtYmVyKCk7CiAgICAgICAgICAgICAgICAgaW50IGNvbCA9IGUuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICBuYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUKICAgICAgICAgICAgICAgICAgICAgKyAobGluZSA9PSAtMQogICAgICAgICAgICAgICAgICAgICAgICA/ICIiCiAgICAgICAgICAgICAgICAgICAgICAgIDogKCI6IiArIGxpbmUgKyAoY29sID09IC0xID8gIiIgOiAoIjoiICsgY29sKSkpKQpAQCAtNjYxLDExICs2NTcsMTAgQEAKICAgICAgKiBAc2luY2UgYW50MS42CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGUgewotICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBzZXQuCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHNldC4KICAgICAgICAgICoKLSAgICAgICAgICogVmFsaWQgYXR0cmlidXRlcyA8YSBocmVmPQotICAgICAgICAgKiAiaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKLSAgICAgICAgICogPmluY2x1ZGUuPC9hPgorICAgICAgICAgKiBWYWxpZCBhdHRyaWJ1dGVzIDxhIGhyZWY9Imh0dHA6Ly93d3cuc2F4cHJvamVjdC5vcmcvYXBpZG9jL29yZy94bWwvc2F4L3BhY2thZ2Utc3VtbWFyeS5odG1sI3BhY2thZ2VfZGVzY3JpcHRpb24iPmluY2x1ZGU8L2E+CiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKIApAQCAtNzA4LDcgKzcwMyw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBhcnNlciBwcm9wZXJ0eS4KLSAgICAgKiBTZWUgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL3Byb3BlcnRpZXMuaHRtbCI+CisgICAgICogU2VlIDxhIGhyZWY9Imh0dHBzOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovcHJvcGVydGllcy5odG1sIj4KICAgICAgKiBYTUwgcGFyc2VyIHByb3BlcnRpZXM8L2E+IGZvciB1c2FibGUgcHJvcGVydGllcwogICAgICAqIEBzaW5jZSBhbnQgMS42LjIKICAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hTTFRUcmFjZVN1cHBvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hTTFRUcmFjZVN1cHBvcnQuamF2YQppbmRleCA4YjY4NGQ4Li40MTM4NmJiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YU0xUVHJhY2VTdXBwb3J0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWFNMVFRyYWNlU3VwcG9ydC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWGFsYW4yVHJhY2VTdXBwb3J0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbjJUcmFjZVN1cHBvcnQuamF2YQppbmRleCBlNWRhMDE4Li5jYjA2NGQ0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbjJUcmFjZVN1cHBvcnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YYWxhbjJUcmFjZVN1cHBvcnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVjay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrLmphdmEKaW5kZXggZjZhOTRiNS4uOGIyYjNmMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOSwxMiArMjksMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwogCi0KIC8qKgogICogQ2xhc3MgY29tbW9uIHRvIGFsbCBjaGVjayBjb21tYW5kcyAoY2hlY2tvdXQsIGNoZWNraW4sY2hlY2tpbiBkZWZhdWx0IHRhc2spOwogICogQGFudC50YXNrIGlnbm9yZT0idHJ1ZSIKICAqLwogcHVibGljIGNsYXNzIENDTUNoZWNrIGV4dGVuZHMgQ29udGludXVzIHsKKyAgICAvKioKKyAgICAgKiAtY29tbWVudCBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi9jb21tZW50IjsKKworICAgIC8qKgorICAgICAqICAtdGFzayBmbGFnIC0tIGFzc29jaWF0ZSBjaGVja291dCB0YXNrIHdpdGggdGFzaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVEFTSyA9ICIvdGFzayI7CiAKICAgICBwcml2YXRlIEZpbGUgZmlsZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7CkBAIC00MiwxNSArNTAsMTAgQEAKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKLSAgICAvKiogQ29uc3RydWN0b3IgZm9yIENDTUNoZWNrLiAqLwotICAgIHB1YmxpYyBDQ01DaGVjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGZpbGUuCiAgICAgICogQHJldHVybiB2YWx1ZSBvZiBmaWxlLgpAQCAtODQsNyArODcsNiBAQAogICAgICAgICB0aGlzLmNvbW1lbnQgPSB2OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0YXNrLgogICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGFzay4KQEAgLTEwMiw3ICsxMDQsNiBAQAogICAgICAgICB0aGlzLnRhc2sgPSB2OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQWRkcyBhIHNldCBvZiBmaWxlcyB0byBjb3B5LgogICAgICAqIEBwYXJhbSBzZXQgdGhlIHNldCBvZiBmaWxlcwpAQCAtMTIwLDkgKzEyMSwxMCBAQAogICAgICAqIDwvcD4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoZmlsZSA9PSBudWxsICYmIGZpbGVzZXRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UgLSBhIGZpbGUgb3IgYSBmaWxlc2V0LiIpOwogICAgICAgICB9CkBAIC0xMzEsNyArMTMzLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ0NNQ2hlY2sgY2Fubm90IGJlIGdlbmVyYXRlZCBmb3IgZGlyZWN0b3JpZXMiKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChmaWxlICE9IG51bGwgICYmIGZpbGVzZXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiAhZmlsZXNldHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNob29zZSBiZXR3ZWVuIGZpbGUgYW5kIGZpbGVzZXQgISIpOwogICAgICAgICB9CiAKQEAgLTE0MCwxNCArMTQyLDExIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgc2l6ZW9mRmlsZVNldCA9IGZpbGVzZXRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2ZGaWxlU2V0OyBpKyspIHsKLSAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOworICAgICAgICBmb3IgKEZpbGVTZXQgZnMgOiBmaWxlc2V0cykgeworICAgICAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7CiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgU3RyaW5nW10gc3JjRmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNyY0ZpbGVzLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBzcmMgPSBuZXcgRmlsZShmcy5nZXREaXIoZ2V0UHJvamVjdCgpKSwgc3JjRmlsZXNbal0pOwotICAgICAgICAgICAgICAgIHNldEZpbGUoc3JjKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHNyY0ZpbGUgOiBkcy5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBzZXRGaWxlKG5ldyBGaWxlKGJhc2VkaXIsIHNyY0ZpbGUpKTsKICAgICAgICAgICAgICAgICBkb2l0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE3MCwxMiArMTY5LDExIEBACiAKICAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTk1LDE0ICsxOTMsNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogLWNvbW1lbnQgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICIvY29tbWVudCI7Ci0KLSAgICAvKioKLSAgICAgKiAgLXRhc2sgZmxhZyAtLSBhc3NvY2lhdGUgY2hlY2tvdXQgdGFzayB3aXRoIHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1RBU0sgPSAiL3Rhc2siOwogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW4uamF2YQppbmRleCBmZjc0NzJjLi5lNGRjMmMyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tpbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVja2luLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNiw0ICszNiwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DaGVja2luRGVmYXVsdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKaW5kZXggMmZlMmEyYS4uNzI5YWJlMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNraW5EZWZhdWx0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSwxNCArMjUsMTMgQEAKICAqLwogcHVibGljIGNsYXNzIENDTUNoZWNraW5EZWZhdWx0IGV4dGVuZHMgQ0NNQ2hlY2sgewogCisgICAgLyoqIFRoZSBkZWZhdWx0IHRhc2sgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1RBU0sgPSAiZGVmYXVsdCI7CisKICAgICAvKiogQ29uc3RydWN0b3IgZm9yIENDTUNoZWNraW5EZWZhdWx0LiAqLwogICAgIHB1YmxpYyBDQ01DaGVja2luRGVmYXVsdCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgc2V0Q2NtQWN0aW9uKENPTU1BTkRfQ0hFQ0tJTik7CiAgICAgICAgIHNldFRhc2soREVGQVVMVF9UQVNLKTsKICAgICB9Ci0KLSAgICAvKiogVGhlIGRlZmF1bHQgdGFzayAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFTSyA9ICJkZWZhdWx0IjsKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNoZWNrb3V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQppbmRleCA0NGJiYzZiLi4zOWQ2MDQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ2hlY2tvdXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDQgKzMyLDMgQEAKICAgICAgICAgc2V0Q2NtQWN0aW9uKENPTU1BTkRfQ0hFQ0tPVVQpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNyZWF0ZVRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01DcmVhdGVUYXNrLmphdmEKaW5kZXggNzc3NzcxOC4uNGM2ZmIxNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTUNyZWF0ZVRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ0NNQ3JlYXRlVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzgsNiArMzgsMzUgQEAKICAqIEBhbnQudGFzayBuYW1lPSJjY21jcmVhdGV0YXNrIiBjYXRlZ29yeT0ic2NtIgogICovCiBwdWJsaWMgY2xhc3MgQ0NNQ3JlYXRlVGFzayBleHRlbmRzIENvbnRpbnV1cyBpbXBsZW1lbnRzIEV4ZWN1dGVTdHJlYW1IYW5kbGVyIHsKKyAgICAvKioKKyAgICAgKiAvY29tbWVudCAtLSBjb21tZW50cyBhc3NvY2lhdGVkIHRvIHRoZSB0YXNrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi9zeW5vcHNpcyI7CisKKyAgICAvKioKKyAgICAgKiAgL3BsYXRmb3JtIGZsYWcgLS0gdGFyZ2V0IHBsYXRmb3JtCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QTEFURk9STSA9ICIvcGxhdCI7CisKKyAgICAvKioKKyAgICAgKiAvcmVzb2x2ZXIgZmxhZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVTT0xWRVIgPSAiL3Jlc29sdmVyIjsKKworICAgIC8qKgorICAgICAqIC9yZWxlYXNlIGZsYWcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFTEVBU0UgPSAiL3JlbGVhc2UiOworCisgICAgLyoqCisgICAgICogL3JlbGVhc2UgZmxhZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU1VCU1lTVEVNID0gIi9zdWJzeXN0ZW0iOworCisgICAgLyoqCisgICAgICogIC10YXNrIGZsYWcgLS0gYXNzb2NpYXRlIGNoZWNrb3V0IHRhc2sgd2l0aCB0YXNrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19UQVNLID0gIi90YXNrIjsKIAogICAgIHByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIHBsYXRmb3JtID0gbnVsbDsKQEAgLTYzLDkgKzkyLDkgQEAKICAgICAgKiA8L3A+CiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdAogICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gdGhlIENDTS5FWEUgaGVscApAQCAtNzQsMTAgKzEwMyw5IEBACiAKICAgICAgICAgY2hlY2tPcHRpb25zKGNvbW1hbmRMaW5lKTsKIAotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUsIHRoaXMpOwotICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocnVuKGNvbW1hbmRMaW5lLCB0aGlzKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKICAgICAgICAgLy9jcmVhdGUgdGFzayBvaywgc2V0IHRoaXMgdGFzayBhcyB0aGUgZGVmYXVsdCBvbmUKQEAgLTg4LDE1ICsxMTYsMTIgQEAKIAogICAgICAgICBsb2coY29tbWFuZExpbmUuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX0RFQlVHKTsKIAotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUyKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZTIudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAocnVuKGNvbW1hbmRMaW5lMikgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUyLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KICAgICAgKi8KQEAgLTEyNyw3ICsxNTIsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGNvbW1lbnQuCiAgICAgICogQHJldHVybiB2YWx1ZSBvZiBjb21tZW50LgpAQCAtMTQ1LDcgKzE2OSw2IEBACiAgICAgICAgIHRoaXMuY29tbWVudCA9IHY7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHBsYXRmb3JtLgogICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcGxhdGZvcm0uCkBAIC0xNjMsNyArMTg2LDYgQEAKICAgICAgICAgdGhpcy5wbGF0Zm9ybSA9IHY7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHJlc29sdmVyLgogICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcmVzb2x2ZXIuCkBAIC0xODEsNyArMjAzLDYgQEAKICAgICAgICAgdGhpcy5yZXNvbHZlciA9IHY7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHJlbGVhc2UuCiAgICAgICogQHJldHVybiB2YWx1ZSBvZiByZWxlYXNlLgpAQCAtMjE2LDcgKzIzNyw2IEBACiAgICAgICAgIHRoaXMuc3ViU3lzdGVtID0gdjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGFzay4KICAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRhc2suCkBAIC0yMzUsNzEgKzI1NSw0NSBAQAogICAgICAgICB0aGlzLnRhc2sgPSB2OwogICAgIH0KIAotICAgIC8qKgotICAgICAqIC9jb21tZW50IC0tIGNvbW1lbnRzIGFzc29jaWF0ZWQgdG8gdGhlIHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiL3N5bm9wc2lzIjsKLQotICAgIC8qKgotICAgICAqICAvcGxhdGZvcm0gZmxhZyAtLSB0YXJnZXQgcGxhdGZvcm0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BMQVRGT1JNID0gIi9wbGF0IjsKLQotICAgIC8qKgotICAgICAqIC9yZXNvbHZlciBmbGFnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRVNPTFZFUiA9ICIvcmVzb2x2ZXIiOwotCi0gICAgLyoqCi0gICAgICogL3JlbGVhc2UgZmxhZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVMRUFTRSA9ICIvcmVsZWFzZSI7Ci0KLSAgICAvKioKLSAgICAgKiAvcmVsZWFzZSBmbGFnCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19TVUJTWVNURU0gPSAiL3N1YnN5c3RlbSI7Ci0KLSAgICAvKioKLSAgICAgKiAgLXRhc2sgZmxhZyAtLSBhc3NvY2lhdGUgY2hlY2tvdXQgdGFzayB3aXRoIHRhc2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1RBU0sgPSAiL3Rhc2siOwotCi0KICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlU3RyZWFtSGFuZGxlciBpbnRlcmZhY2UKIAogICAgIC8qKgogICAgICAqCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICB9CiAKICAgICAvKioKICAgICAgKgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFyYW0xIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIG9uIGVycm9yCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcGFyYW0xKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgIH0KIAogICAgIC8qKgogICAgICAqCiAgICAgICogQHBhcmFtIGlzIHRoZSBpbnB1dCBzdHJlYW0KLSAgICAgKiBAZXhjZXB0aW9uIGphdmEuaW8uSU9FeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0Vycm9yU3RyZWFtKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7Ci0gICAgICAgIFN0cmluZyBzID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgIGlmIChzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGxvZygiZXJyICIgKyBzLCBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgIH0gLy8gZW5kIG9mIGlmICgpCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpKSB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiZXJyICIgKyBzLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMwNywxMiArMzAxLDExIEBACiAgICAgICogQHBhcmFtIGlzIElucHV0U3RyZWFtCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGJ1ZmZlciA9ICIiOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwotICAgICAgICAgICAgYnVmZmVyID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKSkgeworICAgICAgICAgICAgU3RyaW5nIGJ1ZmZlciA9IHJlYWRlci5yZWFkTGluZSgpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJidWZmZXI6IiArIGJ1ZmZlciwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrc3RyaW5nID0gYnVmZmVyLnN1YnN0cmluZyhidWZmZXIuaW5kZXhPZignICcpKS50cmltKCk7CkBAIC0zMjMsNyArMzE2LDcgQEAKICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CiAgICAgICAgICAgICBsb2coImVycm9yIHByb2Nlc3Npb24gc3RyZWFtLCBudWxsIHBvaW50ZXIgZXhjZXB0aW9uIiwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIGxvZyhTdHJpbmdVdGlscy5nZXRTdGFja1RyYWNlKG5wZSksIFByb2plY3QuTVNHX0VSUik7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obnBlLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihucGUpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgbG9nKCJlcnJvciBwcm9jZXNzaW9uIHN0cmVhbSAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwpAQCAtMzMyLDQgKzMyNSwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9DQ01SZWNvbmZpZ3VyZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTVJlY29uZmlndXJlLmphdmEKaW5kZXggMzVhMDgzNC4uOWU2Y2MxMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTVJlY29uZmlndXJlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NDTVJlY29uZmlndXJlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCw2ICsyOCwyMSBAQAogICogVGFzayBhbGxvd3MgdG8gcmVjb25maWd1cmUgYSBwcm9qZWN0LCByZWN1cnNpdmVseSBvciBub3QKICAqLwogcHVibGljIGNsYXNzIENDTVJlY29uZmlndXJlIGV4dGVuZHMgQ29udGludXVzIHsKKyAgICAvKioKKyAgICAgKiAvcmVjdXJzZSAtLQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVDVVJTRSA9ICIvcmVjdXJzZSI7CisKKyAgICAvKioKKyAgICAgKiAvcmVjdXJzZSAtLQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSQk9TRSA9ICIvdmVyYm9zZSI7CisKKworICAgIC8qKgorICAgICAqICAvcHJvamVjdCBmbGFnIC0tIHRhcmdldCBwcm9qZWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QUk9KRUNUID0gIi9wcm9qZWN0IjsKIAogICAgIHByaXZhdGUgU3RyaW5nIGNjbVByb2plY3QgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiByZWN1cnNlID0gZmFsc2U7CkBAIC0zOSw3ICs1NCw2IEBACiAgICAgICAgIHNldENjbUFjdGlvbihDT01NQU5EX1JFQ09ORklHVVJFKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEV4ZWN1dGVzIHRoZSB0YXNrLgogICAgICAqIDxwPgpAQCAtNDgsOSArNjIsOSBAQAogICAgICAqIDwvcD4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwogCiAgICAgICAgIC8vIGJ1aWxkIHRoZSBjb21tYW5kIGxpbmUgZnJvbSB3aGF0IHdlIGdvdCB0aGUgZm9ybWF0CiAgICAgICAgIC8vIGFzIHNwZWNpZmllZCBpbiB0aGUgQ0NNLkVYRSBoZWxwCkBAIC01OSwxNCArNzMsMTMgQEAKIAogICAgICAgICBjaGVja09wdGlvbnMoY29tbWFuZExpbmUpOwogCi0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KICAgICAgKi8KQEAgLTEwMyw3ICsxMTYsNiBAQAogICAgICAgICB0aGlzLmNjbVByb2plY3QgPSB2OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiByZWN1cnNlLgogICAgICAqIEByZXR1cm4gdmFsdWUgb2YgcmVjdXJzZS4KQEAgLTEyMSw3ICsxMzMsNiBAQAogICAgICAgICB0aGlzLnJlY3Vyc2UgPSB2OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB2ZXJib3NlLgogICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdmVyYm9zZS4KQEAgLTEzOCwyMiArMTQ5LDQgQEAKICAgICAgICAgdGhpcy52ZXJib3NlID0gdjsKICAgICB9CiAKLQotICAgIC8qKgotICAgICAqIC9yZWN1cnNlIC0tCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUNVUlNFID0gIi9yZWN1cnNlIjsKLQotICAgIC8qKgotICAgICAqIC9yZWN1cnNlIC0tCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19WRVJCT1NFID0gIi92ZXJib3NlIjsKLQotCi0gICAgLyoqCi0gICAgICogIC9wcm9qZWN0IGZsYWcgLS0gdGFyZ2V0IHByb2plY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BST0pFQ1QgPSAiL3Byb2plY3QiOwotCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9Db250aW51dXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NjbS9Db250aW51dXMuamF2YQppbmRleCA1NjE4ZGQ2Li42NmQ4MzVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jY20vQ29udGludXVzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2NtL0NvbnRpbnV1cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNiArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNjbTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CkBAIC0zOSw4MCArNDEsNiBAQAogICoKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIENvbnRpbnV1cyBleHRlbmRzIFRhc2sgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgY2NtRGlyID0gIiI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY2NtQWN0aW9uID0gIiI7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGNjbUFjdGlvbi4KLSAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNjbUFjdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldENjbUFjdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIGNjbUFjdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGNjbUFjdGlvbi4KLSAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGNjbUFjdGlvbi4KLSAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2NtQWN0aW9uKFN0cmluZyB2KSB7Ci0gICAgICAgIHRoaXMuY2NtQWN0aW9uID0gdjsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjY20gZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNjbSBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2NtRGlyKFN0cmluZyBkaXIpIHsKLSAgICAgICAgY2NtRGlyID0gRmlsZVV0aWxzLnRyYW5zbGF0ZVBhdGgoZGlyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGNvbW1hbmQgc3RyaW5nIHRvIGV4ZWN1dGUgY2NtCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDY21Db21tYW5kKCkgewotICAgICAgICBTdHJpbmcgdG9SZXR1cm4gPSBjY21EaXI7Ci0gICAgICAgIGlmICghdG9SZXR1cm4uZXF1YWxzKCIiKSAmJiAhdG9SZXR1cm4uZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgdG9SZXR1cm4gKz0gIi8iOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9SZXR1cm4gKz0gQ0NNX0VYRTsKLQotICAgICAgICByZXR1cm4gdG9SZXR1cm47Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBSdW4gdGhlIGNvbW1hbmQuCi0gICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCi0gICAgICogQHBhcmFtIGhhbmRsZXIgYW4gZXhlY3V0ZSBzdHJlYW0gaGFuZGxlcgotICAgICAqIEByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBydW4oQ29tbWFuZGxpbmUgY21kLCBFeGVjdXRlU3RyZWFtSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFeGVjdXRlIGV4ZSA9IG5ldyBFeGVjdXRlKGhhbmRsZXIpOwotICAgICAgICAgICAgZXhlLnNldEFudFJ1bihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgZXhlLnNldFdvcmtpbmdEaXJlY3RvcnkoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7Ci0gICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUnVuIHRoZSBjb21tYW5kLgotICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQotICAgICAqIEByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjb21tYW5kCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGludCBydW4oQ29tbWFuZGxpbmUgY21kKSB7Ci0gICAgICAgIHJldHVybiBydW4oY21kLCBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19WRVJCT1NFLCBQcm9qZWN0Lk1TR19XQVJOKSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCiAgICAgICovCkBAIC0xNDAsNSArNjgsNzUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0RFRkFVTFRfVEFTSyA9ICJkZWZhdWx0X3Rhc2siOwogCisgICAgcHJpdmF0ZSBTdHJpbmcgY2NtRGlyID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2NtQWN0aW9uID0gIiI7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIGNjbUFjdGlvbi4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIGNjbUFjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENjbUFjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNjbUFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIGNjbUFjdGlvbi4KKyAgICAgKiBAcGFyYW0gdiAgVmFsdWUgdG8gYXNzaWduIHRvIGNjbUFjdGlvbi4KKyAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2NtQWN0aW9uKFN0cmluZyB2KSB7CisgICAgICAgIHRoaXMuY2NtQWN0aW9uID0gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgY2NtIGV4ZWN1dGFibGUgaXMgbG9jYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjY20gZXhlY3V0YWJsZQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENjbURpcihTdHJpbmcgZGlyKSB7CisgICAgICAgIGNjbURpciA9IEZpbGVVdGlscy50cmFuc2xhdGVQYXRoKGRpcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlIGNjbQorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgcGF0aCB0byB0aGUgZXhlY3V0YWJsZQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2NtQ29tbWFuZCgpIHsKKyAgICAgICAgU3RyaW5nIHRvUmV0dXJuID0gY2NtRGlyOworICAgICAgICBpZiAoIXRvUmV0dXJuLmlzRW1wdHkoKSAmJiAhdG9SZXR1cm4uZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgdG9SZXR1cm4gKz0gIi8iOworICAgICAgICB9CisKKyAgICAgICAgdG9SZXR1cm4gKz0gQ0NNX0VYRTsKKworICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVuIHRoZSBjb21tYW5kLgorICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQorICAgICAqIEBwYXJhbSBoYW5kbGVyIGFuIGV4ZWN1dGUgc3RyZWFtIGhhbmRsZXIKKyAgICAgKiBAcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY29tbWFuZAorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgcnVuKENvbW1hbmRsaW5lIGNtZCwgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZShoYW5kbGVyKTsKKyAgICAgICAgICAgIGV4ZS5zZXRBbnRSdW4oZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkpOworICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNtZC5nZXRDb21tYW5kbGluZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBleGUuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGNvbW1hbmQuCisgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCisgICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNvbW1hbmQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQpIHsKKyAgICAgICAgcmV0dXJuIHJ1bihjbWQsIG5ldyBMb2dTdHJlYW1IYW5kbGVyKHRoaXMsIFByb2plY3QuTVNHX1ZFUkJPU0UsIFByb2plY3QuTVNHX1dBUk4pKTsKKyAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNraW4uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNraW4uamF2YQppbmRleCBmN2M0YTVmLi5hM2I1ZWE0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja2luLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tpbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzksNiArNzksNDEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDQ0NoZWNraW4gZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworCisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisKKyAgICAvKioKKyAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7CisKKyAgICAvKioKKyAgICAgKiAtbndhcm4gZmxhZyAtLSBzdXBwcmVzc2VzIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PV0FSTiA9ICItbndhcm4iOworCisgICAgLyoqCisgICAgICogLXB0aW1lIGZsYWcgLS0gcHJlc2VydmVzIHRoZSBtb2RpZmljYXRpb24gdGltZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7CisKKyAgICAvKioKKyAgICAgKiAta2VlcCBmbGFnIC0tIGtlZXBzIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIGEgLmtlZXAgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19LRUVQQ09QWSA9ICIta2VlcCI7CisKKyAgICAvKioKKyAgICAgKiAtaWRlbnRpY2FsIGZsYWcgLS0gYWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19JREVOVElDQUwgPSAiLWlkZW50aWNhbCI7CisKICAgICBwcml2YXRlIFN0cmluZyBtQ29tbWVudCA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUNmaWxlID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbU53YXJuID0gZmFsc2U7CkBAIC05MywxMCArMTI4LDEwIEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKICAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgewpAQCAtMTE1LDE0ICsxNTAsMTIgQEAKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKICAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCiAgICAgICovCkBAIC0yNzMsNyArMzA2LDYgQEAKICAgICAgICAgcmV0dXJuIG1JZGVudGljYWw7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlICdjb21tZW50JyBjb21tYW5kCiAgICAgICoKQEAgLTMxMCwzNSArMzQyLDUgQEAKICAgICAgICAgfQogICAgIH0KIAotCi0gICAgICAgIC8qKgotICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgICAgICAvKioKLSAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKLSAgICAgICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwotICAgICAgICAvKioKLSAgICAgKiAtbndhcm4gZmxhZyAtLSBzdXBwcmVzc2VzIHdhcm5pbmcgbWVzc2FnZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PV0FSTiA9ICItbndhcm4iOwotICAgICAgICAvKioKLSAgICAgKiAtcHRpbWUgZmxhZyAtLSBwcmVzZXJ2ZXMgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QUkVTRVJWRVRJTUUgPSAiLXB0aW1lIjsKLSAgICAgICAgLyoqCi0gICAgICogLWtlZXAgZmxhZyAtLSBrZWVwcyBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCBhIC5rZWVwIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfS0VFUENPUFkgPSAiLWtlZXAiOwotICAgICAgICAvKioKLSAgICAgKiAtaWRlbnRpY2FsIGZsYWcgLS0gYWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19JREVOVElDQUwgPSAiLWlkZW50aWNhbCI7Ci0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0NoZWNrb3V0LmphdmEKaW5kZXggNDQ4OWI3Yi4uYWVlNzhhYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDQ2hlY2tvdXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NDaGVja291dC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtOTUsNiArOTUsNTYgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDQ0NoZWNrb3V0IGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICAvKioKKyAgICAgKiAgLXJlc2VydmVkIGZsYWcgLS0gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRVNFUlZFRCA9ICItcmVzZXJ2ZWQiOworCisgICAgLyoqCisgICAgICogIC1yZXNlcnZlZCBmbGFnIC0tIGNoZWNrIG91dCB0aGUgZmlsZSBhcyB1bnJlc2VydmVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19VTlJFU0VSVkVEID0gIi11bnJlc2VydmVkIjsKKworICAgIC8qKgorICAgICAqIC1vdXQgZmxhZyAtLSBjcmVhdGUgYSB3cml0YWJsZSBmaWxlIHVuZGVyIGEgZGlmZmVyZW50IGZpbGVuYW1lCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PVVQgPSAiLW91dCI7CisKKyAgICAvKioKKyAgICAgKiAtbmRhdGEgZmxhZyAtLSBjaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4gZWRpdGFibGUgZmlsZSBjb250YWluaW5nIGl0cyBkYXRhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0RBVEEgPSAiLW5kYXRhIjsKKworICAgIC8qKgorICAgICAqIC1icmFuY2ggZmxhZyAtLSBjaGVja3Mgb3V0IHRoZSBmaWxlIG9uIGEgc3BlY2lmaWVkIGJyYW5jaAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQlJBTkNIID0gIi1icmFuY2giOworCisgICAgLyoqCisgICAgICogLXZlcnNpb24gZmxhZyAtLSBhbGxvd3MgY2hlY2tvdXQgb2YgYSB2ZXJzaW9uIHRoYXQgaXMgbm90IG1haW4gbGF0ZXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKKworICAgIC8qKgorICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7CisKKyAgICAvKioKKyAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKKworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworCisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXNlcnZlZCA9IHRydWU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbU91dCA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1OZGF0YSA9IGZhbHNlOwpAQCAtMTEyLDEwICsxNjIsMTAgQEAKICAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CiAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwogCiAgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAogICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CkBAIC0xNDMsMTAgKzE5MywxMCBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTU1LDcgKzIwNSw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGxzQ2hlY2tvdXQoKSB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZGwgPSBuZXcgQ29tbWFuZGxpbmUoKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdDsKIAogICAgICAgICAvLyBidWlsZCB0aGUgY29tbWFuZCBsaW5lIGZyb20gd2hhdCB3ZSBnb3QgdGhlIGZvcm1hdCBpcwogICAgICAgICAvLyBjbGVhcnRvb2wgbHNjbyBbb3B0aW9ucy4uLl0gW3ZpZXdwYXRoIC4uLl0KQEAgLTE2OCwxMiArMjE3LDExIEBACiAgICAgICAgIC8vIHZpZXdwYXRoCiAgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRWaWV3UGF0aCgpKTsKIAotICAgICAgICByZXN1bHQgPSBydW5TKGNtZGwsIGdldEZhaWxPbkVycigpKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJ1blMoY21kbCwgZ2V0RmFpbE9uRXJyKCkpOwogCi0gICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbiggImxzQ2hlY2tvdXQ6ICIgKyByZXN1bHQgKTsKLQotICAgICAgICByZXR1cm4gKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGgoKSA+IDApID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGwgJiYgIXJlc3VsdC5pc0VtcHR5KCk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTkwLDIzICsyMzgsMTcgQEAKICAgICAgICAgaWYgKGdldE91dCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIC1vdXQKICAgICAgICAgICAgIGdldE91dENvbW1hbmQoY21kKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXROb0RhdGEoKSkgewotICAgICAgICAgICAgICAgIC8vIC1uZGF0YQotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9EQVRBKTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICB9IGVsc2UgaWYgKGdldE5vRGF0YSgpKSB7CisgICAgICAgICAgICAvLyAtbmRhdGEKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9EQVRBKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXRCcmFuY2goKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyAtYnJhbmNoCiAgICAgICAgICAgICBnZXRCcmFuY2hDb21tYW5kKGNtZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgLy8gLXZlcnNpb24KLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1ZFUlNJT04pOwotICAgICAgICAgICAgfQotCisgICAgICAgIH0gZWxzZSBpZiAoZ2V0VmVyc2lvbigpKSB7CisgICAgICAgICAgICAvLyAtdmVyc2lvbgorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19WRVJTSU9OKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXROb1dhcm4oKSkgewpAQCAtMjE3LDIwICsyNTksMTUgQEAKICAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyAtYwogICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gLWNmaWxlCi0gICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHZpZXdwYXRoCiAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOwotCi0gICAgICAgIC8vIFByaW50IG91dCBpbmZvIGFib3V0IHRoZSBub3RjbyBvcHRpb24KLSAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCAiTm90Y286ICIgKyAoZ2V0Tm90Y28oKSA/ICJ5ZXMiIDogIm5vIikgKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3MSw3ICszMDgsNiBAQAogICAgICAgICByZXR1cm4gbU5vdGNvOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIHdyaXRhYmxlIGZpbGUgdW5kZXIgYSBkaWZmZXJlbnQgZmlsZW5hbWUuCiAgICAgICoKQEAgLTQzNSw3ICs0NzEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlICdjb21tZW50JyBjb21tYW5kCiAgICAgICoKQEAgLTQ3Miw0NiArNTA3LDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgICAgICAvKioKLSAgICAgKiAgLXJlc2VydmVkIGZsYWcgLS0gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHJlc2VydmVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRVNFUlZFRCA9ICItcmVzZXJ2ZWQiOwotICAgICAgICAvKioKLSAgICAgKiAgLXJlc2VydmVkIGZsYWcgLS0gY2hlY2sgb3V0IHRoZSBmaWxlIGFzIHVucmVzZXJ2ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1VOUkVTRVJWRUQgPSAiLXVucmVzZXJ2ZWQiOwotICAgICAgICAvKioKLSAgICAgKiAtb3V0IGZsYWcgLS0gY3JlYXRlIGEgd3JpdGFibGUgZmlsZSB1bmRlciBhIGRpZmZlcmVudCBmaWxlbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT1VUID0gIi1vdXQiOwotICAgICAgICAvKioKLSAgICAgKiAtbmRhdGEgZmxhZyAtLSBjaGVja3Mgb3V0IHRoZSBmaWxlIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYW4gZWRpdGFibGUgZmlsZSBjb250YWluaW5nIGl0cyBkYXRhCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0RBVEEgPSAiLW5kYXRhIjsKLSAgICAgICAgLyoqCi0gICAgICogLWJyYW5jaCBmbGFnIC0tIGNoZWNrcyBvdXQgdGhlIGZpbGUgb24gYSBzcGVjaWZpZWQgYnJhbmNoCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19CUkFOQ0ggPSAiLWJyYW5jaCI7Ci0gICAgICAgIC8qKgotICAgICAqIC12ZXJzaW9uIGZsYWcgLS0gYWxsb3dzIGNoZWNrb3V0IG9mIGEgdmVyc2lvbiB0aGF0IGlzIG5vdCBtYWluIGxhdGVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7Ci0gICAgICAgIC8qKgotICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7Ci0gICAgICAgIC8qKgotICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgICAgICAvKioKLSAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKLSAgICAgICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwotCiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0xvY2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ0xvY2suamF2YQppbmRleCBiYTdkZWY3Li43OTY4Y2MzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NMb2NrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTG9jay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTkgKzE4LDE5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlOwogCitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwogCiAKLS8qKgorLyoKICAqIFRPRE86CiAgKiBjb21tZW50IGZpZWxkIGRvZXNuJ3QgaW5jbHVkZSBhbGwgb3B0aW9ucyB5ZXQKICAqLwogCi0KLQogLyoqCiAgKiBQZXJmb3JtcyBhIENsZWFyQ2FzZSBMb2NrIGNvbW1hbmQuCiAgKgpAQCAtODYsNiArODYsMzEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDQ0xvY2sgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqICAtcmVwbGFjZSBmbGFnIC0tIHJlcGxhY2UgZXhpc3RpbmcgbG9jayBvbiBvYmplY3QocykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOworCisgICAgLyoqCisgICAgICogLW51c2VycyBmbGFnIC0tIGxpc3Qgb2YgdXNlcnMgdG8gZXhjbHVkZSBmcm9tIGxvY2sKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05VU0VSUyA9ICItbnVzZXJzIjsKKworICAgIC8qKgorICAgICAqIC1vYnNvbGV0ZSBmbGFnIC0tIG1hcmsgbG9ja2VkIG9iamVjdCBhcyBvYnNvbGV0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfT0JTT0xFVEUgPSAiLW9ic29sZXRlIjsKKworICAgIC8qKgorICAgICAqIC1jb21tZW50IGZsYWcgLS0gbWV0aG9kIHRvIHVzZSBmb3IgY29tbWVudGluZyBldmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWNvbW1lbnQiOworCisgICAgLyoqCisgICAgICogLXBuYW1lIGZsYWcgLS0gcGF0aG5hbWUgdG8gbG9jaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUE5BTUUgPSAiLXBuYW1lIjsKKwogICAgIHByaXZhdGUgYm9vbGVhbiBtUmVwbGFjZSA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT2Jzb2xldGUgPSBmYWxzZTsKICAgICBwcml2YXRlIFN0cmluZyBtQ29tbWVudCA9IG51bGw7CkBAIC0xMDAsMTAgKzEyNSwxMCBAQAogICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKICAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAKICAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCiAgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKQEAgLTEyNiwxNyArMTUxLDE3IEBACiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCiAgICAgICAgICAgICAgICAgICAgICsgZ2V0T3BUeXBlKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBDaGVjayB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCiAgICAgICovCi1wcml2YXRlIHZvaWQgY2hlY2tPcHRpb25zKENvbW1hbmRsaW5lIGNtZCkgeworICAgIHByaXZhdGUgdm9pZCBjaGVja09wdGlvbnMoQ29tbWFuZGxpbmUgY21kKSB7CiAgICAgICAgIC8vIENsZWFyQ2FzZSBpdGVtcwogICAgICAgICBpZiAoZ2V0UmVwbGFjZSgpKSB7CiAgICAgICAgICAgICAvLyAtcmVwbGFjZQpAQCAtMTUxLDE1ICsxNzYsMTUgQEAKICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKIAogICAgICAgICBpZiAoZ2V0T2Jqc2VsZWN0KCkgPT0gbnVsbCAmJiBnZXRQbmFtZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2hvdWxkIHNlbGVjdCBlaXRoZXIgYW4gZWxlbWVudCAiCi0gICAgICAgICAgICArICIocG5hbWUpIG9yIGFuIG9iamVjdCAob2Jqc2VsZWN0KSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTaG91bGQgc2VsZWN0IGVpdGhlciBhbiBlbGVtZW50IChwbmFtZSkgb3IgYW4gb2JqZWN0IChvYmpzZWxlY3QpIik7CiAgICAgICAgIH0KICAgICAgICAgZ2V0UG5hbWVDb21tYW5kKGNtZCk7CiAgICAgICAgIC8vIG9iamVjdCBzZWxlY3RvcgogICAgICAgICBpZiAoZ2V0T2Jqc2VsZWN0KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0T2Jqc2VsZWN0KCkpOwogICAgICAgICB9Ci19CisgICAgfQogCiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgcmVwbGFjZSBhbiBleGlzdGluZyBsb2NrLgpAQCAtMjkwLDE1ICszMTUsMTQgQEAKICAgICBwcml2YXRlIHZvaWQgZ2V0TnVzZXJzQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKICAgICAgICAgaWYgKGdldE51c2VycygpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05VU0VSUyk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXROdXNlcnMoKSk7CiAgICAgICAgIH0KKyAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAqLworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05VU0VSUyk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldE51c2VycygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMxMCwxNSArMzM0LDE0IEBACiAgICAgcHJpdmF0ZSB2b2lkIGdldENvbW1lbnRDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewogICAgICAgICBpZiAoZ2V0Q29tbWVudCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Q29tbWVudCgpKTsKICAgICAgICAgfQorICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICovCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfQ09NTUVOVCk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMzAsMTUgKzM1MywxNCBAQAogICAgIHByaXZhdGUgdm9pZCBnZXRQbmFtZUNvbW1hbmQoQ29tbWFuZGxpbmUgY21kKSB7CiAgICAgICAgIGlmIChnZXRQbmFtZSgpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BOQU1FKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFBuYW1lKCkpOwogICAgICAgICB9CisgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcworICAgICAgICAgICBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBmbGFnIGFuZCB0aGUgdmFsdWUsIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCisgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KKyAgICAgICAgKi8KKyAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19QTkFNRSk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFBuYW1lKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQ3LDMzICszNjksNyBAQAogICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9iamVjdC9wbmFtZSBiZWluZyB3b3JrZWQgb24KICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBnZXRPcFR5cGUoKSB7Ci0KLSAgICAgICAgaWYgKGdldFBuYW1lKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGdldFBuYW1lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0T2Jqc2VsZWN0KCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0UG5hbWUoKSkub3JFbHNlR2V0KHRoaXM6OmdldE9ianNlbGVjdCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogIC1yZXBsYWNlIGZsYWcgLS0gcmVwbGFjZSBleGlzdGluZyBsb2NrIG9uIG9iamVjdChzKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVQTEFDRSA9ICItcmVwbGFjZSI7Ci0gICAgLyoqCi0gICAgICogLW51c2VycyBmbGFnIC0tIGxpc3Qgb2YgdXNlcnMgdG8gZXhjbHVkZSBmcm9tIGxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05VU0VSUyA9ICItbnVzZXJzIjsKLSAgICAvKioKLSAgICAgKiAtb2Jzb2xldGUgZmxhZyAtLSBtYXJrIGxvY2tlZCBvYmplY3QgYXMgb2Jzb2xldGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX09CU09MRVRFID0gIi1vYnNvbGV0ZSI7Ci0gICAgLyoqCi0gICAgICogLWNvbW1lbnQgZmxhZyAtLSBtZXRob2QgdG8gdXNlIGZvciBjb21tZW50aW5nIGV2ZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItY29tbWVudCI7Ci0gICAgLyoqCi0gICAgICogLXBuYW1lIGZsYWcgLS0gcGF0aG5hbWUgdG8gbG9jawotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUE5BTUUgPSAiLXBuYW1lIjsKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWthdHRyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2F0dHIuamF2YQppbmRleCA4OWI1NWY5Li4wNDE4YjljIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2F0dHIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2F0dHIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg0LDYgKzg0LDMxIEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ0NNa2F0dHIgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqIC1yZXBsYWNlIGZsYWcgLS0gcmVwbGFjZSB0aGUgZXhpc3RpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVQTEFDRSA9ICItcmVwbGFjZSI7CisgICAgLyoqCisgICAgICogLXJlY3Vyc2UgZmxhZyAtLSBwcm9jZXNzIGFsbCBzdWJkaXJlY3RvcmllcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVDVVJTRSA9ICItcmVjdXJzZSI7CisgICAgLyoqCisgICAgICogLXZlcnNpb24gZmxhZyAtLSBhdHRhY2ggYXR0cmlidXRlIHRvIHNwZWNpZmllZCB2ZXJzaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19WRVJTSU9OID0gIi12ZXJzaW9uIjsKKyAgICAvKioKKyAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKKyAgICAvKioKKyAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKKyAgICAvKioKKyAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlcGxhY2UgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbVJlY3Vyc2UgPSBmYWxzZTsKICAgICBwcml2YXRlIFN0cmluZyBtVmVyc2lvbiA9IG51bGw7CkBAIC05OSwxMCArMTI0LDEwIEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcwogICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKSB7CkBAIC0xMzIsMTAgKzE1NywxMCBAQAogICAgICAgICAvLyBGb3IgZGVidWdnaW5nCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbihjb21tYW5kTGluZS50b1N0cmluZygpKTsKIAotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpbnQgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKICAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjIsMTMgKzE4NywxMSBAQAogICAgICAgICBpZiAoZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIC8vIC1jCiAgICAgICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOworICAgICAgICB9IGVsc2UgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gLWNmaWxlCisgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyAtY2ZpbGUKLSAgICAgICAgICAgICAgICBnZXRDb21tZW50RmlsZUNvbW1hbmQoY21kKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT0NPTU1FTlQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGdldFR5cGVOYW1lKCkgIT0gbnVsbCkgewpAQCAtMTgzLDcgKzIwNiw2IEBACiAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFZpZXdQYXRoKCkpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSByZXBsYWNlIGZsYWcKICAgICAgKgpAQCAtMzEwLDcgKzMzMiw2IEBACiAgICAgICAgIHJldHVybiBtVHlwZVZhbHVlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSAndmVyc2lvbicgY29tbWFuZAogICAgICAqCkBAIC0zOTgsMjkgKzQxOSw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAtcmVwbGFjZSBmbGFnIC0tIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOwotICAgIC8qKgotICAgICAqIC1yZWN1cnNlIGZsYWcgLS0gcHJvY2VzcyBhbGwgc3ViZGlyZWN0b3JpZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFQ1VSU0UgPSAiLXJlY3Vyc2UiOwotICAgIC8qKgotICAgICAqIC12ZXJzaW9uIGZsYWcgLS0gYXR0YWNoIGF0dHJpYnV0ZSB0byBzcGVjaWZpZWQgdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7Ci0gICAgLyoqCi0gICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZWxlbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7Ci0gICAgLyoqCi0gICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7Ci0gICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2JsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2JsLmphdmEKaW5kZXggYWMwZjQyYi4uZWE3YzhhYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtibC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rYmwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgxLDYgKzgxLDM2IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ0NNa2JsIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKyAgICAvKioKKyAgICAgKiAtaWRlbnRpY2FsIGZsYWcgLS0gYWxsb3dzIHRoZSBmaWxlIHRvIGJlIGNoZWNrZWQgaW4gZXZlbiBpZiBpdCBpcyBpZGVudGljYWwgdG8gdGhlIG9yaWdpbmFsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19JREVOVElDQUwgPSAiLWlkZW50aWNhbCI7CisgICAgLyoqCisgICAgICogLWluY3JlbWVudGFsIGZsYWcgLS0gYmFzZWxpbmUgdG8gYmUgY3JlYXRlZCBpcyBpbmNyZW1lbnRhbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSU5DUkVNRU5UQUwgPSAiLWluY3JlbWVudGFsIjsKKyAgICAvKioKKyAgICAgKiAtZnVsbCBmbGFnIC0tIGJhc2VsaW5lIHRvIGJlIGNyZWF0ZWQgaXMgZnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRlVMTCA9ICItZnVsbCI7CisgICAgLyoqCisgICAgICogLW5sYWJlbCAtLSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIHdpdGhvdXQgYSBsYWJlbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTkxBQkVMID0gIi1ubGFiZWwiOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIG1DZmlsZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUJhc2VsaW5lUm9vdE5hbWUgPSBudWxsOwpAQCAtODksNyArMTE5LDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbUZ1bGwgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gbU5sYWJlbCA9IGZhbHNlOwogCi0KICAgICAvKioKICAgICAgKiBFeGVjdXRlcyB0aGUgdGFzay4KICAgICAgKiA8cD4KQEAgLTk3LDEwICsxMjYsMTAgQEAKICAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CiAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwogCiAgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAogICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CkBAIC0xMTksMTQgKzE0OCwxMyBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldEJhc2VsaW5lUm9vdE5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTM0LDEzICsxNjIsMTEgQEAKICAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyAtYwogICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gLWNmaWxlCi0gICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXRJZGVudGljYWwoKSkgewpAQCAtMTYzLDEwICsxODksOCBAQAogCiAgICAgICAgLy8gYmFzZWxpbmVfcm9vdF9uYW1lCiAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldEJhc2VsaW5lUm9vdE5hbWUoKSk7Ci0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCBjb21tZW50IHN0cmluZwogICAgICAqCkBAIC0yMjIsOCArMjQ2LDYgQEAKICAgICB9CiAKICAgICAvKioKLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgbm93YXJuIGZsYWcKICAgICAgKgogICAgICAqIEBwYXJhbSBud2FybiB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bwpAQCAtMjk1LDcgKzMxNyw2IEBACiAgICAgICAgIHJldHVybiBtTmxhYmVsOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAogICAgICAqCkBAIC0zMzIsMzUgKzM1Myw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLQotICAgICAgICAvKioKLSAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKLSAgICAgICAgLyoqCi0gICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7Ci0gICAgICAgIC8qKgotICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKLSAgICAgICAgLyoqCi0gICAgICogLWlkZW50aWNhbCBmbGFnIC0tIGFsbG93cyB0aGUgZmlsZSB0byBiZSBjaGVja2VkIGluIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBvcmlnaW5hbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSURFTlRJQ0FMID0gIi1pZGVudGljYWwiOwotICAgICAgIC8qKgotICAgICAqIC1pbmNyZW1lbnRhbCBmbGFnIC0tIGJhc2VsaW5lIHRvIGJlIGNyZWF0ZWQgaXMgaW5jcmVtZW50YWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0lOQ1JFTUVOVEFMID0gIi1pbmNyZW1lbnRhbCI7Ci0gICAgICAgLyoqCi0gICAgICogLWZ1bGwgZmxhZyAtLSBiYXNlbGluZSB0byBiZSBjcmVhdGVkIGlzIGZ1bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0ZVTEwgPSAiLWZ1bGwiOwotICAgICAgIC8qKgotICAgICAqIC1ubGFiZWwgLS0gYmFzZWxpbmUgdG8gYmUgY3JlYXRlZCB3aXRob3V0IGEgbGFiZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05MQUJFTCA9ICItbmxhYmVsIjsKLQotCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2Rpci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtkaXIuamF2YQppbmRleCA0NDFmZjUyLi5jYmIzZGRlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2Rpci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rZGlyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02NCw2ICs2NCwyMyBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENDTWtkaXIgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGRpcmVjdG9yeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKKyAgICAvKioKKyAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7CisgICAgLyoqCisgICAgICogLW5jbyBmbGFnIC0tIGRvIG5vdCBjaGVja291dCBlbGVtZW50IGFmdGVyIGNyZWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NIRUNLT1VUID0gIi1uY28iOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgIG1Db21tZW50ID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyAgbUNmaWxlICAgPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBtTm9jbyAgICA9IGZhbHNlOwpAQCAtNzUsMTAgKzkyLDEwIEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKICAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgewpAQCAtOTcsMTAgKzExNCwxMCBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTExLDEzICsxMjgsMTEgQEAKICAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyAtYwogICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gLWNmaWxlCi0gICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0Tm9DaGVja291dCgpKSB7CiAgICAgICAgICAgICAvLyAtbmNvCkBAIC0xODEsNyArMTk2LDYgQEAKICAgICAgICAgcmV0dXJuIG1Ob2NvOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSAnY29tbWVudCcgY29tbWFuZAogICAgICAqCkBAIC0yMTgsMjEgKzIzMiw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgIC8qKgotICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBkaXJlY3RvcnkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7Ci0gICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwotICAgIC8qKgotICAgICAqIC1uY28gZmxhZyAtLSBkbyBub3QgY2hlY2tvdXQgZWxlbWVudCBhZnRlciBjcmVhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DSEVDS09VVCA9ICItbmNvIjsKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtlbGVtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2VsZW0uamF2YQppbmRleCA1M2QyZjBiLi5kNWZlYWRkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2VsZW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2VsZW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTg5LDYgKzg5LDQzIEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ0NNa2VsZW0gZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKyAgICAvKioKKyAgICAgKiAtbndhcm4gZmxhZyAtLSBzdXBwcmVzc2VzIHdhcm5pbmcgbWVzc2FnZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PV0FSTiA9ICItbndhcm4iOworICAgIC8qKgorICAgICAqIC1wdGltZSBmbGFnIC0tIHByZXNlcnZlcyB0aGUgbW9kaWZpY2F0aW9uIHRpbWUgb24gY2hlY2tpbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7CisgICAgLyoqCisgICAgICogLW5jbyBmbGFnIC0tIGRvIG5vdCBjaGVja291dCBlbGVtZW50IGFmdGVyIGNyZWF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NIRUNLT1VUID0gIi1uY28iOworICAgIC8qKgorICAgICAqIC1jaSBmbGFnIC0tIGNoZWNraW4gZWxlbWVudCBhZnRlciBjcmVhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ0hFQ0tJTiA9ICItY2kiOworICAgIC8qKgorICAgICAqIC1tYXN0ZXIgZmxhZyAtLSBjaGFuZ2UgbWFzdGVyc2hpcCBvZiBtYWluIGJyYW5jaCB0byBjdXJyZW50IHNpdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX01BU1RFUiA9ICItbWFzdGVyIjsKKyAgICAvKioKKyAgICAgKiAtZWx0eXBlIGZsYWcgLS0gZWxlbWVudCB0eXBlIHRvIHVzZSBkdXJpbmcgY3JlYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0VMVFlQRSA9ICItZWx0eXBlIjsKKwogICAgIHByaXZhdGUgU3RyaW5nICBtQ29tbWVudCA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgIG1DZmlsZSAgID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gbU53YXJuICAgPSBmYWxzZTsKQEAgLTEwNSwxMCArMTQyLDEwIEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBEZWZhdWx0IHRoZSB2aWV3cGF0aCB0byBiYXNlZGlyIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKICAgICAgICAgaWYgKGdldFZpZXdQYXRoKCkgPT0gbnVsbCkgewpAQCAtMTI3LDE0ICsxNjQsMTMgQEAKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKICAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENoZWNrIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KICAgICAgKi8KQEAgLTE0MiwxMyArMTc4LDExIEBACiAgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gLWMKICAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIC1jZmlsZQotICAgICAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZ2V0Tm9XYXJuKCkpIHsKQEAgLTMzMCw3ICszNjQsNiBAQAogICAgICAgICByZXR1cm4gbUVsdHlwZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgJ2NvbW1lbnQnIGNvbW1hbmQKICAgICAgKgpAQCAtMzg1LDQxICs0MTgsNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7Ci0gICAgLyoqCi0gICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7Ci0gICAgLyoqCi0gICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOwotICAgIC8qKgotICAgICAqIC1ud2FybiBmbGFnIC0tIHN1cHByZXNzZXMgd2FybmluZyBtZXNzYWdlcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9XQVJOID0gIi1ud2FybiI7Ci0gICAgLyoqCi0gICAgICogLXB0aW1lIGZsYWcgLS0gcHJlc2VydmVzIHRoZSBtb2RpZmljYXRpb24gdGltZSBvbiBjaGVja2luCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QUkVTRVJWRVRJTUUgPSAiLXB0aW1lIjsKLSAgICAvKioKLSAgICAgKiAtbmNvIGZsYWcgLS0gZG8gbm90IGNoZWNrb3V0IGVsZW1lbnQgYWZ0ZXIgY3JlYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ0hFQ0tPVVQgPSAiLW5jbyI7Ci0gICAgLyoqCi0gICAgICogLWNpIGZsYWcgLS0gY2hlY2tpbiBlbGVtZW50IGFmdGVyIGNyZWF0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DSEVDS0lOID0gIi1jaSI7Ci0gICAgLyoqCi0gICAgICogLW1hc3RlciBmbGFnIC0tIGNoYW5nZSBtYXN0ZXJzaGlwIG9mIG1haW4gYnJhbmNoIHRvIGN1cnJlbnQgc2l0ZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTUFTVEVSID0gIi1tYXN0ZXIiOwotICAgIC8qKgotICAgICAqIC1lbHR5cGUgZmxhZyAtLSBlbGVtZW50IHR5cGUgdG8gdXNlIGR1cmluZyBjcmVhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRUxUWVBFID0gIi1lbHR5cGUiOwogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xhYmVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xhYmVsLmphdmEKaW5kZXggYjFhOTY4Ni4uMTVmMWQwOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYWJlbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rbGFiZWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgzLDYgKzgzLDMxIEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ0NNa2xhYmVsIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICAvKioKKyAgICAgKiAtcmVwbGFjZSBmbGFnIC0tIHJlcGxhY2UgYW5vdGhlciBsYWJlbCBvZiB0aGUgc2FtZSB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRVBMQUNFID0gIi1yZXBsYWNlIjsKKyAgICAvKioKKyAgICAgKiAtcmVjdXJzZSBmbGFnIC0tIHByb2Nlc3MgYWxsIHN1YmRpcmVjdG9yaWVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRUNVUlNFID0gIi1yZWN1cnNlIjsKKyAgICAvKioKKyAgICAgKiAtdmVyc2lvbiBmbGFnIC0tIGF0dGFjaCBsYWJlbCB0byBzcGVjaWZpZWQgdmVyc2lvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7CisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZXBsYWNlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWN1cnNlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVZlcnNpb24gPSBudWxsOwpAQCAtOTgsMTAgKzEyMywxMCBAQAogICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKICAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAKICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGF0dHJpYnV0ZXMKICAgICAgICAgaWYgKGdldFR5cGVOYW1lKCkgPT0gbnVsbCkgewpAQCAtMTI1LDEwICsxNTAsMTAgQEAKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIklnbm9yaW5nIGFueSBlcnJvcnMgdGhhdCBvY2N1ciBmb3I6ICIKICAgICAgICAgICAgICAgICAgICAgKyBnZXRWaWV3UGF0aEJhc2VuYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1NSwxMyArMTgwLDExIEBACiAgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gLWMKICAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIC1jZmlsZQotICAgICAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSAhPSBudWxsKSB7CkBAIC0xNzMsNyArMTk2LDYgQEAKICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZ2V0Vmlld1BhdGgoKSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIHJlcGxhY2UgZmxhZwogICAgICAqCkBAIC0zMDAsNyArMzIyLDYgQEAKICAgICAgICAgcmV0dXJuIG1WT0I7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlICd2ZXJzaW9uJyBjb21tYW5kCiAgICAgICoKQEAgLTM2MiwxMCArMzgzLDkgQEAKICAgICAgKiAgICAgICAgd2l0aG91dCB0aGUgdHlwZS1uYW1lCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGdldFR5cGVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewotICAgICAgICBTdHJpbmcgdHlwZW5tID0gbnVsbDsKIAogICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0eXBlbm0gPSBnZXRUeXBlTmFtZSgpOworICAgICAgICAgICAgU3RyaW5nIHR5cGVubSA9IGdldFR5cGVOYW1lKCk7CiAgICAgICAgICAgICBpZiAoZ2V0Vk9CKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHR5cGVubSArPSAiQCIgKyBnZXRWT0IoKTsKICAgICAgICAgICAgIH0KQEAgLTM3MywzMSArMzkzLDQgQEAKICAgICAgICAgfQogICAgIH0KIAotCi0gICAgLyoqCi0gICAgICogLXJlcGxhY2UgZmxhZyAtLSByZXBsYWNlIGFub3RoZXIgbGFiZWwgb2YgdGhlIHNhbWUgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVQTEFDRSA9ICItcmVwbGFjZSI7Ci0gICAgLyoqCi0gICAgICogLXJlY3Vyc2UgZmxhZyAtLSBwcm9jZXNzIGFsbCBzdWJkaXJlY3RvcmllcwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUkVDVVJTRSA9ICItcmVjdXJzZSI7Ci0gICAgLyoqCi0gICAgICogLXZlcnNpb24gZmxhZyAtLSBhdHRhY2ggbGFiZWwgdG8gc3BlY2lmaWVkIHZlcnNpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOwotICAgIC8qKgotICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgIC8qKgotICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOwotICAgIC8qKgotICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKLQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xidHlwZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDTWtsYnR5cGUuamF2YQppbmRleCAwNGRiOWNkLi4yNzI0ZWM4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NNa2xidHlwZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ01rbGJ0eXBlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC05NSw2ICs5NSwzOSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENDTWtsYnR5cGUgZXh0ZW5kcyBDbGVhckNhc2UgeworICAgIC8qKgorICAgICAqIC1yZXBsYWNlIGZsYWcgLS0gcmVwbGFjZSBleGlzdGluZyBsYWJlbCBkZWZpbml0aW9uIG9mIHRoZSBzYW1lIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOworICAgIC8qKgorICAgICAqIC1nbG9iYWwgZmxhZyAtLSBjcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGlzIGdsb2JhbCB0byB0aGUgVk9CIG9yIHRvIFZPQnMgdGhhdCB1c2UgdGhpcyBWT0IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0dMT0JBTCA9ICItZ2xvYmFsIjsKKyAgICAvKioKKyAgICAgKiAtb3JkaW5hcnkgZmxhZyAtLSBjcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIGN1cnJlbnQgVk9CCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PUkRJTkFSWSA9ICItb3JkaW5hcnkiOworICAgIC8qKgorICAgICAqIC1wYnJhbmNoIGZsYWcgLS0gYWxsb3dzIGxhYmVsIHR5cGUgdG8gYmUgdXNlZCBvbmNlIHBlciBicmFuY2gKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BCUkFOQ0ggPSAiLXBicmFuY2giOworICAgIC8qKgorICAgICAqIC1zaGFyZWQgZmxhZyAtLSBzZXRzIHRoZSB3YXkgbWFzdGVyc2hpcCBpcyBjaGVja2VkIGJ5IENsZWFyQ2FzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU0hBUkVEID0gIi1zaGFyZWQiOworICAgIC8qKgorICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOworICAgIC8qKgorICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOworICAgIC8qKgorICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1UeXBlTmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbVZPQiA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOwpAQCAtMTEyLDkgKzE0NSw5IEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcwogICAgICAgICBpZiAoZ2V0VHlwZU5hbWUoKSA9PSBudWxsKSB7CkBAIC0xMzMsMTQgKzE2NiwxMyBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFR5cGVTcGVjaWZpZXIoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTUzLDExICsxODUsOSBAQAogICAgICAgICBpZiAoZ2V0T3JkaW5hcnkoKSkgewogICAgICAgICAgICAgLy8gLW9yZGluYXJ5CiAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09SRElOQVJZKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRHbG9iYWwoKSkgewotICAgICAgICAgICAgICAgIC8vIC1nbG9iYWwKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0dMT0JBTCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0R2xvYmFsKCkpIHsKKyAgICAgICAgICAgIC8vIC1nbG9iYWwKKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfR0xPQkFMKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXRQYnJhbmNoKCkpIHsKQEAgLTE3MywyMCArMjAzLDE3IEBACiAgICAgICAgIGlmIChnZXRDb21tZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gLWMKICAgICAgICAgICAgIGdldENvbW1lbnRDb21tYW5kKGNtZCk7CisgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyAtY2ZpbGUKKyAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbW1lbnRGaWxlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIC1jZmlsZQotICAgICAgICAgICAgICAgIGdldENvbW1lbnRGaWxlQ29tbWFuZChjbWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX05PQ09NTUVOVCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB0eXBlLW5hbWVAdm9iCiAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldFR5cGVTcGVjaWZpZXIoKSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdHlwZS1uYW1lIHN0cmluZwogICAgICAqCkBAIC0zNDksNyArMzc2LDYgQEAKICAgICAgICAgcmV0dXJuIG1DZmlsZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgJ2NvbW1lbnQnIGNvbW1hbmQKICAgICAgKgpAQCAtMzkzLDQ5ICs0MTksMTEgQEAKICAgICAgKiAgICAgICAgIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZwogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGdldFR5cGVTcGVjaWZpZXIoKSB7Ci0gICAgICAgIFN0cmluZyB0eXBlbm0gPSBudWxsOwotCi0gICAgICAgIHR5cGVubSA9IGdldFR5cGVOYW1lKCk7CisgICAgICAgIFN0cmluZyB0eXBlbm0gPSBnZXRUeXBlTmFtZSgpOwogICAgICAgICBpZiAoZ2V0Vk9CKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgdHlwZW5tICs9ICJAIiArIGdldFZPQigpOwogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHR5cGVubTsKICAgICB9CiAKLQotICAgIC8qKgotICAgICAqIC1yZXBsYWNlIGZsYWcgLS0gcmVwbGFjZSBleGlzdGluZyBsYWJlbCBkZWZpbml0aW9uIG9mIHRoZSBzYW1lIHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JFUExBQ0UgPSAiLXJlcGxhY2UiOwotICAgIC8qKgotICAgICAqIC1nbG9iYWwgZmxhZyAtLSBjcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGlzIGdsb2JhbCB0byB0aGUgVk9CIG9yIHRvIFZPQnMgdGhhdCB1c2UgdGhpcyBWT0IKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0dMT0JBTCA9ICItZ2xvYmFsIjsKLSAgICAvKioKLSAgICAgKiAtb3JkaW5hcnkgZmxhZyAtLSBjcmVhdGVzIGEgbGFiZWwgdHlwZSB0aGF0IGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIGN1cnJlbnQgVk9CCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PUkRJTkFSWSA9ICItb3JkaW5hcnkiOwotICAgIC8qKgotICAgICAqIC1wYnJhbmNoIGZsYWcgLS0gYWxsb3dzIGxhYmVsIHR5cGUgdG8gYmUgdXNlZCBvbmNlIHBlciBicmFuY2gKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BCUkFOQ0ggPSAiLXBicmFuY2giOwotICAgIC8qKgotICAgICAqIC1zaGFyZWQgZmxhZyAtLSBzZXRzIHRoZSB3YXkgbWFzdGVyc2hpcCBpcyBjaGVja2VkIGJ5IENsZWFyQ2FzZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfU0hBUkVEID0gIi1zaGFyZWQiOwotICAgIC8qKgotICAgICAqIC1jIGZsYWcgLS0gY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWMiOwotICAgIC8qKgotICAgICAqIC1jZmlsZSBmbGFnIC0tIGZpbGUgY29udGFpbmluZyBhIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5URklMRSA9ICItY2ZpbGUiOwotICAgIC8qKgotICAgICAqIC1uYyBmbGFnIC0tIG5vIGNvbW1lbnQgaXMgc3BlY2lmaWVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT0NPTU1FTlQgPSAiLW5jIjsKLQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NSbXR5cGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1JtdHlwZS5qYXZhCmluZGV4IDgyYTllNjMuLmQzYmVhZGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1JtdHlwZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1JtdHlwZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtODcsNiArODcsMzEgQEAKICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDQ1JtdHlwZSBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgLyoqCisgICAgICogLWlnbm9yZSBmbGFnIC0tIGlnbm9yZSBwcmUtdHJpZ2dlciBvcGVyYXRpb25zIHdoZW4gcmVtb3ZpbmcgYSB0cmlnZ2VyIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0lHTk9SRSA9ICItaWdub3JlIjsKKyAgICAvKioKKyAgICAgKiAtcm1hbGwgZmxhZyAtLSByZW1vdmVzIGFsbCBpbnN0YW5jZXMgb2YgYSB0eXBlIGFuZCB0aGUgdHlwZSBvYmplY3QgaXRzZWxmCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19STUFMTCA9ICItcm1hbGwiOworICAgIC8qKgorICAgICAqIC1mb3JjZSBmbGFnIC0tIHN1cHByZXNzZXMgY29uZmlybWF0aW9uIHByb21wdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0ZPUkNFID0gIi1mb3JjZSI7CisgICAgLyoqCisgICAgICogLWMgZmxhZyAtLSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVCA9ICItYyI7CisgICAgLyoqCisgICAgICogLWNmaWxlIGZsYWcgLS0gZmlsZSBjb250YWluaW5nIGEgY29tbWVudCB0byBhdHRhY2ggdG8gdGhlIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlRGSUxFID0gIi1jZmlsZSI7CisgICAgLyoqCisgICAgICogLW5jIGZsYWcgLS0gbm8gY29tbWVudCBpcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX05PQ09NTUVOVCA9ICItbmMiOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVR5cGVLaW5kID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyBtVHlwZU5hbWUgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIG1WT0IgPSBudWxsOwpAQCAtMTAyLDkgKzEyNyw5IEBACiAgICAgICogdG8gZXhlY3V0ZSB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgZmFpbHMgYW5kIGZhaWxvbmVyciBpcyBzZXQgdG8gdHJ1ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IG5ldyBDb21tYW5kbGluZSgpOwotICAgICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgICAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgYXR0cmlidXRlcwogICAgICAgICBpZiAoZ2V0VHlwZUtpbmQoKSA9PSBudWxsKSB7CkBAIC0xMjYsMTQgKzE1MSwxMyBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFR5cGVTcGVjaWZpZXIoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTUwLDEzICsxNzQsMTEgQEAKICAgICAgICAgaWYgKGdldENvbW1lbnQoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyAtYwogICAgICAgICAgICAgZ2V0Q29tbWVudENvbW1hbmQoY21kKTsKKyAgICAgICAgfSBlbHNlIGlmIChnZXRDb21tZW50RmlsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIC1jZmlsZQorICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29tbWVudEZpbGUoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gLWNmaWxlCi0gICAgICAgICAgICAgICAgZ2V0Q29tbWVudEZpbGVDb21tYW5kKGNtZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9DT01NRU5UKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHR5cGUta2luZDp0eXBlLW5hbWUKQEAgLTI5OCwxMCArMzIwLDkgQEAKICAgICBwcml2YXRlIFN0cmluZyBnZXRUeXBlU3BlY2lmaWVyKCkgewogICAgICAgICBTdHJpbmcgdGtpbmQgPSBnZXRUeXBlS2luZCgpOwogICAgICAgICBTdHJpbmcgdG5hbWUgPSBnZXRUeXBlTmFtZSgpOwotICAgICAgICBTdHJpbmcgdHlwZVNwZWMgPSBudWxsOwogCiAgICAgICAgIC8vIFJldHVybiB0aGUgdHlwZS1zZWxlY3RvcgotICAgICAgICB0eXBlU3BlYyA9IHRraW5kICsgIjoiICsgdG5hbWU7CisgICAgICAgIFN0cmluZyB0eXBlU3BlYyA9IHRraW5kICsgIjoiICsgdG5hbWU7CiAgICAgICAgIGlmIChnZXRWT0IoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0eXBlU3BlYyArPSAiQCIgKyBnZXRWT0IoKTsKICAgICAgICAgfQpAQCAtMzQ0LDMxICszNjUsNCBAQAogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvKioKLSAgICAgKiAtaWdub3JlIGZsYWcgLS0gaWdub3JlIHByZS10cmlnZ2VyIG9wZXJhdGlvbnMgd2hlbiByZW1vdmluZyBhIHRyaWdnZXIgdHlwZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfSUdOT1JFID0gIi1pZ25vcmUiOwotICAgIC8qKgotICAgICAqIC1ybWFsbCBmbGFnIC0tIHJlbW92ZXMgYWxsIGluc3RhbmNlcyBvZiBhIHR5cGUgYW5kIHRoZSB0eXBlIG9iamVjdCBpdHNlbGYKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JNQUxMID0gIi1ybWFsbCI7Ci0gICAgLyoqCi0gICAgICogLWZvcmNlIGZsYWcgLS0gc3VwcHJlc3NlcyBjb25maXJtYXRpb24gcHJvbXB0cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRk9SQ0UgPSAiLWZvcmNlIjsKLSAgICAvKioKLSAgICAgKiAtYyBmbGFnIC0tIGNvbW1lbnQgdG8gYXR0YWNoIHRvIHRoZSBmaWxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jIjsKLSAgICAvKioKLSAgICAgKiAtY2ZpbGUgZmxhZyAtLSBmaWxlIGNvbnRhaW5pbmcgYSBjb21tZW50IHRvIGF0dGFjaCB0byB0aGUgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfQ09NTUVOVEZJTEUgPSAiLWNmaWxlIjsKLSAgICAvKioKLSAgICAgKiAtbmMgZmxhZyAtLSBubyBjb21tZW50IGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfTk9DT01NRU5UID0gIi1uYyI7Ci0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVW5DaGVja291dC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVW5DaGVja291dC5qYXZhCmluZGV4IDZkN2U0ODguLmM4YmNiNjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VuQ2hlY2tvdXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbkNoZWNrb3V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NCw2ICs1NCwxNSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENDVW5DaGVja291dCBleHRlbmRzIENsZWFyQ2FzZSB7CisgICAgLyoqCisgICAgICogIC1rZWVwIGZsYWcgLS0ga2VlcCBhIGNvcHkgb2YgdGhlIGZpbGUgd2l0aCAua2VlcCBleHRlbnNpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0tFRVBDT1BZID0gIi1rZWVwIjsKKyAgICAvKioKKyAgICAgKiAgLXJtIGZsYWcgLS0gcmVtb3ZlIHRoZSBjb3B5IG9mIHRoZSBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19STSA9ICItcm0iOworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1LZWVwID0gZmFsc2U7CiAKICAgICAvKioKQEAgLTYzLDEwICs3MiwxMCBAQAogICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKICAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAKICAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCiAgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKQEAgLTg1LDE0ICs5NCwxMyBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zLgogICAgICAqLwpAQCAtMTI4LDE1ICsxMzYsNCBAQAogICAgICAgICByZXR1cm4gbUtlZXA7CiAgICAgfQogCi0KLSAgICAvKioKLSAgICAgKiAgLWtlZXAgZmxhZyAtLSBrZWVwIGEgY29weSBvZiB0aGUgZmlsZSB3aXRoIC5rZWVwIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfS0VFUENPUFkgPSAiLWtlZXAiOwotICAgIC8qKgotICAgICAqICAtcm0gZmxhZyAtLSByZW1vdmUgdGhlIGNvcHkgb2YgdGhlIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1JNID0gIi1ybSI7Ci0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVW5sb2NrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbmxvY2suamF2YQppbmRleCA3ZDcyNzI2Li40NDkzZDFlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbmxvY2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ0NVbmxvY2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKIAoraW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKIAotLyoqCisvKgogICogVE9ETzoKICAqIGNvbW1lbnQgZmllbGQgZG9lc24ndCBpbmNsdWRlIGFsbCBvcHRpb25zIHlldAogICovCkBAIC02OSw2ICs3MSwxNSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENDVW5sb2NrIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICAvKioKKyAgICAgKiAtY29tbWVudCBmbGFnIC0tIG1ldGhvZCB0byB1c2UgZm9yIGNvbW1lbnRpbmcgZXZlbnRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19DT01NRU5UID0gIi1jb21tZW50IjsKKyAgICAvKioKKyAgICAgKiAtcG5hbWUgZmxhZyAtLSBwYXRobmFtZSB0byBsb2NrCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19QTkFNRSA9ICItcG5hbWUiOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgbUNvbW1lbnQgPSBudWxsOwogICAgIHByaXZhdGUgU3RyaW5nIG1QbmFtZSA9IG51bGw7CiAKQEAgLTc5LDEwICs5MCwxMCBAQAogICAgICAqIHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQgbGluZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb21tYW5kIGZhaWxzIGFuZCBmYWlsb25lcnIgaXMgc2V0IHRvIHRydWUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKICAgICAgICAgUHJvamVjdCBhUHJvaiA9IGdldFByb2plY3QoKTsKLSAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAKICAgICAgICAgLy8gRGVmYXVsdCB0aGUgdmlld3BhdGggdG8gYmFzZWRpciBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCiAgICAgICAgIGlmIChnZXRWaWV3UGF0aCgpID09IG51bGwpIHsKQEAgLTEwNSwxMCArMTE2LDEwIEBACiAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJJZ25vcmluZyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgZm9yOiAiCiAgICAgICAgICAgICAgICAgICAgICsgZ2V0T3BUeXBlKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CisgICAgICAgIGludCByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOwogICAgICAgICBpZiAoRXhlY3V0ZS5pc0ZhaWx1cmUocmVzdWx0KSAmJiBnZXRGYWlsT25FcnIoKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgZXhlY3V0aW5nOiAiICsgY29tbWFuZExpbmUsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMCw4ICsxMzEsOCBAQAogICAgICAgICBnZXRDb21tZW50Q29tbWFuZChjbWQpOwogCiAgICAgICAgIGlmIChnZXRPYmpTZWxlY3QoKSA9PSBudWxsICYmIGdldFBuYW1lKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGQgc2VsZWN0IGVpdGhlciBhbiBlbGVtZW50ICIKLSAgICAgICAgICAgICsgIihwbmFtZSkgb3IgYW4gb2JqZWN0IChvYmpzZWxlY3QpIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNob3VsZCBzZWxlY3QgZWl0aGVyIGFuIGVsZW1lbnQgKHBuYW1lKSBvciBhbiBvYmplY3QgKG9ianNlbGVjdCkiKTsKICAgICAgICAgfQogICAgICAgICBnZXRQbmFtZUNvbW1hbmQoY21kKTsKICAgICAgICAgLy8gb2JqZWN0IHNlbGVjdG9yCkBAIC0yMDQsMTUgKzIxNSwxNCBAQAogICAgIHByaXZhdGUgdm9pZCBnZXRDb21tZW50Q29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKICAgICAgICAgaWYgKGdldENvbW1lbnQoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKLSAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCi0gICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19DT01NRU5UKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbW1lbnQoKSk7CiAgICAgICAgIH0KKyAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAqLworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NPTU1FTlQpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRDb21tZW50KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI0LDE1ICsyMzQsMTQgQEAKICAgICBwcml2YXRlIHZvaWQgZ2V0UG5hbWVDb21tYW5kKENvbW1hbmRsaW5lIGNtZCkgewogICAgICAgICBpZiAoZ2V0UG5hbWUoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKLSAgICAgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCi0gICAgICAgICAgICAgICBXaW5kb3dzIGZpbGVuYW1lIHdpdGggYSBzcGFjZSBhbmQgaXQgaXMgZW5jbG9zZWQgaW4gZG91YmxlCi0gICAgICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19QTkFNRSk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRQbmFtZSgpKTsKICAgICAgICAgfQorICAgICAgICAvKiBIYWQgdG8gbWFrZSB0d28gc2VwYXJhdGUgY29tbWFuZHMgaGVyZSBiZWNhdXNlIGlmIGEgc3BhY2UgaXMKKyAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKKyAgICAgICAgICAgV2luZG93cyBmaWxlbmFtZSB3aXRoIGEgc3BhY2UgYW5kIGl0IGlzIGVuY2xvc2VkIGluIGRvdWJsZQorICAgICAgICAgICBxdW90ZXMgKCIpLiBUaGlzIGJyZWFrcyBjbGVhcmNhc2UuCisgICAgICAgICovCisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUE5BTUUpOworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRQbmFtZSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI0MSwyMSArMjUwLDcgQEAKICAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHRoZSBvYmplY3QvcG5hbWUgYmVpbmcgd29ya2VkIG9uCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0T3BUeXBlKCkgewotCi0gICAgICAgIGlmIChnZXRQbmFtZSgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRQbmFtZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGdldE9ialNlbGVjdCgpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldFBuYW1lKCkpLm9yRWxzZUdldCh0aGlzOjpnZXRPYmpTZWxlY3QpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIC1jb21tZW50IGZsYWcgLS0gbWV0aG9kIHRvIHVzZSBmb3IgY29tbWVudGluZyBldmVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NPTU1FTlQgPSAiLWNvbW1lbnQiOwotICAgIC8qKgotICAgICAqIC1wbmFtZSBmbGFnIC0tIHBhdGhuYW1lIHRvIGxvY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX1BOQU1FID0gIi1wbmFtZSI7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DQ1VwZGF0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVXBkYXRlLmphdmEKaW5kZXggYThlZTg1MC4uNDU3ZDY4ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVXBkYXRlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NDVXBkYXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04MSw2ICs4MSwzNSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIENDVXBkYXRlIGV4dGVuZHMgQ2xlYXJDYXNlIHsKKyAgICAvKioKKyAgICAgKiAgLWdyYXBoaWNhbCBmbGFnIC0tIGRpc3BsYXkgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR1JBUEhJQ0FMID0gIi1ncmFwaGljYWwiOworICAgIC8qKgorICAgICAqIC1sb2cgZmxhZyAtLSBmaWxlIHRvIGxvZyBzdGF0dXMgdG8KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0xPRyA9ICItbG9nIjsKKyAgICAvKioKKyAgICAgKiAtb3ZlcndyaXRlIGZsYWcgLS0gb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PVkVSV1JJVEUgPSAiLW92ZXJ3cml0ZSI7CisgICAgLyoqCisgICAgICogLW5vdmVyd3JpdGUgZmxhZyAtLSBkbyBub3Qgb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT1ZFUldSSVRFID0gIi1ub3ZlcndyaXRlIjsKKyAgICAvKioKKyAgICAgKiAtcmVuYW1lIGZsYWcgLS0gcmVuYW1lIGhpamFja2VkIGZpbGVzIHdpdGggLmtlZXAgZXh0ZW5zaW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRU5BTUUgPSAiLXJlbmFtZSI7CisgICAgLyoqCisgICAgICogLWN0aW1lIGZsYWcgLS0gbW9kaWZpZWQgdGltZSBpcyB3cml0dGVuIGFzIHRoZSBjdXJyZW50IHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NVUlJFTlRUSU1FID0gIi1jdGltZSI7CisgICAgLyoqCisgICAgICogLXB0aW1lIGZsYWcgLS0gbW9kaWZpZWQgdGltZSBpcyB3cml0dGVuIGFzIHRoZSBWT0IgdGltZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbUdyYXBoaWNhbCA9IGZhbHNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcndyaXRlID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIG1SZW5hbWUgPSBmYWxzZTsKQEAgLTk1LDEwICsxMjQsMTAgQEAKICAgICAgKiB0byBleGVjdXRlIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgY29tbWFuZCBmYWlscyBhbmQgZmFpbG9uZXJyIGlzIHNldCB0byB0cnVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNvbW1hbmRMaW5lID0gbmV3IENvbW1hbmRsaW5lKCk7CiAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwogCiAgICAgICAgIC8vIERlZmF1bHQgdGhlIHZpZXdwYXRoIHRvIGJhc2VkaXIgaWYgaXQgaXMgbm90IHNwZWNpZmllZAogICAgICAgICBpZiAoZ2V0Vmlld1BhdGgoKSA9PSBudWxsKSB7CkBAIC0xMjEsMTAgKzE1MCwxMCBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiSWdub3JpbmcgYW55IGVycm9ycyB0aGF0IG9jY3VyIGZvcjogIgogICAgICAgICAgICAgICAgICAgICArIGdldFZpZXdQYXRoQmFzZW5hbWUoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKKyAgICAgICAgaW50IHJlc3VsdCA9IHJ1bihjb21tYW5kTGluZSk7CiAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpICYmIGdldEZhaWxPbkVycigpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZSwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQwLDI0ICsxNjksMjAgQEAKICAgICAgICAgICAgIGlmIChnZXRPdmVyd3JpdGUoKSkgewogICAgICAgICAgICAgICAgIC8vIC1vdmVyd3JpdGUKICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX09WRVJXUklURSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdldFJlbmFtZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gLXJlbmFtZQorICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUkVOQU1FKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFJlbmFtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC1yZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19SRU5BTUUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC1ub3ZlcndyaXRlCi0gICAgICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfTk9WRVJXUklURSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIC1ub3ZlcndyaXRlCisgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoRkxBR19OT1ZFUldSSVRFKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRUaW1lKCkpIHsKICAgICAgICAgICAgICAgICAvLyAtY3RpbWUKICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0NVUlJFTlRUSU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFByZXNlcnZlVGltZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIC1wdGltZQotICAgICAgICAgICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX1BSRVNFUlZFVElNRSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRQcmVzZXJ2ZVRpbWUoKSkgeworICAgICAgICAgICAgICAgIC8vIC1wdGltZQorICAgICAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKEZMQUdfUFJFU0VSVkVUSU1FKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gLWxvZyBsb2duYW1lCkBAIC0yNzksNyArMzA0LDYgQEAKICAgICAgICAgcmV0dXJuIG1Mb2c7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlICdsb2cnIGNvbW1hbmQKICAgICAgKgpAQCAtMjg4LDQ1ICszMTIsMTQgQEAKICAgICBwcml2YXRlIHZvaWQgZ2V0TG9nQ29tbWFuZChDb21tYW5kbGluZSBjbWQpIHsKICAgICAgICAgaWYgKGdldExvZygpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIEhhZCB0byBtYWtlIHR3byBzZXBhcmF0ZSBjb21tYW5kcyBoZXJlIGJlY2F1c2UgaWYgYSBzcGFjZSBpcwotICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgZmxhZyBhbmQgdGhlIHZhbHVlLCBpdCBpcyB0cmVhdGVkIGFzIGEKLSAgICAgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKLSAgICAgICAgICAgICAgIHF1b3RlcyAoIikuIFRoaXMgYnJlYWtzIGNsZWFyY2FzZS4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0xPRyk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRMb2coKSk7CiAgICAgICAgIH0KKyAgICAgICAgLyogSGFkIHRvIG1ha2UgdHdvIHNlcGFyYXRlIGNvbW1hbmRzIGhlcmUgYmVjYXVzZSBpZiBhIHNwYWNlIGlzCisgICAgICAgICAgIGluc2VydGVkIGJldHdlZW4gdGhlIGZsYWcgYW5kIHRoZSB2YWx1ZSwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgIFdpbmRvd3MgZmlsZW5hbWUgd2l0aCBhIHNwYWNlIGFuZCBpdCBpcyBlbmNsb3NlZCBpbiBkb3VibGUKKyAgICAgICAgICAgcXVvdGVzICgiKS4gVGhpcyBicmVha3MgY2xlYXJjYXNlLgorICAgICAgICAqLworICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShGTEFHX0xPRyk7CisgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldExvZygpKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiAgLWdyYXBoaWNhbCBmbGFnIC0tIGRpc3BsYXkgZ3JhcGhpY2FsIGRpYWxvZyBkdXJpbmcgdXBkYXRlIG9wZXJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfR1JBUEhJQ0FMID0gIi1ncmFwaGljYWwiOwotICAgIC8qKgotICAgICAqIC1sb2cgZmxhZyAtLSBmaWxlIHRvIGxvZyBzdGF0dXMgdG8KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0xPRyA9ICItbG9nIjsKLSAgICAvKioKLSAgICAgKiAtb3ZlcndyaXRlIGZsYWcgLS0gb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19PVkVSV1JJVEUgPSAiLW92ZXJ3cml0ZSI7Ci0gICAgLyoqCi0gICAgICogLW5vdmVyd3JpdGUgZmxhZyAtLSBkbyBub3Qgb3ZlcndyaXRlIGhpamFja2VkIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19OT1ZFUldSSVRFID0gIi1ub3ZlcndyaXRlIjsKLSAgICAvKioKLSAgICAgKiAtcmVuYW1lIGZsYWcgLS0gcmVuYW1lIGhpamFja2VkIGZpbGVzIHdpdGggLmtlZXAgZXh0ZW5zaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19SRU5BTUUgPSAiLXJlbmFtZSI7Ci0gICAgLyoqCi0gICAgICogLWN0aW1lIGZsYWcgLS0gbW9kaWZpZWQgdGltZSBpcyB3cml0dGVuIGFzIHRoZSBjdXJyZW50IHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0NVUlJFTlRUSU1FID0gIi1jdGltZSI7Ci0gICAgLyoqCi0gICAgICogLXB0aW1lIGZsYWcgLS0gbW9kaWZpZWQgdGltZSBpcyB3cml0dGVuIGFzIHRoZSBWT0IgdGltZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfUFJFU0VSVkVUSU1FID0gIi1wdGltZSI7Ci0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NsZWFyQ2FzZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvY2xlYXJjYXNlL0NsZWFyQ2FzZS5qYXZhCmluZGV4IDZlZWNjOGEuLjgzMTE0MjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2NsZWFyY2FzZS9DbGVhckNhc2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9jbGVhcmNhc2UvQ2xlYXJDYXNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTI5LDggKzMwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAotCi0KIC8qKgogICogQSBiYXNlIGNsYXNzIGZvciBjcmVhdGluZyB0YXNrcyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIG9uIENsZWFyQ2FzZS4KICAqIDxwPgpAQCAtNDYsMTUxICs0NSw2IEBACiAgKgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYXJDYXNlIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbUNsZWFyVG9vbERpciA9ICIiOwotICAgIHByaXZhdGUgU3RyaW5nIG12aWV3UGF0aCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbW9ialNlbGVjdCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBpbnQgcGNudCA9IDA7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1GYWlsb25lcnIgPSB0cnVlOwotICAgIC8qKgotICAgICAqIFNldCB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBjbGVhcnRvb2wgZXhlY3V0YWJsZSBpcyBsb2NhdGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIGRpciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2xlYXJUb29sRGlyKFN0cmluZyBkaXIpIHsKLSAgICAgICAgbUNsZWFyVG9vbERpciA9IEZpbGVVdGlscy50cmFuc2xhdGVQYXRoKGRpcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRzIGFuZCByZXR1cm5zIHRoZSBjb21tYW5kIHN0cmluZyB0byBleGVjdXRlIGNsZWFydG9vbAotICAgICAqCi0gICAgICogQHJldHVybiBTdHJpbmcgY29udGFpbmluZyBwYXRoIHRvIHRoZSBleGVjdXRhYmxlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBnZXRDbGVhclRvb2xDb21tYW5kKCkgewotICAgICAgICBTdHJpbmcgdG9SZXR1cm4gPSBtQ2xlYXJUb29sRGlyOwotICAgICAgICBpZiAoIXRvUmV0dXJuLmVxdWFscygiIikgJiYgIXRvUmV0dXJuLmVuZHNXaXRoKCIvIikpIHsKLSAgICAgICAgICAgIHRvUmV0dXJuICs9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIHRvUmV0dXJuICs9IENMRUFSVE9PTF9FWEU7Ci0KLSAgICAgICAgcmV0dXJuIHRvUmV0dXJuOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgcGF0aCB0byB0aGUgaXRlbSBpbiBhIENsZWFyQ2FzZSB2aWV3IHRvIG9wZXJhdGUgb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdmlld1BhdGggUGF0aCB0byB0aGUgdmlldyBkaXJlY3Rvcnkgb3IgZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZpZXdQYXRoKFN0cmluZyB2aWV3UGF0aCkgewotICAgICAgICBtdmlld1BhdGggPSB2aWV3UGF0aDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBjbGVhcmNhc2UgdmlldwotICAgICAqCi0gICAgICogQHJldHVybiBtdmlld1BhdGgKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZpZXdQYXRoKCkgewotICAgICAgICByZXR1cm4gbXZpZXdQYXRoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFzZW5hbWUgcGF0aCBvZiB0aGUgaXRlbSBpbiBhIGNsZWFyY2FzZSB2aWV3Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIGJhc2VuYW1lCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRWaWV3UGF0aEJhc2VuYW1lKCkgewotICAgICAgICByZXR1cm4gKG5ldyBGaWxlKG12aWV3UGF0aCkpLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIG9iamVjdCB0byBvcGVyYXRlIG9uLgotICAgICAqCi0gICAgICogQHBhcmFtIG9ialNlbGVjdCBvYmplY3QgdG8gb3BlcmF0ZSBvbgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldE9ialNlbGVjdChTdHJpbmcgb2JqU2VsZWN0KSB7Ci0gICAgICAgIG1vYmpTZWxlY3QgPSBvYmpTZWxlY3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbgotICAgICAqCi0gICAgICogQHJldHVybiBtb2JqU2VsZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRPYmpTZWxlY3QoKSB7Ci0gICAgICAgIHJldHVybiBtb2JqU2VsZWN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQgYXJlIHJldHVybiBzdWNjZXNzIG9yIGZhaWx1cmUKLSAgICAgKiBAcGFyYW0gY21kIGNvbW1hbmQgbGluZSB0byBleGVjdXRlCi0gICAgICogQHJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIHN1YnByb2Nlc3Mgb3IgPGNvZGU+SU5WQUxJRDwvY29kZT4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IHJ1bihDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFByb2plY3QgYVByb2ogPSBnZXRQcm9qZWN0KCk7Ci0gICAgICAgICAgICBFeGVjdXRlIGV4ZQotICAgICAgICAgICAgICAgID0gbmV3IEV4ZWN1dGUobmV3IExvZ1N0cmVhbUhhbmRsZXIodGhpcywgUHJvamVjdC5NU0dfSU5GTywgUHJvamVjdC5NU0dfV0FSTikpOwotICAgICAgICAgICAgZXhlLnNldEFudFJ1bihhUHJvaik7Ci0gICAgICAgICAgICBleGUuc2V0V29ya2luZ0RpcmVjdG9yeShhUHJvai5nZXRCYXNlRGlyKCkpOwotICAgICAgICAgICAgZXhlLnNldENvbW1hbmRsaW5lKGNtZC5nZXRDb21tYW5kbGluZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBleGUuZXhlY3V0ZSgpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCByZXR1cm4gaXQncyBvdXRwdXQKLSAgICAgKiBAcGFyYW0gY21kbGluZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZQotICAgICAqIEByZXR1cm4gb3V0cHV0IG9mIHRoZSBjb21tYW5kIGxpbmUKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHR3byBhcmcgdmVyc2lvbiBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJ1blMoQ29tbWFuZGxpbmUgY21kbGluZSkgewotICAgICAgICByZXR1cm4gcnVuUyhjbWRsaW5lLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIHJldHVybiBpdCdzIG91dHB1dAotICAgICAqIEBwYXJhbSBjbWRsaW5lIGNvbW1hbmQgbGluZSB0byBleGVjdXRlCi0gICAgICogQHBhcmFtIGZhaWxPbkVycm9yIHdoZXRoZXIgdG8gZmFpbCB0aGUgYnVpbGQgaWYgdGhlIGNvbW1hbmQgZmFpbHMKLSAgICAgKiBAcmV0dXJuIG91dHB1dCBvZiB0aGUgY29tbWFuZCBsaW5lCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHJ1blMoQ29tbWFuZGxpbmUgY21kbGluZSwgYm9vbGVhbiBmYWlsT25FcnJvcikgewotICAgICAgICBTdHJpbmcgICBvdXRWICA9ICJvcHRzLmNjLnJ1blMub3V0cHV0IiArIHBjbnQrKzsKLSAgICAgICAgRXhlY1Rhc2sgZXhlICAgPSBuZXcgRXhlY1Rhc2sodGhpcyk7Ci0gICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZyA9IGV4ZS5jcmVhdGVBcmcoKTsKLQotICAgICAgICBleGUuc2V0RXhlY3V0YWJsZShjbWRsaW5lLmdldEV4ZWN1dGFibGUoKSk7Ci0gICAgICAgIGFyZy5zZXRMaW5lKENvbW1hbmRsaW5lLnRvU3RyaW5nKGNtZGxpbmUuZ2V0QXJndW1lbnRzKCkpKTsKLSAgICAgICAgZXhlLnNldE91dHB1dHByb3BlcnR5KG91dFYpOwotICAgICAgICBleGUuc2V0RmFpbG9uZXJyb3IoZmFpbE9uRXJyb3IpOwotICAgICAgICBleGUuZXhlY3V0ZSgpOwotCi0gICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkob3V0Vik7Ci0gICAgfQotICAgIC8qKgotICAgICAqIElmIHRydWUsIGNvbW1hbmQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gb24gZmFpbHVyZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWlsb25lcnIgdGhlIHN0YXR1cyB0byBzZXQgdGhlIGZsYWcgdG8KLSAgICAgKiBAc2luY2UgYW50IDEuNi4xCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyKGJvb2xlYW4gZmFpbG9uZXJyKSB7Ci0gICAgICAgIG1GYWlsb25lcnIgPSBmYWlsb25lcnI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGZhaWxvbmVyciBmbGFnIHN0YXR1cwotICAgICAqCi0gICAgICogQHJldHVybiBib29sZWFuIGNvbnRhaW5pbmcgc3RhdHVzIG9mIGZhaWxvbmVyciBmbGFnCi0gICAgICogQHNpbmNlIGFudCAxLjYuMQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldEZhaWxPbkVycigpIHsKLSAgICAgICAgcmV0dXJuIG1GYWlsb25lcnI7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnQgZm9yIHRoZSB0aGluZyB0byBleGVjdXRlCiAgICAgICovCkBAIC0yNTIsNSArMTA2LDE1MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTUtESVIgPSAibWtkaXIiOwogCi19CisgICAgcHJpdmF0ZSBTdHJpbmcgbUNsZWFyVG9vbERpciA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIG12aWV3UGF0aCA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgbW9ialNlbGVjdCA9IG51bGw7CisgICAgcHJpdmF0ZSBpbnQgcGNudCA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIG1GYWlsb25lcnIgPSB0cnVlOwogCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNsZWFydG9vbCBleGVjdXRhYmxlIGlzIGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgY2xlYXJ0b29sIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRDbGVhclRvb2xEaXIoU3RyaW5nIGRpcikgeworICAgICAgICBtQ2xlYXJUb29sRGlyID0gRmlsZVV0aWxzLnRyYW5zbGF0ZVBhdGgoZGlyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGNvbW1hbmQgc3RyaW5nIHRvIGV4ZWN1dGUgY2xlYXJ0b29sCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyBjb250YWluaW5nIHBhdGggdG8gdGhlIGV4ZWN1dGFibGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldENsZWFyVG9vbENvbW1hbmQoKSB7CisgICAgICAgIFN0cmluZyB0b1JldHVybiA9IG1DbGVhclRvb2xEaXI7CisgICAgICAgIGlmICghdG9SZXR1cm4uaXNFbXB0eSgpICYmICF0b1JldHVybi5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICB0b1JldHVybiArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICB0b1JldHVybiArPSBDTEVBUlRPT0xfRVhFOworCisgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhdGggdG8gdGhlIGl0ZW0gaW4gYSBDbGVhckNhc2UgdmlldyB0byBvcGVyYXRlIG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdQYXRoIFBhdGggdG8gdGhlIHZpZXcgZGlyZWN0b3J5IG9yIGZpbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRWaWV3UGF0aChTdHJpbmcgdmlld1BhdGgpIHsKKyAgICAgICAgbXZpZXdQYXRoID0gdmlld1BhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIHRvIHRoZSBpdGVtIGluIGEgY2xlYXJjYXNlIHZpZXcKKyAgICAgKgorICAgICAqIEByZXR1cm4gbXZpZXdQYXRoCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWaWV3UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIG12aWV3UGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJhc2VuYW1lIHBhdGggb2YgdGhlIGl0ZW0gaW4gYSBjbGVhcmNhc2UgdmlldworICAgICAqCisgICAgICogQHJldHVybiBiYXNlbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Vmlld1BhdGhCYXNlbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRmlsZShtdmlld1BhdGgpKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvYmplY3QgdG8gb3BlcmF0ZSBvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmpTZWxlY3Qgb2JqZWN0IHRvIG9wZXJhdGUgb24KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRPYmpTZWxlY3QoU3RyaW5nIG9ialNlbGVjdCkgeworICAgICAgICBtb2JqU2VsZWN0ID0gb2JqU2VsZWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2JqZWN0IHRvIG9wZXJhdGUgb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9ialNlbGVjdAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T2JqU2VsZWN0KCkgeworICAgICAgICByZXR1cm4gbW9ialNlbGVjdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlIHRoZSBnaXZlbiBjb21tYW5kIGFyZSByZXR1cm4gc3VjY2VzcyBvciBmYWlsdXJlCisgICAgICogQHBhcmFtIGNtZCBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZQorICAgICAqIEByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBzdWJwcm9jZXNzIG9yIDxjb2RlPklOVkFMSUQ8L2NvZGU+CisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBydW4oQ29tbWFuZGxpbmUgY21kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQcm9qZWN0IGFQcm9qID0gZ2V0UHJvamVjdCgpOworICAgICAgICAgICAgRXhlY3V0ZSBleGUgPSBuZXcgRXhlY3V0ZSgKKyAgICAgICAgICAgICAgICBuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLCBQcm9qZWN0Lk1TR19JTkZPLCBQcm9qZWN0Lk1TR19XQVJOKSk7CisgICAgICAgICAgICBleGUuc2V0QW50UnVuKGFQcm9qKTsKKyAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGFQcm9qLmdldEJhc2VEaXIoKSk7CisgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOworICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGUgdGhlIGdpdmVuIGNvbW1hbmQsIGFuZCByZXR1cm4gaXQncyBvdXRwdXQKKyAgICAgKiBAcGFyYW0gY21kbGluZSBjb21tYW5kIGxpbmUgdG8gZXhlY3V0ZQorICAgICAqIEByZXR1cm4gb3V0cHV0IG9mIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHR3byBhcmcgdmVyc2lvbiBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJ1blMoQ29tbWFuZGxpbmUgY21kbGluZSkgeworICAgICAgICByZXR1cm4gcnVuUyhjbWRsaW5lLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZCwgYW5kIHJldHVybiBpdCdzIG91dHB1dAorICAgICAqIEBwYXJhbSBjbWRsaW5lIGNvbW1hbmQgbGluZSB0byBleGVjdXRlCisgICAgICogQHBhcmFtIGZhaWxPbkVycm9yIHdoZXRoZXIgdG8gZmFpbCB0aGUgYnVpbGQgaWYgdGhlIGNvbW1hbmQgZmFpbHMKKyAgICAgKiBAcmV0dXJuIG91dHB1dCBvZiB0aGUgY29tbWFuZCBsaW5lCisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJ1blMoQ29tbWFuZGxpbmUgY21kbGluZSwgYm9vbGVhbiBmYWlsT25FcnJvcikgeworICAgICAgICBTdHJpbmcgICBvdXRWICA9ICJvcHRzLmNjLnJ1blMub3V0cHV0IiArIHBjbnQrKzsKKyAgICAgICAgRXhlY1Rhc2sgZXhlICAgPSBuZXcgRXhlY1Rhc2sodGhpcyk7CisgICAgICAgIENvbW1hbmRsaW5lLkFyZ3VtZW50IGFyZyA9IGV4ZS5jcmVhdGVBcmcoKTsKKworICAgICAgICBleGUuc2V0RXhlY3V0YWJsZShjbWRsaW5lLmdldEV4ZWN1dGFibGUoKSk7CisgICAgICAgIGFyZy5zZXRMaW5lKENvbW1hbmRsaW5lLnRvU3RyaW5nKGNtZGxpbmUuZ2V0QXJndW1lbnRzKCkpKTsKKyAgICAgICAgZXhlLnNldE91dHB1dHByb3BlcnR5KG91dFYpOworICAgICAgICBleGUuc2V0RmFpbG9uZXJyb3IoZmFpbE9uRXJyb3IpOworICAgICAgICBleGUuZXhlY3V0ZSgpOworCisgICAgICAgIHJldHVybiBnZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkob3V0Vik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYgdHJ1ZSwgY29tbWFuZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBmYWlsdXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGZhaWxvbmVyciB0aGUgc3RhdHVzIHRvIHNldCB0aGUgZmxhZyB0bworICAgICAqIEBzaW5jZSBhbnQgMS42LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsT25FcnIoYm9vbGVhbiBmYWlsb25lcnIpIHsKKyAgICAgICAgbUZhaWxvbmVyciA9IGZhaWxvbmVycjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZmFpbG9uZXJyIGZsYWcgc3RhdHVzCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4gY29udGFpbmluZyBzdGF0dXMgb2YgZmFpbG9uZXJyIGZsYWcKKyAgICAgKiBAc2luY2UgYW50IDEuNi4xCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RmFpbE9uRXJyKCkgeworICAgICAgICByZXR1cm4gbUZhaWxvbmVycjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9BbnRBbmFseXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0FudEFuYWx5emVyLmphdmEKaW5kZXggMzQxZjY3MC4uNDZjNDU5NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0FudEFuYWx5emVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0FudEFuYWx5emVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNyArMTgsMTggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5aaXBSZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5BYnN0cmFjdEFuYWx5emVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGU7CiAKIC8qKgogICogQW4gYW5hbHl6ZXIgd2hpY2ggdXNlcyB0aGUgZGVwZW5kIHRhc2sncyBieXRlY29kZSBjbGFzc2VzIHRvIGFuYWx5emUKQEAgLTM2LDExICszNyw2IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgQW50QW5hbHl6ZXIgZXh0ZW5kcyBBYnN0cmFjdEFuYWx5emVyIHsKLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEFudEFuYWx5emVyKCkgewotICAgIH0KIAogICAgIC8qKgogICAgICAqIERldGVybWluZSB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBjb25maWd1cmVkIHJvb3QgY2xhc3Nlcy4KQEAgLTUwLDg1ICs0Niw1NiBAQAogICAgICAqIEBwYXJhbSBjbGFzc2VzIGEgdmVjdG9yIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKICAgICAgKiAgICAgIGRlcGVuZGVuY3kgY2xhc3Nlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoVmVjdG9yPEZpbGU+IGZpbGVzLCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzKSB7CiAgICAgICAgIC8vIHdlIGdldCB0aGUgcm9vdCBjbGFzc2VzIGFuZCBidWlsZCB1cCBhIHNldCBvZgogICAgICAgICAvLyBjbGFzc2VzIHVwb24gd2hpY2ggdGhleSBkZXBlbmQKLSAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBIYXNodGFibGU8RmlsZSwgRmlsZT4gY29udGFpbmVycyA9IG5ldyBIYXNodGFibGU8RmlsZSwgRmlsZT4oKTsKLSAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiB0b0FuYWx5emUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGdldFJvb3RDbGFzc2VzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7Ci0gICAgICAgIH0KKyAgICAgICAgU2V0PFN0cmluZz4gZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBTZXQ8RmlsZT4gY29udGFpbmVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gdG9BbmFseXplID0gbmV3IEhhc2hTZXQ8PihDb2xsZWN0aW9ucy5saXN0KGdldFJvb3RDbGFzc2VzKCkpKTsKKyAgICAgICAgU2V0PFN0cmluZz4gYW5hbHl6ZWREZXBzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgIGludCBtYXhDb3VudCA9IGlzQ2xvc3VyZVJlcXVpcmVkKCkgPyBNQVhfTE9PUFMgOiAxOwotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGFuYWx5emVkRGVwcyA9IG51bGw7Ci0gICAgICAgIHdoaWxlICh0b0FuYWx5emUuc2l6ZSgpICE9IDAgJiYgY291bnQrKyA8IG1heENvdW50KSB7Ci0gICAgICAgICAgICBhbmFseXplZERlcHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxTdHJpbmc+IGUgPSB0b0FuYWx5emUua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7CisgICAgICAgIHdoaWxlICghdG9BbmFseXplLmlzRW1wdHkoKSAmJiBjb3VudCsrIDwgbWF4Q291bnQpIHsKKyAgICAgICAgICAgIGFuYWx5emVkRGVwcy5jbGVhcigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NuYW1lIDogdG9BbmFseXplKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmVyID0gbnVsbDsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGNvbnRhaW5lciA9IGdldENsYXNzQ29udGFpbmVyKGNsYXNzbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGFpbmVycy5wdXQoY29udGFpbmVyLCBjb250YWluZXIpOwotCi0gICAgICAgICAgICAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShjb250YWluZXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwRmlsZSA9IG5ldyBaaXBGaWxlKGNvbnRhaW5lci5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gemlwRmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0ZpbGUgY2xhc3NGaWxlID0gbmV3IENsYXNzRmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NGaWxlLnJlYWQoaW5TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZGVwZW5kZW5jeSA6IGNsYXNzRmlsZS5nZXRDbGFzc1JlZnMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emVkRGVwcy5wdXQoZGVwZW5kZW5jeSwgZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW5TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHppcEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgPSBnZXRDbGFzc0NvbnRhaW5lcihjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpblN0cmVhbSA9IGNvbnRhaW5lci5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGaWxlcy5uZXdJbnB1dFN0cmVhbShQYXRocy5nZXQoY29udGFpbmVyLmdldFBhdGgoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBaaXBSZXNvdXJjZS5nZXRaaXBFbnRyeVN0cmVhbShuZXcgWmlwRmlsZShjb250YWluZXIuZ2V0UGF0aCgpLCAiVVRGLTgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzRmlsZSBjbGFzc0ZpbGUgPSBuZXcgQ2xhc3NGaWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0ZpbGUucmVhZChpblN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXplZERlcHMuYWRkQWxsKGNsYXNzRmlsZS5nZXRDbGFzc1JlZnMoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRvQW5hbHl6ZS5jbGVhcigpOwotCiAgICAgICAgICAgICAvLyBub3cgcmVjb3ZlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBjb2xsZWN0ZWQgYW5kIGFkZCB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IGFuYWx5emVkRGVwcy52YWx1ZXMoKSkgewotICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc05hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5hbHl6ZWREZXBzLnN0cmVhbSgpLmZpbHRlcihjbGFzc05hbWUgLT4gIWRlcGVuZGVuY2llcy5jb250YWlucyhjbGFzc05hbWUpKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh0b0FuYWx5emU6OmFkZCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBwaWNrIHVwIHRoZSBsYXN0IHJvdW5kIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdlcmUgZGV0ZXJtaW5lZAotICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBhbmFseXplZERlcHMudmFsdWVzKCkpIHsKLSAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NOYW1lLCBjbGFzc05hbWUpOwotICAgICAgICB9CisgICAgICAgIGRlcGVuZGVuY2llcy5hZGRBbGwoYW5hbHl6ZWREZXBzKTsKIAogICAgICAgICBmaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGNvbnRhaW5lcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgfQotCisgICAgICAgIGZpbGVzLmFkZEFsbChjb250YWluZXJzKTsKICAgICAgICAgY2xhc3Nlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKFN0cmluZyBkZXBlbmRlbmN5IDpkZXBlbmRlbmNpZXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGNsYXNzZXMuYWRkKGRlcGVuZGVuY3kpOwotICAgICAgICB9CisgICAgICAgIGNsYXNzZXMuYWRkQWxsKGRlcGVuZGVuY2llcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzYsOSArMTAzLDkgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5hbHl6ZXIgcHJvdmlkZXMgZGVwZW5kZW5jeSBmaWxlIGluZm9ybWF0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzRmlsZURlcGVuZGVuY2llcygpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGUuamF2YQppbmRleCA4NThjZTAzLi40YTkwNzQ0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTksOCArNTksOCBAQAogICAgICAgICBEYXRhSW5wdXRTdHJlYW0gY2xhc3NTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKHN0cmVhbSk7CiAKICAgICAgICAgaWYgKGNsYXNzU3RyZWFtLnJlYWRJbnQoKSAhPSBDTEFTU19NQUdJQykgewotICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzRm9ybWF0RXJyb3IoIk5vIE1hZ2ljIENvZGUgRm91bmQgIgotICAgICAgICAgICAgICAgICsgIi0gcHJvYmFibHkgbm90IGEgSmF2YSBjbGFzcyBmaWxlLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzRm9ybWF0RXJyb3IoCisgICAgICAgICAgICAgICAgIk5vIE1hZ2ljIENvZGUgRm91bmQgLSBwcm9iYWJseSBub3QgYSBKYXZhIGNsYXNzIGZpbGUuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyByaWdodCB3ZSBoYXZlIGEgZ29vZCBsb29raW5nIGNsYXNzIGZpbGUuCkBAIC04MSw3ICs4MSw2IEBACiAgICAgICAgIGNsYXNzTmFtZSAgPSBjbGFzc0luZm8uZ2V0Q2xhc3NOYW1lKCk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGNsYXNzZXMgd2hpY2ggdGhpcyBjbGFzcyByZWZlcmVuY2VzLgogICAgICAqCkBAIC04OSw3ICs4OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldENsYXNzUmVmcygpIHsKIAotICAgICAgICBWZWN0b3I8U3RyaW5nPiBjbGFzc1JlZnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gY2xhc3NSZWZzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAgICAgZmluYWwgaW50IHNpemUgPSBjb25zdGFudFBvb2wuc2l6ZSgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgewpAQCAtMTE4LDQgKzExNywzIEBACiAgICAgICAgIHJldHVybiBDbGFzc0ZpbGVVdGlscy5jb252ZXJ0U2xhc2hOYW1lKGNsYXNzTmFtZSk7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlSXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCmluZGV4IDkyZmMxOTEuLjAxOTlkZDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVJdGVyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTEgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kOwogCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCiAvKioKICAqIEl0ZXJhdG9yIGludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgYSBzZXQgb2YgY2xhc3MgZmlsZXMKICAqCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2xhc3NGaWxlSXRlcmF0b3IgeworcHVibGljIGludGVyZmFjZSBDbGFzc0ZpbGVJdGVyYXRvciBleHRlbmRzIEl0ZXJhYmxlPENsYXNzRmlsZT4gewogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBuZXh0IGNsYXNzIGZpbGUgaW4gdGhlIGl0ZXJhdGlvbgpAQCAtMjksNSArMzIsMzMgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGNsYXNzIGZpbGUgaW4gdGhlIGl0ZXJhdGlvbgogICAgICAqLwogICAgIENsYXNzRmlsZSBnZXROZXh0Q2xhc3NGaWxlKCk7Ci19CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IEl0ZXJhdG9yPENsYXNzRmlsZT4gaXRlcmF0b3IoKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxDbGFzc0ZpbGU+KCkgeworICAgICAgICAgICAgQ2xhc3NGaWxlIG5leHQ7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGdldE5leHRDbGFzc0ZpbGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENsYXNzRmlsZSBuZXh0KCkgeworICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGdldE5leHRDbGFzc0ZpbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NGaWxlVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVVdGlscy5qYXZhCmluZGV4IGM2ZWVjNmMuLjI0NWI3OTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVVdGlscy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDksNCArNDksMyBAQAogICAgICAgICByZXR1cm4gZG90TmFtZS5yZXBsYWNlKCcuJywgJy8nKTsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmQuamF2YQppbmRleCA5OWE0OWM0Li5iZWIyZDZmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsOSArMjQsMTcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudENsYXNzTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMzcsNiArNDUsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMuV0xSbWljOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLkRlcGVuZGVuY3lBbmFseXplcjsKIApAQCAtNzQsMjYgKzg1LDIzIEBACiAgICAgLyoqIFRoZSBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgdGhlIGRlcGVuZGVuY3kgY2FjaGUuICovCiAgICAgcHJpdmF0ZSBGaWxlIGNhY2hlOwogCi0gICAgLyoqIFRoZSBsaXN0IG9mIHNvdXJjZSBwYXRocyBkZXJpdmVkIGZyb20gdGhlIHNyY1BhdGggZmllbGQuICovCi0gICAgcHJpdmF0ZSBTdHJpbmdbXSBzcmNQYXRoTGlzdDsKLQogICAgIC8qKgogICAgICAqIEEgbWFwIHdoaWNoIGdpdmVzIGZvciBldmVyeSBjbGFzcyBhIGxpc3Qgb2YgdGhlIGNsYXNzIHdoaWNoIGl0CiAgICAgICogYWZmZWN0cy4KICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBhZmZlY3RlZENsYXNzTWFwOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPFN0cmluZywgQ2xhc3NGaWxlSW5mbz4+IGFmZmVjdGVkQ2xhc3NNYXA7CiAKICAgICAvKiogQSBtYXAgd2hpY2ggZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIGNsYXNzRmlsZUluZm9NYXA7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGFzc0ZpbGVJbmZvPiBjbGFzc0ZpbGVJbmZvTWFwOwogCiAgICAgLyoqCiAgICAgICogQSBtYXAgd2hpY2ggZ2l2ZXMgdGhlIGxpc3Qgb2YgamFycyBhbmQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc3BhdGgKICAgICAgKiB0aGF0IGEgY2xhc3MgZGVwZW5kcyB1cG9uCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgY2xhc3NwYXRoRGVwZW5kZW5jaWVzOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU2V0PEZpbGU+PiBjbGFzc3BhdGhEZXBlbmRlbmNpZXM7CiAKICAgICAvKiogVGhlIGxpc3Qgb2YgY2xhc3NlcyB3aGljaCBhcmUgb3V0IG9mIGRhdGUuICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgb3V0T2ZEYXRlQ2xhc3NlczsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gb3V0T2ZEYXRlQ2xhc3NlczsKIAogICAgIC8qKgogICAgICAqIGluZGljYXRlcyB0aGF0IHRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgc2hvdWxkIGJlIGV4dGVuZGVkIGJleW9uZApAQCAtMTgyLDI5ICsxOTAsMjQgQEAKICAgICAgKiBAcmV0dXJuIGEgY29sbGVjdGlvbiBvZiBjbGFzcyBkZXBlbmRlbmNpZXMKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZSBkZXBlbmRlbmN5IGZpbGUgY2Fubm90IGJlIHJlYWQKICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSByZWFkQ2FjaGVkRGVwZW5kZW5jaWVzKEZpbGUgZGVwRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlYWRDYWNoZWREZXBlbmRlbmNpZXMoRmlsZSBkZXBGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZGVwRmlsZSkpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBudWxsOwotICAgICAgICAgICAgaW50IHByZXBlbmRMZW5ndGggPSBDTEFTU05BTUVfUFJFUEVORC5sZW5ndGgoKTsKKyAgICAgICAgaW50IHByZXBlbmRMZW5ndGggPSBDTEFTU05BTUVfUFJFUEVORC5sZW5ndGgoKTsKKworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGRlcEZpbGUpKSkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOwogICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0YXJ0c1dpdGgoQ0xBU1NOQU1FX1BSRVBFTkQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBsaW5lLnN1YnN0cmluZyhwcmVwZW5kTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU1hcC5wdXQoY2xhc3NOYW1lLCBkZXBlbmRlbmN5TGlzdCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBsaW5lLnN1YnN0cmluZyhwcmVwZW5kTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QgPSBkZXBlbmRlbmN5TWFwLmNvbXB1dGVJZkFic2VudChjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3lMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QuYWRkRWxlbWVudChsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QuYWRkKGxpbmUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZGVwZW5kZW5jeU1hcDsKICAgICB9CiAKQEAgLTIxNCwzMiArMjE3LDIxIEBACiAgICAgICogQHBhcmFtIGRlcGVuZGVuY3lNYXAgdGhlIG1hcCBvZiBkZXBlbmRlbmNpZXMgdG8gYmUgd3JpdHRlbiBvdXQuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZGVwZW5kZW5jeSBmaWxlIGNhbm5vdCBiZSB3cml0dGVuIG91dC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVDYWNoZWREZXBlbmRlbmNpZXMoSGFzaHRhYmxlIGRlcGVuZGVuY3lNYXApCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2FjaGVkRGVwZW5kZW5jaWVzKE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZGVwZW5kZW5jeU1hcCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHB3ID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgY2FjaGUubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgRmlsZSBkZXBGaWxlID0gbmV3IEZpbGUoY2FjaGUsIENBQ0hFX0ZJTEVfTkFNRSk7Ci0KLSAgICAgICAgICAgICAgICBwdyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihkZXBGaWxlKSk7Ci0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGRlcGVuZGVuY3lNYXAua2V5cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcHcud3JpdGUoQ0xBU1NOQU1FX1BSRVBFTkQgKyBjbGFzc05hbWUpOwotICAgICAgICAgICAgICAgICAgICBwdy5uZXdMaW5lKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICA9IChWZWN0b3IpIGRlcGVuZGVuY3lNYXAuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gZGVwZW5kZW5jeUxpc3Quc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHcud3JpdGUoU3RyaW5nLnZhbHVlT2YoZGVwZW5kZW5jeUxpc3QuZWxlbWVudEF0KHgpKSk7CisgICAgICAgICAgICBjYWNoZS5ta2RpcnMoKTsKKyAgICAgICAgICAgIEZpbGUgZGVwRmlsZSA9IG5ldyBGaWxlKGNhY2hlLCBDQUNIRV9GSUxFX05BTUUpOworICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBwdyA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGRlcEZpbGUpKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogZGVwZW5kZW5jeU1hcAorICAgICAgICAgICAgICAgICAgICAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBwdy53cml0ZShTdHJpbmcuZm9ybWF0KCIlcyVzJW4iLCBDTEFTU05BTUVfUFJFUEVORCwgZS5nZXRLZXkoKSkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdy53cml0ZShzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHB3Lm5ld0xpbmUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHB3KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1NCwyNyArMjQ2LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZ1tdIGRlc3RQYXRoRWxlbWVudHMgPSBkZXN0UGF0aC5saXN0KCk7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzcGF0aEVsZW1lbnRzID0gZGVwZW5kQ2xhc3NwYXRoLmxpc3QoKTsKLSAgICAgICAgU3RyaW5nIGNoZWNrUGF0aCA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzcGF0aEVsZW1lbnRzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZWxlbWVudCA9IGNsYXNzcGF0aEVsZW1lbnRzW2ldOwotICAgICAgICAgICAgYm9vbGVhbiBpbkRlc3RQYXRoID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc3RQYXRoRWxlbWVudHMubGVuZ3RoICYmICFpbkRlc3RQYXRoOyArK2opIHsKLSAgICAgICAgICAgICAgICBpbkRlc3RQYXRoID0gZGVzdFBhdGhFbGVtZW50c1tqXS5lcXVhbHMoZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWluRGVzdFBhdGgpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hlY2tQYXRoLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tQYXRoID0gZWxlbWVudDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGVja1BhdGggKz0gIjoiICsgZWxlbWVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgU2V0PFJlc291cmNlPiBkZXBlbmROb3RJbkRlc3QgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgICAgIGRlcGVuZENsYXNzcGF0aC5mb3JFYWNoKGRlcGVuZE5vdEluRGVzdDo6YWRkKTsKKyAgICAgICAgZGVzdFBhdGguZm9yRWFjaChkZXBlbmROb3RJbkRlc3Q6OnJlbW92ZSk7CiAKLSAgICAgICAgUGF0aCBwID0gbnVsbDsKLSAgICAgICAgaWYgKGNoZWNrUGF0aC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHAgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCksIGNoZWNrUGF0aCk7CisgICAgICAgIFBhdGggcDsKKyAgICAgICAgaWYgKGRlcGVuZE5vdEluRGVzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHAgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CisgICAgICAgICAgICBkZXBlbmROb3RJbkRlc3QuZm9yRWFjaChwOjphZGQpOwogICAgICAgICB9CiAKICAgICAgICAgbG9nKCJDbGFzc3BhdGggd2l0aG91dCBkZXN0IGRpciBpcyAiICsgcCwgUHJvamVjdC5NU0dfREVCVUcpOwpAQCAtMzAwLDExICsyODEsMTEgQEAKICAgICAgKiAgICAgIGZpbGVzIGNhbm5vdCBiZSByZWFkIG9yIHdyaXR0ZW4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYWZmZWN0ZWRDbGFzc01hcCA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgY2xhc3NGaWxlSW5mb01hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgYWZmZWN0ZWRDbGFzc01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgY2xhc3NGaWxlSW5mb01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgYm9vbGVhbiBjYWNoZURpcnR5ID0gZmFsc2U7CiAKLSAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY3lNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZGVwZW5kZW5jeU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgRmlsZSBjYWNoZUZpbGUgPSBudWxsOwogICAgICAgICBib29sZWFuIGNhY2hlRmlsZUV4aXN0cyA9IHRydWU7CiAgICAgICAgIGxvbmcgY2FjaGVMYXN0TW9kaWZpZWQgPSBMb25nLk1BWF9WQUxVRTsKQEAgLTMxOCwxMyArMjk5LDExIEBACiAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU1hcCA9IHJlYWRDYWNoZWREZXBlbmRlbmNpZXMoY2FjaGVGaWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc2ZpbGVFbnVtID0gZ2V0Q2xhc3NGaWxlcyhkZXN0UGF0aCkuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGNsYXNzZmlsZUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIENsYXNzRmlsZUluZm8gaW5mbyA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc2ZpbGVFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgIGZvciAoQ2xhc3NGaWxlSW5mbyBpbmZvIDogZ2V0Q2xhc3NGaWxlcygpKSB7CiAgICAgICAgICAgICBsb2coIkFkZGluZyBjbGFzcyBpbmZvIGZvciAiICsgaW5mby5jbGFzc05hbWUsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgIGNsYXNzRmlsZUluZm9NYXAucHV0KGluZm8uY2xhc3NOYW1lLCBpbmZvKTsKIAotICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gbnVsbDsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZXBlbmRlbmN5TGlzdCA9IG51bGw7CiAKICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIHJlYWQgdGhlIGRlcGVuZGVuY3kgaW5mbyBmcm9tIHRoZSBtYXAgaWYgaXQgaXMKQEAgLTMzMyw3ICszMTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjYWNoZUxhc3RNb2RpZmllZCA+IGluZm8uYWJzb2x1dGVGaWxlLmxhc3RNb2RpZmllZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlcEZpbGUgZXhpc3RzIGFuZCBpcyBuZXdlciB0aGFuIHRoZSBjbGFzcyBmaWxlCiAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZ2V0IGRlcGVuZGVuY3kgbGlzdCBmcm9tIHRoZSBtYXAuCi0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gKFZlY3RvcikgZGVwZW5kZW5jeU1hcC5nZXQoaW5mby5jbGFzc05hbWUpOworICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5TGlzdCA9IGRlcGVuZGVuY3lNYXAuZ2V0KGluZm8uY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTM0MywzMiArMzIyLDE5IEBACiAgICAgICAgICAgICAgICAgYW5hbHl6ZXIuYWRkUm9vdENsYXNzKGluZm8uY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgICBhbmFseXplci5hZGRDbGFzc1BhdGgoZGVzdFBhdGgpOwogICAgICAgICAgICAgICAgIGFuYWx5emVyLnNldENsb3N1cmUoZmFsc2UpOwotICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcEVudW0gPSBhbmFseXplci5nZXRDbGFzc0RlcGVuZGVuY2llcygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChkZXBFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZGVwRW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5TGlzdC5hZGRFbGVtZW50KG8pOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBpbmZvLmNsYXNzTmFtZSArICIgZGVwZW5kcyBvbiAiICsgbywKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUxpc3QgPSBDb2xsZWN0aW9ucy5saXN0KGFuYWx5emVyLmdldENsYXNzRGVwZW5kZW5jaWVzKCkpOworICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lMaXN0LmZvckVhY2gobyAtPiBsb2coIkNsYXNzICIgKyBpbmZvLmNsYXNzTmFtZSArICIgZGVwZW5kcyBvbiAiICsgbywKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKSk7CiAgICAgICAgICAgICAgICAgY2FjaGVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeU1hcC5wdXQoaW5mby5jbGFzc05hbWUsIGRlcGVuZGVuY3lMaXN0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gVGhpcyBjbGFzcyBkZXBlbmRzIG9uIGVhY2ggY2xhc3MgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdC4gRm9yIGVhY2gKICAgICAgICAgICAgIC8vIG9uZSBvZiB0aG9zZSwgYWRkIHRoaXMgY2xhc3MgaW50byB0aGVpciBhZmZlY3RlZCBjbGFzc2VzIGxpc3QKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGRlcEVudW0gPSBkZXBlbmRlbmN5TGlzdC5lbGVtZW50cygpOwotICAgICAgICAgICAgd2hpbGUgKGRlcEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZGVwZW5kZW50Q2xhc3MgPSAoU3RyaW5nKSBkZXBFbnVtLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgICAgICBIYXNodGFibGUgYWZmZWN0ZWRDbGFzc2VzCi0gICAgICAgICAgICAgICAgICAgID0gKEhhc2h0YWJsZSkgYWZmZWN0ZWRDbGFzc01hcC5nZXQoZGVwZW5kZW50Q2xhc3MpOwotICAgICAgICAgICAgICAgIGlmIChhZmZlY3RlZENsYXNzZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhZmZlY3RlZENsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NNYXAucHV0KGRlcGVuZGVudENsYXNzLCBhZmZlY3RlZENsYXNzZXMpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3Nlcy5wdXQoaW5mby5jbGFzc05hbWUsIGluZm8pOworICAgICAgICAgICAgZm9yIChTdHJpbmcgZGVwZW5kZW50Q2xhc3MgOiBkZXBlbmRlbmN5TGlzdCkgeworICAgICAgICAgICAgICAgIGFmZmVjdGVkQ2xhc3NNYXAKKyAgICAgICAgICAgICAgICAgICAgLmNvbXB1dGVJZkFic2VudChkZXBlbmRlbnRDbGFzcywgayAtPiBuZXcgSGFzaE1hcDw+KCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoaW5mby5jbGFzc05hbWUsIGluZm8pOwogICAgICAgICAgICAgICAgIGxvZyhkZXBlbmRlbnRDbGFzcyArICIgYWZmZWN0cyAiICsgaW5mby5jbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgIH0KQEAgLTM3OCwyMyArMzQ0LDE5IEBACiAgICAgICAgIFBhdGggY2hlY2tQYXRoID0gZ2V0Q2hlY2tDbGFzc1BhdGgoKTsKICAgICAgICAgaWYgKGNoZWNrUGF0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAvLyBub3cgZGV0ZXJtaW5lIHdoaWNoIGphcnMgZWFjaCBjbGFzcyBkZXBlbmRzIHVwb24KLSAgICAgICAgICAgIGNsYXNzcGF0aERlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvYWRlciA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjaGVja1BhdGgpOworICAgICAgICAgICAgY2xhc3NwYXRoRGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgdHJ5IChBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2hlY2tQYXRoKSkgewogCi0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIGNsYXNzcGF0aEZpbGVDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNsYXNzcGF0aEZpbGVDYWNoZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICBPYmplY3QgbnVsbEZpbGVNYXJrZXIgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gZGVwZW5kZW5jeU1hcC5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBkZXBlbmRlbmN5TWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGUuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiRGV0ZXJtaW5pbmcgY2xhc3NwYXRoIGRlcGVuZGVuY2llcyBmb3IgIiArIGNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yIGRlcGVuZGVuY3lMaXN0ID0gKFZlY3RvcikgZGVwZW5kZW5jeU1hcC5nZXQoY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIGRlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRlcGVuZGVuY3lMaXN0ID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBTZXQ8RmlsZT4gZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhEZXBlbmRlbmNpZXMucHV0KGNsYXNzTmFtZSwgZGVwZW5kZW5jaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgRW51bWVyYXRpb24gZTIgPSBkZXBlbmRlbmN5TGlzdC5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZTIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXBlbmRlbmN5ID0gKFN0cmluZykgZTIubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZGVwZW5kZW5jeSA6IGRlcGVuZGVuY3lMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkxvb2tpbmcgZm9yICIgKyBkZXBlbmRlbmN5LCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgY2xhc3NwYXRoRmlsZU9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY2xhc3NwYXRoRmlsZUNhY2hlLmdldChkZXBlbmRlbmN5KTsKQEAgLTQwNywyMiArMzY5LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGxvYWRlci5nZXRSZXNvdXJjZShkZXBlbmRlbmN5LnJlcGxhY2UoJy4nLCAnLycpICsgIi5jbGFzcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVSTCBpcyAiICsgY2xhc3NVUkwsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzVVJMICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc1VSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiamFyIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgiamFyIi5lcXVhbHMoY2xhc3NVUkwuZ2V0UHJvdG9jb2woKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgamFyRmlsZVBhdGggPSBjbGFzc1VSTC5nZXRGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsYXNzTWFya2VyID0gamFyRmlsZVBhdGguaW5kZXhPZignIScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphckZpbGVQYXRoID0gamFyRmlsZVBhdGguc3Vic3RyaW5nKDAsIGNsYXNzTWFya2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamFyRmlsZVBhdGguc3RhcnRzV2l0aCgiZmlsZToiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc3BhdGhGaWxlT2JqZWN0ID0gbmV3IEZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZnJvbVVSSShqYXJGaWxlUGF0aCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb21VUkkoamFyRmlsZVBhdGgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQml6YXJyZSBuZXN0ZWQgcGF0aCBpbiBqYXI6IHByb3RvY29sOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphckZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCaXphcnJlIG5lc3RlZCBwYXRoIGluIGphcjogcHJvdG9jb2w6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphckZpbGVQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYXNzVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoImZpbGUiLmVxdWFscyhjbGFzc1VSTC5nZXRQcm90b2NvbCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzcGF0aEZpbGVPYmplY3QgPSBuZXcgRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tVVJJKGNsYXNzVVJMLnRvRXh0ZXJuYWxGb3JtKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmZyb21VUkkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1VSTC50b0V4dGVybmFsRm9ybSgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBjbGFzc05hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZGVwZW5kcyBvbiAiICsgY2xhc3NwYXRoRmlsZU9iamVjdApAQCAtNDM5LDE0ICs0MDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGphckZpbGUgPSAoRmlsZSkgY2xhc3NwYXRoRmlsZU9iamVjdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkFkZGluZyBhIGNsYXNzcGF0aCBkZXBlbmRlbmN5IG9uICIgKyBqYXJGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1dChqYXJGaWxlLCBqYXJGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGphckZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9hZGVyLmNsZWFudXAoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsb2coIk5vIGNsYXNzcGF0aCB0byBjaGVjayIsIFByb2plY3QuTVNHX0RFQlVHKTsKQEAgLTQ2NiwxMSArNDI1LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBkZWxldGVBbGxBZmZlY3RlZEZpbGVzKCkgewogICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBvdXRPZkRhdGVDbGFzc2VzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICBmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBvdXRPZkRhdGVDbGFzc2VzLmtleVNldCgpKSB7CiAgICAgICAgICAgICBjb3VudCArPSBkZWxldGVBZmZlY3RlZEZpbGVzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGNsYXNzSW5mbwotICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGNsYXNzRmlsZUluZm9NYXAuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGNsYXNzSW5mbyA9IGNsYXNzRmlsZUluZm9NYXAuZ2V0KGNsYXNzTmFtZSk7CiAgICAgICAgICAgICBpZiAoY2xhc3NJbmZvICE9IG51bGwgJiYgY2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIGlmIChjbGFzc0luZm8uc291cmNlRmlsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIHdhcm5PdXRPZkRhdGVCdXROb3REZWxldGVkKGNsYXNzSW5mbywgY2xhc3NOYW1lLCBjbGFzc05hbWUpOwpAQCAtNDkzLDE0ICs0NTAsMTMgQEAKICAgICBwcml2YXRlIGludCBkZWxldGVBZmZlY3RlZEZpbGVzKFN0cmluZyBjbGFzc05hbWUpIHsKICAgICAgICAgaW50IGNvdW50ID0gMDsKIAotICAgICAgICBIYXNodGFibGUgYWZmZWN0ZWRDbGFzc2VzID0gKEhhc2h0YWJsZSkgYWZmZWN0ZWRDbGFzc01hcC5nZXQoY2xhc3NOYW1lKTsKKyAgICAgICAgTWFwPFN0cmluZywgQ2xhc3NGaWxlSW5mbz4gYWZmZWN0ZWRDbGFzc2VzID0gYWZmZWN0ZWRDbGFzc01hcC5nZXQoY2xhc3NOYW1lKTsKICAgICAgICAgaWYgKGFmZmVjdGVkQ2xhc3NlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gYWZmZWN0ZWRDbGFzc2VzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBhZmZlY3RlZENsYXNzID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBhZmZlY3RlZENsYXNzSW5mbwotICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGFmZmVjdGVkQ2xhc3Nlcy5nZXQoYWZmZWN0ZWRDbGFzcyk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ2xhc3NGaWxlSW5mbz4gZSA6IGFmZmVjdGVkQ2xhc3Nlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYWZmZWN0ZWRDbGFzcyA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGFmZmVjdGVkQ2xhc3NJbmZvID0gZS5nZXRWYWx1ZSgpOwogCiAgICAgICAgICAgICBpZiAoIWFmZmVjdGVkQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNTI2LDEyICs0ODIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVsZXRlIHRoZSBtYWluIGNsYXNzCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRvcExldmVsQ2xhc3NOYW1lCi0gICAgICAgICAgICAgICAgICAgID0gYWZmZWN0ZWRDbGFzcy5zdWJzdHJpbmcoMCwgYWZmZWN0ZWRDbGFzcy5pbmRleE9mKCIkIikpOworICAgICAgICAgICAgICAgIFN0cmluZyB0b3BMZXZlbENsYXNzTmFtZSA9IGFmZmVjdGVkQ2xhc3Muc3Vic3RyaW5nKDAsIGFmZmVjdGVkQ2xhc3MuaW5kZXhPZigiJCIpKTsKICAgICAgICAgICAgICAgICBsb2coIlRvcCBsZXZlbCBjbGFzcyA9ICIgKyB0b3BMZXZlbENsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyB0b3BMZXZlbENsYXNzSW5mbwotICAgICAgICAgICAgICAgICAgICA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc0ZpbGVJbmZvTWFwLmdldCh0b3BMZXZlbENsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgID0gY2xhc3NGaWxlSW5mb01hcC5nZXQodG9wTGV2ZWxDbGFzc05hbWUpOwogICAgICAgICAgICAgICAgIGlmICh0b3BMZXZlbENsYXNzSW5mbyAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgICYmIHRvcExldmVsQ2xhc3NJbmZvLmFic29sdXRlRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgICAgICBsb2coIkRlbGV0aW5nIGZpbGUgIgpAQCAtNTc1LDggKzUzMCw4IEBACiAgICAgICAgIGxvZygiVGhlIGNsYXNzICIgKyBhZmZlY3RlZENsYXNzICsgIiBpbiBmaWxlICIKICAgICAgICAgICAgICsgYWZmZWN0ZWRDbGFzc0luZm8uYWJzb2x1dGVGaWxlLmdldFBhdGgoKQogICAgICAgICAgICAgKyAiIGlzIG91dCBvZiBkYXRlIGR1ZSB0byAiICsgY2xhc3NOYW1lCi0gICAgICAgICAgICArICIgYnV0IGhhcyBub3QgYmVlbiBkZWxldGVkIGJlY2F1c2UgaXRzIHNvdXJjZSBmaWxlIgotICAgICAgICAgICAgKyAiIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIiwgbGV2ZWwpOworICAgICAgICAgICAgKyAiIGJ1dCBoYXMgbm90IGJlZW4gZGVsZXRlZCBiZWNhdXNlIGl0cyBzb3VyY2UgZmlsZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCIsCisgICAgICAgICAgICBsZXZlbCk7CiAgICAgICAgIGFmZmVjdGVkQ2xhc3NJbmZvLmlzVXNlcldhcm5lZCA9IHRydWU7CiAgICAgfQogCkBAIC02MDQsNzUgKzU1OSw0OCBAQAogICAgICAgICBsb2coIlJldmVyc2UgRGVwZW5kZW5jeSBEdW1wIGZvciAiICsgYWZmZWN0ZWRDbGFzc01hcC5zaXplKCkKICAgICAgICAgICAgICsgIiBjbGFzc2VzOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKIAotICAgICAgICBFbnVtZXJhdGlvbiBjbGFzc0VudW0gPSBhZmZlY3RlZENsYXNzTWFwLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGNsYXNzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIGNsYXNzRW51bS5uZXh0RWxlbWVudCgpOworICAgICAgICBhZmZlY3RlZENsYXNzTWFwLmZvckVhY2goKGNsYXNzTmFtZSwgYWZmZWN0ZWRDbGFzc2VzKSAtPiB7CiAgICAgICAgICAgICBsb2coIiBDbGFzcyAiICsgY2xhc3NOYW1lICsgIiBhZmZlY3RzOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIEhhc2h0YWJsZSBhZmZlY3RlZENsYXNzZXMKLSAgICAgICAgICAgICAgICA9IChIYXNodGFibGUpIGFmZmVjdGVkQ2xhc3NNYXAuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBhZmZlY3RlZENsYXNzRW51bSA9IGFmZmVjdGVkQ2xhc3Nlcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoYWZmZWN0ZWRDbGFzc0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWZmZWN0ZWRDbGFzcyA9IChTdHJpbmcpIGFmZmVjdGVkQ2xhc3NFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvCi0gICAgICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGFmZmVjdGVkQ2xhc3Nlcy5nZXQoYWZmZWN0ZWRDbGFzcyk7Ci0gICAgICAgICAgICAgICAgbG9nKCIgICAgIiArIGFmZmVjdGVkQ2xhc3MgKyAiIGluICIKLSAgICAgICAgICAgICAgICAgICAgKyBpbmZvLmFic29sdXRlRmlsZS5nZXRQYXRoKCksIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgYWZmZWN0ZWRDbGFzc2VzLmZvckVhY2goKGFmZmVjdGVkQ2xhc3MsIGluZm8pIC0+IGxvZygKKyAgICAgICAgICAgICAgICAiICAgICIgKyBhZmZlY3RlZENsYXNzICsgIiBpbiAiICsgaW5mby5hYnNvbHV0ZUZpbGUuZ2V0UGF0aCgpLAorICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKSk7CisgICAgICAgIH0pOwogCiAgICAgICAgIGlmIChjbGFzc3BhdGhEZXBlbmRlbmNpZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgbG9nKCJDbGFzc3BhdGggZmlsZSBkZXBlbmRlbmNpZXMgKEZvcndhcmQpOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKIAotICAgICAgICAgICAgRW51bWVyYXRpb24gY2xhc3NwYXRoRW51bSA9IGNsYXNzcGF0aERlcGVuZGVuY2llcy5rZXlzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoY2xhc3NwYXRoRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc3BhdGhFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBjbGFzc3BhdGhEZXBlbmRlbmNpZXMuZm9yRWFjaCgoY2xhc3NOYW1lLCBkZXBlbmRlbmNpZXMpIC0+IHsKICAgICAgICAgICAgICAgICBsb2coIiBDbGFzcyAiICsgY2xhc3NOYW1lICsgIiBkZXBlbmRzIG9uOiIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICBIYXNodGFibGUgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAgICAgICAgID0gKEhhc2h0YWJsZSkgY2xhc3NwYXRoRGVwZW5kZW5jaWVzLmdldChjbGFzc05hbWUpOwotCi0gICAgICAgICAgICAgICAgRW51bWVyYXRpb24gY2xhc3NwYXRoRmlsZUVudW0gPSBkZXBlbmRlbmNpZXMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY2xhc3NwYXRoRmlsZUVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjbGFzc3BhdGhGaWxlID0gKEZpbGUpIGNsYXNzcGF0aEZpbGVFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygiICAgICIgKyBjbGFzc3BhdGhGaWxlLmdldFBhdGgoKSwgUHJvamVjdC5NU0dfREVCVUcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaChmIC0+IGxvZygiICAgICIgKyBmLmdldFBhdGgoKSwgUHJvamVjdC5NU0dfREVCVUcpKTsKKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRldGVybWluZU91dE9mRGF0ZUNsYXNzZXMoKSB7Ci0gICAgICAgIG91dE9mRGF0ZUNsYXNzZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGF0aExpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgc3JjRGlyID0gZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKHNyY1BhdGhMaXN0W2ldKTsKLSAgICAgICAgICAgIGlmIChzcmNEaXIuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgc2NhbkRpcihzcmNEaXIsIGZpbGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBvdXRPZkRhdGVDbGFzc2VzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBkaXJlY3RvcmllcyhzcmNQYXRoKS5mb3JFYWNoKHNyY0RpciAtPiB7CisgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gdGhpcy5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7CisgICAgICAgICAgICBzY2FuRGlyKHNyY0RpciwgZHMuZ2V0SW5jbHVkZWRGaWxlcygpKTsKKyAgICAgICAgfSk7CiAKICAgICAgICAgLy8gbm93IGNoZWNrIGNsYXNzcGF0aCBmaWxlIGRlcGVuZGVuY2llcwogICAgICAgICBpZiAoY2xhc3NwYXRoRGVwZW5kZW5jaWVzID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIEVudW1lcmF0aW9uIGNsYXNzcGF0aERlcHNFbnVtID0gY2xhc3NwYXRoRGVwZW5kZW5jaWVzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGNsYXNzcGF0aERlcHNFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gKFN0cmluZykgY2xhc3NwYXRoRGVwc0VudW0ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXQ8RmlsZT4+IGUgOiBjbGFzc3BhdGhEZXBlbmRlbmNpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGUuZ2V0S2V5KCk7CiAgICAgICAgICAgICBpZiAob3V0T2ZEYXRlQ2xhc3Nlcy5jb250YWluc0tleShjbGFzc05hbWUpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDbGFzc0ZpbGVJbmZvIGluZm8KLSAgICAgICAgICAgICAgICA9IChDbGFzc0ZpbGVJbmZvKSBjbGFzc0ZpbGVJbmZvTWFwLmdldChjbGFzc05hbWUpOworICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gY2xhc3NGaWxlSW5mb01hcC5nZXQoY2xhc3NOYW1lKTsKIAogICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBubyBpbmZvIGFib3V0IHRoZSBjbGFzcyAtIGl0IG1heSBoYXZlIGJlZW4gZGVsZXRlZCBhbHJlYWR5IGFuZCB3ZQogICAgICAgICAgICAgLy8gYXJlIHVzaW5nIGNhY2hlZCBpbmZvLgogICAgICAgICAgICAgaWYgKGluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgPSAoSGFzaHRhYmxlKSBjbGFzc3BhdGhEZXBlbmRlbmNpZXMuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlMiA9IGRlcGVuZGVuY2llcy5lbGVtZW50cygpOyBlMi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBjbGFzc3BhdGhGaWxlID0gKEZpbGUpIGUyLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGhGaWxlLmxhc3RNb2RpZmllZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA+IGluZm8uYWJzb2x1dGVGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChGaWxlIGNsYXNzcGF0aEZpbGUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzcGF0aEZpbGUubGFzdE1vZGlmaWVkKCkgPiBpbmZvLmFic29sdXRlRmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgLmxhc3RNb2RpZmllZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkNsYXNzICIgKyBjbGFzc05hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgb3V0IG9mIGRhdGUgd2l0aCByZXNwZWN0IHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsYXNzcGF0aEZpbGUsIFByb2plY3QuTVNHX0RFQlVHKTsKQEAgLTY4OSw2ICs2MTcsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBhbiB1bnJlY292ZXJhYmxlIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtNjk3LDggKzYyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNQYXRoTGlzdCA9IHNyY1BhdGgubGlzdCgpOwotICAgICAgICAgICAgaWYgKHNyY1BhdGhMaXN0Lmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWRpcmVjdG9yaWVzKHNyY1BhdGgpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIG5vbi1lbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQpAQCAtNzA4LDggKzYzNiw4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsICYmIGNhY2hlLmV4aXN0cygpICYmICFjYWNoZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgY2FjaGUsIGlmIHNwZWNpZmllZCwgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInBvaW50IHRvIGEgZGlyZWN0b3J5Iik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVGhlIGNhY2hlLCBpZiBzcGVjaWZpZWQsIG11c3QgcG9pbnQgdG8gYSBkaXJlY3RvcnkiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGNhY2hlICE9IG51bGwgJiYgIWNhY2hlLmV4aXN0cygpKSB7CkBAIC03NDksNTAgKzY3NywzOCBAQAogICAgICAqICAgICAgY2hlY2tlZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzY2FuRGlyKEZpbGUgc3JjRGlyLCBTdHJpbmdbXSBmaWxlcykgewotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0RpciwgZmlsZXNbaV0pOwotICAgICAgICAgICAgaWYgKGZpbGVzW2ldLmVuZHNXaXRoKCIuamF2YSIpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGYgOiBmaWxlcykgeworICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmKTsKKyAgICAgICAgICAgIGlmIChmLmVuZHNXaXRoKCIuamF2YSIpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gc3JjRmlsZS5nZXRQYXRoKCk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZQogICAgICAgICAgICAgICAgICAgICA9IGZpbGVQYXRoLnN1YnN0cmluZyhzcmNEaXIuZ2V0UGF0aCgpLmxlbmd0aCgpICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgubGVuZ3RoKCkgLSAiLmphdmEiLmxlbmd0aCgpKTsKICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBDbGFzc0ZpbGVVdGlscy5jb252ZXJ0U2xhc2hOYW1lKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvCi0gICAgICAgICAgICAgICAgICAgID0gKENsYXNzRmlsZUluZm8pIGNsYXNzRmlsZUluZm9NYXAuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgICAgICAgICAgICAgID0gY2xhc3NGaWxlSW5mb01hcC5nZXQoY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHdhcyBubyBjbGFzcyBmaWxlLiBhZGQgdGhpcyBjbGFzcyB0byB0aGUgbGlzdAogICAgICAgICAgICAgICAgICAgICBvdXRPZkRhdGVDbGFzc2VzLnB1dChjbGFzc05hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgID4gaW5mby5hYnNvbHV0ZUZpbGUubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mRGF0ZUNsYXNzZXMucHV0KGNsYXNzTmFtZSwgY2xhc3NOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGluZm8uYWJzb2x1dGVGaWxlCisgICAgICAgICAgICAgICAgICAgIC5sYXN0TW9kaWZpZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRPZkRhdGVDbGFzc2VzLnB1dChjbGFzc05hbWUsIGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgY2xhc3MgZmlsZXMgd2UgYXJlIGdvaW5nIHRvIGFuYWx5c2UuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gY2xhc3NMb2NhdGlvbnMgYSBwYXRoIHN0cnVjdHVyZSBjb250YWluaW5nIGFsbCB0aGUgZGlyZWN0b3JpZXMKLSAgICAgKiAgICAgIHdoZXJlIGNsYXNzZXMgY2FuIGJlIGZvdW5kLgogICAgICAqIEByZXR1cm4gYSB2ZWN0b3IgY29udGFpbmluZyB0aGUgY2xhc3NlcyB0byBhbmFseXNlLgogICAgICAqLwotICAgIHByaXZhdGUgVmVjdG9yIGdldENsYXNzRmlsZXMoUGF0aCBjbGFzc0xvY2F0aW9ucykgeworICAgIHByaXZhdGUgTGlzdDxDbGFzc0ZpbGVJbmZvPiBnZXRDbGFzc0ZpbGVzKCkgewogICAgICAgICAvLyBicmVhayB0aGUgY2xhc3NMb2NhdGlvbnMgaW50byBpdHMgY29tcG9uZW50cy4KLSAgICAgICAgU3RyaW5nW10gY2xhc3NMb2NhdGlvbnNMaXN0ID0gY2xhc3NMb2NhdGlvbnMubGlzdCgpOworICAgICAgICBMaXN0PENsYXNzRmlsZUluZm8+IGNsYXNzRmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgICAgICBWZWN0b3IgY2xhc3NGaWxlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsYXNzTG9jYXRpb25zTGlzdC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShjbGFzc0xvY2F0aW9uc0xpc3RbaV0pOwotICAgICAgICAgICAgaWYgKGRpci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgYWRkQ2xhc3NGaWxlcyhjbGFzc0ZpbGVMaXN0LCBkaXIsIGRpcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZGlyZWN0b3JpZXMoZGVzdFBhdGgpCisgICAgICAgICAgICAuZm9yRWFjaChkaXIgLT4gYWRkQ2xhc3NGaWxlcyhjbGFzc0ZpbGVMaXN0LCBkaXIsIGRpcikpOwogCiAgICAgICAgIHJldHVybiBjbGFzc0ZpbGVMaXN0OwogICAgIH0KQEAgLTgwNiwyMSArNzIyLDE3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBGaWxlIGZpbmRTb3VyY2VGaWxlKFN0cmluZyBjbGFzc25hbWUsIEZpbGUgc291cmNlRmlsZUtub3duVG9FeGlzdCkgewogICAgICAgICBTdHJpbmcgc291cmNlRmlsZW5hbWU7Ci0gICAgICAgIGludCBpbm5lckluZGV4ID0gY2xhc3NuYW1lLmluZGV4T2YoIiQiKTsKKyAgICAgICAgaW50IGlubmVySW5kZXggPSBjbGFzc25hbWUuaW5kZXhPZignJCcpOwogICAgICAgICBpZiAoaW5uZXJJbmRleCAhPSAtMSkgewogICAgICAgICAgICAgc291cmNlRmlsZW5hbWUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsIGlubmVySW5kZXgpICsgIi5qYXZhIjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNvdXJjZUZpbGVuYW1lID0gY2xhc3NuYW1lICsgIi5qYXZhIjsKICAgICAgICAgfQotCiAgICAgICAgIC8vIHNlYXJjaCB0aGUgdmFyaW91cyBzb3VyY2UgcGF0aCBlbnRyaWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjUGF0aExpc3QubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNyY1BhdGhMaXN0W2ldLCBzb3VyY2VGaWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAoc291cmNlRmlsZS5lcXVhbHMoc291cmNlRmlsZUtub3duVG9FeGlzdCkgfHwgc291cmNlRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2VGaWxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXMoc3JjUGF0aCkKKyAgICAgICAgICAgIC5tYXAoZCAtPiBuZXcgRmlsZShkLCBzb3VyY2VGaWxlbmFtZSkpLmZpbHRlcihQcmVkaWNhdGUKKyAgICAgICAgICAgICAgICAuPEZpbGU+IGlzRXF1YWwoc291cmNlRmlsZUtub3duVG9FeGlzdCkub3IoRmlsZTo6ZXhpc3RzKSkKKyAgICAgICAgICAgIC5maW5kRmlyc3QoKS5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MzUsMzYgKzc0NywzNCBAQAogICAgICAqICAgICAgdGhlIGFic29sdXRlIGNsYXNzIG5hbWUgZnJvbSB0aGUgcmVsYXRpdmUgcG9zaXRpb24gaW4gdGhlCiAgICAgICogICAgICBzb3VyY2UgdHJlZQogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRDbGFzc0ZpbGVzKFZlY3RvciBjbGFzc0ZpbGVMaXN0LCBGaWxlIGRpciwgRmlsZSByb290KSB7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVzSW5EaXIgPSBkaXIubGlzdCgpOworICAgIHByaXZhdGUgdm9pZCBhZGRDbGFzc0ZpbGVzKExpc3Q8Q2xhc3NGaWxlSW5mbz4gY2xhc3NGaWxlTGlzdCwgRmlsZSBkaXIsIEZpbGUgcm9vdCkgeworICAgICAgICBGaWxlW10gY2hpbGRyZW4gPSBkaXIubGlzdEZpbGVzKCk7CiAKLSAgICAgICAgaWYgKGZpbGVzSW5EaXIgPT0gbnVsbCkgeworICAgICAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGludCBsZW5ndGggPSBmaWxlc0luRGlyLmxlbmd0aDsKIAogICAgICAgICBpbnQgcm9vdExlbmd0aCA9IHJvb3QuZ2V0UGF0aCgpLmxlbmd0aCgpOwogICAgICAgICBGaWxlIHNvdXJjZUZpbGVLbm93blRvRXhpc3QgPSBudWxsOyAvLyBzcGVlZCBvcHRpbWl6YXRpb24KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBmaWxlc0luRGlyW2ldKTsKLSAgICAgICAgICAgIGlmIChmaWxlc0luRGlyW2ldLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgQ2xhc3NGaWxlSW5mbyBpbmZvID0gbmV3IENsYXNzRmlsZUluZm8oKTsKICAgICAgICAgICAgICAgICBpbmZvLmFic29sdXRlRmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlTmFtZSA9IGZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RMZW5ndGggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRQYXRoKCkubGVuZ3RoKCkgLSAiLmNsYXNzIi5sZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVsYXRpdmVOYW1lID0gZmlsZS5nZXRQYXRoKCkuc3Vic3RyaW5nKHJvb3RMZW5ndGggKyAxLAorICAgICAgICAgICAgICAgICAgICBmaWxlLmdldFBhdGgoKS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKTsKKwogICAgICAgICAgICAgICAgIGluZm8uY2xhc3NOYW1lCiAgICAgICAgICAgICAgICAgICAgID0gQ2xhc3NGaWxlVXRpbHMuY29udmVydFNsYXNoTmFtZShyZWxhdGl2ZU5hbWUpOwotICAgICAgICAgICAgICAgIGluZm8uc291cmNlRmlsZSA9IHNvdXJjZUZpbGVLbm93blRvRXhpc3QgPSBmaW5kU291cmNlRmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmVOYW1lLCBzb3VyY2VGaWxlS25vd25Ub0V4aXN0KTsKLSAgICAgICAgICAgICAgICBjbGFzc0ZpbGVMaXN0LmFkZEVsZW1lbnQoaW5mbyk7CisgICAgICAgICAgICAgICAgaW5mby5zb3VyY2VGaWxlID0gc291cmNlRmlsZUtub3duVG9FeGlzdCA9CisgICAgICAgICAgICAgICAgICAgIGZpbmRTb3VyY2VGaWxlKHJlbGF0aXZlTmFtZSwgc291cmNlRmlsZUtub3duVG9FeGlzdCk7CisgICAgICAgICAgICAgICAgY2xhc3NGaWxlTGlzdC5hZGQoaW5mbyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGFkZENsYXNzRmlsZXMoY2xhc3NGaWxlTGlzdCwgZmlsZSwgcm9vdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgZGlyZWN0b3JpZXMgcGF0aCB0byBmaW5kIHRoZSBKYXZhIHNvdXJjZSBmaWxlcy4KICAgICAgKgpAQCAtOTEzLDUgKzgyMywxMCBAQAogICAgIHB1YmxpYyB2b2lkIHNldER1bXAoYm9vbGVhbiBkdW1wKSB7CiAgICAgICAgIHRoaXMuZHVtcCA9IGR1bXA7CiAgICAgfQotfQogCisgICAgcHJpdmF0ZSBTdHJlYW08RmlsZT4gZGlyZWN0b3JpZXMoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CisgICAgICAgIHJldHVybiByYy5zdHJlYW0oKS5tYXAociAtPiByLmFzKEZpbGVQcm92aWRlci5jbGFzcykpCisgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLm1hcChGaWxlUHJvdmlkZXI6OmdldEZpbGUpCisgICAgICAgICAgICAuZmlsdGVyKEZpbGU6OmlzRGlyZWN0b3J5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvRGlyZWN0b3J5SXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCmluZGV4IGFmMjhjOTYuLjJjZjcxYWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EaXJlY3RvcnlJdGVyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTEgKzE4LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5RGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBBbiBpdGVyYXRvciB3aGljaCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb250ZW50cyBvZiBhIGphdmEgZGlyZWN0b3J5LiBUaGUKQEAgLTM2LDcgKzQwLDcgQEAKICAgICAgKiBUaGlzIGlzIGEgc3RhY2sgb2YgY3VycmVudCBpdGVyYXRvcnMgc3VwcG9ydGluZyB0aGUgZGVwdGggZmlyc3QKICAgICAgKiB0cmF2ZXJzYWwgb2YgdGhlIGRpcmVjdG9yeSB0cmVlLgogICAgICAqLwotICAgIHByaXZhdGUgU3RhY2sgZW51bVN0YWNrOworICAgIHByaXZhdGUgRGVxdWU8SXRlcmF0b3I8RmlsZT4+IGVudW1TdGFjazsKIAogICAgIC8qKgogICAgICAqIFRoZSBjdXJyZW50IGRpcmVjdG9yeSBpdGVyYXRvci4gQXMgZGlyZWN0b3JpZXMgZW5jb3VudGVyIGxvd2VyIGxldmVsCkBAIC00NSw3ICs0OSw3IEBACiAgICAgICogZGlyZWN0b3J5LiBUaGlzIGltcGxlbWVudHMgYSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwgb2YgdGhlIGRpcmVjdG9yeQogICAgICAqIG5hbWVzcGFjZS4KICAgICAgKi8KLSAgICBwcml2YXRlIEVudW1lcmF0aW9uIGN1cnJlbnRFbnVtOworICAgIHByaXZhdGUgSXRlcmF0b3I8RmlsZT4gY3VycmVudEl0ZXJhdG9yOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGRpcmVjdG9yeSBpdGVyYXRvci4gVGhlIGRpcmVjdG9yeSBpdGVyYXRvciBpcyBjcmVhdGVkIHRvCkBAIC02MywxMiArNjcsOCBAQAogICAgIHB1YmxpYyBEaXJlY3RvcnlJdGVyYXRvcihGaWxlIHJvb3REaXJlY3RvcnksIGJvb2xlYW4gY2hhbmdlSW50bykKICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgZW51bVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLSAgICAgICAgVmVjdG9yIGZpbGVzSW5Sb290ID0gZ2V0RGlyZWN0b3J5RW50cmllcyhyb290RGlyZWN0b3J5KTsKLQotICAgICAgICBjdXJyZW50RW51bSA9IGZpbGVzSW5Sb290LmVsZW1lbnRzKCk7CisgICAgICAgIGVudW1TdGFjayA9IG5ldyBBcnJheURlcXVlPD4oKTsKKyAgICAgICAgY3VycmVudEl0ZXJhdG9yID0gZ2V0RGlyZWN0b3J5RW50cmllcyhyb290RGlyZWN0b3J5KS5pdGVyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzksMjEgKzc5LDEyIEBACiAgICAgICogQHJldHVybiBhIHZlY3RvciBjb250YWluaW5nIEZpbGUgb2JqZWN0cyBmb3IgZWFjaCBlbnRyeSBpbiB0aGUKICAgICAgKiAgICAgIGRpcmVjdG9yeS4KICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciBnZXREaXJlY3RvcnlFbnRyaWVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0gICAgICAgIFZlY3RvciBmaWxlcyA9IG5ldyBWZWN0b3IoKTsKLQotICAgICAgICAvLyBGaWxlW10gZmlsZXNJbkRpciA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXNJbkRpciA9IGRpcmVjdG9yeS5saXN0KCk7Ci0KLSAgICAgICAgaWYgKGZpbGVzSW5EaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IGZpbGVzSW5EaXIubGVuZ3RoOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgZmlsZXMuYWRkRWxlbWVudChuZXcgRmlsZShkaXJlY3RvcnksIGZpbGVzSW5EaXJbaV0pKTsKLSAgICAgICAgICAgIH0KKyAgICBwcml2YXRlIExpc3Q8RmlsZT4gZ2V0RGlyZWN0b3J5RW50cmllcyhGaWxlIGRpcmVjdG9yeSkgeworICAgICAgICBGaWxlW10gZmlsZXNJbkRpciA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKKyAgICAgICAgaWYgKGZpbGVzSW5EaXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVzOworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChmaWxlc0luRGlyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMCwzMCArMTAxLDI4IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IENsYXNzRmlsZSBpbiB0aGUgaXRlcmF0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBDbGFzc0ZpbGUgZ2V0TmV4dENsYXNzRmlsZSgpIHsKICAgICAgICAgQ2xhc3NGaWxlIG5leHRFbGVtZW50ID0gbnVsbDsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgd2hpbGUgKG5leHRFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBlbGVtZW50ID0gKEZpbGUpIGN1cnJlbnRFbnVtLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBlbGVtZW50ID0gY3VycmVudEl0ZXJhdG9yLm5leHQoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pc0RpcmVjdG9yeSgpKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHB1c2ggdGhlIGN1cnJlbnQgaXRlcmF0b3Igb250byB0aGUgc3RhY2sgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGlzIGRpcmVjdG9yeS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudW1TdGFjay5wdXNoKGN1cnJlbnRFbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1TdGFjay5wdXNoKGN1cnJlbnRJdGVyYXRvcik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBmaWxlcyA9IGdldERpcmVjdG9yeUVudHJpZXMoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZpbGU+IGZpbGVzID0gZ2V0RGlyZWN0b3J5RW50cmllcyhlbGVtZW50KTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVudW0gPSBmaWxlcy5lbGVtZW50cygpOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZXJhdG9yID0gZmlsZXMuaXRlcmF0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGZpbGUuIGNyZWF0ZSBhIHN0cmVhbSBmb3IgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbkZpbGVTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZWxlbWVudCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluRmlsZVN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKGVsZW1lbnQudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuY2xhc3MiKSkgewogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGRhdGEgaW5wdXQgc3RyZWFtIGZyb20gdGhlIGphcgpAQCAtMTQ0LDE3ICsxMzMsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRmlsZVN0cmVhbS5jbG9zZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIC8vIHRoaXMgaXRlcmF0b3IgaXMgZXhoYXVzdGVkLiBDYW4gd2UgcG9wIG9uZSBvZmYgdGhlIHN0YWNrCisgICAgICAgICAgICAgICAgaWYgKGVudW1TdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpdGVyYXRvciBpcyBleGhhdXN0ZWQuIENhbiB3ZSBwb3Agb25lIG9mZiB0aGUgc3RhY2sKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudW1TdGFjay5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnVtID0gKEVudW1lcmF0aW9uKSBlbnVtU3RhY2sucG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEl0ZXJhdG9yID0gZW51bVN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtMTY1LDQgKzE1MCwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9KYXJGaWxlSXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9KYXJGaWxlSXRlcmF0b3IuamF2YQppbmRleCBjNDY4Yjk1Li5mNTVjZmQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvSmFyRmlsZUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0phckZpbGVJdGVyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNyArNDEsNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBKYXJGaWxlSXRlcmF0b3IoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdXBlcigpOwotCiAgICAgICAgIGphclN0cmVhbSA9IG5ldyBaaXBJbnB1dFN0cmVhbShzdHJlYW0pOwogICAgIH0KIApAQCAtNTAsNiArNDksNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBhIENsYXNzRmlsZSBvYmplY3QgZGVzY3JpYmluZyB0aGUgY2xhc3MgZnJvbSB0aGUgamFyCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIENsYXNzRmlsZSBnZXROZXh0Q2xhc3NGaWxlKCkgewogICAgICAgICBaaXBFbnRyeSBqYXJFbnRyeTsKICAgICAgICAgQ2xhc3NGaWxlIG5leHRFbGVtZW50ID0gbnVsbDsKQEAgLTY5LDcgKzY5LDYgQEAKIAogICAgICAgICAgICAgICAgICAgICBuZXh0RWxlbWVudCA9IGphdmFDbGFzczsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotCiAgICAgICAgICAgICAgICAgICAgIGphckVudHJ5ID0gamFyU3RyZWFtLmdldE5leHRFbnRyeSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTgzLDkgKzgyLDcgQEAKIAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgSkFSIGZpbGU6ICIgKyB0ZXh0KTsKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBuZXh0RWxlbWVudDsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9DbGFzc0NQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9DbGFzc0NQSW5mby5qYXZhCmluZGV4IDhhYmJmYzguLmVkYmM2ZTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ2xhc3NDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NsYXNzQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NCw2ICs1NCw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIHJlYWRpbmcgdGhlIGVudHJ5CiAgICAgICogICAgICBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVhZChEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGluZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKICAgICAgICAgY2xhc3NOYW1lID0gInVucmVzb2x2ZWQiOwpAQCAtNjQsNiArNjUsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJDbGFzcyBDb25zdGFudCBQb29sIEVudHJ5IGZvciAiICsgY2xhc3NOYW1lICsgIlsiICsgaW5kZXggKyAiXSI7CiAgICAgfQpAQCAtNzQsNiArNzYsNyBAQAogICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgd2l0aCB3aGljaCB0byByZXNvbHZlIHRoZQogICAgICAqICAgICAgY2xhc3MuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CiAgICAgICAgIGNsYXNzTmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGluZGV4KSkuZ2V0VmFsdWUoKTsKIApAQCAtOTAsNCArOTMsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50Q1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50Q1BJbmZvLmphdmEKaW5kZXggNjEwMzQyMi4uZTM4MTQxNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudENQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRDUEluZm8uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTYwLDQgKzYwLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sLmphdmEKaW5kZXggZmUzNWE0Zi4uZDc4MTc2OSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMjUgKzIzLDI3IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKIC8qKgogICogVGhlIGNvbnN0YW50IHBvb2wgb2YgYSBKYXZhIGNsYXNzLiBUaGUgY29uc3RhbnQgcG9vbCBpcyBhIGNvbGxlY3Rpb24gb2YKICAqIGNvbnN0YW50cyB1c2VkIGluIGEgSmF2YSBjbGFzcyBmaWxlLiBJdCBzdG9yZXMgc3RyaW5ncywgY29uc3RhbnQgdmFsdWVzLAogICogY2xhc3MgbmFtZXMsIG1ldGhvZCBuYW1lcywgZmllbGQgbmFtZXMgZXRjLgogICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3Ztc3BlYy8iPlRoZSBKYXZhIFZpcnR1YWwKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlL3NwZWNzL2luZGV4Lmh0bWwiPlRoZSBKYXZhIFZpcnR1YWwKICAqICAgICAgTWFjaGluZSBTcGVjaWZpY2F0aW9uPC9hPgogICovCiBwdWJsaWMgY2xhc3MgQ29uc3RhbnRQb29sIHsKIAogICAgIC8qKiBUaGUgZW50cmllcyBpbiB0aGUgY29uc3RhbnQgcG9vbC4gKi8KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q29uc3RhbnRQb29sRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PENvbnN0YW50UG9vbEVudHJ5PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb25zdGFudFBvb2xFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogQSBIYXNodGFibGUgb2YgVVRGOCBlbnRyaWVzIC0gdXNlZCB0byBnZXQgY29uc3RhbnQgcG9vbCBpbmRleGVzIG9mCiAgICAgICogdGhlIFVURjggdmFsdWVzIHF1aWNrbHkKICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEludGVnZXI+IHV0ZjhJbmRleGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gdXRmOEluZGV4ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAvKiogSW5pdGlhbGlzZSB0aGUgY29uc3RhbnQgcG9vbC4gKi8KICAgICBwdWJsaWMgQ29uc3RhbnRQb29sKCkgewpAQCAtMTAxLDcgKzEwMyw3IEBACiAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIFV0ZjhDUEluZm8pIHsKICAgICAgICAgICAgIFV0ZjhDUEluZm8gdXRmOEluZm8gPSAoVXRmOENQSW5mbykgZW50cnk7CiAKLSAgICAgICAgICAgIHV0ZjhJbmRleGVzLnB1dCh1dGY4SW5mby5nZXRWYWx1ZSgpLCBJbnRlZ2VyLnZhbHVlT2YoaW5kZXgpKTsKKyAgICAgICAgICAgIHV0ZjhJbmRleGVzLnB1dCh1dGY4SW5mby5nZXRWYWx1ZSgpLCBpbmRleCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gaW5kZXg7CkBAIC0xNDMsNyArMTQ1LDcgQEAKICAgICAgICAgSW50ZWdlciBpbmRleEludGVnZXIgPSB1dGY4SW5kZXhlcy5nZXQodmFsdWUpOwogCiAgICAgICAgIGlmIChpbmRleEludGVnZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW5kZXggPSBpbmRleEludGVnZXIuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXhJbnRlZ2VyOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGluZGV4OwpAQCAtMzQzLDE2ICszNDUsMTEgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGNvbnN0YW50IHBvb2wgZW50cmllcyBhcyBzdHJpbmdzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcbiIpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGVudHJpZXMuc2l6ZSgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ1snKS5hcHBlbmQoaSkuYXBwZW5kKCJdID0gIikuYXBwZW5kKGdldEVudHJ5KGkpKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIEludFN0cmVhbS5yYW5nZSgwLCBlbnRyaWVzLnNpemUoKSkKKyAgICAgICAgICAgIC5tYXBUb09iaihpIC0+IFN0cmluZy5mb3JtYXQoIlslZF0gPSAlcyIsIGksIGdldEVudHJ5KGkpKSkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiXG4iLCAiXG4iLCAiXG4iKSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sRW50cnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvQ29uc3RhbnRQb29sRW50cnkuamF2YQppbmRleCAyNmEwZDA5Li41YjBiYjAyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0NvbnN0YW50UG9vbEVudHJ5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Db25zdGFudFBvb2xFbnRyeS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzEsNiArNzEsMTMgQEAKICAgICAvKiogVGFnIHZhbHVlIGZvciBJbnZva2VEeW5hbWljIGVudHJpZXMqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlNUQU5UX0lOVk9LRURZTkFNSUMgPSAxODsKIAorICAgIC8qKiBUYWcgdmFsdWUgZm9yIENPTlNUQU5UX01vZHVsZV9pbmZvIGVudHJ5ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfTU9EVUxFSU5GTyA9IDE5OworCisgICAgLyoqIFRhZyB2YWx1ZSBmb3IgQ09OU1RBTlRfUGFja2FnZV9pbmZvIGVudHJ5ICh3aXRoaW4gYSBtb2R1bGUpICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1RBTlRfUEFDS0FHRUlORk8gPSAyMDsKKworCiAgICAgLyoqCiAgICAgICogVGhpcyBlbnRyeSdzIHRhZyB3aGljaCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIHRoaXMgY29uc3RhbnQgcG9vbAogICAgICAqIGVudHJ5LgpAQCAtMTE1LDcyICsxMjIsNjMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbnN0YW50UG9vbEVudHJ5IHJlYWRFbnRyeShEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pCiAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBDb25zdGFudFBvb2xFbnRyeSBjcEluZm8gPSBudWxsOwogICAgICAgICBpbnQgY3BUYWcgPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRCeXRlKCk7CiAKKyAgICAgICAgQ29uc3RhbnRQb29sRW50cnkgY3BJbmZvOwogICAgICAgICBzd2l0Y2ggKGNwVGFnKSB7CiAKICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfVVRGODoKICAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgVXRmOENQSW5mbygpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0lOVEVHRVI6CiAgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IEludGVnZXJDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9GTE9BVDoKICAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgRmxvYXRDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9MT05HOgogICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBMb25nQ1BJbmZvKCk7Ci0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfRE9VQkxFOgogICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBEb3VibGVDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9DTEFTUzoKICAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgQ2xhc3NDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9TVFJJTkc6CiAgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IFN0cmluZ0NQSW5mbygpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX0ZJRUxEUkVGOgogICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBGaWVsZFJlZkNQSW5mbygpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX01FVEhPRFJFRjoKICAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgTWV0aG9kUmVmQ1BJbmZvKCk7Ci0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfSU5URVJGQUNFTUVUSE9EUkVGOgogICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBJbnRlcmZhY2VNZXRob2RSZWZDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9OQU1FQU5EVFlQRToKICAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgTmFtZUFuZFR5cGVDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9NRVRIT0RIQU5ETEU6CiAgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IE1ldGhvZEhhbmRsZUNQSW5mbygpOwotCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIENPTlNUQU5UX01FVEhPRFRZUEU6CiAgICAgICAgICAgICAgICAgY3BJbmZvID0gbmV3IE1ldGhvZFR5cGVDUEluZm8oKTsKLQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBDT05TVEFOVF9JTlZPS0VEWU5BTUlDOgogICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBJbnZva2VEeW5hbWljQ1BJbmZvKCk7Ci0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ09OU1RBTlRfTU9EVUxFSU5GTzoKKyAgICAgICAgICAgICAgICBjcEluZm8gPSBuZXcgTW9kdWxlQ1BJbmZvKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPTlNUQU5UX1BBQ0tBR0VJTkZPOgorICAgICAgICAgICAgICAgIGNwSW5mbyA9IG5ldyBQYWNrYWdlQ1BJbmZvKCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Zvcm1hdEVycm9yKCJJbnZhbGlkIENvbnN0YW50IFBvb2wgZW50cnkgVHlwZSAiCiAgICAgICAgICAgICAgICAgICAgICArIGNwVGFnKTsKICAgICAgICAgfQotCiAgICAgICAgIGNwSW5mby5yZWFkKGNwU3RyZWFtKTsKIAogICAgICAgICByZXR1cm4gY3BJbmZvOwpAQCAtMjM5LDQgKzIzNywzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0RvdWJsZUNQSW5mby5qYXZhCmluZGV4IGEyMWMwZDYuLmEyNmJiNjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRG91YmxlQ1BJbmZvLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Eb3VibGVDUEluZm8uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQxLDggKzQxLDkgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tIHRoZQogICAgICAqICAgICAgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShuZXcgRG91YmxlKGNwU3RyZWFtLnJlYWREb3VibGUoKSkpOworICAgICAgICBzZXRWYWx1ZShjcFN0cmVhbS5yZWFkRG91YmxlKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTAsOSArNTEsOSBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIkRvdWJsZSBDb25zdGFudCBQb29sIEVudHJ5OiAiICsgZ2V0VmFsdWUoKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GaWVsZFJlZkNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GaWVsZFJlZkNQSW5mby5qYXZhCmluZGV4IDA2YzA5MjUuLmViMzYyNDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRmllbGRSZWZDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ZpZWxkUmVmQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CiAgICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwpAQCAtNjEsNiArNjIsNyBAQAogICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgogICAgICAqICAgICAgYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKICAgICAgICAgQ2xhc3NDUEluZm8gZmllbGRDbGFzcwogICAgICAgICAgICAgPSAoQ2xhc3NDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShjbGFzc0luZGV4KTsKQEAgLTg1LDE4ICs4NywxNCBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29uc3RhbnQgcG9vbCBlbnRyeS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmcgdmFsdWU7Ci0KICAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkgewotICAgICAgICAgICAgdmFsdWUgPSAiRmllbGQgOiBDbGFzcyA9ICIgKyBmaWVsZENsYXNzTmFtZSArICIsIG5hbWUgPSAiCi0gICAgICAgICAgICAgICAgKyBmaWVsZE5hbWUgKyAiLCB0eXBlID0gIiArIGZpZWxkVHlwZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gIkZpZWxkIDogQ2xhc3MgaW5kZXggPSAiICsgY2xhc3NJbmRleAotICAgICAgICAgICAgICAgICsgIiwgbmFtZSBhbmQgdHlwZSBpbmRleCA9ICIgKyBuYW1lQW5kVHlwZUluZGV4OworICAgICAgICAgICAgcmV0dXJuICJGaWVsZCA6IENsYXNzID0gIiArIGZpZWxkQ2xhc3NOYW1lICsgIiwgbmFtZSA9ICIgKyBmaWVsZE5hbWUKKyAgICAgICAgICAgICAgICArICIsIHR5cGUgPSAiICsgZmllbGRUeXBlOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICByZXR1cm4gIkZpZWxkIDogQ2xhc3MgaW5kZXggPSAiICsgY2xhc3NJbmRleAorICAgICAgICAgICAgKyAiLCBuYW1lIGFuZCB0eXBlIGluZGV4ID0gIiArIG5hbWVBbmRUeXBlSW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNCArMTI1LDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GbG9hdENQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9GbG9hdENQSW5mby5qYXZhCmluZGV4IDUzMmI2NzIuLjdiZjk5N2UgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvRmxvYXRDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0Zsb2F0Q1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOSw4ICszOSw5IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobmV3IEZsb2F0KGNwU3RyZWFtLnJlYWRGbG9hdCgpKSk7CisgICAgICAgIHNldFZhbHVlKGNwU3RyZWFtLnJlYWRGbG9hdCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4LDkgKzQ5LDkgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJGbG9hdCBDb25zdGFudCBQb29sIEVudHJ5OiAiICsgZ2V0VmFsdWUoKTsKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnRlZ2VyQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVnZXJDUEluZm8uamF2YQppbmRleCAzYmVhYThjLi4xNjk5ODY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVnZXJDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVnZXJDUEluZm8uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDggKzM5LDkgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCiAgICAgICogICAgICB0aGUgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBzZXRWYWx1ZShuZXcgSW50ZWdlcihjcFN0cmVhbS5yZWFkSW50KCkpKTsKKyAgICAgICAgc2V0VmFsdWUoY3BTdHJlYW0ucmVhZEludCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4LDkgKzQ5LDkgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJJbnRlZ2VyIENvbnN0YW50IFBvb2wgRW50cnk6ICIgKyBnZXRWYWx1ZSgpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnRlcmZhY2VNZXRob2RSZWZDUEluZm8uamF2YQppbmRleCBmYmMyM2MxLi42NDMwNTk5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludGVyZmFjZU1ldGhvZFJlZkNQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvSW50ZXJmYWNlTWV0aG9kUmVmQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NSw2ICs1NSw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CiAgICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwpAQCAtNjcsNiArNjgsNyBAQAogICAgICAqIEBwYXJhbSBjb25zdGFudFBvb2wgdGhlIGNvbnN0YW50IHBvb2wgb2Ygd2hpY2ggdGhpcyBlbnRyeSBpcyBhIG1lbWJlcgogICAgICAqICAgICAgYW5kIGFnYWluc3Qgd2hpY2ggdGhpcyBlbnRyeSBpcyB0byBiZSByZXNvbHZlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNvbHZlKENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKICAgICAgICAgQ2xhc3NDUEluZm8gaW50ZXJmYWNlTWV0aG9kQ2xhc3MKICAgICAgICAgICAgICA9IChDbGFzc0NQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGNsYXNzSW5kZXgpOwpAQCAtOTEsMTkgKzkzLDE2IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQogICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJJbnRlcmZhY2VNZXRob2QgOiBDbGFzcyA9ICIgKyBpbnRlcmZhY2VNZXRob2RDbGFzc05hbWUKKyAgICAgICAgICAgIHJldHVybiAiSW50ZXJmYWNlTWV0aG9kIDogQ2xhc3MgPSAiICsgaW50ZXJmYWNlTWV0aG9kQ2xhc3NOYW1lCiAgICAgICAgICAgICAgICAgICsgIiwgbmFtZSA9ICIgKyBpbnRlcmZhY2VNZXRob2ROYW1lICsgIiwgdHlwZSA9ICIKICAgICAgICAgICAgICAgICAgKyBpbnRlcmZhY2VNZXRob2RUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSAiSW50ZXJmYWNlTWV0aG9kIDogQ2xhc3MgaW5kZXggPSAiICsgY2xhc3NJbmRleAotICAgICAgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gIkludGVyZmFjZU1ldGhvZCA6IENsYXNzIGluZGV4ID0gIiArIGNsYXNzSW5kZXgKKyAgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKIAotICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzQsNCArMTMzLDMgQEAKICAgICB9CiAKIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9JbnZva2VEeW5hbWljQ1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludm9rZUR5bmFtaWNDUEluZm8uamF2YQppbmRleCAzNzk1ZGI3Li43ZjE0ZGVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludm9rZUR5bmFtaWNDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL0ludm9rZUR5bmFtaWNDUEluZm8uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBwcml2YXRlIGludCBuYW1lQW5kVHlwZUluZGV4OwogICAgIC8qKiB0aGUgbmFtZSBhbmQgdHlwZSBDUCBpbmZvIHBvaW50ZWQgdG8gKi8KICAgICBwcml2YXRlIE5hbWVBbmRUeXBlQ1BJbmZvIG5hbWVBbmRUeXBlQ1BJbmZvOwotICAgIC8qKiAqLworCiAgICAgLyoqIENvbnN0cnVjdG9yLiAgKi8KICAgICBwdWJsaWMgSW52b2tlRHluYW1pY0NQSW5mbygpIHsKICAgICAgICAgc3VwZXIoQ09OU1RBTlRfSU5WT0tFRFlOQU1JQywgMSk7CkBAIC00Myw5ICs0MywxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKICAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYm9vdHN0cmFwTWV0aG9kQXR0ckluZGV4ID0gY3BTdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnQoKTsKICAgICAgICAgbmFtZUFuZFR5cGVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CkBAIC01NiwxNiArNTcsMTQgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwogICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJOYW1lID0gIiArIG5hbWVBbmRUeXBlQ1BJbmZvLmdldE5hbWUoKSArICIsIHR5cGUgPSAiICsgbmFtZUFuZFR5cGVDUEluZm8uZ2V0VHlwZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdmFsdWUgPSAiQm9vdHN0cmFwTWV0aG9kQXR0ckluZGV4IGlueCA9ICIgKyBib290c3RyYXBNZXRob2RBdHRySW5kZXgKLSAgICAgICAgICAgICsgIk5hbWVBbmRUeXBlIGluZGV4ID0gIiArIG5hbWVBbmRUeXBlSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gIk5hbWUgPSAiICsgbmFtZUFuZFR5cGVDUEluZm8uZ2V0TmFtZSgpICsgIiwgdHlwZSA9ICIKKyAgICAgICAgICAgICAgICArIG5hbWVBbmRUeXBlQ1BJbmZvLmdldFR5cGUoKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICJCb290c3RyYXBNZXRob2RBdHRySW5kZXggaW54ID0gIiArIGJvb3RzdHJhcE1ldGhvZEF0dHJJbmRleAorICAgICAgICAgICAgKyAiTmFtZUFuZFR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKICAgICB9CiAgICAgLyoqCiAgICAgICogUmVzb2x2ZSB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkgd2l0aCByZXNwZWN0IHRvIGl0cyBkZXBlbmRlbnRzIGluCkBAIC03NCw2ICs3Myw3IEBACiAgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCiAgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgewogICAgICAgICBuYW1lQW5kVHlwZUNQSW5mbwogICAgICAgICAgICAgICAgID0gKE5hbWVBbmRUeXBlQ1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkobmFtZUFuZFR5cGVJbmRleCk7CkBAIC04Miw0ICs4MiwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTG9uZ0NQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Mb25nQ1BJbmZvLmphdmEKaW5kZXggZTg1NGYwNC4uZDA3MzM1MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Mb25nQ1BJbmZvLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Mb25nQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOSw4ICszOSw5IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc2V0VmFsdWUobmV3IExvbmcoY3BTdHJlYW0ucmVhZExvbmcoKSkpOworICAgICAgICBzZXRWYWx1ZShjcFN0cmVhbS5yZWFkTG9uZygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQ4LDkgKzQ5LDkgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbnN0YW50IHBvb2wgZW50cnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuICJMb25nIENvbnN0YW50IFBvb2wgRW50cnk6ICIgKyBnZXRWYWx1ZSgpOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01ldGhvZEhhbmRsZUNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9NZXRob2RIYW5kbGVDUEluZm8uamF2YQppbmRleCBhNTkwNmM3Li4yYzhiZjg1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01ldGhvZEhhbmRsZUNQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kSGFuZGxlQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSwyNyArMzEsMjMgQEAKICAgICBwcml2YXRlIFJlZmVyZW5jZUtpbmQgcmVmZXJlbmNlS2luZDsKICAgICAvKiogTXVzdCBiZSBhIHZhbGlkIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgdGFibGUuICovCiAgICAgcHJpdmF0ZSBpbnQgcmVmZXJlbmNlSW5kZXg7Ci0gICAgLyoqCi0gICAgICogdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgd2hpY2ggZGVmaW5lZCB0aGUgbmFtZSBhbmQgdHlwZQotICAgICAqIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgbmFtZUFuZFR5cGVJbmRleDsKLSAgICBwdWJsaWMgZW51bSBSZWZlcmVuY2VLaW5kIHsKLSAgICAgICAgUkVGX2dldEZpZWxkKDEpLAotICAgICAgICBSRUZfZ2V0U3RhdGljKDIpLAotICAgICAgICBSRUZfcHV0RmllbGQoMyksCi0gICAgICAgIFJFRl9wdXRTdGF0aWMoNCksCi0gICAgICAgIFJFRl9pbnZva2VWaXJ0dWFsKDUpLAotICAgICAgICBSRUZfaW52b2tlU3RhdGljKDYpLAotICAgICAgICBSRUZfaW52b2tlU3BlY2lhbCg3KSwKLSAgICAgICAgUkVGX25ld0ludm9rZVNwZWNpYWwoOCksCi0gICAgICAgIFJFRl9pbnZva2VJbnRlcmZhY2UoOSk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IHJlZmVyZW5jZUtpbmQ7Ci0gICAgICAgIFJlZmVyZW5jZUtpbmQoaW50IHJlZmVyZW5jZUtpbmQpIHsKLSAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlS2luZCA9IHJlZmVyZW5jZUtpbmQ7Ci0gICAgICAgIH0KIAorICAgIHB1YmxpYyBlbnVtIFJlZmVyZW5jZUtpbmQgeworICAgICAgICBSRUZfZ2V0RmllbGQsCisgICAgICAgIFJFRl9nZXRTdGF0aWMsCisgICAgICAgIFJFRl9wdXRGaWVsZCwKKyAgICAgICAgUkVGX3B1dFN0YXRpYywKKyAgICAgICAgUkVGX2ludm9rZVZpcnR1YWwsCisgICAgICAgIFJFRl9pbnZva2VTdGF0aWMsCisgICAgICAgIFJFRl9pbnZva2VTcGVjaWFsLAorICAgICAgICBSRUZfbmV3SW52b2tlU3BlY2lhbCwKKyAgICAgICAgUkVGX2ludm9rZUludGVyZmFjZTsKKworICAgICAgICBwdWJsaWMgaW50IHZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG9yZGluYWwoKSArIDE7CisgICAgICAgIH0KICAgICB9CisKICAgICAvKiogQ29uc3RydWN0b3IuICovCiAgICAgcHVibGljIE1ldGhvZEhhbmRsZUNQSW5mbygpIHsKICAgICAgICAgc3VwZXIoQ09OU1RBTlRfTUVUSE9ESEFORExFLCAxKTsKQEAgLTYyLDEyICs1OCwxMiBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKICAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmVmZXJlbmNlS2luZCA9IFJlZmVyZW5jZUtpbmQudmFsdWVzKClbY3BTdHJlYW0ucmVhZFVuc2lnbmVkQnl0ZSgpIC0gMV07Ci0KICAgICAgICAgcmVmZXJlbmNlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwogICAgIH0KIApAQCAtNzYsMTcgKzcyLDEzIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQogICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2RIYW5kbGUgOiAiICsgcmVmZXJlbmNlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2RIYW5kbGUgOiBSZWZlcmVuY2Uga2luZCA9ICIgKyByZWZlcmVuY2VLaW5kCi0gICAgICAgICAgICAgICAgICsgICJSZWZlcmVuY2UgaW5kZXggPSAiICsgcmVmZXJlbmNlSW5kZXg7CisgICAgICAgICAgICByZXR1cm4gIk1ldGhvZEhhbmRsZSA6ICIgKyByZWZlcmVuY2UudG9TdHJpbmcoKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICJNZXRob2RIYW5kbGUgOiBSZWZlcmVuY2Uga2luZCA9ICIgKyByZWZlcmVuY2VLaW5kCisgICAgICAgICAgICArICJSZWZlcmVuY2UgaW5kZXggPSAiICsgcmVmZXJlbmNlSW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NiwxMiArODgsMTEgQEAKICAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHdoaWNoIHRoaXMgZW50cnkgaXMgYSBtZW1iZXIKICAgICAgKiAgICAgIGFuZCBhZ2FpbnN0IHdoaWNoIHRoaXMgZW50cnkgaXMgdG8gYmUgcmVzb2x2ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CiAgICAgICAgIHJlZmVyZW5jZSA9IGNvbnN0YW50UG9vbC5nZXRFbnRyeShyZWZlcmVuY2VJbmRleCk7CiAgICAgICAgIHJlZmVyZW5jZS5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CiAgICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKICAgICB9CiAKLQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01ldGhvZFJlZkNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9NZXRob2RSZWZDUEluZm8uamF2YQppbmRleCA2YjMzNTIxLi5kZDczMDMxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01ldGhvZFJlZkNQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kUmVmQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xhc3NJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CiAgICAgICAgIG5hbWVBbmRUeXBlSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwpAQCAtNjIsMTggKzYzLDE0IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQogICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2QgOiBDbGFzcyA9ICIgKyBtZXRob2RDbGFzc05hbWUgKyAiLCBuYW1lID0gIgotICAgICAgICAgICAgICAgICArIG1ldGhvZE5hbWUgKyAiLCB0eXBlID0gIiArIG1ldGhvZFR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJNZXRob2QgOiBDbGFzcyBpbmRleCA9ICIgKyBjbGFzc0luZGV4Ci0gICAgICAgICAgICAgICAgICsgIiwgbmFtZSBhbmQgdHlwZSBpbmRleCA9ICIgKyBuYW1lQW5kVHlwZUluZGV4OworICAgICAgICAgICAgcmV0dXJuICJNZXRob2QgOiBDbGFzcyA9ICIgKyBtZXRob2RDbGFzc05hbWUgKyAiLCBuYW1lID0gIgorICAgICAgICAgICAgICAgICsgbWV0aG9kTmFtZSArICIsIHR5cGUgPSAiICsgbWV0aG9kVHlwZTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgcmV0dXJuICJNZXRob2QgOiBDbGFzcyBpbmRleCA9ICIgKyBjbGFzc0luZGV4CisgICAgICAgICAgICArICIsIG5hbWUgYW5kIHR5cGUgaW5kZXggPSAiICsgbmFtZUFuZFR5cGVJbmRleDsKICAgICB9CiAKICAgICAvKioKQEAgLTgzLDYgKzgwLDcgQEAKICAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHdoaWNoIHRoaXMgZW50cnkgaXMgYSBtZW1iZXIKICAgICAgKiAgICAgIGFuZCBhZ2FpbnN0IHdoaWNoIHRoaXMgZW50cnkgaXMgdG8gYmUgcmVzb2x2ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzb2x2ZShDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CiAgICAgICAgIENsYXNzQ1BJbmZvIG1ldGhvZENsYXNzCiAgICAgICAgICAgICAgPSAoQ2xhc3NDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShjbGFzc0luZGV4KTsKQEAgLTEzMCw0ICsxMjgsMyBAQAogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01ldGhvZFR5cGVDUEluZm8uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kVHlwZUNQSW5mby5qYXZhCmluZGV4IGQzYzM1Y2UuLjZlOTA5MzMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kVHlwZUNQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTWV0aG9kVHlwZUNQSW5mby5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsNiArMzAsNyBAQAogICAgIHByaXZhdGUgaW50IG1ldGhvZERlc2NyaXB0b3JJbmRleDsKICAgICAvKiogdGhlIHZhbHVlIG9mIHRoZSBtZXRob2QgZGVzY3JpcHRvciBwb2ludGVkIHRvICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcjsKKwogICAgIC8qKiBDb25zdHJ1Y3Rvci4gICovCiAgICAgcHVibGljIE1ldGhvZFR5cGVDUEluZm8oKSB7CiAgICAgICAgIHN1cGVyKENPTlNUQU5UX01FVEhPRFRZUEUsIDEpOwpAQCAtNDAsNyArNDEsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNwU3RyZWFtIHRoZSBEYXRhSW5wdXRTdHJlYW0gd2hpY2ggY29udGFpbnMgdGhlIGNvbnN0YW50IHBvb2wKICAgICAgKiAgICAgIGVudHJ5IHRvIGJlIHJlYWQuCi0gICAgICogQGV4Y2VwdGlvbiBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCisgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUKQEAgLTYzLDYgKzY0LDcgQEAKICAgICAgICAgbWV0aG9kRGVzY3JpcHRvciA9IG1ldGhvZENsYXNzLmdldFZhbHVlKCk7CiAgICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBQcmludCBhIHJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGNvbnN0YW50IHBvb2wgZW50cnkuCiAgICAgICoKQEAgLTcwLDEzICs3MiwxMCBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIGlmICghaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1ldGhvZERlc2NyaXB0b3JJbmRleDogIiArIG1ldGhvZERlc2NyaXB0b3JJbmRleDsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzUmVzb2x2ZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuICJNZXRob2REZXNjcmlwdG9yOiAiICsgbWV0aG9kRGVzY3JpcHRvcjsKLQogICAgICAgICB9CisgICAgICAgIHJldHVybiAiTWV0aG9kRGVzY3JpcHRvckluZGV4OiAiICsgbWV0aG9kRGVzY3JpcHRvckluZGV4OwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL01vZHVsZUNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Nb2R1bGVDUEluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTU2ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9Nb2R1bGVDUEluZm8uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sOworCitpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBtb2R1bGUgaW5mbyBjb25zdGFudCBwb29sIGVudHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBNb2R1bGVDUEluZm8gZXh0ZW5kcyBDb25zdGFudENQSW5mbyB7CisKKyAgICBwcml2YXRlIGludCBtb2R1bGVOYW1lSW5kZXg7CisgICAgcHJpdmF0ZSBTdHJpbmcgbW9kdWxlTmFtZTsKKworICAgIHB1YmxpYyBNb2R1bGVDUEluZm8oKSB7CisgICAgICAgIHN1cGVyKENPTlNUQU5UX01PRFVMRUlORk8sIDEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQoZmluYWwgRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLm1vZHVsZU5hbWVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZShmaW5hbCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CisgICAgICAgIHRoaXMubW9kdWxlTmFtZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KHRoaXMubW9kdWxlTmFtZUluZGV4KSkuZ2V0VmFsdWUoKTsKKworICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJNb2R1bGUgaW5mbyBDb25zdGFudCBQb29sIEVudHJ5IGZvciAiICsgdGhpcy5tb2R1bGVOYW1lICsgIlsiICsgdGhpcy5tb2R1bGVOYW1lSW5kZXggKyAiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9OYW1lQW5kVHlwZUNQSW5mby5qYXZhCmluZGV4IDQ3ZjQ1NGQuLjA0OTg2ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvTmFtZUFuZFR5cGVDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL05hbWVBbmRUeXBlQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSw2ICsyNSwyMCBAQAogICoKICAqLwogcHVibGljIGNsYXNzIE5hbWVBbmRUeXBlQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRQb29sRW50cnkgeworICAgIC8qKiB0aGUgbmFtZSBjb21wb25lbnQgb2YgdGhpcyBlbnRyeSAqLworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgLyoqIHRoZSB0eXBlIGNvbXBvbmVudCBvZiB0aGlzIGVudHJ5ICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICAvKioKKyAgICAgKiB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBhdCB3aGljaCB0aGUgbmFtZSBjb21wb25lbnQncyBzdHJpbmcKKyAgICAgKiB2YWx1ZSBpcyBzdG9yZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBuYW1lSW5kZXg7CisgICAgLyoqCisgICAgICogdGhlIGluZGV4IGludG8gdGhlIGNvbnN0YW50IHBvb2wgd2hlcmUgdGhlIHR5cGUgZGVzY3JpcHRvciBzdHJpbmcgaXMKKyAgICAgKiBzdG9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZGVzY3JpcHRvckluZGV4OwogCiAgICAgLyoqIENvbnN0cnVjdG9yLiAqLwogICAgIHB1YmxpYyBOYW1lQW5kVHlwZUNQSW5mbygpIHsKQEAgLTM5LDYgKzUzLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCiAgICAgICogICAgICB0aGUgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBuYW1lSW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwogICAgICAgICBkZXNjcmlwdG9ySW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwpAQCAtNDksMTcgKzY0LDEzIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZTsKLQogICAgICAgICBpZiAoaXNSZXNvbHZlZCgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJOYW1lID0gIiArIG5hbWUgKyAiLCB0eXBlID0gIiArIHR5cGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9ICJOYW1lIGluZGV4ID0gIiArIG5hbWVJbmRleAotICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0b3IgaW5kZXggPSAiICsgZGVzY3JpcHRvckluZGV4OworICAgICAgICAgICAgcmV0dXJuICJOYW1lID0gIiArIG5hbWUgKyAiLCB0eXBlID0gIiArIHR5cGU7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIHJldHVybiAiTmFtZSBpbmRleCA9ICIgKyBuYW1lSW5kZXggKyAiLCBkZXNjcmlwdG9yIGluZGV4ID0gIgorICAgICAgICAgICAgKyBkZXNjcmlwdG9ySW5kZXg7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OSw2ICs4MCw3IEBACiAgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCiAgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgewogICAgICAgICBuYW1lID0gKChVdGY4Q1BJbmZvKSBjb25zdGFudFBvb2wuZ2V0RW50cnkobmFtZUluZGV4KSkuZ2V0VmFsdWUoKTsKICAgICAgICAgdHlwZSA9ICgoVXRmOENQSW5mbykgY29uc3RhbnRQb29sLmdldEVudHJ5KGRlc2NyaXB0b3JJbmRleCkpLmdldFZhbHVlKCk7CkBAIC05NCwxOSArMTA2LDQgQEAKICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgfQogCi0gICAgLyoqIHRoZSBuYW1lIGNvbXBvbmVudCBvZiB0aGlzIGVudHJ5ICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAvKiogdGhlIHR5cGUgY29tcG9uZW50IG9mIHRoaXMgZW50cnkgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotICAgIC8qKgotICAgICAqIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sIGF0IHdoaWNoIHRoZSBuYW1lIGNvbXBvbmVudCdzIHN0cmluZwotICAgICAqIHZhbHVlIGlzIHN0b3JlZAotICAgICAqLwotICAgIHByaXZhdGUgaW50IG5hbWVJbmRleDsKLSAgICAvKioKLSAgICAgKiB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCB3aGVyZSB0aGUgdHlwZSBkZXNjcmlwdG9yIHN0cmluZyBpcwotICAgICAqIHN0b3JlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBkZXNjcmlwdG9ySW5kZXg7CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvUGFja2FnZUNQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9QYWNrYWdlQ1BJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViZmFhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvUGFja2FnZUNQSW5mby5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZC5jb25zdGFudHBvb2w7CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIFJlcHJlc2VudHMgdGhlIHBhY2thZ2UgaW5mbyAod2l0aGluIGEgbW9kdWxlKSBjb25zdGFudCBwb29sIGVudHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBQYWNrYWdlQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8geworCisgICAgcHJpdmF0ZSBpbnQgcGFja2FnZU5hbWVJbmRleDsKKyAgICBwcml2YXRlIFN0cmluZyBwYWNrYWdlTmFtZTsKKworICAgIHB1YmxpYyBQYWNrYWdlQ1BJbmZvKCkgeworICAgICAgICBzdXBlcihDT05TVEFOVF9QQUNLQUdFSU5GTywgMSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChmaW5hbCBEYXRhSW5wdXRTdHJlYW0gY3BTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWVJbmRleCA9IGNwU3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzb2x2ZShmaW5hbCBDb25zdGFudFBvb2wgY29uc3RhbnRQb29sKSB7CisgICAgICAgIHRoaXMucGFja2FnZU5hbWUgPSAoKFV0ZjhDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeSh0aGlzLnBhY2thZ2VOYW1lSW5kZXgpKS5nZXRWYWx1ZSgpOworCisgICAgICAgIHN1cGVyLnJlc29sdmUoY29uc3RhbnRQb29sKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlBhY2thZ2UgaW5mbyBDb25zdGFudCBQb29sIEVudHJ5IGZvciAiICsgdGhpcy5wYWNrYWdlTmFtZSArICJbIiArIHRoaXMucGFja2FnZU5hbWVJbmRleCArICJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1N0cmluZ0NQSW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9TdHJpbmdDUEluZm8uamF2YQppbmRleCBiYzllZTI0Li4yZWQwYjhlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1N0cmluZ0NQSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9jb25zdGFudHBvb2wvU3RyaW5nQ1BJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNiw2ICsyNiw4IEBACiAgKgogICovCiBwdWJsaWMgY2xhc3MgU3RyaW5nQ1BJbmZvIGV4dGVuZHMgQ29uc3RhbnRDUEluZm8geworICAgIC8qKiB0aGUgaW5kZXggaW50byB0aGUgY29uc3RhbnQgcG9vbCBjb250YWluaW5nIHRoZSBzdHJpbmcncyBjb250ZW50ICovCisgICAgcHJpdmF0ZSBpbnQgaW5kZXg7CiAKICAgICAvKiogQ29uc3RydWN0b3IuICAqLwogICAgIHB1YmxpYyBTdHJpbmdDUEluZm8oKSB7CkBAIC00MCw5ICs0Miw5IEBACiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0gcmVhZGluZyB0aGUgZW50cnkgZnJvbQogICAgICAqICAgICAgdGhlIHN0cmVhbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKERhdGFJbnB1dFN0cmVhbSBjcFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW5kZXggPSBjcFN0cmVhbS5yZWFkVW5zaWduZWRTaG9ydCgpOwotCiAgICAgICAgIHNldFZhbHVlKCJ1bnJlc29sdmVkIik7CiAgICAgfQogCkBAIC01MSw2ICs1Myw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiU3RyaW5nIENvbnN0YW50IFBvb2wgRW50cnkgZm9yICIKICAgICAgICAgICAgICsgZ2V0VmFsdWUoKSArICJbIiArIGluZGV4ICsgIl0iOwpAQCAtNjMsMTIgKzY2LDExIEBACiAgICAgICogQHBhcmFtIGNvbnN0YW50UG9vbCB0aGUgY29uc3RhbnQgcG9vbCBvZiB3aGljaCB0aGlzIGVudHJ5IGlzIGEgbWVtYmVyCiAgICAgICogICAgICBhbmQgYWdhaW5zdCB3aGljaCB0aGlzIGVudHJ5IGlzIHRvIGJlIHJlc29sdmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlc29sdmUoQ29uc3RhbnRQb29sIGNvbnN0YW50UG9vbCkgewogICAgICAgICBzZXRWYWx1ZSgoKFV0ZjhDUEluZm8pIGNvbnN0YW50UG9vbC5nZXRFbnRyeShpbmRleCkpLmdldFZhbHVlKCkpOwogICAgICAgICBzdXBlci5yZXNvbHZlKGNvbnN0YW50UG9vbCk7CiAgICAgfQogCi0gICAgLyoqIHRoZSBpbmRleCBpbnRvIHRoZSBjb25zdGFudCBwb29sIGNvbnRhaW5pbmcgdGhlIHN0cmluZydzIGNvbnRlbnQgKi8KLSAgICBwcml2YXRlIGludCBpbmRleDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2NvbnN0YW50cG9vbC9VdGY4Q1BJbmZvLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1V0ZjhDUEluZm8uamF2YQppbmRleCA1NDcxY2NkLi4yOGM0YzYzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1V0ZjhDUEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvY29uc3RhbnRwb29sL1V0ZjhDUEluZm8uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQxLDYgKzQxLDcgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBlbnRyeSBmcm9tCiAgICAgICogICAgICB0aGUgc3RyZWFtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlYWQoRGF0YUlucHV0U3RyZWFtIGNwU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB2YWx1ZSA9IGNwU3RyZWFtLnJlYWRVVEYoKTsKICAgICB9CkBAIC01MCw2ICs1MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb25zdGFudCBwb29sIGVudHJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiVVRGOCBWYWx1ZSA9ICIgKyB2YWx1ZTsKICAgICB9CkBAIC02NCw0ICs2NiwzIEBACiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kRGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kRGVwbG95bWVudFRvb2wuamF2YQppbmRleCAwYzllNjMyLi43NmJjYmRlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZERlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmREZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTYsMTkgKzE2LDE5IEBACiAgKgogICovCiAKLQogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7CiAKLQogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTM2LDEwICszNiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyLkRURExvY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CiAKLQogLyoqCiAgKiBCb3JsYW5kRGVwbG95bWVudFRvb2wgaXMgZGVkaWNhdGVkIHRvIHRoZSBCb3JsYW5kIEFwcGxpY2F0aW9uIFNlcnZlciA0LjUgYW5kIDQuNS4xCiAgKiBUaGlzIHRhc2sgZ2VuZXJhdGVzIGFuZCBjb21waWxlcyB0aGUgc3R1YnMgYW5kIHNrZWxldG9ucyBmb3IgYWxsIGVqYiBkZXNjcmliZWQgaW50byB0aGUKQEAgLTU4LDcgKzU4LDcgQEAKICAqIDxsaT52ZXJzaW9uIChpbnQpICAgICAgIDogdGVsbCB3aGF0IGlzIHRoZSBCb3JsYW5kIGFwcHNlcnZlciB2ZXJzaW9uIDQgb3IgNSA8L2xpPgogICogPC91bD4KICAqCi0gKjxQUkU+CisgKjxwcmU+CiAgKgogICogICAgICAmbHQ7ZWpiamFyIHNyY2Rpcj0mcXVvdDske2J1aWxkLmNsYXNzZXN9JnF1b3Q7CiAgKiAgICAgICAgICAgICAgIGJhc2VqYXJuYW1lPSZxdW90O3ZzbXAmcXVvdDsKQEAgLTcyLDI1ICs3MiwyNCBAQAogICogICAgICAgICAgJmx0O2luY2x1ZGUgbmFtZT0mcXVvdDtkZW1vXGhlbHBlclwqLmNsYXNzJnF1b3Q7LyZndDsKICAqICAgICAgICAgJmx0Oy9zdXBwb3J0Jmd0OwogICogICAgICZsdDsvZWpiamFyJmd0OwotICo8L1BSRT4KKyAqPC9wcmU+CiAgKgogICovCiBwdWJsaWMgY2xhc3MgQm9ybGFuZERlcGxveW1lbnRUb29sIGV4dGVuZHMgR2VuZXJpY0RlcGxveW1lbnRUb29sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgRXhlY3V0ZVN0cmVhbUhhbmRsZXIgewogICAgIC8qKiBCb3JsYW5kIDEuMSBlamIgaWQgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9CT1JMQU5EX0VKQgotICAgID0gIi0vL0lucHJpc2UgQ29ycG9yYXRpb24vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9CT1JMQU5EX0VKQiA9CisgICAgICAgICItLy9JbnByaXNlIENvcnBvcmF0aW9uLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiI7CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBUzQ1X0VKQjExX0RURF9MT0NBVElPTgotICAgID0gIi9jb20vaW5wcmlzZS9qMmVlL3htbC9kdGRzL2VqYi1qYXIuZHRkIjsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBUzQ1X0VKQjExX0RURF9MT0NBVElPTiA9CisgICAgICAgICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItamFyLmR0ZCI7CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0JBU19EVERfTE9DQVRJT04KLSAgICA9ICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItaW5wcmlzZS5kdGQiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFTX0RURF9MT0NBVElPTiA9CisgICAgICAgICIvY29tL2lucHJpc2UvajJlZS94bWwvZHRkcy9lamItaW5wcmlzZS5kdGQiOwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTX0REID0gImVqYi1pbnByaXNlLnhtbCI7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkVTX0REID0gImVqYi1ib3JsYW5kLnhtbCI7CiAKLQogICAgIC8qKiBKYXZhMmlpb3AgZXhlY3V0YWJsZSAqKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBMklJT1AgPSAiamF2YTJpaW9wIjsKIApAQCAtMTE0LDEzICsxMTMsMTMgQEAKIAogICAgIC8qKiBCb3JsYW5kIEVudGVycHJpc2UgU2VydmVyID0gdmVyc2lvbiA1ICovCiAgICAgc3RhdGljIGZpbmFsIGludCAgICBCRVMgICAgICAgPSA1OworCiAgICAgLyoqIEJvcmxhbmQgQXBwbGljYXRpb24gU2VydmVyIG9yIElucHJpc2UgQXBwbGljYXRpb24gU2VydmVyICA9IHZlcnNpb24gNCAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgICAgQkFTICAgICAgID0gNDsKIAogICAgIC8qKiBib3JsYW5kIGFwcHNlcnZlciB2ZXJzaW9uIDQgb3IgNSAqLwogICAgIHByaXZhdGUgaW50IHZlcnNpb24gPSBCQVM7CiAKLQogICAgIC8qKgogICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGl0IGlzIG5lY2Vzc2FyeSB0byB2ZXJpZnkgdGhlCiAgICAgICogcHJvZHVjZWQgamFyCkBAIC0xMjgsNyArMTI3LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5ICAgICA9IHRydWU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgIHZlcmlmeUFyZ3MgPSAiIjsKIAotICAgIHByaXZhdGUgSGFzaHRhYmxlIGdlbmZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmlsZT4gZ2VuZmlsZXMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIC8qKgogICAgICAqIHNldCB0aGUgZGVidWcgbW9kZSBmb3IgamF2YTJpaW9wIChkZWZhdWx0IGZhbHNlKQpAQCAtMTQ2LDcgKzE0NSw2IEBACiAgICAgICAgIHRoaXMudmVyaWZ5ID0gdmVyaWZ5OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBib3JsYW5kIGphciBmaWxlLgogICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgc3VmZml4LgpAQCAtMTU1LDcgKzE1Myw2IEBACiAgICAgICAgIHRoaXMuamFyU3VmZml4ID0gaW5TdHJpbmc7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBzZXRzIHNvbWUgYWRkaXRpb25hbCBhcmdzIHRvIHNlbmQgdG8gdmVyaWZ5IGNvbW1hbmQKICAgICAgKiBAcGFyYW0gYXJncyBhZGRpdGlvbmFsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCkBAIC0xNzMsNyArMTcwLDYgQEAKICAgICAgICAgdGhpcy5ib3JsYW5kRFREID0gaW5TdHJpbmc7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBzZXR0ZXIgdXNlZCB0byBzdG9yZSB3aGV0aGVyIHRoZSB0YXNrIHdpbGwgaW5jbHVkZSB0aGUgZ2VuZXJhdGUgY2xpZW50IHRhc2suCiAgICAgICogKHNlZSA6IEJvcmxhbmRHZW5lcmF0ZUNsaWVudCB0YXNrKQpAQCAtMjAwLDM0ICsxOTYsMjcgQEAKICAgICAgICAgdGhpcy5qYXZhMmlpb3BhcmFtcyA9IHBhcmFtczsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgYm9ybGFuZCBkZXNjcmlwdG9yIGhhbmRsZXIuCiAgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yeS4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yLgogICAgICAqLwogICAgIHByb3RlY3RlZCBEZXNjcmlwdG9ySGFuZGxlciBnZXRCb3JsYW5kRGVzY3JpcHRvckhhbmRsZXIoZmluYWwgRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9Ci0gICAgICAgICAgICBuZXcgRGVzY3JpcHRvckhhbmRsZXIoZ2V0VGFzaygpLCBzcmNEaXIpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVsZW1lbnQuZXF1YWxzKCJ0eXBlLXN0b3JhZ2UiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlsZW5hbWUgb2YgdmVuZG9yIHNwZWNpZmljIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWVXaXRoTUVUQSA9IGN1cnJlbnRUZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpbSB0aGUgTUVUQV9JTkZcIG9mZiBvZiB0aGUgZmlsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmlsZU5hbWVXaXRoTUVUQS5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZVdpdGhNRVRBLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3JGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoZmlsZU5hbWVXaXRoTUVUQSwgZGVzY3JpcHRvckZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKKyAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0RpcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoInR5cGUtc3RvcmFnZSIuZXF1YWxzKGN1cnJlbnRFbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZpbGVuYW1lIG9mIHZlbmRvciBzcGVjaWZpYyBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhlIE1FVEFfSU5GXCBvZmYgb2YgdGhlIGZpbGUgbmFtZQorICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoY3VycmVudFRleHQsIG5ldyBGaWxlKHNyY0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCkpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OwogICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX0JPUkxBTkRfRUpCLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmxhbmREVEQgPT0gbnVsbCA/IERFRkFVTFRfQkFTX0RURF9MT0NBVElPTiA6IGJvcmxhbmREVEQpOwogCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVqYkphci5EVERMb2NhdGlvbiBkdGRMb2NhdGlvbiA9IChFamJKYXIuRFRETG9jYXRpb24pIGkubmV4dCgpOworICAgICAgICBmb3IgKERURExvY2F0aW9uIGR0ZExvY2F0aW9uIDogZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zKSB7CiAgICAgICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKGR0ZExvY2F0aW9uLmdldFB1YmxpY0lkKCksIGR0ZExvY2F0aW9uLmdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBoYW5kbGVyOwpAQCAtMjM5LDE0ICsyMjgsMTUgQEAKICAgICAgKiBAcGFyYW0gZWpiRmlsZXMgdGhlIG1hcCB0byBhZGQgdGhlIGZpbGVzIHRvLgogICAgICAqIEBwYXJhbSBkZFByZWZpeCB0aGUgcHJlZml4IHRvIHVzZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKIAogICAgICAgICAvL2Nob29zZSB0aGUgcmlnaHQgdmVuZG9yIERECi0gICAgICAgIGlmICghKHZlcnNpb24gPT0gQkVTIHx8IHZlcnNpb24gPT0gQkFTKSkgeworICAgICAgICBpZiAodmVyc2lvbiAhPSBCRVMgJiYgdmVyc2lvbiAhPSBCQVMpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidmVyc2lvbiAiICsgdmVyc2lvbiArICIgaXMgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIGRkID0gKHZlcnNpb24gPT0gQkVTID8gQkVTX0REIDogQkFTX0REKTsKKyAgICAgICAgU3RyaW5nIGRkID0gKHZlcnNpb24gPT0gQkVTKSA/IEJFU19ERCA6IEJBU19ERDsKIAogICAgICAgICBsb2coInZlbmRvciBmaWxlIDogIiArIGRkUHJlZml4ICsgZGQsIFByb2plY3QuTVNHX0RFQlVHKTsKIApAQCAtMjY1LDYgKzI1NSw3IEBACiAgICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQogICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyAgamFyU3VmZml4KTsKICAgICB9CkBAIC0yOTMsOCArMjg0LDcgQEAKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Qm9ybGFuZEphclY1KEZpbGUgc291cmNlSmFyKSB7CiAgICAgICAgIGxvZygidmVyaWZ5IEJFUyAiICsgc291cmNlSmFyLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEV4ZWNUYXNrIGV4ZWNUYXNrID0gbnVsbDsKLSAgICAgICAgICAgIGV4ZWNUYXNrID0gbmV3IEV4ZWNUYXNrKGdldFRhc2soKSk7CisgICAgICAgICAgICBFeGVjVGFzayBleGVjVGFzayA9IG5ldyBFeGVjVGFzayhnZXRUYXNrKCkpOwogICAgICAgICAgICAgZXhlY1Rhc2suc2V0RGlyKG5ldyBGaWxlKCIuIikpOwogICAgICAgICAgICAgZXhlY1Rhc2suc2V0RXhlY3V0YWJsZSgiaWFzdG9vbCIpOwogICAgICAgICAgICAgLy9jbGFzc3BhdGgKQEAgLTMxNCw5ICszMDQsNyBAQAogICAgICAgICAgICAgZXhlY1Rhc2suZXhlY3V0ZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBnZW5lcmF0ZWNsaWVudCBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQgRGV0YWlsczogIiwgZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1Myw3ICszNDEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZW5lcmF0ZSB0aGUgY2xpZW50IGphciBjb3JyZXNwb25kaW5nIHRvIHRoZSBqYXIgZmlsZSBwYXNzZWQgYXMgcGFyYW1ldGVyCiAgICAgICogdGhlIG1ldGhvZCB1c2VzIHRoZSBCb3JsYW5kR2VuZXJhdGVDbGllbnQgdGFzay4KQEAgLTM2Myw3ICszNTAsNyBAQAogICAgICAgICBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLmFkZFRhc2tEZWZpbml0aW9uKCJpbnRlcm5hbF9iYXNfZ2VuZXJhdGVjbGllbnQiLAogICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudC5jbGFzcyk7CiAKLSAgICAgICAgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkJvcmxhbmRHZW5lcmF0ZUNsaWVudCBnZW50YXNrID0gbnVsbDsKKyAgICAgICAgQm9ybGFuZEdlbmVyYXRlQ2xpZW50IGdlbnRhc2s7CiAgICAgICAgIGxvZygiZ2VuZXJhdGUgY2xpZW50IGZvciAiICsgc291cmNlSmFyLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldFRhc2soKS5nZXRQcm9qZWN0KCk7CkBAIC0zODAsOSArMzY3LDcgQEAKICAgICAgICAgICAgIGdlbnRhc2suZXhlY3V0ZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy9UTyBETyA6IGRlbGV0ZSB0aGUgZmlsZSBpZiBpdCBpcyBub3QgYSB2YWxpZCBmaWxlLgotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyAiICsgVkVSSUZZICsgIiBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgIiArIFZFUklGWSwgZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM5MSwxMCArMzc2LDggQEAKICAgICAgKiBBZGQgYWxsIHRoZSBnZW5lcmF0ZSBjbGFzcyBmaWxlIGludG8gdGhlIGVqYiBmaWxlcwogICAgICAqIEBwYXJhbSBpdGhvbWVzIDogaXRlcmF0b3Igb24gaG9tZSBjbGFzcwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBidWlsZEJvcmxhbmRTdHVicyhJdGVyYXRvciBpdGhvbWVzKSB7Ci0gICAgICAgIEV4ZWN1dGUgZXhlY1Rhc2sgPSBudWxsOwotCi0gICAgICAgIGV4ZWNUYXNrID0gbmV3IEV4ZWN1dGUodGhpcyk7CisgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkQm9ybGFuZFN0dWJzKENvbGxlY3Rpb248U3RyaW5nPiBpdGhvbWVzKSB7CisgICAgICAgIEV4ZWN1dGUgZXhlY1Rhc2sgPSBuZXcgRXhlY3V0ZSh0aGlzKTsKICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFzaygpLmdldFByb2plY3QoKTsKICAgICAgICAgZXhlY1Rhc2suc2V0QW50UnVuKHByb2plY3QpOwogICAgICAgICBleGVjVGFzay5zZXRXb3JraW5nRGlyZWN0b3J5KHByb2plY3QuZ2V0QmFzZURpcigpKTsKQEAgLTQxOCwxNiArNDAxLDE0IEBACiAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldExpbmUoamF2YTJpaW9wYXJhbXMpOwogICAgICAgICB9CiAKLQogICAgICAgICAvL3Jvb3QgZGlyCiAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1yb290X2RpciIpOwogICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGdldENvbmZpZygpLnNyY0Rpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIC8vY29tcGlsaW5nIG9yZGVyCiAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1jb21waWxlIik7CiAgICAgICAgIC8vYWRkIHRoZSBob21lIGNsYXNzCi0gICAgICAgIHdoaWxlIChpdGhvbWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgY29tbWFuZGxpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShpdGhvbWVzLm5leHQoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQorICAgICAgICBpdGhvbWVzLnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgLmZvckVhY2godiAtPiBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKHYpKTsKIAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9nKCJDYWxsaW5nIGphdmEyaWlvcCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtNDM1LDExICs0MTYsMTEgQEAKICAgICAgICAgICAgIGV4ZWNUYXNrLnNldENvbW1hbmRsaW5lKGNvbW1hbmRsaW5lLmdldENvbW1hbmRsaW5lKCkpOwogICAgICAgICAgICAgaW50IHJlc3VsdCA9IGV4ZWNUYXNrLmV4ZWN1dGUoKTsKICAgICAgICAgICAgIGlmIChFeGVjdXRlLmlzRmFpbHVyZShyZXN1bHQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nIGphdmEyaWlvcCAocmV0IGNvZGUgaXMgIgotICAgICAgICAgICAgICAgICAgICArIHJlc3VsdCArICIpIjsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRUYXNrKCkuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIGV4ZWN1dGluZyBqYXZhMmlpb3AgKHJldCBjb2RlIGlzICIgKyByZXN1bHQgKyAiKSIsCisgICAgICAgICAgICAgICAgICAgIGdldFRhc2soKS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGxvZygiamF2YTJpaW9wIGV4Y2VwdGlvbiA6IiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldFRhc2soKS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpAQCAtNDU1LDEzICs0MzYsMTMgQEAKICAgICAgKiBAcGFyYW0gcHVibGljSWQgdGhlIGlkIHRvIHVzZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSmFyKFN0cmluZyBiYXNlTmFtZSwgRmlsZSBqYXJGaWxlLCBIYXNodGFibGUgZmlsZXMsIFN0cmluZyBwdWJsaWNJZCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZmlsZXMsIFN0cmluZyBwdWJsaWNJZCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy9idWlsZCB0aGUgaG9tZSBjbGFzc2VzIGxpc3QuCi0gICAgICAgIFZlY3RvciBob21lcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQgPSBmaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhenogPSAoU3RyaW5nKSBpdC5uZXh0KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBob21lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZvciAoU3RyaW5nIGNsYXp6IDogZmlsZXMua2V5U2V0KCkpIHsKICAgICAgICAgICAgIGlmIChjbGF6ei5lbmRzV2l0aCgiSG9tZS5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgLy9yZW1vdmUgLmNsYXNzIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgIFN0cmluZyBob21lID0gdG9DbGFzcyhjbGF6eik7CkBAIC00NzAsNyArNDUxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGJ1aWxkQm9ybGFuZFN0dWJzKGhvbWVzLml0ZXJhdG9yKCkpOworICAgICAgICBidWlsZEJvcmxhbmRTdHVicyhob21lcyk7CiAKICAgICAgICAgLy9hZGQgdGhlIGdlbiBmaWxlcyB0byB0aGUgY29sbGVjdGlvbgogICAgICAgICBmaWxlcy5wdXRBbGwoZ2VuZmlsZXMpOwpAQCAtNDkzLDkgKzQ3NCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgdG9DbGFzcyhTdHJpbmcgZmlsZW5hbWUpIHsKICAgICAgICAgLy9yZW1vdmUgdGhlIC5jbGFzcwotICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7Ci0gICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCdcXCcsICcuJyk7Ci0gICAgICAgIHJldHVybiBjbGFzc25hbWU7CisgICAgICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoIi5jbGFzcyIpKQorICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgJy4nKS5yZXBsYWNlKCcvJywgJy4nKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUwNCwyOCArNDg0LDM1IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSAgU3RyaW5nIHRvQ2xhc3NGaWxlKFN0cmluZyBmaWxlbmFtZSkgewogICAgICAgICAvL3JlbW92ZSB0aGUgLmNsYXNzCi0gICAgICAgIFN0cmluZyBjbGFzc2ZpbGUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoIi5qYXZhIikpOwotICAgICAgICBjbGFzc2ZpbGUgPSBjbGFzc2ZpbGUgKyAiLmNsYXNzIjsKLSAgICAgICAgcmV0dXJuIGNsYXNzZmlsZTsKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLnJlcGxhY2VGaXJzdCgiXFwuamF2YSQiLCAiLmNsYXNzIik7CiAgICAgfQogCiAgICAgLy8gaW1wbGVtZW50YXRpb24gb2Ygb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXIgaW50ZXJmYWNlCiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiAgeyB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KKwogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSAgeyAgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgfQorCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc0lucHV0U3RyZWFtKE91dHB1dFN0cmVhbSBwYXJhbTEpIHRocm93cyBJT0V4Y2VwdGlvbiAgIHsgfQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NJbnB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcGFyYW0xKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIH0KIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgb3V0cHV0IHN0cmVhbSBvZiB0aGUgcHJvY2Vzcy4KICAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NPdXRwdXRTdHJlYW0oSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMpKSkgewogICAgICAgICAgICAgU3RyaW5nIGphdmFmaWxlOwogICAgICAgICAgICAgd2hpbGUgKChqYXZhZmlsZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKGphdmFmaWxlLmVuZHNXaXRoKCIuamF2YSIpKSB7CkBAIC01MzUsMTAgKzUyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgIGdlbmZpbGVzLnB1dChrZXksIG5ldyBGaWxlKGNsYXNzZmlsZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgcGFyc2luZyAgamF2YTJpaW9wIG91dHB1dC4gRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcGFyc2luZyBqYXZhMmlpb3Agb3V0cHV0LiIsIGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NDcsNiArNTMyLDcgQEAKICAgICAgKiBAcGFyYW0gaXMgdGhlIGlucHV0IHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2Nlc3NFcnJvclN0cmVhbShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOwogICAgICAgICBTdHJpbmcgcyA9IHJlYWRlci5yZWFkTGluZSgpOwpAQCAtNTU1LDQgKzU0MSwzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kR2VuZXJhdGVDbGllbnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Cb3JsYW5kR2VuZXJhdGVDbGllbnQuamF2YQppbmRleCBkZDQ2MjY5Li44Y2EzYjUzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvQm9ybGFuZEdlbmVyYXRlQ2xpZW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0JvcmxhbmRHZW5lcmF0ZUNsaWVudC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTMzLDcgKzEzMyw2IEBACiAgICAgICAgIGNyZWF0ZUNsYXNzcGF0aCgpLnNldFJlZmlkKHIpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRG8gdGhlIHdvcmsuCiAgICAgICoKQEAgLTE0MSw2ICsxNDAsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBidWlsZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoZWpiamFyZmlsZSA9PSBudWxsIHx8IGVqYmphcmZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJpbnZhbGlkIGVqYiBqYXIgZmlsZS4iKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICAgICAgU3RyaW5nIGVqYmphcm5hbWUgPSBlamJqYXJmaWxlLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICAgICAgLy9jbGllbnRuYW1lID0gZWpiamFyZmlsZStjbGllbnQuamFyCiAgICAgICAgICAgICBTdHJpbmcgY2xpZW50bmFtZSA9IGVqYmphcm5hbWUuc3Vic3RyaW5nKDAsIGVqYmphcm5hbWUubGFzdEluZGV4T2YoIi4iKSk7Ci0gICAgICAgICAgICBjbGllbnRuYW1lID0gY2xpZW50bmFtZSArICJjbGllbnQuamFyIjsKKyAgICAgICAgICAgIGNsaWVudG5hbWUgKz0gImNsaWVudC5qYXIiOwogICAgICAgICAgICAgY2xpZW50amFyZmlsZSA9IG5ldyBGaWxlKGNsaWVudG5hbWUpOwogICAgICAgICB9CiAKQEAgLTE2MCwxNSArMTYwLDEzIEBACiAgICAgICAgICAgICBzZXRNb2RlKEpBVkFfTU9ERSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoISh2ZXJzaW9uID09IEJvcmxhbmREZXBsb3ltZW50VG9vbC5CRVMKLSAgICAgICAgICAgIHx8IHZlcnNpb24gPT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJBUykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidmVyc2lvbiAiICsgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICBpZiAodmVyc2lvbiAhPSBCb3JsYW5kRGVwbG95bWVudFRvb2wuQkVTICYmIHZlcnNpb24gIT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJBUykgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ2ZXJzaW9uICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCB2ZXJzaW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIGxvZygiY2xpZW50IGphciBmaWxlIGlzICIgKyBjbGllbnRqYXJmaWxlKTsKIAotICAgICAgICBpZiAobW9kZS5lcXVhbHNJZ25vcmVDYXNlKEZPUktfTU9ERSkpIHsKKyAgICAgICAgaWYgKEZPUktfTU9ERS5lcXVhbHNJZ25vcmVDYXNlKG1vZGUpKSB7CiAgICAgICAgICAgICBleGVjdXRlRm9yaygpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXhlY3V0ZUphdmEoKTsKQEAgLTE4MiwxNSArMTgwLDE0IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZUphdmEoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gQm9ybGFuZERlcGxveW1lbnRUb29sLkJFUykgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImphdmEgbW9kZSBpcyBzdXBwb3J0ZWQgb25seSBmb3IgIgotICAgICAgICAgICAgICAgICAgICArICJwcmV2aW91cyB2ZXJzaW9uIDw9IiArIEJvcmxhbmREZXBsb3ltZW50VG9vbC5CQVMpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImphdmEgbW9kZSBpcyBzdXBwb3J0ZWQgb25seSBmb3IgcHJldmlvdXMgdmVyc2lvbiA8PSAlZCIsCisgICAgICAgICAgICAgICAgICAgIEJvcmxhbmREZXBsb3ltZW50VG9vbC5CQVMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBsb2coIm1vZGUgOiBqYXZhIik7CiAKLSAgICAgICAgICAgIEphdmEgZXhlY1Rhc2sgPSBudWxsOwotICAgICAgICAgICAgZXhlY1Rhc2sgPSBuZXcgSmF2YSh0aGlzKTsKLQorICAgICAgICAgICAgSmF2YSBleGVjVGFzayA9IG5ldyBKYXZhKHRoaXMpOwogICAgICAgICAgICAgZXhlY1Rhc2suc2V0RGlyKG5ldyBGaWxlKCIuIikpOwogICAgICAgICAgICAgZXhlY1Rhc2suc2V0Q2xhc3NuYW1lKCJjb20uaW5wcmlzZS5zZXJ2ZXIuY29tbWFuZGxpbmUuRUpCVXRpbGl0aWVzIik7CiAgICAgICAgICAgICAvL2NsYXNzcGF0aApAQCAtMjE4LDggKzIxNSw3IEBACiAKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIEhhdmUgdG8gY2F0Y2ggdGhpcyBiZWNhdXNlIG9mIHRoZSBzZW1hbnRpY3Mgb2YgY2FsbGluZyBtYWluKCkKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQgRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBnZW5lcmF0ZWNsaWVudCIsIGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjcsNyArMjIzLDcgQEAKICAgICAgKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBzeXN0ZW0gYXBpLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCi0gICAgcHJvdGVjdGVkICB2b2lkIGV4ZWN1dGVGb3JrKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlRm9yaygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICh2ZXJzaW9uID09IEJvcmxhbmREZXBsb3ltZW50VG9vbC5CQVMpIHsKICAgICAgICAgICAgIGV4ZWN1dGVGb3JrVjQoKTsKICAgICAgICAgfQpAQCAtMjQwLDEzICsyMzYsMTEgQEAKICAgICAgKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBzeXN0ZW0gYXBpLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCi0gICAgcHJvdGVjdGVkICB2b2lkIGV4ZWN1dGVGb3JrVjQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVGb3JrVjQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewotCiAgICAgICAgICAgICBsb2coIm1vZGUgOiBmb3JrICIgKyBCb3JsYW5kRGVwbG95bWVudFRvb2wuQkFTLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAKICAgICAgICAgICAgIEV4ZWNUYXNrIGV4ZWNUYXNrID0gbmV3IEV4ZWNUYXNrKHRoaXMpOwotCiAgICAgICAgICAgICBleGVjVGFzay5zZXREaXIobmV3IEZpbGUoIi4iKSk7CiAgICAgICAgICAgICBleGVjVGFzay5zZXRFeGVjdXRhYmxlKCJpYXN0b29sIik7CiAgICAgICAgICAgICBleGVjVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiZ2VuZXJhdGVjbGllbnQiKTsKQEAgLTI2NywyNCArMjYxLDE5IEBACiAgICAgICAgICAgICBleGVjVGFzay5leGVjdXRlKCk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBIYXZlIHRvIGNhdGNoIHRoaXMgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIGNhbGxpbmcgbWFpbigpCi0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nIGdlbmVyYXRlY2xpZW50IERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBnZW5lcmF0ZWNsaWVudCIsIGUpOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBsYXVuY2ggdGhlIGdlbmVyYXRlIGNsaWVudCB1c2luZyBzeXN0ZW0gYXBpLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCi0gICAgcHJvdGVjdGVkICB2b2lkIGV4ZWN1dGVGb3JrVjUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGVGb3JrVjUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9nKCJtb2RlIDogZm9yayAiICsgQm9ybGFuZERlcGxveW1lbnRUb29sLkJFUywgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgRXhlY1Rhc2sgZXhlY1Rhc2sgPSBuZXcgRXhlY1Rhc2sodGhpcyk7Ci0KICAgICAgICAgICAgIGV4ZWNUYXNrLnNldERpcihuZXcgRmlsZSgiLiIpKTsKLQogICAgICAgICAgICAgZXhlY1Rhc2suc2V0RXhlY3V0YWJsZSgiaWFzdG9vbCIpOwogICAgICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICAgICAgZXhlY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1kZWJ1ZyIpOwpAQCAtMzAzLDExICsyOTIsOCBAQAogICAgICAgICAgICAgZXhlY1Rhc2suZXhlY3V0ZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBnZW5lcmF0ZWNsaWVudCBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgKyBlLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIGNhbGxpbmcgZ2VuZXJhdGVjbGllbnQiLCBlKTsKICAgICAgICAgfQotCiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRGVzY3JpcHRvckhhbmRsZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCmluZGV4IGFmMTU5NDUuLjQ3YzgxNTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9EZXNjcmlwdG9ySGFuZGxlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTMgKzE5LDE0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CkBAIC05NywyMCArOTgsMjAgQEAKICAgICAgKiBwdXQgaW50byB0aGUgamFyIGZpbGUsIG1hcHBlZCB0byBGaWxlIG9iamVjdHMgIEFjY2Vzc2VkIGJ5IHRoZSBTQVgKICAgICAgKiBwYXJzZXIgY2FsbC1iYWNrIG1ldGhvZCBjaGFyYWN0ZXJzKCkuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBlamJGaWxlcyA9IG51bGw7CisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSB2YWx1ZSBmb3VuZCBpbiB0aGUgJmx0O2VqYi1uYW1lJmd0OyBlbGVtZW50CiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBlamJOYW1lID0gbnVsbDsKIAotICAgIHByaXZhdGUgSGFzaHRhYmxlIGZpbGVEVERzID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgRmlsZT4gZmlsZURURHMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAotICAgIHByaXZhdGUgSGFzaHRhYmxlIHJlc291cmNlRFREcyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzb3VyY2VEVERzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaW5FSkJSZWYgPSBmYWxzZTsKIAotICAgIHByaXZhdGUgSGFzaHRhYmxlIHVybERURHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBVUkw+IHVybERURHMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwogCiAgICAgLyoqCkBAIC0xODUsMjIgKzE4NiwyMyBAQAogICAgICAqIEByZXR1cm4gYW4gaW5wdXRzb3VyY2UgZm9yIHRoaXMgaWRlbnRpZmllcgogICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKIAotICAgICAgICBGaWxlIGR0ZEZpbGUgPSAoRmlsZSkgZmlsZURURHMuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgRmlsZSBkdGRGaWxlID0gZmlsZURURHMuZ2V0KHB1YmxpY0lkKTsKICAgICAgICAgaWYgKGR0ZEZpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBvd25pbmdUYXNrLmxvZygiUmVzb2x2ZWQgIiArIHB1YmxpY0lkICsgIiB0byBsb2NhbCBmaWxlICIKICAgICAgICAgICAgICAgICAgICAgKyBkdGRGaWxlLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZHRkRmlsZSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShGaWxlcy5uZXdJbnB1dFN0cmVhbShkdGRGaWxlLnRvUGF0aCgpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIC8vIGlnbm9yZQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIGR0ZFJlc291cmNlTmFtZSA9IChTdHJpbmcpIHJlc291cmNlRFREcy5nZXQocHVibGljSWQpOworICAgICAgICBTdHJpbmcgZHRkUmVzb3VyY2VOYW1lID0gcmVzb3VyY2VEVERzLmdldChwdWJsaWNJZCk7CiAgICAgICAgIGlmIChkdGRSZXNvdXJjZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShkdGRSZXNvdXJjZU5hbWUpOwogICAgICAgICAgICAgaWYgKGlzICE9IG51bGwpIHsKQEAgLTIxMCw3ICsyMTIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgVVJMIGR0ZFVybCA9IChVUkwpIHVybERURHMuZ2V0KHB1YmxpY0lkKTsKKyAgICAgICAgVVJMIGR0ZFVybCA9IHVybERURHMuZ2V0KHB1YmxpY0lkKTsKICAgICAgICAgaWYgKGR0ZFVybCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZHRkVXJsLm9wZW5TdHJlYW0oKTsKQEAgLTIzMiw4ICsyMzQsOCBAQAogICAgICAqIEdldHRlciBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBzZXQgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgRUpCIGphci4KICAgICAgKiBAcmV0dXJuIHRoZSBtYXAgb2YgZmlsZXMKICAgICAgKi8KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEZpbGVzKCkgewotICAgICAgICByZXR1cm4gKGVqYkZpbGVzID09IG51bGwpID8gbmV3IEhhc2h0YWJsZSgpIDogZWpiRmlsZXM7CisgICAgcHVibGljIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGdldEZpbGVzKCkgeworICAgICAgICByZXR1cm4gZWpiRmlsZXMgPT0gbnVsbCA/IG5ldyBIYXNodGFibGU8PihDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSA6IGVqYkZpbGVzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjU3LDggKzI1OSw5IEBACiAgICAgICogaW5zdGFuY2UgdmFyaWFibGVzIHRvIGVuc3VyZSBzYWZlIG9wZXJhdGlvbi4KICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgdGhpcy5lamJGaWxlcyA9IG5ldyBIYXNodGFibGUoREVGQVVMVF9IQVNIX1RBQkxFX1NJWkUsIDEpOworICAgICAgICB0aGlzLmVqYkZpbGVzID0gbmV3IEhhc2h0YWJsZTw+KERFRkFVTFRfSEFTSF9UQUJMRV9TSVpFLCAxKTsKICAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IG51bGw7CiAgICAgICAgIGluRUpCUmVmID0gZmFsc2U7CiAgICAgfQpAQCAtMjcxLDIxICsyNzQsMjIgQEAKICAgICAgKiBAcGFyYW0gYXR0cnMgQXR0cmlidXRlcyBhc3NvY2lhdGVkIHRvIHRoZSBlbGVtZW50LgogICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKQogICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jdXJyZW50RWxlbWVudCA9IG5hbWU7CiAgICAgICAgIGN1cnJlbnRUZXh0ID0gIiI7Ci0gICAgICAgIGlmIChuYW1lLmVxdWFscyhFSkJfUkVGKSB8fCBuYW1lLmVxdWFscyhFSkJfTE9DQUxfUkVGKSkgeworICAgICAgICBpZiAoRUpCX1JFRi5lcXVhbHMobmFtZSkgfHwgRUpCX0xPQ0FMX1JFRi5lcXVhbHMobmFtZSkpIHsKICAgICAgICAgICAgIGluRUpCUmVmID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0xPT0tJTkdfRUpCSkFSICYmIG5hbWUuZXF1YWxzKEVKQl9KQVIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9MT09LSU5HX0VKQkpBUiAmJiBFSkJfSkFSLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX0VKQkpBUjsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX0VKQkpBUiAmJiBuYW1lLmVxdWFscyhFTlRFUlBSSVNFX0JFQU5TKSkgeworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fRUpCSkFSICYmIEVOVEVSUFJJU0VfQkVBTlMuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fQkVBTlM7Ci0gICAgICAgIH0gZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9CRUFOUyAmJiBuYW1lLmVxdWFscyhTRVNTSU9OX0JFQU4pKSB7CisgICAgICAgIH0gZWxzZSBpZiAocGFyc2VTdGF0ZSA9PSBTVEFURV9JTl9CRUFOUyAmJiBTRVNTSU9OX0JFQU4uZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fU0VTU0lPTjsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJzZVN0YXRlID09IFNUQVRFX0lOX0JFQU5TICYmIG5hbWUuZXF1YWxzKEVOVElUWV9CRUFOKSkgeworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgRU5USVRZX0JFQU4uZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICBwYXJzZVN0YXRlID0gU1RBVEVfSU5fRU5USVRZOwotICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgbmFtZS5lcXVhbHMoTUVTU0FHRV9CRUFOKSkgeworICAgICAgICB9IGVsc2UgaWYgKHBhcnNlU3RhdGUgPT0gU1RBVEVfSU5fQkVBTlMgJiYgTUVTU0FHRV9CRUFOLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcGFyc2VTdGF0ZSA9IFNUQVRFX0lOX01FU1NBR0U7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMDAsNiArMzA0LDcgQEAKICAgICAgKiAgICAgICAgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICBwcm9jZXNzRWxlbWVudCgpOwogICAgICAgICBjdXJyZW50VGV4dCA9ICIiOwpAQCAtMzM1LDYgKzM0MCw3IEBACiAgICAgICogICAgICAgIGNoYXIgYXJyYXkgd2hlcmUgdGhlIGN1cnJlbnQgZGF0YSB0ZXJtaW5hdGVzLgogICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAgICAgICAgIGN1cnJlbnRUZXh0ICs9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VKQkRlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQppbmRleCA2ZWQ4ZTM0Li42YTc4NTJhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRUpCRGVwbG95bWVudFRvb2wuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE0ICsxOCwxMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKIAotCi0KIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwogCi0KIC8qKgogICogVGhlIGludGVyZmFjZSB0byBpbXBsZW1lbnQgZm9yIGRlcGxveW1lbnQgdG9vbHMuCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJKYXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9FamJKYXIuamF2YQppbmRleCAwNzI4Yjc1Li40ODNkMzRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvRWpiSmFyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0VqYkphci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNyArMjEsNiBAQAogLy8gU3RhbmRhcmQgamF2YSBpbXBvcnRzCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKQEAgLTEwMywxMiArMTAyLDEyIEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBBIEZpbGVzZXQgb2Ygc3VwcG9ydCBjbGFzc2VzCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdCBzdXBwb3J0RmlsZVNldHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHB1YmxpYyBMaXN0PEZpbGVTZXQ+IHN1cHBvcnRGaWxlU2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgbGlzdCBvZiBjb25maWd1cmVkIERURCBsb2NhdGlvbnMKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBBcnJheUxpc3QgZHRkTG9jYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBwdWJsaWMgQXJyYXlMaXN0PERURExvY2F0aW9uPiBkdGRMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG5hbWluZyBzY2hlbWUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGdlbmVyYXRlZCBqYXIgbmFtZQpAQCAtMTYyLDYgKzE2MSw3IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHZhbHVlcyBvZiB0aGlzIGF0dHJpYnV0ZSBjbGFzcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7RUpCX05BTUUsIERJUkVDVE9SWSwgREVTQ1JJUFRPUiwgQkFTRUpBUk5BTUV9OwogICAgICAgICB9CkBAIC0xNzgsMjAgKzE3OCwyMSBAQAogICAgICAgICAvKiogMi4wIHZhbHVlICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENNUDJfMCA9ICIyLjAiOwogICAgICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAgICAgQ01QMV8wLAogICAgICAgICAgICAgICAgIENNUDJfMCwKICAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICB9CisKICAgICAvKioKICAgICAgKiBUaGUgY29uZmlnIHdoaWNoIGlzIGJ1aWx0IGJ5IHRoaXMgdGFzayBhbmQgdXNlZCBieSB0aGUgdmFyaW91cyBkZXBsb3ltZW50CiAgICAgICogdG9vbHMgdG8gYWNjZXNzIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBlamJqYXIgdGFzawogICAgICAqLwogICAgIHByaXZhdGUgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKIAotCiAgICAgLyoqCiAgICAgICogU3RvcmVzIGEgaGFuZGxlIHRvIHRoZSBkaXJlY3RvcnkgdG8gcHV0IHRoZSBKYXIgZmlsZXMgaW4uIFRoaXMgaXMKICAgICAgKiBvbmx5IHVzZWQgYnkgdGhlIGdlbmVyaWMgZGVwbG95bWVudCBkZXNjcmlwdG9yIHRvb2wgd2hpY2ggaXMgY3JlYXRlZApAQCAtMjAzLDExICsyMDQsMTEgQEAKICAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCBqYXJmaWxlLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIGdlbmVyaWNKYXJTdWZmaXggPSAiLWdlbmVyaWMuamFyIjsKIAotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgQ01QIHZlcnNpb24gZm9yIHRoZSBqYm9zcyBqYXJmaWxlLiAqLworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgQ01QIHZlcnNpb24gZm9yIHRoZSBKQm9zcyBqYXJmaWxlLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIGNtcFZlcnNpb24gPSBDTVBWZXJzaW9uLkNNUDFfMDsKIAogICAgIC8qKiBUaGUgbGlzdCBvZiBkZXBsb3ltZW50IHRvb2xzIHdlIGFyZSBnb2luZyB0byBydW4uICovCi0gICAgcHJpdmF0ZSBBcnJheUxpc3QgZGVwbG95bWVudFRvb2xzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxFSkJEZXBsb3ltZW50VG9vbD4gZGVwbG95bWVudFRvb2xzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBBZGQgYSBkZXBsb3ltZW50IHRvb2wgdG8gdGhlIGxpc3Qgb2YgZGVwbG95bWVudCB0b29scyB0aGF0IHdpbGwgYmUKQEAgLTIyNiw3ICsyMjcsNyBAQAogICAgICAqIGRlcGxveW1lbnQgdG9vbCBmb3IgT3Jpb24gc2VydmVyLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgZGVwbG95bWVudCB0b29sIGluc3RhbmNlIHRvIGJlIGNvbmZpZ3VyZWQuCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTAKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgogICAgICAqLwogICAgIHB1YmxpYyBPcmlvbkRlcGxveW1lbnRUb29sIGNyZWF0ZU9yaW9uKCkgewogICAgICAgICBPcmlvbkRlcGxveW1lbnRUb29sIHRvb2wgPSBuZXcgT3Jpb25EZXBsb3ltZW50VG9vbCgpOwpAQCAtMjM1LDcgKzIzNiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2VibG9naWMgc2VydmVyLgorICAgICAqIEFkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYkxvZ2ljIHNlcnZlci4KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgogICAgICAqLwpAQCAtMjQ2LDcgKzI0Nyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2Vic3BoZXJlIDQuMCBzZXJ2ZXIuCisgICAgICogQWRkcyBhIGRlcGxveW1lbnQgdG9vbCBmb3IgV2ViU3BoZXJlIDQuMCBzZXJ2ZXIuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBkZXBsb3ltZW50IHRvb2wgaW5zdGFuY2UgdG8gYmUgY29uZmlndXJlZC4KICAgICAgKi8KQEAgLTMwOCw3ICszMDksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZHMgYSBkZXBsb3ltZW50IHRvb2wgZm9yIFdlYmxvZ2ljIHdoZW4gdXNpbmcgdGhlIFRvcGxpbmsKKyAgICAgKiBBZGRzIGEgZGVwbG95bWVudCB0b29sIGZvciBXZWJMb2dpYyB3aGVuIHVzaW5nIHRoZSBUT1BMaW5rCiAgICAgICogT2JqZWN0LVJlbGF0aW9uYWwgbWFwcGluZy4KICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGRlcGxveW1lbnQgdG9vbCBpbnN0YW5jZSB0byBiZSBjb25maWd1cmVkLgpAQCAtMzYxLDcgKzM2Miw2IEBACiAgICAgICAgIHJldHVybiBzdXBwb3J0RmlsZVNldDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgTWFuaWZlc3QgZmlsZSB0byB1c2Ugd2hlbiBqYXJyaW5nLiBBcyBvZiBFSkIgMS4xLCBtYW5pZmVzdAogICAgICAqIGZpbGVzIGFyZSBubyBsb25nZXIgdXNlZCB0byBjb25maWd1cmUgdGhlIEVKQi4gSG93ZXZlciwgdGhleSBzdGlsbApAQCAtNDIyLDEwICs0MjIsMTAgQEAKICAgICAgICAgaWYgKGNvbmZpZy5uYW1pbmdTY2hlbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZSA9IG5ldyBOYW1pbmdTY2hlbWUoKTsKICAgICAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUuc2V0VmFsdWUoTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FKTsKLSAgICAgICAgfSBlbHNlIGlmICghY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgaXMgbm90ICIKLSAgICAgICAgICAgICAgICArICJjb21wYXRpYmxlIHdpdGggdGhlICIKLSAgICAgICAgICAgICAgICArIGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSArICIgbmFtaW5nIHNjaGVtZSIpOworICAgICAgICB9IGVsc2UgaWYgKCFOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUuZXF1YWxzKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGJhc2VqYXJuYW1lIGF0dHJpYnV0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSAlcyBuYW1pbmcgc2NoZW1lIiwKKyAgICAgICAgICAgICAgICBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzcsMTEgKzQzNywxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE5hbWluZyhOYW1pbmdTY2hlbWUgbmFtaW5nU2NoZW1lKSB7CiAgICAgICAgIGNvbmZpZy5uYW1pbmdTY2hlbWUgPSBuYW1pbmdTY2hlbWU7Ci0gICAgICAgIGlmICghY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpCisgICAgICAgIGlmICghTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FLmVxdWFscyhjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkpCiAgICAgICAgICAgICAmJiBjb25maWcuYmFzZUphck5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYmFzZWphcm5hbWUgYXR0cmlidXRlIGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgKyAiY29tcGF0aWJsZSB3aXRoIHRoZSAiCi0gICAgICAgICAgICAgICAgKyBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkgKyAiIG5hbWluZyBzY2hlbWUiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGJhc2VqYXJuYW1lIGF0dHJpYnV0ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSAlcyBuYW1pbmcgc2NoZW1lIiwKKyAgICAgICAgICAgICAgICBjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NTksMTAgKzU1OSwxMCBAQAogICAgICAgICBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb25maWcubmFtaW5nU2NoZW1lID0gbmV3IE5hbWluZ1NjaGVtZSgpOwogICAgICAgICAgICAgY29uZmlnLm5hbWluZ1NjaGVtZS5zZXRWYWx1ZShOYW1pbmdTY2hlbWUuREVTQ1JJUFRPUik7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhOYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpCisgICAgICAgIH0gZWxzZSBpZiAoTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FLmVxdWFscyhjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkpCiAgICAgICAgICAgICAgICAgICAgICYmIGNvbmZpZy5iYXNlSmFyTmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBiYXNlamFybmFtZSBhdHRyaWJ1dGUgbXVzdCAiCi0gICAgICAgICAgICAgICAgKyAiYmUgc3BlY2lmaWVkIHdpdGggdGhlIGJhc2VqYXJuYW1lIG5hbWluZyBzY2hlbWUiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGJhc2VqYXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBiYXNlamFybmFtZSBuYW1pbmcgc2NoZW1lIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU4MSwxMCArNTgxLDExIEBACiAgICAgICogICAgICAgICAgICBlbmNvdW50ZXJlZCB0aGF0IGNhbm5vdCBiZSByZWNvdmVyZWQgZnJvbSwgdG8gc2lnbmFsIHRvIGFudAogICAgICAqICAgICAgICAgICAgdGhhdCBhIG1ham9yIHByb2JsZW0gb2NjdXJyZWQgd2l0aGluIHRoaXMgdGFzay4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdmFsaWRhdGVDb25maWcoKTsKIAotICAgICAgICBpZiAoZGVwbG95bWVudFRvb2xzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmIChkZXBsb3ltZW50VG9vbHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBHZW5lcmljRGVwbG95bWVudFRvb2wgZ2VuZXJpY1Rvb2wgPSBuZXcgR2VuZXJpY0RlcGxveW1lbnRUb29sKCk7CiAgICAgICAgICAgICBnZW5lcmljVG9vbC5zZXRUYXNrKHRoaXMpOwogICAgICAgICAgICAgZ2VuZXJpY1Rvb2wuc2V0RGVzdGRpcihkZXN0RGlyKTsKQEAgLTU5Miw4ICs1OTMsNyBAQAogICAgICAgICAgICAgZGVwbG95bWVudFRvb2xzLmFkZChnZW5lcmljVG9vbCk7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkZXBsb3ltZW50VG9vbHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFSkJEZXBsb3ltZW50VG9vbCB0b29sID0gKEVKQkRlcGxveW1lbnRUb29sKSBpLm5leHQoKTsKKyAgICAgICAgZm9yIChFSkJEZXBsb3ltZW50VG9vbCB0b29sIDogZGVwbG95bWVudFRvb2xzKSB7CiAgICAgICAgICAgICB0b29sLmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgICAgICAgdG9vbC52YWxpZGF0ZUNvbmZpZ3VyZWQoKTsKICAgICAgICAgfQpAQCAtNjA0LDcgKzYwNCw2IEBACiAgICAgICAgICAgICBzYXhQYXJzZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CiAgICAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKIAotCiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihjb25maWcuZGVzY3JpcHRvckRpcik7CiAgICAgICAgICAgICBkcy5zY2FuKCk7CiAgICAgICAgICAgICBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKQEAgLTYxNCwzMCArNjEzLDE4IEBACiAKICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZmlsZXMuIEVhY2ggZmlsZSByZXByZXNlbnRzIG9uZSBkZXBsb3ltZW50CiAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLCBhbmQgaGVuY2Ugb25lIGJlYW4gaW4gb3VyIG1vZGVsLgotICAgICAgICAgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZpbGVzLmxlbmd0aDsgKytpbmRleCkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZSA6IGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGluIGVhY2ggdG9vbAotICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGxveW1lbnRUb29scy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRUpCRGVwbG95bWVudFRvb2wgdG9vbCA9IChFSkJEZXBsb3ltZW50VG9vbCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRvb2wucHJvY2Vzc0Rlc2NyaXB0b3IoZmlsZXNbaW5kZXhdLCBzYXhQYXJzZXIpOworICAgICAgICAgICAgICAgIGZvciAoRUpCRGVwbG95bWVudFRvb2wgdG9vbCA6IGRlcGxveW1lbnRUb29scykgeworICAgICAgICAgICAgICAgICAgICB0b29sLnByb2Nlc3NEZXNjcmlwdG9yKGZpbGUsIHNheFBhcnNlcik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gc2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiU0FYRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIHBhcnNlci4iCi0gICAgICAgICAgICAgICAgKyAiICBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgKyBzZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBzZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNBWEV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBwYXJzZXIuIiwgc2UpOwogICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHdoaWxlIGNyZWF0aW5nIHBhcnNlci4gIgotICAgICAgICAgICAgICAgICAgICAgICArICJEZXRhaWxzOiAiICsgcGNlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIHBjZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgcGFyc2VyLiAiLCBwY2UpOwogICAgICAgICB9CiAgICAgfSAvLyBlbmQgb2YgZXhlY3V0ZSgpCiAKIH0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0dlbmVyaWNEZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0dlbmVyaWNEZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IDMzMjlhOGIuLjIxZTA4ODIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9HZW5lcmljRGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvR2VuZXJpY0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNCArMTgsMTMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwpAQCAtMzgsOSArMzcsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkxvY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIuRWpiSmFyLkRURExvY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5EZXBlbmRlbmN5QW5hbHl6ZXI7CiBpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CiBpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwpAQCAtMTE5LDcgKzExOCw3IEBACiAgICAgIC8qKgogICAgICAqIFNldCBvZiBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIEVKQiBqYXIKICAgICAgKi8KLSAgICBwcml2YXRlIFNldCBhZGRlZGZpbGVzOworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gYWRkZWRmaWxlczsKIAogICAgIC8qKgogICAgICAqIEhhbmRsZXIgdXNlZCB0byBwYXJzZSB0aGUgRUpCIFhNTCBkZXNjcmlwdG9yCkBAIC0xMzEsMTEgKzEzMCw2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBEZXBlbmRlbmN5QW5hbHl6ZXIgZGVwZW5kZW5jeUFuYWx5emVyOwogCi0gICAgLyoqIE5vIGFyZyBjb25zdHJ1Y3RvciAqLwotICAgIHB1YmxpYyBHZW5lcmljRGVwbG95bWVudFRvb2woKSB7Ci0gICAgfQotCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeTsgcmVxdWlyZWQuCiAgICAgICogQHBhcmFtIGluRGlyIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCkBAIC0xNTMsMTIgKzE0NywxMiBAQAogICAgICAgICByZXR1cm4gZGVzdERpcjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgdGFzayB3aGljaCBvd25zIHRoaXMgdG9vbAogICAgICAqCiAgICAgICogQHBhcmFtIHRhc2sgdGhlIFRhc2sgdG8gd2hpY2ggdGhpcyBkZXBsb3ltZW50IHRvb2wgaXMgYXNzb2NpYXRlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFRhc2sgdGFzaykgewogICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOwogICAgIH0KQEAgLTIzNSw3ICsyMjksNiBAQAogICAgICAgICAgICAgICAgIGNvbWJpbmVkUGF0aC5hcHBlbmQoY29uZmlnLmNsYXNzcGF0aCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gY29tYmluZWRQYXRoOwogICAgIH0KIApAQCAtMjY5LDE4ICsyNjIsMjMgQEAKICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBhbmFseXplckNsYXNzTmFtZSA9IG51bGw7Ci0gICAgICAgIGlmIChhbmFseXplci5lcXVhbHMoQU5BTFlaRVJfU1VQRVIpKSB7Ci0gICAgICAgICAgICBhbmFseXplckNsYXNzTmFtZSA9IEFOQUxZWkVSX0NMQVNTX1NVUEVSOwotICAgICAgICB9IGVsc2UgaWYgKGFuYWx5emVyLmVxdWFscyhBTkFMWVpFUl9GVUxMKSkgewotICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc05hbWUgPSBBTkFMWVpFUl9DTEFTU19GVUxMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc05hbWUgPSBhbmFseXplcjsKKyAgICAgICAgc3dpdGNoIChhbmFseXplcikgeworICAgICAgICAgICAgY2FzZSBBTkFMWVpFUl9TVVBFUjoKKyAgICAgICAgICAgICAgICBhbmFseXplckNsYXNzTmFtZSA9IEFOQUxZWkVSX0NMQVNTX1NVUEVSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkFMWVpFUl9GVUxMOgorICAgICAgICAgICAgICAgIGFuYWx5emVyQ2xhc3NOYW1lID0gQU5BTFlaRVJfQ0xBU1NfRlVMTDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYW5hbHl6ZXJDbGFzc05hbWUgPSBhbmFseXplcjsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBhbmFseXplckNsYXNzID0gQ2xhc3MuZm9yTmFtZShhbmFseXplckNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIKLSAgICAgICAgICAgICAgICA9IChEZXBlbmRlbmN5QW5hbHl6ZXIpIGFuYWx5emVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBEZXBlbmRlbmN5QW5hbHl6ZXI+IGFuYWx5emVyQ2xhc3MgPQorICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoYW5hbHl6ZXJDbGFzc05hbWUpCisgICAgICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKERlcGVuZGVuY3lBbmFseXplci5jbGFzcyk7CisgICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIgPSBhbmFseXplckNsYXNzLm5ld0luc3RhbmNlKCk7CiAgICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIuYWRkQ2xhc3NQYXRoKG5ldyBQYXRoKHRhc2suZ2V0UHJvamVjdCgpLAogICAgICAgICAgICAgICAgIGNvbmZpZy5zcmNEaXIuZ2V0UGF0aCgpKSk7CiAgICAgICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIuYWRkQ2xhc3NQYXRoKGNvbmZpZy5jbGFzc3BhdGgpOwpAQCAtMjk3LDEyICsyOTUsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRoaXMgdG9vbCBmb3IgdXNlIGluIHRoZSBlamJqYXIgdGFzay4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb25maWcgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgc3Vycm91bmRpbmcgZWpiamFyIHRhc2suCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKEVqYkphci5Db25maWcgY29uZmlnKSB7CiAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOwogCkBAIC0zMjcsMTIgKzMyNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGlucHV0RmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZ2ljYWxGaWxlbmFtZSkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlTdHJlYW0gPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKCFhZGRlZGZpbGVzLmNvbnRhaW5zKGxvZ2ljYWxGaWxlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOworICAgICAgICBpZiAoIWFkZGVkZmlsZXMuY29udGFpbnMobG9naWNhbEZpbGVuYW1lKSkgeworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpU3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oaW5wdXRGaWxlLnRvUGF0aCgpKSkgewogICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgemlwIGVudHJ5IGFuZCBhZGQgaXQgdG8gdGhlIGphciBmaWxlCi0gICAgICAgICAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkobG9naWNhbEZpbGVuYW1lLnJlcGxhY2UoJ1xcJywgJy8nKSk7CisgICAgICAgICAgICAgICAgWmlwRW50cnkgemlwRW50cnkgPQorICAgICAgICAgICAgICAgICAgICBuZXcgWmlwRW50cnkobG9naWNhbEZpbGVuYW1lLnJlcGxhY2UoJ1xcJywgJy8nKSk7CiAgICAgICAgICAgICAgICAgalN0cmVhbS5wdXROZXh0RW50cnkoemlwRW50cnkpOwogCiAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIGlucHV0IHN0cmVhbSwgYW5kIGJ1ZmZlciBldmVyeXRoaW5nIG92ZXIKQEAgLTM0NiwxNSArMzQzLDEyIEBACiAKICAgICAgICAgICAgICAgICAvL2FkZCBpdCB0byBsaXN0IG9mIGZpbGVzIGluIGphcgogICAgICAgICAgICAgICAgIGFkZGVkZmlsZXMuYWRkKGxvZ2ljYWxGaWxlbmFtZSk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBsb2coIldBUk5JTkc6IElPRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBlbnRyeSAiCi0gICAgICAgICAgICAgICAgKyBsb2dpY2FsRmlsZW5hbWUgKyAiIHRvIGphcmZpbGUgZnJvbSAiCi0gICAgICAgICAgICAgICAgKyBpbnB1dEZpbGUuZ2V0UGF0aCgpICsgIiAiICArIGlvZS5nZXRDbGFzcygpLmdldE5hbWUoKQotICAgICAgICAgICAgICAgICsgIi0iICsgaW9lLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfV0FSTik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAvLyBDbG9zZSB1cCB0aGUgZmlsZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBjbGFzcyBmaWxlCi0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaVN0cmVhbSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBsb2coIldBUk5JTkc6IElPRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBlbnRyeSAiICsgbG9naWNhbEZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgICsgIiB0byBqYXJmaWxlIGZyb20gIiArIGlucHV0RmlsZS5nZXRQYXRoKCkgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLSIgKyBpb2UuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzY5LDggKzM2Myw3IEBACiAgICAgICAgIHJlZ2lzdGVyS25vd25EVERzKGgpOwogCiAgICAgICAgIC8vIHJlZ2lzdGVyIGFueSBEVERzIHN1cHBsaWVkIGJ5IHRoZSB1c2VyCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIEVqYkphci5EVERMb2NhdGlvbiBkdGRMb2NhdGlvbiA9IChFamJKYXIuRFRETG9jYXRpb24pIGkubmV4dCgpOworICAgICAgICBmb3IgKERURExvY2F0aW9uIGR0ZExvY2F0aW9uIDogZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zKSB7CiAgICAgICAgICAgICBoLnJlZ2lzdGVyRFREKGR0ZExvY2F0aW9uLmdldFB1YmxpY0lkKCksIGR0ZExvY2F0aW9uLmdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBoOwpAQCAtMzg4LDYgKzM4MSw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0b3IoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikgewogCiAgICAgICAgIGNoZWNrQ29uZmlndXJhdGlvbihkZXNjcmlwdG9yRmlsZU5hbWUsIHNheFBhcnNlcik7CkBAIC0zOTYsNyArMzkwLDcgQEAKICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXREZXNjcmlwdG9ySGFuZGxlcihjb25maWcuc3JjRGlyKTsKIAogICAgICAgICAgICAgLy8gUmV0cmVpdmUgdGhlIGZpbGVzIHRvIGJlIGFkZGVkIHRvIEpBUiBmcm9tIEVKQiBkZXNjcmlwdG9yCi0gICAgICAgICAgICBIYXNodGFibGUgZWpiRmlsZXMgPSBwYXJzZUVqYkZpbGVzKGRlc2NyaXB0b3JGaWxlTmFtZSwgc2F4UGFyc2VyKTsKKyAgICAgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzID0gcGFyc2VFamJGaWxlcyhkZXNjcmlwdG9yRmlsZU5hbWUsIHNheFBhcnNlcik7CiAKICAgICAgICAgICAgIC8vIEFkZCBhbnkgc3VwcG9ydCBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGUgYnVpbGQgZmlsZQogICAgICAgICAgICAgYWRkU3VwcG9ydENsYXNzZXMoZWpiRmlsZXMpOwpAQCAtNDExLDggKzQwNSw2IEBACiAgICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1BTklGRVNULCBtYW5pZmVzdEZpbGUpOwogICAgICAgICAgICAgfQogCi0KLQogICAgICAgICAgICAgLy8gRmlyc3QgdGhlIHJlZ3VsYXIgZGVwbG95bWVudCBkZXNjcmlwdG9yCiAgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBFSkJfREQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoY29uZmlnLmRlc2NyaXB0b3JEaXIsIGRlc2NyaXB0b3JGaWxlTmFtZSkpOwpAQCAtNDI1LDcgKzQxNyw3IEBACiAKICAgICAgICAgICAgIC8vIExhc3RseSBjcmVhdGUgRmlsZSBvYmplY3QgZm9yIHRoZSBKYXIgZmlsZXMuIElmIHdlIGFyZSB1c2luZwogICAgICAgICAgICAgLy8gYSBmbGF0IGRlc3RpbmF0aW9uIGRpciwgdGhlbiB3ZSBuZWVkIHRvIHJlZGVmaW5lIGJhc2VOYW1lIQotICAgICAgICAgICAgaWYgKGNvbmZpZy5mbGF0RGVzdERpciAmJiBiYXNlTmFtZS5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY29uZmlnLmZsYXREZXN0RGlyICYmICFiYXNlTmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpbnQgc3RhcnROYW1lID0gYmFzZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgIGlmIChzdGFydE5hbWUgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgc3RhcnROYW1lID0gMDsKQEAgLTQzNyw3ICs0MjksNiBAQAogCiAgICAgICAgICAgICBGaWxlIGphckZpbGUgPSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKTsKIAotCiAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCBhIGJ1aWxkIGFuZCBzdGFydCBkb2luZyB0aGUgd29yayEKICAgICAgICAgICAgIGlmIChuZWVkVG9SZWJ1aWxkKGVqYkZpbGVzLCBqYXJGaWxlKSkgewogICAgICAgICAgICAgICAgIC8vIExvZyB0aGF0IHdlIGFyZSBnb2luZyB0byBidWlsZC4uLgpAQCAtNDUxLDI3ICs0NDIsMjMgQEAKICAgICAgICAgICAgICAgICAvLyBVc2UgaGVscGVyIG1ldGhvZCB0byB3cml0ZSB0aGUgamFyZmlsZQogICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCA9IGdldFB1YmxpY0lkKCk7CiAgICAgICAgICAgICAgICAgd3JpdGVKYXIoYmFzZU5hbWUsIGphckZpbGUsIGVqYkZpbGVzLCBwdWJsaWNJZCk7Ci0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTG9nIHRoYXQgdGhlIGZpbGUgaXMgdXAgdG8gZGF0ZS4uLgogICAgICAgICAgICAgICAgIGxvZyhqYXJGaWxlLnRvU3RyaW5nKCkgKyAiIGlzIHVwIHRvIGRhdGUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQotCiAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJTQVhFeGNlcHRpb24gd2hpbGUgcGFyc2luZyAnIgotICAgICAgICAgICAgICAgICsgZGVzY3JpcHRvckZpbGVOYW1lCi0gICAgICAgICAgICAgICAgKyAiJy4gVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgYmFkbHktZm9ybWVkIFhNTC4iCi0gICAgICAgICAgICAgICAgKyAiICBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgKyBzZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBzZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlNBWEV4Y2VwdGlvbiB3aGlsZSBwYXJzaW5nICciICsgZGVzY3JpcHRvckZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICsgIicuIFRoaXMgcHJvYmFibHkgaW5kaWNhdGVzIGJhZGx5LWZvcm1lZCBYTUwuIgorICAgICAgICAgICAgICAgICAgICArICIgIERldGFpbHM6ICIgKyBzZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgc2UpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSU9FeGNlcHRpb24gd2hpbGUgcGFyc2luZyciCi0gICAgICAgICAgICAgICAgKyBkZXNjcmlwdG9yRmlsZU5hbWUKLSAgICAgICAgICAgICAgICArICInLiAgVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzY3JpcHRvciIKLSAgICAgICAgICAgICAgICArICIgZG9lc24ndCBleGlzdC4gRGV0YWlsczogIgotICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGlvZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIklPRXhjZXB0aW9uIHdoaWxlIHBhcnNpbmcnIiArIGRlc2NyaXB0b3JGaWxlTmFtZQorICAgICAgICAgICAgICAgICAgICArICInLiAgVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVzY3JpcHRvciIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgZXhpc3QuIERldGFpbHM6ICIgKyBpb2UuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgIGlvZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ4OSw3ICs0NzYsNiBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbihTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQogICAgICAgICAvKgogICAgICAgICAgKiBGb3IgdGhlIEdlbmVyaWNEZXBsb3ltZW50VG9vbCwgZG8gbm90aGluZy4gIFZlbmRvciBzcGVjaWZpYwogICAgICAgICAgKiBzdWJjbGFzc2VzIHNob3VsZCB0aHJvdyBhIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzCkBAIC01MTIsMjggKzQ5OCwxNyBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgQW4gSU9FeGNlcHRpb24gZnJvbSB0aGUgcGFyc2VyLCBwb3NzaWJseSBmcm9tIGEKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBieXRlIHN0cmVhbSBvciBjaGFyYWN0ZXIgc3RyZWFtCiAgICAgICovCi0gICAgcHJvdGVjdGVkIEhhc2h0YWJsZSBwYXJzZUVqYkZpbGVzKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsIFNBWFBhcnNlciBzYXhQYXJzZXIpCisgICAgcHJvdGVjdGVkIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IHBhcnNlRWpiRmlsZXMoU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSwgU0FYUGFyc2VyIHNheFBhcnNlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBkZXNjcmlwdG9yU3RyZWFtID0gbnVsbDsKLSAgICAgICAgSGFzaHRhYmxlIGVqYkZpbGVzID0gbnVsbDsKLQotICAgICAgICB0cnkgewotCi0gICAgICAgICAgICAvKiBQYXJzZSB0aGUgZWpiIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFdoaWxlIGl0IG1heSBub3QKLSAgICAgICAgICAgICAqIGxvb2sgbGlrZSBtdWNoLCB3ZSB1c2UgYSBTQVhQYXJzZXIgYW5kIGFuIGlubmVyIGNsYXNzIHRvCi0gICAgICAgICAgICAgKiBnZXQgaG9sZCBvZiBhbGwgdGhlIGNsYXNzZmlsZSBuYW1lcyBmb3IgdGhlIGRlc2NyaXB0b3IuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGRlc2NyaXB0b3JTdHJlYW0KLSAgICAgICAgICAgICAgICA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoY29uZmlnLmRlc2NyaXB0b3JEaXIsIGRlc2NyaXB0b3JGaWxlTmFtZSkpOworICAgICAgICAvKiBQYXJzZSB0aGUgZWpiIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIFdoaWxlIGl0IG1heSBub3QKKyAgICAgICAgICogbG9vayBsaWtlIG11Y2gsIHdlIHVzZSBhIFNBWFBhcnNlciBhbmQgYW4gaW5uZXIgY2xhc3MgdG8KKyAgICAgICAgICogZ2V0IGhvbGQgb2YgYWxsIHRoZSBjbGFzc2ZpbGUgbmFtZXMgZm9yIHRoZSBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBkZXNjcmlwdG9yU3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oCisgICAgICAgICAgICBuZXcgRmlsZShjb25maWcuZGVzY3JpcHRvckRpciwgZGVzY3JpcHRvckZpbGVOYW1lKS50b1BhdGgoKSkpIHsKICAgICAgICAgICAgIHNheFBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoZGVzY3JpcHRvclN0cmVhbSksIGhhbmRsZXIpOwotCi0gICAgICAgICAgICBlamJGaWxlcyA9IGhhbmRsZXIuZ2V0RmlsZXMoKTsKLQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGRlc2NyaXB0b3JTdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RmlsZXMoKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlamJGaWxlczsKICAgICB9CiAKICAgICAvKioKQEAgLTU0MywyMiArNTE4LDE4IEBACiAgICAgICogQHBhcmFtIGVqYkZpbGVzIEhhc2h0YWJsZSBvZiBFSkIgY2xhc3NlcyAoYW5kIG90aGVyKSBmaWxlcyB0aGF0IHdpbGwgYmUKICAgICAgKiAgICAgICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGNvbXBsZXRlZCBKQVIgZmlsZQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRDbGFzc2VzKEhhc2h0YWJsZSBlamJGaWxlcykgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZFN1cHBvcnRDbGFzc2VzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzKSB7CiAgICAgICAgIC8vIGFkZCBpbiBzdXBwb3J0IGNsYXNzZXMgaWYgYW55CiAgICAgICAgIFByb2plY3QgcHJvamVjdCA9IHRhc2suZ2V0UHJvamVjdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25maWcuc3VwcG9ydEZpbGVTZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRmlsZVNldCBzdXBwb3J0RmlsZVNldCA9IChGaWxlU2V0KSBpLm5leHQoKTsKKyAgICAgICAgZm9yIChGaWxlU2V0IHN1cHBvcnRGaWxlU2V0IDogY29uZmlnLnN1cHBvcnRGaWxlU2V0cykgewogICAgICAgICAgICAgRmlsZSBzdXBwb3J0QmFzZURpciA9IHN1cHBvcnRGaWxlU2V0LmdldERpcihwcm9qZWN0KTsKICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc3VwcG9ydFNjYW5uZXIgPSBzdXBwb3J0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgc3VwcG9ydFNjYW5uZXIuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gc3VwcG9ydEZpbGVzID0gc3VwcG9ydFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzdXBwb3J0RmlsZXMubGVuZ3RoOyArK2opIHsKLSAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoc3VwcG9ydEZpbGVzW2pdLCBuZXcgRmlsZShzdXBwb3J0QmFzZURpciwgc3VwcG9ydEZpbGVzW2pdKSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzdXBwb3J0RmlsZSA6IHN1cHBvcnRTY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkgeworICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChzdXBwb3J0RmlsZSwgbmV3IEZpbGUoc3VwcG9ydEJhc2VEaXIsIHN1cHBvcnRGaWxlKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFVzaW5nIHRoZSBFSkIgZGVzY3JpcHRvciBmaWxlIG5hbWUgcGFzc2VkIGZyb20gdGhlIDxjb2RlPmVqYmphcjwvY29kZT4KICAgICAgKiB0YXNrLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSAiYmFzZW5hbWUiIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBuYW1lIHRoZQpAQCAtNTc0LDE0ICs1NDUsMTQgQEAKICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gIiI7CiAKICAgICAgICAgLy8gV29yayBvdXQgd2hhdCB0aGUgYmFzZSBuYW1lIGlzCi0gICAgICAgIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuQkFTRUpBUk5BTUUpKSB7CisgICAgICAgIGlmIChFamJKYXIuTmFtaW5nU2NoZW1lLkJBU0VKQVJOQU1FLmVxdWFscyhjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgY2Fub25pY2FsRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JGaWxlTmFtZS5yZXBsYWNlKCdcXCcsICcvJyk7CiAgICAgICAgICAgICBpbnQgaW5kZXggPSBjYW5vbmljYWxEZXNjcmlwdG9yLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgICBpZiAoaW5kZXggIT0gLTEpIHsKICAgICAgICAgICAgICAgICBiYXNlTmFtZSA9IGRlc2NyaXB0b3JGaWxlTmFtZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJhc2VOYW1lICs9IGNvbmZpZy5iYXNlSmFyTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuREVTQ1JJUFRPUikpIHsKKyAgICAgICAgfSBlbHNlIGlmIChFamJKYXIuTmFtaW5nU2NoZW1lLkRFU0NSSVBUT1IuZXF1YWxzKGNvbmZpZy5uYW1pbmdTY2hlbWUuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXggPSBkZXNjcmlwdG9yRmlsZU5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwogICAgICAgICAgICAgaW50IGVuZEJhc2VOYW1lID0gLTE7CiAgICAgICAgICAgICBpZiAobGFzdFNlcGFyYXRvckluZGV4ICE9IC0xKSB7CkBAIC01OTQsMTAgKzU2NSwxMSBAQAogICAgICAgICAgICAgaWYgKGVuZEJhc2VOYW1lICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgYmFzZU5hbWUgPSBkZXNjcmlwdG9yRmlsZU5hbWUuc3Vic3RyaW5nKDAsIGVuZEJhc2VOYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gZGV0ZXJtaW5lIGphciBuYW1lICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBkZXNjcmlwdG9yIFwiIiArIGRlc2NyaXB0b3JGaWxlTmFtZSArICJcIiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgamFyIG5hbWUgZnJvbSBkZXNjcmlwdG9yIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JGaWxlTmFtZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpLmVxdWFscyhFamJKYXIuTmFtaW5nU2NoZW1lLkRJUkVDVE9SWSkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChFamJKYXIuTmFtaW5nU2NoZW1lLkRJUkVDVE9SWS5lcXVhbHMoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgRmlsZSBkZXNjcmlwdG9yRmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5kZXNjcmlwdG9yRGlyLCBkZXNjcmlwdG9yRmlsZU5hbWUpOwogICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkZXNjcmlwdG9yRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgIGludCBsYXN0U2VwYXJhdG9ySW5kZXgKQEAgLTYxMCw5ICs1ODIsOCBAQAogICAgICAgICAgICAgaWYgKGRpclNlcGFyYXRvckluZGV4ICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgZGlyTmFtZSA9IGRpck5hbWUuc3Vic3RyaW5nKGRpclNlcGFyYXRvckluZGV4ICsgMSk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGJhc2VOYW1lID0gZGlyTmFtZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWcubmFtaW5nU2NoZW1lLmdldFZhbHVlKCkuZXF1YWxzKEVqYkphci5OYW1pbmdTY2hlbWUuRUpCX05BTUUpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoRWpiSmFyLk5hbWluZ1NjaGVtZS5FSkJfTkFNRS5lcXVhbHMoY29uZmlnLm5hbWluZ1NjaGVtZS5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgYmFzZU5hbWUgPSBoYW5kbGVyLmdldEVqYk5hbWUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYmFzZU5hbWU7CkBAIC02NTIsMTEgKzYyMywxMCBAQAogICAgICAqIEBwYXJhbSBlamJGaWxlcyBhIGhhc2h0YWJsZSBlbnRyeW5hbWUgLSZndDsgZmlsZS4KICAgICAgKiBAcGFyYW0gZGRQcmVmaXggYSBwcmVmaXggdG8gdXNlLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgewogICAgICAgICAvLyBub3RoaW5nIHRvIGFkZCBmb3IgZ2VuZXJpYyB0b29sLgogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQogICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgpAQCAtNjgzLDE2ICs2NTMsMTMgQEAKICAgICAgKiBAcmV0dXJuICAgICAgICAgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSA8Y29kZT5qYXJGaWxlPC9jb2RlPgogICAgICAqICAgICAgICAgICAgICAgICBpcyB1cCB0byBkYXRlCiAgICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbmVlZFRvUmVidWlsZChIYXNodGFibGUgZWpiRmlsZXMsIEZpbGUgamFyRmlsZSkgeworICAgIHByb3RlY3RlZCBib29sZWFuIG5lZWRUb1JlYnVpbGQoSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZWpiRmlsZXMsIEZpbGUgamFyRmlsZSkgewogICAgICAgICBpZiAoamFyRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgbG9uZyBsYXN0QnVpbGQgPSBqYXJGaWxlLmxhc3RNb2RpZmllZCgpOwogCi0gICAgICAgICAgICBJdGVyYXRvciBmaWxlSXRlciA9IGVqYkZpbGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgZmlsZXMgc2VlaW5nIGlmIGFueSBoYXMgYmVlbiB0b3VjaGVkCiAgICAgICAgICAgICAvLyBtb3JlIHJlY2VudGx5IHRoYW4gdGhlIGRlc3RpbmF0aW9uIGphci4KLSAgICAgICAgICAgIHdoaWxlIChmaWxlSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVJdGVyLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBjdXJyZW50RmlsZSA6IGVqYkZpbGVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3RCdWlsZCA8IGN1cnJlbnRGaWxlLmxhc3RNb2RpZmllZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGxvZygiQnVpbGQgbmVlZGVkIGJlY2F1c2UgIiArIGN1cnJlbnRGaWxlLmdldFBhdGgoKSArICIgaXMgb3V0IG9mIGRhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CkBAIC03MDEsNyArNjY4LDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtNzMzLDcgKzY5OSw2IEBACiAgICAgICAgIGlmIChtYW5pZmVzdEZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdEZpbGU7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAoY29uZmlnLm1hbmlmZXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBjb25maWcubWFuaWZlc3Q7CiAgICAgICAgIH0KQEAgLTc1MCwxNyArNzE1LDE1IEBACiAgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBpZCB0byB1c2UuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphcmZpbGUsIEhhc2h0YWJsZSBmaWxlcywKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyZmlsZSwgSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCi0gICAgICAgIEphck91dHB1dFN0cmVhbSBqYXJTdHJlYW0gPSBudWxsOworICAgICAgICAvLyBjbGVhbiB0aGUgYWRkZWRmaWxlcyBzZXQKKyAgICAgICAgaWYgKGFkZGVkZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgYWRkZWRmaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZGVkZmlsZXMuY2xlYXIoKTsKKyAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gY2xlYW4gdGhlIGFkZGVkZmlsZXMgc2V0Ci0gICAgICAgICAgICBpZiAoYWRkZWRmaWxlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYWRkZWRmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFkZGVkZmlsZXMuY2xlYXIoKTsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogSWYgdGhlIGphcmZpbGUgYWxyZWFkeSBleGlzdHMgdGhlbiB3aGFjayBpdCBhbmQgcmVjcmVhdGUgaXQuCiAgICAgICAgICAgICAgKiBTaG91bGQgcHJvYmFibHkgdGhpbmsgb2YgYSBtb3JlIGVsZWdhbnQgd2F5IHRvIGhhbmRsZSB0aGlzCkBAIC03NzYsMTggKzczOSwxOCBAQAogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwogICAgICAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3QgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoTUFOSUZFU1QpOworICAgICAgICAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZmlsZXMuZ2V0KE1BTklGRVNUKTsKICAgICAgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlICE9IG51bGwgJiYgbWFuaWZlc3RGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpOworICAgICAgICAgICAgICAgICAgICBpbiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKG1hbmlmZXN0RmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRNYW5pZmVzdCA9ICIvb3JnL2FwYWNoZS90b29scy9hbnQvZGVmYXVsdE1hbmlmZXN0Lm1mIjsKICAgICAgICAgICAgICAgICAgICAgaW4gPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShkZWZhdWx0TWFuaWZlc3QpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGVmYXVsdCBtYW5pZmVzdDogIiArIGRlZmF1bHRNYW5pZmVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGRlZmF1bHQgbWFuaWZlc3Q6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWFuaWZlc3QpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaW4pOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgbWFuaWZlc3QiLCBlLCBnZXRMb2NhdGlvbigpKTsKQEAgLTc5OSw0NiArNzYyLDQ0IEBACiAKICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc3RyZWFtcyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIGphcmZpbGUKIAotICAgICAgICAgICAgamFyU3RyZWFtID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJmaWxlKSwgbWFuaWZlc3QpOwotICAgICAgICAgICAgamFyU3RyZWFtLnNldE1ldGhvZChKYXJPdXRwdXRTdHJlYW0uREVGTEFURUQpOworICAgICAgICAgICAgdHJ5IChKYXJPdXRwdXRTdHJlYW0gamFyU3RyZWFtID0gbmV3IEphck91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oamFyZmlsZS50b1BhdGgoKSksIG1hbmlmZXN0KSkgeworICAgICAgICAgICAgICAgIGphclN0cmVhbS5zZXRNZXRob2QoSmFyT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKIAotICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2xhc3MgZmlsZXMgZm91bmQgYW5kIGFkZCB0aGVtIHRvIHRoZSBqYXIKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgZW50cnlJdGVyYXRvciA9IGZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIFN0cmluZyBlbnRyeU5hbWUgPSAoU3RyaW5nKSBlbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW50cnlOYW1lLmVxdWFscyhNQU5JRkVTVCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIGNsYXNzIGZpbGVzIGZvdW5kIGFuZCBhZGQgdGhlbSB0byB0aGUgamFyCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBGaWxlPiBlbnRyeUZpbGVzIDogZmlsZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW50cnlOYW1lID0gZW50cnlGaWxlcy5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5TmFtZS5lcXVhbHMoTUFOSUZFU1QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBGaWxlIGVudHJ5RmlsZSA9IGVudHJ5RmlsZXMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKCJhZGRpbmcgZmlsZSAnIiArIGVudHJ5TmFtZSArICInIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgIGFkZEZpbGVUb0phcihqYXJTdHJlYW0sIGVudHJ5RmlsZSwgZW50cnlOYW1lKTsKIAotICAgICAgICAgICAgICAgIEZpbGUgZW50cnlGaWxlID0gKEZpbGUpIGZpbGVzLmdldChlbnRyeU5hbWUpOworICAgICAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgYXJlIGFueSBpbm5lciBjbGFzc2VzIGZvciB0aGlzIGNsYXNzIGFuZCBhZGQgdGhlbSBpbiBpZiB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyIGZsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyKGVudHJ5RmlsZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBGaWxlIGVudHJ5RGlyID0gZW50cnlGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gaW5uZXJmaWxlcyA9IGVudHJ5RGlyLmxpc3QoZmx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyZmlsZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgaW5uZXJmaWxlIDogaW5uZXJmaWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZ2V0IGFuZCBjbGVhbiB1cCBpbm5lcmNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlJbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZS5sYXN0SW5kZXhPZihlbnRyeUZpbGUuZ2V0TmFtZSgpKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5SW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5TmFtZSA9IGlubmVyZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGVudHJ5SW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGlubmVyZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayB0aGUgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5RmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5zcmNEaXIsIGVudHJ5TmFtZSk7CiAKLSAgICAgICAgICAgICAgICBsb2coImFkZGluZyBmaWxlICciICsgZW50cnlOYW1lICsgIiciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KLSAgICAgICAgICAgICAgICBhZGRGaWxlVG9KYXIoamFyU3RyZWFtLCBlbnRyeUZpbGUsIGVudHJ5TmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgYXJlIGFueSBpbm5lciBjbGFzc2VzIGZvciB0aGlzIGNsYXNzIGFuZCBhZGQgdGhlbSBpbiBpZiB0aGVyZSBhcmUKLSAgICAgICAgICAgICAgICBJbm5lckNsYXNzRmlsZW5hbWVGaWx0ZXIgZmx0ID0gbmV3IElubmVyQ2xhc3NGaWxlbmFtZUZpbHRlcihlbnRyeUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICBGaWxlIGVudHJ5RGlyID0gZW50cnlGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbm5lcmZpbGVzID0gZW50cnlEaXIubGlzdChmbHQpOwotICAgICAgICAgICAgICAgIGlmIChpbm5lcmZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBpbm5lcmZpbGVzLmxlbmd0aDsgaSA8IG47IGkrKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2dldCBhbmQgY2xlYW4gdXAgaW5uZXJjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW50cnlJbmRleCA9IGVudHJ5TmFtZS5sYXN0SW5kZXhPZihlbnRyeUZpbGUuZ2V0TmFtZSgpKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBpbm5lcmZpbGVzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeU5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGVudHJ5SW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgaW5uZXJmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5RmlsZSA9IG5ldyBGaWxlKGNvbmZpZy5zcmNEaXIsIGVudHJ5TmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiYWRkaW5nIGlubmVyY2xhc3MgZmlsZSAnIiArIGVudHJ5TmFtZSArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImFkZGluZyBpbm5lcmNsYXNzIGZpbGUgJyIgKyBlbnRyeU5hbWUgKyAiJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9KYXIoamFyU3RyZWFtLCBlbnRyeUZpbGUsIGVudHJ5TmFtZSk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRGaWxlVG9KYXIoamFyU3RyZWFtLCBlbnRyeUZpbGUsIGVudHJ5TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC04NDgsOCArODA5LDYgQEAKICAgICAgICAgICAgICAgICArICInLiBEZXRhaWxzOiAiCiAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShqYXJTdHJlYW0pOwogICAgICAgICB9CiAgICAgfSAvLyBlbmQgb2Ygd3JpdGVKYXIKIApAQCAtODU5LDcgKzgxOCw3IEBACiAgICAgICogQHBhcmFtIGNoZWNrRW50cmllcyBmaWxlcywgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIGRlcGxveW1lbnQgZGVzY3JpcHRvcgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQW5kQWRkRGVwZW5kYW50cyhIYXNodGFibGUgY2hlY2tFbnRyaWVzKQorICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrQW5kQWRkRGVwZW5kYW50cyhIYXNodGFibGU8U3RyaW5nLCBGaWxlPiBjaGVja0VudHJpZXMpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgaWYgKGRlcGVuZGVuY3lBbmFseXplciA9PSBudWxsKSB7CkBAIC04NjgsOSArODI3LDcgQEAKIAogICAgICAgICBkZXBlbmRlbmN5QW5hbHl6ZXIucmVzZXQoKTsKIAotICAgICAgICBJdGVyYXRvciBpID0gY2hlY2tFbnRyaWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGVudHJ5TmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICBmb3IgKFN0cmluZyBlbnRyeU5hbWUgOiBjaGVja0VudHJpZXMua2V5U2V0KCkpIHsKICAgICAgICAgICAgIGlmIChlbnRyeU5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCwKICAgICAgICAgICAgICAgICAgICAgZW50cnlOYW1lLmxlbmd0aCgpIC0gIi5jbGFzcyIubGVuZ3RoKCkpOwpAQCAtODgxLDEyICs4MzgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGRlcGVuZGVuY3lBbmFseXplci5nZXRDbGFzc0RlcGVuZGVuY2llcygpOwotCi0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uCi0gICAgICAgICAgICAgICAgPSBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKKyAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NuYW1lIDogQ29sbGVjdGlvbnMubGlzdChkZXBlbmRlbmN5QW5hbHl6ZXIuZ2V0Q2xhc3NEZXBlbmRlbmNpZXMoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiOwogICAgICAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBuZXcgRmlsZShjb25maWcuc3JjRGlyLCBsb2NhdGlvbik7CiAgICAgICAgICAgICBpZiAoY2xhc3NGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgY2hlY2tFbnRyaWVzLnB1dChsb2NhdGlvbiwgY2xhc3NGaWxlKTsKQEAgLTg5Niw3ICs4NDksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgQ2xhc3Nsb2FkZXIgb2JqZWN0IHdoaWNoIHBhcnNlcyB0aGUgcGFzc2VkIGluIGdlbmVyaWMgRWpiSmFyIGNsYXNzcGF0aC4KICAgICAgKiBUaGUgbG9hZGVyIGlzIHVzZWQgdG8gZHluYW1pY2FsbHkgbG9hZCBjbGFzc2VzIGZyb20gamF2YXguZWpiLiogYW5kIHRoZSBjbGFzc2VzCkBAIC05MDcsNyArODU5LDYgQEAKICAgICAgICAgaWYgKGNsYXNzcGF0aExvYWRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gY2xhc3NwYXRoTG9hZGVyOwogICAgICAgICB9Ci0KICAgICAgICAgUGF0aCBjb21iaW5lZENsYXNzcGF0aCA9IGdldENvbWJpbmVkQ2xhc3NwYXRoKCk7CiAKICAgICAgICAgLy8gb25seSBnZW5lcmF0ZSBhIG5ldyBDbGFzc0xvYWRlciBpZiB3ZSBoYXZlIGEgY2xhc3NwYXRoCkBAIC05MTgsNyArODY5LDYgQEAKICAgICAgICAgICAgIGNsYXNzcGF0aExvYWRlcgogICAgICAgICAgICAgICAgID0gZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihjb21iaW5lZENsYXNzcGF0aCk7CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gY2xhc3NwYXRoTG9hZGVyOwogICAgIH0KIApAQCAtOTI4LDExICs4NzgsMTIgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIElmIHRoZSBEZXBsb3ltZW50IFRvb2wncyBjb25maWd1cmF0aW9uIGlzbid0CiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoZGVzdERpciA9PSBudWxsKSB8fCAoIWRlc3REaXIuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQSB2YWxpZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInVzaW5nIHRoZSBcImRlc3RkaXJcIiBhdHRyaWJ1dGUuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAoZGVzdERpciA9PSBudWxsIHx8ICFkZXN0RGlyLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQSB2YWxpZCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIFwiZGVzdGRpclwiIGF0dHJpYnV0ZS4iLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXREZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXREZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IGQzOWZiOWUuLjVhMDEzZjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9JUGxhbmV0RGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldERlcGxveW1lbnRUb29sLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSwxMiArMjEsMTIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLkVqYkphci5EVERMb2NhdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKIC8qKgpAQCAtMTA1LDcgKzEwNSw4IEBACiAgICAgICogd2UgbWF5IGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgRUpCIEpBUiBmaWxlIHVzaW5nIHRoaXMgZGlzcGxheS1uYW1lLAogICAgICAqIGJ1dCB0aGlzIGhhcyBub3QgYmUgaW1wbGVtZW50ZWQgeWV0LgogICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nICBkaXNwbGF5TmFtZTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKIAogICAgIC8qCiAgICAgICogUmVnYXJkbGVzcyBvZiB0aGUgbmFtZSBvZiB0aGUgaUFTLXNwZWNpZmljIEVKQiBkZXNjcmlwdG9yIGZpbGUsIGl0IHdpbGwKQEAgLTIwMCwyNSArMjAxLDI2IEBACiAgICAgICAgIGludCBzdGFydE9mTmFtZSA9IGRlc2NyaXB0b3JGaWxlTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpICsgMTsKICAgICAgICAgU3RyaW5nIHN0ZFhtbCA9IGRlc2NyaXB0b3JGaWxlTmFtZS5zdWJzdHJpbmcoc3RhcnRPZk5hbWUpOwogICAgICAgICBpZiAoc3RkWG1sLmVxdWFscyhFSkJfREQpICYmIChnZXRDb25maWcoKS5iYXNlSmFyTmFtZSA9PSBudWxsKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJObyBuYW1lIHNwZWNpZmllZCBmb3IgdGhlIGNvbXBsZXRlZCBKQVIgZmlsZS4gIFRoZSBFSkIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHByZXBlbmRlZCB3aXRoIHRoZSBKQVIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb3IgaXQgc2hvdWxkIGJlIHNwZWNpZmllZCB1c2luZyB0aGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSBcImJhc2VqYXJuYW1lXCIgaW4gdGhlIFwiZWpiamFyXCIgdGFzay4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk5vIG5hbWUgc3BlY2lmaWVkIGZvciB0aGUgY29tcGxldGVkIEpBUiBmaWxlLiAgVGhlIEVKQiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHByZXBlbmRlZCB3aXRoIHRoZSBKQVIgIgorICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9yIGl0IHNob3VsZCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlIFwiYmFzZWphcm5hbWVcIiBpbiB0aGUgXCJlamJqYXJcIiB0YXNrLiIsCisgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBGaWxlIGlhc0Rlc2NyaXB0b3IgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElhc0Rlc2NyaXB0b3JOYW1lKCkpOwotICAgICAgICBpZiAoKCFpYXNEZXNjcmlwdG9yLmV4aXN0cygpKSB8fCAoIWlhc0Rlc2NyaXB0b3IuaXNGaWxlKCkpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgKCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGlhc0Rlc2NyaXB0b3IgKyAiKSB3YXMgbm90IGZvdW5kLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgaWYgKCFpYXNEZXNjcmlwdG9yLmV4aXN0cygpIHx8ICFpYXNEZXNjcmlwdG9yLmlzRmlsZSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBpQVMtc3BlY2lmaWMgRUpCIGRlc2NyaXB0b3IgKCIKKyAgICAgICAgICAgICAgICArIGlhc0Rlc2NyaXB0b3IgKyAiKSB3YXMgbm90IGZvdW5kLiIsIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChpYXNob21lICE9IG51bGwpICYmICghaWFzaG9tZS5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJZiBcImlhc2hvbWVcIiBpcyBzcGVjaWZpZWQsIGl0IG11c3QgYmUgYSB2YWxpZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5IChpdCB3YXMgc2V0IHRvICIgKyBpYXNob21lICsgIikuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOworICAgICAgICBpZiAoaWFzaG9tZSAhPSBudWxsICYmICFpYXNob21lLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSWYgXCJpYXNob21lXCIgaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGEgdmFsaWQgZGlyZWN0b3J5IChpdCB3YXMgc2V0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgKyBpYXNob21lICsgIikuIiwKKyAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjM4LDEwICsyNDAsMTAgQEAKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbgogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBIYXNodGFibGUgcGFyc2VFamJGaWxlcyhTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lLAorICAgIHByb3RlY3RlZCBIYXNodGFibGU8U3RyaW5nLCBGaWxlPiBwYXJzZUVqYkZpbGVzKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewogCi0gICAgICAgIEhhc2h0YWJsZSBmaWxlczsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZmlsZXM7CiAKICAgICAgICAgLyogQnVpbGQgYW5kIHBvcHVsYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBlamJjIHV0aWxpdHkgKi8KICAgICAgICAgSVBsYW5ldEVqYmMgZWpiYyA9IG5ldyBJUGxhbmV0RWpiYygKQEAgLTI1OCwxMiArMjYwLDkgQEAKICAgICAgICAgICAgIGVqYmMuc2V0SWFzSG9tZURpcihpYXNob21lKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPQotICAgICAgICAgICAgICAgICAgICAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKKyAgICAgICAgICAgIGZvciAoRFRETG9jYXRpb24gZHRkTG9jYXRpb24gOiBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMpIHsKICAgICAgICAgICAgICAgICBlamJjLnJlZ2lzdGVyRFREKGR0ZExvY2F0aW9uLmdldFB1YmxpY0lkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgZHRkTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjkwLDcgKzI4OSw3IEBACiAgICAgICAgICAgICAgICAgaW50IGVuZE9mQ21wID0gZGVzY3JpcHRvci5sYXN0SW5kZXhPZignLycpOwogICAgICAgICAgICAgICAgIFN0cmluZyBjbXBEZXNjcmlwdG9yID0gZGVzY3JpcHRvci5zdWJzdHJpbmcoZW5kT2ZDbXAgKyAxKTsKIAotICAgICAgICAgICAgICAgIEZpbGUgICBjbXBGaWxlID0gbmV3IEZpbGUoYmFzZURpciwgcmVsYXRpdmVQYXRoICsgY21wRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgRmlsZSBjbXBGaWxlID0gbmV3IEZpbGUoYmFzZURpciwgcmVsYXRpdmVQYXRoICsgY21wRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgaWYgKCFjbXBGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIENNUCBkZXNjcmlwdG9yIGZpbGUgKCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNtcEZpbGUgKyAiKSBjb3VsZCBub3QgYmUgZm91bmQuIiwgZ2V0TG9jYXRpb24oKSk7CkBAIC0yOTgsNyArMjk3LDYgQEAKICAgICAgICAgICAgICAgICBmaWxlcy5wdXQoZGVzY3JpcHRvciwgY21wRmlsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZmlsZXM7CiAgICAgfQogCkBAIC0zMTEsNyArMzA5LDcgQEAKICAgICAgKiBAcGFyYW0gZGRQcmVmaXggbm90IHVzZWQKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgSUFTX0RELCBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLAogICAgICAgICAgICAgICAgICAgICAgZ2V0SWFzRGVzY3JpcHRvck5hbWUoKSkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9JUGxhbmV0RWpiYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKaW5kZXggMjMxMTZkMy4uZDIwN2E5YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwzMCArMjAsMzIgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVMaXN0OwogaW1wb3J0IG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlOwogaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwogaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7Ci0KIC8qKgogICogQ29tcGlsZXMgRUpCIHN0dWJzIGFuZCBza2VsZXRvbnMgZm9yIHRoZSBpUGxhbmV0IEFwcGxpY2F0aW9uCiAgKiBTZXJ2ZXIgKGlBUykuICBUaGUgY2xhc3Mgd2lsbCByZWFkIGEgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKGFzIHdlbGwgYXMgYW4KQEAgLTkwLDYgKzkyLDcgQEAKIAogICAgIC8qIENsYXNzcGF0aCB1c2VkIHdoZW4gdGhlIGlBUyBlamJjIGlzIGNhbGxlZCAqLwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgY2xhc3NwYXRoOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgU3RyaW5nW10gICAgY2xhc3NwYXRoRWxlbWVudHM7CiAKICAgICAvKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgaUFTIGVqYmMgKi8KQEAgLTExMCw3ICsxMTMsNyBAQAogICAgICAqIChyZWxhdGl2ZSB0byB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5KS4gIFRoZSB2YWx1ZSBmb3IgdGhlIEhhc2h0YWJsZSBpcwogICAgICAqIGEgRmlsZSBvYmplY3Qgd2hpY2ggcmVmZXJlbmNlIHRoZSBhY3R1YWwgY2xhc3MgZmlsZS4KICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSAgIGVqYkZpbGVzICAgICA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+ICAgZWpiRmlsZXMgICAgID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKiBWYWx1ZSBvZiB0aGUgZGlzcGxheS1uYW1lIGVsZW1lbnQgcmVhZCBmcm9tIHRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciAqLwogICAgIHByaXZhdGUgU3RyaW5nICAgICAgZGlzcGxheU5hbWU7CkBAIC0xNDYsMTUgKzE0OSwxMSBAQAogICAgICAgICAgKiBQYXJzZSB0aGUgY2xhc3NwYXRoIGludG8gaXQncyBpbmRpdmlkdWFsIGVsZW1lbnRzIGFuZCBzdG9yZSB0aGUKICAgICAgICAgICogcmVzdWx0cyBpbiB0aGUgImNsYXNzcGF0aEVsZW1lbnRzIiBpbnN0YW5jZSB2YXJpYWJsZS4KICAgICAgICAgICovCi0gICAgICAgIExpc3QgZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7CiAgICAgICAgIGlmIChjbGFzc3BhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGFzc3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUucGF0aFNlcGFyYXRvcik7Ci0gICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHN0Lm5leHRUb2tlbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsYXNzcGF0aEVsZW1lbnRzCi0gICAgICAgICAgICAgICAgICAgID0gKFN0cmluZ1tdKSBlbGVtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbZWxlbWVudHMuc2l6ZSgpXSk7CisgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBzdC5jb3VudFRva2VucygpOworICAgICAgICAgICAgY2xhc3NwYXRoRWxlbWVudHMgPSBDb2xsZWN0aW9ucy5saXN0KHN0KS50b0FycmF5KG5ldyBTdHJpbmdbY291bnRdKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjEzLDcgKzIxMiw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIEVKQiBmaWxlcyBwcm9jZXNzZWQgYnkgdGhlIGVqYmMgdXRpbGl0eS4KICAgICAgKi8KLSAgICBwdWJsaWMgSGFzaHRhYmxlIGdldEVqYkZpbGVzKCkgeworICAgIHB1YmxpYyBIYXNodGFibGU8U3RyaW5nLCBGaWxlPiBnZXRFamJGaWxlcygpIHsKICAgICAgICAgcmV0dXJuIGVqYkZpbGVzOwogICAgIH0KIApAQCAtMjMyLDE2ICsyMzEsOCBAQAogICAgICAqIEByZXR1cm4gQW4gYXJyYXkgb2YgQ01QIGRlc2NyaXB0b3JzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRDbXBEZXNjcmlwdG9ycygpIHsKLSAgICAgICAgTGlzdCByZXR1cm5MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIEVqYkluZm9bXSBlamJzID0gaGFuZGxlci5nZXRFamJzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBMaXN0IGRlc2NyaXB0b3JzID0gKExpc3QpIGVqYnNbaV0uZ2V0Q21wRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgICAgIHJldHVybkxpc3QuYWRkQWxsKGRlc2NyaXB0b3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIHJldHVybkxpc3QudG9BcnJheShuZXcgU3RyaW5nW3JldHVybkxpc3Quc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoaGFuZGxlci5nZXRFamJzKCkpLm1hcChFamJJbmZvOjpnZXRDbXBEZXNjcmlwdG9ycykKKyAgICAgICAgICAgIC5mbGF0TWFwKENvbGxlY3Rpb246OnN0cmVhbSkudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2MSw3ICsyNTIsNyBAQAogICAgICAgICBib29sZWFuICAgICByZXRhaW5Tb3VyY2UgID0gZmFsc2U7CiAgICAgICAgIElQbGFuZXRFamJjIGVqYmM7CiAKLSAgICAgICAgaWYgKChhcmdzLmxlbmd0aCA8IE1JTl9OVU1fQVJHUykgfHwgKGFyZ3MubGVuZ3RoID4gTUFYX05VTV9BUkdTKSkgeworICAgICAgICBpZiAoYXJncy5sZW5ndGggPCBNSU5fTlVNX0FSR1MgfHwgYXJncy5sZW5ndGggPiBNQVhfTlVNX0FSR1MpIHsKICAgICAgICAgICAgIHVzYWdlKCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTI3MCwxMyArMjYxLDEzIEBACiAgICAgICAgIGlhc0Rlc2NyaXB0b3IgPSBuZXcgRmlsZShhcmdzW2FyZ3MubGVuZ3RoIC0gMV0pOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGggLSAyOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLWNsYXNzcGF0aCIpKSB7CisgICAgICAgICAgICBpZiAoIi1jbGFzc3BhdGgiLmVxdWFscyhhcmdzW2ldKSkgewogICAgICAgICAgICAgICAgIGNsYXNzcGF0aCA9IGFyZ3NbKytpXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1kIi5lcXVhbHMoYXJnc1tpXSkpIHsKICAgICAgICAgICAgICAgICBkZXN0RGlyZWN0b3J5ID0gbmV3IEZpbGUoYXJnc1srK2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kZWJ1ZyIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCItZGVidWciLmVxdWFscyhhcmdzW2ldKSkgewogICAgICAgICAgICAgICAgIGRlYnVnID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXS5lcXVhbHMoIi1rZWVwc291cmNlIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIi1rZWVwc291cmNlIi5lcXVhbHMoYXJnc1tpXSkpIHsKICAgICAgICAgICAgICAgICByZXRhaW5Tb3VyY2UgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB1c2FnZSgpOwpAQCAtMzM5LDE5ICszMzAsMTkgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVzYWdlKCkgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImphdmEgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLklQbGFuZXRFamJjIFxcIik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBbT1BUSU9OU10gW0VKQiAxLjEgZGVzY3JpcHRvcl0gW2lBUyBFSkIgZGVzY3JpcHRvcl0iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2hlcmUgT1BUSU9OUyBhcmU6Iik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICAtZGVidWcgLS0gZm9yIGFkZGl0aW9uYWwgZGVidWdnaW5nIG91dHB1dCIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWtlZXBzb3VyY2UgLS0gdG8gcmV0YWluIEphdmEgc291cmNlIGZpbGVzIGdlbmVyYXRlZCIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWNsYXNzcGF0aCBbY2xhc3NwYXRoXSAtLSBjbGFzc3BhdGggdXNlZCBmb3IgY29tcGlsYXRpb24iKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgIC1kIFtkZXN0aW5hdGlvbiBkaXJlY3RvcnldIC0tIGRpcmVjdG9yeSBmb3IgY29tcGlsZWQgY2xhc3NlcyIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJZiBhIGNsYXNzcGF0aCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGNsYXNzcGF0aCIpOwogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIndpbGwgYmUgdXNlZC4gIElmIGEgZGVzdGluYXRpb24gZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQsIik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkIChjbGFzc2VzIHdpbGwiKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzdGlsbCBiZSBwbGFjZWQgaW4gc3ViZm9sZGVycyB3aGljaCBjb3JyZXNwb25kIHRvIHRoZWlyIik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigicGFja2FnZSBuYW1lKS4iKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIEVKQiBob21lIGludGVyZmFjZSwgcmVtb3RlIGludGVyZmFjZSwgYW5kIGltcGxlbWVudGF0aW9uIik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY2xhc3MgbXVzdCBiZSBmb3VuZCBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LiAgSW4iKTsKICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhZGRpdGlvbiwgdGhlIGRlc3RpbmF0aW9uIHdpbGwgbG9vayBmb3IgdGhlIHN0dWJzIGFuZCBza2VsZXRvbnMiKTsKQEAgLTM3NiwyMiArMzY3LDE3IEBACiAKICAgICAgICAgRWpiSW5mb1tdIGVqYnMgPSBnZXRFamJzKCk7IC8vIFJldHVybnMgbGlzdCBvZiBFSkJzIGZvciBwcm9jZXNzaW5nCiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIGZvciAoRWpiSW5mbyBlamIgOiBlamJzKSB7CiAgICAgICAgICAgICBsb2coIkVKQkluZm8uLi4iKTsKLSAgICAgICAgICAgIGxvZyhlamJzW2ldLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbG9nKGVqYi50b1N0cmluZygpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWpicy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgRWpiSW5mbyBlamIgPSBlamJzW2ldOwotCisgICAgICAgIGZvciAoRWpiSW5mbyBlamIgOiBlamJzKSB7CiAgICAgICAgICAgICBlamIuY2hlY2tDb25maWd1cmF0aW9uKGRlc3REaXJlY3RvcnkpOyAgLy8gVGhyb3dzIEVqYmNFeGNlcHRpb24KIAogICAgICAgICAgICAgaWYgKGVqYi5tdXN0QmVSZWNvbXBpbGVkKGRlc3REaXJlY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgbG9nKGVqYi5nZXROYW1lKCkgKyAiIG11c3QgYmUgcmVjb21waWxlZCB1c2luZyBlamJjLiIpOwotCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gYXJndW1lbnRzID0gYnVpbGRBcmd1bWVudExpc3QoZWpiKTsKLSAgICAgICAgICAgICAgICBjYWxsRWpiYyhhcmd1bWVudHMpOwotCisgICAgICAgICAgICAgICAgY2FsbEVqYmMoYnVpbGRBcmd1bWVudExpc3QoZWpiKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZyhlamIuZ2V0TmFtZSgpICsgIiBpcyB1cCB0byBkYXRlLiIpOwogICAgICAgICAgICAgfQpAQCAtNDA1LDExICszOTEsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjYWxsRWpiYyhTdHJpbmdbXSBhcmd1bWVudHMpIHsKIAotICAgICAgICAvKiBDb25jYXRlbmF0ZSBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBTdHJpbmcgKi8KLSAgICAgICAgU3RyaW5nQnVmZmVyIGFyZ3MgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhcmdzLmFwcGVuZChhcmd1bWVudHNbaV0pLmFwcGVuZCgiICIpOwotICAgICAgICB9CiAKICAgICAgICAgLyogSWYgYW4gaUFTIGhvbWUgZGlyZWN0b3J5IGlzIHNwZWNpZmllZCwgcHJlcGVuZCBpdCB0byB0aGUgY29tbWFuZCAqLwogICAgICAgICBTdHJpbmcgY29tbWFuZDsKQEAgLTQyMSw2ICs0MDIsOSBAQAogICAgICAgICB9CiAgICAgICAgIGNvbW1hbmQgKz0gImVqYmMgIjsKIAorICAgICAgICAvKiBDb25jYXRlbmF0ZSBhbGwgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW50byBhIHNpbmdsZSBTdHJpbmcgKi8KKyAgICAgICAgU3RyaW5nIGFyZ3MgPSBTdHJpbmcuam9pbigiICIsIGFyZ3VtZW50cyk7CisKICAgICAgICAgbG9nKGNvbW1hbmQgKyBhcmdzKTsKIAogICAgICAgICAvKgpAQCAtNDUxLDMxICs0MzUsMzEgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRWpiY0V4Y2VwdGlvbiB7CiAKLSAgICAgICAgU3RyaW5nIG1zZyA9ICIiOworICAgICAgICBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKICAgICAgICAgaWYgKHN0ZERlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbXNnICs9ICJBIHN0YW5kYXJkIFhNTCBkZXNjcmlwdG9yIGZpbGUgbXVzdCBiZSBzcGVjaWZpZWQuICAiOworICAgICAgICAgICAgbXNnLmFwcGVuZCgiQSBzdGFuZGFyZCBYTUwgZGVzY3JpcHRvciBmaWxlIG11c3QgYmUgc3BlY2lmaWVkLiAgIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlhc0Rlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbXNnICs9ICJBbiBpQVMtc3BlY2lmaWMgWE1MIGRlc2NyaXB0b3IgZmlsZSBtdXN0IGJlIHNwZWNpZmllZC4gICI7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCJBbiBpQVMtc3BlY2lmaWMgWE1MIGRlc2NyaXB0b3IgZmlsZSBtdXN0IGJlIHNwZWNpZmllZC4gICIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgbXNnICs9ICJBIGNsYXNzcGF0aCBtdXN0IGJlIHNwZWNpZmllZC4gICAgIjsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIkEgY2xhc3NwYXRoIG11c3QgYmUgc3BlY2lmaWVkLiAgICAiKTsKICAgICAgICAgfQogICAgICAgICBpZiAocGFyc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1zZyArPSAiQW4gWE1MIHBhcnNlciBtdXN0IGJlIHNwZWNpZmllZC4gICAgIjsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIkFuIFhNTCBwYXJzZXIgbXVzdCBiZSBzcGVjaWZpZWQuICAgICIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlc3REaXJlY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgbXNnICs9ICJBIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZC4gICI7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCJBIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZC4gICIpOwogICAgICAgICB9IGVsc2UgaWYgKCFkZXN0RGlyZWN0b3J5LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBtc2cgKz0gIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0LiAgIjsKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0LiAgIik7CiAgICAgICAgIH0gZWxzZSBpZiAoIWRlc3REaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgbXNnICs9ICJUaGUgZGVzdGluYXRpb24gc3BlY2lmaWVkIGlzIG5vdCBhIGRpcmVjdG9yeS4gICI7CisgICAgICAgICAgICBtc2cuYXBwZW5kKCJUaGUgZGVzdGluYXRpb24gc3BlY2lmaWVkIGlzIG5vdCBhIGRpcmVjdG9yeS4gICIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1zZy5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKG1zZyk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbihtc2cudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5MSwxOCArNDc1LDE0IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgIFhNTCBkZXNjcmlwdG9yIChpdCBtYXkgd3JhcCBhbm90aGVyIGV4Y2VwdGlvbikKICAgICAgKi8KICAgICBwcml2YXRlIEVqYkluZm9bXSBnZXRFamJzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotICAgICAgICBFamJJbmZvW10gZWpicyA9IG51bGw7CiAKICAgICAgICAgLyoKICAgICAgICAgICogVGhlIEVKQiBpbmZvcm1hdGlvbiBpcyBnYXRoZXJlZCBmcm9tIHRoZSBzdGFuZGFyZCBYTUwgRUpCIGRlc2NyaXB0b3IKICAgICAgICAgICogYW5kIHRoZSBpQVMtc3BlY2lmaWMgWE1MIEVKQiBkZXNjcmlwdG9yIHVzaW5nIGEgU0FYIHBhcnNlci4KICAgICAgICAgICovCi0KICAgICAgICAgcGFyc2VyLnBhcnNlKHN0ZERlc2NyaXB0b3IsIGhhbmRsZXIpOwogICAgICAgICBwYXJzZXIucGFyc2UoaWFzRGVzY3JpcHRvciwgaGFuZGxlcik7Ci0gICAgICAgIGVqYnMgPSBoYW5kbGVyLmdldEVqYnMoKTsKLQotICAgICAgICByZXR1cm4gZWpiczsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIuZ2V0RWpicygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTE1LDcgKzQ5NSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFyZ3VtZW50TGlzdChFamJJbmZvIGVqYikgewogCi0gICAgICAgIExpc3QgYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gYXJndW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgLyogT1BUSU9OQUwgQ09NTUFORCBMSU5FIFBBUkFNRVRFUlMgKi8KIApAQCAtNTU5LDcgKzUzOSw3IEBACiAgICAgICAgIGFyZ3VtZW50cy5hZGQoZWpiLmdldEltcGxlbWVudGF0aW9uKCkuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkpOwogCiAgICAgICAgIC8qIENvbnZlcnQgdGhlIExpc3QgaW50byBhbiBBcnJheSBhbmQgcmV0dXJuIGl0ICovCi0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGFyZ3VtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbYXJndW1lbnRzLnNpemUoKV0pOworICAgICAgICByZXR1cm4gYXJndW1lbnRzLnRvQXJyYXkobmV3IFN0cmluZ1thcmd1bWVudHMuc2l6ZSgpXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01ODQsNiArNTY0LDcgQEAKICAgICAgKgogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBFamJjRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdHMgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0aXZlIG1lc3NhZ2UuCkBAIC02MjQsMTAgKzYwNSwxMCBAQAogICAgICAgICAgKiByZW1vdGUgY29waWVzIG9mIHRoZXNlIERURHMgY2Fubm90IGJlIGFjY2Vzc2VkLiAgVGhlIGtleSBmb3IgdGhlIE1hcAogICAgICAgICAgKiBpcyB0aGUgRFREcyBwdWJsaWMgSUQgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgbG9jYWwgbG9jYXRpb24gZm9yIHRoZSBEVEQKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgTWFwICAgICAgIHJlc291cmNlRHRkcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHByaXZhdGUgTWFwICAgICAgIGZpbGVEdGRzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+ICAgICAgIHJlc291cmNlRHRkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+ICAgICAgIGZpbGVEdGRzID0gbmV3IEhhc2hNYXA8PigpOwogCi0gICAgICAgIHByaXZhdGUgTWFwICAgICAgIGVqYnMgPSBuZXcgSGFzaE1hcCgpOyAgICAgIC8vIExpc3Qgb2YgRUpCcyBmb3VuZCBpbiBYTUwKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBFamJJbmZvPiAgICAgICBlamJzID0gbmV3IEhhc2hNYXA8PigpOyAgICAgIC8vIExpc3Qgb2YgRUpCcyBmb3VuZCBpbiBYTUwKICAgICAgICAgcHJpdmF0ZSBFamJJbmZvICAgY3VycmVudEVqYjsgICAgICAgICAgICAgLy8gT25lIGl0ZW0gd2l0aGluIHRoZSBNYXAKICAgICAgICAgcHJpdmF0ZSBib29sZWFuICAgaWFzRGVzY3JpcHRvciA9IGZhbHNlOyAgLy8gSXMgZG9jIGlBUyBvciBFSkIgZGVzY3JpcHRvcgogCkBAIC02NTMsNyArNjM0LDcgQEAKICAgICAgICAgICogICAgICAgICBwYXJzaW5nLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEVqYkluZm9bXSBnZXRFamJzKCkgewotICAgICAgICAgICAgcmV0dXJuIChFamJJbmZvW10pIGVqYnMudmFsdWVzKCkudG9BcnJheShuZXcgRWpiSW5mb1tlamJzLnNpemUoKV0pOworICAgICAgICAgICAgcmV0dXJuIGVqYnMudmFsdWVzKCkudG9BcnJheShuZXcgRWpiSW5mb1tlamJzLnNpemUoKV0pOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC02NjIsNiArNjQzLDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBTdHJpbmcgZGlzcGxheS1uYW1lIHZhbHVlLgogICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZGlzcGxheU5hbWU7CiAgICAgICAgIH0KQEAgLTY4MCw3ICs2NjIsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJEVEQoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgbG9jYXRpb24pIHsKICAgICAgICAgICAgIGxvZygiUmVnaXN0ZXJpbmc6ICIgKyBsb2NhdGlvbik7Ci0gICAgICAgICAgICBpZiAoKHB1YmxpY0lEID09IG51bGwpIHx8IChsb2NhdGlvbiA9PSBudWxsKSkgeworICAgICAgICAgICAgaWYgKHB1YmxpY0lEID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtNzA2LDM1ICs2ODgsMzAgQEAKICAgICAgICAgICogQHBhcmFtIHB1YmxpY0lkIFRoZSBEVEQncyBwdWJsaWMgaWRlbnRpZmllci4KICAgICAgICAgICogQHBhcmFtIHN5c3RlbUlkIFRoZSBsb2NhdGlvbiBvZiB0aGUgRFRELCBhcyBmb3VuZCBpbiB0aGUgWE1MIGRvY3VtZW50LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQogICAgICAgICAgICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24gewogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwogCi0KICAgICAgICAgICAgIHRyeSB7Ci0KICAgICAgICAgICAgICAgICAvKiBTZWFyY2ggdGhlIHJlc291cmNlIE1hcCBhbmQgKGlmIG5vdCBmb3VuZCkgZmlsZSBNYXAgKi8KLQotICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IChTdHJpbmcpIHJlc291cmNlRHRkcy5nZXQocHVibGljSWQpOworICAgICAgICAgICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IHJlc291cmNlRHRkcy5nZXQocHVibGljSWQpOwogICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtCiAgICAgICAgICAgICAgICAgICAgICAgICA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGxvY2F0aW9uKS5vcGVuU3RyZWFtKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSAoU3RyaW5nKSBmaWxlRHRkcy5nZXQocHVibGljSWQpOworICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGZpbGVEdGRzLmdldChwdWJsaWNJZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZWQgd2hlbiB0aGUgSW5wdXRTb3VyY2UgaXMgY2xvc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obG9jYXRpb24pOyAvL05PU09OQVIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oUGF0aHMuZ2V0KGxvY2F0aW9uKSk7IC8vTk9TT05BUgogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlc29sdmVFbnRpdHkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShpbnB1dFN0cmVhbSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtNzQ1LDYgKzcyMiw3IEBACiAgICAgICAgICAqICAgICAgICAgICAgIChpZiBhbnkpLgogICAgICAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiBJZiB0aGUgcGFyc2VyIGNhbm5vdCBwcm9jZXNzIHRoZSBkb2N1bWVudC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cykKICAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKIApAQCAtNzU3LDEzICs3MzUsMTMgQEAKICAgICAgICAgICAgIC8qIEEgbmV3IGVsZW1lbnQgaGFzIHN0YXJ0ZWQsIHNvIHJlc2V0IHRoZSB0ZXh0IGJlaW5nIGNhcHR1cmVkICovCiAgICAgICAgICAgICBjdXJyZW50VGV4dCA9ICIiOwogCi0gICAgICAgICAgICBpZiAoY3VycmVudExvYy5lcXVhbHMoIlxcZWpiLWphciIpKSB7CisgICAgICAgICAgICBpZiAoIlxcZWpiLWphciIuZXF1YWxzKGN1cnJlbnRMb2MpKSB7CiAgICAgICAgICAgICAgICAgaWFzRGVzY3JpcHRvciA9IGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscygiXFxpYXMtZWpiLWphciIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJcXGlhcy1lamItamFyIi5lcXVhbHMoY3VycmVudExvYykpIHsKICAgICAgICAgICAgICAgICBpYXNEZXNjcmlwdG9yID0gdHJ1ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChuYW1lLmVxdWFscygic2Vzc2lvbiIpKSB8fCAobmFtZS5lcXVhbHMoImVudGl0eSIpKSkgeworICAgICAgICAgICAgaWYgKCJzZXNzaW9uIi5lcXVhbHMobmFtZSkgfHwgImVudGl0eSIuZXF1YWxzKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgZWpiVHlwZSA9IG5hbWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTc3Nyw5ICs3NTUsOSBAQAogICAgICAgICAgKiBAcGFyYW0gbGVuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmb3VuZCBpbiB0aGUgZG9jdW1lbnQuCiAgICAgICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uIElmIHRoZSBwYXJzZXIgY2Fubm90IHByb2Nlc3MgdGhlIGRvY3VtZW50LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW4pCiAgICAgICAgICAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KICAgICAgICAgICAgIGN1cnJlbnRUZXh0ICs9IG5ldyBTdHJpbmcoY2gpLnN1YnN0cmluZyhzdGFydCwgc3RhcnQgKyBsZW4pOwogICAgICAgICB9CiAKQEAgLTc4OSw2ICs3NjcsNyBAQAogICAgICAgICAgKiBAcGFyYW0gbmFtZSBTdHJpbmcgbmFtZSBvZiB0aGUgZWxlbWVudC4KICAgICAgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSWYgdGhlIHBhcnNlciBjYW5ub3QgcHJvY2VzcyB0aGUgZG9jdW1lbnQuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CiAKICAgICAgICAgICAgIC8qCkBAIC04MjQsMzAgKzgwMywyNiBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIHN0ZENoYXJhY3RlcnMoU3RyaW5nIHZhbHVlKSB7CiAKLSAgICAgICAgICAgIGlmIChjdXJyZW50TG9jLmVxdWFscygiXFxlamItamFyXFxkaXNwbGF5LW5hbWUiKSkgeworICAgICAgICAgICAgaWYgKCJcXGVqYi1qYXJcXGRpc3BsYXktbmFtZSIuZXF1YWxzKGN1cnJlbnRMb2MpKSB7CiAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBiYXNlID0gIlxcZWpiLWphclxcZW50ZXJwcmlzZS1iZWFuc1xcIiArIGVqYlR5cGU7CiAKLSAgICAgICAgICAgIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcZWpiLW5hbWUiKSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRFamIgPSAoRWpiSW5mbykgZWpicy5nZXQodmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWpiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IG5ldyBFamJJbmZvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZWpicy5wdXQodmFsdWUsIGN1cnJlbnRFamIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXGhvbWUiKSkgeworICAgICAgICAgICAgaWYgKChiYXNlICsgIlxcZWpiLW5hbWUiKS5lcXVhbHMoY3VycmVudExvYykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gZWpicy5jb21wdXRlSWZBYnNlbnQodmFsdWUsIEVqYkluZm86Om5ldyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiYXNlICsgIlxcaG9tZSIpLmVxdWFscyhjdXJyZW50TG9jKSkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRFamIuc2V0SG9tZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxyZW1vdGUiKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmICgoYmFzZSArICJcXHJlbW90ZSIpLmVxdWFscyhjdXJyZW50TG9jKSkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRFamIuc2V0UmVtb3RlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXGVqYi1jbGFzcyIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiYXNlICsgIlxcZWpiLWNsYXNzIikuZXF1YWxzKGN1cnJlbnRMb2MpKSB7CiAgICAgICAgICAgICAgICAgY3VycmVudEVqYi5zZXRJbXBsZW1lbnRhdGlvbih2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxwcmltLWtleS1jbGFzcyIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiYXNlICsgIlxccHJpbS1rZXktY2xhc3MiKS5lcXVhbHMoY3VycmVudExvYykpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldFByaW1hcnlLZXkodmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcc2Vzc2lvbi10eXBlIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJhc2UgKyAiXFxzZXNzaW9uLXR5cGUiKS5lcXVhbHMoY3VycmVudExvYykpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEJlYW50eXBlKHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXHBlcnNpc3RlbmNlLXR5cGUiKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmICgoYmFzZSArICJcXHBlcnNpc3RlbmNlLXR5cGUiKS5lcXVhbHMoY3VycmVudExvYykpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldENtcCh2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg2NSwxOCArODQwLDE0IEBACiAgICAgICAgIHByaXZhdGUgdm9pZCBpYXNDaGFyYWN0ZXJzKFN0cmluZyB2YWx1ZSkgewogICAgICAgICAgICAgU3RyaW5nIGJhc2UgPSAiXFxpYXMtZWpiLWphclxcZW50ZXJwcmlzZS1iZWFuc1xcIiArIGVqYlR5cGU7CiAKLSAgICAgICAgICAgIGlmIChjdXJyZW50TG9jLmVxdWFscyhiYXNlICsgIlxcZWpiLW5hbWUiKSkgewotICAgICAgICAgICAgICAgIGN1cnJlbnRFamIgPSAoRWpiSW5mbykgZWpicy5nZXQodmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWpiID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEVqYiA9IG5ldyBFamJJbmZvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgZWpicy5wdXQodmFsdWUsIGN1cnJlbnRFamIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudExvYy5lcXVhbHMoYmFzZSArICJcXGlpb3AiKSkgeworICAgICAgICAgICAgaWYgKChiYXNlICsgIlxcZWpiLW5hbWUiKS5lcXVhbHMoY3VycmVudExvYykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50RWpiID0gZWpicy5jb21wdXRlSWZBYnNlbnQodmFsdWUsIEVqYkluZm86Om5ldyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiYXNlICsgIlxcaWlvcCIpLmVxdWFscyhjdXJyZW50TG9jKSkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRFamIuc2V0SWlvcCh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxmYWlsb3Zlci1yZXF1aXJlZCIpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiYXNlICsgIlxcZmFpbG92ZXItcmVxdWlyZWQiKS5lcXVhbHMoY3VycmVudExvYykpIHsKICAgICAgICAgICAgICAgICBjdXJyZW50RWpiLnNldEhhc2Vzc2lvbih2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRMb2MuZXF1YWxzKGJhc2UgKyAiXFxwZXJzaXN0ZW5jZS1tYW5hZ2VyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxccHJvcGVydGllcy1maWxlLWxvY2F0aW9uIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJhc2UKKyAgICAgICAgICAgICAgICArICJcXHBlcnNpc3RlbmNlLW1hbmFnZXJcXHByb3BlcnRpZXMtZmlsZS1sb2NhdGlvbiIpLmVxdWFscyhjdXJyZW50TG9jKSkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRFamIuYWRkQ21wRGVzY3JpcHRvcih2YWx1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg4OCwxNiArODU5LDE2IEBACiAgICAgICoKICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIEVqYkluZm8gewotICAgICAgICBwcml2YXRlIFN0cmluZyAgICAgbmFtZTsgICAgICAgICAgICAgIC8vIEVKQidzIGRpc3BsYXkgbmFtZQotICAgICAgICBwcml2YXRlIENsYXNzbmFtZSAgaG9tZTsgICAgICAgICAgICAgIC8vIEVKQidzIGhvbWUgaW50ZXJmYWNlIG5hbWUKLSAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgIHJlbW90ZTsgICAgICAgICAgICAvLyBFSkIncyByZW1vdGUgaW50ZXJmYWNlIG5hbWUKLSAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgIGltcGxlbWVudGF0aW9uOyAgICAgIC8vIEVKQidzIGltcGxlbWVudGF0aW9uIGNsYXNzCi0gICAgICAgIHByaXZhdGUgQ2xhc3NuYW1lICBwcmltYXJ5S2V5OyAgICAgICAgLy8gRUpCJ3MgcHJpbWFyeSBrZXkgY2xhc3MKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgIGJlYW50eXBlID0gImVudGl0eSI7ICAvLyBvciAic3RhdGVmdWwiIG9yICJzdGF0ZWxlc3MiCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbXAgICAgICAgPSBmYWxzZTsgICAgICAvLyBEb2VzIHRoaXMgRUpCIHN1cHBvcnQgQ01QPwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWlvcCAgICAgID0gZmFsc2U7ICAgICAgLy8gRG9lcyB0aGlzIEVKQiBzdXBwb3J0IElJT1A/Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNlc3Npb24gPSBmYWxzZTsgICAgICAvLyBEb2VzIHRoaXMgRUpCIHJlcXVpcmUgZmFpbG92ZXI/Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNtcERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7ICAvLyBDTVAgZGVzY3JpcHRvciBsaXN0CisgICAgICAgIHByaXZhdGUgU3RyaW5nICAgIG5hbWU7ICAgICAgICAgICAgICAvLyBFSkIncyBkaXNwbGF5IG5hbWUKKyAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgaG9tZTsgICAgICAgICAgICAgIC8vIEVKQidzIGhvbWUgaW50ZXJmYWNlIG5hbWUKKyAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgcmVtb3RlOyAgICAgICAgICAgIC8vIEVKQidzIHJlbW90ZSBpbnRlcmZhY2UgbmFtZQorICAgICAgICBwcml2YXRlIENsYXNzbmFtZSBpbXBsZW1lbnRhdGlvbjsgICAgLy8gRUpCJ3MgaW1wbGVtZW50YXRpb24gY2xhc3MKKyAgICAgICAgcHJpdmF0ZSBDbGFzc25hbWUgcHJpbWFyeUtleTsgICAgICAgIC8vIEVKQidzIHByaW1hcnkga2V5IGNsYXNzCisgICAgICAgIHByaXZhdGUgU3RyaW5nICBiZWFudHlwZSA9ICJlbnRpdHkiOyAvLyBvciAic3RhdGVmdWwiIG9yICJzdGF0ZWxlc3MiCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjbXAgICAgICAgPSBmYWxzZTsgICAvLyBEb2VzIHRoaXMgRUpCIHN1cHBvcnQgQ01QPworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaWlvcCAgICAgID0gZmFsc2U7ICAgLy8gRG9lcyB0aGlzIEVKQiBzdXBwb3J0IElJT1A/CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNlc3Npb24gPSBmYWxzZTsgICAvLyBEb2VzIHRoaXMgRUpCIHJlcXVpcmUgZmFpbG92ZXI/CisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGNtcERlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7ICAvLyBDTVAgZGVzY3JpcHRvciBsaXN0CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0cnVjdCBhIG5ldyBFSkJJbmZvIG9iamVjdCB3aXRoIHRoZSBnaXZlbiBuYW1lLgpAQCAtOTE5LDkgKzg5MCw4IEBACiAgICAgICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJbdW5uYW1lZF0iOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbi5nZXRDbGFzc05hbWUoKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGltcGxlbWVudGF0aW9uLmdldENsYXNzTmFtZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KQEAgLTk3OCw2ICs5NDgsNyBAQAogICAgICAgICAgICAgdGhpcy5wcmltYXJ5S2V5ID0gcHJpbWFyeUtleTsKICAgICAgICAgfQogCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgQ2xhc3NuYW1lIGdldFByaW1hcnlLZXkoKSB7CiAgICAgICAgICAgICByZXR1cm4gcHJpbWFyeUtleTsKICAgICAgICAgfQpAQCAtOTk1LDcgKzk2Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbXAoU3RyaW5nIGNtcCkgewotICAgICAgICAgICAgc2V0Q21wKGNtcC5lcXVhbHMoIkNvbnRhaW5lciIpKTsKKyAgICAgICAgICAgIHNldENtcCgiQ29udGFpbmVyIi5lcXVhbHMoY21wKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbXAoKSB7CkBAIC0xMDA3LDcgKzk3OCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRJaW9wKFN0cmluZyBpaW9wKSB7Ci0gICAgICAgICAgICBzZXRJaW9wKGlpb3AuZXF1YWxzKCJ0cnVlIikpOworICAgICAgICAgICAgc2V0SWlvcChCb29sZWFuLnBhcnNlQm9vbGVhbihpaW9wKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJaW9wKCkgewpAQCAtMTAxOSw3ICs5OTAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2V0SGFzZXNzaW9uKFN0cmluZyBoYXNlc3Npb24pIHsKLSAgICAgICAgICAgIHNldEhhc2Vzc2lvbihoYXNlc3Npb24uZXF1YWxzKCJ0cnVlIikpOworICAgICAgICAgICAgc2V0SGFzZXNzaW9uKEJvb2xlYW4ucGFyc2VCb29sZWFuKGhhc2Vzc2lvbikpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0SGFzZXNzaW9uKCkgewpAQCAtMTAzMCw3ICsxMDAxLDcgQEAKICAgICAgICAgICAgIGNtcERlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBMaXN0IGdldENtcERlc2NyaXB0b3JzKCkgeworICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENtcERlc2NyaXB0b3JzKCkgewogICAgICAgICAgICAgcmV0dXJuIGNtcERlc2NyaXB0b3JzOwogICAgICAgICB9CiAKQEAgLTEwNDcsNTMgKzEwMTgsNTMgQEAKIAogICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgdmFsaWQgKi8KICAgICAgICAgICAgIGlmIChob21lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiQSBob21lIGludGVyZmFjZSB3YXMgbm90IGZvdW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3IgdGhlICIgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVqYmNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBIGhvbWUgaW50ZXJmYWNlIHdhcyBub3QgZm91bmQgZm9yIHRoZSAiICsgbmFtZSArICIgRUpCLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHJlbW90ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVqYmNFeGNlcHRpb24oIkEgcmVtb3RlIGludGVyZmFjZSB3YXMgbm90IGZvdW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3IgdGhlICIgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVqYmNFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJBIHJlbW90ZSBpbnRlcmZhY2Ugd2FzIG5vdCBmb3VuZCBmb3IgdGhlICIgKyBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICArICIgRUpCLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGltcGxlbWVudGF0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiQW4gRUpCIGltcGxlbWVudGF0aW9uIGNsYXNzIHdhcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvdW5kIGZvciB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkFuIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3YXMgbm90IGZvdW5kIGZvciB0aGUgIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBFSkIuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgoIWJlYW50eXBlLmVxdWFscyhFTlRJVFlfQkVBTikpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWJlYW50eXBlLmVxdWFscyhTVEFURUxFU1NfU0VTU0lPTikpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWJlYW50eXBlLmVxdWFscyhTVEFURUZVTF9TRVNTSU9OKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiVGhlIGJlYW50eXBlIGZvdW5kICgiICsgYmVhbnR5cGUgKyAiKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXNuJ3QgdmFsaWQgaW4gdGhlICIgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICBpZiAoIWJlYW50eXBlLmVxdWFscyhFTlRJVFlfQkVBTikKKyAgICAgICAgICAgICAgICAmJiAhYmVhbnR5cGUuZXF1YWxzKFNUQVRFTEVTU19TRVNTSU9OKQorICAgICAgICAgICAgICAgICYmICFiZWFudHlwZS5lcXVhbHMoU1RBVEVGVUxfU0VTU0lPTikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiVGhlIGJlYW50eXBlIGZvdW5kICgiICsgYmVhbnR5cGUKKyAgICAgICAgICAgICAgICAgICAgKyAiKSBpc24ndCB2YWxpZCBpbiB0aGUgIiArIG5hbWUgKyAiIEVKQi4iKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNtcCAmJiAoIWJlYW50eXBlLmVxdWFscyhFTlRJVFlfQkVBTikpKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDTVAgc3R1YnMgYW5kIHNrZWxldG9ucyBtYXkgbm90IGJlIGdlbmVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGZvciBhIFNlc3Npb24gQmVhbiAtLSB0aGUgXCJjbXBcIiBhdHRyaWJ1dGUgd2lsbCBiZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGlnbm9yZWRmb3IgdGhlICIgKyBuYW1lICsgIiBFSkIuIik7CisgICAgICAgICAgICBpZiAoY21wICYmICFiZWFudHlwZS5lcXVhbHMoRU5USVRZX0JFQU4pKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiQ01QIHN0dWJzIGFuZCBza2VsZXRvbnMgbWF5IG5vdCBiZSBnZW5lcmF0ZWQgZm9yIGEgU2Vzc2lvbiBCZWFuIC0tIHRoZSBcImNtcFwiIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWRmb3IgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgRUpCLiIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaGFzZXNzaW9uICYmICghYmVhbnR5cGUuZXF1YWxzKFNUQVRFRlVMX1NFU1NJT04pKSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGlnaGx5IGF2YWlsYWJsZSBzdHVicyBhbmQgc2tlbGV0b25zIG1heSAiCi0gICAgICAgICAgICAgICAgICAgICsgIm9ubHkgYmUgZ2VuZXJhdGVkIGZvciBhIFN0YXRlZnVsIFNlc3Npb24gQmVhbiAtLSB0aGUgIgotICAgICAgICAgICAgICAgICAgICArICJcImhhc2Vzc2lvblwiIGF0dHJpYnV0ZSB3aWxsIGJlIGlnbm9yZWQgZm9yIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICsgbmFtZSArICIgRUpCLiIpOworICAgICAgICAgICAgaWYgKGhhc2Vzc2lvbiAmJiAhYmVhbnR5cGUuZXF1YWxzKFNUQVRFRlVMX1NFU1NJT04pKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiSGlnaGx5IGF2YWlsYWJsZSBzdHVicyBhbmQgc2tlbGV0b25zIG1heSBvbmx5IGJlIGdlbmVyYXRlZCBmb3IgYSBTdGF0ZWZ1bCBTZXNzaW9uIEJlYW4iCisgICAgICAgICAgICAgICAgICAgICAgICArICItLSB0aGUgXCJoYXNlc3Npb25cIiBhdHRyaWJ1dGUgd2lsbCBiZSBpZ25vcmVkIGZvciB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBuYW1lICsgIiBFSkIuIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIEVKQiAic291cmNlIiBjbGFzc2VzIGFsbCBleGlzdCAqLwogICAgICAgICAgICAgaWYgKCFyZW1vdGUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgcmVtb3RlIGludGVyZmFjZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZW1vdGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgKyAiIGNvdWxkIG5vdCBiZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm91bmQuIik7CisgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZCBub3QgYmUgZm91bmQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWhvbWUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKS5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBFamJjRXhjZXB0aW9uKCJUaGUgaG9tZSBpbnRlcmZhY2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGQgbm90IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgKyBob21lLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZCBub3QgYmUgZm91bmQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWltcGxlbWVudGF0aW9uLmdldENsYXNzRmlsZShidWlsZERpcikuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRWpiY0V4Y2VwdGlvbigiVGhlIEVKQiBpbXBsZW1lbnRhdGlvbiBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpbXBsZW1lbnRhdGlvbi5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBiZSBmb3VuZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgKyBpbXBsZW1lbnRhdGlvbi5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgY291bGQgbm90IGJlIGZvdW5kLiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExMzksOSArMTExMCw4IEBACiAgICAgICAgICAgICByZW1vdGVGaWxlID0gcmVtb3RlLmdldENsYXNzRmlsZShidWlsZERpcik7CiAgICAgICAgICAgICBtb2RpZmllZCA9IHJlbW90ZUZpbGUubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgICAgICBpZiAobW9kaWZpZWQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVtb3RlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgIiBjb3VsZG4ndCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBjbGFzcyAiICsgcmVtb3RlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBjb3VsZG4ndCBiZSBmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbGF0ZXN0TW9kaWZpZWQgPSBtb2RpZmllZDsKQEAgLTExNTAsOSArMTEyMCw4IEBACiAgICAgICAgICAgICBob21lRmlsZSA9IGhvbWUuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKTsKICAgICAgICAgICAgIG1vZGlmaWVkID0gaG9tZUZpbGUubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgICAgICBpZiAobW9kaWZpZWQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9tZS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKSArICIgY291bGRuJ3QgYmUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJmb3VuZCBvbiB0aGUgY2xhc3NwYXRoIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgY2xhc3MgIiArIGhvbWUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGNvdWxkbid0IGJlIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsYXRlc3RNb2RpZmllZCA9IE1hdGgubWF4KGxhdGVzdE1vZGlmaWVkLCBtb2RpZmllZCk7CkBAIC0xMTYyLDkgKzExMzEsOSBAQAogICAgICAgICAgICAgICAgIHBrRmlsZSA9IHByaW1hcnlLZXkuZ2V0Q2xhc3NGaWxlKGJ1aWxkRGlyKTsKICAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHBrRmlsZS5sYXN0TW9kaWZpZWQoKTsKICAgICAgICAgICAgICAgICBpZiAobW9kaWZpZWQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgY2xhc3MgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcmltYXJ5S2V5LmdldFF1YWxpZmllZENsYXNzTmFtZSgpICsgImNvdWxkbid0IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBjbGFzcyAiICsgcHJpbWFyeUtleS5nZXRRdWFsaWZpZWRDbGFzc05hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvdWxkbid0IGJlIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGgiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsYXRlc3RNb2RpZmllZCA9IE1hdGgubWF4KGxhdGVzdE1vZGlmaWVkLCBtb2RpZmllZCk7CkBAIC0xMjI1LDcgKzExOTQsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBsb25nIGRlc3RDbGFzc2VzTW9kaWZpZWQoRmlsZSBkZXN0RGlyKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBjbGFzc25hbWVzID0gY2xhc3Nlc1RvR2VuZXJhdGUoKTsgLy8gTGlzdCBvZiBhbGwgc3R1YnMgJiBza2VscwotICAgICAgICAgICAgbG9uZyBkZXN0Q2xhc3Nlc01vZGlmaWVkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7IC8vIEVhcmxpZXN0IG1vZCB0aW1lCisgICAgICAgICAgICBsb25nIGRlc3RDbGFzc2VzTW9kaWZpZWQgPSBJbnN0YW50Lm5vdygpLnRvRXBvY2hNaWxsaSgpOyAvLyBFYXJsaWVzdCBtb2QgdGltZQogICAgICAgICAgICAgYm9vbGVhbiBhbGxDbGFzc2VzRm91bmQgID0gdHJ1ZTsgICAgICAgICAgIC8vIEhhcyBlYWNoIGJlZW4gZm91bmQ/CiAKICAgICAgICAgICAgIC8qCkBAIC0xMjMzLDcgKzEyMDIsOCBAQAogICAgICAgICAgICAgICogZGV0ZXJtaW5lIChpZiBhbGwgZXhpc3QpIHdoaWNoIGZpbGUgaGFzIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NuYW1lIDogY2xhc3NuYW1lcykgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoVG9DbGFzcyA9IGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKSArICIuY2xhc3MiOworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoVG9DbGFzcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAiLmNsYXNzIjsKICAgICAgICAgICAgICAgICBGaWxlIGNsYXNzRmlsZSA9IG5ldyBGaWxlKGRlc3REaXIsIHBhdGhUb0NsYXNzKTsKIAogICAgICAgICAgICAgICAgIC8qCkBAIC0xMjUyLDcgKzEyMjIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIChhbGxDbGFzc2VzRm91bmQpID8gZGVzdENsYXNzZXNNb2RpZmllZCA6IC0xOworICAgICAgICAgICAgcmV0dXJuIGFsbENsYXNzZXNGb3VuZCA/IGRlc3RDbGFzc2VzTW9kaWZpZWQgOiAtMTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTMxNiwyMiArMTI4NiwyMyBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIEEgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgRWpiSW5mbyBpbnN0YW5jZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHMgPSAiRUpCIG5hbWU6ICIgKyBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBob21lOiAgICAgICIgKyBob21lCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICByZW1vdGU6ICAgICIgKyByZW1vdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIGltcGw6ICAgICAgIiArIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBwcmltYXJ5S2V5OiAiICsgcHJpbWFyeUtleQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgYmVhbnR5cGU6ICAiICsgYmVhbnR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIGNtcDogICAgICAgIiArIGNtcAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgaWlvcDogICAgICAiICsgaWlvcAotICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgaGFzZXNzaW9uOiAiICsgaGFzZXNzaW9uOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoIkVKQiBuYW1lOiAiICsgbmFtZQorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBob21lOiAgICAgICIgKyBob21lCisgICAgICAgICAgICAgICAgICAgICsgIlxuXHIgICAgICAgICAgICAgIHJlbW90ZTogICAgIiArIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBpbXBsOiAgICAgICIgKyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBwcmltYXJ5S2V5OiAiICsgcHJpbWFyeUtleQorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBiZWFudHlwZTogICIgKyBiZWFudHlwZQorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBjbXA6ICAgICAgICIgKyBjbXAKKyAgICAgICAgICAgICAgICAgICAgKyAiXG5cciAgICAgICAgICAgICAgaWlvcDogICAgICAiICsgaWlvcAorICAgICAgICAgICAgICAgICAgICArICJcblxyICAgICAgICAgICAgICBoYXNlc3Npb246ICIgKyBoYXNlc3Npb24pOwogCiAgICAgICAgICAgICBmb3IgKFN0cmluZyBjbXBEZXNjcmlwdG9yIDogY21wRGVzY3JpcHRvcnMpIHsKLSAgICAgICAgICAgICAgICBzICs9ICJcblxyICAgICAgICAgICAgICBDTVAgRGVzY3JpcHRvcjogIiArIGNtcERlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoIlxuXHIgICAgICAgICAgICAgIENNUCBEZXNjcmlwdG9yOiAiKS5hcHBlbmQoY21wRGVzY3JpcHRvcik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKTsKICAgICAgICAgfQogCiAgICAgfSAvLyBFbmQgb2YgRWpiSW5mbyBpbm5lciBjbGFzcwpAQCAtMTQzMSw2ICsxNDAyLDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuIGdldFF1YWxpZmllZENsYXNzTmFtZSgpOwogICAgICAgICB9CkBAIC0xNDYyLDE4ICsxNDM0LDE2IEBACiAgICAgICAgICAqIFJlYWRzIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZWRpcmVjdHMgaXQgdG8gc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgICAqIHVzaW5nIGEgc2VwYXJhdGUgdGhyZWFkLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkpOwotICAgICAgICAgICAgU3RyaW5nIHRleHQ7Ci0gICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dDsKICAgICAgICAgICAgICAgICB3aGlsZSAoKHRleHQgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7IC8vTk9TT05BUgotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocmVhZGVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gIC8vIEVuZCBvZiBSZWRpcmVjdE91dHB1dCBpbm5lciBjbGFzcwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0lQbGFuZXRFamJjVGFzay5qYXZhCmluZGV4IDlhY2ExY2IuLjFkNTc1NjEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9JUGxhbmV0RWpiY1Rhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSVBsYW5ldEVqYmNUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xODgsNiArMTg4LDcgQEAKICAgICAgKiBEb2VzIHRoZSB3b3JrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBjaGVja0NvbmZpZ3VyYXRpb24oKTsKIApAQCAtMjAyLDQxICsyMDMsNDIgQEAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAogICAgICAgICBpZiAoZWpiZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidGhlIFwiZWpiZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOworICAgICAgICAgICAgU3RyaW5nIG1zZyA9CisgICAgICAgICAgICAgICAgIlRoZSBzdGFuZGFyZCBFSkIgZGVzY3JpcHRvciBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyB0aGUgXCJlamJkZXNjcmlwdG9yXCIgYXR0cmlidXRlLiI7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKCFlamJkZXNjcmlwdG9yLmV4aXN0cygpKSB8fCAoIWVqYmRlc2NyaXB0b3IuaXNGaWxlKCkpKSB7CisgICAgICAgIGlmICghZWpiZGVzY3JpcHRvci5leGlzdHMoKSB8fCAhZWpiZGVzY3JpcHRvci5pc0ZpbGUoKSkgewogICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgc3RhbmRhcmQgRUpCIGRlc2NyaXB0b3IgKCIgKyBlamJkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSB3YXMgbm90IGZvdW5kIG9yIGlzbid0IGEgZmlsZS4iOworICAgICAgICAgICAgICAgICsgIikgd2FzIG5vdCBmb3VuZCBvciBpc24ndCBhIGZpbGUuIjsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlhc2Rlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgaUFTLXNwZWlmaWMgWE1MIGRlc2NyaXB0b3IgbXVzdCBiZSBzcGVjaWZpZWQgdXNpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRoZSBcImlhc2Rlc2NyaXB0b3JcIiBhdHRyaWJ1dGUuIjsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPQorICAgICAgICAgICAgICAgICJUaGUgaUFTLXNwZWlmaWMgWE1MIGRlc2NyaXB0b3IgbXVzdCBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIFwiaWFzZGVzY3JpcHRvclwiIGF0dHJpYnV0ZS4iOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCghaWFzZGVzY3JpcHRvci5leGlzdHMoKSkgfHwgKCFpYXNkZXNjcmlwdG9yLmlzRmlsZSgpKSkgeworICAgICAgICBpZiAoIWlhc2Rlc2NyaXB0b3IuZXhpc3RzKCkgfHwgIWlhc2Rlc2NyaXB0b3IuaXNGaWxlKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVGhlIGlBUy1zcGVjaWZpYyBYTUwgZGVzY3JpcHRvciAoIiArIGlhc2Rlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIHdhcyBub3QgZm91bmQgb3IgaXNuJ3QgYSBmaWxlLiI7CisgICAgICAgICAgICAgICAgKyAiKSB3YXMgbm90IGZvdW5kIG9yIGlzbid0IGEgZmlsZS4iOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZGVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQgdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRoZSBcImRlc3RcIiBhdHRyaWJ1dGUuIjsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPQorICAgICAgICAgICAgICAgICJUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBcImRlc3RcIiBhdHRyaWJ1dGUuIjsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoIWRlc3QuZXhpc3RzKCkpIHx8ICghZGVzdC5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5ICgiICsgZGVzdCArICIpIHdhcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZvdW5kIG9yIGlzbid0IGEgZGlyZWN0b3J5LiI7CisgICAgICAgIGlmICghZGVzdC5leGlzdHMoKSB8fCAhZGVzdC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgKCIgKyBkZXN0CisgICAgICAgICAgICAgICAgKyAiKSB3YXMgbm90IGZvdW5kIG9yIGlzbid0IGEgZGlyZWN0b3J5LiI7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgoaWFzaG9tZSAhPSBudWxsKSAmJiAoIWlhc2hvbWUuaXNEaXJlY3RvcnkoKSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiSWYgXCJpYXNob21lXCIgaXMgc3BlY2lmaWVkLCBpdCBtdXN0IGJlIGEgdmFsaWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeSAoaXQgd2FzIHNldCB0byAiICsgaWFzaG9tZSArICIpLiI7CisgICAgICAgIGlmIChpYXNob21lICE9IG51bGwgJiYgIWlhc2hvbWUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgU3RyaW5nIG1zZyA9CisgICAgICAgICAgICAgICAgIklmIFwiaWFzaG9tZVwiIGlzIHNwZWNpZmllZCwgaXQgbXVzdCBiZSBhIHZhbGlkIGRpcmVjdG9yeSAoaXQgd2FzIHNldCB0byAiCisgICAgICAgICAgICAgICAgICAgICsgaWFzaG9tZSArICIpLiI7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI0OCwyMSArMjUwLDEzIEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiB0aGUgcGFyc2VyIGNhbm5vdCBiZSBjcmVhdGVkIG9yIGNvbmZpZ3VyZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTQVhQYXJzZXIgZ2V0UGFyc2VyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQotICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4UGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgIHNheFBhcnNlckZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKLSAgICAgICAgICAgIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIlVuYWJsZSB0byBjcmVhdGUgYSBTQVhQYXJzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUsIGdldExvY2F0aW9uKCkpOwotICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiVW5hYmxlIHRvIGNyZWF0ZSBhIFNBWFBhcnNlcjogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gc2F4UGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKKyAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIHwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgYSBTQVhQYXJzZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2F4UGFyc2VyOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjg0LDIxICsyNzgsMjMgQEAKICAgICAgICAgaWYgKGlhc2hvbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgZWpiYy5zZXRJYXNIb21lRGlyKGlhc2hvbWUpOwogICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVqYmMuZXhlY3V0ZSgpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRlc2NyaXB0b3IgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkFuIElPRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgZGVzY3JpcHRvciBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIkEgU0FYRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRlc2NyaXB0b3IgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkEgU0FYRXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWFkIHRoZSBYTUwgZGVzY3JpcHRvciBmaWxlOiAiCisgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgZSwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0gY2F0Y2ggKElQbGFuZXRFamJjLkVqYmNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJBbiBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJ1biB0aGUgZWpiYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidXRpbGl0eTogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSwgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcnVuIHRoZSBlamJjIHV0aWxpdHk6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICBlLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzA5LDEzICszMDUsOSBAQAogICAgICAqIEByZXR1cm4gUGF0aCBUaGUgY2xhc3NwYXRoIHRvIGJlIHVzZWQgZm9yIEVKQmMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBQYXRoIGdldENsYXNzcGF0aCgpIHsKLSAgICAgICAgUGF0aCBjcCA9IG51bGw7CiAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgY3AgPSAobmV3IFBhdGgoZ2V0UHJvamVjdCgpKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjcCA9IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGdldFByb2plY3QoKSkuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJsYXN0Iik7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY3A7CisgICAgICAgIHJldHVybiBjbGFzc3BhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyLmphdmEKaW5kZXggZTkyZDk4NzkuLmM5YWI4YzYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Jbm5lckNsYXNzRmlsZW5hbWVGaWx0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSW5uZXJDbGFzc0ZpbGVuYW1lRmlsdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCwxMSArNDQsOSBAQAogICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gZmlsdGVyIG9uLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZW5hbWUgaXMgYW4gaW5uZXIgY2xhc3Mgb2YgdGhlIGJhc2UgY2xhc3MuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgaWYgKChmaWxlbmFtZS5sYXN0SW5kZXhPZigiLiIpICE9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSkKLSAgICAgICAgICAgIHx8IChmaWxlbmFtZS5pbmRleE9mKGJhc2VDbGFzc05hbWUgKyAiJCIpICE9IDApKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpID09IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKQorICAgICAgICAgICAgJiYgZmlsZW5hbWUuaW5kZXhPZihiYXNlQ2xhc3NOYW1lICsgIiQiKSA9PSAwOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSmJvc3NEZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IGU2ZjgxOTIuLjIxYTBmMmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9KYm9zc0RlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0pib3NzRGVwbG95bWVudFRvb2wuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUzLDE0ICs1MywxNCBAQAogICAgICAqIEBwYXJhbSBlamJGaWxlcyB0aGUgaGFzaHRhYmxlIG9mIGZpbGVzIHRvIHBvcHVsYXRlLgogICAgICAqIEBwYXJhbSBkZFByZWZpeCB0aGUgcHJlZml4IHRvIHVzZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKICAgICAgICAgRmlsZSBqYm9zc0REID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBKQk9TU19ERCk7CiAgICAgICAgIGlmIChqYm9zc0RELmV4aXN0cygpKSB7CiAgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBKQk9TU19ERCwgamJvc3NERCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgamJvc3MgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAiCi0gICAgICAgICAgICAgICAgKyAiSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIgKyBqYm9zc0RELmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSBqYm9zcyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCisgICAgICAgICAgICAgICAgKyBqYm9zc0RELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGRlc2NyaXB0b3JGaWxlTmFtZSA9IEpCT1NTX0NNUDEwRDsKQEAgLTczLDggKzczLDcgQEAKICAgICAgICAgaWYgKGpib3NzQ01QRC5leGlzdHMoKSkgewogICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgZGVzY3JpcHRvckZpbGVOYW1lLCBqYm9zc0NNUEQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIGpib3NzIGNtcCBkZXNjcmlwdG9yLiAiCi0gICAgICAgICAgICAgICAgKyAiSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSBqYm9zcyBjbXAgZGVzY3JpcHRvci4gSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIKICAgICAgICAgICAgICAgICArIGpib3NzQ01QRC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9CiAgICAgfQpAQCAtODMsMTUgKzgyLDE1IEBACiAgICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZSBtb2RpZmljYXRpb24gZGF0ZQogICAgICAqIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQgYmVhbiBjbGFzc2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKICAgICAgICAgaWYgKGdldERlc3REaXIoKSA9PSBudWxsICYmIGdldFBhcmVudCgpLmdldERlc3RkaXIoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRlc3REaXIgbm90IHNwZWNpZmllZCIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChnZXREZXN0RGlyKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldFBhcmVudCgpLmdldERlc3RkaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsZShnZXREZXN0RGlyKCksIGJhc2VOYW1lICsgamFyU3VmZml4KTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMSw2ICsxMDAsNyBAQAogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQKICAgICAgKiBAc2luY2UgYW50IDEuNgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSm9uYXNEZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL0pvbmFzRGVwbG95bWVudFRvb2wuamF2YQppbmRleCAwN2NhNjEwLi43NjhlOWNiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvSm9uYXNEZXBsb3ltZW50VG9vbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9Kb25hc0RlcGxveW1lbnRUb29sLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw5ICsxOSwxMCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CkBAIC0zMjksNiArMzMwLDcgQEAKICAgICAvKiAtLS0tLS0tLS0tLS0tICovCiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRGVzY3JpcHRvcihTdHJpbmcgYURlc2NyaXB0b3JOYW1lLCBTQVhQYXJzZXIgc2F4UGFyc2VyKSB7CiAKICAgICAgICAgZGVzY3JpcHRvck5hbWUgPSBhRGVzY3JpcHRvck5hbWU7CkBAIC0zNDYsNyArMzQ4LDggQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyZmlsZSwgSGFzaHRhYmxlIGVqYkZpbGVzLCBTdHJpbmcgcHVibGljSWQpCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphcmZpbGUsIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgcHVibGljSWQpCiAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBjcmVhdGUgdGhlIGdlbmVyaWMgamFyIGZpcnN0CkBAIC0zNjYsMTAgKzM2OSwxMSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgewogCi0gICAgLy8gSk9uQVMtc3BlY2lmaWMgZGVzY3JpcHRvciBkZXBsb3ltZW50Ci0gICAgam9uYXNEZXNjcmlwdG9yTmFtZSA9IGdldEpvbmFzRGVzY3JpcHRvck5hbWUoKTsKKyAgICAgICAgLy8gSk9uQVMtc3BlY2lmaWMgZGVzY3JpcHRvciBkZXBsb3ltZW50CisgICAgICAgIGpvbmFzRGVzY3JpcHRvck5hbWUgPSBnZXRKb25hc0Rlc2NyaXB0b3JOYW1lKCk7CiAgICAgICAgIEZpbGUgam9uYXNERCA9IG5ldyBGaWxlKGdldENvbmZpZygpLmRlc2NyaXB0b3JEaXIsIGpvbmFzRGVzY3JpcHRvck5hbWUpOwogCiAgICAgICAgIGlmIChqb25hc0RELmV4aXN0cygpKSB7CkBAIC0zODEsNiArMzg1LDcgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgewogICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0RGVzdERpcigpLCBiYXNlTmFtZSArIHN1ZmZpeCk7CiAgICAgfQpAQCAtNDU4LDYgKzQ2Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRKYXJCYXNlTmFtZShTdHJpbmcgZGVzY3JpcHRvckZpbGVOYW1lKSB7CiAKICAgICAgICAgU3RyaW5nIGJhc2VOYW1lID0gbnVsbDsKQEAgLTQ5OSw2ICs1MDUsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyS25vd25EVERzKERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChFSkJfSkFSXzFfMV9QVUJMSUNfSUQsCiAgICAgICAgICAgICAgICAgICAgIGpvbmFzcm9vdCArIEZpbGUuc2VwYXJhdG9yICsgInhtbCIgKyBGaWxlLnNlcGFyYXRvciArIEVKQl9KQVJfMV8xX0RURCk7CkBAIC01MTgsMTUgKzUyNSwxMiBAQAogICAgICAqIEBwYXJhbSBlamJGaWxlcyB0aGUgaGFzaHRhYmxlLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhZGRHZW5JQ0dlbmVyYXRlZEZpbGVzKAotICAgICAgICBGaWxlIGdlbmVyaWNKYXJGaWxlLCBIYXNodGFibGUgZWpiRmlsZXMpIHsKLSAgICAgICAgSmF2YSBnZW5pY1Rhc2sgPSBudWxsOyAgICAvLyBHZW5JQyB0YXNrCi0gICAgICAgIFN0cmluZyBnZW5pY0NsYXNzID0gbnVsbDsgLy8gR2VuSUMgY2xhc3MgKDMgYXJlIHN1cHBvcnRlZCBmb3IgdmFyaW91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcnNpb25zCisgICAgICAgIEZpbGUgZ2VuZXJpY0phckZpbGUsIEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzKSB7CiAgICAgICAgIGlmIChub2dlbmljKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBnZW5pY1Rhc2sgPSBuZXcgSmF2YShnZXRUYXNrKCkpOworICAgICAgICBKYXZhIGdlbmljVGFzayA9IG5ldyBKYXZhKGdldFRhc2soKSk7IC8vIEdlbklDIHRhc2sKICAgICAgICAgZ2VuaWNUYXNrLnNldFRhc2tOYW1lKCJnZW5pYyIpOwogICAgICAgICBnZW5pY1Rhc2suc2V0Rm9yayh0cnVlKTsKIApAQCAtNTUzLDEzICs1NTcsOCBAQAogICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1kIik7CiAgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRGaWxlKG91dHB1dGRpcik7CiAKLSAgICAgICAgLy8gd29yayBhcm91bmQgYSBidWcgb2YgR2VuSUMgMi41Ci0gICAgICAgIFN0cmluZyBrZXk7Ci0gICAgICAgIEZpbGUgZjsKLSAgICAgICAgRW51bWVyYXRpb24ga2V5cyA9IGVqYkZpbGVzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGYgPSBuZXcgRmlsZShvdXRwdXRkaXIgKyBGaWxlLnNlcGFyYXRvciArIGtleSk7CisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGVqYkZpbGVzLmtleVNldCgpKSB7CisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShvdXRwdXRkaXIgKyBGaWxlLnNlcGFyYXRvciArIGtleSk7CiAgICAgICAgICAgICBmLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKICAgICAgICAgfQogICAgICAgICBsb2coIldvcmtlZCBhcm91bmQgYSBidWcgb2YgR2VuSUMgMi41LiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtNTgxLDE1ICs1ODAsMTggQEAKICAgICAgICAgbG9nKCJVc2luZyBjbGFzc3BhdGg6ICIgKyBjbGFzc3BhdGgudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIGdlbmljVGFzay5zZXRDbGFzc3BhdGgoY2xhc3NwYXRoKTsKIAorICAgICAgICBTdHJpbmcgZ2VuaWNDbGFzczsgLy8gR2VuSUMgY2xhc3MgKDMgYXJlIHN1cHBvcnRlZCBmb3IgdmFyaW91cworICAgICAgICAvLyB2ZXJzaW9ucworICAgICAgICAvLyB3b3JrIGFyb3VuZCBhIGJ1ZyBvZiBHZW5JQyAyLjUKKwogICAgICAgICAvLyBjbGFzcyBuYW1lIChzZWFyY2ggaW4gdGhlIGNsYXNzcGF0aCBwcm92aWRlZCBmb3IgdGhlIGVqYmphciBlbGVtZW50KQogICAgICAgICBnZW5pY0NsYXNzID0gZ2V0R2VuaWNDbGFzc05hbWUoY2xhc3NwYXRoKTsKICAgICAgICAgaWYgKGdlbmljQ2xhc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgbG9nKCJDYW5ub3QgZmluZCBHZW5JQyBjbGFzcyBpbiBjbGFzc3BhdGguIiwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiR2VuSUMgY2xhc3Mgbm90IGZvdW5kLCBwbGVhc2UgY2hlY2sgdGhlIGNsYXNzcGF0aC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiVXNpbmcgJyIgKyBnZW5pY0NsYXNzICsgIicgR2VuSUMgY2xhc3MuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBnZW5pY1Rhc2suc2V0Q2xhc3NuYW1lKGdlbmljQ2xhc3MpOwogICAgICAgICB9CisgICAgICAgIGxvZygiVXNpbmcgJyIgKyBnZW5pY0NsYXNzICsgIicgR2VuSUMgY2xhc3MuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIGdlbmljVGFzay5zZXRDbGFzc25hbWUoZ2VuaWNDbGFzcyk7CiAKICAgICAgICAgLy8ga2VlcGdlbmVyYXRlZAogICAgICAgICBpZiAoa2VlcGdlbmVyYXRlZCkgewpAQCAtNjEzLDEzICs2MTUsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGphdmFjb3B0cwotICAgICAgICBpZiAoamF2YWNvcHRzICE9IG51bGwgJiYgIWphdmFjb3B0cy5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChqYXZhY29wdHMgIT0gbnVsbCAmJiAhamF2YWNvcHRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItamF2YWNvcHRzIik7CiAgICAgICAgICAgICBnZW5pY1Rhc2suY3JlYXRlQXJnKCkuc2V0TGluZShqYXZhY29wdHMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcm1pY29wdHMKLSAgICAgICAgaWYgKHJtaWNvcHRzICE9IG51bGwgJiYgIXJtaWNvcHRzLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHJtaWNvcHRzICE9IG51bGwgJiYgIXJtaWNvcHRzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZ2VuaWNUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItcm1pY29wdHMiKTsKICAgICAgICAgICAgIGdlbmljVGFzay5jcmVhdGVBcmcoKS5zZXRMaW5lKHJtaWNvcHRzKTsKICAgICAgICAgfQpAQCAtNjgxLDEwICs2ODMsNyBAQAogICAgICAgICBsb2coIkxvb2tpbmcgZm9yIEdlbklDIGNsYXNzIGluIGNsYXNzcGF0aDogIgogICAgICAgICAgICAgKyBjbGFzc3BhdGgudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgY2wgPSBudWxsOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbCA9IGNsYXNzcGF0aC5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKTsKKyAgICAgICAgdHJ5IChBbnRDbGFzc0xvYWRlciBjbCA9IGNsYXNzcGF0aC5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY2xhc3NwYXRoKSkgewogCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGNsLmxvYWRDbGFzcyhKb25hc0RlcGxveW1lbnRUb29sLkdFTklDX0NMQVNTKTsKQEAgLTcyMywxMCArNzIyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgKyAiJyBub3QgZm91bmQgaW4gY2xhc3NwYXRoLiIsCiAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbC5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtNzM3LDMzICs3MzIsMzggQEAKICAgICAgKiBAcGFyYW0gc2F4UGFyc2VyICAgICAgICAgIG5vdCB1c2VkLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKFN0cmluZyBkZXNjcmlwdG9yRmlsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBqb25hc3Jvb3QKICAgICAgICAgaWYgKGpvbmFzcm9vdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBqb25hc3Jvb3QgYXR0cmlidXQgaXMgbm90IHNldC4iKTsKLSAgICAgICAgfSBlbHNlIGlmICgham9uYXNyb290LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGpvbmFzcm9vdCBhdHRyaWJ1dCAnIiArIGpvbmFzcm9vdAotICAgICAgICAgICAgICAgICsgIicgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgam9uYXNyb290IGF0dHJpYnV0ZSBpcyBub3Qgc2V0LiIpOworICAgICAgICB9CisgICAgICAgIGlmICgham9uYXNyb290LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGpvbmFzcm9vdCBhdHRyaWJ1dGUgJyVzJyBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuIiwKKyAgICAgICAgICAgICAgICBqb25hc3Jvb3QpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gb3JiCi0gICAgICAgIGlmIChvcmIgIT0gbnVsbCAmJiAhb3JiLmVxdWFscyhSTUlfT1JCKSAmJiAhb3JiLmVxdWFscyhKRVJFTUlFX09SQikKLSAgICAgICAgICAgICYmICFvcmIuZXF1YWxzKERBVklEX09SQikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIG9yYiBhdHRyaWJ1dCAnIiArIG9yYgotICAgICAgICAgICAgICAgICsgIicgaXMgbm90IHZhbGlkIChtdXN0IGJlIGVpdGhlciAiCi0gICAgICAgICAgICAgICAgKyBSTUlfT1JCICsgIiwgIiArIEpFUkVNSUVfT1JCICsgIiBvciAiICsgREFWSURfT1JCICsgIikuIik7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2YWxpZE9yYnMgPQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChSTUlfT1JCLCBKRVJFTUlFX09SQiwgREFWSURfT1JCKTsKKworICAgICAgICBpZiAob3JiICE9IG51bGwgJiYgIXZhbGlkT3Jicy5jb250YWlucyhvcmIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBvcmIgYXR0cmlidXRlICclcycgaXMgbm90IHZhbGlkIChtdXN0IGJlIG9uZSBvZiAlcy4iLCBvcmIsCisgICAgICAgICAgICAgICAgdmFsaWRPcmJzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGFkZGl0aW9uYWxhcmdzCi0gICAgICAgIGlmIChhZGRpdGlvbmFsYXJncyAhPSBudWxsICYmIGFkZGl0aW9uYWxhcmdzLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW1wdHkgYWRkaXRpb25hbGFyZ3MgYXR0cmlidXQuIik7CisgICAgICAgIGlmIChhZGRpdGlvbmFsYXJncyAhPSBudWxsICYmIGFkZGl0aW9uYWxhcmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFbXB0eSBhZGRpdGlvbmFsYXJncyBhdHRyaWJ1dGUuIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBqYXZhYwotICAgICAgICBpZiAoamF2YWMgIT0gbnVsbCAmJiBqYXZhYy5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVtcHR5IGphdmFjIGF0dHJpYnV0LiIpOworICAgICAgICBpZiAoamF2YWMgIT0gbnVsbCAmJiBqYXZhYy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRW1wdHkgamF2YWMgYXR0cmlidXRlLiIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NzgsMjYgKzc3OCwxOSBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYSB0ZW1wIGRpcmVjdG9yeSBjYW5ub3QgYmUgY3JlYXRlZC4KICAgICAgKi8KICAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcERpcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdG1wRGlyID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZ2VuaWMiLCBudWxsLCBudWxsKTsKLSAgICAgICAgdG1wRGlyLmRlbGV0ZSgpOwotICAgICAgICBpZiAoIXRtcERpci5ta2RpcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgJyIgKyB0bXBEaXIgKyAiJy4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG1wRGlyOworICAgICAgICByZXR1cm4gRmlsZXMuY3JlYXRlVGVtcERpcmVjdG9yeSgiZ2VuaWMiKS50b0ZpbGUoKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEZWxldGUgYSBmaWxlLiBJZiB0aGUgZmlsZSBpcyBhIGRpcmVjdG9yeSwgZGVsZXRlIHJlY3Vyc2l2bHkgYWxsIHRoZQorICAgICAqIERlbGV0ZSBhIGZpbGUuIElmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkZWxldGUgcmVjdXJzaXZlbHkgYWxsIHRoZQogICAgICAqIGZpbGVzIGluc2lkZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBhRmlsZSBmaWxlIHRvIGRlbGV0ZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZGVsZXRlQWxsRmlsZXMoRmlsZSBhRmlsZSkgewogICAgICAgICBpZiAoYUZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgRmlsZVtdIHNvbWVGaWxlcyA9IGFGaWxlLmxpc3RGaWxlcygpOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvbWVGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGRlbGV0ZUFsbEZpbGVzKHNvbWVGaWxlc1tpXSk7CisgICAgICAgICAgICBmb3IgKEZpbGUgY2hpbGQgOiBhRmlsZS5saXN0RmlsZXMoKSkgeworICAgICAgICAgICAgICAgIGRlbGV0ZUFsbEZpbGVzKGNoaWxkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhRmlsZS5kZWxldGUoKTsKQEAgLTgxMSwyMiArODA0LDE5IEBACiAgICAgICogQHBhcmFtIHJvb3REaXIgdGhlIGN1cnJlbnQgc3ViLWRpcmVjdG9yeSB0byBzY2FuLgogICAgICAqIEBwYXJhbSBoYXNodGFibGUgdGhlIGhhc2h0YWJsZSB3aGVyZSB0byBhZGQgdGhlIGZpbGVzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZGRBbGxGaWxlcyhGaWxlIGZpbGUsIFN0cmluZyByb290RGlyLCBIYXNodGFibGUgaGFzaHRhYmxlKSB7Ci0KKyAgICBwcml2YXRlIHZvaWQgYWRkQWxsRmlsZXMoRmlsZSBmaWxlLCBTdHJpbmcgcm9vdERpciwgSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gaGFzaHRhYmxlKSB7CiAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0KICAgICAgICAgU3RyaW5nIG5ld1Jvb3REaXI7CiAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIEZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJvb3REaXIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1Jvb3REaXIgPSByb290RGlyICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlc1tpXS5nZXROYW1lKCk7CisgICAgICAgICAgICBmb3IgKEZpbGUgY2hpbGQgOiBmaWxlLmxpc3RGaWxlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvb3REaXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld1Jvb3REaXIgPSBjaGlsZC5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3Um9vdERpciA9IGZpbGVzW2ldLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Um9vdERpciA9IHJvb3REaXIgKyBGaWxlLnNlcGFyYXRvciArIGNoaWxkLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkQWxsRmlsZXMoZmlsZXNbaV0sIG5ld1Jvb3REaXIsIGhhc2h0YWJsZSk7CisgICAgICAgICAgICAgICAgYWRkQWxsRmlsZXMoY2hpbGQsIG5ld1Jvb3REaXIsIGhhc2h0YWJsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBoYXNodGFibGUucHV0KHJvb3REaXIsIGZpbGUpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL09yaW9uRGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9PcmlvbkRlcGxveW1lbnRUb29sLmphdmEKaW5kZXggYTczNzgwMy4uMzQwZDQzNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL09yaW9uRGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvT3Jpb25EZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsNyArMjcsNyBAQAogICogZWpiIGphciBmaWxlLiBPcmlvbiBvbmx5IHJlcXVpcmVzIG9uZSBhZGRpdGlvbmFsIGZpbGUgb3Jpb24tZWpiLWphci54bWwKICAqIGFuZCBkb2VzIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGNvbXBpbGF0aW9uLgogICoKLSAqIEBzaW5jZSBBbnQgMS45LjEwCisgKiBAc2luY2UgQW50IDEuMTAuMgogICogQHNlZSBFamJKYXIjY3JlYXRlT3Jpb24KICAqLwogCkBAIC0zNSw3ICszNSw3IEBACiAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUklPTl9ERCA9ICJvcmlvbi1lamItamFyLnhtbCI7CiAKLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGpib3NzIGphcmZpbGUuICovCisgICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSBKQm9zcyBqYXJmaWxlLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIGphclN1ZmZpeCA9ICIuamFyIjsKIAogICAgIC8qKgpAQCAtNDUsNyArNDUsNyBAQAogICAgICAqIEBwYXJhbSBlamJGaWxlcyBIYXNodGFibGUmbHQ7U3RyaW5nLCBGaWxlJmd0OwogICAgICAqIEBwYXJhbSBiYXNlTmFtZSBTdHJpbmcKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBiYXNlTmFtZSkgeworICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgYmFzZU5hbWUpIHsKICAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gdXNpbmdCYXNlSmFyTmFtZSgpID8gIiIgOiBiYXNlTmFtZTsKICAgICAgICAgRmlsZSBvcmlvbkREID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBPUklPTl9ERCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY0RlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2VibG9naWNEZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IDdmYWU4YjMuLjFmNjZjZTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY0RlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZWpiL1dlYmxvZ2ljRGVwbG95bWVudFRvb2wuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE3ICsxOCwxOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKQEAgLTM4LDE3ICs0MCwxOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuSmF2YTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5FbnZpcm9ubWVudC5WYXJpYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwogCiAvKioKICAgICBUaGUgd2VibG9naWMgZWxlbWVudCBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHdlYmxvZ2ljLmVqYmMgY29tcGlsZXIgZm9yCi0gICAgZ2VuZXJhdGluZyB3ZWJsb2dpYyBFSkIgamFycy4gUHJpb3IgdG8gQW50IDEuMywgdGhlIG1ldGhvZCBvZiBsb2NhdGluZyBDTVAKKyAgICBnZW5lcmF0aW5nIFdlYkxvZ2ljIEVKQiBqYXJzLiBQcmlvciB0byBBbnQgMS4zLCB0aGUgbWV0aG9kIG9mIGxvY2F0aW5nIENNUAogICAgIGRlc2NyaXB0b3JzIHdhcyB0byB1c2UgdGhlIGVqYmphciBuYW1pbmcgY29udmVudGlvbi4gU28gaWYgeW91ciBlamItamFyIHdhcwotICAgIGNhbGxlZCwgQ3VzdG9tZXItZWpiLWphci54bWwsIHlvdXIgd2VibG9naWMgZGVzY3JpcHRvciB3YXMgY2FsbGVkIEN1c3RvbWVyLQorICAgIGNhbGxlZCwgQ3VzdG9tZXItZWpiLWphci54bWwsIHlvdXIgV2ViTG9naWMgZGVzY3JpcHRvciB3YXMgY2FsbGVkIEN1c3RvbWVyLQogICAgIHdlYmxvZ2ljLWVqYi1qYXIueG1sIGFuZCB5b3VyIENNUCBkZXNjcmlwdG9yIGhhZCB0byBiZSBDdXN0b21lci13ZWJsb2dpYy1jbXAtCi0gICAgcmRibXMtamFyLnhtbC4gSW4gYWRkaXRpb24sIHRoZSAmbHQ7dHlwZS1zdG9yYWdlJmd0OyBlbGVtZW50IGluIHRoZSB3ZWJsb2dpYworICAgIHJkYm1zLWphci54bWwuIEluIGFkZGl0aW9uLCB0aGUgJmx0O3R5cGUtc3RvcmFnZSZndDsgZWxlbWVudCBpbiB0aGUgV2ViTG9naWMKICAgICBkZXNjcmlwdG9yIGhhZCB0byBiZSBzZXQgdG8gdGhlIHN0YW5kYXJkIG5hbWUgTUVUQS1JTkYvd2VibG9naWMtY21wLXJkYm1zLQogICAgIGphci54bWwsIGFzIHRoYXQgaXMgd2hlcmUgdGhlIENNUCBkZXNjcmlwdG9yIHdhcyBtYXBwZWQgdG8gaW4gdGhlIGdlbmVyYXRlZAogICAgIGphci4KQEAgLTYwLDIzICs2MywyMyBAQAogICAgIC8qKiBFSkIyMCBpZCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX0VKQjIwCiAgICAgICAgICA9ICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiI7Ci0gICAgLyoqIFdlYmxvZ2ljIDUuMS4wIGlkICovCisgICAgLyoqIFdlYkxvZ2ljIDUuMS4wIGlkICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDSURfV0VCTE9HSUNfRUpCNTEwCiAgICAgICAgICA9ICItLy9CRUEgU3lzdGVtcywgSW5jLi8vRFREIFdlYkxvZ2ljIDUuMS4wIEVKQi8vRU4iOwotICAgIC8qKiBXZWJsb2dpYyA2LjAuMCBpZCAqLworICAgIC8qKiBXZWJMb2dpYyA2LjAuMCBpZCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjYwMAogICAgICAgICAgPSAiLS8vQkVBIFN5c3RlbXMsIEluYy4vL0RURCBXZWJMb2dpYyA2LjAuMCBFSkIvL0VOIjsKLSAgICAvKiogV2VibG9naWMgNy4wLjAgaWQgKi8KKyAgICAvKiogV2ViTG9naWMgNy4wLjAgaWQgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNJRF9XRUJMT0dJQ19FSkI3MDAKICAgICAgICAgID0gIi0vL0JFQSBTeXN0ZW1zLCBJbmMuLy9EVEQgV2ViTG9naWMgNy4wLjAgRUpCLy9FTiI7CiAKLSAgICAvKiogV2VibG9naWMgNS4xIGR0ZCBsb2NhdGlvbiAqLworICAgIC8qKiBXZWJMb2dpYyA1LjEgZHRkIGxvY2F0aW9uICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDUxX0VKQjExX0RURF9MT0NBVElPTgogICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYi9kZXBsb3ltZW50L3htbC9lamItamFyLmR0ZCI7Ci0gICAgLyoqIFdlYmxvZ2ljIDYuMCBlamIgMS4xIGR0ZCBsb2NhdGlvbiAqLworICAgIC8qKiBXZWJMb2dpYyA2LjAgZWpiIDEuMSBkdGQgbG9jYXRpb24gKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1dMNjBfRUpCMTFfRFREX0xPQ0FUSU9OCiAgICAgICAgICA9ICIvd2VibG9naWMvZWpiMjAvZGQveG1sL2VqYjExLWphci5kdGQiOwotICAgIC8qKiBXZWJsb2dpYyA2LjAgZWpiIDIuMCBkdGQgbG9jYXRpb24gKi8KKyAgICAvKiogV2ViTG9naWMgNi4wIGVqYiAyLjAgZHRkIGxvY2F0aW9uICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9XTDYwX0VKQjIwX0RURF9MT0NBVElPTgogICAgICAgICAgPSAiL3dlYmxvZ2ljL2VqYjIwL2RkL3htbC9lamIyMC1qYXIuZHRkIjsKIApAQCAtMTAwLDEzICsxMDMsMTMgQEAKICAgICAvKiogRmlsZSB1dGlsaXRpZXMgaW5zdGFuY2UgZm9yIGNvcHlpbmcgamFycyAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwogCi0gICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSB3ZWJsb2dpYyBqYXJmaWxlLiAqLworICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgc3VmZml4IGZvciB0aGUgV2ViTG9naWMgamFyZmlsZS4gKi8KICAgICBwcml2YXRlIFN0cmluZyBqYXJTdWZmaXggPSAiLmphciI7CiAKLSAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSB3ZWJsb2dpYyBEVEQgZmlsZS4gKi8KKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBXZWJMb2dpYyBEVEQgZmlsZS4gKi8KICAgICBwcml2YXRlIFN0cmluZyB3ZWJsb2dpY0RURDsKIAotICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYiAxLjEgRFREIGZpbGUuICovCisgICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBsb2NhdGlvbiBvZiB0aGUgRUpCIDEuMSBEVEQgZmlsZS4gKi8KICAgICBwcml2YXRlIFN0cmluZyBlamIxMURURDsKIAogICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBnZW5lcmljIGVqYiBqYXJzIGFyZSBrZXB0LiAqLwpAQCAtMTE0LDcgKzExNyw3IEBACiAKICAgICAvKioKICAgICAgKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZSBvZiB0aGUKLSAgICAgKiB3ZWJsb2dpYyBFSkJDIGNvbXBpbGVyCisgICAgICogV2ViTG9naWMgRUpCQyBjb21waWxlcgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGVqYmNDbGFzcyA9IG51bGw7CiAKQEAgLTEzNywxMSArMTQwLDExIEBACiAgICAgLyoqIEluZGljYXRlcyBpZiB0aGUgb2xkIENNUCBsb2NhdGlvbiBjb252ZW50aW9uIGlzIHRvIGJlIHVzZWQuICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBuZXdDTVAgPSBmYWxzZTsKIAotICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIHRoZSB3ZWJsb2dpYyBjbGFzc2VzLiAqLworICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIHRoZSBXZWJMb2dpYyBjbGFzc2VzLiAqLwogICAgIHByaXZhdGUgUGF0aCB3bENsYXNzcGF0aCA9IG51bGw7CiAKICAgICAvKiogU3lzdGVtIHByb3BlcnRpZXMgZm9yIHRoZSBKVk0uICovCi0gICAgcHJpdmF0ZSBWZWN0b3Igc3lzcHJvcHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PFZhcmlhYmxlPiBzeXNwcm9wcyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogVGhlIHdlYmxvZ2ljLlN0ZG91dFNldmVyaXR5TGV2ZWwgdG8gdXNlIHdoZW4gcnVubmluZyB0aGUgSlZNIHRoYXQKQEAgLTE2MCw5ICsxNjMsOCBAQAogICAgICAgICBzeXNwcm9wcy5hZGQoc3lzcCk7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgd2VibG9naWMgY2xhc3NwYXRocy4KKyAgICAgKiBHZXQgdGhlIGNsYXNzcGF0aCB0byB0aGUgV2ViTG9naWMgY2xhc3NwYXRocy4KICAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc3BhdGggdG8gY29uZmlndXJlLgogICAgICAqLwogICAgIHB1YmxpYyBQYXRoIGNyZWF0ZVdMQ2xhc3NwYXRoKCkgewpAQCAtMTgyLDEyICsxODQsMTEgQEAKICAgICAgICAgdGhpcy5vdXRwdXREaXIgPSBvdXRwdXREaXI7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBPcHRpb25hbCBjbGFzc3BhdGggdG8gV0w2LjAuCi0gICAgICogV2VibG9naWMgNi4wIHdpbGwgZ2l2ZSBhIHdhcm5pbmcgaWYgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzCisgICAgICogV2ViTG9naWMgNi4wIHdpbGwgZ2l2ZSBhIHdhcm5pbmcgaWYgdGhlIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzCiAgICAgICogb2YgYSBiZWFuIGFyZSBvbiB0aGUgc3lzdGVtIGNsYXNzcGF0aCB1c2VkIHRvIHJ1biB3ZWJsb2dpYy5lamJjLgotICAgICAqIEluIHRoYXQgY2FzZSwgdGhlIHN0YW5kYXJkIHdlYmxvZ2ljIGNsYXNzZXMgc2hvdWxkIGJlIHNldCB3aXRoCisgICAgICogSW4gdGhhdCBjYXNlLCB0aGUgc3RhbmRhcmQgV2ViTG9naWMgY2xhc3NlcyBzaG91bGQgYmUgc2V0IHdpdGgKICAgICAgKiB0aGlzIGF0dHJpYnV0ZSAob3IgZXF1aXZhbGVudCBuZXN0ZWQgZWxlbWVudCkgYW5kIHRoZQogICAgICAqIGhvbWUgYW5kIHJlbW90ZSBpbnRlcmZhY2VzIGxvY2F0ZWQgd2l0aCB0aGUgc3RhbmRhcmQgY2xhc3NwYXRoCiAgICAgICogYXR0cmlidXRlLgpAQCAtMTk3LDcgKzE5OCw2IEBACiAgICAgICAgIHRoaXMud2xDbGFzc3BhdGggPSB3bENsYXNzcGF0aDsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFRoZSBjb21waWxlciAoc3dpdGNoIDxjb2RlPi1jb21waWxlcjwvY29kZT4pIHRvIHVzZTsgb3B0aW9uYWwuCiAgICAgICogVGhpcyBhbGxvd3MgZm9yIHRoZSBzZWxlY3Rpb24gb2YgYSBkaWZmZXJlbnQgY29tcGlsZXIKQEAgLTIxNCw3ICsyMTQsNiBAQAogICAgICAgICB0aGlzLmNvbXBpbGVyID0gY29tcGlsZXI7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIHJlYnVpbGQgZmxhZyB0byBmYWxzZSB0byBvbmx5IHVwZGF0ZSBjaGFuZ2VzIGluIHRoZSBqYXIgcmF0aGVyCiAgICAgICogdGhhbiByZXJ1bm5pbmcgZWpiYzsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KQEAgLTIzMCw3ICsyMjksNiBAQAogICAgICAgICB0aGlzLmFsd2F5c1JlYnVpbGQgPSByZWJ1aWxkOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgd2VibG9naWMuU3Rkb3V0U2V2ZXJpdHlMZXZlbCB0byB1c2Ugd2hlbiBydW5uaW5nIHRoZSBKVk0gdGhhdAogICAgICAqIGV4ZWN1dGVzIGVqYmM7IG9wdGlvbmFsLiBTZXQgdG8gMTYgdG8gYXZvaWQgdGhlIHdhcm5pbmdzIGFib3V0IEVKQiBIb21lIGFuZApAQCAtMjQxLDcgKzIzOSw2IEBACiAgICAgICAgIHRoaXMuanZtRGVidWdMZXZlbCA9IGp2bURlYnVnTGV2ZWw7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGRlYnVnIGxldmVsLgogICAgICAqIEByZXR1cm4gdGhlIGp2bSBkZWJ1ZyBsZXZlbCAobWF5IGJlIG51bGwpLgpAQCAtMjUwLDEwICsyNDcsOCBAQAogICAgICAgICByZXR1cm4ganZtRGVidWdMZXZlbDsKICAgICB9CiAKLQotCiAgICAgLyoqCi0gICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIHN1ZmZpeCBmb3IgdGhlIGdlbmVyYXRlZCB3ZWJsb2dpYyBqYXIgZmlsZS4KKyAgICAgKiBTZXR0ZXIgdXNlZCB0byBzdG9yZSB0aGUgc3VmZml4IGZvciB0aGUgZ2VuZXJhdGVkIFdlYkxvZ2ljIGphciBmaWxlLgogICAgICAqCiAgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBzdWZmaXguCiAgICAgICovCkBAIC0yNjEsNyArMjU2LDYgQEAKICAgICAgICAgdGhpcy5qYXJTdWZmaXggPSBpblN0cmluZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGNvbnRyb2xzIHdoZXRoZXIgdGhlIGdlbmVyaWMgZmlsZSB1c2VkIGFzIGlucHV0IHRvCiAgICAgICogZWpiYyBpcyByZXRhaW5lZDsgZGVmYXVsdHMgdG8gZmFsc2UKQEAgLTI3MiwxOSArMjY2LDE3IEBACiAgICAgICAgIHRoaXMua2VlcEdlbmVyaWMgPSBpblZhbHVlOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogQ29udHJvbHMgd2hldGhlciB3ZWJsb2dpYyB3aWxsIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhCisgICAgICogQ29udHJvbHMgd2hldGhlciBXZWJMb2dpYyB3aWxsIGtlZXAgdGhlIGdlbmVyYXRlZCBKYXZhCiAgICAgICogZmlsZXMgdXNlZCB0byBidWlsZCB0aGUgY2xhc3MgZmlsZXMgYWRkZWQgdG8gdGhlCiAgICAgICogamFyLiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc7IGRlZmF1bHQgaXMgZmFsc2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaW5WYWx1ZSBlaXRoZXIgJ3RydWUnIG9yICdmYWxzZScKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRLZWVwZ2VuZXJhdGVkKFN0cmluZyBpblZhbHVlKSB7Ci0gICAgICAgIHRoaXMua2VlcGdlbmVyYXRlZCA9IEJvb2xlYW4udmFsdWVPZihpblZhbHVlKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgdGhpcy5rZWVwZ2VuZXJhdGVkID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oaW5WYWx1ZSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBbnkgb3B0aW9uYWwgZXh0cmEgYXJndW1lbnRzIHBhc3MgdG8gdGhlIHdlYmxvZ2ljLmVqYmMKICAgICAgKiB0b29sLgpAQCAtMjk0LDkgKzI4Niw4IEBACiAgICAgICAgIHRoaXMuYWRkaXRpb25hbEFyZ3MgPSBhcmdzOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogU2V0IGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSB3ZWJsb2dpYyBKVk07IG9wdGlvbmFsLgorICAgICAqIFNldCBhbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgV2ViTG9naWMgSlZNOyBvcHRpb25hbC4KICAgICAgKiBAcGFyYW0gYXJncyB0aGUgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgSlZNCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0SnZtYXJncyhTdHJpbmcgYXJncykgewpAQCAtMzA3LDcgKzI5OCw3IEBACiAgICAgICogU2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIGVqYmMgY29tcGlsZXI7ICBvcHRpb25hbAogICAgICAqIE5vcm1hbGx5IGVqYmphciBkZXRlcm1pbmVzCiAgICAgICogdGhlIGFwcHJvcHJpYXRlIGNsYXNzIGJhc2VkIG9uIHRoZSBEVEQgdXNlZCBmb3IgdGhlIEVKQi4gVGhlIEVKQiAyLjAgY29tcGlsZXIKLSAgICAgKiBmZWF0dXJlZCBpbiB3ZWJsb2dpYyA2IGhhcywgaG93ZXZlciwgYmVlbiBkZXByZWNhdGVkIGluIHZlcnNpb24gNy4gV2hlbgorICAgICAqIGZlYXR1cmVkIGluIFdlYkxvZ2ljIDYgaGFzLCBob3dldmVyLCBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiA3LiBXaGVuCiAgICAgICogdXNpbmcgd2l0aCB2ZXJzaW9uIDcgdGhpcyBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0bwogICAgICAqICZxdW90O3dlYmxvZ2ljLmVqYmMmcXVvdDsgdG8gYXZvaWQgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcuCiAgICAgICogQHBhcmFtIGVqYmNDbGFzcyB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gdXNlLgpAQCAtMzE2LDcgKzMwNyw2IEBACiAgICAgICAgIHRoaXMuZWpiY0NsYXNzID0gZWpiY0NsYXNzOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBlamJjIGNvbXBpbGVyIGNsYXNzLgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVqYmMgY29tcGlsZXIgY2xhc3MuCkBAIC0zMjUsMTAgKzMxNSw5IEBACiAgICAgICAgIHJldHVybiBlamJjQ2xhc3M7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiA8Yj5EZXByZWNhdGVkPC9iPi4gRGVmaW5lcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYi1qYXIgRFREIGluCi0gICAgICogIHRoZSB3ZWJsb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFNob3VsZCBub3QgYmUgbmVlZGVkLCBhbmQgdGhlCisgICAgICogIHRoZSBXZWJMb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFNob3VsZCBub3QgYmUgbmVlZGVkLCBhbmQgdGhlCiAgICAgICogbmVzdGVkICZsdDtkdGQmZ3Q7IGVsZW1lbnQgaXMgcmVjb21tZW5kZWQgd2hlbiBpdCBpcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgpAQCAtMzM3LDEwICszMjYsOSBAQAogICAgICAgICBzZXRFSkJkdGQoaW5TdHJpbmcpOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogPGI+RGVwcmVjYXRlZDwvYj4uIERlZmluZXMgdGhlIGxvY2F0aW9uIG9mIHdlYmxvZ2ljIERURCBpbgotICAgICAqICB0aGUgd2VibG9naWMgY2xhc3MgaGllcmFyY2h5LiBTaG91bGQgbm90IGJlIG5lZWRlZCwgYW5kIHRoZQorICAgICAqIDxiPkRlcHJlY2F0ZWQ8L2I+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiBXZWJMb2dpYyBEVEQgaW4KKyAgICAgKiAgdGhlIFdlYkxvZ2ljIGNsYXNzIGhpZXJhcmNoeS4gU2hvdWxkIG5vdCBiZSBuZWVkZWQsIGFuZCB0aGUKICAgICAgKiBuZXN0ZWQgJmx0O2R0ZCZndDsgZWxlbWVudCBpcyByZWNvbW1lbmRlZCB3aGVuIGl0IGlzLgogICAgICAqCiAgICAgICogQHBhcmFtIGluU3RyaW5nIHRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBEVEQgbG9jYXRpb24uCkBAIC0zNDksMTAgKzMzNyw5IEBACiAgICAgICAgIHRoaXMud2VibG9naWNEVEQgPSBpblN0cmluZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIDxiPkRlcHJlY2F0ZWQ8L2I+LiBEZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiBTdW4ncyBFSkIgRFREIGluCi0gICAgICogIHRoZSB3ZWJsb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFNob3VsZCBub3QgYmUgbmVlZGVkLCBhbmQgdGhlCisgICAgICogIHRoZSBXZWJMb2dpYyBjbGFzcyBoaWVyYXJjaHkuIFNob3VsZCBub3QgYmUgbmVlZGVkLCBhbmQgdGhlCiAgICAgICogbmVzdGVkICZsdDtkdGQmZ3Q7IGVsZW1lbnQgaXMgcmVjb21tZW5kZWQgd2hlbiBpdCBpcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBpblN0cmluZyB0aGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgRFREIGxvY2F0aW9uLgpAQCAtMzYxLDcgKzM0OCw2IEBACiAgICAgICAgIHRoaXMuZWpiMTFEVEQgPSBpblN0cmluZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIG9sZENNUCBzY2hlbWUuIFRoaXMgaXMgYW4gYW50b255bSBmb3IgbmV3Q01QCiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlJwpAQCAtMzcxLDE2ICszNTcsMTUgQEAKICAgICAgICAgdGhpcy5uZXdDTVAgPSAhb2xkQ01QOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSWYgdGhpcyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIG5ldyBtZXRob2QgZm9yIGxvY2F0aW5nCiAgICAgICogQ01QIGRlc2NyaXB0b3JzIHdpbGwgYmUgdXNlZDsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCiAgICAgICogPFA+CiAgICAgICogVGhlIG9sZCBDTVAgc2NoZW1lIGxvY2F0ZXMgdGhlCi0gICAgICogd2VibG9naWMgQ01QIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIG5hbWluZyBjb252ZW50aW9uIHdoZXJlIHRoZQotICAgICAqIHdlYmxvZ2ljIENNUCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIG5hbWVkIHdpdGggdGhlIGJlYW4gbmFtZSBhcyB0aGUKKyAgICAgKiBXZWJMb2dpYyBDTVAgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24gd2hlcmUgdGhlCisgICAgICogV2ViTG9naWMgQ01QIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgbmFtZWQgd2l0aCB0aGUgYmVhbiBuYW1lIGFzIHRoZQogICAgICAqIHByZWZpeC4gVW5kZXIgdGhpcyBzY2hlbWUgdGhlIG5hbWUgb2YgdGhlIENNUCBkZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoCi0gICAgICogdGhlIG5hbWUgYWN0dWFsbHkgdXNlZCBpbiB0aGUgbWFpbiB3ZWJsb2dpYyBFSkIgZGVzY3JpcHRvci4gQWxzbywKKyAgICAgKiB0aGUgbmFtZSBhY3R1YWxseSB1c2VkIGluIHRoZSBtYWluIFdlYkxvZ2ljIEVKQiBkZXNjcmlwdG9yLiBBbHNvLAogICAgICAqIGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gbXVsdGlwbGUgQ01QIHJlZmVyZW5jZXMgY291bGQgbm90IGJlIHVzZWQuCiAgICAgICogQHBhcmFtIG5ld0NNUCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgogICAgICAqLwpAQCAtMzg4LDcgKzM3Myw2IEBACiAgICAgICAgIHRoaXMubmV3Q01QID0gbmV3Q01QOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRG8gbm90IEVKQkMgdGhlIGphciBhZnRlciBpdCBoYXMgYmVlbiBwdXQgdG9nZXRoZXI7CiAgICAgICogb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UKQEAgLTM5OCwxMSArMzgyLDExIEBACiAgICAgICAgIHRoaXMubm9FSkJDID0gbm9FSkJDOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmVnaXN0ZXIgdGhlIERURHMuCiAgICAgICogQHBhcmFtIGhhbmRsZXIgdGhlIGhhbmRsZXIgdG8gdXNlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyS25vd25EVERzKERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIpIHsKICAgICAgICAgLy8gcmVnaXN0ZXIgYWxsIHRoZSBrbm93biBEVERzCiAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIERFRkFVTFRfV0w1MV9FSkIxMV9EVERfTE9DQVRJT04pOwpAQCAtNDExLDI5ICszOTUsMjMgQEAKICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChQVUJMSUNJRF9FSkIyMCwgREVGQVVMVF9XTDYwX0VKQjIwX0RURF9MT0NBVElPTik7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBHZXQgdGhlIHdlYmxvZ2ljIGRlc2NyaXB0b3IgaGFuZGxlci4KKyAgICAgKiBHZXQgdGhlIFdlYkxvZ2ljIGRlc2NyaXB0b3IgaGFuZGxlci4KICAgICAgKiBAcGFyYW0gc3JjRGlyIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgogICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3IuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldFdlYmxvZ2ljRGVzY3JpcHRvckhhbmRsZXIoZmluYWwgRmlsZSBzcmNEaXIpIHsKLSAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9Ci0gICAgICAgICAgICBuZXcgRGVzY3JpcHRvckhhbmRsZXIoZ2V0VGFzaygpLCBzcmNEaXIpIHsKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmVxdWFscygidHlwZS1zdG9yYWdlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZmlsZW5hbWUgb2YgdmVuZG9yIHNwZWNpZmljIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZVdpdGhNRVRBID0gY3VycmVudFRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3RyaW0gdGhlIE1FVEFfSU5GXCBvZmYgb2YgdGhlIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZmlsZU5hbWVXaXRoTUVUQS5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWVXaXRoTUVUQS5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGRlc2NyaXB0b3JGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChmaWxlTmFtZVdpdGhNRVRBLCBkZXNjcmlwdG9yRmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0RpcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRWxlbWVudCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoInR5cGUtc3RvcmFnZSIuZXF1YWxzKGN1cnJlbnRFbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGZpbGVuYW1lIG9mIHZlbmRvciBzcGVjaWZpYyBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhlIE1FVEFfSU5GXCBvZmYgb2YgdGhlIGZpbGUgbmFtZQorICAgICAgICAgICAgICAgICAgICBlamJGaWxlcy5wdXQoY3VycmVudFRleHQsIG5ldyBGaWxlKHNyY0RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGV4dC5zdWJzdHJpbmcoTUVUQV9ESVIubGVuZ3RoKCkpKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAogICAgICAgICBoYW5kbGVyLnJlZ2lzdGVyRFREKFBVQkxJQ0lEX1dFQkxPR0lDX0VKQjUxMCwgREVGQVVMVF9XTDUxX0RURF9MT0NBVElPTik7CiAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfV0VCTE9HSUNfRUpCNTEwLCBERUZBVUxUX1dMNjBfNTFfRFREX0xPQ0FUSU9OKTsKQEAgLTQ0Miw1MiArNDIwLDQ1IEBACiAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfV0VCTE9HSUNfRUpCNTEwLCB3ZWJsb2dpY0RURCk7CiAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfV0VCTE9HSUNfRUpCNjAwLCB3ZWJsb2dpY0RURCk7CiAKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgRWpiSmFyLkRURExvY2F0aW9uIGR0ZExvY2F0aW9uID0gKEVqYkphci5EVERMb2NhdGlvbikgaS5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoZHRkTG9jYXRpb24uZ2V0UHVibGljSWQoKSwgZHRkTG9jYXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZ2V0Q29uZmlnKCkuZHRkTG9jYXRpb25zLmZvckVhY2gobCAtPiBoYW5kbGVyLnJlZ2lzdGVyRFREKGwuZ2V0UHVibGljSWQoKSwgbC5nZXRMb2NhdGlvbigpKSk7CiAgICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQWRkIGFueSB2ZW5kb3Igc3BlY2lmaWMgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBFSkIgSmFyLgogICAgICAqIEBwYXJhbSBlamJGaWxlcyB0aGUgaGFzaCB0YWJsZSB0byBiZSBwb3B1bGF0ZWQuCiAgICAgICogQHBhcmFtIGRkUHJlZml4IHRoZSBwcmVmaXggdG8gdXNlLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZSBlamJGaWxlcywgU3RyaW5nIGRkUHJlZml4KSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgewogICAgICAgICBGaWxlIHdlYmxvZ2ljREQgPSBuZXcgRmlsZShnZXRDb25maWcoKS5kZXNjcmlwdG9yRGlyLCBkZFByZWZpeCArIFdMX0REKTsKIAogICAgICAgICBpZiAod2VibG9naWNERC5leGlzdHMoKSkgewogICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgV0xfREQsCiAgICAgICAgICAgICAgICAgd2VibG9naWNERCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgd2VibG9naWMgZGVwbG95bWVudCBkZXNjcmlwdG9yLiAiCi0gICAgICAgICAgICAgICAgKyAiSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIKKyAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSB3ZWJsb2dpYyBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCiAgICAgICAgICAgICAgICAgKyB3ZWJsb2dpY0RELmdldFBhdGgoKSwgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW5ld0NNUCkgewogICAgICAgICAgICAgbG9nKCJUaGUgb2xkIG1ldGhvZCBmb3IgbG9jYXRpbmcgQ01QIGZpbGVzIGhhcyBiZWVuIERFUFJFQ0FURUQuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBsb2coIlBsZWFzZSBhZGp1c3QgeW91ciB3ZWJsb2dpYyBkZXNjcmlwdG9yIGFuZCBzZXQgIgotICAgICAgICAgICAgICAgICsgIm5ld0NNUD1cInRydWVcIiB0byB1c2UgdGhlIG5ldyBDTVAgZGVzY3JpcHRvciAiCi0gICAgICAgICAgICAgICAgKyAiaW5jbHVzaW9uIG1lY2hhbmlzbS4gIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAvLyBUaGUgdGhlIHdlYmxvZ2ljIGNtcCBkZXBsb3ltZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGxvZygiUGxlYXNlIGFkanVzdCB5b3VyIHdlYmxvZ2ljIGRlc2NyaXB0b3IgYW5kIHNldCBuZXdDTVA9XCJ0cnVlXCIgdG8gdXNlIHRoZSBuZXcgQ01QIGRlc2NyaXB0b3IgaW5jbHVzaW9uIG1lY2hhbmlzbS4gIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIC8vIFRoZSB0aGUgV2ViTG9naWMgQ01QIGRlcGxveW1lbnQgZGVzY3JpcHRvcgogICAgICAgICAgICAgRmlsZSB3ZWJsb2dpY0NNUEREID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyBXTF9DTVBfREQpOwogCiAgICAgICAgICAgICBpZiAod2VibG9naWNDTVBERC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIFdMX0NNUF9ERCwKLSAgICAgICAgICAgICAgICAgICAgd2VibG9naWNDTVBERCk7CisgICAgICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgV0xfQ01QX0RELCB3ZWJsb2dpY0NNUEREKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHdlYmxvZ2ljIGRlc2NyaXB0b3IsIHdlIHBhcnNlIHRoZSBmaWxlCisgICAgICAgICAgICAvLyBub3cgdGhhdCB3ZSBoYXZlIHRoZSBXZWJMb2dpYyBkZXNjcmlwdG9yLCB3ZSBwYXJzZSB0aGUgZmlsZQogICAgICAgICAgICAgLy8gdG8gZmluZCBvdGhlciBkZXNjcmlwdG9ycyBuZWVkZWQgdG8gZGVwbG95IHRoZSBiZWFuLgogICAgICAgICAgICAgLy8gdGhpcyBjb3VsZCBiZSB0aGUgd2VibG9naWMtY21wLXJkYm1zLnhtbCBvciBhbnkgb3RoZXIgTy9SCiAgICAgICAgICAgICAvLyBtYXBwaW5nIHRvb2wgZGVzY3JpcHRvcnMuCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEZpbGUgZWpiRGVzY3JpcHRvciA9IChGaWxlKSBlamJGaWxlcy5nZXQoTUVUQV9ESVIgKyBFSkJfREQpOworICAgICAgICAgICAgICAgIEZpbGUgZWpiRGVzY3JpcHRvciA9IGVqYkZpbGVzLmdldChNRVRBX0RJUiArIEVKQl9ERCk7CiAgICAgICAgICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhQYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogCiAgICAgICAgICAgICAgICAgc2F4UGFyc2VyRmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOwpAQCAtNDk2LDM3ICs0NjcsMjkgQEAKICAgICAgICAgICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgID0gZ2V0V2VibG9naWNEZXNjcmlwdG9ySGFuZGxlcihlamJEZXNjcmlwdG9yLmdldFBhcmVudEZpbGUoKSk7CiAKLSAgICAgICAgICAgICAgICBzYXhQYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlCi0gICAgICAgICAgICAgICAgICAgIChuZXcgRmlsZUlucHV0U3RyZWFtKHdlYmxvZ2ljREQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIpOwotCi0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIGh0ID0gaGFuZGxlci5nZXRGaWxlcygpOwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBodC5rZXlzKCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCi0gICAgICAgICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChrZXksIGh0LmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gRmlsZXMubmV3SW5wdXRTdHJlYW0od2VibG9naWNERC50b1BhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2F4UGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIGhhbmRsZXIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVyLmdldEZpbGVzKCkuZm9yRWFjaChlamJGaWxlczo6cHV0KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgYWRkaW5nIFZlbmRvciBzcGVjaWZpYyBmaWxlczogIiArIGUudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgVmVuZG9yIHNwZWNpZmljIGZpbGVzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmVuZG9yIHNwZWNpZmljIG5hbWUgb2YgdGhlIEphciB0aGF0IHdpbGwgYmUgb3V0cHV0LiBUaGUKICAgICAgKiBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGlzIGphciB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgZGVwZW5kZW50CiAgICAgICogYmVhbiBjbGFzc2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIEZpbGUgZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShTdHJpbmcgYmFzZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGdldERlc3REaXIoKSwgYmFzZU5hbWUgKyBqYXJTdWZmaXgpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogSGVscGVyIG1ldGhvZCBpbnZva2VkIGJ5IGV4ZWN1dGUoKSBmb3IgZWFjaCBXZWJMb2dpYyBqYXIgdG8gYmUgYnVpbHQuCiAgICAgICogRW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBvZiBjb25zdHJ1Y3RpbmcgYSBqYXZhIHRhc2sgZm9yIGNhbGxpbmcKQEAgLTUzNyw3ICs1MDAsNiBAQAogICAgICAqICAgICAgamFyZmlsZS4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYnVpbGRXZWJsb2dpY0phcihGaWxlIHNvdXJjZUphciwgRmlsZSBkZXN0SmFyLCBTdHJpbmcgcHVibGljSWQpIHsKLSAgICAgICAgSmF2YSBqYXZhVGFzayA9IG51bGw7CiAKICAgICAgICAgaWYgKG5vRUpCQykgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTU1NCwxNyArNTE2LDExIEBACiAgICAgICAgIFN0cmluZyBlamJjQ2xhc3NOYW1lID0gZWpiY0NsYXNzOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhVGFzayA9IG5ldyBKYXZhKGdldFRhc2soKSk7CisgICAgICAgICAgICBKYXZhIGphdmFUYXNrID0gbmV3IEphdmEoZ2V0VGFzaygpKTsKICAgICAgICAgICAgIGphdmFUYXNrLnNldFRhc2tOYW1lKCJlamJjIik7CiAKICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUp2bWFyZygpLnNldExpbmUoYWRkaXRpb25hbEp2bUFyZ3MpOwotICAgICAgICAgICAgaWYgKCEoc3lzcHJvcHMuaXNFbXB0eSgpKSkgewotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZW4gPSBzeXNwcm9wcy5lbGVtZW50cygpOyBlbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRW52aXJvbm1lbnQuVmFyaWFibGUgZW50cnkKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKEVudmlyb25tZW50LlZhcmlhYmxlKSBlbi5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5hZGRTeXNwcm9wZXJ0eShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3lzcHJvcHMuZm9yRWFjaChqYXZhVGFzazo6YWRkU3lzcHJvcGVydHkpOwogCiAgICAgICAgICAgICBpZiAoZ2V0SnZtRGVidWdMZXZlbCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVKdm1hcmcoKS5zZXRMaW5lKCIgLUR3ZWJsb2dpYy5TdGRvdXRTZXZlcml0eUxldmVsPSIgKyBqdm1EZWJ1Z0xldmVsKTsKQEAgLTU5NCwyMCArNTUwLDE4IEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1aWxkQ29tcGlsZXIKICAgICAgICAgICAgICAgICAgICAgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIpOwogCi0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkQ29tcGlsZXIgIT0gbnVsbCAmJiBidWlsZENvbXBpbGVyLmVxdWFscygiamlrZXMiKSkgeworICAgICAgICAgICAgICAgIGlmICgiamlrZXMiLmVxdWFscyhidWlsZENvbXBpbGVyKSkgewogICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWNvbXBpbGVyIik7CiAgICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCJqaWtlcyIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21waWxlci5lcXVhbHMoREVGQVVMVF9DT01QSUxFUikpIHsKLSAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoIi1jb21waWxlciIpOwotICAgICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRMaW5lKGNvbXBpbGVyKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFERUZBVUxUX0NPTVBJTEVSLmVxdWFscyhjb21waWxlcikpIHsKKyAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRWYWx1ZSgiLWNvbXBpbGVyIik7CisgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0TGluZShjb21waWxlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFBhdGggY29tYmluZWRDbGFzc3BhdGggPSBnZXRDb21iaW5lZENsYXNzcGF0aCgpOwogICAgICAgICAgICAgaWYgKHdsQ2xhc3NwYXRoICE9IG51bGwgJiYgY29tYmluZWRDbGFzc3BhdGggIT0gbnVsbAotICAgICAgICAgICAgICAgICAmJiBjb21iaW5lZENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbWJpbmVkQ2xhc3NwYXRoLnRvU3RyaW5nKCkudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY2xhc3NwYXRoIik7CiAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0UGF0aChjb21iaW5lZENsYXNzcGF0aCk7CiAgICAgICAgICAgICB9CkBAIC02MzgsMTQgKzU5MiwxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyAiICsgZWpiY0NsYXNzTmFtZQotICAgICAgICAgICAgICAgICsgIi4gRGV0YWlsczogIiArIGUudG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBjYWxsaW5nICIgKyBlamJjQ2xhc3NOYW1lCisgICAgICAgICAgICAgICAgKyAiLiBEZXRhaWxzOiAiICsgZS50b1N0cmluZygpLCBlKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogTWV0aG9kIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIHdyaXRpbmcgb2YgdGhlIEpBUiBmaWxlLiBJdGVyYXRlcyBvdmVyCiAgICAgICogdGhlIGZpbGVuYW1lcy9qYXZhLmlvLkZpbGVzIGluIHRoZSBIYXNodGFibGUgc3RvcmVkIG9uIHRoZSBpbnN0YW5jZQpAQCAtNjU2LDcgKzYwNyw4IEBACiAgICAgICogQHBhcmFtIHB1YmxpY0lkIHRoZSBpZCB0byB1c2UuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVKYXIoU3RyaW5nIGJhc2VOYW1lLCBGaWxlIGphckZpbGUsIEhhc2h0YWJsZSBmaWxlcywKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlPFN0cmluZywgRmlsZT4gZmlsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyBuZWVkIHRvIGNyZWF0ZSBhIGdlbmVyaWMgamFyIGZpcnN0LgogICAgICAgICBGaWxlIGdlbmVyaWNKYXJGaWxlID0gc3VwZXIuZ2V0VmVuZG9yT3V0cHV0SmFyRmlsZShiYXNlTmFtZSk7CkBAIC02NzMsMzggKzYyNSwzNyBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDYWxsZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgdG9vbCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiBjb25maWd1cmVkLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmVkKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudmFsaWRhdGVDb25maWd1cmVkKCk7CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRvIHNlZSBpZiBhIHdlYmxvZ2ljIEVCSjEuMSBqYXIgbmVlZHMgdG8gYmUKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRvIHNlZSBpZiBhIFdlYkxvZ2ljIEVKQiAxLjEgamFyIG5lZWRzIHRvIGJlCiAgICAgICogcmVidWlsdCB1c2luZyBlamJjLiBDYWxsZWQgZnJvbSB3cml0ZUphciBpdCBzZWVzIGlmIHRoZSAiQmVhbiIgY2xhc3NlcwogICAgICAqIGFyZSB0aGUgb25seSB0aGluZyB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgYW5kIGVpdGhlciB1cGRhdGVzIHRoZSBKYXIKLSAgICAgKiB3aXRoIHRoZSBCZWFuIGNsYXNzZmlsZSBvciByZXR1cm5zIHRydWUsIHNheWluZyB0aGF0IHRoZSB3aG9sZSB3ZWJsb2dpYwotICAgICAqIGphciBuZWVkcyB0byBiZSByZWdlbmVkIHdpdGggZWpiYy4gVGhpcyBhbGxvd3MgZmFzdGVyIGJ1aWxkIHRpbWVzIGZvcgorICAgICAqIHdpdGggdGhlIEJlYW4gY2xhc3NmaWxlIG9yIHJldHVybnMgdHJ1ZSwgc2F5aW5nIHRoYXQgdGhlIHdob2xlIFdlYkxvZ2ljCisgICAgICogamFyIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkIHdpdGggZWpiYy4gVGhpcyBhbGxvd3MgZmFzdGVyIGJ1aWxkIHRpbWVzIGZvcgogICAgICAqIHdvcmtpbmcgZGV2ZWxvcGVycy4gPHA+CiAgICAgICoKLSAgICAgKiBUaGUgd2F5IHdlYmxvZ2ljIGVqYmMgd29ya3MgaXMgaXQgY3JlYXRlcyB3cmFwcGVycyBmb3IgdGhlIHB1YmxpY2x5CisgICAgICogVGhlIHdheSBXZWJMb2dpYyBlamJjIHdvcmtzIGlzIGl0IGNyZWF0ZXMgd3JhcHBlcnMgZm9yIHRoZSBwdWJsaWNseQogICAgICAqIGRlZmluZWQgbWV0aG9kcyBhcyB0aGV5IGFyZSBleHBvc2VkIGluIHRoZSByZW1vdGUgaW50ZXJmYWNlLiBJZiB0aGUKICAgICAgKiBhY3R1YWwgYmVhbiBjaGFuZ2VzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyB0aGVuCiAgICAgICogb25seSB0aGUgYmVhbiBjbGFzc2ZpbGUgbmVlZHMgdG8gYmUgdXBkYXRlZCBhbmQgdGhlIHJlc3Qgb2YgdGhlCi0gICAgICogd2VibG9naWMgamFyIGZpbGUgY2FuIHJlbWFpbiB0aGUgc2FtZS4gSWYgdGhlIEludGVyZmFjZXMsIGllLiB0aGUKKyAgICAgKiBXZWJMb2dpYyBqYXIgZmlsZSBjYW4gcmVtYWluIHRoZSBzYW1lLiBJZiB0aGUgSW50ZXJmYWNlcywgaWUuIHRoZQogICAgICAqIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZSBvciBpZiB0aGUgeG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgY2hhbmdlZCwKICAgICAgKiB0aGUgd2hvbGUgamFyIG5lZWRzIHRvIGJlIHJlYnVpbHQgd2l0aCBlamJjLiBUaGlzIGlzIG5vdCBzdHJpY3RseSB0cnVlCiAgICAgICogZm9yIHRoZSB4bWwgZmlsZXMuIElmIHRoZSBKTkRJIG5hbWUgY2hhbmdlcyB0aGVuIHRoZSBqYXIgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYmUgcmVidWlsZCwgYnV0IGlmIHRoZSByZXNvdXJjZXMgcmVmZXJlbmNlcyBjaGFuZ2UgdGhlbiBpdCBkb2VzLiBBdAotICAgICAqIHRoaXMgcG9pbnQgdGhlIHdlYmxvZ2ljIGphciBnZXRzIHJlYnVpbHQgaWYgdGhlIHhtbCBmaWxlcyBjaGFuZ2UgYXQKKyAgICAgKiB0aGlzIHBvaW50IHRoZSBXZWJMb2dpYyBqYXIgZ2V0cyByZWJ1aWx0IGlmIHRoZSB4bWwgZmlsZXMgY2hhbmdlIGF0CiAgICAgICogYWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGdlbmVyaWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgZ2VuZXJpYyBqYXIgZmlsZS4KLSAgICAgKiBAcGFyYW0gd2VibG9naWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgd2VibG9naWMgamFyIGZpbGUgdG8gY2hlY2sgdG8KKyAgICAgKiBAcGFyYW0gd2VibG9naWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgV2ViTG9naWMgamFyIGZpbGUgdG8gY2hlY2sgdG8KICAgICAgKiAgICAgIHNlZSBpZiBpdCBuZWVkcyB0byBiZSByZWJ1aWx0LgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgamFyIG5lZWRzIHRvIGJlIHJlYnVpbHQuCiAgICAgICovCkBAIC03MjEsODYgKzY3Miw3MCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbG9nKCJDaGVja2luZyBpZiB3ZWJsb2dpYyBKYXIgbmVlZHMgdG8gYmUgcmVidWlsdCBmb3IgamFyICIgKyB3ZWJsb2dpY0phckZpbGUuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgLy8gT25seSBnbyBmb3J3YXJkIGlmIHRoZSBnZW5lcmljIGFuZCB0aGUgd2VibG9naWMgZmlsZSBib3RoIGV4aXN0CisgICAgICAgICAgICAvLyBPbmx5IGdvIGZvcndhcmQgaWYgdGhlIGdlbmVyaWMgYW5kIHRoZSBXZWJMb2dpYyBmaWxlIGJvdGggZXhpc3QKICAgICAgICAgICAgIGlmIChnZW5lcmljSmFyRmlsZS5leGlzdHMoKSAmJiBnZW5lcmljSmFyRmlsZS5pc0ZpbGUoKQogICAgICAgICAgICAgICAgICAmJiB3ZWJsb2dpY0phckZpbGUuZXhpc3RzKCkgJiYgd2VibG9naWNKYXJGaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICAgICAgLy9vcGVuIGphciBmaWxlcwogICAgICAgICAgICAgICAgIGdlbmVyaWNKYXIgPSBuZXcgSmFyRmlsZShnZW5lcmljSmFyRmlsZSk7CiAgICAgICAgICAgICAgICAgd2xKYXIgPSBuZXcgSmFyRmlsZSh3ZWJsb2dpY0phckZpbGUpOwogCi0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIGdlbmVyaWNFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSB3bEVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIHJlcGxhY2VFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEphckVudHJ5PiByZXBsYWNlRW50cmllcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBsaXN0IG9mIGdlbmVyaWMgamFyIGVudHJpZXMKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZW5lcmljSmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSAoSmFyRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBKYXJFbnRyeT4gZ2VuZXJpY0VudHJpZXMgPSBnZW5lcmljSmFyLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGplIC0+IGplLmdldE5hbWUoKS5yZXBsYWNlKCdcXCcsICcvJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplIC0+IGplLCAoYSwgYikgLT4gYikpOworICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBXZWJMb2dpYyBqYXIgZW50cmllcworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEphckVudHJ5PiB3bEVudHJpZXMgPSB3bEphci5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoWmlwRW50cnk6OmdldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBqZSAtPiBqZSwgKGEsIGIpIC0+IGIpKTsKIAotICAgICAgICAgICAgICAgICAgICBnZW5lcmljRW50cmllcy5wdXQoamUuZ2V0TmFtZSgpLnJlcGxhY2UoJ1xcJywgJy8nKSwgamUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL2dldCB0aGUgbGlzdCBvZiB3ZWJsb2dpYyBqYXIgZW50cmllcwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHdsSmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSAoSmFyRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICB3bEVudHJpZXMucHV0KGplLmdldE5hbWUoKSwgamUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vQ3ljbGUgVGhyb3VnaCBnZW5lcmljIGFuZCBtYWtlIHN1cmUgaXRzIGluIHdlYmxvZ2ljCisgICAgICAgICAgICAgICAgLy8gQ3ljbGUgdGhyb3VnaCBnZW5lcmljIGFuZCBtYWtlIHN1cmUgaXRzIGluIFdlYkxvZ2ljCiAgICAgICAgICAgICAgICAgZ2VuZXJpY0xvYWRlciA9IGdldENsYXNzTG9hZGVyRnJvbUphcihnZW5lcmljSmFyRmlsZSk7CiAKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZW5lcmljRW50cmllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlcGF0aCA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAod2xFbnRyaWVzLmNvbnRhaW5zS2V5KGZpbGVwYXRoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsZSBuYW1lL3BhdGggbWF0Y2gKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZmlsZXMgc2VlIGlmIHNhbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGdlbmVyaWNFbnRyeSA9IChKYXJFbnRyeSkgZ2VuZXJpY0VudHJpZXMuZ2V0KGZpbGVwYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IHdsRW50cnkgPSAoSmFyRW50cnkpIHdsRW50cmllcy5nZXQoZmlsZXBhdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGdlbmVyaWNFbnRyeS5nZXRDcmMoKSAhPSB3bEVudHJ5LmdldENyYygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChnZW5lcmljRW50cnkuZ2V0U2l6ZSgpICE9IHdsRW50cnkuZ2V0U2l6ZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBhcmUgZGlmZmVyZW50IHNlZSBpZiBpdHMgYW4gb2JqZWN0IG9yIGFuIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdlbmVyaWNFbnRyeS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCAnLicpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgZ2VuY2xhc3MgPSBnZW5lcmljTG9hZGVyLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5jbGFzcy5pc0ludGVyZmFjZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVyZmFjZSBjaGFuZ2VkICAgcmVidWlsZCBqYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkludGVyZmFjZSAiICsgZ2VuY2xhc3MuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PYmplY3QgY2xhc3MgQ2hhbmdlZCAgIHVwZGF0ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VFbnRyaWVzLnB1dChmaWxlcGF0aCwgZ2VuZXJpY0VudHJ5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIGl0IHRoZSBtYW5pZmVzdC4gSWYgc28gaWdub3JlIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5lcXVhbHMoIk1FVEEtSU5GL01BTklGRVNULk1GIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBvdGhlciB0aGVuIGNsYXNzIGNoYW5nZWQgICByZWJ1aWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5vbiBjbGFzcyBmaWxlICIgKyBnZW5lcmljRW50cnkuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVwYXRoIDogZ2VuZXJpY0VudHJpZXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF3bEVudHJpZXMuY29udGFpbnNLZXkoZmlsZXBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZpbGUgZG9lc24ndCBleGlzdCByZWJ1aWxkCi0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZXBhdGggKyAiIG5vdCBwcmVzZW50IGluIHdlYmxvZ2ljIGphciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZS9wYXRoIG1hdGNoCisgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZpbGVzIHNlZSBpZiBzYW1lCisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGdlbmVyaWNFbnRyeSA9IGdlbmVyaWNFbnRyaWVzLmdldChmaWxlcGF0aCk7CisgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IHdsRW50cnkgPSB3bEVudHJpZXMuZ2V0KGZpbGVwYXRoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpY0VudHJ5LmdldENyYygpICE9IHdsRW50cnkuZ2V0Q3JjKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdlbmVyaWNFbnRyeS5nZXRTaXplKCkgIT0gd2xFbnRyeS5nZXRTaXplKCkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaWxlIGFyZSBkaWZmZXJlbnQgc2VlIGlmIGl0cyBhbiBvYmplY3Qgb3IgYW4gaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IGdlbmVyaWNFbnRyeS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCAnLicpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnN1YnN0cmluZygwLCBjbGFzc25hbWUubGFzdEluZGV4T2YoIi5jbGFzcyIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGdlbmNsYXNzID0gZ2VuZXJpY0xvYWRlci5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZW5jbGFzcy5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZXJmYWNlIGNoYW5nZWQgICByZWJ1aWxkIGphci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJJbnRlcmZhY2UgIiArIGdlbmNsYXNzLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9PYmplY3QgY2xhc3MgQ2hhbmdlZCAgIHVwZGF0ZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlRW50cmllcy5wdXQoZmlsZXBhdGgsIGdlbmVyaWNFbnRyeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFnZW5lcmljRW50cnkuZ2V0TmFtZSgpLmVxdWFscygiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IGlzIG5vdCB0aGUgbWFuaWZlc3QsIG90aGVyd2lzZSB3ZSdkIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgb3RoZXIgdGhlbiBjbGFzcyBjaGFuZ2VkICAgcmVidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTm9uIGNsYXNzIGZpbGUgIiArIGdlbmVyaWNFbnRyeS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGhhcyBjaGFuZ2VkIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoIXJlYnVpbGQpIHsKQEAgLTgxMCwxNiArNzQ1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdXTEphckZpbGUuZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ld1dMSmFyRmlsZSkpOworICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbShuZXdXTEphckZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnNldExldmVsKDApOwogCi0gICAgICAgICAgICAgICAgICAgIC8vQ29weSBmaWxlcyBmcm9tIG9sZCB3ZWJsb2dpYyBqYXIKLSAgICAgICAgICAgICAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gd2xFbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBqZSA9IChKYXJFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgZmlsZXMgZnJvbSBvbGQgV2ViTG9naWMgamFyCisgICAgICAgICAgICAgICAgICAgIGZvciAoSmFyRW50cnkgamUgOiB3bEVudHJpZXMudmFsdWVzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IC0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgamUuZ2V0Q29tcHJlc3NlZFNpemUoKSA9PSBqZS5nZXRTaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0uc2V0TGV2ZWwoMCk7CkBAIC04MjcsMjAgKzc1NywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbChKQVJfQ09NUFJFU1NfTEVWRUwpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpczsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGNoYW5nZWQgQmVhbiBjbGFzcwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VFbnRyaWVzLmNvbnRhaW5zS2V5KGplLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlVwZGF0aW5nIEJlYW4gY2xhc3MgZnJvbSBnZW5lcmljIEphciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgamUuZ2V0TmFtZSgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGVudHJ5IGZyb20gdGhlIGdlbmVyaWMgamFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgamUgPSAoSmFyRW50cnkpIHJlcGxhY2VFbnRyaWVzLmdldChqZS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplID0gcmVwbGFjZUVudHJpZXMuZ2V0KGplLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSBnZW5lcmljSmFyLmdldElucHV0U3RyZWFtKGplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgZmxlIGZyb20gb3JpZ2luYWwgd2VibG9naWMgamFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2UgZmlsZSBmcm9tIG9yaWdpbmFsIFdlYkxvZ2ljIGphcgogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgPSB3bEphci5nZXRJbnB1dFN0cmVhbShqZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0ucHV0TmV4dEVudHJ5KG5ldyBKYXJFbnRyeShqZS5nZXROYW1lKCkpKTsKIAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0RFRkFVTFRfQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZDsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaXMucmVhZChidWZmZXIpKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC04NjYsMjQgKzc5OSwxMCBAQAogCiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgLy8gbmVlZCB0byBjbG9zZSBmaWxlcyBhbmQgcGVyaGFwcyByZW5hbWUgb3V0cHV0Ci0gICAgICAgICAgICBpZiAoZ2VuZXJpY0phciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0phci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGVtcHR5Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod2xKYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHdsSmFyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZW1wdHkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShnZW5lcmljSmFyKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3bEphcik7CiAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UobmV3SmFyU3RyZWFtKTsKKwogICAgICAgICAgICAgaWYgKG5ld0phclN0cmVhbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZW5hbWUobmV3V0xKYXJGaWxlLCB3ZWJsb2dpY0phckZpbGUpOwpAQCAtODkyLDEzICs4MTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdlbmVyaWNMb2FkZXIgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIGdlbmVyaWNMb2FkZXIgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgaWYgKGdlbmVyaWNMb2FkZXIgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcikgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAgICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gKEFudENsYXNzTG9hZGVyKSBnZW5lcmljTG9hZGVyOwogICAgICAgICAgICAgICAgIGxvYWRlci5jbGVhbnVwKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gcmVidWlsZDsKICAgICB9CiAKQEAgLTkyMSw3ICs4MzksNiBAQAogICAgICAgICBpZiAoY2xhc3NwYXRoICE9IG51bGwpIHsKICAgICAgICAgICAgIGxvb2t1cFBhdGguYXBwZW5kKGNsYXNzcGF0aCk7CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gZ2V0VGFzaygpLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihsb29rdXBQYXRoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IDA3NTJiYmUuLjA1NzFmODQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJsb2dpY1RPUExpbmtEZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsNyArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiAKIC8qKgotICogRGVwbG95bWVudCB0b29sIGZvciBXZWJsb2dpYyBUT1BMaW5rLgorICogRGVwbG95bWVudCB0b29sIGZvciBXZWJMb2dpYyBUT1BMaW5rLgogICovCiBwdWJsaWMgY2xhc3MgV2VibG9naWNUT1BMaW5rRGVwbG95bWVudFRvb2wgZXh0ZW5kcyBXZWJsb2dpY0RlcGxveW1lbnRUb29sIHsKIApAQCAtNjIsMTQgKzYyLDE3IEBACiAgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGZpbGUuCiAgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBoYW5kbGVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBEZXNjcmlwdG9ySGFuZGxlciBnZXREZXNjcmlwdG9ySGFuZGxlcihGaWxlIHNyY0RpcikgewogICAgICAgICBEZXNjcmlwdG9ySGFuZGxlciBoYW5kbGVyID0gc3VwZXIuZ2V0RGVzY3JpcHRvckhhbmRsZXIoc3JjRGlyKTsKICAgICAgICAgaWYgKHRvcGxpbmtEVEQgIT0gbnVsbCkgewotICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURCgiLS8vVGhlIE9iamVjdCBQZW9wbGUsIEluYy4vLyIKLSAgICAgICAgICAgICAgICArICJEVEQgVE9QTGluayBmb3IgV2ViTG9naWMgQ01QIDIuNS4xLy9FTiIsIHRvcGxpbmtEVEQpOworICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURCgKKyAgICAgICAgICAgICAgICAiLS8vVGhlIE9iamVjdCBQZW9wbGUsIEluYy4vL0RURCBUT1BMaW5rIGZvciBXZWJMb2dpYyBDTVAgMi41LjEvL0VOIiwKKyAgICAgICAgICAgICAgICB0b3BsaW5rRFREKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoIi0vL1RoZSBPYmplY3QgUGVvcGxlLCBJbmMuLy8iCi0gICAgICAgICAgICAgICAgKyAiRFREIFRPUExpbmsgZm9yIFdlYkxvZ2ljIENNUCAyLjUuMS8vRU4iLCBUTF9EVERfTE9DKTsKKyAgICAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoCisgICAgICAgICAgICAgICAgIi0vL1RoZSBPYmplY3QgUGVvcGxlLCBJbmMuLy9EVEQgVE9QTGluayBmb3IgV2ViTG9naWMgQ01QIDIuNS4xLy9FTiIsCisgICAgICAgICAgICAgICAgVExfRFREX0xPQyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CiAgICAgfQpAQCAtODAsMjEgKzgzLDIwIEBACiAgICAgICogQHBhcmFtIGVqYkZpbGVzIHRoZSBoYXNodGFibGUgdG8gYWRkIGZpbGVzIHRvLgogICAgICAqIEBwYXJhbSBkZFByZWZpeCB0aGUgcHJlZml4IHRvIHVzZS4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGUgZWpiRmlsZXMsIFN0cmluZyBkZFByZWZpeCkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZFZlbmRvckZpbGVzKEhhc2h0YWJsZTxTdHJpbmcsIEZpbGU+IGVqYkZpbGVzLCBTdHJpbmcgZGRQcmVmaXgpIHsKICAgICAgICAgc3VwZXIuYWRkVmVuZG9yRmlsZXMoZWpiRmlsZXMsIGRkUHJlZml4KTsKICAgICAgICAgLy8gVGhlbiB0aGUgdG9wbGluayBkZXBsb3ltZW50IGRlc2NyaXB0b3IKIAogICAgICAgICAvLyBTZXR1cCBhIG5hbWluZyBzdGFuZGFyZCBoZXJlPy4KIAotCiAgICAgICAgIEZpbGUgdG9wbGlua0REID0gbmV3IEZpbGUoZ2V0Q29uZmlnKCkuZGVzY3JpcHRvckRpciwgZGRQcmVmaXggKyB0b3BsaW5rRGVzY3JpcHRvcik7CiAKICAgICAgICAgaWYgKHRvcGxpbmtERC5leGlzdHMoKSkgewogICAgICAgICAgICAgZWpiRmlsZXMucHV0KE1FVEFfRElSICsgdG9wbGlua0Rlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGlua0REKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSB0b3BsaW5rIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gIgotICAgICAgICAgICAgICAgICsgIkl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgdG9wbGluayBkZXBsb3ltZW50IGRlc2NyaXB0b3IuIEl0IHdhcyBleHBlY3RlZCB0byBiZSBpbiAiCiAgICAgICAgICAgICAgICAgKyB0b3BsaW5rREQuZ2V0UGF0aCgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwMywxMSArMTA1LDEyIEBACiAgICAgICogQ2FsbGVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIHRvb2wgcGFyYW1ldGVycyBoYXZlIGJlZW4gY29uZmlndXJlZC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJlZCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnZhbGlkYXRlQ29uZmlndXJlZCgpOwogICAgICAgICBpZiAodG9wbGlua0Rlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgdG9wbGlua2Rlc2NyaXB0b3IgYXR0cmlidXRlIG11c3QgIgotICAgICAgICAgICAgICAgICsgImJlIHNwZWNpZmllZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgdG9wbGlua2Rlc2NyaXB0b3IgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkIik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9lamIvV2Vic3BoZXJlRGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJzcGhlcmVEZXBsb3ltZW50VG9vbC5qYXZhCmluZGV4IDUyNjY4YmQuLjgyMDA2MDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJzcGhlcmVEZXBsb3ltZW50VG9vbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2VqYi9XZWJzcGhlcmVEZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTUgKzE4LDE3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmVqYjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTM3LDkgKzM5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogLyoqCi0gKiBXZWJzcGhlcmUgZGVwbG95bWVudCB0b29sIHRoYXQgYXVnbWVudHMgdGhlIGVqYmphciB0YXNrLgotICogU2VhcmNoZXMgZm9yIHRoZSB3ZWJzcGhlcmUgc3BlY2lmaWMgZGVwbG95bWVudCBkZXNjcmlwdG9ycyBhbmQKLSAqIGFkZHMgdGhlbSB0byB0aGUgZmluYWwgZWpiIGphciBmaWxlLiBXZWJzcGhlcmUgaGFzIHR3byBzcGVjaWZpYyBkZXNjcmlwdG9ycyBmb3Igc2Vzc2lvbgorICogV2ViU3BoZXJlIGRlcGxveW1lbnQgdG9vbCB0aGF0IGF1Z21lbnRzIHRoZSBlamJqYXIgdGFzay4KKyAqIFNlYXJjaGVzIGZvciB0aGUgV2ViU3BoZXJlIHNwZWNpZmljIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgYW5kCisgKiBhZGRzIHRoZW0gdG8gdGhlIGZpbmFsIGVqYiBqYXIgZmlsZS4gV2ViU3BoZXJlIGhhcyB0d28gc3BlY2lmaWMgZGVzY3JpcHRvcnMgZm9yIHNlc3Npb24KICAqIGJlYW5zOgogICogPHVsPgogICogICAgPGxpPmlibS1lamItamFyLWJuZC54bWk8L2xpPgpAQCAtNTMsNyArNTUsNyBAQAogICogSW4gdGVybXMgb2YgV2ViU3BoZXJlLCB0aGUgZ2VuZXJhdGlvbiBvZiBjb250YWluZXIgY29kZSBhbmQgc3R1YnMgaXMKICAqIGNhbGxlZCA8Y29kZT5kZXBsb3ltZW50PC9jb2RlPi4gVGhpcyBzdGVwIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIHdlYnNwaGVyZQogICogZWxlbWVudCBhcyBwYXJ0IG9mIHRoZSBqYXIgZ2VuZXJhdGlvbiBwcm9jZXNzLiBJZiB0aGUgc3dpdGNoCi0gKiA8Y29kZT5lamJkZXBsb3k8L2NvZGU+IGlzIG9uLCB0aGUgZWpiZGVwbG95IHRvb2wgZnJvbSB0aGUgd2Vic3BoZXJlIHRvb2xzZXQKKyAqIDxjb2RlPmVqYmRlcGxveTwvY29kZT4gaXMgb24sIHRoZSBlamJkZXBsb3kgdG9vbCBmcm9tIHRoZSBXZWJTcGhlcmUgdG9vbHNldAogICogaXMgY2FsbGVkIGZvciBldmVyeSBlamItamFyLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIHN0ZXAgb25seSB3b3JrcywgaWYgeW91CiAgKiB1c2UgdGhlIGlibSBqZGsuIE90aGVyd2lzZSwgdGhlIHJtaWMgKGNhbGxlZCBieSBlamJkZXBsb3kpIHRocm93cyBhCiAgKiBDbGFzc0Zvcm1hdEVycm9yLiBCZSBzdXJlIHRvIHN3aXRjaCBlamJkZXBsb3kgb2ZmLCBpZiBydW4gYW50IHdpdGgKQEAgLTc4LDcgKzgwLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwogCi0gICAgLyoqIEluc3RhbmNlIHZhcmlhYmxlIHRoYXQgc3RvcmVzIHRoZSBzdWZmaXggZm9yIHRoZSB3ZWJzcGhlcmUgamFyZmlsZS4gKi8KKyAgICAvKiogSW5zdGFuY2UgdmFyaWFibGUgdGhhdCBzdG9yZXMgdGhlIHN1ZmZpeCBmb3IgdGhlIFdlYlNwaGVyZSBqYXJmaWxlLiAqLwogICAgIHByaXZhdGUgU3RyaW5nIGphclN1ZmZpeCA9ICIuamFyIjsKIAogICAgIC8qKiBJbnN0YW5jZSB2YXJpYWJsZSB0aGF0IHN0b3JlcyB0aGUgbG9jYXRpb24gb2YgdGhlIGVqYiAxLjEgRFREIGZpbGUuICovCkBAIC05NSw3ICs5Nyw3IEBACiAgICAgLyoqIEluZGljYXRlcyBpZiB0aGUgb2xkIENNUCBsb2NhdGlvbiBjb252ZW50aW9uIGlzIHRvIGJlIHVzZWQuICovCiAgICAgcHJpdmF0ZSBib29sZWFuIG5ld0NNUCA9IGZhbHNlOwogCi0gICAgLyoqIFRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYnNwaGVyZSBjbGFzc2VzLiAqLworICAgIC8qKiBUaGUgY2xhc3NwYXRoIHRvIHRoZSBXZWJTcGhlcmUgY2xhc3Nlcy4gKi8KICAgICBwcml2YXRlIFBhdGggd2FzQ2xhc3NwYXRoID0gbnVsbDsKIAogICAgIC8qKiBUaGUgREIgVmVuZG9yIG5hbWUsIHRoZSBFSkIgaXMgcGVyc2lzdGVkIGFnYWluc3QgKi8KQEAgLTEzNCwxMiArMTM2LDEyIEBACiAgICAgLyoqIHRoZSBzY3JhdGNoZGlyIGZvciB0aGUgZWpiZGVwbG95IG9wZXJhdGlvbiAqLwogICAgIHByaXZhdGUgU3RyaW5nIHRlbXBkaXIgPSAiX2VqYmRlcGxveV90ZW1wIjsKIAotICAgIC8qKiB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIHdlYnNwaGVyZSAqLworICAgIC8qKiB0aGUgaG9tZSBkaXJlY3RvcnkgZm9yIFdlYlNwaGVyZSAqLwogICAgIHByaXZhdGUgRmlsZSB3ZWJzcGhlcmVIb21lOwogCiAgICAgLyoqCi0gICAgICogR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGhzLgotICAgICAqIEByZXR1cm4gdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGguCisgICAgICogR2V0IHRoZSBjbGFzc3BhdGggdG8gdGhlIFdlYlNwaGVyZSBjbGFzc3BhdGhzLgorICAgICAqIEByZXR1cm4gdGhlIFdlYlNwaGVyZSBjbGFzc3BhdGguCiAgICAgICovCiAgICAgcHVibGljIFBhdGggY3JlYXRlV0FTQ2xhc3NwYXRoKCkgewogICAgICAgICBpZiAod2FzQ2xhc3NwYXRoID09IG51bGwpIHsKQEAgLTE0OCwxNiArMTUwLDE0IEBACiAgICAgICAgIHJldHVybiB3YXNDbGFzc3BhdGguY3JlYXRlUGF0aCgpOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB3ZWJzcGhlcmUgY2xhc3NwYXRoLgotICAgICAqIEBwYXJhbSB3YXNDbGFzc3BhdGggdGhlIHdlYnNwaGVyZSBjbGFzc3BhdGguCisgICAgICogU2V0IHRoZSBXZWJTcGhlcmUgY2xhc3NwYXRoLgorICAgICAqIEBwYXJhbSB3YXNDbGFzc3BhdGggdGhlIFdlYlNwaGVyZSBjbGFzc3BhdGguCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0V0FTQ2xhc3NwYXRoKFBhdGggd2FzQ2xhc3NwYXRoKSB7CiAgICAgICAgIHRoaXMud2FzQ2xhc3NwYXRoID0gd2FzQ2xhc3NwYXRoOwogICAgIH0KIAotCiAgICAgLyoqIFNldHMgdGhlIERCIFZlbmRvciBmb3IgdGhlIEVudGl0eSBCZWFuIG1hcHBpbmc7IG9wdGlvbmFsLgogICAgICAqIDxwPgogICAgICAqIFZhbGlkIG9wdGlvbnMgY2FuIGJlIG9idGFpbmVkIGJ5IHJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kOgpAQCAtMTc3LDcgKzE3Nyw2IEBACiAgICAgICAgIHRoaXMuZGJWZW5kb3IgPSBkYnZlbmRvcjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIERhdGFiYXNlIHRvIGNyZWF0ZTsgb3B0aW9uYWwuCiAgICAgICoKQEAgLTE4Nyw3ICsxODYsNiBAQAogICAgICAgICB0aGlzLmRiTmFtZSA9IGRiTmFtZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSB0byBjcmVhdGU7IG9wdGlvbmFsLgogICAgICAqCkBAIC0xOTcsNyArMTk1LDYgQEAKICAgICAgICAgdGhpcy5kYlNjaGVtYSA9IGRiU2NoZW1hOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRmxhZywgZGVmYXVsdCBmYWxzZSwgdG8gb25seSBnZW5lcmF0ZSB0aGUgZGVwbG95bWVudAogICAgICAqIGNvZGUsIGRvIG5vdCBydW4gUk1JQyBvciBKYXZhYwpAQCAtMjA4LDcgKzIwNSw2IEBACiAgICAgICAgIHRoaXMuY29kZWdlbiA9IGNvZGVnZW47CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBGbGFnLCBkZWZhdWx0IHRydWUsIHRvIG9ubHkgb3V0cHV0IGVycm9yIG1lc3NhZ2VzLgogICAgICAqCkBAIC0yMTgsNyArMjE0LDYgQEAKICAgICAgICAgdGhpcy5xdWlldCA9IHF1aWV0OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBkaXNhYmxlIHRoZSB2YWxpZGF0aW9uIHN0ZXBzOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KICAgICAgKgpAQCAtMjI4LDcgKzIyMyw2IEBACiAgICAgICAgIHRoaXMubm92YWxpZGF0ZSA9IG5vdmFsaWRhdGU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBGbGFnIHRvIGRpc2FibGUgd2FybmluZyBhbmQgaW5mb3JtYXRpb25hbCBtZXNzYWdlczsgb3B0aW9uYWwsIGRlZmF1bHQgZmFsc2UuCiAgICAgICoKQEAgLTIzOCw3ICsyMzIsNiBAQAogICAgICAgICB0aGlzLm5vd2FybiA9IG5vd2FybjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEZsYWcgdG8gZGlzYWJsZSBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzOyBvcHRpb25hbCwgZGVmYXVsdCBmYWxzZS4KICAgICAgKgpAQCAtMjQ4LDcgKzI0MSw2IEBACiAgICAgICAgIHRoaXMubm9pbmZvcm0gPSBub2luZm9ybTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEZsYWcgdG8gZW5hYmxlIGludGVybmFsIHRyYWNpbmcgd2hlbiBzZXQsIG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgogICAgICAqCkBAIC0yNzYsNyArMjY4LDYgQEAKICAgICAgICAgdXNlMzVNYXBwaW5nUnVsZXMgPSBhdHRyOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSByZWJ1aWxkIGZsYWcgdG8gZmFsc2UgdG8gb25seSB1cGRhdGUgY2hhbmdlcyBpbiB0aGUgamFyIHJhdGhlcgogICAgICAqIHRoYW4gcmVydW5uaW5nIGVqYmRlcGxveTsgb3B0aW9uYWwsIGRlZmF1bHQgdHJ1ZS4KQEAgLTI4Niw3ICsyNzcsNiBAQAogICAgICAgICB0aGlzLmFsd2F5c1JlYnVpbGQgPSByZWJ1aWxkOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU3RyaW5nIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBiYXNlbmFtZSBvZiB0aGUgZGVwbG95bWVudAogICAgICAqIGRlc2NyaXB0b3IgdG8gY3JlYXRlIHRoZSBmaWxlbmFtZSBvZiB0aGUgV2ViTG9naWMgRUpCCkBAIC0yOTcsNyArMjg3LDYgQEAKICAgICAgICAgdGhpcy5qYXJTdWZmaXggPSBpblN0cmluZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFRoaXMgY29udHJvbHMgd2hldGhlciB0aGUgZ2VuZXJpYyBmaWxlIHVzZWQgYXMgaW5wdXQgdG8KICAgICAgKiBlamJkZXBsb3kgaXMgcmV0YWluZWQ7IG9wdGlvbmFsLCBkZWZhdWx0IGZhbHNlLgpAQCAtMzA3LDcgKzI5Niw2IEBACiAgICAgICAgIHRoaXMua2VlcEdlbmVyaWMgPSBpblZhbHVlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogRGVjaWRlLCB3aGV0aGVyIGVqYmRlcGxveSBzaG91bGQgYmUgY2FsbGVkIG9yIG5vdDsKICAgICAgKiBvcHRpb25hbCwgZGVmYXVsdCB0cnVlLgpAQCAtMzE4LDcgKzMwNiw2IEBACiAgICAgICAgIHRoaXMuZWpiZGVwbG95ID0gZWpiZGVwbG95OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0dGVyIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBTdW4ncyBHZW5lcmljIEVKQiBEVEQuIFRoaXMKICAgICAgKiBjYW4gYmUgYSBmaWxlIG9uIHRoZSBzeXN0ZW0gb3IgYSByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgpAQCAtMzI5LDcgKzMxNiw2IEBACiAgICAgICAgIHRoaXMuZWpiMTFEVEQgPSBpblN0cmluZzsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIG9sZENNUCBzY2hlbWUuIFRoaXMgaXMgYW4gYW50b255bSBmb3IgbmV3Q01QCiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgpAQCAtMzM5LDEzICszMjUsMTIgQEAKICAgICAgICAgdGhpcy5uZXdDTVAgPSAhb2xkQ01QOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgbmV3Q01QIHNjaGVtZS4gVGhlIG9sZCBDTVAgc2NoZW1lIGxvY2F0ZXMgdGhlCi0gICAgICogd2Vic3BoZXJlIENNUCBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBuYW1pbmcgY29udmVudGlvbiB3aGVyZSB0aGUKLSAgICAgKiB3ZWJzcGhlcmUgQ01QIGZpbGUgaXMgZXhwZWN0ZWQgdG8gYmUgbmFtZWQgd2l0aCB0aGUgYmVhbiBuYW1lIGFzIHRoZQorICAgICAqIFdlYlNwaGVyZSBDTVAgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgbmFtaW5nIGNvbnZlbnRpb24gd2hlcmUgdGhlCisgICAgICogV2ViU3BoZXJlIENNUCBmaWxlIGlzIGV4cGVjdGVkIHRvIGJlIG5hbWVkIHdpdGggdGhlIGJlYW4gbmFtZSBhcyB0aGUKICAgICAgKiBwcmVmaXguIFVuZGVyIHRoaXMgc2NoZW1lIHRoZSBuYW1lIG9mIHRoZSBDTVAgZGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaAotICAgICAqIHRoZSBuYW1lIGFjdHVhbGx5IHVzZWQgaW4gdGhlIG1haW4gd2Vic3BoZXJlIEVKQiBkZXNjcmlwdG9yLiBBbHNvLAorICAgICAqIHRoZSBuYW1lIGFjdHVhbGx5IHVzZWQgaW4gdGhlIG1haW4gV2ViU3BoZXJlIEVKQiBkZXNjcmlwdG9yLiBBbHNvLAogICAgICAqIGRlc2NyaXB0b3JzIHdoaWNoIGNvbnRhaW4gbXVsdGlwbGUgQ01QIHJlZmVyZW5jZXMgY291bGQgbm90IGJlIHVzZWQuCiAgICAgICogQHBhcmFtIG5ld0NNUCBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgogICAgICAqLwpAQCAtMzUzLDcgKzMzOCw2IEBACiAgICAgICAgIHRoaXMubmV3Q01QID0gbmV3Q01QOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGhlIGRpcmVjdG9yeSwgd2hlcmUgZWpiZGVwbG95IHdpbGwgd3JpdGUgdGVtcG9yYXJ5IGZpbGVzOwogICAgICAqIG9wdGlvbmFsLCBkZWZhdWx0cyB0byAnX2VqYmRlcGxveV90ZW1wJy4KQEAgLTM2MywyNCArMzQ3LDE4IEBACiAgICAgICAgIHRoaXMudGVtcGRpciA9IHRlbXBkaXI7CiAgICAgfQogCi0KICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvckhhbmRsZXIgZ2V0RGVzY3JpcHRvckhhbmRsZXIoRmlsZSBzcmNEaXIpIHsKICAgICAgICAgRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA9IG5ldyBEZXNjcmlwdG9ySGFuZGxlcihnZXRUYXNrKCksIHNyY0Rpcik7CiAgICAgICAgIC8vIHJlZ2lzdGVyIGFsbCB0aGUgRFREcywgYm90aCB0aGUgb25lcyB0aGF0IGFyZSBrbm93biBhbmQKICAgICAgICAgLy8gYW55IHN1cHBsaWVkIGJ5IHRoZSB1c2VyCiAgICAgICAgIGhhbmRsZXIucmVnaXN0ZXJEVEQoUFVCTElDSURfRUpCMTEsIGVqYjExRFREKTsKIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQotCisgICAgICAgIGdldENvbmZpZygpLmR0ZExvY2F0aW9ucy5mb3JFYWNoKGwgLT4gaGFuZGxlci5yZWdpc3RlckRURChsLmdldFB1YmxpY0lkKCksIGwuZ2V0TG9jYXRpb24oKSkpOwogICAgICAgICByZXR1cm4gaGFuZGxlcjsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEdldCBhIGRlc2NyaXB0aW9uIGhhbmRsZXIuCiAgICAgICogQHBhcmFtIHNyY0RpciB0aGUgc291cmNlIGRpcmVjdG9yeS4KQEAgLTM4OSwxNSArMzY3LDEyIEBACiAgICAgcHJvdGVjdGVkIERlc2NyaXB0b3JIYW5kbGVyIGdldFdlYnNwaGVyZURlc2NyaXB0b3JIYW5kbGVyKGZpbmFsIEZpbGUgc3JjRGlyKSB7CiAgICAgICAgIERlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIgPQogICAgICAgICAgICAgbmV3IERlc2NyaXB0b3JIYW5kbGVyKGdldFRhc2soKSwgc3JjRGlyKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnQoKSB7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKIAotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBFamJKYXIuRFRETG9jYXRpb24gZHRkTG9jYXRpb24gPSAoRWpiSmFyLkRURExvY2F0aW9uKSBpLm5leHQoKTsKLQotICAgICAgICAgICAgaGFuZGxlci5yZWdpc3RlckRURChkdGRMb2NhdGlvbi5nZXRQdWJsaWNJZCgpLCBkdGRMb2NhdGlvbi5nZXRMb2NhdGlvbigpKTsKLSAgICAgICAgfQorICAgICAgICBnZXRDb25maWcoKS5kdGRMb2NhdGlvbnMuZm9yRWFjaChsIC0+IGhhbmRsZXIucmVnaXN0ZXJEVEQobC5nZXRQdWJsaWNJZCgpLCBsLmdldExvY2F0aW9uKCkpKTsKICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CiAgICAgfQogCkBAIC00MDcsOSArMzgyLDEwIEBACiAgICAgICogQHBhcmFtIGVqYkZpbGVzIGEgaGFzaHRhYmxlIGVudHJ5bmFtZSAtJmd0OyBmaWxlLgogICAgICAqIEBwYXJhbSBiYXNlTmFtZSBhIHByZWZpeCB0byB1c2UuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmVuZG9yRmlsZXMoSGFzaHRhYmxlIGVqYkZpbGVzLCBTdHJpbmcgYmFzZU5hbWUpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRWZW5kb3JGaWxlcyhIYXNodGFibGU8U3RyaW5nLCBGaWxlPiBlamJGaWxlcywgU3RyaW5nIGJhc2VOYW1lKSB7CiAKLSAgICAgICAgU3RyaW5nIGRkUHJlZml4ID0gKHVzaW5nQmFzZUphck5hbWUoKSA/ICIiIDogYmFzZU5hbWUpOworICAgICAgICBTdHJpbmcgZGRQcmVmaXggPSB1c2luZ0Jhc2VKYXJOYW1lKCkgPyAiIiA6IGJhc2VOYW1lOwogICAgICAgICBTdHJpbmcgZGJQcmVmaXggPSAoZGJWZW5kb3IgPT0gbnVsbCkgPyAiIiA6IGRiVmVuZG9yICsgIi0iOwogCiAgICAgICAgIC8vIEdldCB0aGUgRXh0ZW5zaW9ucyBkb2N1bWVudApAQCAtNDE5LDggKzM5NSw3IEBACiAgICAgICAgICAgICBlamJGaWxlcy5wdXQoTUVUQV9ESVIgKyBXQVNfRVhULAogICAgICAgICAgICAgICAgIHdlYnNwaGVyZUVYVCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2coIlVuYWJsZSB0byBsb2NhdGUgd2Vic3BoZXJlIGV4dGVuc2lvbnMuICIKLSAgICAgICAgICAgICAgICArICJJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgorICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIHdlYnNwaGVyZSBleHRlbnNpb25zLiBJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgogICAgICAgICAgICAgICAgICsgd2Vic3BoZXJlRVhULmdldFBhdGgoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIH0KIApAQCAtNDMwLDE3ICs0MDUsMTUgQEAKICAgICAgICAgICAgIGVqYkZpbGVzLnB1dChNRVRBX0RJUiArIFdBU19CTkQsCiAgICAgICAgICAgICAgICAgd2Vic3BoZXJlQk5EKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZygiVW5hYmxlIHRvIGxvY2F0ZSB3ZWJzcGhlcmUgYmluZGluZ3MuICIKLSAgICAgICAgICAgICAgICArICJJdCB3YXMgZXhwZWN0ZWQgdG8gYmUgaW4gIgorICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gbG9jYXRlIHdlYnNwaGVyZSBiaW5kaW5ncy4gSXQgd2FzIGV4cGVjdGVkIHRvIGJlIGluICIKICAgICAgICAgICAgICAgICArIHdlYnNwaGVyZUJORC5nZXRQYXRoKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFuZXdDTVApIHsKICAgICAgICAgICAgIGxvZygiVGhlIG9sZCBtZXRob2QgZm9yIGxvY2F0aW5nIENNUCBmaWxlcyBoYXMgYmVlbiBERVBSRUNBVEVELiIsCiAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICBsb2coIlBsZWFzZSBhZGp1c3QgeW91ciB3ZWJzcGhlcmUgZGVzY3JpcHRvciBhbmQgc2V0ICIKLSAgICAgICAgICAgICAgICArICJuZXdDTVA9XCJ0cnVlXCIgdG8gdXNlIHRoZSBuZXcgQ01QIGRlc2NyaXB0b3IgIgotICAgICAgICAgICAgICAgICsgImluY2x1c2lvbiBtZWNoYW5pc20uICIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgbG9nKCJQbGVhc2UgYWRqdXN0IHlvdXIgd2Vic3BoZXJlIGRlc2NyaXB0b3IgYW5kIHNldCBuZXdDTVA9XCJ0cnVlXCIgdG8gdXNlIHRoZSBuZXcgQ01QIGRlc2NyaXB0b3IgaW5jbHVzaW9uIG1lY2hhbmlzbS4gIiwKKyAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFdlIGF0dGVtcHQgdG8gcHV0IGluIHRoZSBNQVAgYW5kIFNjaGVtYSBmaWxlcyBvZiBDTVAgYmVhbnMKICAgICAgICAgICAgIHRyeSB7CkBAIC00NjgsMjUgKzQ0MSwyNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gc2VlIGhlcmUuLi5rZWVwIG1vdmluZyBzb25ueQogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgVmVuZG9yIHNwZWNpZmljIGZpbGVzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIHdoaWxlIGFkZGluZyBWZW5kb3Igc3BlY2lmaWMgZmlsZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSB2ZW5kb3Igc3BlY2lmaWMgbmFtZSBvZiB0aGUgSmFyIHRoYXQgd2lsbCBiZSBvdXRwdXQuIFRoZQogICAgICAqIG1vZGlmaWNhdGlvbiBkYXRlIG9mIHRoaXMgamFyIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0IHRoZSBkZXBlbmRlbnQKICAgICAgKiBiZWFuIGNsYXNzZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgRmlsZSBnZXRWZW5kb3JPdXRwdXRKYXJGaWxlKFN0cmluZyBiYXNlTmFtZSkgewogICAgICAgICByZXR1cm4gbmV3IEZpbGUoZ2V0RGVzdERpcigpLCBiYXNlTmFtZSArIGphclN1ZmZpeCk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvcHRpb25zIGZvciB0aGUgRUpCIERlcGxveSBvcGVyYXRpb24KICAgICAgKgpAQCAtNDk0LDcgKzQ2Niw3IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPcHRpb25zKCkgewogICAgICAgICAvLyBTZXQgdGhlIG9wdGlvbnMKLSAgICAgICAgU3RyaW5nQnVmZmVyIG9wdGlvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgb3B0aW9ucyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKICAgICAgICAgaWYgKGRiVmVuZG9yICE9IG51bGwpIHsKICAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCIgLWRidmVuZG9yICIpLmFwcGVuZChkYlZlbmRvcik7CkBAIC01NDIsMTQgKzUxNCwxMyBAQAogICAgICAgICByZXR1cm4gb3B0aW9ucy50b1N0cmluZygpOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogSGVscGVyIG1ldGhvZCBpbnZva2VkIGJ5IGV4ZWN1dGUoKSBmb3IgZWFjaCB3ZWJzcGhlcmUgamFyIHRvIGJlIGJ1aWx0LgorICAgICAqIEhlbHBlciBtZXRob2QgaW52b2tlZCBieSBleGVjdXRlKCkgZm9yIGVhY2ggV2ViU3BoZXJlIGphciB0byBiZSBidWlsdC4KICAgICAgKiBFbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljIG9mIGNvbnN0cnVjdGluZyBhIGphdmEgdGFzayBmb3IgY2FsbGluZwogICAgICAqIHdlYnNwaGVyZS5lamJkZXBsb3kgYW5kIGV4ZWN1dGluZyBpdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzb3VyY2VKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgc291cmNlIChFSkIxLjEpIGphcmZpbGUuCi0gICAgICogQHBhcmFtIGRlc3RKYXIgamF2YS5pby5GaWxlIHJlcHJlc2VudGluZyB0aGUgZGVzdGluYXRpb24sIHdlYnNwaGVyZQorICAgICAqIEBwYXJhbSBkZXN0SmFyIGphdmEuaW8uRmlsZSByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uLCBXZWJTcGhlcmUKICAgICAgKiAgICAgIGphcmZpbGUuCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGJ1aWxkV2Vic3BoZXJlSmFyKEZpbGUgc291cmNlSmFyLCBGaWxlIGRlc3RKYXIpIHsKQEAgLTU4MCw3ICs1NTEsNyBAQAogICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKGRlc3RKYXIuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgICAgICBqYXZhVGFzay5jcmVhdGVBcmcoKS5zZXRMaW5lKGdldE9wdGlvbnMoKSk7CiAgICAgICAgICAgICAgICAgaWYgKGdldENvbWJpbmVkQ2xhc3NwYXRoKCkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBnZXRDb21iaW5lZENsYXNzcGF0aCgpLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICYmICFnZXRDb21iaW5lZENsYXNzcGF0aCgpLnRvU3RyaW5nKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGphdmFUYXNrLmNyZWF0ZUFyZygpLnNldFZhbHVlKCItY3AiKTsKICAgICAgICAgICAgICAgICAgICAgamF2YVRhc2suY3JlYXRlQXJnKCkuc2V0VmFsdWUoZ2V0Q29tYmluZWRDbGFzc3BhdGgoKS50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CkBAIC02MDMsMTUgKzU3NCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gSGF2ZSB0byBjYXRjaCB0aGlzIGJlY2F1c2Ugb2YgdGhlIHNlbWFudGljcyBvZiBjYWxsaW5nIG1haW4oKQotICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBlamJkZXBsb3kuIERldGFpbHM6ICIgKyBlLnRvU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyBlamJkZXBsb3kuIERldGFpbHM6ICIgKyBlLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUphcihTdHJpbmcgYmFzZU5hbWUsIEZpbGUgamFyRmlsZSwgSGFzaHRhYmxlIGZpbGVzLCBTdHJpbmcgcHVibGljSWQpCi0gICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlSmFyKFN0cmluZyBiYXNlTmFtZSwgRmlsZSBqYXJGaWxlLAorICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBGaWxlPiBmaWxlcywgU3RyaW5nIHB1YmxpY0lkKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoZWpiZGVwbG95KSB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIC1nZW5lcmljLmphciwgaWYgcmVxdWlyZWQKICAgICAgICAgICAgIEZpbGUgZ2VuZXJpY0phckZpbGUgPSBzdXBlci5nZXRWZW5kb3JPdXRwdXRKYXJGaWxlKGJhc2VOYW1lKTsKQEAgLTYzMyw0NiArNjA1LDQ1IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENhbGxlZCB0byB2YWxpZGF0ZSB0aGF0IHRoZSB0b29sIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIGNvbmZpZ3VyZWQuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyZWQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBzdXBlci52YWxpZGF0ZUNvbmZpZ3VyZWQoKTsKICAgICAgICAgaWYgKGVqYmRlcGxveSkgewogICAgICAgICAgICAgU3RyaW5nIGhvbWUgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ3ZWJzcGhlcmUuaG9tZSIpOwogICAgICAgICAgICAgaWYgKGhvbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlICd3ZWJzcGhlcmUuaG9tZScgcHJvcGVydHkgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICsgImJlIHNldCB3aGVuICdlamJkZXBsb3k9dHJ1ZSciKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgJ3dlYnNwaGVyZS5ob21lJyBwcm9wZXJ0eSBtdXN0IGJlIHNldCB3aGVuICdlamJkZXBsb3k9dHJ1ZSciKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHdlYnNwaGVyZUhvbWUgPSBnZXRUYXNrKCkuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGhvbWUpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIHRvIHNlZSBpZiBhIHdlYnNwaGVyZSBFQkoxLjEgamFyIG5lZWRzIHRvIGJlCisgICAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayB0byBzZWUgaWYgYSBXZWJTcGhlcmUgRUpCIDEuMSBqYXIgbmVlZHMgdG8gYmUKICAgICAgKiByZWJ1aWx0IHVzaW5nIGVqYmRlcGxveS4gQ2FsbGVkIGZyb20gd3JpdGVKYXIgaXQgc2VlcyBpZiB0aGUgIkJlYW4iCiAgICAgICogY2xhc3NlcyBhcmUgdGhlIG9ubHkgdGhpbmcgdGhhdCBuZWVkcyB0byBiZSB1cGRhdGVkIGFuZCBlaXRoZXIgdXBkYXRlcwogICAgICAqIHRoZSBKYXIgd2l0aCB0aGUgQmVhbiBjbGFzc2ZpbGUgb3IgcmV0dXJucyB0cnVlLCBzYXlpbmcgdGhhdCB0aGUgd2hvbGUKLSAgICAgKiB3ZWJzcGhlcmUgamFyIG5lZWRzIHRvIGJlIHJlZ2VuZWQgd2l0aCBlamJkZXBsb3kuIFRoaXMgYWxsb3dzIGZhc3RlcgorICAgICAqIFdlYlNwaGVyZSBqYXIgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQgd2l0aCBlamJkZXBsb3kuIFRoaXMgYWxsb3dzIGZhc3RlcgogICAgICAqIGJ1aWxkIHRpbWVzIGZvciB3b3JraW5nIGRldmVsb3BlcnMuIDxwPgogICAgICAqCi0gICAgICogVGhlIHdheSB3ZWJzcGhlcmUgZWpiZGVwbG95IHdvcmtzIGlzIGl0IGNyZWF0ZXMgd3JhcHBlcnMgZm9yIHRoZQorICAgICAqIFRoZSB3YXkgV2ViU3BoZXJlIGVqYmRlcGxveSB3b3JrcyBpcyBpdCBjcmVhdGVzIHdyYXBwZXJzIGZvciB0aGUKICAgICAgKiBwdWJsaWNseSBkZWZpbmVkIG1ldGhvZHMgYXMgdGhleSBhcmUgZXhwb3NlZCBpbiB0aGUgcmVtb3RlIGludGVyZmFjZS4KICAgICAgKiBJZiB0aGUgYWN0dWFsIGJlYW4gY2hhbmdlcyB3aXRob3V0IGNoYW5naW5nIHRoZSB0aGUgbWV0aG9kIHNpZ25hdHVyZXMKICAgICAgKiB0aGVuIG9ubHkgdGhlIGJlYW4gY2xhc3NmaWxlIG5lZWRzIHRvIGJlIHVwZGF0ZWQgYW5kIHRoZSByZXN0IG9mIHRoZQotICAgICAqIHdlYnNwaGVyZSBqYXIgZmlsZSBjYW4gcmVtYWluIHRoZSBzYW1lLiBJZiB0aGUgSW50ZXJmYWNlcywgaWUuIHRoZQorICAgICAqIFdlYlNwaGVyZSBqYXIgZmlsZSBjYW4gcmVtYWluIHRoZSBzYW1lLiBJZiB0aGUgSW50ZXJmYWNlcywgaWUuIHRoZQogICAgICAqIG1ldGhvZCBzaWduYXR1cmVzIGNoYW5nZSBvciBpZiB0aGUgeG1sIGRlcGxveW1lbnQgZGVzY3JpcHRvcnMgY2hhbmdlZCwKICAgICAgKiB0aGUgd2hvbGUgamFyIG5lZWRzIHRvIGJlIHJlYnVpbHQgd2l0aCBlamJkZXBsb3kuIFRoaXMgaXMgbm90IHN0cmljdGx5CiAgICAgICogdHJ1ZSBmb3IgdGhlIHhtbCBmaWxlcy4gSWYgdGhlIEpOREkgbmFtZSBjaGFuZ2VzIHRoZW4gdGhlIGphciBkb2Vzbid0CiAgICAgICogaGF2ZSB0byBiZSByZWJ1aWxkLCBidXQgaWYgdGhlIHJlc291cmNlcyByZWZlcmVuY2VzIGNoYW5nZSB0aGVuIGl0Ci0gICAgICogZG9lcy4gQXQgdGhpcyBwb2ludCB0aGUgd2Vic3BoZXJlIGphciBnZXRzIHJlYnVpbHQgaWYgdGhlIHhtbCBmaWxlcworICAgICAqIGRvZXMuIEF0IHRoaXMgcG9pbnQgdGhlIFdlYlNwaGVyZSBqYXIgZ2V0cyByZWJ1aWx0IGlmIHRoZSB4bWwgZmlsZXMKICAgICAgKiBjaGFuZ2UgYXQgYWxsLgogICAgICAqCiAgICAgICogQHBhcmFtIGdlbmVyaWNKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgZ2VuZXJpYyBqYXIgZmlsZS4KLSAgICAgKiBAcGFyYW0gd2Vic3BoZXJlSmFyRmlsZSBqYXZhLmlvLkZpbGUgVGhlIHdlYnNwaGVyZSBqYXIgZmlsZSB0byBjaGVjayB0bworICAgICAqIEBwYXJhbSB3ZWJzcGhlcmVKYXJGaWxlIGphdmEuaW8uRmlsZSBUaGUgV2ViU3BoZXJlIGphciBmaWxlIHRvIGNoZWNrIHRvCiAgICAgICogICAgICBzZWUgaWYgaXQgbmVlZHMgdG8gYmUgcmVidWlsdC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSByZWJ1aWxkIGlzIHJlcXVpcmVkLgogICAgICAqLwpAQCAtNjg5LDgzICs2NjAsNzEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvZygiQ2hlY2tpbmcgaWYgd2Vic3BoZXJlIEphciBuZWVkcyB0byBiZSByZWJ1aWx0IGZvciBqYXIgIgogICAgICAgICAgICAgICAgICsgd2Vic3BoZXJlSmFyRmlsZS5nZXROYW1lKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICAgLy8gT25seSBnbyBmb3J3YXJkIGlmIHRoZSBnZW5lcmljIGFuZCB0aGUgd2Vic3BoZXJlIGZpbGUgYm90aCBleGlzdAorICAgICAgICAgICAgLy8gT25seSBnbyBmb3J3YXJkIGlmIHRoZSBnZW5lcmljIGFuZCB0aGUgV2ViU3BoZXJlIGZpbGUgYm90aCBleGlzdAogICAgICAgICAgICAgaWYgKGdlbmVyaWNKYXJGaWxlLmV4aXN0cygpICYmIGdlbmVyaWNKYXJGaWxlLmlzRmlsZSgpCiAgICAgICAgICAgICAgICAgICYmIHdlYnNwaGVyZUphckZpbGUuZXhpc3RzKCkgJiYgd2Vic3BoZXJlSmFyRmlsZS5pc0ZpbGUoKSkgewogICAgICAgICAgICAgICAgIC8vb3BlbiBqYXIgZmlsZXMKICAgICAgICAgICAgICAgICBnZW5lcmljSmFyID0gbmV3IEphckZpbGUoZ2VuZXJpY0phckZpbGUpOwogICAgICAgICAgICAgICAgIHdhc0phciA9IG5ldyBKYXJGaWxlKHdlYnNwaGVyZUphckZpbGUpOwogCi0gICAgICAgICAgICAgICAgSGFzaHRhYmxlIGdlbmVyaWNFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSB3YXNFbnRyaWVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICAgICAgICAgIEhhc2h0YWJsZSByZXBsYWNlRW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQogICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBsaXN0IG9mIGdlbmVyaWMgamFyIGVudHJpZXMKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZW5lcmljSmFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgamUgPSAoSmFyRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBKYXJFbnRyeT4gZ2VuZXJpY0VudHJpZXMgPSBnZW5lcmljSmFyLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGplIC0+IGplLmdldE5hbWUoKS5yZXBsYWNlKCdcXCcsICcvJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplIC0+IGplLCAoYSwgYikgLT4gYikpOwogCi0gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNFbnRyaWVzLnB1dChqZS5nZXROYW1lKCkucmVwbGFjZSgnXFwnLCAnLycpLCBqZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vZ2V0IHRoZSBsaXN0IG9mIHdlYnNwaGVyZSBqYXIgZW50cmllcwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb24gZSA9IHdhc0phci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGplID0gKEphckVudHJ5KSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBsaXN0IG9mIFdlYlNwaGVyZSBqYXIgZW50cmllcworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEphckVudHJ5PiB3YXNFbnRyaWVzID0gd2FzSmFyLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFppcEVudHJ5OjpnZXROYW1lLCBqZSAtPiBqZSwgKGEsIGIpIC0+IGIpKTsKIAotICAgICAgICAgICAgICAgICAgICB3YXNFbnRyaWVzLnB1dChqZS5nZXROYW1lKCksIGplKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0N5Y2xlIFRocm91Z2ggZ2VuZXJpYyBhbmQgbWFrZSBzdXJlIGl0cyBpbiB3ZWJzcGhlcmUKKyAgICAgICAgICAgICAgICAvLyBDeWNsZSB0aHJvdWdoIGdlbmVyaWMgYW5kIG1ha2Ugc3VyZSBpdHMgaW4gV2ViU3BoZXJlCiAgICAgICAgICAgICAgICAgZ2VuZXJpY0xvYWRlciA9IGdldENsYXNzTG9hZGVyRnJvbUphcihnZW5lcmljSmFyRmlsZSk7CiAKLSAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZW5lcmljRW50cmllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlcGF0aCA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAod2FzRW50cmllcy5jb250YWluc0tleShmaWxlcGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGUgbmFtZS9wYXRoIG1hdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmaWxlcyBzZWUgaWYgc2FtZQotICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgZ2VuZXJpY0VudHJ5ID0gKEphckVudHJ5KSBnZW5lcmljRW50cmllcy5nZXQoZmlsZXBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgSmFyRW50cnkgd2FzRW50cnkgPSAoSmFyRW50cnkpIHdhc0VudHJpZXMuZ2V0KGZpbGVwYXRoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChnZW5lcmljRW50cnkuZ2V0Q3JjKCkgIT0gd2FzRW50cnkuZ2V0Q3JjKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGdlbmVyaWNFbnRyeS5nZXRTaXplKCkgIT0gd2FzRW50cnkuZ2V0U2l6ZSgpKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmVyaWNFbnRyeS5nZXROYW1lKCkuZW5kc1dpdGgoIi5jbGFzcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlsZSBhcmUgZGlmZmVyZW50IHNlZSBpZiBpdHMgYW4gb2JqZWN0IG9yIGFuIGludGVyZmFjZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdlbmVyaWNFbnRyeS5nZXROYW1lKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lLnN1YnN0cmluZygwLCBjbGFzc25hbWUubGFzdEluZGV4T2YoIi5jbGFzcyIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBnZW5jbGFzcyA9IGdlbmVyaWNMb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdlbmNsYXNzLmlzSW50ZXJmYWNlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW50ZXJmYWNlIGNoYW5nZWQgICByZWJ1aWxkIGphci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSW50ZXJmYWNlICIgKyBnZW5jbGFzcy5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL09iamVjdCBjbGFzcyBDaGFuZ2VkICAgdXBkYXRlIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUVudHJpZXMucHV0KGZpbGVwYXRoLCBnZW5lcmljRW50cnkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgaXQgdGhlIG1hbmlmZXN0LiBJZiBzbyBpZ25vcmUgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFnZW5lcmljRW50cnkuZ2V0TmFtZSgpLmVxdWFscygiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaWxlIG90aGVyIHRoZW4gY2xhc3MgY2hhbmdlZCAgIHJlYnVpbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiTm9uIGNsYXNzIGZpbGUgIiArIGdlbmVyaWNFbnRyeS5nZXROYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBKYXJFbnRyeT4gcmVwbGFjZUVudHJpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZXBhdGggOiBnZW5lcmljRW50cmllcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc0VudHJpZXMuY29udGFpbnNLZXkoZmlsZXBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZpbGUgZG9lc24ndCBleGlzdCByZWJ1aWxkCi0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmlsZSAiICsgZmlsZXBhdGggKyAiIG5vdCBwcmVzZW50IGluIHdlYnNwaGVyZSBqYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIG5hbWUvcGF0aCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmaWxlcyBzZWUgaWYgc2FtZQorICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBnZW5lcmljRW50cnkgPSBnZW5lcmljRW50cmllcy5nZXQoZmlsZXBhdGgpOworICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSB3YXNFbnRyeSA9IHdhc0VudHJpZXMuZ2V0KGZpbGVwYXRoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpY0VudHJ5LmdldENyYygpICE9IHdhc0VudHJ5LmdldENyYygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBnZW5lcmljRW50cnkuZ2V0U2l6ZSgpICE9IHdhc0VudHJ5LmdldFNpemUoKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbGUgYXJlIGRpZmZlcmVudCBzZWUgaWYgaXRzIGFuIG9iamVjdCBvciBhbiBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NuYW1lLmxhc3RJbmRleE9mKCIuY2xhc3MiKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBnZW5jbGFzcyA9IGdlbmVyaWNMb2FkZXIubG9hZENsYXNzKGNsYXNzbmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuY2xhc3MuaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludGVyZmFjZSBjaGFuZ2VkICAgcmVidWlsZCBqYXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSW50ZXJmYWNlICIgKyBnZW5jbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBoYXMgY2hhbmdlZCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWJ1aWxkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vT2JqZWN0IGNsYXNzIENoYW5nZWQgICB1cGRhdGUgaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUVudHJpZXMucHV0KGZpbGVwYXRoLCBnZW5lcmljRW50cnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBpdCB0aGUgbWFuaWZlc3QuIElmIHNvIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2VuZXJpY0VudHJ5LmdldE5hbWUoKS5lcXVhbHMoIk1FVEEtSU5GL01BTklGRVNULk1GIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9GaWxlIG90aGVyIHRoZW4gY2xhc3MgY2hhbmdlZCAgcmVidWlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIk5vbiBjbGFzcyBmaWxlICIgKyBnZW5lcmljRW50cnkuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaGFzIGNoYW5nZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKCFyZWJ1aWxkKSB7CkBAIC03NzUsMTYgKzczNCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3d2FzSmFyRmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbSA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3d2FzSmFyRmlsZSkpOworICAgICAgICAgICAgICAgICAgICBuZXdKYXJTdHJlYW0gPSBuZXcgSmFyT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbShuZXd3YXNKYXJGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCgwKTsKIAotICAgICAgICAgICAgICAgICAgICAvL0NvcHkgZmlsZXMgZnJvbSBvbGQgd2Vic3BoZXJlIGphcgotICAgICAgICAgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSB3YXNFbnRyaWVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwotICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBKYXJFbnRyeSBqZSA9IChKYXJFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCisgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgZmlsZXMgZnJvbSBvbGQgV2ViU3BoZXJlIGphcgorICAgICAgICAgICAgICAgICAgICBmb3IgKEphckVudHJ5IGplIDogd2FzRW50cmllcy52YWx1ZXMoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGplLmdldENvbXByZXNzZWRTaXplKCkgPT0gLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBqZS5nZXRDb21wcmVzc2VkU2l6ZSgpID09IGplLmdldFNpemUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5zZXRMZXZlbCgwKTsKQEAgLTc5MiwyMCArNzQ2LDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLnNldExldmVsKEpBUl9DT01QUkVTU19MRVZFTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHdpdGggY2hhbmdlZCBCZWFuIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVwbGFjZUVudHJpZXMuY29udGFpbnNLZXkoamUuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiVXBkYXRpbmcgQmVhbiBjbGFzcyBmcm9tIGdlbmVyaWMgSmFyICIgKyBqZS5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgZW50cnkgZnJvbSB0aGUgZ2VuZXJpYyBqYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZSA9IChKYXJFbnRyeSkgcmVwbGFjZUVudHJpZXMuZ2V0KGplLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamUgPSByZXBsYWNlRW50cmllcy5nZXQoamUuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyA9IGdlbmVyaWNKYXIuZ2V0SW5wdXRTdHJlYW0oamUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3VzZSBmbGUgZnJvbSBvcmlnaW5hbCB3ZWJzcGhlcmUgamFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGZsZSBmcm9tIG9yaWdpbmFsIFdlYlNwaGVyZSBqYXIKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzID0gd2FzSmFyLmdldElucHV0U3RyZWFtKGplKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0phclN0cmVhbS5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KGplLmdldE5hbWUoKSkpOwogCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbREVGQVVMVF9CVUZGRVJfU0laRV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgPSBpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SmFyU3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgxOSwzNiArNzc2LDIxIEBACiAgICAgICAgICAgICAgICAgcmVidWlsZCA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewotICAgICAgICAgICAgU3RyaW5nIGNuZm1zZyA9ICJDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZWpiLWphciBmaWxlIgotICAgICAgICAgICAgICAgICArICIuIERldGFpbHM6ICIKLSAgICAgICAgICAgICAgICAgKyBjbmZlLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNuZm1zZywgY25mZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNsYXNzTm90Rm91bmRFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBlamItamFyIGZpbGUuIERldGFpbHM6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBjbmZlLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICBjbmZlKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gIklPRXhjZXB0aW9uIHdoaWxlIHByb2Nlc3NpbmcgZWpiLWphciBmaWxlICIKLSAgICAgICAgICAgICAgICAgKyAiLiBEZXRhaWxzOiAiCi0gICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKTsKLQotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgaW9lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiSU9FeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBlamItamFyIGZpbGUgLiBEZXRhaWxzOiAiCisgICAgICAgICAgICAgICAgICAgICsgaW9lLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICBpb2UpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgLy8gbmVlZCB0byBjbG9zZSBmaWxlcyBhbmQgcGVyaGFwcyByZW5hbWUgb3V0cHV0Ci0gICAgICAgICAgICBpZiAoZ2VuZXJpY0phciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY0phci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGNsb3NlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHdhc0phciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgd2FzSmFyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gY2xvc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZ2VuZXJpY0phcik7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uod2FzSmFyKTsKICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShuZXdKYXJTdHJlYW0pOworCiAgICAgICAgICAgICBpZiAobmV3SmFyU3RyZWFtICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlbmFtZShuZXd3YXNKYXJGaWxlLCB3ZWJzcGhlcmVKYXJGaWxlKTsKQEAgLTg1NywxNyArNzk5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHJlYnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZW5lcmljTG9hZGVyICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBnZW5lcmljTG9hZGVyIGluc3RhbmNlb2YgQW50Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgIGlmIChnZW5lcmljTG9hZGVyIGluc3RhbmNlb2YgQW50Q2xhc3NMb2FkZXIpIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgICAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IChBbnRDbGFzc0xvYWRlcikgZ2VuZXJpY0xvYWRlcjsKICAgICAgICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHJlYnVpbGQ7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBIZWxwZXIgbWV0aG9kIGludm9rZWQgYnkgaXNSZWJ1aWxkUmVxdWlyZWQgdG8gZ2V0IGEgQ2xhc3NMb2FkZXIgZm9yIGEKICAgICAgKiBKYXIgRmlsZSBwYXNzZWQgdG8gaXQuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vQ29tcGF0YWJpbGl0eS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0NvbXBhdGFiaWxpdHkuamF2YQppbmRleCBjYmM3ZjM3Li5kNzU3OGEyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vQ29tcGF0YWJpbGl0eS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9Db21wYXRhYmlsaXR5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MSw2ICs1MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGNvbXBhdGliaWxpdHkgbGV2ZWwKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vQ29tcGF0aWJpbGl0eS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0NvbXBhdGliaWxpdHkuamF2YQppbmRleCBjZmUxMmExLi41YTU5OGE1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vQ29tcGF0aWJpbGl0eS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9Db21wYXRpYmlsaXR5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MSw2ICs1MSw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIGNvbXBhdGliaWxpdHkgbGV2ZWwKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRGV3ZXlEZWNpbWFsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRGV3ZXlEZWNpbWFsLmphdmEKaW5kZXggMmVkYzJhNy4uODY0OTgyNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0Rld2V5RGVjaW1hbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9EZXdleURlY2ltYWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb24uamF2YQppbmRleCBkMTNkMmY0Li40OGIyNTA0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTQgKzE4LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CiBpbXBvcnQgamF2YS51dGlsLmphci5BdHRyaWJ1dGVzOwogaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRld2V5RGVjaW1hbDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwogCiAvKioKICAqIDxwPlV0aWxpdHkgY2xhc3MgdGhhdCByZXByZXNlbnRzIGVpdGhlciBhbiBhdmFpbGFibGUgIk9wdGlvbmFsIFBhY2thZ2UiCkBAIC01Miw3ICs1Myw3IEBACiAgICAgICogYXJlIG5vdCByZXF1aXJlZCBmb3IgdGhlIGxpYnJhcnkgdG8gb3BlcmF0ZSBidXQgaWYgcHJlc2VudCB3aWxsIGJlIHVzZWQuCiAgICAgICogSXQgaXMgTk9UIHBhcnQgb2YgdGhlIG9mZmljaWFsICJPcHRpb25hbCBQYWNrYWdlIiBzcGVjaWZpY2F0aW9uLgogICAgICAqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy9zcGVjLmh0bWwjZGVwZW5kZW5jeSI+CisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvZXh0ZW5zaW9ucy9zcGVjLmh0bWwjZGVwZW5kZW5jeSI+CiAgICAgICogICAgICBJbnN0YWxsZWQgZXh0ZW5zaW9uIGRlcGVuZGVuY3k8L2E+CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVzLk5hbWUgT1BUSU9OQUxfRVhURU5TSU9OX0xJU1QKQEAgLTE4NywzMSArMTg4LDE0IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRBdmFpbGFibGUoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QpIHsKICAgICAgICAgaWYgKG51bGwgPT0gbWFuaWZlc3QpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uWyAwIF07CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuc2lvblswXTsKICAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgbWFpbkF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOwotICAgICAgICBpZiAobnVsbCAhPSBtYWluQXR0cmlidXRlcykgewotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigiIiwgbWFpbkF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gZXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE1hcCBlbnRyaWVzID0gbWFuaWZlc3QuZ2V0RW50cmllcygpOwotICAgICAgICBmaW5hbCBJdGVyYXRvciBrZXlzID0gZW50cmllcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKLSAgICAgICAgICAgIGZpbmFsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IChBdHRyaWJ1dGVzKSBlbnRyaWVzLmdldChrZXkpOwotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigiIiwgYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBleHRlbnNpb24pIHsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChleHRlbnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChFeHRlbnNpb25bXSkgcmVzdWx0cy50b0FycmF5KG5ldyBFeHRlbnNpb25bcmVzdWx0cy5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIFN0cmVhbQorICAgICAgICAgICAgLmNvbmNhdChPcHRpb25hbC5vZk51bGxhYmxlKG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoU3RyZWFtOjpvZikub3JFbHNlKFN0cmVhbS5lbXB0eSgpKSwKKyAgICAgICAgICAgICAgICBtYW5pZmVzdC5nZXRFbnRyaWVzKCkudmFsdWVzKCkuc3RyZWFtKCkpCisgICAgICAgICAgICAubWFwKGF0dHJzIC0+IGdldEV4dGVuc2lvbigiIiwgYXR0cnMpKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgIC50b0FycmF5KEV4dGVuc2lvbltdOjpuZXcpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDkxLDU0ICs0NzUsMzUgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBmaW5hbCBTdHJpbmcgYnJhY2UgPSAiOiAiOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybWF0ID0gIiVzOiAlcyVuIjsKIAotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKEVYVEVOU0lPTl9OQU1FLnRvU3RyaW5nKCkpOwotICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICBzYi5hcHBlbmQoZXh0ZW5zaW9uTmFtZSk7Ci0gICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KGZvcm1hdCwKKyAgICAgICAgICAgICAgICBFWFRFTlNJT05fTkFNRSwgZXh0ZW5zaW9uTmFtZSkpOwogCiAgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZXJzaW9uKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU1BFQ0lGSUNBVElPTl9WRVJTSU9OKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChicmFjZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlcnNpb24pOwotICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdCwgU1BFQ0lGSUNBVElPTl9WRVJTSU9OLCBzcGVjaWZpY2F0aW9uVmVyc2lvbikpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG51bGwgIT0gc3BlY2lmaWNhdGlvblZlbmRvcikgewotICAgICAgICAgICAgc2IuYXBwZW5kKFNQRUNJRklDQVRJT05fVkVORE9SKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChicmFjZSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc3BlY2lmaWNhdGlvblZlbmRvcik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoZm9ybWF0LCBTUEVDSUZJQ0FUSU9OX1ZFTkRPUiwgc3BlY2lmaWNhdGlvblZlbmRvcikpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG51bGwgIT0gaW1wbGVtZW50YXRpb25WZXJzaW9uKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSU1QTEVNRU5UQVRJT05fVkVSU0lPTik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVmVyc2lvbik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoZm9ybWF0LCBJTVBMRU1FTlRBVElPTl9WRVJTSU9OLCBpbXBsZW1lbnRhdGlvblZlcnNpb24pKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9ySUQpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChJTVBMRU1FTlRBVElPTl9WRU5ET1JfSUQpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlbmRvcklEKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdChmb3JtYXQsIElNUExFTUVOVEFUSU9OX1ZFTkRPUl9JRCwgaW1wbGVtZW50YXRpb25WZW5kb3JJRCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKG51bGwgIT0gaW1wbGVtZW50YXRpb25WZW5kb3IpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChJTVBMRU1FTlRBVElPTl9WRU5ET1IpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlbmRvcik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoZm9ybWF0LCBJTVBMRU1FTlRBVElPTl9WRU5ET1IsIGltcGxlbWVudGF0aW9uVmVuZG9yKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblVSTCkgewotICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1VSTCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVVJMKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdChmb3JtYXQsIElNUExFTUVOVEFUSU9OX1VSTCwgaW1wbGVtZW50YXRpb25VUkwpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwpAQCAtNTY3LDIyICs1MzIsMTcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRMaXN0ZWQoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzLk5hbWUgbGlzdEtleSkgewotICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZmluYWwgTGlzdDxFeHRlbnNpb24+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZmluYWwgQXR0cmlidXRlcyBtYWluQXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7CiAKICAgICAgICAgaWYgKG51bGwgIT0gbWFpbkF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgIGdldEV4dGVuc2lvbihtYWluQXR0cmlidXRlcywgcmVzdWx0cywgbGlzdEtleSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBNYXAgZW50cmllcyA9IG1hbmlmZXN0LmdldEVudHJpZXMoKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3Iga2V5cyA9IGVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAoQXR0cmlidXRlcykgZW50cmllcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIGdldEV4dGVuc2lvbihhdHRyaWJ1dGVzLCByZXN1bHRzLCBsaXN0S2V5KTsKLSAgICAgICAgfQorICAgICAgICBtYW5pZmVzdC5nZXRFbnRyaWVzKCkudmFsdWVzKCkKKyAgICAgICAgICAgIC5mb3JFYWNoKGF0dHJpYnV0ZXMgLT4gZ2V0RXh0ZW5zaW9uKGF0dHJpYnV0ZXMsIHJlc3VsdHMsIGxpc3RLZXkpKTsKIAotICAgICAgICByZXR1cm4gKEV4dGVuc2lvbltdKSByZXN1bHRzLnRvQXJyYXkobmV3IEV4dGVuc2lvbltyZXN1bHRzLnNpemUoKV0pOworICAgICAgICByZXR1cm4gcmVzdWx0cy50b0FycmF5KG5ldyBFeHRlbnNpb25bcmVzdWx0cy5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU5NSwxOCArNTU1LDE0IEBACiAgICAgICogICAgb3IgT1BUSU9OQUxfRVhURU5TSU9OX0xJU1QKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGdldEV4dGVuc2lvbihmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IHJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RXh0ZW5zaW9uPiByZXF1aXJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzLk5hbWUgbGlzdEtleSkgewogICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZXMgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGxpc3RLZXkpOwogICAgICAgICBpZiAobnVsbCA9PSBuYW1lcykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHNwbGl0KG5hbWVzLCAiICIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBleHRlbnNpb25zWyBpIF0gKyAiLSI7Ci0gICAgICAgICAgICBmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKHByZWZpeCwgYXR0cmlidXRlcyk7Ci0KKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcHJlZml4IDogc3BsaXQobmFtZXMsICIgIikpIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24ocHJlZml4ICsgIi0iLCBhdHRyaWJ1dGVzKTsKICAgICAgICAgICAgIGlmIChudWxsICE9IGV4dGVuc2lvbikgewogICAgICAgICAgICAgICAgIHJlcXVpcmVkLmFkZChleHRlbnNpb24pOwogICAgICAgICAgICAgfQpAQCAtNjIzLDEwICs1NzksMTAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBzcGxpdChmaW5hbCBTdHJpbmcgc3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvblRva2VuKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgb25Ub2tlbik7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbIHRva2VuaXplci5jb3VudFRva2VucygpIF07CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbIGkgXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIHJlc3VsdFtpXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvbkFkYXB0ZXIuamF2YQppbmRleCA0YmVmYTRmLi45Njg2NWY1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25BZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNTAsNiArMTUwLDcgQEAKICAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSByZWZlcmVuY2UgdG8gd2hpY2ggdGhpcyBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiB0aGlzIGluc3RhbmNlIGFscmVhZHkgaGFzIGJlZW4gY29uZmlndXJlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChmaW5hbCBSZWZlcmVuY2UgcmVmZXJlbmNlKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobnVsbCAhPSBleHRlbnNpb25OYW1lCkBAIC0xNzksMTIgKzE4MCwxMSBAQAogICAgIEV4dGVuc2lvbiB0b0V4dGVuc2lvbigpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFeHRlbnNpb25BZGFwdGVyKSBnZXRDaGVja2VkUmVmKCkpLnRvRXh0ZW5zaW9uKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkudG9FeHRlbnNpb24oKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIGlmIChudWxsID09IGV4dGVuc2lvbk5hbWUpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkV4dGVuc2lvbiBpcyBtaXNzaW5nIG5hbWUuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXh0ZW5zaW9uIGlzIG1pc3NpbmcgbmFtZS4iKTsKICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZyBzcGVjaWZpY2F0aW9uVmVyc2lvblN0cmluZyA9IG51bGw7CkBAIC0yMDksNyArMjA5LDEyIEBACiAgICAgICogQHJldHVybiB0aGUgZXh0ZW5zaW9uIGluIGEgc3RyaW5nLgogICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJ7IiArIHRvRXh0ZW5zaW9uKCkudG9TdHJpbmcoKSArICJ9IjsKKyAgICAgICAgcmV0dXJuICJ7IiArIHRvRXh0ZW5zaW9uKCkgKyAifSI7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeHRlbnNpb25BZGFwdGVyIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRXh0ZW5zaW9uQWRhcHRlci5jbGFzcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblJlc29sdmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uUmVzb2x2ZXIuamF2YQppbmRleCBhNzMyODJlLi4wYTdiMmQzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uUmVzb2x2ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uUmVzb2x2ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25TZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25TZXQuamF2YQppbmRleCA1YWJhMzdjLi43NmYxMWMxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTM5LDEyICszOSwxMiBAQAogICAgIC8qKgogICAgICAqIEV4dGVuc2lvbkFkYXB0ZXIgb2JqZWN0cyByZXByZXNlbnRpbmcgZXh0ZW5zaW9ucy4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFeHRlbnNpb25BZGFwdGVyPiBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBGaWxlc2V0cyBzcGVjaWZ5aW5nIGFsbCB0aGUgZXh0ZW5zaW9ucyB3YW50ZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgZXh0ZW5zaW9uc0ZpbGVzZXRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlU2V0PiBleHRlbnNpb25zRmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIEFkZHMgYW4gZXh0ZW5zaW9uIHRoYXQgdGhpcyBsaWJyYXJ5IHJlcXVpcmVzLgpAQCAtOTUsMTIgKzk1LDEyIEBACiAgICAgcHVibGljIEV4dGVuc2lvbltdIHRvRXh0ZW5zaW9ucyhmaW5hbCBQcm9qZWN0IHByb2opCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChFeHRlbnNpb25TZXQpIGdldENoZWNrZWRSZWYoKSkudG9FeHRlbnNpb25zKHByb2opOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvRXh0ZW5zaW9ucyhwcm9qKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCBleHRlbnNpb25zTGlzdCA9IEV4dGVuc2lvblV0aWwudG9FeHRlbnNpb25zKGV4dGVuc2lvbnMpOworICAgICAgICBmaW5hbCBMaXN0PEV4dGVuc2lvbj4gZXh0ZW5zaW9uc0xpc3QgPSBFeHRlbnNpb25VdGlsLnRvRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKICAgICAgICAgRXh0ZW5zaW9uVXRpbC5leHRyYWN0RXh0ZW5zaW9ucyhwcm9qLCBleHRlbnNpb25zTGlzdCwgZXh0ZW5zaW9uc0ZpbGVzZXRzKTsKLSAgICAgICAgcmV0dXJuIChFeHRlbnNpb25bXSkgZXh0ZW5zaW9uc0xpc3QudG9BcnJheShuZXcgRXh0ZW5zaW9uW2V4dGVuc2lvbnNMaXN0LnNpemUoKV0pOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uc0xpc3QudG9BcnJheShuZXcgRXh0ZW5zaW9uW2V4dGVuc2lvbnNMaXN0LnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIzLDcgKzEyMyw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2sgc3RrLCBQcm9qZWN0IHApCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2s8T2JqZWN0PiBzdGssIFByb2plY3QgcCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xMzEsMTcgKzEzMSwyMCBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgc3VwZXIuZGllT25DaXJjdWxhclJlZmVyZW5jZShzdGssIHApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZXh0ZW5zaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjaygoRXh0ZW5zaW9uQWRhcHRlcikgaS5uZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RrLCBwKTsKKyAgICAgICAgICAgIGZvciAoRXh0ZW5zaW9uQWRhcHRlciBleHRlbnNpb25BZGFwdGVyIDogZXh0ZW5zaW9ucykgeworICAgICAgICAgICAgICAgIHB1c2hBbmRJbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKGV4dGVuc2lvbkFkYXB0ZXIsIHN0aywgcCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBleHRlbnNpb25zRmlsZXNldHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgcHVzaEFuZEludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2soKEZpbGVTZXQpIGkubmV4dCgpLCBzdGssIHApOworICAgICAgICAgICAgZm9yIChGaWxlU2V0IGZpbGVTZXQgOiBleHRlbnNpb25zRmlsZXNldHMpIHsKKyAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhmaWxlU2V0LCBzdGssIHApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgRXh0ZW5zaW9uU2V0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRXh0ZW5zaW9uU2V0LmNsYXNzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQogICAgICAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbnMgaW4gYSBzdHJpbmcuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uVXRpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0V4dGVuc2lvblV0aWwuamF2YQppbmRleCBlNjMxZDNhLi5kYTY1MWU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0ZW5zaW9uVXRpbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRlbnNpb25VdGlsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxMCArMjAsMTEgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwogaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKQEAgLTQ4LDE5ICs0OSwxMCBAQAogICAgICAqIEBwYXJhbSBhZGFwdGVycyB0aGUgbGlzdCBvZiBFeHRlbnNpb25BZGFwdGVycyB0byBhZGQgdG8gY29udmVydAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCi0gICAgc3RhdGljIEFycmF5TGlzdCB0b0V4dGVuc2lvbnMoZmluYWwgTGlzdCBhZGFwdGVycykKKyAgICBzdGF0aWMgQXJyYXlMaXN0PEV4dGVuc2lvbj4gdG9FeHRlbnNpb25zKGZpbmFsIExpc3Q8PyBleHRlbmRzIEV4dGVuc2lvbkFkYXB0ZXI+IGFkYXB0ZXJzKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGFkYXB0ZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbkFkYXB0ZXIgYWRhcHRlciA9Ci0gICAgICAgICAgICAgICAgKEV4dGVuc2lvbkFkYXB0ZXIpIGFkYXB0ZXJzLmdldChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBhZGFwdGVyLnRvRXh0ZW5zaW9uKCk7Ci0gICAgICAgICAgICByZXN1bHRzLmFkZChleHRlbnNpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgIHJldHVybiBhZGFwdGVycy5zdHJlYW0oKS5tYXAoRXh0ZW5zaW9uQWRhcHRlcjo6dG9FeHRlbnNpb24pCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihBcnJheUxpc3Q6Om5ldykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzEsMTUgKzYzLDExIEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KICAgICBzdGF0aWMgdm9pZCBleHRyYWN0RXh0ZW5zaW9ucyhmaW5hbCBQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgbGlicmFyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGZpbGVzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RXh0ZW5zaW9uPiBsaWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RmlsZVNldD4gZmlsZXNldCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFmaWxlc2V0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMocHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2V0KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGxpYnJhcmllcy5hZGQoZXh0ZW5zaW9uc1sgaSBdKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChsaWJyYXJpZXMsIGdldEV4dGVuc2lvbnMocHJvamVjdCwgZmlsZXNldCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MSwxMyArNzksMTEgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGZhaWxpbmcgdG8gc2NhbiBsaWJyYXJpZXMKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBFeHRlbnNpb25bXSBnZXRFeHRlbnNpb25zKGZpbmFsIFByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGxpYnJhcmllcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGxpYnJhcmllcykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IGV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlicmFyaWVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZmlsZVNldCA9IChGaWxlU2V0KSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgIGZpbmFsIExpc3Q8RXh0ZW5zaW9uPiBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKKyAgICAgICAgZm9yIChGaWxlU2V0IGZpbGVTZXQgOiBsaWJyYXJpZXMpIHsKICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUltcGwgPSB0cnVlOwogICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlVVJMID0gdHJ1ZTsKIApAQCAtMTE0LDcgKzEwMCw3IEBACiAgICAgICAgICAgICAgICAgbG9hZEV4dGVuc2lvbnMoZmlsZSwgZXh0ZW5zaW9ucywgaW5jbHVkZUltcGwsIGluY2x1ZGVVUkwpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoRXh0ZW5zaW9uW10pIGV4dGVuc2lvbnMudG9BcnJheShuZXcgRXh0ZW5zaW9uW2V4dGVuc2lvbnMuc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBleHRlbnNpb25zLnRvQXJyYXkobmV3IEV4dGVuc2lvbltleHRlbnNpb25zLnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1LDIzICsxMTEsMTcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkRXh0ZW5zaW9ucyhmaW5hbCBGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBleHRlbnNpb25MaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RXh0ZW5zaW9uPiBleHRlbnNpb25MaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5jbHVkZUltcGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlVVJMKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBKYXJGaWxlIGphckZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUpOwotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9Ci0gICAgICAgICAgICAgICAgRXh0ZW5zaW9uLmdldEF2YWlsYWJsZShqYXJGaWxlLmdldE1hbmlmZXN0KCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbIGkgXTsKKyAgICAgICAgdHJ5IChKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShmaWxlKSkgeworICAgICAgICAgICAgZm9yIChFeHRlbnNpb24gZXh0ZW5zaW9uIDogRXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgLmdldEF2YWlsYWJsZShqYXJGaWxlLmdldE1hbmlmZXN0KCkpKSB7CiAgICAgICAgICAgICAgICAgYWRkRXh0ZW5zaW9uKGV4dGVuc2lvbkxpc3QsIGV4dGVuc2lvbiwgaW5jbHVkZUltcGwsIGluY2x1ZGVVUkwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCBlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGNsb3NlKGphckZpbGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTYsNyArMTM2LDcgQEAKICAgICAgKiBAcGFyYW0gaW5jbHVkZUltcGwgZmFsc2UgdG8gZXhjbHVkZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzCiAgICAgICogQHBhcmFtIGluY2x1ZGVVUkwgZmFsc2UgdG8gZXhjbHVkZSBpbXBsZW1lbnRhdGlvbiBVUkwKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEV4dGVuc2lvbihmaW5hbCBMaXN0IGV4dGVuc2lvbkxpc3QsCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRFeHRlbnNpb24oZmluYWwgTGlzdDxFeHRlbnNpb24+IGV4dGVuc2lvbkxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBvcmlnaW5hbEV4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlSW1wbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlVVJMKSB7CkBAIC0yMDMsMjggKzE4MywxNSBAQAogICAgICAqLwogICAgIHN0YXRpYyBNYW5pZmVzdCBnZXRNYW5pZmVzdChmaW5hbCBGaWxlIGZpbGUpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEphckZpbGUgamFyRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7CisgICAgICAgIHRyeSAoSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSkpIHsKICAgICAgICAgICAgIE1hbmlmZXN0IG0gPSBqYXJGaWxlLmdldE1hbmlmZXN0KCk7CiAgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGZpbGUgKyAiIGRvZXNuJ3QgaGF2ZSBhIE1BTklGRVNUIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBkb2Vzbid0IGhhdmUgYSBNQU5JRkVTVCIsIGZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGlvZS5nZXRNZXNzYWdlKCksIGlvZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBjbG9zZShqYXJGaWxlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2UoSmFyRmlsZSBkZXZpY2UpIHsKLSAgICAgICAgaWYgKG51bGwgIT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGRldmljZS5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vaWdub3JlCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vRXh0cmFBdHRyaWJ1dGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRyYUF0dHJpYnV0ZS5qYXZhCmluZGV4IGQ1MmJlYzQuLjJkZDRmYTcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRyYUF0dHJpYnV0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9FeHRyYUF0dHJpYnV0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzMsMTEgKzczLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobnVsbCA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNaXNzaW5nIG5hbWUgZnJvbSBwYXJhbWV0ZXIuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfSBlbHNlIGlmIChudWxsID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNaXNzaW5nIHZhbHVlIGZyb20gcGFyYW1ldGVyICIgKyBuYW1lICsgIi4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJNaXNzaW5nIG5hbWUgZnJvbSBwYXJhbWV0ZXIuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTWlzc2luZyB2YWx1ZSBmcm9tIHBhcmFtZXRlciAiICsgbmFtZSArICIuIik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliQXZhaWxhYmxlVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkF2YWlsYWJsZVRhc2suamF2YQppbmRleCA0Y2NlMGY1Li41OGVmZWQyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliQXZhaWxhYmxlVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJBdmFpbGFibGVUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMSArMTgsMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5qYXIuTWFuaWZlc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiAKIC8qKgpAQCAtNDAsNyArNDEsNyBAQAogICAgICAqIEZpbGVzZXRzIHNwZWNpZnlpbmcgYWxsIHRoZSBsaWJyYXJpZXMKICAgICAgKiB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yIGV4dGVuc2lvbkZpbGVTZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFeHRlbnNpb25TZXQ+IGV4dGVuc2lvbkZpbGVTZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0IGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGUuCkBAIC03Nyw5ICs3OCw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25BZGFwdGVyIGV4dGVuc2lvbikgewogICAgICAgICBpZiAobnVsbCAhPSByZXF1aXJlZEV4dGVuc2lvbikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQ2FuIG5vdCBzcGVjaWZ5IGV4dGVuc2lvbiB0byAiCi0gICAgICAgICAgICAgICAgKyAic2VhcmNoIGZvciBtdWx0aXBsZSB0aW1lcy4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW4gbm90IHNwZWNpZnkgZXh0ZW5zaW9uIHRvIHNlYXJjaCBmb3IgbXVsdGlwbGUgdGltZXMuIik7CiAgICAgICAgIH0KICAgICAgICAgcmVxdWlyZWRFeHRlbnNpb24gPSBleHRlbnNpb247CiAgICAgfQpAQCAtOTAsNyArOTAsNyBAQAogICAgICAqIEBwYXJhbSBleHRlbnNpb25TZXQgYSBzZXQgb2YgZXh0ZW5zaW9ucyB0byBzZWFyY2ggaW4uCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEV4dGVuc2lvblNldChmaW5hbCBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uU2V0KSB7Ci0gICAgICAgIGV4dGVuc2lvbkZpbGVTZXRzLmFkZEVsZW1lbnQoZXh0ZW5zaW9uU2V0KTsKKyAgICAgICAgZXh0ZW5zaW9uRmlsZVNldHMuYWRkKGV4dGVuc2lvblNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05OCwzNSArOTgsMjQgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uIHRlc3QgPSByZXF1aXJlZEV4dGVuc2lvbi50b0V4dGVuc2lvbigpOworICAgICAgICBmaW5hbCBQcm9qZWN0IHByaiA9IGdldFByb2plY3QoKTsKKyAgICAgICAgZmluYWwgU3RyZWFtPEV4dGVuc2lvbj4gZXh0ZW5zaW9uczsKIAogICAgICAgICAvLyBDaGVjayBpZiBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgICBpZiAoIWV4dGVuc2lvbkZpbGVTZXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRlbnNpb25GaWxlU2V0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblNldCBleHRlbnNpb25TZXQKLSAgICAgICAgICAgICAgICAgICAgPSAoRXh0ZW5zaW9uU2V0KSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblNldC50b0V4dGVuc2lvbnMoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbIGkgXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0NvbXBhdGlibGVXaXRoKHRlc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkocHJvcGVydHlOYW1lLCAidHJ1ZSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbkZpbGVTZXRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcCh4c2V0IC0+IHhzZXQudG9FeHRlbnNpb25zKHByaikpLmZsYXRNYXAoU3RyZWFtOjpvZik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBNYW5pZmVzdCBtYW5pZmVzdCA9IEV4dGVuc2lvblV0aWwuZ2V0TWFuaWZlc3QobGlicmFyeUZpbGUpOwotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IEV4dGVuc2lvbi5nZXRBdmFpbGFibGUobWFuaWZlc3QpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbIGkgXTsKLSAgICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzQ29tcGF0aWJsZVdpdGgodGVzdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgInRydWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBleHRlbnNpb25zID0gU3RyZWFtLm9mKAorICAgICAgICAgICAgICAgIEV4dGVuc2lvbi5nZXRBdmFpbGFibGUoRXh0ZW5zaW9uVXRpbC5nZXRNYW5pZmVzdChsaWJyYXJ5RmlsZSkpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBFeHRlbnNpb24gdGVzdCA9IHJlcXVpcmVkRXh0ZW5zaW9uLnRvRXh0ZW5zaW9uKCk7CisgICAgICAgIGlmIChleHRlbnNpb25zLmFueU1hdGNoKHggLT4geC5pc0NvbXBhdGlibGVXaXRoKHRlc3QpKSkgeworICAgICAgICAgICAgcHJqLnNldE5ld1Byb3BlcnR5KHByb3BlcnR5TmFtZSwgInRydWUiKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM3LDIxICsxMjYsMTYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobnVsbCA9PSByZXF1aXJlZEV4dGVuc2lvbikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiRXh0ZW5zaW9uIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXh0ZW5zaW9uIGVsZW1lbnQgbXVzdCBiZSBzcGVjaWZpZWQuIik7CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCA9PSBsaWJyYXJ5RmlsZSAmJiBleHRlbnNpb25GaWxlU2V0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgYXR0cmlidXRlIG5vdCBzcGVjaWZpZWQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBsaWJyYXJ5RmlsZSAmJiAhbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgJyIgKyBsaWJyYXJ5RmlsZSArICInIGRvZXMgbm90IGV4aXN0LiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gbGlicmFyeUZpbGUgJiYgIWxpYnJhcnlGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJcJyIgKyBsaWJyYXJ5RmlsZSArICJcJyBpcyBub3QgYSBmaWxlLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIGlmIChudWxsID09IGxpYnJhcnlGaWxlKSB7CisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uRmlsZVNldHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlIGF0dHJpYnV0ZSBub3Qgc3BlY2lmaWVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFsaWJyYXJ5RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICclcycgZG9lcyBub3QgZXhpc3QuIiwgbGlicmFyeUZpbGUpOworICAgICAgICB9IGVsc2UgaWYgKCFsaWJyYXJ5RmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCInJXMnIGlzIG5vdCBhIGZpbGUuIiwgbGlicmFyeUZpbGUpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYkRpc3BsYXlUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliRGlzcGxheVRhc2suamF2YQppbmRleCBkNDQxYjMyLi5jOTBmOTgwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliRGlzcGxheVRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliRGlzcGxheVRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zNCw4ICszNCw4IEBACiAgKiBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIGluIHRoZSBKREsxLjMKICAqIGRvY3VtZW50YXRpb24gaW4gdGhlIGRpcmVjdG9yeQogICogJEpES19IT01FL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwuIEFsdGVybmF0aXZlbHkgaXQgaXMKLSAqIGF2YWlsYWJsZSBvbmxpbmUgYXQgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sIj4KLSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPgorICogYXZhaWxhYmxlIG9ubGluZSBhdCA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgorICogaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9hPi48L3A+CiAgKgogICogQGFudC50YXNrIG5hbWU9ImphcmxpYi1kaXNwbGF5IgogICovCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICogRmlsZXNldHMgc3BlY2lmeWluZyBhbGwgdGhlIGxpYnJhcmllcwogICAgICAqIHRvIGRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgbGlicmFyeUZpbGVTZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlU2V0PiBsaWJyYXJ5RmlsZVNldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBKQVIgbGlicmFyeSB0byBkaXNwbGF5IGluZm9ybWF0aW9uIGZvci4KQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgKiBAcGFyYW0gZmlsZVNldCBhIHNldCBvZiBmaWxlcyBhYm91dCB3aGljaCBsaWJyYXJ5IGRhdGEgd2lsbCBiZSBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChmaW5hbCBGaWxlU2V0IGZpbGVTZXQpIHsKLSAgICAgICAgbGlicmFyeUZpbGVTZXRzLmFkZEVsZW1lbnQoZmlsZVNldCk7CisgICAgICAgIGxpYnJhcnlGaWxlU2V0cy5hZGQoZmlsZVNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NCwyNiArNzQsMjMgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAKICAgICAgICAgZmluYWwgTGlicmFyeURpc3BsYXllciBkaXNwbGF5ZXIgPSBuZXcgTGlicmFyeURpc3BsYXllcigpOwogICAgICAgICAvLyBDaGVjayBpZiBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGhhcyBiZWVuIHNwZWNpZmllZAotICAgICAgICBpZiAoIWxpYnJhcnlGaWxlU2V0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlicmFyeUZpbGVTZXRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZVNldCBmaWxlU2V0ID0gKEZpbGVTZXQpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIKLSAgICAgICAgICAgICAgICAgICAgPSBmaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgaWYgKGxpYnJhcnlGaWxlU2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRpc3BsYXllci5kaXNwbGF5TGlicmFyeShsaWJyYXJ5RmlsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKEZpbGVTZXQgZmlsZVNldCA6IGxpYnJhcnlGaWxlU2V0cykgeworICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9CisgICAgICAgICAgICAgICAgICAgIGZpbGVTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IHNjYW5uZXIuZ2V0QmFzZWRpcigpOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShiYXNlZGlyLCBmaWxlc1sgaSBdKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVyLmRpc3BsYXlMaWJyYXJ5KGZpbGUpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzcGxheWVyLmRpc3BsYXlMaWJyYXJ5KG5ldyBGaWxlKGJhc2VkaXIsIGZpbGVuYW1lKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGlzcGxheWVyLmRpc3BsYXlMaWJyYXJ5KGxpYnJhcnlGaWxlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTAzLDE3ICsxMDAsMTQgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGludmFsaWQgcGFyYW1ldGVycyBmb3VuZAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChudWxsID09IGxpYnJhcnlGaWxlICYmIGxpYnJhcnlGaWxlU2V0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgYXR0cmlidXRlIG5vdCBzcGVjaWZpZWQuIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobnVsbCAhPSBsaWJyYXJ5RmlsZSAmJiAhbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZpbGUgJyIgKyBsaWJyYXJ5RmlsZSArICInIGRvZXMgbm90IGV4aXN0LiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG51bGwgIT0gbGlicmFyeUZpbGUgJiYgIWxpYnJhcnlGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJcJyIgKyBsaWJyYXJ5RmlsZSArICJcJyBpcyBub3QgYSBmaWxlLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIGlmIChudWxsID09IGxpYnJhcnlGaWxlKSB7CisgICAgICAgICAgICBpZiAobGlicmFyeUZpbGVTZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBhdHRyaWJ1dGUgbm90IHNwZWNpZmllZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbGlicmFyeUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0LiIsIGxpYnJhcnlGaWxlKTsKKyAgICAgICAgfSBlbHNlIGlmICghbGlicmFyeUZpbGUuaXNGaWxlKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJyVzJyBpcyBub3QgYSBmaWxlLiIsIGxpYnJhcnlGaWxlKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJNYW5pZmVzdFRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJNYW5pZmVzdFRhc2suamF2YQppbmRleCA5OTQxYzg2Li5hYzRkOTE0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliTWFuaWZlc3RUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0phckxpYk1hbmlmZXN0VGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTggKzE4LDIxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5qYXIuQXR0cmlidXRlczsKIGltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogCiAvKioKICAqIEdlbmVyYXRlcyBhIG1hbmlmZXN0IHRoYXQgZGVjbGFyZXMgYWxsIHRoZSBkZXBlbmRlbmNpZXMuCkBAIC00MSw4ICs0NCw4IEBACiAgKiBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcyBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIGluIHRoZSBKREsxLjMKICAqIGRvY3VtZW50YXRpb24gaW4gdGhlIGRpcmVjdG9yeQogICogJEpES19IT01FL2RvY3MvZ3VpZGUvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwuIEFsdGVybmF0aXZlbHkgaXQgaXMKLSAqIGF2YWlsYWJsZSBvbmxpbmUgYXQgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuMy9kb2NzL2d1aWRlL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sIj4KLSAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9ndWlkZS9leHRlbnNpb25zL3ZlcnNpb25pbmcuaHRtbDwvYT4uPC9wPgorICogYXZhaWxhYmxlIG9ubGluZSBhdCA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvZXh0ZW5zaW9ucy92ZXJzaW9uaW5nLmh0bWwiPgorICogaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL2V4dGVuc2lvbnMvdmVyc2lvbmluZy5odG1sPC9hPi48L3A+CiAgKgogICogQGFudC50YXNrIG5hbWU9ImphcmxpYi1tYW5pZmVzdCIKICAqLwpAQCAtNzEsMTkgKzc0LDE5IEBACiAgICAgICogRXh0ZW5zaW9uQWRhcHRlciBvYmplY3RzIHJlcHJlc2VudGluZwogICAgICAqIGRlcGVuZGVuY2llcyByZXF1aXJlZCBieSBsaWJyYXJ5LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IGRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RXh0ZW5zaW9uU2V0PiBkZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIEV4dGVuc2lvbkFkYXB0ZXIgb2JqZWN0cyByZXByZXNlbnRpbmcgb3B0aW9uYWwKICAgICAgKiBkZXBlbmRlbmNpZXMgcmVxdWlyZWQgYnkgbGlicmFyeS4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBvcHRpb25hbHMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEV4dGVuc2lvblNldD4gb3B0aW9uYWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBFeHRyYSBhdHRyaWJ1dGVzIHRoZSB1c2VyIHNwZWNpZmllcyBmb3IgbWFpbiBzZWN0aW9uCiAgICAgICogaW4gbWFuaWZlc3QuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3QgZXh0cmFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFeHRyYUF0dHJpYnV0ZT4gZXh0cmFBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBUaGUgbG9jYXRpb24gd2hlcmUgZ2VuZXJhdGVkIG1hbmlmZXN0IGlzIHBsYWNlZC4KQEAgLTEwNSw3ICsxMDgsOCBAQAogICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRFeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uQWRhcHRlciBleHRlbnNpb25BZGFwdGVyKQogICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG51bGwgIT0gZXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbiBub3QgaGF2ZSBtdWx0aXBsZSBleHRlbnNpb25zIGRlZmluZWQgaW4gb25lIGxpYnJhcnkuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkNhbiBub3QgaGF2ZSBtdWx0aXBsZSBleHRlbnNpb25zIGRlZmluZWQgaW4gb25lIGxpYnJhcnkuIik7CiAgICAgICAgIH0KICAgICAgICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uQWRhcHRlci50b0V4dGVuc2lvbigpOwogICAgIH0KQEAgLTE0Miw2ICsxNDYsNyBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgdGFzayBmYWlscy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdmFsaWRhdGUoKTsKIApAQCAtMTU5LDEzICsxNjQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vQWRkIGFsbCB0aGUgZGVwZW5kZW5jeSBkYXRhIHRvIG1hbmlmZXN0IGZvciBkZXBlbmRlbmNpZXMKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IGRlcGVuZHMgPSB0b0V4dGVuc2lvbnMoZGVwZW5kZW5jaWVzKTsKKyAgICAgICAgZmluYWwgTGlzdDxFeHRlbnNpb24+IGRlcGVuZHMgPSB0b0V4dGVuc2lvbnMoZGVwZW5kZW5jaWVzKTsKICAgICAgICAgYXBwZW5kRXh0ZW5zaW9uTGlzdChhdHRyaWJ1dGVzLCBFeHRlbnNpb24uRVhURU5TSU9OX0xJU1QsICJsaWIiLCBkZXBlbmRzLnNpemUoKSk7CiAgICAgICAgIGFwcGVuZExpYnJhcnlMaXN0KGF0dHJpYnV0ZXMsICJsaWIiLCBkZXBlbmRzKTsKIAogICAgICAgICAvLyBBZGQgYWxsIHRoZSBkZXBlbmRlbmN5IGRhdGEgdG8gbWFuaWZlc3QgZm9yICJvcHRpb25hbCIKICAgICAgICAgLy9kZXBlbmRlbmNpZXMKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IG9wdGlvbiA9IHRvRXh0ZW5zaW9ucyhvcHRpb25hbHMpOworICAgICAgICBmaW5hbCBMaXN0PEV4dGVuc2lvbj4gb3B0aW9uID0gdG9FeHRlbnNpb25zKG9wdGlvbmFscyk7CiAgICAgICAgIGFwcGVuZEV4dGVuc2lvbkxpc3QoYXR0cmlidXRlcywgRXh0ZW5zaW9uLk9QVElPTkFMX0VYVEVOU0lPTl9MSVNULCAib3B0Iiwgb3B0aW9uLnNpemUoKSk7CiAgICAgICAgIGFwcGVuZExpYnJhcnlMaXN0KGF0dHJpYnV0ZXMsICJvcHQiLCBvcHRpb24pOwogCkBAIC0xODcsNyArMTkyLDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGVzdGZpbGUgYXR0cmlidXRlIG5vdCBzcGVjaWZpZWQuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlc3RGaWxlLmV4aXN0cygpICYmICFkZXN0RmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGRlc3RGaWxlICsgIiBpcyBub3QgYSBmaWxlLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBpcyBub3QgYSBmaWxlLiIsIGRlc3RGaWxlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTk4LDEyICsyMDMsOCBAQAogICAgICAqICAgICAgICBhdHRyaWJ1dGVzIHRvCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEV4dHJhQXR0cmlidXRlcyhmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlcmF0b3IgPSBleHRyYUF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmluYWwgRXh0cmFBdHRyaWJ1dGUgYXR0cmlidXRlID0KLSAgICAgICAgICAgICAgICAoRXh0cmFBdHRyaWJ1dGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUoYXR0cmlidXRlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgZm9yIChFeHRyYUF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBleHRyYUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMucHV0VmFsdWUoYXR0cmlidXRlLmdldE5hbWUoKSwgYXR0cmlidXRlLmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTQsMTMgKzIxNSw5IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBlcnJvciB3cml0aW5nIGZpbGUKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgd3JpdGVNYW5pZmVzdChmaW5hbCBNYW5pZmVzdCBtYW5pZmVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdEZpbGUpOworICAgICAgICB0cnkgKE91dHB1dFN0cmVhbSBvdXRwdXQgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZGVzdEZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICBtYW5pZmVzdC53cml0ZShvdXRwdXQpOwogICAgICAgICAgICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0cHV0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjM2LDEyICsyMzMsMTEgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhcHBlbmRMaWJyYXJ5TGlzdChmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIGZpbmFsIFN0cmluZyBsaXN0UHJlZml4LAotICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0IGV4dGVuc2lvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEV4dGVuc2lvbj4gZXh0ZW5zaW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgaW50IHNpemUgPSBleHRlbnNpb25zLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHQgPSAoRXh0ZW5zaW9uKSBleHRlbnNpb25zLmdldChpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBsaXN0UHJlZml4ICsgaSArICItIjsKLSAgICAgICAgICAgIEV4dGVuc2lvbi5hZGRFeHRlbnNpb24oZXh0LCBwcmVmaXgsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgRXh0ZW5zaW9uLmFkZEV4dGVuc2lvbihleHRlbnNpb25zLmdldChpKSwgbGlzdFByZWZpeCArIGkgKyAiLSIsCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1OCwxNSArMjU0LDEwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZEV4dGVuc2lvbkxpc3QoZmluYWwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLAogICAgICAgICAgICAgZmluYWwgQXR0cmlidXRlcy5OYW1lIGV4dGVuc2lvbktleSwgZmluYWwgU3RyaW5nIGxpc3RQcmVmaXgsIGZpbmFsIGludCBzaXplKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChsaXN0UHJlZml4KTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOwotICAgICAgICB9CiAgICAgICAgIC8vYWRkIGluIHNvbWV0aGluZyBsaWtlCiAgICAgICAgIC8vIkV4dGVuc2lvbi1MaXN0OiBqYXZhaGVscCBqYXZhM2QiCi0gICAgICAgIGF0dHJpYnV0ZXMucHV0KGV4dGVuc2lvbktleSwgc2IudG9TdHJpbmcoKSk7CisgICAgICAgIGF0dHJpYnV0ZXMucHV0KGV4dGVuc2lvbktleSwgSW50U3RyZWFtLnJhbmdlKDAsIHNpemUpCisgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBsaXN0UHJlZml4ICsgaSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiAiKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc1LDE3ICsyNjYsMTAgQEAKICAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uU2V0cyB0aGUgbGlzdCBvZiBFeHRlbnNpb25TZXRzIHRvIGFkZCB0byBsaXN0CiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCB0b0V4dGVuc2lvbnMoZmluYWwgQXJyYXlMaXN0IGV4dGVuc2lvblNldHMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgICAgIGZpbmFsIGludCBzaXplID0gZXh0ZW5zaW9uU2V0cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25TZXQgc2V0ID0gKEV4dGVuc2lvblNldCkgZXh0ZW5zaW9uU2V0cy5nZXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25bXSBleHRlbnNpb25zID0gc2V0LnRvRXh0ZW5zaW9ucyhnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHRlbnNpb25zLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5hZGQoZXh0ZW5zaW9uc1sgaiBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICBwcml2YXRlIExpc3Q8RXh0ZW5zaW9uPiB0b0V4dGVuc2lvbnMoZmluYWwgTGlzdDxFeHRlbnNpb25TZXQ+IGV4dGVuc2lvblNldHMpCisgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByb2plY3QgcHJqID0gZ2V0UHJvamVjdCgpOworICAgICAgICByZXR1cm4gZXh0ZW5zaW9uU2V0cy5zdHJlYW0oKS5tYXAoeHNldCAtPiB4c2V0LnRvRXh0ZW5zaW9ucyhwcmopKQorICAgICAgICAgICAgLmZsYXRNYXAoU3RyZWFtOjpvZikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vSmFyTGliUmVzb2x2ZVRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJSZXNvbHZlVGFzay5qYXZhCmluZGV4IDllYmI0ZTMuLmU3ZjU1YjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJSZXNvbHZlVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9KYXJMaWJSZXNvbHZlVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNiArMTksNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNDksNyArNTAsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBzZXQgb2YgcmVzb2x2ZXJzIHRvIHVzZSB0byBhdHRlbXB0IHRvIGxvY2F0ZSBsaWJyYXJ5LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0IHJlc29sdmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RXh0ZW5zaW9uUmVzb2x2ZXI+IHJlc29sdmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0IHlvdSBzaG91bGQgY2hlY2sgdGhhdApAQCAtMTMyLDkgKzEzMyw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25BZGFwdGVyIGV4dGVuc2lvbikgewogICAgICAgICBpZiAobnVsbCAhPSByZXF1aXJlZEV4dGVuc2lvbikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiQ2FuIG5vdCBzcGVjaWZ5IGV4dGVuc2lvbiB0byAiCi0gICAgICAgICAgICAgICAgKyAicmVzb2x2ZSBtdWx0aXBsZSB0aW1lcy4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW4gbm90IHNwZWNpZnkgZXh0ZW5zaW9uIHRvIHJlc29sdmUgbXVsdGlwbGUgdGltZXMuIik7CiAgICAgICAgIH0KICAgICAgICAgcmVxdWlyZWRFeHRlbnNpb24gPSBleHRlbnNpb24udG9FeHRlbnNpb24oKTsKICAgICB9CkBAIC0xNDQsNiArMTQ0LDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CiAKQEAgLTE2MCwyOCArMTYxLDI2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlc29sdmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZXNvbHZlciByZXNvbHZlciA9Ci0gICAgICAgICAgICAgICAgKEV4dGVuc2lvblJlc29sdmVyKSByZXNvbHZlcnMuZ2V0KGkpOwotCisgICAgICAgIGZvciAoRXh0ZW5zaW9uUmVzb2x2ZXIgcmVzb2x2ZXIgOiByZXNvbHZlcnMpIHsKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIlNlYXJjaGluZyBmb3IgZXh0ZW5zaW9uIHVzaW5nIFJlc29sdmVyOiIgKyByZXNvbHZlciwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gcmVzb2x2ZXIucmVzb2x2ZShyZXF1aXJlZEV4dGVuc2lvbiwgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPQorICAgICAgICAgICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKHJlcXVpcmVkRXh0ZW5zaW9uLCBnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGNoZWNrRXh0ZW5zaW9uKGZpbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiRmlsZSAiICsgZmlsZSArICIgcmV0dXJuZWQgYnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlc29sdmVyIGZhaWxlZCB0byBzYXRpc2Z5IGV4dGVuc2lvbiBkdWUgdG86ICIgKyBiZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2cobWVzc2FnZSwgUHJvamVjdC5NU0dfV0FSTik7CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIkZpbGUgIiArIGZpbGUgKyAiIHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInJlc29sdmVyIGZhaWxlZCB0byBzYXRpc2Z5IGV4dGVuc2lvbiBkdWUgdG86ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYmUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCB0byByZXNvbHZlIGV4dGVuc2lvbiB0byBmaWxlICIgKyAidXNpbmcgcmVzb2x2ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvbHZlciArICIgZHVlIHRvOiAiICsgYmU7Ci0gICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZyhtZXNzYWdlLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZSBleHRlbnNpb24gdG8gZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidXNpbmcgcmVzb2x2ZXIgIiArIHJlc29sdmVyICsgIiBkdWUgdG86ICIgKyBiZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1pc3NpbmdFeHRlbnNpb24oKTsKQEAgLTIxMCwxMCArMjA5LDEwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRXh0ZW5zaW9uKGZpbmFsIEZpbGUgZmlsZSkgewogICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAiICsgZmlsZSArICIgZG9lcyBub3QgZXhpc3QiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGUpOwogICAgICAgICB9CiAgICAgICAgIGlmICghZmlsZS5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICIgKyBmaWxlICsgIiBpcyBub3QgYSBmaWxlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgJXMgaXMgbm90IGEgZmlsZSIsIGZpbGUpOwogICAgICAgICB9CiAgICAgICAgIGlmICghY2hlY2tFeHRlbnNpb24pIHsKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIlNldHRpbmcgcHJvcGVydHkgdG8gIiArIGZpbGUKQEAgLTIyMyw5ICsyMjIsNyBAQAogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiQ2hlY2tpbmcgZmlsZSAiICsgZmlsZSArICIgdG8gc2VlIGlmIGl0IHNhdGlzZmllcyBleHRlbnNpb24iLAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIGZpbmFsIE1hbmlmZXN0IG1hbmlmZXN0ID0gRXh0ZW5zaW9uVXRpbC5nZXRNYW5pZmVzdChmaWxlKTsKLSAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBFeHRlbnNpb24uZ2V0QXZhaWxhYmxlKG1hbmlmZXN0KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zWyBpIF07CisgICAgICAgICAgICBmb3IgKGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24gOiBFeHRlbnNpb24uZ2V0QXZhaWxhYmxlKG1hbmlmZXN0KSkgewogICAgICAgICAgICAgICAgIGlmIChleHRlbnNpb24uaXNDb21wYXRpYmxlV2l0aChyZXF1aXJlZEV4dGVuc2lvbikpIHsKICAgICAgICAgICAgICAgICAgICAgc2V0TGlicmFyeVByb3BlcnR5KGZpbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CkBAIC0yNTYsMTMgKzI1MywxMCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChudWxsID09IHByb3BlcnR5TmFtZSkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiUHJvcGVydHkgYXR0cmlidXRlIG11c3QgYmUgc3BlY2lmaWVkLiI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb3BlcnR5IGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4iKTsKICAgICAgICAgfQotCiAgICAgICAgIGlmIChudWxsID09IHJlcXVpcmVkRXh0ZW5zaW9uKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJFeHRlbnNpb24gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4iOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeHRlbnNpb24gZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4iKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJGaWxlU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vTGliRmlsZVNldC5qYXZhCmluZGV4IDk0ZGM4NzkuLjI0NDk0ZjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJGaWxlU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0xpYkZpbGVTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDggKzI1LDcgQEAKICAqIGhvdyB0aGV5IGFyZSB0byBiZSBoYW5kbGVkIHdoZW4gYnVpbGRpbmcgbWFuaWZlc3RzLgogICoKICAqLwotcHVibGljIGNsYXNzIExpYkZpbGVTZXQKLSAgICBleHRlbmRzIEZpbGVTZXQgeworcHVibGljIGNsYXNzIExpYkZpbGVTZXQgZXh0ZW5kcyBGaWxlU2V0IHsKICAgICAvKioKICAgICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciBzaG91bGQgaW5jbHVkZSB0aGUKICAgICAgKiAiSW1wbGVtZW50YXRpb24tVVJMIiBhdHRyaWJ1dGUgaW4gbWFuaWZlc3QuCkBAIC00NSwxMCArNDQsMTAgQEAKICAgICAgKiBTdHJpbmcgdGhhdCBpcyB0aGUgYmFzZSBVUkwgZm9yIHRoZSBsaWJyYXJpZXMKICAgICAgKiB3aGVuIGNvbnN0cnVjdGluZyB0aGUgIkltcGxlbWVudGF0aW9uLVVSTCIKICAgICAgKiBhdHRyaWJ1dGUuIEZvciBpbnN0YW5jZSBzZXR0aW5nIHRoZSBiYXNlIHRvCi0gICAgICogImh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvYXZhbG9uL2xpYnMvIiBhbmQgdGhlbgorICAgICAqICJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9hdmFsb24vbGlicy8iIGFuZCB0aGVuCiAgICAgICogaW5jbHVkaW5nIHRoZSBsaWJyYXJ5ICJleGNhbGlidXItY2xpLTEuMC5qYXIiIGluIHRoZQogICAgICAqIGZpbGVzZXQgd2lsbCByZXN1bHQgaW4gdGhlICJJbXBsZW1lbnRhdGlvbi1VUkwiIGF0dHJpYnV0ZQotICAgICAqIGJlaW5nIHNldCB0byAiaHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9hdmFsb24vbGlicy9leGNhbGlidXItY2xpLTEuMC5qYXIiCisgICAgICogYmVpbmcgc2V0IHRvICJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9hdmFsb24vbGlicy9leGNhbGlidXItY2xpLTEuMC5qYXIiCiAgICAgICoKICAgICAgKiBOb3RlIHRoaXMgaXMgb25seSB1c2VkIGlmIHRoZSBsaWJyYXJ5IGRvZXMgbm90IGRlZmluZQogICAgICAqICJJbXBsZW1lbnRhdGlvbi1VUkwiIGl0c2VsZi4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJyYXJ5RGlzcGxheWVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vTGlicmFyeURpc3BsYXllci5qYXZhCmluZGV4IDNlZWJjNjMuLjU2ZDY0YTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9MaWJyYXJ5RGlzcGxheWVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL0xpYnJhcnlEaXNwbGF5ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEzNCwxMiArMTM0LDkgQEAKICAgICBwcml2YXRlIHZvaWQgZGlzcGxheVNwZWNpZmljYXRpb24oZmluYWwgU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlY3Rpb25zID0gc3BlY2lmaWNhdGlvbi5nZXRTZWN0aW9ucygpOwogICAgICAgICBpZiAobnVsbCAhPSBzZWN0aW9ucykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiU2VjdGlvbnM6ICIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzZWN0aW9uc1sgaSBdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzYik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJTZWN0aW9uczogICIpOworICAgICAgICAgICAgU3lzdGVtLm91dAorICAgICAgICAgICAgICAgIC5wcmludGxuKFN0cmluZy5qb2luKCIgIiwgc2VjdGlvbnMpKTsKICAgICAgICAgfQogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oc3BlY2lmaWNhdGlvbi50b1N0cmluZygpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vU3BlY2lmaWNhdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL1NwZWNpZmljYXRpb24uamF2YQppbmRleCA4YjA5Yjk4Li41YzAzOGQ0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vU3BlY2lmaWNhdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9TcGVjaWZpY2F0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxNCArMTksMTYgQEAKIAogaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuamFyLkF0dHJpYnV0ZXM7CiBpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRGV3ZXlEZWNpbWFsOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogPHA+VXRpbGl0eSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgZWl0aGVyIGFuIGF2YWlsYWJsZSAiT3B0aW9uYWwgUGFja2FnZSIKQEAgLTE2NywyNSArMTY5LDE2IEBACiAgICAgcHVibGljIHN0YXRpYyBTcGVjaWZpY2F0aW9uW10gZ2V0U3BlY2lmaWNhdGlvbnMoZmluYWwgTWFuaWZlc3QgbWFuaWZlc3QpCiAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChudWxsID09IG1hbmlmZXN0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNwZWNpZmljYXRpb25bIDAgXTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3BlY2lmaWNhdGlvblswXTsKICAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0PFNwZWNpZmljYXRpb24+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgICAgICBmaW5hbCBBcnJheUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBmaW5hbCBNYXAgZW50cmllcyA9IG1hbmlmZXN0LmdldEVudHJpZXMoKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3Iga2V5cyA9IGVudHJpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSAoQXR0cmlidXRlcykgZW50cmllcy5nZXQoa2V5KTsKLSAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbgotICAgICAgICAgICAgICAgID0gZ2V0U3BlY2lmaWNhdGlvbihrZXksIGF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgaWYgKG51bGwgIT0gc3BlY2lmaWNhdGlvbikgewotICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHNwZWNpZmljYXRpb24pOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEF0dHJpYnV0ZXM+IGUgOiBtYW5pZmVzdC5nZXRFbnRyaWVzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRTcGVjaWZpY2F0aW9uKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSkpCisgICAgICAgICAgICAgICAgLmlmUHJlc2VudChyZXN1bHRzOjphZGQpOwogICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXJyYXlMaXN0IHRyaW1tZWRSZXN1bHRzID0gcmVtb3ZlRHVwbGljYXRlcyhyZXN1bHRzKTsKLSAgICAgICAgcmV0dXJuIChTcGVjaWZpY2F0aW9uW10pIHRyaW1tZWRSZXN1bHRzLnRvQXJyYXkobmV3IFNwZWNpZmljYXRpb25bdHJpbW1lZFJlc3VsdHMuc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiByZW1vdmVEdXBsaWNhdGVzKHJlc3VsdHMpCisgICAgICAgICAgICAudG9BcnJheShuZXcgU3BlY2lmaWNhdGlvbltyZW1vdmVEdXBsaWNhdGVzKHJlc3VsdHMpLnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM5LDEwICsyMzIsMTAgQEAKICAgICAgICAgICAgICAgICB0aGlzLnNwZWNpZmljYXRpb25WZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgID0gbmV3IERld2V5RGVjaW1hbChzcGVjaWZpY2F0aW9uVmVyc2lvbik7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gIkJhZCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gZm9ybWF0ICciCi0gICAgICAgICAgICAgICAgICAgICsgc3BlY2lmaWNhdGlvblZlcnNpb24gKyAiJyBpbiAnIiArIHNwZWNpZmljYXRpb25UaXRsZQotICAgICAgICAgICAgICAgICAgICArICInLiAoUmVhc29uOiAiICsgbmZlICsgIikiOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJCYWQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGZvcm1hdCAnIiArIHNwZWNpZmljYXRpb25WZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICArICInIGluICciICsgc3BlY2lmaWNhdGlvblRpdGxlICsgIicuIChSZWFzb246ICIgKyBuZmUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIikiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNTMsMTMgKzI0Niw3IEBACiAgICAgICAgIGlmIChudWxsID09IHRoaXMuc3BlY2lmaWNhdGlvblRpdGxlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInNwZWNpZmljYXRpb25UaXRsZSIpOwogICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gY29weSA9IG51bGw7Ci0gICAgICAgIGlmIChudWxsICE9IHNlY3Rpb25zKSB7Ci0gICAgICAgICAgICBjb3B5ID0gbmV3IFN0cmluZ1sgc2VjdGlvbnMubGVuZ3RoIF07Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlY3Rpb25zLCAwLCBjb3B5LCAwLCBzZWN0aW9ucy5sZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc2VjdGlvbnMgPSBjb3B5OworICAgICAgICB0aGlzLnNlY3Rpb25zID0gc2VjdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBzZWN0aW9ucy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI0LDEyICszMTEsNyBAQAogICAgICAqICAgICAgICAgb3IgbnVsbCBpZiByZWxldmFudCB0byBubyBzZWN0aW9ucy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U2VjdGlvbnMoKSB7Ci0gICAgICAgIGlmIChudWxsID09IHNlY3Rpb25zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmdbXSBuZXdTZWN0aW9ucyA9IG5ldyBTdHJpbmdbIHNlY3Rpb25zLmxlbmd0aCBdOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHNlY3Rpb25zLCAwLCBuZXdTZWN0aW9ucywgMCwgc2VjdGlvbnMubGVuZ3RoKTsKLSAgICAgICAgcmV0dXJuIG5ld1NlY3Rpb25zOworICAgICAgICByZXR1cm4gc2VjdGlvbnMgPT0gbnVsbCA/IG51bGwgOiBzZWN0aW9ucy5jbG9uZSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzQ4LDMzICszMzAsMjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIEF2YWlsYWJsZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gbXVzdCBiZSA+PSByZXF1aXJlZAotICAgICAgICBmaW5hbCBEZXdleURlY2ltYWwgb3RoZXJTcGVjaWZpY2F0aW9uVmVyc2lvbgotICAgICAgICAgICAgPSBvdGhlci5nZXRTcGVjaWZpY2F0aW9uVmVyc2lvbigpOwotICAgICAgICBpZiAobnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVyc2lvbikgewotICAgICAgICAgICAgaWYgKG51bGwgPT0gb3RoZXJTcGVjaWZpY2F0aW9uVmVyc2lvbgotICAgICAgICAgICAgICAgIHx8ICFpc0NvbXBhdGlibGUoc3BlY2lmaWNhdGlvblZlcnNpb24sIG90aGVyU3BlY2lmaWNhdGlvblZlcnNpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJFUVVJUkVfU1BFQ0lGSUNBVElPTl9VUEdSQURFOwotICAgICAgICAgICAgfQorICAgICAgICBmaW5hbCBEZXdleURlY2ltYWwgb3RoZXJTcGVjaWZpY2F0aW9uVmVyc2lvbiA9IG90aGVyLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCk7CisgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZXJzaW9uICYmIChudWxsID09IG90aGVyU3BlY2lmaWNhdGlvblZlcnNpb24KKyAgICAgICAgICAgICAgICB8fCAhaXNDb21wYXRpYmxlKHNwZWNpZmljYXRpb25WZXJzaW9uLCBvdGhlclNwZWNpZmljYXRpb25WZXJzaW9uKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBSRVFVSVJFX1NQRUNJRklDQVRJT05fVVBHUkFERTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIFZlbmRvciBJRCBtdXN0IG1hdGNoCi0gICAgICAgIGZpbmFsIFN0cmluZyBvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yCi0gICAgICAgICAgICA9IG90aGVyLmdldEltcGxlbWVudGF0aW9uVmVuZG9yKCk7Ci0gICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yKSB7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSBvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yCi0gICAgICAgICAgICAgICAgfHwgIWltcGxlbWVudGF0aW9uVmVuZG9yLmVxdWFscyhvdGhlckltcGxlbWVudGF0aW9uVmVuZG9yKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBSRVFVSVJFX1ZFTkRPUl9TV0lUQ0g7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVuZG9yCisgICAgICAgICAgICAgICAgJiYgIWltcGxlbWVudGF0aW9uVmVuZG9yLmVxdWFscyhvdGhlci5nZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpKSkgeworICAgICAgICAgICAgcmV0dXJuIFJFUVVJUkVfVkVORE9SX1NXSVRDSDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIHZlcnNpb24gbXVzdCBiZSA+PSByZXF1aXJlZAotICAgICAgICBmaW5hbCBTdHJpbmcgb3RoZXJJbXBsZW1lbnRhdGlvblZlcnNpb24KLSAgICAgICAgICAgID0gb3RoZXIuZ2V0SW1wbGVtZW50YXRpb25WZXJzaW9uKCk7Ci0gICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbikgewotICAgICAgICAgICAgaWYgKG51bGwgPT0gb3RoZXJJbXBsZW1lbnRhdGlvblZlcnNpb24KLSAgICAgICAgICAgICAgICB8fCAhaW1wbGVtZW50YXRpb25WZXJzaW9uLmVxdWFscyhvdGhlckltcGxlbWVudGF0aW9uVmVyc2lvbikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUkVRVUlSRV9JTVBMRU1FTlRBVElPTl9DSEFOR0U7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbgorICAgICAgICAgICAgICAgICYmICFpbXBsZW1lbnRhdGlvblZlcnNpb24uZXF1YWxzKG90aGVyLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpKSkgeworICAgICAgICAgICAgcmV0dXJuIFJFUVVJUkVfSU1QTEVNRU5UQVRJT05fQ0hBTkdFOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVGhpcyBhdmFpbGFibGUgb3B0aW9uYWwgcGFja2FnZSBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cwpAQCAtMzkwLDcgKzM2MSw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGlzIGNvbXBhdGlibGUgd2l0aCB0aGlzIHNwZWNpZmljYXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoKGZpbmFsIFNwZWNpZmljYXRpb24gb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIChDT01QQVRJQkxFID09IGdldENvbXBhdGliaWxpdHlXaXRoKG90aGVyKSk7CisgICAgICAgIHJldHVybiBDT01QQVRJQkxFID09IGdldENvbXBhdGliaWxpdHlXaXRoKG90aGVyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM5OCw0OCArMzY5LDMxIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGJyYWNlID0gIjogIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZvcm1hdCA9ICIlczogJXMlbiI7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiCi0gICAgICAgICAgICA9IG5ldyBTdHJpbmdCdWZmZXIoU1BFQ0lGSUNBVElPTl9USVRMRS50b1N0cmluZygpKTsKLSAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKLSAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25UaXRsZSk7Ci0gICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihTdHJpbmcuZm9ybWF0KGZvcm1hdCwKKyAgICAgICAgICAgICAgICBTUEVDSUZJQ0FUSU9OX1RJVExFLCBzcGVjaWZpY2F0aW9uVGl0bGUpKTsKIAogICAgICAgICBpZiAobnVsbCAhPSBzcGVjaWZpY2F0aW9uVmVyc2lvbikgewotICAgICAgICAgICAgc2IuYXBwZW5kKFNQRUNJRklDQVRJT05fVkVSU0lPTik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25WZXJzaW9uKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdChmb3JtYXQsIFNQRUNJRklDQVRJT05fVkVSU0lPTiwgc3BlY2lmaWNhdGlvblZlcnNpb24pKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsICE9IHNwZWNpZmljYXRpb25WZW5kb3IpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChTUEVDSUZJQ0FUSU9OX1ZFTkRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKHNwZWNpZmljYXRpb25WZW5kb3IpOwotICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdCwgU1BFQ0lGSUNBVElPTl9WRU5ET1IsIHNwZWNpZmljYXRpb25WZW5kb3IpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVGl0bGUpIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZChJTVBMRU1FTlRBVElPTl9USVRMRSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVGl0bGUpOwotICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdCwgSU1QTEVNRU5UQVRJT05fVElUTEUsIGltcGxlbWVudGF0aW9uVGl0bGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChudWxsICE9IGltcGxlbWVudGF0aW9uVmVyc2lvbikgewotICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1ZFUlNJT04pOwotICAgICAgICAgICAgc2IuYXBwZW5kKGJyYWNlKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChpbXBsZW1lbnRhdGlvblZlcnNpb24pOwotICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KGZvcm1hdCwgSU1QTEVNRU5UQVRJT05fVkVSU0lPTiwgaW1wbGVtZW50YXRpb25WZXJzaW9uKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAobnVsbCAhPSBpbXBsZW1lbnRhdGlvblZlbmRvcikgewotICAgICAgICAgICAgc2IuYXBwZW5kKElNUExFTUVOVEFUSU9OX1ZFTkRPUik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoYnJhY2UpOwotICAgICAgICAgICAgc2IuYXBwZW5kKGltcGxlbWVudGF0aW9uVmVuZG9yKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdChmb3JtYXQsIElNUExFTUVOVEFUSU9OX1ZFTkRPUiwgaW1wbGVtZW50YXRpb25WZW5kb3IpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwpAQCAtNDY3LDMwICs0MjEsMjQgQEAKICAgICAgKiBAcGFyYW0gbGlzdCB0aGUgYXJyYXkgb2YgcmVzdWx0cyB0byB0cmltCiAgICAgICogQHJldHVybiBhbiBhcnJheSBsaXN0IHdpdGggYWxsIGR1cGxpY2F0ZXMgcmVtb3ZlZAogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEFycmF5TGlzdCByZW1vdmVEdXBsaWNhdGVzKGZpbmFsIEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBBcnJheUxpc3Qgc2VjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIHdoaWxlIChsaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gc3BlY2lmaWNhdGlvbiA9IChTcGVjaWZpY2F0aW9uKSBsaXN0LnJlbW92ZSgwKTsKLSAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gb3RoZXIgPSAoU3BlY2lmaWNhdGlvbikgaXRlcmF0b3IubmV4dCgpOworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3BlY2lmaWNhdGlvbj4gcmVtb3ZlRHVwbGljYXRlcyhmaW5hbCBMaXN0PFNwZWNpZmljYXRpb24+IGxpc3QpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTcGVjaWZpY2F0aW9uPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB3aGlsZSAoIWxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTcGVjaWZpY2F0aW9uIHNwZWNpZmljYXRpb24gPSBsaXN0LnJlbW92ZSgwKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8U3BlY2lmaWNhdGlvbj4gaXRlcmF0b3IgPQorICAgICAgICAgICAgICAgIGxpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gb3RoZXIgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICAgaWYgKGlzRXF1YWwoc3BlY2lmaWNhdGlvbiwgb3RoZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG90aGVyU2VjdGlvbnMgPSBvdGhlci5nZXRTZWN0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBvdGhlclNlY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChvdGhlclNlY3Rpb25zKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShvdGhlci5nZXRTZWN0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmlmUHJlc2VudChzIC0+IENvbGxlY3Rpb25zLmFkZEFsbChzZWN0aW9ucywgcykpOwogICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFNwZWNpZmljYXRpb24gbWVyZ2VkID0KLSAgICAgICAgICAgICAgICBtZXJnZUluU2VjdGlvbnMoc3BlY2lmaWNhdGlvbiwgc2VjdGlvbnMpOwotICAgICAgICAgICAgcmVzdWx0cy5hZGQobWVyZ2VkKTsKLSAgICAgICAgICAgIC8vUmVzZXQgbGlzdCBvZiBzZWN0aW9ucworICAgICAgICAgICAgcmVzdWx0cy5hZGQobWVyZ2VJblNlY3Rpb25zKHNwZWNpZmljYXRpb24sIHNlY3Rpb25zKSk7CisgICAgICAgICAgICAvLyBSZXNldCBsaXN0IG9mIHNlY3Rpb25zCiAgICAgICAgICAgICBzZWN0aW9ucy5jbGVhcigpOwogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgfQogCkBAIC01MjIsMjIgKzQ3MCwxOSBAQAogICAgICAqIEByZXR1cm4gdGhlIG1lcmdlZCBzcGVjaWZpY2F0aW9uCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3BlY2lmaWNhdGlvbiBtZXJnZUluU2VjdGlvbnMoZmluYWwgU3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdCBzZWN0aW9uc1RvQWRkKSB7Ci0gICAgICAgIGlmICgwID09IHNlY3Rpb25zVG9BZGQuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNlY3Rpb25zVG9BZGQpIHsKKyAgICAgICAgaWYgKHNlY3Rpb25zVG9BZGQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWNhdGlvbjsKICAgICAgICAgfQotICAgICAgICBzZWN0aW9uc1RvQWRkLmFkZEFsbChBcnJheXMuYXNMaXN0KHNwZWNpZmljYXRpb24uZ2V0U2VjdGlvbnMoKSkpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIHNlY3Rpb25zID0KLSAgICAgICAgICAgIChTdHJpbmdbXSkgc2VjdGlvbnNUb0FkZC50b0FycmF5KG5ldyBTdHJpbmdbc2VjdGlvbnNUb0FkZC5zaXplKCldKTsKKyAgICAgICAgU3RyZWFtPFN0cmluZz4gc2VjdGlvbnMgPSBTdHJlYW0uY29uY2F0KE9wdGlvbmFsLm9mTnVsbGFibGUoc3BlY2lmaWNhdGlvbi5nZXRTZWN0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChTdHJlYW06Om9mKS5vckVsc2UoU3RyZWFtLmVtcHR5KCkpLCBzZWN0aW9uc1RvQWRkLnN0cmVhbSgpKTsKIAogICAgICAgICByZXR1cm4gbmV3IFNwZWNpZmljYXRpb24oc3BlY2lmaWNhdGlvbi5nZXRTcGVjaWZpY2F0aW9uVGl0bGUoKSwKICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldFNwZWNpZmljYXRpb25WZW5kb3IoKSwKICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldEltcGxlbWVudGF0aW9uVGl0bGUoKSwKICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uLmdldEltcGxlbWVudGF0aW9uVmVyc2lvbigpLAotICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24uZ2V0SW1wbGVtZW50YXRpb25WZW5kb3IoKSwKLSAgICAgICAgICAgICAgICBzZWN0aW9ucyk7CisgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbi5nZXRJbXBsZW1lbnRhdGlvblZlbmRvcigpLCBzZWN0aW9ucy50b0FycmF5KFN0cmluZ1tdOjpuZXcpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU2MiwzOCArNTA3LDMyIEBACiAgICAgICAgIC8vV0FSTklORzogV2UgdHJpbSB0aGUgdmFsdWVzIG9mIGFsbCB0aGUgYXR0cmlidXRlcyBiZWNhdXNlCiAgICAgICAgIC8vU29tZSBleHRlbnNpb24gZGVjbGFyYXRpb25zIGFyZSBiYWRseSBkZWZpbmVkIChpZSBoYXZlIHNwYWNlcwogICAgICAgICAvL2FmdGVyIHZlcnNpb24gb3IgdmVuZG9yKQotICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZQotICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU1BFQ0lGSUNBVElPTl9USVRMRSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShTUEVDSUZJQ0FUSU9OX1RJVExFKSk7CiAgICAgICAgIGlmIChudWxsID09IG5hbWUpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZW5kb3IKLSAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKFNQRUNJRklDQVRJT05fVkVORE9SKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzcGVjVmVuZG9yID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKFNQRUNJRklDQVRJT05fVkVORE9SKSk7CiAgICAgICAgIGlmIChudWxsID09IHNwZWNWZW5kb3IpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihNSVNTSU5HICsgU1BFQ0lGSUNBVElPTl9WRU5ET1IsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZXJzaW9uCi0gICAgICAgICAgICA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShTUEVDSUZJQ0FUSU9OX1ZFUlNJT04pKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNwZWNWZXJzaW9uID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKFNQRUNJRklDQVRJT05fVkVSU0lPTikpOwogICAgICAgICBpZiAobnVsbCA9PSBzcGVjVmVyc2lvbikgewogICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBTUEVDSUZJQ0FUSU9OX1ZFUlNJT04sIDApOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGltcFRpdGxlCi0gICAgICAgICAgICA9IGdldFRyaW1tZWRTdHJpbmcoYXR0cmlidXRlcy5nZXRWYWx1ZShJTVBMRU1FTlRBVElPTl9USVRMRSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgaW1wVGl0bGUgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVElUTEUpKTsKICAgICAgICAgaWYgKG51bGwgPT0gaW1wVGl0bGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihNSVNTSU5HICsgSU1QTEVNRU5UQVRJT05fVElUTEUsIDApOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlcnNpb24KLSAgICAgICAgICAgID0gZ2V0VHJpbW1lZFN0cmluZyhhdHRyaWJ1dGVzLmdldFZhbHVlKElNUExFTUVOVEFUSU9OX1ZFUlNJT04pKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlcnNpb24gPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVkVSU0lPTikpOwogICAgICAgICBpZiAobnVsbCA9PSBpbXBWZXJzaW9uKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTUlTU0lORyArIElNUExFTUVOVEFUSU9OX1ZFUlNJT04sIDApOwogICAgICAgICB9CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIGltcFZlbmRvcgotICAgICAgICAgICAgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVkVORE9SKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbXBWZW5kb3IgPSBnZXRUcmltbWVkU3RyaW5nKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoSU1QTEVNRU5UQVRJT05fVkVORE9SKSk7CiAgICAgICAgIGlmIChudWxsID09IGltcFZlbmRvcikgewogICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKE1JU1NJTkcgKyBJTVBMRU1FTlRBVElPTl9WRU5ET1IsIDApOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0FudFJlc29sdmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0FudFJlc29sdmVyLmphdmEKaW5kZXggNjI4NDY3OS4uYjAyZTQxNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9BbnRSZXNvbHZlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvQW50UmVzb2x2ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY2LDYgKzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBmaWxlIHJlc29sdmVkCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgZmlsZSBjYW5ub3QgYmUgcmVzb2x2ZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmlsZSByZXNvbHZlKGZpbmFsIEV4dGVuc2lvbiBleHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB2YWxpZGF0ZSgpOwpAQCAtMTExLDYgKzExMiw3IEBACiAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiQW50WyIgKyBhbnRmaWxlICsgIj09PiIgKyBkZXN0ZmlsZSArICJdIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL0xvY2F0aW9uUmVzb2x2ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvTG9jYXRpb25SZXNvbHZlci5qYXZhCmluZGV4IGUyZmVjMDIuLjAzNThhZWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvTG9jYXRpb25SZXNvbHZlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvTG9jYXRpb25SZXNvbHZlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDYsMTkgKzQ2LDE5IEBACiAgICAgICogQHJldHVybiB0aGUgZmlsZSByZXNvbHZlZAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgbm8gbG9jYXRpb24gaXMgc2V0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgcmVzb2x2ZShmaW5hbCBFeHRlbnNpb24gZXh0ZW5zaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAobnVsbCA9PSBsb2NhdGlvbikgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiTm8gbG9jYXRpb24gc3BlY2lmaWVkIGZvciByZXNvbHZlciI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGxvY2F0aW9uIHNwZWNpZmllZCBmb3IgcmVzb2x2ZXIiKTsKICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiBwcm9qZWN0LnJlc29sdmVGaWxlKGxvY2F0aW9uKTsKICAgICB9CiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgTG9jYXRpb24KICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIkxvY2F0aW9uWyIgKyBsb2NhdGlvbiArICJdIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL1VSTFJlc29sdmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9leHRlbnNpb24vcmVzb2x2ZXJzL1VSTFJlc29sdmVyLmphdmEKaW5kZXggZDY5M2I4OS4uNmFjMzIzMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZXh0ZW5zaW9uL3Jlc29sdmVycy9VUkxSZXNvbHZlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2V4dGVuc2lvbi9yZXNvbHZlcnMvVVJMUmVzb2x2ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY2LDYgKzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIGZpbGUgdGhlIGZpbGUgcmVzb2x2ZWQKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBVUkwgaXMgaW52YWxpZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIHJlc29sdmUoZmluYWwgRXh0ZW5zaW9uIGV4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7CkBAIC0xMTAsMTYgKzExMSwxNSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKICAgICAgICAgaWYgKG51bGwgPT0gdXJsKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNdXN0IHNwZWNpZnkgVVJMIjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVzdCBzcGVjaWZ5IFVSTCIpOwogICAgICAgICB9Ci0KICAgICAgICAgaWYgKG51bGwgPT0gZGVzdGRpciAmJiBudWxsID09IGRlc3RmaWxlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNdXN0IHNwZWNpZnkgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3RvcnkiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICB9IGVsc2UgaWYgKG51bGwgIT0gZGVzdGRpciAmJiBudWxsICE9IGRlc3RmaWxlKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJNdXN0IG5vdCBzcGVjaWZ5IGJvdGggZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3RvcnkiOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZGVzdGluYXRpb24gZmlsZSBvciBkaXJlY3RvcnkiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBkZXN0ZGlyICYmIG51bGwgIT0gZGVzdGZpbGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiTXVzdCBub3Qgc3BlY2lmeSBib3RoIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5Iik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNyw2ICsxMjcsNyBAQAogICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFVSTAogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiAiVVJMWyIgKyB1cmwgKyAiXSI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi9UcmFuc2xhdGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlLmphdmEKaW5kZXggMzMwYTk4Yy4uZjg0YWViZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi9UcmFuc2xhdGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pMThuL1RyYW5zbGF0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTMgKzIwLDE1IEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0xMzcsMTIgKzEzOSwxMiBAQAogICAgIC8qKgogICAgICAqIFZlY3RvciB0byBob2xkIHNvdXJjZSBmaWxlIHNldHMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGVTZXQ+IGZpbGVzZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBIb2xkcyBrZXkgdmFsdWUgcGFpcnMgbG9hZGVkIGZyb20gcmVzb3VyY2UgYnVuZGxlIGZpbGUKICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSByZXNvdXJjZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzb3VyY2VNYXAgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICAvKioKIAogICAgICAqIFVzZWQgdG8gcmVzb2x2ZSBmaWxlIG5hbWVzLgpAQCAtMjY4LDcgKzI3MCw3IEBACiAgICAgICogQHBhcmFtIHNldCB0aGUgZmlsZXNldCB0byBiZSBhZGRlZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBzZXQpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChzZXQpOworICAgICAgICBmaWxlc2V0cy5hZGQoc2V0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MCw2ICsyODIsNyBAQAogICAgICAqICAgICAgIDxsaT5lbmR0b2tlbjwvbGk+CiAgICAgICogICAgICAgICAgICA8L3VsPgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGJ1bmRsZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQuIiwKQEAgLTMxOCw3ICszMjEsNyBAQAogICAgICAgICBpZiAoIXRvRGlyLmV4aXN0cygpKSB7CiAgICAgICAgICAgICB0b0Rpci5ta2RpcnMoKTsKICAgICAgICAgfSBlbHNlIGlmICh0b0Rpci5pc0ZpbGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHRvRGlyICsgIiBpcyBub3QgYSBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiwgdG9EaXIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNyY0VuY29kaW5nID09IG51bGwpIHsKQEAgLTM2MSw0NCArMzY0LDI4IEBACiAgICAgICAgIExvY2FsZSBsb2NhbGUgPSBuZXcgTG9jYWxlKGJ1bmRsZUxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVWYXJpYW50KTsKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRMYW5ndWFnZSgpIDogIiI7Ci0gICAgICAgIFN0cmluZyBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgID8gIl8iICsgbG9jYWxlLmdldENvdW50cnkoKSA6ICIiOwotICAgICAgICBTdHJpbmcgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRWYXJpYW50KCkgOiAiIjsKLSAgICAgICAgU3RyaW5nIGJ1bmRsZUZpbGUgPSBidW5kbGUgKyBsYW5ndWFnZSArIGNvdW50cnkgKyB2YXJpYW50OwotICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZUZpbGUsIEJVTkRMRV9TUEVDSUZJRURfTEFOR1VBR0VfQ09VTlRSWV9WQVJJQU5ULCBmYWxzZSk7CiAKLSAgICAgICAgYnVuZGxlRmlsZSA9IGJ1bmRsZSArIGxhbmd1YWdlICsgY291bnRyeTsKLSAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGVGaWxlLCBCVU5ETEVfU1BFQ0lGSUVEX0xBTkdVQUdFX0NPVU5UUlksIGZhbHNlKTsKKyAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCkuaXNFbXB0eSgpID8gIiIgOiAiXyIgKyBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgU3RyaW5nIGNvdW50cnkgPSBsb2NhbGUuZ2V0Q291bnRyeSgpLmlzRW1wdHkoKSA/ICIiIDogIl8iICsgbG9jYWxlLmdldENvdW50cnkoKTsKKyAgICAgICAgU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpLmlzRW1wdHkoKSA/ICIiIDogIl8iICsgbG9jYWxlLmdldFZhcmlhbnQoKTsKIAotICAgICAgICBidW5kbGVGaWxlID0gYnVuZGxlICsgbGFuZ3VhZ2U7Ci0gICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX1NQRUNJRklFRF9MQU5HVUFHRSwgZmFsc2UpOwotCi0gICAgICAgIGJ1bmRsZUZpbGUgPSBidW5kbGU7Ci0gICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX05PTUFUQ0gsIGZhbHNlKTsKKyAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGUgKyBsYW5ndWFnZSArIGNvdW50cnkgKyB2YXJpYW50LCBCVU5ETEVfU1BFQ0lGSUVEX0xBTkdVQUdFX0NPVU5UUllfVkFSSUFOVCwgZmFsc2UpOworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZSArIGxhbmd1YWdlICsgY291bnRyeSwgQlVORExFX1NQRUNJRklFRF9MQU5HVUFHRV9DT1VOVFJZLCBmYWxzZSk7CisgICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlICsgbGFuZ3VhZ2UsIEJVTkRMRV9TUEVDSUZJRURfTEFOR1VBR0UsIGZhbHNlKTsKKyAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGUsIEJVTkRMRV9OT01BVENILCBmYWxzZSk7CiAKICAgICAgICAgLy9Mb2FkIGRlZmF1bHQgbG9jYWxlIGJ1bmRsZSBmaWxlcwogICAgICAgICAvL3VzaW5nIGRlZmF1bHQgZmlsZSBlbmNvZGluZyBzY2hlbWUuCiAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7CiAKLSAgICAgICAgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgID8gIl8iICsgbG9jYWxlLmdldExhbmd1YWdlKCkgOiAiIjsKLSAgICAgICAgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRDb3VudHJ5KCkgOiAiIjsKLSAgICAgICAgdmFyaWFudCA9IGxvY2FsZS5nZXRWYXJpYW50KCkubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICA/ICJfIiArIGxvY2FsZS5nZXRWYXJpYW50KCkgOiAiIjsKKyAgICAgICAgbGFuZ3VhZ2UgPSBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5pc0VtcHR5KCkgPyAiIiA6ICJfIiArIGxvY2FsZS5nZXRMYW5ndWFnZSgpOworICAgICAgICBjb3VudHJ5ID0gbG9jYWxlLmdldENvdW50cnkoKS5pc0VtcHR5KCkgPyAiIiA6ICJfIiArIGxvY2FsZS5nZXRDb3VudHJ5KCk7CisgICAgICAgIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpLmlzRW1wdHkoKSA/ICIiIDogIl8iICsgbG9jYWxlLmdldFZhcmlhbnQoKTsKICAgICAgICAgYnVuZGxlRW5jb2RpbmcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsKIAotICAgICAgICBidW5kbGVGaWxlID0gYnVuZGxlICsgbGFuZ3VhZ2UgKyBjb3VudHJ5ICsgdmFyaWFudDsKLSAgICAgICAgcHJvY2Vzc0J1bmRsZShidW5kbGVGaWxlLCBCVU5ETEVfREVGQVVMVF9MQU5HVUFHRV9DT1VOVFJZX1ZBUklBTlQsIGZhbHNlKTsKLQotICAgICAgICBidW5kbGVGaWxlID0gYnVuZGxlICsgbGFuZ3VhZ2UgKyBjb3VudHJ5OwotICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZUZpbGUsIEJVTkRMRV9ERUZBVUxUX0xBTkdVQUdFX0NPVU5UUlksIGZhbHNlKTsKLQotICAgICAgICBidW5kbGVGaWxlID0gYnVuZGxlICsgbGFuZ3VhZ2U7Ci0gICAgICAgIHByb2Nlc3NCdW5kbGUoYnVuZGxlRmlsZSwgQlVORExFX0RFRkFVTFRfTEFOR1VBR0UsIHRydWUpOworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZSArIGxhbmd1YWdlICsgY291bnRyeSArIHZhcmlhbnQsIEJVTkRMRV9ERUZBVUxUX0xBTkdVQUdFX0NPVU5UUllfVkFSSUFOVCwgZmFsc2UpOworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZSArIGxhbmd1YWdlICsgY291bnRyeSwgQlVORExFX0RFRkFVTFRfTEFOR1VBR0VfQ09VTlRSWSwgZmFsc2UpOworICAgICAgICBwcm9jZXNzQnVuZGxlKGJ1bmRsZSArIGxhbmd1YWdlLCBCVU5ETEVfREVGQVVMVF9MQU5HVUFHRSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MDcsOSArMzk0LDkgQEAKICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0J1bmRsZShmaW5hbCBTdHJpbmcgYnVuZGxlRmlsZSwgZmluYWwgaW50IGksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0xvYWRlZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgRmlsZSBwcm9wc0ZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoYnVuZGxlRmlsZSArICIucHJvcGVydGllcyIpOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5zID0gbnVsbDsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5zID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcHNGaWxlKTsKKyAgICAgICAgICAgIGlucyA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKHByb3BzRmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICBsb2FkZWQgPSB0cnVlOwogICAgICAgICAgICAgYnVuZGxlTGFzdE1vZGlmaWVkW2ldID0gcHJvcHNGaWxlLmxhc3RNb2RpZmllZCgpOwogICAgICAgICAgICAgbG9nKCJVc2luZyAiICsgcHJvcHNGaWxlLCBQcm9qZWN0Lk1TR19ERUJVRyk7CkBAIC00MjksMTIgKzQxNiwxMCBAQAogICAgICAqIExvYWQgcmVzb3VyY2VNYXAgd2l0aCBrZXkgdmFsdWUgcGFpcnMuICBWYWx1ZXMgb2YgZXhpc3Rpbmcga2V5cwogICAgICAqIGFyZSBub3Qgb3ZlcndyaXR0ZW4uICBCdW5kbGUncyBlbmNvZGluZyBzY2hlbWUgaXMgdXNlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbG9hZFJlc291cmNlTWFwKEZpbGVJbnB1dFN0cmVhbSBpbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zLCBidW5kbGVFbmNvZGluZyk7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgIHByaXZhdGUgdm9pZCBsb2FkUmVzb3VyY2VNYXAoSW5wdXRTdHJlYW0gaW5zKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGluID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5zLCBidW5kbGVFbmNvZGluZykpKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKICAgICAgICAgICAgIHdoaWxlICgobGluZSA9IGluLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAvL1NvIGxvbmcgYXMgdGhlIGxpbmUgaXNuJ3QgZW1wdHkgYW5kIGlzbid0IGEgY29tbWVudC4uLgogICAgICAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKS5sZW5ndGgoKSA+IDEgJiYgJyMnICE9IGxpbmUuY2hhckF0KDApICYmICchJyAhPSBsaW5lLmNoYXJBdCgwKSkgewpAQCAtNDYwLDIzICs0NDUsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBpbi5yZWFkTGluZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArIGxpbmUudHJpbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBsaW5lLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFrZXkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9IYXMga2V5IGFscmVhZHkgYmVlbiBsb2FkZWQgaW50byByZXNvdXJjZU1hcD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VNYXAuZ2V0KGtleSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFwLnB1dElmQWJzZW50KGtleSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UuZ2V0TWVzc2FnZSgpLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpAQCAtNDk2LDkgKzQ3Niw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHRyYW5zbGF0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBmaWxlc1Byb2Nlc3NlZCA9IDA7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gZmlsZXNldHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSBmaWxlc2V0cy5lbGVtZW50QXQoaSk7CisgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgZm9yIChTdHJpbmcgc3JjRmlsZSA6IGRzLmdldEluY2x1ZGVkRmlsZXMoKSkgewogICAgICAgICAgICAgICAgIHRyeSB7CkBAIC01NDUsMTggKzUyMywxNCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCB0cmFuc2xhdGVPbmVGaWxlKEZpbGUgc3JjLCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsIGRlc3RFbmNvZGluZykpOwotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihmaXMsIHNyY0VuY29kaW5nKSk7Ci0gICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgIEZpbGVzLm5ld091dHB1dFN0cmVhbShkZXN0LnRvUGF0aCgpKSwgZGVzdEVuY29kaW5nKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShzcmMudG9QYXRoKCkpLCBzcmNFbmNvZGluZykpKSB7CiAgICAgICAgICAgICBMaW5lVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOwogICAgICAgICAgICAgbGluZVRva2VuaXplci5zZXRJbmNsdWRlRGVsaW1zKHRydWUpOwotICAgICAgICAgICAgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lKSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOworICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIDIwMDMtMDItMjEgbmV3IHJlcGxhY2UgYWxnb3JpdGhtIGJ5IHRiZWUgKHRiZWVAdGJlZS5vcmcpCiAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCB3YXNuJ3QgYWJsZSB0byByZXBsYWNlIHNvbWV0aGluZyBsaWtlICJAYWFhO0BiYmI7IgogCkBAIC01OTgsNyArNTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmluZCB0aGUgcmVwbGFjZSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VNYXAuY29udGFpbnNLZXkodG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UgPSAoU3RyaW5nKSByZXNvdXJjZU1hcC5nZXQodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gcmVzb3VyY2VNYXAuZ2V0KHRva2VuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlJlcGxhY2VtZW50IHN0cmluZyBtaXNzaW5nIGZvcjogIiArIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CkBAIC02MjEsOSArNTk1LDYgQEAKICAgICAgICAgICAgICAgICBvdXQud3JpdGUobGluZSk7CiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVUb2tlbml6ZXIuZ2V0VG9rZW4oaW4pOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlLmphdmEKaW5kZXggNjM1YjNiZi4uY2QwNGRhNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9JbWFnZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtMjcsNyArMjgsNiBAQAogaW1wb3J0IGphdmF4Lm1lZGlhLmphaS5QbGFuYXJJbWFnZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKQEAgLTM4LDcgKzM4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5TY2FsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5UcmFuc2Zvcm1PcGVyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlTmFtZU1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLklkZW50aXR5TWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKQEAgLTQ2LDIyICs0NSwyMyBAQAogCiAvKioKICAqIEEgTWF0Y2hpbmdUYXNrIHdoaWNoIHJlbGllcyBvbiA8YQotICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaSI+SkFJIChKYXZhCisgKiBocmVmPSJodHRwczovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlYnVzaW5lc3MvZG93bmxvYWRzL2phdmEtYXJjaGl2ZS1kb3dubG9hZHMtamF2YS1jbGllbnQtNDE5NDE3Lmh0bWwiPkpBSSAoSmF2YQogICogQWR2YW5jZWQgSW1hZ2luZyk8L2E+IHRvIHBlcmZvcm0gaW1hZ2UgbWFuaXB1bGF0aW9uIG9wZXJhdGlvbnMgb24KICAqIGV4aXN0aW5nIGltYWdlcy4gIFRoZSBvcGVyYXRpb25zIGFyZSByZXByZXNlbnRlZCBhcyBJbWFnZU9wZXJhdGlvbgogICogRGF0YVR5cGUgb2JqZWN0cy4gIFRoZSBvcGVyYXRpb25zIGFyZSBhcnJhbmdlZCB0byBjb25mb3JtIHRvIHRoZQotICogQ2hhaW5pbmcgTW9kZWwgb2YgSkFJLiAgQ2hlY2sgb3V0IHRoZSA8YQotICogaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qYXZhLW1lZGlhL2phaS9mb3JEZXZlbG9wZXJzL2phaTFfMF8xZ3VpZGUtdW5jLyI+Ci0gKiBKQUkgUHJvZ3JhbW1pbmcgR3VpZGU8L2E+LgorICogQ2hhaW5pbmcgTW9kZWwgb2YgSkFJLiAgQ2hlY2sgb3V0IHRoZSBKQUkgUHJvZ3JhbW1pbmcgR3VpZGUuCiAgKgorICogQGRlcHJlY2F0ZWQgSkFJIGlzIG5vdCBkZXZlbG9wZWQgYW55IG1vcmUuIEludGVybmFsIEFQSXMgdGhhdCBKQUkgZGVwZW5kcyBvbiB3ZXJlCisgKiBzY2hlZHVsZWQgZm9yIHJlbW92YWwgaW4gSmF2YSA3IGFuZCBmaW5hbGx5IHJlbW92ZWQgaW4gSmF2YSA5LgogICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5JbWFnZU9wZXJhdGlvbgogICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZQogICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIEltYWdlIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwotICAgIHByb3RlY3RlZCBWZWN0b3IgaW5zdHJ1Y3Rpb25zID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8SW1hZ2VPcGVyYXRpb24+IGluc3RydWN0aW9ucyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByb3RlY3RlZCBib29sZWFuIG92ZXJ3cml0ZSA9IGZhbHNlOwotICAgIHByb3RlY3RlZCBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIFZlY3RvcjxGaWxlU2V0PiBmaWxlc2V0cyA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByb3RlY3RlZCBGaWxlIHNyY0RpciA9IG51bGw7CiAgICAgcHJvdGVjdGVkIEZpbGUgZGVzdERpciA9IG51bGw7CiAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgKiBAcGFyYW0gc2V0IHRoZSBGaWxlU2V0IHRvIGFkZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlc2V0KEZpbGVTZXQgc2V0KSB7Ci0gICAgICAgIGZpbGVzZXRzLmFkZEVsZW1lbnQoc2V0KTsKKyAgICAgICAgZmlsZXNldHMuYWRkKHNldCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDUsOSArMTA1LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBTZXQgdGhlIGltYWdlIGVuY29kaW5nIHR5cGUuICA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vcHJvZHVjdHMvamF2YS1tZWRpYS9qYWkvZm9yRGV2ZWxvcGVycy9qYWkxXzBfMWd1aWRlLXVuYy9FbmNvZGUuZG9jLmh0bWwjNTY2MTAiPgotICAgICAqIFNlZSB0aGlzIHRhYmxlIGluIHRoZSBKQUkgUHJvZ3JhbW1pbmcgR3VpZGU8L2E+LgorICAgICAqIFNldCB0aGUgaW1hZ2UgZW5jb2RpbmcgdHlwZS4gCisgICAgICogU2VlIHRoZSBlbmNvZGluZyB0YWJsZSBpbiB0aGUgSkFJIFByb2dyYW1taW5nIEd1aWRlLgogICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgU3RyaW5nIGltYWdlIGVuY29kaW5nLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgewpAQCAtMjMzLDE0ICsyMzIsMTIgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkc3ROYW1lcy5sZW5ndGg7ICsrail7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZHN0TmFtZSA9IGRzdE5hbWVzW2pdOworICAgICAgICAgICAgZm9yIChTdHJpbmcgZHN0TmFtZSA6IGRzdE5hbWVzKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBkc3RGaWxlID0gbmV3IEZpbGUoZHN0RGlyLCBkc3ROYW1lKS5nZXRBYnNvbHV0ZUZpbGUoKTsKIAogICAgICAgICAgICAgICAgIGlmIChkc3RGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGF2b2lkIG92ZXJ3cml0aW5nIHVubGVzcyBuZWNlc3NhcnkKLSAgICAgICAgICAgICAgICAgICAgaWYoIW92ZXJ3cml0ZQorICAgICAgICAgICAgICAgICAgICBpZiAoIW92ZXJ3cml0ZQogICAgICAgICAgICAgICAgICAgICAgICAmJiBzcmNGaWxlLmxhc3RNb2RpZmllZCgpIDw9IGRzdEZpbGUubGFzdE1vZGlmaWVkKCkpIHsKIAogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHNyY0ZpbGUgKyAiIG9taXR0ZWQgYXMgIiArIGRzdEZpbGUKQEAgLTI3NCw2ICsyNzEsNyBAQAogICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGJlIHByb2Nlc3NlZC4KICAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpc24ndCB1c2VkIGFueW1vcmUKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSkgewogICAgICAgICBwcm9jZXNzRmlsZShmaWxlLCBuZXcgRmlsZShkZXN0RGlyID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzcmNEaXIgOiBkZXN0RGlyLCBmaWxlLmdldE5hbWUoKSkpOwpAQCAtMjkwLDE0ICsyODgsMTAgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvZygiUHJvY2Vzc2luZyBGaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAKLSAgICAgICAgICAgIEZpbGVTZWVrYWJsZVN0cmVhbSBpbnB1dCA9IG51bGw7CiAgICAgICAgICAgICBQbGFuYXJJbWFnZSBpbWFnZSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IEZpbGVTZWVrYWJsZVN0cmVhbShmaWxlKTsKKyAgICAgICAgICAgIHRyeSAoRmlsZVNlZWthYmxlU3RyZWFtIGlucHV0ID0gbmV3IEZpbGVTZWVrYWJsZVN0cmVhbShmaWxlKSkgewogICAgICAgICAgICAgICAgIGltYWdlID0gSkFJLmNyZWF0ZSgic3RyZWFtIiwgaW5wdXQpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gaW5zdHJ1Y3Rpb25zLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgaW5zdHIgPSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIGZvciAoSW1hZ2VPcGVyYXRpb24gaW5zdHIgOiBpbnN0cnVjdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihpbWFnZSk7CkBAIC0zMDUsMzMgKzI5OSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJOb3QgYSBUcmFuc2Zvcm1PcGVyYXRpb246ICIgKyBpbnN0cik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbnB1dCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEZpbGUgZHN0UGFyZW50ID0gbmV3RmlsZS5nZXRQYXJlbnRGaWxlKCk7CiAgICAgICAgICAgICBpZiAoIWRzdFBhcmVudC5pc0RpcmVjdG9yeSgpCiAgICAgICAgICAgICAgICAgJiYgIShkc3RQYXJlbnQubWtkaXJzKCkgfHwgZHN0UGFyZW50LmlzRGlyZWN0b3J5KCkpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRzdFBhcmVudCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHBhcmVudCBkaXJlY3RvcnkgJXMiLAorICAgICAgICAgICAgICAgICAgICBkc3RQYXJlbnQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAob3ZlcndyaXRlICYmIG5ld0ZpbGUuZXhpc3RzKCkgJiYgIW5ld0ZpbGUuZXF1YWxzKGZpbGUpKSB7CiAgICAgICAgICAgICAgICAgbmV3RmlsZS5kZWxldGUoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdGaWxlKTsKLQorICAgICAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gc3RyZWFtID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKG5ld0ZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICAgICAgSkFJLmNyZWF0ZSgiZW5jb2RlIiwgaW1hZ2UsIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9lbmNvZGluZy50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyX2VuY29kaW5nLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSwgbnVsbCk7CiAgICAgICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShzdHJlYW0pOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIGVycikgewogICAgICAgICAgICAgaWYgKCFmaWxlLmVxdWFscyhuZXdGaWxlKSkgewogICAgICAgICAgICAgICAgIG5ld0ZpbGUuZGVsZXRlKCk7CiAgICAgICAgICAgICB9CkBAIC0zNDAsMTUgKzMyNiw2IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiByZXJyKSB7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXF1YWxzKG5ld0ZpbGUpKXsKLSAgICAgICAgICAgICAgICBuZXdGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmYWlsb25lcnJvcikgewotICAgICAgICAgICAgICAgIGxvZygiRXJyb3IgcHJvY2Vzc2luZyBmaWxlOiAgIiArIHJlcnIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocmVycik7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM1Niw2ICszMzMsNyBAQAogICAgICAqIEV4ZWN1dGVzIHRoZSBUYXNrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7CkBAIC0zNjYsMjkgKzM0NCwyMCBAQAogICAgICAgICAgICAgaW50IHdyaXRlQ291bnQgPSAwOwogCiAgICAgICAgICAgICAvLyBidWlsZCBtYXBwZXIKLSAgICAgICAgICAgIGZpbmFsIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjsKLSAgICAgICAgICAgIGlmIChtYXBwZXJFbGVtZW50PT1udWxsKXsKLSAgICAgICAgICAgICAgICBtYXBwZXIgPSBuZXcgSWRlbnRpdHlNYXBwZXIoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRmlsZU5hbWVNYXBwZXIgbWFwcGVyID0gbWFwcGVyRWxlbWVudCA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBuZXcgSWRlbnRpdHlNYXBwZXIoKSA6IG1hcHBlckVsZW1lbnQuZ2V0SW1wbGVtZW50YXRpb24oKTsKIAogICAgICAgICAgICAgLy8gZGVhbCB3aXRoIHNwZWNpZmllZCBzcmNEaXIKICAgICAgICAgICAgIGlmIChzcmNEaXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0Rpcik7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgICAgICB3cml0ZUNvdW50ICs9IHByb2Nlc3NEaXIoc3JjRGlyLCBmaWxlcywgZGVzdCwgbWFwcGVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZUNvdW50ICs9IHByb2Nlc3NEaXIoc3JjRGlyLAorICAgICAgICAgICAgICAgICAgICBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHNyY0RpcikuZ2V0SW5jbHVkZWRGaWxlcygpLCBkZXN0LAorICAgICAgICAgICAgICAgICAgICBtYXBwZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gZGVhbCB3aXRoIHRoZSBmaWxlc2V0cwotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWxlc2V0cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeVNjYW5uZXIgZHMgPQotICAgICAgICAgICAgICAgICAgICBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmcm9tRGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVDb3VudCArPSBwcm9jZXNzRGlyKGZyb21EaXIsIGZpbGVzLCBkZXN0LCBtYXBwZXIpOworICAgICAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogZmlsZXNldHMpIHsKKyAgICAgICAgICAgICAgICB3cml0ZUNvdW50ICs9IHByb2Nlc3NEaXIoZnMuZ2V0RGlyKCksCisgICAgICAgICAgICAgICAgICAgIGZzLmdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZEZpbGVzKCksCisgICAgICAgICAgICAgICAgICAgIGRlc3QsIG1hcHBlcik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmICh3cml0ZUNvdW50ID4gMCkgewpAQCAtNDA4LDE2ICszNzcsMTYgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCAmJiBmaWxlc2V0cy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLS1hIHNyY0RpciBvciBhIGZpbGVzZXQuIik7CisgICAgICAgIGlmIChzcmNEaXIgPT0gbnVsbCAmJiBmaWxlc2V0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiU3BlY2lmeSBhdCBsZWFzdCBvbmUgc291cmNlLS1hIHNyY0RpciBvciBhIGZpbGVzZXQuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsICYmIGRlc3REaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZ5IHRoZSBkZXN0RGlyLCBvciB0aGUgc3JjRGlyLiIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJfZW5jb2RpbmcuZXF1YWxzSWdub3JlQ2FzZSgianBnIikpIHsKKyAgICAgICAgaWYgKCJqcGciLmVxdWFsc0lnbm9yZUNhc2Uoc3RyX2VuY29kaW5nKSkgewogICAgICAgICAgICAgc3RyX2VuY29kaW5nID0gIkpQRUciOwotICAgICAgICB9IGVsc2UgaWYgKHN0cl9lbmNvZGluZy5lcXVhbHNJZ25vcmVDYXNlKCJ0aWYiKSkgeworICAgICAgICB9IGVsc2UgaWYgKCJ0aWYiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyX2VuY29kaW5nKSkgewogICAgICAgICAgICAgc3RyX2VuY29kaW5nID0gIlRJRkYiOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VJT1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlSU9UYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkNTY0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlSU9UYXNrLmphdmEKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5NYXRjaGluZ1Rhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLk1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZWlvLkRyYXc7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2Vpby5JbWFnZU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZWlvLlJvdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZWlvLlNjYWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlaW8uVHJhbnNmb3JtT3BlcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZU5hbWVNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5JZGVudGl0eU1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOworCitpbXBvcnQgamF2YXguaW1hZ2Vpby5JbWFnZUlPOworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VSZWFkZXI7CitpbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgTWF0Y2hpbmdUYXNrIHdoaWNoIHJlbGllcyBvbiBKYXZhIEltYWdlSU8gdG8gcmVhZCBleGlzdGluZyBpbWFnZSBmaWxlcworICogYW5kIHdyaXRlIHRoZSByZXN1bHRzIG9mIEFXVCBpbWFnZSBtYW5pcHVsYXRpb24gb3BlcmF0aW9ucy4KKyAqIFRoZSBvcGVyYXRpb25zIGFyZSByZXByZXNlbnRlZCBhcyBJbWFnZU9wZXJhdGlvbiBEYXRhVHlwZSBvYmplY3RzLgorICogVGhlIHRhc2sgcmVwbGFjZXMgYSBKQUktYmFzZWQgSW1hZ2UgdGFzayB3aGljaCBubyBsb25nZXIgd29ya3Mgd2l0aCBKYXZhIDkrLgorICoKKyAqIEBzZWUgSW1hZ2VPcGVyYXRpb24KKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRGF0YVR5cGUKKyAqLworcHVibGljIGNsYXNzIEltYWdlSU9UYXNrIGV4dGVuZHMgTWF0Y2hpbmdUYXNrIHsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW1hZ2VPcGVyYXRpb24+IGluc3RydWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGUgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIEZpbGUgc3JjRGlyID0gbnVsbDsKKyAgICBwcml2YXRlIEZpbGUgZGVzdERpciA9IG51bGw7CisKKyAgICBwcml2YXRlIEltYWdlRm9ybWF0IG91dHB1dEZvcm1hdDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBnYXJiYWdlQ29sbGVjdCA9IGZhbHNlOworCisgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKKworICAgIHByaXZhdGUgTWFwcGVyIG1hcHBlckVsZW1lbnQgPSBudWxsOworCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIGZpbGVzIHRvIGJlIGRlbGV0ZWQuCisgICAgICogQHBhcmFtIHNldCB0aGUgRmlsZVNldCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgeworICAgICAgICBmaWxlc2V0cy5hZGQoc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgd2hldGhlciB0byBmYWlsIG9uIGVycm9yLgorICAgICAqIElmIGZhbHNlLCBub3RlIGVycm9ycyB0byB0aGUgb3V0cHV0IGJ1dCBrZWVwIGdvaW5nLgorICAgICAqIEBwYXJhbSBmbGFnIHRydWUgb3IgZmFsc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RmFpbE9uRXJyb3IoYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGZhaWxPbkVycm9yID0gZmxhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNvdXJjZSBkaXIgdG8gZmluZCB0aGUgaW1hZ2UgZmlsZXMuCisgICAgICogQHBhcmFtIHNyY0RpciB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBpbWFnZSBmaWxlcyByZXNpZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3JjZGlyKEZpbGUgc3JjRGlyKSB7CisgICAgICAgIHRoaXMuc3JjRGlyID0gc3JjRGlyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgb3V0cHV0IGltYWdlIGZvcm1hdC4KKyAgICAgKiBAcGFyYW0gZm9ybWF0IGFuIEltYWdlRm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChJbWFnZUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB3aGV0aGVyIHRvIG92ZXJ3cml0ZSBhIGZpbGUgaWYgdGhlcmUgaXMgYSBuYW1pbmcgY29uZmxpY3QuCisgICAgICogQHBhcmFtIG92ZXJ3cml0ZSB3aGV0aGVyIHRvIG92ZXJ3cml0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoYm9vbGVhbiBvdmVyd3JpdGUpIHsKKyAgICAgICAgdGhpcy5vdmVyd3JpdGUgPSBvdmVyd3JpdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdG8gaW52b2tlIEdhcmJhZ2UgQ29sbGVjdGlvbiBhZnRlciBlYWNoIGltYWdlIHByb2Nlc3NlZC4KKyAgICAgKiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgICAgKiBAcGFyYW0gZ2Mgd2hldGhlciB0byBpbnZva2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdjKGJvb2xlYW4gZ2MpIHsKKyAgICAgICAgZ2FyYmFnZUNvbGxlY3QgPSBnYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmb3IgbWFuaXB1bGF0ZWQgaW1hZ2VzLgorICAgICAqIEBwYXJhbSBkZXN0RGlyIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzdERpcihGaWxlIGRlc3REaXIpIHsKKyAgICAgICAgdGhpcy5kZXN0RGlyID0gZGVzdERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gSW1hZ2VPcGVyYXRpb24gdG8gY2hhaW4uCisgICAgICogQHBhcmFtIGluc3RyIFRoZSBJbWFnZU9wZXJhdGlvbiB0byBhcHBlbmQgdG8gdGhlIGNoYWluLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEltYWdlT3BlcmF0aW9uKEltYWdlT3BlcmF0aW9uIGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFJvdGF0ZSBJbWFnZU9wZXJhdGlvbiB0byB0aGUgY2hhaW4uCisgICAgICogQHBhcmFtIGluc3RyIFRoZSBSb3RhdGUgb3BlcmF0aW9uIHRvIGFkZCB0byB0aGUgY2hhaW4uCisgICAgICogQHNlZSBSb3RhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb3RhdGUoUm90YXRlIGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIFNjYWxlIEltYWdlT3BlcmF0aW9uIHRvIHRoZSBjaGFpbi4KKyAgICAgKiBAcGFyYW0gaW5zdHIgVGhlIFNjYWxlIG9wZXJhdGlvbiB0byBhZGQgdG8gdGhlIGNoYWluLgorICAgICAqIEBzZWUgU2NhbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTY2FsZShTY2FsZSBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBEcmF3IEltYWdlT3BlcmF0aW9uIHRvIHRoZSBjaGFpbi4gIERyYXdPcGVyYXRpb24KKyAgICAgKiBEYXRhVHlwZSBvYmplY3RzIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBEcmF3IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gaW5zdHIgVGhlIERyYXcgb3BlcmF0aW9uIHRvIGFkZCB0byB0aGUgY2hhaW4uCisgICAgICogQHNlZSBEcmF3CisgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZS5EcmF3T3BlcmF0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRHJhdyhEcmF3IGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICogQWRkIGFuIEltYWdlT3BlcmF0aW9uIHRvIGNoYWluLgorICAgICogQHBhcmFtIGluc3RyIFRoZSBJbWFnZU9wZXJhdGlvbiB0byBhcHBlbmQgdG8gdGhlIGNoYWluLgorICAgICogQHNpbmNlIEFudCAxLjcKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChJbWFnZU9wZXJhdGlvbiBpbnN0cikgeworICAgICAgICBhZGRJbWFnZU9wZXJhdGlvbihpbnN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbWFwcGVyIHRvIG1hcCBzb3VyY2UgdG8gZGVzdGluYXRpb24gZmlsZXMuCisgICAgICogQHJldHVybiBhIG1hcHBlciB0byBiZSBjb25maWd1cmVkCisgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBtb3JlIHRoYW4gb25lIG1hcHBlciBpcyBkZWZpbmVkCisgICAgICogQHNpbmNlIEFudCAxLjguMAorICAgICAqLworICAgIHB1YmxpYyBNYXBwZXIgY3JlYXRlTWFwcGVyKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1hcHBlckVsZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgZGVmaW5lIG1vcmUgdGhhbiBvbmUgbWFwcGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBtYXBwZXJFbGVtZW50ID0gbmV3IE1hcHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gbWFwcGVyRWxlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXN0ZWQgZmlsZW5hbWVtYXBwZXIuCisgICAgICogQHBhcmFtIGZpbGVOYW1lTWFwcGVyIHRoZSBtYXBwZXIgdG8gYWRkLgorICAgICAqIEBzaW5jZSBBbnQgMS44LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoRmlsZU5hbWVNYXBwZXIgZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgY3JlYXRlTWFwcGVyKCkuYWRkKGZpbGVOYW1lTWFwcGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhbGwgdGhlIGNoYWluZWQgSW1hZ2VPcGVyYXRpb25zIG9uIHRoZSBmaWxlcyBpbnNpZGUKKyAgICAgKiB0aGUgZGlyZWN0b3J5LgorICAgICAqIEBwYXJhbSBzcmNEaXIgRmlsZQorICAgICAqIEBwYXJhbSBzcmNOYW1lcyBTdHJpbmdbXQorICAgICAqIEBwYXJhbSBkc3REaXIgRmlsZQorICAgICAqIEBwYXJhbSBtYXBwZXIgRmlsZU5hbWVNYXBwZXIKKyAgICAgKiBAcmV0dXJuIGludAorICAgICAqIEBzaW5jZSBBbnQgMS44LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHByb2Nlc3NEaXIoZmluYWwgRmlsZSBzcmNEaXIsIGZpbmFsIFN0cmluZ1tdIHNyY05hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRzdERpciwgZmluYWwgRmlsZU5hbWVNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIGludCB3cml0ZUNvdW50ID0gMDsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBzcmNOYW1lIDogc3JjTmFtZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHNyY0Rpciwgc3JjTmFtZSkuZ2V0QWJzb2x1dGVGaWxlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGRzdE5hbWVzID0gbWFwcGVyLm1hcEZpbGVOYW1lKHNyY05hbWUpOworICAgICAgICAgICAgaWYgKGRzdE5hbWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2coc3JjRmlsZSArICIgc2tpcHBlZCwgZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGRzdE5hbWUgOiBkc3ROYW1lcykgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZHN0RmlsZSA9IG5ldyBGaWxlKGRzdERpciwgZHN0TmFtZSkuZ2V0QWJzb2x1dGVGaWxlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZHN0RmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhdm9pZCBvdmVyd3JpdGluZyB1bmxlc3MgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgIGlmICghb3ZlcndyaXRlCisgICAgICAgICAgICAgICAgICAgICAgICYmIHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPD0gZHN0RmlsZS5sYXN0TW9kaWZpZWQoKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBsb2coc3JjRmlsZSArICIgb21pdHRlZCBhcyAiICsgZHN0RmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyB1cCB0byBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBvdmVyd3JpdGUgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYXZvaWQgZXh0cmEgd29yayB3aGlsZSBvdmVyd3JpdGluZworICAgICAgICAgICAgICAgICAgICBpZiAoIXNyY0ZpbGUuZXF1YWxzKGRzdEZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKHNyY0ZpbGUsIGRzdEZpbGUpOworICAgICAgICAgICAgICAgICsrd3JpdGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJ1biB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgaWYgd2FudGVkCisgICAgICAgIGlmIChnYXJiYWdlQ29sbGVjdCkgeworICAgICAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd3JpdGVDb3VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyBhbGwgdGhlIGNoYWluZWQgSW1hZ2VPcGVyYXRpb25zIG9uIHRoZSBmaWxlCisgICAgICogc3BlY2lmaWVkLgorICAgICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIG1ldGhvZCBpc24ndCB1c2VkIGFueW1vcmUKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NGaWxlKEZpbGUgZmlsZSkgeworICAgICAgICBwcm9jZXNzRmlsZShmaWxlLCBuZXcgRmlsZShkZXN0RGlyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzcmNEaXIgOiBkZXN0RGlyLCBmaWxlLmdldE5hbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIGFsbCB0aGUgY2hhaW5lZCBJbWFnZU9wZXJhdGlvbnMgb24gdGhlIGZpbGUKKyAgICAgKiBzcGVjaWZpZWQuCisgICAgICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqIEBwYXJhbSBuZXdGaWxlIFRoZSBmaWxlIHRvIHdyaXRlIHRvLgorICAgICAqIEBzaW5jZSBBbnQgMS44LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGZpbGUsIEZpbGUgbmV3RmlsZSkgeworICAgICAgICBsb2coIlByb2Nlc3NpbmcgRmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIHRyeSAoSW1hZ2VJbnB1dFN0cmVhbSBpbnB1dCA9IEltYWdlSU8uY3JlYXRlSW1hZ2VJbnB1dFN0cmVhbShmaWxlKSkgeworICAgICAgICAgICAgSXRlcmF0b3I8SW1hZ2VSZWFkZXI+IHJlYWRlcnMgPSBJbWFnZUlPLmdldEltYWdlUmVhZGVycyhpbnB1dCk7CisgICAgICAgICAgICBpZiAoIXJlYWRlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJObyBkZWNvZGVyIGF2YWlsYWJsZSwgc2tpcHBpbmciKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJbWFnZVJlYWRlciByZWFkZXIgPSByZWFkZXJzLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdCA9IG5ldyBJbWFnZUZvcm1hdChyZWFkZXIuZ2V0Rm9ybWF0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5zZXRJbnB1dChpbnB1dCk7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UgPSByZWFkZXIucmVhZCgwKTsKKyAgICAgICAgICAgIHJlYWRlci5kaXNwb3NlKCk7CisKKyAgICAgICAgICAgIGZvciAoSW1hZ2VPcGVyYXRpb24gaW5zdHIgOiBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oaW1hZ2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZygiTm90IGEgVHJhbnNmb3JtT3BlcmF0aW9uOiAiICsgaW5zdHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZSBkc3RQYXJlbnQgPSBuZXdGaWxlLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgIGlmICghZHN0UGFyZW50LmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgICAgICAmJiAhKGRzdFBhcmVudC5ta2RpcnMoKSB8fCBkc3RQYXJlbnQuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgcGFyZW50IGRpcmVjdG9yeSAlcyIsCisgICAgICAgICAgICAgICAgICAgIGRzdFBhcmVudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdmVyd3JpdGUgJiYgbmV3RmlsZS5leGlzdHMoKSAmJiAhbmV3RmlsZS5lcXVhbHMoZmlsZSkpIHsKKyAgICAgICAgICAgICAgICBuZXdGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIUltYWdlSU8ud3JpdGUoaW1hZ2UsIG91dHB1dEZvcm1hdC5nZXRWYWx1ZSgpLCBuZXdGaWxlKSkgeworICAgICAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIHNhdmUgdGhlIHRyYW5zZm9ybWVkIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIGVycikgeworICAgICAgICAgICAgaWYgKCFmaWxlLmVxdWFscyhuZXdGaWxlKSkgeworICAgICAgICAgICAgICAgIG5ld0ZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZhaWxPbkVycm9yKSB7CisgICAgICAgICAgICAgICAgbG9nKCJFcnJvciBwcm9jZXNzaW5nIGZpbGU6ICAiICsgZXJyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeGVjdXRlcyB0aGUgVGFzay4KKyAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworCisgICAgICAgIHZhbGlkYXRlQXR0cmlidXRlcygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGaWxlIGRlc3QgPSAoZGVzdERpciAhPSBudWxsKSA/IGRlc3REaXIgOiBzcmNEaXI7CisKKyAgICAgICAgICAgIGludCB3cml0ZUNvdW50ID0gMDsKKworICAgICAgICAgICAgLy8gYnVpbGQgbWFwcGVyCisgICAgICAgICAgICBmaW5hbCBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSBtYXBwZXJFbGVtZW50ID09IG51bGwKKyAgICAgICAgICAgICAgICA/IG5ldyBJZGVudGl0eU1hcHBlcigpIDogbWFwcGVyRWxlbWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOworCisgICAgICAgICAgICAvLyBkZWFsIHdpdGggc3BlY2lmaWVkIHNyY0RpcgorICAgICAgICAgICAgaWYgKHNyY0RpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVDb3VudCArPSBwcm9jZXNzRGlyKHNyY0RpciwKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuZ2V0RGlyZWN0b3J5U2Nhbm5lcihzcmNEaXIpLmdldEluY2x1ZGVkRmlsZXMoKSwgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgbWFwcGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRlYWwgd2l0aCB0aGUgZmlsZXNldHMKKyAgICAgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVzZXRzKSB7CisgICAgICAgICAgICAgICAgd3JpdGVDb3VudCArPSBwcm9jZXNzRGlyKGZzLmdldERpcigpLAorICAgICAgICAgICAgICAgICAgICBmcy5nZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWRGaWxlcygpLAorICAgICAgICAgICAgICAgICAgICBkZXN0LCBtYXBwZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3JpdGVDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBsb2coIlByb2Nlc3NlZCAiICsgd3JpdGVDb3VudCArICh3cml0ZUNvdW50ID09IDEgPyAiIGltYWdlLiIgOiAiIGltYWdlcy4iKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGVycikgeworICAgICAgICAgICAgbG9nKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UoZXJyKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlcnIuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZSB3ZSBoYXZlIGEgY29uc2lzdGVudCBhbmQgbGVnYWwgc2V0IG9mIGF0dHJpYnV0ZXMsIGFuZCBzZXQKKyAgICAgKiBhbnkgaW50ZXJuYWwgZmxhZ3MgbmVjZXNzYXJ5IGJhc2VkIG9uIGRpZmZlcmVudCBjb21iaW5hdGlvbnMKKyAgICAgKiBvZiBhdHRyaWJ1dGVzLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNyY0RpciA9PSBudWxsICYmIGZpbGVzZXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJTcGVjaWZ5IGF0IGxlYXN0IG9uZSBzb3VyY2UtLWEgc3JjRGlyIG9yIGEgZmlsZXNldC4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjRGlyID09IG51bGwgJiYgZGVzdERpciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNwZWNpZnkgdGhlIGRlc3REaXIsIG9yIHRoZSBzcmNEaXIuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBkZWZpbmVzIGFjY2VwdGFibGUgaW1hZ2UgZm9ybWF0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltYWdlRm9ybWF0IGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTID0gSW1hZ2VJTy5nZXRSZWFkZXJGb3JtYXROYW1lcygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEltYWdlRm9ybWF0KCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgc3RyaW5nLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBJbWFnZUZvcm1hdChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRVM7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvQWJzdHJhY3RIb3REZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sLmphdmEKaW5kZXggN2M0N2Y3MS4uM2EzNGI0NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9BYnN0cmFjdEhvdERlcGxveW1lbnRUb29sLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04NywxMyArODcsMTQgQEAKICAgICAgKiAgYmFzZSBjbGFzcy4gIFN1YmNsYXNzZXMgc2hvdWxkIGNoZWNrIGF0dHJpYnV0ZXMgYWNjb3JkaW5nbHkuCiAgICAgICogIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZXMgYXJlIGludmFsaWQgb3IgaW5jb21wbGV0ZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAodGFzay5nZXRBY3Rpb24oKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBcImFjdGlvblwiIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCIpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc0FjdGlvblZhbGlkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBhY3Rpb24gXCIiICsgdGFzay5nZXRBY3Rpb24oKSArICJcIiBwYXNzZWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBhY3Rpb24gXCIlc1wiIHBhc3NlZCIsIHRhc2suZ2V0QWN0aW9uKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7CkBAIC0xMDIsMTcgKzEwMywxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqICBQZXJmb3JtIHRoZSBhY3R1YWwgZGVwbG95bWVudC4KLSAgICAgKiAgSXQncyB1cCB0byB0aGUgc3ViY2xhc3NlcyB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbCBiZWhhdmlvci4KLSAgICAgKiAgQGV4Y2VwdGlvbiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYXR0cmlidXRlcyBhcmUgaW52YWxpZCBvciBpbmNvbXBsZXRlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGRlcGxveSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKLQotICAgIC8qKgogICAgICAqICBTZXRzIHRoZSBwYXJlbnQgdGFzay4KICAgICAgKiAgQHBhcmFtIHRhc2sgYSBTZXJ2ZXJEZXBsb3kgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGFyZW50IHRhc2suCiAgICAgICogIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUYXNrKFNlcnZlckRlcGxveSB0YXNrKSB7CiAgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9HZW5lcmljSG90RGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvR2VuZXJpY0hvdERlcGxveW1lbnRUb29sLmphdmEKaW5kZXggZTRhNWI2Yi4uNDUxYTVlYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9HZW5lcmljSG90RGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0dlbmVyaWNIb3REZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzAsOCArNzAsOSBAQAogICAgICAqICBGb3IgdGhpcyBnZW5lcmljIGltcGxlbWVudGF0aW9uLCB0aGUgb25seSB2YWxpZCBhY3Rpb24gaXMgImRlcGxveSIKICAgICAgKiAgQHJldHVybiB0cnVlIGlmIHRoZSAiYWN0aW9uIiBhdHRyaWJ1dGUgaXMgdmFsaWQsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvblZhbGlkKCkgewotICAgICAgICByZXR1cm4gKGdldFRhc2soKS5nZXRBY3Rpb24oKS5lcXVhbHMoVkFMSURfQUNUSU9OU1swXSkpOworICAgICAgICByZXR1cm4gZ2V0VGFzaygpLmdldEFjdGlvbigpLmVxdWFscyhWQUxJRF9BQ1RJT05TWzBdKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc5LDYgKzgwLDcgQEAKICAgICAgKiAgQHBhcmFtIHRhc2sgQW4gU2VydmVyRGVwbG95IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHBhcmVudCB0YXNrLgogICAgICAqICBAYW50LmF0dHJpYnV0ZSBpZ25vcmVkPSJ0cnVlIgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRhc2soU2VydmVyRGVwbG95IHRhc2spIHsKICAgICAgICAgc3VwZXIuc2V0VGFzayh0YXNrKTsKICAgICAgICAgamF2YSA9IG5ldyBKYXZhKHRhc2spOwpAQCAtOTAsNiArOTIsNyBAQAogICAgICAqICBzdXBwbGllZCBjbGFzc3BhdGgsIGNsYXNzbmFtZSwgSlZNIGFyZ3MsIGFuZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgogICAgICAqICBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGVwbG95KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgamF2YS5zZXRDbGFzc25hbWUoY2xhc3NOYW1lKTsKICAgICAgICAgamF2YS5zZXRDbGFzc3BhdGgoZ2V0Q2xhc3NwYXRoKCkpOwpAQCAtMTAzLDYgKzEwNiw3IEBACiAgICAgICogIEVuc3VyZXMgdGhlIGNsYXNzTmFtZSBhbmQgYXJndW1lbnRzIGF0dHJpYnV0ZSBoYXZlIGJlZW4gc2V0LgogICAgICAqICBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIudmFsaWRhdGVBdHRyaWJ1dGVzKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvSG90RGVwbG95bWVudFRvb2wuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvSG90RGVwbG95bWVudFRvb2wuamF2YQppbmRleCBkYWU5NjY3Li42ZjE2MzIyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0hvdERlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9Ib3REZXBsb3ltZW50VG9vbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9Kb25hc0hvdERlcGxveW1lbnRUb29sLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0pvbmFzSG90RGVwbG95bWVudFRvb2wuamF2YQppbmRleCA0Yzc4NjZjLi5lMTQ2ZjAwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0pvbmFzSG90RGVwbG95bWVudFRvb2wuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL0pvbmFzSG90RGVwbG95bWVudFRvb2wuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc2LDcgKzc2LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGludCBkYXZpZFBvcnQ7CiAKLQogICAgIC8qKgogICAgICAqICBTZXQgdGhlIGhvc3QgZm9yIHRoZSBEYXZpZCBPUkI7IHJlcXVpcmVkIGlmCiAgICAgICogIE9SQj09ZGF2aWQuCkBAIC04Nyw3ICs4Niw2IEBACiAgICAgICAgIGRhdmlkSG9zdCA9IGluVmFsdWU7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiAgU2V0IHRoZSBwb3J0IGZvciB0aGUgRGF2aWQgT1JCOyByZXF1aXJlZCBpZgogICAgICAqICBPUkI9PWRhdmlkLgpAQCAtOTgsNyArOTYsNiBAQAogICAgICAgICBkYXZpZFBvcnQgPSBpblZhbHVlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogIHNldCB0aGUgam9uYXMgcm9vdCBkaXJlY3RvcnkgKC1EaW5zdGFsbC5yb290PSkuIFRoaXMKICAgICAgKiAgZWxlbWVudCBpcyByZXF1aXJlZC4KQEAgLTEwOSw3ICsxMDYsNiBAQAogICAgICAgICBqb25hc3Jvb3QgPSBpblZhbHVlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICoKICAgICAgKiBDaG9vc2UgeW91ciBPUkIgOiBSTUksIEpFUkVNSUUsIERBVklELCAuLi47IG9wdGlvbmFsLgpAQCAtMTI0LDE0ICsxMjAsMTMgQEAKICAgICAgICAgb3JiID0gaW5WYWx1ZTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqICBnZXRzIHRoZSBjbGFzc3BhdGggZmllbGQuCiAgICAgICoKICAgICAgKkByZXR1cm4gICAgQSBQYXRoIHJlcHJlc2VudGluZyB0aGUgImNsYXNzcGF0aCIgYXR0cmlidXRlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKLQogICAgICAgICBQYXRoIGFDbGFzc1BhdGggPSBzdXBlci5nZXRDbGFzc3BhdGgoKTsKIAogICAgICAgICBpZiAoYUNsYXNzUGF0aCA9PSBudWxsKSB7CkBAIC0xNDcsNyArMTQyLDYgQEAKICAgICAgICAgcmV0dXJuIGFDbGFzc1BhdGg7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBWYWxpZGF0ZXMgdGhlIHBhc3NlZCBpbiBhdHRyaWJ1dGVzLgogICAgICAqCkBAIC0xNjEsNiArMTU1LDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvLyBzdXBlci52YWxpZGF0ZUF0dHJpYnV0ZXMoKTsgLy8gZG9uJ3Qgd2FudCB0byBjYWxsIHRoaXMgbWV0aG9kCiAKQEAgLTE3Miw3ICsxNjcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFpc0FjdGlvblZhbGlkKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCBhY3Rpb24gXCIiICsgYWN0aW9uICsgIlwiIHBhc3NlZCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbnZhbGlkIGFjdGlvbiBcIiVzXCIgcGFzc2VkIiwgYWN0aW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChnZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7CkBAIC0yMTMsOSArMjA4LDkgQEAKICAgICAgICAgICAgIGphdmEuY3JlYXRlQXJnKCkuc2V0TGluZSgiLW4gIiArIGdldFNlcnZlcigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9ERVBMT1kpCi0gICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VUERBVEUpCi0gICAgICAgICAgICB8fCBhY3Rpb24uZXF1YWxzKCJyZWRlcGxveSIpKSB7CisgICAgICAgIGlmIChBQ1RJT05fREVQTE9ZLmVxdWFscyhhY3Rpb24pCisgICAgICAgICAgICB8fCBBQ1RJT05fVVBEQVRFLmVxdWFscyhhY3Rpb24pCisgICAgICAgICAgICB8fCAicmVkZXBsb3kiLmVxdWFscyhhY3Rpb24pKSB7CiAgICAgICAgICAgICBqYXZhLmNyZWF0ZUFyZygpLnNldExpbmUoIi1hICIgKyBnZXRUYXNrKCkuZ2V0U291cmNlKCkpOwogICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFTEVURSkgfHwgYWN0aW9uLmVxdWFscyhBQ1RJT05fVU5ERVBMT1kpKSB7CiAgICAgICAgICAgICBqYXZhLmNyZWF0ZUFyZygpLnNldExpbmUoIi1yICIgKyBnZXRUYXNrKCkuZ2V0U291cmNlKCkpOwpAQCAtMjI0LDcgKzIxOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqICBEZXRlcm1pbmVzIGlmIHRoZSBhY3Rpb24gc3VwcGxpZWQgaXMgdmFsaWQuIDxwPgogICAgICAqCkBAIC0yMzQsMTkgKzIyOCwxNyBAQAogICAgICAqQHJldHVybiAgICB0cnVlIGlmIHRoZSBhY3Rpb24gYXR0cmlidXRlIGlzIHZhbGlkLCBmYWxzZSBpZgogICAgICAqICAgICAgbm90LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uVmFsaWQoKSB7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQogICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0VGFzaygpLmdldEFjdGlvbigpOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkFMSURfQUNUSU9OUy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoVkFMSURfQUNUSU9OU1tpXSkpIHsKLSAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZvciAoU3RyaW5nIHZhbGlkQWN0aW9uIDogVkFMSURfQUNUSU9OUykgeworICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHModmFsaWRBY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsaWQ7CisgICAgICAgIC8vIFRPRE8gd2hhdCBhYm91dCByZWRlcGxveSwgbWVudGlvbmVkIGluICN2YWxpZGF0ZUF0dHJpYnV0ZQorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL1NlcnZlckRlcGxveS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9TZXJ2ZXJEZXBsb3kuamF2YQppbmRleCAwMmQ2ZjYxLi5kZWU5NDc4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qMmVlL1NlcnZlckRlcGxveS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvU2VydmVyRGVwbG95LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICBwcml2YXRlIEZpbGUgc291cmNlOwogCiAgICAgLyoqIFRoZSB2ZW5kb3Igc3BlY2lmaWMgdG9vbCBmb3IgZGVwbG95aW5nIHRoZSBjb21wb25lbnQgKiovCi0gICAgcHJpdmF0ZSBWZWN0b3IgdmVuZG9yVG9vbHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PEFic3RyYWN0SG90RGVwbG95bWVudFRvb2w+IHZlbmRvclRvb2xzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLwpAQCAtNjAsNyArNjAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEdlbmVyaWMoR2VuZXJpY0hvdERlcGxveW1lbnRUb29sIHRvb2wpIHsKICAgICAgICAgdG9vbC5zZXRUYXNrKHRoaXMpOwotICAgICAgICB2ZW5kb3JUb29scy5hZGRFbGVtZW50KHRvb2wpOworICAgICAgICB2ZW5kb3JUb29scy5hZGQodG9vbCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkV2VibG9naWMoV2ViTG9naWNIb3REZXBsb3ltZW50VG9vbCB0b29sKSB7CiAgICAgICAgIHRvb2wuc2V0VGFzayh0aGlzKTsKLSAgICAgICAgdmVuZG9yVG9vbHMuYWRkRWxlbWVudCh0b29sKTsKKyAgICAgICAgdmVuZG9yVG9vbHMuYWRkKHRvb2wpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODIsNyArODIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEpvbmFzKEpvbmFzSG90RGVwbG95bWVudFRvb2wgdG9vbCkgewogICAgICAgICB0b29sLnNldFRhc2sodGhpcyk7Ci0gICAgICAgIHZlbmRvclRvb2xzLmFkZEVsZW1lbnQodG9vbCk7CisgICAgICAgIHZlbmRvclRvb2xzLmFkZCh0b29sKTsKICAgICB9CiAKIApAQCAtMTAwLDEwICsxMDAsOSBAQAogICAgICAqICBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzCiAgICAgICogIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUsIG9yIGEgZmFpbHVyZSBvY2N1cnMgaW4gdGhlIGRlcGxveW1lbnQgcHJvY2Vzcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBlID0gdmVuZG9yVG9vbHMuZWxlbWVudHMoKTsKLSAgICAgICAgICAgICBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgSG90RGVwbG95bWVudFRvb2wgdG9vbCA9IChIb3REZXBsb3ltZW50VG9vbCkgZS5uZXh0RWxlbWVudCgpOworICAgICAgICBmb3IgKEhvdERlcGxveW1lbnRUb29sIHRvb2wgOiB2ZW5kb3JUb29scykgewogICAgICAgICAgICAgdG9vbC52YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgIHRvb2wuZGVwbG95KCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2oyZWUvV2ViTG9naWNIb3REZXBsb3ltZW50VG9vbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9XZWJMb2dpY0hvdERlcGxveW1lbnRUb29sLmphdmEKaW5kZXggZDBkYzkxYi4uYmQwMTRjNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9XZWJMb2dpY0hvdERlcGxveW1lbnRUb29sLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvajJlZS9XZWJMb2dpY0hvdERlcGxveW1lbnRUb29sLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICogIHRvb2xzIGlzIGV4ZWN1dGVkLgogICAgICAqICBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGVwbG95KCkgewogICAgICAgICBKYXZhIGphdmEgPSBuZXcgSmF2YShnZXRUYXNrKCkpOwogICAgICAgICBqYXZhLnNldEZvcmsodHJ1ZSk7CkBAIC04MCwzNSArODEsMzYgQEAKICAgICAgKgogICAgICAqICBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSBhdHRyaWJ1dGVzIGFyZSBpbnZhbGlkIG9yIGluY29tcGxldGUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBzdXBlci52YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKIAogICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0VGFzaygpLmdldEFjdGlvbigpOwogCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHBhc3N3b3JkIGhhcyBiZWVuIHNldAotICAgICAgICBpZiAoKGdldFBhc3N3b3JkKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKGdldFBhc3N3b3JkKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgcGFzc3dvcmQgYXR0cmlidXRlIG11c3QgYmUgc2V0LiIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY2hlY2sgZm9yIG1pc3NpbmcgYXBwbGljYXRpb24gb24gZGVwbG95ICYgdXBkYXRlCiAgICAgICAgIGlmICgoYWN0aW9uLmVxdWFscyhBQ1RJT05fREVQTE9ZKSB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VUERBVEUpKQogICAgICAgICAgICAgJiYgYXBwbGljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG11c3QgYmUgc2V0ICIKLSAgICAgICAgICAgICAgICArICJpZiBhY3Rpb24gPSAiICsgYWN0aW9uKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBpZiBhY3Rpb24gPSAlcyIsIGFjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBzb3VyY2Ugb24gZGVwbG95ICYgdXBkYXRlCiAgICAgICAgIGlmICgoYWN0aW9uLmVxdWFscyhBQ1RJT05fREVQTE9ZKSB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VUERBVEUpKQogICAgICAgICAgICAgJiYgZ2V0VGFzaygpLmdldFNvdXJjZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNvdXJjZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgaWYgIgotICAgICAgICAgICAgICAgICsgImFjdGlvbiA9ICIgKyBhY3Rpb24pOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgc291cmNlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBpZiBhY3Rpb24gPSAlcyIsIGFjdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayBmb3IgbWlzc2luZyBhcHBsaWNhdGlvbiBvbiBkZWxldGUgJiB1bmRlcGxveQogICAgICAgICBpZiAoKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFTEVURSkgfHwgYWN0aW9uLmVxdWFscyhBQ1RJT05fVU5ERVBMT1kpKQogICAgICAgICAgICAgJiYgYXBwbGljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG11c3QgYmUgc2V0IGlmICIKLSAgICAgICAgICAgICAgICArICJhY3Rpb24gPSAiICsgYWN0aW9uKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBpZiBhY3Rpb24gPSAlcyIsIGFjdGlvbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyMCwxNyArMTIyLDE3IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRBcmd1bWVudHMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0VGFzaygpLmdldEFjdGlvbigpOwotICAgICAgICBTdHJpbmcgYXJncyA9IG51bGw7CiAKICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFUExPWSkgfHwgYWN0aW9uLmVxdWFscyhBQ1RJT05fVVBEQVRFKSkgewotICAgICAgICAgICAgYXJncyA9IGJ1aWxkRGVwbG95QXJncygpOwotICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0RFTEVURSkgfHwgYWN0aW9uLmVxdWFscyhBQ1RJT05fVU5ERVBMT1kpKSB7Ci0gICAgICAgICAgICBhcmdzID0gYnVpbGRVbmRlcGxveUFyZ3MoKTsKLSAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9MSVNUKSkgewotICAgICAgICAgICAgYXJncyA9IGJ1aWxkTGlzdEFyZ3MoKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZERlcGxveUFyZ3MoKTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcmdzOworICAgICAgICBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fREVMRVRFKSB8fCBhY3Rpb24uZXF1YWxzKEFDVElPTl9VTkRFUExPWSkpIHsKKyAgICAgICAgICAgIHJldHVybiBidWlsZFVuZGVwbG95QXJncygpOworICAgICAgICB9CisgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9MSVNUKSkgeworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTGlzdEFyZ3MoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKQEAgLTEzOCwxOSArMTQwLDE2IEBACiAgICAgICogPHA+VmFsaWQgYWN0aW9ucyBhcmUgY29udGFpbmVkIGluIHRoZSBzdGF0aWMgYXJyYXkgVkFMSURfQUNUSU9OUzwvcD4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGFjdGlvbiBhdHRyaWJ1dGUgaXMgdmFsaWQsIGZhbHNlIGlmIG5vdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvblZhbGlkKCkgewotICAgICAgICBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGdldFRhc2soKS5nZXRBY3Rpb24oKTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFZBTElEX0FDVElPTlMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKFZBTElEX0FDVElPTlNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKFN0cmluZyB2YWxpZEFjdGlvbiA6IFZBTElEX0FDVElPTlMpIHsKKyAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKHZhbGlkQWN0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbGlkOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpEb2MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSkRvYy5qYXZhCmluZGV4IGE0ZGMwZjQuLmU3NzQzNDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSkRvYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSkRvYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsOCArMjAsOCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC00NCw3ICs0NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgICAgICAgICAgICAgID0gIlRFWFQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVEFCTEUgICAgICAgICA9ICJPTkVfVEFCTEUiOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGUgb3B0aW9uYWxBdHRycyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9uYWxBdHRycyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIHBsYWluVGV4dCA9IGZhbHNlOwpAQCAtNjUsNyArNjUsNyBAQAogICAgICAqIEBwYXJhbSBwbGFpblRleHQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KGJvb2xlYW4gcGxhaW5UZXh0KSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFRFWFQsIHBsYWluVGV4dCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChURVhULCBwbGFpblRleHQpOwogICAgICAgICB0aGlzLnBsYWluVGV4dCA9IHBsYWluVGV4dDsKICAgICB9CiAKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgKiBAcGFyYW0gb25lVGFibGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRPbmV0YWJsZShib29sZWFuIG9uZVRhYmxlKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE9ORV9UQUJMRSwgb25lVGFibGUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoT05FX1RBQkxFLCBvbmVUYWJsZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjQsMTkgKzEyNCwxNSBAQAogICAgICAqIERvIHRoZSB0YXNrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgLy8gbG9hZCBjb21tYW5kIGxpbmUgd2l0aCBvcHRpb25hbCBhdHRyaWJ1dGVzCi0gICAgICAgIEVudW1lcmF0aW9uIGl0ZXIgPSBvcHRpb25hbEF0dHJzLmtleXMoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lICA9IChTdHJpbmcpIGl0ZXIubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG9wdGlvbmFsQXR0cnMuZ2V0KG5hbWUpOwotICAgICAgICAgICAgY21kbC5jcmVhdGVBcmd1bWVudCgpCi0gICAgICAgICAgICAgICAgLnNldFZhbHVlKCItIiArIG5hbWUgKyAiOiIgKyB2YWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgfQorICAgICAgICBvcHRpb25hbEF0dHJzLmZvckVhY2goKG5hbWUsIHZhbHVlKSAtPiBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkKKyAgICAgICAgICAgIC5zZXRWYWx1ZSgiLSIgKyBuYW1lICsgIjoiICsgdmFsdWUudG9TdHJpbmcoKSkpOwogCiAgICAgICAgIGlmICh0YXJnZXRGaWxlID09IG51bGwgfHwgIXRhcmdldEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICIgKyB0YXJnZXRGaWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICVzIiwgdGFyZ2V0RmlsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAob3V0cHV0RmlsZSAhPSBudWxsKSB7CkBAIC0xOTUsOCArMTkxLDggQEAKICAgICAgICAgICAgIHN1ZmZpeCA9IERFRkFVTFRfU1VGRklYX1RFWFQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKG9wdGlvbmFsT3V0cHV0RmlsZSA9PSBudWxsKSB8fCBvcHRpb25hbE91dHB1dEZpbGUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgaW50IGZpbGVQb3MgPSBqYXZhY2NGaWxlLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgIGlmIChvcHRpb25hbE91dHB1dEZpbGUgPT0gbnVsbCB8fCBvcHRpb25hbE91dHB1dEZpbGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpbnQgZmlsZVBvcyA9IGphdmFjY0ZpbGUubGFzdEluZGV4T2YoJy8nKTsKIAogICAgICAgICAgICAgaWYgKGZpbGVQb3MgPj0gMCkgewogICAgICAgICAgICAgICAgIGphdmFjY0ZpbGUgPSBqYXZhY2NGaWxlLnN1YnN0cmluZyhmaWxlUG9zICsgMSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpUcmVlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSkpUcmVlLmphdmEKaW5kZXggM2Q1MWFmYi4uYjU1MmM4ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0pKVHJlZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KSlRyZWUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDggKzIwLDggQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtNTQsNyArNTQsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWSVNJVE9SX0VYQ0VQVElPTiA9ICJWSVNJVE9SX0VYQ0VQVElPTiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PREVfUFJFRklYICAgICAgID0gIk5PREVfUFJFRklYIjsKIAotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlIG9wdGlvbmFsQXR0cnMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbmFsQXR0cnMgPSBuZXcgSGFzaHRhYmxlPD4oKTsKIAogICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dEZpbGUgPSBudWxsOwogCkBAIC03NCw3ICs3NCw3IEBACiAgICAgICogQHBhcmFtIGJ1aWxkTm9kZUZpbGVzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0QnVpbGRub2RlZmlsZXMoYm9vbGVhbiBidWlsZE5vZGVGaWxlcykgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChCVUlMRF9OT0RFX0ZJTEVTLCBidWlsZE5vZGVGaWxlcyA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChCVUlMRF9OT0RFX0ZJTEVTLCBidWlsZE5vZGVGaWxlcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICogQHBhcmFtIG11bHRpIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0TXVsdGkoYm9vbGVhbiBtdWx0aSkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChNVUxUSSwgbXVsdGkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTVVMVEksIG11bHRpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgKiBAcGFyYW0gbm9kZURlZmF1bHRWb2lkIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Tm9kZWRlZmF1bHR2b2lkKGJvb2xlYW4gbm9kZURlZmF1bHRWb2lkKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE5PREVfREVGQVVMVF9WT0lELCBub2RlRGVmYXVsdFZvaWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9ERUZBVUxUX1ZPSUQsIG5vZGVEZWZhdWx0Vm9pZCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05OCw3ICs5OCw3IEBACiAgICAgICogQHBhcmFtIG5vZGVGYWN0b3J5IGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Tm9kZWZhY3RvcnkoYm9vbGVhbiBub2RlRmFjdG9yeSkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX0ZBQ1RPUlksIG5vZGVGYWN0b3J5ID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7CisgICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KE5PREVfRkFDVE9SWSwgbm9kZUZhY3RvcnkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICogQHBhcmFtIG5vZGVTY29wZUhvb2sgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXROb2Rlc2NvcGVob29rKGJvb2xlYW4gbm9kZVNjb3BlSG9vaykgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChOT0RFX1NDT1BFX0hPT0ssIG5vZGVTY29wZUhvb2sgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9TQ09QRV9IT09LLCBub2RlU2NvcGVIb29rKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgICAqIEBwYXJhbSBub2RlVXNlc1BhcnNlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE5vZGV1c2VzcGFyc2VyKGJvb2xlYW4gbm9kZVVzZXNQYXJzZXIpIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9VU0VTX1BBUlNFUiwgbm9kZVVzZXNQYXJzZXIgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTk9ERV9VU0VTX1BBUlNFUiwgbm9kZVVzZXNQYXJzZXIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgICogQHBhcmFtIHN0YXRpY1BhcnNlciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN0YXRpYyhib29sZWFuIHN0YXRpY1BhcnNlcikgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChTVEFUSUMsIHN0YXRpY1BhcnNlciA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChTVEFUSUMsIHN0YXRpY1BhcnNlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzAsNyArMTMwLDcgQEAKICAgICAgKiBAcGFyYW0gdmlzaXRvciBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFZpc2l0b3IoYm9vbGVhbiB2aXNpdG9yKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KFZJU0lUT1IsIHZpc2l0b3IgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoVklTSVRPUiwgdmlzaXRvcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQsMjEgKzIxNCwxOCBAQAogICAgICAqIFJ1biB0aGUgdGFzay4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogCiAgICAgICAgIC8vIGxvYWQgY29tbWFuZCBsaW5lIHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcwotICAgICAgICBFbnVtZXJhdGlvbiBpdGVyID0gb3B0aW9uYWxBdHRycy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSAgPSAoU3RyaW5nKSBpdGVyLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBvcHRpb25hbEF0dHJzLmdldChuYW1lKTsKLSAgICAgICAgICAgIGNtZGwuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLSIgKyBuYW1lICsgIjoiICsgdmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgb3B0aW9uYWxBdHRycy5mb3JFYWNoKChuYW1lLCB2YWx1ZSkgLT4gY21kbC5jcmVhdGVBcmd1bWVudCgpCisgICAgICAgICAgICAuc2V0VmFsdWUoIi0iICsgbmFtZSArICI6IiArIHZhbHVlLnRvU3RyaW5nKCkpKTsKIAogICAgICAgICBpZiAodGFyZ2V0RmlsZSA9PSBudWxsIHx8ICF0YXJnZXRGaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAiICsgdGFyZ2V0RmlsZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkludmFsaWQgdGFyZ2V0OiAlcyIsIHRhcmdldEZpbGUpOwogICAgICAgICB9CiAKLSAgICAgICAgRmlsZSBqYXZhRmlsZSA9IG51bGw7CisgICAgICAgIEZpbGUgamF2YUZpbGU7CiAKICAgICAgICAgLy8gdXNlIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGFyZ2V0IGFzIHRoZSBvdXRwdXQgZGlyZWN0b3J5CiAgICAgICAgIGlmIChvdXRwdXREaXJlY3RvcnkgPT0gbnVsbCkgewpAQCAtMzA1LDggKzMwMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXIpOwogICAgICAgICBTdHJpbmcgamp0cmVlRmlsZSA9IGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKIAotICAgICAgICBpZiAoKG9wdGlvbmFsT3V0cHV0RmlsZSA9PSBudWxsKSB8fCBvcHRpb25hbE91dHB1dEZpbGUuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgaW50IGZpbGVQb3MgPSBqanRyZWVGaWxlLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgIGlmIChvcHRpb25hbE91dHB1dEZpbGUgPT0gbnVsbCB8fCBvcHRpb25hbE91dHB1dEZpbGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpbnQgZmlsZVBvcyA9IGpqdHJlZUZpbGUubGFzdEluZGV4T2YoJy8nKTsKIAogICAgICAgICAgICAgaWYgKGZpbGVQb3MgPj0gMCkgewogICAgICAgICAgICAgICAgIGpqdHJlZUZpbGUgPSBqanRyZWVGaWxlLnN1YnN0cmluZyhmaWxlUG9zICsgMSk7CkBAIC0zMjgsNyArMzI1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmICgob3V0cHV0RGlyID09IG51bGwpIHx8IG91dHB1dERpci5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChvdXRwdXREaXIgPT0gbnVsbCB8fCBvdXRwdXREaXIuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBvdXRwdXREaXIgPSBnZXREZWZhdWx0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgIH0KIApAQCAtMzQzLDcgKzM0MCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZGVzdEZpbGUgU3RyaW5nCiAgICAgICogQHBhcmFtIG91dHB1dERpciBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIHZhbGlkYXRpb24gZmlsZSwgcmVsYXRpdmUgaWYgcG9zc2libGU7IDx0dD5udWxsPC90dD4gaWYgbm90IHNldAorICAgICAqIEByZXR1cm4gdmFsaWRhdGlvbiBmaWxlLCByZWxhdGl2ZSBpZiBwb3NzaWJsZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHNldAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZU91dHB1dEZpbGUoU3RyaW5nIGRlc3RGaWxlLApAQCAtMzUzLDcgKzM1MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgob3V0cHV0RGlyID09IG51bGwpCisgICAgICAgIGlmIChvdXRwdXREaXIgPT0gbnVsbAogICAgICAgICAgICAgJiYgKGRlc3RGaWxlLnN0YXJ0c1dpdGgoIi8iKSB8fCBkZXN0RmlsZS5zdGFydHNXaXRoKCJcXCIpKSkgewogICAgICAgICAgICAgU3RyaW5nIHJlbGF0aXZlT3V0cHV0RmlsZSA9IG1ha2VPdXRwdXRGaWxlUmVsYXRpdmUoZGVzdEZpbGUpOwogICAgICAgICAgICAgc2V0T3V0cHV0ZmlsZShyZWxhdGl2ZU91dHB1dEZpbGUpOwpAQCAtMzYzLDE3ICszNjAsMTcgQEAKIAogICAgICAgICBTdHJpbmcgcm9vdCA9IGdldFJvb3QobmV3IEZpbGUoZGVzdEZpbGUpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKIAotICAgICAgICBpZiAoKHJvb3QubGVuZ3RoKCkgPiAxKQorICAgICAgICBpZiAocm9vdC5sZW5ndGgoKSA+IDEKICAgICAgICAgICAgICYmIGRlc3RGaWxlLnN0YXJ0c1dpdGgocm9vdC5zdWJzdHJpbmcoMCwgcm9vdC5sZW5ndGgoKSAtIDEpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJEcml2ZSBsZXR0ZXIgaW4gJ291dHB1dGZpbGUnIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3VwcG9ydGVkOiAiICsgZGVzdEZpbGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJEcml2ZSBsZXR0ZXIgaW4gJ291dHB1dGZpbGUnIG5vdCBzdXBwb3J0ZWQ6ICVzIiwgZGVzdEZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGRlc3RGaWxlOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIG1ha2VPdXRwdXRGaWxlUmVsYXRpdmUoU3RyaW5nIGRlc3RGaWxlKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciByZWxhdGl2ZVBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVsYXRpdmVQYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgU3RyaW5nIGRlZmF1bHRPdXRwdXREaXJlY3RvcnkgPSBnZXREZWZhdWx0T3V0cHV0RGlyZWN0b3J5KCk7CiAgICAgICAgIGludCBuZXh0UG9zID0gZGVmYXVsdE91dHB1dERpcmVjdG9yeS5pbmRleE9mKCcvJyk7CiAgICAgICAgIGludCBzdGFydFBvcyA9IG5leHRQb3MgKyAxOwpAQCAtMzg4LDEwICszODUsNyBAQAogICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gbmV4dFBvcyArIDE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICByZWxhdGl2ZVBhdGguYXBwZW5kKGRlc3RGaWxlKTsKLQotICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGguYXBwZW5kKGRlc3RGaWxlKS50b1N0cmluZygpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRPdXRwdXREaXJlY3RvcnkoKSB7CkBAIC00MTAsNyArNDA0LDYgQEAKICAgICAgICAgd2hpbGUgKHJvb3QuZ2V0UGFyZW50KCkgIT0gbnVsbCkgewogICAgICAgICAgICAgcm9vdCA9IHJvb3QuZ2V0UGFyZW50RmlsZSgpOwogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0phdmFDQy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWNjL0phdmFDQy5qYXZhCmluZGV4IGM4Y2UzMTkuLjUzMmFmYjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFjYy9KYXZhQ0MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhY2MvSmF2YUNDLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw4ICsyMCw4IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC02NCw3ICs2NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFRVBfTElORV9DT0xVTU4gICAgICAgPSAiS0VFUF9MSU5FX0NPTFVNTiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpES19WRVJTSU9OICAgICAgICAgICAgPSAiSkRLX1ZFUlNJT04iOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGUgb3B0aW9uYWxBdHRycyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9uYWxBdHRycyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLy8gcmVxdWlyZWQgYXR0cmlidXRlcwogICAgIHByaXZhdGUgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBudWxsOwpAQCAtNzksMTkgKzc5LDE5IEBACiAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFSQ0hJVkVfTE9DQVRJT05TID0gLy9OT1NPTkFSCiAgICAgICAgIG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICJKYXZhQ0MuemlwIiwKLSAgICAgICAgImJpbi9saWIvSmF2YUNDLnppcCIsCi0gICAgICAgICJiaW4vbGliL2phdmFjYy5qYXIiLAotICAgICAgICAiamF2YWNjLmphciIsIC8vIHVzZWQgYnkganBhY2thZ2UgZm9yIEphdmFDQyAzLngKLSAgICB9OworICAgICAgICAgICAgIkphdmFDQy56aXAiLAorICAgICAgICAgICAgImJpbi9saWIvSmF2YUNDLnppcCIsCisgICAgICAgICAgICAiYmluL2xpYi9qYXZhY2MuamFyIiwKKyAgICAgICAgICAgICJqYXZhY2MuamFyIiwgLy8gdXNlZCBieSBqcGFja2FnZSBmb3IgSmF2YUNDIDMueAorICAgICAgICB9OwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnRbXSBBUkNISVZFX0xPQ0FUSU9OU19WU19NQUpPUl9WRVJTSU9OID0gLy9OT1NPTkFSCiAgICAgICAgIG5ldyBpbnRbXSB7Ci0gICAgICAgIDEsCi0gICAgICAgIDIsCi0gICAgICAgIDMsCi0gICAgICAgIDMsCi0gICAgfTsKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAyLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDMsCisgICAgICAgIH07CiAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fUEFDS0FHRSA9ICJDT00uc3VuLmxhYnMuIjsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01fSkFWQUNDX0NMQVNTID0gImphdmFjYy5NYWluIjsKQEAgLTExMSw3ICsxMTEsNyBAQAogICAgICAqIEBwYXJhbSBsb29rYWhlYWQgYW4gPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRMb29rYWhlYWQoaW50IGxvb2thaGVhZCkgewotICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChMT09LQUhFQUQsIEludGVnZXIudmFsdWVPZihsb29rYWhlYWQpKTsKKyAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoTE9PS0FIRUFELCBsb29rYWhlYWQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogQHBhcmFtIGNob2ljZUFtYmlndWl0eUNoZWNrIGFuIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2hvaWNlYW1iaWd1aXR5Y2hlY2soaW50IGNob2ljZUFtYmlndWl0eUNoZWNrKSB7Ci0gICAgICAgIG9wdGlvbmFsQXR0cnMucHV0KENIT0lDRV9BTUJJR1VJVFlfQ0hFQ0ssIEludGVnZXIudmFsdWVPZihjaG9pY2VBbWJpZ3VpdHlDaGVjaykpOworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChDSE9JQ0VfQU1CSUdVSVRZX0NIRUNLLCBjaG9pY2VBbWJpZ3VpdHlDaGVjayk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgKiBAcGFyYW0gb3RoZXJBbWJpZ3VpdHlDaGVjayBhbiA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldE90aGVyYW1iaWd1aXR5Q2hlY2soaW50IG90aGVyQW1iaWd1aXR5Q2hlY2spIHsKLSAgICAgICAgb3B0aW9uYWxBdHRycy5wdXQoT1RIRVJfQU1CSUdVSVRZX0NIRUNLLCBJbnRlZ2VyLnZhbHVlT2Yob3RoZXJBbWJpZ3VpdHlDaGVjaykpOworICAgICAgICBvcHRpb25hbEF0dHJzLnB1dChPVEhFUl9BTUJJR1VJVFlfQ0hFQ0ssIG90aGVyQW1iaWd1aXR5Q2hlY2spOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzMxLDE5ICszMzEsMTYgQEAKICAgICAgKiBSdW4gdGhlIHRhc2suCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAogICAgICAgICAvLyBsb2FkIGNvbW1hbmQgbGluZSB3aXRoIG9wdGlvbmFsIGF0dHJpYnV0ZXMKLSAgICAgICAgRW51bWVyYXRpb24gaXRlciA9IG9wdGlvbmFsQXR0cnMua2V5cygpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgID0gKFN0cmluZykgaXRlci5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gb3B0aW9uYWxBdHRycy5nZXQobmFtZSk7Ci0gICAgICAgICAgICBjbWRsLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIi0iICsgbmFtZSArICI6IiArIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgICAgICB9CisgICAgICAgIG9wdGlvbmFsQXR0cnMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIC0+IGNtZGwuY3JlYXRlQXJndW1lbnQoKQorICAgICAgICAgICAgLnNldFZhbHVlKCItIiArIG5hbWUgKyAiOiIgKyB2YWx1ZSkpOwogCiAgICAgICAgIC8vIGNoZWNrIHRoZSB0YXJnZXQgaXMgYSBmaWxlCiAgICAgICAgIGlmICh0YXJnZXRGaWxlID09IG51bGwgfHwgIXRhcmdldEZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICIgKyB0YXJnZXRGaWxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW52YWxpZCB0YXJnZXQ6ICVzIiwgdGFyZ2V0RmlsZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB1c2UgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0YXJnZXQgYXMgdGhlIG91dHB1dCBkaXJlY3RvcnkKQEAgLTQyNSwxMiArNDIyLDExIEBACiAgICAgICAgIFN0cmluZyBwYWNrYWdlUHJlZml4ID0gbnVsbDsKICAgICAgICAgU3RyaW5nIG1haW5DbGFzcyA9IG51bGw7CiAKLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsID0gQW50Q2xhc3NMb2FkZXIubmV3QW50Q2xhc3NMb2FkZXIobnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIHRyeSAoQW50Q2xhc3NMb2FkZXIgbCA9CisgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIubmV3QW50Q2xhc3NMb2FkZXIobnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKICAgICAgICAgICAgIFN0cmluZyBqYXZhY2NDbGFzcyA9IENPTV9QQUNLQUdFICsgQ09NX0pBVkFDQ19DTEFTUzsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbC5nZXRSZXNvdXJjZUFzU3RyZWFtKGphdmFjY0NsYXNzLnJlcGxhY2UoJy4nLCAnLycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuY2xhc3MiKTsKQEAgLTQ5OCwxMCArNDk0LDYgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVua25vd24gdGFzayB0eXBlICIgKyB0eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBwYWNrYWdlUHJlZml4ICsgbWFpbkNsYXNzOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGwuY2xlYW51cCgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC01MjgsOCArNTIwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYSBwYXRoIHRvIEphdmFDQy56aXAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib3IgamF2YWNjLmphciBmcm9tICciICsgaG9tZSArICInLiIpOworICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgYSBwYXRoIHRvIEphdmFDQy56aXAgb3IgamF2YWNjLmphciBmcm9tICclcycuIiwKKyAgICAgICAgICAgIGhvbWUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvRm9ya2luZ0phdmFoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9Gb3JraW5nSmF2YWguamF2YQppbmRleCBjMTJmNTk0Li5kN2NiNmI0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9Gb3JraW5nSmF2YWguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9Gb3JraW5nSmF2YWguamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBzdWNjZXNzZnVsLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gY29tcGlsZShKYXZhaCBqYXZhaCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gU3VuSmF2YWguc2V0dXBKYXZhaENvbW1hbmQoamF2YWgpOwogICAgICAgICBQcm9qZWN0IHByb2plY3QgPSBqYXZhaC5nZXRQcm9qZWN0KCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9HY2poLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9HY2poLmphdmEKaW5kZXggYzA0ZWVhMy4uOTY2YTMzNTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0djamguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9HY2poLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9KYXZhaEFkYXB0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0phdmFoQWRhcHRlci5qYXZhCmluZGV4IDEyMWZhNDIuLjQwYjM0MTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0phdmFoQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0phdmFoQWRhcHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvSmF2YWhBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGQ0MGU1OTUuLjdhODc4NmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL0phdmFoQWRhcHRlckZhY3RvcnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9KYXZhaEFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MiwxMiArNDIsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KCkgewogICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgewogICAgICAgICAgICAgcmV0dXJuIEthZmZlaC5JTVBMRU1FTlRBVElPTl9OQU1FOwotICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0dpaigpKSB7Ci0gICAgICAgICAgICByZXR1cm4gR2NqaC5JTVBMRU1FTlRBVElPTl9OQU1FOwotICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSkgewotICAgICAgICAgICAgcmV0dXJuIEZvcmtpbmdKYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBTdW5KYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FOworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzR2lqKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBHY2poLklNUExFTUVOVEFUSU9OX05BTUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEZvcmtpbmdKYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FOwogICAgIH0KIAogICAgIC8qKgpAQCAtODYsMjkgKzg1LDI5IEBACiAgICAgICAgIGlmICgoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSAmJiBjaG9pY2UgPT0gbnVsbCkKICAgICAgICAgICAgIHx8IEthZmZlaC5JTVBMRU1FTlRBVElPTl9OQU1FLmVxdWFscyhjaG9pY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEthZmZlaCgpOwotICAgICAgICB9IGVsc2UgaWYgKChKYXZhRW52VXRpbHMuaXNHaWooKSAmJiBjaG9pY2UgPT0gbnVsbCkKKyAgICAgICAgfQorICAgICAgICBpZiAoKEphdmFFbnZVdGlscy5pc0dpaigpICYmIGNob2ljZSA9PSBudWxsKQogICAgICAgICAgICAgfHwgR2NqaC5JTVBMRU1FTlRBVElPTl9OQU1FLmVxdWFscyhjaG9pY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEdjamgoKTsKLSAgICAgICAgfSBlbHNlIGlmIChKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjEwIikgJiYKLSAgICAgICAgICAgICAgICAgICAoY2hvaWNlID09IG51bGwgfHwgRm9ya2luZ0phdmFoLklNUExFTUVOVEFUSU9OX05BTUUuZXF1YWxzKGNob2ljZSkpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTAiKSAmJgorICAgICAgICAgICAgKGNob2ljZSA9PSBudWxsIHx8IEZvcmtpbmdKYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FLmVxdWFscyhjaG9pY2UpKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJqYXZhaCBkb2VzIG5vdCBleGlzdCB1bmRlciBKYXZhIDEwIGFuZCBoaWdoZXIsIgogICAgICAgICAgICAgICAgICsgIiB1c2UgdGhlIGphdmFjIHRhc2sgd2l0aCBuYXRpdmVIZWFkZXJEaXIgaW5zdGVhZCIpOwotICAgICAgICB9IGVsc2UgaWYgKChKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2hvaWNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgfHwgRm9ya2luZ0phdmFoLklNUExFTUVOVEFUSU9OX05BTUUuZXF1YWxzKGNob2ljZSkpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoRm9ya2luZ0phdmFoLklNUExFTUVOVEFUSU9OX05BTUUuZXF1YWxzKGNob2ljZSkpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ya2luZ0phdmFoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoU3VuSmF2YWguSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgeworICAgICAgICB9CisgICAgICAgIGlmIChTdW5KYXZhaC5JTVBMRU1FTlRBVElPTl9OQU1FLmVxdWFscyhjaG9pY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN1bkphdmFoKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2hvaWNlICE9IG51bGwpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hvaWNlICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiByZXNvbHZlQ2xhc3NOYW1lKGNob2ljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1lbW9yeSBsZWFrIGluIGxpbmUgYmVsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5nZXRQcm9qZWN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVDbGFzc0xvYWRlcihjbGFzc3BhdGgpKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgZGVmYXVsdCBoYXMgYmVlbiBnb29kIGVub3VnaCB1bnRpbCBBbnQgMS42LjMsIHNvIHN0aWNrCi0gICAgICAgIC8vIHdpdGggaXQKLSAgICAgICAgcmV0dXJuIG5ldyBTdW5KYXZhaCgpOworICAgICAgICByZXR1cm4gbmV3IEZvcmtpbmdKYXZhaCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIzLDcgKzEyMiw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgSmF2YWhBZGFwdGVyIHJlc29sdmVDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCiAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKEphdmFoQWRhcHRlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAorICAgICAgICByZXR1cm4gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgIGxvYWRlciAhPSBudWxsID8gbG9hZGVyIDoKICAgICAgICAgICAgICAgICBKYXZhaEFkYXB0ZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksIEphdmFoQWRhcHRlci5jbGFzcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvS2FmZmVoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9LYWZmZWguamF2YQppbmRleCA2YmNiYThjLi41MWRlMjJiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9LYWZmZWguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9LYWZmZWguamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL1N1bkphdmFoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9TdW5KYXZhaC5qYXZhCmluZGV4IDc5MTFiMTcuLmI0NDgwOTcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2phdmFoL1N1bkphdmFoLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvU3VuSmF2YWguamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ0LDEwICs0NCwxMSBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICogQHNpbmNlIEFudCAxLjYuMwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGNvbXBpbGUoSmF2YWggamF2YWgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwSmF2YWhDb21tYW5kKGphdmFoKTsKICAgICAgICAgRXhlY3V0ZUphdmEgZWogPSBuZXcgRXhlY3V0ZUphdmEoKTsKLSAgICAgICAgQ2xhc3MgYyA9IG51bGw7CisgICAgICAgIENsYXNzPD8+IGM7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIC8vIGZpcnN0IHNlYXJjaCBmb3IgdGhlICJvbGQiIGphdmFoIGNsYXNzIGluIDEuNC4yIHRvb2xzLmphcgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9KRGVwZW5kVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9KRGVwZW5kVGFzay5qYXZhCmluZGV4IGFjY2NmOWYuLjE5NDc5ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL0pEZXBlbmRUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw4ICsyNCwxMiBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtNDIsMTggKzQ2LDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Mb2FkZXJVdGlsczsKIAoraW1wb3J0IGpkZXBlbmQudGV4dHVpLkpEZXBlbmQ7CisKIC8qKgogICogUnVucyBKRGVwZW5kIHRlc3RzLgogICoKICAqIDxwPkpEZXBlbmQgaXMgYSB0b29sIHRvIGdlbmVyYXRlIGRlc2lnbiBxdWFsaXR5IG1ldHJpY3MgZm9yIGVhY2ggSmF2YSBwYWNrYWdlLgogICogSXQgaGFzIGJlZW4gaW5pdGlhbGx5IGNyZWF0ZWQgYnkgTWlrZSBDbGFyay4gSkRlcGVuZCBjYW4gYmUgZm91bmQgYXQgPGEKLSAqIGhyZWY9Imh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWwiPmh0dHA6Ly93d3cuY2xhcmt3YXJlLmNvbS9zb2Z0d2FyZS9KRGVwZW5kLmh0bWw8L2E+LgorICogaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NsYXJrd2FyZS9qZGVwZW5kIj5odHRwczovL2dpdGh1Yi5jb20vY2xhcmt3YXJlL2pkZXBlbmQ8L2E+LgogICoKICAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHNwYXduIGEgbmV3IEphdmEgVk0uCiAgKgogICovCiBwdWJsaWMgY2xhc3MgSkRlcGVuZFRhc2sgZXh0ZW5kcyBUYXNrIHsKLSAgICAvL3ByaXZhdGUgQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRsaW5lID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwogCiAgICAgLy8gcmVxdWlyZWQgYXR0cmlidXRlcwogICAgIHByaXZhdGUgUGF0aCBzb3VyY2VzUGF0aDsgLy8gRGVwcmVjYXRlZCEKQEAgLTcxLDcgKzc2LDcgQEAKICAgICBwcml2YXRlIFN0cmluZyBmb3JtYXQgPSAidGV4dCI7CiAgICAgcHJpdmF0ZSBQYXR0ZXJuU2V0IGRlZmF1bHRQYXR0ZXJucyA9IG5ldyBQYXR0ZXJuU2V0KCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3RvciBwYWNrYWdlRmlsdGVyQzsKKyAgICBwcml2YXRlIHN0YXRpYyBDb25zdHJ1Y3Rvcjw/PiBwYWNrYWdlRmlsdGVyQzsKICAgICBwcml2YXRlIHN0YXRpYyBNZXRob2Qgc2V0RmlsdGVyOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVSdW50aW1lID0gZmFsc2U7CkBAIC03OSwxMyArODQsMTIgQEAKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBwYWNrYWdlRmlsdGVyID0KKyAgICAgICAgICAgIENsYXNzPD8+IHBhY2thZ2VGaWx0ZXIgPQogICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImpkZXBlbmQuZnJhbWV3b3JrLlBhY2thZ2VGaWx0ZXIiKTsKICAgICAgICAgICAgIHBhY2thZ2VGaWx0ZXJDID0KLSAgICAgICAgICAgICAgICBwYWNrYWdlRmlsdGVyLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtqYXZhLnV0aWwuQ29sbGVjdGlvbi5jbGFzc30pOworICAgICAgICAgICAgICAgIHBhY2thZ2VGaWx0ZXIuZ2V0Q29uc3RydWN0b3IoQ29sbGVjdGlvbi5jbGFzcyk7CiAgICAgICAgICAgICBzZXRGaWx0ZXIgPQotICAgICAgICAgICAgICAgIGpkZXBlbmQudGV4dHVpLkpEZXBlbmQuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNldEZpbHRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7cGFja2FnZUZpbHRlcn0pOworICAgICAgICAgICAgICAgIEpEZXBlbmQuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInNldEZpbHRlciIsIHBhY2thZ2VGaWx0ZXIpOwogICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewogICAgICAgICAgICAgaWYgKHNldEZpbHRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcGFja2FnZUZpbHRlckMgPSBudWxsOwpAQCAtMTU4LDggKzE2Miw4IEBACiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgZm9ya3MgaW50byBhIG5ldyBKVk0uIERlZmF1bHQ6IGZhbHNlLgogICAgICAqCi0gICAgICogQHBhcmFtICAgdmFsdWUgICA8dHQ+dHJ1ZTwvdHQ+IGlmIGEgSlZNIHNob3VsZCBiZSBmb3JrZWQsCi0gICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4KKyAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgSlZNIHNob3VsZCBiZSBmb3JrZWQsCisgICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Rm9yayhib29sZWFuIHZhbHVlKSB7CiAgICAgICAgIGZvcmsgPSB2YWx1ZTsKQEAgLTE3NSw4ICsxNzksOCBAQAogICAgIC8qKgogICAgICAqIFRoZSBjb21tYW5kIHVzZWQgdG8gaW52b2tlIGEgZm9ya2VkIEphdmEgVmlydHVhbCBNYWNoaW5lLgogICAgICAqCi0gICAgICogRGVmYXVsdCBpcyA8dHQ+amF2YTwvdHQ+LiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCi0gICAgICogQHBhcmFtICAgdmFsdWUgICB0aGUgbmV3IFZNIHRvIHVzZSBpbnN0ZWFkIG9mIDx0dD5qYXZhPC90dD4KKyAgICAgKiBEZWZhdWx0IGlzIDxjb2RlPmphdmE8L2NvZGU+LiBJZ25vcmVkIGlmIG5vIEpWTSBpcyBmb3JrZWQuCisgICAgICogQHBhcmFtICAgdmFsdWUgICB0aGUgbmV3IFZNIHRvIHVzZSBpbnN0ZWFkIG9mIDxjb2RlPmphdmE8L2NvZGU+CiAgICAgICogQHNlZSAjc2V0Rm9yayhib29sZWFuKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEp2bShTdHJpbmcgdmFsdWUpIHsKQEAgLTE4OSw2ICsxOTMsNyBAQAogICAgICAqIEByZXR1cm4gYSBzb3VyY2UgcGF0aAogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNi54LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFBhdGggY3JlYXRlU291cmNlc3BhdGgoKSB7CiAgICAgICAgIGlmIChzb3VyY2VzUGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICBzb3VyY2VzUGF0aCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CkBAIC0yMDEsNiArMjA2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2VzIHBhdGgKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjYueC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBQYXRoIGdldFNvdXJjZXNwYXRoKCkgewogICAgICAgICByZXR1cm4gc291cmNlc1BhdGg7CiAgICAgfQpAQCAtMzI1LDYgKzMzMSw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcwogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gZm9ybWF0czsKICAgICAgICAgfQpAQCAtMzY4LDExICszNzUsMTEgQEAKIAogICAgICAgICBGaWxlIGYgPSBMb2FkZXJVdGlscy5nZXRSZXNvdXJjZVNvdXJjZShnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlKTsKLSAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICBpZiAoZiA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2coIkNvdWxkblwndCBmaW5kICIgKyByZXNvdXJjZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbG9nKCJGb3VuZCAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgcnVudGltZUNsYXNzZXMuY3JlYXRlUGF0aCgpLnNldExvY2F0aW9uKGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbG9nKCJDb3VsZG5cJ3QgZmluZCAiICsgcmVzb3VyY2UsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgxLDMxICszODgsMjkgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKICAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRsaW5lID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwogCiAgICAgICAgIGlmICgidGV4dCIuZXF1YWxzKGZvcm1hdCkpIHsKICAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldENsYXNzbmFtZSgiamRlcGVuZC50ZXh0dWkuSkRlcGVuZCIpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGlmICgieG1sIi5lcXVhbHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldENsYXNzbmFtZSgiamRlcGVuZC54bWx1aS5KRGVwZW5kIik7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoInhtbCIuZXF1YWxzKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldENsYXNzbmFtZSgiamRlcGVuZC54bWx1aS5KRGVwZW5kIik7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoanZtICE9IG51bGwpIHsKICAgICAgICAgICAgIGNvbW1hbmRsaW5lLnNldFZtKGp2bSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGdldFNvdXJjZXNwYXRoKCkgPT0gbnVsbCAmJiBnZXRDbGFzc2VzcGF0aCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBjbGFzc2VzcGF0aCByZXF1aXJlZCBhcmd1bWVudCIpOwotICAgICAgICB9IGVsc2UgaWYgKGdldENsYXNzZXNwYXRoKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9Ci0gICAgICAgICAgICAgICAgInNvdXJjZXNwYXRoIGlzIGRlcHJlY2F0ZWQgaW4gSkRlcGVuZCA+PSAyLjUgIgotICAgICAgICAgICAgICAgICsgIi0gcGxlYXNlIGNvbnZlcnQgdG8gY2xhc3Nlc3BhdGgiOwotICAgICAgICAgICAgbG9nKG1zZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzZXNwYXRoKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgbG9nKCJzb3VyY2VzcGF0aCBpcyBkZXByZWNhdGVkIGluIEpEZXBlbmQgPj0gMi41IC0gcGxlYXNlIGNvbnZlcnQgdG8gY2xhc3Nlc3BhdGgiKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlc3QgYW5kIGdldCB0aGUgcmV0dXJuIGNvZGUKLSAgICAgICAgaW50IGV4aXRWYWx1ZSA9IEpEZXBlbmRUYXNrLkVSUk9SUzsKKyAgICAgICAgaW50IGV4aXRWYWx1ZTsKICAgICAgICAgYm9vbGVhbiB3YXNLaWxsZWQgPSBmYWxzZTsKICAgICAgICAgaWYgKCFnZXRGb3JrKCkpIHsKICAgICAgICAgICAgIGV4aXRWYWx1ZSA9IGV4ZWN1dGVJblZNKGNvbW1hbmRsaW5lKTsKQEAgLTQyNiwxMSArNDMxLDEwIEBACiAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlID0gIkpEZXBlbmQgRkFJTEVEIgogICAgICAgICAgICAgICAgICsgKHdhc0tpbGxlZCA/ICIgLSBUaW1lZCBvdXQiIDogIiIpOwogCi0gICAgICAgICAgICBpZiAgKGdldEhhbHRvbmVycm9yKCkpIHsKKyAgICAgICAgICAgIGlmIChnZXRIYWx0b25lcnJvcigpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZyhlcnJvck1lc3NhZ2UsIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coZXJyb3JNZXNzYWdlLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NzEsMTUgKzQ3NSwxMCBAQAogICAgICAgICAgICAgbG9nKCJPdXRwdXQgdG8gYmUgc3RvcmVkIGluICIgKyBnZXRPdXRwdXRGaWxlKCkuZ2V0UGF0aCgpKTsKICAgICAgICAgfQogCi0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChnZXRDbGFzc2VzcGF0aCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBuZXcsIGJldHRlciB3YXkgLSB1c2UgY2xhc3Nlc3BhdGggaW5zdGVhZAotICAgICAgICAgICAgICAgIC8vIG9mIHNvdXJjZXNwYXRoLiAgVGhlIGNvZGUgaXMgY3VycmVudGx5IHRoZSBzYW1lIC0geW91Ci0gICAgICAgICAgICAgICAgLy8gbmVlZCBjbGFzcyBmaWxlcyBpbiBhIGRpcmVjdG9yeSB0byB1c2UgdGhpcyBvciBqYXIgZmlsZXMuCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY1AgPSBnZXRDbGFzc2VzcGF0aCgpLmxpc3QoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNQLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGNQW2ldKTsKKyAgICAgICAgICAgIGdldFdvcmtpbmdQYXRoKCkuaWZQcmVzZW50KHBhdGggLT4geworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVwYXRoIDogcGF0aC5saXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZXBhdGgpOwogICAgICAgICAgICAgICAgICAgICAvLyBub3QgbmVjZXNzYXJ5IGFzIEpEZXBlbmQgd291bGQgZmFpbCwgYnV0IHdoeSBsb29zZQogICAgICAgICAgICAgICAgICAgICAvLyBzb21lIHRpbWU/CiAgICAgICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewpAQCAtNTAwLDQ4ICs0OTksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGdldFNvdXJjZXNwYXRoKCkgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgb2xkIHdheSBhbmQgaXMgZGVwcmVjYXRlZCAtIGNsYXNzZXNwYXRoIGlzCi0gICAgICAgICAgICAgICAgLy8gdGhlIHJpZ2h0IHdheSB0byBkbyB0aGlzIGFuZCBpcyBhYm92ZQotICAgICAgICAgICAgICAgIFN0cmluZ1tdIHNQID0gZ2V0U291cmNlc3BhdGgoKS5saXN0KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzUC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzUFtpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gbm90IG5lY2Vzc2FyeSBhcyBKRGVwZW5kIHdvdWxkIGZhaWwsIGJ1dCB3aHkgbG9vc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gc29tZSB0aW1lPwotICAgICAgICAgICAgICAgICAgICBpZiAoIWYuZXhpc3RzKCkgfHwgIWYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJcIiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYuZ2V0UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCBmYWlsLiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2cobXNnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqZGVwZW5kLmFkZERpcmVjdG9yeShmLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKRGVwZW5kIEZhaWxlZCB3aGVuIGFkZGluZyBhIHNvdXJjZSBkaXJlY3Rvcnk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICAvLyBUaGlzIGJpdCB0dXJucyA8ZXhjbHVkZT4gY2hpbGQgdGFncyBpbnRvIHBhdHRlcnMgdG8gaWdub3JlCiAgICAgICAgICAgICBTdHJpbmdbXSBwYXR0ZXJucyA9IGRlZmF1bHRQYXR0ZXJucy5nZXRFeGNsdWRlUGF0dGVybnMoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgIGlmIChwYXR0ZXJucyAhPSBudWxsICYmIHBhdHRlcm5zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAoc2V0RmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChwYXR0ZXJuc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuYWRkQWxsKHYsIHBhdHRlcm5zKTsKICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBvID0gcGFja2FnZUZpbHRlckMubmV3SW5zdGFuY2UobmV3IE9iamVjdFtdIHt2fSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRGaWx0ZXIuaW52b2tlKGpkZXBlbmQsIG5ldyBPYmplY3RbXSB7b30pOworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBwYWNrYWdlRmlsdGVyQy5uZXdJbnN0YW5jZSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldEZpbHRlci5pbnZva2UoamRlcGVuZCwgbyk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImV4Y2x1ZGVzIHdpbGwgYmUgaWdub3JlZCBhcyBKRGVwZW5kIGRvZXNuJ3QgbGlrZSBtZTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX1dBUk4pOwpAQCAtNTU0LDggKzUyMiw4IEBACiAKICAgICAgICAgICAgIGpkZXBlbmQuYW5hbHl6ZSgpOwogICAgICAgICAgICAgaWYgKHB3ICE9IG51bGwgJiYgcHcuY2hlY2tFcnJvcigpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJFbmNvdW50ZXJlZCBhbiBlcnJvciB3cml0aW5nIEpEZXBlbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvdXRwdXQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFbmNvdW50ZXJlZCBhbiBlcnJvciB3cml0aW5nIEpEZXBlbmQgb3V0cHV0Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwpAQCAtNTY2LDE0ICs1MzQsMTMgQEAKICAgICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBFeGVjdXRlIHRoZSB0YXNrIGJ5IGZvcmtpbmcgYSBuZXcgSlZNLiBUaGUgY29tbWFuZCB3aWxsIGJsb2NrIHVudGlsCiAgICAgICogaXQgZmluaXNoZXMuIFRvIGtub3cgaWYgdGhlIHByb2Nlc3Mgd2FzIGRlc3Ryb3llZCBvciBub3QsIHVzZSB0aGUKLSAgICAgKiA8dHQ+a2lsbGVkUHJvY2VzcygpPC90dD4gbWV0aG9kIG9mIHRoZSB3YXRjaGRvZyBjbGFzcy4KKyAgICAgKiA8Y29kZT5raWxsZWRQcm9jZXNzKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgd2F0Y2hkb2cgY2xhc3MuCiAgICAgICogQHBhcmFtIGNvbW1hbmRsaW5lIHRoZSBjb21tYW5kbGluZSBmb3IgZm9ya2VkIGp2bQogICAgICAqIEBwYXJhbSAgd2F0Y2hkb2cgICB0aGUgd2F0Y2hkb2cgaW4gY2hhcmdlIG9mIGNhbmNlbGxpbmcgdGhlIHRlc3QgaWYgaXQKLSAgICAgKiBleGNlZWRzIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQ2FuIGJlIDx0dD5udWxsPC90dD4uCisgICAgICogZXhjZWVkcyBhIGNlcnRhaW4gYW1vdW50IG9mIHRpbWUuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KICAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgcnVubmluZyB0aGUgamRlcGVuZAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvcgogICAgICAqLwpAQCAtNTg4LDE0ICs1NTUsMTQgQEAKIAogICAgICAgICAvLyBub3Qgc3VyZSB3aGV0aGVyIHRoaXMgdGVzdCBpcyBuZWVkZWQgYnV0IGNvc3Qgbm90aGluZyB0byBwdXQuCiAgICAgICAgIC8vIGhvcGUgaXQgd2lsbCBiZSByZXZpZXdlZCBieSBhbnlib2R5IGNvbXBldGVudAotICAgICAgICBpZiAoZ2V0Q2xhc3NwYXRoKCkudG9TdHJpbmcoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKCFnZXRDbGFzc3BhdGgoKS50b1N0cmluZygpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgY3JlYXRlSnZtYXJnKGNvbW1hbmRsaW5lKS5zZXRWYWx1ZSgiLWNsYXNzcGF0aCIpOwogICAgICAgICAgICAgY3JlYXRlSnZtYXJnKGNvbW1hbmRsaW5lKS5zZXRWYWx1ZShnZXRDbGFzc3BhdGgoKS50b1N0cmluZygpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbmNsdWRlUnVudGltZSkgewotICAgICAgICAgICAgTWFwLyo8U3RyaW5nLCBTdHJpbmc+Ki8gZW52ID0gRXhlY3V0ZS5nZXRFbnZpcm9ubWVudFZhcmlhYmxlcygpOwotICAgICAgICAgICAgU3RyaW5nIGNwID0gKFN0cmluZykgZW52LmdldCgiQ0xBU1NQQVRIIik7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IEV4ZWN1dGUuZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoKTsKKyAgICAgICAgICAgIFN0cmluZyBjcCA9IGVudi5nZXQoIkNMQVNTUEFUSCIpOwogICAgICAgICAgICAgaWYgKGNwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVDbGFzc3BhdGgoZ2V0UHJvamVjdCgpKS5jcmVhdGVQYXRoKCkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXcgUGF0aChnZXRQcm9qZWN0KCksIGNwKSk7CkBAIC02MTUsNDIgKzU4MiwyMCBAQAogICAgICAgICAgICAgLy8gd2UgaGF2ZSB0byBmaW5kIGEgY2xlYW5lciB3YXkgdG8gcHV0IHRoaXMgb3V0cHV0CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZ2V0U291cmNlc3BhdGgoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGRlcHJlY2F0ZWQgLSB1c2UgY2xhc3Nlc3BhdGggaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgU3RyaW5nW10gc1AgPSBnZXRTb3VyY2VzcGF0aCgpLmxpc3QoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc1AubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzUFtpXSk7CisgICAgICAgIGdldFdvcmtpbmdQYXRoKCkuaWZQcmVzZW50KHBhdGggLT4geworICAgICAgICAgICAgZm9yIChTdHJpbmcgZmlsZXBhdGggOiBwYXRoLmxpc3QoKSkgeworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVwYXRoKTsKIAogICAgICAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgYXMgSkRlcGVuZCB3b3VsZCBmYWlsLCBidXQgd2h5IGxvb3NlCiAgICAgICAgICAgICAgICAgLy8gc29tZSB0aW1lPwogICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSB8fCAhZi5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiXCIiICsgZi5nZXRQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmYWlsLiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIlc1wiIGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbGlkIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCBmYWlsLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmLmdldFBhdGgoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbW1hbmRsaW5lLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZi5nZXRQYXRoKCkpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGdldENsYXNzZXNwYXRoKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbmV3IHdheSAtIHVzZSBjbGFzc2VzcGF0aCAtIGNvZGUgaXMgdGhlCi0gICAgICAgICAgICAvLyBzYW1lIGZvciBub3cKLSAgICAgICAgICAgIFN0cmluZ1tdIGNQID0gZ2V0Q2xhc3Nlc3BhdGgoKS5saXN0KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNQLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoY1BbaV0pOwotICAgICAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcnkgYXMgSkRlcGVuZCB3b3VsZCBmYWlsLCBidXQgd2h5IGxvb3NlCi0gICAgICAgICAgICAgICAgLy8gc29tZSB0aW1lPwotICAgICAgICAgICAgICAgIGlmICghZi5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlwiIiArIGYuZ2V0UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBkb2VzIG5vdCByZXByZXNlbnQgYSB2YWxpZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmaWxlIG9yIGRpcmVjdG9yeS4gSkRlcGVuZCB3b3VsZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmYWlsLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb21tYW5kbGluZS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGYuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIH0pOwogICAgICAgICBFeGVjdXRlIGV4ZWN1dGUgPSBuZXcgRXhlY3V0ZShuZXcgTG9nU3RyZWFtSGFuZGxlcih0aGlzLAogICAgICAgICAgICAgUHJvamVjdC5NU0dfSU5GTywgUHJvamVjdC5NU0dfV0FSTiksIHdhdGNoZG9nKTsKICAgICAgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjb21tYW5kbGluZS5nZXRDb21tYW5kbGluZSgpKTsKQEAgLTY3MSw3ICs2MTYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBhIHRpbWVvdXQgdmFsdWUsIG90aGVyd2lzZSB0aGUKKyAgICAgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIGEgdGltZW91dCB2YWx1ZSwgb3RoZXJ3aXNlIHRoZQogICAgICAqIHdhdGNoZG9nIGluc3RhbmNlLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvcgogICAgICAqLwpAQCAtNjc5LDYgKzYyNCwxNyBAQAogICAgICAgICBpZiAoZ2V0VGltZW91dCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKGdldFRpbWVvdXQoKS5sb25nVmFsdWUoKSk7CisgICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKGdldFRpbWVvdXQoKSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBPcHRpb25hbDxQYXRoPiBnZXRXb3JraW5nUGF0aCgpIHsKKyAgICAgICAgT3B0aW9uYWw8UGF0aD4gcmVzdWx0ID0gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDbGFzc2VzcGF0aCgpKTsKKyAgICAgICAgaWYgKHJlc3VsdC5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBPcHRpb25hbC5vZk51bGxhYmxlKGdldFNvdXJjZXNwYXRoKCkpOworICAgICAgICByZXN1bHQuaWZQcmVzZW50KHJlc291cmNlcyAtPiBsb2coIm5lc3RlZCBzb3VyY2VzcGF0aCBpcyBkZXByZWNhdGVkOyBwbGVhc2UgdXNlIGNsYXNzZXNwYXRoIikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvQ2xhc3NOYW1lUmVhZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQppbmRleCAyMGU5ZmM1Li4wYTQ0ZWMwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9DbGFzc05hbWVSZWFkZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ5LDggKzQ5LDggQEAKICAgICAgICAgc3VwZXIoKTsKIAogICAgICAgICBpbnQgY291bnQgPSBkYXRhLnJlYWRVbnNpZ25lZFNob3J0KCk7Ci0gICAgICAgIHR5cGVzID0gbmV3IGJ5dGUgWyBjb3VudCBdOwotICAgICAgICB2YWx1ZXMgPSBuZXcgT2JqZWN0IFsgY291bnQgXTsKKyAgICAgICAgdHlwZXMgPSBuZXcgYnl0ZVtjb3VudF07CisgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbY291bnRdOwogICAgICAgICAvLyByZWFkIGluIGFsbCBjb25zdGFudCBwb29sIGVudHJpZXMuCiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgYnl0ZSB0eXBlID0gZGF0YS5yZWFkQnl0ZSgpOwpAQCAtNjQsMzMgKzY0LDMzIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgSU5URUdFUiA6Ci0gICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbmV3IEludGVnZXIoZGF0YS5yZWFkSW50KCkpOworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IGRhdGEucmVhZEludCgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEZMT0FUIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgRmxvYXQoZGF0YS5yZWFkRmxvYXQoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZGF0YS5yZWFkRmxvYXQoKTsKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgY2FzZSBMT05HIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgTG9uZyhkYXRhLnJlYWRMb25nKCkpOworICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IGRhdGEucmVhZExvbmcoKTsKICAgICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgRE9VQkxFIDoKLSAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgRG91YmxlKGRhdGEucmVhZERvdWJsZSgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBkYXRhLnJlYWREb3VibGUoKTsKICAgICAgICAgICAgICAgICArK2k7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgQ0xBU1MgOgogICAgICAgICAgICAgY2FzZSBTVFJJTkcgOgotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBJbnRlZ2VyKGRhdGEucmVhZFVuc2lnbmVkU2hvcnQoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gZGF0YS5yZWFkVW5zaWduZWRTaG9ydCgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgICBjYXNlIEZJRUxEUkVGIDoKICAgICAgICAgICAgIGNhc2UgTUVUSE9EUkVGIDoKICAgICAgICAgICAgIGNhc2UgSU5URVJGQUNFTUVUSE9EUkVGIDoKICAgICAgICAgICAgIGNhc2UgTkFNRUFORFRZUEUgOgotICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBJbnRlZ2VyKGRhdGEucmVhZEludCgpKTsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBkYXRhLnJlYWRJbnQoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZwpAQCAtMTA0LDcgKzEwNCw3IEBACiAgKiBnaXZlbiBqdXN0IGFuIElucHV0U3RyZWFtLiBSZWFkcyBpbiBqdXN0IGVub3VnaCB0byBwZXJmb3JtIHRoaXMKICAqIG1pbmltYWwgdGFzayBvbmx5LgogICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NOYW1lUmVhZGVyIGV4dGVuZHMgT2JqZWN0IHsKK3B1YmxpYyBjbGFzcyBDbGFzc05hbWVSZWFkZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTEFTU19NQUdJQ19OVU1CRVIgPSAgMHhDQUZFQkFCRTsKIAogICAgIC8qKgpAQCAtMTI5LDExICsxMjksOSBAQAogICAgICAgICAvKiBpbnQgYWNjZXNzRmxhZ3MgPSAqLyBkYXRhLnJlYWRVbnNpZ25lZFNob3J0KCk7CiAgICAgICAgIGludCBjbGFzc0luZGV4ID0gZGF0YS5yZWFkVW5zaWduZWRTaG9ydCgpOwogICAgICAgICBJbnRlZ2VyIHN0cmluZ0luZGV4ID0gKEludGVnZXIpIHZhbHVlc1tjbGFzc0luZGV4XTsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIHZhbHVlc1tzdHJpbmdJbmRleC5pbnRWYWx1ZSgpXTsKLSAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIHZhbHVlc1tzdHJpbmdJbmRleF07CiAgICAgfQogCi0KIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9KbGlua1Rhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCmluZGV4IDVhMmNiYTYuLmRmMDJhYmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL0psaW5rVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsOCArMjUsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgZGVmaW5lcyBvYmplY3RzIHRoYXQgY2FuIGxpbmsgdG9nZXRoZXIgdmFyaW91cyBqYXIgYW5kCi0gKiB6aXAgZmlsZXMuCisgKiBUaGlzIHRhc2sgZGVmaW5lcyBvYmplY3RzIHRoYXQgY2FuIGxpbmsgdG9nZXRoZXIgdmFyaW91cyBqYXIgYW5kCisgKiB6aXAgZmlsZXMuICBJdCBpcyBub3QgcmVsYXRlZCB0byB0aGUge0Bjb2RlIGpsaW5rfSB0b29sIHByZXNlbnQgaW4KKyAqIEphdmEgOSBhbmQgbGF0ZXI7ICBmb3IgdGhhdCwgc2VlCisgKiB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubW9kdWxlcy5MaW5rfS4KICAqCiAgKiA8cD5JdCBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciB0aGUgamxpbmsgY29kZSB3cml0dGVuIG9yaWdpbmFsbHkKICAqIGJ5IDxhIGhyZWY9Im1haWx0bzpiZWFyZEBuZXRzY2FwZS5jb20iPlBhdHJpY2sgQmVhcmQ8L2E+LiAgVGhlCkBAIC01MiwxMSArNTQsMTkgQEAKICAqLwogcHVibGljIGNsYXNzIEpsaW5rVGFzayBleHRlbmRzIE1hdGNoaW5nVGFzayB7CiAKKyAgICBwcml2YXRlIEZpbGUgb3V0ZmlsZSA9IG51bGw7CisKKyAgICBwcml2YXRlIFBhdGggbWVyZ2VmaWxlcyA9IG51bGw7CisKKyAgICBwcml2YXRlIFBhdGggYWRkZmlsZXMgPSBudWxsOworCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXByZXNzID0gZmFsc2U7CisKICAgICAvKioKICAgICAgKiBUaGUgb3V0cHV0IGZpbGUgZm9yIHRoaXMgcnVuIG9mIGpsaW5rLiBVc3VhbGx5IGEgamFyIG9yIHppcCBmaWxlLgogICAgICAqIEBwYXJhbSBvdXRmaWxlIHRoZSBvdXRwdXQgZmlsZQogICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBzZXRPdXRmaWxlKEZpbGUgb3V0ZmlsZSkgeworICAgIHB1YmxpYyB2b2lkIHNldE91dGZpbGUoRmlsZSBvdXRmaWxlKSB7CiAgICAgICAgIHRoaXMub3V0ZmlsZSA9IG91dGZpbGU7CiAgICAgfQogCkBAIC02NSw3ICs3NSw3IEBACiAgICAgICogYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KICAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkCiAgICAgICovCi0gICAgcHVibGljICBQYXRoIGNyZWF0ZU1lcmdlZmlsZXMoKSB7CisgICAgcHVibGljIFBhdGggY3JlYXRlTWVyZ2VmaWxlcygpIHsKICAgICAgICAgaWYgKHRoaXMubWVyZ2VmaWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aGlzLm1lcmdlZmlsZXMgPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOwogICAgICAgICB9CkBAIC03Niw3ICs4Niw3IEBACiAgICAgICogU2V0cyB0aGUgZmlsZXMgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KICAgICAgKiBAcGFyYW0gbWVyZ2VmaWxlcyBhIHBhdGgKICAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgc2V0TWVyZ2VmaWxlcyhQYXRoIG1lcmdlZmlsZXMpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXJnZWZpbGVzKFBhdGggbWVyZ2VmaWxlcykgewogICAgICAgICBpZiAodGhpcy5tZXJnZWZpbGVzID09IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMubWVyZ2VmaWxlcyA9IG1lcmdlZmlsZXM7CiAgICAgICAgIH0gZWxzZSB7CkBAIC04OSw3ICs5OSw3IEBACiAgICAgICogYmUgYWRkZWQgdG8gdGhlIG91dHB1dC4KICAgICAgKiBAcmV0dXJuIGEgcGF0aCB0byBiZSBjb25maWd1cmVkCiAgICAgICovCi0gICAgcHVibGljICBQYXRoIGNyZWF0ZUFkZGZpbGVzKCkgeworICAgIHB1YmxpYyBQYXRoIGNyZWF0ZUFkZGZpbGVzKCkgewogICAgICAgICBpZiAodGhpcy5hZGRmaWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aGlzLmFkZGZpbGVzID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgfQpAQCAtMTAwLDcgKzExMCw3IEBACiAgICAgICogU2V0cyB0aGUgZmlsZXMgdG8gYmUgYWRkZWQgaW50byB0aGUgb3V0cHV0LgogICAgICAqIEBwYXJhbSBhZGRmaWxlcyBhIHBhdGgKICAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgc2V0QWRkZmlsZXMoUGF0aCBhZGRmaWxlcykgeworICAgIHB1YmxpYyB2b2lkIHNldEFkZGZpbGVzKFBhdGggYWRkZmlsZXMpIHsKICAgICAgICAgaWYgKHRoaXMuYWRkZmlsZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhpcy5hZGRmaWxlcyA9IGFkZGZpbGVzOwogICAgICAgICB9IGVsc2UgewpAQCAtMTEyLDcgKzEyMiw3IEBACiAgICAgICogRGVmaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgb3V0cHV0IHNob3VsZCBiZSBjb21wYWN0ZWQuCiAgICAgICogQHBhcmFtIGNvbXByZXNzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKICAgICAgKi8KLSAgICBwdWJsaWMgIHZvaWQgc2V0Q29tcHJlc3MoYm9vbGVhbiBjb21wcmVzcykgeworICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzKGJvb2xlYW4gY29tcHJlc3MpIHsKICAgICAgICAgdGhpcy5jb21wcmVzcyA9IGNvbXByZXNzOwogICAgIH0KIApAQCAtMTIwLDE1ICsxMzAsMTYgQEAKICAgICAgKiBEb2VzIHRoZSBhZGRpbmcgYW5kIG1lcmdpbmcuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLwotICAgIHB1YmxpYyAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy9CZSBzdXJlIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gc2V0LgogICAgICAgICBpZiAob3V0ZmlsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm91dGZpbGUgYXR0cmlidXRlIGlzIHJlcXVpcmVkISAiCi0gICAgICAgICAgICAgICAgKyAiUGxlYXNlIHNldC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAib3V0ZmlsZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQhIFBsZWFzZSBzZXQuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXZlQWRkRmlsZXMoKSAmJiAhaGF2ZU1lcmdlRmlsZXMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJhZGRmaWxlcyBvciBtZXJnZWZpbGVzIHJlcXVpcmVkISAiCi0gICAgICAgICAgICAgICAgKyAiUGxlYXNlIHNldC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYWRkZmlsZXMgb3IgbWVyZ2VmaWxlcyByZXF1aXJlZCEgUGxlYXNlIHNldC4iKTsKICAgICAgICAgfQogICAgICAgICBsb2coImxpbmtpbmc6ICAgICAiICsgb3V0ZmlsZS5nZXRQYXRoKCkpOwogICAgICAgICBsb2coImNvbXByZXNzaW9uOiAiICsgY29tcHJlc3MsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwpAQCAtMTU5LDIzICsxNzAsNiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBoYXZlRW50cmllcyhQYXRoIHApIHsKLSAgICAgICAgaWYgKHAgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuICEocCA9PSBudWxsIHx8IHAuaXNFbXB0eSgpKTsKICAgICB9Ci0KLSAgICBwcml2YXRlICBGaWxlIG91dGZpbGUgPSBudWxsOwotCi0gICAgcHJpdmF0ZSAgUGF0aCBtZXJnZWZpbGVzID0gbnVsbDsKLQotICAgIHByaXZhdGUgIFBhdGggYWRkZmlsZXMgPSBudWxsOwotCi0gICAgcHJpdmF0ZSAgYm9vbGVhbiBjb21wcmVzcyA9IGZhbHNlOwotCiB9Ci0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvamxpbmsuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2psaW5rL2psaW5rLmphdmEKaW5kZXggNzQ0ZmE0MC4uNDgwYzRjYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamxpbmsvamxpbmsuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qbGluay9qbGluay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsMTEgKzI0LDEyIEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlcjsKQEAgLTM3LDggKzM4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBPdXRwdXRTdHJlYW07CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLQogLy8gQ2hlY2tTdHlsZTpUeXBlTmFtZUNoZWNrIE9GRiAtIGJjCiAvKioKICAqIGpsaW5rIGxpbmtzIHRvZ2V0aGVyIG11bHRpcGxlIC5qYXIgZmlsZXMuCkBAIC00OSw5ICs0OCw5IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBvdXRmaWxlID0gbnVsbDsKIAotICAgIHByaXZhdGUgVmVjdG9yIG1lcmdlZmlsZXMgPSBuZXcgVmVjdG9yKFZFQ1RPUl9JTklUX1NJWkUpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1lcmdlZmlsZXMgPSBuZXcgVmVjdG9yPD4oVkVDVE9SX0lOSVRfU0laRSk7CiAKLSAgICBwcml2YXRlIFZlY3RvciBhZGRmaWxlcyA9IG5ldyBWZWN0b3IoVkVDVE9SX0lOSVRfU0laRSk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYWRkZmlsZXMgPSBuZXcgVmVjdG9yPD4oVkVDVE9SX0lOSVRfU0laRSk7CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29tcHJlc3Npb24gPSBmYWxzZTsKIApAQCAtNzEsNyArNzAsNiBAQAogICAgICAgICB0aGlzLm91dGZpbGUgPSBvdXRmaWxlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQWRkcyBhIGZpbGUgdG8gYmUgbWVyZ2VkIGludG8gdGhlIG91dHB1dC4KICAgICAgKiBAcGFyYW0gZmlsZVRvTWVyZ2UgdGhlIGZpbGUgdG8gbWVyZ2UgaW50byB0aGUgb3V0cHV0LgpAQCAtODAsMTAgKzc4LDkgQEAKICAgICAgICAgaWYgKGZpbGVUb01lcmdlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBtZXJnZWZpbGVzLmFkZEVsZW1lbnQoZmlsZVRvTWVyZ2UpOworICAgICAgICBtZXJnZWZpbGVzLmFkZChmaWxlVG9NZXJnZSk7CiAgICAgfQogCi0KICAgICAvKiogQWRkcyBhIGZpbGUgdG8gYmUgYWRkZWQgaW50byB0aGUgb3V0cHV0LgogICAgICAqIEBwYXJhbSBmaWxlVG9BZGQgdGhlIGZpbGUgdG8gYWRkIHRvIHRoZSBvdXRwdXQuCiAgICAgICovCkBAIC05MSwzOCArODgsMzUgQEAKICAgICAgICAgaWYgKGZpbGVUb0FkZCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgYWRkZmlsZXMuYWRkRWxlbWVudChmaWxlVG9BZGQpOworICAgICAgICBhZGRmaWxlcy5hZGQoZmlsZVRvQWRkKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEFkZHMgc2V2ZXJhbCBmaWxlcyB0byBiZSBtZXJnZWQgaW50byB0aGUgb3V0cHV0LgogICAgICAqIEBwYXJhbSBmaWxlc1RvTWVyZ2UgYW4gYXJyYXkgb2YgZmlsZXMgdG8gbWVyZ2UgaW50byB0aGUgb3V0cHV0LgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZE1lcmdlRmlsZXMoU3RyaW5nW10gZmlsZXNUb01lcmdlKSB7CisgICAgcHVibGljIHZvaWQgYWRkTWVyZ2VGaWxlcyhTdHJpbmcuLi4gZmlsZXNUb01lcmdlKSB7CiAgICAgICAgIGlmIChmaWxlc1RvTWVyZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNUb01lcmdlLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRNZXJnZUZpbGUoZmlsZXNUb01lcmdlW2ldKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IGZpbGVzVG9NZXJnZSkgeworICAgICAgICAgICAgYWRkTWVyZ2VGaWxlKGVsZW1lbnQpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKLSAgICAgKiBBZGRzIHNldmVyYWwgZmlsZSB0byBiZSBhZGRlZCBpbnRvIHRoZSBvdXRwdXQuCisgICAgICogQWRkcyBzZXZlcmFsIGZpbGVzIHRvIGJlIGFkZGVkIGludG8gdGhlIG91dHB1dC4KICAgICAgKiBAcGFyYW0gZmlsZXNUb0FkZCBhbiBhcnJheSBvZiBmaWxlcyB0byBhZGQgdG8gdGhlIG91dHB1dC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRBZGRGaWxlcyhTdHJpbmdbXSBmaWxlc1RvQWRkKSB7CisgICAgcHVibGljIHZvaWQgYWRkQWRkRmlsZXMoU3RyaW5nLi4uIGZpbGVzVG9BZGQpIHsKICAgICAgICAgaWYgKGZpbGVzVG9BZGQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXNUb0FkZC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkQWRkRmlsZShmaWxlc1RvQWRkW2ldKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IGZpbGVzVG9BZGQpIHsKKyAgICAgICAgICAgIGFkZEFkZEZpbGUoZWxlbWVudCk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIERldGVybWluZXMgd2hldGhlciBvdXRwdXQgd2lsbCBiZSBjb21wcmVzc2VkLgogICAgICAqIEBwYXJhbSBjb21wcmVzcyBpZiB0cnVlIHVzZSBjb21wcmVzc2lvbi4KQEAgLTEzMSw3ICsxMjUsNiBAQAogICAgICAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcHJlc3M7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBQZXJmb3JtcyB0aGUgbGlua2luZyBvZiBmaWxlcy4gQWRkZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBvdXRwdXQgYXMtaXMuCiAgICAgICogRm9yIGV4YW1wbGUsIGEgamFyIGZpbGUgaXMgYWRkZWQgdG8gdGhlIG91dHB1dCBhcyBhIGphciBmaWxlLiBIb3dldmVyLApAQCAtMTQ1LDQ4ICsxMzgsNDAgQEAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vTk9TT05BUgotICAgICAgICBaaXBPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRmaWxlKSk7CisgICAgICAgIHRyeSAoWmlwT3V0cHV0U3RyZWFtIG91dHB1dCA9CisgICAgICAgICAgICBuZXcgWmlwT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbShQYXRocy5nZXQob3V0ZmlsZSkpKSkgewogCi0gICAgICAgIGlmIChjb21wcmVzc2lvbikgewotICAgICAgICAgICAgb3V0cHV0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uREVGTEFURUQpOwotICAgICAgICAgICAgb3V0cHV0LnNldExldmVsKERlZmxhdGVyLkRFRkFVTFRfQ09NUFJFU1NJT04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb3V0cHV0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uU1RPUkVEKTsKLSAgICAgICAgfQotCi0gICAgICAgIEVudW1lcmF0aW9uIG1lcmdlcyA9IG1lcmdlZmlsZXMuZWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAobWVyZ2VzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpIG1lcmdlcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7Ci0KLSAgICAgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpIHsKLSAgICAgICAgICAgICAgICAvL0RvIHRoZSBtZXJnZQotICAgICAgICAgICAgICAgIG1lcmdlWmlwSmFyQ29udGVudHMob3V0cHV0LCBmKTsKKyAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbikgeworICAgICAgICAgICAgICAgIG91dHB1dC5zZXRNZXRob2QoWmlwT3V0cHV0U3RyZWFtLkRFRkxBVEVEKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQuc2V0TGV2ZWwoRGVmbGF0ZXIuREVGQVVMVF9DT01QUkVTU0lPTik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vQWRkIHRoaXMgZmlsZSB0byB0aGUgYWRkZmlsZXMgVmVjdG9yIGFuZCBhZGQgaXQKLSAgICAgICAgICAgICAgICAvL2xhdGVyIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIG91dHB1dCBmaWxlLgotICAgICAgICAgICAgICAgIGFkZEFkZEZpbGUocGF0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldE1ldGhvZChaaXBPdXRwdXRTdHJlYW0uU1RPUkVEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBtZXJnZWZpbGVzKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUocGF0aCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKQorICAgICAgICAgICAgICAgICAgICB8fCBmLmdldE5hbWUoKS5lbmRzV2l0aCgiLnppcCIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vRG8gdGhlIG1lcmdlCisgICAgICAgICAgICAgICAgICAgIG1lcmdlWmlwSmFyQ29udGVudHMob3V0cHV0LCBmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvL0FkZCB0aGlzIGZpbGUgdG8gdGhlIGFkZGZpbGVzIFZlY3RvciBhbmQgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIC8vbGF0ZXIgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgICAgICAgICAgICAgIGFkZEFkZEZpbGUocGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGFkZGZpbGVzKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobmFtZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZERpckNvbnRlbnRzKG91dHB1dCwgZiwgZi5nZXROYW1lKCkgKyAnLycsIGNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhZGRGaWxlKG91dHB1dCwgZiwgIiIsIGNvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBFbnVtZXJhdGlvbiBhZGRzID0gYWRkZmlsZXMuZWxlbWVudHMoKTsKLQotICAgICAgICB3aGlsZSAoYWRkcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBhZGRzLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShuYW1lKTsKLQotICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpbiBqbGluazogYWRkaW5nIGRpcmVjdG9yeSBjb250ZW50cyBvZiAiICsgZi5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgIGFkZERpckNvbnRlbnRzKG91dHB1dCwgZiwgZi5nZXROYW1lKCkgKyAnLycsIGNvbXByZXNzaW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYWRkRmlsZShvdXRwdXQsIGYsICIiLCBjb21wcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dHB1dCk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBUaGUgY29tbWFuZCBsaW5lIGVudHJ5IHBvaW50IGZvciBqbGluay4KICAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBhcmd1bWVudHMKQEAgLTIxMiw3ICsxOTcsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKgogICAgICAqIEFjdHVhbGx5IHBlcmZvcm1zIHRoZSBtZXJnaW5nIG9mIGYgaW50byB0aGUgb3V0cHV0LgogICAgICAqIGYgc2hvdWxkIGJlIGEgemlwIG9yIGphciBmaWxlLgpAQCAtMjIyLDEyICsyMDYsMTAgQEAKICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgWmlwRmlsZSB6aXBmID0gbmV3IFppcEZpbGUoZik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlbnRyaWVzID0gemlwZi5lbnRyaWVzKCk7Ci0KKyAgICAgICAgdHJ5IChaaXBGaWxlIHppcGYgPSBuZXcgWmlwRmlsZShmKSkgeworICAgICAgICAgICAgRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBlbnRyaWVzID0gemlwZi5lbnRyaWVzKCk7CiAgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFppcEVudHJ5IGlucHV0RW50cnkgPSAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBaaXBFbnRyeSBpbnB1dEVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwogICAgICAgICAgICAgICAgIC8vSWdub3JlIG1hbmlmZXN0IGVudHJpZXMuICBUaGV5J3JlIGJvdW5kIHRvIGNhdXNlIGNvbmZsaWN0cyBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgLy9maWxlcyB0aGF0IGFyZSBiZWluZyBtZXJnZWQuICBVc2VyIHNob3VsZCBzdXBwbHkgdGhlaXIgb3duCiAgICAgICAgICAgICAgICAgLy9tYW5pZmVzdCBmaWxlIHdoZW4gZG9pbmcgdGhlIG1lcmdlLgpAQCAtMjQ4LDMwICsyMzAsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleC5nZXRNZXNzYWdlKCkuY29udGFpbnMoImR1cGxpY2F0ZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JdCB3YXMgdGhlIGR1cGxpY2F0ZSBlbnRyeS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSSBoYXRlIHRvIGFkbWl0IGl0LCBidXQgd2UgZG9uJ3Qga25vdyB3aGF0IGhhcHBlbmVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZS4gIFRocm93IHRoZSBFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJIGhhdGUgdG8gYWRtaXQgaXQsIGJ1dCB3ZSBkb24ndCBrbm93IHdoYXQgaGFwcGVuZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhlcmUuICBUaHJvdyB0aGUgRXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHppcGYuZ2V0SW5wdXRTdHJlYW0oaW5wdXRFbnRyeSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IHppcGYuZ2V0SW5wdXRTdHJlYW0oaW5wdXRFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBidWZmZXIubGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gLTE7CiAKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBsZW4pKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoY291bnQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgbGVuKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlRW50cnkoKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2VFbnRyeSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHppcGYuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoKICAgICAgKiBBZGRzIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IHRvIHRoZSBvdXRwdXQuCiAgICAgICovCkBAIC0yODgsNyArMjY2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoKICAgICAgKiBHZXRzIHRoZSBuYW1lIG9mIGFuIGVudHJ5IGluIHRoZSBmaWxlLiAgVGhpcyBpcyB0aGUgcmVhbCBuYW1lCiAgICAgICogd2hpY2ggZm9yIGEgY2xhc3MgaXMgdGhlIG5hbWUgb2YgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgY2xhc3MKQEAgLTI5OSw5ICsyNzYsNyBAQAogCiAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgIC8vIHNlZSBpZiB0aGUgZmlsZSBpcyBpbiBmYWN0IGEgLmNsYXNzIGZpbGUsIGFuZCBkZXRlcm1pbmUgaXRzIGFjdHVhbCBuYW1lLgotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlucHV0ID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gQ2xhc3NOYW1lUmVhZGVyLmdldENsYXNzTmFtZShpbnB1dCk7CiAKICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKQEAgLTMwOSwxMyArMjg0LDEyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCi0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbnB1dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGcm9tICIgKyBmaWxlLmdldFBhdGgoKSArICIgYW5kIHByZWZpeCAiICsgcHJlZml4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNyZWF0aW5nIGVudHJ5ICIgKyBwcmVmaXggKyBuYW1lKTsKLSAgICAgICAgcmV0dXJuIChwcmVmaXggKyBuYW1lKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoCisgICAgICAgICAgICAiRnJvbSAlMSRzIGFuZCBwcmVmaXggJTIkcywgY3JlYXRpbmcgZW50cnkgJTIkcyUzJHMlbiIsCisgICAgICAgICAgICBmaWxlLmdldFBhdGgoKSwgcHJlZml4LCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIHByZWZpeCArIG5hbWU7CiAgICAgfQogCiAKQEAgLTMzNSwxMiArMzA5LDkgQEAKICAgICAgICAgaWYgKCFjb21wcmVzcykgewogICAgICAgICAgICAgZW50cnkuc2V0Q3JjKGNhbGNDaGVja3N1bShmaWxlKSk7CiAgICAgICAgIH0KLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQotICAgICAgICBhZGRUb091dHB1dFN0cmVhbShvdXRwdXQsIGlucHV0LCBlbnRyeSk7CisgICAgICAgIGFkZFRvT3V0cHV0U3RyZWFtKG91dHB1dCwgRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSksIGVudHJ5KTsKICAgICB9CiAKLQogICAgIC8qCiAgICAgICogQSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBzZXZlcmFsIG90aGVyIG1ldGhvZHMgbWlnaHQgY2FsbC4KICAgICAgKi8KQEAgLTM1NCw3ICszMjUsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IG51bUJ5dGVzID0gLTE7CisgICAgICAgIGludCBudW1CeXRlczsKIAogICAgICAgICB3aGlsZSAoKG51bUJ5dGVzID0gaW5wdXQucmVhZChidWZmZXIpKSA+IDApIHsKICAgICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIG51bUJ5dGVzKTsKQEAgLTM2Myw3ICszMzQsNiBAQAogICAgICAgICBpbnB1dC5jbG9zZSgpOwogICAgIH0KIAotCiAgICAgLyoKICAgICAgKiBBIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHdvcmsgb24gYSBnaXZlbiBlbnRyeSBpbiBhIG1lcmdlZmlsZS4KICAgICAgKiBUaGUgYmlnIGRlYWwgaXMgdG8gc2V0IHRoZSByaWdodCBwYXJhbWV0ZXJzIGluIHRoZSBaaXBFbnRyeQpAQCAtMzg0LDEyICszNTQsMTAgQEAKICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbnB1dEVudHJ5LmdldE5hbWUoKTsKIAotICAgICAgICBpZiAoIShpbnB1dEVudHJ5LmlzRGlyZWN0b3J5KCkgfHwgbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gemlwLmdldElucHV0U3RyZWFtKHppcC5nZXRFbnRyeShuYW1lKSk7CisgICAgICAgIGlmICghaW5wdXRFbnRyeS5pc0RpcmVjdG9yeSgpICYmICFuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgeworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbnB1dCA9IHppcC5nZXRJbnB1dFN0cmVhbSh6aXAuZ2V0RW50cnkobmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IENsYXNzTmFtZVJlYWRlci5nZXRDbGFzc05hbWUoaW5wdXQpOwogCi0gICAgICAgICAgICAgICAgaW5wdXQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNCwxOCArMzgyLDE1IEBACiAgICAgICAgIHJldHVybiBvdXRwdXRFbnRyeTsKICAgICB9CiAKLQogICAgIC8qCiAgICAgICogTmVjZXNzYXJ5IGluIHRoZSBjYXNlIHdoZXJlIHlvdSBhZGQgYSBlbnRyeSB0aGF0CiAgICAgICogaXMgbm90IGNvbXByZXNzZWQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBsb25nIGNhbGNDaGVja3N1bShGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKLQotICAgICAgICByZXR1cm4gY2FsY0NoZWNrc3VtKGluKTsKKyAgICAgICAgcmV0dXJuIGNhbGNDaGVja3N1bSgKKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKGYudG9QYXRoKCkpKSk7CiAgICAgfQogCi0KICAgICAvKgogICAgICAqIE5lY2Vzc2FyeSBpbiB0aGUgY2FzZSB3aGVyZSB5b3UgYWRkIGEgZW50cnkgdGhhdAogICAgICAqIGlzIG5vdCBjb21wcmVzc2VkLgpAQCAtNDMzLDE4ICszOTgsMTUgQEAKICAgICBwcml2YXRlIGxvbmcgY2FsY0NoZWNrc3VtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDUkMzMiBjcmMgPSBuZXcgQ1JDMzIoKTsKICAgICAgICAgaW50IGxlbiA9IGJ1ZmZlci5sZW5ndGg7Ci0gICAgICAgIGludCBjb3VudCA9IC0xOwotICAgICAgICBpbnQgaGF2ZVJlYWQgPSAwOworICAgICAgICBpbnQgY291bnQ7CiAKICAgICAgICAgd2hpbGUgKChjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBsZW4pKSA+IDApIHsKLSAgICAgICAgICAgIGhhdmVSZWFkICs9IGNvdW50OwogICAgICAgICAgICAgY3JjLnVwZGF0ZShidWZmZXIsIDAsIGNvdW50KTsKICAgICAgICAgfQogICAgICAgICBpbi5jbG9zZSgpOwogICAgICAgICByZXR1cm4gY3JjLmdldFZhbHVlKCk7CiAgICAgfQogCi0KIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSmFzcGVyNDFNYW5nbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSmFzcGVyNDFNYW5nbGVyLmphdmEKaW5kZXggYzcxYTZkNS4uNDE2NzdiZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0phc3BlcjQxTWFuZ2xlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9KYXNwZXI0MU1hbmdsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI3LDEzICsyNywxMyBAQAogICovCiBwdWJsaWMgY2xhc3MgSmFzcGVyNDFNYW5nbGVyIGltcGxlbWVudHMgSnNwTWFuZ2xlciB7CiAKLQogICAgIC8qKgogICAgICAqIG1hcCBmcm9tIGEganNwIGZpbGUgdG8gYSBqYXZhIGZpbGVuYW1lOyBkb2VzIG5vdCBkbyBwYWNrYWdlcwogICAgICAqCiAgICAgICogQHBhcmFtIGpzcEZpbGUgZmlsZQogICAgICAqIEByZXR1cm4gamF2YSBmaWxlbmFtZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgbWFwSnNwVG9KYXZhTmFtZShGaWxlIGpzcEZpbGUpIHsKICAgICAgICAgU3RyaW5nIGpzcFVyaSA9IGpzcEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIGludCBzdGFydCA9IGpzcFVyaS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpICsgMTsKQEAgLTc1LDcgKzc1LDYgQEAKICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogdGFraW5nIGluIHRoZSBzdWJzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyCiAgICAgICogcmV0dXJuIGEgbmV3IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGRlc3RpbmF0aW9uIHBhdGgKQEAgLTgzLDYgKzgyLDcgQEAKICAgICAgKiBAcmV0dXJuIG51bGwgYXMgdGhpcyBpcyBub3QgaW1wbGVtZW50ZWQuCiAgICAgICogQHRvZG8KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIG1hcFBhdGgoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcEMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BDLmphdmEKaW5kZXggNDJjYWI3ZS4uNmIwZmI1YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcEMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSnNwQy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksOCArMTksNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3A7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRDbGFzc0xvYWRlcjsKQEAgLTgwLDggKzc5LDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gbWFwcGVkOwogICAgIHByaXZhdGUgaW50IHZlcmJvc2UgPSAwOwogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCi0gICAgcHJvdGVjdGVkIFZlY3RvciBjb21waWxlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBWZWN0b3IgamF2YUZpbGVzID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8U3RyaW5nPiBjb21waWxlTGlzdCA9IG5ldyBWZWN0b3I8PigpOworICAgIFZlY3RvcjxGaWxlPiBqYXZhRmlsZXMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqICBmbGFnIHRvIGNvbnRyb2wgYWN0aW9uIG9uIGV4ZWN1dGlvbiB0cm91YmxlCkBAIC0yMDksNiArMjA4LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldEllcGx1Z2luKCkgewogICAgICAgICByZXR1cm4gaWVwbHVnaW5pZDsKICAgICB9CisKICAgICAvKioKICAgICAgKiBKYXZhIFBsdWdpbiBDTEFTU0lEIGZvciBJbnRlcm5ldCBFeHBsb3JlcgogICAgICAqIEBwYXJhbSBpZXBsdWdpbmlkIHRoZSBpZCB0byB1c2UuCkBAIC0yNzIsNyArMjcyLDYgQEAKICAgICAgICAgcmV0dXJuIHVyaXJvb3Q7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGNsYXNzcGF0aCB0byBiZSB1c2VkIGZvciB0aGlzIGNvbXBpbGF0aW9uLgogICAgICAqIEBwYXJhbSBjcCB0aGUgcGF0aCB0byBiZSB1c2VkLgpAQCAtNDEzLDcgKzQxMiw3IEBACiAgICAgICogZ2V0IHRoZSBsaXN0IG9mIGZpbGVzIHRvIGNvbXBpbGUKICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZpbGVzLgogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0Q29tcGlsZUxpc3QoKSB7CisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldENvbXBpbGVMaXN0KCkgewogICAgICAgICByZXR1cm4gY29tcGlsZUxpc3Q7CiAgICAgfQogCkBAIC00MjIsNiArNDIxLDcgQEAKICAgICAgKiBoYXZlIGNoYW5nZWQgYW5kIGhhbmQgdGhlbSBvZmYgdG8gYSBqc3AgY29tcGlsZXIKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogCkBAIC00MzksMTMgKzQzOSwxMCBAQAogCiAgICAgICAgIEZpbGUgZGVzdCA9IGdldEFjdHVhbERlc3REaXIoKTsKIAotICAgICAgICBBbnRDbGFzc0xvYWRlciBhbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoQW50Q2xhc3NMb2FkZXIgYWwgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY29tcGlsZXJDbGFzc3BhdGgpKSB7CiAgICAgICAgICAgICAvL2JpbmQgdG8gYSBjb21waWxlcgogICAgICAgICAgICAgSnNwQ29tcGlsZXJBZGFwdGVyIGNvbXBpbGVyID0KLSAgICAgICAgICAgICAgICBKc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmdldENvbXBpbGVyKGNvbXBpbGVyTmFtZSwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWwgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY29tcGlsZXJDbGFzc3BhdGgpKTsKKyAgICAgICAgICAgICAgICBKc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5LmdldENvbXBpbGVyKGNvbXBpbGVyTmFtZSwgdGhpcywgYWwpOwogCiAgICAgICAgICAgICAvL2lmIHdlIGFyZSBhIHdlYmFwcCwgaGFuZCBvZmYgdG8gdGhlIGNvbXBpbGVyLCB3aGljaCBoYWQKICAgICAgICAgICAgIC8vYmV0dGVyIGhhbmRsZSBpdApAQCAtNDk5LDcgKzQ5Niw3IEBACiAgICAgICAgICAgICBsb2coImNvbXBpbGluZyAiICsgY29tcGlsZUxpc3Quc2l6ZSgpICsgIiBmaWxlcyIsCiAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgICAgIGlmIChjb21waWxlTGlzdC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWNvbXBpbGVMaXN0LmlzRW1wdHkoKSkgewogCiAgICAgICAgICAgICAgICAgbG9nKCJDb21waWxpbmcgIiArIGNvbXBpbGVMaXN0LnNpemUoKSArICIgc291cmNlIGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICsgKGNvbXBpbGVMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIpCkBAIC01MDcsMTYgKzUwNCwxMCBAQAogICAgICAgICAgICAgICAgICAgICArIGRlc3QpOwogICAgICAgICAgICAgICAgIGRvQ29tcGlsYXRpb24oY29tcGlsZXIpOwogCisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbGVjb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbG9nKCJ0aGVyZSB3ZXJlIG5vIGZpbGVzIHRvIGNvbXBpbGUiLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbGVjb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZygidGhlcmUgd2VyZSBubyBmaWxlcyB0byBjb21waWxlIiwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJhbGwgZmlsZXMgYXJlIHVwIHRvIGRhdGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFsLmNsZWFudXAoKTsKKyAgICAgICAgICAgICAgICBsb2coImFsbCBmaWxlcyBhcmUgdXAgdG8gZGF0ZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNTI2LDE1ICs1MTcsMTEgQEAKICAgICAgKiB0aGlzIGlzIGRlc3REaXIgb3IgaXQgaWQgZGVzdERpciArIHRoZSBwYWNrYWdlIG5hbWUKICAgICAgKi8KICAgICBwcml2YXRlIEZpbGUgZ2V0QWN0dWFsRGVzdERpcigpIHsKLSAgICAgICAgRmlsZSBkZXN0ID0gbnVsbDsKICAgICAgICAgaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc3QgPSBkZXN0RGlyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkZXN0RGlyLmdldFBhdGgoKSArIEZpbGUuc2VwYXJhdG9yQ2hhcgotICAgICAgICAgICAgICAgICsgcGFja2FnZU5hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICBkZXN0ID0gbmV3IEZpbGUocGF0aCk7CisgICAgICAgICAgICByZXR1cm4gZGVzdERpcjsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVzdDsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRlc3REaXIuZ2V0UGF0aCgpICsgRmlsZS5zZXBhcmF0b3JDaGFyCisgICAgICAgICAgICArIHBhY2thZ2VOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU0OSw5ICs1MzYsOCBAQAogICAgICAgICBpZiAoIWNvbXBpbGVyLmV4ZWN1dGUoKSkgewogICAgICAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEZBSUxfTVNHLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbG9nKEZBSUxfTVNHLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKEZBSUxfTVNHLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01NzMsMjMgKzU1OSwxOSBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNjYW5EaXIoRmlsZSBzcmNEaXIsIEZpbGUgZGVzdCwgSnNwTWFuZ2xlciBtYW5nbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gZmlsZXMpIHsKIAotICAgICAgICBsb25nIG5vdyA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisgICAgICAgIGxvbmcgbm93ID0gSW5zdGFudC5ub3coKS50b0Vwb2NoTWlsbGkoKTsKIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlc1tpXTsKKyAgICAgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBmaWxlcykgewogICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUoc3JjRGlyLCBmaWxlbmFtZSk7CiAgICAgICAgICAgICBGaWxlIGphdmFGaWxlID0gbWFwVG9KYXZhRmlsZShtYW5nbGVyLCBzcmNGaWxlLCBzcmNEaXIsIGRlc3QpOwogICAgICAgICAgICAgaWYgKGphdmFGaWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBub3cpIHsKICAgICAgICAgICAgICAgICBsb2coIldhcm5pbmc6IGZpbGUgbW9kaWZpZWQgaW4gdGhlIGZ1dHVyZTogIiArIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQ29tcGlsZSA9IGZhbHNlOwotICAgICAgICAgICAgc2hvdWxkQ29tcGlsZSA9IGlzQ29tcGlsZU5lZWRlZChzcmNGaWxlLCBqYXZhRmlsZSk7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkQ29tcGlsZSkgeworICAgICAgICAgICAgaWYgKGlzQ29tcGlsZU5lZWRlZChzcmNGaWxlLCBqYXZhRmlsZSkpIHsKICAgICAgICAgICAgICAgICBjb21waWxlTGlzdC5hZGRFbGVtZW50KHNyY0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgIGphdmFGaWxlcy5hZGRFbGVtZW50KGphdmFGaWxlKTsKICAgICAgICAgICAgIH0KQEAgLTYxOSwyNiArNjAxLDIxIEBACiAgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgc3JjRmlsZS5nZXRQYXRoKCkKICAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBqYXZhIGZpbGUgIiArIGphdmFGaWxlLmdldFBhdGgoKQogICAgICAgICAgICAgICAgICsgIiBkb2VzIG5vdCBleGlzdCIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBqYXZhRmlsZS5sYXN0TW9kaWZpZWQoKSkgewotICAgICAgICAgICAgICAgIHNob3VsZENvbXBpbGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZygiQ29tcGlsaW5nICIgKyBzcmNGaWxlLmdldFBhdGgoKQotICAgICAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBpdCBpcyBvdXQgb2YgZGF0ZSB3aXRoIHJlc3BlY3QgdG8gIgotICAgICAgICAgICAgICAgICAgICArIGphdmFGaWxlLmdldFBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChqYXZhRmlsZS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3VsZENvbXBpbGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgc3JjRmlsZS5nZXRQYXRoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGphdmEgZmlsZSAiICsgamF2YUZpbGUuZ2V0UGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgZW1wdHkiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IGphdmFGaWxlLmxhc3RNb2RpZmllZCgpKSB7CisgICAgICAgICAgICBzaG91bGRDb21waWxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGxvZygiQ29tcGlsaW5nICIgKyBzcmNGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICsgIiBiZWNhdXNlIGl0IGlzIG91dCBvZiBkYXRlIHdpdGggcmVzcGVjdCB0byAiCisgICAgICAgICAgICAgICAgKyBqYXZhRmlsZS5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIH0gZWxzZSBpZiAoamF2YUZpbGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgc2hvdWxkQ29tcGlsZSA9IHRydWU7CisgICAgICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgc3JjRmlsZS5nZXRQYXRoKCkKKyAgICAgICAgICAgICAgICArICIgYmVjYXVzZSBqYXZhIGZpbGUgIiArIGphdmFGaWxlLmdldFBhdGgoKQorICAgICAgICAgICAgICAgICsgIiBpcyBlbXB0eSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzaG91bGRDb21waWxlOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogZ2V0IGEgZmlsZW5hbWUgZnJvbSBvdXIganNwIGZpbGUuCiAgICAgICogQHBhcmFtIG1hbmdsZXIgdGhlIGpzcCBmaWxlbmFtZSBtYW5hZ2VyLgpAQCAtNjU0LDcgKzYzMSw2IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgamF2YUZpbGVOYW1lID0gbWFuZ2xlci5tYXBKc3BUb0phdmFOYW1lKHNyY0ZpbGUpOwotICAgICAgICAvLyAgICAgICAgU3RyaW5nIHNyY0ZpbGVEaXI9c3JjRmlsZS5nZXRQYXJlbnQoKTsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRlc3QsIGphdmFGaWxlTmFtZSk7CiAgICAgfQogCkBAIC02NjUsOSArNjQxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBkZWxldGVFbXB0eUphdmFGaWxlcygpIHsKICAgICAgICAgaWYgKGphdmFGaWxlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gamF2YUZpbGVzLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IChGaWxlKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBmb3IgKEZpbGUgZmlsZSA6IGphdmFGaWxlcykgewogICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUubGVuZ3RoKCkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBsb2coImRlbGV0aW5nIGVtcHR5IG91dHB1dCBmaWxlICIgKyBmaWxlKTsKICAgICAgICAgICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKQEAgLTcwMSw5ICs2NzUsNiBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYXNlRGlyKEZpbGUgZGlyZWN0b3J5KSB7CiAgICAgICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKICAgICAgICAgfQotICAgICAgICAvL2VuZCBpbm5lciBjbGFzcwogICAgIH0KIAotCi0gICAgLy9lbmQgY2xhc3MKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BNYW5nbGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvSnNwTWFuZ2xlci5qYXZhCmluZGV4IGY2MjQ5MmMuLjRkZGM5YWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BNYW5nbGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE1hbmdsZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9Kc3BOYW1lTWFuZ2xlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE5hbWVNYW5nbGVyLmphdmEKaW5kZXggODU1Mzc2YS4uMzhhMjdmZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE5hbWVNYW5nbGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL0pzcE5hbWVNYW5nbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01OCw2ICs1OCw3IEBACiAgICAgICogQHBhcmFtIGpzcEZpbGUgZmlsZQogICAgICAqIEByZXR1cm4gamF2YSBmaWxlbmFtZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgbWFwSnNwVG9KYXZhTmFtZShGaWxlIGpzcEZpbGUpIHsKICAgICAgICAgcmV0dXJuIG1hcEpzcFRvQmFzZU5hbWUoanNwRmlsZSkgKyAiLmphdmEiOwogICAgIH0KQEAgLTcwLDIwICs3MSwxOSBAQAogICAgICAqIEByZXR1cm4gZXh0ZW5zaW9ubGVzcyBwb3RlbnRpYWxseSByZW1hcHBlZCBuYW1lCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgbWFwSnNwVG9CYXNlTmFtZShGaWxlIGpzcEZpbGUpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZTsKLSAgICAgICAgY2xhc3NOYW1lID0gc3RyaXBFeHRlbnNpb24oanNwRmlsZSk7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBzdHJpcEV4dGVuc2lvbihqc3BGaWxlKTsKIAogICAgICAgICAvLyBzaW5jZSB3ZSBkb24ndCBtYW5nbGUgZXh0ZW5zaW9ucyBsaWtlIHRoZSBzZXJ2bGV0IGRvZXMsCiAgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGtleXdvcmRzIGFzIGNsYXNzIG5hbWVzCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5d29yZHMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKGtleXdvcmRzW2ldKSkgeworICAgICAgICBmb3IgKFN0cmluZyBrZXl3b3JkIDoga2V5d29yZHMpIHsKKyAgICAgICAgICAgIGlmIChjbGFzc05hbWUuZXF1YWxzKGtleXdvcmQpKSB7CiAgICAgICAgICAgICAgICAgY2xhc3NOYW1lICs9ICIlIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIEZpeCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzLiBJZiB5b3UgdGhpbmsgb2YgbW9yZSBhZGQgdG8gdGhlIGxpc3QuCi0gICAgICAgIFN0cmluZ0J1ZmZlciBtb2RpZmllZENsYXNzTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoY2xhc3NOYW1lLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtb2RpZmllZENsYXNzTmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKGNsYXNzTmFtZS5sZW5ndGgoKSk7CiAgICAgICAgIC8vIGZpcnN0IGNoYXIgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSByZXN0CiAgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gY2xhc3NOYW1lLmNoYXJBdCgwKTsKICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoZmlyc3RDaGFyKSkgewpAQCAtMTQ3LDYgKzE0Nyw3IEBACiAgICAgICogQHBhcmFtIHBhdGggbm90IHVzZWQKICAgICAgKiBAcmV0dXJuIG51bGwgYWx3YXlzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgbWFwUGF0aChTdHJpbmcgcGF0aCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvV0xKc3BjLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvV0xKc3BjLmphdmEKaW5kZXggMjY4MDg0Ny4uMTJjYzZlOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL1dMSnNwYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9XTEpzcGMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDggQEAKIAogLy9hcGFjaGUvYW50IGltcG9ydHMKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC0zMywxOCArMzQsMTggQEAKIC8qKgogICogUHJlY29tcGlsZXMgSlNQJ3MgdXNpbmcgV2ViTG9naWMncyBKU1AgY29tcGlsZXIgKHdlYmxvZ2ljLmpzcGMpLgogICoKLSAqIFRlc3RlZCBvbmx5IG9uIFdlYmxvZ2ljIDQuNS4xIC0gTlQ0LjAgYW5kIFNvbGFyaXMgNS43CisgKiBUZXN0ZWQgb25seSBvbiBXZWJMb2dpYyA0LjUuMSAtIE5UNC4wIGFuZCBTb2xhcmlzIDUuNwogICoKICAqIHJlcXVpcmVkIGF0dHJpYnV0ZXMKLSAqICAgICAgc3JjIDogcm9vdCBvZiBzb3VyY2UgdHJlZSBmb3IgSlNQLCBpZSwgdGhlIGRvY3VtZW50IHJvb3QgZm9yIHlvdXIgd2VibG9naWMgc2VydmVyCisgKiAgICAgIHNyYyA6IHJvb3Qgb2Ygc291cmNlIHRyZWUgZm9yIEpTUCwgaWUsIHRoZSBkb2N1bWVudCByb290IGZvciB5b3VyIFdlYkxvZ2ljIHNlcnZlcgogICogICAgICBkZXN0IDogcm9vdCBvZiBkZXN0aW5hdGlvbiBkaXJlY3RvcnksIHdoYXQgeW91IGhhdmUgc2V0IGFzCi0gKiAgICAgICAgICAgICBXb3JraW5nRGlyIGluIHRoZSB3ZWJsb2dpYyBwcm9wZXJ0aWVzCisgKiAgICAgICAgICAgICBXb3JraW5nRGlyIGluIHRoZSBXZWJMb2dpYyBwcm9wZXJ0aWVzCiAgKiAgICAgIHBhY2thZ2UgOiBzdGFydCBwYWNrYWdlIG5hbWUgdW5kZXIgd2hpY2ggeW91ciBKU1AncyB3b3VsZCBiZSBjb21waWxlZAogICoKICAqIG90aGVyIGF0dHJpYnV0ZXMKICAqICAgICBjbGFzc3BhdGgKICAqCi0gKiBBIGNsYXNzcGF0aCBzaG91bGQgYmUgc2V0IHdoaWNoIGNvbnRhaW5zIHRoZSB3ZWJsb2dpYyBjbGFzc2VzIGFzIHdlbGwgYXMgYWxsCisgKiBBIGNsYXNzcGF0aCBzaG91bGQgYmUgc2V0IHdoaWNoIGNvbnRhaW5zIHRoZSBXZWJMb2dpYyBjbGFzc2VzIGFzIHdlbGwgYXMgYWxsCiAgKiBhcHBsaWNhdGlvbiBjbGFzc2VzIHJlZmVyZW5jZWQgYnkgdGhlIEpTUC4gVGhlIHN5c3RlbSBjbGFzc3BhdGggaXMgYWxzbwogICogYXBwZW5kZWQgd2hlbiB0aGUganNwYyBpcyBjYWxsZWQsIHNvIHlvdSBtYXkgY2hvb3NlIHRvIHB1dCBldmVyeXRoaW5nIGluCiAgKiB0aGUgY2xhc3NwYXRoIHdoaWxlIGNhbGxpbmcgQW50LiBIb3dldmVyLCBzaW5jZSBwcmVzdW1hYmx5IHRoZSBKU1AncyB3aWxsCkBAIC01NCwxMSArNTUsMTEgQEAKICAqIFRoZSB0YXNrIGNoZWNrcyB0aW1lc3RhbXBzIG9uIHRoZSBKU1AncyBhbmQgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLCBhbmQgY29tcGlsZXMKICAqIG9ubHkgdGhvc2UgZmlsZXMgdGhhdCBoYXZlIGNoYW5nZWQuCiAgKgotICogSXQgZm9sbG93cyB0aGUgd2VibG9naWMgbmFtaW5nIGNvbnZlbnRpb24gb2YgcHV0dGluZyBjbGFzc2VzIGluCisgKiBJdCBmb2xsb3dzIHRoZSBXZWJMb2dpYyBuYW1pbmcgY29udmVudGlvbiBvZiBwdXR0aW5nIGNsYXNzZXMgaW4KICAqICA8Yj4gX2Rpck5hbWUvX2ZpbGVOYW1lLmNsYXNzIGZvciBkaXJuYW1lL2ZpbGVOYW1lLmpzcCAgIDwvYj4KICAqCi0gKiBMaW1pdGF0aW9uOiBJdCBjb21waWxlcyB0aGUgZmlsZXMgdGhydSB0aGUgQ2xhc3NpYyBjb21waWxlciBvbmx5LgotICogTGltaXRhdGlvbjogU2luY2UgaXQgaXMgbXkgZXhwZXJpZW5jZSB0aGF0IHdlYmxvZ2ljIGpzcGMgdGhyb3dzIG91dCBvZgorICogTGltaXRhdGlvbjogSXQgY29tcGlsZXMgdGhlIGZpbGVzIHRocm91Z2ggdGhlIENsYXNzaWMgY29tcGlsZXIgb25seS4KKyAqIExpbWl0YXRpb246IFNpbmNlIGl0IGlzIG15IGV4cGVyaWVuY2UgdGhhdCBXZWJMb2dpYyBqc3BjIHRocm93cyBvdXQgb2YKICAqICAgICAgICAgICAgIG1lbW9yeSBlcnJvciBvbiBiZWluZyBnaXZlbiB0b28gbWFueSBmaWxlcyBhdCBvbmUgZ28sIGl0IGlzCiAgKiAgICAgICAgICAgICBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCBvbmUganNwIGZpbGUgZWFjaC4KICAqCkBAIC03OSw3ICs4MCw3IEBACiAgKi8KIAogcHVibGljIGNsYXNzIFdMSnNwYyBleHRlbmRzIE1hdGNoaW5nVGFzayB7Ci0gICAgLy9UT0RPIFRlc3Qgb24gb3RoZXIgdmVyc2lvbnMgb2Ygd2VibG9naWMKKyAgICAvL1RPRE8gVGVzdCBvbiBvdGhlciB2ZXJzaW9ucyBvZiBXZWJMb2dpYwogICAgIC8vVE9ETyBhZGQgbW9yZSBhdHRyaWJ1dGVzIHRvIHRoZSB0YXNrLCB0byB0YWtlIGNhcmUgb2YgYWxsIGpzcGMgb3B0aW9ucwogICAgIC8vVE9ETyBUZXN0IG9uIFVuaXgKIApAQCAtOTgsMjEgKzk5LDIyIEBACiAgICAgLy9wcml2YXRlIFN0cmluZyBjb21waWxlclBhdGg7IC8vZnVsbHkgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBjb21waWxlciBleGVjdXRhYmxlCiAKICAgICBwcml2YXRlIFN0cmluZyBwYXRoVG9QYWNrYWdlID0gIiI7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNUb0RvID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZpbGVzVG9EbyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogUnVuIHRoZSB0YXNrLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghZGVzdGluYXRpb25EaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJkZXN0aW5hdGlvbiBkaXJlY3RvcnkgIgotICAgICAgICAgICAgICAgICsgZGVzdGluYXRpb25EaXJlY3RvcnkuZ2V0UGF0aCgpICsgIiBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGVzdGluYXRpb24gZGlyZWN0b3J5ICVzIGlzIG5vdCB2YWxpZCIsCisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25EaXJlY3RvcnkuZ2V0UGF0aCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghc291cmNlRGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjIGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgKyBzb3VyY2VEaXJlY3RvcnkuZ2V0UGF0aCgpICsgIiBpcyBub3QgdmFsaWQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic3JjIGRpcmVjdG9yeSAlcyBpcyBub3QgdmFsaWQiLAorICAgICAgICAgICAgICAgIHNvdXJjZURpcmVjdG9yeS5nZXRQYXRoKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFja2FnZSA9PSBudWxsKSB7CkBAIC0xMjAsNyArMTIyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogCi0KICAgICAgICAgcGF0aFRvUGFja2FnZQogICAgICAgICAgICAgPSB0aGlzLmRlc3RpbmF0aW9uUGFja2FnZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKICAgICAgICAgLy8gZ2V0IGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZURpcmVjdG9yeQpAQCAtMTMyLDkgKzEzMyw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb21waWxlQ2xhc3NwYXRoID0gY29tcGlsZUNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7CiAKLSAgICAgICAgLy9XZWJsb2dpYy5qc3BjIGNhbGxzIFN5c3RlbS5leGl0KCkgLi4uIGhhdmUgdG8gZm9yaworICAgICAgICAvLyBXZWJMb2dpYyBqc3BjIGNhbGxzIFN5c3RlbS5leGl0KCkgLi4uIGhhdmUgdG8gZm9yawogICAgICAgICAvLyBUaGVyZWZvcmUsIHRha2VzIGxvYWRzIG9mIHRpbWUKICAgICAgICAgLy8gQ2FuIHBhc3MgZGlyZWN0b3JpZXMgYXQgYSB0aW1lICgqLmpzcCkgYnV0IGVhc2lseSBydW5zIG91dCBvZgogICAgICAgICAvLyBtZW1vcnkgb24gaGVmdHkgZGlycyAoZXZlbiBvbiAgYSBTdW4pCkBAIC0xNDYsOCArMTQ2LDYgQEAKICAgICAgICAgU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbMTJdOwogICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9OCiAKLSAgICAgICAgRmlsZSBqc3BGaWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhcmVudHMgPSAiIjsKICAgICAgICAgaW50IGogPSAwOwogICAgICAgICAvL1RPRE8gIHRoaXMgYXJyYXkgc3R1ZmYgaXMgYSByZW1uYW50IG9mIHByZXYgdHJpYWxzLi4gZ290dGEgcmVtb3ZlLgogICAgICAgICBhcmdzW2orK10gPSAiLWQiOwpAQCAtMTU5LDMzICsxNTcsMzAgQEAKICAgICAgICAgLy9Vc2UgY2xhc3NpYyBjb21waWxlciAtLSBjYW4gYmUgcGFyYW1ldGVyaXNlZD8KICAgICAgICAgYXJnc1tqKytdID0gICItY29tcGlsZXJjbGFzcyI7CiAgICAgICAgIGFyZ3NbaisrXSA9ICJzdW4udG9vbHMuamF2YWMuTWFpbiI7Ci0gICAgICAgIC8vV2VibG9naWMganNwYyBkb2VzIG5vdCBzZWVtIHRvIHdvcmsgdW5sZXNzIHUgZXhwbGljaXRseSBzZXQgdGhpcy4uLgorICAgICAgICAvLyBXZWJMb2dpYyBqc3BjIGRvZXMgbm90IHNlZW0gdG8gd29yayB1bmxlc3MgdSBleHBsaWNpdGx5IHNldCB0aGlzLi4uCiAgICAgICAgIC8vIERvZXMgbm90IHRha2UgdGhlIGNsYXNzcGF0aCBmcm9tIHRoZSBlbnYuLi4uCiAgICAgICAgIC8vIEFtIGkgbWlzc2luZyBzb21ldGhpbmcgYWJvdXQgdGhlIEphdmEgdGFzaz8/CiAgICAgICAgIGFyZ3NbaisrXSA9ICItY2xhc3NwYXRoIjsKICAgICAgICAgYXJnc1tqKytdID0gY29tcGlsZUNsYXNzcGF0aC50b1N0cmluZygpOwogCi0gICAgICAgIHRoaXMuc2NhbkRpcihmaWxlcyk7CisgICAgICAgIHRoaXMuc2NhbkRpcihkcy5nZXRJbmNsdWRlZEZpbGVzKCkpOwogICAgICAgICBsb2coIkNvbXBpbGluZyAiICsgZmlsZXNUb0RvLnNpemUoKSArICIgSlNQIGZpbGVzIik7CiAKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWxlc1RvRG8uc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IGZpbGVzVG9EbykgewogICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICAvLyBBbGwgdGhpcyB0byBnZXQgcGFja2FnZSBhY2NvcmRpbmcgdG8gd2VibG9naWMgc3RhbmRhcmRzCisgICAgICAgICAgICAvLyBBbGwgdGhpcyB0byBnZXQgcGFja2FnZSBhY2NvcmRpbmcgdG8gV2ViTG9naWMgc3RhbmRhcmRzCiAgICAgICAgICAgICAvLyBDYW4gYmUgd3JpdHRlbiBiZXR0ZXIuLi4gdGhpcyBpcyB0b28gaGFja3khCi0gICAgICAgICAgICAvLyBDYXJlZnVsLi4gc2ltaWxhciBjb2RlIGluIHNjYW5EaXIgLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ISEKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IChTdHJpbmcpIGZpbGVzVG9Eby5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBqc3BGaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOworICAgICAgICAgICAgLy8gQ2FyZWZ1bC4uIHNpbWlsYXIgY29kZSBpbiBzY2FuRGlyLCBidXQgc2xpZ2h0bHkgZGlmZmVyZW50ISEKKyAgICAgICAgICAgIEZpbGUganNwRmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKICAgICAgICAgICAgIGFyZ3Nbal0gPSAiLXBhY2thZ2UiOwotICAgICAgICAgICAgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAoKHBhcmVudHMgIT0gbnVsbCkgICYmICghKCIiKS5lcXVhbHMocGFyZW50cykpKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50cyA9ICB0aGlzLnJlcGxhY2VTdHJpbmcocGFyZW50cywgRmlsZS5zZXBhcmF0b3IsICJfLiIpOwotICAgICAgICAgICAgICAgIGFyZ3NbaiArIDFdID0gZGVzdGluYXRpb25QYWNrYWdlICsgIi4iICsgIl8iICsgcGFyZW50czsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTdHJpbmcgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7CisgICAgICAgICAgICBpZiAocGFyZW50cyA9PSBudWxsIHx8IHBhcmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgYXJnc1tqICsgMV0gPSBkZXN0aW5hdGlvblBhY2thZ2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcmVudHMgPSB0aGlzLnJlcGxhY2VTdHJpbmcocGFyZW50cywgRmlsZS5zZXBhcmF0b3IsICJfLiIpOworICAgICAgICAgICAgICAgIGFyZ3NbaiArIDFdID0gZGVzdGluYXRpb25QYWNrYWdlICsgIi4iICsgIl8iICsgcGFyZW50czsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBhcmdzW2ogKyAyXSA9ICBzb3VyY2VEaXJlY3RvcnkgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVuYW1lOwogICAgICAgICAgICAgaGVscGVyVGFzay5jbGVhckFyZ3MoKTsKIApAQCAtMjAyLDggKzE5Nyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gYmUgdXNlZCBmb3IgdGhpcyBjb21waWxhdGlvbi4KICAgICAgKiBAcGFyYW0gY2xhc3NwYXRoIHRoZSBjbGFzc3BhdGggdG8gdXNlLgpAQCAtMjM0LDcgKzIyNyw2IEBACiAgICAgICogQHBhcmFtIGRpck5hbWUgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzb3VyY2UganNwJ3MKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTcmMoRmlsZSBkaXJOYW1lKSB7Ci0KICAgICAgICAgc291cmNlRGlyZWN0b3J5ID0gZGlyTmFtZTsKICAgICB9CiAKQEAgLTI0NSw3ICsyMzcsNiBAQAogICAgICAqIEBwYXJhbSBkaXJOYW1lIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc291cmNlIGpzcCdzCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RGVzdChGaWxlIGRpck5hbWUpIHsKLQogICAgICAgICBkZXN0aW5hdGlvbkRpcmVjdG9yeSA9IGRpck5hbWU7CiAgICAgfQogCkBAIC0yNTUsNyArMjQ2LDYgQEAKICAgICAgKiBAcGFyYW0gcGFja2FnZU5hbWUgdGhlIHBhY2thZ2UgbmFtZSBmb3IgdGhlIGNsYXNzZXMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCiAgICAgICAgIGRlc3RpbmF0aW9uUGFja2FnZSA9IHBhY2thZ2VOYW1lOwogICAgIH0KIApAQCAtMjY1LDUyICsyNTUsNDggQEAKICAgICAgKiBAcGFyYW0gZmlsZXMgdGhlIGZpbGVzIHRvIHNjYW4uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc2NhbkRpcihTdHJpbmdbXSBmaWxlcykgewotCi0gICAgICAgIGxvbmcgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLSAgICAgICAgRmlsZSBqc3BGaWxlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHBhcmVudHMgPSBudWxsOwotICAgICAgICBTdHJpbmcgcGFjayA9ICIiOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZSh0aGlzLnNvdXJjZURpcmVjdG9yeSwgZmlsZXNbaV0pOworICAgICAgICBsb25nIG5vdyA9IEluc3RhbnQubm93KCkudG9FcG9jaE1pbGxpKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgRmlsZSBzcmNGaWxlID0gbmV3IEZpbGUodGhpcy5zb3VyY2VEaXJlY3RvcnksIGZpbGUpOwogICAgICAgICAgICAgLy9UT0RPCiAgICAgICAgICAgICAvLyBBbGwgdGhpcyB0byBjb252ZXJ0IHNvdXJjZSB0byBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYWNjb3JkaW5nCi0gICAgICAgICAgICAvLyB0byB3ZWJsb2dpYyBzdGFuZGFyZHMgQ2FuIGJlIHdyaXR0ZW4gYmV0dGVyLi4uIHRoaXMgaXMgdG9vIGhhY2t5IQotICAgICAgICAgICAganNwRmlsZSA9IG5ldyBGaWxlKGZpbGVzW2ldKTsKLSAgICAgICAgICAgIHBhcmVudHMgPSBqc3BGaWxlLmdldFBhcmVudCgpOworICAgICAgICAgICAgLy8gdG8gV2ViTG9naWMgc3RhbmRhcmRzIC0gY2FuIGJlIHdyaXR0ZW4gYmV0dGVyLi4uIHRoaXMgaXMgdG9vIGhhY2t5IQorICAgICAgICAgICAgRmlsZSBqc3BGaWxlID0gbmV3IEZpbGUoZmlsZSk7CisgICAgICAgICAgICBTdHJpbmcgcGFyZW50cyA9IGpzcEZpbGUuZ2V0UGFyZW50KCk7CiAKLSAgICAgICAgICAgIGlmICgocGFyZW50cyAhPSBudWxsKSAgJiYgKCEoIiIpLmVxdWFscyhwYXJlbnRzKSkpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYWNrOworICAgICAgICAgICAgaWYgKHBhcmVudHMgPT0gbnVsbCB8fCBwYXJlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHBhY2sgPSBwYXRoVG9QYWNrYWdlOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwYXJlbnRzID0gIHRoaXMucmVwbGFjZVN0cmluZyhwYXJlbnRzLCBGaWxlLnNlcGFyYXRvciwgIl8vIik7CiAgICAgICAgICAgICAgICAgcGFjayA9IHBhdGhUb1BhY2thZ2UgKyBGaWxlLnNlcGFyYXRvciArICJfIiArIHBhcmVudHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBhY2sgPSBwYXRoVG9QYWNrYWdlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmcgZmlsZVBhdGggPSBwYWNrICsgRmlsZS5zZXBhcmF0b3IgKyAiXyI7Ci0gICAgICAgICAgICBpbnQgc3RhcnRpbmdJbmRleCA9IGZpbGVzW2ldLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSAhPSAtMQotICAgICAgICAgICAgICAgICAgICA/IGZpbGVzW2ldLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEgOiAwOwotICAgICAgICAgICAgaW50IGVuZGluZ0luZGV4ID0gZmlsZXNbaV0uaW5kZXhPZigiLmpzcCIpOworICAgICAgICAgICAgaW50IHN0YXJ0aW5nSW5kZXggPSBmaWxlLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSAhPSAtMQorICAgICAgICAgICAgICAgICAgICA/IGZpbGUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICsgMSA6IDA7CisgICAgICAgICAgICBpbnQgZW5kaW5nSW5kZXggPSBmaWxlLmluZGV4T2YoIi5qc3AiKTsKICAgICAgICAgICAgIGlmIChlbmRpbmdJbmRleCA9PSAtMSkgewotICAgICAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgIiArIGZpbGVzW2ldICsgIi4gTm90IGEgSlNQIiwKKyAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nICIgKyBmaWxlICsgIi4gTm90IGEgSlNQIiwKICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZpbGVQYXRoICs9IGZpbGVzW2ldLnN1YnN0cmluZyhzdGFydGluZ0luZGV4LCBlbmRpbmdJbmRleCk7CisgICAgICAgICAgICBmaWxlUGF0aCArPSBmaWxlLnN1YnN0cmluZyhzdGFydGluZ0luZGV4LCBlbmRpbmdJbmRleCk7CiAgICAgICAgICAgICBmaWxlUGF0aCArPSAiLmNsYXNzIjsKICAgICAgICAgICAgIEZpbGUgY2xhc3NGaWxlID0gbmV3IEZpbGUodGhpcy5kZXN0aW5hdGlvbkRpcmVjdG9yeSwgZmlsZVBhdGgpOwogCiAgICAgICAgICAgICBpZiAoc3JjRmlsZS5sYXN0TW9kaWZpZWQoKSA+IG5vdykgewogICAgICAgICAgICAgICAgIGxvZygiV2FybmluZzogZmlsZSBtb2RpZmllZCBpbiB0aGUgZnV0dXJlOiAiCi0gICAgICAgICAgICAgICAgICAgICsgZmlsZXNbaV0sIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICArIGZpbGUsIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNyY0ZpbGUubGFzdE1vZGlmaWVkKCkgPiBjbGFzc0ZpbGUubGFzdE1vZGlmaWVkKCkpIHsKLSAgICAgICAgICAgICAgICBmaWxlc1RvRG8uYWRkRWxlbWVudChmaWxlc1tpXSk7Ci0gICAgICAgICAgICAgICAgbG9nKCJSZWNvbXBpbGluZyBGaWxlICIgKyBmaWxlc1tpXSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgZmlsZXNUb0RvLmFkZChmaWxlKTsKKyAgICAgICAgICAgICAgICBsb2coIlJlY29tcGlsaW5nIEZpbGUgIiArIGZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBSZXBsYWNlIG9jY3VycmVuY2VzIG9mIGEgc3RyaW5nIHdpdGggYSByZXBsYWNlbWVudCBzdHJpbmcuCiAgICAgICogQHBhcmFtIGlucFN0cmluZyB0aGUgc3RyaW5nIHRvIGNvbnZlcnQuCkBAIC0zMjAsMTUgKzMwNiwxNCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBTdHJpbmcgcmVwbGFjZVN0cmluZyhTdHJpbmcgaW5wU3RyaW5nLCBTdHJpbmcgZXNjYXBlQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXBsYWNlQ2hhcnMpIHsKLSAgICAgICAgU3RyaW5nIGxvY2FsU3RyaW5nID0gIiI7Ci0gICAgICAgIGludCBudW1Ub2tlbnMgPSAwOworICAgICAgICBTdHJpbmdCdWlsZGVyIGxvY2FsU3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnBTdHJpbmcsIGVzY2FwZUNoYXJzLCB0cnVlKTsKLSAgICAgICAgbnVtVG9rZW5zID0gc3QuY291bnRUb2tlbnMoKTsKKyAgICAgICAgaW50IG51bVRva2VucyA9IHN0LmNvdW50VG9rZW5zKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVG9rZW5zOyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZyB0ZXN0ID0gc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB0ZXN0ID0gKHRlc3QuZXF1YWxzKGVzY2FwZUNoYXJzKSA/IHJlcGxhY2VDaGFycyA6IHRlc3QpOwotICAgICAgICAgICAgbG9jYWxTdHJpbmcgKz0gdGVzdDsKKyAgICAgICAgICAgIHRlc3QgPSB0ZXN0LmVxdWFscyhlc2NhcGVDaGFycykgPyByZXBsYWNlQ2hhcnMgOiB0ZXN0OworICAgICAgICAgICAgbG9jYWxTdHJpbmcuYXBwZW5kKHRlc3QpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsb2NhbFN0cmluZzsKKyAgICAgICAgcmV0dXJuIGxvY2FsU3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9EZWZhdWx0SnNwQ29tcGlsZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0RlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIuamF2YQppbmRleCA1OWE5YjJjLi4wNmRiYjA3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0RlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0RlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDggKzE5LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLmNvbXBpbGVyczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5Kc3BDOwpAQCAtMzUsOCArMzUsNiBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIERlZmF1bHRKc3BDb21waWxlckFkYXB0ZXIKICAgICBpbXBsZW1lbnRzIEpzcENvbXBpbGVyQWRhcHRlciB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbFNlcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQogICAgIC8qKgogICAgICAqIExvZ3MgdGhlIGNvbXBpbGF0aW9uIHBhcmFtZXRlcnMsIGFkZHMgdGhlIGZpbGVzIHRvIGNvbXBpbGUgYW5kIGxvZ3MgdGhlCiAgICAgICogJnF1b3Q7bmljZVNvdXJjZUxpc3QmcXVvdDsKQEAgLTQ1LDI5ICs0MywxNyBAQAogICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZSB1c2VkCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgbG9nQW5kQWRkRmlsZXNUb0NvbXBpbGUoSnNwQyBqc3BjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvciBjb21waWxlTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBjb21waWxlTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kbGluZUphdmEgY21kKSB7CiAgICAgICAgIGpzcGMubG9nKCJDb21waWxhdGlvbiAiICsgY21kLmRlc2NyaWJlSmF2YUNvbW1hbmQoKSwKICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgU3RyaW5nQnVmZmVyIG5pY2VTb3VyY2VMaXN0ID0gbmV3IFN0cmluZ0J1ZmZlcigiRmlsZSIpOwotICAgICAgICBpZiAoY29tcGlsZUxpc3Quc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgicyIpOwotICAgICAgICB9Ci0gICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZCgiIHRvIGJlIGNvbXBpbGVkOiIpOwotCi0gICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChsU2VwKTsKLQotICAgICAgICBFbnVtZXJhdGlvbiBlID0gY29tcGlsZUxpc3QuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBhcmcgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShhcmcpOwotICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgICAgIik7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoYXJnKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChsU2VwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGpzcGMubG9nKG5pY2VTb3VyY2VMaXN0LnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBTdHJpbmcgbmljZVNvdXJjZUxpc3QgPSBjb21waWxlTGlzdC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLnBlZWsoYXJnIC0+IGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGFyZyAtPiBTdHJpbmcuZm9ybWF0KCIgICAgJXMlbiIsIGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiIpKTsKKyAgICAgICAganNwYy5sb2coU3RyaW5nLmZvcm1hdCgiRmlsZSVzIHRvIGJlIGNvbXBpbGVkOiVuJXMiLAorICAgICAgICAgICAgICAgIGNvbXBpbGVMaXN0LnNpemUoKSA9PSAxID8gIiIgOiAicyIsIG5pY2VTb3VyY2VMaXN0KSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgfQogCiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKQEAgLTgzLDYgKzY5LDcgQEAKICAgICAgKiBzZXQgdGhlIG93bmVyCiAgICAgICogQHBhcmFtIG93bmVyIHRoZSBvd25lciBKc3BDIGNvbXBpbGVyCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SnNwYyhKc3BDIG93bmVyKSB7CiAgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKICAgICB9CkBAIC05NCwyMSArODEsMjAgQEAKICAgICAgICAgcmV0dXJuIG93bmVyOwogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogYWRkIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LCBpZiB0aGUgdmFsdWUgYWludCBudWxsCisgICAgICogYWRkIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHRoZSBhcmd1bWVudCBsaXN0LCBpZiB0aGUgdmFsdWUgaXNuJ3QgbnVsbAogICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmQgbGluZQogICAgICAqIEBwYXJhbSAgYXJndW1lbnQgIFRoZSBhcmd1bWVudAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFkZEFyZyhDb21tYW5kbGluZUphdmEgY21kLCBTdHJpbmcgYXJndW1lbnQpIHsKLSAgICAgICAgaWYgKGFyZ3VtZW50ICE9IG51bGwgJiYgYXJndW1lbnQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICBpZiAoYXJndW1lbnQgIT0gbnVsbCAmJiAhYXJndW1lbnQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZ3VtZW50KTsKICAgICAgICAgfQogICAgIH0KIAogCiAgICAgLyoqCi0gICAgICogIGFkZCBhbiBhcmd1bWVudCB0dXBsZSB0byB0aGUgYXJndW1lbnQgbGlzdCwgaWYgdGhlIHZhbHVlIGFpbnQgbnVsbAorICAgICAqICBhZGQgYW4gYXJndW1lbnQgdHVwbGUgdG8gdGhlIGFyZ3VtZW50IGxpc3QsIGlmIHRoZSB2YWx1ZSBpc24ndCBudWxsCiAgICAgICogQHBhcmFtIGNtZCB0aGUgY29tbWFuZCBsaW5lCiAgICAgICogQHBhcmFtICBhcmd1bWVudCAgVGhlIGFyZ3VtZW50CiAgICAgICogQHBhcmFtICB2YWx1ZSAgICAgdGhlIHBhcmFtZXRlcgpAQCAtMTIxLDcgKzEwNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIGFkZCBhbiBhcmd1bWVudCB0dXBsZSB0byB0aGUgYXJnIGxpc3QsIGlmIHRoZSBmaWxlIHBhcmFtZXRlciBhaW50IG51bGwKKyAgICAgKiAgYWRkIGFuIGFyZ3VtZW50IHR1cGxlIHRvIHRoZSBhcmcgbGlzdCwgaWYgdGhlIGZpbGUgcGFyYW1ldGVyIGlzbid0IG51bGwKICAgICAgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kIGxpbmUKICAgICAgKiBAcGFyYW0gIGFyZ3VtZW50ICBUaGUgYXJndW1lbnQKICAgICAgKiBAcGFyYW0gIGZpbGUgICAgIHRoZSBwYXJhbWV0ZXIKQEAgLTEzOCw2ICsxMjQsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGlsZXIgd2FudHMgdG8gZG8gaXRzIG93bgogICAgICAqIGRlcGVuZHMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpbXBsZW1lbnRzT3duRGVwZW5kZW5jeUNoZWNraW5nKCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTUwLDQgKzEzNywzIEBACiAgICAgICAgIHJldHVybiBnZXRKc3BjKCkuZ2V0UHJvamVjdCgpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9KYXNwZXJDLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0phc3BlckMuamF2YQppbmRleCBmMGJlY2FjLi5iZGNhZTg0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0phc3BlckMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0phc3BlckMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZ2V0SnNwYygpLmxvZygiVXNpbmcgamFzcGVyIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CkBAIC04MCw5ICs4MSw4IEBACiAgICAgICAgICAgICBqYXZhLnNldERpcihnZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpKTsKICAgICAgICAgICAgIGphdmEuc2V0Q2xhc3NuYW1lKCJvcmcuYXBhY2hlLmphc3Blci5Kc3BDIik7CiAgICAgICAgICAgICAvL3RoaXMgaXMgcmVhbGx5IGlycml0YXRpbmc7IHdlIG5lZWQgYSB3YXkgdG8gc2V0IHN0dWZmCi0gICAgICAgICAgICBTdHJpbmcgW11hcmdzID0gY21kLmdldEphdmFDb21tYW5kKCkuZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUFyZygpLnNldFZhbHVlKGFyZ3NbaV0pOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogY21kLmdldEphdmFDb21tYW5kKCkuZ2V0QXJndW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBqYXZhLmNyZWF0ZUFyZygpLnNldFZhbHVlKGFyZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBqYXZhLnNldEZhaWxvbmVycm9yKGdldEpzcGMoKS5nZXRGYWlsb25lcnJvcigpKTsKICAgICAgICAgICAgIC8vd2UgYXJlIGZvcmtpbmcgaGVyZSB0byBiZSBzdXJlIHRoYXQgaWYgSnNwQyBjYWxscwpAQCAtOTQsMTcgKzk0LDE0IEBACiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgaWYgKGV4IGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgICB0aHJvdyAoQnVpbGRFeGNlcHRpb24pIGV4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJ1bm5pbmcganNwIGNvbXBpbGVyOiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCwgZ2V0SnNwYygpLmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciBydW5uaW5nIGpzcCBjb21waWxlcjogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgsIGdldEpzcGMoKS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGdldEpzcGMoKS5kZWxldGVFbXB0eUphdmFGaWxlcygpOwogICAgICAgICB9CiAgICAgfQogCi0KLQogICAgIC8qKgogICAgICAqIGJ1aWxkIHVwIGEgY29tbWFuZCBsaW5lCiAgICAgICogQHJldHVybiBhIGNvbW1hbmQgbGluZSBmb3IgamFzcGVyCkBAIC0xNDQsNyArMTQxLDcgQEAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBtYW5nbGVyIHRoaXMgY29tcGlsZXIgdXNlcwogICAgICAqLwotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEpzcE1hbmdsZXIgY3JlYXRlTWFuZ2xlcigpIHsKICAgICAgICAgcmV0dXJuIG1hbmdsZXI7CiAgICAgfQpAQCAtMTU3LDI2ICsxNTQsMTkgQEAKICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewogICAgICAgICAgICAgcCA9IG5ldyBQYXRoKGdldFByb2plY3QoKSk7CiAgICAgICAgICAgICByZXR1cm4gcC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoIm9ubHkiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBwLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHAuY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAc2luY2UgQW50IDEuNi4yCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzVG9tY2F0NXgoKSB7Ci0gICAgICAgIEFudENsYXNzTG9hZGVyIGwgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbCA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihnZXRDbGFzc3BhdGgoKSk7CisgICAgICAgIHRyeSAoQW50Q2xhc3NMb2FkZXIgbCA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihnZXRDbGFzc3BhdGgoKSkpIHsKICAgICAgICAgICAgIGwubG9hZENsYXNzKCJvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwuSWYiKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qc3AvY29tcGlsZXJzL0pzcENvbXBpbGVyQWRhcHRlci5qYXZhCmluZGV4IDY4ZTY5M2MuLmQzNTA1ZDMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9Kc3BDb21waWxlckFkYXB0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pzcC9jb21waWxlcnMvSnNwQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9Kc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKaW5kZXggMjg3NmJhMC4uY2JkYWE4YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9Kc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanNwL2NvbXBpbGVycy9Kc3BDb21waWxlckFkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04MCwxMSArODAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgaWYgKGNvbXBpbGVyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXNwZXIiKSkgeworICAgICAgICBpZiAoImphc3BlciIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpKSB7CiAgICAgICAgICAgICAvL3RvbWNhdDQuMCBnZXRzIHRoZSBvbGQgbWFuZ2xlcgogICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXNwZXJDKG5ldyBKc3BOYW1lTWFuZ2xlcigpKTsKICAgICAgICAgfQotICAgICAgICBpZiAoY29tcGlsZXJUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImphc3BlcjQxIikpIHsKKyAgICAgICAgaWYgKCJqYXNwZXI0MSIuZXF1YWxzSWdub3JlQ2FzZShjb21waWxlclR5cGUpKSB7CiAgICAgICAgICAgICAvL3RvbWNhdDQuMSBnZXRzIHRoZSBuZXcgb25lCiAgICAgICAgICAgICByZXR1cm4gbmV3IEphc3BlckMobmV3IEphc3BlcjQxTWFuZ2xlcigpKTsKICAgICAgICAgfQpAQCAtMTA0LDkgKzEwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjID0gY2xhc3Nsb2FkZXIuZmluZENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIHJldHVybiAoSnNwQ29tcGlsZXJBZGFwdGVyKSBvOworICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEpzcENvbXBpbGVyQWRhcHRlcj4gYyA9IGNsYXNzbG9hZGVyLmZpbmRDbGFzcyhjbGFzc05hbWUpLmFzU3ViY2xhc3MoSnNwQ29tcGlsZXJBZGFwdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBjLm5ld0luc3RhbmNlKCk7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGNsYXNzTmFtZSArICIgY2FuXCd0IGJlIGZvdW5kLiIsIGNuZmUpOwogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gY2NlKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9BZ2dyZWdhdGVUcmFuc2Zvcm1lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQWdncmVnYXRlVHJhbnNmb3JtZXIuamF2YQppbmRleCA5MTFmYjRiLi5iYzY2ODgwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9BZ2dyZWdhdGVUcmFuc2Zvcm1lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0FnZ3JlZ2F0ZVRyYW5zZm9ybWVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMiArMTgsMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSTDsKLQoraW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CkBAIC03MiwxMiArNzEsMjcgQEAKICAgICAgICAgICogbGlzdCBhdXRob3JpemVkIHZhbHVlcy4KICAgICAgICAgICogQHJldHVybiBhdXRob3JpemVkIHZhbHVlcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtGUkFNRVMsIE5PRlJBTUVTfTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKREtfSU5URVJOQUxfRkFDVE9SWSA9CisgICAgICAgICAgICAiY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXguVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI7CisKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIC8qKiBYTUwgUGFyc2VyIGZhY3RvcnkgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IHByaXZhdGVEQkZhY3Rvcnk7CisKKyAgICAvKiogWE1MIFBhcnNlciBmYWN0b3J5IGFjY2Vzc2libGUgdG8gc3ViY2xhc3NlcyAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmZhY3Rvcnk7CisKKyAgICBzdGF0aWMgeworICAgICAgIHByaXZhdGVEQkZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgZGJmYWN0b3J5ID0gcHJpdmF0ZURCRmFjdG9yeTsKKyAgICB9CisKICAgICAvKiogVGFzayAqLwogICAgIHByb3RlY3RlZCBUYXNrIHRhc2s7CiAKQEAgLTExNCwxOSArMTI4LDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBpbnQgY291bnRlciA9IDA7CiAKLSAgICAvKiogdGhlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSByZXBvcnQuIE11c3QgYmUgPHR0PkZSQU1FUzwvdHQ+IG9yIDx0dD5OT0ZSQU1FUzwvdHQ+ICovCisgICAgLyoqIHRoZSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgcmVwb3J0LiBNdXN0IGJlIDxjb2RlPkZSQU1FUzwvY29kZT4gb3IgPGNvZGU+Tk9GUkFNRVM8L2NvZGU+ICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyBmb3JtYXQgPSBGUkFNRVM7CiAKLSAgICAvKiogWE1MIFBhcnNlciBmYWN0b3J5ICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBwcml2YXRlREJGYWN0b3J5OwotCi0gICAgLyoqIFhNTCBQYXJzZXIgZmFjdG9yeSBhY2Nlc3NpYmxlIHRvIHN1YmNsYXNzZXMgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmYWN0b3J5OwotCi0gICAgc3RhdGljIHsKLSAgICAgICBwcml2YXRlREJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgIGRiZmFjdG9yeSA9IHByaXZhdGVEQkZhY3Rvcnk7Ci0gICAgfQogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKICAgICAvKioKQEAgLTE1MCw3ICsxNTQsNyBAQAogCiAgICAgLyoqCiAgICAgICogc2V0cyB0aGUgZm9ybWF0LgotICAgICAqIEBwYXJhbSBmb3JtYXQgIE11c3QgYmUgPHR0PkZSQU1FUzwvdHQ+IG9yIDx0dD5OT0ZSQU1FUzwvdHQ+CisgICAgICogQHBhcmFtIGZvcm1hdCAgTXVzdCBiZSA8Y29kZT5GUkFNRVM8L2NvZGU+IG9yIDxjb2RlPk5PRlJBTUVTPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZvcm1hdChGb3JtYXQgZm9ybWF0KSB7CiAgICAgICAgIHRoaXMuZm9ybWF0ID0gZm9ybWF0LmdldFZhbHVlKCk7CkBAIC0xNzMsMTIgKzE3Nyw5IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2V0WG1sZmlsZShGaWxlIHhtbGZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IHByaXZhdGVEQkZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oeG1sZmlsZSk7Ci0gICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKHhtbGZpbGUudG9QYXRoKCkpKSB7CiAgICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5wYXJzZShpbik7CiAgICAgICAgICAgICAgICAgc2V0WG1sRG9jdW1lbnQoZG9jKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgcGFyc2luZyBkb2N1bWVudDogIiArIHhtbGZpbGUsIGUpOwpAQCAtMjU3LDggKzI1OCw4IEBACiAKICAgICAgICAgLy8gYWNyb2JhdGljIGNhc3QuCiAgICAgICAgIHhzbHRUYXNrLnNldEluKCgoWE1MUmVzdWx0QWdncmVnYXRvcikgdGFzaykuZ2V0RGVzdGluYXRpb25GaWxlKCkpOwotICAgICAgICBGaWxlIG91dHB1dEZpbGUgPSBudWxsOwotICAgICAgICBpZiAoZm9ybWF0LmVxdWFscyhGUkFNRVMpKSB7CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZTsKKyAgICAgICAgaWYgKEZSQU1FUy5lcXVhbHMoZm9ybWF0KSkgewogICAgICAgICAgICAgU3RyaW5nIHRlbXBGaWxlUHJvcGVydHkgPSBnZXRDbGFzcygpLmdldE5hbWUoKSArIFN0cmluZy52YWx1ZU9mKGNvdW50ZXIrKyk7IC8vTk9TT05BUgogICAgICAgICAgICAgRmlsZSB0bXAgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpLCBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgIC5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7CkBAIC0yOTYsMTAgKzI5Nyw3IEBACiAgICAgICogQHJldHVybiBzdHlsZXNoZWV0IGFzIGEgcmVzb3VyY2UKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0U3R5bGVzaGVldCgpIHsKLSAgICAgICAgU3RyaW5nIHhzbG5hbWUgPSAianVuaXQtZnJhbWVzLnhzbCI7Ci0gICAgICAgIGlmIChOT0ZSQU1FUy5lcXVhbHMoZm9ybWF0KSkgewotICAgICAgICAgICAgeHNsbmFtZSA9ICJqdW5pdC1ub2ZyYW1lcy54c2wiOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB4c2xuYW1lID0gZ2V0WHNsTmFtZSgpOwogICAgICAgICBpZiAoc3R5bGVEaXIgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gSWYgc3R5bGUgZGlyIGlzIG5vdCBzcGVjaWZpZWQgd2UgaGF2ZSB0byByZXRyaWV2ZQogICAgICAgICAgICAgLy8gdGhlIHN0eWxlc2hlZXQgZnJvbSB0aGUgY2xhc3Nsb2FkZXIKQEAgLTMxMiw2ICszMTAsMzIgQEAKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UobmV3IEZpbGUoc3R5bGVEaXIsIHhzbG5hbWUpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWxlbmFtZSBvZiB0aGUgWFNMIHN0eWxlc2hlZXQKKyAgICAgKgorICAgICAqIFdpbGwgcHJvdmlkZSBYYWxhbiBvciBTYXhvbiBzcGVjaWZpYworICAgICAqIHN0eWxlc2hlZXRzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgZmlsZW5hbWUgb2YgdGhlIHN0eWxlc2hlZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRYc2xOYW1lKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc3VmZml4OworCisgICAgICAgIGZpbmFsIFN0cmluZyB4c2x0RmFjdG9yeU5hbWUgPSB4c2x0RmFjdG9yeSA9PSBudWxsID8gbnVsbCA6ICB4c2x0RmFjdG9yeS5nZXROYW1lKCk7CisgICAgICAgIGlmICgibmV0LnNmLnNheG9uLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiLmVxdWFscyh4c2x0RmFjdG9yeU5hbWUpKSB7CisgICAgICAgICAgICBzdWZmaXggPSAiLXNheG9uLnhzbCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdWZmaXggPSAiLnhzbCI7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHhzbG5hbWU7CisgICAgICAgIGlmIChOT0ZSQU1FUy5lcXVhbHMoZm9ybWF0KSkgeworICAgICAgICAgICAgeHNsbmFtZSA9ICJqdW5pdC1ub2ZyYW1lcyIgKyBzdWZmaXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4c2xuYW1lID0gImp1bml0LWZyYW1lcyIgKyBzdWZmaXg7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHhzbG5hbWU7CisgICAgfQorCiAgICAgLyoqIGNoZWNrIGZvciBpbnZhbGlkIG9wdGlvbnMKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgogICAgICAqLwpAQCAtMzM0LDEwICszNTgsNyBAQAogICAgICAqIG5vdCBleGlzdC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFN0eWxlc2hlZXRTeXN0ZW1JZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB4c2xuYW1lID0gImp1bml0LWZyYW1lcy54c2wiOwotICAgICAgICBpZiAoTk9GUkFNRVMuZXF1YWxzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgIHhzbG5hbWUgPSAianVuaXQtbm9mcmFtZXMueHNsIjsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgeHNsbmFtZSA9IGdldFhzbE5hbWUoKTsKICAgICAgICAgaWYgKHN0eWxlRGlyID09IG51bGwpIHsKICAgICAgICAgICAgIFVSTCB1cmwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCJ4c2wvIiArIHhzbG5hbWUpOwogICAgICAgICAgICAgaWYgKHVybCA9PSBudWxsKSB7CkBAIC0zNTIsOCArMzczLDYgQEAKICAgICAgICAgcmV0dXJuIEpBWFBVdGlscy5nZXRTeXN0ZW1JZChmaWxlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkRLX0lOVEVSTkFMX0ZBQ1RPUlkgPSAiY29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXguVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCI7Ci0KICAgICAvKioKICAgICAgKiBJZiB3ZSBlbmQgdXAgdXNpbmcgdGhlIEpESydzIG93biBUcmFYIGZhY3Rvcnkgb24gSmF2YSA5KywgdGhlbgogICAgICAqIHNldCB0aGUgZmVhdHVyZXMgYW5kIGF0dHJpYnV0ZXMgbmVjZXNzYXJ5IHRvIGFsbG93IHJlZGlyZWN0CkBAIC0zNzIsOCArMzkxLDkgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoSkRLX0lOVEVSTkFMX0ZBQ1RPUlkuZXF1YWxzKGZhY3RvcnlOYW1lKQogICAgICAgICAgICAgJiYgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKSB7Ci0gICAgICAgICAgICBmYWN0b3J5LmFkZEZlYXR1cmUobmV3IFhTTFRQcm9jZXNzLkZhY3RvcnkuRmVhdHVyZSgiaHR0cDovL3d3dy5vcmFjbGUuY29tL3htbC9qYXhwL3Byb3BlcnRpZXMvZW5hYmxlRXh0ZW5zaW9uRnVuY3Rpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKKyAgICAgICAgICAgIGZhY3RvcnkuYWRkRmVhdHVyZShuZXcgWFNMVFByb2Nlc3MuRmFjdG9yeS5GZWF0dXJlKAorICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9yYWNsZS5jb20veG1sL2pheHAvcHJvcGVydGllcy9lbmFibGVFeHRlbnNpb25GdW5jdGlvbnMiLAorICAgICAgICAgICAgICAgIHRydWUpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0Jhc2VUZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXNlVGVzdC5qYXZhCmluZGV4IDI0ZTZjMDcuLjI0NWYxNjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0Jhc2VUZXN0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmFzZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JrID0gZmFsc2U7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBpZlByb3BlcnR5ID0gbnVsbDsKICAgICBwcm90ZWN0ZWQgU3RyaW5nIHVubGVzc1Byb3BlcnR5ID0gbnVsbDsKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZvcm1hdHRlcnMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJvdGVjdGVkIFZlY3RvcjxGb3JtYXR0ZXJFbGVtZW50PiBmb3JtYXR0ZXJzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgLyoqIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSAqLwogICAgIHByb3RlY3RlZCBGaWxlIGRlc3REaXIgPSBudWxsOwogCkBAIC0xOTEsNyArMTkxLDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgYXMgYW4gYWJzb2x1dGUgcGF0aCBpZiBpdCBleGlzdHMKLSAgICAgKiAgICAgICAgIG90aGVyd2lzZSByZXR1cm4gPHR0Pm51bGw8L3R0PgorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9kaXIoKSB7CiAgICAgICAgIGlmIChkZXN0RGlyICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JhdGNoVGVzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmF0Y2hUZXN0LmphdmEKaW5kZXggOGVlY2NjOC4uNmVlNzYyNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmF0Y2hUZXN0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmF0Y2hUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMCArMTgsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKIAotCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwpAQCAtNTksNyArNjEsNyBAQAogCiAgICAgLyoqCiAgICAgICogQWRkIGEgbmV3IGZpbGVzZXQgaW5zdGFuY2UgdG8gdGhpcyBiYXRjaHRlc3QuIFdoYXRldmVyIHRoZSBmaWxlc2V0IGlzLAotICAgICAqIG9ubHkgZmlsZW5hbWUgdGhhdCBhcmUgPHR0Pi5qYXZhPC90dD4gb3IgPHR0Pi5jbGFzczwvdHQ+IHdpbGwgYmUKKyAgICAgKiBvbmx5IGZpbGVuYW1lIHRoYXQgYXJlIDxjb2RlPi5qYXZhPC9jb2RlPiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+IHdpbGwgYmUKICAgICAgKiBjb25zaWRlcmVkIGFzICdjYW5kaWRhdGVzJy4KICAgICAgKiBAcGFyYW0gICAgIGZzIHRoZSBuZXcgZmlsZXNldCBjb250YWluaW5nIHRoZSBydWxlcyB0byBnZXQgdGhlIHRlc3RjYXNlcy4KICAgICAgKi8KQEAgLTc5LDExICs4MSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBZGQgYSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uIGluc3RhbmNlIHRvIHRoaXMKICAgICAgKiBiYXRjaHRlc3QuIFdoYXRldmVyIHRoZSBjb2xsZWN0aW9uIGlzLCBvbmx5IG5hbWVzIHRoYXQgYXJlCi0gICAgICogPHR0Pi5qYXZhPC90dD4gb3IgPHR0Pi5jbGFzczwvdHQ+IHdpbGwgYmUgY29uc2lkZXJlZCBhcworICAgICAqIDxjb2RlPi5qYXZhPC9jb2RlPiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+IHdpbGwgYmUgY29uc2lkZXJlZCBhcwogICAgICAqICdjYW5kaWRhdGVzJy4KICAgICAgKiBAcGFyYW0gcmMgdGhlIG5ldyBSZXNvdXJjZUNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgcnVsZXMgdG8KICAgICAgKiBnZXQgdGhlIHRlc3RjYXNlcy4KQEAgLTk0LDIyICs5NSwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiBhbGwgPHR0PkpVbml0VGVzdDwvdHQ+IGluc3RhbmNlcyBvYnRhaW4gYnkgYXBwbHlpbmcgdGhlIGZpbGVzZXQgcnVsZXMuCisgICAgICogUmV0dXJuIGFsbCA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IGluc3RhbmNlcyBvYnRhaW4gYnkgYXBwbHlpbmcgdGhlIGZpbGVzZXQgcnVsZXMuCiAgICAgICogQHJldHVybiAgYW4gZW51bWVyYXRpb24gb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgYmF0Y2h0ZXN0IHRoYXQgYXJlCi0gICAgICogYSA8dHQ+SlVuaXRUZXN0PC90dD4gaW5zdGFuY2UuCisgICAgICogYSA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IGluc3RhbmNlLgogICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLSAgICAgICAgSlVuaXRUZXN0W10gdGVzdHMgPSBjcmVhdGVBbGxKVW5pdFRlc3QoKTsKLSAgICAgICAgcmV0dXJuIEVudW1lcmF0aW9ucy5mcm9tQXJyYXkodGVzdHMpOworICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxKVW5pdFRlc3Q+IGVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQXJyYXlzLmFzTGlzdChjcmVhdGVBbGxKVW5pdFRlc3QoKSkpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIENvbnZlbmllbnQgbWV0aG9kIHRvIG1lcmdlIHRoZSA8dHQ+SlVuaXRUZXN0PC90dD5zIG9mIHRoaXMgYmF0Y2h0ZXN0Ci0gICAgICogdG8gYSA8dHQ+VmVjdG9yPC90dD4uCisgICAgICogQ29udmVuaWVudCBtZXRob2QgdG8gbWVyZ2UgdGhlIDxjb2RlPkpVbml0VGVzdDwvY29kZT5zIG9mIHRoaXMgYmF0Y2h0ZXN0CisgICAgICogdG8gYSA8Y29kZT5WZWN0b3I8L2NvZGU+LgogICAgICAqIEBwYXJhbSB2IHRoZSB2ZWN0b3IgdG8gd2hpY2ggc2hvdWxkIGJlIGFkZGVkIGFsbCBpbmRpdmlkdWFsIHRlc3RzIG9mIHRoaXMKICAgICAgKiBiYXRjaCB0ZXN0LgogICAgICAqLwotICAgIHZvaWQgYWRkVGVzdHNUbyhWZWN0b3IgdikgeworICAgIHZvaWQgYWRkVGVzdHNUbyhWZWN0b3I8PyBzdXBlciBKVW5pdFRlc3Q+IHYpIHsKICAgICAgICAgSlVuaXRUZXN0W10gdGVzdHMgPSBjcmVhdGVBbGxKVW5pdFRlc3QoKTsKICAgICAgICAgdi5lbnN1cmVDYXBhY2l0eSh2LnNpemUoKSArIHRlc3RzLmxlbmd0aCk7CiAgICAgICAgIGZvciAoSlVuaXRUZXN0IHRlc3QgOiB0ZXN0cykgewpAQCAtMTE4LDUyICsxMTgsMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYWxsIDx0dD5KVW5pdFRlc3Q8L3R0PnMgYmFzZWQgb24gdGhlIGZpbGVzZXRzLiBFYWNoIGluc3RhbmNlCisgICAgICogQ3JlYXRlIGFsbCA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+cyBiYXNlZCBvbiB0aGUgZmlsZXNldHMuIEVhY2ggaW5zdGFuY2UKICAgICAgKiBpcyBjb25maWd1cmVkIHRvIG1hdGNoIHRoaXMgaW5zdGFuY2UgcHJvcGVydGllcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBhbGwgPHR0PkpVbml0VGVzdDwvdHQ+cyB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBiYXRjaC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBhbGwgPGNvZGU+SlVuaXRUZXN0PC9jb2RlPnMgdGhhdCBiZWxvbmdzIHRvIHRoaXMgYmF0Y2guCiAgICAgICovCiAgICAgcHJpdmF0ZSBKVW5pdFRlc3RbXSBjcmVhdGVBbGxKVW5pdFRlc3QoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGZpbGVuYW1lcyA9IGdldEZpbGVuYW1lcygpOwotICAgICAgICBKVW5pdFRlc3RbXSB0ZXN0cyA9IG5ldyBKVW5pdFRlc3RbZmlsZW5hbWVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBqYXZhVG9DbGFzcyhmaWxlbmFtZXNbaV0pOwotICAgICAgICAgICAgdGVzdHNbaV0gPSBjcmVhdGVKVW5pdFRlc3QoY2xhc3NuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVzdHM7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoZ2V0RmlsZW5hbWVzKCkpLm1hcChCYXRjaFRlc3Q6OmphdmFUb0NsYXNzKQorICAgICAgICAgICAgLm1hcCh0aGlzOjpjcmVhdGVKVW5pdFRlc3QpLnRvQXJyYXkoSlVuaXRUZXN0W106Om5ldyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSXRlcmF0ZSBvdmVyIGFsbCBmaWxlc2V0cyBhbmQgcmV0dXJuIHRoZSBmaWxlbmFtZSBvZiBhbGwgZmlsZXMKLSAgICAgKiB0aGF0IGVuZCB3aXRoIDx0dD4uamF2YTwvdHQ+IG9yIDx0dD4uY2xhc3M8L3R0Pi4gVGhpcyBpcyB0byBhdm9pZAotICAgICAqIHdyYXBwaW5nIGEgPHR0PkpVbml0VGVzdDwvdHQ+IG92ZXIgYW4geG1sIGZpbGUgZm9yIGV4YW1wbGUuIEEgVGVzdGNhc2UKKyAgICAgKiB0aGF0IGVuZCB3aXRoIDxjb2RlPi5qYXZhPC9jb2RlPiBvciA8Y29kZT4uY2xhc3M8L2NvZGU+LiBUaGlzIGlzIHRvIGF2b2lkCisgICAgICogd3JhcHBpbmcgYSA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IG92ZXIgYW4geG1sIGZpbGUgZm9yIGV4YW1wbGUuIEEgVGVzdGNhc2UKICAgICAgKiBpcyBvYnZpb3VzbHkgYSBqYXZhIGZpbGUgKGNvbXBpbGVkIG9yIG5vdCkuCiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBmaWxlbmFtZXMgd2l0aG91dCB0aGVpciBleHRlbnNpb24uIEFzIHRoZXkgc2hvdWxkCiAgICAgICogbm9ybWFsbHkgYmUgdGFrZW4gZnJvbSB0aGVpciByb290LCBmaWxlbmFtZXMgc2hvdWxkIG1hdGNoIHRoZWlyIGZ1bGx5CiAgICAgICogcXVhbGlmaWVkIGNsYXNzIG5hbWUgKElmIGl0IGlzIG5vdCB0aGUgY2FzZSBpdCB3aWxsIGZhaWwgd2hlbiBydW5uaW5nIHRoZSB0ZXN0KS4KLSAgICAgKiBGb3IgdGhlIGNsYXNzIDx0dD5vcmcvYXBhY2hlL1doYXRldmVyLmNsYXNzPC90dD4gaXQgd2lsbCByZXR1cm4gPHR0Pm9yZy9hcGFjaGUvV2hhdGV2ZXI8L3R0Pi4KKyAgICAgKiBGb3IgdGhlIGNsYXNzIDxjb2RlPm9yZy9hcGFjaGUvV2hhdGV2ZXIuY2xhc3M8L2NvZGU+IGl0IHdpbGwgcmV0dXJuIDxjb2RlPm9yZy9hcGFjaGUvV2hhdGV2ZXI8L2NvZGU+LgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nW10gZ2V0RmlsZW5hbWVzKCkgewotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChSZXNvdXJjZSByIDogcmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICBpZiAoci5pc0V4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhuYW1lID0gci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGhuYW1lLmVuZHNXaXRoKCIuamF2YSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChwYXRobmFtZS5zdWJzdHJpbmcoMCwgcGF0aG5hbWUubGVuZ3RoKCkgLSAiLmphdmEiLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRobmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHBhdGhuYW1lLnN1YnN0cmluZygwLCBwYXRobmFtZS5sZW5ndGgoKSAtICIuY2xhc3MiLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW3Yuc2l6ZSgpXTsKLSAgICAgICAgdi5jb3B5SW50byhmaWxlcyk7Ci0gICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlcy5zdHJlYW0oKS5maWx0ZXIoUmVzb3VyY2U6OmlzRXhpc3RzKQorICAgICAgICAgICAgLm1hcChSZXNvdXJjZTo6Z2V0TmFtZSkKKyAgICAgICAgICAgIC5maWx0ZXIobmFtZSAtPiBuYW1lLmVuZHNXaXRoKCIuamF2YSIpIHx8IG5hbWUuZW5kc1dpdGgoIi5jbGFzcyIpKQorICAgICAgICAgICAgLm1hcChuYW1lIC0+IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSkpCisgICAgICAgICAgICAudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBjb252ZXJ0IGEgcGF0aG5hbWUgd2l0aG91dCBleHRlbnNpb24gdG8gYQotICAgICAqIGZ1bGx5IHF1YWxpZmllZCBjbGFzc25hbWUuIEZvciBleGFtcGxlIDx0dD5vcmcvYXBhY2hlL1doYXRldmVyPC90dD4gd2lsbAotICAgICAqIGJlIGNvbnZlcnRlZCB0byA8dHQ+b3JnLmFwYWNoZS5XaGF0ZXZlcjwvdHQ+CisgICAgICogZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZS4gRm9yIGV4YW1wbGUgPGNvZGU+b3JnL2FwYWNoZS9XaGF0ZXZlcjwvY29kZT4gd2lsbAorICAgICAqIGJlIGNvbnZlcnRlZCB0byA8Y29kZT5vcmcuYXBhY2hlLldoYXRldmVyPC9jb2RlPgogICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gImNvbnZlcnQiIHRvIGEgY2xhc3NuYW1lLgogICAgICAqIEByZXR1cm4gdGhlIGNsYXNzbmFtZSBtYXRjaGluZyB0aGUgZmlsZW5hbWUuCiAgICAgICovCkBAIC0xNzMsMTEgKzE1OCwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIDx0dD5KVW5pdFRlc3Q8L3R0PiB0aGF0IGhhcyB0aGUgc2FtZSBwcm9wZXJ0eSBhcyB0aGlzCi0gICAgICogPHR0PkJhdGNoVGVzdDwvdHQ+IGluc3RhbmNlLgorICAgICAqIENyZWF0ZSBhIDxjb2RlPkpVbml0VGVzdDwvY29kZT4gdGhhdCBoYXMgdGhlIHNhbWUgcHJvcGVydHkgYXMgdGhpcworICAgICAqIDxjb2RlPkJhdGNoVGVzdDwvY29kZT4gaW5zdGFuY2UuCiAgICAgICogQHBhcmFtIGNsYXNzbmFtZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBzaG91bGQgYmUgcnVuIGFzIGEKLSAgICAgKiA8dHQ+SlVuaXRUZXN0PC90dD4uIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAcmV0dXJuIHRoZSA8dHQ+SlVuaXRUZXN0PC90dD4gb3ZlciB0aGUgZ2l2ZW4gY2xhc3NuYW1lLgorICAgICAqIDxjb2RlPkpVbml0VGVzdDwvY29kZT4uIEl0IG11c3QgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSA8Y29kZT5KVW5pdFRlc3Q8L2NvZGU+IG92ZXIgdGhlIGdpdmVuIGNsYXNzbmFtZS4KICAgICAgKi8KICAgICBwcml2YXRlIEpVbml0VGVzdCBjcmVhdGVKVW5pdFRlc3QoU3RyaW5nIGNsYXNzbmFtZSkgewogICAgICAgICBKVW5pdFRlc3QgdGVzdCA9IG5ldyBKVW5pdFRlc3QoKTsKQEAgLTE5MiwxMCArMTc3LDcgQEAKICAgICAgICAgdGVzdC5zZXRGYWlsdXJlUHJvcGVydHkoZmFpbHVyZVByb3BlcnR5KTsKICAgICAgICAgdGVzdC5zZXRFcnJvclByb3BlcnR5KGVycm9yUHJvcGVydHkpOwogICAgICAgICB0ZXN0LnNldFNraXBOb25UZXN0cyhpc1NraXBOb25UZXN0cygpKTsKLSAgICAgICAgRW51bWVyYXRpb24gbGlzdCA9IHRoaXMuZm9ybWF0dGVycy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAobGlzdC5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgdGVzdC5hZGRGb3JtYXR0ZXIoKEZvcm1hdHRlckVsZW1lbnQpIGxpc3QubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcy5mb3JtYXR0ZXJzLmZvckVhY2godGVzdDo6YWRkRm9ybWF0dGVyKTsKICAgICAgICAgcmV0dXJuIHRlc3Q7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKaW5kZXggOGQxMDZiMi4uNGU0YjA5MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKIApAQCAtMjksNyArMzAsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBQcmludHMgcGxhaW4gdGV4dCBvdXRwdXQgb2YgdGhlIHRlc3QgdG8gYSBzcGVjaWZpZWQgV3JpdGVyLgpAQCAtODksMTUgKzg5LDE3IEBACiAgICAgICogU2V0cyB0aGUgc3RyZWFtIHRoZSBmb3JtYXR0ZXIgaXMgc3VwcG9zZWQgdG8gd3JpdGUgaXRzIHJlc3VsdHMgdG8uCiAgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0bwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgICAgICBvdXRwdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyKG91dCkpOworICAgICAgICBvdXRwdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBAc2VlIEpVbml0UmVzdWx0Rm9ybWF0dGVyI3NldFN5c3RlbU91dHB1dChTdHJpbmcpCiAgICAgICoge0Bpbmhlcml0RG9jfS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgewogICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7CiAgICAgfQpAQCAtMTA2LDYgKzEwOCw3IEBACiAgICAgICogQHNlZSBKVW5pdFJlc3VsdEZvcm1hdHRlciNzZXRTeXN0ZW1FcnJvcihTdHJpbmcpCiAgICAgICoge0Bpbmhlcml0RG9jfS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihTdHJpbmcgZXJyKSB7CiAgICAgICAgIHN5c3RlbUVycm9yID0gZXJyOwogICAgIH0KQEAgLTExNSwxNSArMTE4LDEzIEBACiAgICAgICogVGhlIHdob2xlIHRlc3RzdWl0ZSBzdGFydGVkLgogICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdCBzdWl0ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgewogICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gUXVpY2sgcmV0dXJuIC0gbm8gb3V0cHV0IGRvIG5vdGhpbmcuCiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHN1aXRlOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGUoU3RyaW5nLmZvcm1hdCgiVGVzdHN1aXRlOiAlcyVuIiwgc3VpdGUuZ2V0TmFtZSgpKSk7CiAgICAgICAgICAgICBvdXRwdXQuZmx1c2goKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CkBAIC0xMzQsOCArMTM1LDkgQEAKICAgICAgKiBUaGUgd2hvbGUgdGVzdHN1aXRlIGVuZGVkLgogICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdCBzdWl0ZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHMgcnVuOiAiKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJUZXN0cyBydW46ICIpOwogICAgICAgICBzYi5hcHBlbmQoc3VpdGUucnVuQ291bnQoKSk7CiAgICAgICAgIHNiLmFwcGVuZCgiLCBGYWlsdXJlczogIik7CiAgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5mYWlsdXJlQ291bnQoKSk7CkBAIC0xNDUsMjUgKzE0NywxOSBAQAogICAgICAgICBzYi5hcHBlbmQoc3VpdGUuc2tpcENvdW50KCkpOwogICAgICAgICBzYi5hcHBlbmQoIiwgVGltZSBlbGFwc2VkOiAiKTsKICAgICAgICAgc2IuYXBwZW5kKG51bWJlckZvcm1hdC5mb3JtYXQoc3VpdGUuZ2V0UnVuVGltZSgpIC8gT05FX1NFQ09ORCkpOwotICAgICAgICBzYi5hcHBlbmQoIiBzZWMiKTsKLSAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKLSAgICAgICAgc2IuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiBzZWMlbiVuIikpOwogCiAgICAgICAgIC8vIGFwcGVuZCB0aGUgZXJyIGFuZCBvdXRwdXQgc3RyZWFtcyB0byB0aGUgbG9nCi0gICAgICAgIGlmIChzeXN0ZW1PdXRwdXQgIT0gbnVsbCAmJiBzeXN0ZW1PdXRwdXQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLSIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3lzdGVtT3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGlmIChzeXN0ZW1PdXRwdXQgIT0gbnVsbCAmJiAhc3lzdGVtT3V0cHV0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgT3V0cHV0IC0tLS0tLS0tLS0tLS0tLSVuIikpOworICAgICAgICAgICAgc2IuYXBwZW5kKHN5c3RlbU91dHB1dCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSVuIikpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgRXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0iKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZ1V0aWxzLkxJTkVfU0VQKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHN5c3RlbUVycm9yKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsICYmICFzeXN0ZW1FcnJvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEVycm9yIC0tLS0tLS0tLS0tLS0tLS0tJW4iKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3lzdGVtRXJyb3IpOworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIi0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0lbiIpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgewpAQCAtMTkwLDYgKzE4Niw3IEBACiAgICAgICogQSB0ZXN0IHN0YXJ0ZWQuCiAgICAgICogQHBhcmFtIHRlc3QgYSB0ZXN0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewogICAgIH0KIApAQCAtMTk3LDYgKzE5NCw3IEBACiAgICAgICogQSB0ZXN0IGVuZGVkLgogICAgICAqIEBwYXJhbSB0ZXN0IGEgdGVzdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7CiAgICAgfQogCkBAIC0yMTgsNiArMjE2LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdCBhIHRlc3QKICAgICAgKiBAcGFyYW0gdCAgICB0aGUgYXNzZXJ0aW9uIGZhaWxlZCBieSB0aGUgdGVzdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciB0KSB7CiAgICAgICAgIGFkZEZhaWx1cmUodGVzdCwgKFRocm93YWJsZSkgdCk7CiAgICAgfQpAQCAtMjI3LDYgKzIyNiw3IEBACiAgICAgICogQHBhcmFtIHRlc3QgIGEgdGVzdAogICAgICAqIEBwYXJhbSBlcnJvciB0aGUgZXJyb3IgdGhyb3duIGJ5IHRoZSB0ZXN0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgZXJyb3IpIHsKICAgICAgICAgZm9ybWF0RXJyb3IoIlx0Q2F1c2VkIGFuIEVSUk9SIiwgdGVzdCwgZXJyb3IpOwogICAgIH0KQEAgLTIzOSw5ICsyMzksOCBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgZm9ybWF0VGVzdChUZXN0IHRlc3QpIHsKICAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuICJOdWxsIFRlc3Q6ICI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRlc3RjYXNlOiAiICsgdGVzdC50b1N0cmluZygpICsgIjoiOwogICAgICAgICB9CisgICAgICAgIHJldHVybiAiVGVzdGNhc2U6ICIgKyB0ZXN0LnRvU3RyaW5nKCkgKyAiOiI7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzEsNiArMjcwLDcgQEAKICAgICB9CiAKIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKFRlc3QgdGVzdCkgewogICAgICAgICBmb3JtYXRTa2lwKHRlc3QsIEpVbml0VmVyc2lvbkhlbHBlci5nZXRJZ25vcmVNZXNzYWdlKHRlc3QpKTsKICAgICB9CkBAIC0yOTQsNiArMjk0LDcgQEAKIAogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlc3RBc3N1bXB0aW9uRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSBjYXVzZSkgewogICAgICAgICBmb3JtYXRTa2lwKHRlc3QsIGNhdXNlLmdldE1lc3NhZ2UoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQ29uc3RhbnRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Db25zdGFudHMuamF2YQppbmRleCBlOWJkMzAxLi43MzRkOWEzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Db25zdGFudHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Db25zdGFudHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0N1c3RvbUpVbml0NFRlc3RBZGFwdGVyQ2FjaGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0N1c3RvbUpVbml0NFRlc3RBZGFwdGVyQ2FjaGUuamF2YQppbmRleCA4YWQ0MGRkLi5iZjk5ODJjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9DdXN0b21KVW5pdDRUZXN0QWRhcHRlckNhY2hlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsMTEgKzMwLDExIEBACiAvKioKICAqIFByb3ZpZGVzIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub3RpZmllciBmb3IgYSBKVW5pdDRUZXN0QWRhcHRlcgogICogc28gdGhhdCBza2lwcGVkIGFuZCBpZ25vcmVkIHRlc3RzIGNhbiBiZSByZXBvcnRlZCB0byB0aGUgZXhpc3RpbmcKLSAqIDx0dD5UZXN0TGlzdGVuZXI8L3R0PnMuCisgKiA8Y29kZT5UZXN0TGlzdGVuZXI8L2NvZGU+cy4KICAqCiAgKi8KIHB1YmxpYyBjbGFzcyBDdXN0b21KVW5pdDRUZXN0QWRhcHRlckNhY2hlIGV4dGVuZHMgSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSB7Ci0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDdXN0b21KVW5pdDRUZXN0QWRhcHRlckNhY2hlIElOU1RBTkNFID0gbmV3IEN1c3RvbUpVbml0NFRlc3RBZGFwdGVyQ2FjaGUoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSBnZXRJbnN0YW5jZSgpIHsKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUnVuTm90aWZpZXIgZ2V0Tm90aWZpZXIoZmluYWwgVGVzdFJlc3VsdCByZXN1bHQsIGZpbmFsIEpVbml0NFRlc3RBZGFwdGVyIGFkYXB0ZXIpIHsKICAgICAgICAgcmV0dXJuIGdldE5vdGlmaWVyKHJlc3VsdCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRE9NVXRpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRE9NVXRpbC5qYXZhCmluZGV4IGNiMTkzOWUuLmY0NWI4NDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MywxMyArNDMsMTMgQEAKIAogICAgIC8qKgogICAgICAqIEZpbHRlciBpbnRlcmZhY2UgdG8gYmUgYXBwbGllZCB3aGVuIGl0ZXJhdGluZyBvdmVyIGEgRE9NIHRyZWUuCi0gICAgICogSnVzdCB0aGluayBvZiBpdCBsaWtlIGEgPHR0PkZpbGVGaWx0ZXI8L3R0PiBjbG9uZS4KKyAgICAgKiBKdXN0IHRoaW5rIG9mIGl0IGxpa2UgYSA8Y29kZT5GaWxlRmlsdGVyPC9jb2RlPiBjbG9uZS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIE5vZGVGaWx0ZXIgewogICAgICAgICAvKioKICAgICAgICAgICogQHBhcmFtICAgICAgIG5vZGUgICAgdGhlIG5vZGUgdG8gY2hlY2sgZm9yIGFjY2VwdGFuY2UuCi0gICAgICAgICAqIEByZXR1cm4gICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBub2RlIGlzIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyLAotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD4KKyAgICAgICAgICogQHJldHVybiAgICAgIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBub2RlIGlzIGFjY2VwdGVkIGJ5IHRoaXMgZmlsdGVyLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpOwogICAgIH0KQEAgLTU5LDggKzU5LDggQEAKICAgICAgKiByZWN1cnNpdmVseSBvciBub3QuCiAgICAgICogQHBhcmFtICAgcGFyZW50ICB0aGUgcGFyZW50IG5vZGUgdG8gc2VhcmNoIGZyb20KICAgICAgKiBAcGFyYW0gICBmaWx0ZXIgIHRoZSBmaWx0ZXIgdGhhdCBjaGlsZHJlbiBzaG91bGQgbWF0Y2guCi0gICAgICogQHBhcmFtICAgcmVjdXJzZSA8dHQ+dHJ1ZTwvdHQ+IGlmIHlvdSB3YW50IHRoZSBsaXN0IHRvIGJlIG1hZGUgcmVjdXJzaXZlbHkKLSAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA8dHQ+ZmFsc2U8L3R0Pi4KKyAgICAgKiBAcGFyYW0gICByZWN1cnNlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHlvdSB3YW50IHRoZSBsaXN0IHRvIGJlIG1hZGUgcmVjdXJzaXZlbHkKKyAgICAgKiAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCiAgICAgICogQHJldHVybiB0aGUgbm9kZSBsaXN0IHRoYXQgbWF0Y2hlcyB0aGUgZmlsdGVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgTm9kZUxpc3QgbGlzdENoaWxkTm9kZXMoTm9kZSBwYXJlbnQsIE5vZGVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIHJlY3Vyc2UpIHsKQEAgLTg2LDEzICs4NiwxNCBAQAogICAgIH0KIAogICAgIC8qKiBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgYSBub2RlbGlzdCAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGV4dGVuZHMgVmVjdG9yIGltcGxlbWVudHMgTm9kZUxpc3QgeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9kZUxpc3RJbXBsIGV4dGVuZHMgVmVjdG9yPE5vZGU+IGltcGxlbWVudHMgTm9kZUxpc3QgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMTc1NzQ5MTUwMDgwOTQ2NDIzTDsKIAogICAgICAgICAvKioKICAgICAgICAgICogR2V0IHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIGxpc3QuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKICAgICAgICAgICAgIHJldHVybiBzaXplKCk7CiAgICAgICAgIH0KQEAgLTEwMSw5ICsxMDIsMTAgQEAKICAgICAgICAgICogQHBhcmFtIGkgdGhlIGluZGV4IG9mIHRoZSBub2RlIHRvIGdldC4KICAgICAgICAgICogQHJldHVybiB0aGUgbm9kZSBpZiB0aGUgaW5kZXggaXMgaW4gYm91bmRzLCBudWxsIG90aGVyd2lzZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgTm9kZSBpdGVtKGludCBpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiAoTm9kZSkgZWxlbWVudEF0KGkpOworICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50QXQoaSk7CiAgICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBjb25mb3JtaW5nIHRvIE5vZGVMaXN0IGludGVyZmFjZQogICAgICAgICAgICAgfQpAQCAtMTE0LDggKzExNiw4IEBACiAgICAgICogcmV0dXJuIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb2YgYW4gZWxlbWVudC4KICAgICAgKiBAcGFyYW0gbm9kZSB0aGUgbm9kZSB0byBnZXQgdGhlIGF0dHJpYnV0ZSBmcm9tLgogICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2UgYXJlIGxvb2tpbmcgZm9yIHRoZSB2YWx1ZS4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZQotICAgICAqICAgICAgICAgYXR0cmlidXRlIHdhcyBub3QgZm91bmQgb3IgaWYgPHR0Pm5vZGU8L3R0PiBpcyBub3QgYW4gPHR0PkVsZW1lbnQ8L3R0Pi4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKKyAgICAgKiAgICAgICAgIGF0dHJpYnV0ZSB3YXMgbm90IGZvdW5kIG9yIGlmIDxjb2RlPm5vZGU8L2NvZGU+IGlzIG5vdCBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROb2RlQXR0cmlidXRlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CkBAIC0xMjksMTAgKzEzMSwxMCBAQAogICAgIC8qKgogICAgICAqIEl0ZXJhdGUgb3ZlciB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGFuZCByZXR1cm4gdGhlIGZpcnN0IG5vZGUKICAgICAgKiB0aGF0IGhhcyBhIHNwZWNpZmljIG5hbWUuCi0gICAgICogQHBhcmFtICAgcGFyZW50ICB0aGUgbm9kZSB0byBzZWFyY2ggY2hpbGQgZnJvbS4gQ2FuIGJlIDx0dD5udWxsPC90dD4uCi0gICAgICogQHBhcmFtICAgdGFnbmFtZSB0aGUgY2hpbGQgbmFtZSB3ZSBhcmUgbG9va2luZyBmb3IuIENhbm5vdCBiZSA8dHQ+bnVsbDwvdHQ+LgotICAgICAqIEByZXR1cm4gIHRoZSBmaXJzdCBjaGlsZCB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIG5hbWUgb3IgPHR0Pm51bGw8L3R0PiBpZgotICAgICAqICAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBpcyA8dHQ+bnVsbDwvdHQ+IG9yIGlmIGEgY2hpbGQgZG9lcyBub3QgbWF0Y2ggdGhlCisgICAgICogQHBhcmFtICAgcGFyZW50ICB0aGUgbm9kZSB0byBzZWFyY2ggY2hpbGQgZnJvbS4gQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgorICAgICAqIEBwYXJhbSAgIHRhZ25hbWUgdGhlIGNoaWxkIG5hbWUgd2UgYXJlIGxvb2tpbmcgZm9yLiBDYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCisgICAgICogQHJldHVybiAgdGhlIGZpcnN0IGNoaWxkIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgorICAgICAqICAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBpZiBhIGNoaWxkIGRvZXMgbm90IG1hdGNoIHRoZQogICAgICAqICAgICAgICAgICAgICAgICAgZ2l2ZW4gbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnQgZ2V0Q2hpbGRCeVRhZ05hbWUoTm9kZSBwYXJlbnQsIFN0cmluZyB0YWduYW1lKSB7CkBAIC0xNTMsMjAgKzE1NSwyMCBAQAogCiAgICAgLyoqCiAgICAgICogU2ltcGxlIHRyZWUgd2Fsa2VyIHRoYXQgd2lsbCBjbG9uZSByZWN1cnNpdmVseSBhIG5vZGUuIFRoaXMgaXMgdG8KLSAgICAgKiBhdm9pZCB1c2luZyBwYXJzZXItc3BlY2lmaWMgQVBJIHN1Y2ggYXMgU3VuJ3MgPHR0PmNoYW5nZU5vZGVPd25lcjwvdHQ+Ci0gICAgICogd2hlbiB3ZSBhcmUgZGVhbGluZyB3aXRoIERPTSBMMSBpbXBsZW1lbnRhdGlvbnMgc2luY2UgPHR0PmNsb25lTm9kZShib29sZWFuKTwvdHQ+CisgICAgICogYXZvaWQgdXNpbmcgcGFyc2VyLXNwZWNpZmljIEFQSSBzdWNoIGFzIFN1bidzIDxjb2RlPmNoYW5nZU5vZGVPd25lcjwvY29kZT4KKyAgICAgKiB3aGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggRE9NIEwxIGltcGxlbWVudGF0aW9ucyBzaW5jZSA8Y29kZT5jbG9uZU5vZGUoYm9vbGVhbik8L2NvZGU+CiAgICAgICogd2lsbCBub3QgY2hhbmdlIHRoZSBvd25lciBkb2N1bWVudC4KLSAgICAgKiA8dHQ+Y2hhbmdlTm9kZU93bmVyPC90dD4gaXMgbXVjaCBmYXN0ZXIgYW5kIGF2b2lkIHRoZSBjb3N0bHkgY2xvbmluZyBwcm9jZXNzLgotICAgICAqIDx0dD5pbXBvcnROb2RlPC90dD4gaXMgaW4gdGhlIERPTSBMMiBpbnRlcmZhY2UuCisgICAgICogPGNvZGU+Y2hhbmdlTm9kZU93bmVyPC9jb2RlPiBpcyBtdWNoIGZhc3RlciBhbmQgYXZvaWQgdGhlIGNvc3RseSBjbG9uaW5nIHByb2Nlc3MuCisgICAgICogPGNvZGU+aW1wb3J0Tm9kZTwvY29kZT4gaXMgaW4gdGhlIERPTSBMMiBpbnRlcmZhY2UuCiAgICAgICogQHBhcmFtICAgcGFyZW50ICB0aGUgbm9kZSBwYXJlbnQgdG8gd2hpY2ggd2Ugc2hvdWxkIGRvIHRoZSBpbXBvcnQgdG8uCiAgICAgICogQHBhcmFtICAgY2hpbGQgICB0aGUgbm9kZSB0byBjbG9uZSByZWN1cnNpdmVseS4gSXRzIGNsb25lIHdpbGwgYmUKLSAgICAgKiAgICAgICAgICAgICAgYXBwZW5kZWQgdG8gPHR0PnBhcmVudDwvdHQ+LgotICAgICAqIEByZXR1cm4gIHRoZSBjbG9uZWQgbm9kZSB0aGF0IGlzIGFwcGVuZGVkIHRvIDx0dD5wYXJlbnQ8L3R0PgorICAgICAqICAgICAgICAgICAgICBhcHBlbmRlZCB0byA8Y29kZT5wYXJlbnQ8L2NvZGU+LgorICAgICAqIEByZXR1cm4gIHRoZSBjbG9uZWQgbm9kZSB0aGF0IGlzIGFwcGVuZGVkIHRvIDxjb2RlPnBhcmVudDwvY29kZT4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIE5vZGUgaW1wb3J0Tm9kZShOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotICAgICAgICBOb2RlIGNvcHkgPSBudWxsOwogICAgICAgICBmaW5hbCBEb2N1bWVudCBkb2MgPSBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwogCisgICAgICAgIE5vZGUgY29weTsKICAgICAgICAgc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7CiAgICAgICAgIGNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6CiAgICAgICAgICAgICBjb3B5ID0gZG9jLmNyZWF0ZUNEQVRBU2VjdGlvbigoKENEQVRBU2VjdGlvbikgY2hpbGQpLmdldERhdGEoKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9FbnVtZXJhdGlvbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0VudW1lcmF0aW9ucy5qYXZhCmluZGV4IGM2YTAxNGQuLjRlNzExZTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0VudW1lcmF0aW9ucy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0VudW1lcmF0aW9ucy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNiArMTcsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwogCkBAIC0yNiw2ICsyOCw3IEBACiAgKiBpbnN0ZWFkIG9mIDEuMS4KICAqCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgZmluYWwgY2xhc3MgRW51bWVyYXRpb25zIHsKIAogICAgIHByaXZhdGUgRW51bWVyYXRpb25zKCkgewpAQCAtMzMsNzMgKzM2LDM2IEBACiAKICAgICAvKioKICAgICAgKiBjcmVhdGVzIGFuIGVudW1lcmF0aW9uIGZyb20gYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAgICAgKiBAcGFyYW0gICAgICAgYXJyYXkgICB0aGUgYXJyYXkgb2Ygb2JqZWN0IHRvIGVudW1lcmF0ZS4KKyAgICAgKiBAcGFyYW0gPFQ+IG9iamVjdCB0eXBlCisgICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvZiBvYmplY3QgdG8gZW51bWVyYXRlLgogICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG92ZXIgdGhlIGFycmF5IG9mIG9iamVjdHMuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKEFycmF5cy5hc0xpc3QoYXJyYXkpKQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZnJvbUFycmF5KE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQXJyYXlFbnVtZXJhdGlvbihhcnJheSk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBFbnVtZXJhdGlvbjxUPiBmcm9tQXJyYXkoVC4uLiBhcnJheSkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oQXJyYXlzLmFzTGlzdChhcnJheSkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIGNyZWF0ZXMgYW4gZW51bWVyYXRpb24gZnJvbSBhbiBhcnJheSBvZiBlbnVtZXJhdGlvbi4gVGhlIGNyZWF0ZWQgZW51bWVyYXRpb24KICAgICAgKiB3aWxsIHNlcXVlbnRpYWxseSBlbnVtZXJhdGUgb3ZlciBhbGwgZWxlbWVudHMgb2YgZWFjaCBlbnVtZXJhdGlvbiBhbmQgc2tpcAotICAgICAqIDx0dD5udWxsPC90dD4gZW51bWVyYXRpb24gZWxlbWVudHMgaW4gdGhlIGFycmF5LgotICAgICAqIEBwYXJhbSAgICAgICAgZW51bXMgICB0aGUgYXJyYXkgb2YgZW51bWVyYXRpb25zLgorICAgICAqIDxjb2RlPm51bGw8L2NvZGU+IGVudW1lcmF0aW9uIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gPFQ+IG9iamVjdCB0eXBlCisgICAgICogQHBhcmFtIGVudW1zIHRoZSBhcnJheSBvZiBlbnVtZXJhdGlvbnMuCiAgICAgICogQHJldHVybiB0aGUgZW51bWVyYXRpb24gb3ZlciB0aGUgYXJyYXkgb2YgZW51bWVyYXRpb25zLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBTdHJlYW0uY29uY2F0KENvbGxlY3Rpb25zLmxpc3Qob25lKS5zdHJlYW0oKSwgQ29sbGVjdGlvbnMubGlzdCh0d28pLnN0cmVhbSgpKQorICAgICAqICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmNvbGxlY3RpbmdBbmRUaGVuKENvbGxlY3RvcnMudG9MaXN0KCksIENvbGxlY3Rpb25zOjplbnVtZXJhdGlvbikpCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBmcm9tQ29tcG91bmQoRW51bWVyYXRpb25bXSBlbnVtcykgewotICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kRW51bWVyYXRpb24oZW51bXMpOworICAgIEBEZXByZWNhdGVkCisgICAgQFNhZmVWYXJhcmdzCisgICAgcHVibGljIHN0YXRpYyA8VD4gRW51bWVyYXRpb248VD4gZnJvbUNvbXBvdW5kKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBUPi4uLiBlbnVtcykgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kRW51bWVyYXRpb248PihlbnVtcyk7CiAgICAgfQogCiB9CiAKIC8qKgotICogQ29udmVuaWVudCBlbnVtZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIG9iamVjdHMuCi0gKi8KLWNsYXNzIEFycmF5RW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0KLSAgICAvKiogb2JqZWN0IGFycmF5ICovCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBhcnJheTsKLQotICAgIC8qKiBjdXJyZW50IGluZGV4ICovCi0gICAgcHJpdmF0ZSBpbnQgcG9zOwotCi0gICAgLyoqCi0gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBlbnVtZXJhdGlvbiB0aGF0IHdyYXBzIGFuIGFycmF5LgotICAgICAqIEBwYXJhbSAgICAgICBhcnJheSAgIHRoZSBhcnJheSBvZiBvYmplY3QgdG8gZW51bWVyYXRlLgotICAgICAqLwotICAgIHB1YmxpYyBBcnJheUVudW1lcmF0aW9uKE9iamVjdFtdIGFycmF5KSB7Ci0gICAgICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICAgICAgdGhpcy5wb3MgPSAwOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBpZiB0aGlzIGVudW1lcmF0aW9uIGNvbnRhaW5zIG1vcmUgZWxlbWVudHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGlzIGVudW1lcmF0aW9uIG9iamVjdAotICAgICAqICAgICAgICAgICBjb250YWlucyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGU7Ci0gICAgICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0gICAgICAgIHJldHVybiAocG9zIDwgYXJyYXkubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhpcyBlbnVtZXJhdGlvbiBpZiB0aGlzIGVudW1lcmF0aW9uCi0gICAgICogb2JqZWN0IGhhcyBhdCBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IHRvIHByb3ZpZGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuICAgICB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24uCi0gICAgICogQHRocm93cyAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAgaWYgbm8gbW9yZSBlbGVtZW50cyBleGlzdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgICAgICBpZiAoaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gYXJyYXlbcG9zXTsKLSAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci19Ci0vKioKICAqIENvbnZlbmllbnQgZW51bWVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiBlbnVtZXJhdGlvbi4gRm9yIGV4YW1wbGU6CiAgKiA8cHJlPgogICogRW51bWVyYXRpb24gZTEgPSB2MS5lbGVtZW50cygpOwpAQCAtMTI5LDE1ICs5NSwxNyBAQAogICogfQogICogPC9wcmU+CiAgKi8KLWNsYXNzIENvbXBvdW5kRW51bWVyYXRpb24gaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7CitARGVwcmVjYXRlZAorY2xhc3MgQ29tcG91bmRFbnVtZXJhdGlvbjxUPiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uPFQ+IHsKIAogICAgIC8qKiBlbnVtZXJhdGlvbiBhcnJheSAqLwotICAgIHByaXZhdGUgRW51bWVyYXRpb25bXSBlbnVtQXJyYXk7CisgICAgcHJpdmF0ZSBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgVD5bXSBlbnVtQXJyYXk7CiAKICAgICAvKiogaW5kZXggaW4gdGhlIGVudW1zIGFycmF5ICovCiAgICAgcHJpdmF0ZSBpbnQgaW5kZXggPSAwOwogCi0gICAgcHVibGljIENvbXBvdW5kRW51bWVyYXRpb24oRW51bWVyYXRpb25bXSBlbnVtYXJyYXkpIHsKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgQ29tcG91bmRFbnVtZXJhdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgVD4uLi4gZW51bWFycmF5KSB7CiAgICAgICAgIHRoaXMuZW51bUFycmF5ID0gZW51bWFycmF5OwogICAgIH0KIApAQCAtMTQ4LDYgKzExNiw3IEBACiAgICAgICogICAgICAgICAgIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBtb3JlIGVsZW1lbnQgdG8gcHJvdmlkZTsKICAgICAgKiAgICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW51bUFycmF5Lmxlbmd0aCkgewogICAgICAgICAgICAgaWYgKGVudW1BcnJheVtpbmRleF0gIT0gbnVsbCAmJiBlbnVtQXJyYXlbaW5kZXhdLmhhc01vcmVFbGVtZW50cygpKSB7CkBAIC0xNjUsNyArMTM0LDggQEAKICAgICAgKiBAcmV0dXJuICAgICB0aGUgbmV4dCBlbGVtZW50IG9mIHRoaXMgZW51bWVyYXRpb24uCiAgICAgICogQHRocm93cyAgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiAgaWYgbm8gbW9yZSBlbGVtZW50cyBleGlzdC4KICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIG5leHRFbGVtZW50KCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewogICAgICAgICBpZiAoaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgIHJldHVybiBlbnVtQXJyYXlbaW5kZXhdLm5leHRFbGVtZW50KCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0ZhaWx1cmVSZWNvcmRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRmFpbHVyZVJlY29yZGVyLmphdmEKaW5kZXggYzZhMzM4Yi4uOTc2MWYxOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRmFpbHVyZVJlY29yZGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRmFpbHVyZVJlY29yZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMSArMjMsMTAgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKIApAQCAtODgsNyArODcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfUFJFRklYID0gIiAgICBbanVuaXRdIjsKIAogICAgIC8qKiBDbGFzcyBuYW1lcyBvZiBmYWlsZWQgdGVzdHMgd2l0aG91dCBkdXBsaWNhdGVzLiAqLwotICAgIHByaXZhdGUgc3RhdGljIFNvcnRlZFNldDxUZXN0SW5mb3M+IGZhaWxlZFRlc3RzID0gbmV3IFRyZWVTZXQ8VGVzdEluZm9zPigpOworICAgIHByaXZhdGUgc3RhdGljIFNvcnRlZFNldDxUZXN0SW5mb3M+IGZhaWxlZFRlc3RzID0gbmV3IFRyZWVTZXQ8PigpOwogCiAgICAgLyoqIEEgd3JpdGVyIGZvciB3cml0aW5nIHRoZSBnZW5lcmF0ZWQgc291cmNlIHRvLiAqLwogICAgIHByaXZhdGUgQnVmZmVyZWRXcml0ZXIgd3JpdGVyOwpAQCAtMTQ1LDIyICsxNDQsMTMgQEAKICAgICAgKiBAcGFyYW0gcHJvamVjdAogICAgICAqICAgICAgICAgICAgcHJvamVjdCByZWZlcmVuY2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewogICAgICAgICAvLyBzdG9yZSBwcm9qZWN0IHJlZmVyZW5jZSBmb3IgbG9nZ2luZwogICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOwogICAgICAgICAvLyBjaGVjayBpZiBhbHJlYWR5IHJlZ2lzdGVyZWQKLSAgICAgICAgYm9vbGVhbiBhbHJlYWR5UmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBWZWN0b3IgYWxsTGlzdGVuZXJzID0gcHJvamVjdC5nZXRCdWlsZExpc3RlbmVycygpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGFsbExpc3RlbmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgbGlzdGVuZXIgPSBhbGxMaXN0ZW5lcnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgRmFpbHVyZVJlY29yZGVyKSB7Ci0gICAgICAgICAgICAgICAgYWxyZWFkeVJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHJlZ2lzdGVyIGlmIG5lZWRlZAotICAgICAgICBpZiAoIWFscmVhZHlSZWdpc3RlcmVkKSB7CisgICAgICAgIGlmIChwcm9qZWN0LmdldEJ1aWxkTGlzdGVuZXJzKCkuc3RyZWFtKCkubm9uZU1hdGNoKEZhaWx1cmVSZWNvcmRlci5jbGFzczo6aXNJbnN0YW5jZSkpIHsKICAgICAgICAgICAgIHZlcmJvc2UoIlJlZ2lzdGVyIEZhaWx1cmVSZWNvcmRlciAoQCIgKyB0aGlzLmhhc2hDb2RlKCkgKyAiKSBhcyBCdWlsZExpc3RlbmVyIik7CiAgICAgICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIH0KQEAgLTE3Miw2ICsxNjIsNyBAQAogICAgICAqIE5vdCB1c2VkCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgfQogCkBAIC0xODEsNiArMTcyLDcgQEAKICAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIHRoZSByZWFzb24gaXQgZXJyZWQuCiAgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyI2FkZEVycm9yKGp1bml0LmZyYW1ld29yay5UZXN0LCBqYXZhLmxhbmcuVGhyb3dhYmxlKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewogICAgICAgICBmYWlsZWRUZXN0cy5hZGQobmV3IFRlc3RJbmZvcyh0ZXN0KSk7CiAgICAgfQpAQCAtMTkzLDYgKzE4NSw3IEBACiAgICAgICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdExpc3RlbmVyI2FkZEZhaWx1cmUoanVuaXQuZnJhbWV3b3JrLlRlc3QsIGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcikKICAgICAgKi8KICAgICAvLyBDaGVja1N0eWxlOkxpbmVMZW5ndGhDaGVjayBPTgorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoVGVzdCB0ZXN0LCBBc3NlcnRpb25GYWlsZWRFcnJvciBlcnJvcikgewogICAgICAgICBmYWlsZWRUZXN0cy5hZGQobmV3IFRlc3RJbmZvcyh0ZXN0KSk7CiAgICAgfQpAQCAtMjAxLDYgKzE5NCw3IEBACiAgICAgICogTm90IHVzZWQKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKICAgICAgICAgLy8gdW51c2VkLCBjbG9zZSBvdXRwdXQgZmlsZSBzbyBpdCBjYW4gYmUgZGVsZXRlZCBiZWZvcmUgdGhlIFZNIGV4aXRzCiAgICAgICAgIGlmIChvdXQgIT0gU3lzdGVtLm91dCkgewpAQCAtMjEyLDYgKzIwNiw3IEBACiAgICAgICogTm90IHVzZWQKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycikgewogICAgIH0KIApAQCAtMjE5LDYgKzIxNCw3IEBACiAgICAgICogTm90IHVzZWQKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KFN0cmluZyBvdXQpIHsKICAgICB9CiAKQEAgLTIyNiw2ICsyMjIsNyBAQAogICAgICAqIE5vdCB1c2VkCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICB9CiAKQEAgLTIzMyw2ICsyMzAsNyBAQAogICAgICAqIE5vdCB1c2VkCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7CiAgICAgfQogCkBAIC0yNDAsNiArMjM4LDcgQEAKICAgICAgKiBOb3QgdXNlZAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7CiAgICAgfQogCkBAIC0yNDcsNyArMjQ2LDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCB3cml0ZUphdmFDbGFzcygpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKChnZXRMb2NhdGlvbk5hbWUoKSArICIuamF2YSIpKTsKKyAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKGdldExvY2F0aW9uTmFtZSgpICsgIi5qYXZhIik7CiAgICAgICAgICAgICB2ZXJib3NlKCJXcml0ZSBjb2xsZWN0b3IgY2xhc3MgdG8gJyIgKyBzb3VyY2VGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiciKTsKIAogICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGUuZXhpc3RzKCkgJiYgIXNvdXJjZUZpbGUuZGVsZXRlKCkpIHsKQEAgLTI2OCw3ICsyNjcsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsYXNzSGVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGdldExvY2F0aW9uTmFtZSgpLnJlcGxhY2UoJ1xcJywgJy8nKTsKLSAgICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcvJykgPiAtMSkgeworICAgICAgICBpZiAoY2xhc3NOYW1lLmNvbnRhaW5zKCIvIikpIHsKICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgICAgICAgfQogICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IHNkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5Lk1NLmRkIEhIOm1tOnNzLFNTUyIpOwpAQCAtMzIxLDYgKzMyMCw3IEBACiAgICAgICogTG9nZ2luZyBmYWNhZGUgaW4gSU5GTy1tb2RlLgogICAgICAqIEBwYXJhbSBtZXNzYWdlIExvZy1tZXNzYWdlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIGdldFByb2plY3QoKS5sb2coTE9HX1BSRUZJWCArICIgIiArIG1lc3NhZ2UsIFByb2plY3QuTVNHX0lORk8pOwogICAgIH0KQEAgLTMzNiw3ICszMzYsNyBAQAogICAgIC8qKgogICAgICAqIFRlc3RJbmZvcyBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHRlc3QgZm9yIGxhdGVyIHVzZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RJbmZvcyBpbXBsZW1lbnRzIENvbXBhcmFibGUgeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEluZm9zIGltcGxlbWVudHMgQ29tcGFyYWJsZTxUZXN0SW5mb3M+IHsKIAogICAgICAgICAvKiogVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHRlc3QuICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKQEAgLTM1MCw4ICszNTAsOCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFRlc3RJbmZvcyhUZXN0IHRlc3QpIHsKICAgICAgICAgICAgIGNsYXNzTmFtZSA9IHRlc3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBTdHJpbmcgX21ldGhvZE5hbWUgPSB0ZXN0LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBtZXRob2ROYW1lID0gX21ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIF9tZXRob2ROYW1lLmluZGV4T2YoJygnKSk7CisgICAgICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IHRlc3QudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUuc3Vic3RyaW5nKDAsIG1ldGhvZE5hbWUuaW5kZXhPZignKCcpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMzYxLDYgKzM2MSw3IEBACiAgICAgICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCiAgICAgICAgICAqIEBzZWUgRmFpbHVyZVJlY29yZGVyI2NyZWF0ZVN1aXRlTWV0aG9kKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgcmV0dXJuICJuZXcgIiArIGNsYXNzTmFtZSArICIoXCIiICsgbWV0aG9kTmFtZSArICJcIikiOwogICAgICAgICB9CkBAIC0zNzIsMTcgKzM3MywxOCBAQAogICAgICAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbwogICAgICAgICAgKiBAc2VlIFNvcnRlZFNldCNjb21wYXJhdG9yKCkKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVGVzdEluZm9zKSB7Ci0gICAgICAgICAgICAgICAgVGVzdEluZm9zIG90aGVySW5mb3MgPSAoVGVzdEluZm9zKSBvdGhlcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKS5jb21wYXJlVG8ob3RoZXJJbmZvcy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oVGVzdEluZm9zIG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gQ29tcGFyYXRvci5jb21wYXJpbmcoT2JqZWN0Ojp0b1N0cmluZykuY29tcGFyZSh0aGlzLCBvdGhlcik7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBUZXN0SW5mb3MgJiYgdG9TdHJpbmcoKS5lcXVhbHMob2JqLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIG9iaiA9PSB0aGlzIHx8IG9iaiBpbnN0YW5jZW9mIFRlc3RJbmZvcworICAgICAgICAgICAgICAgICYmIHRvU3RyaW5nKCkuZXF1YWxzKG9iai50b1N0cmluZygpKTsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuaGFzaENvZGUoKTsKICAgICAgICAgfQpAQCAtMzk0LDYgKzM5Niw3IEBACiAgICAgICogTm90IHVzZWQKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCkBAIC00MDEsNiArNDA0LDcgQEAKICAgICAgKiBOb3QgdXNlZAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgIH0KIApAQCAtNDA4LDYgKzQxMiw3IEBACiAgICAgICogTm90IHVzZWQKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCkBAIC00MTUsNiArNDIwLDcgQEAKICAgICAgKiBOb3QgdXNlZAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCkBAIC00MjIsNiArNDI4LDcgQEAKICAgICAgKiBOb3QgdXNlZAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICB9CiAKQEAgLTQzMSw2ICs0MzgsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCAgbm90IHVzZWQKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFza0ZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKCFmYWlsZWRUZXN0cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHdyaXRlSmF2YUNsYXNzKCk7CkBAIC00NDEsNiArNDQ5LDcgQEAKICAgICAgKiBOb3QgdXNlZAogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Gb3JtYXR0ZXJFbGVtZW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Gb3JtYXR0ZXJFbGVtZW50LmphdmEKaW5kZXggNWIzMWU3Zi4uOThiZDY4NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvRm9ybWF0dGVyRWxlbWVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0Zvcm1hdHRlckVsZW1lbnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDE3ICsyMCwxOCBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5KVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLktlZXBBbGl2ZU91dHB1dFN0cmVhbTsKIApAQCAtNTksNiArNjAsMTggQEAKICAqIEBzZWUgSlVuaXRSZXN1bHRGb3JtYXR0ZXIKICAqLwogcHVibGljIGNsYXNzIEZvcm1hdHRlckVsZW1lbnQgeworICAgIC8qKiB4bWwgZm9ybWF0dGVyIGNsYXNzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FID0KKyAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIjsKKyAgICAvKiogYnJpZWYgZm9ybWF0dGVyIGNsYXNzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfRk9STUFUVEVSX0NMQVNTX05BTUUgPQorICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlciI7CisgICAgLyoqIHBsYWluIGZvcm1hdHRlciBjbGFzcyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQUlOX0ZPUk1BVFRFUl9DTEFTU19OQU1FID0KKyAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIiOworICAgIC8qKiBmYWlsdXJlIHJlY29yZGVyIGNsYXNzICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUNPUkRFUl9DTEFTU19OQU1FID0KKyAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkZhaWx1cmVSZWNvcmRlciI7CiAKICAgICBwcml2YXRlIFN0cmluZyBjbGFzc25hbWU7CiAgICAgcHJpdmF0ZSBTdHJpbmcgZXh0ZW5zaW9uOwpAQCAtNzQsMTkgKzg3LDYgQEAKICAgICAgKi8KICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKIAotICAgIC8qKiB4bWwgZm9ybWF0dGVyIGNsYXNzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIjsKLSAgICAvKiogYnJpZWYgZm9ybWF0dGVyIGNsYXNzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJJRUZfRk9STUFUVEVSX0NMQVNTX05BTUUgPQotICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlciI7Ci0gICAgLyoqIHBsYWluIGZvcm1hdHRlciBjbGFzcyAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMQUlOX0ZPUk1BVFRFUl9DTEFTU19OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LlBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIiOwotICAgIC8qKiBmYWlsdXJlIHJlY29yZGVyIGNsYXNzICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRV9SRUNPUkRFUl9DTEFTU19OQU1FID0KLSAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkZhaWx1cmVSZWNvcmRlciI7Ci0KICAgICAvKioKICAgICAgKiA8cD5RdWljayB3YXkgdG8gdXNlIGEgc3RhbmRhcmQgZm9ybWF0dGVyLjwvcD4KICAgICAgKgpAQCAtMTA0LDE4ICsxMDQsMTkgQEAKICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZW51bWVyYXRlZCB2YWx1ZSB0byB1c2UuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VHlwZShUeXBlQXR0cmlidXRlIHR5cGUpIHsKLSAgICAgICAgaWYgKCJ4bWwiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgIGNhc2UgInhtbCI6CiAgICAgICAgICAgICBzZXRDbGFzc25hbWUoWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgiYnJpZWYiLmVxdWFscyh0eXBlLmdldFZhbHVlKCkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKEJSSUVGX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCJmYWlsdXJlIi5lcXVhbHModHlwZS5nZXRWYWx1ZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBzZXRDbGFzc25hbWUoRkFJTFVSRV9SRUNPUkRFUl9DTEFTU19OQU1FKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBtdXN0IGJlIHBsYWluLCBlbnN1cmVkIGJ5IFR5cGVBdHRyaWJ1dGUKLSAgICAgICAgICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKFBMQUlOX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAiYnJpZWYiOgorICAgICAgICAgICAgc2V0Q2xhc3NuYW1lKEJSSUVGX0ZPUk1BVFRFUl9DTEFTU19OQU1FKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICJmYWlsdXJlIjoKKyAgICAgICAgICAgIHNldENsYXNzbmFtZShGQUlMVVJFX1JFQ09SREVSX0NMQVNTX05BTUUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzZXRDbGFzc25hbWUoUExBSU5fRk9STUFUVEVSX0NMQVNTX05BTUUpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyNywxMiArMTI4LDE4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKICAgICAgICAgdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gICAgICAgIGlmIChYTUxfRk9STUFUVEVSX0NMQVNTX05BTUUuZXF1YWxzKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgc2V0RXh0ZW5zaW9uKCIueG1sIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoUExBSU5fRk9STUFUVEVSX0NMQVNTX05BTUUuZXF1YWxzKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgc2V0RXh0ZW5zaW9uKCIudHh0Iik7Ci0gICAgICAgIH0gZWxzZSBpZiAoQlJJRUZfRk9STUFUVEVSX0NMQVNTX05BTUUuZXF1YWxzKGNsYXNzbmFtZSkpIHsKLSAgICAgICAgICAgc2V0RXh0ZW5zaW9uKCIudHh0Iik7CisgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChjbGFzc25hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgWE1MX0ZPUk1BVFRFUl9DTEFTU19OQU1FOgorICAgICAgICAgICAgICAgIHNldEV4dGVuc2lvbigiLnhtbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQTEFJTl9GT1JNQVRURVJfQ0xBU1NfTkFNRToKKyAgICAgICAgICAgICAgICBzZXRFeHRlbnNpb24oIi50eHQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQlJJRUZfRk9STUFUVEVSX0NMQVNTX05BTUU6CisgICAgICAgICAgICAgICAgc2V0RXh0ZW5zaW9uKCIudHh0Iik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2OCw3ICsyNzUsNiBAQAogICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KQEAgLTI4MSw0MyArMjg3LDM0IEBACiAgICAgICAgIC8vYWx0aG91Z2ggdGhpcyBjb2RlIGFwcGVhcnMgdG8gZHVwbGljYXRlIHRoYXQgb2YgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UsCiAgICAgICAgIC8vd2UgY2Fubm90IHVzZSB0aGF0IGJlY2F1c2UgdGhpcyBmb3JtYXR0ZXIgbWF5IHJ1biBpbiBhIGZvcmtlZCBwcm9jZXNzLAogICAgICAgICAvL3dpdGhvdXQgdGhhdCBjbGFzcy4KLSAgICAgICAgQ2xhc3MgZiA9IG51bGw7CisgICAgICAgIENsYXNzPD8+IGY7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBmID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUsIHRydWUsIGxvYWRlcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJVc2luZyBsb2FkZXIgIiArIGxvYWRlciArICIgb24gY2xhc3MgIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICsgIjogIiArIGUsIGUpOwotICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gfCBOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlVzaW5nIGxvYWRlciAiICsgbG9hZGVyICsgIiBvbiBjbGFzcyAiICsgY2xhc3NuYW1lCiAgICAgICAgICAgICAgICAgKyAiOiAiICsgZSwgZSk7CiAgICAgICAgIH0KIAotICAgICAgICBPYmplY3QgbyA9IG51bGw7CisgICAgICAgIEpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIHI7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvID0gZi5uZXdJbnN0YW5jZSgpOwotICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByID0gZi5hc1N1YmNsYXNzKEpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yLmNsYXNzKS5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBpcyBub3QgYSBKVW5pdFJlc3VsdEZvcm1hdHRlciIsCisgICAgICAgICAgICAgICAgY2xhc3NuYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEpVbml0VGFza01pcnJvci5KVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihjbGFzc25hbWUgKyAiIGlzIG5vdCBhIEpVbml0UmVzdWx0Rm9ybWF0dGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgSlVuaXRUYXNrTWlycm9yLkpVbml0UmVzdWx0Rm9ybWF0dGVyTWlycm9yIHIgPQotICAgICAgICAgICAgKEpVbml0VGFza01pcnJvci5KVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvcikgbzsKICAgICAgICAgaWYgKHVzZUZpbGUgJiYgb3V0RmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBvdXQgPSBuZXcgRGVsYXllZEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7CiAgICAgICAgIH0KICAgICAgICAgci5zZXRPdXRwdXQob3V0KTsKIAotCiAgICAgICAgIGJvb2xlYW4gbmVlZFRvU2V0UHJvamVjdFJlZmVyZW5jZSA9IHRydWU7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBGaWVsZCBmaWVsZCA9IHIuZ2V0Q2xhc3MoKS5nZXRGaWVsZCgicHJvamVjdCIpOwpAQCAtMzM1LDEzICszMzIsMTEgQEAKICAgICAgICAgaWYgKG5lZWRUb1NldFByb2plY3RSZWZlcmVuY2UpIHsKICAgICAgICAgICAgIE1ldGhvZCBzZXR0ZXI7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldHRlciA9IHIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoInNldFByb2plY3QiLCBuZXcgQ2xhc3NbXSB7UHJvamVjdC5jbGFzc30pOwotICAgICAgICAgICAgICAgIHNldHRlci5pbnZva2UociwgbmV3IE9iamVjdFtdIHtwcm9qZWN0fSk7CisgICAgICAgICAgICAgICAgc2V0dGVyID0gci5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0UHJvamVjdCIsIFByb2plY3QuY2xhc3MpOworICAgICAgICAgICAgICAgIHNldHRlci5pbnZva2UociwgcHJvamVjdCk7CiAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIC8vIG5vIHNldFByb2plY3QgdG8gaW52b2tlOyBqdXN0IGlnbm9yZQotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNTYsNiArMzUxLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVBdHRyaWJ1dGUgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKICAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7InBsYWluIiwgInhtbCIsICJicmllZiIsICJmYWlsdXJlIn07CiAgICAgICAgIH0KQEAgLTM4MCw3ICszNzYsNyBAQAogICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewogICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oRmlsZXMubmV3T3V0cHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYik7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9JZ25vcmVkVGVzdExpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9JZ25vcmVkVGVzdExpc3RlbmVyLmphdmEKaW5kZXggMmMzMTAzYS4uMjljMzQ1ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSWdub3JlZFRlc3RMaXN0ZW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0lnbm9yZWRUZXN0TGlzdGVuZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0lnbm9yZWRUZXN0UmVzdWx0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9JZ25vcmVkVGVzdFJlc3VsdC5qYXZhCmluZGV4IDE0OTcxNTEuLmM5MWI1MzQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0lnbm9yZWRUZXN0UmVzdWx0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSWdub3JlZFRlc3RSZXN1bHQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMzLDE1ICszMywxNSBAQAogcHVibGljIGNsYXNzIElnbm9yZWRUZXN0UmVzdWx0IGV4dGVuZHMgVGVzdFJlc3VsdCB7CiAKIAotICAgIHByaXZhdGUgTGlzdDxJZ25vcmVkVGVzdExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PElnbm9yZWRUZXN0TGlzdGVuZXI+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFRlc3RJZ25vcmVkPiBpZ25vcmVkID0gbmV3IEFycmF5TGlzdDxUZXN0SWdub3JlZD4oKTsKLSAgICBwcml2YXRlIExpc3Q8VGVzdElnbm9yZWQ+IHNraXBwZWQgPSBuZXcgQXJyYXlMaXN0PFRlc3RJZ25vcmVkPigpOworICAgIHByaXZhdGUgTGlzdDxJZ25vcmVkVGVzdExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8VGVzdElnbm9yZWQ+IGlnbm9yZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8VGVzdElnbm9yZWQ+IHNraXBwZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHB1YmxpYyBJZ25vcmVkVGVzdFJlc3VsdCgpIHsKICAgICAgICAgc3VwZXIoKTsKICAgICB9CiAKLQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSWdub3JlZFRlc3RMaXN0ZW5lcikgewogICAgICAgICAgICAgbGlzdGVuZXJzLmFkZCgoSWdub3JlZFRlc3RMaXN0ZW5lcikgbGlzdGVuZXIpOwpAQCAtNDksNiArNDksNyBAQAogICAgICAgICBzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCAgdm9pZCByZW1vdmVMaXN0ZW5lcihUZXN0TGlzdGVuZXIgbGlzdGVuZXIpIHsKICAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSWdub3JlZFRlc3RMaXN0ZW5lcikgewogICAgICAgICAgICAgbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdDRUZXN0TWV0aG9kQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIuamF2YQppbmRleCA2MDM0OTViLi5mZjY2ZGU2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdDRUZXN0TWV0aG9kQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0NFRlc3RNZXRob2RBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw4ICsxOCw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwpAQCAtNDEsNyArNDEsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIgaW1wbGVtZW50cyBUZXN0IHsKIAotICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgdGVzdENsYXNzOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gdGVzdENsYXNzOwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gbWV0aG9kTmFtZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uZXIgcnVubmVyOwogICAgIHByaXZhdGUgZmluYWwgQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSBjYWNoZTsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgKiAgICAgICAgICAgICBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyB7QGNvZGUgbnVsbH0KICAgICAgKiAgICAgICAgICAgICBvciBpZiBhbnkgb2YgdGhlIGdpdmVuIG1ldGhvZCBuYW1lcyBpcyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkKICAgICAgKi8KLSAgICBwdWJsaWMgSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIoZmluYWwgQ2xhc3MgdGVzdENsYXNzLAorICAgIHB1YmxpYyBKVW5pdDRUZXN0TWV0aG9kQWRhcHRlcihmaW5hbCBDbGFzczw/PiB0ZXN0Q2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1ldGhvZE5hbWVzKSB7CiAgICAgICAgIGlmICh0ZXN0Q2xhc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGVzdENsYXNzIGlzIDxudWxsPiIpOwpAQCAtNjcsNyArNjcsNyBAQAogICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzW2ldID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgbmFtZSAjIiArIGkgKyAiIGlzIDxudWxsPiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWVzW2ldLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtZXRob2ROYW1lc1tpXS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRob2QgbmFtZSAjIiArIGkgKyAiIGlzIGVtcHR5Iik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg3LDYgKzg3LDcgQEAKICAgICAgICAgcnVubmVyID0gcmVxdWVzdC5nZXRSdW5uZXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkgewogICAgICAgICByZXR1cm4gcnVubmVyLnRlc3RDb3VudCgpOwogICAgIH0KQEAgLTk1LDQxICs5NiwzMSBAQAogICAgICAgICByZXR1cm4gcnVubmVyLmdldERlc2NyaXB0aW9uKCk7CiAgICAgfQogCi0gICAgcHVibGljIExpc3QvKjxUZXN0PiovIGdldFRlc3RzKCkgeworICAgIHB1YmxpYyBMaXN0PFRlc3Q+IGdldFRlc3RzKCkgewogICAgICAgICByZXR1cm4gY2FjaGUuYXNUZXN0TGlzdChnZXREZXNjcmlwdGlvbigpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2xhc3MgZ2V0VGVzdENsYXNzKCkgeworICAgIHB1YmxpYyBDbGFzczw/PiBnZXRUZXN0Q2xhc3MoKSB7CiAgICAgICAgIHJldHVybiB0ZXN0Q2xhc3M7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIFRlc3RSZXN1bHQgcmVzdWx0KSB7CiAgICAgICAgIHJ1bm5lci5ydW4oY2FjaGUuZ2V0Tm90aWZpZXIocmVzdWx0KSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nIHRlc3RDbGFzc05hbWUgPSB0ZXN0Q2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKHRlc3RDbGFzc05hbWUubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIDEyICogbWV0aG9kTmFtZXMubGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJzonKTsKLSAgICAgICAgaWYgKG1ldGhvZE5hbWVzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKG1ldGhvZE5hbWVzWzBdKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbWV0aG9kTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCcsJykKLSAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1ldGhvZE5hbWVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAiOiIgKyBTdHJpbmcuam9pbigiLCIsIG1ldGhvZE5hbWVzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNdWx0aXBsZU1ldGhvZHNGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgewogCiAgICAgICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRpb24gbWV0aG9kc0xpc3REZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyB0ZXN0Q2xhc3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gdGVzdENsYXNzOwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG1ldGhvZE5hbWVzOwogCi0gICAgICAgIHByaXZhdGUgTXVsdGlwbGVNZXRob2RzRmlsdGVyKENsYXNzIHRlc3RDbGFzcywgU3RyaW5nW10gbWV0aG9kTmFtZXMpIHsKKyAgICAgICAgcHJpdmF0ZSBNdWx0aXBsZU1ldGhvZHNGaWx0ZXIoQ2xhc3M8Pz4gdGVzdENsYXNzLCBTdHJpbmdbXSBtZXRob2ROYW1lcykgewogICAgICAgICAgICAgaWYgKHRlc3RDbGFzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGVzdENsYXNzIGlzIDxudWxsPiIpOwogICAgICAgICAgICAgfQpAQCAtMTUxLDIzICsxNDIsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uaXNUZXN0KCkpIHsKLSAgICAgICAgICAgICAgICBJdGVyYXRvci8qPERlc2NyaXB0aW9uPiovIGl0ID0gbWV0aG9kc0xpc3REZXNjcmlwdGlvbi5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBtZXRob2REZXNjcmlwdGlvbiA9IChEZXNjcmlwdGlvbikgaXQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kRGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yLyo8RGVzY3JpcHRpb24+Ki8gaXQgPSBkZXNjcmlwdGlvbi5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiBlYWNoID0gKERlc2NyaXB0aW9uKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRSdW4oZWFjaCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RzTGlzdERlc2NyaXB0aW9uLmdldENoaWxkcmVuKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKFByZWRpY2F0ZS5pc0VxdWFsKGRlc2NyaXB0aW9uKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24uZ2V0Q2hpbGRyZW4oKS5zdHJlYW0oKS5hbnlNYXRjaCh0aGlzOjpzaG91bGRSdW4pOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xNzcsMTAgKzE1NSw3IEBACiAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiTm8gbWV0aG9kcyIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKG1ldGhvZE5hbWVzLmxlbmd0aCA9PSAxID8gIk1ldGhvZCAiIDogIk1ldGhvZHMgIik7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbWV0aG9kTmFtZSA6IG1ldGhvZE5hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQobWV0aG9kTmFtZSkuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJ1Zi5zZXRMZW5ndGgoYnVmLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChTdHJpbmcuam9pbigiLCIsIG1ldGhvZE5hbWVzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBidWYuYXBwZW5kKCcoJykuYXBwZW5kKHRlc3RDbGFzcy5nZXROYW1lKCkpLmFwcGVuZCgnKScpOwogICAgICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwpAQCAtMTg4LDUgKzE2Myw0IEBACiAKICAgICB9CiAKLQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKaW5kZXggMjExOWZjOS4uNjY1OTlmMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2suamF2YQppbmRleCAwYmRjNmUxLi42ZmQ3NzgwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTMwLDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTQ0LDYgKzQzLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC03MSw3ICs3Miw3IEBACiAgKgogICogPHA+SlVuaXQgaXMgYSBmcmFtZXdvcmsgdG8gY3JlYXRlIHVuaXQgdGVzdHMuIEl0IGhhcyBiZWVuIGluaXRpYWxseQogICogY3JlYXRlZCBieSBFcmljaCBHYW1tYSBhbmQgS2VudCBCZWNrLiAgSlVuaXQgY2FuIGJlIGZvdW5kIGF0IDxhCi0gKiBocmVmPSJodHRwOi8vd3d3Lmp1bml0Lm9yZyI+aHR0cDovL3d3dy5qdW5pdC5vcmc8L2E+LgorICogaHJlZj0iaHR0cHM6Ly93d3cuanVuaXQub3JnIj5odHRwczovL3d3dy5qdW5pdC5vcmc8L2E+LgogICoKICAqIDxwPjxjb2RlPkpVbml0VGFzazwvY29kZT4gY2FuIHJ1biBhIHNpbmdsZSBzcGVjaWZpYwogICogPGNvZGU+SlVuaXRUZXN0PC9jb2RlPiB1c2luZyB0aGUgPGNvZGU+dGVzdDwvY29kZT4gZWxlbWVudC48L3A+CkBAIC0xMDEsNyArMTAyLDcgQEAKICAqICAgJmx0O2p1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9InllcyIgZm9yaz0iJHtqdW5pdC5mb3JrfSImZ3Q7CiAgKiAgICAgJmx0O2p2bWFyZyB2YWx1ZT0iLWNsYXNzaWMiLyZndDsKICAqICAgICAmbHQ7Y2xhc3NwYXRoIHJlZmlkPSJ0ZXN0cy1jbGFzc3BhdGgiLyZndDsKLSAqICAgICAmbHQ7c3lzcHJvcGVydHkga2V5PSJidWlsZC50ZXN0cyIgdmFsdWU9IiR7YnVpbGQudGVzdHN9Ii8mZ3Q7CisgKiAgICAgJmx0O3N5c3Byb3BlcnR5IGtleT0iYnVpbGQudGVzdHMudmFsdWUiIHZhbHVlPSIke2J1aWxkLnRlc3RzLnZhbHVlfSIvJmd0OwogICogICAgICZsdDtmb3JtYXR0ZXIgdHlwZT0iYnJpZWYiIHVzZWZpbGU9ImZhbHNlIiAvJmd0OwogICogICAgICZsdDtiYXRjaHRlc3QmZ3Q7CiAgKiAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7dGVzdHMuZGlyfSImZ3Q7CkBAIC0xMzQsMTMgKzEzNSwyNyBAQAogICovCiBwdWJsaWMgY2xhc3MgSlVuaXRUYXNrIGV4dGVuZHMgVGFzayB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVAKLSAgICAgICAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTUEFUSCA9ICJDTEFTU1BBVEgiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUUklOR19CVUZGRVJfU0laRSA9IDEyODsKKyAgICAvKioKKyAgICAgKiBAc2luY2UgQW50IDEuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RMSVNURU5FUl9QUkVGSVggPQorICAgICAgICAianVuaXQuZnJhbWV3b3JrLlRlc3RMaXN0ZW5lcjogIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgbWFnaWMgcHJvcGVydHkgdGhhdCBlbmFibGVzIHRlc3QgbGlzdGVuZXIgZXZlbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9URVNUTElTVEVORVJfRVZFTlRTID0KKyAgICAgICAgImFudC5qdW5pdC5lbmFibGV0ZXN0bGlzdGVuZXJldmVudHMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisKICAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjb21tYW5kbGluZTsKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxKVW5pdFRlc3Q+IHRlc3RzID0gbmV3IFZlY3RvcjxKVW5pdFRlc3Q+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8QmF0Y2hUZXN0PiBiYXRjaFRlc3RzID0gbmV3IFZlY3RvcjxCYXRjaFRlc3Q+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8Rm9ybWF0dGVyRWxlbWVudD4gZm9ybWF0dGVycyA9IG5ldyBWZWN0b3I8Rm9ybWF0dGVyRWxlbWVudD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SlVuaXRUZXN0PiB0ZXN0cyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxCYXRjaFRlc3Q+IGJhdGNoVGVzdHMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxGb3JtYXR0ZXJFbGVtZW50PiBmb3JtYXR0ZXJzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgcHJpdmF0ZSBGaWxlIGRpciA9IG51bGw7CiAKICAgICBwcml2YXRlIEludGVnZXIgdGltZW91dCA9IG51bGw7CkBAIC0xODgsMjEgKzIwMyw2IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgIGZhaWx1cmVQcm9wZXJ0eTsKICAgICBwcml2YXRlIFN0cmluZyAgZXJyb3JQcm9wZXJ0eTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVFJJTkdfQlVGRkVSX1NJWkUgPSAxMjg7Ci0gICAgLyoqCi0gICAgICogQHNpbmNlIEFudCAxLjcKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUTElTVEVORVJfUFJFRklYID0KLSAgICAgICAgImp1bml0LmZyYW1ld29yay5UZXN0TGlzdGVuZXI6ICI7Ci0KLSAgICAvKioKLSAgICAgKiBOYW1lIG9mIG1hZ2ljIHByb3BlcnR5IHRoYXQgZW5hYmxlcyB0ZXN0IGxpc3RlbmVyIGV2ZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVfVEVTVExJU1RFTkVSX0VWRU5UUyA9Ci0gICAgICAgICJhbnQuanVuaXQuZW5hYmxldGVzdGxpc3RlbmVyZXZlbnRzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotCiAgICAgLyoqCiAgICAgICogSWYgdHJ1ZSwgZm9yY2UgYW50IHRvIHJlLWNsYXNzbG9hZCBhbGwgY2xhc3NlcyBmb3IgZWFjaCBKVW5pdCBUZXN0Q2FzZQogICAgICAqCkBAIC0yMTksOCArMjE5LDggQEAKICAgICAgKiA8cD5UaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQKICAgICAgKiBKVW5pdFRlc3QgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIKICAgICAgKiBvd24gcHJvcGVydGllcy48L3A+Ci0gICAgICogQHBhcmFtIHZhbHVlIDx0dD5mYWxzZTwvdHQ+IGlmIGl0IHNob3VsZCBub3QgZmlsdGVyLCBvdGhlcndpc2UKLSAgICAgKiA8dHQ+dHJ1ZTwvdHQ+CisgICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBzaG91bGQgbm90IGZpbHRlciwgb3RoZXJ3aXNlCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4KICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS41CiAgICAgICovCkBAIC0yMzMsOCArMjMzLDggQEAKICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdCAoYmF0Y2h0ZXN0KSBhbmQgSlVuaXRUZXN0CiAgICAgICogKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlIG92ZXJyaWRkZW4gYnkgdGhlaXIgb3duCiAgICAgICogcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gdmFsdWUgPHR0PnRydWU8L3R0PiBpZiBpdCBzaG91bGQgaGFsdCwgb3RoZXJ3aXNlCi0gICAgICogPHR0PmZhbHNlPC90dD4KKyAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgaXQgc2hvdWxkIGhhbHQsIG90aGVyd2lzZQorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjIKICAgICAgKi8KQEAgLTI2Myw4ICsyNjMsOCBAQAogICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYXBwbGllZCBvbiBhbGwgQmF0Y2hUZXN0IChiYXRjaHRlc3QpIGFuZAogICAgICAqIEpVbml0VGVzdCAodGVzdCkgaG93ZXZlciBpdCBjYW4gcG9zc2libHkgYmUgb3ZlcnJpZGRlbiBieSB0aGVpcgogICAgICAqIG93biBwcm9wZXJ0aWVzLgotICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IGlmIGl0IHNob3VsZCBoYWx0LCBvdGhlcndpc2UKLSAgICAgKiA8dHQ+ZmFsc2U8L3R0PgorICAgICAqIEBwYXJhbSB2YWx1ZSA8Y29kZT50cnVlPC9jb2RlPiBpZiBpdCBzaG91bGQgaGFsdCwgb3RoZXJ3aXNlCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuMgogICAgICAqLwpAQCAtMjk0LDggKzI5NCw4IEBACiAgICAgICogaGFuZ2luZyB0aGUgYnVpbGQuICB0aGlzIHByb3BlcnR5IGlzIGFwcGxpZWQgb24gYWxsIEJhdGNoVGVzdAogICAgICAqIChiYXRjaHRlc3QpIGFuZCBKVW5pdFRlc3QgKHRlc3QpIGhvd2V2ZXIgaXQgY2FuIHBvc3NpYmx5IGJlCiAgICAgICogb3ZlcnJpZGRlbiBieSB0aGVpciBvd24gcHJvcGVydGllcy48L3A+Ci0gICAgICogQHBhcmFtIHZhbHVlIDx0dD50cnVlPC90dD4gaWYgYSBKVk0gc2hvdWxkIGJlIGZvcmtlZCwgb3RoZXJ3aXNlCi0gICAgICogPHR0PmZhbHNlPC90dD4KKyAgICAgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBKVk0gc2hvdWxkIGJlIGZvcmtlZCwgb3RoZXJ3aXNlCisgICAgICogPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICogQHNlZSAjc2V0VGltZW91dAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjIKQEAgLTM1MCw5ICszNTAsOSBAQAogICAgICAqCiAgICAgICogQ2FuIHRha2UgdGhlIHZhbHVlcyBvbiwgb2ZmLCBhbmQgd2l0aE91dEFuZEVyci4KICAgICAgKgotICAgICAqIEBwYXJhbSB2YWx1ZSA8dHQ+dHJ1ZTwvdHQ+IHRvIHByaW50IGEgc3VtbWFyeSwKLSAgICAgKiA8dHQ+d2l0aE91dEFuZEVycjwvdHQ+IHRvIGluY2x1ZGUgdGhlIHRlc3QncyBvdXRwdXQgYXMKLSAgICAgKiB3ZWxsLCA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByaW50IGEgc3VtbWFyeSwKKyAgICAgKiA8Y29kZT53aXRoT3V0QW5kRXJyPC9jb2RlPiB0byBpbmNsdWRlIHRoZSB0ZXN0J3Mgb3V0cHV0IGFzCisgICAgICogd2VsbCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KICAgICAgKiBAc2VlIFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcgogICAgICAqIEBzaW5jZSBBbnQgMS4yCiAgICAgICovCkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIG1heGltdW0gbWVtb3J5IHRvIGJlIHVzZWQgYnkgYWxsIGZvcmtlZCBKVk1zLgogICAgICAqCi0gICAgICogQHBhcmFtICAgbWF4ICAgICB0aGUgdmFsdWUgYXMgZGVmaW5lZCBieSA8dHQ+LW14PC90dD4gb3IgPHR0Pi1YbXg8L3R0PgorICAgICAqIEBwYXJhbSAgIG1heCAgICAgdGhlIHZhbHVlIGFzIGRlZmluZWQgYnkgPGNvZGU+LW14PC9jb2RlPiBvciA8Y29kZT4tWG14PC9jb2RlPgogICAgICAqICAgICAgICAgICAgICAgICAgaW4gdGhlIGphdmEgY29tbWFuZCBsaW5lIG9wdGlvbnMuCiAgICAgICogQHNpbmNlIEFudCAxLjIKICAgICAgKi8KQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAqIGRlZmF1bHQgaXMgJ2phdmEnLiBUaGUgY29tbWFuZCBpcyByZXNvbHZlZCBieQogICAgICAqIGphdmEubGFuZy5SdW50aW1lLmV4ZWMoKS4gSWdub3JlZCBpZiBmb3JrIGlzIGRpc2FibGVkLgogICAgICAqCi0gICAgICogQHBhcmFtICAgdmFsdWUgICB0aGUgbmV3IFZNIHRvIHVzZSBpbnN0ZWFkIG9mIDx0dD5qYXZhPC90dD4KKyAgICAgKiBAcGFyYW0gICB2YWx1ZSAgIHRoZSBuZXcgVk0gdG8gdXNlIGluc3RlYWQgb2YgPGNvZGU+amF2YTwvY29kZT4KICAgICAgKiBAc2VlICNzZXRGb3JrKGJvb2xlYW4pCiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuMgpAQCAtNTg5LDcgKzU4OSw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjIKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRUZXN0KGZpbmFsIEpVbml0VGVzdCB0ZXN0KSB7Ci0gICAgICAgIHRlc3RzLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIHRlc3RzLmFkZCh0ZXN0KTsKICAgICAgICAgcHJlQ29uZmlndXJlKHRlc3QpOwogICAgIH0KIApAQCAtNjAyLDcgKzYwMiw3IEBACiAgICAgICovCiAgICAgcHVibGljIEJhdGNoVGVzdCBjcmVhdGVCYXRjaFRlc3QoKSB7CiAgICAgICAgIGZpbmFsIEJhdGNoVGVzdCB0ZXN0ID0gbmV3IEJhdGNoVGVzdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBiYXRjaFRlc3RzLmFkZEVsZW1lbnQodGVzdCk7CisgICAgICAgIGJhdGNoVGVzdHMuYWRkKHRlc3QpOwogICAgICAgICBwcmVDb25maWd1cmUodGVzdCk7CiAgICAgICAgIHJldHVybiB0ZXN0OwogICAgIH0KQEAgLTYxNCw3ICs2MTQsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS4yCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRm9ybWF0dGVyKGZpbmFsIEZvcm1hdHRlckVsZW1lbnQgZmUpIHsKLSAgICAgICAgZm9ybWF0dGVycy5hZGRFbGVtZW50KGZlKTsKKyAgICAgICAgZm9ybWF0dGVycy5hZGQoZmUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzIyLDExICs3MjIsOSBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGVtcGRpcihmaW5hbCBGaWxlIHRtcERpcikgewotICAgICAgICBpZiAodG1wRGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghdG1wRGlyLmV4aXN0cygpIHx8ICF0bXBEaXIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbih0bXBEaXIudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgdGVtcCBkaXJlY3RvcnkiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHRtcERpciAhPSBudWxsICYmICghdG1wRGlyLmV4aXN0cygpIHx8ICF0bXBEaXIuaXNEaXJlY3RvcnkoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgaXMgbm90IGEgdmFsaWQgdGVtcCBkaXJlY3RvcnkiLAorICAgICAgICAgICAgICAgIHRtcERpcik7CiAgICAgICAgIH0KICAgICAgICAgdGhpcy50bXBEaXIgPSB0bXBEaXI7CiAgICAgfQpAQCAtNzg3LDEyICs3ODUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgZSwgdGFzay5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoSlVuaXRUYXNrTWlycm9yLmNsYXNzLmdldE5hbWUoKSArICJJbXBsIik7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgSlVuaXRUYXNrTWlycm9yPiBjID0gbG9hZGVyLmxvYWRDbGFzcyhKVW5pdFRhc2tNaXJyb3IuY2xhc3MuZ2V0TmFtZSgpICsgIkltcGwiKS5hc1N1YmNsYXNzKEpVbml0VGFza01pcnJvci5jbGFzcyk7CiAgICAgICAgICAgICBpZiAoYy5nZXRDbGFzc0xvYWRlcigpICE9IGxvYWRlcikgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT3ZlcmRlbGVnYXRpbmcgbG9hZGVyIiwgdGFzay5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yIGNvbnMgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHtKVW5pdFRhc2suY2xhc3N9KTsKLSAgICAgICAgICAgIHJldHVybiAoSlVuaXRUYXNrTWlycm9yKSBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7dGFza30pOworICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8PyBleHRlbmRzIEpVbml0VGFza01pcnJvcj4gY29ucyA9IGMuZ2V0Q29uc3RydWN0b3IoSlVuaXRUYXNrLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBjb25zLm5ld0luc3RhbmNlKHRhc2spOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIHRhc2suZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KQEAgLTgxOCwxOCArODE2LDE2IEBACiAgICAgICAgICAgICBpZiAoZXh0cmEgIT0gbnVsbCAmJiAhaGFzSnVuaXQocGF0aCkpIHsKICAgICAgICAgICAgICAgICBwYXRoLmFkZChleHBhbmRNb2R1bGVQYXRoKGV4dHJhKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaXJyb3JMb2FkZXIgPSAoQ2xhc3NMb2FkZXIpIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNwbGl0Q2xhc3NMb2FkZXIobXlMb2FkZXIsIHBhdGgsIGdldFByb2plY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyIiwgIkpVbml0NFRlc3RNZXRob2RBZGFwdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKVW5pdFJlc3VsdEZvcm1hdHRlciIsICJKVW5pdFRhc2tNaXJyb3JJbXBsIiwgIkpVbml0VGVzdFJ1bm5lciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlVuaXRWZXJzaW9uSGVscGVyIiwgIk91dEVyclN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlciIsICJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlYXJEb3duT25WbUNyYXNoIiwgIlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIiwgIklnbm9yZWRUZXN0TGlzdGVuZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklnbm9yZWRUZXN0UmVzdWx0IiwgIkN1c3RvbUpVbml0NFRlc3RBZGFwdGVyQ2FjaGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RMaXN0ZW5lcldyYXBwZXIifSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtaXJyb3JMb2FkZXIgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAoUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4pICgpIC0+IG5ldyBTcGxpdENsYXNzTG9hZGVyKAorICAgICAgICAgICAgICAgICAgICBteUxvYWRlciwgcGF0aCwgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyIiwgIkpVbml0NFRlc3RNZXRob2RBZGFwdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlVuaXRSZXN1bHRGb3JtYXR0ZXIiLCAiSlVuaXRUYXNrTWlycm9ySW1wbCIsICJKVW5pdFRlc3RSdW5uZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKVW5pdFZlcnNpb25IZWxwZXIiLCAiT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlciIsICJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZWFyRG93bk9uVm1DcmFzaCIsICJYTUxKVW5pdFJlc3VsdEZvcm1hdHRlciIsICJJZ25vcmVkVGVzdExpc3RlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JlZFRlc3RSZXN1bHQiLCAiQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RMaXN0ZW5lcldyYXBwZXIifSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWlycm9yTG9hZGVyID0gbXlMb2FkZXI7CiAgICAgICAgIH0KQEAgLTg0OCwyMyArODQ0LDIwIEBACiAgICAgICAgIGNoZWNrTW9kdWxlcygpOwogICAgICAgICBzZXR1cEpVbml0RGVsZWdhdGUoKTsKIAotICAgICAgICBmaW5hbCBMaXN0PExpc3Q+IHRlc3RMaXN0cyA9IG5ldyBBcnJheUxpc3Q8TGlzdD4oKTsKKyAgICAgICAgZmluYWwgTGlzdDxMaXN0PEpVbml0VGVzdD4+IHRlc3RMaXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAvKiBwYXJhbGxlbCB0ZXN0IGV4ZWN1dGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbXVsdGktcHJvY2VzcyBleGVjdXRpb24gKi8KICAgICAgICAgZmluYWwgaW50IHRocmVhZHMgPSAhZm9yayB8fCBmb3JrTW9kZS5nZXRWYWx1ZSgpLmVxdWFscyhGb3JrTW9kZS5PTkNFKSA/IDEgOiB0aGlzLnRocmVhZHM7CiAKLSAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JrUGVyVGVzdCA9IGZvcmtNb2RlLmdldFZhbHVlKCkuZXF1YWxzKEZvcmtNb2RlLlBFUl9URVNUKTsKLSAgICAgICAgaWYgKGZvcmtQZXJUZXN0IHx8IGZvcmtNb2RlLmdldFZhbHVlKCkuZXF1YWxzKEZvcmtNb2RlLk9OQ0UpKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9ya1BlclRlc3QgPSBGb3JrTW9kZS5QRVJfVEVTVC5lcXVhbHMoZm9ya01vZGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIGlmIChmb3JrUGVyVGVzdCB8fCBGb3JrTW9kZS5PTkNFLmVxdWFscyhmb3JrTW9kZS5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgdGVzdExpc3RzLmFkZEFsbChleGVjdXRlT3JRdWV1ZShnZXRJbmRpdmlkdWFsVGVzdHMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya1BlclRlc3QpKTsKICAgICAgICAgfSBlbHNlIHsgLyogZm9ya01vZGUuZ2V0VmFsdWUoKS5lcXVhbHMoRm9ya01vZGUuUEVSX0JBVENIKSAqLwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYmF0Y2hUZXN0cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBCYXRjaFRlc3QgYmF0Y2h0ZXN0ID0gYmF0Y2hUZXN0cy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICAgICAgdGVzdExpc3RzLmFkZEFsbChleGVjdXRlT3JRdWV1ZShiYXRjaHRlc3QuZWxlbWVudHMoKSwgZmFsc2UpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRlc3RMaXN0cy5hZGRBbGwoZXhlY3V0ZU9yUXVldWUodGVzdHMuZWxlbWVudHMoKSwgZm9ya1BlclRlc3QpKTsKKyAgICAgICAgICAgIGJhdGNoVGVzdHMuc3RyZWFtKCkubWFwKGIgLT4gZXhlY3V0ZU9yUXVldWUoYi5lbGVtZW50cygpLCBmYWxzZSkpCisgICAgICAgICAgICAgICAgLmZvckVhY2godGVzdExpc3RzOjphZGRBbGwpOworICAgICAgICAgICAgdGVzdExpc3RzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBleGVjdXRlT3JRdWV1ZShDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbih0ZXN0cyksIGZvcmtQZXJUZXN0KSk7CiAgICAgICAgIH0KLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgLyogcHJpb3IgdG8gcGFyYWxsZWwgdGhlIGNvZGUgaW4gJ29uZUp1bml0VGhyZWFkJyB1c2VkIHRvIGJlIGhlcmUuICovCiAgICAgICAgICAgICBydW5UZXN0c0luVGhyZWFkcyh0ZXN0TGlzdHMsIHRocmVhZHMpOwpAQCAtODg5LDEyICs4ODIsMTMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIEp1bml0VGVzdFRocmVhZCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKIAotICAgICAgICBKdW5pdFRlc3RUaHJlYWQoZmluYWwgSlVuaXRUYXNrIG1hc3RlciwgZmluYWwgSXRlcmF0b3I8TGlzdD4gaXRlcmF0b3IsIGZpbmFsIGludCBpZCkgeworICAgICAgICBKdW5pdFRlc3RUaHJlYWQoZmluYWwgSlVuaXRUYXNrIG1hc3RlciwgZmluYWwgSXRlcmF0b3I8TGlzdDxKVW5pdFRlc3Q+PiBpdGVyYXRvciwgZmluYWwgaW50IGlkKSB7CiAgICAgICAgICAgICB0aGlzLm1hc3RlclRhc2sgPSBtYXN0ZXI7CiAgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CiAgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtYXN0ZXJUYXNrLm9uZUp1bml0VGhyZWFkKGl0ZXJhdG9yLCBpZCk7CkBAIC05MDUsNyArODk5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgZmluYWwgSlVuaXRUYXNrIG1hc3RlclRhc2s7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8TGlzdD4gaXRlcmF0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8TGlzdDxKVW5pdFRlc3Q+PiBpdGVyYXRvcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7CiAgICAgfQogCkBAIC05MTYsOCArOTEwLDggQEAKICAgICAgKiB0aHJlYWRzIGdldCB0aGUgc2FtZSB0ZXN0LCBvciB0d28gdGhyZWFkcyBzaW11bHRhbmVvdXNseSBwb3AgdGhlIGxpc3Qgc28gdGhhdCBhIHRlc3QKICAgICAgKiBnZXRzIHNraXBwZWQhCiAgICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGdldE5leHRUZXN0KGZpbmFsIEl0ZXJhdG9yPExpc3Q+IGl0ZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKGl0ZXIpIHsKKyAgICBwcml2YXRlIExpc3Q8SlVuaXRUZXN0PiBnZXROZXh0VGVzdChmaW5hbCBJdGVyYXRvcjxMaXN0PEpVbml0VGVzdD4+IGl0ZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChpdGVyKSB7CiAgICAgICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7CiAgICAgICAgICAgICB9CkBAIC05MzYsMTQgKzkzMCwxNCBAQAogICAgICAqIGZhdGFsIHJlYXNvbiwgbm8gbmV3IHRlc3RzL2JhdGNoZXMgd2lsbCBiZSBzdGFydGVkIGJ1dCB0aGUgcnVubmluZyB0aHJlYWRzIHdpbGwgYmUKICAgICAgKiBwZXJtaXR0ZWQgdG8gY29tcGxldGUuICBBZGRpdGlvbmFsIHRlc3RzIG1heSBzdGFydCBpbiBhbHJlYWR5LXJ1bm5pbmcgYmF0Y2gtdGVzdCB0aHJlYWRzLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBvbmVKdW5pdFRocmVhZChmaW5hbCBJdGVyYXRvcjxMaXN0PiBpdGVyLCBmaW5hbCBpbnQgdGhyZWFkSWQpIHsKKyAgICBwcml2YXRlIHZvaWQgb25lSnVuaXRUaHJlYWQoZmluYWwgSXRlcmF0b3I8TGlzdDxKVW5pdFRlc3Q+PiBpdGVyLCBmaW5hbCBpbnQgdGhyZWFkSWQpIHsKIAotICAgICAgICBMaXN0IGw7CisgICAgICAgIExpc3Q8SlVuaXRUZXN0PiBsOwogICAgICAgICBsb2coIlN0YXJ0aW5nIHRlc3QgdGhyZWFkICIgKyB0aHJlYWRJZCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIHdoaWxlICgoY2F1Z2h0QnVpbGRFeGNlcHRpb24gPT0gbnVsbCkgJiYgKChsID0gZ2V0TmV4dFRlc3QoaXRlcikpICE9IG51bGwpKSB7CiAgICAgICAgICAgICBsb2coIlJ1bm5pbmcgdGVzdCAiICsgbC5nZXQoMCkudG9TdHJpbmcoKSArICIoIiArIGwuc2l6ZSgpICsgIikgaW4gdGhyZWFkICIgKyB0aHJlYWRJZCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICBpZiAobC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgIGV4ZWN1dGUoKEpVbml0VGVzdCkgbC5nZXQoMCksIHRocmVhZElkKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlKGwuZ2V0KDApLCB0aHJlYWRJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGV4ZWN1dGUobCwgdGhyZWFkSWQpOwogICAgICAgICAgICAgfQpAQCAtOTUyLDkgKzk0Niw5IEBACiAgICAgfQogCiAKLSAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHNJblRocmVhZHMoZmluYWwgTGlzdDxMaXN0PiB0ZXN0TGlzdCwgZmluYWwgaW50IG51bVRocmVhZHMpIHsKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdHNJblRocmVhZHMoZmluYWwgTGlzdDxMaXN0PEpVbml0VGVzdD4+IHRlc3RMaXN0LCBmaW5hbCBpbnQgbnVtVGhyZWFkcykgewogCi0gICAgICAgIEl0ZXJhdG9yPExpc3Q+IGl0ZXIgPSB0ZXN0TGlzdC5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxMaXN0PEpVbml0VGVzdD4+IGl0ZXIgPSB0ZXN0TGlzdC5pdGVyYXRvcigpOwogCiAgICAgICAgIGlmIChudW1UaHJlYWRzID09IDEpIHsKICAgICAgICAgICAgIC8qIHdpdGgganVzdCBvbmUgdGhyZWFkIGp1c3QgcnVuIHRoZSB0ZXN0IC0gZG9uJ3QgY3JlYXRlIGFueSB0aHJlYWRzICovCkBAIC05NjcsNyArOTYxLDcgQEAKICAgICAgICAgICAgIC8qIE5lZWQgdG8gc3BsaXQgYXBhcnQgdGVzdHMsIHdoaWNoIGFyZSBzdGlsbCBncm91cGVkIGluIGJhdGNoZXMgKi8KICAgICAgICAgICAgIC8qIGlzIHRoZXJlIGEgc2ltcGxlciBKYXZhIG1lY2hhbmlzbSB0byBkbyB0aGlzPyAqLwogICAgICAgICAgICAgLyogSSBhc3N1bWUgd2UgZG9uJ3Qgd2FudCB0byBkbyB0aGlzIHdpdGggInBlciBiYXRjaCIgZm9ya2luZy4gKi8KLSAgICAgICAgICAgIExpc3Q8TGlzdD4gbmV3bGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdD4oKTsKKyAgICAgICAgICAgIExpc3Q8TGlzdDxKVW5pdFRlc3Q+PiBuZXdsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICBpZiAoZm9ya01vZGUuZ2V0VmFsdWUoKS5lcXVhbHMoRm9ya01vZGUuUEVSX1RFU1QpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChMaXN0PEpVbml0VGVzdD4gbGlzdCA6IHRlc3RMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0LnNpemUoKSA9PSAxKSB7CkBAIC05NzksNyArOTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIG5ld2xpc3QgPSB0ZXN0TGlzdDsKKyAgICAgICAgICAgICAgICBuZXdsaXN0ID0gdGVzdExpc3Q7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVyID0gbmV3bGlzdC5pdGVyYXRvcigpOwogCkBAIC05OTUsNyArOTg5LDcgQEAKIAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRzW2ldLmpvaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZHNbaV0uam9pbigpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25PY2N1cnJlZCA9IHRydWU7CkBAIC0xMDM2LDEzICsxMDMwLDEzIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBleGVjdXRlIHRoZSB0ZXN0IGFuZCBnZXQgdGhlIHJldHVybiBjb2RlCi0gICAgICAgIFRlc3RSZXN1bHRIb2xkZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKCF0ZXN0LmdldEZvcmsoKSkgewotICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZUluVk0odGVzdCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIFRlc3RSZXN1bHRIb2xkZXIgcmVzdWx0OworICAgICAgICBpZiAodGVzdC5nZXRGb3JrKCkpIHsKICAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZyA9IGNyZWF0ZVdhdGNoZG9nKCk7CiAgICAgICAgICAgICByZXN1bHQgPSBleGVjdXRlQXNGb3JrZWQodGVzdCwgd2F0Y2hkb2csIG51bGwpOwogICAgICAgICAgICAgLy8gbnVsbCB3YXRjaGRvZyBtZWFucyBubyB0aW1lb3V0LCB5b3UnZCBiZXR0ZXIgbm90IGNoZWNrIHdpdGggbnVsbAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZUluVk0odGVzdCk7CiAgICAgICAgIH0KICAgICAgICAgYWN0T25UZXN0UmVzdWx0KHJlc3VsdCwgdGVzdCwgIlRlc3QgIiArIHRlc3QuZ2V0TmFtZSgpKTsKICAgICB9CkBAIC0xMDY0LDggKzEwNTgsOCBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgPGNvZGU+dGVzdE5hbWU8L2NvZGU+IGlzIG5vdCBhIHZhbGlkIHRlc3QgbmFtZQogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVRlc3ROYW1lKGZpbmFsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHRlc3ROYW1lID09IG51bGwgfHwgdGVzdE5hbWUubGVuZ3RoKCkgPT0gMAotICAgICAgICAgICAgfHwgdGVzdE5hbWUuZXF1YWxzKCJudWxsIikpIHsKKyAgICAgICAgaWYgKHRlc3ROYW1lID09IG51bGwgfHwgdGVzdE5hbWUuaXNFbXB0eSgpCisgICAgICAgICAgICB8fCAibnVsbCIuZXF1YWxzKHRlc3ROYW1lKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0ZXN0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNzYsMjMgKzEwNzAsMjEgQEAKICAgICAgKiBAcGFyYW0gdGhyZWFkIElkZW50aWZpZXMgd2hpY2ggdGhyZWFkIGlzIHRlc3QgcnVubmluZyBpbiAoMCBmb3Igc2luZ2xlLXRocmVhZGVkIHJ1bnMpCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIExpc3QgdGVzdExpc3QsIGZpbmFsIGludCB0aHJlYWQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gbnVsbDsKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIExpc3Q8SlVuaXRUZXN0PiB0ZXN0TGlzdCwgZmluYWwgaW50IHRocmVhZCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gcGFzcyB0aGUgdGVzdCBjYXNlcyB0byBydW4gdG8KICAgICAgICAgLy8gdGhlIHJ1bm5lciAob25lIHRlc3QgY2FzZSBwZXIgbGluZSkKICAgICAgICAgZmluYWwgRmlsZSBjYXNlc0ZpbGUgPSBjcmVhdGVUZW1wUHJvcGVydGllc0ZpbGUoImp1bml0dGVzdGNhc2VzIik7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoY2FzZXNGaWxlKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRXcml0ZXIgd3JpdGVyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihjYXNlc0ZpbGUpKSkgewogCiAgICAgICAgICAgICBsb2coIkNyZWF0aW5nIGNhc2VzZmlsZSAnIiArIGNhc2VzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKQogICAgICAgICAgICAgICAgICsgIicgd2l0aCBjb250ZW50OiAiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIGxvZ1dyaXRlciA9CiAgICAgICAgICAgICAgICAgbmV3IFByaW50U3RyZWFtKG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfVkVSQk9TRSkpOwogCi0gICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBpdGVyID0gdGVzdExpc3QuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIHRlc3QgPSAoSlVuaXRUZXN0KSBpdGVyLm5leHQoKTsKKyAgICAgICAgICAgIEpVbml0VGVzdCB0ZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoSlVuaXRUZXN0IHQgOiB0ZXN0TGlzdCkgeworICAgICAgICAgICAgICAgIHRlc3QgPSB0OwogICAgICAgICAgICAgICAgIHRlc3Quc2V0VGhyZWFkKHRocmVhZCk7CiAgICAgICAgICAgICAgICAgcHJpbnREdWFsKHdyaXRlciwgbG9nV3JpdGVyLCB0ZXN0LmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgaWYgKHRlc3QuZ2V0TWV0aG9kcygpICE9IG51bGwpIHsKQEAgLTExMTMsOCArMTEwNSw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgd3JpdGVyLmZsdXNoKCk7Ci0gICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIHdyaXRlciA9IG51bGw7CiAKICAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIHRlc3QgYW5kIGdldCB0aGUgcmV0dXJuIGNvZGUKICAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGVXYXRjaGRvZyB3YXRjaGRvZyA9IGNyZWF0ZVdhdGNoZG9nKCk7CkBAIC0xMTI1LDggKzExMTUsNiBAQAogICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh3cml0ZXIpOwotCiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMudHJ5SGFyZFRvRGVsZXRlKGNhc2VzRmlsZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewpAQCAtMTE0MCw3ICsxMTI4LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdExpc3QgdGhlIGxpc3Qgb2YgdGVzdHMgdG8gZXhlY3V0ZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgTGlzdCB0ZXN0TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIExpc3Q8SlVuaXRUZXN0PiB0ZXN0TGlzdCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZXhlY3V0ZSh0ZXN0TGlzdCwgMCk7CiAgICAgfQogCkBAIC0xMTUxLDkgKzExMzksOSBAQAogICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIHJldHVybmVkIGhvbGRlciBvYmplY3QuCiAgICAgICogQHBhcmFtICB0ZXN0ICAgICAgIHRoZSB0ZXN0Y2FzZSB0byBleGVjdXRlLgogICAgICAqIEBwYXJhbSAgd2F0Y2hkb2cgICB0aGUgd2F0Y2hkb2cgaW4gY2hhcmdlIG9mIGNhbmNlbGxpbmcgdGhlIHRlc3QgaWYgaXQKLSAgICAgKiBleGNlZWRzIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4gQ2FuIGJlIDx0dD5udWxsPC90dD4sIGluIHRoaXMgY2FzZQorICAgICAqIGV4Y2VlZHMgYSBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sIGluIHRoaXMgY2FzZQogICAgICAqIHRoZSB0ZXN0IGNvdWxkIHByb2JhYmx5IGhhbmcgZm9yZXZlci4KLSAgICAgKiBAcGFyYW0gY2FzZXNGaWxlIGxpc3Qgb2YgdGVzdCBjYXNlcyB0byBleGVjdXRlLiBDYW4gYmUgPHR0Pm51bGw8L3R0PiwKKyAgICAgKiBAcGFyYW0gY2FzZXNGaWxlIGxpc3Qgb2YgdGVzdCBjYXNlcyB0byBleGVjdXRlLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4sCiAgICAgICogaW4gdGhpcyBjYXNlIG9ubHkgb25lIHRlc3QgaXMgZXhlY3V0ZWQuCiAgICAgICogQHJldHVybiB0aGUgdGVzdCByZXN1bHRzIGZyb20gdGhlIEpWTSBpdHNlbGYuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yIGNyZWF0aW5nIGEgdGVtcG9yYXJ5IHByb3BlcnR5IGZpbGUsCkBAIC0xMTcxLDcgKzExNTksNyBAQAogCiAgICAgICAgIENvbW1hbmRsaW5lSmF2YSBjbWQ7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjbWQgPSAoQ29tbWFuZGxpbmVKYXZhKSAoZ2V0Q29tbWFuZGxpbmUoKS5jbG9uZSgpKTsKKyAgICAgICAgICAgIGNtZCA9IChDb21tYW5kbGluZUphdmEpIGdldENvbW1hbmRsaW5lKCkuY2xvbmUoKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGlzIHNob3VsZG4ndCBoYXBwZW4iLCBlLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpAQCAtMTIwNyw3ICsxMTk1LDcgQEAKICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ29uc3RhbnRzLkxPR1RFU1RMSVNURU5FUkVWRU5UUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFN0cmluZy52YWx1ZU9mKGdldEVuYWJsZVRlc3RMaXN0ZW5lckV2ZW50cygpKSk7CiAKLSAgICAgICAgU3RyaW5nQnVmZmVyIGZvcm1hdHRlckFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoU1RSSU5HX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBmb3JtYXR0ZXJBcmcgPSBuZXcgU3RyaW5nQnVpbGRlcihTVFJJTkdfQlVGRkVSX1NJWkUpOwogICAgICAgICBmaW5hbCBGb3JtYXR0ZXJFbGVtZW50W10gZmVBcnJheSA9IG1lcmdlRm9ybWF0dGVycyh0ZXN0KTsKICAgICAgICAgZm9yIChmaW5hbCBGb3JtYXR0ZXJFbGVtZW50IGZlIDogZmVBcnJheSkgewogICAgICAgICAgICAgaWYgKGZlLnNob3VsZFVzZSh0aGlzKSkgewpAQCAtMTIxOSw3ICsxMjA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyQXJnLmFwcGVuZChvdXRGaWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoZm9ybWF0dGVyQXJnLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGZvcm1hdHRlckFyZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXJBcmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEyMjksMTcgKzEyMTcsMTQgQEAKICAgICAgICAgZmluYWwgRmlsZSBwcm9wc0ZpbGUgPSBjcmVhdGVUZW1wUHJvcGVydGllc0ZpbGUoImp1bml0Iik7CiAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKENvbnN0YW50cy5QUk9QU0ZJTEUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9wc0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICBmaW5hbCBIYXNodGFibGUgcCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4gcCA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBmb3IgKGZpbmFsIEVudW1lcmF0aW9uIGUgPSBwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBwLmdldChrZXkpKTsKLSAgICAgICAgfQorICAgICAgICBwLmZvckVhY2gocHJvcHM6OnB1dCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHByb3BzRmlsZSk7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0c3RyZWFtID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHByb3BzRmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICBwcm9wcy5zdG9yZShvdXRzdHJlYW0sICJBbnQgSlVuaXRUYXNrIGdlbmVyYXRlZCBwcm9wZXJ0aWVzIGZpbGUiKTsKICAgICAgICAgICAgIG91dHN0cmVhbS5jbG9zZSgpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgRklMRV9VVElMUy50cnlIYXJkVG9EZWxldGUocHJvcHNGaWxlKTsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3IgY3JlYXRpbmcgdGVtcG9yYXJ5IHByb3BlcnRpZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImZpbGUuIiwgZSwgZ2V0TG9jYXRpb24oKSk7CkBAIC0xMzIxLDkgKzEzMDYsOSBAQAogICAgICAgICAgICAgICAgICAgICArIHByb3BzRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICInLiI7CiAgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7IC8vTk9TT05BUgotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvbid0IGhpZGUgaW5uZXIgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRvbid0IGhpZGUgaW5uZXIgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMzM2LDggKzEzMjEsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVBbnRSdW50aW1lKGZpbmFsIENvbW1hbmRsaW5lSmF2YSBjbWQpIHsKICAgICAgICAgaWYgKGluY2x1ZGVBbnRSdW50aW1lKSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXAvKjxTdHJpbmcsIFN0cmluZz4qLyBlbnYgPSBFeGVjdXRlLmdldEVudmlyb25tZW50VmFyaWFibGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY3AgPSAoU3RyaW5nKSBlbnYuZ2V0KENMQVNTUEFUSCk7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IEV4ZWN1dGUuZ2V0RW52aXJvbm1lbnRWYXJpYWJsZXMoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjcCA9IGVudi5nZXQoQ0xBU1NQQVRIKTsKICAgICAgICAgICAgIGlmIChjcCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLmNyZWF0ZVBhdGgoKQogICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ldyBQYXRoKGdldFByb2plY3QoKSwgY3ApKTsKQEAgLTEzNDksNyArMTMzNCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGNoZWNrIGZvciB0aGUgcGFyYW1ldGVyIGJlaW5nICJ3aXRob3V0YW5kZXJyIiBpbiBhIGxvY2FsZS1pbmRlcGVuZGVudCB3YXkuCiAgICAgICogQHBhcmFtIHN1bW1hcnlPcHRpb24gdGhlIHN1bW1hcnkgb3B0aW9uIC1jYW4gYmUgbnVsbApAQCAtMTM4NSwyNiArMTM2OSwyMSBAQAogICAgICAgICBpZiAoIWNtZC5oYXZlQ2xhc3NwYXRoKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbG9hZGVyID0KLSAgICAgICAgICAgICAgICBBbnRDbGFzc0xvYWRlci5uZXdBbnRDbGFzc0xvYWRlcihudWxsLCBnZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgdHJ5IChBbnRDbGFzc0xvYWRlciBsb2FkZXIgPQorICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIubmV3QW50Q2xhc3NMb2FkZXIobnVsbCwgZ2V0UHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmNyZWF0ZUNsYXNzcGF0aChnZXRQcm9qZWN0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CiAgICAgICAgICAgICBsb2FkZXIuc2V0SXNvbGF0ZWQodHJ1ZSk7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvamVjdFJlc291cmNlTmFtZSA9CiAgICAgICAgICAgICAgICAgTG9hZGVyVXRpbHMuY2xhc3NOYW1lVG9SZXNvdXJjZShQcm9qZWN0LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgICAgICBVUkwgcHJldmlvdXMgPSBudWxsOwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIEVudW1lcmF0aW9uIGUgPSBsb2FkZXIuZ2V0UmVzb3VyY2VzKHByb2plY3RSZXNvdXJjZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJMIGN1cnJlbnQgPSAoVVJMKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBVUkwgY3VycmVudCA6IENvbGxlY3Rpb25zLmxpc3QobG9hZGVyLmdldFJlc291cmNlcyhwcm9qZWN0UmVzb3VyY2VOYW1lKSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG51bGwgJiYgIXVybEVxdWFscyhjdXJyZW50LCBwcmV2aW91cykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiV0FSTklORzogbXVsdGlwbGUgdmVyc2lvbnMgb2YgYW50IGRldGVjdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJpbiBwYXRoIGZvciBqdW5pdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBMSU5FX1NFUCArICIgICAgICAgICAiICsgcHJldmlvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExJTkVfU0VQICsgIiAgICAgYW5kICIgKyBjdXJyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhbnQgZGV0ZWN0ZWQgaW4gcGF0aCBmb3IganVuaXQlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgICAgICAgICAlcyVuICAgICBhbmQgJXMiLCBwcmV2aW91cywgY3VycmVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKQEAgLTE0MTIsMTAgKzEzOTEsNiBAQAogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4Y2VwdGlvbgogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbG9hZGVyLmNsZWFudXAoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ1MiwxMCArMTQyNyw4IEBACiAgICAgICogQHJldHVybiBjcmVhdGVkIGZpbGUKICAgICAgKi8KICAgICBwcml2YXRlIEZpbGUgY3JlYXRlVGVtcFByb3BlcnRpZXNGaWxlKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgZmluYWwgRmlsZSBwcm9wc0ZpbGUgPQotICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShnZXRQcm9qZWN0KCksIHByZWZpeCwgIi5wcm9wZXJ0aWVzIiwKLSAgICAgICAgICAgICAgICB0bXBEaXIgIT0gbnVsbCA/IHRtcERpciA6IGdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHRydWUsIHRydWUpOwotICAgICAgICByZXR1cm4gcHJvcHNGaWxlOworICAgICAgICByZXR1cm4gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShnZXRQcm9qZWN0KCksIHByZWZpeCwgIi5wcm9wZXJ0aWVzIiwKKyAgICAgICAgICAgIHRtcERpciAhPSBudWxsID8gdG1wRGlyIDogZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgfQogCiAKQEAgLTE1MDEsOSArMTQ3NCw4IEBACiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChydW5uZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHJ1bm5lci5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5oYW5kbGVJbnB1dChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuaGFuZGxlSW5wdXQoYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgfQogCiAKQEAgLTE2NTcsNyArMTYyOSw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHJldHVybiA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIGEgdGltZW91dCB2YWx1ZSwgb3RoZXJ3aXNlIHRoZQorICAgICAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgYSB0aW1lb3V0IHZhbHVlLCBvdGhlcndpc2UgdGhlCiAgICAgICogd2F0Y2hkb2cgaW5zdGFuY2UuCiAgICAgICoKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHVuZGVyIHVuc3BlY2lmaWVkIGNpcmN1bXN0YW5jZXMKQEAgLTE2NjcsNyArMTYzOSw3IEBACiAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRXhlY3V0ZVdhdGNoZG9nKChsb25nKSB0aW1lb3V0LmludFZhbHVlKCkpOworICAgICAgICByZXR1cm4gbmV3IEV4ZWN1dGVXYXRjaGRvZygobG9uZykgdGltZW91dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgyLDIwICsxNjU0LDE1IEBACiAKICAgICAvKioKICAgICAgKiBNZXJnZSBhbGwgaW5kaXZpZHVhbCB0ZXN0cyBmcm9tIHRoZSBiYXRjaHRlc3Qgd2l0aCBhbGwgaW5kaXZpZHVhbCB0ZXN0cwotICAgICAqIGFuZCByZXR1cm4gYW4gZW51bWVyYXRpb24gb3ZlciBhbGwgPHR0PkpVbml0VGVzdDwvdHQ+LgorICAgICAqIGFuZCByZXR1cm4gYW4gZW51bWVyYXRpb24gb3ZlciBhbGwgPGNvZGU+SlVuaXRUZXN0PC9jb2RlPi4KICAgICAgKgogICAgICAqIEByZXR1cm4gZW51bWVyYXRpb24gb3ZlciBpbmRpdmlkdWFsIHRlc3RzCiAgICAgICogQHNpbmNlIEFudCAxLjMKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb248SlVuaXRUZXN0PiBnZXRJbmRpdmlkdWFsVGVzdHMoKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGJhdGNoVGVzdHMuc2l6ZSgpOwotICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbltdIGVudW1zID0gbmV3IEVudW1lcmF0aW9uWyBjb3VudCArIDFdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIEJhdGNoVGVzdCBiYXRjaHRlc3QgPSBiYXRjaFRlc3RzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGVudW1zW2ldID0gYmF0Y2h0ZXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZW51bXNbZW51bXMubGVuZ3RoIC0gMV0gPSB0ZXN0cy5lbGVtZW50cygpOwotICAgICAgICByZXR1cm4gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihTdHJlYW0uY29uY2F0KGJhdGNoVGVzdHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmxhdE1hcChiIC0+IENvbGxlY3Rpb25zLmxpc3QoYi5lbGVtZW50cygpKS5zdHJlYW0oKSksIHRlc3RzLnN0cmVhbSgpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MTEsMTQgKzE2NzgsOCBAQAogICAgICAgICBpZiAodGVzdHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxKVW5pdFRlc3Q+IHRlc3RzRW51bSA9IHRlc3RzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlICh0ZXN0c0VudW0uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGZpbmFsIEpVbml0VGVzdCB0ZXN0ID0gdGVzdHNFbnVtLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAodGVzdC5oYXNNZXRob2RzU3BlY2lmaWVkKCkgJiYgdGVzdC5zaG91bGRSdW4oZ2V0UHJvamVjdCgpKSkgewotICAgICAgICAgICAgICAgIHRlc3QucmVzb2x2ZU1ldGhvZHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB0ZXN0cy5zdHJlYW0oKS5maWx0ZXIodGVzdCAtPiB0ZXN0Lmhhc01ldGhvZHNTcGVjaWZpZWQoKSAmJiB0ZXN0LnNob3VsZFJ1bihnZXRQcm9qZWN0KCkpKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKEpVbml0VGVzdDo6cmVzb2x2ZU1ldGhvZHMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTcyNiwxNyArMTY4NywxMiBAQAogICAgICAqIEBzaW5jZSAxLjkuOAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBjaGVja01vZHVsZXMoKSB7Ci0gICAgICAgIGlmIChoYXNQYXRoKGdldENvbW1hbmRsaW5lKCkuZ2V0TW9kdWxlcGF0aCgpKSB8fAotICAgICAgICAgICAgaGFzUGF0aChnZXRDb21tYW5kbGluZSgpLmdldFVwZ3JhZGVtb2R1bGVwYXRoKCkpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgY291bnQgPSBiYXRjaFRlc3RzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZighYmF0Y2hUZXN0cy5lbGVtZW50QXQoaSkuZ2V0Rm9yaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIG1vZHVsZSBwYXRoIHJlcXVpcmVzIGZvcmsgYXR0cmlidXRlIHRvIGJlIHNldCB0byB0cnVlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBjb3VudCA9IHRlc3RzLnNpemUoKTsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIXRlc3RzLmVsZW1lbnRBdChpKS5nZXRGb3JrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgbW9kdWxlIHBhdGggcmVxdWlyZXMgZm9yayBhdHRyaWJ1dGUgdG8gYmUgc2V0IHRvIHRydWUuIik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoaGFzUGF0aChnZXRDb21tYW5kbGluZSgpLmdldE1vZHVsZXBhdGgoKSkKKyAgICAgICAgICAgICAgICB8fCBoYXNQYXRoKGdldENvbW1hbmRsaW5lKCkuZ2V0VXBncmFkZW1vZHVsZXBhdGgoKSkpIHsKKyAgICAgICAgICAgIGlmICghYmF0Y2hUZXN0cy5zdHJlYW0oKS5hbGxNYXRjaChCYXNlVGVzdDo6Z2V0Rm9yaykKKyAgICAgICAgICAgICAgICAgICAgfHwgIXRlc3RzLnN0cmVhbSgpLmFsbE1hdGNoKEJhc2VUZXN0OjpnZXRGb3JrKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBtb2R1bGUgcGF0aCByZXF1aXJlcyBmb3JrIGF0dHJpYnV0ZSB0byBiZSBzZXQgdG8gdHJ1ZS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE3NDgsMjMgKzE3MDQsMTcgQEAKICAgICAgKiBAc2luY2UgMS45LjgKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaGFzSnVuaXQoZmluYWwgUGF0aCBwYXRoKSB7Ci0gICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2FkZXIgPSBBbnRDbGFzc0xvYWRlci5uZXdBbnRDbGFzc0xvYWRlcigKKyAgICAgICAgdHJ5IChBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBBbnRDbGFzc0xvYWRlci5uZXdBbnRDbGFzc0xvYWRlcigKICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgIGdldFByb2plY3QoKSwKICAgICAgICAgICAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgICAgIHRydWUpKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoImp1bml0LmZyYW1ld29yay5UZXN0Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAobG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsb2FkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTc3OSwxMSArMTcyOSw4IEBACiAgICAgICAgIGZvciAoU3RyaW5nIHBhdGggOiBtb2R1bGVQYXRoLmxpc3QoKSkgewogICAgICAgICAgICAgZmluYWwgRmlsZSBtb2R1bGVQYXRoRW50cnkgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUocGF0aCk7CiAgICAgICAgICAgICBpZiAobW9kdWxlUGF0aEVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgIWhhc01vZHVsZUluZm8obW9kdWxlUGF0aEVudHJ5KSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVbXSBtb2R1bGVzID0gbW9kdWxlUGF0aEVudHJ5Lmxpc3RGaWxlcyhuZXcgRmlsZW5hbWVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpLmVuZHNXaXRoKCIuamFyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVbXSBtb2R1bGVzID0gbW9kdWxlUGF0aEVudHJ5Lmxpc3RGaWxlcygoZGlyLAorICAgICAgICAgICAgICAgICAgICBuYW1lKSAtPiBuYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lbmRzV2l0aCgiLmphciIpKTsKICAgICAgICAgICAgICAgICBpZiAobW9kdWxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoRmlsZSBtb2R1bGUgOiBtb2R1bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRlZC5hZGQobmV3IFBhdGgoZ2V0UHJvamVjdCgpLCBTdHJpbmcuZm9ybWF0KApAQCAtMTgwNSw5ICsxNzUyLDkgQEAKICAgICAgKiBAcmV0dXJuIGVudW1lcmF0aW9uCiAgICAgICogQHNpbmNlIEFudCAxLjMKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRW51bWVyYXRpb248SlVuaXRUZXN0PiBhbGxUZXN0cygpIHsKLSAgICAgICAgZmluYWwgRW51bWVyYXRpb25bXSBlbnVtcyA9IHt0ZXN0cy5lbGVtZW50cygpLCBiYXRjaFRlc3RzLmVsZW1lbnRzKCl9OwotICAgICAgICByZXR1cm4gRW51bWVyYXRpb25zLmZyb21Db21wb3VuZChlbnVtcyk7CisgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uPEJhc2VUZXN0PiBhbGxUZXN0cygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKFN0cmVhbS5jb25jYXQodGVzdHMuc3RyZWFtKCksIGJhdGNoVGVzdHMuc3RyZWFtKCkpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgxNiw2ICsxNzYzLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuMwogICAgICAqLwogICAgIHByaXZhdGUgRm9ybWF0dGVyRWxlbWVudFtdIG1lcmdlRm9ybWF0dGVycyhmaW5hbCBKVW5pdFRlc3QgdGVzdCkgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgZmluYWwgVmVjdG9yPEZvcm1hdHRlckVsZW1lbnQ+IGZlVmVjdG9yID0gKFZlY3RvcjxGb3JtYXR0ZXJFbGVtZW50PikgZm9ybWF0dGVycy5jbG9uZSgpOwogICAgICAgICB0ZXN0LmFkZEZvcm1hdHRlcnNUbyhmZVZlY3Rvcik7CiAgICAgICAgIGZpbmFsIEZvcm1hdHRlckVsZW1lbnRbXSBmZUFycmF5ID0gbmV3IEZvcm1hdHRlckVsZW1lbnRbZmVWZWN0b3Iuc2l6ZSgpXTsKQEAgLTE5NjAsNyArMTkwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIG91dEZpbGUgPSBnZXRPdXRwdXQoZmUsIHRlc3QpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dEZpbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ob3V0RmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMjAyLDI1ICsyMTUwLDIxIEBACiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGFza3MgdG8gYmUgZXhlY3V0ZWQuCiAgICAgICogQHNpbmNlIDEuNi4yCiAgICAgICovCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb248TGlzdD4gZXhlY3V0ZU9yUXVldWUoZmluYWwgRW51bWVyYXRpb248SlVuaXRUZXN0PiB0ZXN0TGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJ1bkluZGl2aWR1YWwpIHsKLSAgICAgICAgZmluYWwgTWFwPEZvcmtlZFRlc3RDb25maWd1cmF0aW9uLCBMaXN0PiB0ZXN0Q29uZmlndXJhdGlvbnMgPSBuZXcgSGFzaE1hcDxGb3JrZWRUZXN0Q29uZmlndXJhdGlvbiwgTGlzdD4oKTsKLSAgICAgICAgd2hpbGUgKHRlc3RMaXN0Lmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBmaW5hbCBKVW5pdFRlc3QgdGVzdCA9IHRlc3RMaXN0Lm5leHRFbGVtZW50KCk7CisgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248TGlzdDxKVW5pdFRlc3Q+PiBleGVjdXRlT3JRdWV1ZSgKKyAgICAgICAgZmluYWwgRW51bWVyYXRpb248SlVuaXRUZXN0PiB0ZXN0TGlzdCwgZmluYWwgYm9vbGVhbiBydW5JbmRpdmlkdWFsKSB7CisgICAgICAgIGZpbmFsIE1hcDxGb3JrZWRUZXN0Q29uZmlndXJhdGlvbiwgTGlzdDxKVW5pdFRlc3Q+PiB0ZXN0Q29uZmlndXJhdGlvbnMgPQorICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKGZpbmFsIEpVbml0VGVzdCB0ZXN0IDogQ29sbGVjdGlvbnMubGlzdCh0ZXN0TGlzdCkpIHsKICAgICAgICAgICAgIGlmICh0ZXN0LnNob3VsZFJ1bihnZXRQcm9qZWN0KCkpKSB7CiAgICAgICAgICAgICAgICAgLyogd2l0aCBtdWx0aS10aHJlYWRlZCBydW5zIG5lZWQgdG8gZGVmZXIgZXhlY3V0aW9uIG9mIGV2ZW4gKi8KICAgICAgICAgICAgICAgICAvKiBpbmRpdmlkdWFsIHRlc3RzIHNvIHRoZSB0aHJlYWRzIGNhbiBwaWNrIHRlc3RzIG9mZiB0aGUgcXVldWUuICovCi0gICAgICAgICAgICAgICAgaWYgKChydW5JbmRpdmlkdWFsIHx8ICF0ZXN0LmdldEZvcmsoKSkgJiYgKHRocmVhZHMgPT0gMSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJ1bkluZGl2aWR1YWwgfHwgIXRlc3QuZ2V0Rm9yaygpKSAmJiB0aHJlYWRzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSh0ZXN0LCAwKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGb3JrZWRUZXN0Q29uZmlndXJhdGlvbiBjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JrZWRUZXN0Q29uZmlndXJhdGlvbih0ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxKVW5pdFRlc3Q+IGwgPSB0ZXN0Q29uZmlndXJhdGlvbnMuZ2V0KGMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdDxKVW5pdFRlc3Q+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q29uZmlndXJhdGlvbnMucHV0KGMsIGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGwuYWRkKHRlc3QpOworICAgICAgICAgICAgICAgICAgICB0ZXN0Q29uZmlndXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wdXRlSWZBYnNlbnQobmV3IEZvcmtlZFRlc3RDb25maWd1cmF0aW9uKHRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHRlc3QpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQwMiw3ICsyMzQ2LDcgQEAKIAogICAgIC8qKgogICAgICAqIENoZWNrcyBpZiBhIGdpdmVuIGZvbGRlciBpcyBhbiB1bnBhY2tlZCBtb2R1bGUuCi0gICAgICogQHBhcmFtIHJvb3QgdGhlIGZvZGxlciB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIHJvb3QgdGhlIGZvbGRlciB0byBiZSBjaGVja2VkCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByb290IGlzIGFuIHVucGFja2VkIG1vZHVsZQogICAgICAqIEBzaW5jZSAxLjkuOAogICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrTWlycm9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2tNaXJyb3IuamF2YQppbmRleCBiOTVlN2RjLi4xNWJlZDYxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2tNaXJyb3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2tNaXJyb3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvckltcGwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza01pcnJvckltcGwuamF2YQppbmRleCBjN2RhZTI1Li45ZTgwMjQxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2tNaXJyb3JJbXBsLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrTWlycm9ySW1wbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzUsNiArMzUsNyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgSlVuaXRUYXNrTWlycm9ySW1wbCBpbXBsZW1lbnRzIEpVbml0VGFza01pcnJvciB7CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGZpbmFsIEpVbml0VGFzayB0YXNrOwogCiAgICAgLyoqCkBAIC00Niw2ICs0Nyw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkVm1FeGl0KEpVbml0VGVzdCB0ZXN0LCBKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgYUZvcm1hdHRlciwKICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgdGVzdENhc2UpIHsKICAgICAgICAgSlVuaXRSZXN1bHRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKEpVbml0UmVzdWx0Rm9ybWF0dGVyKSBhRm9ybWF0dGVyOwpAQCAtNjEsNiArNjMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBKVW5pdFRhc2tNaXJyb3IuSlVuaXRUZXN0UnVubmVyTWlycm9yIG5ld0pVbml0VGVzdFJ1bm5lcihKVW5pdFRlc3QgdGVzdCwKICAgICAgICAgICAgIFN0cmluZ1tdIG1ldGhvZHMsCiAgICAgICAgICAgICBib29sZWFuIGhhbHRPbkVycm9yLCBib29sZWFuIGZpbHRlclRyYWNlLCBib29sZWFuIGhhbHRPbkZhaWx1cmUsCkBAIC03MCw2ICs3Myw3IEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEpVbml0VGFza01pcnJvci5TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgbmV3U3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgewogICAgICAgICByZXR1cm4gbmV3IFN1bW1hcnlKVW5pdFJlc3VsdEZvcm1hdHRlcigpOwogICAgIH0KQEAgLTg2LDE0ICs5MCwxNyBAQAogICAgICAgICAgICAgdGVzdENhc2UgPSBhVGVzdENhc2U7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBjb3VudFRlc3RDYXNlcygpIHsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHIpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcihtZXNzYWdlKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdGVzdENhc2U7CiAgICAgICAgIH0KQEAgLTEwMiw2ICsxMDksNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRlc3QuZ2V0TmFtZSgpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gdGVzdC5nZXROYW1lKCkgKyAiOiIgKyB0ZXN0Q2FzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YQppbmRleCBlYjk2OWQ1Li5kMzIxYmRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CkBAIC0xMzAsNyArMTI5LDcgQEAKICAgICAgICAgdGhpcy5oYWx0T25GYWlsID0gaGFsdE9uRmFpbHVyZTsKICAgICAgICAgdGhpcy5maWx0ZXJ0cmFjZSA9IGZpbHRlcnRyYWNlOwogICAgICAgICB0aGlzLm1ldGhvZHNTcGVjaWZpZWQgPSBtZXRob2RzICE9IG51bGw7Ci0gICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHNTcGVjaWZpZWQgPyAoU3RyaW5nW10pIG1ldGhvZHMuY2xvbmUoKSA6IG51bGw7CisgICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHNTcGVjaWZpZWQgPyBtZXRob2RzLmNsb25lKCkgOiBudWxsOwogICAgICAgICB0aGlzLmFudFRocmVhZElEID0gdGhyZWFkOwogICAgIH0KIApAQCAtMjIyLDE5ICsyMjEsOCBAQAogICAgICAqIEBzaW5jZSAxLjguMgogICAgICAqLwogICAgIFN0cmluZyBnZXRNZXRob2RzU3RyaW5nKCkgewotICAgICAgICBpZiAoKG1ldGhvZHNMaXN0ID09IG51bGwpICYmIG1ldGhvZHNTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgIGlmIChtZXRob2RzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbWV0aG9kc0xpc3QgPSAiIjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kcy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgICAgIG1ldGhvZHNMaXN0ID0gbWV0aG9kc1swXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIobWV0aG9kcy5sZW5ndGggKiAxNik7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChtZXRob2RzWzBdKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgnLCcpLmFwcGVuZChtZXRob2RzW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWV0aG9kc0xpc3QgPSBidWYudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGhvZHNMaXN0ID09IG51bGwgJiYgbWV0aG9kc1NwZWNpZmllZCkgeworICAgICAgICAgICAgbWV0aG9kc0xpc3QgPSBTdHJpbmcuam9pbigiLCIsIG1ldGhvZHMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtZXRob2RzTGlzdDsKICAgICB9CkBAIC0yNDcsNyArMjM1LDcgQEAKICAgICAgKiBAc2luY2UgMS44LjIKICAgICAgKi8KICAgICB2b2lkIHJlc29sdmVNZXRob2RzKCkgewotICAgICAgICBpZiAoKG1ldGhvZHMgPT0gbnVsbCkgJiYgbWV0aG9kc1NwZWNpZmllZCkgeworICAgICAgICBpZiAobWV0aG9kcyA9PSBudWxsICYmIG1ldGhvZHNTcGVjaWZpZWQpIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgbWV0aG9kcyA9IHBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdChtZXRob2RzTGlzdCk7CiAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKQEAgLTQ4MiwxMiArNDcwLDkgQEAKICAgICAgKiBAcGFyYW0gcCB0aGUgcHJvcGVydGllcy4KICAgICAgKiAgICAgICAgICBUaGlzIGlzIGEgY29weSBvZiB0aGUgcHJvamVjdHMgYW50IHByb3BlcnRpZXMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydGllcyhIYXNodGFibGUgcCkgeworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoSGFzaHRhYmxlPD8sID8+IHApIHsKICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBwLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCBwLmdldChrZXkpKTsKLSAgICAgICAgfQorICAgICAgICBwLmZvckVhY2gocHJvcHM6OnB1dCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MTYsNyArNTAxLDcgQEAKICAgICAvKioKICAgICAgKiBDb252ZW5pZW50IG1ldGhvZCB0byBhZGQgZm9ybWF0dGVycyB0byBhIHZlY3RvcgogICAgICAqLwotICAgIHZvaWQgYWRkRm9ybWF0dGVyc1RvKFZlY3RvciB2KSB7CisgICAgdm9pZCBhZGRGb3JtYXR0ZXJzVG8oVmVjdG9yPD8gc3VwZXIgRm9ybWF0dGVyRWxlbWVudD4gdikgewogICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBmb3JtYXR0ZXJzLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICB2LmFkZEVsZW1lbnQoZm9ybWF0dGVycy5lbGVtZW50QXQoaSkpOwpAQCAtNTI3LDEyICs1MTIsMTMgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGlzIHRlc3QuCiAgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEpVbml0VGVzdCB0ID0gKEpVbml0VGVzdCkgc3VwZXIuY2xvbmUoKTsKICAgICAgICAgICAgIHQucHJvcHMgPSBwcm9wcyA9PSBudWxsID8gbnVsbCA6IChQcm9wZXJ0aWVzKSBwcm9wcy5jbG9uZSgpOwotICAgICAgICAgICAgdC5mb3JtYXR0ZXJzID0gKFZlY3RvcikgZm9ybWF0dGVycy5jbG9uZSgpOworICAgICAgICAgICAgdC5mb3JtYXR0ZXJzID0gKFZlY3RvcjxGb3JtYXR0ZXJFbGVtZW50PikgZm9ybWF0dGVycy5jbG9uZSgpOwogICAgICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIHBsYWluIGltcG9zc2libGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEKaW5kZXggN2EwYTJmNi4uNDM3MGJkYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiwxOCArMjIsMjAgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CkBAIC03MiwzNCArNzQsNiBAQAogICovCiAKIHB1YmxpYyBjbGFzcyBKVW5pdFRlc3RSdW5uZXIgaW1wbGVtZW50cyBUZXN0TGlzdGVuZXIsIEpVbml0VGFza01pcnJvci5KVW5pdFRlc3RSdW5uZXJNaXJyb3IgewotCi0gICAgLyoqCi0gICAgICogSG9sZHMgdGhlIHJlZ2lzdGVyZWQgZm9ybWF0dGVycy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3I+IGZvcm1hdHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsZWN0cyBUZXN0UmVzdWx0cy4KLSAgICAgKi8KLSAgICBwcml2YXRlIElnbm9yZWRUZXN0UmVzdWx0IHJlczsKLQotICAgIC8qKgotICAgICAqIERvIHdlIGZpbHRlciBqdW5pdC4qLiogc3RhY2sgZnJhbWVzIG91dCBvZiBmYWlsdXJlIGFuZCBlcnJvciBleGNlcHRpb25zLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmlsdGVydHJhY2UgPSB0cnVlOwotCi0gICAgLyoqCi0gICAgICogRG8gd2Ugc2VuZCBvdXRwdXQgdG8gU3lzdGVtLm91dC8uZXJyIGluIGFkZGl0aW9uIHRvIHRoZSBmb3JtYXR0ZXJzPwotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG93T3V0cHV0ID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gb3V0cHV0VG9Gb3JtYXR0ZXJzID0gdHJ1ZTsKLQotICAgIC8qKgotICAgICAqIFRoZSBwZXJtaXNzaW9ucyBzZXQgZm9yIHRoZSB0ZXN0IHRvIHJ1bi4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBlcm1pc3Npb25zIHBlcm0gPSBudWxsOwotCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpVTklUXzRfVEVTVF9BREFQVEVSID0gImp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlciI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1RSQUNFX0ZJTFRFUlMgPSBuZXcgU3RyaW5nW10geyJqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UiLApAQCAtMTE3LDYgKzkxLDQxIEBACiAgICAgICAgICAgICAianVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyIiwKICAgICAgICAgICAgICIgbW9yZSJ9OwogCisgICAgLyoqCisgICAgICogRG8gd2UgZmlsdGVyIGp1bml0LiouKiBzdGFjayBmcmFtZXMgb3V0IG9mIGZhaWx1cmUgYW5kIGVycm9yIGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBmaWx0ZXJ0cmFjZSA9IHRydWU7CisKKyAgICAvKiogUnVubmluZyBtb3JlIHRoYW4gb25lIHRlc3Qgc3VpdGU/ICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtdWx0aXBsZVRlc3RzID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1aWxkIGNyYXNoZWQuCisgICAgICogRmlsZSB3aWxsIGJlIGVtcHR5IGluIGNhc2UgdGhlIGJ1aWxkIGRpZCBub3QgY3Jhc2guCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyYXNoRmlsZSA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyB0aGUgcmVnaXN0ZXJlZCBmb3JtYXR0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEpVbml0VGFza01pcnJvci5KVW5pdFJlc3VsdEZvcm1hdHRlck1pcnJvcj4gZm9ybWF0dGVycyA9IG5ldyBWZWN0b3I8PigpOworCisgICAgLyoqCisgICAgICogQ29sbGVjdHMgVGVzdFJlc3VsdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBJZ25vcmVkVGVzdFJlc3VsdCByZXM7CisKKyAgICAvKioKKyAgICAgKiBEbyB3ZSBzZW5kIG91dHB1dCB0byBTeXN0ZW0ub3V0Ly5lcnIgaW4gYWRkaXRpb24gdG8gdGhlIGZvcm1hdHRlcnM/CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3dPdXRwdXQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRUb0Zvcm1hdHRlcnMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVGhlIHBlcm1pc3Npb25zIHNldCBmb3IgdGhlIHRlc3QgdG8gcnVuLgorICAgICAqLworICAgIHByaXZhdGUgUGVybWlzc2lvbnMgcGVybSA9IG51bGw7CiAKICAgICAvKioKICAgICAgKiBEbyB3ZSBzdG9wIG9uIGVycm9ycy4KQEAgLTE0Nyw5ICsxNTYsNiBAQAogICAgIC8qKiBpcyB0aGlzIHJ1bm5lciBydW5uaW5nIGluIGZvcmtlZCBtb2RlPyAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBmb3JrZWQgPSBmYWxzZTsKIAotICAgIC8qKiBSdW5uaW5nIG1vcmUgdGhhbiBvbmUgdGVzdCBzdWl0ZT8gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG11bHRpcGxlVGVzdHMgPSBmYWxzZTsKLQogICAgIC8qKiBDbGFzc0xvYWRlciBwYXNzZWQgaW4gaW4gbm9uLWZvcmtlZCBtb2RlLiAqLwogICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyOwogCkBAIC0xNTksMTIgKzE2NSw2IEBACiAgICAgLyoqIFR1cm5lZCBvbiBpZiB3ZSBhcmUgdXNpbmcgSlVuaXQgNCBmb3IgdGhpcyB0ZXN0IHN1aXRlLiBzZWUgIzM4ODExICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGp1bml0NDsKIAotICAgIC8qKgotICAgICAqIFRoZSBmaWxlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYnVpbGQgY3Jhc2hlZC4KLSAgICAgKiBGaWxlIHdpbGwgYmUgZW1wdHkgaW4gY2FzZSB0aGUgYnVpbGQgZGlkIG5vdCBjcmFzaC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3Jhc2hGaWxlID0gbnVsbDsKLQogICAgIC8qKiBOYW1lcyBvZiB0ZXN0IG1ldGhvZHMgdG8gZXhlY3V0ZSAqLwogICAgIHByaXZhdGUgU3RyaW5nW10gbWV0aG9kcyA9IG51bGw7CiAKQEAgLTMwNiw3ICszMDYsNyBAQAogICAgICAgICB0aGlzLmhhbHRPbkZhaWx1cmUgPSBoYWx0T25GYWlsdXJlOwogICAgICAgICB0aGlzLnNob3dPdXRwdXQgPSBzaG93T3V0cHV0OwogICAgICAgICB0aGlzLmxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyA9IGxvZ1Rlc3RMaXN0ZW5lckV2ZW50czsKLSAgICAgICAgdGhpcy5tZXRob2RzID0gbWV0aG9kcyAhPSBudWxsID8gKFN0cmluZ1tdKSBtZXRob2RzLmNsb25lKCkgOiBudWxsOworICAgICAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzICE9IG51bGwgPyBtZXRob2RzLmNsb25lKCkgOiBudWxsOwogICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjsKICAgICB9CiAKQEAgLTM2MSw2ICszNjEsNyBAQAogICAgIC8qKgogICAgICAqIFJ1biB0aGUgdGVzdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIHJlcyA9IG5ldyBJZ25vcmVkVGVzdFJlc3VsdCgpOwogICAgICAgICByZXMuYWRkTGlzdGVuZXIod3JhcExpc3RlbmVyKHRoaXMpKTsKQEAgLTM4MCw3ICszODEsNyBAQAogICAgICAgICB0cnkgewogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIHRlc3RDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdGVzdENsYXNzOwogICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKGp1bml0VGVzdC5nZXROYW1lKCksIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7CkBAIC0zOTUsMjQgKzM5NiwyNCBAQAogICAgICAgICAgICAgICAgIC8vIEpVbml0IDQKICAgICAgICAgICAgICAgICBNZXRob2Qgc3VpdGVNZXRob2QgPSBudWxsOwogICAgICAgICAgICAgICAgIGlmICghdGVzdE1ldGhvZHNTcGVjaWZpZWQpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHN1aXRlIG1ldGhvZAotICAgICAgICAgICAgICAgICAgICBzdWl0ZU1ldGhvZCA9IHRlc3RDbGFzcy5nZXRNZXRob2QoInN1aXRlIiwgbmV3IENsYXNzWzBdKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBubyBhcHByb3ByaWF0ZSBzdWl0ZSBtZXRob2QgZm91bmQuIFdlIGRvbid0IHJlcG9ydCBhbnkKLSAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IgaGVyZSBzaW5jZSBpdCBtaWdodCBiZSBwZXJmZWN0bHkgbm9ybWFsLgotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgc3VpdGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZU1ldGhvZCA9IHRlc3RDbGFzcy5nZXRNZXRob2QoInN1aXRlIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBhcHByb3ByaWF0ZSBzdWl0ZSBtZXRob2QgZm91bmQuIFdlIGRvbid0IHJlcG9ydCBhbnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yIGhlcmUgc2luY2UgaXQgbWlnaHQgYmUgcGVyZmVjdGx5IG5vcm1hbC4KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdWl0ZU1ldGhvZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc3VpdGUgbWV0aG9kIGF2YWlsYWJsZSwgdGhlbiB0cnkKICAgICAgICAgICAgICAgICAgICAgLy8gdG8gZXh0cmFjdCB0aGUgc3VpdGUgZnJvbSBpdC4gSWYgdGhlcmUgaXMgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgLy8gaGVyZSBpdCB3aWxsIGJlIGNhdWdodCBiZWxvdyBhbmQgcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgIHN1aXRlID0gKFRlc3QpIHN1aXRlTWV0aG9kLmludm9rZShudWxsLCBuZXcgT2JqZWN0WzBdKTsKKyAgICAgICAgICAgICAgICAgICAgc3VpdGUgPSAoVGVzdCkgc3VpdGVNZXRob2QuaW52b2tlKG51bGwpOwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIENsYXNzIGp1bml0NFRlc3RBZGFwdGVyQ2FjaGVDbGFzcyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGp1bml0NFRlc3RBZGFwdGVyQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBqdW5pdDRUZXN0QWRhcHRlckNhY2hlQ2xhc3MgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZVNpbmdsZU1ldGhvZEFkYXB0ZXIgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoanVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdENsYXNzKSkgewpAQCAtNDM4LDUwICs0MzksNDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gSW4gdGhhdCBjYXNlIGZpcnN0IEMuZk4gd2lsbCBmYWlsIHdpdGggQ05GRSBhbmQgd2UKICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBhdm9pZCBVbnN1cHBvcnRlZENsYXNzVmVyc2lvbkVycm9yLgogCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNhY2hlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5DdXN0b21KVW5pdDRUZXN0QWRhcHRlckNhY2hlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9hZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShKVU5JVF80X1RFU1RfQURBUFRFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RNZXRob2RzU3BlY2lmaWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIGNhbm5vdCB0cnkgdG8gbG9hZCB0aGUgSlVuaXQ0VGVzdEFkYXB0ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVmb3JlIHRyeWluZyB0byBsb2FkIEpVbml0NFRlc3RNZXRob2RBZGFwdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlY2F1c2UgaXQgbWlnaHQgZmFpbCB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5vQ2xhc3NEZWZGb3VuZEV4Y2VwdGlvbiwgaW5zdGVhZCBvZiBwbGFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlU2luZ2xlTWV0aG9kQWRhcHRlciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNhY2hlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuQ3VzdG9tSlVuaXQ0VGVzdEFkYXB0ZXJDYWNoZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShKVU5JVF80X1RFU1RfQURBUFRFUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0TWV0aG9kc1NwZWNpZmllZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFdlIGNhbm5vdCB0cnkgdG8gbG9hZCB0aGUgSlVuaXQ0VGVzdEFkYXB0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlZm9yZSB0cnlpbmcgdG8gbG9hZCBKVW5pdDRUZXN0TWV0aG9kQWRhcHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSBpdCBtaWdodCBmYWlsIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5vQ2xhc3NEZWZGb3VuZEV4Y2VwdGlvbiwgaW5zdGVhZCBvZiBwbGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcyA9IENsYXNzLmZvck5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0NFRlc3RNZXRob2RBZGFwdGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VTaW5nbGVNZXRob2RBZGFwdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bml0NFRlc3RBZGFwdGVyQ2xhc3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShKVU5JVF80X1RFU1RfQURBUFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3RNZXRob2RzU3BlY2lmaWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LkpVbml0NFRlc3RNZXRob2RBZGFwdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNpbmdsZU1ldGhvZEFkYXB0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShKVU5JVF80X1RFU1RfQURBUFRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBsb2FkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0TWV0aG9kc1NwZWNpZmllZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5pdDRUZXN0QWRhcHRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQuSlVuaXQ0VGVzdE1ldGhvZEFkYXB0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGxvYWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVNpbmdsZU1ldGhvZEFkYXB0ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9LLCBmYWxsIGJhY2sgdG8gSlVuaXQgMy4KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBPSywgZmFsbCBiYWNrIHRvIEpVbml0IDMuCi0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBqdW5pdDQgPSBqdW5pdDRUZXN0QWRhcHRlckNsYXNzICE9IG51bGw7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGp1bml0VGVzdC5pc1NraXBOb25UZXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNUZXN0cyh0ZXN0Q2xhc3MsIGp1bml0NCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoanVuaXRUZXN0LmlzU2tpcE5vblRlc3RzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFjb250YWluc1Rlc3RzKHRlc3RDbGFzcywganVuaXQ0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgICAgICAgICBpZiAoanVuaXQ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQncyB1c2UgaXQhCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1tdIGZvcm1hbFBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+W10gZm9ybWFsUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gYWN0dWFsUGFyYW1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZVNpbmdsZU1ldGhvZEFkYXB0ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYWxQYXJhbXMgPSBuZXcgQ2xhc3NbXSB7Q2xhc3MuY2xhc3MsIFN0cmluZ1tdLmNsYXNzfTsKQEAgLTQ5Miw4ICs0OTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFBhcmFtcyA9IG5ldyBPYmplY3RbXSB7dGVzdENsYXNzLCBqdW5pdDRUZXN0QWRhcHRlckNhY2hlQ2xhc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImdldEluc3RhbmNlIikuaW52b2tlKG51bGwpfTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlID0gKFRlc3QpIGp1bml0NFRlc3RBZGFwdGVyQ2xhc3MuZ2V0Q29uc3RydWN0b3IoZm9ybWFsUGFyYW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UoYWN0dWFsUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlID0ganVuaXQ0VGVzdEFkYXB0ZXJDbGFzcy5hc1N1YmNsYXNzKFRlc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDb25zdHJ1Y3Rvcihmb3JtYWxQYXJhbXMpLm5ld0luc3RhbmNlKGFjdHVhbFBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgSlVuaXQgMy4KIApAQCAtNTEyLDkgKzUxMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VpdGUgPSB0ZXN0U3VpdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIGUpIHsKICAgICAgICAgICAgICAgICByZXRDb2RlID0gRVJST1JTOwogICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CkBAIC01ODcsMTIgKzU4NSwxMyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29udGFpbnNUZXN0cyhmaW5hbCBDbGFzczw/PiB0ZXN0Q2xhc3MsIGZpbmFsIGJvb2xlYW4gaXNKVW5pdDQpIHsKLSAgICAgICAgQ2xhc3MgdGVzdEFubm90YXRpb24gPSBudWxsOwotICAgICAgICBDbGFzcyBzdWl0ZUFubm90YXRpb24gPSBudWxsOwotICAgICAgICBDbGFzcyBydW5XaXRoQW5ub3RhdGlvbiA9IG51bGw7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0ZXN0QW5ub3RhdGlvbiA9IG51bGw7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzdWl0ZUFubm90YXRpb24gPSBudWxsOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gcnVuV2l0aEFubm90YXRpb24gPSBudWxsOwogCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZXN0QW5ub3RhdGlvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5qdW5pdC5UZXN0Iik7CisgICAgICAgICAgICB0ZXN0QW5ub3RhdGlvbiA9CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmp1bml0LlRlc3QiKS5hc1N1YmNsYXNzKEFubm90YXRpb24uY2xhc3MpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChpc0pVbml0NCkgewogICAgICAgICAgICAgICAgIC8vIG9kZCAtIHdlIHRoaW5rIHdlJ3JlIEpVbml0NCBidXQgZG9uJ3Qgc3VwcG9ydCB0aGUgdGVzdCBhbm5vdGF0aW9uLiBXZSB0aGVyZWZvcmUgY2FuJ3QgaGF2ZSBhbnkgdGVzdHMhCkBAIC02MDIsMTcgKzYwMSwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1aXRlQW5ub3RhdGlvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5qdW5pdC5TdWl0ZS5TdWl0ZUNsYXNzZXMiKTsKKyAgICAgICAgICAgIHN1aXRlQW5ub3RhdGlvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5qdW5pdC5TdWl0ZS5TdWl0ZUNsYXNzZXMiKQorICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKEFubm90YXRpb24uY2xhc3MpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAvLyBpZ25vcmUgLSB3ZSBkb24ndCBoYXZlIHRoaXMgYW5ub3RhdGlvbiBzbyBtYWtlIHN1cmUgd2UgZG9uJ3QgY2hlY2sgZm9yIGl0CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJ1bldpdGhBbm5vdGF0aW9uID0gQ2xhc3MuZm9yTmFtZSgib3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoIik7CisgICAgICAgICAgICBydW5XaXRoQW5ub3RhdGlvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aCIpCisgICAgICAgICAgICAgICAgLmFzU3ViY2xhc3MoQW5ub3RhdGlvbi5jbGFzcyk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIC8vIGFsc28gaWdub3JlIGFzIHRoaXMgYW5ub3RhdGlvbiBkb2Vzbid0IGV4aXN0IHNvIHRlc3RzIGNhbid0IHVzZSBpdAogICAgICAgICB9CiAKLQogICAgICAgICBpZiAoIWlzSlVuaXQ0ICYmICFUZXN0Q2FzZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RDbGFzcykpIHsKICAgICAgICAgICAgIC8vYSB0ZXN0IHdlIHRoaW5rIGlzIEpVbml0MyBidXQgZG9lcyBub3QgZXh0ZW5kIFRlc3RDYXNlLiBDYW4ndCByZWFsbHkgYmUgYSB0ZXN0LgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjI1LDE2ICs2MjUsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KHRlc3RDbGFzcy5nZXRNb2RpZmllcnMoKSkgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICBpZiAoTW9kaWZpZXIuaXNBYnN0cmFjdCh0ZXN0Q2xhc3MuZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgfHwgTW9kaWZpZXIuaXNJbnRlcmZhY2UodGVzdENsYXNzLmdldE1vZGlmaWVycygpKSkgewogICAgICAgICAgICAgLy8gY2FuJ3QgaW5zdGFudGlhdGUgY2xhc3MgYW5kIG5vIGlubmVyIGNsYXNzZXMgYXJlIHRlc3RzIGVpdGhlcgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzSlVuaXQ0KSB7Ci0gICAgICAgICAgICAgaWYgKHN1aXRlQW5ub3RhdGlvbiAhPSBudWxsICYmIHRlc3RDbGFzcy5nZXRBbm5vdGF0aW9uKHN1aXRlQW5ub3RhdGlvbikgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHN1aXRlQW5ub3RhdGlvbiAhPSBudWxsICYmIHRlc3RDbGFzcy5nZXRBbm5vdGF0aW9uKHN1aXRlQW5ub3RhdGlvbikgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vIGNsYXNzIGlzIG1hcmtlZCBhcyBhIHN1aXRlLiBMZXQgSlVuaXQgdHJ5IGFuZCB3b3JrIGl0cyBtYWdpYyBvbiBpdC4KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocnVuV2l0aEFubm90YXRpb24gIT0gbnVsbCAmJiB0ZXN0Q2xhc3MuZ2V0QW5ub3RhdGlvbihydW5XaXRoQW5ub3RhdGlvbikgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8qIENsYXNzIGlzIG1hcmtlZCB3aXRoIEBSdW5XaXRoLiBJZiB0aGlzIGNsYXNzIGlzIGJhZGx5IHdyaXR0ZW4gKG5vIHRlc3QgbWV0aG9kcywKICAgICAgICAgICAgICAgICAgKiBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMsIHByaXZhdGUgY29uc3RydWN0b3IgZXRjKSB0aGVuIHRoZSBjbGFzcyBpcyBhdXRvbWF0aWNhbGx5CkBAIC02NTcsMTYgKzY1OCwxOSBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBKVW5pdDMgY2xhc3MgaGF2ZSBwdWJsaWMgb3IgcHJvdGVjdGVkIG5vLWFyZ3MgbWV0aG9kcyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgICAgICAgLy8gbmFtZXMgc3RhcnRpbmcgd2l0aCB0ZXN0Ci0gICAgICAgICAgICAgICAgaWYgKG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInRlc3QiKSAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChNb2RpZmllci5pc1Byb3RlY3RlZChtLmdldE1vZGlmaWVycygpKSB8fCBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobS5nZXROYW1lKCkuc3RhcnRzV2l0aCgidGVzdCIpCisgICAgICAgICAgICAgICAgICAgICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiAoTW9kaWZpZXIuaXNQcm90ZWN0ZWQobS5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IE1vZGlmaWVyLmlzUHVibGljKG0uZ2V0TW9kaWZpZXJzKCkpKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayBpZiBKVW5pdDMgb3IgSlVuaXQ0IHRlc3QgaGF2ZSBhIHB1YmxpYyBvciBwcm90ZWN0ZWQsIHN0YXRpYywKICAgICAgICAgICAgIC8vIG5vLWFyZ3MgJ3N1aXRlJyBtZXRob2QKLSAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKS5lcXVhbHMoInN1aXRlIikgJiYgbS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICYmIChNb2RpZmllci5pc1Byb3RlY3RlZChtLmdldE1vZGlmaWVycygpKSB8fCBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgTW9kaWZpZXIuaXNTdGF0aWMobS5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIGlmICgic3VpdGUiLmVxdWFscyhtLmdldE5hbWUoKSkgJiYgbS5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgJiYgKE1vZGlmaWVyLmlzUHJvdGVjdGVkKG0uZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgICAgIHx8IE1vZGlmaWVyLmlzUHVibGljKG0uZ2V0TW9kaWZpZXJzKCkpKQorICAgICAgICAgICAgICAgICYmIE1vZGlmaWVyLmlzU3RhdGljKG0uZ2V0TW9kaWZpZXJzKCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY4MCw2ICs2ODQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiAyIGlmIGVycm9ycyBvY2N1cnJlZCwgMSBpZiB0ZXN0cyBmYWlsZWQgZWxzZSAwLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UmV0Q29kZSgpIHsKICAgICAgICAgcmV0dXJuIHJldENvZGU7CiAgICAgfQpAQCAtNjkwLDYgKzY5NSw3IEBACiAgICAgICogPHA+QSBuZXcgVGVzdCBpcyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0IHRoZSB0ZXN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChmaW5hbCBUZXN0IHQpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lID0gSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0KTsKICAgICAgICAgbG9nVGVzdExpc3RlbmVyRXZlbnQoInN0YXJ0VGVzdCgiICsgdGVzdE5hbWUgKyAiKSIpOwpAQCAtNzAxLDIyICs3MDcsMjEgQEAKICAgICAgKiA8cD5BIFRlc3QgaXMgZmluaXNoZWQuCiAgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZW5kVGVzdChmaW5hbCBUZXN0IHRlc3QpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIHRlc3ROYW1lID0gSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KTsKICAgICAgICAgbG9nVGVzdExpc3RlbmVyRXZlbnQoImVuZFRlc3QoIiArIHRlc3ROYW1lICsgIikiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgbG9nVGVzdExpc3RlbmVyRXZlbnQoU3RyaW5nIG1zZykgeworICAgIHByaXZhdGUgdm9pZCBsb2dUZXN0TGlzdGVuZXJFdmVudChTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBpZiAobG9nVGVzdExpc3RlbmVyRXZlbnRzKSB7CiAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgICAgICAgICAgZmluYWwgUHJpbnRTdHJlYW0gb3V0ID0gc2F2ZWRPdXQgIT0gbnVsbCA/IHNhdmVkT3V0IDogU3lzdGVtLm91dDsKICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgaWYgKG1zZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbXNnID0gIm51bGwiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIG1zZ0xpbmVzID0gbmV3IFN0cmluZ1Rva2VuaXplcihtc2csICJcclxuIiwgZmFsc2UpOwotICAgICAgICAgICAgd2hpbGUgKG1zZ0xpbmVzLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgbXNnTGluZXMubmV4dFRva2VuKCkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIG1lc3NhZ2VMaW5lcyA9CisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihTdHJpbmcudmFsdWVPZihtZXNzYWdlKSwgIlxyXG4iLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAobWVzc2FnZUxpbmVzLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgICAgIG91dC5wcmludGxuKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgbWVzc2FnZUxpbmVzLm5leHRUb2tlbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG91dC5mbHVzaCgpOwogICAgICAgICB9CkBAIC03NDQsNiArNzQ5LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdC4KICAgICAgKiBAcGFyYW0gdCAgICB0aGUgYXNzZXJ0aW9uIHRocm93biBieSB0aGUgdGVzdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKGZpbmFsIFRlc3QgdGVzdCwgZmluYWwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgdCkgewogICAgICAgICBhZGRGYWlsdXJlKHRlc3QsIChUaHJvd2FibGUpIHQpOwogICAgIH0KQEAgLTc1NSw2ICs3NjEsNyBAQAogICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgogICAgICAqIEBwYXJhbSB0ICAgIHRoZSBlcnJvciB0aHJvd24gYnkgdGhlIHRlc3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgVGVzdCB0ZXN0LCBmaW5hbCBUaHJvd2FibGUgdCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdE5hbWUgPSBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKHRlc3QpOwogICAgICAgICBsb2dUZXN0TGlzdGVuZXJFdmVudCgiYWRkRXJyb3IoIiArIHRlc3ROYW1lICsgIiwgIiArIHQuZ2V0TWVzc2FnZSgpICsgIikiKTsKQEAgLTc2OCw2ICs3NzUsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICogQHBhcmFtIHBlcm1pc3Npb25zIHRoZSBwZXJtaXNzaW9ucyB0byB1c2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbnMoZmluYWwgUGVybWlzc2lvbnMgcGVybWlzc2lvbnMpIHsKICAgICAgICAgcGVybSA9IHBlcm1pc3Npb25zOwogICAgIH0KQEAgLTc3Niw2ICs3ODQsNyBAQAogICAgICAqIEhhbmRsZSBhIHN0cmluZyBkZXN0aW5lZCBmb3Igc3RhbmRhcmQgb3V0cHV0LgogICAgICAqIEBwYXJhbSBvdXRwdXQgdGhlIHN0cmluZyB0byBvdXRwdXQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBoYW5kbGVPdXRwdXQoZmluYWwgU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAoIWxvZ1Rlc3RMaXN0ZW5lckV2ZW50cyAmJiBvdXRwdXQuc3RhcnRzV2l0aChKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCkpIHsKICAgICAgICAgICAgIC8vIGlnbm9yZQpAQCAtNzk1LDEyICs4MDQsMTQgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYW5kbGVJbnB1dChmaW5hbCBieXRlW10gYnVmZmVyLCBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaGFuZGxlRXJyb3JPdXRwdXQoZmluYWwgU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAoc3lzdGVtRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgc3lzdGVtRXJyb3IucHJpbnQob3V0cHV0KTsKQEAgLTgwOCw2ICs4MTksNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZUZsdXNoKGZpbmFsIFN0cmluZyBvdXRwdXQpIHsKICAgICAgICAgaWYgKHN5c3RlbU91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICBzeXN0ZW1PdXQucHJpbnQob3V0cHV0KTsKQEAgLTgxNSw2ICs4MjcsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZUVycm9yRmx1c2goZmluYWwgU3RyaW5nIG91dHB1dCkgewogICAgICAgICBpZiAoc3lzdGVtRXJyb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgc3lzdGVtRXJyb3IucHJpbnQob3V0cHV0KTsKQEAgLTg1MCw2ICs4NjMsNyBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEZvcm1hdHRlcihmaW5hbCBKVW5pdFRhc2tNaXJyb3IuSlVuaXRSZXN1bHRGb3JtYXR0ZXJNaXJyb3IgZikgewogICAgICAgICBmb3JtYXR0ZXJzLmFkZEVsZW1lbnQoZik7CiAgICAgfQpAQCAtOTQyLDggKzk1Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KEVSUk9SUyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aChDb25zdGFudHMuUFJPUFNGSUxFKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnCi0gICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKENvbnN0YW50cy5QUk9QU0ZJTEUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKFBhdGhzLmdldChhcmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoQ29uc3RhbnRzLlBST1BTRklMRS5sZW5ndGgoKSkpKTsKICAgICAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuc3RhcnRzV2l0aChDb25zdGFudHMuU0hPV09VVFBVVCkpIHsKQEAgLTk2NiwxOCArOTgwLDExIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBBZGQvb3ZlcmxheSBzeXN0ZW0gcHJvcGVydGllcyBvbiB0aGUgcHJvcGVydGllcyBmcm9tIHRoZSBBbnQgcHJvamVjdAotICAgICAgICBmaW5hbCBIYXNodGFibGUgcCA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZvciAoZmluYWwgRW51bWVyYXRpb24gZSA9IHAua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgZmluYWwgT2JqZWN0IGtleSA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIHByb3BzLnB1dChrZXksIHAuZ2V0KGtleSkpOwotICAgICAgICB9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZm9yRWFjaChwcm9wczo6cHV0KTsKIAogICAgICAgICBpbnQgcmV0dXJuQ29kZSA9IFNVQ0NFU1M7CiAgICAgICAgIGlmIChtdWx0aXBsZVRlc3RzKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzWzBdKSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RDYXNlTmFtZTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSB0ZXN0TWV0aG9kTmFtZXM7CisgICAgICAgICAgICB0cnkgKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhcmdzWzBdKSkpIHsKICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IDA7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBlcnJvck9jY3VycmVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsdXJlT2NjdXJyZWQgPSBmYWxzZTsKQEAgLTk4Niw2ICs5OTMsOCBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsICIsIik7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0TGlzdFNwZWMgPSBzdC5uZXh0VG9rZW4oKTsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNvbG9uSW5kZXggPSB0ZXN0TGlzdFNwZWMuaW5kZXhPZignOicpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVzdENhc2VOYW1lOworICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0ZXN0TWV0aG9kTmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvbkluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0Q2FzZU5hbWUgPSB0ZXN0TGlzdFNwZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kTmFtZXMgPSBudWxsOwpAQCAtMTAzNywzNiArMTA0Niw0NSBAQAogICAgICAgICBTeXN0ZW0uZXhpdChyZXR1cm5Db2RlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3I8Rm9ybWF0dGVyRWxlbWVudD4gZnJvbUNtZExpbmUgPSBuZXcgVmVjdG9yPEZvcm1hdHRlckVsZW1lbnQ+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgVmVjdG9yPEZvcm1hdHRlckVsZW1lbnQ+IGZyb21DbWRMaW5lID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRyYW5zZmVyRm9ybWF0dGVycyhmaW5hbCBKVW5pdFRlc3RSdW5uZXIgcnVubmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpVbml0VGVzdCB0ZXN0KSB7CiAgICAgICAgIHJ1bm5lci5hZGRGb3JtYXR0ZXIobmV3IEpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgewogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKGZpbmFsIEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoZmluYWwgSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dChmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtT3V0cHV0KGZpbmFsIFN0cmluZyBvdXQpIHsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihmaW5hbCBTdHJpbmcgZXJyKSB7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgVGVzdCBhcmcwLCBmaW5hbCBUaHJvd2FibGUgYXJnMSkgewogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEZhaWx1cmUoZmluYWwgVGVzdCBhcmcwLCBmaW5hbCBBc3NlcnRpb25GYWlsZWRFcnJvciBhcmcxKSB7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgZW5kVGVzdChmaW5hbCBUZXN0IGFyZzApIHsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoZmluYWwgVGVzdCBhcmcwKSB7CiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJUZXN0Q2FzZShKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKGFyZzApKTsKICAgICAgICAgICAgIH0KQEAgLTExODUsMjggKzEyMDMsMTggQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyTm9uQ3Jhc2goKQogICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNyYXNoRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlV3JpdGVyKGNyYXNoRmlsZSk7CisgICAgICAgICAgICB0cnkgKEZpbGVXcml0ZXIgb3V0ID0gbmV3IEZpbGVXcml0ZXIoY3Jhc2hGaWxlKSkgewogICAgICAgICAgICAgICAgIG91dC53cml0ZShDb25zdGFudHMuVEVSTUlOQVRFRF9TVUNDRVNTRlVMTFkgKyAiXG4iKTsKICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVGVzdENhc2UoZmluYWwgU3RyaW5nIHRlc3RDYXNlKSB7CiAgICAgICAgIGlmIChjcmFzaEZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIoY3Jhc2hGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRlc3RDYXNlICsgIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSAoRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihjcmFzaEZpbGUpKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHRlc3RDYXNlICsgIlxuIik7CisgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlZC4KICAgICAgICAgICAgIH0KQEAgLTEyMzMsOSArMTI0MSw5IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIEpVbml0IDQtc3BlY2lmaWMgdGVzdCBHVUlzIHdpbGwgc2hvdyBqdXN0ICJmYWlsdXJlcyIuCiAgICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBBbnQncyBvdXRwdXQgc2hvd3MgImZhaWx1cmVzIiB2cy4gImVycm9ycyIuCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdvdWxkIHByZWZlciB0byBzaG93ICJmYWlsdXJlIiBmb3IgdGhpbmdzIHRoYXQgbG9naWNhbGx5IGFyZS4KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlcnRpb25GYWlsZWRFcnJvciBmYWlsdXJlID0gbXNnICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEFzc2VydGlvbkZhaWxlZEVycm9yKG1zZykgOiBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZmFpbHVyZSA9IG1lc3NhZ2UgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IobWVzc2FnZSkgOiBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5pbml0Q2F1c2UodC5nZXRDYXVzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5zZXRTdGFja1RyYWNlKHQuZ2V0U3RhY2tUcmFjZSgpKTsKICAgICAgICAgICAgICAgICAgICAgdGVzdExpc3RlbmVyLmFkZEZhaWx1cmUodGVzdCwgZmFpbHVyZSk7CkBAIC0xMjQ3LDYgKzEyNTUsNyBAQAogICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKICAgICAgICAgICAgICAgICB0ZXN0TGlzdGVuZXIuYWRkRmFpbHVyZSh0ZXN0LCB0KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIFRocm93YWJsZSB0KSB7IC8vIHByZS0zLjQKICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEFzc2VydGlvbkZhaWxlZEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRlc3RMaXN0ZW5lci5hZGRGYWlsdXJlKHRlc3QsIChBc3NlcnRpb25GYWlsZWRFcnJvcikgdCk7CkBAIC0xMjczLDE0ICsxMjgyLDE5IEBACiAgICAgcHJpdmF0ZSBpbnRbXSBmaW5kSlVuaXQ0RmFpbHVyZUVycm9yQ291bnQoZmluYWwgVGVzdFJlc3VsdCByZXN1bHQpIHsKICAgICAgICAgaW50IGZhaWx1cmVzID0gMDsKICAgICAgICAgaW50IGVycm9ycyA9IDA7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSByZXN1bHQuZmFpbHVyZXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGZhaWx1cmVzKys7CisgICAgICAgIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgRW51bWVyYXRpb248VGVzdEZhaWx1cmU+IGUgPSByZXN1bHQuZmFpbHVyZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzKys7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgZSA9IHJlc3VsdC5lcnJvcnMoKTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEVudW1lcmF0aW9uPFRlc3RGYWlsdXJlPiBlID0gcmVzdWx0LmVycm9ycygpOwogICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSAoKFRlc3RGYWlsdXJlKSBlLm5leHRFbGVtZW50KCkpLnRocm93bkV4Y2VwdGlvbigpOworICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPQorICAgICAgICAgICAgICAgIGUubmV4dEVsZW1lbnQoKS50aHJvd25FeGNlcHRpb24oKTsKICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQXNzZXJ0aW9uRmFpbGVkRXJyb3IKICAgICAgICAgICAgICAgICB8fCB0IGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICBmYWlsdXJlcysrOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXIuamF2YQppbmRleCBmMGQ3NDMzLi42YTdkOWFkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ2LDExICs0NiwxMSBAQAogCiAgICAgc3RhdGljIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRlc3RDYXNlTmFtZSA9IFRlc3RDYXNlLmNsYXNzLmdldE1ldGhvZCgiZ2V0TmFtZSIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgICAgICB0ZXN0Q2FzZU5hbWUgPSBUZXN0Q2FzZS5jbGFzcy5nZXRNZXRob2QoImdldE5hbWUiKTsKICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIHByZSBKVW5pdCAzLjcKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGVzdENhc2VOYW1lID0gVGVzdENhc2UuY2xhc3MuZ2V0TWV0aG9kKCJuYW1lIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q2FzZU5hbWUgPSBUZXN0Q2FzZS5jbGFzcy5nZXRNZXRob2QoIm5hbWUiKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICB9CkBAIC04Miw5ICs4Miw4IEBACiAgICAgICAgICAgICBpZiAobmFtZS5lbmRzV2l0aCgiKSIpKSB7CiAgICAgICAgICAgICAgICAgaW50IHBhcmVuID0gbmFtZS5sYXN0SW5kZXhPZignKCcpOwogICAgICAgICAgICAgICAgIHJldHVybiBuYW1lLnN1YnN0cmluZygwLCBwYXJlbik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBUZXN0Q2FzZSAmJiB0ZXN0Q2FzZU5hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTk0LDE3ICs5MywxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNZXRob2QgZ2V0TmFtZU1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICAgICAgTWV0aG9kIGdldE5hbWVNZXRob2Q7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXROYW1lIiwgbmV3IENsYXNzIFswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0LmdldENsYXNzKCkuZ2V0TWV0aG9kKCJnZXROYW1lIik7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZU1ldGhvZCA9IHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3MgWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZU1ldGhvZCA9IHQuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoIm5hbWUiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGdldE5hbWVNZXRob2QgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAmJiBnZXROYW1lTWV0aG9kLmdldFJldHVyblR5cGUoKSA9PSBTdHJpbmcuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldE5hbWVNZXRob2QuaW52b2tlKHQsIG5ldyBPYmplY3RbMF0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgZ2V0TmFtZU1ldGhvZC5pbnZva2UodCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZWQpIHsKICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKQEAgLTEyNSw4ICsxMjMsNyBAQAogICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKICAgICAgICAgaWYgKHRlc3QgaW5zdGFuY2VvZiBKVW5pdFRhc2tNaXJyb3JJbXBsLlZtRXhpdEVycm9yVGVzdCkgewogICAgICAgICAgICAgY2xhc3NOYW1lID0gKChKVW5pdFRhc2tNaXJyb3JJbXBsLlZtRXhpdEVycm9yVGVzdCkgdGVzdCkuZ2V0Q2xhc3NOYW1lKCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICBpZiAoY2xhc3NOYW1lLmVxdWFscyhKVU5JVF9GUkFNRVdPUktfSlVOSVQ0X1RFU1RfQ0FTRV9GQUNBREUpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lLmVxdWFscyhKVU5JVF9GUkFNRVdPUktfSlVOSVQ0X1RFU1RfQ0FTRV9GQUNBREUpKSB7CiAgICAgICAgICAgICAvLyBKVW5pdCA0IHdyYXBzIHNvbG8gdGVzdHMgdGhpcyB3YXkuIFdlIGNhbiBleHRyYWN0CiAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgdGVzdCBuYW1lIHdpdGggYSBsaXR0bGUgaGFjay4KICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gdGVzdC50b1N0cmluZygpOwpAQCAtMTUyLDI4ICsxNDksMjIgQEAKICAgICAgICAgICAgICAgICBDbGFzczw/PiB0ZXN0Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZUNsYXNzTmFtZSh0ZXN0KSk7CiAKICAgICAgICAgICAgICAgICBNZXRob2QgdGVzdE1ldGhvZCA9IHRlc3RDbGFzcy5nZXRNZXRob2QoSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KSk7Ci0gICAgICAgICAgICAgICAgQ2xhc3MgaWdub3JlQW5ub3RhdGlvbiA9IENsYXNzLmZvck5hbWUoIm9yZy5qdW5pdC5JZ25vcmUiKTsKKyAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gaWdub3JlQW5ub3RhdGlvbiA9IENsYXNzCisgICAgICAgICAgICAgICAgICAgIC5mb3JOYW1lKCJvcmcuanVuaXQuSWdub3JlIikuYXNTdWJjbGFzcyhBbm5vdGF0aW9uLmNsYXNzKTsKICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0ZXN0TWV0aG9kLmdldEFubm90YXRpb24oaWdub3JlQW5ub3RhdGlvbik7CiAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBNZXRob2QgdmFsdWVNZXRob2QgPSBhbm5vdGF0aW9uLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJ2YWx1ZSIpOworICAgICAgICAgICAgICAgICAgICBNZXRob2QgdmFsdWVNZXRob2QgPSBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TWV0aG9kKCJ2YWx1ZSIpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSB2YWx1ZU1ldGhvZC5pbnZva2UoYW5ub3RhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSAtIHdlJ2xsIHJlcG9ydCBhIHNraXAgd2l0aCBubyBtZXNzYWdlCi0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlIC0gd2UnbGwgcmVwb3J0IGEgc2tpcCB3aXRoIG5vIG1lc3NhZ2UKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBzaWxlbnRseSBpZ25vcmUgLSB3ZSdsbCByZXBvcnQgYSBza2lwIHdpdGggbm8gbWVzc2FnZQotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlIC0gd2UnbGwgcmVwb3J0IGEgc2tpcCB3aXRoIG5vIG1lc3NhZ2UKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbWVzc2FnZTsKLQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvT3V0RXJyU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9PdXRFcnJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQppbmRleCBlMGRjMTZjLi4xMzQ5NzlmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9PdXRFcnJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9PdXRFcnJTdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1BsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1BsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQppbmRleCA2ZWVkZjUzLi5iOGNjOGRlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9QbGFpbkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsMjAgKzI0LDE4IEBACiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS50ZXh0Lk51bWJlckZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwotCiAKIC8qKgogICogUHJpbnRzIHBsYWluIHRleHQgb3V0cHV0IG9mIHRoZSB0ZXN0IHRvIGEgc3BlY2lmaWVkIFdyaXRlci4KICAqCiAgKi8KLQogcHVibGljIGNsYXNzIFBsYWluSlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBKVW5pdFJlc3VsdEZvcm1hdHRlciwgSWdub3JlZFRlc3RMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgT05FX1NFQ09ORCA9IDEwMDAuMDsKQEAgLTQ5LDcgKzQ3LDcgQEAKICAgICAvKioKICAgICAgKiBUaW1pbmcgaGVscGVyLgogICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlIHRlc3RTdGFydHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgcHJpdmF0ZSBNYXA8VGVzdCwgTG9uZz4gdGVzdFN0YXJ0cyA9IG5ldyBIYXNodGFibGU8PigpOwogICAgIC8qKgogICAgICAqIFdoZXJlIHRvIHdyaXRlIHRoZSBsb2cgdG8uCiAgICAgICovCkBAIC02NSw3ICs2Myw3IEBACiAgICAgLyoqCiAgICAgICogU3VwcHJlc3MgZW5kVGVzdCBpZiB0ZXN0Y2FzZSBmYWlsZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNodGFibGUgZmFpbGVkID0gbmV3IEhhc2h0YWJsZSgpOworICAgIHByaXZhdGUgTWFwPFRlc3QsIEJvb2xlYW4+IGZhaWxlZCA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtT3V0cHV0ID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyBzeXN0ZW1FcnJvciA9IG51bGw7CkBAIC03NywxNiArNzUsMTkgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgewogICAgICAgICB0aGlzLm91dCA9IG91dDsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgewogICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycikgewogICAgICAgICBzeXN0ZW1FcnJvciA9IGVycjsKICAgICB9CkBAIC05NiwxNSArOTcsMTMgQEAKICAgICAgKiBAcGFyYW0gc3VpdGUgdGhlIHRlc3Qgc3VpdGUKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHVuYWJsZSB0byB3cml0ZSB0aGUgb3V0cHV0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAob3V0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsgLy8gUXVpY2sgcmV0dXJuIC0gbm8gb3V0cHV0IGRvIG5vdGhpbmcuCiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHN1aXRlOiAiKTsKLSAgICAgICAgc2IuYXBwZW5kKHN1aXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIHNiLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcuZm9ybWF0KCJUZXN0c3VpdGU6ICVzJW4iLHN1aXRlLmdldE5hbWUoKSkuZ2V0Qnl0ZXMoKSk7CiAgICAgICAgICAgICBvdXQuZmx1c2goKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG91dHB1dCIsIGV4KTsKQEAgLTExNiw0MSArMTE1LDI4IEBACiAgICAgICogQHBhcmFtIHN1aXRlIHRoZSB0ZXN0IHN1aXRlCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB1bmFibGUgdG8gd3JpdGUgdGhlIG91dHB1dAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3RTdWl0ZShKVW5pdFRlc3Qgc3VpdGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHMgcnVuOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5ydW5Db3VudCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBGYWlsdXJlczogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZmFpbHVyZUNvdW50KCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIsIEVycm9yczogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZXJyb3JDb3VudCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBTa2lwcGVkOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5za2lwQ291bnQoKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIiwgVGltZSBlbGFwc2VkOiAiKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChuZi5mb3JtYXQoc3VpdGUuZ2V0UnVuVGltZSgpIC8gT05FX1NFQ09ORCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCIgc2VjIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nVXRpbHMuTElORV9TRVApOwotICAgICAgICAgICAgd3JpdGUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB3cml0ZShTdHJpbmcuZm9ybWF0KCJUZXN0cyBydW46ICVkLCBGYWlsdXJlczogJWQsIEVycm9yczogJWQsIFNraXBwZWQ6ICVkLCBUaW1lIGVsYXBzZWQ6ICVzIHNlYyVuIiwKKyAgICAgICAgICAgICAgICAgICAgc3VpdGUucnVuQ291bnQoKSwgc3VpdGUuZmFpbHVyZUNvdW50KCksIHN1aXRlLmVycm9yQ291bnQoKSwgc3VpdGUuc2tpcENvdW50KCksCisgICAgICAgICAgICAgICAgICAgIG5mLmZvcm1hdChzdWl0ZS5nZXRSdW5UaW1lKCkgLyBPTkVfU0VDT05EKSkpOwogCiAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZXJyIGFuZCBvdXRwdXQgc3RyZWFtcyB0byB0aGUgbG9nCi0gICAgICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgc3lzdGVtT3V0cHV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHdyaXRlKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgICAgICB3cml0ZShTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgIXN5c3RlbU91dHB1dC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZShTdHJpbmcuZm9ybWF0KCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0lbiIpKTsKICAgICAgICAgICAgICAgICB3cml0ZShzeXN0ZW1PdXRwdXQpOwotICAgICAgICAgICAgICAgIHdyaXRlKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIik7Ci0gICAgICAgICAgICAgICAgd3JpdGUoU3RyaW5nVXRpbHMuTElORV9TRVApOworICAgICAgICAgICAgICAgIHdyaXRlKFN0cmluZy5mb3JtYXQoIi0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0lbiIpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGUoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgRXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0iKTsKLSAgICAgICAgICAgICAgICB3cml0ZShTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBpZiAoc3lzdGVtRXJyb3IgIT0gbnVsbCAmJiAhc3lzdGVtRXJyb3IuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd3JpdGUoU3RyaW5nLmZvcm1hdCgiLS0tLS0tLS0tLS0tLSBTdGFuZGFyZCBFcnJvciAtLS0tLS0tLS0tLS0tLS0tLSVuIikpOwogICAgICAgICAgICAgICAgIHdyaXRlKHN5c3RlbUVycm9yKTsKLSAgICAgICAgICAgICAgICB3cml0ZSgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICAgICAgICAgIHdyaXRlKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICB3cml0ZShTdHJpbmcuZm9ybWF0KCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tJW4iKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHdyaXRlKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgIHdyaXRlKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOwogICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgd3JpLmZsdXNoKCk7CkBAIC0xODUsOCArMTcxLDkgQEAKICAgICAgKiA8cD5BIG5ldyBUZXN0IGlzIHN0YXJ0ZWQuCiAgICAgICogQHBhcmFtIHQgdGhlIHRlc3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkgewotICAgICAgICB0ZXN0U3RhcnRzLnB1dCh0LCBuZXcgTG9uZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkpOworICAgICAgICB0ZXN0U3RhcnRzLnB1dCh0LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgIGZhaWxlZC5wdXQodCwgQm9vbGVhbi5GQUxTRSk7CiAgICAgfQogCkBAIC0xOTYsNiArMTgzLDcgQEAKICAgICAgKiA8cD5BIFRlc3QgaXMgZmluaXNoZWQuCiAgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKICAgICAgICAgaWYgKEJvb2xlYW4uVFJVRS5lcXVhbHMoZmFpbGVkLmdldCh0ZXN0KSkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTIwNCwxMiArMTkyLDEyIEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHdyaS53cml0ZSgiVGVzdGNhc2U6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0VGVzdENhc2VOYW1lKHRlc3QpKTsKLSAgICAgICAgICAgICAgICBMb25nIGwgPSAoTG9uZykgdGVzdFN0YXJ0cy5nZXQodGVzdCk7CisgICAgICAgICAgICAgICAgTG9uZyBsID0gdGVzdFN0YXJ0cy5nZXQodGVzdCk7CiAgICAgICAgICAgICAgICAgZG91YmxlIHNlY29uZHMgPSAwOwogICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBudWxsIGlmIGFuIGVycm9yIG9jY3VycmVkIGluIHNldFVwCiAgICAgICAgICAgICAgICAgaWYgKGwgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBzZWNvbmRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGwubG9uZ1ZhbHVlKCkpIC8gT05FX1NFQ09ORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGwpIC8gT05FX1NFQ09ORDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB3cmkud3JpdGUoIiB0b29rICIgKyBuZi5mb3JtYXQoc2Vjb25kcykgKyAiIHNlYyIpOwpAQCAtMjM4LDYgKzIyNiw3IEBACiAgICAgICogQHBhcmFtIHRlc3QgdGhlIHRlc3QuCiAgICAgICogQHBhcmFtIHQgIHRoZSBhc3NlcnRpb24gdGhhdCBmYWlsZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKICAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSB0KTsKICAgICB9CkBAIC0yNDksNiArMjM4LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdC4KICAgICAgKiBAcGFyYW0gdCAgICB0aGUgZXhjZXB0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKICAgICAgICAgZm9ybWF0RXJyb3IoIlx0Q2F1c2VkIGFuIEVSUk9SIiwgdGVzdCwgdCk7CiAgICAgfQpAQCAtMjc0LDYgKzI2NCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZChUZXN0IHRlc3QpIHsKICAgICAgICAgZm9ybWF0U2tpcCh0ZXN0LCBKVW5pdFZlcnNpb25IZWxwZXIuZ2V0SWdub3JlTWVzc2FnZSh0ZXN0KSk7CiAgICAgfQpAQCAtMjk3LDYgKzI4OCw3IEBACiAKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzdW1wdGlvbkZhaWx1cmUoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIGZvcm1hdFNraXAodGVzdCwgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQppbmRleCA0ZWIzMGZiLi5jY2EzZTY3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TdW1tYXJ5SlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUyLDEyICs1Miw2IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgc3lzdGVtRXJyb3IgPSBudWxsOwogCiAgICAgLyoqCi0gICAgICogRW1wdHkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VtbWFyeUpVbml0UmVzdWx0Rm9ybWF0dGVyKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqICBJbnN1cmVzIHRoYXQgYSBsaW5lIG9mIGxvZyBvdXRwdXQgaXMgd3JpdHRlbiBhbmQgZmx1c2hlZCBhcyBhIHNpbmdsZQogICAgICAqICBvcGVyYXRpb24sIHRvIHByZXZlbnQgbGluZXMgZnJvbSBiZWluZyBzcGxpY2VkIGludG8gb3RoZXIgbGluZXMuCiAgICAgICogIChIb3BlZnVsbHkgdGhpcyBzb2x2ZXMgdGhlIGlzc3VlIG9mIHJ1biBvbiBsaW5lcyAtCkBAIC04MSw5ICs3NSw5IEBACiAgICAgICogVGhlIHRlc3RzdWl0ZSBzdGFydGVkLgogICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdHN1aXRlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKEpVbml0VGVzdCBzdWl0ZSkgewotICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiUnVubmluZyAiKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJSdW5uaW5nICIpOwogICAgICAgICBpbnQgYW50VGhyZWFkSUQgPSBzdWl0ZS5nZXRUaHJlYWQoKTsKIAogICAgICAgICBzYi5hcHBlbmQoc3VpdGUuZ2V0TmFtZSgpKTsKQEAgLTkyLDE5ICs4NiwyMSBAQAogICAgICAgICAgICAgc2IuYXBwZW5kKCIgaW4gdGhyZWFkICIpOwogICAgICAgICAgICAgc2IuYXBwZW5kKGFudFRocmVhZElEKTsKICAgICAgICAgfQotICAgICAgICBzYi5hcHBlbmQobmV3TGluZSk7CisgICAgICAgIHNiLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKICAgICAgICAgd3JpdGVPdXRwdXRMaW5lKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogICAgIC8qKgogICAgICAqIEVtcHR5CiAgICAgICogQHBhcmFtIHQgbm90IHVzZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdCkgewogICAgIH0KICAgICAvKioKICAgICAgKiBFbXB0eQogICAgICAqIEBwYXJhbSB0ZXN0IG5vdCB1c2VkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoVGVzdCB0ZXN0KSB7CiAgICAgfQogICAgIC8qKgpAQCAtMTIxLDYgKzExNyw3IEBACiAgICAgICogQHBhcmFtIHRlc3Qgbm90IHVzZWQuCiAgICAgICogQHBhcmFtIHQgbm90IHVzZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKICAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSB0KTsKICAgICB9CkBAIC0xMjksMjAgKzEyNiwyNCBAQAogICAgICAqIEBwYXJhbSB0ZXN0IG5vdCB1c2VkLgogICAgICAqIEBwYXJhbSB0IG5vdCB1c2VkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHQpIHsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoT3V0cHV0U3RyZWFtIG91dCkgewogICAgICAgICB0aGlzLm91dCA9IG91dDsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgewogICAgICAgICBzeXN0ZW1PdXRwdXQgPSBvdXQ7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U3lzdGVtRXJyb3IoU3RyaW5nIGVycikgewogICAgICAgICBzeXN0ZW1FcnJvciA9IGVycjsKICAgICB9CkBAIC0xNTIsNiArMTUzLDcgQEAKICAgICAgKiB0aGUgc3VtbWFyeS4KICAgICAgKiBAcGFyYW0gdmFsdWUgaWYgdHJ1ZSB3cml0ZSBTeXN0ZW0ub3V0IGFuZCBTeXN0ZW0uZXJyIHRvIHRoZSBzdW1tYXJ5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFdpdGhPdXRBbmRFcnIoYm9vbGVhbiB2YWx1ZSkgewogICAgICAgICB3aXRoT3V0QW5kRXJyID0gdmFsdWU7CiAgICAgfQpAQCAtMTYxLDkgKzE2Myw5IEBACiAgICAgICogQHBhcmFtIHN1aXRlIHRoZSB0ZXN0c3VpdGUuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbmV3TGluZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigiVGVzdHMgcnVuOiAiKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJUZXN0cyBydW46ICIpOwogICAgICAgICBzYi5hcHBlbmQoc3VpdGUucnVuQ291bnQoKSk7CiAgICAgICAgIHNiLmFwcGVuZCgiLCBGYWlsdXJlczogIik7CiAgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5mYWlsdXJlQ291bnQoKSk7CkBAIC0xODUsMTcgKzE4NywxNSBAQAogICAgICAgICAgICAgc2IuYXBwZW5kKCIsIENsYXNzOiAiKTsKICAgICAgICAgICAgIHNiLmFwcGVuZChzdWl0ZS5nZXROYW1lKCkpOwogICAgICAgICB9Ci0gICAgICAgIHNiLmFwcGVuZChuZXdMaW5lKTsKKyAgICAgICAgc2IuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOwogCiAgICAgICAgIGlmICh3aXRoT3V0QW5kRXJyKSB7Ci0gICAgICAgICAgICBpZiAoc3lzdGVtT3V0cHV0ICE9IG51bGwgJiYgc3lzdGVtT3V0cHV0Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiT3V0cHV0OiIpLmFwcGVuZChuZXdMaW5lKS5hcHBlbmQoc3lzdGVtT3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld0xpbmUpOworICAgICAgICAgICAgaWYgKHN5c3RlbU91dHB1dCAhPSBudWxsICYmICFzeXN0ZW1PdXRwdXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIk91dHB1dDolbiVzJW4iLCBzeXN0ZW1PdXRwdXQpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHN5c3RlbUVycm9yICE9IG51bGwgJiYgc3lzdGVtRXJyb3IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJFcnJvcjogIikuYXBwZW5kKG5ld0xpbmUpLmFwcGVuZChzeXN0ZW1FcnJvcikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdMaW5lKTsKKyAgICAgICAgICAgIGlmIChzeXN0ZW1FcnJvciAhPSBudWxsICYmICFzeXN0ZW1FcnJvci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiRXJyb3I6ICVuJXMlbiIsIHN5c3RlbUVycm9yKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVhckRvd25PblZtQ3Jhc2guamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1RlYXJEb3duT25WbUNyYXNoLmphdmEKaW5kZXggN2JmODgxNi4uYWZjMDJiMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVhckRvd25PblZtQ3Jhc2guamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZWFyRG93bk9uVm1DcmFzaC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKIAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwpAQCAtNDMsNiArNDIsNyBAQAogICAgICAqIFJlY29yZHMgdGhlIHN1aXRlJ3MgbmFtZSB0byBsYXRlciBkZXRlcm1pbmUgdGhlIGNsYXNzIHRvIGludm9rZQogICAgICAqIHRlYXJEb3duIG9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdFN1aXRlKGZpbmFsIEpVbml0VGVzdCBzdWl0ZSkgewogICAgICAgICBzdWl0ZU5hbWUgPSBzdWl0ZS5nZXROYW1lKCk7CiAgICAgICAgIGlmIChzdWl0ZU5hbWUgIT0gbnVsbCAmJiBzdWl0ZU5hbWUuZW5kc1dpdGgoSlVuaXRUYXNrLk5BTUVfT0ZfRFVNTVlfVEVTVCkpIHsKQEAgLTU2LDYgKzU2LDcgQEAKICAgICAgKiB0ZXN0IHdlIGdldCB3aGVuIGEgQmF0Y2ggZmFpbHMgYW5kIHRoZSBlcnJvciBpcyBhbiBhY3R1YWwKICAgICAgKiBlcnJvciBnZW5lcmF0ZWQgYnkgQW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEVycm9yKGZpbmFsIFRlc3QgZmFrZVRlc3QsIGZpbmFsIFRocm93YWJsZSB0KSB7CiAgICAgICAgIGlmIChzdWl0ZU5hbWUgIT0gbnVsbCAmJiBmYWtlVGVzdCBpbnN0YW5jZW9mIEpVbml0VGFza01pcnJvckltcGwuVm1FeGl0RXJyb3JUZXN0KSB7CiAgICAgICAgICAgICB0ZWFyRG93bigpOwpAQCAtNjYsMjQgKzY3LDMxIEBACiAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIFRocm93YWJsZSB0KSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShUZXN0IHRlc3QsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3QoVGVzdCB0ZXN0KSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZW5kVGVzdChUZXN0IHRlc3QpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0U3VpdGUoSlVuaXRUZXN0IHN1aXRlKSB7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0KE91dHB1dFN0cmVhbSBvdXQpIHsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoU3RyaW5nIG91dCkgewogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbUVycm9yKFN0cmluZyBlcnIpIHsKICAgICB9CiAKQEAgLTkxLDcgKzk5LDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIGZpcnN0IHRyeSB0byBsb2FkIHRoZSBjbGFzcyBhbmQgbGV0J3MgaG9wZSBpdCBpcyBvbiBvdXIKICAgICAgICAgICAgIC8vIGNsYXNzcGF0aAotICAgICAgICAgICAgQ2xhc3MgdGVzdENsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzPD8+IHRlc3RDbGFzcyA9IG51bGw7CiAgICAgICAgICAgICBpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgdGVzdENsYXNzID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQpAQCAtMTE2LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAvLyB3aGljaCB0ZXN0IG9mIHRoZSBleGVjdXRlZCBzdWl0ZSB0aW1lZCBvdXQsIGlnbm9yZSBpdAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIHN1aXRlIG1ldGhvZAotICAgICAgICAgICAgICAgIHRlc3RDbGFzcy5nZXRNZXRob2QoInN1aXRlIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICB0ZXN0Q2xhc3MuZ2V0TWV0aG9kKCJzdWl0ZSIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gbm8gc3VpdGUgbWV0aG9kCkBAIC0xMjcsOSArMTM1LDkgQEAKICAgICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSBhbnkgdGVhckRvd24gbWV0aG9kLgogCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIE1ldGhvZCB0ZCA9IHRlc3RDbGFzcy5nZXRNZXRob2QoInRlYXJEb3duIiwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgICAgICAgICBNZXRob2QgdGQgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kKCJ0ZWFyRG93biIpOwogICAgICAgICAgICAgICAgIGlmICh0ZC5nZXRSZXR1cm5UeXBlKCkgPT0gVm9pZC5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRkLmludm9rZSh0ZXN0Q2xhc3MubmV3SW5zdGFuY2UoKSwgbmV3IE9iamVjdFswXSk7CisgICAgICAgICAgICAgICAgICAgIHRkLmludm9rZSh0ZXN0Q2xhc3MubmV3SW5zdGFuY2UoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKICAgICAgICAgICAgICAgICAvLyBubyB0ZWFyRG93biwgZmluZQpAQCAtMTM4LDkgKzE0Niw2IEBACiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mZSkgewogICAgICAgICAgICAgLy8gY2xhc3MgcHJvYmFibHkgaXMgbm90IGluIG91ciBjbGFzc3BhdGgsIHRoZXJlIGlzCiAgICAgICAgICAgICAvLyBub3RoaW5nIHdlIGNhbiBkbwotICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDYXVnaHQgYW4gZXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBpbnZva2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHRlYXJEb3duOiAiICsgaXRlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhdWdodCBhbiBleGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGludm9rZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGVhckRvd246ICIgKyB0LmdldE1lc3NhZ2UoKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZXN0SWdub3JlZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVzdElnbm9yZWQuamF2YQppbmRleCA3OWE4ODc4Li40MzJmYWY5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZXN0SWdub3JlZC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RJZ25vcmVkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZXN0TGlzdGVuZXJXcmFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZXN0TGlzdGVuZXJXcmFwcGVyLmphdmEKaW5kZXggNjkyZTRmYy4uNmI0OGM4MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVzdExpc3RlbmVyV3JhcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RMaXN0ZW5lcldyYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDMxICszMiwzOCBAQAogICAgICAgICB3cmFwcGVkID0gbGlzdGVuZXI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoVGVzdCB0ZXN0LCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIHdyYXBwZWQuYWRkRXJyb3IodGVzdCwgdGhyb3dhYmxlKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRGYWlsdXJlKFRlc3QgdGVzdCwgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYXNzZXJ0aW9uRmFpbGVkRXJyb3IpIHsKICAgICAgICAgd3JhcHBlZC5hZGRGYWlsdXJlKHRlc3QsIGFzc2VydGlvbkZhaWxlZEVycm9yKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBlbmRUZXN0KFRlc3QgdGVzdCkgewogICAgICAgICB3cmFwcGVkLmVuZFRlc3QodGVzdCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3RhcnRUZXN0KFRlc3QgdGVzdCkgewogICAgICAgICB3cmFwcGVkLnN0YXJ0VGVzdCh0ZXN0KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZChUZXN0IHRlc3QpIHsKICAgICAgICAgaWYgKHdyYXBwZWQgaW5zdGFuY2VvZiBJZ25vcmVkVGVzdExpc3RlbmVyKSB7Ci0gICAgICAgICAgICAoKElnbm9yZWRUZXN0TGlzdGVuZXIpd3JhcHBlZCkudGVzdElnbm9yZWQodGVzdCk7CisgICAgICAgICAgICAoKElnbm9yZWRUZXN0TGlzdGVuZXIpIHdyYXBwZWQpLnRlc3RJZ25vcmVkKHRlc3QpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGVzdEFzc3VtcHRpb25GYWlsdXJlKFRlc3QgdGVzdCwgVGhyb3dhYmxlIHRocm93YWJsZSkgewogICAgICAgICBpZiAod3JhcHBlZCBpbnN0YW5jZW9mIElnbm9yZWRUZXN0TGlzdGVuZXIpIHsKLSAgICAgICAgICAgICgoSWdub3JlZFRlc3RMaXN0ZW5lcil3cmFwcGVkKS50ZXN0QXNzdW1wdGlvbkZhaWx1cmUodGVzdCwgdGhyb3dhYmxlKTsKKyAgICAgICAgICAgICgoSWdub3JlZFRlc3RMaXN0ZW5lcikgd3JhcHBlZCkudGVzdEFzc3VtcHRpb25GYWlsdXJlKHRlc3QsCisgICAgICAgICAgICAgICAgdGhyb3dhYmxlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MQ29uc3RhbnRzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxDb25zdGFudHMuamF2YQppbmRleCBjMjkyNzFkLi4xNDMyZDVjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxDb25zdGFudHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxDb25zdGFudHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDggKzE5LDggQEAKIAogLyoqCiAgKiA8cD5JbnRlcmZhY2UgZ3JvdXBzIFhNTCBjb25zdGFudHMuCi0gKiBJbnRlcmZhY2UgdGhhdCBncm91cHMgYWxsIGNvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIDx0dD5YTUw8L3R0PgotICogZG9jdW1lbnRzIHRoYXQgYXJlIGdlbmVyYXRlZCBieSB0aGUgPHR0PlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyPC90dD4uCisgKiBJbnRlcmZhY2UgdGhhdCBncm91cHMgYWxsIGNvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIDxjb2RlPlhNTDwvY29kZT4KKyAqIGRvY3VtZW50cyB0aGF0IGFyZSBnZW5lcmF0ZWQgYnkgdGhlIDxjb2RlPlhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyPC9jb2RlPi4KICAqIDwvcD4KICAqIEFzIG9mIG5vdyB0aGUgRFREIGlzOgogICogPHByZT4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCmluZGV4IDE3MTM0OGYuLjVlZDlkZGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDkgKzI1LDEwIEBACiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CkBAIC01MCw3ICs1MSw2IEBACiAgKgogICogQHNlZSBGb3JtYXR0ZXJFbGVtZW50CiAgKi8KLQogcHVibGljIGNsYXNzIFhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyIGltcGxlbWVudHMgSlVuaXRSZXN1bHRGb3JtYXR0ZXIsIFhNTENvbnN0YW50cywgSWdub3JlZFRlc3RMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgT05FX1NFQ09ORCA9IDEwMDAuMDsKQEAgLTg0LDQ1ICs4NCw0NCBAQAogICAgICAqIHNvIHdlIGNhbid0IGVhc2lseSBtYXRjaCBUZXN0IG9iamVjdHMgd2l0aG91dCBtYW51YWxseSBpdGVyYXRpbmcgb3ZlciBhbGwga2V5cyBhbmQgY2hlY2tpbmcKICAgICAgKiBpbmRpdmlkdWFsIGZpZWxkcy4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZTxTdHJpbmcsIEVsZW1lbnQ+IHRlc3RFbGVtZW50cyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBFbGVtZW50PigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgRWxlbWVudD4gdGVzdEVsZW1lbnRzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAKICAgICAvKioKICAgICAgKiB0ZXN0cyB0aGF0IGZhaWxlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIEhhc2h0YWJsZSBmYWlsZWRUZXN0cyA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxUZXN0LCBUZXN0PiBmYWlsZWRUZXN0cyA9IG5ldyBIYXNodGFibGU8PigpOwogCiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCB3ZXJlIHNraXBwZWQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBUZXN0PiBza2lwcGVkVGVzdHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgVGVzdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFRlc3Q+IHNraXBwZWRUZXN0cyA9IG5ldyBIYXNodGFibGU8PigpOwogICAgIC8qKgogICAgICAqIFRlc3RzIHRoYXQgd2VyZSBpZ25vcmVkLiBTZWUgdGhlIG5vdGUgYWJvdmUgYWJvdXQgdGhlIGtleSBiZWluZyBhIGJpdCBvZiBhIGhhY2suCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBUZXN0PiBpZ25vcmVkVGVzdHMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgVGVzdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFRlc3Q+IGlnbm9yZWRUZXN0cyA9IG5ldyBIYXNodGFibGU8PigpOwogICAgIC8qKgogICAgICAqIFRpbWluZyBoZWxwZXIuCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBMb25nPiB0ZXN0U3RhcnRzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIExvbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMb25nPiB0ZXN0U3RhcnRzID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgLyoqCiAgICAgICogV2hlcmUgdG8gd3JpdGUgdGhlIGxvZyB0by4KICAgICAgKi8KICAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXQ7CiAKLSAgICAvKiogTm8gYXJnIGNvbnN0cnVjdG9yLiAqLwotICAgIHB1YmxpYyBYTUxKVW5pdFJlc3VsdEZvcm1hdHRlcigpIHsKLSAgICB9Ci0KICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXQoZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgewogICAgICAgICB0aGlzLm91dCA9IG91dDsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1PdXRwdXQoZmluYWwgU3RyaW5nIG91dCkgewogICAgICAgICBmb3JtYXRPdXRwdXQoU1lTVEVNX09VVCwgb3V0KTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1FcnJvcihmaW5hbCBTdHJpbmcgb3V0KSB7CiAgICAgICAgIGZvcm1hdE91dHB1dChTWVNURU1fRVJSLCBvdXQpOwogICAgIH0KQEAgLTEzMSw2ICsxMzAsNyBAQAogICAgICAqIFRoZSB3aG9sZSB0ZXN0c3VpdGUgc3RhcnRlZC4KICAgICAgKiBAcGFyYW0gc3VpdGUgdGhlIHRlc3RzdWl0ZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzdGFydFRlc3RTdWl0ZShmaW5hbCBKVW5pdFRlc3Qgc3VpdGUpIHsKICAgICAgICAgZG9jID0gZ2V0RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKICAgICAgICAgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChURVNUU1VJVEUpOwpAQCAtMTQ5LDkgKzE0OSw3IEBACiAgICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHByb3BzRWxlbWVudCk7CiAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBzdWl0ZS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGlmIChwcm9wcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBlID0gcHJvcHMucHJvcGVydHlOYW1lcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwcm9wcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50IHByb3BFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoUFJPUEVSVFkpOwogICAgICAgICAgICAgICAgIHByb3BFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX05BTUUsIG5hbWUpOwogICAgICAgICAgICAgICAgIHByb3BFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1ZBTFVFLCBwcm9wcy5nZXRQcm9wZXJ0eShuYW1lKSk7CkBAIC0xODIsMTkgKzE4MCwyMCBAQAogICAgICAqIEBwYXJhbSBzdWl0ZSB0aGUgdGVzdHN1aXRlLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZW5kVGVzdFN1aXRlKGZpbmFsIEpVbml0VGVzdCBzdWl0ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfVEVTVFMsICIiICsgc3VpdGUucnVuQ291bnQoKSk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0ZBSUxVUkVTLCAiIiArIHN1aXRlLmZhaWx1cmVDb3VudCgpKTsKLSAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfRVJST1JTLCAiIiArIHN1aXRlLmVycm9yQ291bnQoKSk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX1NLSVBQRUQsICIiICsgc3VpdGUuc2tpcENvdW50KCkpOworICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoQVRUUl9URVNUUywgTG9uZy50b1N0cmluZyhzdWl0ZS5ydW5Db3VudCgpKSk7CisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0ZBSUxVUkVTLCBMb25nLnRvU3RyaW5nKHN1aXRlLmZhaWx1cmVDb3VudCgpKSk7CisgICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShBVFRSX0VSUk9SUywgTG9uZy50b1N0cmluZyhzdWl0ZS5lcnJvckNvdW50KCkpKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKEFUVFJfU0tJUFBFRCwgTG9uZy50b1N0cmluZyhzdWl0ZS5za2lwQ291bnQoKSkpOwogICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoCi0gICAgICAgICAgICBBVFRSX1RJTUUsICIiICsgKHN1aXRlLmdldFJ1blRpbWUoKSAvIE9ORV9TRUNPTkQpKTsKKyAgICAgICAgICAgIEFUVFJfVElNRSwgRG91YmxlLnRvU3RyaW5nKHN1aXRlLmdldFJ1blRpbWUoKSAvIE9ORV9TRUNPTkQpKTsKICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICBXcml0ZXIgd3JpID0gbnVsbDsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgd3JpID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCAiVVRGOCIpKTsKKyAgICAgICAgICAgICAgICB3cmkgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgICAgICAgICAgICB3cmkud3JpdGUoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz5cbiIpOwotICAgICAgICAgICAgICAgIChuZXcgRE9NRWxlbWVudFdyaXRlcigpKS53cml0ZShyb290RWxlbWVudCwgd3JpLCAwLCAiICAiKTsKKyAgICAgICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcigpLndyaXRlKHJvb3RFbGVtZW50LCB3cmksIDAsICIgICIpOwogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXhjKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbG9nIGZpbGUiLCBleGMpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKQEAgLTIxOCwxMiArMjE3LDE0IEBACiAgICAgICogPHA+QSBuZXcgVGVzdCBpcyBzdGFydGVkLgogICAgICAqIEBwYXJhbSB0IHRoZSB0ZXN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0YXJ0VGVzdChmaW5hbCBUZXN0IHQpIHsKICAgICAgICAgdGVzdFN0YXJ0cy5wdXQoY3JlYXRlRGVzY3JpcHRpb24odCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVzY3JpcHRpb24oZmluYWwgVGVzdCB0ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KSArICIoIiArIEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZUNsYXNzTmFtZSh0ZXN0KSArICIpIjsKKyAgICAgICAgcmV0dXJuIEpVbml0VmVyc2lvbkhlbHBlci5nZXRUZXN0Q2FzZU5hbWUodGVzdCkgKyAiKCIKKyAgICAgICAgICAgICsgSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlQ2xhc3NOYW1lKHRlc3QpICsgIikiOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjMyLDYgKzIzMyw3IEBACiAgICAgICogPHA+QSBUZXN0IGlzIGZpbmlzaGVkLgogICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGVuZFRlc3QoZmluYWwgVGVzdCB0ZXN0KSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0RGVzY3JpcHRpb24gPSBjcmVhdGVEZXNjcmlwdGlvbih0ZXN0KTsKIApAQCAtMjQyLDcgKzI0NCw5IEBACiAgICAgICAgICAgICBzdGFydFRlc3QodGVzdCk7CiAgICAgICAgIH0KICAgICAgICAgRWxlbWVudCBjdXJyZW50VGVzdDsKLSAgICAgICAgaWYgKCFmYWlsZWRUZXN0cy5jb250YWluc0tleSh0ZXN0KSAmJiAhc2tpcHBlZFRlc3RzLmNvbnRhaW5zS2V5KHRlc3REZXNjcmlwdGlvbikgJiYgIWlnbm9yZWRUZXN0cy5jb250YWluc0tleSh0ZXN0RGVzY3JpcHRpb24pKSB7CisgICAgICAgIGlmICghZmFpbGVkVGVzdHMuY29udGFpbnNLZXkodGVzdCkKKyAgICAgICAgICAgICYmICFza2lwcGVkVGVzdHMuY29udGFpbnNLZXkodGVzdERlc2NyaXB0aW9uKQorICAgICAgICAgICAgJiYgIWlnbm9yZWRUZXN0cy5jb250YWluc0tleSh0ZXN0RGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICBjdXJyZW50VGVzdCA9IGRvYy5jcmVhdGVFbGVtZW50KFRFU1RDQVNFKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuID0gSlVuaXRWZXJzaW9uSGVscGVyLmdldFRlc3RDYXNlTmFtZSh0ZXN0KTsKICAgICAgICAgICAgIGN1cnJlbnRUZXN0LnNldEF0dHJpYnV0ZShBVFRSX05BTUUsCkBAIC0yNTksNyArMjYzLDcgQEAKIAogICAgICAgICBmaW5hbCBMb25nIGwgPSB0ZXN0U3RhcnRzLmdldChjcmVhdGVEZXNjcmlwdGlvbih0ZXN0KSk7CiAgICAgICAgIGN1cnJlbnRUZXN0LnNldEF0dHJpYnV0ZShBVFRSX1RJTUUsCi0gICAgICAgICAgICAiIiArICgoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBsKSAvIE9ORV9TRUNPTkQpKTsKKyAgICAgICAgICAgIERvdWJsZS50b1N0cmluZygoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBsKSAvIE9ORV9TRUNPTkQpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI4MCw2ICsyODQsNyBAQAogICAgICAqIEBwYXJhbSB0ZXN0IHRoZSB0ZXN0LgogICAgICAqIEBwYXJhbSB0IHRoZSBhc3NlcnRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmFpbHVyZShmaW5hbCBUZXN0IHRlc3QsIGZpbmFsIEFzc2VydGlvbkZhaWxlZEVycm9yIHQpIHsKICAgICAgICAgYWRkRmFpbHVyZSh0ZXN0LCAoVGhyb3dhYmxlKSB0KTsKICAgICB9CkBAIC0yOTEsNiArMjk2LDcgQEAKICAgICAgKiBAcGFyYW0gdGVzdCB0aGUgdGVzdC4KICAgICAgKiBAcGFyYW0gdCB0aGUgZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRXJyb3IoZmluYWwgVGVzdCB0ZXN0LCBmaW5hbCBUaHJvd2FibGUgdCkgewogICAgICAgICBmb3JtYXRFcnJvcihFUlJPUiwgdGVzdCwgdCk7CiAgICAgfQpAQCAtMzAyLDE3ICszMDgsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIEVsZW1lbnQgbmVzdGVkID0gZG9jLmNyZWF0ZUVsZW1lbnQodHlwZSk7Ci0gICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3Q7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRUZXN0ID0gdGVzdEVsZW1lbnRzLmdldChjcmVhdGVEZXNjcmlwdGlvbih0ZXN0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjdXJyZW50VGVzdCA9IHJvb3RFbGVtZW50OwotICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3QgPSB0ZXN0ID09IG51bGwgPyByb290RWxlbWVudAorICAgICAgICAgICAgOiB0ZXN0RWxlbWVudHMuZ2V0KGNyZWF0ZURlc2NyaXB0aW9uKHRlc3QpKTsKIAogICAgICAgICBjdXJyZW50VGVzdC5hcHBlbmRDaGlsZChuZXN0ZWQpOwogCiAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gdC5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAhbWVzc2FnZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIG5lc3RlZC5zZXRBdHRyaWJ1dGUoQVRUUl9NRVNTQUdFLCB0LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KICAgICAgICAgbmVzdGVkLnNldEF0dHJpYnV0ZShBVFRSX1RZUEUsIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwpAQCAtMzI4LDYgKzMzMCw3IEBACiAgICAgICAgIG5lc3RlZC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKG91dHB1dCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRlc3RJZ25vcmVkKGZpbmFsIFRlc3QgdGVzdCkgewogICAgICAgICBmb3JtYXRTa2lwKHRlc3QsIEpVbml0VmVyc2lvbkhlbHBlci5nZXRJZ25vcmVNZXNzYWdlKHRlc3QpKTsKICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCkgewpAQCAtMzM1LDcgKzMzOCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIHB1YmxpYyB2b2lkIGZvcm1hdFNraXAoZmluYWwgVGVzdCB0ZXN0LCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBpZiAodGVzdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBlbmRUZXN0KHRlc3QpOwpAQCAtMzQ3LDE3ICszNDksMTQgQEAKICAgICAgICAgICAgIG5lc3RlZC5zZXRBdHRyaWJ1dGUoIm1lc3NhZ2UiLCBtZXNzYWdlKTsKICAgICAgICAgfQogCi0gICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3Q7Ci0gICAgICAgIGlmICh0ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGN1cnJlbnRUZXN0ID0gdGVzdEVsZW1lbnRzLmdldChjcmVhdGVEZXNjcmlwdGlvbih0ZXN0KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjdXJyZW50VGVzdCA9IHJvb3RFbGVtZW50OwotICAgICAgICB9CisgICAgICAgIEVsZW1lbnQgY3VycmVudFRlc3QgPSB0ZXN0ID09IG51bGwgPyByb290RWxlbWVudAorICAgICAgICAgICAgOiB0ZXN0RWxlbWVudHMuZ2V0KGNyZWF0ZURlc2NyaXB0aW9uKHRlc3QpKTsKIAogICAgICAgICBjdXJyZW50VGVzdC5hcHBlbmRDaGlsZChuZXN0ZWQpOwogCiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGVzdEFzc3VtcHRpb25GYWlsdXJlKGZpbmFsIFRlc3QgdGVzdCwgZmluYWwgVGhyb3dhYmxlIGZhaWx1cmUpIHsKICAgICAgICAgZm9ybWF0U2tpcCh0ZXN0LCBmYWlsdXJlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIHNraXBwZWRUZXN0cy5wdXQoY3JlYXRlRGVzY3JpcHRpb24odGVzdCksIHRlc3QpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MUmVzdWx0QWdncmVnYXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MUmVzdWx0QWdncmVnYXRvci5qYXZhCmluZGV4IGE4NTEyMzMuLjRlYWM3OWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxSZXN1bHRBZ2dyZWdhdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMyArMTksMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKQEAgLTYwLDcgKzYwLDcgQEAKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCiAgICAgLyoqIHRoZSBsaXN0IG9mIGFsbCBmaWxlc2V0cywgdGhhdCBzaG91bGQgY29udGFpbnMgdGhlIHhtbCB0byBhZ2dyZWdhdGUgKi8KLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGZpbGVzZXRzID0gbmV3IFZlY3RvcigpOworICAgIHByb3RlY3RlZCBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiB0aGUgbmFtZSBvZiB0aGUgcmVzdWx0IGZpbGUgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvRmlsZTsKQEAgLTY4LDEyICs2OCwxMiBAQAogICAgIC8qKiB0aGUgZGlyZWN0b3J5IHRvIHdyaXRlIHRoZSBmaWxlIHRvICovCiAgICAgcHJvdGVjdGVkIEZpbGUgdG9EaXI7CiAKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIHRyYW5zZm9ybWVycyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yPEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyPiB0cmFuc2Zvcm1lcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAotICAgIC8qKiBUaGUgZGVmYXVsdCBkaXJlY3Rvcnk6IDx0dD4mIzA0Njs8L3R0Pi4gSXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgcHJvamVjdCBkaXJlY3RvcnkgKi8KKyAgICAvKiogVGhlIGRlZmF1bHQgZGlyZWN0b3J5OiA8Y29kZT4mIzA0Njs8L2NvZGU+LiBJdCBpcyByZXNvbHZlZCBmcm9tIHRoZSBwcm9qZWN0IGRpcmVjdG9yeSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRElSID0gIi4iOwogCi0gICAgLyoqIHRoZSBkZWZhdWx0IGZpbGUgbmFtZTogPHR0PlRFU1RTLVRlc3RTdWl0ZXMueG1sPC90dD4gKi8KKyAgICAvKiogdGhlIGRlZmF1bHQgZmlsZSBuYW1lOiA8Y29kZT5URVNUUy1UZXN0U3VpdGVzLnhtbDwvY29kZT4gKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZJTEVOQU1FID0gIlRFU1RTLVRlc3RTdWl0ZXMueG1sIjsKIAogICAgIC8qKiB0aGUgY3VycmVudCBnZW5lcmF0ZWQgaWQgKi8KQEAgLTEwMiwxMyArMTAyLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIGNyZWF0ZVJlcG9ydCgpIHsKICAgICAgICAgQWdncmVnYXRlVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSBuZXcgQWdncmVnYXRlVHJhbnNmb3JtZXIodGhpcyk7Ci0gICAgICAgIHRyYW5zZm9ybWVycy5hZGRFbGVtZW50KHRyYW5zZm9ybWVyKTsKKyAgICAgICAgdHJhbnNmb3JtZXJzLmFkZCh0cmFuc2Zvcm1lcik7CiAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcjsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGFnZ3JlZ2F0ZWQgcmVzdWx0cyBmaWxlLiBJdCBtdXN0IGJlIHJlbGF0aXZlCi0gICAgICogZnJvbSB0aGUgPHR0PnRvZGlyPC90dD4gYXR0cmlidXRlLiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHtAbGluayAjREVGQVVMVF9GSUxFTkFNRX0KKyAgICAgKiBmcm9tIHRoZSA8Y29kZT50b2RpcjwvY29kZT4gYXR0cmlidXRlLiBJZiBub3Qgc2V0IGl0IHdpbGwgdXNlIHtAbGluayAjREVGQVVMVF9GSUxFTkFNRX0KICAgICAgKiBAcGFyYW0gIHZhbHVlICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCiAgICAgICogQHNlZSAjc2V0VG9kaXIoRmlsZSkKICAgICAgKi8KQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgICAqIEBwYXJhbSAgICBmcyAgICAgIHRoZSBuZXcgZmlsZXNldCBvZiB4bWwgcmVzdWx0cy4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU2V0KEZpbGVTZXQgZnMpIHsKLSAgICAgICAgZmlsZXNldHMuYWRkRWxlbWVudChmcyk7CisgICAgICAgIGZpbGVzZXRzLmFkZChmcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDEsNiArMTQxLDcgQEAKICAgICAgKiBAdGhyb3dzICBCdWlsZEV4Y2VwdGlvbiAgdGhyb3duIGlmIHRoZXJlIGlzIGEgc2VyaW91cyBlcnJvciB3aGlsZSB3cml0aW5nCiAgICAgICogICAgICAgICAgdGhlIGRvY3VtZW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKICAgICAgICAgRmlsZSBkZXN0RmlsZSA9IGdldERlc3RpbmF0aW9uRmlsZSgpOwpAQCAtMTUxLDEwICsxNTIsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgdGVzdCBhZ2dyZWdhdGUgdG8gJyIgKyBkZXN0RmlsZSArICInIiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gYXBwbHkgdHJhbnNmb3JtYXRpb24KLSAgICAgICAgRW51bWVyYXRpb24gZSA9IHRyYW5zZm9ybWVycy5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgQWdncmVnYXRlVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPQotICAgICAgICAgICAgICAgIChBZ2dyZWdhdGVUcmFuc2Zvcm1lcikgZS5uZXh0RWxlbWVudCgpOworICAgICAgICBmb3IgKEFnZ3JlZ2F0ZVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyIDogdHJhbnNmb3JtZXJzKSB7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRYbWxEb2N1bWVudChyb290RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKCk7CiAgICAgICAgIH0KQEAgLTE2Miw3ICsxNjAsNyBAQAogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBmdWxsIGRlc3RpbmF0aW9uIGZpbGUgd2hlcmUgdG8gd3JpdGUgdGhlIHJlc3VsdC4gSXQgaXMgbWFkZSBvZgotICAgICAqIHRoZSA8dHQ+dG9kaXI8L3R0PiBhbmQgPHR0PnRvZmlsZTwvdHQ+IGF0dHJpYnV0ZXMuCisgICAgICogdGhlIDxjb2RlPnRvZGlyPC9jb2RlPiBhbmQgPGNvZGU+dG9maWxlPC9jb2RlPiBhdHRyaWJ1dGVzLgogICAgICAqIEByZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGZpbGUgd2hlcmUgc2hvdWxkIGJlIHdyaXR0ZW4gdGhlIHJlc3VsdCBmaWxlLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlIGdldERlc3RpbmF0aW9uRmlsZSgpIHsKQEAgLTE4MSwyNiArMTc5LDE0IEBACiAgICAgICogQHJldHVybiBhbGwgZmlsZXMgaW4gdGhlIGZpbGVzZXQgdGhhdCBlbmQgd2l0aCBhICcueG1sJy4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmlsZVtdIGdldEZpbGVzKCkgewotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWxlc2V0cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVzZXRzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBmcy5nZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7CisgICAgICAgIFByb2plY3QgcCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgcmV0dXJuIGZpbGVzZXRzLnN0cmVhbSgpLmZsYXRNYXAoZnMgLT4geworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIocCk7CiAgICAgICAgICAgICBkcy5zY2FuKCk7Ci0gICAgICAgICAgICBTdHJpbmdbXSBmID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmLmxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGhuYW1lID0gZltqXTsKLSAgICAgICAgICAgICAgICBpZiAocGF0aG5hbWUuZW5kc1dpdGgoIi54bWwiKSkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkcy5nZXRCYXNlZGlyKCksIHBhdGhuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGdldFByb2plY3QoKS5yZXNvbHZlRmlsZShmaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuYWRkRWxlbWVudChmaWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZVt2LnNpemUoKV07Ci0gICAgICAgIHYuY29weUludG8oZmlsZXMpOwotICAgICAgICByZXR1cm4gZmlsZXM7CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtLm9mKGRzLmdldEluY2x1ZGVkRmlsZXMoKSkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKHBhdGhuYW1lIC0+IHBhdGhuYW1lLmVuZHNXaXRoKCIueG1sIikpCisgICAgICAgICAgICAgICAgICAgIC5tYXAocGF0aG5hbWUgLT4gcC5yZXNvbHZlRmlsZShuZXcgRmlsZShkcy5nZXRCYXNlZGlyKCksIHBhdGhuYW1lKS5nZXRQYXRoKCkpKTsKKyAgICAgICAgfSkudG9BcnJheShGaWxlW106Om5ldyk7CiAgICAgfQogCiAgICAgLy8tLS0tLSBmcm9tIG5vdywgdGhlIG1ldGhvZHMgYXJlIGFsbCByZWxhdGVkIHRvIERPTSB0cmVlIG1hbmlwdWxhdGlvbgpAQCAtMjEyLDE4ICsxOTgsMTcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSB3cml0aW5nIHRoZSBjb250ZW50LgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlRE9NVHJlZShEb2N1bWVudCBkb2MsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBQcmludFdyaXRlciB3cmkgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3MpLCAiVVRGOCIpKTsKKyAgICAgICAgdHJ5IChQcmludFdyaXRlciB3cmkgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oRmlsZXMubmV3T3V0cHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKSwKKyAgICAgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVURl84KSkpIHsKICAgICAgICAgICAgIHdyaS53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICAgICAgICAobmV3IERPTUVsZW1lbnRXcml0ZXIoKSkud3JpdGUoZG9jLmdldERvY3VtZW50RWxlbWVudCgpLCB3cmksIDAsICIgICIpOworICAgICAgICAgICAgbmV3IERPTUVsZW1lbnRXcml0ZXIoKS53cml0ZShkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIHdyaSwgMCwKKyAgICAgICAgICAgICAgICAiICAiKTsKICAgICAgICAgICAgIHdyaS5mbHVzaCgpOwogICAgICAgICAgICAgLy8gd3JpdGVycyBkbyBub3QgdGhyb3cgZXhjZXB0aW9ucywgc28gY2hlY2sgZm9yIHRoZW0uCiAgICAgICAgICAgICBpZiAod3JpLmNoZWNrRXJyb3IoKSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3Igd2hpbGUgd3JpdGluZyBET00gY29udGVudCIpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgb3MuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjg1LDEwICsyNzAsMTAgQEAKICAgICAgKiA8cD5BZGQgYSBuZXcgdGVzdHN1aXRlIG5vZGUgdG8gdGhlIGRvY3VtZW50LgogICAgICAqIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBpdAogICAgICAqIHNwbGl0IHRoZSBwcmV2aW91cyBmdWxseSBxdWFsaWZpZWQgbmFtZSBpbnRvIGEgcGFja2FnZSBhbmQgYSBuYW1lLjwvcD4KLSAgICAgKiA8cD5Gb3IgZXhhbXBsZTogPHR0Pm9yZy5hcGFjaGUuV2hhdGV2ZXI8L3R0PiB3aWxsIGJlIHNwbGl0IGludG8KLSAgICAgKiA8dHQ+b3JnLmFwYWNoZTwvdHQ+IGFuZCA8dHQ+V2hhdGV2ZXI8L3R0Pi48L3A+CisgICAgICogPHA+Rm9yIGV4YW1wbGU6IDxjb2RlPm9yZy5hcGFjaGUuV2hhdGV2ZXI8L2NvZGU+IHdpbGwgYmUgc3BsaXQgaW50bworICAgICAqIDxjb2RlPm9yZy5hcGFjaGU8L2NvZGU+IGFuZCA8Y29kZT5XaGF0ZXZlcjwvY29kZT4uPC9wPgogICAgICAqCi0gICAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3QgZWxlbWVudCB0byB3aGljaCB0aGUgPHR0PnRlc3RzdWl0ZTwvdHQ+IG5vZGUgc2hvdWxkCisgICAgICogQHBhcmFtIHJvb3QgdGhlIHJvb3QgZWxlbWVudCB0byB3aGljaCB0aGUgPGNvZGU+dGVzdHN1aXRlPC9jb2RlPiBub2RlIHNob3VsZAogICAgICAqICAgICAgICBiZSBhcHBlbmRlZC4KICAgICAgKiBAcGFyYW0gdGVzdHN1aXRlIHRoZSBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUgZ2l2ZW4gcm9vdC4gSXQgd2lsbCBzbGlnaHRseQogICAgICAqICAgICAgICBtb2RpZnkgdGhlIG9yaWdpbmFsIG5vZGUgdG8gY2hhbmdlIHRoZSBuYW1lIGF0dHJpYnV0ZSBhbmQgYWRkCkBAIC0zMTAsNyArMjk1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgZG9jdW1lbnQgYnVpbGRlci4gV2lsbCBpc3N1ZSBhbiA8dHQ+RXhjZXB0aW9uSW5pdGlhbGl6ZXJFcnJvcjwvdHQ+CisgICAgICogQ3JlYXRlIGEgbmV3IGRvY3VtZW50IGJ1aWxkZXIuIFdpbGwgaXNzdWUgYW4gPGNvZGU+RXhjZXB0aW9uSW5pdGlhbGl6ZXJFcnJvcjwvY29kZT4KICAgICAgKiBpZiBzb21ldGhpbmcgaXMgZ29pbmcgd3JvbmcuIEl0IGlzIGZhdGFsIGFueXdheS4KICAgICAgKiBAdG9kbyBmYWN0b3JpemUgdGhpcyBzb21ld2hlcmUgZWxzZS4gSXQgaXMgZHVwbGljYXRlZCBjb2RlLgogICAgICAqIEByZXR1cm4gYSBuZXcgZG9jdW1lbnQgYnVpbGRlciB0byBjcmVhdGUgYSBET00KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvQWJzdHJhY3RKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9BYnN0cmFjdEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ODQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvQWJzdHJhY3RKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCkBAIC0wLDAgKzEsMzA2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlRlc3RTb3VyY2U7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5zdXBwb3J0LmRlc2NyaXB0b3IuQ2xhc3NTb3VyY2U7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLlRlc3RJZGVudGlmaWVyOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0UGxhbjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworLyoqCisgKiBDb250YWlucyBzb21lIGNvbW1vbiBiZWhhdmlvdXIgdGhhdCdzIHVzZWQgYnkgb3VyIGludGVybmFsIHtAbGluayBUZXN0UmVzdWx0Rm9ybWF0dGVyfXMKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKVW5pdFJlc3VsdEZvcm1hdHRlciBpbXBsZW1lbnRzIFRlc3RSZXN1bHRGb3JtYXR0ZXIgeworCisgICAgcHJvdGVjdGVkIFRlc3RFeGVjdXRpb25Db250ZXh0IGNvbnRleHQ7CisKKyAgICBwcml2YXRlIFN5c091dEVyckNvbnRlbnRTdG9yZSBzeXNPdXRTdG9yZTsKKyAgICBwcml2YXRlIFN5c091dEVyckNvbnRlbnRTdG9yZSBzeXNFcnJTdG9yZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN5c091dEF2YWlsYWJsZShmaW5hbCBieXRlW10gZGF0YSkgeworICAgICAgICBpZiAodGhpcy5zeXNPdXRTdG9yZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnN5c091dFN0b3JlID0gbmV3IFN5c091dEVyckNvbnRlbnRTdG9yZSh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5zeXNPdXRTdG9yZS5zdG9yZShkYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3lzRXJyQXZhaWxhYmxlKGZpbmFsIGJ5dGVbXSBkYXRhKSB7CisgICAgICAgIGlmICh0aGlzLnN5c0VyclN0b3JlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuc3lzRXJyU3RvcmUgPSBuZXcgU3lzT3V0RXJyQ29udGVudFN0b3JlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5zeXNFcnJTdG9yZS5zdG9yZShkYXRhKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBUZXN0RXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhbnkgc3Rkb3V0IGRhdGEsIHRoYXQgd2FzIGdlbmVyYXRlZCBkdXJpbmcgdGhlCisgICAgICogdGVzdHMsIGlzIGF2YWlsYWJsZSBmb3IgdXNlLiBFbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgYm9vbGVhbiBoYXNTeXNPdXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN5c091dFN0b3JlICE9IG51bGwgJiYgdGhpcy5zeXNPdXRTdG9yZS5oYXNEYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhbnkgc3RkZXJyIGRhdGEsIHRoYXQgd2FzIGdlbmVyYXRlZCBkdXJpbmcgdGhlCisgICAgICogdGVzdHMsIGlzIGF2YWlsYWJsZSBmb3IgdXNlLiBFbHNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgYm9vbGVhbiBoYXNTeXNFcnIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN5c0VyclN0b3JlICE9IG51bGwgJiYgdGhpcy5zeXNFcnJTdG9yZS5oYXNEYXRhKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIGEge0BsaW5rIFJlYWRlcn0gZm9yIHJlYWRpbmcgYW55IHN0ZG91dCBkYXRhIHRoYXQgd2FzIGdlbmVyYXRlZAorICAgICAqIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHtAbGluayAjaGFzU3lzT3V0KCl9IGJlIGZpcnN0CisgICAgICogY2FsbGVkIHRvIHNlZSBpZiBhbnkgc3VjaCBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgb25seSBpZiB0aGVyZSBpcywgdGhlbiB0aGlzIG1ldGhvZAorICAgICAqIGJlIGNhbGxlZAorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlcmUncyBhbnkgSS9PIHByb2JsZW0gd2hpbGUgY3JlYXRpbmcgdGhlIHtAbGluayBSZWFkZXJ9CisgICAgICovCisgICAgUmVhZGVyIGdldFN5c091dFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLnN5c091dFN0b3JlLmdldFJlYWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBhIHtAbGluayBSZWFkZXJ9IGZvciByZWFkaW5nIGFueSBzdGRlcnIgZGF0YSB0aGF0IHdhcyBnZW5lcmF0ZWQKKyAgICAgKiBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSB7QGxpbmsgI2hhc1N5c0VycigpfSBiZSBmaXJzdAorICAgICAqIGNhbGxlZCB0byBzZWUgaWYgYW55IHN1Y2ggZGF0YSBpcyBhdmFpbGFibGUgYW5kIG9ubHkgaWYgdGhlcmUgaXMsIHRoZW4gdGhpcyBtZXRob2QKKyAgICAgKiBiZSBjYWxsZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZXJlJ3MgYW55IEkvTyBwcm9ibGVtIHdoaWxlIGNyZWF0aW5nIHRoZSB7QGxpbmsgUmVhZGVyfQorICAgICAqLworICAgIFJlYWRlciBnZXRTeXNFcnJSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5zeXNFcnJTdG9yZS5nZXRSZWFkZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgb3V0IGFueSBzdGRvdXQgZGF0YSB0aGF0IHdhcyBnZW5lcmF0ZWQgZHVyaW5nIHRoZQorICAgICAqIHRlc3QgZXhlY3V0aW9uLiBJZiB0aGVyZSB3YXMgbm8gc3VjaCBkYXRhIHRoZW4gdGhpcyBtZXRob2QganVzdCByZXR1cm5zLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlciBUaGUge0BsaW5rIFdyaXRlcn0gdG8gdXNlLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGFueSBJL08gcHJvYmxlbSBvY2N1cnMgZHVyaW5nIHdyaXRpbmcgdGhlIGRhdGEKKyAgICAgKi8KKyAgICB2b2lkIHdyaXRlU3lzT3V0KGZpbmFsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwod3JpdGVyLCAiV3JpdGVyIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIHRoaXMud3JpdGVGcm9tKHRoaXMuc3lzT3V0U3RvcmUsIHdyaXRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIG91dCBhbnkgc3RkZXJyIGRhdGEgdGhhdCB3YXMgZ2VuZXJhdGVkIGR1cmluZyB0aGUKKyAgICAgKiB0ZXN0IGV4ZWN1dGlvbi4gSWYgdGhlcmUgd2FzIG5vIHN1Y2ggZGF0YSB0aGVuIHRoaXMgbWV0aG9kIGp1c3QgcmV0dXJucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZXIgVGhlIHtAbGluayBXcml0ZXJ9IHRvIHVzZS4gQ2Fubm90IGJlIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhbnkgSS9PIHByb2JsZW0gb2NjdXJzIGR1cmluZyB3cml0aW5nIHRoZSBkYXRhCisgICAgICovCisgICAgdm9pZCB3cml0ZVN5c0VycihmaW5hbCBXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHdyaXRlciwgIldyaXRlciBjYW5ub3QgYmUgbnVsbCIpOworICAgICAgICB0aGlzLndyaXRlRnJvbSh0aGlzLnN5c0VyclN0b3JlLCB3cml0ZXIpOworICAgIH0KKworICAgIHN0YXRpYyBPcHRpb25hbDxUZXN0SWRlbnRpZmllcj4gdHJhdmVyc2VBbmRGaW5kVGVzdENsYXNzKGZpbmFsIFRlc3RQbGFuIHRlc3RQbGFuLCBmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcikgeworICAgICAgICBpZiAoaXNUZXN0Q2xhc3ModGVzdElkZW50aWZpZXIpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YodGVzdElkZW50aWZpZXIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE9wdGlvbmFsPFRlc3RJZGVudGlmaWVyPiBwYXJlbnQgPSB0ZXN0UGxhbi5nZXRQYXJlbnQodGVzdElkZW50aWZpZXIpOworICAgICAgICByZXR1cm4gcGFyZW50LmlzUHJlc2VudCgpID8gdHJhdmVyc2VBbmRGaW5kVGVzdENsYXNzKHRlc3RQbGFuLCBwYXJlbnQuZ2V0KCkpIDogT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgT3B0aW9uYWw8Q2xhc3NTb3VyY2U+IGlzVGVzdENsYXNzKGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyKSB7CisgICAgICAgIGlmICh0ZXN0SWRlbnRpZmllciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBPcHRpb25hbDxUZXN0U291cmNlPiBzb3VyY2UgPSB0ZXN0SWRlbnRpZmllci5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKCFzb3VyY2UuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFRlc3RTb3VyY2UgdGVzdFNvdXJjZSA9IHNvdXJjZS5nZXQoKTsKKyAgICAgICAgaWYgKHRlc3RTb3VyY2UgaW5zdGFuY2VvZiBDbGFzc1NvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKChDbGFzc1NvdXJjZSkgdGVzdFNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRnJvbShmaW5hbCBTeXNPdXRFcnJDb250ZW50U3RvcmUgc3RvcmUsIGZpbmFsIFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwMjRdOworICAgICAgICBpbnQgbnVtUmVhZCA9IC0xOworICAgICAgICB0cnkgKGZpbmFsIFJlYWRlciByZWFkZXIgPSBzdG9yZS5nZXRSZWFkZXIoKSkgeworICAgICAgICAgICAgd2hpbGUgKChudW1SZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjaGFycywgMCwgbnVtUmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZSh0aGlzLnN5c091dFN0b3JlKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHRoaXMuc3lzRXJyU3RvcmUpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGhhbmRsZUV4Y2VwdGlvbihmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAvLyB3ZSBjdXJyZW50bHkganVzdCBsb2cgaXQgYW5kIG1vdmUgb24uCisgICAgICAgIHRoaXMuY29udGV4dC5nZXRQcm9qZWN0KCkuaWZQcmVzZW50KChwKSAtPiBwLmxvZygiRXhjZXB0aW9uIGluIGxpc3RlbmVyICIKKyAgICAgICAgICAgICAgICArIEFic3RyYWN0SlVuaXRSZXN1bHRGb3JtYXR0ZXIudGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSwgdCwgUHJvamVjdC5NU0dfREVCVUcpKTsKKyAgICB9CisKKworICAgIC8qCisgICAgQSAic3RvcmUiIGZvciBzeXNvdXQvc3lzZXJyIGNvbnRlbnQgdGhhdCBnZXRzIHNlbnQgdG8gdGhlIEFic3RyYWN0SlVuaXRSZXN1bHRGb3JtYXR0ZXIuCisgICAgVGhpcyBzdG9yZSBmaXJzdCB1c2VzIGEgcmVsYXRpdmVseSBkZWNlbnQgc2l6ZWQgaW4tbWVtb3J5IGJ1ZmZlciBmb3Igc3RvcmluZyB0aGUgc3lzb3V0L3N5c2VycgorICAgIGNvbnRlbnQuIFRoaXMgaW4tbWVtb3J5IGJ1ZmZlciB3aWxsIGJlIHVzZWQgYXMgbG9uZyBhcyBpdCBjYW4gZml0IGluIHRoZSBuZXcgY29udGVudCB0aGF0CisgICAga2VlcHMgY29taW5nIGluLiBXaGVuIHRoZSBzaXplIGxpbWl0IGlzIHJlYWNoZWQsIHRoaXMgc3RvcmUgc3dpdGNoZXMgdG8gYSBmaWxlIGJhc2VkIHN0b3JlCisgICAgYnkgY3JlYXRpbmcgYSB0ZW1wb3JhcmlseSBmaWxlIGFuZCB3cml0aW5nIG91dCB0aGUgYWxyZWFkeSBpbi1tZW1vcnkgaGVsZCBidWZmZXIgY29udGVudAorICAgIGFuZCBhbnkgbmV3IGNvbnRlbnQgdGhhdCBrZWVwcyBhcnJpdmluZyB0byB0aGlzIHN0b3JlLiBPbmNlIHRoZSBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQsCisgICAgdGhlIGluLW1lbW9yeSBidWZmZXIgd2lsbCBuZXZlciBiZSB1c2VkIGFueSBtb3JlIGFuZCBpbiBmYWN0IGlzIGRlc3Ryb3llZCBhcyBzb29uIGFzIHRoZQorICAgIGZpbGUgaXMgY3JlYXRlZC4KKyAgICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgbm90IHRocmVhZC1zYWZlIGFuZCB1c2VycyBvZiB0aGlzIGNsYXNzIGFyZSBleHBlY3RlZCB0byB1c2UgbmVjZXNzYXJ5IHRocmVhZAorICAgIHNhZmV0eSBndWFyYW50ZWVzLCBpZiB0aGV5IHdhbnQgdG8gdXNlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYnkgbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFN5c091dEVyckNvbnRlbnRTdG9yZSBpbXBsZW1lbnRzIENsb3NlYWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZX0lOX0JZVEVTID0gNTAgKiAxMDI0OyAvLyA1MCBLQgorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWFkZXIgRU1QVFlfUkVBREVSID0gbmV3IFJlYWRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGNoYXJbXSBjYnVmLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG1wRmlsZVN1ZmZpeDsKKyAgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGluTWVtb3J5U3RvcmUgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKERFRkFVTFRfQ0FQQUNJVFlfSU5fQllURVMpOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNpbmdGaWxlU3RvcmUgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBQYXRoIGZpbGVQYXRoOworICAgICAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gZmlsZU91dHB1dFN0cmVhbTsKKworICAgICAgICBwcml2YXRlIFN5c091dEVyckNvbnRlbnRTdG9yZShmaW5hbCBib29sZWFuIGlzU3lzT3V0KSB7CisgICAgICAgICAgICB0aGlzLnRtcEZpbGVTdWZmaXggPSBpc1N5c091dCA/ICIuc3lzb3V0IiA6ICIuc3lzZXJyIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzdG9yZShmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnVzaW5nRmlsZVN0b3JlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdG9yZVRvRmlsZShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCB5ZXQgY3JlYXRlZCBhIGZpbGUgc3RvcmUgYW5kIHRoZSBkYXRhIGNhbiBmaXQgaW4gbWVtb3J5LAorICAgICAgICAgICAgLy8gc28gd2Ugd3JpdGUgaXQgaW4gb3VyIGJ1ZmZlcgorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmluTWVtb3J5U3RvcmUucHV0KGRhdGEpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGJvZSkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgY2FwYWNpdHkgY2FuJ3QgaG9sZCB0aGlzIGluY29taW5nIGRhdGEsIHNvIHRoaXMKKyAgICAgICAgICAgICAgICAvLyBpbmNvbWluZyBkYXRhIGhhc24ndCBiZWVuIHRyYW5zZmVycmVkIHRvIHRoZSBidWZmZXIuIGxldCdzCisgICAgICAgICAgICAgICAgLy8gbm93IGZhbGwgYmFjayB0byBhIGZpbGUgc3RvcmUKKyAgICAgICAgICAgICAgICB0aGlzLnVzaW5nRmlsZVN0b3JlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjb250ZW50IGNvdWxkbid0IGJlIHRyYW5zZmVycmVkIGludG8gaW4tbWVtb3J5IGJ1ZmZlciwKKyAgICAgICAgICAgIC8vIHdlIG5vdyBjcmVhdGUgYSBmaWxlIGFuZCB0cmFuc2ZlciBhbHJlYWR5IChwcmV2aW91c2x5KSBzdG9yZWQgaW4tbWVtb3J5CisgICAgICAgICAgICAvLyBjb250ZW50IGludG8gdGhhdCBmaWxlLCBiZWZvcmUgZmluYWxseSB0cmFuc2ZlcnJpbmcgdGhpcyBuZXcgY29udGVudAorICAgICAgICAgICAgLy8gaW50byB0aGUgZmlsZSB0b28uIFdlIHRoZW4gZmluYWxseSBkaXNjYXJkIHRoaXMgaW4tbWVtb3J5IGJ1ZmZlciBhbmQKKyAgICAgICAgICAgIC8vIGp1c3Qga2VlcCB1c2luZyB0aGUgZmlsZSBzdG9yZSBpbnN0ZWFkCisgICAgICAgICAgICB0aGlzLmZpbGVPdXRwdXRTdHJlYW0gPSBjcmVhdGVGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIC8vIGZpcnN0IHRoZSBleGlzdGluZyBpbi1tZW1vcnkgY29udGVudAorICAgICAgICAgICAgc3RvcmVUb0ZpbGUodGhpcy5pbk1lbW9yeVN0b3JlLmFycmF5KCksIDAsIHRoaXMuaW5NZW1vcnlTdG9yZS5wb3NpdGlvbigpKTsKKyAgICAgICAgICAgIHN0b3JlVG9GaWxlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICAgICAgICAgIC8vIGRpc2NhcmQgdGhlIGluLW1lbW9yeSBzdG9yZQorICAgICAgICAgICAgdGhpcy5pbk1lbW9yeVN0b3JlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzdG9yZVRvRmlsZShmaW5hbCBieXRlW10gZGF0YSwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmZpbGVPdXRwdXRTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGJhY2tpbmcgZmlsZSB3YXMgY3JlYXRlZCBzbyB3ZSBjYW4ndCBkbyBhbnl0aGluZworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuZmlsZU91dHB1dFN0cmVhbS53cml0ZShkYXRhLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gY3JlYXRlRmlsZVN0b3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZVBhdGggPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkKKyAgICAgICAgICAgICAgICAuY3JlYXRlVGVtcEZpbGUobnVsbCwgdGhpcy50bXBGaWxlU3VmZml4LCBudWxsLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgICAgIC50b1BhdGgoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZU91dHB1dFN0cmVhbSh0aGlzLmZpbGVQYXRoLnRvRmlsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFJldHVybnMgYSBSZWFkZXIgZm9yIHJlYWRpbmcgdGhlIHN5c291dC9zeXNlcnIgY29udGVudC4gSWYgdGhlcmUncyBubyBkYXRhCisgICAgICAgICAqIGF2YWlsYWJsZSBpbiB0aGlzIHN0b3JlLCB0aGVuIHRoaXMgcmV0dXJucyBhIFJlYWRlciB3aGljaCB3aGVuIHVzZWQgZm9yIHJlYWQgb3BlcmF0aW9ucywKKyAgICAgICAgICogd2lsbCBpbW1lZGlhdGVseSBpbmRpY2F0ZSBhbiBFT0YuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHRoaXMudXNpbmdGaWxlU3RvcmUgJiYgdGhpcy5maWxlUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgdXNlIGEgRmlsZVJlYWRlciBoZXJlIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHQgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgLy8gZW5jb2RpbmcgZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9uIHN5c291dC9zeXNlcnIgc3RyZWFtLCBzaW5jZSB0aGF0J3MgdGhlCisgICAgICAgICAgICAgICAgLy8gZW5jb2RpbmcgdGhhdCBTeXN0ZW0ub3V0L1N5c3RlbS5lcnIgdXNlcyB0byB3cml0ZSBvdXQgdGhlIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcih0aGlzLmZpbGVQYXRoLnRvRmlsZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5pbk1lbW9yeVN0b3JlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0aGlzLmluTWVtb3J5U3RvcmUuYXJyYXkoKSwgMCwgdGhpcy5pbk1lbW9yeVN0b3JlLnBvc2l0aW9uKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vIGRhdGEgdG8gcmVhZCwgc28gd2UgcmV0dXJuIGFuICJlbXB0eSIgcmVhZGVyCisgICAgICAgICAgICByZXR1cm4gRU1QVFlfUkVBREVSOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0b3JlIGhhcyBhbnkgZGF0YSAoZWl0aGVyIGluLW1lbW9yeSBvciBpbiBhIGZpbGUpLiBFbHNlCisgICAgICAgICAqICByZXR1cm5zIGZhbHNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0RhdGEoKSB7CisgICAgICAgICAgICBpZiAodGhpcy5pbk1lbW9yeVN0b3JlICE9IG51bGwgJiYgdGhpcy5pbk1lbW9yeVN0b3JlLnBvc2l0aW9uKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpcy51c2luZ0ZpbGVTdG9yZSAmJiB0aGlzLmZpbGVQYXRoICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5pbk1lbW9yeVN0b3JlID0gbnVsbDsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZSh0aGlzLmZpbGVPdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZSh0aGlzLmZpbGVQYXRoLnRvRmlsZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvSW5WTUV4ZWN1dGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9JblZNRXhlY3V0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1MzA1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvSW5WTUV4ZWN1dGlvbi5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5KVW5pdExhdW5jaGVyVGFzazsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBVc2VkIGR1cmluZyBpbi12bSAobm9uLWZvcmtlZCBtb2RlKSBsYXVuY2hpbmcgb2YgdGVzdHMKKyAqLworcHVibGljIGNsYXNzIEluVk1FeGVjdXRpb24gaW1wbGVtZW50cyBUZXN0RXhlY3V0aW9uQ29udGV4dCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEpVbml0TGF1bmNoZXJUYXNrIHRhc2s7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzOworCisgICAgcHVibGljIEluVk1FeGVjdXRpb24oZmluYWwgSlVuaXRMYXVuY2hlclRhc2sgdGFzaykgeworICAgICAgICB0aGlzLnRhc2sgPSB0YXNrOworICAgICAgICB0aGlzLnByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgdGhpcy5wcm9wcy5wdXRBbGwodGFzay5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wcm9wczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3B0aW9uYWw8UHJvamVjdD4gZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKHRoaXMudGFzay5nZXRQcm9qZWN0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvTGF1bmNoZXJTdXBwb3J0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xhdW5jaGVyU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmE5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xhdW5jaGVyU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNjM1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXI7CisKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkxhdW5jaERlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5MaXN0ZW5lckRlZmluaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5OYW1lZFRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5TaW5nbGVUZXN0Q2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5UZXN0Q2xhc3NlczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLlRlc3REZWZpbml0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuS2VlcEFsaXZlT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuZGlzY292ZXJ5LkRpc2NvdmVyeVNlbGVjdG9yczsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuRW5naW5lRmlsdGVyOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5MYXVuY2hlcjsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuTGF1bmNoZXJEaXNjb3ZlcnlSZXF1ZXN0OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UYWdGaWx0ZXI7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLlRlc3RFeGVjdXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuVGVzdFBsYW47CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLmNvcmUuTGF1bmNoZXJEaXNjb3ZlcnlSZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuY29yZS5MYXVuY2hlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLmxpc3RlbmVycy5TdW1tYXJ5R2VuZXJhdGluZ0xpc3RlbmVyOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5saXN0ZW5lcnMuVGVzdEV4ZWN1dGlvblN1bW1hcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QaXBlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUGlwZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIFJlc3BvbnNpYmxlIGZvciBkb2luZyB0aGUgcmVhbCB3b3JrIGludm9sdmVkIGluIGxhdW5jaGluZyB0aGUgSlVuaXQgcGxhdGZvcm0KKyAqIGFuZCBwYXNzaW5nIGl0IHRoZSByZWxldmFudCB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIEpVbml0IHBsYXRmb3JtLgorICogPHA+CisgKiBUaGlzIGNsYXNzIHJlbGllcyBvbiBhIHtAbGluayBMYXVuY2hEZWZpbml0aW9ufSBmb3Igc2V0dGluZyB1cCB0aGUgbGF1bmNoIG9mIHRoZQorICogSlVuaXQgcGxhdGZvcm0uCisgKiA8cD4KKyAqIFRoZSB7QGNvZGUgTGF1bmNoZXJTdXBwb3J0fSBpc24ndCBjb25jZXJuZWQgd2l0aCB3aGV0aGVyIG9yIG5vdAorICogaXQncyBiZWluZyBleGVjdXRlZCBpbiB0aGUgc2FtZSBKVk0gYXMgdGhlIGJ1aWxkIGluIHdoaWNoIHRoZSB7QGNvZGUganVuaXRsYXVuY2hlcn0KKyAqIHdhcyB0cmlnZ2VyZWQgb3IgaWYgaXQncyBydW5uaW5nIGFzIHBhcnQgb2YgYSBmb3JrZWQgSlZNLiBJbnN0ZWFkIGl0IGp1c3QgcmVsaWVzCisgKiBvbiB0aGUge0Bjb2RlIExhdW5jaERlZmluaXRpb259IHRvIGRvIHdoYXRldmVyIGRlY2lzaW9ucyBuZWVkIHRvIGJlIGRvbmUgYmVmb3JlIGFuZAorICogYWZ0ZXIgbGF1bmNoaW5nIHRoZSB0ZXN0cy4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUgYW5kIGlzbid0IGV4cGVjdGVkIHRvIGJlIHVzZWQgZm9yIGxhdW5jaGluZyBmcm9tCisgKiBtdWx0aXBsZSBkaWZmZXJlbnQgdGhyZWFkcyBzaW11bHRhbmVvdXNseS4KKyAqIDxwPlRoaXMgY2xhc3MgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBBbnQgcHJvamVjdCBhbmQgYWx0aG91Z2gKKyAqIGl0J3MgYSBwdWJsaWMgY2xhc3MsIGl0IGlzbid0IG1lYW50IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB0aGlzIHByb2plY3QuIFRoaXMgY2xhc3MKKyAqIGNhbiBiZSBjaGFuZ2VkLCBhY3Jvc3MgcmVsZWFzZXMsIHdpdGhvdXQgYW55IGJhY2t3YXJkIGNvbXBhdGlibGUgZ3VhcmFudGVlcyBhbmQgaGVuY2UKKyAqIHNob3VsZG4ndCBiZSB1c2VkIG9yIHJlbGllZCB1cG9uIG91dHNpZGUgb2YgdGhpcyBwcm9qZWN0LgorICovCitwdWJsaWMgY2xhc3MgTGF1bmNoZXJTdXBwb3J0IHsKKworICAgIHByaXZhdGUgZmluYWwgTGF1bmNoRGVmaW5pdGlvbiBsYXVuY2hEZWZpbml0aW9uOworICAgIHByaXZhdGUgZmluYWwgVGVzdEV4ZWN1dGlvbkNvbnRleHQgdGVzdEV4ZWN1dGlvbkNvbnRleHQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdGVzdHNGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgTGF1bmNoZXJTdXBwb3J0fSBmb3IgdGhlIHBhc3NlZCB7QGxpbmsgTGF1bmNoRGVmaW5pdGlvbn0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZpbml0aW9uICAgICAgICAgICBUaGUgbGF1bmNoIGRlZmluaXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBsYXVuY2hpbmcgdGhlIHRlc3RzCisgICAgICogQHBhcmFtIHRlc3RFeGVjdXRpb25Db250ZXh0IFRoZSB7QGxpbmsgVGVzdEV4ZWN1dGlvbkNvbnRleHR9IHRvIHVzZSBmb3IgdGhlIHRlc3RzCisgICAgICovCisgICAgcHVibGljIExhdW5jaGVyU3VwcG9ydChmaW5hbCBMYXVuY2hEZWZpbml0aW9uIGRlZmluaXRpb24sIGZpbmFsIFRlc3RFeGVjdXRpb25Db250ZXh0IHRlc3RFeGVjdXRpb25Db250ZXh0KSB7CisgICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxhdW5jaCBkZWZpbml0aW9uIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRlc3RFeGVjdXRpb25Db250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlc3QgZXhlY3V0aW9uIGNvbnRleHQgY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmxhdW5jaERlZmluaXRpb24gPSBkZWZpbml0aW9uOworICAgICAgICB0aGlzLnRlc3RFeGVjdXRpb25Db250ZXh0ID0gdGVzdEV4ZWN1dGlvbkNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTGF1bmNoZXMgdGhlIHRlc3RzIGRlZmluZWQgaW4gdGhlIHtAbGluayBMYXVuY2hEZWZpbml0aW9ufQorICAgICAqCisgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBJZiBhbnkgdGVzdHMgZmFpbGVkIGFuZCB0aGUgbGF1bmNoIGRlZmluaXRpb24gd2FzIGNvbmZpZ3VyZWQgdG8gdGhyb3cKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiwgb3IgaWYgYW55IG90aGVyIGV4Y2VwdGlvbiBvY2N1cnJlZCBiZWZvcmUgb3IgYWZ0ZXIgbGF1bmNoaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsYXVuY2goKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBwcmV2aW91c0NsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRoaXMubGF1bmNoRGVmaW5pdGlvbi5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgICAgIGZpbmFsIExhdW5jaGVyIGxhdW5jaGVyID0gTGF1bmNoZXJGYWN0b3J5LmNyZWF0ZSgpOworICAgICAgICAgICAgZmluYWwgTGlzdDxUZXN0UmVxdWVzdD4gcmVxdWVzdHMgPSBidWlsZFRlc3RSZXF1ZXN0cygpOworICAgICAgICAgICAgZm9yIChmaW5hbCBUZXN0UmVxdWVzdCB0ZXN0UmVxdWVzdCA6IHJlcXVlc3RzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdERlZmluaXRpb24gdGVzdCA9IHRlc3RSZXF1ZXN0LmdldE93bmVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhdW5jaGVyRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gdGVzdFJlcXVlc3QuZ2V0RGlzY292ZXJ5UmVxdWVzdCgpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VGVzdEV4ZWN1dGlvbkxpc3RlbmVyPiB0ZXN0RXhlY3V0aW9uTGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGEgbGlzdGVuZXIgdGhhdCB3ZSBhbHdheXMgcHV0IGF0IHRoZSBmcm9udCBvZiBsaXN0IG9mIGxpc3RlbmVycworICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0ZW5lciBmaXJzdExpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBlbnJvbGwgdGhlIHN1bW1hcnkgZ2VuZXJhdGluZyBsaXN0ZW5lciwgdG8gdGhlIHJlcXVlc3QsIHNvIHRoYXQgd2UKKyAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRvIHVzZSBzb21lIG9mIHRoZSBkZXRhaWxzIG9mIHRoZSBzdW1tYXJ5IGZvciBvdXIgZnVydGhlciBkZWNpc2lvbiBtYWtpbmcKKyAgICAgICAgICAgICAgICAgICAgdGVzdEV4ZWN1dGlvbkxpc3RlbmVycy5hZGQoZmlyc3RMaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgIHRlc3RFeGVjdXRpb25MaXN0ZW5lcnMuYWRkQWxsKGdldExpc3RlbmVycyh0ZXN0UmVxdWVzdCwgdGhpcy5sYXVuY2hEZWZpbml0aW9uLmdldENsYXNzTG9hZGVyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJpbnRTdHJlYW0gb3JpZ2luYWxTeXNPdXQgPSBTeXN0ZW0ub3V0OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBvcmlnaW5hbFN5c0VyciA9IFN5c3RlbS5lcnI7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdExpc3RlbmVyLnN3aXRjaGVkU3lzT3V0SGFuZGxlID0gdHJ5U3dpdGNoU3lzT3V0RXJyKHRlc3RSZXF1ZXN0LCBTdHJlYW1UeXBlLlNZU19PVVQpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMaXN0ZW5lci5zd2l0Y2hlZFN5c0VyckhhbmRsZSA9IHRyeVN3aXRjaFN5c091dEVycih0ZXN0UmVxdWVzdCwgU3RyZWFtVHlwZS5TWVNfRVJSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaGVyLmV4ZWN1dGUocmVxdWVzdCwgdGVzdEV4ZWN1dGlvbkxpc3RlbmVycy50b0FycmF5KG5ldyBUZXN0RXhlY3V0aW9uTGlzdGVuZXJbdGVzdEV4ZWN1dGlvbkxpc3RlbmVycy5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggYmFjayBzeXNvdXQvc3lzZXJyIHRvIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KG9yaWdpbmFsU3lzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIob3JpZ2luYWxTeXNFcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXN0RXhlY3V0aW9uQ29tcGxldGlvbih0ZXN0LCBmaXJzdExpc3RlbmVyLmdldFN1bW1hcnkoKSk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSZXF1ZXN0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2cgYW5kIG1vdmUgb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIGNsZWFubHkgY2xvc2UgdGVzdCByZXF1ZXN0IiwgZSwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldmlvdXNDbGFzc0xvYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2VyZSBhbnkgdGVzdCBmYWlsdXJlcywgd2hlbiB0aGlzIHtAbGluayBMYXVuY2hlclN1cHBvcnR9IHdhcyB1c2VkCisgICAgICogdG8ge0BsaW5rICNsYXVuY2goKX0gdGVzdHMuIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBib29sZWFuIGhhc1Rlc3RGYWlsdXJlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGVzdHNGYWlsZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFRlc3RSZXF1ZXN0PiBidWlsZFRlc3RSZXF1ZXN0cygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxUZXN0RGVmaW5pdGlvbj4gdGVzdHMgPSB0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0VGVzdHMoKTsKKyAgICAgICAgaWYgKHRlc3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8VGVzdFJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgVGVzdERlZmluaXRpb24gdGVzdCA6IHRlc3RzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFRlc3RSZXF1ZXN0PiB0ZXN0UmVxdWVzdHM7CisgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIFNpbmdsZVRlc3RDbGFzcyB8fCB0ZXN0IGluc3RhbmNlb2YgVGVzdENsYXNzZXMpIHsKKyAgICAgICAgICAgICAgICB0ZXN0UmVxdWVzdHMgPSBjcmVhdGVUZXN0UmVxdWVzdHModGVzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVW5leHBlY3RlZCB0ZXN0IGRlZmluaXRpb24gdHlwZSAiICsgdGVzdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGVzdFJlcXVlc3RzID09IG51bGwgfHwgdGVzdFJlcXVlc3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdHMuYWRkQWxsKHRlc3RSZXF1ZXN0cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcXVlc3RzOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUZXN0RXhlY3V0aW9uTGlzdGVuZXI+IGdldExpc3RlbmVycyhmaW5hbCBUZXN0UmVxdWVzdCB0ZXN0UmVxdWVzdCwgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgZmluYWwgVGVzdERlZmluaXRpb24gdGVzdCA9IHRlc3RSZXF1ZXN0LmdldE93bmVyKCk7CisgICAgICAgIGZpbmFsIExpc3Q8TGlzdGVuZXJEZWZpbml0aW9uPiBhcHBsaWNhYmxlTGlzdGVuZXJFbGVtZW50cyA9IHRlc3QuZ2V0TGlzdGVuZXJzKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgPyB0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0TGlzdGVuZXJzKCkgOiB0ZXN0LmdldExpc3RlbmVycygpOworICAgICAgICBmaW5hbCBMaXN0PFRlc3RFeGVjdXRpb25MaXN0ZW5lcj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIE9wdGlvbmFsPFByb2plY3Q+IHByb2plY3QgPSB0aGlzLnRlc3RFeGVjdXRpb25Db250ZXh0LmdldFByb2plY3QoKTsKKyAgICAgICAgZm9yIChmaW5hbCBMaXN0ZW5lckRlZmluaXRpb24gYXBwbGljYWJsZUxpc3RlbmVyIDogYXBwbGljYWJsZUxpc3RlbmVyRWxlbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChwcm9qZWN0LmlzUHJlc2VudCgpICYmICFhcHBsaWNhYmxlTGlzdGVuZXIuc2hvdWxkVXNlKHByb2plY3QuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgbG9nKCJFeGNsdWRpbmcgbGlzdGVuZXIgIiArIGFwcGxpY2FibGVMaXN0ZW5lci5nZXRDbGFzc05hbWUoKSArICIgc2luY2UgaXQncyBub3QgYXBwbGljYWJsZSIgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBpbiB0aGUgY29udGV4dCBvZiBwcm9qZWN0IiwgbnVsbCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgVGVzdEV4ZWN1dGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gcmVxdWlyZVRlc3RFeGVjdXRpb25MaXN0ZW5lcihhcHBsaWNhYmxlTGlzdGVuZXIsIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFRlc3RSZXN1bHRGb3JtYXR0ZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXR1cC9jb25maWd1cmUgdGhlIHJlc3VsdCBmb3JtYXR0ZXIKKyAgICAgICAgICAgICAgICBzZXR1cFJlc3VsdEZvcm1hdHRlcih0ZXN0UmVxdWVzdCwgYXBwbGljYWJsZUxpc3RlbmVyLCAoVGVzdFJlc3VsdEZvcm1hdHRlcikgbGlzdGVuZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3RlbmVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBSZXN1bHRGb3JtYXR0ZXIoZmluYWwgVGVzdFJlcXVlc3QgdGVzdFJlcXVlc3QsIGZpbmFsIExpc3RlbmVyRGVmaW5pdGlvbiBmb3JtYXR0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0UmVzdWx0Rm9ybWF0dGVyIHJlc3VsdEZvcm1hdHRlcikgeworCisgICAgICAgIHRlc3RSZXF1ZXN0LmNsb3NlVXBvbkNvbXBsZXRpb24ocmVzdWx0Rm9ybWF0dGVyKTsKKyAgICAgICAgLy8gc2V0IHRoZSBleGVjdXRpb24gY29udGV4dAorICAgICAgICByZXN1bHRGb3JtYXR0ZXIuc2V0Q29udGV4dCh0aGlzLnRlc3RFeGVjdXRpb25Db250ZXh0KTsKKyAgICAgICAgLy8gc2V0IHRoZSBkZXN0aW5hdGlvbiBvdXRwdXQgc3RyZWFtIGZvciB3cml0aW5nIG91dCB0aGUgZm9ybWF0dGVkIHJlc3VsdAorICAgICAgICBmaW5hbCBqYXZhLm5pby5maWxlLlBhdGggcmVzdWx0T3V0cHV0RmlsZSA9IGdldExpc3RlbmVyT3V0cHV0RmlsZSh0ZXN0UmVxdWVzdCwgZm9ybWF0dGVyRGVmaW5pdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gcmVzdWx0T3V0cHV0U3RyZWFtID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHJlc3VsdE91dHB1dEZpbGUpOworICAgICAgICAgICAgLy8gZW5yb2xsIHRoZSBvdXRwdXQgc3RyZWFtIHRvIGJlIGNsb3NlZCB3aGVuIHRoZSBleGVjdXRpb24gb2YgdGhlIFRlc3RSZXF1ZXN0IGNvbXBsZXRlcworICAgICAgICAgICAgdGVzdFJlcXVlc3QuY2xvc2VVcG9uQ29tcGxldGlvbihyZXN1bHRPdXRwdXRTdHJlYW0pOworICAgICAgICAgICAgcmVzdWx0Rm9ybWF0dGVyLnNldERlc3RpbmF0aW9uKG5ldyBLZWVwQWxpdmVPdXRwdXRTdHJlYW0ocmVzdWx0T3V0cHV0U3RyZWFtKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBjaGVjayBpZiBzeXN0ZW0ub3V0L3N5c3RlbS5lcnIgY29udGVudCBuZWVkcyB0byBiZSBwYXNzZWQgb24gdG8gdGhlIGxpc3RlbmVyCisgICAgICAgIGlmIChmb3JtYXR0ZXJEZWZpbml0aW9uLnNob3VsZFNlbmRTeXNPdXQoKSkgeworICAgICAgICAgICAgdGVzdFJlcXVlc3QuYWRkU3lzT3V0SW50ZXJlc3QocmVzdWx0Rm9ybWF0dGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0dGVyRGVmaW5pdGlvbi5zaG91bGRTZW5kU3lzRXJyKCkpIHsKKyAgICAgICAgICAgIHRlc3RSZXF1ZXN0LmFkZFN5c0VyckludGVyZXN0KHJlc3VsdEZvcm1hdHRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFBhdGggZ2V0TGlzdGVuZXJPdXRwdXRGaWxlKGZpbmFsIFRlc3RSZXF1ZXN0IHRlc3RSZXF1ZXN0LCBmaW5hbCBMaXN0ZW5lckRlZmluaXRpb24gbGlzdGVuZXIpIHsKKyAgICAgICAgZmluYWwgVGVzdERlZmluaXRpb24gdGVzdCA9IHRlc3RSZXF1ZXN0LmdldE93bmVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlbmFtZTsKKyAgICAgICAgaWYgKGxpc3RlbmVyLmdldFJlc3VsdEZpbGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9IGxpc3RlbmVyLmdldFJlc3VsdEZpbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgYSBmaWxlIG5hbWUKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiVEVTVC0iKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0ZXN0UmVxdWVzdC5nZXROYW1lKCkgPT0gbnVsbCA/ICJ1bmtub3duIiA6IHRlc3RSZXF1ZXN0LmdldE5hbWUoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi4iKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdWZmaXg7CisgICAgICAgICAgICBpZiAoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuTGVnYWN5WG1sUmVzdWx0Rm9ybWF0dGVyIi5lcXVhbHMobGlzdGVuZXIuZ2V0Q2xhc3NOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gInhtbCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICJ0eHQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKHN1ZmZpeCk7CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyLmdldE91dHB1dERpcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgb3V0cHV0IGRpciBkZWZpbmVkIG9uIHRoZSBsaXN0ZW5lcgorICAgICAgICAgICAgcmV0dXJuIFBhdGhzLmdldChsaXN0ZW5lci5nZXRPdXRwdXREaXIoKSwgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIC8vIGNoZWNrIG9uIHRoZSBlbmNsb3NpbmcgdGVzdCBkZWZpbml0aW9uLCBpbiBjb250ZXh0IG9mIHdoaWNoIHRoaXMgbGlzdGVuZXIgaXMgYmVpbmcgcnVuCisgICAgICAgIGlmICh0ZXN0LmdldE91dHB1dERpcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXRocy5nZXQodGVzdC5nZXRPdXRwdXREaXIoKSwgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIC8vIG5laXRoZXIgbGlzdGVuZXIgbm9yIHRoZSB0ZXN0IGRlZmluZSBhIG91dHB1dCBkaXIsIHNvIHVzZSBiYXNlZGlyIG9mIHRoZSBwcm9qZWN0CisgICAgICAgIGZpbmFsIFRlc3RFeGVjdXRpb25Db250ZXh0IHRlc3RFeGVjdXRpb25Db250ZXh0ID0gdGhpcy50ZXN0RXhlY3V0aW9uQ29udGV4dDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VEaXIgPSB0ZXN0RXhlY3V0aW9uQ29udGV4dC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIpOworICAgICAgICByZXR1cm4gUGF0aHMuZ2V0KGJhc2VEaXIsIGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRlc3RFeGVjdXRpb25MaXN0ZW5lciByZXF1aXJlVGVzdEV4ZWN1dGlvbkxpc3RlbmVyKGZpbmFsIExpc3RlbmVyRGVmaW5pdGlvbiBsaXN0ZW5lciwgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IGxpc3RlbmVyLmdldENsYXNzTmFtZSgpOworICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2xhc3NOYW1lLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY2xhc3NuYW1lIGF0dHJpYnV0ZSB2YWx1ZSBpcyBtaXNzaW5nIG9uIGxpc3RlbmVyIGVsZW1lbnQiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGFzczw/PiBrbGFzczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtsYXNzID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBsaXN0ZW5lciBjbGFzcyAiICsgY2xhc3NOYW1lLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVRlc3RFeGVjdXRpb25MaXN0ZW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGtsYXNzKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJMaXN0ZW5lciBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBpcyBub3Qgb2YgdHlwZSAiICsgVGVzdEV4ZWN1dGlvbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoVGVzdEV4ZWN1dGlvbkxpc3RlbmVyKSBrbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGxpc3RlbmVyICIgKyBjbGFzc05hbWUsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZVRlc3RFeGVjdXRpb25Db21wbGV0aW9uKGZpbmFsIFRlc3REZWZpbml0aW9uIHRlc3QsIGZpbmFsIFRlc3RFeGVjdXRpb25TdW1tYXJ5IHN1bW1hcnkpIHsKKyAgICAgICAgaWYgKHRoaXMubGF1bmNoRGVmaW5pdGlvbi5pc1ByaW50U3VtbWFyeSgpKSB7CisgICAgICAgICAgICAvLyBwcmludCB0aGUgc3VtbWFyeSB0byBTeXN0ZW0ub3V0CisgICAgICAgICAgICBzdW1tYXJ5LnByaW50VG8obmV3IFByaW50V3JpdGVyKFN5c3RlbS5vdXQsIHRydWUpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGhhc1Rlc3RGYWlsdXJlcyA9IHN1bW1hcnkuZ2V0VG90YWxGYWlsdXJlQ291bnQoKSAhPSAwOworICAgICAgICBpZiAoaGFzVGVzdEZhaWx1cmVzKSB7CisgICAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSB0ZXN0IGZhaWx1cmUocykgZm9yIHRoZSBlbnRpcmUgbGF1bmNoZWQgaW5zdGFuY2UKKyAgICAgICAgICAgIHRoaXMudGVzdHNGYWlsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaGFzVGVzdEZhaWx1cmVzICYmIHRlc3QuZ2V0RmFpbHVyZVByb3BlcnR5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGFyZSB0ZXN0IGZhaWx1cmVzIGFuZCB0aGUgdGVzdCBpcyBjb25maWd1cmVkIHRvIHNldCBhIHByb3BlcnR5IGluIGNhc2UKKyAgICAgICAgICAgICAgICAvLyBvZiBmYWlsdXJlLCB0aGVuIHNldCB0aGUgcHJvcGVydHkgdG8gdHJ1ZQorICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RFeGVjdXRpb25Db250ZXh0IHRlc3RFeGVjdXRpb25Db250ZXh0ID0gdGhpcy50ZXN0RXhlY3V0aW9uQ29udGV4dDsKKyAgICAgICAgICAgICAgICBpZiAodGVzdEV4ZWN1dGlvbkNvbnRleHQuZ2V0UHJvamVjdCgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCA9IHRlc3RFeGVjdXRpb25Db250ZXh0LmdldFByb2plY3QoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSh0ZXN0LmdldEZhaWx1cmVQcm9wZXJ0eSgpLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChoYXNUZXN0RmFpbHVyZXMgJiYgdGVzdC5pc0hhbHRPbkZhaWx1cmUoKSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0ZXN0IGlzIGNvbmZpZ3VyZWQgdG8gaGFsdCBvbiB0ZXN0IGZhaWx1cmVzLCB0aHJvdyBhIGJ1aWxkIGVycm9yCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICAgICAgICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIE5hbWVkVGVzdCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAiVGVzdCAiICsgKChOYW1lZFRlc3QpIHRlc3QpLmdldE5hbWUoKSArICIgaGFzICIgKyBzdW1tYXJ5LmdldFRlc3RzRmFpbGVkQ291bnQoKSArICIgZmFpbHVyZShzKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIlNvbWUgdGVzdChzKSBoYXZlIGZhaWx1cmUocykiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT3B0aW9uYWw8U3dpdGNoZWRTdHJlYW1IYW5kbGU+IHRyeVN3aXRjaFN5c091dEVycihmaW5hbCBUZXN0UmVxdWVzdCB0ZXN0UmVxdWVzdCwgZmluYWwgU3RyZWFtVHlwZSBzdHJlYW1UeXBlKSB7CisgICAgICAgIHN3aXRjaCAoc3RyZWFtVHlwZSkgeworICAgICAgICAgICAgY2FzZSBTWVNfT1VUOiB7CisgICAgICAgICAgICAgICAgaWYgKCF0ZXN0UmVxdWVzdC5pbnRlcmVzdGVkSW5TeXNPdXQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNZU19FUlI6IHsKKyAgICAgICAgICAgICAgICBpZiAoIXRlc3RSZXF1ZXN0LmludGVyZXN0ZWRJblN5c0VycigpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAvLyB1bmtub3duLCBidXQgbm8gbmVlZCB0byBlcnJvciBvdXQsIGp1c3QgYmUgbGVuaWVudAorICAgICAgICAgICAgICAgIC8vIGFuZCByZXR1cm4gYmFjaworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIFBpcGVkT3V0cHV0U3RyZWFtIHBpcGVkT3V0cHV0U3RyZWFtID0gbmV3IFBpcGVkT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGZpbmFsIFBpcGVkSW5wdXRTdHJlYW0gcGlwZWRJbnB1dFN0cmVhbTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBpcGVkSW5wdXRTdHJlYW0gPSBuZXcgUGlwZWRJbnB1dFN0cmVhbShwaXBlZE91dHB1dFN0cmVhbSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgLy8gbG9nIGFuZCByZXR1cm4KKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHByaW50U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKHBpcGVkT3V0cHV0U3RyZWFtLCB0cnVlKTsKKyAgICAgICAgZmluYWwgU3lzT3V0RXJyU3RyZWFtUmVhZGVyIHN0cmVhbWVyOworICAgICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1lTX09VVDogeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQobmV3IFByaW50U3RyZWFtKHByaW50U3RyZWFtKSk7CisgICAgICAgICAgICAgICAgc3RyZWFtZXIgPSBuZXcgU3lzT3V0RXJyU3RyZWFtUmVhZGVyKHRoaXMsIHBpcGVkSW5wdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1UeXBlLlNZU19PVVQsIHRlc3RSZXF1ZXN0LmdldFN5c091dEludGVyZXN0cygpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUaHJlYWQgc3lzT3V0U3RyZWFtZXIgPSBuZXcgVGhyZWFkKHN0cmVhbWVyKTsKKyAgICAgICAgICAgICAgICBzeXNPdXRTdHJlYW1lci5zZXREYWVtb24odHJ1ZSk7CisgICAgICAgICAgICAgICAgc3lzT3V0U3RyZWFtZXIuc2V0TmFtZSgianVuaXRsYXVuY2hlci1zeXNvdXQtc3RyZWFtLXJlYWRlciIpOworICAgICAgICAgICAgICAgIHN5c091dFN0cmVhbWVyLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigodCwgZSkgLT4gdGhpcy5sb2coIkZhaWxlZCBpbiBzeXNvdXQgc3RyZWFtaW5nIiwgZSwgUHJvamVjdC5NU0dfSU5GTykpOworICAgICAgICAgICAgICAgIHN5c091dFN0cmVhbWVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIFNZU19FUlI6IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKG5ldyBQcmludFN0cmVhbShwcmludFN0cmVhbSkpOworICAgICAgICAgICAgICAgIHN0cmVhbWVyID0gbmV3IFN5c091dEVyclN0cmVhbVJlYWRlcih0aGlzLCBwaXBlZElucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtVHlwZS5TWVNfRVJSLCB0ZXN0UmVxdWVzdC5nZXRTeXNFcnJJbnRlcmVzdHMoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgVGhyZWFkIHN5c0VyclN0cmVhbWVyID0gbmV3IFRocmVhZChzdHJlYW1lcik7CisgICAgICAgICAgICAgICAgc3lzRXJyU3RyZWFtZXIuc2V0RGFlbW9uKHRydWUpOworICAgICAgICAgICAgICAgIHN5c0VyclN0cmVhbWVyLnNldE5hbWUoImp1bml0bGF1bmNoZXItc3lzZXJyLXN0cmVhbS1yZWFkZXIiKTsKKyAgICAgICAgICAgICAgICBzeXNFcnJTdHJlYW1lci5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKHQsIGUpIC0+IHRoaXMubG9nKCJGYWlsZWQgaW4gc3lzZXJyIHN0cmVhbWluZyIsIGUsIFByb2plY3QuTVNHX0lORk8pKTsKKyAgICAgICAgICAgICAgICBzeXNFcnJTdHJlYW1lci5zdGFydCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihuZXcgU3dpdGNoZWRTdHJlYW1IYW5kbGUocGlwZWRPdXRwdXRTdHJlYW0sIHN0cmVhbWVyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIHQsIGZpbmFsIGludCBsZXZlbCkgeworICAgICAgICBmaW5hbCBUZXN0RXhlY3V0aW9uQ29udGV4dCB0ZXN0RXhlY3V0aW9uQ29udGV4dCA9IHRoaXMudGVzdEV4ZWN1dGlvbkNvbnRleHQ7CisgICAgICAgIGlmICh0ZXN0RXhlY3V0aW9uQ29udGV4dC5nZXRQcm9qZWN0KCkuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIHRlc3RFeGVjdXRpb25Db250ZXh0LmdldFByb2plY3QoKS5nZXQoKS5sb2cobWVzc2FnZSwgdCwgbGV2ZWwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgTGlzdDxUZXN0UmVxdWVzdD4gY3JlYXRlVGVzdFJlcXVlc3RzKGZpbmFsIFRlc3REZWZpbml0aW9uIHRlc3QpIHsKKyAgICAgICAgLy8gY3JlYXRlIFRlc3RSZXF1ZXN0KHMpIGFuZCBhZGQgbmVjZXNzYXJ5IHNlbGVjdG9ycywgZmlsdGVycyB0byBpdAorCisgICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgU2luZ2xlVGVzdENsYXNzKSB7CisgICAgICAgICAgICBmaW5hbCBTaW5nbGVUZXN0Q2xhc3Mgc2luZ2xlVGVzdENsYXNzID0gKFNpbmdsZVRlc3RDbGFzcykgdGVzdDsKKyAgICAgICAgICAgIGZpbmFsIExhdW5jaGVyRGlzY292ZXJ5UmVxdWVzdEJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBMYXVuY2hlckRpc2NvdmVyeVJlcXVlc3RCdWlsZGVyLnJlcXVlc3QoKTsKKyAgICAgICAgICAgIGZpbmFsIFRlc3RSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgVGVzdFJlcXVlc3QodGVzdCwgcmVxdWVzdEJ1aWxkZXIpOworICAgICAgICAgICAgcmVxdWVzdC5zZXROYW1lKHNpbmdsZVRlc3RDbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbWV0aG9kcyA9IHNpbmdsZVRlc3RDbGFzcy5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICBpZiAobWV0aG9kcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEJ1aWxkZXIuc2VsZWN0b3JzKERpc2NvdmVyeVNlbGVjdG9ycy5zZWxlY3RDbGFzcyhzaW5nbGVUZXN0Q2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGFkZCBzcGVjaWZpYyBtZXRob2RzCisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbWV0aG9kIDogbWV0aG9kcykgeworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5zZWxlY3RvcnMoRGlzY292ZXJ5U2VsZWN0b3JzLnNlbGVjdE1ldGhvZChzaW5nbGVUZXN0Q2xhc3MuZ2V0TmFtZSgpLCBtZXRob2QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRGaWx0ZXJzKHJlcXVlc3QpOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVxdWVzdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RDbGFzc2VzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gdGVzdENsYXNzZXMgPSAoKFRlc3RDbGFzc2VzKSB0ZXN0KS5nZXRUZXN0Q2xhc3NOYW1lcygpOworICAgICAgICAgICAgaWYgKHRlc3RDbGFzc2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8VGVzdFJlcXVlc3Q+IHJlcXVlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB0ZXN0Q2xhc3MgOiB0ZXN0Q2xhc3NlcykgeworICAgICAgICAgICAgICAgIGZpbmFsIExhdW5jaGVyRGlzY292ZXJ5UmVxdWVzdEJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBMYXVuY2hlckRpc2NvdmVyeVJlcXVlc3RCdWlsZGVyLnJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUZXN0UmVxdWVzdCByZXF1ZXN0ID0gbmV3IFRlc3RSZXF1ZXN0KHRlc3QsIHJlcXVlc3RCdWlsZGVyKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldE5hbWUodGVzdENsYXNzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5zZWxlY3RvcnMoRGlzY292ZXJ5U2VsZWN0b3JzLnNlbGVjdENsYXNzKHRlc3RDbGFzcykpOworICAgICAgICAgICAgICAgIGFkZEZpbHRlcnMocmVxdWVzdCk7CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0cy5hZGQocmVxdWVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdHM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZWNlc3Nhcnkge0BsaW5rIEZpbHRlciBKVW5pdCBmaWx0ZXJzfSB0byB0aGUge0Bjb2RlIHRlc3RSZXF1ZXN0fQorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RSZXF1ZXN0IFRoZSB0ZXN0IHJlcXVlc3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkRmlsdGVycyhmaW5hbCBUZXN0UmVxdWVzdCB0ZXN0UmVxdWVzdCkgeworICAgICAgICBmaW5hbCBMYXVuY2hlckRpc2NvdmVyeVJlcXVlc3RCdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0gdGVzdFJlcXVlc3QuZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOworICAgICAgICAvLyBhZGQgYW55IGVuZ2luZSBmaWx0ZXJzCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGVuZ2luZXNUb0luY2x1ZGUgPSB0ZXN0UmVxdWVzdC5nZXRPd25lcigpLmdldEluY2x1ZGVFbmdpbmVzKCk7CisgICAgICAgIGlmIChlbmdpbmVzVG9JbmNsdWRlICE9IG51bGwgJiYgZW5naW5lc1RvSW5jbHVkZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5maWx0ZXJzKEVuZ2luZUZpbHRlci5pbmNsdWRlRW5naW5lcyhlbmdpbmVzVG9JbmNsdWRlKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nW10gZW5naW5lc1RvRXhjbHVkZSA9IHRlc3RSZXF1ZXN0LmdldE93bmVyKCkuZ2V0RXhjbHVkZUVuZ2luZXMoKTsKKyAgICAgICAgaWYgKGVuZ2luZXNUb0V4Y2x1ZGUgIT0gbnVsbCAmJiBlbmdpbmVzVG9FeGNsdWRlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmZpbHRlcnMoRW5naW5lRmlsdGVyLmV4Y2x1ZGVFbmdpbmVzKGVuZ2luZXNUb0V4Y2x1ZGUpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgYW55IHRhZyBmaWx0ZXJzCisgICAgICAgIGlmICh0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0SW5jbHVkZVRhZ3MoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5maWx0ZXJzKFRhZ0ZpbHRlci5pbmNsdWRlVGFncyh0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0SW5jbHVkZVRhZ3MoKSkpOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0RXhjbHVkZVRhZ3MoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5maWx0ZXJzKFRhZ0ZpbHRlci5leGNsdWRlVGFncyh0aGlzLmxhdW5jaERlZmluaXRpb24uZ2V0RXhjbHVkZVRhZ3MoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIFN0cmVhbVR5cGUgeworICAgICAgICBTWVNfT1VULAorICAgICAgICBTWVNfRVJSCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3lzT3V0RXJyU3RyZWFtUmVhZGVyIGltcGxlbWVudHMgUnVubmFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFkgPSBuZXcgYnl0ZVswXTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExhdW5jaGVyU3VwcG9ydCBsYXVuY2hNYW5hZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZVN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJlYW1UeXBlIHN0cmVhbVR5cGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0UmVzdWx0Rm9ybWF0dGVyPiByZXN1bHRGb3JtYXR0ZXJzOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFN5c091dEVyckNvbnRlbnREZWxpdmVyZXIgY29udGVudERlbGl2ZXJlcjsKKworICAgICAgICBTeXNPdXRFcnJTdHJlYW1SZWFkZXIoZmluYWwgTGF1bmNoZXJTdXBwb3J0IGxhdW5jaE1hbmFnZXIsIGZpbmFsIElucHV0U3RyZWFtIHNvdXJjZSwgZmluYWwgU3RyZWFtVHlwZSBzdHJlYW1UeXBlLCBmaW5hbCBDb2xsZWN0aW9uPFRlc3RSZXN1bHRGb3JtYXR0ZXI+IHJlc3VsdEZvcm1hdHRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMubGF1bmNoTWFuYWdlciA9IGxhdW5jaE1hbmFnZXI7CisgICAgICAgICAgICB0aGlzLnNvdXJjZVN0cmVhbSA9IHNvdXJjZTsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CisgICAgICAgICAgICB0aGlzLnJlc3VsdEZvcm1hdHRlcnMgPSByZXN1bHRGb3JtYXR0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGZpbmFsIFN5c091dEVyckNvbnRlbnREZWxpdmVyZXIgc3RyZWFtQ29udGVudERlbGl2ZXIgPSBuZXcgU3lzT3V0RXJyQ29udGVudERlbGl2ZXJlcih0aGlzLnN0cmVhbVR5cGUsIHRoaXMucmVzdWx0Rm9ybWF0dGVycyk7CisgICAgICAgICAgICBmaW5hbCBUaHJlYWQgZGVsaXZlcnlUaHJlYWQgPSBuZXcgVGhyZWFkKHN0cmVhbUNvbnRlbnREZWxpdmVyKTsKKyAgICAgICAgICAgIGRlbGl2ZXJ5VGhyZWFkLnNldE5hbWUoImp1bml0bGF1bmNoZXItIiArICh0aGlzLnN0cmVhbVR5cGUgPT0gU3RyZWFtVHlwZS5TWVNfT1VUID8gInN5c291dCIgOiAic3lzZXJyIikgKyAiLXN0cmVhbS1kZWxpdmVyZXIiKTsKKyAgICAgICAgICAgIGRlbGl2ZXJ5VGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgICAgIGRlbGl2ZXJ5VGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICB0aGlzLmNvbnRlbnREZWxpdmVyZXIgPSBzdHJlYW1Db250ZW50RGVsaXZlcjsKKyAgICAgICAgICAgIGludCBudW1SZWFkID0gLTE7CisgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKG51bVJlYWQgPSB0aGlzLnNvdXJjZVN0cmVhbS5yZWFkKGRhdGEpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gY29weSA9IEFycmF5cy5jb3B5T2YoZGF0YSwgbnVtUmVhZCk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNvbnRlbnREZWxpdmVyLmF2YWlsYWJsZURhdGEub2ZmZXIoY29weSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRoaXMubGF1bmNoTWFuYWdlci5sb2coIkZhaWxlZCB3aGlsZSBzdHJlYW1pbmcgIiArICh0aGlzLnN0cmVhbVR5cGUgPT0gU3RyZWFtVHlwZS5TWVNfT1VUID8gInN5c291dCIgOiAic3lzZXJyIikgKyAiIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHN0cmVhbUNvbnRlbnREZWxpdmVyLnN0b3AgPSB0cnVlOworICAgICAgICAgICAgICAgIC8vIGp1c3QgIndha2V1cCIgdGhlIGRlbGl2ZXJ5IHRocmVhZCwgdG8gdGFrZSBpbnRvIGFjY291bnQKKyAgICAgICAgICAgICAgICAvLyB0aG9zZSByYWNlIGNvbmRpdGlvbnMsIHdoZXJlIHRoYXQgb3RoZXIgdGhyZWFkIGRpZG4ndCB5ZXQKKyAgICAgICAgICAgICAgICAvLyBub3RpY2UgdGhhdCBpdCB3YXMgYXNrZWQgdG8gc3RvcCBhbmQgaGFzIG5vdyBnb25lIGludG8gYQorICAgICAgICAgICAgICAgIC8vIFggYW1vdW50IG9mIHdhaXQsIHdhaXRpbmcgZm9yIGFueSBuZXcgZGF0YQorICAgICAgICAgICAgICAgIHN0cmVhbUNvbnRlbnREZWxpdmVyLmF2YWlsYWJsZURhdGEub2ZmZXIoRU1QVFkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3lzT3V0RXJyQ29udGVudERlbGl2ZXJlciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3A7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUZXN0UmVzdWx0Rm9ybWF0dGVyPiByZXN1bHRGb3JtYXR0ZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmVhbVR5cGUgc3RyZWFtVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCbG9ja2luZ1F1ZXVlPGJ5dGVbXT4gYXZhaWxhYmxlRGF0YSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBjb21wbGV0aW9uTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgU3lzT3V0RXJyQ29udGVudERlbGl2ZXJlcihmaW5hbCBTdHJlYW1UeXBlIHN0cmVhbVR5cGUsIGZpbmFsIENvbGxlY3Rpb248VGVzdFJlc3VsdEZvcm1hdHRlcj4gcmVzdWx0Rm9ybWF0dGVycykgeworICAgICAgICAgICAgdGhpcy5zdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0Rm9ybWF0dGVycyA9IHJlc3VsdEZvcm1hdHRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXRoaXMuc3RvcCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gc3RyZWFtRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURhdGEgPSB0aGlzLmF2YWlsYWJsZURhdGEucG9sbCgyLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtRGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxpdmVyKHN0cmVhbURhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRyYWluIGl0CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxieXRlW10+IHJlbWFpbmluZyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlRGF0YS5kcmFpblRvKHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgYnl0ZVtdIGRhdGEgOiByZW1haW5pbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGl2ZXIoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMuY29tcGxldGlvbkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGRlbGl2ZXIoZmluYWwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoZmluYWwgVGVzdFJlc3VsdEZvcm1hdHRlciByZXN1bHRGb3JtYXR0ZXIgOiB0aGlzLnJlc3VsdEZvcm1hdHRlcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBzZW5kIGl0IHRvIHRoZSBmb3JtYXR0ZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWVNfT1VUOiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGb3JtYXR0ZXIuc3lzT3V0QXZhaWxhYmxlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBTWVNfRVJSOiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGb3JtYXR0ZXIuc3lzRXJyQXZhaWxhYmxlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFN3aXRjaGVkU3RyZWFtSGFuZGxlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgZmluYWwgU3lzT3V0RXJyU3RyZWFtUmVhZGVyIHN0cmVhbVJlYWRlcjsKKworICAgICAgICBTd2l0Y2hlZFN0cmVhbUhhbmRsZShmaW5hbCBQaXBlZE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIGZpbmFsIFN5c091dEVyclN0cmVhbVJlYWRlciBzdHJlYW1SZWFkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyZWFtUmVhZGVyID0gc3RyZWFtUmVhZGVyOworICAgICAgICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIExpc3RlbmVyIGV4dGVuZHMgU3VtbWFyeUdlbmVyYXRpbmdMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgT3B0aW9uYWw8U3dpdGNoZWRTdHJlYW1IYW5kbGU+IHN3aXRjaGVkU3lzT3V0SGFuZGxlOworICAgICAgICBwcml2YXRlIE9wdGlvbmFsPFN3aXRjaGVkU3RyZWFtSGFuZGxlPiBzd2l0Y2hlZFN5c0VyckhhbmRsZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFBsYW5FeGVjdXRpb25GaW5pc2hlZChmaW5hbCBUZXN0UGxhbiB0ZXN0UGxhbikgeworICAgICAgICAgICAgc3VwZXIudGVzdFBsYW5FeGVjdXRpb25GaW5pc2hlZCh0ZXN0UGxhbik7CisgICAgICAgICAgICAvLyBub3cgdGhhdCB0aGUgdGVzdCBwbGFuIGV4ZWN1dGlvbiBpcyBmaW5pc2hlZCwgY2xvc2UgdGhlIHN3aXRjaGVkIHN5c291dC9zeXNlcnIgb3V0cHV0IHN0cmVhbXMKKyAgICAgICAgICAgIC8vIGFuZCB3YWl0IGZvciB0aGUgc3lzb3V0IGFuZCBzeXNlcnIgY29udGVudCBkZWxpdmVyeSwgdG8gcmVzdWx0IGZvcm1hdHRlcnMsIHRvIGZpbmlzaAorICAgICAgICAgICAgaWYgKHRoaXMuc3dpdGNoZWRTeXNPdXRIYW5kbGUuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTd2l0Y2hlZFN0cmVhbUhhbmRsZSBzeXNPdXQgPSB0aGlzLnN3aXRjaGVkU3lzT3V0SGFuZGxlLmdldCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlQW5kV2FpdChzeXNPdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLnN3aXRjaGVkU3lzRXJySGFuZGxlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3dpdGNoZWRTdHJlYW1IYW5kbGUgc3lzRXJyID0gdGhpcy5zd2l0Y2hlZFN5c0VyckhhbmRsZS5nZXQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZUFuZFdhaXQoc3lzRXJyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQW5kV2FpdChmaW5hbCBTd2l0Y2hlZFN0cmVhbUhhbmRsZSBoYW5kbGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaGFuZGxlLm91dHB1dFN0cmVhbSk7CisgICAgICAgICAgICBpZiAoaGFuZGxlLnN0cmVhbVJlYWRlci5jb250ZW50RGVsaXZlcmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3YWl0IGZvciBhIGZldyBzZWNvbmRzCisgICAgICAgICAgICBoYW5kbGUuc3RyZWFtUmVhZGVyLmNvbnRlbnREZWxpdmVyZXIuY29tcGxldGlvbkxhdGNoLmF3YWl0KDIsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xlZ2FjeUJyaWVmUmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xlZ2FjeUJyaWVmUmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlYmJmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvTGVnYWN5QnJpZWZSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyOworCitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5UZXN0RXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0SWRlbnRpZmllcjsKKworLyoqCisgKiBBIHtAbGluayBUZXN0UmVzdWx0Rm9ybWF0dGVyfSB3aGljaCBwcmludHMgYSBicmllZiBzdGF0aXN0aWMgZm9yIHRlc3RzIHRoYXQgaGF2ZQorICogZmFpbGVkLCBhYm9ydGVkIG9yIHNraXBwZWQKKyAqLworY2xhc3MgTGVnYWN5QnJpZWZSZXN1bHRGb3JtYXR0ZXIgZXh0ZW5kcyBMZWdhY3lQbGFpblJlc3VsdEZvcm1hdHRlciBpbXBsZW1lbnRzIFRlc3RSZXN1bHRGb3JtYXR0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkUmVwb3J0RXhlY3V0aW9uRmluaXNoZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFRlc3RFeGVjdXRpb25SZXN1bHQgdGVzdEV4ZWN1dGlvblJlc3VsdCkgeworICAgICAgICBmaW5hbCBUZXN0RXhlY3V0aW9uUmVzdWx0LlN0YXR1cyByZXN1bHRTdGF0dXMgPSB0ZXN0RXhlY3V0aW9uUmVzdWx0LmdldFN0YXR1cygpOworICAgICAgICByZXR1cm4gcmVzdWx0U3RhdHVzID09IFRlc3RFeGVjdXRpb25SZXN1bHQuU3RhdHVzLkFCT1JURUQgfHwgcmVzdWx0U3RhdHVzID09IFRlc3RFeGVjdXRpb25SZXN1bHQuU3RhdHVzLkZBSUxFRDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xlZ2FjeVBsYWluUmVzdWx0Rm9ybWF0dGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0xlZ2FjeVBsYWluUmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3OGUyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvTGVnYWN5UGxhaW5SZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyOworCitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5UZXN0RXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUucmVwb3J0aW5nLlJlcG9ydEVudHJ5OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuc3VwcG9ydC5kZXNjcmlwdG9yLkNsYXNzU291cmNlOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0SWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuVGVzdFBsYW47CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKKworLyoqCisgKiBBIHtAbGluayBUZXN0UmVzdWx0Rm9ybWF0dGVyfSB3aGljaCBwcmludHMgYSBzaG9ydCBzdGF0aXN0aWMgZm9yIGVhY2ggb2YgdGhlIHRlc3RzCisgKi8KK2NsYXNzIExlZ2FjeVBsYWluUmVzdWx0Rm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RKVW5pdFJlc3VsdEZvcm1hdHRlciBpbXBsZW1lbnRzIFRlc3RSZXN1bHRGb3JtYXR0ZXIgeworCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworICAgIHByaXZhdGUgZmluYWwgTWFwPFRlc3RJZGVudGlmaWVyLCBTdGF0cz4gdGVzdElkcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBUZXN0UGxhbiB0ZXN0UGxhbjsKKyAgICBwcml2YXRlIEJ1ZmZlcmVkV3JpdGVyIHdyaXRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFuRXhlY3V0aW9uU3RhcnRlZChmaW5hbCBUZXN0UGxhbiB0ZXN0UGxhbikgeworICAgICAgICB0aGlzLnRlc3RQbGFuID0gdGVzdFBsYW47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdFBsYW5FeGVjdXRpb25GaW5pc2hlZChmaW5hbCBUZXN0UGxhbiB0ZXN0UGxhbikgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxUZXN0SWRlbnRpZmllciwgU3RhdHM+IGVudHJ5IDogdGhpcy50ZXN0SWRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBpZiAoIWlzVGVzdENsYXNzKHRlc3RJZGVudGlmaWVyKS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBhbnl0aGluZyBvdGhlciB0aGFuIGEgdGVzdCAiY2xhc3MiIGluIHRoaXMgc2VjdGlvbgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RhdHMgc3RhdHMgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJUZXN0cyBydW46ICIpLmFwcGVuZChzdGF0cy5udW1UZXN0c1J1bi5nZXQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgRmFpbHVyZXM6ICIpLmFwcGVuZChzdGF0cy5udW1UZXN0c0ZhaWxlZC5nZXQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgU2tpcHBlZDogIikuYXBwZW5kKHN0YXRzLm51bVRlc3RzU2tpcHBlZC5nZXQoKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIiwgQWJvcnRlZDogIikuYXBwZW5kKHN0YXRzLm51bVRlc3RzQWJvcnRlZC5nZXQoKSk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVFbGFwc2VkID0gc3RhdHMuZW5kZWRBdCAtIHN0YXRzLnN0YXJ0ZWRBdDsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiLCBUaW1lIGVsYXBzZWQ6ICIpOworICAgICAgICAgICAgaWYgKHRpbWVFbGFwc2VkIDwgMTAwMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aW1lRWxhcHNlZCkuYXBwZW5kKCIgbWlsbGkgc2VjKHMpIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQodGltZUVsYXBzZWQsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpLmFwcGVuZCgiIHNlYyhzKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci53cml0ZShzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gd3JpdGUgb3V0IHN5c291dCBhbmQgc3lzZXJyIGNvbnRlbnQgaWYgYW55CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAodGhpcy5oYXNTeXNPdXQoKSkgeworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICAgICAgd3JpdGVTeXNPdXQod3JpdGVyKTsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci53cml0ZSgiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmhhc1N5c0VycigpKSB7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoIi0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgRXJyb3IgLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIubmV3TGluZSgpOworICAgICAgICAgICAgICAgIHdyaXRlU3lzRXJyKHdyaXRlcik7CisgICAgICAgICAgICAgICAgdGhpcy53cml0ZXIud3JpdGUoIi0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci5uZXdMaW5lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgaGFuZGxlRXhjZXB0aW9uKGlvZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkeW5hbWljVGVzdFJlZ2lzdGVyZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGlvblNraXBwZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aGlzLnRlc3RJZHMucHV0SWZBYnNlbnQodGVzdElkZW50aWZpZXIsIG5ldyBTdGF0cyh0ZXN0SWRlbnRpZmllciwgY3VycmVudFRpbWUpKTsKKyAgICAgICAgZmluYWwgU3RhdHMgc3RhdHMgPSB0aGlzLnRlc3RJZHMuZ2V0KHRlc3RJZGVudGlmaWVyKTsKKyAgICAgICAgc3RhdHMuc2V0RW5kZWRBdChjdXJyZW50VGltZSk7CisgICAgICAgIGlmICh0ZXN0SWRlbnRpZmllci5pc1Rlc3QoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoIlRlc3Q6ICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHRlc3RJZGVudGlmaWVyLmdldExlZ2FjeVJlcG9ydGluZ05hbWUoKSk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVFbGFwc2VkID0gc3RhdHMuZW5kZWRBdCAtIHN0YXRzLnN0YXJ0ZWRBdDsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiIHRvb2sgIik7CisgICAgICAgICAgICBpZiAodGltZUVsYXBzZWQgPCAxMDAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHRpbWVFbGFwc2VkKS5hcHBlbmQoIiBtaWxsaSBzZWMocykiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFRpbWVVbml0LlNFQ09ORFMuY29udmVydCh0aW1lRWxhcHNlZCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuYXBwZW5kKCIgc2VjKHMpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIiBTS0lQUEVEIik7CisgICAgICAgICAgICBpZiAocmVhc29uICE9IG51bGwgJiYgIXJlYXNvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjogIikuYXBwZW5kKHJlYXNvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpb2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBnZXQgdGhlIHBhcmVudCB0ZXN0IGNsYXNzIHRvIHdoaWNoIHRoaXMgc2tpcHBlZCB0ZXN0IGJlbG9uZ3MgdG8KKyAgICAgICAgZmluYWwgT3B0aW9uYWw8VGVzdElkZW50aWZpZXI+IHBhcmVudFRlc3RDbGFzcyA9IHRyYXZlcnNlQW5kRmluZFRlc3RDbGFzcyh0aGlzLnRlc3RQbGFuLCB0ZXN0SWRlbnRpZmllcik7CisgICAgICAgIGlmICghcGFyZW50VGVzdENsYXNzLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RhdHMgcGFyZW50Q2xhc3NTdGF0cyA9IHRoaXMudGVzdElkcy5nZXQocGFyZW50VGVzdENsYXNzLmdldCgpKTsKKyAgICAgICAgcGFyZW50Q2xhc3NTdGF0cy5udW1UZXN0c1NraXBwZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0aW9uU3RhcnRlZChmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcikgeworICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIC8vIHJlY29yZCB0aGlzIHRlc3RpZGVudGlmaWVyJ3Mgc3RhcnQKKyAgICAgICAgdGhpcy50ZXN0SWRzLnB1dElmQWJzZW50KHRlc3RJZGVudGlmaWVyLCBuZXcgU3RhdHModGVzdElkZW50aWZpZXIsIGN1cnJlbnRUaW1lKSk7CisgICAgICAgIGZpbmFsIE9wdGlvbmFsPENsYXNzU291cmNlPiB0ZXN0Q2xhc3MgPSBpc1Rlc3RDbGFzcyh0ZXN0SWRlbnRpZmllcik7CisgICAgICAgIGlmICh0ZXN0Q2xhc3MuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSB0ZXN0IGNsYXNzLCB0aGVuIHByaW50IGl0IG91dAorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlci53cml0ZSgiVGVzdGNhc2U6ICIgKyB0ZXN0Q2xhc3MuZ2V0KCkuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpb2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBpZiB0aGlzIGlzIGEgdGVzdCAobWV0aG9kKSB0aGVuIGluY3JlbWVudCB0aGUgdGVzdHMgcnVuIGZvciB0aGUgdGVzdCBjbGFzcyB0byB3aGljaAorICAgICAgICAvLyB0aGlzIHRlc3QgYmVsb25ncyB0bworICAgICAgICBpZiAodGVzdElkZW50aWZpZXIuaXNUZXN0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFRlc3RJZGVudGlmaWVyPiBwYXJlbnRUZXN0Q2xhc3MgPSB0cmF2ZXJzZUFuZEZpbmRUZXN0Q2xhc3ModGhpcy50ZXN0UGxhbiwgdGVzdElkZW50aWZpZXIpOworICAgICAgICAgICAgaWYgKHBhcmVudFRlc3RDbGFzcy5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0YXRzIHBhcmVudENsYXNzU3RhdHMgPSB0aGlzLnRlc3RJZHMuZ2V0KHBhcmVudFRlc3RDbGFzcy5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudENsYXNzU3RhdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnRDbGFzc1N0YXRzLm51bVRlc3RzUnVuLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJpbmNvbXBsZXRlLXN3aXRjaCIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0aW9uRmluaXNoZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFRlc3RFeGVjdXRpb25SZXN1bHQgdGVzdEV4ZWN1dGlvblJlc3VsdCkgeworICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZpbmFsIFN0YXRzIHN0YXRzID0gdGhpcy50ZXN0SWRzLmdldCh0ZXN0SWRlbnRpZmllcik7CisgICAgICAgIGlmIChzdGF0cyAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGF0cy5zZXRFbmRlZEF0KGN1cnJlbnRUaW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVzdElkZW50aWZpZXIuaXNUZXN0KCkgJiYgc2hvdWxkUmVwb3J0RXhlY3V0aW9uRmluaXNoZWQodGVzdElkZW50aWZpZXIsIHRlc3RFeGVjdXRpb25SZXN1bHQpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiVGVzdDogIik7CisgICAgICAgICAgICBzYi5hcHBlbmQodGVzdElkZW50aWZpZXIuZ2V0TGVnYWN5UmVwb3J0aW5nTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChzdGF0cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lRWxhcHNlZCA9IHN0YXRzLmVuZGVkQXQgLSBzdGF0cy5zdGFydGVkQXQ7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgdG9vayAiKTsKKyAgICAgICAgICAgICAgICBpZiAodGltZUVsYXBzZWQgPCAxMDAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aW1lRWxhcHNlZCkuYXBwZW5kKCIgbWlsbGkgc2VjKHMpIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFRpbWVVbml0LlNFQ09ORFMuY29udmVydCh0aW1lRWxhcHNlZCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSkuYXBwZW5kKCIgc2VjKHMpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICh0ZXN0RXhlY3V0aW9uUmVzdWx0LmdldFN0YXR1cygpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBQk9SVEVEOiB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIEFCT1JURUQiKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVGhyb3dhYmxlKHNiLCB0ZXN0RXhlY3V0aW9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgRkFJTEVEOiB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiIEZBSUxFRCIpOworICAgICAgICAgICAgICAgICAgICBhcHBlbmRUaHJvd2FibGUoc2IsIHRlc3RFeGVjdXRpb25SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLm5ld0xpbmUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZUV4Y2VwdGlvbihpb2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBnZXQgdGhlIHBhcmVudCB0ZXN0IGNsYXNzIGluIHdoaWNoIHRoaXMgdGVzdCBjb21wbGV0ZWQKKyAgICAgICAgZmluYWwgT3B0aW9uYWw8VGVzdElkZW50aWZpZXI+IHBhcmVudFRlc3RDbGFzcyA9IHRyYXZlcnNlQW5kRmluZFRlc3RDbGFzcyh0aGlzLnRlc3RQbGFuLCB0ZXN0SWRlbnRpZmllcik7CisgICAgICAgIGlmICghcGFyZW50VGVzdENsYXNzLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHRoZSBzdGF0cyBvZiB0aGUgcGFyZW50IHRlc3QgY2xhc3MKKyAgICAgICAgZmluYWwgU3RhdHMgcGFyZW50Q2xhc3NTdGF0cyA9IHRoaXMudGVzdElkcy5nZXQocGFyZW50VGVzdENsYXNzLmdldCgpKTsKKyAgICAgICAgc3dpdGNoICh0ZXN0RXhlY3V0aW9uUmVzdWx0LmdldFN0YXR1cygpKSB7CisgICAgICAgICAgICBjYXNlIEFCT1JURUQ6IHsKKyAgICAgICAgICAgICAgICBwYXJlbnRDbGFzc1N0YXRzLm51bVRlc3RzQWJvcnRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRkFJTEVEOiB7CisgICAgICAgICAgICAgICAgcGFyZW50Q2xhc3NTdGF0cy5udW1UZXN0c0ZhaWxlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcG9ydGluZ0VudHJ5UHVibGlzaGVkKGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyLCBmaW5hbCBSZXBvcnRFbnRyeSBlbnRyeSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3M7CisgICAgICAgIHRoaXMud3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIodGhpcy5vdXRwdXRTdHJlYW0sIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRSZXBvcnRFeGVjdXRpb25GaW5pc2hlZChmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllciwgZmluYWwgVGVzdEV4ZWN1dGlvblJlc3VsdCB0ZXN0RXhlY3V0aW9uUmVzdWx0KSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kVGhyb3dhYmxlKGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IsIFRlc3RFeGVjdXRpb25SZXN1bHQgcmVzdWx0KSB7CisgICAgICAgIGlmICghcmVzdWx0LmdldFRocm93YWJsZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSA9IHJlc3VsdC5nZXRUaHJvd2FibGUoKS5nZXQoKTsKKyAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIjogJXMlbiIsIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHN0YWNrdHJhY2UgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UobmV3IFByaW50V3JpdGVyKHN0YWNrdHJhY2UpKTsKKyAgICAgICAgc2IuYXBwZW5kKHN0YWNrdHJhY2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy53cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy53cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBzdXBlci5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgU3RhdHMgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIG51bVRlc3RzUnVuID0gbmV3IEF0b21pY0xvbmcoMCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBudW1UZXN0c0ZhaWxlZCA9IG5ldyBBdG9taWNMb25nKDApOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbnVtVGVzdHNTa2lwcGVkID0gbmV3IEF0b21pY0xvbmcoMCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBudW1UZXN0c0Fib3J0ZWQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0ZWRBdDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGVuZGVkQXQ7CisKKyAgICAgICAgcHJpdmF0ZSBTdGF0cyhmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllciwgZmluYWwgbG9uZyBzdGFydGVkQXQpIHsKKyAgICAgICAgICAgIHRoaXMudGVzdElkZW50aWZpZXIgPSB0ZXN0SWRlbnRpZmllcjsKKyAgICAgICAgICAgIHRoaXMuc3RhcnRlZEF0ID0gc3RhcnRlZEF0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEVuZGVkQXQoZmluYWwgbG9uZyBlbmRlZEF0KSB7CisgICAgICAgICAgICB0aGlzLmVuZGVkQXQgPSBlbmRlZEF0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9MZWdhY3lYbWxSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvTGVnYWN5WG1sUmVzdWx0Rm9ybWF0dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkMWNjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvTGVnYWN5WG1sUmVzdWx0Rm9ybWF0dGVyLmphdmEKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkRPTUVsZW1lbnRXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5EYXRlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0uZW5naW5lLlRlc3RFeGVjdXRpb25SZXN1bHQ7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5UZXN0U291cmNlOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUucmVwb3J0aW5nLlJlcG9ydEVudHJ5OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuc3VwcG9ydC5kZXNjcmlwdG9yLkNsYXNzU291cmNlOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5sYXVuY2hlci5UZXN0SWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuVGVzdFBsYW47CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCisvKioKKyAqIEEge0BsaW5rIFRlc3RSZXN1bHRGb3JtYXR0ZXJ9IHdoaWNoIGdlbmVyYXRlcyBhbiBYTUwgcmVwb3J0IG9mIHRoZSB0ZXN0cy4gVGhlIGdlbmVyYXRlZCBYTUwgcmVwb3J0cworICogY29uZm9ybXMgdG8gdGhlIHNjaGVtYSBvZiB0aGUgWE1MIHRoYXQgd2FzIGdlbmVyYXRlZCBieSB0aGUge0Bjb2RlIGp1bml0fSB0YXNrJ3MgWE1MCisgKiByZXBvcnQgZm9ybWF0dGVyIGFuZCBjYW4gYmUgdXNlZCBieSB0aGUge0Bjb2RlIGp1bml0cmVwb3J0fSB0YXNrCisgKi8KK2NsYXNzIExlZ2FjeVhtbFJlc3VsdEZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0SlVuaXRSZXN1bHRGb3JtYXR0ZXIgaW1wbGVtZW50cyBUZXN0UmVzdWx0Rm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBPTkVfU0VDT05EID0gMTAwMC4wOworCisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworICAgIHByaXZhdGUgZmluYWwgTWFwPFRlc3RJZGVudGlmaWVyLCBTdGF0cz4gdGVzdElkcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VGVzdElkZW50aWZpZXIsIE9wdGlvbmFsPFN0cmluZz4+IHNraXBwZWQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFRlc3RJZGVudGlmaWVyLCBPcHRpb25hbDxUaHJvd2FibGU+PiBmYWlsZWQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFRlc3RJZGVudGlmaWVyLCBPcHRpb25hbDxUaHJvd2FibGU+PiBhYm9ydGVkID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgIHByaXZhdGUgVGVzdFBsYW4gdGVzdFBsYW47CisgICAgcHJpdmF0ZSBsb25nIHRlc3RQbGFuU3RhcnRlZEF0ID0gLTE7CisgICAgcHJpdmF0ZSBsb25nIHRlc3RQbGFuRW5kZWRBdCA9IC0xOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBudW1UZXN0c1J1biA9IG5ldyBBdG9taWNMb25nKDApOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBudW1UZXN0c0ZhaWxlZCA9IG5ldyBBdG9taWNMb25nKDApOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBudW1UZXN0c1NraXBwZWQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbnVtVGVzdHNBYm9ydGVkID0gbmV3IEF0b21pY0xvbmcoMCk7CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFuRXhlY3V0aW9uU3RhcnRlZChmaW5hbCBUZXN0UGxhbiB0ZXN0UGxhbikgeworICAgICAgICB0aGlzLnRlc3RQbGFuID0gdGVzdFBsYW47CisgICAgICAgIHRoaXMudGVzdFBsYW5TdGFydGVkQXQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGxhbkV4ZWN1dGlvbkZpbmlzaGVkKGZpbmFsIFRlc3RQbGFuIHRlc3RQbGFuKSB7CisgICAgICAgIHRoaXMudGVzdFBsYW5FbmRlZEF0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIC8vIGZvcm1hdCBhbmQgcHJpbnQgb3V0IHRoZSByZXN1bHQKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBYTUxSZXBvcnRXcml0ZXIoKS53cml0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IFhNTFN0cmVhbUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkeW5hbWljVGVzdFJlZ2lzdGVyZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGlvblNraXBwZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB0aGlzLm51bVRlc3RzU2tpcHBlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgdGhpcy5za2lwcGVkLnB1dCh0ZXN0SWRlbnRpZmllciwgT3B0aW9uYWwub2ZOdWxsYWJsZShyZWFzb24pKTsKKyAgICAgICAgLy8gYSBza2lwcGVkIHRlc3QgaXMgY29uc2lkZXJlZCBzdGFydGVkIGFuZCBlbmRlZCBub3cKKyAgICAgICAgZmluYWwgU3RhdHMgc3RhdHMgPSBuZXcgU3RhdHModGVzdElkZW50aWZpZXIsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgc3RhdHMuZW5kZWRBdCA9IGN1cnJlbnRUaW1lOworICAgICAgICB0aGlzLnRlc3RJZHMucHV0KHRlc3RJZGVudGlmaWVyLCBzdGF0cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0aW9uU3RhcnRlZChmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcikgeworICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIHRoaXMudGVzdElkcy5wdXRJZkFic2VudCh0ZXN0SWRlbnRpZmllciwgbmV3IFN0YXRzKHRlc3RJZGVudGlmaWVyLCBjdXJyZW50VGltZSkpOworICAgICAgICBpZiAodGVzdElkZW50aWZpZXIuaXNUZXN0KCkpIHsKKyAgICAgICAgICAgIHRoaXMubnVtVGVzdHNSdW4uaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRpb25GaW5pc2hlZChmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllciwgZmluYWwgVGVzdEV4ZWN1dGlvblJlc3VsdCB0ZXN0RXhlY3V0aW9uUmVzdWx0KSB7CisgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgU3RhdHMgc3RhdHMgPSB0aGlzLnRlc3RJZHMuZ2V0KHRlc3RJZGVudGlmaWVyKTsKKyAgICAgICAgaWYgKHN0YXRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRzLmVuZGVkQXQgPSBjdXJyZW50VGltZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHRlc3RFeGVjdXRpb25SZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgIGNhc2UgU1VDQ0VTU0ZVTDogeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBBQk9SVEVEOiB7CisgICAgICAgICAgICAgICAgdGhpcy5udW1UZXN0c0Fib3J0ZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgdGhpcy5hYm9ydGVkLnB1dCh0ZXN0SWRlbnRpZmllciwgdGVzdEV4ZWN1dGlvblJlc3VsdC5nZXRUaHJvd2FibGUoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZBSUxFRDogeworICAgICAgICAgICAgICAgIHRoaXMubnVtVGVzdHNGYWlsZWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgdGhpcy5mYWlsZWQucHV0KHRlc3RJZGVudGlmaWVyLCB0ZXN0RXhlY3V0aW9uUmVzdWx0LmdldFRocm93YWJsZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlcG9ydGluZ0VudHJ5UHVibGlzaGVkKGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyLCBmaW5hbCBSZXBvcnRFbnRyeSBlbnRyeSkgeworICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RGVzdGluYXRpb24oZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB7CisgICAgICAgIHRoaXMub3V0cHV0U3RyZWFtID0gb3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBTdGF0cyB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwcml2YXRlIGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3RhcnRlZEF0OworICAgICAgICBwcml2YXRlIGxvbmcgZW5kZWRBdDsKKworICAgICAgICBwcml2YXRlIFN0YXRzKGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyLCBmaW5hbCBsb25nIHN0YXJ0ZWRBdCkgeworICAgICAgICAgICAgdGhpcy50ZXN0SWRlbnRpZmllciA9IHRlc3RJZGVudGlmaWVyOworICAgICAgICAgICAgdGhpcy5zdGFydGVkQXQgPSBzdGFydGVkQXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFhNTFJlcG9ydFdyaXRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVTVFNVSVRFID0gInRlc3RzdWl0ZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST1BFUlRJRVMgPSAicHJvcGVydGllcyI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNX1BST1BFUlRZID0gInByb3BlcnR5IjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1fVEVTVENBU0UgPSAidGVzdGNhc2UiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TS0lQUEVEID0gInNraXBwZWQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9GQUlMVVJFID0gImZhaWx1cmUiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9BQk9SVEVEID0gImFib3J0ZWQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TWVNURU1fT1VUID0gInN5c3RlbS1vdXQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTV9TWVNURU1fRVJSID0gInN5c3RlbS1lcnIiOworCisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1NOQU1FID0gImNsYXNzbmFtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFID0gInZhbHVlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRSA9ICJ0aW1lIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05VTV9BQk9SVEVEID0gImFib3J0ZWQiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1fRkFJTFVSRVMgPSAiZmFpbHVyZXMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1fVEVTVFMgPSAidGVzdHMiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OVU1fU0tJUFBFRCA9ICJza2lwcGVkIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVTU0FHRSA9ICJtZXNzYWdlIjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVFlQRSA9ICJ0eXBlIjsKKworICAgICAgICB2b2lkIHdyaXRlKCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciA9IFhNTE91dHB1dEZhY3RvcnkubmV3RmFjdG9yeSgpLmNyZWF0ZVhNTFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sICJVVEYtOCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICAgICAgd3JpdGVUZXN0U3VpdGUod3JpdGVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmREb2N1bWVudCgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgd3JpdGVUZXN0U3VpdGUoZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHRlc3RzdWl0ZSBlbGVtZW50CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRUxFTV9URVNUU1VJVEUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RzdWl0ZU5hbWUgPSBkZXRlcm1pbmVUZXN0U3VpdGVOYW1lKCk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OQU1FLCB0ZXN0c3VpdGVOYW1lKTsKKyAgICAgICAgICAgIC8vIHRpbWUgdGFrZW4gZm9yIHRoZSB0ZXN0cyBleGVjdXRpb24KKyAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShBVFRSX1RJTUUsIFN0cmluZy52YWx1ZU9mKCh0ZXN0UGxhbkVuZGVkQXQgLSB0ZXN0UGxhblN0YXJ0ZWRBdCkgLyBPTkVfU0VDT05EKSk7CisgICAgICAgICAgICAvLyBhZGQgdGhlIHRpbWVzdGFtcCBvZiByZXBvcnQgZ2VuZXJhdGlvbgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpbWVzdGFtcCA9IERhdGVVdGlscy5mb3JtYXQobmV3IERhdGUoKSwgRGF0ZVV0aWxzLklTTzg2MDFfREFURVRJTUVfUEFUVEVSTik7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9USU1FU1RBTVAsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OVU1fVEVTVFMsIFN0cmluZy52YWx1ZU9mKG51bVRlc3RzUnVuLmxvbmdWYWx1ZSgpKSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OVU1fRkFJTFVSRVMsIFN0cmluZy52YWx1ZU9mKG51bVRlc3RzRmFpbGVkLmxvbmdWYWx1ZSgpKSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OVU1fU0tJUFBFRCwgU3RyaW5nLnZhbHVlT2YobnVtVGVzdHNTa2lwcGVkLmxvbmdWYWx1ZSgpKSk7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OVU1fQUJPUlRFRCwgU3RyaW5nLnZhbHVlT2YobnVtVGVzdHNBYm9ydGVkLmxvbmdWYWx1ZSgpKSk7CisKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICB3cml0ZVByb3BlcnRpZXMod3JpdGVyKTsKKyAgICAgICAgICAgIC8vIHdyaXRlIHRoZSB0ZXN0cworICAgICAgICAgICAgd3JpdGVUZXN0Q2FzZSh3cml0ZXIpOworICAgICAgICAgICAgd3JpdGVTeXNPdXQod3JpdGVyKTsKKyAgICAgICAgICAgIHdyaXRlU3lzRXJyKHdyaXRlcik7CisgICAgICAgICAgICAvLyBlbmQgdGhlIHRlc3RzdWl0ZQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVByb3BlcnRpZXMoZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBMZWdhY3lYbWxSZXN1bHRGb3JtYXR0ZXIudGhpcy5jb250ZXh0LmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRUxFTV9QUk9QRVJUSUVTKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHByb3AgOiBwcm9wZXJ0aWVzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChFTEVNX1BST1BFUlRZKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9OQU1FLCBwcm9wKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9WQUxVRSwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wKSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZVRlc3RDYXNlKGZpbmFsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8VGVzdElkZW50aWZpZXIsIFN0YXRzPiBlbnRyeSA6IHRlc3RJZHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGlmICghdGVzdElkLmlzVGVzdCgpICYmICFmYWlsZWQuY29udGFpbnNLZXkodGVzdElkKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGludGVyZXN0ZWQgaW4gdGVzdCBtZXRob2RzIHVubGVzcyB0aGVyZSB3YXMgYSBmYWlsdXJlLAorICAgICAgICAgICAgICAgICAgICAvLyBpbiB3aGljaCBjYXNlIHdlIHdhbnQgdGhlIGV4Y2VwdGlvbiByZXBvcnRlZAorICAgICAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02Mzg1MCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3Mgb2YgdGhpcyB0ZXN0CisgICAgICAgICAgICAgICAgZmluYWwgT3B0aW9uYWw8Q2xhc3NTb3VyY2U+IHBhcmVudENsYXNzU291cmNlOworICAgICAgICAgICAgICAgIGlmICh0ZXN0SWQuaXNUZXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xhc3NTb3VyY2UgPSBmaW5kRmlyc3RQYXJlbnRDbGFzc1NvdXJjZSh0ZXN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xhc3NTb3VyY2UgPSBmaW5kRmlyc3RDbGFzc1NvdXJjZSh0ZXN0SWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXBhcmVudENsYXNzU291cmNlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NuYW1lID0gKHBhcmVudENsYXNzU291cmNlLmdldCgpKS5nZXRDbGFzc05hbWUoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRUxFTV9URVNUQ0FTRSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfQ0xBU1NOQU1FLCBjbGFzc25hbWUpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShBVFRSX05BTUUsIHRlc3RJZC5nZXRMZWdhY3lSZXBvcnRpbmdOYW1lKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0YXRzIHN0YXRzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9USU1FLCBTdHJpbmcudmFsdWVPZigoc3RhdHMuZW5kZWRBdCAtIHN0YXRzLnN0YXJ0ZWRBdCkgLyBPTkVfU0VDT05EKSk7CisgICAgICAgICAgICAgICAgLy8gc2tpcHBlZCBlbGVtZW50IGlmIHRoZSB0ZXN0IHdhcyBza2lwcGVkCisgICAgICAgICAgICAgICAgd3JpdGVTa2lwcGVkKHdyaXRlciwgdGVzdElkKTsKKyAgICAgICAgICAgICAgICAvLyBmYWlsZWQgZWxlbWVudCBpZiB0aGUgdGVzdCBmYWlsZWQKKyAgICAgICAgICAgICAgICB3cml0ZUZhaWxlZCh3cml0ZXIsIHRlc3RJZCk7CisgICAgICAgICAgICAgICAgLy8gYWJvcnRlZCBlbGVtZW50IGlmIHRoZSB0ZXN0IHdhcyBhYm9ydGVkCisgICAgICAgICAgICAgICAgd3JpdGVBYm9ydGVkKHdyaXRlciwgdGVzdElkKTsKKworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVNraXBwZWQoZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlciwgZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFza2lwcGVkLmNvbnRhaW5zS2V5KHRlc3RJZGVudGlmaWVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChFTEVNX1NLSVBQRUQpOworICAgICAgICAgICAgZmluYWwgT3B0aW9uYWw8U3RyaW5nPiByZWFzb24gPSBza2lwcGVkLmdldCh0ZXN0SWRlbnRpZmllcik7CisgICAgICAgICAgICBpZiAocmVhc29uLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfTUVTU0FHRSwgcmVhc29uLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZUZhaWxlZChmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWZhaWxlZC5jb250YWluc0tleSh0ZXN0SWRlbnRpZmllcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoRUxFTV9GQUlMVVJFKTsKKyAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPFRocm93YWJsZT4gY2F1c2UgPSBmYWlsZWQuZ2V0KHRlc3RJZGVudGlmaWVyKTsKKyAgICAgICAgICAgIGlmIChjYXVzZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0ID0gY2F1c2UuZ2V0KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmICFtZXNzYWdlLnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfTUVTU0FHRSwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShBVFRSX1RZUEUsIHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIC8vIHdyaXRlIG91dCB0aGUgc3RhY2t0cmFjZQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNEYXRhKFN0cmluZ1V0aWxzLmdldFN0YWNrVHJhY2UodCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQWJvcnRlZChmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyLCBmaW5hbCBUZXN0SWRlbnRpZmllciB0ZXN0SWRlbnRpZmllcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWFib3J0ZWQuY29udGFpbnNLZXkodGVzdElkZW50aWZpZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEVMRU1fQUJPUlRFRCk7CisgICAgICAgICAgICBmaW5hbCBPcHRpb25hbDxUaHJvd2FibGU+IGNhdXNlID0gYWJvcnRlZC5nZXQodGVzdElkZW50aWZpZXIpOworICAgICAgICAgICAgaWYgKGNhdXNlLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHQgPSBjYXVzZS5nZXQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHQuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IG51bGwgJiYgIW1lc3NhZ2UudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoQVRUUl9NRVNTQUdFLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKEFUVFJfVFlQRSwgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgLy8gd3JpdGUgb3V0IHRoZSBzdGFja3RyYWNlCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQ0RhdGEoU3RyaW5nVXRpbHMuZ2V0U3RhY2tUcmFjZSh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVTeXNPdXQoZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFMZWdhY3lYbWxSZXN1bHRGb3JtYXR0ZXIudGhpcy5oYXNTeXNPdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChFTEVNX1NZU1RFTV9PVVQpOworICAgICAgICAgICAgdHJ5IChmaW5hbCBSZWFkZXIgcmVhZGVyID0gTGVnYWN5WG1sUmVzdWx0Rm9ybWF0dGVyLnRoaXMuZ2V0U3lzT3V0UmVhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZUNoYXJhY3RlcnNGcm9tKHJlYWRlciwgd3JpdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVN5c0VycihmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIUxlZ2FjeVhtbFJlc3VsdEZvcm1hdHRlci50aGlzLmhhc1N5c0VycigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KEVMRU1fU1lTVEVNX0VSUik7CisgICAgICAgICAgICB0cnkgKGZpbmFsIFJlYWRlciByZWFkZXIgPSBMZWdhY3lYbWxSZXN1bHRGb3JtYXR0ZXIudGhpcy5nZXRTeXNFcnJSZWFkZXIoKSkgeworICAgICAgICAgICAgICAgIHdyaXRlQ2hhcmFjdGVyc0Zyb20ocmVhZGVyLCB3cml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ2hhcmFjdGVyc0Zyb20oZmluYWwgUmVhZGVyIHJlYWRlciwgZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uLCBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgICAgICBpbnQgbnVtUmVhZCA9IC0xOworICAgICAgICAgICAgd2hpbGUgKChudW1SZWFkID0gcmVhZGVyLnJlYWQoY2hhcnMpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIC8vIGFsdGhvdWdoIGl0J3MgY2FsbGVkIGEgRE9NRWxlbWVudFdyaXRlciwgdGhlIGVuY29kZSBtZXRob2QgaXMganVzdCBhCisgICAgICAgICAgICAgICAgLy8gc3RyYWlnaHQgZm9yd2FyZCBYTUwgdXRpbCBtZXRob2Qgd2hpY2ggZG9lc24ndCBjb25jZXJuIGFib3V0IHdoZXRoZXIKKyAgICAgICAgICAgICAgICAvLyBET00sIFNBWCwgU3RBWCBzZW1hbnRpY3MuCisgICAgICAgICAgICAgICAgLy8gVE9ETzogUGVyaGFwcyBtYWtlIGl0IGEgc3RhdGljIG1ldGhvZAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbmNvZGVkID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKS5lbmNvZGUobmV3IFN0cmluZyhjaGFycywgMCwgbnVtUmVhZCkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoZW5jb2RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBkZXRlcm1pbmVUZXN0U3VpdGVOYW1lKCkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyByZWFsbHkgYSBoYWNrIHRvIHRyeSBhbmQgbWF0Y2ggdGhlIGV4cGVjdGF0aW9ucyBvZiB0aGUgWE1MIHJlcG9ydCBpbiBKVW5pdDQueAorICAgICAgICAgICAgLy8gd29ybGQuIEluIEpVbml0NSwgdGhlIFRlc3RQbGFuIGRvZXNuJ3QgaGF2ZSBhIG5hbWUgYW5kIGEgVGVzdFBsYW4gKGZvciB3aGljaCB0aGlzIGlzIGEKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyKSBjYW4gaGF2ZSBudW1lcm91cyB0ZXN0cyB3aXRoaW4gaXQKKyAgICAgICAgICAgIGZpbmFsIFNldDxUZXN0SWRlbnRpZmllcj4gcm9vdHMgPSB0ZXN0UGxhbi5nZXRSb290cygpOworICAgICAgICAgICAgaWYgKHJvb3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGZpbmFsIFRlc3RJZGVudGlmaWVyIHJvb3QgOiByb290cykgeworICAgICAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPENsYXNzU291cmNlPiBjbGFzc1NvdXJjZSA9IGZpbmRGaXJzdENsYXNzU291cmNlKHJvb3QpOworICAgICAgICAgICAgICAgIGlmIChjbGFzc1NvdXJjZS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NTb3VyY2UuZ2V0KCkuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT3B0aW9uYWw8Q2xhc3NTb3VyY2U+IGZpbmRGaXJzdENsYXNzU291cmNlKGZpbmFsIFRlc3RJZGVudGlmaWVyIHJvb3QpIHsKKyAgICAgICAgICAgIGlmIChyb290LmdldFNvdXJjZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGVzdFNvdXJjZSBzb3VyY2UgPSByb290LmdldFNvdXJjZSgpLmdldCgpOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBDbGFzc1NvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoKENsYXNzU291cmNlKSBzb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoZmluYWwgVGVzdElkZW50aWZpZXIgY2hpbGQgOiB0ZXN0UGxhbi5nZXRDaGlsZHJlbihyb290KSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9wdGlvbmFsPENsYXNzU291cmNlPiBjbGFzc1NvdXJjZSA9IGZpbmRGaXJzdENsYXNzU291cmNlKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhc3NTb3VyY2UuaXNQcmVzZW50KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzU291cmNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPcHRpb25hbDxDbGFzc1NvdXJjZT4gZmluZEZpcnN0UGFyZW50Q2xhc3NTb3VyY2UoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkKSB7CisgICAgICAgICAgICBmaW5hbCBPcHRpb25hbDxUZXN0SWRlbnRpZmllcj4gcGFyZW50ID0gdGVzdFBsYW4uZ2V0UGFyZW50KHRlc3RJZCk7CisgICAgICAgICAgICBpZiAoIXBhcmVudC5pc1ByZXNlbnQoKSB8fCAhcGFyZW50LmdldCgpLmdldFNvdXJjZSgpLmlzUHJlc2VudCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBUZXN0U291cmNlIHBhcmVudFNvdXJjZSA9IHBhcmVudC5nZXQoKS5nZXRTb3VyY2UoKS5nZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRTb3VyY2UgaW5zdGFuY2VvZiBDbGFzc1NvdXJjZSA/IE9wdGlvbmFsLm9mKChDbGFzc1NvdXJjZSkgcGFyZW50U291cmNlKQorICAgICAgICAgICAgICAgICAgICA6IGZpbmRGaXJzdFBhcmVudENsYXNzU291cmNlKHBhcmVudC5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvU3RhbmRhbG9uZUxhdW5jaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1N0YW5kYWxvbmVMYXVuY2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZjZjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1N0YW5kYWxvbmVMYXVuY2hlci5qYXZhCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuSlVuaXRMYXVuY2hlclRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5MYXVuY2hEZWZpbml0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuTGlzdGVuZXJEZWZpbml0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuU2luZ2xlVGVzdENsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuVGVzdENsYXNzZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5UZXN0RGVmaW5pdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuRU5EX0RPQ1VNRU5UOworaW1wb3J0IHN0YXRpYyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVDsKK2ltcG9ydCBzdGF0aWMgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRE9DVU1FTlQ7CitpbXBvcnQgc3RhdGljIGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0VYQ0xVREVfVEFHUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9JTkNMVURFX1RBR1M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX1BSSU5UX1NVTU1BUlk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9FTE1fTEFVTkNIX0RFRjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0VMTV9MSVNURU5FUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0VMTV9URVNUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfRUxNX1RFU1RfQ0xBU1NFUzsKKworCisvKioKKyAqIFVzZWQgZm9yIGxhdW5jaGluZyBmb3JrZWQgdGVzdHMgZnJvbSB0aGUge0BsaW5rIEpVbml0TGF1bmNoZXJUYXNrfS4KKyAqIDxwPgorICogQWx0aG91Z2ggdGhpcyBjbGFzcyBpcyBwdWJsaWMsIHRoaXMgaXNuJ3QgbWVhbnQgZm9yIGV4dGVybmFsIHVzZS4gVGhlIGNvbnRyYWN0IG9mIHdoYXQKKyAqIHByb2dyYW0gYXJndW1lbnRzIHtAbGluayAjbWFpbihTdHJpbmdbXSkgdGhlIG1haW4gbWV0aG9kfSBhY2NlcHRzIGFuZCBob3cgaXQgaW50ZXJwcmV0cyBpdCwKKyAqIGlzIGFsc28gYW4gaW50ZXJuYWwgZGV0YWlsIGFuZCBjYW4gY2hhbmdlIGFjcm9zcyBBbnQgcmVsZWFzZXMuCisgKgorICogQHNpbmNlIEFudCAxLjEwLjYKKyAqLworcHVibGljIGNsYXNzIFN0YW5kYWxvbmVMYXVuY2hlciB7CisKKyAgICAvKioKKyAgICAgKiBFbnRyeSBwb2ludCB0byBsYXVuY2hpbmcgdGhlIGZvcmtlZCB0ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgVGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhpcyBwcm9ncmFtIGZvciBsYXVuY2hpbmcgdGhlIHRlc3RzCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSWYgYW55IGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBleGVjdXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVGhlIG1haW4gcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBlbnRyeSBwb2ludCBpcyB0byBjcmVhdGUgYSBMYXVuY2hEZWZpbml0aW9uLAorICAgICAgICAvLyBieSBwYXJzaW5nIHRoZSBwYXNzZWQgYXJndW1lbnRzIGFuZCB0aGVuIHVzZSB0aGUgTGF1bmNoZXJTdXBwb3J0IHRvCisgICAgICAgIC8vIExhdW5jaGVyU3VwcG9ydCNsYXVuY2ggdGhlIHRlc3RzCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGb3JrZWRMYXVuY2ggbGF1bmNoRGVmaW5pdGlvbiA9IG51bGw7CisgICAgICAgICAgICBmaW5hbCBGb3JrZWRFeGVjdXRpb24gZm9ya2VkRXhlY3V0aW9uID0gbmV3IEZvcmtlZEV4ZWN1dGlvbigpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFyZyA9IGFyZ3NbaV07CisgICAgICAgICAgICAgICAgaW50IG51bUFyZ3NDb25zdW1lZCA9IDE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuQVJHX1BST1BFUlRJRVM6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggcHJvcHNQYXRoID0gUGF0aHMuZ2V0KGFyZ3NbaSArIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghRmlsZXMuaXNSZWd1bGFyRmlsZShwcm9wc1BhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwcm9wc1BhdGggKyAiIGRvZXMgbm90IHBvaW50IHRvIGEgcHJvcGVydGllcyBmaWxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKHByb3BzUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9ya2VkRXhlY3V0aW9uLnNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1BcmdzQ29uc3VtZWQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDb25zdGFudHMuQVJHX0xBVU5DSF9ERUZJTklUSU9OOiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIGxhdW5jaERlZlhtbFBhdGggPSBQYXRocy5nZXQoYXJnc1tpICsgMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFGaWxlcy5pc1JlZ3VsYXJGaWxlKGxhdW5jaERlZlhtbFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihsYXVuY2hEZWZYbWxQYXRoICsgIiBkb2VzIG5vdCBwb2ludCB0byBhIGxhdW5jaCBkZWZpbml0aW9uIGZpbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaERlZmluaXRpb24gPSBwYXJzZUxhdW5jaERlZmluaXRpb24obGF1bmNoRGVmWG1sUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1BcmdzQ29uc3VtZWQgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IGkgKyBudW1BcmdzQ29uc3VtZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIExhdW5jaGVyU3VwcG9ydCBsYXVuY2hlclN1cHBvcnQgPSBuZXcgTGF1bmNoZXJTdXBwb3J0KGxhdW5jaERlZmluaXRpb24sIGZvcmtlZEV4ZWN1dGlvbik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxhdW5jaGVyU3VwcG9ydC5sYXVuY2goKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgaWYgKGxhdW5jaGVyU3VwcG9ydC5oYXNUZXN0RmFpbHVyZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChDb25zdGFudHMuRk9SS19FWElUX0NPREVfVEVTVFNfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXVuY2hlclN1cHBvcnQuaGFzVGVzdEZhaWx1cmVzKCkpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdChDb25zdGFudHMuRk9SS19FWElUX0NPREVfVEVTVFNfRkFJTEVEKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0uZXhpdChDb25zdGFudHMuRk9SS19FWElUX0NPREVfU1VDQ0VTUyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZvcmtlZExhdW5jaCBwYXJzZUxhdW5jaERlZmluaXRpb24oZmluYWwgUGF0aCBwYXRoVG9MYXVuY2hEZWZYbWwpIHsKKyAgICAgICAgaWYgKHBhdGhUb0xhdW5jaERlZlhtbCA9PSBudWxsIHx8ICFGaWxlcy5pc1JlZ3VsYXJGaWxlKHBhdGhUb0xhdW5jaERlZlhtbCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocGF0aFRvTGF1bmNoRGVmWG1sICsgIiBpcyBub3QgYSBmaWxlIik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRm9ya2VkTGF1bmNoIGZvcmtlZExhdW5jaCA9IG5ldyBGb3JrZWRMYXVuY2goKTsKKyAgICAgICAgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKHBhdGhUb0xhdW5jaERlZlhtbCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIgPSBYTUxJbnB1dEZhY3RvcnkubmV3RmFjdG9yeSgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7CisgICAgICAgICAgICByZWFkZXIucmVxdWlyZShTVEFSVF9ET0NVTUVOVCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZWFkZXIubmV4dFRhZygpOworICAgICAgICAgICAgcmVhZGVyLnJlcXVpcmUoU1RBUlRfRUxFTUVOVCwgbnVsbCwgTERfWE1MX0VMTV9MQVVOQ0hfREVGKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYWx0T25GYWlsdXJlID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX0hBTFRfT05fRkFJTFVSRSk7CisgICAgICAgICAgICBpZiAoaGFsdE9uRmFpbHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9ya2VkTGF1bmNoLnNldEhhbHRPbkZhaWx1cmUoQm9vbGVhbi5wYXJzZUJvb2xlYW4oaGFsdE9uRmFpbHVyZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluY2x1ZGVUYWdzID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX0lOQ0xVREVfVEFHUyk7CisgICAgICAgICAgICBpZiAoaW5jbHVkZVRhZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmVhbS5vZihpbmNsdWRlVGFncy5zcGxpdCgiLCIpKS5mb3JFYWNoKGkgLT4gZm9ya2VkTGF1bmNoLmFkZEluY2x1ZGVUYWcoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2x1ZGVUYWdzID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX0VYQ0xVREVfVEFHUyk7CisgICAgICAgICAgICBpZiAoZXhjbHVkZVRhZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmVhbS5vZihleGNsdWRlVGFncy5zcGxpdCgiLCIpKS5mb3JFYWNoKGUgLT4gZm9ya2VkTGF1bmNoLmFkZEV4Y2x1ZGVUYWcoZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByaW50U3VtbWFyeSA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9QUklOVF9TVU1NQVJZKTsKKyAgICAgICAgICAgIGlmIChwcmludFN1bW1hcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvcmtlZExhdW5jaC5zZXRQcmludFN1bW1hcnkoQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJpbnRTdW1tYXJ5KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV4dFRhZyA9IHJlYWRlci5uZXh0VGFnKCk7CisgICAgICAgICAgICB3aGlsZSAobmV4dFRhZyA9PSBTVEFSVF9FTEVNRU5UKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnJlcXVpcmUoU1RBUlRfRUxFTUVOVCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lID0gcmVhZGVyLmdldExvY2FsTmFtZSgpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudE5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMRF9YTUxfRUxNX1RFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtlZExhdW5jaC5hZGRUZXN0cyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFNpbmdsZVRlc3RDbGFzcy5mcm9tRm9ya2VkUmVwcmVzZW50YXRpb24ocmVhZGVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSBMRF9YTUxfRUxNX1RFU1RfQ0xBU1NFUzogeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ya2VkTGF1bmNoLmFkZFRlc3RzKFRlc3RDbGFzc2VzLmZyb21Gb3JrZWRSZXByZXNlbnRhdGlvbihyZWFkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTERfWE1MX0VMTV9MSVNURU5FUjogeworICAgICAgICAgICAgICAgICAgICAgICAgZm9ya2VkTGF1bmNoLmFkZExpc3RlbmVyKExpc3RlbmVyRGVmaW5pdGlvbi5mcm9tRm9ya2VkUmVwcmVzZW50YXRpb24ocmVhZGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0VGFnID0gcmVhZGVyLm5leHRUYWcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlci5yZXF1aXJlKEVORF9FTEVNRU5ULCBudWxsLCBMRF9YTUxfRUxNX0xBVU5DSF9ERUYpOworICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJlYWRlci5yZXF1aXJlKEVORF9ET0NVTUVOVCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gZm9ya2VkTGF1bmNoOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY29uc3RydWN0IGRlZmluaXRpb24gZnJvbSBmb3JrZWQgcmVwcmVzZW50YXRpb24iLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRm9ya2VkRXhlY3V0aW9uIGltcGxlbWVudHMgVGVzdEV4ZWN1dGlvbkNvbnRleHQgeworICAgICAgICBwcml2YXRlIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgcHJpdmF0ZSBGb3JrZWRFeGVjdXRpb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZvcmtlZEV4ZWN1dGlvbiBzZXRQcm9wZXJ0aWVzKGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllcykgeworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPcHRpb25hbDxQcm9qZWN0PiBnZXRQcm9qZWN0KCkgeworICAgICAgICAgICAgLy8gZm9ya2VkIGV4ZWN1dGlvbiB3b24ndCBoYXZlIGFjY2VzcyB0byB0aGUgQW50IFByb2plY3QKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRm9ya2VkTGF1bmNoIGltcGxlbWVudHMgTGF1bmNoRGVmaW5pdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByaW50U3VtbWFyeTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhbHRPbkZhaWx1cmU7CisgICAgICAgIHByaXZhdGUgTGlzdDxUZXN0RGVmaW5pdGlvbj4gdGVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PExpc3RlbmVyRGVmaW5pdGlvbj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGluY2x1ZGVUYWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVUYWdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFRlc3REZWZpbml0aW9uPiBnZXRUZXN0cygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnRlc3RzOworICAgICAgICB9CisKKyAgICAgICAgRm9ya2VkTGF1bmNoIGFkZFRlc3RzKGZpbmFsIExpc3Q8VGVzdERlZmluaXRpb24+IHRlc3RzKSB7CisgICAgICAgICAgICB0aGlzLnRlc3RzLmFkZEFsbCh0ZXN0cyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxMaXN0ZW5lckRlZmluaXRpb24+IGdldExpc3RlbmVycygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmxpc3RlbmVyczsKKyAgICAgICAgfQorCisgICAgICAgIEZvcmtlZExhdW5jaCBhZGRMaXN0ZW5lcihmaW5hbCBMaXN0ZW5lckRlZmluaXRpb24gbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaW50U3VtbWFyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW50U3VtbWFyeTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRm9ya2VkTGF1bmNoIHNldFByaW50U3VtbWFyeShmaW5hbCBib29sZWFuIHByaW50U3VtbWFyeSkgeworICAgICAgICAgICAgdGhpcy5wcmludFN1bW1hcnkgPSBwcmludFN1bW1hcnk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0hhbHRPbkZhaWx1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5oYWx0T25GYWlsdXJlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZvcmtlZExhdW5jaCBzZXRIYWx0T25GYWlsdXJlKGZpbmFsIGJvb2xlYW4gaGFsdE9uRmFpbHVyZSkgeworICAgICAgICAgICAgdGhpcy5oYWx0T25GYWlsdXJlID0gaGFsdE9uRmFpbHVyZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkSW5jbHVkZVRhZyhmaW5hbCBTdHJpbmcgZmlsdGVyKSB7CisgICAgICAgICAgICB0aGlzLmluY2x1ZGVUYWdzLmFkZChmaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZVRhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5jbHVkZVRhZ3M7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGFkZEV4Y2x1ZGVUYWcoZmluYWwgU3RyaW5nIGZpbHRlcikgeworICAgICAgICAgICAgdGhpcy5leGNsdWRlVGFncy5hZGQoZmlsdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEV4Y2x1ZGVUYWdzKCkgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVUYWdzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9UZXN0RXhlY3V0aW9uQ29udGV4dC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9UZXN0RXhlY3V0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTMwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1Rlc3RFeGVjdXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5KVW5pdExhdW5jaGVyVGFzazsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworLyoqCisgKiBBIHtAbGluayBUZXN0RXhlY3V0aW9uQ29udGV4dH0gcmVwcmVzZW50cyB0aGUgZXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgdGVzdAorICogdGhhdCBoYXMgYmVlbiBsYXVuY2hlZCBieSB0aGUge0BsaW5rIEpVbml0TGF1bmNoZXJUYXNrfSBhbmQgcHJvdmlkZXMgYW55IG5lY2Vzc2FyeQorICogY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhYm91dCBzdWNoIHRlc3RzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RFeGVjdXRpb25Db250ZXh0IHsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJvcGVydGllcyB0aGF0IHdlcmUgdXNlZCBmb3IgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdAorICAgICAqLworICAgIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpOworCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHtAbGluayBQcm9qZWN0fSBpbiB3aG9zZSBjb250ZXh0IHRoZSB0ZXN0IGlzIGJlaW5nIGV4ZWN1dGVkLgorICAgICAqIFRoZSB7QGNvZGUgUHJvamVjdH0gaXMgc29tZXRpbWVzIG5vdCBhdmFpbGFibGUsIGxpa2UgaW4gdGhlIGNhc2Ugd2hlcmUKKyAgICAgKiB0aGUgdGVzdCBpcyBiZWluZyBydW4gaW4gYSBmb3JrZWQgbW9kZSwgaW4gc3VjaCBjYXNlcyB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICoge0BsaW5rIE9wdGlvbmFsI2VtcHR5KCkgYW4gZW1wdHkgdmFsdWV9CisgICAgICovCisgICAgT3B0aW9uYWw8UHJvamVjdD4gZ2V0UHJvamVjdCgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9UZXN0UmVxdWVzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9UZXN0UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjM5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1Rlc3RSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkpVbml0TGF1bmNoZXJUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuVGVzdERlZmluaXRpb247CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLmNvcmUuTGF1bmNoZXJEaXNjb3ZlcnlSZXF1ZXN0QnVpbGRlcjsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEhvbGRzIHRvZ2V0aGVyIHRoZSBuZWNlc3NhcnkgZGV0YWlscyBhYm91dCBhIHJlcXVlc3QgdGhhdCB3aWxsIGJlIGxhdW5jaGVkIGJ5IHRoZSB7QGxpbmsgSlVuaXRMYXVuY2hlclRhc2t9CisgKi8KK2ZpbmFsIGNsYXNzIFRlc3RSZXF1ZXN0IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0RGVmaW5pdGlvbiBvd25lclRlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBMYXVuY2hlckRpc2NvdmVyeVJlcXVlc3RCdWlsZGVyIGRpc2NvdmVyeVJlcXVlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsb3NlYWJsZT4gY2xvc2FibGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRlc3RSZXN1bHRGb3JtYXR0ZXI+IGludGVyZXN0ZWRJblN5c091dCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXN0UmVzdWx0Rm9ybWF0dGVyPiBpbnRlcmVzdGVkSW5TeXNFcnIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgVGVzdFJlcXVlc3QoZmluYWwgVGVzdERlZmluaXRpb24gb3duZXJUZXN0LCBmaW5hbCBMYXVuY2hlckRpc2NvdmVyeVJlcXVlc3RCdWlsZGVyIGRpc2NvdmVyeVJlcXVlc3QpIHsKKyAgICAgICAgdGhpcy5vd25lclRlc3QgPSBvd25lclRlc3Q7CisgICAgICAgIHRoaXMuZGlzY292ZXJ5UmVxdWVzdCA9IGRpc2NvdmVyeVJlcXVlc3Q7CisgICAgfQorCisgICAgVGVzdERlZmluaXRpb24gZ2V0T3duZXIoKSB7CisgICAgICAgIHJldHVybiBvd25lclRlc3Q7CisgICAgfQorCisgICAgTGF1bmNoZXJEaXNjb3ZlcnlSZXF1ZXN0QnVpbGRlciBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gZGlzY292ZXJ5UmVxdWVzdDsKKyAgICB9CisKKyAgICB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKyAgICB2b2lkIGNsb3NlVXBvbkNvbXBsZXRpb24oZmluYWwgQ2xvc2VhYmxlIGNsb3NlYWJsZSkgeworICAgICAgICBpZiAoY2xvc2VhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmNsb3NhYmxlcy5hZGQoY2xvc2VhYmxlKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFN5c091dEludGVyZXN0KGZpbmFsIFRlc3RSZXN1bHRGb3JtYXR0ZXIgb3V0KSB7CisgICAgICAgIHRoaXMuaW50ZXJlc3RlZEluU3lzT3V0LmFkZChvdXQpOworICAgIH0KKworICAgIGJvb2xlYW4gaW50ZXJlc3RlZEluU3lzT3V0KCkgeworICAgICAgICByZXR1cm4gIXRoaXMuaW50ZXJlc3RlZEluU3lzT3V0LmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPFRlc3RSZXN1bHRGb3JtYXR0ZXI+IGdldFN5c091dEludGVyZXN0cygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5pbnRlcmVzdGVkSW5TeXNPdXQpOworICAgIH0KKworICAgIHZvaWQgYWRkU3lzRXJySW50ZXJlc3QoZmluYWwgVGVzdFJlc3VsdEZvcm1hdHRlciBlcnIpIHsKKyAgICAgICAgdGhpcy5pbnRlcmVzdGVkSW5TeXNFcnIuYWRkKGVycik7CisgICAgfQorCisgICAgYm9vbGVhbiBpbnRlcmVzdGVkSW5TeXNFcnIoKSB7CisgICAgICAgIHJldHVybiAhdGhpcy5pbnRlcmVzdGVkSW5TeXNFcnIuaXNFbXB0eSgpOworICAgIH0KKworICAgIENvbGxlY3Rpb248VGVzdFJlc3VsdEZvcm1hdHRlcj4gZ2V0U3lzRXJySW50ZXJlc3RzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmludGVyZXN0ZWRJblN5c0Vycik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRoaXMuY2xvc2FibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgQ2xvc2VhYmxlIGNsb3NlYWJsZSA6IGNsb3NhYmxlcykgeworICAgICAgICAgICAgY2xvc2VhYmxlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1Rlc3RSZXN1bHRGb3JtYXR0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvVGVzdFJlc3VsdEZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL1Rlc3RSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyOworCitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmxhdW5jaGVyLlRlc3RFeGVjdXRpb25MaXN0ZW5lcjsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCisvKioKKyAqIEEge0Bjb2RlIFRlc3RFeGVjdXRpb25MaXN0ZW5lcn0gd2hpY2ggbGV0cyBpbXBsZW1lbnRpbmcgY2xhc3NlcworICogZm9ybWF0IGFuZCB3cml0ZSBvdXQgdGhlIHRlc3QgZXhlY3V0aW9uIHJlc3VsdHMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdFJlc3VsdEZvcm1hdHRlciBleHRlbmRzIFRlc3RFeGVjdXRpb25MaXN0ZW5lciwgQ2xvc2VhYmxlIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgPGNvZGU+anVuaXRsYXVuY2hlcjwvY29kZT4gYW5kIHdpbGwgYmUgcGFzc2VkIHRoZQorICAgICAqIHtAbGluayBPdXRwdXRTdHJlYW19IHRvIGEgZmlsZSwgdG8gd2hpY2ggdGhlIGZvcm1hdHRlZCByZXN1bHQgaXMgZXhwZWN0ZWQgdG8gYmUgd3JpdHRlbgorICAgICAqIHRvLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uY2UsIGVhcmx5IG9uLCBkdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoaXMKKyAgICAgKiB7QGxpbmsgVGVzdFJlc3VsdEZvcm1hdHRlcn0sIHR5cGljYWxseSBiZWZvcmUgdGhlIHRlc3QgZXhlY3V0aW9uIGl0c2VsZiBoYXMgc3RhcnRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3MgVGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdG8gd3JpdGUgb3V0IHRoZSByZXN1bHQKKyAgICAgKi8KKyAgICB2b2lkIHNldERlc3RpbmF0aW9uKE91dHB1dFN0cmVhbSBvcyk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIDxjb2RlPmp1bml0bGF1bmNoZXI8L2NvZGU+IGFuZCB3aWxsIGJlIHBhc3NlZCBhCisgICAgICoge0BsaW5rIFRlc3RFeGVjdXRpb25Db250ZXh0fS4gVGhpcyBhbGxvd3MgdGhlIHtAbGluayBUZXN0UmVzdWx0Rm9ybWF0dGVyfSB0byBoYXZlIGFjY2VzcworICAgICAqIHRvIGFueSBhZGRpdGlvbmFsIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSB0ZXN0IHJlcG9ydHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dCBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0ZXN0CisgICAgICovCisgICAgdm9pZCBzZXRDb250ZXh0KFRlc3RFeGVjdXRpb25Db250ZXh0IGNvbnRleHQpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGJ5IHRoZSA8Y29kZT5qdW5pdGxhdW5jaGVyPC9jb2RlPiwgPHN0cm9uZz5yZWd1bGFybHkvbXVsdGlwbGUgdGltZXM8L3N0cm9uZz4sCisgICAgICogYXMgYW5kIHdoZW4gYW55IGNvbnRlbnQgaXMgZ2VuZXJhdGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgPGNvZGU+c2VuZFN5c091dDwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT5saXN0ZW5lcjwvY29kZT4sCisgICAgICogdG8gd2hpY2ggdGhpcyB7QGxpbmsgVGVzdFJlc3VsdEZvcm1hdHRlcn0gaXMgY29uZmlndXJlZCBmb3IsIGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBjb250ZW50IGdlbmVyYXRlZCBvbiBzdGFuZGFyZCBvdXRwdXQgc3RyZWFtCisgICAgICovCisgICAgZGVmYXVsdCB2b2lkIHN5c091dEF2YWlsYWJsZShieXRlW10gZGF0YSkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgPGNvZGU+anVuaXRsYXVuY2hlcjwvY29kZT4sIDxzdHJvbmc+cmVndWxhcmx5L211bHRpcGxlIHRpbWVzPC9zdHJvbmc+LAorICAgICAqIGFzIGFuZCB3aGVuIGFueSBjb250ZW50IGlzIGdlbmVyYXRlZCBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBiZSBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgPGNvZGU+c2VuZFN5c0VycjwvY29kZT4gYXR0cmlidXRlIG9mIHRoZSA8Y29kZT5saXN0ZW5lcjwvY29kZT4sCisgICAgICogdG8gd2hpY2ggdGhpcyB7QGxpbmsgVGVzdFJlc3VsdEZvcm1hdHRlcn0gaXMgY29uZmlndXJlZCBmb3IsIGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBjb250ZW50IGdlbmVyYXRlZCBvbiBzdGFuZGFyZCBlcnJvciBzdHJlYW0KKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgc3lzRXJyQXZhaWxhYmxlKGJ5dGVbXSBkYXRhKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL0NvbnN0YW50cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ1OTAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQ7CisKKy8qKgorICogQ29uc3RhbnRzIHVzZWQgd2l0aGluIHRoZSBqdW5pdGxhdW5jaGVyIHRhc2sKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnN0YW50cyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JLX0VYSVRfQ09ERV9TVUNDRVNTID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGT1JLX0VYSVRfQ09ERV9FWENFUFRJT04gPSAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUktfRVhJVF9DT0RFX1RFU1RTX0ZBSUxFRCA9IDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9SS19FWElUX0NPREVfVElNRURfT1VUID0gMzsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR19QUk9QRVJUSUVTID0gIi0tcHJvcGVydGllcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHX0xBVU5DSF9ERUZJTklUSU9OID0gIi0tbGF1bmNoLWRlZmluaXRpb24iOworCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfRUxNX0xBVU5DSF9ERUYgPSAibGF1bmNoLWRlZmluaXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEX1hNTF9FTE1fVEVTVCA9ICJ0ZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfRUxNX1RFU1RfQ0xBU1NFUyA9ICJ0ZXN0LWNsYXNzZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEX1hNTF9BVFRSX0hBTFRfT05fRkFJTFVSRSA9ICJoYWx0T25GYWlsdXJlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfQVRUUl9JTkNMVURFX1RBR1MgPSAiaW5jbHVkZVRhZ3MiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEX1hNTF9BVFRSX0VYQ0xVREVfVEFHUyA9ICJleGNsdWRlVGFncyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERfWE1MX0FUVFJfT1VUUFVUX0RJUkVDVE9SWSA9ICJvdXREaXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEX1hNTF9BVFRSX0lOQ0xVREVfRU5HSU5FUyA9ICJpbmNsdWRlRW5naW5lcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERfWE1MX0FUVFJfRVhDTFVERV9FTkdJTkVTID0gImV4Y2x1ZGVFbmdpbmVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfQVRUUl9DTEFTU19OQU1FID0gImNsYXNzbmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERfWE1MX0FUVFJfTUVUSE9EUyA9ICJtZXRob2RzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfQVRUUl9QUklOVF9TVU1NQVJZID0gInByaW50U3VtbWFyeSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERfWE1MX0VMTV9MSVNURU5FUiA9ICJsaXN0ZW5lciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTERfWE1MX0FUVFJfU0VORF9TWVNfRVJSID0gInNlbmRTeXNFcnIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEX1hNTF9BVFRSX1NFTkRfU1lTX09VVCA9ICJzZW5kU3lzT3V0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRF9YTUxfQVRUUl9MSVNURU5FUl9SRVNVTFRfRklMRSA9ICJyZXN1bHRGaWxlIjsKKworCisgICAgcHJpdmF0ZSBDb25zdGFudHMoKSB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL0ZvcmtEZWZpbml0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL0ZvcmtEZWZpbml0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhMDFkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvRm9ya0RlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Qcm9wZXJ0eVNldDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGNvZGUgZm9ya30gZWxlbWVudCB3aXRoaW4gdGVzdCBkZWZpbml0aW9ucyBvZiB0aGUKKyAqIHtAY29kZSBqdW5pdGxhdW5jaGVyfSB0YXNrCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JrRGVmaW5pdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBTE9ORV9MQVVOQ0hFUl9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuU3RhbmRhbG9uZUxhdW5jaGVyIjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlQW50UnVudGltZUxpYnJhcmllcyA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzID0gdHJ1ZTsKKworICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRMaW5lSmF2YTsKKyAgICBwcml2YXRlIGZpbmFsIEVudmlyb25tZW50IGVudiA9IG5ldyBFbnZpcm9ubWVudCgpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGlyOworICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gLTE7CisKKyAgICBGb3JrRGVmaW5pdGlvbigpIHsKKyAgICAgICAgdGhpcy5jb21tYW5kTGluZUphdmEgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGlyKGZpbmFsIFN0cmluZyBkaXIpIHsKKyAgICAgICAgdGhpcy5kaXIgPSBkaXI7CisgICAgfQorCisgICAgU3RyaW5nIGdldERpcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGlyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgbG9uZyB0aW1lb3V0KSB7CisgICAgICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXQ7CisgICAgfQorCisgICAgbG9uZyBnZXRUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gdGhpcy50aW1lb3V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzKGZpbmFsIGJvb2xlYW4gaW5jbHVkZSkgeworICAgICAgICB0aGlzLmluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzID0gaW5jbHVkZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlQW50UnVudGltZUxpYnJhcmllcyhmaW5hbCBib29sZWFuIGluY2x1ZGUpIHsKKyAgICAgICAgdGhpcy5pbmNsdWRlQW50UnVudGltZUxpYnJhcmllcyA9IGluY2x1ZGU7CisgICAgfQorCisgICAgcHVibGljIENvbW1hbmRsaW5lLkFyZ3VtZW50IGNyZWF0ZUp2bUFyZygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuY29tbWFuZExpbmVKYXZhLmNyZWF0ZVZtQXJndW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU3lzUHJvcGVydHkoZmluYWwgRW52aXJvbm1lbnQuVmFyaWFibGUgc3lzUHJvcCkgeworICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IGtleS92YWx1ZSBhcmUgcHJlc2VudAorICAgICAgICBzeXNQcm9wLnZhbGlkYXRlKCk7CisgICAgICAgIHRoaXMuY29tbWFuZExpbmVKYXZhLmFkZFN5c3Byb3BlcnR5KHN5c1Byb3ApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRTeXNQcm9wZXJ0eVNldChmaW5hbCBQcm9wZXJ0eVNldCBwcm9wZXJ0eVNldCkgeworICAgICAgICB0aGlzLmNvbW1hbmRMaW5lSmF2YS5hZGRTeXNwcm9wZXJ0eXNldChwcm9wZXJ0eVNldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZEVudihmaW5hbCBFbnZpcm9ubWVudC5WYXJpYWJsZSB2YXIpIHsKKyAgICAgICAgdGhpcy5lbnYuYWRkVmFyaWFibGUodmFyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTW9kdWxlUGF0aChmaW5hbCBQYXRoIG1vZHVsZVBhdGgpIHsKKyAgICAgICAgdGhpcy5jb21tYW5kTGluZUphdmEuY3JlYXRlTW9kdWxlcGF0aChtb2R1bGVQYXRoLmdldFByb2plY3QoKSkuYWRkKG1vZHVsZVBhdGgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRVcGdyYWRlTW9kdWxlUGF0aChmaW5hbCBQYXRoIHVwZ3JhZGVNb2R1bGVQYXRoKSB7CisgICAgICAgIHRoaXMuY29tbWFuZExpbmVKYXZhLmNyZWF0ZVVwZ3JhZGVtb2R1bGVwYXRoKHVwZ3JhZGVNb2R1bGVQYXRoLmdldFByb2plY3QoKSkuYWRkKHVwZ3JhZGVNb2R1bGVQYXRoKTsKKyAgICB9CisKKyAgICBFbnZpcm9ubWVudCBnZXRFbnYoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVudjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYSBuZXcge0BsaW5rIENvbW1hbmRsaW5lSmF2YX0gY29uc3RydWN0ZWQgb3V0IG9mIHRoZSBjb25maWd1cmF0aW9ucyBzZXQgb24gdGhpcworICAgICAqIHtAbGluayBGb3JrRGVmaW5pdGlvbn0KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIFRoZSBqdW5pdGxhdW5jaGVydGFzayBmb3Igd2hpY2ggdGhpcyBpcyBhIGZvcmsgZGVmaW5pdGlvbgorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBDb21tYW5kbGluZUphdmEgZ2VuZXJhdGVDb21tYW5kTGluZShmaW5hbCBKVW5pdExhdW5jaGVyVGFzayB0YXNrKSB7CisgICAgICAgIGZpbmFsIENvbW1hbmRsaW5lSmF2YSBjbWRMaW5lOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY21kTGluZSA9IChDb21tYW5kbGluZUphdmEpIHRoaXMuY29tbWFuZExpbmVKYXZhLmNsb25lKCk7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgICAgICBjbWRMaW5lLnNldENsYXNzbmFtZShTVEFOREFMT05FX0xBVU5DSEVSX0NMQVNTX05BTUUpOworICAgICAgICAvLyBWTSBhcmd1bWVudHMKKyAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0ID0gdGFzay5nZXRQcm9qZWN0KCk7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIHRhc2tDbGFzc0xvYWRlciA9IHRhc2suZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAvLyBBbnQgcnVudGltZSBjbGFzc2VzCisgICAgICAgIGlmICh0aGlzLmluY2x1ZGVBbnRSdW50aW1lTGlicmFyaWVzKSB7CisgICAgICAgICAgICBmaW5hbCBQYXRoIGFudFJ1bnRpbWVSZXNvdXJjZXMgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgIEpVbml0TGF1bmNoZXJDbGFzc1BhdGhVdGlsLmFkZEFudFJ1bnRpbWVSZXNvdXJjZUxvY2F0aW9ucyhhbnRSdW50aW1lUmVzb3VyY2VzLCB0YXNrQ2xhc3NMb2FkZXIpOworICAgICAgICAgICAgZmluYWwgUGF0aCBjbGFzc1BhdGggPSBjbWRMaW5lLmNyZWF0ZUNsYXNzcGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgIGNsYXNzUGF0aC5jcmVhdGVQYXRoKCkuYXBwZW5kKGFudFJ1bnRpbWVSZXNvdXJjZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFzay5sb2coIkV4Y2x1ZGluZyBBbnQgcnVudGltZSBsaWJyYXJpZXMgZnJvbSBmb3JrZWQgSlZNIGNsYXNzcGF0aCIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgICAgICAvLyBKVW5pdCBwbGF0Zm9ybSBjbGFzc2VzCisgICAgICAgIGlmICh0aGlzLmluY2x1ZGVKVW5pdFBsYXRmb3JtTGlicmFyaWVzKSB7CisgICAgICAgICAgICBmaW5hbCBQYXRoIGp1bml0UGxhdGZvcm1SZXNvdXJjZXMgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgIEpVbml0TGF1bmNoZXJDbGFzc1BhdGhVdGlsLmFkZEpVbml0UGxhdGZvcm1SZXNvdXJjZUxvY2F0aW9ucyhqdW5pdFBsYXRmb3JtUmVzb3VyY2VzLCB0YXNrQ2xhc3NMb2FkZXIpOworICAgICAgICAgICAgZmluYWwgUGF0aCBjbGFzc1BhdGggPSBjbWRMaW5lLmNyZWF0ZUNsYXNzcGF0aChwcm9qZWN0KTsKKyAgICAgICAgICAgIGNsYXNzUGF0aC5jcmVhdGVQYXRoKCkuYXBwZW5kKGp1bml0UGxhdGZvcm1SZXNvdXJjZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFzay5sb2coIkV4Y2x1ZGluZyBKVW5pdCBwbGF0Zm9ybSBsaWJyYXJpZXMgZnJvbSBmb3JrZWQgSlZNIGNsYXNzcGF0aCIsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY21kTGluZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvSlVuaXRMYXVuY2hlckNsYXNzUGF0aFV0aWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvSlVuaXRMYXVuY2hlckNsYXNzUGF0aFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJhMGQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9KVW5pdExhdW5jaGVyQ2xhc3NQYXRoVXRpbC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkFudE1haW47CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxvYWRlclV0aWxzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCisvKioKKyAqCisgKi8KK2ZpbmFsIGNsYXNzIEpVbml0TGF1bmNoZXJDbGFzc1BhdGhVdGlsIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9JTl9QTEFURk9STV9FTkdJTkUgPSAib3JnL2p1bml0L3BsYXRmb3JtL2VuZ2luZS9UZXN0RW5naW5lLmNsYXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSU5fUExBVEZPUk1fTEFVTkNIRVIgPSAib3JnL2p1bml0L3BsYXRmb3JtL2xhdW5jaGVyL2NvcmUvTGF1bmNoZXJGYWN0b3J5LmNsYXNzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfSU5fUExBVEZPUk1fQ09NTU9OID0gIm9yZy9qdW5pdC9wbGF0Zm9ybS9jb21tb25zL2Fubm90YXRpb24vVGVzdGFibGUuY2xhc3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9OQU1FX0xBVU5DSEVSX1NVUFBPUlQgPSAib3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9MYXVuY2hlclN1cHBvcnQuY2xhc3MiOworCisKKyAgICBzdGF0aWMgdm9pZCBhZGRBbnRSdW50aW1lUmVzb3VyY2VMb2NhdGlvbnMoZmluYWwgUGF0aCBwYXRoLCBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICBhZGRSZXNvdXJjZUxvY2F0aW9uVG9QYXRoKHBhdGgsIGNsYXNzTG9hZGVyLCB0b1Jlc291cmNlTmFtZShBbnRNYWluLmNsYXNzKSk7CisgICAgICAgIGFkZFJlc291cmNlTG9jYXRpb25Ub1BhdGgocGF0aCwgY2xhc3NMb2FkZXIsIHRvUmVzb3VyY2VOYW1lKFRhc2suY2xhc3MpKTsKKyAgICAgICAgYWRkUmVzb3VyY2VMb2NhdGlvblRvUGF0aChwYXRoLCBjbGFzc0xvYWRlciwgUkVTT1VSQ0VfTkFNRV9MQVVOQ0hFUl9TVVBQT1JUKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRMYXVuY2hlclN1cHBvcnRSZXNvdXJjZUxvY2F0aW9uKGZpbmFsIFBhdGggcGF0aCwgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgYWRkUmVzb3VyY2VMb2NhdGlvblRvUGF0aChwYXRoLCBjbGFzc0xvYWRlciwgUkVTT1VSQ0VfTkFNRV9MQVVOQ0hFUl9TVVBQT1JUKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRKVW5pdFBsYXRmb3JtUmVzb3VyY2VMb2NhdGlvbnMoZmluYWwgUGF0aCBwYXRoLCBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICAvLyBwbGF0Zm9ybS1lbmdpbmUKKyAgICAgICAgYWRkUmVzb3VyY2VMb2NhdGlvblRvUGF0aChwYXRoLCBjbGFzc0xvYWRlciwgUkVTT1VSQ0VfSU5fUExBVEZPUk1fRU5HSU5FKTsKKyAgICAgICAgLy8gcGxhdGZvcm0tbGF1bmNoZXIKKyAgICAgICAgYWRkUmVzb3VyY2VMb2NhdGlvblRvUGF0aChwYXRoLCBjbGFzc0xvYWRlciwgUkVTT1VSQ0VfSU5fUExBVEZPUk1fTEFVTkNIRVIpOworICAgICAgICAvLyBwbGF0Zm9ybS1jb21tb25zCisgICAgICAgIGFkZFJlc291cmNlTG9jYXRpb25Ub1BhdGgocGF0aCwgY2xhc3NMb2FkZXIsIFJFU09VUkNFX0lOX1BMQVRGT1JNX0NPTU1PTik7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gYWRkUmVzb3VyY2VMb2NhdGlvblRvUGF0aChmaW5hbCBQYXRoIHBhdGgsIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBmaW5hbCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgZmluYWwgRmlsZSBmID0gTG9hZGVyVXRpbHMuZ2V0UmVzb3VyY2VTb3VyY2UoY2xhc3NMb2FkZXIsIHJlc291cmNlKTsKKyAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBhdGguY3JlYXRlUGF0aCgpLnNldExvY2F0aW9uKGYpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBoYXNKVW5pdFBsYXRmb3JtUmVzb3VyY2VzKGZpbmFsIENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgIGZpbmFsIEZpbGUgZiA9IExvYWRlclV0aWxzLmdldFJlc291cmNlU291cmNlKGNsLCBSRVNPVVJDRV9JTl9QTEFURk9STV9FTkdJTkUpOworICAgICAgICByZXR1cm4gZiAhPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1Jlc291cmNlTmFtZShmaW5hbCBDbGFzcyBrbGFzcykgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGtsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZUFsbCgiXFwuIiwgIi8iKSArICIuY2xhc3MiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvSlVuaXRMYXVuY2hlclRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvSlVuaXRMYXVuY2hlclRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE2ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9KVW5pdExhdW5jaGVyVGFzay5qYXZhCkBAIC0wLDAgKzEsNDg5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkV4ZWN1dGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVdhdGNoZG9nOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QdW1wU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZUphdmE7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0VYQ0xVREVfVEFHUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9JTkNMVURFX1RBR1M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX1BSSU5UX1NVTU1BUlk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9FTE1fTEFVTkNIX0RFRjsKKworCisvKioKKyAqIEFuIEFudCB7QGxpbmsgVGFza30gcmVzcG9uc2libGUgZm9yIGxhdW5jaGluZyB0aGUgSlVuaXQgcGxhdGZvcm0gZm9yIHJ1bm5pbmcgdGVzdHMuCisgKiBUaGlzIHJlcXVpcmVzIGEgbWluaW11bSBvZiBKVW5pdCA1LCBzaW5jZSB0aGF0J3MgdGhlIHZlcnNpb24gaW4gd2hpY2ggdGhlIEpVbml0IHBsYXRmb3JtIGxhdW5jaGVyCisgKiBBUElzIHdlcmUgaW50cm9kdWNlZC4KKyAqIDxwPgorICogVGhpcyB0YXNrIGluIGl0c2VsZiBkb2Vzbid0IHJ1biB0aGUgSlVuaXQgdGVzdHMsIGluc3RlYWQgdGhlIHNvbGUgcmVzcG9uc2liaWxpdHkgb2YKKyAqIHRoaXMgdGFzayBpcyB0byBzZXR1cCB0aGUgSlVuaXQgcGxhdGZvcm0gbGF1bmNoZXIsIGJ1aWxkIHJlcXVlc3RzLCBsYXVuY2ggdGhvc2UgcmVxdWVzdHMgYW5kIHRoZW4gcGFyc2UgdGhlCisgKiByZXN1bHQgb2YgdGhlIGV4ZWN1dGlvbiB0byBwcmVzZW50IGluIGEgd2F5IHRoYXQncyBiZWVuIGNvbmZpZ3VyZWQgb24gdGhpcyBBbnQgdGFzay4KKyAqIDwvcD4KKyAqIDxwPgorICogRnVydGhlcm1vcmUsIHRoaXMgdGFzayBhbGxvd3MgdXNlcnMgY29udHJvbCBvdmVyIHdoaWNoIGNsYXNzZXMgdG8gc2VsZWN0IGZvciBwYXNzaW5nIG9uIHRvIHRoZSBKVW5pdCA1CisgKiBwbGF0Zm9ybSBmb3IgdGVzdCBleGVjdXRpb24uIEl0IGhvd2V2ZXIsIGlzIHNvbGVseSB0aGUgSlVuaXQgNSBwbGF0Zm9ybSwgYmFja2VkIGJ5IHRlc3QgZW5naW5lcyB0aGF0CisgKiBkZWNpZGUgYW5kIGV4ZWN1dGUgdGhlIHRlc3RzLgorICoKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9qdW5pdC5vcmcvanVuaXQ1LyI+SlVuaXQgNSBkb2N1bWVudGF0aW9uPC9hPgorICovCitwdWJsaWMgY2xhc3MgSlVuaXRMYXVuY2hlclRhc2sgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUl9TVVBQT1JUX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5MYXVuY2hlclN1cHBvcnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTl9WTV9URVNUX0VYRUNVVElPTl9DT05URVhUX0NMQVNTX05BTUUgPSAib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5JblZNRXhlY3V0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWEVDVVRJT05fQ09OVEVYVF9DTEFTU19OQU1FID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuVGVzdEV4ZWN1dGlvbkNvbnRleHQiOworCisgICAgcHJpdmF0ZSBQYXRoIGNsYXNzUGF0aDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFsdE9uRmFpbHVyZTsKKyAgICBwcml2YXRlIFN0cmluZyBmYWlsdXJlUHJvcGVydHk7CisgICAgcHJpdmF0ZSBib29sZWFuIHByaW50U3VtbWFyeTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGVzdERlZmluaXRpb24+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PExpc3RlbmVyRGVmaW5pdGlvbj4gbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gaW5jbHVkZVRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBleGNsdWRlVGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIEpVbml0TGF1bmNoZXJUYXNrKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBpZiAodGhpcy50ZXN0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7CisgICAgICAgIGZvciAoZmluYWwgVGVzdERlZmluaXRpb24gdGVzdCA6IHRoaXMudGVzdHMpIHsKKyAgICAgICAgICAgIGlmICghdGVzdC5zaG91bGRSdW4ocHJvamVjdCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIkV4Y2x1ZGluZyB0ZXN0ICIgKyB0ZXN0ICsgIiBzaW5jZSBpdCdzIGNvbnNpZGVyZWQgbm90IHRvIHJ1biAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiBjb250ZXh0IG9mIHByb2plY3QgIiArIHByb2plY3QsIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZXN0LmdldEZvcmtEZWZpbml0aW9uKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvcmtUZXN0KHRlc3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXVuY2hWaWFSZWZsZWN0aW9uKG5ldyBJblZNTGF1bmNoKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGVzdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIHtAbGluayBQYXRofSB0byB0aGUgY2xhc3NwYXRoIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgZXhlY3V0aW9uIG9mIHRoZSB0ZXN0cworICAgICAqCisgICAgICogQHBhcmFtIHBhdGggVGhlIGNsYXNzcGF0aAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRDbGFzc1BhdGgoZmluYWwgUGF0aCBwYXRoKSB7CisgICAgICAgIGlmICh0aGlzLmNsYXNzUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSAid3JhcHBlciIgcGF0aCB3aGljaCBjYW4gaG9sZCBvbiB0byBtdWx0aXBsZQorICAgICAgICAgICAgLy8gcGF0aHMgdGhhdCBnZXQgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIChpZiBhdCBhbGwgdGhlIHRhc2sgaW4gdGhlIGJ1aWxkIGlzCisgICAgICAgICAgICAvLyBjb25maWd1cmVkIHdpdGggbXVsdGlwbGUgY2xhc3NwYWh0IGVsZW1lbnRzKQorICAgICAgICAgICAgdGhpcy5jbGFzc1BhdGggPSBuZXcgUGF0aChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2xhc3NQYXRoLmFkZChwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEge0BsaW5rIFNpbmdsZVRlc3RDbGFzc30gdGhhdCB3aWxsIGJlIHBhc3NlZCBvbiB0byB0aGUgdW5kZXJseWluZyBKVW5pdCBwbGF0Zm9ybQorICAgICAqIGZvciBwb3NzaWJsZSBleGVjdXRpb24gb2YgdGhlIHRlc3QKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0IFRoZSB0ZXN0CisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFRlc3QoZmluYWwgU2luZ2xlVGVzdENsYXNzIHRlc3QpIHsKKyAgICAgICAgdGhpcy5wcmVDb25maWd1cmUodGVzdCk7CisgICAgICAgIHRoaXMudGVzdHMuYWRkKHRlc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMge0BsaW5rIFRlc3RDbGFzc2VzfSB0aGF0IHdpbGwgYmUgcGFzc2VkIG9uIHRvIHRoZSB1bmRlcmx5aW5nIEpVbml0IHBsYXRmb3JtIGZvcgorICAgICAqIHBvc3NpYmxlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdHMKKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXN0Q2xhc3NlcyBUaGUgdGVzdCBjbGFzc2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFRlc3RDbGFzc2VzKGZpbmFsIFRlc3RDbGFzc2VzIHRlc3RDbGFzc2VzKSB7CisgICAgICAgIHRoaXMucHJlQ29uZmlndXJlKHRlc3RDbGFzc2VzKTsKKyAgICAgICAgdGhpcy50ZXN0cy5hZGQodGVzdENsYXNzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSB7QGxpbmsgTGlzdGVuZXJEZWZpbml0aW9uIGxpc3RlbmVyfSB3aGljaCB3aWxsIGJlIGVucm9sbGVkIGZvciBsaXN0ZW5pbmcgdG8gdGVzdAorICAgICAqIGV4ZWN1dGlvbiBldmVudHMKKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgbGlzdGVuZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkTGlzdGVuZXIoZmluYWwgTGlzdGVuZXJEZWZpbml0aW9uIGxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SGFsdG9uZmFpbHVyZShmaW5hbCBib29sZWFuIGhhbHRvbmZhaWx1cmUpIHsKKyAgICAgICAgdGhpcy5oYWx0T25GYWlsdXJlID0gaGFsdG9uZmFpbHVyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWlsdXJlUHJvcGVydHkoZmluYWwgU3RyaW5nIGZhaWx1cmVQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLmZhaWx1cmVQcm9wZXJ0eSA9IGZhaWx1cmVQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmludFN1bW1hcnkoZmluYWwgYm9vbGVhbiBwcmludFN1bW1hcnkpIHsKKyAgICAgICAgdGhpcy5wcmludFN1bW1hcnkgPSBwcmludFN1bW1hcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFncyB0byBpbmNsdWRlLiBXaWxsIHRyaW0gZWFjaCB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZXMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyB0byBpbmNsdWRlIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3RzLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVRhZ3MoZmluYWwgU3RyaW5nIGluY2x1ZGVzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluY2x1ZGVzLCAiLCIpOworICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgaW5jbHVkZVRhZ3MuYWRkKHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFncyB0byBleGNsdWRlLiBXaWxsIHRyaW0gZWFjaCB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjbHVkZXMgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyB0byBleGNsdWRlIHdoaWxlIHJ1bm5pbmcgdGhlIHRlc3RzLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZVRhZ3MoZmluYWwgU3RyaW5nIGV4Y2x1ZGVzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tlbnMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGV4Y2x1ZGVzLCAiLCIpOworICAgICAgICB3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgZXhjbHVkZVRhZ3MuYWRkKHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZUNvbmZpZ3VyZShmaW5hbCBUZXN0RGVmaW5pdGlvbiB0ZXN0KSB7CisgICAgICAgIGlmICh0ZXN0LmdldEhhbHRPbkZhaWx1cmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0LnNldEhhbHRPbkZhaWx1cmUodGhpcy5oYWx0T25GYWlsdXJlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVzdC5nZXRGYWlsdXJlUHJvcGVydHkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0LnNldEZhaWx1cmVQcm9wZXJ0eSh0aGlzLmZhaWx1cmVQcm9wZXJ0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF1bmNoVmlhUmVmbGVjdGlvbihmaW5hbCBJblZNTGF1bmNoIGxhdW5jaERlZmluaXRpb24pIHsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2wgPSBsYXVuY2hEZWZpbml0aW9uLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIC8vIGluc3RhbnRpYXRlIGEgbmV3IFRlc3RFeGVjdXRpb25Db250ZXh0IGluc3RhbmNlIHVzaW5nIHRoZSBsYXVuY2ggZGVmaW5pdGlvbidzIGNsYXNzbG9hZGVyCisgICAgICAgIGZpbmFsIENsYXNzPD8+IHRlc3RFeGVjdXRpb25DdHhDbGFzczsKKyAgICAgICAgZmluYWwgT2JqZWN0IHRlc3RFeGVjdXRpb25DdHg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0RXhlY3V0aW9uQ3R4Q2xhc3MgPSBDbGFzcy5mb3JOYW1lKFRFU1RfRVhFQ1VUSU9OX0NPTlRFWFRfQ0xBU1NfTkFNRSwgZmFsc2UsIGNsKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZShJTl9WTV9URVNUX0VYRUNVVElPTl9DT05URVhUX0NMQVNTX05BTUUsIGZhbHNlLCBjbCk7CisgICAgICAgICAgICB0ZXN0RXhlY3V0aW9uQ3R4ID0ga2xhc3MuZ2V0Q29uc3RydWN0b3IoSlVuaXRMYXVuY2hlclRhc2suY2xhc3MpLm5ld0luc3RhbmNlKHRoaXMpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGEgdGVzdCBleGVjdXRpb24gY29udGV4dCBmb3IgaW4tdm0gdGVzdHMiLCBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBpbnN0YW50aWF0ZSBhIG5ldyBMYXVuY2hlclN1cHBvcnQgaW5zdGFuY2UgdXNpbmcgdGhlIGxhdW5jaCBkZWZpbml0aW9uJ3MgQ2xhc3NMb2FkZXIKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGtsYXNzID0gQ2xhc3MuZm9yTmFtZShMQVVOQ0hFUl9TVVBQT1JUX0NMQVNTX05BTUUsIGZhbHNlLCBjbCk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgbGF1bmNoZXJTdXBwb3J0ID0ga2xhc3MuZ2V0Q29uc3RydWN0b3IoTGF1bmNoRGVmaW5pdGlvbi5jbGFzcywgdGVzdEV4ZWN1dGlvbkN0eENsYXNzKQorICAgICAgICAgICAgICAgICAgICAubmV3SW5zdGFuY2UobGF1bmNoRGVmaW5pdGlvbiwgdGVzdEV4ZWN1dGlvbkN0eCk7CisgICAgICAgICAgICBrbGFzcy5nZXRNZXRob2QoImxhdW5jaCIpLmludm9rZShsYXVuY2hlclN1cHBvcnQpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gbGF1bmNoIGluLXZtIHRlc3RzIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGphdmEubmlvLmZpbGUuUGF0aCBkdW1wUHJvamVjdFByb3BlcnRpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZhLm5pby5maWxlLlBhdGggcHJvcHNQYXRoID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpCisgICAgICAgICAgICAuY3JlYXRlVGVtcEZpbGUobnVsbCwgInByb3BlcnRpZXMiLCBudWxsLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgLnRvUGF0aCgpOworICAgICAgICBmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gdGhpcy5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpOworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb2pQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvalByb3BlcnRpZXMucHV0QWxsKHByb3BzKTsKKyAgICAgICAgdHJ5IChmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ocHJvcHNQYXRoKSkgeworICAgICAgICAgICAgLy8gVE9ETzogSXMgaXQgYWx3YXlzIFVURi04PworICAgICAgICAgICAgcHJvalByb3BlcnRpZXMuc3RvcmUob3MsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgubmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcHNQYXRoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JrVGVzdChmaW5hbCBUZXN0RGVmaW5pdGlvbiB0ZXN0KSB7CisgICAgICAgIC8vIGNyZWF0ZSBsYXVuY2ggY29tbWFuZAorICAgICAgICBmaW5hbCBGb3JrRGVmaW5pdGlvbiBmb3JrRGVmaW5pdGlvbiA9IHRlc3QuZ2V0Rm9ya0RlZmluaXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29tbWFuZGxpbmVKYXZhIGNvbW1hbmRsaW5lSmF2YSA9IGZvcmtEZWZpbml0aW9uLmdlbmVyYXRlQ29tbWFuZExpbmUodGhpcyk7CisgICAgICAgIGlmICh0aGlzLmNsYXNzUGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21tYW5kbGluZUphdmEuY3JlYXRlQ2xhc3NwYXRoKGdldFByb2plY3QoKSkuY3JlYXRlUGF0aCgpLmFwcGVuZCh0aGlzLmNsYXNzUGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgamF2YS5uaW8uZmlsZS5QYXRoIHByb2plY3RQcm9wc1BhdGg7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwcm9qZWN0UHJvcHNQYXRoID0gZHVtcFByb2plY3RQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHByb3BlcnRpZXMgZmlsZSB3aGlsZSBmb3JraW5nIGEgcHJvY2VzcyIgKworICAgICAgICAgICAgICAgICAgICAiIGZvciBhIHRlc3QiLCBlKTsKKyAgICAgICAgfQorICAgICAgICAvLyAtLXByb3BlcnRpZXMgPHBhdGgtdG8tcHJvcGVydGllcy1maWxlPgorICAgICAgICBjb21tYW5kbGluZUphdmEuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShDb25zdGFudHMuQVJHX1BST1BFUlRJRVMpOworICAgICAgICBjb21tYW5kbGluZUphdmEuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwcm9qZWN0UHJvcHNQYXRoLnRvQWJzb2x1dGVQYXRoKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgZmluYWwgamF2YS5uaW8uZmlsZS5QYXRoIGxhdW5jaERlZlhtbFBhdGggPSBuZXdMYXVuY2hEZWZpbml0aW9uWG1sKCk7CisgICAgICAgIHRyeSAoZmluYWwgT3V0cHV0U3RyZWFtIG9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGxhdW5jaERlZlhtbFBhdGgpKSB7CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdGYWN0b3J5KCkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG9zLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnREb2N1bWVudCgpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChMRF9YTUxfRUxNX0xBVU5DSF9ERUYpOworICAgICAgICAgICAgICAgIGlmICh0aGlzLnByaW50U3VtbWFyeSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfUFJJTlRfU1VNTUFSWSwgInRydWUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFsdE9uRmFpbHVyZSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmNsdWRlVGFncy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShMRF9YTUxfQVRUUl9JTkNMVURFX1RBR1MsIGNvbW1hU2VwYXJhdGVkTGlzdEVsZW1lbnRzKGluY2x1ZGVUYWdzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLmV4Y2x1ZGVUYWdzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX0VYQ0xVREVfVEFHUywgY29tbWFTZXBhcmF0ZWRMaXN0RWxlbWVudHMoZXhjbHVkZVRhZ3MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gdGFzayBsZXZlbCBsaXN0ZW5lcnMKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIExpc3RlbmVyRGVmaW5pdGlvbiBsaXN0ZW5lckRlZiA6IHRoaXMubGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJEZWYuc2hvdWxkVXNlKGdldFByb2plY3QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB0aGUgbGlzdGVuZXIgZGVmaW5pdGlvbiBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lckRlZi50b0ZvcmtlZFJlcHJlc2VudGF0aW9uKHdyaXRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHRlc3QgZGVmaW5pdGlvbiBhcyBYTUwKKyAgICAgICAgICAgICAgICB0ZXN0LnRvRm9ya2VkUmVwcmVzZW50YXRpb24odGhpcywgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlRW5kRG9jdW1lbnQoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjb25zdHJ1Y3QgY29tbWFuZCBsaW5lIGZvciB0ZXN0IiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gLS1sYXVuY2gtZGVmaW5pdGlvbiA8eG1sLWZpbGUtcGF0aD4KKyAgICAgICAgY29tbWFuZGxpbmVKYXZhLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoQ29uc3RhbnRzLkFSR19MQVVOQ0hfREVGSU5JVElPTik7CisgICAgICAgIGNvbW1hbmRsaW5lSmF2YS5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGxhdW5jaERlZlhtbFBhdGgudG9BYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpKTsKKworICAgICAgICAvLyBsYXVuY2ggdGhlIHByb2Nlc3MgYW5kIHdhaXQgZm9yIHByb2Nlc3MgdG8gY29tcGxldGUKKyAgICAgICAgZmluYWwgaW50IGV4aXRDb2RlID0gZXhlY3V0ZUZvcmtlZFRlc3QoZm9ya0RlZmluaXRpb24sIGNvbW1hbmRsaW5lSmF2YSk7CisgICAgICAgIHN3aXRjaCAoZXhpdENvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkZPUktfRVhJVF9DT0RFX1NVQ0NFU1M6IHsKKyAgICAgICAgICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5GT1JLX0VYSVRfQ09ERV9FWENFUFRJT046IHsKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZhaWxlZCB3aXRoIHNvbWUgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGb3JrZWQgdGVzdChzKSBmYWlsZWQgd2l0aCBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29uc3RhbnRzLkZPUktfRVhJVF9DT0RFX1RFU1RTX0ZBSUxFRDogeworICAgICAgICAgICAgICAgIC8vIHRlc3QgaGFzIGZhaWx1cmUocykKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGVzdC5nZXRGYWlsdXJlUHJvcGVydHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBhcmUgdGVzdCBmYWlsdXJlcyBhbmQgdGhlIHRlc3QgaXMgY29uZmlndXJlZCB0byBzZXQgYSBwcm9wZXJ0eSBpbiBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBmYWlsdXJlLCB0aGVuIHNldCB0aGUgcHJvcGVydHkgdG8gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkodGVzdC5nZXRGYWlsdXJlUHJvcGVydHkoKSwgInRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0LmlzSGFsdE9uRmFpbHVyZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGVzdCBpcyBjb25maWd1cmVkIHRvIGhhbHQgb24gdGVzdCBmYWlsdXJlcywgdGhyb3cgYSBidWlsZCBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0IGluc3RhbmNlb2YgTmFtZWRUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIlRlc3QgIiArICgoTmFtZWRUZXN0KSB0ZXN0KS5nZXROYW1lKCkgKyAiIGhhcyBmYWlsdXJlKHMpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gIlNvbWUgdGVzdChzKSBoYXZlIGZhaWx1cmUocykiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvbnN0YW50cy5GT1JLX0VYSVRfQ09ERV9USU1FRF9PVVQ6IHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obmV3IFRpbWVvdXRFeGNlcHRpb24oIkZvcmtlZCB0ZXN0KHMpIHRpbWVkIG91dCIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb21tYVNlcGFyYXRlZExpc3RFbGVtZW50cyhmaW5hbCBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdCkgeworICAgICAgICByZXR1cm4gc3RyaW5nTGlzdC5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXAoT2JqZWN0Ojp0b1N0cmluZykKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGV4ZWN1dGVGb3JrZWRUZXN0KGZpbmFsIEZvcmtEZWZpbml0aW9uIGZvcmtEZWZpbml0aW9uLCBmaW5hbCBDb21tYW5kbGluZUphdmEgY29tbWFuZGxpbmVKYXZhKSB7CisgICAgICAgIGZpbmFsIExvZ091dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICBmaW5hbCBMb2dPdXRwdXRTdHJlYW0gZXJyU3RyZWFtID0gbmV3IExvZ091dHB1dFN0cmVhbSh0aGlzLCBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgZmluYWwgRXhlY3V0ZVdhdGNoZG9nIHdhdGNoZG9nID0gZm9ya0RlZmluaXRpb24uZ2V0VGltZW91dCgpID4gMCA/IG5ldyBFeGVjdXRlV2F0Y2hkb2coZm9ya0RlZmluaXRpb24uZ2V0VGltZW91dCgpKSA6IG51bGw7CisgICAgICAgIGZpbmFsIEV4ZWN1dGUgZXhlY3V0ZSA9IG5ldyBFeGVjdXRlKG5ldyBQdW1wU3RyZWFtSGFuZGxlcihvdXRTdHJlYW0sIGVyclN0cmVhbSksIHdhdGNoZG9nKTsKKyAgICAgICAgZXhlY3V0ZS5zZXRDb21tYW5kbGluZShjb21tYW5kbGluZUphdmEuZ2V0Q29tbWFuZGxpbmUoKSk7CisgICAgICAgIGV4ZWN1dGUuc2V0QW50UnVuKGdldFByb2plY3QoKSk7CisgICAgICAgIGlmIChmb3JrRGVmaW5pdGlvbi5nZXREaXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBleGVjdXRlLnNldFdvcmtpbmdEaXJlY3RvcnkoUGF0aHMuZ2V0KGZvcmtEZWZpbml0aW9uLmdldERpcigpKS50b0ZpbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRW52aXJvbm1lbnQgZW52ID0gZm9ya0RlZmluaXRpb24uZ2V0RW52KCk7CisgICAgICAgIGlmIChlbnYgIT0gbnVsbCAmJiBlbnYuZ2V0VmFyaWFibGVzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZXhlY3V0ZS5zZXRFbnZpcm9ubWVudChlbnYuZ2V0VmFyaWFibGVzKCkpOworICAgICAgICB9CisgICAgICAgIGxvZyhjb21tYW5kbGluZUphdmEuZGVzY3JpYmVDb21tYW5kKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICBpbnQgZXhpdENvZGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGl0Q29kZSA9IGV4ZWN1dGUuZXhlY3V0ZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlByb2Nlc3MgZm9yayBmYWlsZWQiLCBlLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHdhdGNoZG9nICE9IG51bGwgJiYgd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKSA/IENvbnN0YW50cy5GT1JLX0VYSVRfQ09ERV9USU1FRF9PVVQgOiBleGl0Q29kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGphdmEubmlvLmZpbGUuUGF0aCBuZXdMYXVuY2hEZWZpbml0aW9uWG1sKCkgeworICAgICAgICByZXR1cm4gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpCisgICAgICAgICAgICAuY3JlYXRlVGVtcEZpbGUobnVsbCwgIi54bWwiLCBudWxsLCB0cnVlLCB0cnVlKQorICAgICAgICAgICAgLnRvUGF0aCgpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgSW5WTUxhdW5jaCBpbXBsZW1lbnRzIExhdW5jaERlZmluaXRpb24geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXN0RGVmaW5pdGlvbj4gaW5WTVRlc3RzOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGV4ZWN1dGlvbkNMOworCisgICAgICAgIHByaXZhdGUgSW5WTUxhdW5jaChmaW5hbCBMaXN0PFRlc3REZWZpbml0aW9uPiBpblZNVGVzdHMpIHsKKyAgICAgICAgICAgIHRoaXMuaW5WTVRlc3RzID0gaW5WTVRlc3RzOworICAgICAgICAgICAgdGhpcy5leGVjdXRpb25DTCA9IGNyZWF0ZUluVk1FeGVjdXRpb25DbGFzc0xvYWRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFRlc3REZWZpbml0aW9uPiBnZXRUZXN0cygpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLmluVk1UZXN0czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxMaXN0ZW5lckRlZmluaXRpb24+IGdldExpc3RlbmVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcmludFN1bW1hcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbnRTdW1tYXJ5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSGFsdE9uRmFpbHVyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYWx0T25GYWlsdXJlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SW5jbHVkZVRhZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5jbHVkZVRhZ3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlVGFncygpIHsKKyAgICAgICAgICAgIHJldHVybiBleGNsdWRlVGFnczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRpb25DTDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3JlYXRlSW5WTUV4ZWN1dGlvbkNsYXNzTG9hZGVyKCkgeworICAgICAgICAgICAgZmluYWwgUGF0aCB0YXNrQ29uZmlndXJlZENsYXNzUGF0aCA9IEpVbml0TGF1bmNoZXJUYXNrLnRoaXMuY2xhc3NQYXRoOworICAgICAgICAgICAgaWYgKHRhc2tDb25maWd1cmVkQ2xhc3NQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBzcGVjaWZpYyBjbGFzc3BhdGggY29uZmlndXJlZCBmb3IgdGhlIHRhc2ssIHNvIHVzZSB0aGUgY2xhc3Nsb2FkZXIKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGlzIHRhc2sKKyAgICAgICAgICAgICAgICByZXR1cm4gSlVuaXRMYXVuY2hlclRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRoZXJlJ3MgYSBjbGFzc3BhdGggY29uZmlndXJlZCBmb3IgdGhlIHRhc2suCisgICAgICAgICAgICAvLyB3ZSBmaXJzdCBjaGVjayBpZiB0aGUgQW50IHJ1bnRpbWUgY2xhc3NwYXRoIGhhcyBKVW5pdCBwbGF0Zm9ybSBjbGFzc2VzLgorICAgICAgICAgICAgLy8gLSBpZiBpdCBkb2VzLCB0aGVuIHdlIHVzZSB0aGUgQW50IHJ1bnRpbWUgY2xhc3NwYXRoIHBsdXMgdGhlIHRhc2sncyBjb25maWd1cmVkIGNsYXNzcGF0aAorICAgICAgICAgICAgLy8gd2l0aCB0aGUgdHJhZGl0aW9uYWwgcGFyZW50IGZpcnN0IGxvYWRpbmcuCisgICAgICAgICAgICAvLyAtIGVsc2UgKGkuZS4gQW50IHJ1bnRpbWUgY2xhc3NwYXRoIGRvZXNuJ3QgaGF2ZSBKVW5pdCBwbGF0Zm9ybSBjbGFzc2VzKSwgdGhlbiB3ZQorICAgICAgICAgICAgLy8gZXhwZWN0L2Fzc3VtZSB0aGUgdGFzaydzIGNvbmZpZ3VyZWQgY2xhc3NwYXRoIHRvIGhhdmUgdGhlIEpVbml0IHBsYXRmb3JtIGNsYXNzZXMgYW5kIHdlCisgICAgICAgICAgICAvLyB0aGVuIGNyZWF0ZSBhICJvdmVycmlkaW5nIiBjbGFzc2xvYWRlciB3aGljaCBwcmVmZXJzIGNlcnRhaW4gcmVzb3VyY2VzIChzcGVjaWZpY2FsbHkgdGhlIGNsYXNzZXMKKyAgICAgICAgICAgIC8vIGZyb20gb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlciBwYWNrYWdlKSwgZnJvbSB0aGUgdGFzaydzCisgICAgICAgICAgICAvLyBjbGFzc3BhdGgsIGV2ZW4gaWYgdGhlIEFudCdzIHJ1bnRpbWUgY2xhc3NwYXRoIGhhcyB0aG9zZSByZXNvdXJjZXMuCisgICAgICAgICAgICBpZiAoSlVuaXRMYXVuY2hlckNsYXNzUGF0aFV0aWwuaGFzSlVuaXRQbGF0Zm9ybVJlc291cmNlcyhKVW5pdExhdW5jaGVyVGFzay5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW50Q2xhc3NMb2FkZXIoSlVuaXRMYXVuY2hlclRhc2suY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgZ2V0UHJvamVjdCgpLCB0YXNrQ29uZmlndXJlZENsYXNzUGF0aCwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBQYXRoIGNwID0gbmV3IFBhdGgoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGNwLmFkZCh0YXNrQ29uZmlndXJlZENsYXNzUGF0aCk7CisgICAgICAgICAgICAvLyBhZGQgdGhlIEFudCBydW50aW1lIHJlc291cmNlcyB0byB0aGlzIHBhdGgKKyAgICAgICAgICAgIEpVbml0TGF1bmNoZXJDbGFzc1BhdGhVdGlsLmFkZExhdW5jaGVyU3VwcG9ydFJlc291cmNlTG9jYXRpb24oY3AsIEpVbml0TGF1bmNoZXJUYXNrLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXNrQ29uZmlndXJlZFBhdGhDbGFzc0xvYWRlcihKVW5pdExhdW5jaGVyVGFzay5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLCBjcCwgZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIENsYXNzTG9hZGVyfSwgdmVyeSBzaW1pbGFyIHRvIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TcGxpdENsYXNzTG9hZGVyfSwKKyAgICAgKiB3aGljaCB1c2VzIHRoZSB7QGxpbmsgI1Rhc2tDb25maWd1cmVkUGF0aENsYXNzTG9hZGVyKENsYXNzTG9hZGVyLCBQYXRoLCBQcm9qZWN0KSBjb25maWd1cmVkIFBhdGh9CisgICAgICogdG8gbG9hZCBhIGNsYXNzLCBpZiB0aGUgY2xhc3MgYmVsb25ncyB0byB0aGUge0Bjb2RlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXJ9CisgICAgICogcGFja2FnZS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGlsZSBsb29raW5nIGZvciBjbGFzc2VzIGJlbG9uZ2luZyB0byB0aGUge0Bjb2RlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXJ9CisgICAgICogcGFja2FnZSwgdGhpcyBjbGFzc2xvYWRlciBjb21wbGV0ZWx5IGlnbm9yZXMgQW50IHJ1bnRpbWUgY2xhc3NwYXRoLCBldmVuIGlmIHRoYXQgY2xhc3NwYXRoIGhhcworICAgICAqIHRob3NlIGNsYXNzZXMuIFRoaXMgYWxsb3dzIHRoZSB1c2VycyBvZiB0aGlzIGNsYXNzbG9hZGVyIHRvIHVzZSBhIGN1c3RvbSBsb2NhdGlvbiBhbmQgdGh1cyBtb3JlIGNvbnRyb2wgb3ZlcgorICAgICAqIHdoZXJlIHRoZXNlIGNsYXNzZXMgcmVzaWRlLCB3aGVuIHJ1bm5pbmcgdGhlIHtAY29kZSBqdW5pdGxhdW5jaGVyfSB0YXNrCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBUYXNrQ29uZmlndXJlZFBhdGhDbGFzc0xvYWRlciBleHRlbmRzIEFudENsYXNzTG9hZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIHBhcmVudCAgQ2xhc3NMb2FkZXIKKyAgICAgICAgICogQHBhcmFtIHBhdGggICAgUGF0aAorICAgICAgICAgKiBAcGFyYW0gcHJvamVjdCBQcm9qZWN0CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFRhc2tDb25maWd1cmVkUGF0aENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCwgUGF0aCBwYXRoLCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmVudCwgcHJvamVjdCwgcGF0aCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JjZUxvYWRDbGFzcyBpcyBub3QgY29udmVuaWVudCBoZXJlIHNpbmNlIGl0IHdvdWxkIG5vdAorICAgICAgICAvLyBwcm9wZXJseSBkZWFsIHdpdGggaW5uZXIgY2xhc3NlcyBvZiB0aGVzZSBjbGFzc2VzLgorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSwgYm9vbGVhbiByZXNvbHZlKQorICAgICAgICAgICAgICAgIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICBpZiAodGhlQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGVDbGFzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGNsYXNzbmFtZS5jb250YWlucygiLiIpID8gY2xhc3NuYW1lLnN1YnN0cmluZygwLCBjbGFzc25hbWUubGFzdEluZGV4T2YoJy4nKSkKKyAgICAgICAgICAgICAgICAgICAgOiAiIjsKKyAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIiKSkgeworICAgICAgICAgICAgICAgIHRoZUNsYXNzID0gZmluZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZUNsYXNzKHRoZUNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoZUNsYXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhjbGFzc25hbWUsIHJlc29sdmUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9MYXVuY2hEZWZpbml0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL0xhdW5jaERlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTZlMDdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9MYXVuY2hEZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRGVmaW5lcyB0aGUgbmVjZXNzYXJ5IGNvbnRleHQgZm9yIGxhdW5jaGluZyB0aGUgSlVuaXQgcGxhdGZvcm0gZm9yIHJ1bm5pbmcKKyAqIHRlc3RzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIExhdW5jaERlZmluaXRpb24geworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVzdERlZmluaXRpb24gdGVzdHN9IHRoYXQgaGF2ZSB0byBiZSBsYXVuY2hlZAorICAgICAqLworICAgIExpc3Q8VGVzdERlZmluaXRpb24+IGdldFRlc3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHQge0BsaW5rIExpc3RlbmVyRGVmaW5pdGlvbiBsaXN0ZW5lcnN9IHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICogZm9yIHRoZSB0ZXN0cywgaWYgdGhlIHtAbGluayAjZ2V0VGVzdHMoKSB0ZXN0c30gdGhlbXNlbHZlcyBkb24ndCBzcGVjaWZ5IGFueQorICAgICAqLworICAgIExpc3Q8TGlzdGVuZXJEZWZpbml0aW9uPiBnZXRMaXN0ZW5lcnMoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGEgc3VtbWFyeSBuZWVkcyB0byBiZSBwcmludGVkIG91dCBhZnRlciB0aGUgZXhlY3V0aW9uIG9mIHRoZQorICAgICAqIHRlc3RzLiBGYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc1ByaW50U3VtbWFyeSgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgYW55IHJlbWFpbmluZyB0ZXN0cyBsYXVuY2ggbmVlZCB0byBiZSBzdG9wcGVkIGlmIGFueSB0ZXN0IGV4ZWN1dGlvbgorICAgICAqIGZhaWxlZC4gRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNIYWx0T25GYWlsdXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHtAbGluayBDbGFzc0xvYWRlcn0gdGhhdCBoYXMgdG8gYmUgdXNlZCBmb3IgbGF1bmNoaW5nIGFuZCBleGVjdXRpb24gb2YgdGhlCisgICAgICogdGVzdHMKKyAgICAgKi8KKyAgICBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRhZ3Mgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGV2YWx1YXRlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBpbmNsdWRlZAorICAgICAqIGluIHRoZSB0ZXN0IGV4ZWN1dGlvbgorICAgICAqLworICAgIExpc3Q8U3RyaW5nPiBnZXRJbmNsdWRlVGFncygpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBsaXN0IG9mIHRhZ3Mgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGV2YWx1YXRlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBleGNsdWRlZAorICAgICAqIGZyb20gdGhlIHRlc3QgZXhlY3V0aW9uCisgICAgICovCisgICAgTGlzdDxTdHJpbmc+IGdldEV4Y2x1ZGVUYWdzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL0xpc3RlbmVyRGVmaW5pdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9MaXN0ZW5lckRlZmluaXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjAwZTYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9MaXN0ZW5lckRlZmluaXRpb24uamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKKworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0NMQVNTX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0xJU1RFTkVSX1JFU1VMVF9GSUxFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9PVVRQVVRfRElSRUNUT1JZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9TRU5EX1NZU19FUlI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX1NFTkRfU1lTX09VVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0VMTV9MSVNURU5FUjsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSB7QGNvZGUgJmx0O2xpc3RlbmVyJmd0O30gZWxlbWVudCB3aXRoaW4gdGhlIHtAY29kZSAmbHQ7anVuaXRsYXVuY2hlciZndDt9CisgKiB0YXNrCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0ZW5lckRlZmluaXRpb24geworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1BMQUlOID0gImxlZ2FjeS1wbGFpbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9CUklFRiA9ICJsZWdhY3ktYnJpZWYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfWE1MID0gImxlZ2FjeS14bWwiOworCisgICAgcHJpdmF0ZSBTdHJpbmcgaWZQcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyB1bmxlc3NQcm9wZXJ0eTsKKyAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVzdWx0RmlsZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFN5c091dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFN5c0VycjsKKyAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXI7CisKKyAgICBwdWJsaWMgTGlzdGVuZXJEZWZpbml0aW9uKCkgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0SWZQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIGlmUHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWYoZmluYWwgU3RyaW5nIGlmUHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5pZlByb3BlcnR5ID0gaWZQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0VW5sZXNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiB1bmxlc3NQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVbmxlc3MoZmluYWwgU3RyaW5nIHVubGVzc1Byb3BlcnR5KSB7CisgICAgICAgIHRoaXMudW5sZXNzUHJvcGVydHkgPSB1bmxlc3NQcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGZpbmFsIExpc3RlbmVyVHlwZSB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICBjYXNlIExFR0FDWV9QTEFJTjogeworICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLkxlZ2FjeVBsYWluUmVzdWx0Rm9ybWF0dGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIExFR0FDWV9CUklFRjogeworICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2xhc3NOYW1lKCJvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLkxlZ2FjeUJyaWVmUmVzdWx0Rm9ybWF0dGVyIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIExFR0FDWV9YTUw6IHsKKyAgICAgICAgICAgICAgICB0aGlzLnNldENsYXNzTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5MZWdhY3lYbWxSZXN1bHRGb3JtYXR0ZXIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc3VsdEZpbGUoZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHRoaXMucmVzdWx0RmlsZSA9IGZpbGVuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0RmlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0RmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTZW5kU3lzT3V0KGZpbmFsIGJvb2xlYW4gc2VuZFN5c091dCkgeworICAgICAgICB0aGlzLnNlbmRTeXNPdXQgPSBzZW5kU3lzT3V0OworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIHNob3VsZFNlbmRTeXNPdXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNlbmRTeXNPdXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VuZFN5c0VycihmaW5hbCBib29sZWFuIHNlbmRTeXNFcnIpIHsKKyAgICAgICAgdGhpcy5zZW5kU3lzRXJyID0gc2VuZFN5c0VycjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTZW5kU3lzRXJyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5zZW5kU3lzRXJyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoaXMgbGlzdGVuZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBkaXIgUGF0aCB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyKGZpbmFsIFN0cmluZyBkaXIpIHsKKyAgICAgICAgdGhpcy5vdXRwdXREaXIgPSBkaXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm91dHB1dERpcjsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2UoZmluYWwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIGZpbmFsIFByb3BlcnR5SGVscGVyIHByb3BlcnR5SGVscGVyID0gUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHlIZWxwZXIocHJvamVjdCk7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eUhlbHBlci50ZXN0SWZDb25kaXRpb24odGhpcy5pZlByb3BlcnR5KSAmJiBwcm9wZXJ0eUhlbHBlci50ZXN0VW5sZXNzQ29uZGl0aW9uKHRoaXMudW5sZXNzUHJvcGVydHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGRlZmluZXMgYXZhaWxhYmxlIGxpc3RlbmVyIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdGVuZXJUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtMRUdBQ1lfUExBSU4sIExFR0FDWV9CUklFRiwgTEVHQUNZX1hNTH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHRvRm9ya2VkUmVwcmVzZW50YXRpb24oZmluYWwgWE1MU3RyZWFtV3JpdGVyIHdyaXRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChMRF9YTUxfRUxNX0xJU1RFTkVSKTsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX0NMQVNTX05BTUUsIHRoaXMuY2xhc3NOYW1lKTsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX1NFTkRfU1lTX0VSUiwgQm9vbGVhbi50b1N0cmluZyh0aGlzLnNlbmRTeXNFcnIpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX1NFTkRfU1lTX09VVCwgQm9vbGVhbi50b1N0cmluZyh0aGlzLnNlbmRTeXNPdXQpKTsKKyAgICAgICAgaWYgKHRoaXMub3V0cHV0RGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShMRF9YTUxfQVRUUl9PVVRQVVRfRElSRUNUT1JZLCB0aGlzLm91dHB1dERpcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucmVzdWx0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfTElTVEVORVJfUkVTVUxUX0ZJTEUsIHRoaXMucmVzdWx0RmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXJEZWZpbml0aW9uIGZyb21Gb3JrZWRSZXByZXNlbnRhdGlvbihmaW5hbCBYTUxTdHJlYW1SZWFkZXIgcmVhZGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgcmVhZGVyLnJlcXVpcmUoWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQsIG51bGwsIExEX1hNTF9FTE1fTElTVEVORVIpOworICAgICAgICBmaW5hbCBMaXN0ZW5lckRlZmluaXRpb24gbGlzdGVuZXJEZWYgPSBuZXcgTGlzdGVuZXJEZWZpbml0aW9uKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSByZXF1aXJlQXR0cmlidXRlVmFsdWUocmVhZGVyLCBMRF9YTUxfQVRUUl9DTEFTU19OQU1FKTsKKyAgICAgICAgbGlzdGVuZXJEZWYuc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZW5kU3lzRXJyID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX1NFTkRfU1lTX0VSUik7CisgICAgICAgIGlmIChzZW5kU3lzRXJyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyRGVmLnNldFNlbmRTeXNFcnIoQm9vbGVhbi5wYXJzZUJvb2xlYW4oc2VuZFN5c0VycikpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBzZW5kU3lzT3V0ID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX1NFTkRfU1lTX09VVCk7CisgICAgICAgIGlmIChzZW5kU3lzT3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyRGVmLnNldFNlbmRTeXNPdXQoQm9vbGVhbi5wYXJzZUJvb2xlYW4oc2VuZFN5c091dCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXREaXIgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgTERfWE1MX0FUVFJfT1VUUFVUX0RJUkVDVE9SWSk7CisgICAgICAgIGlmIChvdXRwdXREaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdGVuZXJEZWYuc2V0T3V0cHV0RGlyKG91dHB1dERpcik7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdEZpbGUgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgTERfWE1MX0FUVFJfTElTVEVORVJfUkVTVUxUX0ZJTEUpOworICAgICAgICBpZiAocmVzdWx0RmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ZW5lckRlZi5zZXRSZXN1bHRGaWxlKHJlc3VsdEZpbGUpOworICAgICAgICB9CisgICAgICAgIHJlYWRlci5uZXh0VGFnKCk7CisgICAgICAgIHJlYWRlci5yZXF1aXJlKFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCwgbnVsbCwgTERfWE1MX0VMTV9MSVNURU5FUik7CisgICAgICAgIHJldHVybiBsaXN0ZW5lckRlZjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVxdWlyZUF0dHJpYnV0ZVZhbHVlKGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIGZpbmFsIFN0cmluZyBhdHRyTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgYXR0ck5hbWUpOworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiQXR0cmlidXRlICIgKyBhdHRyTmFtZSArICIgaXMgbWlzc2luZyBhdCAiICsgcmVhZGVyLmdldExvY2F0aW9uKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvTmFtZWRUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA3MiUKY29weSBmcm9tIHNyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEKY29weSB0byBzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL05hbWVkVGVzdC5qYXZhCmluZGV4IDlkNmZjYmEuLmFlNjYxZmUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9OYW1lZFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1LDExICsxNSwxNSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkOworCiAvKioKKyAqIEEgdGVzdCB0aGF0IGhhcyBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0CiAgKi8KLUBEaXN0cmlidXRlZCgKLSAgICAgICAgcHJvdG9jb2w9IkNPUkJBIiwKLSAgICAgICAgZGlzdHJpYnV0aW9uPURpc3RyaWJ1dGVkLkRpc3RyaWJ1dGlvblR5cGVzLkZFREVSQVRFRAotICAgICAgICApCi1wdWJsaWMgY2xhc3MgQXB0RXhhbXBsZSB7CitwdWJsaWMgaW50ZXJmYWNlIE5hbWVkVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRlc3QKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9TaW5nbGVUZXN0Q2xhc3MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvU2luZ2xlVGVzdENsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNlZjRjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvU2luZ2xlVGVzdENsYXNzLmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQ7CisKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUNvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0NMQVNTX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0VYQ0xVREVfRU5HSU5FUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9JTkNMVURFX0VOR0lORVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX01FVEhPRFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX09VVFBVVF9ESVJFQ1RPUlk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9FTE1fVEVTVDsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBzaW5nbGUge0Bjb2RlIHRlc3R9IChjbGFzcykgdGhhdCdzIGNvbmZpZ3VyZWQgdG8gYmUgbGF1bmNoZWQgYnkgdGhlIHtAbGluayBKVW5pdExhdW5jaGVyVGFza30KKyAqLworcHVibGljIGNsYXNzIFNpbmdsZVRlc3RDbGFzcyBleHRlbmRzIFRlc3REZWZpbml0aW9uIGltcGxlbWVudHMgTmFtZWRUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHRlc3RDbGFzczsKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IHRlc3RNZXRob2RzOworCisgICAgcHVibGljIFNpbmdsZVRlc3RDbGFzcygpIHsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIHRlc3QpIHsKKyAgICAgICAgaWYgKHRlc3QgPT0gbnVsbCB8fCB0ZXN0LnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlc3QgbmFtZSBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eSBzdHJpbmciKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRlc3RDbGFzcyA9IHRlc3Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy50ZXN0Q2xhc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kcyhmaW5hbCBTdHJpbmcgbWV0aG9kcykgeworICAgICAgICAvLyBwYXJzZSB0aGUgY29tbWEgc2VwYXJhdGVkIHNldCBvZiBtZXRob2RzCisgICAgICAgIGlmIChtZXRob2RzID09IG51bGwgfHwgbWV0aG9kcy50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aGlzLnRlc3RNZXRob2RzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtZXRob2RzLCAiLCIpOworICAgICAgICBpZiAoIXRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIHRoaXMudGVzdE1ldGhvZHMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIG1haW50YWluIHNwZWNpZmllZCBvcmRlcmluZworICAgICAgICB0aGlzLnRlc3RNZXRob2RzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7CisgICAgICAgICAgICBpZiAobWV0aG9kLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy50ZXN0TWV0aG9kcy5hZGQobWV0aG9kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2xlYW4gaGFzTWV0aG9kc1NwZWNpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudGVzdE1ldGhvZHMgIT0gbnVsbCAmJiAhdGhpcy50ZXN0TWV0aG9kcy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1ldGhvZHMoKSB7CisgICAgICAgIGlmICghaGFzTWV0aG9kc1NwZWNpZmllZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy50ZXN0TWV0aG9kcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy50ZXN0TWV0aG9kcy5zaXplKCldKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0b0ZvcmtlZFJlcHJlc2VudGF0aW9uKGZpbmFsIEpVbml0TGF1bmNoZXJUYXNrIHRhc2ssIGZpbmFsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoTERfWE1MX0VMTV9URVNUKTsKKyAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX0NMQVNTX05BTUUsIHRlc3RDbGFzcyk7CisgICAgICAgIGlmICh0ZXN0TWV0aG9kcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG1ldGhvZCA6IHRlc3RNZXRob2RzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX01FVEhPRFMsIHNiLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChoYWx0T25GYWlsdXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShMRF9YTUxfQVRUUl9IQUxUX09OX0ZBSUxVUkUsIGhhbHRPbkZhaWx1cmUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dERpciAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfT1VUUFVUX0RJUkVDVE9SWSwgb3V0cHV0RGlyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jbHVkZUVuZ2luZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX0lOQ0xVREVfRU5HSU5FUywgaW5jbHVkZUVuZ2luZXMpOworICAgICAgICB9CisgICAgICAgIGlmIChleGNsdWRlRW5naW5lcyAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfRVhDTFVERV9FTkdJTkVTLCBleGNsdWRlRW5naW5lcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbGlzdGVuZXJzIGZvciB0aGlzIHRlc3QKKyAgICAgICAgaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIExpc3RlbmVyRGVmaW5pdGlvbiBsaXN0ZW5lckRlZiA6IGdldExpc3RlbmVycygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lckRlZi5zaG91bGRVc2UodGFzay5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhcHBsaWNhYmxlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0ZW5lckRlZi50b0ZvcmtlZFJlcHJlc2VudGF0aW9uKHdyaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGVzdERlZmluaXRpb24gZnJvbUZvcmtlZFJlcHJlc2VudGF0aW9uKGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZWFkZXIucmVxdWlyZShYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCwgbnVsbCwgTERfWE1MX0VMTV9URVNUKTsKKyAgICAgICAgZmluYWwgU2luZ2xlVGVzdENsYXNzIHRlc3REZWZpbml0aW9uID0gbmV3IFNpbmdsZVRlc3RDbGFzcygpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdENsYXNzTmFtZSA9IHJlcXVpcmVBdHRyaWJ1dGVWYWx1ZShyZWFkZXIsIExEX1hNTF9BVFRSX0NMQVNTX05BTUUpOworICAgICAgICB0ZXN0RGVmaW5pdGlvbi5zZXROYW1lKHRlc3RDbGFzc05hbWUpOworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZXMgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgTERfWE1MX0FUVFJfTUVUSE9EUyk7CisgICAgICAgIGlmIChtZXRob2ROYW1lcyAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0RGVmaW5pdGlvbi5zZXRNZXRob2RzKG1ldGhvZE5hbWVzKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgaGFsdCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9IQUxUX09OX0ZBSUxVUkUpOworICAgICAgICBpZiAoaGFsdCAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0RGVmaW5pdGlvbi5zZXRIYWx0T25GYWlsdXJlKEJvb2xlYW4ucGFyc2VCb29sZWFuKGhhbHQpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgb3V0RGlyID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX09VVFBVVF9ESVJFQ1RPUlkpOworICAgICAgICBpZiAob3V0RGlyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLnNldE91dHB1dERpcihvdXREaXIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBpbmNsdWRlRW5ncyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9JTkNMVURFX0VOR0lORVMpOworICAgICAgICBpZiAoaW5jbHVkZUVuZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdERlZmluaXRpb24uc2V0SW5jbHVkZUVuZ2luZXMoaW5jbHVkZUVuZ3MpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdWRlRW5ncyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9FWENMVURFX0VOR0lORVMpOworICAgICAgICBpZiAoZXhjbHVkZUVuZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdERlZmluaXRpb24uc2V0RXhjbHVkZUVuZ2luZXMoZXhjbHVkZUVuZ3MpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChyZWFkZXIubmV4dFRhZygpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgeworICAgICAgICAgICAgcmVhZGVyLnJlcXVpcmUoWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQsIG51bGwsIENvbnN0YW50cy5MRF9YTUxfRUxNX0xJU1RFTkVSKTsKKyAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLmFkZENvbmZpZ3VyZWRMaXN0ZW5lcihMaXN0ZW5lckRlZmluaXRpb24uZnJvbUZvcmtlZFJlcHJlc2VudGF0aW9uKHJlYWRlcikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0RGVmaW5pdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVxdWlyZUF0dHJpYnV0ZVZhbHVlKGZpbmFsIFhNTFN0cmVhbVJlYWRlciByZWFkZXIsIGZpbmFsIFN0cmluZyBhdHRyTmFtZSkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSByZWFkZXIuZ2V0QXR0cmlidXRlVmFsdWUobnVsbCwgYXR0ck5hbWUpOworICAgICAgICBpZiAodmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbigiQXR0cmlidXRlICIgKyBhdHRyTmFtZSArICIgaXMgbWlzc2luZyBhdCAiICsgcmVhZGVyLmdldExvY2F0aW9uKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvVGVzdENsYXNzZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvVGVzdENsYXNzZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmUxMWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9UZXN0Q2xhc3Nlcy5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5SZXNvdXJjZXM7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlN0cmluZ1Jlc291cmNlOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Db25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0NMQVNTX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX0VYQ0xVREVfRU5HSU5FUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkNvbnN0YW50cy5MRF9YTUxfQVRUUl9JTkNMVURFX0VOR0lORVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9BVFRSX09VVFBVVF9ESVJFQ1RPUlk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQuQ29uc3RhbnRzLkxEX1hNTF9FTE1fVEVTVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZC5Db25zdGFudHMuTERfWE1MX0VMTV9URVNUX0NMQVNTRVM7CisKKy8qKgorICogUmVwcmVzZW50cyBhIHtAY29kZSB0ZXN0Y2xhc3Nlc30gdGhhdCdzIGNvbmZpZ3VyZWQgdG8gYmUgbGF1bmNoZWQgYnkgdGhlIHtAbGluayBKVW5pdExhdW5jaGVyVGFza30KKyAqLworcHVibGljIGNsYXNzIFRlc3RDbGFzc2VzIGV4dGVuZHMgVGVzdERlZmluaXRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzID0gbmV3IFJlc291cmNlcygpOworCisgICAgcHVibGljIFRlc3RDbGFzc2VzKCkgeworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKGZpbmFsIFJlc291cmNlQ29sbGVjdGlvbiByZXNvdXJjZUNvbGxlY3Rpb24pIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMuYWRkKHJlc291cmNlQ29sbGVjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUZXN0Q2xhc3NOYW1lcygpIHsKKyAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB0ZXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAoIXJlc291cmNlLmlzRXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gcmVzb3VyY2UuZ2V0TmFtZSgpOworICAgICAgICAgICAgLy8gd2Ugb25seSBjb25zaWRlciAuY2xhc3MgZmlsZXMKKyAgICAgICAgICAgIGlmICghbmFtZS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOworICAgICAgICAgICAgdGVzdHMuYWRkKGNsYXNzTmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKS5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCdcXCcsICcuJykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0b0ZvcmtlZFJlcHJlc2VudGF0aW9uKGZpbmFsIEpVbml0TGF1bmNoZXJUYXNrIHRhc2ssIGZpbmFsIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoTERfWE1MX0VMTV9URVNUX0NMQVNTRVMpOworICAgICAgICAvLyB3cml0ZSBvdXQgZWFjaCB0ZXN0IGNsYXNzCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHRlc3QgOiBnZXRUZXN0Q2xhc3NOYW1lcygpKSB7CisgICAgICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoTERfWE1MX0VMTV9URVNUKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShMRF9YTUxfQVRUUl9DTEFTU19OQU1FLCB0ZXN0KTsKKyAgICAgICAgICAgIGlmIChoYWx0T25GYWlsdXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoTERfWE1MX0FUVFJfSEFMVF9PTl9GQUlMVVJFLCBoYWx0T25GYWlsdXJlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dERpciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX09VVFBVVF9ESVJFQ1RPUlksIG91dHB1dERpcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5jbHVkZUVuZ2luZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZUF0dHJpYnV0ZShMRF9YTUxfQVRUUl9JTkNMVURFX0VOR0lORVMsIGluY2x1ZGVFbmdpbmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChleGNsdWRlRW5naW5lcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXR0cmlidXRlKExEX1hNTF9BVFRSX0VYQ0xVREVfRU5HSU5FUywgZXhjbHVkZUVuZ2luZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbGlzdGVuZXJzIGZvciB0aGlzIHRlc3QKKyAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTGlzdGVuZXJEZWZpbml0aW9uIGxpc3RlbmVyRGVmIDogZ2V0TGlzdGVuZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lckRlZi5zaG91bGRVc2UodGFzay5nZXRQcm9qZWN0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYXBwbGljYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJEZWYudG9Gb3JrZWRSZXByZXNlbnRhdGlvbih3cml0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFRlc3REZWZpbml0aW9uPiBmcm9tRm9ya2VkUmVwcmVzZW50YXRpb24oZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHJlYWRlci5yZXF1aXJlKFhNTFN0cmVhbUNvbnN0YW50cy5TVEFSVF9FTEVNRU5ULCBudWxsLCBMRF9YTUxfRUxNX1RFU1RfQ0xBU1NFUyk7CisgICAgICAgIGZpbmFsIExpc3Q8VGVzdERlZmluaXRpb24+IHRlc3REZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAvLyByZWFkIG91dCBhcyBtdWx0aXBsZSBTaW5nbGVUZXN0Q2xhc3MgcmVwcmVzZW50YXRpb25zCisgICAgICAgIHdoaWxlIChyZWFkZXIubmV4dFRhZygpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCkgeworICAgICAgICAgICAgZmluYWwgU2luZ2xlVGVzdENsYXNzIHRlc3REZWZpbml0aW9uID0gbmV3IFNpbmdsZVRlc3RDbGFzcygpOworICAgICAgICAgICAgcmVhZGVyLnJlcXVpcmUoWE1MU3RyZWFtQ29uc3RhbnRzLlNUQVJUX0VMRU1FTlQsIG51bGwsIENvbnN0YW50cy5MRF9YTUxfRUxNX1RFU1QpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RDbGFzc05hbWUgPSByZXF1aXJlQXR0cmlidXRlVmFsdWUocmVhZGVyLCBMRF9YTUxfQVRUUl9DTEFTU19OQU1FKTsKKyAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLnNldE5hbWUodGVzdENsYXNzTmFtZSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGFsdCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9IQUxUX09OX0ZBSUxVUkUpOworICAgICAgICAgICAgaWYgKGhhbHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLnNldEhhbHRPbkZhaWx1cmUoQm9vbGVhbi5wYXJzZUJvb2xlYW4oaGFsdCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIG91dERpciA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9PVVRQVVRfRElSRUNUT1JZKTsKKyAgICAgICAgICAgIGlmIChvdXREaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLnNldE91dHB1dERpcihvdXREaXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluY2x1ZGVFbmdzID0gcmVhZGVyLmdldEF0dHJpYnV0ZVZhbHVlKG51bGwsIExEX1hNTF9BVFRSX0lOQ0xVREVfRU5HSU5FUyk7CisgICAgICAgICAgICBpZiAoaW5jbHVkZUVuZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLnNldEluY2x1ZGVFbmdpbmVzKGluY2x1ZGVFbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdWRlRW5ncyA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBMRF9YTUxfQVRUUl9FWENMVURFX0VOR0lORVMpOworICAgICAgICAgICAgaWYgKGV4Y2x1ZGVFbmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXN0RGVmaW5pdGlvbi5zZXRFeGNsdWRlRW5naW5lcyhleGNsdWRlRW5ncyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVhZGVyLm5leHRUYWcoKSAhPSBYTUxTdHJlYW1Db25zdGFudHMuRU5EX0VMRU1FTlQpIHsKKyAgICAgICAgICAgICAgICByZWFkZXIucmVxdWlyZShYTUxTdHJlYW1Db25zdGFudHMuU1RBUlRfRUxFTUVOVCwgbnVsbCwgQ29uc3RhbnRzLkxEX1hNTF9FTE1fTElTVEVORVIpOworICAgICAgICAgICAgICAgIHRlc3REZWZpbml0aW9uLmFkZENvbmZpZ3VyZWRMaXN0ZW5lcihMaXN0ZW5lckRlZmluaXRpb24uZnJvbUZvcmtlZFJlcHJlc2VudGF0aW9uKHJlYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZGVyLnJlcXVpcmUoWE1MU3RyZWFtQ29uc3RhbnRzLkVORF9FTEVNRU5ULCBudWxsLCBDb25zdGFudHMuTERfWE1MX0VMTV9URVNUKTsKKyAgICAgICAgICAgIHRlc3REZWZpbml0aW9ucy5hZGQodGVzdERlZmluaXRpb24pOworICAgICAgICB9CisgICAgICAgIHJlYWRlci5yZXF1aXJlKFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRUxFTUVOVCwgbnVsbCwgTERfWE1MX0VMTV9URVNUX0NMQVNTRVMpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0ZXN0RGVmaW5pdGlvbnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZXF1aXJlQXR0cmlidXRlVmFsdWUoZmluYWwgWE1MU3RyZWFtUmVhZGVyIHJlYWRlciwgZmluYWwgU3RyaW5nIGF0dHJOYW1lKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IHJlYWRlci5nZXRBdHRyaWJ1dGVWYWx1ZShudWxsLCBhdHRyTmFtZSk7CisgICAgICAgIGlmICh2YWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKCJBdHRyaWJ1dGUgIiArIGF0dHJOYW1lICsgIiBpcyBtaXNzaW5nIGF0ICIgKyByZWFkZXIuZ2V0TG9jYXRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9UZXN0RGVmaW5pdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9UZXN0RGVmaW5pdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYjMzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL1Rlc3REZWZpbml0aW9uLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXIuY29uZmluZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb3BlcnR5SGVscGVyOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUmVwcmVzZW50cyB0aGUgY29uZmlndXJhdGlvbiBkZXRhaWxzIG9mIGEgdGVzdCB0aGF0IG5lZWRzIHRvIGJlIGxhdW5jaGVkIGJ5IHRoZSB7QGxpbmsgSlVuaXRMYXVuY2hlclRhc2t9CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0RGVmaW5pdGlvbiB7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlmUHJvcGVydHk7CisgICAgcHJvdGVjdGVkIFN0cmluZyB1bmxlc3NQcm9wZXJ0eTsKKyAgICBwcm90ZWN0ZWQgQm9vbGVhbiBoYWx0T25GYWlsdXJlOworICAgIHByb3RlY3RlZCBTdHJpbmcgZmFpbHVyZVByb3BlcnR5OworICAgIHByb3RlY3RlZCBTdHJpbmcgb3V0cHV0RGlyOworICAgIHByb3RlY3RlZCBTdHJpbmcgaW5jbHVkZUVuZ2luZXM7CisgICAgcHJvdGVjdGVkIFN0cmluZyBleGNsdWRlRW5naW5lczsKKyAgICBwcm90ZWN0ZWQgRm9ya0RlZmluaXRpb24gZm9ya0RlZmluaXRpb247CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxMaXN0ZW5lckRlZmluaXRpb24+IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgU3RyaW5nIGdldElmUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBpZlByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElmKGZpbmFsIFN0cmluZyBpZlByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuaWZQcm9wZXJ0eSA9IGlmUHJvcGVydHk7CisgICAgfQorCisgICAgU3RyaW5nIGdldFVubGVzc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gdW5sZXNzUHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VW5sZXNzKGZpbmFsIFN0cmluZyB1bmxlc3NQcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnVubGVzc1Byb3BlcnR5ID0gdW5sZXNzUHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNIYWx0T25GYWlsdXJlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oYWx0T25GYWlsdXJlICE9IG51bGwgJiYgdGhpcy5oYWx0T25GYWlsdXJlOworICAgIH0KKworICAgIEJvb2xlYW4gZ2V0SGFsdE9uRmFpbHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaGFsdE9uRmFpbHVyZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRIYWx0T25GYWlsdXJlKGZpbmFsIGJvb2xlYW4gaGFsdG9uZmFpbHVyZSkgeworICAgICAgICB0aGlzLmhhbHRPbkZhaWx1cmUgPSBoYWx0b25mYWlsdXJlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmFpbHVyZVByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gZmFpbHVyZVByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZhaWx1cmVQcm9wZXJ0eShmaW5hbCBTdHJpbmcgZmFpbHVyZVByb3BlcnR5KSB7CisgICAgICAgIHRoaXMuZmFpbHVyZVByb3BlcnR5ID0gZmFpbHVyZVByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRMaXN0ZW5lcihmaW5hbCBMaXN0ZW5lckRlZmluaXRpb24gbGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5saXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxMaXN0ZW5lckRlZmluaXRpb24+IGdldExpc3RlbmVycygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5saXN0ZW5lcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcihmaW5hbCBTdHJpbmcgZGlyKSB7CisgICAgICAgIHRoaXMub3V0cHV0RGlyID0gZGlyOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXREaXI7CisgICAgfQorCisgICAgcHVibGljIEZvcmtEZWZpbml0aW9uIGNyZWF0ZUZvcmsoKSB7CisgICAgICAgIGlmICh0aGlzLmZvcmtEZWZpbml0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGVzdCBkZWZpbml0aW9uIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgZm9yayBlbGVtZW50cyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZm9ya0RlZmluaXRpb24gPSBuZXcgRm9ya0RlZmluaXRpb24oKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZm9ya0RlZmluaXRpb247CisgICAgfQorCisgICAgRm9ya0RlZmluaXRpb24gZ2V0Rm9ya0RlZmluaXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmZvcmtEZWZpbml0aW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIHNob3VsZFJ1bihmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgZmluYWwgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIgPSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihwcm9qZWN0KTsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5SGVscGVyLnRlc3RJZkNvbmRpdGlvbih0aGlzLmlmUHJvcGVydHkpICYmIHByb3BlcnR5SGVscGVyLnRlc3RVbmxlc3NDb25kaXRpb24odGhpcy51bmxlc3NQcm9wZXJ0eSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVFbmdpbmVzKCkgeworICAgICAgICByZXR1cm4gaW5jbHVkZUVuZ2luZXMgPT0gbnVsbCA/IG5ldyBTdHJpbmdbMF0gOiBzcGxpdCh0aGlzLmluY2x1ZGVFbmdpbmVzLCAiLCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbmdpbmVzKGZpbmFsIFN0cmluZyBpbmNsdWRlRW5naW5lcykgeworICAgICAgICB0aGlzLmluY2x1ZGVFbmdpbmVzID0gaW5jbHVkZUVuZ2luZXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVFbmdpbmVzKCkgeworICAgICAgICByZXR1cm4gZXhjbHVkZUVuZ2luZXMgPT0gbnVsbCA/IG5ldyBTdHJpbmdbMF0gOiBzcGxpdCh0aGlzLmV4Y2x1ZGVFbmdpbmVzLCAiLCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVFbmdpbmVzKGZpbmFsIFN0cmluZyBleGNsdWRlRW5naW5lcykgeworICAgICAgICB0aGlzLmV4Y2x1ZGVFbmdpbmVzID0gZXhjbHVkZUVuZ2luZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gc3BsaXQoZmluYWwgU3RyaW5nIHZhbHVlLCBmaW5hbCBTdHJpbmcgZGVsaW1pdGVyKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1swXTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcGFydHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGFydCA6IHZhbHVlLnNwbGl0KGRlbGltaXRlcikpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0LnRyaW0oKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwIGl0CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0cy5hZGQocGFydCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnRzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJ0cy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0b0ZvcmtlZFJlcHJlc2VudGF0aW9uKEpVbml0TGF1bmNoZXJUYXNrIHRhc2ssIFhNTFN0cmVhbVdyaXRlciB3cml0ZXIpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL2NvbmZpbmVkL3BhY2thZ2UtaW5mby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjElCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9jb25maW5lZC9wYWNrYWdlLWluZm8uamF2YQppbmRleCA5ZDZmY2JhLi4yYmU5Nzc5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvY29uZmluZWQvcGFja2FnZS1pbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNiwxMCArMTYsMTIgQEAKICAqCiAgKi8KIC8qKgorICogVGhlIGNsYXNzZXMvaW50ZXJmYWNlcyBpbiB0aGlzIHBhY2thZ2UgPGVtPm11c3Qgbm90PC9lbT4KKyAqIGhhdmUgYW55IGNvbXBpbGUgdGltZSBkZXBlbmRlbmN5IG9uIGFueSBvZiBKVW5pdCBwbGF0Zm9ybSBvcgorICogZW5naW5lIGNsYXNzZXMvaW50ZXJmYWNlcy4gVGhleSA8ZW0+bXVzdCBub3Q8L2VtPiBldmVuIGhhdmUgYW55CisgKiBjb21waWxlIHRpbWUgZGVwZW5kZW5jeSBvbiBhbnkgY2xhc3Nlcy9pbnRlcmZhY2VzIHRoYXQgYmVsb25nIHRvIHRoZQorICoge0Bjb2RlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXJ9IHBhY2thZ2UuCisgKgorICogQHNpbmNlIEFudCAxLjEwLjYKICAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKLX0KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5jb25maW5lZDsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9wYWNrYWdlLWluZm8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpjb3B5IHRvIHNyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIvcGFja2FnZS1pbmZvLmphdmEKaW5kZXggOWQ2ZmNiYS4uZDAyYTc3ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTYsMTAgKzE2LDEzIEBACiAgKgogICovCiAvKioKKyAqIFRoZSBjbGFzc2VzL2ludGVyZmFjZXMgaW4gdGhpcyBwYWNrYWdlIGFyZSBhbGxvd2VkCisgKiB0byBoYXZlIGNvbXBpbGUgdGltZSBkZXBlbmRlbmN5IG9uIEpVbml0IHBsYXRmb3JtIGNsYXNzZXMvaW50ZXJmYWNlcy4KKyAqIEZ1cnRoZXJtb3JlIGNsYXNzZXMvaW50ZXJmYWNlcyBpbiB0aGlzIHBhY2thZ2UgYXJlIGFsc28KKyAqIGFsbG93ZWQgdG8gaGF2ZSBjb21waWxlIHRpbWUgZGVwZW5kZW5jeSBvbiB0aGUKKyAqIHtAbGluayBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkfQorICogcGFja2FnZQorICoKKyAqIEBzaW5jZSBBbnQgMS4xMC42CiAgKi8KLUBEaXN0cmlidXRlZCgKLSAgICAgICAgcHJvdG9jb2w9IkNPUkJBIiwKLSAgICAgICAgZGlzdHJpYnV0aW9uPURpc3RyaWJ1dGVkLkRpc3RyaWJ1dGlvblR5cGVzLkZFREVSQVRFRAotICAgICAgICApCi1wdWJsaWMgY2xhc3MgQXB0RXhhbXBsZSB7Ci19CitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0bGF1bmNoZXI7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL0J1aWx0aW5OYXRpdmUyQXNjaWkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9CdWlsdGluTmF0aXZlMkFzY2lpLmphdmEKaW5kZXggZGI5MWEyNi4uZWJhNjZlNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL0J1aWx0aW5OYXRpdmUyQXNjaWkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvQnVpbHRpbk5hdGl2ZTJBc2NpaS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMjAgKzIwLDE4IEBACiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVW5hcnlPcGVyYXRvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLk5hdGl2ZTJBc2NpaTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLk5hdGl2ZTJBc2NpaVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogRW5jYXBzdWxhdGVzIHRoZSBidWlsdC1pbiBOYXRpdmUyQXNjaWkgaW1wbGVtZW50YXRpb24uCkBAIC00NCwyMyArNDIsMTYgQEAKIAogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTEVNRU5UQVRJT05fTkFNRSA9ICJidWlsdGluIjsKIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbnZlcnQoTmF0aXZlMkFzY2lpIGFyZ3MsIEZpbGUgc3JjRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZGVzdEZpbGUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSA9IGFyZ3MuZ2V0UmV2ZXJzZSgpOwogICAgICAgICBTdHJpbmcgZW5jb2RpbmcgPSBhcmdzLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGlucHV0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucHV0ID0gZ2V0UmVhZGVyKHNyY0ZpbGUsIGVuY29kaW5nLCByZXZlcnNlKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgV3JpdGVyIG91dHB1dCA9IGdldFdyaXRlcihkZXN0RmlsZSwgZW5jb2RpbmcsIHJldmVyc2UpOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShpbnB1dCwgb3V0cHV0LCByZXZlcnNlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbnB1dCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgaW5wdXQgPSBnZXRSZWFkZXIoc3JjRmlsZSwgZW5jb2RpbmcsIHJldmVyc2UpOworICAgICAgICAgICAgICAgIFdyaXRlciBvdXRwdXQgPSBnZXRXcml0ZXIoZGVzdEZpbGUsIGVuY29kaW5nLCByZXZlcnNlKSkgeworCisgICAgICAgICAgICB0cmFuc2xhdGUoaW5wdXQsIG91dHB1dCwgcmV2ZXJzZSA/IE5hdGl2ZTJBc2NpaVV0aWxzOjphc2NpaTJuYXRpdmUKKyAgICAgICAgICAgICAgICA6IE5hdGl2ZTJBc2NpaVV0aWxzOjpuYXRpdmUyYXNjaWkpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkV4Y2VwdGlvbiB0cnlpbmcgdG8gdHJhbnNsYXRlIGRhdGEiLCBleCk7CkBAIC02OSwxMSArNjAsMTEgQEAKIAogICAgIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZ2V0UmVhZGVyKEZpbGUgc3JjRmlsZSwgU3RyaW5nIGVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFyZXZlcnNlICYmIGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjRmlsZSksIGVuY29kaW5nKSk7CisgICAgICAgIGlmIChyZXZlcnNlIHx8IGVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc3JjRmlsZSkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc3JjRmlsZSkpOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgIEZpbGVzLm5ld0lucHV0U3RyZWFtKHNyY0ZpbGUudG9QYXRoKCkpLCBlbmNvZGluZykpOwogICAgIH0KIAogICAgIHByaXZhdGUgV3JpdGVyIGdldFdyaXRlcihGaWxlIGRlc3RGaWxlLCBTdHJpbmcgZW5jb2RpbmcsCkBAIC04MSwyNCArNzIsMTkgQEAKICAgICAgICAgaWYgKCFyZXZlcnNlKSB7CiAgICAgICAgICAgICBlbmNvZGluZyA9ICJBU0NJSSI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGVuY29kaW5nICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIoCi0gICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZykpOworICAgICAgICBpZiAoZW5jb2RpbmcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihkZXN0RmlsZSkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoZGVzdEZpbGUpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRlcigKKyAgICAgICAgICAgIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoRmlsZXMubmV3T3V0cHV0U3RyZWFtKGRlc3RGaWxlLnRvUGF0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdHJhbnNsYXRlKEJ1ZmZlcmVkUmVhZGVyIGlucHV0LCBXcml0ZXIgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgIHdoaWxlICgobGluZSA9IGlucHV0LnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghcmV2ZXJzZSkgewotICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShOYXRpdmUyQXNjaWlVdGlscy5uYXRpdmUyYXNjaWkobGluZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoTmF0aXZlMkFzY2lpVXRpbHMuYXNjaWkybmF0aXZlKGxpbmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dC53cml0ZShTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIFVuYXJ5T3BlcmF0b3I8U3RyaW5nPiB0cmFuc2xhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IChJdGVyYWJsZTxTdHJpbmc+KSAoKSAtPiBpbnB1dC5saW5lcygpCisgICAgICAgICAgICAubWFwKHRyYW5zbGF0aW9uKS5pdGVyYXRvcigpKSB7CisgICAgICAgICAgICBvdXRwdXQud3JpdGUoU3RyaW5nLmZvcm1hdCgiJXMlbiIsIGxpbmUpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9EZWZhdWx0TmF0aXZlMkFzY2lpLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvRGVmYXVsdE5hdGl2ZTJBc2NpaS5qYXZhCmluZGV4IGMxNmExYTMuLmYwY2Y5NGMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9EZWZhdWx0TmF0aXZlMkFzY2lpLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL0RlZmF1bHROYXRpdmUyQXNjaWkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICAgKiAoZGVsZWdhdGVkIHRvIHtAbGluayAjYWRkRmlsZXMgYWRkRmlsZXN9KSBhbmQgcnVubmluZyB0aGUgdG9vbAogICAgICAqIChkZWxlZ2F0ZWQgdG8ge0BsaW5rICNydW4gcnVufSkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gY29udmVydChOYXRpdmUyQXNjaWkgYXJncywgRmlsZSBzcmNGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkZXN0RmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvS2FmZmVOYXRpdmUyQXNjaWkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9LYWZmZU5hdGl2ZTJBc2NpaS5qYXZhCmluZGV4IGFmYjg4ZDkuLjI5NWVlYzAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9LYWZmZU5hdGl2ZTJBc2NpaS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9LYWZmZU5hdGl2ZTJBc2NpaS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDMsNiArNDMsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVEFUSU9OX05BTUUgPSAia2FmZmUiOwogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cChDb21tYW5kbGluZSBjbWQsIE5hdGl2ZTJBc2NpaSBhcmdzKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoYXJncy5nZXRSZXZlcnNlKCkpIHsKQEAgLTUyLDEzICs1MywxNCBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcnVuKENvbW1hbmRsaW5lIGNtZCwgUHJvamVjdENvbXBvbmVudCBsb2cpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIEV4ZWN1dGVKYXZhIGVqID0gbmV3IEV4ZWN1dGVKYXZhKCk7Ci0gICAgICAgIENsYXNzIGMgPSBnZXROMmFDbGFzcygpOworICAgICAgICBDbGFzczw/PiBjID0gZ2V0TjJhQ2xhc3MoKTsKICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZG4ndCBsb2FkIEthZmZlJ3MgTmF0aXZlMkFzY2lpIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjbGFzcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZG4ndCBsb2FkIEthZmZlJ3MgTmF0aXZlMkFzY2lpIGNsYXNzIik7CiAgICAgICAgIH0KIAogICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShjLmdldE5hbWUoKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL05hdGl2ZTJBc2NpaUFkYXB0ZXIuamF2YQppbmRleCBhZjQxNDAwLi4wY2NmZDFiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvTmF0aXZlMkFzY2lpQWRhcHRlckZhY3RvcnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlBZGFwdGVyRmFjdG9yeS5qYXZhCmluZGV4IGU4YmQ3NGQuLjFmMzU5ODAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9OYXRpdmUyQXNjaWlBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDAsMTIgKzQwLDkgQEAKICAgICAgKiB2ZW5kb3IKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0KCkgewotICAgICAgICBpZiAoc2hvdWxkVXNlS2FmZmVlKCkpIHsKKyAgICAgICAgaWYgKHNob3VsZFVzZUthZmZlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBLYWZmZU5hdGl2ZTJBc2NpaS5JTVBMRU1FTlRBVElPTl9OQU1FOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzaG91bGRVc2VTdW4oKSkgewotICAgICAgICAgICAgcmV0dXJuIFN1bk5hdGl2ZTJBc2NpaS5JTVBMRU1FTlRBVElPTl9OQU1FOwotICAgICAgICB9CiAgICAgICAgIHJldHVybiBCdWlsdGluTmF0aXZlMkFzY2lpLklNUExFTUVOVEFUSU9OX05BTUU7CiAgICAgfQogCkBAIC04MiwxMSArNzksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Q29tcG9uZW50IGxvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIGNsYXNzcGF0aCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChzaG91bGRVc2VLYWZmZWUoKSAmJiBjaG9pY2UgPT0gbnVsbCkKKyAgICAgICAgaWYgKChzaG91bGRVc2VLYWZmZSgpICYmIGNob2ljZSA9PSBudWxsKQogICAgICAgICAgICAgfHwgS2FmZmVOYXRpdmUyQXNjaWkuSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBLYWZmZU5hdGl2ZTJBc2NpaSgpOwotICAgICAgICB9IGVsc2UgaWYgKChzaG91bGRVc2VTdW4oKSAmJiBjaG9pY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICB8fCBTdW5OYXRpdmUyQXNjaWkuSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgeworICAgICAgICB9IGVsc2UgaWYgKFN1bk5hdGl2ZTJBc2NpaS5JTVBMRU1FTlRBVElPTl9OQU1FLmVxdWFscyhjaG9pY2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN1bk5hdGl2ZTJBc2NpaSgpOwogICAgICAgICB9IGVsc2UgaWYgKEJ1aWx0aW5OYXRpdmUyQXNjaWkuSU1QTEVNRU5UQVRJT05fTkFNRS5lcXVhbHMoY2hvaWNlKSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBCdWlsdGluTmF0aXZlMkFzY2lpKCk7CkBAIC0xMTIsMjAgKzEwOCwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIE5hdGl2ZTJBc2NpaUFkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoTmF0aXZlMkFzY2lpQWRhcHRlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAorICAgICAgICByZXR1cm4gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAogICAgICAgICAgICAgbG9hZGVyICE9IG51bGwgPyBsb2FkZXIgOgogICAgICAgICAgICAgTmF0aXZlMkFzY2lpQWRhcHRlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKICAgICAgICAgICAgIE5hdGl2ZTJBc2NpaUFkYXB0ZXIuY2xhc3MpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVXNlS2FmZmVlKCkgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gc2hvdWxkVXNlS2FmZmUoKSB7CiAgICAgICAgIHJldHVybiBKYXZhRW52VXRpbHMuaXNLYWZmZSgpIHx8IEphdmFFbnZVdGlscy5pc0NsYXNzcGF0aEJhc2VkKCk7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBzaG91bGRVc2VTdW4oKSB7Ci0gICAgICAgIHJldHVybiBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzUpCi0gICAgICAgICAgICB8fCBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzYpCi0gICAgICAgICAgICB8fCBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzcpCi0gICAgICAgICAgICB8fCBKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV8xXzgpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9TdW5OYXRpdmUyQXNjaWkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9TdW5OYXRpdmUyQXNjaWkuamF2YQppbmRleCBmYWM5NGIxLi45ZjlmMzJmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvU3VuTmF0aXZlMkFzY2lpLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpL1N1bk5hdGl2ZTJBc2NpaS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsNyArMzYsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRBVElPTl9OQU1FID0gInN1biI7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VOX1RPT0xTX05BVElWRTJBU0NJSV9NQUlOID0gInN1bi50b29scy5uYXRpdmUyYXNjaWkuTWFpbiI7CisKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldHVwKENvbW1hbmRsaW5lIGNtZCwgTmF0aXZlMkFzY2lpIGFyZ3MpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChhcmdzLmdldFJldmVyc2UoKSkgewpAQCAtNDYsMjMgKzQ5LDIwIEBACiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBydW4oQ29tbWFuZGxpbmUgY21kLCBQcm9qZWN0Q29tcG9uZW50IGxvZykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzIG4yYU1haW4gPSBDbGFzcy5mb3JOYW1lKCJzdW4udG9vbHMubmF0aXZlMmFzY2lpLk1haW4iKTsKLSAgICAgICAgICAgIENsYXNzW10gcGFyYW0gPSBuZXcgQ2xhc3NbXSB7U3RyaW5nW10uY2xhc3N9OwotICAgICAgICAgICAgTWV0aG9kIGNvbnZlcnQgPSBuMmFNYWluLmdldE1ldGhvZCgiY29udmVydCIsIHBhcmFtKTsKLSAgICAgICAgICAgIGlmIChjb252ZXJ0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGNvbnZlcnQoKSBtZXRob2QgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJzdW4udG9vbHMubmF0aXZlMmFzY2lpLk1haW4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE9iamVjdCBvID0gbjJhTWFpbi5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgY29udmVydC5pbnZva2UobywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y21kLmdldEFyZ3VtZW50cygpfSkKLSAgICAgICAgICAgICAgICAgICAgKS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgIENsYXNzPD8+IG4yYU1haW4gPSBDbGFzcy5mb3JOYW1lKFNVTl9UT09MU19OQVRJVkUyQVNDSUlfTUFJTik7CisgICAgICAgICAgICBNZXRob2QgY29udmVydCA9IG4yYU1haW4uZ2V0TWV0aG9kKCJjb252ZXJ0IiwgU3RyaW5nW10uY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uVFJVRS5lcXVhbHMoY29udmVydC5pbnZva2UobjJhTWFpbi5uZXdJbnN0YW5jZSgpLAorICAgICAgICAgICAgICAgIChPYmplY3QpIGNtZC5nZXRBcmd1bWVudHMoKSkpOwogICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy9yZXRocm93CiAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGNvbnZlcnQoKSBtZXRob2QgaW4gJXMiLAorICAgICAgICAgICAgICAgIFNVTl9UT09MU19OQVRJVkUyQVNDSUlfTUFJTik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgLy93cmFwCiAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igc3RhcnRpbmcgU3VuJ3MgbmF0aXZlMmFzY2lpOiAiLCBleCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQLmphdmEKaW5kZXggOGUzYWVlNC4uZThmYTYwMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDMwICsyMSwzMSBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUEZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQUmVwbHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ29ubmVjdGlvbkNsb3NlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5EaXJlY3RvcnlTY2FubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0xMjAsOCArMTIxLDggQEAKICAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHlNaWxsaXMgPSAwTDsKICAgICBwcml2YXRlIGJvb2xlYW4gdGltZURpZmZBdXRvID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBpbnQgYWN0aW9uID0gU0VORF9GSUxFUzsKLSAgICBwcml2YXRlIFZlY3RvciBmaWxlc2V0cyA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcml2YXRlIFNldCBkaXJDYWNoZSA9IG5ldyBIYXNoU2V0KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIFNldDxGaWxlPiBkaXJDYWNoZSA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBwcml2YXRlIGludCB0cmFuc2ZlcnJlZCA9IDA7CiAgICAgcHJpdmF0ZSBTdHJpbmcgcmVtb3RlRmlsZVNlcCA9ICIvIjsKICAgICBwcml2YXRlIGludCBwb3J0ID0gREVGQVVMVF9GVFBfUE9SVDsKQEAgLTE0Myw4ICsxNDQsMTIgQEAKICAgICBwcml2YXRlIFN0cmluZyBzaXRlQ29tbWFuZCA9IG51bGw7CiAgICAgcHJpdmF0ZSBTdHJpbmcgaW5pdGlhbFNpdGVDb21tYW5kID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlUmVtb3RlVmVyaWZpY2F0aW9uID0gdHJ1ZTsKKyAgICBwcml2YXRlIGludCBkYXRhVGltZW91dCA9IC0xOworICAgIHByaXZhdGUgaW50IHdha2VVcFRyYW5zZmVySW50ZXJ2YWwgPSAtMTsKKyAgICBwcml2YXRlIGxvbmcgbGFzdFdha2VVcFRpbWUgPSAwOwogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBQ1RJT05fU1RSUyA9IHsgLy9OT1NPTkFSCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEFDVElPTl9TVFJTID0gey8vTk9TT05BUgogICAgICAgICAic2VuZGluZyIsCiAgICAgICAgICJnZXR0aW5nIiwKICAgICAgICAgImRlbGV0aW5nIiwKQEAgLTE1NSw3ICsxNjAsNyBAQAogICAgICAgICAic2l0ZSIKICAgICB9OwogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01QTEVURURfQUNUSU9OX1NUUlMgPSB7IC8vTk9TT05BUgorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09NUExFVEVEX0FDVElPTl9TVFJTID0gey8vTk9TT05BUgogICAgICAgICAic2VudCIsCiAgICAgICAgICJyZXRyaWV2ZWQiLAogICAgICAgICAiZGVsZXRlZCIsCkBAIC0xNjYsNyArMTcxLDcgQEAKICAgICAgICAgInNpdGUgY29tbWFuZCBleGVjdXRlZCIKICAgICB9OwogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBBQ1RJT05fVEFSR0VUX1NUUlMgPSB7IC8vTk9TT05BUgorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUNUSU9OX1RBUkdFVF9TVFJTID0gey8vTk9TT05BUgogICAgICAgICAiZmlsZXMiLAogICAgICAgICAiZmlsZXMiLAogICAgICAgICAiZmlsZXMiLApAQCAtMTgzLDYgKzE4OCw3IEBACiAgICAgICoKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEZUUEZpbGVQcm94eSBleHRlbmRzIEZpbGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIEZUUEZpbGUgZmlsZTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBwYXJ0czsKQEAgLTIxNCw2ICsyMjAsNyBAQAogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2V4aXN0cygpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTIyMiw2ICsyMjksNyBAQAogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2dldEFic29sdXRlUGF0aCgpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgICAgfQpAQCAtMjMwLDYgKzIzOCw3IEBACiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjZ2V0TmFtZSgpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDAgPyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA6IG5hbWU7CiAgICAgICAgIH0KQEAgLTIzOCwxOCArMjQ3LDE2IEBACiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjZ2V0UGFyZW50KCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudCgpIHsKLSAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiIjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKXsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gRmlsZS5zZXBhcmF0b3JDaGFyICsgcGFydHNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgcmV0dXJuIEZpbGUuc2VwYXJhdG9yICsgU3RyaW5nLmpvaW4oRmlsZS5zZXBhcmF0b3IsIHBhcnRzKTsKICAgICAgICAgfQogCiAKICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAgICAgKiBAc2VlIGphdmEuaW8uRmlsZSNnZXRQYXRoKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgICAgfQpAQCAtMjU5LDYgKzI2Niw3IEBACiAgICAgICAgICAqIEZUUCBmaWxlcyBhcmUgc3RvcmVkIGFzIGFic29sdXRlIHBhdGhzCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMjY3LDYgKzI3NSw3IEBACiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjaXNEaXJlY3RvcnkoKQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewogICAgICAgICAgICAgcmV0dXJuIGZpbGUgPT0gbnVsbDsKICAgICAgICAgfQpAQCAtMjc1LDYgKzI4NCw3IEBACiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjaXNGaWxlKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmlsZSAhPSBudWxsOwogICAgICAgICB9CkBAIC0yODUsNiArMjk1LDcgQEAKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiAgZmFsc2UKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbigpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjkzLDYgKzMwNCw3IEBACiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjbGFzdE1vZGlmaWVkKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgbG9uZyBsYXN0TW9kaWZpZWQoKSB7CiAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0VGltZXN0YW1wKCkuZ2V0VGltZUluTWlsbGlzKCk7CkBAIC0zMDQsNiArMzE2LDcgQEAKICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAgICAgKiBAc2VlIGphdmEuaW8uRmlsZSNsZW5ndGgoKQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRTaXplKCk7CkBAIC0zNDksNiArMzYyLDcgQEAKICAgICAgICAgICogc2NhbnMgdGhlIHJlbW90ZSBkaXJlY3RvcnksCiAgICAgICAgICAqIHN0b3JpbmcgaW50ZXJuYWxseSB0aGUgaW5jbHVkZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCAuLi4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzY2FuKCkgewogICAgICAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBObyBpbmNsdWRlcyBzdXBwbGllZCwgc28gc2V0IGl0IHRvICdtYXRjaGVzIGFsbCcKQEAgLTM1OSwxMiArMzczLDEyIEBACiAgICAgICAgICAgICAgICAgZXhjbHVkZXMgPSBuZXcgU3RyaW5nWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmaWxlc0luY2x1ZGVkID0gbmV3IFZlY3RvclNldCgpOwotICAgICAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZpbGVzRXhjbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7Ci0gICAgICAgICAgICBkaXJzSW5jbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7Ci0gICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBkaXJzRXhjbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7CisgICAgICAgICAgICBmaWxlc0luY2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgICAgICBkaXJzSW5jbHVkZWQgPSBuZXcgVmVjdG9yU2V0PD4oKTsKKyAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGN3ZCA9IGZ0cC5wcmludFdvcmtpbmdEaXJlY3RvcnkoKTsKQEAgLTM4Nyw3ICs0MDEsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSW5jbHVkZVBhdHRlcm5zKCkgewogCi0gICAgICAgICAgICBIYXNodGFibGUgbmV3cm9vdHMgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld3Jvb3RzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgLy8gcHV0IGluIHRoZSBuZXdyb290cyB2ZWN0b3IgdGhlIGluY2x1ZGUgcGF0dGVybnMgd2l0aG91dAogICAgICAgICAgICAgLy8gd2lsZGNhcmQgdG9rZW5zCiAgICAgICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlIDogaW5jbHVkZXMpIHsKQEAgLTQxMiw2OSArNDI2LDY1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG9ubHkgc2NhbiBkaXJlY3RvcmllcyB0aGF0IGNhbiBpbmNsdWRlIG1hdGNoZWQgZmlsZXMgb3IKICAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0yID0gbmV3cm9vdHMua2V5cygpOworICAgICAgICAgICAgICAgIG5ld3Jvb3RzLmZvckVhY2goKGssIHYpIC0+IHNjYW5Sb290cyhiYXNlRlRQRmlsZSwgaywgdikpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAoZW51bTIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRlbGVtZW50ID0gKFN0cmluZykgZW51bTIubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFscGF0dGVybiA9IChTdHJpbmcpIG5ld3Jvb3RzLmdldChjdXJyZW50ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIEFudEZUUEZpbGUgbXlmaWxlID0gbmV3IEFudEZUUEZpbGUoYmFzZUZUUEZpbGUsIGN1cnJlbnRlbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09LID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmF2ZXJzZXNTeW1saW5rcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CisgICAgICAgIHByaXZhdGUgdm9pZCBzY2FuUm9vdHMoQW50RlRQRmlsZSBiYXNlRlRQRmlsZSwgU3RyaW5nIGN1cnJlbnRlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbHBhdHRlcm4pIHsKKyAgICAgICAgICAgIEFudEZUUEZpbGUgbXlmaWxlID0gbmV3IEFudEZUUEZpbGUoYmFzZUZUUEZpbGUsIGN1cnJlbnRlbGVtZW50KTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIHRyYXZlcnNlc1N5bWxpbmtzID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG15ZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VSZW1vdGVTZW5zaXRpdml0eUNoZWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSAmJiBpc0ZvbGxvd1N5bWxpbmtzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sIGNhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBkbyBub3QgbmVlZCB0byBzY2FuIGFsbCB0aGUgc3ViZGlycyBpbiB0aGUgcmVsYXRpdmUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBteWZpbGUuZ2V0RmFzdFJlbGF0aXZlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLiAgV2Ugd2FudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRzIHRvIHNob3cgd2hhdCdzIHJlYWxseSBvbiB0aGUgZGlzaywgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZSBjaGVjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gbXlmaWxlLmdldFJlbGF0aXZlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXNTeW1saW5rcyA9IG15ZmlsZS5pc1RyYXZlcnNlU3ltbGlua3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICBjYXRjaCAoSU9FeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGJlLCBnZXRMb2NhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG15ZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIGZvcmNlUmVtb3RlU2Vuc2l0aXZpdHlDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQKKyAgICAgICAgICAgICAgICAgICAgJiYgcmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSAmJiBpc0ZvbGxvd1N5bWxpbmtzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29vbCBjYXNlLAorICAgICAgICAgICAgICAgICAgICAvL3dlIGRvIG5vdCBuZWVkIHRvIHNjYW4gYWxsIHRoZSBzdWJkaXJzIGluIHRoZSByZWxhdGl2ZSBwYXRoCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBteWZpbGUuZ2V0RmFzdFJlbGF0aXZlUGF0aCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1heSBiZSBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZSBzeXN0ZW0uICBXZSB3YW50CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRzIHRvIHNob3cgd2hhdCdzIHJlYWxseSBvbiB0aGUgZGlzaywgc28KKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBkb3VibGUgY2hlY2suCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gbXlmaWxlLmdldFJlbGF0aXZlUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VzU3ltbGlua3MgPSBteWZpbGUuaXNUcmF2ZXJzZVN5bWxpbmtzKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oYmUsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ZWxlbWVudCA9IHBhdGgucmVwbGFjZShyZW1vdGVGaWxlU2VwLmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpICYmIHRyYXZlcnNlc1N5bWxpbmtzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpc09LID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXNPSykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ID0gcGF0aC5yZXBsYWNlKHJlbW90ZUZpbGVTZXAuY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpICYmIHRyYXZlcnNlc1N5bWxpbmtzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteWZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKGN1cnJlbnRlbGVtZW50KSAmJiBjdXJyZW50ZWxlbWVudC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRGlyKGN1cnJlbnRlbGVtZW50LCBteWZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudGVsZW1lbnQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudGVsZW1lbnQuY2hhckF0KGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ZWxlbWVudCA9IGN1cnJlbnRlbGVtZW50ICsgRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIobXlmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjdXJyZW50ZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlICYmIG9yaWdpbmFscGF0dGVybi5lcXVhbHMoY3VycmVudGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoY3VycmVudGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3JpZ2luYWxwYXR0ZXJuLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoY3VycmVudGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXlmaWxlLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQoY3VycmVudGVsZW1lbnQpICYmICFjdXJyZW50ZWxlbWVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZERpcihjdXJyZW50ZWxlbWVudCwgbXlmaWxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudGVsZW1lbnQuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRlbGVtZW50LmNoYXJBdChjdXJyZW50ZWxlbWVudC5sZW5ndGgoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEZpbGUuc2VwYXJhdG9yQ2hhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ICs9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIobXlmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjdXJyZW50ZWxlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzQ2FzZVNlbnNpdGl2ZSAmJiBvcmlnaW5hbHBhdHRlcm4uZXF1YWxzKGN1cnJlbnRlbGVtZW50KSkgeworICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWRGaWxlKGN1cnJlbnRlbGVtZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nhc2VTZW5zaXRpdmUgJiYgb3JpZ2luYWxwYXR0ZXJuLmVxdWFsc0lnbm9yZUNhc2UoY3VycmVudGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoY3VycmVudGVsZW1lbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBzY2FucyBhIHBhcnRpY3VsYXIgZGlyZWN0b3J5LiBwb3B1bGF0ZXMgdGhlIHNjYW5uZWREaXJzIGNhY2hlLgogICAgICAgICAgKgpAQCAtNDkzLDcgKzUwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBsZXRlUGF0aCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCF2cGF0aC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCF2cGF0aC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVQYXRoID0gcm9vdFBhdGggKyByZW1vdGVGaWxlU2VwCiAgICAgICAgICAgICAgICAgICAgICAgICArIHZwYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCByZW1vdGVGaWxlU2VwLmNoYXJBdCgwKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTUzMywxMyArNTQzLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpICYmIGZpbGUuaXNTeW1ib2xpY0xpbmsoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0Z1bmN0aW9uaW5nQXNGaWxlKGZ0cCwgZGlyLCBmaWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIGl0J3MgZWl0aGVyIGEgc3ltYm9saWMgbGluayBvciBhIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBub3QgYSBkaXJlY3RvcnksIHNvIHdlIGluY2x1ZGUgaXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRmlsZShuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdha2VVcFRyYW5zZmVySW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FrZVVwVHJhbnNmZXJJbnRlcnZhbEV4cGlyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIndha2VVcFRyYW5zZmVySW50ZXJ2YWwgaXMgcmVhY2hlZCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdHJpZ2dlciBhIGRhdGEgY29ubmVjdGlvbiAiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhIG1pbmltYWxpc3QgY29tbWFuZCB0byB0cmlnZ2VyIGEgZGF0YSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmxpc3RGaWxlcyhmaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmdHAuY2hhbmdlVG9QYXJlbnREaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZUUENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24gZnRwY2NlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFcnJvciB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggRlRQICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2VydmVyOiAiLCBmdHBjY2UpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRXJyb3Igd2hpbGUgY29tbXVuaWNhdGluZyB3aXRoIEZUUCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInNlcnZlcjogIiwgZSk7CkBAIC01NTUsNyArNTc5LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZWxlY3RlZChuYW1lLCAoRmlsZSkgc2Nhbm5lZERpcnMuZ2V0KG5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZWxlY3RlZChuYW1lLCBzY2FubmVkRGlycy5nZXQobmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0luY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CkBAIC02MTcsMTQgKzY0MSwxNCBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBNYXAgZmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZUUEZpbGVbXT4gZmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBMaXN0IG9mIGFsbCBzY2FubmVkIGRpcmVjdG9yaWVzLgogICAgICAgICAgKgogICAgICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAgICAgKi8KIAotICAgICAgICBwcml2YXRlIE1hcCBzY2FubmVkRGlycyA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgRlRQRmlsZVByb3h5PiBzY2FubmVkRGlycyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICAvKioKICAgICAgICAgICogSGFzIHRoZSBkaXJlY3Rvcnkgd2l0aCB0aGUgZ2l2ZW4gcGF0aCByZWxhdGl2ZSB0byB0aGUgYmFzZQpAQCAtNjUyLDEyICs2NzYsMTAgQEAKICAgICAgICAgICogQHJldHVybiBhcnJheSBvZiBGVFBGaWxlCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgRlRQRmlsZVtdIGxpc3RGaWxlcyhTdHJpbmcgZGlyZWN0b3J5LCBib29sZWFuIGNoYW5nZWRpcikgewotICAgICAgICAgICAgLy9nZXRQcm9qZWN0KCkubG9nKCJsaXN0aW5nIGZpbGVzIGluIGRpcmVjdG9yeSAiICsgZGlyZWN0b3J5LCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICBTdHJpbmcgY3VycmVudFBhdGggPSBkaXJlY3Rvcnk7CiAgICAgICAgICAgICBpZiAoY2hhbmdlZGlyKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShkaXJlY3RvcnkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpcmVjdG9yeSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gZnRwLnByaW50V29ya2luZ0RpcmVjdG9yeSgpOwpAQCAtNjY3LDkgKzY4OSw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZmlsZUxpc3RNYXAuY29udGFpbnNLZXkoY3VycmVudFBhdGgpKSB7CiAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiZmlsZWxpc3QgbWFwIHVzZWQgaW4gbGlzdGluZyBmaWxlcyIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChGVFBGaWxlW10pIGZpbGVMaXN0TWFwLmdldChjdXJyZW50UGF0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTGlzdE1hcC5nZXQoY3VycmVudFBhdGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRlRQRmlsZVtdIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBGVFBGaWxlW10gcmVzdWx0OwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdHAubGlzdEZpbGVzKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKQEAgLTcwMCw2ICs3MjIsNyBAQAogICAgICAgICBwdWJsaWMgRlRQRmlsZVtdIGxpc3RGaWxlcyhTdHJpbmcgZGlyZWN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdEZpbGVzKGRpcmVjdG9yeSwgdHJ1ZSk7CiAgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW1vdGVTZW5zaXRpdml0eShGVFBGaWxlW10gYXJyYXksIFN0cmluZyBkaXJlY3RvcnkpIHsKICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzA4LDEyICs3MzEsMTMgQEAKICAgICAgICAgICAgIFN0cmluZyB0YXJnZXQgPSBudWxsOwogICAgICAgICAgICAgZm9yIChpbnQgaWNvdW50ZXIgPSAwOyBpY291bnRlciA8IGFycmF5Lmxlbmd0aDsgaWNvdW50ZXIrKykgewogICAgICAgICAgICAgICAgIGlmIChhcnJheVtpY291bnRlcl0gIT0gbnVsbCAmJiBhcnJheVtpY291bnRlcl0uaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5W2ljb3VudGVyXS5nZXROYW1lKCkuZXF1YWxzKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpLmVxdWFscygiLi4iKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoISIuIi5lcXVhbHMoYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEiLi4iLmVxdWFscyhhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZmlkZGxlTmFtZShhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coIndpbGwgdHJ5IHRvIGNkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXJnZXQgKyAiIHdoZXJlIGEgZGlyZWN0b3J5IGNhbGxlZCAiICsgYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRhcmdldCArICIgd2hlcmUgYSBkaXJlY3RvcnkgY2FsbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBleGlzdHMiLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBwY291bnRlciA9IDA7IHBjb3VudGVyIDwgYXJyYXkubGVuZ3RoOyBwY291bnRlcisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFycmF5W3Bjb3VudGVyXSAhPSBudWxsCkBAIC03NDgsNiArNzcyLDcgQEAKICAgICAgICAgICAgICAgICByZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmlkZGxlTmFtZShTdHJpbmcgb3JpZ2luKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICBmb3IgKGNoYXIgY2ggOiBvcmlnaW4udG9DaGFyQXJyYXkoKSkgewpAQCAtNzYxLDYgKzc4Niw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogYW4gQW50RlRQRmlsZSBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVtb3RlIGZpbGUKICAgICAgICAgICogQHNpbmNlIEFudCAxLjYKQEAgLTgwNCw0NCArODMwLDQ1IEBACiAgICAgICAgICAgICBwdWJsaWMgQW50RlRQRmlsZShBbnRGVFBGaWxlIHBhcmVudCwgU3RyaW5nIHBhdGgpIHsKICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudCA9IHBhcmVudC5jbGllbnQ7Ci0gICAgICAgICAgICAgICAgVmVjdG9yPFN0cmluZz4gcGF0aEVsZW1lbnRzID0gU2VsZWN0b3JVdGlscy50b2tlbml6ZVBhdGgocGF0aCk7CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhdGhFbGVtZW50cyA9IFNlbGVjdG9yVXRpbHMudG9rZW5pemVQYXRoKHBhdGgpOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdGhpcy5jbGllbnQuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICAvL3RoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGV4Y2VwdCBpZiBwYXJlbnQgaGFzIGJlZW4gZGVsZXRlZCBieSBhbm90aGVyIHByb2Nlc3MKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNsaWVudC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyZW50LmN1cnB3ZCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICVzIiwgcGFyZW50LmN1cnB3ZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRQYXRoRWxlbWVudCA6IHBhdGhFbGVtZW50cykgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0aGlzLmNsaWVudC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGN1cnJlbnRQYXRoRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCAmJiAhaXNDYXNlU2Vuc2l0aXZlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSB8fCAhcmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCA9IGZpbmRQYXRoRWxlbWVudENhc2VVbnNlbnNpdGl2ZSh0aGlzLmN1cnB3ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGhFbGVtZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBhdGhFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGN1cnJlbnRQYXRoRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ2FzZVNlbnNpdGl2ZSgpICYmIChyZW1vdGVTeXN0ZW1DYXNlU2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFyZW1vdGVTZW5zaXRpdml0eUNoZWNrZWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kUGF0aEVsZW1lbnRDYXNlVW5zZW5zaXRpdmUodGhpcy5jdXJwd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGhFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoRWxlbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IGdldEN1cnB3ZFBsdXNGaWxlU2VwKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRQYXRoRWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycHdkID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDdXJwd2RQbHVzRmlsZVNlcCgpICsgY3VycmVudFBhdGhFbGVtZW50OwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNoYW5nZSB3b3JraW5nIGRpciB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UGF0aEVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZnJvbSAiICsgdGhpcy5jdXJwd2QpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICVzIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCwgY3VycHdkKTsKICAgICAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBsYXN0cGF0aGVsZW1lbnQgPSBwYXRoRWxlbWVudHMuZWxlbWVudEF0KHBhdGhFbGVtZW50cy5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgICBGVFBGaWxlIFtdIHRoZUZpbGVzID0gbGlzdEZpbGVzKHRoaXMuY3VycHdkKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdHBhdGhlbGVtZW50ID0gcGF0aEVsZW1lbnRzLmdldChwYXRoRWxlbWVudHMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgRlRQRmlsZVtdIHRoZUZpbGVzID0gbGlzdEZpbGVzKHRoaXMuY3VycHdkKTsKICAgICAgICAgICAgICAgICB0aGlzLmZ0cEZpbGUgPSBnZXRGaWxlKHRoZUZpbGVzLCBsYXN0cGF0aGVsZW1lbnQpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIGZpbmQgYSBmaWxlIGluIGEgZGlyZWN0b3J5IGluIGNhc2UgaW5zZW5zaXRpdmUgd2F5CiAgICAgICAgICAgICAgKiBAcGFyYW0gcGFyZW50UGF0aCAgICAgICAgd2hlcmUgd2UgYXJlCkBAIC04NTcsMTIgKzg4NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChGVFBGaWxlIGZpbGUgOiBmaWxlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uoc291Z2h0UGF0aEVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uoc291Z2h0UGF0aEVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgaWYgdGhlIGZpbGUgZXhpc3RzCiAgICAgICAgICAgICAgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBmaWxlIGV4aXN0cwpAQCAtODcwLDYgKzg5OSw3IEBACiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIChmdHBGaWxlICE9IG51bGwpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIGlmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZmluZCBvdXQgdG8gd2hhdCBpdCBpcyBwb2ludGluZwogICAgICAgICAgICAgICogQHJldHVybiB0aGUgdGFyZ2V0IG9mIHRoZSBzeW1ib2xpYyBsaW5rCkBAIC04NzcsNiArOTA3LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5nZXRMaW5rKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZ2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlCiAgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlCkBAIC04ODQsNiArOTE1LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5nZXROYW1lKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUKICAgICAgICAgICAgICAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBhcyBzdHJpbmcKQEAgLTg5MSw2ICs5MjMsNyBAQAogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEN1cnB3ZFBsdXNGaWxlU2VwKCkgKyBmdHBGaWxlLmdldE5hbWUoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIG91dCB0aGUgcmVsYXRpdmUgcGF0aCBhc3N1bWluZyB0aGF0IHRoZSBwYXRoIHVzZWQgdG8gY29uc3RydWN0CiAgICAgICAgICAgICAgKiB0aGlzIEFudEZUUEZpbGUgd2FzIHNwZWxsZWQgcHJvcGVybHkgd2l0aCByZWdhcmRzIHRvIGNhc2UuCkBAIC05MDQsNiArOTM3LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3RQYXRoIG9mIHRoZSBlbmNsb3Npbmcgc2Nhbm5lci4KICAgICAgICAgICAgICAqIHRoaXMgcmVsYXRpdmUgcGF0aCBpcyBzcGVsbGVkIGV4YWN0bHkgbGlrZSBvbiBkaXNrLApAQCAtOTMwLDYgKzk2NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoaXMgZmlsZQogICAgICAgICAgICAgICogQHBhcmFtIGN1cnJlbnRQYXRoICAgICAgICAgIGJhc2UgcGF0aApAQCAtOTM3LDM1ICs5NzIsMzYgQEAKICAgICAgICAgICAgICAqIEByZXR1cm4gcmVsYXRpdmUgcGF0aAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmcgY3VycmVudFJlbGF0aXZlUGF0aCkgewotICAgICAgICAgICAgICAgIFZlY3RvciBwYXRoRWxlbWVudHMgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChnZXRBYnNvbHV0ZVBhdGgoKSwgcmVtb3RlRmlsZVNlcCk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHBhdGhFbGVtZW50czIgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChjdXJyZW50UGF0aCwgcmVtb3RlRmlsZVNlcCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHJlbFBhdGggPSBjdXJyZW50UmVsYXRpdmVQYXRoOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gcGF0aEVsZW1lbnRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwY291bnQgPSBwYXRoRWxlbWVudHMyLnNpemUoKTsgcGNvdW50IDwgc2l6ZTsgcGNvdW50KyspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRFbGVtZW50ID0gKFN0cmluZykgcGF0aEVsZW1lbnRzLmVsZW1lbnRBdChwY291bnQpOworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXRoRWxlbWVudHMgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChnZXRBYnNvbHV0ZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZUZpbGVTZXApOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVsUGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKGN1cnJlbnRSZWxhdGl2ZVBhdGggPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgPyAiIiA6IGN1cnJlbnRSZWxhdGl2ZVBhdGgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRFbGVtZW50IDogcGF0aEVsZW1lbnRzLnN1Ykxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yVXRpbHMudG9rZW5pemVQYXRoKGN1cnJlbnRQYXRoLCByZW1vdGVGaWxlU2VwKS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhFbGVtZW50cy5zaXplKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIEZUUEZpbGVbXSB0aGVGaWxlcyA9IGxpc3RGaWxlcyhjdXJyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgIEZUUEZpbGUgdGhlRmlsZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aGVGaWxlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVGaWxlID0gZ2V0RmlsZSh0aGVGaWxlcywgY3VycmVudEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVsUGF0aC5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxQYXRoID0gcmVsUGF0aCArIHJlbW90ZUZpbGVTZXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVsUGF0aC5hcHBlbmQocmVtb3RlRmlsZVNlcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGl0IGEgaGlkZGVuIGZpbGUgYXNzdW1lIG5vdCBhIHN5bWxpbmsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGggPSByZWxQYXRoICsgY3VycmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoICsgcmVtb3RlRmlsZVNlcCArIGN1cnJlbnRFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJIaWRkZW4gZmlsZSAiICsgcmVsUGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhc3N1bWVkIHRvIG5vdCBiZSBhIHN5bWxpbmsuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGguYXBwZW5kKGN1cnJlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoICs9IHJlbW90ZUZpbGVTZXAgKyBjdXJyZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiSGlkZGVuIGZpbGUgIiArIHJlbFBhdGggKyAiIGFzc3VtZWQgdG8gbm90IGJlIGEgc3ltbGluay4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2VzU3ltbGlua3MgPSB0cmF2ZXJzZXNTeW1saW5rcyB8fCB0aGVGaWxlLmlzU3ltYm9saWNMaW5rKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWxQYXRoID0gcmVsUGF0aCArIHRoZUZpbGUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBjdXJyZW50UGF0aCArIHJlbW90ZUZpbGVTZXAgKyB0aGVGaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGguYXBwZW5kKHRoZUZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoICs9IHJlbW90ZUZpbGVTZXAgKyB0aGVGaWxlLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVsUGF0aDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVsUGF0aC50b1N0cmluZygpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIGZpbmQgYSBmaWxlIG1hdGNoaW5nIGEgc3RyaW5nIGluIGFuIGFycmF5IG9mIEZUUEZpbGUuCiAgICAgICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgImFscGhhIiB3aGVuIHJlcXVlc3RlZCBmb3IgIkFMUEhBIgpAQCAtOTc5LDE5ICsxMDE1LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGZjb3VudCA9IDA7IGZjb3VudCA8IHRoZUZpbGVzLmxlbmd0aDsgZmNvdW50KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0uZ2V0TmFtZSgpLmVxdWFscyhsYXN0cGF0aGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZUZpbGVzW2Zjb3VudF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGVGaWxlc1tmY291bnRdLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RwYXRoZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlRmlsZXNbZmNvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBQcmVkaWNhdGU8U3RyaW5nPiB0ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlKCkgPyBsYXN0cGF0aGVsZW1lbnQ6OmVxdWFscworICAgICAgICAgICAgICAgICAgICAgICAgOiBsYXN0cGF0aGVsZW1lbnQ6OmVxdWFsc0lnbm9yZUNhc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmVhbS5vZih0aGVGaWxlcykKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGYgLT4gdGVzdC50ZXN0KGYuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiB0ZWxsIGlmIGEgZmlsZSBpcyBhIGRpcmVjdG9yeS4KICAgICAgICAgICAgICAqIG5vdGUgdGhhdCBpdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igc3ltYm9saWMgbGlua3MgcG9pbnRpbmcgdG8gZGlyZWN0b3JpZXMuCkBAIC0xMDAwLDYgKzEwMzIsNyBAQAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ0cEZpbGUuaXNEaXJlY3RvcnkoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiB0ZWxsIGlmIGEgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmsKICAgICAgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHN5bWJvbGljIGxpbmtzCkBAIC0xMDA3LDYgKzEwNDAsNyBAQAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTeW1ib2xpY0xpbmsoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ0cEZpbGUuaXNTeW1ib2xpY0xpbmsoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiByZXR1cm4gdGhlIGF0dGFjaGVkIEZUUCBjbGllbnQgb2JqZWN0LgogICAgICAgICAgICAgICogV2FybmluZyA6IHRoaXMgaW5zdGFuY2UgaXMgcmVhbGx5IHNoYXJlZCB3aXRoIHRoZSBlbmNsb3NpbmcgY2xhc3MuCkBAIC0xMDIzLDYgKzEwNTcsNyBAQAogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycHdkKFN0cmluZyBjdXJwd2QpIHsKICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IGN1cnB3ZDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiByZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgQW50RlRQRmlsZS4KICAgICAgICAgICAgICAqIG9mIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgaXRzZWxmIGluIGNhc2Ugb2YgQW50RlRQUm9vdEZpbGUKQEAgLTEwMzEsNiArMTA2Niw3IEBACiAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnB3ZCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gY3VycHdkOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIHJldHVybnMgdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBBbnRGVFBGaWxlLgogICAgICAgICAgICAgICogb2YgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgZmlsZSBpdHNlbGYgaW4gY2FzZSBvZiBBbnRGVFBSb290RmlsZQpAQCAtMTA0Miw2ICsxMDc4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gY3VycHdkLmVuZHNXaXRoKHJlbW90ZUZpbGVTZXApID8gY3VycHdkCiAgICAgICAgICAgICAgICAgICAgIDogY3VycHdkICsgcmVtb3RlRmlsZVNlcDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIG91dCBpZiBhIHN5bWJvbGljIGxpbmsgaXMgZW5jb3VudGVyZWQgaW4gdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhpcyBmaWxlCiAgICAgICAgICAgICAgKiBmcm9tIHJvb3RQYXRoLgpAQCAtMTA2MiwxNiArMTA5OSwxOSBAQAogICAgICAgICAgICAgICogR2V0IGEgc3RyaW5nIHJlcCBvZiB0aGlzIG9iamVjdC4KICAgICAgICAgICAgICAqIEByZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcHdkIGFuZCB0aGUgZmlsZS4KICAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICAgICAgIHJldHVybiAiQW50RnRwRmlsZTogIiArIGN1cnB3ZCArICIlIiArIGZ0cEZpbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogc3BlY2lhbCBjbGFzcyB0byByZXByZXNlbnQgdGhlIHJlbW90ZSBkaXJlY3RvcnkgaXRzZWxmCiAgICAgICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgY2xhc3MgQW50RlRQUm9vdEZpbGUgZXh0ZW5kcyBBbnRGVFBGaWxlIHsKICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZWRpcjsKKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICogQHBhcmFtIGFjbGllbnQgRlRQIGNsaWVudApAQCAtMTA4NywyNCArMTEyNywyOSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCB0aGUgYWJzb2x1dGUgcGF0aAogICAgICAgICAgICAgICogQHJldHVybiBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycHdkKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gcm9vdAogICAgICAgICAgICAgICogQHJldHVybiBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gYWN0dWFsbHkgbmV2ZXIKICAgICAgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGFjdHVhbGx5IG5ldmVyCiAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKICAgICAvKioKICAgICAgKiBjaGVjayBGVFBGaWxlcyB0byBjaGVjayB3aGV0aGVyIHRoZXkgZnVuY3Rpb24gYXMgZGlyZWN0b3JpZXMgdG9vCiAgICAgICogdGhlIEZUUEZpbGUgQVBJIHNlZW0gdG8gbWFrZSBkaXJlY3RvcnkgYW5kIHN5bWJvbGljIGxpbmtzIGluY29tcGF0aWJsZQpAQCAtMTExNCwyNCArMTE1OSwzNiBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBjZCB0byB0aGlzIGRpcmVjdG9yeQogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRnVuY3Rpb25pbmdBc0RpcmVjdG9yeShGVFBDbGllbnQgZnRwLCBTdHJpbmcgZGlyLCBGVFBGaWxlIGZpbGUpIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIGN1cnJlbnRXb3JraW5nRGlyID0gbnVsbDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNGdW5jdGlvbmluZ0FzRGlyZWN0b3J5KEZUUENsaWVudCBmdHAsIFN0cmluZyBkaXIsIEZUUEZpbGUgZmlsZSkKKyAgICAgICAgICAgIHRocm93cyBGVFBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0ZpbGUoKSkgeworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGN1cnJlbnRXb3JraW5nRGlyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGN1cnJlbnRXb3JraW5nRGlyID0gZnRwLnByaW50V29ya2luZ0RpcmVjdG9yeSgpOworICAgICAgICB9IGNhdGNoIChGVFBDb25uZWN0aW9uQ2xvc2VkRXhjZXB0aW9uIGZ0cGNjZSkgeworICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiY291bGQgbm90IGZpbmQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAiICsgZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsgYmVjYXVzZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICB0aHJvdyhmdHBjY2UpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImNvdWxkIG5vdCBmaW5kIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgIiArIGRpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2hpbGUgY2hlY2tpbmcgYSBzeW1saW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgIGlmIChjdXJyZW50V29ya2luZ0RpciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGZpbGUuZ2V0TGluaygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZUUENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24gZnRwY2NlKSB7CisgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygiY291bGQgbm90IGZpbmQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAiICsgZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsgYmVjYXVzZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICAgICAgdGhyb3coZnRwY2NlKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5sb2coImNvdWxkIG5vdCBjZCB0byAiICsgZmlsZS5nZXRMaW5rKCkgKyAiIHdoaWxlIGNoZWNraW5nIGEgc3ltbGluayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CkBAIC0xMTQ1LDE0ICsxMjAyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbWViYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjZCBiYWNrIHRvICIgKyBkaXIgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWxlIGNoZWNraW5nIGEgc3ltbGluayIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2QgYmFjayB0byAlcyB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKICAgICAvKioKICAgICAgKiBjaGVjayBGVFBGaWxlcyB0byBjaGVjayB3aGV0aGVyIHRoZXkgZnVuY3Rpb24gYXMgZGlyZWN0b3JpZXMgdG9vCiAgICAgICogdGhlIEZUUEZpbGUgQVBJIHNlZW0gdG8gbWFrZSBkaXJlY3RvcnkgYW5kIHN5bWJvbGljIGxpbmtzIGluY29tcGF0aWJsZQpAQCAtMTE2MiwxNCArMTIyMSwxMSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBjZCB0byB0aGlzIGRpcmVjdG9yeQogICAgICAqIEBzaW5jZSBhbnQgMS42CiAgICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzRnVuY3Rpb25pbmdBc0ZpbGUoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpciwgRlRQRmlsZSBmaWxlKSB7Ci0gICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIWlzRnVuY3Rpb25pbmdBc0RpcmVjdG9yeShmdHAsIGRpciwgZmlsZSk7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzRnVuY3Rpb25pbmdBc0ZpbGUoRlRQQ2xpZW50IGZ0cCwgU3RyaW5nIGRpciwgRlRQRmlsZSBmaWxlKQorICAgICAgICAgICAgdGhyb3dzIEZUUENvbm5lY3Rpb25DbG9zZWRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gIWZpbGUuaXNEaXJlY3RvcnkoKSAmJiAoZmlsZS5pc0ZpbGUoKSB8fCAhaXNGdW5jdGlvbmluZ0FzRGlyZWN0b3J5KGZ0cCwgZGlyLCBmaWxlKSk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgcmVtb3RlIGRpcmVjdG9yeSB3aGVyZSBmaWxlcyB3aWxsIGJlIHBsYWNlZC4gVGhpcyBtYXkgYmUgYQogICAgICAqIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGgsIGFuZCBtdXN0IGJlIGluIHRoZSBwYXRoIHN5bnRheCBleHBlY3RlZCBieQpAQCAtMTE4MSw3ICsxMjM3LDYgQEAKICAgICAgICAgdGhpcy5yZW1vdGVkaXIgPSBkaXI7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBGVFAgc2VydmVyIHRvIHNlbmQgZmlsZXMgdG8uCiAgICAgICoKQEAgLTEyNjYsNyArMTMyMSw3IEBACiAKIAogICAgIC8qKgotICAgICAqIEEgc3lub255bSBmb3IgPHR0PmRlcGVuZHM8L3R0Pi4gU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBuZXcKKyAgICAgKiBBIHN5bm9ueW0gZm9yIDxjb2RlPmRlcGVuZHM8L2NvZGU+LiBTZXQgdG8gdHJ1ZSB0byB0cmFuc21pdCBvbmx5IG5ldwogICAgICAqIG9yIGNoYW5nZWQgZmlsZXMuCiAgICAgICoKICAgICAgKiBTZWUgdGhlIHJlbGF0ZWQgYXR0cmlidXRlcyB0aW1lZGlmZm1pbGxpcyBhbmQgdGltZWRpZmZhdXRvLgpAQCAtMTM4OCwxMCArMTQ0MywxMCBAQAogICAgICAqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgYWN0aW9uIGlzIG5vdCBhIHZhbGlkIGFjdGlvbi4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbihTdHJpbmcgYWN0aW9uKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBsb2coIkRFUFJFQ0FURUQgLSBUaGUgc2V0QWN0aW9uKFN0cmluZykgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIgotICAgICAgICAgICAgKyAiIFVzZSBzZXRBY3Rpb24oRlRQLkFjdGlvbikgaW5zdGVhZC4iKTsKLQorICAgICAgICAgICAgICAgICsgIiBVc2Ugc2V0QWN0aW9uKEZUUC5BY3Rpb24pIGluc3RlYWQuIik7CiAgICAgICAgIEFjdGlvbiBhID0gbmV3IEFjdGlvbigpOwogCiAgICAgICAgIGEuc2V0VmFsdWUoYWN0aW9uKTsKQEAgLTE0NTksNyArMTUxNCw3IEBACiAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1UeXBlS2V5KEZUUFN5c3RlbVR5cGUgc3lzdGVtS2V5KSB7Ci0gICAgICAgIGlmIChzeXN0ZW1LZXkgIT0gbnVsbCAmJiAhc3lzdGVtS2V5LmdldFZhbHVlKCkuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoc3lzdGVtS2V5ICE9IG51bGwgJiYgIXN5c3RlbUtleS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhpcy5zeXN0ZW1UeXBlS2V5ID0gc3lzdGVtS2V5OwogICAgICAgICAgICAgY29uZmlndXJhdGlvbkhhc0JlZW5TZXQoKTsKICAgICAgICAgfQpAQCAtMTQ3Miw3ICsxNTI3LDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREYXRlRm9ybWF0Q29uZmlnKFN0cmluZyBkZWZhdWx0RGF0ZUZvcm1hdCkgewotICAgICAgICBpZiAoZGVmYXVsdERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhZGVmYXVsdERhdGVGb3JtYXQuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoZGVmYXVsdERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhZGVmYXVsdERhdGVGb3JtYXQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLmRlZmF1bHREYXRlRm9ybWF0Q29uZmlnID0gZGVmYXVsdERhdGVGb3JtYXQ7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC0xNDg1LDcgKzE1NDAsNyBAQAogICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVjZW50RGF0ZUZvcm1hdENvbmZpZyhTdHJpbmcgcmVjZW50RGF0ZUZvcm1hdCkgewotICAgICAgICBpZiAocmVjZW50RGF0ZUZvcm1hdCAhPSBudWxsICYmICFyZWNlbnREYXRlRm9ybWF0LmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHJlY2VudERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhcmVjZW50RGF0ZUZvcm1hdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRoaXMucmVjZW50RGF0ZUZvcm1hdENvbmZpZyA9IHJlY2VudERhdGVGb3JtYXQ7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC0xNDk4LDcgKzE1NTMsNyBAQAogICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQQ2xpZW50Q29uZmlnCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0U2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnKExhbmd1YWdlQ29kZSBzZXJ2ZXJMYW5ndWFnZUNvZGUpIHsKLSAgICAgICAgaWYgKHNlcnZlckxhbmd1YWdlQ29kZSAhPSBudWxsICYmICEiIi5lcXVhbHMoc2VydmVyTGFuZ3VhZ2VDb2RlLmdldFZhbHVlKCkpKSB7CisgICAgICAgIGlmIChzZXJ2ZXJMYW5ndWFnZUNvZGUgIT0gbnVsbCAmJiAhc2VydmVyTGFuZ3VhZ2VDb2RlLmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZyA9IHNlcnZlckxhbmd1YWdlQ29kZTsKICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CiAgICAgICAgIH0KQEAgLTE1MTEsNyArMTU2Niw3IEBACiAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUaW1lWm9uZUNvbmZpZyhTdHJpbmcgc2VydmVyVGltZVpvbmVJZCkgewotICAgICAgICBpZiAoc2VydmVyVGltZVpvbmVJZCAhPSBudWxsICYmICFzZXJ2ZXJUaW1lWm9uZUlkLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHNlcnZlclRpbWVab25lSWQgIT0gbnVsbCAmJiAhc2VydmVyVGltZVpvbmVJZC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRoaXMuc2VydmVyVGltZVpvbmVDb25maWcgPSBzZXJ2ZXJUaW1lWm9uZUlkOwogICAgICAgICAgICAgY29uZmlndXJhdGlvbkhhc0JlZW5TZXQoKTsKICAgICAgICAgfQpAQCAtMTUyNSw3ICsxNTgwLDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNob3J0TW9udGhOYW1lc0NvbmZpZyhTdHJpbmcgc2hvcnRNb250aE5hbWVzKSB7Ci0gICAgICAgIGlmIChzaG9ydE1vbnRoTmFtZXMgIT0gbnVsbCAmJiAhc2hvcnRNb250aE5hbWVzLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHNob3J0TW9udGhOYW1lcyAhPSBudWxsICYmICFzaG9ydE1vbnRoTmFtZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnNob3J0TW9udGhOYW1lc0NvbmZpZyA9IHNob3J0TW9udGhOYW1lczsKICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CiAgICAgICAgIH0KQEAgLTE1NDksNzIgKzE2MDQsODQgQEAKICAgICAgICAgICAgICAgICBpbnQgcmV0cmllcyA9IEludGVnZXIucGFyc2VJbnQocmV0cmllc0FsbG93ZWQpOwogICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzIDwgUmV0cnlhYmxlLlJFVFJZX0ZPUkVWRVIpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIHJldHJpZXNBbGxvd2VkIGF0dHJpYnV0ZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXRyaWVzQWxsb3dlZCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciByZXRyaWVzQWxsb3dlZCBhdHRyaWJ1dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXNBbGxvd2VkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy5yZXRyaWVzQWxsb3dlZCA9IHJldHJpZXM7CiAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gcHgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciByZXRyaWVzQWxsb3dlZCBhdHRyaWJ1dGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXRyaWVzQWxsb3dlZCk7Ci0KKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIHJldHJpZXNBbGxvd2VkIGF0dHJpYnV0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICByZXRyaWVzQWxsb3dlZCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQogICAgIH0KKwogICAgIC8qKgogICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3lzdGVtVHlwZUtleS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbVR5cGVLZXkoKSB7CiAgICAgICAgIHJldHVybiBzeXN0ZW1UeXBlS2V5LmdldFZhbHVlKCk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREYXRlRm9ybWF0Q29uZmlnKCkgewogICAgICAgICByZXR1cm4gZGVmYXVsdERhdGVGb3JtYXRDb25maWc7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNlbnREYXRlRm9ybWF0Q29uZmlnLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVjZW50RGF0ZUZvcm1hdENvbmZpZygpIHsKICAgICAgICAgcmV0dXJuIHJlY2VudERhdGVGb3JtYXRDb25maWc7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcuZ2V0VmFsdWUoKTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclRpbWVab25lQ29uZmlnLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVGltZVpvbmVDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBzZXJ2ZXJUaW1lWm9uZUNvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0TW9udGhOYW1lc0NvbmZpZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TW9udGhOYW1lc0NvbmZpZygpIHsKICAgICAgICAgcmV0dXJuIHNob3J0TW9udGhOYW1lc0NvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVzdGFtcEdyYW51bGFyaXR5LgogICAgICAqLwogICAgIEdyYW51bGFyaXR5IGdldFRpbWVzdGFtcEdyYW51bGFyaXR5KCkgewogICAgICAgICByZXR1cm4gdGltZXN0YW1wR3JhbnVsYXJpdHk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wR3JhbnVsYXJpdHkgYXR0cmlidXRlCiAgICAgICogQHBhcmFtIHRpbWVzdGFtcEdyYW51bGFyaXR5IFRoZSB0aW1lc3RhbXBHcmFudWxhcml0eSB0byBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0VGltZXN0YW1wR3JhbnVsYXJpdHkoR3JhbnVsYXJpdHkgdGltZXN0YW1wR3JhbnVsYXJpdHkpIHsKLSAgICAgICAgaWYgKG51bGwgPT0gdGltZXN0YW1wR3JhbnVsYXJpdHkgfHwgIiIuZXF1YWxzKHRpbWVzdGFtcEdyYW51bGFyaXR5LmdldFZhbHVlKCkpKSB7CisgICAgICAgIGlmIChudWxsID09IHRpbWVzdGFtcEdyYW51bGFyaXR5IHx8IHRpbWVzdGFtcEdyYW51bGFyaXR5LmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdGhpcy50aW1lc3RhbXBHcmFudWxhcml0eSA9IHRpbWVzdGFtcEdyYW51bGFyaXR5OwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHNpdGVDb21tYW5kIGF0dHJpYnV0ZS4gIFRoaXMgYXR0cmlidXRlCiAgICAgICogbmFtZXMgdGhlIGNvbW1hbmQgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGlmIHRoZSBhY3Rpb24KQEAgLTE2MjQsNiArMTY5MSw3IEBACiAgICAgcHVibGljIHZvaWQgc2V0U2l0ZUNvbW1hbmQoU3RyaW5nIHNpdGVDb21tYW5kKSB7CiAgICAgICAgIHRoaXMuc2l0ZUNvbW1hbmQgPSBzaXRlQ29tbWFuZDsKICAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBpbml0aWFsU2l0ZUNvbW1hbmQgYXR0cmlidXRlLiAgVGhpcyBhdHRyaWJ1dGUKICAgICAgKiBuYW1lcyBhIHNpdGUgY29tbWFuZCB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgaW1tZWRpYXRlbHkKQEAgLTE2NDYsNiArMTcxNCwzNSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWVvdXQgb24gdGhlIGRhdGEgY29ubmVjdGlvbiBpbiBtaWxsaXNlY29uZHMuCisgICAgICogQW55IG5lZ2F0aXZlIHZhbHVlIGlzIGRpc2NhcmRlZCBhbmQgbGVhdmVzIHRoZSBkZWZhdWx0CisgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIGFuIGluZmluaXRlIHRpbWVvdXQKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhVGltZW91dCBpbnQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERhdGFUaW1lb3V0KGludCBkYXRhVGltZW91dCkgeworICAgICAgICBpZiAoZGF0YVRpbWVvdXQgPj0gMCkgeworICAgICAgICAgICAgdGhpcy5kYXRhVGltZW91dCA9IGRhdGFUaW1lb3V0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZSBpbnRlcnZhbCB3aGVuIHdlIHNob3VsZCBhdXRvbWF0aWNhbGx5CisgICAgICogY2FsbCBhIGNvbW1hbmQgdHJpZ2dlcmluZyBhIHRyYW5zZmVyCisgICAgICogVGhlIHBhcmFtZXRlciBpcyBpbiBzZWNvbmRzCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FrZVVwVHJhbnNmZXJJbnRlcnZhbCBpbnQKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdha2VVcFRyYW5zZmVySW50ZXJ2YWwoaW50IHdha2VVcFRyYW5zZmVySW50ZXJ2YWwpIHsKKyAgICAgICAgaWYgKHdha2VVcFRyYW5zZmVySW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICB0aGlzLndha2VVcFRyYW5zZmVySW50ZXJ2YWwgPSB3YWtlVXBUcmFuc2ZlckludGVydmFsOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKICAgICAgKiBDaGVja3MgdG8gc2VlIHRoYXQgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlIHNldC4KICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkLgpAQCAtMTY2MSwzMyArMTc1OCwzMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXNzd29yZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGFjdGlvbiA9PSBMSVNUX0ZJTEVTKSAmJiAobGlzdGluZyA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJsaXN0aW5nIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgbGlzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWN0aW9uISIpOworICAgICAgICBpZiAoYWN0aW9uID09IExJU1RfRklMRVMgJiYgbGlzdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImxpc3RpbmcgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBsaXN0IGFjdGlvbiEiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhY3Rpb24gPT0gTUtfRElSICYmIHJlbW90ZWRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlbW90ZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJta2RpciBhY3Rpb24hIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInJlbW90ZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIG1rZGlyIGFjdGlvbiEiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhY3Rpb24gPT0gQ0hNT0QgJiYgY2htb2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjaG1vZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIGNobW9kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhY3Rpb24hIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImNobW9kIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgY2htb2QgYWN0aW9uISIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhY3Rpb24gPT0gU0lURV9DTUQgJiYgc2l0ZUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzaXRlY29tbWFuZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNpdGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFjdGlvbiEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic2l0ZWNvbW1hbmQgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBzaXRlIGFjdGlvbiEiKTsKICAgICAgICAgfQogCi0KICAgICAgICAgaWYgKHRoaXMuaXNDb25maWd1cmF0aW9uU2V0KSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZyIpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbW9ucy1uZXQuamFyID49IDEuNC4wIGlzIHJlcXVpcmVkIGZvciBhdCBsZWFzdCBvbmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvZiB0aGUgYXR0cmlidXRlcyBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICAgICAgICAgICJjb21tb25zLW5ldC5qYXIgPj0gMS40LjAgaXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlcy4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE3MzAsNyArMTgyNSw3IEBACiAgICAgICAgICAgICBkcy5zY2FuKCk7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmdbXSBkc2ZpbGVzID0gbnVsbDsKKyAgICAgICAgU3RyaW5nW10gZHNmaWxlczsKICAgICAgICAgaWYgKGFjdGlvbiA9PSBSTV9ESVIpIHsKICAgICAgICAgICAgIGRzZmlsZXMgPSBkcy5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xNzM4LDE0ICsxODMzLDEzIEBACiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGRpciA9IG51bGw7CiAKLSAgICAgICAgaWYgKChkcy5nZXRCYXNlZGlyKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICYmICgoYWN0aW9uID09IFNFTkRfRklMRVMpIHx8IChhY3Rpb24gPT0gR0VUX0ZJTEVTKSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIGRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNlbmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFuZCBnZXQgYWN0aW9ucyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChhY3Rpb24gPT0gU0VORF9GSUxFUykgfHwgKGFjdGlvbiA9PSBHRVRfRklMRVMpKSB7Ci0gICAgICAgICAgICAgICAgZGlyID0gZHMuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoZHMuZ2V0QmFzZWRpcigpID09IG51bGwKKyAgICAgICAgICAgICYmIChhY3Rpb24gPT0gU0VORF9GSUxFUyB8fCBhY3Rpb24gPT0gR0VUX0ZJTEVTKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ0aGUgZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3Igc2VuZCBhbmQgZ2V0IGFjdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWN0aW9uID09IFNFTkRfRklMRVMgfHwgYWN0aW9uID09IEdFVF9GSUxFUykgeworICAgICAgICAgICAgZGlyID0gZHMuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgd2UgYXJlIGRvaW5nIGEgbGlzdGluZywgd2UgbmVlZCB0aGUgb3V0cHV0IHN0cmVhbSBjcmVhdGVkIG5vdy4KQEAgLTE3NjYsMTEgKzE4NjAsNyBAQAogICAgICAgICAgICAgICAgIC8vIHRoZSB0cnVuayBkb2VzIG5vdCBsZXQgaXRzZWxmIGJlIHJlbW92ZWQgYmVmb3JlIHRoZSBsZWF2ZXMKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZHNmaWxlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZHNmaWxlID0gZHNmaWxlc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybURpcihmdHAsIGRzZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCAoKSAtPiBybURpcihmdHAsIGRzZmlsZSksIGRzZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmaW5hbCBCdWZmZXJlZFdyaXRlciBmYncgPSBidzsKQEAgLTE3ODAsMjkgKzE4NzAsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wR3JhbnVsYXJpdHkuZ2V0TWlsbGlzZWNvbmRzKGFjdGlvbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGRzZmlsZSA6IGRzZmlsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRU5EX0ZJTEVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEZpbGUoZnRwLCBmZGlyLCBkc2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgR0VUX0ZJTEVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmdHAsIGZkaXIsIGRzZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBERUxfRklMRVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxGaWxlKGZ0cCwgZHNmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIExJU1RfRklMRVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RmlsZShmdHAsIGZidywgZHNmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENITU9EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChmdHAsICJjaG1vZCAiICsgY2htb2QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyByZXNvbHZlRmlsZShkc2ZpbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidW5rbm93biBmdHAgYWN0aW9uICIgKyBhY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VORF9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEZpbGUoZnRwLCBmZGlyLCBkc2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEdFVF9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmdHAsIGZkaXIsIGRzZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgREVMX0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxGaWxlKGZ0cCwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMSVNUX0ZJTEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RmlsZShmdHAsIGZidywgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDSE1PRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChmdHAsICJjaG1vZCAiICsgY2htb2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIHJlc29sdmVGaWxlKGRzZmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVua25vd24gZnRwIGFjdGlvbiAiICsgYWN0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSwgZHNmaWxlKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xODE0LDcgKzE5MDIsNiBAQAogICAgICAgICByZXR1cm4gZHNmaWxlcy5sZW5ndGg7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZW5kcyBhbGwgZmlsZXMgc3BlY2lmaWVkIGJ5IHRoZSBjb25maWd1cmVkIGZpbGVzZXRzIHRvIHRoZSByZW1vdGUKICAgICAgKiBzZXJ2ZXIuCkBAIC0xODI5LDE3ICsxOTE2LDEyIEBACiAgICAgICAgIHRyYW5zZmVycmVkID0gMDsKICAgICAgICAgc2tpcHBlZCA9IDA7CiAKLSAgICAgICAgaWYgKGZpbGVzZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmIChmaWxlc2V0cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYXQgbGVhc3Qgb25lIGZpbGVzZXQgbXVzdCBiZSBzcGVjaWZpZWQuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBnZXQgZmlsZXMgZnJvbSBmaWxlc2V0cwotICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBmaWxlc2V0cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGVTZXQgZnMgPSAoRmlsZVNldCkgZmlsZXNldHMuZWxlbWVudEF0KGkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlcyhmdHAsIGZzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogZmlsZXNldHMpIHsKKyAgICAgICAgICAgIGlmIChmcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlcyhmdHAsIGZzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODUxLDcgKzE5MzMsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDb3JyZWN0IGEgZmlsZSBwYXRoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHJlbW90ZSBob3N0IHJlcXVpcmVtZW50cy4gVGhpcwogICAgICAqIGltcGxlbWVudGF0aW9uIGN1cnJlbnRseSBhc3N1bWVzIHRoYXQgdGhlIHJlbW90ZSBlbmQgY2FuIGhhbmRsZQpAQCAtMTg2NCwxMSArMTk0NSw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgYXMgaXQgd2lsbCBhcHBlYXIgb24gdGhlIHNlcnZlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGaWxlKFN0cmluZyBmaWxlKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpLmNoYXJBdCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlU2VwLmNoYXJBdCgwKSk7CisgICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApLCByZW1vdGVGaWxlU2VwLmNoYXJBdCgwKSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFsbCBwYXJlbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIGEgY29tcGxldGUgcmVsYXRpdmUKICAgICAgKiBwYXRobmFtZS4gQXR0ZW1wdHMgdG8gY3JlYXRlIGV4aXN0aW5nIGRpcmVjdG9yaWVzIHdpbGwgbm90IGNhdXNlCkBAIC0xODg5LDcgKzE5NjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yIHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIExpc3Q8RmlsZT4gcGFyZW50cyA9IG5ldyBWZWN0b3I8PigpOwogICAgICAgICBTdHJpbmcgZGlybmFtZTsKIAogICAgICAgICB3aGlsZSAoKGRpcm5hbWUgPSBkaXIuZ2V0UGFyZW50KCkpICE9IG51bGwpIHsKQEAgLTE4OTgsNyArMTk3Nyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkaXIgPSBjaGVja0RpcjsKLSAgICAgICAgICAgIHBhcmVudHMuYWRkRWxlbWVudChkaXIpOworICAgICAgICAgICAgcGFyZW50cy5hZGQoZGlyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbmQgZmlyc3Qgbm9uIGNhY2hlZCBkaXIKQEAgLTE5MDcsMTUgKzE5ODYsMTQgQEAKICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICAgU3RyaW5nIGN3ZCA9IGZ0cC5wcmludFdvcmtpbmdEaXJlY3RvcnkoKTsKICAgICAgICAgICAgIFN0cmluZyBwYXJlbnQgPSBkaXIuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHJlc29sdmVGaWxlKHBhcmVudCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNoYW5nZSB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3Rvcnk6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHJlc29sdmVGaWxlKHBhcmVudCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHRvIGRpcmVjdG9yeTogJXMiLAorICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHdoaWxlIChpID49IDApIHsKLSAgICAgICAgICAgICAgICBkaXIgPSAoRmlsZSkgcGFyZW50cy5lbGVtZW50QXQoaS0tKTsKKyAgICAgICAgICAgICAgICBkaXIgPSBwYXJlbnRzLmdldChpLS0pOwogICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGRpciBleGlzdHMgYnkgdHJ5aW5nIHRvIGNoYW5nZSBpbnRvIGl0LgogICAgICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgbm90IGNoYW5nZSB0byBpdCAtIHRyeSB0byBjcmVhdGUgaXQKQEAgLTE5MjUsOCArMjAwMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNa0RpckZhaWx1cmUoZnRwKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjaGFuZ2UgdG8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNoYW5nZSB0byBkaXJlY3Rvcnk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGlyQ2FjaGUuYWRkKGRpcik7CkBAIC0xOTQ3LDEyICsyMDI2LDEzIEBACiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBsb2NhbCB0ZW1wb3JhcnkgZmlsZQogICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVOZXdGaWxlKHRlbXBGaWxlKTsKICAgICAgICAgICAgIGxvbmcgbG9jYWxUaW1lU3RhbXAgPSB0ZW1wRmlsZS5sYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIEZpbGVzLm5ld0lucHV0U3RyZWFtKHRlbXBGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgICAgICBmdHAuc3RvcmVGaWxlKHRlbXBGaWxlLmdldE5hbWUoKSwgaW5zdHJlYW0pOwogICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKICAgICAgICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IEZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSk7CiAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgIEZUUEZpbGUgW10gZnRwRmlsZXMgPSBmdHAubGlzdEZpbGVzKHRlbXBGaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgRlRQRmlsZVtdIGZ0cEZpbGVzID0gZnRwLmxpc3RGaWxlcyh0ZW1wRmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIGlmIChmdHBGaWxlcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBsb25nIHJlbW90ZVRpbWVTdGFtcCA9IGZ0cEZpbGVzWzBdLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbG9jYWxUaW1lU3RhbXAgLSByZW1vdGVUaW1lU3RhbXA7CkBAIC0xOTcwLDYgKzIwNTAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICB9CisKICAgICAvKioKICAgICAgKiAgZmluZCBhIHN1aXRhYmxlIG5hbWUgZm9yIGxvY2FsIGFuZCByZW1vdGUgdGVtcG9yYXJ5IGZpbGUKICAgICAgKi8KQEAgLTIwMzEsMTAgKzIxMTIsOSBAQAogICAgICAgICAgICAgICAgIGxvZygiQ291bGQgbm90IGRhdGUgdGVzdCByZW1vdGUgZmlsZTogIiArIHJlbW90ZUZpbGUKICAgICAgICAgICAgICAgICAgICAgKyAiYXNzdW1pbmcgb3V0IG9mIGRhdGUuIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBkYXRlIHRlc3QgcmVtb3RlIGZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBkYXRlIHRlc3QgcmVtb3RlIGZpbGU6ICVzIiwKKyAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBsb25nIHJlbW90ZVRpbWVzdGFtcCA9IGZpbGVzWzBdLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKS5nZXRUaW1lKCk7CkBAIC0yMDQyLDM4ICsyMTIyLDM2IEBACiAgICAgICAgIGxvbmcgYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXAgPQogICAgICAgICAgICAgcmVtb3RlVGltZXN0YW1wICsgdGhpcy50aW1lRGlmZk1pbGxpcyArIHRoaXMuZ3JhbnVsYXJpdHlNaWxsaXM7CiAKLSAgICAgICAgU3RyaW5nQnVmZmVyIG1zZzsKLSAgICAgICAgc3luY2hyb25pemVkKFRJTUVTVEFNUF9MT0dHSU5HX1NERikgewotICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1ZmZlcigiICAgWyIpCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbXNnOworICAgICAgICBzeW5jaHJvbml6ZWQgKFRJTUVTVEFNUF9MT0dHSU5HX1NERikgeworICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIiAgIFsiKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShsb2NhbFRpbWVzdGFtcCkpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0gbG9jYWwiKTsKICAgICAgICAgfQogICAgICAgICBsb2cobXNnLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogCi0gICAgICAgIHN5bmNocm9uaXplZChUSU1FU1RBTVBfTE9HR0lOR19TREYpIHsKLSAgICAgICAgICAgIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAgIFsiKQotICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShhZGp1c3RlZFJlbW90ZVRpbWVzdGFtcCkpKQorICAgICAgICBzeW5jaHJvbml6ZWQgKFRJTUVTVEFNUF9MT0dHSU5HX1NERikgeworICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIiAgIFsiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGCisgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQobmV3IERhdGUoYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXApKSkKICAgICAgICAgICAgICAgICAuYXBwZW5kKCJdIHJlbW90ZSIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZW1vdGVUaW1lc3RhbXAgIT0gYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZChUSU1FU1RBTVBfTE9HR0lOR19TREYpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoVElNRVNUQU1QX0xPR0dJTkdfU0RGKSB7CiAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiIC0gKHJhdzogIikKLSAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChUSU1FU1RBTVBfTE9HR0lOR19TREYuZm9ybWF0KG5ldyBEYXRlKHJlbW90ZVRpbWVzdGFtcCkpKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShyZW1vdGVUaW1lc3RhbXApKSkKICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiKSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGxvZyhtc2cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLQotCiAgICAgICAgIGlmICh0aGlzLmFjdGlvbiA9PSBTRU5EX0ZJTEVTKSB7CiAgICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXAgPj0gbG9jYWxUaW1lc3RhbXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWxUaW1lc3RhbXAgPj0gYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXA7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsVGltZXN0YW1wID49IGFkanVzdGVkUmVtb3RlVGltZXN0YW1wOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2VuZHMgYSBzaXRlIGNvbW1hbmQgdG8gdGhlIGZ0cCBzZXJ2ZXIKICAgICAgKiBAcGFyYW0gZnRwIGZ0cCBjbGllbnQKQEAgLTIwODMsMTQgKzIxNjEsMTAgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBkb1NpdGVDb21tYW5kKEZUUENsaWVudCBmdHAsIFN0cmluZyB0aGVDTUQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBib29sZWFuIHJjOwotICAgICAgICBTdHJpbmdbXSBteVJlcGx5ID0gbnVsbDsKIAogICAgICAgICBsb2coIkRvaW5nIFNpdGUgQ29tbWFuZDogIiArIHRoZUNNRCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgcmMgPSBmdHAuc2VuZFNpdGVDb21tYW5kKHRoZUNNRCk7Ci0KLSAgICAgICAgaWYgKCFyYykgeworICAgICAgICBpZiAoIWZ0cC5zZW5kU2l0ZUNvbW1hbmQodGhlQ01EKSkgewogICAgICAgICAgICAgbG9nKCJGYWlsZWQgdG8gaXNzdWUgU2l0ZSBDb21tYW5kOiAiICsgdGhlQ01ELCBQcm9qZWN0Lk1TR19XQVJOKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIHJlcGx5IDogZnRwLmdldFJlcGx5U3RyaW5ncygpKSB7CkBAIC0yMTAxLDcgKzIxNzUsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZW5kcyBhIHNpbmdsZSBmaWxlIHRvIHRoZSByZW1vdGUgaG9zdC4gPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IG1heQogICAgICAqIGNvbnRhaW4gYSByZWxhdGl2ZSBwYXRoIHNwZWNpZmljYXRpb24uIFdoZW4gdGhpcyBpcyB0aGUgY2FzZSwgPGNvZGU+c2VuZEZpbGU8L2NvZGU+CkBAIC0yMTM0LDcgKzIyMDcsNyBAQAogICAgICAgICAgICAgICAgIGxvZygidHJhbnNmZXJyaW5nICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaW5zdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIGluc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpOwogCiAgICAgICAgICAgICBjcmVhdGVQYXJlbnRzKGZ0cCwgZmlsZW5hbWUpOwogCkBAIC0yMTY2LDcgKzIyMzksNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBEZWxldGUgYSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LgogICAgICAqIEBwYXJhbSBmdHAgZnRwIGNsaWVudApAQCAtMjI0NiwxMCArMjMxOCw5IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZ2V0RmlsZShGVFBDbGllbnQgZnRwLCBTdHJpbmcgZGlyLCBTdHJpbmcgZmlsZW5hbWUpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQnVpbGRFeGNlcHRpb24geworICAgICAgICBGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobmV3IEZpbGUoZGlyLCBmaWxlbmFtZSkuZ2V0UGF0aCgpKTsKICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHN0cmVhbSA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobmV3IEZpbGUoZGlyLCBmaWxlbmFtZSkuZ2V0UGF0aCgpKTsKLQogICAgICAgICAgICAgaWYgKG5ld2VyT25seSAmJiBpc1VwVG9EYXRlKGZ0cCwgZmlsZSwgcmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTIyNjQsNyArMjMzNSw3IEBACiAgICAgICAgICAgICBpZiAoIXBkaXIuZXhpc3RzKCkpIHsKICAgICAgICAgICAgICAgICBwZGlyLm1rZGlycygpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0c3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKKyAgICAgICAgICAgIG91dHN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpOwogICAgICAgICAgICAgZnRwLnJldHJpZXZlRmlsZShyZXNvbHZlRmlsZShmaWxlbmFtZSksIG91dHN0cmVhbSk7CiAKICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkgewpAQCAtMjI5Nyw3ICsyMzY4LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogTGlzdCBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LiA8Y29kZT5maWxlbmFtZTwvY29kZT4KICAgICAgKiBtYXkgY29udGFpbiBhIHJlbGF0aXZlIHBhdGggc3BlY2lmaWNhdGlvbi4gPHA+CkBAIC0yMzQyLDQxICsyNDEyLDQxIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgbWFrZVJlbW90ZURpcihGVFBDbGllbnQgZnRwLCBTdHJpbmcgZGlyKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CisgICAgICAgIGJvb2xlYW4gYWJzb2x1dGUgPSBkaXIuc3RhcnRzV2l0aCgiLyIpOwogICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgaWYgKGRpci5zdGFydHNXaXRoKCIvIikgfHwgd29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoYWJzb2x1dGUgfHwgd29ya2luZ0RpcmVjdG9yeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyBkaXJlY3Rvcnk6ICIgKyBkaXIgKyAiIGluIC8iKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nKCJDcmVhdGluZyBkaXJlY3Rvcnk6ICIgKyBkaXIgKyAiIGluICIgKyB3b3JraW5nRGlyZWN0b3J5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZGlyLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICBpZiAoYWJzb2x1dGUpIHsKICAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KCIvIik7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHN1YmRpciA9ICIiOwogICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRpciwgIi8iKTsKICAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgc3ViZGlyID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICBTdHJpbmcgc3ViZGlyID0gc3QubmV4dFRva2VuKCk7CiAgICAgICAgICAgICBsb2coIkNoZWNraW5nICIgKyBzdWJkaXIsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3Rvcnkoc3ViZGlyKSkgewotICAgICAgICAgICAgICAgIGlmICghZnRwLm1ha2VEaXJlY3Rvcnkoc3ViZGlyKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBjb2RlcyA1MjEsIDU1MCBhbmQgNTUzIGNhbiBiZSBwcm9kdWNlZCBieSBGVFAgU2VydmVycwotICAgICAgICAgICAgICAgICAgICAvLyAgdG8gaW5kaWNhdGUgdGhhdCBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBoYXMKLSAgICAgICAgICAgICAgICAgICAgLy8gIGZhaWxlZCBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMuCi0gICAgICAgICAgICAgICAgICAgIGludCByYyA9IGZ0cC5nZXRSZXBseUNvZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEoaWdub3JlTm9uY3JpdGljYWxFcnJvcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHJjID09IENPREVfNTUwIHx8IHJjID09IENPREVfNTUzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByYyA9PSBDT0RFXzUyMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiRGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmdHAubWFrZURpcmVjdG9yeShzdWJkaXIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRpcmVjdG9yeSBjcmVhdGVkIE9LIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3Rvcnkoc3ViZGlyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBjb2RlcyA1MjEsIDU1MCBhbmQgNTUzIGNhbiBiZSBwcm9kdWNlZCBieSBGVFAgU2VydmVycworICAgICAgICAgICAgICAgICAgICAvLyAgdG8gaW5kaWNhdGUgdGhhdCBhbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSBoYXMKKyAgICAgICAgICAgICAgICAgICAgLy8gIGZhaWxlZCBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMuCisgICAgICAgICAgICAgICAgICAgIGludCByYyA9IGZ0cC5nZXRSZXBseUNvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVOb25jcml0aWNhbEVycm9ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJjICE9IENPREVfNTUwICYmIHJjICE9IENPREVfNTUzICYmIHJjICE9IENPREVfNTIxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIkRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyIpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMzk0LDE5ICsyNDY0LDQwIEBACiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1rRGlyRmFpbHVyZShGVFBDbGllbnQgZnRwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpbnQgcmMgPSBmdHAuZ2V0UmVwbHlDb2RlKCk7Ci0gICAgICAgIGlmICghKGlnbm9yZU5vbmNyaXRpY2FsRXJyb3JzCi0gICAgICAgICAgICAgICYmIChyYyA9PSBDT0RFXzU1MCB8fCByYyA9PSBDT0RFXzU1MyB8fCByYyA9PSBDT0RFXzUyMSkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgIGlmICghaWdub3JlTm9uY3JpdGljYWxFcnJvcnMgfHwgcmMgIT0gQ09ERV81NTAgJiYgcmMgIT0gQ09ERV81NTMgJiYgcmMgIT0gQ09ERV81MjEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNyZWF0ZSBkaXJlY3Rvcnk6ICVzIiwKKyAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKKyAgICAgKiBjaGVja3MgaWYgdGhlIHdha2UgdXAgaW50ZXJ2YWwgaXMgZXhwaXJlZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiB3YWtlVXBUcmFuc2ZlckludGVydmFsRXhwaXJlZCgpIHsKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKKworICAgICAgICAvLyBvbiB0aGUgZmlyc3QgY2FsbCwgaW5pdGlhbGl6ZSB0aGUga2VlcC1hbGl2ZSBtZWNoYW5pc20KKyAgICAgICAgLy8gYnkgc3RvcmluZyB0aGUgY3VycmVudCBkYXRlCisgICAgICAgIGlmIChsYXN0V2FrZVVwVGltZSA9PSAwKSB7CisgICAgICAgICAgICBsYXN0V2FrZVVwVGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VGltZSA+IChsYXN0V2FrZVVwVGltZSArIHdha2VVcFRyYW5zZmVySW50ZXJ2YWwgKiAxMDAwKSkgeworICAgICAgICAgICAgICAgIGxhc3RXYWtlVXBUaW1lID0gY3VycmVudFRpbWU7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUnVucyB0aGUgdGFzay4KICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHRhc2sgZmFpbHMgb3IgaXMgbm90IGNvbmZpZ3VyZWQKICAgICAgKiAgICAgICAgIGNvcnJlY3RseS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKCk7CiAKQEAgLTI0MjIsOSArMjUxMywxNCBAQAogCiAgICAgICAgICAgICBmdHAuc2V0UmVtb3RlVmVyaWZpY2F0aW9uRW5hYmxlZChlbmFibGVSZW1vdGVWZXJpZmljYXRpb24pOwogICAgICAgICAgICAgZnRwLmNvbm5lY3Qoc2VydmVyLCBwb3J0KTsKKworICAgICAgICAgICAgaWYgKGRhdGFUaW1lb3V0ID49IDApIHsKKyAgICAgICAgICAgICAgICBmdHAuc2V0RGF0YVRpbWVvdXQoZGF0YVRpbWVvdXQpOworICAgICAgICAgICAgICAgIGxvZygiU2V0dGluZyBkYXRhIHRpbWVvdXQgdG8gIiArIGRhdGFUaW1lb3V0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRlRQIGNvbm5lY3Rpb24gZmFpbGVkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRlRQIGNvbm5lY3Rpb24gZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbG9nKCJjb25uZWN0ZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTI0NDAsMTQgKzI1MzYsMTQgQEAKICAgICAgICAgICAgIGlmIChiaW5hcnkpIHsKICAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUob3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQLkJJTkFSWV9GSUxFX1RZUEUpOwogICAgICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBzZXQgdHJhbnNmZXIgdHlwZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHNldCB0cmFuc2ZlciB0eXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUob3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQLkFTQ0lJX0ZJTEVfVFlQRSk7CiAgICAgICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHNldCB0cmFuc2ZlciB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3Qgc2V0IHRyYW5zZmVyIHR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTI0NTUsOCArMjU1MSw5IEBACiAgICAgICAgICAgICAgICAgbG9nKCJlbnRlcmluZyBwYXNzaXZlIG1vZGUiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICBmdHAuZW50ZXJMb2NhbFBhc3NpdmVNb2RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGVudGVyIGludG8gcGFzc2l2ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtb2RlOiAiICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGVudGVyIGludG8gcGFzc2l2ZSBtb2RlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0yNDY1LDU2ICsyNTYyLDQzIEBACiAgICAgICAgICAgICAvLyBFLkcuIHN3aXRjaGluZyBiZXR3ZWVuIGEgVU5JWCBmaWxlIHN5c3RlbSBtb2RlIGFuZAogICAgICAgICAgICAgLy8gYSBsZWdhY3kgZmlsZSBzeXN0ZW0uCiAgICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsU2l0ZUNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJldHJ5SGFuZGxlciBoID0gbmV3IFJldHJ5SGFuZGxlcih0aGlzLnJldHJpZXNBbGxvd2VkLCB0aGlzKTsKICAgICAgICAgICAgICAgICBmaW5hbCBGVFBDbGllbnQgbGZ0cCA9IGZ0cDsKLSAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKGgsIG5ldyBSZXRyeWFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1NpdGVDb21tYW5kKGxmdHAsIEZUUC50aGlzLmluaXRpYWxTaXRlQ29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sICJpbml0aWFsIHNpdGUgY29tbWFuZDogIiArIHRoaXMuaW5pdGlhbFNpdGVDb21tYW5kKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKG5ldyBSZXRyeUhhbmRsZXIodGhpcy5yZXRyaWVzQWxsb3dlZCwgdGhpcyksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGRvU2l0ZUNvbW1hbmQobGZ0cCwgRlRQLnRoaXMuaW5pdGlhbFNpdGVDb21tYW5kKSwKKyAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgc2l0ZSBjb21tYW5kOiAiICsgdGhpcy5pbml0aWFsU2l0ZUNvbW1hbmQpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIC8vIEZvciBhIHVuaXggZnRwIHNlcnZlciB5b3UgY2FuIHNldCB0aGUgZGVmYXVsdCBtYXNrIGZvciBhbGwgZmlsZXMKICAgICAgICAgICAgIC8vIGNyZWF0ZWQuCiAKICAgICAgICAgICAgIGlmICh1bWFzayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpOwogICAgICAgICAgICAgICAgIGZpbmFsIEZUUENsaWVudCBsZnRwID0gZnRwOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvU2l0ZUNvbW1hbmQobGZ0cCwgInVtYXNrICIgKyB1bWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sICJ1bWFzayAiICsgdW1hc2spOworICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUobmV3IFJldHJ5SGFuZGxlcih0aGlzLnJldHJpZXNBbGxvd2VkLCB0aGlzKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gZG9TaXRlQ29tbWFuZChsZnRwLCAidW1hc2sgIiArIHVtYXNrKSwKKyAgICAgICAgICAgICAgICAgICAgInVtYXNrICIgKyB1bWFzayk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgTUtfRElSLCB0aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlCiAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgaXMgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUuCiAKICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gTUtfRElSKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpOwogICAgICAgICAgICAgICAgIGZpbmFsIEZUUENsaWVudCBsZnRwID0gZnRwOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VSZW1vdGVEaXIobGZ0cCwgcmVtb3RlZGlyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSwgcmVtb3RlZGlyKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKG5ldyBSZXRyeUhhbmRsZXIodGhpcy5yZXRyaWVzQWxsb3dlZCwgdGhpcyksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IG1ha2VSZW1vdGVEaXIobGZ0cCwgcmVtb3RlZGlyKSwgcmVtb3RlZGlyKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09IFNJVEVfQ01EKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpOwogICAgICAgICAgICAgICAgIGZpbmFsIEZUUENsaWVudCBsZnRwID0gZnRwOwotICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvU2l0ZUNvbW1hbmQobGZ0cCwgRlRQLnRoaXMuc2l0ZUNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9LCAiU2l0ZSBDb21tYW5kOiAiICsgdGhpcy5zaXRlQ29tbWFuZCk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShuZXcgUmV0cnlIYW5kbGVyKHRoaXMucmV0cmllc0FsbG93ZWQsIHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBkb1NpdGVDb21tYW5kKGxmdHAsIEZUUC50aGlzLnNpdGVDb21tYW5kKSwKKyAgICAgICAgICAgICAgICAgICAgIlNpdGUgQ29tbWFuZDogIiArIHRoaXMuc2l0ZUNvbW1hbmQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAocmVtb3RlZGlyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgbG9nKCJjaGFuZ2luZyB0aGUgcmVtb3RlIGRpcmVjdG9yeSB0byAiICsgcmVtb3RlZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHJlbW90ZWRpcik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHJlbW90ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGlyZWN0b3J5OiAiICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3Rvcnk6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG5ld2VyT25seSAmJiB0aW1lRGlmZkF1dG8pIHsKQEAgLTI1MjcsNiArMjYxMSwyMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBTdHJpbmcgY2F1c2UgPSBleC5nZXRDYXVzZSgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjYXVzZS5jb250YWlucygiamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYSByZWFkIHRpbWVvdXQgb2NjdXJzLCBpbmZvcm0gdGhlIHNlcnZlciB0aGF0IGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBhYm9ydC4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBsYXRlc3QgY29tbW9ucy1uZXQgKDMuNikgc3RpbGwgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBzZW5kaW5nIHVyZ2VudCBkYXRhLCB3aGljaCBpcyBub3JtYWxseSBhCisgICAgICAgICAgICAgICAgICAgIC8vIHByZXJlcXVpc2l0ZSBmb3IgQUJPUlQgY29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXMgYSBjb25zZXF1ZW5jZSwgaXQgIG1pZ2h0IG5vdCBiZSB0YWtlbiBpbiBhY2NvdW50IGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmdHAuYWJvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZXJyb3IgZHVyaW5nIEZUUCB0cmFuc2ZlcjogIiArIGV4LCBleCk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoZnRwICE9IG51bGwgJiYgZnRwLmlzQ29ubmVjdGVkKCkpIHsKQEAgLTI1NDEsNyArMjY0MSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIGFuIGFjdGlvbiB0byBwZXJmb3JtLCBvbmUgb2YKICAgICAgKiAic2VuZCIsICJwdXQiLCAicmVjdiIsICJnZXQiLCAiZGVsIiwgImRlbGV0ZSIsICJsaXN0IiwgIm1rZGlyIiwgImNobW9kIiwKQEAgLTI1NTQsNDQgKzI2NTMsNDkgQEAKICAgICAgICAgICAgICJjaG1vZCIsICJybWRpciIsICJzaXRlIgogICAgICAgICB9OwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzCiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgdGhlIHZhbGlkIEZUUCBhY3Rpb25zLgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gVkFMSURfQUNUSU9OUzsKICAgICAgICAgfQogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgc3ltYm9saWMgZXF1aXZhbGVudCBvZiB0aGUgYWN0aW9uIHZhbHVlLgogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBTWU1CT0wgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBhY3Rpb24uCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGdldEFjdGlvbigpIHsKLSAgICAgICAgICAgIFN0cmluZyBhY3Rpb25MID0gZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBpZiAoYWN0aW9uTC5lcXVhbHMoInNlbmQiKSB8fCBhY3Rpb25MLmVxdWFscygicHV0IikpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpIHsKKyAgICAgICAgICAgIGNhc2UgInNlbmQiOgorICAgICAgICAgICAgY2FzZSAicHV0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gU0VORF9GSUxFUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoInJlY3YiKSB8fCBhY3Rpb25MLmVxdWFscygiZ2V0IikpIHsKKyAgICAgICAgICAgIGNhc2UgInJlY3YiOgorICAgICAgICAgICAgY2FzZSAiZ2V0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gR0VUX0ZJTEVTOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygiZGVsIikgfHwgYWN0aW9uTC5lcXVhbHMoImRlbGV0ZSIpKSB7CisgICAgICAgICAgICBjYXNlICJkZWwiOgorICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgICByZXR1cm4gREVMX0ZJTEVTOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygibGlzdCIpKSB7CisgICAgICAgICAgICBjYXNlICJsaXN0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gTElTVF9GSUxFUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoImNobW9kIikpIHsKKyAgICAgICAgICAgIGNhc2UgImNobW9kIjoKICAgICAgICAgICAgICAgICByZXR1cm4gQ0hNT0Q7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkwuZXF1YWxzKCJta2RpciIpKSB7CisgICAgICAgICAgICBjYXNlICJta2RpciI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1LX0RJUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoInJtZGlyIikpIHsKKyAgICAgICAgICAgIGNhc2UgInJtZGlyIjoKICAgICAgICAgICAgICAgICByZXR1cm4gUk1fRElSOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygic2l0ZSIpKSB7CisgICAgICAgICAgICBjYXNlICJzaXRlIjoKICAgICAgICAgICAgICAgICByZXR1cm4gU0lURV9DTUQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBTRU5EX0ZJTEVTOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFNFTkRfRklMRVM7CisKICAgICAgICAgfQogICAgIH0KKwogICAgIC8qKgogICAgICAqIHJlcHJlc2VudHMgb25lIG9mIHRoZSB2YWxpZCB0aW1lc3RhbXAgYWRqdXN0bWVudCB2YWx1ZXMKICAgICAgKiByZWNvZ25pemVkIGJ5IHRoZSA8Y29kZT50aW1lc3RhbXBHcmFudWxhcml0eTwvY29kZT4gYXR0cmlidXRlLjxwPgpAQCAtMjYxNyw5ICsyNzIxLDExIEBACiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbGlkIEdyYW51bGFyaXR5IHZhbHVlcwogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gVkFMSURfR1JBTlVMQVJJVElFUzsKICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgKiB0aGUgYXR0cmlidXRlLCB3aGljaCBjYW4gdmFyeSBpbiBzb21lIGNhc2VzIGRlcGVuZGluZwpAQCAtMjYzMCw3ICsyNzM2LDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBsb25nIGdldE1pbGxpc2Vjb25kcyhpbnQgYWN0aW9uKSB7CiAgICAgICAgICAgICBTdHJpbmcgZ3JhbnVsYXJpdHlVID0gZ2V0VmFsdWUoKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0gICAgICAgICAgICBpZiAoIiIuZXF1YWxzKGdyYW51bGFyaXR5VSkpIHsKKyAgICAgICAgICAgIGlmIChncmFudWxhcml0eVUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBTRU5EX0ZJTEVTKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHUkFOVUxBUklUWV9NSU5VVEU7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjYzOSwxMyArMjc0NSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDBMOwogICAgICAgICB9CisKICAgICAgICAgc3RhdGljIGZpbmFsIEdyYW51bGFyaXR5IGdldERlZmF1bHQoKSB7CiAgICAgICAgICAgICBHcmFudWxhcml0eSBnID0gbmV3IEdyYW51bGFyaXR5KCk7CiAgICAgICAgICAgICBnLnNldFZhbHVlKCIiKTsKICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICB9Ci0KICAgICB9CisKICAgICAvKioKICAgICAgKiBvbmUgb2YgdGhlIHZhbGlkIHN5c3RlbSB0eXBlIGtleXMgcmVjb2duaXplZCBieSB0aGUgc3lzdGVtVHlwZUtleQogICAgICAqIGF0dHJpYnV0ZS4KQEAgLTI2NjIsNiArMjc2OSw3IEBACiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbGlkIHN5c3RlbSB0eXBlcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIFZBTElEX1NZU1RFTV9UWVBFUzsKICAgICAgICAgfQpAQCAtMjY3MiwzMSArMjc4MCwzMSBAQAogICAgICAgICAgICAgcmV0dXJuIGZ0cHN0OwogICAgICAgICB9CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogRW51bWVyYXRlZCBjbGFzcyBmb3IgbGFuZ3VhZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGFuZ3VhZ2VDb2RlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CiAKLQogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9MQU5HVUFHRV9DT0RFUyA9CiAgICAgICAgICAgICBnZXRWYWxpZExhbmd1YWdlQ29kZXMoKTsKIAogICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBnZXRWYWxpZExhbmd1YWdlQ29kZXMoKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uIGMgPSBGVFBDbGllbnRDb25maWcuZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlcygpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBGVFBDbGllbnRDb25maWcuZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlcygpOwogICAgICAgICAgICAgU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tjLnNpemUoKSArIDFdOwogICAgICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICAgICAgcmV0W2krK10gPSAiIjsKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgaXQgPSBjLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmV0W2ldID0gKFN0cmluZykgaXQubmV4dCgpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgZWxlbWVudCA6IGMpIHsKKyAgICAgICAgICAgICAgICByZXRbaSsrXSA9IGVsZW1lbnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJuIHRoZSB2YWx1ZSB2YWx1ZXMuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgdmFsaWQgbGFuZ3VhZ2UgdHlwZXMuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBWQUxJRF9MQU5HVUFHRV9DT0RFUzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUENvbmZpZ3VyYXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUENvbmZpZ3VyYXRvci5qYXZhCmluZGV4IDA2MDRkYWMuLmJhNjU5ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBDb25maWd1cmF0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQQ29uZmlndXJhdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgIHRhc2subG9nKCJjdXN0b20gY29uZmlndXJhdGlvbiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICBGVFBDbGllbnRDb25maWcgY29uZmlnOwogICAgICAgICBTdHJpbmcgc3lzdGVtVHlwZUtleSA9IHRhc2suZ2V0U3lzdGVtVHlwZUtleSgpOwotICAgICAgICBpZiAoc3lzdGVtVHlwZUtleSAhPSBudWxsICYmICEiIi5lcXVhbHMoc3lzdGVtVHlwZUtleSkpIHsKKyAgICAgICAgaWYgKHN5c3RlbVR5cGVLZXkgIT0gbnVsbCAmJiAhc3lzdGVtVHlwZUtleS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBGVFBDbGllbnRDb25maWcoc3lzdGVtVHlwZUtleSk7CiAgICAgICAgICAgICB0YXNrLmxvZygiY3VzdG9tIGNvbmZpZzogc3lzdGVtIGtleSA9ICIKICAgICAgICAgICAgICAgICAgICAgKyBzeXN0ZW1UeXBlS2V5LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTY5LDcgKzY5LDcgQEAKIAogICAgICAgICBTdHJpbmcgc2VydmVyTGFuZ3VhZ2VDb2RlQ29uZmlnID0gdGFzay5nZXRTZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcoKTsKICAgICAgICAgaWYgKHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoISIiLmVxdWFscyhzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcpCisgICAgICAgICAgICBpZiAoIXNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZy5pc0VtcHR5KCkKICAgICAgICAgICAgICAgICAmJiAhRlRQQ2xpZW50Q29uZmlnLmdldFN1cHBvcnRlZExhbmd1YWdlQ29kZXMoKQogICAgICAgICAgICAgICAgIC5jb250YWlucyhzZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bnN1cHBvcnRlZCBsYW5ndWFnZSBjb2RlIiArCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2suamF2YQppbmRleCBkNTNmMTZkLi42ZDJlNzM5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04Myw3ICs4Myw3IEBACiAgICAgcHJpdmF0ZSBsb25nIGdyYW51bGFyaXR5TWlsbGlzID0gMEw7CiAgICAgcHJpdmF0ZSBib29sZWFuIHRpbWVEaWZmQXV0byA9IGZhbHNlOwogICAgIHByaXZhdGUgaW50IGFjdGlvbiA9IFNFTkRfRklMRVM7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZXNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICBwcml2YXRlIFN0cmluZyByZW1vdGVGaWxlU2VwID0gIi8iOwogICAgIHByaXZhdGUgaW50IHBvcnQgPSBERUZBVUxUX0ZUUF9QT1JUOwogICAgIHByaXZhdGUgYm9vbGVhbiBza2lwRmFpbGVkVHJhbnNmZXJzID0gZmFsc2U7CkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBBIHN5bm9ueW0gZm9yIDx0dD5kZXBlbmRzPC90dD4uIFNldCB0byB0cnVlIHRvIHRyYW5zbWl0IG9ubHkgbmV3CisgICAgICogQSBzeW5vbnltIGZvciA8Y29kZT5kZXBlbmRzPC9jb2RlPi4gU2V0IHRvIHRydWUgdG8gdHJhbnNtaXQgb25seSBuZXcKICAgICAgKiBvciBjaGFuZ2VkIGZpbGVzLgogICAgICAqCiAgICAgICogU2VlIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgdGltZWRpZmZtaWxsaXMgYW5kIHRpbWVkaWZmYXV0by4KQEAgLTM5Niw3ICszOTYsNyBAQAogICAgICAgICBmaWxlc2V0cy5hZGRFbGVtZW50KHNldCk7CiAgICAgfQogCi0gICAgcHVibGljIFZlY3RvciBnZXRGaWxlc2V0cygpIHsKKyAgICBwdWJsaWMgVmVjdG9yPEZpbGVTZXQ+IGdldEZpbGVzZXRzKCkgewogICAgICAgICByZXR1cm4gZmlsZXNldHM7CiAgICAgfQogCkBAIC00MTUsNiArNDE1LDcgQEAKICAgICAgKgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGFjdGlvbiBpcyBub3QgYSB2YWxpZCBhY3Rpb24uCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIGFjdGlvbikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgbG9nKCJERVBSRUNBVEVEIC0gVGhlIHNldEFjdGlvbihTdHJpbmcpIG1ldGhvZCBoYXMgYmVlbiBkZXByZWNhdGVkLiIKICAgICAgICAgICAgICsgIiBVc2Ugc2V0QWN0aW9uKEZUUC5BY3Rpb24pIGluc3RlYWQuIik7CkBAIC01MDMsNyArNTA0LDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN5c3RlbVR5cGVLZXkoRlRQU3lzdGVtVHlwZSBzeXN0ZW1LZXkpIHsKLSAgICAgICAgaWYgKHN5c3RlbUtleSAhPSBudWxsICYmICFzeXN0ZW1LZXkuZ2V0VmFsdWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChzeXN0ZW1LZXkgIT0gbnVsbCAmJiAhc3lzdGVtS2V5LmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnN5c3RlbVR5cGVLZXkgPSBzeXN0ZW1LZXk7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC01MTYsNyArNTE3LDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREYXRlRm9ybWF0Q29uZmlnKFN0cmluZyBkZWZhdWx0RGF0ZUZvcm1hdCkgewotICAgICAgICBpZiAoZGVmYXVsdERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhZGVmYXVsdERhdGVGb3JtYXQuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoZGVmYXVsdERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhZGVmYXVsdERhdGVGb3JtYXQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLmRlZmF1bHREYXRlRm9ybWF0Q29uZmlnID0gZGVmYXVsdERhdGVGb3JtYXQ7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC01MjksNyArNTMwLDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFJlY2VudERhdGVGb3JtYXRDb25maWcoU3RyaW5nIHJlY2VudERhdGVGb3JtYXQpIHsKLSAgICAgICAgaWYgKHJlY2VudERhdGVGb3JtYXQgIT0gbnVsbCAmJiAhcmVjZW50RGF0ZUZvcm1hdC5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChyZWNlbnREYXRlRm9ybWF0ICE9IG51bGwgJiYgIXJlY2VudERhdGVGb3JtYXQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnJlY2VudERhdGVGb3JtYXRDb25maWcgPSByZWNlbnREYXRlRm9ybWF0OwogICAgICAgICAgICAgY29uZmlndXJhdGlvbkhhc0JlZW5TZXQoKTsKICAgICAgICAgfQpAQCAtNTQyLDcgKzU0Myw3IEBACiAgICAgICogQHNlZSBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnRDb25maWcKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcoU3RyaW5nIHNlcnZlckxhbmd1YWdlQ29kZSkgewotICAgICAgICBpZiAoc2VydmVyTGFuZ3VhZ2VDb2RlICE9IG51bGwgJiYgISIiLmVxdWFscyhzZXJ2ZXJMYW5ndWFnZUNvZGUpKSB7CisgICAgICAgIGlmIChzZXJ2ZXJMYW5ndWFnZUNvZGUgIT0gbnVsbCAmJiAhc2VydmVyTGFuZ3VhZ2VDb2RlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhpcy5zZXJ2ZXJMYW5ndWFnZUNvZGVDb25maWcgPSBzZXJ2ZXJMYW5ndWFnZUNvZGU7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC01NTUsNyArNTU2LDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclRpbWVab25lQ29uZmlnKFN0cmluZyBzZXJ2ZXJUaW1lWm9uZUlkKSB7Ci0gICAgICAgIGlmIChzZXJ2ZXJUaW1lWm9uZUlkICE9IG51bGwgJiYgIXNlcnZlclRpbWVab25lSWQuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAoc2VydmVyVGltZVpvbmVJZCAhPSBudWxsICYmICFzZXJ2ZXJUaW1lWm9uZUlkLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhpcy5zZXJ2ZXJUaW1lWm9uZUNvbmZpZyA9IHNlcnZlclRpbWVab25lSWQ7CiAgICAgICAgICAgICBjb25maWd1cmF0aW9uSGFzQmVlblNldCgpOwogICAgICAgICB9CkBAIC01NjksNyArNTcwLDcgQEAKICAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNob3J0TW9udGhOYW1lc0NvbmZpZyhTdHJpbmcgc2hvcnRNb250aE5hbWVzKSB7Ci0gICAgICAgIGlmIChzaG9ydE1vbnRoTmFtZXMgIT0gbnVsbCAmJiAhc2hvcnRNb250aE5hbWVzLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHNob3J0TW9udGhOYW1lcyAhPSBudWxsICYmICFzaG9ydE1vbnRoTmFtZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aGlzLnNob3J0TW9udGhOYW1lc0NvbmZpZyA9IHNob3J0TW9udGhOYW1lczsKICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25IYXNCZWVuU2V0KCk7CiAgICAgICAgIH0KQEAgLTU5MywxNiArNTk0LDE0IEBACiAgICAgICAgICAgICAgICAgaW50IHJldHJpZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHJldHJpZXNBbGxvd2VkKTsKICAgICAgICAgICAgICAgICBpZiAocmV0cmllcyA8IFJldHJ5YWJsZS5SRVRSWV9GT1JFVkVSKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciByZXRyaWVzQWxsb3dlZCBhdHRyaWJ1dGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0cmllc0FsbG93ZWQpOwotCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgcmV0cmllc0FsbG93ZWQgYXR0cmlidXRlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzQWxsb3dlZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRoaXMucmV0cmllc0FsbG93ZWQgPSByZXRyaWVzOwogICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHB4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgcmV0cmllc0FsbG93ZWQgYXR0cmlidXRlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmV0cmllc0FsbG93ZWQpOwotCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciByZXRyaWVzQWxsb3dlZCBhdHRyaWJ1dGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgcmV0cmllc0FsbG93ZWQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgIH0KQEAgLTYxNSw1NSArNjE0LDY5IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzeXN0ZW1UeXBlS2V5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtVHlwZUtleSgpIHsKICAgICAgICAgcmV0dXJuIHN5c3RlbVR5cGVLZXkuZ2V0VmFsdWUoKTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHREYXRlRm9ybWF0Q29uZmlnLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdERhdGVGb3JtYXRDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBkZWZhdWx0RGF0ZUZvcm1hdENvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY2VudERhdGVGb3JtYXRDb25maWcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWNlbnREYXRlRm9ybWF0Q29uZmlnKCkgewogICAgICAgICByZXR1cm4gcmVjZW50RGF0ZUZvcm1hdENvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZygpIHsKICAgICAgICAgcmV0dXJuIHNlcnZlckxhbmd1YWdlQ29kZUNvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNlcnZlclRpbWVab25lQ29uZmlnLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2VydmVyVGltZVpvbmVDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBzZXJ2ZXJUaW1lWm9uZUNvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0TW9udGhOYW1lc0NvbmZpZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFNob3J0TW9udGhOYW1lc0NvbmZpZygpIHsKICAgICAgICAgcmV0dXJuIHNob3J0TW9udGhOYW1lc0NvbmZpZzsKICAgICB9CisKICAgICAvKioKICAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRpbWVzdGFtcEdyYW51bGFyaXR5LgogICAgICAqLwogICAgIHB1YmxpYyBHcmFudWxhcml0eSBnZXRUaW1lc3RhbXBHcmFudWxhcml0eSgpIHsKICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcEdyYW51bGFyaXR5OwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcEdyYW51bGFyaXR5IGF0dHJpYnV0ZQogICAgICAqIEBwYXJhbSB0aW1lc3RhbXBHcmFudWxhcml0eSBUaGUgdGltZXN0YW1wR3JhbnVsYXJpdHkgdG8gc2V0LgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcEdyYW51bGFyaXR5KEdyYW51bGFyaXR5IHRpbWVzdGFtcEdyYW51bGFyaXR5KSB7Ci0gICAgICAgIGlmIChudWxsID09IHRpbWVzdGFtcEdyYW51bGFyaXR5IHx8ICIiLmVxdWFscyh0aW1lc3RhbXBHcmFudWxhcml0eS5nZXRWYWx1ZSgpKSkgeworICAgICAgICBpZiAobnVsbCA9PSB0aW1lc3RhbXBHcmFudWxhcml0eSB8fCB0aW1lc3RhbXBHcmFudWxhcml0eS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHRoaXMudGltZXN0YW1wR3JhbnVsYXJpdHkgPSB0aW1lc3RhbXBHcmFudWxhcml0eTsKICAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSBzaXRlQ29tbWFuZCBhdHRyaWJ1dGUuICBUaGlzIGF0dHJpYnV0ZQogICAgICAqIG5hbWVzIHRoZSBjb21tYW5kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBpZiB0aGUgYWN0aW9uCkBAIC03MzEsMzMgKzc0NCwzMSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwYXNzd29yZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKGFjdGlvbiA9PSBMSVNUX0ZJTEVTKSAmJiAobGlzdGluZyA9PSBudWxsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJsaXN0aW5nIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgbGlzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYWN0aW9uISIpOworICAgICAgICBpZiAoYWN0aW9uID09IExJU1RfRklMRVMgJiYgbGlzdGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImxpc3RpbmcgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBsaXN0IGFjdGlvbiEiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhY3Rpb24gPT0gTUtfRElSICYmIHJlbW90ZWRpciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInJlbW90ZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJta2RpciBhY3Rpb24hIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgInJlbW90ZWRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIG1rZGlyIGFjdGlvbiEiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChhY3Rpb24gPT0gQ0hNT0QgJiYgY2htb2QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjaG1vZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIGNobW9kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhY3Rpb24hIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImNobW9kIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgY2htb2QgYWN0aW9uISIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhY3Rpb24gPT0gU0lURV9DTUQgJiYgc2l0ZUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzaXRlY29tbWFuZCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNpdGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFjdGlvbiEiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic2l0ZWNvbW1hbmQgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBzaXRlIGFjdGlvbiEiKTsKICAgICAgICAgfQogCi0KICAgICAgICAgaWYgKHRoaXMuaXNDb25maWd1cmF0aW9uU2V0KSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUENsaWVudENvbmZpZyIpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbW9ucy1uZXQuamFyID49IDEuNC4wIGlzIHJlcXVpcmVkIGZvciBhdCBsZWFzdCBvbmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvZiB0aGUgYXR0cmlidXRlcyBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICAgICAgICAgICJjb21tb25zLW5ldC5qYXIgPj0gMS40LjAgaXMgcmVxdWlyZWQgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGUgYXR0cmlidXRlcyBzcGVjaWZpZWQuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC03NjgsNiArNzc5LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSB0YXNrIGZhaWxzIG9yIGlzIG5vdCBjb25maWd1cmVkCiAgICAgICogICAgICAgICBjb3JyZWN0bHkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrQXR0cmlidXRlcygpOwogICAgICAgICB0cnkgewpAQCAtODE1LDE4ICs4MjcsMjEgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUuY29tbW9ucy5uZXQuZnRwLkZUUCIpOyAvLyBzYW5pdHkgY2hlY2sKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSA8Y2xhc3NwYXRoPiBmb3IgPGZ0cD4gbXVzdCBpbmNsdWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb21tb25zLW5ldC5qYXIgaWYgbm90IGluIEFudCdzIG93biAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGNsYXNzcGF0aCIsIGUsIHRhc2suZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSA8Y2xhc3NwYXRoPiBmb3IgPGZ0cD4gbXVzdCBpbmNsdWRlIGNvbW1vbnMtbmV0LmphciBpZiBub3QgaW4gQW50J3Mgb3duIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgZSwgdGFzay5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgYyA9IGxvYWRlci5sb2FkQ2xhc3MoRlRQVGFza01pcnJvci5jbGFzcy5nZXROYW1lKCkgKyAiSW1wbCIpOworICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEZUUFRhc2tNaXJyb3I+IGMgPQorICAgICAgICAgICAgICAgIGxvYWRlci5sb2FkQ2xhc3MoRlRQVGFza01pcnJvci5jbGFzcy5nZXROYW1lKCkgKyAiSW1wbCIpCisgICAgICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKEZUUFRhc2tNaXJyb3IuY2xhc3MpOwogICAgICAgICAgICAgaWYgKGMuZ2V0Q2xhc3NMb2FkZXIoKSAhPSBsb2FkZXIpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk92ZXJkZWxlZ2F0aW5nIGxvYWRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zID0gYy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbXSB7RlRQVGFzay5jbGFzc30pOwotICAgICAgICAgICAgcmV0dXJuIChGVFBUYXNrTWlycm9yKSBjb25zLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXSB7dGFza30pOworICAgICAgICAgICAgQ29uc3RydWN0b3I8PyBleHRlbmRzIEZUUFRhc2tNaXJyb3I+IGNvbnMgPQorICAgICAgICAgICAgICAgIGMuZ2V0Q29uc3RydWN0b3IoRlRQVGFzay5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gY29ucy5uZXdJbnN0YW5jZSh0YXNrKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCB0YXNrLmdldExvY2F0aW9uKCkpOwogICAgICAgICB9CkBAIC04NDQsMTcgKzg1OSwxNiBAQAogICAgICAgICAgICAgImNobW9kIiwgInJtZGlyIiwgInNpdGUiCiAgICAgICAgIH07CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogR2V0IHRoZSB2YWxpZCB2YWx1ZXMKICAgICAgICAgICoKICAgICAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUgdmFsaWQgRlRQIGFjdGlvbnMuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBWQUxJRF9BQ1RJT05TOwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogR2V0IHRoZSBzeW1ib2xpYyBlcXVpdmFsZW50IG9mIHRoZSBhY3Rpb24gdmFsdWUuCiAgICAgICAgICAqCkBAIC04NjIsMjYgKzg3NiwzMSBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRBY3Rpb24oKSB7CiAgICAgICAgICAgICBTdHJpbmcgYWN0aW9uTCA9IGdldFZhbHVlKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgICAgICAgICAgaWYgKGFjdGlvbkwuZXF1YWxzKCJzZW5kIikgfHwgYWN0aW9uTC5lcXVhbHMoInB1dCIpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkwpIHsKKyAgICAgICAgICAgIGNhc2UgInNlbmQiOgorICAgICAgICAgICAgY2FzZSAicHV0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gU0VORF9GSUxFUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoInJlY3YiKSB8fCBhY3Rpb25MLmVxdWFscygiZ2V0IikpIHsKKyAgICAgICAgICAgIGNhc2UgInJlY3YiOgorICAgICAgICAgICAgY2FzZSAiZ2V0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gR0VUX0ZJTEVTOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygiZGVsIikgfHwgYWN0aW9uTC5lcXVhbHMoImRlbGV0ZSIpKSB7CisgICAgICAgICAgICBjYXNlICJkZWwiOgorICAgICAgICAgICAgY2FzZSAiZGVsZXRlIjoKICAgICAgICAgICAgICAgICByZXR1cm4gREVMX0ZJTEVTOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygibGlzdCIpKSB7CisgICAgICAgICAgICBjYXNlICJsaXN0IjoKICAgICAgICAgICAgICAgICByZXR1cm4gTElTVF9GSUxFUzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoImNobW9kIikpIHsKKyAgICAgICAgICAgIGNhc2UgImNobW9kIjoKICAgICAgICAgICAgICAgICByZXR1cm4gQ0hNT0Q7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkwuZXF1YWxzKCJta2RpciIpKSB7CisgICAgICAgICAgICBjYXNlICJta2RpciI6CiAgICAgICAgICAgICAgICAgcmV0dXJuIE1LX0RJUjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uTC5lcXVhbHMoInJtZGlyIikpIHsKKyAgICAgICAgICAgIGNhc2UgInJtZGlyIjoKICAgICAgICAgICAgICAgICByZXR1cm4gUk1fRElSOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25MLmVxdWFscygic2l0ZSIpKSB7CisgICAgICAgICAgICBjYXNlICJzaXRlIjoKICAgICAgICAgICAgICAgICByZXR1cm4gU0lURV9DTUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gU0VORF9GSUxFUzsKICAgICAgICAgfQogICAgIH0KKwogICAgIC8qKgogICAgICAqIHJlcHJlc2VudHMgb25lIG9mIHRoZSB2YWxpZCB0aW1lc3RhbXAgYWRqdXN0bWVudCB2YWx1ZXMKICAgICAgKiByZWNvZ25pemVkIGJ5IHRoZSA8Y29kZT50aW1lc3RhbXBHcmFudWxhcml0eTwvY29kZT4gYXR0cmlidXRlLjxwPgpAQCAtOTA3LDkgKzkyNiwxMSBAQAogICAgICAgICAgKiBHZXQgdGhlIHZhbGlkIHZhbHVlcy4KICAgICAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB2YWxpZCBHcmFudWxhcml0eSB2YWx1ZXMKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIFZBTElEX0dSQU5VTEFSSVRJRVM7CiAgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSwgd2hpY2ggY2FuIHZhcnkgaW4gc29tZSBjYXNlcyBkZXBlbmRpbmcKQEAgLTkyMCw3ICs5NDEsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGxvbmcgZ2V0TWlsbGlzZWNvbmRzKGludCBhY3Rpb24pIHsKICAgICAgICAgICAgIFN0cmluZyBncmFudWxhcml0eVUgPSBnZXRWYWx1ZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKTsKLSAgICAgICAgICAgIGlmICgiIi5lcXVhbHMoZ3JhbnVsYXJpdHlVKSkgeworICAgICAgICAgICAgaWYgKGdyYW51bGFyaXR5VS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09IFNFTkRfRklMRVMpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdSQU5VTEFSSVRZX01JTlVURTsKICAgICAgICAgICAgICAgICB9CkBAIC05MjksMTMgKzk1MCwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDBMOwogICAgICAgICB9CisKICAgICAgICAgc3RhdGljIGZpbmFsIEdyYW51bGFyaXR5IGdldERlZmF1bHQoKSB7CiAgICAgICAgICAgICBHcmFudWxhcml0eSBnID0gbmV3IEdyYW51bGFyaXR5KCk7CiAgICAgICAgICAgICBnLnNldFZhbHVlKCIiKTsKICAgICAgICAgICAgIHJldHVybiBnOwogICAgICAgICB9Ci0KICAgICB9CisKICAgICAvKioKICAgICAgKiBvbmUgb2YgdGhlIHZhbGlkIHN5c3RlbSB0eXBlIGtleXMgcmVjb2duaXplZCBieSB0aGUgc3lzdGVtVHlwZUtleQogICAgICAqIGF0dHJpYnV0ZS4KQEAgLTk0NywxMSArOTY5LDExIEBACiAgICAgICAgICAgICAiTVZTIgogICAgICAgICB9OwogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgdmFsaWQgdmFsdWVzLgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHZhbGlkIHN5c3RlbSB0eXBlcy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIFZBTElEX1NZU1RFTV9UWVBFUzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2tDb25maWcuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBUYXNrQ29uZmlnLmphdmEKaW5kZXggMDA2ZGY2MS4uNDJhOTUxMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2tDb25maWcuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFza0NvbmZpZy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2tNaXJyb3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9GVFBUYXNrTWlycm9yLmphdmEKaW5kZXggNWQwOWU2Zi4uMGY5MzQyZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2tNaXJyb3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFza01pcnJvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRhc2tNaXJyb3JJbXBsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFza01pcnJvckltcGwuamF2YQppbmRleCBlYzRlMjhmLi5hZWMxMmNjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFza01pcnJvckltcGwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGFza01pcnJvckltcGwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDIyICsyMSwyNCBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5GVFBDbGllbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQRmlsZTsKQEAgLTY2LDcgKzY4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKIAogICAgIHByaXZhdGUgZmluYWwgRlRQVGFzayB0YXNrOwotICAgIHByaXZhdGUgU2V0IGRpckNhY2hlID0gbmV3IEhhc2hTZXQoKTsKKyAgICBwcml2YXRlIFNldDxGaWxlPiBkaXJDYWNoZSA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBwcml2YXRlIGludCB0cmFuc2ZlcnJlZCA9IDA7CiAgICAgcHJpdmF0ZSBpbnQgc2tpcHBlZCA9IDA7CiAKQEAgLTg0LDYgKzg2LDcgQEAKICAgICAgKgogICAgICAqLwogICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRlRQRmlsZVByb3h5IGV4dGVuZHMgRmlsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgRlRQRmlsZSBmaWxlOwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHBhcnRzOwpAQCAtMTExLDg5ICsxMTQsODkgQEAKICAgICAgICAgICAgIHBhcnRzID0gRmlsZVV0aWxzLmdldFBhdGhTdGFjayhjb21wbGV0ZVBhdGgpOwogICAgICAgICB9CiAKLQogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2V4aXN0cygpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAotCiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjZ2V0QWJzb2x1dGVQYXRoKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKICAgICAgICAgICAgIHJldHVybiBuYW1lOwogICAgICAgICB9CiAKLQogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2dldE5hbWUoKQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPiAwID8gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gOiBuYW1lOwogICAgICAgICB9CiAKLQogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2dldFBhcmVudCgpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKXsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gRmlsZS5zZXBhcmF0b3JDaGFyICsgcGFydHNbaV07CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoRmlsZS5zZXBhcmF0b3JDaGFyKS5hcHBlbmQocGFydHNbaV0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0KICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAgICAgKiBAc2VlIGphdmEuaW8uRmlsZSNnZXRQYXRoKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgICAgfQogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEZUUCBmaWxlcyBhcmUgc3RvcmVkIGFzIGFic29sdXRlIHBhdGhzCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWJzb2x1dGUoKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0KICAgICAgICAgLyogKG5vbi1KYXZhZG9jKQogICAgICAgICAgKiBAc2VlIGphdmEuaW8uRmlsZSNpc0RpcmVjdG9yeSgpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmlsZSA9PSBudWxsOwogICAgICAgICB9CiAKLQogICAgICAgICAvKiAobm9uLUphdmFkb2MpCiAgICAgICAgICAqIEBzZWUgamF2YS5pby5GaWxlI2lzRmlsZSgpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlKCkgewogICAgICAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbDsKICAgICAgICAgfQogCi0KICAgICAgICAgLyoqCiAgICAgICAgICAqIEZUUCBmaWxlcyBjYW5ub3QgYmUgaGlkZGVuCiAgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gIGZhbHNlCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNIaWRkZW4oKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotCiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjbGFzdE1vZGlmaWVkKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgbG9uZyBsYXN0TW9kaWZpZWQoKSB7CiAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0VGltZXN0YW1wKCkuZ2V0VGltZUluTWlsbGlzKCk7CkBAIC0yMDEsMTAgKzIwNCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAotCiAgICAgICAgIC8qIChub24tSmF2YWRvYykKICAgICAgICAgICogQHNlZSBqYXZhLmlvLkZpbGUjbGVuZ3RoKCkKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CiAgICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZ2V0U2l6ZSgpOwpAQCAtMjQ1LDExICsyNDgsMTEgQEAKICAgICAgICAgICAgIHRoaXMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOwogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogc2NhbnMgdGhlIHJlbW90ZSBkaXJlY3RvcnksCiAgICAgICAgICAqIHN0b3JpbmcgaW50ZXJuYWxseSB0aGUgaW5jbHVkZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCAuLi4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzY2FuKCkgewogICAgICAgICAgICAgaWYgKGluY2x1ZGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBObyBpbmNsdWRlcyBzdXBwbGllZCwgc28gc2V0IGl0IHRvICdtYXRjaGVzIGFsbCcKQEAgLTI2MCwxMiArMjYzLDEyIEBACiAgICAgICAgICAgICAgICAgZXhjbHVkZXMgPSBuZXcgU3RyaW5nWzBdOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmaWxlc0luY2x1ZGVkID0gbmV3IFZlY3RvclNldCgpOwotICAgICAgICAgICAgZmlsZXNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgICAgIGZpbGVzRXhjbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7Ci0gICAgICAgICAgICBkaXJzSW5jbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7Ci0gICAgICAgICAgICBkaXJzTm90SW5jbHVkZWQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICBkaXJzRXhjbHVkZWQgPSBuZXcgVmVjdG9yU2V0KCk7CisgICAgICAgICAgICBmaWxlc0luY2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgICAgICBmaWxlc05vdEluY2x1ZGVkID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CisgICAgICAgICAgICBkaXJzSW5jbHVkZWQgPSBuZXcgVmVjdG9yU2V0PD4oKTsKKyAgICAgICAgICAgIGRpcnNOb3RJbmNsdWRlZCA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICAgICAgZGlyc0V4Y2x1ZGVkID0gbmV3IFZlY3RvclNldDw+KCk7CiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGN3ZCA9IGZ0cC5wcmludFdvcmtpbmdEaXJlY3RvcnkoKTsKQEAgLTI4MCw3ICsyODMsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogdGhpcyByb3V0aW5lIGlzIGFjdHVhbGx5IGNoZWNraW5nIGFsbCB0aGUgaW5jbHVkZSBwYXR0ZXJucyBpbgogICAgICAgICAgKiBvcmRlciB0byBhdm9pZCBzY2FubmluZyBldmVyeXRoaW5nIHVuZGVyIGJhc2UgZGlyCkBAIC0yODgsNyArMjkwLDcgQEAKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgdm9pZCBjaGVja0luY2x1ZGVQYXR0ZXJucygpIHsKIAotICAgICAgICAgICAgSGFzaHRhYmxlIG5ld3Jvb3RzID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBuZXdyb290cyA9IG5ldyBIYXNodGFibGU8PigpOwogICAgICAgICAgICAgLy8gcHV0IGluIHRoZSBuZXdyb290cyB2ZWN0b3IgdGhlIGluY2x1ZGUgcGF0dGVybnMgd2l0aG91dAogICAgICAgICAgICAgLy8gd2lsZGNhcmQgdG9rZW5zCiAgICAgICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlIDogaW5jbHVkZXMpIHsKQEAgLTMxMyw3NSArMzE1LDY4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG9ubHkgc2NhbiBkaXJlY3RvcmllcyB0aGF0IGNhbiBpbmNsdWRlIG1hdGNoZWQgZmlsZXMgb3IKICAgICAgICAgICAgICAgICAvLyBkaXJlY3RvcmllcwotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGVudW0yID0gbmV3cm9vdHMua2V5cygpOworICAgICAgICAgICAgICAgIG5ld3Jvb3RzLmZvckVhY2goCisgICAgICAgICAgICAgICAgICAgIChrLCB2KSAtPiBzY2FuUm9vdChuZXcgQW50RlRQRmlsZShiYXNlRlRQRmlsZSwgayksIHYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgd2hpbGUgKGVudW0yLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ZWxlbWVudCA9IChTdHJpbmcpIGVudW0yLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcmlnaW5hbHBhdHRlcm4gPSAoU3RyaW5nKSBuZXdyb290cy5nZXQoY3VycmVudGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBBbnRGVFBGaWxlIG15ZmlsZSA9IG5ldyBBbnRGVFBGaWxlKGJhc2VGVFBGaWxlLCBjdXJyZW50ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdHJhdmVyc2VzU3ltbGlua3MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBwcml2YXRlIHZvaWQgc2NhblJvb3QoQW50RlRQRmlsZSBteWZpbGUsIFN0cmluZyBvcmlnaW5hbHBhdHRlcm4pIHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ZWxlbWVudDsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNPSyA9IHRydWU7CisgICAgICAgICAgICBib29sZWFuIHRyYXZlcnNlc1N5bWxpbmtzID0gZmFsc2U7CisgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IG51bGw7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG15ZmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VSZW1vdGVTZW5zaXRpdml0eUNoZWNrKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSAmJiBpc0ZvbGxvd1N5bWxpbmtzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb29sIGNhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93ZSBkbyBub3QgbmVlZCB0byBzY2FuIGFsbCB0aGUgc3ViZGlycyBpbiB0aGUgcmVsYXRpdmUgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBteWZpbGUuZ2V0RmFzdFJlbGF0aXZlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLiAgV2Ugd2FudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRzIHRvIHNob3cgd2hhdCdzIHJlYWxseSBvbiB0aGUgZGlzaywgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGRvdWJsZSBjaGVjay4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gbXlmaWxlLmdldFJlbGF0aXZlUGF0aCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXNTeW1saW5rcyA9IG15ZmlsZS5pc1RyYXZlcnNlU3ltbGlua3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oYmUsIHRhc2suZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChteWZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBmb3JjZVJlbW90ZVNlbnNpdGl2aXR5Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkCisgICAgICAgICAgICAgICAgICAgICYmIHJlbW90ZVN5c3RlbUNhc2VTZW5zaXRpdmUgJiYgaXNGb2xsb3dTeW1saW5rcygpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNvb2wgY2FzZSwKKyAgICAgICAgICAgICAgICAgICAgLy93ZSBkbyBub3QgbmVlZCB0byBzY2FuIGFsbCB0aGUgc3ViZGlycyBpbiB0aGUgcmVsYXRpdmUgcGF0aAorICAgICAgICAgICAgICAgICAgICBwYXRoID0gbXlmaWxlLmdldEZhc3RSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXkgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtLiAgV2Ugd2FudAorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0cyB0byBzaG93IHdoYXQncyByZWFsbHkgb24gdGhlIGRpc2ssIHNvCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIGNoZWNrLgorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG15ZmlsZS5nZXRSZWxhdGl2ZVBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYXZlcnNlc1N5bWxpbmtzID0gbXlmaWxlLmlzVHJhdmVyc2VTeW1saW5rcygpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGJlLCB0YXNrLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaXNPSyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc09LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ZWxlbWVudCA9IHBhdGgucmVwbGFjZSh0YXNrLmdldFNlcGFyYXRvcigpLmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNGb2xsb3dTeW1saW5rcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdHJhdmVyc2VzU3ltbGlua3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzT0sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc09LKSB7CisgICAgICAgICAgICAgICAgY3VycmVudGVsZW1lbnQgPSBwYXRoLnJlcGxhY2UodGFzay5nZXRTZXBhcmF0b3IoKS5jaGFyQXQoMCksIEZpbGUuc2VwYXJhdG9yQ2hhcik7CisgICAgICAgICAgICAgICAgaWYgKCFpc0ZvbGxvd1N5bWxpbmtzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdHJhdmVyc2VzU3ltbGlua3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG15ZmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5jbHVkZWQoY3VycmVudGVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50Rm9ySW5jbHVkZWREaXIoY3VycmVudGVsZW1lbnQsIG15ZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ZWxlbWVudC5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ZWxlbWVudC5jaGFyQXQoY3VycmVudGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxlbmd0aCgpIC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ZWxlbWVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRlbGVtZW50ICsgRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5kaXIobXlmaWxlLmdldEFic29sdXRlUGF0aCgpLCBjdXJyZW50ZWxlbWVudCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG9yaWdpbmFscGF0dGVybi5lcXVhbHMoY3VycmVudGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoY3VycmVudGVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3JpZ2luYWxwYXR0ZXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50ZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRmlsZShjdXJyZW50ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChteWZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbmNsdWRlZChjdXJyZW50ZWxlbWVudCkgJiYgIWN1cnJlbnRlbGVtZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRGlyKGN1cnJlbnRlbGVtZW50LCBteWZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50ZWxlbWVudC5pc0VtcHR5KCkgJiYgY3VycmVudGVsZW1lbnQuY2hhckF0KGN1cnJlbnRlbGVtZW50Lmxlbmd0aCgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGVsZW1lbnQgKz0gRmlsZS5zZXBhcmF0b3JDaGFyOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmRpcihteWZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGN1cnJlbnRlbGVtZW50LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDYXNlU2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICYmIG9yaWdpbmFscGF0dGVybi5lcXVhbHMoY3VycmVudGVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY291bnRGb3JJbmNsdWRlZEZpbGUoY3VycmVudGVsZW1lbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzQ2FzZVNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3JpZ2luYWxwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzSWdub3JlQ2FzZShjdXJyZW50ZWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudEZvckluY2x1ZGVkRmlsZShjdXJyZW50ZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIHNjYW5zIGEgcGFydGljdWxhciBkaXJlY3RvcnkuIHBvcHVsYXRlcyB0aGUgc2Nhbm5lZERpcnMgY2FjaGUuCiAgICAgICAgICAqCkBAIC0zOTksMTIgKzM5NCwxMiBAQAogICAgICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV0ZVBhdGggPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICghdnBhdGguZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBjb21wbGV0ZVBhdGg7CisgICAgICAgICAgICAgICAgaWYgKHZwYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVBhdGggPSByb290UGF0aDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVBhdGggPSByb290UGF0aCArIHRhc2suZ2V0U2VwYXJhdG9yKCkKICAgICAgICAgICAgICAgICAgICAgICAgICsgdnBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsIHRhc2suZ2V0U2VwYXJhdG9yKCkuY2hhckF0KDApKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVBhdGggPSByb290UGF0aDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRlRQRmlsZVtdIG5ld2ZpbGVzID0gbGlzdEZpbGVzKGNvbXBsZXRlUGF0aCwgZmFsc2UpOwogCkBAIC00NjIsNyArNDU3LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChpc0luY2x1ZGVkKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghaXNFeGNsdWRlZChuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZWxlY3RlZChuYW1lLCAoRmlsZSkgc2Nhbm5lZERpcnMuZ2V0KG5hbWUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTZWxlY3RlZChuYW1lLCBzY2FubmVkRGlycy5nZXQobmFtZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0luY2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc0V4Y2x1ZGVkLmFkZEVsZW1lbnQobmFtZSk7CkBAIC01MTcsMTkgKzUxMiwyMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiB0ZW1wb3JhcnkgdGFibGUgdG8gc3BlZWQgdXAgdGhlIHZhcmlvdXMgc2Nhbm5pbmcgbWV0aG9kcyBiZWxvdwogICAgICAgICAgKgogICAgICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBNYXAgZmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZUUEZpbGVbXT4gZmlsZUxpc3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIExpc3Qgb2YgYWxsIHNjYW5uZWQgZGlyZWN0b3JpZXMuCiAgICAgICAgICAqCiAgICAgICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICAgICAqLwogCi0gICAgICAgIHByaXZhdGUgTWFwIHNjYW5uZWREaXJzID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGVFBGaWxlUHJveHk+IHNjYW5uZWREaXJzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBIYXMgdGhlIGRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBwYXRoIHJlbGF0aXZlIHRvIHRoZSBiYXNlCkBAIC01NTAsNiArNTQ3LDcgQEAKICAgICAgICAgICAgIGZpbGVMaXN0TWFwLmNsZWFyKCk7CiAgICAgICAgICAgICBzY2FubmVkRGlycy5jbGVhcigpOwogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIGxpc3QgdGhlIGZpbGVzIHByZXNlbnQgaW4gb25lIGRpcmVjdG9yeS4KICAgICAgICAgICogQHBhcmFtIGRpcmVjdG9yeSBmdWxsIHBhdGggb24gdGhlIHJlbW90ZSBzaWRlCkBAIC01NjEsOCArNTU5LDcgQEAKICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50UGF0aCA9IGRpcmVjdG9yeTsKICAgICAgICAgICAgIGlmIChjaGFuZ2VkaXIpIHsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoZGlyZWN0b3J5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGggPSBmdHAucHJpbnRXb3JraW5nRGlyZWN0b3J5KCk7CkBAIC01NzIsOSArNTY5LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaWxlTGlzdE1hcC5jb250YWluc0tleShjdXJyZW50UGF0aCkpIHsKICAgICAgICAgICAgICAgICB0YXNrLmxvZygiZmlsZWxpc3QgbWFwIHVzZWQgaW4gbGlzdGluZyBmaWxlcyIsIFByb2plY3QuTVNHX0RFQlVHKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChGVFBGaWxlW10pIGZpbGVMaXN0TWFwLmdldChjdXJyZW50UGF0aCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlTGlzdE1hcC5nZXQoY3VycmVudFBhdGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRlRQRmlsZVtdIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBGVFBGaWxlW10gcmVzdWx0OwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdHAubGlzdEZpbGVzKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKQEAgLTU5Niw2ICs1OTMsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBjZCBpbnRvIG9uZSBkaXJlY3RvcnkgYW5kCiAgICAgICAgICAqIGxpc3QgdGhlIGZpbGVzIHByZXNlbnQgaW4gb25lIGRpcmVjdG9yeS4KQEAgLTYwNSw2ICs2MDMsNyBAQAogICAgICAgICBwdWJsaWMgRlRQRmlsZVtdIGxpc3RGaWxlcyhTdHJpbmcgZGlyZWN0b3J5KSB7CiAgICAgICAgICAgICByZXR1cm4gbGlzdEZpbGVzKGRpcmVjdG9yeSwgdHJ1ZSk7CiAgICAgICAgIH0KKwogICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tSZW1vdGVTZW5zaXRpdml0eShGVFBGaWxlW10gYXJyYXksIFN0cmluZyBkaXJlY3RvcnkpIHsKICAgICAgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNjEzLDggKzYxMiw4IEBACiAgICAgICAgICAgICBTdHJpbmcgdGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgIGZvciAoaW50IGljb3VudGVyID0gMDsgaWNvdW50ZXIgPCBhcnJheS5sZW5ndGg7IGljb3VudGVyKyspIHsKICAgICAgICAgICAgICAgICBpZiAoYXJyYXlbaWNvdW50ZXJdICE9IG51bGwgJiYgYXJyYXlbaWNvdW50ZXJdLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhcnJheVtpY291bnRlcl0uZ2V0TmFtZSgpLmVxdWFscygiLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKS5lcXVhbHMoIi4uIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEiLiIuZXF1YWxzKGFycmF5W2ljb3VudGVyXS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhIi4uIi5lcXVhbHMoYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGZpZGRsZU5hbWUoYXJyYXlbaWNvdW50ZXJdLmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmxvZygid2lsbCB0cnkgdG8gY2QgdG8gIgpAQCAtNjU0LDYgKzY1Myw3IEBACiAgICAgICAgICAgICAgICAgcmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpZGRsZU5hbWUoU3RyaW5nIG9yaWdpbikgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgZm9yIChjaGFyIGNoIDogb3JpZ2luLnRvQ2hhckFycmF5KCkpIHsKQEAgLTY2Nyw2ICs2NjcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIGFuIEFudEZUUEZpbGUgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIHJlbW90ZSBmaWxlCiAgICAgICAgICAqIEBzaW5jZSBBbnQgMS42CkBAIC02OTEsNiArNjkyLDcgQEAKICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiByZWxhdGl2ZVBhdGhDYWxjdWxhdGVkID0gZmFsc2U7CiAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gdHJhdmVyc2VzU3ltbGlua3MgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZlUGF0aCA9ICIiOworCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgKiBAcGFyYW0gY2xpZW50IGZ0cCBjbGllbnQgdmFyaWFibGUKQEAgLTcwMiw2ICs3MDQsNyBAQAogICAgICAgICAgICAgICAgIHRoaXMuZnRwRmlsZSA9IGZ0cEZpbGU7CiAgICAgICAgICAgICAgICAgdGhpcy5jdXJwd2QgPSBjdXJwd2Q7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogb3RoZXIgY29uc3RydWN0b3IKICAgICAgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBmaWxlCkBAIC03MTAsNyArNzEzLDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBBbnRGVFBGaWxlKEFudEZUUEZpbGUgcGFyZW50LCBTdHJpbmcgcGF0aCkgewogICAgICAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gcGFyZW50LmNsaWVudDsKLSAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiBwYXRoRWxlbWVudHMgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChwYXRoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aEVsZW1lbnRzID0gU2VsZWN0b3JVdGlscy50b2tlbml6ZVBhdGgocGF0aCk7CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0aGlzLmNsaWVudC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBzaG91bGQgbm90IGhhcHBlbiwgZXhjZXB0IGlmIHBhcmVudCBoYXMgYmVlbiBkZWxldGVkIGJ5IGFub3RoZXIgcHJvY2VzcwpAQCAtNzE5LDI4ICs3MjIsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IHBhcmVudC5nZXRBYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICIgKyBwYXJlbnQuY3VycHdkKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICVzIiwgcGFyZW50LmN1cnB3ZCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnRQYXRoRWxlbWVudCA6IHBhdGhFbGVtZW50cykgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0aGlzLmNsaWVudC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGN1cnJlbnRQYXRoRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCAmJiAhaXNDYXNlU2Vuc2l0aXZlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAocmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZSB8fCAhcmVtb3RlU2Vuc2l0aXZpdHlDaGVja2VkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCA9IGZpbmRQYXRoRWxlbWVudENhc2VVbnNlbnNpdGl2ZSh0aGlzLmN1cnB3ZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoRWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5jbGllbnQuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShjdXJyZW50UGF0aEVsZW1lbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKSAmJiAocmVtb3RlU3lzdGVtQ2FzZVNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXJlbW90ZVNlbnNpdGl2aXR5Q2hlY2tlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGhFbGVtZW50ID0gZmluZFBhdGhFbGVtZW50Q2FzZVVuc2Vuc2l0aXZlKHRoaXMuY3VycHdkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoRWxlbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UGF0aEVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJwd2QgPSBnZXRDdXJwd2RQbHVzRmlsZVNlcCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UGF0aEVsZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IGdldEN1cnB3ZFBsdXNGaWxlU2VwKCkgKyBjdXJyZW50UGF0aEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHdvcmtpbmcgZGlyIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50UGF0aEVsZW1lbnQgKyAiIGZyb20gIiArIHRoaXMuY3VycHdkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNoYW5nZSB3b3JraW5nIGRpciB0byAlcyBmcm9tICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhdGhFbGVtZW50LCB0aGlzLmN1cnB3ZCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBTdHJpbmcgbGFzdHBhdGhlbGVtZW50ID0gcGF0aEVsZW1lbnRzLmdldChwYXRoRWxlbWVudHMuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICAgICAgdGhpcy5mdHBGaWxlID0gZ2V0RmlsZShsaXN0RmlsZXModGhpcy5jdXJwd2QpLCBsYXN0cGF0aGVsZW1lbnQpOwpAQCAtNzYwLDcgKzc2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKEZUUEZpbGUgZmlsZSA6IGZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzb3VnaHRQYXRoRWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzb3VnaHRQYXRoRWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTc3MSw4ICs3NzMsOSBAQAogICAgICAgICAgICAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgZmlsZSBleGlzdHMKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiAoZnRwRmlsZSAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZSAhPSBudWxsOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIGlmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluaywgZmluZCBvdXQgdG8gd2hhdCBpdCBpcyBwb2ludGluZwogICAgICAgICAgICAgICogQHJldHVybiB0aGUgdGFyZ2V0IG9mIHRoZSBzeW1ib2xpYyBsaW5rCkBAIC03ODAsNiArNzgzLDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluaygpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5nZXRMaW5rKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZ2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlCiAgICAgICAgICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBmaWxlCkBAIC03ODcsNiArNzkxLDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5nZXROYW1lKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZpbGUKICAgICAgICAgICAgICAqIEByZXR1cm4gYWJzb2x1dGUgcGF0aCBhcyBzdHJpbmcKQEAgLTc5NCw2ICs3OTksNyBAQAogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEN1cnB3ZFBsdXNGaWxlU2VwKCkgKyBmdHBGaWxlLmdldE5hbWUoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIG91dCB0aGUgcmVsYXRpdmUgcGF0aCBhc3N1bWluZyB0aGF0IHRoZSBwYXRoIHVzZWQgdG8gY29uc3RydWN0CiAgICAgICAgICAgICAgKiB0aGlzIEFudEZUUEZpbGUgd2FzIHNwZWxsZWQgcHJvcGVybHkgd2l0aCByZWdhcmRzIHRvIGNhc2UuCkBAIC04MDgsNiArODE0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZmluZCBvdXQgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIHJvb3RQYXRoIG9mIHRoZSBlbmNsb3Npbmcgc2Nhbm5lci4KICAgICAgICAgICAgICAqIHRoaXMgcmVsYXRpdmUgcGF0aCBpcyBzcGVsbGVkIGV4YWN0bHkgbGlrZSBvbiBkaXNrLApAQCAtODM0LDYgKzg0MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGg7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogZ2V0IHRoZSByZWxhdGl2ZSBwYXRoIG9mIHRoaXMgZmlsZQogICAgICAgICAgICAgICogQHBhcmFtIGN1cnJlbnRQYXRoICAgICAgICAgIGJhc2UgcGF0aApAQCAtODQxLDM4ICs4NDksMzggQEAKICAgICAgICAgICAgICAqIEByZXR1cm4gcmVsYXRpdmUgcGF0aAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoU3RyaW5nIGN1cnJlbnRQYXRoLCBTdHJpbmcgY3VycmVudFJlbGF0aXZlUGF0aCkgewotICAgICAgICAgICAgICAgIFZlY3RvciBwYXRoRWxlbWVudHMgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChnZXRBYnNvbHV0ZVBhdGgoKSwgdGFzay5nZXRTZXBhcmF0b3IoKSk7Ci0gICAgICAgICAgICAgICAgVmVjdG9yIHBhdGhFbGVtZW50czIgPSBTZWxlY3RvclV0aWxzLnRva2VuaXplUGF0aChjdXJyZW50UGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0U2VwYXJhdG9yKCkpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZWxQYXRoID0gY3VycmVudFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aEVsZW1lbnRzID0gU2VsZWN0b3JVdGlscworICAgICAgICAgICAgICAgICAgICAudG9rZW5pemVQYXRoKGdldEFic29sdXRlUGF0aCgpLCB0YXNrLmdldFNlcGFyYXRvcigpKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGF0aEVsZW1lbnRzMiA9IFNlbGVjdG9yVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgLnRva2VuaXplUGF0aChjdXJyZW50UGF0aCwgdGFzay5nZXRTZXBhcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciByZWxQYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoY3VycmVudFJlbGF0aXZlUGF0aCk7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBwYXRoRWxlbWVudHMuc2l6ZSgpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IHBjb3VudCA9IHBhdGhFbGVtZW50czIuc2l6ZSgpOyBwY291bnQgPCBzaXplOyBwY291bnQrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3VycmVudEVsZW1lbnQgPSAoU3RyaW5nKSBwYXRoRWxlbWVudHMuZWxlbWVudEF0KHBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjdXJyZW50RWxlbWVudCA9IHBhdGhFbGVtZW50cy5nZXQocGNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgRlRQRmlsZVtdIHRoZUZpbGVzID0gbGlzdEZpbGVzKGN1cnJlbnRQYXRoKTsKICAgICAgICAgICAgICAgICAgICAgRlRQRmlsZSB0aGVGaWxlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRoZUZpbGUgPSBnZXRGaWxlKHRoZUZpbGVzLCBjdXJyZW50RWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWxQYXRoLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGggPSByZWxQYXRoICsgdGFzay5nZXRTZXBhcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxQYXRoLmFwcGVuZCh0YXNrLmdldFNlcGFyYXRvcigpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAodGhlRmlsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaXQgYSBoaWRkZW4gZmlsZSBhc3N1bWUgbm90IGEgc3ltbGluawotICAgICAgICAgICAgICAgICAgICAgICAgcmVsUGF0aCA9IHJlbFBhdGggKyBjdXJyZW50RWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoID0gY3VycmVudFBhdGggKyB0YXNrLmdldFNlcGFyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50RWxlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGguYXBwZW5kKGN1cnJlbnRFbGVtZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRoICs9IHRhc2suZ2V0U2VwYXJhdG9yKCkgKyBjdXJyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2subG9nKCJIaWRkZW4gZmlsZSAiICsgcmVsUGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFzc3VtZWQgdG8gbm90IGJlIGEgc3ltbGluay4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZXNTeW1saW5rcyA9IHRyYXZlcnNlc1N5bWxpbmtzIHx8IHRoZUZpbGUuaXNTeW1ib2xpY0xpbmsoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbFBhdGggPSByZWxQYXRoICsgdGhlRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCA9IGN1cnJlbnRQYXRoICsgdGFzay5nZXRTZXBhcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGhlRmlsZS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWxQYXRoLmFwcGVuZCh0aGVGaWxlLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGF0aCArPSB0YXNrLmdldFNlcGFyYXRvcigpICsgdGhlRmlsZS5nZXROYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbFBhdGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbFBhdGgudG9TdHJpbmcoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIGEgZmlsZSBtYXRjaGluZyBhIHN0cmluZyBpbiBhbiBhcnJheSBvZiBGVFBGaWxlLgogICAgICAgICAgICAgICogVGhpcyBtZXRob2Qgd2lsbCBmaW5kICJhbHBoYSIgd2hlbiByZXF1ZXN0ZWQgZm9yICJBTFBIQSIKQEAgLTg4NiwxOSArODk0LDE1IEBACiAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvciAoaW50IGZjb3VudCA9IDA7IGZjb3VudCA8IHRoZUZpbGVzLmxlbmd0aDsgZmNvdW50KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUZpbGVzW2Zjb3VudF0uZ2V0TmFtZSgpLmVxdWFscyhsYXN0cGF0aGVsZW1lbnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZUZpbGVzW2Zjb3VudF07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nhc2VTZW5zaXRpdmUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGVGaWxlc1tmY291bnRdLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RwYXRoZWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlRmlsZXNbZmNvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICBQcmVkaWNhdGU8U3RyaW5nPiB0ZXN0ID0KKyAgICAgICAgICAgICAgICAgICAgaXNDYXNlU2Vuc2l0aXZlKCkgPyBsYXN0cGF0aGVsZW1lbnQ6OmVxdWFscworICAgICAgICAgICAgICAgICAgICAgICAgOiBsYXN0cGF0aGVsZW1lbnQ6OmVxdWFsc0lnbm9yZUNhc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmVhbS5vZih0aGVGaWxlcykKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGYgLT4gdGVzdC50ZXN0KGYuZ2V0TmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiB0ZWxsIGlmIGEgZmlsZSBpcyBhIGRpcmVjdG9yeS4KICAgICAgICAgICAgICAqIG5vdGUgdGhhdCBpdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igc3ltYm9saWMgbGlua3MgcG9pbnRpbmcgdG8gZGlyZWN0b3JpZXMuCkBAIC05MDcsNiArOTExLDcgQEAKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewogICAgICAgICAgICAgICAgIHJldHVybiBmdHBGaWxlLmlzRGlyZWN0b3J5KCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogdGVsbCBpZiBhIGZpbGUgaXMgYSBzeW1ib2xpYyBsaW5rCiAgICAgICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzeW1ib2xpYyBsaW5rcwpAQCAtOTE0LDYgKzkxOSw3IEBACiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bWJvbGljTGluaygpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZnRwRmlsZS5pc1N5bWJvbGljTGluaygpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIHJldHVybiB0aGUgYXR0YWNoZWQgRlRQIGNsaWVudCBvYmplY3QuCiAgICAgICAgICAgICAgKiBXYXJuaW5nIDogdGhpcyBpbnN0YW5jZSBpcyByZWFsbHkgc2hhcmVkIHdpdGggdGhlIGVuY2xvc2luZyBjbGFzcy4KQEAgLTkzMCw2ICs5MzYsNyBAQAogICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0Q3VycHdkKFN0cmluZyBjdXJwd2QpIHsKICAgICAgICAgICAgICAgICB0aGlzLmN1cnB3ZCA9IGN1cnB3ZDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiByZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgQW50RlRQRmlsZS4KICAgICAgICAgICAgICAqIG9mIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgaXRzZWxmIGluIGNhc2Ugb2YgQW50RlRQUm9vdEZpbGUKQEAgLTkzOCw2ICs5NDUsNyBAQAogICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDdXJwd2QoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnB3ZDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiByZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgQW50RlRQRmlsZS4KICAgICAgICAgICAgICAqIG9mIHRoZSBmdWxsIHBhdGggb2YgdGhlIGZpbGUgaXRzZWxmIGluIGNhc2Ugb2YgQW50RlRQUm9vdEZpbGUKQEAgLTk0OSw2ICs5NTcsNyBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBzZXAgPSB0YXNrLmdldFNlcGFyYXRvcigpOwogICAgICAgICAgICAgICAgIHJldHVybiBjdXJwd2QuZW5kc1dpdGgoc2VwKSA/IGN1cnB3ZCA6IGN1cnB3ZCArIHNlcDsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIG91dCBpZiBhIHN5bWJvbGljIGxpbmsgaXMgZW5jb3VudGVyZWQgaW4gdGhlIHJlbGF0aXZlIHBhdGggb2YgdGhpcyBmaWxlCiAgICAgICAgICAgICAgKiBmcm9tIHJvb3RQYXRoLgpAQCAtOTY5LDE2ICs5NzgsMTkgQEAKICAgICAgICAgICAgICAqIEdldCBhIHN0cmluZyByZXAgb2YgdGhpcyBvYmplY3QuCiAgICAgICAgICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHB3ZCBhbmQgdGhlIGZpbGUuCiAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gIkFudEZ0cEZpbGU6ICIgKyBjdXJwd2QgKyAiJSIgKyBmdHBGaWxlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgLyoqCiAgICAgICAgICAqIHNwZWNpYWwgY2xhc3MgdG8gcmVwcmVzZW50IHRoZSByZW1vdGUgZGlyZWN0b3J5IGl0c2VsZgogICAgICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAgICAgKi8KICAgICAgICAgcHJvdGVjdGVkIGNsYXNzIEFudEZUUFJvb3RGaWxlIGV4dGVuZHMgQW50RlRQRmlsZSB7CiAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyByZW1vdGVkaXI7CisKICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICogY29uc3RydWN0b3IKICAgICAgICAgICAgICAqIEBwYXJhbSBhY2xpZW50IEZUUCBjbGllbnQKQEAgLTk5NCwyNCArMTAwNiwyOSBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lLCB0YXNrLmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgKiBAcmV0dXJuIGFic29sdXRlIHBhdGgKICAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFic29sdXRlUGF0aCgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDdXJwd2QoKTsKICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBmaW5kIG91dCB0aGUgcmVsYXRpdmUgcGF0aCB0byByb290CiAgICAgICAgICAgICAgKiBAcmV0dXJuIGVtcHR5IHN0cmluZwogICAgICAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhY3R1YWxseSBuZXZlcgogICAgICAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgYWN0dWFsbHkgbmV2ZXIKICAgICAgICAgICAgICAqLworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGF0aXZlUGF0aCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKwogICAgIC8qKgogICAgICAqIGNoZWNrIEZUUEZpbGVzIHRvIGNoZWNrIHdoZXRoZXIgdGhleSBmdW5jdGlvbiBhcyBkaXJlY3RvcmllcyB0b28KICAgICAgKiB0aGUgRlRQRmlsZSBBUEkgc2VlbSB0byBtYWtlIGRpcmVjdG9yeSBhbmQgc3ltYm9saWMgbGlua3MgaW5jb21wYXRpYmxlCkBAIC0xMDI2LDcgKzEwNDMsOCBAQAogICAgICAgICBTdHJpbmcgY3VycmVudFdvcmtpbmdEaXIgPSBudWxsOwogICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0cnkgewpAQCAtMTA1MiwxNCArMTA3MCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbWViYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjZCBiYWNrIHRvICIgKyBkaXIgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWxlIGNoZWNraW5nIGEgc3ltbGluayIpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY2QgYmFjayB0byAlcyB3aGlsZSBjaGVja2luZyBhIHN5bWxpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKICAgICAvKioKICAgICAgKiBjaGVjayBGVFBGaWxlcyB0byBjaGVjayB3aGV0aGVyIHRoZXkgZnVuY3Rpb24gYXMgZGlyZWN0b3JpZXMgdG9vCiAgICAgICogdGhlIEZUUEZpbGUgQVBJIHNlZW0gdG8gbWFrZSBkaXJlY3RvcnkgYW5kIHN5bWJvbGljIGxpbmtzIGluY29tcGF0aWJsZQpAQCAtMTA3MCwxMiArMTA5MCw3IEBACiAgICAgICogQHNpbmNlIGFudCAxLjYKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gaXNGdW5jdGlvbmluZ0FzRmlsZShGVFBDbGllbnQgZnRwLCBTdHJpbmcgZGlyLCBGVFBGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAhaXNGdW5jdGlvbmluZ0FzRGlyZWN0b3J5KGZ0cCwgZGlyLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuICFmaWxlLmlzRGlyZWN0b3J5KCkgJiYgKGZpbGUuaXNGaWxlKCkgfHwgIWlzRnVuY3Rpb25pbmdBc0RpcmVjdG9yeShmdHAsIGRpciwgZmlsZSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA5MSw3ICsxMTA2LDYgQEAKICAgICAgICAgaC5leGVjdXRlKHIsIGRlc2NyKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIEZvciBlYWNoIGZpbGUgaW4gdGhlIGZpbGVzZXQsIGRvIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb246IHNlbmQsIGdldCwKICAgICAgKiBkZWxldGUsIG9yIGxpc3QuCkBAIC0xMTIyLDE2ICsxMTM2LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkc2ZpbGVzID0gZHMuZ2V0SW5jbHVkZWRGaWxlcygpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBkaXIgPSBudWxsOwogCi0gICAgICAgIGlmICgoZHMuZ2V0QmFzZWRpcigpID09IG51bGwpCi0gICAgICAgICAgICAmJiAoKHRhc2suZ2V0QWN0aW9uKCkgPT0gRlRQVGFzay5TRU5EX0ZJTEVTKSB8fCAodGFzay5nZXRBY3Rpb24oKSA9PSBGVFBUYXNrLkdFVF9GSUxFUykpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0IGZvciBzZW5kICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbmQgZ2V0IGFjdGlvbnMiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgodGFzay5nZXRBY3Rpb24oKSA9PSBGVFBUYXNrLlNFTkRfRklMRVMpIHx8ICh0YXNrLmdldEFjdGlvbigpID09IEZUUFRhc2suR0VUX0ZJTEVTKSkgewotICAgICAgICAgICAgICAgIGRpciA9IGRzLmdldEJhc2VkaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGRzLmdldEJhc2VkaXIoKSA9PSBudWxsCisgICAgICAgICAgICAmJiAodGFzay5nZXRBY3Rpb24oKSA9PSBGVFBUYXNrLlNFTkRfRklMRVMgfHwgdGFzay5nZXRBY3Rpb24oKSA9PSBGVFBUYXNrLkdFVF9GSUxFUykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAidGhlIGRpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgZm9yIHNlbmQgYW5kIGdldCBhY3Rpb25zIik7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGRpciA9IG51bGw7CisgICAgICAgIGlmICh0YXNrLmdldEFjdGlvbigpID09IEZUUFRhc2suU0VORF9GSUxFUyB8fCB0YXNrLmdldEFjdGlvbigpID09IEZUUFRhc2suR0VUX0ZJTEVTKSB7CisgICAgICAgICAgICBkaXIgPSBkcy5nZXRCYXNlZGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJZiB3ZSBhcmUgZG9pbmcgYSBsaXN0aW5nLCB3ZSBuZWVkIHRoZSBvdXRwdXQgc3RyZWFtIGNyZWF0ZWQgbm93LgpAQCAtMTE1MiwxMSArMTE2NSw3IEBACiAgICAgICAgICAgICAgICAgLy8gdGhlIHRydW5rIGRvZXMgbm90IGxldCBpdHNlbGYgYmUgcmVtb3ZlZCBiZWZvcmUgdGhlIGxlYXZlcwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBkc2ZpbGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkc2ZpbGUgPSBkc2ZpbGVzW2ldOwotICAgICAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKGgsIG5ldyBSZXRyeWFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtRGlyKGZ0cCwgZHNmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9LCBkc2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKGgsICgpIC0+IHJtRGlyKGZ0cCwgZHNmaWxlKSwgZHNmaWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkV3JpdGVyIGZidyA9IGJ3OwpAQCAtMTE2NiwzMCArMTE3NSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNaWxsaXNlY29uZHModGFzay5nZXRBY3Rpb24oKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBkc2ZpbGUgOiBkc2ZpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgbmV3IFJldHJ5YWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGFzay5nZXRBY3Rpb24oKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUUFRhc2suU0VORF9GSUxFUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRGaWxlKGZ0cCwgZmRpciwgZHNmaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUUFRhc2suR0VUX0ZJTEVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmdHAsIGZkaXIsIGRzZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVFBUYXNrLkRFTF9GSUxFUzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbEZpbGUoZnRwLCBkc2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRQVGFzay5MSVNUX0ZJTEVTOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEZpbGUoZnRwLCBmYncsIGRzZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVFBUYXNrLkNITU9EOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChmdHAsICJjaG1vZCAiICsgdGFzay5nZXRDaG1vZCgpICsgIiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcmVzb2x2ZUZpbGUoZHNmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnJlZCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInVua25vd24gZnRwIGFjdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB0YXNrLmdldEFjdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVSZXRyeWFibGUoaCwgKCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0YXNrLmdldEFjdGlvbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVFBUYXNrLlNFTkRfRklMRVM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRGaWxlKGZ0cCwgZmRpciwgZHNmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGVFBUYXNrLkdFVF9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZShmdHAsIGZkaXIsIGRzZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRQVGFzay5ERUxfRklMRVM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbEZpbGUoZnRwLCBkc2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZUUFRhc2suTElTVF9GSUxFUzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEZpbGUoZnRwLCBmYncsIGRzZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRlRQVGFzay5DSE1PRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChmdHAsICJjaG1vZCAiICsgdGFzay5nZXRDaG1vZCgpICsgIiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvbHZlRmlsZShkc2ZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ1bmtub3duIGZ0cCBhY3Rpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0QWN0aW9uKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9LCBkc2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyMTgsMjkgKzEyMjUsMjYgQEAKICAgICAgICAgdHJhbnNmZXJyZWQgPSAwOwogICAgICAgICBza2lwcGVkID0gMDsKIAotICAgICAgICBpZiAodGFzay5nZXRGaWxlc2V0cygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmICh0YXNrLmdldEZpbGVzZXRzKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImF0IGxlYXN0IG9uZSBmaWxlc2V0IG11c3QgYmUgc3BlY2lmaWVkLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZ2V0IGZpbGVzIGZyb20gZmlsZXNldHMKLSAgICAgICAgICAgIGZpbmFsIGludCBzaXplID0gdGFzay5nZXRGaWxlc2V0cygpLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSB0YXNrLmdldEZpbGVzZXRzKCkuZWxlbWVudEF0KGkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGZzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJGaWxlcyhmdHAsIGZzKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZ2V0IGZpbGVzIGZyb20gZmlsZXNldHMKKyAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogdGFzay5nZXRGaWxlc2V0cygpKSB7CisgICAgICAgICAgICBpZiAoZnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyYW5zZmVyRmlsZXMoZnRwLCBmcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICB0YXNrLmxvZyh0cmFuc2ZlcnJlZCArICIgIiArIEZUUFRhc2suQUNUSU9OX1RBUkdFVF9TVFJTW3Rhc2suZ2V0QWN0aW9uKCldICsgIiAiCi0gICAgICAgICAgICAgICAgICsgRlRQVGFzay5DT01QTEVURURfQUNUSU9OX1NUUlNbdGFzay5nZXRBY3Rpb24oKV0pOworICAgICAgICB0YXNrLmxvZygKKyAgICAgICAgICAgIHRyYW5zZmVycmVkICsgIiAiICsgRlRQVGFzay5BQ1RJT05fVEFSR0VUX1NUUlNbdGFzay5nZXRBY3Rpb24oKV0KKyAgICAgICAgICAgICAgICArICIgIiArIEZUUFRhc2suQ09NUExFVEVEX0FDVElPTl9TVFJTW3Rhc2suZ2V0QWN0aW9uKCldKTsKICAgICAgICAgaWYgKHNraXBwZWQgIT0gMCkgewotICAgICAgICAgICAgdGFzay5sb2coc2tpcHBlZCArICIgIiArIEZUUFRhc2suQUNUSU9OX1RBUkdFVF9TVFJTW3Rhc2suZ2V0QWN0aW9uKCldCi0gICAgICAgICAgICAgICAgICAgICArICIgd2VyZSBub3Qgc3VjY2Vzc2Z1bGx5ICIgKyBGVFBUYXNrLkNPTVBMRVRFRF9BQ1RJT05fU1RSU1t0YXNrLmdldEFjdGlvbigpXSk7CisgICAgICAgICAgICB0YXNrLmxvZygKKyAgICAgICAgICAgICAgICBza2lwcGVkICsgIiAiICsgRlRQVGFzay5BQ1RJT05fVEFSR0VUX1NUUlNbdGFzay5nZXRBY3Rpb24oKV0KKyAgICAgICAgICAgICAgICAgICAgKyAiIHdlcmUgbm90IHN1Y2Nlc3NmdWxseSAiCisgICAgICAgICAgICAgICAgICAgICsgRlRQVGFzay5DT01QTEVURURfQUNUSU9OX1NUUlNbdGFzay5nZXRBY3Rpb24oKV0pOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDb3JyZWN0IGEgZmlsZSBwYXRoIHRvIGNvcnJlc3BvbmQgdG8gdGhlIHJlbW90ZSBob3N0IHJlcXVpcmVtZW50cy4gVGhpcwogICAgICAqIGltcGxlbWVudGF0aW9uIGN1cnJlbnRseSBhc3N1bWVzIHRoYXQgdGhlIHJlbW90ZSBlbmQgY2FuIGhhbmRsZQpAQCAtMTI1MywxMSArMTI1Nyw5IEBACiAgICAgICogQHJldHVybiB0aGUgZmlsZW5hbWUgYXMgaXQgd2lsbCBhcHBlYXIgb24gdGhlIHNlcnZlci4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVGaWxlKFN0cmluZyBmaWxlKSB7Ci0gICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpLmNoYXJBdCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmdldFNlcGFyYXRvcigpLmNoYXJBdCgwKSk7CisgICAgICAgIHJldHVybiBmaWxlLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3IuY2hhckF0KDApLCB0YXNrLmdldFNlcGFyYXRvcigpLmNoYXJBdCgwKSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFsbCBwYXJlbnQgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIGEgY29tcGxldGUgcmVsYXRpdmUKICAgICAgKiBwYXRobmFtZS4gQXR0ZW1wdHMgdG8gY3JlYXRlIGV4aXN0aW5nIGRpcmVjdG9yaWVzIHdpbGwgbm90IGNhdXNlCkBAIC0xMjc4LDcgKzEyODAsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgVmVjdG9yIHBhcmVudHMgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvcjxGaWxlPiBwYXJlbnRzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgICAgIFN0cmluZyBkaXJuYW1lOwogCiAgICAgICAgIHdoaWxlICgoZGlybmFtZSA9IGRpci5nZXRQYXJlbnQoKSkgIT0gbnVsbCkgewpAQCAtMTI5OCwxMyArMTMwMCwxNCBAQAogICAgICAgICAgICAgU3RyaW5nIHBhcmVudCA9IGRpci5nZXRQYXJlbnQoKTsKICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGlmICghZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkocmVzb2x2ZUZpbGUocGFyZW50KSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjaGFuZ2UgdG8gZGlyZWN0b3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB3aGlsZSAoaSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGlyID0gKEZpbGUpIHBhcmVudHMuZWxlbWVudEF0KGktLSk7CisgICAgICAgICAgICAgICAgZGlyID0gcGFyZW50cy5lbGVtZW50QXQoaS0tKTsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBkaXIgZXhpc3RzIGJ5IHRyeWluZyB0byBjaGFuZ2UgaW50byBpdC4KICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGRpci5nZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNvdWxkIG5vdCBjaGFuZ2UgdG8gaXQgLSB0cnkgdG8gY3JlYXRlIGl0CkBAIC0xMzE0LDggKzEzMTcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTWtEaXJGYWlsdXJlKGZ0cCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKCFmdHAuY2hhbmdlV29ya2luZ0RpcmVjdG9yeShkaXIuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY2hhbmdlIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3Rvcnk6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjaGFuZ2UgdG8gZGlyZWN0b3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGRpckNhY2hlLmFkZChkaXIpOwpAQCAtMTMyMyw2ICsxMzI3LDcgQEAKICAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGN3ZCk7CiAgICAgICAgIH0KICAgICB9CisKICAgICAvKioKICAgICAgKiBhdXRvIGZpbmQgdGhlIHRpbWUgZGlmZmVyZW5jZSBiZXR3ZWVuIGxvY2FsIGFuZCByZW1vdGUKICAgICAgKiBAcGFyYW0gZnRwIGhhbmRsZSB0byBmdHAgY2xpZW50CkBAIC0xMzM2LDEyICsxMzQxLDExIEBACiAgICAgICAgICAgICAvLyBjcmVhdGUgYSBsb2NhbCB0ZW1wb3JhcnkgZmlsZQogICAgICAgICAgICAgRklMRV9VVElMUy5jcmVhdGVOZXdGaWxlKHRlbXBGaWxlKTsKICAgICAgICAgICAgIGxvbmcgbG9jYWxUaW1lU3RhbXAgPSB0ZW1wRmlsZS5sYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW5zdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSk7CisgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGluc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0odGVtcEZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgIGZ0cC5zdG9yZUZpbGUodGVtcEZpbGUuZ2V0TmFtZSgpLCBpbnN0cmVhbSk7CiAgICAgICAgICAgICBpbnN0cmVhbS5jbG9zZSgpOwotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKTsKLSAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgRlRQRmlsZSBbXSBmdHBGaWxlcyA9IGZ0cC5saXN0RmlsZXModGVtcEZpbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7CisgICAgICAgICAgICAgICAgRlRQRmlsZVtdIGZ0cEZpbGVzID0gZnRwLmxpc3RGaWxlcyh0ZW1wRmlsZS5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIGlmIChmdHBGaWxlcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgICAgICBsb25nIHJlbW90ZVRpbWVTdGFtcCA9IGZ0cEZpbGVzWzBdLmdldFRpbWVzdGFtcCgpLmdldFRpbWUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gbG9jYWxUaW1lU3RhbXAgLSByZW1vdGVUaW1lU3RhbXA7CkBAIC0xMzU5LDYgKzEzNjMsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICB9CisKICAgICAvKioKICAgICAgKiAgZmluZCBhIHN1aXRhYmxlIG5hbWUgZm9yIGxvY2FsIGFuZCByZW1vdGUgdGVtcG9yYXJ5IGZpbGUKICAgICAgKi8KQEAgLTE0MjAsMTAgKzE0MjUsOSBAQAogICAgICAgICAgICAgICAgIHRhc2subG9nKCJDb3VsZCBub3QgZGF0ZSB0ZXN0IHJlbW90ZSBmaWxlOiAiICsgcmVtb3RlRmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICsgImFzc3VtaW5nIG91dCBvZiBkYXRlLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgZGF0ZSB0ZXN0IHJlbW90ZSBmaWxlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgZGF0ZSB0ZXN0IHJlbW90ZSBmaWxlOiAlcyIsCisgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwogICAgICAgICB9CiAKICAgICAgICAgbG9uZyByZW1vdGVUaW1lc3RhbXAgPSBmaWxlc1swXS5nZXRUaW1lc3RhbXAoKS5nZXRUaW1lKCkuZ2V0VGltZSgpOwpAQCAtMTQzMSwxNiArMTQzNSwxNiBAQAogICAgICAgICBsb25nIGFkanVzdGVkUmVtb3RlVGltZXN0YW1wID0gcmVtb3RlVGltZXN0YW1wICsgdGFzay5nZXRUaW1lRGlmZk1pbGxpcygpCiAgICAgICAgICAgICArIHRhc2suZ2V0R3JhbnVsYXJpdHlNaWxsaXMoKTsKIAotICAgICAgICBTdHJpbmdCdWZmZXIgbXNnOworICAgICAgICBTdHJpbmdCdWlsZGVyIG1zZzsKICAgICAgICAgc3luY2hyb25pemVkIChUSU1FU1RBTVBfTE9HR0lOR19TREYpIHsKLSAgICAgICAgICAgIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAgIFsiKQorICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIiAgIFsiKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShsb2NhbFRpbWVzdGFtcCkpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0gbG9jYWwiKTsKICAgICAgICAgfQogICAgICAgICB0YXNrLmxvZyhtc2cudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKICAgICAgICAgc3luY2hyb25pemVkIChUSU1FU1RBTVBfTE9HR0lOR19TREYpIHsKLSAgICAgICAgICAgIG1zZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAgIFsiKQorICAgICAgICAgICAgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoIiAgIFsiKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoVElNRVNUQU1QX0xPR0dJTkdfU0RGLmZvcm1hdChuZXcgRGF0ZShhZGp1c3RlZFJlbW90ZVRpbWVzdGFtcCkpKQogICAgICAgICAgICAgICAgIC5hcHBlbmQoIl0gcmVtb3RlIik7CiAgICAgICAgIH0KQEAgLTE0NTUsOSArMTQ1OSw4IEBACiAKICAgICAgICAgaWYgKHRhc2suZ2V0QWN0aW9uKCkgPT0gRlRQVGFzay5TRU5EX0ZJTEVTKSB7CiAgICAgICAgICAgICByZXR1cm4gYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXAgPj0gbG9jYWxUaW1lc3RhbXA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbG9jYWxUaW1lc3RhbXAgPj0gYWRqdXN0ZWRSZW1vdGVUaW1lc3RhbXA7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvY2FsVGltZXN0YW1wID49IGFkanVzdGVkUmVtb3RlVGltZXN0YW1wOwogICAgIH0KIAogCkBAIC0xNDcwLDE1ICsxNDczLDEyIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9TaXRlQ29tbWFuZChGVFBDbGllbnQgZnRwLCBTdHJpbmcgdGhlQ01EKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgYm9vbGVhbiByYzsKLSAgICAgICAgU3RyaW5nW10gbXlSZXBseSA9IG51bGw7CiAKICAgICAgICAgdGFzay5sb2coIkRvaW5nIFNpdGUgQ29tbWFuZDogIiArIHRoZUNNRCwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAKLSAgICAgICAgcmMgPSBmdHAuc2VuZFNpdGVDb21tYW5kKHRoZUNNRCk7Ci0KLSAgICAgICAgaWYgKCFyYykgewotICAgICAgICAgICAgdGFzay5sb2coIkZhaWxlZCB0byBpc3N1ZSBTaXRlIENvbW1hbmQ6ICIgKyB0aGVDTUQsIFByb2plY3QuTVNHX1dBUk4pOworICAgICAgICBpZiAoIWZ0cC5zZW5kU2l0ZUNvbW1hbmQodGhlQ01EKSkgeworICAgICAgICAgICAgdGFzay5sb2coIkZhaWxlZCB0byBpc3N1ZSBTaXRlIENvbW1hbmQ6ICIgKyB0aGVDTUQsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfV0FSTik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKFN0cmluZyByZXBseSA6IGZ0cC5nZXRSZXBseVN0cmluZ3MoKSkgewogICAgICAgICAgICAgICAgIGlmICghcmVwbHkuY29udGFpbnMoIjIwMCIpKSB7CkBAIC0xNDg4LDcgKzE0ODgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBTZW5kcyBhIHNpbmdsZSBmaWxlIHRvIHRoZSByZW1vdGUgaG9zdC4gPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IG1heQogICAgICAqIGNvbnRhaW4gYSByZWxhdGl2ZSBwYXRoIHNwZWNpZmljYXRpb24uIFdoZW4gdGhpcyBpcyB0aGUgY2FzZSwgPGNvZGU+c2VuZEZpbGU8L2NvZGU+CkBAIC0xNTIxLDE1ICsxNTIwLDEzIEBACiAgICAgICAgICAgICAgICAgdGFzay5sb2coInRyYW5zZmVycmluZyAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGluc3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7CisgICAgICAgICAgICBpbnN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpKTsKIAogICAgICAgICAgICAgY3JlYXRlUGFyZW50cyhmdHAsIGZpbGVuYW1lKTsKIAogICAgICAgICAgICAgZnRwLnN0b3JlRmlsZShyZXNvbHZlRmlsZShmaWxlbmFtZSksIGluc3RyZWFtKTsKIAotICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKTsKLQotICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICJjb3VsZCBub3QgcHV0IGZpbGU6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKTsKIAogICAgICAgICAgICAgICAgIGlmICh0YXNrLmlzU2tpcEZhaWxlZFRyYW5zZmVycygpKSB7CkBAIC0xNTU0LDcgKzE1NTEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBEZWxldGUgYSBmaWxlIGZyb20gdGhlIHJlbW90ZSBob3N0LgogICAgICAqIEBwYXJhbSBmdHAgZnRwIGNsaWVudApAQCAtMTYxNSw3ICsxNjExLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogUmV0cmlldmUgYSBzaW5nbGUgZmlsZSBmcm9tIHRoZSByZW1vdGUgaG9zdC4gPGNvZGU+ZmlsZW5hbWU8L2NvZGU+IG1heQogICAgICAqIGNvbnRhaW4gYSByZWxhdGl2ZSBwYXRoIHNwZWNpZmljYXRpb24uIDxwPgpAQCAtMTY1Miw3ICsxNjQ3LDcgQEAKICAgICAgICAgICAgIGlmICghcGRpci5leGlzdHMoKSkgewogICAgICAgICAgICAgICAgIHBkaXIubWtkaXJzKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRzdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSkpOworICAgICAgICAgICAgb3V0c3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKEZpbGVzLm5ld091dHB1dFN0cmVhbShmaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgICAgICBmdHAucmV0cmlldmVGaWxlKHJlc29sdmVGaWxlKGZpbGVuYW1lKSwgb3V0c3RyZWFtKTsKIAogICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7CkBAIC0xNjg2LDcgKzE2ODEsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBMaXN0IGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZpbGUgZnJvbSB0aGUgcmVtb3RlIGhvc3QuIDxjb2RlPmZpbGVuYW1lPC9jb2RlPgogICAgICAqIG1heSBjb250YWluIGEgcmVsYXRpdmUgcGF0aCBzcGVjaWZpY2F0aW9uLiA8cD4KQEAgLTE3MTUsNyArMTcwOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENyZWF0ZSB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBvbiB0aGUgcmVtb3RlIGhvc3QuCiAgICAgICoKQEAgLTE3NDEsMTAgKzE3MzQsOSBAQAogICAgICAgICBpZiAoZGlyLnN0YXJ0c1dpdGgoIi8iKSkgewogICAgICAgICAgICAgZnRwLmNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoIi8iKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgc3ViZGlyID0gIiI7CiAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGlyLCAiLyIpOwogICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0gICAgICAgICAgICBzdWJkaXIgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgIFN0cmluZyBzdWJkaXIgPSBzdC5uZXh0VG9rZW4oKTsKICAgICAgICAgICAgIHRhc2subG9nKCJDaGVja2luZyAiICsgc3ViZGlyLCBQcm9qZWN0Lk1TR19ERUJVRyk7CiAgICAgICAgICAgICBpZiAoIWZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHN1YmRpcikpIHsKICAgICAgICAgICAgICAgICBpZiAoIWZ0cC5tYWtlRGlyZWN0b3J5KHN1YmRpcikpIHsKQEAgLTE3NTIsOSArMTc0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIC8vICB0byBpbmRpY2F0ZSB0aGF0IGFuIGF0dGVtcHQgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IGhhcwogICAgICAgICAgICAgICAgICAgICAvLyAgZmFpbGVkIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICAgICAgaW50IHJjID0gZnRwLmdldFJlcGx5Q29kZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXNrLmlzSWdub3JlTm9uY3JpdGljYWxFcnJvcnMoKSAmJiAocmMgPT0gQ09ERV81NTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJjID09IENPREVfNTUzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByYyA9PSBDT0RFXzUyMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFzay5pc0lnbm9yZU5vbmNyaXRpY2FsRXJyb3JzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByYyAhPSBDT0RFXzU1MCAmJiByYyAhPSBDT0RFXzU1MyAmJiByYyAhPSBDT0RFXzUyMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeTogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNzgzLDE0ICsxNzc0LDE0IEBACiAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZU1rRGlyRmFpbHVyZShGVFBDbGllbnQgZnRwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpbnQgcmMgPSBmdHAuZ2V0UmVwbHlDb2RlKCk7Ci0gICAgICAgIGlmICghKHRhc2suaXNJZ25vcmVOb25jcml0aWNhbEVycm9ycygpICYmIChyYyA9PSBDT0RFXzU1MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmMgPT0gQ09ERV81NTMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJjID09IENPREVfNTIxKSkpIHsKKyAgICAgICAgaWYgKCF0YXNrLmlzSWdub3JlTm9uY3JpdGljYWxFcnJvcnMoKQorICAgICAgICAgICAgICAgIHx8IHJjICE9IENPREVfNTUwICYmIHJjICE9IENPREVfNTUzICYmIHJjICE9IENPREVfNTIxKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5OiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkb0ZUUCgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIEZUUENsaWVudCBmdHAgPSBudWxsOwogCkBAIC0xODA1LDggKzE3OTYsOCBAQAogICAgICAgICAgICAgZnRwLnNldFJlbW90ZVZlcmlmaWNhdGlvbkVuYWJsZWQodGFzay5nZXRFbmFibGVSZW1vdGVWZXJpZmljYXRpb24oKSk7CiAgICAgICAgICAgICBmdHAuY29ubmVjdCh0YXNrLmdldFNlcnZlcigpLCB0YXNrLmdldFBvcnQoKSk7CiAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZUUCBjb25uZWN0aW9uIGZhaWxlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZUUCBjb25uZWN0aW9uIGZhaWxlZDogJXMiLAorICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRhc2subG9nKCJjb25uZWN0ZWQiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTE4MjIsMTQgKzE4MTMsMTQgQEAKICAgICAgICAgICAgIGlmICh0YXNrLmlzQmluYXJ5KCkpIHsKICAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUob3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQLkJJTkFSWV9GSUxFX1RZUEUpOwogICAgICAgICAgICAgICAgIGlmICghRlRQUmVwbHkuaXNQb3NpdGl2ZUNvbXBsZXRpb24oZnRwLmdldFJlcGx5Q29kZSgpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNvdWxkIG5vdCBzZXQgdHJhbnNmZXIgdHlwZTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHNldCB0cmFuc2ZlciB0eXBlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmdHAuc2V0RmlsZVR5cGUob3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAuRlRQLkFTQ0lJX0ZJTEVfVFlQRSk7CiAgICAgICAgICAgICAgICAgaWYgKCFGVFBSZXBseS5pc1Bvc2l0aXZlQ29tcGxldGlvbihmdHAuZ2V0UmVwbHlDb2RlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IHNldCB0cmFuc2ZlciB0eXBlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3Qgc2V0IHRyYW5zZmVyIHR5cGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTE4MzcsOCArMTgyOCw5IEBACiAgICAgICAgICAgICAgICAgdGFzay5sb2coImVudGVyaW5nIHBhc3NpdmUgbW9kZSIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgIGZ0cC5lbnRlckxvY2FsUGFzc2l2ZU1vZGUoKTsKICAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJjb3VsZCBub3QgZW50ZXIgaW50byBwYXNzaXZlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vZGU6ICIgKyBmdHAuZ2V0UmVwbHlTdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZW50ZXIgaW50byBwYXNzaXZlIG1vZGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTE4NDcsNTUgKzE4MzksNDYgQEAKICAgICAgICAgICAgIC8vIEUuRy4gc3dpdGNoaW5nIGJldHdlZW4gYSBVTklYIGZpbGUgc3lzdGVtIG1vZGUgYW5kCiAgICAgICAgICAgICAvLyBhIGxlZ2FjeSBmaWxlIHN5c3RlbS4KICAgICAgICAgICAgIGlmICh0YXNrLmdldEluaXRpYWxTaXRlQ29tbWFuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBSZXRyeUhhbmRsZXIgaCA9IG5ldyBSZXRyeUhhbmRsZXIodGFzay5nZXRSZXRyaWVzQWxsb3dlZCgpLCB0YXNrKTsKICAgICAgICAgICAgICAgICBmaW5hbCBGVFBDbGllbnQgbGZ0cCA9IGZ0cDsKLSAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKGgsIG5ldyBSZXRyeWFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb1NpdGVDb21tYW5kKGxmdHAsIHRhc2suZ2V0SW5pdGlhbFNpdGVDb21tYW5kKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9LCAiaW5pdGlhbCBzaXRlIGNvbW1hbmQ6ICIgKyB0YXNrLmdldEluaXRpYWxTaXRlQ29tbWFuZCgpKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKG5ldyBSZXRyeUhhbmRsZXIodGFzay5nZXRSZXRyaWVzQWxsb3dlZCgpLCB0YXNrKSwKKyAgICAgICAgICAgICAgICAgICAgKCkgLT4gZG9TaXRlQ29tbWFuZChsZnRwLCB0YXNrLmdldEluaXRpYWxTaXRlQ29tbWFuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgc2l0ZSBjb21tYW5kOiAiICsgdGFzay5nZXRJbml0aWFsU2l0ZUNvbW1hbmQoKSk7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgLy8gRm9yIGEgdW5peCBmdHAgc2VydmVyIHlvdSBjYW4gc2V0IHRoZSBkZWZhdWx0IG1hc2sgZm9yIGFsbCBmaWxlcwogICAgICAgICAgICAgLy8gY3JlYXRlZC4KIAogICAgICAgICAgICAgaWYgKHRhc2suZ2V0VW1hc2soKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRhc2suZ2V0UmV0cmllc0FsbG93ZWQoKSwgdGFzayk7CiAgICAgICAgICAgICAgICAgZmluYWwgRlRQQ2xpZW50IGxmdHAgPSBmdHA7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChsZnRwLCAidW1hc2sgIiArIHRhc2suZ2V0VW1hc2soKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0sICJ1bWFzayAiICsgdGFzay5nZXRVbWFzaygpKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmV0cnlIYW5kbGVyKHRhc2suZ2V0UmV0cmllc0FsbG93ZWQoKSwgdGFzayksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGRvU2l0ZUNvbW1hbmQobGZ0cCwgInVtYXNrICIgKyB0YXNrLmdldFVtYXNrKCkpLAorICAgICAgICAgICAgICAgICAgICAidW1hc2sgIiArIHRhc2suZ2V0VW1hc2soKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIElmIHRoZSBhY3Rpb24gaXMgTUtfRElSLCB0aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlCiAgICAgICAgICAgICAvLyBkaXJlY3RvcnkgaXMgdGhlIGRpcmVjdG9yeSB0byBjcmVhdGUuCiAKICAgICAgICAgICAgIGlmICh0YXNrLmdldEFjdGlvbigpID09IEZUUFRhc2suTUtfRElSKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRhc2suZ2V0UmV0cmllc0FsbG93ZWQoKSwgdGFzayk7CiAgICAgICAgICAgICAgICAgZmluYWwgRlRQQ2xpZW50IGxmdHAgPSBmdHA7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlbW90ZURpcihsZnRwLCB0YXNrLmdldFJlbW90ZWRpcigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSwgdGFzay5nZXRSZW1vdGVkaXIoKSk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJldHJ5SGFuZGxlcih0YXNrLmdldFJldHJpZXNBbGxvd2VkKCksIHRhc2spLAorICAgICAgICAgICAgICAgICAgICAoKSAtPiBtYWtlUmVtb3RlRGlyKGxmdHAsIHRhc2suZ2V0UmVtb3RlZGlyKCkpLAorICAgICAgICAgICAgICAgICAgICB0YXNrLmdldFJlbW90ZWRpcigpKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFzay5nZXRBY3Rpb24oKSA9PSBGVFBUYXNrLlNJVEVfQ01EKSB7Ci0gICAgICAgICAgICAgICAgUmV0cnlIYW5kbGVyIGggPSBuZXcgUmV0cnlIYW5kbGVyKHRhc2suZ2V0UmV0cmllc0FsbG93ZWQoKSwgdGFzayk7CiAgICAgICAgICAgICAgICAgZmluYWwgRlRQQ2xpZW50IGxmdHAgPSBmdHA7Ci0gICAgICAgICAgICAgICAgZXhlY3V0ZVJldHJ5YWJsZShoLCBuZXcgUmV0cnlhYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9TaXRlQ29tbWFuZChsZnRwLCB0YXNrLmdldFNpdGVDb21tYW5kKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9LCAiU2l0ZSBDb21tYW5kOiAiICsgdGFzay5nZXRTaXRlQ29tbWFuZCgpKTsKKyAgICAgICAgICAgICAgICBleGVjdXRlUmV0cnlhYmxlKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmV0cnlIYW5kbGVyKHRhc2suZ2V0UmV0cmllc0FsbG93ZWQoKSwgdGFzayksCisgICAgICAgICAgICAgICAgICAgICgpIC0+IGRvU2l0ZUNvbW1hbmQobGZ0cCwgdGFzay5nZXRTaXRlQ29tbWFuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIlNpdGUgQ29tbWFuZDogIiArIHRhc2suZ2V0U2l0ZUNvbW1hbmQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmICh0YXNrLmdldFJlbW90ZWRpcigpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgdGFzay5sb2coImNoYW5naW5nIHRoZSByZW1vdGUgZGlyZWN0b3J5IiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgIGZ0cC5jaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHRhc2suZ2V0UmVtb3RlZGlyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIUZUUFJlcGx5LmlzUG9zaXRpdmVDb21wbGV0aW9uKGZ0cC5nZXRSZXBseUNvZGUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiY291bGQgbm90IGNoYW5nZSByZW1vdGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeTogIiArIGZ0cC5nZXRSZXBseVN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5OiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnRwLmdldFJlcGx5U3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICh0YXNrLmlzTmV3ZXIoKSAmJiB0YXNrLmlzVGltZURpZmZBdXRvKCkpIHsKQEAgLTE5MDYsNyArMTg4OSw2IEBACiAgICAgICAgICAgICAgICAgdGFzay5sb2coRlRQVGFzay5BQ1RJT05fU1RSU1t0YXNrLmdldEFjdGlvbigpXSArICIgIiArIEZUUFRhc2suQUNUSU9OX1RBUkdFVF9TVFJTW3Rhc2suZ2V0QWN0aW9uKCldKTsKICAgICAgICAgICAgICAgICB0cmFuc2ZlckZpbGVzKGZ0cCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZXJyb3IgZHVyaW5nIEZUUCB0cmFuc2ZlcjogIiArIGV4LCBleCk7CiAgICAgICAgIH0gZmluYWxseSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvTWltZU1haWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhCmluZGV4IGZjYTQyMTUuLjExOGYxZjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9NaW1lTWFpbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTkgKzIxLDIxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwuRW1haWxUYXNrOwogCiAvKioKLSAqIEEgdGFzayB0byBzZW5kIFNNVFAgZW1haWw7IFVzZSA8dHQ+bWFpbDwvdHQ+IGluc3RlYWQKKyAqIEEgdGFzayB0byBzZW5kIFNNVFAgZW1haWw7IFVzZSA8Y29kZT5tYWlsPC9jb2RlPiBpbnN0ZWFkCiAgKgogICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCiAgKiAgICAgICAgICAgICBVc2Uge0BsaW5rIEVtYWlsVGFza30gaW5zdGVhZC4KICAqCiAgKiBAc2luY2UgQW50MS40CiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgTWltZU1haWwgZXh0ZW5kcyBFbWFpbFRhc2sgewogICAgIC8qKgogICAgICAqIEV4ZWN1dGVzIHRoaXMgYnVpbGQgdGFzay4KICAgICAgKgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gT24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGxvZygiREVQUkVDQVRFRCAtIFRoZSAiICsgZ2V0VGFza05hbWUoKSArICIgdGFzayBpcyBkZXByZWNhdGVkLiAiCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvUkV4ZWNUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvUkV4ZWNUYXNrLmphdmEKaW5kZXggZDg4ODc0Zi4uMTJmYWU4NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1JFeGVjVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9SRXhlY1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuYnNkLlJFeGVjQ2xpZW50OwpAQCAtNjgsNyArNjgsNyBAQAogICAgIC8qKgogICAgICAqICBUaGUgbGlzdCBvZiByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGlzIHNlc3Npb24KICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciByZXhlY1Rhc2tzID0gbmV3IFZlY3RvcigpOworICAgIHByaXZhdGUgTGlzdDxSRXhlY1N1YlRhc2s+IHJleGVjVGFza3MgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqICBJZiB0cnVlLCBhZGRzIGEgQ1IgdG8gYmVnaW5uaW5nIG9mIGxvZ2luIHNjcmlwdApAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShBbnRSRXhlY0NsaWVudCByZXhlYykKICAgICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTaG91bGRuJ3QgYmUgYWJsZSBpbnN0YW50aWF0ZSBhIFN1YlRhc2sgZGlyZWN0bHkiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2hvdWxkbid0IGJlIGFibGUgdG8gaW5zdGFudGlhdGUgYSBTdWJUYXNrIGRpcmVjdGx5Iik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTEyNyw2ICsxMjcsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcmV4ZWMgdGhlIHRhc2sgdG8gdXNlCiAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFJFeGVjQ2xpZW50IHJleGVjKQogICAgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgcmV4ZWMuc2VuZFN0cmluZyh0YXNrU3RyaW5nLCBlY2hvU3RyaW5nKTsKQEAgLTE1Myw2ICsxNTQsNyBAQAogICAgICAgICAgKiBAcGFyYW0gcmV4ZWMgdGhlIHRhc2sgdG8gdXNlCiAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFJFeGVjQ2xpZW50IHJleGVjKQogICAgICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHJleGVjLndhaXRGb3JTdHJpbmcodGFza1N0cmluZywgdGltZW91dCk7CkBAIC0xODAsNyArMTgyLDcgQEAKICAgICAvKioKICAgICAgKiAgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBhYnN0cmFjdGlvbiBvZiB0aGUgcmV4ZWMgcHJvdG9jb2wuCiAgICAgICogIEN1cnJlbnRseSBpdCBpcyBhIHdyYXBwZXIgYXJvdW5kIDxhCi0gICAgICogIGhyZWY9Imh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9uZXQvaW5kZXguaHRtbCI+SmFrYXJ0YQorICAgICAqICBocmVmPSJodHRwczovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL25ldC9pbmRleC5odG1sIj5KYWthcnRhCiAgICAgICogIENvbW1vbnMgTmV0PC9hPi4KICAgICAgKi8KICAgICBwdWJsaWMgY2xhc3MgQW50UkV4ZWNDbGllbnQgZXh0ZW5kcyBSRXhlY0NsaWVudCB7CkBAIC0yMDIsOSArMjA0LDkgQEAKICAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvclN0cmluZyhTdHJpbmcgcywgSW50ZWdlciB0aW1lb3V0KSB7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgICAgIGludCB3aW5kb3dTdGFydCA9IC1zLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dC5pbnRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsIHx8IHRpbWVvdXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2luZG93U3RhcnQgPCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc2Iuc3Vic3RyaW5nKHdpbmRvd1N0YXJ0KS5lcXVhbHMocykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgaXMucmVhZCgpKTsKQEAgLTIxMiw3ICsyMTQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kVGltZS5hZGQoQ2FsZW5kYXIuU0VDT05ELCB0aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdpbmRvd1N0YXJ0IDwgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXNiLnN1YnN0cmluZyh3aW5kb3dTdGFydCkuZXF1YWxzKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5iZWZvcmUoZW5kVGltZSkKQEAgLTI1Myw2ICsyNTUsNyBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZWFkIGZyb20gdGhlIHJleGVjIHNlc3Npb24gdW50aWwgdGhlIEVPRiBpcyBmb3VuZCBvcgogICAgICAgICAgKiB0aGUgdGltZW91dCBoYXMgYmVlbiByZWFjaGVkCkBAIC0yNjEsNDQgKzI2NCw0NCBAQAogICAgICAgICBwdWJsaWMgdm9pZCB3YWl0Rm9yRU9GKEludGVnZXIgdGltZW91dCkgewogICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSB0aGlzLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsIHx8IHRpbWVvdXQuaW50VmFsdWUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVvdXQgPT0gbnVsbCB8fCB0aW1lb3V0ID09IDApIHsKICAgICAgICAgICAgICAgICBpbnQgcmVhZDsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaXMucmVhZCgpKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gKGNoYXIpIHJlYWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2coc2IudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5kZWxldGUoMCwgc2IubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5kZWxldGUoMCwgc2IubGVuZ3RoKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dC5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICBpbnQgcmVhZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZWFkID0gMDsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWQgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChDYWxlbmRhci5nZXRJbnN0YW5jZSgpLmJlZm9yZShlbmRUaW1lKSAmJiBpcy5hdmFpbGFibGUoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFBBVVNFX1RJTUUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzLmF2YWlsYWJsZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXNwb25zZSB0aW1lZC1vdXQgd2FpdGluZyBmb3IgRU9GIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHNiLnRvU3RyaW5nKCksIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzcG9uc2UgdGltZWQtb3V0IHdhaXRpbmcgZm9yIEVPRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgPSAgaXMucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9IGlzLnJlYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSAoY2hhcikgcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coc2IudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmRlbGV0ZSgwLCBzYi5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBsb2coc2IudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgIGxvZyhzYi50b1N0cmluZygpLCBQcm9qZWN0Lk1TR19JTkZPKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewogICAgICAgICAgICAgICAgIHRocm93IGJlOwpAQCAtMzA2LDggKzMwOSw4IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUsIGdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CisKICAgICAvKioKICAgICAgKiAgQSBzdHJpbmcgdG8gd2FpdCBmb3IgZnJvbSB0aGUgc2VydmVyLgogICAgICAqICBBIHN1YlRhc2sgJmx0O3JlYWQmZ3Q7IHRhZyB3YXMgZm91bmQuICBDcmVhdGUgdGhlIG9iamVjdCwKQEAgLTMxNiwxMCArMzE5LDExIEBACiAgICAgICovCiAKICAgICBwdWJsaWMgUkV4ZWNTdWJUYXNrIGNyZWF0ZVJlYWQoKSB7Ci0gICAgICAgIFJFeGVjU3ViVGFzayB0YXNrID0gKFJFeGVjU3ViVGFzaykgbmV3IFJFeGVjUmVhZCgpOwotICAgICAgICByZXhlY1Rhc2tzLmFkZEVsZW1lbnQodGFzayk7CisgICAgICAgIFJFeGVjU3ViVGFzayB0YXNrID0gbmV3IFJFeGVjUmVhZCgpOworICAgICAgICByZXhlY1Rhc2tzLmFkZCh0YXNrKTsKICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogIEFkZCB0ZXh0IHRvIHNlbmQgdG8gdGhlIHNlcnZlcgogICAgICAqICBBIHN1YlRhc2sgJmx0O3dyaXRlJmd0OyB0YWcgd2FzIGZvdW5kLiAgQ3JlYXRlIHRoZSBvYmplY3QsCkBAIC0zMjcsMTYgKzMzMSwxOCBAQAogICAgICAqIEByZXR1cm4gYSB3cml0ZSBzdWIgdGFzawogICAgICAqLwogICAgIHB1YmxpYyBSRXhlY1N1YlRhc2sgY3JlYXRlV3JpdGUoKSB7Ci0gICAgICAgIFJFeGVjU3ViVGFzayB0YXNrID0gKFJFeGVjU3ViVGFzaykgbmV3IFJFeGVjV3JpdGUoKTsKLSAgICAgICAgcmV4ZWNUYXNrcy5hZGRFbGVtZW50KHRhc2spOworICAgICAgICBSRXhlY1N1YlRhc2sgdGFzayA9IG5ldyBSRXhlY1dyaXRlKCk7CisgICAgICAgIHJleGVjVGFza3MuYWRkKHRhc2spOwogICAgICAgICByZXR1cm4gdGFzazsKICAgICB9CisKICAgICAvKioKICAgICAgKiAgVmVyaWZ5IHRoYXQgYWxsIHBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkLgogICAgICAqICBDb25uZWN0IGFuZCBwb3NzaWJseSBsb2dpbi4KICAgICAgKiAgSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIFJlYWRzIGFuZCB3cml0ZXMuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAvKiogIEEgc2VydmVyIG5hbWUgaXMgcmVxdWlyZWQgdG8gY29udGludWUgKi8KICAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7CkBAIC0zNjMsNyArMzY5LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbid0IGNvbm5lY3QgdG8gIiArIHNlcnZlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodXNlcmlkICE9IG51bGwgJiYgcGFzc3dvcmQgIT0gbnVsbCAmJiBjb21tYW5kICE9IG51bGwgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgJiYgcmV4ZWNUYXNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICYmIHJleGVjVGFza3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgLy8gc2ltcGxlIG9uZS1zaG90IGV4ZWN1dGlvbgogICAgICAgICAgICAgICAgIHJleGVjLnJleGVjKHVzZXJpZCwgcGFzc3dvcmQsIGNvbW1hbmQpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTM4NCwxMyArMzkwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3IgZGlzY29ubmVjdGluZyBmcm9tICIgKyBzZXJ2ZXI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGRvbid0IGhpZGUgaW5uZXIgZXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGhpZGUgaW5uZXIgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIGxvZyhtc2csIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogIFByb2Nlc3MgYSAndHlwaWNhbCcgbG9naW4uICBJZiBpdCBkaWZmZXJzLCB1c2UgdGhlIHJlYWQKICAgICAgKiAgYW5kIHdyaXRlIHRhc2tzIGV4cGxpY2l0bHkKQEAgLTQwNCw2ICs0MTEsNyBAQAogICAgICAgICByZXhlYy53YWl0Rm9yU3RyaW5nKCJhc3N3b3JkOiIpOwogICAgICAgICByZXhlYy5zZW5kU3RyaW5nKHBhc3N3b3JkLCBmYWxzZSk7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSB0aGUgY29tbWFuZCB0byBleGVjdXRlIG9uIHRoZSBzZXJ2ZXI7CiAgICAgICogQHBhcmFtIGMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCkBAIC00MTksOSArNDI3LDEwIEBACiAgICAgcHVibGljIHZvaWQgc2V0SW5pdGlhbENSKGJvb2xlYW4gYikgewogICAgICAgICB0aGlzLmFkZENhcnJpYWdlUmV0dXJuID0gYjsKICAgICB9CisKICAgICAvKioKICAgICAgKiAgU2V0IHRoZSB0aGUgbG9naW4gcGFzc3dvcmQgdG8gdXNlCi0gICAgICogcmVxdWlyZWQgaWYgPHR0PnVzZXJpZDwvdHQ+IGlzIHNldC4KKyAgICAgKiByZXF1aXJlZCBpZiA8Y29kZT51c2VyaWQ8L2NvZGU+IGlzIHNldC4KICAgICAgKiBAcGFyYW0gcCBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcCkgewpAQCAtNDUyLDkgKzQ2MSwxMCBAQAogICAgIHB1YmxpYyB2b2lkIHNldFRpbWVvdXQoSW50ZWdlciBpKSB7CiAgICAgICAgIHRoaXMuZGVmYXVsdFRpbWVvdXQgPSBpOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIFNldCB0aGUgdGhlIGxvZ2luIGlkIHRvIHVzZSBvbiB0aGUgc2VydmVyOwotICAgICAqIHJlcXVpcmVkIGlmIDx0dD5wYXNzd29yZDwvdHQ+IGlzIHNldC4KKyAgICAgKiByZXF1aXJlZCBpZiA8Y29kZT5wYXNzd29yZDwvY29kZT4gaXMgc2V0LgogICAgICAqIEBwYXJhbSB1IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFVzZXJpZChTdHJpbmcgdSkgewpAQCAtNDczLDkgKzQ4Myw3IEBACiAgICAgICAgICAgICBsb2dpbihyZXhlYyk7CiAgICAgICAgIH0KICAgICAgICAgLyoqICBQcm9jZXNzIGVhY2ggc3ViIGNvbW1hbmQgKi8KLSAgICAgICAgRW51bWVyYXRpb24gdGFza3NUb1J1biA9IHJleGVjVGFza3MuZWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKHRhc2tzVG9SdW4gIT0gbnVsbCAmJiB0YXNrc1RvUnVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBSRXhlY1N1YlRhc2sgdGFzayA9IChSRXhlY1N1YlRhc2spIHRhc2tzVG9SdW4ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgZm9yIChSRXhlY1N1YlRhc2sgdGFzayA6IHJleGVjVGFza3MpIHsKICAgICAgICAgICAgIGlmICh0YXNrIGluc3RhbmNlb2YgUkV4ZWNSZWFkICYmIGRlZmF1bHRUaW1lb3V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAoKFJFeGVjUmVhZCkgdGFzaykuc2V0RGVmYXVsdFRpbWVvdXQoZGVmYXVsdFRpbWVvdXQpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1NldFByb3h5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvU2V0UHJveHkuamF2YQppbmRleCAxZTFmNjU5Li40ZGQ3MGU1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvU2V0UHJveHkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvU2V0UHJveHkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ3LDEyICs0NywxMiBAQAogICogPHByZT4mbHQ7c2V0cHJveHkgc29ja3Nwcm94eWhvc3Q9IiIvJmd0OzwvcHJlPgogICogc3RvcCB1c2luZyB0aGUgc29ja3Mgc2VydmVyLgogICogPHA+Ci0gKiBZb3UgY2FuIHNldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgaHR0cCB3aXRoIHRoZSA8dHQ+cHJveHlIb3N0PC90dD4KLSAqIGFuZCA8dHQ+cHJveHlQYXNzd29yZDwvdHQ+IGF0dHJpYnV0ZXMuIFRoZXNlIGNhbiBhbHNvIGJlCisgKiBZb3UgY2FuIHNldCBhIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgaHR0cCB3aXRoIHRoZSA8Y29kZT5wcm94eUhvc3Q8L2NvZGU+CisgKiBhbmQgPGNvZGU+cHJveHlQYXNzd29yZDwvY29kZT4gYXR0cmlidXRlcy4gVGhlc2UgY2FuIGFsc28gYmUKICAqIHVzZWQgYWdhaW5zdCBTT0NLUzUgc2VydmVycy4KICAqIDwvcD4KLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvZ3VpZGUvbmV0L3Byb3BlcnRpZXMuaHRtbCI+Ci0gKiAgamF2YSAxLjUgbmV0d29yayBwcm9wZXJ0eSBsaXN0PC9hPgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvbmV0L3Byb3BlcnRpZXMuaHRtbCI+CisgKiAgaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy90ZWNobm90ZXMvZ3VpZGVzL25ldC9wcm9wZXJ0aWVzLmh0bWw8L2E+CiAgICpAc2luY2UgICAgICAgQW50IDEuNQogICogQGFudC50YXNrIGNhdGVnb3J5PSJuZXR3b3JrIgogICovCkBAIC0xNzUsMTQgKzE3NSwxMyBAQAogICAgICAqIGFwcGx5IHRvIGFsbCBuZXR3b3JrIGNvbm5lY3Rpb25zCiAgICAgICogUmVsZXZhbnQgZG9jczogYnVnbGlzdCAjNDE4MzM0MAogICAgICAqLwotCiAgICAgcHVibGljIHZvaWQgYXBwbHlXZWJQcm94eVNldHRpbmdzKCkgewogICAgICAgICBib29sZWFuIHNldHRpbmdzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICBib29sZWFuIGVuYWJsaW5nUHJveHkgPSBmYWxzZTsKICAgICAgICAgUHJvcGVydGllcyBzeXNwcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGlmIChwcm94eUhvc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgc2V0dGluZ3NDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChwcm94eUhvc3QubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgaWYgKCFwcm94eUhvc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgdHJhY2VTZXR0aW5nSW5mbygpOwogICAgICAgICAgICAgICAgIGVuYWJsaW5nUHJveHkgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN5c3Byb3BzLnB1dChQcm94eVNldHVwLkhUVFBfUFJPWFlfSE9TVCwgcHJveHlIb3N0KTsKQEAgLTIxNyw3ICsyMTYsNyBAQAogICAgICAgICAvL3NvY2tzCiAgICAgICAgIGlmIChzb2Nrc1Byb3h5SG9zdCAhPSBudWxsKSB7CiAgICAgICAgICAgICBzZXR0aW5nc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKHNvY2tzUHJveHlIb3N0Lmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgICAgIGlmICghc29ja3NQcm94eUhvc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgZW5hYmxpbmdQcm94eSA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3lzcHJvcHMucHV0KFByb3h5U2V0dXAuU09DS1NfUFJPWFlfSE9TVCwgc29ja3NQcm94eUhvc3QpOwogICAgICAgICAgICAgICAgIHN5c3Byb3BzLnB1dChQcm94eVNldHVwLlNPQ0tTX1BST1hZX1BPUlQsIEludGVnZXIudG9TdHJpbmcoc29ja3NQcm94eVBvcnQpKTsKQEAgLTI2MSw2ICsyNjAsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiB0aHJvd24gaW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgYXBwbHlXZWJQcm94eVNldHRpbmdzKCk7CiAgICAgfQpAQCAtMjc1LDYgKzI3NSw3IEBACiAgICAgICAgICAgICBhdXRoID0gbmV3IFBhc3N3b3JkQXV0aGVudGljYXRpb24odXNlciwgcGFzcy50b0NoYXJBcnJheSgpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkgewogICAgICAgICAgICAgcmV0dXJuIGF1dGg7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9UZWxuZXRUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvVGVsbmV0VGFzay5qYXZhCmluZGV4IGE4OWU3YTkuLmNiYzlmMzcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL25ldC9UZWxuZXRUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L1RlbG5ldFRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQudGVsbmV0LlRlbG5ldENsaWVudDsKQEAgLTM0LDcgKzM0LDYgQEAKICAqIEF1dG9tYXRlcyB0aGUgdGVsbmV0IHByb3RvY29sLgogICoKICAqLwotCiBwdWJsaWMgY2xhc3MgVGVsbmV0VGFzayBleHRlbmRzIFRhc2sgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX0lOVEVSVkFMID0gMjUwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURUxORVRfUE9SVCA9IDIzOwpAQCAtNjIsNyArNjEsNyBAQAogICAgIC8qKgogICAgICAqICBUaGUgbGlzdCBvZiByZWFkL3dyaXRlIGNvbW1hbmRzIGZvciB0aGlzIHNlc3Npb24KICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvciB0ZWxuZXRUYXNrcyA9IG5ldyBWZWN0b3IoKTsKKyAgICBwcml2YXRlIExpc3Q8VGVsbmV0U3ViVGFzaz4gdGVsbmV0VGFza3MgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqICBJZiB0cnVlLCBhZGRzIGEgQ1IgdG8gYmVnaW5uaW5nIG9mIGxvZ2luIHNjcmlwdApAQCAtODEsNiArODAsNyBAQAogICAgICAqICBJdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgUmVhZHMgYW5kIHdyaXRlcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAvKiogIEEgc2VydmVyIG5hbWUgaXMgcmVxdWlyZWQgdG8gY29udGludWUgKi8KICAgICAgICBpZiAoc2VydmVyID09IG51bGwpIHsKQEAgLTExMSw5ICsxMTEsNyBAQAogICAgICAgICAgICAgICAgbG9naW4odGVsbmV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogIFByb2Nlc3MgZWFjaCBzdWIgY29tbWFuZCAqLwotICAgICAgICAgICBFbnVtZXJhdGlvbiB0YXNrc1RvUnVuID0gdGVsbmV0VGFza3MuZWxlbWVudHMoKTsKLSAgICAgICAgICAgd2hpbGUgKHRhc2tzVG9SdW4gIT0gbnVsbCAmJiB0YXNrc1RvUnVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICBUZWxuZXRTdWJUYXNrIHRhc2sgPSAoVGVsbmV0U3ViVGFzaykgdGFza3NUb1J1bi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICBmb3IgKFRlbG5ldFN1YlRhc2sgdGFzayA6IHRlbG5ldFRhc2tzKSB7CiAgICAgICAgICAgICAgICBpZiAodGFzayBpbnN0YW5jZW9mIFRlbG5ldFJlYWQgJiYgZGVmYXVsdFRpbWVvdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICgoVGVsbmV0UmVhZCkgdGFzaykuc2V0RGVmYXVsdFRpbWVvdXQoZGVmYXVsdFRpbWVvdXQpOwogICAgICAgICAgICAgICAgfQpAQCAtMTUyLDcgKzE1MCw3IEBACiAKICAgICAvKioKICAgICAgKiBTZXQgdGhlIHRoZSBsb2dpbiBpZCB0byB1c2Ugb24gdGhlIHNlcnZlcjsKLSAgICAgKiByZXF1aXJlZCBpZiA8dHQ+cGFzc3dvcmQ8L3R0PiBpcyBzZXQuCisgICAgICogcmVxdWlyZWQgaWYgPGNvZGU+cGFzc3dvcmQ8L2NvZGU+IGlzIHNldC4KICAgICAgKiBAcGFyYW0gdSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHUpIHsKQEAgLTE2MSw3ICsxNTksNyBAQAogCiAgICAgLyoqCiAgICAgICogIFNldCB0aGUgdGhlIGxvZ2luIHBhc3N3b3JkIHRvIHVzZQotICAgICAqIHJlcXVpcmVkIGlmIDx0dD51c2VyaWQ8L3R0PiBpcyBzZXQuCisgICAgICogcmVxdWlyZWQgaWYgPGNvZGU+dXNlcmlkPC9jb2RlPiBpcyBzZXQuCiAgICAgICogQHBhcmFtIHAgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHApIHsKQEAgLTIwOSw4ICsyMDcsOCBAQAogICAgICAqLwogCiAgICAgcHVibGljIFRlbG5ldFN1YlRhc2sgY3JlYXRlUmVhZCgpIHsKLSAgICAgICAgVGVsbmV0U3ViVGFzayB0YXNrID0gKFRlbG5ldFN1YlRhc2spIG5ldyBUZWxuZXRSZWFkKCk7Ci0gICAgICAgIHRlbG5ldFRhc2tzLmFkZEVsZW1lbnQodGFzayk7CisgICAgICAgIFRlbG5ldFN1YlRhc2sgdGFzayA9IG5ldyBUZWxuZXRSZWFkKCk7CisgICAgICAgIHRlbG5ldFRhc2tzLmFkZCh0YXNrKTsKICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgfQogCkBAIC0yMjEsOCArMjE5LDggQEAKICAgICAgKiBAcmV0dXJuIGEgd3JpdGUgdGVsbmV0IHN1YiB0YXNrCiAgICAgICovCiAgICAgcHVibGljIFRlbG5ldFN1YlRhc2sgY3JlYXRlV3JpdGUoKSB7Ci0gICAgICAgIFRlbG5ldFN1YlRhc2sgdGFzayA9IChUZWxuZXRTdWJUYXNrKSBuZXcgVGVsbmV0V3JpdGUoKTsKLSAgICAgICAgdGVsbmV0VGFza3MuYWRkRWxlbWVudCh0YXNrKTsKKyAgICAgICAgVGVsbmV0U3ViVGFzayB0YXNrID0gbmV3IFRlbG5ldFdyaXRlKCk7CisgICAgICAgIHRlbG5ldFRhc2tzLmFkZCh0YXNrKTsKICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgfQogCkBAIC0yNzEsNiArMjY5LDcgQEAKICAgICAgICAgICogQHBhcmFtIHRlbG5ldCB0aGUgdGFzayB0byB1c2UKICAgICAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoQW50VGVsbmV0Q2xpZW50IHRlbG5ldCkKICAgICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgIHRlbG5ldC5zZW5kU3RyaW5nKHRhc2tTdHJpbmcsIGVjaG9TdHJpbmcpOwpAQCAtMjk3LDYgKzI5Niw3IEBACiAgICAgICAgICAqIEBwYXJhbSB0ZWxuZXQgdGhlIHRhc2sgdG8gdXNlCiAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEFudFRlbG5ldENsaWVudCB0ZWxuZXQpCiAgICAgICAgICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgdGVsbmV0LndhaXRGb3JTdHJpbmcodGFza1N0cmluZywgdGltZW91dCk7CkBAIC0zMjQsNyArMzI0LDcgQEAKICAgICAvKioKICAgICAgKiAgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBhYnN0cmFjdGlvbiBvZiB0aGUgdGVsbmV0IHByb3RvY29sLgogICAgICAqICBDdXJyZW50bHkgaXQgaXMgYSB3cmFwcGVyIGFyb3VuZCA8YQotICAgICAqICBocmVmPSJodHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvbmV0L2luZGV4Lmh0bWwiPkpha2FydGEKKyAgICAgKiAgaHJlZj0iaHR0cHM6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9uZXQvaW5kZXguaHRtbCI+SmFrYXJ0YQogICAgICAqICBDb21tb25zIE5ldDwvYT4uCiAgICAgICovCiAgICAgcHVibGljIGNsYXNzIEFudFRlbG5ldENsaWVudCBleHRlbmRzIFRlbG5ldENsaWVudCB7CkBAIC0zNDYsOSArMzQ2LDkgQEAKICAgICAgICAgcHVibGljIHZvaWQgd2FpdEZvclN0cmluZyhTdHJpbmcgcywgSW50ZWdlciB0aW1lb3V0KSB7CiAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHRoaXMuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgICAgIGludCB3aW5kb3dTdGFydCA9IC1zLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0ID09IG51bGwgfHwgdGltZW91dC5pbnRWYWx1ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA9PSBudWxsIHx8IHRpbWVvdXQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2luZG93U3RhcnQgPCAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc2Iuc3Vic3RyaW5nKHdpbmRvd1N0YXJ0KS5lcXVhbHMocykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgaXMucmVhZCgpKTsKQEAgLTM1Niw3ICszNTYsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXIgZW5kVGltZSA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVuZFRpbWUuYWRkKENhbGVuZGFyLlNFQ09ORCwgdGltZW91dC5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kVGltZS5hZGQoQ2FsZW5kYXIuU0VDT05ELCB0aW1lb3V0KTsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdpbmRvd1N0YXJ0IDwgMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXNiLnN1YnN0cmluZyh3aW5kb3dTdGFydCkuZXF1YWxzKHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKS5iZWZvcmUoZW5kVGltZSkKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MvUHZjcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKaW5kZXggOTY0NDY2MS4uYzMxYWUzNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxNCArMjAsMTMgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIApAQCAtNDYsNyArNDUsNyBAQAogICoKICAqIEV4dHJhY3RzIHRoZSBsYXRlc3QgZWRpdGlvbiBvZiB0aGUgc291cmNlIGNvZGUgZnJvbSBhIFBWQ1MgcmVwb3NpdG9yeS4KICAqIFBWQ1MgaXMgYSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtCi0gKiBkZXZlbG9wZWQgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5tZXJhbnQuY29tL3Byb2R1Y3RzL3B2Y3MiPk1lcmFudDwvYT4uCisgKiBkZXZlbG9wZWQgYnkgTWVyYW50LgogICogPHA+CiAgKiBCZWZvcmUgdXNpbmcgdGhpcyB0YWcsIHRoZSB1c2VyIHJ1bm5pbmcgYW50IG11c3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbW1hbmRzCiAgKiBvZiBQVkNTIChnZXQgYW5kIHBjbGkpIGFuZCBtdXN0IGhhdmUgYWNjZXNzIHRvIHRoZSByZXBvc2l0b3J5LiBOb3RlIHRoYXQgdGhlIHdheSB0byBzcGVjaWZ5CkBAIC03OSwxMCArNzgsMjAgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TXzIgPSAyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NfMyA9IDM7CiAKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENMSV9FWEUgPSAicGNsaSI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0VYRSA9ICJnZXQiOworCiAgICAgcHJpdmF0ZSBTdHJpbmcgcHZjc2JpbjsKICAgICBwcml2YXRlIFN0cmluZyByZXBvc2l0b3J5OwogICAgIHByaXZhdGUgU3RyaW5nIHB2Y3NQcm9qZWN0OwotICAgIHByaXZhdGUgVmVjdG9yIHB2Y3NQcm9qZWN0czsKKyAgICBwcml2YXRlIFZlY3RvcjxQdmNzUHJvamVjdD4gcHZjc1Byb2plY3RzOwogICAgIHByaXZhdGUgU3RyaW5nIHdvcmtzcGFjZTsKICAgICBwcml2YXRlIFN0cmluZyBmb3JjZTsKICAgICBwcml2YXRlIFN0cmluZyBwcm9tb3Rpb25ncm91cDsKQEAgLTk0LDIxICsxMDMsMjUgQEAKICAgICBwcml2YXRlIFN0cmluZyBsaW5lU3RhcnQ7CiAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcklkOwogICAgIHByaXZhdGUgU3RyaW5nIGNvbmZpZzsKLSAgICAvKioKLSAgICAgKiBDb25zdGFudCBmb3IgdGhlIHRoaW5nIHRvIGV4ZWN1dGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENMSV9FWEUgPSAicGNsaSI7Ci0KLSAgICAvKgotICAgICAqIENvbnN0YW50IGZvciB0aGUgUENMSSBsaXN0dmVyc2lvbmVkZmlsZXMgcmVjdXJzaXZlIGkgYSBmb3JtYXQgImdldCIgdW5kZXJzdGFuZHMKLSAgICAgKi8KLSAgICAvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENMSV9MVkZfQVJHUyA9ICJsdmYgLXogLWF3IjsKIAogICAgIC8qKgotICAgICAqIENvbnN0YW50IGZvciB0aGUgdGhpbmcgdG8gZXhlY3V0ZQorICAgICAqIENyZWF0ZXMgYSBQdmNzIG9iamVjdAogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfRVhFID0gImdldCI7Ci0KKyAgICBwdWJsaWMgUHZjcygpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgcHZjc1Byb2plY3QgPSBudWxsOworICAgICAgICBwdmNzUHJvamVjdHMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAgICAgd29ya3NwYWNlID0gbnVsbDsKKyAgICAgICAgcmVwb3NpdG9yeSA9IG51bGw7CisgICAgICAgIHB2Y3NiaW4gPSBudWxsOworICAgICAgICBmb3JjZSA9IG51bGw7CisgICAgICAgIHByb21vdGlvbmdyb3VwID0gbnVsbDsKKyAgICAgICAgbGFiZWwgPSBudWxsOworICAgICAgICBpZ25vcmVyYyA9IGZhbHNlOworICAgICAgICB1cGRhdGVPbmx5ID0gZmFsc2U7CisgICAgICAgIGxpbmVTdGFydCA9ICJcIlA6IjsKKyAgICAgICAgZmlsZW5hbWVGb3JtYXQgPSAiezB9LWFyYyh7MX0pIjsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBSdW4gdGhlIGNvbW1hbmQuCkBAIC0xMjQsNyArMTM3LDcgQEAKICAgICAgICAgICAgIGV4ZS5zZXRXb3JraW5nRGlyZWN0b3J5KGFQcm9qLmdldEJhc2VEaXIoKSk7CiAgICAgICAgICAgICBleGUuc2V0Q29tbWFuZGxpbmUoY21kLmdldENvbW1hbmRsaW5lKCkpOwogICAgICAgICAgICAgcmV0dXJuIGV4ZS5leGVjdXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjbWQudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICsgIi4gRXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBnZXRMb2NhdGlvbigpKTsKQEAgLTEzMiw3ICsxNDUsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldEV4ZWN1dGFibGUoU3RyaW5nIGV4ZSkgewotICAgICAgICBTdHJpbmdCdWZmZXIgY29ycmVjdGVkRXhlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGNvcnJlY3RlZEV4ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGlmIChnZXRQdmNzYmluKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHB2Y3NiaW4uZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpKSB7CiAgICAgICAgICAgICAgICAgY29ycmVjdGVkRXhlLmFwcGVuZChwdmNzYmluKTsKQEAgLTE0NiwxMCArMTU5LDExIEBACiAgICAgLyoqCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBTb21ldGhpbmcgaXMgc3RvcHBpbmcgdGhlIGJ1aWxkLi4uCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCByZXN1bHQgPSAwOwogCi0gICAgICAgIGlmIChyZXBvc2l0b3J5ID09IG51bGwgfHwgcmVwb3NpdG9yeS50cmltKCkuZXF1YWxzKCIiKSkgeworICAgICAgICBpZiAocmVwb3NpdG9yeSA9PSBudWxsIHx8IHJlcG9zaXRvcnkudHJpbSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZXF1aXJlZCBhcmd1bWVudCByZXBvc2l0b3J5IG5vdCBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogCkBAIC0xODMsMTIgKzE5NywxMCBAQAogICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShnZXRQdmNzcHJvamVjdCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWdldFB2Y3Nwcm9qZWN0cygpLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgRW51bWVyYXRpb24gZSA9IGdldFB2Y3Nwcm9qZWN0cygpLmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICgoUHZjc1Byb2plY3QpIGUubmV4dEVsZW1lbnQoKSkuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0TmFtZSA9PSBudWxsIHx8IChwcm9qZWN0TmFtZS50cmltKCkpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJuYW1lIGlzIGEgcmVxdWlyZWQgYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm9mIHB2Y3Nwcm9qZWN0Iik7CisgICAgICAgICAgICBmb3IgKFB2Y3NQcm9qZWN0IHB2Y3NQcm9qZWN0IDogZ2V0UHZjc3Byb2plY3RzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSBwdmNzUHJvamVjdC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKHByb2plY3ROYW1lID09IG51bGwgfHwgcHJvamVjdE5hbWUudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5hbWUgaXMgYSByZXF1aXJlZCBhdHRyaWJ1dGUgb2YgcHZjc3Byb2plY3QiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShwcm9qZWN0TmFtZSk7CiAgICAgICAgICAgICB9CkBAIC0xOTksNyArMjExLDcgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CiAgICAgICAgICAgICB0bXAgPSBuZXcgRmlsZSgicHZjc19hbnRfIiArIHJhbmQubmV4dExvbmcoKSArICIubG9nIik7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZm9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHRtcC50b1BhdGgoKSk7CiAgICAgICAgICAgICB0bXAyID0gbmV3IEZpbGUoInB2Y3NfYW50XyIgKyByYW5kLm5leHRMb25nKCkgKyAiLmxvZyIpOwogICAgICAgICAgICAgbG9nKGNvbW1hbmRMaW5lLmRlc2NyaWJlQ29tbWFuZCgpLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIHRyeSB7CkBAIC0yMzEsNyArMjQzLDcgQEAKICAgICAgICAgICAgIGNvbW1hbmRMaW5lLmNsZWFyQXJncygpOwogICAgICAgICAgICAgY29tbWFuZExpbmUuc2V0RXhlY3V0YWJsZShnZXRFeGVjdXRhYmxlKEdFVF9FWEUpKTsKIAotICAgICAgICAgICAgaWYgKGdldENvbmZpZygpICE9IG51bGwgJiYgZ2V0Q29uZmlnKCkubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoZ2V0Q29uZmlnKCkgIT0gbnVsbCAmJiAhZ2V0Q29uZmlnKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgY29tbWFuZExpbmUuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgiLWMiICsgZ2V0Q29uZmlnKCkpOwogICAgICAgICAgICAgfQogCkBAIC0yNjksMTUgKzI4MSw3IEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIuIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRmFpbGVkIGV4ZWN1dGluZzogIiArIGNvbW1hbmRMaW5lLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICArICIuIEV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZywgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIkZhaWxlZCBleGVjdXRpbmc6ICIgKyBjb21tYW5kTGluZS50b1N0cmluZygpCiAgICAgICAgICAgICAgICAgKyAiLiBFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOwpAQCAtMjk1LDkgKzI5OSw3IEBACiAgICAgICogUGFyc2VzIHRoZSBmaWxlIGFuZCBjcmVhdGVzIHRoZSBmb2xkZXJzIHNwZWNpZmllZCBpbiB0aGUgb3V0cHV0IHNlY3Rpb24KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgY3JlYXRlRm9sZGVycyhGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpKSB7CiAgICAgICAgICAgICBNZXNzYWdlRm9ybWF0IG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoZ2V0RmlsZW5hbWVGb3JtYXQoKSk7CiAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IGluLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7CkBAIC0zMTUsNyArMzE3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGYubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShmLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZGlyLmdldEFic29sdXRlUGF0aCgpICsgIiBleGlzdHMuIFNraXBwaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiQ3JlYXRpbmcgIiArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpci5ta2RpcnMoKSB8fCBkaXIuaXNEaXJlY3RvcnkoKSkgewpAQCAtMzI2LDkgKzMzMSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0lORk8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGRpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZXhpc3RzLiBTa2lwcGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJGaWxlIHNlcGFyYXRvciBwcm9ibGVtIHdpdGggIiArIGxpbmUsCkBAIC0zMzksOCArMzQxLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTIsMjAgKzM1MiwxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBtYXNzYWdlUENMSShGaWxlIGluLCBGaWxlIG91dCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW5SZWFkZXIgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXRXcml0ZXIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaW4pKTsKLSAgICAgICAgICAgIG91dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXQpKTsKLSAgICAgICAgICAgIFN0cmluZyBzID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlICgocyA9IGluUmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc05vcm1hbCA9IHMucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShzTm9ybWFsKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpblJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihpbikpOworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dFdyaXRlciA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXQpKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgbGluZSA6IChJdGVyYWJsZTxTdHJpbmc+KSAoKSAtPiBpblJlYWRlci5saW5lcygpCisgICAgICAgICAgICAgICAgICAgIC5tYXAocyAtPiBzLnJlcGxhY2UoJ1xcJywgJy8nKSkuaXRlcmF0b3IoKSkgeworICAgICAgICAgICAgICAgIG91dFdyaXRlci53cml0ZShsaW5lKTsKICAgICAgICAgICAgICAgICBvdXRXcml0ZXIubmV3TGluZSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluUmVhZGVyKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXRXcml0ZXIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NTUsNyArNDQ4LDcgQEAKICAgICAgKiBHZXQgbmFtZSBvZiB0aGUgcHJvamVjdCBpbiB0aGUgUFZDUyByZXBvc2l0b3J5CiAgICAgICogQHJldHVybiBWZWN0b3IKICAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldFB2Y3Nwcm9qZWN0cygpIHsKKyAgICBwdWJsaWMgVmVjdG9yPFB2Y3NQcm9qZWN0PiBnZXRQdmNzcHJvamVjdHMoKSB7CiAgICAgICAgIHJldHVybiBwdmNzUHJvamVjdHM7CiAgICAgfQogCkBAIC01MjAsMTEgKzUxMyw3IEBACiAgICAgICogQHBhcmFtIGYgU3RyaW5nICh5ZXMvbm8pCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Rm9yY2UoU3RyaW5nIGYpIHsKLSAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLmVxdWFsc0lnbm9yZUNhc2UoInllcyIpKSB7Ci0gICAgICAgICAgICBmb3JjZSA9ICJ5ZXMiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yY2UgPSAibm8iOwotICAgICAgICB9CisgICAgICAgIGZvcmNlID0gInllcyIuZXF1YWxzSWdub3JlQ2FzZShmKSA/ICJ5ZXMiIDogIm5vIjsKICAgICB9CiAKICAgICAvKioKQEAgLTY1MSwyMyArNjQwLDUgQEAKICAgICAgICAgdXNlcklkID0gdTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgUHZjcyBvYmplY3QKLSAgICAgKi8KLSAgICBwdWJsaWMgUHZjcygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgcHZjc1Byb2plY3QgPSBudWxsOwotICAgICAgICBwdmNzUHJvamVjdHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHdvcmtzcGFjZSA9IG51bGw7Ci0gICAgICAgIHJlcG9zaXRvcnkgPSBudWxsOwotICAgICAgICBwdmNzYmluID0gbnVsbDsKLSAgICAgICAgZm9yY2UgPSBudWxsOwotICAgICAgICBwcm9tb3Rpb25ncm91cCA9IG51bGw7Ci0gICAgICAgIGxhYmVsID0gbnVsbDsKLSAgICAgICAgaWdub3JlcmMgPSBmYWxzZTsKLSAgICAgICAgdXBkYXRlT25seSA9IGZhbHNlOwotICAgICAgICBsaW5lU3RhcnQgPSAiXCJQOiI7Ci0gICAgICAgIGZpbGVuYW1lRm9ybWF0ID0gInswfS1hcmMoezF9KSI7Ci0gICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wdmNzL1B2Y3NQcm9qZWN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9wdmNzL1B2Y3NQcm9qZWN0LmphdmEKaW5kZXggYThjNmEyYS4uODljYmVlMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy9QdmNzUHJvamVjdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3B2Y3MvUHZjc1Byb2plY3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDExICsyNiw2IEBACiBwdWJsaWMgY2xhc3MgUHZjc1Byb2plY3QgewogICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKLSAgICAvKiogbm8gYXJnIGNvbnN0cnVjdG9yICovCi0gICAgcHVibGljIFB2Y3NQcm9qZWN0KCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdAogICAgICAqIEBwYXJhbSBuYW1lIHRoZSB2YWx1ZSB0byB1c2UuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmLmphdmEKaW5kZXggYWM5ZWI4OC4uNGEzYWViYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWYuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC00MCw3ICszOSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TY3JpcHRSdW5uZXJIZWxwZXI7CiAKIC8qKgotICogRGVmaW5lIGEgdGFzayB1c2luZyBhIHNjcmlwdAorICogRGVmaW5lcyBhIHRhc2sgdXNpbmcgYSBzY3JpcHQuCiAgKgogICogQHNpbmNlIEFudCAxLjYKICAqLwpAQCAtNTQsMjEgKzUzLDIyIEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKIAogICAgIC8qKiBBdHRyaWJ1dGVzIGRlZmluaXRpb25zIG9mIHRoaXMgc2NyaXB0ICovCi0gICAgcHJpdmF0ZSBMaXN0IGF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqIE5lc3RlZCBFbGVtZW50IGRlZmluaXRpb25zIG9mIHRoaXMgc2NyaXB0ICovCi0gICAgcHJpdmF0ZSBMaXN0IG5lc3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOworICAgIHByaXZhdGUgTGlzdDxOZXN0ZWRFbGVtZW50PiBuZXN0ZWRFbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqIFRoZSBhdHRyaWJ1dGUgbmFtZXMgYXMgYSBzZXQgKi8KLSAgICBwcml2YXRlIFNldCBhdHRyaWJ1dGVTZXQ7CisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBhdHRyaWJ1dGVTZXQ7CiAKICAgICAvKiogVGhlIG5lc3RlZCBlbGVtZW50IGRlZmluaXRpb25zIGluZGV4ZWQgYnkgdGhlaXIgbmFtZXMgKi8KLSAgICBwcml2YXRlIE1hcCBuZXN0ZWRFbGVtZW50TWFwOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTmVzdGVkRWxlbWVudD4gbmVzdGVkRWxlbWVudE1hcDsKIAogICAgIC8qKgogICAgICAqIFNldCB0aGUgcHJvamVjdC4KLSAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IHRoaXMgZGVmIGJlbG93cyB0by4KKyAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB0aGF0IHRoaXMgZGVmaW5pdGlvbiBiZWxvbmdzIHRvLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoUHJvamVjdCBwcm9qZWN0KSB7CiAgICAgICAgIHN1cGVyLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIGhlbHBlci5zZXRQcm9qZWN0Q29tcG9uZW50KHRoaXMpOwpAQCAtNzYsNyArNzYsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHNldCB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGlzIHNjcmlwdCB3aWxsIGJlIGFjdGl2YXRlZCBpbiBhIGJ1aWxkCisgICAgICogU2V0cyB0aGUgbmFtZSB1bmRlciB3aGljaCB0aGlzIHNjcmlwdCB3aWxsIGJlIGFjdGl2YXRlZCBpbiBhIGJ1aWxkCiAgICAgICogZmlsZQogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgYXR0cmlidXRlIG5hbWUKKyAgICAgICAgICogU2V0cyB0aGUgYXR0cmlidXRlIG5hbWUKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgICAqLwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQWRkIGFuIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRvIHRoaXMgc2NyaXB0LgorICAgICAqIEFkZHMgYW4gYXR0cmlidXRlIGRlZmluaXRpb24gdG8gdGhpcyBzY3JpcHQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYXR0cmlidXRlIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbi4KICAgICAgKi8KQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIHNldCB0aGUgdGFnIG5hbWUgZm9yIHRoaXMgbmVzdGVkIGVsZW1lbnQKKyAgICAgICAgICogU2V0cyB0aGUgdGFnIG5hbWUgZm9yIHRoaXMgbmVzdGVkIGVsZW1lbnQKICAgICAgICAgICoKICAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhpcyBuZXN0ZWQgZWxlbWVudAogICAgICAgICAgKi8KQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFNldCB0aGUgdHlwZSBvZiB0aGlzIGVsZW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgYW4KKyAgICAgICAgICogU2V0cyB0aGUgdHlwZSBvZiB0aGlzIGVsZW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgYW4KICAgICAgICAgICogQW50IHRhc2sgb3IgdHlwZSB3aGljaCBpcyB0byBiZSB1c2VkIHdoZW4gdGhpcyBlbGVtZW50IGlzIHRvIGJlCiAgICAgICAgICAqIGNyZWF0ZWQuIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyB0aGUgY2xhc3MgbmFtZSBkaXJlY3RseQogICAgICAgICAgKgpAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogU2V0IHRoZSBjbGFzc25hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHVzZWQgZm9yIHRoZSBuZXN0ZWQgZWxlbWVudC4KKyAgICAgICAgICogU2V0cyB0aGUgY2xhc3NuYW1lIG9mIHRoZSBjbGFzcyB0byBiZSB1c2VkIGZvciB0aGUgbmVzdGVkIGVsZW1lbnQuCiAgICAgICAgICAqIFRoaXMgc3BlY2lmaWVzIHRoZSBjbGFzcyBkaXJlY3RseSBhbmQgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZwogICAgICAgICAgKiB0aGUgQW50IHR5cGUgbmFtZS4KICAgICAgICAgICoKQEAgLTE3MCw3ICsxNzAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZCBhIG5lc3RlZCBlbGVtZW50IGRlZmluaXRpb24uCisgICAgICogQWRkcyBhIG5lc3RlZCBlbGVtZW50IGRlZmluaXRpb24uCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmVzdGVkRWxlbWVudCB0aGUgbmVzdGVkIGVsZW1lbnQgZGVmaW5pdGlvbi4KICAgICAgKi8KQEAgLTE3OSwxNyArMTc5LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRGVmaW5lIHRoZSBzY3JpcHQuCisgICAgICogRGVmaW5lcyB0aGUgc2NyaXB0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2NyaXB0ZGVmIHJlcXVpcmVzIGEgbmFtZSBhdHRyaWJ1dGUgdG8gIgotICAgICAgICAgICAgICAgICsgIm5hbWUgdGhlIHNjcmlwdCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJzY3JpcHRkZWYgcmVxdWlyZXMgYSBuYW1lIGF0dHJpYnV0ZSB0byBuYW1lIHRoZSBzY3JpcHQiKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChoZWxwZXIuZ2V0TGFuZ3VhZ2UoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIjxzY3JpcHRkZWY+IHJlcXVpcmVzIGEgbGFuZ3VhZ2UgYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICArICJ0byBzcGVjaWZ5IHRoZSBzY3JpcHQgbGFuZ3VhZ2UiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic2NyaXB0ZGVmIHJlcXVpcmVzIGEgbGFuZ3VhZ2UgYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlIHNjcmlwdCBsYW5ndWFnZSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhlbHBlci5nZXRTcmMoKSA9PSBudWxsICYmIGhlbHBlci5nZXRFbmNvZGluZygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAic2NyaXB0ZGVmIHJlcXVpcmVzIGEgc3JjIGF0dHJpYnV0ZSBpZiB0aGUgZW5jb2RpbmcgaXMgc2V0Iik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBpZiBuZWVkIHRvIHNldCB0aGUgbG9hZGVyCkBAIC0xOTcsNTIgKzIwMyw0NyBAQAogICAgICAgICAgICAgaGVscGVyLnNldENsYXNzTG9hZGVyKGNyZWF0ZUxvYWRlcigpKTsKICAgICAgICAgfQogCi0gICAgICAgIGF0dHJpYnV0ZVNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaS5uZXh0KCk7CisgICAgICAgIGF0dHJpYnV0ZVNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChBdHRyaWJ1dGUgYXR0cmlidXRlIDogYXR0cmlidXRlcykgewogICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZS5uYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdGRlZiA8YXR0cmlidXRlPiBlbGVtZW50cyAiCi0gICAgICAgICAgICAgICAgICAgICsgIm11c3Qgc3BlY2lmeSBhbiBhdHRyaWJ1dGUgbmFtZSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNjcmlwdGRlZiA8YXR0cmlidXRlPiBlbGVtZW50cyBtdXN0IHNwZWNpZnkgYW4gYXR0cmlidXRlIG5hbWUiKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNldC5jb250YWlucyhhdHRyaWJ1dGUubmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdGRlZiA8IiArIG5hbWUgKyAiPiBkZWNsYXJlcyAiCi0gICAgICAgICAgICAgICAgICAgICsgInRoZSAiICsgYXR0cmlidXRlLm5hbWUgKyAiIGF0dHJpYnV0ZSBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNjcmlwdGRlZiA8JXM+IGRlY2xhcmVzIHRoZSAlcyBhdHRyaWJ1dGUgbW9yZSB0aGFuIG9uY2UiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBhdHRyaWJ1dGUubmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdHRyaWJ1dGVTZXQuYWRkKGF0dHJpYnV0ZS5uYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIG5lc3RlZEVsZW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBuZXN0ZWRFbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCA9IChOZXN0ZWRFbGVtZW50KSBpLm5leHQoKTsKKyAgICAgICAgbmVzdGVkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChOZXN0ZWRFbGVtZW50IG5lc3RlZEVsZW1lbnQgOiBuZXN0ZWRFbGVtZW50cykgewogICAgICAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnQubmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzY3JpcHRkZWYgPGVsZW1lbnQ+IGVsZW1lbnRzICIKLSAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBzcGVjaWZ5IGFuIGVsZW1lbnQgbmFtZSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNjcmlwdGRlZiA8ZWxlbWVudD4gZWxlbWVudHMgbXVzdCBzcGVjaWZ5IGFuIGVsZW1lbnQgbmFtZSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnRNYXAuY29udGFpbnNLZXkobmVzdGVkRWxlbWVudC5uYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2NyaXB0ZGVmIDwiICsgbmFtZSArICI+IGRlY2xhcmVzICIKLSAgICAgICAgICAgICAgICAgICAgKyAidGhlICIgKyBuZXN0ZWRFbGVtZW50Lm5hbWUgKyAiIG5lc3RlZCBlbGVtZW50IG1vcmUgIgotICAgICAgICAgICAgICAgICAgICArICJ0aGFuIG9uY2UiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJzY3JpcHRkZWYgPCVzPiBkZWNsYXJlcyB0aGUgJXMgbmVzdGVkIGVsZW1lbnQgbW9yZSB0aGFuIG9uY2UiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLCBuZXN0ZWRFbGVtZW50Lm5hbWUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobmVzdGVkRWxlbWVudC5jbGFzc05hbWUgPT0gbnVsbAogICAgICAgICAgICAgICAgICYmIG5lc3RlZEVsZW1lbnQudHlwZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJzY3JpcHRkZWYgPGVsZW1lbnQ+IGVsZW1lbnRzICIKLSAgICAgICAgICAgICAgICAgICAgKyAibXVzdCBzcGVjaWZ5IGVpdGhlciBhIGNsYXNzbmFtZSBvciB0eXBlIGF0dHJpYnV0ZSIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNjcmlwdGRlZiA8ZWxlbWVudD4gZWxlbWVudHMgbXVzdCBzcGVjaWZ5IGVpdGhlciBhIGNsYXNzbmFtZSBvciB0eXBlIGF0dHJpYnV0ZSIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnQuY2xhc3NOYW1lICE9IG51bGwKICAgICAgICAgICAgICAgICAmJiBuZXN0ZWRFbGVtZW50LnR5cGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigic2NyaXB0ZGVmIDxlbGVtZW50PiBlbGVtZW50cyAiCi0gICAgICAgICAgICAgICAgICAgICsgIm11c3Qgc3BlY2lmeSBvbmx5IG9uZSBvZiB0aGUgY2xhc3NuYW1lIGFuZCB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlcyIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgInNjcmlwdGRlZiA8ZWxlbWVudD4gZWxlbWVudHMgbXVzdCBzcGVjaWZ5IG9ubHkgb25lIG9mIHRoZSBjbGFzc25hbWUgYW5kIHR5cGUgYXR0cmlidXRlcyIpOwogICAgICAgICAgICAgfQotCi0KICAgICAgICAgICAgIG5lc3RlZEVsZW1lbnRNYXAucHV0KG5lc3RlZEVsZW1lbnQubmFtZSwgbmVzdGVkRWxlbWVudCk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmaW5kIHRoZSBzY3JpcHQgcmVwb3NpdG9yeSAtIGl0IGlzIHN0b3JlZCBpbiB0aGUgcHJvamVjdAotICAgICAgICBNYXAgc2NyaXB0UmVwb3NpdG9yeSA9IGxvb2t1cFNjcmlwdFJlcG9zaXRvcnkoKTsKKyAgICAgICAgTWFwPFN0cmluZywgU2NyaXB0RGVmPiBzY3JpcHRSZXBvc2l0b3J5ID0gbG9va3VwU2NyaXB0UmVwb3NpdG9yeSgpOwogICAgICAgICBuYW1lID0gUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKGdldFVSSSgpLCBuYW1lKTsKICAgICAgICAgc2NyaXB0UmVwb3NpdG9yeS5wdXQobmFtZSwgdGhpcyk7CiAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGRlZiA9IG5ldyBBbnRUeXBlRGVmaW5pdGlvbigpOwpAQCAtMjUzLDE4ICsyNTQsMTggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kIG9yIGNyZWF0ZSB0aGUgc2NyaXB0IHJlcG9zaXRvcnkgLSBpdCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QuCisgICAgICogRmluZHMgb3IgY3JlYXRlcyB0aGUgc2NyaXB0IHJlcG9zaXRvcnkgLSBpdCBpcyBzdG9yZWQgaW4gdGhlIHByb2plY3QuCiAgICAgICogVGhpcyBtZXRob2QgaXMgc3luY2hyb25pemVkIG9uIHRoZSBwcm9qZWN0IHVuZGVyIHtAbGluayBNYWdpY05hbWVzI1NDUklQVF9SRVBPU0lUT1JZfQogICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgc2NyaXB0IHJlcG9zaXRvcnkgcmVnaXN0ZXJlZCBhcyBhIHJlZmVyZW5jZS4KICAgICAgKi8KLSAgICBwcml2YXRlIE1hcCBsb29rdXBTY3JpcHRSZXBvc2l0b3J5KCkgewotICAgICAgICBNYXAgc2NyaXB0UmVwb3NpdG9yeSA9IG51bGw7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTY3JpcHREZWY+IGxvb2t1cFNjcmlwdFJlcG9zaXRvcnkoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFNjcmlwdERlZj4gc2NyaXB0UmVwb3NpdG9yeTsKICAgICAgICAgUHJvamVjdCBwID0gZ2V0UHJvamVjdCgpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHApIHsKICAgICAgICAgICAgIHNjcmlwdFJlcG9zaXRvcnkgPQotICAgICAgICAgICAgICAgICAgICAoTWFwKSBwLmdldFJlZmVyZW5jZShNYWdpY05hbWVzLlNDUklQVF9SRVBPU0lUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgcC5nZXRSZWZlcmVuY2UoTWFnaWNOYW1lcy5TQ1JJUFRfUkVQT1NJVE9SWSk7CiAgICAgICAgICAgICBpZiAoc2NyaXB0UmVwb3NpdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc2NyaXB0UmVwb3NpdG9yeSA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgICAgICAgICAgc2NyaXB0UmVwb3NpdG9yeSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICBwLmFkZFJlZmVyZW5jZShNYWdpY05hbWVzLlNDUklQVF9SRVBPU0lUT1JZLAogICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0UmVwb3NpdG9yeSk7CiAgICAgICAgICAgICB9CkBAIC0yNzMsMjAgKzI3NCwyMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5lc3RlZCBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCisgICAgICogQ3JlYXRlcyBhIG5lc3RlZCBlbGVtZW50IHRvIGJlIGNvbmZpZ3VyZWQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZWxlbWVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50LgogICAgICAqIEByZXR1cm4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWxlbWVudCBuYW1lLgogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlTmVzdGVkRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUpIHsKLSAgICAgICAgTmVzdGVkRWxlbWVudCBkZWZpbml0aW9uCi0gICAgICAgICAgICA9IChOZXN0ZWRFbGVtZW50KSBuZXN0ZWRFbGVtZW50TWFwLmdldChlbGVtZW50TmFtZSk7CisgICAgICAgIE5lc3RlZEVsZW1lbnQgZGVmaW5pdGlvbiA9IG5lc3RlZEVsZW1lbnRNYXAuZ2V0KGVsZW1lbnROYW1lKTsKICAgICAgICAgaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCI8IiArIG5hbWUgKyAiPiBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICArICJ0aGUgPCIgKyBlbGVtZW50TmFtZSArICI+IG5lc3RlZCBlbGVtZW50Iik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIjwlcz4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgPCVzPiBuZXN0ZWQgZWxlbWVudCIsIG5hbWUsCisgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlOwogICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZGVmaW5pdGlvbi5jbGFzc05hbWU7CiAgICAgICAgIGlmIChjbGFzc25hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgaW5zdGFuY2UgPSBnZXRQcm9qZWN0KCkuY3JlYXRlVGFzayhkZWZpbml0aW9uLnR5cGUpOwpAQCAtMjk0LDExICsyOTUsNiBAQAogICAgICAgICAgICAgICAgIGluc3RhbmNlID0gZ2V0UHJvamVjdCgpLmNyZWF0ZURhdGFUeXBlKGRlZmluaXRpb24udHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgLy8gdHJ5IHRoZSBjb250ZXh0IGNsYXNzbG9hZGVyCi0gICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIKLSAgICAgICAgICAgICAgICA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0gICAgICAgICAgICAqLwogICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gY3JlYXRlTG9hZGVyKCk7CiAKICAgICAgICAgICAgIHRyeSB7CkBAIC0zMDYsMzEgKzMwMiwzMyBAQAogICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIGluc3RhbmNlID0gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NuYW1lLCBTY3JpcHREZWYuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXRQcm9qZWN0UmVmZXJlbmNlKGluc3RhbmNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIjwiICsgbmFtZSArICI+IGlzIHVuYWJsZSB0byBjcmVhdGUgIgotICAgICAgICAgICAgICAgICsgInRoZSA8IiArIGVsZW1lbnROYW1lICsgIj4gbmVzdGVkIGVsZW1lbnQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiPCVzPiBpcyB1bmFibGUgdG8gY3JlYXRlIHRoZSA8JXM+IG5lc3RlZCBlbGVtZW50IiwgbmFtZSwKKyAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEV4ZWN1dGUgdGhlIHNjcmlwdC4KKyAgICAgKiBFeGVjdXRlcyB0aGUgc2NyaXB0LgogICAgICAqCiAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGVzCiAgICAgICogQHBhcmFtIGVsZW1lbnRzIGEgbGlzdCBvZiBuZXN0ZWQgZWxlbWVudCB2YWx1ZXMuCiAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgogICAgICAqICAgICAgICAgICAgIFVzZSBleGVjdXRlU2NyaXB0KGF0dHJpYnV0ZSwgZWxlbWVudHMsIGluc3RhbmNlKSBpbnN0ZWFkLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGVTY3JpcHQoTWFwIGF0dHJpYnV0ZXMsIE1hcCBlbGVtZW50cykgeworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMsCisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8T2JqZWN0Pj4gZWxlbWVudHMpIHsKICAgICAgICAgZXhlY3V0ZVNjcmlwdChhdHRyaWJ1dGVzLCBlbGVtZW50cywgbnVsbCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRXhlY3V0ZSB0aGUgc2NyaXB0LgorICAgICAqIEV4ZWN1dGVzIHRoZSBzY3JpcHQuCiAgICAgICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHNjcmlwdCBpbnN0YW5jZSB0byBleGVjdXRlIHRoZSBzY3JpcHQgZm9yIHRoaXMKICAgICAgKiBkZWZpbml0aW9uLgogICAgICAqCkBAIC0zMzgsNyArMzM2LDggQEAKICAgICAgKiBAcGFyYW0gZWxlbWVudHMgICBhIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnQgdmFsdWVzLgogICAgICAqIEBwYXJhbSBpbnN0YW5jZSAgIHRoZSBzY3JpcHQgaW5zdGFuY2U7IGNhbiBiZSBudWxsCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChNYXAgYXR0cmlidXRlcywgTWFwIGVsZW1lbnRzLCBTY3JpcHREZWZCYXNlIGluc3RhbmNlKSB7CisgICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMsCisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8T2JqZWN0Pj4gZWxlbWVudHMsIFNjcmlwdERlZkJhc2UgaW5zdGFuY2UpIHsKICAgICAgICAgU2NyaXB0UnVubmVyQmFzZSBydW5uZXIgPSBoZWxwZXIuZ2V0U2NyaXB0UnVubmVyKCk7CiAgICAgICAgIHJ1bm5lci5hZGRCZWFuKCJhdHRyaWJ1dGVzIiwgYXR0cmlidXRlcyk7CiAgICAgICAgIHJ1bm5lci5hZGRCZWFuKCJlbGVtZW50cyIsIGVsZW1lbnRzKTsKQEAgLTM2OCw3ICszNjcsMTcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlIDsgb3B0aW9uYWwuCisgICAgICogRGVmaW5lcyB0aGUgY29tcGlsYXRpb24gZmVhdHVyZTsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGlsZWQgZW5hYmxlcyB0aGUgc2NyaXB0IGNvbXBpbGF0aW9uIGlmIGF2YWlsYWJsZS4KKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbXBpbGVkKGJvb2xlYW4gY29tcGlsZWQpIHsKKyAgICAgICAgaGVscGVyLnNldENvbXBpbGVkKGNvbXBpbGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZTsgb3B0aW9uYWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgogICAgICAqLwpAQCAtMzc3LDcgKzM4NiwxNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNldCB0aGUgc2NyaXB0IHRleHQuCisgICAgICogU2V0cyB0aGUgZW5jb2Rpbmcgb2YgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGU7IG9wdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGhlbHBlci5zZXRFbmNvZGluZyhlbmNvZGluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2NyaXB0IHRleHQuCiAgICAgICoKICAgICAgKiBAcGFyYW0gdGV4dCBhIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0IHRleHQgdG8gYmUgYWRkZWQuCiAgICAgICovCkBAIC0zODYsMTIgKzQwNSwxMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEFkZCBhbnkgc291cmNlIHJlc291cmNlLgotICAgICAqIEBzaW5jZSBBbnQxLjcuMQorICAgICAqIEFkZHMgYW55IHNvdXJjZSByZXNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW50IDEuNy4xCiAgICAgICogQHBhcmFtIHJlc291cmNlIHNvdXJjZSBvZiBzY3JpcHQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGQoUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlKSB7CiAgICAgICAgIGhlbHBlci5hZGQocmVzb3VyY2UpOwogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZkJhc2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9TY3JpcHREZWZCYXNlLmphdmEKaW5kZXggOTVkMTVhYS4uOGEwZGQ5NCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZkJhc2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmQmFzZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsMTAgKzM2LDEwIEBACiBwdWJsaWMgY2xhc3MgU2NyaXB0RGVmQmFzZSBleHRlbmRzIFRhc2sgaW1wbGVtZW50cyBEeW5hbWljQ29uZmlndXJhdG9yIHsKIAogICAgIC8qKiBOZXN0ZWQgZWxlbWVudHMgKi8KLSAgICBwcml2YXRlIE1hcCBuZXN0ZWRFbGVtZW50TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8T2JqZWN0Pj4gbmVzdGVkRWxlbWVudE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIC8qKiBBdHRyaWJ1dGVzICovCi0gICAgcHJpdmF0ZSBNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwcml2YXRlIFN0cmluZyB0ZXh0OwogCkBAIC00NywxOSArNDcsMjAgQEAKICAgICAgKiBMb2NhdGUgdGhlIHNjcmlwdCBkZWZpbmluZyB0YXNrIGFuZCBleGVjdXRlIHRoZSBzY3JpcHQgYnkgcGFzc2luZwogICAgICAqIGNvbnRyb2wgdG8gaXQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICBnZXRTY3JpcHQoKS5leGVjdXRlU2NyaXB0KGF0dHJpYnV0ZXMsIG5lc3RlZEVsZW1lbnRNYXAsIHRoaXMpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2NyaXB0RGVmIGdldFNjcmlwdCgpIHsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBnZXRUYXNrVHlwZSgpOwotICAgICAgICBNYXAgc2NyaXB0UmVwb3NpdG9yeQotICAgICAgICAgICAgPSAoTWFwKSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKE1hZ2ljTmFtZXMuU0NSSVBUX1JFUE9TSVRPUlkpOworICAgICAgICBNYXA8U3RyaW5nLCBTY3JpcHREZWY+IHNjcmlwdFJlcG9zaXRvcnkgPQorICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShNYWdpY05hbWVzLlNDUklQVF9SRVBPU0lUT1JZKTsKICAgICAgICAgaWYgKHNjcmlwdFJlcG9zaXRvcnkgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTY3JpcHQgcmVwb3NpdG9yeSBub3QgZm91bmQgZm9yICIgKyBuYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIFNjcmlwdERlZiBkZWZpbml0aW9uID0gKFNjcmlwdERlZikgc2NyaXB0UmVwb3NpdG9yeS5nZXQoZ2V0VGFza1R5cGUoKSk7CisgICAgICAgIFNjcmlwdERlZiBkZWZpbml0aW9uID0gc2NyaXB0UmVwb3NpdG9yeS5nZXQoZ2V0VGFza1R5cGUoKSk7CiAgICAgICAgIGlmIChkZWZpbml0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU2NyaXB0IGRlZmluaXRpb24gbm90IGZvdW5kIGZvciAiICsgbmFtZSk7CiAgICAgICAgIH0KQEAgLTcyLDEyICs3MywxMCBAQAogICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuZXN0ZWQgZWxlbWVudCBuYW1lCiAgICAgICogQHJldHVybiB0aGUgZWxlbWVudCB0byBiZSBjb25maWd1cmVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjcmVhdGVEeW5hbWljRWxlbWVudChTdHJpbmcgbmFtZSkgIHsKLSAgICAgICAgTGlzdCBuZXN0ZWRFbGVtZW50TGlzdCA9IChMaXN0KSBuZXN0ZWRFbGVtZW50TWFwLmdldChuYW1lKTsKLSAgICAgICAgaWYgKG5lc3RlZEVsZW1lbnRMaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIG5lc3RlZEVsZW1lbnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgbmVzdGVkRWxlbWVudE1hcC5wdXQobmFtZSwgbmVzdGVkRWxlbWVudExpc3QpOwotICAgICAgICB9CisgICAgICAgIExpc3Q8T2JqZWN0PiBuZXN0ZWRFbGVtZW50TGlzdCA9CisgICAgICAgICAgICBuZXN0ZWRFbGVtZW50TWFwLmNvbXB1dGVJZkFic2VudChuYW1lLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKTsKICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBnZXRTY3JpcHQoKS5jcmVhdGVOZXN0ZWRFbGVtZW50KG5hbWUpOwogICAgICAgICBuZXN0ZWRFbGVtZW50TGlzdC5hZGQoZWxlbWVudCk7CiAgICAgICAgIHJldHVybiBlbGVtZW50OwpAQCAtODksMTMgKzg4LDE0IEBACiAgICAgICogQHBhcmFtIG5hbWUgdGhlIGF0dHJpYnV0ZSBuYW1lLgogICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgYXR0cmlidXRlJ3Mgc3RyaW5nIHZhbHVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIFNjcmlwdERlZiBkZWZpbml0aW9uID0gZ2V0U2NyaXB0KCk7CiAgICAgICAgIGlmICghZGVmaW5pdGlvbi5pc0F0dHJpYnV0ZVN1cHBvcnRlZChuYW1lKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiPCIgKyBnZXRUYXNrVHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIj4gZG9lcyBub3Qgc3VwcG9ydCB0aGUgXCIiICsgbmFtZSArICJcIiBhdHRyaWJ1dGUiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiPCVzPiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBcIiVzXCIgYXR0cmlidXRlIiwgZ2V0VGFza1R5cGUoKSwKKyAgICAgICAgICAgICAgICBuYW1lKTsKICAgICAgICAgfQotCiAgICAgICAgIGF0dHJpYnV0ZXMucHV0KG5hbWUsIHZhbHVlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1MuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1MuamF2YQppbmRleCBiZTJlMzM2Li41MGNjNzQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPUy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzg4LDYgKzM4OCw3IEBACiAgICAgICoKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpbnQgcmVzdWx0ID0gMDsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDaGVja2luLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ2hlY2tpbi5qYXZhCmluZGV4IDdhOGEyNDYuLjA4NjA1YjkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDaGVja2luLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NoZWNraW4uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTcwLDYgKzcwLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKICAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NoZWNrb3V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ2hlY2tvdXQuamF2YQppbmRleCA2OTk0ZGZhLi5jNjczYzk1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ2hlY2tvdXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ2hlY2tvdXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU5LDYgKzU5LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKICAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NtZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0NtZC5qYXZhCmluZGV4IDlkN2Q1NDMuLjdiNjc5NjIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NDbWQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TQ21kLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TR2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TR2V0LmphdmEKaW5kZXggYmQxMzk1OS4uMGYzNTdiMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0dldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NHZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc5LDYgKzc5LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKICAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL1NPU0xhYmVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TTGFiZWwuamF2YQppbmRleCAyMWU4ODE1Li43MzQ4MWZmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TTGFiZWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TTGFiZWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgQ29tbWFuZGxpbmUgdGhlIGdlbmVyYXRlZCBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbW1hbmRsaW5lIGJ1aWxkQ21kTGluZSgpIHsKICAgICAgICAgY29tbWFuZExpbmUgPSBuZXcgQ29tbWFuZGxpbmUoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL3BhY2thZ2UuaHRtbCBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9wYWNrYWdlLmh0bWwKaW5kZXggNDAxYzdkNy4uZjA5MTVhZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc29zL3BhY2thZ2UuaHRtbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvcGFja2FnZS5odG1sCkBAIC0xLDQgKzEsNCBAQAotPGh0bWw+Cis8IURPQ1RZUEUgaHRtbD4KIDwhLS0KICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQogICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNSwxNSArMTUsMTkgQEAKICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPHRpdGxlPlNvdXJjZU9mZlNpdGUgU0NNIHRhc2tzPC90aXRsZT4KKzwvaGVhZD4KIDxib2R5PgogICA8cD4KICAgICBBbnQgdGFza3MgZm9yIHdvcmtpbmcgd2l0aCBhIFNvdXJjZU9mZlNpdGUgc291cmNlIGNvbnRyb2wgc3lzdGVtLgogICA8L3A+Ci0gIDxwPgotICAgIFRoZSAmbHQ7U09TR2V0Jmd0OyBSZXRyaWV2ZXMgZmlsZShzKSBmcm9tIGEgU09TIGRhdGFiYXNlPGJyLz4KLSAgICBUaGUgJmx0O1NPU0NoZWNraW4mZ3Q7IENvbW1pdHMgYW5kIHVubG9ja3MgZmlsZShzKSBpbiBhIFNPUyBkYXRhYmFzZTxici8+Ci0gICAgVGhlICZsdDtTT1NDaGVja291dCZndDsgUmV0cmlldmVzIGFuZCBsb2NrIGZpbGUocykgaW4gYSBTT1MgZGF0YWJhc2U8YnIvPgotICAgIFRoZSAmbHQ7U09TTGFiZWwmZ3Q7IExhYmVsIGEgU09TIGRhdGFiYXNlCi0gIDwvcD4KKyAgPGRsPgorICAgIDxkdD4mbHQ7U09TR2V0Jmd0OzwvZHQ+PGRkPlJldHJpZXZlcyBmaWxlKHMpIGZyb20gYSBTT1MgZGF0YWJhc2U8L2RkPgorICAgIDxkdD4mbHQ7U09TQ2hlY2tpbiZndDs8L2R0PjxkZD5Db21taXRzIGFuZCB1bmxvY2tzIGZpbGUocykgaW4gYSBTT1MgZGF0YWJhc2U8L2RkPgorICAgIDxkdD4mbHQ7U09TQ2hlY2tvdXQmZ3Q7PC9kdD48ZGQ+UmV0cmlldmVzIGFuZCBsb2NrIGZpbGUocykgaW4gYSBTT1MgZGF0YWJhc2U8L2RkPgorICAgIDxkdD4mbHQ7U09TTGFiZWwmZ3Q7PC9kdD48ZGQ+TGFiZWwgYSBTT1MgZGF0YWJhc2U8L2RkPgorICA8L2RsPgogPC9ib2R5PgogPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvQW50U291bmRQbGF5ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL0FudFNvdW5kUGxheWVyLmphdmEKaW5kZXggZDE2NzVhOC4uNjIzZmI2MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc291bmQvQW50U291bmRQbGF5ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3VuZC9BbnRTb3VuZFBsYXllci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsNyArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIAogLyoqCkBAIC02MCwxMCArNjAsNiBAQAogICAgIHByaXZhdGUgaW50IGxvb3BzRmFpbCA9IDA7CiAgICAgcHJpdmF0ZSBMb25nIGR1cmF0aW9uRmFpbCA9IG51bGw7CiAKLSAgICAvKiogQ29uc3RydWN0b3IgZm9yIEFudFNvdW5kUGxheWVyLiAqLwotICAgIHB1YmxpYyBBbnRTb3VuZFBsYXllcigpIHsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGF1ZGlvIGZpbGUgdG8gYmUgcGxheWVkIHdoZW4gdGhlCiAgICAgICogICAgICAgIGJ1aWxkIGlzIHN1Y2Nlc3NmdWwKQEAgLTEwMiw3ICs5OCw2IEBACiAKICAgICAgICAgQXVkaW9JbnB1dFN0cmVhbSBhdWRpb0lucHV0U3RyZWFtID0gbnVsbDsKIAotCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhdWRpb0lucHV0U3RyZWFtID0gQXVkaW9TeXN0ZW0uZ2V0QXVkaW9JbnB1dFN0cmVhbShmaWxlKTsKICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRBdWRpb0ZpbGVFeGNlcHRpb24gdWFmZSkgewpAQCAtMTE0LDggKzEwOSw3IEBACiAKICAgICAgICAgaWYgKGF1ZGlvSW5wdXRTdHJlYW0gIT0gbnVsbCkgewogICAgICAgICAgICAgQXVkaW9Gb3JtYXQgZm9ybWF0ID0gYXVkaW9JbnB1dFN0cmVhbS5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIERhdGFMaW5lLkluZm8gICBpbmZvID0gbmV3IERhdGFMaW5lLkluZm8oQ2xpcC5jbGFzcywgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW0uTk9UX1NQRUNJRklFRCk7CisgICAgICAgICAgICBEYXRhTGluZS5JbmZvIGluZm8gPSBuZXcgRGF0YUxpbmUuSW5mbyhDbGlwLmNsYXNzLCBmb3JtYXQsIEF1ZGlvU3lzdGVtLk5PVF9TUEVDSUZJRUQpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0NsaXAgPSAoQ2xpcCkgQXVkaW9TeXN0ZW0uZ2V0TGluZShpbmZvKTsKQEAgLTEyOSw3ICsxMjMsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlDbGlwKGF1ZGlvQ2xpcCwgZHVyYXRpb24ubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBwbGF5Q2xpcChhdWRpb0NsaXAsIGR1cmF0aW9uKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBwbGF5Q2xpcChhdWRpb0NsaXAsIGxvb3BzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMzcsOSArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXVkaW9DbGlwLmRyYWluKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAoYXVkaW9DbGlwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9DbGlwLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShhdWRpb0NsaXApOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcHJvamVjdC5sb2coIkNhbid0IGdldCBkYXRhIGZyb20gZmlsZSAiICsgZmlsZS5nZXROYW1lKCkpOwpAQCAtMTgyLDYgKzE3NCw3IEBACiAgICAgICogY2xpcCBpZiByZXF1aXJlZC4KICAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGxpbmUgZXZlbnQgdG8gZm9sbG93CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKExpbmVFdmVudCBldmVudCkgewogICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpLmVxdWFscyhMaW5lRXZlbnQuVHlwZS5TVE9QKSkgewogICAgICAgICAgICAgTGluZSBsaW5lID0gZXZlbnQuZ2V0TGluZSgpOwpAQCAtMTk0LDYgKzE4Nyw3IEBACiAgICAgICogIEZpcmVkIGJlZm9yZSBhbnkgdGFyZ2V0cyBhcmUgc3RhcnRlZC4KICAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCkBAIC0yMDMsNiArMTk3LDcgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGJ1aWxkIGZpbmlzaGVkIGV2ZW50LgogICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGV2ZW50LmdldEV4Y2VwdGlvbigpID09IG51bGwgJiYgZmlsZVN1Y2Nlc3MgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gYnVpbGQgc3VjY2Vzc2Z1bCEKQEAgLTIxNyw2ICsyMTIsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgogICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0VGFyZ2V0KCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICB9CiAKQEAgLTIyNiw2ICsyMjIsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgogICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgfQogCkBAIC0yMzQsNiArMjMxLDcgQEAKICAgICAgKiBAcGFyYW0gZXZlbnQgaWdub3JlZC4KICAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldFRhc2soKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICB9CiAKQEAgLTI0Myw2ICsyNDEsNyBAQAogICAgICAqIEBwYXJhbSBldmVudCBpZ25vcmVkLgogICAgICAqICBAc2VlIEJ1aWxkRXZlbnQjZ2V0RXhjZXB0aW9uKCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgIH0KIApAQCAtMjUyLDYgKzI1MSw3IEBACiAgICAgICogIEBzZWUgQnVpbGRFdmVudCNnZXRNZXNzYWdlKCkKICAgICAgKiAgQHNlZSBCdWlsZEV2ZW50I2dldFByaW9yaXR5KCkKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3VuZC9Tb3VuZFRhc2suamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCmluZGV4IDQ4ZTM2YjAuLjkxOTM2MjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NvdW5kL1NvdW5kVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgICAgICBpZiAoc291cmNlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiBmaWxlcyBpbiB0aGUgZGlyCi0gICAgICAgICAgICAgICAgICAgIFZlY3RvcjxGaWxlPiBmaWxlcyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEZpbGU+IGZpbGVzID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZpbGUgOiBzb3VyY2UubGlzdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzb3VyY2UsIGZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNGaWxlKCkpIHsKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICAgICAgICAgICAgICBSYW5kb20gcm4gPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgICAgICAgICAgICAgIGludCB4ID0gcm4ubmV4dEludChudW1maWxlcyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc291cmNlIHRvIHRoZSBmaWxlIGF0IHRoYXQgbG9jYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSAoRmlsZSkgZmlsZXMuZWxlbWVudEF0KHgpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGZpbGVzLmVsZW1lbnRBdCh4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxvZyhzb3VyY2UgKyAiOiBpbnZhbGlkIHBhdGguIiwgUHJvamVjdC5NU0dfV0FSTik7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvU3BsYXNoU2NyZWVuLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvU3BsYXNoU2NyZWVuLmphdmEKaW5kZXggNWRlODRjYy4uMGMyZTU0ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFNjcmVlbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW4uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDggKzM3LDEwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIAogY2xhc3MgU3BsYXNoU2NyZWVuIGV4dGVuZHMgSldpbmRvdyBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyLCBCdWlsZExpc3RlbmVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRk9OVF9TSVpFID0gMTI7CiAgICAgcHJpdmF0ZSBKTGFiZWwgdGV4dDsKICAgICBwcml2YXRlIEpQcm9ncmVzc0JhciBwYjsKQEAgLTExOCw2ICsxMjAsNyBAQAogICAgICAgICB0ZXh0LnNldFRleHQodHh0KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgYSkgewogICAgICAgICBpZiAoIWhhc1Byb2dyZXNzUGF0dGVybigpKSB7CiAgICAgICAgICAgICBpZiAodG90YWwgPCBNQVgpIHsKQEAgLTEyOSwzMSArMTMyLDM4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBhY3Rpb25QZXJmb3JtZWQobnVsbCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIHBiLnNldFZhbHVlKE1BWCk7CiAgICAgICAgIHNldFZpc2libGUoZmFsc2UpOwogICAgICAgICBkaXNwb3NlKCk7CiAgICAgfQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBhY3Rpb25QZXJmb3JtZWQobnVsbCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBhY3Rpb25QZXJmb3JtZWQobnVsbCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBhY3Rpb25QZXJmb3JtZWQobnVsbCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgYWN0aW9uUGVyZm9ybWVkKG51bGwpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICBhY3Rpb25QZXJmb3JtZWQobnVsbCk7CiAgICAgICAgIGlmIChoYXNQcm9ncmVzc1BhdHRlcm4oKSkgewpAQCAtMTYyLDEyICsxNzIsMTEgQEAKICAgICAgICAgICAgIGlmIChtYXRjaGVyICE9IG51bGwgJiYgbWF0Y2hlci5tYXRjaGVzKCkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZ3IgPSBtYXRjaGVyLmdyb3VwKDEpOwogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpID0gTWF0aC5taW4obmV3IEludGVnZXIoZ3IpLmludFZhbHVlKCkgKiAyLCBNQVgpOwotICAgICAgICAgICAgICAgICAgICBwYi5zZXRWYWx1ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgcGIuc2V0VmFsdWUoTWF0aC5taW4oSW50ZWdlci5wYXJzZUludChncikgKiAyLCBNQVgpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGhvdyB0byByZWFjaCBsb2dnZXI/IT8KLSAgICAgICAgICAgICAgICAgICAgLy9sb2coIk51bWJlciBwYXJzaW5nIGVycm9yIGluIHByb2dyZXNzUmVnRXhwIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7Ci0KKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0UHJvamVjdCgpLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgcGFyc2luZyBlcnJvciBpbiBwcm9ncmVzc1JlZ0V4cCIsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hUYXNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvU3BsYXNoVGFzay5qYXZhCmluZGV4IDlkOTk1YmMuLjM1MThjZjMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hUYXNrLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3BsYXNoL1NwbGFzaFRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKQEAgLTExMSw3ICsxMTAsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFByb3h5IHBhc3N3b3JkOyByZXF1aXJlZCBpZiA8dHQ+dXNlcjwvdHQ+IGlzIHNldC4KKyAgICAgKiBQcm94eSBwYXNzd29yZDsgcmVxdWlyZWQgaWYgPGNvZGU+dXNlcjwvY29kZT4gaXMgc2V0LgogICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcHJveHkgcGFzc3dvcmQKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjUueC4KICAgICAgKiAgICAgICAgICAgICBVc2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LlNldFByb3h5CkBAIC0xODMsOCArMTgyLDggQEAKICAgICAgICAgICAgICAgICBzcC5zZXRQcm94eVBhc3N3b3JkKHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICBzcC5hcHBseVdlYlByb3h5U2V0dGluZ3MoKTsKIAotICAgICAgICAgICAgICAgIGlmICh1c2VQcm94eSAmJiAocHJveHkgIT0gbnVsbCAmJiBwcm94eS5sZW5ndGgoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICYmIChwb3J0ICE9IG51bGwgJiYgcG9ydC5sZW5ndGgoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZVByb3h5ICYmIChwcm94eSAhPSBudWxsICYmICFwcm94eS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgICYmIChwb3J0ICE9IG51bGwgJiYgIXBvcnQuaXNFbXB0eSgpKSkgewogCiAgICAgICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgcHJveGllZCBDb25uZWN0aW9uIiwgIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoImh0dHAucHJveHlTZXQiLCAidHJ1ZSIpOwpAQCAtMTkyLDcgKzE5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGltZ3VybCk7CiAKICAgICAgICAgICAgICAgICAgICAgY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodXNlciAhPSBudWxsICYmIHVzZXIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VyICE9IG51bGwgJiYgIXVzZXIuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0ZWQgZnJvbSBzdW4gaW50ZXJuYWwgY2xhc3NlcyB0bwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IEJhc2U2NENvbnZlcnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXRpbGl0eSBjbGFzcyBleHRyYWN0ZWQgZnJvbSBHZXQgdGFzawpAQCAtMjM3LDkgKzIzNiw4IEBACiAKICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgdHJ5IChEYXRhSW5wdXRTdHJlYW0gZGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShpbik7CisgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAgICAgICAgICAgICAgICAgaW50IGRhdGE7CiAgICAgICAgICAgICAgICAgd2hpbGUgKChkYXRhID0gZGluLnJlYWQoKSkgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgYm91dC53cml0ZSgoYnl0ZSkgZGF0YSk7CkBAIC0yNTcsMTUgKzI1NSw2IEBACiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN3YWxsb3cgaWYgdGhlcmUgd2FzIGFuIGVycm9yIGJlZm9yZSBzbyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIGVycm9yIHdpbGwgYmUgcGFzc2VkIHVwCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oaW9lKTsgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0Fic3RyYWN0U3NoTWVzc2FnZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0Fic3RyYWN0U3NoTWVzc2FnZS5qYXZhCmluZGV4IDRjZTA3ZmYuLjg1NzIwMTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9BYnN0cmFjdFNzaE1lc3NhZ2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvQWJzdHJhY3RTc2hNZXNzYWdlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSwxMCArNDEsOCBAQAogICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbiBzZXNzaW9uOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB2ZXJib3NlOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb21wcmVzc2VkOwotICAgIHByaXZhdGUgTG9nTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9nTGlzdGVuZXIoKSB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgICAgICAgLy8gZG8gbm90aGluZzsKLSAgICAgICAgfQorICAgIHByaXZhdGUgTG9nTGlzdGVuZXIgbGlzdGVuZXIgPSBtZXNzYWdlIC0+IHsKKyAgICAgICAgLy8gZG8gbm90aGluZzsKICAgICB9OwogCiAgICAgLyoqCkBAIC05Nyw5ICs5NSw3IEBACiAgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCiAgICAgcHJvdGVjdGVkIENoYW5uZWxTZnRwIG9wZW5TZnRwQ2hhbm5lbCgpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQ2hhbm5lbFNmdHAgY2hhbm5lbCA9IChDaGFubmVsU2Z0cCkgc2Vzc2lvbi5vcGVuQ2hhbm5lbCgic2Z0cCIpOwotCi0gICAgICAgIHJldHVybiBjaGFubmVsOworICAgICAgICByZXR1cm4gKENoYW5uZWxTZnRwKSBzZXNzaW9uLm9wZW5DaGFubmVsKCJzZnRwIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIsOCArMTI4LDkgQEAKICAgICAgICAgaWYgKGIgPT0gLTEpIHsKICAgICAgICAgICAgIC8vIGRpZG4ndCByZWNlaXZlIGFueSByZXNwb25zZQogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyByZXNwb25zZSBmcm9tIHNlcnZlciIpOwotICAgICAgICB9IGVsc2UgaWYgKGIgIT0gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIGlmIChiICE9IDApIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCiAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWQoKTsKICAgICAgICAgICAgIHdoaWxlIChjID4gMCAmJiBjICE9ICdcbicpIHsKQEAgLTI3MCwxMiArMjY3LDEyIEBACiAgICAgICAgIHByaXZhdGUgbG9uZyB0b3RhbExlbmd0aCA9IDA7CiAgICAgICAgIHByaXZhdGUgaW50IHBlcmNlbnRUcmFuc21pdHRlZCA9IDA7CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgaW50IG9wLCBmaW5hbCBTdHJpbmcgc3JjLCBmaW5hbCBTdHJpbmcgZGVzdCwgZmluYWwgbG9uZyBtYXgpIHsKICAgICAgICAgICAgIGluaXRGaWxlU2l6ZSA9IG1heDsKLSAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gMDsKLSAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCA9IDA7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gY291bnQoZmluYWwgbG9uZyBsZW4pIHsKICAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IGxlbjsKICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCA9IHRyYWNrUHJvZ3Jlc3MoaW5pdEZpbGVTaXplLApAQCAtMjg0LDYgKzI4MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBlbmQoKSB7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0RpcmVjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0RpcmVjdG9yeS5qYXZhCmluZGV4IGRiODU3ZmMuLjQ5M2U5ZWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9EaXJlY3RvcnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvRGlyZWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCkBAIC0zMSw4ICszMiw4IEBACiBwdWJsaWMgY2xhc3MgRGlyZWN0b3J5IHsKIAogICAgIHByaXZhdGUgRmlsZSBkaXJlY3Rvcnk7Ci0gICAgcHJpdmF0ZSBTZXQgY2hpbGREaXJlY3RvcmllczsKLSAgICBwcml2YXRlIEFycmF5TGlzdCBmaWxlczsKKyAgICBwcml2YXRlIFNldDxEaXJlY3Rvcnk+IGNoaWxkRGlyZWN0b3JpZXM7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGZpbGVzOwogICAgIHByaXZhdGUgRGlyZWN0b3J5IHBhcmVudDsKIAogICAgIC8qKgpAQCAtNTAsOCArNTEsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnksIERpcmVjdG9yeSBwYXJlbnQpIHsKICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgIHRoaXMuY2hpbGREaXJlY3RvcmllcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIHRoaXMuZmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRoaXMuY2hpbGREaXJlY3RvcmllcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgdGhpcy5maWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKICAgICB9CiAKQEAgLTYwLDkgKzYxLDcgQEAKICAgICAgKiBAcGFyYW0gZGlyZWN0b3J5IGEgRGlyZWN0b3J5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KERpcmVjdG9yeSBkaXJlY3RvcnkpIHsKLSAgICAgICAgaWYgKCFjaGlsZERpcmVjdG9yaWVzLmNvbnRhaW5zKGRpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIGNoaWxkRGlyZWN0b3JpZXMuYWRkKGRpcmVjdG9yeSk7Ci0gICAgICAgIH0KKyAgICAgICAgY2hpbGREaXJlY3Rvcmllcy5hZGQoZGlyZWN0b3J5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTc3LDcgKzc2LDcgQEAKICAgICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgY2hpbGQgRGlyZWN0b3JpZXMuCiAgICAgICogQHJldHVybiBhbiBpdGVyYXRvcgogICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBkaXJlY3RvcnlJdGVyYXRvcigpIHsKKyAgICBwdWJsaWMgSXRlcmF0b3I8RGlyZWN0b3J5PiBkaXJlY3RvcnlJdGVyYXRvcigpIHsKICAgICAgICAgcmV0dXJuIGNoaWxkRGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsKICAgICB9CiAKQEAgLTg1LDcgKzg0LDcgQEAKICAgICAgKiBHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZmlsZXMuCiAgICAgICogQHJldHVybiBhbiBpdGVyYXRvcgogICAgICAqLwotICAgIHB1YmxpYyBJdGVyYXRvciBmaWxlc0l0ZXJhdG9yKCkgeworICAgIHB1YmxpYyBJdGVyYXRvcjxGaWxlPiBmaWxlc0l0ZXJhdG9yKCkgewogICAgICAgICByZXR1cm4gZmlsZXMuaXRlcmF0b3IoKTsKICAgICB9CiAKQEAgLTExOSw4ICsxMTgsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGNoaWxkIGRpcmVjdG9yeSwgb3IgbnVsbCBpZiBub3QgZm91bmQKICAgICAgKi8KICAgICBwdWJsaWMgRGlyZWN0b3J5IGdldENoaWxkKEZpbGUgZGlyKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNoaWxkRGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBEaXJlY3RvcnkgY3VycmVudCA9IChEaXJlY3RvcnkpIGkubmV4dCgpOworICAgICAgICBmb3IgKERpcmVjdG9yeSBjdXJyZW50IDogY2hpbGREaXJlY3RvcmllcykgewogICAgICAgICAgICAgaWYgKGN1cnJlbnQuZ2V0RGlyZWN0b3J5KCkuZXF1YWxzKGRpcikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgIH0KQEAgLTE0MCwxMyArMTM4LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERpcmVjdG9yeSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIERpcmVjdG9yeSkgeworICAgICAgICAgICAgRGlyZWN0b3J5IGQgPSAoRGlyZWN0b3J5KSBvYmo7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RvcnkuZXF1YWxzKGQuZGlyZWN0b3J5KTsKICAgICAgICAgfQogCi0gICAgICAgIERpcmVjdG9yeSBkID0gKERpcmVjdG9yeSkgb2JqOwotCi0gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdG9yeS5lcXVhbHMoZC5kaXJlY3RvcnkpOworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzUsNyArMTcyLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFBhdGgoU3RyaW5nIHRoZVBhdGgpIHsKICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGhlUGF0aCwKICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvcik7Ci0gICAgICAgIFN0cmluZ1tdIHBhdGggPSBuZXcgU3RyaW5nWyB0b2tlbml6ZXIuY291bnRUb2tlbnMoKSBdOworICAgICAgICBTdHJpbmdbXSBwYXRoID0gbmV3IFN0cmluZ1t0b2tlbml6ZXIuY291bnRUb2tlbnMoKV07CiAKICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICB3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL0xvZ0xpc3RlbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvTG9nTGlzdGVuZXIuamF2YQppbmRleCA0MTIwOWNlLi41OWU2NTNkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvTG9nTGlzdGVuZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvTG9nTGlzdGVuZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hCYXNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIQmFzZS5qYXZhCmluZGV4IDU5MWQ2MTAuLmVkZWU5YTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hCYXNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSEJhc2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guQ29uZmlnUmVwb3NpdG9yeTsKK2ltcG9ydCBjb20uamNyYWZ0LmpzY2guT3BlblNTSENvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CkBAIC00Miw2ICs0Nyw3IEBACiAgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxPbkVycm9yID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZTsKICAgICBwcml2YXRlIGZpbmFsIFNTSFVzZXJJbmZvIHVzZXJJbmZvOworICAgIHByaXZhdGUgU3RyaW5nIHNzaENvbmZpZzsKICAgICBwcml2YXRlIGludCBzZXJ2ZXJBbGl2ZUNvdW50TWF4ID0gMzsKICAgICBwcml2YXRlIGludCBzZXJ2ZXJBbGl2ZUludGVydmFsU2Vjb25kcyA9IDA7CiAKQEAgLTEwNyw2ICsxMTMsMjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBHZXQgdGhlIE9wZW5TU0ggY29uZmlnIGZpbGUgKH4vLnNzaC9jb25maWcpLgorICAgICAqIEByZXR1cm4gdGhlIE9wZW5TU0ggY29uZmlnIGZpbGUKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuOAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3NoQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gc3NoQ29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgT3BlblNTSCBjb25maWcgZmlsZSAofi8uc3NoL2NvbmZpZykuCisgICAgICogQHBhcmFtIHNzaENvbmZpZyB0aGUgT3BlblNTSCBjb25maWcgZmlsZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC44CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3NoQ29uZmlnKFN0cmluZyBzc2hDb25maWcpIHsKKyAgICAgICAgdGhpcy5zc2hDb25maWcgPSBzc2hDb25maWc7CisgICAgfQorCisgICAgLyoqCiAgICAgICogU2V0IHRoZSBzZXJ2ZXJBbGl2ZUNvdW50TWF4IHZhbHVlLgogICAgICAqIEBwYXJhbSBjb3VudE1heCBpbnQKICAgICAgKiBAc2luY2UgQW50IDEuOS43CkBAIC0yMjgsNiArMjUyLDcgQEAKICAgICAgKiBUaGlzIGluaXRpYWxpemVzIHRoZSBrbm93biBob3N0cyBhbmQgc2V0cyB0aGUgZGVmYXVsdCBwb3J0LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIuaW5pdCgpOwogICAgICAgICB0aGlzLmtub3duSG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpICsgIi8uc3NoL2tub3duX2hvc3RzIjsKQEAgLTIzNSw2ICsyNjAsMzcgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBMb2FkIHRoZSBTU0ggY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBsb2FkU3NoQ29uZmlnKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNzaENvbmZpZyAhPSBudWxsICYmICh1c2VySW5mby5nZXROYW1lKCkgPT0gbnVsbCB8fCB1c2VySW5mby5nZXRLZXlmaWxlKCkgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGlmICghbmV3IEZpbGUoc3NoQ29uZmlnKS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIFNTSCBjb25maWd1cmF0aW9uIGZpbGUgc3BlY2lmaWVkIGRvZXNuJ3QgZXhpc3Q6ICIgKyBzc2hDb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBsb2coIkxvYWRpbmcgU1NIIGNvbmZpZ3VyYXRpb24gZmlsZSAiICsgc3NoQ29uZmlnLCBQcm9qZWN0Lk1TR19ERUJVRyk7CisgICAgICAgICAgICBDb25maWdSZXBvc2l0b3J5LkNvbmZpZyBjb25maWcgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBPcGVuU1NIQ29uZmlnLnBhcnNlRmlsZShzc2hDb25maWcpLmdldENvbmZpZyhob3N0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIHRoZSBTU0ggY29uZmlndXJhdGlvbiBmaWxlICIgKyBzc2hDb25maWcsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBob3N0ID0gY29uZmlnLmdldEhvc3RuYW1lKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh1c2VySW5mby5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVzZXJJbmZvLnNldE5hbWUoY29uZmlnLmdldFVzZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh1c2VySW5mby5nZXRLZXlmaWxlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvZygiVXNpbmcgU1NIIGtleSBmaWxlICIgKyBjb25maWcuZ2V0VmFsdWUoIklkZW50aXR5RmlsZSIpICsgIiBmb3IgaG9zdCAiICsgaG9zdCwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgdXNlckluZm8uc2V0S2V5ZmlsZShjb25maWcuZ2V0VmFsdWUoIklkZW50aXR5RmlsZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIE9wZW4gYW4gc3NoIHNlc3Npb24uCiAgICAgICogQHJldHVybiB0aGUgb3BlbmVkIHNlc3Npb24KICAgICAgKiBAdGhyb3dzIEpTY2hFeGNlcHRpb24gb24gZXJyb3IKQEAgLTI0MywxNCArMjk5LDE3IEBACiAgICAgICAgIGZpbmFsIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CiAgICAgICAgIGZpbmFsIFNTSEJhc2UgYmFzZSA9IHRoaXM7CiAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICBKU2NoLnNldExvZ2dlcihuZXcgY29tLmpjcmFmdC5qc2NoLkxvZ2dlcigpewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoZmluYWwgaW50IGxldmVsKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBpbnQgbGV2ZWwsIGZpbmFsIFN0cmluZyBtZXNzYWdlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBKU2NoLnNldExvZ2dlcihuZXcgY29tLmpjcmFmdC5qc2NoLkxvZ2dlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoZmluYWwgaW50IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBpbnQgbGV2ZWwsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2UubG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0lORk8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgICAgIGlmIChudWxsICE9IHVzZXJJbmZvLmdldEtleWZpbGUoKSkgewogICAgICAgICAgICAganNjaC5hZGRJZGVudGl0eSh1c2VySW5mby5nZXRLZXlmaWxlKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSEV4ZWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hFeGVjLmphdmEKaW5kZXggMTM2MTVhMi4uMTdkZDQzMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSEV4ZWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIRXhlYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTcgKzE4LDE4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTIxOCw3ICsyMTksNyBAQAogICAgICAqICAgICAgd2lsbCBiZSBzdG9yZWQuCiAgICAgICogQHNpbmNlIEFwYWNoZSBBbnQgMS45LjQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcnByb3BlcnR5IChmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRFcnJvcnByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgewogICAgICAgICBlcnJvclByb3BlcnR5ID0gcHJvcGVydHk7CiAgICAgfQogCkBAIC0yODMsNiArMjg0LDkgQEAKICAgICAgICAgaWYgKGdldEhvc3QoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkhvc3QgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxvYWRTc2hDb25maWcoKTsKKyAgICAgICAgCiAgICAgICAgIGlmIChnZXRVc2VySW5mbygpLmdldE5hbWUoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVzZXJuYW1lIGlzIHJlcXVpcmVkLiIpOwogICAgICAgICB9CkBAIC0yOTgsMTggKzMwMiwxNiBAQAogICAgICAgICAgICAgKyAoaW5wdXRQcm9wZXJ0eSAhPSBudWxsID8gMSA6IDApCiAgICAgICAgICAgICArIChpbnB1dFN0cmluZyAhPSBudWxsID8gMSA6IDApOwogICAgICAgICBpZiAobnVtYmVyT2ZJbnB1dHMgPiAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb2YiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlucHV0RmlsZSwgaW5wdXRQcm9wZXJ0eSBhbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlucHV0U3RyaW5nLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG9mIGlucHV0RmlsZSwgaW5wdXRQcm9wZXJ0eSBhbmQgaW5wdXRTdHJpbmcuIik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0RmlsZSAhPSBudWxsICYmICFpbnB1dEZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGlucHV0IGZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5wdXRGaWxlLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IGV4aXN0LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJUaGUgaW5wdXQgZmlsZSAlcyBkb2VzIG5vdCBleGlzdC4iLAorICAgICAgICAgICAgICAgIGlucHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG91dHB1dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBzZXNzaW9uID0gb3BlblNlc3Npb24oKTsKICAgICAgICAgICAgIC8qIGNhbGxlZCBvbmNlICovCkBAIC0zMTcsMzIgKzMxOSwyNyBAQAogICAgICAgICAgICAgICAgIGxvZygiY21kIDogIiArIGNvbW1hbmQsIFByb2plY3QuTVNHX0lORk8pOwogICAgICAgICAgICAgICAgIGV4ZWN1dGVDb21tYW5kKHNlc3Npb24sIGNvbW1hbmQsIG91dHB1dCk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyByZWFkIGNvbW1hbmQgcmVzb3VyY2UgYW5kIGV4ZWN1dGUgZm9yIGVhY2ggY29tbWFuZAotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb21tYW5kUmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSkpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY21kOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNtZCA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29tbWFuZFJlc291cmNlLmdldElucHV0U3RyZWFtKCkpKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHMgPSBzZXNzaW9uOworICAgICAgICAgICAgICAgICAgICBici5saW5lcygpLmZvckVhY2goY21kIC0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiY21kIDogIiArIGNtZCwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKGNtZCkuYXBwZW5kKCIgOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDb21tYW5kKHNlc3Npb24sIGNtZCwgb3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDb21tYW5kKHMsIGNtZCwgb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpTY2hFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAob3V0cHV0UHJvcGVydHkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShvdXRwdXRQcm9wZXJ0eSwgb3V0cHV0LnRvU3RyaW5nKCkpOwpAQCAtMzUzLDcgKzM1MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNvbW1hbmQoZmluYWwgU2Vzc2lvbiBzZXNzaW9uLCBmaW5hbCBTdHJpbmcgY21kLCBmaW5hbCBTdHJpbmdCdWZmZXIgc2IpCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGVDb21tYW5kKGZpbmFsIFNlc3Npb24gc2Vzc2lvbiwgZmluYWwgU3RyaW5nIGNtZCwgZmluYWwgU3RyaW5nQnVpbGRlciBzYikKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVycm91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKQEAgLTM2Myw3ICszNjAsNyBAQAogICAgICAgICBJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKICAgICAgICAgaWYgKGlucHV0RmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CisgICAgICAgICAgICAgICAgaXN0cmVhbSA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKGlucHV0RmlsZS50b1BhdGgoKSk7CiAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBjaGVja2VkIHRoZSBleGlzdGVuY2UgYmVmb3JlLCB0aGlzIG9uZQogICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4gV2hhdCBpZiB0aGUgZmlsZSBleGlzdHMsIGJ1dCB0aGVyZQpAQCAtNDAyLDIxICszOTksMTggQEAKICAgICAgICAgICAgIGNoYW5uZWwuY29ubmVjdCgpOwogICAgICAgICAgICAgLy8gd2FpdCBmb3IgaXQgdG8gZmluaXNoCiAgICAgICAgICAgICB0aHJlYWQgPQotICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKCkgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFjaGFubmVsLmlzQ2xvc2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcChSRVRSWV9JTlRFUlZBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChSRVRSWV9JTlRFUlZBTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKTsKICAgICAgICAgICAgIHRocmVhZC5qb2luKG1heHdhaXQpOwpAQCAtNDI2LDkgKzQyMCw4IEBACiAgICAgICAgICAgICAgICAgdGhyZWFkID0gbnVsbDsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVElNRU9VVF9NRVNTQUdFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBzdGRvdXQgdG8gb3V0cHV0RmlsZQogICAgICAgICAgICAgICAgIGlmIChvdXRwdXRGaWxlICE9IG51bGwpIHsKQEAgLTQ1Myw5ICs0NDYsOCBAQAogICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIlJlbW90ZSBjb21tYW5kIGZhaWxlZCB3aXRoIGV4aXQgc3RhdHVzICIgKyBlYzsKICAgICAgICAgICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1zZywgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgQnVpbGRFeGNlcHRpb24gZSkgewpAQCAtNDY0LDIzICs0NTYsMTkgQEAKICAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKS5jb250YWlucygic2Vzc2lvbiBpcyBkb3duIikpIHsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVElNRU9VVF9NRVNTQUdFLCBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChnZXRGYWlsb25lcnJvcigpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgc2IuYXBwZW5kKG91dC50b1N0cmluZygpKTsKICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpc3RyZWFtKTsKQEAgLTQ5NywyNCArNDg1LDIwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG9GaWxlKGZpbmFsIFN0cmluZyBmcm9tLCBmaW5hbCBib29sZWFuIGFwcGVuZCwgZmluYWwgRmlsZSB0bykKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVXcml0ZXIodG8uZ2V0QWJzb2x1dGVQYXRoKCksIGFwcGVuZCk7CisgICAgICAgIGZpbmFsIFN0YW5kYXJkT3Blbk9wdGlvbiBhcHBlbmRPclRydW5jYXRlID0gYXBwZW5kID8gU3RhbmRhcmRPcGVuT3B0aW9uLkFQUEVORAorICAgICAgICAgICAgOiBTdGFuZGFyZE9wZW5PcHRpb24uVFJVTkNBVEVfRVhJU1RJTkc7CisgICAgICAgIHRyeSAoQnVmZmVyZWRXcml0ZXIgb3V0ID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIodG8uZ2V0QWJzb2x1dGVGaWxlKCkudG9QYXRoKCksCisgICAgICAgICAgICBhcHBlbmRPclRydW5jYXRlLCBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFKSkgewogICAgICAgICAgICAgZmluYWwgU3RyaW5nUmVhZGVyIGluID0gbmV3IFN0cmluZ1JlYWRlcihmcm9tKTsKICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltCVUZGRVJfU0laRV07Ci0gICAgICAgICAgICBpbnQgYnl0ZXNSZWFkOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBieXRlc1JlYWQgPSBpbi5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmZmVyKTsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSFNlc3Npb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hTZXNzaW9uLmphdmEKaW5kZXggNjM5NGM4Ni4uNWM1MjI0NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSFNlc3Npb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU1NIU2Vzc2lvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2g7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwpAQCAtMjksNyArMjgsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrQ29udGFpbmVyOwotCiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLkpTY2hFeGNlcHRpb247CiBpbXBvcnQgY29tLmpjcmFmdC5qc2NoLlNlc3Npb247CiAKQEAgLTQ1LDEwICs0MywxMCBAQAogICAgIC8qKiB1bml0cyBhcmUgbWlsbGlzZWNvbmRzLCBkZWZhdWx0IGlzIDA9aW5maW5pdGUgKi8KICAgICBwcml2YXRlIGxvbmcgbWF4d2FpdCA9IDA7CiAKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvciBsb2NhbFR1bm5lbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgbG9jYWxQb3J0c1VzZWQgPSBuZXcgVHJlZVNldCgpOwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yIHJlbW90ZVR1bm5lbHMgPSBuZXcgVmVjdG9yKCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQgcmVtb3RlUG9ydHNVc2VkID0gbmV3IFRyZWVTZXQoKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9jYWxUdW5uZWw+IGxvY2FsVHVubmVscyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PEludGVnZXI+IGxvY2FsUG9ydHNVc2VkID0gbmV3IFRyZWVTZXQ8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZW1vdGVUdW5uZWw+IHJlbW90ZVR1bm5lbHMgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxJbnRlZ2VyPiByZW1vdGVQb3J0c1VzZWQgPSBuZXcgVHJlZVNldDw+KCk7CiAgICAgcHJpdmF0ZSBOZXN0ZWRTZXF1ZW50aWFsIG5lc3RlZFNlcXVlbnRpYWwgPSBudWxsOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVPVVRfTUVTU0FHRSA9CkBAIC01Niw3ICs1NCw3IEBACiAKIAogICAgIC8qKiBPcHRpb25hbCBWZWN0b3IgaG9sZGluZyB0aGUgbmVzdGVkIHRhc2tzICovCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgbmVzdGVkVGFza3MgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRhc2s+IG5lc3RlZFRhc2tzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKioKICAgICAgKiBBZGQgYSBuZXN0ZWQgdGFzayB0byBTZXF1ZW50aWFsLgpAQCAtNjQsNyArNjIsNyBAQAogICAgICAqIEBwYXJhbSBuZXN0ZWRUYXNrIE5lc3RlZCB0YXNrIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkVGFzayhmaW5hbCBUYXNrIG5lc3RlZFRhc2spIHsKLSAgICAgICAgbmVzdGVkVGFza3MuYWRkRWxlbWVudChuZXN0ZWRUYXNrKTsKKyAgICAgICAgbmVzdGVkVGFza3MuYWRkKG5lc3RlZFRhc2spOwogICAgIH0KIAogICAgIC8qKgpAQCAtODcsNyArODUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExvY2FsdHVubmVscyhmaW5hbCBTdHJpbmcgdHVubmVscykgewogICAgICAgICBmb3IgKFN0cmluZyB0dW5uZWxTcGVjIDogdHVubmVscy5zcGxpdCgiLCAiKSkgewotICAgICAgICAgICAgaWYgKHR1bm5lbFNwZWMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIXR1bm5lbFNwZWMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gc3BlYyA9IHR1bm5lbFNwZWMuc3BsaXQoIjoiLCAzKTsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbHBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHNwZWNbMF0pOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByaG9zdCA9IHNwZWNbMV07CkBAIC0xMDksNyArMTA3LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGV0dW5uZWxzKGZpbmFsIFN0cmluZyB0dW5uZWxzKSB7CiAgICAgICAgIGZvciAoU3RyaW5nIHR1bm5lbFNwZWMgOiB0dW5uZWxzLnNwbGl0KCIsICIpKSB7Ci0gICAgICAgICAgICBpZiAodHVubmVsU3BlYy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGlmICghdHVubmVsU3BlYy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzcGVjID0gdHVubmVsU3BlYy5zcGxpdCgiOiIsIDMpOwogICAgICAgICAgICAgICAgIGZpbmFsIGludCBycG9ydCA9IEludGVnZXIucGFyc2VJbnQoc3BlY1swXSk7CiAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxob3N0ID0gc3BlY1sxXTsKQEAgLTEzNCw2ICsxMzIsOSBAQAogICAgICAgICBpZiAoZ2V0SG9zdCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSG9zdCBpcyByZXF1aXJlZC4iKTsKICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbG9hZFNzaENvbmZpZygpOworICAgICAgICAKICAgICAgICAgaWYgKGdldFVzZXJJbmZvKCkuZ2V0TmFtZSgpID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVXNlcm5hbWUgaXMgcmVxdWlyZWQuIik7CiAgICAgICAgIH0KQEAgLTE0NSw0OCArMTQ2LDM4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk1pc3Npbmcgc2VxdWVudGlhbCBlbGVtZW50LiIpOwogICAgICAgICB9CiAKLQogICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy8gZXN0YWJsaXNoIHRoZSBzZXNzaW9uCiAgICAgICAgICAgICBzZXNzaW9uID0gb3BlblNlc3Npb24oKTsKICAgICAgICAgICAgIHNlc3Npb24uc2V0VGltZW91dCgoaW50KSBtYXh3YWl0KTsKIAotICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvciBpID0gbG9jYWxUdW5uZWxzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIExvY2FsVHVubmVsIHR1bm5lbCA9IChMb2NhbFR1bm5lbCkgaS5uZXh0KCk7CisgICAgICAgICAgICBmb3IgKExvY2FsVHVubmVsIHR1bm5lbCA6IGxvY2FsVHVubmVscykgewogICAgICAgICAgICAgICAgIHNlc3Npb24uc2V0UG9ydEZvcndhcmRpbmdMKHR1bm5lbC5nZXRMUG9ydCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bm5lbC5nZXRSSG9zdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bm5lbC5nZXRSUG9ydCgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvciBpID0gcmVtb3RlVHVubmVscy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBSZW1vdGVUdW5uZWwgdHVubmVsID0gKFJlbW90ZVR1bm5lbCkgaS5uZXh0KCk7CisgICAgICAgICAgICBmb3IgKFJlbW90ZVR1bm5lbCB0dW5uZWwgOiByZW1vdGVUdW5uZWxzKSB7CiAgICAgICAgICAgICAgICAgc2Vzc2lvbi5zZXRQb3J0Rm9yd2FyZGluZ1IodHVubmVsLmdldFJQb3J0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsLmdldExIb3N0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsLmdldExQb3J0KCkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yIGkgPSBuZXN0ZWRTZXF1ZW50aWFsLmdldE5lc3RlZCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgIGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgIGZpbmFsIFRhc2sgbmVzdGVkVGFzayA9IChUYXNrKSBpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBuZXN0ZWRUYXNrLnBlcmZvcm0oKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5lc3RlZFNlcXVlbnRpYWwuZ2V0TmVzdGVkKCkuZm9yRWFjaChUYXNrOjpwZXJmb3JtKTsKICAgICAgICAgICAgIC8vIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKIAogICAgICAgICB9IGNhdGNoIChmaW5hbCBKU2NoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKS5jb250YWlucygic2Vzc2lvbiBpcyBkb3duIikpIHsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oVElNRU9VVF9NRVNTQUdFLCBlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coVElNRU9VVF9NRVNTQUdFLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBjYXRjaCAoZmluYWwgQnVpbGRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy8gYXZvaWQgd3JhcHBpbmcgaXQgaW50byB5ZXQgYW5vdGhlciBCdWlsZEV4Y2VwdGlvbiBmdXJ0aGVyIGRvd24KQEAgLTE5NCw5ICsxODUsOCBAQAogICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgaWYgKGdldEZhaWxvbmVycm9yKCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxvZygiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUuZ2V0TWVzc2FnZSgpLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0VSUik7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoc2Vzc2lvbiAhPSBudWxsICYmIHNlc3Npb24uaXNDb25uZWN0ZWQoKSkgewogICAgICAgICAgICAgICAgIHNlc3Npb24uZGlzY29ubmVjdCgpOwpAQCAtMjE3LDM0ICsyMDcsNDQgQEAKICAgICB9CiAKICAgICBwdWJsaWMgY2xhc3MgTG9jYWxUdW5uZWwgewotICAgICAgICBwdWJsaWMgTG9jYWxUdW5uZWwoKSB7fQogCiAgICAgICAgIGludCBscG9ydCA9IDA7CiAgICAgICAgIFN0cmluZyByaG9zdCA9IG51bGw7CiAgICAgICAgIGludCBycG9ydCA9IDA7CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0TFBvcnQoZmluYWwgaW50IGxwb3J0KSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcnRLZXkgPSBuZXcgSW50ZWdlcihscG9ydCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcnRLZXkgPSBscG9ydDsKICAgICAgICAgICAgIGlmIChsb2NhbFBvcnRzVXNlZC5jb250YWlucyhwb3J0S2V5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTXVsdGlwbGUgbG9jYWwgdHVubmVscyBkZWZpbmVkIHRvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdXNlIHNhbWUgbG9jYWwgcG9ydCAiICsgbHBvcnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIGxvY2FsIHR1bm5lbHMgZGVmaW5lZCB0byB1c2Ugc2FtZSBsb2NhbCBwb3J0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgbHBvcnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbG9jYWxQb3J0c1VzZWQuYWRkKHBvcnRLZXkpOwogICAgICAgICAgICAgdGhpcy5scG9ydCA9IGxwb3J0OwogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldFJIb3N0KGZpbmFsIFN0cmluZyByaG9zdCkgeyB0aGlzLnJob3N0ID0gcmhvc3Q7IH0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UlBvcnQoZmluYWwgaW50IHJwb3J0KSB7IHRoaXMucnBvcnQgPSBycG9ydDsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJIb3N0KGZpbmFsIFN0cmluZyByaG9zdCkgeworICAgICAgICAgICAgdGhpcy5yaG9zdCA9IHJob3N0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UlBvcnQoZmluYWwgaW50IHJwb3J0KSB7CisgICAgICAgICAgICB0aGlzLnJwb3J0ID0gcnBvcnQ7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgaW50IGdldExQb3J0KCkgewogICAgICAgICAgICAgaWYgKGxwb3J0ID09IDApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImxwb3J0IGlzIHJlcXVpcmVkIGZvciBMb2NhbFR1bm5lbC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBscG9ydDsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Ukhvc3QoKSB7CiAgICAgICAgICAgICBpZiAocmhvc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicmhvc3QgaXMgcmVxdWlyZWQgZm9yIExvY2FsVHVubmVsLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJob3N0OwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIGludCBnZXRSUG9ydCgpIHsKICAgICAgICAgICAgIGlmIChycG9ydCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJycG9ydCBpcyByZXF1aXJlZCBmb3IgTG9jYWxUdW5uZWwuIik7CkBAIC0yNTQsMzQgKzI1NCw0NCBAQAogICAgIH0KIAogICAgIHB1YmxpYyBjbGFzcyBSZW1vdGVUdW5uZWwgewotICAgICAgICBwdWJsaWMgUmVtb3RlVHVubmVsKCkge30KIAogICAgICAgICBpbnQgbHBvcnQgPSAwOwogICAgICAgICBTdHJpbmcgbGhvc3QgPSBudWxsOwogICAgICAgICBpbnQgcnBvcnQgPSAwOwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRMUG9ydChmaW5hbCBpbnQgbHBvcnQpIHsgdGhpcy5scG9ydCA9IGxwb3J0OyB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHNldExIb3N0KGZpbmFsIFN0cmluZyBsaG9zdCkgeyB0aGlzLmxob3N0ID0gbGhvc3Q7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRMUG9ydChmaW5hbCBpbnQgbHBvcnQpIHsKKyAgICAgICAgICAgIHRoaXMubHBvcnQgPSBscG9ydDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldExIb3N0KGZpbmFsIFN0cmluZyBsaG9zdCkgeworICAgICAgICAgICAgdGhpcy5saG9zdCA9IGxob3N0OworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0UlBvcnQoZmluYWwgaW50IHJwb3J0KSB7Ci0gICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcnRLZXkgPSBuZXcgSW50ZWdlcihycG9ydCk7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIHBvcnRLZXkgPSBycG9ydDsKICAgICAgICAgICAgIGlmIChyZW1vdGVQb3J0c1VzZWQuY29udGFpbnMocG9ydEtleSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk11bHRpcGxlIHJlbW90ZSB0dW5uZWxzIGRlZmluZWQgdG8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB1c2Ugc2FtZSByZW1vdGUgcG9ydCAiICsgcnBvcnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIHJlbW90ZSB0dW5uZWxzIGRlZmluZWQgdG8gdXNlIHNhbWUgcmVtb3RlIHBvcnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBycG9ydCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZW1vdGVQb3J0c1VzZWQuYWRkKHBvcnRLZXkpOwogICAgICAgICAgICAgdGhpcy5ycG9ydCA9IHJwb3J0OwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIGludCBnZXRMUG9ydCgpIHsKICAgICAgICAgICAgIGlmIChscG9ydCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJscG9ydCBpcyByZXF1aXJlZCBmb3IgUmVtb3RlVHVubmVsLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGxwb3J0OwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRMSG9zdCgpIHsKICAgICAgICAgICAgIGlmIChsaG9zdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJsaG9zdCBpcyByZXF1aXJlZCBmb3IgUmVtb3RlVHVubmVsLiIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGxob3N0OwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIGludCBnZXRSUG9ydCgpIHsKICAgICAgICAgICAgIGlmIChycG9ydCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJycG9ydCBpcyByZXF1aXJlZCBmb3IgUmVtb3RlVHVubmVsLiIpOwpAQCAtMzA4LDEzICszMTgsMTQgQEAKICAgICAgKiBUaGlzIGlzIGEgc2ltcGxlIHRhc2sgY29udGFpbmVyLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTmVzdGVkU2VxdWVudGlhbCBpbXBsZW1lbnRzIFRhc2tDb250YWluZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gbmVzdGVkID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gbmVzdGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHRhc2sgb3IgdHlwZSB0byB0aGUgY29udGFpbmVyLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gdGFzayBhbiB1bmtub3duIGVsZW1lbnQuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgYWRkVGFzayhmaW5hbCBUYXNrIHRhc2spIHsKICAgICAgICAgICAgIG5lc3RlZC5hZGQodGFzayk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TU0hVc2VySW5mby5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSFVzZXJJbmZvLmphdmEKaW5kZXggNTRlNzAyOS4uMTZkM2IxZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSFVzZXJJbmZvLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NTSFVzZXJJbmZvLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNSw4ICszNSw3IEBACiAKICAgICAvKiogQ29uc3RydWN0b3IgZm9yIFNTSFVzZXJJbmZvLiAqLwogICAgIHB1YmxpYyBTU0hVc2VySW5mbygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy50cnVzdEFsbENlcnRpZmljYXRlcyA9IGZhbHNlOworICAgICAgICB0aGlzKG51bGwsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcxLDYgKzcwLDcgQEAKICAgICAgKiBHZXRzIHRoZSB1c2VyJ3MgcGFzc3dvcmQuCiAgICAgICogQHJldHVybiB0aGUgdXNlcidzIHBhc3N3b3JkCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKICAgICAgICAgcmV0dXJuIHBhc3N3b3JkOwogICAgIH0KQEAgLTEzNSw2ICsxMzUsNyBAQAogICAgICAqIFJldHVybnMgdGhlIHBhc3NwaHJhc2UuCiAgICAgICogQHJldHVybiBTdHJpbmcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3NwaHJhc2UoKSB7CiAgICAgICAgIHJldHVybiBwYXNzcGhyYXNlOwogICAgIH0KQEAgLTE2MCw2ICsxNjEsNyBAQAogICAgICAqIEBwYXJhbSBtZXNzYWdlIGlnbm9yZWQKICAgICAgKiBAcmV0dXJuIHRydWUgYWx3YXlzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3BocmFzZShTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNjksNiArMTcxLDcgQEAKICAgICAgKiBAcGFyYW0gcGFzc3dvcmRQcm9tcHQgaWdub3JlZAogICAgICAqIEByZXR1cm4gdHJ1ZSB0aGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCwgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcHJvbXB0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkUHJvbXB0KSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTE3OCw2ICsxODEsNyBAQAogICAgICAqIEBwYXJhbSBtZXNzYWdlIGlnbm9yZWQKICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0cnVzdEFsbENlcnRpZmljYXRlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHByb21wdFllc05vKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIHJldHVybiB0cnVzdEFsbENlcnRpZmljYXRlczsKICAgICB9CkBAIC0xODcsNiArMTkxLDcgQEAKICAgICAgKiBJbXBsZW1lbnQgdGhlIFVzZXJJbmZvIGludGVyZmFjZSAobm9vcCkuCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgaWdub3JlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNob3dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAgICAgICAgIC8vbG9nKG1lc3NhZ2UsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICB9CkBAIC0yMDEsNiArMjA2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBwYXNzd29yZCBpbiBhbiBzaXplIG9uZSBhcnJheSBpZiB0aGVyZSBpcyBhIHBhc3N3b3JkCiAgICAgICogICAgICAgICBhbmQgaWYgdGhlIHByb21wdCBhbmQgZWNobyBjaGVja3MgcGFzcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gcHJvbXB0S2V5Ym9hcmRJbnRlcmFjdGl2ZShTdHJpbmcgZGVzdGluYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluc3RydWN0aW9uLApAQCAtMjA5LDkgKzIxNSw3IEBACiAgICAgICAgIGlmIChwcm9tcHQubGVuZ3RoICE9IDEgfHwgZWNob1swXSB8fCB0aGlzLnBhc3N3b3JkID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlID0gbmV3IFN0cmluZ1sxXTsKLSAgICAgICAgcmVzcG9uc2VbMF0gPSB0aGlzLnBhc3N3b3JkOwotICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyB0aGlzLnBhc3N3b3JkIH07CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwLmphdmEKaW5kZXggNGUwNGE0Ni4uM2QxODFkMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3AuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDkgKzIxLDkgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CkBAIC0xNjUsMTEgKzE2NSw5IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmVtb3RlVXJpKGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgYVRvVXJpKSB7CiAgICAgICAgIGlmICghaXNSZW1vdGVVcmkoYVRvVXJpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHR5cGUgKyAiICciICsgYVRvVXJpICsgIicgaXMgaW52YWxpZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSAncmVtb3RlVG9EaXInIGF0dHJpYnV0ZSBtdXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJoYXZlIHN5bnRheCBsaWtlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm9sbG93aW5nOiB1c2VyOnBhc3N3b3JkQGhvc3Q6L3BhdGgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC0gdGhlIDpwYXNzd29yZCBwYXJ0IGlzIG9wdGlvbmFsIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIiVzICclcycgaXMgaW52YWxpZC4gVGhlICdyZW1vdGVUb0RpcicgYXR0cmlidXRlIG11c3QgaGF2ZSBzeW50YXggbGlrZSB0aGUgZm9sbG93aW5nOiB1c2VyOnBhc3N3b3JkQGhvc3Q6L3BhdGggLSB0aGUgOnBhc3N3b3JkIHBhcnQgaXMgb3B0aW9uYWwiLAorICAgICAgICAgICAgICAgIHR5cGUsIGFUb1VyaSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0MCw3ICsyMzgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZChSZXNvdXJjZUNvbGxlY3Rpb24gcmVzKSB7CiAgICAgICAgIGlmIChyY3MgPT0gbnVsbCkgewotICAgICAgICAgICAgcmNzID0gbmV3IExpbmtlZExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPigpOworICAgICAgICAgICAgcmNzID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgICB9CiAgICAgICAgIHJjcy5hZGQocmVzKTsKICAgICB9CkBAIC0yODIsMjQgKzI4MCwyMSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIkNvcHlpbmcgZnJvbSBhIHJlbW90ZSBzZXJ2ZXIgdG8gYSByZW1vdGUgc2VydmVyIGlzIG5vdCBzdXBwb3J0ZWQuIik7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJ3RvZGlyJyBhbmQgJ2ZpbGUnIGF0dHJpYnV0ZXMgIgotICAgICAgICAgICAgICAgICAgICArICJtdXN0IGhhdmUgc3ludGF4IGxpa2UgdGhlIGZvbGxvd2luZzogIgotICAgICAgICAgICAgICAgICAgICArICJ1c2VyOnBhc3N3b3JkQGhvc3Q6L3BhdGgiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICIndG9kaXInIGFuZCAnZmlsZScgYXR0cmlidXRlcyBtdXN0IGhhdmUgc3ludGF4IGxpa2UgdGhlIGZvbGxvd2luZzogdXNlcjpwYXNzd29yZEBob3N0Oi9wYXRoIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAoZ2V0RmFpbG9uZXJyb3IoKSkgewotICAgICAgICAgICAgICAgIGlmKGUgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQnVpbGRFeGNlcHRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVpbGRFeGNlcHRpb24gYmUgPSAoQnVpbGRFeGNlcHRpb24pIGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGJlLmdldExvY2F0aW9uKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmUuZ2V0TG9jYXRpb24oKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBiZS5zZXRMb2NhdGlvbihnZXRMb2NhdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBiZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIkNhdWdodCBleGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzQxLDkgKzMzNiw4IEBACiAKICAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8RGlyZWN0b3J5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEaXJlY3Rvcnk+KHJjcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IGkgPSByY3MuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gKFJlc291cmNlQ29sbGVjdGlvbikgaS5uZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PERpcmVjdG9yeT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PihyY3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoUmVzb3VyY2VDb2xsZWN0aW9uIHJjIDogcmNzKSB7CiAgICAgICAgICAgICAgICAgaWYgKHJjIGluc3RhbmNlb2YgRmlsZVNldCAmJiByYy5pc0ZpbGVzeXN0ZW1Pbmx5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSByYzsKICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5IGQgPSBjcmVhdGVEaXJlY3RvcnkoZnMpOwpAQCAtMzUxLDE1ICszNDUsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxEaXJlY3Rvcnk+IGRzID0gY3JlYXRlRGlyZWN0b3J5Q29sbGVjdGlvbihyYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmIChkcyAhPW51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgTGlzdDxEaXJlY3Rvcnk+IGRzID0gY3JlYXRlRGlyZWN0b3J5Q29sbGVjdGlvbihyYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZEFsbChkcyk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgc2Vzc2lvbiA9IG9wZW5TZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgU2NwVG9NZXNzYWdlIG1lc3NhZ2UgPSBudWxsOworICAgICAgICAgICAgICAgIFNjcFRvTWVzc2FnZSBtZXNzYWdlOwogICAgICAgICAgICAgICAgIGlmICghaXNTZnRwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgU2NwVG9NZXNzYWdlKGdldFZlcmJvc2UoKSwgY29tcHJlc3NlZCwgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCwgZmlsZSwgcHJlc2VydmVMYXN0TW9kaWZpZWQpOwpAQCAtMzY5LDEwICszNjMsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRMb2dMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgICAgICAgICBpZiAoZmlsZU1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEZpbGVNb2RlKGZpbGVNb2RlLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEZpbGVNb2RlKGZpbGVNb2RlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRpck1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldERpck1vZGUoZGlyTW9kZS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXREaXJNb2RlKGRpck1vZGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtZXNzYWdlLmV4ZWN1dGUoKTsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMCArMzk4LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtZXNzYWdlLnNldExvZ0xpc3RlbmVyKHRoaXMpOwogICAgICAgICAgICAgaWYgKGZpbGVNb2RlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNldEZpbGVNb2RlKGZpbGVNb2RlLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RmlsZU1vZGUoZmlsZU1vZGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGRpck1vZGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RGlyTW9kZShkaXJNb2RlLmludFZhbHVlKCkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0RGlyTW9kZShkaXJNb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lc3NhZ2UuZXhlY3V0ZSgpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtNDQxLDU5ICs0MzUsNTUgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gdXNlcm5hbWUgd2FzIGdpdmVuLiAgQ2FuJ3QgYXV0aGVudGljYXRlLiIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGdldFVzZXJJbmZvKCkuZ2V0UGFzc3dvcmQoKSA9PSBudWxsCi0gICAgICAgICAgICAmJiBnZXRVc2VySW5mbygpLmdldEtleWZpbGUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5laXRoZXIgcGFzc3dvcmQgbm9yIGtleWZpbGUgZm9yIHVzZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0VXNlckluZm8oKS5nZXROYW1lKCkgKyAiIGhhcyBiZWVuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJnaXZlbi4gIENhbid0IGF1dGhlbnRpY2F0ZS4iKTsKLSAgICAgICAgfQotCiAgICAgICAgIGZpbmFsIGludCBpbmRleE9mUGF0aCA9IHVyaS5pbmRleE9mKCc6JywgaW5kZXhPZkF0ICsgMSk7CiAgICAgICAgIGlmIChpbmRleE9mUGF0aCA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyByZW1vdGUgcGF0aCBpbiAiICsgdXJpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gcmVtb3RlIHBhdGggaW4gJXMiLCB1cmkpOwogICAgICAgICB9CiAKICAgICAgICAgc2V0SG9zdCh1cmkuc3Vic3RyaW5nKGluZGV4T2ZBdCArIDEsIGluZGV4T2ZQYXRoKSk7CisgICAgICAgIAorICAgICAgICBsb2FkU3NoQ29uZmlnKCk7CisgICAgICAgIAorICAgICAgICBpZiAoZ2V0VXNlckluZm8oKS5nZXRQYXNzd29yZCgpID09IG51bGwKKyAgICAgICAgICAgICYmIGdldFVzZXJJbmZvKCkuZ2V0S2V5ZmlsZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAibmVpdGhlciBwYXNzd29yZCBub3Iga2V5ZmlsZSBmb3IgdXNlciAlcyBoYXMgYmVlbiBnaXZlbi4gIENhbid0IGF1dGhlbnRpY2F0ZS4iLAorICAgICAgICAgICAgICAgIGdldFVzZXJJbmZvKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgICAgICAKICAgICAgICAgU3RyaW5nIHJlbW90ZVBhdGggPSB1cmkuc3Vic3RyaW5nKGluZGV4T2ZQYXRoICsgMSk7Ci0gICAgICAgIGlmIChyZW1vdGVQYXRoLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHJlbW90ZVBhdGguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZW1vdGVQYXRoID0gIi4iOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZW1vdGVQYXRoOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNSZW1vdGVVcmkoZmluYWwgU3RyaW5nIHVyaSkgewotICAgICAgICBib29sZWFuIGlzUmVtb3RlID0gdHJ1ZTsKLSAgICAgICAgZmluYWwgaW50IGluZGV4T2ZBdCA9IHVyaS5pbmRleE9mKCdAJyk7Ci0gICAgICAgIGlmIChpbmRleE9mQXQgPCAwKSB7Ci0gICAgICAgICAgICBpc1JlbW90ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlbW90ZTsKKyAgICAgICAgcmV0dXJuIHVyaS5jb250YWlucygiQCIpOwogICAgIH0KIAogICAgIHByaXZhdGUgRGlyZWN0b3J5IGNyZWF0ZURpcmVjdG9yeShmaW5hbCBGaWxlU2V0IHNldCkgewogICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBzZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICBEaXJlY3Rvcnkgcm9vdCA9IG5ldyBEaXJlY3Rvcnkoc2Nhbm5lci5nZXRCYXNlZGlyKCkpOwogICAgICAgICBmaW5hbCBTdHJpbmdbXSBmaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBpZiAoZmlsZXMubGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZXMubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXRoID0gRGlyZWN0b3J5LmdldFBhdGgoZmlsZXNbal0pOwotICAgICAgICAgICAgICAgIERpcmVjdG9yeSBjdXJyZW50ID0gcm9vdDsKLSAgICAgICAgICAgICAgICBGaWxlIGN1cnJlbnRQYXJlbnQgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoY3VycmVudFBhcmVudCwgcGF0aFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYWRkRGlyZWN0b3J5KG5ldyBEaXJlY3RvcnkoZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0Q2hpbGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudC5nZXREaXJlY3RvcnkoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAvLyBza2lwCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBEaXJlY3Rvcnkgcm9vdCA9IG5ldyBEaXJlY3Rvcnkoc2Nhbm5lci5nZXRCYXNlZGlyKCkpOworICAgICAgICBTdHJlYW0ub2YoZmlsZXMpLm1hcChEaXJlY3Rvcnk6OmdldFBhdGgpLmZvckVhY2gocGF0aCAtPiB7CisgICAgICAgICAgICBEaXJlY3RvcnkgY3VycmVudCA9IHJvb3Q7CisgICAgICAgICAgICBGaWxlIGN1cnJlbnRQYXJlbnQgPSBzY2FubmVyLmdldEJhc2VkaXIoKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBwYXRoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoY3VycmVudFBhcmVudCwgZWxlbWVudCk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZERpcmVjdG9yeShuZXcgRGlyZWN0b3J5KGZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0Q2hpbGQoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50LmdldERpcmVjdG9yeSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZS5pc0ZpbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmFkZEZpbGUoZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gc2tpcAotICAgICAgICAgICAgcm9vdCA9IG51bGw7Ci0gICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgICAgIHJldHVybiByb290OwogICAgIH0KIApAQCAtNTAzLDIxICs0OTMsMjQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiT25seSBGaWxlU3lzdGVtIHJlc291cmNlcyBhcmUgc3VwcG9ydGVkLiIpOwogICAgICAgICB9CiAKLSAgICAgICAgTGlzdDxEaXJlY3Rvcnk+IGRzID0gbmV3IEFycmF5TGlzdDxEaXJlY3Rvcnk+KCk7CisgICAgICAgIExpc3Q8RGlyZWN0b3J5PiBkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByYykgewotICAgICAgICAgICAgICAgaWYgKCFyLmlzRXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIHJlc291cmNlICIgKyByLnRvTG9uZ1N0cmluZygpICsgIiB0byBzY3AuIik7CisgICAgICAgICAgICBpZiAoIXIuaXNFeGlzdHMoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgcmVzb3VyY2UgJXMgdG8gc2NwLiIsCisgICAgICAgICAgICAgICAgICAgICAgICByLnRvTG9uZ1N0cmluZygpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0gci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwogICAgICAgICAgICAgaWYgKGZwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlc291cmNlICIgKyByLnRvTG9uZ1N0cmluZygpICsgIiBpcyBub3QgYSBmaWxlLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUmVzb3VyY2UgJXMgaXMgbm90IGEgZmlsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgci50b0xvbmdTdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEZpbGVSZXNvdXJjZSBmciA9IFJlc291cmNlVXRpbHMuYXNGaWxlUmVzb3VyY2UoZnApOwogICAgICAgICAgICAgRmlsZSBiYXNlRGlyID0gZnIuZ2V0QmFzZURpcigpOwogICAgICAgICAgICAgaWYgKGJhc2VEaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmFzZWRpciBmb3IgcmVzb3VyY2UgIiArIHIudG9Mb25nU3RyaW5nKCkgKyAiIGlzIHVuZGVmaW5lZC4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImJhc2VkaXIgZm9yIHJlc291cmNlICVzIGlzIHVuZGVmaW5lZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgci50b0xvbmdTdHJpbmcoKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGlmIHRoZSBiYXNlZGlyIGlzIHNldCwgdGhlIG5hbWUgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGF0CkBAIC01MjUsOSArNTE4LDggQEAKICAgICAgICAgICAgIERpcmVjdG9yeSByb290ID0gbmV3IERpcmVjdG9yeShiYXNlRGlyKTsKICAgICAgICAgICAgIERpcmVjdG9yeSBjdXJyZW50ID0gcm9vdDsKICAgICAgICAgICAgIEZpbGUgY3VycmVudFBhcmVudCA9IGJhc2VEaXI7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXRoID0gRGlyZWN0b3J5LmdldFBhdGgobmFtZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZShjdXJyZW50UGFyZW50LCBwYXRoW2ldKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVsZW1lbnQgOiBEaXJlY3RvcnkuZ2V0UGF0aChuYW1lKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGN1cnJlbnRQYXJlbnQsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5hZGREaXJlY3RvcnkobmV3IERpcmVjdG9yeShmaWxlKSk7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmdldENoaWxkKGZpbGUpOwpAQCAtNTM3LDcgKzUyOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZHMuYWRkKHJvb3QpOwotICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXR1cm4gZHM7CiAgICAgfQogCkBAIC01NjAsMTUgKzU1Miw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBCdWlsZEV4Y2VwdGlvbiBleGFjdGx5T25lKGZpbmFsIFN0cmluZ1tdIGF0dHJzLCBmaW5hbCBTdHJpbmcgYWx0KSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCJFeGFjdGx5IG9uZSBvZiAiKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgJ1snKS5hcHBlbmQoYXR0cnNbMF0pOwotICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCd8JykuYXBwZW5kKGF0dHJzW2ldKTsKLSAgICAgICAgfQotICAgICAgICBidWYuYXBwZW5kKCddJyk7Ci0gICAgICAgIGlmIChhbHQgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiIG9yICIpLmFwcGVuZChhbHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oYnVmLmFwcGVuZCgiIGlzIHJlcXVpcmVkLiIpLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGFjdGx5IG9uZSBvZiBbJXNdJXMgaXMgcmVxdWlyZWQiLAorICAgICAgICAgICAgICAgIFN0cmluZy5qb2luKCJ8IiwgYXR0cnMpLAorICAgICAgICAgICAgYWx0ID09IG51bGwgPyAiIiA6ICIgb3IgIiArIGFsdCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcEZyb21NZXNzYWdlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwRnJvbU1lc3NhZ2UuamF2YQppbmRleCBiY2UzZjc4Li43MGRmNmY2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwRnJvbU1lc3NhZ2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwRnJvbU1lc3NhZ2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDEwICsyMSwxMCBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIApAQCAtMTQ5LDYgKzE0OSw3IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBpL28gZXJyb3JzCiAgICAgICogQHRocm93cyBKU2NoRXhjZXB0aW9uIG9uIGVycm9ycyBkZXRlY3RlZCBieSBzY3AKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSAic2NwIC1mICI7CiAgICAgICAgIGlmIChpc1JlY3Vyc2l2ZSkgewpAQCAtMjIwLDkgKzIyMSw5IEBACiAKICAgICBwcml2YXRlIEZpbGUgcGFyc2VBbmRDcmVhdGVEaXJlY3RvcnkoZmluYWwgU3RyaW5nIHNlcnZlclJlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGxvY2FsRmlsZSkgewotICAgICAgICBpbnQgc3RhcnQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCIgIik7CisgICAgICAgIGludCBzdGFydCA9IHNlcnZlclJlc3BvbnNlLmluZGV4T2YoJyAnKTsKICAgICAgICAgLy8gYXBwZWFycyB0aGF0IHRoZSBuZXh0IHRva2VuIGlzIG5vdCB1c2VkIGFuZCBpdCdzIHplcm8uCi0gICAgICAgIHN0YXJ0ID0gc2VydmVyUmVzcG9uc2UuaW5kZXhPZigiICIsIHN0YXJ0ICsgMSk7CisgICAgICAgIHN0YXJ0ID0gc2VydmVyUmVzcG9uc2UuaW5kZXhPZignICcsIHN0YXJ0ICsgMSk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBkaXJlY3RvcnlOYW1lID0gc2VydmVyUmVzcG9uc2Uuc3Vic3RyaW5nKHN0YXJ0ICsgMSk7CiAgICAgICAgIGlmIChsb2NhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewogICAgICAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZShsb2NhbEZpbGUsIGRpcmVjdG9yeU5hbWUpOwpAQCAtMjM5LDEzICsyNDAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4pCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSlNjaEV4Y2VwdGlvbiAgewogICAgICAgICBpbnQgc3RhcnQgPSAwOwotICAgICAgICBpbnQgZW5kID0gc2VydmVyUmVzcG9uc2UuaW5kZXhPZigiICIsIHN0YXJ0ICsgMSk7CisgICAgICAgIGludCBlbmQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCcgJywgc3RhcnQgKyAxKTsKICAgICAgICAgc3RhcnQgPSBlbmQgKyAxOwotICAgICAgICBlbmQgPSBzZXJ2ZXJSZXNwb25zZS5pbmRleE9mKCIgIiwgc3RhcnQgKyAxKTsKKyAgICAgICAgZW5kID0gc2VydmVyUmVzcG9uc2UuaW5kZXhPZignICcsIHN0YXJ0ICsgMSk7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZXNpemUgPSBMb25nLnBhcnNlTG9uZyhzZXJ2ZXJSZXNwb25zZS5zdWJzdHJpbmcoc3RhcnQsIGVuZCkpOwogICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBzZXJ2ZXJSZXNwb25zZS5zdWJzdHJpbmcoZW5kICsgMSk7CiAgICAgICAgIGxvZygiUmVjZWl2aW5nOiAiICsgZmlsZW5hbWUgKyAiIDogIiArIGZpbGVzaXplKTsKLSAgICAgICAgZmluYWwgRmlsZSB0cmFuc2ZlckZpbGUgPSAobG9jYWxGaWxlLmlzRGlyZWN0b3J5KCkpCisgICAgICAgIGZpbmFsIEZpbGUgdHJhbnNmZXJGaWxlID0gbG9jYWxGaWxlLmlzRGlyZWN0b3J5KCkKICAgICAgICAgICAgICAgICA/IG5ldyBGaWxlKGxvY2FsRmlsZSwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgOiBsb2NhbEZpbGU7CiAgICAgICAgIGZldGNoRmlsZSh0cmFuc2ZlckZpbGUsIGZpbGVzaXplLCBvdXQsIGluKTsKQEAgLTI2Miw3ICsyNjMsNyBAQAogICAgICAgICBzZW5kQWNrKG91dCk7CiAKICAgICAgICAgLy8gcmVhZCBhIGNvbnRlbnQgb2YgbGZpbGUKLSAgICAgICAgZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpOworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZm9zID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGxvY2FsRmlsZS50b1BhdGgoKSk7CiAgICAgICAgIGludCBsZW5ndGg7CiAgICAgICAgIGxvbmcgdG90YWxMZW5ndGggPSAwOwogICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMjc3LDcgKzI3OCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgIGxlbmd0aCA9IGluLnJlYWQoYnVmLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJVRkZFUl9TSVpFIDwgZmlsZXNpemUpID8gQlVGRkVSX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9TSVpFIDwgZmlsZXNpemUgPyBCVUZGRVJfU0laRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludCkgZmlsZXNpemUpOwogICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFT0ZFeGNlcHRpb24oIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbS4iKTsKQEAgLTI4NSwxNSArMjg2LDE0IEBACiAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGJ1ZiwgMCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICBmaWxlc2l6ZSAtPSBsZW5ndGg7CiAgICAgICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gbGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChmaWxlc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgICAgIGlmICh0cmFja1Byb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCA9IHRyYWNrUHJvZ3Jlc3MoaW5pdEZpbGVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRUcmFuc21pdHRlZCk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWxlc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMzE4LDE5ICszMTgsMTcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBKU2NoRXhjZXB0aW9uKCJmYWlsZWQgdG8gc3RhdCByZW1vdGUgZmlsZSIsIGUpOwogICAgICAgICB9CiAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5zZXRGaWxlTGFzdE1vZGlmaWVkKGxvY2FsRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChsb25nKSBmaWxlQXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1UaW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMCk7CisgICAgICAgICAgICAgICAgKChsb25nKSBmaWxlQXR0cmlidXRlcy5nZXRNVGltZSgpKSAqIDEwMDApOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHJldHVybnMgdGhlIGRpcmVjdG9yeSBwYXJ0IG9mIHRoZSByZW1vdGUgZmlsZSwgaWYgYW55LgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyByZW1vdGVEaXIoZmluYWwgU3RyaW5nIHJlbW90ZUZpbGUpIHsKLSAgICAgICAgaW50IGluZGV4ID0gcmVtb3RlRmlsZS5sYXN0SW5kZXhPZigiLyIpOworICAgICAgICBpbnQgaW5kZXggPSByZW1vdGVGaWxlLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIGluZGV4ID0gcmVtb3RlRmlsZS5sYXN0SW5kZXhPZigiXFwiKTsKKyAgICAgICAgICAgIGluZGV4ID0gcmVtb3RlRmlsZS5sYXN0SW5kZXhPZignXFwnKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXggPiAtMSA/IHJlbW90ZUZpbGUuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSkgOiAiIjsKKyAgICAgICAgcmV0dXJuIGluZGV4IDwgMCA/ICIiIDogcmVtb3RlRmlsZS5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwRnJvbU1lc3NhZ2VCeVNmdHAuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BGcm9tTWVzc2FnZUJ5U2Z0cC5qYXZhCmluZGV4IDA0ZjcyZDIuLjBhZDA4OTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BGcm9tTWVzc2FnZUJ5U2Z0cC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BGcm9tTWVzc2FnZUJ5U2Z0cC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNyArMjAsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIAogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5DaGFubmVsU2Z0cDsKQEAgLTM5LDcgKzM5LDkgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIHJlbW90ZUZpbGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGxvY2FsRmlsZTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWN1cnNpdmUgPSBmYWxzZTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwogCiAgICAgLyoqCkBAIC0xMDMsNiArMTA1LDcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGkvbyBlcnJvcnMKICAgICAgKiBAdGhyb3dzIEpTY2hFeGNlcHRpb24gb24gZXJyb3JzIGRldGVjdGVkIGJ5IHNjcAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEpTY2hFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBDaGFubmVsU2Z0cCBjaGFubmVsID0gb3BlblNmdHBDaGFubmVsKCk7CiAgICAgICAgIHRyeSB7CkBAIC0xMTAsMTggKzExMywxNSBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBmaW5hbCBTZnRwQVRUUlMgYXR0cnMgPSBjaGFubmVsLnN0YXQocmVtb3RlRmlsZSk7CiAgICAgICAgICAgICAgICAgaWYgKGF0dHJzLmlzRGlyKCkgJiYgIXJlbW90ZUZpbGUuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlID0gcmVtb3RlRmlsZSArICIvIjsKKyAgICAgICAgICAgICAgICAgICAgcmVtb3RlRmlsZSArPSAiLyI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2Z0cEV4Y2VwdGlvbiBlZSkgewogICAgICAgICAgICAgICAgIC8vIElnbm9yZWQKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdldERpcihjaGFubmVsLCByZW1vdGVGaWxlLCBsb2NhbEZpbGUpOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBTZnRwRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGZpbmFsIEpTY2hFeGNlcHRpb24gc2NoRXhjZXB0aW9uID0gbmV3IEpTY2hFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgJyIrIHJlbW90ZUZpbGUKLSAgICAgICAgICAgICAgICAgICAgKyInIHRvICciK2xvY2FsRmlsZSsiJyAtICIKLSAgICAgICAgICAgICAgICAgICAgK2UudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBzY2hFeGNlcHRpb24uaW5pdENhdXNlKGUpOwotICAgICAgICAgICAgdGhyb3cgc2NoRXhjZXB0aW9uOworICAgICAgICAgICAgdGhyb3cgbmV3IEpTY2hFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgJyIgKyByZW1vdGVGaWxlICsgIicgdG8gJyIKKyAgICAgICAgICAgICAgICArIGxvY2FsRmlsZSArICInIC0gIiArIGUudG9TdHJpbmcoKSwgZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbC5kaXNjb25uZWN0KCk7CkBAIC0xMzIsNyArMTMyLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBnZXREaXIoZmluYWwgQ2hhbm5lbFNmdHAgY2hhbm5lbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZW1vdGVGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBsb2NhbEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2Z0cEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIFNmdHBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgcHdkID0gcmVtb3RlRmlsZTsKICAgICAgICAgaWYgKHJlbW90ZUZpbGUubGFzdEluZGV4T2YoJy8nKSAhPSAtMSkgewogICAgICAgICAgICAgaWYgKHJlbW90ZUZpbGUubGVuZ3RoKCkgPiAxKSB7CkBAIC0xNDMsMTMgKzE0MywxMiBAQAogICAgICAgICBpZiAoIWxvY2FsRmlsZS5leGlzdHMoKSkgewogICAgICAgICAgICAgbG9jYWxGaWxlLm1rZGlycygpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGphdmEudXRpbC5WZWN0b3IgZmlsZXMgPSBjaGFubmVsLmxzKHJlbW90ZUZpbGUpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGZpbGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIENoYW5uZWxTZnRwLkxzRW50cnkgbGUgPSAoQ2hhbm5lbFNmdHAuTHNFbnRyeSkgZmlsZXMuZWxlbWVudEF0KGkpOworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgZmluYWwgTGlzdDxDaGFubmVsU2Z0cC5Mc0VudHJ5PiBmaWxlcyA9IGNoYW5uZWwubHMocmVtb3RlRmlsZSk7CisgICAgICAgIGZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBsZSA6IGZpbGVzKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGxlLmdldEZpbGVuYW1lKCk7CiAgICAgICAgICAgICBpZiAobGUuZ2V0QXR0cnMoKS5pc0RpcigpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuZXF1YWxzKCIuIikgfHwgbmFtZS5lcXVhbHMoIi4uIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIi4iLmVxdWFscyhuYW1lKSB8fCAiLi4iLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZ2V0RGlyKGNoYW5uZWwsCkBAIC0xNjQsNyArMTYzLDcgQEAKIAogICAgIHByaXZhdGUgdm9pZCBnZXRGaWxlKGZpbmFsIENoYW5uZWxTZnRwIGNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZnRwRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGxvY2FsRmlsZSkgdGhyb3dzIFNmdHBFeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgcmVtb3RlRmlsZSA9IGxlLmdldEZpbGVuYW1lKCk7CiAgICAgICAgIGlmICghbG9jYWxGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKQEAgLTE5Nyw5ICsxOTYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChnZXRQcmVzZXJ2ZUxhc3RNb2RpZmllZCgpKSB7CiAgICAgICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuc2V0RmlsZUxhc3RNb2RpZmllZChsb2NhbEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcpIGxlLmdldEF0dHJzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TVRpbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICgobG9uZykgbGUuZ2V0QXR0cnMoKS5nZXRNVGltZSgpKSAqIDEwMDApOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRvTWVzc2FnZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRvTWVzc2FnZS5qYXZhCmluZGV4IDY1MDgwNGYuLjc0MDI5YjcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVG9NZXNzYWdlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMCArMTksMTAgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3NoOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIApAQCAtNDIsNyArNDIsNyBAQAogCiAgICAgcHJpdmF0ZSBGaWxlIGxvY2FsRmlsZTsKICAgICBwcml2YXRlIFN0cmluZyByZW1vdGVQYXRoOwotICAgIHByaXZhdGUgTGlzdCBkaXJlY3RvcnlMaXN0OworICAgIHByaXZhdGUgTGlzdDxEaXJlY3Rvcnk+IGRpcmVjdG9yeUxpc3Q7CiAgICAgcHJpdmF0ZSBJbnRlZ2VyIGZpbGVNb2RlLCBkaXJNb2RlOwogICAgIHByaXZhdGUgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZDsKIApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFNjcFRvTWVzc2FnZShmaW5hbCBib29sZWFuIHZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGFEaXJlY3RvcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEaXJlY3Rvcnk+IGFEaXJlY3RvcnlMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFSZW1vdGVQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkgewogICAgICAgICB0aGlzKHZlcmJvc2UsIGZhbHNlLCBzZXNzaW9uLCBhRGlyZWN0b3J5TGlzdCwgYVJlbW90ZVBhdGgsIHByZXNlcnZlTGFzdE1vZGlmaWVkKTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgIHB1YmxpYyBTY3BUb01lc3NhZ2UoZmluYWwgYm9vbGVhbiB2ZXJib3NlLAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjb21wcmVzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdCBhRGlyZWN0b3J5TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RGlyZWN0b3J5PiBhRGlyZWN0b3J5TGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhUmVtb3RlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQpIHsKICAgICAgICAgdGhpcyh2ZXJib3NlLCBjb21wcmVzc2VkLCBzZXNzaW9uLCBhUmVtb3RlUGF0aCk7CkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU2NwVG9NZXNzYWdlKGZpbmFsIGJvb2xlYW4gdmVyYm9zZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlc3Npb24gc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgYURpcmVjdG9yeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PERpcmVjdG9yeT4gYURpcmVjdG9yeUxpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYVJlbW90ZVBhdGgpIHsKICAgICAgICAgdGhpcyh2ZXJib3NlLCBzZXNzaW9uLCBhRGlyZWN0b3J5TGlzdCwgYVJlbW90ZVBhdGgsIGZhbHNlKTsKICAgICB9CkBAIC0xODQsMTkgKzE4NCw2IEBACiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IgZm9yIFNjcFRvTWVzc2FnZS4KICAgICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlIGRvIHZlcmJvc2UgbG9nZ2luZwotICAgICAqIEBwYXJhbSBzZXNzaW9uIHRoZSBzY3Agc2Vzc2lvbiB0byB1c2UKLSAgICAgKiBAcGFyYW0gYVJlbW90ZVBhdGggdGhlIHJlbW90ZSBwYXRoCi0gICAgICogQHNpbmNlIEFudCAxLjYuMgotICAgICAqLwotICAgIHByaXZhdGUgU2NwVG9NZXNzYWdlKGZpbmFsIGJvb2xlYW4gdmVyYm9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFSZW1vdGVQYXRoKSB7Ci0gICAgICAgIHRoaXModmVyYm9zZSwgZmFsc2UsIHNlc3Npb24sIGFSZW1vdGVQYXRoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgU2NwVG9NZXNzYWdlLgotICAgICAqIEBwYXJhbSB2ZXJib3NlIGlmIHRydWUgZG8gdmVyYm9zZSBsb2dnaW5nCiAgICAgICogQHBhcmFtIGNvbXByZXNzZWQgaWYgdHJ1ZSB1c2UgY29tcHJlc3Npb24KICAgICAgKiBAcGFyYW0gc2Vzc2lvbiB0aGUgc2NwIHNlc3Npb24gdG8gdXNlCiAgICAgICogQHBhcmFtIGFSZW1vdGVQYXRoIHRoZSByZW1vdGUgcGF0aApAQCAtMjI5LDcgKzIxNiw3IEBACiAgICAgICogQHBhcmFtIGFSZW1vdGVQYXRoIHRoZSByZW1vdGUgcGF0aAogICAgICAqLwogICAgIHB1YmxpYyBTY3BUb01lc3NhZ2UoZmluYWwgU2Vzc2lvbiBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3QgYURpcmVjdG9yeUxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEaXJlY3Rvcnk+IGFEaXJlY3RvcnlMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhUmVtb3RlUGF0aCkgewogICAgICAgICB0aGlzKGZhbHNlLCBzZXNzaW9uLCBhRGlyZWN0b3J5TGlzdCwgYVJlbW90ZVBhdGgpOwogICAgIH0KQEAgLTI2Miw3ICsyNDksNiBAQAogICAgICAgICBmaW5hbCBTdHJpbmcgY21kID0gc2IudG9TdHJpbmcoKTsKICAgICAgICAgZmluYWwgQ2hhbm5lbCBjaGFubmVsID0gb3BlbkV4ZWNDaGFubmVsKGNtZCk7CiAgICAgICAgIHRyeSB7Ci0KICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQgPSBjaGFubmVsLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBjaGFubmVsLmdldElucHV0U3RyZWFtKCk7CiAKQEAgLTI5NCw4ICsyODAsNyBAQAogICAgICAgICAgICAgY2hhbm5lbC5jb25uZWN0KCk7CiAKICAgICAgICAgICAgIHdhaXRGb3JBY2soaW4pOwotICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvciBpID0gZGlyZWN0b3J5TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnkgY3VycmVudCA9IChEaXJlY3RvcnkpIGkubmV4dCgpOworICAgICAgICAgICAgZm9yIChEaXJlY3RvcnkgY3VycmVudCA6IGRpcmVjdG9yeUxpc3QpIHsKICAgICAgICAgICAgICAgICBzZW5kRGlyZWN0b3J5KGN1cnJlbnQsIGluLCBvdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMzA4LDEyICsyOTMsMTEgQEAKICAgICBwcml2YXRlIHZvaWQgc2VuZERpcmVjdG9yeShmaW5hbCBEaXJlY3RvcnkgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yIGZpbGVJdCA9IGN1cnJlbnQuZmlsZXNJdGVyYXRvcigpOyBmaWxlSXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgc2VuZEZpbGVUb1JlbW90ZSgoRmlsZSkgZmlsZUl0Lm5leHQoKSwgaW4sIG91dCk7CisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RmlsZT4gZmlsZUl0ID0gY3VycmVudC5maWxlc0l0ZXJhdG9yKCk7IGZpbGVJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZW5kRmlsZVRvUmVtb3RlKGZpbGVJdC5uZXh0KCksIGluLCBvdXQpOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgZGlySXQgPSBjdXJyZW50LmRpcmVjdG9yeUl0ZXJhdG9yKCk7IGRpckl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGZpbmFsIERpcmVjdG9yeSBkaXIgPSAoRGlyZWN0b3J5KSBkaXJJdC5uZXh0KCk7Ci0gICAgICAgICAgICBzZW5kRGlyZWN0b3J5VG9SZW1vdGUoZGlyLCBpbiwgb3V0KTsKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxEaXJlY3Rvcnk+IGRpckl0ID0gY3VycmVudC5kaXJlY3RvcnlJdGVyYXRvcigpOyBkaXJJdC5oYXNOZXh0KCk7KSB7CisgICAgICAgICAgICBzZW5kRGlyZWN0b3J5VG9SZW1vdGUoZGlySXQubmV4dCgpLCBpbiwgb3V0KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzYzLDcgKzM0Nyw2IEBACiAgICAgICAgIHdhaXRGb3JBY2soaW4pOwogCiAgICAgICAgIC8vIHNlbmQgYSBjb250ZW50IG9mIGxmaWxlCi0gICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxvY2FsRmlsZSk7CiAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CiAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CiAgICAgICAgIGxvbmcgdG90YWxMZW5ndGggPSAwOwpAQCAtMzc1LDcgKzM1OCw3IEBACiAgICAgICAgIGZpbmFsIGxvbmcgaW5pdEZpbGVzaXplID0gZmlsZXNpemU7CiAgICAgICAgIGludCBwZXJjZW50VHJhbnNtaXR0ZWQgPSAwOwogCi0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gZmlzID0gRmlsZXMubmV3SW5wdXRTdHJlYW0obG9jYWxGaWxlLnRvUGF0aCgpKSkgewogICAgICAgICAgICAgaWYgKHRoaXMuZ2V0VmVyYm9zZSgpKSB7CiAgICAgICAgICAgICAgICAgbG9nKCJTZW5kaW5nOiAiICsgbG9jYWxGaWxlLmdldE5hbWUoKSArICIgOiAiICsgbG9jYWxGaWxlLmxlbmd0aCgpKTsKICAgICAgICAgICAgIH0KQEAgLTQwMSw3ICszODQsNiBAQAogICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICAgICAgICAgIGxvZ1N0YXRzKHN0YXJ0VGltZSwgZW5kVGltZSwgdG90YWxMZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlzLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQzNiw3ICs0MTgsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS45LjUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEZpbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gZmlsZU1vZGUgIT0gbnVsbCA/IGZpbGVNb2RlLmludFZhbHVlKCkgOiBERUZBVUxUX0ZJTEVfTU9ERTsKKyAgICAgICAgcmV0dXJuIGZpbGVNb2RlICE9IG51bGwgPyBmaWxlTW9kZSA6IERFRkFVTFRfRklMRV9NT0RFOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDU0LDcgKzQzNiw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjkuNQogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0RGlyTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIGRpck1vZGUgIT0gbnVsbCA/IGRpck1vZGUuaW50VmFsdWUoKSA6IERFRkFVTFRfRElSX01PREU7CisgICAgICAgIHJldHVybiBkaXJNb2RlICE9IG51bGwgPyBkaXJNb2RlIDogREVGQVVMVF9ESVJfTU9ERTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2VCeVNmdHAuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NzaC9TY3BUb01lc3NhZ2VCeVNmdHAuamF2YQppbmRleCAwOTNjZTJhLi5jNjI2NmJmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVG9NZXNzYWdlQnlTZnRwLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRvTWVzc2FnZUJ5U2Z0cC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzgsNyArMzgsNyBAQAogCiAgICAgcHJpdmF0ZSBGaWxlIGxvY2FsRmlsZTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZW1vdGVQYXRoOwotICAgIHByaXZhdGUgTGlzdCBkaXJlY3RvcnlMaXN0OworICAgIHByaXZhdGUgTGlzdDxEaXJlY3Rvcnk+IGRpcmVjdG9yeUxpc3Q7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkOwogCiAgICAgLyoqCkBAIC04OCw3ICs4OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFNjcFRvTWVzc2FnZUJ5U2Z0cChmaW5hbCBib29sZWFuIHZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGFEaXJlY3RvcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEaXJlY3Rvcnk+IGFEaXJlY3RvcnlMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFSZW1vdGVQYXRoKSB7CiAgICAgICAgIHRoaXModmVyYm9zZSwgc2Vzc2lvbiwgYURpcmVjdG9yeUxpc3QsIGFSZW1vdGVQYXRoLCBmYWxzZSk7CiAgICAgfQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFNjcFRvTWVzc2FnZUJ5U2Z0cChmaW5hbCBib29sZWFuIHZlcmJvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGFEaXJlY3RvcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEaXJlY3Rvcnk+IGFEaXJlY3RvcnlMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFSZW1vdGVQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCkgewogICAgICAgICB0aGlzKHZlcmJvc2UsIHNlc3Npb24sIGFSZW1vdGVQYXRoLCBwcmVzZXJ2ZUxhc3RNb2RpZmllZCk7CkBAIC0xNTAsNyArMTUwLDcgQEAKICAgICAgKiBAcGFyYW0gYVJlbW90ZVBhdGggdGhlIHJlbW90ZSBwYXRoCiAgICAgICovCiAgICAgcHVibGljIFNjcFRvTWVzc2FnZUJ5U2Z0cChmaW5hbCBTZXNzaW9uIHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0IGFEaXJlY3RvcnlMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEaXJlY3Rvcnk+IGFEaXJlY3RvcnlMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFSZW1vdGVQYXRoKSB7CiAgICAgICAgIHRoaXMoZmFsc2UsIHNlc3Npb24sIGFEaXJlY3RvcnlMaXN0LCBhUmVtb3RlUGF0aCk7CiAgICAgfQpAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgIGxvZygiZG9uZS5cbiIpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBkb1NpbmdsZVRyYW5zZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKU2NoRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgZG9TaW5nbGVUcmFuc2ZlcigpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKICAgICAgICAgZmluYWwgQ2hhbm5lbFNmdHAgY2hhbm5lbCA9IG9wZW5TZnRwQ2hhbm5lbCgpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgY2hhbm5lbC5jb25uZWN0KCk7CkBAIC0yMTIsMjEgKzIxMiwxOSBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU2NoRXhjZXB0aW9uKCJDb3VsZCBub3QgQ0QgdG8gJyIgKyByZW1vdGVQYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyAtICIgKyBlLnRvU3RyaW5nKCksIGUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgRGlyZWN0b3J5IGN1cnJlbnQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yIGkgPSBkaXJlY3RvcnlMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gKERpcmVjdG9yeSkgaS5uZXh0KCk7CisgICAgICAgICAgICBmb3IgKERpcmVjdG9yeSBjdXJyZW50IDogZGlyZWN0b3J5TGlzdCkgeworICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRWZXJib3NlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygiU2VuZGluZyBkaXJlY3RvcnkgIiArIGN1cnJlbnQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNlbmREaXJlY3RvcnkoY2hhbm5lbCwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2Z0cEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igc2VuZGluZyBkaXJlY3RvcnkiOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgJyIgKyBjdXJyZW50LmdldERpcmVjdG9yeSgpLmdldE5hbWUoKSArICInIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSlNjaEV4Y2VwdGlvbihtc2csIGUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNmdHBFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiRXJyb3Igc2VuZGluZyBkaXJlY3RvcnkiOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5nZXREaXJlY3RvcnkoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICciICsgY3VycmVudC5nZXREaXJlY3RvcnkoKS5nZXROYW1lKCkgKyAiJyI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBKU2NoRXhjZXB0aW9uKG1zZywgZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7CkBAIC0yMzgsMTIgKzIzNiwxMSBAQAogICAgIHByaXZhdGUgdm9pZCBzZW5kRGlyZWN0b3J5KGZpbmFsIENoYW5uZWxTZnRwIGNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5IGN1cnJlbnQpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2Z0cEV4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgZmlsZUl0ID0gY3VycmVudC5maWxlc0l0ZXJhdG9yKCk7IGZpbGVJdC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBzZW5kRmlsZVRvUmVtb3RlKGNoYW5uZWwsIChGaWxlKSBmaWxlSXQubmV4dCgpLCBudWxsKTsKKyAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxGaWxlPiBmaWxlSXQgPSBjdXJyZW50LmZpbGVzSXRlcmF0b3IoKTsgZmlsZUl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNlbmRGaWxlVG9SZW1vdGUoY2hhbm5lbCwgZmlsZUl0Lm5leHQoKSwgbnVsbCk7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvciBkaXJJdCA9IGN1cnJlbnQuZGlyZWN0b3J5SXRlcmF0b3IoKTsgZGlySXQuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5IGRpciA9IChEaXJlY3RvcnkpIGRpckl0Lm5leHQoKTsKLSAgICAgICAgICAgIHNlbmREaXJlY3RvcnlUb1JlbW90ZShjaGFubmVsLCBkaXIpOworICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPERpcmVjdG9yeT4gZGlySXQgPSBjdXJyZW50LmRpcmVjdG9yeUl0ZXJhdG9yKCk7IGRpckl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIHNlbmREaXJlY3RvcnlUb1JlbW90ZShjaGFubmVsLCBkaXJJdC5uZXh0KCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjgsNyArMjY1LDcgQEAKICAgICBwcml2YXRlIHZvaWQgc2VuZEZpbGVUb1JlbW90ZShmaW5hbCBDaGFubmVsU2Z0cCBjaGFubmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgbG9jYWxGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdGVQYXRoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNmdHBFeGNlcHRpb24geworICAgICAgICB0aHJvd3MgU2Z0cEV4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGxvbmcgZmlsZXNpemUgPSBsb2NhbEZpbGUubGVuZ3RoKCk7CiAKICAgICAgICAgaWYgKHJlbW90ZVBhdGggPT0gbnVsbCkgewpAQCAtMzI5LDYgKzMyNiw3IEBACiAgICAgICogR2V0IHRoZSBsb2NhbCBmaWxlLgogICAgICAqIEByZXR1cm4gdGhlIGxvY2FsIGZpbGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0TG9jYWxGaWxlKCkgewogICAgICAgICByZXR1cm4gbG9jYWxGaWxlOwogICAgIH0KQEAgLTMzNyw2ICszMzUsNyBAQAogICAgICAqIEdldCB0aGUgcmVtb3RlIHBhdGguCiAgICAgICogQHJldHVybiB0aGUgcmVtb3RlIHBhdGguCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVQYXRoKCkgewogICAgICAgICByZXR1cm4gcmVtb3RlUGF0aDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0Jsb2NrRm9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0Jsb2NrRm9yLmphdmEKaW5kZXggNGIyOTc4YS4uNzU4Y2I0NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9CbG9ja0Zvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvQmxvY2tGb3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkVGltZW91dEV4Y2VwdGlvbiBvbiB0aW1lb3V0LCB1c2luZyB0aGUgdGV4dCBpbiB7QGxpbmsgI3RleHR9CiAgICAgICoKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGltZW91dCgpIHRocm93cyBCdWlsZFRpbWVvdXRFeGNlcHRpb24gewogICAgICAgICBzdXBlci5wcm9jZXNzVGltZW91dCgpOwogICAgICAgICB0aHJvdyBuZXcgQnVpbGRUaW1lb3V0RXhjZXB0aW9uKHRleHQsIGdldExvY2F0aW9uKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9CdWlsZFRpbWVvdXRFeGNlcHRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Rlc3RpbmcvQnVpbGRUaW1lb3V0RXhjZXB0aW9uLmphdmEKaW5kZXggMTQzZDA4Yy4uYzgwNWRiNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9CdWlsZFRpbWVvdXRFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0J1aWxkVGltZW91dEV4Y2VwdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdGVzdGluZy9GdW50ZXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0Z1bnRlc3QuamF2YQppbmRleCAzMDNhOWQ2Li44NjNiZTgyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0Z1bnRlc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC90ZXN0aW5nL0Z1bnRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU4LDYgKzU4LDE5IEBACiAgKi8KIAogcHVibGljIGNsYXNzIEZ1bnRlc3QgZXh0ZW5kcyBUYXNrIHsKKyAgICAvKioge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOX09WRVJSSURJTkcgPSAiT3ZlcnJpZGluZyBwcmV2aW91cyBkZWZpbml0aW9uIG9mICI7CisgICAgLyoqIHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRk9SQ0lCTFlfU0hVVF9ET1dOID0gIkFwcGxpY2F0aW9uIGZvcmNpYmx5IHNodXQgZG93biI7CisgICAgLyoqIHtAdmFsdWV9ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hVVERPV05fSU5URVJSVVBURUQgPSAiU2h1dGRvd24gaW50ZXJydXB0ZWQiOworICAgIC8qKiB7QHZhbHVlfSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNLSVBQSU5HX1RFU1RTCisgICAgICAgID0gIkNvbmRpdGlvbiBmYWlsZWQgLXNraXBwaW5nIHRlc3RzIjsKKyAgICAvKiogQXBwbGljYXRpb24gZXhjZXB0aW9uIDoge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9FWENFUFRJT04gPSAiQXBwbGljYXRpb24gRXhjZXB0aW9uIjsKKyAgICAvKiogVGVhcmRvd24gZXhjZXB0aW9uIDoge0B2YWx1ZX0gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURUFSRE9XTl9FWENFUFRJT04gPSAiVGVhcmRvd24gRXhjZXB0aW9uIjsKIAogICAgIC8qKgogICAgICAqIEEgY29uZGl0aW9uIHRoYXQgbXVzdCBiZSB0cnVlIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4gVGhpcyBtYWtlcyBpdApAQCAtMTU4LDIwICsxNzEsNiBAQAogICAgICAqLwogICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gdGFza0V4Y2VwdGlvbjsKIAotICAgIC8qKiB7QHZhbHVlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5fT1ZFUlJJRElORyA9ICJPdmVycmlkaW5nIHByZXZpb3VzIGRlZmluaXRpb24gb2YgIjsKLSAgICAvKioge0B2YWx1ZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMSUNBVElPTl9GT1JDSUJMWV9TSFVUX0RPV04gPSAiQXBwbGljYXRpb24gZm9yY2libHkgc2h1dCBkb3duIjsKLSAgICAvKioge0B2YWx1ZX0gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSFVURE9XTl9JTlRFUlJVUFRFRCA9ICJTaHV0ZG93biBpbnRlcnJ1cHRlZCI7Ci0gICAgLyoqIHtAdmFsdWV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUFBJTkdfVEVTVFMKLSAgICAgICAgPSAiQ29uZGl0aW9uIGZhaWxlZCAtc2tpcHBpbmcgdGVzdHMiOwotICAgIC8qKiBBcHBsaWNhdGlvbiBleGNlcHRpb24gOiB7QHZhbHVlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0VYQ0VQVElPTiA9ICJBcHBsaWNhdGlvbiBFeGNlcHRpb24iOwotICAgIC8qKiBUZWFyZG93biBleGNlcHRpb24gOiB7QHZhbHVlfSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFQVJET1dOX0VYQ0VQVElPTiA9ICJUZWFyZG93biBFeGNlcHRpb24iOwotCiAgICAgLyoqCiAgICAgICogTG9nIGlmIHRoZSBkZWZpbml0aW9uIGlzIG92ZXJyaWRpbmcgc29tZXRoaW5nCiAgICAgICoKQEAgLTM3OCw4ICszNzcsOSBAQAogICAgICAqIEBwYXJhbSByb2xlIHJvbGUgb2YgdGhlIHRhc2sKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVUYXNrKFRhc2sgdGFzaywgU3RyaW5nIHJvbGUpIHsKLSAgICAgICAgaWYgKHRhc2shPW51bGwgJiYgdGFzay5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHJvbGUgKyAiIHRhc2sgaXMgbm90IGJvdW5kIHRvIHRoZSBwcm9qZWN0IiArIHRhc2spOworICAgICAgICBpZiAodGFzayAhPSBudWxsICYmIHRhc2suZ2V0UHJvamVjdCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgdGFzayBpcyBub3QgYm91bmQgdG8gdGhlIHByb2plY3QgJXMiLAorICAgICAgICAgICAgICAgIHJvbGUsIHRhc2spOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTIsNiArMzkyLDcgQEAKICAgICAgKiB0ZXN0IGZhaWxpbmcgdGhhdCBpcyBtb3JlIGltcG9ydGFudC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyB3YXMgY2F1Z2h0IGR1cmluZyB0aGUgcnVuIG9yIHRlYXJkb3duLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogCiAgICAgICAgIC8vdmFsaWRhdGlvbgpAQCAtNTYxLDEyICs1NjIsMTMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZXN0ZWRDb25kaXRpb24gZXh0ZW5kcyBDb25kaXRpb25CYXNlIGltcGxlbWVudHMgQ29uZGl0aW9uIHsKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGV2YWwoKSB7CiAgICAgICAgICAgICBpZiAoY291bnRDb25kaXRpb25zKCkgIT0gMSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgIkEgc2luZ2xlIG5lc3RlZCBjb25kaXRpb24gaXMgcmVxdWlyZWQuIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKChDb25kaXRpb24pIChnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKSkpLmV2YWwoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb25kaXRpb25zKCkubmV4dEVsZW1lbnQoKS5ldmFsKCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0Fic3RyYWN0QWNjZXNzVGFzay5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9BYnN0cmFjdEFjY2Vzc1Rhc2suamF2YQppbmRleCBhMmI1M2RiLi44ZjMyYWRmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0Fic3RyYWN0QWNjZXNzVGFzay5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQWJzdHJhY3RBY2Nlc3NUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02OSw2ICs2OSw3IEBACiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqIEBwYXJhbSBjbWRsIEEgdXNlciBzdXBwbGllZCBjb21tYW5kIGxpbmUgdGhhdCB3ZSB3b24ndCBhY2NlcHQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q29tbWFuZChDb21tYW5kbGluZSBjbWRsKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgY29tbWFuZCBhdHRyaWJ1dGUiLApAQCAtODEsNiArODIsNyBAQAogICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKiBAcGFyYW0gc2tpcCBBIHVzZXIgc3VwcGxpZWQgYm9vbGVhbiB3ZSB3b24ndCBhY2NlcHQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U2tpcEVtcHR5RmlsZXNldHMoYm9vbGVhbiBza2lwKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJza2lwZW1wdHlmaWxlc2V0IGF0dHJpYnV0ZSIsCkBAIC05Myw2ICs5NSw3IEBACiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqIEBwYXJhbSBiIEEgdXNlciBzdXBwbGllZCBib29sZWFuIHdlIHdvbid0IGFjY2VwdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRBZGRzb3VyY2VmaWxlKGJvb2xlYW4gYikgewogICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKQogICAgICAgICAgICAgKyAiIGRvZXNuXCd0IHN1cHBvcnQgdGhlIGFkZHNvdXJjZWZpbGUgYXR0cmlidXRlIiwgZ2V0TG9jYXRpb24oKSk7CkBAIC0xMDMsNiArMTA2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYSB2YWxpZCBPUywgZm9yIHVuaXggdGhpcyBpcyBhbHdheXMgdHJ1ZSwgb3RoZXJ3aXNlCiAgICAgICogICAgICAgICAgICAgIHVzZSB0aGUgc3VwZXJjbGFzc2VzJyB0ZXN0ICh1c2VyIHNldCkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE9zKCkgewogICAgICAgICByZXR1cm4gZ2V0T3MoKSA9PSBudWxsICYmIGdldE9zRmFtaWx5KCkgPT0gbnVsbAogICAgICAgICAgICAgPyBPcy5pc0ZhbWlseShPcy5GQU1JTFlfVU5JWCkgOiBzdXBlci5pc1ZhbGlkT3MoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQ2hncnAuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQ2hncnAuamF2YQppbmRleCBjZDJjYzQ5Li4yYTE0YzZiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0NoZ3JwLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9DaGdycC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjMsNiArNjMsNyBAQAogICAgICAqIEVuc3VyZSB0aGF0IGFsbCB0aGUgcmVxdWlyZWQgYXJndW1lbnRzIGFuZCBvdGhlciBjb25kaXRpb25zIGhhdmUKICAgICAgKiBiZWVuIHNldC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB7CiAgICAgICAgIGlmICghaGF2ZUdyb3VwKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBncm91cCBub3Qgc2V0IGluICIKQEAgLTc2LDYgKzc3LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBlIFVzZXIgc3VwcGxpZWQgZXhlY3V0YWJsZSB0aGF0IHdlIHdvbid0IGFjY2VwdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlKFN0cmluZyBlKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgZXhlY3V0YWJsZSIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQ2hvd24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvQ2hvd24uamF2YQppbmRleCAwMmExYzE3Li40ODJjMmQ5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L0Nob3duLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9DaG93bi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjMsNiArNjMsNyBAQAogICAgICAqIEVuc3VyZSB0aGF0IGFsbCB0aGUgcmVxdWlyZWQgYXJndW1lbnRzIGFuZCBvdGhlciBjb25kaXRpb25zIGhhdmUKICAgICAgKiBiZWVuIHNldC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbmZpZ3VyYXRpb24oKSB7CiAgICAgICAgIGlmICghaGF2ZU93bmVyKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlJlcXVpcmVkIGF0dHJpYnV0ZSBvd25lciBub3Qgc2V0IGluIgpAQCAtNzYsNiArNzcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGUgVXNlciBzdXBwbGllZCBleGVjdXRhYmxlIHRoYXQgd2Ugd29uJ3QgYWNjZXB0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoU3RyaW5nIGUpIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldFRhc2tUeXBlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSBleGVjdXRhYmxlIgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9TeW1saW5rLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmsuamF2YQppbmRleCA4NmYxOTlkLi41NGQ2ODExIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmsuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmsuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDI4ICszMiwzMCBAQAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaC5EaXNwYXRjaFRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZGlzcGF0Y2guRGlzcGF0Y2hVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FeGVjdXRlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkxvZ091dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3ltYm9saWNMaW5rVXRpbHM7CiAKIC8qKgogICogQ3JlYXRlcywgRGVsZXRlcywgUmVjb3JkcyBhbmQgUmVzdG9yZXMgU3ltbGlua3MuCkBAIC05OCwyOCArMTAwLDE0IEBACiAgKiAmbHQ7c3ltbGluayBhY3Rpb249JnF1b3Q7ZGVsZXRlJnF1b3Q7IGxpbms9JnF1b3Q7JHtkaXIudG9wfS9mb28mcXVvdDsvJmd0OwogICogPC9wcmU+CiAgKgotICogPHA+PHN0cm9uZz5MSU1JVEFUSU9OUzo8L3N0cm9uZz4gQmVjYXVzZSBKYXZhIGhhcyBubyBkaXJlY3Qgc3VwcG9ydCBmb3IKLSAqIGhhbmRsaW5nIHN5bWxpbmtzIHRoaXMgdGFzayBkaXZpbmVzIHRoZW0gYnkgY29tcGFyaW5nIGNhbm9uaWNhbCBhbmQKLSAqIGFic29sdXRlIHBhdGhzLiBPbiBub24tdW5peCBzeXN0ZW1zIHRoaXMgbWF5IGNhdXNlIGZhbHNlIHBvc2l0aXZlcy4KLSAqIEZ1cnRoZXJtb3JlLCBhbnkgb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgY29tbWFuZAotICogPGNvZGU+bG4gLXMgbGluayByZXNvdXJjZTwvY29kZT4gaXMgbm90IGEgdmFsaWQgY29tbWFuZCBvbiB0aGUgY29tbWFuZCBsaW5lCi0gKiB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZSBhY3Rpb249JnF1b3Q7ZGVsZXRlJnF1b3Q7LCBhY3Rpb249JnF1b3Q7c2luZ2xlJnF1b3Q7Ci0gKiBvciBhY3Rpb249JnF1b3Q7cmVjcmVhdGUmcXVvdDssIGJ1dCBhY3Rpb249JnF1b3Q7cmVjb3JkJnF1b3Q7IHNob3VsZCBzdGlsbAotICogd29yay4gRmluYWxseSwgdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3Igc3ltbGlua3MgaW4gSmF2YSBtZWFucyB0aGF0IGFsbCBsaW5rcwotICogYXJlIHJlY29yZGVkIGFzIGxpbmtzIHRvIHRoZSA8c3Ryb25nPmNhbm9uaWNhbDwvc3Ryb25nPiByZXNvdXJjZSBuYW1lLgotICogVGhlcmVmb3JlIHRoZSBsaW5rOiA8Y29kZT5saW5rIC0tJmd0OyBzdWJkaXIvZGlyLy4uL2Zvby5iYXI8L2NvZGU+IHdpbGwgYmUKLSAqIHJlY29yZGVkIGFzIDxjb2RlPmxpbms9c3ViZGlyL2Zvby5iYXI8L2NvZGU+IGFuZCByZXN0b3JlZCBhcwotICogPGNvZGU+bGluayAtLSZndDsgc3ViZGlyL2Zvby5iYXI8L2NvZGU+LjwvcD4KLSAqCisgKiA8cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFN0YXJ0aW5nIEFudCB2ZXJzaW9uIDEuMTAuMiwgdGhpcyB0YXNrIHJlbGllcyBvbiB0aGUgc3ltYm9saWMgbGluayBzdXBwb3J0CisgKiBpbnRyb2R1Y2VkIGluIEphdmEgNyB0aHJvdWdoIHRoZSB7QGxpbmsgRmlsZXN9IEFQSXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBTeW1saW5rIGV4dGVuZHMgRGlzcGF0Y2hUYXNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTeW1ib2xpY0xpbmtVdGlscyBTWU1MSU5LX1VUSUxTID0KLSAgICAgICAgU3ltYm9saWNMaW5rVXRpbHMuZ2V0U3ltYm9saWNMaW5rVXRpbHMoKTsKIAogICAgIHByaXZhdGUgU3RyaW5nIHJlc291cmNlOwogICAgIHByaXZhdGUgU3RyaW5nIGxpbms7Ci0gICAgcHJpdmF0ZSBWZWN0b3IgZmlsZVNldHMgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBTdHJpbmcgbGlua0ZpbGVOYW1lOwogICAgIHByaXZhdGUgYm9vbGVhbiBvdmVyd3JpdGU7CiAgICAgcHJpdmF0ZSBib29sZWFuIGZhaWxvbmVycm9yOwpAQCAtMTg1LDE0ICsxNzMsMTggQEAKICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiTXVzdCBkZWZpbmUgdGhlIGxpbmsgbmFtZSBmb3Igc3ltbGluayEiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBQYXRoIGxpbmtQYXRoID0gUGF0aHMuZ2V0KGxpbmspOworICAgICAgICAgICAgaWYgKCFGaWxlcy5pc1N5bWJvbGljTGluayhsaW5rUGF0aCkpIHsKKyAgICAgICAgICAgICAgICBsb2coIlNraXBwaW5nIGRlbGV0aW9uIG9mICIgKyBsaW5rUGF0aCArICIgc2luY2UgaXQncyBub3QgYSBzeW1saW5rIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgICAgICAgICAgLy8ganVzdCBpZ25vcmUgYW5kIHNpbGVudGx5IHJldHVybiAodGhpcyBpcyBjb25zaXN0ZW50CisgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgY3VycmVudCwgMS45LnggdmVyc2lvbnMsIG9mIEFudCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvZygiUmVtb3Zpbmcgc3ltbGluazogIiArIGxpbmspOwotICAgICAgICAgICAgU1lNTElOS19VVElMUy5kZWxldGVTeW1ib2xpY0xpbmsoRklMRV9VVElMUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVGaWxlKG5ldyBGaWxlKCIuIiksIGxpbmspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihmbmZlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgZGVsZXRlU3ltTGluayhsaW5rUGF0aCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW9lLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW9lLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzZXREZWZhdWx0cygpOwogICAgICAgICB9CkBAIC0yMDYsMjggKzE5OCwzNCBAQAogICAgIHB1YmxpYyB2b2lkIHJlY3JlYXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChmaWxlU2V0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiRmlsZSBzZXQgaWRlbnRpZnlpbmcgbGluayBmaWxlKHMpICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJyZXF1aXJlZCBmb3IgYWN0aW9uIHJlY3JlYXRlIik7CisgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSBzZXQgaWRlbnRpZnlpbmcgbGluayBmaWxlKHMpIHJlcXVpcmVkIGZvciBhY3Rpb24gcmVjcmVhdGUiKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBQcm9wZXJ0aWVzIGxpbmtzID0gbG9hZExpbmtzKGZpbGVTZXRzKTsKLQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBraXRyID0gbGlua3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsga2l0ci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxuayA9IChTdHJpbmcpIGtpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyByZXMgPSBsaW5rcy5nZXRQcm9wZXJ0eShsbmspOwotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBsbmsgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IChidWcgMjUxODEpCisgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIGxpbmtzID0gbG9hZExpbmtzKGZpbGVTZXRzKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGxpbmsgOiBsaW5rcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UgPSBsaW5rcy5nZXRQcm9wZXJ0eShsaW5rKTsKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBGaWxlIHRlc3QgPSBuZXcgRmlsZShsbmspOwotICAgICAgICAgICAgICAgICAgICBpZiAoIVNZTUxJTktfVVRJTFMuaXNTeW1ib2xpY0xpbmsobG5rKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZG9MaW5rKHJlcywgbG5rKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGVzdC5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUocmVzKS5nZXRDYW5vbmljYWxQYXRoKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTWU1MSU5LX1VUSUxTLmRlbGV0ZVN5bWJvbGljTGluayh0ZXN0LCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvTGluayhyZXMsIGxuayk7Ci0gICAgICAgICAgICAgICAgICAgIH0gLy8gZWxzZSBsbmsgZXhpc3RzLCBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJJTyBleGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgbGluayIpOworICAgICAgICAgICAgICAgICAgICBpZiAoRmlsZXMuaXNTeW1ib2xpY0xpbmsoUGF0aHMuZ2V0KGxpbmspKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGxpbmspLmdldENhbm9uaWNhbFBhdGgoKS5lcXVhbHMobmV3IEZpbGUocmVzb3VyY2UpLmdldENhbm9uaWNhbFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgYWxyZWFkeSBhIHN5bWxpbmsgYW5kIHRoZSBzeW1saW5rIHRhcmdldCBpcyB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHRhcmdldCBub3RlZCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLiBTbyB0aGVyZSdzIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHJlY3JlYXRlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coIm5vdCByZWNyZWF0aW5nICIgKyBsaW5rICsgIiBhcyBpdCBwb2ludHMgdG8gdGhlIGNvcnJlY3QgdGFyZ2V0IGFscmVhZHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX0RFQlVHKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXJyTWVzc2FnZSA9ICJGYWlsZWQgdG8gY2hlY2sgaWYgcGF0aCAiICsgbGluayArICIgaXMgYSBzeW1ib2xpYyBsaW5rLCBsaW5raW5nIHRvICIgKyByZXNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZhaWxvbmVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJyTWVzc2FnZSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbG9nIGFuZCBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBsb2coZXJyTWVzc2FnZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIGxpbmsKKyAgICAgICAgICAgICAgICB0aGlzLmRvTGluayhyZXNvdXJjZSwgbGluayk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzZXREZWZhdWx0cygpOwpAQCAtMjQ5LDM4ICsyNDcsMjggQEAKICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiTmFtZSBvZiBmaWxlIHRvIHJlY29yZCBsaW5rcyBpbiByZXF1aXJlZCIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGhhc2h0YWJsZSB0byBncm91cCB0aGVtIGJ5IHBhcmVudCBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICBIYXNodGFibGUgYnlEaXIgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBtYXAgdG8gZ3JvdXAgdGhlbSBieSBwYXJlbnQgZGlyZWN0b3J5OgorICAgICAgICAgICAgTWFwPEZpbGUsIExpc3Q8RmlsZT4+IGJ5RGlyID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgICAgICAvLyBnZXQgYW4gSXRlcmF0b3Igb2YgZmlsZSBvYmplY3RzIHJlcHJlc2VudGluZyBsaW5rcyAoY2Fub25pY2FsKToKLSAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbGl0ciA9IGZpbmRMaW5rcyhmaWxlU2V0cykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBsaXRyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBGaWxlIHRoaXNMaW5rID0gKEZpbGUpIGxpdHIubmV4dCgpOwotICAgICAgICAgICAgICAgIEZpbGUgcGFyZW50ID0gdGhpc0xpbmsuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgICAgIFZlY3RvciB2ID0gKFZlY3RvcikgYnlEaXIuZ2V0KHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB2ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgICAgICAgICAgICBieURpci5wdXQocGFyZW50LCB2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdi5hZGRFbGVtZW50KHRoaXNMaW5rKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmRMaW5rcyhmaWxlU2V0cykuZm9yRWFjaChsaW5rIC0+IGJ5RGlyCisgICAgICAgICAgICAgICAgLmNvbXB1dGVJZkFic2VudChsaW5rLmdldFBhcmVudEZpbGUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkKKyAgICAgICAgICAgICAgICAuYWRkKGxpbmspKTsKKwogICAgICAgICAgICAgLy8gd3JpdGUgYSBQcm9wZXJ0aWVzIGZpbGUgaW4gZWFjaCBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGRpcnMgPSBieURpci5rZXlTZXQoKS5pdGVyYXRvcigpOyBkaXJzLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBGaWxlIGRpciA9IChGaWxlKSBkaXJzLm5leHQoKTsKLSAgICAgICAgICAgICAgICBWZWN0b3IgbGlua3NJbkRpciA9IChWZWN0b3IpIGJ5RGlyLmdldChkaXIpOworICAgICAgICAgICAgYnlEaXIuZm9yRWFjaCgoZGlyLCBsaW5rc0luRGlyKSAtPiB7CiAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBsaW5rc1RvU3RvcmUgPSBuZXcgUHJvcGVydGllcygpOwogCiAgICAgICAgICAgICAgICAgLy8gZmlsbCB1cCBhIFByb3BlcnRpZXMgb2JqZWN0IHdpdGggbGluayBhbmQgcmVzb3VyY2UgbmFtZXM6Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBkbG5rID0gbGlua3NJbkRpci5pdGVyYXRvcigpOyBkbG5rLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBsbmsgPSAoRmlsZSkgZGxuay5uZXh0KCk7CisgICAgICAgICAgICAgICAgZm9yIChGaWxlIGxpbmsgOiBsaW5rc0luRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaW5rc1RvU3RvcmUucHV0KGxuay5nZXROYW1lKCksIGxuay5nZXRDYW5vbmljYWxQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua3NUb1N0b3JlLnB1dChsaW5rLmdldE5hbWUoKSwgbGluay5nZXRDYW5vbmljYWxQYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJDb3VsZG4ndCBnZXQgY2Fub25pY2FsIG5hbWUgb2YgcGFyZW50IGxpbmsiKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3cml0ZVByb3BlcnR5RmlsZShsaW5rc1RvU3RvcmUsIGRpcik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHNldERlZmF1bHRzKCk7CiAgICAgICAgIH0KQEAgLTMzNSwxMCArMzIzLDEwIEBACiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBsaW5rLiBVc2VkIHdoZW4gYWN0aW9uID0gJnF1b3Q7c2luZ2xlJnF1b3Q7LgogICAgICAqCi0gICAgICogQHBhcmFtIGxuayAgICAgVGhlIG5hbWUgZm9yIHRoZSBsaW5rLgorICAgICAqIEBwYXJhbSBsaW5rICAgICBUaGUgbmFtZSBmb3IgdGhlIGxpbmsuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TGluayhTdHJpbmcgbG5rKSB7Ci0gICAgICAgIHRoaXMubGluayA9IGxuazsKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5rKFN0cmluZyBsaW5rKSB7CisgICAgICAgIHRoaXMubGluayA9IGxpbms7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNjcsNjEgKzM1NSw0OSBAQAogICAgICAqIEBwYXJhbSBzZXQgICAgICBUaGUgZmlsZXNldCB0byBhZGQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkRmlsZXNldChGaWxlU2V0IHNldCkgewotICAgICAgICBmaWxlU2V0cy5hZGRFbGVtZW50KHNldCk7CisgICAgICAgIGZpbGVTZXRzLmFkZChzZXQpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIERlbGV0ZSBhIHN5bWxpbmsgKHdpdGhvdXQgZGVsZXRpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UpLgogICAgICAqCi0gICAgICogPHA+VGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHNpbXBseSBpbnZva2VzCi0gICAgICogPGNvZGU+ZGVsZXRlU3ltbGluayhqYXZhLmlvLkZpbGUpPC9jb2RlPi4KKyAgICAgKiA8cD5UaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgc2ltcGx5IGludm9rZXMge0BsaW5rICNkZWxldGVTeW1saW5rKEZpbGUpfTwvcD4KICAgICAgKgotICAgICAqIEBwYXJhbSBwYXRoICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggb2YgdGhlIHN5bWxpbmsgdG8gZGVsZXRlLgorICAgICAqIEBwYXJhbSBwYXRoIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggb2YgdGhlIHN5bWxpbmsgdG8gZGVsZXRlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIGRlbGV0aW9uIGF0dGVtcHQgZmFpbHMKICAgICAgKgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgSWYgY2FsbHMgdG8gPGNvZGU+RmlsZS5yZW5hbWU8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDxjb2RlPkZpbGUuZGVsZXRlPC9jb2RlPiBmYWlsLgotICAgICAqIEBkZXByZWNhdGVkIHVzZQotICAgICAqIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3ltYm9saWNMaW5rVXRpbHMjZGVsZXRlU3ltYm9saWNMaW5rCi0gICAgICogaW5zdGVhZAorICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgRmlsZXMjZGVsZXRlKFBhdGgpfSBpbnN0ZWFkCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlU3ltbGluayhTdHJpbmcgcGF0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU1lNTElOS19VVElMUy5kZWxldGVTeW1ib2xpY0xpbmsobmV3IEZpbGUocGF0aCksIG51bGwpOworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVTeW1saW5rKGZpbmFsIFN0cmluZyBwYXRoKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZGVsZXRlU3ltbGluayhQYXRocy5nZXQocGF0aCkudG9GaWxlKCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIERlbGV0ZSBhIHN5bWxpbmsgKHdpdGhvdXQgZGVsZXRpbmcgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2UpLgogICAgICAqCi0gICAgICogPHA+VGhpcyBpcyBhIHV0aWxpdHkgbWV0aG9kIHRoYXQgcmVtb3ZlcyBhIHVuaXggc3ltbGluayB3aXRob3V0IHJlbW92aW5nCisgICAgICogPHA+VGhpcyBpcyBhIHV0aWxpdHkgbWV0aG9kIHRoYXQgcmVtb3ZlcyBhIHN5bWxpbmsgd2l0aG91dCByZW1vdmluZwogICAgICAqIHRoZSByZXNvdXJjZSB0aGF0IHRoZSBzeW1saW5rIHBvaW50cyB0by4gSWYgaXQgaXMgYWNjaWRlbnRhbGx5IGludm9rZWQKLSAgICAgKiBvbiBhIHJlYWwgZmlsZSwgdGhlIHJlYWwgZmlsZSB3aWxsIG5vdCBiZSBoYXJtZWQuPC9wPgorICAgICAqIG9uIGEgcmVhbCBmaWxlLCB0aGUgcmVhbCBmaWxlIHdpbGwgbm90IGJlIGhhcm1lZCBhbmQgaW5zdGVhZCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgc2lsZW50bHkuPC9wPgogICAgICAqCi0gICAgICogPHA+VGhpcyBtZXRob2Qgd29ya3MgYnkKLSAgICAgKiBnZXR0aW5nIHRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgbGluaywgdXNpbmcgdGhlIGNhbm9uaWNhbCBwYXRoIHRvCi0gICAgICogcmVuYW1lIHRoZSByZXNvdXJjZSAoYnJlYWtpbmcgdGhlIGxpbmspIGFuZCB0aGVuIGRlbGV0aW5nIHRoZSBsaW5rLgotICAgICAqIFRoZSByZXNvdXJjZSBpcyB0aGVuIHJldHVybmVkIHRvIGl0cyBvcmlnaW5hbCBuYW1lIGluc2lkZSBhIGZpbmFsbHkKLSAgICAgKiBibG9jayB0byBlbnN1cmUgdGhhdCB0aGUgcmVzb3VyY2UgaXMgdW5oYXJtZWQgZXZlbiBpbiB0aGUgZXZlbnQgb2YKLSAgICAgKiBhbiBleGNlcHRpb24uPC9wPgorICAgICAqIDxwPlNpbmNlIEFudCAxLjEwLjIgdGhpcyBtZXRob2QgcmVsaWVzIG9uIHRoZSB7QGxpbmsgRmlsZXMjaXNTeW1ib2xpY0xpbmsoUGF0aCl9CisgICAgICogYW5kIHtAbGluayBGaWxlcyNkZWxldGUoUGF0aCl9IHRvIGNoZWNrIGFuZCBkZWxldGUgdGhlIHN5bWxpbmsKKyAgICAgKiA8L3A+CiAgICAgICoKLSAgICAgKiA8cD5TaW5jZSBBbnQgMS44LjAgdGhpcyBtZXRob2Qgd2lsbCB0cnkgdG8gZGVsZXRlIHRoZSBGaWxlIG9iamVjdCBpZgotICAgICAqIGl0IHJlcG9ydHMgaXQgd291bGRuJ3QgZXhpc3QgKGFzIHN5bWxpbmtzIHBvaW50aW5nIG5vd2hlcmUgdXN1YWxseSBkbykuCi0gICAgICogUHJpb3IgdmVyc2lvbiB3b3VsZCB0aHJvdyBhIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpbiB0aGF0IGNhc2UuPC9wPgorICAgICAqIEBwYXJhbSBsaW5rZmlsIEEgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBzeW1saW5rIHRvIGRlbGV0ZS4gQ2Fubm90IGJlIG51bGwuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiB0aGUgYXR0ZW1wdCB0byBkZWxldGUgcnVucyBpbnRvIGV4Y2VwdGlvbgogICAgICAqCi0gICAgICogQHBhcmFtIGxpbmtmaWwgICAgQSA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3Qgb2YgdGhlIHN5bWxpbmsgdG8gZGVsZXRlLgotICAgICAqCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICBJZiBjYWxscyB0byA8Y29kZT5GaWxlLnJlbmFtZTwvY29kZT4sCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkZpbGUuZGVsZXRlPC9jb2RlPiBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5GaWxlLmdldENhbm9uaWNhbFBhdGg8L2NvZGU+Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwuCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlCi0gICAgICogb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TeW1ib2xpY0xpbmtVdGlscyNkZWxldGVTeW1ib2xpY0xpbmsKLSAgICAgKiBpbnN0ZWFkCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBGaWxlcyNkZWxldGUoUGF0aCl9IGluc3RlYWQKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVTeW1saW5rKEZpbGUgbGlua2ZpbCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU1lNTElOS19VVElMUy5kZWxldGVTeW1ib2xpY0xpbmsobGlua2ZpbCwgbnVsbCk7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZVN5bWxpbmsoZmluYWwgRmlsZSBsaW5rZmlsKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFGaWxlcy5pc1N5bWJvbGljTGluayhsaW5rZmlsLnRvUGF0aCgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZVN5bUxpbmsobGlua2ZpbC50b1BhdGgoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00MzQsMTUgKzQxMCwxMSBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCB3cml0ZVByb3BlcnR5RmlsZShQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEZpbGUgZGlyKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZE91dHB1dFN0cmVhbSBib3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGRpciwgbGlua0ZpbGVOYW1lKSkpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIEZpbGVzLm5ld091dHB1dFN0cmVhbShuZXcgRmlsZShkaXIsIGxpbmtGaWxlTmFtZSkudG9QYXRoKCkpKSkgewogICAgICAgICAgICAgcHJvcGVydGllcy5zdG9yZShib3MsICJTeW1saW5rcyBmcm9tICIgKyBkaXIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihpb2UsIGdldExvY2F0aW9uKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGJvcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ2MywzOCArNDM1LDUwIEBACiAgICAgLyoqCiAgICAgICogQ29uZHVjdCB0aGUgYWN0dWFsIGNvbnN0cnVjdGlvbiBvZiBhIGxpbmsuCiAgICAgICoKLSAgICAgKiA8cD5UaGUgbGluayBpcyBjb25zdHJ1Y3RlZCBieSBjYWxsaW5nIDxjb2RlPkV4ZWN1dGUucnVuQ29tbWFuZDwvY29kZT4uPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcyAgIFRoZSBwYXRoIG9mIHRoZSByZXNvdXJjZSB3ZSBhcmUgbGlua2luZyB0by4KLSAgICAgKiBAcGFyYW0gbG5rICAgICAgIFRoZSBuYW1lIG9mIHRoZSBsaW5rIHdlIHdpc2ggdG8gbWFrZS4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgVGhlIHBhdGggb2YgdGhlIHJlc291cmNlIHdlIGFyZSBsaW5raW5nIHRvLgorICAgICAqIEBwYXJhbSBsaW5rIFRoZSBuYW1lIG9mIHRoZSBsaW5rIHdlIHdpc2ggdG8gbWFrZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHdoZW4gdGhpbmdzIGdvIHdyb25nCiAgICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRvTGluayhTdHJpbmcgcmVzLCBTdHJpbmcgbG5rKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBGaWxlIGxpbmtmaWwgPSBuZXcgRmlsZShsbmspOwotICAgICAgICBTdHJpbmcgb3B0aW9ucyA9ICItcyI7Ci0gICAgICAgIGlmIChvdmVyd3JpdGUpIHsKLSAgICAgICAgICAgIG9wdGlvbnMgKz0gImYiOwotICAgICAgICAgICAgaWYgKGxpbmtmaWwuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBTWU1MSU5LX1VUSUxTLmRlbGV0ZVN5bWJvbGljTGluayhsaW5rZmlsLCB0aGlzKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotICAgICAgICAgICAgICAgICAgICBsb2coIlN5bWxpbmsgZGlzYXBwZWFyZWQgYmVmb3JlIGl0IHdhcyBkZWxldGVkOiAiICsgbG5rKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nKCJVbmFibGUgdG8gb3ZlcndyaXRlIHByZWV4aXN0aW5nIGxpbmsgb3IgZmlsZTogIiArIGxuaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvZSwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgcHJpdmF0ZSB2b2lkIGRvTGluayhTdHJpbmcgcmVzb3VyY2UsIFN0cmluZyBsaW5rKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXRoIGxpbmtQYXRoID0gUGF0aHMuZ2V0KGxpbmspOworICAgICAgICBmaW5hbCBQYXRoIHRhcmdldCA9IFBhdGhzLmdldChyZXNvdXJjZSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYWxyZWFkeUV4aXN0cyA9IEZpbGVzLmV4aXN0cyhsaW5rUGF0aCwgTGlua09wdGlvbi5OT0ZPTExPV19MSU5LUyk7CisgICAgICAgIGlmICghYWxyZWFkeUV4aXN0cykgeworICAgICAgICAgICAgLy8gaWYgdGhlIHBhdGggKGF0IHdoaWNoIHRoZSBsaW5rIGlzIGV4cGVjdGVkIHRvIGJlIGNyZWF0ZWQpIGlzbid0IGFscmVhZHkgcHJlc2VudAorICAgICAgICAgICAgLy8gdGhlbiB3ZSBqdXN0IGdvIGFoZWFkIGFuZCBhdHRlbXB0IHRvIHN5bWxpbmsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9nKCJjcmVhdGluZyBzeW1saW5rICIgKyBsaW5rUGF0aCArICIgLT4gIiArIHRhcmdldCwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgICAgIEZpbGVzLmNyZWF0ZVN5bWJvbGljTGluayhsaW5rUGF0aCwgdGFyZ2V0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIHN5bWxpbmsgIiArIGxpbmsgKyAiIHRvIHRhcmdldCAiICsgcmVzb3VyY2UsIGUpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBjcmVhdGUgc3ltbGluayAiICsgbGluayArICIgdG8gdGFyZ2V0ICIgKyByZXNvdXJjZSwgZSwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1tdIHsibG4iLCBvcHRpb25zLCByZXMsIGxua307CisgICAgICAgIC8vIGZpbGUgYWxyZWFkeSBleGlzdHMsIHNlZSBpZiB3ZSBhcmUgYWxsb3dlZCB0byBvdmVyd3JpdGUKKyAgICAgICAgaWYgKCFvdmVyd3JpdGUpIHsKKyAgICAgICAgICAgIGxvZygiU2tpcHBpbmcgc3ltbGluayBjcmVhdGlvbiwgc2luY2UgZmlsZSBhdCAiICsgbGluayArICIgYWxyZWFkeSBleGlzdHMgYW5kIG92ZXJ3cml0ZSBpcyBzZXQgdG8gZmFsc2UiLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBoYXZlIGJlZW4gYXNrZWQgdG8gb3ZlcndyaXRlLCBzbyB3ZSBub3cgZG8gdGhlIG5lY2Vzc2FyeSBzdGVwcworCisgICAgICAgIC8vIGluaXRpYXRlIGEgZGVsZXRpb24gb2YgdGhlIGV4aXN0aW5nIGZpbGUKKyAgICAgICAgZmluYWwgYm9vbGVhbiBleGlzdGluZ0ZpbGVEZWxldGVkID0gbGlua1BhdGgudG9GaWxlKCkuZGVsZXRlKCk7CisgICAgICAgIGlmICghZXhpc3RpbmdGaWxlRGVsZXRlZCkgeworICAgICAgICAgICAgaGFuZGxlRXJyb3IoIkRlbGV0aW9uIG9mIGZpbGUgYXQgIiArIGxpbmsgKyAiIGZhaWxlZCwgd2hpbGUgdHJ5aW5nIHRvIG92ZXJ3cml0ZSBpdCB3aXRoIGEgc3ltbGluayIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFeGVjdXRlLnJ1bkNvbW1hbmQodGhpcywgY21kKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZmFpbGVkVG9FeGVjdXRlKSB7CisgICAgICAgICAgICBsb2coImNyZWF0aW5nIHN5bWxpbmsgIiArIGxpbmtQYXRoICsgIiAtPiAiICsgdGFyZ2V0ICsgIiBhZnRlciByZW1vdmluZyBvcmlnaW5hbCIsCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgRmlsZXMuY3JlYXRlU3ltYm9saWNMaW5rKGxpbmtQYXRoLCB0YXJnZXQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBpZiAoZmFpbG9uZXJyb3IpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBmYWlsZWRUb0V4ZWN1dGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vbG9nIGF0IHRoZSBpbmZvIGxldmVsLCBhbmQga2VlcCBnb2luZy4KLSAgICAgICAgICAgICAgICBsb2coZmFpbGVkVG9FeGVjdXRlLmdldE1lc3NhZ2UoKSwgZmFpbGVkVG9FeGVjdXRlLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgc3ltbGluayAiICsgbGluayArICIgdG8gdGFyZ2V0ICIgKyByZXNvdXJjZSwgZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2coIlVuYWJsZSB0byBjcmVhdGUgc3ltbGluayAiICsgbGluayArICIgdG8gdGFyZ2V0ICIgKyByZXNvdXJjZSwgZSwgUHJvamVjdC5NU0dfSU5GTyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwNSwzMyArNDg5LDMzIEBACiAgICAgICogJnF1b3Q7cmVjb3JkJnF1b3Q7LiBUaGlzIG1lYW5zIHRoYXQgZmlsZXNldHMgYXJlIGludGVycHJldGVkCiAgICAgICogYXMgdGhlIGRpcmVjdG9yaWVzIGluIHdoaWNoIGxpbmtzIG1heSBiZSBmb3VuZC48L3A+CiAgICAgICoKLSAgICAgKiBAcGFyYW0gdiAgIFRoZSBmaWxlc2V0cyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCi0gICAgICogQHJldHVybiBBIEhhc2hTZXQgb2YgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0cyBjb250YWluaW5nIHRoZQotICAgICAqICAgICAgICAgbGlua3MgKHdpdGggY2Fub25pY2FsIHBhcmVudCBkaXJlY3RvcmllcykuCisgICAgICogQHBhcmFtIGZpbGVTZXRzIFRoZSBmaWxlc2V0cyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgICAgICogQHJldHVybiBBIFNldCBvZiA8Y29kZT5GaWxlPC9jb2RlPiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlCisgICAgICogbGlua3MgKHdpdGggY2Fub25pY2FsIHBhcmVudCBkaXJlY3RvcmllcykuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNoU2V0IGZpbmRMaW5rcyhWZWN0b3IgdikgewotICAgICAgICBIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gdi5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIHYuZ2V0KGkpOworICAgIHByaXZhdGUgU2V0PEZpbGU+IGZpbmRMaW5rcyhMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzKSB7CisgICAgICAgIGZpbmFsIFNldDxGaWxlPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoRmlsZVNldCBmcyA6IGZpbGVTZXRzKSB7CiAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZnMuZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgU3RyaW5nW11bXSBmbmQgPSBuZXcgU3RyaW5nW11bXQotICAgICAgICAgICAgICAgIHtkcy5nZXRJbmNsdWRlZEZpbGVzKCksIGRzLmdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKX07CisKICAgICAgICAgICAgIEZpbGUgZGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGZuZC5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgZm5kW2pdLmxlbmd0aDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIGZuZFtqXVtrXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHBmID0gZi5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNZTUxJTktfVVRJTFMuaXNTeW1ib2xpY0xpbmsocGYsIG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChuZXcgRmlsZShwZi5nZXRDYW5vbmljYWxGaWxlKCksIG5hbWUpKTsKKworICAgICAgICAgICAgU3RyZWFtLm9mKGRzLmdldEluY2x1ZGVkRmlsZXMoKSwgZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKQorICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChTdHJlYW06Om9mKS5mb3JFYWNoKHBhdGggLT4geworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGYgPSBuZXcgRmlsZShkaXIsIHBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgcGYgPSBmLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGYuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHVzZSB0aGUgY2Fub25pY2FsIHBhdGggb2YgdGhlIHBhcmVudCBkaXIgaW4gd2hpY2ggdGhlIChwb3RlbnRpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayByZXNpZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBwYXJlbnREaXJDYW5vbmljYWxpemVkRmlsZSA9IG5ldyBGaWxlKHBmLmdldENhbm9uaWNhbFBhdGgoKSwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZpbGVzLmlzU3ltYm9saWNMaW5rKHBhcmVudERpckNhbm9uaWNhbGl6ZWRGaWxlLnRvUGF0aCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHBhcmVudERpckNhbm9uaWNhbGl6ZWRGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoIklPRXhjZXB0aW9uOiAiICsgcGF0aCArICIgb21pdHRlZCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiSU9FeGNlcHRpb246ICIgKyBmbmRbal1ba10gKyAiIG9taXR0ZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtNTQ0LDU1ICs1MjgsNzIgQEAKICAgICAgKiBuYW1lcyBvZiB0aGUgcHJvcGVydHkgZmlsZXMgd2l0aCB0aGUgbGluayBpbmZvcm1hdGlvbiBhbmQgdGhlCiAgICAgICogc3ViZGlyZWN0b3JpZXMgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlbS48L3A+CiAgICAgICoKLSAgICAgKiBAcGFyYW0gdiAgICBUaGUgPGNvZGU+RmlsZVNldDwvY29kZT5zIGZvciB0aGlzIHRhc2suCisgICAgICogQHBhcmFtIGZpbGVTZXRzICAgIFRoZSA8Y29kZT5GaWxlU2V0PC9jb2RlPnMgZm9yIHRoaXMgdGFzay4KICAgICAgKiBAcmV0dXJuICAgICAgICAgICAgVGhlIGxpbmtzIHRvIGJlIG1hZGUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRMaW5rcyhWZWN0b3IgdikgeworICAgIHByaXZhdGUgUHJvcGVydGllcyBsb2FkTGlua3MoTGlzdDxGaWxlU2V0PiBmaWxlU2V0cykgewogICAgICAgICBQcm9wZXJ0aWVzIGZpbmFsTGlzdCA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgc3VwcGxpZWQgZmlsZSBzZXRzOgotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHYuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgRmlsZVNldCBmcyA9IChGaWxlU2V0KSB2LmVsZW1lbnRBdChpKTsKKyAgICAgICAgZm9yIChGaWxlU2V0IGZzIDogZmlsZVNldHMpIHsKICAgICAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICAgICAgZnMuc2V0dXBEaXJlY3RvcnlTY2FubmVyKGRzLCBnZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgZHMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOwogICAgICAgICAgICAgZHMuc2NhbigpOwotICAgICAgICAgICAgU3RyaW5nW10gaW5jcyA9IGRzLmdldEluY2x1ZGVkRmlsZXMoKTsKICAgICAgICAgICAgIEZpbGUgZGlyID0gZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7CiAKICAgICAgICAgICAgIC8vIGxvYWQgaW5jbHVkZWQgZmlsZXMgYXMgcHJvcGVydGllcyBmaWxlczoKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgaW5jcy5sZW5ndGg7IGorKykgewotICAgICAgICAgICAgICAgIEZpbGUgaW5jID0gbmV3IEZpbGUoZGlyLCBpbmNzW2pdKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkcy5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBGaWxlIGluYyA9IG5ldyBGaWxlKGRpciwgbmFtZSk7CiAgICAgICAgICAgICAgICAgRmlsZSBwZiA9IGluYy5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgICAgICAgICAgUHJvcGVydGllcyBsbmtzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGluYykpOwotICAgICAgICAgICAgICAgICAgICBsbmtzLmxvYWQoaXMpOworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgbGlua3MgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgRmlsZXMubmV3SW5wdXRTdHJlYW0oaW5jLnRvUGF0aCgpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlua3MubG9hZChpcyk7CiAgICAgICAgICAgICAgICAgICAgIHBmID0gcGYuZ2V0Q2Fub25pY2FsRmlsZSgpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBmbmZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJVbmFibGUgdG8gZmluZCAiICsgaW5jc1tqXSArICI7IHNraXBwaW5nIGl0LiIpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiVW5hYmxlIHRvIGZpbmQgIiArIG5hbWUgKyAiOyBza2lwcGluZyBpdC4iKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKCJVbmFibGUgdG8gb3BlbiAiICsgaW5jc1tqXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgb3IgaXRzIHBhcmVudCBkaXI7IHNraXBwaW5nIGl0LiIpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcigiVW5hYmxlIHRvIG9wZW4gIiArIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBvciBpdHMgcGFyZW50IGRpcjsgc2tpcHBpbmcgaXQuIik7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpcyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxua3MubGlzdChuZXcgUHJpbnRTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfSU5GTykpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsaW5rcy5zdG9yZShuZXcgUHJpbnRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9nT3V0cHV0U3RyZWFtKHRoaXMsIFByb2plY3QuTVNHX0lORk8pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0aW5nIHByb3BlcnRpZXMiKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBsb2coImZhaWxlZCB0byBsb2cgdW5zaG9ydGVuZWQgcHJvcGVydGllcyIpOworICAgICAgICAgICAgICAgICAgICBsaW5rcy5saXN0KG5ldyBQcmludFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2dPdXRwdXRTdHJlYW0odGhpcywgUHJvamVjdC5NU0dfSU5GTykpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIHRvIG91ciBtYXN0ZXIgbGlzdCBvZiBsaW5rcwogICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBhbGwgbGlua3MgYXJlIGRlZmluZWQgaW4KICAgICAgICAgICAgICAgICAvLyB0ZXJtcyBvZiBhYnNvbHV0ZSBwYXRocywgb3IgcGF0aHMgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICAgICAgICAgLy8gd29ya2luZyBkaXJlY3Rvcnk6Ci0gICAgICAgICAgICAgICAgZm9yIChJdGVyYXRvciBraXRyID0gbG5rcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBraXRyLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGtpdHIubmV4dCgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGxpbmtzLnN0cmluZ1Byb3BlcnR5TmFtZXMoKSkgewogICAgICAgICAgICAgICAgICAgICBmaW5hbExpc3QucHV0KG5ldyBGaWxlKHBmLCBrZXkpLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgbG5rcy5nZXRQcm9wZXJ0eShrZXkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzLmdldFByb3BlcnR5KGtleSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmluYWxMaXN0OwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlU3ltTGluayhmaW5hbCBQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGU6IFdlIGludGVudGlvbmFsbHkgdXNlIGphdmEuaW8uRmlsZSNkZWxldGUoKSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIGphdmEubmlvLmZpbGUuRmlsZXMjZGVsZXRlKFBhdGgpIHNpbmNlIGl0IHR1cm5zIG91dCB0aGF0IHRoZSBsYXR0ZXIgZG9lc24ndAorICAgICAgICAvLyB1cGRhdGUvY2xlYXIgdGhlICJjYW5vbmljYWwgZmlsZSBwYXRocyBjYWNoZSIgbWFpbnRhaW5lZCBieSB0aGUgSlJFIEZpbGVTeXN0ZW1Qcm92aWRlci4KKyAgICAgICAgLy8gTm90IGNsZWFyaW5nL3VwZGF0aW5nIHRoYXQgY2FjaGUgcmVzdWx0cyBpbiB0aGlzIGRlbGV0ZWQgKGFuZCBsYXRlciByZWNyZWF0ZWQpIHN5bWxpbmsKKyAgICAgICAgLy8gdG8gcG9pbnQgdG8gYSB3cm9uZy9vdXRkYXRlZCB0YXJnZXQgZm9yIGEgZmV3IHNlY29uZHMgKDMwIHNlY29uZHMgaXMgdGhlIHRpbWUgdGhlIEpSRQorICAgICAgICAvLyBtYWludGFpbnMgdGhlIGNhY2hlIGVudHJpZXMgZm9yKS4gQWxsIHRoaXMgaXMgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBKUkUgYW5kCisgICAgICAgIC8vIGlzIGEgSlJFIGJ1ZyBodHRwczovL21haWwub3Blbmpkay5qYXZhLm5ldC9waXBlcm1haWwvY29yZS1saWJzLWRldi8yMDE3LURlY2VtYmVyLzA1MDU0MC5odG1sLAorICAgICAgICAvLyBidXQgZ2l2ZW4gdGhhdCBpdCBhZmZlY3RzIG91ciB0ZXN0cyAoU3ltbGlua1Rlc3QjdGVzdFJlY3JlYXRlIGNvbnNpc3RlbnRseSBmYWlscworICAgICAgICAvLyBvbiBNYWNPUy9Vbml4KSBhcyB3ZWxsIGFzIHRoZSBTeW1saW5rIHRhc2ssIGl0IG1ha2VzIHNlbnNlIHRvIHVzZSB0aGlzIEFQSSBpbnN0ZWFkIG9mCisgICAgICAgIC8vIHRoZSBGaWxlcyNkZWxldGUoUGF0aCkgQVBJCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVsZXRlZCA9IHBhdGgudG9GaWxlKCkuZGVsZXRlKCk7CisgICAgICAgIGlmICghZGVsZXRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3VsZCBub3QgZGVsZXRlIHN5bWxpbmsgYXQgIiArIHBhdGgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1MuamF2YQppbmRleCBjZTI0MGUzLi5jMTc0YjM0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1MuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3OSw5ICsxNzksOCBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIGNvbW1hbmQgY2Fubm90IGV4ZWN1dGUuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwogICAgICAgICBDb21tYW5kbGluZSBjb21tYW5kTGluZSA9IGJ1aWxkQ21kTGluZSgpOwotICAgICAgICByZXN1bHQgPSBydW4oY29tbWFuZExpbmUpOworICAgICAgICBpbnQgcmVzdWx0ID0gcnVuKGNvbW1hbmRMaW5lKTsKICAgICAgICAgaWYgKEV4ZWN1dGUuaXNGYWlsdXJlKHJlc3VsdCkgJiYgZ2V0RmFpbE9uRXJyb3IoKSkgewogICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJGYWlsZWQgZXhlY3V0aW5nOiAiICsgZm9ybWF0Q29tbWFuZExpbmUoY29tbWFuZExpbmUpCiAgICAgICAgICAgICAgICAgICAgICArICIgV2l0aCBhIHJldHVybiBjb2RlIG9mICIgKyByZXN1bHQ7CkBAIC00MTgsNyArNDE3LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsKCkgewogICAgICAgICBTdHJpbmcgc2hvcnRMYWJlbCA9ICIiOwotICAgICAgICBpZiAobGFiZWwgIT0gbnVsbCAmJiBsYWJlbC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGxhYmVsICE9IG51bGwgJiYgIWxhYmVsLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHNob3J0TGFiZWwgPSBGTEFHX0xBQkVMICsgZ2V0U2hvcnRMYWJlbCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzaG9ydExhYmVsOwpAQCAtNDY0LDcgKzQ2Myw3IEBACiAgICAgICAgICAgICAvLyBVc2UgZ2V0U2hvcnRMYWJlbCgpIHNvIGxhYmVscyBsb25nZXIgdGhlbiAzMCBjaGFyIGFyZSB0cnVuY2F0ZWQKICAgICAgICAgICAgIC8vIGFuZCB0aGUgdXNlciBpcyB3YXJuZWQKICAgICAgICAgICAgIFN0cmluZyBzaG9ydExhYmVsID0gZ2V0U2hvcnRMYWJlbCgpOwotICAgICAgICAgICAgaWYgKHNob3J0TGFiZWwgIT0gbnVsbCAmJiAhc2hvcnRMYWJlbC5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBpZiAoc2hvcnRMYWJlbCAhPSBudWxsICYmICFzaG9ydExhYmVsLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHZlcnNpb25EYXRlTGFiZWwgPSBGTEFHX1ZFUlNJT05fTEFCRUwgKyBzaG9ydExhYmVsOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NDAsNyArNjM5LDcgQEAKICAgICAgKiBAcmV0dXJuICAgIFRydWUgaWYgdGhlIEZhaWxPbkVycm9yIGZsYWcgaGFzIGJlZW4gc2V0IG9yIGlmICd3cml0YWJsZWZpbGVzPXNraXAnLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBnZXRGYWlsT25FcnJvcigpIHsKLSAgICAgICAgcmV0dXJuIGdldFdyaXRhYmxlRmlsZXMoKS5lcXVhbHMoV1JJVEFCTEVfU0tJUCkgPyBmYWxzZSA6IGZhaWxPbkVycm9yOworICAgICAgICByZXR1cm4gIWdldFdyaXRhYmxlRmlsZXMoKS5lcXVhbHMoV1JJVEFCTEVfU0tJUCkgJiYgZmFpbE9uRXJyb3I7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0FERC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQURELmphdmEKaW5kZXggMmUwNGUyMC4uMDA1YTEwMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQURELmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQURELmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS0lOLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS0lOLmphdmEKaW5kZXggZjk1MjFhYS4uNWViMDEzMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ0hFQ0tJTi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLSU4uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLT1VULmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDSEVDS09VVC5qYXZhCmluZGV4IDRlNTZlMGIuLmVjNDU1YzYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NIRUNLT1VULmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ0hFQ0tPVVQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NQLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDUC5qYXZhCmluZGV4IDdkN2VkYzIuLmEyYjllYWMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NQLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1AuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NSRUFURS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1JFQVRFLmphdmEKaW5kZXggMjZjM2M4ZC4uZDQ0ZGRiYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1JFQVRFLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTQ1JFQVRFLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NvbnN0YW50cy5qYXZhCmluZGV4IDllNWVjNjAuLjFlZmI0YzcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NvbnN0YW50cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0NvbnN0YW50cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTR0VULmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NHRVQuamF2YQppbmRleCBhZmVjZjk1Li43NjNhNzgzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NHRVQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NHRVQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0hJU1RPUlkuamF2YQppbmRleCA0ZmRjOTVkLi5kMzJmNGNmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NISVNUT1JZLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTSElTVE9SWS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcxLDE2ICsxNzEsMjEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShCcmllZkNvZGVkaWZmTm9maWxlIGF0dHIpIHsKICAgICAgICAgU3RyaW5nIG9wdGlvbiA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKG9wdGlvbi5lcXVhbHMoU1RZTEVfQlJJRUYpKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFN0eWxlKEZMQUdfQlJJRUYpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoU1RZTEVfQ09ERURJRkYpKSB7Ci0gICAgICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFN0eWxlKEZMQUdfQ09ERURJRkYpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoU1RZTEVfREVGQVVMVCkpIHsKLSAgICAgICAgICAgIHN1cGVyLnNldEludGVybmFsU3R5bGUoIiIpOwotICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoU1RZTEVfTk9GSUxFKSkgewotICAgICAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxTdHlsZShGTEFHX05PX0ZJTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTdHlsZSAiICsgYXR0ciArICIgdW5rbm93bi4iLCBnZXRMb2NhdGlvbigpKTsKKyAgICAgICAgc3dpdGNoIChvcHRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfQlJJRUY6CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxTdHlsZShGTEFHX0JSSUVGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfQ09ERURJRkY6CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0SW50ZXJuYWxTdHlsZShGTEFHX0NPREVESUZGKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfREVGQVVMVDoKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRJbnRlcm5hbFN0eWxlKCIiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RZTEVfTk9GSUxFOgorICAgICAgICAgICAgICAgIHN1cGVyLnNldEludGVybmFsU3R5bGUoRkxBR19OT19GSUxFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTdHlsZSAiICsgYXR0ciArICIgdW5rbm93bi4iLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTTEFCRUwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU0xBQkVMLmphdmEKaW5kZXggNjI5MGYyZS4uMGJiNzk4ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTTEFCRUwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NMQUJFTC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0TGFiZWwoKTsKLSAgICAgICAgaWYgKGxhYmVsLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKGxhYmVsLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJsYWJlbCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIjsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2csIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC93aW5kb3dzL0F0dHJpYi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvd2luZG93cy9BdHRyaWIuamF2YQppbmRleCA1YzBiOTZhLi41MGEyZmJiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC93aW5kb3dzL0F0dHJpYi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3dpbmRvd3MvQXR0cmliLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC05Myw2ICs5Myw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgdGhlIGF0dHJpYnV0ZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tDb25maWd1cmF0aW9uKCkgewogICAgICAgICBpZiAoIWhhdmVBdHRyKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiTWlzc2luZyBhdHRyaWJ1dGUgcGFyYW1ldGVyIiwKQEAgLTEwNyw2ICsxMDgsNyBAQAogICAgICAqIEBwYXJhbSBlIGlnbm9yZWQKICAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RXhlY3V0YWJsZShTdHJpbmcgZSkgewogICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZ2V0VGFza1R5cGUoKQogICAgICAgICAgICAgKyAiIGRvZXNuXCd0IHN1cHBvcnQgdGhlIGV4ZWN1dGFibGUgYXR0cmlidXRlIiwgZ2V0TG9jYXRpb24oKSk7CkBAIC0xMjksNiArMTMxLDcgQEAKICAgICAgKiBAcGFyYW0gYiBpZ25vcmVkCiAgICAgICogQGFudC5hdHRyaWJ1dGUgaWdub3JlPSJ0cnVlIgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEFkZHNvdXJjZWZpbGUoYm9vbGVhbiBiKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgYWRkc291cmNlZmlsZSBhdHRyaWJ1dGUiLCBnZXRMb2NhdGlvbigpKTsKQEAgLTE0MCw2ICsxNDMsNyBAQAogICAgICAqIEBwYXJhbSBza2lwIGlnbm9yZWQKICAgICAgKiBAYW50LmF0dHJpYnV0ZSBpZ25vcmU9InRydWUiCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0U2tpcEVtcHR5RmlsZXNldHMoYm9vbGVhbiBza2lwKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpICsgIiBkb2VzblwndCBzdXBwb3J0IHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJza2lwZW1wdHlmaWxlc2V0IGF0dHJpYnV0ZSIsCkBAIC0xNTIsNiArMTU2LDcgQEAKICAgICAgKiBAcGFyYW0gcGFyYWxsZWwgaWdub3JlZAogICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbGxlbChib29sZWFuIHBhcmFsbGVsKSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgcGFyYWxsZWwgYXR0cmlidXRlIiwKQEAgLTE2NCw2ICsxNjksNyBAQAogICAgICAqIEBwYXJhbSBtYXggaWdub3JlZAogICAgICAqIEBhbnQuYXR0cmlidXRlIGlnbm9yZT0idHJ1ZSIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRNYXhQYXJhbGxlbChpbnQgbWF4KSB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihnZXRUYXNrVHlwZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lc25cJ3Qgc3VwcG9ydCB0aGUgbWF4cGFyYWxsZWwgYXR0cmlidXRlIiwKQEAgLTE3NSwxMyArMTgxLDE0IEBACiAgICAgICogRGVmYXVsdCBpcyB0byBhbGxvdyB3aW5kb3dzCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBvcyBpcyB2YWxpZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkT3MoKSB7CiAgICAgICAgIHJldHVybiBnZXRPcygpID09IG51bGwgJiYgZ2V0T3NGYW1pbHkoKSA9PSBudWxsCiAgICAgICAgICAgICA/IE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9XSU5ET1dTKSA6IHN1cGVyLmlzVmFsaWRPcygpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTaWduU3RyaW5nKGJvb2xlYW4gYXR0cikgewotICAgICAgICByZXR1cm4gKGF0dHIgPyBTRVQgOiBVTlNFVCk7CisgICAgICAgIHJldHVybiBhdHRyID8gU0VUIDogVU5TRVQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFkZEFyZyhib29sZWFuIHNpZ24sIFN0cmluZyBhdHRyaWJ1dGUpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3h6L1VueHouamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3h6L1VueHouamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTBmNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwveHovVW54ei5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwueHo7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5VbnBhY2s7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouWFpJbnB1dFN0cmVhbTsKKworLyoqCisgKiBFeHBhbmRzIGEgZmlsZSB0aGF0IGhhcyBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgWFoKKyAqIGFsZ29yaXRobS4gTm9ybWFsbHkgdXNlZCB0byBjb21wcmVzcyBub24tY29tcHJlc3NlZCBhcmNoaXZlcyBzdWNoCisgKiBhcyBUQVIgZmlsZXMuCisgKgorICogQHNpbmNlIEFudCAxLjEwLjEKKyAqCisgKiBAYW50LnRhc2sgY2F0ZWdvcnk9InBhY2thZ2luZyIKKyAqLworCitwdWJsaWMgY2xhc3MgVW54eiBleHRlbmRzIFVucGFjayB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gOCAqIDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gIi54eiI7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlICIueHoiCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gREVGQVVMVF9FWFRFTlNJT047CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50IHRoZSBndW56aXBwaW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGV4dHJhY3QoKSB7CisgICAgICAgIGlmIChzcmNSZXNvdXJjZS5nZXRMYXN0TW9kaWZpZWQoKSA+IGRlc3QubGFzdE1vZGlmaWVkKCkpIHsKKyAgICAgICAgICAgIGxvZygiRXhwYW5kaW5nICIgKyBzcmNSZXNvdXJjZS5nZXROYW1lKCkgKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGVzdC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgICAgIHRyeSAoWFpJbnB1dFN0cmVhbSB6SW4gPQorICAgICAgICAgICAgICAgIG5ldyBYWklucHV0U3RyZWFtKHNyY1Jlc291cmNlLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGRlc3QudG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHpJbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoY291bnQgIT0gLTEpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJQcm9ibGVtIGV4cGFuZGluZyB4eiAiICsgaW9lLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRhc2sgY2FuIGRlYWwgd2l0aCBub24tZmlsZSByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgdHJ1ZSBvbmx5LjwvcD4KKyAgICAgKiBAcmV0dXJuIHRydWUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c05vbkZpbGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3h6L1h6LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC94ei9Yei5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZDMzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC94ei9Yei5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwueHo7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5QYWNrOworaW1wb3J0IG9yZy50dWthYW5pLnh6LkxaTUEyT3B0aW9uczsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5YWk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBDb21wcmVzc2VzIGEgZmlsZSB3aXRoIHRoZSBYWiBhbGdvcml0aG0uIE5vcm1hbGx5IHVzZWQgdG8gY29tcHJlc3MKKyAqIG5vbi1jb21wcmVzc2VkIGFyY2hpdmVzIHN1Y2ggYXMgVEFSIGZpbGVzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xMC4xCisgKgorICogQGFudC50YXNrIGNhdGVnb3J5PSJwYWNrYWdpbmciCisgKi8KKworcHVibGljIGNsYXNzIFh6IGV4dGVuZHMgUGFjayB7CisgICAgLyoqCisgICAgICogQ29tcHJlc3MgdGhlIHppcEZpbGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcGFjaygpIHsKKyAgICAgICAgdHJ5IChYWk91dHB1dFN0cmVhbSB6T3V0ID0gbmV3IFhaT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgRmlsZXMubmV3T3V0cHV0U3RyZWFtKHppcEZpbGUudG9QYXRoKCkpLCBuZXcgTFpNQTJPcHRpb25zKCkpKSB7CisgICAgICAgICAgICB6aXBSZXNvdXJjZShnZXRTcmNSZXNvdXJjZSgpLCB6T3V0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gIlByb2JsZW0gY3JlYXRpbmcgeHogIiArIGlvZS5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnLCBpb2UsIGdldExvY2F0aW9uKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGlzIHRhc2sgY2FuIGRlYWwgd2l0aCBub24tZmlsZSByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIHRydWUgb25seS48L3A+CisgICAgICogQHJldHVybiB0cnVlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNOb25GaWxlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0RlZmF1bHRSbWljQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9EZWZhdWx0Um1pY0FkYXB0ZXIuamF2YQppbmRleCA0MjA1OTdhLi45OTk2MTg3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0RlZmF1bHRSbWljQWRhcHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvRGVmYXVsdFJtaWNBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC00Miw4ICs0Myw2IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZhdWx0Um1pY0FkYXB0ZXIgaW1wbGVtZW50cyBSbWljQWRhcHRlciB7CiAKLSAgICBwcml2YXRlIFJtaWMgYXR0cmlidXRlczsKLSAgICBwcml2YXRlIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORCA9IG5ldyBSYW5kb20oKTsKICAgICAvKiogc3VmZml4IGRlbm90aW5nIGEgc3R1YiBmaWxlOiB7QHZhbHVlfSAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJNSV9TVFVCX1NVRkZJWCA9ICJfU3R1YiI7CkBAIC03MSwxNiArNzAsMTQgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVCX09QVElPTl9DT01QQVQgPSAiY29tcGF0IjsKIAotICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgRGVmYXVsdFJtaWNBZGFwdGVyKCkgewotICAgIH0KKyAgICBwcml2YXRlIFJtaWMgYXR0cmlidXRlczsKKyAgICBwcml2YXRlIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjsKIAogICAgIC8qKgogICAgICAqIFNldHMgUm1pYyBhdHRyaWJ1dGVzCiAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIHJtaWMgYXR0cmlidXRlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJtaWMoZmluYWwgUm1pYyBhdHRyaWJ1dGVzKSB7CiAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICAgICAgIG1hcHBlciA9IG5ldyBSbWljRmlsZU5hbWVNYXBwZXIoKTsKQEAgLTEzNSw2ICsxMzIsNyBAQAogICAgICAqIDwvdWw+CiAgICAgICogQHJldHVybiBhIDxjb2RlPkZpbGVOYW1lTWFwcGVyPC9jb2RlPgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlTmFtZU1hcHBlciBnZXRNYXBwZXIoKSB7CiAgICAgICAgIHJldHVybiBtYXBwZXI7CiAgICAgfQpAQCAtMTQzLDYgKzE0MSw3IEBACiAgICAgICogR2V0cyB0aGUgQ0xBU1NQQVRIIHRoaXMgcm1pYyBwcm9jZXNzIHdpbGwgdXNlLgogICAgICAqIEByZXR1cm4gdGhlIGNsYXNzcGF0aAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQYXRoIGdldENsYXNzcGF0aCgpIHsKICAgICAgICAgcmV0dXJuIGdldENvbXBpbGVDbGFzc3BhdGgoKTsKICAgICB9CkBAIC0xODIsNyArMTgxLDcgQEAKICAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgZmFsc2UgaWYgcnVubmluZyBvbiBKYXZhIDExCiAgICAgICogb253YXJkcyBhbmQgdHJ1ZSBvdGhlcndpc2UuPC9wPgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaWlvcCBhbmQgaWRsIHN3aXRjaGVzIGFyZSBzdXBwb3J0ZWQKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4zCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYXJlSWlvcEFuZElkbFN1cHBvcnRlZCgpIHsKICAgICAgICAgcmV0dXJuICFKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjExIik7CkBAIC0zMjksNyArMzI4LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gZmlsdGVySnZtQ29tcGlsZXJBcmdzKFN0cmluZ1tdIGNvbXBpbGVyQXJncykgewogICAgICAgICBpbnQgbGVuID0gY29tcGlsZXJBcmdzLmxlbmd0aDsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4obGVuKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4obGVuKTsKICAgICAgICAgZm9yIChTdHJpbmcgYXJnIDogY29tcGlsZXJBcmdzKSB7CiAgICAgICAgICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoIi1KIikpIHsKICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLmxvZygiRHJvcHBpbmcgIiArIGFyZyArICIgZnJvbSBjb21waWxlciBhcmd1bWVudHMiKTsKQEAgLTMzNyw4ICszMzYsNyBAQAogICAgICAgICAgICAgICAgIGFyZ3MuYWRkKGFyZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50IGNvdW50ID0gYXJncy5zaXplKCk7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nW10pIGFyZ3MudG9BcnJheShuZXcgU3RyaW5nW2NvdW50XSk7CisgICAgICAgIHJldHVybiBhcmdzLnRvQXJyYXkobmV3IFN0cmluZ1thcmdzLnNpemUoKV0pOwogICAgIH0KIAogCkBAIC0zNDgsMjYgKzM0NiwxNiBAQAogICAgICAqIEBwYXJhbSBjbWQgdGhlIGNvbW1hbmRsaW5lIGFyZ3MKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBsb2dBbmRBZGRGaWxlc1RvQ29tcGlsZShDb21tYW5kbGluZSBjbWQpIHsKLSAgICAgICAgVmVjdG9yIGNvbXBpbGVMaXN0ID0gYXR0cmlidXRlcy5nZXRDb21waWxlTGlzdCgpOworICAgICAgICBWZWN0b3I8U3RyaW5nPiBjb21waWxlTGlzdCA9IGF0dHJpYnV0ZXMuZ2V0Q29tcGlsZUxpc3QoKTsKIAogICAgICAgICBhdHRyaWJ1dGVzLmxvZygiQ29tcGlsYXRpb24gIiArIGNtZC5kZXNjcmliZUFyZ3VtZW50cygpLAogICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKIAotICAgICAgICBTdHJpbmdCdWZmZXIgbmljZVNvdXJjZUxpc3QgPSBuZXcgU3RyaW5nQnVmZmVyKCJGaWxlIik7Ci0gICAgICAgIGludCBjTGlzdFNpemUgPSBjb21waWxlTGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjTGlzdFNpemUgIT0gMSkgewotICAgICAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCJzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbmljZVNvdXJjZUxpc3QuYXBwZW5kKCIgdG8gYmUgY29tcGlsZWQ6Iik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjTGlzdFNpemU7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGFyZyA9IChTdHJpbmcpIGNvbXBpbGVMaXN0LmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZyk7Ci0gICAgICAgICAgICBuaWNlU291cmNlTGlzdC5hcHBlbmQoIiAgICAiKTsKLSAgICAgICAgICAgIG5pY2VTb3VyY2VMaXN0LmFwcGVuZChhcmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXR0cmlidXRlcy5sb2cobmljZVNvdXJjZUxpc3QudG9TdHJpbmcoKSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIFN0cmluZyBuaWNlU291cmNlTGlzdCA9IChjb21waWxlTGlzdC5zaXplKCkgPT0gMSA/ICJGaWxlIiA6ICJGaWxlcyIpICsKKyAgICAgICAgICAgICAgICAiIHRvIGJlIGNvbXBpbGVkOiIgKworICAgICAgICAgICAgICAgIGNvbXBpbGVMaXN0LnN0cmVhbSgpLnBlZWsoYXJnIC0+IGNtZC5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZykpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiAgICAiKSk7CisgICAgICAgIGF0dHJpYnV0ZXMubG9nKG5pY2VTb3VyY2VMaXN0LCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QXJndW1lbnRzKENvbW1hbmRsaW5lIGNtZCkgewpAQCAtMzk3LDIwICszODUsMjAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIFJtaWNGaWxlTmFtZU1hcHBlciBpbXBsZW1lbnRzIEZpbGVOYW1lTWFwcGVyIHsKIAotICAgICAgICBSbWljRmlsZU5hbWVNYXBwZXIoKSB7Ci0gICAgICAgIH0KLQogICAgICAgICAvKioKICAgICAgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgcykgewogICAgICAgICB9CiAgICAgICAgIC8qKgogICAgICAgICAgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgcykgewogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgbmFtZSkgewogICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbAogICAgICAgICAgICAgICAgIHx8ICFuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKQpAQCAtNDU1LDcgKzQ0Myw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdHRyaWJ1dGVzLmdldElkbCgpKSB7CiAgICAgICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IGJhc2UubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3JDaGFyKTsKIAotICAgICAgICAgICAgICAgIFN0cmluZyBkaXJuYW1lID0gIiI7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRpcm5hbWU7CiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBJIGtub3csIHRoaXMgaXMgbm90IG5lY2Vzc2FyeSwgYnV0IEkgcHJlZmVyIGl0IGV4cGxpY2l0IChTQikKICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ2Myw2ICs0NTEsNyBAQAogICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGFja2FnZQogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgPSAiIjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGxhc3RTbGFzaCArIDE7CiAgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBiYXNlLnN1YnN0cmluZygwLCBpbmRleCk7CkBAIC00NzEsNyArNDYwLDcgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBiYXNlLnN1YnN0cmluZyhpbmRleCk7CiAKICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBjID0gYXR0cmlidXRlcy5nZXRMb2FkZXIoKS5sb2FkQ2xhc3MoY2xhc3NuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYyA9IGF0dHJpYnV0ZXMuZ2V0TG9hZGVyKCkubG9hZENsYXNzKGNsYXNzbmFtZSk7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGMuaXNJbnRlcmZhY2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSBzdHViLCBubyB0aWUKQEAgLTQ4NCwxNCArNDczLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHViIGlzIGRlcml2ZWQgZnJvbSBpbXBsZW1lbnRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRpZSBmcm9tIGludGVyZmFjZSBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBpbnRlcmYgPSBhdHRyaWJ1dGVzLmdldFJlbW90ZUludGVyZmFjZShjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGludGVyZiA9IGF0dHJpYnV0ZXMuZ2V0UmVtb3RlSW50ZXJmYWNlKGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlOYW1lID0gaW50ZXJmLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpRGlyID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdERvdCA9IGlOYW1lLmxhc3RJbmRleE9mKCIuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaURpcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdERvdCA9IGlOYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdERvdCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlEaXIgPSAiIjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUluZGV4ID0gbGFzdERvdCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaURpciA9IGlOYW1lLnN1YnN0cmluZygwLCBpSW5kZXgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9Gb3JraW5nU3VuUm1pYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9Gb3JraW5nU3VuUm1pYy5qYXZhCmluZGV4IDVhZmFlNDIuLmNmZDVmY2EgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvRm9ya2luZ1N1blJtaWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0ZvcmtpbmdTdW5SbWljLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Niw3ICs0Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfTkFNRSA9ICJmb3JraW5nIjsKIAogICAgIC8qKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjExCisgICAgICogQHNpbmNlIEFudCAxLjEwLjMKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmVJaW9wQW5kSWRsU3VwcG9ydGVkKCkgewpAQCAtNjUsNiArNjUsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tbWFuZCByYW4gc3VjY2Vzc2Z1bGx5CiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBSbWljIG93bmVyID0gZ2V0Um1pYygpOwogICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBzZXR1cFJtaWNDb21tYW5kKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0thZmZlUm1pYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9LYWZmZVJtaWMuamF2YQppbmRleCA1YjIyMzNmLi43ODRkYzZhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL0thZmZlUm1pYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvS2FmZmVSbWljLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCwyMSArNDQsMjIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QSUxFUl9OQU1FID0gImthZmZlIjsKIAogICAgIC8qKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjExCisgICAgICogQHNpbmNlIEFudCAxLjEwLjMKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmVJaW9wQW5kSWRsU3VwcG9ydGVkKCkgewotICAgICAgICAvLyBhY3R1YWxseSBJIGRvbid0IHRoaW5rIEthZmZlZSBzdXBwb3J0cyBlaXRoZXIsIGJ1dCB3ZSd2ZQotICAgICAgICAvLyBhY2NlcHRlZCB0aGUgZmxhZ3MgcHJpb3IgdG8gMS45LjExCisgICAgICAgIC8vIGFjdHVhbGx5IEkgZG9uJ3QgdGhpbmsgS2FmZmUgc3VwcG9ydHMgZWl0aGVyLCBidXQgd2UndmUKKyAgICAgICAgLy8gYWNjZXB0ZWQgdGhlIGZsYWdzIHByaW9yIHRvIDEuMTAuMwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfSAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBnZXRSbWljKCkubG9nKCJVc2luZyBLYWZmZSBybWljIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQoKTsKIAotICAgICAgICBDbGFzcyBjID0gZ2V0Um1pY0NsYXNzKCk7CisgICAgICAgIENsYXNzPD8+IGMgPSBnZXRSbWljQ2xhc3MoKTsKICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigKICAgICAgICAgICAgICAgICAiQ2Fubm90IHVzZSBLYWZmZSBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlLiAgTm9uZSBvZiAiKTsKQEAgLTY5LDggKzcwLDggQEAKIAogICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2xhc3NOYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBoYXZlIGJlZW4gZm91bmQuIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvIHNldCB0aGUiCi0gICAgICAgICAgICAgICAgICAgICAgICsgIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgb3IgQ0xBU1NQQVRILiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAiIGhhdmUgYmVlbiBmb3VuZC4gQSBjb21tb24gc29sdXRpb24gaXMgdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUgb3IgQ0xBU1NQQVRILiIpOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGJ1Zi50b1N0cmluZygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlci5qYXZhCmluZGV4IDJjYWJlMmYuLjlkNzk1YWIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvUm1pY0FkYXB0ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9SbWljQWRhcHRlckZhY3RvcnkuamF2YQppbmRleCBhNjA0MTQ0Li4wNzM1Y2FjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1JtaWNBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvUm1pY0FkYXB0ZXJGYWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC03Nyw3ICs3Nyw3IEBACiAgICAgICogPGxpPmthZmZlID0gS2FmZmUncyBybWljCiAgICAgICogPGxpPjxpPmEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZTwvaT4gPSB0aGUgbmFtZSBvZiBhIHJtaWMKICAgICAgKiBhZGFwdGVyCi0gICAgICogPGxpPndlYmxvZ2ljID0gd2VibG9naWMgY29tcGlsZXIKKyAgICAgKiA8bGk+d2VibG9naWMgPSBXZWJMb2dpYyBjb21waWxlcgogICAgICAqIDxsaT5mb3JraW5nID0gU3VuJ3MgUk1JQyBieSBmb3JraW5nIGEgbmV3IEpWTQogICAgICAqIDwvdWw+CiAgICAgICoKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBjbGFzc3BhdGgpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vaGFuZGxlIGRlZmF1bHQgc3BlY2lhbGx5IGJ5IGNob29zaW5nIHRoZSBzdW4gb3Iga2FmZmUgY29tcGlsZXIKLSAgICAgICAgaWYgKERFRkFVTFRfQ09NUElMRVIuZXF1YWxzSWdub3JlQ2FzZShybWljVHlwZSkgfHwgcm1pY1R5cGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAoREVGQVVMVF9DT01QSUxFUi5lcXVhbHNJZ25vcmVDYXNlKHJtaWNUeXBlKSB8fCBybWljVHlwZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChLYWZmZVJtaWMuaXNBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgICAgIHJtaWNUeXBlID0gS2FmZmVSbWljLkNPTVBJTEVSX05BTUU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSkgewpAQCAtMTA2LDEzICsxMDYsMTcgQEAKICAgICAgICAgfQogICAgICAgICBpZiAoU3VuUm1pYy5DT01QSUxFUl9OQU1FLmVxdWFsc0lnbm9yZUNhc2Uocm1pY1R5cGUpKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN1blJtaWMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChLYWZmZVJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHJtaWNUeXBlKSkgeworICAgICAgICB9CisgICAgICAgIGlmIChLYWZmZVJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHJtaWNUeXBlKSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBLYWZmZVJtaWMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChXTFJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHJtaWNUeXBlKSkgeworICAgICAgICB9CisgICAgICAgIGlmIChXTFJtaWMuQ09NUElMRVJfTkFNRS5lcXVhbHNJZ25vcmVDYXNlKHJtaWNUeXBlKSkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBXTFJtaWMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChGb3JraW5nU3VuUm1pYy5DT01QSUxFUl9OQU1FLmVxdWFsc0lnbm9yZUNhc2Uocm1pY1R5cGUpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEZvcmtpbmdTdW5SbWljLkNPTVBJTEVSX05BTUUuZXF1YWxzSWdub3JlQ2FzZShybWljVHlwZSkpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ya2luZ1N1blJtaWMoKTsKLSAgICAgICAgfSBlbHNlIGlmIChYTmV3Um1pYy5DT01QSUxFUl9OQU1FLmVxdWFsc0lnbm9yZUNhc2Uocm1pY1R5cGUpKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFhOZXdSbWljLkNPTVBJTEVSX05BTUUuZXF1YWxzSWdub3JlQ2FzZShybWljVHlwZSkpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgWE5ld1JtaWMoKTsKICAgICAgICAgfQogICAgICAgICAvL25vIG1hdGNoPwpAQCAtMTMzLDcgKzEzNyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgUm1pY0FkYXB0ZXIgcmVzb2x2ZUNsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyKQogICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChSbWljQWRhcHRlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAorICAgICAgICByZXR1cm4gQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLAogICAgICAgICAgICAgICAgIGxvYWRlciAhPSBudWxsID8gbG9hZGVyIDoKICAgICAgICAgICAgICAgICBSbWljQWRhcHRlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgUm1pY0FkYXB0ZXIuY2xhc3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvU3VuUm1pYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9TdW5SbWljLmphdmEKaW5kZXggNzI4MTI1Mi4uNzRjMWQ3NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9TdW5SbWljLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9TdW5SbWljLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MSwxMyArNTEsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSTUlDX0VYRUNVVEFCTEUgPSAicm1pYyI7CiAgICAgLyoqIEVycm9yIG1lc3NhZ2UgdG8gdXNlIHdpdGggdGhlIHN1biBybWljIGlzIG5vdCB0aGUgY2xhc3NwYXRoLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1JNSUNfT05fQ0xBU1NQQVRIID0gIkNhbm5vdCB1c2UgU1VOIHJtaWMsIGFzIGl0IGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF2YWlsYWJsZS4gIEEgY29tbW9uIHNvbHV0aW9uIGlzIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkpBVkFfSE9NRSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfTk9fUk1JQ19PTl9DTEFTU1BBVEhfSkFWQV85ID0gIkNhbm5vdCB1c2UgU1VOIHJtaWMsIGFzIGl0IGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF2YWlsYWJsZS4gIFRoZSBjbGFzcyB3ZSB0cnkgdG8gdXNlIGlzIHBhcnQgb2YgdGhlIGpkay5ybWljIG1vZHVsZSB3aGljaCBtYXkgbm90IGJlLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSB1c2UgdGhlICdmb3JraW5nJyBjb21waWxlciBmb3IgSkRLIDkrIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19STUlDX09OX0NMQVNTUEFUSCA9CisgICAgICAgICJDYW5ub3QgdXNlIFNVTiBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlLiAgQSBjb21tb24gc29sdXRpb24gaXMgdG8gc2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBKQVZBX0hPTUUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX05PX1JNSUNfT05fQ0xBU1NQQVRIX0pBVkFfOSA9CisgICAgICAgICJDYW5ub3QgdXNlIFNVTiBybWljLCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlLiAgVGhlIGNsYXNzIHdlIHRyeSB0byB1c2UgaXMgcGFydCBvZiB0aGUgamRrLnJtaWMgbW9kdWxlIHdoaWNoIG1heSBub3QgYmUuIFBsZWFzZSB1c2UgdGhlICdmb3JraW5nJyBjb21waWxlciBmb3IgSkRLIDkrIjsKICAgICAvKiogRXJyb3IgbWVzc2FnZSB0byB1c2Ugd2hlbiB0aGVyZSBpcyBhbiBlcnJvciBzdGFydGluZyB0aGUgc3VuIHJtaWMgY29tcGlsZXIgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9STUlDX0ZBSUxFRCA9ICJFcnJvciBzdGFydGluZyBTVU4gcm1pYzogIjsKIApAQCAtNjYsMjkgKzYzLDI4IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGdldFJtaWMoKS5sb2coIlVzaW5nIFNVTiBybWljIGNvbXBpbGVyIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQoKTsKIAogICAgICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHJtaWMsIHJlZGlyZWN0aW5nIG91dHB1dCB0bwogICAgICAgICAvLyB0aGUgcHJvamVjdCBsb2cKLSAgICAgICAgTG9nT3V0cHV0U3RyZWFtIGxvZ3N0ciA9IG5ldyBMb2dPdXRwdXRTdHJlYW0oZ2V0Um1pYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKKyAgICAgICAgTG9nT3V0cHV0U3RyZWFtIGxvZ3N0ciA9CisgICAgICAgICAgICBuZXcgTG9nT3V0cHV0U3RyZWFtKGdldFJtaWMoKSwgUHJvamVjdC5NU0dfV0FSTik7CiAKICAgICAgICAgYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjID0gQ2xhc3MuZm9yTmFtZShSTUlDX0NMQVNTTkFNRSk7Ci0gICAgICAgICAgICBDb25zdHJ1Y3RvciBjb25zCi0gICAgICAgICAgICAgICAgPSBjLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdICB7T3V0cHV0U3RyZWFtLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKLSAgICAgICAgICAgIE9iamVjdCBybWljID0gY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge2xvZ3N0ciwgInJtaWMifSk7CisgICAgICAgICAgICBDbGFzczw/PiBjID0gQ2xhc3MuZm9yTmFtZShSTUlDX0NMQVNTTkFNRSk7CisgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zID0KKyAgICAgICAgICAgICAgICBjLmdldENvbnN0cnVjdG9yKE91dHB1dFN0cmVhbS5jbGFzcywgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIE9iamVjdCBybWljID0gY29ucy5uZXdJbnN0YW5jZShsb2dzdHIsICJybWljIik7CiAKLSAgICAgICAgICAgIE1ldGhvZCBkb1JtaWMgPSBjLmdldE1ldGhvZCgiY29tcGlsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzIFtdIHtTdHJpbmdbXS5jbGFzc30pOwotICAgICAgICAgICAgQm9vbGVhbiBvayA9Ci0gICAgICAgICAgICAgICAgKEJvb2xlYW4pIGRvUm1pYy5pbnZva2Uocm1pYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgT2JqZWN0W10ge2NtZC5nZXRBcmd1bWVudHMoKX0pKTsKKyAgICAgICAgICAgIE1ldGhvZCBkb1JtaWMgPSBjLmdldE1ldGhvZCgiY29tcGlsZSIsIFN0cmluZ1tdLmNsYXNzKTsKKyAgICAgICAgICAgIGJvb2xlYW4gb2sgPSBCb29sZWFuLlRSVUUKKyAgICAgICAgICAgICAgICAuZXF1YWxzKGRvUm1pYy5pbnZva2Uocm1pYywgKE9iamVjdCkgY21kLmdldEFyZ3VtZW50cygpKSk7CiAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBvay5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBvazsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9OT19STUlDX09OX0NMQVNTUEFUSF9KQVZBXzksCkBAIC05OSwxMCArOTUsOSBAQAogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgKEJ1aWxkRXhjZXB0aW9uKSBleDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX1JNSUNfRkFJTEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCwgZ2V0Um1pYygpLmdldExvY2F0aW9uKCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX1JNSUNfRkFJTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4LCBnZXRSbWljKCkuZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGxvZ3N0ci5jbG9zZSgpOwpAQCAtMTIyLDYgKzExNyw3IEBACiAgICAgICogQHBhcmFtIGNvbXBpbGVyQXJncyB0aGUgb3JpZ2luYWwgY29tcGlsZXIgYXJndW1lbnRzCiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgc2V0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVwcm9jZXNzQ29tcGlsZXJBcmdzKFN0cmluZ1tdIGNvbXBpbGVyQXJncykgewogICAgICAgICByZXR1cm4gZmlsdGVySnZtQ29tcGlsZXJBcmdzKGNvbXBpbGVyQXJncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9XTFJtaWMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvV0xSbWljLmphdmEKaW5kZXggYTQyMzZkMi4uMjMyODkyMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9XTFJtaWMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1dMUm1pYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDAsOCArNDAsNyBAQAogCiAgICAgLyoqIFRoZSBlcnJvciBzdHJpbmcgdG8gdXNlIGlmIG5vdCBhYmxlIHRvIGZpbmQgdGhlIHdlYmxvZ2ljIHJtaWMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9OT19XTFJNSUNfT05fQ0xBU1NQQVRIID0KLSAgICAgICAgIkNhbm5vdCB1c2UgV2ViTG9naWMgcm1pYywgYXMgaXQgaXMgbm90ICIKLSAgICAgICAgKyAiYXZhaWxhYmxlLiBBZGQgaXQgdG8gQW50J3MgY2xhc3NwYXRoIHdpdGggdGhlIC1saWIgb3B0aW9uIjsKKyAgICAgICAgIkNhbm5vdCB1c2UgV2ViTG9naWMgcm1pYywgYXMgaXQgaXMgbm90IGF2YWlsYWJsZS4gQWRkIGl0IHRvIEFudCdzIGNsYXNzcGF0aCB3aXRoIHRoZSAtbGliIG9wdGlvbiI7CiAKICAgICAvKiogVGhlIGVycm9yIHN0cmluZyB0byB1c2UgaWYgbm90IGFibGUgdG8gc3RhcnQgdGhlIHdlYmxvZ2ljIHJtaWMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9XTFJNSUNfRkFJTEVEID0gIkVycm9yIHN0YXJ0aW5nIFdlYkxvZ2ljIHJtaWM6ICI7CkBAIC01MywxMiArNTIsMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9TVFVCX09QVElPTiA9ICJVbnN1cHBvcnRlZCBzdHViIG9wdGlvbjogIjsKIAogICAgIC8qKgotICAgICAqIEBzaW5jZSBBbnQgMS45LjExCisgICAgICogQHNpbmNlIEFudCAxLjEwLjMKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhcmVJaW9wQW5kSWRsU3VwcG9ydGVkKCkgewogICAgICAgICAvLyBhY3R1YWxseSBJIGRvbid0IHRoaW5rIFdlYmxvZ2ljJ3Mgcm1pYyBzdXBwb3J0cyBlaXRoZXIsIGJ1dAotICAgICAgICAvLyB3ZSd2ZSBhY2NlcHRlZCB0aGUgZmxhZ3MgcHJpb3IgdG8gMS45LjExCisgICAgICAgIC8vIHdlJ3ZlIGFjY2VwdGVkIHRoZSBmbGFncyBwcmlvciB0byAxLjEwLjMKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC02Nyw2ICs2Niw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb21waWxhdGlvbiBzdWNjZWVkZWQKICAgICAgKiBAdGhyb3dzICBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBnZXRSbWljKCkubG9nKCJVc2luZyBXZWJMb2dpYyBybWljIiwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IHNldHVwUm1pY0NvbW1hbmQobmV3IFN0cmluZ1tdIHsiLW5vZXhpdCJ9KTsKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcm1pYwotICAgICAgICAgICAgQ2xhc3MgYyA9IG51bGw7CisgICAgICAgICAgICBDbGFzczw/PiBjOwogICAgICAgICAgICAgaWYgKGdldFJtaWMoKS5nZXRDbGFzc3BhdGgoKSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYyA9IENsYXNzLmZvck5hbWUoV0xSTUlDX0NMQVNTTkFNRSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtODIsOSArODIsOCBAQAogICAgICAgICAgICAgICAgICAgICA9IGdldFJtaWMoKS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoZ2V0Um1pYygpLmdldENsYXNzcGF0aCgpKTsKICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShXTFJNSUNfQ0xBU1NOQU1FLCB0cnVlLCBsb2FkZXIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWV0aG9kIGRvUm1pYyA9IGMuZ2V0TWV0aG9kKCJtYWluIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3MgW10ge1N0cmluZ1tdLmNsYXNzfSk7Ci0gICAgICAgICAgICBkb1JtaWMuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7Y21kLmdldEFyZ3VtZW50cygpfSk7CisgICAgICAgICAgICBNZXRob2QgZG9SbWljID0gYy5nZXRNZXRob2QoIm1haW4iLCBTdHJpbmdbXS5jbGFzcyk7CisgICAgICAgICAgICBkb1JtaWMuaW52b2tlKG51bGwsIChPYmplY3QpIGNtZC5nZXRBcmd1bWVudHMoKSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKEVSUk9SX05PX1dMUk1JQ19PTl9DTEFTU1BBVEgsIGdldFJtaWMoKS5nZXRMb2NhdGlvbigpKTsKQEAgLTEwNiw2ICsxMDUsNyBAQAogICAgICAqIEdldCB0aGUgc3VmZml4IGZvciB0aGUgcm1pYyBzdHViIGNsYXNzZXMKICAgICAgKiBAcmV0dXJuIHRoZSBzdHViIHN1ZmZpeAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3R1YkNsYXNzU3VmZml4KCkgewogICAgICAgICByZXR1cm4gV0xfUk1JX1NUVUJfU1VGRklYOwogICAgIH0KQEAgLTExNCw2ICsxMTQsNyBAQAogICAgICAqIEdldCB0aGUgc3VmZml4IGZvciB0aGUgcm1pYyBza2VsZXRvbiBjbGFzc2VzCiAgICAgICogQHJldHVybiB0aGUgc2tlbGV0b24gc3VmZml4CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRTa2VsQ2xhc3NTdWZmaXgoKSB7CiAgICAgICAgIHJldHVybiBXTF9STUlfU0tFTF9TVUZGSVg7CiAgICAgfQpAQCAtMTI0LDYgKzEyNSw3IEBACiAgICAgICogQHBhcmFtIGNvbXBpbGVyQXJncyB0aGUgb3JpZ2luYWwgY29tcGlsZXIgYXJndW1lbnRzCiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgc2V0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmdbXSBwcmVwcm9jZXNzQ29tcGlsZXJBcmdzKFN0cmluZ1tdIGNvbXBpbGVyQXJncykgewogICAgICAgICByZXR1cm4gZmlsdGVySnZtQ29tcGlsZXJBcmdzKGNvbXBpbGVyQXJncyk7CiAgICAgfQpAQCAtMTMzLDYgKzEzNSw3IEBACiAgICAgICogc3R1YiBvcHRpb24gaXMgc2V0LCBhIHdhcm5pbmcgaXMgcHJpbnRlZC4KICAgICAgKiBAcmV0dXJuIG51bGwsIGZvciBubyBzdHViIHZlcnNpb24KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGFkZFN0dWJWZXJzaW9uT3B0aW9ucygpIHsKICAgICAgICAgLy9oYW5kbGUgdGhlIG1hbnkgZGlmZmVyZW50IHN0dWIgb3B0aW9ucy4KICAgICAgICAgU3RyaW5nIHN0dWJWZXJzaW9uID0gZ2V0Um1pYygpLmdldFN0dWJWZXJzaW9uKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1hOZXdSbWljLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9ybWljL1hOZXdSbWljLmphdmEKaW5kZXggODFlMDQzZS4uN2Y1YTZjOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvcm1pYy9YTmV3Um1pYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL3JtaWMvWE5ld1JtaWMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDggKzIzLDggQEAKICAqIFJ1biBybWljIGluIGEgbmV3IHByb2Nlc3Mgd2l0aCAtWG5ldyBzZXQuCiAgKiBUaGlzIHN3aXRjaGVzIHJtaWMgdG8gdXNlIGEgbmV3IGNvbXBpbGVyLCBvbmUgdGhhdCBkb2Vzbid0IHdvcmsgaW4tcHJvY2VzcwogICogb24gYW50IG9uIGphdmExLjYuCi0gKiBzZWU6IDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzg3MzIiPgotICogaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zODczMjwvYT4KKyAqIHNlZTogPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzg3MzIiPgorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzg3MzI8L2E+CiAgKi8KIHB1YmxpYyBjbGFzcyBYTmV3Um1pYyBleHRlbmRzIEZvcmtpbmdTdW5SbWljIHsKIApAQCAtMzMsMTQgKzMzLDExIEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUElMRVJfTkFNRSA9ICJ4bmV3IjsKIAotICAgIC8qKiBOby1hcmcgY29uc3RydWN0b3IuICovCi0gICAgcHVibGljIFhOZXdSbWljKCkgewotICAgIH0KLQogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIG5vcm1hbCBjb21tYW5kIGxpbmUsIHRoZW4gd2l0aCAtWG5ldyBhdCB0aGUgZnJvbnQKICAgICAgKiBAcmV0dXJuIGEgY29tbWFuZCBsaW5lIHRoYXQgaGFuZHMgb2ZmIHRvIHRodwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBDb21tYW5kbGluZSBzZXR1cFJtaWNDb21tYW5kKCkgewogICAgICAgICBTdHJpbmdbXSBvcHRpb25zID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgICAgICAiLVhuZXciCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BYnN0cmFjdEZpbGVTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldC5qYXZhCmluZGV4IGYyNzY0YTUuLmFiNWNiYmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuRGVwZW5kU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRlcHRoU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkRpZmZlcmVudFNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5FeGVjdXRhYmxlU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkV4dGVuZFNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5GaWxlU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLkZpbGVuYW1lU2VsZWN0b3I7CkBAIC00MiwxMiArNDQsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuTm9uZVNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Ob3RTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuT3JTZWxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuT3duZWRCeVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Qb3NpeEdyb3VwU2VsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlBvc2l4UGVybWlzc2lvbnNTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuUHJlc2VudFNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5SZWFkYWJsZVNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TZWxlY3RTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2VsZWN0b3JDb250YWluZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlNlbGVjdG9yU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuU2l6ZVNlbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5TeW1saW5rU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLlR5cGVTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuV3JpdGFibGVTZWxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3Rvci5Nb2RpZmllZFNlbGVjdG9yOwpAQCAtNjMsOCArNjksOCBAQAogICAgIGltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZWxlY3RvckNvbnRhaW5lciB7CiAKICAgICBwcml2YXRlIFBhdHRlcm5TZXQgZGVmYXVsdFBhdHRlcm5zID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICBwcml2YXRlIExpc3Q8UGF0dGVyblNldD4gYWRkaXRpb25hbFBhdHRlcm5zID0gbmV3IEFycmF5TGlzdDxQYXR0ZXJuU2V0PigpOwotICAgIHByaXZhdGUgTGlzdDxGaWxlU2VsZWN0b3I+IHNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8RmlsZVNlbGVjdG9yPigpOworICAgIHByaXZhdGUgTGlzdDxQYXR0ZXJuU2V0PiBhZGRpdGlvbmFsUGF0dGVybnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIExpc3Q8RmlsZVNlbGVjdG9yPiBzZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIHByaXZhdGUgRmlsZSBkaXI7CiAgICAgcHJpdmF0ZSBib29sZWFuIGZpbGVBdHRyaWJ1dGVVc2VkOwpAQCAtMTEwLDYgKzExNiw3IEBACiAgICAgICogQHBhcmFtIHIgdGhlIDxjb2RlPlJlZmVyZW5jZTwvY29kZT4gdG8gdXNlLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGRpciAhPSBudWxsIHx8IGRlZmF1bHRQYXR0ZXJucy5oYXNQYXR0ZXJucyhnZXRQcm9qZWN0KCkpKSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwpAQCAtNDkyLDE0ICs0OTksMTQgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBudWxsOworICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIGRzOwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKICAgICAgICAgICAgIGlmIChkaXJlY3RvcnlTY2FubmVyICE9IG51bGwgJiYgcCA9PSBnZXRQcm9qZWN0KCkpIHsKICAgICAgICAgICAgICAgICBkcyA9IGRpcmVjdG9yeVNjYW5uZXI7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChkaXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RGF0YVR5cGVOYW1lKCkgKyAiLiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREYXRhVHlwZU5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICghZGlyLmV4aXN0cygpICYmIGVycm9yT25NaXNzaW5nRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihkaXIuZ2V0QWJzb2x1dGVQYXRoKCkKQEAgLTUwNyw4ICs1MTQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRPRVNfTk9UX0VYSVNUX1BPU1RGSVgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWRpci5pc0RpcmVjdG9yeSgpICYmIGRpci5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZGlyLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgZGlyZWN0b3J5LiIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGlzIG5vdCBhIGRpcmVjdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlyLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICAgICAgICAgIHNldHVwRGlyZWN0b3J5U2Nhbm5lcihkcywgcCk7CkBAIC01NjYsMTEgKzU3MywxNiBAQAogICAgIC8qKgogICAgICAqIFBlcmZvcm1zIHRoZSBjaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyB0aGUKICAgICAgKiByZWZlcmVuY2VkIEZpbGVTZXQuCisgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG9nZXRoZXIgd2l0aCB7QGxpbmsgQXJjaGl2ZUZpbGVTZXQjZ2V0UmVmKCkgZ2V0UmVmKCl9CisgICAgICogcHJvdmlkaW5nIGltcGxlbWVudGF0aW9ucyBjb250YWluaW5nIHRoZSBzcGVjaWFsIHN1cHBvcnQKKyAgICAgKiBmb3IgRmlsZVNldCByZWZlcmVuY2VzLCB3aGljaCBjYW4gYmUgaGFuZGxlZCBieSBhbGwgQXJjaGl2ZUZpbGVTZXRzLgorICAgICAqIE5CISBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcyBzdWNoIGFzIEZpbGVTZXQgYW5kIERpclNldAorICAgICAqIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlIGRhdGEgdHlwZXMuCiAgICAgICogQHBhcmFtIHAgdGhlIGN1cnJlbnQgcHJvamVjdAotICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgRmlsZVNldAorICAgICAqIEByZXR1cm4gdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIHJldHVybiAoQWJzdHJhY3RGaWxlU2V0KSBnZXRDaGVja2VkUmVmKHApOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihBYnN0cmFjdEZpbGVTZXQuY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpLCBwKTsKICAgICB9CiAKICAgICAvLyBTZWxlY3RvckNvbnRhaW5lciBtZXRob2RzCkBAIC01ODAsMTIgKzU5MiwxMyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB3aGV0aGVyIGFueSBzZWxlY3RvcnMgYXJlIGluIHRoaXMgY29udGFpbmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNTZWxlY3RvcnMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKGdldFByb2plY3QoKSkuaGFzU2VsZWN0b3JzKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICByZXR1cm4gIShzZWxlY3RvcnMuaXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuICFzZWxlY3RvcnMuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTk4LDE1ICs2MTEsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGdldFJlZihnZXRQcm9qZWN0KCkpLmhhc1BhdHRlcm5zKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBpZiAoZGVmYXVsdFBhdHRlcm5zLmhhc1BhdHRlcm5zKGdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoUGF0dGVyblNldCBwcyA6IGFkZGl0aW9uYWxQYXR0ZXJucykgewotICAgICAgICAgICAgaWYgKHBzLmhhc1BhdHRlcm5zKGdldFByb2plY3QoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBkZWZhdWx0UGF0dGVybnMuaGFzUGF0dGVybnMoZ2V0UHJvamVjdCgpKQorICAgICAgICAgICAgICAgIHx8IGFkZGl0aW9uYWxQYXR0ZXJucy5zdHJlYW0oKS5hbnlNYXRjaChwcyAtPiBwcy5oYXNQYXR0ZXJucyhnZXRQcm9qZWN0KCkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYxNCw2ICs2MjAsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lciBhcyBhbiA8Y29kZT5pbnQ8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNlbGVjdG9yQ291bnQoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKGdldFByb2plY3QoKSkuc2VsZWN0b3JDb3VudCgpOwpAQCAtNjI3LDEzICs2MzQsMTMgQEAKICAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0CiAgICAgICogQHJldHVybiBhIDxjb2RlPkZpbGVTZWxlY3RvcltdPC9jb2RlPiBvZiB0aGUgc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZVNlbGVjdG9yW10gZ2V0U2VsZWN0b3JzKFByb2plY3QgcCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZihnZXRQcm9qZWN0KCkpLmdldFNlbGVjdG9ycyhwKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHApOwotICAgICAgICByZXR1cm4gKEZpbGVTZWxlY3RvcltdKSAoc2VsZWN0b3JzLnRvQXJyYXkoCi0gICAgICAgICAgICBuZXcgRmlsZVNlbGVjdG9yW3NlbGVjdG9ycy5zaXplKCldKSk7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnMudG9BcnJheShuZXcgRmlsZVNlbGVjdG9yW3NlbGVjdG9ycy5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY0MSw2ICs2NDgsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBhbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2Ygc2VsZWN0b3JzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb248RmlsZVNlbGVjdG9yPiBzZWxlY3RvckVsZW1lbnRzKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZihnZXRQcm9qZWN0KCkpLnNlbGVjdG9yRWxlbWVudHMoKTsKQEAgLTY1NCw2ICs2NjIsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBuZXcgPGNvZGU+RmlsZVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFwcGVuZFNlbGVjdG9yKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKQEAgLTY2OSw2ICs2NzgsNyBAQAogICAgICAqIEFkZCBhICJTZWxlY3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+U2VsZWN0U2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRTZWxlY3RvcihTZWxlY3RTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNjc3LDYgKzY4Nyw3IEBACiAgICAgICogQWRkIGFuICJBbmQiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+QW5kU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRBbmQoQW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTY4NSw2ICs2OTYsNyBAQAogICAgICAqIEFkZCBhbiAiT3IiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+T3JTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZE9yKE9yU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTY5Myw2ICs3MDUsNyBAQAogICAgICAqIEFkZCBhICJOb3QiIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+Tm90U2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGROb3QoTm90U2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTcwMSw2ICs3MTQsNyBAQAogICAgICAqIEFkZCBhICJOb25lIiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPk5vbmVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZE5vbmUoTm9uZVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC03MDksNiArNzIzLDcgQEAKICAgICAgKiBBZGQgYSBtYWpvcml0eSBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPk1ham9yaXR5U2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRNYWpvcml0eShNYWpvcml0eVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC03MTcsNiArNzMyLDcgQEAKICAgICAgKiBBZGQgYSBzZWxlY3RvciBkYXRlIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+RGF0ZVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRGF0ZShEYXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTcyNSw2ICs3NDEsNyBAQAogICAgICAqIEFkZCBhIHNlbGVjdG9yIHNpemUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5TaXplU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRTaXplKFNpemVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNzMzLDYgKzc1MCw3IEBACiAgICAgICogQWRkIGEgRGlmZmVyZW50U2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5EaWZmZXJlbnRTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZERpZmZlcmVudChEaWZmZXJlbnRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNzQxLDYgKzc1OSw3IEBACiAgICAgICogQWRkIGEgc2VsZWN0b3IgZmlsZW5hbWUgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5GaWxlbmFtZVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkRmlsZW5hbWUoRmlsZW5hbWVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNzQ5LDYgKzc2OCw3IEBACiAgICAgICogQWRkIGEgc2VsZWN0b3IgdHlwZSBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPlR5cGVTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFR5cGUoVHlwZVNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC03NTcsNiArNzc3LDcgQEAKICAgICAgKiBBZGQgYW4gZXh0ZW5kZWQgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5FeHRlbmRTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEN1c3RvbShFeHRlbmRTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNzY1LDYgKzc4Niw3IEBACiAgICAgICogQWRkIGEgY29udGFpbnMgc2VsZWN0b3IgZW50cnkgb24gdGhlIHNlbGVjdG9yIGxpc3QuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5Db250YWluc1NlbGVjdG9yPC9jb2RlPiB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkQ29udGFpbnMoQ29udGFpbnNTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBhcHBlbmRTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgfQpAQCAtNzczLDYgKzc5NSw3IEBACiAgICAgICogQWRkIGEgcHJlc2VudCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPlByZXNlbnRTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFByZXNlbnQoUHJlc2VudFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC03ODEsNiArODA0LDcgQEAKICAgICAgKiBBZGQgYSBkZXB0aCBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkRlcHRoU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREZXB0aChEZXB0aFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC03ODksNiArODEzLDcgQEAKICAgICAgKiBBZGQgYSBkZXBlbmRzIHNlbGVjdG9yIGVudHJ5IG9uIHRoZSBzZWxlY3RvciBsaXN0LgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+RGVwZW5kU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGREZXBlbmQoRGVwZW5kU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTc5Nyw2ICs4MjIsNyBAQAogICAgICAqIEFkZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzZWxlY3RvciBlbnRyeSBvbiB0aGUgc2VsZWN0b3IgbGlzdC4KICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIDxjb2RlPkNvbnRhaW5zUmVnZXhwU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRDb250YWluc1JlZ2V4cChDb250YWluc1JlZ2V4cFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC04MDQsOCArODMwLDkgQEAKICAgICAvKioKICAgICAgKiBBZGQgdGhlIG1vZGlmaWVkIHNlbGVjdG9yLgogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgPGNvZGU+TW9kaWZpZWRTZWxlY3RvcjwvY29kZT4gdG8gYWRkLgotICAgICAqIEBzaW5jZSBhbnQgMS42CisgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRNb2RpZmllZChNb2RpZmllZFNlbGVjdG9yIHNlbGVjdG9yKSB7CiAgICAgICAgIGFwcGVuZFNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICB9CkBAIC04MTksMTAgKzg0Niw1MSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBwYXJhbSBlIEV4ZWN1dGFibGVTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeGVjdXRhYmxlKEV4ZWN1dGFibGVTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlIFN5bWxpbmtTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeW1saW5rKFN5bWxpbmtTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIE93bmVkQnlTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPd25lZEJ5KE93bmVkQnlTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4R3JvdXBTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeEdyb3VwKFBvc2l4R3JvdXBTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeFBlcm1pc3Npb25zKFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkZCBhbiBhcmJpdHJhcnkgc2VsZWN0b3IuCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSA8Y29kZT5GaWxlU2VsZWN0b3I8L2NvZGU+IHRvIGFkZC4KICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZChGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgYXBwZW5kU2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgIH0KQEAgLTgzMiwyMiArOTAwLDEzIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZiBpbmNsdWRlZCBmaWxlbmFtZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYoZ2V0UHJvamVjdCgpKS50b1N0cmluZygpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBkcy5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJzsnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZChmaWxlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuam9pbigiOyIsIGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZEZpbGVzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODU3LDIyICs5MTYsMjAgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgb2JqZWN0CiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiAoZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEFic3RyYWN0RmlsZVNldCBmcyA9IChBYnN0cmFjdEZpbGVTZXQpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICAgICAgZnMuZGVmYXVsdFBhdHRlcm5zID0gKFBhdHRlcm5TZXQpIGRlZmF1bHRQYXR0ZXJucy5jbG9uZSgpOwotICAgICAgICAgICAgICAgIGZzLmFkZGl0aW9uYWxQYXR0ZXJucyA9IG5ldyBBcnJheUxpc3Q8UGF0dGVyblNldD4oYWRkaXRpb25hbFBhdHRlcm5zLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChQYXR0ZXJuU2V0IHBzIDogYWRkaXRpb25hbFBhdHRlcm5zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZzLmFkZGl0aW9uYWxQYXR0ZXJucy5hZGQoKFBhdHRlcm5TZXQpIHBzLmNsb25lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcy5zZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PEZpbGVTZWxlY3Rvcj4oc2VsZWN0b3JzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnM7Ci0gICAgICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZnMgPSAoQWJzdHJhY3RGaWxlU2V0KSBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgZnMuZGVmYXVsdFBhdHRlcm5zID0gKFBhdHRlcm5TZXQpIGRlZmF1bHRQYXR0ZXJucy5jbG9uZSgpOworICAgICAgICAgICAgZnMuYWRkaXRpb25hbFBhdHRlcm5zID0gYWRkaXRpb25hbFBhdHRlcm5zLnN0cmVhbSgpLm1hcChQYXR0ZXJuU2V0OjpjbG9uZSkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChQYXR0ZXJuU2V0LmNsYXNzOjpjYXN0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgZnMuc2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdDw+KHNlbGVjdG9ycyk7CisgICAgICAgICAgICByZXR1cm4gZnM7CisgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTE0LDEzICs5NzEsMTEgQEAKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSAoUGF0dGVyblNldCkgZGVmYXVsdFBhdHRlcm5zLmNsb25lKCk7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGFkZGl0aW9uYWxQYXR0ZXJucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgcHMuYXBwZW5kKGFkZGl0aW9uYWxQYXR0ZXJucy5nZXQoaSksIHApOwotICAgICAgICB9CisgICAgICAgIGFkZGl0aW9uYWxQYXR0ZXJucy5mb3JFYWNoKHBhdCAtPiBwcy5hcHBlbmQocGF0LCBwKSk7CiAgICAgICAgIHJldHVybiBwczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjazxPYmplY3Q+IHN0aywgUHJvamVjdCBwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKQEAgLTkyOSwxNCArOTg0LDkgQEAKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoRmlsZVNlbGVjdG9yIGZpbGVTZWxlY3RvciA6IHNlbGVjdG9ycykgewotICAgICAgICAgICAgICAgIGlmIChmaWxlU2VsZWN0b3IgaW5zdGFuY2VvZiBEYXRhVHlwZSkgewotICAgICAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjaygoRGF0YVR5cGUpIGZpbGVTZWxlY3Rvciwgc3RrLCBwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFBhdHRlcm5TZXQgcHMgOiBhZGRpdGlvbmFsUGF0dGVybnMpIHsKLSAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhwcywgc3RrLCBwKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbGVjdG9ycy5zdHJlYW0oKS5maWx0ZXIoRGF0YVR5cGUuY2xhc3M6OmlzSW5zdGFuY2UpLm1hcChEYXRhVHlwZS5jbGFzczo6Y2FzdCkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2godHlwZSAtPiBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayh0eXBlLCBzdGssIHApKTsKKyAgICAgICAgICAgIGFkZGl0aW9uYWxQYXR0ZXJucy5mb3JFYWNoKHBzIC0+IHB1c2hBbmRJbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKHBzLCBzdGssIHApKTsKICAgICAgICAgICAgIHNldENoZWNrZWQodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BbnRGaWx0ZXJSZWFkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FudEZpbHRlclJlYWRlci5qYXZhCmluZGV4IGJkYzFjMzEuLmJkNDQ0ODcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FudEZpbHRlclJlYWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FudEZpbHRlclJlYWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsOCArMTcsOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0zMSw3ICszMiw3IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CiAKLSAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgVmVjdG9yPFBhcmFtZXRlcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwcml2YXRlIFBhdGggY2xhc3NwYXRoOwogCkBAIC01NCw3ICs1NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBbnRGaWx0ZXJSZWFkZXIpIGdldENoZWNrZWRSZWYoKSkuZ2V0Q2xhc3NOYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0Q2xhc3NOYW1lKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gY2xhc3NOYW1lOwpAQCAtNjksNyArNzAsNyBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKICAgICAgICAgfQotICAgICAgICBwYXJhbWV0ZXJzLmFkZEVsZW1lbnQocGFyYW0pOworICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDksNyArMTEwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUGF0aCBnZXRDbGFzc3BhdGgoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICAoKEFudEZpbHRlclJlYWRlcikgZ2V0Q2hlY2tlZFJlZigpKS5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIGdldFJlZigpLmdldENsYXNzcGF0aCgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIGNsYXNzcGF0aDsKQEAgLTEzNCwxMiArMTM1LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIFBhcmFtZXRlcltdIGdldFBhcmFtcygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICgoQW50RmlsdGVyUmVhZGVyKSBnZXRDaGVja2VkUmVmKCkpLmdldFBhcmFtcygpOworICAgICAgICAgICAgZ2V0UmVmKCkuZ2V0UGFyYW1zKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBuZXcgUGFyYW1ldGVyW3BhcmFtZXRlcnMuc2l6ZSgpXTsKLSAgICAgICAgcGFyYW1ldGVycy5jb3B5SW50byhwYXJhbXMpOwotICAgICAgICByZXR1cm4gcGFyYW1zOworICAgICAgICByZXR1cm4gcGFyYW1ldGVycy50b0FycmF5KG5ldyBQYXJhbWV0ZXJbcGFyYW1ldGVycy5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3NCw0ICsxNzMsOCBAQAogICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgQW50RmlsdGVyUmVhZGVyIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoQW50RmlsdGVyUmVhZGVyLmNsYXNzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BcmNoaXZlRmlsZVNldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZUZpbGVTZXQuamF2YQppbmRleCBlOWEwNzMwLi4xMDgyZTllIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BcmNoaXZlRmlsZVNldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FyY2hpdmVGaWxlU2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICAgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3RvcnkgZm9yIHRoZSBmaWxlc2V0CiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldERpcihGaWxlIGRpcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOwogICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKQEAgLTE4OCwzMiArMTg5LDI5IEBACiAgICAgICovCiAgICAgcHVibGljIEZpbGUgZ2V0U3JjKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoQXJjaGl2ZUZpbGVTZXQpIGdldENoZWNrZWRSZWYoKSkuZ2V0U3JjKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihBcmNoaXZlRmlsZVNldC5jbGFzcykuZ2V0U3JjKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBpZiAoc3JjICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGVQcm92aWRlciBmcCA9IHNyYy5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICAgICAgaWYgKGZwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnAuZ2V0RmlsZSgpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gc3JjLmFzT3B0aW9uYWwoRmlsZVByb3ZpZGVyLmNsYXNzKS5tYXAoRmlsZVByb3ZpZGVyOjpnZXRGaWxlKS5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQogICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgotICAgICAqIFRoaXMgaXMgYW4gb3ZlcnJpZGUgd2hpY2ggZG9lcyBub3QgZGVsZWdhdGUgdG8gdGhlIHN1cGVyY2xhc3M7IGluc3RlYWQgaXQgaW52b2tlcwotICAgICAqIHtAbGluayAjZ2V0UmVmKFByb2plY3QpfSwgYmVjYXVzZSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWFsIHN1cHBvcnQgZm9yIGZpbGVzZXQKLSAgICAgKiByZWZlcmVuY2VzLCB3aGljaCBjYW4gYmUgaGFuZGxlZCBieSBhbGwgQXJjaGl2ZUZpbGVTZXRzLgotICAgICAqIEBwYXJhbSBwIHRoZSBBbnQgUHJvamVjdCBpbnN0YW5jZSBhZ2FpbnN0IHdoaWNoIHRvIHJlc29sdmUgcmVmZXJlbmNlcy4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gdG9nZXRoZXIgd2l0aAorICAgICAqIHtAbGluayBBYnN0cmFjdEZpbGVTZXQjZ2V0UmVmKFByb2plY3QpIGdldFJlZihQcm9qZWN0KX0KKyAgICAgKiBwcm92aWRpbmcgaW1wbGVtZW50YXRpb25zIGNvbnRhaW5pbmcgdGhlIHNwZWNpYWwgc3VwcG9ydAorICAgICAqIGZvciBGaWxlU2V0IHJlZmVyZW5jZXMsIHdoaWNoIGNhbiBiZSBoYW5kbGVkIGJ5IGFsbCBBcmNoaXZlRmlsZVNldHMuCisgICAgICogTkIhIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBpbiBBYnN0cmFjdEZpbGVTZXQgaW4gb3JkZXIgdG8gYWxsb3cKKyAgICAgKiBGaWxlU2V0IGFuZCBEaXJTZXQgdG8gaW1wbGVtZW50IGl0IGFzIGEgcHJpdmF0ZSBtZXRob2QuCiAgICAgICogQHJldHVybiB0aGUgZGVyZWZlcmVuY2VkIG9iamVjdC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZSByZWZlcmVuY2UgaXMgaW52YWxpZCAoY2lyY3VsYXIgcmVmLCB3cm9uZyBjbGFzcywgZXRjKS4KLSAgICAgKiBAc2luY2UgQW50IDEuOAogICAgICAqLwotICAgIC8vIFRPRE8gaXMgdGhlIGFib3ZlIHRydWU/IEFGQUlDVCB0aGUgY2FsbHMgbG9vayBjaXJjdWxhciA6LwotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0Q2hlY2tlZFJlZihQcm9qZWN0IHApIHsKLSAgICAgICAgcmV0dXJuIGdldFJlZihwKTsKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoQWJzdHJhY3RGaWxlU2V0LmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyNCw3ICsyMjIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCk7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKHByZWZpeCkgJiYgISIiLmVxdWFscyhmdWxscGF0aCkpIHsKKyAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpICYmICFmdWxscGF0aC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9QQVRIX0FORF9QUkVGSVgpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMucHJlZml4ID0gcHJlZml4OwpAQCAtMjUxLDcgKzI0OSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0RnVsbHBhdGgoU3RyaW5nIGZ1bGxwYXRoKSB7CiAgICAgICAgIGNoZWNrQXJjaGl2ZUF0dHJpYnV0ZXNBbGxvd2VkKCk7Ci0gICAgICAgIGlmICghIiIuZXF1YWxzKHByZWZpeCkgJiYgISIiLmVxdWFscyhmdWxscGF0aCkpIHsKKyAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpICYmICFmdWxscGF0aC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihFUlJPUl9QQVRIX0FORF9QUkVGSVgpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuZnVsbHBhdGggPSBmdWxscGF0aDsKQEAgLTI4NywxMiArMjg1LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgQWJzdHJhY3RGaWxlU2V0IHJlZiA9IGdldFJlZihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIEFyY2hpdmVGaWxlU2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoQXJjaGl2ZUZpbGVTZXQpIHJlZikuZ2V0RW5jb2RpbmcoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBYnN0cmFjdEZpbGVTZXQgcmVmID0gZ2V0UmVmKCk7CisgICAgICAgICAgICByZXR1cm4gcmVmIGluc3RhbmNlb2YgQXJjaGl2ZUZpbGVTZXQgPyAoKEFyY2hpdmVGaWxlU2V0KSByZWYpLmdldEVuY29kaW5nKCkgOiBudWxsOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlbmNvZGluZzsKICAgICB9CkBAIC0zMTAsNiArMzA0LDcgQEAKICAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UKICAgICAgKiBAcmV0dXJuIGEgZGlyZWN0b3J5IHNjYW5uZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGlyZWN0b3J5U2Nhbm5lciBnZXREaXJlY3RvcnlTY2FubmVyKFByb2plY3QgcCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5nZXREaXJlY3RvcnlTY2FubmVyKHApOwpAQCAtMzQwLDE1ICszMzUsMTUgQEAKICAgICAgKiBAcmV0dXJuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUNvbGxlY3Rpb24pIChnZXRSZWYoZ2V0UHJvamVjdCgpKSkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUNvbGxlY3Rpb24pIGdldFJlZigpKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzcmMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KLSAgICAgICAgQXJjaGl2ZVNjYW5uZXIgYXMgPSAoQXJjaGl2ZVNjYW5uZXIpIGdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgcmV0dXJuIGFzLmdldFJlc291cmNlRmlsZXMoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgcmV0dXJuICgoQXJjaGl2ZVNjYW5uZXIpIGdldERpcmVjdG9yeVNjYW5uZXIoKSkuZ2V0UmVzb3VyY2VGaWxlcyhnZXRQcm9qZWN0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzU2LDE1ICszNTEsMTUgQEAKICAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24gYXMgaW50LgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VDb2xsZWN0aW9uKSAoZ2V0UmVmKGdldFByb2plY3QoKSkpKS5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUNvbGxlY3Rpb24pIGdldFJlZigpKS5zaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNyYyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2l6ZSgpOwogICAgICAgICB9Ci0gICAgICAgIEFyY2hpdmVTY2FubmVyIGFzID0gKEFyY2hpdmVTY2FubmVyKSBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSk7Ci0gICAgICAgIHJldHVybiBhcy5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKTsKKyAgICAgICAgcmV0dXJuIGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3NSw5ICszNzAsMTAgQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGZpbGVzeXN0ZW0tb25seSByZXNvdXJjZSBjb2xsZWN0aW9uLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVGaWxlU2V0KSBnZXRDaGVja2VkUmVmKCkpLmlzRmlsZXN5c3RlbU9ubHkoKTsKKyAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVGaWxlU2V0KSBnZXRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIHNyYyA9PSBudWxsOwpAQCAtNDI4LDcgKzQyNCw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRmlsZU1vZGVCZWVuU2V0KCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoQXJjaGl2ZUZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5oYXNGaWxlTW9kZUJlZW5TZXQoKTsKKyAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVGaWxlU2V0KSBnZXRSZWYoKSkuaGFzRmlsZU1vZGVCZWVuU2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gZmlsZU1vZGVIYXNCZWVuU2V0OwpAQCAtNDc5LDcgKzQ3NSw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzRGlyTW9kZUJlZW5TZXQoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmhhc0Rpck1vZGVCZWVuU2V0KCk7CisgICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlRmlsZVNldCkgZ2V0UmVmKCkpLmhhc0Rpck1vZGVCZWVuU2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gZGlyTW9kZUhhc0JlZW5TZXQ7CkBAIC01MDUsOSArNTAxLDEwIEBACiAgICAgICogQHJldHVybiB0aGUgY2xvbmVkIGFyY2hpdmVGaWxlU2V0CiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoQXJjaGl2ZUZpbGVTZXQuY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpLCBnZXRQcm9qZWN0KCkpLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihBcmNoaXZlRmlsZVNldC5jbGFzcykuY2xvbmUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKICAgICB9CkBAIC01MTgsNiArNTE1LDcgQEAKICAgICAgKiBAcmV0dXJuIGZvciBmaWxlIGJhc2VkIGFyY2hpdmVmaWxlc2V0cywgaW5jbHVkZWQgZmlsZXMgYXMgYSBsaXN0CiAgICAgICogb2Ygc2VtaWNvbG9uLXNlcGFyYXRlZCBmaWxlbmFtZXMuIGVsc2UganVzdCB0aGUgbmFtZSBvZiB0aGUgemlwLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChoYXNEaXIgJiYgZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpOwpAQCAtNTMwLDYgKzUyOCw3IEBACiAgICAgICogQHJldHVybiB0aGUgcHJlZml4LgogICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIDEuNy4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewogICAgICAgICByZXR1cm4gcHJlZml4OwogICAgIH0KQEAgLTUzOSw2ICs1MzgsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUuCiAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIFN0cmluZyBnZXRGdWxscGF0aCgpIHsKICAgICAgICAgcmV0dXJuIGZ1bGxwYXRoOwogICAgIH0KQEAgLTU0Nyw2ICs1NDcsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbW9kZS4KICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldEZpbGVNb2RlKCkgewogICAgICAgICByZXR1cm4gZmlsZU1vZGU7CiAgICAgfQpAQCAtNTU1LDYgKzU1Niw3IEBACiAgICAgICogQHJldHVybiB0aGUgZGlyIG1vZGUuCiAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXREaXJNb2RlKCkgewogICAgICAgICByZXR1cm4gZGlyTW9kZTsKICAgICB9CkBAIC01NzcsNiArNTc5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZVNjYW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0FyY2hpdmVTY2FubmVyLmphdmEKaW5kZXggZGI1YThkNC4uYzBhYTEyZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXJjaGl2ZVNjYW5uZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BcmNoaXZlU2Nhbm5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjEsMjIgKzYxLDIyIEBACiAgICAgLyoqCiAgICAgICogcmVjb3JkIGxpc3Qgb2YgYWxsIGZpbGUgemlwIGVudHJpZXMKICAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc291cmNlPiBmaWxlRW50cmllcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgUmVzb3VyY2U+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZmlsZUVudHJpZXMgPSBuZXcgVHJlZU1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiByZWNvcmQgbGlzdCBvZiBhbGwgZGlyZWN0b3J5IHppcCBlbnRyaWVzCiAgICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZGlyRW50cmllcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgUmVzb3VyY2U+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZGlyRW50cmllcyA9IG5ldyBUcmVlTWFwPD4oKTsKIAogICAgIC8qKgogICAgICAqIHJlY29yZCBsaXN0IG9mIG1hdGNoaW5nIGZpbGUgemlwIGVudHJpZXMKICAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaEZpbGVFbnRyaWVzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBSZXNvdXJjZT4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaEZpbGVFbnRyaWVzID0gbmV3IFRyZWVNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogcmVjb3JkIGxpc3Qgb2YgbWF0Y2hpbmcgZGlyZWN0b3J5IHppcCBlbnRyaWVzCiAgICAgICovCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gbWF0Y2hEaXJFbnRyaWVzID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBSZXNvdXJjZT4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaERpckVudHJpZXMgPSBuZXcgVHJlZU1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiBlbmNvZGluZyBvZiBmaWxlIG5hbWVzLgpAQCAtMjU2LDkgKzI1Niw5IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIHBhdGgpIHsKICAgICAgICAgU3RyaW5nIHZwYXRoID0gcGF0aDsKLSAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICB2cGF0aCA9IHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikuCi0gICAgICAgICAgICAgICAgcmVwbGFjZSgnXFwnLCBGaWxlLnNlcGFyYXRvckNoYXIpOworICAgICAgICBpZiAoIXBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB2cGF0aCA9IHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikKKyAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKICAgICAgICAgICAgIGlmICh2cGF0aC5jaGFyQXQoMCkgPT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7CiAgICAgICAgICAgICAgICAgdnBhdGggPSB2cGF0aC5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICB9CkBAIC0yNzIsMTEgKzI3MiwxMiBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlc291cmNlCiAgICAgICogQHNpbmNlIEFudCAxLjUuMgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewogICAgICAgICBpZiAoc3JjID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNvdXJjZShuYW1lKTsKICAgICAgICAgfQotICAgICAgICBpZiAobmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChuYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGluIFpJUHMsIHdlIGRvIG5vdCB3YW50IHRoaXMgdGhpbmcgaW5jbHVkZWQKICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoIiIsIHRydWUsIExvbmcuTUFYX1ZBTFVFLCB0cnVlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXNzZXJ0aW9ucy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQXNzZXJ0aW9ucy5qYXZhCmluZGV4IGNlNzA5MWEuLjk0MjI4MDkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Bc3NlcnRpb25zLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC03NSw3ICs3NSw3IEBACiAgICAgLyoqCiAgICAgICogbGlzdCBvZiB0eXBlIEJhc2VBc3NlcnRpb24KICAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdDxCYXNlQXNzZXJ0aW9uPiBhc3NlcnRpb25MaXN0ID0gbmV3IEFycmF5TGlzdDxCYXNlQXNzZXJ0aW9uPigpOworICAgIHByaXZhdGUgQXJyYXlMaXN0PEJhc2VBc3NlcnRpb24+IGFzc2VydGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCiAgICAgLyoqCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgKiBAcGFyYW0gcmVmIHRoZSByZWZlcmVuY2UgdG8gdXNlCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAoYXNzZXJ0aW9uTGlzdC5zaXplKCkgPiAwIHx8IGVuYWJsZVN5c3RlbUFzc2VydGlvbnMgIT0gbnVsbCkgeworICAgICAgICBpZiAoIWFzc2VydGlvbkxpc3QuaXNFbXB0eSgpIHx8IGVuYWJsZVN5c3RlbUFzc2VydGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQogICAgICAgICBzdXBlci5zZXRSZWZpZChyZWYpOwpAQCAtMTMwLDEzICsxMzAsMTIgQEAKICAgICBwcml2YXRlIEFzc2VydGlvbnMgZ2V0RmluYWxSZWZlcmVuY2UoKSB7CiAgICAgICAgIGlmIChnZXRSZWZpZCgpID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBc3NlcnRpb25zKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicmVmZXJlbmNlIGlzIG9mIHdyb25nIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoQXNzZXJ0aW9ucykgbzsKICAgICAgICAgfQorICAgICAgICBPYmplY3QgbyA9IGdldFJlZmlkKCkuZ2V0UmVmZXJlbmNlZE9iamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQXNzZXJ0aW9ucykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicmVmZXJlbmNlIGlzIG9mIHdyb25nIHR5cGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKEFzc2VydGlvbnMpIG87CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDUsMTYgKzI0NCwxNiBAQAogICAgICAqIEByZXR1cm4gYSBjbGkKICAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGlmIHRoZSBzdXBlciBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGNsb25pbmcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgQXNzZXJ0aW9ucyB0aGF0ID0gKEFzc2VydGlvbnMpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgIHRoYXQuYXNzZXJ0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8QmFzZUFzc2VydGlvbj4oYXNzZXJ0aW9uTGlzdCk7CisgICAgICAgIHRoYXQuYXNzZXJ0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3Q8Pihhc3NlcnRpb25MaXN0KTsKICAgICAgICAgcmV0dXJuIHRoYXQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogYmFzZSBjbGFzcyBmb3Igb3VyIGFzc2VydGlvbiBlbGVtZW50cy4KICAgICAgKi8KLQogICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZUFzc2VydGlvbiB7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwogICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7CkBAIC0zMDksNyArMzA4LDcgQEAKICAgICAgICAgICAgIGlmIChnZXRQYWNrYWdlTmFtZSgpICE9IG51bGwgJiYgZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQm90aCBwYWNrYWdlIGFuZCBjbGFzcyBoYXZlIGJlZW4gc2V0Iik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdCdWZmZXIgY29tbWFuZCA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0Q29tbWFuZFByZWZpeCgpKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgY29tbWFuZCA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldENvbW1hbmRQcmVmaXgoKSk7CiAgICAgICAgICAgICAvL3NlZSBpZiBpdCBpcyBhIHBhY2thZ2Ugb3IgYSBjbGFzcwogICAgICAgICAgICAgaWYgKGdldFBhY2thZ2VOYW1lKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIC8vcGFja2FnZXMgZ2V0IGEgLi4uIHByZWZpeApAQCAtMzM3LDYgKzMzNiw3IEBACiAgICAgICAgICAqIGdldCB0aGUgcHJlZml4IHVzZWQgdG8gYmVnaW4gdGhlIGNvbW1hbmQ7IC1lYSBvciAtZGEuCiAgICAgICAgICAqIEByZXR1cm4gcHJlZml4CiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21tYW5kUHJlZml4KCkgewogICAgICAgICAgICAgcmV0dXJuICItZWEiOwogICAgICAgICB9CkBAIC0zNTEsNiArMzUxLDcgQEAKICAgICAgICAgICogZ2V0IHRoZSBwcmVmaXggdXNlZCB0byBiZWdpbiB0aGUgY29tbWFuZDsgLWVhIG9yIC1kYS4KICAgICAgICAgICogQHJldHVybiBwcmVmaXgKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1hbmRQcmVmaXgoKSB7CiAgICAgICAgICAgICByZXR1cm4gIi1kYSI7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NoYXJTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NoYXJTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY1ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ2hhclNldC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogRW51bWVyYXRlZEF0dHJpYnV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ2hhcnNldCB0byB1c2Ugd2l0aCBlbmNvZGluZy9jaGFyc2V0IGF0dHJpYnV0ZXMuCisgKiBAc2luY2UgQW50IDEuMTAuNgorICovCitwdWJsaWMgY2xhc3MgQ2hhclNldCBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFZBTFVFUyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDaGFyc2V0PiBlbnRyeSA6ICBDaGFyc2V0LmF2YWlsYWJsZUNoYXJzZXRzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgVkFMVUVTLmFkZChlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBWQUxVRVMuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkuYWxpYXNlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIENoYXJTZXQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IENoYXJTZXQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgRW51bWVyYXRlZEF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhclNldChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVmYXVsdCB2YWx1ZSBhcyBwcm92aWRlZCBieSBDaGFyc2V0LgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyU2V0IGdldERlZmF1bHQoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2hhclNldChDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkubmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob29kOiBnZXQgVVMtQVNDSUkgQ2hhclNldC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNldCBnZXRBc2NpaSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGFyU2V0KFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkubmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2Q6IGdldCBVVEYtOCBDaGFyU2V0LgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyU2V0IGdldFV0ZjgoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2hhclNldChTdGFuZGFyZENoYXJzZXRzLlVURl84Lm5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbCBpZiBDaGFyU2V0IHZhbHVlcyBhcmUgYWxpYXNlcy4KKyAgICAgKiBAcGFyYW0gY3MgQ2hhclNldCB0byBjb21wYXJlIHRoZSB2YWx1ZSB0by4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgQ2hhclNldCB2YWx1ZXMgYXJlIGFsaWFzZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZXF1aXZhbGVudChDaGFyU2V0IGNzKSB7CisgICAgICAgIHJldHVybiBnZXRDaGFyc2V0KCkubmFtZSgpLmVxdWFscyhjcy5nZXRDaGFyc2V0KCkubmFtZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoaXMgZW51bWVyYXRlZCB0eXBlIHRvIGEgPGNvZGU+Q2hhcnNldDwvY29kZT4uCisgICAgICogQHJldHVybiBhIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2hhcnNldCBnZXRDaGFyc2V0KCkgeworICAgICAgICByZXR1cm4gQ2hhcnNldC5mb3JOYW1lKGdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9zc2libGUgdmFsdWVzLgorICAgICAqIEByZXR1cm4gU3RyaW5nW10gb2YgQ2hhcnNldCBuYW1lcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gVkFMVUVTLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjZXB0IGFkZGl0aW9uYWwgdmFsdWVzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICAgICAqIChzb21lIGphdmEuaW8gZW5jb2RpbmcgbmFtZXMgbm90IGF2YWlsYWJsZSBpbiBqYXZhLm5pbykKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBTdHJpbmcgcmVhbFZhbHVlID0gdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICByZWFsVmFsdWUgPSBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkubmFtZSgpOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIGZvciAoU3RyaW5nIHYgOiBBcnJheXMuYXNMaXN0KHZhbHVlLCB2YWx1ZS50b0xvd2VyQ2FzZSgpLCB2YWx1ZS50b1VwcGVyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgaWYgKFZBTFVFUy5jb250YWlucyh2KSkgeworICAgICAgICAgICAgICAgICAgIHJlYWxWYWx1ZSA9IHY7CisgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdXBlci5zZXRWYWx1ZShyZWFsVmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZS5qYXZhCmluZGV4IGQ0ZGUwMjguLjg2YWE0ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDExICsyNSwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKIC8qKgogICogQ29tbWFuZGxpbmUgb2JqZWN0cyBoZWxwIGhhbmRsaW5nIGNvbW1hbmQgbGluZXMgc3BlY2lmeWluZyBwcm9jZXNzZXMgdG8KQEAgLTU4LDE5ICs1OCwxNSBAQAogICAgIC8qKgogICAgICAqIFRoZSBhcmd1bWVudHMgb2YgdGhlIGNvbW1hbmQKICAgICAgKi8KLSAgICBwcml2YXRlIExpc3Q8QXJndW1lbnQ+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8QXJndW1lbnQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEFyZ3VtZW50PiBhcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyBleGVjdXRhYmxlID0gbnVsbDsKIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NMQUlNRVIgPQotICAgICAgICBTdHJpbmdVdGlscy5MSU5FX1NFUAotICAgICAgICArICJUaGUgXCcgY2hhcmFjdGVycyBhcm91bmQgdGhlIGV4ZWN1dGFibGUgYW5kIGFyZ3VtZW50cyBhcmUiCi0gICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgKyAibm90IHBhcnQgb2YgdGhlIGNvbW1hbmQuIgotICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NMQUlNRVIgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgIiVuVGhlICcgY2hhcmFjdGVycyBhcm91bmQgdGhlIGV4ZWN1dGFibGUgYW5kIGFyZ3VtZW50cyBhcmUlbm5vdCBwYXJ0IG9mIHRoZSBjb21tYW5kLiVuIik7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBjb21tYW5kIGxpbmUgZnJvbSBhIHN0cmluZy4KQEAgLTE4Nyw3ICsxODMsNyBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIGFyZ3VtZW50IHRvIGNvcHkgc2V0dGluZyBmcm9tCiAgICAgICAgICAqCi0gICAgICAgICAqIEBzaW5jZSBBbnQgMS45LjE0CisgICAgICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBjb3B5RnJvbShBcmd1bWVudCBvdGhlcikgewogICAgICAgICAgICAgdGhpcy5wYXJ0cyA9IG90aGVyLnBhcnRzOwpAQCAtMjAwLDggKzE5Niw3IEBACiAgICAgICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc3RyaW5ncy4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0cygpIHsKLSAgICAgICAgICAgIGlmIChwYXJ0cyA9PSBudWxsIHx8IHBhcnRzLmxlbmd0aCA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IChwcmVmaXgubGVuZ3RoKCkgPT0gMCAmJiBzdWZmaXgubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0cyA9PSBudWxsIHx8IHBhcnRzLmxlbmd0aCA9PSAwIHx8IChwcmVmaXguaXNFbXB0eSgpICYmIHN1ZmZpeC5pc0VtcHR5KCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU3RyaW5nW10gZnVsbFBhcnRzID0gbmV3IFN0cmluZ1twYXJ0cy5sZW5ndGhdOwpAQCAtMjQyLDExICsyMzcsOSBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRQb3NpdGlvbigpIHsKICAgICAgICAgICAgIGlmIChyZWFsUG9zID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgcmVhbFBvcyA9IChleGVjdXRhYmxlID09IG51bGwgPyAwIDogMSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFyZ3VtZW50IGFyZyA9IChBcmd1bWVudCkgYXJndW1lbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVhbFBvcyArPSBhcmcuZ2V0UGFydHMoKS5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWxQb3MgPSAoZXhlY3V0YWJsZSA9PSBudWxsID8gMCA6IDEpCisgICAgICAgICAgICAgICAgICAgICAgICArIChpbnQpIGFyZ3VtZW50cy5zdHJlYW0oKS5saW1pdChwb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoQXJndW1lbnQ6OmdldFBhcnRzKS5mbGF0TWFwKFN0cmVhbTo6b2YpLmNvdW50KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVhbFBvczsKICAgICAgICAgfQpAQCAtMzQ2LDcgKzMzOSw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjkuNwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEV4ZWN1dGFibGUoU3RyaW5nIGV4ZWN1dGFibGUsIGJvb2xlYW4gdHJhbnNsYXRlRmlsZVNlcGFyYXRvcikgewotICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBudWxsIHx8IGV4ZWN1dGFibGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAoZXhlY3V0YWJsZSA9PSBudWxsIHx8IGV4ZWN1dGFibGUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgdGhpcy5leGVjdXRhYmxlID0gdHJhbnNsYXRlRmlsZVNlcGFyYXRvcgpAQCAtMzY3LDggKzM2MCw4IEBACiAgICAgICogQHBhcmFtIGxpbmUgYW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGFwcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRBcmd1bWVudHMoU3RyaW5nW10gbGluZSkgewotICAgICAgICBmb3IgKFN0cmluZyBsIDogbGluZSkgewotICAgICAgICAgICAgY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShsKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYXJndW1lbnQgOiBsaW5lKSB7CisgICAgICAgICAgICBjcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKGFyZ3VtZW50KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzc3LDcgKzM3MCw3IEBACiAgICAgICogQHJldHVybiB0aGUgY29tbWFuZGxpbmUgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjb21tYW5kcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNvbW1hbmRzID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgICBhZGRDb21tYW5kVG9MaXN0KGNvbW1hbmRzLmxpc3RJdGVyYXRvcigpKTsKICAgICAgICAgcmV0dXJuIGNvbW1hbmRzLnRvQXJyYXkobmV3IFN0cmluZ1tjb21tYW5kcy5zaXplKCldKTsKICAgICB9CkBAIC00MDAsNyArMzkzLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBhcmd1bWVudHMgYXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotICAgICAgICBMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFyZ3VtZW50cy5zaXplKCkgKiAyKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Pihhcmd1bWVudHMuc2l6ZSgpICogMik7CiAgICAgICAgIGFkZEFyZ3VtZW50c1RvTGlzdChyZXN1bHQubGlzdEl0ZXJhdG9yKCkpOwogICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CiAgICAgfQpAQCAtNDI1LDYgKzQxOCw3IEBACiAgICAgICogUmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgYXMgYSBzdHJpbmcuCiAgICAgICogQHJldHVybiB0aGUgY29tbWFuZCBsaW5lLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiB0b1N0cmluZyhnZXRDb21tYW5kbGluZSgpKTsKICAgICB9CkBAIC00NzAsMTEgKzQ2NCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIC8vIHBhdGggY29udGFpbmluZyBvbmUgb3IgbW9yZSBlbGVtZW50cwogICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGFyZ3VtZW50IDogbGluZSkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgJyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHF1b3RlQXJndW1lbnQobGluZVtpXSkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChxdW90ZUFyZ3VtZW50KGFyZ3VtZW50KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwogICAgIH0KQEAgLTQ4Niw3ICs0ODAsNyBAQAogICAgICAqIEFuIGVtcHR5IG9yIG51bGwgdG9Qcm9jZXNzIHBhcmFtZXRlciByZXN1bHRzIGluIGEgemVybyBzaXplZCBhcnJheS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zbGF0ZUNvbW1hbmRsaW5lKFN0cmluZyB0b1Byb2Nlc3MpIHsKLSAgICAgICAgaWYgKHRvUHJvY2VzcyA9PSBudWxsIHx8IHRvUHJvY2Vzcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmICh0b1Byb2Nlc3MgPT0gbnVsbCB8fCB0b1Byb2Nlc3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAvL25vIGNvbW1hbmQ/IG5vIHN0cmluZwogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgICAgIH0KQEAgLTQ5Nyw3ICs0OTEsNyBAQAogICAgICAgICBmaW5hbCBpbnQgaW5Eb3VibGVRdW90ZSA9IDI7CiAgICAgICAgIGludCBzdGF0ZSA9IG5vcm1hbDsKICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodG9Qcm9jZXNzLCAiXCJcJyAiLCB0cnVlKTsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGN1cnJlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBib29sZWFuIGxhc3RUb2tlbkhhc0JlZW5RdW90ZWQgPSBmYWxzZTsKIApAQCAtNTI2LDcgKzUyMCw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiXCIiLmVxdWFscyhuZXh0VG9rKSkgewogICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGluRG91YmxlUXVvdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiICIuZXF1YWxzKG5leHRUb2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VG9rZW5IYXNCZWVuUXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFRva2VuSGFzQmVlblF1b3RlZCB8fCBjdXJyZW50Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyZW50LnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zZXRMZW5ndGgoMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTUzNyw3ICs1MzEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChsYXN0VG9rZW5IYXNCZWVuUXVvdGVkIHx8IGN1cnJlbnQubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICBpZiAobGFzdFRva2VuSGFzQmVlblF1b3RlZCB8fCBjdXJyZW50Lmxlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgcmVzdWx0LmFkZChjdXJyZW50LnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdGF0ZSA9PSBpblF1b3RlIHx8IHN0YXRlID09IGluRG91YmxlUXVvdGUpIHsKQEAgLTU1OSwxMCArNTUzLDExIEBACiAgICAgICogR2VuZXJhdGUgYSBkZWVwIGNsb25lIG9mIHRoZSBjb250YWluZWQgb2JqZWN0LgogICAgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGUgY29udGFpbmVkIG9iamVjdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDb21tYW5kbGluZSBjID0gKENvbW1hbmRsaW5lKSBzdXBlci5jbG9uZSgpOwotICAgICAgICAgICAgYy5hcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0PEFyZ3VtZW50Pihhcmd1bWVudHMpOworICAgICAgICAgICAgYy5hcmd1bWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oYXJndW1lbnRzKTsKICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CkBAIC02NTMsOSArNjQ4LDcgQEAKICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIkV4ZWN1dGluZyBcJyIpOwotICAgICAgICBidWYuYXBwZW5kKGFyZ3NbMF0pOwotICAgICAgICBidWYuYXBwZW5kKCJcJyIpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJFeGVjdXRpbmcgXCciKS5hcHBlbmQoYXJnc1swXSkuYXBwZW5kKCJcJyIpOwogICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICBidWYuYXBwZW5kKCIgd2l0aCAiKTsKICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZGVzY3JpYmVBcmd1bWVudHMoYXJncywgMSkpOwpAQCAtNjkwLDE0ICs2ODMsMTAgQEAKICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA8PSBvZmZzZXQpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigiYXJndW1lbnQiKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gb2Zmc2V0KSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKCJzIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmLmFwcGVuZCgiOiIpLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJhcmd1bWVudCVzOiVuIiwgYXJncy5sZW5ndGggPiBvZmZzZXQgPyAicyIgOiAiIikpOwogICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiXCciKS5hcHBlbmQoYXJnc1tpXSkuYXBwZW5kKCJcJyIpCi0gICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmdVdGlscy5MSU5FX1NFUCk7CisgICAgICAgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlwnJXNcJyVuIiwgYXJnc1tpXSkpOwogICAgICAgICB9CiAgICAgICAgIGJ1Zi5hcHBlbmQoRElTQ0xBSU1FUik7CiAgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lSmF2YS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEKaW5kZXggMTc3MWUzYS4uMWIyNTg3ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CiAKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKQEAgLTMxLDcgKzMwLDcgQEAKIAogLyoqCiAgKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgSmF2YSBjb21tYW5kIGxpbmUgdGhhdCBpcwotICogYSBjb21wb3NpdGUgb2YgMiA8dHQ+Q29tbWFuZGxpbmU8L3R0PnMuIE9uZSBpcyB1c2VkIGZvciB0aGUKKyAqIGEgY29tcG9zaXRlIG9mIDIgPGNvZGU+Q29tbWFuZGxpbmU8L2NvZGU+cy4gT25lIGlzIHVzZWQgZm9yIHRoZQogICogdm0vb3B0aW9ucyBhbmQgb25lIGZvciB0aGUgY2xhc3NuYW1lL2FyZ3VtZW50cy4gSXQgcHJvdmlkZXMKICAqIHNwZWNpZmljIG1ldGhvZHMgZm9yIGEgSmF2YSBjb21tYW5kIGxpbmUuCiAgKgpAQCAtODIsNyArODEsNyBAQAogICAgICAgICAvKiogdGhlIHN5c3RlbSBwcm9wZXJ0aWVzLiAqLwogICAgICAgICBQcm9wZXJ0aWVzIHN5cyA9IG51bGw7CiAgICAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCi0gICAgICAgIHByaXZhdGUgVmVjdG9yPFByb3BlcnR5U2V0PiBwcm9wZXJ0eVNldHMgPSBuZXcgVmVjdG9yPFByb3BlcnR5U2V0PigpOworICAgICAgICBwcml2YXRlIFZlY3RvcjxQcm9wZXJ0eVNldD4gcHJvcGVydHlTZXRzID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEdldCB0aGUgcHJvcGVydGllcyBhcyBhbiBhcnJheTsgdGhpcyBpcyBhbiBvdmVycmlkZSBvZiB0aGUKQEAgLTkwLDE1ICs4OSwxNSBAQAogICAgICAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBkZWZpbml0aW9uczsgbWF5IGJlIG51bGwuCiAgICAgICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZWZpbml0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkZWZpbml0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKICAgICAgICAgICAgIGFkZERlZmluaXRpb25zVG9MaXN0KGRlZmluaXRpb25zLmxpc3RJdGVyYXRvcigpKTsKLSAgICAgICAgICAgIGlmIChkZWZpbml0aW9ucy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGRlZmluaXRpb25zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgU3RyaW5nW2RlZmluaXRpb25zLnNpemUoKV0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmluaXRpb25zLnRvQXJyYXkobmV3IFN0cmluZ1tkZWZpbml0aW9ucy5zaXplKCldKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTEzLDExICsxMTIsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydHlTZXRQcm9wZXJ0aWVzID0gbWVyZ2VQcm9wZXJ0eVNldHMoKTsKLSAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4gZSA9IHByb3BlcnR5U2V0UHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgICAgICAgICAgIGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwcm9wZXJ0eVNldFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLSAgICAgICAgICAgICAgICBsaXN0SXQuYWRkKCItRCIgKyBrZXkgKyAiPSIgKyB2YWx1ZSk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBwcm9wZXJ0eVNldFByb3BlcnRpZXMuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7CisgICAgICAgICAgICAgICAgbGlzdEl0LmFkZCgiLUQiICsga2V5ICsgIj0iICsgcHJvcGVydHlTZXRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE0MCwxMCArMTM2LDkgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgc3lzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIGZvciAoRW51bWVyYXRpb248Pz4gZSA9IHN5cy5wcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBzeXMuc3RyaW5nUHJvcGVydHlOYW1lcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHN5cy5nZXRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwLnB1dChuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xODIsNiArMTc3LDcgQEAKICAgICAgICAgICogQGV4Y2VwdGlvbiBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBmb3Igc2lnbmF0dXJlLgogICAgICAgICAgKi8KICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgU3lzUHJvcGVydGllcyBjID0gKFN5c1Byb3BlcnRpZXMpIHN1cGVyLmNsb25lKCk7CkBAIC0zMjksNyArMzI1LDcgQEAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGphciB0byBiZSBydW4uCiAgICAgICogQHJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIGphciBmaWxlIHRvIHJ1biB2aWEgLWphciBvcHRpb24KLSAgICAgKiBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIGphciB0byBydW4uCisgICAgICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gamFyIHRvIHJ1bi4KICAgICAgKiBAc2VlICNnZXRDbGFzc25hbWUoKQogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmFyKCkgewpAQCAtMzU2LDcgKzM1Miw3IEBACiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGJlIHJ1bi4KLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBydW4gb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBubyBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBydW4gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gY2xhc3MuCiAgICAgICogQHNlZSAjZ2V0SmFyKCkKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzbmFtZSgpIHsKQEAgLTM2NiwxMiArMzYyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCk7CiAgICAgICAgICAgICAgICAgY2FzZSBNT0RVTEU6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUNsYXNzRnJvbU1vZHVsZUNsYXNzUGFpcihqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogU2V0IHRoZSBzb3VyY2UtZmlsZSwgdG8gZXhlY3V0ZSBhcyBzaW5nbGUgZmlsZSBzb3VyY2UgcHJvZ3JhbXMsIGEgZmVhdHVyZSwgYXZhaWxhYmxlCisgICAgICogc2luY2UgSmF2YSAxMS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIFRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC41CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U291cmNlRmlsZShmaW5hbCBTdHJpbmcgc291cmNlRmlsZSkgeworICAgICAgICB0aGlzLmV4ZWN1dGFibGVUeXBlID0gRXhlY3V0YWJsZVR5cGUuU09VUkNFX0ZJTEU7CisgICAgICAgIGphdmFDb21tYW5kLnNldEV4ZWN1dGFibGUoc291cmNlRmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSBzb3VyY2UtZmlsZSB0byBleGVjdXRlLCBpZiB0aGlzIGNvbW1hbmQgbGluZSBoYXMKKyAgICAgKiBiZWVuIHtAbGluayAjc2V0U291cmNlRmlsZShTdHJpbmcpIGNvbmZpZ3VyZWQgZm9yIHNpbmdsZSBmaWxlIHNvdXJjZSBwcm9ncmFtCisgICAgICogZXhlY3V0aW9ufS4gRWxzZSByZXR1cm5zIG51bGwuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZUZpbGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dGFibGVUeXBlID09IEV4ZWN1dGFibGVUeXBlLlNPVVJDRV9GSUxFID8gdGhpcy5qYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCkgOiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgbW9kdWxlIHRvIGV4ZWN1dGUuCiAgICAgICogQHBhcmFtIG1vZHVsZSAgdGhlIG1vZHVsZSBuYW1lLgogICAgICAqIEBzaW5jZSAxLjkuNwpAQCAtMzkyLDYgKzQxMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGphdmFDb21tYW5kLnNldEV4ZWN1dGFibGUoY3JlYXRlTW9kdWxlQ2xhc3NQYWlyKG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUNsYXNzRnJvbU1vZHVsZUNsYXNzUGFpcihqYXZhQ29tbWFuZC5nZXRFeGVjdXRhYmxlKCkpKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGV4ZWN1dGFibGVUeXBlID0gRXhlY3V0YWJsZVR5cGUuTU9EVUxFOwpAQCAtMzk5LDcgKzQxOSw3IEBACiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSBydW4uCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHJ1biBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gcnVuIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1vZHVsZS4KICAgICAgKiBAc2VlICNnZXRKYXIoKQogICAgICAqIEBzZWUgI2dldENsYXNzbmFtZSgpCiAgICAgICogQHNpbmNlIDEuOS43CkBAIC00NzYsNyArNDk2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZGxpbmUoKSB7CiAgICAgICAgIC8vY3JlYXRlIHRoZSBsaXN0Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21tYW5kcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvbW1hbmRzID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgICAvL2ZpbGwgaXQKICAgICAgICAgYWRkQ29tbWFuZHNUb0xpc3QoY29tbWFuZHMubGlzdEl0ZXJhdG9yKCkpOwogICAgICAgICAvL2NvbnZlcnQgdG8gYW4gYXJyYXkKQEAgLTUzNiw5ICs1NTYsMTEgQEAKICAgICAgICAgfSBlbHNlIGlmIChleGVjdXRhYmxlVHlwZSA9PSBFeGVjdXRhYmxlVHlwZS5NT0RVTEUpIHsKICAgICAgICAgICAgIGxpc3RJdGVyYXRvci5hZGQoIi1tIik7CiAgICAgICAgIH0KLSAgICAgICAgLy8gdGhpcyBpcyB0aGUgY2xhc3NuYW1lIHRvIHJ1biBhcyB3ZWxsIGFzIGl0cyBhcmd1bWVudHMuCisgICAgICAgIC8vIHRoaXMgaXMgdGhlIGNsYXNzbmFtZS9zb3VyY2UtZmlsZSB0byBydW4gYXMgd2VsbCBhcyBpdHMgYXJndW1lbnRzLgogICAgICAgICAvLyBpbiBjYXNlIG9mIEV4ZWN1dGFibGVUeXBlLkpBUiwgdGhlIGV4ZWN1dGFibGUgaXMgYSBqYXIgZmlsZSwKLSAgICAgICAgLy8gaW4gY2FzZSBvZiBFeGVjdXRhYmxlVHlwZS5NT0RVTEUsIHRoZSBleGVjdXRhYmxlIGlzIGEgbW9kdWxlIG5hbWUsIHBvcnRlbnRpYWxseSBpbmNsdWRpbmcgYSBjbGFzcyBuYW1lLgorICAgICAgICAvLyBpbiBjYXNlIG9mIEV4ZWN1dGFibGVUeXBlLk1PRFVMRSwgdGhlIGV4ZWN1dGFibGUgaXMgYSBtb2R1bGUgbmFtZSwgcG90ZW50aWFsbHkgaW5jbHVkaW5nIGEgY2xhc3MgbmFtZS4KKyAgICAgICAgLy8gaW4gY2FzZSBvZiBFeGVjdXRhYmxlVHlwZS5TT1VSQ0VfRklMRSwgdGhlIGV4ZWN1dGFibGUgaXMgYSBKYXZhIHNvdXJjZSBmaWxlIChlbmRpbmcgaW4gLmphdmEpIG9yIGEgc2hlYmFuZworICAgICAgICAvLyBmaWxlIGNvbnRhaW5pbmcgSmF2YSBzb3VyY2UKICAgICAgICAgamF2YUNvbW1hbmQuYWRkQ29tbWFuZFRvTGlzdChsaXN0SXRlcmF0b3IpOwogICAgIH0KIApAQCAtNTU1LDYgKzU3Nyw3IEBACiAgICAgICogR2V0IGEgc3RyaW5nIGRlc2NyaXB0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIGNvbW1hbmQgbGluZSBhcyBhIHN0cmluZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gQ29tbWFuZGxpbmUudG9TdHJpbmcoZ2V0Q29tbWFuZGxpbmUoKSk7CiAgICAgfQpAQCAtNjAzLDkgKzYyNiwxMCBAQAogICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIGphdmEgY29tbWFuZCBsaW5lLgogICAgICAqIEBzZWUgI2dldENvbW1hbmRsaW5lKCkKICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSAxLjcuCi0gICAgICogICAgICAgICAgICAgUGxlYXNlIGRvbnQgdXNlIHRoaXMsIGl0IGVmZmVjdGl2ZWx5IGNyZWF0ZXMgdGhlCisgICAgICogICAgICAgICAgICAgUGxlYXNlIGRvbid0IHVzZSB0aGlzLCBpdCBlZmZlY3RpdmVseSBjcmVhdGVzIHRoZQogICAgICAqICAgICAgICAgICAgIGVudGlyZSBjb21tYW5kLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBpbnQgc2l6ZSA9IGdldEFjdHVhbFZNQ29tbWFuZCgpLnNpemUoKSArIGphdmFDb21tYW5kLnNpemUoKQogICAgICAgICAgICAgKyBzeXNQcm9wZXJ0aWVzLnNpemUoKTsKQEAgLTcxNCw2ICs3MzgsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW55dGhpbmcgd2VudCB3cm9uZy4KICAgICAgKiBAdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIG5ldmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSAoQ29tbWFuZGxpbmVKYXZhKSBzdXBlci5jbG9uZSgpOwpAQCAtNzU1LDggKzc4MCw4IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXZlQ2xhc3NwYXRoKCkgewotICAgICAgICBQYXRoIGZ1bGxDbGFzc3BhdGggPSBjbGFzc3BhdGggIT0gbnVsbCA/IGNsYXNzcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpIDogbnVsbDsKLSAgICAgICAgcmV0dXJuIGZ1bGxDbGFzc3BhdGggIT0gbnVsbCAmJiBmdWxsQ2xhc3NwYXRoLnRvU3RyaW5nKCkudHJpbSgpLmxlbmd0aCgpID4gMDsKKyAgICAgICAgUGF0aCBmdWxsQ2xhc3NwYXRoID0gY2xhc3NwYXRoID09IG51bGwgPyBudWxsIDogY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CisgICAgICAgIHJldHVybiBmdWxsQ2xhc3NwYXRoICE9IG51bGwgJiYgIWZ1bGxDbGFzc3BhdGgudG9TdHJpbmcoKS50cmltKCkuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzgyLDcgKzgwNyw3IEBACiAgICAgICAgIFBhdGggZnVsbENsYXNzcGF0aCA9IG1vZHVsZXBhdGggIT0gbnVsbAogICAgICAgICAgICAgICAgID8gbW9kdWxlcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpIDogbnVsbDsKICAgICAgICAgcmV0dXJuIGZ1bGxDbGFzc3BhdGggIT0gbnVsbAotICAgICAgICAgICAgJiYgZnVsbENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICAmJiAhZnVsbENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OTIsOCArODE3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXZlVXBncmFkZW1vZHVsZXBhdGgoKSB7CiAgICAgICAgIFBhdGggZnVsbENsYXNzcGF0aCA9IHVwZ3JhZGVtb2R1bGVwYXRoICE9IG51bGwKLSAgICAgICAgICAgID8gdXBncmFkZW1vZHVsZXBhdGguY29uY2F0U3lzdGVtQ2xhc3NwYXRoKCJpZ25vcmUiKSA6IG51bGw7Ci0gICAgICAgIHJldHVybiBmdWxsQ2xhc3NwYXRoICE9IG51bGwgJiYgZnVsbENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5sZW5ndGgoKSA+IDA7CisgICAgICAgICAgICAgICAgPyB1cGdyYWRlbW9kdWxlcGF0aC5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImlnbm9yZSIpIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIGZ1bGxDbGFzc3BhdGggIT0gbnVsbCAmJiAhZnVsbENsYXNzcGF0aC50b1N0cmluZygpLnRyaW0oKS5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MjgsNyArODUzLDcgQEAKICAgICAgKiBAc2luY2UgMS43CiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvbmVWbSgpIHsKLSAgICAgICAgcmV0dXJuIGNsb25lVm0gfHwgInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImFudC5idWlsZC5jbG9uZXZtIikpOworICAgICAgICByZXR1cm4gY2xvbmVWbSB8fCBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImFudC5idWlsZC5jbG9uZXZtIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtODg2LDYgKzkxMSwxMSBAQAogICAgICAgICAvKioKICAgICAgICAgICogTW9kdWxlIGV4ZWN1dGlvbi4KICAgICAgICAgICovCi0gICAgICAgIE1PRFVMRQorICAgICAgICBNT0RVTEUsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNvdXJjZSBmaWxlIChpbnRyb2R1Y2VkIGluIEphdmEgMTEpCisgICAgICAgICAqLworICAgICAgICBTT1VSQ0VfRklMRSwKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21wYXJpc29uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21wYXJpc29uLmphdmEKaW5kZXggYTA1N2QwZC4uMjhkN2RiYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tcGFyaXNvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbXBhcmlzb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RURExvY2F0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EVERMb2NhdGlvbi5qYXZhCmluZGV4IDlmZGVlZTIuLmIyNWI5ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RURExvY2F0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRFRETG9jYXRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDcgKzIxLDcgQEAKICAqIDxwPkhlbHBlciBjbGFzcyB0byBoYW5kbGUgdGhlIERURCBuZXN0ZWQgZWxlbWVudC4gIEluc3RhbmNlcyBvZgogICogdGhpcyBjbGFzcyBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5QVUJMSUM8L2NvZGU+IGNhdGFsb2cgZW50cnkgdHlwZQogICogb2YgdGhlIDxhCi0gKiBocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy0yMDAxLTA4LTA2Lmh0bWwiPgorICogaHJlZj0iaHR0cHM6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CiAgKiBPQVNJUyAiT3BlbiBDYXRhbG9nIiBzdGFuZGFyZDwvYT4uPC9wPgogICoKICAqIDxwPlBvc3NpYmxlIEZ1dHVyZSBFbmhhbmNlbWVudDogQnJpbmcgdGhlIEFudCBlbGVtZW50IG5hbWUgaW50bwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGF0YVR5cGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RhdGFUeXBlLmphdmEKaW5kZXggZjQzMDZhZi4uMWU0MjQ1YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGF0YVR5cGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EYXRhVHlwZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIGlmIChjaGVja2VkIHx8ICFpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShuZXcgSWRlbnRpdHlTdGFjazxPYmplY3Q+KHRoaXMpLCBwKTsKKyAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShuZXcgSWRlbnRpdHlTdGFjazw+KHRoaXMpLCBwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE5NiwyNCArMTk2LDQ0IEBACiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQogICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSA8VD4gcmVxdWlyZWQgcmVmZXJlbmNlIHR5cGUKICAgICAgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlZmVyZW5jZSBpcyBpbnZhbGlkIChjaXJjdWxhciByZWYsIHdyb25nIGNsYXNzLCBldGMpLgogICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldENoZWNrZWRSZWYoQ2xhc3MpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDaGVja2VkUmVmKCkgeworICAgIEBEZXByZWNhdGVkCisgICAgcHJvdGVjdGVkIDxUPiBUIGdldENoZWNrZWRSZWYoKSB7CiAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKGdldFByb2plY3QoKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUGVyZm9ybXMgdGhlIGNoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGFuZCByZXR1cm5zIHRoZQogICAgICAqIHJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEBwYXJhbSA8VD4gcmVxdWlyZWQgcmVmZXJlbmNlIHR5cGUKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWRDbGFzcyB0aGUgY2xhc3MgdGhhdCB0aGlzIHJlZmVyZW5jZSBzaG91bGQgYmUgYSBzdWJjbGFzcyBvZi4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlZmVyZW5jZSBpcyBpbnZhbGlkIChjaXJjdWxhciByZWYsIHdyb25nIGNsYXNzLCBldGMpLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CisgICAgICovCisgICAgcHJvdGVjdGVkIDxUPiBUIGdldENoZWNrZWRSZWYoZmluYWwgQ2xhc3M8VD4gcmVxdWlyZWRDbGFzcykgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihyZXF1aXJlZENsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSwgZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybnMgdGhlCisgICAgICogcmVmZXJlbmNlZCBvYmplY3QuCisgICAgICogQHBhcmFtIDxUPiByZXF1aXJlZCByZWZlcmVuY2UgdHlwZQogICAgICAqIEBwYXJhbSBwIHRoZSBBbnQgUHJvamVjdCBpbnN0YW5jZSBhZ2FpbnN0IHdoaWNoIHRvIHJlc29sdmUgcmVmZXJlbmNlcy4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlZmVyZW5jZSBpcyBpbnZhbGlkIChjaXJjdWxhciByZWYsIHdyb25nIGNsYXNzLCBldGMpLgogICAgICAqIEBzaW5jZSBBbnQgMS43CisgICAgICogQGRlcHJlY2F0ZWQgdXNlIGdldENoZWNrZWRSZWYoQ2xhc3MpCiAgICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRDaGVja2VkUmVmKFByb2plY3QgcCkgewotICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihnZXRDbGFzcygpLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CisgICAgQERlcHJlY2F0ZWQKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcm90ZWN0ZWQgPFQ+IFQgZ2V0Q2hlY2tlZFJlZihQcm9qZWN0IHApIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKENsYXNzPFQ+KSBnZXRDbGFzcygpLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTAsMTggKzI3MCwxNSBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBQcm9qZWN0IHNwZWNpZmllZCIpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UocHJvamVjdCk7Ci0gICAgICAgIE9iamVjdCBvID0gcmVmLmdldFJlZmVyZW5jZWRPYmplY3QocHJvamVjdCk7Ci0gICAgICAgIGlmICghKHJlcXVpcmVkQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSkgewotICAgICAgICAgICAgbG9nKCJDbGFzcyAiICsgZGlzcGxheU5hbWUoby5nZXRDbGFzcygpKQotICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgc3ViY2xhc3Mgb2YgIgotICAgICAgICAgICAgICAgICAgICArIGRpc3BsYXlOYW1lKHJlcXVpcmVkQ2xhc3MpLAotICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSByZWYuZ2V0UmVmSWQoKSArICIgZG9lc25cJ3QgZGVub3RlIGEgIiArIGRhdGFUeXBlTmFtZTsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgICAgICBUIG8gPSByZWYuZ2V0UmVmZXJlbmNlZE9iamVjdChwcm9qZWN0KTsKKyAgICAgICAgaWYgKHJlcXVpcmVkQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgfQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgZmluYWwgVCByZXN1bHQgPSAoVCkgbzsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgbG9nKCJDbGFzcyAiICsgZGlzcGxheU5hbWUoby5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIHN1YmNsYXNzIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZGlzcGxheU5hbWUocmVxdWlyZWRDbGFzcyksCisgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihyZWYuZ2V0UmVmSWQoKSArICIgZG9lc25cJ3QgZGVub3RlIGEgIiArIGRhdGFUeXBlTmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNDQsNiArMzYxLDcgQEAKICAgICAgKiBCYXNpYyBEYXRhVHlwZSB0b1N0cmluZygpLgogICAgICAqIEByZXR1cm4gdGhpcyBEYXRhVHlwZSBmb3JtYXR0ZWQgYXMgYSBTdHJpbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgU3RyaW5nIGQgPSBnZXREZXNjcmlwdGlvbigpOwogICAgICAgICByZXR1cm4gZCA9PSBudWxsID8gZ2V0RGF0YVR5cGVOYW1lKCkgOiBnZXREYXRhVHlwZU5hbWUoKSArICIgIiArIGQ7CkBAIC0zNTQsNiArMzcyLDcgQEAKICAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgRGF0YVR5cGUuCiAgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIERhdGFUeXBlIGR0ID0gKERhdGFUeXBlKSBzdXBlci5jbG9uZSgpOwogICAgICAgICBkdC5zZXREZXNjcmlwdGlvbihnZXREZXNjcmlwdGlvbigpKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Rlc2NyaXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EZXNjcmlwdGlvbi5qYXZhCmluZGV4IGQyM2YxZDguLmIzYzI2OTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Rlc2NyaXB0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDggKzE3LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOwpAQCAtOTAsMjcgKzkxLDIxIEBACiAgICAgICAgIGlmICh0ID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBmb3IgKFRhc2sgdGFzayA6IGZpbmRFbGVtZW50SW5UYXJnZXQocHJvamVjdCwgdCwgImRlc2NyaXB0aW9uIikpIHsKLSAgICAgICAgICAgIGlmICghKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVlID0gKChVbmtub3duRWxlbWVudCkgdGFzayk7Ci0gICAgICAgICAgICBTdHJpbmcgZGVzY0NvbXAgPSB1ZS5nZXRXcmFwcGVyKCkuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoZGVzY0NvbXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFwcGVuZChwcm9qZWN0LnJlcGxhY2VQcm9wZXJ0aWVzKGRlc2NDb21wKSk7CisgICAgICAgIGZvciAoVGFzayB0YXNrIDogZmluZEVsZW1lbnRJblRhcmdldCh0LCAiZGVzY3JpcHRpb24iKSkgeworICAgICAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBVbmtub3duRWxlbWVudCkgeworICAgICAgICAgICAgICAgIFVua25vd25FbGVtZW50IHVlID0gKFVua25vd25FbGVtZW50KSB0YXNrOworICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjQ29tcCA9IHVlLmdldFdyYXBwZXIoKS5nZXRUZXh0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzY0NvbXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmQocHJvamVjdC5yZXBsYWNlUHJvcGVydGllcyhkZXNjQ29tcCkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8VGFzaz4gZmluZEVsZW1lbnRJblRhcmdldChQcm9qZWN0IHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0IHQsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8VGFzaz4gZWxlbXMgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0gICAgICAgIGZvciAoVGFzayB0YXNrIDogdC5nZXRUYXNrcygpKSB7Ci0gICAgICAgICAgICBpZiAobmFtZS5lcXVhbHModGFzay5nZXRUYXNrTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIGVsZW1zLmFkZCh0YXNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZWxlbXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxUYXNrPiBmaW5kRWxlbWVudEluVGFyZ2V0KFRhcmdldCB0LCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKHQuZ2V0VGFza3MoKSkKKyAgICAgICAgICAgIC5maWx0ZXIodGFzayAtPiBuYW1lLmVxdWFscyh0YXNrLmdldFRhc2tOYW1lKCkpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EaXJTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldC5qYXZhCmluZGV4IDM1YzAyMzEuLmEwMmQ2MDUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNyArMjAsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2VJdGVyYXRvcjsKIAogLyoqCkBAIC01MSwxMiArNTEsMTIgQEAKICAgICAgKiBhcyB0aGlzIG9uZS4KICAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgZGlyc2V0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChEaXJTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5jbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuY2xvbmUoKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY0LDEyICs2NCwxMyBAQAogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKERpclNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXRlcmF0b3IoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yKGdldFByb2plY3QoKSwgZ2V0RGlyKGdldFByb2plY3QoKSksCi0gICAgICAgICAgICBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSkuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpKTsKKyAgICAgICAgICAgIGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzcsMTEgKzc4LDEyIEBACiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBzaXplKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRGlyU2V0KSBnZXRSZWYoZ2V0UHJvamVjdCgpKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRGlyc0NvdW50KCk7CisgICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWREaXJzQ291bnQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg5LDYgKzkxLDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaW5kaWNhdGluZyB0aGF0IGFsbCBlbGVtZW50cyB3aWxsIGJlIEZpbGVSZXNvdXJjZXMuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC05OCwxOCArMTAxLDE4IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvZiBpbmNsdWRlZCBkaXJlY3Rvcmllcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOwotICAgICAgICBTdHJpbmdbXSBkaXJzID0gZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuam9pbigiOyIsIGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZERpcmVjdG9yaWVzKCkpOworICAgIH0KIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnOycpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKGRpcnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBYnN0cmFjdEZpbGVTZXQgZ2V0UmVmKFByb2plY3QgcCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihEaXJTZXQuY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpLCBwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERpclNldCBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKERpclNldC5jbGFzcyk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlLmphdmEKaW5kZXggMTg2MDNiMi4uNjZiZjk4ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0VudW1lcmF0ZWRBdHRyaWJ1dGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICAgKiBUaGlzIGlzIHRoZSBvbmx5IG1ldGhvZCBhIHN1YmNsYXNzIG5lZWRzIHRvIGltcGxlbWVudC4KICAgICAgKgogICAgICAqIEByZXR1cm4gYW4gYXJyYXkgaG9sZGluZyBhbGwgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBlbnVtZXJhdGlvbi4KLSAgICAgKiBUaGUgb3JkZXIgb2YgZWxlbWVudHMgbXVzdCBiZSBmaXhlZCBzbyB0aGF0IDx0dD5pbmRleE9mVmFsdWUoU3RyaW5nKTwvdHQ+CisgICAgICogVGhlIG9yZGVyIG9mIGVsZW1lbnRzIG11c3QgYmUgZml4ZWQgc28gdGhhdCA8Y29kZT5pbmRleE9mVmFsdWUoU3RyaW5nKTwvY29kZT4KICAgICAgKiBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIGluZGV4IGZvciB0aGUgc2FtZSB2YWx1ZS4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0VmFsdWVzKCk7CkBAIC02Myw4ICs2Myw4IEBACiAgICAgICogQHJldHVybiAgICAgICAgICAgICAgICAgIENvbmZpZ3VyZWQgRUEKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uICAgSWYgdGhlIGNsYXNzIGNvdWxkIG5vdCBiZSBmb3VuZCBvciB0aGUgdmFsdWUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHZhbGlkIGZvciB0aGUgZ2l2ZW4gRUEtY2xhc3MuCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE0ODMxIj4KLSAgICAgKiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE0ODMxPC9hPgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTQ4MzEiPgorICAgICAqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE0ODMxPC9hPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgRW51bWVyYXRlZEF0dHJpYnV0ZSBnZXRJbnN0YW5jZSgKICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGU+IGNsYXp6LApAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJZb3UgaGF2ZSB0byBwcm92aWRlIGEgc3ViY2xhc3MgZnJvbSBFbnVtZXJhdGVkQXR0cmlidXRlIGFzIGNsYXp6LXBhcmFtZXRlci4iKTsKICAgICAgICAgfQotICAgICAgICBFbnVtZXJhdGVkQXR0cmlidXRlIGVhID0gbnVsbDsKKyAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSBlYTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVhID0gY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGF0dHJpYnV0ZQogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCBpZHggPSBpbmRleE9mVmFsdWUodmFsdWUpOwogICAgICAgICBpZiAoaWR4ID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24odmFsdWUgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSIpOwpAQCAtMTQ2LDYgKzE0Niw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgZm9ybSBvZiB0aGUgdmFsdWUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW52aXJvbm1lbnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Vudmlyb25tZW50LmphdmEKaW5kZXggNWJjNmQ3OS4uMTUyODFhMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW52aXJvbm1lbnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnZpcm9ubWVudC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTE1LDkgKzExNSw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoa2V5LnRyaW0oKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIj0iKS5hcHBlbmQodmFsdWUudHJpbSgpKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGtleS50cmltKCkgKyAiPSIgKyB2YWx1ZS50cmltKCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTEyNiw4ICsxMjQsOCBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB7CiAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigia2V5IGFuZCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCAiCi0gICAgICAgICAgICAgICAgICAgICsgImZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAia2V5IGFuZCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzLiIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTM2LDcgKzEzNCw3IEBACiAgICAgICogY29uc3RydWN0b3IKICAgICAgKi8KICAgICBwdWJsaWMgRW52aXJvbm1lbnQoKSB7Ci0gICAgICAgIHZhcmlhYmxlcyA9IG5ldyBWZWN0b3I8VmFyaWFibGU+KCk7CisgICAgICAgIHZhcmlhYmxlcyA9IG5ldyBWZWN0b3I8PigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU1LDE0ICsxNTMsMTAgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGFueSB2YXJpYWJsZSBpcyBtaXNjb25maWd1cmVkCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhcmlhYmxlcygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICh2YXJpYWJsZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKHZhcmlhYmxlcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbdmFyaWFibGVzLnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSAoKFZhcmlhYmxlKSB2YXJpYWJsZXMuZWxlbWVudEF0KGkpKS5nZXRDb250ZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHZhcmlhYmxlcy5zdHJlYW0oKS5tYXAoVmFyaWFibGU6OmdldENvbnRlbnQpLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3QuamF2YQppbmRleCBjMzZiYTZjLi5kZjU0MDU0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVMaXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNyw3ICszNyw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBGaWxlTGlzdCBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uIHsKIAotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZpbGVuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgRmlsZSBkaXI7CiAKICAgICAvKioKQEAgLTY4LDggKzY4LDkgQEAKICAgICAgKiBAcGFyYW0gciB0aGUgcmVmZXJlbmNlIHRvIGFub3RoZXIgZmlsZWxpc3QuCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICgoZGlyICE9IG51bGwpIHx8IChmaWxlbmFtZXMuc2l6ZSgpICE9IDApKSB7CisgICAgICAgIGlmIChkaXIgIT0gbnVsbCB8fCAhZmlsZW5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQogICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKQEAgLTEwNSw3ICsxMDYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEZpbGVzKFN0cmluZyBmaWxlbmFtZXMpIHsKICAgICAgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZCgpOwotICAgICAgICBpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgZmlsZW5hbWVzLmxlbmd0aCgpID4gMCkgeworICAgICAgICBpZiAoZmlsZW5hbWVzICE9IG51bGwgJiYgIWZpbGVuYW1lcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKAogICAgICAgICAgICAgICAgIGZpbGVuYW1lcywgIiwgXHRcblxyXGYiLCBmYWxzZSk7CiAgICAgICAgICAgICB3aGlsZSAodG9rLmhhc01vcmVUb2tlbnMoKSkgewpAQCAtMTI4LDcgKzEyOSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIGRpcmVjdG9yeSBzcGVjaWZpZWQgZm9yIGZpbGVsaXN0LiIpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZpbGVuYW1lcy5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoZmlsZW5hbWVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBmaWxlcyBzcGVjaWZpZWQgZm9yIGZpbGVsaXN0LiIpOwogICAgICAgICB9CiAKQEAgLTEzNiwxNiArMTM3LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBQZXJmb3JtcyB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybnMgdGhlCi0gICAgICogcmVmZXJlbmNlZCBGaWxlTGlzdC4KLSAgICAgKiBAcGFyYW0gcCB0aGUgY3VycmVudCBwcm9qZWN0Ci0gICAgICogQHJldHVybiB0aGUgRmlsZUxpc3QgcmVwcmVzZW50ZWQgYnkgYSByZWZlcmVuY2VkIGZpbGVsaXN0LgotICAgICAqLwotICAgIHByb3RlY3RlZCBGaWxlTGlzdCBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIHJldHVybiAoRmlsZUxpc3QpIGdldENoZWNrZWRSZWYocCk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogSW5uZXIgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgJmx0O2ZpbGUmZ3Q7IG5lc3RlZCBlbGVtZW50LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZU5hbWUgewpAQCAtMTg3LDkgKzE3OCwxMCBAQAogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRSZWYoZ2V0UHJvamVjdCgpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXRQcm9qZWN0KCksIGRpciwKICAgICAgICAgICAgIGZpbGVuYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbZmlsZW5hbWVzLnNpemUoKV0pKTsKQEAgLTIwMCw5ICsxOTIsMTAgQEAKICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGaWxlTGlzdCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZpbGVuYW1lcy5zaXplKCk7CiAgICAgfQpAQCAtMjEyLDggKzIwNSwxNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIGVsZW1lbnRzIHdpbGwgYmUgRmlsZVJlc291cmNlcy4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIHByaXZhdGUgRmlsZUxpc3QgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihGaWxlTGlzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlTGlzdCBnZXRSZWYoUHJvamVjdCBwKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEZpbGVMaXN0LmNsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0LmphdmEKaW5kZXggYzZkMjEyNy4uN2UwMWQxMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZUl0ZXJhdG9yOwogCiAvKioKQEAgLTQ5LDEyICs1MCwxMiBAQAogICAgICAqIGFzIHRoaXMgb25lLgogICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCBmaWxlc2V0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5jbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuY2xvbmUoKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwZXIuY2xvbmUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYyLDEyICs2MywxMyBAQAogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXRQcm9qZWN0KCksIGdldERpcihnZXRQcm9qZWN0KCkpLAotICAgICAgICAgICAgZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpLmdldEluY2x1ZGVkRmlsZXMoKSk7CisgICAgICAgICAgICBnZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWRGaWxlcygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc1LDExICs3NywxMiBAQAogICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIGFzIGludC4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuc2l6ZSgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlTY2FubmVyKGdldFByb2plY3QoKSkuZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCk7CisgICAgICAgIHJldHVybiBnZXREaXJlY3RvcnlTY2FubmVyKCkuZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04Nyw4ICs5MCwxOCBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIGVsZW1lbnRzIHdpbGwgYmUgRmlsZVJlc291cmNlcy4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBYnN0cmFjdEZpbGVTZXQgZ2V0UmVmKFByb2plY3QgcCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihGaWxlU2V0LmNsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGaWxlU2V0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRmlsZVNldC5jbGFzcyk7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJDaGFpbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyQ2hhaW4uamF2YQppbmRleCA2YmFkNjAyLi5jMDMwMDJkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJDaGFpbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlckNoYWluLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Niw3ICs0Niw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBGaWx0ZXJDaGFpbiBleHRlbmRzIERhdGFUeXBlIHsKIAotICAgIHByaXZhdGUgVmVjdG9yPE9iamVjdD4gZmlsdGVyUmVhZGVycyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOworICAgIHByaXZhdGUgVmVjdG9yPE9iamVjdD4gZmlsdGVyUmVhZGVycyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqCiAgICAgICogQWRkIGFuIEFudEZpbHRlclJlYWRlciBmaWx0ZXIuCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFZlY3RvcjxPYmplY3Q+IGdldEZpbHRlclJlYWRlcnMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGaWx0ZXJDaGFpbikgZ2V0Q2hlY2tlZFJlZigpKS5nZXRGaWx0ZXJSZWFkZXJzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0RmlsdGVyUmVhZGVycygpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIGZpbHRlclJlYWRlcnM7CkBAIC00MTIsNCArNDEyLDggQEAKICAgICAgICAgICAgIHNldENoZWNrZWQodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIEZpbHRlckNoYWluIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRmlsdGVyQ2hhaW4uY2xhc3MpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0LmphdmEKaW5kZXggMTUzNTJmMi4uNjE4MDU4MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw4ICsxOCw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwpAQCAtMjgsNyArMjgsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlZlY3RvclNldDsKIAogLyoqCkBAIC0xMTMsMTIgKzExMiw2IEBACiAgICAgcHVibGljIGNsYXNzIEZpbHRlcnNGaWxlIHsKIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBGaWx0ZXJzRmlsZSBvYmplY3QuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgRmlsdGVyc0ZpbGUoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKICAgICAgICAgICogU2V0cyB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZmlsZSB0aGUgZmlsZSBmcm9tIHdoaWNoIGZpbHRlcnMgd2lsbCBiZSByZWFkLgpAQCAtMTg2LDcgKzE3OSw3IEBACiAKICAgICBwcml2YXRlIGJvb2xlYW4gcmVjdXJzZSA9IHRydWU7CiAgICAgcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbHRlckhhc2ggPSBudWxsOwotICAgIHByaXZhdGUgVmVjdG9yPEZpbGU+IGZpbHRlcnNGaWxlcyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWxlPiBmaWx0ZXJzRmlsZXMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICBwcml2YXRlIE9uTWlzc2luZyBvbk1pc3NpbmdGaWx0ZXJzRmlsZSA9IE9uTWlzc2luZy5GQUlMOwogICAgIHByaXZhdGUgYm9vbGVhbiByZWFkaW5nRmlsZXMgPSBmYWxzZTsKIApAQCAtMTk1LDcgKzE4OCw3IEBACiAgICAgLyoqCiAgICAgICogTGlzdCBvZiBvcmRlcmVkIGZpbHRlcnMgYW5kIGZpbHRlciBmaWxlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxGaWx0ZXI+IGZpbHRlcnMgPSBuZXcgVmVjdG9yPEZpbHRlcj4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWx0ZXI+IGZpbHRlcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCkBAIC0yMjUsNyArMjE4LDcgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRGaWx0ZXJzKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICAvL3NpbGx5IGhhY2sgdG8gYXZvaWQgc3RhY2sgb3ZlcmZsb3cuLi4KKyAgICAgICAgLy8gc2lsbHkgaGFjayB0byBhdm9pZCBzdGFjayBvdmVyZmxvdy4uLgogICAgICAgICBpZiAoIXJlYWRpbmdGaWxlcykgewogICAgICAgICAgICAgcmVhZGluZ0ZpbGVzID0gdHJ1ZTsKICAgICAgICAgICAgIGZvciAoRmlsZSBmaWx0ZXJzRmlsZSA6IGZpbHRlcnNGaWxlcykgewpAQCAtMjQzLDcgKzIzNiw3IEBACiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyc2V0IGZyb20gdGhlIHJlZmVyZW5jZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRmlsdGVyU2V0IGdldFJlZigpIHsKLSAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRmlsdGVyU2V0LmNsYXNzLCAiZmlsdGVyc2V0Iik7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEZpbHRlclNldC5jbGFzcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNTcsMTEgKzI1MCw4IEBACiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICBpZiAoZmlsdGVySGFzaCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaWx0ZXJIYXNoID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oZ2V0RmlsdGVycygpLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uPEZpbHRlcj4gZSA9IGdldEZpbHRlcnMoKS5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgICAgRmlsdGVyIGZpbHRlciA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgIGZpbHRlckhhc2gucHV0KGZpbHRlci5nZXRUb2tlbigpLCBmaWx0ZXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJIYXNoID0gbmV3IEhhc2h0YWJsZTw+KGdldEZpbHRlcnMoKS5zaXplKCkpOworICAgICAgICAgICAgZ2V0RmlsdGVycygpLmZvckVhY2goZmlsdGVyIC0+IGZpbHRlckhhc2gucHV0KGZpbHRlci5nZXRUb2tlbigpLCBmaWx0ZXIuZ2V0VmFsdWUoKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmaWx0ZXJIYXNoOwogICAgIH0KQEAgLTI4OSw3ICsyNzksNyBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoc3RhcnRPZlRva2VuID09IG51bGwgfHwgIiIuZXF1YWxzKHN0YXJ0T2ZUb2tlbikpIHsKKyAgICAgICAgaWYgKHN0YXJ0T2ZUb2tlbiA9PSBudWxsIHx8IHN0YXJ0T2ZUb2tlbi5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYmVnaW5Ub2tlbiBtdXN0IG5vdCBiZSBlbXB0eSIpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuc3RhcnRPZlRva2VuID0gc3RhcnRPZlRva2VuOwpAQCAtMzE2LDcgKzMwNiw3IEBACiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlbmRPZlRva2VuID09IG51bGwgfHwgIiIuZXF1YWxzKGVuZE9mVG9rZW4pKSB7CisgICAgICAgIGlmIChlbmRPZlRva2VuID09IG51bGwgfHwgZW5kT2ZUb2tlbi5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZW5kVG9rZW4gbXVzdCBub3QgYmUgZW1wdHkiKTsKICAgICAgICAgfQogICAgICAgICB0aGlzLmVuZE9mVG9rZW4gPSBlbmRPZlRva2VuOwpAQCAtMzU2LDM5ICszNDYsMjggQEAKICAgICAgKiBAcGFyYW0gZmlsdGVyc0ZpbGUgICAgICAgIHRoZSBmaWxlIGZyb20gd2hpY2ggZmlsdGVycyBhcmUgcmVhZC4KICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIHdoZW4gdGhlIGZpbGUgY2Fubm90IGJlIHJlYWQuCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlYWRGaWx0ZXJzRnJvbUZpbGUoRmlsZSBmaWx0ZXJzRmlsZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVhZEZpbHRlcnNGcm9tRmlsZShGaWxlIGZpbHRlcnNGaWxlKQorICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWZpbHRlcnNGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgIGhhbmRsZU1pc3NpbmdGaWxlKCJDb3VsZCBub3QgcmVhZCBmaWx0ZXJzIGZyb20gZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWx0ZXJzRmlsZSArICIgYXMgaXQgZG9lc24ndCBleGlzdC4iKTsKKyAgICAgICAgICAgIGhhbmRsZU1pc3NpbmdGaWxlKCJDb3VsZCBub3QgcmVhZCBmaWx0ZXJzIGZyb20gZmlsZSAiICsgZmlsdGVyc0ZpbGUKKyAgICAgICAgICAgICAgICArICIgYXMgaXQgZG9lc24ndCBleGlzdC4iKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmlsdGVyc0ZpbGUuaXNGaWxlKCkpIHsKLSAgICAgICAgICAgbG9nKCJSZWFkaW5nIGZpbHRlcnMgZnJvbSAiICsgZmlsdGVyc0ZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwotICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgICAgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbHRlcnNGaWxlKTsKLSAgICAgICAgICAgICAgcHJvcHMubG9hZChpbik7Ci0KLSAgICAgICAgICAgICAgRW51bWVyYXRpb248Pz4gZSA9IHByb3BzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgICAgVmVjdG9yPEZpbHRlcj4gZmlsdHMgPSBnZXRGaWx0ZXJzKCk7Ci0gICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzdHJQcm9wTmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHN0clZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoc3RyUHJvcE5hbWUpOwotICAgICAgICAgICAgICAgICBmaWx0cy5hZGRFbGVtZW50KG5ldyBGaWx0ZXIoc3RyUHJvcE5hbWUsIHN0clZhbHVlKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgZmlsdGVycyBmcm9tIGZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICsgZmlsdGVyc0ZpbGUsIGV4KTsKLSAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nKCJSZWFkaW5nIGZpbHRlcnMgZnJvbSAiICsgZmlsdGVyc0ZpbGUsIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbHRlcnNGaWxlLnRvUGF0aCgpKSkgeworICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOworICAgICAgICAgICAgICAgIHByb3BzLmZvckVhY2goKGssIHYpIC0+IGFkZEZpbHRlcihuZXcgRmlsdGVyKChTdHJpbmcpIGssIChTdHJpbmcpIHYpKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVhZCBmaWx0ZXJzIGZyb20gZmlsZTogIiArIGZpbHRlcnNGaWxlLCBleCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgIGhhbmRsZU1pc3NpbmdGaWxlKAotICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIGZpbGUgcmF0aGVyIHRoYW4gYSBkaXJlY3RvcnkgaW4gIgotICAgICAgICAgICAgICAgKyAidGhlIGZpbHRlcnNmaWxlIGF0dHJpYnV0ZToiICsgZmlsdGVyc0ZpbGUpOworICAgICAgICAgICAgaGFuZGxlTWlzc2luZ0ZpbGUoIk11c3Qgc3BlY2lmeSBhIGZpbGUgcmF0aGVyIHRoYW4gYSBkaXJlY3RvcnkgaW4gIgorICAgICAgICAgICAgICAgICsgInRoZSBmaWx0ZXJzZmlsZSBhdHRyaWJ1dGU6IiArIGZpbHRlcnNGaWxlKTsKICAgICAgICAgfQogICAgICAgICBmaWx0ZXJIYXNoID0gbnVsbDsKICAgICB9CkBAIC00NjksNyArNDQ4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CiAgICAgICAgIH0KICAgICAgICAgUHJvcGVydGllcyBwID0gcHJvcGVydHlTZXQuZ2V0UHJvcGVydGllcygpOwotICAgICAgICBTZXQ8TWFwLkVudHJ5PE9iamVjdCxPYmplY3Q+PiBlbnRyaWVzID0gcC5lbnRyeVNldCgpOworICAgICAgICBTZXQ8TWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0Pj4gZW50cmllcyA9IHAuZW50cnlTZXQoKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogZW50cmllcykgewogICAgICAgICAgICAgYWRkRmlsdGVyKG5ldyBGaWx0ZXIoU3RyaW5nLnZhbHVlT2YoZW50cnkuZ2V0S2V5KCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoZW50cnkuZ2V0VmFsdWUoKSkpKTsKQEAgLTQ4Miw3ICs0NjEsNyBAQAogICAgICAqIEByZXR1cm4gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGZpbHRlcnMgaW4gdGhpcyBzZXQuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGhhc0ZpbHRlcnMoKSB7Ci0gICAgICAgIHJldHVybiBnZXRGaWx0ZXJzKCkuc2l6ZSgpID4gMDsKKyAgICAgICAgcmV0dXJuICFnZXRGaWx0ZXJzKCkuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTQzLDggKzUyMiw2IEBACiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgIFN0cmluZyB0b2tlbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKIAogICAgICAgICAgICAgICAgIHdoaWxlIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vY2FuJ3QgaGF2ZSB6ZXJvLWxlbmd0aCB0b2tlbgpAQCAtNTUzLDExICs1MzAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0b2tlbgotICAgICAgICAgICAgICAgICAgICAgICAgPSBsaW5lLnN1YnN0cmluZyhpbmRleCArIGJlZ2luVG9rZW4ubGVuZ3RoKCksIGVuZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQobGluZS5zdWJzdHJpbmcoaSwgaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRva2VuID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgYmVnaW5Ub2tlbi5sZW5ndGgoKSwgZW5kSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZChsaW5lLCBpLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbnMuY29udGFpbnNLZXkodG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRva2Vucy5nZXQodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdG9rZW5zLmdldCh0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzZSAmJiAhdmFsdWUuZXF1YWxzKHRva2VuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYW5vdGhlciB0b2tlbiwgbGV0J3MgcGFyc2UgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXBsYWNlVG9rZW5zKHZhbHVlLCB0b2tlbik7CkBAIC02MDEsNyArNTc4LDcgQEAKICAgICAgICAgU3RyaW5nIGJlZ2luVG9rZW4gPSBnZXRCZWdpblRva2VuKCk7CiAgICAgICAgIFN0cmluZyBlbmRUb2tlbiA9IGdldEVuZFRva2VuKCk7CiAgICAgICAgIGlmIChyZWN1cnNlRGVwdGggPT0gMCkgewotICAgICAgICAgICAgcGFzc2VkVG9rZW5zID0gbmV3IFZlY3RvclNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBwYXNzZWRUb2tlbnMgPSBuZXcgVmVjdG9yU2V0PD4oKTsKICAgICAgICAgfQogICAgICAgICByZWN1cnNlRGVwdGgrKzsKICAgICAgICAgaWYgKHBhc3NlZFRva2Vucy5jb250YWlucyhwYXJlbnQpICYmICFkdXBsaWNhdGVUb2tlbikgewpAQCAtNjEwLDcgKzU4Nyw3IEBACiAgICAgICAgICAgICAgICAgIkluZmluaXRlIGxvb3AgaW4gdG9rZW5zLiBDdXJyZW50bHkga25vd24gdG9rZW5zIDogIgogICAgICAgICAgICAgICAgICsgcGFzc2VkVG9rZW5zLnRvU3RyaW5nKCkgKyAiXG5Qcm9ibGVtIHRva2VuIDogIiArIGJlZ2luVG9rZW4KICAgICAgICAgICAgICAgICArIHBhcmVudCArIGVuZFRva2VuICsgIiBjYWxsZWQgZnJvbSAiICsgYmVnaW5Ub2tlbgotICAgICAgICAgICAgICAgICsgcGFzc2VkVG9rZW5zLmxhc3RFbGVtZW50KCkudG9TdHJpbmcoKSArIGVuZFRva2VuKTsKKyAgICAgICAgICAgICAgICArIHBhc3NlZFRva2Vucy5sYXN0RWxlbWVudCgpICsgZW5kVG9rZW4pOwogICAgICAgICAgICAgcmVjdXJzZURlcHRoLS07CiAgICAgICAgICAgICByZXR1cm4gcGFyZW50OwogICAgICAgICB9CkBAIC02MjAsMTQgKzU5NywxNCBAQAogICAgICAgICAgICAgcGFzc2VkVG9rZW5zID0gbnVsbDsKICAgICAgICAgfSBlbHNlIGlmIChkdXBsaWNhdGVUb2tlbikgewogICAgICAgICAgICAgLy8gc2hvdWxkIGFsd2F5cyBiZSB0aGUgY2FzZS4uLgotICAgICAgICAgICAgaWYgKHBhc3NlZFRva2Vucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIXBhc3NlZFRva2Vucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhc3NlZFRva2Vucy5yZW1vdmUocGFzc2VkVG9rZW5zLnNpemUoKSAtIDEpOwotICAgICAgICAgICAgICAgIGlmIChwYXNzZWRUb2tlbnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGFzc2VkVG9rZW5zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGJlZ2luVG9rZW4gKyB2YWx1ZSArIGVuZFRva2VuOwogICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVUb2tlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwYXNzZWRUb2tlbnMuc2l6ZSgpID4gMCkgeworICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWRUb2tlbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAvLyByZW1vdmUgbGFzdCBzZWVuIHRva2VuIHdoZW4gY3Jhd2xpbmcgb3V0IG9mIHJlY3Vyc2lvbgogICAgICAgICAgICAgcGFzc2VkVG9rZW5zLnJlbW92ZShwYXNzZWRUb2tlbnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldENvbGxlY3Rpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldENvbGxlY3Rpb24uamF2YQppbmRleCA4YWZiOTYzLi45ZmIzMTlkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXRDb2xsZWN0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0Q29sbGVjdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjgsNyArMjgsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgRmlsdGVyU2V0Q29sbGVjdGlvbiB7CiAKLSAgICBwcml2YXRlIExpc3Q8RmlsdGVyU2V0PiBmaWx0ZXJTZXRzID0gbmV3IEFycmF5TGlzdDxGaWx0ZXJTZXQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEZpbHRlclNldD4gZmlsdGVyU2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IgZm9yIGEgRmlsdGVyU2V0Q29sbGVjdGlvbi4KQEAgLTc1LDEyICs3NSw3IEBACiAgICAgKiBAcmV0dXJuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGZpbHRlciBpbiB0aGlzIHNldCBvdGhlcndpc2UgZmFsc2UuCiAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWx0ZXJzKCkgewotICAgICAgICBmb3IgKEZpbHRlclNldCBmaWx0ZXJTZXQgOiBmaWx0ZXJTZXRzKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyU2V0Lmhhc0ZpbHRlcnMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZpbHRlclNldHMuc3RyZWFtKCkuYW55TWF0Y2goRmlsdGVyU2V0OjpoYXNGaWx0ZXJzKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GbGV4SW50ZWdlci5qYXZhCmluZGV4IGQ3NTc0MjkuLmU3MWUxMzcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmxleEludGVnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQxLDEzICs0MSwxNCBAQAogICAgICAqIEByZXR1cm4gdGhlIGludGVnZXIgdmFsdWUKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIE92ZXJyaWRkZW4gbWV0aG9kIHRvIHJldHVybiB0aGUgZGVjaW1hbCB2YWx1ZSBmb3IgZGlzcGxheQogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgaW50ZWdlcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0xvZ0xldmVsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Mb2dMZXZlbC5qYXZhCmluZGV4IGEwMmI5NDguLjI2YzRkNWMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0xvZ0xldmVsLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTG9nTGV2ZWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU1LDYgKzU1LDcgQEAKICAgICAgKiBAc2VlIEVudW1lcmF0ZWRBdHRyaWJ1dGUjZ2V0VmFsdWVzCiAgICAgICogQHJldHVybiB0aGUgc3RyaW5ncyBhbGxvd2VkIGZvciB0aGUgbGV2ZWwgYXR0cmlidXRlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAiZXJyb3IiLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXIuamF2YQppbmRleCA5MjU1OTdmLi44YzQwYWI5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4Nyw2ICsxODcsNyBAQAogICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gYW5vdGhlciBtYXBwZXIKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIG90aGVyIGF0dHJpYnV0ZXMgYXJlIHNldAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAodHlwZSAhPSBudWxsIHx8IGZyb20gIT0gbnVsbCB8fCB0byAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwpAQCAtMjE3LDggKzIxOCw3IEBACiAKICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCAmJiBjbGFzc25hbWUgPT0gbnVsbCAmJiBjb250YWluZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJuZXN0ZWQgbWFwcGVyIG9yICIKLSAgICAgICAgICAgICAgICArICJvbmUgb2YgdGhlIGF0dHJpYnV0ZXMgdHlwZSBvciBjbGFzc25hbWUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgIm5lc3RlZCBtYXBwZXIgb3Igb25lIG9mIHRoZSBhdHRyaWJ1dGVzIHR5cGUgb3IgY2xhc3NuYW1lIGlzIHJlcXVpcmVkIik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKQEAgLTI3Niw3ICsyNzYsNyBAQAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHJvdGVjdGVkIE1hcHBlciBnZXRSZWYoKSB7Ci0gICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKE1hcHBlci5jbGFzcywgZ2V0RGF0YVR5cGVOYW1lKCkpOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihNYXBwZXIuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzA3LDYgKzMwNyw3IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZW1hcHBlciBuYW1lcwogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiaWRlbnRpdHkiLCAiZmxhdHRlbiIsICJnbG9iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXJnZSIsICJyZWdleHAiLCAicGFja2FnZSIsICJ1bnBhY2thZ2UifTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01vZHVsZVZlcnNpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01vZHVsZVZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM1Y2IxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTW9kdWxlVmVyc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogRWxlbWVudCBkZXNjcmliaW5nIHRoZSBwYXJ0cyBvZiBhIEphdmEKKyAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2phdmEvamF2YXNlLzExL2RvY3MvYXBpL2phdmEuYmFzZS9qYXZhL2xhbmcvbW9kdWxlL01vZHVsZURlc2NyaXB0b3IuVmVyc2lvbi5odG1sIj5tb2R1bGUgdmVyc2lvbjwvYT4uCisgKiBUaGUgdmVyc2lvbiBudW1iZXIgaXMgcmVxdWlyZWQ7ICBhbGwgb3RoZXIgcGFydHMgYXJlIG9wdGlvbmFsLgorICoKKyAqIEBzaW5jZSAxLjEwLjYKKyAqLworcHVibGljIGNsYXNzIE1vZHVsZVZlcnNpb24geworICAgIC8qKiBNb2R1bGUgdmVyc2lvbidzIHJlcXVpcmVkIDxlbT52ZXJzaW9uIG51bWJlcjwvZW0+LiAqLworICAgIHByaXZhdGUgU3RyaW5nIG51bWJlcjsKKworICAgIC8qKiBNb2R1bGUgdmVyc2lvbidzIG9wdGlvbmFsIDxlbT5wcmUtcmVsZWFzZSB2ZXJzaW9uPC9lbT4uICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJlUmVsZWFzZTsKKworICAgIC8qKiBNb2R1bGUgdmVyc2lvbidzIG9wdGlvbmFsIDxlbT5idWlsZCB2ZXJzaW9uPC9lbT4uICovCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIHZlcnNpb24gbnVtYmVyLgorICAgICAqCisgICAgICogQHJldHVybiB2ZXJzaW9uIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBlbGVtZW50J3MgcmVxdWlyZWQgdmVyc2lvbiBudW1iZXIuICBUaGlzIGNhbm5vdCBjb250YWluCisgICAgICogYW4gQVNDSUkgaHlwaGVuICh7QGNvZGUgLX0pIG9yIHBsdXMgKHtAY29kZSArfSksIGFzIHRob3NlIGNoYXJhY3RlcnMKKyAgICAgKiBhcmUgdXNlZCBhcyBkZWxpbWl0ZXJzIGluIGEgY29tcGxldGUgbW9kdWxlIHZlcnNpb24gc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIG51bWJlciB2ZXJzaW9uIG51bWJlcgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgYXJndW1lbnQgaXMge0Bjb2RlIG51bGx9CisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYXJndW1lbnQgY29udGFpbnMge0Bjb2RlICctJ30KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB7QGNvZGUgJysnfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihmaW5hbCBTdHJpbmcgbnVtYmVyKSB7CisgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwobnVtYmVyLCAiVmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIGlmIChudW1iZXIuaW5kZXhPZignLScpID49IDAgfHwgbnVtYmVyLmluZGV4T2YoJysnKSA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJWZXJzaW9uIG51bWJlciBjYW5ub3QgY29udGFpbiAnLScgb3IgJysnLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhpcyBlbGVtZW50J3MgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaWYgc2V0LgorICAgICAqCisgICAgICogQHJldHVybiBwcmUtcmVsZWFzZSB2YWx1ZSwgb3Ige0Bjb2RlIG51bGx9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVSZWxlYXNlKCkgeworICAgICAgICByZXR1cm4gcHJlUmVsZWFzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgZWxlbWVudCdzIHByZS1yZWxlYXNlIHZlcnNpb24uICBUaGlzIGNhbiBiZSBhbnkgdmFsdWUKKyAgICAgKiB3aGljaCBkb2Vzbid0IGNvbnRhaW4gYW4gQVNDSUkgcGx1cyAoe0Bjb2RlICt9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmUgcHJlLXJlbGVhc2UgdmVyc2lvbiwgb3Ige0Bjb2RlIG51bGx9CisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhcmd1bWVudCBjb250YWlucyAie0Bjb2RlICt9IgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZVJlbGVhc2UoZmluYWwgU3RyaW5nIHByZSkgeworICAgICAgICBpZiAocHJlICE9IG51bGwgJiYgcHJlLmluZGV4T2YoJysnKSA+PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJWZXJzaW9uJ3MgcHJlLXJlbGVhc2UgY2Fubm90IGNvbnRhaW4gJysnLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucHJlUmVsZWFzZSA9IHByZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgZWxlbWVudCdzIGJ1aWxkIHZlcnNpb24sIGlmIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYnVpbGQgdmFsdWUsIG9yIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnVpbGQoKSB7CisgICAgICAgIHJldHVybiBidWlsZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgZWxlbWVudCdzIGJ1aWxkIHZlcnNpb24uICBUaGlzIGNhbiBiZSBhbnkgdmFsdWUsIGluY2x1ZGluZworICAgICAqIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWlsZCBidWlsZCB2ZXJzaW9uLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCdWlsZChmaW5hbCBTdHJpbmcgYnVpbGQpIHsKKyAgICAgICAgdGhpcy5idWlsZCA9IGJ1aWxkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNuYXBzaG90cyB0aGlzIGVsZW1lbnQncyBzdGF0ZSBhbmQgY29udmVydHMgaXQgdG8gYSBzdHJpbmcgY29tcGxpYW50CisgICAgICogd2l0aCB7QGNvZGUgTW9kdWxlRGVzY3JpcHRvci5WZXJzaW9ufS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSmF2YSBtb2R1bGUgdmVyc2lvbiBzdHJpbmcgYnVpbHQgZnJvbSB0aGlzIG9iamVjdCdzIHByb3BlcnRpZXMKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHtAbGlua3BsYWluICNnZXROdW1iZXIoKSBudW1iZXJ9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMge0Bjb2RlIG51bGx9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyB0b01vZHVsZVZlcnNpb25TdHJpbmcoKSB7CisgICAgICAgIGlmIChudW1iZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVmVyc2lvbiBudW1iZXIgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHZlcnNpb24gPSBuZXcgU3RyaW5nQnVpbGRlcihudW1iZXIpOworICAgICAgICBpZiAocHJlUmVsZWFzZSAhPSBudWxsIHx8IGJ1aWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZlcnNpb24uYXBwZW5kKCctJykuYXBwZW5kKE9iamVjdHMudG9TdHJpbmcocHJlUmVsZWFzZSwgIiIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVpbGQgIT0gbnVsbCkgeworICAgICAgICAgICAgdmVyc2lvbi5hcHBlbmQoJysnKS5hcHBlbmQoYnVpbGQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHZlcnNpb24udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3VtbWFyeSBvZiB0aGlzIG9iamVjdCdzIHN0YXRlLCBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgZm9ybSBvZiB0aGlzIGluc3RhbmNlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsKKyAgICAgICAgICAgICJbbnVtYmVyPSIgKyBudW1iZXIgKworICAgICAgICAgICAgIiwgcHJlUmVsZWFzZT0iICsgcHJlUmVsZWFzZSArCisgICAgICAgICAgICAiLCBidWlsZD0iICsgYnVpbGQgKworICAgICAgICAgICAgIl0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGFyYW1ldGVyLmphdmEKaW5kZXggNmMxNmQyZC4uNzEwYTUxOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGFyYW1ldGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGFyYW1ldGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXJhbWV0ZXJpemFibGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlcml6YWJsZS5qYXZhCmluZGV4IDc5NDVhOWEuLmE3MmJhNjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlcml6YWJsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhcmFtZXRlcml6YWJsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsNSArMjcsNSBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgYW4gYXJyYXkgb2YgbmFtZS90eXBlL3ZhbHVlIHBhcmFtZXRlcnMuCiAgICAgICovCi0gICAgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpOworICAgIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXIuLi4gcGFyYW1ldGVycyk7CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoLmphdmEKaW5kZXggZjJkNDQ3Ni4uM2QyZDVjOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdGguamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEyICsyMCwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKQEAgLTcxLDcgKzcyLDYgQEAKICAgICBwdWJsaWMgc3RhdGljIFBhdGggc3lzdGVtQ2xhc3NwYXRoID0gLy9OT1NPTkFSCiAgICAgICAgIG5ldyBQYXRoKG51bGwsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIikpOwogCi0KICAgICAvKioKICAgICAgKiBUaGUgc3lzdGVtIGJvb3RjbGFzc3BhdGggYXMgYSBQYXRoIG9iamVjdC4KICAgICAgKgpAQCAtMTE5LDYgKzExOSw3IEBACiAgICAgICAgICAqIENyZWF0ZSBhbiBpdGVyYXRvci4KICAgICAgICAgICogQHJldHVybiBhbiBpdGVyYXRvci4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2VJdGVyYXRvcihnZXRQcm9qZWN0KCksIG51bGwsIHBhcnRzKTsKICAgICAgICAgfQpAQCAtMTI3LDYgKzEyOCw3IEBACiAgICAgICAgICAqIENoZWNrIGlmIHRoaXMgcmVzb3VyY2UgaXMgb25seSBmb3IgZmlsZXN5c3RlbXMuCiAgICAgICAgICAqIEByZXR1cm4gdHJ1ZS4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTEzNSw2ICsxMzcsNyBAQAogICAgICAgICAgKiBHZXQgdGhlIG51bWJlciBvZiByZXNvdXJjZXMuCiAgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJ0cy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgICAgICByZXR1cm4gcGFydHMgPT0gbnVsbCA/IDAgOiBwYXJ0cy5sZW5ndGg7CiAgICAgICAgIH0KQEAgLTE5NCw2ICsxOTcsNyBAQAogICAgICAqIEBwYXJhbSByIHRoZSByZWZlcmVuY2UgdG8gYW5vdGhlciBQYXRoCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAodW5pb24gIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKQEAgLTM0Myw5ICszNDcsOSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChmLmdldFBhcmVudEZpbGUoKSAhPSBudWxsICYmIGYuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpCiAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRhaW5zV2lsZGNhcmRzKGYuZ2V0TmFtZSgpKSkgewogICAgICAgICAgICAgICAgIHNldExvY2F0aW9uKGYpOwotICAgICAgICAgICAgICAgIGxvZygiYWRkaW5nICIgKyBmICsgIiB3aGljaCBjb250YWlucyB3aWxkY2FyZHMgYW5kIG1heSBub3QiCi0gICAgICAgICAgICAgICAgICAgICsgIiBkbyB3aGF0IHlvdSBpbnRlbmQgaXQgdG8gZG8gZGVwZW5kaW5nIG9uIHlvdXIgT1Mgb3IiCi0gICAgICAgICAgICAgICAgICAgICsgIiB2ZXJzaW9uIG9mIEphdmEiLCBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKKyAgICAgICAgICAgICAgICBsb2coImFkZGluZyAiICsgZgorICAgICAgICAgICAgICAgICAgICArICIgd2hpY2ggY29udGFpbnMgd2lsZGNhcmRzIGFuZCBtYXkgbm90IGRvIHdoYXQgeW91IGludGVuZCBpdCB0byBkbyBkZXBlbmRpbmcgb24geW91ciBPUyBvciB2ZXJzaW9uIG9mIEphdmEiLAorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbG9nKCJkcm9wcGluZyAiICsgZiArICIgZnJvbSBwYXRoIGFzIGl0IGRvZXNuJ3QgZXhpc3QiLAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19WRVJCT1NFKTsKQEAgLTM3Miw3ICszNzYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBsaXN0KCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUGF0aCkgZ2V0Q2hlY2tlZFJlZigpKS5saXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkubGlzdCgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhc3NlcnRGaWxlc3lzdGVtT25seSh1bmlvbikgPT0gbnVsbAogICAgICAgICAgICAgPyBuZXcgU3RyaW5nWzBdIDogdW5pb24ubGlzdCgpOwpAQCAtMzgzLDggKzM4Nyw5IEBACiAgICAgICogQ0xBU1NQQVRIIG9yIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgZGVmaW5pdGlvbi4KICAgICAgKiBAcmV0dXJuIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0aC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpCisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkudG9TdHJpbmcoKQogICAgICAgICAgICAgOiB1bmlvbiA9PSBudWxsID8gIiIgOiB1bmlvbi50b1N0cmluZygpOwogICAgIH0KIApAQCAtMzk1LDEzICs0MDAsMTMgQEAKICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9uZSBmb3IgZWFjaCBwYXRoIGVsZW1lbnQKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRyYW5zbGF0ZVBhdGgoUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwogICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwogICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgUGF0aFRva2VuaXplciB0b2sgPSBuZXcgUGF0aFRva2VuaXplcihzb3VyY2UpOwotICAgICAgICBTdHJpbmdCdWZmZXIgZWxlbWVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgd2hpbGUgKHRvay5oYXNNb3JlVG9rZW5zKCkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBlbGVtZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICAgICAgU3RyaW5nIHBhdGhFbGVtZW50ID0gdG9rLm5leHRUb2tlbigpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZChyZXNvbHZlRmlsZShwcm9qZWN0LCBwYXRoRWxlbWVudCkuZ2V0UGF0aCgpKTsKQEAgLTQxMyw4ICs0MTgsNyBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50Lmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICB0cmFuc2xhdGVGaWxlU2VwKGVsZW1lbnQsIGkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0LmFkZEVsZW1lbnQoZWxlbWVudC50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgICAgICByZXN1bHQuYWRkKGVsZW1lbnQudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwogICAgIH0KQEAgLTQ1Niw5ICs0NjAsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXRoKSBnZXRDaGVja2VkUmVmKCkpLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gdW5pb24gPT0gbnVsbCA/IDAgOiBhc3NlcnRGaWxlc3lzdGVtT25seSh1bmlvbikuc2l6ZSgpOwpAQCAtNDY4LDYgKzQ3Myw3IEBACiAgICAgICogQ2xvbmUgdGhpcyBQYXRoLgogICAgICAqIEByZXR1cm4gUGF0aCB3aXRoIHNoYWxsb3dseSBjbG9uZWQgUmVzb3VyY2UgY2hpbGRyZW4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFBhdGggcmVzdWx0ID0gKFBhdGgpIHN1cGVyLmNsb25lKCk7CkBAIC00ODUsNiArNDkxLDcgQEAKICAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpAQCAtNTU1LDIyICs1NjIsMjIgQEAKICAgICAgICAgaWYgKG8gIT0gbnVsbCkgewogICAgICAgICAgICAgb3JkZXIgPSBvOwogICAgICAgICB9Ci0gICAgICAgIGlmIChvcmRlci5lcXVhbHMoIm9ubHkiKSkgeworICAgICAgICBpZiAoIm9ubHkiLmVxdWFscyhvcmRlcikpIHsKICAgICAgICAgICAgIC8vIG9ubHk6IHRoZSBkZXZlbG9wZXIga25vd3Mgd2hhdCAocyloZSBpcyBkb2luZwogICAgICAgICAgICAgcmVzdWx0LmFkZEV4aXN0aW5nKHAsIHRydWUpOwogCi0gICAgICAgIH0gZWxzZSBpZiAob3JkZXIuZXF1YWxzKCJmaXJzdCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoImZpcnN0Ii5lcXVhbHMob3JkZXIpKSB7CiAgICAgICAgICAgICAvLyBmaXJzdDogZGV2ZWxvcGVyIGNvdWxkIHVzZSBhIGxpdHRsZSBoZWxwCiAgICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcocCwgdHJ1ZSk7CiAgICAgICAgICAgICByZXN1bHQuYWRkRXhpc3RpbmcodGhpcyk7CiAKLSAgICAgICAgfSBlbHNlIGlmIChvcmRlci5lcXVhbHMoImlnbm9yZSIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoImlnbm9yZSIuZXF1YWxzKG9yZGVyKSkgewogICAgICAgICAgICAgLy8gaWdub3JlOiBkb24ndCB0cnVzdCBhbnlvbmUKICAgICAgICAgICAgIHJlc3VsdC5hZGRFeGlzdGluZyh0aGlzKTsKIAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gbGFzdDogZG9uJ3QgdHJ1c3QgdGhlIGRldmVsb3BlcgotICAgICAgICAgICAgaWYgKCFvcmRlci5lcXVhbHMoImxhc3QiKSkgeworICAgICAgICAgICAgaWYgKCEibGFzdCIuZXF1YWxzKG9yZGVyKSkgewogICAgICAgICAgICAgICAgIGxvZygiaW52YWxpZCB2YWx1ZSBmb3IgIiArIE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRICiAgICAgICAgICAgICAgICAgICAgICsgIjogIiArIG9yZGVyLAogICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19XQVJOKTsKQEAgLTU4OCw3ICs1OTUsNyBAQAogICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzS2FmZmUoKSkgewogICAgICAgICAgICAgLy8gbmV3ZXIgdmVyc2lvbnMgb2YgS2FmZmUgKDEuMS4xKykgd29uJ3QgaGF2ZSB0aGlzLAogICAgICAgICAgICAgLy8gYnV0IHRoaXMgd2lsbCBiZSBzb3J0ZWQgYnkgRmlsZVNldCBhbnl3YXkuCi0gICAgICAgICAgICBGaWxlIGthZmZlU2hhcmUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpCisgICAgICAgICAgICBGaWxlIGthZmZlU2hhcmUgPSBuZXcgRmlsZShKYXZhRW52VXRpbHMuZ2V0SmF2YUhvbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJzaGFyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAia2FmZmUiKTsKICAgICAgICAgICAgIGlmIChrYWZmZVNoYXJlLmlzRGlyZWN0b3J5KCkpIHsKQEAgLTYwNSw1NyArNjEyLDQ0IEBACiAgICAgICAgICAgICAvLyBUT0RPIGlzIHRoaXMgY29kZSBzdGlsbCBuZWNlc3Nhcnk/IGlzIHRoZXJlIGFueSAxLjIrIHBvcnQ/CiAgICAgICAgICAgICAvLyBQdWxsIGluICouemlwIGZyb20gcGFja2FnZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICBGaWxlU2V0IG1zWmlwRmlsZXMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgbXNaaXBGaWxlcy5zZXREaXIobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiUGFja2FnZXMiKSk7CisgICAgICAgICAgICBtc1ppcEZpbGVzLnNldERpcihuZXcgRmlsZShKYXZhRW52VXRpbHMuZ2V0SmF2YUhvbWUoKQorICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIlBhY2thZ2VzIikpOwogICAgICAgICAgICAgbXNaaXBGaWxlcy5zZXRJbmNsdWRlcygiKi5aSVAiKTsKICAgICAgICAgICAgIGFkZEZpbGVzZXQobXNaaXBGaWxlcyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBKREsgMS4yKyBzZWVtcyB0byBzZXQgamF2YS5ob21lIHRvIHRoZSBKUkUgZGlyZWN0b3J5LgotICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJydC5qYXIiKSk7CisgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLCBKYXZhRW52VXRpbHMuZ2V0SmF2YUhvbWUoKQorICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJydC5qYXIiKSk7CiAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgdGhlIG9sZCB2ZXJzaW9uIGFzIHdlbGwgYW5kIGxldCBhZGRFeGlzdGluZwogICAgICAgICAgICAgLy8gc29ydCBpdCBvdXQuCi0gICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJqcmUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAicnQuamFyIikpOworICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwgSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkKKyAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJqcmUiICsgRmlsZS5zZXBhcmF0b3IgKyAibGliIgorICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInJ0LmphciIpKTsKIAogICAgICAgICAgICAgLy8gU3VuJ3MgYW5kIEFwcGxlJ3MgMS40IGhhdmUgSkNFIGFuZCBKU1NFIGluIHNlcGFyYXRlIGphcnMuCiAgICAgICAgICAgICBmb3IgKFN0cmluZyBzZWNKYXIgOiBBcnJheXMuYXNMaXN0KCJqY2UiLCAianNzZSIpKSB7Ci0gICAgICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBzZWNKYXIgKyAiLmphciIpKTsKLSAgICAgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIi4uIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBzZWNKYXIgKyAiLmphciIpKTsKKyAgICAgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLCBKYXZhRW52VXRpbHMuZ2V0SmF2YUhvbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiCisgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgc2VjSmFyICsgIi5qYXIiKSk7CisgICAgICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwgSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiQ2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyBzZWNKYXIgKyAiLmphciIpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSUJNJ3MgMS40IGhhcyBydC5qYXIgc3BsaXQgaW50byA0IHNtYWxsZXIgamFycyBhbmQgYSBjb21iaW5lZAogICAgICAgICAgICAgLy8gSkNFL0pTU0UgaW4gc2VjdXJpdHkuamFyLgogICAgICAgICAgICAgZm9yIChTdHJpbmcgaWJtSmFyIDogQXJyYXlzLmFzTGlzdCgiY29yZSIsICJncmFwaGljcyIsICJzZWN1cml0eSIsICJzZXJ2ZXIiLCAieG1sIikpIHsKLSAgICAgICAgICAgICAgICBhZGRFeGlzdGluZyhuZXcgUGF0aChudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArIGlibUphciArICIuamFyIikpOworICAgICAgICAgICAgICAgIGFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsIEphdmFFbnZVdGlscy5nZXRKYXZhSG9tZSgpCisgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArIGlibUphciArICIuamFyIikpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBBZGRlZCBmb3IgTWFjT1MgWAotICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgImNsYXNzZXMuamFyIikpOwotICAgICAgICAgICAgYWRkRXhpc3RpbmcobmV3IFBhdGgobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgIkNsYXNzZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEZpbGUuc2VwYXJhdG9yICsgInVpLmphciIpKTsKKyAgICAgICAgICAgIGFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsIEphdmFFbnZVdGlscy5nZXRKYXZhSG9tZSgpCisgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiQ2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJjbGFzc2VzLmphciIpKTsKKyAgICAgICAgICAgIGFkZEV4aXN0aW5nKG5ldyBQYXRoKG51bGwsIEphdmFFbnZVdGlscy5nZXRKYXZhSG9tZSgpCisgICAgICAgICAgICAgICAgICAgICsgRmlsZS5zZXBhcmF0b3IgKyAiLi4iICsgRmlsZS5zZXBhcmF0b3IgKyAiQ2xhc3NlcyIKKyAgICAgICAgICAgICAgICAgICAgKyBGaWxlLnNlcGFyYXRvciArICJ1aS5qYXIiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY5Myw5ICs2ODcsMTAgQEAKICAgICAgKiBhcmUgYWRkZWQgdG8gdGhpcyBjb250YWluZXIgd2hpbGUgdGhlIEl0ZXJhdG9yIGlzIGluIHVzZS4KICAgICAgKiBAcmV0dXJuIGEgImZhaWwtZmFzdCIgSXRlcmF0b3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQYXRoKSBnZXRDaGVja2VkUmVmKCkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXRlcmF0b3IoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIGlmIChnZXRQcmVzZXJ2ZUJDKCkpIHsKQEAgLTcwOSw5ICs3MDQsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFBhdGgpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRmlsZXN5c3RlbU9ubHkoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIGFzc2VydEZpbGVzeXN0ZW1Pbmx5KHVuaW9uKTsKQEAgLTcyNiw4ICs3MjIsOCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbGxlY3Rpb24gYXNzZXJ0RmlsZXN5c3RlbU9ubHkoUmVzb3VyY2VDb2xsZWN0aW9uIHJjKSB7CiAgICAgICAgIGlmIChyYyAhPSBudWxsICYmICEocmMuaXNGaWxlc3lzdGVtT25seSgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgKyAiIGFsbG93cyBvbmx5IGZpbGVzeXN0ZW0gcmVzb3VyY2VzLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyBhbGxvd3Mgb25seSBmaWxlc3lzdGVtIHJlc291cmNlcy4iLAorICAgICAgICAgICAgICAgIGdldERhdGFUeXBlTmFtZSgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQpAQCAtNzQ1LDcgKzc0MSw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBsaXN0TWV0aG9kID0gZ2V0Q2xhc3MoKS5nZXRNZXRob2QoImxpc3QiLCAoQ2xhc3NbXSkgbnVsbCk7CisgICAgICAgICAgICBNZXRob2QgbGlzdE1ldGhvZCA9IGdldENsYXNzKCkuZ2V0TWV0aG9kKCJsaXN0Iik7CiAgICAgICAgICAgICByZXR1cm4gIWxpc3RNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5lcXVhbHMoUGF0aC5jbGFzcyk7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvL3Nob3VsZG4ndCBoYXBwZW4sIGJ1dApAQCAtNzU3LDcgKzc1Myw3IEBACiAgICAgICAgIGlmIChwcmVzZXJ2ZUJDID09IG51bGwpIHsKICAgICAgICAgICAgIHByZXNlcnZlQkMgPSBkZWxlZ2F0ZUl0ZXJhdG9yVG9MaXN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmVzZXJ2ZUJDLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICByZXR1cm4gcHJlc2VydmVCQzsKICAgICB9CiAKICAgICAvKioKQEAgLTc2OCw0ICs3NjQsOCBAQAogICAgICAgICByZXR1cm4gcGF0aCAhPSBudWxsICYmIChwYXRoLmNvbnRhaW5zKCIqIikgfHwgcGF0aC5jb250YWlucygiPyIpKTsKICAgICB9CiAKKyAgICBwcml2YXRlIFBhdGggZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihQYXRoLmNsYXNzKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm5TZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1BhdHRlcm5TZXQuamF2YQppbmRleCA5NzYzMzA4Li5mMmIxODZlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMTQgKzIzLDE2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvcGVydHlIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogTmFtZWQgY29sbGVjdGlvbiBvZiBpbmNsdWRlL2V4Y2x1ZGUgdGFncy4KQEAgLTQwLDE1ICs0MiwxNSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFBhdHRlcm5TZXQgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0gICAgcHJpdmF0ZSBMaXN0PE5hbWVFbnRyeT4gaW5jbHVkZUxpc3QgPSBuZXcgQXJyYXlMaXN0PE5hbWVFbnRyeT4oKTsKLSAgICBwcml2YXRlIExpc3Q8TmFtZUVudHJ5PiBleGNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZUVudHJ5PigpOwotICAgIHByaXZhdGUgTGlzdDxQYXR0ZXJuRmlsZU5hbWVFbnRyeT4gaW5jbHVkZXNGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8UGF0dGVybkZpbGVOYW1lRW50cnk+KCk7Ci0gICAgcHJpdmF0ZSBMaXN0PFBhdHRlcm5GaWxlTmFtZUVudHJ5PiBleGNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQYXR0ZXJuRmlsZU5hbWVFbnRyeT4oKTsKKyAgICBwcml2YXRlIExpc3Q8TmFtZUVudHJ5PiBpbmNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxOYW1lRW50cnk+IGV4Y2x1ZGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFBhdHRlcm5GaWxlTmFtZUVudHJ5PiBpbmNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFBhdHRlcm5GaWxlTmFtZUVudHJ5PiBleGNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBpbm5lciBjbGFzcyB0byBob2xkIGEgbmFtZSBvbiBsaXN0LiAgIklmIiBhbmQgIlVubGVzcyIgYXR0cmlidXRlcwogICAgICAqIG1heSBiZSB1c2VkIHRvIGludmFsaWRhdGUgdGhlIGVudHJ5IGJhc2VkIG9uIHRoZSBleGlzdGVuY2Ugb2YgYQotICAgICAqIHByb3BlcnR5ICh0eXBpY2FsbHkgc2V0IHRocnUgdGhlIHVzZSBvZiB0aGUgQXZhaWxhYmxlIHRhc2spCisgICAgICogcHJvcGVydHkgKHR5cGljYWxseSBzZXQgdGhyb3VnaCB0aGUgdXNlIG9mIHRoZSBBdmFpbGFibGUgdGFzaykKICAgICAgKiBvciB2YWx1ZSBvZiBhbiBleHByZXNzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBOYW1lRW50cnkgewpAQCAtMTUyLDE0ICsxNTQsMTUgQEAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgZm9ybSBvZiB0aGlzIG9iamVjdC4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJub25hbWUiKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoaWZDb25kICE9IG51bGwpIHx8ICh1bmxlc3NDb25kICE9IG51bGwpKSB7CisgICAgICAgICAgICBpZiAoaWZDb25kICE9IG51bGwgfHwgdW5sZXNzQ29uZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiOiIpOwogICAgICAgICAgICAgICAgIFN0cmluZyBjb25uZWN0b3IgPSAiIjsKIApAQCAtMTgwLDcgKzE4Myw3IEBACiAKICAgICAvKioKICAgICAgKiBBZGRzIGVuY29kaW5nIHN1cHBvcnQgdG8ge0BsaW5rIE5hbWVFbnRyeX0uCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTIKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNAogICAgICAqLwogICAgIHB1YmxpYyBjbGFzcyBQYXR0ZXJuRmlsZU5hbWVFbnRyeSBleHRlbmRzIE5hbWVFbnRyeSB7CiAgICAgICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nOwpAQCAtMTkxLDggKzE5NCw4IEBACiAgICAgICAgICAqCiAgICAgICAgICAqIDxwPgogICAgICAgICAgKiBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBzZWUKLSAgICAgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzEuNS4wL2RvY3MvZ3VpZGUvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+Ci0gICAgICAgICAqIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgorICAgICAgICAgKiA8YSBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbCI+CisgICAgICAgICAqIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sPC9hPi4KICAgICAgICAgICogPC9wPgogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0gZW5jb2RpbmcgU3RyaW5nCkBAIC0yMTUsNyArMjE4LDcgQEAKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgICAgIFN0cmluZyBiYXNlU3RyaW5nID0gc3VwZXIudG9TdHJpbmcoKTsKICAgICAgICAgICAgIHJldHVybiBlbmNvZGluZyA9PSBudWxsID8gYmFzZVN0cmluZwotICAgICAgICAgICAgICAgIDogbmV3IFN0cmluZ0J1aWxkZXIoYmFzZVN0cmluZykuYXBwZW5kKCI7ZW5jb2RpbmctPiIpLmFwcGVuZChlbmNvZGluZykudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICA6IGJhc2VTdHJpbmcgKyAiO2VuY29kaW5nLT4iICsgZW5jb2Rpbmc7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIyNCw5ICsyMjcsMTEgQEAKICAgICAgICAgICAgIHNldFByb2plY3QocC5nZXRQcm9qZWN0KCkpOwogICAgICAgICAgICAgYWRkQ29uZmlndXJlZFBhdHRlcm5zZXQocCk7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlUGF0dGVybnMoUHJvamVjdCBwKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RXhjbHVkZVBhdHRlcm5zKHApOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZVBhdHRlcm5zKFByb2plY3QgcCkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldEluY2x1ZGVQYXR0ZXJucyhwKTsKICAgICAgICAgfQpAQCAtMjQ4LDYgKzI1Myw3IEBACiAgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byBhbm90aGVyIHBhdHRlcm5zZXQuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKCFpbmNsdWRlTGlzdC5pc0VtcHR5KCkgfHwgIWV4Y2x1ZGVMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKQEAgLTMzMyw3ICszMzksNyBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5jbHVkZXMgIT0gbnVsbCAmJiBpbmNsdWRlcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGluY2x1ZGVzICE9IG51bGwgJiYgIWluY2x1ZGVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5jbHVkZXMsICIsICIsIGZhbHNlKTsKICAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRlSW5jbHVkZSgpLnNldE5hbWUodG9rLm5leHRUb2tlbigpKTsKQEAgLTM1MSw3ICszNTcsNyBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCAmJiBleGNsdWRlcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwgJiYgIWV4Y2x1ZGVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZXhjbHVkZXMsICIsICIsIGZhbHNlKTsKICAgICAgICAgICAgIHdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICAgICAgY3JlYXRlRXhjbHVkZSgpLnNldE5hbWUodG9rLm5leHRUb2tlbigpKTsKQEAgLTQxMCwzMCArNDE2LDIwIEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlYWRQYXR0ZXJucyhGaWxlIHBhdHRlcm5maWxlLCBTdHJpbmcgZW5jb2RpbmcsIExpc3Q8TmFtZUVudHJ5PiBwYXR0ZXJubGlzdCwgUHJvamVjdCBwKQogICAgICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKIAotICAgICAgICBCdWZmZXJlZFJlYWRlciBwYXR0ZXJuUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vIEdldCBhIEZpbGVSZWFkZXIKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcGF0dGVyblJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihwYXR0ZXJuZmlsZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwYXR0ZXJuUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHBhdHRlcm5maWxlKSwgZW5jb2RpbmcpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgdHJ5IChSZWFkZXIgciA9IGVuY29kaW5nID09IG51bGwgPyBuZXcgRmlsZVJlYWRlcihwYXR0ZXJuZmlsZSkKKyAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHBhdHRlcm5maWxlKSwgZW5jb2RpbmcpOworICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHBhdHRlcm5SZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocikpIHsKIAogICAgICAgICAgICAgLy8gQ3JlYXRlIG9uZSBOYW1lRW50cnkgaW4gdGhlIGFwcHJvcHJpYXRlIHBhdHRlcm4gbGlzdCBmb3IgZWFjaAogICAgICAgICAgICAgLy8gbGluZSBpbiB0aGUgZmlsZS4KLSAgICAgICAgICAgIFN0cmluZyBsaW5lID0gcGF0dGVyblJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChsaW5lLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICBsaW5lID0gcC5yZXBsYWNlUHJvcGVydGllcyhsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkUGF0dGVyblRvTGlzdChwYXR0ZXJubGlzdCkuc2V0TmFtZShsaW5lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZSA9IHBhdHRlcm5SZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdHRlcm5SZWFkZXIubGluZXMoKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoKChQcmVkaWNhdGU8U3RyaW5nPikgU3RyaW5nOjppc0VtcHR5KS5uZWdhdGUoKSkKKyAgICAgICAgICAgICAgICAubWFwKHA6OnJlcGxhY2VQcm9wZXJ0aWVzKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKGxpbmUgLT4gYWRkUGF0dGVyblRvTGlzdChwYXR0ZXJubGlzdCkuc2V0TmFtZShsaW5lKSk7CisKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIGZyb20gcGF0dGVybiBmaWxlOiAiCiAgICAgICAgICAgICAgICAgICAgICsgcGF0dGVybmZpbGUsIGlvZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocGF0dGVyblJlYWRlcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwMCw4ICs0OTYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIGdldFJlZihwKS5oYXNQYXR0ZXJucyhwKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHApOwotICAgICAgICByZXR1cm4gaW5jbHVkZXNGaWxlTGlzdC5zaXplKCkgPiAwIHx8IGV4Y2x1ZGVzRmlsZUxpc3Quc2l6ZSgpID4gMAotICAgICAgICAgICAgICAgIHx8IGluY2x1ZGVMaXN0LnNpemUoKSA+IDAgfHwgZXhjbHVkZUxpc3Quc2l6ZSgpID4gMDsKKyAgICAgICAgcmV0dXJuICEoaW5jbHVkZXNGaWxlTGlzdC5pc0VtcHR5KCkgJiYgZXhjbHVkZXNGaWxlTGlzdC5pc0VtcHR5KCkKKyAgICAgICAgICAgICYmIGluY2x1ZGVMaXN0LmlzRW1wdHkoKSAmJiBleGNsdWRlTGlzdC5pc0VtcHR5KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTA5LDMxICs1MDUsMjUgQEAKICAgICAgKiByZWZlcmVuY2VkIFBhdHRlcm5TZXQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBQYXR0ZXJuU2V0IGdldFJlZihQcm9qZWN0IHApIHsKLSAgICAgICAgcmV0dXJuIChQYXR0ZXJuU2V0KSBnZXRDaGVja2VkUmVmKHApOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihQYXR0ZXJuU2V0LmNsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29udmVydCBhIHZlY3RvciBvZiBOYW1lRW50cnkgZWxlbWVudHMgaW50byBhbiBhcnJheSBvZiBTdHJpbmdzLgogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nW10gbWFrZUFycmF5KExpc3Q8TmFtZUVudHJ5PiBsaXN0LCBQcm9qZWN0IHApIHsKLSAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiB0bXBOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IgKE5hbWVFbnRyeSBuZSA6IGxpc3QpIHsKLSAgICAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbmUuZXZhbE5hbWUocCk7Ci0gICAgICAgICAgICBpZiAocGF0dGVybiAhPSBudWxsICYmIHBhdHRlcm4ubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgdG1wTmFtZXMuYWRkKHBhdHRlcm4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0bXBOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbdG1wTmFtZXMuc2l6ZSgpXSk7CisgICAgICAgIHJldHVybiBsaXN0LnN0cmVhbSgpLm1hcChuZSAtPiBuZS5ldmFsTmFtZShwKSkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisgICAgICAgICAgICAuZmlsdGVyKHBhdHRlcm4gLT4gIXBhdHRlcm4uaXNFbXB0eSgpKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJlYWQgaW5jbHVkZXNmaWxlIG90IGV4Y2x1ZGVzZmlsZSBpZiBub3QgYWxyZWFkeSBkb25lIHNvLgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWFkRmlsZXMoUHJvamVjdCBwKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlc0ZpbGVMaXN0LnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKCFpbmNsdWRlc0ZpbGVMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZm9yIChQYXR0ZXJuRmlsZU5hbWVFbnRyeSBuZSA6IGluY2x1ZGVzRmlsZUxpc3QpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBuZS5ldmFsTmFtZShwKTsKICAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkgewpAQCAtNTQ3LDcgKzUzNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbmNsdWRlc0ZpbGVMaXN0LmNsZWFyKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGV4Y2x1ZGVzRmlsZUxpc3Quc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAoIWV4Y2x1ZGVzRmlsZUxpc3QuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBmb3IgKFBhdHRlcm5GaWxlTmFtZUVudHJ5IG5lIDogZXhjbHVkZXNGaWxlTGlzdCkgewogICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IG5lLmV2YWxOYW1lKHApOwogICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPSBudWxsKSB7CkBAIC01NjYsMjEgKzU1NiwyNCBAQAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBwcmludGFibGUgZm9ybSBvZiB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gInBhdHRlcm5TZXR7IGluY2x1ZGVzOiAiICsgaW5jbHVkZUxpc3QgKyAiIGV4Y2x1ZGVzOiAiICsgZXhjbHVkZUxpc3QgKyAiIH0iOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgicGF0dGVyblNldHsgaW5jbHVkZXM6ICVzIGV4Y2x1ZGVzOiAlcyB9IiwKKyAgICAgICAgICAgIGluY2x1ZGVMaXN0LCBleGNsdWRlTGlzdCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhpcyBwYXR0ZXJuc2V0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBQYXR0ZXJuU2V0IHBzID0gKFBhdHRlcm5TZXQpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICBwcy5pbmNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZUVudHJ5PihpbmNsdWRlTGlzdCk7Ci0gICAgICAgICAgICBwcy5leGNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TmFtZUVudHJ5PihleGNsdWRlTGlzdCk7Ci0gICAgICAgICAgICBwcy5pbmNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQYXR0ZXJuRmlsZU5hbWVFbnRyeT4oaW5jbHVkZXNGaWxlTGlzdCk7Ci0gICAgICAgICAgICBwcy5leGNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDxQYXR0ZXJuRmlsZU5hbWVFbnRyeT4oZXhjbHVkZXNGaWxlTGlzdCk7CisgICAgICAgICAgICBwcy5pbmNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihpbmNsdWRlTGlzdCk7CisgICAgICAgICAgICBwcy5leGNsdWRlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihleGNsdWRlTGlzdCk7CisgICAgICAgICAgICBwcy5pbmNsdWRlc0ZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KGluY2x1ZGVzRmlsZUxpc3QpOworICAgICAgICAgICAgcHMuZXhjbHVkZXNGaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihleGNsdWRlc0ZpbGVMaXN0KTsKICAgICAgICAgICAgIHJldHVybiBwczsKICAgICAgICAgfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGVybWlzc2lvbnMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Blcm1pc3Npb25zLmphdmEKaW5kZXggZGE4MDVhZi4uMWQ5NDM4OCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGVybWlzc2lvbnMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9ucy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDYsOCArNDYsOCBAQAogICovCiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbnMgewogCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlcm1pc3Npb24+IGdyYW50ZWRQZXJtaXNzaW9ucyA9IG5ldyBMaW5rZWRMaXN0PFBlcm1pc3Npb24+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlcm1pc3Npb24+IHJldm9rZWRQZXJtaXNzaW9ucyA9IG5ldyBMaW5rZWRMaXN0PFBlcm1pc3Npb24+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBlcm1pc3Npb24+IGdyYW50ZWRQZXJtaXNzaW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGVybWlzc2lvbj4gcmV2b2tlZFBlcm1pc3Npb25zID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgIHByaXZhdGUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucyBncmFudGVkID0gbnVsbDsKICAgICBwcml2YXRlIFNlY3VyaXR5TWFuYWdlciBvcmlnU20gPSBudWxsOwogICAgIHByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBwZXJtaXNzaW9uLmdldE5hbWUoKTsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25zID0gcGVybWlzc2lvbi5nZXRBY3Rpb25zKCk7CiAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/IGV4dGVuZHMgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uPiBjdHIgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihQQVJBTVMpOwotICAgICAgICAgICAgcmV0dXJuIGN0ci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W10ge25hbWUsIGFjdGlvbnN9KTsKKyAgICAgICAgICAgIHJldHVybiBjdHIubmV3SW5zdGFuY2UobmFtZSwgYWN0aW9ucyk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBMZXQgdGhlIFVucmVzb2x2ZWRQZXJtaXNzaW9uIGhhbmRsZSBpdC4KICAgICAgICAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFBlcm1pc3Npb24ocGVybWlzc2lvbi5nZXRDbGFzc05hbWUoKSwKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aW9ucyhmaW5hbCBTdHJpbmcgYWN0aW9ucykgewogICAgICAgICAgICAgYWN0aW9uU3RyaW5nID0gYWN0aW9uczsKLSAgICAgICAgICAgIGlmIChhY3Rpb25zLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKCFhY3Rpb25zLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9ucyA9IHBhcnNlQWN0aW9ucyhhY3Rpb25zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzEyLDIwICszMTIsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFwZXJtLmdldE5hbWUoKS5zdGFydHNXaXRoKG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAxKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5lcXVhbHMocGVybS5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFuYW1lLmVxdWFscyhwZXJtLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhY3Rpb25zICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhcyA9IHBhcnNlQWN0aW9ucyhwZXJtLmdldEFjdGlvbnMoKSk7CiAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNpemUgPSBhcy5zaXplKCk7CiAgICAgICAgICAgICAgICAgYXMucmVtb3ZlQWxsKGFjdGlvbnMpOwotICAgICAgICAgICAgICAgIGlmIChhcy5zaXplKCkgPT0gc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBhY3Rpb25zIHJldm9rZWQsIHNvIGFsbCBhbGxvd2VkLgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElmIG5vIGFjdGlvbnMgcmVtb3ZlZCwgdGhlbiBhbGwgYWxsb3dlZAorICAgICAgICAgICAgICAgIHJldHVybiBhcy5zaXplKCkgIT0gc2l6ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CkBAIC0zMzUsMTEgKzMzMSwxMSBAQAogICAgICAgICAgKiBAcGFyYW0gYWN0aW9ucyBUaGUgYWN0aW9ucyB0byBiZSBwYXJzZWQuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIFNldDxTdHJpbmc+IHBhcnNlQWN0aW9ucyhmaW5hbCBTdHJpbmcgYWN0aW9ucykgewotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIHRrID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY3Rpb25zLCAiLCIpOwogICAgICAgICAgICAgd2hpbGUgKHRrLmhhc01vcmVUb2tlbnMoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpdGVtID0gdGsubmV4dFRva2VuKCkudHJpbSgpOwotICAgICAgICAgICAgICAgIGlmICghaXRlbS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGl0ZW0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Qcm9wZXJ0eVNldC5qYXZhCmluZGV4IGY1OTkyMDQuLjIxZDU5ZmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Byb3BlcnR5U2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUHJvcGVydHlTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE4ICsxOSwxOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTUwLDggKzUwLDggQEAKICAgICBwcml2YXRlIGJvb2xlYW4gZHluYW1pYyA9IHRydWU7CiAgICAgcHJpdmF0ZSBib29sZWFuIG5lZ2F0ZSA9IGZhbHNlOwogICAgIHByaXZhdGUgU2V0PFN0cmluZz4gY2FjaGVkTmFtZXM7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3BlcnR5UmVmPiBwdHlSZWZzID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVJlZj4oKTsKLSAgICBwcml2YXRlIExpc3Q8UHJvcGVydHlTZXQ+IHNldFJlZnMgPSBuZXcgQXJyYXlMaXN0PFByb3BlcnR5U2V0PigpOworICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVJlZj4gcHR5UmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxQcm9wZXJ0eVNldD4gc2V0UmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgTWFwcGVyIG1hcHBlcjsKIAogICAgIC8qKgpAQCAtMTE4LDYgKzExOCw3IEBACiAgICAgICAgICAqIEEgZGVidWcgdG9TdHJpbmcoKS4KICAgICAgICAgICogQHJldHVybiBhIHN0cmluZyB2ZXJzaW9uIG9mIHRoaXMgb2JqZWN0LgogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgICByZXR1cm4gIm5hbWU9IiArIG5hbWUgKyAiLCByZWdleD0iICsgcmVnZXggKyAiLCBwcmVmaXg9IiArIHByZWZpeAogICAgICAgICAgICAgICAgICsgIiwgYnVpbHRpbj0iICsgYnVpbHRpbjsKQEAgLTI3MywxOCArMjc0LDEzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29udmVydCB0aGUgc3lzdGVtIHByb3BlcnRpZXMgdG8gYSBoYXNodGFibGUuCi0gICAgICogVXNlIHByb3BlcnR5bmFtZXMgdG8gZ2V0IHRoZSBsaXN0IG9mIHByb3BlcnRpZXMgKGluY2x1ZGluZworICAgICAqIENvbnZlcnQgdGhlIHN5c3RlbSBwcm9wZXJ0aWVzIHRvIGEgTWFwLgorICAgICAqIFVzZSBzdHJpbmdQcm9wZXJ0eU5hbWVzIHRvIGdldCB0aGUgbGlzdCBvZiBwcm9wZXJ0aWVzIChpbmNsdWRpbmcKICAgICAgKiBkZWZhdWx0IG9uZXMpLgogICAgICAqLwotICAgIHByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiBnZXRBbGxTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+ICByZXQgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PigpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPD8+IGUgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgICBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICByZXQucHV0KG5hbWUsIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkobmFtZSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEFsbFN5c3RlbVByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnN0cmluZ1Byb3BlcnR5TmFtZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAobmFtZSAtPiBuYW1lLCBuYW1lIC0+IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkobmFtZSksIChhLCBiKSAtPiBiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTIsNyArMzA4LDcgQEAKIAogICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGVmZmVjdGl2ZVByb3BlcnRpZXMgPSBnZXRFZmZlY3RpdmVQcm9wZXJ0aWVzKCk7CiAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBnZXRQcm9wZXJ0eU5hbWVzKGVmZmVjdGl2ZVByb3BlcnRpZXMpOwotICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICAvL2l0ZXJhdGUgdGhyb3VnaCB0aGUgbmFtZXMsIGdldCB0aGUgbWF0Y2hpbmcgdmFsdWVzCiAgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwcm9wZXJ0eU5hbWVzKSB7CkBAIC0zNDksNyArMzQ1LDcgQEAKICAgICBwcml2YXRlIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wcykgewogICAgICAgICBTZXQ8U3RyaW5nPiBuYW1lczsKICAgICAgICAgaWYgKGdldER5bmFtaWMoKSB8fCBjYWNoZWROYW1lcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIG5hbWVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgYWRkUHJvcGVydHlOYW1lcyhuYW1lcywgcHJvcHMpOwogICAgICAgICAgICAgLy8gQWRkIHRoaXMgUHJvcGVydHlTZXQncyBuZXN0ZWQgUHJvcGVydHlTZXRzJyBwcm9wZXJ0eSBuYW1lcy4KICAgICAgICAgICAgIGZvciAoUHJvcGVydHlTZXQgc2V0IDogc2V0UmVmcykgewpAQCAtMzU3LDcgKzM1Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobmVnYXRlKSB7CiAgICAgICAgICAgICAgICAgLy9tYWtlIGEgY29weS4uLgotICAgICAgICAgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBjb21wbGVtZW50ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihwcm9wcy5rZXlTZXQoKSk7CisgICAgICAgICAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNvbXBsZW1lbnQgPSBuZXcgSGFzaFNldDw+KHByb3BzLmtleVNldCgpKTsKICAgICAgICAgICAgICAgICBjb21wbGVtZW50LnJlbW92ZUFsbChuYW1lcyk7CiAgICAgICAgICAgICAgICAgbmFtZXMgPSBjb21wbGVtZW50OwogICAgICAgICAgICAgfQpAQCAtNDAzLDE3ICszOTksMTkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoci5idWlsdGluICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIGlmIChyLmJ1aWx0aW4uZXF1YWxzKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUuQUxMKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwocHJvcHMua2V5U2V0KCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci5idWlsdGluLmVxdWFscyhCdWlsdGluUHJvcGVydHlTZXROYW1lLlNZU1RFTSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkQWxsKGdldEFsbFN5c3RlbVByb3BlcnRpZXMoKS5rZXlTZXQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLmJ1aWx0aW4uZXF1YWxzKEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuQ09NTUFORExJTkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzLmFkZEFsbChnZXRQcm9qZWN0KCkuZ2V0VXNlclByb3BlcnRpZXMoKS5rZXlTZXQoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJJbXBvc3NpYmxlOiBJbnZhbGlkIGJ1aWx0aW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXR0cmlidXRlISIpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoci5idWlsdGluKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpblByb3BlcnR5U2V0TmFtZS5BTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwocHJvcHMua2V5U2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQnVpbHRpblByb3BlcnR5U2V0TmFtZS5TWVNURU06CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwoZ2V0QWxsU3lzdGVtUHJvcGVydGllcygpLmtleVNldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEJ1aWx0aW5Qcm9wZXJ0eVNldE5hbWUuQ09NTUFORExJTkU6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hZGRBbGwoZ2V0UHJvamVjdCgpLmdldFVzZXJQcm9wZXJ0aWVzKCkua2V5U2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkltcG9zc2libGU6IEludmFsaWQgYnVpbHRpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImF0dHJpYnV0ZSEiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSW1wb3NzaWJsZTogSW52YWxpZCBQcm9wZXJ0eVJlZiEiKTsKQEAgLTQyNyw3ICs0MjUsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgUHJvcGVydHlTZXQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFByb3BlcnR5U2V0IGdldFJlZigpIHsKLSAgICAgICAgcmV0dXJuIChQcm9wZXJ0eVNldCkgZ2V0Q2hlY2tlZFJlZihQcm9wZXJ0eVNldC5jbGFzcywgInByb3BlcnR5c2V0Iik7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKFByb3BlcnR5U2V0LmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzNyw2ICs0MzUsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgYW5vdGhlciBhdHRyaWJ1dGUgd2FzIHNldCwgc2luY2UKICAgICAgKiAgICAgICAgIHJlZmlkIGFuZCBhbGwgb3RoZXIgYXR0cmlidXRlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB7CiAgICAgICAgIGlmICghbm9BdHRyaWJ1dGVTZXQpIHsKICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CkBAIC00NzUsNiArNDc0LDcgQEAKICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU0gPSAic3lzdGVtIjsKICAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5ETElORSA9ICJjb21tYW5kbGluZSI7CiAgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge0FMTCwgU1lTVEVNLCBDT01NQU5ETElORX07CiAgICAgICAgIH0KQEAgLTQ4NywyMiArNDg3LDE0IEBACiAgICAgICogVGhlIG91dHB1dCBvcmRlciBpcyBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSBrZXlzJyA8aT5uYXR1cmFsIG9yZGVyPC9pPi4KICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcCBvZiB0aGlzIG9iamVjdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBUcmVlTWFwPFN0cmluZywgT2JqZWN0PiBzb3J0ZWQgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIE9iamVjdD4oZ2V0UHJvcGVydHlNYXAoKSk7Ci0gICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGUgOiBzb3J0ZWQuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgaWYgKGIubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYi5hcHBlbmQoZS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBiLmFwcGVuZCgiPSIpOwotICAgICAgICAgICAgYi5hcHBlbmQoZS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gbmV3IFRyZWVNYXA8PihnZXRQcm9wZXJ0eU1hcCgpKS5lbnRyeVNldCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcChlIC0+IGUuZ2V0S2V5KCkgKyAiPSIgKyBlLmdldFZhbHVlKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTUxMCwzNSArNTAyLDI3IEBACiAgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBuYW1lcyA9IGdldFByb3BlcnR5TmFtZXMoZ2V0RWZmZWN0aXZlUHJvcGVydGllcygpKTsKLQotICAgICAgICBNYXBwZXIgbXlNYXBwZXIgPSBnZXRNYXBwZXIoKTsKLSAgICAgICAgZmluYWwgRmlsZU5hbWVNYXBwZXIgbSA9IG15TWFwcGVyID09IG51bGwgPyBudWxsIDogbXlNYXBwZXIuZ2V0SW1wbGVtZW50YXRpb24oKTsKLSAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbmFtZXMuaXRlcmF0b3IoKTsKLQotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPFJlc291cmNlPigpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIFJlc291cmNlIG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgUHJvcGVydHlSZXNvdXJjZSBwID0gbmV3IFByb3BlcnR5UmVzb3VyY2UoZ2V0UHJvamVjdCgpLCBpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG0gPT0gbnVsbCA/IChSZXNvdXJjZSkgcCA6IG5ldyBNYXBwZWRSZXNvdXJjZShwLCBtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgU3RyZWFtPFJlc291cmNlPiByZXN1bHQgPSBnZXRQcm9wZXJ0eU5hbWVzKGdldEVmZmVjdGl2ZVByb3BlcnRpZXMoKSkKKyAgICAgICAgICAgIC5zdHJlYW0oKS5tYXAobmFtZSAtPiBuZXcgUHJvcGVydHlSZXNvdXJjZShnZXRQcm9qZWN0KCksIG5hbWUpKTsKKyAgICAgICAgT3B0aW9uYWw8RmlsZU5hbWVNYXBwZXI+IG0gPQorICAgICAgICAgICAgT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRNYXBwZXIoKSkubWFwKE1hcHBlcjo6Z2V0SW1wbGVtZW50YXRpb24pOworICAgICAgICBpZiAobS5pc1ByZXNlbnQoKSkgeworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0Lm1hcChwIC0+IG5ldyBNYXBwZWRSZXNvdXJjZShwLCBtLmdldCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pdGVyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2VDb2xsZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS5zaXplKCkgOiBnZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpOwogICAgIH0KQEAgLTU0Nyw2ICs1MzEsNyBAQAogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGZpbGVzeXN0ZW0tb25seSByZXNvdXJjZSBjb2xsZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwpAQCAtNTU1LDYgKzU0MCw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjazxPYmplY3Q+IHN0aywgUHJvamVjdCBwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKQEAgLTU2Nyw4ICs1NTMsNyBAQAogICAgICAgICAgICAgICAgIHB1c2hBbmRJbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKG1hcHBlciwgc3RrLCBwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoUHJvcGVydHlTZXQgcHJvcGVydHlTZXQgOiBzZXRSZWZzKSB7Ci0gICAgICAgICAgICAgICAgcHVzaEFuZEludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2socHJvcGVydHlTZXQsIHN0aywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKTsKKyAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhwcm9wZXJ0eVNldCwgc3RrLCBwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNldENoZWNrZWQodHJ1ZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1F1YW50aWZpZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1F1YW50aWZpZXIuamF2YQppbmRleCA3NmI4OGQ2Li5iMDg2OGNjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9RdWFudGlmaWVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUXVhbnRpZmllci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNiArMTcsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiAKIC8qKgpAQCAtMzYsNjEgKzQyLDg0IEBACiAgKiBAc2luY2UgQW50IDEuNwogICovCiBwdWJsaWMgY2xhc3MgUXVhbnRpZmllciBleHRlbmRzIEVudW1lcmF0ZWRBdHRyaWJ1dGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTFVFUwotICAgICAgICA9IG5ldyBTdHJpbmdbXSB7ImFsbCIsICJlYWNoIiwgImV2ZXJ5IiwgImFueSIsICJzb21lIiwgIm9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAibWFqb3JpdHkiLCAibW9zdCIsICJub25lIn07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVTID0KKyAgICAgICAgICAgIFN0cmVhbS5vZihQcmVkaWNhdGUudmFsdWVzKCkpLm1hcChQcmVkaWNhdGU6OmdldE5hbWVzKQorICAgICAgICAgICAgICAgIC5mbGF0TWFwKENvbGxlY3Rpb246OnN0cmVhbSkudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKIAogICAgIC8qKiBBTEwgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YW50aWZpZXIgQUxMID0gbmV3IFF1YW50aWZpZXIoImFsbCIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBBTEwgPSBuZXcgUXVhbnRpZmllcihQcmVkaWNhdGUuQUxMKTsKKwogICAgIC8qKiBBTlkgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YW50aWZpZXIgQU5ZID0gbmV3IFF1YW50aWZpZXIoImFueSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBBTlkgPSBuZXcgUXVhbnRpZmllcihQcmVkaWNhdGUuQU5ZKTsKKwogICAgIC8qKiBPTkUgaW5zdGFuY2UgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YW50aWZpZXIgT05FID0gbmV3IFF1YW50aWZpZXIoIm9uZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBPTkUgPSBuZXcgUXVhbnRpZmllcihQcmVkaWNhdGUuT05FKTsKKwogICAgIC8qKiBNQUpPUklUWSBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBNQUpPUklUWSA9IG5ldyBRdWFudGlmaWVyKCJtYWpvcml0eSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBNQUpPUklUWSA9CisgICAgICAgIG5ldyBRdWFudGlmaWVyKFByZWRpY2F0ZS5NQUpPUklUWSk7CisKICAgICAvKiogTk9ORSBpbnN0YW5jZSAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbnRpZmllciBOT05FID0gbmV3IFF1YW50aWZpZXIoIm5vbmUiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFF1YW50aWZpZXIgTk9ORSA9IG5ldyBRdWFudGlmaWVyKFByZWRpY2F0ZS5OT05FKTsKIAotICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFByZWRpY2F0ZSB7CisgICAgcHJpdmF0ZSBlbnVtIFByZWRpY2F0ZSB7CisgICAgICAgIEFMTCgiYWxsIiwgImVhY2giLCAiZXZlcnkiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZiA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIEFOWSgiYW55IiwgInNvbWUiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdCA+IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgT05FKCJvbmUiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdCA9PSAxOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIE1BSk9SSVRZKCJtYWpvcml0eSIsICJtb3N0IikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHQgPiBmOworICAgICAgICAgICAgfQorICAgICAgICB9LAorCisgICAgICAgIE5PTkUoIm5vbmUiKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdCA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyZWFtLm9mKHZhbHVlcygpKS5maWx0ZXIocCAtPiBwLm5hbWVzLmNvbnRhaW5zKG5hbWUpKQorICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IG5hbWVzOworCisgICAgICAgIFByZWRpY2F0ZShTdHJpbmcgcHJpbWFyeU5hbWUsIFN0cmluZy4uLiBhZGRpdGlvbmFsTmFtZXMpIHsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICAgICAgbmFtZXMuYWRkKHByaW1hcnlOYW1lKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChuYW1lcywgYWRkaXRpb25hbE5hbWVzKTsKKyAgICAgICAgICAgIHRoaXMubmFtZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmFtZXMpOworICAgICAgICB9CisKKyAgICAgICAgU2V0PFN0cmluZz4gZ2V0TmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZXM7CisgICAgICAgIH0KKwogICAgICAgICBhYnN0cmFjdCBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGUgQUxMX1BSRUQgPSBuZXcgUHJlZGljYXRlKCkgewotICAgICAgICBib29sZWFuIGV2YWwoaW50IHQsIGludCBmKSB7IHJldHVybiBmID09IDA7IH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlIEFOWV9QUkVEID0gbmV3IFByZWRpY2F0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBldmFsKGludCB0LCBpbnQgZikgeyByZXR1cm4gdCA+IDA7IH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlIE9ORV9QUkVEID0gbmV3IFByZWRpY2F0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBldmFsKGludCB0LCBpbnQgZikgeyByZXR1cm4gdCA9PSAxOyB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZSBNQUpPUklUWV9QUkVEID0gbmV3IFByZWRpY2F0ZSgpIHsKLSAgICAgICAgYm9vbGVhbiBldmFsKGludCB0LCBpbnQgZikgeyByZXR1cm4gdCA+IGY7IH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlIE5PTkVfUFJFRCA9IG5ldyBQcmVkaWNhdGUoKSB7Ci0gICAgICAgIGJvb2xlYW4gZXZhbChpbnQgdCwgaW50IGYpIHsgcmV0dXJuIHQgPT0gMDsgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGVbXSBQUkVEUyA9IG5ldyBQcmVkaWNhdGVbVkFMVUVTLmxlbmd0aF07Ci0KLSAgICBzdGF0aWMgewotICAgICAgICAvLyBDaGVja1N0eWxlOk1hZ2ljTnVtYmVyIE9GRgotICAgICAgICBQUkVEU1swXSA9IEFMTF9QUkVEOwotICAgICAgICBQUkVEU1sxXSA9IEFMTF9QUkVEOwotICAgICAgICBQUkVEU1syXSA9IEFMTF9QUkVEOwotICAgICAgICBQUkVEU1szXSA9IEFOWV9QUkVEOwotICAgICAgICBQUkVEU1s0XSA9IEFOWV9QUkVEOwotICAgICAgICBQUkVEU1s1XSA9IE9ORV9QUkVEOwotICAgICAgICBQUkVEU1s2XSA9IE1BSk9SSVRZX1BSRUQ7Ci0gICAgICAgIFBSRURTWzddID0gTUFKT1JJVFlfUFJFRDsKLSAgICAgICAgUFJFRFNbOF0gPSBOT05FX1BSRUQ7Ci0gICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgogICAgICAqLwpAQCAtMTA1LDEwICsxMzQsMTUgQEAKICAgICAgICAgc2V0VmFsdWUodmFsdWUpOwogICAgIH0KIAorICAgIHByaXZhdGUgUXVhbnRpZmllcihQcmVkaWNhdGUgaW1wbCkgeworICAgICAgICBzZXRWYWx1ZShpbXBsLmdldE5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgcG9zc2libGUgdmFsdWVzLgogICAgICAqIEByZXR1cm4gU3RyaW5nW10gb2YgRW51bWVyYXRlZEF0dHJpYnV0ZSB2YWx1ZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgcmV0dXJuIFZBTFVFUzsKICAgICB9CkBAIC0xMzksNyArMTczLDcgQEAKICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlF1YW50aWZpZXIgdmFsdWUgbm90IHNldC4iKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gUFJFRFNbaW5kZXhdLmV2YWwodCwgZik7CisgICAgICAgIHJldHVybiBQcmVkaWNhdGUuZ2V0KFZBTFVFU1tpbmRleF0pLmV2YWwodCwgZik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWRpcmVjdG9yRWxlbWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVkaXJlY3RvckVsZW1lbnQuamF2YQppbmRleCBiNTdhZmVjLi5jNzc4Y2EyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWRpcmVjdG9yRWxlbWVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZGlyZWN0b3JFbGVtZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04NSwxMyArODUsMTMgQEAKICAgICBwcml2YXRlIE1hcHBlciBlcnJvck1hcHBlcjsKIAogICAgIC8qKiBpbnB1dCBmaWx0ZXIgY2hhaW5zLiAqLwotICAgIHByaXZhdGUgVmVjdG9yPEZpbHRlckNoYWluPiBpbnB1dEZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8RmlsdGVyQ2hhaW4+IGlucHV0RmlsdGVyQ2hhaW5zID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogb3V0cHV0IGZpbHRlciBjaGFpbnMuICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8RmlsdGVyQ2hhaW4+IG91dHB1dEZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8RmlsdGVyQ2hhaW4+IG91dHB1dEZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIGVycm9yIGZpbHRlciBjaGFpbnMuICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8RmlsdGVyQ2hhaW4+IGVycm9yRmlsdGVyQ2hhaW5zID0gbmV3IFZlY3RvcjxGaWx0ZXJDaGFpbj4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZXJyb3JGaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKiBUaGUgb3V0cHV0IGVuY29kaW5nICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RW5jb2Rpbmc7CkBAIC00NjQsMTYgKzQ2NCwxNiBAQAogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgaWYgKGFsd2F5c0xvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZWRpcmVjdG9yLnNldEFsd2F5c0xvZyhhbHdheXNMb2cuYm9vbGVhblZhbHVlKCkpOworICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRBbHdheXNMb2coYWx3YXlzTG9nKTsKICAgICAgICAgfQogICAgICAgICBpZiAobG9nRXJyb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRMb2dFcnJvcihsb2dFcnJvci5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldExvZ0Vycm9yKGxvZ0Vycm9yKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYXBwZW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0QXBwZW5kKGFwcGVuZC5ib29sZWFuVmFsdWUoKSk7CisgICAgICAgICAgICByZWRpcmVjdG9yLnNldEFwcGVuZChhcHBlbmQpOwogICAgICAgICB9CiAgICAgICAgIGlmIChjcmVhdGVFbXB0eUZpbGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0Q3JlYXRlRW1wdHlGaWxlcyhjcmVhdGVFbXB0eUZpbGVzLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0Q3JlYXRlRW1wdHlGaWxlcyhjcmVhdGVFbXB0eUZpbGVzKTsKICAgICAgICAgfQogICAgICAgICBpZiAob3V0cHV0UHJvcGVydHkgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVkaXJlY3Rvci5zZXRPdXRwdXRQcm9wZXJ0eShvdXRwdXRQcm9wZXJ0eSk7CkBAIC00ODUsNyArNDg1LDcgQEAKICAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0SW5wdXRTdHJpbmcoaW5wdXRTdHJpbmcpOwogICAgICAgICB9CiAgICAgICAgIGlmIChsb2dJbnB1dFN0cmluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZWRpcmVjdG9yLnNldExvZ0lucHV0U3RyaW5nKGxvZ0lucHV0U3RyaW5nLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgICAgIHJlZGlyZWN0b3Iuc2V0TG9nSW5wdXRTdHJpbmcobG9nSW5wdXRTdHJpbmcpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dE1hcHBlciAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBpbnB1dFRhcmdldHMgPSBudWxsOwpAQCAtNTI5LDEzICs1MjksMTMgQEAKICAgICAgICAgICAgICAgICByZWRpcmVjdG9yLnNldEVycm9yKHRvRmlsZUFycmF5KGVycm9yVGFyZ2V0cykpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dEZpbHRlckNoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghaW5wdXRGaWx0ZXJDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZWRpcmVjdG9yLnNldElucHV0RmlsdGVyQ2hhaW5zKGlucHV0RmlsdGVyQ2hhaW5zKTsKICAgICAgICAgfQotICAgICAgICBpZiAob3V0cHV0RmlsdGVyQ2hhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKCFvdXRwdXRGaWx0ZXJDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZWRpcmVjdG9yLnNldE91dHB1dEZpbHRlckNoYWlucyhvdXRwdXRGaWx0ZXJDaGFpbnMpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlcnJvckZpbHRlckNoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghZXJyb3JGaWx0ZXJDaGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZWRpcmVjdG9yLnNldEVycm9yRmlsdGVyQ2hhaW5zKGVycm9yRmlsdGVyQ2hhaW5zKTsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXRFbmNvZGluZyAhPSBudWxsKSB7CkBAIC01NzIsNyArNTcyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIC8vcmVtb3ZlIGFueSBudWxsIGVsZW1lbnRzCi0gICAgICAgIEFycmF5TGlzdDxGaWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxGaWxlPihuYW1lLmxlbmd0aCk7CisgICAgICAgIEFycmF5TGlzdDxGaWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG5hbWUubGVuZ3RoKTsKICAgICAgICAgZm9yIChTdHJpbmcgbiA6IG5hbWUpIHsKICAgICAgICAgICAgIGlmIChuICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBsaXN0LmFkZChnZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobikpOwpAQCAtNTg4LDYgKzU4OCw3IEBACiAgICAgICogQHBhcmFtIHAgICB0aGUgcHJvamVjdCB0byB1c2UgdG8gZGVyZWZlcmVuY2UgdGhlIHJlZmVyZW5jZXMuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpAQCAtNjAzLDcgKzYwNCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHN0ay5wb3AoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgICAgIGZpbmFsIExpc3Q8PyBleHRlbmRzIExpc3Q8RmlsdGVyQ2hhaW4+PiBmaWx0ZXJDaGFpbkxpc3RzID0gQXJyYXlzCiAgICAgICAgICAgICAgICAgICAgIC48TGlzdDxGaWx0ZXJDaGFpbj4+IGFzTGlzdChpbnB1dEZpbHRlckNoYWlucywgb3V0cHV0RmlsdGVyQ2hhaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yRmlsdGVyQ2hhaW5zKTsKQEAgLTYyNCw3ICs2MjQsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgUmVkaXJlY3RvckVsZW1lbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBSZWRpcmVjdG9yRWxlbWVudCBnZXRSZWYoKSB7Ci0gICAgICAgIHJldHVybiAoUmVkaXJlY3RvckVsZW1lbnQpIGdldENoZWNrZWRSZWYoKTsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVkaXJlY3RvckVsZW1lbnQuY2xhc3MpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVmZXJlbmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWZlcmVuY2UuamF2YQppbmRleCBlZWZhYmNmLi5jMzU3ZmE4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWZlcmVuY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWZlcmVuY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwMiwxNyArMTAyLDE4IEBACiAgICAgLyoqCiAgICAgICogUmVzb2x2ZSB0aGUgcmVmZXJlbmNlLCB1c2luZyB0aGUgYXNzb2NpYXRlZCBwcm9qZWN0IGlmCiAgICAgICogaXQgc2V0LCBvdGhlcndpc2UgdXNlIHRoZSBwYXNzZWQgaW4gcHJvamVjdC4KKyAgICAgKiBAcGFyYW0gPFQ+IGRlc2lyZWQgb2JqZWN0IHR5cGUKICAgICAgKiBAcGFyYW0gZmFsbGJhY2sgdGhlIGZhbGxiYWNrIHByb2plY3QgdG8gdXNlIGlmIHRoZSBwcm9qZWN0IGF0dHJpYnV0ZSBvZgogICAgICAqICAgICAgICAgICAgICAgICByZWZlcmVuY2UgaXMgbm90IHNldC4KICAgICAgKiBAcmV0dXJuIHRoZSBkZXJlZmVyZW5jZWQgb2JqZWN0LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gaWYgdGhlIHJlZmVyZW5jZSBjYW5ub3QgYmUgZGVyZWZlcmVuY2VkLgogICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVmZXJlbmNlZE9iamVjdChQcm9qZWN0IGZhbGxiYWNrKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIHB1YmxpYyA8VD4gVCBnZXRSZWZlcmVuY2VkT2JqZWN0KFByb2plY3QgZmFsbGJhY2spIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChyZWZpZCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk5vIHJlZmVyZW5jZSBzcGVjaWZpZWQiKTsKICAgICAgICAgfQogCi0gICAgICAgIE9iamVjdCBvID0gcHJvamVjdCA9PSBudWxsID8gZmFsbGJhY2suZ2V0UmVmZXJlbmNlKHJlZmlkKSA6IHByb2plY3QuZ2V0UmVmZXJlbmNlKHJlZmlkKTsKKyAgICAgICAgVCBvID0gcHJvamVjdCA9PSBudWxsID8gZmFsbGJhY2suZ2V0UmVmZXJlbmNlKHJlZmlkKSA6IHByb2plY3QuZ2V0UmVmZXJlbmNlKHJlZmlkKTsKICAgICAgICAgaWYgKG8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJSZWZlcmVuY2UgIiArIHJlZmlkICsgIiBub3QgZm91bmQuIik7CiAgICAgICAgIH0KQEAgLTEyMiwxMSArMTIzLDEyIEBACiAgICAgLyoqCiAgICAgICogUmVzb2x2ZSB0aGUgcmVmZXJlbmNlLCBsb29raW5nIGluIHRoZSBhc3NvY2lhdGVkIHByb2plY3QuCiAgICAgICogQHNlZSBQcm9qZWN0I2dldFJlZmVyZW5jZQorICAgICAqIEBwYXJhbSA8VD4gZGVzaXJlZCBvYmplY3QgdHlwZQogICAgICAqIEByZXR1cm4gdGhlIGRlcmVmZXJlbmNlZCBvYmplY3QuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcHJvamVjdCBpcyBudWxsIG9yIHRoZSByZWZlcmVuY2UgY2Fubm90IGJlIGRlcmVmZXJlbmNlZAogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlZmVyZW5jZWRPYmplY3QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgIHB1YmxpYyA8VD4gVCBnZXRSZWZlcmVuY2VkT2JqZWN0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJObyBwcm9qZWN0IHNldCBvbiByZWZlcmVuY2UgdG8gIiArIHJlZmlkKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVndWxhckV4cHJlc3Npb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZ3VsYXJFeHByZXNzaW9uLmphdmEKaW5kZXggMThlZTNmMS4uNTA1NGI1MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVndWxhckV4cHJlc3Npb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWd1bGFyRXhwcmVzc2lvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjksMTIgKzY5LDYgQEAKICAgICBwcml2YXRlIFN0cmluZyBteVBhdHRlcm47CiAgICAgcHJpdmF0ZSBib29sZWFuIHNldFBhdHRlcm5QZW5kaW5nID0gZmFsc2U7CiAKLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIFJlZ3VsYXJFeHByZXNzaW9uKCkgewotICAgIH0KLQogICAgIHByaXZhdGUgdm9pZCBpbml0KFByb2plY3QgcCkgewogICAgICAgICBpZiAoIWFscmVhZHlJbml0KSB7CiAgICAgICAgICAgICB0aGlzLnJlZ2V4cCA9IEZBQ1RPUlkubmV3UmVnZXhwKHApOwpAQCAtMTM2LDYgKzEzMCw2IEBACiAgICAgICogQHJldHVybiByZXNvbHZlZCBSZWd1bGFyRXhwcmVzc2lvbiBpbnN0YW5jZQogICAgICAqLwogICAgIHB1YmxpYyBSZWd1bGFyRXhwcmVzc2lvbiBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIHJldHVybiAoUmVndWxhckV4cHJlc3Npb24pIGdldENoZWNrZWRSZWYocCk7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKFJlZ3VsYXJFeHByZXNzaW9uLmNsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSwgcCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlLmphdmEKaW5kZXggNWJmOTgxNC4uMTI1NjNkNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsOCArMjEsOSBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOwogCkBAIC0xNDAsNyArMTQxLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgcmVzb3VyY2UuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TmFtZSgpIDogbmFtZTsKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS5nZXROYW1lKCkgOiBuYW1lOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5LDEwICsxNjAsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0V4aXN0cygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmlzRXhpc3RzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNFeGlzdHMoKTsKICAgICAgICAgfQogICAgICAgICAvL2RlZmF1bHQgdHJ1ZToKLSAgICAgICAgcmV0dXJuIGV4aXN0cyA9PSBudWxsIHx8IGV4aXN0cy5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGV4aXN0cyA9PSBudWxsIHx8IGV4aXN0czsKICAgICB9CiAKICAgICAvKioKQEAgLTE4NiwxMiArMTg3LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFpc0V4aXN0cygpIHx8IGxhc3Rtb2RpZmllZCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9EQVRFVElNRTsKICAgICAgICAgfQotICAgICAgICBsb25nIHJlc3VsdCA9IGxhc3Rtb2RpZmllZC5sb25nVmFsdWUoKTsKKyAgICAgICAgbG9uZyByZXN1bHQgPSBsYXN0bW9kaWZpZWQ7CiAgICAgICAgIHJldHVybiByZXN1bHQgPCBVTktOT1dOX0RBVEVUSU1FID8gVU5LTk9XTl9EQVRFVElNRSA6IHJlc3VsdDsKICAgICB9CiAKQEAgLTIwMSw3ICsyMDIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIGxhc3Rtb2RpZmllZCkgewogICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7Ci0gICAgICAgIHRoaXMubGFzdG1vZGlmaWVkID0gbmV3IExvbmcobGFzdG1vZGlmaWVkKTsKKyAgICAgICAgdGhpcy5sYXN0bW9kaWZpZWQgPSBsYXN0bW9kaWZpZWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTAsMTAgKzIxMSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRGlyZWN0b3J5KCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNEaXJlY3RvcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pc0RpcmVjdG9yeSgpOwogICAgICAgICB9CiAgICAgICAgIC8vZGVmYXVsdCBmYWxzZToKLSAgICAgICAgcmV0dXJuIGRpcmVjdG9yeSAhPSBudWxsICYmIGRpcmVjdG9yeS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeSAhPSBudWxsICYmIGRpcmVjdG9yeTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzMiw3ICsyMzMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFNpemUobG9uZyBzaXplKSB7CiAgICAgICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWQoKTsKLSAgICAgICAgdGhpcy5zaXplID0gbmV3IExvbmcoc2l6ZSA+IFVOS05PV05fU0laRSA/IHNpemUgOiBVTktOT1dOX1NJWkUpOworICAgICAgICB0aGlzLnNpemUgPSBzaXplID4gVU5LTk9XTl9TSVpFID8gc2l6ZSA6IFVOS05PV05fU0laRTsKICAgICB9CiAKICAgICAvKioKQEAgLTI0MywxMCArMjQ0LDEwIEBACiAgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRTaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlzRXhpc3RzKCkKLSAgICAgICAgICAgID8gKHNpemUgIT0gbnVsbCA/IHNpemUubG9uZ1ZhbHVlKCkgOiBVTktOT1dOX1NJWkUpCisgICAgICAgICAgICA/IChzaXplICE9IG51bGwgPyBzaXplIDogVU5LTk9XTl9TSVpFKQogICAgICAgICAgICAgOiAwTDsKICAgICB9CiAKQEAgLTI1NCwxMyArMjU1LDEzIEBACiAgICAgICogQ2xvbmUgdGhpcyBSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIGNvcHkgb2YgdGhpcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CiAgICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGZvciBhIFJlc291cmNlIGNhdWdodC4gIgotICAgICAgICAgICAgICAgICAgICArICJEZXJpdmVkIGNsYXNzZXMgbXVzdCBzdXBwb3J0IGNsb25pbmcuIik7CisgICAgICAgICAgICAgICAgIkNsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGZvciBhIFJlc291cmNlIGNhdWdodC4gRGVyaXZlZCBjbGFzc2VzIG11c3Qgc3VwcG9ydCBjbG9uaW5nLiIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNzEsOSArMjcyLDEwIEBACiAgICAgICogICAgICAgICBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBSZXNvdXJjZS4KICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFJlc291cmNlIG90aGVyKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5jb21wYXJlVG8ob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNvbXBhcmVUbyhvdGhlcik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCkuY29tcGFyZVRvKG90aGVyLnRvU3RyaW5nKCkpOwogICAgIH0KQEAgLTI4NCwxMiArMjg2LDEzIEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgT2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgUmVzb3VyY2UuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CiAgICAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmVxdWFscyhvdGhlcik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSkKICAgICAgICAgICAgICYmIGNvbXBhcmVUbygoUmVzb3VyY2UpIG90aGVyKSA9PSAwOwpAQCAtMzAwLDkgKzMwMywxMCBAQAogICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGFzIGludC4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaGFzaENvZGUoKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKICAgICAgICAgcmV0dXJuIE1BR0lDICogKG5hbWUgPT0gbnVsbCA/IE5VTExfTkFNRSA6IG5hbWUuaGFzaENvZGUoKSk7CkBAIC0zMTksNyArMzIzLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KQEAgLTMzNSw3ICszMzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KQEAgLTM0NSwyNCArMzQ5LDEwIEBACiAgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKQotICAgICAgICAgICAgOiBuZXcgSXRlcmF0b3I8UmVzb3VyY2U+KCkgewotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFkb25lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIFJlc291cmNlIG5leHQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLnRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuaXRlcmF0b3IoKQorICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcykuaXRlcmF0b3IoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3MCw4ICszNjAsOSBAQAogICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZUNvbGxlY3Rpb24uCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5zaXplKCkgOiAxOworICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldFJlZigpLnNpemUoKSA6IDE7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zNzksOCArMzcwLDkgQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBSZXNvdXJjZSBpcyBhIEZpbGVQcm92aWRlci4KICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7Ci0gICAgICAgIHJldHVybiAoaXNSZWZlcmVuY2UoKSAmJiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmlzRmlsZXN5c3RlbU9ubHkoKSkKKyAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpICYmIGdldFJlZigpLmlzRmlsZXN5c3RlbU9ubHkoKSkKICAgICAgICAgICAgIHx8IHRoaXMuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKSAhPSBudWxsOwogICAgIH0KIApAQCAtMzg5LDkgKzM4MSwxMCBAQAogICAgICAqIEByZXR1cm4gdGhpcyBSZXNvdXJjZSBmb3JtYXR0ZWQgYXMgYSBTdHJpbmcuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIG4gPSBnZXROYW1lKCk7CiAgICAgICAgIHJldHVybiBuID09IG51bGwgPyAiKGFub255bW91cykiIDogbjsKQEAgLTQwNSw3ICszOTgsNyBAQAogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b0xvbmdTdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS50b0xvbmdTdHJpbmcoKQorICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldFJlZigpLnRvTG9uZ1N0cmluZygpCiAgICAgICAgICAgICA6IGdldERhdGFUeXBlTmFtZSgpICsgIiBcIiIgKyB0b1N0cmluZygpICsgJyInOwogICAgIH0KIApAQCAtNDEzLDYgKzQwNiw3IEBACiAgICAgICogT3ZlcnJpZGVzIHRoZSBiYXNlIHZlcnNpb24uCiAgICAgICogQHBhcmFtIHIgdGhlIFJlZmVyZW5jZSB0byBzZXQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbAogICAgICAgICAgICAgfHwgZXhpc3RzICE9IG51bGwKQEAgLTQ0Myw0ICs0MzcsMjQgQEAKICAgICBwdWJsaWMgPFQ+IFQgYXMoQ2xhc3M8VD4gY2xhenopIHsKICAgICAgICAgcmV0dXJuIGNsYXp6LmlzQXNzaWduYWJsZUZyb20oZ2V0Q2xhc3MoKSkgPyBjbGF6ei5jYXN0KHRoaXMpIDogbnVsbDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0BsaW5rICNhcyhDbGFzcyl9IGFzIGFuIHtAbGluayBPcHRpb25hbH0uCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKKyAgICAgKiBAcGFyYW0gY2xhenogYSBjbGFzcworICAgICAqIEByZXR1cm4ge0BsaW5rIE9wdGlvbmFsfSByZXNvdXJjZSBvZiBhIGRlc2lyZWQgdHlwZQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIDxUPiBPcHRpb25hbDxUPiBhc09wdGlvbmFsKENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGFzKGNsYXp6KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgY2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYW5kIHJldHVybiB0aGUKKyAgICAgKiByZWZlcmVuY2VkIFJlc291cmNlLgorICAgICAqIEByZXR1cm4gPGNvZGU+UmVzb3VyY2U8L2NvZGU+LgorICAgICAqLworICAgIHByb3RlY3RlZCBSZXNvdXJjZSBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUNvbGxlY3Rpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCmluZGV4IGE4MmM4YjUuLjM0ZGFiOGEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlQ29sbGVjdGlvbi5qYXZhCkBAIC0xLDUwICsxLDYxIEBACiAvKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzCisgKiB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGCisgKiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdworICogb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzCisgKiBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisgKiBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvKioKICAqIEludGVyZmFjZSBkZXNjcmliaW5nIGEgY29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCisgKgogICogQHNpbmNlIEFudCAxLjcKICAqLwogcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUNvbGxlY3Rpb24gZXh0ZW5kcyBJdGVyYWJsZTxSZXNvdXJjZT4gewogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGVudHMgb2YgdGhpcyBjb2xsZWN0aW9uLgotICAgICAqIEByZXR1cm4gYWxsIHJlc291cmNlcyBpbiB0aGUgY29sbGVjdGlvbgotICAgICAqLwotICAgIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpOwotCi0gICAgLyoqCiAgICAgICogTGVhcm4gdGhlIG51bWJlciBvZiBjb250YWluZWQgUmVzb3VyY2VzLgorICAgICAqCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLwogICAgIGludCBzaXplKCk7CiAKICAgICAvKioKICAgICAgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoaXMgUmVzb3VyY2VDb2xsZWN0aW9uIGlzIGNvbXBvc2VkIGVudGlyZWx5IG9mCi0gICAgICogUmVzb3VyY2VzIGFjY2Vzc2libGUgdmlhIGxvY2FsIGZpbGVzeXN0ZW0gY29udmVudGlvbnMuIElmIHRydWUsCi0gICAgICogYWxsIHJlc291cmNlcyByZXR1cm5lZCBmcm9tIHRoaXMgY29sbGVjdGlvbiBzaG91bGQKLSAgICAgKiByZXNwb25kIHdpdGggYSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVQcm92aWRlcn0KLSAgICAgKiB3aGVuIGFza2VkIHZpYSB7QGxpbmsgUmVzb3VyY2UjYXN9LgorICAgICAqIFJlc291cmNlcyBhY2Nlc3NpYmxlIHZpYSBsb2NhbCBmaWxlc3lzdGVtIGNvbnZlbnRpb25zLiBJZiB0cnVlLCBhbGwKKyAgICAgKiByZXNvdXJjZXMgcmV0dXJuZWQgZnJvbSB0aGlzIGNvbGxlY3Rpb24gc2hvdWxkIHJlc3BvbmQgd2l0aCBhCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUHJvdmlkZXJ9IHdoZW4gYXNrZWQgdmlhCisgICAgICoge0BsaW5rIFJlc291cmNlI2FzfS4KKyAgICAgKgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgZmlsZXN5c3RlbS1vbmx5IHJlc291cmNlIGNvbGxlY3Rpb24uCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB7QGxpbmsgU3RyZWFtfSBvdmVyIHRoaXMge0BsaW5rIFJlc291cmNlQ29sbGVjdGlvbn0uCisgICAgICogQHJldHVybiB7QGxpbmsgU3RyZWFtfSBvZiB7QGxpbmsgUmVzb3VyY2V9CisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKi8KKyAgICBkZWZhdWx0IFN0cmVhbTw/IGV4dGVuZHMgUmVzb3VyY2U+IHN0cmVhbSgpIHsKKyAgICAgICAgZmluYWwgU3RyZWFtLkJ1aWxkZXI8UmVzb3VyY2U+IGIgPSBTdHJlYW0uYnVpbGRlcigpOworICAgICAgICBmb3JFYWNoKGIpOworICAgICAgICByZXR1cm4gYi5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyB7QGxpbmsgUmVzb3VyY2VDb2xsZWN0aW9ufSBpcyBlbXB0eS4KKyAgICAgKiBAcmV0dXJuIGJvb2xlYW4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuIHNpemUoKSA9PSAwOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VGYWN0b3J5LmphdmEKaW5kZXggNTE1MzE4ZS4uZWMyZWYwMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUxvY2F0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZUxvY2F0aW9uLmphdmEKaW5kZXggMDg3OTE1NC4uNTllYWJmZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VMb2NhdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlTG9jYXRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDcgKzI0LDcgQEAKICAqIDxjb2RlPiZsdDtlbnRpdHkmZ3Q7PC9jb2RlPiBuZXN0ZWQgZWxlbWVudHMuICBUaGVzZSBjb3JyZXNwb25kIHRvCiAgKiB0aGUgPGNvZGU+UFVCTElDPC9jb2RlPiBhbmQgPGNvZGU+VVJJPC9jb2RlPiBjYXRhbG9nIGVudHJ5IHR5cGVzLAogICogcmVzcGVjdGl2ZWx5LCBhcyBkZWZpbmVkIGluIHRoZSA8YQotICogaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KKyAqIGhyZWY9Imh0dHBzOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy0yMDAxLTA4LTA2Lmh0bWwiPgogICogT0FTSVMgIk9wZW4gQ2F0YWxvZyIgc3RhbmRhcmQ8L2E+LjwvcD4KICAqCiAgKiA8cD5Qb3NzaWJsZSBGdXR1cmUgRW5oYW5jZW1lbnRzOjwvcD4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1N1YnN0aXR1dGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvU3Vic3RpdHV0aW9uLmphdmEKaW5kZXggMmIxMWRhNS4uNzE5N2IzNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvU3Vic3RpdHV0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvU3Vic3RpdHV0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC03MSw2ICs3MSw2IEBACiAgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgcmVmZXJlbmNlCiAgICAgICovCiAgICAgcHVibGljIFN1YnN0aXR1dGlvbiBnZXRSZWYoUHJvamVjdCBwKSB7Ci0gICAgICAgIHJldHVybiAoU3Vic3RpdHV0aW9uKSBnZXRDaGVja2VkUmVmKHApOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihTdWJzdGl0dXRpb24uY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpLCBwKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0LmphdmEKaW5kZXggNjQ0NmU5Yi4uMmQwODUwMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1RhckZpbGVTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRVc2VyTmFtZSgpOworICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0UmVmKCkpLmdldFVzZXJOYW1lKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHVzZXJOYW1lOwogICAgIH0KQEAgLTEwNiw3ICsxMDYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0VWlkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRVaWQoKTsKKyAgICAgICAgICAgIHJldHVybiAoKFRhckZpbGVTZXQpIGdldFJlZigpKS5nZXRVaWQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdWlkOwogICAgIH0KQEAgLTEzNCw3ICsxMzQsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXAoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYXJGaWxlU2V0KSBnZXRDaGVja2VkUmVmKCkpLmdldEdyb3VwKCk7CisgICAgICAgICAgICByZXR1cm4gKChUYXJGaWxlU2V0KSBnZXRSZWYoKSkuZ2V0R3JvdXAoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ3JvdXBOYW1lOwogICAgIH0KQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0R2lkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoVGFyRmlsZVNldCkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRHaWQoKTsKKyAgICAgICAgICAgIHJldHVybiAoKFRhckZpbGVTZXQpIGdldFJlZigpKS5nZXRHaWQoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2lkOwogICAgIH0KQEAgLTE3OCw2ICsxNzgsNyBAQAogICAgICAqIENyZWF0ZSBhIG5ldyBzY2FubmVyLgogICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgc2Nhbm5lci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQXJjaGl2ZVNjYW5uZXIgbmV3QXJjaGl2ZVNjYW5uZXIoKSB7CiAgICAgICAgIFRhclNjYW5uZXIgenMgPSBuZXcgVGFyU2Nhbm5lcigpOwogICAgICAgICB6cy5zZXRFbmNvZGluZyhnZXRFbmNvZGluZygpKTsKQEAgLTE5Miw2ICsxOTMsNyBAQAogICAgICAqIEBwYXJhbSByIHRoZSA8Y29kZT5SZWZlcmVuY2U8L2NvZGU+IHRvIHVzZS4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICh1c2VyTmFtZVNldCB8fCB1c2VySWRTZXQgfHwgZ3JvdXBOYW1lU2V0IHx8IGdyb3VwSWRTZXQpIHsKICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CkBAIC0yMDUsMTkgKzIwNywzMCBAQAogICAgICAqIEBwYXJhbSBwIHRoZSBwcm9qZWN0IHRvIHVzZQogICAgICAqIEByZXR1cm4gdGhlIGFic3RyYWN0IGZpbGVzZXQgaW5zdGFuY2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldFJlZihQcm9qZWN0IHApIHsKICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZShwKTsKICAgICAgICAgT2JqZWN0IG8gPSBnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QocCk7CiAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgVGFyRmlsZVNldCkgewogICAgICAgICAgICAgcmV0dXJuIChBYnN0cmFjdEZpbGVTZXQpIG87Ci0gICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEZpbGVTZXQpIHsKICAgICAgICAgICAgIFRhckZpbGVTZXQgemZzID0gbmV3IFRhckZpbGVTZXQoKEZpbGVTZXQpIG8pOwogICAgICAgICAgICAgY29uZmlndXJlRmlsZVNldCh6ZnMpOwogICAgICAgICAgICAgcmV0dXJuIHpmczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBnZXRSZWZpZCgpLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IGRlbm90ZSBhIHRhcmZpbGVzZXQgb3IgYSBmaWxlc2V0IjsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOwogICAgICAgICB9CisgICAgICAgIFN0cmluZyBtc2cgPSBnZXRSZWZpZCgpLmdldFJlZklkKCkgKyAiIGRvZXNuXCd0IGRlbm90ZSBhIHRhcmZpbGVzZXQgb3IgYSBmaWxlc2V0IjsKKyAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1zZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBUYXJGaWxlc2V0IGFjY2VwdHMgYW5vdGhlciBUYXJGaWxlU2V0IG9yIGEgRmlsZVNldCBhcyByZWZlcmVuY2UKKyAgICAgKiBGaWxlU2V0cyBhcmUgb2Z0ZW4gdXNlZCBieSB0aGUgd2FyIHRhc2sgZm9yIHRoZSBsaWIgYXR0cmlidXRlCisgICAgICogQHJldHVybiB0aGUgYWJzdHJhY3QgZmlsZXNldCBpbnN0YW5jZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBYnN0cmFjdEZpbGVTZXQgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVmKGdldFByb2plY3QoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMjYsNiArMjM5LDcgQEAKICAgICAgKiBzcGVjaWZpYyBhdHRyaWJ1dGVzLgogICAgICAqIEBwYXJhbSB6ZnMgdGhlIGFyY2hpdmUgZmlsZXNldCB0byBjb25maWd1cmUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRmlsZVNldChBcmNoaXZlRmlsZVNldCB6ZnMpIHsKICAgICAgICAgc3VwZXIuY29uZmlndXJlRmlsZVNldCh6ZnMpOwogICAgICAgICBpZiAoemZzIGluc3RhbmNlb2YgVGFyRmlsZVNldCkgewpAQCAtMjQyLDEyICsyNTYsMTIgQEAKICAgICAgKiBhcyB0aGlzIG9uZS4KICAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgdGFyRmlsZVNldAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYXJGaWxlU2V0KSBnZXRSZWYoZ2V0UHJvamVjdCgpKSkuY2xvbmUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBzdXBlci5jbG9uZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNsb25lKCk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJTY2FubmVyLmphdmEKaW5kZXggYTNjN2Y2ZC4uMWRjYTNlZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyU2Nhbm5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1RhclNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDcgKzIzLDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5UYXJSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci5UYXJFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnRhci5UYXJJbnB1dFN0cmVhbTsKIApAQCAtNTMsMzUgKzUyLDMwIEBACiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZmlsZUVudHJpZXMsIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaEZpbGVFbnRyaWVzLAogICAgICAgICAgICAgTWFwPFN0cmluZywgUmVzb3VyY2U+IGRpckVudHJpZXMsIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaERpckVudHJpZXMpIHsKIAotICAgICAgICBUYXJFbnRyeSBlbnRyeSA9IG51bGw7Ci0gICAgICAgIFRhcklucHV0U3RyZWFtIHRpID0gbnVsbDsKLQotICAgICAgICB0cnkgeworICAgICAgICB0cnkgKFRhcklucHV0U3RyZWFtIHRpID0gbmV3IFRhcklucHV0U3RyZWFtKHNyYy5nZXRJbnB1dFN0cmVhbSgpLCBlbmNvZGluZykpIHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGkgPSBuZXcgVGFySW5wdXRTdHJlYW0oc3JjLmdldElucHV0U3RyZWFtKCksIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJwcm9ibGVtIG9wZW5pbmcgIiArIHNyY0ZpbGUsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB0aS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFJlc291cmNlIHIgPSBuZXcgVGFyUmVzb3VyY2Uoc3JjLCBlbnRyeSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRyaW1TZXBhcmF0b3IobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRpckVudHJpZXMucHV0KG5hbWUsIHIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRGlyRW50cmllcy5wdXQobmFtZSwgcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaWxlRW50cmllcy5wdXQobmFtZSwgcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaChuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgVGFyRW50cnkgZW50cnkgPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlICgoZW50cnkgPSB0aS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSByID0gbmV3IFRhclJlc291cmNlKHNyYywgZW50cnkpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0cmltU2VwYXJhdG9yKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZGlyRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaERpckVudHJpZXMucHV0KG5hbWUsIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUVudHJpZXMucHV0KG5hbWUsIHIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGaWxlRW50cmllcy5wdXQobmFtZSwgcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvYmxlbSByZWFkaW5nICIgKyBzcmNGaWxlLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb2JsZW0gcmVhZGluZyAiICsgc3JjRmlsZSwgZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHRpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicHJvYmxlbSBvcGVuaW5nICIgKyBzcmNGaWxlLCBleCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UaW1lQ29tcGFyaXNvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGltZUNvbXBhcmlzb24uamF2YQppbmRleCAxNWMxMzZlLi42N2M0OTk4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UaW1lQ29tcGFyaXNvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1RpbWVDb21wYXJpc29uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nLmphdmEKaW5kZXggYzg1N2JkOC4uZDViY2UzMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1hNTENhdGFsb2cuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDEzICsxOSwxMyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwogaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCkBAIC01MCwyMSArNTAsMjEgQEAKIC8qKgogICogPHA+VGhpcyBkYXRhIHR5cGUgcHJvdmlkZXMgYSBjYXRhbG9nIG9mIHJlc291cmNlIGxvY2F0aW9ucyAoc3VjaCBhcwogICogRFREcyBhbmQgWE1MIGVudGl0aWVzKSwgYmFzZWQgb24gdGhlIDxhCi0gKiBocmVmPSJodHRwOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy0yMDAxLTA4LTA2Lmh0bWwiPgorICogaHJlZj0iaHR0cHM6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CiAgKiBPQVNJUyAiT3BlbiBDYXRhbG9nIiBzdGFuZGFyZDwvYT4uICBUaGUgY2F0YWxvZyBlbnRyaWVzIGFyZSB1c2VkCiAgKiBib3RoIGZvciBFbnRpdHkgcmVzb2x1dGlvbiBhbmQgVVJJIHJlc29sdXRpb24sIGluIGFjY29yZGFuY2Ugd2l0aAogICogdGhlIHtAbGluayBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlciBFbnRpdHlSZXNvbHZlcn0gYW5kIHtAbGluawogICogamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlciBVUklSZXNvbHZlcn0gaW50ZXJmYWNlcyBhcyBkZWZpbmVkCi0gKiBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4cCI+SmF2YSBBUEkgZm9yIFhNTAorICogaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy94bWwvamF4cC9pbmRleC5odG1sIj5KYXZhIEFQSSBmb3IgWE1MCiAgKiBQcm9jZXNzaW5nIFNwZWNpZmljYXRpb248L2E+LjwvcD4KICAqCiAgKiA8cD5SZXNvdXJjZSBsb2NhdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgaW4tbGluZSBvciBpbgogICogZXh0ZXJuYWwgY2F0YWxvZyBmaWxlKHMpLCBvciBib3RoLiAgSW4gb3JkZXIgdG8gdXNlIGFuIGV4dGVybmFsCiAgKiBjYXRhbG9nIGZpbGUsIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5ICgicmVzb2x2ZXIuamFyIikKICAqIG11c3QgYmUgaW4geW91ciBjbGFzc3BhdGguICBFeHRlcm5hbCBjYXRhbG9nIGZpbGVzIG1heSBiZSBlaXRoZXIgPGEKLSAqIGhyZWY9Imh0dHA6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9iYWNrZ3JvdW5kLzk0MDEuaHRtbCI+CisgKiBocmVmPSJodHRwczovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIj4KICAqIHBsYWluIHRleHQgZm9ybWF0PC9hPiBvciA8YQotICogaHJlZj0iaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CisgKiBocmVmPSJodHRwczovL3d3dy5vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+CiAgKiBYTUwgZm9ybWF0PC9hPi4gIElmIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciBsaWJyYXJ5IGlzIG5vdCBmb3VuZAogICogaW4gdGhlIGNsYXNzcGF0aCwgZXh0ZXJuYWwgY2F0YWxvZyBmaWxlcywgc3BlY2lmaWVkIGluCiAgKiA8Y29kZT4mbHQ7Y2F0YWxvZ3BhdGgmZ3Q7PC9jb2RlPiBwYXRocywgd2lsbCBiZSBpZ25vcmVkIGFuZCBhIHdhcm5pbmcgd2lsbApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgLy8tLSBGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgICAgLyoqIEhvbGRzIGR0ZC9lbnRpdHkgb2JqZWN0cyB1bnRpbCBuZWVkZWQuICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8UmVzb3VyY2VMb2NhdGlvbj4gZWxlbWVudHMgPSBuZXcgVmVjdG9yPFJlc291cmNlTG9jYXRpb24+KCk7CisgICAgcHJpdmF0ZSBWZWN0b3I8UmVzb3VyY2VMb2NhdGlvbj4gZWxlbWVudHMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIENsYXNzcGF0aCBpbiB3aGljaCB0byBhdHRlbXB0IHRvIHJlc29sdmUgcmVzb3VyY2VzLgpAQCAtMzUzLDYgKzM1Myw3IEBACiAgICAgICogQHBhcmFtIHIgdGhlIHJlZmVyZW5jZSB0byB3aGljaCB0aGlzIGNhdGFsb2cgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZAogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgdGhpcyBpbnN0YW5jZSBhbHJlYWR5IGhhcyBiZWVuIGNvbmZpZ3VyZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmICghZWxlbWVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwpAQCAtMzY5LDYgKzM3MCw3IEBACiAgICAgICogQHJldHVybiB0aGUgcmVzb2x2ZWQgZW50aXR5LgogICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQogICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAKQEAgLTQwMCw2ICs0MDIsNyBAQAogICAgICAqIEB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgogICAgICAqIEBzZWUgamF2YXgueG1sLnRyYW5zZm9ybS5VUklSZXNvbHZlciNyZXNvbHZlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNvdXJjZSByZXNvbHZlKFN0cmluZyBocmVmLCBTdHJpbmcgYmFzZSkKICAgICAgICAgdGhyb3dzIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKIApAQCAtNDI1LDE0ICs0MjgsMTQgQEAKICAgICAgICAgICAgIC8vIHNldEVudGl0eVJlc29sdmVyIChzZWUgc2V0RW50aXR5UmVzb2x2ZXIgamF2YWRvYyBjb21tZW50KQogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIHNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoKTsKLSAgICAgICAgICAgIFVSTCBiYXNlVVJMID0gbnVsbDsKKyAgICAgICAgICAgIFVSTCBiYXNlVVJMOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBpZiAoYmFzZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgIGJhc2VVUkwgPSBGSUxFX1VUSUxTLmdldEZpbGVVUkwoZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYmFzZVVSTCA9IG5ldyBVUkwoYmFzZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFVSTCB1cmwgPSAodXJpLmxlbmd0aCgpID09IDAgPyBiYXNlVVJMIDogbmV3IFVSTChiYXNlVVJMLCB1cmkpKTsKKyAgICAgICAgICAgICAgICBVUkwgdXJsID0gdXJpLmlzRW1wdHkoKSA/IGJhc2VVUkwgOiBuZXcgVVJMKGJhc2VVUkwsIHVyaSk7CiAgICAgICAgICAgICAgICAgc291cmNlLnNldElucHV0U291cmNlKG5ldyBJbnB1dFNvdXJjZSh1cmwudG9TdHJpbmcoKSkpOwogICAgICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBhcmUgcHJvYmFibHkgaW4gZmFpbHVyZSBtb2RlLCBidXQKQEAgLTQ0NSw2ICs0NDgsNyBAQAogICAgICAgICByZXR1cm4gc291cmNlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpAQCAtNDcwLDcgKzQ3NCw3IEBACiAgICAgICAgIGlmICghaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoWE1MQ2F0YWxvZy5jbGFzcywgInhtbGNhdGFsb2ciKTsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoWE1MQ2F0YWxvZy5jbGFzcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00OTIsNyArNDk2LDcgQEAKIAogICAgICAgICBpZiAoY2F0YWxvZ1Jlc29sdmVyID09IG51bGwpIHsKIAotICAgICAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKKyAgICAgICAgICAgIEFudENsYXNzTG9hZGVyIGxvYWRlcjsKICAgICAgICAgICAgIC8vIE1lbW9yeS1MZWFrIGluIGxpbmUgYmVsb3cKICAgICAgICAgICAgIGxvYWRlciA9IGdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihQYXRoLnN5c3RlbUNsYXNzcGF0aCk7CiAKQEAgLTU1MSwxMCArNTU1LDEwIEBACiAgICAgICogaW5oZXJpdCB0aGUgRW50aXR5UmVzb2x2ZXIgb2YgdGhlIG9yaWdpbmFsIChhbHRob3VnaCBhcmd1YWJseQogICAgICAqIGl0IHNob3VsZCkuICBTZWUgYmVsb3c6PC9wPgogICAgICAqCi0gICAgICogPHR0PiJJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBzZXQgdGhlIEVycm9ySGFuZGxlciBvcgorICAgICAqIDxjb2RlPiJJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBzZXQgdGhlIEVycm9ySGFuZGxlciBvcgogICAgICAqIEVudGl0eVJlc29sdmVyIGZvciBhbiBYTUxSZWFkZXIgdXNlZCBkdXJpbmcgYSB0cmFuc2Zvcm1hdGlvbiwKICAgICAgKiBpdCBzaG91bGQgdXNlIGEgVVJJUmVzb2x2ZXIgdG8gcmV0dXJuIHRoZSBTQVhTb3VyY2Ugd2hpY2gKLSAgICAgKiBwcm92aWRlcyAod2l0aCBnZXRYTUxSZWFkZXIpIGEgcmVmZXJlbmNlIHRvIHRoZSBYTUxSZWFkZXIiPC90dD4KKyAgICAgKiBwcm92aWRlcyAod2l0aCBnZXRYTUxSZWFkZXIpIGEgcmVmZXJlbmNlIHRvIHRoZSBYTUxSZWFkZXIiPC9jb2RlPgogICAgICAqCiAgICAgICogPHA+Li4ucXVvdGVkIGZyb20gcGFnZSAxMTggb2YgdGhlIEphdmEgQVBJIGZvciBYTUwKICAgICAgKiBQcm9jZXNzaW5nIDEuMSBzcGVjaWZpY2F0aW9uPC9wPgpAQCAtNTY4LDkgKzU3Miw3IEBACiAgICAgICAgICAgICBzcEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHJlYWRlciA9IHNwRmFjdG9yeS5uZXdTQVhQYXJzZXIoKS5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJFeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHwgU0FYRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTg3LDE5ICs1ODksMTYgQEAKICAgICAgKiAgICAgICAgIG9mIHRoZSBSZXNvdXJjZSBvciBudWxsIGlmIG5vIHN1Y2ggaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogICAgICAqLwogICAgIHByaXZhdGUgUmVzb3VyY2VMb2NhdGlvbiBmaW5kTWF0Y2hpbmdFbnRyeShTdHJpbmcgcHVibGljSWQpIHsKLSAgICAgICAgZm9yIChSZXNvdXJjZUxvY2F0aW9uIGVsZW1lbnQgOiBnZXRFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoZWxlbWVudC5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgIC5maWx0ZXIoZSAtPiBlLmdldFB1YmxpY0lkKCkuZXF1YWxzKHB1YmxpY0lkKSkuZmluZEZpcnN0KCkKKyAgICAgICAgICAgIC5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVXRpbGl0eSBtZXRob2QgdG8gcmVtb3ZlIHRyYWlsaW5nIGZyYWdtZW50IGZyb20gYSBVUkkuCiAgICAgICogRm9yIGV4YW1wbGUsCi0gICAgICogPGNvZGU+aHR0cDovL2phdmEuc3VuLmNvbS9pbmRleC5odG1sI2NoYXB0ZXIxPC9jb2RlPgotICAgICAqIHdvdWxkIHJldHVybiA8Y29kZT5odHRwOi8vamF2YS5zdW4uY29tL2luZGV4Lmh0bWw8L2NvZGU+LgorICAgICAqIDxjb2RlPmh0dHBzOi8vamF2YS5zdW4uY29tL2luZGV4Lmh0bWwjY2hhcHRlcjE8L2NvZGU+CisgICAgICogd291bGQgcmV0dXJuIDxjb2RlPmh0dHBzOi8vamF2YS5zdW4uY29tL2luZGV4Lmh0bWw8L2NvZGU+LgogICAgICAqCiAgICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHRvIHByb2Nlc3MuICBJdCBtYXkgb3IgbWF5IG5vdCBjb250YWluIGEKICAgICAgKiAgICAgICAgICAgIGZyYWdtZW50LgpAQCAtNjI1LDcgKzYyNCw3IEBACiAgICAgICAgIFN0cmluZyB1cmkgPSBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCk7CiAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgbGluZSBzZWVtcyB0byBiZSBuZWNlc3Nhcnkgb24gV2luZG93cyB1bmRlciBKREsgMS4yCiAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLSAgICAgICAgVVJMIGJhc2VVUkwgPSBudWxsOworICAgICAgICBVUkwgYmFzZVVSTDsKIAogICAgICAgICAvLwogICAgICAgICAvLyBUaGUgUmVzb3VyY2VMb2NhdGlvbiBtYXkgc3BlY2lmeSBhIHJlbGF0aXZlIHBhdGggZm9yIGl0cwpAQCAtNjQyLDcgKzY0MSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBudWxsOwogICAgICAgICBVUkwgdXJsID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoYmFzZVVSTCwgdXJpKTsKQEAgLTY2NywxNCArNjY1LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodXJsICE9IG51bGwgJiYgdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKKyAgICAgICAgaWYgKHVybCAhPSBudWxsICYmICJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7CiAgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX1VUSUxTLmZyb21VUkkodXJsLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBsb2coImZpbGVOYW1lICIgKyBmaWxlTmFtZSwgUHJvamVjdC5NU0dfREVCVUcpOwogICAgICAgICAgICAgICAgIEZpbGUgcmVzRmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAocmVzRmlsZS5leGlzdHMoKSAmJiByZXNGaWxlLmNhblJlYWQoKSkgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzRmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gbmV3IElucHV0U291cmNlKEZpbGVzLm5ld0lucHV0U3RyZWFtKHJlc0ZpbGUudG9QYXRoKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzeXNpZCA9IEpBWFBVdGlscy5nZXRTeXN0ZW1JZChyZXNGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzeXNpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coImNhdGFsb2cgZW50cnkgbWF0Y2hlZCBhIHJlYWRhYmxlIGZpbGU6ICciCkBAIC02OTgsMTQgKzY5NywxMyBAQAogCiAgICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG51bGw7CiAKLSAgICAgICAgQW50Q2xhc3NMb2FkZXIgbG9hZGVyID0gbnVsbDsKICAgICAgICAgUGF0aCBjcCA9IGNsYXNzcGF0aDsKICAgICAgICAgaWYgKGNwICE9IG51bGwpIHsKICAgICAgICAgICAgIGNwID0gY2xhc3NwYXRoLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjcCA9IChuZXcgUGF0aChnZXRQcm9qZWN0KCkpKS5jb25jYXRTeXN0ZW1DbGFzc3BhdGgoImxhc3QiKTsKICAgICAgICAgfQotICAgICAgICBsb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY3ApOworICAgICAgICBBbnRDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIoY3ApOwogCiAgICAgICAgIC8vCiAgICAgICAgIC8vIGZvciBjbGFzc3BhdGggbG9va3VwIHdlIGlnbm9yZSB0aGUgYmFzZSBkaXJlY3RvcnkKQEAgLTczNCw3ICs3MzIsNyBAQAogICAgIHByaXZhdGUgSW5wdXRTb3VyY2UgdXJsTG9va3VwKFJlc291cmNlTG9jYXRpb24gbWF0Y2hpbmdFbnRyeSkgewogCiAgICAgICAgIFN0cmluZyB1cmkgPSBtYXRjaGluZ0VudHJ5LmdldExvY2F0aW9uKCk7Ci0gICAgICAgIFVSTCBiYXNlVVJMID0gbnVsbDsKKyAgICAgICAgVVJMIGJhc2VVUkw7CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gVGhlIFJlc291cmNlTG9jYXRpb24gbWF5IHNwZWNpZnkgYSByZWxhdGl2ZSB1cmwgZm9yIGl0cwpAQCAtNzUxLDE1ICs3NDksMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIElucHV0U291cmNlIHNvdXJjZSA9IG51bGw7Ci0gICAgICAgIFVSTCB1cmwgPSBudWxsOworICAgICAgICBVUkwgdXJsOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB1cmwgPSBuZXcgVVJMKGJhc2VVUkwsIHVyaSk7CiAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICB1cmwgPSBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKICAgICAgICAgaWYgKHVybCAhPSBudWxsKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbnVsbDsKQEAgLTc4OSwxMCArNzg3LDggQEAKICAgICAgKiB0aGUgRXh0ZXJuYWxSZXNvbHZlciBzdHJhdGVneS4KICAgICAgKi8KICAgICBwcml2YXRlIGludGVyZmFjZSBDYXRhbG9nUmVzb2x2ZXIgZXh0ZW5kcyBVUklSZXNvbHZlciwgRW50aXR5UmVzb2x2ZXIgewotCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKTsKLQotICAgICAgICBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbjsKICAgICB9CiAKICAgICAvKioKQEAgLTgwOSw2ICs4MDUsNyBAQAogICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKSB7CiAgICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwpAQCAtODM0LDYgKzgzMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTb3VyY2UgcmVzb2x2ZShTdHJpbmcgaHJlZiwgU3RyaW5nIGJhc2UpCiAgICAgICAgICAgICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewogCkBAIC05MjIsMjEgKzkyMCwxNyBAQAogICAgICAgICAgICAgLy8gaW4gdGhlIGNsYXNzcGF0aC4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHNldFhNTENhdGFsb2cgPQotICAgICAgICAgICAgICAgICAgICByZXNvbHZlckltcGxDbGFzcy5nZXRNZXRob2QoInNldFhNTENhdGFsb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge1hNTENhdGFsb2cuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICBzZXRYTUxDYXRhbG9nID0gcmVzb2x2ZXJJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJzZXRYTUxDYXRhbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFhNTENhdGFsb2cuY2xhc3MpOwogCi0gICAgICAgICAgICAgICAgcGFyc2VDYXRhbG9nID0KLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJwYXJzZUNhdGFsb2ciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10ge1N0cmluZy5jbGFzc30pOworICAgICAgICAgICAgICAgIHBhcnNlQ2F0YWxvZyA9IHJlc29sdmVySW1wbENsYXNzLmdldE1ldGhvZCgicGFyc2VDYXRhbG9nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CiAKLSAgICAgICAgICAgICAgICByZXNvbHZlRW50aXR5ID0KLSAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZXJJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJyZXNvbHZlRW50aXR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzc30pOworICAgICAgICAgICAgICAgIHJlc29sdmVFbnRpdHkgPSByZXNvbHZlckltcGxDbGFzcy5nZXRNZXRob2QoInJlc29sdmVFbnRpdHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MpOwogCi0gICAgICAgICAgICAgICAgcmVzb2x2ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHJlc29sdmVySW1wbENsYXNzLmdldE1ldGhvZCgicmVzb2x2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3N9KTsKKyAgICAgICAgICAgICAgICByZXNvbHZlID0gcmVzb2x2ZXJJbXBsQ2xhc3MuZ2V0TWV0aG9kKCJyZXNvbHZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICB9CkBAIC05NDUsMTQgKzkzOSwxNSBAQAogICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBudWxsOwogCiAgICAgICAgICAgICBwcm9jZXNzRXh0ZXJuYWxDYXRhbG9ncygpOwogCiAgICAgICAgICAgICBSZXNvdXJjZUxvY2F0aW9uIG1hdGNoaW5nRW50cnkgPSBmaW5kTWF0Y2hpbmdFbnRyeShwdWJsaWNJZCk7CiAKKyAgICAgICAgICAgIElucHV0U291cmNlIHJlc3VsdDsKICAgICAgICAgICAgIGlmIChtYXRjaGluZ0VudHJ5ICE9IG51bGwpIHsKIAogICAgICAgICAgICAgICAgIGxvZygiTWF0Y2hpbmcgY2F0YWxvZyBlbnRyeSBmb3VuZCBmb3IgcHVibGljSWQ6ICciCkBAIC05ODUsOSArOTgwLDggQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIHBvc3NpYmlsaXR5LgogICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJbnB1dFNvdXJjZSkgcmVzb2x2ZUVudGl0eS5pbnZva2UocmVzb2x2ZXJJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cHVibGljSWQsIHN5c3RlbUlkfSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChJbnB1dFNvdXJjZSkgcmVzb2x2ZUVudGl0eS5pbnZva2UocmVzb2x2ZXJJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7cHVibGljSWQsIHN5c3RlbUlkfSk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTk2LDExICs5OTAsMTIgQEAKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFNvdXJjZSByZXNvbHZlKFN0cmluZyBocmVmLCBTdHJpbmcgYmFzZSkKICAgICAgICAgICAgIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CiAKLSAgICAgICAgICAgIFNBWFNvdXJjZSByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgSW5wdXRTb3VyY2Ugc291cmNlID0gbnVsbDsKKyAgICAgICAgICAgIFNBWFNvdXJjZSByZXN1bHQ7CisgICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2U7CiAKICAgICAgICAgICAgIHByb2Nlc3NFeHRlcm5hbENhdGFsb2dzKCk7CiAKQEAgLTEwNDgsOSArMTA0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBTQVhTb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU0FYU291cmNlKSByZXNvbHZlLmludm9rZShyZXNvbHZlckltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2hyZWYsIGJhc2V9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChTQVhTb3VyY2UpIHJlc29sdmUuaW52b2tlKHJlc29sdmVySW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtocmVmLCBiYXNlfSk7CiAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTA3Miw5ICsxMDY2LDggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPQotICAgICAgICAgICAgICAgICAgICAgICAgKFNBWFNvdXJjZSkgcmVzb2x2ZS5pbnZva2UocmVzb2x2ZXJJbXBsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2hyZWYsIGJhc2V9KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKFNBWFNvdXJjZSkgcmVzb2x2ZS5pbnZva2UocmVzb2x2ZXJJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7aHJlZiwgYmFzZX0pOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTEwOTQsOCArMTA4Nyw3IEBACiAgICAgICAgICAgICBpZiAoIWV4dGVybmFsQ2F0YWxvZ3NQcm9jZXNzZWQpIHsKIAogICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFhNTENhdGFsb2cuaW52b2tlKHJlc29sdmVySW1wbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHtYTUxDYXRhbG9nLnRoaXN9KTsKKyAgICAgICAgICAgICAgICAgICAgc2V0WE1MQ2F0YWxvZy5pbnZva2UocmVzb2x2ZXJJbXBsLCBYTUxDYXRhbG9nLnRoaXMpOwogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTExMTAsOCArMTEwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGNhdEZpbGUgPSBuZXcgRmlsZShjYXRGaWxlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBsb2coIlBhcnNpbmcgIiArIGNhdEZpbGUsIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VDYXRhbG9nLmludm9rZShyZXNvbHZlckltcGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117Y2F0RmlsZS5nZXRQYXRoKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUNhdGFsb2cuaW52b2tlKHJlc29sdmVySW1wbCwgY2F0RmlsZS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXQuamF2YQppbmRleCAyNGYwY2NkLi5hNzNhMmU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBGaWxlU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwRmlsZVNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTgsNiArNTgsNyBAQAogICAgICAqIFJldHVybiBhIG5ldyBhcmNoaXZlIHNjYW5uZXIgYmFzZWQgb24gdGhpcyBvbmUuCiAgICAgICogQHJldHVybiBhIG5ldyBaaXBTY2FubmVyIHdpdGggdGhlIHNhbWUgZW5jb2RpbmcgYXMgdGhpcyBvbmUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEFyY2hpdmVTY2FubmVyIG5ld0FyY2hpdmVTY2FubmVyKCkgewogICAgICAgICBaaXBTY2FubmVyIHpzID0gbmV3IFppcFNjYW5uZXIoKTsKICAgICAgICAgenMuc2V0RW5jb2RpbmcoZ2V0RW5jb2RpbmcoKSk7CkBAIC03MCwxOSArNzEsMzAgQEAKICAgICAgKiBAcGFyYW0gcCB0aGUgcHJvamVjdCB0byB1c2UKICAgICAgKiBAcmV0dXJuIHRoZSBhYnN0cmFjdCBmaWxlc2V0IGluc3RhbmNlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRSZWYoUHJvamVjdCBwKSB7CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UocCk7CiAgICAgICAgIE9iamVjdCBvID0gZ2V0UmVmaWQoKS5nZXRSZWZlcmVuY2VkT2JqZWN0KHApOwogICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFppcEZpbGVTZXQpIHsKICAgICAgICAgICAgIHJldHVybiAoQWJzdHJhY3RGaWxlU2V0KSBvOwotICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBGaWxlU2V0KSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBGaWxlU2V0KSB7CiAgICAgICAgICAgICBaaXBGaWxlU2V0IHpmcyA9IG5ldyBaaXBGaWxlU2V0KChGaWxlU2V0KSBvKTsKICAgICAgICAgICAgIGNvbmZpZ3VyZUZpbGVTZXQoemZzKTsKICAgICAgICAgICAgIHJldHVybiB6ZnM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgbXNnID0gZ2V0UmVmaWQoKS5nZXRSZWZJZCgpICsgIiBkb2VzblwndCBkZW5vdGUgYSB6aXBmaWxlc2V0IG9yIGEgZmlsZXNldCI7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcgbXNnID0gZ2V0UmVmaWQoKS5nZXRSZWZJZCgpICsgIiBkb2VzblwndCBkZW5vdGUgYSB6aXBmaWxlc2V0IG9yIGEgZmlsZXNldCI7CisgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgWmlwRmlsZXNldCBhY2NlcHRzIGFub3RoZXIgWmlwRmlsZVNldCBvciBhIEZpbGVTZXQgYXMgcmVmZXJlbmNlCisgICAgICogRmlsZVNldHMgYXJlIG9mdGVuIHVzZWQgYnkgdGhlIHdhciB0YXNrIGZvciB0aGUgbGliIGF0dHJpYnV0ZQorICAgICAqIEByZXR1cm4gdGhlIGFic3RyYWN0IGZpbGVzZXQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlZihnZXRQcm9qZWN0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTAsMjggKzEwMiwxMiBAQAogICAgICAqIGFzIHRoaXMgb25lLgogICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCB6aXBGaWxlU2V0CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFppcEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5jbG9uZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuY2xvbmUoKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2hlY2sgYXR0cmlidXRlcyBmb3IgemlwRmlsZVNldC4KLSAgICAgKiBJZiB0aGVyZSBpcyBhIHJlZmVyZW5jZSwgYW5kCi0gICAgICogaXQgaXMgYSBaaXBGaWxlU2V0LCB0aGUgemlwIGZpbGVzZXQgYXR0cmlidXRlcwotICAgICAqIGNhbm5vdCBiZSB1c2VkLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjaGVja1ppcEZpbGVTZXRBdHRyaWJ1dGVzQWxsb3dlZCgpIHsKLSAgICAgICAgaWYgKGdldFByb2plY3QoKSA9PSBudWxsCi0gICAgICAgICAgICB8fCAoaXNSZWZlcmVuY2UoKQotICAgICAgICAgICAgICAgICYmIChnZXRSZWZpZCgpLmdldFJlZmVyZW5jZWRPYmplY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkpCi0gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlb2YgWmlwRmlsZVNldCkpKSB7Ci0gICAgICAgICAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBTY2FubmVyLmphdmEKaW5kZXggMDUzOTIyMi4uMzE3YzRlMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWmlwU2Nhbm5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcFNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDE0ICsyMCwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5aaXBSZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmVhbVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGU7CiAKIC8qKgpAQCAtNTIsMzEgKzUxLDE3IEBACiAgICAgICogcmVzb3VyY2VzIGZvdW5kIGluc2lkZSB0aGUgYXJjaGl2ZSB0aGF0IG1hdGNoZWQgYWxsIGluY2x1ZGUKICAgICAgKiBwYXR0ZXJucyBhbmQgZGlkbid0IG1hdGNoIGFueSBleGNsdWRlIHBhdHRlcm5zLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZpbGxNYXBzRnJvbUFyY2hpdmUoUmVzb3VyY2Ugc3JjLCBTdHJpbmcgZW5jb2RpbmcsCiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBSZXNvdXJjZT4gZmlsZUVudHJpZXMsIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaEZpbGVFbnRyaWVzLAogICAgICAgICAgICAgTWFwPFN0cmluZywgUmVzb3VyY2U+IGRpckVudHJpZXMsIE1hcDxTdHJpbmcsIFJlc291cmNlPiBtYXRjaERpckVudHJpZXMpIHsKLSAgICAgICAgWmlwRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICBaaXBGaWxlIHpmID0gbnVsbDsKIAotICAgICAgICBGaWxlIHNyY0ZpbGUgPSBudWxsOwotICAgICAgICBGaWxlUHJvdmlkZXIgZnAgPSBzcmMuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKGZwICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNyY0ZpbGUgPSBmcC5nZXRGaWxlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIk9ubHkgZmlsZSBwcm92aWRlciByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZCIpOwotICAgICAgICB9CisgICAgICAgIEZpbGUgc3JjRmlsZSA9IHNyYy5hc09wdGlvbmFsKEZpbGVQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAgIC5tYXAoRmlsZVByb3ZpZGVyOjpnZXRGaWxlKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIk9ubHkgZmlsZSBwcm92aWRlciByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZCIpKTsKIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB6ZiA9IG5ldyBaaXBGaWxlKHNyY0ZpbGUsIGVuY29kaW5nKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvYmxlbSByZWFkaW5nICIgKyBzcmNGaWxlLCBleCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvYmxlbSBvcGVuaW5nICIgKyBzcmNGaWxlLCBleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbnVtZXJhdGlvbjxaaXBFbnRyeT4gZSA9IHpmLmdldEVudHJpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgZW50cnkgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIHRyeSAoWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKHNyY0ZpbGUsIGVuY29kaW5nKSkgeworICAgICAgICAgICAgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbSh6Zi5nZXRFbnRyaWVzKCkpLmZvckVhY2goZW50cnkgLT4gewogICAgICAgICAgICAgICAgIFJlc291cmNlIHIgPSBuZXcgWmlwUmVzb3VyY2Uoc3JjRmlsZSwgZW5jb2RpbmcsIGVudHJ5KTsKICAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgewpAQCAtOTEsOSArNzYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoRmlsZUVudHJpZXMucHV0KG5hbWUsIHIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgWmlwRmlsZS5jbG9zZVF1aWV0bHkoemYpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJQcm9ibGVtIHJlYWRpbmcgIiArIHNyY0ZpbGUsIGV4KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiUHJvYmxlbSBvcGVuaW5nICIgKyBzcmNGaWxlLCBleCk7CiAgICAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvY29uZGl0aW9ucy9hbnRsaWIueG1sIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvY29uZGl0aW9ucy9hbnRsaWIueG1sCmluZGV4IDU2NDNhMmUuLjZhNjQ1ODIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2NvbmRpdGlvbnMvYW50bGliLnhtbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9jb25kaXRpb25zL2FudGxpYi54bWwKQEAgLTksNyArOSw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvZGVmYXVsdHMucHJvcGVydGllcwppbmRleCAyOTc3MWRiLi5mOTNiZjE4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9kZWZhdWx0cy5wcm9wZXJ0aWVzCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL2RlZmF1bHRzLnByb3BlcnRpZXMKQEAgLTUsNyArNSw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsNyArMzAsNiBAQAogc2NyaXB0ZmlsdGVyPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLlNjcmlwdEZpbHRlcgogYXNzZXJ0aW9ucz1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Bc3NlcnRpb25zCiBjb25jYXRmaWx0ZXI9b3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy5Db25jYXRGaWx0ZXIKLW1hdmVucmVwb3NpdG9yeT1vcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5yZXBvc2l0b3J5Lk1hdmVuUmVwb3NpdG9yeQogc2NyaXB0c2VsZWN0b3I9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuU2NyaXB0U2VsZWN0b3IKIHNjcmlwdG1hcHBlcj1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5TY3JpcHRNYXBwZXIKIApAQCAtOTQsNiArOTMsNyBAQAogamF2YXJlc291cmNlPW9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5KYXZhUmVzb3VyY2UKIG11bHRpcm9vdGZpbGVzZXQ9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLk11bHRpUm9vdEZpbGVTZXQKIGphdmFjb25zdGFudD1vcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuSmF2YUNvbnN0YW50UmVzb3VyY2UKK3h6cmVzb3VyY2U9b3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwueHouWHpSZXNvdXJjZQogCiAjdG9rZW5pemVyIGltcGxlbWVudGF0aW9ucwogbGluZXRva2VuaXplcj1vcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkxpbmVUb2tlbml6ZXIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvQ3V0RGlyc01hcHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9DdXREaXJzTWFwcGVyLmphdmEKaW5kZXggOTMyZjNlYy4uNWNlMjJmNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9DdXREaXJzTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9DdXREaXJzTWFwcGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOSw3ICsyOSw3IEBACiAgKiA8cD5UaGlzIG1hcHBlciB3YXMgaW5zcGlyZWQgYnkgYSB1c2VyLWxpc3QgdGhyZWFkIHRoYXQgbWVudGlvbmVkCiAgKiB3Z2V0J3MgLS1jdXQtZGlycyBvcHRpb24uPC9wPgogICoKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtdXNlci8yMDEwMDkubWJveC8lM0M1MTc3Mjc0M0JFQTVENDRBOUVBNUJGNTJBQURERDZGQjAxMEU5NkY2QGhhbW1haTAwOC5kZWxwaGkubG9jYWwlM0UiPgorICogQHNlZSA8YSBocmVmPSJodHRwczovL21haWwtYXJjaGl2ZXMuYXBhY2hlLm9yZy9tb2RfbWJveC9hbnQtdXNlci8yMDEwMDkubWJveC8lM0M1MTc3Mjc0M0JFQTVENDRBOUVBNUJGNTJBQURERDZGQjAxMEU5NkY2QGhhbW1haTAwOC5kZWxwaGkubG9jYWwlM0UiPgogICogc2ltcGxpZnkgY29weSB3aXRoIHJlZ2V4cG1hcHBlcjwvYT4KICAqLwogcHVibGljIGNsYXNzIEN1dERpcnNNYXBwZXIgaW1wbGVtZW50cyBGaWxlTmFtZU1hcHBlciB7CkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24uCiAgICAgICogQHBhcmFtIGlnbm9yZSBpZ25vcmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEZyb20oZmluYWwgU3RyaW5nIGlnbm9yZSkgewogICAgIH0KIApAQCAtNTQsMTAgKzU1LDEyIEBACiAgICAgICogRW1wdHkgaW1wbGVtZW50YXRpb24uCiAgICAgICogQHBhcmFtIGlnbm9yZSBpZ25vcmVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRvKGZpbmFsIFN0cmluZyBpZ25vcmUpIHsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoZmluYWwgU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CiAgICAgICAgIGlmIChkaXJzIDw9IDApIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZGlycyBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIG51bWJlciIpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9GaWx0ZXJNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvRmlsdGVyTWFwcGVyLmphdmEKaW5kZXggOWVmOTIyZS4uN2ExZmFhNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9GaWx0ZXJNYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL0ZpbHRlck1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNiArNDEsNyBAQAogICAgICAqIEBwYXJhbSBmcm9tIGEgc3RyaW5nCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEF0dHJpYnV0ZUV4Y2VwdGlvbigKICAgICAgICAgICAgICJmaWx0ZXJtYXBwZXIgZG9lc24ndCBzdXBwb3J0IHRoZSBcImZyb21cIiBhdHRyaWJ1dGUuIiwgImZyb20iKTsKQEAgLTUxLDYgKzUyLDcgQEAKICAgICAgKiBAcGFyYW0gdG8gYSBzdHJpbmcKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRBdHRyaWJ1dGVFeGNlcHRpb24oCiAgICAgICAgICAgICAiZmlsdGVybWFwcGVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgXCJ0b1wiIGF0dHJpYnV0ZS4iLCAidG8iKTsKQEAgLTYyLDYgKzY0LDcgQEAKICAgICAgKiBAcmV0dXJuICBhIG9uZS1lbGVtZW50IGFycmF5IG9mIGNvbnZlcnRlZCBmaWxlbmFtZXMsIG9yIG51bGwgaWYKICAgICAgKiAgICAgICAgICB0aGUgZmlsdGVyY2hhaW4gcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewogICAgICAgICBpZiAoc291cmNlRmlsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC03MiwxNSArNzUsMTQgQEAKICAgICAgICAgICAgIGhlbHBlci5zZXRCdWZmZXJTaXplKEJVRkZFUl9TSVpFKTsKICAgICAgICAgICAgIGhlbHBlci5zZXRQcmltYXJ5UmVhZGVyKHN0cmluZ1JlYWRlcik7CiAgICAgICAgICAgICBoZWxwZXIuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yPEZpbHRlckNoYWluPigpOworICAgICAgICAgICAgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgICAgIGZpbHRlckNoYWlucy5hZGQodGhpcyk7CiAgICAgICAgICAgICBoZWxwZXIuc2V0RmlsdGVyQ2hhaW5zKGZpbHRlckNoYWlucyk7CiAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gRmlsZVV0aWxzLnNhZmVSZWFkRnVsbHkoaGVscGVyLmdldEFzc2VtYmxlZFJlYWRlcigpKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7cmVzdWx0fTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10ge3Jlc3VsdH07CiAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBleDsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9BYnN0cmFjdFNjcmlwdENvbXBvbmVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvQWJzdHJhY3RTY3JpcHRDb21wb25lbnQuamF2YQppbmRleCAyMDI4MDc1Li4xOWJlYmYxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9BYnN0cmFjdFNjcmlwdENvbXBvbmVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL0Fic3RyYWN0U2NyaXB0Q29tcG9uZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NSw2ICs0NSw3IEBACiAgICAgICogU2V0IHRoZSBwcm9qZWN0LgogICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBvd25lciBvZiB0aGlzIGNvbXBvbmVudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewogICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOwogICAgICAgICBoZWxwZXIuc2V0UHJvamVjdENvbXBvbmVudCh0aGlzKTsKQEAgLTE1NSw0ICsxNTYsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBzZXRTZXRCZWFucyhib29sZWFuIHNldEJlYW5zKSB7CiAgICAgICAgIGhlbHBlci5zZXRTZXRCZWFucyhzZXRCZWFucyk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBlbmNvZGluZyBvZiB0aGUgc2NyaXB0IGZyb20gYW4gZXh0ZXJuYWwgZmlsZTsgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgdGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCBzb3VyY2UuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgaGVscGVyLnNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRDb25kaXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdENvbmRpdGlvbi5qYXZhCmluZGV4IGVlNDMyYjEuLmE2NzU4OGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdENvbmRpdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdENvbmRpdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNiArNDEsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24KICAgICAgKiAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBldmFsKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaW5pdFNjcmlwdFJ1bm5lcigpOwogICAgICAgICBleGVjdXRlU2NyaXB0KCJhbnRfY29uZGl0aW9uIik7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRGaWx0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdEZpbHRlci5qYXZhCmluZGV4IDY3ZDNjY2UuLmE1YTgzNDggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdEZpbHRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdEZpbHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTMsNiArNTMsNyBAQAogICAgICAqIFNldCB0aGUgcHJvamVjdC4KICAgICAgKiBAcGFyYW0gcHJvamVjdCB0aGUgb3duZXIgb2YgdGhpcyBjb21wb25lbnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChQcm9qZWN0IHByb2plY3QpIHsKICAgICAgICAgc3VwZXIuc2V0UHJvamVjdChwcm9qZWN0KTsKICAgICAgICAgaGVscGVyLnNldFByb2plY3RDb21wb25lbnQodGhpcyk7CkBAIC0xMDUsNiArMTA2LDcgQEAKICAgICAgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHRvIGJlIGZpbHRlcmVkCiAgICAgICogQHJldHVybiB0aGUgZmlsdGVyZWQgdG9rZW4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGZpbHRlcihTdHJpbmcgdG9rZW4pIHsKICAgICAgICAgaW5pdCgpOwogICAgICAgICBzZXRUb2tlbih0b2tlbik7CkBAIC0xODAsNCArMTgyLDE0IEBACiAgICAgcHVibGljIHZvaWQgc2V0U2V0QmVhbnMoYm9vbGVhbiBzZXRCZWFucykgewogICAgICAgICBoZWxwZXIuc2V0U2V0QmVhbnMoc2V0QmVhbnMpOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGU7IG9wdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGhlbHBlci5zZXRFbmNvZGluZyhlbmNvZGluZyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRNYXBwZXIuamF2YQppbmRleCAzNjM0N2E3Li5mNzhkN2EwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRNYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRNYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM1LDggKzM1LDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBmcm9tIGEgc3RyaW5nLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKLQogICAgIH0KIAogICAgIC8qKgpAQCAtNDQsMTUgKzQ0LDE1IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gdG8gYSBzdHJpbmcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHRvKSB7Ci0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXNldCB0aGUgbGlzdCBvZiBmaWxlcwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigxKTsKKyAgICAgICAgZmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NywxNSArNzcsMTUgQEAKICAgICAgKiAgICAgICAgIG51bGwgaWYgaXQgZG9lcyBub3QuCiAgICAgICovCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CiAgICAgICAgIGluaXRTY3JpcHRSdW5uZXIoKTsKICAgICAgICAgZ2V0UnVubmVyKCkuYWRkQmVhbigic291cmNlIiwgc291cmNlRmlsZU5hbWUpOwogICAgICAgICBjbGVhcigpOwogICAgICAgICBleGVjdXRlU2NyaXB0KCJhbnRfbWFwcGVyIik7Ci0gICAgICAgIGlmIChmaWxlcy5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoZmlsZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlcy50b0FycmF5KG5ldyBTdHJpbmdbZmlsZXMuc2l6ZSgpXSk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbGVzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWxlcy5zaXplKCldKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3IuamF2YQppbmRleCA0NWU4Nzg0Li41ZjFiNWVhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICogU2V0IHRoZSBwcm9qZWN0LgogICAgICAqIEBwYXJhbSBwcm9qZWN0IHRoZSBvd25lciBvZiB0aGlzIGNvbXBvbmVudC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KFByb2plY3QgcHJvamVjdCkgewogICAgICAgICBzdXBlci5zZXRQcm9qZWN0KHByb2plY3QpOwogICAgICAgICBoZWxwZXIuc2V0UHJvamVjdENvbXBvbmVudCh0aGlzKTsKQEAgLTE2Niw2ICsxNjcsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKICAgICAgICAgaW5pdCgpOwogICAgICAgICBzZXRTZWxlY3RlZCh0cnVlKTsKQEAgLTIyMCw0ICsyMjIsMTMgQEAKICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNldCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGU7IG9wdGlvbmFsLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nIHRoZSBlbmNvZGluZyBvZiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW5jb2RpbmcoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGhlbHBlci5zZXRFbmNvZGluZyhlbmNvZGluZyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzZmlsZVNldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzZmlsZVNldC5qYXZhCmluZGV4IDdmYzhkM2QuLmRjNmQ4MTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9DbGFzc2ZpbGVTZXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9kZXBlbmQvQ2xhc3NmaWxlU2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSwxMiArNDEsMTIgQEAKICAgICAgKiBjbGFzc2VzIHdoaWNoIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbGVzZXQgYW5kIHdoaWNoIGFyZSB0aGUKICAgICAgKiBzdGFydGluZyBwb2ludCBmb3IgdGhlIGRlcGVuZGVuY3kgc2VhcmNoLgogICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHJvb3RDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcm9vdENsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBsaXN0IG9mIGZpbGVzZXRzIHdoaWNoIGNvbnRhaW4gcm9vdCBjbGFzc2VzLgogICAgICAqLwotICAgIHByaXZhdGUgTGlzdDxGaWxlU2V0PiByb290RmlsZVNldHMgPSBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGVTZXQ+IHJvb3RGaWxlU2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogSW5uZXIgY2xhc3MgdXNlZCB0byBjb250YWluIGluZm8gYWJvdXQgcm9vdCBjbGFzc2VzLgpAQCAtODEsNiArODEsMTYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBDbGFzc2ZpbGVTZXQgZnJvbSBhbm90aGVyIENsYXNzZmlsZVNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBvdGhlciBjbGFzc2ZpbGVzZXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzZmlsZVNldChDbGFzc2ZpbGVTZXQgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICAgICAgcm9vdENsYXNzZXMuYWRkQWxsKHMucm9vdENsYXNzZXMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkZCBhIGZpbGVzZXQgdG8gd2hpY2ggY29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIHJvb3QgY2xhc3NlcyB1c2VkIHRvCiAgICAgICogZHJpdmUgdGhlIHNlYXJjaCBmcm9tIGNsYXNzZXMuCiAgICAgICoKQEAgLTkzLDE2ICsxMDMsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZSBhIENsYXNzZmlsZVNldCBmcm9tIGFub3RoZXIgQ2xhc3NmaWxlU2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIHMgdGhlIG90aGVyIGNsYXNzZmlsZXNldC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ2xhc3NmaWxlU2V0KENsYXNzZmlsZVNldCBzKSB7Ci0gICAgICAgIHN1cGVyKHMpOwotICAgICAgICByb290Q2xhc3Nlcy5hZGRBbGwocy5yb290Q2xhc3Nlcyk7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSByb290IGNsYXNzIGF0dHJpYnV0ZS4KICAgICAgKgogICAgICAqIEBwYXJhbSByb290Q2xhc3MgdGhlIG5hbWUgb2YgdGhlIHJvb3QgY2xhc3MuCkBAIC0xMTgsNiArMTE4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gYSBkZXBlbmRlbmN5IHNjYW5uZXIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIERpcmVjdG9yeVNjYW5uZXIgZ2V0RGlyZWN0b3J5U2Nhbm5lcihQcm9qZWN0IHApIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYocCkuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKQEAgLTEyNSw3ICsxMjYsNyBAQAogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHApOwogICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHBhcmVudFNjYW5uZXIgPSBzdXBlci5nZXREaXJlY3RvcnlTY2FubmVyKHApOwogICAgICAgICBEZXBlbmRTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGVwZW5kU2Nhbm5lcihwYXJlbnRTY2FubmVyKTsKLSAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gYWxsUm9vdENsYXNzZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4ocm9vdENsYXNzZXMpOworICAgICAgICBmaW5hbCBWZWN0b3I8U3RyaW5nPiBhbGxSb290Q2xhc3NlcyA9IG5ldyBWZWN0b3I8Pihyb290Q2xhc3Nlcyk7CiAgICAgICAgIGZvciAoRmlsZVNldCBhZGRpdGlvbmFsUm9vdFNldCA6IHJvb3RGaWxlU2V0cykgewogICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBhZGRpdGlvbmFsU2Nhbm5lcgogICAgICAgICAgICAgICAgID0gYWRkaXRpb25hbFJvb3RTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKQEAgLTE1OSwxMSArMTYwLDEyIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgY2xvbmUgb2YgdGhlIGNsYXNzIGZpbGUgc2V0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2xhc3NmaWxlU2V0KGlzUmVmZXJlbmNlKCkKLSAgICAgICAgICAgID8gKENsYXNzZmlsZVNldCkgKGdldFJlZihnZXRQcm9qZWN0KCkpKSA6IHRoaXMpOworICAgICAgICByZXR1cm4gbmV3IENsYXNzZmlsZVNldChpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkgOiB0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjazxPYmplY3Q+IHN0aywgUHJvamVjdCBwKSB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc5LDQgKzE4MSw4IEBACiAgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzc2ZpbGVTZXQgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihDbGFzc2ZpbGVTZXQuY2xhc3MpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmRTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9kZXBlbmQvRGVwZW5kU2Nhbm5lci5qYXZhCmluZGV4IDI3YTFmZGQuLjE5NzdkYWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmRTY2FubmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE2ICsxOCwxNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5kZXBlbmQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRpcmVjdG9yeVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmVhbVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLkRlcGVuZGVuY3lBbmFseXplcjsKIAotCiAvKioKICAqIERpcmVjdG9yeVNjYW5uZXIgZm9yIGZpbmRpbmcgY2xhc3MgZGVwZW5kZW5jaWVzLgogICovCkBAIC00OCw3ICs0OSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBpbmNsdWRlZDsKIAotICAgIHByaXZhdGUgVmVjdG9yPEZpbGU+IGFkZGl0aW9uYWxCYXNlRGlycyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxGaWxlPiBhZGRpdGlvbmFsQmFzZURpcnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBwYXJlbnQgc2Nhbm5lciB3aGljaCBnaXZlcyB0aGUgYmFzaWMgc2V0IG9mIGZpbGVzLiBPbmx5IGZpbGVzIHdoaWNoCkBAIC04MiwxNSArODMsMTMgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBmaWxlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZWRGaWxlcygpIHsKLSAgICAgICAgU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2dldEluY2x1ZGVkRmlsZXNDb3VudCgpXTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmlsZXNbaV0gPSAoU3RyaW5nKSBpbmNsdWRlZC5lbGVtZW50QXQoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOworICAgICAgICByZXR1cm4gaW5jbHVkZWQudG9BcnJheShuZXcgU3RyaW5nW2dldEluY2x1ZGVkRmlsZXNDb3VudCgpXSk7CiAgICAgfQogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0SW5jbHVkZWRGaWxlc0NvdW50KCkgewogICAgICAgICBpZiAoaW5jbHVkZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtMTAzLDEyICsxMDIsMTQgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gYmFzZWRpciB3YXMgc2V0IGluY29ycmVjdGx5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzY2FuKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGluY2x1ZGVkID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIGluY2x1ZGVkID0gbmV3IFZlY3Rvcjw+KCk7CiAgICAgICAgIFN0cmluZyBhbmFseXplckNsYXNzTmFtZSA9IERFRkFVTFRfQU5BTFlaRVJfQ0xBU1M7Ci0gICAgICAgIERlcGVuZGVuY3lBbmFseXplciBhbmFseXplciA9IG51bGw7CisgICAgICAgIERlcGVuZGVuY3lBbmFseXplciBhbmFseXplcjsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBEZXBlbmRlbmN5QW5hbHl6ZXI+IGFuYWx5emVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGFuYWx5emVyQ2xhc3NOYW1lKQorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIERlcGVuZGVuY3lBbmFseXplcj4gYW5hbHl6ZXJDbGFzcyA9CisgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShhbmFseXplckNsYXNzTmFtZSkKICAgICAgICAgICAgICAgICAgICAgLmFzU3ViY2xhc3MoRGVwZW5kZW5jeUFuYWx5emVyLmNsYXNzKTsKICAgICAgICAgICAgIGFuYWx5emVyID0gYW5hbHl6ZXJDbGFzcy5uZXdJbnN0YW5jZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtMTE2LDM3ICsxMTcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGFuYWx5emVyQ2xhc3NOYW1lLCBlKTsKICAgICAgICAgfQogICAgICAgICBhbmFseXplci5hZGRDbGFzc1BhdGgobmV3IFBhdGgobnVsbCwgYmFzZWRpci5nZXRQYXRoKCkpKTsKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbjxGaWxlPiBlID0gYWRkaXRpb25hbEJhc2VEaXJzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBGaWxlIGFkZGl0aW9uYWxCYXNlRGlyID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgYW5hbHl6ZXIuYWRkQ2xhc3NQYXRoKG5ldyBQYXRoKG51bGwsIGFkZGl0aW9uYWxCYXNlRGlyLmdldFBhdGgoKSkpOwotICAgICAgICB9CisgICAgICAgIGFkZGl0aW9uYWxCYXNlRGlycy5zdHJlYW0oKS5tYXAoRmlsZTo6Z2V0UGF0aCkKKyAgICAgICAgICAgIC5tYXAocCAtPiBuZXcgUGF0aChudWxsLCBwKSkuZm9yRWFjaChhbmFseXplcjo6YWRkQ2xhc3NQYXRoKTsKIAotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IHJvb3RDbGFzc2VzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgcm9vdENsYXNzID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgYW5hbHl6ZXIuYWRkUm9vdENsYXNzKHJvb3RDbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgRW51bWVyYXRpb248U3RyaW5nPiBlID0gYW5hbHl6ZXIuZ2V0Q2xhc3NEZXBlbmRlbmNpZXMoKTsKKyAgICAgICAgcm9vdENsYXNzZXMuZm9yRWFjaChhbmFseXplcjo6YWRkUm9vdENsYXNzKTsKIAotICAgICAgICBTdHJpbmdbXSBwYXJlbnRGaWxlcyA9IHBhcmVudFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHBhcmVudFNldCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyZW50RmlsZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIHBhcmVudFNldC5wdXQocGFyZW50RmlsZXNbaV0sIHBhcmVudEZpbGVzW2ldKTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNsYXNzbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgKyAiLmNsYXNzIjsKLSAgICAgICAgICAgIEZpbGUgZGVwRmlsZSA9IG5ldyBGaWxlKGJhc2VkaXIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgIGlmIChkZXBGaWxlLmV4aXN0cygpICYmIHBhcmVudFNldC5jb250YWluc0tleShmaWxlbmFtZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGluY2x1ZGVkCi0gICAgICAgICAgICAgICAgaW5jbHVkZWQuYWRkRWxlbWVudChmaWxlbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgU2V0PFN0cmluZz4gcGFyZW50U2V0ID0gU3RyZWFtLm9mKHBhcmVudFNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICAvLyBUaGlzIGlzIGluY2x1ZGVkCisgICAgICAgIFN0cmVhbVV0aWxzLmVudW1lcmF0aW9uQXNTdHJlYW0oYW5hbHl6ZXIuZ2V0Q2xhc3NEZXBlbmRlbmNpZXMoKSkKKyAgICAgICAgICAgICAgICAubWFwKGNOYW1lIC0+IGNOYW1lLnJlcGxhY2UoJy4nLCBGaWxlLnNlcGFyYXRvckNoYXIpICsgIi5jbGFzcyIpCisgICAgICAgICAgICAgICAgLmZpbHRlcihmTmFtZSAtPiBuZXcgRmlsZShiYXNlZGlyLCBmTmFtZSkuZXhpc3RzKCkgJiYgcGFyZW50U2V0LmNvbnRhaW5zKGZOYW1lKSkKKyAgICAgICAgICAgICAgICAuZm9yRWFjaChmTmFtZSAtPiBpbmNsdWRlZC5hZGRFbGVtZW50KGZOYW1lKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQHNlZSBEaXJlY3RvcnlTY2FubmVyI2FkZERlZmF1bHRFeGNsdWRlcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRFeGNsdWRlcygpIHsKICAgICB9CiAKQEAgLTE1NCw2ICsxNDMsNyBAQAogICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNnZXRFeGNsdWRlZERpcmVjdG9yaWVzCiAgICAgICoge0Bpbmhlcml0RG9jfS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZWREaXJlY3RvcmllcygpIHsKICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQpAQCAtMTYyLDYgKzE1Miw3IEBACiAgICAgICogQHNlZSBEaXJlY3RvcnlTY2FubmVyI2dldEV4Y2x1ZGVkRmlsZXMKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlZEZpbGVzKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0xNzAsNiArMTYxLDcgQEAKICAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0SW5jbHVkZWREaXJlY3RvcmllcwogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVkRGlyZWN0b3JpZXMoKSB7CiAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nWzBdOwogICAgIH0KQEAgLTE3OCw2ICsxNzAsNyBAQAogICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNnZXRJbmNsdWRlZERpcnNDb3VudAogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRJbmNsdWRlZERpcnNDb3VudCgpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMTg2LDYgKzE3OSw3IEBACiAgICAgICogQHNlZSBEaXJlY3RvcnlTY2FubmVyI2dldE5vdEluY2x1ZGVkRGlyZWN0b3JpZXMKICAgICAgKiB7QGluaGVyaXREb2N9LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXROb3RJbmNsdWRlZERpcmVjdG9yaWVzKCkgewogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC0xOTQsNyArMTg4LDcgQEAKICAgICAgKiBAc2VlIERpcmVjdG9yeVNjYW5uZXIjZ2V0Tm90SW5jbHVkZWRGaWxlcwogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCi0gICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIGdldE5vdEluY2x1ZGVkRmlsZXMoKSB7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTIwMyw3ICsxOTcsNyBAQAogICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNzZXRFeGNsdWRlcwogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCi0gICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoU3RyaW5nW10gZXhjbHVkZXMpIHsKICAgICB9CiAKQEAgLTIxMSw3ICsyMDUsNyBAQAogICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNzZXRJbmNsdWRlcwogICAgICAqIHtAaW5oZXJpdERvY30uCiAgICAgICovCi0gICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoU3RyaW5nW10gaW5jbHVkZXMpIHsKICAgICB9CiAKQEAgLTIxOSw3ICsyMTMsNyBAQAogICAgICAqIEBzZWUgRGlyZWN0b3J5U2Nhbm5lciNzZXRDYXNlU2Vuc2l0aXZlCiAgICAgICoge0Bpbmhlcml0RG9jfS4KICAgICAgKi8KLSAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9BcmMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0FyYy5qYXZhCmluZGV4IGNlMjliZmQuLjQ0M2E5ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0FyYy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0FyYy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzQsMjMgKzc0LDI0IEBACiAgICAgICogQHRvZG8gcmVmYWN0b3IgdXNpbmcgYW4gRW51bWVyYXRlZEF0dHJpYnV0ZQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0clR5cGUpIHsKLSAgICAgICAgaWYgKHN0clR5cGUuZXF1YWxzSWdub3JlQ2FzZSgib3BlbiIpKSB7CisgICAgICAgIGlmICgib3BlbiIuZXF1YWxzSWdub3JlQ2FzZShzdHJUeXBlKSkgewogICAgICAgICAgICAgdHlwZSA9IEFyYzJELk9QRU47Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJwaWUiKSkgeworICAgICAgICB9IGVsc2UgaWYgKCJwaWUiLmVxdWFsc0lnbm9yZUNhc2Uoc3RyVHlwZSkpIHsKICAgICAgICAgICAgIHR5cGUgPSBBcmMyRC5QSUU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyVHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJjaG9yZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoImNob3JkIi5lcXVhbHNJZ25vcmVDYXNlKHN0clR5cGUpKSB7CiAgICAgICAgICAgICB0eXBlID0gQXJjMkQuQ0hPUkQ7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKSB7CiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCArIChzdHJva2Vfd2lkdGggKiAyKSwKICAgICAgICAgICAgIGhlaWdodCArIChzdHJva2Vfd2lkdGggKiAyKSwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKIAotICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisgICAgICAgIEdyYXBoaWNzMkQgZ3JhcGhpY3MgPSBiaS5jcmVhdGVHcmFwaGljcygpOwogCi0gICAgICAgIGlmICghc3Ryb2tlLmVxdWFscygidHJhbnNwYXJlbnQiKSkgeworICAgICAgICBpZiAoISJ0cmFuc3BhcmVudCIuZXF1YWxzSWdub3JlQ2FzZShzdHJva2UpKSB7CiAgICAgICAgICAgICBCYXNpY1N0cm9rZSBiU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKHN0cm9rZV93aWR0aCk7CiAgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShzdHJva2UpKTsKICAgICAgICAgICAgIGdyYXBoaWNzLnNldFN0cm9rZShiU3Ryb2tlKTsKQEAgLTk4LDE2ICs5OSwxMyBAQAogICAgICAgICAgICAgICAgIGhlaWdodCwgc3RhcnQsIHN0b3AsIHR5cGUpKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZmlsbC5lcXVhbHMoInRyYW5zcGFyZW50IikpIHsKKyAgICAgICAgaWYgKCEidHJhbnNwYXJlbnQiLmVxdWFsc0lnbm9yZUNhc2UoZmlsbCkpIHsKICAgICAgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKGZpbGwpKTsKICAgICAgICAgICAgIGdyYXBoaWNzLmZpbGwobmV3IEFyYzJELkRvdWJsZShzdHJva2Vfd2lkdGgsIHN0cm9rZV93aWR0aCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdGFydCwgc3RvcCwgdHlwZSkpOwogICAgICAgICB9CiAKLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluc3RydWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2UgaW1nID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3SW1hZ2UoaW1nLmdldEFzQnVmZmVyZWRJbWFnZSgpLCBudWxsLCAwLCAwKTsKQEAgLTExNSw3ICsxMTMsNyBAQAogICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIGltYWdlID0gKChUcmFuc2Zvcm1PcGVyYXRpb24pIGluc3RyKQogICAgICAgICAgICAgICAgICAgICAuZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSkpOwogICAgICAgICAgICAgICAgIGJpID0gaW1hZ2UuZ2V0QXNCdWZmZXJlZEltYWdlKCk7Ci0gICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSAoR3JhcGhpY3MyRCkgYmkuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgICAgICAgICBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0Jhc2ljU2hhcGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0Jhc2ljU2hhcGUuamF2YQppbmRleCBlZTIxMTNhLi41MTZmN2U0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9CYXNpY1NoYXBlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQmFzaWNTaGFwZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQ29sb3JNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0NvbG9yTWFwcGVyLmphdmEKaW5kZXggODhlMjg3MS4uZDEzNTFmNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvQ29sb3JNYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9Db2xvck1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTUgKzE4LDEzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlOwogCiBpbXBvcnQgamF2YS5hd3QuQ29sb3I7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogLyoqCiAgKgogICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZQogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgQ29sb3JNYXBwZXIgewotICAgIC8qKiBwcml2YXRlIGNvbnN0cnVjdG9yIGZvciBVdGlsaXR5IGNsYXNzICovCi0gICAgcHJpdmF0ZSBDb2xvck1hcHBlcigpIHsKLSAgICB9CiAKICAgICAvKiogYmxhY2sgc3RyaW5nICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQkxBQ0sgPSAiYmxhY2siOwpAQCAtNjksMzQgKzY3LDQyIEBACiAgICAgICogQHRvZG8gcmVmYWN0b3IgdG8gdXNlIGFuIEVudW1lcmF0ZWRBdHRyaWJ1dGUgKG1heWJlPykKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yQnlOYW1lKFN0cmluZyBjb2xvck5hbWUpIHsKLSAgICAgICAgaWYgKGNvbG9yTmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTE9SX0JMQUNLKSkgewotICAgICAgICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOwotICAgICAgICB9IGVsc2UgaWYgKGNvbG9yTmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTE9SX0JMVUUpKSB7CisgICAgICAgIHN3aXRjaCAoY29sb3JOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkgeworICAgICAgICBjYXNlIENPTE9SX0JMVUU6CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IuYmx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9DWUFOKSkgeworICAgICAgICBjYXNlIENPTE9SX0NZQU46CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IuY3lhbjsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9EQVJLR1JBWSkgfHwgY29sb3JOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MT1JfREFSS0dSRVkpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfREFSS0dSQVk6CisgICAgICAgIGNhc2UgQ09MT1JfREFSS0dSRVk6CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IuZGFya0dyYXk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29sb3JOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MT1JfR1JBWSkgfHwgY29sb3JOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MT1JfR1JFWSkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9HUkFZOgorICAgICAgICBjYXNlIENPTE9SX0dSRVk6CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IuZ3JheTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9MSUdIVEdSQVkpIHx8IGNvbG9yTmFtZS5lcXVhbHNJZ25vcmVDYXNlKENPTE9SX0xJR0hUR1JFWSkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9MSUdIVEdSQVk6CisgICAgICAgIGNhc2UgQ09MT1JfTElHSFRHUkVZOgogICAgICAgICAgICAgcmV0dXJuIENvbG9yLmxpZ2h0R3JheTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9HUkVFTikpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9HUkVFTjoKICAgICAgICAgICAgIHJldHVybiBDb2xvci5ncmVlbjsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9NQUdFTlRBKSkgeworICAgICAgICBjYXNlIENPTE9SX01BR0VOVEE6CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IubWFnZW50YTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9PUkFOR0UpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfT1JBTkdFOgogICAgICAgICAgICAgcmV0dXJuIENvbG9yLm9yYW5nZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9QSU5LKSkgeworICAgICAgICBjYXNlIENPTE9SX1BJTks6CiAgICAgICAgICAgICByZXR1cm4gQ29sb3IucGluazsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9SRUQpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfUkVEOgogICAgICAgICAgICAgcmV0dXJuIENvbG9yLnJlZDsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9XSElURSkpIHsKKyAgICAgICAgY2FzZSBDT0xPUl9XSElURToKICAgICAgICAgICAgIHJldHVybiBDb2xvci53aGl0ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb2xvck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0xPUl9ZRUxMT1cpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfWUVMTE9XOgogICAgICAgICAgICAgcmV0dXJuIENvbG9yLnllbGxvdzsKKyAgICAgICAgY2FzZSBDT0xPUl9CTEFDSzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5ibGFjazsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sb3IuYmxhY2s7CisgICAgfQorCisgICAgLyoqIHByaXZhdGUgY29uc3RydWN0b3IgZm9yIFV0aWxpdHkgY2xhc3MgKi8KKyAgICBwcml2YXRlIENvbG9yTWFwcGVyKCkgewogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRHJhdy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRHJhdy5qYXZhCmluZGV4IDJmMDk3ZDUuLjNmZmJlYTkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXcuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9EcmF3LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00OSwxMSArNDksMTMgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QpIHsKICAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChyZWN0KTsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFRleHQgdGV4dCkgewogICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKHRleHQpOwogICAgIH0KQEAgLTc1LDEzICs3NywxMiBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlIGltYWdlKSB7CiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKLSAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IChHcmFwaGljczJEKSBiaS5nZXRHcmFwaGljcygpOworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKIAotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluc3RydWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2Ugb3AgPSAoKERyYXdPcGVyYXRpb24pIGluc3RyKS5leGVjdXRlRHJhd09wZXJhdGlvbigpOwogICAgICAgICAgICAgICAgIGxvZygiXHREcmF3aW5nIHRvIHg9IiArIHhsb2MgKyAiIHk9IiArIHlsb2MpOwpAQCAtOTIsMTEgKzkzLDggQEAKICAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGNoaWxkID0gb3AuZ2V0QXNCdWZmZXJlZEltYWdlKCk7CiAgICAgICAgICAgICAgICAgbG9nKCJcdERyYXdpbmcgdG8geD0iICsgeGxvYyArICIgeT0iICsgeWxvYyk7CiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKGNoaWxkLCBudWxsLCB4bG9jLCB5bG9jKTsKLSAgICAgICAgICAgICAgICBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW1hZ2UgPSBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7Ci0KLSAgICAgICAgcmV0dXJuIGltYWdlOworICAgICAgICByZXR1cm4gUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXdPcGVyYXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0RyYXdPcGVyYXRpb24uamF2YQppbmRleCBlMDJkMGM4Li4wZTM0ZjEzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9EcmF3T3BlcmF0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRHJhd09wZXJhdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRWxsaXBzZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvRWxsaXBzZS5qYXZhCmluZGV4IDYzNWQ4MDkuLjQ1OWQzNjIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0VsbGlwc2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9FbGxpcHNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01MSwyNyArNTEsMjUgQEAKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKSB7CiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCwgaGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkUpOwogCi0gICAgICAgIEdyYXBoaWNzMkQgZ3JhcGhpY3MgPSAoR3JhcGhpY3MyRCkgYmkuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CiAKLSAgICAgICAgaWYgKCFzdHJva2UuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKHN0cm9rZSkpIHsKICAgICAgICAgICAgIEJhc2ljU3Ryb2tlIGJTdHJva2UgPSBuZXcgQmFzaWNTdHJva2Uoc3Ryb2tlX3dpZHRoKTsKICAgICAgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKHN0cm9rZSkpOwogICAgICAgICAgICAgZ3JhcGhpY3Muc2V0U3Ryb2tlKGJTdHJva2UpOwogICAgICAgICAgICAgZ3JhcGhpY3MuZHJhdyhuZXcgRWxsaXBzZTJELkRvdWJsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWZpbGwuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKGZpbGwpKSB7CiAgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShmaWxsKSk7CiAgICAgICAgICAgICBncmFwaGljcy5maWxsKG5ldyBFbGxpcHNlMkQuRG91YmxlKDAsIDAsIHdpZHRoLCBoZWlnaHQpKTsKICAgICAgICAgfQogCi0KLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbnN0cnVjdGlvbnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgSW1hZ2VPcGVyYXRpb24gaW5zdHIgPSAoKEltYWdlT3BlcmF0aW9uKSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgZm9yIChJbWFnZU9wZXJhdGlvbiBpbnN0ciA6IGluc3RydWN0aW9ucykgewogICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgewogICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIGltZyA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKGltZy5nZXRBc0J1ZmZlcmVkSW1hZ2UoKSwgbnVsbCwgMCwgMCk7CkBAIC03OSw3ICs3Nyw3IEBACiAgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2UgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpCiAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKSk7CiAgICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKLSAgICAgICAgICAgICAgICBncmFwaGljcyA9IChHcmFwaGljczJEKSBiaS5nZXRHcmFwaGljcygpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VPcGVyYXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL0ltYWdlT3BlcmF0aW9uLmphdmEKaW5kZXggZDcyZmUwNC4uZDFhYzc5YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VPcGVyYXRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9JbWFnZU9wZXJhdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsNyArMjcsNyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW1hZ2VPcGVyYXRpb24gZXh0ZW5kcyBEYXRhVHlwZSB7CiAgICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCi0gICAgcHJvdGVjdGVkIFZlY3RvcjxJbWFnZU9wZXJhdGlvbj4gaW5zdHJ1Y3Rpb25zID0gbmV3IFZlY3RvcjxJbWFnZU9wZXJhdGlvbj4oKTsKKyAgICBwcm90ZWN0ZWQgVmVjdG9yPEltYWdlT3BlcmF0aW9uPiBpbnN0cnVjdGlvbnMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvUmVjdGFuZ2xlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9SZWN0YW5nbGUuamF2YQppbmRleCA4MzZiNmNhLi43ZWQ0ZDBlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9SZWN0YW5nbGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9SZWN0YW5nbGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTY4LDQxICs2OCwzOSBAQAogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlRHJhd09wZXJhdGlvbigpIHsKICAgICAgICAgbG9nKCJcdENyZWF0aW5nIFJlY3RhbmdsZSB3PSIgKyB3aWR0aCArICIgaD0iICsgaGVpZ2h0ICsgIiBhcmN3PSIKICAgICAgICAgICAgICsgYXJjd2lkdGggKyAiIGFyY2g9IiArIGFyY2hlaWdodCk7CiAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBuZXcgQnVmZmVyZWRJbWFnZSh3aWR0aCwgaGVpZ2h0LCBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkUpOwogCi0gICAgICAgIEdyYXBoaWNzMkQgZ3JhcGhpY3MgPSAoR3JhcGhpY3MyRCkgYmkuZ2V0R3JhcGhpY3MoKTsKKyAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CiAKLSAgICAgICAgaWYgKCFzdHJva2UuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKHN0cm9rZSkpIHsKICAgICAgICAgICAgIEJhc2ljU3Ryb2tlIGJTdHJva2UgPSBuZXcgQmFzaWNTdHJva2Uoc3Ryb2tlX3dpZHRoKTsKICAgICAgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKHN0cm9rZSkpOwogICAgICAgICAgICAgZ3JhcGhpY3Muc2V0U3Ryb2tlKGJTdHJva2UpOwogCi0gICAgICAgICAgICBpZiAoKGFyY3dpZHRoICE9IDApIHx8IChhcmNoZWlnaHQgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3Um91bmRSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQsIGFyY3dpZHRoLCBhcmNoZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhcmN3aWR0aCA9PSAwICYmIGFyY2hlaWdodCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1JlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdSb3VuZFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCwgYXJjd2lkdGgsIGFyY2hlaWdodCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWZpbGwuZXF1YWxzKCJ0cmFuc3BhcmVudCIpKSB7CisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKGZpbGwpKSB7CiAgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShmaWxsKSk7Ci0gICAgICAgICAgICBpZiAoKGFyY3dpZHRoICE9IDApIHx8IChhcmNoZWlnaHQgIT0gMCkpIHsKKyAgICAgICAgICAgIGlmIChhcmN3aWR0aCA9PSAwICYmIGFyY2hlaWdodCA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFJlY3Qoc3Ryb2tlX3dpZHRoLCBzdHJva2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHN0cm9rZV93aWR0aCAqIDIpLCBoZWlnaHQgLSAoc3Ryb2tlX3dpZHRoICogMikpOworICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBncmFwaGljcy5maWxsUm91bmRSZWN0KHN0cm9rZV93aWR0aCwgc3Ryb2tlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIChzdHJva2Vfd2lkdGggKiAyKSwgaGVpZ2h0IC0gKHN0cm9rZV93aWR0aCAqIDIpLAogICAgICAgICAgICAgICAgICAgICBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbFJlY3Qoc3Ryb2tlX3dpZHRoLCBzdHJva2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gKHN0cm9rZV93aWR0aCAqIDIpLCBoZWlnaHQgLSAoc3Ryb2tlX3dpZHRoICogMikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLQotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluc3RydWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2UgaW1nID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3SW1hZ2UoaW1nLmdldEFzQnVmZmVyZWRJbWFnZSgpLCBudWxsLCAwLCAwKTsKQEAgLTExMSw3ICsxMDksNyBAQAogICAgICAgICAgICAgICAgICAgICA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpKTsKICAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOwotICAgICAgICAgICAgICAgIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSBiaS5jcmVhdGVHcmFwaGljcygpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9Sb3RhdGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JvdGF0ZS5qYXZhCmluZGV4IDNkN2EwM2EuLmQwMDkwZjEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JvdGF0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1JvdGF0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjcsMjQgKzY3LDIxIEBACiAgICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiBvbi4KICAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZSBpbWFnZSkgewotICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbnVsbDsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbnN0cnVjdGlvbnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgSW1hZ2VPcGVyYXRpb24gaW5zdHIgPSAoKEltYWdlT3BlcmF0aW9uKSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgZm9yIChJbWFnZU9wZXJhdGlvbiBpbnN0ciA6IGluc3RydWN0aW9ucykgewogICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgewogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgVHJhbnNmb3JtT3BlcmF0aW9uIGhhcyBEcmF3T3BlcmF0aW9uIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAgLy8gdGhlbiBSb3RhdGUgdGhlIGZpcnN0IGNoaWxkIGFuZCByZXR1cm4uCiAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGVjJ2luZyBEcmF3cyIpOwogICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIG9wID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBpbWFnZSA9IHBlcmZvcm1Sb3RhdGUob3ApOwotICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtUm90YXRlKG9wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkV4ZWMnaW5nIFRyYW5zZm9ybXMiKTsKICAgICAgICAgICAgICAgICBpbWFnZSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikKICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oUGxhbmFySW1hZ2Uud3JhcFJlbmRlcmVkSW1hZ2UoYmkpKTsKLSAgICAgICAgICAgICAgICBiaSA9IGltYWdlLmdldEFzQnVmZmVyZWRJbWFnZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhlYydpbmcgYXMgVHJhbnNmb3JtT3BlcmF0aW9uIik7CkBAIC0xMDAsMTYgKzk3LDE0IEBACiAgICAgICogIE9ORSBpbWFnZS4KICAgICAgKiBAcmV0dXJuIHRoZSBpbWFnZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZURyYXdPcGVyYXRpb24oKSB7Ci0gICAgICAgIGZpbmFsIGludCBzaXplID0gaW5zdHJ1Y3Rpb25zLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIEltYWdlT3BlcmF0aW9uIGluc3RyID0gKChJbWFnZU9wZXJhdGlvbikgaW5zdHJ1Y3Rpb25zLmVsZW1lbnRBdChpKSk7CisgICAgICAgIGZvciAoSW1hZ2VPcGVyYXRpb24gaW5zdHIgOiBpbnN0cnVjdGlvbnMpIHsKICAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIERyYXdPcGVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIFRyYW5zZm9ybU9wZXJhdGlvbiBoYXMgRHJhd09wZXJhdGlvbiBjaGlsZHJlbgogICAgICAgICAgICAgICAgIC8vIHRoZW4gUm90YXRlIHRoZSBmaXJzdCBjaGlsZCBhbmQgcmV0dXJuLgogICAgICAgICAgICAgICAgIFBsYW5hckltYWdlIG9wID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBvcCA9IHBlcmZvcm1Sb3RhdGUob3ApOwotICAgICAgICAgICAgICAgIHJldHVybiBvcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybVJvdGF0ZShvcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9TY2FsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvU2NhbGUuamF2YQppbmRleCA1MzI2OTRkLi5jNWZmZDM2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9TY2FsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1NjYWxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSw4ICs0MSw5IEBACiAgICAgLyoqIEVudW1lcmF0ZWQgY2xhc3MgZm9yIHByb3BvcnRpb25zIGF0dHJpYnV0ZS4gKi8KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BvcnRpb25zQXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CiAgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJpZ25vcmUiLCAid2lkdGgiLCAiaGVpZ2h0IiwgImNvdmVyIiwgImZpdCJ9OworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJpZ25vcmUiLCAid2lkdGgiLCAiaGVpZ2h0IiwgImNvdmVyIiwgImZpdCIgfTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzYsMTYgKzc3LDE0IEBACiAgICAgICogQHJldHVybiB0aGUgdmFsdWUgY29udmVydGVkIGZyb20gdGhlIHdpZHRoIHN0cmluZy4KICAgICAgKi8KICAgICBwdWJsaWMgZmxvYXQgZ2V0V2lkdGgoKSB7Ci0gICAgICAgIGZsb2F0IHdpZHRoID0gMC4wRjsKICAgICAgICAgaW50IHBlcmNJbmRleCA9IHdpZHRoU3RyLmluZGV4T2YoJyUnKTsKICAgICAgICAgaWYgKHBlcmNJbmRleCA+IDApIHsKLSAgICAgICAgICAgIHdpZHRoID0gRmxvYXQucGFyc2VGbG9hdCh3aWR0aFN0ci5zdWJzdHJpbmcoMCwgcGVyY0luZGV4KSk7CiAgICAgICAgICAgICB4UGVyY2VudCA9IHRydWU7CisgICAgICAgICAgICBmbG9hdCB3aWR0aCA9IEZsb2F0LnBhcnNlRmxvYXQod2lkdGhTdHIuc3Vic3RyaW5nKDAsIHBlcmNJbmRleCkpOwogICAgICAgICAgICAgcmV0dXJuIHdpZHRoIC8gSFVORFJFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHhQZXJjZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdCh3aWR0aFN0cik7CiAgICAgICAgIH0KKyAgICAgICAgeFBlcmNlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQod2lkdGhTdHIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTUsMTMgKzk0LDExIEBACiAgICAgcHVibGljIGZsb2F0IGdldEhlaWdodCgpIHsKICAgICAgICAgaW50IHBlcmNJbmRleCA9IGhlaWdodFN0ci5pbmRleE9mKCclJyk7CiAgICAgICAgIGlmIChwZXJjSW5kZXggPiAwKSB7Ci0gICAgICAgICAgICBmbG9hdCBoZWlnaHQgPSBGbG9hdC5wYXJzZUZsb2F0KGhlaWdodFN0ci5zdWJzdHJpbmcoMCwgcGVyY0luZGV4KSk7CiAgICAgICAgICAgICB5UGVyY2VudCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gaGVpZ2h0IC8gSFVORFJFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHlQZXJjZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gRmxvYXQucGFyc2VGbG9hdChoZWlnaHRTdHIpOworICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQoaGVpZ2h0U3RyLnN1YnN0cmluZygwLCBwZXJjSW5kZXgpKSAvIEhVTkRSRUQ7CiAgICAgICAgIH0KKyAgICAgICAgeVBlcmNlbnQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEZsb2F0LnBhcnNlRmxvYXQoaGVpZ2h0U3RyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNiwxMCArMTEzLDEwIEBACiAgICAgICAgIGZsb2F0IHlGbCA9IGdldEhlaWdodCgpOwogCiAgICAgICAgIGlmICgheFBlcmNlbnQpIHsKLSAgICAgICAgICAgIHhGbCA9ICh4RmwgLyBpbWFnZS5nZXRXaWR0aCgpKTsKKyAgICAgICAgICAgIHhGbCAvPSBpbWFnZS5nZXRXaWR0aCgpOwogICAgICAgICB9CiAgICAgICAgIGlmICgheVBlcmNlbnQpIHsKLSAgICAgICAgICAgIHlGbCA9ICh5RmwgLyBpbWFnZS5nZXRIZWlnaHQoKSk7CisgICAgICAgICAgICB5RmwgLz0gaW1hZ2UuZ2V0SGVpZ2h0KCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIndpZHRoIi5lcXVhbHMocHJvcG9ydGlvbnMpKSB7CkBAIC0xMzQsOCArMTMxLDggQEAKICAgICAgICAgICAgIHhGbCA9IHlGbDsKICAgICAgICAgfQogCi0gICAgICAgIHBiLmFkZChuZXcgRmxvYXQoeEZsKSk7Ci0gICAgICAgIHBiLmFkZChuZXcgRmxvYXQoeUZsKSk7CisgICAgICAgIHBiLmFkZChGbG9hdC52YWx1ZU9mKHhGbCkpOworICAgICAgICBwYi5hZGQoRmxvYXQudmFsdWVPZih5RmwpKTsKIAogICAgICAgICBsb2coIlx0U2NhbGluZyB0byAiICsgKHhGbCAqIEhVTkRSRUQpICsgIiUgeCAiCiAgICAgICAgICAgICArICh5RmwgKiBIVU5EUkVEKSArICIlIik7CkBAIC0xNDUsMTggKzE0MiwxNiBAQAogCiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgUGxhbmFySW1hZ2UgZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihQbGFuYXJJbWFnZSBpbWFnZSkgewotICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbnVsbDsKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBpbnN0cnVjdGlvbnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgSW1hZ2VPcGVyYXRpb24gaW5zdHIgPSAoKEltYWdlT3BlcmF0aW9uKSBpbnN0cnVjdGlvbnMuZWxlbWVudEF0KGkpKTsKKyAgICAgICAgZm9yIChJbWFnZU9wZXJhdGlvbiBpbnN0ciA6IGluc3RydWN0aW9ucykgewogICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgewogICAgICAgICAgICAgICAgIHJldHVybiBwZXJmb3JtU2NhbGUoaW1hZ2UpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0ciBpbnN0YW5jZW9mIFRyYW5zZm9ybU9wZXJhdGlvbikgewotICAgICAgICAgICAgICAgIGJpID0gaW1hZ2UuZ2V0QXNCdWZmZXJlZEltYWdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gaW1hZ2UuZ2V0QXNCdWZmZXJlZEltYWdlKCk7CiAgICAgICAgICAgICAgICAgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpCiAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlLndyYXBSZW5kZXJlZEltYWdlKGJpKSk7Ci0gICAgICAgICAgICAgICAgYmkgPSBpbWFnZS5nZXRBc0J1ZmZlcmVkSW1hZ2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXR1cm4gcGVyZm9ybVNjYWxlKGltYWdlKTsKQEAgLTE2NCwxMCArMTU5LDkgQEAKIAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFBsYW5hckltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgewotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGluc3RydWN0aW9ucy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBJbWFnZU9wZXJhdGlvbiBpbnN0ciA9ICgoSW1hZ2VPcGVyYXRpb24pIGluc3RydWN0aW9ucy5lbGVtZW50QXQoaSkpOworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgUGxhbmFySW1hZ2UgaW1hZ2UgPSBudWxsOwogICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgVHJhbnNmb3JtT3BlcmF0aW9uIGhhcyBEcmF3T3BlcmF0aW9uIGNoaWxkcmVuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9UZXh0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9UZXh0LmphdmEKaW5kZXggYWMxOGVkNC4uN2YyMDY5MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2UvVGV4dC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RleHQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDcgKzMyLDcgQEAKIHB1YmxpYyBjbGFzcyBUZXh0IGV4dGVuZHMgSW1hZ2VPcGVyYXRpb24gaW1wbGVtZW50cyBEcmF3T3BlcmF0aW9uIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT0lOVCA9IDEwOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyVGV4dCA9ICIiOworICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZyA9ICIiOwogICAgIHByaXZhdGUgU3RyaW5nIGZvbnQgPSAiQXJpYWwiOwogICAgIHByaXZhdGUgaW50IHBvaW50ID0gREVGQVVMVF9QT0lOVDsKICAgICBwcml2YXRlIGJvb2xlYW4gYm9sZCA9IGZhbHNlOwpAQCAtNDQsNyArNDQsNyBAQAogICAgICAqIEBwYXJhbSBzdHIgdGhlIHN0cmluZyB0byBiZSB1c2VkLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIHN0clRleHQgPSBzdHI7CisgICAgICAgIHN0cmluZyA9IHN0cjsKICAgICB9CiAKICAgICAvKioKQEAgLTkxLDE0ICs5MSwxNSBAQAogICAgICAqIERyYXcgdGhlIHRleHQuCiAgICAgICogQHJldHVybiB0aGUgcmVzdWx0YW50IGltYWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBQbGFuYXJJbWFnZSBleGVjdXRlRHJhd09wZXJhdGlvbigpIHsKLSAgICAgICAgbG9nKCJcdENyZWF0aW5nIFRleHQgXCIiICsgc3RyVGV4dCArICJcIiIpOworICAgICAgICBsb2coIlx0Q3JlYXRpbmcgVGV4dCBcIiIgKyBzdHJpbmcgKyAiXCIiKTsKIAogICAgICAgICBpbnQgd2lkdGggPSAxOwogICAgICAgICBpbnQgaGVpZ2h0ID0gMTsKIAogICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKLSAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IChHcmFwaGljczJEKSBiaS5nZXRHcmFwaGljcygpOworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKICAgICAgICAgZ3JhcGhpY3Muc2V0UmVuZGVyaW5nSGludCgKICAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzLktFWV9BTlRJQUxJQVNJTkcsIFJlbmRlcmluZ0hpbnRzLlZBTFVFX0FOVElBTElBU19PTik7CiAgICAgICAgIGdyYXBoaWNzLnNldFJlbmRlcmluZ0hpbnQoCkBAIC0xMDYsMTEgKzEwNywxMCBAQAogICAgICAgICBGb250IGYgPSBjcmVhdGVGb250KCk7CiAgICAgICAgIEZvbnRNZXRyaWNzIGZtZXRyaWNzID0gZ3JhcGhpY3MuZ2V0Rm9udE1ldHJpY3MoZik7CiAgICAgICAgIGhlaWdodCA9IGZtZXRyaWNzLmdldE1heEFzY2VudCgpICsgZm1ldHJpY3MuZ2V0TWF4RGVzY2VudCgpOwotICAgICAgICB3aWR0aCA9IGZtZXRyaWNzLnN0cmluZ1dpZHRoKHN0clRleHQpOwotCisgICAgICAgIHdpZHRoID0gZm1ldHJpY3Muc3RyaW5nV2lkdGgoc3RyaW5nKTsKIAogICAgICAgICBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoLCBoZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRSk7Ci0gICAgICAgIGdyYXBoaWNzID0gKEdyYXBoaWNzMkQpIGJpLmdldEdyYXBoaWNzKCk7CisgICAgICAgIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKIAogICAgICAgICBncmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KAogICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKQEAgLTExOSw5ICsxMTksOCBAQAogCiAgICAgICAgIGdyYXBoaWNzLnNldEZvbnQoZik7CiAgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKGNvbG9yKSk7Ci0gICAgICAgIGdyYXBoaWNzLmRyYXdTdHJpbmcoc3RyVGV4dCwgMCwgaGVpZ2h0IC0gZm1ldHJpY3MuZ2V0TWF4RGVzY2VudCgpKTsKLSAgICAgICAgUGxhbmFySW1hZ2UgaW1hZ2UgPSBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7Ci0gICAgICAgIHJldHVybiBpbWFnZTsKKyAgICAgICAgZ3JhcGhpY3MuZHJhd1N0cmluZyhzdHJpbmcsIDAsIGhlaWdodCAtIGZtZXRyaWNzLmdldE1heERlc2NlbnQoKSk7CisgICAgICAgIHJldHVybiBQbGFuYXJJbWFnZS53cmFwUmVuZGVyZWRJbWFnZShiaSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBGb250IGNyZWF0ZUZvbnQoKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZS9UcmFuc2Zvcm1PcGVyYXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RyYW5zZm9ybU9wZXJhdGlvbi5qYXZhCmluZGV4IDg5NmU1ZDEuLjgzMjIwZDIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RyYW5zZm9ybU9wZXJhdGlvbi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlL1RyYW5zZm9ybU9wZXJhdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsNiArMzIsNyBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBQbGFuYXJJbWFnZSBleGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKFBsYW5hckltYWdlIGltZyk7CiAKICAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkUmVjdGFuZ2xlKFJlY3RhbmdsZSBpbnN0cikgewogICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL0FyYy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9BcmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTcxNmVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9BcmMuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uQXJjMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIERyYXcgYW4gYXJjLgorICovCitwdWJsaWMgY2xhc3MgQXJjIGV4dGVuZHMgQmFzaWNTaGFwZSBpbXBsZW1lbnRzIERyYXdPcGVyYXRpb24geworICAgIHByaXZhdGUgaW50IHN0YXJ0ID0gMDsKKyAgICBwcml2YXRlIGludCBzdG9wID0gMDsKKyAgICBwcml2YXRlIEFyY1R5cGUgdHlwZSA9IEFyY1R5cGUuZ2V0RGVmYXVsdCgpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdGFydCBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBzdGFydCB0aGUgc3RhcnQgb2YgdGhlIGFyYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKKyAgICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RvcCBvZiB0aGUgYXJjLgorICAgICAqIEBwYXJhbSBzdG9wIHRoZSBzdG9wIG9mIHRoZSBhcmMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RvcChpbnQgc3RvcCkgeworICAgICAgICB0aGlzLnN0b3AgPSBzdG9wOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiBhcmMuCisgICAgICogQHBhcmFtIGFyY1R5cGUgdGhlIHR5cGUgdG8gdXNlIC0gb3BlbiwgcGllIG9yIGNob3JkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoQXJjVHlwZSBhcmNUeXBlKSB7CisgICAgICAgIHR5cGUgPSBhcmNUeXBlOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGggKyAoc3Ryb2tlV2lkdGggKiAyKSwKKyAgICAgICAgICAgIGhlaWdodCArIChzdHJva2VXaWR0aCAqIDIpLCBCdWZmZXJlZEltYWdlLlRZUEVfNEJZVEVfQUJHUl9QUkUpOworCisgICAgICAgIEdyYXBoaWNzMkQgZ3JhcGhpY3MgPSBiaS5jcmVhdGVHcmFwaGljcygpOworCisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKHN0cm9rZSkpIHsKKyAgICAgICAgICAgIEJhc2ljU3Ryb2tlIGJTdHJva2UgPSBuZXcgQmFzaWNTdHJva2Uoc3Ryb2tlV2lkdGgpOworICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Q29sb3IoQ29sb3JNYXBwZXIuZ2V0Q29sb3JCeU5hbWUoc3Ryb2tlKSk7CisgICAgICAgICAgICBncmFwaGljcy5zZXRTdHJva2UoYlN0cm9rZSk7CisgICAgICAgICAgICBncmFwaGljcy5kcmF3KG5ldyBBcmMyRC5Eb3VibGUoc3Ryb2tlV2lkdGgsIHN0cm9rZVdpZHRoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsIHN0YXJ0LCBzdG9wLCB0eXBlLmdldEluZGV4KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKGZpbGwpKSB7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShmaWxsKSk7CisgICAgICAgICAgICBncmFwaGljcy5maWxsKG5ldyBBcmMyRC5Eb3VibGUoc3Ryb2tlV2lkdGgsIHN0cm9rZVdpZHRoLAorICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHN0YXJ0LCBzdG9wLCB0eXBlLmdldEluZGV4KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSW1hZ2VPcGVyYXRpb24gaW5zdHIgOiBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIERyYXdPcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGltZyA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKGltZywgbnVsbCwgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgYmkgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oYmkpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcmNUeXBlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFZBTFVFUyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICBWQUxVRVMuYWRkKEFyYzJELk9QRU4sICJvcGVuIik7CisgICAgICAgICAgICBWQUxVRVMuYWRkKEFyYzJELkNIT1JELCAiY2hvcmQiKTsKKyAgICAgICAgICAgIFZBTFVFUy5hZGQoQXJjMkQuUElFLCAicGllIik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcmNUeXBlKCkgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIHVzaW5nIGEgc3RyaW5nLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBBcmNUeXBlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgc2V0VmFsdWUodmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGVmYXVsdCBBcmNUeXBlIHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBBcmNUeXBlIGdldERlZmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFyY1R5cGUoVkFMVUVTLmdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcygpCisgICAgICAgICAqIHtAaW5oZXJpdERvY30uCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRVMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vQmFzaWNTaGFwZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9CYXNpY1NoYXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMGUxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vQmFzaWNTaGFwZS5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlaW87CisKKworLyoqIERyYXcgYSBiYXNpYyBzaGFwZSAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2ljU2hhcGUgZXh0ZW5kcyBJbWFnZU9wZXJhdGlvbiBpbXBsZW1lbnRzIERyYXdPcGVyYXRpb24geworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9GRiAtIGJjCisgICAgcHJvdGVjdGVkIGludCB3aWR0aCA9IDA7CisgICAgcHJvdGVjdGVkIGludCBoZWlnaHQgPSAwOworICAgIHByb3RlY3RlZCBpbnQgc3Ryb2tlV2lkdGggPSAwOworICAgIHByb3RlY3RlZCBTdHJpbmcgc3Ryb2tlID0gImJsYWNrIjsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZpbGwgPSAidHJhbnNwYXJlbnQiOworICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHdpZHRoLgorICAgICAqIEBwYXJhbSB3IHRoZSB3aWR0aCBvZiB0aGUgc2hhcGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50IHcpIHsKKyAgICAgICAgd2lkdGggPSB3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgaGVpZ2h0LgorICAgICAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHNoYXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEhlaWdodChpbnQgaCkgeworICAgICAgICBoZWlnaHQgPSBoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3Ryb2tlIHdpZHRoIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gc3cgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJva2V3aWR0aChpbnQgc3cpIHsKKyAgICAgICAgc3Ryb2tlV2lkdGggPSBzdzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cm9rZSBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIGNvbCB0aGUgY29sb3IgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cm9rZShTdHJpbmcgY29sKSB7CisgICAgICAgIHN0cm9rZSA9IGNvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZpbGwgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBjb2wgdGhlIGNvbG9yIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxsKFN0cmluZyBjb2wpIHsKKyAgICAgICAgZmlsbCA9IGNvbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL0NvbG9yTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL0NvbG9yTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4MmFlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vQ29sb3JNYXBwZXIuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbG9yTWFwcGVyIHsKKworICAgIC8qKiBibGFjayBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9CTEFDSyA9ICJibGFjayI7CisgICAgLyoqIGJsdWUgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfQkxVRSA9ICJibHVlIjsKKyAgICAvKiogY3lhbiBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9DWUFOID0gImN5YW4iOworICAgIC8qKiBibGFjayBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9EQVJLR1JBWSA9ICJkYXJrZ3JheSI7CisgICAgLyoqIGdyYXkgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfR1JBWSA9ICJncmF5IjsKKyAgICAvKiogbGlnaHRncmF5IHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0xJR0hUR1JBWSA9ICJsaWdodGdyYXkiOworICAgIC8vIEdvdHRhIGF0IGxlYXN0IHB1dCBpbiB0aGUgcHJvcGVyIHNwZWxsaW5nIDotUAorICAgIC8qKiBkYXJrZ3JleSBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9EQVJLR1JFWSA9ICJkYXJrZ3JleSI7CisgICAgLyoqIGdyZXkgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfR1JFWSA9ICJncmV5IjsKKyAgICAvKiogbGlnaHRncmV5IHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0xJR0hUR1JFWSA9ICJsaWdodGdyZXkiOworICAgIC8qKiBncmVlbiBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9HUkVFTiA9ICJncmVlbiI7CisgICAgLyoqIG1hZ2VudGEgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfTUFHRU5UQSA9ICJtYWdlbnRhIjsKKyAgICAvKiogb3JhbmdlIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX09SQU5HRSA9ICJvcmFuZ2UiOworICAgIC8qKiBwaW5rIHN0cmluZyAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BJTksgPSAicGluayI7CisgICAgLyoqIHJlZyBzdHJpbmcgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9SRUQgPSAicmVkIjsKKyAgICAvKiogd2hpdGUgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfV0hJVEUgPSAid2hpdGUiOworICAgIC8qKiB5ZWxsb3cgc3RyaW5nICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MT1JfWUVMTE9XID0gInllbGxvdyI7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgY29sb3IgbmFtZSB0byBhIGNvbG9yIHZhbHVlLgorICAgICAqIEBwYXJhbSBjb2xvck5hbWUgYSBzdHJpbmcgcmVwciBvZiB0aGUgY29sb3IuCisgICAgICogQHJldHVybiB0aGUgY29sb3IgdmFsdWUuCisgICAgICogQHRvZG8gcmVmYWN0b3IgdG8gdXNlIGFuIEVudW1lcmF0ZWRBdHRyaWJ1dGUgKG1heWJlPykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbG9yIGdldENvbG9yQnlOYW1lKFN0cmluZyBjb2xvck5hbWUpIHsKKyAgICAgICAgc3dpdGNoIChjb2xvck5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfQkxVRToKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5ibHVlOworICAgICAgICBjYXNlIENPTE9SX0NZQU46CisgICAgICAgICAgICByZXR1cm4gQ29sb3IuY3lhbjsKKyAgICAgICAgY2FzZSBDT0xPUl9EQVJLR1JBWToKKyAgICAgICAgY2FzZSBDT0xPUl9EQVJLR1JFWToKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5kYXJrR3JheTsKKyAgICAgICAgY2FzZSBDT0xPUl9HUkFZOgorICAgICAgICBjYXNlIENPTE9SX0dSRVk6CisgICAgICAgICAgICByZXR1cm4gQ29sb3IuZ3JheTsKKyAgICAgICAgY2FzZSBDT0xPUl9MSUdIVEdSQVk6CisgICAgICAgIGNhc2UgQ09MT1JfTElHSFRHUkVZOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLmxpZ2h0R3JheTsKKyAgICAgICAgY2FzZSBDT0xPUl9HUkVFTjoKKyAgICAgICAgICAgIHJldHVybiBDb2xvci5ncmVlbjsKKyAgICAgICAgY2FzZSBDT0xPUl9NQUdFTlRBOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLm1hZ2VudGE7CisgICAgICAgIGNhc2UgQ09MT1JfT1JBTkdFOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLm9yYW5nZTsKKyAgICAgICAgY2FzZSBDT0xPUl9QSU5LOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLnBpbms7CisgICAgICAgIGNhc2UgQ09MT1JfUkVEOgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLnJlZDsKKyAgICAgICAgY2FzZSBDT0xPUl9XSElURToKKyAgICAgICAgICAgIHJldHVybiBDb2xvci53aGl0ZTsKKyAgICAgICAgY2FzZSBDT0xPUl9ZRUxMT1c6CisgICAgICAgICAgICByZXR1cm4gQ29sb3IueWVsbG93OworICAgICAgICBjYXNlIENPTE9SX0JMQUNLOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIENvbG9yLmJsYWNrOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIHByaXZhdGUgY29uc3RydWN0b3IgZm9yIFV0aWxpdHkgY2xhc3MgKi8KKyAgICBwcml2YXRlIENvbG9yTWFwcGVyKCkgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9EcmF3LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL0RyYXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjg1ZTllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9EcmF3LmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKgorICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZS5JbWFnZUlPVGFzaworICovCitwdWJsaWMgY2xhc3MgRHJhdyBleHRlbmRzIFRyYW5zZm9ybU9wZXJhdGlvbiB7CisgICAgcHJpdmF0ZSBpbnQgeGxvYyA9IDA7CisgICAgcHJpdmF0ZSBpbnQgeWxvYyA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFggbG9jYXRpb24uCisgICAgICogQHBhcmFtIHggdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRYbG9jKGludCB4KSB7CisgICAgICAgIHhsb2MgPSB4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgWSBsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0geSB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFlsb2MoaW50IHkpIHsKKyAgICAgICAgeWxvYyA9IHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRleHQgdG8gdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gdGV4dCB0aGUgdGV4dCB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkVGV4dChUZXh0IHRleHQpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZCh0ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSByZWN0YW5nbGUgdG8gdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVjdCB0aGUgcmVjdGFuZ2xlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChyZWN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZWxsaXBzZS4KKyAgICAgKiBAcGFyYW0gZWxpcCB0aGUgZWxsaXBzZSB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkRWxsaXBzZShFbGxpcHNlIGVsaXApIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChlbGlwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gYXJjLgorICAgICAqIEBwYXJhbSBhcmMgdGhlIGFyYyB0byBhZGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkQXJjKEFyYyBhcmMpIHsKKyAgICAgICAgaW5zdHJ1Y3Rpb25zLmFkZChhcmMpOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oQnVmZmVyZWRJbWFnZSBiaSkgeworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKKworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBvcCA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbG9nKCJcdERyYXdpbmcgdG8geD0iICsgeGxvYyArICIgeT0iICsgeWxvYyk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd0ltYWdlKG9wLCBudWxsLCB4bG9jLCB5bG9jKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGNoaWxkCisgICAgICAgICAgICAgICAgICAgID0gKChUcmFuc2Zvcm1PcGVyYXRpb24pIGluc3RyKS5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKG51bGwpOworICAgICAgICAgICAgICAgIGxvZygiXHREcmF3aW5nIHRvIHg9IiArIHhsb2MgKyAiIHk9IiArIHlsb2MpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdJbWFnZShjaGlsZCwgbnVsbCwgeGxvYywgeWxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vRHJhd09wZXJhdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9EcmF3T3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyOGI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vRHJhd09wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlaW87CisKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworCisvKioKKyAqIEludGVyZmFjZSB3aGljaCByZXByZXNlbnRzIGFuIE9wZXJhdGlvbiB3aGljaCBpcyAiZHJhd2FibGUiLCBzdWNoCisgKiBhcyBhIFJlY3RhbmdsZSwgQ2lyY2xlIG9yIFRleHQuICBUaGUgT3BlcmF0aW9uIGlzIHJlc3BvbnNpYmxlIGZvcgorICogY3JlYXRpbmcgaXRzIG93biBpbWFnZSBidWZmZXIgYW5kIGRyYXdpbmcgaXRzZWxmIGludG8gaXQsIHRoZW4KKyAqIHdyYXBwaW5nIGFuZCByZXR1cm5pbmcgaXQgYXMgYSBQbGFuYXJJbWFnZS4gIFRoaXMgYWxsb3dzIG11bHRpcGxlCisgKiAiZHJhd2FibGUiIG9iamVjdHMgdG8gYmUgbmVzdGVkLgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGludGVyZmFjZSBEcmF3T3BlcmF0aW9uIHsKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBtZXRob2Qgd2hpY2ggaXMgaW50ZW5kZWQgdG8gY3JlYXRlIGFuIGltYWdlIGJ1ZmZlcgorICAgICAqIGFuZCByZXR1cm4gaXQgc28gaXQgY2FuIGJlIGRyYXduIGludG8gYW5vdGhlciBvYmplY3QuICBVc2UKKyAgICAgKiBhbiBBbHBoYSBjaGFubmVsIGZvciBhICJ0cmFuc3BhcmVudCIgYmFja2dyb3VuZC4KKyAgICAgKiBAcmV0dXJuIGEgcGxhbmFyIGltYWdlCisgICAgICovCisgICAgQnVmZmVyZWRJbWFnZSBleGVjdXRlRHJhd09wZXJhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9FbGxpcHNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL0VsbGlwc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGRmMjRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9FbGxpcHNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IGphdmEuYXd0LkJhc2ljU3Ryb2tlOworaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzMkQ7CitpbXBvcnQgamF2YS5hd3QuZ2VvbS5FbGxpcHNlMkQ7CitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKKworLyoqCisgKiBEcmF3IGFuIGVsbGlwc2UuCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlSU9UYXNrCisgKi8KK3B1YmxpYyBjbGFzcyBFbGxpcHNlIGV4dGVuZHMgQmFzaWNTaGFwZSBpbXBsZW1lbnRzIERyYXdPcGVyYXRpb24geworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKKworICAgICAgICBHcmFwaGljczJEIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKKworICAgICAgICBpZiAoISJ0cmFuc3BhcmVudCIuZXF1YWxzSWdub3JlQ2FzZShzdHJva2UpKSB7CisgICAgICAgICAgICBCYXNpY1N0cm9rZSBiU3Ryb2tlID0gbmV3IEJhc2ljU3Ryb2tlKHN0cm9rZVdpZHRoKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKHN0cm9rZSkpOworICAgICAgICAgICAgZ3JhcGhpY3Muc2V0U3Ryb2tlKGJTdHJva2UpOworICAgICAgICAgICAgZ3JhcGhpY3MuZHJhdyhuZXcgRWxsaXBzZTJELkRvdWJsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISJ0cmFuc3BhcmVudCIuZXF1YWxzSWdub3JlQ2FzZShmaWxsKSkgeworICAgICAgICAgICAgZ3JhcGhpY3Muc2V0Q29sb3IoQ29sb3JNYXBwZXIuZ2V0Q29sb3JCeU5hbWUoZmlsbCkpOworICAgICAgICAgICAgZ3JhcGhpY3MuZmlsbChuZXcgRWxsaXBzZTJELkRvdWJsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWcgPSAoKERyYXdPcGVyYXRpb24pIGluc3RyKS5leGVjdXRlRHJhd09wZXJhdGlvbigpOworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmRyYXdJbWFnZShpbWcsIG51bGwsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0ciBpbnN0YW5jZW9mIFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGJpID0gKChUcmFuc2Zvcm1PcGVyYXRpb24pIGluc3RyKS5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKGJpKTsKKyAgICAgICAgICAgICAgICBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vSW1hZ2VPcGVyYXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vSW1hZ2VPcGVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzdlZjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9JbWFnZU9wZXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlaW87CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEltYWdlT3BlcmF0aW9uIGV4dGVuZHMgRGF0YVR5cGUgeworICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYworICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PEltYWdlT3BlcmF0aW9uPiBpbnN0cnVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT04KKworICAgIC8qKgorICAgICAqIEFkZCBhIHJvdGF0ZSB0byB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBpbnN0ciB0aGUgcm90YXRlIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRSb3RhdGUoUm90YXRlIGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIGRyYXcgdG8gdGhlIG9wZXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW5zdHIgdGhlIGRyYXcgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERyYXcoRHJhdyBpbnN0cikgeworICAgICAgICBpbnN0cnVjdGlvbnMuYWRkKGluc3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBzY2FsZSB0byB0aGUgb3BlcmF0aW9uLgorICAgICAqIEBwYXJhbSBpbnN0ciB0aGUgc2NhbGUgdG8gYWRkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNjYWxlKFNjYWxlIGluc3RyKSB7CisgICAgICAgIGluc3RydWN0aW9ucy5hZGQoaW5zdHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vUmVjdGFuZ2xlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1JlY3RhbmdsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzY2I4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1JlY3RhbmdsZS5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlaW87CisKK2ltcG9ydCBqYXZhLmF3dC5CYXNpY1N0cm9rZTsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGNsYXNzIFJlY3RhbmdsZSBleHRlbmRzIEJhc2ljU2hhcGUgaW1wbGVtZW50cyBEcmF3T3BlcmF0aW9uIHsKKyAgICBwcml2YXRlIGludCBhcmN3aWR0aCA9IDA7CisgICAgcHJpdmF0ZSBpbnQgYXJjaGVpZ2h0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXJjIHdpZHRoLgorICAgICAqIEBwYXJhbSB3IHRoZSB2YWx1ZSB0byB1c2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXJjd2lkdGgoaW50IHcpIHsKKyAgICAgICAgYXJjd2lkdGggPSB3OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYXJjIGhlaWdodC4KKyAgICAgKiBAcGFyYW0gaCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyY2hlaWdodChpbnQgaCkgeworICAgICAgICBhcmNoZWlnaHQgPSBoOworICAgIH0KKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBsb2coIlx0Q3JlYXRpbmcgUmVjdGFuZ2xlIHc9IiArIHdpZHRoICsgIiBoPSIgKyBoZWlnaHQgKyAiIGFyY3c9IgorICAgICAgICAgICAgKyBhcmN3aWR0aCArICIgYXJjaD0iICsgYXJjaGVpZ2h0KTsKKyAgICAgICAgQnVmZmVyZWRJbWFnZSBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoLCBoZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRSk7CisKKyAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CisKKyAgICAgICAgaWYgKCEidHJhbnNwYXJlbnQiLmVxdWFsc0lnbm9yZUNhc2Uoc3Ryb2tlKSkgeworICAgICAgICAgICAgQmFzaWNTdHJva2UgYlN0cm9rZSA9IG5ldyBCYXNpY1N0cm9rZShzdHJva2VXaWR0aCk7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShzdHJva2UpKTsKKyAgICAgICAgICAgIGdyYXBoaWNzLnNldFN0cm9rZShiU3Ryb2tlKTsKKworICAgICAgICAgICAgaWYgKGFyY3dpZHRoID09IDAgJiYgYXJjaGVpZ2h0ID09IDApIHsKKyAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3UmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MuZHJhd1JvdW5kUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCBhcmN3aWR0aCwgYXJjaGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghInRyYW5zcGFyZW50Ii5lcXVhbHNJZ25vcmVDYXNlKGZpbGwpKSB7CisgICAgICAgICAgICBncmFwaGljcy5zZXRDb2xvcihDb2xvck1hcHBlci5nZXRDb2xvckJ5TmFtZShmaWxsKSk7CisgICAgICAgICAgICBpZiAoYXJjd2lkdGggPT0gMCAmJiBhcmNoZWlnaHQgPT0gMCkgeworICAgICAgICAgICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0KHN0cm9rZVdpZHRoLCBzdHJva2VXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAoc3Ryb2tlV2lkdGggKiAyKSwgaGVpZ2h0IC0gKHN0cm9rZVdpZHRoICogMikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBncmFwaGljcy5maWxsUm91bmRSZWN0KHN0cm9rZVdpZHRoLCBzdHJva2VXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAoc3Ryb2tlV2lkdGggKiAyKSwgaGVpZ2h0IC0gKHN0cm9rZVdpZHRoICogMiksCisgICAgICAgICAgICAgICAgICAgIGFyY3dpZHRoLCBhcmNoZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChJbWFnZU9wZXJhdGlvbiBpbnN0ciA6IGluc3RydWN0aW9ucykgeworICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW1hZ2UgaW1nID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBncmFwaGljcy5kcmF3SW1hZ2UoaW1nLCBudWxsLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5zdHIgaW5zdGFuY2VvZiBUcmFuc2Zvcm1PcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBiaSA9ICgoVHJhbnNmb3JtT3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihiaSk7CisgICAgICAgICAgICAgICAgZ3JhcGhpY3MgPSBiaS5jcmVhdGVHcmFwaGljcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBiaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1JvdGF0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9Sb3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVhOWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9Sb3RhdGUuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5HcmFwaGljczJEOworaW1wb3J0IGphdmEuYXd0Lmdlb20uQWZmaW5lVHJhbnNmb3JtOworaW1wb3J0IGphdmEuYXd0Lmdlb20uUG9pbnQyRDsKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLlJlY3RhbmdsZTJEOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkFmZmluZVRyYW5zZm9ybU9wOworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworLyoqCisgKiBJbWFnZU9wZXJhdGlvbiB0byByb3RhdGUgYW4gaW1hZ2UgYnkgYSBjZXJ0YWluIGRlZ3JlZQorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGNsYXNzIFJvdGF0ZSBleHRlbmRzIFRyYW5zZm9ybU9wZXJhdGlvbiBpbXBsZW1lbnRzIERyYXdPcGVyYXRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEhBTEZfQ0lSQ0xFID0gMTgwLjBGOworCisgICAgcHJpdmF0ZSBmbG9hdCBhbmdsZSA9IDAuMEY7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBhbmdsZSBvZiByb3RhdGlvbiBpbiBkZWdyZWVzLgorICAgICAqIEBwYXJhbSBhbmcgVGhlIGFuZ2xlIGF0IHdoaWNoIHRvIHJvdGF0ZSB0aGUgaW1hZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBbmdsZShTdHJpbmcgYW5nKSB7CisgICAgICAgIGFuZ2xlID0gRmxvYXQucGFyc2VGbG9hdChhbmcpICUgKDIgKiBIQUxGX0NJUkNMRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRlIGFuIGltYWdlLgorICAgICAqIEBwYXJhbSBpbWFnZSB0aGUgaW1hZ2UgdG8gcm90YXRlLgorICAgICAqIEByZXR1cm4gdGhlIHJvdGF0ZWQgaW1hZ2UuCisgICAgICovCisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgcGVyZm9ybVJvdGF0ZShCdWZmZXJlZEltYWdlIGltYWdlKSB7CisgICAgICAgIC8vIEZsb2F0IHplcm8gY2FuIGJlIG5lZ2F0aXZlCisgICAgICAgIGlmIChGbG9hdC5jb21wYXJlKE1hdGguYWJzKGFuZ2xlKSwgMC4wRikgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGltYWdlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFuZ2xlIDwgMCkgeworICAgICAgICAgICAgYW5nbGUgKz0gMiAqIEhBTEZfQ0lSQ0xFOworICAgICAgICB9CisKKyAgICAgICAgLy8gMTgwIGRlZ3JlZSByb3RhdGlvbiA9PSBmbGlwIHRoZSBpbWFnZSB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkKKyAgICAgICAgaWYgKEZsb2F0LmNvbXBhcmUoYW5nbGUsIEhBTEZfQ0lSQ0xFKSA9PSAwKSB7CisgICAgICAgICAgICBsb2coIkZsaXBwaW5nIGFuIGltYWdlIiwgUHJvamVjdC5NU0dfREVCVUcpOworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHR4ID0gQWZmaW5lVHJhbnNmb3JtLmdldFNjYWxlSW5zdGFuY2UoLTEsIC0xKTsKKyAgICAgICAgICAgIHR4LnRyYW5zbGF0ZSgtaW1hZ2UuZ2V0V2lkdGgobnVsbCksIC1pbWFnZS5nZXRIZWlnaHQobnVsbCkpOworICAgICAgICAgICAgQWZmaW5lVHJhbnNmb3JtT3Agb3AgPSBuZXcgQWZmaW5lVHJhbnNmb3JtT3AodHgsIEFmZmluZVRyYW5zZm9ybU9wLlRZUEVfTkVBUkVTVF9ORUlHSEJPUik7CisgICAgICAgICAgICByZXR1cm4gb3AuZmlsdGVyKGltYWdlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEFmZmluZVRyYW5zZm9ybSB0eCA9IEFmZmluZVRyYW5zZm9ybS5nZXRSb3RhdGVJbnN0YW5jZSgoZmxvYXQpIChhbmdsZQorICAgICAgICAgICAgICAgICogKE1hdGguUEkgLyBIQUxGX0NJUkNMRSkpKTsKKyAgICAgICAgLy8gRmlndXJlIG91dCB0aGUgbmV3IGJvdW5kaW5nIGJveAorICAgICAgICBSZWN0YW5nbGUyRCBib3ggPSBnZXRCb3VuZGluZ0JveChpbWFnZSwgdHgpOworICAgICAgICBBZmZpbmVUcmFuc2Zvcm0gdHJhbnNsYXRpb24gPSBBZmZpbmVUcmFuc2Zvcm0uZ2V0VHJhbnNsYXRlSW5zdGFuY2UoLWJveC5nZXRNaW5YKCksCisgICAgICAgICAgICAgICAgLWJveC5nZXRNaW5ZKCkpOworICAgICAgICB0eC5wcmVDb25jYXRlbmF0ZSh0cmFuc2xhdGlvbik7CisgICAgICAgIEJ1ZmZlcmVkSW1hZ2Ugcm90YXRlZEltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2UoKGludCkgTWF0aC5yb3VuZChib3guZ2V0V2lkdGgoKSksCisgICAgICAgICAgICAgICAgKGludCkgTWF0aC5yb3VuZChib3guZ2V0SGVpZ2h0KCkpLCBpbWFnZS5nZXRUeXBlKCkpOworICAgICAgICAvLyBBdm9pZCBibGFjayBzcGFjZSBhcm91bmQgdGhlIHJvdGF0ZWQgaW1hZ2UKKyAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IHJvdGF0ZWRJbWFnZS5jcmVhdGVHcmFwaGljcygpOworICAgICAgICBncmFwaGljcy5zZXRQYWludChuZXcgQ29sb3IoaW1hZ2UuZ2V0UkdCKDAsIDApKSk7CisgICAgICAgIGdyYXBoaWNzLmZpbGxSZWN0KDAsIDAsIHJvdGF0ZWRJbWFnZS5nZXRXaWR0aCgpLCByb3RhdGVkSW1hZ2UuZ2V0SGVpZ2h0KCkpOworICAgICAgICBncmFwaGljcy5kaXNwb3NlKCk7CisgICAgICAgIC8vIFJvdGF0ZQorICAgICAgICBBZmZpbmVUcmFuc2Zvcm1PcCByb3RhdGVPcCA9IG5ldyBBZmZpbmVUcmFuc2Zvcm1PcCh0eCwgQWZmaW5lVHJhbnNmb3JtT3AuVFlQRV9CSUxJTkVBUik7CisgICAgICAgIHJvdGF0ZU9wLmZpbHRlcihpbWFnZSwgcm90YXRlZEltYWdlKTsKKyAgICAgICAgcmV0dXJuIHJvdGF0ZWRJbWFnZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlY3RhbmdsZTJEIGdldEJvdW5kaW5nQm94KEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UsIEFmZmluZVRyYW5zZm9ybSB0eCkgeworICAgICAgICBpbnQgeG1heCA9IGltYWdlLmdldFdpZHRoKCkgLSAxOworICAgICAgICBpbnQgeW1heCA9IGltYWdlLmdldEhlaWdodCgpIC0gMTsKKyAgICAgICAgUG9pbnQyRFtdIGNvcm5lcnMgPSBuZXcgUG9pbnQyRC5Eb3VibGVbNF07CisgICAgICAgIGNvcm5lcnNbMF0gPSBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgMCk7CisgICAgICAgIGNvcm5lcnNbMV0gPSBuZXcgUG9pbnQyRC5Eb3VibGUoeG1heCwgMCk7CisgICAgICAgIGNvcm5lcnNbMl0gPSBuZXcgUG9pbnQyRC5Eb3VibGUoeG1heCwgeW1heCk7CisgICAgICAgIGNvcm5lcnNbM10gPSBuZXcgUG9pbnQyRC5Eb3VibGUoMCwgeW1heCk7CisgICAgICAgIHR4LnRyYW5zZm9ybShjb3JuZXJzLCAwLCBjb3JuZXJzLCAwLCA0KTsKKworICAgICAgICAvLyBDcmVhdGUgYm91bmRpbmcgYm94IG9mIHRyYW5zZm9ybWVkIGNvcm5lciBwb2ludHMKKyAgICAgICAgUmVjdGFuZ2xlMkQgYm91bmRpbmdCb3ggPSBuZXcgUmVjdGFuZ2xlMkQuRG91YmxlKCk7CisgICAgICAgIEFycmF5cy5zdHJlYW0oY29ybmVycywgMCwgNCkuZm9yRWFjaChib3VuZGluZ0JveDo6YWRkKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kaW5nQm94OworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBpbWFnZSByb3RhdGlvbiB3aGVuIGJlaW5nIGhhbmRsZWQgYXMgYSBUcmFuc2Zvcm1PcGVyYXRpb24uCisgICAgICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0byBwZXJmb3JtIHRoZSB0cmFuc2Zvcm1hdGlvbiBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVmZmVyZWRJbWFnZSBleGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UpIHsKKyAgICAgICAgZm9yIChJbWFnZU9wZXJhdGlvbiBpbnN0ciA6IGluc3RydWN0aW9ucykgeworICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgRHJhd09wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgVHJhbnNmb3JtT3BlcmF0aW9uIGhhcyBEcmF3T3BlcmF0aW9uIGNoaWxkcmVuCisgICAgICAgICAgICAgICAgLy8gdGhlbiBSb3RhdGUgdGhlIGZpcnN0IGNoaWxkIGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBvcCA9ICgoRHJhd09wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVEcmF3T3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBlcmZvcm1Sb3RhdGUob3ApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluc3RyIGluc3RhbmNlb2YgVHJhbnNmb3JtT3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgaW1hZ2UgPSAoKFRyYW5zZm9ybU9wZXJhdGlvbikgaW5zdHIpLmV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oaW1hZ2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGltYWdlID0gcGVyZm9ybVJvdGF0ZShpbWFnZSk7CisgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgUGVyZm9ybXMgdGhlIGltYWdlIHJvdGF0aW9uIHdoZW4gYmVpbmcgaGFuZGxlZCBhcyBhIERyYXdPcGVyYXRpb24uCisgICAgICogIEl0IGFic29sdXRlbHkgcmVxdWlyZXMgdGhhdCB0aGVyZSBiZSBhIERyYXdPcGVyYXRpb24gbmVzdGVkIGJlbmVhdGggaXQsCisgICAgICogIGJ1dCBvbmx5IHRoZSBGSVJTVCBEcmF3T3BlcmF0aW9uIHdpbGwgYmUgaGFuZGxlZCBzaW5jZSBpdCBjYW4gb25seSByZXR1cm4KKyAgICAgKiAgT05FIGltYWdlLgorICAgICAqIEByZXR1cm4gdGhlIGltYWdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBUcmFuc2Zvcm1PcGVyYXRpb24gaGFzIERyYXdPcGVyYXRpb24gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLyB0aGVuIFJvdGF0ZSB0aGUgZmlyc3QgY2hpbGQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBCdWZmZXJlZEltYWdlIG9wID0gKChEcmF3T3BlcmF0aW9uKSBpbnN0cikuZXhlY3V0ZURyYXdPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybVJvdGF0ZShvcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1NjYWxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1NjYWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiNDVlZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vU2NhbGUuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkVudW1lcmF0ZWRBdHRyaWJ1dGU7CisKK2ltcG9ydCBqYXZhLmF3dC5nZW9tLkFmZmluZVRyYW5zZm9ybTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5BZmZpbmVUcmFuc2Zvcm1PcDsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworCisvKioKKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlSU9UYXNrCisgKi8KK3B1YmxpYyBjbGFzcyBTY2FsZSBleHRlbmRzIFRyYW5zZm9ybU9wZXJhdGlvbiBpbXBsZW1lbnRzIERyYXdPcGVyYXRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIVU5EUkVEID0gMTAwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgd2lkdGhTdHIgPSAiMTAwJSI7CisgICAgcHJpdmF0ZSBTdHJpbmcgaGVpZ2h0U3RyID0gIjEwMCUiOworICAgIHByaXZhdGUgYm9vbGVhbiB4UGVyY2VudCA9IHRydWU7CisgICAgcHJpdmF0ZSBib29sZWFuIHlQZXJjZW50ID0gdHJ1ZTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wb3J0aW9ucyA9ICJpZ25vcmUiOworCisgICAgLyoqIEVudW1lcmF0ZWQgY2xhc3MgZm9yIHByb3BvcnRpb25zIGF0dHJpYnV0ZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BvcnRpb25zQXR0cmlidXRlIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CisgICAgICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiaWdub3JlIiwgIndpZHRoIiwgImhlaWdodCIsICJjb3ZlciIsICJmaXQiIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAgU2V0cyB0aGUgYmVoYXZpb3VyIHJlZ2FyZGluZyB0aGUgaW1hZ2UgcHJvcG9ydGlvbnMuCisgICAgICogQHBhcmFtIHBhIHRoZSBlbnVtZXJhdGVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByb3BvcnRpb25zKFByb3BvcnRpb25zQXR0cmlidXRlIHBhKSB7CisgICAgICAgIHByb3BvcnRpb25zID0gcGEuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UsIGVpdGhlciBhcyBhbiBpbnRlZ2VyIG9yIGEgJS4KKyAgICAgKiBEZWZhdWx0cyB0byAxMDAlLgorICAgICAqIEBwYXJhbSB3aWR0aCB0aGUgdmFsdWUgdG8gdXNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFdpZHRoKFN0cmluZyB3aWR0aCkgeworICAgICAgICB3aWR0aFN0ciA9IHdpZHRoOworICAgIH0KKworICAgIC8qKgorICAgICAqICBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLCBlaXRoZXIgYXMgYW4gaW50ZWdlciBvciBhICUuICBEZWZhdWx0cyB0byAxMDAlLgorICAgICAqIEBwYXJhbSBoZWlnaHQgdGhlIHZhbHVlIHRvIHVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoU3RyaW5nIGhlaWdodCkgeworICAgICAgICBoZWlnaHRTdHIgPSBoZWlnaHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB3aWR0aC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb252ZXJ0ZWQgZnJvbSB0aGUgd2lkdGggc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBmbG9hdCBnZXRXaWR0aCgpIHsKKyAgICAgICAgaW50IHBlcmNJbmRleCA9IHdpZHRoU3RyLmluZGV4T2YoJyUnKTsKKyAgICAgICAgaWYgKHBlcmNJbmRleCA+IDApIHsKKyAgICAgICAgICAgIHhQZXJjZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZsb2F0IHdpZHRoID0gRmxvYXQucGFyc2VGbG9hdCh3aWR0aFN0ci5zdWJzdHJpbmcoMCwgcGVyY0luZGV4KSk7CisgICAgICAgICAgICByZXR1cm4gd2lkdGggLyBIVU5EUkVEOworICAgICAgICB9CisgICAgICAgIHhQZXJjZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KHdpZHRoU3RyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhlaWdodC4KKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBjb252ZXJ0ZWQgZnJvbSB0aGUgaGVpZ2h0IHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmxvYXQgZ2V0SGVpZ2h0KCkgeworICAgICAgICBpbnQgcGVyY0luZGV4ID0gaGVpZ2h0U3RyLmluZGV4T2YoJyUnKTsKKyAgICAgICAgaWYgKHBlcmNJbmRleCA+IDApIHsKKyAgICAgICAgICAgIHlQZXJjZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KGhlaWdodFN0ci5zdWJzdHJpbmcoMCwgcGVyY0luZGV4KSkgLyBIVU5EUkVEOworICAgICAgICB9CisgICAgICAgIHlQZXJjZW50ID0gZmFsc2U7CisgICAgICAgIHJldHVybiBGbG9hdC5wYXJzZUZsb2F0KGhlaWdodFN0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2NhbGUgYW4gaW1hZ2UuCisgICAgICogQHBhcmFtIGltYWdlIHRoZSBpbWFnZSB0byBzY2FsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzY2FsZWQgaW1hZ2UuCisgICAgICovCisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgcGVyZm9ybVNjYWxlKEJ1ZmZlcmVkSW1hZ2UgaW1hZ2UpIHsKKyAgICAgICAgZmxvYXQgeEZsID0gZ2V0V2lkdGgoKTsKKyAgICAgICAgZmxvYXQgeUZsID0gZ2V0SGVpZ2h0KCk7CisKKyAgICAgICAgaWYgKCF4UGVyY2VudCkgeworICAgICAgICAgICAgeEZsIC89IGltYWdlLmdldFdpZHRoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF5UGVyY2VudCkgeworICAgICAgICAgICAgeUZsIC89IGltYWdlLmdldEhlaWdodCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJ3aWR0aCIuZXF1YWxzKHByb3BvcnRpb25zKSkgeworICAgICAgICAgICAgeUZsID0geEZsOworICAgICAgICB9IGVsc2UgaWYgKCJoZWlnaHQiLmVxdWFscyhwcm9wb3J0aW9ucykpIHsKKyAgICAgICAgICAgIHhGbCA9IHlGbDsKKyAgICAgICAgfSBlbHNlIGlmICgiZml0Ii5lcXVhbHMocHJvcG9ydGlvbnMpKSB7CisgICAgICAgICAgICB5RmwgPSBNYXRoLm1pbih4RmwsIHlGbCk7CisgICAgICAgICAgICB4RmwgPSB5Rmw7CisgICAgICAgIH0gZWxzZSBpZiAoImNvdmVyIi5lcXVhbHMocHJvcG9ydGlvbnMpKSB7CisgICAgICAgICAgICB5RmwgPSBNYXRoLm1heCh4RmwsIHlGbCk7CisgICAgICAgICAgICB4RmwgPSB5Rmw7CisgICAgICAgIH0KKworICAgICAgICBsb2coIlx0U2NhbGluZyB0byAiICsgKHhGbCAqIEhVTkRSRUQpICsgIiUgeCAiCisgICAgICAgICAgICArICh5RmwgKiBIVU5EUkVEKSArICIlIik7CisKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIHR4ID0gQWZmaW5lVHJhbnNmb3JtLmdldFNjYWxlSW5zdGFuY2UoeEZsLCB5RmwpOworICAgICAgICBCdWZmZXJlZEltYWdlIHNjYWxlSW1hZ2UgPSBuZXcgQnVmZmVyZWRJbWFnZSgoaW50KSAoeEZsICogaW1hZ2UuZ2V0V2lkdGgoKSksCisgICAgICAgICAgICAgICAgKGludCkgKHlGbCAqIGltYWdlLmdldEhlaWdodCgpKSwgaW1hZ2UuZ2V0VHlwZSgpKTsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtT3Agc2NhbGVPcCA9IG5ldyBBZmZpbmVUcmFuc2Zvcm1PcCh0eCwgQWZmaW5lVHJhbnNmb3JtT3AuVFlQRV9CSUxJTkVBUik7CisgICAgICAgIHNjYWxlT3AuZmlsdGVyKGltYWdlLCBzY2FsZUltYWdlKTsKKyAgICAgICAgcmV0dXJuIHNjYWxlSW1hZ2U7CisgICAgfQorCisgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1ZmZlcmVkSW1hZ2UgZXhlY3V0ZVRyYW5zZm9ybU9wZXJhdGlvbihCdWZmZXJlZEltYWdlIGltYWdlKSB7CisgICAgICAgIGZvciAoSW1hZ2VPcGVyYXRpb24gaW5zdHIgOiBpbnN0cnVjdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIERyYXdPcGVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGVyZm9ybVNjYWxlKGltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnN0ciBpbnN0YW5jZW9mIFRyYW5zZm9ybU9wZXJhdGlvbikgeworICAgICAgICAgICAgICAgIGltYWdlID0gKChUcmFuc2Zvcm1PcGVyYXRpb24pIGluc3RyKS5leGVjdXRlVHJhbnNmb3JtT3BlcmF0aW9uKGltYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGVyZm9ybVNjYWxlKGltYWdlKTsKKyAgICB9CisKKworICAgIC8qKiB7QGluaGVyaXREb2N9LiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBmb3IgKEltYWdlT3BlcmF0aW9uIGluc3RyIDogaW5zdHJ1Y3Rpb25zKSB7CisgICAgICAgICAgICBpZiAoaW5zdHIgaW5zdGFuY2VvZiBEcmF3T3BlcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRJbWFnZSBpbWFnZSA9IG51bGw7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBUcmFuc2Zvcm1PcGVyYXRpb24gaGFzIERyYXdPcGVyYXRpb24gY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAvLyB0aGVuIFJvdGF0ZSB0aGUgZmlyc3QgY2hpbGQgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2NhbGUoaW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1RleHQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vVGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTJmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9pbWFnZWlvL1RleHQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IGphdmEuYXd0LkZvbnQ7CitpbXBvcnQgamF2YS5hd3QuRm9udE1ldHJpY3M7CitpbXBvcnQgamF2YS5hd3QuR3JhcGhpY3MyRDsKK2ltcG9ydCBqYXZhLmF3dC5SZW5kZXJpbmdIaW50czsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworCisvKioKKyAqCisgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLkltYWdlSU9UYXNrCisgKi8KK3B1YmxpYyBjbGFzcyBUZXh0IGV4dGVuZHMgSW1hZ2VPcGVyYXRpb24gaW1wbGVtZW50cyBEcmF3T3BlcmF0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT0lOVCA9IDEwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nID0gIiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZm9udCA9ICJBcmlhbCI7CisgICAgcHJpdmF0ZSBpbnQgcG9pbnQgPSBERUZBVUxUX1BPSU5UOworICAgIHByaXZhdGUgYm9vbGVhbiBib2xkID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGl0YWxpYyA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGNvbG9yID0gImJsYWNrIjsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGV4dC4KKyAgICAgKiBAcGFyYW0gc3RyIHRoZSBzdHJpbmcgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cikgeworICAgICAgICBzdHJpbmcgPSBzdHI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmb250IHRvIGJlIHVzZWQgdG8gZHJhdyB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0gZiB0aGUgZm9udCB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvbnQoU3RyaW5nIGYpIHsKKyAgICAgICAgZm9udCA9IGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBudW1iZXIgb2YgcG9pbnRzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHAgYW4gaW50ZWdlciB2YWx1ZSBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQb2ludChTdHJpbmcgcCkgeworICAgICAgICBwb2ludCA9IEludGVnZXIucGFyc2VJbnQocCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb2xvciBvZiB0aGUgdGV4dC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgY29sb3IgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgYykgeworICAgICAgICBjb2xvciA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRvZG8gaXMgdGhpcyB1c2VkPworICAgICAqIEBwYXJhbSBzdGF0ZSBub3QgdXNlZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEJvbGQoYm9vbGVhbiBzdGF0ZSkgeworICAgICAgICBib2xkID0gc3RhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRvZG8gaXMgdGhpcyB1c2VkPworICAgICAqIEBwYXJhbSBzdGF0ZSBub3QgdXNlZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEl0YWxpYyhib29sZWFuIHN0YXRlKSB7CisgICAgICAgIGl0YWxpYyA9IHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERyYXcgdGhlIHRleHQuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0YW50IGltYWdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJlZEltYWdlIGV4ZWN1dGVEcmF3T3BlcmF0aW9uKCkgeworICAgICAgICBsb2coIlx0Q3JlYXRpbmcgVGV4dCBcIiIgKyBzdHJpbmcgKyAiXCIiKTsKKworICAgICAgICBpbnQgd2lkdGggPSAxOworICAgICAgICBpbnQgaGVpZ2h0ID0gMTsKKworICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgQnVmZmVyZWRJbWFnZS5UWVBFXzRCWVRFX0FCR1JfUFJFKTsKKyAgICAgICAgR3JhcGhpY3MyRCBncmFwaGljcyA9IGJpLmNyZWF0ZUdyYXBoaWNzKCk7CisgICAgICAgIGdyYXBoaWNzLnNldFJlbmRlcmluZ0hpbnQoCisgICAgICAgICAgICBSZW5kZXJpbmdIaW50cy5LRVlfQU5USUFMSUFTSU5HLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9BTlRJQUxJQVNfT04pOworICAgICAgICBncmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KAorICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuS0VZX0ZSQUNUSU9OQUxNRVRSSUNTLCBSZW5kZXJpbmdIaW50cy5WQUxVRV9GUkFDVElPTkFMTUVUUklDU19PTik7CisgICAgICAgIEZvbnQgZiA9IGNyZWF0ZUZvbnQoKTsKKyAgICAgICAgRm9udE1ldHJpY3MgZm1ldHJpY3MgPSBncmFwaGljcy5nZXRGb250TWV0cmljcyhmKTsKKyAgICAgICAgaGVpZ2h0ID0gZm1ldHJpY3MuZ2V0TWF4QXNjZW50KCkgKyBmbWV0cmljcy5nZXRNYXhEZXNjZW50KCk7CisgICAgICAgIHdpZHRoID0gZm1ldHJpY3Muc3RyaW5nV2lkdGgoc3RyaW5nKTsKKworICAgICAgICBiaSA9IG5ldyBCdWZmZXJlZEltYWdlKHdpZHRoLCBoZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV80QllURV9BQkdSX1BSRSk7CisgICAgICAgIGdyYXBoaWNzID0gYmkuY3JlYXRlR3JhcGhpY3MoKTsKKworICAgICAgICBncmFwaGljcy5zZXRSZW5kZXJpbmdIaW50KAorICAgICAgICAgICAgUmVuZGVyaW5nSGludHMuS0VZX0FOVElBTElBU0lORywgUmVuZGVyaW5nSGludHMuVkFMVUVfQU5USUFMSUFTX09OKTsKKyAgICAgICAgZ3JhcGhpY3Muc2V0UmVuZGVyaW5nSGludCgKKyAgICAgICAgICAgIFJlbmRlcmluZ0hpbnRzLktFWV9GUkFDVElPTkFMTUVUUklDUywgUmVuZGVyaW5nSGludHMuVkFMVUVfRlJBQ1RJT05BTE1FVFJJQ1NfT04pOworCisgICAgICAgIGdyYXBoaWNzLnNldEZvbnQoZik7CisgICAgICAgIGdyYXBoaWNzLnNldENvbG9yKENvbG9yTWFwcGVyLmdldENvbG9yQnlOYW1lKGNvbG9yKSk7CisgICAgICAgIGdyYXBoaWNzLmRyYXdTdHJpbmcoc3RyaW5nLCAwLCBoZWlnaHQgLSBmbWV0cmljcy5nZXRNYXhEZXNjZW50KCkpOworICAgICAgICByZXR1cm4gYmk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGb250IGNyZWF0ZUZvbnQoKSB7CisgICAgICAgIGludCBzdHlsZSA9IEZvbnQuUExBSU47CisgICAgICAgIGlmIChib2xkKSB7CisgICAgICAgICAgICBzdHlsZSB8PSBGb250LkJPTEQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0YWxpYykgeworICAgICAgICAgICAgc3R5bGUgfD0gRm9udC5JVEFMSUM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBGb250KGZvbnQsIHN0eWxlLCBwb2ludCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvaW1hZ2Vpby9UcmFuc2Zvcm1PcGVyYXRpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vVHJhbnNmb3JtT3BlcmF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2MWIwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2ltYWdlaW8vVHJhbnNmb3JtT3BlcmF0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2VpbzsKKworaW1wb3J0IGphdmEuYXd0LmltYWdlLkJ1ZmZlcmVkSW1hZ2U7CisKKy8qKgorICoKKyAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UuSW1hZ2VJT1Rhc2sKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zZm9ybU9wZXJhdGlvbiBleHRlbmRzIEltYWdlT3BlcmF0aW9uIHsKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyB0aGUgdHJhbnNmb3JtYXRpb25zLgorICAgICAqIEBwYXJhbSBpbWcgVGhlIGltYWdlIHRvIHBlcmZvcm0gdGhlIHRyYW5zZm9ybWF0aW9uIG9uLgorICAgICAqIEByZXR1cm4gdGhlIHRyYW5zZm9ybWVkIGltYWdlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCdWZmZXJlZEltYWdlIGV4ZWN1dGVUcmFuc2Zvcm1PcGVyYXRpb24oQnVmZmVyZWRJbWFnZSBpbWcpOworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwveHovWHpSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwveHovWHpSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MDkzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC94ei9YelJlc291cmNlLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwueHo7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkNvbXByZXNzZWRSZXNvdXJjZTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5MWk1BMk9wdGlvbnM7CitpbXBvcnQgb3JnLnR1a2FhbmkueHouWFpJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcudHVrYWFuaS54ei5YWk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBIFhaIGNvbXByZXNzZWQgcmVzb3VyY2UuCisgKgorICogPHA+V3JhcHMgYXJvdW5kIGFub3RoZXIgcmVzb3VyY2UsIGRlbGVnYXRlcyBhbGwgcXVlcmllcyB0byB0aGF0CisgKiBvdGhlciByZXNvdXJjZSBidXQgdW5jb21wcmVzc2VzL2NvbXByZXNzZXMgc3RyZWFtcyBvbiB0aGUgZmx5LjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuMTAuMQorICovCitwdWJsaWMgY2xhc3MgWHpSZXNvdXJjZSBleHRlbmRzIENvbXByZXNzZWRSZXNvdXJjZSB7CisKKyAgICAvKiogQSBuby1hcmcgY29uc3RydWN0b3IgKi8KKyAgICBwdWJsaWMgWHpSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB3aXRoIGFub3RoZXIgcmVzb3VyY2UgdG8gd3JhcC4KKyAgICAgKiBAcGFyYW0gb3RoZXIgdGhlIHJlc291cmNlIHRvIHdyYXAuCisgICAgICovCisgICAgcHVibGljIFh6UmVzb3VyY2UoUmVzb3VyY2VDb2xsZWN0aW9uIG90aGVyKSB7CisgICAgICAgIHN1cGVyKG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvbXByZXNzIG9uIHRoZSBmbHkgdXNpbmcgamF2YS51dGlsLnppcC5YWklucHV0U3RyZWFtLgorICAgICAqIEBwYXJhbSBpbiB0aGUgc3RyZWFtIHRvIHdyYXAuCisgICAgICogQHJldHVybiB0aGUgd3JhcHBlZCBzdHJlYW0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIElucHV0U3RyZWFtIHdyYXBTdHJlYW0oSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgWFpJbnB1dFN0cmVhbShpbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHJlc3Mgb24gdGhlIGZseSB1c2luZyBqYXZhLnV0aWwuemlwLlhaT3V0U3RyZWFtLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIHN0cmVhbSB0byB3cmFwLgorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorICAgICAqLworICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIHdyYXBTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYWk91dHB1dFN0cmVhbShvdXQsIG5ldyBMWk1BMk9wdGlvbnMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBjb21wcmVzc2lvbiBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nICJYWiIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wcmVzc2lvbk5hbWUoKSB7CisgICAgICAgIHJldHVybiAiWFoiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyL0FwYWNoZUNhdGFsb2cuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyL0FwYWNoZUNhdGFsb2cuamF2YQppbmRleCA2NmVkN2ZmLi5kZTNjOTU2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTQsNiArNTQsNyBAQAogICAgICAqICB3aWxsIGJlIGEgdG90YWwgb2YgdHdvIEFwYWNoZUNhdGFsb2cgaW5zdGFuY2VzLCBhbmQgc28gb24uPC9wPgogICAgICAqIEByZXR1cm4gdGhlIGNhdGFsb2cuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENhdGFsb2cgbmV3Q2F0YWxvZygpIHsKICAgICAgICAgZmluYWwgQXBhY2hlQ2F0YWxvZyBjYXQgPSAoQXBhY2hlQ2F0YWxvZykgc3VwZXIubmV3Q2F0YWxvZygpOwogICAgICAgICBjYXQuc2V0UmVzb2x2ZXIocmVzb2x2ZXIpOwpAQCAtODUsNiArODYsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGVudHJ5IFRoZSBDYXRhbG9nRW50cnkgdG8gcHJvY2Vzcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRFbnRyeShmaW5hbCBDYXRhbG9nRW50cnkgZW50cnkpIHsKIAogICAgICAgICBmaW5hbCBpbnQgdHlwZSA9IGVudHJ5LmdldEVudHJ5VHlwZSgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nUmVzb2x2ZXIuamF2YQppbmRleCBmMDM2MjQ3Li5lZWQ4YWE1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nUmVzb2x2ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9BcGFjaGVDYXRhbG9nUmVzb2x2ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTQxLDkgKzQwLDkgQEAKICAqIDxwPlRoZSB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXIuQXBhY2hlQ2F0YWxvZwogICogQXBhY2hlQ2F0YWxvZ30gY2xhc3MgaXMgdXNlZCB0byBwYXJzZSBleHRlcm5hbCBjYXRhbG9nIGZpbGVzLCB3aGljaAogICogY2FuIGJlIGluIGVpdGhlciA8YQotICogaHJlZj0iaHR0cDovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L2JhY2tncm91bmQvOTQwMS5odG1sIj4KKyAqIGhyZWY9Imh0dHBzOi8vb2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvYmFja2dyb3VuZC85NDAxLmh0bWwiPgogICogcGxhaW4gdGV4dCBmb3JtYXQ8L2E+IG9yIDxhCi0gKiBocmVmPSJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KKyAqIGhyZWY9Imh0dHBzOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KICAqIFhNTCBmb3JtYXQ8L2E+LjwvcD4KICAqCiAgKiA8cD5Gb3IgZWFjaCBlbnRyeSBmb3VuZCBpbiBhbiBleHRlcm5hbCBjYXRhbG9nIGZpbGUsIGlmIGFueSwgYW4KQEAgLTEwNCw3ICsxMDMsNyBAQAogCiAgICAgICAgIGZpbmFsIENhdGFsb2cgY2F0YWxvZyA9IGdldENhdGFsb2coKTsKICAgICAgICAgaWYgKCEoY2F0YWxvZyBpbnN0YW5jZW9mIEFwYWNoZUNhdGFsb2cpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIldyb25nIGNhdGFsb2cgdHlwZSBmb3VuZDogIiArIGNhdGFsb2cuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJXcm9uZyBjYXRhbG9nIHR5cGUgZm91bmQ6ICVzIiwgY2F0YWxvZy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgQXBhY2hlQ2F0YWxvZyBhcGFjaGVDYXRhbG9nID0gKEFwYWNoZUNhdGFsb2cpIGNhdGFsb2c7CiAKQEAgLTExMyw5ICsxMTIsNyBAQAogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhcGFjaGVDYXRhbG9nLnBhcnNlQ2F0YWxvZyhmaWxlKTsKLSAgICAgICAgfSBjYXRjaCAoZmluYWwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXgpOwotICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyL3BhY2thZ2UuaHRtbCBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc29sdmVyL3BhY2thZ2UuaHRtbAppbmRleCAxMWIzYzc3Li45ODMwNDRlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvbHZlci9wYWNrYWdlLmh0bWwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb2x2ZXIvcGFja2FnZS5odG1sCkBAIC0xLDMgKzEsNCBAQAorPCFET0NUWVBFIGh0bWw+CiA8IS0tCiAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aApAQCAtNiw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsMjIgKzE1LDI3IEBACiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgorPGh0bWwgbGFuZz0iZW4iPgorPGhlYWQ+CisgIDx0aXRsZT5JbnRlZ3JhdGlvbiB3aXRoIHhtbC1jb21tb25zIHJlc29sdmVyPC90aXRsZT4KKzwvaGVhZD4KIDxib2R5PgogQW50IGludGVncmF0aW9uIHdpdGggeG1sLWNvbW1vbnMgcmVzb2x2ZXIuCiAKIDxwPlRoZXNlIGNsYXNzZXMgZW5oYW5jZSB0aGUgPGNvZGU+Jmx0O3htbGNhdGFsb2cmZ3Q7PC9jb2RlPiBkYXRhdHlwZQogdG8gc3VwcG9ydCBleHRlcm5hbCBjYXRhbG9nIGZpbGVzIHVzaW5nIHRoZSB4bWwtY29tbW9ucyByZXNvbHZlciwgaW4KIGFjY29yZGFuY2Ugd2l0aCB0aGUKLTxhIGhyZWY9Imh0dHA6Ly9vYXNpcy1vcGVuLm9yZy9jb21taXR0ZWVzL2VudGl0eS9zcGVjLTIwMDEtMDgtMDYuaHRtbCI+Cis8YSBocmVmPSJodHRwczovL29hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZW50aXR5L3NwZWMtMjAwMS0wOC0wNi5odG1sIj4KIE9BU0lTICJPcGVuIENhdGFsb2ciIHN0YW5kYXJkPC9hPi4gIFRoZXkgd2lsbCBiZSB1c2VkIGlmIGFuZCBvbmx5IGlmCiB0aGUgeG1sLWNvbW1vbnMgcmVzb2x2ZXIgbGlicmFyeSBpcyBhdmFpbGFibGUgb24gdGhlIGNsYXNzcGF0aC48L3A+CiAKLUBzZWUgPEEgSFJFRj0iaHR0cDovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMiPkFwYWNoZSB4bWwtY29tbW9ucyBQcm9qZWN0PC9BPgorQHNlZSA8YSBocmVmPSJodHRwczovL3htbC5hcGFjaGUub3JnL2NvbW1vbnMiPkFwYWNoZSB4bWwtY29tbW9ucyBQcm9qZWN0PC9hPgogCiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2cKIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXIuQXBhY2hlQ2F0YWxvZ1Jlc29sdmVyCiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc29sdmVyLkFwYWNoZUNhdGFsb2cKIAotQGF1dGhvciA8QSBIUkVGPSJtYWlsdG86Y3N0cm9uZ0BhcmllbHBhcnRuZXJzLmNvbSI+Q3JhZWcgU3Ryb25nPC9BPgorQGF1dGhvciA8YSBocmVmPSJtYWlsdG86Y3N0cm9uZ0BhcmllbHBhcnRuZXJzLmNvbSI+Q3JhZWcgU3Ryb25nPC9hPgogCiA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Fic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UuamF2YQppbmRleCA1ODA1YzdjLi5hZDg5OTkzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BYnN0cmFjdENsYXNzcGF0aFJlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIFBhdGggZ2V0Q2xhc3NwYXRoKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRDbGFzc3BhdGgoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRDbGFzc3BhdGgoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiBjbGFzc3BhdGg7CkBAIC05Niw3ICs5Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIFJlZmVyZW5jZSBnZXRMb2FkZXIoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdENsYXNzcGF0aFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldExvYWRlcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldExvYWRlcigpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIGxvYWRlcjsKQEAgLTE1MSwxNyArMTUxLDEzIEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNFeGlzdHMoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pc0V4aXN0cygpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaXMgPSBnZXRJbnB1dFN0cmVhbSgpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gZ2V0SW5wdXRTdHJlYW0oKSkgewogICAgICAgICAgICAgcmV0dXJuIGlzICE9IG51bGw7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaXMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzMsNyArMTY5LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKIApAQCAtMTgxLDE4ICsxNzcsMjEgQEAKICAgICAgICAgcmV0dXJuICFjbGFzc0xvYWRlci5uZWVkc0NsZWFudXAoKQogICAgICAgICAgICAgPyBvcGVuSW5wdXRTdHJlYW0oY2xhc3NMb2FkZXIuZ2V0TG9hZGVyKCkpCiAgICAgICAgICAgICA6IG5ldyBGaWx0ZXJJbnB1dFN0cmVhbShvcGVuSW5wdXRTdHJlYW0oY2xhc3NMb2FkZXIuZ2V0TG9hZGVyKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5jbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMDQsMTAgKzIwMywxMCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBDbGFzc0xvYWRlcldpdGhGbGFnIGdldENsYXNzTG9hZGVyKCkgewogICAgICAgICBDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gY2xOZWVkc0NsZWFudXAgPSBmYWxzZTsKICAgICAgICAgaWYgKGxvYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBjbCA9IChDbGFzc0xvYWRlcikgbG9hZGVyLmdldFJlZmVyZW5jZWRPYmplY3QoKTsKKyAgICAgICAgICAgIGNsID0gbG9hZGVyLmdldFJlZmVyZW5jZWRPYmplY3QoKTsKICAgICAgICAgfQorICAgICAgICBib29sZWFuIGNsTmVlZHNDbGVhbnVwID0gZmFsc2U7CiAgICAgICAgIGlmIChjbCA9PSBudWxsKSB7CiAgICAgICAgICAgICBpZiAoZ2V0Q2xhc3NwYXRoKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFBhdGggcCA9IGdldENsYXNzcGF0aCgpLmNvbmNhdFN5c3RlbUNsYXNzcGF0aCgiaWdub3JlIik7CkBAIC0yNTMsNiArMjUyLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDbGFzc3BhdGhSZXNvdXJjZSBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEFic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NMb2FkZXJXaXRoRmxhZyB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2xlYW51cDsKQEAgLTI2MSw4ICsyNjUsMTUgQEAKICAgICAgICAgICAgIGxvYWRlciA9IGw7CiAgICAgICAgICAgICBjbGVhbnVwID0gbmVlZHNDbGVhbnVwICYmIGwgaW5zdGFuY2VvZiBBbnRDbGFzc0xvYWRlcjsKICAgICAgICAgfQotICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgeyByZXR1cm4gbG9hZGVyOyB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG5lZWRzQ2xlYW51cCgpIHsgcmV0dXJuIGNsZWFudXA7IH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGxvYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG5lZWRzQ2xlYW51cCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGVhbnVwOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKICAgICAgICAgICAgIGlmIChjbGVhbnVwKSB7CiAgICAgICAgICAgICAgICAgKChBbnRDbGFzc0xvYWRlcikgbG9hZGVyKS5jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWJzdHJhY3RSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWJzdHJhY3RSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyLmphdmEKaW5kZXggNWU0YzNhMy4uYmYzYzdjMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Fic3RyYWN0UmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BYnN0cmFjdFJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtODUsOSArODYsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdFJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIpIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIG5ldyBGYWlsRmFzdCh0aGlzLCBjcmVhdGVJdGVyYXRvcigpKTsKQEAgLTEwNyw5ICsxMDksMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdFJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIpIGdldENoZWNrZWRSZWYoKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiBnZXRTaXplKCk7CkBAIC0xMjksNyArMTMyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRmlsZXN5c3RlbU9ubHkoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAKQEAgLTE4MiwyNCArMTg1LDIzIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRm9ybWF0IHRoaXMgQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgYXMgYSBTdHJpbmcuCisgICAgICogRm9ybWF0IHRoaXMgQWJzdHJhY3RSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyIGFzIGEgU3RyaW5nLgogICAgICAqIEByZXR1cm4gYSBkZXNjcmlwdGl2ZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGdldFNpemUoKSA9PSAwKSB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gc3RyZWFtKCkubWFwKE9iamVjdDo6dG9TdHJpbmcpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoRmlsZS5wYXRoU2VwYXJhdG9yKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBYnN0cmFjdFJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihBYnN0cmFjdFJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgQnVpbGRFeGNlcHRpb24gb25lTmVzdGVkKCkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FsbEJ1dEZpcnN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWxsQnV0Rmlyc3QuamF2YQppbmRleCBmZmE2NjVmLi5mMzA4ZGE4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWxsQnV0Rmlyc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWxsQnV0Rmlyc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEwICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiAKQEAgLTM2LDI1ICszNCwxNSBAQAogICAgICAqIFRha2UgYWxsIGVsZW1lbnRzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IDxjb2RlPmNvdW50PC9jb2RlPiBlbGVtZW50cy4KICAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENvbGxlY3Rpb24oKSB7Ci0gICAgICAgIGludCBjdCA9IGdldFZhbGlkQ291bnQoKTsKLSAgICAgICAgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXIgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpOwotICAgICAgICBMaXN0PFJlc291cmNlPiBhbCA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3QgJiYgaXRlci5oYXNOZXh0KCk7IGkrKykgewotICAgICAgICAgICAgLy8gZGlzY2FyZAotICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBhbC5hZGQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbDsKKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlQ29sbGVjdGlvbigpLnN0cmVhbSgpLnNraXAoZ2V0VmFsaWRDb3VudCgpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IHN6ID0gZ2V0UmVzb3VyY2VDb2xsZWN0aW9uKCkuc2l6ZSgpOwotICAgICAgICBpbnQgY3QgPSBnZXRWYWxpZENvdW50KCk7Ci0gICAgICAgIHJldHVybiBzeiA+IGN0ID8gc3ogLSBjdCA6IDA7CisgICAgICAgIHJldHVybiBNYXRoLm1heChnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5zaXplKCkgLSBnZXRWYWxpZENvdW50KCksIDApOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FsbEJ1dExhc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BbGxCdXRMYXN0LmphdmEKaW5kZXggYTFlNmE5OC4uNDNjMzdlNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FsbEJ1dExhc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQWxsQnV0TGFzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTAgKzE4LDExIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CiAKIC8qKgogICogUmVzb3VyY2VDb2xsZWN0aW9uIHRoYXQgY29udGFpbnMgYWxsIHJlc291cmNlcyBvZiBhbm90aGVyCkBAIC0zNSwxOSArMzYsMjAgQEAKICAgICAgKiBUYWtlIGFsbCBlbGVtZW50cyBleGNlcHQgZm9yIHRoZSBsYXN0IDxjb2RlPmNvdW50PC9jb2RlPiBlbGVtZW50cy4KICAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENvbGxlY3Rpb24oKSB7CiAgICAgICAgIGludCBjdCA9IGdldFZhbGlkQ291bnQoKTsKLSAgICAgICAgTGlzdDxSZXNvdXJjZT4gcmVzdWx0ID0KLSAgICAgICAgICAgIChMaXN0PFJlc291cmNlPikgQ29sbGVjdGlvblV0aWxzLmFzQ29sbGVjdGlvbihnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pdGVyYXRvcigpKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWJMaXN0KDAsIHJlc3VsdC5zaXplKCkgLSBjdCk7CisgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiBuZXN0ZWQgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgaWYgKGN0ID4gbmVzdGVkLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXN0ZWQuc3RyZWFtKCkubGltaXQoKGxvbmcpIG5lc3RlZC5zaXplKCkgLSBjdCkKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7Ci0gICAgICAgIGludCBzeiA9IGdldFJlc291cmNlQ29sbGVjdGlvbigpLnNpemUoKTsKLSAgICAgICAgaW50IGN0ID0gZ2V0VmFsaWRDb3VudCgpOwotICAgICAgICByZXR1cm4gc3ogPiBjdCA/IHN6IC0gY3QgOiAwOworICAgICAgICByZXR1cm4gTWF0aC5tYXgoZ2V0UmVzb3VyY2VDb2xsZWN0aW9uKCkuc2l6ZSgpIC0gZ2V0VmFsaWRDb3VudCgpLCAwKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcHBlbmRhYmxlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQXBwZW5kYWJsZS5qYXZhCmluZGV4IDE0ZjQ3MTEuLmU3NzYyNWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcHBlbmRhYmxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FwcGVuZGFibGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlUmVzb3VyY2UuamF2YQppbmRleCAyZDg3YWE2Li44MTVhMjQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQXJjaGl2ZVJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0FyY2hpdmVSZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTAzLDEyICsxMDMsMTIgQEAKICAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKFJlc291cmNlQ29sbGVjdGlvbiBhKSB7CiAgICAgICAgIGNoZWNrQ2hpbGRyZW5BbGxvd2VkKCk7CiAgICAgICAgIGlmIChhcmNoaXZlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJjaGl2ZSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ5b3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGFyY2hpdmUiKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYS5zaXplKCkgIT0gMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXJlIHN1cHBvcnRlZCBhcyBhcmNoaXZlcyIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJvbmx5IHNpbmdsZSBhcmd1bWVudCByZXNvdXJjZSBjb2xsZWN0aW9ucyBhcmUgc3VwcG9ydGVkIGFzIGFyY2hpdmVzIik7CiAgICAgICAgIH0KICAgICAgICAgYXJjaGl2ZSA9IGEuaXRlcmF0b3IoKS5uZXh0KCk7CiAgICAgfQpAQCAtMTE4LDE3ICsxMTgsMTcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBhcmNoaXZlIGFzIGEgUmVzb3VyY2UuCiAgICAgICovCiAgICAgcHVibGljIFJlc291cmNlIGdldEFyY2hpdmUoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpCi0gICAgICAgICAgICA/ICgoQXJjaGl2ZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldEFyY2hpdmUoKSA6IGFyY2hpdmU7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuZ2V0QXJjaGl2ZSgpIDogYXJjaGl2ZTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBHZXQgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGlzIFJlc291cmNlLgogICAgICAqIEByZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIGRhdGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TGFzdE1vZGlmaWVkKCk7CkBAIC0xMzgsOSArMTM4LDEwIEBACiAgICAgICogR2V0IHRoZSBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCiAgICAgICogQHJldHVybiB0aGUgbG9uZyBzaXplIG9mIHRoaXMgUmVzb3VyY2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRTaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U2l6ZSgpOwpAQCAtMTUwLDkgKzE1MSwxMCBAQAogICAgICAqIExlYXJuIHdoZXRoZXIgdGhpcyBSZXNvdXJjZSByZXByZXNlbnRzIGEgZGlyZWN0b3J5LgogICAgICAqIEByZXR1cm4gYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZW50cnkgaXMgYSBkaXJlY3RvcnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0RpcmVjdG9yeSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRGlyZWN0b3J5KCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICByZXR1cm4gc3VwZXIuaXNEaXJlY3RvcnkoKTsKQEAgLTE2Miw5ICsxNjQsMTAgQEAKICAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgcmVwcmVzZW50cyBhbiBleGlzdGluZyBSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIGJvb2xlYW4gZXhpc3RlbmNlIGZsYWcuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0V4aXN0cygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRXhpc3RzKCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICByZXR1cm4gc3VwZXIuaXNFeGlzdHMoKTsKQEAgLTE3Niw3ICsxNzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0TW9kZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEFyY2hpdmVSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRNb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TW9kZSgpOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrRW50cnkoKTsKICAgICAgICAgcmV0dXJuIG1vZGU7CkBAIC0xODYsNiArMTg5LDcgQEAKICAgICAgKiBPdmVycmlkZXMgdGhlIHN1cGVyIHZlcnNpb24uCiAgICAgICogQHBhcmFtIHIgdGhlIFJlZmVyZW5jZSB0byBzZXQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKICAgICAgICAgaWYgKGFyY2hpdmUgIT0gbnVsbCB8fCBtb2RlU2V0KSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwpAQCAtMTk5LDYgKzIwMyw3IEBACiAgICAgICogQHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGlzIFJlc291cmNlCiAgICAgICogICAgICAgICBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBSZXNvdXJjZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhSZXNvdXJjZSBhbm90aGVyKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhhbm90aGVyKSA/IDAgOiBzdXBlci5jb21wYXJlVG8oYW5vdGhlcik7CiAgICAgfQpAQCAtMjA5LDE0ICsyMTQsMTUgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5vdGhlciBpcyBhIFJlc291cmNlIHJlcHJlc2VudGluZwogICAgICAqICAgICAgICAgICAgICB0aGUgc2FtZSBlbnRyeSBpbiB0aGUgc2FtZSBhcmNoaXZlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgYW5vdGhlcikgewogICAgICAgICBpZiAodGhpcyA9PSBhbm90aGVyKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMoYW5vdGhlcik7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZXF1YWxzKGFub3RoZXIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhbm90aGVyID09IG51bGwgfHwgYW5vdGhlci5nZXRDbGFzcygpICE9IGdldENsYXNzKCkpIHsKKyAgICAgICAgaWYgKGFub3RoZXIgPT0gbnVsbCB8fCAhYW5vdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIEFyY2hpdmVSZXNvdXJjZSByID0gKEFyY2hpdmVSZXNvdXJjZSkgYW5vdGhlcjsKQEAgLTIyOCw2ICsyMzQsNyBAQAogICAgICAqIEdldCB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIFJlc291cmNlLgogICAgICAqIEByZXR1cm4gaGFzaCBjb2RlIGFzIGludC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKQogICAgICAgICAgICAgKiAoZ2V0QXJjaGl2ZSgpID09IG51bGwgPyBOVUxMX0FSQ0hJVkUgOiBnZXRBcmNoaXZlKCkuaGFzaENvZGUoKSk7CkBAIC0yMzcsOCArMjQ0LDkgQEAKICAgICAgKiBGb3JtYXQgdGhpcyBSZXNvdXJjZSBhcyBhIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFJlc291cmNlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCkKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS50b1N0cmluZygpCiAgICAgICAgICAgICA6IGdldEFyY2hpdmUoKS50b1N0cmluZygpICsgJzonICsgZ2V0TmFtZSgpOwogICAgIH0KIApAQCAtMjYwLDEwICsyNjgsMTAgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiYXJjaGl2ZSBhdHRyaWJ1dGUgbm90IHNldCIpOwogICAgICAgICB9CiAgICAgICAgIGlmICghci5pc0V4aXN0cygpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oci50b1N0cmluZygpICsgIiBkb2VzIG5vdCBleGlzdC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiJXMgZG9lcyBub3QgZXhpc3QuIiwgcik7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHIuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKHIgKyAiIGRlbm90ZXMgYSBkaXJlY3RvcnkuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIiVzIGRlbm90ZXMgYSBkaXJlY3RvcnkuIiwgcik7CiAgICAgICAgIH0KICAgICAgICAgZmV0Y2hFbnRyeSgpOwogICAgICAgICBoYXZlRW50cnkgPSB0cnVlOwpAQCAtMjc3LDYgKzI4NSw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApIHsKICAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0yOTAsNCArMjk5LDkgQEAKICAgICAgICAgICAgIHNldENoZWNrZWQodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXJjaGl2ZVJlc291cmNlIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoQXJjaGl2ZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQXJjaGl2ZXMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlcy5qYXZhCmluZGV4IDI0YmZkMjguLjU2Y2YyODEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9BcmNoaXZlcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0zMSw3ICszMiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlRhckZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKIAogLyoqCiAgKiBBIHJlc291cmNlIGNvbGxlY3Rpb24gdGhhdCB0cmVhdHMgYWxsIG5lc3RlZCByZXNvdXJjZXMgYXMgYXJjaGl2ZXMKQEAgLTc4LDE2ICs3OCwxMyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBpbnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlcykgZ2V0Q2hlY2tlZFJlZigpKS5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuc2l6ZSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgaW50IHRvdGFsID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxBcmNoaXZlRmlsZVNldD4gaSA9IGdyYWJBcmNoaXZlcygpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIHRvdGFsICs9IGkubmV4dCgpLnNpemUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdG90YWw7CisgICAgICAgIHJldHVybiBzdHJlYW1BcmNoaXZlcygpLm1hcFRvSW50KEFyY2hpdmVGaWxlU2V0OjpzaXplKS5zdW0oKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk3LDE1ICs5NCwxMSBAQAogICAgICAqLwogICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlcykgZ2V0Q2hlY2tlZFJlZigpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBsID0gbmV3IExpbmtlZExpc3Q8UmVzb3VyY2U+KCk7Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8QXJjaGl2ZUZpbGVTZXQ+IGkgPSBncmFiQXJjaGl2ZXMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBsLmFkZEFsbChDb2xsZWN0aW9uVXRpbHMKLSAgICAgICAgICAgICAgICAgICAgIC5hc0NvbGxlY3Rpb24oaS5uZXh0KCkuaXRlcmF0b3IoKSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsLml0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiBzdHJlYW1BcmNoaXZlcygpLmZsYXRNYXAoUmVzb3VyY2VDb2xsZWN0aW9uOjpzdHJlYW0pCisgICAgICAgICAgICAubWFwKFJlc291cmNlLmNsYXNzOjpjYXN0KS5pdGVyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEzLDkgKzEwNiwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBcmNoaXZlcykgZ2V0Q2hlY2tlZFJlZigpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKKyAgICAgICAgLy8gVE9ETyBjaGVjayBlYWNoIGFyY2hpdmUgaW4gdHVybj8KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtMTI2LDggKzEyMCw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoZmluYWwgUmVmZXJlbmNlIHIpIHsKLSAgICAgICAgaWYgKHppcHMuZ2V0UmVzb3VyY2VDb2xsZWN0aW9ucygpLnNpemUoKSA+IDAKLSAgICAgICAgICAgIHx8IHRhcnMuZ2V0UmVzb3VyY2VDb2xsZWN0aW9ucygpLnNpemUoKSA+IDApIHsKKyAgICAgICAgaWYgKCF6aXBzLmdldFJlc291cmNlQ29sbGVjdGlvbnMoKS5pc0VtcHR5KCkgfHwgIXRhcnMuZ2V0UmVzb3VyY2VDb2xsZWN0aW9ucygpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQogICAgICAgICBzdXBlci5zZXRSZWZpZChyKTsKQEAgLTE2MCwxNCArMTUzLDIwIEBACiAgICAgICogQHJldHVybiBJdGVyYXRvciZsdDtBcmNoaXZlRmlsZVNldCZndDsKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8QXJjaGl2ZUZpbGVTZXQ+IGdyYWJBcmNoaXZlcygpIHsKLSAgICAgICAgZmluYWwgTGlzdDxBcmNoaXZlRmlsZVNldD4gbCA9IG5ldyBMaW5rZWRMaXN0PEFyY2hpdmVGaWxlU2V0PigpOworICAgICAgICByZXR1cm4gc3RyZWFtQXJjaGl2ZXMoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIC8vIFRPRE8gdGhpcyBpcyBhIHByZXR0eSBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzbyB0aGUgcmVzdWx0CisgICAgLy8gc2hvdWxkIGJlIGNhY2hlZC4KKyAgICBwcml2YXRlIFN0cmVhbTxBcmNoaXZlRmlsZVNldD4gc3RyZWFtQXJjaGl2ZXMoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QXJjaGl2ZUZpbGVTZXQ+IGwgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgciA6IHppcHMpIHsKICAgICAgICAgICAgIGwuYWRkKGNvbmZpZ3VyZUFyY2hpdmUobmV3IFppcEZpbGVTZXQoKSwgcikpOwogICAgICAgICB9CiAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgciA6IHRhcnMpIHsKICAgICAgICAgICAgIGwuYWRkKGNvbmZpZ3VyZUFyY2hpdmUobmV3IFRhckZpbGVTZXQoKSwgcikpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsLml0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiBsLnN0cmVhbSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjA4LDQgKzIwNyw4IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIEFyY2hpdmVzIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoQXJjaGl2ZXMuY2xhc3MpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JDRmlsZVNldC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JDRmlsZVNldC5qYXZhCmluZGV4IGFhOTlhNGEuLjc5MzY2OTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CQ0ZpbGVTZXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQkNGaWxlU2V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Nyw5ICs0NywxMCBAQAogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgRmlsZVJlc291cmNlSXRlcmF0b3IgcmVzdWx0ID0gbmV3IEZpbGVSZXNvdXJjZUl0ZXJhdG9yKGdldFByb2plY3QoKSwgZ2V0RGlyKCkpOwogICAgICAgICByZXN1bHQuYWRkRmlsZXMoZ2V0RGlyZWN0b3J5U2Nhbm5lcigpLmdldEluY2x1ZGVkRmlsZXMoKSk7CkBAIC02MiwxMiArNjMsMTcgQEAKICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGaWxlU2V0KSBnZXRSZWYoZ2V0UHJvamVjdCgpKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZ2V0RGlyZWN0b3J5U2Nhbm5lcigpLmdldEluY2x1ZGVkRmlsZXNDb3VudCgpCiAgICAgICAgICAgICArIGdldERpcmVjdG9yeVNjYW5uZXIoKS5nZXRJbmNsdWRlZERpcnNDb3VudCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgRmlsZVNldCBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEZpbGVTZXQuY2xhc3MpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JaaXAyUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CWmlwMlJlc291cmNlLmphdmEKaW5kZXggMzUyN2JmMy4uMjljOWU1NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0JaaXAyUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQlppcDJSZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTMsNiArNTMsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSB3cmFwU3RyZWFtKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmb3IgKGNoYXIgY2ggOiBNQUdJQykgewogICAgICAgICAgICAgaWYgKGluLnJlYWQoKSAhPSBjaCkgewpAQCAtNjgsNiArNjksNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gd3JhcFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmb3IgKGNoYXIgY2ggOiBNQUdJQykgewogICAgICAgICAgICAgb3V0LndyaXRlKGNoKTsKQEAgLTc5LDYgKzgxLDcgQEAKICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4KICAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgIkJ6aXAyIi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXByZXNzaW9uTmFtZSgpIHsKICAgICAgICAgcmV0dXJuICJCemlwMiI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Jhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyLmphdmEKaW5kZXggYzc5NGFlZC4uNjZkYmRhNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0Jhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQmFzZVJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTM3LDcgKzM4LDcgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIKICAgICAgICAgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiwgQ2xvbmVhYmxlIHsKLSAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiByYyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPigpOworICAgIHByaXZhdGUgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJjID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFJlc291cmNlPiBjb2xsID0gbnVsbDsKICAgICBwcml2YXRlIGJvb2xlYW4gY2FjaGUgPSB0cnVlOwogCkBAIC00NSw3ICs0Niw2IEBACiAgICAgICogQ3JlYXRlIGEgbmV3IEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIuCiAgICAgICovCiAgICAgcHVibGljIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgogICAgIH0KIAogICAgIC8qKgpAQCAtMTIxLDkgKzEyMSw3IEBACiAgICAgICAgICAgICB0aHJvdyBub0NoaWxkcmVuQWxsb3dlZCgpOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlQ29sbGVjdGlvbiByZXNvdXJjZUNvbGxlY3Rpb24gOiBjKSB7Ci0gICAgICAgICAgICAgICAgYWRkKHJlc291cmNlQ29sbGVjdGlvbik7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjLmZvckVhY2godGhpczo6YWRkKTsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfQpAQCAtMTM1LDkgKzEzMywxMCBAQAogICAgICAqIGFyZSBhZGRlZCB0byB0aGlzIGNvbnRhaW5lciB3aGlsZSB0aGUgSXRlcmF0b3IgaXMgaW4gdXNlLgogICAgICAqIEByZXR1cm4gYSAiZmFpbC1mYXN0IiBJdGVyYXRvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgc3luY2hyb25pemVkIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIG5ldyBGYWlsRmFzdCh0aGlzLCBjYWNoZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKQEAgLTE0Nyw5ICsxNDYsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyLmNsYXNzLCBnZXREYXRhVHlwZU5hbWUoKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiBjYWNoZUNvbGxlY3Rpb24oKS5zaXplKCk7CkBAIC0xNTksMjcgKzE1OSwyMCBAQAogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGZpbGVzeXN0ZW0tb25seSByZXNvdXJjZSBjb2xsZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoQmFzZVJlc291cmNlQ29sbGVjdGlvbkNvbnRhaW5lcikgZ2V0Q2hlY2tlZFJlZigpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgLy9maXJzdCB0aGUgZWFzeSB3YXksIGlmIGFsbCBjaGlsZHJlbiBhcmUgZmlsZXN5c3RlbS1vbmx5LCByZXR1cm4gdHJ1ZToKLSAgICAgICAgYm9vbGVhbiBnb0Vhcmx5ID0gdHJ1ZTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IGkgPSByYy5pdGVyYXRvcigpOyBnb0Vhcmx5ICYmIGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgZ29FYXJseSA9IGkubmV4dCgpLmlzRmlsZXN5c3RlbU9ubHkoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ29FYXJseSkgeworICAgICAgICBpZiAocmMuc3RyZWFtKCkuYWxsTWF0Y2goUmVzb3VyY2VDb2xsZWN0aW9uOjppc0ZpbGVzeXN0ZW1Pbmx5KSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgLyogbm93IGNoZWNrIGVhY2ggUmVzb3VyY2UgaW4gY2FzZSB0aGUgY2hpbGQgb25seQogICAgICAgICAgICBsZXRzIHRocm91Z2ggZmlsZXMgZnJvbSBhbnkgY2hpbGRyZW4gSVQgbWF5IGhhdmU6ICovCi0gICAgICAgIGZvciAoUmVzb3VyY2UgciA6IGNhY2hlQ29sbGVjdGlvbigpKSB7Ci0gICAgICAgICAgICBpZiAoci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBjYWNoZUNvbGxlY3Rpb24oKS5zdHJlYW0oKQorICAgICAgICAgICAgLmFsbE1hdGNoKHIgLT4gci5hc09wdGlvbmFsKEZpbGVQcm92aWRlci5jbGFzcykuaXNQcmVzZW50KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI2LDExICsyMTksMTIgQEAKICAgICAgKiBjb2xsZWN0aW9ucyBpcyBzaGFsbG93bHkgY2xvbmVkLgogICAgICAqIEByZXR1cm4gYSBjbG9uZWQgaW5zdGFuY2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgYwogICAgICAgICAgICAgICAgID0gKEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICBjLnJjID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+KHJjKTsKKyAgICAgICAgICAgIGMucmMgPSBuZXcgQXJyYXlMaXN0PD4ocmMpOwogICAgICAgICAgICAgYy5jb2xsID0gbnVsbDsKICAgICAgICAgICAgIHJldHVybiBjOwogICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CkBAIC0yNDIsMjEgKzIzNiwyMCBAQAogICAgICAqIEZvcm1hdCB0aGlzIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgYXMgYSBTdHJpbmcuCiAgICAgICogQHJldHVybiBhIGRlc2NyaXB0aXZlIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkudG9TdHJpbmcoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoY2FjaGVDb2xsZWN0aW9uKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKGNhY2hlQ29sbGVjdGlvbigpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogY29sbCkgewotICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNiLmFwcGVuZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBjb2xsLnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKEZpbGUucGF0aFNlcGFyYXRvcikpOworICAgIH0KKworICAgICBwcml2YXRlIEJhc2VSZXNvdXJjZUNvbGxlY3Rpb25Db250YWluZXIgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihCYXNlUmVzb3VyY2VDb2xsZWN0aW9uQ29udGFpbmVyLmNsYXNzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFJlc291cmNlPiBjYWNoZUNvbGxlY3Rpb24oKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQmFzZVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhCmluZGV4IDI3MzQ2MjAuLjFhZWE0NWIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9CYXNlUmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsMTAgKzMyLDEyIEBACiAKICAgICBwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGNvbGwgPSBudWxsOwogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFJlc291cmNlPiBjcmVhdGVJdGVyYXRvcigpIHsKICAgICAgICAgcmV0dXJuIGNhY2hlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIGludCBnZXRTaXplKCkgewogICAgICAgICByZXR1cm4gY2FjaGVDb2xsZWN0aW9uKCkuc2l6ZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Db21wcmVzc2VkUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Db21wcmVzc2VkUmVzb3VyY2UuamF2YQppbmRleCAyYzcyYzI2Li45NTYxMGIzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQ29tcHJlc3NlZFJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0NvbXByZXNzZWRSZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDcsNiArNDcsNyBAQAogICAgICAqIEByZXR1cm4gdGhpcyBSZXNvdXJjZSBmb3JtYXR0ZWQgYXMgYSBTdHJpbmcuCiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gZ2V0Q29tcHJlc3Npb25OYW1lKCkgKyAiIGNvbXByZXNzZWQgIiArIHN1cGVyLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0NvbnRlbnRUcmFuc2Zvcm1pbmdSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0NvbnRlbnRUcmFuc2Zvcm1pbmdSZXNvdXJjZS5qYXZhCmluZGV4IDE5ZTg2YjMuLjIxYjg2OTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Db250ZW50VHJhbnNmb3JtaW5nUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvQ29udGVudFRyYW5zZm9ybWluZ1Jlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogQSByZXNvdXJjZSB0aGF0IHRyYW5zZm9ybXMgdGhlIGNvbnRlbnQgb2YgYW5vdGhlciByZXNvdXJjZS4KQEAgLTU4LDkgKzU3LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgewogICAgICAgICBpZiAoaXNFeGlzdHMoKSkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbiA9IGdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0SW5wdXRTdHJlYW0oKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CiAgICAgICAgICAgICAgICAgaW50IHNpemUgPSAwOwogICAgICAgICAgICAgICAgIGludCByZWFkTm93OwpAQCAtNjksMTQgKzY2LDExIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImNhdWdodCBleGNlcHRpb24gd2hpbGUgcmVhZGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0TmFtZSgpLCBleCk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiY2F1Z2h0IGV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nICIgKyBnZXROYW1lKCksIGV4KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTIwLDI0ICsxMTQsMTYgQEAKICAgICBwdWJsaWMgPFQ+IFQgYXMoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKICAgICAgICAgaWYgKEFwcGVuZGFibGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKICAgICAgICAgICAgIGlmIChpc0FwcGVuZFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBhID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0UmVzb3VyY2UoKS5hcyhBcHBlbmRhYmxlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIGEgPSBnZXRSZXNvdXJjZSgpLmFzKEFwcGVuZGFibGUuY2xhc3MpOwogICAgICAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmNhc3QobmV3IEFwcGVuZGFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEFwcGVuZE91dHB1dFN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IGEuZ2V0QXBwZW5kT3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IHdyYXBTdHJlYW0ob3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmNhc3QoKEFwcGVuZGFibGUpICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBhLmdldEFwcGVuZE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dCA9PSBudWxsID8gbnVsbCA6IHdyYXBTdHJlYW0ob3V0KTsKICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLQogICAgICAgICByZXR1cm4gRmlsZVByb3ZpZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2xhenopCiAgICAgICAgICAgICA/IG51bGwgOiBnZXRSZXNvdXJjZSgpLmFzKGNsYXp6KTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRGlmZmVyZW5jZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0RpZmZlcmVuY2UuamF2YQppbmRleCAzZjNjOTgzLi5lZTYxY2EzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRGlmZmVyZW5jZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9EaWZmZXJlbmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOCwxNiArMzgsMTcgQEAKICAgICAgKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIG5lc3RlZCBSZXNvdXJjZUNvbGxlY3Rpb25zLgogICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29sbGVjdGlvbigpIHsKICAgICAgICAgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJjcyA9IGdldFJlc291cmNlQ29sbGVjdGlvbnMoKTsKICAgICAgICAgaW50IHNpemUgPSByY3Muc2l6ZSgpOwogICAgICAgICBpZiAoc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIGRpZmZlcmVuY2Ugb2YgIiArIHNpemUKLSAgICAgICAgICAgICAgICArICIgcmVzb3VyY2UgY29sbGVjdGlvbiIgKyAoKHNpemUgPT0gMSkgPyAiIiA6ICJzIikKLSAgICAgICAgICAgICAgICArICIgaXMgdW5kZWZpbmVkLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgZGlmZmVyZW5jZSBvZiAlZCByZXNvdXJjZSAlcyBpcyB1bmRlZmluZWQuIiwgc2l6ZSwKKyAgICAgICAgICAgICAgICBzaXplID09IDEgPyAiY29sbGVjdGlvbiIgOiAiY29sbGVjdGlvbnMiKTsKICAgICAgICAgfQotICAgICAgICBTZXQ8UmVzb3VyY2U+IGhzID0gbmV3IEhhc2hTZXQ8UmVzb3VyY2U+KCk7Ci0gICAgICAgIExpc3Q8UmVzb3VyY2U+IGFsID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKKyAgICAgICAgU2V0PFJlc291cmNlPiBocyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZT4gYWwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChSZXNvdXJjZUNvbGxlY3Rpb24gcmMgOiByY3MpIHsKICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgciA6IHJjKSB7CiAgICAgICAgICAgICAgICAgaWYgKGhzLmFkZChyKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZhaWxGYXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmFpbEZhc3QuamF2YQppbmRleCBkYzk2MmJiLi5lOWIzYmY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmFpbEZhc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmFpbEZhc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDcgKzMyLDcgQEAKICAqIEBzaW5jZSBBbnQgMS43CiAgKi8KIC8qcGFja2FnZS1wcml2YXRlKi8gY2xhc3MgRmFpbEZhc3QgaW1wbGVtZW50cyBJdGVyYXRvcjxSZXNvdXJjZT4gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdlYWtIYXNoTWFwPE9iamVjdCwgU2V0PEZhaWxGYXN0Pj4gTUFQID0gbmV3IFdlYWtIYXNoTWFwPE9iamVjdCwgU2V0PEZhaWxGYXN0Pj4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBXZWFrSGFzaE1hcDxPYmplY3QsIFNldDxGYWlsRmFzdD4+IE1BUCA9IG5ldyBXZWFrSGFzaE1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiBJbnZhbGlkYXRlIGFueSBpbi11c2UgSXRlcmF0b3JzIGZyb20gdGhlIHNwZWNpZmllZCBPYmplY3QuCkBAIC00NiwxMiArNDYsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChGYWlsRmFzdCBmKSB7Ci0gICAgICAgIFNldDxGYWlsRmFzdD4gcyA9IE1BUC5nZXQoZi5wYXJlbnQpOwotICAgICAgICBpZiAocyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzID0gbmV3IEhhc2hTZXQ8RmFpbEZhc3Q+KCk7Ci0gICAgICAgICAgICBNQVAucHV0KGYucGFyZW50LCBzKTsKLSAgICAgICAgfQotICAgICAgICBzLmFkZChmKTsKKyAgICAgICAgTUFQLmNvbXB1dGVJZkFic2VudChmLnBhcmVudCwgayAtPiBuZXcgSGFzaFNldDw+KCkpLmFkZChmKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoRmFpbEZhc3QgZikgewpAQCAtOTUsNiArOTAsNyBAQAogICAgICAqIEZ1bGZpbGwgdGhlIEl0ZXJhdG9yIGNvbnRyYWN0LgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbW9yZSBlbGVtZW50cy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICBpZiAod3JhcHBlZCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDgsNiArMTA0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIG5vIG1vcmUgZWxlbWVudHMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFJlc291cmNlIG5leHQoKSB7CiAgICAgICAgIGlmICh3cmFwcGVkID09IG51bGwgfHwgIXdyYXBwZWQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwpAQCAtMTI3LDYgKzEyNCw3IEBACiAgICAgICogRnVsZmlsbCB0aGUgSXRlcmF0b3IgY29udHJhY3QuCiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVByb3ZpZGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVByb3ZpZGVyLmphdmEKaW5kZXggYWEyODMwMC4uNTJmNTJhNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVQcm92aWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUHJvdmlkZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2UuamF2YQppbmRleCBlOTY3OTA3Li5kOGQ2MDRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVSZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTEgKzE4LDEwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMTA2LDkgKzEwNSwxMCBAQAogICAgICAqIEdldCB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIEZpbGVSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIHRoZSBGaWxlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGaWxlUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0RmlsZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEZpbGUoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewpAQCAtMTM5LDcgKzEzOSw3IEBACiAgICAgICovCiAgICAgcHVibGljIEZpbGUgZ2V0QmFzZURpcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEZpbGVSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRCYXNlRGlyKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0QmFzZURpcigpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIGJhc2VEaXI7CkBAIC0xNDksNiArMTQ5LDcgQEAKICAgICAgKiBPdmVycmlkZXMgdGhlIHN1cGVyIHZlcnNpb24uCiAgICAgICogQHBhcmFtIHIgdGhlIFJlZmVyZW5jZSB0byBzZXQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHsKICAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCB8fCBiYXNlRGlyICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CkBAIC0xNjIsOSArMTYzLDEwIEBACiAgICAgICogb25seSB3aWxsIGJlIHJldHVybmVkLgogICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyByZXNvdXJjZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TmFtZSgpOwogICAgICAgICB9CiAgICAgICAgIEZpbGUgYiA9IGdldEJhc2VEaXIoKTsKICAgICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IGdldE5vdE51bGxGaWxlKCkuZ2V0TmFtZSgpCkBAIC0xNzUsOCArMTc3LDkgQEAKICAgICAgKiBMZWFybiB3aGV0aGVyIHRoaXMgZmlsZSBleGlzdHMuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcmVzb3VyY2UgZXhpc3RzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRXhpc3RzKCkgewotICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNFeGlzdHMoKQorICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/IGdldFJlZigpLmlzRXhpc3RzKCkKICAgICAgICAgICAgIDogZ2V0Tm90TnVsbEZpbGUoKS5leGlzdHMoKTsKICAgICB9CiAKQEAgLTE4NCw5ICsxODcsMTAgQEAKICAgICAgKiBHZXQgdGhlIG1vZGlmaWNhdGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzaW5jZSAwMS4wMS4xOTcwIC4KICAgICAgKiBAcmV0dXJuIDAgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGV4aXN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKICAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKLSAgICAgICAgICAgID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRMYXN0TW9kaWZpZWQoKQorICAgICAgICAgICAgPyBnZXRSZWYoKS5nZXRMYXN0TW9kaWZpZWQoKQogICAgICAgICAgICAgOiBnZXROb3ROdWxsRmlsZSgpLmxhc3RNb2RpZmllZCgpOwogICAgIH0KIApAQCAtMTk0LDggKzE5OCw5IEBACiAgICAgICogTGVhcm4gd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCiAgICAgICogQHJldHVybiBib29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0aGUgcmVzb3VyY2UgaXMgYSBkaXJlY3RvcnkuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5pc0RpcmVjdG9yeSgpCisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuaXNEaXJlY3RvcnkoKQogICAgICAgICAgICAgOiBnZXROb3ROdWxsRmlsZSgpLmlzRGlyZWN0b3J5KCk7CiAgICAgfQogCkBAIC0yMDMsOCArMjA4LDkgQEAKICAgICAgKiBHZXQgdGhlIHNpemUgb2YgdGhpcyBSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIHRoZSBzaXplLCBhcyBhIGxvbmcsIDAgaWYgdGhlIFJlc291cmNlIGRvZXMgbm90IGV4aXN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBsb25nIGdldFNpemUoKSB7Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRTaXplKCkKKyAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKS5nZXRTaXplKCkKICAgICAgICAgICAgIDogZ2V0Tm90TnVsbEZpbGUoKS5sZW5ndGgoKTsKICAgICB9CiAKQEAgLTIxMywxMCArMjE5LDEwIEBACiAgICAgICogQHJldHVybiBhbiBJbnB1dFN0cmVhbSBvYmplY3QuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKLSAgICAgICAgICAgID8gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpCi0gICAgICAgICAgICA6IG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0Tm90TnVsbEZpbGUoKSk7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuZ2V0SW5wdXRTdHJlYW0oKQorICAgICAgICAgICAgOiBGaWxlcy5uZXdJbnB1dFN0cmVhbShnZXROb3ROdWxsRmlsZSgpLnRvUGF0aCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyNyw5ICsyMzMsMTAgQEAKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIE91dHB1dFN0cmVhbXMgYXJlIG5vdAogICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRmlsZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRPdXRwdXRTdHJlYW0oZmFsc2UpOwogICAgIH0KQEAgLTIzNyw5ICsyNDQsMTAgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRBcHBlbmRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoRmlsZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldEFwcGVuZE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEFwcGVuZE91dHB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRPdXRwdXRTdHJlYW0odHJ1ZSk7CiAgICAgfQpAQCAtMjU2LDcgKzI2NCw3IEBACiAgICAgICAgICAgICAgICAgcC5ta2RpcnMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gYXBwZW5kID8gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZi5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJ1ZSkgOiBuZXcgRmlsZU91dHB1dFN0cmVhbShmKTsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5uZXdPdXRwdXRTdHJlYW0oZi50b1BhdGgoKSwgYXBwZW5kKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2NSw5ICsyNzMsMTAgQEAKICAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoaXMgRmlsZVJlc291cmNlCiAgICAgICogICAgICAgICBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCBSZXNvdXJjZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhSZXNvdXJjZSBhbm90aGVyKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5jb21wYXJlVG8oYW5vdGhlcik7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuY29tcGFyZVRvKGFub3RoZXIpOwogICAgICAgICB9CiAgICAgICAgIGlmICh0aGlzLmVxdWFscyhhbm90aGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0yOTQsMTIgKzMwMywxMyBAQAogICAgICAqIEBwYXJhbSBhbm90aGVyIHRoZSBvdGhlciBPYmplY3QgdG8gY29tcGFyZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5vdGhlciBpcyBhIEZpbGVSZXNvdXJjZSByZXByZXNlbnRpbmcgdGhlIHNhbWUgZmlsZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGFub3RoZXIpIHsKICAgICAgICAgaWYgKHRoaXMgPT0gYW5vdGhlcikgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuZXF1YWxzKGFub3RoZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmVxdWFscyhhbm90aGVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYW5vdGhlciA9PSBudWxsIHx8ICEoYW5vdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMxNCw5ICszMjQsMTAgQEAKICAgICAgKiBHZXQgdGhlIGhhc2ggY29kZSBmb3IgdGhpcyBSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIGhhc2ggY29kZSBhcyBpbnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5oYXNoQ29kZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBNQUdJQyAqIChnZXRGaWxlKCkgPT0gbnVsbCA/IE5VTExfRklMRSA6IGdldEZpbGUoKS5oYXNoQ29kZSgpKTsKICAgICB9CkBAIC0zMjUsOSArMzM2LDEwIEBACiAgICAgICogR2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBSZXNvdXJjZS4KICAgICAgKiBAcmV0dXJuIHRoaXMgRmlsZVJlc291cmNlIGZvcm1hdHRlZCBhcyBhIFN0cmluZy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuICIodW5ib3VuZCBmaWxlIHJlc291cmNlKSI7CkBAIC0zNDAsOSArMzUyLDEwIEBACiAgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIFJlc291cmNlIGlzIGEgRmlsZVJlc291cmNlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChGaWxlUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNGaWxlc3lzdGVtT25seSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmlzRmlsZXN5c3RlbU9ubHkoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMzUyLDkgKzM2NSwxMCBAQAogICAgICAqIEltcGxlbWVudCB0aGUgVG91Y2hhYmxlIGludGVyZmFjZS4KICAgICAgKiBAcGFyYW0gbW9kVGltZSBuZXcgbGFzdCBtb2RpZmljYXRpb24gdGltZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB0b3VjaChsb25nIG1vZFRpbWUpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICgoRmlsZVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLnRvdWNoKG1vZFRpbWUpOworICAgICAgICAgICAgZ2V0UmVmKCkudG91Y2gobW9kVGltZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFnZXROb3ROdWxsRmlsZSgpLnNldExhc3RNb2RpZmllZChtb2RUaW1lKSkgewpAQCAtMzgzLDYgKzM5Nyw3IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiBkZXNpcmVkCiAgICAgICogQHNpbmNlIEFudDEuOAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgcGF0aCkgewogICAgICAgICBGaWxlIG5ld2ZpbGUgPSBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKGdldEZpbGUoKSwgcGF0aCk7CiAgICAgICAgIEZpbGVSZXNvdXJjZSBmaWxlUmVzb3VyY2UgPSBuZXcgRmlsZVJlc291cmNlKG5ld2ZpbGUpOwpAQCAtMzkxLDQgKzQwNiw5IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZpbGVSZXNvdXJjZTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmlsZVJlc291cmNlIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRmlsZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVJlc291cmNlSXRlcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VJdGVyYXRvci5qYXZhCmluZGV4IGMxYjVmN2YuLjljYmE3MWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VJdGVyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTE3LDYgKzExNyw3IEBACiAgICAgICogRmluZCBvdXQgd2hldGhlciB0aGlzIEZpbGVSZXNvdXJjZUl0ZXJhdG9yIGhhcyBtb3JlIGVsZW1lbnRzLgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbW9yZSBSZXNvdXJjZXMgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgIHJldHVybiBwb3MgPCBmaWxlcy5sZW5ndGg7CiAgICAgfQpAQCAtMTI1LDYgKzEyNiw3IEBACiAgICAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGlzIEZpbGVSZXNvdXJjZUl0ZXJhdG9yLgogICAgICAqIEByZXR1cm4gdGhlIG5leHQgT2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZXNvdXJjZSBuZXh0KCkgewogICAgICAgICByZXR1cm4gbmV4dFJlc291cmNlKCk7CiAgICAgfQpAQCAtMTMyLDYgKzEzNCw3IEBACiAgICAgLyoqCiAgICAgICogTm90IGltcGxlbWVudGVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ZpbGVzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZXMuamF2YQppbmRleCBiMzQxMjkxLi5iNzQ5M2Y5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZXMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKQEAgLTM5LDExICs0MCw4IEBACiBwdWJsaWMgY2xhc3MgRmlsZXMgZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyCiAgICAgaW1wbGVtZW50cyBSZXNvdXJjZUNvbGxlY3Rpb24gewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmF0b3I8UmVzb3VyY2U+IEVNUFRZX0lURVJBVE9SCi0gICAgICAgID0gQ29sbGVjdGlvbnMuPFJlc291cmNlPmVtcHR5U2V0KCkuaXRlcmF0b3IoKTsKLQogICAgIHByaXZhdGUgUGF0dGVyblNldCBkZWZhdWx0UGF0dGVybnMgPSBuZXcgUGF0dGVyblNldCgpOwotICAgIHByaXZhdGUgVmVjdG9yPFBhdHRlcm5TZXQ+IGFkZGl0aW9uYWxQYXR0ZXJucyA9IG5ldyBWZWN0b3I8UGF0dGVyblNldD4oKTsKKyAgICBwcml2YXRlIFZlY3RvcjxQYXR0ZXJuU2V0PiBhZGRpdGlvbmFsUGF0dGVybnMgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgIHByaXZhdGUgYm9vbGVhbiB1c2VEZWZhdWx0RXhjbHVkZXMgPSB0cnVlOwogICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKQEAgLTgyLDYgKzgwLDcgQEAKICAgICAgKiBAcGFyYW0gciB0aGUgPGNvZGU+UmVmZXJlbmNlPC9jb2RlPiB0byB1c2UuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhIHByb2JsZW0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UmVmaWQoUmVmZXJlbmNlIHIpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChoYXNQYXR0ZXJucyhkZWZhdWx0UGF0dGVybnMpKSB7CiAgICAgICAgICAgICB0aHJvdyB0b29NYW55QXR0cmlidXRlcygpOwpAQCAtMjU4LDcgKzI1Nyw3IEBACiAgICAgICogQHJldHVybiB0aGUgZGVmYXVsdGV4Y2x1c2lvbnMgdmFsdWUuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGdldERlZmF1bHRleGNsdWRlcygpIHsKLSAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQogICAgICAgICAgICAgPyBnZXRSZWYoKS5nZXREZWZhdWx0ZXhjbHVkZXMoKSA6IHVzZURlZmF1bHRFeGNsdWRlczsKICAgICB9CiAKQEAgLTI4MCw3ICsyNzksNyBAQAogICAgICAqIGNvbGxlY3Rpb24gaXMgY2FzZS1zZW5zaXRpdmUuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQogICAgICAgICAgICAgPyBnZXRSZWYoKS5pc0Nhc2VTZW5zaXRpdmUoKSA6IGNhc2VTZW5zaXRpdmU7CiAgICAgfQogCkBAIC0zMDIsNyArMzAxLDcgQEAKICAgICAgKiAgICAgICAgIHNob3VsZCBiZSBmb2xsb3dlZC4KICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGb2xsb3dTeW1saW5rcygpIHsKLSAgICAgICAgcmV0dXJuIChpc1JlZmVyZW5jZSgpKQorICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQogICAgICAgICAgICAgPyBnZXRSZWYoKS5pc0ZvbGxvd1N5bWxpbmtzKCkgOiBmb2xsb3dTeW1saW5rczsKICAgICB9CiAKQEAgLTMxMCw2ICszMDksNyBAQAogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcigpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOwpAQCAtMzE5LDcgKzMxOSw3IEBACiAgICAgICAgIGludCBmY3QgPSBkcy5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKTsKICAgICAgICAgaW50IGRjdCA9IGRzLmdldEluY2x1ZGVkRGlyc0NvdW50KCk7CiAgICAgICAgIGlmIChmY3QgKyBkY3QgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lURVJBVE9SOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKICAgICAgICAgfQogICAgICAgICBGaWxlUmVzb3VyY2VJdGVyYXRvciByZXN1bHQgPSBuZXcgRmlsZVJlc291cmNlSXRlcmF0b3IoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgaWYgKGZjdCA+IDApIHsKQEAgLTMzNSw2ICszMzUsNyBAQAogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zaXplKCk7CkBAIC0zNTQsMTUgKzM1NSw4IEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaGFzUGF0dGVybnMoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIGlmIChoYXNQYXR0ZXJucyhkZWZhdWx0UGF0dGVybnMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFBhdHRlcm5TZXQgcGF0dGVyblNldCA6IGFkZGl0aW9uYWxQYXR0ZXJucykgewotICAgICAgICAgICAgaWYgKGhhc1BhdHRlcm5zKHBhdHRlcm5TZXQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gaGFzUGF0dGVybnMoZGVmYXVsdFBhdHRlcm5zKQorICAgICAgICAgICAgfHwgYWRkaXRpb25hbFBhdHRlcm5zLnN0cmVhbSgpLmFueU1hdGNoKHRoaXM6Omhhc1BhdHRlcm5zKTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3MCw2ICszNjQsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHNlbGVjdG9yIHRoZSBuZXcgPGNvZGU+RmlsZVNlbGVjdG9yPC9jb2RlPiB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFwcGVuZFNlbGVjdG9yKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKQEAgLTM4MiwyMiArMzc3LDEzIEBACiAgICAgICogRm9ybWF0IHRoaXMgRmlsZXMgY29sbGVjdGlvbiBhcyBhIFN0cmluZy4KICAgICAgKiBAcmV0dXJuIGEgZGVzY3JpcHRpdmUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KLSAgICAgICAgSXRlcmF0b3I8UmVzb3VyY2U+IGkgPSBpdGVyYXRvcigpOwotICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoaS5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gaXNFbXB0eSgpID8gIiIgOiBzdHJlYW0oKS5tYXAoT2JqZWN0Ojp0b1N0cmluZykKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZyhGaWxlLnBhdGhTZXBhcmF0b3IpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQwNSwxMyArMzkxLDE0IEBACiAgICAgICogKHRoZSBsaXN0IG9mIHNlbGVjdG9ycyBpcyBhIHNoYWxsb3cgY2xvbmUgb2YgdGhpcyBpbnN0YW5jZSdzIGxpc3QpLgogICAgICAqIEByZXR1cm4gYSBjbG9uZWQgT2JqZWN0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGNsb25lKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNsb25lKCk7CiAgICAgICAgIH0KICAgICAgICAgRmlsZXMgZiA9IChGaWxlcykgc3VwZXIuY2xvbmUoKTsKICAgICAgICAgZi5kZWZhdWx0UGF0dGVybnMgPSAoUGF0dGVyblNldCkgZGVmYXVsdFBhdHRlcm5zLmNsb25lKCk7Ci0gICAgICAgIGYuYWRkaXRpb25hbFBhdHRlcm5zID0gbmV3IFZlY3RvcjxQYXR0ZXJuU2V0PihhZGRpdGlvbmFsUGF0dGVybnMuc2l6ZSgpKTsKKyAgICAgICAgZi5hZGRpdGlvbmFsUGF0dGVybnMgPSBuZXcgVmVjdG9yPD4oYWRkaXRpb25hbFBhdHRlcm5zLnNpemUoKSk7CiAgICAgICAgIGZvciAoUGF0dGVyblNldCBwcyA6IGFkZGl0aW9uYWxQYXR0ZXJucykgewogICAgICAgICAgICAgZi5hZGRpdGlvbmFsUGF0dGVybnMuYWRkKChQYXR0ZXJuU2V0KSBwcy5jbG9uZSgpKTsKICAgICAgICAgfQpAQCAtNDUxLDExICs0MzgsNyBAQAogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIFBhdHRlcm5TZXQgcHMgPSBuZXcgUGF0dGVyblNldCgpOwogICAgICAgICBwcy5hcHBlbmQoZGVmYXVsdFBhdHRlcm5zLCBwKTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gYWRkaXRpb25hbFBhdHRlcm5zLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGFkZGl0aW9uYWxQYXR0ZXJucy5lbGVtZW50QXQoaSk7Ci0gICAgICAgICAgICBwcy5hcHBlbmQoKFBhdHRlcm5TZXQpIG8sIHApOwotICAgICAgICB9CisgICAgICAgIGFkZGl0aW9uYWxQYXR0ZXJucy5mb3JFYWNoKHBhdCAtPiBwcy5hcHBlbmQocGF0LCBwKSk7CiAgICAgICAgIHJldHVybiBwczsKICAgICB9CiAKQEAgLTQ2NCw2ICs0NDcsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIGVsZW1lbnRzIG9mIGEgRmlsZXMgY29sbGVjdGlvbgogICAgICAqICAgICAgICAgICAgICB3aWxsIGJlIEZpbGVSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNDc0LDcgKzQ1OCw3IEBACiAgICAgICogQHJldHVybiA8Y29kZT5GaWxlQ29sbGVjdGlvbjwvY29kZT4uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIEZpbGVzIGdldFJlZigpIHsKLSAgICAgICAgcmV0dXJuIChGaWxlcykgZ2V0Q2hlY2tlZFJlZigpOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihGaWxlcy5jbGFzcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBlbnN1cmVEaXJlY3RvcnlTY2FubmVyU2V0dXAoKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlyc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaXJzdC5qYXZhCmluZGV4IGVhOWU3ZDAuLjIyY2FiNWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaXJzdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaXJzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTAgKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIApAQCAtMzUsMTQgKzMzLDEwIEBACiAgICAgICogVGFrZSB0aGUgZmlyc3QgPGNvZGU+Y291bnQ8L2NvZGU+IGVsZW1lbnRzLgogICAgICAqIEByZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFJlc291cmNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgaW50IGN0ID0gZ2V0VmFsaWRDb3VudCgpOwotICAgICAgICBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlciA9IGdldFJlc291cmNlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7Ci0gICAgICAgIExpc3Q8UmVzb3VyY2U+IGFsID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY3QpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN0ICYmIGl0ZXIuaGFzTmV4dCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFsLmFkZChpdGVyLm5leHQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFsOworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VDb2xsZWN0aW9uKCkuc3RyZWFtKCkubGltaXQoZ2V0VmFsaWRDb3VudCgpKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvR1ppcFJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvR1ppcFJlc291cmNlLmphdmEKaW5kZXggM2Y5NWE2OS4uNzA3YTIwZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0daaXBSZXNvdXJjZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9HWmlwUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDYgKzIzLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CisKIC8qKgogICogQSBHWmlwIGNvbXByZXNzZWQgcmVzb3VyY2UuCiAgKgpAQCAtNDEsNyArNDMsNyBAQAogICAgICAqIENvbnN0cnVjdG9yIHdpdGggYW5vdGhlciByZXNvdXJjZSB0byB3cmFwLgogICAgICAqIEBwYXJhbSBvdGhlciB0aGUgcmVzb3VyY2UgdG8gd3JhcC4KICAgICAgKi8KLSAgICBwdWJsaWMgR1ppcFJlc291cmNlKG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbiBvdGhlcikgeworICAgIHB1YmxpYyBHWmlwUmVzb3VyY2UoUmVzb3VyY2VDb2xsZWN0aW9uIG90aGVyKSB7CiAgICAgICAgIHN1cGVyKG90aGVyKTsKICAgICB9CiAKQEAgLTUxLDYgKzUzLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gd3JhcFN0cmVhbShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG5ldyBHWklQSW5wdXRTdHJlYW0oaW4pOwogICAgIH0KQEAgLTYxLDcgKzY0LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KLSAgICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSB3cmFwU3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE91dHB1dFN0cmVhbSB3cmFwU3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBuZXcgR1pJUE91dHB1dFN0cmVhbShvdXQpOwogICAgIH0KIApAQCAtNjksNiArNzMsNyBAQAogICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29tcHJlc3Npb24gbWV0aG9kLgogICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyAiR1ppcCIuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wcmVzc2lvbk5hbWUoKSB7CiAgICAgICAgIHJldHVybiAiR1ppcCI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ltbXV0YWJsZVJlc291cmNlRXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24uamF2YQppbmRleCA5ZGNlNzE1Li41OTliZmUwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9JbnRlcnNlY3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9JbnRlcnNlY3QuamF2YQppbmRleCBjZGJlZWQwLi45NDVhMTVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSW50ZXJzZWN0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0ludGVyc2VjdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsMTEgKzIyLDE0IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwogCisKIC8qKgogICogUmVzb3VyY2VDb2xsZWN0aW9uIHJlcHJlc2VudGluZyB0aGUgaW50ZXJzZWN0aW9uCiAgKiBvZiBtdWx0aXBsZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9ucy4KQEAgLTM4LDI3ICs0MSwyMyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9ucy4KICAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENvbGxlY3Rpb24oKSB7CiAgICAgICAgIExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiByY3MgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb25zKCk7CiAgICAgICAgIGludCBzaXplID0gcmNzLnNpemUoKTsKICAgICAgICAgaWYgKHNpemUgPCAyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBpbnRlcnNlY3Rpb24gb2YgIiArIHNpemUKLSAgICAgICAgICAgICAgICArICIgcmVzb3VyY2UgY29sbGVjdGlvbiIgKyAoKHNpemUgPT0gMSkgPyAiIiA6ICJzIikKLSAgICAgICAgICAgICAgICArICIgaXMgdW5kZWZpbmVkLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJUaGUgaW50ZXJzZWN0aW9uIG9mICVkIHJlc291cmNlICVzIGlzIHVuZGVmaW5lZC4iLCBzaXplLAorICAgICAgICAgICAgICAgIHNpemUgPT0gMSA/ICJjb2xsZWN0aW9uIiA6ICJjb2xsZWN0aW9ucyIpOwogICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRnVuY3Rpb248UmVzb3VyY2VDb2xsZWN0aW9uLCBTZXQ8UmVzb3VyY2U+PiB0b1NldCA9CisgICAgICAgICAgICBjIC0+IGMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCiAgICAgICAgIEl0ZXJhdG9yPFJlc291cmNlQ29sbGVjdGlvbj4gcmMgPSByY3MuaXRlcmF0b3IoKTsKLSAgICAgICAgU2V0PFJlc291cmNlPiBzID0gbmV3IExpbmtlZEhhc2hTZXQ8UmVzb3VyY2U+KGNvbGxlY3QocmMubmV4dCgpKSk7Ci0gICAgICAgIHdoaWxlIChyYy5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIHMucmV0YWluQWxsKGNvbGxlY3QocmMubmV4dCgpKSk7Ci0gICAgICAgIH0KKyAgICAgICAgU2V0PFJlc291cmNlPiBzID0gbmV3IExpbmtlZEhhc2hTZXQ8Pih0b1NldC5hcHBseShyYy5uZXh0KCkpKTsKKyAgICAgICAgcmMuZm9yRWFjaFJlbWFpbmluZyhjIC0+IHMucmV0YWluQWxsKHRvU2V0LmFwcGx5KGMpKSk7CiAgICAgICAgIHJldHVybiBzOwogICAgIH0KIAotICAgIHByaXZhdGUgU2V0PFJlc291cmNlPiBjb2xsZWN0KFJlc291cmNlQ29sbGVjdGlvbiByYykgewotICAgICAgICBTZXQ8UmVzb3VyY2U+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoU2V0PFJlc291cmNlPigpOwotICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByYykgewotICAgICAgICAgICAgcmVzdWx0LmFkZChyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9KYXZhQ29uc3RhbnRSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFDb25zdGFudFJlc291cmNlLmphdmEKaW5kZXggZThjOGYwMi4uYzNlOTI1OCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFDb25zdGFudFJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFDb25zdGFudFJlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogLyoqCiAgKiBBIHJlc291cmNlIHRoYXQgaXMgYSBqYXZhIGNvbnN0YW50LgpAQCAtMzYsNiArMzcsNyBAQAogICAgICAqIEByZXR1cm4gYW4gb3BlbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSByZXNvdXJjZQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oQ2xhc3NMb2FkZXIgY2wpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBjb25zdGFudCA9IGdldE5hbWUoKTsKICAgICAgICAgaWYgKGNvbnN0YW50ID09IG51bGwpIHsKQEAgLTQ2LDcgKzQ4LDcgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTm8gY2xhc3MgbmFtZSBpbiAiICsgY29uc3RhbnQpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBjb25zdGFudC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgICAgICBTdHJpbmcgZmllbGRuYW1lID0gY29uc3RhbnQuc3Vic3RyaW5nKGluZGV4ICsgMSwgY29uc3RhbnQubGVuZ3RoKCkpOworICAgICAgICBTdHJpbmcgZmllbGRuYW1lID0gY29uc3RhbnQuc3Vic3RyaW5nKGluZGV4ICsgMSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9CiAgICAgICAgICAgICAgICAgY2wgIT0gbnVsbApAQCAtNTQsNyArNTYsNyBAQAogICAgICAgICAgICAgICAgIDogQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwogICAgICAgICAgICAgRmllbGQgZmllbGQgPSBjbGF6ei5nZXRGaWVsZChmaWVsZG5hbWUpOwogICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gZmllbGQuZ2V0KG51bGwpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHZhbHVlLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odmFsdWUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2xhc3Mgbm90IGZvdW5kOiIgKyBjbGFzc25hbWUpOwogICAgICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YVJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvSmF2YVJlc291cmNlLmphdmEKaW5kZXggYTkyN2QzZi4uMjYwMzUwMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9KYXZhUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc5LDIwICs3OSwyMCBAQAogICAgICAqIEdldCB0aGUgVVJMIHJlcHJlc2VudGVkIGJ5IHRoaXMgUmVzb3VyY2UuCiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBVUkwgZ2V0VVJMKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoSmF2YVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFVSTCgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldFVSTCgpOwogICAgICAgICB9CiAgICAgICAgIEFic3RyYWN0Q2xhc3NwYXRoUmVzb3VyY2UuQ2xhc3NMb2FkZXJXaXRoRmxhZyBjbGFzc0xvYWRlciA9CiAgICAgICAgICAgICBnZXRDbGFzc0xvYWRlcigpOwogICAgICAgICBpZiAoY2xhc3NMb2FkZXIuZ2V0TG9hZGVyKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlKGdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5nZXRMb2FkZXIoKS5nZXRSZXNvdXJjZShnZXROYW1lKCkpOwotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBjbGFzc0xvYWRlci5jbGVhbnVwKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc0xvYWRlci5nZXRMb2FkZXIoKS5nZXRSZXNvdXJjZShnZXROYW1lKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xhc3NMb2FkZXIuY2xlYW51cCgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDMsOSArMTAzLDEwIEBACiAgICAgICogSmF2YVJlc291cmNlIGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUKICAgICAgKiBzcGVjaWZpZWQgUmVzb3VyY2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oUmVzb3VyY2UgYW5vdGhlcikgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuY29tcGFyZVRvKGFub3RoZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNvbXBhcmVUbyhhbm90aGVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYW5vdGhlci5nZXRDbGFzcygpLmVxdWFscyhnZXRDbGFzcygpKSkgewogICAgICAgICAgICAgSmF2YVJlc291cmNlIG90aGVyanIgPSAoSmF2YVJlc291cmNlKSBhbm90aGVyOwpAQCAtMTM4LDQgKzEzOSw4IEBACiAgICAgICAgIHJldHVybiBzdXBlci5jb21wYXJlVG8oYW5vdGhlcik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEphdmFSZXNvdXJjZSBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEphdmFSZXNvdXJjZS5jbGFzcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhc3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9MYXN0LmphdmEKaW5kZXggMzEyMjcxYi4uN2UyOGQxNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhc3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTGFzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTAgKzE3LDkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMzgsMzMgKzM3LDI5IEBACiAgICAgICogVGFrZSB0aGUgbGFzdCA8Y29kZT5jb3VudDwvY29kZT4gZWxlbWVudHMuCiAgICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgUmVzb3VyY2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFJlc291cmNlPiBnZXRDb2xsZWN0aW9uKCkgewogICAgICAgICBpbnQgY291bnQgPSBnZXRWYWxpZENvdW50KCk7CiAgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IGdldFJlc291cmNlQ29sbGVjdGlvbigpOwotICAgICAgICBpbnQgaSA9IGNvdW50OwotICAgICAgICBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlciA9IHJjLml0ZXJhdG9yKCk7CiAgICAgICAgIGludCBzaXplID0gcmMuc2l6ZSgpOwotICAgICAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IHNraXAgPSBNYXRoLm1heCgwLCBzaXplIC0gY291bnQpOwogCi0gICAgICAgIExpc3Q8UmVzb3VyY2U+IGFsID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oY291bnQpOwotICAgICAgICBmb3IgKDsgaXRlci5oYXNOZXh0KCk7IGkrKykgewotICAgICAgICAgICAgYWwuYWRkKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgZm91bmQgPSBhbC5zaXplKCk7CisgICAgICAgIExpc3Q8UmVzb3VyY2U+IHJlc3VsdCA9CisgICAgICAgICAgICByYy5zdHJlYW0oKS5za2lwKHNraXApLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgaW50IGZvdW5kID0gcmVzdWx0LnNpemUoKTsKICAgICAgICAgaWYgKGZvdW5kID09IGNvdW50IHx8IChzaXplIDwgY291bnQgJiYgZm91bmQgPT0gc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBhbDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgIH0KLQogICAgICAgICAvL21pc21hdGNoOgotICAgICAgICBTdHJpbmcgbXNnID0gIlJlc291cmNlIGNvbGxlY3Rpb24gIiArIHJjICsgIiByZXBvcnRzIHNpemUgIiArIHNpemUKLSAgICAgICAgICAgICsgIiBidXQgcmV0dXJucyAiICsgaSArICIgZWxlbWVudHMuIjsKKyAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAiUmVzb3VyY2UgY29sbGVjdGlvbiAlcyByZXBvcnRzIHNpemUgJWQgYnV0IHJldHVybnMgJWQgZWxlbWVudHMuIiwKKyAgICAgICAgICAgIHJjLCBzaXplLCBmb3VuZCArIHNraXApOwogCiAgICAgICAgIC8vc2l6ZSB3YXMgdW5kZXJzdGF0ZWQgLT4gdG9vIG1hbnkgcmVzdWx0czsgd2FybiBhbmQgY29udGludWU6CiAgICAgICAgIGlmIChmb3VuZCA+IGNvdW50KSB7CiAgICAgICAgICAgICBsb2cobXNnLCBQcm9qZWN0Lk1TR19XQVJOKTsKLSAgICAgICAgICAgIHJldHVybiBhbC5zdWJMaXN0KGZvdW5kIC0gY291bnQsIGZvdW5kKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuc3ViTGlzdChmb3VuZCAtIGNvdW50LCBmb3VuZCk7CiAgICAgICAgIH0KICAgICAgICAgLy9zaXplIHdhcyBvdmVyc3RhdGVkOyB3ZSBtaXNzZWQgc29tZSBhbmQgYXJlIG5vdyBpbiBlcnJvci1sYW5kOgogICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obXNnKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9MYXp5UmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhenlSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyLmphdmEKaW5kZXggYmRjYzk1ZC4uYjc3ZDJkOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhenlSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhenlSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogCkBAIC0zMiwyNCArMzMsMjMgQEAKICAgICAgICAgQWJzdHJhY3RSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyIHsKIAogICAgIC8qKiBMaXN0IG9mIGNhY2hlZCByZXNvdXJjZXMgKi8KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2U+IGNhY2hlZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2U+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlPiBjYWNoZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAotICAgIHByaXZhdGUgRmlsdGVyaW5nSXRlcmF0b3IgZmlsdGVyaW5nSXRlcmF0b3I7CisgICAgcHJpdmF0ZSBJdGVyYXRvcjxSZXNvdXJjZT4gZmlsdGVyaW5nSXRlcmF0b3I7CisKKyAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPEl0ZXJhdG9yPFJlc291cmNlPj4gZmlsdGVyaW5nSXRlcmF0b3JTdXBwbGllciA9CisgICAgICAgICgpIC0+IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcihnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBJdGVyYXRvcjxSZXNvdXJjZT4gY3JlYXRlSXRlcmF0b3IoKSB7Ci0gICAgICAgIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyYXRvcjsKICAgICAgICAgaWYgKGlzQ2FjaGUoKSkgewogICAgICAgICAgICAgaWYgKGZpbHRlcmluZ0l0ZXJhdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAvLyBubyB3b3JyeSBvZiB0aHJlYWQgc2FmZXR5IGhlcmUsIHNlZSBmdW5jdGlvbidzIGNvbnRyYWN0Ci0gICAgICAgICAgICAgICAgZmlsdGVyaW5nSXRlcmF0b3IgPSBuZXcgRmlsdGVyaW5nSXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJpbmdJdGVyYXRvciA9IGZpbHRlcmluZ0l0ZXJhdG9yU3VwcGxpZXIuZ2V0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBDYWNoZWRJdGVyYXRvcihmaWx0ZXJpbmdJdGVyYXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBGaWx0ZXJpbmdJdGVyYXRvcihnZXRSZXNvdXJjZUNvbGxlY3Rpb24oKS5pdGVyYXRvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVkSXRlcmF0b3IoZmlsdGVyaW5nSXRlcmF0b3IpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVyYXRvcjsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmluZ0l0ZXJhdG9yU3VwcGxpZXIuZ2V0KCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAvKioKICAgICAgKiBTcGVjaWZ5IGlmIHRoZSByZXNvdXJjZSBzaG91bGQgYmUgZmlsdGVyZWQgb3Igbm90LiBUaGlzIGZ1bmN0aW9uIHNob3VsZAotICAgICAqIGJlIG92ZXJyaWRlbiBpbiBvcmRlciB0byBkZWZpbmUgdGhlIGZpbHRlcmluZyBhbGdvcml0aG0KKyAgICAgKiBiZSBvdmVycmlkZGVuIGluIG9yZGVyIHRvIGRlZmluZSB0aGUgZmlsdGVyaW5nIGFsZ29yaXRobQogICAgICAqCiAgICAgICogQHBhcmFtIHIgcmVzb3VyY2UgY29uc2lkZXJlZCBmb3IgZmlsdHJhdGlvbgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2Ugc2hvdWxkIGJlIGZpbHRlcmVkIG9yIG5vdApAQCAtODQsMTAgKzg0LDExIEBACiAKICAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEl0ZXJhdG9yPFJlc291cmNlPiBpdDsKIAotICAgICAgICBwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoZmluYWwgSXRlcmF0b3I8UmVzb3VyY2U+IGl0KSB7CisgICAgICAgIEZpbHRlcmluZ0l0ZXJhdG9yKGZpbmFsIEl0ZXJhdG9yPFJlc291cmNlPiBpdCkgewogICAgICAgICAgICAgdGhpcy5pdCA9IGl0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgICAgICBpZiAoZW5kZWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDUsNiArMTA2LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBuZXh0KCkgewogICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKQEAgLTExNCw5ICsxMTYsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMTI1LDcgKzEyNCw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBDYWNoZWRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFJlc291cmNlPiB7CiAKLSAgICAgICAgaW50IGN1c3Jzb3IgPSAwOworICAgICAgICBpbnQgY3Vyc29yID0gMDsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFJlc291cmNlPiBpdDsKIApAQCAtMTQwLDEwICsxMzksMTEgQEAKICAgICAgICAgICAgIHRoaXMuaXQgPSBpdDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICAgc3luY2hyb25pemVkIChjYWNoZWRSZXNvdXJjZXMpIHsKICAgICAgICAgICAgICAgICAvLyBoYXZlIHdlIGFscmVhZHkgY2FjaGVkIHRoZSBuZXh0IGVudHJ5ID8KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVkUmVzb3VyY2VzLnNpemUoKSA+IGN1c3Jzb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGVkUmVzb3VyY2VzLnNpemUoKSA+IGN1cnNvcikgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gZG9lcyB0aGUgd3JhcHBlZCBpdGVyYXRvciBhbnkgbW9yZSByZXNvdXJjZSA/CkBAIC0xNTcsNiArMTU3LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBuZXh0KCkgewogICAgICAgICAgICAgLy8gZmlyc3QgY2hlY2sgdGhhdCB3ZSBoYXZlIHNvbWUgdG8gZGVsaXZlcgogICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKQEAgLTE2NSwxMCArMTY2LDExIEBACiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGNhY2hlZFJlc291cmNlcykgewogICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgY2FjaGVkIGVudHJ5IGFzIGhhc05leHQgc2hvdWxkIGhhdmUgcHV0IG9uZSBmb3IKICAgICAgICAgICAgICAgICAvLyB0aGlzIGl0ZXJhdG9yCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc291cmNlcy5nZXQoY3VzcnNvcisrKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVkUmVzb3VyY2VzLmdldChjdXJzb3IrKyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Mb2dPdXRwdXRSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xvZ091dHB1dFJlc291cmNlLmphdmEKaW5kZXggOWI0ODY1OC4uMDRlZGU2ZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xvZ091dHB1dFJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xvZ091dHB1dFJlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NSw2ICs1NSw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0QXBwZW5kT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKICAgICB9CkBAIC02Miw2ICs2Myw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG91dHB1dFN0cmVhbTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTWFwcGVkUmVzb3VyY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NYXBwZWRSZXNvdXJjZS5qYXZhCmluZGV4IGMxOGNiZjQuLmM2YjE2N2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NYXBwZWRSZXNvdXJjZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NYXBwZWRSZXNvdXJjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS50b1N0cmluZygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXROYW1lKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL01hcHBlZFJlc291cmNlQ29sbGVjdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL01hcHBlZFJlc291cmNlQ29sbGVjdGlvbi5qYXZhCmluZGV4IDlkZjY5Y2YuLjU0NGM2MGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NYXBwZWRSZXNvdXJjZUNvbGxlY3Rpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTWFwcGVkUmVzb3VyY2VDb2xsZWN0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMCArMTgsMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMTIyLDEwICsxMjQsMTAgQEAKICAgICAvKioKICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1hcHBlZFJlc291cmNlQ29sbGVjdGlvbikgZ2V0Q2hlY2tlZFJlZigpKQotICAgICAgICAgICAgICAgIC5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0LDkgKzEzNiwxMCBAQAogICAgIC8qKgogICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNYXBwZWRSZXNvdXJjZUNvbGxlY3Rpb24pIGdldENoZWNrZWRSZWYoKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQogICAgICAgICBjaGVja0luaXRpYWxpemVkKCk7CiAgICAgICAgIHJldHVybiBjYWNoZUNvbGxlY3Rpb24oKS5zaXplKCk7CkBAIC0xNDUsOSArMTQ4LDEwIEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNYXBwZWRSZXNvdXJjZUNvbGxlY3Rpb24pIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrSW5pdGlhbGl6ZWQoKTsKICAgICAgICAgcmV0dXJuIGNhY2hlQ29sbGVjdGlvbigpLml0ZXJhdG9yKCk7CkBAIC0xNTcsNiArMTYxLDcgQEAKICAgICAgKiBPdmVycmlkZXMgdGhlIGJhc2UgdmVyc2lvbi4KICAgICAgKiBAcGFyYW0gciB0aGUgUmVmZXJlbmNlIHRvIHNldC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZWZpZChSZWZlcmVuY2UgcikgewogICAgICAgICBpZiAobmVzdGVkICE9IG51bGwgfHwgbWFwcGVyICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CkBAIC0xNjgsNiArMTczLDcgQEAKICAgICAgKiBJbXBsZW1lbnQgY2xvbmUuICBUaGUgbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24gYW5kIG1hcHBlciBhcmUgY29waWVkLgogICAgICAqIEByZXR1cm4gYSBjbG9uZWQgaW5zdGFuY2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIE1hcHBlZFJlc291cmNlQ29sbGVjdGlvbiBjID0KQEAgLTE4OCw2ICsxOTQsNyBAQAogICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2s8T2JqZWN0PiBzdGssIFByb2plY3QgcCkKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzQ2hlY2tlZCgpKSB7CkBAIC0yMDksOCArMjE2LDkgQEAKIAogICAgIHByaXZhdGUgdm9pZCBjaGVja0luaXRpYWxpemVkKCkgewogICAgICAgICBpZiAobmVzdGVkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQSBuZXN0ZWQgcmVzb3VyY2UgY29sbGVjdGlvbiBlbGVtZW50IGlzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXF1aXJlZCIsIGdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJBIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uIGVsZW1lbnQgaXMgcmVxdWlyZWQiLAorICAgICAgICAgICAgICAgIGdldExvY2F0aW9uKCkpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICB9CkBAIC0yMjMsNDYgKzIzMSwzNiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29sbGVjdGVkID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbSA9Ci0gICAgICAgICAgICBtYXBwZXIgIT0gbnVsbCA/IG1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpIDogbmV3IElkZW50aXR5TWFwcGVyKCk7Ci0gICAgICAgIGZvciAoUmVzb3VyY2UgciA6IG5lc3RlZCkgewotICAgICAgICAgICAgaWYgKGVuYWJsZU11bHRpcGxlTWFwcGluZ3MpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBuID0gbS5tYXBGaWxlTmFtZShyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZC5hZGQobmV3IE1hcHBlZFJlc291cmNlKHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVyZ2luZ01hcHBlcihuW2ldKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29sbGVjdGVkLmFkZChuZXcgTWFwcGVkUmVzb3VyY2UociwgbSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFwcGVyID09IG51bGwgPyBuZXcgSWRlbnRpdHlNYXBwZXIoKSA6IG1hcHBlci5nZXRJbXBsZW1lbnRhdGlvbigpOworCisgICAgICAgIFN0cmVhbTxNYXBwZWRSZXNvdXJjZT4gc3RyZWFtOworICAgICAgICBpZiAoZW5hYmxlTXVsdGlwbGVNYXBwaW5ncykgeworICAgICAgICAgICAgc3RyZWFtID0gbmVzdGVkLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLmZsYXRNYXAociAtPiBTdHJlYW0ub2YobS5tYXBGaWxlTmFtZShyLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgICAgICAgICAgLm1hcChNZXJnaW5nTWFwcGVyOjpuZXcpCisgICAgICAgICAgICAgICAgICAgIC5tYXAobW0gLT4gbmV3IE1hcHBlZFJlc291cmNlKHIsIG1tKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyZWFtID0gbmVzdGVkLnN0cmVhbSgpLm1hcChyIC0+IG5ldyBNYXBwZWRSZXNvdXJjZShyLCBtKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbGxlY3RlZDsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEZvcm1hdCB0aGlzIHJlc291cmNlIGNvbGxlY3Rpb24gYXMgYSBTdHJpbmcuCiAgICAgICogQHJldHVybiBhIGRlc2NyaXB0aXZlIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS50b1N0cmluZygpOwogICAgICAgICB9Ci0gICAgICAgIEl0ZXJhdG9yPFJlc291cmNlPiBpID0gaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKCFpLmhhc05leHQoKSkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKGkubmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGlzRW1wdHkoKSA/ICIiIDogc3RyZWFtKCkubWFwKE9iamVjdDo6dG9TdHJpbmcpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoRmlsZS5wYXRoU2VwYXJhdG9yKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBNYXBwZWRSZXNvdXJjZUNvbGxlY3Rpb24gZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihNYXBwZWRSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NdWx0aVJvb3RGaWxlU2V0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTXVsdGlSb290RmlsZVNldC5qYXZhCmluZGV4IDExNjE1NTguLmQ4YTdjN2YgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NdWx0aVJvb3RGaWxlU2V0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL011bHRpUm9vdEZpbGVTZXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIHByaXZhdGUgU2V0VHlwZSB0eXBlID0gU2V0VHlwZS5maWxlOwogICAgIHByaXZhdGUgYm9vbGVhbiBjYWNoZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGJhc2VEaXJzID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgIHByaXZhdGUgTGlzdDxGaWxlPiBiYXNlRGlycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgVW5pb24gdW5pb247CiAKICAgICBAT3ZlcnJpZGUKQEAgLTc5LDkgKzc5LDggQEAKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHRocm93IHRvb01hbnlBdHRyaWJ1dGVzKCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGRpcnMgIT0gbnVsbCAmJiBkaXJzLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZHMgPSBkaXJzLnNwbGl0KCIsIik7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBkIDogZHMpIHsKKyAgICAgICAgaWYgKGRpcnMgIT0gbnVsbCAmJiAhZGlycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGQgOiBkaXJzLnNwbGl0KCIsIikpIHsKICAgICAgICAgICAgICAgICBiYXNlRGlycy5hZGQoZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE0LDIyICsxMTMsMjIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTXVsdGlSb290RmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLmNsb25lKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBNdWx0aVJvb3RGaWxlU2V0IGZzID0gKE11bHRpUm9vdEZpbGVTZXQpIHN1cGVyLmNsb25lKCk7Ci0gICAgICAgICAgICBmcy5iYXNlRGlycyA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oYmFzZURpcnMpOwotICAgICAgICAgICAgZnMudW5pb24gPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIGZzOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmNsb25lKCk7CiAgICAgICAgIH0KKyAgICAgICAgZmluYWwgTXVsdGlSb290RmlsZVNldCBmcyA9IChNdWx0aVJvb3RGaWxlU2V0KSBzdXBlci5jbG9uZSgpOworICAgICAgICBmcy5iYXNlRGlycyA9IG5ldyBBcnJheUxpc3Q8PihiYXNlRGlycyk7CisgICAgICAgIGZzLnVuaW9uID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGZzOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yIG9mIFJlc291cmNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTXVsdGlSb290RmlsZVNldCkgZ2V0UmVmKGdldFByb2plY3QoKSkpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXRlcmF0b3IoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbWVyZ2UoKS5pdGVyYXRvcigpOwogICAgIH0KQEAgLTEzOCw5ICsxMzcsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE11bHRpUm9vdEZpbGVTZXQpIGdldFJlZihnZXRQcm9qZWN0KCkpKS5zaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuc2l6ZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtZXJnZSgpLnNpemUoKTsKICAgICB9CkBAIC0xNDksNiArMTQ5LDcgQEAKICAgICAgKiBBbHdheXMgcmV0dXJucyB0cnVlLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpbmRpY2F0aW5nIHRoYXQgYWxsIGVsZW1lbnRzIHdpbGwgYmUgRmlsZVJlc291cmNlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNjEsMTEgKzE2MiwxNSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChNdWx0aVJvb3RGaWxlU2V0KSBnZXRSZWYoZ2V0UHJvamVjdCgpKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS50b1N0cmluZygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtZXJnZSgpLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBNdWx0aVJvb3RGaWxlU2V0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoTXVsdGlSb290RmlsZVNldC5jbGFzcyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgVW5pb24gbWVyZ2UoKSB7CiAgICAgICAgIGlmIChjYWNoZSAmJiB1bmlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gdW5pb247CkBAIC0yMDIsMTIgKzIwNywxNCBAQAogICAgICAgICAgICAgc2V0RGlyKGRpcik7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gdHlwZSA9PSBTZXRUeXBlLmZpbGUKICAgICAgICAgICAgICAgICA/IGRzLmdldEluY2x1ZGVkRmlsZXMoKQogICAgICAgICAgICAgICAgIDogZHMuZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwpAQCAtMjIyLDggKzIyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIGRzID0gZ2V0RGlyZWN0b3J5U2Nhbm5lcihnZXRQcm9qZWN0KCkpOworICAgICAgICAgICAgZmluYWwgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGdldERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgICAgIGludCBjb3VudCA9IHR5cGUgPT0gU2V0VHlwZS5maWxlCiAgICAgICAgICAgICAgICAgPyBkcy5nZXRJbmNsdWRlZEZpbGVzQ291bnQoKQogICAgICAgICAgICAgICAgIDogZHMuZ2V0SW5jbHVkZWREaXJzQ291bnQoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Qcm9wZXJ0eVJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUHJvcGVydHlSZXNvdXJjZS5qYXZhCmluZGV4IGE3Y2VjYjQuLjM5MWY5YmMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Qcm9wZXJ0eVJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Byb3BlcnR5UmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgICAgPSBSZXNvdXJjZS5nZXRNYWdpY051bWJlcigiUHJvcGVydHlSZXNvdXJjZSIuZ2V0Qnl0ZXMoKSk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnB1dFN0cmVhbSBVTlNFVCA9IG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtNjYsNyArNjcsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0VmFsdWUoKTsKICAgICAgICAgfQogICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CiAgICAgICAgIHJldHVybiBwID09IG51bGwgPyBudWxsIDogcC5nZXRQcm9wZXJ0eShnZXROYW1lKCkpOwpAQCAtNzksNyArODAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0VmFsdWUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChQcm9wZXJ0eVJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE9iamVjdFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0T2JqZWN0VmFsdWUoKTsKICAgICAgICAgfQogICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CiAgICAgICAgIHJldHVybiBwID09IG51bGwgPyBudWxsIDogUHJvcGVydHlIZWxwZXIuZ2V0UHJvcGVydHkocCwgZ2V0TmFtZSgpKTsKQEAgLTg5LDYgKzkwLDcgQEAKICAgICAgKiBGaW5kIG91dCB3aGV0aGVyIHRoaXMgUmVzb3VyY2UgZXhpc3RzLgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgUHJvcGVydHkgaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNFeGlzdHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZU9yUHJveHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZWRPclByb3hpZWQoKS5pc0V4aXN0cygpOwpAQCAtMTAxLDYgKzEwMyw3IEBACiAgICAgICogQHJldHVybiB0aGUgc2l6ZSwgYXMgYSBsb25nLCAwIGlmIHRoZSBSZXNvdXJjZSBkb2VzIG5vdCBleGlzdCAoZm9yCiAgICAgICogICAgICAgICBjb21wYXRpYmlsaXR5IHdpdGggamF2YS5pby5GaWxlKSwgb3IgVU5LTk9XTl9TSVpFIGlmIG5vdCBrbm93bi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2VPclByb3h5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWZlcmVuY2VkT3JQcm94aWVkKCkuZ2V0U2l6ZSgpOwpAQCAtMTE1LDE3ICsxMTgsMTYgQEAKICAgICAgKiBAcGFyYW0gbyBvYmplY3QgdG8gY29tcGFyZQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbCB0byBvCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChzdXBlci5lcXVhbHMobykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpc1JlZmVyZW5jZU9yUHJveHkoKSAmJiBnZXRSZWZlcmVuY2VkT3JQcm94aWVkKCkuZXF1YWxzKG8pOworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pIHx8IGlzUmVmZXJlbmNlT3JQcm94eSgpICYmIGdldFJlZmVyZW5jZWRPclByb3hpZWQoKS5lcXVhbHMobyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgUmVzb3VyY2UuCiAgICAgICogQHJldHVybiBoYXNoIGNvZGUgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZU9yUHJveHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZWRPclByb3hpZWQoKS5oYXNoQ29kZSgpOwpAQCAtMTM2LDYgKzEzOCw3IEBACiAgICAgLyoqCiAgICAgICoge0Bpbmhlcml0RG9jfQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZU9yUHJveHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZmVyZW5jZWRPclByb3hpZWQoKS50b1N0cmluZygpOwpAQCAtMTUxLDYgKzE1NCw3IEBACiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBJbnB1dFN0cmVhbXMgYXJlIG5vdAogICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlT3JQcm94eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmZXJlbmNlZE9yUHJveGllZCgpLmdldElucHV0U3RyZWFtKCk7CkBAIC0xNjcsNiArMTcxLDcgQEAKICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIE91dHB1dFN0cmVhbXMgYXJlIG5vdAogICAgICAqICAgICAgICAgc3VwcG9ydGVkIGZvciB0aGlzIFJlc291cmNlIHR5cGUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2VPclByb3h5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWZlcmVuY2VkT3JQcm94aWVkKCkuZ2V0T3V0cHV0U3RyZWFtKCk7CkBAIC0xOTQsNyArMTk5LDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVmZXJlbmNlZE9yUHJveGllZCgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoUmVzb3VyY2UuY2xhc3MsICJyZXNvdXJjZSIpOworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlZigpOwogICAgICAgICB9CiAgICAgICAgIE9iamVjdCBvID0gZ2V0T2JqZWN0VmFsdWUoKTsKICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXNvdXJjZSkgewpAQCAtMjAzLDQgKzIwOCw5IEBACiAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIlRoaXMgUHJvcGVydHlSZXNvdXJjZSBkb2VzIG5vdCByZWZlcmVuY2Ugb3IgcHJveHkgYW5vdGhlciBSZXNvdXJjZSIpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQcm9wZXJ0eVJlc291cmNlIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUHJvcGVydHlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Jlc291cmNlRGVjb3JhdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VEZWNvcmF0b3IuamF2YQppbmRleCAyZDg3ZmIxLi5iZDcyZDU1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VEZWNvcmF0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VEZWNvcmF0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU5LDEyICs1OSwxMiBAQAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIGFkZENvbmZpZ3VyZWQoUmVzb3VyY2VDb2xsZWN0aW9uIGEpIHsKICAgICAgICAgY2hlY2tDaGlsZHJlbkFsbG93ZWQoKTsKICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcmVzb3VyY2UiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAieW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSByZXNvdXJjZSIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhLnNpemUoKSAhPSAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIm9ubHkgc2luZ2xlIGFyZ3VtZW50IHJlc291cmNlIGNvbGxlY3Rpb25zIGFyZSBzdXBwb3J0ZWQiKTsKICAgICAgICAgfQogICAgICAgICBzZXRDaGVja2VkKGZhbHNlKTsKICAgICAgICAgcmVzb3VyY2UgPSBhLml0ZXJhdG9yKCkubmV4dCgpOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlIGdldFJlc291cmNlKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpOworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVzb3VyY2UuY2xhc3MpOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIm5vIHJlc291cmNlIHNwZWNpZmllZCIpOwpAQCAtMjM4LDYgKzIzOCw3IEBACiAgICAgICogQHBhcmFtIG5hbWUgbm90IHVzZWQuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgY2FuJ3QgY2hhbmdlIHRoZSBuYW1lIG9mIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREYXRhVHlwZU5hbWUoKSk7CkBAIC0yNDcsNiArMjQ4LDcgQEAKICAgICAgKiBTZXQgdGhlIGV4aXN0cyBhdHRyaWJ1dGUuCiAgICAgICogQHBhcmFtIGV4aXN0cyBpZiB0cnVlLCB0aGlzIHJlc291cmNlIGV4aXN0cy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRFeGlzdHMoYm9vbGVhbiBleGlzdHMpIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgY2FuJ3QgY2hhbmdlIHRoZSBleGlzdHMgc3RhdGUgb2YgYSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERhdGFUeXBlTmFtZSgpKTsKQEAgLTI1Nyw2ICsyNTksNyBAQAogICAgICAqIEBwYXJhbSBsYXN0bW9kaWZpZWQgbm90IHVzZWQuCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBhbHdheXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0TGFzdE1vZGlmaWVkKGxvbmcgbGFzdG1vZGlmaWVkKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInlvdSBjYW4ndCBjaGFuZ2UgdGhlIHRpbWVzdGFtcCBvZiBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZ2V0RGF0YVR5cGVOYW1lKCkpOwpAQCAtMjY3LDYgKzI3MCw3IEBACiAgICAgICogQHBhcmFtIGRpcmVjdG9yeSBub3QgdXNlZC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXREaXJlY3RvcnkoYm9vbGVhbiBkaXJlY3RvcnkpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigieW91IGNhbid0IGNoYW5nZSB0aGUgZGlyZWN0b3J5IHN0YXRlIG9mIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREYXRhVHlwZU5hbWUoKSk7CkBAIC0yNzcsNiArMjgxLDcgQEAKICAgICAgKiBAcGFyYW0gc2l6ZSBub3QgdXNlZC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGFsd2F5cy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTaXplKGxvbmcgc2l6ZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ5b3UgY2FuJ3QgY2hhbmdlIHRoZSBzaXplIG9mIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXREYXRhVHlwZU5hbWUoKSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VMaXN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VMaXN0LmphdmEKaW5kZXggMDFhZGM1My4uMjkyNWNiNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Jlc291cmNlTGlzdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZUxpc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKQEAgLTM3LDcgKzM4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogCiAvKioKICAqIFJlYWRzIGEgcmVzb3VyY2UgYXMgdGV4dCBkb2N1bWVudCBhbmQgY3JlYXRlcyBhIHJlc291cmNlIGZvciBlYWNoCkBAIC00NSw4ICs0NSw4IEBACiAgKiBAc2luY2UgQW50IDEuOC4wCiAgKi8KIHB1YmxpYyBjbGFzcyBSZXNvdXJjZUxpc3QgZXh0ZW5kcyBEYXRhVHlwZSBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8RmlsdGVyQ2hhaW4+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiB0ZXh0RG9jdW1lbnRzID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucyA9IG5ldyBWZWN0b3I8PigpOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlc291cmNlQ29sbGVjdGlvbj4gdGV4dERvY3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgZmluYWwgVW5pb24gY2FjaGVkUmVzb3VyY2VzID0gbmV3IFVuaW9uKCk7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNhY2hlZCA9IGZhbHNlOwogICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKQEAgLTg4LDggKzg4LDggQEAKICAgICAgKgogICAgICAqIDxwPgogICAgICAqIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZQotICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPgotICAgICAqIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KKyAgICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCiAgICAgICogPC9wPgogICAgICAqCiAgICAgICogQHBhcmFtIGVuY29kaW5nIFN0cmluZwpAQCAtMTA3LDcgKzEwNyw3IEBACiAgICAgICogYmUgY29uc2lkZXJlZCByZWxhdGl2ZSB0byBhIGNlcnRhaW4gYmFzZSBkaXJlY3RvcnkuCiAgICAgICoKICAgICAgKiBAcGFyYW0gYmFzZURpciB0aGUgYmFzZWRpcgotICAgICAqIEBzaW5jZSBBbnQgMS45LjEyCisgICAgICogQHNpbmNlIEFudCAxLjEwLjQKICAgICAgKi8KICAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRCYXNlZGlyKEZpbGUgYmFzZURpcikgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewpAQCAtMTIyLDExICsxMjIsMTIgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSByIFJlZmVyZW5jZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlZmlkKFJlZmVyZW5jZSByKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgdG9vTWFueUF0dHJpYnV0ZXMoKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyQ2hhaW5zLnNpemUoKSA+IDAgfHwgdGV4dERvY3VtZW50cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghZmlsdGVyQ2hhaW5zLmlzRW1wdHkoKSB8fCAhdGV4dERvY3VtZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CiAgICAgICAgIH0KICAgICAgICAgc3VwZXIuc2V0UmVmaWQocik7CkBAIC0xMzksOSArMTQwLDEwIEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIGEgImZhaWwtZmFzdCIgSXRlcmF0b3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUxpc3QpIGdldENoZWNrZWRSZWYoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYWNoZSgpLml0ZXJhdG9yKCk7CiAgICAgfQpAQCAtMTUxLDkgKzE1MywxMCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZUxpc3QpIGdldENoZWNrZWRSZWYoKSkuc2l6ZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNpemUoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2FjaGUoKS5zaXplKCk7CiAgICAgfQpAQCAtMTYzLDkgKzE2NiwxMCBAQAogICAgICAqCiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgaXMgYSBmaWxlc3lzdGVtLW9ubHkgcmVzb3VyY2UgY29sbGVjdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlTGlzdCkgZ2V0Q2hlY2tlZFJlZigpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBjYWNoZSgpLmlzRmlsZXN5c3RlbU9ubHkoKTsKICAgICB9CkBAIC0xNzgsNiArMTgyLDcgQEAKICAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpAQCAtMTk4LDY1ICsyMDMsNTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgUmVzb3VyY2VMaXN0IGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVzb3VyY2VMaXN0LmNsYXNzKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCBSZXNvdXJjZUNvbGxlY3Rpb24gY2FjaGUoKSB7CiAgICAgICAgIGlmICghY2FjaGVkKSB7CiAgICAgICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgICAgICBmb3IgKFJlc291cmNlQ29sbGVjdGlvbiByYyA6IHRleHREb2N1bWVudHMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFJlc291cmNlIHIgOiByYykgewotICAgICAgICAgICAgICAgICAgICBjYWNoZWRSZXNvdXJjZXMuYWRkKHJlYWQocikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHREb2N1bWVudHMuc3RyZWFtKCkuZmxhdE1hcChSZXNvdXJjZUNvbGxlY3Rpb246OnN0cmVhbSkKKyAgICAgICAgICAgICAgICAubWFwKHRoaXM6OnJlYWQpLmZvckVhY2goY2FjaGVkUmVzb3VyY2VzOjphZGQpOwogICAgICAgICAgICAgY2FjaGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gY2FjaGVkUmVzb3VyY2VzOwogICAgIH0KIAogICAgIHByaXZhdGUgUmVzb3VyY2VDb2xsZWN0aW9uIHJlYWQoUmVzb3VyY2UgcikgewotICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyLmdldElucHV0U3RyZWFtKCkpOwotICAgICAgICAgICAgUmVhZGVyIGlucHV0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoYmlzLCBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDaGFpblJlYWRlckhlbHBlciBjcmggPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoKTsKLSAgICAgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKGlucHV0KTsKLSAgICAgICAgICAgIGNyaC5zZXRGaWx0ZXJDaGFpbnMoZmlsdGVyQ2hhaW5zKTsKLSAgICAgICAgICAgIGNyaC5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG9wZW4ocikpKSB7CiAgICAgICAgICAgICBVbmlvbiBzdHJlYW1SZXNvdXJjZXMgPSBuZXcgVW5pb24oKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihjcmguZ2V0QXNzZW1ibGVkUmVhZGVyKCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBzdHJlYW1SZXNvdXJjZXMuc2V0Q2FjaGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtUmVzb3VyY2VzLmFkZChwYXJzZShsaW5lKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgc3RyZWFtUmVzb3VyY2VzLnNldENhY2hlKHRydWUpOworICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkubWFwKHRoaXM6OnBhcnNlKS5mb3JFYWNoKHN0cmVhbVJlc291cmNlczo6YWRkKTsKICAgICAgICAgICAgIHJldHVybiBzdHJlYW1SZXNvdXJjZXM7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCByZXNvdXJjZSAiICsgci5nZXROYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6ICIgKyBpb2UsIGlvZSwgZ2V0TG9jYXRpb24oKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoYmlzKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgUmVhZGVyIG9wZW4oUmVzb3VyY2UgcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhaW5SZWFkZXJIZWxwZXIgY3JoID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7CisgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHIuZ2V0SW5wdXRTdHJlYW0oKSksIGVuY29kaW5nID09IG51bGwKKyAgICAgICAgICAgICAgICA/IENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSA6IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZykpKTsKKyAgICAgICAgY3JoLnNldEZpbHRlckNoYWlucyhmaWx0ZXJDaGFpbnMpOworICAgICAgICBjcmguc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICByZXR1cm4gY3JoLmdldEFzc2VtYmxlZFJlYWRlcigpOworICAgIH0KKwogICAgIHByaXZhdGUgUmVzb3VyY2UgcGFyc2UoZmluYWwgU3RyaW5nIGxpbmUpIHsKLSAgICAgICAgUHJvcGVydHlIZWxwZXIgcHJvcGVydHlIZWxwZXIKLSAgICAgICAgICAgID0gKFByb3BlcnR5SGVscGVyKSBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOworICAgICAgICBQcm9wZXJ0eUhlbHBlciBwcm9wZXJ0eUhlbHBlciA9CisgICAgICAgICAgICBQcm9wZXJ0eUhlbHBlci5nZXRQcm9wZXJ0eUhlbHBlcihnZXRQcm9qZWN0KCkpOwogICAgICAgICBPYmplY3QgZXhwYW5kZWQgPSBwcm9wZXJ0eUhlbHBlci5wYXJzZVByb3BlcnRpZXMobGluZSk7CiAgICAgICAgIGlmIChleHBhbmRlZCBpbnN0YW5jZW9mIFJlc291cmNlKSB7CiAgICAgICAgICAgICByZXR1cm4gKFJlc291cmNlKSBleHBhbmRlZDsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgZXhwYW5kZWRMaW5lID0gZXhwYW5kZWQudG9TdHJpbmcoKTsKLSAgICAgICAgaW50IGNvbG9uID0gZXhwYW5kZWRMaW5lLmluZGV4T2YoIjoiKTsKLSAgICAgICAgaWYgKGNvbG9uICE9IC0xKSB7CisgICAgICAgIGlmIChleHBhbmRlZExpbmUuY29udGFpbnMoIjoiKSkgewogICAgICAgICAgICAgLy8gY291bGQgYmUgYW4gVVJMIG9yIGFuIGFic29sdXRlIGZpbGUgb24gYW4gT1Mgd2l0aCBkcml2ZXMKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkxSZXNvdXJjZShleHBhbmRlZExpbmUpOwpAQCAtMjc0LDQgKzI2NSw1IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBGaWxlUmVzb3VyY2UoZ2V0UHJvamVjdCgpLCBleHBhbmRlZExpbmUpOwogICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Jlc291cmNlcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Jlc291cmNlcy5qYXZhCmluZGV4IDFlMDI5YjIuLmE3NDU1N2EgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZXMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwyMCArMjAsMjAgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKIAogLyoqCiAgKiBHZW5lcmljIFJlc291cmNlQ29sbGVjdGlvbjogRWl0aGVyIHN0b3JlcyBuZXN0ZWQgUmVzb3VyY2VDb2xsZWN0aW9ucywKQEAgLTQzLDEyICs0MywxNSBAQAogcHVibGljIGNsYXNzIFJlc291cmNlcyBleHRlbmRzIERhdGFUeXBlIGltcGxlbWVudHMgUmVzb3VyY2VDb2xsZWN0aW9uIHsKICAgICAvKiogc3RhdGljIGVtcHR5IFJlc291cmNlQ29sbGVjdGlvbiAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVzb3VyY2VDb2xsZWN0aW9uIE5PTkUgPSBuZXcgUmVzb3VyY2VDb2xsZWN0aW9uKCkgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlc3lzdGVtT25seSgpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0lURVJBVE9SOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtNTYsMTIgKzU5LDE1IEBACiAKICAgICAvKiogc3RhdGljIGVtcHR5IEl0ZXJhdG9yICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYXRvcjxSZXNvdXJjZT4gRU1QVFlfSVRFUkFUT1IgPSBuZXcgSXRlcmF0b3I8UmVzb3VyY2U+KCkgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFJlc291cmNlIG5leHQoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNzIsMTYgKzc4LDE5IEBACiAKICAgICAgICAgTXlDb2xsZWN0aW9uKCkgewogICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoKS5zaXplKCk7CiAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0Q2FjaGUoKS5pdGVyYXRvcigpOwogICAgICAgICB9CiAgICAgICAgIHByaXZhdGUgc3luY2hyb25pemVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENhY2hlKCkgewogICAgICAgICAgICAgQ29sbGVjdGlvbjxSZXNvdXJjZT4gY29sbCA9IGNhY2hlZDsKICAgICAgICAgICAgIGlmIChjb2xsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb2xsID0gQ29sbGVjdGlvblV0aWxzLmFzQ29sbGVjdGlvbihuZXcgTXlJdGVyYXRvcigpKTsKKyAgICAgICAgICAgICAgICBjb2xsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgbmV3IE15SXRlcmF0b3IoKS5mb3JFYWNoUmVtYWluaW5nKGNvbGw6OmFkZCk7CiAgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhY2hlZCA9IGNvbGw7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTIsMjcgKzEwMSwzMCBAQAogICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IHJjaSA9IGdldE5lc3RlZCgpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPFJlc291cmNlPiByaSA9IG51bGw7CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IHJpICE9IG51bGwgJiYgcmkuaGFzTmV4dCgpOwogICAgICAgICAgICAgICAgIHdoaWxlICghcmVzdWx0ICYmIHJjaS5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmkgPSAoKFJlc291cmNlQ29sbGVjdGlvbikgcmNpLm5leHQoKSkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICAgICAgcmkgPSByY2kubmV4dCgpLml0ZXJhdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJpLmhhc05leHQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFJlc291cmNlIG5leHQoKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJpLm5leHQoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBWZWN0b3I8UmVzb3VyY2VDb2xsZWN0aW9uPiByYzsKKyAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2VDb2xsZWN0aW9uPiByYzsKICAgICBwcml2YXRlIENvbGxlY3Rpb248UmVzb3VyY2U+IGNvbGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIGNhY2hlID0gZmFsc2U7CiAKQEAgLTE1Miw3ICsxNjQsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChyYyA9PSBudWxsKSB7Ci0gICAgICAgICAgICByYyA9IG5ldyBWZWN0b3I8UmVzb3VyY2VDb2xsZWN0aW9uPigpOworICAgICAgICAgICAgcmMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8PigpKTsKICAgICAgICAgfQogICAgICAgICByYy5hZGQoYyk7CiAgICAgICAgIGludmFsaWRhdGVFeGlzdGluZ0l0ZXJhdG9ycygpOwpAQCAtMTY0LDYgKzE3Niw3IEBACiAgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgogICAgICAqIEByZXR1cm4gYW4gSXRlcmF0b3Igb2YgUmVzb3VyY2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ZXJhdG9yKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CkBAIC0xNzYsNiArMTg5LDcgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgYXMgaW50LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuc2l6ZSgpOwpAQCAtMTg4LDQwICsyMDIsMzEgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiB0cnVlIGlmIGFsbCBSZXNvdXJjZXMgcmVwcmVzZW50IGZpbGVzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvcjxSZXNvdXJjZUNvbGxlY3Rpb24+IGkgPSBnZXROZXN0ZWQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGlmICghaS5uZXh0KCkuaXNGaWxlc3lzdGVtT25seSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZ2V0TmVzdGVkKCkuc3RyZWFtKCkKKyAgICAgICAgICAgIC5hbGxNYXRjaChSZXNvdXJjZUNvbGxlY3Rpb246OmlzRmlsZXN5c3RlbU9ubHkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEZvcm1hdCB0aGlzIDxjb2RlPlJlc291cmNlczwvY29kZT4gYXMgYSBTdHJpbmcuCiAgICAgICogQHJldHVybiBhIGRlc2NyaXB0aXZlIDxjb2RlPlN0cmluZzwvY29kZT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkudG9TdHJpbmcoKTsKICAgICAgICAgfQogICAgICAgICB2YWxpZGF0ZSgpOwogICAgICAgICBpZiAoY29sbCA9PSBudWxsIHx8IGNvbGwuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IgKFJlc291cmNlIHIgOiBjb2xsKSB7Ci0gICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvckNoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gY29sbC5zdHJlYW0oKS5tYXAoT2JqZWN0Ojp0b1N0cmluZykKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZyhGaWxlLnBhdGhTZXBhcmF0b3IpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzMSw2ICsyMzYsNyBAQAogICAgICAqIEBwYXJhbSBwICAgdGhlIHByb2plY3QgdG8gdXNlIHRvIGRlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2VzLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjazxPYmplY3Q+IHN0aywgUHJvamVjdCBwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKQEAgLTI2MCw4ICsyNjYsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgUmVzb3VyY2VDb2xsZWN0aW9uLgogICAgICAqLwogICAgIHByaXZhdGUgUmVzb3VyY2VDb2xsZWN0aW9uIGdldFJlZigpIHsKLSAgICAgICAgcmV0dXJuIChSZXNvdXJjZUNvbGxlY3Rpb24pIGdldENoZWNrZWRSZWYoCi0gICAgICAgICAgICBSZXNvdXJjZUNvbGxlY3Rpb24uY2xhc3MsICJSZXNvdXJjZUNvbGxlY3Rpb24iKTsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVzb3VyY2VDb2xsZWN0aW9uLmNsYXNzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewpAQCAtMjcwLDYgKzI3NSw2IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IGdldE5lc3RlZCgpIHsKLSAgICAgICAgcmV0dXJuIHJjID09IG51bGwgPyBDb2xsZWN0aW9ucy48UmVzb3VyY2VDb2xsZWN0aW9uPiBlbXB0eUxpc3QoKSA6IHJjOworICAgICAgICByZXR1cm4gcmMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogcmM7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Jlc3RyaWN0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzdHJpY3QuamF2YQppbmRleCAyZWExYTg2Li5lMmFjZGI3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzdHJpY3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzdHJpY3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDEzICszOSw5IEBACiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZXN0cmljdCB0aGUgbmVzdGVkIFJlc291cmNlQ29sbGVjdGlvbiBiYXNlZCBvbiB0aGUgbmVzdGVkIHNlbGVjdG9ycy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWx0ZXJSZXNvdXJjZShSZXNvdXJjZSByKSB7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlc291cmNlU2VsZWN0b3I+IGkgPSBnZXRTZWxlY3RvcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFpLm5leHQoKS5pc1NlbGVjdGVkKHIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVNlbGVjdG9ycygpLnN0cmVhbSgpLmFueU1hdGNoKHJzZWwgLT4gIXJzZWwuaXNTZWxlY3RlZChyKSk7CiAgICAgICAgIH0KICAgICB9OwogCkBAIC04NCw2ICs4MCw3IEBACiAgICAgICogQWRkIGEgUmVzb3VyY2VTZWxlY3Rvci4KICAgICAgKiBAcGFyYW0gcyB0aGUgUmVzb3VyY2VTZWxlY3RvciB0byBhZGQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChSZXNvdXJjZVNlbGVjdG9yIHMpIHsKICAgICAgICAgaWYgKHMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtOTYsOSArOTMsMTAgQEAKICAgICAgKiBGdWxmaWxsIHRoZSBSZXNvdXJjZUNvbGxlY3Rpb24gY29udHJhY3QuCiAgICAgICogQHJldHVybiBhbiBJdGVyYXRvciBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXN0cmljdCkgZ2V0Q2hlY2tlZFJlZigpKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLml0ZXJhdG9yKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gdy5pdGVyYXRvcigpOwpAQCAtMTA4LDkgKzEwNiwxMCBAQAogICAgICAqIEZ1bGZpbGwgdGhlIFJlc291cmNlQ29sbGVjdGlvbiBjb250cmFjdC4KICAgICAgKiBAcmV0dXJuIG51bWJlciBvZiBlbGVtZW50cyBhcyBpbnQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc3RyaWN0KSBnZXRDaGVja2VkUmVmKCkpLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zaXplKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gdy5zaXplKCk7CkBAIC0xMjAsOSArMTE5LDEwIEBACiAgICAgICogRnVsZmlsbCB0aGUgUmVzb3VyY2VDb2xsZWN0aW9uIGNvbnRyYWN0LgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgZmlsZXN5c3RlbS1vbmx5IHJlc291cmNlIGNvbGxlY3Rpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRmlsZXN5c3RlbU9ubHkoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXN0cmljdCkgZ2V0Q2hlY2tlZFJlZigpKS5pc0ZpbGVzeXN0ZW1Pbmx5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNGaWxlc3lzdGVtT25seSgpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKICAgICAgICAgcmV0dXJuIHcuaXNGaWxlc3lzdGVtT25seSgpOwpAQCAtMTMyLDE0ICsxMzIsMTYgQEAKICAgICAgKiBGb3JtYXQgdGhpcyBSZXN0cmljdCBjb2xsZWN0aW9uIGFzIGEgU3RyaW5nLgogICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGlzIGNvbGxlY3Rpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkudG9TdHJpbmcoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiB3LnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoU3RhY2s8T2JqZWN0PiBzdGssIFByb2plY3QgcCkgewogICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE1Myw0ICsxNTUsOCBAQAogICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgUmVzdHJpY3QgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihSZXN0cmljdC5jbGFzcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NpemVMaW1pdENvbGxlY3Rpb24uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9TaXplTGltaXRDb2xsZWN0aW9uLmphdmEKaW5kZXggMjk5MmQ1Yi4uM2FjMzExOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NpemVMaW1pdENvbGxlY3Rpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU2l6ZUxpbWl0Q29sbGVjdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTAsMTAgKzUwLDkgQEAKICAgICAgKiBFZmZpY2llbnQgc2l6ZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgKiBAcmV0dXJuIGludCBzaXplCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaW50IHN6ID0gZ2V0UmVzb3VyY2VDb2xsZWN0aW9uKCkuc2l6ZSgpOwotICAgICAgICBpbnQgY3QgPSBnZXRWYWxpZENvdW50KCk7Ci0gICAgICAgIHJldHVybiBzeiA8IGN0ID8gc3ogOiBjdDsKKyAgICAgICAgcmV0dXJuIE1hdGgubWluKGdldFJlc291cmNlQ29sbGVjdGlvbigpLnNpemUoKSwgZ2V0VmFsaWRDb3VudCgpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Tb3J0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU29ydC5qYXZhCmluZGV4IGI0ZGM4OGMuLjQ2ODg2ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Tb3J0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1NvcnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE5ICsxOCwxNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXM7CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkRhdGFUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnMuRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9ycy5SZXNvdXJjZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Db2xsZWN0aW9uVXRpbHM7CiAKIC8qKgogICogUmVzb3VyY2VDb2xsZWN0aW9uIHRoYXQgc29ydHMgYW5vdGhlciBSZXNvdXJjZUNvbGxlY3Rpb24uCkBAIC00OCwxNSArNDQsMTAgQEAKICAgICAgKiBTb3J0IHRoZSBjb250YWluZWQgZWxlbWVudHMuCiAgICAgICogQHJldHVybiBhIENvbGxlY3Rpb24gb2YgUmVzb3VyY2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ29sbGVjdGlvbjxSZXNvdXJjZT4gZ2V0Q29sbGVjdGlvbigpIHsKLSAgICAgICAgUmVzb3VyY2VDb2xsZWN0aW9uIHJjID0gZ2V0UmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0gICAgICAgIEl0ZXJhdG9yPFJlc291cmNlPiBpdGVyID0gcmMuaXRlcmF0b3IoKTsKLSAgICAgICAgaWYgKCEoaXRlci5oYXNOZXh0KCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PFJlc291cmNlPiByZXN1bHQgPSAoTGlzdDxSZXNvdXJjZT4pIENvbGxlY3Rpb25VdGlscy5hc0NvbGxlY3Rpb24oaXRlcik7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCBjb21wKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlQ29sbGVjdGlvbigpLnN0cmVhbSgpLm1hcChSZXNvdXJjZS5jbGFzczo6Y2FzdCkKKyAgICAgICAgICAgIC5zb3J0ZWQoY29tcCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgwLDYgKzcxLDcgQEAKICAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1N0cmluZ1Jlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU3RyaW5nUmVzb3VyY2UuamF2YQppbmRleCA5YTUyOTgyLi5lZGU0MTU0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU3RyaW5nUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvU3RyaW5nUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0OSw4ICsxNDksOCBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXRTaXplKCkgewotICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKSA/ICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2l6ZSgpCi0gICAgICAgICAgICAgICAgOiBnZXRDb250ZW50KCkubGVuZ3RoKCk7CisgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpID8gZ2V0UmVmKCkuZ2V0U2l6ZSgpCisgICAgICAgICAgICA6IGdldENvbnRlbnQoKS5sZW5ndGgoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgeyAvL05PU09OQVIKICAgICAgICAgLy8gc3VwZXIuZXF1YWxzICsgc3VwZXIuY29tcGFyZVRvIGFyZSBjb25zaXN0ZW50IHdpdGggdGhpcyBpbXBsZW1lbnRhdGlvbgogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmhhc2hDb2RlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCkgKiBTVFJJTkdfTUFHSUM7CiAgICAgfQpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgIH0KICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBnZXRDb250ZW50KCk7CiAgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKQEAgLTIwOSw3ICsyMDksNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0VmFsdWUoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24oKTsKQEAgLTIzNywxOSArMjM3LDkgQEAKICAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgb25seSBmb3IgdXNlIGJ5IG91ciBwcml2YXRlIGhlbHBlciBvdXRwdXQgc3RyZWFtLgotICAgICAqIEl0IGNvbnRhaW5zIHNwZWNpZmljIGxvZ2ljIGZvciBleHBhbmRpbmcgcHJvcGVydGllcy4KLSAgICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0VmFsdWVGcm9tT3V0cHV0U3RyZWFtKFN0cmluZyBvdXRwdXQpIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlOwotICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIHZhbHVlID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKG91dHB1dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IG91dHB1dDsKLSAgICAgICAgfQotICAgICAgICBzZXRWYWx1ZSh2YWx1ZSk7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZ1Jlc291cmNlIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoU3RyaW5nUmVzb3VyY2UuY2xhc3MpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgU3RyaW5nUmVzb3VyY2VGaWx0ZXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewpAQCAtMjY2LDcgKzI1NiwxOCBAQAogICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IGVuY29kaW5nID09IG51bGwKICAgICAgICAgICAgICAgICAgICAgPyBiYW9zLnRvU3RyaW5nKCkgOiBiYW9zLnRvU3RyaW5nKGVuY29kaW5nKTsKIAotICAgICAgICAgICAgU3RyaW5nUmVzb3VyY2UudGhpcy5zZXRWYWx1ZUZyb21PdXRwdXRTdHJlYW0ocmVzdWx0KTsKKyAgICAgICAgICAgIHNldFZhbHVlRnJvbU91dHB1dFN0cmVhbShyZXN1bHQpOwogICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFZhbHVlRnJvbU91dHB1dFN0cmVhbShTdHJpbmcgb3V0cHV0KSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWU7CisgICAgICAgICAgICBpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFByb2plY3QoKS5yZXBsYWNlUHJvcGVydGllcyhvdXRwdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG91dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTsKKyAgICAgICAgfQorCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RhclJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2UuamF2YQppbmRleCBiOTA2YTY1Li45ZTEzN2NjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDggKzM3LDggQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIHVzZXJOYW1lID0gIiI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgZ3JvdXBOYW1lID0gIiI7Ci0gICAgcHJpdmF0ZSBpbnQgICAgdWlkOwotICAgIHByaXZhdGUgaW50ICAgIGdpZDsKKyAgICBwcml2YXRlIGxvbmcgICB1aWQ7CisgICAgcHJpdmF0ZSBsb25nICAgZ2lkOwogCiAgICAgLyoqCiAgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KQEAgLTc0LDEzICs3NCwxNCBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlIHRhciBmaWxlIGNhbm5vdCBiZSBvcGVuZWQsCiAgICAgICogICAgICAgICBvciB0aGUgZW50cnkgY2Fubm90IGJlIHJlYWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0SW5wdXRTdHJlYW0oKTsKICAgICAgICAgfQogICAgICAgICBSZXNvdXJjZSBhcmNoaXZlID0gZ2V0QXJjaGl2ZSgpOwogICAgICAgICBmaW5hbCBUYXJJbnB1dFN0cmVhbSBpID0gbmV3IFRhcklucHV0U3RyZWFtKGFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgIFRhckVudHJ5IHRlID0gbnVsbDsKKyAgICAgICAgVGFyRW50cnkgdGU7CiAgICAgICAgIHdoaWxlICgodGUgPSBpLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAodGUuZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CkBAIC0xMDAsOSArMTAxLDEwIEBACiAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiBPdXRwdXRTdHJlYW1zIGFyZSBub3QKICAgICAgKiAgICAgICAgIHN1cHBvcnRlZCBmb3IgdGhpcyBSZXNvdXJjZSB0eXBlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKICAgICAgICAgICAgICJVc2UgdGhlIHRhciB0YXNrIGZvciB0YXIgb3V0cHV0LiIpOwpAQCAtMTEzLDcgKzExNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFRhclJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFVzZXJOYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0VXNlck5hbWUoKTsKICAgICAgICAgfQogICAgICAgICBjaGVja0VudHJ5KCk7CiAgICAgICAgIHJldHVybiB1c2VyTmFtZTsKQEAgLTEyNCw3ICsxMjYsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXAoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChUYXJSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRHcm91cCgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEdyb3VwKCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICByZXR1cm4gZ3JvdXBOYW1lOwpAQCAtMTMyLDM0ICsxMzQsNTEgQEAKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gdGhlIHVpZCBmb3IgdGhlIHRhciBlbnRyeQorICAgICAqIEBzaW5jZSAxLjEwLjQKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFVpZCgpIHsKKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nVWlkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoVGFyUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0VWlkKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TG9uZ1VpZCgpOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrRW50cnkoKTsKICAgICAgICAgcmV0dXJuIHVpZDsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBnaWQgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKiBAcmV0dXJuIHRoZSB1aWQgZm9yIHRoZSB0YXIgZW50cnkKICAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEdpZCgpIHsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBpbnQgZ2V0VWlkKCkgeworICAgICAgICByZXR1cm4gKGludCkgZ2V0TG9uZ1VpZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGdpZCBmb3IgdGhlIHRhciBlbnRyeQorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nR2lkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoVGFyUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0R2lkKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TG9uZ0dpZCgpOwogICAgICAgICB9CiAgICAgICAgIGNoZWNrRW50cnkoKTsKICAgICAgICAgcmV0dXJuIGdpZDsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1aWQgZm9yIHRoZSB0YXIgZW50cnkKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBpbnQgZ2V0R2lkKCkgeworICAgICAgICByZXR1cm4gKGludCkgZ2V0TG9uZ0dpZCgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIGZldGNoZXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbmFtZWQgZW50cnkgaW5zaWRlIHRoZSBhcmNoaXZlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGZldGNoRW50cnkoKSB7CiAgICAgICAgIFJlc291cmNlIGFyY2hpdmUgPSBnZXRBcmNoaXZlKCk7Ci0gICAgICAgIFRhcklucHV0U3RyZWFtIGkgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaSA9IG5ldyBUYXJJbnB1dFN0cmVhbShhcmNoaXZlLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICB0cnkgKFRhcklucHV0U3RyZWFtIGkgPSBuZXcgVGFySW5wdXRTdHJlYW0oYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSgpKSkgewogICAgICAgICAgICAgVGFyRW50cnkgdGUgPSBudWxsOwogICAgICAgICAgICAgd2hpbGUgKCh0ZSA9IGkuZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAodGUuZ2V0TmFtZSgpLmVxdWFscyhnZXROYW1lKCkpKSB7CkBAIC0xNzAsMTIgKzE4OSwxNSBAQAogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICBsb2coZS5nZXRNZXNzYWdlKCksIFByb2plY3QuTVNHX0RFQlVHKTsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpKTsKICAgICAgICAgfQogICAgICAgICBzZXRFbnRyeShudWxsKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGFyUmVzb3VyY2UgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihUYXJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHNldEVudHJ5KFRhckVudHJ5IGUpIHsKICAgICAgICAgaWYgKGUgPT0gbnVsbCkgewogICAgICAgICAgICAgc2V0RXhpc3RzKGZhbHNlKTsKQEAgLTE4OSw4ICsyMTEsOCBAQAogICAgICAgICBzZXRNb2RlKGUuZ2V0TW9kZSgpKTsKICAgICAgICAgdXNlck5hbWUgPSBlLmdldFVzZXJOYW1lKCk7CiAgICAgICAgIGdyb3VwTmFtZSA9IGUuZ2V0R3JvdXBOYW1lKCk7Ci0gICAgICAgIHVpZCA9IGUuZ2V0VXNlcklkKCk7Ci0gICAgICAgIGdpZCA9IGUuZ2V0R3JvdXBJZCgpOworICAgICAgICB1aWQgPSBlLmdldExvbmdVc2VySWQoKTsKKyAgICAgICAgZ2lkID0gZS5nZXRMb25nR3JvdXBJZCgpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Rva2Vucy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1Rva2Vucy5qYXZhCmluZGV4IDQ1OGY4YzEuLjM4N2Y4YTMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Ub2tlbnMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVG9rZW5zLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMCArMTksMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TdGFjazsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMzEsNyArMzIsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlQ29sbGVjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbmNhdFJlc291cmNlSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5MaW5lVG9rZW5pemVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVG9rZW5pemVyOwogCkBAIC01MSwzOCArNTEsMzEgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENvbGxlY3Rpb24oKSB7CiAgICAgICAgIFJlc291cmNlQ29sbGVjdGlvbiByYyA9IGdldFJlc291cmNlQ29sbGVjdGlvbigpOwotICAgICAgICBpZiAocmMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgaWYgKHJjLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHRva2VuaXplciA9PSBudWxsKSB7CiAgICAgICAgICAgICB0b2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOwogICAgICAgICB9Ci0gICAgICAgIENvbmNhdFJlc291cmNlSW5wdXRTdHJlYW0gY2F0ID0gbmV3IENvbmNhdFJlc291cmNlSW5wdXRTdHJlYW0ocmMpOwotICAgICAgICBjYXQuc2V0TWFuYWdpbmdDb21wb25lbnQodGhpcyk7Ci0KLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmRyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmRyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNhdCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIHJkciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjYXQsIGVuY29kaW5nKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5TGlzdDxSZXNvdXJjZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZT4oKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgPSB0b2tlbml6ZXIuZ2V0VG9rZW4ocmRyKTsgcyAhPSBudWxsOyBzID0gdG9rZW5pemVyLmdldFRva2VuKHJkcikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBTdHJpbmdSZXNvdXJjZShzKTsKKyAgICAgICAgdHJ5IChDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtIGNhdCA9IG5ldyBDb25jYXRSZXNvdXJjZUlucHV0U3RyZWFtKHJjKTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciByZHIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY2F0LAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9PSBudWxsID8gQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICA6IENoYXJzZXQuZm9yTmFtZShlbmNvZGluZykpKSB7CisgICAgICAgICAgICBjYXQuc2V0TWFuYWdpbmdDb21wb25lbnQodGhpcyk7CisgICAgICAgICAgICBMaXN0PFJlc291cmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgPSB0b2tlbml6ZXIuZ2V0VG9rZW4ocmRyKTsgcyAhPSBudWxsOyBzID0KKyAgICAgICAgICAgICAgICB0b2tlbml6ZXIuZ2V0VG9rZW4ocmRyKSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBzZW5kIHRoZSBQcm9qZWN0IHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBTdHJpbmdSZXNvdXJjZSwgc2luY2UKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2VtYW50aWNzIG9mIHRoYXQgY29uc3RydWN0b3IgY2xlYXJseSBzdGF0ZSB0aGF0IHByb3BlcnR5IHZhbHVlCisgICAgICAgICAgICAgICAgLy8gcmVwbGFjZW1lbnQgdGFrZXMgcGxhY2Ugb24gdGhlIHBhc3NlZCBzdHJpbmcgdmFsdWUuIFdlIGRvbid0IHdhbnQKKyAgICAgICAgICAgICAgICAvLyB0aGF0IHRvIGhhcHBlbi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBTdHJpbmdSZXNvdXJjZShzKTsKICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CiAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChyZXNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgdG9rZW5zIiwgZSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UocmRyKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShjYXQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTcsNiArMTEwLDcgQEAKICAgICAgKiBAcGFyYW0gcCAgIHRoZSBwcm9qZWN0IHRvIHVzZSB0byBkZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlcy4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc0NoZWNrZWQoKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RvdWNoYWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RvdWNoYWJsZS5qYXZhCmluZGV4IDNhNTRhNjkuLmM2ZDcyMGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9Ub3VjaGFibGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVG91Y2hhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVVJMUHJvdmlkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9VUkxQcm92aWRlci5qYXZhCmluZGV4IDgxYmI2NjkuLmI4ZjAyOWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9VUkxQcm92aWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9VUkxQcm92aWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1VSTFJlc291cmNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVVJMUmVzb3VyY2UuamF2YQppbmRleCA2NDNlYzAwLi4xNzcyYjQ1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVVJMUmVzb3VyY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVVJMUmVzb3VyY2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgVVJMIGdldFVSTCgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFVSTFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldFVSTCgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldFVSTCgpOwogICAgICAgICB9CiAgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKGJhc2VVUkwgIT0gbnVsbCkgewpAQCAtMTgwLDEwICsxODAsMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldE5hbWUoKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgbmFtZSA9IGdldFVSTCgpLmdldEZpbGUoKTsKLSAgICAgICAgcmV0dXJuICIiLmVxdWFscyhuYW1lKSA/IG5hbWUgOiBuYW1lLnN1YnN0cmluZygxKTsKKyAgICAgICAgcmV0dXJuIG5hbWUuaXNFbXB0eSgpID8gbmFtZSA6IG5hbWUuc3Vic3RyaW5nKDEpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICAgICAgIHJldHVybiBpc1JlZmVyZW5jZSgpCi0gICAgICAgICAgICA/IGdldENoZWNrZWRSZWYoKS50b1N0cmluZygpIDogU3RyaW5nLnZhbHVlT2YoZ2V0VVJMKCkpOworICAgICAgICAgICAgPyBnZXRSZWYoKS50b1N0cmluZygpIDogU3RyaW5nLnZhbHVlT2YoZ2V0VVJMKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjAxLDcgKzIwMSw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRXhpc3RzKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuaXNFeGlzdHMoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5pc0V4aXN0cygpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpc0V4aXN0cyhmYWxzZSk7CiAgICAgfQpAQCAtMjYyLDE2ICsyNjIsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0TGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFpc0V4aXN0cyhmYWxzZSkpIHsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0RBVEVUSU1FOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB3aXRoQ29ubmVjdGlvbihuZXcgQ29ubmVjdGlvblVzZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIGxvbmcgdXNlQ29ubmVjdGlvbihVUkxDb25uZWN0aW9uIGMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgVU5LTk9XTl9EQVRFVElNRSk7CisgICAgICAgIHJldHVybiB3aXRoQ29ubmVjdGlvbihjIC0+IGNvbm4uZ2V0TGFzdE1vZGlmaWVkKCksIFVOS05PV05fREFURVRJTUUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjgwLDcgKzI3Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzRGlyZWN0b3J5KCkgewogICAgICAgICByZXR1cm4gaXNSZWZlcmVuY2UoKQotICAgICAgICAgICAgPyAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmlzRGlyZWN0b3J5KCkKKyAgICAgICAgICAgID8gZ2V0UmVmKCkuaXNEaXJlY3RvcnkoKQogICAgICAgICAgICAgOiBnZXROYW1lKCkuZW5kc1dpdGgoIi8iKTsKICAgICB9CiAKQEAgLTI5MSwxNiArMjg3LDEyIEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldFNpemUoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRTaXplKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0U2l6ZSgpOwogICAgICAgICB9CiAgICAgICAgIGlmICghaXNFeGlzdHMoZmFsc2UpKSB7CiAgICAgICAgICAgICByZXR1cm4gMEw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdpdGhDb25uZWN0aW9uKG5ldyBDb25uZWN0aW9uVXNlcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyB1c2VDb25uZWN0aW9uKFVSTENvbm5lY3Rpb24gYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubi5nZXRDb250ZW50TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgVU5LTk9XTl9TSVpFKTsKKyAgICAgICAgcmV0dXJuIHdpdGhDb25uZWN0aW9uKGMgLT4gY29ubi5nZXRDb250ZW50TGVuZ3RoKCksIFVOS05PV05fU0laRSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTMsMTUgKzMwNSwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuZXF1YWxzKGFub3RoZXIpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmVxdWFscyhhbm90aGVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYW5vdGhlciA9PSBudWxsIHx8IGFub3RoZXIuZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgVVJMUmVzb3VyY2Ugb3RoZXJ1ID0gKFVSTFJlc291cmNlKSBhbm90aGVyOworICAgICAgICBVUkxSZXNvdXJjZSBvdGhlciA9IChVUkxSZXNvdXJjZSkgYW5vdGhlcjsKICAgICAgICAgcmV0dXJuIGdldFVSTCgpID09IG51bGwKLSAgICAgICAgICAgID8gb3RoZXJ1LmdldFVSTCgpID09IG51bGwKLSAgICAgICAgICAgIDogZ2V0VVJMKCkuZXF1YWxzKG90aGVydS5nZXRVUkwoKSk7CisgICAgICAgICAgICA/IG90aGVyLmdldFVSTCgpID09IG51bGwKKyAgICAgICAgICAgIDogZ2V0VVJMKCkuZXF1YWxzKG90aGVyLmdldFVSTCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzMCw3ICszMjIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmhhc2hDb2RlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE1BR0lDICogKChnZXRVUkwoKSA9PSBudWxsKSA/IE5VTExfVVJMIDogZ2V0VVJMKCkuaGFzaENvZGUoKSk7CiAgICAgfQpAQCAtMzQ1LDcgKzMzNyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldElucHV0U3RyZWFtKCk7CiAgICAgICAgIH0KICAgICAgICAgY29ubmVjdCgpOwogICAgICAgICB0cnkgewpAQCAtMzY2LDcgKzM1OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlKSBnZXRDaGVja2VkUmVmKCkpLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldE91dHB1dFN0cmVhbSgpOwogICAgICAgICB9CiAgICAgICAgIGNvbm5lY3QoKTsKICAgICAgICAgdHJ5IHsKQEAgLTQwOSw2ICs0MDEsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkxSZXNvdXJjZSBnZXRSZWYoKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKFVSTFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDbG9zZXMgdGhlIFVSTCBjb25uZWN0aW9uIGlmOgogICAgICAqIC0gaXQgaXMgb3BlbmVkIChpLmUuIHRoZSBmaWVsZCBjb25uIGlzIG5vdCBudWxsKQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1VuaW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVW5pb24uamF2YQppbmRleCA1YjA3Mzk1Li43Y2Y3MWVlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVW5pb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVW5pb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEyICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CkBAIC04MiwxMCArODIsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBsaXN0KCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoVW5pb24uY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpKS5saXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkubGlzdCgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBnZXRBbGxUb1N0cmluZ3MoKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICAgICAgICByZXR1cm4gc3RyZWFtUmVzb3VyY2VzKCkubWFwKE9iamVjdDo6dG9TdHJpbmcpLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05NCwxNiArOTMsMTYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUmVzb3VyY2VbXSBsaXN0UmVzb3VyY2VzKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoVW5pb24uY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpKS5saXN0UmVzb3VyY2VzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkubGlzdFJlc291cmNlcygpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248UmVzb3VyY2U+IHJlc3VsdCA9IGdldEFsbFJlc291cmNlcygpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFJlc291cmNlW3Jlc3VsdC5zaXplKCldKTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbVJlc291cmNlcygpLnRvQXJyYXkoUmVzb3VyY2VbXTo6bmV3KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBVbmlmeSB0aGUgY29udGFpbmVkIFJlc291cmNlcy4KICAgICAgKiBAcmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBSZXNvdXJjZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248UmVzb3VyY2U+IGdldENvbGxlY3Rpb24oKSB7CiAgICAgICAgIHJldHVybiBnZXRBbGxSZXNvdXJjZXMoKTsKICAgICB9CkBAIC0xMTgsNyArMTE3LDggQEAKICAgICBARGVwcmVjYXRlZAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHByb3RlY3RlZCA8VD4gQ29sbGVjdGlvbjxUPiBnZXRDb2xsZWN0aW9uKGJvb2xlYW4gYXNTdHJpbmcpIHsgLy8gVE9ETyB1bnR5cGFibGUKLSAgICAgICAgcmV0dXJuIGFzU3RyaW5nID8gKENvbGxlY3Rpb248VD4pIGdldEFsbFRvU3RyaW5ncygpIDogKENvbGxlY3Rpb248VD4pIGdldEFsbFJlc291cmNlcygpOworICAgICAgICByZXR1cm4gYXNTdHJpbmcgPyAoQ29sbGVjdGlvbjxUPikgZ2V0QWxsVG9TdHJpbmdzKCkKKyAgICAgICAgICAgIDogKENvbGxlY3Rpb248VD4pIGdldEFsbFJlc291cmNlcygpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTI2LDEyICsxMjYsOCBAQAogICAgICAqIEByZXR1cm4gQ29sbGVjdGlvbiZsdDtTdHJpbmcmZ3Q7CiAgICAgICovCiAgICAgcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRBbGxUb1N0cmluZ3MoKSB7Ci0gICAgICAgIGZpbmFsIFNldDxSZXNvdXJjZT4gYWxsUmVzb3VyY2VzID0gZ2V0QWxsUmVzb3VyY2VzKCk7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhbGxSZXNvdXJjZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChSZXNvdXJjZSByIDogYWxsUmVzb3VyY2VzKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHN0cmVhbVJlc291cmNlcyhPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oTGlua2VkSGFzaFNldDo6bmV3KSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzksMTkgKzEzNSwyMSBAQAogICAgICAqIEByZXR1cm4gU2V0Jmx0O1Jlc291cmNlJmd0OwogICAgICAqLwogICAgIHByb3RlY3RlZCBTZXQ8UmVzb3VyY2U+IGdldEFsbFJlc291cmNlcygpIHsKLSAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZUNvbGxlY3Rpb24+IHJlc291cmNlQ29sbGVjdGlvbnMgPSBnZXRSZXNvdXJjZUNvbGxlY3Rpb25zKCk7Ci0gICAgICAgIGlmIChyZXNvdXJjZUNvbGxlY3Rpb25zLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTGlua2VkSGFzaFNldDxSZXNvdXJjZT4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hTZXQ8UmVzb3VyY2U+KAotICAgICAgICAgICAgICAgIHJlc291cmNlQ29sbGVjdGlvbnMuc2l6ZSgpICogMik7Ci0gICAgICAgIGZvciAoUmVzb3VyY2VDb2xsZWN0aW9uIHJlc291cmNlQ29sbGVjdGlvbiA6IHJlc291cmNlQ29sbGVjdGlvbnMpIHsKLSAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgciA6IHJlc291cmNlQ29sbGVjdGlvbikgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHN0cmVhbVJlc291cmNlcygpCisgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihMaW5rZWRIYXNoU2V0OjpuZXcpKTsKICAgICB9CiAKLX0KKyAgICBwcml2YXRlIFVuaW9uIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoVW5pb24uY2xhc3MpOworICAgIH0KIAorICAgIHByaXZhdGUgU3RyZWFtPD8gZXh0ZW5kcyBSZXNvdXJjZT4gc3RyZWFtUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gc3RyZWFtUmVzb3VyY2VzKEZ1bmN0aW9uLmlkZW50aXR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IFN0cmVhbTw/IGV4dGVuZHMgVD4gc3RyZWFtUmVzb3VyY2VzKAorICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFJlc291cmNlLCA/IGV4dGVuZHMgVD4gbWFwcGVyKSB7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUNvbGxlY3Rpb25zKCkuc3RyZWFtKCkKKyAgICAgICAgICAgIC5mbGF0TWFwKFJlc291cmNlQ29sbGVjdGlvbjo6c3RyZWFtKS5tYXAobWFwcGVyKS5kaXN0aW5jdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9aaXBSZXNvdXJjZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1ppcFJlc291cmNlLmphdmEKaW5kZXggMWRlYzU0Ni4uYmM4NGU4MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1ppcFJlc291cmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1ppcFJlc291cmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5OwpAQCAtMTA2LDcgKzEwNSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKICAgICAgICAgcmV0dXJuIGlzUmVmZXJlbmNlKCkKLSAgICAgICAgICAgID8gKChaaXBSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRFbmNvZGluZygpIDogZW5jb2Rpbmc7CisgICAgICAgICAgICA/IGdldFJlZigpLmdldEVuY29kaW5nKCkgOiBlbmNvZGluZzsKICAgICB9CiAKICAgICAvKioKQEAgLTEyOCwyOCArMTI3LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuICgoUmVzb3VyY2UpIGdldENoZWNrZWRSZWYoKSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRJbnB1dFN0cmVhbSgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFppcEZpbGUgeiA9IG5ldyBaaXBGaWxlKGdldFppcGZpbGUoKSwgZ2V0RW5jb2RpbmcoKSk7Ci0gICAgICAgIFppcEVudHJ5IHplID0gei5nZXRFbnRyeShnZXROYW1lKCkpOwotICAgICAgICBpZiAoemUgPT0gbnVsbCkgewotICAgICAgICAgICAgei5jbG9zZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJubyBlbnRyeSAiICsgZ2V0TmFtZSgpICsgIiBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBnZXRBcmNoaXZlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgRmlsdGVySW5wdXRTdHJlYW0oei5nZXRJbnB1dFN0cmVhbSh6ZSkpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwotICAgICAgICAgICAgICAgIHouY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGdldFppcEVudHJ5U3RyZWFtKG5ldyBaaXBGaWxlKGdldFppcGZpbGUoKSwgZ2V0RW5jb2RpbmcoKSksIGdldE5hbWUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjIsNyArMTQyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgICAgICAiVXNlIHRoZSB6aXAgdGFzayBmb3IgemlwIG91dHB1dC4iKTsKQEAgLTE3NSw3ICsxNTUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBaaXBFeHRyYUZpZWxkW10gZ2V0RXh0cmFGaWVsZHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChaaXBSZXNvdXJjZSkgZ2V0Q2hlY2tlZFJlZigpKS5nZXRFeHRyYUZpZWxkcygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmdldEV4dHJhRmllbGRzKCk7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tFbnRyeSgpOwogICAgICAgICBpZiAoZXh0cmFzID09IG51bGwpIHsKQEAgLTE5NCw2ICsxNzQsMzYgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gSW5wdXRTdHJlYW0gZm9yIHJlYWRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgWmlwRW50cnkKKyAgICAgKiB3aXRoIGF1dG9jbG9zZS4KKyAgICAgKiBAcGFyYW0gemlwRmlsZSBhIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUKKyAgICAgKiBAcGFyYW0gemlwRW50cnkgU3RyaW5nIGEgbmFtZSBvZiBhIHppcCBlbnRyeQorICAgICAqIEByZXR1cm4gYW4gSW5wdXRTdHJlYW0gb2JqZWN0CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgZW50cnkgY2Fubm90IGJlIHJlYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldFppcEVudHJ5U3RyZWFtKFppcEZpbGUgemlwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB6aXBFbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgWmlwRW50cnkgemUgPSB6aXBGaWxlLmdldEVudHJ5KHppcEVudHJ5KTsKKyAgICAgICAgaWYgKHplID09IG51bGwpIHsKKyAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibm8gZW50cnkgIiArIHppcEVudHJ5ICsgIiBpbiAiICsgemlwRmlsZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgRmlsdGVySW5wdXRTdHJlYW0oemlwRmlsZS5nZXRJbnB1dFN0cmVhbSh6ZSkpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOworICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBmZXRjaGVzIGluZm9ybWF0aW9uIGZyb20gdGhlIG5hbWVkIGVudHJ5IGluc2lkZSB0aGUgYXJjaGl2ZS4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBmZXRjaEVudHJ5KCkgewpAQCAtMjA5LDYgKzIxOSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFppcFJlc291cmNlIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoWmlwUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBzZXRFbnRyeShaaXBFbnRyeSBlKSB7CiAgICAgICAgIGlmIChlID09IG51bGwpIHsKICAgICAgICAgICAgIHNldEV4aXN0cyhmYWxzZSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvQ29udGVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0NvbnRlbnQuamF2YQppbmRleCAwN2RkMzE1Li40MTRhOGJjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvQ29udGVudC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9Db250ZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRGF0ZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0RhdGUuamF2YQppbmRleCBiNmJlNjZiLi43NjVlYjAxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRGF0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9EYXRlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIAogLyoqCkBAIC0zMiwxNCArMzQsOCBAQAogICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKLSAgICAgICAgbG9uZyBkaWZmID0gZm9vLmdldExhc3RNb2RpZmllZCgpIC0gYmFyLmdldExhc3RNb2RpZmllZCgpOwotICAgICAgICBpZiAoZGlmZiA+IDApIHsKLSAgICAgICAgICAgIHJldHVybiArMTsKLSAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IuY29tcGFyaW5nTG9uZyhSZXNvdXJjZTo6Z2V0TGFzdE1vZGlmaWVkKS5jb21wYXJlKGZvbywKKyAgICAgICAgICAgIGJhcik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yLmphdmEKaW5kZXggYWEyZjU1YS4uNTVhMTNmMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0RlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9EZWxlZ2F0ZWRSZXNvdXJjZUNvbXBhcmF0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDcgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CkBAIC00Nyw1MyArNDcsNDggQEAKICAgICAgICAgaWYgKGMgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHJlc291cmNlQ29tcGFyYXRvcnMgPSAocmVzb3VyY2VDb21wYXJhdG9ycyA9PSBudWxsKSA/IG5ldyBWZWN0b3I8UmVzb3VyY2VDb21wYXJhdG9yPigpIDogcmVzb3VyY2VDb21wYXJhdG9yczsKKyAgICAgICAgcmVzb3VyY2VDb21wYXJhdG9ycyA9IChyZXNvdXJjZUNvbXBhcmF0b3JzID09IG51bGwpID8gbmV3IFZlY3Rvcjw+KCkgOiByZXNvdXJjZUNvbXBhcmF0b3JzOwogICAgICAgICByZXNvdXJjZUNvbXBhcmF0b3JzLmFkZChjKTsKICAgICAgICAgc2V0Q2hlY2tlZChmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRXF1YWxpdHkgbWV0aG9kIGJhc2VkIG9uIHRoZSB2ZWN0b3Igb2YgcmVzb3VyY2VzLAotICAgICAqIG9yIGlmIGEgcmVmZXJlbmNlLCB0aGUgcmVmZXJyZWR0byBvYmplY3QuCisgICAgICogb3IgaWYgYSByZWZlcmVuY2UsIHRoZSByZWZlcnJlZCB0byBvYmplY3QuCiAgICAgICogQHBhcmFtIG8gdGhlIG9iamVjdCB0byBjaGVjayBhZ2FpbnN0LgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBlcXVhbGl0eS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgIGlmIChvID09IHRoaXMpIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZigpLmVxdWFscyhvKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKERlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvci5jbGFzcykuZXF1YWxzKG8pOwogICAgICAgICB9Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZWxlZ2F0ZWRSZXNvdXJjZUNvbXBhcmF0b3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yKSB7CisgICAgICAgICAgICBMaXN0PFJlc291cmNlQ29tcGFyYXRvcj4gb3YgPSAoKERlbGVnYXRlZFJlc291cmNlQ29tcGFyYXRvcikgbykucmVzb3VyY2VDb21wYXJhdG9yczsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbXBhcmF0b3JzID09IG51bGwgPyBvdiA9PSBudWxsIDogcmVzb3VyY2VDb21wYXJhdG9ycy5lcXVhbHMob3YpOwogICAgICAgICB9Ci0gICAgICAgIExpc3Q8UmVzb3VyY2VDb21wYXJhdG9yPiBvdiA9ICgoRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yKSBvKS5yZXNvdXJjZUNvbXBhcmF0b3JzOwotICAgICAgICByZXR1cm4gcmVzb3VyY2VDb21wYXJhdG9ycyA9PSBudWxsID8gb3YgPT0gbnVsbCA6IHJlc291cmNlQ29tcGFyYXRvcnMuZXF1YWxzKG92KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEhhc2hjb2RlIGJhc2VkIG9uIHRoZSBydWxlcyBmb3IgZXF1YWxpdHkuCiAgICAgICogQHJldHVybiBhIGhhc2hjb2RlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yLmNsYXNzKS5oYXNoQ29kZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbXBhcmF0b3JzID09IG51bGwgPyAwIDogcmVzb3VyY2VDb21wYXJhdG9ycy5oYXNoQ29kZSgpOwogICAgIH0KIAogICAgIC8qKiB7QGluaGVyaXREb2N9ICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBpbnQgcmVzb3VyY2VDb21wYXJlKFJlc291cmNlIGZvbywgUmVzb3VyY2UgYmFyKSB7Ci0gICAgICAgIC8vaWYgbm8gbmVzdGVkLCBuYXR1cmFsIG9yZGVyOgotICAgICAgICBpZiAocmVzb3VyY2VDb21wYXJhdG9ycyA9PSBudWxsIHx8IHJlc291cmNlQ29tcGFyYXRvcnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZm9vLmNvbXBhcmVUbyhiYXIpOwotICAgICAgICB9Ci0gICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlc291cmNlQ29tcGFyYXRvcj4gaSA9IHJlc291cmNlQ29tcGFyYXRvcnMuaXRlcmF0b3IoKTsgcmVzdWx0ID09IDAgJiYgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBpLm5leHQoKS5yZXNvdXJjZUNvbXBhcmUoZm9vLCBiYXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBjb21wb3NpdGUocmVzb3VyY2VDb21wYXJhdG9ycykuY29tcGFyZShmb28sIGJhcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDMsNiArOTgsNyBAQAogICAgICAqIEBwYXJhbSBwICAgdGhlIFByb2plY3QgdG8gcmVzb2x2ZSBhZ2FpbnN0LgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZGllT25DaXJjdWxhclJlZmVyZW5jZShTdGFjazxPYmplY3Q+IHN0aywgUHJvamVjdCBwKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoaXNDaGVja2VkKCkpIHsKQEAgLTExMSwxNSArMTA3LDI4IEBACiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICBzdXBlci5kaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHN0aywgcCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIShyZXNvdXJjZUNvbXBhcmF0b3JzID09IG51bGwgfHwgcmVzb3VyY2VDb21wYXJhdG9ycy5pc0VtcHR5KCkpKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VDb21wYXJhdG9ycyAhPSBudWxsICYmICFyZXNvdXJjZUNvbXBhcmF0b3JzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2VDb21wYXJhdG9yIHJlc291cmNlQ29tcGFyYXRvciA6IHJlc291cmNlQ29tcGFyYXRvcnMpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlQ29tcGFyYXRvciBpbnN0YW5jZW9mIERhdGFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjaygoRGF0YVR5cGUpIHJlc291cmNlQ29tcGFyYXRvciwgc3RrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQW5kSW52b2tlQ2lyY3VsYXJSZWZlcmVuY2VDaGVjayhyZXNvdXJjZUNvbXBhcmF0b3IsIHN0aywgcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRDaGVja2VkKHRydWUpOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxSZXNvdXJjZT4gY29tcG9zaXRlKExpc3Q8PyBleHRlbmRzIENvbXBhcmF0b3I8UmVzb3VyY2U+PiBmb28pIHsKKyAgICAgICAgQ29tcGFyYXRvcjxSZXNvdXJjZT4gcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKGZvbyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKENvbXBhcmF0b3I8UmVzb3VyY2U+IGNvbXBhcmF0b3IgOiBmb28pIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC50aGVuQ29tcGFyaW5nKGNvbXBhcmF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbXBhcmF0b3IubmF0dXJhbE9yZGVyKCkgOiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0V4aXN0cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0V4aXN0cy5qYXZhCmluZGV4IDU4MzIxNTAuLjBmNWQ4MmEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9FeGlzdHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRXhpc3RzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIAogLyoqCkBAIC0zMywxMSArMzUsNyBAQAogICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKLSAgICAgICAgYm9vbGVhbiBmID0gZm9vLmlzRXhpc3RzKCk7Ci0gICAgICAgIGlmIChmID09IGJhci5pc0V4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZiA/IDEgOiAtMTsKKyAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IuY29tcGFyaW5nKFJlc291cmNlOjppc0V4aXN0cykuY29tcGFyZShmb28sIGJhcik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRmlsZVN5c3RlbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL0ZpbGVTeXN0ZW0uamF2YQppbmRleCA3ZWFmZWI5Li43ODJiZWMxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvRmlsZVN5c3RlbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9GaWxlU3lzdGVtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw2ICsxOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOwpAQCAtMzYsMjUgKzM5LDMzIEBACiAgICAgICogQHBhcmFtIGJhciB0aGUgc2Vjb25kIFJlc291cmNlLgogICAgICAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlIGZpcnN0CiAgICAgICogICAgICAgICBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4KLSAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBlaXRoZXIgcmVzb3VyY2UgaXMgbm90IGFuIGluc3RhbmNlIG9mIEZpbGVSZXNvdXJjZS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiBlaXRoZXIgcmVzb3VyY2UgaXMgbm90IGNhcGFibGUgb2YKKyAgICAgKiAgICAgICAgIGV4cG9zaW5nIGEge0BsaW5rIEZpbGVQcm92aWRlcn0KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHJlc291cmNlQ29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgewotICAgICAgICBGaWxlUHJvdmlkZXIgZm9vRlAgPSBmb28uYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgaWYgKGZvb0ZQID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oZm9vLmdldENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXNuJ3QgcHJvdmlkZSBmaWxlcyIpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGUgZm9vZmlsZSA9IGZvb0ZQLmdldEZpbGUoKTsKLSAgICAgICAgRmlsZVByb3ZpZGVyIGJhckZQID0gYmFyLmFzKEZpbGVQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChiYXJGUCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKGJhci5nZXRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBkb2Vzbid0IHByb3ZpZGUgZmlsZXMiKTsKLSAgICAgICAgfQotICAgICAgICBGaWxlIGJhcmZpbGUgPSBiYXJGUC5nZXRGaWxlKCk7Ci0gICAgICAgIHJldHVybiBmb29maWxlLmVxdWFscyhiYXJmaWxlKSA/IDAKLSAgICAgICAgICAgIDogRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKGZvb2ZpbGUsIGJhcmZpbGUpID8gLTEKLSAgICAgICAgICAgIDogRklMRV9VVElMUy5ub3JtYWxpemUoZm9vZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkuY29tcGFyZVRvKAotICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGJhcmZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmUoZmlsZShmb28pLCBmaWxlKGJhcikpOwogICAgIH0KIAorICAgIHByaXZhdGUgRmlsZSBmaWxlKFJlc291cmNlIHIpIHsKKyAgICAgICAgcmV0dXJuIHIuYXNPcHRpb25hbChGaWxlUHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICByLmdldENsYXNzKCkgKyAiIGRvZXNuJ3QgcHJvdmlkZSBmaWxlcyIpKQorICAgICAgICAgICAgLmdldEZpbGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjb21wYXJlKEZpbGUgZjEsIEZpbGUgZjIpIHsKKyAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGYxLCBmMikpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmIChGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgoZjEsIGYyKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgoZjIsIGYxKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IKKyAgICAgICAgICAgIC5jb21wYXJpbmcoKChGdW5jdGlvbjxGaWxlLCBTdHJpbmc+KSBGaWxlOjpnZXRBYnNvbHV0ZVBhdGgpCisgICAgICAgICAgICAgICAgLmFuZFRoZW4oRklMRV9VVElMUzo6bm9ybWFsaXplKSkKKyAgICAgICAgICAgIC5jb21wYXJlKGYxLCBmMik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL05hbWUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9OYW1lLmphdmEKaW5kZXggZDA0OGFjMC4uYjE3N2FiYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL05hbWUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvTmFtZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1Jlc291cmNlQ29tcGFyYXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1Jlc291cmNlQ29tcGFyYXRvci5qYXZhCmluZGV4IDNiZmM5YzcuLmFjZWY3MDcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9SZXNvdXJjZUNvbXBhcmF0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvUmVzb3VyY2VDb21wYXJhdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNiwxMCArMzYsMTAgQEAKICAgICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgogICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIGVpdGhlciBhcmd1bWVudCBpcyBudWxsLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgewogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIFJlc291cmNlQ29tcGFyYXRvciBjID0KLSAgICAgICAgICAgIGlzUmVmZXJlbmNlKCkgPyAoUmVzb3VyY2VDb21wYXJhdG9yKSBnZXRDaGVja2VkUmVmKCkgOiB0aGlzOworICAgICAgICBSZXNvdXJjZUNvbXBhcmF0b3IgYyA9IGlzUmVmZXJlbmNlKCkgPyBnZXRSZWYoKSA6IHRoaXM7CiAgICAgICAgIHJldHVybiBjLnJlc291cmNlQ29tcGFyZShmb28sIGJhcik7CiAgICAgfQogCkBAIC00OCwyMyArNDgsMjIgQEAKICAgICAgKiBAcGFyYW0gbyB0aGUgT2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBPYmplY3QgZXF1YWxzIHRoaXMgb25lLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoKS5lcXVhbHMobyk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZXF1YWxzKG8pOwogICAgICAgICB9Ci0gICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbyA9PSB0aGlzIHx8IG8uZ2V0Q2xhc3MoKS5lcXVhbHMoZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiBvICE9IG51bGwgJiYgKG8gPT0gdGhpcyB8fCBvLmdldENsYXNzKCkuZXF1YWxzKGdldENsYXNzKCkpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBIYXNoY29kZSBiYXNlZCBvbiB0aGUgcnVsZXMgZm9yIGVxdWFsaXR5LgogICAgICAqIEByZXR1cm4gYSBoYXNoY29kZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKCkuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5oYXNoQ29kZSgpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmhhc2hDb2RlKCk7CiAgICAgfQpAQCAtNzgsNCArNzcsNyBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgcmVzb3VyY2VDb21wYXJlKFJlc291cmNlIGZvbywgUmVzb3VyY2UgYmFyKTsKIAorICAgIHByaXZhdGUgUmVzb3VyY2VDb21wYXJhdG9yIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVzb3VyY2VDb21wYXJhdG9yLmNsYXNzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvUmV2ZXJzZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1JldmVyc2UuamF2YQppbmRleCA1ZGEzZWJiLi5kMzJjZmE5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvUmV2ZXJzZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9SZXZlcnNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNywxMSArMTcsMTIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuY29tcGFyYXRvcnM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EYXRhVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIAogLyoqCkBAIC02OSw4ICs3MCw4IEBACiAgICAgICogICAgICAgICBhcmd1bWVudCBpcyBncmVhdGVyIHRoYW4sIGVxdWFsIHRvLCBvciBsZXNzIHRoYW4gdGhlIHNlY29uZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IHJlc291cmNlQ29tcGFyZShSZXNvdXJjZSBmb28sIFJlc291cmNlIGJhcikgewotICAgICAgICByZXR1cm4gLTEgKiAobmVzdGVkID09IG51bGwKLSAgICAgICAgICAgID8gZm9vLmNvbXBhcmVUbyhiYXIpIDogbmVzdGVkLmNvbXBhcmUoZm9vLCBiYXIpKTsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLjxDb21wYXJhdG9yPFJlc291cmNlPj4gb2ZOdWxsYWJsZShuZXN0ZWQpCisgICAgICAgICAgICAub3JFbHNlR2V0KENvbXBhcmF0b3I6Om5hdHVyYWxPcmRlcikucmV2ZXJzZWQoKS5jb21wYXJlKGZvbywgYmFyKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKFN0YWNrPE9iamVjdD4gc3RrLCBQcm9qZWN0IHApCkBAIC04MiwxMCArODMsMTAgQEAKICAgICAgICAgICAgIHN1cGVyLmRpZU9uQ2lyY3VsYXJSZWZlcmVuY2Uoc3RrLCBwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChuZXN0ZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHB1c2hBbmRJbnZva2VDaXJjdWxhclJlZmVyZW5jZUNoZWNrKChEYXRhVHlwZSkgbmVzdGVkLCBzdGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCk7CisgICAgICAgICAgICAgICAgcHVzaEFuZEludm9rZUNpcmN1bGFyUmVmZXJlbmNlQ2hlY2sobmVzdGVkLCBzdGssIHApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTsKICAgICAgICAgfQogICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1NpemUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9TaXplLmphdmEKaW5kZXggYjk0ZjI1MC4uODYzODk3NCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1NpemUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvU2l6ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNiArMTcsOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5jb21wYXJhdG9yczsKIAoraW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiAKIC8qKgpAQCAtMzIsOCArMzQsNyBAQAogICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKLSAgICAgICAgbG9uZyBkaWZmID0gZm9vLmdldFNpemUoKSAtIGJhci5nZXRTaXplKCk7Ci0gICAgICAgIHJldHVybiBkaWZmID4gMCA/IDEgOiAoZGlmZiA9PSAwID8gMCA6IC0xKTsKKyAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IuY29tcGFyaW5nTG9uZyhSZXNvdXJjZTo6Z2V0U2l6ZSkuY29tcGFyZShmb28sIGJhcik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvVHlwZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL1R5cGUuamF2YQppbmRleCA2YzA4MmVmLi42NWZlODJhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvVHlwZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9UeXBlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzOwogCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIAogLyoqCkBAIC0zNCwxMSArMzYsNyBAQAogICAgICAqICAgICAgICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGludCByZXNvdXJjZUNvbXBhcmUoUmVzb3VyY2UgZm9vLCBSZXNvdXJjZSBiYXIpIHsKLSAgICAgICAgYm9vbGVhbiBmID0gZm9vLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIGlmIChmID09IGJhci5pc0RpcmVjdG9yeSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZiA/IDEgOiAtMTsKKyAgICAgICAgcmV0dXJuIENvbXBhcmF0b3IuY29tcGFyaW5nKFJlc291cmNlOjppc0RpcmVjdG9yeSkuY29tcGFyZShmb28sIGJhcik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0FuZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9BbmQuamF2YQppbmRleCA0MDllZDY2Li43MjkyZjRmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0FuZC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvQW5kLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNyw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogCiAvKioKQEAgLTM3LDcgKzM1LDcgQEAKICAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KICAgICAgKi8KLSAgICBwdWJsaWMgQW5kKFJlc291cmNlU2VsZWN0b3JbXSByKSB7CisgICAgcHVibGljIEFuZChSZXNvdXJjZVNlbGVjdG9yLi4uIHIpIHsKICAgICAgICAgc3VwZXIocik7CiAgICAgfQogCkBAIC00NywxMiArNDUsNyBAQAogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgUmVzb3VyY2Ugd2FzIHNlbGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgewotICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlc291cmNlU2VsZWN0b3I+IGkgPSBnZXRTZWxlY3RvcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpZiAoIWkubmV4dCgpLmlzU2VsZWN0ZWQocikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVNlbGVjdG9ycygpLnN0cmVhbSgpLmFsbE1hdGNoKHMgLT4gcy5pc1NlbGVjdGVkKHIpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvQ29tcGFyZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Db21wYXJlLmphdmEKaW5kZXggZjM0NWMyNy4uY2U4NzlkOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Db21wYXJlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Db21wYXJlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNyw5ICszNyw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBDb21wYXJlIGV4dGVuZHMgRGF0YVR5cGUgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfQ09OVFJPTF9NRVNTQUdFCi0gICAgICAgID0gIiB0aGUgPGNvbnRyb2w+IGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UuIjsKLQogICAgIHByaXZhdGUgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yIGNvbXAgPSBuZXcgRGVsZWdhdGVkUmVzb3VyY2VDb21wYXJhdG9yKCk7CiAgICAgcHJpdmF0ZSBRdWFudGlmaWVyIGFnYWluc3QgPSBRdWFudGlmaWVyLkFMTDsKIApAQCAtMTAzLDcgKzEwMCw3IEBACiAgICAgLyoqIHtAaW5oZXJpdERvY30gKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZVNlbGVjdG9yKSBnZXRDaGVja2VkUmVmKCkpLmlzU2VsZWN0ZWQocik7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaXNTZWxlY3RlZChyKTsKICAgICAgICAgfQogICAgICAgICBpZiAoY29udHJvbCA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBvbmVDb250cm9sKCk7CkBAIC0xNDMsNyArMTQwLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIFJlc291cmNlU2VsZWN0b3IgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihSZXNvdXJjZVNlbGVjdG9yLmNsYXNzKTsKKyAgICB9CisKICAgICBwcml2YXRlIEJ1aWxkRXhjZXB0aW9uIG9uZUNvbnRyb2woKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oc3VwZXIudG9TdHJpbmcoKSArIE9ORV9DT05UUk9MX01FU1NBR0UpOworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKCIlcyB0aGUgPGNvbnRyb2w+IGVsZW1lbnQgc2hvdWxkIGJlIHNwZWNpZmllZCBleGFjdGx5IG9uY2UuIiwKKyAgICAgICAgICAgICAgICBzdXBlci50b1N0cmluZygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0RhdGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRGF0ZS5qYXZhCmluZGV4IDA3MTlhMTguLjYzNTZiZjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRGF0ZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRGF0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTEsNyArNTEsNyBAQAogICAgICAqIEBwYXJhbSBtIHRoZSBudW1iZXIgb2YgbWlsbGlzLgogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNaWxsaXMobG9uZyBtKSB7Ci0gICAgICAgIG1pbGxpcyA9IG5ldyBMb25nKG0pOworICAgICAgICBtaWxsaXMgPSBtOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTksNyArNTksNyBAQAogICAgICAqIEByZXR1cm4gbG9uZyBudW1iZXIgb2YgbWlsbGlzIHNpbmNlIDE5NzAuCiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBsb25nIGdldE1pbGxpcygpIHsKLSAgICAgICAgcmV0dXJuIG1pbGxpcyA9PSBudWxsID8gLTFMIDogbWlsbGlzLmxvbmdWYWx1ZSgpOworICAgICAgICByZXR1cm4gbWlsbGlzID09IG51bGwgPyAtMUwgOiBtaWxsaXM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNDQsMTggKzE0NCwxOCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBsb25nIG0gPSBkZi5wYXJzZShkYXRlVGltZSkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChtIDwgMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkRhdGUgb2YgIiArIGRhdGVUaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgcmVzdWx0cyBpbiBuZWdhdGl2ZSBtaWxsaXNlY29uZHMgdmFsdWUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgcmVsYXRpdmUgdG8gZXBvY2ggKEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgR01UKS4iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGUgb2YgJXMgcmVzdWx0cyBpbiBuZWdhdGl2ZSBtaWxsaXNlY29uZHMgdmFsdWUgcmVsYXRpdmUgdG8gZXBvY2ggKEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgR01UKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVRpbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzZXRNaWxsaXMobSk7CiAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRGF0ZSBvZiAiICsgZGF0ZVRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBDYW5ub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4gSXQgc2hvdWxkIGJlIGluICciCi0gICAgICAgICAgICAgICAgICAgICAgICArIHAgKyAiJyBmb3JtYXQuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRGF0ZSBvZiAlcyBDYW5ub3QgYmUgcGFyc2VkIGNvcnJlY3RseS4gSXQgc2hvdWxkIGJlIGluICclcycgZm9ybWF0LiIsCisgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lLCBwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gd2hlbi5ldmFsdWF0ZShyLmdldExhc3RNb2RpZmllZCgpLCBtaWxsaXMubG9uZ1ZhbHVlKCksIGdyYW51bGFyaXR5KTsKKyAgICAgICAgcmV0dXJuIHdoZW4uZXZhbHVhdGUoci5nZXRMYXN0TW9kaWZpZWQoKSwgbWlsbGlzLCBncmFudWxhcml0eSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0V4aXN0cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9FeGlzdHMuamF2YQppbmRleCAxYjQ5OGJjLi43MDUwYTI1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0V4aXN0cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvRXhpc3RzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL0luc3RhbmNlT2YuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvSW5zdGFuY2VPZi5qYXZhCmluZGV4IDM5YjMxMDguLmY1ZjIyMDAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvSW5zdGFuY2VPZi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvSW5zdGFuY2VPZi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTEwLDEzICsxMTAsMTIgQEAKICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgewogICAgICAgICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIk5vIHByb2plY3Qgc2V0IGZvciBJbnN0YW5jZU9mIFJlc291cmNlU2VsZWN0b3I7ICIKLSAgICAgICAgICAgICAgICAgICAgKyAidGhlIHR5cGUgYXR0cmlidXRlIGlzIGludmFsaWQuIik7CisgICAgICAgICAgICAgICAgICAgICJObyBwcm9qZWN0IHNldCBmb3IgSW5zdGFuY2VPZiBSZXNvdXJjZVNlbGVjdG9yOyB0aGUgdHlwZSBhdHRyaWJ1dGUgaXMgaW52YWxpZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFudFR5cGVEZWZpbml0aW9uIGQgPSBDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50SGVscGVyKAogICAgICAgICAgICAgICAgIHByb2plY3QpLmdldERlZmluaXRpb24oUHJvamVjdEhlbHBlci5nZW5Db21wb25lbnROYW1lKHVyaSwgdHlwZSkpOwogICAgICAgICAgICAgaWYgKGQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidHlwZSAiICsgdHlwZSArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidHlwZSAlcyBub3QgZm91bmQuIix0eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgYyA9IGQuaW5uZXJHZXRUeXBlQ2xhc3MoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTWFqb3JpdHkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTWFqb3JpdHkuamF2YQppbmRleCA1YTdhOTVjLi5mODVkMGRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL01ham9yaXR5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9NYWpvcml0eS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTYgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogCiAvKioKICAqIE1ham9yaXR5IFJlc291cmNlU2VsZWN0b3IuCiAgKiBAc2luY2UgQW50IDEuNwogICovCi1wdWJsaWMgY2xhc3MgTWFqb3JpdHkKLSAgICBleHRlbmRzIFJlc291cmNlU2VsZWN0b3JDb250YWluZXIgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKK3B1YmxpYyBjbGFzcyBNYWpvcml0eSBleHRlbmRzIFJlc291cmNlU2VsZWN0b3JDb250YWluZXIKKyAgICBpbXBsZW1lbnRzIFJlc291cmNlU2VsZWN0b3IgewogCiAgICAgcHJpdmF0ZSBib29sZWFuIHRpZSA9IHRydWU7CiAKQEAgLTQwLDcgKzM4LDcgQEAKICAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KICAgICAgKi8KLSAgICBwdWJsaWMgTWFqb3JpdHkoUmVzb3VyY2VTZWxlY3RvcltdIHIpIHsKKyAgICBwdWJsaWMgTWFqb3JpdHkoUmVzb3VyY2VTZWxlY3Rvci4uLiByKSB7CiAgICAgICAgIHN1cGVyKHIpOwogICAgIH0KIApAQCAtNjQsOCArNjIsOCBAQAogICAgICAgICBib29sZWFuIGV2ZW4gPSBjb3VudCAlIDIgPT0gMDsKICAgICAgICAgaW50IHRocmVzaG9sZCA9IGNvdW50IC8gMjsKIAotICAgICAgICBmb3IgKEl0ZXJhdG9yPFJlc291cmNlU2VsZWN0b3I+IGkgPSBnZXRTZWxlY3RvcnMoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBpZiAoaS5uZXh0KCkuaXNTZWxlY3RlZChyKSkgeworICAgICAgICBmb3IgKFJlc291cmNlU2VsZWN0b3IgcnMgOiBnZXRSZXNvdXJjZVNlbGVjdG9ycygpKSB7CisgICAgICAgICAgICBpZiAocnMuaXNTZWxlY3RlZChyKSkgewogICAgICAgICAgICAgICAgICsrcGFzc2VkOwogICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgPiB0aHJlc2hvbGQgfHwgKGV2ZW4gJiYgdGllICYmIHBhc3NlZCA9PSB0aHJlc2hvbGQpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9OYW1lLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05hbWUuamF2YQppbmRleCA1YTRkYTE1Li5jODg3NzQ4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05hbWUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05hbWUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEyNiwyMCArMTI2LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgcyA9IHIudG9TdHJpbmcoKTsKLSAgICAgICAgcmV0dXJuIHMuZXF1YWxzKG4pID8gZmFsc2UgOiBtYXRjaGVzKHMpOworICAgICAgICByZXR1cm4gIXMuZXF1YWxzKG4pICYmIG1hdGNoZXMocyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIG1hdGNoZXMoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIFNlbGVjdG9yVXRpbHMubWF0Y2gobW9kaWZ5KHBhdHRlcm4pLCBtb2RpZnkobmFtZSksIGNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyZWcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlZyA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKHJlZ2V4KTsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gcmVnLmdldFJlZ2V4cChwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBleHByZXNzaW9uLm1hdGNoZXMobW9kaWZ5KG5hbWUpLCBSZWdleHBVdGlsLmFzT3B0aW9ucyhjcykpOwogICAgICAgICB9CisgICAgICAgIGlmIChyZWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVnID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKCk7CisgICAgICAgICAgICByZWcuc2V0UGF0dGVybihyZWdleCk7CisgICAgICAgICAgICBleHByZXNzaW9uID0gcmVnLmdldFJlZ2V4cChwcm9qZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXRjaGVzKG1vZGlmeShuYW1lKSwgUmVnZXhwVXRpbC5hc09wdGlvbnMoY3MpKTsKICAgICB9CiAKICAgICBwcml2YXRlIFN0cmluZyBtb2RpZnkoU3RyaW5nIHMpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTm9uZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob25lLmphdmEKaW5kZXggMGRlODYyMy4uZDM4YmM2ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob25lLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob25lLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNyw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogCiAvKioKQEAgLTM4LDcgKzM2LDcgQEAKICAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KICAgICAgKi8KLSAgICBwdWJsaWMgTm9uZShSZXNvdXJjZVNlbGVjdG9yW10gcikgeworICAgIHB1YmxpYyBOb25lKFJlc291cmNlU2VsZWN0b3IuLi4gcikgewogICAgICAgICBzdXBlcihyKTsKICAgICB9CiAKQEAgLTQ4LDEyICs0Niw3IEBACiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBSZXNvdXJjZSB3YXMgc2VsZWN0ZWQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByKSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3I8UmVzb3VyY2VTZWxlY3Rvcj4gaSA9IGdldFNlbGVjdG9ycygpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGlmIChpLm5leHQoKS5pc1NlbGVjdGVkKHIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VTZWxlY3RvcnMoKS5zdHJlYW0oKS5ub25lTWF0Y2gocyAtPiBzLmlzU2VsZWN0ZWQocikpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob3QuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvTm90LmphdmEKaW5kZXggZGM2N2RhMS4uNWIxZWI3YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Ob3QuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL05vdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Pci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9Pci5qYXZhCmluZGV4IGIyMjMwM2EuLjk3OWRkYzggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvT3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL09yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNyw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9yczsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogCiAvKioKQEAgLTM3LDcgKzM1LDcgQEAKICAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3Rvci4KICAgICAgKiBAcGFyYW0gciB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KICAgICAgKi8KLSAgICBwdWJsaWMgT3IoUmVzb3VyY2VTZWxlY3RvcltdIHIpIHsKKyAgICBwdWJsaWMgT3IoUmVzb3VyY2VTZWxlY3Rvci4uLiByKSB7CiAgICAgICAgIHN1cGVyKHIpOwogICAgIH0KIApAQCAtNDcsMTIgKzQ1LDcgQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIHdhcyBzZWxlY3RlZC4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxSZXNvdXJjZVNlbGVjdG9yPiBpID0gZ2V0U2VsZWN0b3JzKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaWYgKGkubmV4dCgpLmlzU2VsZWN0ZWQocikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZVNlbGVjdG9ycygpLnN0cmVhbSgpLmFueU1hdGNoKHMgLT4gcy5pc1NlbGVjdGVkKHIpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9SZXNvdXJjZVNlbGVjdG9yLmphdmEKaW5kZXggMzcxNTFlYy4uYzIxMGQxNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9SZXNvdXJjZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9SZXNvdXJjZVNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1Jlc291cmNlU2VsZWN0b3JDb250YWluZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCmluZGV4IDE5ZTAxNDAuLmVlNzg3MjggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzMsNyArMzMsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lciBleHRlbmRzIERhdGFUeXBlIHsKIAotICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvdXJjZVNlbGVjdG9yPiByZXNvdXJjZVNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VTZWxlY3Rvcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2VTZWxlY3Rvcj4gcmVzb3VyY2VTZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCkBAIC00MywxMSArNDMsMTEgQEAKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhIG5ldyBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyIHdpdGggdGhlIHNwZWNpZmllZCBhcnJheSBvZiBzZWxlY3RvcnMuCi0gICAgICogQHBhcmFtIHJzIHRoZSBSZXNvdXJjZVNlbGVjdG9yW10gdG8gYWRkLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVNlbGVjdG9ycyB0aGUgUmVzb3VyY2VTZWxlY3RvcltdIHRvIGFkZC4KICAgICAgKi8KLSAgICBwdWJsaWMgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lcihSZXNvdXJjZVNlbGVjdG9yW10gcnMpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYWRkKHJzW2ldKTsKKyAgICBwdWJsaWMgUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lcihSZXNvdXJjZVNlbGVjdG9yLi4uIHJlc291cmNlU2VsZWN0b3JzKSB7CisgICAgICAgIGZvciAoUmVzb3VyY2VTZWxlY3RvciByc2VsIDogcmVzb3VyY2VTZWxlY3RvcnMpIHsKKyAgICAgICAgICAgIGFkZChyc2VsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzIsNyArNzIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGhhc1NlbGVjdG9ycygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlU2VsZWN0b3JDb250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuaGFzU2VsZWN0b3JzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaGFzU2VsZWN0b3JzKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gIXJlc291cmNlU2VsZWN0b3JzLmlzRW1wdHkoKTsKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IHNlbGVjdG9yQ291bnQoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKCkpLnNlbGVjdG9yQ291bnQoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zZWxlY3RvckNvdW50KCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwogICAgICAgICByZXR1cm4gcmVzb3VyY2VTZWxlY3RvcnMuc2l6ZSgpOwpAQCAtOTYsMTAgKzk2LDIxIEBACiAgICAgICovCiAgICAgcHVibGljIEl0ZXJhdG9yPFJlc291cmNlU2VsZWN0b3I+IGdldFNlbGVjdG9ycygpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKFJlc291cmNlU2VsZWN0b3JDb250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuZ2V0U2VsZWN0b3JzKCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0U2VsZWN0b3JzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldFJlc291cmNlU2VsZWN0b3JzKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbmZpZ3VyZWQge0BsaW5rIFJlc291cmNlU2VsZWN0b3J9cyBhcyBhIHtAbGluayBMaXN0fS4KKyAgICAgKiBAcmV0dXJuIHtAbGluayBMaXN0fSBvZiB7QGxpbmsgUmVzb3VyY2VTZWxlY3Rvcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZVNlbGVjdG9yPiBnZXRSZXNvdXJjZVNlbGVjdG9ycygpIHsKKyAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5nZXRSZXNvdXJjZVNlbGVjdG9ycygpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzb3VyY2VTZWxlY3RvcnMpLml0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc291cmNlU2VsZWN0b3JzKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNSw0ICsxMzYsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBSZXNvdXJjZVNlbGVjdG9yQ29udGFpbmVyIGdldFJlZigpIHsKKyAgICAgICAgcmV0dXJuIGdldENoZWNrZWRSZWYoUmVzb3VyY2VTZWxlY3RvckNvbnRhaW5lci5jbGFzcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9TaXplLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1NpemUuamF2YQppbmRleCA0ZDZjODdlLi5iYWViNmRmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1NpemUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL1NpemUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvVHlwZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9UeXBlLmphdmEKaW5kZXggNjVkNGE1Ny4uZDA4OTE2YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9UeXBlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9UeXBlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Fic3RyYWN0U2VsZWN0b3JDb250YWluZXIuamF2YQppbmRleCBiODA4MTZkLi4wNjE0Nzc5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9BYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw5ICsxOCwxMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMzYsMTggKzQwLDIwIEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lciBleHRlbmRzIERhdGFUeXBlCiAgICAgaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlbGVjdG9yQ29udGFpbmVyIHsKIAotICAgIHByaXZhdGUgVmVjdG9yPEZpbGVTZWxlY3Rvcj4gc2VsZWN0b3JzTGlzdCA9IG5ldyBWZWN0b3I8RmlsZVNlbGVjdG9yPigpOworICAgIHByaXZhdGUgTGlzdDxGaWxlU2VsZWN0b3I+IHNlbGVjdG9yc0xpc3QgPQorICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8PigpKTsKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc2VsZWN0b3JzIGhlcmUuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBzZWxlY3RvcnMKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZWxlY3RvcnMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKCkpLmhhc1NlbGVjdG9ycygpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLmhhc1NlbGVjdG9ycygpOwogICAgICAgICB9CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgcmV0dXJuICEoc2VsZWN0b3JzTGlzdC5pc0VtcHR5KCkpOworICAgICAgICByZXR1cm4gIXNlbGVjdG9yc0xpc3QuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTYsNyArNjIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBpbnQgc2VsZWN0b3JDb3VudCgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEFic3RyYWN0U2VsZWN0b3JDb250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuc2VsZWN0b3JDb3VudCgpOworICAgICAgICAgICAgcmV0dXJuIGdldFJlZigpLnNlbGVjdG9yQ291bnQoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7CiAgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LnNpemUoKTsKQEAgLTY5LDEzICs3NSwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKHApKQotICAgICAgICAgICAgICAgIC5nZXRTZWxlY3RvcnMocCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKHApLmdldFNlbGVjdG9ycyhwKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKHApOwotICAgICAgICBGaWxlU2VsZWN0b3JbXSByZXN1bHQgPSBuZXcgRmlsZVNlbGVjdG9yW3NlbGVjdG9yc0xpc3Quc2l6ZSgpXTsKLSAgICAgICAgc2VsZWN0b3JzTGlzdC5jb3B5SW50byhyZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gc2VsZWN0b3JzTGlzdC50b0FycmF5KG5ldyBGaWxlU2VsZWN0b3Jbc2VsZWN0b3JzTGlzdC5zaXplKCldKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg0LDExICs4NywxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IHNlbGVjdG9yRWxlbWVudHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyKSBnZXRDaGVja2VkUmVmKCkpCi0gICAgICAgICAgICAgICAgLnNlbGVjdG9yRWxlbWVudHMoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zZWxlY3RvckVsZW1lbnRzKCk7CiAgICAgICAgIH0KICAgICAgICAgZGllT25DaXJjdWxhclJlZmVyZW5jZSgpOwotICAgICAgICByZXR1cm4gc2VsZWN0b3JzTGlzdC5lbGVtZW50cygpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oc2VsZWN0b3JzTGlzdCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC05OSwxOCArMTAxLDggQEAKICAgICAgKiBAcmV0dXJuIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFNlbGVjdG9ycyBjb250YWluZWQgaW4gdGhpcyBvbmUKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIEVudW1lcmF0aW9uPEZpbGVTZWxlY3Rvcj4gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKLSAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyMiw3ICsxMTQsNyBAQAogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewogICAgICAgICAgICAgdGhyb3cgbm9DaGlsZHJlbkFsbG93ZWQoKTsKICAgICAgICAgfQotICAgICAgICBzZWxlY3RvcnNMaXN0LmFkZEVsZW1lbnQoc2VsZWN0b3IpOworICAgICAgICBzZWxlY3RvcnNMaXN0LmFkZChzZWxlY3Rvcik7CiAgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOwogICAgIH0KIApAQCAtMTQ0LDE2ICsxMzYsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgICgoQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lcikgZ2V0Q2hlY2tlZFJlZigpKS52YWxpZGF0ZSgpOworICAgICAgICAgICAgZ2V0UmVmKCkudmFsaWRhdGUoKTsKICAgICAgICAgfQogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIEVudW1lcmF0aW9uPEZpbGVTZWxlY3Rvcj4gZSA9IHNlbGVjdG9yRWxlbWVudHMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIE9iamVjdCBvID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBCYXNlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgICAgICAoKEJhc2VTZWxlY3RvcikgbykudmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBzZWxlY3RvcnNMaXN0LnN0cmVhbSgpLmZpbHRlcihCYXNlU2VsZWN0b3IuY2xhc3M6OmlzSW5zdGFuY2UpCisgICAgICAgICAgICAubWFwKEJhc2VTZWxlY3Rvci5jbGFzczo6Y2FzdCkuZm9yRWFjaChCYXNlU2VsZWN0b3I6OnZhbGlkYXRlKTsKICAgICB9CiAKIApAQCAtMzEzLDYgKzMwMCw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBwYXJhbSBlIEV4ZWN1dGFibGVTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeGVjdXRhYmxlKEV4ZWN1dGFibGVTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlIFN5bWxpbmtTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeW1saW5rKFN5bWxpbmtTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIE93bmVkQnlTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPd25lZEJ5KE93bmVkQnlTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4R3JvdXBTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeEdyb3VwKFBvc2l4R3JvdXBTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeFBlcm1pc3Npb25zKFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgogICAgICAqIGFkZCBhbiBhcmJpdHJhcnkgc2VsZWN0b3IKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBBbnQgMS42CkBAIC0zMzcsMTcgKzM2NCwzMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhlIHNlbGVjdG9yIGNvbnRhaW5lci4KKyAgICAgKiBAcmV0dXJuIGEgZGVlcCBjbG9uZSBvZiBhIHNlbGVjdG9yIGNvbnRhaW5lci4KKyAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBjbG9uZSgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKEFic3RyYWN0U2VsZWN0b3JDb250YWluZXIpIGdldENoZWNrZWRSZWYoKSkuY2xvbmUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5jbG9uZSgpOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyIHNjID0KICAgICAgICAgICAgICAgICAoQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lcikgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgICAgIHNjLnNlbGVjdG9yc0xpc3QgPSBuZXcgVmVjdG9yPEZpbGVTZWxlY3Rvcj4oc2VsZWN0b3JzTGlzdCk7CisgICAgICAgICAgICBzYy5zZWxlY3RvcnNMaXN0ID0gbmV3IFZlY3Rvcjw+KHNlbGVjdG9yc0xpc3QpOwogICAgICAgICAgICAgcmV0dXJuIHNjOwogICAgICAgICB9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CisKKworICAgIHByaXZhdGUgQWJzdHJhY3RTZWxlY3RvckNvbnRhaW5lciBnZXRSZWYoUHJvamVjdCBwKSB7CisgICAgICAgIHJldHVybiBnZXRDaGVja2VkUmVmKEFic3RyYWN0U2VsZWN0b3JDb250YWluZXIuY2xhc3MsIGdldERhdGFUeXBlTmFtZSgpLCBwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFic3RyYWN0U2VsZWN0b3JDb250YWluZXIgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihBYnN0cmFjdFNlbGVjdG9yQ29udGFpbmVyLmNsYXNzKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9BbmRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0FuZFNlbGVjdG9yLmphdmEKaW5kZXggYzhlOTZhMC4uYjhlZjg0NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0FuZFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0FuZFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKIC8qKgogICogVGhpcyBzZWxlY3RvciBoYXMgYSBjb2xsZWN0aW9uIG9mIG90aGVyIHNlbGVjdG9ycywgYWxsIG9mIHdoaWNoIGhhdmUgdG8KQEAgLTMwLDEyICszMCw2IEBACiBwdWJsaWMgY2xhc3MgQW5kU2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3JDb250YWluZXIgewogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5kU2VsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2VsZWN0b3IKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtNjAsMTQgKzU0LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKLSAgICAgICAgRW51bWVyYXRpb248RmlsZVNlbGVjdG9yPiBlID0gc2VsZWN0b3JFbGVtZW50cygpOwotCi0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBpZiAoIWUubmV4dEVsZW1lbnQoKS5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihnZXRTZWxlY3RvcnMoZ2V0UHJvamVjdCgpKSkKKyAgICAgICAgICAgIC5hbGxNYXRjaChzIC0+IHMuaXNTZWxlY3RlZChiYXNlZGlyLCBmaWxlbmFtZSwgZmlsZSkpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VFeHRlbmRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VFeHRlbmRTZWxlY3Rvci5qYXZhCmluZGV4IGYxN2NhMDIuLjNjZWI2NDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlRXh0ZW5kU2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZUV4dGVuZFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMCw5ICszMCw4IEBACiAgKgogICogQHNpbmNlIDEuNQogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUV4dGVuZFNlbGVjdG9yCi0gICAgICAgIGV4dGVuZHMgQmFzZVNlbGVjdG9yCi0gICAgICAgIGltcGxlbWVudHMgRXh0ZW5kRmlsZVNlbGVjdG9yIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRXh0ZW5kU2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3IKKyAgICBpbXBsZW1lbnRzIEV4dGVuZEZpbGVTZWxlY3RvciB7CiAKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwogCkBAIC00MiwxOCArNDEsMTMgQEAKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgQmFzZUV4dGVuZFNlbGVjdG9yKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqIFNldCBhbGwgdGhlIFBhcmFtZXRlcnMgZm9yIHRoaXMgY3VzdG9tIHNlbGVjdG9yLCBjb2xsZWN0ZWQgYnkKICAgICAgKiB0aGUgRXh0ZW5kU2VsZWN0b3IgY2xhc3MuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgY29tcGxldGUgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2VsZWN0b3IKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yLmphdmEKaW5kZXggMjhlMDU1Ni4uNzk2NTBhMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDEyICszNyw2IEBACiAgICAgcHJpdmF0ZSBUaHJvd2FibGUgY2F1c2U7CiAKICAgICAvKioKLSAgICAgKiBEbyBub3RoaW5nIGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCYXNlU2VsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQWxsb3dzIGFsbCBzZWxlY3RvcnMgdG8gaW5kaWNhdGUgYSBzZXR1cCBlcnJvci4gTm90ZSB0aGF0IG9ubHkKICAgICAgKiB0aGUgZmlyc3QgZXJyb3IgbWVzc2FnZSBpcyByZWNvcmRlZC4KICAgICAgKgpAQCAtNzcsNyArNzEsNiBAQAogICAgICAgICByZXR1cm4gZXJybXNnOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogPHA+U3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBjaGVja2luZyBvZiB0aGVpcgogICAgICAqIHN0YXRlLiBTbyBsb25nIGFzIHRoZXkgY2FsbCB2YWxpZGF0ZSgpIGZyb20gaXNTZWxlY3RlZCgpLCB0aGlzIHdpbGwKQEAgLTg3LDExICs4MCwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgewogICAgICAgICBpZiAoaXNSZWZlcmVuY2UoKSkgewotICAgICAgICAgICAgKChCYXNlU2VsZWN0b3IpIGdldENoZWNrZWRSZWYoKSkudmVyaWZ5U2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGdldFJlZigpLnZlcmlmeVNldHRpbmdzKCk7CiAgICAgICAgIH0KICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIFN1YmNsYXNzZXMgY2FuIHVzZSB0aGlzIHRvIHRocm93IHRoZSByZXF1aXNpdGUgZXhjZXB0aW9uCiAgICAgICogaW4gaXNTZWxlY3RlZCgpIGluIHRoZSBjYXNlIG9mIGFuIGVycm9yIGNvbmRpdGlvbi4KQEAgLTEyMiw2ICsxMTQsOSBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGZpbGUpOwogCisgICAgcHJpdmF0ZSBCYXNlU2VsZWN0b3IgZ2V0UmVmKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihCYXNlU2VsZWN0b3IuY2xhc3MpOworICAgIH0KIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yQ29udGFpbmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yQ29udGFpbmVyLmphdmEKaW5kZXggMWVkZjA4NS4uOWNiOGY5ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvckNvbnRhaW5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3JDb250YWluZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDkgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlN0YWNrOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTM2LDEzICszOSw3IEBACiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNlbGVjdG9yQ29udGFpbmVyIGV4dGVuZHMgQmFzZVNlbGVjdG9yCiAgICAgICAgIGltcGxlbWVudHMgU2VsZWN0b3JDb250YWluZXIgewogCi0gICAgcHJpdmF0ZSBWZWN0b3I8RmlsZVNlbGVjdG9yPiBzZWxlY3RvcnNMaXN0ID0gbmV3IFZlY3RvcjxGaWxlU2VsZWN0b3I+KCk7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBCYXNlU2VsZWN0b3JDb250YWluZXIoKSB7Ci0gICAgfQorICAgIHByaXZhdGUgTGlzdDxGaWxlU2VsZWN0b3I+IHNlbGVjdG9yc0xpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8PigpKTsKIAogICAgIC8qKgogICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgc2VsZWN0b3JzIGhlcmUuCkBAIC01MCw3ICs0Nyw3IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaGFzU2VsZWN0b3JzKCkgewogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIHJldHVybiAhKHNlbGVjdG9yc0xpc3QuaXNFbXB0eSgpKTsKKyAgICAgICAgcmV0dXJuICFzZWxlY3RvcnNMaXN0LmlzRW1wdHkoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY5LDkgKzY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZVNlbGVjdG9yW10gZ2V0U2VsZWN0b3JzKFByb2plY3QgcCkgewogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIEZpbGVTZWxlY3RvcltdIHJlc3VsdCA9IG5ldyBGaWxlU2VsZWN0b3Jbc2VsZWN0b3JzTGlzdC5zaXplKCldOwotICAgICAgICBzZWxlY3RvcnNMaXN0LmNvcHlJbnRvKHJlc3VsdCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBzZWxlY3RvcnNMaXN0LnRvQXJyYXkobmV3IEZpbGVTZWxlY3RvcltzZWxlY3RvcnNMaXN0LnNpemUoKV0pOwogICAgIH0KIAogICAgIC8qKgpAQCAtODAsNyArNzUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IHNlbGVjdG9yRWxlbWVudHMoKSB7CiAgICAgICAgIGRpZU9uQ2lyY3VsYXJSZWZlcmVuY2UoKTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdG9yc0xpc3QuZWxlbWVudHMoKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHNlbGVjdG9yc0xpc3QpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTIsMTUgKzg3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBkaWVPbkNpcmN1bGFyUmVmZXJlbmNlKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgRW51bWVyYXRpb248RmlsZVNlbGVjdG9yPiBlID0gc2VsZWN0b3JFbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiwgIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gc2VsZWN0b3JzTGlzdC5zdHJlYW0oKS5tYXAoT2JqZWN0Ojp0b1N0cmluZykKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDksNyArOTcsNyBAQAogICAgICAqIEBwYXJhbSBzZWxlY3RvciB0aGUgbmV3IHNlbGVjdG9yIHRvIGFkZAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFwcGVuZFNlbGVjdG9yKEZpbGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBzZWxlY3RvcnNMaXN0LmFkZEVsZW1lbnQoc2VsZWN0b3IpOworICAgICAgICBzZWxlY3RvcnNMaXN0LmFkZChzZWxlY3Rvcik7CiAgICAgICAgIHNldENoZWNrZWQoZmFsc2UpOwogICAgIH0KIApAQCAtMTM2LDE2ICsxMjQsMTAgQEAKICAgICAgICAgaWYgKGVycm1zZyAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZXJybXNnKTsKICAgICAgICAgfQotICAgICAgICBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IGUgPSBzZWxlY3RvckVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQmFzZVNlbGVjdG9yKSB7Ci0gICAgICAgICAgICAgICAgKChCYXNlU2VsZWN0b3IpIG8pLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgc2VsZWN0b3JzTGlzdC5zdHJlYW0oKS5maWx0ZXIoQmFzZVNlbGVjdG9yLmNsYXNzOjppc0luc3RhbmNlKQorICAgICAgICAgICAgLm1hcChCYXNlU2VsZWN0b3IuY2xhc3M6OmNhc3QpLmZvckVhY2goQmFzZVNlbGVjdG9yOjp2YWxpZGF0ZSk7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBNZXRob2QgdGhhdCBlYWNoIHNlbGVjdG9yIHdpbGwgaW1wbGVtZW50IHRvIGNyZWF0ZSB0aGVpciBzZWxlY3Rpb24KICAgICAgKiBiZWhhdmlvdXIuIFRoaXMgaXMgd2hhdCBtYWtlcyBTZWxlY3RvckNvbnRhaW5lciBhYnN0cmFjdC4KQEAgLTE1Nyw4ICsxMzksNyBAQAogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSk7Ci0KKyAgICAgICAgRmlsZSBmaWxlKTsKIAogICAgIC8qIE1ldGhvZHMgYmVsb3cgYWxsIGFkZCBzcGVjaWZpYyBzZWxlY3RvcnMgKi8KIApAQCAtMzE2LDYgKzI5Nyw0NiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBwYXJhbSBlIEV4ZWN1dGFibGVTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFeGVjdXRhYmxlKEV4ZWN1dGFibGVTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBlIFN5bWxpbmtTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRTeW1saW5rKFN5bWxpbmtTZWxlY3RvciBlKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIE93bmVkQnlTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRPd25lZEJ5KE93bmVkQnlTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4R3JvdXBTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeEdyb3VwKFBvc2l4R3JvdXBTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBvIFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvcgorICAgICAqIEBzaW5jZSAxLjEwLjQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQb3NpeFBlcm1pc3Npb25zKFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvciBvKSB7CisgICAgICAgIGFwcGVuZFNlbGVjdG9yKG8pOworICAgIH0KKworICAgIC8qKgogICAgICAqIGFkZCBhbiBhcmJpdHJhcnkgc2VsZWN0b3IKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGFkZAogICAgICAqIEBzaW5jZSBBbnQgMS42CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zUmVnZXhwU2VsZWN0b3IuamF2YQppbmRleCA1YjAzZTUzLi44MmYzZjhiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1JlZ2V4cFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSwxMiArNDEsNiBAQAogcHVibGljIGNsYXNzIENvbnRhaW5zUmVnZXhwU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IKICAgICAgICAgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKIAotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJQcm92aWRlZEV4cHJlc3Npb24gPSBudWxsOwotICAgIHByaXZhdGUgUmVndWxhckV4cHJlc3Npb24gbXlSZWdFeHAgPSBudWxsOwotICAgIHByaXZhdGUgUmVnZXhwIG15RXhwcmVzc2lvbiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSB0cnVlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtdWx0aUxpbmUgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2luZ2xlTGluZSA9IGZhbHNlOwogICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0tFWSA9ICJleHByZXNzaW9uIjsKICAgICAvKiogUGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBjYXNlc2Vuc2l0aXZlIGF0dHJpYnV0ZS4gKi8KQEAgLTU2LDIxICs1MCwxOSBAQAogICAgIC8qKiBQYXJhbWV0ZXIgbmFtZSBmb3IgdGhlIHNpbmdsZWxpbmUgYXR0cmlidXRlLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTF9LRVkgPSAic2luZ2xlbGluZSI7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbnRhaW5zUmVnZXhwU2VsZWN0b3I8L2NvZGU+IGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBDb250YWluc1JlZ2V4cFNlbGVjdG9yKCkgewotICAgIH0KKyAgICBwcml2YXRlIFN0cmluZyB1c2VyUHJvdmlkZWRFeHByZXNzaW9uID0gbnVsbDsKKyAgICBwcml2YXRlIFJlZ3VsYXJFeHByZXNzaW9uIG15UmVnRXhwID0gbnVsbDsKKyAgICBwcml2YXRlIFJlZ2V4cCBteUV4cHJlc3Npb24gPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbXVsdGlMaW5lID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHNpbmdsZUxpbmUgPSBmYWxzZTsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoCi0gICAgICAgICAgICAgICAgIntjb250YWluc3JlZ2V4cHNlbGVjdG9yIGV4cHJlc3Npb246ICIpOwotICAgICAgICBidWYuYXBwZW5kKHVzZXJQcm92aWRlZEV4cHJlc3Npb24pOwotICAgICAgICBidWYuYXBwZW5kKCJ9Iik7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntjb250YWluc3JlZ2V4cHNlbGVjdG9yIGV4cHJlc3Npb246ICVzfSIsCisgICAgICAgICAgICB1c2VyUHJvdmlkZWRFeHByZXNzaW9uKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNiw3ICsxMDgsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlbGVjdG9yCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKSB7CisgICAgcHVibGljIHZvaWQgc2V0UGFyYW1ldGVycyhQYXJhbWV0ZXIuLi4gcGFyYW1ldGVycykgewogICAgICAgICBzdXBlci5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpOwogICAgICAgICBpZiAocGFyYW1ldGVycyAhPSBudWxsKSB7CiAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7CkBAIC0xNjUsMTEgKzE1Nyw3IEBACiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBSZXNvdXJjZSBpcyBzZWxlY3RlZCBvciBub3QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKLSAgICAgICAgU3RyaW5nIHRlc3RzdHIgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0KICAgICAgICAgLy8gdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKLQogICAgICAgICB2YWxpZGF0ZSgpOwogCiAgICAgICAgIGlmIChyLmlzRGlyZWN0b3J5KCkpIHsKQEAgLTE4Miw0MCArMTcwLDI1IEBACiAgICAgICAgICAgICBteUV4cHJlc3Npb24gPSBteVJlZ0V4cC5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoci5nZXRJbnB1dFN0cmVhbSgpKSk7IC8vTk9TT05BUgotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgZ2V0IElucHV0U3RyZWFtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICArIHIudG9Mb25nU3RyaW5nKCksIGUpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdHN0ciA9IGluLnJlYWRMaW5lKCk7Ci0KLSAgICAgICAgICAgIHdoaWxlICh0ZXN0c3RyICE9IG51bGwpIHsKLQotICAgICAgICAgICAgICAgIGlmIChteUV4cHJlc3Npb24ubWF0Y2hlcyh0ZXN0c3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdleHBVdGlsLmFzT3B0aW9ucyhjYXNlU2Vuc2l0aXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZUxpbmUpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVzdHN0ciA9IGluLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkICIgKyByLnRvTG9uZ1N0cmluZygpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpbiA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHIuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IGNsb3NlICIgLy9OT1NPTkFSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHIudG9Mb25nU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXN0c3RyID0gaW4ucmVhZExpbmUoKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0ZXN0c3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG15RXhwcmVzc2lvbi5tYXRjaGVzKHRlc3RzdHIsIFJlZ2V4cFV0aWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hc09wdGlvbnMoY2FzZVNlbnNpdGl2ZSwgbXVsdGlMaW5lLCBzaW5nbGVMaW5lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRlc3RzdHIgPSBpbi5yZWFkTGluZSgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCByZWFkICIgKyByLnRvTG9uZ1N0cmluZygpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IElucHV0U3RyZWFtIGZyb20gIiArIHIudG9Mb25nU3RyaW5nKCksIGUpOwogICAgICAgICB9CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zU2VsZWN0b3IuamF2YQppbmRleCBiZTE0OWQwLi42NjJjN2JmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMjksNyArMzAsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5GaWxlUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLnNlbGVjdG9ycy5SZXNvdXJjZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogCiAvKioKICAqIFNlbGVjdG9yIHRoYXQgZmlsdGVycyBmaWxlcy9yZXNvdXJjZXMgYmFzZWQgb24gd2hldGhlciB0aGV5IGNvbnRhaW4gYQpAQCAtMzksMTAgKzM5LDYgQEAKICAqLwogcHVibGljIGNsYXNzIENvbnRhaW5zU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IgaW1wbGVtZW50cyBSZXNvdXJjZVNlbGVjdG9yIHsKIAotICAgIHByaXZhdGUgU3RyaW5nIGNvbnRhaW5zID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IHRydWU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZXdoaXRlc3BhY2UgPSBmYWxzZTsKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZyA9IG51bGw7CiAgICAgLyoqIEtleSB0byB1c2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fS0VZID0gImV4cHJlc3Npb24iOwogICAgIC8qKiBVc2VkIGZvciBwYXJhbWV0ZXJpemVkIGN1c3RvbSBzZWxlY3RvciAqLwpAQCAtNTIsMjYgKzQ4LDE3IEBACiAgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVTUEFDRV9LRVkgPSAiaWdub3Jld2hpdGVzcGFjZSI7CiAKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udGFpbnNTZWxlY3RvcjwvY29kZT4gaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFpbnNTZWxlY3RvcigpIHsKLSAgICB9CisgICAgcHJpdmF0ZSBTdHJpbmcgY29udGFpbnMgPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3Jld2hpdGVzcGFjZSA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kaW5nID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIntjb250YWluc3NlbGVjdG9yIHRleHQ6ICIpOwotICAgICAgICBidWYuYXBwZW5kKCciJykuYXBwZW5kKGNvbnRhaW5zKS5hcHBlbmQoJyInKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIGNhc2VzZW5zaXRpdmU6ICIpOwotICAgICAgICBidWYuYXBwZW5kKGNhc2VzZW5zaXRpdmUgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIGlnbm9yZXdoaXRlc3BhY2U6ICIpOwotICAgICAgICBidWYuYXBwZW5kKGlnbm9yZXdoaXRlc3BhY2UgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgifSIpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7Y29udGFpbnNzZWxlY3RvciB0ZXh0OiBcIiVzXCIgY2FzZXNlbnNpdGl2ZTogJXMgaWdub3Jld2hpdGVzcGFjZTogJXN9IiwKKyAgICAgICAgICAgICAgICBjb250YWlucywgY2FzZXNlbnNpdGl2ZSwgaWdub3Jld2hpdGVzcGFjZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTcsNyArMTA0LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyLi4uIHBhcmFtZXRlcnMpIHsKICAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewpAQCAtMTY5LDExICsxNTYsMTAgQEAKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIFJlc291cmNlIGlzIHNlbGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcikgewotCiAgICAgICAgIC8vIHRocm93IEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICAgIHZhbGlkYXRlKCk7CiAKLSAgICAgICAgaWYgKHIuaXNEaXJlY3RvcnkoKSB8fCBjb250YWlucy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmIChyLmlzRGlyZWN0b3J5KCkgfHwgY29udGFpbnMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogCkBAIC0xODQsMzggKzE3MCwzMCBAQAogICAgICAgICBpZiAoaWdub3Jld2hpdGVzcGFjZSkgewogICAgICAgICAgICAgdXNlcnN0ciA9IFNlbGVjdG9yVXRpbHMucmVtb3ZlV2hpdGVzcGFjZSh1c2Vyc3RyKTsKICAgICAgICAgfQotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyLmdldElucHV0U3RyZWFtKCksIGVuY29kaW5nKSk7IC8vTk9TT05BUgotICAgICAgICAgICAgfSAgIGVsc2UgewotICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyLmdldElucHV0U3RyZWFtKCkpKTsgLy9OT1NPTkFSCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoci5nZXRJbnB1dFN0cmVhbSgpLCBlbmNvZGluZyA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkgOiBDaGFyc2V0LmZvck5hbWUoZW5jb2RpbmcpKSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRlc3RzdHIgPSBpbi5yZWFkTGluZSgpOworICAgICAgICAgICAgICAgIHdoaWxlICh0ZXN0c3RyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjYXNlc2Vuc2l0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c3RyID0gdGVzdHN0ci50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmV3aGl0ZXNwYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0c3RyID0gU2VsZWN0b3JVdGlscy5yZW1vdmVXaGl0ZXNwYWNlKHRlc3RzdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0c3RyLmNvbnRhaW5zKHVzZXJzdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0ZXN0c3RyID0gaW4ucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVhZCAiICsgci50b0xvbmdTdHJpbmcoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgSW5wdXRTdHJlYW0gZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICsgci50b0xvbmdTdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB0ZXN0c3RyID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgIHdoaWxlICh0ZXN0c3RyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWNhc2VzZW5zaXRpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdHN0ciA9IHRlc3RzdHIudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGlnbm9yZXdoaXRlc3BhY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgdGVzdHN0ciA9IFNlbGVjdG9yVXRpbHMucmVtb3ZlV2hpdGVzcGFjZSh0ZXN0c3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRlc3RzdHIuY29udGFpbnModXNlcnN0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRlc3RzdHIgPSBpbi5yZWFkTGluZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgIiArIHIudG9Mb25nU3RyaW5nKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IElucHV0U3RyZWFtIGZyb20gIiArIHIudG9Mb25nU3RyaW5nKCksIGUpOwogICAgICAgICB9CiAgICAgfQotCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EYXRlU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EYXRlU2VsZWN0b3IuamF2YQppbmRleCBiY2JmMTFjLi4yNjljMDcxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGF0ZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzYsMTYgKzM2LDYgQEAKICAqLwogcHVibGljIGNsYXNzIERhdGVTZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciB7CiAKLSAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotCi0gICAgcHJpdmF0ZSBsb25nIG1pbGxpcyA9IC0xOwotICAgIHByaXZhdGUgU3RyaW5nIGRhdGVUaW1lID0gbnVsbDsKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZURpcnMgPSBmYWxzZTsKLSAgICBwcml2YXRlIGxvbmcgZ3JhbnVsYXJpdHkgPSBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpOwotICAgIHByaXZhdGUgU3RyaW5nIHBhdHRlcm47Ci0gICAgcHJpdmF0ZSBUaW1lQ29tcGFyaXNvbiB3aGVuID0gVGltZUNvbXBhcmlzb24uRVFVQUw7Ci0KICAgICAvKiogS2V5IHRvIHVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlMTElTX0tFWSA9ICJtaWxsaXMiOwogICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KQEAgLTU5LDEzICs0OSwxNSBAQAogICAgIC8qKiBLZXkgdG8gdXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRURVJOX0tFWSA9ICJwYXR0ZXJuIjsKIAotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGF0ZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBEYXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGdyYW51bGFyaXR5ID0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKLSAgICB9CisgICAgLyoqIFV0aWxpdGllcyB1c2VkIGZvciBmaWxlIG9wZXJhdGlvbnMgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKworICAgIHByaXZhdGUgbG9uZyBtaWxsaXMgPSAtMTsKKyAgICBwcml2YXRlIFN0cmluZyBkYXRlVGltZSA9IG51bGw7CisgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVEaXJzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBsb25nIGdyYW51bGFyaXR5ID0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKTsKKyAgICBwcml2YXRlIFN0cmluZyBwYXR0ZXJuOworICAgIHByaXZhdGUgVGltZUNvbXBhcmlzb24gd2hlbiA9IFRpbWVDb21wYXJpc29uLkVRVUFMOwogCiAgICAgLyoqCiAgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CkBAIC03NCw4ICs2Niw3IEBACiAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIntkYXRlc2VsZWN0b3IgZGF0ZTogIik7CiAgICAgICAgIGJ1Zi5hcHBlbmQoZGF0ZVRpbWUpOwogICAgICAgICBidWYuYXBwZW5kKCIgY29tcGFyZTogIikuYXBwZW5kKHdoZW4uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBncmFudWxhcml0eTogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoZ3JhbnVsYXJpdHkpOworICAgICAgICBidWYuYXBwZW5kKCIgZ3JhbnVsYXJpdHk6ICIpLmFwcGVuZChncmFudWxhcml0eSk7CiAgICAgICAgIGlmIChwYXR0ZXJuICE9IG51bGwpIHsKICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIiBwYXR0ZXJuOiAiKS5hcHBlbmQocGF0dGVybik7CiAgICAgICAgIH0KQEAgLTE2Niw3ICsxNTcsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGNvbXBsZXRlIHNldCBvZiBwYXJhbWV0ZXJzIGZvciB0aGlzIHNlbGVjdG9yLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyLi4uIHBhcmFtZXRlcnMpIHsKICAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewpAQCAtMjM5LDkgKzIzMCw3IEBACiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIGlzIHNlbGVjdGVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewotCiAgICAgICAgIHZhbGlkYXRlKCk7Ci0KICAgICAgICAgcmV0dXJuIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgIWluY2x1ZGVEaXJzKQogICAgICAgICAgICAgfHwgd2hlbi5ldmFsdWF0ZShmaWxlLmxhc3RNb2RpZmllZCgpLCBtaWxsaXMsIGdyYW51bGFyaXR5KTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3Rvci5qYXZhCmluZGV4IDAxYWMyMzcuLjgxZTQ5ZWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzEsMTQgKzMxLDYgQEAKIHB1YmxpYyBjbGFzcyBEZXBlbmRTZWxlY3RvciBleHRlbmRzIE1hcHBpbmdTZWxlY3RvciB7CiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRlcGVuZFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBEZXBlbmRTZWxlY3RvcigpIHsKLQotICAgIH0KLQotICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC00OCw4ICs0MCw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBidWYuYXBwZW5kKHRhcmdldGRpci5nZXROYW1lKCkpOwogICAgICAgICB9Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBncmFudWxhcml0eTogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoZ3JhbnVsYXJpdHkpOworICAgICAgICBidWYuYXBwZW5kKCIgZ3JhbnVsYXJpdHk6ICIpLmFwcGVuZChncmFudWxhcml0eSk7CiAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgYnVmLmFwcGVuZCgiIG1hcHBlcjogIik7CiAgICAgICAgICAgICBidWYuYXBwZW5kKG1hcC50b1N0cmluZygpKTsKQEAgLTYxLDcgKzUyLDYgQEAKICAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogdGhpcyB0ZXN0IGlzIG91ciBzZWxlY3Rpb24gdGVzdCB0aGF0IGNvbXBhcmVkIHRoZSBmaWxlIHdpdGggdGhlIGRlc3RmaWxlCiAgICAgICogQHBhcmFtIHNyY2ZpbGUgdGhlIHNvdXJjZSBmaWxlCkBAIC02OSw5ICs1OSw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGRlc3RpbmF0aW9uIGlzIG91dCBvZiBkYXRlCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0aW9uVGVzdChGaWxlIHNyY2ZpbGUsIEZpbGUgZGVzdGZpbGUpIHsKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9IFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUoc3JjZmlsZSwgZGVzdGZpbGUsCi0gICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkpOwotICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLmlzT3V0T2ZEYXRlKHNyY2ZpbGUsIGRlc3RmaWxlLCBncmFudWxhcml0eSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwdGhTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcHRoU2VsZWN0b3IuamF2YQppbmRleCBhOGExNGQzLi4yMDc2YmU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwdGhTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXB0aFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMiw2ICszMiwxMSBAQAogICovCiBwdWJsaWMgY2xhc3MgRGVwdGhTZWxlY3RvciBleHRlbmRzIEJhc2VFeHRlbmRTZWxlY3RvciB7CiAKKyAgICAvKiogVXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fS0VZID0gIm1pbiI7CisgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0tFWSA9ICJtYXgiOworCiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKIAogICAgIC8qKiBtaW4gYXR0cmlidXRlICovCkBAIC00MSwyOCArNDYsMTEgQEAKIAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKLSAgICAvKiogVXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSU5fS0VZID0gIm1pbiI7Ci0gICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0tFWSA9ICJtYXgiOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZXB0aFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBEZXB0aFNlbGVjdG9yKCkgewotICAgIH0KLQogICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoIntkZXB0aHNlbGVjdG9yIG1pbjogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQobWluKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIG1heDogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQobWF4KTsKLSAgICAgICAgYnVmLmFwcGVuZCgifSIpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAie2RlcHRoc2VsZWN0b3IgbWluOiAiICsgbWluICsgIiBtYXg6ICIgKyBtYXggKyAifSI7CiAgICAgfQogCiAgICAgLyoqCkBAIC04OSw3ICs3Nyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgY29tcGxldGUgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2VsZWN0b3IKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKQEAgLTEyMSw4ICsxMDksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgewogICAgICAgICBpZiAobWluIDwgMCAmJiBtYXggPCAwKSB7Ci0gICAgICAgICAgICBzZXRFcnJvcigiWW91IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgbWluIG9yIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICsgIm1heCBsZXZlbHMuIik7CisgICAgICAgICAgICBzZXRFcnJvcigiWW91IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgbWluIG9yIHRoZSBtYXggbGV2ZWxzLiIpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtYXggPCBtaW4gJiYgbWF4ID4gLTEpIHsKICAgICAgICAgICAgIHNldEVycm9yKCJUaGUgbWF4aW11bSBkZXB0aCBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbXVtLiIpOwpAQCAtMTUwLDE5ICsxMzcsMTcgQEAKICAgICAgICAgLy8gSWYgeW91IGZlbHQgZGFyaW5nLCB5b3UgY291bGQgY2FjaGUgdGhlIGJhc2VkaXIgYWJzb2x1dGUgcGF0aAogICAgICAgICBTdHJpbmcgYWJzQmFzZSA9IGJhc2VkaXIuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIFN0cmluZyBhYnNGaWxlID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHRva0Jhc2UgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFic0Jhc2UsCi0gICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3IpOwotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgdG9rRmlsZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYWJzRmlsZSwKLSAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tCYXNlID0gbmV3IFN0cmluZ1Rva2VuaXplcihhYnNCYXNlLCBGaWxlLnNlcGFyYXRvcik7CisgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tGaWxlID0gbmV3IFN0cmluZ1Rva2VuaXplcihhYnNGaWxlLCBGaWxlLnNlcGFyYXRvcik7CiAgICAgICAgIHdoaWxlICh0b2tGaWxlLmhhc01vcmVUb2tlbnMoKSkgewogICAgICAgICAgICAgU3RyaW5nIGZpbGV0b2tlbiA9IHRva0ZpbGUubmV4dFRva2VuKCk7CiAgICAgICAgICAgICBpZiAodG9rQmFzZS5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZXRva2VuID0gdG9rQmFzZS5uZXh0VG9rZW4oKTsKICAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2suIERpdGNoIGl0IGlmIHlvdSB3YW50IGZhc3RlciBwZXJmb3JtYW5jZQogICAgICAgICAgICAgICAgIGlmICghYmFzZXRva2VuLmVxdWFscyhmaWxldG9rZW4pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSAiICsgZmlsZW5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgYXBwZWFyIHdpdGhpbiAiICsgYWJzQmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRpcmVjdG9yeSIpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRmlsZSAlcyBkb2VzIG5vdCBhcHBlYXIgd2l0aGluICVzIGRpcmVjdG9yeSIsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYWJzQmFzZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBkZXB0aCArPSAxOwpAQCAtMTcyLDE0ICsxNTcsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICh0b2tCYXNlLmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGaWxlICIgKyBmaWxlbmFtZQotICAgICAgICAgICAgICAgICsgIiBpcyBvdXRzaWRlIG9mICIgKyBhYnNCYXNlICsgImRpcmVjdG9yeSB0cmVlIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZpbGUgJXMgaXMgb3V0c2lkZSBvZiAlcyBkaXJlY3RvcnkgdHJlZSIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGFic0Jhc2UpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtaW4gPiAtMSAmJiBkZXB0aCA8IG1pbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gbWluIDw9IC0xIHx8IGRlcHRoID49IG1pbjsKICAgICB9Ci0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RpZmZlcmVudFNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGlmZmVyZW50U2VsZWN0b3IuamF2YQppbmRleCA5YzA3NmZhLi5kMTgzMDMyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGlmZmVyZW50U2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGlmZmVyZW50U2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTU1LDcgKzU1LDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlRmlsZVRpbWVzID0gdHJ1ZTsKICAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlQ29udGVudHMgPSBmYWxzZTsKIAotCiAgICAgLyoqCiAgICAgICogVGhpcyBmbGFnIHRlbGxzIHRoZSBzZWxlY3RvciB0byBpZ25vcmUgZmlsZSB0aW1lcyBpbiB0aGUgY29tcGFyaXNvbgogICAgICAqIEBwYXJhbSBpZ25vcmVGaWxlVGltZXMgaWYgdHJ1ZSBpZ25vcmUgZmlsZSB0aW1lcwpAQCAtNjMsNiArNjIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUZpbGVUaW1lcyhib29sZWFuIGlnbm9yZUZpbGVUaW1lcykgewogICAgICAgICB0aGlzLmlnbm9yZUZpbGVUaW1lcyA9IGlnbm9yZUZpbGVUaW1lczsKICAgICB9CisKICAgICAvKioKICAgICAgKiBUaGlzIGZsYWcgdGVsbHMgdGhlIHNlbGVjdG9yIHRvIGlnbm9yZSBjb250ZW50cwogICAgICAqIEBwYXJhbSBpZ25vcmVDb250ZW50cyBpZiB0cnVlIGlnbm9yZSBjb250ZW50cwpAQCAtNzEsNiArNzEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldElnbm9yZUNvbnRlbnRzKGJvb2xlYW4gaWdub3JlQ29udGVudHMpIHsKICAgICAgICAgdGhpcy5pZ25vcmVDb250ZW50cyA9IGlnbm9yZUNvbnRlbnRzOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIHRoaXMgdGVzdCBpcyBvdXIgc2VsZWN0aW9uIHRlc3QgdGhhdCBjb21wYXJlZCB0aGUgZmlsZSB3aXRoIHRoZSBkZXN0ZmlsZQogICAgICAqIEBwYXJhbSBzcmNmaWxlIHRoZSBzb3VyY2UgZmlsZQpAQCAtMTAwLDE2ICsxMDEsMTUgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIWlnbm9yZUNvbnRlbnRzKSB7Ci0gICAgICAgICAgICAvL2hlcmUgZG8gYSBidWxrIGNvbXBhcmlzb24KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoc3JjZmlsZSwgZGVzdGZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigid2hpbGUgY29tcGFyaW5nICIgKyBzcmNmaWxlICsgIiBhbmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBkZXN0ZmlsZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChpZ25vcmVDb250ZW50cykgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIC8vaGVyZSBkbyBhIGJ1bGsgY29tcGFyaXNvbgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMoc3JjZmlsZSwgZGVzdGZpbGUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIndoaWxlIGNvbXBhcmluZyAiICsgc3JjZmlsZSArICIgYW5kICIgKyBkZXN0ZmlsZSwgZSk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXhlY3V0YWJsZVNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXhlY3V0YWJsZVNlbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1YzZhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9FeGVjdXRhYmxlU2VsZWN0b3IuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworCisvKioKKyAqIEEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIGV4ZWN1dGFibGUgZmlsZXMuCisgKgorICogPHA+RXhlY3V0YWJsZSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIHtAbGluaworICogamF2YS5uaW8uZmlsZS5GaWxlcyNpc0V4ZWN1dGFibGV9LCB0aGlzIG1lYW5zIHRoZSBzZWxlY3RvciB3aWxsCisgKiBhY2NlcHQgYW55IGZpbGUgdGhhdCBleGlzdHMgYW5kIGlzIGV4ZWN1dGFibGUgYnkgdGhlCisgKiBhcHBsaWNhdGlvbi48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjEwLjAKKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dGFibGVTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbCAmJiBGaWxlcy5pc0V4ZWN1dGFibGUoZmlsZS50b1BhdGgoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXh0ZW5kRmlsZVNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRXh0ZW5kRmlsZVNlbGVjdG9yLmphdmEKaW5kZXggZmU5NzQwNi4uNDExY2FmZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZEZpbGVTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9FeHRlbmRGaWxlU2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9FeHRlbmRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZFNlbGVjdG9yLmphdmEKaW5kZXggYWY4YzkyMC4uODgxZjNlMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0V4dGVuZFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50Q2xhc3NMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zNywxNiArMzksMTEgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzbmFtZSA9IG51bGw7CiAgICAgcHJpdmF0ZSBGaWxlU2VsZWN0b3IgZHluc2VsZWN0b3IgPSBudWxsOwotICAgIHByaXZhdGUgVmVjdG9yPFBhcmFtZXRlcj4gcGFyYW1WZWMgPSBuZXcgVmVjdG9yPFBhcmFtZXRlcj4oKTsKKyAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0KKyAgICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PD4oKSk7CiAgICAgcHJpdmF0ZSBQYXRoIGNsYXNzcGF0aCA9IG51bGw7CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBFeHRlbmRTZWxlY3RvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBTZXRzIHRoZSBjbGFzc25hbWUgb2YgdGhlIGN1c3RvbSBzZWxlY3Rvci4KICAgICAgKgogICAgICAqIEBwYXJhbSBjbGFzc25hbWUgaXMgdGhlIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhpcyBzZWxlY3RvcgpAQCAtNTksOSArNTYsOSBAQAogICAgICAqIEluc3RhbnRpYXRlcyB0aGUgaWRlbnRpZmllZCBjdXN0b20gc2VsZWN0b3IgY2xhc3MuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2VsZWN0b3JDcmVhdGUoKSB7Ci0gICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCAmJiBjbGFzc25hbWUubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIGlmIChjbGFzc25hbWUgIT0gbnVsbCAmJiAhY2xhc3NuYW1lLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBDbGFzczw/PiBjID0gbnVsbDsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBjOwogICAgICAgICAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBjID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05NiwxMCArOTMsOSBAQAogICAgICAqIEBwYXJhbSBwIFRoZSBuZXcgUGFyYW1ldGVyIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZFBhcmFtKFBhcmFtZXRlciBwKSB7Ci0gICAgICAgIHBhcmFtVmVjLmFkZEVsZW1lbnQocCk7CisgICAgICAgIHBhcmFtZXRlcnMuYWRkKHApOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSBjbGFzc3BhdGggdG8gbG9hZCB0aGUgY2xhc3NuYW1lIHNwZWNpZmllZCB1c2luZyBhbiBhdHRyaWJ1dGUuCiAgICAgICogQHBhcmFtIGNsYXNzcGF0aCB0aGUgY2xhc3NwYXRoIHRvIHVzZQpAQCAtMTY2LDEzICsxNjIsMTIgQEAKICAgICAgICAgfSBlbHNlIGlmIChkeW5zZWxlY3RvciA9PSBudWxsKSB7CiAgICAgICAgICAgICBzZXRFcnJvcigiSW50ZXJuYWwgRXJyb3I6IFRoZSBjdXN0b20gc2VsZWN0b3Igd2FzIG5vdCBjcmVhdGVkIik7CiAgICAgICAgIH0gZWxzZSBpZiAoIShkeW5zZWxlY3RvciBpbnN0YW5jZW9mIEV4dGVuZEZpbGVTZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgKHBhcmFtVmVjLnNpemUoKSA+IDApKSB7Ci0gICAgICAgICAgICBzZXRFcnJvcigiQ2Fubm90IHNldCBwYXJhbWV0ZXJzIG9uIGN1c3RvbSBzZWxlY3RvciB0aGF0IGRvZXMgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiaW1wbGVtZW50IEV4dGVuZEZpbGVTZWxlY3RvciIpOworICAgICAgICAgICAgICAgICAgICAmJiAhcGFyYW1ldGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNldEVycm9yKAorICAgICAgICAgICAgICAgICJDYW5ub3Qgc2V0IHBhcmFtZXRlcnMgb24gY3VzdG9tIHNlbGVjdG9yIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IEV4dGVuZEZpbGVTZWxlY3RvciIpOwogICAgICAgICB9CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBBbGxvd3MgdGhlIGN1c3RvbSBzZWxlY3RvciB0byBjaG9vc2Ugd2hldGhlciB0byBzZWxlY3QgYSBmaWxlLiBUaGlzCiAgICAgICogaXMgYWxzbyB3aGVyZSB0aGUgUGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvIHRoZSBjdXN0b20gc2VsZWN0b3IsCkBAIC0xODgsMTQgKzE4MywxMiBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkKICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHZhbGlkYXRlKCk7Ci0gICAgICAgIGlmIChwYXJhbVZlYy5zaXplKCkgPiAwICYmIGR5bnNlbGVjdG9yIGluc3RhbmNlb2YgRXh0ZW5kRmlsZVNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbUFycmF5ID0gbmV3IFBhcmFtZXRlcltwYXJhbVZlYy5zaXplKCldOwotICAgICAgICAgICAgcGFyYW1WZWMuY29weUludG8ocGFyYW1BcnJheSk7CisgICAgICAgIGlmICghcGFyYW1ldGVycy5pc0VtcHR5KCkgJiYgZHluc2VsZWN0b3IgaW5zdGFuY2VvZiBFeHRlbmRGaWxlU2VsZWN0b3IpIHsKICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCBkeW5zZWxlY3RvciBtdXN0IGJlIG5vbi1udWxsIGlmIG5vIGVycm9yIG1lc3NhZ2UKLSAgICAgICAgICAgICgoRXh0ZW5kRmlsZVNlbGVjdG9yKSBkeW5zZWxlY3Rvcikuc2V0UGFyYW1ldGVycyhwYXJhbUFycmF5KTsKKyAgICAgICAgICAgICgoRXh0ZW5kRmlsZVNlbGVjdG9yKSBkeW5zZWxlY3Rvcikuc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnRvQXJyYXkobmV3IFBhcmFtZXRlcltwYXJhbWV0ZXJzLnNpemUoKV0pKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZHluc2VsZWN0b3IuaXNTZWxlY3RlZChiYXNlZGlyLCBmaWxlbmFtZSwgZmlsZSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlU2VsZWN0b3IuamF2YQppbmRleCA2MTRhOTcwLi5mMmMyNWIyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTMgKzIxLDE2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlJlc291cmNlU2VsZWN0b3I7CiAKIC8qKgogICogVGhpcyBpcyB0aGUgaW50ZXJmYWNlIHRvIGJlIHVzZWQgYnkgYWxsIHNlbGVjdG9ycy4KICAqCiAgKiBAc2luY2UgMS41CiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgRmlsZVNlbGVjdG9yIHsKK3B1YmxpYyBpbnRlcmZhY2UgRmlsZVNlbGVjdG9yIGV4dGVuZHMgUmVzb3VyY2VTZWxlY3RvciB7CiAKICAgICAvKioKICAgICAgKiBNZXRob2QgdGhhdCBlYWNoIHNlbGVjdG9yIHdpbGwgaW1wbGVtZW50IHRvIGNyZWF0ZSB0aGVpcgpAQCAtNDQsNSArNDcsMTUgQEAKICAgICBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkKICAgICAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudCBhIGJhc2ljIHtAbGluayBSZXNvdXJjZX0gc2VsZWN0aW9uIHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMKKyAgICAgKiB7QGxpbmsgRmlsZVNlbGVjdG9yfS4KKyAgICAgKiBAcGFyYW0gciByZXNvdXJjZQorICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgc2VsZWN0ZWQKKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNTZWxlY3RlZChSZXNvdXJjZSByKSB7CisgICAgICAgIHJldHVybiByLmFzT3B0aW9uYWwoRmlsZVByb3ZpZGVyLmNsYXNzKS5tYXAoRmlsZVByb3ZpZGVyOjpnZXRGaWxlKQorICAgICAgICAgICAgICAgIC5tYXAoZiAtPiBpc1NlbGVjdGVkKG51bGwsIG51bGwsIGYpKS5vckVsc2UoZmFsc2UpOworICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlbmFtZVNlbGVjdG9yLmphdmEKaW5kZXggZWMzNGUyMy4uYWFhYWNlNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZW5hbWVTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsMTIgKzMyLDYgQEAKICAqIEBzaW5jZSAxLjUKICAqLwogcHVibGljIGNsYXNzIEZpbGVuYW1lU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcmVnZXggPSBudWxsOwotICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGVkID0gZmFsc2U7CiAgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9LRVkgPSAibmFtZSI7CiAgICAgLyoqIFVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCkBAIC00NywxOCArNDEsMTcgQEAKICAgICAvKiogVXNlZCBmb3IgcGFyYW1ldGVyaXplZCBjdXN0b20gc2VsZWN0b3IgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUdFWF9LRVkgPSAicmVnZXgiOwogCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybiA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgcmVnZXggPSBudWxsOworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gdHJ1ZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBuZWdhdGVkID0gZmFsc2U7CisKICAgICAvLyBjYWNoZXMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMKICAgICBwcml2YXRlIFJlZ3VsYXJFeHByZXNzaW9uIHJlZzsKICAgICBwcml2YXRlIFJlZ2V4cCBleHByZXNzaW9uOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlbmFtZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBGaWxlbmFtZVNlbGVjdG9yKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC0xMjksNyArMTIyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3RvcgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyW10gcGFyYW1ldGVycykgeworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtZXRlcnMoUGFyYW1ldGVyLi4uIHBhcmFtZXRlcnMpIHsKICAgICAgICAgc3VwZXIuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVycykgewpAQCAtMTc4LDE4ICsxNzEsMTYgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKICAgICAgICAgdmFsaWRhdGUoKTsKICAgICAgICAgaWYgKHBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChTZWxlY3RvclV0aWxzLm1hdGNoUGF0aChwYXR0ZXJuLCBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZXNlbnNpdGl2ZSkgPT0gIShuZWdhdGVkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocmVnID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWcgPSBuZXcgUmVndWxhckV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICByZWcuc2V0UGF0dGVybihyZWdleCk7Ci0gICAgICAgICAgICAgICAgZXhwcmVzc2lvbiA9IHJlZy5nZXRSZWdleHAoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBvcHRpb25zID0gUmVnZXhwVXRpbC5hc09wdGlvbnMoY2FzZXNlbnNpdGl2ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5tYXRjaGVzKGZpbGVuYW1lLCBvcHRpb25zKSA9PSAhbmVnYXRlZDsKKyAgICAgICAgICAgIHJldHVybiBTZWxlY3RvclV0aWxzLm1hdGNoUGF0aChwYXR0ZXJuLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICBjYXNlc2Vuc2l0aXZlKSA9PSAhKG5lZ2F0ZWQpOwogICAgICAgICB9CisgICAgICAgIGlmIChyZWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVnID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uKCk7CisgICAgICAgICAgICByZWcuc2V0UGF0dGVybihyZWdleCk7CisgICAgICAgICAgICBleHByZXNzaW9uID0gcmVnLmdldFJlZ2V4cChnZXRQcm9qZWN0KCkpOworICAgICAgICB9CisgICAgICAgIGludCBvcHRpb25zID0gUmVnZXhwVXRpbC5hc09wdGlvbnMoY2FzZXNlbnNpdGl2ZSk7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uLm1hdGNoZXMoZmlsZW5hbWUsIG9wdGlvbnMpID09ICFuZWdhdGVkOwogICAgIH0KIAogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFqb3JpdHlTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01ham9yaXR5U2VsZWN0b3IuamF2YQppbmRleCA4NDIyNThmLi4zM2E4OGM5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFqb3JpdHlTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9NYWpvcml0eVNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiAvKioKICAqIFRoaXMgc2VsZWN0b3IgaXMgaGVyZSBqdXN0IHRvIHNoYWtlIHVwIHlvdXIgdGhpbmtpbmcgYSBiaXQuIERvbid0IGdldApAQCAtMzcsMTIgKzM3LDYgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gYWxsb3d0aWUgPSB0cnVlOwogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFqb3JpdHlTZWxlY3RvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewpAQCAtODEsMTEgKzc1LDkgQEAKICAgICAgICAgdmFsaWRhdGUoKTsKICAgICAgICAgaW50IHllc3ZvdGVzID0gMDsKICAgICAgICAgaW50IG5vdm90ZXMgPSAwOwotICAgICAgICBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IGUgPSBzZWxlY3RvckVsZW1lbnRzKCk7CiAKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGlmIChlLm5leHRFbGVtZW50KCkuaXNTZWxlY3RlZChiYXNlZGlyLAotICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZmlsZSkpIHsKKyAgICAgICAgZm9yIChGaWxlU2VsZWN0b3IgZnMgOiBDb2xsZWN0aW9ucy5saXN0KHNlbGVjdG9yRWxlbWVudHMoKSkpIHsKKyAgICAgICAgICAgIGlmIChmcy5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKSkgewogICAgICAgICAgICAgICAgIHllc3ZvdGVzKys7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG5vdm90ZXMrKzsKQEAgLTkzLDcgKzg1LDggQEAKICAgICAgICAgfQogICAgICAgICBpZiAoeWVzdm90ZXMgPiBub3ZvdGVzKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChub3ZvdGVzID4geWVzdm90ZXMpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAobm92b3RlcyA+IHllc3ZvdGVzKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Uga25vdyB3ZSBoYXZlIGEgdGllLgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01hcHBpbmdTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01hcHBpbmdTZWxlY3Rvci5qYXZhCmluZGV4IDkzNjA3NDAuLmEwNWI5NjMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9NYXBwaW5nU2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTWFwcGluZ1NlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NSwxNSArNDUsNiBAQAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKICAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBpbmdTZWxlY3RvcjwvY29kZT4gaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwcGluZ1NlbGVjdG9yKCkgewotICAgICAgICBncmFudWxhcml0eSA9IChpbnQpIEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCk7Ci0gICAgfQotCi0KLSAgICAvKioKICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmlsZSBvciBkaXJlY3Rvcnkgd2hpY2ggaXMgY2hlY2tlZCBmb3Igb3V0LW9mLWRhdGUKICAgICAgKiBmaWxlcy4KICAgICAgKgpAQCAtMTQwLDggKzEzMSw3IEBACiAgICAgICAgIFN0cmluZyBkZXN0bmFtZSA9IGRlc3RmaWxlc1swXTsKICAgICAgICAgRmlsZSBkZXN0ZmlsZSA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUodGFyZ2V0ZGlyLCBkZXN0bmFtZSk7CiAKLSAgICAgICAgYm9vbGVhbiBzZWxlY3RlZCA9IHNlbGVjdGlvblRlc3QoZmlsZSwgZGVzdGZpbGUpOwotICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgICAgIHJldHVybiBzZWxlY3Rpb25UZXN0KGZpbGUsIGRlc3RmaWxlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob25lU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob25lU2VsZWN0b3IuamF2YQppbmRleCA1MzZiNWI1Li4zMDQzNTZkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTm9uZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vbmVTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvKioKICAqIFRoaXMgc2VsZWN0b3IgaGFzIGEgY29sbGVjdGlvbiBvZiBvdGhlciBzZWxlY3RvcnMuIEFsbCBvZiB0aG9zZSBzZWxlY3RvcnMKQEAgLTMxLDEyICszMSw2IEBACiBwdWJsaWMgY2xhc3MgTm9uZVNlbGVjdG9yIGV4dGVuZHMgQmFzZVNlbGVjdG9yQ29udGFpbmVyIHsKIAogICAgIC8qKgotICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIE5vbmVTZWxlY3RvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvcgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC02MSwxNSArNTUsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewogICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IGUgPSBzZWxlY3RvckVsZW1lbnRzKCk7Ci0KLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIGlmIChlLm5leHRFbGVtZW50KCkuaXNTZWxlY3RlZChiYXNlZGlyLCBmaWxlbmFtZSwgZmlsZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBTdHJlYW0ub2YoZ2V0U2VsZWN0b3JzKGdldFByb2plY3QoKSkpCisgICAgICAgICAgICAubm9uZU1hdGNoKHMgLT4gcy5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKSk7CiAgICAgfQogCiB9Ci0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ob3RTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vdFNlbGVjdG9yLmphdmEKaW5kZXggNzFjMzk0MC4uNzE1MzY0MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vdFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL05vdFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02NCw4ICs2NCw4IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdmVyaWZ5U2V0dGluZ3MoKSB7CiAgICAgICAgIGlmIChzZWxlY3RvckNvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgc2V0RXJyb3IoIk9uZSBhbmQgb25seSBvbmUgc2VsZWN0b3IgaXMgYWxsb3dlZCB3aXRoaW4gdGhlICIKLSAgICAgICAgICAgICAgICArICI8bm90PiB0YWciKTsKKyAgICAgICAgICAgIHNldEVycm9yKAorICAgICAgICAgICAgICAgICJPbmUgYW5kIG9ubHkgb25lIHNlbGVjdG9yIGlzIGFsbG93ZWQgd2l0aGluIHRoZSA8bm90PiB0YWciKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL09yU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9PclNlbGVjdG9yLmphdmEKaW5kZXggYjA3Nzc0NC4uYzNiYjhhMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL09yU2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvT3JTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvKioKICAqIFRoaXMgc2VsZWN0b3IgaGFzIGEgY29sbGVjdGlvbiBvZiBvdGhlciBzZWxlY3RvcnMsIGFueSBvZiB3aGljaCBoYXZlIHRvCkBAIC0zMCwxMiArMzAsNiBAQAogcHVibGljIGNsYXNzIE9yU2VsZWN0b3IgZXh0ZW5kcyBCYXNlU2VsZWN0b3JDb250YWluZXIgewogCiAgICAgLyoqCi0gICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgT3JTZWxlY3RvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzZWxlY3RvcgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CkBAIC02MCwxNSArNTQsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewogICAgICAgICB2YWxpZGF0ZSgpOwotICAgICAgICBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IGUgPSBzZWxlY3RvckVsZW1lbnRzKCk7Ci0KLSAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHRoYXQgYWxsIGVsZW1lbnRzIGFyZSBjb3JyZWN0bHkgY29uZmlndXJlZAotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgaWYgKGUubmV4dEVsZW1lbnQoKS5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihnZXRTZWxlY3RvcnMoZ2V0UHJvamVjdCgpKSkKKyAgICAgICAgICAgIC5hbnlNYXRjaChzIC0+IHMuaXNTZWxlY3RlZChiYXNlZGlyLCBmaWxlbmFtZSwgZmlsZSkpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL093bmVkQnlTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL093bmVkQnlTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzEyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvT3duZWRCeVNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuTGlua09wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Vc2VyUHJpbmNpcGFsOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKKy8qKgorICogQSBzZWxlY3RvciB0aGF0IHNlbGVjdHMgZmlsZXMgYmFzZWQgb24gdGhlaXIgb3duZXIuCisgKgorICogPHA+T3duZXIgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiB7QGxpbmsKKyAqIGphdmEubmlvLmZpbGUuRmlsZXMjZ2V0T3duZXJ9LCB0aGlzIG1lYW5zIHRoZSBzZWxlY3RvciB3aWxsIGFjY2VwdAorICogYW55IGZpbGUgdGhhdCBleGlzdHMgYW5kIGlzIG93bmVkIGJ5IHRoZSBnaXZlbiB1c2VyLiBJZiB0aGUge0Bjb2RlCisgKiBnZXRPd25lcn0gbWV0aG9kIHRocm93cyBhbiB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259CisgKiB0aGUgZmlsZSBpbiBxdWVzdGlvbiBpcyBub3QgaW5jbHVkZWQuPC9wPgorICoKKyAqIEBzaW5jZSBBbnQgMS4xMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBPd25lZEJ5U2VsZWN0b3IgaW1wbGVtZW50cyBGaWxlU2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgb3duZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZm9sbG93U3ltbGlua3MgPSB0cnVlOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdXNlciBuYW1lIHRvIGxvb2sgZm9yLgorICAgICAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBuYW1lCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0T3duZXIoU3RyaW5nIG93bmVyKSB7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSAiZm9sbG93IHN5bWJvbGljIGxpbmtzIiBvcHRpb24uCisgICAgICogQHBhcmFtIGZvbGxvd1N5bWxpbmtzIHdoZXRoZXIgb3Igbm90IHN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSBmb2xsb3dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGb2xsb3dTeW1saW5rcyhib29sZWFuIGZvbGxvd1N5bWxpbmtzKSB7CisgICAgICAgIHRoaXMuZm9sbG93U3ltbGlua3MgPSBmb2xsb3dTeW1saW5rczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKKyAgICAgICAgaWYgKG93bmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIG93bmVyIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVXNlclByaW5jaXBhbCB1c2VyID0gZm9sbG93U3ltbGlua3MgPyBGaWxlcy5nZXRPd25lcihmaWxlLnRvUGF0aCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBGaWxlcy5nZXRPd25lcihmaWxlLnRvUGF0aCgpLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlciAhPSBudWxsICYmIG93bmVyLmVxdWFscyh1c2VyLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gPT4gbm90IHRoZSBleHBlY3RlZCBvd25lcgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Qb3NpeEdyb3VwU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Qb3NpeEdyb3VwU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzEwN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Bvc2l4R3JvdXBTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuTGlua09wdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Hcm91cFByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVBdHRyaWJ1dGVzOworCisvKioKKyAqIEEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIGZpbGVzIGJhc2VkIG9uIHRoZWlyIFBPU0lYIGdyb3VwLgorICoKKyAqIDxwPkdyb3VwIGlzIGRlZmluZWQgaW4gdGVybXMgb2Yge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjcmVhZEF0dHJpYnV0ZXN9CisgKiBncm91cCBhdHRyaWJ1dGUgYXMgcHJvdmlkZWQgYnkge0BsaW5rIGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZUF0dHJpYnV0ZXN9LAorICogdGhpcyBtZWFucyB0aGUgc2VsZWN0b3Igd2lsbCBhY2NlcHQgYW55IGZpbGUgdGhhdCBleGlzdHMgYW5kIGhhcyB0aGUgZ2l2ZW4KKyAqIGdyb3VwIGF0dHJpYnV0ZS48L3A+CisgKgorICogQHNpbmNlIEFudCAxLjEwLjQKKyAqLworcHVibGljIGNsYXNzIFBvc2l4R3JvdXBTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBncm91cDsKKworICAgIHByaXZhdGUgYm9vbGVhbiBmb2xsb3dTeW1saW5rcyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBncm91cCBuYW1lIHRvIGxvb2sgZm9yLgorICAgICAqIEBwYXJhbSBncm91cCB0aGUgZ3JvdXAgbmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdyb3VwKFN0cmluZyBncm91cCkgeworICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgImZvbGxvdyBzeW1ib2xpYyBsaW5rcyIgb3B0aW9uLgorICAgICAqIEBwYXJhbSBmb2xsb3dTeW1saW5rcyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9sbG93U3ltbGlua3MoYm9vbGVhbiBmb2xsb3dTeW1saW5rcykgeworICAgICAgICB0aGlzLmZvbGxvd1N5bWxpbmtzID0gZm9sbG93U3ltbGlua3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIGlmIChncm91cCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBncm91cCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgR3JvdXBQcmluY2lwYWwgYWN0dWFsR3JvdXAgPSBmb2xsb3dTeW1saW5rcyA/IEZpbGVzLnJlYWRBdHRyaWJ1dGVzKGZpbGUudG9QYXRoKCksCisgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZUF0dHJpYnV0ZXMuY2xhc3MpLmdyb3VwKCkgOiBGaWxlcy5yZWFkQXR0cmlidXRlcyhmaWxlLnRvUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBQb3NpeEZpbGVBdHRyaWJ1dGVzLmNsYXNzLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKS5ncm91cCgpOworICAgICAgICAgICAgcmV0dXJuIGFjdHVhbEdyb3VwICE9IG51bGwgJiYgYWN0dWFsR3JvdXAuZ2V0TmFtZSgpLmVxdWFscyhncm91cCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vID0+IG5vdCB0aGUgZXhwZWN0ZWQgZ3JvdXAKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Bvc2l4UGVybWlzc2lvbnNTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Bvc2l4UGVybWlzc2lvbnNTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjljMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlBlcm1pc3Npb25VdGlsczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZVBlcm1pc3Npb25zOworCisvKioKKyAqIEEgc2VsZWN0b3IgdGhhdCBzZWxlY3RzIGZpbGVzIGJhc2VkIG9uIHRoZWlyIFBPU0lYIHBlcm1pc3Npb25zLgorICoKKyAqIDxwPlBlcm1pc3Npb25zIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHtAbGluaworICogamF2YS5uaW8uZmlsZS5GaWxlcyNnZXRQb3NpeEZpbGVQZXJtaXNzaW9uc30sIHRoaXMgbWVhbnMgdGhlIHNlbGVjdG9yIHdpbGwgYWNjZXB0CisgKiBhbnkgZmlsZSB0aGF0IGV4aXN0cyBhbmQgaGFzIGdpdmVuIFBPU0lYIHBlcm1pc3Npb25zLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuMTAuNAorICovCitwdWJsaWMgY2xhc3MgUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yIGltcGxlbWVudHMgRmlsZVNlbGVjdG9yIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHBlcm1pc3Npb25zOworCisgICAgcHJpdmF0ZSBib29sZWFuIGZvbGxvd1N5bWxpbmtzID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBlcm1pc3Npb25zIHRvIGxvb2sgZm9yLgorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyB0aGUgcGVybWlzc2lvbnMgc3RyaW5nIChyd3hyd3hyd3ggb3Igb2N0YWwpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGVybWlzc2lvbnMoU3RyaW5nIHBlcm1pc3Npb25zKSB7CisgICAgICAgIGlmIChwZXJtaXNzaW9ucy5sZW5ndGgoKSA9PSAzICYmIHBlcm1pc3Npb25zLm1hdGNoZXMoIl5bMC03XSskIikpIHsKKyAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBQb3NpeEZpbGVQZXJtaXNzaW9ucy50b1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvblV0aWxzLnBlcm1pc3Npb25zRnJvbU1vZGUoSW50ZWdlci5wYXJzZUludChwZXJtaXNzaW9ucywgOCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25zID0gUG9zaXhGaWxlUGVybWlzc2lvbnMudG9TdHJpbmcoUG9zaXhGaWxlUGVybWlzc2lvbnMuZnJvbVN0cmluZyhwZXJtaXNzaW9ucykpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhlIHBlcm1pc3Npb25zIGF0dHJpYnV0ZSAiICsgcGVybWlzc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIGludmFsaWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSAiZm9sbG93IHN5bWJvbGljIGxpbmtzIiBmbGFnLgorICAgICAqIEBwYXJhbSBmb2xsb3dTeW1saW5rcyB3aGV0aGVyIG9yIG5vdCBzeW1ib2xpYyBsaW5rcyBzaG91bGQgYmUgZm9sbG93ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rm9sbG93U3ltbGlua3MoYm9vbGVhbiBmb2xsb3dTeW1saW5rcykgeworICAgICAgICB0aGlzLmZvbGxvd1N5bWxpbmtzID0gZm9sbG93U3ltbGlua3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CisgICAgICAgIGlmIChwZXJtaXNzaW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoZSBwZXJtaXNzaW9ucyBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIFBvc2l4RmlsZVBlcm1pc3Npb25zLnRvU3RyaW5nKGZvbGxvd1N5bWxpbmtzCisgICAgICAgICAgICAgICAgICAgID8gRmlsZXMuZ2V0UG9zaXhGaWxlUGVybWlzc2lvbnMoZmlsZS50b1BhdGgoKSkKKyAgICAgICAgICAgICAgICAgICAgOiBGaWxlcy5nZXRQb3NpeEZpbGVQZXJtaXNzaW9ucyhmaWxlLnRvUGF0aCgpLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKSkKKyAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhwZXJtaXNzaW9ucyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vID0+IG5vdCB0aGUgZXhwZWN0ZWQgcGVybWlzc2lvbnMKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1ByZXNlbnRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1ByZXNlbnRTZWxlY3Rvci5qYXZhCmluZGV4IDcyNWIzMWUuLjk2Njk1ZTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUHJlc2VudFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MiwxMyArNDIsNiBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBkZXN0bXVzdGV4aXN0ID0gdHJ1ZTsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UHJlc2VudFNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBQcmVzZW50U2VsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CiAgICAgICovCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUmVhZGFibGVTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1JlYWRhYmxlU2VsZWN0b3IuamF2YQppbmRleCBiMGM1MjdjLi5iYTViZWFjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUmVhZGFibGVTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9SZWFkYWJsZVNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxMCArMjAsNiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuc2VsZWN0b3JzLlJlc291cmNlU2VsZWN0b3I7Ci0KIC8qKgogICogQSBzZWxlY3RvciB0aGF0IHNlbGVjdHMgcmVhZGFibGUgZmlsZXMuCiAgKgpAQCAtMzMsMTcgKzI5LDExIEBACiAgKgogICogQHNpbmNlIEFudCAxLjguMAogICovCi1wdWJsaWMgY2xhc3MgUmVhZGFibGVTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciwgUmVzb3VyY2VTZWxlY3RvciB7CitwdWJsaWMgY2xhc3MgUmVhZGFibGVTZWxlY3RvciBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvciB7CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKICAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbCAmJiBmaWxlLmNhblJlYWQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKLSAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0gci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoZnAgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQobnVsbCwgbnVsbCwgZnAuZ2V0RmlsZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdFNlbGVjdG9yLmphdmEKaW5kZXggMjA4OTAxMi4uMWQ3ZTYzNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MCwxNiArNDAsMTAgQEAKICAgICBwcml2YXRlIE9iamVjdCB1bmxlc3NDb25kaXRpb247CiAKICAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBTZWxlY3RTZWxlY3RvcigpIHsKLSAgICB9Ci0KLSAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyBvYmplY3QKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGlmIChoYXNTZWxlY3RvcnMoKSkgewogICAgICAgICAgICAgYnVmLmFwcGVuZCgie3NlbGVjdCIpOwogICAgICAgICAgICAgaWYgKGlmQ29uZGl0aW9uICE9IG51bGwpIHsKQEAgLTcyLDE0ICs2NiwxNCBAQAogICAgICAqIHJlZmVyZW5jZWQgU2VsZWN0b3IuCiAgICAgICovCiAgICAgcHJpdmF0ZSBTZWxlY3RTZWxlY3RvciBnZXRSZWYoKSB7Ci0gICAgICAgIE9iamVjdCBvID0gZ2V0Q2hlY2tlZFJlZih0aGlzLmdldENsYXNzKCksICJTZWxlY3RTZWxlY3RvciIpOwotICAgICAgICByZXR1cm4gKFNlbGVjdFNlbGVjdG9yKSBvOworICAgICAgICByZXR1cm4gZ2V0Q2hlY2tlZFJlZihTZWxlY3RTZWxlY3Rvci5jbGFzcyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBzZWxlY3RvcnMgaGVyZS4KICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgYW55IHNlbGVjdG9ycyBhcmUgaW4gdGhpcyBjb250YWluZXIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZWxlY3RvcnMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuaGFzU2VsZWN0b3JzKCk7CkBAIC05MSw2ICs4NSw3IEBACiAgICAgICogR2l2ZXMgdGhlIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIGluIHRoaXMgY29udGFpbmVyCiAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgc2VsZWN0b3JDb3VudCgpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHJldHVybiBnZXRSZWYoKS5zZWxlY3RvckNvdW50KCk7CkBAIC0xMDMsNiArOTgsNyBAQAogICAgICAqIEBwYXJhbSBwIHRoZSBjdXJyZW50IHByb2plY3QKICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNlbGVjdG9ycyBpbiB0aGlzIGNvbnRhaW5lcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBGaWxlU2VsZWN0b3JbXSBnZXRTZWxlY3RvcnMoUHJvamVjdCBwKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuZ2V0U2VsZWN0b3JzKHApOwpAQCAtMTE0LDYgKzExMCw3IEBACiAgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdG9yIGZvciBhY2Nlc3NpbmcgdGhlIHNldCBvZiBzZWxlY3RvcnMuCiAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdG9yIHRoYXQgZ29lcyB0aHJvdWdoIGVhY2ggb2YgdGhlIHNlbGVjdG9ycwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxGaWxlU2VsZWN0b3I+IHNlbGVjdG9yRWxlbWVudHMoKSB7CiAgICAgICAgIGlmIChpc1JlZmVyZW5jZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0UmVmKCkuc2VsZWN0b3JFbGVtZW50cygpOwpAQCAtMTI2LDYgKzEyMyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgdGhlIG5ldyBzZWxlY3RvciB0byBhZGQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhcHBlbmRTZWxlY3RvcihGaWxlU2VsZWN0b3Igc2VsZWN0b3IpIHsKICAgICAgICAgaWYgKGlzUmVmZXJlbmNlKCkpIHsKICAgICAgICAgICAgIHRocm93IG5vQ2hpbGRyZW5BbGxvd2VkKCk7CkBAIC0xMzgsMTEgKzEzNiwxMSBAQAogICAgICAqIE1ha2VzIHN1cmUgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSwgc2V0cyBhbiBlcnJvciBtZXNzYWdlIGlmCiAgICAgICogbm90LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgewogICAgICAgICBpbnQgY250ID0gc2VsZWN0b3JDb3VudCgpOwogICAgICAgICBpZiAoY250IDwgMCB8fCBjbnQgPiAxKSB7Ci0gICAgICAgICAgICBzZXRFcnJvcigiT25seSBvbmUgc2VsZWN0b3IgaXMgYWxsb3dlZCB3aXRoaW4gdGhlICIKLSAgICAgICAgICAgICAgICArICI8c2VsZWN0b3I+IHRhZyIpOworICAgICAgICAgICAgc2V0RXJyb3IoIk9ubHkgb25lIHNlbGVjdG9yIGlzIGFsbG93ZWQgd2l0aGluIHRoZSA8c2VsZWN0b3I+IHRhZyIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTIsMjAgKzIxMCwxNyBAQAogICAgICAqIGNhbiB1c2UKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewogICAgICAgICB2YWxpZGF0ZSgpOwogCiAgICAgICAgIC8vIERlYWwgd2l0aCBpZiBhbmQgdW5sZXNzIHByb3BlcnRpZXMgZmlyc3QKLSAgICAgICAgaWYgKCEocGFzc2VzQ29uZGl0aW9ucygpKSkgeworICAgICAgICBpZiAoIXBhc3Nlc0NvbmRpdGlvbnMoKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgRW51bWVyYXRpb248RmlsZVNlbGVjdG9yPiBlID0gc2VsZWN0b3JFbGVtZW50cygpOwotICAgICAgICBpZiAoIWUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIEZpbGVTZWxlY3RvciBmID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICByZXR1cm4gZi5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuICFlLmhhc01vcmVFbGVtZW50cygpIHx8IGUubmV4dEVsZW1lbnQoKS5pc1NlbGVjdGVkKGJhc2VkaXIsIGZpbGVuYW1lLCBmaWxlKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvckNvbnRhaW5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yQ29udGFpbmVyLmphdmEKaW5kZXggNDdlNGU0Zi4uMjEwNzQ1NCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yQ29udGFpbmVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yQ29udGFpbmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JTY2FubmVyLmphdmEKaW5kZXggZGY5ZjhhNC4uNzU3MzM5ZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yU2Nhbm5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2VsZWN0b3JVdGlscy5qYXZhCmluZGV4IGEyODA0YzIuLmE3OTdkYzUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TZWxlY3RvclV0aWxzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NlbGVjdG9yVXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1MywyMCArMTUzLDEwIEBACiAgICAgICAgICAgICBzdHJJZHhTdGFydCsrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gQ2hlY2tTdHlsZTpTaW1wbGlmeUJvb2xlYW5SZXR1cm5DaGVjayBPRkYKLSAgICAgICAgLy8gQ2hlY2sgdHVybmVkIG9mZiBhcyB0aGUgY29kZSBuZWVkcyB0aGUgY29tbWVudHMgZm9yIHRoZSB2YXJpb3VzCi0gICAgICAgIC8vIGNvZGUgcGF0aHMuCi0gICAgICAgIGlmIChzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewotICAgICAgICAgICAgLy8gU3RyaW5nIGlzIGV4aGF1c3RlZAotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAocGF0SWR4U3RhcnQgPiBwYXRJZHhFbmQpIHsKLSAgICAgICAgICAgIC8vIFN0cmluZyBub3QgZXhoYXVzdGVkLCBidXQgcGF0dGVybiBpcy4gRmFpbHVyZS4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHBhdHRlcm4gbm93IGhvbGRzICoqIHdoaWxlIHN0cmluZyBpcyBub3QgZXhoYXVzdGVkCi0gICAgICAgICAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgZmFsc2UgcG9zaXRpdmVzIGJ1dCB3ZSBjYW4gbGl2ZSB3aXRoIHRoYXQuCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICAvLyBGYWlsIGlmIHN0cmluZyBpcyBub3QgZXhoYXVzdGVkIG9yIHBhdHRlcm4gaXMgZXhoYXVzdGVkCisgICAgICAgIC8vIE90aGVyd2lzZSB0aGUgcGF0dGVybiBub3cgaG9sZHMgKiogd2hpbGUgc3RyaW5nIGlzIG5vdCBleGhhdXN0ZWQKKyAgICAgICAgLy8gdGhpcyB3aWxsIGdlbmVyYXRlIGZhbHNlIHBvc2l0aXZlcyBidXQgd2UgY2FuIGxpdmUgd2l0aCB0aGF0LgorICAgICAgICByZXR1cm4gc3RySWR4U3RhcnQgPiBzdHJJZHhFbmQgfHwgcGF0SWR4U3RhcnQgPD0gcGF0SWR4RW5kOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQ1LDExICsyMzUsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwYXRJZHhTdGFydCA+IHBhdElkeEVuZCkgewotICAgICAgICAgICAgICAgIC8vIFN0cmluZyBub3QgZXhoYXVzdGVkLCBidXQgcGF0dGVybiBpcy4gRmFpbHVyZS4KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhdElkeFN0YXJ0ID4gcGF0SWR4RW5kKSB7CisgICAgICAgICAgICAvLyBTdHJpbmcgbm90IGV4aGF1c3RlZCwgYnV0IHBhdHRlcm4gaXMuIEZhaWx1cmUuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB1cCB0byBsYXN0ICcqKicKQEAgLTI5MywxOSArMjgyLDE3IEBACiAgICAgICAgICAgICBpbnQgc3RyTGVuZ3RoID0gKHN0cklkeEVuZCAtIHN0cklkeFN0YXJ0ICsgMSk7CiAgICAgICAgICAgICBpbnQgZm91bmRJZHggPSAtMTsKICAgICAgICAgICAgIHN0ckxvb3A6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBzdHJMZW5ndGggLSBwYXRMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGF0TGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlBhdCA9IHRva2VuaXplZFBhdHRlcm5bcGF0SWR4U3RhcnQgKyBqICsgMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdWJTdHIgPSBzdHJEaXJzW3N0cklkeFN0YXJ0ICsgaSArIGpdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoKHN1YlBhdCwgc3ViU3RyLCBpc0Nhc2VTZW5zaXRpdmUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCArIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViUGF0ID0gdG9rZW5pemVkUGF0dGVybltwYXRJZHhTdGFydCArIGogKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1YlN0ciA9IHN0ckRpcnNbc3RySWR4U3RhcnQgKyBpICsgal07CisgICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2goc3ViUGF0LCBzdWJTdHIsIGlzQ2FzZVNlbnNpdGl2ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHN0ckxvb3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCArIGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZm91bmRJZHggPT0gLTEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC0zMTUsMTEgKzMwMiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IHBhdElkeFN0YXJ0OyBpIDw9IHBhdElkeEVuZDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIXRva2VuaXplZFBhdHRlcm5baV0uZXF1YWxzKERFRVBfVFJFRV9NQVRDSCkpIHsKKyAgICAgICAgICAgIGlmICghREVFUF9UUkVFX01BVENILmVxdWFscyh0b2tlbml6ZWRQYXR0ZXJuW2ldKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIApAQCAtMzgyLDEwICszNjgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gcGF0SWR4RW5kOyBpKyspIHsKICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcGF0QXJyW2ldOwotICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwgc3RyQXJyW2ldKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBDaGFyYWN0ZXIgbWlzbWF0Y2gKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPycgJiYgZGlmZmVyZW50KGNhc2VTZW5zaXRpdmUsIGNoLCBzdHJBcnJbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIFN0cmluZyBtYXRjaGVzIGFnYWluc3QgcGF0dGVybgpAQCAtNDAxLDEwICszODUsOSBAQAogICAgICAgICAgICAgaWYgKGNoID09ICcqJyB8fCBzdHJJZHhTdGFydCA+IHN0cklkeEVuZCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoICE9ICc/JykgewotICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbnQoY2FzZVNlbnNpdGl2ZSwgY2gsIHN0ckFycltzdHJJZHhTdGFydF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoICE9ICc/JworICAgICAgICAgICAgICAgICYmIGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwgc3RyQXJyW3N0cklkeFN0YXJ0XSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIENoYXJhY3RlciBtaXNtYXRjaAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGF0SWR4U3RhcnQrKzsKICAgICAgICAgICAgIHN0cklkeFN0YXJ0Kys7CkBAIC00MjEsMTAgKzQwNCw4IEBACiAgICAgICAgICAgICBpZiAoY2ggPT0gJyonIHx8IHN0cklkeFN0YXJ0ID4gc3RySWR4RW5kKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZmZlcmVudChjYXNlU2Vuc2l0aXZlLCBjaCwgc3RyQXJyW3N0cklkeEVuZF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoICE9ICc/JyAmJiBkaWZmZXJlbnQoY2FzZVNlbnNpdGl2ZSwgY2gsIHN0ckFycltzdHJJZHhFbmRdKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gQ2hhcmFjdGVyIG1pc21hdGNoCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwYXRJZHhFbmQtLTsKICAgICAgICAgICAgIHN0cklkeEVuZC0tOwpAQCAtNDU5LDE0ICs0NDAsMTEgQEAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHN0ckxlbmd0aCAtIHBhdExlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBwYXRMZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICBjaGFyIGNoID0gcGF0QXJyW3BhdElkeFN0YXJ0ICsgaiArIDFdOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2ggIT0gJz8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZmVyZW50KGNhc2VTZW5zaXRpdmUsIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJBcnJbc3RySWR4U3RhcnQgKyBpICsgal0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgc3RyTG9vcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9ICc/JyAmJiBkaWZmZXJlbnQoY2FzZVNlbnNpdGl2ZSwgY2gsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJBcnJbc3RySWR4U3RhcnQgKyBpICsgal0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBzdHJMb29wOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgZm91bmRJZHggPSBzdHJJZHhTdGFydCArIGk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00NzQsNyArNDUyLDYgQEAKICAgICAgICAgICAgIGlmIChmb3VuZElkeCA9PSAtMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcGF0SWR4U3RhcnQgPSBwYXRJZHhUbXA7CiAgICAgICAgICAgICBzdHJJZHhTdGFydCA9IGZvdW5kSWR4ICsgcGF0TGVuZ3RoOwogICAgICAgICB9CkBAIC01MjIsNyArNDk5LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPFN0cmluZz4gdG9rZW5pemVQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcgc2VwYXJhdG9yKSB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmc+IHJldCA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBWZWN0b3I8U3RyaW5nPiByZXQgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgaWYgKEZpbGVVdGlscy5pc0Fic29sdXRlUGF0aChwYXRoKSkgewogICAgICAgICAgICAgU3RyaW5nW10gcyA9IEZJTEVfVVRJTFMuZGlzc2VjdChwYXRoKTsKICAgICAgICAgICAgIHJldC5hZGQoc1swXSk7CkBAIC01MzgsNyArNTE1LDggQEAKICAgICAvKioKICAgICAgKiBTYW1lIGFzIHtAbGluayAjdG9rZW5pemVQYXRoIHRva2VuaXplUGF0aH0gYnV0IGhvcGVmdWxseSBmYXN0ZXIuCiAgICAgICovCi0gICAgLypwYWNrYWdlKi8gc3RhdGljIFN0cmluZ1tdIHRva2VuaXplUGF0aEFzQXJyYXkoU3RyaW5nIHBhdGgpIHsKKyAgICAvKiBwYWNrYWdlICovCisgICAgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplUGF0aEFzQXJyYXkoU3RyaW5nIHBhdGgpIHsKICAgICAgICAgU3RyaW5nIHJvb3QgPSBudWxsOwogICAgICAgICBpZiAoRmlsZVV0aWxzLmlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBzID0gRklMRV9VVElMUy5kaXNzZWN0KHBhdGgpOwpAQCAtNjAwLDE2ICs1NzgsOCBAQAogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgdGFyZ2V0IGlzIG91dCBvZiBkYXRlCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3V0T2ZEYXRlKEZpbGUgc3JjLCBGaWxlIHRhcmdldCwgaW50IGdyYW51bGFyaXR5KSB7Ci0gICAgICAgIGlmICghc3JjLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF0YXJnZXQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3JjLmxhc3RNb2RpZmllZCgpIC0gZ3JhbnVsYXJpdHkpID4gdGFyZ2V0Lmxhc3RNb2RpZmllZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBzcmMuZXhpc3RzKCkgJiYgKCF0YXJnZXQuZXhpc3RzKCkKKyAgICAgICAgICAgICAgICB8fCAoc3JjLmxhc3RNb2RpZmllZCgpIC0gZ3JhbnVsYXJpdHkpID4gdGFyZ2V0Lmxhc3RNb2RpZmllZCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTY2Myw3ICs2MzMsNyBAQAogICAgICAqIEByZXR1cm4gYSBTdHJpbmcgdGhhdCBoYXMgaGFkIGFsbCB3aGl0ZXNwYWNlIHJlbW92ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlV2hpdGVzcGFjZShTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dCk7CiAgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CkBAIC02NzksNyArNjQ5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjb250YWlucyBhdCBsZWFzdCBhIHN0YXIgb3IgYSBxdWVzdGlvbiBtYXJrCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1dpbGRjYXJkcyhTdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgcmV0dXJuIChpbnB1dC5pbmRleE9mKCcqJykgIT0gLTEgfHwgaW5wdXQuaW5kZXhPZignPycpICE9IC0xKTsKKyAgICAgICAgcmV0dXJuIGlucHV0LmNvbnRhaW5zKCIqIikgfHwgaW5wdXQuY29udGFpbnMoIj8iKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpZ25lZFNlbGVjdG9yLmphdmEKaW5kZXggY2Q1MTUwMi4uNDBmNDA5NSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpZ25lZFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpZ25lZFNlbGVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00OCw2ICs0OCw3IEBACiAgICAgICogQHBhcmFtIGZpbGUgICAgIHBhdGggdG8gZmlsZSB0byBiZSBzZWxlY3RlZAogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgZmlsZSBzaG91bGQgYmUgc2VsZWN0ZWQgb3Igbm90CiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CiAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gUXVpY2sgcmV0dXJuOiBkaXJlY3RvcmllcyBjYW5ub3QgYmUgc2lnbmVkCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2l6ZVNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2l6ZVNlbGVjdG9yLmphdmEKaW5kZXggNmY4ZDJkOC4uZTM3ZmEyYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaXplU2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTYyLDI0ICs2MiwxNCBAQAogICAgIHByaXZhdGUgQ29tcGFyaXNvbiB3aGVuID0gQ29tcGFyaXNvbi5FUVVBTDsKIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2l6ZVNlbGVjdG9yPC9jb2RlPiBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqLwotICAgIHB1YmxpYyBTaXplU2VsZWN0b3IoKSB7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCiAgICAgICogU2l6ZVNlbGVjdG9yLiBUaGlzIGlzICJ7c2l6ZXNlbGVjdG9yIHZhbHVlOiAiICsgJmx0OyJjb21wYXJlIiwKICAgICAgKiAibGVzcyIsICJtb3JlIiwgImVxdWFsIiZndDsgKyAifSIuCiAgICAgICogQHJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoaXMgb2JqZWN0CiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigie3NpemVzZWxlY3RvciB2YWx1ZTogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoc2l6ZWxpbWl0KTsKLSAgICAgICAgYnVmLmFwcGVuZCgiY29tcGFyZTogIikuYXBwZW5kKHdoZW4uZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie3NpemVzZWxlY3RvciB2YWx1ZTogJWQgY29tcGFyZTogJXN9IiwKKyAgICAgICAgICAgICAgICBzaXplbGltaXQsIHdoZW4uZ2V0VmFsdWUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjQsNyArMTU0LDggQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBjb21wbGV0ZSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhpcyBzZWxlY3Rvci4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKQEAgLTIyMCw2ICsyMTEsNyBAQAogICAgICAqIEBwYXJhbSBmaWxlIEEgRmlsZSBvYmplY3QgZm9yIHRoaXMgZmlsZW5hbWUuCiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBzZWxlY3RlZCBvciBub3QuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChGaWxlIGJhc2VkaXIsIFN0cmluZyBmaWxlbmFtZSwgRmlsZSBmaWxlKSB7CiAKICAgICAgICAgLy8gdGhyb3cgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TeW1saW5rU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TeW1saW5rU2VsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWI1NTJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1N5bWxpbmtTZWxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKKy8qKgorICogQSBzZWxlY3RvciB0aGF0IHNlbGVjdHMgc3ltYm9saWMgbGlua3MuCisgKgorICogPHA+RXhlY3V0YWJsZSBpcyBkZWZpbmVkIGluIHRlcm1zIG9mIHtAbGluaworICogamF2YS5uaW8uZmlsZS5GaWxlcyNpc1N5bWJvbGljTGlua30sIHRoaXMgbWVhbnMgdGhlIHNlbGVjdG9yIHdpbGwKKyAqIGFjY2VwdCBhbnkgZmlsZSB0aGF0IGV4aXN0cyBhbmQgaXMgYSBzeW1ib2xpYyBsaW5rLjwvcD4KKyAqCisgKiBAc2luY2UgQW50IDEuMTAuMAorICovCitwdWJsaWMgY2xhc3MgU3ltbGlua1NlbGVjdG9yIGltcGxlbWVudHMgRmlsZVNlbGVjdG9yIHsKKworICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gZmlsZSAhPSBudWxsICYmIEZpbGVzLmlzU3ltYm9saWNMaW5rKGZpbGUudG9QYXRoKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Rva2VuaXplZFBhdGguamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ub2tlbml6ZWRQYXRoLmphdmEKaW5kZXggY2QwNzcwYi4uYTkyZDdlNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Rva2VuaXplZFBhdGguamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVG9rZW5pemVkUGF0aC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTAgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TeW1ib2xpY0xpbmtVdGlsczsKIAogLyoqCiAgKiBDb250YWluZXIgZm9yIGEgcGF0aCB0aGF0IGhhcyBiZWVuIHNwbGl0IGludG8gaXRzIGNvbXBvbmVudHMuCkBAIC0zOCw5ICs0MCw2IEBACiAKICAgICAvKiogSGVscGVyLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotICAgIC8qKiBIZWxwZXIuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3ltYm9saWNMaW5rVXRpbHMgU1lNTElOS19VVElMUyA9Ci0gICAgICAgIFN5bWJvbGljTGlua1V0aWxzLmdldFN5bWJvbGljTGlua1V0aWxzKCk7CiAgICAgLyoqIGl0ZXJhdGlvbnMgZm9yIGNhc2Utc2Vuc2l0aXZlIHNjYW5uaW5nLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW5bXSBDU19TQ0FOX09OTFkgPSBuZXcgYm9vbGVhbltdIHt0cnVlfTsKICAgICAvKiogaXRlcmF0aW9ucyBmb3Igbm9uLWNhc2Utc2Vuc2l0aXZlIHNjYW5uaW5nLiAqLwpAQCAtNjUsOSArNjQsOCBAQAogICAgICAqIEBwYXJhbSBjaGlsZCB0aGUgY2hpbGQsIG11c3Qgbm90IGNvbnRhaW4gdGhlIGZpbGUgc2VwYXJhdG9yCiAgICAgICovCiAgICAgcHVibGljIFRva2VuaXplZFBhdGgoVG9rZW5pemVkUGF0aCBwYXJlbnQsIFN0cmluZyBjaGlsZCkgewotICAgICAgICBpZiAocGFyZW50LnBhdGgubGVuZ3RoKCkgPiAwCi0gICAgICAgICAgICAmJiBwYXJlbnQucGF0aC5jaGFyQXQocGFyZW50LnBhdGgubGVuZ3RoKCkgLSAxKQotICAgICAgICAgICAgICAgIT0gRmlsZS5zZXBhcmF0b3JDaGFyKSB7CisgICAgICAgIGlmICghcGFyZW50LnBhdGguaXNFbXB0eSgpCisgICAgICAgICAgICAmJiBwYXJlbnQucGF0aC5jaGFyQXQocGFyZW50LnBhdGgubGVuZ3RoKCkgLSAxKSAhPSBGaWxlLnNlcGFyYXRvckNoYXIpIHsKICAgICAgICAgICAgIHBhdGggPSBwYXJlbnQucGF0aCArIEZpbGUuc2VwYXJhdG9yQ2hhciArIGNoaWxkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcGF0aCA9IHBhcmVudC5wYXRoICsgY2hpbGQ7CkBAIC0xNDIsMjIgKzE0MCwxNiBAQAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU3ltbGluayhGaWxlIGJhc2UpIHsKICAgICAgICAgZm9yIChTdHJpbmcgdG9rZW4gOiB0b2tlbml6ZWRQYXRoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGlmICgoYmFzZSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAmJiBTWU1MSU5LX1VUSUxTLmlzU3ltYm9saWNMaW5rKGJhc2UsIHRva2VuKSkKLSAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgKGJhc2UgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgJiYgU1lNTElOS19VVElMUy5pc1N5bWJvbGljTGluayh0b2tlbikpCi0gICAgICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYmFzZSA9IG5ldyBGaWxlKGJhc2UsIHRva2VuKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJJT0V4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgY2hlY2tpbmcgIgotICAgICAgICAgICAgICAgICAgICArICJmb3IgbGlua3MsIGNvdWxkbid0IGdldCBjYW5vbmljYWwgcGF0aCEiOwotICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgY2F1Z2h0IGFuZCByZWRpcmVjdGVkIHRvIEFudCdzIGxvZ2dpbmcgc3lzdGVtCi0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1zZyk7CisgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGhUb1RyYXZlcnNlOworICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhdGhUb1RyYXZlcnNlID0gUGF0aHMuZ2V0KHRva2VuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aFRvVHJhdmVyc2UgPSBQYXRocy5nZXQoYmFzZS50b1BhdGgoKS50b1N0cmluZygpLCB0b2tlbik7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRmlsZXMuaXNTeW1ib2xpY0xpbmsocGF0aFRvVHJhdmVyc2UpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiYXNlID0gbmV3IEZpbGUoYmFzZSwgdG9rZW4pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xOTQsOCArMTg2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZ1tdIGZpbGVzID0gYmFzZS5saXN0KCk7CiAgICAgICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiSU8gZXJyb3Igc2Nhbm5pbmcgZGlyZWN0b3J5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBiYXNlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIklPIGVycm9yIHNjYW5uaW5nIGRpcmVjdG9yeSAlcyIsCisgICAgICAgICAgICAgICAgICAgIGJhc2UuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgYm9vbGVhbltdIG1hdGNoQ2FzZSA9IGNzID8gQ1NfU0NBTl9PTkxZIDogQ1NfVEhFTl9OT05fQ1M7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVG9rZW5pemVkUGF0dGVybi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Rva2VuaXplZFBhdHRlcm4uamF2YQppbmRleCAyZjFiZTJmLi43NGRjOTE1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVG9rZW5pemVkUGF0dGVybi5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ub2tlbml6ZWRQYXR0ZXJuLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvKioKICAqIFByb3ZpZGVzIHJldXNhYmxlIHBhdGggcGF0dGVybiBtYXRjaGluZy4gIFBhdGhQYXR0ZXJuIGlzIHByZWZlcmFibGUKQEAgLTEyNSwxMiArMTI3LDcgQEAKICAgICAgKiBAcmV0dXJuIGJvb2xlYW4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1BhdHRlcm4oU3RyaW5nIHBhdCkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2VuaXplZFBhdHRlcm4ubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmICh0b2tlbml6ZWRQYXR0ZXJuW2ldLmVxdWFscyhwYXQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKHRva2VuaXplZFBhdHRlcm4pLmFueU1hdGNoKFByZWRpY2F0ZS5pc0VxdWFsKHBhdCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc5LDE2ICsxNzYsMTYgQEAKICAgICBwdWJsaWMgVG9rZW5pemVkUGF0dGVybiB3aXRob3V0TGFzdFRva2VuKCkgewogICAgICAgICBpZiAodG9rZW5pemVkUGF0dGVybi5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2FuJ3Qgc3RyaXAgYSB0b2tlbiBmcm9tIG5vdGhpbmciKTsKLSAgICAgICAgfSBlbHNlIGlmICh0b2tlbml6ZWRQYXR0ZXJuLmxlbmd0aCA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRU1QVFlfUEFUVEVSTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZyB0b1N0cmlwID0gdG9rZW5pemVkUGF0dGVyblt0b2tlbml6ZWRQYXR0ZXJuLmxlbmd0aCAtIDFdOwotICAgICAgICAgICAgaW50IGluZGV4ID0gcGF0dGVybi5sYXN0SW5kZXhPZih0b1N0cmlwKTsKLSAgICAgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbdG9rZW5pemVkUGF0dGVybi5sZW5ndGggLSAxXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodG9rZW5pemVkUGF0dGVybiwgMCwgdG9rZW5zLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZWRQYXR0ZXJuLmxlbmd0aCAtIDEpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbml6ZWRQYXR0ZXJuKHBhdHRlcm4uc3Vic3RyaW5nKDAsIGluZGV4KSwgdG9rZW5zKTsKICAgICAgICAgfQorICAgICAgICBpZiAodG9rZW5pemVkUGF0dGVybi5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1BBVFRFUk47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHRvU3RyaXAgPSB0b2tlbml6ZWRQYXR0ZXJuW3Rva2VuaXplZFBhdHRlcm4ubGVuZ3RoIC0gMV07CisgICAgICAgIGludCBpbmRleCA9IHBhdHRlcm4ubGFzdEluZGV4T2YodG9TdHJpcCk7CisgICAgICAgIFN0cmluZ1tdIHRva2VucyA9IG5ldyBTdHJpbmdbdG9rZW5pemVkUGF0dGVybi5sZW5ndGggLSAxXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weSh0b2tlbml6ZWRQYXR0ZXJuLCAwLCB0b2tlbnMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVkUGF0dGVybi5sZW5ndGggLSAxKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUb2tlbml6ZWRQYXR0ZXJuKHBhdHRlcm4uc3Vic3RyaW5nKDAsIGluZGV4KSwgdG9rZW5zKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9UeXBlU2VsZWN0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9UeXBlU2VsZWN0b3IuamF2YQppbmRleCBhOWQ4MTg2Li5mYjI5OTQ4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsMjYgKzMwLDE2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUeXBlU2VsZWN0b3IgZXh0ZW5kcyBCYXNlRXh0ZW5kU2VsZWN0b3IgewogCi0gICAgcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0KICAgICAvKiogS2V5IHRvIHVzZWQgZm9yIHBhcmFtZXRlcml6ZWQgY3VzdG9tIHNlbGVjdG9yICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9LRVkgPSAidHlwZSI7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlR5cGVTZWxlY3RvcjwvY29kZT4gaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKi8KLSAgICBwdWJsaWMgVHlwZVNlbGVjdG9yKCkgewotICAgIH0KKyAgICBwcml2YXRlIFN0cmluZyB0eXBlID0gbnVsbDsKIAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGlzIG9iamVjdAogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoInt0eXBlc2VsZWN0b3IgdHlwZTogIik7Ci0gICAgICAgIGJ1Zi5hcHBlbmQodHlwZSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIn0iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gInt0eXBlc2VsZWN0b3IgdHlwZTogIiArIHR5cGUgKyAifSI7CiAgICAgfQogCiAgICAgLyoqCkBAIC02Niw3ICs1Niw4IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgY29tcGxldGUgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2VsZWN0b3IKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIHN1cGVyLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHBhcmFtZXRlcnMpIHsKQEAgLTg3LDYgKzc4LDcgQEAKICAgICAgKiBtZWFucyB0aGF0IHRoZSBwYXR0ZXJuIGF0dHJpYnV0ZSBoYXMgYmVlbiBzZXQuCiAgICAgICoKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2ZXJpZnlTZXR0aW5ncygpIHsKICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgewogICAgICAgICAgICAgc2V0RXJyb3IoIlRoZSB0eXBlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOwpAQCAtMTAyLDYgKzk0LDcgQEAKICAgICAgKiBAcGFyYW0gZmlsZSBpcyBhIGphdmEuaW8uRmlsZSBvYmplY3QgdGhlIHNlbGVjdG9yIGNhbiB1c2UKICAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlIHNlbGVjdGVkIG9yIG5vdAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewogCiAgICAgICAgIC8vIHRocm93IEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCkBAIC0xMDksOSArMTAyLDggQEAKIAogICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoRmlsZVR5cGUuRElSKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhGaWxlVHlwZS5GSUxFKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoRmlsZVR5cGUuRklMRSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjYsMTAgKzExOCwxMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogQHJldHVybiB0aGUgdmFsdWVzIGFzIGFuIGFycmF5IG9mIHN0cmluZ3MKICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWVzKCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbXXtGSUxFLCBESVJ9OwogICAgICAgICB9CiAgICAgfQogCi0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Xcml0YWJsZVNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvV3JpdGFibGVTZWxlY3Rvci5qYXZhCmluZGV4IDZmZmQ1NzEuLmE4NWM5MWMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Xcml0YWJsZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1dyaXRhYmxlU2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEwICsyMCw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMuUmVzb3VyY2VTZWxlY3RvcjsKLQogLyoqCiAgKiBBIHNlbGVjdG9yIHRoYXQgc2VsZWN0cyB3cml0YWJsZSBmaWxlcy4KICAqCkBAIC0zMywxNCArMjksMTEgQEAKICAqCiAgKiBAc2luY2UgQW50IDEuOC4wCiAgKi8KLXB1YmxpYyBjbGFzcyBXcml0YWJsZVNlbGVjdG9yIGltcGxlbWVudHMgRmlsZVNlbGVjdG9yLCBSZXNvdXJjZVNlbGVjdG9yIHsKK3B1YmxpYyBjbGFzcyBXcml0YWJsZVNlbGVjdG9yIGltcGxlbWVudHMgRmlsZVNlbGVjdG9yIHsKIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIEZpbGUgZmlsZSkgewogICAgICAgICByZXR1cm4gZmlsZSAhPSBudWxsICYmIGZpbGUuY2FuV3JpdGUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKFJlc291cmNlIHIpIHsKLSAgICAgICAgRmlsZVByb3ZpZGVyIGZwID0gci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICByZXR1cm4gZnAgIT0gbnVsbCAmJiBpc1NlbGVjdGVkKG51bGwsIG51bGwsIGZwLmdldEZpbGUoKSk7Ci0gICAgfQogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0FsZ29yaXRobS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQWxnb3JpdGhtLmphdmEKaW5kZXggODJlMDQzYi4uMTUzOTVjZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQWxnb3JpdGhtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQWxnb3JpdGhtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9DYWNoZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQ2FjaGUuamF2YQppbmRleCAxM2M3NGMyLi42ZWVhYTYyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9DYWNoZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NhY2hlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9DaGVja3N1bUFsZ29yaXRobS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvQ2hlY2tzdW1BbGdvcml0aG0uamF2YQppbmRleCBkNDk3ZjE0Li40YjRhMTQ4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9DaGVja3N1bUFsZ29yaXRobS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0NoZWNrc3VtQWxnb3JpdGhtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw3ICsyMCw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkFkbGVyMzI7CkBAIC0xMDUsNiArMTA1LDcgQEAKICAgICAgKiBUaGlzIGFsZ29yaXRobSBzdXBwb3J0cyBvbmx5IENSQyBhbmQgQWRsZXIuCiAgICAgICogQHJldHVybiA8aT50cnVlPC9pPiBpZiBhbGwgaXMgb2ssIG90aGVyd2lzZSA8aT5mYWxzZTwvaT4uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKICAgICAgICAgcmV0dXJuICJDUkMiLmVxdWFscyhhbGdvcml0aG0pIHx8ICJBRExFUiIuZXF1YWxzKGFsZ29yaXRobSk7CiAgICAgfQpAQCAtMTE1LDI2ICsxMTYsMjIgQEAKICAgICAgKiBAcGFyYW0gZmlsZSAgICBGaWxlIG9iamVjdCBmb3Igd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBldmFsdWF0ZWQuCiAgICAgICogQHJldHVybiAgICAgICAgVGhlIHZhbHVlIGZvciB0aGF0IGZpbGUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKEZpbGUgZmlsZSkgewogICAgICAgICBpbml0Q2hlY2tzdW0oKTsKLSAgICAgICAgU3RyaW5nIHJ2YWwgPSBudWxsOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoZmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICAgY2hlY2tzdW0ucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaGVjayA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oZmlzLCBjaGVja3N1bSk7Ci0gICAgICAgICAgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShjaGVjayk7Ci0gICAgICAgICAgICAgICAgIHdoaWxlIChpbi5yZWFkKCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpbGUKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBydmFsID0gTG9uZy50b1N0cmluZyhjaGVjay5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICBpZiAoZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIGNoZWNrc3VtLnJlc2V0KCk7CisgICAgICAgICAgICB0cnkgKENoZWNrZWRJbnB1dFN0cmVhbSBjaGVjayA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0oZmlsZS50b1BhdGgoKSkpLCBjaGVja3N1bSkpIHsKKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgd2hpbGUgKGNoZWNrLnJlYWQoKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhjaGVjay5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpIHsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHJ2YWwgPSBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBydmFsOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKIApAQCAtMTQyLDExICsxMzksOCBAQAogICAgICAqIE92ZXJyaWRlIE9iamVjdC50b1N0cmluZygpLgogICAgICAqIEByZXR1cm4gc29tZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGFsZ29yaXRobS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjxDaGVja3N1bUFsZ29yaXRobToiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiYWxnb3JpdGhtPSIpLmFwcGVuZChhbGdvcml0aG0pOwotICAgICAgICBidWYuYXBwZW5kKCI+Iik7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIjxDaGVja3N1bUFsZ29yaXRobTphbGdvcml0aG09JXM+IiwgYWxnb3JpdGhtKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9EaWdlc3RBbGdvcml0aG0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0RpZ2VzdEFsZ29yaXRobS5qYXZhCmluZGV4IDk4OGEyNTYuLjYxN2U1NTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0RpZ2VzdEFsZ29yaXRobS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0RpZ2VzdEFsZ29yaXRobS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNyArMjAsOCBAQAogCiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuRGlnZXN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwpAQCAtMTE2LDEzICsxMTcsMTEgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgocHJvdmlkZXIgIT0gbnVsbCkgJiYgISIiLmVxdWFscyhwcm92aWRlcikgJiYgISJudWxsIi5lcXVhbHMocHJvdmlkZXIpKSB7CisgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsICYmICFwcm92aWRlci5pc0VtcHR5KCkgJiYgISJudWxsIi5lcXVhbHMocHJvdmlkZXIpKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKGFsZ29yaXRobSwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5vYWxnbykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihub2FsZ28pOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gbm9wcm92aWRlcikgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihub3Byb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB8IE5vU3VjaFByb3ZpZGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cnkgewpAQCAtMTQxLDY5ICsxNDAsNDcgQEAKICAgICAgKiBUaGlzIGFsZ29yaXRobSBzdXBwb3J0cyBvbmx5IE1ENSBhbmQgU0hBLgogICAgICAqIEByZXR1cm4gPGk+dHJ1ZTwvaT4gaWYgYWxsIGlzIG9rLCBvdGhlcndpc2UgPGk+ZmFsc2U8L2k+LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CiAgICAgICAgIHJldHVybiAiU0hBIi5lcXVhbHMoYWxnb3JpdGhtKSB8fCAiTUQ1Ii5lcXVhbHMoYWxnb3JpdGhtKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIENvbXB1dGVzIGEgdmFsdWUgZm9yIGEgZmlsZSBjb250ZW50IHdpdGggdGhlIHNwZWNpZmllZCBkaWdlc3QgYWxnb3JpdGhtLgogICAgICAqIEBwYXJhbSBmaWxlICAgIEZpbGUgb2JqZWN0IGZvciB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGV2YWx1YXRlZC4KICAgICAgKiBAcmV0dXJuICAgICAgICBUaGUgdmFsdWUgZm9yIHRoYXQgZmlsZQogICAgICAqLwogICAgIC8vIGltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSAuLi50YXNrZGVmcy5DaGVja3N1bSwgdGhhbmtzIHRvIE1hZ2VzaCBmb3IgaGludAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoRmlsZSBmaWxlKSB7CiAgICAgICAgIGlmICghZmlsZS5jYW5SZWFkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgICAgIGluaXRNZXNzYWdlRGlnZXN0KCk7Ci0gICAgICAgIFN0cmluZyBjaGVja3N1bSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW3JlYWRCdWZmZXJTaXplXTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdC5yZXNldCgpOwotICAgICAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0gICAgICAgICAgICAgICAgRGlnZXN0SW5wdXRTdHJlYW0gZGlzID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKGZpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZURpZ2VzdCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGRpcy5yZWFkKGJ1ZiwgMCwgcmVhZEJ1ZmZlclNpemUpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgZmlzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBieXRlW10gZmlsZURpZ2VzdCA9IG1lc3NhZ2VEaWdlc3QuZGlnZXN0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGNoZWNrc3VtU2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlRGlnZXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZXhTdHIKLSAgICAgICAgICAgICAgICAgICAgICAgID0gSW50ZWdlci50b0hleFN0cmluZyhCWVRFX01BU0sgJiBmaWxlRGlnZXN0W2ldKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhleFN0ci5sZW5ndGgoKSA8IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrc3VtU2IuYXBwZW5kKCIwIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2hlY2tzdW1TYi5hcHBlbmQoaGV4U3RyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tzdW0gPSBjaGVja3N1bVNiLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbcmVhZEJ1ZmZlclNpemVdOworICAgICAgICBtZXNzYWdlRGlnZXN0LnJlc2V0KCk7CisgICAgICAgIHRyeSAoRGlnZXN0SW5wdXRTdHJlYW0gZGlzID0gbmV3IERpZ2VzdElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKGZpbGUudG9QYXRoKCkpLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VEaWdlc3QpKSB7CisgICAgICAgICAgICAvLyByZWFkIHRoZSB3aG9sZSBzdHJlYW0KKyAgICAgICAgICAgIHdoaWxlIChkaXMucmVhZChidWYsIDAsIHJlYWRCdWZmZXJTaXplKSAhPSAtMSkgewogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBjaGVja3N1bVNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoYnl0ZSBkaWdlc3RCeXRlIDogbWVzc2FnZURpZ2VzdC5kaWdlc3QoKSkgeworICAgICAgICAgICAgICAgIGNoZWNrc3VtU2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMngiLCBCWVRFX01BU0sgJiBkaWdlc3RCeXRlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hlY2tzdW1TYi50b1N0cmluZygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gY2hlY2tzdW07CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KICAgICAgKiBAcmV0dXJuIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhbGdvcml0aG0uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWYuYXBwZW5kKCI8RGlnZXN0QWxnb3JpdGhtOiIpOwotICAgICAgICBidWYuYXBwZW5kKCJhbGdvcml0aG09IikuYXBwZW5kKGFsZ29yaXRobSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIjtwcm92aWRlcj0iKS5hcHBlbmQocHJvdmlkZXIpOwotICAgICAgICBidWYuYXBwZW5kKCI+Iik7Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIjxEaWdlc3RBbGdvcml0aG06YWxnb3JpdGhtPSVzO3Byb3ZpZGVyPSVzPiIsCisgICAgICAgICAgICBhbGdvcml0aG0sIHByb3ZpZGVyKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9FcXVhbENvbXBhcmF0b3IuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0VxdWFsQ29tcGFyYXRvci5qYXZhCmluZGV4IDk0ZmI5MzUuLmJlMDBhYTIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0VxdWFsQ29tcGFyYXRvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0VxdWFsQ29tcGFyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvSGFzaHZhbHVlQWxnb3JpdGhtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9IYXNodmFsdWVBbGdvcml0aG0uamF2YQppbmRleCBhYjg4NDlkLi4zY2U4OTEzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9IYXNodmFsdWVBbGdvcml0aG0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9IYXNodmFsdWVBbGdvcml0aG0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUzLDE4ICs1MywxNCBAQAogICAgICAvLyBCZWNhdXNlIHRoZSBjb250ZW50IGlzIG9ubHkgcmVhZCB0aGUgZmlsZSB3aWxsIG5vdCBiZSBkYW1hZ2VkLiBJIHRlc3RlZAogICAgICAvLyB3aXRoIEpQRywgWklQIGFuZCBQREYgYXMgYmluYXJ5IGZpbGVzLgogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoRmlsZSBmaWxlKSB7Ci0gICAgICAgIFJlYWRlciByID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmICghZmlsZS5jYW5SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHIgPSBuZXcgRmlsZVJlYWRlcihmaWxlKTsKKyAgICAgICAgaWYgKCFmaWxlLmNhblJlYWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChSZWFkZXIgciA9IG5ldyBGaWxlUmVhZGVyKGZpbGUpKSB7CiAgICAgICAgICAgICBpbnQgaGFzaCA9IEZpbGVVdGlscy5yZWFkRnVsbHkocikuaGFzaENvZGUoKTsKICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGhhc2gpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uocik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL0xhc3RNb2RpZmllZEFsZ29yaXRobS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvTGFzdE1vZGlmaWVkQWxnb3JpdGhtLmphdmEKaW5kZXggYWY4MzU4YS4uYTFmNGM2MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvTGFzdE1vZGlmaWVkQWxnb3JpdGhtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvTGFzdE1vZGlmaWVkQWxnb3JpdGhtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9Nb2RpZmllZFNlbGVjdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9Nb2RpZmllZFNlbGVjdG9yLmphdmEKaW5kZXggMzA2MDk5Yy4uOTNmZTIzYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvTW9kaWZpZWRTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL01vZGlmaWVkU2VsZWN0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDkgKzIxLDEwIEBACiAKIC8vIEphdmEKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMTE0LDcgKzExNSw3IEBACiAgKiBjb21wYXJpc29uLjwvcD4KICAqCiAgKiA8cD5BIHVzZWZ1bCBzY2VuYXJpbyBmb3IgdGhpcyBzZWxlY3RvciBpcyBpbnNpZGUgYSBidWlsZCBlbnZpcm9ubWVudAotICogZm9yIGhvbWVwYWdlIGdlbmVyYXRpb24gKGUuZy4gd2l0aCA8YSBocmVmPSJodHRwOi8vZm9ycmVzdC5hcGFjaGUub3JnLyI+CisgKiBmb3IgaG9tZXBhZ2UgZ2VuZXJhdGlvbiAoZS5nLiB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vZm9ycmVzdC5hcGFjaGUub3JnLyI+CiAgKiBBcGFjaGUgRm9ycmVzdDwvYT4pLjwvcD48cHJlPgogICogJmx0O3RhcmdldCBuYW1lPSJnZW5lcmF0ZS1hbmQtdXBsb2FkLXNpdGUiJmd0OwogICogICAgICZsdDtlY2hvJmd0OyBnZW5lcmF0ZSB0aGUgc2l0ZSB1c2luZyBmb3JyZXN0ICZsdDsvZWNobyZndDsKQEAgLTIwOSw3ICsyMTAsOCBAQAogICAgICAqIFBhcmFtZXRlciB2ZWN0b3Igd2l0aCBwYXJhbWV0ZXJzIGZvciBsYXRlciBpbml0aWFsaXphdGlvbi4KICAgICAgKiBAc2VlICNjb25maWd1cmUKICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxQYXJhbWV0ZXI+IGNvbmZpZ1BhcmFtZXRlciA9IG5ldyBWZWN0b3I8UGFyYW1ldGVyPigpOworICAgIHByaXZhdGUgTGlzdDxQYXJhbWV0ZXI+IGNvbmZpZ1BhcmFtZXRlciA9CisgICAgICAgIENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3QobmV3IEFycmF5TGlzdDw+KCkpOwogCiAgICAgLyoqCiAgICAgICogUGFyYW1ldGVyIHZlY3RvciB3aXRoIHNwZWNpYWwgcGFyYW1ldGVycyBmb3IgbGF0ZXIgaW5pdGlhbGl6YXRpb24uCkBAIC0yMTcsNyArMjE5LDggQEAKICAgICAgKiBUaGVzZSBwYXJhbWV0ZXJzIGFyZSB1c2VkIDxiPmFmdGVyPC9iPiB0aGUgcGFyYW1ldGVycyB3aXRoIHRoZSBwYXR0ZXJuICcqJy4KICAgICAgKiBAc2VlICNjb25maWd1cmUKICAgICAgKi8KLSAgICBwcml2YXRlIFZlY3RvcjxQYXJhbWV0ZXI+IHNwZWNpYWxQYXJhbWV0ZXIgPSBuZXcgVmVjdG9yPFBhcmFtZXRlcj4oKTsKKyAgICBwcml2YXRlIExpc3Q8UGFyYW1ldGVyPiBzcGVjaWFsUGFyYW1ldGVyID0KKyAgICAgICAgQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0PD4oKSk7CiAKICAgICAvKiogVGhlIGNsYXNzbG9hZGVyIG9mIHRoaXMgY2xhc3MuICovCiAgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBteUNsYXNzTG9hZGVyID0gbnVsbDsKQEAgLTIzOCw2ICsyNDEsNyBAQAogCiAKICAgICAvKiogT3ZlcnJpZGVzIEJhc2VTZWxlY3Rvci52ZXJpZnlTZXR0aW5ncygpLiAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZlcmlmeVNldHRpbmdzKCkgewogICAgICAgICBjb25maWd1cmUoKTsKICAgICAgICAgaWYgKGNhY2hlID09IG51bGwpIHsKQEAgLTI4Myw3ICsyODcsNyBAQAogICAgICAgICAvLwogICAgICAgICBQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7CiAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9ICJjYWNoZS5wcm9wZXJ0aWVzIjsKLSAgICAgICAgRmlsZSBjYWNoZWZpbGUgPSBudWxsOworICAgICAgICBGaWxlIGNhY2hlZmlsZTsKICAgICAgICAgaWYgKHAgIT0gbnVsbCkgewogICAgICAgICAgICAgLy8gbm9ybWFsIHVzZSBpbnNpZGUgQW50CiAgICAgICAgICAgICBjYWNoZWZpbGUgPSBuZXcgRmlsZShwLmdldEJhc2VEaXIoKSwgZmlsZW5hbWUpOwpAQCAtMzAzLDE0ICszMDcsMTQgQEAKICAgICAgICAgLy8gLS0tLS0gIFNldCB0aGUgbWFpbiBhdHRyaWJ1dGVzLCBwYXR0ZXJuICcqJyAgLS0tLS0KICAgICAgICAgLy8KICAgICAgICAgZm9yIChQYXJhbWV0ZXIgcGFyYW1ldGVyIDogY29uZmlnUGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldE5hbWUoKS5pbmRleE9mKCIuIikgPiAwKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldE5hbWUoKS5pbmRleE9mKCcuJykgPiAwKSB7CiAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhICouKiBwYXJhbWV0ZXIgZm9yIGxhdGVyIHVzZQogICAgICAgICAgICAgICAgIHNwZWNpYWxQYXJhbWV0ZXIuYWRkKHBhcmFtZXRlcik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVzZVBhcmFtZXRlcihwYXJhbWV0ZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbmZpZ1BhcmFtZXRlciA9IG5ldyBWZWN0b3I8UGFyYW1ldGVyPigpOworICAgICAgICBjb25maWdQYXJhbWV0ZXIuY2xlYXIoKTsKIAogICAgICAgICAvLyBzcGVjaWZ5IHRoZSBhbGdvcml0aG0gY2xhc3NuYW1lCiAgICAgICAgIGlmIChhbGdvTmFtZSAhPSBudWxsKSB7CkBAIC0zMjQsMTcgKzMyOCwxNSBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICgibGFzdG1vZGlmaWVkIi5lcXVhbHMoYWxnb05hbWUuZ2V0VmFsdWUoKSkpIHsKICAgICAgICAgICAgICAgICBhbGdvcml0aG0gPSBuZXcgTGFzdE1vZGlmaWVkQWxnb3JpdGhtKCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYWxnb3JpdGhtQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdXNlIEFsZ29yaXRobSBzcGVjaWZpZWQgYnkgY2xhc3NuYW1lCisgICAgICAgICAgICBhbGdvcml0aG0gPSBsb2FkQ2xhc3MoCisgICAgICAgICAgICAgICAgYWxnb3JpdGhtQ2xhc3MsCisgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBBbGdvcml0aG0uIiwKKyAgICAgICAgICAgICAgICBBbGdvcml0aG0uY2xhc3MpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGFsZ29yaXRobUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyB1c2UgQWxnb3JpdGhtIHNwZWNpZmllZCBieSBjbGFzc25hbWUKLSAgICAgICAgICAgICAgICBhbGdvcml0aG0gPSBsb2FkQ2xhc3MoCi0gICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobUNsYXNzLAotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFuIEFsZ29yaXRobS4iLAotICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0uY2xhc3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gZGVmYXVsdEFsZ29yaXRobTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgIGFsZ29yaXRobSA9IGRlZmF1bHRBbGdvcml0aG07CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzcGVjaWZ5IHRoZSBjYWNoZSBjbGFzc25hbWUKQEAgLTM0MywxNCArMzQ1LDEyIEBACiAgICAgICAgICAgICBpZiAoInByb3BlcnR5ZmlsZSIuZXF1YWxzKGNhY2hlTmFtZS5nZXRWYWx1ZSgpKSkgewogICAgICAgICAgICAgICAgIGNhY2hlID0gbmV3IFByb3BlcnRpZXNmaWxlQ2FjaGUoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjYWNoZUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHVzZSBDYWNoZSBzcGVjaWZpZWQgYnkgY2xhc3NuYW1lCisgICAgICAgICAgICBjYWNoZSA9IGxvYWRDbGFzcyhjYWNoZUNsYXNzLCAiaXMgbm90IGEgQ2FjaGUuIiwgQ2FjaGUuY2xhc3MpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNhY2hlQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBDYWNoZSBzcGVjaWZpZWQgYnkgY2xhc3NuYW1lCi0gICAgICAgICAgICAgICAgY2FjaGUgPSBsb2FkQ2xhc3MoY2FjaGVDbGFzcywgImlzIG5vdCBhIENhY2hlLiIsIENhY2hlLmNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAotICAgICAgICAgICAgICAgIGNhY2hlID0gZGVmYXVsdENhY2hlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gbm90aGluZyBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgY2FjaGUgPSBkZWZhdWx0Q2FjaGU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzcGVjaWZ5IHRoZSBjb21wYXJhdG9yIGNsYXNzbmFtZQpAQCAtMzY2LDI2ICszNjYsMjIgQEAKICAgICAgICAgICAgICAgICAvLyBIYXZlIHRvIHRoaW5rIGFib3V0IGxhenkgaW5pdGlhbGl6YXRpb24gaGVyZS4uLiAgSkhNCiAgICAgICAgICAgICAgICAgLy8gY29tcGFyYXRvciA9IG5ldyBqYXZhLnRleHQuUnVsZUJhc2VkQ29sbGF0b3IoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjb21wYXJhdG9yQ2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdXNlIEFsZ29yaXRobSBzcGVjaWZpZWQgYnkgY2xhc3NuYW1lCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBTdHJpbmc+IGxvY2FsQ29tcGFyYXRvciA9IGxvYWRDbGFzcygKKyAgICAgICAgICAgICAgICBjb21wYXJhdG9yQ2xhc3MsICJpcyBub3QgYSBDb21wYXJhdG9yLiIsIENvbXBhcmF0b3IuY2xhc3MpOworICAgICAgICAgICAgY29tcGFyYXRvciA9IGxvY2FsQ29tcGFyYXRvcjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjb21wYXJhdG9yQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIHVzZSBBbGdvcml0aG0gc3BlY2lmaWVkIGJ5IGNsYXNzbmFtZQotICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBTdHJpbmc+IGxvY2FsQ29tcGFyYXRvciA9IGxvYWRDbGFzcyhjb21wYXJhdG9yQ2xhc3MsICJpcyBub3QgYSBDb21wYXJhdG9yLiIsIENvbXBhcmF0b3IuY2xhc3MpOwotICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IgPSBsb2NhbENvbXBhcmF0b3I7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3I7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBub3RoaW5nIHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3I7CiAgICAgICAgIH0KIAogICAgICAgICAvLwogICAgICAgICAvLyAtLS0tLSAgU2V0IHRoZSBzcGVjaWFsIGF0dHJpYnV0ZXMsIHBhdHRlcm4gJyouKicgIC0tLS0tCiAgICAgICAgIC8vCi0gICAgICAgIGZvciAoSXRlcmF0b3I8UGFyYW1ldGVyPiBpdFNwZWNpYWwgPSBzcGVjaWFsUGFyYW1ldGVyLml0ZXJhdG9yKCk7IGl0U3BlY2lhbC5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBQYXJhbWV0ZXIgcGFyID0gaXRTcGVjaWFsLm5leHQoKTsKLSAgICAgICAgICAgIHVzZVBhcmFtZXRlcihwYXIpOwotICAgICAgICB9Ci0gICAgICAgIHNwZWNpYWxQYXJhbWV0ZXIgPSBuZXcgVmVjdG9yPFBhcmFtZXRlcj4oKTsKKyAgICAgICAgc3BlY2lhbFBhcmFtZXRlci5mb3JFYWNoKHRoaXM6OnVzZVBhcmFtZXRlcik7CisgICAgICAgIHNwZWNpYWxQYXJhbWV0ZXIuY2xlYXIoKTsKICAgICB9CiAKIApAQCAtNDA0LDcgKzQwMCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MKICAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsID0gZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gbnVsbDsKKyAgICAgICAgICAgIENsYXNzPD8+IGNsYXp6OwogICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBjbGF6eiA9IGNsLmxvYWRDbGFzcyhjbGFzc25hbWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQxNCwxMSArNDEwLDExIEBACiAgICAgICAgICAgICBPYmplY3QgcnYgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwogCiAgICAgICAgICAgICBpZiAoIXR5cGUuaXNJbnN0YW5jZShydikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlNwZWNpZmllZCBjbGFzcyAoIiArIGNsYXNzbmFtZSArICIpICIgKyBtc2cpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmaWVkIGNsYXNzICglcykgJXMiLCBjbGFzc25hbWUsIG1zZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gKFQpIHJ2OwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiU3BlY2lmaWVkIGNsYXNzICgiICsgY2xhc3NuYW1lICsgIikgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJTcGVjaWZpZWQgY2xhc3MgKCVzKSBub3QgZm91bmQuIiwgY2xhc3NuYW1lKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICAgICAgfQpAQCAtNDM1LDYgKzQzMSw3IEBACiAgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzZWxlY3RlZAogICAgICAqIEBzZWUgUmVzb3VyY2VTZWxlY3RvciNpc1NlbGVjdGVkKFJlc291cmNlKQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzU2VsZWN0ZWQoUmVzb3VyY2UgcmVzb3VyY2UpIHsKICAgICAgICAgaWYgKHJlc291cmNlLmlzRmlsZXN5c3RlbU9ubHkoKSkgewogICAgICAgICAgICAgLy8gV2UgaGF2ZSBhICdyZXNvdXJjZWQnIGZpbGUsIHNvIHJlY29udmVydCBpdCBhbmQgdXNlCkBAIC00NDQsMzAgKzQ0MSwyOSBAQAogICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZVJlc291cmNlLmdldE5hbWUoKTsKICAgICAgICAgICAgIEZpbGUgYmFzZWRpciA9IGZpbGVSZXNvdXJjZS5nZXRCYXNlRGlyKCk7CiAgICAgICAgICAgICByZXR1cm4gaXNTZWxlY3RlZChiYXNlZGlyLCBmaWxlbmFtZSwgZmlsZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIEhvdyB0byBoYW5kbGUgbm9uLWZpbGUtUmVzb3VyY2VzPyBJIGNvcHkgdGVtcG9yYXJpbHkgdGhlCi0gICAgICAgICAgICAgICAgLy8gcmVzb3VyY2UgdG8gYSBmaWxlIGFuZCB1c2UgdGhlIGZpbGUtaW1wbGVtZW50YXRpb24uCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzIGZ1ID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotICAgICAgICAgICAgICAgIEZpbGUgdG1wRmlsZSA9IGZ1LmNyZWF0ZVRlbXBGaWxlKGdldFByb2plY3QoKSwgIm1vZGlmaWVkLSIsICIudG1wIiwgbnVsbCwgdHJ1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIFJlc291cmNlIHRtcFJlc291cmNlID0gbmV3IEZpbGVSZXNvdXJjZSh0bXBGaWxlKTsKLSAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmNvcHlSZXNvdXJjZShyZXNvdXJjZSwgdG1wUmVzb3VyY2UpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQodG1wRmlsZS5nZXRQYXJlbnRGaWxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBGaWxlLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnRvTG9uZ1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkOwotICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gdW9lKSB7Ci0gICAgICAgICAgICAgICAgbG9nKCJUaGUgcmVzb3VyY2UgJyIKLSAgICAgICAgICAgICAgICAgICsgcmVzb3VyY2UuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICArICInIGRvZXMgbm90IHByb3ZpZGUgYW4gSW5wdXRTdHJlYW0sIHNvIGl0IGlzIG5vdCBjaGVja2VkLiAiCi0gICAgICAgICAgICAgICAgICArICJBY2NvcmRpbmcgdG8gJ3NlbHJlcycgYXR0cmlidXRlIHZhbHVlIGl0IGlzICIKLSAgICAgICAgICAgICAgICAgICsgKChzZWxlY3RSZXNvdXJjZXNXaXRob3V0SW5wdXRTdHJlYW0pID8gIiIgOiAiIG5vdCIpCi0gICAgICAgICAgICAgICAgICArICJzZWxlY3RlZC4iLCBQcm9qZWN0Lk1TR19JTkZPKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzV2l0aG91dElucHV0U3RyZWFtOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEhvdyB0byBoYW5kbGUgbm9uLWZpbGUtUmVzb3VyY2VzPyBJIGNvcHkgdGVtcG9yYXJpbHkgdGhlCisgICAgICAgICAgICAvLyByZXNvdXJjZSB0byBhIGZpbGUgYW5kIHVzZSB0aGUgZmlsZS1pbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgIEZpbGVVdGlscyBmdSA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICAgICAgICAgIEZpbGUgdG1wRmlsZSA9IGZ1LmNyZWF0ZVRlbXBGaWxlKGdldFByb2plY3QoKSwgIm1vZGlmaWVkLSIsICIudG1wIiwgbnVsbCwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgUmVzb3VyY2UgdG1wUmVzb3VyY2UgPSBuZXcgRmlsZVJlc291cmNlKHRtcEZpbGUpOworICAgICAgICAgICAgUmVzb3VyY2VVdGlscy5jb3B5UmVzb3VyY2UocmVzb3VyY2UsIHRtcFJlc291cmNlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNTZWxlY3RlZCA9IGlzU2VsZWN0ZWQodG1wRmlsZS5nZXRQYXJlbnRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcEZpbGUuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS50b0xvbmdTdHJpbmcoKSk7CisgICAgICAgICAgICB0bXBGaWxlLmRlbGV0ZSgpOworICAgICAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQ7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgeworICAgICAgICAgICAgbG9nKCJUaGUgcmVzb3VyY2UgJyIKKyAgICAgICAgICAgICAgKyByZXNvdXJjZS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgKyAiJyBkb2VzIG5vdCBwcm92aWRlIGFuIElucHV0U3RyZWFtLCBzbyBpdCBpcyBub3QgY2hlY2tlZC4gIgorICAgICAgICAgICAgICArICJBY2NvcmRpbmcgdG8gJ3NlbHJlcycgYXR0cmlidXRlIHZhbHVlIGl0IGlzICIKKyAgICAgICAgICAgICAgKyAoKHNlbGVjdFJlc291cmNlc1dpdGhvdXRJbnB1dFN0cmVhbSkgPyAiIiA6ICIgbm90IikKKyAgICAgICAgICAgICAgKyAic2VsZWN0ZWQuIiwgUHJvamVjdC5NU0dfSU5GTyk7CisgICAgICAgICAgICByZXR1cm4gc2VsZWN0UmVzb3VyY2VzV2l0aG91dElucHV0U3RyZWFtOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00ODAsMTEgKzQ3NiwxMSBAQAogICAgICAqIEBwYXJhbSBmaWxlIGFzIGRlc2NyaWJlZCBpbiBCYXNlRXh0ZW5kU2VsZWN0b3IKICAgICAgKiBAcmV0dXJuIGFzIGRlc2NyaWJlZCBpbiBCYXNlRXh0ZW5kU2VsZWN0b3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKEZpbGUgYmFzZWRpciwgU3RyaW5nIGZpbGVuYW1lLCBGaWxlIGZpbGUpIHsKICAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQoYmFzZWRpciwgZmlsZW5hbWUsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogVGhlIGJ1c2luZXNzIGxvZ2ljIG9mIHRoaXMgc2VsZWN0b3IgZm9yIHVzZSBhcyBSZXNvdXJjZVNlbGVjdG9yIG9mCiAgICAgICogRmlsZVNlbGVjdG9yLgpAQCAtNDkyLDcgKzQ4OCw3IEBACiAgICAgICogQHBhcmFtIGJhc2VkaXIgYXMgZGVzY3JpYmVkIGluIEJhc2VFeHRlbmRTZWxlY3RvcgogICAgICAqIEBwYXJhbSBmaWxlbmFtZSBhcyBkZXNjcmliZWQgaW4gQmFzZUV4dGVuZFNlbGVjdG9yCiAgICAgICogQHBhcmFtIGNhY2hlS2V5IHRoZSBuYW1lIGZvciB0aGUga2V5IGZvciBzdG9yaW5nIHRoZSBoYXNodmFsdWUKLSAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhlIGZpbGUgaXMgc2VsZWN0ZWQgb3RoZXJ3aXNlIDx0dD5mYWxzZTwvdHQ+CisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBpcyBzZWxlY3RlZCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2VsZWN0ZWQoRmlsZSBiYXNlZGlyLCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjYWNoZUtleSkgewogICAgICAgICB2YWxpZGF0ZSgpOwpAQCAtNTA3LDcgKzUwMyw3IEBACiAgICAgICAgIFN0cmluZyBjYWNoZWRWYWx1ZSA9IFN0cmluZy52YWx1ZU9mKGNhY2hlLmdldChmLmdldEFic29sdXRlUGF0aCgpKSk7CiAgICAgICAgIFN0cmluZyBuZXdWYWx1ZSA9IGFsZ29yaXRobS5nZXRWYWx1ZShmKTsKIAotICAgICAgICBib29sZWFuIHJ2ID0gKGNvbXBhcmF0b3IuY29tcGFyZShjYWNoZWRWYWx1ZSwgbmV3VmFsdWUpICE9IDApOworICAgICAgICBib29sZWFuIHJ2ID0gY29tcGFyYXRvci5jb21wYXJlKGNhY2hlZFZhbHVlLCBuZXdWYWx1ZSkgIT0gMDsKIAogICAgICAgICAvLyBNYXliZSB1cGRhdGUgdGhlIGNhY2hlCiAgICAgICAgIGlmICh1cGRhdGUgJiYgcnYpIHsKQEAgLTUxNyw3ICs1MTMsNiBAQAogICAgICAgICAgICAgICAgIHNhdmVDYWNoZSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICAgICAgcmV0dXJuIHJ2OwogICAgIH0KIApAQCAtNjk3LDExICs2OTIsMTAgQEAKICAgICAgKiBAc2VlICNhZGRQYXJhbShTdHJpbmcsT2JqZWN0KQogICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIHRoZSBwYXJhbWV0ZXJzIHRvIHNldC4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlcltdIHBhcmFtZXRlcnMpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJzKFBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtZXRlci5hZGQocGFyYW1ldGVyc1tpXSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwoY29uZmlnUGFyYW1ldGVyLCBwYXJhbWV0ZXJzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzM1LDIzICs3MjksMTEgQEAKICAgICAgICAgICAgIGNuLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgIHNldENvbXBhcmF0b3IoY24pOwogICAgICAgICB9IGVsc2UgaWYgKCJ1cGRhdGUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICBib29sZWFuIHVwZGF0ZVZhbHVlID0KLSAgICAgICAgICAgICAgICAoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKQotICAgICAgICAgICAgICAgID8gdHJ1ZQotICAgICAgICAgICAgICAgIDogZmFsc2U7Ci0gICAgICAgICAgICBzZXRVcGRhdGUodXBkYXRlVmFsdWUpOworICAgICAgICAgICAgc2V0VXBkYXRlKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSk7CiAgICAgICAgIH0gZWxzZSBpZiAoImRlbGF5dXBkYXRlIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKLSAgICAgICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgICAgICA6IGZhbHNlOwotICAgICAgICAgICAgc2V0RGVsYXlVcGRhdGUodXBkYXRlVmFsdWUpOworICAgICAgICAgICAgc2V0RGVsYXlVcGRhdGUoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKTsKICAgICAgICAgfSBlbHNlIGlmICgic2VsZGlycyIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2RWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkKLSAgICAgICAgICAgICAgICA/IHRydWUKLSAgICAgICAgICAgICAgICA6IGZhbHNlOwotICAgICAgICAgICAgc2V0U2VsZGlycyhzZFZhbHVlKTsKKyAgICAgICAgICAgIHNldFNlbGRpcnMoInRydWUiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKTsKICAgICAgICAgfSBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aChDQUNIRV9QUkVGSVgpKSB7CiAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGtleS5zdWJzdHJpbmcoQ0FDSEVfUFJFRklYLmxlbmd0aCgpKTsKICAgICAgICAgICAgIHRyeVRvU2V0QVBhcmFtZXRlcihjYWNoZSwgbmFtZSwgdmFsdWUpOwpAQCAtNzgwLDcgKzc2Miw3IEBACiAgICAgICAgICAgICA9IEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKHByaiwgb2JqLmdldENsYXNzKCkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaUhlbHBlci5zZXRBdHRyaWJ1dGUocHJqLCBvYmosIG5hbWUsIHZhbHVlKTsKLSAgICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBuby1vcAogICAgICAgICB9CiAgICAgfQpAQCAtNzkzLDE1ICs3NzUsMTAgQEAKICAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KICAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VsZWN0b3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigie21vZGlmaWVkc2VsZWN0b3IiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIHVwZGF0ZT0iKS5hcHBlbmQodXBkYXRlKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIHNlbGRpcnM9IikuYXBwZW5kKHNlbGVjdERpcmVjdG9yaWVzKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiIGNhY2hlPSIpLmFwcGVuZChjYWNoZSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBhbGdvcml0aG09IikuYXBwZW5kKGFsZ29yaXRobSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIiBjb21wYXJhdG9yPSIpLmFwcGVuZChjb21wYXJhdG9yKTsKLSAgICAgICAgYnVmLmFwcGVuZCgifSIpOwotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7bW9kaWZpZWRzZWxlY3RvciB1cGRhdGU9JXMgc2VsZGlycz0lcyBjYWNoZT0lcyBhbGdvcml0aG09JXMgY29tcGFyYXRvcj0lc30iLAorICAgICAgICAgICAgICAgIHVwZGF0ZSwgc2VsZWN0RGlyZWN0b3JpZXMsIGNhY2hlLCBhbGdvcml0aG0sIGNvbXBhcmF0b3IpOwogICAgIH0KIAogCkBAIC04MTEsNyArNzg4LDggQEAKICAgICAvKioKICAgICAgKiBTaWduYWxzIHRoYXQgdGhlIGxhc3QgdGFyZ2V0IGhhcyBmaW5pc2hlZC4KICAgICAgKiBAcGFyYW0gZXZlbnQgcmVjZWl2ZWQgQnVpbGRFdmVudAotICAgICovCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChnZXREZWxheVVwZGF0ZSgpKSB7CiAgICAgICAgICAgICBzYXZlQ2FjaGUoKTsKQEAgLTgyMiw3ICs4MDAsOCBAQAogICAgIC8qKgogICAgICAqIFNpZ25hbHMgdGhhdCBhIHRhcmdldCBoYXMgZmluaXNoZWQuCiAgICAgICogQHBhcmFtIGV2ZW50IHJlY2VpdmVkIEJ1aWxkRXZlbnQKLSAgICAqLworICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgaWYgKGdldERlbGF5VXBkYXRlKCkpIHsKICAgICAgICAgICAgIHNhdmVDYWNoZSgpOwpAQCAtODMzLDcgKzgxMiw4IEBACiAgICAgLyoqCiAgICAgICogU2lnbmFscyB0aGF0IGEgdGFzayBoYXMgZmluaXNoZWQuCiAgICAgICogQHBhcmFtIGV2ZW50IHJlY2VpdmVkIEJ1aWxkRXZlbnQKLSAgICAqLworICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIGlmIChnZXREZWxheVVwZGF0ZSgpKSB7CiAgICAgICAgICAgICBzYXZlQ2FjaGUoKTsKQEAgLTg0NCw3ICs4MjQsOCBAQAogICAgIC8qKgogICAgICAqIFNpZ25hbHMgdGhhdCBhIGJ1aWxkIGhhcyBzdGFydGVkLgogICAgICAqIEBwYXJhbSBldmVudCByZWNlaXZlZCBCdWlsZEV2ZW50Ci0gICAgKi8KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAvLyBuby1vcAogICAgIH0KQEAgLTg1Myw3ICs4MzQsOCBAQAogICAgIC8qKgogICAgICAqIFNpZ25hbHMgdGhhdCBhIHRhcmdldCBpcyBzdGFydGluZy4KICAgICAgKiBAcGFyYW0gZXZlbnQgcmVjZWl2ZWQgQnVpbGRFdmVudAotICAgICovCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgIC8vIG5vLW9wCiAgICAgfQpAQCAtODYzLDcgKzg0NSw4IEBACiAgICAgLyoqCiAgICAgICogU2lnbmFscyB0aGF0IGEgdGFzayBpcyBzdGFydGluZy4KICAgICAgKiBAcGFyYW0gZXZlbnQgcmVjZWl2ZWQgQnVpbGRFdmVudAotICAgICovCisgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAvLyBuby1vcAogICAgIH0KQEAgLTg3Miw3ICs4NTUsOCBAQAogICAgIC8qKgogICAgICAqIFNpZ25hbHMgYSBtZXNzYWdlIGxvZ2dpbmcgZXZlbnQuCiAgICAgICogQHBhcmFtIGV2ZW50IHJlY2VpdmVkIEJ1aWxkRXZlbnQKLSAgICAqLworICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAvLyBuby1vcAogICAgIH0KQEAgLTkwNyw2ICs4OTEsNyBAQAogICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICAqIEBzZWUgRW51bWVyYXRlZEF0dHJpYnV0ZSNnZXRWYWx1ZXMoKQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsicHJvcGVydHlmaWxlIn07CiAgICAgICAgIH0KQEAgLTkzNyw2ICs5MjIsNyBAQAogICAgICAgICAgKiB7QGluaGVyaXREb2N9CiAgICAgICAgICAqIEBzZWUgRW51bWVyYXRlZEF0dHJpYnV0ZSNnZXRWYWx1ZXMoKQogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRWYWx1ZXMoKSB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsiaGFzaHZhbHVlIiwgImRpZ2VzdCIsICJjaGVja3N1bSIsICJsYXN0bW9kaWZpZWQifTsKICAgICAgICAgfQpAQCAtOTY3LDYgKzk1Myw3IEBACiAgICAgICAgICAqIHtAaW5oZXJpdERvY30KICAgICAgICAgICogQHNlZSBFbnVtZXJhdGVkQXR0cmlidXRlI2dldFZhbHVlcygpCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJlcXVhbCIsICJydWxlIn07CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL1Byb3BlcnRpZXNmaWxlQ2FjaGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZHNlbGVjdG9yL1Byb3BlcnRpZXNmaWxlQ2FjaGUuamF2YQppbmRleCBjODU2ZDU2Li5hMDllNzY1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWRzZWxlY3Rvci9Qcm9wZXJ0aWVzZmlsZUNhY2hlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkc2VsZWN0b3IvUHJvcGVydGllc2ZpbGVDYWNoZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsMTIgKzIyLDkgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiAKIC8qKgpAQCAtMTE5LDYgKzExNiw3IEBACiAgICAgICogVGhpcyBjYWNoZSBpcyB2YWxpZCBpZiB0aGUgY2FjaGVmaWxlIGlzIHNldC4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGlzIG9rIGZhbHNlIG90aGVyd2lzZQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CiAgICAgICAgIHJldHVybiAoY2FjaGVmaWxlICE9IG51bGwpOwogICAgIH0KQEAgLTEzMCwxMyArMTI4LDEyIEBACiAgICAgLyoqCiAgICAgICogTG9hZCB0aGUgY2FjaGUgZnJvbSB1bmRlcmx5aW5nIHByb3BlcnRpZXMgZmlsZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkKCkgewotICAgICAgICBpZiAoKGNhY2hlZmlsZSAhPSBudWxsKSAmJiBjYWNoZWZpbGUuaXNGaWxlKCkgJiYgY2FjaGVmaWxlLmNhblJlYWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBCdWZmZXJlZElucHV0U3RyZWFtIGJpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGNhY2hlZmlsZSkpOworICAgICAgICBpZiAoY2FjaGVmaWxlICE9IG51bGwgJiYgY2FjaGVmaWxlLmlzRmlsZSgpICYmIGNhY2hlZmlsZS5jYW5SZWFkKCkpIHsKKyAgICAgICAgICAgIHRyeSAoQnVmZmVyZWRJbnB1dFN0cmVhbSBiaXMgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShjYWNoZWZpbGUudG9QYXRoKCkpKSkgewogICAgICAgICAgICAgICAgIGNhY2hlLmxvYWQoYmlzKTsKLSAgICAgICAgICAgICAgICBiaXMuY2xvc2UoKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsgLy9OT1NPTkFSCiAgICAgICAgICAgICB9CkBAIC0xNTMsMTcgKzE1MCwxNiBAQAogICAgICAqIGltcGxlbWVudGF0aW9uIGNoZWNrcyB0aGUgZXhpc3RlbmNlIG9mIGVudHJpZXMgYmVmb3JlIGNyZWF0aW5nIHRoZSBmaWxlCiAgICAgICogZm9yIHBlcmZvcm1hbmNlIG9wdGltaXNhdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzYXZlKCkgewogICAgICAgICBpZiAoIWNhY2hlRGlydHkpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoKGNhY2hlZmlsZSAhPSBudWxsKSAmJiBjYWNoZS5wcm9wZXJ0eU5hbWVzKCkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgQnVmZmVyZWRPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGNhY2hlZmlsZSkpOworICAgICAgICBpZiAoY2FjaGVmaWxlICE9IG51bGwgJiYgY2FjaGUucHJvcGVydHlOYW1lcygpLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICB0cnkgKEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oY2FjaGVmaWxlLnRvUGF0aCgpKSkpIHsKICAgICAgICAgICAgICAgICBjYWNoZS5zdG9yZShib3MsIG51bGwpOwogICAgICAgICAgICAgICAgIGJvcy5mbHVzaCgpOwotICAgICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOyAvL05PU09OQVIKICAgICAgICAgICAgIH0KQEAgLTE3Miw2ICsxNjgsNyBAQAogICAgIH0KIAogICAgIC8qKiBEZWxldGVzIHRoZSBjYWNoZSBhbmQgaXRzIHVuZGVybHlpbmcgZmlsZS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkZWxldGUoKSB7CiAgICAgICAgIGNhY2hlID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgY2FjaGVmaWxlLmRlbGV0ZSgpOwpAQCAtMTg0LDYgKzE4MSw3IEBACiAgICAgICogQHBhcmFtIGtleSB0aGUga2V5CiAgICAgICogQHJldHVybiB0aGUgc3RvcmVkIHZhbHVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewogICAgICAgICBpZiAoIWNhY2hlTG9hZGVkKSB7CiAgICAgICAgICAgICBsb2FkKCk7CkBAIC0yMDAsNiArMTk4LDcgQEAKICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewogICAgICAgICBjYWNoZS5wdXQoU3RyaW5nLnZhbHVlT2Yoa2V5KSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKICAgICAgICAgY2FjaGVEaXJ0eSA9IHRydWU7CkBAIC0yMDksMTMgKzIwOCw5IEBACiAgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIHRoZSBjYWNoZS4KICAgICAgKiBAcmV0dXJuIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IoKSB7Ci0gICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgRW51bWVyYXRpb248Pz4gZW4gPSBjYWNoZS5wcm9wZXJ0eU5hbWVzKCk7Ci0gICAgICAgIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgdi5hZGQoZW4ubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdi5pdGVyYXRvcigpOworICAgICAgICByZXR1cm4gY2FjaGUuc3RyaW5nUHJvcGVydHlOYW1lcygpLml0ZXJhdG9yKCk7CiAgICAgfQogCiAKQEAgLTIyNiwxMiArMjIxLDkgQEAKICAgICAgKiBPdmVycmlkZSBPYmplY3QudG9TdHJpbmcoKS4KICAgICAgKiBAcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY2FjaGUKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBidWYuYXBwZW5kKCI8UHJvcGVydGllc2ZpbGVDYWNoZToiKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiY2FjaGVmaWxlPSIpLmFwcGVuZChjYWNoZWZpbGUpOwotICAgICAgICBidWYuYXBwZW5kKCI7bm9PZkVudHJpZXM9IikuYXBwZW5kKGNhY2hlLnNpemUoKSk7Ci0gICAgICAgIGJ1Zi5hcHBlbmQoIj4iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiPFByb3BlcnRpZXNmaWxlQ2FjaGU6Y2FjaGVmaWxlPSVzO25vT2ZFbnRyaWVzPSVkPiIsCisgICAgICAgICAgICAgICAgY2FjaGVmaWxlLCBjYWNoZS5zaXplKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NwaS9Qcm92aWRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1Byb3ZpZGVyLmphdmEKaW5kZXggZjczYjAxOS4uOWVjNjUyYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1Byb3ZpZGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1Byb3ZpZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSw4ICsyNSw4IEBACiAgKiBUaGlzIGNsYXNzIGNvcnJlc3BvbmRzIHRvIHRoZSBuZXN0ZWQgZWxlbWVudAogICogJmx0O3Byb3ZpZGVyIHR5cGU9InR5cGUiJmd0OyBpbiB0aGUgJmx0O3NlcnZpY2UgdHlwZT0iIiZndDsKICAqIG5lc3RlZCBlbGVtZW50IG9mIHRoZSBqYXIgdGFzay4KLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMTUyMCI+Ci0gKiBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMxNTIwPC9hPgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMTUyMCI+CisgKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMTUyMDwvYT4KICAqLwogcHVibGljIGNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7CiAgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3IgcHJvdmlkZXIgZWxlbWVudCIsCiAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAodHlwZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAiSW52YWxpZCBlbXB0eSBjbGFzc25hbWUiLCBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1NlcnZpY2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NwaS9TZXJ2aWNlLmphdmEKaW5kZXggOTZjOGU0ZS4uYjY4Y2Q4YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc3BpL1NlcnZpY2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zcGkvU2VydmljZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTMgKzE4LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNwaTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CkBAIC0zMiwxMSArMzEsMTEgQEAKIC8qKgogICogQU5UIEphci1UYXNrIFNQSSBleHRlbnNpb24KICAqCi0gKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE1MjAiPgotICogaHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMTUyMDwvYT4KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE1MjAiPgorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzE1MjA8L2E+CiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2aWNlIGV4dGVuZHMgUHJvamVjdENvbXBvbmVudCB7Ci0gICAgcHJpdmF0ZSBMaXN0PFByb3ZpZGVyPiBwcm92aWRlckxpc3QgPSBuZXcgQXJyYXlMaXN0PFByb3ZpZGVyPigpOworICAgIHByaXZhdGUgTGlzdDxQcm92aWRlcj4gcHJvdmlkZXJMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKIAogICAgIC8qKgpAQCAtODMsMTQgKzgyLDkgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLwogICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRBc1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhcnJheU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoYXJyYXlPdXQsICJVVEYtOCIpOwotICAgICAgICBmb3IgKFByb3ZpZGVyIHByb3ZpZGVyIDogcHJvdmlkZXJMaXN0KSB7Ci0gICAgICAgICAgICB3cml0ZXIud3JpdGUocHJvdmlkZXIuZ2V0Q2xhc3NOYW1lKCkpOwotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGFycmF5T3V0LnRvQnl0ZUFycmF5KCkpOworICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgcHJvdmlkZXJMaXN0LnN0cmVhbSgpLm1hcChQcm92aWRlcjo6Z2V0Q2xhc3NOYW1lKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiXG4iKSkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzLDExICs5NywxMSBAQAogICAgICAgICAgICAgICAgICJ0eXBlIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBmb3Igc2VydmljZSBlbGVtZW50IiwKICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKICAgICAgICAgfQotICAgICAgICBpZiAodHlwZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmICh0eXBlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJJbnZhbGlkIGVtcHR5IHR5cGUgY2xhc3NuYW1lIiwgZ2V0TG9jYXRpb24oKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHByb3ZpZGVyTGlzdC5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAocHJvdmlkZXJMaXN0LmlzRW1wdHkoKSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICJwcm92aWRlciBhdHRyaWJ1dGUgb3IgbmVzdGVkIHByb3ZpZGVyIGVsZW1lbnQgbXVzdCBiZSBzZXQhIiwKICAgICAgICAgICAgICAgICBnZXRMb2NhdGlvbigpKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQmFzZTY0Q29udmVydGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Jhc2U2NENvbnZlcnRlci5qYXZhCmluZGV4IDRmNjJiMDMuLjc4MWUzZmQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQmFzZTY0Q29udmVydGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9CYXNlNjRDb252ZXJ0ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2hhaW5lZE1hcHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DaGFpbmVkTWFwcGVyLmphdmEKaW5kZXggNmUwN2FhNi4uNmY1ZWU3ZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DaGFpbmVkTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DaGFpbmVkTWFwcGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMCArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiAvKioKICAqIEEgPGNvZGU+Q29udGFpbmVyTWFwcGVyPC9jb2RlPiB0aGF0IGNoYWlucyB0aGUgcmVzdWx0cyBvZiB0aGUgZmlyc3QKQEAgLTMyLDMyICszMCwxNyBAQAogcHVibGljIGNsYXNzIENoYWluZWRNYXBwZXIgZXh0ZW5kcyBDb250YWluZXJNYXBwZXIgewogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewotICAgICAgICBMaXN0IGlucHV0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAvLyB3ZSBkbyB0aGlzIGV2ZW4gaWYgdGhlIHNvdXJjZUZpbGVOYW1lIGlzIG51bGwuIFNvbWUKKyAgICAgICAgLy8gd2UgaW52b2tlIHRoZSBjaGFpbiBldmVuIGlmIHRoZSBzb3VyY2VGaWxlTmFtZSBpcyBudWxsLiBTb21lCiAgICAgICAgIC8vIHJlc291cmNlcyBoYXZlIGEgbnVsbCBuYW1lIGFuZCB1c2VycyBtYXkgdXNlIGEgbWFwcGVyIGxpa2UKICAgICAgICAgLy8gTWVyZ2VNYXBwZXIgdG8gcHJvdmlkZSBhIG5hbWUgZm9yIGl0LgotICAgICAgICByZXN1bHRzLmFkZChzb3VyY2VGaWxlTmFtZSk7Ci0gICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChJdGVyYXRvciBtSXRlciA9IGdldE1hcHBlcnMoKS5pdGVyYXRvcigpOyBtSXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBtYXBwZXIgPSAoRmlsZU5hbWVNYXBwZXIpIChtSXRlci5uZXh0KCkpOwotICAgICAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmFkZEFsbChyZXN1bHRzKTsKLSAgICAgICAgICAgICAgICByZXN1bHRzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ID0gaW5wdXRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkID0gbWFwcGVyLm1hcEZpbGVOYW1lKChTdHJpbmcpIChpdC5uZXh0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1hcHBlZCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAocmVzdWx0cy5zaXplKCkgPT0gMCkgPyBudWxsCi0gICAgICAgICAgICA6IChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gZ2V0TWFwcGVycygpLnN0cmVhbSgpCisgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisgICAgICAgICAgICAucmVkdWNlKG5ldyBTdHJpbmdbXSB7IHNvdXJjZUZpbGVOYW1lIH0sIChpLCBtKSAtPiBTdHJlYW0ub2YoaSkKKyAgICAgICAgICAgICAgICAubWFwKG06Om1hcEZpbGVOYW1lKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuZmxhdE1hcChTdHJlYW06Om9mKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpLAorICAgICAgICAgICAgICAgIChpLCBvKSAtPiBvKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCA/IG51bGwgOiByZXN1bHQ7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NsYXNzcGF0aFV0aWxzLmphdmEKaW5kZXggOGIyNDYxMC4uNTAxNjA3MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2xhc3NwYXRoVXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwNyw4ICsxMDcsOSBAQAogICAgICAgICBTdHJpbmcgcGF0aElkID0gcmVmLmdldFJlZklkKCk7CiAgICAgICAgIE9iamVjdCBwYXRoID0gcC5nZXRSZWZlcmVuY2UocGF0aElkKTsKICAgICAgICAgaWYgKCEocGF0aCBpbnN0YW5jZW9mIFBhdGgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocmVmICIgKyBwYXRoSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IHJlZmVyZW5jZSBhIFBhdGguIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgY2xhc3NwYXRocmVmICVzIGRvZXMgbm90IHJlZmVyZW5jZSBhIFBhdGguIiwKKyAgICAgICAgICAgICAgICBwYXRoSWQpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBsb2FkZXJJZCA9IE1hZ2ljTmFtZXMuUkVGSURfQ0xBU1NQQVRIX0xPQURFUl9QUkVGSVggKyBwYXRoSWQ7CiAgICAgICAgIHJldHVybiBnZXRDbGFzc0xvYWRlckZvclBhdGgocCwgKFBhdGgpIHBhdGgsIGxvYWRlcklkLCByZXZlcnNlTG9hZGVyKTsKQEAgLTE3NCw4ICsxNzUsOSBAQAogICAgICAgICBpZiAobG9hZGVySWQgIT0gbnVsbCAmJiByZXVzZUxvYWRlcikgewogICAgICAgICAgICAgT2JqZWN0IHJldXNlZExvYWRlciA9IHAuZ2V0UmVmZXJlbmNlKGxvYWRlcklkKTsKICAgICAgICAgICAgIGlmIChyZXVzZWRMb2FkZXIgIT0gbnVsbCAmJiAhKHJldXNlZExvYWRlciBpbnN0YW5jZW9mIENsYXNzTG9hZGVyKSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiVGhlIHNwZWNpZmllZCBsb2FkZXIgaWQgIiArIGxvYWRlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgcmVmZXJlbmNlIGEgY2xhc3MgbG9hZGVyIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiVGhlIHNwZWNpZmllZCBsb2FkZXIgaWQgJXMgZG9lcyBub3QgcmVmZXJlbmNlIGEgY2xhc3MgbG9hZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbG9hZGVySWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2wgPSAoQ2xhc3NMb2FkZXIpIHJldXNlZExvYWRlcjsKICAgICAgICAgfQpAQCAtMjMyLDYgKzIzNCw3IEBACiAgICAgICogPHA+VGhpcyB1c2VzIHRoZSB1c2VyRGVmaW5lZExvYWRlciB0byBsb2FkIHRoZSBzcGVjaWZpZWQgY2xhc3MsCiAgICAgICogYW5kIHRoZW4gbWFrZXMgYW4gaW5zdGFuY2UgdXNpbmcgdGhlIGRlZmF1bHQgbm8tYXJndW1lbnQgY29uc3RydWN0b3IuPC9wPgogICAgICAqCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIGxvYWQuCiAgICAgICogQHBhcmFtIHVzZXJEZWZpbmVkTG9hZGVyIHRoZSBjbGFzc2xvYWRlciB0byB1c2UuCiAgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSB0aGUgQ2xhc3MgdGhhdCB0aGUgcmVzdWx0IHNob3VsZCBiZSBhc3NpZ25tZW50CkBAIC0yNDEsMTQgKzI0NCwxNiBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gd2hlbiBsb2FkaW5nIG9yIGluc3RhbnRpYXRpb24gZmFpbGVkLgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgdXNlckRlZmluZWRMb2FkZXIsCi0gICAgICAgICAgICBDbGFzcyBleHBlY3RlZFR5cGUpIHsKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzTG9hZGVyIHVzZXJEZWZpbmVkTG9hZGVyLAorICAgICAgICAgICAgQ2xhc3M8VD4gZXhwZWN0ZWRUeXBlKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCB1c2VyRGVmaW5lZExvYWRlcik7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGNsYXp6Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIENsYXNzPFQ+IGNsYXp6ID0gKENsYXNzPFQ+KSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgdHJ1ZSwgdXNlckRlZmluZWRMb2FkZXIpOworICAgICAgICAgICAgVCBvID0gY2xhenoubmV3SW5zdGFuY2UoKTsKICAgICAgICAgICAgIGlmICghZXhwZWN0ZWRUeXBlLmlzSW5zdGFuY2UobykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNsYXNzIG9mIHVuZXhwZWN0ZWQgVHlwZTogIiArIGNsYXNzTmFtZSArICIgZXhwZWN0ZWQgOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJDbGFzcyBvZiB1bmV4cGVjdGVkIFR5cGU6ICVzIGV4cGVjdGVkIDogJXMiLCBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkVHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CkBAIC0yODQsNiArMjg5LDkgQEAKICAgICAgICAgcmV0dXJuIHAuZ2V0UHJvcGVydHkoUkVVU0VfTE9BREVSX1JFRikgIT0gbnVsbDsKICAgICB9CiAKKyAgICBwcml2YXRlIENsYXNzcGF0aFV0aWxzKCkgeworICAgIH0KKwogICAgIC8qKgogICAgICAqIERlbGVnYXRlIHRoYXQgaGVscHMgb3V0IGFueSBzcGVjaWZpYyBQcm9qZWN0Q29tcG9uZW50IHRoYXQgbmVlZHMKICAgICAgKiBkeW5hbWljIGNsYXNzbG9hZGluZy4KQEAgLTQ1NSw3ICs0NjMsNSBAQAogICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VMb2FkZXI7CiAgICAgICAgIH0KIAotICAgICAgICAvL1RPRE8gbm8gbWV0aG9kcyB5ZXQgZm9yIGdldENsYXNzbmFtZQotICAgICAgICAvL1RPRE8gbm8gbWV0aG9kIGZvciBuZXdJbnN0YW5jZSB1c2luZyBhIHJldmVyc2UtY2xhc3Nsb2FkZXIKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbGxlY3Rpb25VdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db2xsZWN0aW9uVXRpbHMuamF2YQppbmRleCBkMGVlNTUyLi5lOTU3ODM1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbGxlY3Rpb25VdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29sbGVjdGlvblV0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSw3ICsyNSw5IEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiAvLyBDaGVja1N0eWxlOkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvckNoZWNrIE9GRiAtIGJjCiAKQEAgLTM0LDYgKzM2LDcgQEAKICAqCiAgKiBAc2luY2UgQW50IDEuNQogICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIENvbGxlY3Rpb25VdGlscyB7CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQpAQCAtNTAsMTUgKzUzLDcgQEAKICAgICAgKi8KICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoVmVjdG9yPD8+IHYxLCBWZWN0b3I8Pz4gdjIpIHsKLSAgICAgICAgaWYgKHYxID09IHYyKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2MSA9PSBudWxsIHx8IHYyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB2MS5lcXVhbHModjIpOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHModjEsIHYyKTsKICAgICB9CiAKICAgICAvKioKQEAgLTg2LDIwICs4MSwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgRW51bWVyYXRpb248Pz4gZTEgPSBkMS5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChlMS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgT2JqZWN0IGtleSA9IGUxLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUxID0gZDEuZ2V0KGtleSk7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUyID0gZDIuZ2V0KGtleSk7Ci0gICAgICAgICAgICBpZiAodmFsdWUyID09IG51bGwgfHwgIXZhbHVlMS5lcXVhbHModmFsdWUyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIC8vIGRvbid0IG5lZWQgdGhlIG9wcG9zaXRlIGNoZWNrIGFzIHRoZSBEaWN0aW9uYXJpZXMgaGF2ZSB0aGUKICAgICAgICAgLy8gc2FtZSBzaXplLCBzbyB3ZSd2ZSBhbHNvIGNvdmVyZWQgYWxsIGtleXMgb2YgZDIgYWxyZWFkeS4KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIFN0cmVhbVV0aWxzLmVudW1lcmF0aW9uQXNTdHJlYW0oZDEua2V5cygpKQorICAgICAgICAgICAgICAgIC5hbGxNYXRjaChrZXkgLT4gZDEuZ2V0KGtleSkuZXF1YWxzKGQyLmdldChrZXkpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDksMTYgKzk0LDExIEBACiAgICAgICogQHBhcmFtIGMgY29sbGVjdGlvbiB0byB0cmFuc2Zvcm0KICAgICAgKiBAcmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sbGVjdGlvbgogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSkKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZsYXR0ZW5Ub1N0cmluZyhDb2xsZWN0aW9uPD8+IGMpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoT2JqZWN0IG8gOiBjKSB7Ci0gICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKG8pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICByZXR1cm4gYy5zdHJlYW0oKS5tYXAoU3RyaW5nOjp2YWx1ZU9mKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzMSwyNSArMTExLDIyIEBACiAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS42LnguCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiB2b2lkIHB1dEFsbChEaWN0aW9uYXJ5PD8gc3VwZXIgSywgPyBzdXBlciBWPiBtMSwgRGljdGlvbmFyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0yKSB7Ci0gICAgICAgIGZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIEs+IGl0ID0gbTIua2V5cygpOyBpdC5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIEsga2V5ID0gaXQubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIG0xLnB1dChrZXksIG0yLmdldChrZXkpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IHZvaWQgcHV0QWxsKERpY3Rpb25hcnk8PyBzdXBlciBLLCA/IHN1cGVyIFY+IG0xLAorICAgICAgICBEaWN0aW9uYXJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbTIpIHsKKyAgICAgICAgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShtMi5rZXlzKCkpLmZvckVhY2goa2V5IC0+IG0xLnB1dChrZXksIG0yLmdldChrZXkpKSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQW4gZW1wdHkgZW51bWVyYXRpb24uCiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlFbnVtZXJhdGlvbjxFPiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uPEU+IHsKLSAgICAgICAgLyoqIENvbnN0cnVjdG9yIGZvciB0aGUgRW1wdHlFbnVtZXJhdGlvbiAqLwotICAgICAgICBwdWJsaWMgRW1wdHlFbnVtZXJhdGlvbigpIHsKLSAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBAcmV0dXJuIGZhbHNlIGFsd2F5cy4KICAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KQEAgLTE1OCw2ICsxMzUsNyBAQAogICAgICAgICAgKiBAcmV0dXJuIG5vdGhpbmcuCiAgICAgICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBhbHdheXMuCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEUgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9CkBAIC0xNzEsOSArMTQ5LDEyIEBACiAgICAgICogQHBhcmFtIDxFPiBlbGVtZW50IHR5cGUKICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIHJlcHJlc2VudGluZyBlMSBmb2xsb3dlZCBieSBlMi4KICAgICAgKiBAc2luY2UgQW50IDEuNi4zCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIFN0cmVhbS5jb25jYXQoQ29sbGVjdGlvbnMubGlzdChlMSkuc3RyZWFtKCksIENvbGxlY3Rpb25zLmxpc3QoZTIpLnN0cmVhbSgpKQorICAgICAqICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmNvbGxlY3RpbmdBbmRUaGVuKENvbGxlY3RvcnMudG9MaXN0KCksIENvbGxlY3Rpb25zOjplbnVtZXJhdGlvbikpCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIDxFPiBFbnVtZXJhdGlvbjxFPiBhcHBlbmQoRW51bWVyYXRpb248RT4gZTEsIEVudW1lcmF0aW9uPEU+IGUyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcG91bmRFbnVtZXJhdGlvbjxFPihlMSwgZTIpOworICAgICAgICByZXR1cm4gbmV3IENvbXBvdW5kRW51bWVyYXRpb248PihlMSwgZTIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTgxLDEyICsxNjIsMTYgQEAKICAgICAgKiBAcGFyYW0gaXRlciB0aGUgSXRlcmF0b3IgdG8gYWRhcHQuCiAgICAgICogQHBhcmFtIDxFPiBlbGVtZW50IHR5cGUKICAgICAgKiBAcmV0dXJuIGFuIEVudW1lcmF0aW9uLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbigpCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIDxFPiBFbnVtZXJhdGlvbjxFPiBhc0VudW1lcmF0aW9uKGZpbmFsIEl0ZXJhdG9yPEU+IGl0ZXIpIHsKICAgICAgICAgcmV0dXJuIG5ldyBFbnVtZXJhdGlvbjxFPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewogICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLmhhc05leHQoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpOwogICAgICAgICAgICAgfQpAQCAtMTk4LDE1ICsxODMsMjAgQEAKICAgICAgKiBAcGFyYW0gZSB0aGUgRW51bWVyYXRpb24gdG8gYWRhcHQuCiAgICAgICogQHBhcmFtIDxFPiBlbGVtZW50IHR5cGUKICAgICAgKiBAcmV0dXJuIGFuIEl0ZXJhdG9yLgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBDb2xsZWN0aW9ucy5saXN0KGUpLml0ZXJhdG9yKCkKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhdG9yPEU+IGFzSXRlcmF0b3IoZmluYWwgRW51bWVyYXRpb248RT4gZSkgewogICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPEU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewogICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc01vcmVFbGVtZW50cygpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgRSBuZXh0KCkgewogICAgICAgICAgICAgICAgIHJldHVybiBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0KQEAgLTIyMCwxMiArMjEwLDEyIEBACiAgICAgICogQHBhcmFtIDxUPiBlbGVtZW50IHR5cGUKICAgICAgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uCiAgICAgICogQHNpbmNlIEFudCAxLjguMAorICAgICAqIEBkZXByZWNhdGVkIGluc3RhbnRpYXRlIGEgbGlzdCBhbmQgdXNlIGZvckVhY2hSZW1haW5pbmcobGlzdDo6YWRkKQogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHN0YXRpYyA8VD4gQ29sbGVjdGlvbjxUPiBhc0NvbGxlY3Rpb24oZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXIpIHsKLSAgICAgICAgTGlzdDxUPiBsID0gbmV3IEFycmF5TGlzdDxUPigpOwotICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGwuYWRkKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgfQorICAgICAgICBMaXN0PFQ+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaXRlci5mb3JFYWNoUmVtYWluaW5nKGw6OmFkZCk7CiAgICAgICAgIHJldHVybiBsOwogICAgIH0KIApAQCAtMjM4LDE2ICsyMjgsMTcgQEAKICAgICAgICAgICAgIHRoaXMuZTIgPSBlMjsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7CiAgICAgICAgICAgICByZXR1cm4gZTEuaGFzTW9yZUVsZW1lbnRzKCkgfHwgZTIuaGFzTW9yZUVsZW1lbnRzKCk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEUgbmV4dEVsZW1lbnQoKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAoZTEuaGFzTW9yZUVsZW1lbnRzKCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZTEubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGUyLm5leHRFbGVtZW50KCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZTIubmV4dEVsZW1lbnQoKTsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMjYxLDE4ICsyNTIsMTEgQEAKICAgICAgKiBAcmV0dXJuIGZyZXF1ZW5jeQogICAgICAqIEBzaW5jZSBBbnQgMS44LjAKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGZyZXF1ZW5jeShDb2xsZWN0aW9uPD8+IGMsIE9iamVjdCBvKSB7Ci0gICAgICAgIC8vIHNhbWUgYXMgQ29sbGVjdGlvbnMuZnJlcXVlbmN5IGludHJvZHVjZWQgd2l0aCBKREsgMS41Ci0gICAgICAgIGludCBmcmVxID0gMDsKLSAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChJdGVyYXRvcjw/PiBpID0gYy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdGVzdCA9IGkubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmIChvID09IG51bGwgPyB0ZXN0ID09IG51bGwgOiBvLmVxdWFscyh0ZXN0KSkgewotICAgICAgICAgICAgICAgICAgICBmcmVxKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmcmVxOworICAgICAgICByZXR1cm4gYyA9PSBudWxsID8gMCA6IENvbGxlY3Rpb25zLmZyZXF1ZW5jeShjLCBvKTsKICAgICB9CiAKKyAgICBwcml2YXRlIENvbGxlY3Rpb25VdGlscygpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbXBvc2l0ZU1hcHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db21wb3NpdGVNYXBwZXIuamF2YQppbmRleCBkMDRhNWZjLi5lZmYwMmI0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbXBvc2l0ZU1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29tcG9zaXRlTWFwcGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNyw4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogLyoqCiAgKiBBIDxjb2RlPkNvbnRhaW5lck1hcHBlcjwvY29kZT4gdGhhdCB1bml0ZXMgdGhlIHJlc3VsdHMgb2YgaXRzIGNvbnN0aXR1ZW50CkBAIC0yOCwyMyArMjgsOSBAQAogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCiAgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewotICAgICAgICBMaW5rZWRIYXNoU2V0IHJlc3VsdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0gICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlciA9IG51bGw7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgbUl0ZXIgPSBnZXRNYXBwZXJzKCkuaXRlcmF0b3IoKTsgbUl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgbWFwcGVyID0gKEZpbGVOYW1lTWFwcGVyKSAobUl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIFN0cmluZ1tdIG1hcHBlZCA9IG1hcHBlci5tYXBGaWxlTmFtZShzb3VyY2VGaWxlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1hcHBlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGVkLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChtYXBwZWRbaV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAocmVzdWx0cy5zaXplKCkgPT0gMCkgPyBudWxsCi0gICAgICAgICAgICA6IChTdHJpbmdbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0cy5zaXplKCldKTsKKyAgICAgICAgU3RyaW5nW10gcmVzdWx0ID0gZ2V0TWFwcGVycygpLnN0cmVhbSgpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgLm1hcChtIC0+IG0ubWFwRmlsZU5hbWUoc291cmNlRmlsZU5hbWUpKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgIC5mbGF0TWFwKFN0cmVhbTo6b2YpLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CisgICAgICAgIHJldHVybiByZXN1bHQubGVuZ3RoID09IDAgPyBudWxsIDogcmVzdWx0OwogICAgIH0KLQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbmNhdEZpbGVJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db25jYXRGaWxlSW5wdXRTdHJlYW0uamF2YQppbmRleCAyMmRjYjdmLi5mMTY0MjcxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbmNhdEZpbGVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0RmlsZUlucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw5ICsyMCw5IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Q29tcG9uZW50OwpAQCAtNTUsNiArNTUsNyBAQAogICAgICAqIENsb3NlIHRoZSBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNsb3NlQ3VycmVudCgpOwogICAgICAgICBlb2YgPSB0cnVlOwpAQCAtNjUsNiArNjYsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIGJ5dGUgKDAgLSAyNTUpIG9yIC0xIGlmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaW50IHJlc3VsdCA9IHJlYWRDdXJyZW50KCk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gRU9GICYmICFlb2YpIHsKQEAgLTExOSw3ICsxMjEsNyBAQAogICAgICAgICAgICAgbG9nKCJPcGVuaW5nICIgKyBmaWxlW2luZGV4XSwgUHJvamVjdC5NU0dfVkVSQk9TRSk7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlW2luZGV4XSkpOworICAgICAgICAgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShmaWxlW2luZGV4XS50b1BhdGgoKSkpOwogICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXllT2hFeCkgewogICAgICAgICAgICAgICAgIGxvZygiRmFpbGVkIHRvIG9wZW4gIiArIGZpbGVbaW5kZXhdLCBQcm9qZWN0Lk1TR19FUlIpOwogICAgICAgICAgICAgICAgIHRocm93IGV5ZU9oRXg7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbmNhdFJlc291cmNlSW5wdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDZjNjg3NDcuLjFmMGExNjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29uY2F0UmVzb3VyY2VJbnB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzEsNiArNzEsNyBAQAogICAgICAqIENsb3NlIHRoZSBzdHJlYW0uCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBjbG9zZUN1cnJlbnQoKTsKICAgICAgICAgZW9mID0gdHJ1ZTsKQEAgLTgxLDYgKzgyLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBieXRlICgwIC0gMjU1KSBvciAtMSBpZiB0aGlzIGlzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChlb2YpIHsKICAgICAgICAgICAgIHJldHVybiBFT0Y7CkBAIC0xMjIsNyArMTI0LDcgQEAKICAgICBwcml2YXRlIHZvaWQgbmV4dFJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgY2xvc2VDdXJyZW50KCk7CiAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgaXRlci5uZXh0KCk7CisgICAgICAgICAgICBSZXNvdXJjZSByID0gaXRlci5uZXh0KCk7CiAgICAgICAgICAgICBpZiAoIXIuaXNFeGlzdHMoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db250YWluZXJNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29udGFpbmVyTWFwcGVyLmphdmEKaW5kZXggOTkwZWUxNC4uYTgxOGYyNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db250YWluZXJNYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbnRhaW5lck1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNyArMjAsNiBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOwpAQCAtMzIsNyArMzEsNyBAQAogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyTWFwcGVyIGltcGxlbWVudHMgRmlsZU5hbWVNYXBwZXIgewogCi0gICAgcHJpdmF0ZSBMaXN0IG1hcHBlcnMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGVOYW1lTWFwcGVyPiBtYXBwZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICAvKioKICAgICAgKiBBZGQgYSA8Y29kZT5NYXBwZXI8L2NvZGU+LgpAQCAtNjksOSArNjgsOCBAQAogICAgICAgICAgICAgJiYgKChDb250YWluZXJNYXBwZXIpIGZpbGVOYW1lTWFwcGVyKS5jb250YWlucyh0aGlzKSkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgIkNpcmN1bGFyIG1hcHBlciBjb250YWlubWVudCBjb25kaXRpb24gZGV0ZWN0ZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1hcHBlcnMuYWRkKGZpbGVOYW1lTWFwcGVyKTsKICAgICAgICAgfQorICAgICAgICBtYXBwZXJzLmFkZChmaWxlTmFtZU1hcHBlcik7CiAgICAgfQogCiAgICAgLyoqCkBAIC04MSwyMSArNzksMjMgQEAKICAgICAgKiBAcmV0dXJuIDxjb2RlPmJvb2xlYW48L2NvZGU+LgogICAgICAqLwogICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWlucyhGaWxlTmFtZU1hcHBlciBmaWxlTmFtZU1hcHBlcikgewotICAgICAgICBib29sZWFuIGZvdW5kaXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gbWFwcGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKSAmJiAhZm91bmRpdDspIHsKLSAgICAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG5leHQgPSAoRmlsZU5hbWVNYXBwZXIpIChpdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICBmb3VuZGl0ID0gKG5leHQgPT0gZmlsZU5hbWVNYXBwZXIKLSAgICAgICAgICAgICAgICB8fCAobmV4dCBpbnN0YW5jZW9mIENvbnRhaW5lck1hcHBlcgotICAgICAgICAgICAgICAgICYmICgoQ29udGFpbmVyTWFwcGVyKSBuZXh0KS5jb250YWlucyhmaWxlTmFtZU1hcHBlcikpKTsKKyAgICAgICAgZm9yIChGaWxlTmFtZU1hcHBlciBtIDogbWFwcGVycykgeworICAgICAgICAgICAgaWYgKG0gPT0gZmlsZU5hbWVNYXBwZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtIGluc3RhbmNlb2YgQ29udGFpbmVyTWFwcGVyCisgICAgICAgICAgICAgICAgJiYgKChDb250YWluZXJNYXBwZXIpIG0pLmNvbnRhaW5zKGZpbGVOYW1lTWFwcGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmb3VuZGl0OworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSA8Y29kZT5MaXN0PC9jb2RlPiBvZiA8Y29kZT5GaWxlTmFtZU1hcHBlcjwvY29kZT5zLgogICAgICAqIEByZXR1cm4gPGNvZGU+TGlzdDwvY29kZT4uCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0IGdldE1hcHBlcnMoKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCBMaXN0PEZpbGVOYW1lTWFwcGVyPiBnZXRNYXBwZXJzKCkgewogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtYXBwZXJzKTsKICAgICB9CiAKQEAgLTEwMyw2ICsxMDMsNyBAQAogICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uLgogICAgICAqIEBwYXJhbSBpZ25vcmUgaWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBpZ25vcmUpIHsKICAgICAgICAgLy9FbXB0eQogICAgIH0KQEAgLTExMSw2ICsxMTIsNyBAQAogICAgICAqIEVtcHR5IGltcGxlbWVudGF0aW9uLgogICAgICAqIEBwYXJhbSBpZ25vcmUgaWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgaWdub3JlKSB7CiAgICAgICAgIC8vRW1wdHkKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTUVsZW1lbnRXcml0ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhCmluZGV4IDc4YTg5M2IuLjRhYWZlYjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsOSArMjMsMTEgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIGltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKQEAgLTY4LDcgKzcwLDcgQEAKICAgICAvKioKICAgICAgKiBNYXAgKFVSSSB0byBwcmVmaXgpIG9mIGtub3duIG5hbWVzcGFjZXMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwIG5zUHJlZml4TWFwID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbnNQcmVmaXhNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAvKioKICAgICAgKiBOdW1iZXIgb2YgZ2VuZXJhdGVkIHByZWZpeCB0byB1c2UgbmV4dC4KQEAgLTc4LDcgKzgwLDcgQEAKICAgICAvKioKICAgICAgKiBNYXAgKEVsZW1lbnQgdG8gVVJJKSBvZiBuYW1lc3BhY2VzIGRlZmluZWQgb24gYSBnaXZlbiBlbGVtZW50LgogICAgICAqLwotICAgIHByaXZhdGUgSGFzaE1hcCBuc1VSSUJ5RWxlbWVudCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBNYXA8RWxlbWVudCwgTGlzdDxTdHJpbmc+PiBuc1VSSUJ5RWxlbWVudCA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIC8qKgogICAgICAqIFdoZXRoZXIgbmFtZXNwYWNlcyBzaG91bGQgYmUgaWdub3JlZCBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuCkBAIC0xNTAsOCArMTUyLDYgQEAKICAgICAgICAgdGhpcy5uYW1lc3BhY2VQb2xpY3kgPSBuYW1lc3BhY2VQb2xpY3k7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7Ci0KICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwogICAgIC8qKgogICAgICAqIERvbid0IHRyeSB0byBiZSB0b28gc21hcnQgYnV0IGF0IGxlYXN0IHJlY29nbml6ZSB0aGUgcHJlZGVmaW5lZApAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXBwZW5zIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHN0cmVhbS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCB3cml0ZShFbGVtZW50IHJvb3QsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFdyaXRlciB3cmkgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKTsKKyAgICAgICAgV3JpdGVyIHdyaSA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAgd3JpdGVYTUxEZWNsYXJhdGlvbih3cmkpOwogICAgICAgICB3cml0ZShyb290LCB3cmksIDAsICIgICIpOwogICAgICAgICB3cmkuZmx1c2goKTsKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgICAgIGhhc0NoaWxkRWxlbWVudHMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobFNlcCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgd3JpdGUoKEVsZW1lbnQpIGNoaWxkLCBvdXQsIGluZGVudCArIDEsIGluZGVudFdpdGgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI0OSw3ICsyNDksNyBAQAogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjw/Iik7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShjaGlsZC5nZXROb2RlTmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRhdGEgPSBjaGlsZC5nZXROb2RlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmICFkYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCcgJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICAgICBvdXQud3JpdGUoIjwiKTsKICAgICAgICAgaWYgKG5hbWVzcGFjZVBvbGljeS5xdWFsaWZ5RWxlbWVudHMpIHsKICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXROYW1lc3BhY2VVUkkoZWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CiAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBpZiAobnNQcmVmaXhNYXAuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN0ZWFsIGRlZmF1bHQgbmFtZXNwYWNlCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgICAgICAgICAgICBuc1ByZWZpeE1hcC5wdXQodXJpLCBwcmVmaXgpOwogICAgICAgICAgICAgICAgIGFkZE5TRGVmaW5pdGlvbihlbGVtZW50LCB1cmkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEiIi5lcXVhbHMocHJlZml4KSkgeworICAgICAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHByZWZpeCk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCI6Iik7CiAgICAgICAgICAgICB9CkBAIC0zMzAsNyArMzMwLDcgQEAKICAgICAgICAgICAgIG91dC53cml0ZSgiICIpOwogICAgICAgICAgICAgaWYgKG5hbWVzcGFjZVBvbGljeS5xdWFsaWZ5QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXROYW1lc3BhY2VVUkkoYXR0cik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpIG5zUHJlZml4TWFwLmdldCh1cmkpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBuc1ByZWZpeE1hcC5nZXQodXJpKTsKICAgICAgICAgICAgICAgICBpZiAocHJlZml4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gTlMgKyAobmV4dFByZWZpeCsrKTsKICAgICAgICAgICAgICAgICAgICAgbnNQcmVmaXhNYXAucHV0KHVyaSwgcHJlZml4KTsKQEAgLTM0NiwxNCArMzQ2LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyB3cml0ZSBuYW1lc3BhY2UgZGVjbGFyYXRpb25zCi0gICAgICAgIEFycmF5TGlzdCBhbCA9IChBcnJheUxpc3QpIG5zVVJJQnlFbGVtZW50LmdldChlbGVtZW50KTsKLSAgICAgICAgaWYgKGFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHVyaSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSAoU3RyaW5nKSBuc1ByZWZpeE1hcC5nZXQodXJpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHVyaXMgPSBuc1VSSUJ5RWxlbWVudC5nZXQoZWxlbWVudCk7CisgICAgICAgIGlmICh1cmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHVyaSA6IHVyaXMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCIgeG1sbnMiKTsKLSAgICAgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiOiIpOwogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUocHJlZml4KTsKICAgICAgICAgICAgICAgICB9CkBAIC0zNjcsOCArMzY1LDcgQEAKICAgICAgICAgICAgIG91dC53cml0ZSgiPiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVtb3ZlTlNEZWZpbml0aW9ucyhlbGVtZW50KTsKLSAgICAgICAgICAgIG91dC53cml0ZSgiIC8+Iik7Ci0gICAgICAgICAgICBvdXQud3JpdGUobFNlcCk7CisgICAgICAgICAgICBvdXQud3JpdGUoU3RyaW5nLmZvcm1hdCgiIC8+JW4iKSk7CiAgICAgICAgICAgICBvdXQuZmx1c2goKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQwMCwxNiArMzk3LDE1IEBACiAgICAgICAgIG91dC53cml0ZSgiPC8iKTsKICAgICAgICAgaWYgKG5hbWVzcGFjZVBvbGljeS5xdWFsaWZ5RWxlbWVudHMpIHsKICAgICAgICAgICAgIFN0cmluZyB1cmkgPSBnZXROYW1lc3BhY2VVUkkoZWxlbWVudCk7Ci0gICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgbnNQcmVmaXhNYXAuZ2V0KHVyaSk7Ci0gICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgISIiLmVxdWFscyhwcmVmaXgpKSB7CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gbnNQcmVmaXhNYXAuZ2V0KHVyaSk7CisgICAgICAgICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgIXByZWZpeC5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUocHJlZml4KTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUoIjoiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlbW92ZU5TRGVmaW5pdGlvbnMoZWxlbWVudCk7CiAgICAgICAgIH0KICAgICAgICAgb3V0LndyaXRlKGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICAgICAgb3V0LndyaXRlKCI+Iik7Ci0gICAgICAgIG91dC53cml0ZShsU2VwKTsKKyAgICAgICAgb3V0LndyaXRlKFN0cmluZy5mb3JtYXQoIj4lbiIpKTsKICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgfQogCkBAIC00MzUsMTAgKzQzMSw4IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlKGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgYm9vbGVhbiBlbmNvZGVXaGl0ZXNwYWNlKSB7Ci0gICAgICAgIGZpbmFsIGludCBsZW4gPSB2YWx1ZS5sZW5ndGgoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSB2YWx1ZS5jaGFyQXQoaSk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih2YWx1ZS5sZW5ndGgoKSk7CisgICAgICAgIGZvciAoZmluYWwgY2hhciBjIDogdmFsdWUudG9DaGFyQXJyYXkoKSkgewogICAgICAgICAgICAgc3dpdGNoIChjKSB7CiAgICAgICAgICAgICBjYXNlICc8JzoKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiZsdDsiKTsKQEAgLTQ4MiwxMCArNDc2LDEwIEBACiAgICAgICogPGNvZGU+JmFtcDsjeDVkOyZhbXA7I3g1ZDsmYW1wO2d0OzwvY29kZT4uPC9wPgogICAgICAqCiAgICAgICogPHA+U2VlIFhNTCAxLjAgMi4yIDxhCi0gICAgICogaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI2NoYXJzZXRzIj4KLSAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHM8L2E+IGFuZAorICAgICAqIGhyZWY9Imh0dHBzOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHMiPgorICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHM8L2E+IGFuZAogICAgICAqIDIuNyA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNzZWMtY2RhdGEtc2VjdCI+aHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI3NlYy1jZGF0YS1zZWN0PC9hPi48L3A+CisgICAgICogaHJlZj0iaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNzZWMtY2RhdGEtc2VjdCI+aHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNzZWMtY2RhdGEtc2VjdDwvYT4uPC9wPgogICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgZW5jb2RlZC4KICAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHZhbHVlLgogICAgICAqLwpAQCAtNTA4LDEwICs1MDIsMTAgQEAKICAgICAgKiA8Y29kZT4mYW1wOyN4NWQ7JmFtcDsjeDVkOyZhbXA7Z3Q7PC9jb2RlPi48L3A+CiAgICAgICoKICAgICAgKiA8cD5TZWUgWE1MIDEuMCAyLjIgPGEKLSAgICAgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHMiPgotICAgICAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNjaGFyc2V0czwvYT4gYW5kCisgICAgICogaHJlZj0iaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNjaGFyc2V0cyI+CisgICAgICogaHR0cHM6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCNjaGFyc2V0czwvYT4gYW5kCiAgICAgICogMi43IDxhCi0gICAgICogaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI3NlYy1jZGF0YS1zZWN0Ij5odHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjc2VjLWNkYXRhLXNlY3Q8L2E+LjwvcD4KKyAgICAgKiBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI3NlYy1jZGF0YS1zZWN0Ij5odHRwczovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI3NlYy1jZGF0YS1zZWN0PC9hPi48L3A+CiAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBiZSBlbmNvZGVkLgogICAgICAqIEBwYXJhbSBvdXQgd2hlcmUgdG8gd3JpdGUgdGhlIGVuY29kZWQgZGF0YSB0by4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGRhdGEgY2Fubm90IGJlIHdyaXR0ZW4KQEAgLTUyMywxMyArNTE3LDEyIEBACiAgICAgICAgIHdoaWxlIChwcmV2RW5kIDwgbGVuKSB7CiAgICAgICAgICAgICBmaW5hbCBpbnQgZW5kID0gKGNkYXRhRW5kUG9zIDwgMCA/IGxlbiA6IGNkYXRhRW5kUG9zKTsKICAgICAgICAgICAgIC8vIFdyaXRlIG91dCBzdHJldGNoZXMgb2YgbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgcmFuZ2UgW3ByZXZFbmQsIGVuZCkuCi0gICAgICAgICAgICBmb3IgKGludCBwcmV2TGVnYWxDaGFyUG9zID0gcHJldkVuZDsgcHJldkxlZ2FsQ2hhclBvcyA8IGVuZDsvKmVtcHR5Ki8pIHsKLSAgICAgICAgICAgICAgICBpbnQgaWxsZWdhbENoYXJQb3M7Ci0gICAgICAgICAgICAgICAgZm9yIChpbGxlZ2FsQ2hhclBvcyA9IHByZXZMZWdhbENoYXJQb3M7IHRydWU7ICsraWxsZWdhbENoYXJQb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlsbGVnYWxDaGFyUG9zID49IGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzTGVnYWxDaGFyYWN0ZXIodmFsdWUuY2hhckF0KGlsbGVnYWxDaGFyUG9zKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcHJldkxlZ2FsQ2hhclBvcyA9IHByZXZFbmQ7CisgICAgICAgICAgICB3aGlsZSAocHJldkxlZ2FsQ2hhclBvcyA8IGVuZCkgeworICAgICAgICAgICAgICAgIGludCBpbGxlZ2FsQ2hhclBvcyA9IHByZXZMZWdhbENoYXJQb3M7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlsbGVnYWxDaGFyUG9zIDwgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpc0xlZ2FsQ2hhcmFjdGVyKHZhbHVlLmNoYXJBdChpbGxlZ2FsQ2hhclBvcykpKSB7CisgICAgICAgICAgICAgICAgICAgICsraWxsZWdhbENoYXJQb3M7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dC53cml0ZSh2YWx1ZSwgcHJldkxlZ2FsQ2hhclBvcywgaWxsZWdhbENoYXJQb3MgLSBwcmV2TGVnYWxDaGFyUG9zKTsKICAgICAgICAgICAgICAgICBwcmV2TGVnYWxDaGFyUG9zID0gaWxsZWdhbENoYXJQb3MgKyAxOwpAQCAtNTUxLDcgKzU0NCw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIGl0IGlzIGFuIGVudGl0eS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZmVyZW5jZShTdHJpbmcgZW50KSB7Ci0gICAgICAgIGlmICghKGVudC5jaGFyQXQoMCkgPT0gJyYnKSB8fCAhZW50LmVuZHNXaXRoKCI7IikpIHsKKyAgICAgICAgaWYgKGVudC5jaGFyQXQoMCkgIT0gJyYnIHx8ICFlbnQuZW5kc1dpdGgoIjsiKSkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKQEAgLTU4OCw4ICs1ODEsOCBAQAogICAgICAqIElzIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYWxsb3dlZCBpbnNpZGUgYW4gWE1MIGRvY3VtZW50PwogICAgICAqCiAgICAgICogPHA+U2VlIFhNTCAxLjAgMi4yIDxhCi0gICAgICogaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI2NoYXJzZXRzIj4KLSAgICAgKiBodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAjY2hhcnNldHM8L2E+LjwvcD4KKyAgICAgKiBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI2NoYXJzZXRzIj4KKyAgICAgKiBodHRwczovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwI2NoYXJzZXRzPC9hPi48L3A+CiAgICAgICogQHBhcmFtIGMgdGhlIGNoYXJhY3RlciB0byB0ZXN0LgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIGlzIGFsbG93ZWQuCiAgICAgICogQHNpbmNlIDEuMTAsIEFudCAxLjUKQEAgLTU5OCw0NSArNTkxLDM1IEBACiAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCiAgICAgICAgIGlmIChjID09IDB4OSB8fCBjID09IDB4QSB8fCBjID09IDB4RCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MjApIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4MjApIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChjIDw9IDB4RDdGRikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4RTAwMCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKGMgPD0gMHhGRkZEKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgPD0gMHhEN0ZGKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAoYyA8IDB4RTAwMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjIDw9IDB4RkZGRDsKICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgotICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZU5TRGVmaW5pdGlvbnMoRWxlbWVudCBlbGVtZW50KSB7Ci0gICAgICAgIEFycmF5TGlzdCBhbCA9IChBcnJheUxpc3QpIG5zVVJJQnlFbGVtZW50LmdldChlbGVtZW50KTsKLSAgICAgICAgaWYgKGFsICE9IG51bGwpIHsKLSAgICAgICAgICAgIEl0ZXJhdG9yIGl0ZXIgPSBhbC5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgbnNQcmVmaXhNYXAucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgTGlzdDxTdHJpbmc+IHVyaXMgPSBuc1VSSUJ5RWxlbWVudC5nZXQoZWxlbWVudCk7CisgICAgICAgIGlmICh1cmlzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVyaXMuZm9yRWFjaChuc1ByZWZpeE1hcDo6cmVtb3ZlKTsKICAgICAgICAgICAgIG5zVVJJQnlFbGVtZW50LnJlbW92ZShlbGVtZW50KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhZGROU0RlZmluaXRpb24oRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKSB7Ci0gICAgICAgIEFycmF5TGlzdCBhbCA9IChBcnJheUxpc3QpIG5zVVJJQnlFbGVtZW50LmdldChlbGVtZW50KTsKLSAgICAgICAgaWYgKGFsID09IG51bGwpIHsKLSAgICAgICAgICAgIGFsID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgbnNVUklCeUVsZW1lbnQucHV0KGVsZW1lbnQsIGFsKTsKLSAgICAgICAgfQotICAgICAgICBhbC5hZGQodXJpKTsKKyAgICAgICAgbnNVUklCeUVsZW1lbnQuY29tcHV0ZUlmQWJzZW50KGVsZW1lbnQsIGUgLT4gbmV3IEFycmF5TGlzdDw+KCkpCisgICAgICAgICAgICAuYWRkKHVyaSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG4pIHsKICAgICAgICAgU3RyaW5nIHVyaSA9IG4uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gRklYTUU6IElzICJObyBOYW1lc3BhY2UgaXMgRW1wdHkgTmFtZXNwYWNlIiByZWFsbHkgT0s/Ci0gICAgICAgICAgICB1cmkgPSAiIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXJpOworICAgICAgICByZXR1cm4gdXJpID09IG51bGwgPyAiIiA6IHVyaTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTVV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTVV0aWxzLmphdmEKaW5kZXggZGIwMDIxMy4uYTc4NGYyYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01VdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NVXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE2MCw0ICsxNjAsNyBAQAogICAgICAgICBFbGVtZW50IGUgPSBjcmVhdGVDaGlsZEVsZW1lbnQocGFyZW50LCBuYW1lKTsKICAgICAgICAgYXBwZW5kQ0RBVEEoZSwgY29udGVudCk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBET01VdGlscygpIHsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RhdGVVdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EYXRlVXRpbHMuamF2YQppbmRleCBiNjNlMDk4Li5iZjkyYmY1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RhdGVVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSw4ICszMSw4IEBACiAKIC8qKgogICogSGVscGVyIG1ldGhvZHMgdG8gZGVhbCB3aXRoIGRhdGUvdGltZSBmb3JtYXR0aW5nIHdpdGggYSBzcGVjaWZpYwotICogZGVmaW5lZCBmb3JtYXQgKDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtZGF0ZXRpbWUiPklTTzg2MDE8L2E+KQotICogb3IgYSBwbHVyaWFsaXphdGlvbiBjb3JyZWN0IGVsYXBzZWQgdGltZSBpbiBtaW51dGVzIGFuZCBzZWNvbmRzLgorICogZGVmaW5lZCBmb3JtYXQgKDxhIGhyZWY9Imh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lIj5JU084NjAxPC9hPikKKyAqIG9yIGEgY29ycmVjdCBwbHVyYWxpemF0aW9uIG9mIGVsYXBzZWQgdGltZSBpbiBtaW51dGVzIGFuZCBzZWNvbmRzLgogICoKICAqIEBzaW5jZSBBbnQgMS41CiAgKgpAQCAtNDUsMTkgKzQ1LDE5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFTiA9IDEwOwogICAgIC8qKgogICAgICAqIElTTzg2MDEtbGlrZSBwYXR0ZXJuIGZvciBkYXRlLXRpbWUuIEl0IGRvZXMgbm90IHN1cHBvcnQgdGltZXpvbmUuCi0gICAgICogIDx0dD55eXl5LU1NLWRkVEhIOm1tOnNzPC90dD4KKyAgICAgKiAgPGNvZGU+eXl5eS1NTS1kZFRISDptbTpzczwvY29kZT4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU084NjAxX0RBVEVUSU1FX1BBVFRFUk4KICAgICAgICAgICAgID0gInl5eXktTU0tZGQnVCdISDptbTpzcyI7CiAKICAgICAvKioKLSAgICAgKiBJU084NjAxLWxpa2UgcGF0dGVybiBmb3IgZGF0ZS4gPHR0Pnl5eXktTU0tZGQ8L3R0PgorICAgICAqIElTTzg2MDEtbGlrZSBwYXR0ZXJuIGZvciBkYXRlLiA8Y29kZT55eXl5LU1NLWRkPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTTzg2MDFfREFURV9QQVRURVJOCiAgICAgICAgICAgICA9ICJ5eXl5LU1NLWRkIjsKIAogICAgIC8qKgotICAgICAqIElTTzg2MDEtbGlrZSBwYXR0ZXJuIGZvciB0aW1lLiAgPHR0PkhIOm1tOnNzPC90dD4KKyAgICAgKiBJU084NjAxLWxpa2UgcGF0dGVybiBmb3IgdGltZS4gIDxjb2RlPkhIOm1tOnNzPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTTzg2MDFfVElNRV9QQVRURVJOCiAgICAgICAgICAgICA9ICJISDptbTpzcyI7CkBAIC02OCwxMiArNjgsMTIgQEAKICAgICAgKiBzb21lIG90aGVyIGNvZGUgaXMgdXNpbmcgdGhlIGZvcm1hdCBpbiBwYXJhbGxlbC4KICAgICAgKiBEZXByZWNhdGVkIHNpbmNlIGFudCAxLjgKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBEQVRFX0hFQURFUl9GT1JNQVQKICAgICAgICAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyAiLCBMb2NhbGUuVVMpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBEQVRFX0hFQURFUl9GT1JNQVRfSU5UCi0gICAgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyAiLCBMb2NhbGUuVVMpOwotCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBEQVRFX0hFQURFUl9GT1JNQVRfSU5UID0KKyAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoIkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgIiwgTG9jYWxlLlVTKTsKIAogLy8gY29kZSBmcm9tIE1hZ2VzaCBtb3ZlZCBmcm9tIERlZmF1bHRMb2dnZXIgYW5kIHNsaWdodGx5IG1vZGlmaWVkCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVzc2FnZUZvcm1hdCBNSU5VVEVfU0VDT05EUwpAQCAtOTUsMjkgKzk1LDE5IEBACiAgICAgICogUHJvdmlkZXMgYSB0aHJlYWQtbG9jYWwgVVMtc3R5bGUgZGF0ZSBmb3JtYXQuIEV4YWN0bHkgYXMgdXNlZCBieQogICAgICAqIHtAY29kZSA8dG91Y2g+fSwgdG8gbWludXRlIHByZWNpc2lvbjoKICAgICAgKiB7QGNvZGUgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSBoaDptbSBhIiwgTG9jYWxlLlVTKX0KLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxEYXRlRm9ybWF0PiBFTl9VU19EQVRFX0ZPUk1BVF9NSU4gPQotICAgICAgICBuZXcgVGhyZWFkTG9jYWw8RGF0ZUZvcm1hdD4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBEYXRlRm9ybWF0IGluaXRpYWxWYWx1ZSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGVGb3JtYXQoIk1NL2RkL3l5eXkgaGg6bW0gYSIsIExvY2FsZS5VUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07CisgICAgICAgICAgICBUaHJlYWRMb2NhbC53aXRoSW5pdGlhbCgoKSAtPiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSBoaDptbSBhIiwgTG9jYWxlLlVTKSk7CiAKICAgICAvKioKICAgICAgKiBQcm92aWRlcyBhIHRocmVhZC1sb2NhbCBVUy1zdHlsZSBkYXRlIGZvcm1hdC4gRXhhY3RseSBhcyB1c2VkIGJ5CiAgICAgICoge0Bjb2RlIDx0b3VjaD59LCB0byBzZWNvbmQgcHJlY2lzaW9uOgogICAgICAqIHtAY29kZSBTaW1wbGVEYXRlRm9ybWF0KCJNTS9kZC95eXl5IGhoOm1tOnNzIGEiLCBMb2NhbGUuVVMpfQotICAgICAqIEBzaW5jZSBBbnQgMS45LjEwCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPERhdGVGb3JtYXQ+IEVOX1VTX0RBVEVfRk9STUFUX1NFQyA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbDxEYXRlRm9ybWF0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIERhdGVGb3JtYXQgaW5pdGlhbFZhbHVlKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU0vZGQveXl5eSBoaDptbTpzcyBhIiwgTG9jYWxlLlVTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgICAgIFRocmVhZExvY2FsLndpdGhJbml0aWFsKCgpIC0+IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJNTS9kZC95eXl5IGhoOm1tOnNzIGEiLCBMb2NhbGUuVVMpKTsKIAogICAgIHN0YXRpYyB7CiAgICAgICAgIE1JTlVURV9TRUNPTkRTLnNldEZvcm1hdCgwLCBNSU5VVEVTX0ZPUk1BVCk7CkBAIC0xNjcsOCArMTU3LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRFbGFwc2VkVGltZShsb25nIG1pbGxpcykgewogICAgICAgICBsb25nIHNlY29uZHMgPSBtaWxsaXMgLyBPTkVfU0VDT05EOwogICAgICAgICBsb25nIG1pbnV0ZXMgPSBzZWNvbmRzIC8gT05FX01JTlVURTsKLSAgICAgICAgT2JqZWN0W10gYXJncyA9IHtuZXcgTG9uZyhtaW51dGVzKSwgbmV3IExvbmcoc2Vjb25kcyAlIE9ORV9NSU5VVEUpfTsKLSAgICAgICAgcmV0dXJuIE1JTlVURV9TRUNPTkRTLmZvcm1hdChhcmdzKTsKKyAgICAgICAgcmV0dXJuIE1JTlVURV9TRUNPTkRTLmZvcm1hdChuZXcgT2JqZWN0W117bWludXRlcywgc2Vjb25kcyAlIE9ORV9NSU5VVEV9KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4OCw3ICsxNzcsNyBAQAogICAgICAqIENhbGN1bGF0ZSB0aGUgcGhhc2Ugb2YgdGhlIG1vb24gZm9yIGEgZ2l2ZW4gZGF0ZS4KICAgICAgKgogICAgICAqIDxwPkNvZGUgaGVhdmlseSBpbmZsdWVuY2VkIGJ5IGhhY2tsaWIuYyBpbiA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly93d3cubmV0aGFjay5vcmcvIj5OZXRoYWNrPC9hPjwvcD4KKyAgICAgKiBocmVmPSJodHRwczovL3d3dy5uZXRoYWNrLm9yZy8iPk5ldGhhY2s8L2E+PC9wPgogICAgICAqCiAgICAgICogPHA+VGhlIEFsZ29yaXRobToKICAgICAgKgpAQCAtMjQ1LDcgKzIzNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbC5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbC5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHR6TWFya2VyID0gbmV3IFN0cmluZ0J1ZmZlcihvZmZzZXQgPCAwID8gIi0iIDogIisiKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0ek1hcmtlciA9IG5ldyBTdHJpbmdCdWlsZGVyKG9mZnNldCA8IDAgPyAiLSIgOiAiKyIpOwogICAgICAgICBvZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpOwogICAgICAgICBpbnQgaG91cnMgPSBvZmZzZXQgLyAoT05FX0hPVVIgKiBPTkVfTUlOVVRFICogT05FX1NFQ09ORCk7CiAgICAgICAgIGludCBtaW51dGVzID0gb2Zmc2V0IC8gKE9ORV9NSU5VVEUgKiBPTkVfU0VDT05EKSAtIE9ORV9IT1VSICogaG91cnM7CkBAIC0zMjksMTQgKzMxOCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8RGF0ZUZvcm1hdD4gaXNvODYwMVdpdGhUaW1lWm9uZSA9Ci0gICAgICAgIG5ldyBUaHJlYWRMb2NhbDxEYXRlRm9ybWF0PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZSBwcm90ZWN0ZWQgRGF0ZUZvcm1hdCBpbml0aWFsVmFsdWUoKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8RGF0ZUZvcm1hdD4gaXNvODYwMVdpdGhUaW1lWm9uZSA9CisgICAgICAgICAgICBUaHJlYWRMb2NhbC53aXRoSW5pdGlhbCgoKSAtPiB7CiAgICAgICAgICAgICAgIC8vIEFuIGFyYml0cmFyeSBlYXN5LXRvLXJlYWQgZm9ybWF0IHRvIG5vcm1hbGl6ZSB0by4KICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkIEhIOm1tOnNzLlNTUyBaIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBpc284NjAxbm9ybWFsaXplciA9IFBhdHRlcm4uY29tcGlsZSgKKyAgICAgICAgICAgIH0pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gaXNvODYwMW5vcm1hbGl6ZXIgPSBQYXR0ZXJuLmNvbXBpbGUoCiAgICAgICAgICJeKFxcZHs0LH0tXFxkezJ9LVxcZHsyfSlbVHQgXSIgKyAgICAgICAgICAgLy8geXl5eS1NTS1kZAogICAgICAgICAiKFxcZHsyfTpcXGR7Mn0oOlxcZHsyfShcXC5cXGR7M30pPyk/KSA/IiArIC8vIEhIOm1tOnNzLlNTUwogICAgICAgICAiKD86WnwoWystXVxcZHsyfSkoPzo6PyhcXGR7Mn0pKT8pPyQiKTsgICAgIC8vIFoKQEAgLTM1NSw3ICszNDIsNyBAQAogICAgICAqIEBwYXJhbSBkYXRlU3RyIFN0cmluZwogICAgICAqIEByZXR1cm4gRGF0ZQogICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgZGF0ZSBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggSVNPIDg2MDEKLSAgICAgKiBAc2luY2UgQW50IDEuOS4xMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBEYXRlIHBhcnNlTGVuaWVudERhdGVUaW1lKFN0cmluZyBkYXRlU3RyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewogICAgICAgICB0cnkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EZXdleURlY2ltYWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGV3ZXlEZWNpbWFsLmphdmEKaW5kZXggMDAzZjE0MC4uY2M0MjExNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EZXdleURlY2ltYWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Rld2V5RGVjaW1hbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNiArMTgsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKIC8qKgogICogVXRpbGl0eSBjbGFzcyB0byBjb250YWluIHZlcnNpb24gbnVtYmVycyBpbiAiRGV3ZXkgRGVjaW1hbCIKQEAgLTU0LDE1ICs1NiwxNSBAQAogICAgICAgICBmaW5hbCBTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmcsICIuIiwgdHJ1ZSk7CiAgICAgICAgIGZpbmFsIGludCBzaXplID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7CiAKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBpbnRbIChzaXplICsgMSkgLyAyIF07CisgICAgICAgIGNvbXBvbmVudHMgPSBuZXcgaW50WyhzaXplICsgMSkgLyAyXTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiRW1wdHkgY29tcG9uZW50IGluIHN0cmluZyIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjb21wb25lbnRzWyBpIF0gPSBJbnRlZ2VyLnBhcnNlSW50KGNvbXBvbmVudCk7CisgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gSW50ZWdlci5wYXJzZUludChjb21wb25lbnQpOwogCiAgICAgICAgICAgICAvL1N0cmlwICcuJyB0b2tlbgogICAgICAgICAgICAgaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKQEAgLTkyLDcgKzk0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiBjb21wb25lbnQgYXQgaW5kZXgKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGNvbXBvbmVudHNbIGluZGV4IF07CisgICAgICAgIHJldHVybiBjb21wb25lbnRzW2luZGV4XTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNiw4ICsxMDgsOCBAQAogICAgICAgICBmaW5hbCBpbnQgbWF4ID0gTWF0aC5tYXgob3RoZXIuY29tcG9uZW50cy5sZW5ndGgsIGNvbXBvbmVudHMubGVuZ3RoKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MSA9IChpIDwgY29tcG9uZW50cy5sZW5ndGgpID8gY29tcG9uZW50c1sgaSBdIDogMDsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQyID0gKGkgPCBvdGhlci5jb21wb25lbnRzLmxlbmd0aCkgPyBvdGhlci5jb21wb25lbnRzWyBpIF0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDEgPSAoaSA8IGNvbXBvbmVudHMubGVuZ3RoKSA/IGNvbXBvbmVudHNbaV0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbaV0gOiAwOwogCiAgICAgICAgICAgICBpZiAoY29tcG9uZW50MiAhPSBjb21wb25lbnQxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTUwLDggKzE1Miw4IEBACiAgICAgICAgIGZpbmFsIGludCBtYXggPSBNYXRoLm1heChvdGhlci5jb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50cy5sZW5ndGgpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQxID0gKGkgPCBjb21wb25lbnRzLmxlbmd0aCkgPyBjb21wb25lbnRzWyBpIF0gOiAwOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbIGkgXSA6IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MSA9IChpIDwgY29tcG9uZW50cy5sZW5ndGgpID8gY29tcG9uZW50c1tpXSA6IDA7CisgICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MiA9IChpIDwgb3RoZXIuY29tcG9uZW50cy5sZW5ndGgpID8gb3RoZXIuY29tcG9uZW50c1tpXSA6IDA7CiAKICAgICAgICAgICAgIGlmIChjb21wb25lbnQyID4gY29tcG9uZW50MSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE3NSw4ICsxNzcsOCBAQAogICAgICAgICBmaW5hbCBpbnQgbWF4ID0gTWF0aC5tYXgob3RoZXIuY29tcG9uZW50cy5sZW5ndGgsIGNvbXBvbmVudHMubGVuZ3RoKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MSA9IChpIDwgY29tcG9uZW50cy5sZW5ndGgpID8gY29tcG9uZW50c1sgaSBdIDogMDsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQyID0gKGkgPCBvdGhlci5jb21wb25lbnRzLmxlbmd0aCkgPyBvdGhlci5jb21wb25lbnRzWyBpIF0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDEgPSAoaSA8IGNvbXBvbmVudHMubGVuZ3RoKSA/IGNvbXBvbmVudHNbaV0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbaV0gOiAwOwogCiAgICAgICAgICAgICBpZiAoY29tcG9uZW50MiA+IGNvbXBvbmVudDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xOTUsMTYgKzE5Nyw4IEBACiAgICAgICogQHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIERld2V5RGVjaW1hbC4KICAgICAgKi8KICAgICBAT3ZlcnJpZGUgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKGNvbXBvbmVudHNbIGkgXSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIEludFN0cmVhbS5vZihjb21wb25lbnRzKS5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykKKyAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLiIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxNCwxMSArMjA4LDEyIEBACiAgICAgICogQHJldHVybiByZXN1bHQKICAgICAgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhPYmplY3QpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBjb21wYXJlVG8oRGV3ZXlEZWNpbWFsIG90aGVyKSB7CiAgICAgICAgIGZpbmFsIGludCBtYXggPSBNYXRoLm1heChvdGhlci5jb21wb25lbnRzLmxlbmd0aCwgY29tcG9uZW50cy5sZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29tcG9uZW50MSA9IChpIDwgY29tcG9uZW50cy5sZW5ndGgpID8gY29tcG9uZW50c1sgaSBdIDogMDsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb21wb25lbnQyID0gKGkgPCBvdGhlci5jb21wb25lbnRzLmxlbmd0aCkgPyBvdGhlci5jb21wb25lbnRzWyBpIF0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDEgPSAoaSA8IGNvbXBvbmVudHMubGVuZ3RoKSA/IGNvbXBvbmVudHNbaV0gOiAwOworICAgICAgICAgICAgZmluYWwgaW50IGNvbXBvbmVudDIgPSAoaSA8IG90aGVyLmNvbXBvbmVudHMubGVuZ3RoKSA/IG90aGVyLmNvbXBvbmVudHNbaV0gOiAwOwogICAgICAgICAgICAgaWYgKGNvbXBvbmVudDEgIT0gY29tcG9uZW50MikgewogICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQxIC0gY29tcG9uZW50MjsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZU5hbWVNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZU5hbWVNYXBwZXIuamF2YQppbmRleCBlYzg1ZjlkLi5jYWM0ODBmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVOYW1lTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlTmFtZU1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVG9rZW5pemVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVUb2tlbml6ZXIuamF2YQppbmRleCAyODA3YWE0Li44NTM1YmZlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVUb2tlbml6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVUb2tlbml6ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM0LDYgKzM0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjb21wbGV0ZSBpbnB1dAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZXJyb3IgcmVhZGluZwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oUmVhZGVyIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICByZXR1cm4gRmlsZVV0aWxzLnJlYWRGdWxseShpbik7CiAgICAgfQpAQCAtNDIsNiArNDMsNyBAQAogICAgICAqIFJldHVybiB0aGUgaW50cmEtdG9rZW4gc3RyaW5nCiAgICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcgYWx3YXlzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0VG9rZW4oKSB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVVdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHMuamF2YQppbmRleCAwYzkzMmU5Li41NjVkNjliIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSwxNiArMzEsMjMgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOwogaW1wb3J0IGphdmEudGV4dC5EZWNpbWFsRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIGltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CiBpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOwpAQCAtNDgsNiArNTUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLkxvY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkZpbGVSZXNvdXJjZTsKIApAQCAtMTEwLDYgKzExOCw3IEBACiAgICAgICogICAgICAgICAgICAgVXNlIGdldEZpbGVVdGlscyBpbnN0ZWFkLAogICAgICAqIEZpbGVVdGlscyBkbyBub3QgaGF2ZSBzdGF0ZS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBzdGF0aWMgRmlsZVV0aWxzIG5ld0ZpbGVVdGlscygpIHsKICAgICAgICAgcmV0dXJuIG5ldyBGaWxlVXRpbHMoKTsKICAgICB9CkBAIC0yNzMsNyArMjgyLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzb3VyY2VGaWxlLCBTdHJpbmcgZGVzdEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBWZWN0b3IgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNvcHlGaWxlKG5ldyBGaWxlKHNvdXJjZUZpbGUpLCBuZXcgRmlsZShkZXN0RmlsZSksIGZpbHRlcnMsIGZpbHRlckNoYWlucywgb3ZlcndyaXRlLApAQCAtMzAzLDcgKzMxMiw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjYKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShTdHJpbmcgc291cmNlRmlsZSwgU3RyaW5nIGRlc3RGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gb3ZlcndyaXRlLCBib29sZWFuIHByZXNlcnZlTGFzdE1vZGlmaWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbnB1dEVuY29kaW5nLCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNDM4LDcgKzQ0Nyw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjUKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjb3B5RmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBWZWN0b3IgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBvdmVyd3JpdGUsIGJvb2xlYW4gcHJlc2VydmVMYXN0TW9kaWZpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kaW5nLCBQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGNvcHlGaWxlKHNvdXJjZUZpbGUsIGRlc3RGaWxlLCBmaWx0ZXJzLCBmaWx0ZXJDaGFpbnMsCkBAIC00NzQsNyArNDgzLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgIEZpbHRlclNldENvbGxlY3Rpb24gZmlsdGVycywgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMsCiAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgIFN0cmluZyBpbnB1dEVuY29kaW5nLCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcsCiAgICAgICAgICAgICBQcm9qZWN0IHByb2plY3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MTIsNyArNTIxLDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuOAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIFZlY3RvciBmaWx0ZXJDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFwcGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRFbmNvZGluZywgU3RyaW5nIG91dHB1dEVuY29kaW5nLApAQCAtNTUyLDcgKzU2MSw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc291cmNlRmlsZSwgRmlsZSBkZXN0RmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIFZlY3RvciBmaWx0ZXJDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucywKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG92ZXJ3cml0ZSwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFwcGVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5wdXRFbmNvZGluZywgU3RyaW5nIG91dHB1dEVuY29kaW5nLApAQCAtNjI5LDcgKzYzOCw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb250ZXh0UmVsYXRpdmVQYXRoKFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBpZiAoIShPTl9ET1MgfHwgT05fTkVUV0FSRSkgfHwgZmlsZW5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICBpZiAoIShPTl9ET1MgfHwgT05fTkVUV0FSRSkgfHwgZmlsZW5hbWUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7CkBAIC02NTMsMTkgKzY2MiwxOSBAQAogICAgICAqIEBzaW5jZSBBbnQgMS42LjMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBYnNvbHV0ZVBhdGgoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIGludCBsZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgIGlmIChmaWxlbmFtZS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBpbnQgbGVuID0gZmlsZW5hbWUubGVuZ3RoKCk7CiAgICAgICAgIGNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwogICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2UoJy8nLCBzZXApLnJlcGxhY2UoJ1xcJywgc2VwKTsKICAgICAgICAgY2hhciBjID0gZmlsZW5hbWUuY2hhckF0KDApOwotICAgICAgICBpZiAoIShPTl9ET1MgfHwgT05fTkVUV0FSRSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoYyA9PSBzZXApOworICAgICAgICBpZiAoIU9OX0RPUyAmJiAhT05fTkVUV0FSRSkgeworICAgICAgICAgICAgcmV0dXJuIGMgPT0gc2VwOwogICAgICAgICB9CiAgICAgICAgIGlmIChjID09IHNlcCkgewogICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKLSAgICAgICAgICAgIGlmICghKE9OX0RPUyAmJiBsZW4gPiA0ICYmIGZpbGVuYW1lLmNoYXJBdCgxKSA9PSBzZXApKSB7CisgICAgICAgICAgICBpZiAoIU9OX0RPUyB8fCBsZW4gPD0gNCB8fCBmaWxlbmFtZS5jaGFyQXQoMSkgIT0gc2VwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgpAQCAtNjk2LDE2ICs3MDUsMTYgQEAKICAgICAgKiBAc2VlIFBhdGhUb2tlbml6ZXIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB0cmFuc2xhdGVQYXRoKFN0cmluZyB0b1Byb2Nlc3MpIHsKLSAgICAgICAgaWYgKHRvUHJvY2VzcyA9PSBudWxsIHx8IHRvUHJvY2Vzcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIGlmICh0b1Byb2Nlc3MgPT0gbnVsbCB8fCB0b1Byb2Nlc3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nQnVmZmVyIHBhdGggPSBuZXcgU3RyaW5nQnVmZmVyKHRvUHJvY2Vzcy5sZW5ndGgoKSArIEVYUEFORF9TUEFDRSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKHRvUHJvY2Vzcy5sZW5ndGgoKSArIEVYUEFORF9TUEFDRSk7CiAgICAgICAgIFBhdGhUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFBhdGhUb2tlbml6ZXIodG9Qcm9jZXNzKTsKICAgICAgICAgd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBwYXRoQ29tcG9uZW50ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwogICAgICAgICAgICAgcGF0aENvbXBvbmVudCA9IHBhdGhDb21wb25lbnQucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CiAgICAgICAgICAgICBwYXRoQ29tcG9uZW50ID0gcGF0aENvbXBvbmVudC5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhdGguYXBwZW5kKHBhdGhDb21wb25lbnQpOwpAQCAtNzM3LDcgKzc0Niw3IEBACiAgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcGF0aCBpcyBudWxsLgogICAgICAqLwogICAgIHB1YmxpYyBGaWxlIG5vcm1hbGl6ZShmaW5hbCBTdHJpbmcgcGF0aCkgewotICAgICAgICBTdGFjayBzID0gbmV3IFN0YWNrKCk7CisgICAgICAgIFN0YWNrPFN0cmluZz4gcyA9IG5ldyBTdGFjazw+KCk7CiAgICAgICAgIFN0cmluZ1tdIGRpc3NlY3QgPSBkaXNzZWN0KHBhdGgpOwogICAgICAgICBzLnB1c2goZGlzc2VjdFswXSk7CiAKQEAgLTc1Nyw3ICs3NjYsNyBAQAogICAgICAgICAgICAgICAgIHMucHVzaCh0aGlzVG9rZW4pOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGZpbmFsIGludCBzaXplID0gcy5zaXplKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoaSA+IDEpIHsKQEAgLTc4NSw3ICs3OTQsNyBAQAogICAgICAgICBpZiAoIWlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24ocGF0aCArICIgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgcm9vdCA9IG51bGw7CisgICAgICAgIFN0cmluZyByb290OwogICAgICAgICBpbnQgY29sb24gPSBwYXRoLmluZGV4T2YoJzonKTsKICAgICAgICAgaWYgKGNvbG9uID4gMCAmJiAoT05fRE9TIHx8IE9OX05FVFdBUkUpKSB7CiAKQEAgLTgzOCw3ICs4NDcsNyBAQAogICAgICAgICAgICAgICAgICYmICFuYW1lLnJlZ2lvbk1hdGNoZXModHJ1ZSwgbmFtZS5sZW5ndGgoKSAtIDQsICIuRElSIiwgMCwgNCk7CiAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KICAgICAgICAgU3RyaW5nIGRldmljZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBkaXJlY3RvcnkgPSBudWxsOworICAgICAgICBTdHJpbmdCdWlsZGVyIGRpcmVjdG9yeSA9IG51bGw7CiAgICAgICAgIFN0cmluZyBmaWxlID0gbnVsbDsKIAogICAgICAgICBpbnQgaW5kZXggPSAwOwpAQCAtODUxLDE0ICs4NjAsMTQgQEAKICAgICAgICAgICAgIGRldmljZSA9IHBhdGguc3Vic3RyaW5nKDEsIGluZGV4KyspOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0RpcmVjdG9yeSkgewotICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1ZmZlcihwYXRoLnN1YnN0cmluZyhpbmRleCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJykpOworICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1aWxkZXIocGF0aC5zdWJzdHJpbmcoaW5kZXgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLicpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBkaXJFbmQgPSBwYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhciwgcGF0aC5sZW5ndGgoKSk7CisgICAgICAgICAgICBpbnQgZGlyRW5kID0gcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOwogICAgICAgICAgICAgaWYgKGRpckVuZCA9PSAtMSB8fCBkaXJFbmQgPCBpbmRleCkgewogICAgICAgICAgICAgICAgIGZpbGUgPSBwYXRoLnN1YnN0cmluZyhpbmRleCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IG5ldyBTdHJpbmdCdWZmZXIocGF0aC5zdWJzdHJpbmcoaW5kZXgsIGRpckVuZCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKSk7CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gbmV3IFN0cmluZ0J1aWxkZXIocGF0aC5zdWJzdHJpbmcoaW5kZXgsIGRpckVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy4nKSk7CiAgICAgICAgICAgICAgICAgaW5kZXggPSBkaXJFbmQgKyAxOwogICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCgpID4gaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgZmlsZSA9IHBhdGguc3Vic3RyaW5nKGluZGV4KTsKQEAgLTg5NSw2ICs5MDQsNyBAQAogICAgICAqIGJvb2xlYW4sIGJvb2xlYW4pIGluc3RlYWQuCiAgICAgICogQHJldHVybiBhIEZpbGUgcmVmZXJlbmNlIHRvIHRoZSBuZXcsIG5vbmV4aXN0ZW50IHRlbXBvcmFyeSBmaWxlLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCwgRmlsZSBwYXJlbnREaXIpIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBGaWxlKHByZWZpeCwgc3VmZml4LCBwYXJlbnREaXIsIGZhbHNlLCBmYWxzZSk7CiAgICAgfQpAQCAtOTE5LDkgKzkyOSwxMCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBhIEZpbGUgcmVmZXJlbmNlIHRvIHRoZSBuZXcgdGVtcG9yYXJ5IGZpbGUuCiAgICAgICogQHNpbmNlIEFudCAxLjcuMQotICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjkuMTUgdXNlIGNyZWF0ZVRlbXBGaWxlKFByb2plY3QsIFN0cmluZywgU3RyaW5nLCBGaWxlLAorICAgICAqIEBkZXByZWNhdGVkIHNpbmNlIEFudCAxLjEwLjggdXNlIGNyZWF0ZVRlbXBGaWxlKFByb2plY3QsIFN0cmluZywgU3RyaW5nLCBGaWxlLAogICAgICAqIGJvb2xlYW4sIGJvb2xlYW4pIGluc3RlYWQuCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgc3VmZml4LCBGaWxlIHBhcmVudERpciwKICAgICAgICAgICAgIGJvb2xlYW4gZGVsZXRlT25FeGl0LCBib29sZWFuIGNyZWF0ZUZpbGUpIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBGaWxlKG51bGwsIHByZWZpeCwgc3VmZml4LCBwYXJlbnREaXIsIGRlbGV0ZU9uRXhpdCwgY3JlYXRlRmlsZSk7CkBAIC05NTUsNyArOTY2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgRmlsZSBjcmVhdGVUZW1wRmlsZShmaW5hbCBQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgsCiAgICAgICAgICAgICBmaW5hbCBGaWxlIHBhcmVudERpciwgZmluYWwgYm9vbGVhbiBkZWxldGVPbkV4aXQsIGZpbmFsIGJvb2xlYW4gY3JlYXRlRmlsZSkgewotICAgICAgICBGaWxlIHJlc3VsdCA9IG51bGw7CisgICAgICAgIEZpbGUgcmVzdWx0OwogICAgICAgICBmaW5hbCBTdHJpbmcgcGFyZW50OwogICAgICAgICBpZiAocGFyZW50RGlyICE9IG51bGwpIHsKICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudERpci5nZXRQYXRoKCk7CkBAIC0xMDE3LDYgKzEwMjgsNyBAQAogICAgICAqIGJvb2xlYW4sIGJvb2xlYW4pIGluc3RlYWQuCiAgICAgICogQHJldHVybiBhIEZpbGUgcmVmZXJlbmNlIHRvIHRoZSBuZXcsIG5vbmV4aXN0ZW50IHRlbXBvcmFyeSBmaWxlLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHN1ZmZpeCwKICAgICAgICAgICAgIEZpbGUgcGFyZW50RGlyLCBib29sZWFuIGRlbGV0ZU9uRXhpdCkgewogICAgICAgICByZXR1cm4gY3JlYXRlVGVtcEZpbGUocHJlZml4LCBzdWZmaXgsIHBhcmVudERpciwgZGVsZXRlT25FeGl0LCBmYWxzZSk7CkBAIC0xMDYyLDggKzEwNzQsOSBAQAogICAgICAqIEBzaW5jZSAxLjEwCiAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgMS43LiBKdXN0IHVzZSB7QGxpbmsgRmlsZSNnZXRQYXJlbnRGaWxlfSBkaXJlY3RseS4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBGaWxlIGdldFBhcmVudEZpbGUoRmlsZSBmKSB7Ci0gICAgICAgIHJldHVybiAoZiA9PSBudWxsKSA/IG51bGwgOiBmLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiBmLmdldFBhcmVudEZpbGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwOTIsMjAgKzExMDUsMTkgQEAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkRnVsbHkoUmVhZGVyIHJkciwgaW50IGJ1ZmZlclNpemUpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChidWZmZXJTaXplIDw9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ1ZmZlciBzaXplIG11c3QgYmUgZ3JlYXRlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYW4gMCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQnVmZmVyIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKICAgICAgICAgaW50IGJ1ZmZlckxlbmd0aCA9IDA7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciB0ZXh0QnVmZmVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgd2hpbGUgKGJ1ZmZlckxlbmd0aCAhPSAtMSkgewogICAgICAgICAgICAgYnVmZmVyTGVuZ3RoID0gcmRyLnJlYWQoYnVmZmVyKTsKICAgICAgICAgICAgIGlmIChidWZmZXJMZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgICAgdGV4dEJ1ZmZlciA9ICh0ZXh0QnVmZmVyID09IG51bGwpID8gbmV3IFN0cmluZ0J1ZmZlcigpIDogdGV4dEJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB0ZXh0QnVmZmVyLmFwcGVuZChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgYnVmZmVyTGVuZ3RoKSk7CisgICAgICAgICAgICAgICAgdGV4dEJ1ZmZlci5hcHBlbmQoYnVmZmVyLCAwLCBidWZmZXJMZW5ndGgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodGV4dEJ1ZmZlciA9PSBudWxsKSA/IG51bGwgOiB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiAodGV4dEJ1ZmZlci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiB0ZXh0QnVmZmVyLnRvU3RyaW5nKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTY2LDE1ICsxMTc4LDE1IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIGlzIGEgc3ltYm9saWMgbGluay4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqIEBzaW5jZSBBbnQgMS41Ci0gICAgICogQGRlcHJlY2F0ZWQgdXNlIFN5bWJvbGljTGlua1V0aWxzIGluc3RlYWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEZpbGVzI2lzU3ltYm9saWNMaW5rKFBhdGgpfSBpbnN0ZWFkCiAgICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNTeW1ib2xpY0xpbmsoRmlsZSBwYXJlbnQsIFN0cmluZyBuYW1lKQorICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGJvb2xlYW4gaXNTeW1ib2xpY0xpbmsoZmluYWwgRmlsZSBwYXJlbnQsIGZpbmFsIFN0cmluZyBuYW1lKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTeW1ib2xpY0xpbmtVdGlscyB1ID0gU3ltYm9saWNMaW5rVXRpbHMuZ2V0U3ltYm9saWNMaW5rVXRpbHMoKTsKICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdS5pc1N5bWJvbGljTGluayhuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBGaWxlcy5pc1N5bWJvbGljTGluayhQYXRocy5nZXQobmFtZSkpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1LmlzU3ltYm9saWNMaW5rKHBhcmVudCwgbmFtZSk7CisgICAgICAgIHJldHVybiBGaWxlcy5pc1N5bWJvbGljTGluayhQYXRocy5nZXQocGFyZW50LnRvUGF0aCgpLnRvU3RyaW5nKCksIG5hbWUpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNDcsNyArMTI1OSw3IEBACiAgICAgICogQHBhcmFtIHJlc29sdmVTeW1saW5rcyB3aGV0aGVyIHN5bWJvbGljIGxpbmtzIHNoYWxsIGJlIHJlc29sdmVkCiAgICAgICogcHJpb3IgdG8gY29tcGFyaW5nIHRoZSBwYXRocy4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGF0aCBzdGFydHMgd2l0aCBsZWFkaW5nOyBmYWxzZSBvdGhlcndpc2UuCi0gICAgICogQHNpbmNlIEFudCAxLjkuMTMKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNQogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcmVzb2x2ZVN5bWxpbmtzIGlzIHRydWUgYW5kIGludm9raW5nCiAgICAgICogZ2V0Q2Fub25pY2FQYXRoIG9uIGVpdGhlciBhcmd1bWVudCB0aHJvd3MgYW4gZXhjZXB0aW9uCiAgICAgICovCkBAIC0xMjc3LDcgKzEyODksNyBAQAogICAgICAqCiAgICAgICogPHA+VGhlIGNvZGluZyBvZiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHdoYXQgRmlsZS50b1VSSSgpLnRvQVNDSUlTdHJpbmcoKSBwcm9kdWNlczwvcD4KICAgICAgKgotICAgICAqIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwxMS8jZHQtc3lzaWQiPmR0LXN5c2lkPC9hPgorICAgICAqIFNlZSA8YSBocmVmPSJodHRwczovL3d3dy53My5vcmcvVFIveG1sMTEvI2R0LXN5c2lkIj5kdC1zeXNpZDwvYT4KICAgICAgKiB3aGljaCBtYWtlcyBzb21lIG1lbnRpb24gb2YgaG93CiAgICAgICogY2hhcmFjdGVycyBub3Qgc3VwcG9ydGVkIGJ5IFVSSSBSZWZlcmVuY2Ugc3ludGF4IHNob3VsZCBiZSBlc2NhcGVkLgogICAgICAqCkBAIC0xNDU0LDExICsxNDY2LDggQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxGaWxlTmFtZSA9IGxvY2FsRmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIEZpbGVuYW1lRmlsdGVyIGZmID0gbmV3IEZpbGVuYW1lRmlsdGVyICgpIHsKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGxvY2FsRmlsZU5hbWUpICYmICghbmFtZS5lcXVhbHMobG9jYWxGaWxlTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9OworICAgICAgICBGaWxlbmFtZUZpbHRlciBmZiA9IChkaXIsIG5hbWUpIC0+IG5hbWUuZXF1YWxzSWdub3JlQ2FzZShsb2NhbEZpbGVOYW1lKQorICAgICAgICAgICAgJiYgKCFuYW1lLmVxdWFscyhsb2NhbEZpbGVOYW1lKSk7CiAgICAgICAgIFN0cmluZ1tdIG5hbWVzID0gbG9jYWxGaWxlLmdldFBhcmVudEZpbGUoKS5saXN0KGZmKTsKICAgICAgICAgcmV0dXJuIG5hbWVzICE9IG51bGwgJiYgbmFtZXMubGVuZ3RoID09IDE7CiAgICAgfQpAQCAtMTUyNywxMyArMTUzNiw3IEBACiAgICAgICogQHBhcmFtIGRldmljZSBvdXRwdXQgd3JpdGVyLCBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoV3JpdGVyIGRldmljZSkgewotICAgICAgICBpZiAobnVsbCAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjbG9zZSgoQXV0b0Nsb3NlYWJsZSkgZGV2aWNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NDMsMTMgKzE1NDYsNyBAQAogICAgICAqIEBwYXJhbSBkZXZpY2UgUmVhZGVyLCBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoUmVhZGVyIGRldmljZSkgewotICAgICAgICBpZiAobnVsbCAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjbG9zZSgoQXV0b0Nsb3NlYWJsZSkgZGV2aWNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NTksMTMgKzE1NTYsNyBAQAogICAgICAqIEBwYXJhbSBkZXZpY2Ugc3RyZWFtLCBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT3V0cHV0U3RyZWFtIGRldmljZSkgewotICAgICAgICBpZiAobnVsbCAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjbG9zZSgoQXV0b0Nsb3NlYWJsZSkgZGV2aWNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1NzUsMTMgKzE1NjYsNyBAQAogICAgICAqIEBwYXJhbSBkZXZpY2Ugc3RyZWFtLCBjYW4gYmUgbnVsbC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoSW5wdXRTdHJlYW0gZGV2aWNlKSB7Ci0gICAgICAgIGlmIChudWxsICE9IGRldmljZSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZXZpY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvL2lnbm9yZQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGNsb3NlKChBdXRvQ2xvc2VhYmxlKSBkZXZpY2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU5MiwxMyArMTU3Nyw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjguMAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZShDaGFubmVsIGRldmljZSkgewotICAgICAgICBpZiAobnVsbCAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy9pZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjbG9zZSgoQXV0b0Nsb3NlYWJsZSkgZGV2aWNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2MTUsNyArMTU5NCw2IEBACiAgICAgICAgICAgICAgICAgICAgIEphclVSTENvbm5lY3Rpb24ganVjID0gKEphclVSTENvbm5lY3Rpb24pIGNvbm47CiAgICAgICAgICAgICAgICAgICAgIEphckZpbGUgamYgPSBqdWMuZ2V0SmFyRmlsZSgpOwogICAgICAgICAgICAgICAgICAgICBqZi5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBqZiA9IG51bGw7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb25uIGluc3RhbmNlb2YgSHR0cFVSTENvbm5lY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgKChIdHRwVVJMQ29ubmVjdGlvbikgY29ubikuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE2MjYsNiArMTYwNCwyNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIENsb3NlIGFuIHtAbGluayBBdXRvQ2xvc2VhYmxlfSB3aXRob3V0IHRocm93aW5nIGFueSBleGNlcHRpb24KKyAgICAgKiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4gIERvIG5vdCBhdHRlbXB0IHRvIGNsb3NlIGl0IGlmIHRoZQorICAgICAqIGFyZ3VtZW50IGlzIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWMgQXV0b0Nsb3NlYWJsZSwgY2FuIGJlIG51bGwuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoQXV0b0Nsb3NlYWJsZSBhYykgeworICAgICAgICBpZiAobnVsbCAhPSBhYykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhYy5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL2lnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogRGVsZXRlIHRoZSBmaWxlIHdpdGgge0BsaW5rIEZpbGUjZGVsZXRlKCl9IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgbnVsbC4KICAgICAgKiBEbyBub3RoaW5nIG9uIGEgbnVsbCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gZmlsZSBmaWxlIHRvIGRlbGV0ZS4KQEAgLTE2OTksNyArMTY5NSw2IEBACiAgICAgICAgIGlmICgwIDwgdG9QYXRoU3RhY2subGVuZ3RoICYmIDAgPCBmcm9tUGF0aFN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICAgaWYgKCFmcm9tUGF0aFN0YWNrWzBdLmVxdWFscyh0b1BhdGhTdGFja1swXSkpIHsKICAgICAgICAgICAgICAgICAvLyBub3QgdGhlIHNhbWUgZGV2aWNlICh3b3VsZCBiZSAiIiBvbiBMaW51eC9Vbml4KQotCiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBhdGgoQXJyYXlzLmFzTGlzdCh0b1BhdGhTdGFjaykpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMTcwNywxNyArMTcwMiwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIGdldFBhdGgoQXJyYXlzLmFzTGlzdCh0b1BhdGhTdGFjaykpOwogICAgICAgICB9CiAKLSAgICAgICAgaW50IG1pbkxlbmd0aCA9IE1hdGgubWluKGZyb21QYXRoU3RhY2subGVuZ3RoLCB0b1BhdGhTdGFjay5sZW5ndGgpOwotICAgICAgICBpbnQgc2FtZSA9IDE7IC8vIFVzZWQgb3V0c2lkZSB0aGUgZm9yIGxvb3AKLQogICAgICAgICAvLyBnZXQgaW5kZXggb2YgcGFydHMgd2hpY2ggYXJlIGVxdWFsCi0gICAgICAgIGZvciAoOwotICAgICAgICAgICAgIHNhbWUgPCBtaW5MZW5ndGggJiYgZnJvbVBhdGhTdGFja1tzYW1lXS5lcXVhbHModG9QYXRoU3RhY2tbc2FtZV0pOwotICAgICAgICAgICAgIHNhbWUrKykgewotICAgICAgICAgICAgLy8gRG8gbm90aGluZworICAgICAgICBpbnQgbWluTGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhdGhTdGFjay5sZW5ndGgsIHRvUGF0aFN0YWNrLmxlbmd0aCk7CisgICAgICAgIGludCBzYW1lID0gMTsKKyAgICAgICAgd2hpbGUgKHNhbWUgPCBtaW5MZW5ndGggJiYgZnJvbVBhdGhTdGFja1tzYW1lXS5lcXVhbHModG9QYXRoU3RhY2tbc2FtZV0pKSB7CisgICAgICAgICAgICBzYW1lKys7CiAgICAgICAgIH0KIAotICAgICAgICBMaXN0IHJlbGF0aXZlUGF0aFN0YWNrID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gcmVsYXRpdmVQYXRoU3RhY2sgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyBpZiAiZnJvbSIgcGFydCBpcyBsb25nZXIsIGZpbGwgaXQgdXAgd2l0aCAiLi4iCiAgICAgICAgIC8vIHRvIHJlYWNoIHBhdGggd2hpY2ggaXMgZXF1YWwgdG8gYm90aCBwYXRocwpAQCAtMTcyNiw5ICsxNzE4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbGwgaXQgdXAgcGF0aCB3aXRoIHBhcnRzIHdoaWNoIHdlcmUgbm90IGVxdWFsCi0gICAgICAgIGZvciAoaW50IGkgPSBzYW1lOyBpIDwgdG9QYXRoU3RhY2subGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIHJlbGF0aXZlUGF0aFN0YWNrLmFkZCh0b1BhdGhTdGFja1tpXSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmVsYXRpdmVQYXRoU3RhY2suYWRkQWxsKEFycmF5cy5hc0xpc3QodG9QYXRoU3RhY2spLnN1Ykxpc3Qoc2FtZSwgdG9QYXRoU3RhY2subGVuZ3RoKSk7CiAKICAgICAgICAgcmV0dXJuIGdldFBhdGgocmVsYXRpdmVQYXRoU3RhY2spOwogICAgIH0KQEAgLTE3NTUsNyArMTc0NSw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGgoTGlzdCBwYXRoU3RhY2spIHsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKExpc3Q8U3RyaW5nPiBwYXRoU3RhY2spIHsKICAgICAgICAgLy8gY2FuIHNhZmVseSB1c2UgJy8nIGJlY2F1c2UgV2luZG93cyB1bmRlcnN0YW5kcyAnLycgYXMgc2VwYXJhdG9yCiAgICAgICAgIHJldHVybiBnZXRQYXRoKHBhdGhTdGFjaywgJy8nKTsKICAgICB9CkBAIC0xNzY5LDE4ICsxNzU5LDggQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS43CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGF0aChmaW5hbCBMaXN0IHBhdGhTdGFjaywgZmluYWwgY2hhciBzZXBhcmF0b3JDaGFyKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICAgICAgZmluYWwgSXRlcmF0b3IgaXRlciA9IHBhdGhTdGFjay5pdGVyYXRvcigpOwotICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChzZXBhcmF0b3JDaGFyKTsKLSAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaXRlci5uZXh0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYXRoKGZpbmFsIExpc3Q8U3RyaW5nPiBwYXRoU3RhY2ssIGZpbmFsIGNoYXIgc2VwYXJhdG9yQ2hhcikgeworICAgICAgICByZXR1cm4gcGF0aFN0YWNrLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKENoYXJhY3Rlci50b1N0cmluZyhzZXBhcmF0b3JDaGFyKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTc5NCw2ICsxNzc0LDcgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRFbmNvZGluZygpIHsKICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXMgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCiAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW0oKSB7IC8vTk9TT05BUgorICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KQEAgLTE4MDQsNCArMTc4NSw4MCBAQAogICAgICAgICAgICAgY2xvc2UoaXMpOwogICAgICAgICB9CiAgICAgfQorCisgICAgLyoqCisgICAgICogT3BlbnMgYSBuZXcgT3V0cHV0U3RyZWFtIGZvciB0aGUgZ2l2ZW4gUGF0aC4KKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBvZiB0aGUgZmlsZQorICAgICAqIEBwYXJhbSBhcHBlbmQgd2hldGhlciB0byBhcHBlbmQgdG8gb3IgYSByZXBsYWNlIGFuIGV4aXN0aW5nIGZpbGUKKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIHJlYWR5IHRvIHdyaXRlIHRvIHRoZSBmaWxlCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzdHJlYW0gY3JlYXRpb24gZmFpbHMKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3V0cHV0U3RyZWFtIG5ld091dHB1dFN0cmVhbShQYXRoIHBhdGgsIGJvb2xlYW4gYXBwZW5kKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoYXBwZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gRmlsZXMubmV3T3V0cHV0U3RyZWFtKHBhdGgsIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsIFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQsCisgICAgICAgICAgICAgICAgU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBGaWxlcy5uZXdPdXRwdXRTdHJlYW0ocGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyB0byBkZXRlcm1pbmUgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2YgdGhlIGZpbGVzeXN0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgKiB7QGNvZGUgcGF0aH0uIFdoaWxlIGRvaW5nIHNvLCB0aGlzIG1ldGhvZCBtaWdodCBjcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB1bmRlcgorICAgICAqIHRoZSBkaXJlY3RvcnkgcmVwcmVzZW50ZWQgYnkgdGhlIHtAY29kZSBwYXRofSwgaWYgaXQncyBhIGRpcmVjdG9yeSBvciBpbiB0aGUKKyAgICAgKiBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSB7QGNvZGUgcGF0aH0sIGlmIGl0J3MgYSBmaWxlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdvcmtzIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMgYW5kIHdpbGwgcmV0dXJuIGFuIHtAbGluayBPcHRpb25hbCNlbXB0eSgpfQorICAgICAqIGlmIGl0IGNhbm5vdCBkZXRlcm1pbmUgdGhlIGNhc2Ugc2Vuc2l0aXZpdHksIGVpdGhlciBkdWUgdG8gZXhjZXB0aW9uIG9yIGZvciBhbnkgb3RoZXIKKyAgICAgKiByZWFzb24uCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHdob3NlIGZpbGVzeXN0ZW0gY2FzZSBzZW5zaXRpdml0eSBuZWVkcyB0byBiZSBjaGVja2VkCisgICAgICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpbGVzeXN0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgcGFzc2VkIHtAY29kZSBwYXRofQorICAgICAqICAgICAgICAgIGlzIGNhc2Ugc2Vuc2l0aXZlLiBFbHNlIHJldHVybnMgZmFsc2UuIElmIHRoZSBjYXNlIHNlbnNpdGl2aXR5CisgICAgICogICAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWQgZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgorICAgICAqICAgICAgICAgIHtAbGluayBPcHRpb25hbCNlbXB0eSgpfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBwYXNzZWQgcGF0aCBpcyBudWxsCisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEJvb2xlYW4+IGlzQ2FzZVNlbnNpdGl2ZUZpbGVTeXN0ZW0oZmluYWwgUGF0aCBwYXRoKSB7CisgICAgICAgIGlmIChwYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhdGggY2Fubm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgbWl4ZWRDYXNlRmlsZU5hbWVQcmVmaXggPSAiYU50IjsKKyAgICAgICAgUGF0aCBtaXhlZENhc2VUbXBGaWxlID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKEZpbGVzLmlzUmVndWxhckZpbGUocGF0aCkpIHsKKyAgICAgICAgICAgICAgICBtaXhlZENhc2VUbXBGaWxlID0gRmlsZXMuY3JlYXRlVGVtcEZpbGUocGF0aC5nZXRQYXJlbnQoKSwgbWl4ZWRDYXNlRmlsZU5hbWVQcmVmaXgsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChGaWxlcy5pc0RpcmVjdG9yeShwYXRoKSkgeworICAgICAgICAgICAgICAgIG1peGVkQ2FzZVRtcEZpbGUgPSBGaWxlcy5jcmVhdGVUZW1wRmlsZShwYXRoLCBtaXhlZENhc2VGaWxlTmFtZVByZWZpeCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBvbmx5IGRvIG91ciB0cmlja3MgdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBmaWxlc3lzdGVtIGlzCisgICAgICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmUsIG9ubHkgaWYgdGhlIHBhdGggaXMgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlLgorICAgICAgICAgICAgICAgIC8vIEluIG90aGVyIGNhc2VzIChsaWtlIHRoZSBwYXRoIGJlaW5nIG5vbi1leGlzdGVudCksIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIHdheSB0byBkZXRlcm1pbmUgdGhhdCBkZXRhaWwKKyAgICAgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFBhdGggbG93ZXJDYXNlUGF0aCA9IFBhdGhzLmdldChtaXhlZENhc2VUbXBGaWxlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSAhRmlsZXMuaXNTYW1lRmlsZShtaXhlZENhc2VUbXBGaWxlLCBsb3dlckNhc2VQYXRoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpbGVFeGNlcHRpb24gbnNmZSkgeworICAgICAgICAgICAgICAgIC8vIGEgTlNGRSBpbXBsaWVzIHRoYXQgdGhlICJsb3dlckNhc2VQYXRoIiBmaWxlIHdhc24ndCBjb25zaWRlcmVkIHRvIGJlIHByZXNlbnQKKyAgICAgICAgICAgICAgICAvLyBldmVuIGlmIHRoZSBkaWZmZXJlbnQgY2FzZWQgZmlsZSBleGlzdHMuIFRoYXQgZWZmZWN0aXZlbHkgbWVhbnMgdGhpcyBpcyBhCisgICAgICAgICAgICAgICAgLy8gY2FzZSBzZW5zaXRpdmUgZmlsZXN5c3RlbQorICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiQ291bGQgbm90IGRldGVybWluZSB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiB0aGUgIiArCisgICAgICAgICAgICAgICAgICAgICJmaWxlc3lzdGVtIGZvciBwYXRoICIgKyBwYXRoICsgIiBkdWUgdG8gIiArIGlvZSk7CisgICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGRlbGV0ZSB0aGUgdG1wIGZpbGUKKyAgICAgICAgICAgIGlmIChtaXhlZENhc2VUbXBGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlKG1peGVkQ2FzZVRtcEZpbGUudG9GaWxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihjYXNlU2Vuc2l0aXZlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpcnN0TWF0Y2hNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlyc3RNYXRjaE1hcHBlci5qYXZhCmluZGV4IGIwZTQ3ZjIuLjZhMGM1ZDAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlyc3RNYXRjaE1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlyc3RNYXRjaE1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNyArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiAKIC8qKgogICogQSA8Y29kZT5Db250YWluZXJNYXBwZXI8L2NvZGU+IHRoYXQgcmV0dXJucyB0aGUgcmVzdWx0cyBvZiBpdHMKQEAgLTI4LDE3ICsyOCwxMSBAQAogcHVibGljIGNsYXNzIEZpcnN0TWF0Y2hNYXBwZXIgZXh0ZW5kcyBDb250YWluZXJNYXBwZXIgewogCiAgICAgLyoqIHtAaW5oZXJpdERvY30uICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXRNYXBwZXJzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIgPSAoRmlsZU5hbWVNYXBwZXIpIGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbWFwcGVkID0gbWFwcGVyLm1hcEZpbGVOYW1lKHNvdXJjZUZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwcGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiBnZXRNYXBwZXJzKCkuc3RyZWFtKCkuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCisgICAgICAgICAgICAubWFwKG0gLT4gbS5tYXBGaWxlTmFtZShzb3VyY2VGaWxlTmFtZSkpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgLmZpbmRGaXJzdCgpLm9yRWxzZShudWxsKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmxhdEZpbGVOYW1lTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZsYXRGaWxlTmFtZU1hcHBlci5qYXZhCmluZGV4IDA0ZDU4YmUuLmFjMjQ3OTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmxhdEZpbGVOYW1lTWFwcGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GbGF0RmlsZU5hbWVNYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCitpbXBvcnQgamF2YS5pby5GaWxlOworCiAvKioKICAqIEltcGxlbWVudGF0aW9uIG9mIEZpbGVOYW1lTWFwcGVyIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNvdXJjZQogICogZmlsZSBuYW1lIHdpdGhvdXQgYW55IGxlYWRpbmcgZGlyZWN0b3J5IGluZm9ybWF0aW9uLgpAQCAtMzIsNiArMzQsNyBAQAogICAgICAqIElnbm9yZWQuCiAgICAgICogQHBhcmFtIGZyb20gaWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7CiAgICAgfQogCkBAIC0zOSw2ICs0Miw3IEBACiAgICAgICogSWdub3JlZC4KICAgICAgKiBAcGFyYW0gdG8gaWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKICAgICB9CiAKQEAgLTQ4LDggKzUyLDkgQEAKICAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgdGhlIG5hbWUgdG8gbWFwLgogICAgICAqIEByZXR1cm4gdGhlIGZpbGUgbmFtZSBpbiBhIG9uZS1lbGVtZW50IGFycmF5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIHNvdXJjZUZpbGVOYW1lID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICA6IG5ldyBTdHJpbmdbXSB7bmV3IGphdmEuaW8uRmlsZShzb3VyY2VGaWxlTmFtZSkuZ2V0TmFtZSgpfTsKKyAgICAgICAgICAgIDogbmV3IFN0cmluZ1tdIHtuZXcgRmlsZShzb3VyY2VGaWxlTmFtZSkuZ2V0TmFtZSgpfTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyLmphdmEKaW5kZXggYTBmMGNhOS4uOWE2MzcwMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9HbG9iUGF0dGVybk1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvR2xvYlBhdHRlcm5NYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEwOCw0MiArMTA4LDQyIEBACiAgICAgICogU2V0cyB0aGUgJnF1b3Q7ZnJvbSZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KICAgICAgKiBAcGFyYW0gZnJvbSBhIHN0cmluZwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEZyb20oU3RyaW5nIGZyb20pIHsKLSAgICAgICAgaWYgKGZyb20gIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZnJvbS5sYXN0SW5kZXhPZigiKiIpOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb207Ci0gICAgICAgICAgICAgICAgZnJvbVBvc3RmaXggPSAiIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb20uc3Vic3RyaW5nKDAsIGluZGV4KTsKLSAgICAgICAgICAgICAgICBmcm9tUG9zdGZpeCA9IGZyb20uc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgZnJvbUNvbnRhaW5zU3RhciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmVmaXhMZW5ndGggPSBmcm9tUHJlZml4Lmxlbmd0aCgpOwotICAgICAgICAgICAgcG9zdGZpeExlbmd0aCA9IGZyb21Qb3N0Zml4Lmxlbmd0aCgpOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZnJvbSA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoaXMgbWFwcGVyIHJlcXVpcmVzIGEgJ2Zyb20nIGF0dHJpYnV0ZSIpOwogICAgICAgICB9CisgICAgICAgIGludCBpbmRleCA9IGZyb20ubGFzdEluZGV4T2YoJyonKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb207CisgICAgICAgICAgICBmcm9tUG9zdGZpeCA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJvbVByZWZpeCA9IGZyb20uc3Vic3RyaW5nKDAsIGluZGV4KTsKKyAgICAgICAgICAgIGZyb21Qb3N0Zml4ID0gZnJvbS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICAgIGZyb21Db250YWluc1N0YXIgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHByZWZpeExlbmd0aCA9IGZyb21QcmVmaXgubGVuZ3RoKCk7CisgICAgICAgIHBvc3RmaXhMZW5ndGggPSBmcm9tUG9zdGZpeC5sZW5ndGgoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSAmcXVvdDt0byZxdW90OyBwYXR0ZXJuLiBSZXF1aXJlZC4KICAgICAgKiBAcGFyYW0gdG8gYSBzdHJpbmcKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKLSAgICAgICAgaWYgKHRvICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IHRvLmxhc3RJbmRleE9mKCIqIik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICAgICAgICAgICAgICB0b1ByZWZpeCA9IHRvOwotICAgICAgICAgICAgICAgIHRvUG9zdGZpeCA9ICIiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0b1ByZWZpeCA9IHRvLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgdG9Qb3N0Zml4ID0gdG8uc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgICAgICAgdG9Db250YWluc1N0YXIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodG8gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJ0aGlzIG1hcHBlciByZXF1aXJlcyBhICd0bycgYXR0cmlidXRlIik7CiAgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gdG8ubGFzdEluZGV4T2YoJyonKTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgdG9QcmVmaXggPSB0bzsKKyAgICAgICAgICAgIHRvUG9zdGZpeCA9ICIiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdG9QcmVmaXggPSB0by5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgdG9Qb3N0Zml4ID0gdG8uc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgICAgICAgICB0b0NvbnRhaW5zU3RhciA9IHRydWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTE1Myw2ICsxNTMsNyBAQAogICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSB0aGUgZmlsZW5hbWUgdG8gbWFwCiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgY29udmVydGVkIGZpbGVuYW1lcwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKICAgICAgICAgaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTk4LDcgKzE5OSw3IEBACiAgICAgICAgICAgICBuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICB9CiAgICAgICAgIGlmIChoYW5kbGVEaXJTZXApIHsKLSAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoJ1xcJykgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKCJcXCIpKSB7CiAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnXFwnLCAnLycpOwogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5TWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5TWFwcGVyLmphdmEKaW5kZXggOWJhZTZjMi4uM2JlZTlkOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9JZGVudGl0eU1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSWRlbnRpdHlNYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMxLDYgKzMxLDcgQEAKICAgICAgKiBJZ25vcmVkLgogICAgICAqIEBwYXJhbSBmcm9tIGlnbm9yZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgewogICAgIH0KIApAQCAtMzgsNiArMzksNyBAQAogICAgICAqIElnbm9yZWQuCiAgICAgICogQHBhcmFtIHRvIGlnbm9yZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VG8oU3RyaW5nIHRvKSB7CiAgICAgfQogCkBAIC00Niw3ICs0OCw4IEBACiAgICAgICogQHBhcmFtIHNvdXJjZUZpbGVOYW1lIHRoZSBuYW1lIHRvIG1hcC4KICAgICAgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZmlsZW5hbWUgaW4gYSBvbmUtZWxlbWVudCBhcnJheS4KICAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gbWFwRmlsZU5hbWUoZmluYWwgU3RyaW5nIHNvdXJjZUZpbGVOYW1lKSB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZ1tdIG1hcEZpbGVOYW1lKFN0cmluZyBzb3VyY2VGaWxlTmFtZSkgewogICAgICAgICBpZiAoc291cmNlRmlsZU5hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhlIEZpbGVOYW1lTWFwcGVyI21hcEZpbGVOYW1lIGNvbnRyYWN0IHN0YXRlcyB0aGF0OgogICAgICAgICAgICAgLy8gImlmIHRoZSBnaXZlbiBydWxlIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIHNvdXJjZSBmaWxlLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9JZGVudGl0eVN0YWNrLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5U3RhY2suamF2YQppbmRleCBiYTQzNWIxLi5iMzlmZjRmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5U3RhY2suamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0lkZW50aXR5U3RhY2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBJZGVudGl0eVN0YWNrKSB7CiAgICAgICAgICAgICByZXR1cm4gKElkZW50aXR5U3RhY2s8RT4pIHM7CiAgICAgICAgIH0KLSAgICAgICAgSWRlbnRpdHlTdGFjazxFPiByZXN1bHQgPSBuZXcgSWRlbnRpdHlTdGFjazxFPigpOworICAgICAgICBJZGVudGl0eVN0YWNrPEU+IHJlc3VsdCA9IG5ldyBJZGVudGl0eVN0YWNrPD4oKTsKICAgICAgICAgaWYgKHMgIT0gbnVsbCkgewogICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChzKTsKICAgICAgICAgfQpAQCAtNzAsNiArNzAsNyBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhY2sgY29udGFpbnMgdGhlIG9iamVjdC4KICAgICAgKiBAc2VlIGphdmEudXRpbC5WZWN0b3IjY29udGFpbnMoT2JqZWN0KQogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewogICAgICAgICByZXR1cm4gaW5kZXhPZihvKSA+PSAwOwogICAgIH0KQEAgLTgxLDYgKzgyLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LCAtMSBpZiBub3QgZm91bmQuCiAgICAgICogQHNlZSBqYXZhLnV0aWwuVmVjdG9yI2luZGV4T2YoT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaW5kZXhPZihPYmplY3QgbywgaW50IHBvcykgewogICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IHNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IHBvczsgaSA8IHNpemU7IGkrKykgewpAQCAtOTgsNiArMTAwLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LCAtMSBpZiBub3QgZm91bmQuCiAgICAgICogQHNlZSBqYXZhLnV0aWwuVmVjdG9yI2luZGV4T2YoT2JqZWN0LCBpbnQpCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgbGFzdEluZGV4T2YoT2JqZWN0IG8sIGludCBwb3MpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IHBvczsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgIGlmIChnZXQoaSkgPT0gbykgewpAQCAtMTA3LDIyICsxMTAsMjUgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0gICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBTZXQpKSB7Ci0gICAgICAgICAgICBjID0gbmV3IEhhc2hTZXQoYyk7CisgICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBTZXQ8Pz4pKSB7CisgICAgICAgICAgICBjID0gbmV3IEhhc2hTZXQ8PihjKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlQWxsKGMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbiBjKSB7Ci0gICAgICAgIGlmICghKGMgaW5zdGFuY2VvZiBTZXQpKSB7Ci0gICAgICAgICAgICBjID0gbmV3IEhhc2hTZXQoYyk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgaWYgKCEoYyBpbnN0YW5jZW9mIFNldDw/PikpIHsKKyAgICAgICAgICAgIGMgPSBuZXcgSGFzaFNldDw+KGMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzdXBlci5yZXRhaW5BbGwoYyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotICAgICAgICBJZGVudGl0eUhhc2hNYXAgbWFwID0gbmV3IElkZW50aXR5SGFzaE1hcCgpOworICAgICAgICBJZGVudGl0eUhhc2hNYXA8T2JqZWN0LCBCb29sZWFuPiBtYXAgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yIChPYmplY3QgZSA6IHRoaXMpIHsKICAgICAgICAgICAgIG1hcC5wdXQoZSwgQm9vbGVhbi5UUlVFKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KQVhQVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSkFYUFV0aWxzLmphdmEKaW5kZXggNzY0NjBhZS4uYjEwYTk1NCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KQVhQVXRpbHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlscy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMyLDkgKzIzMiw4IEBACiAgICAgICAgIEV4Y2VwdGlvbiBuZXN0ZWQgPSBlLmdldEV4Y2VwdGlvbigpOwogICAgICAgICBpZiAobmVzdGVkICE9IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24obmVzdGVkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSmF2YUVudlV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlscy5qYXZhCmluZGV4IDA2MGJiMDQuLjg5OWM3MTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSmF2YUVudlV0aWxzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KYXZhRW52VXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDkgKzM3LDYgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIEphdmFFbnZVdGlscyB7CiAKLSAgICBwcml2YXRlIEphdmFFbnZVdGlscygpIHsKLSAgICB9Ci0KICAgICAvKiogQXJlIHdlIG9uIGEgRE9TLWJhc2VkIHN5c3RlbSAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfRE9TID0gT3MuaXNGYW1pbHkoImRvcyIpOwogICAgIC8qKiBBcmUgd2Ugb24gTm92ZWxsIE5ldFdhcmUgKi8KQEAgLTEzMCw2ICsxMjcsNDIgQEAKICAgICAgKiBAc2luY2UgQW50IDEuOS44CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl85ID0gOTA7CisgICAgCisgICAgLyoqCisgICAgICogVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxMAorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQV8xMCA9ICIxMCI7CisgICAgLyoqCisgICAgICogTnVtYmVyIFZlcnNpb24gY29uc3RhbnQgZm9yIEphdmEgMTAKKyAgICAgKiBAc2luY2UgQW50IDEuMTAuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMTAgPSAxMDA7CisKKyAgICAvKioKKyAgICAgKiBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDExCisgICAgICogQHNpbmNlIEFudCAxLjEwLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzExID0gIjExIjsKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxMQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xMSA9IDExMDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBWZXJzaW9uIGNvbnN0YW50IGZvciBKYXZhIDEyCisgICAgICogQHNpbmNlIEFudCAxLjEwLjcKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBXzEyID0gIjEyIjsKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgVmVyc2lvbiBjb25zdGFudCBmb3IgSmF2YSAxMgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xMiA9IDEyMDsKKyAgICAKKyAgICAKIAogICAgIC8qKiBXaGV0aGVyIHRoaXMgaXMgdGhlIEthZmZlIFZNICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBrYWZmZURldGVjdGVkOwpAQCAtMTQ2LDQ3ICsxNzksMTYgQEAKICAgICAvKiogYXJyYXkgb2YgcGFja2FnZXMgaW4gdGhlIHJ1bnRpbWUgKi8KICAgICBwcml2YXRlIHN0YXRpYyBWZWN0b3I8U3RyaW5nPiBqcmVQYWNrYWdlczsKIAorICAgIHByaXZhdGUgSmF2YUVudlV0aWxzKCkgeworICAgIH0KIAogICAgIHN0YXRpYyB7CiAKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBKYXZhIHZlcnNpb24gYnkgbG9va2luZyBhdCBhdmFpbGFibGUgY2xhc3NlcwotICAgICAgICAvLyBqYXZhLm5ldC5Qcm94eSB3YXMgaW50cm9kdWNlZCBpbiBKREsgMS41Ci0gICAgICAgIC8vIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ugd2FzIGludHJvZHVjZWQgaW4gSkRLIDEuNAotICAgICAgICAvLyBqYXZhLmxhbmcuU3RyaWN0TWF0aCB3YXMgaW50cm9kdWNlZCBpbiBKREsgMS4zCi0gICAgICAgIC8vIGphdmEubGFuZy5UaHJlYWRMb2NhbCB3YXMgaW50cm9kdWNlZCBpbiBKREsgMS4yCi0gICAgICAgIC8vIGphdmEubGFuZy5Wb2lkIHdhcyBpbnRyb2R1Y2VkIGluIEpESyAxLjEKLSAgICAgICAgLy8gQ291bnQgdXAgdmVyc2lvbiB1bnRpbCBhIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGVuZHMgdGhlIHRyeQotCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8wOwotICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIgPSBWRVJTSU9OXzFfMDsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5Wb2lkIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV8xOwotICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5UaHJlYWRMb2NhbCIpOwotICAgICAgICAgICAgamF2YVZlcnNpb24gPSBKQVZBXzFfMjsKLSAgICAgICAgICAgIGphdmFWZXJzaW9uTnVtYmVyKys7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuU3RyaWN0TWF0aCIpOwotICAgICAgICAgICAgamF2YVZlcnNpb24gPSBKQVZBXzFfMzsKLSAgICAgICAgICAgIGphdmFWZXJzaW9uTnVtYmVyKys7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcuQ2hhclNlcXVlbmNlIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV80OwotICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubmV0LlByb3h5Iik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV81OwotICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubmV0LkNvb2tpZVN0b3JlIik7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbiA9IEpBVkFfMV82OwotICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIrKzsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubmlvLmZpbGUuRmlsZVN5c3RlbSIpOwotICAgICAgICAgICAgamF2YVZlcnNpb24gPSBKQVZBXzFfNzsKLSAgICAgICAgICAgIGphdmFWZXJzaW9uTnVtYmVyKys7Ci0gICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJqYXZhLmxhbmcucmVmbGVjdC5FeGVjdXRhYmxlIik7CisgICAgICAgIAkvLyBvbmx5IGphdmEgMS44IHVwIHN1cHBvcnRlZC4KICAgICAgICAgICAgIGphdmFWZXJzaW9uID0gSkFWQV8xXzg7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlcisrOworICAgICAgICAgICAgamF2YVZlcnNpb25OdW1iZXIgPSBWRVJTSU9OXzFfODsKICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoImphdmEubGFuZy5tb2R1bGUuTW9kdWxlRGVzY3JpcHRvciIpOwotICAgICAgICAgICAgamF2YVZlcnNpb24gPSBKQVZBXzk7Ci0gICAgICAgICAgICBqYXZhVmVyc2lvbk51bWJlciA9IFZFUlNJT05fOTsKICAgICAgICAgICAgIC8vIGF0IGxlYXN0IEphdmE5IGFuZCB0aGlzIHNob3VsZCBwcm9wZXJseSBzdXBwb3J0IHRoZSBwdXJlbHkgbnVtZXJpYyB2ZXJzaW9uIHByb3BlcnR5CiAgICAgICAgICAgICBTdHJpbmcgdiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iKTsKICAgICAgICAgICAgIERld2V5RGVjaW1hbCBwdiA9IG5ldyBEZXdleURlY2ltYWwodik7CkBAIC0yNzMsOCArMjc1LDggQEAKICAgICAgKiBDb21wYXJlcyB0aGUgY3VycmVudCBKYXZhIHZlcnNpb24gdG8gdGhlIHBhc3NlZCBpbiBTdHJpbmcgLQogICAgICAqIGFzc3VtZXMgdGhlIGFyZ3VtZW50IGlzIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcwogICAgICAqIGNsYXNzLgotICAgICAqIE5vdGUgdGhhdCBBbnQgbm93IHJlcXVpcmVzIEpESyAxLjUrIHNvIHtAbGluayAjSkFWQV8xXzB9IHRocm91Z2gKLSAgICAgKiB7QGxpbmsgI0pBVkFfMV80fSBuZWVkIG5vIGxvbmdlciBiZSB0ZXN0ZWQgZm9yLgorICAgICAqIE5vdGUgdGhhdCBBbnQgbm93IHJlcXVpcmVzIEpESyAxLjgrIHNvIHtAbGluayAjSkFWQV8xXzB9IHRocm91Z2gKKyAgICAgKiB7QGxpbmsgI0pBVkFfMV83fSBuZWVkIG5vIGxvbmdlciBiZSB0ZXN0ZWQgZm9yLgogICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSB2ZXJzaW9uIHRvIGNoZWNrIGFnYWluc3QgdGhlIGN1cnJlbnQgdmVyc2lvbi4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZlcnNpb24gb2YgSmF2YSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gdmVyc2lvbi4KICAgICAgKiBAc2luY2UgQW50IDEuNQpAQCAtMjg4LDggKzI5MCw4IEBACiAgICAgICogQ29tcGFyZXMgdGhlIGN1cnJlbnQgSmF2YSB2ZXJzaW9uIHRvIHRoZSBwYXNzZWQgaW4gU3RyaW5nIC0KICAgICAgKiBhc3N1bWVzIHRoZSBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHRoaXMKICAgICAgKiBjbGFzcy4KLSAgICAgKiBOb3RlIHRoYXQgQW50IG5vdyByZXF1aXJlcyBKREsgMS41KyBzbyB7QGxpbmsgI0pBVkFfMV8wfSB0aHJvdWdoCi0gICAgICoge0BsaW5rICNKQVZBXzFfNH0gbmVlZCBubyBsb25nZXIgYmUgdGVzdGVkIGZvci4KKyAgICAgKiBOb3RlIHRoYXQgQW50IG5vdyByZXF1aXJlcyBKREsgMS44KyBzbyB7QGxpbmsgI0pBVkFfMV8wfSB0aHJvdWdoCisgICAgICoge0BsaW5rICNKQVZBXzFfN30gbmVlZCBubyBsb25nZXIgYmUgdGVzdGVkIGZvci4KICAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgdmVyc2lvbiB0byBjaGVjayBhZ2FpbnN0IHRoZSBjdXJyZW50IHZlcnNpb24uCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2ZXJzaW9uIG9mIEphdmEgaXMgdGhlIHNhbWUgb3IgaGlnaGVyIHRoYW4gdGhlCiAgICAgICogZ2l2ZW4gdmVyc2lvbi4KQEAgLTMwMyw3ICszMDUsNyBAQAogICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IEphdmEgVk0gaXMgS2FmZmUuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IEphdmEgVk0gaXMgS2FmZmUuCiAgICAgICogQHNpbmNlIEFudCAxLjYuMwotICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5rYWZmZS5vcmcvIj5odHRwOi8vd3d3LmthZmZlLm9yZy88L2E+CisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2FmZmUva2FmZmUiPmh0dHBzOi8vZ2l0aHViLmNvbS9rYWZmZS9rYWZmZTwvYT4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNLYWZmZSgpIHsKICAgICAgICAgcmV0dXJuIGthZmZlRGV0ZWN0ZWQ7CkBAIC00NjMsOTcgKzQ2NSw2MCBAQAogICAgICAqLwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBidWlsZEpyZVBhY2thZ2VzKCkgewotICAgICAgICBqcmVQYWNrYWdlcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotICAgICAgICBpZiAoaXNBdExlYXN0SmF2YVZlcnNpb24oSkFWQV8xXzEpKSB7Ci0gICAgICAgICAgICAvL3RoaW5ncyBsaWtlIHN1bi5yZWZsZWN0aW9uLCBzdW4ubWlzYywgc3VuLm5ldAotICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgic3VuIik7Ci0gICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJqYXZhIik7Ci0gICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJqYXZheCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfMikpIHsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4uamF2YSIpOwotICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5pbWFnZSIpOwotICAgICAgICAgICAgLy8gYXJlIHRoZXJlIGFueSBoZXJlIHRoYXQgd2UgZm9yZ290PwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfMykpIHsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5vbWciKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4uY29yYmEiKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4uam5kaSIpOwotICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5tZWRpYSIpOwotICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5uYW1pbmciKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ub3JnLm9tZyIpOwotICAgICAgICAgICAganJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5ybWkiKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoInN1bncuaW8iKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoInN1bncudXRpbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfNCkpIHsKLSAgICAgICAgICAgIGlmIChqYXZhVmVyc2lvbk51bWJlciA9PSBWRVJTSU9OXzFfNCkgewotICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUuY3JpbXNvbiIpOwotICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueGFsYW4iKTsKLSAgICAgICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcuYXBhY2hlLnhtbCIpOwotICAgICAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueHBhdGgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5pZXRmLmpnc3MiKTsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy53M2MuZG9tIik7Ci0gICAgICAgICAgICBqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcueG1sLnNheCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfNSkpIHsKLSAgICAgICAgICAgIC8vSW4gSmF2YTEuNSwgdGhlIGFwYWNoZSBzdHVmZiBtb3ZlZC4KLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4ub3JnLmFwYWNoZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfNykpIHsKLSAgICAgICAgICAgIGpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImpkayIpOwotICAgICAgICB9Ci0gICAgfQorICAgIAkvLyBkbyB3ZSBzdGlsbCBuZWVkIHRoaXM/IEFzIHdlIG9ubHkgc3VwcG9ydCBqYXZhIDEuOCB1cHdhcmRzIHRoaXMgd291bGQgYmUgdGhlIGZpeGVkIGxpc3QKKwkJLy8gaXMgdGhpcyBsaXN0IGNvcnJlY3QgZm9yIGphdmEgOSBhbmQgYWJvdmU/CisJCWpyZVBhY2thZ2VzID0gbmV3IFZlY3Rvcjw+KCk7CisJCWpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoInN1biIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJqYXZhIik7CisJCWpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImphdmF4Iik7CisJCWpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoImNvbS5zdW4uamF2YSIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLmltYWdlIik7CisJCWpyZVBhY2thZ2VzLmFkZEVsZW1lbnQoIm9yZy5vbWciKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5jb3JiYSIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLmpuZGkiKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5tZWRpYSIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLm5hbWluZyIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLm9yZy5vbWciKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgiY29tLnN1bi5ybWkiKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgic3Vudy5pbyIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJzdW53LnV0aWwiKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgib3JnLmlldGYuamdzcyIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcudzNjLmRvbSIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJvcmcueG1sLnNheCIpOworCQlqcmVQYWNrYWdlcy5hZGRFbGVtZW50KCJjb20uc3VuLm9yZy5hcGFjaGUiKTsKKwkJanJlUGFja2FnZXMuYWRkRWxlbWVudCgiamRrIik7CisJfQogCiAgICAgLyoqCiAgICAgICogVGVzdGluZyBoZWxwZXIgbWV0aG9kOyBrZXB0IGhlcmUgZm9yIHVuaWZpY2F0aW9uIG9mIGNoYW5nZXMuCiAgICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGVzdCBjbGFzc2VzIGRlcGVuZGluZyBvbiB0aGUgamF2YSB2ZXJzaW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPFN0cmluZz4gZ2V0SnJlUGFja2FnZVRlc3RDYXNlcygpIHsKLSAgICAgICAgVmVjdG9yPFN0cmluZz4gdGVzdHMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiamF2YS5sYW5nLk9iamVjdCIpOwotICAgICAgICBpZiAoaXNBdExlYXN0SmF2YVZlcnNpb24oSkFWQV8xXzEpKSB7Ci0gICAgICAgICAgICAvL3RoaW5ncyBsaWtlIHN1bi5yZWZsZWN0aW9uLCBzdW4ubWlzYywgc3VuLm5ldAotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgic3VuLnJlZmxlY3QuU2VyaWFsaXphdGlvbkNvbnN0cnVjdG9yQWNjZXNzb3JJbXBsIik7Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJzdW4ubmV0Lnd3dy5odHRwLkh0dHBDbGllbnQiKTsKLSAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoInN1bi5hdWRpby5BdWRpb1BsYXllciIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfMikpIHsKLSAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImphdmF4LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZSIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgic3VuLm1pc2MuQkFTRTY0RW5jb2RlciIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5pbWFnZS5jb2RlYy5qcGVnLkpQRUdDb2RlYyIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc0F0TGVhc3RKYXZhVmVyc2lvbihKQVZBXzFfMykpIHsKLSAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5vbWcuQ09SQkEuQW55Iik7Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLmNvcmJhLnNlLmludGVybmFsLmNvcmJhLkFueUltcGwiKTsKLSAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4uam5kaS5sZGFwLkxkYXBVUkwiKTsKLSAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4ubWVkaWEuc291bmQuUHJpbnRlciIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5uYW1pbmcuaW50ZXJuYWwuVmVyc2lvbkhlbHBlciIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5vcmcub21nLkNPUkJBLkluaXRpYWxpemVyIik7Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJzdW53LmlvLlNlcmlhbGl6YWJsZSIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgic3Vudy51dGlsLkV2ZW50TGlzdGVuZXIiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBdExlYXN0SmF2YVZlcnNpb24oSkFWQV8xXzQpKSB7Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJzdW4uYXVkaW8uQXVkaW9QbGF5ZXIiKTsKLSAgICAgICAgICAgIGlmIChqYXZhVmVyc2lvbk51bWJlciA9PSBWRVJTSU9OXzFfNCkgewotICAgICAgICAgICAgICAgIC8vIG9ubHkgZm9yIDEuNCwgbm90IGZvciBoaWdoZXIgdmVyc2lvbnMKLSAgICAgICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJvcmcuYXBhY2hlLmNyaW1zb24ucGFyc2VyLkNvbnRlbnRNb2RlbCIpOwotICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlByb2Nlc3NvckltcG9ydCIpOwotICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueG1sLnV0aWxzLlVSSSIpOwotICAgICAgICAgICAgICAgIHRlc3RzLmFkZEVsZW1lbnQoIm9yZy5hcGFjaGUueHBhdGguWFBhdGhGYWN0b3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJvcmcuaWV0Zi5qZ3NzLk9pZCIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgib3JnLnczYy5kb20uQXR0ciIpOwotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgib3JnLnhtbC5zYXguWE1MUmVhZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzQXRMZWFzdEphdmFWZXJzaW9uKEpBVkFfMV81KSkgewotICAgICAgICAgICAgdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5qYXhwLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeUltcGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBdExlYXN0SmF2YVZlcnNpb24oSkFWQV8xXzcpKSB7Ci0gICAgICAgICAgICB0ZXN0cy5hZGRFbGVtZW50KCJqZGsubmV0LlNvY2tldHMiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGVzdHM7CisgICAgCS8vIGRvIHdlIHN0aWxsIG5lZWQgdGhpcz8gQXMgd2Ugb25seSBzdXBwb3J0IGphdmEgMS44IHVwd2FyZHMgdGhpcyB3b3VsZCBiZSB0aGUgZml4ZWQgbGlzdAorCQkvLyBpcyB0aGlzIGxpc3QgY29ycmVjdCBmb3IgamF2YSA5IGFuZCBhYm92ZT8KKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdGVzdHMgPSBuZXcgVmVjdG9yPD4oKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgiamF2YS5sYW5nLk9iamVjdCIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJzdW4ucmVmbGVjdC5TZXJpYWxpemF0aW9uQ29uc3RydWN0b3JBY2Nlc3NvckltcGwiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgic3VuLm5ldC53d3cuaHR0cC5IdHRwQ2xpZW50Iik7CisJCXRlc3RzLmFkZEVsZW1lbnQoInN1bi5hdWRpby5BdWRpb1BsYXllciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJqYXZheC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGUiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgic3VuLm1pc2MuQkFTRTY0RW5jb2RlciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLmltYWdlLmNvZGVjLmpwZWcuSlBFR0NvZGVjIik7CisJCXRlc3RzLmFkZEVsZW1lbnQoIm9yZy5vbWcuQ09SQkEuQW55Iik7CisJCXRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4uY29yYmEuc2UuaW50ZXJuYWwuY29yYmEuQW55SW1wbCIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLmpuZGkubGRhcC5MZGFwVVJMIik7CisJCXRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4ubWVkaWEuc291bmQuUHJpbnRlciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJjb20uc3VuLm5hbWluZy5pbnRlcm5hbC5WZXJzaW9uSGVscGVyIik7CisJCXRlc3RzLmFkZEVsZW1lbnQoImNvbS5zdW4ub3JnLm9tZy5DT1JCQS5Jbml0aWFsaXplciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJzdW53LmlvLlNlcmlhbGl6YWJsZSIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJzdW53LnV0aWwuRXZlbnRMaXN0ZW5lciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJzdW4uYXVkaW8uQXVkaW9QbGF5ZXIiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgib3JnLmlldGYuamdzcy5PaWQiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgib3JnLnczYy5kb20uQXR0ciIpOworCQl0ZXN0cy5hZGRFbGVtZW50KCJvcmcueG1sLnNheC5YTUxSZWFkZXIiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgiY29tLnN1bi5vcmcuYXBhY2hlLnhlcmNlcy5pbnRlcm5hbC5qYXhwLmRhdGF0eXBlLkRhdGF0eXBlRmFjdG9yeUltcGwiKTsKKwkJdGVzdHMuYWRkRWxlbWVudCgiamRrLm5ldC5Tb2NrZXRzIik7CisJCXJldHVybiB0ZXN0czsKICAgICB9CiAgICAgLyoqCiAgICAgICogZ2V0IGEgdmVjdG9yIG9mIHN0cmluZ3Mgb2YgcGFja2FnZXMgYnVpbHQgaW50bwpAQCAtNTc4LDE1ICs1NDMsMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVm1zSmF2YU9wdGlvbkZpbGUoU3RyaW5nW10gY21kcykKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgc2NyaXB0ID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZShudWxsLCAiQU5UIiwgIi5KQVZBX09QVFMiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIoc2NyaXB0KSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNtZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGUoY21kc1tpXSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHNjcmlwdCkpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBjbWQgOiBjbWRzKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGNtZCk7CiAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzY3JpcHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9LZWVwQWxpdmVJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9LZWVwQWxpdmVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDU4MzMyYjUuLjE4OTA1MTYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvS2VlcEFsaXZlSW5wdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0tlZXBBbGl2ZUlucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogLyoqCi0gKiBDbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgPHR0PlN5c3RlbS5pbjwvdHQ+CisgKiBDbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgPGNvZGU+U3lzdGVtLmluPC9jb2RlPgogICogd2l0aG91dCBnZXR0aW5nIGFueGlvdXMgYWJvdXQgYW55IGNsaWVudCBjbG9zaW5nIHRoZSBzdHJlYW0uCiAgKgogICogPHA+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9LZWVwQWxpdmVPdXRwdXRTdHJlYW0uamF2YQppbmRleCAzNTJiMGJhLi5kMTBjYjNjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0tlZXBBbGl2ZU91dHB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvS2VlcEFsaXZlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIAogLyoqCi0gKiBDbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgPHR0PlN5c3RlbS5vdXQ8L3R0PiBhbmQgPHR0PlN5c3RlbS5lcnI8L3R0PgorICogQ2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byB3cmFwIDxjb2RlPlN5c3RlbS5vdXQ8L2NvZGU+IGFuZCA8Y29kZT5TeXN0ZW0uZXJyPC9jb2RlPgogICogd2l0aG91dCBnZXR0aW5nIGFueGlvdXMgYWJvdXQgYW55IGNsaWVudCBjbG9zaW5nIHRoZSBzdHJlYW0uCiAgKgogICogPHA+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzLmphdmEKaW5kZXggMjc3MTA3My4uZmJkYjZiOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTI4LDE1ICsyNywxOSBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QdXNoYmFja1JlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiAvKioKICAqIDxwPkEgUHJvcGVydGllcyBjb2xsZWN0aW9uIHdoaWNoIHByZXNlcnZlcyBjb21tZW50cyBhbmQgd2hpdGVzcGFjZQogICogcHJlc2VudCBpbiB0aGUgaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggaXQgd2FzIGxvYWRlZC48L3A+Ci0gKiA8cD5UaGUgY2xhc3MgZGVmZXJzIHRoZSB1c3VhbCB3b3JrIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPgorICogPHA+VGhlIGNsYXNzIGRlZmVycyB0aGUgdXN1YWwgd29yayBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXMuaHRtbCI+amF2YS51dGlsLlByb3BlcnRpZXM8L2E+CiAgKiBjbGFzcyB0byB0aGVyZSwgYnV0IGl0IGFsc28ga2VlcHMgdHJhY2sgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZQogICogaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggaXQgd2FzIGxvYWRlZCAoaWYgYXBwbGljYWJsZSksIHNvIHRoYXQgaXQgY2FuCiAgKiB3cml0ZSBvdXQgdGhlIHByb3BlcnRpZXMgaW4gYXMgY2xvc2UgYSBmb3JtIGFzIHBvc3NpYmxlIHRvIHRoZSBpbnB1dC48L3A+CkBAIC03OCwxOSArODEsMjEgQEAKICAqIGFsdGhvdWdoIHRoZSBrZXktdmFsdWUgcGFpciA8Y29kZT5iZXRhPXR3bzwvY29kZT4gaXMgcmVtb3ZlZC48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcyBleHRlbmRzIFByb3BlcnRpZXMgewotICAgIHByaXZhdGUgU3RyaW5nIExTID0gU3RyaW5nVXRpbHMuTElORV9TRVA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBwcml2YXRlIFN0cmluZyBlb2wgPSBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOwogCiAgICAgLyoqCiAgICAgICogTG9naWNhbCBsaW5lcyBoYXZlIGVzY2FwaW5nIGFuZCBsaW5lIGNvbnRpbnVhdGlvbiB0YWtlbiBjYXJlCiAgICAgICogb2YuIENvbW1lbnRzIGFuZCBibGFuayBsaW5lcyBhcmUgbG9naWNhbCBsaW5lczsgdGhleSBhcmUgbm90CiAgICAgICogcmVtb3ZlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIEFycmF5TGlzdCBsb2dpY2FsTGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgcHJpdmF0ZSBMaXN0PExvZ2ljYWxMaW5lPiBsb2dpY2FsTGluZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIFBvc2l0aW9uIGluIHRoZSA8Y29kZT5sb2dpY2FsTGluZXM8L2NvZGU+IGxpc3QsIGtleWVkIGJ5IHByb3BlcnR5IG5hbWUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBIYXNoTWFwIGtleWVkUGFpckxpbmVzID0gbmV3IEhhc2hNYXAoKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IGtleWVkUGFpckxpbmVzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogRmxhZyB0byBpbmRpY2F0ZSB0aGF0LCB3aGVuIHdlIHJlbW92ZSBhIHByb3BlcnR5IGZyb20gdGhlIGZpbGUsIHdlCkBAIC0xNDEsNyArMTQ2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBsb2FkKGZpbmFsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHJlYWRMaW5lcyhpblN0cmVhbSk7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSBiYSA9IHMuZ2V0Qnl0ZXMoUmVzb3VyY2VVdGlscy5JU09fODg1OV8xKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJhID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEpOwogICAgICAgICBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhKTsKICAgICAgICAgc3VwZXIubG9hZChiYWlzKTsKICAgICB9CkBAIC0xNzUsMTQgKzE4MCwxNCBAQAogICAgICAgICB2YWx1ZSA9IGVzY2FwZVZhbHVlKHZhbHVlKTsKIAogICAgICAgICBpZiAoa2V5ZWRQYWlyTGluZXMuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgZmluYWwgSW50ZWdlciBpID0gKEludGVnZXIpIGtleWVkUGFpckxpbmVzLmdldChrZXkpOwotICAgICAgICAgICAgZmluYWwgUGFpciBwID0gKFBhaXIpIGxvZ2ljYWxMaW5lcy5nZXQoaS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgaSA9IGtleWVkUGFpckxpbmVzLmdldChrZXkpOworICAgICAgICAgICAgZmluYWwgUGFpciBwID0gKFBhaXIpIGxvZ2ljYWxMaW5lcy5nZXQoaSk7CiAgICAgICAgICAgICBwLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGtleSA9IGVzY2FwZU5hbWUoa2V5KTsKICAgICAgICAgICAgIGZpbmFsIFBhaXIgcCA9IG5ldyBQYWlyKGtleSwgdmFsdWUpOwogICAgICAgICAgICAgcC5zZXROZXcodHJ1ZSk7Ci0gICAgICAgICAgICBrZXllZFBhaXJMaW5lcy5wdXQoa2V5LCBuZXcgSW50ZWdlcihsb2dpY2FsTGluZXMuc2l6ZSgpKSk7CisgICAgICAgICAgICBrZXllZFBhaXJMaW5lcy5wdXQoa2V5LCBsb2dpY2FsTGluZXMuc2l6ZSgpKTsKICAgICAgICAgICAgIGxvZ2ljYWxMaW5lcy5hZGQocCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTcsMTIgKzIwMiwxMiBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgcmVtb3ZlKGZpbmFsIE9iamVjdCBrZXkpIHsKICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IHN1cGVyLnJlbW92ZShrZXkpOwotICAgICAgICBmaW5hbCBJbnRlZ2VyIGkgPSAoSW50ZWdlcikga2V5ZWRQYWlyTGluZXMucmVtb3ZlKGtleSk7CisgICAgICAgIGZpbmFsIEludGVnZXIgaSA9IGtleWVkUGFpckxpbmVzLnJlbW92ZShrZXkpOwogICAgICAgICBpZiAobnVsbCAhPSBpKSB7CiAgICAgICAgICAgICBpZiAocmVtb3ZlQ29tbWVudHMpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVDb21tZW50c0VuZGluZ0F0KGkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ29tbWVudHNFbmRpbmdBdChpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvZ2ljYWxMaW5lcy5zZXQoaS5pbnRWYWx1ZSgpLCBudWxsKTsKKyAgICAgICAgICAgIGxvZ2ljYWxMaW5lcy5zZXQoaSwgbnVsbCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG9iajsKICAgICB9CkBAIC0yMTEsMTQgKzIxNiwxNCBAQAogICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CiAgICAgICAgIGZpbmFsIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGRvbGx5ID0KICAgICAgICAgICAgIChMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcykgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgZG9sbHkua2V5ZWRQYWlyTGluZXMgPSAoSGFzaE1hcCkgdGhpcy5rZXllZFBhaXJMaW5lcy5jbG9uZSgpOwotICAgICAgICBkb2xseS5sb2dpY2FsTGluZXMgPSAoQXJyYXlMaXN0KSB0aGlzLmxvZ2ljYWxMaW5lcy5jbG9uZSgpOworICAgICAgICBkb2xseS5rZXllZFBhaXJMaW5lcyA9IG5ldyBIYXNoTWFwPD4odGhpcy5rZXllZFBhaXJMaW5lcyk7CisgICAgICAgIGRvbGx5LmxvZ2ljYWxMaW5lcyA9IG5ldyBBcnJheUxpc3Q8Pih0aGlzLmxvZ2ljYWxMaW5lcyk7CiAgICAgICAgIGZpbmFsIGludCBzaXplID0gZG9sbHkubG9naWNhbExpbmVzLnNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLSAgICAgICAgICAgIGZpbmFsIExvZ2ljYWxMaW5lIGxpbmUgPSAoTG9naWNhbExpbmUpIGRvbGx5LmxvZ2ljYWxMaW5lcy5nZXQoaik7CisgICAgICAgICAgICBmaW5hbCBMb2dpY2FsTGluZSBsaW5lID0gZG9sbHkubG9naWNhbExpbmVzLmdldChqKTsKICAgICAgICAgICAgIGlmIChsaW5lIGluc3RhbmNlb2YgUGFpcikgewogICAgICAgICAgICAgICAgIGZpbmFsIFBhaXIgcCA9IChQYWlyKSBsaW5lOwotICAgICAgICAgICAgICAgIGRvbGx5LmxvZ2ljYWxMaW5lcy5zZXQoaiwgcC5jbG9uZSgpKTsKKyAgICAgICAgICAgICAgICBkb2xseS5sb2dpY2FsTGluZXMuc2V0KGosIChQYWlyKSBwLmNsb25lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gbm8gcmVhc29uIHRvIGNsb25lIG90aGVyIGxpbmVzIGFyZSB0aGV5IGFyZSBpbW11dGFibGUKICAgICAgICAgfQpAQCAtMjMyLDkgKzIzNyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgbGlzdExpbmVzKGZpbmFsIFByaW50U3RyZWFtIG91dCkgewogICAgICAgICBvdXQucHJpbnRsbigiLS0gbG9naWNhbCBsaW5lcyAtLSIpOwotICAgICAgICBmaW5hbCBJdGVyYXRvciBpID0gbG9naWNhbExpbmVzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgewotICAgICAgICAgICAgZmluYWwgTG9naWNhbExpbmUgbGluZSA9IChMb2dpY2FsTGluZSkgaS5uZXh0KCk7CisgICAgICAgIGZvciAoTG9naWNhbExpbmUgbGluZSA6IGxvZ2ljYWxMaW5lcykgewogICAgICAgICAgICAgaWYgKGxpbmUgaW5zdGFuY2VvZiBCbGFuaykgewogICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJibGFuazogICBcIiIgKyBsaW5lICsgIlwiIik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUgaW5zdGFuY2VvZiBDb21tZW50KSB7CkBAIC0yNTEsMjAgKzI1NCwyMCBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgc2F2ZSBmYWlscwogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNhdmVBcyhmaW5hbCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdCk7CisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBmb3MgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZGVzdC50b1BhdGgoKSk7CiAgICAgICAgIHN0b3JlKGZvcywgbnVsbCk7CiAgICAgICAgIGZvcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN0b3JlKGZpbmFsIE91dHB1dFN0cmVhbSBvdXQsIGZpbmFsIFN0cmluZyBoZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgUmVzb3VyY2VVdGlscy5JU09fODg1OV8xKTsKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEpOwogCiAgICAgICAgIGludCBza2lwTGluZXMgPSAwOwogICAgICAgICBmaW5hbCBpbnQgdG90YWxMaW5lcyA9IGxvZ2ljYWxMaW5lcy5zaXplKCk7CiAKICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBvc3cud3JpdGUoIiMiICsgaGVhZGVyICsgTFMpOworICAgICAgICAgICAgb3N3LndyaXRlKCIjIiArIGhlYWRlciArIGVvbCk7CiAgICAgICAgICAgICBpZiAodG90YWxMaW5lcyA+IDAKICAgICAgICAgICAgICAgICAmJiBsb2dpY2FsTGluZXMuZ2V0KDApIGluc3RhbmNlb2YgQ29tbWVudAogICAgICAgICAgICAgICAgICYmIGhlYWRlci5lcXVhbHMobG9naWNhbExpbmVzLmdldCgwKS50b1N0cmluZygpLnN1YnN0cmluZygxKSkpIHsKQEAgLTI4NiwyMiArMjg5LDIwIEBACiAgICAgICAgICAgICAgICAgLy8gbm90IGFuIGV4aXN0aW5nIGRhdGUgY29tbWVudAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG9zdy53cml0ZSgiIyIgKyBEYXRlVXRpbHMuZ2V0RGF0ZUZvckhlYWRlcigpICsgTFMpOworICAgICAgICBvc3cud3JpdGUoIiMiICsgRGF0ZVV0aWxzLmdldERhdGVGb3JIZWFkZXIoKSArIGVvbCk7CiAKICAgICAgICAgYm9vbGVhbiB3cml0dGVuU2VwID0gZmFsc2U7Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3IgaSA9IGxvZ2ljYWxMaW5lcy5zdWJMaXN0KHNraXBMaW5lcywgdG90YWxMaW5lcykuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIGZpbmFsIExvZ2ljYWxMaW5lIGxpbmUgPSAoTG9naWNhbExpbmUpIGkubmV4dCgpOworICAgICAgICBmb3IgKExvZ2ljYWxMaW5lIGxpbmUgOiBsb2dpY2FsTGluZXMuc3ViTGlzdChza2lwTGluZXMsIHRvdGFsTGluZXMpKSB7CiAgICAgICAgICAgICBpZiAobGluZSBpbnN0YW5jZW9mIFBhaXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoKChQYWlyKWxpbmUpLmlzTmV3KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKChQYWlyKSBsaW5lKS5pc05ldygpKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghd3JpdHRlblNlcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3N3LndyaXRlKExTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zdy53cml0ZShlb2wpOwogICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlblNlcCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3N3LndyaXRlKGxpbmUudG9TdHJpbmcoKSArIExTKTsKKyAgICAgICAgICAgICAgICBvc3cud3JpdGUobGluZS50b1N0cmluZygpICsgZW9sKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgb3N3LndyaXRlKGxpbmUudG9TdHJpbmcoKSArIExTKTsKKyAgICAgICAgICAgICAgICBvc3cud3JpdGUobGluZS50b1N0cmluZygpICsgZW9sKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBvc3cuY2xvc2UoKTsKQEAgLTMxNSwxMCArMzE2LDEwIEBACiAgICAgICogQHBhcmFtIGlzIHRoZSBzdHJlYW0gZnJvbSB3aGljaCB0byByZWFkIHRoZSBkYXRhCiAgICAgICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZExpbmVzKGZpbmFsIElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIFJlc291cmNlVXRpbHMuSVNPXzg4NTlfMSk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywgU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xKTsKICAgICAgICAgZmluYWwgUHVzaGJhY2tSZWFkZXIgcGJyID0gbmV3IFB1c2hiYWNrUmVhZGVyKGlzciwgMSk7CiAKLSAgICAgICAgaWYgKGxvZ2ljYWxMaW5lcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGlmICghbG9naWNhbExpbmVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgLy8gd2UgYWRkIGEgYmxhbmsgbGluZSBmb3Igc3BhY2luZwogICAgICAgICAgICAgbG9naWNhbExpbmVzLmFkZChuZXcgQmxhbmsoKSk7CiAgICAgICAgIH0KQEAgLTMyOCwxNyArMzI5LDE3IEBACiAKICAgICAgICAgYm9vbGVhbiBjb250aW51YXRpb24gPSBmYWxzZTsKICAgICAgICAgYm9vbGVhbiBjb21tZW50ID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBmaWxlQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgbG9naWNhbExpbmVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgZmlsZUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbG9naWNhbExpbmVCdWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICB3aGlsZSAocyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaWxlQnVmZmVyLmFwcGVuZChzKS5hcHBlbmQoTFMpOworICAgICAgICAgICAgZmlsZUJ1ZmZlci5hcHBlbmQocykuYXBwZW5kKGVvbCk7CiAKICAgICAgICAgICAgIGlmIChjb250aW51YXRpb24pIHsKICAgICAgICAgICAgICAgICAvLyBwdXQgaW4gdGhlIGxpbmUgZmVlZCB0aGF0IHdhcyByZW1vdmVkCiAgICAgICAgICAgICAgICAgcyA9ICJcbiIgKyBzOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBhIGNvbW1lbnQsIGlmIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGlzIGEgIyBvciAhCi0gICAgICAgICAgICAgICAgY29tbWVudCA9IHMubWF0Y2hlcygiXiggfFx0fFxmKSooI3whKS4qIik7CisgICAgICAgICAgICAgICAgY29tbWVudCA9IHMubWF0Y2hlcygiXlsgXHRcZl0qWyMhXS4qIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGNvbnRpbnVhdGlvbiBpZiBub3QgYSBjb21tZW50IGFuZCB0aGUgbGluZSBlbmRzIGlzIGFuCkBAIC0zNTAsMTAgKzM1MSwxMCBAQAogICAgICAgICAgICAgbG9naWNhbExpbmVCdWZmZXIuYXBwZW5kKHMpOwogCiAgICAgICAgICAgICBpZiAoIWNvbnRpbnVhdGlvbikgewotICAgICAgICAgICAgICAgIExvZ2ljYWxMaW5lIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIExvZ2ljYWxMaW5lIGxpbmU7CiAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5ldyBDb21tZW50KGxvZ2ljYWxMaW5lQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9naWNhbExpbmVCdWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9naWNhbExpbmVCdWZmZXIudG9TdHJpbmcoKS50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBuZXcgQmxhbmsoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBsaW5lID0gbmV3IFBhaXIobG9naWNhbExpbmVCdWZmZXIudG9TdHJpbmcoKSk7CkBAIC0zNjMsNyArMzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgb25lCiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmUoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBrZXllZFBhaXJMaW5lcy5wdXQoa2V5LCBJbnRlZ2VyLnZhbHVlT2YobG9naWNhbExpbmVzLnNpemUoKSkpOworICAgICAgICAgICAgICAgICAgICBrZXllZFBhaXJMaW5lcy5wdXQoa2V5LCBsb2dpY2FsTGluZXMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbG9naWNhbExpbmVzLmFkZChsaW5lKTsKICAgICAgICAgICAgICAgICBsb2dpY2FsTGluZUJ1ZmZlci5zZXRMZW5ndGgoMCk7CkBAIC0zODUsMTIgKzM4NiwxMiBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjIKICAgICAgKi8KICAgICBwcml2YXRlIFN0cmluZyByZWFkRmlyc3RMaW5lKGZpbmFsIFB1c2hiYWNrUmVhZGVyIHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoODApOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoODApOwogICAgICAgICBpbnQgY2ggPSByLnJlYWQoKTsKICAgICAgICAgYm9vbGVhbiBoYXNDUiA9IGZhbHNlOwogICAgICAgICAvLyB3aGVuIHJlYWNoaW5nIEVPRiBiZWZvcmUgdGhlIGZpcnN0IEVPTCwgYXNzdW1lIG5hdGl2ZSBsaW5lCiAgICAgICAgIC8vIGZlZWRzCi0gICAgICAgIExTID0gU3RyaW5nVXRpbHMuTElORV9TRVA7CisgICAgICAgIGVvbCA9IFN5c3RlbS5saW5lU2VwYXJhdG9yKCk7CiAKICAgICAgICAgd2hpbGUgKGNoID49IDApIHsKICAgICAgICAgICAgIGlmIChoYXNDUiAmJiBjaCAhPSAnXG4nKSB7CkBAIC00MDAsMTAgKzQwMSwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoY2ggPT0gJ1xyJykgewotICAgICAgICAgICAgICAgIExTID0gIlxyIjsKKyAgICAgICAgICAgICAgICBlb2wgPSAiXHIiOwogICAgICAgICAgICAgICAgIGhhc0NSID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIExTID0gaGFzQ1IgPyAiXHJcbiIgOiAiXG4iOworICAgICAgICAgICAgICAgIGVvbCA9IGhhc0NSID8gIlxyXG4iIDogIlxuIjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjaCk7CkBAIC00MzUsNyArNDM2LDcgQEAKICAgICAvKioKICAgICAgKiBVbmVzY2FwZSB0aGUgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgcnVsZXMgZm9yIGEgUHJvcGVydGllcwogICAgICAqIGZpbGUsIGFzIGxhaWQgb3V0IGluIHRoZSBkb2NzIGZvciA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXMuaHRtbCI+amF2YS51dGlsLlByb3BlcnRpZXM8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPi4KICAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIHVuZXNjYXBlIChjb21pbmcgZnJvbSB0aGUgc291cmNlIGZpbGUpCiAgICAgICogQHJldHVybiB0aGUgdW5lc2NhcGVkIHN0cmluZwogICAgICAqLwpAQCAtNDU1LDEzICs0NTYsMTQgQEAKICAgICAgICAgZmluYWwgY2hhcltdIGNoID0gbmV3IGNoYXJbcy5sZW5ndGgoKSArIDFdOwogICAgICAgICBzLmdldENoYXJzKDAsIHMubGVuZ3RoKCksIGNoLCAwKTsKICAgICAgICAgY2hbcy5sZW5ndGgoKV0gPSAnXG4nOwotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgYnVmZnkgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1ZmZ5ID0gbmV3IFN0cmluZ0J1aWxkZXIocy5sZW5ndGgoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2gubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgYyA9IGNoW2ldOwogICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJykgewogICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgaGl0IG91dCBlbmQtb2Ytc3RyaW5nIG1hcmtlcgogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdcXCcpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjID09ICdcXCcpIHsKICAgICAgICAgICAgICAgICAvLyBwb3NzaWJseSBhbiBlc2NhcGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgICBjID0gY2hbKytpXTsKICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnbicpIHsKQEAgLTUwMSw3ICs1MDMsNyBAQAogICAgIC8qKgogICAgICAqIEVzY2FwZSB0aGUgc3RyaW5nIDxjb2RlPnM8L2NvZGU+IGFjY29yZGluZyB0byB0aGUgcnVsZXMgaW4gdGhlCiAgICAgICogZG9jcyBmb3IgPGEKLSAgICAgKiBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS4zL2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPi4KKyAgICAgKiBocmVmPSJodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3V0aWwvUHJvcGVydGllcy5odG1sIj5qYXZhLnV0aWwuUHJvcGVydGllczwvYT4uCiAgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBlc2NhcGUKICAgICAgKiBAcmV0dXJuIHRoZSBlc2NhcGVkIHN0cmluZwogICAgICAqLwpAQCAtNTEyLDcgKzUxNCw3IEBACiAgICAgLyoqCiAgICAgICogRXNjYXBlIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiB0aGUKICAgICAgKiBkb2NzIGZvciA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXMuaHRtbCI+amF2YS51dGlsLlByb3BlcnRpZXM8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPi4KICAgICAgKiBUaGlzIG1ldGhvZCBlc2NhcGVzIGFsbCB0aGUgd2hpdGVzcGFjZSwgbm90IGp1c3QgdGhlIHN0dWZmIGF0CiAgICAgICogdGhlIGJlZ2lubmluZy4KICAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGVzY2FwZQpAQCAtNTI1LDcgKzUyNyw3IEBACiAgICAgLyoqCiAgICAgICogRXNjYXBlIHRoZSBzdHJpbmcgPGNvZGU+czwvY29kZT4gYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiB0aGUKICAgICAgKiBkb2NzIGZvciA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy9hcGkvamF2YS91dGlsL1Byb3BlcnRpZXMuaHRtbCI+amF2YS51dGlsLlByb3BlcnRpZXM8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpL2phdmEvdXRpbC9Qcm9wZXJ0aWVzLmh0bWwiPmphdmEudXRpbC5Qcm9wZXJ0aWVzPC9hPi4KICAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHRvIGVzY2FwZQogICAgICAqIEBwYXJhbSBlc2NhcGVBbGxTcGFjZXMgaWYgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG1ldGhvZCBlc2NhcGVzCiAgICAgICogYWxsIHRoZSBzcGFjZXMsIGlmIDxjb2RlPmZhbHNlPC9jb2RlPiwgaXQgZXNjYXBlcyBvbmx5IHRoZQpAQCAtNTQxLDcgKzU0Myw3IEBACiAgICAgICAgIHMuZ2V0Q2hhcnMoMCwgcy5sZW5ndGgoKSwgY2gsIDApOwogICAgICAgICBmaW5hbCBTdHJpbmcgZm9yRXNjYXBpbmcgPSAiXHRcZlxyXG5cXDo9IyEiOwogICAgICAgICBmaW5hbCBTdHJpbmcgZXNjYXBlZCA9ICJ0ZnJuXFw6PSMhIjsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZ5ID0gbmV3IFN0cmluZ0J1ZmZlcihzLmxlbmd0aCgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWZmeSA9IG5ldyBTdHJpbmdCdWlsZGVyKHMubGVuZ3RoKCkpOwogICAgICAgICBib29sZWFuIGxlYWRpbmdTcGFjZSA9IHRydWU7CiAgICAgICAgIGZvciAoZmluYWwgY2hhciBjIDogY2gpIHsKICAgICAgICAgICAgIGlmIChjID09ICcgJykgewpAQCAtNTUzLDcgKzU1NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmaW5hbCBpbnQgcCA9IGZvckVzY2FwaW5nLmluZGV4T2YoYyk7CiAgICAgICAgICAgICBpZiAocCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGJ1ZmZ5LmFwcGVuZCgiXFwiKS5hcHBlbmQoZXNjYXBlZC5zdWJzdHJpbmcocCwgcCArIDEpKTsKKyAgICAgICAgICAgICAgICBidWZmeS5hcHBlbmQoIlxcIikuYXBwZW5kKGVzY2FwZWQsIHAsIHAgKyAxKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4MDAyMCB8fCBjID4gMHgwMDdlKSB7CiAgICAgICAgICAgICAgICAgYnVmZnkuYXBwZW5kKGVzY2FwZVVuaWNvZGUoYykpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTU3MSw3ICs1NzMsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZVVuaWNvZGUoZmluYWwgY2hhciBjaCkgewogICAgICAgICByZXR1cm4gIlxcIiArIFVuaWNvZGVVdGlsLkVzY2FwZVVuaWNvZGUoY2gpOwotICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlIHRoZSBjb21tZW50cyBpbiB0aGUgbGVhZGluZyB1cCB0aGUge0BsaW5rICNsb2dpY2FsTGluZXN9CkBAIC02MTgsNyArNjIwLDkgQEAKICAgICAvKioKICAgICAgKiBBIGxvZ2ljYWwgbGluZSBvZiB0aGUgcHJvcGVydGllcyBpbnB1dCBzdHJlYW0uCiAgICAgICovCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgTG9naWNhbExpbmUgeworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIExvZ2ljYWxMaW5lIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKIAogICAgICAgICBwdWJsaWMgTG9naWNhbExpbmUoZmluYWwgU3RyaW5nIHRleHQpIHsKQEAgLTYzOSw2ICs2NDMsOCBAQAogICAgICAqIEEgYmxhbmsgbGluZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJsYW5rIGV4dGVuZHMgTG9naWNhbExpbmUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwogICAgICAgICBwdWJsaWMgQmxhbmsoKSB7CiAgICAgICAgICAgICBzdXBlcigiIik7CiAgICAgICAgIH0KQEAgLTY0OCw2ICs2NTQsOCBAQAogICAgICAqIEEgY29tbWVudCBsaW5lIG9mIHRoZSBpbnB1dCBzdHJlYW0uCiAgICAgICovCiAgICAgcHJpdmF0ZSBjbGFzcyBDb21tZW50IGV4dGVuZHMgTG9naWNhbExpbmUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwogICAgICAgICBwdWJsaWMgQ29tbWVudChmaW5hbCBTdHJpbmcgdGV4dCkgewogICAgICAgICAgICAgc3VwZXIodGV4dCk7CiAgICAgICAgIH0KQEAgLTY1OSw2ICs2NjcsOCBAQAogICAgICAqIGxpbmUuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFpciBleHRlbmRzIExvZ2ljYWxMaW5lIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhZGRlZDsKQEAgLTY3Niw2ICs2ODYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgIH0KIAorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgfQpAQCAtNzExLDEwICs3MjIsMTAgQEAKICAgICAgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAvLyB0cmltIGxlYWRpbmcgd2hpdGVzcGFjZSBvbmx5CiAgICAgICAgICAgICAgICAgbmFtZSA9IHRleHQ7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgICAgIHNldFZhbHVlKG51bGwpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuYW1lID0gdGV4dC5zdWJzdHJpbmcoMCwgcG9zKTsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHRleHQuc3Vic3RyaW5nKHBvcyArIDEsIHRleHQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHNldFZhbHVlKHRleHQuc3Vic3RyaW5nKHBvcyArIDEpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlIG9ubHkKICAgICAgICAgICAgIG5hbWUgPSBzdHJpcFN0YXJ0KG5hbWUsICIgXHRcZiIpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDdlNWJmNzguLjEyN2RkNGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUZpbGVPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xhenlGaWxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw5ICsxOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiAKIC8qKgogICogQ2xhc3MgdGhhdCBkZWxheXMgb3BlbmluZyB0aGUgb3V0cHV0IGZpbGUgdW50aWwgdGhlIGZpcnN0IGJ5dGVzCkBAIC0zMSw3ICszMSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMYXp5RmlsZU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAKLSAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gZm9zOworICAgIHByaXZhdGUgT3V0cHV0U3RyZWFtIGZvczsKICAgICBwcml2YXRlIEZpbGUgZmlsZTsKICAgICBwcml2YXRlIGJvb2xlYW4gYXBwZW5kOwogICAgIHByaXZhdGUgYm9vbGVhbiBhbHdheXNDcmVhdGU7CkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgKiBDbG9zZSB0aGUgZmlsZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChhbHdheXNDcmVhdGUgJiYgIWNsb3NlZCkgewogICAgICAgICAgICAgZW5zdXJlT3BlbmVkKCk7CkBAIC0xMjIsNiArMTIzLDcgQEAKICAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZWFycmF5IHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CiAgICAgfQpAQCAtMTMzLDYgKzEzNSw3IEBACiAgICAgICogQHBhcmFtIGxlbiAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbikKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgZW5zdXJlT3BlbmVkKCk7CkBAIC0xNDQsNiArMTQ3LDcgQEAKICAgICAgKiBAcGFyYW0gYiB0aGUgYnl0ZSB0byB3cml0ZS4KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGVuc3VyZU9wZW5lZCgpOwogICAgICAgICBmb3Mud3JpdGUoYik7CkBAIC0xNTUsNyArMTU5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghb3BlbmVkKSB7Ci0gICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpLCBhcHBlbmQpOworICAgICAgICAgICAgZm9zID0gRmlsZVV0aWxzLm5ld091dHB1dFN0cmVhbShmaWxlLnRvUGF0aCgpLCBhcHBlbmQpOwogICAgICAgICAgICAgb3BlbmVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUhhc2h0YWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5SGFzaHRhYmxlLmphdmEKaW5kZXggMWRmOTUzYy4uYmM0OGNhNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5SGFzaHRhYmxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5SGFzaHRhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCw3ICsyOCw4IEBACiAgKgogICogQHNpbmNlIEFudCAxLjYKICAqLwotcHVibGljIGNsYXNzIExhenlIYXNodGFibGUgZXh0ZW5kcyBIYXNodGFibGUgeworQERlcHJlY2F0ZWQKK3B1YmxpYyBjbGFzcyBMYXp5SGFzaHRhYmxlPEssIFY+IGV4dGVuZHMgSGFzaHRhYmxlPEssIFY+IHsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPRkYgLSBiYwogICAgIHByb3RlY3RlZCBib29sZWFuIGluaXRBbGxEb25lID0gZmFsc2U7CiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKQEAgLTU0LDcgKzU1LDcgQEAKICAgICAgKiBHZXQgYSBlbnVtZXJhdGlvbiBvdmVyIHRoZSBlbGVtZW50cy4KICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uLgogICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKKyAgICBwdWJsaWMgRW51bWVyYXRpb248Vj4gZWxlbWVudHMoKSB7CiAgICAgICAgIGluaXRBbGwoKTsKICAgICAgICAgcmV0dXJuIHN1cGVyLmVsZW1lbnRzKCk7CiAgICAgfQpAQCAtMTEwLDcgKzExMSw3IEBACiAgICAgICogR2V0IGFuIGVudW1lcmF0aW9uIG92ZXIgdGhlIGtleXMuCiAgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgRW51bWVyYXRpb24ga2V5cygpIHsKKyAgICBwdWJsaWMgRW51bWVyYXRpb248Sz4ga2V5cygpIHsKICAgICAgICAgaW5pdEFsbCgpOwogICAgICAgICByZXR1cm4gc3VwZXIua2V5cygpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGVhZFBpcGVJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MZWFkUGlwZUlucHV0U3RyZWFtLmphdmEKaW5kZXggMDA4MTkxMi4uMTNkZDNhYSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MZWFkUGlwZUlucHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MZWFkUGlwZUlucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04MSw2ICs4MSw3IEBACiAgICAgICogQHJldHVybiB0aGUgYnl0ZSAoMCB0byAyNTUpIG9yIC0xIGlmIHRoZXJlIGFyZSBubyBtb3JlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCByZXN1bHQgPSAtMTsKICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmVPcmllbnRlZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDA3M2E4OWYuLmU3YzllOWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTUzLDcgKzUzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShpbnQgY2MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIGJ5dGUgYyA9IChieXRlKSBjYzsKLSAgICAgICAgaWYgKChjID09IExGKSB8fCAoYyA9PSBDUikpIHsKKyAgICAgICAgaWYgKGMgPT0gTEYgfHwgYyA9PSBDUikgewogICAgICAgICAgICAgaWYgKCFza2lwKSB7CiAgICAgICAgICAgICAgIHByb2Nlc3NCdWZmZXIoKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtUmVkaXJlY3Rvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1SZWRpcmVjdG9yLmphdmEKaW5kZXggNDhiYWQ1Yy4uOGQ4NjcxOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1SZWRpcmVjdG9yLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1SZWRpcmVjdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNCwxMSArMzQsNiBAQAogCiAgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gc3RyZWFtOwogCi0gICAgLy8gdGhlc2Ugc2hvdWxkIGJlIGluIHRoZSBBU0NJSSByYW5nZSBhbmQgaG9wZWZ1bGx5IGFyZSBzaW5nbGUgYnl0ZXMKLSAgICAvLyAoZm9yIExGIGFuZCBDUiByZXNwZWN0aXZlbHkpIGZvciBhbnkgZW5jb2RpbmcgdGhyb3duIGF0IHRoaXMgY2xhc3MKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gRU9MID0KLSAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpLmdldEJ5dGVzKCk7Ci0KICAgICBwdWJsaWMgTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtUmVkaXJlY3RvcihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7CiAgICAgICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtOwogICAgIH0KQEAgLTQ2LDEyICs0MSwxMiBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NMaW5lKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzdHJlYW0ud3JpdGUoYik7Ci0gICAgICAgIHN0cmVhbS53cml0ZShFT0wpOworICAgICAgICBzdHJlYW0ud3JpdGUoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKS5nZXRCeXRlcygpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzTGluZShTdHJpbmcgbGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgc3RyZWFtLndyaXRlKChsaW5lICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKS5nZXRCeXRlcygpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlKFN0cmluZy5mb3JtYXQoIiVzJW4iLCBsaW5lKS5nZXRCeXRlcygpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZVRva2VuaXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lVG9rZW5pemVyLmphdmEKaW5kZXggNzc4NjA2ZC4uZDZiMWY2MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lVG9rZW5pemVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lVG9rZW5pemVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC01NCwxOSArNTQsMTkgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyByZWFkaW5nCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRUb2tlbihSZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBjaCA9IC0xOwotICAgICAgICBpZiAocHVzaGVkICE9IE5PVF9BX0NIQVIpIHsKKyAgICAgICAgaW50IGNoOworICAgICAgICBpZiAocHVzaGVkID09IE5PVF9BX0NIQVIpIHsKKyAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2ggPSBwdXNoZWQ7CiAgICAgICAgICAgICBwdXNoZWQgPSBOT1RfQV9DSEFSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2ggPSBpbi5yZWFkKCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNoID09IC0xKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCiAgICAgICAgIGxpbmVFbmQgPSAiIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGxpbmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbGluZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKICAgICAgICAgaW50IHN0YXRlID0gMDsKICAgICAgICAgd2hpbGUgKGNoICE9IC0xKSB7CkBAIC0xMDQsMTEgKzEwNCw5IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiB0aGUgbGluZSBlbmRpbmcgY2hhcmFjdGVyKHMpIGZvciB0aGUgY3VycmVudCBsaW5lCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0VG9rZW4oKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlRGVsaW1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGxpbmVFbmQ7CisgICAgICAgIHJldHVybiBpbmNsdWRlRGVsaW1zID8gIiIgOiBsaW5lRW5kOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5rZWRIYXNodGFibGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGlua2VkSGFzaHRhYmxlLmphdmEKaW5kZXggNzNmYzgzYy4uOThkMGM4NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5rZWRIYXNodGFibGUuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmtlZEhhc2h0YWJsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwpAQCAtNDMsODkgKzQ0LDEwNiBAQAogICAgIHByaXZhdGUgZmluYWwgTGlua2VkSGFzaE1hcDxLLCBWPiBtYXA7CiAKICAgICBwdWJsaWMgTGlua2VkSGFzaHRhYmxlKCkgewotICAgICAgICBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPigpOworICAgICAgICBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgfQogCiAgICAgcHVibGljIExpbmtlZEhhc2h0YWJsZShpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICAgIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KGluaXRpYWxDYXBhY2l0eSk7CisgICAgICAgIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oaW5pdGlhbENhcGFjaXR5KTsKICAgICB9CiAKICAgICBwdWJsaWMgTGlua2VkSGFzaHRhYmxlKGludCBpbml0aWFsQ2FwYWNpdHksIGZsb2F0IGxvYWRGYWN0b3IpIHsKLSAgICAgICAgbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8SywgVj4oaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yKTsKKyAgICAgICAgbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8Pihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBMaW5rZWRIYXNodGFibGUoTWFwPEssIFY+IG0pIHsKLSAgICAgICAgbWFwID0gbmV3IExpbmtlZEhhc2hNYXA8SywgVj4obSk7CisgICAgICAgIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4obSk7CiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewogICAgICAgICBtYXAuY2xlYXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgdmFsdWUpIHsKICAgICAgICAgcmV0dXJuIGNvbnRhaW5zS2V5KHZhbHVlKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkodmFsdWUpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgewogICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zVmFsdWUodmFsdWUpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxWPiBlbGVtZW50cygpIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25VdGlscy5hc0VudW1lcmF0aW9uKHZhbHVlcygpLml0ZXJhdG9yKCkpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24odmFsdWVzKCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAuZW50cnlTZXQoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAgICAgICAgIHJldHVybiBtYXAuZXF1YWxzKG8pOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgViBnZXQoT2JqZWN0IGspIHsKICAgICAgICAgcmV0dXJuIG1hcC5nZXQoayk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgaGFzaENvZGUoKSB7CiAgICAgICAgIHJldHVybiBtYXAuaGFzaENvZGUoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKICAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEs+IGtleXMoKSB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9uVXRpbHMuYXNFbnVtZXJhdGlvbihrZXlTZXQoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKGtleVNldCgpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFNldDxLPiBrZXlTZXQoKSB7CiAgICAgICAgIHJldHVybiBtYXAua2V5U2V0KCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBWIHB1dChLIGssIFYgdikgewogICAgICAgICByZXR1cm4gbWFwLnB1dChrLCB2KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0pIHsKICAgICAgICAgbWFwLnB1dEFsbChtKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIFYgcmVtb3ZlKE9iamVjdCBrKSB7CiAgICAgICAgIHJldHVybiBtYXAucmVtb3ZlKGspOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtYXAuc2l6ZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbWFwLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKICAgICAgICAgcmV0dXJuIG1hcC52YWx1ZXMoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xvYWRlclV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xvYWRlclV0aWxzLmphdmEKaW5kZXggZTA1MTRmNi4uYWZmYTcxMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Mb2FkZXJVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTk0LDcgKzk0LDcgQEAKICAgICAgKgogICAgICAqIEBzaW5jZSBBbnQgMS42CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlIGdldENsYXNzU291cmNlKENsYXNzIGMpIHsKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0Q2xhc3NTb3VyY2UoQ2xhc3M8Pz4gYykgewogICAgICAgICByZXR1cm4gbm9ybWFsaXplU291cmNlKExvY2F0b3IuZ2V0Q2xhc3NTb3VyY2UoYykpOwogICAgIH0KIApAQCAtMTMwLDcgKzEzMCw3IEBACiAgICAgICogQ2hlY2sgaWYgYSBjbGFzc2xvYWRlciBoYXMgYSBjbGFzc25hbWUgcmVzb3VyY2UuCiAgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3Nsb2FkZXIgdG8gbG9vayBpdC4KICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsYXNzZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGNsYXNzIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlCiAgICAgICogQHNpbmNlIEFudCAxLjcuMC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NFeGlzdHMoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL01lcmdpbmdNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCmluZGV4IGQ2MWFlMzAuLmIxM2JkMTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTWVyZ2luZ01hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDYsNiArNDYsNyBAQAogICAgICAqIElnbm9yZWQuCiAgICAgICogQHBhcmFtIGZyb20gaWdub3JlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRGcm9tKFN0cmluZyBmcm9tKSB7CiAgICAgfQogCkBAIC01Myw2ICs1NCw3IEBACiAgICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgbWVyZ2VkIGZpbGUuCiAgICAgICogQHBhcmFtIHRvIHRoZSBuYW1lIG9mIHRoZSBtZXJnZWQgZmlsZS4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRUbyhTdHJpbmcgdG8pIHsKICAgICAgICAgbWVyZ2VkRmlsZSA9IG5ldyBTdHJpbmdbXSB7dG99OwogICAgIH0KQEAgLTYyLDYgKzY0LDcgQEAKICAgICAgKiBAcGFyYW0gc291cmNlRmlsZU5hbWUgaWdub3JlZC4KICAgICAgKiBAcmV0dXJuIGEgb25lLWVsZW1lbnQgYXJyYXkgY29udGFpbmluZyB0aGUgbWVyZ2VkIGZpbGVuYW1lLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKICAgICAgICAgcmV0dXJuIG1lcmdlZEZpbGU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9OYXRpdmUyQXNjaWlVdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9OYXRpdmUyQXNjaWlVdGlscy5qYXZhCmluZGV4IGE2OWQwMzEuLjBjNWY5MGEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTmF0aXZlMkFzY2lpVXRpbHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL05hdGl2ZTJBc2NpaVV0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOCwxMiArMzgsNyBAQAogICAgICAgICAgICAgaWYgKGMgPD0gTUFYX0FTQ0lJKSB7CiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIlxcdSIpOwotICAgICAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkID0gSW50ZWdlci50b0hleFN0cmluZyhjKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gZW5jb2RlZC5sZW5ndGgoKTsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIjAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGVuY29kZWQpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcXHUlMDR4IiwgKGludCkgYykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9PdXRwdXRTdHJlYW1GdW5uZWxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9PdXRwdXRTdHJlYW1GdW5uZWxlci5qYXZhCmluZGV4IDliNGNlZjMuLjc2MTM0YzggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvT3V0cHV0U3RyZWFtRnVubmVsZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL091dHB1dFN0cmVhbUZ1bm5lbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgc3luY2hyb25pemVkIChPdXRwdXRTdHJlYW1GdW5uZWxlci50aGlzKSB7CiAgICAgICAgICAgICAgICAgZGllSWZDbG9zZWQoKTsKQEAgLTUxLDYgKzUyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoT3V0cHV0U3RyZWFtRnVubmVsZXIudGhpcykgewogICAgICAgICAgICAgICAgIGRpZUlmQ2xvc2VkKCk7CkBAIC01OCw2ICs2MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKE91dHB1dFN0cmVhbUZ1bm5lbGVyLnRoaXMpIHsKICAgICAgICAgICAgICAgICBkaWVJZkNsb3NlZCgpOwpAQCAtNjUsNiArNjgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAgICAgc3luY2hyb25pemVkIChPdXRwdXRTdHJlYW1GdW5uZWxlci50aGlzKSB7CiAgICAgICAgICAgICAgICAgZGllSWZDbG9zZWQoKTsKQEAgLTcyLDYgKzc2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICByZWxlYXNlKHRoaXMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyLmphdmEKaW5kZXggMzAyNTY2Ny4uOWI1OTkzYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGFja2FnZU5hbWVNYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgKkBwYXJhbSAgbmFtZSAgU291cmNlIGZpbGVuYW1lCiAgICAgICpAcmV0dXJuICAgICAgIFJlcGxhY2VkIHZhcmlhYmxlIHBhcnQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4dHJhY3RWYXJpYWJsZVBhcnQoU3RyaW5nIG5hbWUpIHsKICAgICAgICAgU3RyaW5nIHZhciA9IG5hbWUuc3Vic3RyaW5nKHByZWZpeExlbmd0aCwKICAgICAgICAgICAgICAgICBuYW1lLmxlbmd0aCgpIC0gcG9zdGZpeExlbmd0aCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Blcm1pc3Npb25VdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QZXJtaXNzaW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTUwMjE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QZXJtaXNzaW9uVXRpbHMuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVBdHRyaWJ1dGVWaWV3OworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlBvc2l4RmlsZVBlcm1pc3Npb247CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLkFyY2hpdmVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVByb3ZpZGVyOworCisvKioKKyAqIENvbnRhaW5zIGhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGgge0BsaW5rCisgKiBQb3NpeEZpbGVQZXJtaXNzaW9ufSBvciB0aGUgdHJhZGl0aW9uYWwgVW5peCBtb2RlIHJlcHJlc2VudGF0aW9uIG9mCisgKiBwZXJtaXNzaW9ucy4KKyAqCisgKiBAc2luY2UgQW50IDEuMTAuMAorICovCitwdWJsaWMgY2xhc3MgUGVybWlzc2lvblV0aWxzIHsKKworICAgIHByaXZhdGUgUGVybWlzc2lvblV0aWxzKCkgeyB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGVzIGEgc2V0IG9mIHBlcm1pc3Npb25zIGludG8gYSBVbml4IHN0YXQoMikge0Bjb2RlCisgICAgICogc3RfbW9kZX0gcmVzdWx0LgorICAgICAqIEBwYXJhbSBwZXJtaXNzaW9ucyB0aGUgcGVybWlzc2lvbnMKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgZmlsZSB0eXBlCisgICAgICogQHJldHVybiB0aGUgIm1vZGUiCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgbW9kZUZyb21QZXJtaXNzaW9ucyhTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVHlwZSB0eXBlKSB7CisgICAgICAgIGludCBtb2RlOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTWU1MSU5LOgorICAgICAgICAgICAgbW9kZSA9IDAxMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFR1VMQVJfRklMRToKKyAgICAgICAgICAgIG1vZGUgPSAwMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESVI6CisgICAgICAgICAgICBtb2RlID0gMDA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBPVEhFUiBjb3VsZCBiZSBhIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2UsIGEgc29ja2V0IG9yIGEgRklGTyAtIHNvIGRvbid0IHNldCBhbnl0aGluZworICAgICAgICAgICAgbW9kZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtb2RlIDw8PSAzOworICAgICAgICBtb2RlIDw8PSAzOyAvLyB3ZSBkb24ndCBzdXBwb3J0IHN0aWNreSwgc2V0dWlkLCBzZXRnaWQKKyAgICAgICAgbW9kZSB8PSBtb2RlRnJvbVBlcm1pc3Npb25zKHBlcm1pc3Npb25zLCAiT1dORVIiKTsKKyAgICAgICAgbW9kZSA8PD0gMzsKKyAgICAgICAgbW9kZSB8PSBtb2RlRnJvbVBlcm1pc3Npb25zKHBlcm1pc3Npb25zLCAiR1JPVVAiKTsKKyAgICAgICAgbW9kZSA8PD0gMzsKKyAgICAgICAgbW9kZSB8PSBtb2RlRnJvbVBlcm1pc3Npb25zKHBlcm1pc3Npb25zLCAiT1RIRVJTIik7CisgICAgICAgIHJldHVybiBtb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zbGF0ZXMgYSBVbml4IHN0YXQoMikge0Bjb2RlIHN0X21vZGV9IGNvbXBhdGlibGUgdmFsdWUgaW50bworICAgICAqIGEgc2V0IG9mIHBlcm1pc3Npb25zLgorICAgICAqIEBwYXJhbSBtb2RlIHRoZSAibW9kZSIKKyAgICAgKiBAcmV0dXJuIHNldCBvZiBwZXJtaXNzaW9ucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PFBvc2l4RmlsZVBlcm1pc3Npb24+IHBlcm1pc3Npb25zRnJvbU1vZGUoaW50IG1vZGUpIHsKKyAgICAgICAgU2V0PFBvc2l4RmlsZVBlcm1pc3Npb24+IHBlcm1pc3Npb25zID0gRW51bVNldC5ub25lT2YoUG9zaXhGaWxlUGVybWlzc2lvbi5jbGFzcyk7CisgICAgICAgIGFkZFBlcm1pc3Npb25zKHBlcm1pc3Npb25zLCAiT1RIRVJTIiwgbW9kZSk7CisgICAgICAgIGFkZFBlcm1pc3Npb25zKHBlcm1pc3Npb25zLCAiR1JPVVAiLCBtb2RlID4+IDMpOworICAgICAgICBhZGRQZXJtaXNzaW9ucyhwZXJtaXNzaW9ucywgIk9XTkVSIiwgbW9kZSA+PiA2KTsKKyAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgcGVybWlzc2lvbnMgb24gYSB7QGxpbmsgUmVzb3VyY2V9IC0gZG9lc24ndCBkbyBhbnl0aGluZworICAgICAqIGZvciB1bnN1cHBvcnRlZCByZXNvdXJjZSB0eXBlcy4KKyAgICAgKgorICAgICAqIDxwPlN1cHBvcnRlZCB0eXBlcyBhcmU6PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiAgPGxpPmFueSB7QGxpbmsgRmlsZVByb3ZpZGVyfTwvbGk+CisgICAgICogIDxsaT57QGxpbmsgQXJjaGl2ZVJlc291cmNlfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByIHRoZSByZXNvdXJjZSB0byBzZXQgcGVybWlzc2lvbnMgZm9yCisgICAgICogQHBhcmFtIHBlcm1pc3Npb25zIHRoZSBwZXJtaXNzaW9ucworICAgICAqIEBwYXJhbSBwb3NpeE5vdFN1cHBvcnRlZENhbGxiYWNrIG9wdGlvbmFsIGNhbGxiYWNrIHRoYXQgaXMKKyAgICAgKiBpbnZva2VkIGZvciBhIGZpbGUgcHJvdmlkZXIgcmVzb3VyY2UgaWYgdGhlIGZpbGUtc3lzdGVtIGhvbGRpbmcKKyAgICAgKiB0aGUgZmlsZSBkb2Vzbid0IHN1cHBvcnQgUG9zaXhGaWxlUGVybWlzc2lvbnMuIFRoZSBQYXRoCisgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZSBpcyBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGVybWlzc2lvbnMoUmVzb3VyY2UgciwgU2V0PFBvc2l4RmlsZVBlcm1pc3Npb24+IHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lcjxQYXRoPiBwb3NpeE5vdFN1cHBvcnRlZENhbGxiYWNrKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlUHJvdmlkZXIgZiA9IHIuYXMoRmlsZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgaWYgKGYgIT0gbnVsbCkgeworICAgICAgICAgICAgUGF0aCBwID0gZi5nZXRGaWxlKCkudG9QYXRoKCk7CisgICAgICAgICAgICBQb3NpeEZpbGVBdHRyaWJ1dGVWaWV3IHZpZXcgPQorICAgICAgICAgICAgICAgIEZpbGVzLmdldEZpbGVBdHRyaWJ1dGVWaWV3KHAsIFBvc2l4RmlsZUF0dHJpYnV0ZVZpZXcuY2xhc3MpOworICAgICAgICAgICAgaWYgKHZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZpZXcuc2V0UGVybWlzc2lvbnMocGVybWlzc2lvbnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpeE5vdFN1cHBvcnRlZENhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwb3NpeE5vdFN1cHBvcnRlZENhbGxiYWNrLmFjY2VwdChwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgQXJjaGl2ZVJlc291cmNlKSB7CisgICAgICAgICAgICAoKEFyY2hpdmVSZXNvdXJjZSkgcikuc2V0TW9kZShtb2RlRnJvbVBlcm1pc3Npb25zKHBlcm1pc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVHlwZS5vZihyKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBwZXJtaXNzaW9ucyBvZiBhIHtAbGluayBSZXNvdXJjZX0gLSByZXR1cm5zIGFuIGVtcHR5IHNldAorICAgICAqIGZvciB1bnN1cHBvcnRlZCByZXNvdXJjZSB0eXBlcyBvciBmaWxlIHN5c3RlbXMgdGhhdCBkb24ndAorICAgICAqIHN1cHBvcnQgUG9zaXhGaWxlUGVybWlzc2lvbnMgYW5kIG5vIGZhbGxiYWNrIGhhcyBiZWVuCisgICAgICogcHJvdmlkZWQuLgorICAgICAqCisgICAgICogPHA+U3VwcG9ydGVkIHR5cGVzIGFyZTo8L3A+CisgICAgICogPHVsPgorICAgICAqICA8bGk+YW55IHtAbGluayBGaWxlUHJvdmlkZXJ9PC9saT4KKyAgICAgKiAgPGxpPntAbGluayBBcmNoaXZlUmVzb3VyY2V9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIHIgdGhlIHJlc291cmNlIHRvIHJlYWQgcGVybWlzc2lvbnMgZnJvbQorICAgICAqIEBwYXJhbSBwb3NpeE5vdFN1cHBvcnRlZEZhbGxiYWNrIG9wdGlvbmFsIGZhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb3ZpZGUKKyAgICAgKiBwZXJtaXNzaW9ucyBmb3IgZmlsZSBzeXN0ZW0gdGhhdCBkb24ndCBzdXBwb3J0CisgICAgICogUG9zaXhGaWxlUGVybWlzc2lvbnMuIFRoZSBQYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGUgaXMKKyAgICAgKiBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm4gdGhlIHBlcm1pc3Npb25zCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PFBvc2l4RmlsZVBlcm1pc3Npb24+IGdldFBlcm1pc3Npb25zKFJlc291cmNlIHIsCisgICAgICAgICAgICBGdW5jdGlvbjxQYXRoLCBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4+IHBvc2l4Tm90U3VwcG9ydGVkRmFsbGJhY2spCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVQcm92aWRlciBmID0gci5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBpZiAoZiAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXRoIHAgPSBmLmdldEZpbGUoKS50b1BhdGgoKTsKKyAgICAgICAgICAgIFBvc2l4RmlsZUF0dHJpYnV0ZVZpZXcgdmlldyA9CisgICAgICAgICAgICAgICAgRmlsZXMuZ2V0RmlsZUF0dHJpYnV0ZVZpZXcocCwgUG9zaXhGaWxlQXR0cmlidXRlVmlldy5jbGFzcyk7CisgICAgICAgICAgICBpZiAodmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcucmVhZEF0dHJpYnV0ZXMoKS5wZXJtaXNzaW9ucygpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpeE5vdFN1cHBvcnRlZEZhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXhOb3RTdXBwb3J0ZWRGYWxsYmFjay5hcHBseShwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgQXJjaGl2ZVJlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gcGVybWlzc2lvbnNGcm9tTW9kZSgoKEFyY2hpdmVSZXNvdXJjZSkgcikuZ2V0TW9kZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRW51bVNldC5ub25lT2YoUG9zaXhGaWxlUGVybWlzc2lvbi5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtb2RlRnJvbVBlcm1pc3Npb25zKFNldDxQb3NpeEZpbGVQZXJtaXNzaW9uPiBwZXJtaXNzaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCkgeworICAgICAgICBsb25nIG1vZGUgPSAwOworICAgICAgICBpZiAocGVybWlzc2lvbnMuY29udGFpbnMoUG9zaXhGaWxlUGVybWlzc2lvbi52YWx1ZU9mKHByZWZpeCArICJfUkVBRCIpKSkgeworICAgICAgICAgICAgbW9kZSB8PSA0OworICAgICAgICB9CisgICAgICAgIGlmIChwZXJtaXNzaW9ucy5jb250YWlucyhQb3NpeEZpbGVQZXJtaXNzaW9uLnZhbHVlT2YocHJlZml4ICsgIl9XUklURSIpKSkgeworICAgICAgICAgICAgbW9kZSB8PSAyOworICAgICAgICB9CisgICAgICAgIGlmIChwZXJtaXNzaW9ucy5jb250YWlucyhQb3NpeEZpbGVQZXJtaXNzaW9uLnZhbHVlT2YocHJlZml4ICsgIl9FWEVDVVRFIikpKSB7CisgICAgICAgICAgICBtb2RlIHw9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRQZXJtaXNzaW9ucyhTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4LCBsb25nIG1vZGUpIHsKKyAgICAgICAgaWYgKChtb2RlICYgMSkgPT0gMSkgeworICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKFBvc2l4RmlsZVBlcm1pc3Npb24udmFsdWVPZihwcmVmaXggKyAiX0VYRUNVVEUiKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtb2RlICYgMikgPT0gMikgeworICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKFBvc2l4RmlsZVBlcm1pc3Npb24udmFsdWVPZihwcmVmaXggKyAiX1dSSVRFIikpOworICAgICAgICB9CisgICAgICAgIGlmICgobW9kZSAmIDQpID09IDQpIHsKKyAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZChQb3NpeEZpbGVQZXJtaXNzaW9uLnZhbHVlT2YocHJlZml4ICsgIl9SRUFEIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBmaWxlcywgbWFwcyB0byB0aGUge0Bjb2RlIGlzRm9vfSBtZXRob2RzCisgICAgICogaW4ge0BsaW5rIGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXN9LgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIEZpbGVUeXBlIHsKKyAgICAgICAgLyoqIEEgcmVndWxhciBmaWxlLiAqLworICAgICAgICBSRUdVTEFSX0ZJTEUsCisgICAgICAgIC8qKiBBIGRpcmVjdG9yeS4gKi8KKyAgICAgICAgRElSLAorICAgICAgICAvKiogQSBzeW1ib2xpYyBsaW5rLiAqLworICAgICAgICBTWU1MSU5LLAorICAgICAgICAvKiogU29tZXRoaW5nIHRoYXQgaXMgbmVpdGhlciBhIHJlZ3VsYXIgZmlsZSBub3IgYSBkaXJlY3Rvcnkgbm9yIGEgc3ltYm9saWMgbGluay4gKi8KKyAgICAgICAgT1RIRVI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGVybWluZXMgdGhlIGZpbGUgdHlwZSBvZiBhIHtAbGluayBQYXRofS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHAgUGF0aAorICAgICAgICAgKiBAcmV0dXJuIEZpbGVUeXBlCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZmlsZSBhdHRyaWJ1dGVzIGNhbm5vdCBiZSByZWFkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGVUeXBlIG9mKFBhdGggcCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEJhc2ljRmlsZUF0dHJpYnV0ZXMgYXR0cnMgPQorICAgICAgICAgICAgICAgIEZpbGVzLnJlYWRBdHRyaWJ1dGVzKHAsIEJhc2ljRmlsZUF0dHJpYnV0ZXMuY2xhc3MpOworICAgICAgICAgICAgaWYgKGF0dHJzLmlzUmVndWxhckZpbGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVHlwZS5SRUdVTEFSX0ZJTEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF0dHJzLmlzRGlyZWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVR5cGUuRElSOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRycy5pc1N5bWJvbGljTGluaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVUeXBlLlNZTUxJTks7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRmlsZVR5cGUuT1RIRVI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGV0ZXJtaW5lcyB0aGUgZmlsZSB0eXBlIG9mIGEge0BsaW5rIFJlc291cmNlfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHIgUmVzb3VyY2UKKyAgICAgICAgICogQHJldHVybiBGaWxlVHlwZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBGaWxlVHlwZSBvZihSZXNvdXJjZSByKSB7CisgICAgICAgICAgICBpZiAoci5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVUeXBlLkRJUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBGaWxlVHlwZS5SRUdVTEFSX0ZJTEU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Byb2Nlc3NVdGlsLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Byb2Nlc3NVdGlsLmphdmEKaW5kZXggNTgwODZmMy4uNWVjYzhhOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm9jZXNzVXRpbC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJvY2Vzc1V0aWwuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJvcGVydHlPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJvcGVydHlPdXRwdXRTdHJlYW0uamF2YQppbmRleCA1OWExYjdlLi44YjEyOGYwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Byb3BlcnR5T3V0cHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm9wZXJ0eU91dHB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTMgKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlByb3BlcnR5UmVzb3VyY2U7CiAKIC8qKgotICogRXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBnZXQgYW4gT3V0cHV0U3RyZWFtCi0gKiBmcm9tIGFuIGltbXV0YWJsZSBSZXNvdXJjZS4KKyAqIHtAbGluayBPdXRwdXRTdHJlYW19IHRoYXQgd3JpdGVzIGFuIEFudCBwcm9wZXJ0eS4KICAqIEBzaW5jZSBBbnQgMS43CisgKiBAc2VlIFByb3BlcnR5UmVzb3VyY2UjZ2V0T3V0cHV0U3RyZWFtKCkKICAqLwogcHVibGljIGNsYXNzIFByb3BlcnR5T3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHsKICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKQEAgLTU4LDYgKzYwLDcgQEAKICAgICAvKioKICAgICAgKiBDbG9zZSB0aGUgUHJvcGVydHlPdXRwdXRTdHJlYW0sIHN0b3JpbmcgdGhlIHByb3BlcnR5LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogICAgICAgICBpZiAocHJvamVjdCAhPSBudWxsICYmIHByb3BlcnR5ICE9IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyBzID0gbmV3IFN0cmluZyh0b0J5dGVBcnJheSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUHJveHlTZXR1cC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm94eVNldHVwLmphdmEKaW5kZXggZWE2OWU3Mi4uODFiNTI5YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm94eVNldHVwLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Qcm94eVNldHVwLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC05NSw3ICs5NSw3IEBACiAgICAgICogaXMgc2V0LCB1c2UgdGhhdCBpbnN0ZWFkLiBFbHNlIHNldCB0byAidHJ1ZSIuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5hYmxlUHJveGllcygpIHsKLSAgICAgICAgaWYgKCEoZ2V0U3lzdGVtUHJveHlTZXR0aW5nKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgaWYgKGdldFN5c3RlbVByb3h5U2V0dGluZygpID09IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyBwcm94aWVzID0gb3duZXIuZ2V0UHJvcGVydHkoVVNFX1NZU1RFTV9QUk9YSUVTKTsKICAgICAgICAgICAgIGlmIChwcm94aWVzID09IG51bGwgfHwgUHJvamVjdC50b0Jvb2xlYW4ocHJveGllcykpIHsKICAgICAgICAgICAgICAgICBwcm94aWVzID0gInRydWUiOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWFkZXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDIxNzMzYjYuLjYxMDM1MWEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlYWRlcklucHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIAogLyoqCiAgKiBBZGFwdHMgYSA8Y29kZT5SZWFkZXI8L2NvZGU+IGFzIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPi4KQEAgLTYwLDkgKzYxLDI1IEBACiAgICAgICAgIHRoaXMocmVhZGVyKTsKICAgICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImVuY29kaW5nIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKICAgICAgICAgfQorICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgPGNvZGU+UmVhZGVySW5wdXRTdHJlYW08L2NvZGU+CisgICAgICogZm9yIHRoZSBzcGVjaWZpZWQgPGNvZGU+UmVhZGVyPC9jb2RlPiwKKyAgICAgKiB3aXRoIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyICAgICBub24tbnVsbCA8Y29kZT5SZWFkZXI8L2NvZGU+LgorICAgICAqIEBwYXJhbSBjaGFyc2V0ICAgIG5vbi1udWxsIDxjb2RlPkNoYXJzZXQ8L2NvZGU+IGNoYXJzZXQuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVhZGVySW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlciwgQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgICAgIHRoaXMocmVhZGVyKTsKKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBjaGFyc2V0Lm5hbWUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTcyLDYgKzg5LDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIG9yaWdpbmFsIDxjb2RlPlJlYWRlcjwvY29kZT4gZmFpbHMgdG8gYmUgcmVhZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gQ2xvc2VkIik7CkBAIC0xMDQsOCArMTIyLDggQEAKICAgICAgKiAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpZiAoaW4gPT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gQ2xvc2VkIik7CiAgICAgICAgIH0KQEAgLTE0NCw2ICsxNjIsNyBAQAogICAgICAqIEBwYXJhbSBsaW1pdCB0aGUgbWF4aW11bSBsaW1pdCBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGJlZm9yZSB0aGUKICAgICAgKiAgICAgICAgICAgICAgbWFyayBwb3NpdGlvbiBiZWNvbWVzIGludmFsaWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhmaW5hbCBpbnQgbGltaXQpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGluLm1hcmsobGltaXQpOwpAQCAtMTUyLDExICsxNzEsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQHJldHVybiAgIHRoZSBjdXJyZW50IG51bWJlciBvZiBieXRlcyByZWFkeSBmb3IgcmVhZGluZwogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGluID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIENsb3NlZCIpOwpAQCAtMTczLDYgKzE5Miw3IEBACiAgICAgLyoqCiAgICAgICogQHJldHVybiBmYWxzZSAtIG1hcmsgaXMgbm90IHN1cHBvcnRlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgICAvLyB3b3VsZCBiZSBpbXByZWNpc2UKICAgICB9CkBAIC0xODIsNiArMjAyLDcgQEAKICAgICAgKgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIFJlYWRlciBmYWlscyB0byBiZSByZXNldAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbiA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBDbG9zZWQiKTsKQEAgLTE5NSw2ICsyMTYsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgb3JpZ2luYWwgUmVhZGVyIGZhaWxzIHRvIGJlIGNsb3NlZAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7CiAgICAgICAgICAgICBpbi5jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWZsZWN0VXRpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWZsZWN0VXRpbC5qYXZhCmluZGV4IGJjNjJmYTAuLmFkODhhODYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVmbGVjdFV0aWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RVdGlsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMSw4IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogCkBAIC02MSwxNiArNjMsMTYgQEAKIAogICAgIC8qKgogICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLgogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAogICAgICAqIEByZXR1cm4gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbWV0aG9kCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgaW52b2tlKE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBpbnZva2UoT2JqZWN0IG9iaiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2Q7Ci0gICAgICAgICAgICBtZXRob2QgPSBvYmouZ2V0Q2xhc3MoKS5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCAoQ2xhc3NbXSkgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShvYmosIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUpOworICAgICAgICAgICAgcmV0dXJuIChUKSBtZXRob2QuaW52b2tlKG9iaik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiB0KSB7CiAgICAgICAgICAgICB0aHJvd0J1aWxkRXhjZXB0aW9uKHQpOwogICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vdFJlYWNoZWQKQEAgLTgxLDE2ICs4MywxNiBAQAogICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG5vIHBhcmFtZXRlcnMuCiAgICAgICogTm90ZTogVW5saWtlIHRoZSBpbnZva2UgbWV0aG9kIGFib3ZlLCB0aGlzCiAgICAgICogY2FsbHMgY2xhc3Mgb3Igc3RhdGljIG1ldGhvZHMsIG5vdCBpbnN0YW5jZSBtZXRob2RzLgorICAgICAqIEBwYXJhbSA8VD4gZGVzaXJlZCB0eXBlCiAgICAgICogQHBhcmFtIG9iaiAgdGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KICAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHRvIGNhbGwKICAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZAogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGludm9rZVN0YXRpYyhPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgaW52b2tlU3RhdGljKE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kOwotICAgICAgICAgICAgbWV0aG9kID0gKChDbGFzczw/Pikgb2JqKS5nZXRNZXRob2QoCi0gICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIChDbGFzc1tdKSBudWxsKTsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iaiwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSAoKENsYXNzPD8+KSBvYmopLmdldE1ldGhvZChtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAoVCkgbWV0aG9kLmludm9rZShvYmopOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkgewogICAgICAgICAgICAgdGhyb3dCdWlsZEV4Y2VwdGlvbih0KTsKICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOb3RSZWFjaGVkCkBAIC05OSwxOSArMTAxLDE5IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsIGEgbWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCBvbmUgYXJndW1lbnQuCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLgogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAogICAgICAqIEBwYXJhbSBhcmdUeXBlICAgIHRoZSB0eXBlIG9mIGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBhcmcgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2UoCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBpbnZva2UoCiAgICAgICAgIE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBhcmdUeXBlLCBPYmplY3QgYXJnKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXRob2QgbWV0aG9kOwotICAgICAgICAgICAgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHthcmdUeXBlfSk7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShvYmosIG5ldyBPYmplY3RbXSB7YXJnfSk7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ1R5cGUpOworICAgICAgICAgICAgcmV0dXJuIChUKSBtZXRob2QuaW52b2tlKG9iaiwgYXJnKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKICAgICAgICAgICAgIHRocm93QnVpbGRFeGNlcHRpb24odCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90UmVhY2hlZApAQCAtMTIwLDYgKzEyMiw3IEBACiAKICAgICAvKioKICAgICAgKiBDYWxsIGEgbWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCB0d28gYXJndW1lbnQuCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcGFyYW0gb2JqICB0aGUgb2JqZWN0IHRvIGludm9rZSB0aGUgbWV0aG9kIG9uLgogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAogICAgICAqIEBwYXJhbSBhcmdUeXBlMSAgIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KQEAgLTEyOCwxNCArMTMxLDE0IEBACiAgICAgICogQHBhcmFtIGFyZzIgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQuCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBpbnZva2UoCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBpbnZva2UoCiAgICAgICAgIE9iamVjdCBvYmosIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBhcmdUeXBlMSwgT2JqZWN0IGFyZzEsCiAgICAgICAgIENsYXNzPD8+IGFyZ1R5cGUyLCBPYmplY3QgYXJnMikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZDsKLSAgICAgICAgICAgIG1ldGhvZCA9IG9iai5nZXRDbGFzcygpLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7YXJnVHlwZTEsIGFyZ1R5cGUyfSk7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShvYmosIG5ldyBPYmplY3RbXSB7YXJnMSwgYXJnMn0pOworICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9CisgICAgICAgICAgICAgICAgb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIGFyZ1R5cGUxLCBhcmdUeXBlMik7CisgICAgICAgICAgICByZXR1cm4gKFQpIG1ldGhvZC5pbnZva2Uob2JqLCBhcmcxLCBhcmcyKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKICAgICAgICAgICAgIHRocm93QnVpbGRFeGNlcHRpb24odCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90UmVhY2hlZApAQCAtMTQ0LDE3ICsxNDcsMTkgQEAKIAogICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYSBmaWVsZCBpbiBhbiBvYmplY3QuCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gbG9vayBhdC4KICAgICAgKiBAcGFyYW0gZmllbGROYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpbiB0aGUgb2JqZWN0LgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkKE9iamVjdCBvYmosIFN0cmluZyBmaWVsZE5hbWUpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRGaWVsZChPYmplY3Qgb2JqLCBTdHJpbmcgZmllbGROYW1lKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgRmllbGQgZmllbGQgPSBvYmouZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7CiAgICAgICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldChvYmopOworICAgICAgICAgICAgcmV0dXJuIChUKSBmaWVsZC5nZXQob2JqKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHQpIHsKICAgICAgICAgICAgIHRocm93QnVpbGRFeGNlcHRpb24odCk7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gTm90UmVhY2hlZApAQCAtMTYzLDcgKzE2OCw3IEBACiAKICAgICAvKioKICAgICAgKiBBIG1ldGhvZCB0byBjb252ZXJ0IGFuIGludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gdG8KLSAgICAgKiBhIGJ1aWxkZXhjZXB0aW9uIGFuZCB0aHJvdyBpdC4KKyAgICAgKiBhIEJ1aWxkRXhjZXB0aW9uIGFuZCB0aHJvdyBpdC4KICAgICAgKiBAcGFyYW0gdCB0aGUgaW52b2NhdGlvbiB0YXJnZXQgZXhjZXB0aW9uLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gdGhlIGNvbnZlcnRlZCBleGNlcHRpb24uCiAgICAgICovCkBAIC0xNzQsNyArMTc5LDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgbWV0aG9kIHRvIGNvbnZlcnQgYW4gaW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB0bwotICAgICAqIGEgYnVpbGRleGNlcHRpb24uCisgICAgICogYSBCdWlsZEV4Y2VwdGlvbi4KICAgICAgKiBAcGFyYW0gdCB0aGUgaW52b2NhdGlvbiB0YXJnZXQgZXhjZXB0aW9uLgogICAgICAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBleGNlcHRpb24uCiAgICAgICogQHNpbmNlIGFudCAxLjcuMQpAQCAtMTg3LDkgKzE5Miw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIChCdWlsZEV4Y2VwdGlvbikgdDI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkRXhjZXB0aW9uKHQyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQnVpbGRFeGNlcHRpb24odCk7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZEV4Y2VwdGlvbih0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTIwMywxNSArMjA3LDEwIEBACiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHJlc3BvbmRzVG8oT2JqZWN0IG8sIFN0cmluZyBtZXRob2ROYW1lKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICB0cnkgewotICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IG8uZ2V0Q2xhc3MoKS5nZXRNZXRob2RzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobWV0aG9kc1tpXS5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBTdHJlYW0ub2Yoby5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkubWFwKE1ldGhvZDo6Z2V0TmFtZSkKKyAgICAgICAgICAgICAgICAuYW55TWF0Y2goUHJlZGljYXRlLmlzRXF1YWwobWV0aG9kTmFtZSkpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkgewogICAgICAgICAgICAgdGhyb3cgdG9CdWlsZEV4Y2VwdGlvbih0KTsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RXcmFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZmxlY3RXcmFwcGVyLmphdmEKaW5kZXggZTM0MzYzZS4uNmM5ZTBiNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWZsZWN0V3JhcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVmbGVjdFdyYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDYgKzI4LDcgQEAKIAogcHVibGljIGNsYXNzIFJlZmxlY3RXcmFwcGVyIHsKICAgICBwcml2YXRlIE9iamVjdCBvYmo7CisKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSB3cmFwcGVkIG9iamVjdCB1c2luZyB0aGUgbm8gYXJnIGNvbnN0cnVjdG9yLgogICAgICAqIEBwYXJhbSBsb2FkZXIgdGhlIGNsYXNzbG9hZGVyIHRvIHVzZSB0byBjb25zdHJ1Y3QgdGhlIGNsYXNzLgpAQCAtMzUsMTEgKzM2LDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgUmVmbGVjdFdyYXBwZXIoQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgbmFtZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xheno7Ci0gICAgICAgICAgICBjbGF6eiA9IENsYXNzLmZvck5hbWUobmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLSAgICAgICAgICAgIENvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotICAgICAgICAgICAgY29uc3RydWN0b3IgPSBjbGF6ei5nZXRDb25zdHJ1Y3RvcigoQ2xhc3NbXSkgbnVsbCk7Ci0gICAgICAgICAgICBvYmogPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgoT2JqZWN0W10pIG51bGwpOworICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKG5hbWUsIHRydWUsIGxvYWRlcik7CisgICAgICAgICAgICBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICBvYmogPSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gdCkgewogICAgICAgICAgICAgUmVmbGVjdFV0aWwudGhyb3dCdWlsZEV4Y2VwdGlvbih0KTsKICAgICAgICAgfQpAQCAtNTQsMzUgKzUzLDM5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQHBhcmFtIDxUPiBkZXNpcmVkIHR5cGUKICAgICAgKiBAcmV0dXJuIHRoZSB3cmFwcGVkIG9iamVjdC4KICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKLSAgICAgICAgcmV0dXJuIG9iajsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0T2JqZWN0KCkgeworICAgICAgICByZXR1cm4gKFQpIG9iajsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDYWxsIGEgbWV0aG9kIG9uIHRoZSBvYmplY3Qgd2l0aCBubyBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSA8VD4gZGVzaXJlZCB0eXBlCiAgICAgICogQHBhcmFtIG1ldGhvZE5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBjYWxsCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZShTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgIHB1YmxpYyA8VD4gVCBpbnZva2UoU3RyaW5nIG1ldGhvZE5hbWUpIHsKICAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsLmludm9rZShvYmosIG1ldGhvZE5hbWUpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG9uZSBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gPFQ+IGRlc2lyZWQgdHlwZQogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAogICAgICAqIEBwYXJhbSBhcmdUeXBlICAgIHRoZSB0eXBlIG9mIGFyZ3VtZW50LgogICAgICAqIEBwYXJhbSBhcmcgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuCiAgICAgICogQHJldHVybiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBtZXRob2QKICAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGludm9rZSgKLSAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzIGFyZ1R5cGUsIE9iamVjdCBhcmcpIHsKKyAgICBwdWJsaWMgPFQ+IFQgaW52b2tlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBhcmdUeXBlLCBPYmplY3QgYXJnKSB7CiAgICAgICAgIHJldHVybiBSZWZsZWN0VXRpbC5pbnZva2Uob2JqLCBtZXRob2ROYW1lLCBhcmdUeXBlLCBhcmcpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIENhbGwgYSBtZXRob2Qgb24gdGhlIG9iamVjdCB3aXRoIG9uZSBhcmd1bWVudC4KKyAgICAgKiBAcGFyYW0gPFQ+IGRlc2lyZWQgdHlwZQogICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIHRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gY2FsbAogICAgICAqIEBwYXJhbSBhcmdUeXBlMSAgIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBhcmd1bWVudC4KICAgICAgKiBAcGFyYW0gYXJnMSAgICAgICB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50LgpAQCAtOTAsMTAgKzkzLDkgQEAKICAgICAgKiBAcGFyYW0gYXJnMiAgICAgICB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBhcmd1bWVudC4KICAgICAgKiBAcmV0dXJuIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZAogICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKAotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3MgYXJnVHlwZTEsIE9iamVjdCBhcmcxLAotICAgICAgICBDbGFzcyBhcmdUeXBlMiwgT2JqZWN0IGFyZzIpIHsKLSAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsLmludm9rZSgKLSAgICAgICAgICAgIG9iaiwgbWV0aG9kTmFtZSwgYXJnVHlwZTEsIGFyZzEsIGFyZ1R5cGUyLCBhcmcyKTsKKyAgICBwdWJsaWMgPFQ+IFQgaW52b2tlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBhcmdUeXBlMSwgT2JqZWN0IGFyZzEsCisgICAgICAgIENsYXNzPD8+IGFyZ1R5cGUyLCBPYmplY3QgYXJnMikgeworICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWwuaW52b2tlKG9iaiwgbWV0aG9kTmFtZSwgYXJnVHlwZTEsIGFyZzEsIGFyZ1R5cGUyLAorICAgICAgICAgICAgYXJnMik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZWdleHBQYXR0ZXJuTWFwcGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQppbmRleCA1OTliN2VmLi4xNDQ3MjJhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlZ2V4cFBhdHRlcm5NYXBwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwLlJlZ2V4cE1hdGNoZXI7CkBAIC03NywxOSArNzcsMTkgQEAKICAgICAgKiBAcGFyYW0gZnJvbSB0aGUgZnJvbSBwYXR0ZXJuLgogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RnJvbShTdHJpbmcgZnJvbSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGZyb20gIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWcuc2V0UGF0dGVybihmcm9tKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIHRoZSBhY3R1YWwgUkUgd29uJ3QKLSAgICAgICAgICAgICAgICAvLyBnZXQgaW5zdGFudGlhdGVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkNhbm5vdCBsb2FkIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcm9tID09IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigidGhpcyBtYXBwZXIgcmVxdWlyZXMgYSAnZnJvbScgYXR0cmlidXRlIik7CiAgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKGZyb20pOworICAgICAgICB9IGNhdGNoIChOb0NsYXNzRGVmRm91bmRFcnJvciBlKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uIHRoZSBhY3R1YWwgUkUgd29uJ3QKKyAgICAgICAgICAgIC8vIGdldCBpbnN0YW50aWF0ZWQgaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlciIsCisgICAgICAgICAgICAgICAgZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTk3LDEyICs5NywxMiBAQAogICAgICAqIEBwYXJhbSB0byB0aGUgdG8gcGF0dGVybi4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFRvKFN0cmluZyB0bykgewotICAgICAgICBpZiAodG8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy50byA9IHRvLnRvQ2hhckFycmF5KCk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0byA9PSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInRoaXMgbWFwcGVyIHJlcXVpcmVzIGEgJ3RvJyBhdHRyaWJ1dGUiKTsKICAgICAgICAgfQorICAgICAgICB0aGlzLnRvID0gdG8udG9DaGFyQXJyYXkoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExMyw2ICsxMTMsNyBAQAogICAgICAqIEByZXR1cm4gYSBvbmUtZWxlbWVudCBhcnJheSBjb250YWluaW5nIHRoZSB0cmFuc2xhdGVkIGZpbGUgb3IKICAgICAgKiAgICAgICAgIG51bGwgaWYgdGhlIHRvIHBhdHRlcm4gZGlkIG5vdCBtYXRjaAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmdbXSBtYXBGaWxlTmFtZShTdHJpbmcgc291cmNlRmlsZU5hbWUpIHsKICAgICAgICAgaWYgKHNvdXJjZUZpbGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgICogQHJldHVybiB0aGUgdHJhbnNsYXRlZCBmaWxlIG5hbWUuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIFN0cmluZyByZXBsYWNlUmVmZXJlbmNlcyhTdHJpbmcgc291cmNlKSB7Ci0gICAgICAgIFZlY3RvciB2ID0gcmVnLmdldEdyb3Vwcyhzb3VyY2UsIHJlZ2V4cE9wdGlvbnMpOworICAgICAgICBMaXN0PFN0cmluZz4gdiA9IHJlZy5nZXRHcm91cHMoc291cmNlLCByZWdleHBPcHRpb25zKTsKIAogICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKDApOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvLmxlbmd0aDsgaSsrKSB7CkBAIC0xNDQsNyArMTQ1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoKytpIDwgdG8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IENoYXJhY3Rlci5kaWdpdCh0b1tpXSwgREVDSU1BTCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChTdHJpbmcpIHYuZWxlbWVudEF0KHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHYuZ2V0KHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHRvW2ldKTsKICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXNvdXJjZVV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHMuamF2YQppbmRleCBjM2I4MGQyLi4wZTIwMzg4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDggKzIxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKQEAgLTMwLDEyICsyOCwxNSBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycy51dGlsLkNoYWluUmVhZGVySGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlckNoYWluOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbHRlclNldENvbGxlY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUmVzb3VyY2VDb2xsZWN0aW9uOwpAQCAtNjgsOCArNjksMTAgQEAKICAgICAvKioKICAgICAgKiBOYW1lIG9mIGNoYXJzZXQgIklTTyBMYXRpbiBBbHBoYWJldCBOby4gMSwgYS5rLmEuIElTTy1MQVRJTi0xIi4KICAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEKICAgICAgKiBAc2luY2UgQW50IDEuOC4xCiAgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU09fODg1OV8xID0gIklTTy04ODU5LTEiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfSU9fQ0hVTktfU0laRSA9IDE2ICogMTAyNCAqIDEwMjRMOyAvLyAxNiBNQgpAQCAtMTQzLDI0ICsxNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VGYWN0b3J5IHRhcmdldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGdyYW51bGFyaXR5KSB7CiAgICAgICAgIGxvZ0Z1dHVyZShsb2dUbywgc291cmNlLCBncmFudWxhcml0eSk7Ci0gICAgICAgIGZpbmFsIFJlc291cmNlU2VsZWN0b3JQcm92aWRlciBwID0KLSAgICAgICAgICAgIG5ldyBSZXNvdXJjZVNlbGVjdG9yUHJvdmlkZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFJlc291cmNlU2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgZ2V0VGFyZ2V0U2VsZWN0b3JGb3JTb3VyY2UoZmluYWwgUmVzb3VyY2Ugc3IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZVNlbGVjdG9yKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZChmaW5hbCBSZXNvdXJjZSB0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYSBJL08sIHByb2JhYmx5IHdhc3RlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUoc3IsIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFudWxhcml0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgcmV0dXJuIHNlbGVjdFNvdXJjZXMobG9nVG8sIHNvdXJjZSwgbWFwcGVyLCB0YXJnZXRzLCBwKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdFNvdXJjZXMobG9nVG8sIHNvdXJjZSwgbWFwcGVyLCB0YXJnZXRzLAorICAgICAgICAgICAgc3IgLT4gdGFyZ2V0IC0+IFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUoc3IsIHRhcmdldCwgZ3JhbnVsYXJpdHkpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4Miw3ICsxNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZU5hbWVNYXBwZXIgbWFwcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VGYWN0b3J5IHRhcmdldHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVNlbGVjdG9yUHJvdmlkZXIgc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNvdXJjZS5zaXplKCkgPT0gMCkgeworICAgICAgICBpZiAoc291cmNlLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbG9nVG8ubG9nKCJObyBzb3VyY2VzIGZvdW5kLiIsIFByb2plY3QuTVNHX1ZFUkJPU0UpOwogICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlcy5OT05FOwogICAgICAgICB9CkBAIC0xOTEsOCArMTc4LDEwIEBACiAgICAgICAgIGZpbmFsIFVuaW9uIHJlc3VsdCA9IG5ldyBVbmlvbigpOwogICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHNyIDogc291cmNlKSB7CiAgICAgICAgICAgICBTdHJpbmcgc3JOYW1lID0gc3IuZ2V0TmFtZSgpOwotICAgICAgICAgICAgc3JOYW1lID0gc3JOYW1lID09IG51bGwKLSAgICAgICAgICAgICAgICA/IHNyTmFtZSA6IHNyTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIGlmIChzck5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNyTmFtZSA9IHNyTmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKKyAgICAgICAgICAgIH0KKwogCiAgICAgICAgICAgICBTdHJpbmdbXSB0YXJnZXRuYW1lcyA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewpAQCAtMzAwLDcgKzI4OSw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVJlc291cmNlKGZpbmFsIFJlc291cmNlIHNvdXJjZSwgZmluYWwgUmVzb3VyY2UgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBmaW5hbCBWZWN0b3IgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIGZpbmFsIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJ3cml0ZSwgZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0RW5jb2RpbmcsIGZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0KQpAQCAtMzM3LDcgKzMyNiw3IEBACiAgICAgICogQHNpbmNlIEFudCAxLjgKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVJlc291cmNlKGZpbmFsIFJlc291cmNlIHNvdXJjZSwgZmluYWwgUmVzb3VyY2UgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIGZpbmFsIFZlY3RvciBmaWx0ZXJDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJ3cml0ZSwgZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dEVuY29kaW5nLCBmaW5hbCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcsCkBAIC0zNzcsMjEgKzM2NiwyMSBAQAogICAgICAqIEBzaW5jZSBBbnQgMS44LjIKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVJlc291cmNlKGZpbmFsIFJlc291cmNlIHNvdXJjZSwgZmluYWwgUmVzb3VyY2UgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWx0ZXJTZXRDb2xsZWN0aW9uIGZpbHRlcnMsIGZpbmFsIFZlY3RvciBmaWx0ZXJDaGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLCBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG92ZXJ3cml0ZSwgZmluYWwgYm9vbGVhbiBwcmVzZXJ2ZUxhc3RNb2RpZmllZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0RW5jb2RpbmcsIGZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgYm9vbGVhbiBmb3JjZSkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCEob3ZlcndyaXRlIHx8IFNlbGVjdG9yVXRpbHMuaXNPdXRPZkRhdGUoc291cmNlLCBkZXN0LCBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkKLSAgICAgICAgICAgICAgICAuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkpKSkgeworICAgICAgICBpZiAoIW92ZXJ3cml0ZSAmJiAhU2VsZWN0b3JVdGlscy5pc091dE9mRGF0ZShzb3VyY2UsIGRlc3QsCisgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKSkgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZmlsdGVyU2V0c0F2YWlsYWJsZSA9IChmaWx0ZXJzICE9IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGZpbHRlcnMuaGFzRmlsdGVycygpKTsKICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWx0ZXJDaGFpbnNBdmFpbGFibGUgPSAoZmlsdGVyQ2hhaW5zICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsdGVyQ2hhaW5zLnNpemUoKSA+IDApOwotICAgICAgICBTdHJpbmcgZWZmZWN0aXZlSW5wdXRFbmNvZGluZyA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFmaWx0ZXJDaGFpbnMuaXNFbXB0eSgpKTsKKyAgICAgICAgU3RyaW5nIGVmZmVjdGl2ZUlucHV0RW5jb2Rpbmc7CiAgICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBTdHJpbmdSZXNvdXJjZSkgewogICAgICAgICAgICAgZWZmZWN0aXZlSW5wdXRFbmNvZGluZyA9ICgoU3RyaW5nUmVzb3VyY2UpIHNvdXJjZSkuZ2V0RW5jb2RpbmcoKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTQwNCwyNSArMzkzLDI1IEBACiAgICAgICAgIGlmIChkZXN0RmlsZSAhPSBudWxsICYmIGRlc3RGaWxlLmlzRmlsZSgpICYmICFkZXN0RmlsZS5jYW5Xcml0ZSgpKSB7CiAgICAgICAgICAgICBpZiAoIWZvcmNlKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlYWRPbmx5VGFyZ2V0RmlsZUV4Y2VwdGlvbihkZXN0RmlsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGSUxFX1VUSUxTLnRyeUhhcmRUb0RlbGV0ZShkZXN0RmlsZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBkZWxldGUgcmVhZC1vbmx5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGVzdGluYXRpb24gZmlsZSAiICsgZGVzdEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFGSUxFX1VUSUxTLnRyeUhhcmRUb0RlbGV0ZShkZXN0RmlsZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGVsZXRlIHJlYWQtb25seSBkZXN0aW5hdGlvbiBmaWxlICIgKyBkZXN0RmlsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZmlsdGVyU2V0c0F2YWlsYWJsZSkgewogICAgICAgICAgICAgY29weVdpdGhGaWx0ZXJTZXRzKHNvdXJjZSwgZGVzdCwgZmlsdGVycywgZmlsdGVyQ2hhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckNoYWluc0F2YWlsYWJsZSwgYXBwZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUlucHV0RW5jb2RpbmcsIG91dHB1dEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCwgZWZmZWN0aXZlSW5wdXRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRFbmNvZGluZywgcHJvamVjdCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyQ2hhaW5zQXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgfHwgKGVmZmVjdGl2ZUlucHV0RW5jb2RpbmcgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAmJiAhZWZmZWN0aXZlSW5wdXRFbmNvZGluZy5lcXVhbHMob3V0cHV0RW5jb2RpbmcpKQogICAgICAgICAgICAgICAgICAgIHx8IChlZmZlY3RpdmVJbnB1dEVuY29kaW5nID09IG51bGwgJiYgb3V0cHV0RW5jb2RpbmcgIT0gbnVsbCkpIHsKICAgICAgICAgICAgIGNvcHlXaXRoRmlsdGVyQ2hhaW5zT3JUcmFuc2NvZGluZyhzb3VyY2UsIGRlc3QsIGZpbHRlckNoYWlucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDaGFpbnNBdmFpbGFibGUsIGFwcGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVJbnB1dEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEVuY29kaW5nLCBwcm9qZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQsIGVmZmVjdGl2ZUlucHV0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBib29sZWFuIGNvcGllZCA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKHNvdXJjZS5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpICE9IG51bGwKQEAgLTUzMCw3ICs1MTksNyBAQAogICAgICAgICB9CiAgICAgICAgIGZpbmFsIGJvb2xlYW4gZTEgPSByMS5pc0V4aXN0cygpOwogICAgICAgICBmaW5hbCBib29sZWFuIGUyID0gcjIuaXNFeGlzdHMoKTsKLSAgICAgICAgaWYgKCEoZTEgfHwgZTIpKSB7CisgICAgICAgIGlmICghZTEgJiYgIWUyKSB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBpZiAoZTEgIT0gZTIpIHsKQEAgLTU2MCw5ICs1NDksOCBAQAogICAgICAgICBpZiAoZmlsZVByb3ZpZGVyIGluc3RhbmNlb2YgRmlsZVJlc291cmNlIHx8IGZpbGVQcm92aWRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gKEZpbGVSZXNvdXJjZSkgZmlsZVByb3ZpZGVyOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEZpbGVSZXNvdXJjZSByZXN1bHQgPSBuZXcgRmlsZVJlc291cmNlKGZpbGVQcm92aWRlci5nZXRGaWxlKCkpOwotICAgICAgICByZXN1bHQuc2V0UHJvamVjdChQcm9qZWN0LmdldFByb2plY3QoZmlsZVByb3ZpZGVyKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBuZXcgRmlsZVJlc291cmNlKFByb2plY3QuZ2V0UHJvamVjdChmaWxlUHJvdmlkZXIpLAorICAgICAgICAgICAgZmlsZVByb3ZpZGVyLmdldEZpbGUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC01ODEsMTEgKzU2OSw5IEBACiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgYmluYXJ5Q29tcGFyZShmaW5hbCBSZXNvdXJjZSByMSwgZmluYWwgUmVzb3VyY2UgcjIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluMSA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGluMiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbjEgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShyMS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIGluMiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHIyLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluMSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHIxLmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluMiA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHIyLmdldElucHV0U3RyZWFtKCkpKSB7CiAKICAgICAgICAgICAgIGZvciAoaW50IGIxID0gaW4xLnJlYWQoKTsgYjEgIT0gLTE7IGIxID0gaW4xLnJlYWQoKSkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBiMiA9IGluMi5yZWFkKCk7CkBAIC01OTQsOSArNTgwLDYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaW4yLnJlYWQoKSA9PSAtMSA/IDAgOiAtMTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbjEpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluMik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTYxMSwxMSArNTk0LDEwIEBACiAgICAgICogQHNpbmNlIEFudCAxLjcKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBpbnQgdGV4dENvbXBhcmUoZmluYWwgUmVzb3VyY2UgcjEsIGZpbmFsIFJlc291cmNlIHIyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbjEgPSBudWxsOwotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbjIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4xID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyMS5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0gICAgICAgICAgICBpbjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHIyLmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpbjEgPQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihyMS5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4yID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocjIuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CiAKICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGluMS5yZWFkTGluZSgpOwogICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkICE9IG51bGwpIHsKQEAgLTYyOSw5ICs2MTEsNiBAQAogICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gaW4xLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gaW4yLnJlYWRMaW5lKCkgPT0gbnVsbCA/IDAgOiAtMTsgLy9OT1NPTkFSCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4xKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbjIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC02NTgsMTAgKzYzNyw5IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlXaXRoRmlsdGVyU2V0cyhmaW5hbCBSZXNvdXJjZSBzb3VyY2UsIGZpbmFsIFJlc291cmNlIGRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyU2V0Q29sbGVjdGlvbiBmaWx0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlY3RvciBmaWx0ZXJDaGFpbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmaWx0ZXJDaGFpbnNBdmFpbGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmQsIGZpbmFsIFN0cmluZyBpbnB1dEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWZWN0b3I8RmlsdGVyQ2hhaW4+IGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFwcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5wdXRFbmNvZGluZywgZmluYWwgU3RyaW5nIG91dHB1dEVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdCkKICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKIApAQCAtNjcxLDU5ICs2NDksNDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoaW5wdXRFbmNvZGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEVuY29kaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0gICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSBnZXRPdXRwdXRTdHJlYW0oZGVzdCwgYXBwZW5kLCBwcm9qZWN0KTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3c7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zLCBvdXRwdXRFbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIob3N3KTsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJDaGFpbnNBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBDaGFpblJlYWRlckhlbHBlciBjcmggPSBuZXcgQ2hhaW5SZWFkZXJIZWxwZXIoKTsKLSAgICAgICAgICAgICAgICBjcmguc2V0QnVmZmVyU2l6ZShGaWxlVXRpbHMuQlVGX1NJWkUpOwotICAgICAgICAgICAgICAgIGNyaC5zZXRQcmltYXJ5UmVhZGVyKGluKTsKLSAgICAgICAgICAgICAgICBjcmguc2V0RmlsdGVyQ2hhaW5zKGZpbHRlckNoYWlucyk7Ci0gICAgICAgICAgICAgICAgY3JoLnNldFByb2plY3QocHJvamVjdCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgUmVhZGVyIHJkciA9IGNyaC5nZXRBc3NlbWJsZWRSZWFkZXIoKTsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZHIpOwotICAgICAgICAgICAgfQorICAgICAgICB0cnkgKFJlYWRlciBpbiA9IGZpbHRlcldpdGgocHJvamVjdCwgaW5wdXRFbmNvZGluZywgZmlsdGVyQ2hhaW5zLAorICAgICAgICAgICAgICAgIHNvdXJjZS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dFN0cmVhbShkZXN0LCBhcHBlbmQsIHByb2plY3QpLAorICAgICAgICAgICAgICAgICAgICAgY2hhcnNldEZvcihvdXRwdXRFbmNvZGluZykpKSkgeworCiAgICAgICAgICAgICBmaW5hbCBMaW5lVG9rZW5pemVyIGxpbmVUb2tlbml6ZXIgPSBuZXcgTGluZVRva2VuaXplcigpOwogICAgICAgICAgICAgbGluZVRva2VuaXplci5zZXRJbmNsdWRlRGVsaW1zKHRydWUpOwotICAgICAgICAgICAgU3RyaW5nIG5ld2xpbmUgPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBsaW5lVG9rZW5pemVyLmdldFRva2VuKGluKTsKICAgICAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobGluZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJlY2F1c2UgdGhlIGxpbmVzIGFyZQogICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCB3aXRoIHRoZSBlbmQgb2YgbGluZSBkZWxpbWl0ZXIKICAgICAgICAgICAgICAgICAgICAgb3V0Lm5ld0xpbmUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gZmlsdGVycy5yZXBsYWNlVG9rZW5zKGxpbmUpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShmaWx0ZXJzLnJlcGxhY2VUb2tlbnMobGluZSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVRva2VuaXplci5nZXRUb2tlbihpbik7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uob3V0KTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShpbik7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkZXIgZmlsdGVyV2l0aChQcm9qZWN0IHByb2plY3QsIFN0cmluZyBlbmNvZGluZywKKyAgICAgICAgVmVjdG9yPEZpbHRlckNoYWluPiBmaWx0ZXJDaGFpbnMsIElucHV0U3RyZWFtIGlucHV0KSB7CisgICAgICAgIFJlYWRlciByID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0LCBjaGFyc2V0Rm9yKGVuY29kaW5nKSk7CisgICAgICAgIGlmIChmaWx0ZXJDaGFpbnMgIT0gbnVsbCAmJiAhZmlsdGVyQ2hhaW5zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgQ2hhaW5SZWFkZXJIZWxwZXIgY3JoID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7CisgICAgICAgICAgICBjcmguc2V0QnVmZmVyU2l6ZShGaWxlVXRpbHMuQlVGX1NJWkUpOworICAgICAgICAgICAgY3JoLnNldFByaW1hcnlSZWFkZXIocik7CisgICAgICAgICAgICBjcmguc2V0RmlsdGVyQ2hhaW5zKGZpbHRlckNoYWlucyk7CisgICAgICAgICAgICBjcmguc2V0UHJvamVjdChwcm9qZWN0KTsKKyAgICAgICAgICAgIHIgPSBjcmguZ2V0QXNzZW1ibGVkUmVhZGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFyc2V0IGNoYXJzZXRGb3IoU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIHJldHVybiBlbmNvZGluZyA9PSBudWxsID8gQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpIDogQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlXaXRoRmlsdGVyQ2hhaW5zT3JUcmFuc2NvZGluZyhmaW5hbCBSZXNvdXJjZSBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWZWN0b3IgZmlsdGVyQ2hhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZmlsdGVyQ2hhaW5zQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZlY3RvcjxGaWx0ZXJDaGFpbj4gZmlsdGVyQ2hhaW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dEVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXRFbmNvZGluZywKQEAgLTczNiwzNCArNzA0LDExIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgIEJ1ZmZlcmVkV3JpdGVyIG91dCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbVJlYWRlciBpc3IgPSBudWxsOwotICAgICAgICAgICAgaWYgKGlucHV0RW5jb2RpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRFbmNvZGluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihpc3IpOwotICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9zID0gZ2V0T3V0cHV0U3RyZWFtKGRlc3QsIGFwcGVuZCwgcHJvamVjdCk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3OwotICAgICAgICAgICAgaWYgKG91dHB1dEVuY29kaW5nID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG9zKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvcywgb3V0cHV0RW5jb2RpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG9zdyk7Ci0gICAgICAgICAgICBpZiAoZmlsdGVyQ2hhaW5zQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgQ2hhaW5SZWFkZXJIZWxwZXIgY3JoID0gbmV3IENoYWluUmVhZGVySGVscGVyKCk7Ci0gICAgICAgICAgICAgICAgY3JoLnNldEJ1ZmZlclNpemUoRmlsZVV0aWxzLkJVRl9TSVpFKTsKLSAgICAgICAgICAgICAgICBjcmguc2V0UHJpbWFyeVJlYWRlcihpbik7Ci0gICAgICAgICAgICAgICAgY3JoLnNldEZpbHRlckNoYWlucyhmaWx0ZXJDaGFpbnMpOwotICAgICAgICAgICAgICAgIGNyaC5zZXRQcm9qZWN0KHByb2plY3QpOwotICAgICAgICAgICAgICAgIGZpbmFsIFJlYWRlciByZHIgPSBjcmguZ2V0QXNzZW1ibGVkUmVhZGVyKCk7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIocmRyKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgdHJ5IChSZWFkZXIgaW4gPSBmaWx0ZXJXaXRoKHByb2plY3QsIGlucHV0RW5jb2RpbmcsIGZpbHRlckNoYWlucywKKyAgICAgICAgICAgICAgICBzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoCisgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRTdHJlYW0oZGVzdCwgYXBwZW5kLCBwcm9qZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRGb3Iob3V0cHV0RW5jb2RpbmcpKSkpIHsKICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltGaWxlVXRpbHMuQlVGX1NJWkVdOwogICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgblJlYWQgPSBpbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CkBAIC03NzIsMTAgKzcxNyw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIG5SZWFkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKICAgICAgICAgfQorCiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb3B5VXNpbmdGaWxlQ2hhbm5lbHMoZmluYWwgRmlsZSBzb3VyY2VGaWxlLApAQCAtNzk0LDMwICs3MzcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yICIgKyBkZXN0RmlsZSk7CiAgICAgICAgIH0KIAotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0gICAgICAgIEZpbGVDaGFubmVsIHNyY0NoYW5uZWwgPSBudWxsOwotICAgICAgICBGaWxlQ2hhbm5lbCBkZXN0Q2hhbm5lbCA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKTsKLSAgICAgICAgICAgIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKTsKLQotICAgICAgICAgICAgc3JjQ2hhbm5lbCA9IGluLmdldENoYW5uZWwoKTsKLSAgICAgICAgICAgIGRlc3RDaGFubmVsID0gb3V0LmdldENoYW5uZWwoKTsKLQorICAgICAgICB0cnkgKEZpbGVDaGFubmVsIHNyY0NoYW5uZWwgPQorICAgICAgICAgICAgRmlsZUNoYW5uZWwub3Blbihzb3VyY2VGaWxlLnRvUGF0aCgpLCBTdGFuZGFyZE9wZW5PcHRpb24uUkVBRCk7CisgICAgICAgICAgICAgICAgRmlsZUNoYW5uZWwgZGVzdENoYW5uZWwgPSBGaWxlQ2hhbm5lbC5vcGVuKGRlc3RGaWxlLnRvUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFLAorICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZE9wZW5PcHRpb24uVFJVTkNBVEVfRVhJU1RJTkcsCisgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkT3Blbk9wdGlvbi5XUklURSkpIHsKICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSAwOwogICAgICAgICAgICAgZmluYWwgbG9uZyBjb3VudCA9IHNyY0NoYW5uZWwuc2l6ZSgpOwogICAgICAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGNodW5rID0gTWF0aC5taW4oTUFYX0lPX0NIVU5LX1NJWkUsIGNvdW50IC0gcG9zaXRpb24pOworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY2h1bmsgPQorICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihNQVhfSU9fQ0hVTktfU0laRSwgY291bnQgLSBwb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgcG9zaXRpb24gKz0KICAgICAgICAgICAgICAgICAgICAgZGVzdENoYW5uZWwudHJhbnNmZXJGcm9tKHNyY0NoYW5uZWwsIHBvc2l0aW9uLCBjaHVuayk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uoc3JjQ2hhbm5lbCk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZGVzdENoYW5uZWwpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKG91dCk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoaW4pOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzAsMTIgKzc2Myw4IEBACiAgICAgICAgICAgICBsb2cocHJvamVjdCwgIlNraXBwaW5nIChzZWxmKSBjb3B5IG9mICIgKyBzb3VyY2UgKyAgIiB0byAiICsgZGVzdCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW4gPSBzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIG91dCA9IGdldE91dHB1dFN0cmVhbShkZXN0LCBhcHBlbmQsIHByb2plY3QpOworICAgICAgICB0cnkgKElucHV0U3RyZWFtIGluID0gc291cmNlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IGdldE91dHB1dFN0cmVhbShkZXN0LCBhcHBlbmQsIHByb2plY3QpKSB7CiAKICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtGaWxlVXRpbHMuQlVGX1NJWkVdOwogICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKQEAgLTg0Myw5ICs3NzIsNiBAQAogICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGNvdW50KTsKICAgICAgICAgICAgICAgICBjb3VudCA9IGluLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKTsKICAgICAgICAgICAgIH0gd2hpbGUgKGNvdW50ICE9IC0xKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShvdXQpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODcyLDE0ICs3OTgsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEZpbGVQcm92aWRlciBmaWxlUmVzb3VyY2UxID0gcmVzb3VyY2UxLmFzKEZpbGVQcm92aWRlci5jbGFzcyk7Ci0gICAgICAgIGlmIChmaWxlUmVzb3VyY2UxID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQogICAgICAgICBmaW5hbCBGaWxlUHJvdmlkZXIgZmlsZVJlc291cmNlMiA9IHJlc291cmNlMi5hcyhGaWxlUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBpZiAoZmlsZVJlc291cmNlMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5hcmVTYW1lKGZpbGVSZXNvdXJjZTEuZ2V0RmlsZSgpLCBmaWxlUmVzb3VyY2UyLmdldEZpbGUoKSk7CisgICAgICAgIHJldHVybiBmaWxlUmVzb3VyY2UxICE9IG51bGwgJiYgZmlsZVJlc291cmNlMiAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmFyZVNhbWUoZmlsZVJlc291cmNlMS5nZXRGaWxlKCksIGZpbGVSZXNvdXJjZTIuZ2V0RmlsZSgpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZyhmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5SGFuZGxlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXRyeUhhbmRsZXIuamF2YQppbmRleCBkZDYyYmMyLi43ZDliNDRiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5SGFuZGxlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmV0cnlIYW5kbGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5YWJsZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXRyeWFibGUuamF2YQppbmRleCA1MzcyNDRhLi5jNDhlODA3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JldHJ5YWJsZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmV0cnlhYmxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdEZpeEJTRlBhdGguamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0Rml4QlNGUGF0aC5qYXZhCmluZGV4IGNhNzZlNTYuLjI2NDcxMzYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0Rml4QlNGUGF0aC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0Rml4QlNGUGF0aC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTYsOSArNTYsOSBAQAogICAgICAgICAgICAgInhzbHQiLCAgICAgICAib3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLlhPYmplY3QifTsKIAogICAgIC8qKiBBIG1hcCBvZiBsYW5ndWFnZXMgZm9yIHdoaWNoIHRoZSBlbmdpbmUgaW4gbG9jYXRlZCBpbiBic2YgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgQlNGX0xBTkdVQUdFX01BUCA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBCU0ZfTEFOR1VBR0VfTUFQID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHN0YXRpYyB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQlNGX0xBTkdVQUdFUy5sZW5ndGg7IGkgPSBpICsgMikgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJTRl9MQU5HVUFHRVMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgIEJTRl9MQU5HVUFHRV9NQVAucHV0KEJTRl9MQU5HVUFHRVNbaV0sIEJTRl9MQU5HVUFHRVNbaSArIDFdKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICBib29sZWFuIG5lZWRNb3ZlUnVubmVyID0gKGJzZlNvdXJjZSA9PSBudWxsKTsKIAogICAgICAgICAvLyBDaGVjayBmb3IgbG9jYXRpb24gb2YgbGFuZ3VhZ2UKLSAgICAgICAgU3RyaW5nIGxhbmd1YWdlQ2xhc3NOYW1lID0gKFN0cmluZykgQlNGX0xBTkdVQUdFX01BUC5nZXQobGFuZ3VhZ2UpOworICAgICAgICBTdHJpbmcgbGFuZ3VhZ2VDbGFzc05hbWUgPSBCU0ZfTEFOR1VBR0VfTUFQLmdldChsYW5ndWFnZSk7CiAKICAgICAgICAgLy8gQ2hlY2sgaWYgbmVlZCB0byBuZWVkIHRvIG1vdmUgYnNmCiAgICAgICAgIGJvb2xlYW4gbmVlZE1vdmVCc2YgPQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVyLmphdmEKaW5kZXggNTQ0ZGI1NS4uY2I4MWEzZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXJCYXNlLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckJhc2UuamF2YQppbmRleCA0MmRmOWEyLi5mNDU5ODhlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckJhc2UuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckJhc2UuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE0ICsxOSwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CkBAIC0zNCw2ICszMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdENvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZUNvbGxlY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlByb3BlcnR5UmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLlN0cmluZ1Jlc291cmNlOwogCiAvKioKICAqIFRoaXMgaXMgYSBjb21tb24gYWJzdHJhY3QgYmFzZSBjYXNlIGZvciBzY3JpcHQgcnVubmVycy4KQEAgLTUxLDYgKzUyLDExIEBACiAgICAgLyoqIFNjcmlwdCBjb250ZW50ICovCiAgICAgcHJpdmF0ZSBTdHJpbmcgc2NyaXB0ID0gIiI7CiAKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKKworICAgIC8qKiBFbmFibGUgc2NyaXB0IGNvbXBpbGF0aW9uLiAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb21waWxlZDsKKwogICAgIC8qKiBQcm9qZWN0IHRoaXMgcnVubmVyIGlzIHVzZWQgaW4gKi8KICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKIApAQCAtNTgsNyArNjQsNyBAQAogICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgc2NyaXB0TG9hZGVyOwogCiAgICAgLyoqIEJlYW5zIHRvIGJlIHByb3ZpZGVkIHRvIHRoZSBzY3JpcHQgKi8KLSAgICBwcml2YXRlIE1hcCBiZWFucyA9IG5ldyBIYXNoTWFwKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGJlYW5zID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgLyoqCiAgICAgICogQWRkIGEgbGlzdCBvZiBuYW1lZCBvYmplY3RzIHRvIHRoZSBsaXN0IHRvIGJlIGV4cG9ydGVkIHRvIHRoZSBzY3JpcHQKQEAgLTY2LDE5ICs3MiwxNyBAQAogICAgICAqIEBwYXJhbSBkaWN0aW9uYXJ5IGEgbWFwIG9mIG9iamVjdHMgdG8gYmUgcGxhY2VkIGludG8gdGhlIHNjcmlwdCBjb250ZXh0CiAgICAgICogICAgICAgIGluZGV4ZWQgYnkgU3RyaW5nIG5hbWVzLgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZEJlYW5zKE1hcCBkaWN0aW9uYXJ5KSB7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGRpY3Rpb25hcnkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7CisgICAgcHVibGljIHZvaWQgYWRkQmVhbnMoTWFwPFN0cmluZywgPz4gZGljdGlvbmFyeSkgeworICAgICAgICBkaWN0aW9uYXJ5LmZvckVhY2goKGssIHYpIC0+IHsKICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IGRpY3Rpb25hcnkuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgYWRkQmVhbihrZXksIHZhbCk7CisgICAgICAgICAgICAgICAgYWRkQmVhbihrLCB2KTsKICAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICAgICAgLy8gVGhlIGtleSBpcyBpbiB0aGUgZGljdGlvbmFyeSBidXQgY2Fubm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdXN1YWxseSBkdWUgcmVmZXJlbmNlcyB0aGF0IHJlZmVyIHRvIHRhc2tzCiAgICAgICAgICAgICAgICAgLy8gdGhhdCBoYXZlIG5vdCBiZWVuIHRhc2tkZWZlZCBpbiB0aGUgY3VycmVudCBydW4uCiAgICAgICAgICAgICAgICAgLy8gSWdub3JlCiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04OCwxNCArOTIsOCBAQAogICAgICAqIEBwYXJhbSBiZWFuIHRoZSBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSBzY3JpcHQgY29udGV4dC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhZGRCZWFuKFN0cmluZyBrZXksIE9iamVjdCBiZWFuKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNWYWxpZCA9IGtleS5sZW5ndGgoKSA+IDAKLSAgICAgICAgICAgICYmIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoa2V5LmNoYXJBdCgwKSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGlzVmFsaWQgJiYgaSA8IGtleS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpc1ZhbGlkID0gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGtleS5jaGFyQXQoaSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlzVmFsaWQpIHsKKyAgICAgICAgaWYgKCFrZXkuaXNFbXB0eSgpICYmIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoa2V5LmNoYXJBdCgwKSkKKyAgICAgICAgICAgICAgICAmJiBrZXkuY2hhcnMoKS5za2lwKDEpLmFsbE1hdGNoKENoYXJhY3Rlcjo6aXNKYXZhSWRlbnRpZmllclBhcnQpKSB7CiAgICAgICAgICAgICBiZWFucy5wdXQoa2V5LCBiZWFuKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEwNCw3ICsxMDIsNyBAQAogICAgICAqIEdldCB0aGUgYmVhbnMgdXNlZCBmb3IgdGhlIHNjcmlwdC4KICAgICAgKiBAcmV0dXJuIHRoZSBtYXAgb2YgYmVhbnMuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIE1hcCBnZXRCZWFucygpIHsKKyAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRCZWFucygpIHsKICAgICAgICAgcmV0dXJuIGJlYW5zOwogICAgIH0KIApAQCAtMTg3LDYgKzE4NSwzMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gdXNlIHNjcmlwdCBjb21waWxhdGlvbiBpZiBhdmFpbGFibGUuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKiBAcGFyYW0gY29tcGlsZWQgaWYgdHJ1ZSwgY29tcGlsZSB0aGUgc2NyaXB0IGlmIHBvc3NpYmxlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENvbXBpbGVkKGJvb2xlYW4gY29tcGlsZWQpIHsKKyAgICAgICAgdGhpcy5jb21waWxlZCA9IGNvbXBpbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29tcGlsZWQgYXR0cmlidXRlLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICogQHJldHVybiB0aGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGdldENvbXBpbGVkKCkgeworICAgICAgICByZXR1cm4gY29tcGlsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlOyBvcHRpb25hbC4KKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqIEBwYXJhbSBlbmNvZGluZyAgZW5jb2Rpbmcgb2YgdGhlIGV4dGVybmFsIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHsKKyAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgogICAgICAqIExvYWQgdGhlIHNjcmlwdCBmcm9tIGFuIGV4dGVybmFsIGZpbGU7IG9wdGlvbmFsLgogICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCBzb3VyY2UuCiAgICAgICovCkBAIC0xOTUsMzIgKzIyMCwzMyBAQAogICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSAiICsgZmlsZW5hbWUgKyAiIG5vdCBmb3VuZC4iKTsKICAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVhZFNvdXJjZShuZXcgRmlsZVJlYWRlcihmaWxlKSwgZmlsZW5hbWUpOwotICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgeworCisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW4gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShmaWxlLnRvUGF0aCgpKSkgeworICAgICAgICAgICAgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gbnVsbCA9PSBlbmNvZGluZyA/IENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKQorICAgICAgICAgICAgICAgIDogQ2hhcnNldC5mb3JOYW1lKGVuY29kaW5nKTsKKworICAgICAgICAgICAgcmVhZFNvdXJjZShpbiwgZmlsZW5hbWUsIGNoYXJzZXQpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvL3RoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBmaWxlIGdvdCBkZWxldGVkIGEgc2hvcnQgbW9tZW50IGFnbwotICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlICIgKyBmaWxlbmFtZSArICIgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlICIgKyBmaWxlbmFtZSArICIgbm90IGZvdW5kLiIsIGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZCBzb21lIHNvdXJjZSBpbiBmcm9tIHRoZSBnaXZlbiByZWFkZXIKLSAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBpbnB1dCBzdHJlYW0gdG8gcGFzcyBpbnRvIGEgYnVmZmVyZWQgcmVhZGVyLgorICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHBhc3MgaW50byBhIGJ1ZmZlcmVkIHJlYWRlci4KICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byB1c2UgaW4gZXJyb3IgbWVzc2FnZXMKKyAgICAgKiBAcGFyYW0gY2hhcnNldCB0aGUgZW5jb2RpbmcgZm9yIHRoZSByZWFkZXIsIG1heSBiZSBudWxsLgogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWFkU291cmNlKFJlYWRlciByZWFkZXIsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7Ci0gICAgICAgICAgICBzY3JpcHQgKz0gRmlsZVV0aWxzLnNhZmVSZWFkRnVsbHkoaW4pOworICAgIHByaXZhdGUgdm9pZCByZWFkU291cmNlKElucHV0U3RyZWFtIGluLCBTdHJpbmcgbmFtZSwgQ2hhcnNldCBjaGFyc2V0KSB7CisgICAgICAgIHRyeSAoUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBjaGFyc2V0KSkpIHsKKyAgICAgICAgICAgIHNjcmlwdCArPSBGaWxlVXRpbHMuc2FmZVJlYWRGdWxseShyZWFkZXIpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCAiICsgbmFtZSwgZXgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGluKTsKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCiAgICAgICogQWRkIGEgcmVzb3VyY2UgdG8gdGhlIHNvdXJjZSBsaXN0LgogICAgICAqIEBzaW5jZSBBbnQgMS43LjEKQEAgLTIyOCwxNyArMjU0LDI0IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgcmVzb3VyY2UgY2Fubm90IGJlIHJlYWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2UoUmVzb3VyY2Ugc291cmNlUmVzb3VyY2UpIHsKKyAgICAgICAgaWYgKHNvdXJjZVJlc291cmNlIGluc3RhbmNlb2YgU3RyaW5nUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHNjcmlwdCArPSAoKFN0cmluZ1Jlc291cmNlKSBzb3VyY2VSZXNvdXJjZSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlUmVzb3VyY2UgaW5zdGFuY2VvZiBQcm9wZXJ0eVJlc291cmNlKSB7CisgICAgICAgICAgICBzY3JpcHQgKz0gKChQcm9wZXJ0eVJlc291cmNlKSBzb3VyY2VSZXNvdXJjZSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIFN0cmluZyBuYW1lID0gc291cmNlUmVzb3VyY2UudG9Mb25nU3RyaW5nKCk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluID0gc291cmNlUmVzb3VyY2UuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IHNvdXJjZVJlc291cmNlLmdldElucHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIHJlYWRTb3VyY2UoaW4sIG5hbWUsIENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmFpbGVkIHRvIG9wZW4gIiArIG5hbWUsIGUpOwogICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuICIgKyBuYW1lICsgIiAtaXQgaXMgbm90IHJlYWRhYmxlIiwgZSk7CisgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBvcGVuICIgKyBuYW1lICsgIiAtIGl0IGlzIG5vdCByZWFkYWJsZSIsIGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlYWRTb3VyY2UobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSwgbmFtZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDgsOSArMjgxLDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIGlmIGEgcmVzb3VyY2UgY2Fubm90IGJlIHJlYWQKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBsb2FkUmVzb3VyY2VzKFJlc291cmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBjb2xsZWN0aW9uKSB7Ci0gICAgICAgICAgICBsb2FkUmVzb3VyY2UocmVzb3VyY2UpOwotICAgICAgICB9CisgICAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCh0aGlzOjpsb2FkUmVzb3VyY2UpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzI2LDggKzM1Nyw3IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tMYW5ndWFnZSgpIHsKICAgICAgICAgaWYgKGxhbmd1YWdlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAic2NyaXB0IGxhbmd1YWdlIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInNjcmlwdCBsYW5ndWFnZSBtdXN0IGJlIHNwZWNpZmllZCIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNTYsNSArMzg2LDQgQEAKICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoCiAgICAgICAgICAgICAgICAgIG9yaWdMb2FkZXIpOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXJDcmVhdG9yLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckNyZWF0b3IuamF2YQppbmRleCBiZjNjMmM5Li41MWMwZjMzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckNyZWF0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckNyZWF0b3IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVySGVscGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NjcmlwdFJ1bm5lckhlbHBlci5qYXZhCmluZGV4IGUyNTgxMWQuLmFjZWM3OTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU2NyaXB0UnVubmVySGVscGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TY3JpcHRSdW5uZXJIZWxwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMxLDkgKzMxLDExIEBACiBwdWJsaWMgY2xhc3MgU2NyaXB0UnVubmVySGVscGVyIHsKICAgICBwcml2YXRlIENsYXNzcGF0aFV0aWxzLkRlbGVnYXRlIGNwRGVsZWdhdGUgPSBudWxsOwogICAgIHByaXZhdGUgRmlsZSAgICBzcmNGaWxlOworICAgIHByaXZhdGUgU3RyaW5nICBlbmNvZGluZzsKICAgICBwcml2YXRlIFN0cmluZyAgbWFuYWdlciA9ICJhdXRvIjsKICAgICBwcml2YXRlIFN0cmluZyAgbGFuZ3VhZ2U7CiAgICAgcHJpdmF0ZSBTdHJpbmcgIHRleHQ7CisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBpbGVkID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIHNldEJlYW5zID0gdHJ1ZTsKICAgICBwcml2YXRlIFByb2plY3RDb21wb25lbnQgcHJvamVjdENvbXBvbmVudDsKICAgICBwcml2YXRlIENsYXNzTG9hZGVyIHNjcmlwdExvYWRlciA9IG51bGw7CkBAIC01Myw2ICs1NSwxMiBAQAogICAgICAqLwogICAgIHB1YmxpYyBTY3JpcHRSdW5uZXJCYXNlIGdldFNjcmlwdFJ1bm5lcigpIHsKICAgICAgICAgU2NyaXB0UnVubmVyQmFzZSBydW5uZXIgPSBnZXRSdW5uZXIoKTsKKyAgICAgICAgcnVubmVyLnNldENvbXBpbGVkKGNvbXBpbGVkKTsKKworICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gc2V0IGl0IGZpcnN0LCBiZWNhdXNlIHJ1bm5lci5zZXRTcmMoKSBsb2FkcyBpbW1lZGlhdGVseSB0aGUgZmlsZQorICAgICAgICAgICAgcnVubmVyLnNldEVuY29kaW5nKGVuY29kaW5nKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoc3JjRmlsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICBydW5uZXIuc2V0U3JjKHNyY0ZpbGUpOwogICAgICAgICB9CkBAIC0xMDgsNiArMTE2LDM0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogR2V0IHRoZSBleHRlcm5hbCBzY3JpcHQgZmlsZTsgb3B0aW9uYWwuCisgICAgICogQHJldHVybiB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgc291cmNlLgorICAgICAqIEBzaW5jZSBBbnQgMS4xMC4yCisgICAgICovCisgICAgcHVibGljIEZpbGUgZ2V0U3JjKCkgeworICAgICAgICByZXR1cm4gc3JjRmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVuY29kaW5nIG9mIHRoZSBzY3JpcHQgZnJvbSBhbiBleHRlcm5hbCBmaWxlOyBvcHRpb25hbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2Rpbmcgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgc2NyaXB0IHNvdXJjZS4KKyAgICAgKiBAc2luY2UgQW50IDEuMTAuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleHRlcm5hbCBmaWxlIGVuY29kaW5nLgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kaW5nIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNjcmlwdCBzb3VyY2UuCisgICAgICogQHNpbmNlIEFudCAxLjEwLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQWRkIHNjcmlwdCB0ZXh0LgogICAgICAqCiAgICAgICogQHBhcmFtIHRleHQgYSBjb21wb25lbnQgb2YgdGhlIHNjcmlwdCB0ZXh0IHRvIGJlIGFkZGVkLgpAQCAtMTQzLDYgKzE3OSwyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEVuYWJsZSB0aGUgY29tcGlsYXRpb24gb2YgdGhlIHNjcmlwdCBpZiBwb3NzaWJsZS4KKyAgICAgKiBJZiB0aGlzIGlzIHRydWUgYW5kIHRoZSBjb21waWxhdGlvbiBmZWF0dXJlIGlzIGF2YWlsYWJsZSBpbgorICAgICAqIHRoZSBzY3JpcHQgZW5naW5lLCB0aGUgc2NyaXB0IGlzIGNvbXBpbGVkIGJlZm9yZSB0aGUgZmlyc3QKKyAgICAgKiBldmFsdWF0aW9uLCBhbmQgc2hvdWxkIGJlIGNhY2hlZCBmb3IgZnV0dXJlIGV2YWx1YXRpb25zLgorICAgICAqIE90aGVyd2lzZSwgdGhlIHNjcmlwdCBpcyBldmFsdWF0ZWQgZWFjaCB0aW1lLgorICAgICAqIFRoZSBkZWZhdWx0IGlzIGZhbHNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBpbGVkIHRoZSB2YWx1ZSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29tcGlsZWQoYm9vbGVhbiBjb21waWxlZCkgeworICAgICAgICB0aGlzLmNvbXBpbGVkID0gY29tcGlsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb21waWxhdGlvbiBmZWF0dXJlLgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBpbGF0aW9uIGZlYXR1cmUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Q29tcGlsZWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNvbXBpbGVkOworICAgIH0KKworICAgIC8qKgogICAgICAqIFNldCB0aGUgc2V0YmVhbnMgYXR0cmlidXRlLgogICAgICAqIElmIHRoaXMgaXMgdHJ1ZSwgJmx0O3NjcmlwdCZndDsgd2lsbCBjcmVhdGUgdmFyaWFibGVzIGluIHRoZQogICAgICAqIHNjcmlwdCBpbnN0YW5jZSBmb3IgYWxsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NvdXJjZUZpbGVTY2FubmVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NvdXJjZUZpbGVTY2FubmVyLmphdmEKaW5kZXggYzc5ZjAzNC4uNmMwZGQ4OSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Tb3VyY2VGaWxlU2Nhbm5lci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU291cmNlRmlsZVNjYW5uZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZXNvdXJjZTsKQEAgLTkwLDI4ICs5MCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXIsIGxvbmcgZ3JhbnVsYXJpdHkpIHsKICAgICAgICAgLy8gcmVjb3JkIGRlc3RkaXIgZm9yIGxhdGVyIHVzZSBpbiBnZXRSZXNvdXJjZQogICAgICAgICB0aGlzLmRlc3REaXIgPSBkZXN0RGlyOwotICAgICAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBmaWxlc1tpXTsKLSAgICAgICAgICAgIHYuYWRkRWxlbWVudChuZXcgRmlsZVJlc291cmNlKHNyY0RpciwgbmFtZSkgeworCisgICAgICAgIFJlc291cmNlW10gc291cmNlUmVzb3VyY2VzID0KKyAgICAgICAgICAgIFN0cmVhbS5vZihmaWxlcykubWFwKGYgLT4gbmV3IEZpbGVSZXNvdXJjZShzcmNEaXIsIGYpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICBSZXNvdXJjZVtdIHNvdXJjZXJlc291cmNlcyA9IG5ldyBSZXNvdXJjZVt2LnNpemUoKV07Ci0gICAgICAgIHYuY29weUludG8oc291cmNlcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIH0pLnRvQXJyYXkoUmVzb3VyY2VbXTo6bmV3KTsKIAogICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBzb3VyY2VzIHdoaWNoIGFyZSBvdXQgb2YgZGF0ZSB3aXRoCiAgICAgICAgIC8vIHJlc3BlY3QgdG8gdGhlIHRhcmdldAotICAgICAgICBSZXNvdXJjZVtdIG91dG9mZGF0ZSA9Ci0gICAgICAgICAgICBSZXNvdXJjZVV0aWxzLnNlbGVjdE91dE9mRGF0ZVNvdXJjZXModGFzaywgc291cmNlcmVzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlciwgdGhpcywgZ3JhbnVsYXJpdHkpOwotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW291dG9mZGF0ZS5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBjb3VudGVyID0gMDsgY291bnRlciA8IG91dG9mZGF0ZS5sZW5ndGg7IGNvdW50ZXIrKykgewotICAgICAgICAgICAgcmVzdWx0W2NvdW50ZXJdID0gb3V0b2ZkYXRlW2NvdW50ZXJdLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICByZXR1cm4gU3RyZWFtCisgICAgICAgICAgICAub2YoUmVzb3VyY2VVdGlscy5zZWxlY3RPdXRPZkRhdGVTb3VyY2VzKHRhc2ssIHNvdXJjZVJlc291cmNlcywKKyAgICAgICAgICAgICAgICBtYXBwZXIsIHRoaXMsIGdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgIC5tYXAoUmVzb3VyY2U6OmdldE5hbWUpLnRvQXJyYXkoU3RyaW5nW106Om5ldyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTAsMTIgKzE0Myw4IEBACiAgICAgICovCiAgICAgcHVibGljIEZpbGVbXSByZXN0cmljdEFzRmlsZXMoU3RyaW5nW10gZmlsZXMsIEZpbGUgc3JjRGlyLCBGaWxlIGRlc3REaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5hbWVNYXBwZXIgbWFwcGVyLCBsb25nIGdyYW51bGFyaXR5KSB7Ci0gICAgICAgIFN0cmluZ1tdIHJlcyA9IHJlc3RyaWN0KGZpbGVzLCBzcmNEaXIsIGRlc3REaXIsIG1hcHBlciwgZ3JhbnVsYXJpdHkpOwotICAgICAgICBGaWxlW10gcmVzdWx0ID0gbmV3IEZpbGVbcmVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICByZXN1bHRbaV0gPSBuZXcgRmlsZShzcmNEaXIsIHJlc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihyZXN0cmljdChmaWxlcywgc3JjRGlyLCBkZXN0RGlyLCBtYXBwZXIsIGdyYW51bGFyaXR5KSkKKyAgICAgICAgICAgIC5tYXAobmFtZSAtPiBuZXcgRmlsZShzcmNEaXIsIG5hbWUpKS50b0FycmF5KEZpbGVbXTo6bmV3KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NSw2ICsxNTQsNyBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjUuMgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gbmV3IEZpbGVSZXNvdXJjZShkZXN0RGlyLCBuYW1lKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1NwbGl0Q2xhc3NMb2FkZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3BsaXRDbGFzc0xvYWRlci5qYXZhCmluZGV4IDk4NTc3NTUuLmU5NzM5M2QgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3BsaXRDbGFzc0xvYWRlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3BsaXRDbGFzc0xvYWRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDUsOSArNDUsMTAgQEAKIAogICAgIC8vIGZvcmNlTG9hZENsYXNzIGlzIG5vdCBjb252ZW5pZW50IGhlcmUgc2luY2UgaXQgd291bGQgbm90CiAgICAgLy8gcHJvcGVybHkgZGVhbCB3aXRoIGlubmVyIGNsYXNzZXMgb2YgdGhlc2UgY2xhc3Nlcy4KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIENsYXNzIGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NuYW1lLCBib29sZWFuIHJlc29sdmUpCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBDbGFzczw/PiBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzbmFtZSwgYm9vbGVhbiByZXNvbHZlKQogICAgICAgICB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIENsYXNzIHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7CisgICAgICAgIENsYXNzPD8+IHRoZUNsYXNzID0gZmluZExvYWRlZENsYXNzKGNsYXNzbmFtZSk7CiAgICAgICAgIGlmICh0aGVDbGFzcyAhPSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gdGhlQ2xhc3M7CiAgICAgICAgIH0KQEAgLTU3LDkgKzU4LDggQEAKICAgICAgICAgICAgICAgICByZXNvbHZlQ2xhc3ModGhlQ2xhc3MpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHRoZUNsYXNzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmxvYWRDbGFzcyhjbGFzc25hbWUsIHJlc29sdmUpOwogICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5sb2FkQ2xhc3MoY2xhc3NuYW1lLCByZXNvbHZlKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGxpdChTdHJpbmcgY2xhc3NuYW1lKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N0cmVhbVV0aWxzLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N0cmVhbVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxOTBkYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyZWFtVXRpbHMuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU3BsaXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLlNwbGl0ZXJhdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitwdWJsaWMgY2xhc3MgU3RyZWFtVXRpbHMgeworICAgIC8qKgorICAgICAqIFR1cm4gRW51bWVyYXRpb24gaW50byBhIFN0cmVhbQorICAgICAqCisgICAgICogQHBhcmFtIDxUPiBFbnVtZXJhdGlvbiB0eXBlCisgICAgICogQHBhcmFtIGUgRW51bWVyYXRpb24KKyAgICAgKiBAcmV0dXJuIFN0cmVhbQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFN0cmVhbTxUPiBlbnVtZXJhdGlvbkFzU3RyZWFtKEVudW1lcmF0aW9uPFQ+IGUpIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKAorICAgICAgICAgICAgICAgIG5ldyBTcGxpdGVyYXRvcnMuQWJzdHJhY3RTcGxpdGVyYXRvcjxUPihMb25nLk1BWF9WQUxVRSwgU3BsaXRlcmF0b3IuT1JERVJFRCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB0cnlBZHZhbmNlKENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5hY2NlcHQoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmb3JFYWNoUmVtYWluaW5nKENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbi5hY2NlcHQoZS5uZXh0RWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXJuIEl0ZXJhdG9yIGludG8gYSBTdHJlYW0KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gSXRlcmF0b3IgdHlwZQorICAgICAqIEBwYXJhbSBpIEl0ZXJhdG9yCisgICAgICogQHJldHVybiBTdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTdHJlYW08VD4gaXRlcmF0b3JBc1N0cmVhbShJdGVyYXRvcjxUPiBpKSB7CisgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbSgKKyAgICAgICAgICAgICAgICBTcGxpdGVyYXRvcnMuc3BsaXRlcmF0b3JVbmtub3duU2l6ZShpLCBTcGxpdGVyYXRvci5PUkRFUkVEKSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVG9rZW5pemVyLmphdmEKaW5kZXggMWUzYThhOS4uMzg1NzkxNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdUb2tlbml6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N0cmluZ1Rva2VuaXplci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtOTYsMTggKzk2LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgYm9vbGVhbiBpblRva2VuID0gdHJ1ZTsKICAgICAgICAgaW50cmFTdHJpbmcgPSAiIjsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHdvcmQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBwYWRkaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHdvcmQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHBhZGRpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICB3aGlsZSAoY2ggIT0gLTEpIHsKICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKSBjaDsKICAgICAgICAgICAgIGJvb2xlYW4gaXNEZWxpbSA9IGlzRGVsaW0oYyk7CiAgICAgICAgICAgICBpZiAoaW5Ub2tlbikgewogICAgICAgICAgICAgICAgIGlmIChpc0RlbGltKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbXNBcmVUb2tlbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLmFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod29yZC5sZW5ndGgoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoZWQgPSBjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5hcHBlbmQoYyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTE2LDEzICsxMTYsMTEgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB3b3JkLmFwcGVuZChjKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzRGVsaW0pIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nLmFwcGVuZChjKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRGVsaW0pIHsKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZy5hcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHVzaGVkID0gY2g7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXNoZWQgPSBjaDsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNoID0gaW4ucmVhZCgpOwogICAgICAgICB9CkBAIC0xMzYsNiArMTM0LDcgQEAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIHRoZSBpbnRyYXRva2VuIHN0cmluZwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdFRva2VuKCkgewogICAgICAgICByZXR1cm4gc3VwcHJlc3NEZWxpbXMgfHwgaW5jbHVkZURlbGltcyA/ICIiIDogaW50cmFTdHJpbmc7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCmluZGV4IGEzODc4MjEuLmVhM2RhOTYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N0cmluZ1V0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw3ICsxOSwxMSBAQAogCiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiAKQEAgLTQxLDExICs0NSwxMiBAQAogICAgIH0KIAogICAgIC8qKiB0aGUgbGluZSBzZXBhcmF0b3IgZm9yIHRoaXMgT1MgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1NFUCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQID0gU3lzdGVtLmxpbmVTZXBhcmF0b3IoKTsKIAogICAgIC8qKgogICAgICAqIFNwbGl0cyB1cCBhIHN0cmluZyBpbnRvIGEgbGlzdCBvZiBsaW5lcy4gSXQgaXMgZXF1aXZhbGVudAotICAgICAqIHRvIDx0dD5zcGxpdChkYXRhLCAnXG4nKTwvdHQ+LgorICAgICAqIHRvIDxjb2RlPnNwbGl0KGRhdGEsICdcbicpPC9jb2RlPi4KICAgICAgKiBAcGFyYW0gZGF0YSB0aGUgc3RyaW5nIHRvIHNwbGl0IHVwIGludG8gbGluZXMuCiAgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBsaW5lcyBhdmFpbGFibGUgaW4gdGhlIHN0cmluZy4KICAgICAgKi8KQEAgLTYxLDcgKzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVmVjdG9yPFN0cmluZz4gc3BsaXQoU3RyaW5nIGRhdGEsIGludCBjaCkgewotICAgICAgICBWZWN0b3I8U3RyaW5nPiBlbGVtcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBWZWN0b3I8U3RyaW5nPiBlbGVtcyA9IG5ldyBWZWN0b3I8PigpOwogICAgICAgICBpbnQgcG9zID0gLTE7CiAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgd2hpbGUgKChwb3MgPSBkYXRhLmluZGV4T2YoY2gsIGkpKSAhPSAtMSkgewpAQCAtMTI0LDcgKzEyOSw3IEBACiAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGlzIG9rIHRob3VnaCBkb2VzIGFsbG9jYXRpb24vY29weWluZwogICAgICAgICAvLyBTdHJpbmdCdWZmZXIudG9TdHJpbmcoKS5lbmRzV2l0aCgpIGRvZXMgbWFzc2l2ZSBtZW1vcnkKICAgICAgICAgLy8gYWxsb2NhdGlvbi9jb3B5aW5nIG9uIEpESyAxLjUKLSAgICAgICAgLy8gU2VlIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzcxNjkKKyAgICAgICAgLy8gU2VlIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3MTY5CiAgICAgICAgIGludCBlbmRJbmRleCA9IHN1ZmZpeC5sZW5ndGgoKSAtIDE7CiAgICAgICAgIGludCBidWZmZXJJbmRleCA9IGJ1ZmZlci5sZW5ndGgoKSAtIDE7CiAgICAgICAgIHdoaWxlIChlbmRJbmRleCA+PSAwKSB7CkBAIC0xNDksNyArMTU0LDcgQEAKICAgICAgKiBAc2luY2UgQW50IDEuNwogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVCYWNrU2xhc2goU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBiID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBib29sZWFuIGJhY2tTbGFzaFNlZW4gPSBmYWxzZTsKICAgICAgICAgZm9yIChmaW5hbCBjaGFyIGMgOiBpbnB1dC50b0NoYXJBcnJheSgpKSB7CiAgICAgICAgICAgICBpZiAoIWJhY2tTbGFzaFNlZW4pIHsKQEAgLTE2MSwxOSArMTY2LDE5IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgoY2hhcikgJ1xcJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXFwnKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKChjaGFyKSAnXG4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoKGNoYXIpICdccicpOworICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoJ1xyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgoY2hhcikgJ1x0Jyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiLmFwcGVuZCgnXHQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKChjaGFyKSAnXGYnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcZicpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoIiBcdFxuXHJcZiIpOwpAQCAtMjUxLDkgKzI1Niw4IEBACiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlU3VmZml4KFN0cmluZyBzdHJpbmcsIFN0cmluZyBzdWZmaXgpIHsKICAgICAgICAgaWYgKHN0cmluZy5lbmRzV2l0aChzdWZmaXgpKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBzdHJpbmcubGVuZ3RoKCkgLSBzdWZmaXgubGVuZ3RoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY2LDggKzI3MCw1NSBAQAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZVByZWZpeChTdHJpbmcgc3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7CiAgICAgICAgIGlmIChzdHJpbmcuc3RhcnRzV2l0aChwcmVmaXgpKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhwcmVmaXgubGVuZ3RoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgIH0KKworICAgIC8qKgorICAgICAqIEpvaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzIG9mIGEgY29sbGVjdGlvbiB0bworICAgICAqIGEgam9pbmVkIHN0cmluZyB3aXRoIGEgZ2l2ZW4gc2VwYXJhdG9yLgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIENvbGxlY3Rpb24gb2YgdGhlIGRhdGEgdG8gYmUgam9pbmVkIChtYXkgYmUgbnVsbCkKKyAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciBiZXR3ZWVuIGVsZW1lbnRzIChtYXkgYmUgbnVsbCkKKyAgICAgKiBAcmV0dXJuIHRoZSBqb2luZWQgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgam9pbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IpIHsKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnN0cmVhbSgpLm1hcChTdHJpbmc6OnZhbHVlT2YpCisgICAgICAgICAgICAuY29sbGVjdChqb2luaW5nKHNlcGFyYXRvcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpvaW5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVsZW1lbnRzIG9mIGFuIGFycmF5IHRvCisgICAgICogYSBqb2luZWQgc3RyaW5nIHdpdGggYSBnaXZlbiBzZXBhcmF0b3IuCisgICAgICogQHBhcmFtIGFycmF5IEFycmF5IG9mIHRoZSBkYXRhIHRvIGJlIGpvaW5lZCAobWF5IGJlIG51bGwpCisgICAgICogQHBhcmFtIHNlcGFyYXRvciBTZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyAobWF5IGJlIG51bGwpCisgICAgICogQHJldHVybiB0aGUgam9pbmVkIHN0cmluZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGpvaW4oT2JqZWN0W10gYXJyYXksIENoYXJTZXF1ZW5jZSBzZXBhcmF0b3IpIHsKKyAgICAgICAgaWYgKGFycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gam9pbihBcnJheXMuYXNMaXN0KGFycmF5KSwgc2VwYXJhdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0b3I8Q2hhclNlcXVlbmNlLCA/LCBTdHJpbmc+IGpvaW5pbmcoQ2hhclNlcXVlbmNlIHNlcGFyYXRvcikgeworICAgICAgICByZXR1cm4gc2VwYXJhdG9yID09IG51bGwgPyBDb2xsZWN0b3JzLmpvaW5pbmcoKSA6IENvbGxlY3RvcnMuam9pbmluZyhzZXBhcmF0b3IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmluZyBTdHJpbmcgdG8gdHJpbQorICAgICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgaW5wdXQgc3RyaW5nIGlzIG51bGwgb3IgZW1wdHkgb3IgY29udGFpbiBvbmx5IGVtcHR5IHNwYWNlcy4KKyAgICAgKiBJdCByZXR1cm5zIHRoZSBpbnB1dCBzdHJpbmcgd2l0aG91dCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHJpbVRvTnVsbChTdHJpbmcgaW5wdXRTdHJpbmcpIHsKKyAgICAgICAgaWYgKGlucHV0U3RyaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIFN0cmluZyB0bXBTdHJpbmcgPSBpbnB1dFN0cmluZy50cmltKCk7CisgICAgICAgIHJldHVybiB0bXBTdHJpbmcuaXNFbXB0eSgpID8gbnVsbCA6IHRtcFN0cmluZzsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3ltYm9saWNMaW5rVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3ltYm9saWNMaW5rVXRpbHMuamF2YQppbmRleCAyNmQyNWU2Li43YTVmN2VkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N5bWJvbGljTGlua1V0aWxzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TeW1ib2xpY0xpbmtVdGlscy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksNyArMTksNiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtMzIsMTUgKzMxLDE4IEBACiAgKiBhIHN5bWJvbGljIGxpbmsgYmFzZWQgb24gdGhlIGFic2VudCBzdXBwb3J0IGZvciB0aGVtIGluIEphdmEuCiAgKgogICogQHNpbmNlIEFudCAxLjguMAorICogQGRlcHJlY2F0ZWQgU3RhcnRpbmcgQW50IDEuMTAuMiwgdGhpcyBjbGFzcyBpcyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvdXIKKyAqICAgICAgICAgICAgICBvZiB0aGUgSmF2YSB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlc30gQVBJcyBpbnRyb2R1Y2VkIGluCisgKiAgICAgICAgICAgICAgSmF2YSA3LCBmb3IgZGVhbGluZyB3aXRoIHN5bWJvbGljIGxpbmtzCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgU3ltYm9saWNMaW5rVXRpbHMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwogCiAgICAgLyoqCiAgICAgICogU2hhcmVkIGluc3RhbmNlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN5bWJvbGljTGlua1V0aWxzIFBSSU1BUllfSU5TVEFOQ0UgPQotICAgICAgICBuZXcgU3ltYm9saWNMaW5rVXRpbHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTeW1ib2xpY0xpbmtVdGlscyBQUklNQVJZX0lOU1RBTkNFID0gbmV3IFN5bWJvbGljTGlua1V0aWxzKCk7CiAKICAgICAvKioKICAgICAgKiBNZXRob2QgdG8gcmV0cmlldmUgVGhlIFN5bWJvbGljTGlua1V0aWxzLCB3aGljaCBpcyBzaGFyZWQgYnkKQEAgLTE3NywxMSArMTc5LDcgQEAKICAgICAgICAgZmluYWwgRmlsZSBmID0gbmV3IEZpbGUocGFyZW50LCBuYW1lKTsKICAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxOYW1lID0gZi5nZXROYW1lKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBjID0gcGFyZW50Lmxpc3QobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoZmluYWwgRmlsZSBkLCBmaW5hbCBTdHJpbmcgbikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsTmFtZS5lcXVhbHMobik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGMgPSBwYXJlbnQubGlzdCgoZCwgbikgLT4gbG9jYWxOYW1lLmVxdWFscyhuKSk7CiAgICAgICAgICAgICByZXR1cm4gYyAhPSBudWxsICYmIGMubGVuZ3RoID4gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0yOTYsOCArMjk0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFeGVjdXRlLnJ1bkNvbW1hbmQodGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJybSIsIGxpbmsuZ2V0QWJzb2x1dGVQYXRoKCl9KTsKKyAgICAgICAgICAgIEV4ZWN1dGUucnVuQ29tbWFuZCh0YXNrLCAicm0iLCBsaW5rLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9UYXNrTG9nZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rhc2tMb2dnZXIuamF2YQppbmRleCA5Y2U1YzUxLi5hNzA5ZDQ3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rhc2tMb2dnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rhc2tMb2dnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVGVlT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RlZU91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGViOGRhM2YuLjk5OWQwOWYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVGVlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9UZWVPdXRwdXRTdHJlYW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQzLDYgKzQzLDcgQEAKICAgICAgKiBDbG9zZSBib3RoIG91dHB1dCBzdHJlYW1zLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgbGVmdC5jbG9zZSgpOwpAQCAtNTUsNiArNTYsNyBAQAogICAgICAqIEZsdXNoIGJvdGggb3V0cHV0IHN0cmVhbXMuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbGVmdC5mbHVzaCgpOwogICAgICAgICByaWdodC5mbHVzaCgpOwpAQCAtNjUsNiArNjcsNyBAQAogICAgICAqIEBwYXJhbSBiIGFuIGFycmF5IG9mIGJ5dGVzLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGxlZnQud3JpdGUoYik7CiAgICAgICAgIHJpZ2h0LndyaXRlKGIpOwpAQCAtNzcsNiArODAsNyBAQAogICAgICAqIEBwYXJhbSBsZW4gICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gb24gZXJyb3IuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGxlZnQud3JpdGUoYiwgb2ZmLCBsZW4pOwogICAgICAgICByaWdodC53cml0ZShiLCBvZmYsIGxlbik7CkBAIC04Nyw5ICs5MSw5IEBACiAgICAgICogQHBhcmFtIGIgdGhlIGJ5dGUgdG8gd3JpdGUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvci4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgbGVmdC53cml0ZShiKTsKICAgICAgICAgcmlnaHQud3JpdGUoYik7CiAgICAgfQogfQotCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RpbWVvdXRPYnNlcnZlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9UaW1lb3V0T2JzZXJ2ZXIuamF2YQppbmRleCBjMTQyZDNjLi5jZDI4NzkzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1RpbWVvdXRPYnNlcnZlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVGltZW91dE9ic2VydmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rva2VuaXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Ub2tlbml6ZXIuamF2YQppbmRleCAyNWY4OTY1Li43Mzc2NTY4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Rva2VuaXplci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVG9rZW5pemVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VVRW5jb2Rlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9VVUVuY29kZXIuamF2YQppbmRleCBiMGM2NzM3Li44MDI3NGQ2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VVRW5jb2Rlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVVVFbmNvZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIAogLyoqCi0gKiBVVUVuY29kaW5nIG9mIGFuIGlucHV0IHN0cmVhbSBwbGFjZWQgaW50byBhbiBvdXRwdXRzdHJlYW0uCisgKiBVVUVuY29kaW5nIG9mIGFuIGlucHV0IHN0cmVhbSBwbGFjZWQgaW50byBhbiBPdXRwdXRTdHJlYW0uCiAgKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIGEgZHJvcCBpbiByZXBsYWNlbWVudCBmb3IKICAqIHN1bi5taXNjLlVVRW5jb2Rlciwgd2hpY2ggd2FzIHByZXZpb3VzbHkgdXNlZCBieSBBbnQuCiAgKiBUaGUgdXVlbmNvZGUgYWxnb3JpdGhtIGNvZGUgaGFzIGJlZW4gY29waWVkIGZyb20gdGhlCkBAIC04NywxMSArODcsMTEgQEAKICAgICAgICAgd3JpdGVyLmZsdXNoKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGVuY29kZUJlZ2luKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlQmVnaW4oKSB7CiAgICAgICAgIGVuY29kZVN0cmluZygiYmVnaW4gIiArIERFRkFVTFRfTU9ERSArICIgIiArIG5hbWUgKyAiXG4iKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZW5jb2RlRW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlRW5kKCkgewogICAgICAgICBlbmNvZGVTdHJpbmcoIiBcbmVuZFxuIik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlci5qYXZhCmluZGV4IDE3NzcyNzkuLjVkMDRmOWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzksNiArMzksNyBAQAogICAgICAqQHBhcmFtICBuYW1lICBTb3VyY2UgZmlsZW5hbWUKICAgICAgKkByZXR1cm4gICAgICAgUmVwbGFjZWQgdmFyaWFibGUgcGFydAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFZhcmlhYmxlUGFydChTdHJpbmcgbmFtZSkgewogICAgICAgICBTdHJpbmcgdmFyID0gbmFtZS5zdWJzdHJpbmcocHJlZml4TGVuZ3RoLAogICAgICAgICAgICAgICAgIG5hbWUubGVuZ3RoKCkgLSBwb3N0Zml4TGVuZ3RoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5pY29kZVV0aWwuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5pY29kZVV0aWwuamF2YQppbmRleCA4NjE5OWQ0Li5mMDU1NDkxIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuaWNvZGVVdGlsLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Vbmljb2RlVXRpbC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9WZWN0b3JTZXQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVmVjdG9yU2V0LmphdmEKaW5kZXggZGIxMzEyOS4uZTY4YTlmNiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9WZWN0b3JTZXQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1ZlY3RvclNldC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDAsMTEgKzQwLDE1IEBACiBwdWJsaWMgZmluYWwgY2xhc3MgVmVjdG9yU2V0PEU+IGV4dGVuZHMgVmVjdG9yPEU+IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAotICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDxFPigpOworICAgIHByaXZhdGUgZmluYWwgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KCk7CiAKLSAgICBwdWJsaWMgVmVjdG9yU2V0KCkgeyBzdXBlcigpOyB9CisgICAgcHVibGljIFZlY3RvclNldCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CiAKLSAgICBwdWJsaWMgVmVjdG9yU2V0KGludCBpbml0aWFsQ2FwYWNpdHkpIHsgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsgfQorICAgIHB1YmxpYyBWZWN0b3JTZXQoaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHkpOworICAgIH0KIAogICAgIHB1YmxpYyBWZWN0b3JTZXQoaW50IGluaXRpYWxDYXBhY2l0eSwgaW50IGNhcGFjaXR5SW5jcmVtZW50KSB7CiAgICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgY2FwYWNpdHlJbmNyZW1lbnQpOwpAQCAtNTIsMTIgKzU2LDExIEBACiAKICAgICBwdWJsaWMgVmVjdG9yU2V0KENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKICAgICAgICAgaWYgKGMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChFIGUgOiBjKSB7Ci0gICAgICAgICAgICAgICAgYWRkKGUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5hZGRBbGwoYyk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkKEUgbykgewogICAgICAgICBpZiAoIXNldC5jb250YWlucyhvKSkgewogICAgICAgICAgICAgZG9BZGQoc2l6ZSgpLCBvKTsKQEAgLTcwLDYgKzczLDcgQEAKICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIG1heSBub3QgYWRkIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleAogICAgICAqIGlmIGl0IGlzIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgbykgewogICAgICAgICBkb0FkZChpbmRleCwgbyk7CiAgICAgfQpAQCAtODksMTAgKzkzLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRWxlbWVudChFIG8pIHsKICAgICAgICAgZG9BZGQoc2l6ZSgpLCBvKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgIGZvciAoRSBlIDogYykgewpAQCAtMTA1LDggKzExMSw5IEBACiAgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtYXkgbm90IGFkZCBhbGwgZWxlbWVudHMgYXQgdGhlIGdpdmVuIGluZGV4CiAgICAgICogaWYgYW55IG9mIHRoZW0gYXJlIGFscmVhZHkgY29udGFpbmVkIGluIHRoZSBjb2xsZWN0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0gICAgICAgIExpbmtlZExpc3QgdG9BZGQgPSBuZXcgTGlua2VkTGlzdCgpOworICAgICAgICBMaW5rZWRMaXN0PEU+IHRvQWRkID0gbmV3IExpbmtlZExpc3Q8PigpOwogICAgICAgICBmb3IgKEUgZSA6IGMpIHsKICAgICAgICAgICAgIGlmIChzZXQuYWRkKGUpKSB7CiAgICAgICAgICAgICAgICAgdG9BZGQuYWRkKGUpOwpAQCAtMTI4LDExICsxMzUsMTMgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewogICAgICAgICBzdXBlci5jbGVhcigpOwogICAgICAgICBzZXQuY2xlYXIoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgT2JqZWN0IGNsb25lKCkgewogICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICAgICAgZmluYWwgVmVjdG9yU2V0PEU+IHZzID0gKFZlY3RvclNldDxFPikgc3VwZXIuY2xvbmUoKTsKQEAgLTE0MCwyNCArMTQ5LDI5IEBACiAgICAgICAgIHJldHVybiB2czsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKICAgICAgICAgcmV0dXJuIHNldC5jb250YWlucyhvKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CiAgICAgICAgIHJldHVybiBzZXQuY29udGFpbnNBbGwoYyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5zZXJ0RWxlbWVudEF0KEUgbywgaW50IGluZGV4KSB7CiAgICAgICAgIGRvQWRkKGluZGV4LCBvKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgcmVtb3ZlKGludCBpbmRleCkgewogICAgICAgICBFIG8gPSBnZXQoaW5kZXgpOwogICAgICAgICByZW1vdmUobyk7CiAgICAgICAgIHJldHVybiBvOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewogICAgICAgICByZXR1cm4gZG9SZW1vdmUobyk7CiAgICAgfQpAQCAtMTc3LDYgKzE5MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewogICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChPYmplY3QgbyA6IGMpIHsKQEAgLTE4NSwzMCArMjAwLDM1IEBACiAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbGxFbGVtZW50cygpIHsKICAgICAgICAgc2V0LmNsZWFyKCk7CiAgICAgICAgIHN1cGVyLnJlbW92ZUFsbEVsZW1lbnRzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlRWxlbWVudChPYmplY3QgbykgewogICAgICAgICByZXR1cm4gZG9SZW1vdmUobyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUVsZW1lbnRBdChpbnQgaW5kZXgpIHsKICAgICAgICAgcmVtb3ZlKGdldChpbmRleCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVSYW5nZShmaW5hbCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewogICAgICAgICB3aGlsZSAodG9JbmRleCA+IGZyb21JbmRleCkgewogICAgICAgICAgICAgcmVtb3ZlKC0tdG9JbmRleCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewogICAgICAgICBpZiAoIShjIGluc3RhbmNlb2YgU2V0KSkgewotICAgICAgICAgICAgYyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oYyk7CisgICAgICAgICAgICBjID0gbmV3IEhhc2hTZXQ8PihjKTsKICAgICAgICAgfQotICAgICAgICBMaW5rZWRMaXN0PEU+IGwgPSBuZXcgTGlua2VkTGlzdDxFPigpOworICAgICAgICBMaW5rZWRMaXN0PEU+IGwgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgICAgIGZvciAoRSBvIDogdGhpcykgewogICAgICAgICAgICAgaWYgKCFjLmNvbnRhaW5zKG8pKSB7CiAgICAgICAgICAgICAgICAgbC5hZGRMYXN0KG8pOwpAQCAtMjIxLDYgKzI0MSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIEUgc2V0KGludCBpbmRleCwgRSBvKSB7CiAgICAgICAgIEUgb3JpZyA9IGdldChpbmRleCk7CiAgICAgICAgIGlmIChzZXQuYWRkKG8pKSB7CkBAIC0yMzUsNiArMjU2LDcgQEAKICAgICAgICAgcmV0dXJuIG9yaWc7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudEF0KEUgbywgaW50IGluZGV4KSB7CiAgICAgICAgIHNldChpbmRleCwgbyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XYXRjaGRvZy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XYXRjaGRvZy5qYXZhCmluZGV4IDMxOGI1MjYuLjYyNDRmMjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV2F0Y2hkb2cuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1dhdGNoZG9nLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw4ICsxOCw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiAvKioKICAqIEdlbmVyYWxpemF0aW9uIG9mIDxjb2RlPkV4ZWN1dGVXYXRjaGRvZzwvY29kZT4KQEAgLTMxLDE5ICszMiwyMiBAQAogICovCiBwdWJsaWMgY2xhc3MgV2F0Y2hkb2cgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAKLSAgICBwcml2YXRlIFZlY3RvciBvYnNlcnZlcnMgPSBuZXcgVmVjdG9yKDEpOwotICAgIHByaXZhdGUgbG9uZyB0aW1lb3V0ID0gLTE7Ci0gICAgLyoqCi0gICAgICogbWFya2VkIGFzIHZvbGF0aWxlIHRvIHN0b3AgdGhlIGNvbXBpbGVyIGNhY2hpbmcgdmFsdWVzIG9yIChpbiBqYXZhMS41KywKLSAgICAgKiByZW9yZGVyaW5nIGFjY2VzcykKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOwogICAgIC8qKgogICAgICAqIEVycm9yIHN0cmluZy4KICAgICAgKiB7QHZhbHVlfQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX0lOVkFMSURfVElNRU9VVCA9ICJ0aW1lb3V0IGxlc3MgdGhhbiAxLiI7CiAKKyAgICBwcml2YXRlIExpc3Q8VGltZW91dE9ic2VydmVyPiBvYnNlcnZlcnMgPQorICAgICAgICBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3Q8PigxKSk7CisgICAgcHJpdmF0ZSBsb25nIHRpbWVvdXQgPSAtMTsKKworICAgIC8qKgorICAgICAqIG1hcmtlZCBhcyB2b2xhdGlsZSB0byBzdG9wIHRoZSBjb21waWxlciBjYWNoaW5nIHZhbHVlcyBvciAoaW4gamF2YTEuNSssCisgICAgICogcmVvcmRlcmluZyBhY2Nlc3MpCisgICAgICovCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BwZWQgPSBmYWxzZTsKKwogICAgIC8qKgogICAgICAqIENvbnN0cnVjdG9yIGZvciBXYXRjaGRvZy4KICAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgdGltZW91dCB0byB1c2UgaW4gbWlsbGlzZWNvbmRzIChtdXN0IGJlICZndDs9IDEpLgpAQCAtNjAsOCArNjQsNyBAQAogICAgICAqIEBwYXJhbSB0byB0aGUgdGltZW91dCBvYnNlcnZlciB0byBhZGQuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkVGltZW91dE9ic2VydmVyKFRpbWVvdXRPYnNlcnZlciB0bykgewotICAgICAgICAvL25vIG5lZWQgdG8gc3luY2hyb25pemUsIGFzIFZlY3RvciBpcyBhbHdheXMgc3luY2hyb25pemVkCi0gICAgICAgIG9ic2VydmVycy5hZGRFbGVtZW50KHRvKTsKKyAgICAgICAgb2JzZXJ2ZXJzLmFkZCh0byk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OSw4ICs3Miw3IEBACiAgICAgICogQHBhcmFtIHRvIHRoZSB0aW1lb3V0IG9ic2VydmVyIHRvIHJlbW92ZS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZW1vdmVUaW1lb3V0T2JzZXJ2ZXIoVGltZW91dE9ic2VydmVyIHRvKSB7Ci0gICAgICAgIC8vbm8gbmVlZCB0byBzeW5jaHJvbml6ZSwgYXMgVmVjdG9yIGlzIGFsd2F5cyBzeW5jaHJvbml6ZWQKLSAgICAgICAgb2JzZXJ2ZXJzLnJlbW92ZUVsZW1lbnQodG8pOworICAgICAgICBvYnNlcnZlcnMucmVtb3ZlKHRvKTsKICAgICB9CiAKICAgICAvKioKQEAgLTc4LDEwICs4MCw3IEBACiAgICAgICogVGhpcyBoYXBwZW5zIGluIHRoZSB3YXRjaGRvZyB0aHJlYWQuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRpbWVvdXRPY2N1cmVkKCkgewotICAgICAgICBFbnVtZXJhdGlvbiBlID0gb2JzZXJ2ZXJzLmVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAoKFRpbWVvdXRPYnNlcnZlcikgZS5uZXh0RWxlbWVudCgpKS50aW1lb3V0T2NjdXJlZCh0aGlzKTsKLSAgICAgICAgfQorICAgICAgICBvYnNlcnZlcnMuZm9yRWFjaChvIC0+IG8udGltZW91dE9jY3VyZWQodGhpcykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA4LDYgKzEwNyw3IEBACiAgICAgICogaWYgdGhlIHN0b3AgZmxhZyBoYXMgbm90IGJlZW4gc2V0IHdoZW4gdGhlIHdhaXQgaGFzIHJldHVybmVkIG9yCiAgICAgICogaGFzIGJlZW4gaW50ZXJydXB0ZWQsIHRoZSB3YXRjaCBkb2cgbGlzdGVuZXJzIGFyZSBpbmZvcm1lZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcnVuKCkgewogICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBmaW5hbCBsb25nIHVudGlsID0gbm93ICsgdGltZW91dDsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV2Vha2lzaFJlZmVyZW5jZS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XZWFraXNoUmVmZXJlbmNlLmphdmEKaW5kZXggODE2ZWU0ZS4uZjM5NWYxZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XZWFraXNoUmVmZXJlbmNlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9XZWFraXNoUmVmZXJlbmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNCw2ICszNCw3IEBACiAgKiBAZGVwcmVjYXRlZCBkZXByZWNhdGVkIDEuNzsgd2lsbCBiZSByZW1vdmVkIGluIEFudDEuOAogICogICAgICAgICAgICAgSnVzdCB1c2Uge0BsaW5rIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZX0gZGlyZWN0bHkuCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgV2Vha2lzaFJlZmVyZW5jZSAgewogCiAKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgICAgKiBAc2VlIGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZQogICAgICAqLwogICAgIFdlYWtpc2hSZWZlcmVuY2UoT2JqZWN0IHJlZmVyZW5jZSkgewotICAgICAgICB0aGlzLndlYWtyZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxPYmplY3Q+KHJlZmVyZW5jZSk7CisgICAgICAgIHRoaXMud2Vha3JlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4ocmVmZXJlbmNlKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV29ya2VyQW50LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1dvcmtlckFudC5qYXZhCmluZGV4IGIyMmJlNTAuLjVjMzg5NGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvV29ya2VyQW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Xb3JrZXJBbnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWE1MRnJhZ21lbnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWE1MRnJhZ21lbnQuamF2YQppbmRleCAzNmE2MTU4Li5iNjkyMDI4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1hNTEZyYWdtZW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzQsOSArNzQsMTAgQEAKICAgICAgKiBAcGFyYW0gcU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBuZXN0ZWQgZWxlbWVudAogICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgdGhlIGVsZW1lbnQgaXMgYXBwbGllZCB0bwogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRHluYW1pY0VsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxTmFtZSkgewotICAgICAgICBFbGVtZW50IGUgPSBudWxsOwotICAgICAgICBpZiAodXJpLmVxdWFscygiIikpIHsKKyAgICAgICAgRWxlbWVudCBlOworICAgICAgICBpZiAodXJpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgZSA9IGRvYy5jcmVhdGVFbGVtZW50KG5hbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZSA9IGRvYy5jcmVhdGVFbGVtZW50TlModXJpLCBxTmFtZSk7CkBAIC05Myw3ICs5NCw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIGFkZFRleHQoTm9kZSBuLCBTdHJpbmcgcykgewogICAgICAgICBzID0gZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHMpOwogICAgICAgICAvL29ubHkgdGV4dCBub2RlcyB0aGF0IGFyZSBub24gbnVsbCBhZnRlciBwcm9wZXJ0eSBleHBhbnNpb24gYXJlIGFkZGVkCi0gICAgICAgIGlmIChzICE9IG51bGwgJiYgIXMudHJpbSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgaWYgKHMgIT0gbnVsbCAmJiAhcy50cmltKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBUZXh0IHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUocy50cmltKCkpOwogICAgICAgICAgICAgbi5hcHBlbmRDaGlsZCh0KTsKICAgICAgICAgfQpAQCAtMTI0LDkgKzEyNSwxMCBAQAogICAgICAgICAgKiBAcGFyYW0gcU5hbWUgdGhlIHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKICAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCiAgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgc2V0RHluYW1pY0F0dHJpYnV0ZSgKICAgICAgICAgICAgIFN0cmluZyB1cmksIFN0cmluZyBuYW1lLCBTdHJpbmcgcU5hbWUsIFN0cmluZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKHVyaS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBpZiAodXJpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZS5zZXRBdHRyaWJ1dGVOUyh1cmksIHFOYW1lLCB2YWx1ZSk7CkBAIC0xNDAsOSArMTQyLDEwIEBACiAgICAgICAgICAqIEBwYXJhbSBxTmFtZSB0aGUgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5lc3RlZCBlbGVtZW50CiAgICAgICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRoYXQgdGhlIGVsZW1lbnQgaXMgYXBwbGllZCB0bwogICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlRHluYW1pY0VsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUsIFN0cmluZyBxTmFtZSkgewogICAgICAgICAgICAgRWxlbWVudCBlMiA9IG51bGw7Ci0gICAgICAgICAgICBpZiAodXJpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGlmICh1cmkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgZTIgPSBkb2MuY3JlYXRlRWxlbWVudChuYW1lKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZTIgPSBkb2MuY3JlYXRlRWxlbWVudE5TKHVyaSwgcU5hbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YbWxDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWG1sQ29uc3RhbnRzLmphdmEKaW5kZXggZDhlYWEwMi4uYWEwZDViMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YbWxDb25zdGFudHMuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1htbENvbnN0YW50cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksOCArMTksOCBAQAogCiAvKioKICAqIFhNTCBQYXJzZXIgY29uc3RhbnRzLCBhbGwga2VwdCBpbiBvbmUgcGxhY2UgZm9yIGVhc2Ugb2YgcmV1c2UKLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL2ZlYXR1cmVzLmh0bWwiPlhlcmNlcyBmZWF0dXJlczwvYT4KLSAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL3Byb3BlcnRpZXMuaHRtbCI+WGVyY2VzIHByb3BlcnRpZXM8L2E+CisgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8veG1sLmFwYWNoZS5vcmcveGVyY2VzLWovZmVhdHVyZXMuaHRtbCI+WGVyY2VzIGZlYXR1cmVzPC9hPgorICogQHNlZSA8YSBocmVmPSJodHRwczovL3htbC5hcGFjaGUub3JnL3hlcmNlcy1qL3Byb3BlcnRpZXMuaHRtbCI+WGVyY2VzIHByb3BlcnRpZXM8L2E+CiAgKiBAc2VlIDxhIGhyZWY9CiAgKiAiaHR0cDovL3d3dy5zYXhwcm9qZWN0Lm9yZy9hcGlkb2Mvb3JnL3htbC9zYXgvcGFja2FnZS1zdW1tYXJ5Lmh0bWwjcGFja2FnZV9kZXNjcmlwdGlvbiIKICAqID5TQVguPC9hPgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvQWJzdHJhY3RBbmFseXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvQWJzdHJhY3RBbmFseXplci5qYXZhCmluZGV4IGE2ZTgxZjQuLjQ0OGU4YjkgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL0Fic3RyYWN0QW5hbHl6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9BYnN0cmFjdEFuYWx5emVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Miw3ICs0Miw3IEBACiAgICAgcHJpdmF0ZSBQYXRoIGNsYXNzUGF0aCA9IG5ldyBQYXRoKG51bGwpOwogCiAgICAgLyoqIFRoZSBsaXN0IG9mIHJvb3QgY2xhc3NlcyAqLwotICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gcm9vdENsYXNzZXMgPSBuZXcgVmVjdG9yU2V0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHJvb3RDbGFzc2VzID0gbmV3IFZlY3RvclNldDw+KCk7CiAKICAgICAvKiogdHJ1ZSBpZiBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGRldGVybWluZWQgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gZGV0ZXJtaW5lZCA9IGZhbHNlOwpAQCAtNjgsNiArNjgsNyBAQAogICAgICAqIEBwYXJhbSBjbG9zdXJlIHRydWUgaWYgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSB0cmF2ZXJzZWQgdG8gZGV0ZXJtaW5lCiAgICAgICogICAgICBpbmRpcmVjdCBkZXBlbmRlbmNpZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0Q2xvc3VyZShib29sZWFuIGNsb3N1cmUpIHsKICAgICAgICAgdGhpcy5jbG9zdXJlID0gY2xvc3VyZTsKICAgICB9CkBAIC03OSwxMCArODAsMTEgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgRmlsZSBpbnN0YW5jZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPEZpbGU+IGdldEZpbGVEZXBlbmRlbmNpZXMoKSB7CiAgICAgICAgIGlmICghc3VwcG9ydHNGaWxlRGVwZW5kZW5jaWVzKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiRmlsZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgICsgImJ5IHRoaXMgYW5hbHl6ZXIiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRmlsZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBhbmFseXplciIpOwogICAgICAgICB9CiAgICAgICAgIGlmICghZGV0ZXJtaW5lZCkgewogICAgICAgICAgICAgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKGZpbGVEZXBlbmRlbmNpZXMsIGNsYXNzRGVwZW5kZW5jaWVzKTsKQEAgLTk3LDYgKzk5LDcgQEAKICAgICAgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIFN0cmluZ3MsIGVhY2ggYmVpbmcgdGhlIG5hbWUgb2YgYSBKYXZhCiAgICAgICogICAgICBjbGFzcyBpbiBkb3Qgbm90YXRpb24uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEVudW1lcmF0aW9uPFN0cmluZz4gZ2V0Q2xhc3NEZXBlbmRlbmNpZXMoKSB7CiAgICAgICAgIGlmICghZGV0ZXJtaW5lZCkgewogICAgICAgICAgICAgZGV0ZXJtaW5lRGVwZW5kZW5jaWVzKGZpbGVEZXBlbmRlbmNpZXMsIGNsYXNzRGVwZW5kZW5jaWVzKTsKQEAgLTExMiw2ICsxMTUsNyBAQAogICAgICAqICAgICAgICAgY2xhc3Mgb3IgbnVsbCBpZiB0aGUgY2xhc3MgY291bGQgbm90IGJlIGZvdW5kLgogICAgICAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gaWYgdGhlIGZpbGVzIGluIHRoZSBjbGFzc3BhdGggY2Fubm90IGJlIHJlYWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0Q2xhc3NDb250YWluZXIoU3RyaW5nIGNsYXNzbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGNsYXNzTG9jYXRpb24gPSBjbGFzc25hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLmNsYXNzIjsKICAgICAgICAgLy8gd2UgbG9vayB0aHJvdWdoIHRoZSBjbGFzc3BhdGggZWxlbWVudHMuIElmIHRoZSBlbGVtZW50IGlzIGEgZGlyCkBAIC0xMjcsNiArMTMxLDcgQEAKICAgICAgKiAgICAgICAgIHNvdXJjZSBvciBudWxsIGlmIHRoZSBzb3VyY2UgZm9yIHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZXMgaW4gdGhlIHNvdXJjZXBhdGggY2Fubm90IGJlIHJlYWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEZpbGUgZ2V0U291cmNlQ29udGFpbmVyKFN0cmluZyBjbGFzc25hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBzb3VyY2VMb2NhdGlvbiA9IGNsYXNzbmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuamF2YSI7CiAKQEAgLTE0NCw2ICsxNDksNyBAQAogICAgICAqIEBwYXJhbSBzb3VyY2VQYXRoIFRoZSBQYXRoIGluc3RhbmNlIHNwZWNpZnlpbmcgdGhlIHNvdXJjZSBwYXRoCiAgICAgICogICAgICBlbGVtZW50cy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRTb3VyY2VQYXRoKFBhdGggc291cmNlUGF0aCkgewogICAgICAgICBpZiAoc291cmNlUGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNjAsNiArMTY2LDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBjbGFzc1BhdGggdGhlIFBhdGggaW5zdGFuY2Ugc3BlY2lmeWluZyB0aGUgY2xhc3NwYXRoIGVsZW1lbnRzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkQ2xhc3NQYXRoKFBhdGggY2xhc3NQYXRoKSB7CiAgICAgICAgIGlmIChjbGFzc1BhdGggPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTc2LDYgKzE4Myw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpbiBKYXZhIGRvdCBub3RhdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBhZGRSb290Q2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgewogICAgICAgICBpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgIHJldHVybjsKQEAgLTE5Miw2ICsyMDAsNyBAQAogICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYmVpbmcgY29uZmlndXJlZAogICAgICAqIEBwYXJhbSBpbmZvIHRoZSBjb25maWd1cmF0aW9uIGluZm8uCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY29uZmlnKFN0cmluZyBuYW1lLCBPYmplY3QgaW5mbykgewogICAgICAgICAvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKICAgICB9CkBAIC0yMDAsMTEgKzIwOSwxMiBAQAogICAgICAqIFJlc2V0IHRoZSBkZXBlbmRlbmN5IGxpc3QuIFRoaXMgd2lsbCByZXNldCB0aGUgZGV0ZXJtaW5lZAogICAgICAqIGRlcGVuZGVuY2llcyBhbmQgdGhlIGFsc28gbGlzdCBvZiByb290IGNsYXNzZXMuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAgICAgICAgIHJvb3RDbGFzc2VzLnJlbW92ZUFsbEVsZW1lbnRzKCk7CiAgICAgICAgIGRldGVybWluZWQgPSBmYWxzZTsKLSAgICAgICAgZmlsZURlcGVuZGVuY2llcyA9IG5ldyBWZWN0b3I8RmlsZT4oKTsKLSAgICAgICAgY2xhc3NEZXBlbmRlbmNpZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICAgICAgZmlsZURlcGVuZGVuY2llcyA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICBjbGFzc0RlcGVuZGVuY2llcyA9IG5ldyBWZWN0b3I8PigpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjY4LDE2ICsyNzgsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgYSB6aXAgb2Ygc29tZSBzb3J0Ci0gICAgICAgICAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB6aXBGaWxlID0gbmV3IFppcEZpbGUoZWxlbWVudCk7CisgICAgICAgICAgICAgICAgdHJ5IChaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoemlwRmlsZS5nZXRFbnRyeShyZXNvdXJjZUxvY2F0aW9uKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh6aXBGaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvRGVwZW5kZW5jeUFuYWx5emVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9EZXBlbmRlbmN5QW5hbHl6ZXIuamF2YQppbmRleCAxNDE1ZTJlLi5kODJhMTdiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9EZXBlbmRlbmN5QW5hbHl6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9EZXBlbmRlbmN5QW5hbHl6ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvQW5jZXN0b3JBbmFseXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9BbmNlc3RvckFuYWx5emVyLmphdmEKaW5kZXggNjEzYmM3Ny4uOTMyMjAzZCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9BbmNlc3RvckFuYWx5emVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9BbmNlc3RvckFuYWx5emVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNiwxMSArMTYsMTQgQEAKICAqCiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQuYmNlbDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkNsYXNzUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5jbGFzc2ZpbGUuSmF2YUNsYXNzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwpAQCAtNjEsMzMgKzY0LDI5IEBACiAgICAgICogQHBhcmFtIGNsYXNzZXMgYSB2ZWN0b3IgdG8gYmUgcG9wdWxhdGVkIHdpdGggdGhlIG5hbWVzIG9mIHRoZQogICAgICAqICAgICAgZGVwZW5kZW5jeSBjbGFzc2VzLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIGRldGVybWluZURlcGVuZGVuY2llcyhWZWN0b3I8RmlsZT4gZmlsZXMsIFZlY3RvcjxTdHJpbmc+IGNsYXNzZXMpIHsKICAgICAgICAgLy8gd2UgZ2V0IHRoZSByb290IGNsYXNzZXMgYW5kIGJ1aWxkIHVwIGEgc2V0IG9mCiAgICAgICAgIC8vIGNsYXNzZXMgdXBvbiB3aGljaCB0aGV5IGRlcGVuZAotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGRlcGVuZGVuY2llcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIEhhc2h0YWJsZTxGaWxlLCBGaWxlPiBjb250YWluZXJzID0gbmV3IEhhc2h0YWJsZTxGaWxlLCBGaWxlPigpOwotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHRvQW5hbHl6ZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gbmV4dEFuYWx5emUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCi0gICAgICAgIGZvciAoRW51bWVyYXRpb248U3RyaW5nPiBlID0gZ2V0Um9vdENsYXNzZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgICAgICB0b0FuYWx5emUucHV0KGNsYXNzbmFtZSwgY2xhc3NuYW1lKTsKLSAgICAgICAgfQorICAgICAgICBTZXQ8U3RyaW5nPiBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIFNldDxGaWxlPiBjb250YWluZXJzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBTZXQ8U3RyaW5nPiB0b0FuYWx5emUgPSBuZXcgSGFzaFNldDw+KENvbGxlY3Rpb25zLmxpc3QoZ2V0Um9vdENsYXNzZXMoKSkpOworICAgICAgICBTZXQ8U3RyaW5nPiBuZXh0QW5hbHl6ZSA9IG5ldyBIYXNoU2V0PD4oKTsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICBpbnQgbWF4Q291bnQgPSBpc0Nsb3N1cmVSZXF1aXJlZCgpID8gTUFYX0xPT1BTIDogMjsKLSAgICAgICAgd2hpbGUgKHRvQW5hbHl6ZS5zaXplKCkgIT0gMCAmJiBjb3VudCsrIDwgbWF4Q291bnQpIHsKKyAgICAgICAgd2hpbGUgKCF0b0FuYWx5emUuaXNFbXB0eSgpICYmIGNvdW50KysgPCBtYXhDb3VudCkgewogICAgICAgICAgICAgbmV4dEFuYWx5emUuY2xlYXIoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzbmFtZSA6IHRvQW5hbHl6ZS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NuYW1lIDogdG9BbmFseXplKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmVyID0gZ2V0Q2xhc3NDb250YWluZXIoY2xhc3NuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250YWluZXJzLnB1dChjb250YWluZXIsIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7CiAKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NQYXJzZXIgcGFyc2VyOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBDbGFzc1BhcnNlcihjb250YWluZXIuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk2LDE4ICs5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgSmF2YUNsYXNzIGphdmFDbGFzcyA9IHBhcnNlci5wYXJzZSgpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzID0gamF2YUNsYXNzLmdldEludGVyZmFjZU5hbWVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJmYWNlcy5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGludGVyZmFjZU5hbWUgPSBpbnRlcmZhY2VzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMuY29udGFpbnNLZXkoaW50ZXJmYWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QW5hbHl6ZS5wdXQoaW50ZXJmYWNlTmFtZSwgaW50ZXJmYWNlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGludGVyZmFjZU5hbWUgOiBqYXZhQ2xhc3MuZ2V0SW50ZXJmYWNlTmFtZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMuY29udGFpbnMoaW50ZXJmYWNlTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QW5hbHl6ZS5hZGQoaW50ZXJmYWNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAoamF2YUNsYXNzLmlzQ2xhc3MoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KHN1cGVyQ2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEFuYWx5emUucHV0KHN1cGVyQ2xhc3MsIHN1cGVyQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXBlbmRlbmNpZXMuY29udGFpbnMoc3VwZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0QW5hbHl6ZS5hZGQoc3VwZXJDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKQEAgLTExNSwyMCArMTEyLDE1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHRlbXAgPSB0b0FuYWx5emU7Ci0gICAgICAgICAgICB0b0FuYWx5emUgPSBuZXh0QW5hbHl6ZTsKLSAgICAgICAgICAgIG5leHRBbmFseXplID0gdGVtcDsKKyAgICAgICAgICAgIHRvQW5hbHl6ZS5jbGVhcigpOworICAgICAgICAgICAgdG9BbmFseXplLmFkZEFsbChuZXh0QW5hbHl6ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBmaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGNvbnRhaW5lcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgfQorICAgICAgICBmaWxlcy5jbGVhcigpOworICAgICAgICBmaWxlcy5hZGRBbGwoY29udGFpbmVycyk7CiAKLSAgICAgICAgY2xhc3Nlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKFN0cmluZyBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBjbGFzc2VzLmFkZChkZXBlbmRlbmN5KTsKLSAgICAgICAgfQorICAgICAgICBjbGFzc2VzLmNsZWFyKCk7CisgICAgICAgIGNsYXNzZXMuYWRkQWxsKGRlcGVuZGVuY2llcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzYsNiArMTI4LDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5hbHl6ZXIgcHJvdmlkZXMgZGVwZW5kZW5jeSBmaWxlIGluZm9ybWF0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzRmlsZURlcGVuZGVuY2llcygpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9EZXBlbmRlbmN5VmlzaXRvci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9EZXBlbmRlbmN5VmlzaXRvci5qYXZhCmluZGV4IGQzMWQ0NTMuLjM3ZTdhMjEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvRGVwZW5kZW5jeVZpc2l0b3IuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0RlcGVuZGVuY3lWaXNpdG9yLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw4ICsxNywxMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5Db25zdGFudENsYXNzOwpAQCAtMzUsNyArMzcsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVZpc2l0b3IgZXh0ZW5kcyBFbXB0eVZpc2l0b3IgewogICAgIC8qKiBUaGUgY29sbGVjdGVkIGRlcGVuZGVuY2llcyAqLwotICAgIHByaXZhdGUgZmluYWwgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIC8qKgogICAgICAqIFRoZSBjdXJyZW50IGNsYXNzJ3MgY29uc3RhbnQgcG9vbCAtIHVzZWQgdG8gZGV0ZXJtaW5lIGNsYXNzIG5hbWVzCiAgICAgICogZnJvbSBjbGFzcyByZWZlcmVuY2VzLgpAQCAtNDksNyArNTEsNyBAQAogICAgICAqICAgICAgdmlzaXRlZCBjbGFzc2VzIGRlcGVuZC4KICAgICAgKi8KICAgICBwdWJsaWMgRW51bWVyYXRpb248U3RyaW5nPiBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICAgIHJldHVybiBkZXBlbmRlbmNpZXMua2V5cygpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oZGVwZW5kZW5jaWVzKTsKICAgICB9CiAKICAgICAvKiogQ2xlYXIgdGhlIGN1cnJlbnQgc2V0IG9mIGNvbGxlY3RlZCBkZXBlbmRlbmNpZXMuICovCkBAIC02Miw2ICs2NCw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gY29uc3RhbnRQb29sIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyB2aXNpdGVkLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29uc3RhbnRQb29sKGZpbmFsIENvbnN0YW50UG9vbCBjb25zdGFudFBvb2wpIHsKICAgICAgICAgdGhpcy5jb25zdGFudFBvb2wgPSBjb25zdGFudFBvb2w7CiAgICAgfQpAQCAtNzEsNiArNzQsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNvbnN0YW50Q2xhc3MgdGhlIGNvbnN0YW50Q2xhc3MgZW50cnkgZm9yIHRoZSBjbGFzcyByZWZlcmVuY2UKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2aXNpdENvbnN0YW50Q2xhc3MoZmluYWwgQ29uc3RhbnRDbGFzcyBjb25zdGFudENsYXNzKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc25hbWUKICAgICAgICAgICAgICA9IGNvbnN0YW50Q2xhc3MuZ2V0Q29uc3RhbnRWYWx1ZShjb25zdGFudFBvb2wpLnRvU3RyaW5nKCk7CkBAIC04NCwxOCArODgsMTkgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBvYmogdGhlIG5hbWUgYW5kIHR5cGUgcmVmZXJlbmNlIGJlaW5nIHZpc2l0ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmlzaXRDb25zdGFudE5hbWVBbmRUeXBlKGZpbmFsIENvbnN0YW50TmFtZUFuZFR5cGUgb2JqKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gb2JqLmdldE5hbWUoY29uc3RhbnRQb29sKTsKLSAgICAgICAgaWYgKG9iai5nZXRTaWduYXR1cmUoY29uc3RhbnRQb29sKS5lcXVhbHMoIkxqYXZhL2xhbmcvQ2xhc3M7IikKKyAgICAgICAgaWYgKCJMamF2YS9sYW5nL0NsYXNzOyIuZXF1YWxzKG9iai5nZXRTaWduYXR1cmUoY29uc3RhbnRQb29sKSkKICAgICAgICAgICAgICAgICAmJiBuYW1lLnN0YXJ0c1dpdGgoImNsYXNzJCIpKSB7CiAgICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lCiAgICAgICAgICAgICAgICAgPSBuYW1lLnN1YnN0cmluZygiY2xhc3MkIi5sZW5ndGgoKSkucmVwbGFjZSgnJCcsICcuJyk7CiAgICAgICAgICAgICAvLyBkb2VzIHRoZSBjbGFzcyBoYXZlIGEgcGFja2FnZSBzdHJ1Y3R1cmUKLSAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGNsYXNzbmFtZS5sYXN0SW5kZXhPZigiLiIpOworICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gY2xhc3NuYW1lLmxhc3RJbmRleE9mKCcuJyk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgY2hhciBzdGFydDsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgcGFja2FnZSBzdHJ1Y3R1cmUgaXMgbW9yZSB0aGFuIDEgbGV2ZWwgZGVlcAotICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleDIgPSBjbGFzc25hbWUubGFzdEluZGV4T2YoIi4iLCBpbmRleCAtIDEpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleDIgPSBjbGFzc25hbWUubGFzdEluZGV4T2YoJy4nLCBpbmRleCAtIDEpOwogICAgICAgICAgICAgICAgIGlmIChpbmRleDIgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3MgbmFtZSBoYXMgbW9yZSB0aGFuIDEgcGFja2FnZSBsZXZlbCAnY29tLmNvbXBhbnkuQ2xhc3MnCiAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gY2xhc3NuYW1lLmNoYXJBdChpbmRleDIgKyAxKTsKQEAgLTEwNSw3ICsxMTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQncyBhbiBpbm5lciBjbGFzcyAnY29tLmNvbXBhbnkuQ2xhc3MkSW5uZXInCiAgICAgICAgICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKLSAgICAgICAgICAgICAgICBpZiAoKHN0YXJ0ID4gMHg0MCkgJiYgKHN0YXJ0IDwgMHg1QikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiAweDQwICYmIHN0YXJ0IDwgMHg1QikgewogICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCBsZXR0ZXIgb2YgdGhlIHByZXZpb3VzIHNlZ21lbnQgb2YgdGhlIGNsYXNzIG5hbWUgJ0NsYXNzJwogICAgICAgICAgICAgICAgICAgICAvLyBpcyB1cHBlciBjYXNlIGFzY2lpLiBzbyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMgaXQncyBhbiBpbm5lciBjbGFzcwogICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArICIkIgpAQCAtMTI4LDYgKzEzMyw3IEBACiAgICAgICoKICAgICAgKiBAcGFyYW0gZmllbGQgdGhlIGZpZWxkIGJlaW5nIHZpc2l0ZWQKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2aXNpdEZpZWxkKGZpbmFsIEZpZWxkIGZpZWxkKSB7CiAgICAgICAgIGFkZENsYXNzZXMoZmllbGQuZ2V0U2lnbmF0dXJlKCkpOwogICAgIH0KQEAgLTEzNyw2ICsxNDMsNyBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGphdmFDbGFzcyB0aGUgY2xhc3MgYmVpbmcgdmlzaXRlZC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB2aXNpdEphdmFDbGFzcyhmaW5hbCBKYXZhQ2xhc3MgamF2YUNsYXNzKSB7CiAgICAgICAgIGFkZENsYXNzKGphdmFDbGFzcy5nZXRDbGFzc05hbWUoKSk7CiAgICAgfQpAQCAtMTQ2LDkgKzE1MywxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIG1ldGhvZCB0aGUgbWV0aG9kIGJlaW5nIHZpc2l0ZWQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2QoZmluYWwgTWV0aG9kIG1ldGhvZCkgewogICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlID0gbWV0aG9kLmdldFNpZ25hdHVyZSgpOwotICAgICAgICBmaW5hbCBpbnQgcG9zID0gc2lnbmF0dXJlLmluZGV4T2YoIikiKTsKKyAgICAgICAgZmluYWwgaW50IHBvcyA9IHNpZ25hdHVyZS5pbmRleE9mKCcpJyk7CiAgICAgICAgIGFkZENsYXNzZXMoc2lnbmF0dXJlLnN1YnN0cmluZygxLCBwb3MpKTsKICAgICAgICAgYWRkQ2xhc3NlcyhzaWduYXR1cmUuc3Vic3RyaW5nKHBvcyArIDEpKTsKICAgICB9CkBAIC0xNTksNyArMTY3LDcgQEAKICAgICAgKiBAcGFyYW0gY2xhc3NuYW1lIHRoZSBjbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMuCiAgICAgICovCiAgICAgdm9pZCBhZGRDbGFzcyhmaW5hbCBTdHJpbmcgY2xhc3NuYW1lKSB7Ci0gICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGNsYXNzbmFtZSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0Z1bGxBbmFseXplci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9kZXBlbmQvYmNlbC9GdWxsQW5hbHl6ZXIuamF2YQppbmRleCAzYmQ2Yzc1Li4wOGMzNjBmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2RlcGVuZC9iY2VsL0Z1bGxBbmFseXplci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZGVwZW5kL2JjZWwvRnVsbEFuYWx5emVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNiwxNSArMTYsMTkgQEAKICAqCiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQuYmNlbDsKKwogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CisKIGltcG9ydCBvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlLkNsYXNzUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuYmNlbC5jbGFzc2ZpbGUuRGVzY2VuZGluZ1Zpc2l0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5iY2VsLmNsYXNzZmlsZS5KYXZhQ2xhc3M7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TdHJlYW1VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmRlcGVuZC5BYnN0cmFjdEFuYWx5emVyOwogCiAvKioKQEAgLTYwLDMxICs2NCwyOCBAQAogICAgICAqIEBwYXJhbSBjbGFzc2VzIGEgdmVjdG9yIHRvIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKICAgICAgKiAgICAgIGRlcGVuZGVuY3kgY2xhc3Nlcy4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBkZXRlcm1pbmVEZXBlbmRlbmNpZXMoVmVjdG9yPEZpbGU+IGZpbGVzLCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzKSB7CiAgICAgICAgIC8vIHdlIGdldCB0aGUgcm9vdCBjbGFzc2VzIGFuZCBidWlsZCB1cCBhIHNldCBvZgogICAgICAgICAvLyBjbGFzc2VzIHVwb24gd2hpY2ggdGhleSBkZXBlbmQKLSAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBkZXBlbmRlbmNpZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBIYXNodGFibGU8RmlsZSwgRmlsZT4gY29udGFpbmVycyA9IG5ldyBIYXNodGFibGU8RmlsZSwgRmlsZT4oKTsKLSAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiB0b0FuYWx5emUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBmb3IgKEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IGdldFJvb3RDbGFzc2VzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc25hbWUsIGNsYXNzbmFtZSk7Ci0gICAgICAgIH0KKyAgICAgICAgU2V0PFN0cmluZz4gZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBTZXQ8RmlsZT4gY29udGFpbmVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gdG9BbmFseXplID0gbmV3IEhhc2hTZXQ8PihDb2xsZWN0aW9ucy5saXN0KGdldFJvb3RDbGFzc2VzKCkpKTsKIAogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICBpbnQgbWF4Q291bnQgPSBpc0Nsb3N1cmVSZXF1aXJlZCgpID8gTUFYX0xPT1BTIDogMjsKLSAgICAgICAgd2hpbGUgKHRvQW5hbHl6ZS5zaXplKCkgIT0gMCAmJiBjb3VudCsrIDwgbWF4Q291bnQpIHsKKyAgICAgICAgd2hpbGUgKCF0b0FuYWx5emUuaXNFbXB0eSgpICYmIGNvdW50KysgPCBtYXhDb3VudCkgewogICAgICAgICAgICAgRGVwZW5kZW5jeVZpc2l0b3IgZGVwZW5kZW5jeVZpc2l0b3IgPSBuZXcgRGVwZW5kZW5jeVZpc2l0b3IoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXNzbmFtZSA6IHRvQW5hbHl6ZS5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXQoY2xhc3NuYW1lLCBjbGFzc25hbWUpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY2xhc3NuYW1lIDogdG9BbmFseXplKSB7CisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZChjbGFzc25hbWUpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgY29udGFpbmVyID0gZ2V0Q2xhc3NDb250YWluZXIoY2xhc3NuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb250YWluZXJzLnB1dChjb250YWluZXIsIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcnMuYWRkKGNvbnRhaW5lcik7CiAKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NQYXJzZXIgcGFyc2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NQYXJzZXIgcGFyc2VyOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyLmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlciA9IG5ldyBDbGFzc1BhcnNlcihjb250YWluZXIuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMiwyNiArMTAzLDE3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHRvQW5hbHl6ZS5jbGVhcigpOwotCiAgICAgICAgICAgICAvLyBub3cgcmVjb3ZlciBhbGwgdGhlIGRlcGVuZGVuY2llcyBjb2xsZWN0ZWQgYW5kIGFkZCB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZGVwc0VudW0gPSBkZXBlbmRlbmN5VmlzaXRvci5nZXREZXBlbmRlbmNpZXMoKTsKLSAgICAgICAgICAgIHdoaWxlIChkZXBzRW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBkZXBzRW51bS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzLmNvbnRhaW5zS2V5KGNsYXNzTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdG9BbmFseXplLnB1dChjbGFzc05hbWUsIGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShkZXBlbmRlbmN5VmlzaXRvci5nZXREZXBlbmRlbmNpZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihjbGFzc05hbWUgLT4gIWRlcGVuZGVuY2llcy5jb250YWlucyhjbGFzc05hbWUpKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCh0b0FuYWx5emU6OmFkZCk7CiAgICAgICAgIH0KIAotICAgICAgICBmaWxlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKEZpbGUgZiA6IGNvbnRhaW5lcnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGZpbGVzLmFkZChmKTsKLSAgICAgICAgfQorICAgICAgICBmaWxlcy5jbGVhcigpOworICAgICAgICBmaWxlcy5hZGRBbGwoY29udGFpbmVycyk7CiAKLSAgICAgICAgY2xhc3Nlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgICAgICBmb3IgKFN0cmluZyBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBjbGFzc2VzLmFkZChkZXBlbmRlbmN5KTsKLSAgICAgICAgfQorICAgICAgICBjbGFzc2VzLmNsZWFyKCk7CisgICAgICAgIGNsYXNzZXMuYWRkQWxsKGRlcGVuZGVuY2llcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjksNiArMTIxLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5hbHl6ZXIgcHJvdmlkZXMgZGVwZW5kZW5jeSBmaWxlIGluZm9ybWF0aW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzRmlsZURlcGVuZGVuY2llcygpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvRmFjYWRlVGFza0hlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvRmFjYWRlVGFza0hlbHBlci5qYXZhCmluZGV4IDRmYjQzNDEuLjFhMjI3MjYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ZhY2FkZVRhc2tIZWxwZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9GYWNhZGVUYXNrSGVscGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw2ICsyMCw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwpAQCAtMzcsNyArMzksNyBAQAogICAgIC8qKgogICAgICAqIENvbW1hbmQgbGluZSBhcmd1bWVudHMuCiAgICAgICovCi0gICAgcHJpdmF0ZSBMaXN0PEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudD4gYXJncyA9IG5ldyBBcnJheUxpc3Q8SW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50PigpOworICAgIHByaXZhdGUgTGlzdDxJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQ+IGFyZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBleHBsaWNpdGx5IGNob3NlbiBpbXBsZW1lbnRhdGlvbi4KQEAgLTEyNiwxNyArMTI4LDEwIEBACiAgICAgICogQHJldHVybiBhbiBhcnJheSBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmdzKCkgewotICAgICAgICBMaXN0PFN0cmluZz4gdG1wID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGFyZ3Muc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQgYXJnIDogYXJncykgewotICAgICAgICAgICAgU3RyaW5nW10gY3VyciA9IGFyZy5nZXRQYXJ0cyhnZXRJbXBsZW1lbnRhdGlvbigpKTsKLSAgICAgICAgICAgIGlmIChjdXJyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdG1wLmFkZChjdXJyW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gcmVzID0gbmV3IFN0cmluZ1t0bXAuc2l6ZSgpXTsKLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSkgdG1wLnRvQXJyYXkocmVzKTsKKyAgICAgICAgU3RyaW5nIGltcGxlbWVudGF0aW9uID0gZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICAgICAgcmV0dXJuIGFyZ3Muc3RyZWFtKCkubWFwKGFyZyAtPiBhcmcuZ2V0UGFydHMoaW1wbGVtZW50YXRpb24pKQorICAgICAgICAgICAgLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5mbGF0TWFwKFN0cmVhbTo6b2YpCisgICAgICAgICAgICAudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50LmphdmEKaW5kZXggYmE3ZjE0YS4uOGE3ZDAzOSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMCwxMSArMzAsNiBAQAogcHVibGljIGNsYXNzIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCBleHRlbmRzIENvbW1hbmRsaW5lLkFyZ3VtZW50IHsKICAgICBwcml2YXRlIFN0cmluZyBpbXBsOwogCi0gICAgLyoqIENvbnN0cnVjdG9yIGZvciBJbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnQuICovCi0gICAgcHVibGljIEltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBTZXQgdGhlIGltcGxlbWVudGF0aW9uIHRoaXMgYXJndW1lbnQgaXMgZm9yLgogICAgICAqIEBwYXJhbSBpbXBsIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGlzIGNvbW1hbmQgbGluZSBhcmd1bWVudCBpcyBmb3IuCkBAIC01NCw4ICs0OSw3IEBACiAgICAgcHVibGljIGZpbmFsIFN0cmluZ1tdIGdldFBhcnRzKFN0cmluZyBjaG9zZW5JbXBsKSB7CiAgICAgICAgIGlmIChpbXBsID09IG51bGwgfHwgaW1wbC5lcXVhbHMoY2hvc2VuSW1wbCkpIHsKICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJ0cygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9qYXZhMTUvUHJveHlEaWFnbm9zdGljcy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9qYXZhMTUvUHJveHlEaWFnbm9zdGljcy5qYXZhCmluZGV4IGU3NDEyZDYuLjhmZjBmMjEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvamF2YTE1L1Byb3h5RGlhZ25vc3RpY3MuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2phdmExNS9Qcm94eURpYWdub3N0aWNzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSw4ICsyNSw2IEBACiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogCkBAIC00MCwxMiArMzgsMTAgQEAKICAqLwogcHVibGljIGNsYXNzIFByb3h5RGlhZ25vc3RpY3MgewogCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb247Ci0KICAgICBwcml2YXRlIFVSSSBkZXN0VVJJOwogCiAgICAgLyoqIHtAdmFsdWV9ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9ERVNUSU5BVElPTiA9ICJodHRwOi8vYW50LmFwYWNoZS5vcmcvIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0RFU1RJTkFUSU9OID0gImh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIjsKIAogICAgIC8qKgogICAgICAqIGNyZWF0ZSBhIGRpYWdub3N0aWNzIGJpbmRpbmcgZm9yIGEgc3BlY2lmaWMgVVJJCkBAIC01Myw3ICs0OSw2IEBACiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBpZiB0aGUgVVJJIGlzIG1hbGZvcm1lZC4KICAgICAgKi8KICAgICBwdWJsaWMgUHJveHlEaWFnbm9zdGljcyhTdHJpbmcgZGVzdGluYXRpb24pIHsKLSAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdGhpcy5kZXN0VVJJID0gbmV3IFVSSShkZXN0aW5hdGlvbik7CiAgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CkBAIC03MywzNiArNjgsMzQgQEAKICAgICAgKiBHZXQgdGhlIGRpYWdub3N0aWNzIGZvciBwcm94eSBpbmZvcm1hdGlvbi4KICAgICAgKiBAcmV0dXJuIHRoZSBpbmZvcm1hdGlvbi4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICBQcm94eVNlbGVjdG9yIHNlbGVjdG9yID0gUHJveHlTZWxlY3Rvci5nZXREZWZhdWx0KCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IHNlbGVjdG9yLnNlbGVjdChkZXN0VVJJKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgSXRlcmF0b3IgcHJveGllcyA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChwcm94aWVzLmhhc05leHQoKSkgewotICAgICAgICAgICAgUHJveHkgcHJveHkgPSAoUHJveHkpIHByb3hpZXMubmV4dCgpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoUHJveHkgcHJveHkgOiBzZWxlY3Rvci5zZWxlY3QoZGVzdFVSSSkpIHsKICAgICAgICAgICAgIFNvY2tldEFkZHJlc3MgYWRkcmVzcyA9IHByb3h5LmFkZHJlc3MoKTsKICAgICAgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJEaXJlY3QgY29ubmVjdGlvblxuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJveHkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgaW5zdGFuY2VvZiBJbmV0U29ja2V0QWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpbmEgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpbmEuZ2V0SG9zdE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzonKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpbmEuZ2V0UG9ydCgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluYS5pc1VucmVzb2x2ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFt1bnJlc29sdmVkXSIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkciA9IGluYS5nZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChhZGRyLmdldEhvc3RBZGRyZXNzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXScpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByb3h5KTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzIGluc3RhbmNlb2YgSW5ldFNvY2tldEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBpbmEgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGFkZHJlc3M7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5hLmdldEhvc3ROYW1lKCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJzonKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluYS5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIGlmIChpbmEuaXNVbnJlc29sdmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIFt1bnJlc29sdmVkXSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHIgPSBpbmEuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgWyIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGFkZHIuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ10nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcbicpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9KYXZheFNjcmlwdFJ1bm5lci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9KYXZheFNjcmlwdFJ1bm5lci5qYXZhCmluZGV4IDdhNWNmYTQuLmQ1NWE1YjMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvSmF2YXhTY3JpcHRSdW5uZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL0phdmF4U2NyaXB0UnVubmVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMCArMTgsMjEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsOwogCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguc2NyaXB0LkJpbmRpbmdzOworaW1wb3J0IGphdmF4LnNjcmlwdC5Db21waWxhYmxlOworaW1wb3J0IGphdmF4LnNjcmlwdC5Db21waWxlZFNjcmlwdDsKK2ltcG9ydCBqYXZheC5zY3JpcHQuU2NyaXB0RW5naW5lOworaW1wb3J0IGphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyOworaW1wb3J0IGphdmF4LnNjcmlwdC5TaW1wbGVCaW5kaW5nczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVmbGVjdFdyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU2NyaXB0UnVubmVyQmFzZTsKIAogLyoqCkBAIC0yOSwxOSArNDAsMjIgQEAKICAqIEBzaW5jZSBBbnQgMS43LjAKICAqLwogcHVibGljIGNsYXNzIEphdmF4U2NyaXB0UnVubmVyIGV4dGVuZHMgU2NyaXB0UnVubmVyQmFzZSB7Ci0gICAgcHJpdmF0ZSBSZWZsZWN0V3JhcHBlciBlbmdpbmU7CisgICAgcHJpdmF0ZSBTY3JpcHRFbmdpbmUga2VwdEVuZ2luZTsKKyAgICBwcml2YXRlIENvbXBpbGVkU2NyaXB0IGNvbXBpbGVkU2NyaXB0OwogCiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBtYW5hZ2VyIHByZWZpeC4KICAgICAgKiBAcmV0dXJuICJqYXZheCIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXJOYW1lKCkgewogICAgICAgICByZXR1cm4gImphdmF4IjsKICAgICB9CiAKICAgICAvKioge0Bpbmhlcml0RG9jfS4gKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0xhbmd1YWdlKCkgewotICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKKyAgICAgICAgaWYgKGtlcHRFbmdpbmUgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgY2hlY2tMYW5ndWFnZSgpOwpAQCAtNjMsNiArNzcsNyBAQAogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBCdWlsZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZyBleGVjdXRpbmcgdGhlIHNjcmlwdC4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlU2NyaXB0KFN0cmluZyBleGVjTmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgZXZhbHVhdGVTY3JpcHQoZXhlY05hbWUpOwogICAgIH0KQEAgLTc5LDI4ICs5NCw2MSBAQAogICAgICAgICBjaGVja0xhbmd1YWdlKCk7CiAgICAgICAgIENsYXNzTG9hZGVyIG9yaWdMb2FkZXIgPSByZXBsYWNlQ29udGV4dExvYWRlcigpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgUmVmbGVjdFdyYXBwZXIgZW5naW5lID0gY3JlYXRlRW5naW5lKCk7CisgICAgICAgICAgICBpZiAoZ2V0Q29tcGlsZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb21waWxlZFNjcmlwdFJlZk5hbWUgPQorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcy4lcy4lZC4lZCIsIE1hZ2ljTmFtZXMuU0NSSVBUX0NBQ0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFuZ3VhZ2UoKSwgT2JqZWN0cy5oYXNoQ29kZShnZXRTY3JpcHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RzLmhhc2hDb2RlKGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOworCisgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY29tcGlsZWRTY3JpcHQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHQgPSBnZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGNvbXBpbGVkU2NyaXB0UmVmTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChudWxsID09IGNvbXBpbGVkU2NyaXB0KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgamF2YXggc2NyaXB0IGVuZ2luZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExhbmd1YWdlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmdpbmUgaW5zdGFuY2VvZiBDb21waWxhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKCJjb21waWxlIHNjcmlwdCAiICsgZXhlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvamVjdC5NU0dfVkVSQk9TRSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NyaXB0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKENvbXBpbGFibGUpIGVuZ2luZSkuY29tcGlsZShnZXRTY3JpcHQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9qZWN0KCkubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzY3JpcHQgY29tcGlsYXRpb24gbm90IGF2YWlsYWJsZSBmb3IgIiArIGV4ZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1ZFUkJPU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoY29tcGlsZWRTY3JpcHRSZWZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRTY3JpcHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjb21waWxlZFNjcmlwdCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBCaW5kaW5ncyBiaW5kaW5ncyA9IG5ldyBTaW1wbGVCaW5kaW5ncygpOworCisgICAgICAgICAgICAgICAgICAgIGFwcGx5QmluZGluZ3MoYmluZGluZ3M6OnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICJydW4gY29tcGlsZWQgc2NyaXB0ICIgKyBjb21waWxlZFNjcmlwdFJlZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBQcm9qZWN0Lk1TR19ERUJVRyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVkU2NyaXB0LmV2YWwoYmluZGluZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU2NyaXB0RW5naW5lIGVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwogICAgICAgICAgICAgaWYgKGVuZ2luZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGNyZWF0ZSBqYXZheCBzY3JpcHQgZW5naW5lIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICArIGdldExhbmd1YWdlKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0QmVhbnMoKS5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0QmVhbnMoKS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoIkZYIi5lcXVhbHNJZ25vcmVDYXNlKGdldExhbmd1YWdlKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZ2luZS5pbnZva2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAicHV0IiwgU3RyaW5nLmNsYXNzLCBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIjoiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuY2xhc3MsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmdpbmUuaW52b2tlKAotICAgICAgICAgICAgICAgICAgICAgICAgInB1dCIsIFN0cmluZy5jbGFzcywga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmNsYXNzLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgc2NyaXB0Ci0gICAgICAgICAgICByZXR1cm4gZW5naW5lLmludm9rZSgiZXZhbCIsIFN0cmluZy5jbGFzcywgZ2V0U2NyaXB0KCkpOworCisgICAgICAgICAgICBhcHBseUJpbmRpbmdzKGVuZ2luZTo6cHV0KTsKKworICAgICAgICAgICAgcmV0dXJuIGVuZ2luZS5ldmFsKGdldFNjcmlwdCgpKTsKKwogICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewogICAgICAgICAgICAgLy9jYXRjaCBhbmQgcmV0aHJvdyBidWlsZCBleGNlcHRpb25zCiAKQEAgLTExNCw3ICsxNjIsNyBAQAogICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBiZTsKICAgICAgICAgICAgIFRocm93YWJsZSB0ZSA9IGJlLmdldENhdXNlKCk7CiAgICAgICAgICAgICBpZiAodGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmICAodGUgaW5zdGFuY2VvZiBCdWlsZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGlmICh0ZSBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IChCdWlsZEV4Y2VwdGlvbikgdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdCA9IHRlOwpAQCAtMTI2LDIyICsxNzQsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgUmVmbGVjdFdyYXBwZXIgY3JlYXRlRW5naW5lKCkgewotICAgICAgICBpZiAoZW5naW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBlbmdpbmU7CisgICAgcHJpdmF0ZSB2b2lkIGFwcGx5QmluZGluZ3MoQmlDb25zdW1lcjxTdHJpbmcsIE9iamVjdD4gdGFyZ2V0KSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gc291cmNlID0gZ2V0QmVhbnMoKTsKKworICAgICAgICBpZiAoIkZYIi5lcXVhbHNJZ25vcmVDYXNlKGdldExhbmd1YWdlKCkpKSB7CisgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZW50cnlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZSAtPiBTdHJpbmcuZm9ybWF0KCIlczolcyIsIGUuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFZhbHVlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBNYXAuRW50cnk6OmdldFZhbHVlKSk7CiAgICAgICAgIH0KLSAgICAgICAgUmVmbGVjdFdyYXBwZXIgbWFuYWdlciA9IG5ldyBSZWZsZWN0V3JhcHBlcigKLSAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgImphdmF4LnNjcmlwdC5TY3JpcHRFbmdpbmVNYW5hZ2VyIik7Ci0gICAgICAgIE9iamVjdCBlID0gbWFuYWdlci5pbnZva2UoCi0gICAgICAgICAgICAiZ2V0RW5naW5lQnlOYW1lIiwgU3RyaW5nLmNsYXNzLCBnZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgaWYgKGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHNvdXJjZS5mb3JFYWNoKHRhcmdldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTY3JpcHRFbmdpbmUgY3JlYXRlRW5naW5lKCkgeworICAgICAgICBpZiAoa2VwdEVuZ2luZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4ga2VwdEVuZ2luZTsKICAgICAgICAgfQotICAgICAgICBSZWZsZWN0V3JhcHBlciByZXQgPSBuZXcgUmVmbGVjdFdyYXBwZXIoZSk7Ci0gICAgICAgIGlmIChnZXRLZWVwRW5naW5lKCkpIHsKLSAgICAgICAgICAgIHRoaXMuZW5naW5lID0gcmV0OworICAgICAgICBTY3JpcHRFbmdpbmUgcmVzdWx0ID0KKyAgICAgICAgICAgIG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCkuZ2V0RW5naW5lQnlOYW1lKGdldExhbmd1YWdlKCkpOworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgZ2V0S2VlcEVuZ2luZSgpKSB7CisgICAgICAgICAgICB0aGlzLmtlcHRFbmdpbmUgPSByZXN1bHQ7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvTm9FeGl0U2VjdXJpdHlNYW5hZ2VyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL05vRXhpdFNlY3VyaXR5TWFuYWdlci5qYXZhCmluZGV4IGU3MDRhYjIuLjRkZjhlZjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvTm9FeGl0U2VjdXJpdHlNYW5hZ2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9Ob0V4aXRTZWN1cml0eU1hbmFnZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM2LDYgKzM2LDcgQEAKICAgICAgKiBUaGlzIHRocm93cyBhbiBFeGl0RXhjZXB0aW9uKHN0YXR1cykgZXhjZXB0aW9uLgogICAgICAqIEBwYXJhbSBzdGF0dXMgdGhlIGV4aXQgc3RhdHVzCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2hlY2tFeGl0KGludCBzdGF0dXMpIHsKICAgICAgICAgdGhyb3cgbmV3IEV4aXRFeGNlcHRpb24oc3RhdHVzKTsKICAgICB9CkBAIC00NSw2ICs0Niw3IEBACiAgICAgICogVGhpcyBkb2VzIG5vdGhpbmcuCiAgICAgICogQHBhcmFtIHBlcm0gdGhlIHJlcXVlc3RlZCBwZXJtaXNzaW9uLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNoZWNrUGVybWlzc2lvbihQZXJtaXNzaW9uIHBlcm0pIHsKICAgICAgICAgLy8gbm8gcGVybWlzc2lvbiBoZXJlCiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9TY3JpcHRSdW5uZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvU2NyaXB0UnVubmVyLmphdmEKaW5kZXggNDVjM2VkZS4uZGEwZGI4MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9TY3JpcHRSdW5uZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1NjcmlwdFJ1bm5lci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsOCArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwub3B0aW9uYWw7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5ic2YuQlNGRW5naW5lOwogaW1wb3J0IG9yZy5hcGFjaGUuYnNmLkJTRkV4Y2VwdGlvbjsKQEAgLTQ5LDYgKzQ4LDcgQEAKICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIG1hbmFnZXIgcHJlZml4LgogICAgICAqIEByZXR1cm4gImJzZiIKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldE1hbmFnZXJOYW1lKCkgewogICAgICAgICByZXR1cm4gImJzZiI7CiAgICAgfQpAQCAtNTcsMTAgKzU3LDExIEBACiAgICAgICogQ2hlY2sgaWYgYnNmIHN1cHBvcnRzIHRoZSBsYW5ndWFnZS4KICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYnNmIGNhbiBjcmVhdGUgYW4gZW5naW5lIGZvciB0aGlzIGxhbmd1YWdlLgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzTGFuZ3VhZ2UoKSB7Ci0gICAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IChIYXNodGFibGUpIFJlZmxlY3RVdGlsLmdldEZpZWxkKAotICAgICAgICAgICAgbmV3IEJTRk1hbmFnZXIoKSwgInJlZ2lzdGVyZWRFbmdpbmVzIik7Ci0gICAgICAgIFN0cmluZyBlbmdpbmVDbGFzc05hbWUgPSAoU3RyaW5nKSB0YWJsZS5nZXQoZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdGFibGUgPQorICAgICAgICAgICAgUmVmbGVjdFV0aWwuZ2V0RmllbGQobmV3IEJTRk1hbmFnZXIoKSwgInJlZ2lzdGVyZWRFbmdpbmVzIik7CisgICAgICAgIFN0cmluZyBlbmdpbmVDbGFzc05hbWUgPSB0YWJsZS5nZXQoZ2V0TGFuZ3VhZ2UoKSk7CiAgICAgICAgIGlmIChlbmdpbmVDbGFzc05hbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgZ2V0UHJvamVjdCgpLmxvZygKICAgICAgICAgICAgICAgICAiVGhpcyBpcyBubyBCU0YgZW5naW5lIGNsYXNzIGZvciBsYW5ndWFnZSAnIgpAQCAtODcsNiArODgsNyBAQAogICAgICAqIEBwYXJhbSBleGVjTmFtZSB0aGUgbmFtZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIEJTRiBmb3IgdGhpcyBzY3JpcHQgZXhlY3V0aW9uLgogICAgICAqIEBleGNlcHRpb24gQnVpbGRFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcgZXhlY3V0aW5nIHRoZSBzY3JpcHQuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZVNjcmlwdChTdHJpbmcgZXhlY05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGNoZWNrTGFuZ3VhZ2UoKTsKICAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ0xvYWRlciA9IHJlcGxhY2VDb250ZXh0TG9hZGVyKCk7CkBAIC0xMTMsNiArMTE1LDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGV2YWx1YXRpb24KICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIGV4ZWN1dGluZyB0aGUgc2NyaXB0LgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZXZhbHVhdGVTY3JpcHQoU3RyaW5nIGV4ZWNOYW1lKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBjaGVja0xhbmd1YWdlKCk7CiAgICAgICAgIENsYXNzTG9hZGVyIG9yaWdMb2FkZXIgPSByZXBsYWNlQ29udGV4dExvYWRlcigpOwpAQCAtMTQ1LDggKzE0OCw3IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGRlY2xhcmVCZWFucyhCU0ZNYW5hZ2VyIG0pIHRocm93cyBCU0ZFeGNlcHRpb24gewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBnZXRCZWFucygpLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBnZXRCZWFucygpLmtleVNldCgpKSB7CiAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBnZXRCZWFucygpLmdldChrZXkpOwogICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBtLmRlY2xhcmVCZWFuKGtleSwgdmFsdWUsIHZhbHVlLmdldENsYXNzKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9XZWFraXNoUmVmZXJlbmNlMTIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvb3B0aW9uYWwvV2Vha2lzaFJlZmVyZW5jZTEyLmphdmEKaW5kZXggNGNkMTI3OC4uZDUwY2U3NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9vcHRpb25hbC9XZWFraXNoUmVmZXJlbmNlMTIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL29wdGlvbmFsL1dlYWtpc2hSZWZlcmVuY2UxMi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsNiArMzAsNyBAQAogICogV2Vha2lzaFJlZmVyZW5jZShPYmplY3QpIGNvbnN0cnVjdG9yLCBhbmQgYm90aCB0aGF0IGFuZCB0aGlzIGFyZSB0aGluCiAgKiBmYWNhZGVzIG9uIHRoZSB1bmRlcmx5aW5nIG5vLWxvbmdlci1hYnN0cmFjdCBiYXNlIGNsYXNzLgogICovCitARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIFdlYWtpc2hSZWZlcmVuY2UxMiBleHRlbmRzIFdlYWtpc2hSZWZlcmVuY2UuSGFyZFJlZmVyZW5jZSAgewogCiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlci5qYXZhCmluZGV4IDVjNDMzNzYuLmE1YjI5OTQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQwLDE1ICs0MCwxMCBAQAogICAgIC8vIENoZWNrU3R5bGU6VmlzaWJpbGl0eU1vZGlmaWVyIE9OCiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvciBmb3IgSmFrYXJ0YU9yb01hdGNoZXIuCi0gICAgICovCi0gICAgcHVibGljIEpha2FydGFPcm9NYXRjaGVyKCkgewotICAgIH0KLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgcmVnZXhwIHBhdHRlcm4gZnJvbSB0aGUgU3RyaW5nIGRlc2NyaXB0aW9uLgogICAgICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRvIG1hdGNoCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0UGF0dGVybihmaW5hbCBTdHJpbmcgcGF0dGVybikgewogICAgICAgICB0aGlzLnBhdHRlcm4gPSBwYXR0ZXJuOwogICAgIH0KQEAgLTU3LDYgKzUyLDcgQEAKICAgICAgKiBHZXQgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZ2V4cCBwYXR0ZXJuCiAgICAgICogQHJldHVybiB0aGUgcGF0dGVybgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0dGVybigpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucGF0dGVybjsKICAgICB9CkBAIC03MSw4ICs2Nyw3IEBACiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBjb21waWxlciBvcHRpb25zIGJhc2VkIG9uIHRoZSBpbnB1dCBvcHRpb25zIGZpcnN0Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuIHAgPSBjb21waWxlci5jb21waWxlKHBhdHRlcm4sIGdldENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKSk7Ci0gICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlci5jb21waWxlKHBhdHRlcm4sIGdldENvbXBpbGVyT3B0aW9ucyhvcHRpb25zKSk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KQEAgLTg0LDYgKzc5LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1hdGNoZXMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOwogICAgIH0KQEAgLTk1LDEwICs5MSwxMCBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoZmluYWwgU3RyaW5nIGlucHV0LCBmaW5hbCBpbnQgb3B0aW9ucykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgUGF0dGVybiBwID0gZ2V0Q29tcGlsZWRQYXR0ZXJuKG9wdGlvbnMpOwotICAgICAgICByZXR1cm4gbWF0Y2hlci5jb250YWlucyhpbnB1dCwgcCk7CisgICAgICAgIHJldHVybiBtYXRjaGVyLmNvbnRhaW5zKGlucHV0LCBnZXRDb21waWxlZFBhdHRlcm4ob3B0aW9ucykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTEyLDcgKzEwOCw4IEBACiAgICAgICogQHJldHVybiB0aGUgdmVjdG9yIG9mIGdyb3VwcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldEdyb3VwcyhmaW5hbCBTdHJpbmcgYXJndW1lbnQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldEdyb3VwcyhmaW5hbCBTdHJpbmcgYXJndW1lbnQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRHcm91cHMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOwogICAgIH0KIApAQCAtMTI3LDEyICsxMjQsMTMgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKGZpbmFsIFN0cmluZyBpbnB1dCwgZmluYWwgaW50IG9wdGlvbnMpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldEdyb3VwcyhmaW5hbCBTdHJpbmcgaW5wdXQsIGZpbmFsIGludCBvcHRpb25zKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBpZiAoIW1hdGNoZXMoaW5wdXQsIG9wdGlvbnMpKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKKyAgICAgICAgZmluYWwgVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8PigpOwogICAgICAgICBmaW5hbCBNYXRjaFJlc3VsdCBtciA9IG1hdGNoZXIuZ2V0TWF0Y2goKTsKICAgICAgICAgZmluYWwgaW50IGNudCA9IG1yLmdyb3VwcygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CkBAIC0xNDEsNyArMTM5LDcgQEAKICAgICAgICAgICAgIGlmIChtYXRjaCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgbWF0Y2ggPSAiIjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHYuYWRkRWxlbWVudChtYXRjaCk7CisgICAgICAgICAgICB2LmFkZChtYXRjaCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb1JlZ2V4cC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb1JlZ2V4cC5qYXZhCmluZGV4IDMyY2ViZWIuLjA5ZTEyNWQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHAuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvUmVnZXhwLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOSwxMSArMjksNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwgPSAxMDsKIAotICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgSmFrYXJ0YU9yb1JlZ2V4cCAqLwotICAgIHB1YmxpYyBKYWthcnRhT3JvUmVnZXhwKCkgewotICAgICAgICBzdXBlcigpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFBlcmZvcm0gYSBzdWJzdGl0dXRpb24gb24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KICAgICAgKiBAcGFyYW0gaW5wdXQgVGhlIHN0cmluZyB0byBzdWJzdGl0dXRlIG9uCkBAIC00NSw3ICs0MCw3IEBACiAgICAgcHVibGljIFN0cmluZyBzdWJzdGl0dXRlKGZpbmFsIFN0cmluZyBpbnB1dCwgZmluYWwgU3RyaW5nIGFyZ3VtZW50LCBmaW5hbCBpbnQgb3B0aW9ucykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgLy8gdHJhbnNsYXRlIFwxIHRvICQxIHNvIHRoYXQgdGhlIFBlcmw1U3Vic3RpdHV0aW9uIHdpbGwgd29yawotICAgICAgICBmaW5hbCBTdHJpbmdCdWZmZXIgc3Vic3QgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc3Vic3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50Lmxlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgYyA9IGFyZ3VtZW50LmNoYXJBdChpKTsKICAgICAgICAgICAgIGlmIChjID09ICckJykgewpAQCAtNTYsNyArNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBjID0gYXJndW1lbnQuY2hhckF0KGkpOwogICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmFsdWUgPSBDaGFyYWN0ZXIuZGlnaXQoYywgREVDSU1BTCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJzdC5hcHBlbmQoIiQiKS5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKCckJykuYXBwZW5kKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZChjKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODcsMTIgKzgyLDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSBvcm8gc3Vic3RpdHV0aW9uIG9wdGlvbnMKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgaW50IGdldFN1YnNPcHRpb25zKGZpbmFsIGludCBvcHRpb25zKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVwbGFjZUFsbCA9IFJlZ2V4cFV0aWwuaGFzRmxhZyhvcHRpb25zLCBSRVBMQUNFX0FMTCk7Ci0gICAgICAgIGludCBzdWJzT3B0aW9ucyA9IDE7Ci0gICAgICAgIGlmIChyZXBsYWNlQWxsKSB7Ci0gICAgICAgICAgICBzdWJzT3B0aW9ucyA9IFV0aWwuU1VCU1RJVFVURV9BTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1YnNPcHRpb25zOworICAgICAgICByZXR1cm4gUmVnZXhwVXRpbC5oYXNGbGFnKG9wdGlvbnMsIFJFUExBQ0VfQUxMKSA/IFV0aWwuU1VCU1RJVFVURV9BTEwKKyAgICAgICAgICAgIDogMTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlci5qYXZhCmluZGV4IDNlMTQ0MTUuLmI0YjQyMDIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cE1hdGNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM1LDYgKzM1LDcgQEAKICAgICAgKiBTZXQgdGhlIHJlZ2V4cCBwYXR0ZXJuIGZyb20gdGhlIFN0cmluZyBkZXNjcmlwdGlvbi4KICAgICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0byBtYXRjaAogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4pIHsKICAgICAgICAgdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKICAgICB9CkBAIC00Myw2ICs0NCw3IEBACiAgICAgICogR2V0IGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWdleHAgcGF0dGVybgogICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4KICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7CiAgICAgICAgIHJldHVybiBwYXR0ZXJuOwogICAgIH0KQEAgLTcyLDYgKzc0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1hdGNoZXMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOwogICAgIH0KQEAgLTgzLDYgKzg2LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBtYXRjaGVzKGlucHV0LCBnZXRDb21waWxlZFBhdHRlcm4ob3B0aW9ucykpOwpAQCAtMTAzLDcgKzEwNyw4IEBACiAgICAgICogQHJldHVybiB0aGUgdmVjdG9yIG9mIGdyb3VwcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KLSAgICBwdWJsaWMgVmVjdG9yIGdldEdyb3VwcyhTdHJpbmcgYXJndW1lbnQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldEdyb3VwcyhTdHJpbmcgYXJndW1lbnQpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIHJldHVybiBnZXRHcm91cHMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOwogICAgIH0KIApAQCAtMTE4LDEzICsxMjMsMTQgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlY3RvcjxTdHJpbmc+IGdldEdyb3VwcyhTdHJpbmcgaW5wdXQsIGludCBvcHRpb25zKQogICAgICAgICB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBSRSByZWcgPSBnZXRDb21waWxlZFBhdHRlcm4ob3B0aW9ucyk7CiAgICAgICAgIGlmICghbWF0Y2hlcyhpbnB1dCwgcmVnKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgaW50IGNudCA9IHJlZy5nZXRQYXJlbkNvdW50KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZyBtYXRjaCA9IHJlZy5nZXRQYXJlbihpKTsKQEAgLTEzMiw3ICsxMzgsNyBAQAogICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtYXRjaCA9ICIiOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdi5hZGRFbGVtZW50KG1hdGNoKTsKKyAgICAgICAgICAgIHYuYWRkKG1hdGNoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwUmVnZXhwLmphdmEKaW5kZXggY2RiNmRlOS4uMjJmMTRlZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cFJlZ2V4cC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBSZWdleHAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI5LDExICsyOSw2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTCA9IDEwOwogCi0gICAgLyoqIENvbnN0cnVjdG9yIGZvciBKYWthcnRhUmVnZXhwUmVnZXhwICovCi0gICAgcHVibGljIEpha2FydGFSZWdleHBSZWdleHAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ29udmVydCBhbnQgcmVnZXhwIHN1YnN0aXR1dGlvbiBvcHRpb24gdG8gYXBhY2hlIHJlZ2V4IG9wdGlvbnMuCiAgICAgICoKQEAgLTU2LDEyICs1MSwxMyBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RpdHV0ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBhcmd1bWVudCwgaW50IG9wdGlvbnMpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFZlY3RvciB2ID0gZ2V0R3JvdXBzKGlucHV0LCBvcHRpb25zKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdiA9IGdldEdyb3VwcyhpbnB1dCwgb3B0aW9ucyk7CiAKICAgICAgICAgLy8gcmVwbGFjZSBcMSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGdyb3VwCi0gICAgICAgIFN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd1bWVudC5sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICBjaGFyIGMgPSBhcmd1bWVudC5jaGFyQXQoaSk7CiAgICAgICAgICAgICBpZiAoYyA9PSAnXFwnKSB7CkBAIC02OSw3ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSBhcmd1bWVudC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IENoYXJhY3Rlci5kaWdpdChjLCBERUNJTUFMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKFN0cmluZykgdi5lbGVtZW50QXQodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodi5lbGVtZW50QXQodmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYyk7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgxLDEwICs3Nyw4IEBACiAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhcmd1bWVudCA9IHJlc3VsdC50b1N0cmluZygpOwotCiAgICAgICAgIFJFIHJlZyA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKICAgICAgICAgaW50IHNPcHRpb25zID0gZ2V0U3Vic09wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIHJldHVybiByZWcuc3Vic3QoaW5wdXQsIGFyZ3VtZW50LCBzT3B0aW9ucyk7CisgICAgICAgIHJldHVybiByZWcuc3Vic3QoaW5wdXQsIHJlc3VsdC50b1N0cmluZygpLCBzT3B0aW9ucyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXIuamF2YQppbmRleCA4YzI0MWQ0Li40ZDljNDM5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM0LDE0ICszNCwxMSBAQAogCiAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKIAotICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgSmFrYXJ0YU9yb1JlZ2V4cCAqLwotICAgIHB1YmxpYyBKZGsxNFJlZ2V4cE1hdGNoZXIoKSB7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogU2V0IHRoZSByZWdleHAgcGF0dGVybiBmcm9tIHRoZSBTdHJpbmcgZGVzY3JpcHRpb24uCiAgICAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gbWF0Y2gKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuKSB7CiAgICAgICAgIHRoaXMucGF0dGVybiA9IHBhdHRlcm47CiAgICAgfQpAQCAtNTEsNiArNDgsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIHBhdHRlcm4KICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRQYXR0ZXJuKCkgewogICAgICAgICByZXR1cm4gcGF0dGVybjsKICAgICB9CkBAIC02MywxMCArNjEsOCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCBQYXR0ZXJuIGdldENvbXBpbGVkUGF0dGVybihpbnQgb3B0aW9ucykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGNPcHRpb25zID0gZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgUGF0dGVybiBwID0gUGF0dGVybi5jb21waWxlKHRoaXMucGF0dGVybiwgY09wdGlvbnMpOwotICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICByZXR1cm4gUGF0dGVybi5jb21waWxlKHRoaXMucGF0dGVybiwgZ2V0Q29tcGlsZXJPcHRpb25zKG9wdGlvbnMpKTsKICAgICAgICAgfSBjYXRjaCAoUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KQEAgLTc4LDYgKzc0LDcgQEAKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIG1hdGNoZXMoYXJndW1lbnQsIE1BVENIX0RFRkFVTFQpOwogICAgIH0KQEAgLTg5LDExICs4NiwxMSBAQAogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0dGVybiBtYXRjaGVzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykKICAgICAgICAgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFBhdHRlcm4gcCA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKLSAgICAgICAgICAgIHJldHVybiBwLm1hdGNoZXIoaW5wdXQpLmZpbmQoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRDb21waWxlZFBhdHRlcm4ob3B0aW9ucykubWF0Y2hlcihpbnB1dCkuZmluZCgpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICB9CkBAIC0xMTAsNyArMTA3LDggQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLwotICAgIHB1YmxpYyBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmVjdG9yPFN0cmluZz4gZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgcmV0dXJuIGdldEdyb3Vwcyhhcmd1bWVudCwgTUFUQ0hfREVGQVVMVCk7CiAgICAgfQogCkBAIC0xMjUsMTQgKzEyMywxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIHZlY3RvciBvZiBncm91cHMKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCi0gICAgcHVibGljIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmVjdG9yPFN0cmluZz4gZ2V0R3JvdXBzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhdHRlcm4gcCA9IGdldENvbXBpbGVkUGF0dGVybihvcHRpb25zKTsKICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcC5tYXRjaGVyKGlucHV0KTsKICAgICAgICAgaWYgKCFtYXRjaGVyLmZpbmQoKSkgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgaW50IGNudCA9IG1hdGNoZXIuZ3JvdXBDb3VudCgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBjbnQ7IGkrKykgewogICAgICAgICAgICAgU3RyaW5nIG1hdGNoID0gbWF0Y2hlci5ncm91cChpKTsKQEAgLTE0MCw3ICsxMzksNyBAQAogICAgICAgICAgICAgaWYgKG1hdGNoID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtYXRjaCA9ICIiOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdi5hZGRFbGVtZW50KG1hdGNoKTsKKyAgICAgICAgICAgIHYuYWRkKG1hdGNoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdjsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cFJlZ2V4cC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHAuamF2YQppbmRleCBkZTAwNTRmLi5iMTkzOWEwIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cFJlZ2V4cC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwUmVnZXhwLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOSwxMSArMjksNiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwgPSAxMDsKIAotICAgIC8qKiBDb25zdHJ1Y3RvciBmb3IgSmRrMTRSZWdleHBSZWdleHAgKi8KLSAgICBwdWJsaWMgSmRrMTRSZWdleHBSZWdleHAoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQ29udmVydCBhbnQgcmVnZXhwIHN1YnN0aXR1dGlvbiBvcHRpb24gdG8gamRrMS40IG9wdGlvbnMuCiAgICAgICoKQEAgLTU2LDEwICs1MSwxMSBAQAogICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgc3Vic3RpdHV0ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBhcmd1bWVudCwgaW50IG9wdGlvbnMpCiAgICAgICAgIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIC8vIHRyYW5zbGF0ZSBcMSB0byAkKDEpIHNvIHRoYXQgdGhlIE1hdGNoZXIgd2lsbCB3b3JrCi0gICAgICAgIFN0cmluZ0J1ZmZlciBzdWJzdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdWJzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnQubGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgY2hhciBjID0gYXJndW1lbnQuY2hhckF0KGkpOwogICAgICAgICAgICAgaWYgKGMgPT0gJyQnKSB7CkBAIC03MCw3ICs2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgIGMgPSBhcmd1bWVudC5jaGFyQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IENoYXJhY3Rlci5kaWdpdChjLCBERUNJTUFMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0LmFwcGVuZCgiJCIpLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdC5hcHBlbmQoJyQnKS5hcHBlbmQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKGMpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC04Miw3ICs3OCw2IEBACiAgICAgICAgICAgICAgICAgc3Vic3QuYXBwZW5kKGMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGFyZ3VtZW50ID0gc3Vic3QudG9TdHJpbmcoKTsKIAogICAgICAgICBpbnQgc09wdGlvbnMgPSBnZXRTdWJzT3B0aW9ucyhvcHRpb25zKTsKICAgICAgICAgUGF0dGVybiBwID0gZ2V0Q29tcGlsZWRQYXR0ZXJuKG9wdGlvbnMpOwpAQCAtOTAsMTUgKzg1LDEyIEBACiAKICAgICAgICAgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGlucHV0KTsKICAgICAgICAgaWYgKFJlZ2V4cFV0aWwuaGFzRmxhZyhzT3B0aW9ucywgUkVQTEFDRV9BTEwpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQobS5yZXBsYWNlQWxsKGFyZ3VtZW50KSk7CisgICAgICAgICAgICBzYi5hcHBlbmQobS5yZXBsYWNlQWxsKHN1YnN0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtLmZpbmQoKSkgeworICAgICAgICAgICAgbS5hcHBlbmRSZXBsYWNlbWVudChzYiwgc3Vic3QudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtLmFwcGVuZFRhaWwoc2IpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYm9vbGVhbiByZXMgPSBtLmZpbmQoKTsKLSAgICAgICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgICAgICBtLmFwcGVuZFJlcGxhY2VtZW50KHNiLCBhcmd1bWVudCk7Ci0gICAgICAgICAgICAgICAgbS5hcHBlbmRUYWlsKHNiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKGlucHV0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChpbnB1dCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHAuamF2YQppbmRleCAxYzc4MTZhLi4zMzIyNmI2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHAuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHAuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cEZhY3RvcnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cEZhY3RvcnkuamF2YQppbmRleCA3MDc3YTIxLi5iN2ZjM2NkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBGYWN0b3J5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwRmFjdG9yeS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsMTAgKzMwLDYgQEAKICAqLwogcHVibGljIGNsYXNzIFJlZ2V4cEZhY3RvcnkgZXh0ZW5kcyBSZWdleHBNYXRjaGVyRmFjdG9yeSB7CiAKLSAgICAvKiogQ29uc3RydWN0b3IgZm9yIFJlZ2V4cEZhY3RvcnkgKi8KLSAgICBwdWJsaWMgUmVnZXhwRmFjdG9yeSgpIHsKLSAgICB9Ci0KICAgICAvKioqCiAgICAgICogQ3JlYXRlIGEgbmV3IHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIGluc3RhbmNlLgogICAgICAqIEByZXR1cm4gdGhlIG1hdGNoZXIgaW5zdGFuY2UKQEAgLTUxLDcgKzQ3LDcgQEAKICAgICAgKiBAdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIG9uIGVycm9yCiAgICAgICovCiAgICAgcHVibGljIFJlZ2V4cCBuZXdSZWdleHAoUHJvamVjdCBwKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgc3lzdGVtRGVmYXVsdCA9IG51bGw7CisgICAgICAgIFN0cmluZyBzeXN0ZW1EZWZhdWx0OwogICAgICAgICBpZiAocCA9PSBudWxsKSB7CiAgICAgICAgICAgICBzeXN0ZW1EZWZhdWx0ID0gU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuUkVHRVhQX0lNUEwpOwogICAgICAgICB9IGVsc2UgewpAQCAtNzgsOCArNzQsOCBAQAogICAgICAqIEBzZWUgUmVnZXhwTWF0Y2hlckZhY3RvcnkjY3JlYXRlSW5zdGFuY2UoU3RyaW5nKQogICAgICAqLwogICAgIHByb3RlY3RlZCBSZWdleHAgY3JlYXRlUmVnZXhwSW5zdGFuY2UoU3RyaW5nIGNsYXNzbmFtZSkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIChSZWdleHApIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzbmFtZSwgUmVnZXhwRmFjdG9yeS5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLAotICAgICAgICAgICAgICAgIFJlZ2V4cC5jbGFzcyk7CisgICAgICAgIHJldHVybiBDbGFzc3BhdGhVdGlscy5uZXdJbnN0YW5jZShjbGFzc25hbWUsCisgICAgICAgICAgICBSZWdleHBGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksIFJlZ2V4cC5jbGFzcyk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyLmphdmEKaW5kZXggNzkzOGQ4Yi4uMzc1NDU3NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgKiBAcmV0dXJuIHRoZSB2ZWN0b3Igb2YgZ3JvdXBzCiAgICAgICogQHRocm93cyBCdWlsZEV4Y2VwdGlvbiBvbiBlcnJvcgogICAgICAqLwotICAgIFZlY3RvciBnZXRHcm91cHMoU3RyaW5nIGFyZ3VtZW50KSB0aHJvd3MgQnVpbGRFeGNlcHRpb247CisgICAgVmVjdG9yPFN0cmluZz4gZ2V0R3JvdXBzKFN0cmluZyBhcmd1bWVudCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOwogCiAgICAgLyoqKgogICAgICAqIERvZXMgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggdGhlIGlucHV0LCBnaXZlbgpAQCAtMTA1LDYgKzEwNSw2IEBACiAgICAgICogQHJldHVybiB0aGUgdmVjdG9yIG9mIGdyb3VwcwogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KLSAgICBWZWN0b3IgZ2V0R3JvdXBzKFN0cmluZyBpbnB1dCwgaW50IG9wdGlvbnMpIHRocm93cyBCdWlsZEV4Y2VwdGlvbjsKKyAgICBWZWN0b3I8U3RyaW5nPiBnZXRHcm91cHMoU3RyaW5nIGlucHV0LCBpbnQgb3B0aW9ucykgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uOwogCiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlckZhY3RvcnkuamF2YQppbmRleCA0ZjIwODJkLi5lYmYzNDIzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyRmFjdG9yeS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cE1hdGNoZXJGYWN0b3J5LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMywxMCArMzMsNiBAQAogICovCiBwdWJsaWMgY2xhc3MgUmVnZXhwTWF0Y2hlckZhY3RvcnkgewogCi0gICAgLyoqIENvbnN0cnVjdG9yIGZvciBSZWdleHBNYXRjaGVyRmFjdG9yeS4gKi8KLSAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlckZhY3RvcnkoKSB7Ci0gICAgfQotCiAgICAgLyoqKgogICAgICAqIENyZWF0ZSBhIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gaW5zdGFuY2UuCiAgICAgICogQHJldHVybiB0aGUgbWF0Y2hlcgpAQCAtNTQsNyArNTAsNyBAQAogICAgICAqIEB0aHJvd3MgQnVpbGRFeGNlcHRpb24gb24gZXJyb3IKICAgICAgKi8KICAgICBwdWJsaWMgUmVnZXhwTWF0Y2hlciBuZXdSZWdleHBNYXRjaGVyKFByb2plY3QgcCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHN5c3RlbURlZmF1bHQgPSBudWxsOworICAgICAgICBTdHJpbmcgc3lzdGVtRGVmYXVsdDsKICAgICAgICAgaWYgKHAgPT0gbnVsbCkgewogICAgICAgICAgICAgc3lzdGVtRGVmYXVsdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLlJFR0VYUF9JTVBMKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTc4LDggKzc0LDggQEAKICAgICAgKiBAZXhjZXB0aW9uIEJ1aWxkRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycwogICAgICAqLwogICAgIHByb3RlY3RlZCBSZWdleHBNYXRjaGVyIGNyZWF0ZUluc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiAoUmVnZXhwTWF0Y2hlcikgQ2xhc3NwYXRoVXRpbHMubmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBSZWdleHBNYXRjaGVyRmFjdG9yeS5jbGFzcwotICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpLCBSZWdleHBNYXRjaGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIENsYXNzcGF0aFV0aWxzLm5ld0luc3RhbmNlKGNsYXNzTmFtZSwKKyAgICAgICAgICAgIFJlZ2V4cE1hdGNoZXJGYWN0b3J5LmNsYXNzLmdldENsYXNzTG9hZGVyKCksIFJlZ2V4cE1hdGNoZXIuY2xhc3MpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVXRpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVXRpbC5qYXZhCmluZGV4IDE4ZmI5NWEuLjRhMGIzYTcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cFV0aWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBVdGlsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGlzIHNldAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNGbGFnKGludCBvcHRpb25zLCBpbnQgZmxhZykgewotICAgICAgICByZXR1cm4gKChvcHRpb25zICYgZmxhZykgPiAwKTsKKyAgICAgICAgcmV0dXJuIChvcHRpb25zICYgZmxhZykgPiAwOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQsNyArNDQsNyBAQAogICAgICAqIEByZXR1cm4gdGhlIG9wdGlvbnMgd2l0aCB0aGUgZmxhZyB1bnNldAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IHJlbW92ZUZsYWcoaW50IG9wdGlvbnMsIGludCBmbGFnKSB7Ci0gICAgICAgIHJldHVybiAob3B0aW9ucyAmICgweEZGRkZGRkZGIC0gZmxhZykpOworICAgICAgICByZXR1cm4gb3B0aW9ucyAmICgweEZGRkZGRkZGIC0gZmxhZyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02MiwxMCArNjIsMTAgQEAKICAgICBwdWJsaWMgc3RhdGljIGludCBhc09wdGlvbnMoU3RyaW5nIGZsYWdzKSB7CiAgICAgICAgIGludCBvcHRpb25zID0gUmVnZXhwTWF0Y2hlci5NQVRDSF9ERUZBVUxUOwogICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgb3B0aW9ucyA9IGFzT3B0aW9ucyhmbGFncy5pbmRleE9mKCdpJykgPT0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLmluZGV4T2YoJ20nKSAhPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MuaW5kZXhPZigncycpICE9IC0xKTsKLSAgICAgICAgICAgIGlmIChmbGFncy5pbmRleE9mKCdnJykgIT0gLTEpIHsKKyAgICAgICAgICAgIG9wdGlvbnMgPSBhc09wdGlvbnMoIWZsYWdzLmNvbnRhaW5zKCJpIiksCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbnRhaW5zKCJtIiksCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLmNvbnRhaW5zKCJzIikpOworICAgICAgICAgICAgaWYgKGZsYWdzLmNvbnRhaW5zKCJnIikpIHsKICAgICAgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cC5SRVBMQUNFX0FMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtOTYsMTMgKzk2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2luZ2xlTGluZSkgewogICAgICAgICBpbnQgb3B0aW9ucyA9IFJlZ2V4cE1hdGNoZXIuTUFUQ0hfREVGQVVMVDsKICAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8IFJlZ2V4cE1hdGNoZXIuTUFUQ0hfQ0FTRV9JTlNFTlNJVElWRTsKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gUmVnZXhwTWF0Y2hlci5NQVRDSF9DQVNFX0lOU0VOU0lUSVZFOwogICAgICAgICB9CiAgICAgICAgIGlmIChtdWx0aUxpbmUpIHsKLSAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHwgUmVnZXhwTWF0Y2hlci5NQVRDSF9NVUxUSUxJTkU7CisgICAgICAgICAgICBvcHRpb25zIHw9IFJlZ2V4cE1hdGNoZXIuTUFUQ0hfTVVMVElMSU5FOwogICAgICAgICB9CiAgICAgICAgIGlmIChzaW5nbGVMaW5lKSB7Ci0gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8IFJlZ2V4cE1hdGNoZXIuTUFUQ0hfU0lOR0xFTElORTsKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gUmVnZXhwTWF0Y2hlci5NQVRDSF9TSU5HTEVMSU5FOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQlppcDJDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQlppcDJDb25zdGFudHMuamF2YQppbmRleCBkZjMyZDk1Li45ZjZkY2U1IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0JaaXAyQ29uc3RhbnRzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9CWmlwMkNvbnN0YW50cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9CbG9ja1NvcnQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQmxvY2tTb3J0LmphdmEKaW5kZXggZTJhYWYzNy4uMDE0MzllMSAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9CbG9ja1NvcnQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0Jsb2NrU29ydC5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC01Miw3ICs1Miw3IEBACiAgKiBzc0NvbW1vbnMgQ29tcHJlCiAgKiA8L3ByZT4KICAqCi0gKiA8cD5XaGljaCByZXN1bHRzIGluIGEgbmV3IHRleHQgInNzIHJvbW9vQ0NtbXBuc2UiLCBpbiBhZGl0aW9uIHRoZQorICogPHA+V2hpY2ggcmVzdWx0cyBpbiBhIG5ldyB0ZXh0ICJzcyByb21vb0NDbW1wbnNlIiwgaW4gYWRkaXRpb24gdGhlCiAgKiBpbmRleCBvZiB0aGUgZmlyc3QgbGluZSB0aGF0IGNvbnRhaW5lZCB0aGUgb3JpZ2luYWwgdGV4dCBpcyBrZXB0IC0KICAqIGluIHRoaXMgY2FzZSBpdCBpcyAxLiAgVGhlIGlkZWEgaXMgdGhhdCBpbiBhIGxvbmcgRW5nbGlzaCB0ZXh0IGFsbAogICogcGVybXV0YXRpb25zIHRoYXQgc3RhcnQgd2l0aCAiaGUiIGFyZSBsaWtlbHkgc3VmZml4ZXMgb2YgYSAidGhlIiBhbmQKQEAgLTYzLDE0ICs2MywxNCBAQAogICogPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIGZvciBleGFtcGxlOjwvcD4KICAqIDx1bD4KICAqICAgPGxpPjxhCi0gKiAgIGhyZWY9Imh0dHA6Ly93d3cuaHBsLmhwLmNvbS90ZWNocmVwb3J0cy9Db21wYXEtREVDL1NSQy1SUi0xMjQucGRmIj5CdXJyb3dzLAorICogICBocmVmPSJodHRwczovL3d3dy5ocGwuaHAuY29tL3RlY2hyZXBvcnRzL0NvbXBhcS1ERUMvU1JDLVJSLTEyNC5wZGYiPkJ1cnJvd3MsCiAgKiAgIE0uIGFuZCBXaGVlbGVyLCBELjogQSBCbG9jay1zb3J0aW5nIExvc3NsZXNzIERhdGEgQ29tcHJlc3Npb24KICAqICAgQWxnb3JpdGhtPC9hPjwvbGk+CiAgKiAgIDxsaT48YSBocmVmPSJodHRwOi8vd2ViZ2xpbXBzZS5uZXQvcHVicy9zdWZmaXgucGRmIj5NYW5iZXIsIFUuIGFuZAogICogICBNeWVycywgRy46IFN1ZmZpeCBhcnJheXM6IEEgbmV3IG1ldGhvZCBmb3Igb24tbGluZSBzdHJpbmcKICAqICAgc2VhcmNoZXM8L2E+PC9saT4KICAqICAgPGxpPjxhCi0gKiAgIGhyZWY9Imh0dHA6Ly93d3cuY3MudHVmdHMuZWR1L35uci9jb21wMTUwZnAvYXJjaGl2ZS9ib2Itc2VkZ2V3aWNrL2Zhc3Qtc3RyaW5ncy5wZGYiPkJlbnRsZXksCisgKiAgIGhyZWY9Imh0dHBzOi8vd3d3LmNzLnR1ZnRzLmVkdS9+bnIvY29tcDE1MGZwL2FyY2hpdmUvYm9iLXNlZGdld2ljay9mYXN0LXN0cmluZ3MucGRmIj5CZW50bGV5LAogICogICBKLkwuIGFuZCBTZWRnZXdpY2ssIFIuOiBGYXN0IEFsZ29yaXRobXMgZm9yIFNvcnRpbmcgYW5kIFNlYXJjaGluZwogICogICBTdHJpbmdzPC9hPjwvbGk+CiAgKiA8L3VsPgpAQCAtMTE3LDYgKzExNyw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRSA9IDEwMDsKIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFDS19TSVpFID0KICAgICAgICAgUVNPUlRfU1RBQ0tfU0laRSA8IEZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkUKICAgICAgICAgPyBGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFIDogUVNPUlRfU1RBQ0tfU0laRTsKQEAgLTUyMyw3ICs1MjQsNyBAQAogCiAgICAgICAgIC8qLS0gTEJaMjogdGhlIGxvZyhOKSBsb29wIC0tKi8KICAgICAgICAgSCA9IDE7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGRvIHsKIAogICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKQEAgLTU3MiwxMCArNTczLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgSCAqPSAyOwotICAgICAgICAgICAgaWYgKEggPiBuYmxvY2sgfHwgbk5vdERvbmUgPT0gMCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKEggPD0gbmJsb2NrICYmIG5Ob3REb25lICE9IDApOwogICAgIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNjUxLDcgKzY0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob25jZVJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtYXBbal0gPSBhOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaiAtPSBoKSA8PSBtaikgeyAvL05PU09OQVIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgSEFNTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2VSdW4gPSB0cnVlOwpAQCAtNjcwLDcgKzY2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2NrW2kxICsgNV0gPT0gYmxvY2tbaTIgKyA1XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tbKGkxICs9IDYpXSA9PSBibG9ja1soaTIgKz0gNildKSB7IC8vTk9TT05BUgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSBsYXN0U2hhZG93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWDogd2hpbGUgKHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoeCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC09IDQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2tbaTEgKyAxXSA9PSBibG9ja1tpMiArIDFdKSB7CkBAIC02ODgsNyArNjg2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMiAtPSBsYXN0UGx1czE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrRG9uZVNoYWRvdysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgWDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgocXVhZHJhbnRbaTEgKyAzXSA+IHF1YWRyYW50W2kyICsgM10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBIQU1NRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03MzEsMzkgKzcyOCwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgSEFNTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgeCA+IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJsb2NrW2kxXSAmIDB4ZmYpID4gKGJsb2NrW2kyXSAmIDB4ZmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgSEFNTUVSOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBIQU1NRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChibG9ja1tpMV0gJiAweGZmKSA8PSAoYmxvY2tbaTJdICYgMHhmZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYmxvY2tbaTEgKyA1XSAmIDB4ZmYpID4gKGJsb2NrW2kyICsgNV0gJiAweGZmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBIQU1NRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgSEFNTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgNV0gJiAweGZmKSA8PSAoYmxvY2tbaTIgKyA1XSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgNF0gJiAweGZmKSA+IChibG9ja1tpMiArIDRdICYgMHhmZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBIQU1NRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEhBTU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgNF0gJiAweGZmKSA8PSAoYmxvY2tbaTIgKyA0XSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgM10gJiAweGZmKSA+IChibG9ja1tpMiArIDNdICYgMHhmZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIEhBTU1FUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEhBTU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYmxvY2tbaTEgKyAzXSAmIDB4ZmYpIDw9IChibG9ja1tpMiArIDNdICYgMHhmZikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYmxvY2tbaTEgKyAyXSAmIDB4ZmYpID4gKGJsb2NrW2kyICsgMl0gJiAweGZmKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBIQU1NRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgSEFNTUVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgMl0gJiAweGZmKSA8PSAoYmxvY2tbaTIgKyAyXSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgMV0gJiAweGZmKSA+IChibG9ja1tpMiArIDFdICYgMHhmZikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBIQU1NRVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIEhBTU1FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJsb2NrW2kxICsgMV0gJiAweGZmKSA8PSAoYmxvY2tbaTIgKyAxXSAmIDB4ZmYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgfSAvLyBIQU1NRVIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAySW5wdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAySW5wdXRTdHJlYW0uamF2YQppbmRleCA3NTYzYTQwLi44ZGZiZmM2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMklucHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9DQlppcDJJbnB1dFN0cmVhbS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsMTEgKzMyLDExIEBACiAgKgogICogPHA+VGhlIGRlY29tcHJlc3Npb24gcmVxdWlyZXMgbGFyZ2UgYW1vdW50cyBvZiBtZW1vcnkuIFRodXMgeW91CiAgKiBzaG91bGQgY2FsbCB0aGUge0BsaW5rICNjbG9zZSgpIGNsb3NlKCl9IG1ldGhvZCBhcyBzb29uIGFzCi0gKiBwb3NzaWJsZSwgdG8gZm9yY2UgPHR0PkNCWmlwMklucHV0U3RyZWFtPC90dD4gdG8gcmVsZWFzZSB0aGUKKyAqIHBvc3NpYmxlLCB0byBmb3JjZSA8Y29kZT5DQlppcDJJbnB1dFN0cmVhbTwvY29kZT4gdG8gcmVsZWFzZSB0aGUKICAqIGFsbG9jYXRlZCBtZW1vcnkuICBTZWUge0BsaW5rIENCWmlwMk91dHB1dFN0cmVhbQogICogQ0JaaXAyT3V0cHV0U3RyZWFtfSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgbWVtb3J5IHVzYWdlLjwvcD4KICAqCi0gKiA8cD48dHQ+Q0JaaXAySW5wdXRTdHJlYW08L3R0PiByZWFkcyBieXRlcyBmcm9tIHRoZSBjb21wcmVzc2VkCisgKiA8cD48Y29kZT5DQlppcDJJbnB1dFN0cmVhbTwvY29kZT4gcmVhZHMgYnl0ZXMgZnJvbSB0aGUgY29tcHJlc3NlZAogICogc291cmNlIHN0cmVhbSB2aWEgdGhlIHNpbmdsZSBieXRlIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtI3JlYWQoKQogICogcmVhZCgpfSBtZXRob2QgZXhjbHVzaXZlbHkuIFRodXMgeW91IHNob3VsZCBjb25zaWRlciB0byB1c2UgYQogICogYnVmZmVyZWQgc291cmNlIHN0cmVhbS48L3A+CkBAIC03NCw3ICs3NCw3IEBACiAKICAgICBwcml2YXRlIGludCBjdXJyZW50Q2hhciA9IC0xOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPRiAgICAgICAgICAgICAgICAgID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU9GICAgICAgICAgICAgICAgPSAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFSVF9CTE9DS19TVEFURSA9IDE7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJBTkRfUEFSVF9BX1NUQVRFID0gMjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFORF9QQVJUX0JfU1RBVEUgPSAzOwpAQCAtODUsOCArODUsMTAgQEAKIAogICAgIHByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZSA9IFNUQVJUX0JMT0NLX1NUQVRFOwogCi0gICAgcHJpdmF0ZSBpbnQgc3RvcmVkQmxvY2tDUkMsIHN0b3JlZENvbWJpbmVkQ1JDOwotICAgIHByaXZhdGUgaW50IGNvbXB1dGVkQmxvY2tDUkMsIGNvbXB1dGVkQ29tYmluZWRDUkM7CisgICAgcHJpdmF0ZSBpbnQgc3RvcmVkQmxvY2tDUkM7CisgICAgcHJpdmF0ZSBpbnQgc3RvcmVkQ29tYmluZWRDUkM7CisgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZWRCbG9ja0NSQzsKKyAgICBwcml2YXRlIGludCBjb21wdXRlZENvbWJpbmVkQ1JDOwogCiAgICAgLy8gVmFyaWFibGVzIHVzZWQgYnkgc2V0dXAqIG1ldGhvZHMgZXhjbHVzaXZlbHkKIApAQCAtMTEyLDcgKzExNCw3IEBACiAgICAgICogY29uY2F0ZW5hdGVkIC5iejIgZmlsZXMuCiAgICAgICoKICAgICAgKiA8cD5BbHRob3VnaCBCWmlwMiBoZWFkZXJzIGFyZSBtYXJrZWQgd2l0aCB0aGUgbWFnaWMKLSAgICAgKiA8dHQ+IkJ6IjwvdHQ+IHRoaXMgY29uc3RydWN0b3IgZXhwZWN0cyB0aGUgbmV4dCBieXRlIGluIHRoZQorICAgICAqIDxjb2RlPiJCeiI8L2NvZGU+IHRoaXMgY29uc3RydWN0b3IgZXhwZWN0cyB0aGUgbmV4dCBieXRlIGluIHRoZQogICAgICAqIHN0cmVhbSB0byBiZSB0aGUgZmlyc3Qgb25lIGFmdGVyIHRoZSBtYWdpYy4gIFRodXMgY2FsbGVycyBoYXZlCiAgICAgICogdG8gc2tpcCB0aGUgZmlyc3QgdHdvIGJ5dGVzLiBPdGhlcndpc2UgdGhpcyBjb25zdHJ1Y3RvciB3aWxsCiAgICAgICogdGhyb3cgYW4gZXhjZXB0aW9uLiA8L3A+CkBAIC0xMjEsNyArMTIzLDcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICogIGlmIHRoZSBzdHJlYW0gY29udGVudCBpcyBtYWxmb3JtZWQgb3IgYW4gSS9PIGVycm9yIG9jY3Vycy4KICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCi0gICAgICogIGlmIDx0dD5pbiA9PSBudWxsPC90dD4KKyAgICAgKiAgaWYgPGNvZGU+aW4gPT0gbnVsbDwvY29kZT4KICAgICAgKi8KICAgICBwdWJsaWMgQ0JaaXAySW5wdXRTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMoaW4sIGZhbHNlKTsKQEAgLTEzMiw3ICsxMzQsNyBAQAogICAgICAqIHJlYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KICAgICAgKgogICAgICAqIDxwPkFsdGhvdWdoIEJaaXAyIGhlYWRlcnMgYXJlIG1hcmtlZCB3aXRoIHRoZSBtYWdpYwotICAgICAqIDx0dD4iQnoiPC90dD4gdGhpcyBjb25zdHJ1Y3RvciBleHBlY3RzIHRoZSBuZXh0IGJ5dGUgaW4gdGhlCisgICAgICogPGNvZGU+IkJ6IjwvY29kZT4gdGhpcyBjb25zdHJ1Y3RvciBleHBlY3RzIHRoZSBuZXh0IGJ5dGUgaW4gdGhlCiAgICAgICogc3RyZWFtIHRvIGJlIHRoZSBmaXJzdCBvbmUgYWZ0ZXIgdGhlIG1hZ2ljLiAgVGh1cyBjYWxsZXJzIGhhdmUKICAgICAgKiB0byBza2lwIHRoZSBmaXJzdCB0d28gYnl0ZXMuIE90aGVyd2lzZSB0aGlzIGNvbnN0cnVjdG9yIHdpbGwKICAgICAgKiB0aHJvdyBhbiBleGNlcHRpb24uIDwvcD4KQEAgLTE0Nyw3ICsxNDksNyBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKiAgICAgICAgICAgICBpZiB0aGUgc3RyZWFtIGNvbnRlbnQgaXMgbWFsZm9ybWVkIG9yIGFuIEkvTyBlcnJvciBvY2N1cnMuCiAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIGlmIDx0dD5pbiA9PSBudWxsPC90dD4KKyAgICAgKiAgICAgICAgICAgICBpZiA8Y29kZT5pbiA9PSBudWxsPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBDQlppcDJJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZWNvbXByZXNzQ29uY2F0ZW5hdGVkKQpAQCAtMjg2LDcgKzI4OCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgYmxvY2tTaXplID0gdGhpcy5pbi5yZWFkKCk7Ci0gICAgICAgIGlmICgoYmxvY2tTaXplIDwgJzEnKSB8fCAoYmxvY2tTaXplID4gJzknKSkgeworICAgICAgICBpZiAoYmxvY2tTaXplIDwgJzEnIHx8IGJsb2NrU2l6ZSA+ICc5JykgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gaXMgbm90IEJaaXAyIGZvcm1hdHRlZDogaWxsZWdhbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmxvY2tzaXplICIgKyAoY2hhcikgYmxvY2tTaXplKTsKICAgICAgICAgfQpAQCAtMzU5LDcgKzM2MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZW5kQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCBlbmRCbG9jaygpIHsKICAgICAgICAgdGhpcy5jb21wdXRlZEJsb2NrQ1JDID0gdGhpcy5jcmMuZ2V0RmluYWxDUkMoKTsKIAogICAgICAgICAvLyBBIGJhZCBDUkMgaXMgY29uc2lkZXJlZCBhIGZhdGFsIGVycm9yLgpAQCAtNjYwLDcgKzY2Miw3IEBACiAgICAgICAgIGludCBtaW5MZW5zX3p0ICA9IG1pbkxlbnNbenRdOwogCiAgICAgICAgIHdoaWxlIChuZXh0U3ltICE9IGVvYikgewotICAgICAgICAgICAgaWYgKChuZXh0U3ltID09IFJVTkEpIHx8IChuZXh0U3ltID09IFJVTkIpKSB7CisgICAgICAgICAgICBpZiAobmV4dFN5bSA9PSBSVU5BIHx8IG5leHRTeW0gPT0gUlVOQikgewogICAgICAgICAgICAgICAgIGludCBzID0gLTE7CiAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMTsgdHJ1ZTsgbiA8PD0gMSkgewpAQCAtODUzLDcgKzg1NSw3IEBACiAgICAgICAgICAgICB0dFtjZnRhYltsbDhbaV0gJiAweGZmXSsrXSA9IGk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKHRoaXMub3JpZ1B0ciA8IDApIHx8ICh0aGlzLm9yaWdQdHIgPj0gdHQubGVuZ3RoKSkgeworICAgICAgICBpZiAodGhpcy5vcmlnUHRyIDwgMCB8fCB0aGlzLm9yaWdQdHIgPj0gdHQubGVuZ3RoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oInN0cmVhbSBjb3JydXB0ZWQiKTsKICAgICAgICAgfQogCkBAIC05ODMsNyArOTg1LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgZXh0ZW5kcyBPYmplY3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgewogCiAgICAgICAgIC8vICh3aXRoIGJsb2NrU2l6ZSA5MDBrKQogICAgICAgICBmaW5hbCBib29sZWFuW10gaW5Vc2UgICA9IG5ldyBib29sZWFuWzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDI1NiBieXRlCkBAIC0xMDM3LDcgKzEwMzksNyBAQAogICAgICAgICAgICAgLy8gaXQgY2FuIGhhcHBlbiwgaWYgdGhlIGNvbXByZXNzb3IgbWl4ZWQgc21hbGwgYW5kIGxhcmdlCiAgICAgICAgICAgICAvLyBibG9ja3MuICBOb3JtYWxseSBvbmx5IHRoZSBsYXN0IGJsb2NrIHdpbGwgYmUgc21hbGxlcgogICAgICAgICAgICAgLy8gdGhhbiBvdGhlcnMuCi0gICAgICAgICAgICBpZiAoKHR0U2hhZG93ID09IG51bGwpIHx8ICh0dFNoYWRvdy5sZW5ndGggPCBsZW5ndGgpKSB7CisgICAgICAgICAgICBpZiAodHRTaGFkb3cgPT0gbnVsbCB8fCB0dFNoYWRvdy5sZW5ndGggPCBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICB0aGlzLnR0ID0gdHRTaGFkb3cgPSBuZXcgaW50W2xlbmd0aF07CiAgICAgICAgICAgICB9CiAKQEAgLTEwNDYsNyArMTA0OCw3IEBACiAKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydENSQ0Vycm9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydENSQ0Vycm9yKCkgewogICAgICAgICAvLyBUaGUgY2xlYW4gd2F5IHdvdWxkIGJlIHRvIHRocm93IGFuIGV4Y2VwdGlvbi4KICAgICAgICAgLy90aHJvdyBuZXcgSU9FeGNlcHRpb24oImNyYyBlcnJvciIpOwogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMk91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9DQlppcDJPdXRwdXRTdHJlYW0uamF2YQppbmRleCBhNWNhMDY4Li43OTE5YTZhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMk91dHB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNCw3ICszNCw3IEBACiAgKiA8cD4KICAqIFRoZSBjb21wcmVzc2lvbiByZXF1aXJlcyBsYXJnZSBhbW91bnRzIG9mIG1lbW9yeS4gVGh1cyB5b3Ugc2hvdWxkIGNhbGwgdGhlCiAgKiB7QGxpbmsgI2Nsb3NlKCkgY2xvc2UoKX0gbWV0aG9kIGFzIHNvb24gYXMgcG9zc2libGUsIHRvIGZvcmNlCi0gKiA8dHQ+Q0JaaXAyT3V0cHV0U3RyZWFtPC90dD4gdG8gcmVsZWFzZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqIDxjb2RlPkNCWmlwMk91dHB1dFN0cmVhbTwvY29kZT4gdG8gcmVsZWFzZSB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KICAqIDwvcD4KICAqCiAgKiA8cD5Zb3UgY2FuIHNocmluayB0aGUgYW1vdW50IG9mIGFsbG9jYXRlZCBtZW1vcnkgYW5kIG1heWJlIHJhaXNlCkBAIC01Nyw2MiArNTcsNjIgQEAKICAqICZsdDtjb2RlJmd0OzY1ayArICg1ICogYmxvY2tzaXplKSZsdDsvY29kZSZndDsuCiAgKiA8L3ByZT4KICAqCi0gKiA8dGFibGUgYm9yZGVyPSIxIj4KKyAqIDx0YWJsZSBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjayI+CiAgKiA8Y2FwdGlvbj5NZW1vcnkgdXNhZ2UgYnkgYmxvY2tzaXplPC9jYXB0aW9uPgogICogPHRyPgotICogPHRoIGFsaWduPSJyaWdodCI+QmxvY2tzaXplPC90aD4KLSAqIDx0aCBhbGlnbj0icmlnaHQiPkNvbXByZXNzaW9uPGJyPm1lbW9yeSB1c2FnZTwvdGg+Ci0gKiA8dGggYWxpZ249InJpZ2h0Ij5EZWNvbXByZXNzaW9uPGJyPm1lbW9yeSB1c2FnZTwvdGg+CisgKiA8dGggc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkJsb2Nrc2l6ZTwvdGg+CisgKiA8dGggc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkNvbXByZXNzaW9uPGJyPm1lbW9yeSB1c2FnZTwvdGg+CisgKiA8dGggc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPkRlY29tcHJlc3Npb248YnI+bWVtb3J5IHVzYWdlPC90aD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij4xMDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjEzMDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjU2NWs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij4xMDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+MTMwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij41NjVrPC90ZD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij4yMDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjIyMDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjEwNjVrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+MjAwazwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjIyMDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+MTA2NWs8L3RkPgogICogPC90cj4KICAqIDx0cj4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjMwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+MzEwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+MTU2NWs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij4zMDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+MzEwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij4xNTY1azwvdGQ+CiAgKiA8L3RyPgogICogPHRyPgotICogPHRkIGFsaWduPSJyaWdodCI+NDAwazwvdGQ+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij40MDAwazwvdGQ+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij4yMDY1azwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjQwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij40MDAwazwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjIwNjVrPC90ZD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij41MDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjQ5MDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjI1NjVrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+NTAwazwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjQ5MDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+MjU2NWs8L3RkPgogICogPC90cj4KICAqIDx0cj4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjYwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+NTgwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+MzA2NWs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij42MDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+NTgwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij4zMDY1azwvdGQ+CiAgKiA8L3RyPgogICogPHRyPgotICogPHRkIGFsaWduPSJyaWdodCI+NzAwazwvdGQ+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij42NzAwazwvdGQ+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij4zNTY1azwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjcwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij42NzAwazwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjM1NjVrPC90ZD4KICAqIDwvdHI+CiAgKiA8dHI+Ci0gKiA8dGQgYWxpZ249InJpZ2h0Ij44MDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjc2MDBrPC90ZD4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjQwNjVrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+ODAwazwvdGQ+CisgKiA8dGQgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiPjc2MDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+NDA2NWs8L3RkPgogICogPC90cj4KICAqIDx0cj4KLSAqIDx0ZCBhbGlnbj0icmlnaHQiPjkwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+ODUwMGs8L3RkPgotICogPHRkIGFsaWduPSJyaWdodCI+NDU2NWs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij45MDBrPC90ZD4KKyAqIDx0ZCBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCI+ODUwMGs8L3RkPgorICogPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOnJpZ2h0Ij40NTY1azwvdGQ+CiAgKiA8L3RyPgogICogPC90YWJsZT4KICAqCiAgKiA8cD4KLSAqIEZvciBkZWNvbXByZXNzaW9uIDx0dD5DQlppcDJJbnB1dFN0cmVhbTwvdHQ+IGFsbG9jYXRlcyBsZXNzIG1lbW9yeSBpZiB0aGUKKyAqIEZvciBkZWNvbXByZXNzaW9uIDxjb2RlPkNCWmlwMklucHV0U3RyZWFtPC9jb2RlPiBhbGxvY2F0ZXMgbGVzcyBtZW1vcnkgaWYgdGhlCiAgKiBiemlwcGVkIGlucHV0IGlzIHNtYWxsZXIgdGhhbiBvbmUgYmxvY2suCiAgKiA8L3A+CiAgKgpAQCAtMTI5LDEyICsxMjksMTIgQEAKICAgICBpbXBsZW1lbnRzIEJaaXAyQ29uc3RhbnRzIHsKIAogICAgIC8qKgotICAgICAqIFRoZSBtaW5pbXVtIHN1cHBvcnRlZCBibG9ja3NpemUgPHR0PiA9PSAxPC90dD4uCisgICAgICogVGhlIG1pbmltdW0gc3VwcG9ydGVkIGJsb2Nrc2l6ZSA8Y29kZT4gPT0gMTwvY29kZT4uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0JMT0NLU0laRSA9IDE7CiAKICAgICAvKioKLSAgICAgKiBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgYmxvY2tzaXplIDx0dD4gPT0gOTwvdHQ+LgorICAgICAqIFRoZSBtYXhpbXVtIHN1cHBvcnRlZCBibG9ja3NpemUgPGNvZGU+ID09IDk8L2NvZGU+LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9CTE9DS1NJWkUgPSA5OwogCkBAIC01NjQsMTAgKzU2NCwxMCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGlucHV0TGVuZ3RoCiAgICAgICogICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHdoaWNoIHdpbGwgYmUgY29tcHJlc3NlZCBieQotICAgICAqICAgICAgICAgICAgPHR0PkNCWmlwMk91dHB1dFN0cmVhbTwvdHQ+LgorICAgICAqICAgICAgICAgICAgPGNvZGU+Q0JaaXAyT3V0cHV0U3RyZWFtPC9jb2RlPi4KICAgICAgKiBAcmV0dXJuIFRoZSBibG9ja3NpemUsIGJldHdlZW4ge0BsaW5rICNNSU5fQkxPQ0tTSVpFfSBhbmQKICAgICAgKiAgICAgICAgIHtAbGluayAjTUFYX0JMT0NLU0laRX0gYm90aCBpbmNsdXNpdmUuIEZvciBhIG5lZ2F0aXZlCi0gICAgICogICAgICAgICA8dHQ+aW5wdXRMZW5ndGg8L3R0PiB0aGlzIG1ldGhvZCByZXR1cm5zIDx0dD5NQVhfQkxPQ0tTSVpFPC90dD4KKyAgICAgKiAgICAgICAgIDxjb2RlPmlucHV0TGVuZ3RoPC9jb2RlPiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPk1BWF9CTE9DS1NJWkU8L2NvZGU+CiAgICAgICogICAgICAgICBhbHdheXMuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgY2hvb3NlQmxvY2tTaXplKGxvbmcgaW5wdXRMZW5ndGgpIHsKQEAgLTU3NiwxMSArNTc2LDExIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhIG5ldyA8dHQ+Q0JaaXAyT3V0cHV0U3RyZWFtPC90dD4gd2l0aCBhIGJsb2Nrc2l6ZSBvZiA5MDBrLgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgPGNvZGU+Q0JaaXAyT3V0cHV0U3RyZWFtPC9jb2RlPiB3aXRoIGEgYmxvY2tzaXplIG9mIDkwMGsuCiAgICAgICoKICAgICAgKiA8cD4KICAgICAgKiA8Yj5BdHRlbnRpb246IDwvYj5UaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHdyaXRlIHRoZSB0d28gQlppcDIgbWFnaWMKLSAgICAgKiBieXRlcyA8dHQ+IkJaIjwvdHQ+IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtIHByaW9yIHRvIGNhbGxpbmcgdGhpcworICAgICAqIGJ5dGVzIDxjb2RlPiJCWiI8L2NvZGU+IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtIHByaW9yIHRvIGNhbGxpbmcgdGhpcwogICAgICAqIGNvbnN0cnVjdG9yLgogICAgICAqIDwvcD4KICAgICAgKgpAQCAtNTk3LDExICs1OTcsMTEgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDx0dD5DQlppcDJPdXRwdXRTdHJlYW08L3R0PiB3aXRoIHNwZWNpZmllZCBibG9ja3NpemUuCisgICAgICogQ29uc3RydWN0cyBhIG5ldyA8Y29kZT5DQlppcDJPdXRwdXRTdHJlYW08L2NvZGU+IHdpdGggc3BlY2lmaWVkIGJsb2Nrc2l6ZS4KICAgICAgKgogICAgICAqIDxwPgogICAgICAqIDxiPkF0dGVudGlvbjogPC9iPlRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gd3JpdGUgdGhlIHR3byBCWmlwMiBtYWdpYwotICAgICAqIGJ5dGVzIDx0dD4iQloiPC90dD4gdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0gcHJpb3IgdG8gY2FsbGluZyB0aGlzCisgICAgICogYnl0ZXMgPGNvZGU+IkJaIjwvY29kZT4gdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0gcHJpb3IgdG8gY2FsbGluZyB0aGlzCiAgICAgICogY29uc3RydWN0b3IuCiAgICAgICogPC9wPgogICAgICAqCkBAIC0xMDA4LDE4ICsxMDA4LDE3IEBACiAgICAgICAgICAgICBpbnQgZ2UgPSBncyAtIDE7CiAgICAgICAgICAgICBpbnQgYUZyZXEgPSAwOwogCi0gICAgICAgICAgICBmb3IgKGZpbmFsIGludCBhID0gYWxwaGFTaXplIC0gMTsgKGFGcmVxIDwgdEZyZXEpICYmIChnZSA8IGEpOykgeworICAgICAgICAgICAgd2hpbGUgKGFGcmVxIDwgdEZyZXEgJiYgZ2UgPCBhbHBoYVNpemUgLSAxKSB7CiAgICAgICAgICAgICAgICAgYUZyZXEgKz0gbXRmRnJlcVsrK2dlXTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChnZSA+IGdzKSAmJiAoblBhcnQgIT0gbkdyb3VwcykgJiYgKG5QYXJ0ICE9IDEpCi0gICAgICAgICAgICAgICAgJiYgKCgobkdyb3VwcyAtIG5QYXJ0KSAmIDEpICE9IDApKSB7CisgICAgICAgICAgICBpZiAoZ2UgPiBncyAmJiBuUGFydCAhPSBuR3JvdXBzICYmIG5QYXJ0ICE9IDEgJiYgKG5Hcm91cHMgLSBuUGFydCAmIDEpICE9IDApIHsKICAgICAgICAgICAgICAgICBhRnJlcSAtPSBtdGZGcmVxW2dlLS1dOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBmaW5hbCBieXRlW10gbGVuX25wID0gbGVuW25QYXJ0IC0gMV07CiAgICAgICAgICAgICBmb3IgKGludCB2ID0gYWxwaGFTaXplOyAtLXYgPj0gMDspIHsKLSAgICAgICAgICAgICAgICBpZiAoKHYgPj0gZ3MpICYmICh2IDw9IGdlKSkgeworICAgICAgICAgICAgICAgIGlmICh2ID49IGdzICYmIHYgPD0gZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgbGVuX25wW3ZdID0gTEVTU0VSX0lDT1NUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGxlbl9ucFt2XSA9IEdSRUFURVJfSUNPU1Q7CkBAIC0xNTEzLDcgKzE1MTIsNyBAQAogICAgICAgICB0aGlzLm5NVEYgPSB3ciArIDE7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIERhdGEgZXh0ZW5kcyBPYmplY3QgeworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEYXRhIHsKIAogICAgICAgICAvLyB3aXRoIGJsb2NrU2l6ZSA5MDBrCiAgICAgICAgIC8qIG1hcHMgdW5zaWduZWQgYnl0ZSA9PiAiZG9lcyBpdCBvY2N1ciBpbiBibG9jayIgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ1JDLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NSQy5qYXZhCmluZGV4IDBkNGFkYTkuLjlmYmIwMzggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ1JDLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9iemlwMi9DUkMuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9FcnJvckluUXVpdEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL0Vycm9ySW5RdWl0RXhjZXB0aW9uLmphdmEKaW5kZXggNmY3OGExNC4uODA2OTMyMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL0Vycm9ySW5RdWl0RXhjZXB0aW9uLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL0Vycm9ySW5RdWl0RXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSwxMiArMjUsMTQgQEAKICAqCiAgKiA8cD5UaGlzIHNlZW1zIHRvIGhhcHBlbiB3aXRoIHNvbWUgdmVyc2lvbiBvZiBNUyBFeGNoYW5nZSB0aGF0CiAgKiBkb2Vzbid0IHJlc3BvbmQgd2l0aCBhIDIyMSBjb2RlIGltbWVkaWF0ZWx5LiAgU2VlIDxhCi0gKiBocmVmPSJodHRwOi8vbmFnb3lhLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUyNzMiPkJ1ZworICogaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MjczIj5CdWcKICAqIHJlcG9ydCA1MjczPC9hPi48L3A+CiAgKgogICovCiBwdWJsaWMgY2xhc3MgRXJyb3JJblF1aXRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKwogICAgIC8qKgogICAgICAqIEluaXRpYWxpc2UgZnJvbSBhbiBJT0V4Y2VwdGlvbgogICAgICAqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvTWFpbE1lc3NhZ2UuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZS5qYXZhCmluZGV4IDA5MDZmZGUuLjQ4YjE1NTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsNyArMzIsOCBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIC8qKgpAQCAtMTEzLDIzICsxMTQsMjMgQEAKICAgICBwcml2YXRlIFN0cmluZyBmcm9tOwogCiAgICAgLyoqIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIHRvIHJlcGx5IHRvICovCi0gICAgcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiByZXBseXRvID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiByZXBseXRvID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgdG8gc2VuZCB0byAqLwotICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gdG8gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHRvID0gbmV3IFZlY3Rvcjw+KCk7CiAKICAgICAvKiogbGlzdCBvZiBlbWFpbCBhZGRyZXNzZXMgdG8gY2MgdG8gKi8KLSAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGNjID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjYyA9IG5ldyBWZWN0b3I8PigpOwogCiAgICAgLyoqIGhlYWRlcnMgdG8gc2VuZCBpbiB0aGUgbWFpbCAqLwotICAgIHByaXZhdGUgVmVjdG9yPFN0cmluZz4gaGVhZGVyc0tleXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLSAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGhlYWRlcnNWYWx1ZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAogICAgIHByaXZhdGUgTWFpbFByaW50U3RyZWFtIG91dDsKIAogICAgIHByaXZhdGUgU210cFJlc3BvbnNlUmVhZGVyIGluOwogCiAgICAgcHJpdmF0ZSBTb2NrZXQgc29ja2V0OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LX1JFQURZID0gMjIwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPS19IRUxPID0gMjUwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPS19GUk9NID0gMjUwOwpAQCAtMTQ0LDcgKzE0NSw3IEBACiAgICAgICogVXNlIGxvY2FsaG9zdCBhcyB0aGUgbWFpbCBzZXJ2ZXIgd2l0aCBwb3J0IDI1LgogICAgICAqCiAgICAgICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpZiB0aGVyZSdzIGFueSBwcm9ibGVtIGNvbnRhY3RpbmcgdGhlIG1haWwgc2VydmVyCi0gICAgKi8KKyAgICAgKi8KICAgICBwdWJsaWMgTWFpbE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzKERFRkFVTFRfSE9TVCwgREVGQVVMVF9QT1JUKTsKICAgICB9CkBAIC0yNTMsMTQgKzI1NCwxMyBAQAogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgbmFtZWQgaGVhZGVyIHRvIHRoZSBnaXZlbiB2YWx1ZS4gIFJGQyA4MjIgcHJvdmlkZXMgdGhlIHJ1bGVzIGZvcgotICAgICAqIHdoYXQgdGV4dCBtYXkgY29uc3RpdHV0ZSBhIGhlYWRlciBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKiB3aGF0IHRleHQgbWF5IGNvbnN0aXR1ZSBhIGhlYWRlciBuYW1lIGFuZCB2YWx1ZS4KICAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBoZWFkZXIKICAgICAgKiBAcGFyYW0gdmFsdWUgY29udGVudHMgb2YgdGhlIGhlYWRlcgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIC8vIEJsaW5kbHkgdHJ1c3QgdGhlIHVzZXIgZG9lc24ndCBzZXQgYW55IGludmFsaWQgaGVhZGVycwotICAgICAgICBoZWFkZXJzS2V5cy5hZGQobmFtZSk7Ci0gICAgICAgIGhlYWRlcnNWYWx1ZXMuYWRkKHZhbHVlKTsKKyAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjczLDEyICsyNzMsMTMgQEAKICAgICAgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIGlmIHRoZXJlJ3MgYW55IHByb2JsZW0gcmVwb3J0ZWQgYnkgdGhlIG1haWwgc2VydmVyCiAgICAgICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbC5NZXNzYWdlCiAgICAgICovCi0gICAgIHB1YmxpYyBQcmludFN0cmVhbSBnZXRQcmludFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFByaW50U3RyZWFtIGdldFByaW50U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc2V0RnJvbUhlYWRlcigpOwogICAgICAgICBzZXRSZXBseVRvSGVhZGVyKCk7CiAgICAgICAgIHNldFRvSGVhZGVyKCk7CiAgICAgICAgIHNldENjSGVhZGVyKCk7Ci0gICAgICAgIHNldEhlYWRlcigiWC1NYWlsZXIiLCAib3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlIChhbnQuYXBhY2hlLm9yZykiKTsKKyAgICAgICAgc2V0SGVhZGVyKCJYLU1haWxlciIsCisgICAgICAgICAgICAib3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlIChhbnQuYXBhY2hlLm9yZykiKTsKICAgICAgICAgc2VuZERhdGEoKTsKICAgICAgICAgZmx1c2hIZWFkZXJzKCk7CiAgICAgICAgIHJldHVybiBvdXQ7CkBAIC0zMDksMjkgKzMxMCwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgU3RyaW5nIHZlY3RvclRvTGlzdChWZWN0b3IgdikgewotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBFbnVtZXJhdGlvbiBlID0gdi5lbGVtZW50cygpOwotICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChlLm5leHRFbGVtZW50KCkpOwotICAgICAgICAgICAgaWYgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgdmVjdG9yVG9MaXN0KFZlY3RvcjxTdHJpbmc+IHYpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5qb2luKCIsICIsIHYpOwogICAgIH0KIAotICAgIHZvaWQgZmx1c2hIZWFkZXJzKCkgewotICAgICAgICAgLy8gUkZDIDgyMiBzNC4xOgorICAgIHZvaWQgZmx1c2hIZWFkZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gUkZDIDgyMiBzNC4xOgogICAgICAgICAvLyAgICJIZWFkZXIgZmllbGRzIGFyZSBOT1QgcmVxdWlyZWQgdG8gb2NjdXIgaW4gYW55IHBhcnRpY3VsYXIgb3JkZXIsCiAgICAgICAgIC8vICAgIGV4Y2VwdCB0aGF0IHRoZSBtZXNzYWdlIGJvZHkgTVVTVCBvY2N1ciBBRlRFUiB0aGUgaGVhZGVycyIKICAgICAgICAgLy8gKHRoZSBzYW1lIHNlY3Rpb24gc3BlY2lmaWVzIGEgcmVjb21tZW5kZWQgb3JkZXIsIHdoaWNoIHdlIGlnbm9yZSkKLSAgICAgICAgZmluYWwgaW50IHNpemUgPSBoZWFkZXJzS2V5cy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGhlYWRlcnNLZXlzLmVsZW1lbnRBdChpKTsKLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGhlYWRlcnNWYWx1ZXMuZWxlbWVudEF0KGkpOwotICAgICAgICAgICAgb3V0LnByaW50bG4obmFtZSArICI6ICIgKyB2YWx1ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgaGVhZGVycy5mb3JFYWNoKChrLCB2KSAtPiBvdXQucHJpbnRmKCIlczogJXMlbiIsIGssIHYpKTsKICAgICAgICAgb3V0LnByaW50bG4oKTsKICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgfQpAQCAtMzY0LDEyICszNTIsMTIgQEAKICAgICAgICAgICAgIGlmIChjID09ICcoJykgewogICAgICAgICAgICAgICAgIHBhcmFtRGVwdGgrKzsKICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOyAgLy8gc3VwcG9ydCAiYWRkcmVzcyAobmFtZSkiCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7IC8vIHN1cHBvcnQgImFkZHJlc3MgKG5hbWUpIgogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKScpIHsKICAgICAgICAgICAgICAgICBwYXJhbURlcHRoLS07CiAgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7ICAvLyBzdXBwb3J0ICIobmFtZSkgYWRkcmVzcyIKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsgLy8gc3VwcG9ydCAiKG5hbWUpIGFkZHJlc3MiCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbURlcHRoID09IDAgJiYgYyA9PSAnPCcpIHsKICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwpAQCAtMzg5LDcgKzM3Nyw4IEBACiAKICAgICB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBzb2NrZXQgPSBuZXcgU29ja2V0KGhvc3QsIHBvcnQpOwotICAgICAgICBvdXQgPSBuZXcgTWFpbFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICAgICAgb3V0ID0gbmV3IE1haWxQcmludFN0cmVhbSgKKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrZXQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKICAgICAgICAgaW4gPSBuZXcgU210cFJlc3BvbnNlUmVhZGVyKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKTsKICAgICAgICAgZ2V0UmVhZHkoKTsKICAgICB9CkBAIC0zOTgsMTQgKzM4NywxNSBAQAogICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBpbi5nZXRSZXNwb25zZSgpOwogICAgICAgICBpbnRbXSBvayA9IHtPS19SRUFEWX07CiAgICAgICAgIGlmICghaXNSZXNwb25zZU9LKHJlc3BvbnNlLCBvaykpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRGlkbid0IGdldCBpbnRyb2R1Y3Rpb24gZnJvbSBzZXJ2ZXI6ICIgKyByZXNwb25zZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkRpZG4ndCBnZXQgaW50cm9kdWN0aW9uIGZyb20gc2VydmVyOiAiICsgcmVzcG9uc2UpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBzZW5kSGVsbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBsb2NhbCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7CisgICAgICAgIFN0cmluZyBsb2NhbCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7CiAgICAgICAgIGludFtdIG9rID0ge09LX0hFTE99OwotICAgICAgICAgc2VuZCgiSEVMTyAiICsgbG9jYWwsIG9rKTsKKyAgICAgICAgc2VuZCgiSEVMTyAiICsgbG9jYWwsIG9rKTsKICAgICB9CiAKICAgICB2b2lkIHNlbmRGcm9tKFN0cmluZyBmcm9tKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtNDI1LDcgKzQxNSw3IEBACiAKICAgICB2b2lkIHNlbmREb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBpbnRbXSBvayA9IHtPS19ET1R9OwotICAgICAgICBzZW5kKCJcclxuLiIsIG9rKTsgIC8vIG1ha2Ugc3VyZSBkb3QgaXMgb24gbmV3IGxpbmUKKyAgICAgICAgc2VuZCgiXHJcbi4iLCBvayk7IC8vIG1ha2Ugc3VyZSBkb3QgaXMgb24gbmV3IGxpbmUKICAgICB9CiAKICAgICB2b2lkIHNlbmRRdWl0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTQzOCwxMSArNDI4LDExIEBACiAgICAgfQogCiAgICAgdm9pZCBzZW5kKFN0cmluZyBtc2csIGludFtdIG9rKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXQucmF3UHJpbnQobXNnICsgIlxyXG4iKTsgIC8vIHJhdyBzdXBwb3J0cyA8Q1JMRj4uPENSTEY+CisgICAgICAgIG91dC5yYXdQcmludChtc2cgKyAiXHJcbiIpOyAvLyByYXcgc3VwcG9ydHMgPENSTEY+LjxDUkxGPgogICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSBpbi5nZXRSZXNwb25zZSgpOwogICAgICAgICBpZiAoIWlzUmVzcG9uc2VPSyhyZXNwb25zZSwgb2spKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuZXhwZWN0ZWQgcmVwbHkgdG8gY29tbWFuZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbXNnICsgIjogIiArIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCByZXBseSB0byBjb21tYW5kOiAiICsgbXNnICsgIjogIiArIHJlc3BvbnNlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDU2LDcgKzQ0Niw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3QoKSB7CisgICAgdm9pZCBkaXNjb25uZWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKG91dCAhPSBudWxsKSB7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKICAgICAgICAgfQpAQCAtNDg2LDE3ICs0NzYsMTggQEAKICAgICBwcml2YXRlIGludCBsYXN0Q2hhcjsKIAogICAgIHB1YmxpYyBNYWlsUHJpbnRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewotICAgICAgICBzdXBlcihvdXQsIHRydWUpOyAgLy8gZGVwcmVjYXRlZCwgYnV0IGVtYWlsIGlzIGJ5dGUtb3JpZW50ZWQKKyAgICAgICAgc3VwZXIob3V0LCB0cnVlKTsgLy8gZGVwcmVjYXRlZCwgYnV0IGVtYWlsIGlzIGJ5dGUtb3JpZW50ZWQKICAgICB9CiAKICAgICAvLyBNYWMgZG9lcyBcblxyLCBidXQgdGhhdCdzIHRvdWdoIHRvIGRpc3Rpbmd1aXNoIGZyb20gV2luZG93cyBcclxuXHJcbi4KICAgICAvLyBEb24ndCB0YWNrbGUgdGhhdCBwcm9ibGVtIHJpZ2h0IG5vdy4KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgewogICAgICAgICBpZiAoYiA9PSAnXG4nICYmIGxhc3RDaGFyICE9ICdccicpIHsKLSAgICAgICAgICAgIHJhd1dyaXRlKCdccicpOyAgLy8gZW5zdXJlIGFsd2F5cyBcclxuCisgICAgICAgICAgICByYXdXcml0ZSgnXHInKTsgLy8gZW5zdXJlIGFsd2F5cyBcclxuCiAgICAgICAgICAgICByYXdXcml0ZShiKTsKICAgICAgICAgfSBlbHNlIGlmIChiID09ICcuJyAmJiBsYXN0Q2hhciA9PSAnXG4nKSB7Ci0gICAgICAgICAgICByYXdXcml0ZSgnLicpOyAgLy8gYWRkIGV4dHJhIGRvdAorICAgICAgICAgICAgcmF3V3JpdGUoJy4nKTsgLy8gYWRkIGV4dHJhIGRvdAogICAgICAgICAgICAgcmF3V3JpdGUoYik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByYXdXcml0ZShiKTsKQEAgLTUwNCw2ICs0OTUsNyBAQAogICAgICAgICBsYXN0Q2hhciA9IGI7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ1ZiwgaW50IG9mZiwgaW50IGxlbikgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICB3cml0ZShidWZbb2ZmICsgaV0pOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL1NtdHBSZXNwb25zZVJlYWRlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy9tYWlsL1NtdHBSZXNwb25zZVJlYWRlci5qYXZhCmluZGV4IDgxNzhhODYuLmY5M2NhNmIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvbWFpbC9TbXRwUmVzcG9uc2VSZWFkZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL21haWwvU210cFJlc3BvbnNlUmVhZGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNSw3ICszNSw2IEBACiAgICAgLy8gQ2hlY2tTdHlsZTpWaXNpYmlsaXR5TW9kaWZpZXIgT0ZGIC0gYmMKICAgICBwcm90ZWN0ZWQgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKICAgICAvLyBDaGVja1N0eWxlOlZpc2liaWxpdHlNb2RpZmllciBPTgotICAgIHByaXZhdGUgU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKIAogICAgIC8qKgogICAgICAqIFdyYXAgdGhpcyBpbnB1dCBzdHJlYW0uCkBAIC01NCwxNyArNTMsMTcgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGVycm9yLgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXN1bHQuc2V0TGVuZ3RoKDApOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIFN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CiAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT0ZGCiAgICAgICAgIGlmIChsaW5lICE9IG51bGwgJiYgbGluZS5sZW5ndGgoKSA+PSAzKSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDAsIDMpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSwgMCwgMyk7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIik7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPTgogCiAgICAgICAgIHdoaWxlIChsaW5lICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFwcGVuZChsaW5lKTsKKyAgICAgICAgICAgIGFwcGVuZFRvKHJlc3VsdCwgbGluZSk7CiAgICAgICAgICAgICBpZiAoIWhhc01vcmVMaW5lcyhsaW5lKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtOTUsMTEgKzk0LDEwIEBACiAgICAgLyoqCiAgICAgICogQXBwZW5kIHRoZSB0ZXh0IGZyb20gdGhpcyBsaW5lIG9mIHRoZSByZXNwb25zZS4KICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXBwZW5kKFN0cmluZyBsaW5lKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHRhcmdldCwgU3RyaW5nIGxpbmUpIHsKICAgICAgICAgLy8gQ2hlY2tTdHlsZTpNYWdpY051bWJlciBPRkYKICAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgPiA0KSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUuc3Vic3RyaW5nKDQpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgIHRhcmdldC5hcHBlbmQobGluZS5zdWJzdHJpbmcoNCkpLmFwcGVuZCgnICcpOwogICAgICAgICB9CiAgICAgICAgIC8vIENoZWNrU3R5bGU6TWFnaWNOdW1iZXIgT04KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJBcmNoaXZlU3BhcnNlRW50cnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckFyY2hpdmVTcGFyc2VFbnRyeS5qYXZhCmluZGV4IDJlNzZmYjYuLmFmYzM5MDUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckFyY2hpdmVTcGFyc2VFbnRyeS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckFyY2hpdmVTcGFyc2VFbnRyeS5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJCdWZmZXIuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckJ1ZmZlci5qYXZhCmluZGV4IDI1MmQ4OGMuLmZjZWE1MTEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckJ1ZmZlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckJ1ZmZlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcwLDEyICsyNzAsMTIgQEAKICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZG8gbm90IHJlYWQgZ2lnYWJ5dGVzIG9mIHplcm9zCiAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBhIGNvcnJ1cHQgdGFyIGZpbGUuCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM5OTI0CisgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zOTkyNAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGp1c3QgbGVhdmluZyB0aGUgdW5yZWFkIHBvcnRpb24gb2YgdGhlIGJ1ZmZlciBkaXJ0eSBkb2VzCiAgICAgICAgICAgICAgICAgLy8gY2F1c2UgcHJvYmxlbXMgaW4gc29tZSBjYXNlcy4gIFRoaXMgcHJvYmxlbSBpcyBkZXNjcmliZWQgaW4KLSAgICAgICAgICAgICAgICAvLyBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI5ODc3CisgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mjk4NzcKICAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgIC8vIFRoZSBzb2x1dGlvbiBpcyB0byBmaWxsIHRoZSB1bnVzZWQgcG9ydGlvbiBvZiB0aGUgYnVmZmVyIHdpdGggemVyb3MuCiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckNvbnN0YW50cy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyQ29uc3RhbnRzLmphdmEKaW5kZXggMDZkMGZhYy4uNTYzNjJmNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyQ29uc3RhbnRzLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyQ29uc3RhbnRzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgKi8KICAgICBieXRlIExGX0dOVVRZUEVfU1BBUlNFID0gKGJ5dGUpICdTJzsKIAotICAgIC8vIFNlZSAiaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy9wYXguaHRtbCN0YWdfMDRfMTAwXzEzXzAyIgorICAgIC8vIFNlZSAiaHR0cHM6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvcGF4Lmh0bWwjdGFnXzA0XzEwMF8xM18wMiIKIAogICAgIC8qKgogICAgICAqIElkZW50aWZpZXMgdGhlIGVudHJ5IGFzIGEgUGF4IGV4dGVuZGVkIGhlYWRlci4KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJFbnRyeS5qYXZhCmluZGV4IGFmZGQ5NTEuLmQzOGE4ZmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyRW50cnkuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDcgKzI1LDcgQEAKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIApAQCAtMzQzLDEwICszNDMsNyBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgaXQpIHsKLSAgICAgICAgaWYgKGl0ID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBpdC5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWFscygoVGFyRW50cnkpIGl0KTsKKyAgICAgICAgcmV0dXJuIGl0ICE9IG51bGwgJiYgZ2V0Q2xhc3MoKSA9PSBpdC5nZXRDbGFzcygpICYmIGVxdWFscygoVGFyRW50cnkpIGl0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTM3Nyw3ICszNzQsNyBAQAogICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbmFtZS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKICAgICAvKioKQEAgLTQwNCw3ICs0MDEsNyBAQAogICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGxpbmsgbmFtZS4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExpbmtOYW1lKCkgewotICAgICAgICByZXR1cm4gbGlua05hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGxpbmtOYW1lOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDI1LDcgKzQyMiw3IEBACiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFVzZXJJZCgpIHsKLSAgICAgICAgcmV0dXJuIChpbnQpICh1c2VySWQgJiAweGZmZmZmZmZmKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIHVzZXJJZDsKICAgICB9CiAKICAgICAvKioKQEAgLTQ2Niw3ICs0NjMsNyBAQAogICAgICAqLwogICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRHcm91cElkKCkgewotICAgICAgICByZXR1cm4gKGludCkgKGdyb3VwSWQgJiAweGZmZmZmZmZmKTsKKyAgICAgICAgcmV0dXJuIChpbnQpIGdyb3VwSWQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC01MDQsNyArNTAxLDcgQEAKICAgICAgKiBAcmV0dXJuIFRoaXMgZW50cnkncyB1c2VyIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIHVzZXJOYW1lLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiB1c2VyTmFtZTsKICAgICB9CiAKICAgICAvKioKQEAgLTUyMiw3ICs1MTksNyBAQAogICAgICAqIEByZXR1cm4gVGhpcyBlbnRyeSdzIGdyb3VwIG5hbWUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRHcm91cE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBncm91cE5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIGdyb3VwTmFtZTsKICAgICB9CiAKICAgICAvKioKQEAgLTc0NSwxNSArNzQyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobGlua0ZsYWcgPT0gTEZfRElSKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXROYW1lKCkuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBsaW5rRmxhZyA9PSBMRl9ESVIgfHwgZ2V0TmFtZSgpLmVuZHNXaXRoKCIvIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NjEsMTMgKzc1MCw4IEBACiAgICAgICogQHJldHVybiA8aT50cnVlPC9pPiBpZiBpdCBpcyBhICdub3JtYWwnIGZpbGUKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGUoKSB7Ci0gICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlLmlzRmlsZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5rRmxhZyA9PSBMRl9PTEROT1JNIHx8IGxpbmtGbGFnID09IExGX05PUk1BTCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICFnZXROYW1lKCkuZW5kc1dpdGgoIi8iKTsKKyAgICAgICAgcmV0dXJuIGZpbGUgIT0gbnVsbCA/IGZpbGUuaXNGaWxlKCkKKyAgICAgICAgICAgICAgICA6IGxpbmtGbGFnID09IExGX09MRE5PUk0gfHwgbGlua0ZsYWcgPT0gTEZfTk9STUFMIHx8ICFnZXROYW1lKCkuZW5kc1dpdGgoIi8iKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMDksOSArOTkzLDkgQEAKICAgICAgICAgICAgICAgICAvLyBTdW5PUyB0YXIgLUUgZG9lcyBub3QgYWRkIC8gdG8gZGlyZWN0b3J5IG5hbWVzLCBzbyBmaXgKICAgICAgICAgICAgICAgICAvLyB1cCB0byBiZSBjb25zaXN0ZW50CiAgICAgICAgICAgICAgICAgaWYgKGlzRGlyZWN0b3J5KCkgJiYgIW5hbWUuZW5kc1dpdGgoIi8iKSkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICIvIjsKKyAgICAgICAgICAgICAgICAgICAgbmFtZSArPSAiLyI7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwcmVmaXguaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwcmVmaXggKyAiLyIgKyBuYW1lOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTEwODgsMTMgKzEwNzIsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hBc2NpaUJ1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGJ5dGVbXSBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgICAgYnl0ZVtdIGJ1ZmZlcjE7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWZmZXIxID0gZXhwZWN0ZWQuZ2V0Qnl0ZXMoIkFTQ0lJIik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOyAvL05PU09OQVIKLSAgICAgICAgfQorICAgICAgICBieXRlW10gYnVmZmVyMSA9IGV4cGVjdGVkLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpOwogICAgICAgICByZXR1cm4gaXNFcXVhbChidWZmZXIxLCAwLCBidWZmZXIxLmxlbmd0aCwgYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhcklucHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDk3MTU5OTIuLjA0NzdkNWMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhcklucHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFySW5wdXRTdHJlYW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDkgKzI4LDkgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVuY29kaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVuY29kaW5nSGVscGVyOwpAQCAtMjk1LDkgKzI5NSw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBjdXJyRW50cnkgPSBuZXcgVGFyRW50cnkoaGVhZGVyQnVmLCBlbmNvZGluZyk7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBJT0V4Y2VwdGlvbiBpb2UgPSBuZXcgSU9FeGNlcHRpb24oIkVycm9yIGRldGVjdGVkIHBhcnNpbmcgdGhlIGhlYWRlciIpOwotICAgICAgICAgICAgaW9lLmluaXRDYXVzZShlKTsKLSAgICAgICAgICAgIHRocm93IGlvZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgZGV0ZWN0ZWQgcGFyc2luZyB0aGUgaGVhZGVyIiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRlYnVnKSB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlRhcklucHV0U3RyZWFtOiBTRVQgQ1VSUkVOVFJZICciCkBAIC00MjEsNyArNDE5LDcgQEAKICAgICB9CiAKICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcnNlUGF4SGVhZGVycyhJbnB1dFN0cmVhbSBpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAvLyBGb3JtYXQgaXMgImxlbmd0aCBrZXl3b3JkPXZhbHVlXG4iOwogICAgICAgICB3aGlsZSAodHJ1ZSkgeyAvLyBnZXQgbGVuZ3RoCiAgICAgICAgICAgICBpbnQgY2g7CkBAIC00NTIsNyArNDUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHJvcCB0cmFpbGluZyBOTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IG5ldyBTdHJpbmcocmVzdCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RMZW4gLSAxLCAiVVRGLTgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RMZW4gLSAxLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLnB1dChrZXl3b3JkLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00ODIsMzEgKzQ4MCw0MCBAQAogICAgICAgICAgKiB1aWQsdW5hbWUKICAgICAgICAgICogU0NISUxZLmRldm1pbm9yLCBTQ0hJTFkuZGV2bWFqb3I6IGRvbid0IGhhdmUgc2V0dGVycy9nZXR0ZXJzIGZvciB0aG9zZQogICAgICAgICAgKi8KLSAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50IDogaGVhZGVycy5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5ID0gZW50LmdldEtleSgpOwotICAgICAgICAgICAgU3RyaW5nIHZhbCA9IGVudC5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCJwYXRoIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIGN1cnJFbnRyeS5zZXROYW1lKHZhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJsaW5rcGF0aCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0TGlua05hbWUodmFsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImdpZCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0R3JvdXBJZChMb25nLnBhcnNlTG9uZyh2YWwpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoImduYW1lIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIGN1cnJFbnRyeS5zZXRHcm91cE5hbWUodmFsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoInVpZCIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0VXNlcklkKExvbmcucGFyc2VMb25nKHZhbCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgidW5hbWUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldFVzZXJOYW1lKHZhbCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCJzaXplIi5lcXVhbHMoa2V5KSkgewotICAgICAgICAgICAgICAgIGN1cnJFbnRyeS5zZXRTaXplKExvbmcucGFyc2VMb25nKHZhbCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICgibXRpbWUiLmVxdWFscyhrZXkpKSB7Ci0gICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldE1vZFRpbWUoKGxvbmcpIChEb3VibGUucGFyc2VEb3VibGUodmFsKSAqIDEwMDApKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlNDSElMWS5kZXZtaW5vciIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0RGV2TWlub3IoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIlNDSElMWS5kZXZtYWpvciIuZXF1YWxzKGtleSkpIHsKLSAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0RGV2TWFqb3IoSW50ZWdlci5wYXJzZUludCh2YWwpKTsKKyAgICAgICAgaGVhZGVycy5mb3JFYWNoKChrZXksIHZhbCkgLT4geworICAgICAgICAgICAgc3dpdGNoIChrZXkpIHsKKyAgICAgICAgICAgICAgICBjYXNlICJwYXRoIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldE5hbWUodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAibGlua3BhdGgiOgorICAgICAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0TGlua05hbWUodmFsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiZ2lkIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldEdyb3VwSWQoTG9uZy5wYXJzZUxvbmcodmFsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgImduYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldEdyb3VwTmFtZSh2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJ1aWQiOgorICAgICAgICAgICAgICAgICAgICBjdXJyRW50cnkuc2V0VXNlcklkKExvbmcucGFyc2VMb25nKHZhbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJ1bmFtZSI6CisgICAgICAgICAgICAgICAgICAgIGN1cnJFbnRyeS5zZXRVc2VyTmFtZSh2YWwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJzaXplIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldFNpemUoTG9uZy5wYXJzZUxvbmcodmFsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIm10aW1lIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldE1vZFRpbWUoKGxvbmcpIChEb3VibGUucGFyc2VEb3VibGUodmFsKSAqIDEwMDApKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiU0NISUxZLmRldm1pbm9yIjoKKyAgICAgICAgICAgICAgICAgICAgY3VyckVudHJ5LnNldERldk1pbm9yKEludGVnZXIucGFyc2VJbnQodmFsKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIlNDSElMWS5kZXZtYWpvciI6CisgICAgICAgICAgICAgICAgICAgIGN1cnJFbnRyeS5zZXREZXZNYWpvcihJbnRlZ2VyLnBhcnNlSW50KHZhbCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1Rhck91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggZDA1NWNhYS4uY2NmMWY0MiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTI4MiwxMyArMjgzLDEzIEBACiAgICAgICAgIGlmIChmaW5pc2hlZCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBmaW5pc2hlZCIpOwogICAgICAgICB9Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGF4SGVhZGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBheEhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRyeU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7CiAgICAgICAgIGJvb2xlYW4gcGF4SGVhZGVyQ29udGFpbnNQYXRoID0gaGFuZGxlTG9uZ05hbWUoZW50cnksIGVudHJ5TmFtZSwgcGF4SGVhZGVycywgInBhdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhckNvbnN0YW50cy5MRl9HTlVUWVBFX0xPTkdOQU1FLCAiZmlsZSBuYW1lIik7CiAKICAgICAgICAgZmluYWwgU3RyaW5nIGxpbmtOYW1lID0gZW50cnkuZ2V0TGlua05hbWUoKTsKLSAgICAgICAgYm9vbGVhbiBwYXhIZWFkZXJDb250YWluc0xpbmtQYXRoID0gbGlua05hbWUgIT0gbnVsbCAmJiBsaW5rTmFtZS5sZW5ndGgoKSA+IDAKKyAgICAgICAgYm9vbGVhbiBwYXhIZWFkZXJDb250YWluc0xpbmtQYXRoID0gbGlua05hbWUgIT0gbnVsbCAmJiAhbGlua05hbWUuaXNFbXB0eSgpCiAgICAgICAgICAgICAmJiBoYW5kbGVMb25nTmFtZShlbnRyeSwgbGlua05hbWUsIHBheEhlYWRlcnMsICJsaW5rcGF0aCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJDb25zdGFudHMuTEZfR05VVFlQRV9MT05HTElOSywgImxpbmsgbmFtZSIpOwogCkBAIC01MDAsNyArNTAxLDcgQEAKICAgICAgICAgICAgICAgICArIDMgLyogYmxhbmssIGVxdWFscyBhbmQgbmV3bGluZSAqLwogICAgICAgICAgICAgICAgICsgMiAvKiBndWVzcyA5IDwgYWN0dWFsIGxlbmd0aCA8IDEwMCAqLzsKICAgICAgICAgICAgIFN0cmluZyBsaW5lID0gbGVuICsgIiAiICsga2V5ICsgIj0iICsgdmFsdWUgKyAiXG4iOwotICAgICAgICAgICAgaW50IGFjdHVhbExlbmd0aCA9IGxpbmUuZ2V0Qnl0ZXMoIlVURi04IikubGVuZ3RoOworICAgICAgICAgICAgaW50IGFjdHVhbExlbmd0aCA9IGxpbmUuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkubGVuZ3RoOwogICAgICAgICAgICAgd2hpbGUgKGxlbiAhPSBhY3R1YWxMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIGNhc2VzIHdoZXJlIGxlbmd0aCA8IDEwIG9yID4gMTAwCiAgICAgICAgICAgICAgICAgLy8gb3Igd2hlcmUgVVRGLTggZW5jb2RpbmcgaXNuJ3QgYSBzaW5nbGUgb2N0ZXQKQEAgLTUwOSwxMSArNTEwLDExIEBACiAgICAgICAgICAgICAgICAgLy8gZmlyc3QgcGFzcyBzbyB3ZSdkIG5lZWQgYSBzZWNvbmQuCiAgICAgICAgICAgICAgICAgbGVuID0gYWN0dWFsTGVuZ3RoOwogICAgICAgICAgICAgICAgIGxpbmUgPSBsZW4gKyAiICIgKyBrZXkgKyAiPSIgKyB2YWx1ZSArICJcbiI7Ci0gICAgICAgICAgICAgICAgYWN0dWFsTGVuZ3RoID0gbGluZS5nZXRCeXRlcygiVVRGLTgiKS5sZW5ndGg7CisgICAgICAgICAgICAgICAgYWN0dWFsTGVuZ3RoID0gbGluZS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KS5sZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB3LndyaXRlKGxpbmUpOwogICAgICAgICB9Ci0gICAgICAgIGJ5dGVbXSBkYXRhID0gdy50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpOworICAgICAgICBieXRlW10gZGF0YSA9IHcudG9TdHJpbmcoKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICAgICAgcGV4LnNldFNpemUoZGF0YS5sZW5ndGgpOwogICAgICAgICBwdXROZXh0RW50cnkocGV4KTsKICAgICAgICAgd3JpdGUoZGF0YSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJVdGlscy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy90YXIvVGFyVXRpbHMuamF2YQppbmRleCBmY2QwYzRlLi5iNmUxMmM0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhclV0aWxzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02Miw4ICs2Miw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihidWZmZXIubGVuZ3RoKTsKIAogICAgICAgICAgICAgICAgIGZvciAoZmluYWwgYnl0ZSBiIDogYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IDApIHsgLy8gVHJhaWxpbmcgbnVsbApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQWJzdHJhY3RVbmljb2RlRXh0cmFGaWVsZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQWJzdHJhY3RVbmljb2RlRXh0cmFGaWVsZC5qYXZhCmluZGV4IDBmMjM2ZDQuLjEwOWIxNzMgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0Fic3RyYWN0VW5pY29kZUV4dHJhRmllbGQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9BYnN0cmFjdFVuaWNvZGVFeHRyYUZpZWxkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CiAKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CiAKQEAgLTUxLDEyICs1MSw3IEBACiAgICAgICAgIGNyYzMyLnVwZGF0ZShieXRlcywgb2ZmLCBsZW4pOwogICAgICAgICBuYW1lQ1JDMzIgPSBjcmMzMi5nZXRWYWx1ZSgpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB1bmljb2RlTmFtZSA9IHRleHQuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZBVEFMOiBVVEYtOCBlbmNvZGluZyBub3Qgc3VwcG9ydGVkLiIsIC8vTk9TT05BUgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdW5pY29kZU5hbWUgPSB0ZXh0LmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZC5qYXZhCmluZGV4IDAxMDhlZTIuLjhhZmRkYjUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0FzaUV4dHJhRmllbGQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNDEsNyArMjQxLDcgQEAKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNMaW5rKCkgewotICAgICAgICByZXR1cm4gZ2V0TGlua2VkRmlsZSgpLmxlbmd0aCgpICE9IDA7CisgICAgICAgIHJldHVybiAhZ2V0TGlua2VkRmlsZSgpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0NlbnRyYWxEaXJlY3RvcnlQYXJzaW5nWmlwRXh0cmFGaWVsZC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQ2VudHJhbERpcmVjdG9yeVBhcnNpbmdaaXBFeHRyYUZpZWxkLmphdmEKaW5kZXggNzM4ZWQ2Mi4uNjE3NDc0YyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQ2VudHJhbERpcmVjdG9yeVBhcnNpbmdaaXBFeHRyYUZpZWxkLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvQ2VudHJhbERpcmVjdG9yeVBhcnNpbmdaaXBFeHRyYUZpZWxkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlscy5qYXZhCmluZGV4IDE4YmI4NTAuLjNhZjVjMDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlscy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNyArNDEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxaaXBTaG9ydCwgQ2xhc3M8Pz4+IGltcGxlbWVudGF0aW9uczsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGltcGxlbWVudGF0aW9ucyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxaaXBTaG9ydCwgQ2xhc3M8Pz4+KCk7CisgICAgICAgIGltcGxlbWVudGF0aW9ucyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAgICAgICAgIHJlZ2lzdGVyKEFzaUV4dHJhRmllbGQuY2xhc3MpOwogICAgICAgICByZWdpc3RlcihKYXJNYXJrZXIuY2xhc3MpOwogICAgICAgICByZWdpc3RlcihVbmljb2RlUGF0aEV4dHJhRmllbGQuY2xhc3MpOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgcHVibGljIHN0YXRpYyBaaXBFeHRyYUZpZWxkW10gcGFyc2UoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gbG9jYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5wYXJzZWFibGVFeHRyYUZpZWxkIG9uVW5wYXJzZWFibGVEYXRhKQogICAgICAgICB0aHJvd3MgWmlwRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxaaXBFeHRyYUZpZWxkPiB2ID0gbmV3IEFycmF5TGlzdDxaaXBFeHRyYUZpZWxkPigpOworICAgICAgICBMaXN0PFppcEV4dHJhRmllbGQ+IHYgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgaW50IHN0YXJ0ID0gMDsKICAgICAgICAgTE9PUDoKICAgICAgICAgd2hpbGUgKHN0YXJ0IDw9IGRhdGEubGVuZ3RoIC0gV09SRCkgewpAQCAtMTc0LDEwICsxNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLnBhcnNlRnJvbUNlbnRyYWxEaXJlY3RvcnlEYXRhKGRhdGEsIHN0YXJ0ICsgV09SRCwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdi5hZGQoemUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWUpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKGllLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBaaXBFeGNlcHRpb24oaWFlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGFydCArPSAobGVuZ3RoICsgV09SRCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0ZhbGxiYWNrWmlwRW5jb2RpbmcuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0ZhbGxiYWNrWmlwRW5jb2RpbmcuamF2YQppbmRleCA3ZTBmMzE1Li4xOWE1YTBmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9GYWxsYmFja1ppcEVuY29kaW5nLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvRmFsbGJhY2taaXBFbmNvZGluZy5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9HZW5lcmFsUHVycG9zZUJpdC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvR2VuZXJhbFB1cnBvc2VCaXQuamF2YQppbmRleCBmNWYzNTNjLi44ODIxNzQ5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9HZW5lcmFsUHVycG9zZUJpdC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0dlbmVyYWxQdXJwb3NlQml0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgKiBAcGFyYW0gYnVmIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICogQHBhcmFtIG9mZnNldAogICAgICAqICAgICAgICAgVGhlIG9mZnNldCB3aXRoaW4gdGhlIG91dHB1dCBidWZmZXIgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gYmUgd3JpdHRlbi4KLSAgICAgKiAgICAgICAgIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBubyBsYXJnZXIgdGhhbiA8dHQ+YnVmLmxlbmd0aC0yPC90dD4KKyAgICAgKiAgICAgICAgIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCBubyBsYXJnZXIgdGhhbiA8Y29kZT5idWYubGVuZ3RoLTI8L2NvZGU+CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW5jb2RlKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKICAgICAgICAgWmlwU2hvcnQucHV0U2hvcnQoKGRhdGFEZXNjcmlwdG9yRmxhZyA/IERBVEFfREVTQ1JJUFRPUl9GTEFHIDogMCkKQEAgLTE4OSwxNCArMTg5LDE1IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEdlbmVyYWxQdXJwb3NlQml0KSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAobyBpbnN0YW5jZW9mIEdlbmVyYWxQdXJwb3NlQml0KSB7CisgICAgICAgICAgICBHZW5lcmFsUHVycG9zZUJpdCBnID0gKEdlbmVyYWxQdXJwb3NlQml0KSBvOworICAgICAgICAgICAgcmV0dXJuIGcuZW5jcnlwdGlvbkZsYWcgPT0gZW5jcnlwdGlvbkZsYWcKKyAgICAgICAgICAgICAgICAgICAgJiYgZy5zdHJvbmdFbmNyeXB0aW9uRmxhZyA9PSBzdHJvbmdFbmNyeXB0aW9uRmxhZworICAgICAgICAgICAgICAgICAgICAmJiBnLmxhbmd1YWdlRW5jb2RpbmdGbGFnID09IGxhbmd1YWdlRW5jb2RpbmdGbGFnCisgICAgICAgICAgICAgICAgICAgICYmIGcuZGF0YURlc2NyaXB0b3JGbGFnID09IGRhdGFEZXNjcmlwdG9yRmxhZzsKICAgICAgICAgfQotICAgICAgICBHZW5lcmFsUHVycG9zZUJpdCBnID0gKEdlbmVyYWxQdXJwb3NlQml0KSBvOwotICAgICAgICByZXR1cm4gZy5lbmNyeXB0aW9uRmxhZyA9PSBlbmNyeXB0aW9uRmxhZwotICAgICAgICAgICAgJiYgZy5zdHJvbmdFbmNyeXB0aW9uRmxhZyA9PSBzdHJvbmdFbmNyeXB0aW9uRmxhZwotICAgICAgICAgICAgJiYgZy5sYW5ndWFnZUVuY29kaW5nRmxhZyA9PSBsYW5ndWFnZUVuY29kaW5nRmxhZwotICAgICAgICAgICAgJiYgZy5kYXRhRGVzY3JpcHRvckZsYWcgPT0gZGF0YURlc2NyaXB0b3JGbGFnOworCisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL0phck1hcmtlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvSmFyTWFya2VyLmphdmEKaW5kZXggYzA2MzM1My4uYmU5NjdlMCAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvSmFyTWFya2VyLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvSmFyTWFya2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9OaW9aaXBFbmNvZGluZy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvTmlvWmlwRW5jb2RpbmcuamF2YQppbmRleCBmNTY2NjE1Li40ODUzZDJlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9OaW9aaXBFbmNvZGluZy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL05pb1ppcEVuY29kaW5nLmphdmEKQEAgLTcsNyArNyw3IEBACiAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMTAyLDggKzEwMyw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBvdXQubGltaXQob3V0LnBvc2l0aW9uKCkpOwotICAgICAgICBvdXQucmV3aW5kKCk7CisgICAgICAgIFppcEVuY29kaW5nSGVscGVyLnByZXBhcmVCdWZmZXJGb3JSZWFkKG91dCk7CisKICAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1NpbXBsZThCaXRaaXBFbmNvZGluZy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvU2ltcGxlOEJpdFppcEVuY29kaW5nLmphdmEKaW5kZXggNzg5YzA0NS4uYjNjMTEzMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvU2ltcGxlOEJpdFppcEVuY29kaW5nLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvU2ltcGxlOEJpdFppcEVuY29kaW5nLmphdmEKQEAgLTcsNyArNyw3IEBACiAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KQEAgLTIwLDI1ICsyMCwyNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIC8qKgotICogVGhpcyBaaXBFbmNvZGluZyBpbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRzIGEgc2ltcGxlIDhiaXQgY2hhcmFjdGVyCi0gKiBzZXQsIHdoaWNoIG1ldHMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgKiBUaGlzIFppcEVuY29kaW5nIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzaW1wbGUgOCBiaXQgY2hhcmFjdGVyCisgKiBzZXQsIHdoaWNoIG1lZXRzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgogICoKICAqIDx1bD4KICAqIDxsaT5DaGFyYWN0ZXJzIDB4MDAwMCB0byAweDAwN2YgYXJlIGVuY29kZWQgYXMgdGhlIGNvcnJlc3BvbmRpbmcKICAqICAgICAgICBieXRlIHZhbHVlcyAweDAwIHRvIDB4N2YuPC9saT4KLSAqIDxsaT5BbGwgYnl0ZSBjb2RlcyBmcm9tIDB4ODAgdG8gMHhmZiBhcmUgbWFwcGVkIHRvIGEgdW5pcXVlIHVuaWNvZGUKKyAqIDxsaT5BbGwgYnl0ZSBjb2RlcyBmcm9tIDB4ODAgdG8gMHhmZiBhcmUgbWFwcGVkIHRvIGEgdW5pcXVlIFVuaWNvZGUKICAqICAgICAgIGNoYXJhY3RlciBpbiB0aGUgcmFuZ2UgMHgwMDgwIHRvIDB4N2ZmZi4gKE5vIHN1cHBvcnQgZm9yCiAgKiAgICAgICBVVEYtMTYgc3Vycm9nYXRlcykKICAqIDwvdWw+CiAgKgogICogPHA+VGhlc2UgcmVzdHJpY3Rpb25zIG1vc3Qgbm90YWJseSBhcHBseSB0byB0aGUgbW9zdCBwcm9taW5lbnQKLSAqIG9taXNzaW9ucyBvZiBqYXZhLTEuNCdzIHtAbGluayBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQgQ2hhcnNldH0KKyAqIG9taXNzaW9ucyBvZiBKYXZhIDEuNCB7QGxpbmsgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0IENoYXJzZXR9CiAgKiBpbXBsZW1lbnRhdGlvbiwgQ3A0MzcgYW5kIENwODUwLjwvcD4KICAqCiAgKiA8cD5UaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIGFyZSByZWVudHJhbnQuPC9wPgpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAgcHVibGljIFNpbXBsZThCaXRaaXBFbmNvZGluZyhmaW5hbCBjaGFyW10gaGlnaENoYXJzKSB7CiAgICAgICAgIHRoaXMuaGlnaENoYXJzID0gaGlnaENoYXJzLmNsb25lKCk7CiAgICAgICAgIGZpbmFsIExpc3Q8U2ltcGxlOEJpdENoYXI+IHRlbXAgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxTaW1wbGU4Qml0Q2hhcj4odGhpcy5oaWdoQ2hhcnMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4odGhpcy5oaWdoQ2hhcnMubGVuZ3RoKTsKIAogICAgICAgICBieXRlIGNvZGUgPSAxMjc7CiAKQEAgLTI0Nyw4ICsyNDgsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgb3V0LmxpbWl0KG91dC5wb3NpdGlvbigpKTsKLSAgICAgICAgb3V0LnJld2luZCgpOworICAgICAgICBaaXBFbmNvZGluZ0hlbHBlci5wcmVwYXJlQnVmZmVyRm9yUmVhZChvdXQpOwogICAgICAgICByZXR1cm4gb3V0OwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlQ29tbWVudEV4dHJhRmllbGQuamF2YQppbmRleCA2MmJlMmEzLi43MGEzNGQyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlQ29tbWVudEV4dHJhRmllbGQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlQ29tbWVudEV4dHJhRmllbGQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDcgKzI0LDcgQEAKICAqIDxwPlN0b3JlcyB0aGUgVVRGLTggdmVyc2lvbiBvZiB0aGUgZmlsZSBjb21tZW50IGFzIHN0b3JlZCBpbiB0aGUKICAqIGNlbnRyYWwgZGlyZWN0b3J5IGhlYWRlci48L3A+CiAgKgotICogPHA+U2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPlBLV0FSRSdzCisgKiA8cD5TZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPlBLV0FSRSdzCiAgKiBBUFBOT1RFLlRYVCwgc2VjdGlvbiA0LjYuODwvYT4uPC9wPgogICoKICAqLwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5pY29kZVBhdGhFeHRyYUZpZWxkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlUGF0aEV4dHJhRmllbGQuamF2YQppbmRleCA3NjM4ZWRkLi4xNjQ5NmE4IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlUGF0aEV4dHJhRmllbGQuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbmljb2RlUGF0aEV4dHJhRmllbGQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDcgKzI0LDcgQEAKICAqIDxwPlN0b3JlcyB0aGUgVVRGLTggdmVyc2lvbiBvZiB0aGUgZmlsZSBuYW1lIGZpZWxkIGFzIHN0b3JlZCBpbiB0aGUKICAqIGxvY2FsIGhlYWRlciBhbmQgY2VudHJhbCBkaXJlY3RvcnkgaGVhZGVyLjwvcD4KICAqCi0gKiA8cD5TZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXQVJFJ3MKKyAqIDxwPlNlZSA8YSBocmVmPSJodHRwczovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+UEtXQVJFJ3MKICAqIEFQUE5PVEUuVFhULCBzZWN0aW9uIDQuNi45PC9hPi48L3A+CiAgKi8KIHB1YmxpYyBjbGFzcyBVbmljb2RlUGF0aEV4dHJhRmllbGQgZXh0ZW5kcyBBYnN0cmFjdFVuaWNvZGVFeHRyYUZpZWxkIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VuaXhTdGF0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Vbml4U3RhdC5qYXZhCmluZGV4IDA4NjM3NTkuLjE3ZmFjNDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VuaXhTdGF0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5peFN0YXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VucGFyc2VhYmxlRXh0cmFGaWVsZERhdGEuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VucGFyc2VhYmxlRXh0cmFGaWVsZERhdGEuamF2YQppbmRleCA1YzFhOGQwLi4zMDYzODI3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnBhcnNlYWJsZUV4dHJhRmllbGREYXRhLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5wYXJzZWFibGVFeHRyYUZpZWxkRGF0YS5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0yMiw3ICsyMiw3IEBACiAgKiBXcmFwcGVyIGZvciBleHRyYSBmaWVsZCBkYXRhIHRoYXQgZG9lc24ndCBjb25mb3JtIHRvIHRoZSByZWNvbW1lbmRlZCBmb3JtYXQgb2YgaGVhZGVyLXRhZyArIHNpemUgKyBkYXRhLgogICoKICAqIDxwPlRoZSBoZWFkZXItaWQgaXMgYXJ0aWZpY2lhbCAoYW5kIG5vdCBsaXN0ZWQgYXMgYSBrbm93biBJRCBpbgotICogPGEgaHJlZj0iaHR0cDovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+QVBQTk9URS5UWFQ8L2E+KS4KKyAqIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUIj5BUFBOT1RFLlRYVDwvYT4pLgogICogU2luY2UgaXQgaXNuJ3QgdXNlZCBhbnl3aGVyZSBleGNlcHQgdG8gc2F0aXNmeSB0aGUKICAqIFppcEV4dHJhRmllbGQgY29udHJhY3QgaXQgc2hvdWxkbid0IG1hdHRlciBhbnl3YXkuPC9wPgogICoKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VucmVjb2duaXplZEV4dHJhRmllbGQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1VucmVjb2duaXplZEV4dHJhRmllbGQuamF2YQppbmRleCAwZTQyNjJkLi4yNzczMzJmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnJlY29nbml6ZWRFeHRyYUZpZWxkLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvVW5zdXBwb3J0ZWRaaXBGZWF0dXJlRXhjZXB0aW9uLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnN1cHBvcnRlZFppcEZlYXR1cmVFeGNlcHRpb24uamF2YQppbmRleCAzNGUyMTE3Li5kOWZiZDI0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnN1cHBvcnRlZFppcEZlYXR1cmVFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VbnN1cHBvcnRlZFppcEZlYXR1cmVFeGNlcHRpb24uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLnppcDsKIAoraW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogCiAvKioKQEAgLTY2LDcgKzY3LDcgQEAKICAgICAgKiBaSVAgRmVhdHVyZXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBzdXBwb3J0ZWQuCiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGZWF0dXJlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmVhdHVyZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgZW50cnkgaXMgZW5jcnlwdGVkLgogICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0RXh0ZW5kZWRJbmZvcm1hdGlvbkV4dHJhRmllbGQuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0RXh0ZW5kZWRJbmZvcm1hdGlvbkV4dHJhRmllbGQuamF2YQppbmRleCA0MGE0ZTRiLi5kZDU4YjYyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXA2NEV4dGVuZGVkSW5mb3JtYXRpb25FeHRyYUZpZWxkLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwNjRFeHRlbmRlZEluZm9ybWF0aW9uRXh0cmFGaWVsZC5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0yNyw3ICsyNyw3IEBACiAgKiBIb2xkcyBzaXplIGFuZCBvdGhlciBleHRlbmRlZCBpbmZvcm1hdGlvbiBmb3IgZW50cmllcyB0aGF0IHVzZSBaaXA2NAogICogZmVhdHVyZXMuCiAgKgotICogPHA+U2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPlBLV0FSRSdzCisgKiA8cD5TZWUgPGEgaHJlZj0iaHR0cHM6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPlBLV0FSRSdzCiAgKiBBUFBOT1RFLlRYVCwgc2VjdGlvbiA0LjUuMzwvYT4uPC9wPgogICoKICAqIDxwPkN1cnJlbnRseSBBbnQgZG9lc24ndCBzdXBwb3J0IGVuY3J5cHRpbmcgdGhlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXA2NE1vZGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0TW9kZS5qYXZhCmluZGV4IDMwZDlmMWMuLjAxMDc4MDQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0TW9kZS5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0TW9kZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwNjRSZXF1aXJlZEV4Y2VwdGlvbi5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwNjRSZXF1aXJlZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGY3ZmI3NzkuLjRhNjZiNjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcDY0UmVxdWlyZWRFeGNlcHRpb24uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXA2NFJlcXVpcmVkRXhjZXB0aW9uLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBDb25zdGFudHMuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcENvbnN0YW50cy5qYXZhCmluZGV4IDgzYWU5NTYuLmMzNmM4MDEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcENvbnN0YW50cy5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcENvbnN0YW50cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRWlnaHRCeXRlSW50ZWdlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRWlnaHRCeXRlSW50ZWdlci5qYXZhCmluZGV4IGNhMjkxNjAuLjRhMmY5M2MgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVpZ2h0Qnl0ZUludGVnZXIuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFaWdodEJ5dGVJbnRlZ2VyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMDcsMTAgKzIwNyw4IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgWmlwRWlnaHRCeXRlSW50ZWdlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzKCgoWmlwRWlnaHRCeXRlSW50ZWdlcikgbykuZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgWmlwRWlnaHRCeXRlSW50ZWdlcgorICAgICAgICAgICAgICAgICYmIHZhbHVlLmVxdWFscygoKFppcEVpZ2h0Qnl0ZUludGVnZXIpIG8pLmdldFZhbHVlKCkpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW5jb2RpbmcuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVuY29kaW5nLmphdmEKaW5kZXggMWUwMDM0YS4uNWE5ZmQwMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW5jb2RpbmcuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbmNvZGluZy5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbmNvZGluZ0hlbHBlci5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW5jb2RpbmdIZWxwZXIuamF2YQppbmRleCBiOWQ0NDQ3Li5iZTZiMGVjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbmNvZGluZ0hlbHBlci5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVuY29kaW5nSGVscGVyLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw2ICsxOCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CiAKK2ltcG9ydCBqYXZhLm5pby5CdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247CkBAIC02Niw4ICs2Nyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU2ltcGxlRW5jb2RpbmdIb2xkZXI+IHNpbXBsZUVuY29kaW5nczsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFNpbXBsZUVuY29kaW5nSG9sZGVyPiBzZSA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFNpbXBsZUVuY29kaW5nSG9sZGVyPigpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTaW1wbGVFbmNvZGluZ0hvbGRlcj4gc2UgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAgICAgZmluYWwgY2hhcltdIGNwNDM3X2hpZ2hfY2hhcnMgPQogICAgICAgICAgICAgbmV3IGNoYXJbXSB7MHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLCAweDAwZTQsIDB4MDBlMCwKQEAgLTE0OCwxNSArMTQ4LDI1IEBACiAgICAgICoKICAgICAgKi8KICAgICBzdGF0aWMgQnl0ZUJ1ZmZlciBncm93QnVmZmVyKGZpbmFsIEJ5dGVCdWZmZXIgYiwgZmluYWwgaW50IG5ld0NhcGFjaXR5KSB7Ci0gICAgICAgIGIubGltaXQoYi5wb3NpdGlvbigpKTsKLSAgICAgICAgYi5yZXdpbmQoKTsKLQorICAgIAlwcmVwYXJlQnVmZmVyRm9yUmVhZChiKTsKICAgICAgICAgZmluYWwgaW50IGMyID0gYi5jYXBhY2l0eSgpICogMjsKICAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBvbiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYzIgPCBuZXdDYXBhY2l0eSA/IG5ld0NhcGFjaXR5IDogYzIpOwogCiAgICAgICAgIG9uLnB1dChiKTsKICAgICAgICAgcmV0dXJuIG9uOwogICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlcyBhIGJ1ZmZlciB0byBiZSByZWFkIGFmdGVyIHdyaXRpbmcuCisgICAgICogCisgICAgICogQHBhcmFtIGIgVGhlIGJ1ZmZlcgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHByZXBhcmVCdWZmZXJGb3JSZWFkKGZpbmFsIEJ1ZmZlciBiKSB7CisgICAgCS8vIEJ5dGVCdWZmZXIgaGFzIG92ZXJyaWRkZW4gbWV0aG9kcyBpbiBqYXZhIDExIGJ1dCBub3QgaW4gamF2YSA4IAorICAgIAkvLyBzbyB0aGUgQnVmZmVyIGlzIHNpZ25pZmljYW50IHRvIGdldCBqYXZhIDggY29tcGF0aWJsZSBjbGFzc2VzCisgICAgCWIubGltaXQoYi5wb3NpdGlvbigpKTsKKyAgICAJYi5yZXdpbmQoKTsKKyAgICB9CiAKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW50cnkuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5LmphdmEKaW5kZXggNGQ2MTlkMy4uMDBmMGRiMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW50cnkuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CiAKIC8qKgpAQCAtMzAsNyArMzEsNyBAQAogICogYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzLgogICoKICAqIDxwPlRoZSBleHRyYSBkYXRhIGlzIGV4cGVjdGVkIHRvIGZvbGxvdyB0aGUgcmVjb21tZW5kYXRpb24gb2YKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPkFQUE5PVEUudHh0PC9hPjo8L3A+CisgKiA8YSBocmVmPSJodHRwczovL3d3dy5wa3dhcmUuY29tL2RvY3VtZW50cy9jYXNlc3R1ZGllcy9BUFBOT1RFLlRYVCI+QVBQTk9URS50eHQ8L2E+OjwvcD4KICAqIDx1bD4KICAqICAgPGxpPnRoZSBleHRyYSBieXRlIGFycmF5IGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgZXh0cmEgZmllbGRzPC9saT4KICAqICAgPGxpPmVhY2ggZXh0cmEgZmllbGRzIHN0YXJ0cyBieSBhIHR3byBieXRlIGhlYWRlciBpZCBmb2xsb3dlZCBieQpAQCAtMzA3LDcgKzMwOCw3IEBACiAgICAgICogQHNpbmNlIDEuMQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEV4dHJhRmllbGRzKGZpbmFsIFppcEV4dHJhRmllbGRbXSBmaWVsZHMpIHsKLSAgICAgICAgTGlzdDxaaXBFeHRyYUZpZWxkPiBuZXdGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFppcEV4dHJhRmllbGQ+KCk7CisgICAgICAgIExpc3Q8WmlwRXh0cmFGaWVsZD4gbmV3RmllbGRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvciAoWmlwRXh0cmFGaWVsZCBmaWVsZCA6IGZpZWxkcykgewogICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgVW5wYXJzZWFibGVFeHRyYUZpZWxkRGF0YSkgewogICAgICAgICAgICAgICAgIHVucGFyc2VhYmxlRXh0cmEgPSAoVW5wYXJzZWFibGVFeHRyYUZpZWxkRGF0YSkgZmllbGQ7CkBAIC00NTUsMTYgKzQ1NiwxNiBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHJlbW92ZUV4dHJhRmllbGQoZmluYWwgWmlwU2hvcnQgdHlwZSkgewogICAgICAgICBpZiAoZXh0cmFGaWVsZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9Ci0gICAgICAgIExpc3Q8WmlwRXh0cmFGaWVsZD4gbmV3UmVzdWx0ID0gbmV3IEFycmF5TGlzdDxaaXBFeHRyYUZpZWxkPigpOworICAgICAgICBMaXN0PFppcEV4dHJhRmllbGQ+IG5ld1Jlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKFppcEV4dHJhRmllbGQgZXh0cmFGaWVsZCA6IGV4dHJhRmllbGRzKSB7CiAgICAgICAgICAgICBpZiAoIXR5cGUuZXF1YWxzKGV4dHJhRmllbGQuZ2V0SGVhZGVySWQoKSkpIHsKICAgICAgICAgICAgICAgICBuZXdSZXN1bHQuYWRkKGV4dHJhRmllbGQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChleHRyYUZpZWxkcy5sZW5ndGggPT0gbmV3UmVzdWx0LnNpemUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIGV4dHJhRmllbGRzID0gbmV3UmVzdWx0LnRvQXJyYXkobmV3IFppcEV4dHJhRmllbGRbbmV3UmVzdWx0LnNpemUoKV0pOwogICAgICAgICBzZXRFeHRyYSgpOwpAQCAtNDc1LDcgKzQ3Niw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVtb3ZlVW5wYXJzZWFibGVFeHRyYUZpZWxkRGF0YSgpIHsKICAgICAgICAgaWYgKHVucGFyc2VhYmxlRXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIHVucGFyc2VhYmxlRXh0cmEgPSBudWxsOwogICAgICAgICBzZXRFeHRyYSgpOwpAQCAtNzQ0LDggKzc0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFkZEV4dHJhRmllbGQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAhKGV4aXN0aW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlb2YgQ2VudHJhbERpcmVjdG9yeVBhcnNpbmdaaXBFeHRyYUZpZWxkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfHwgIShleGlzdGluZyBpbnN0YW5jZW9mIENlbnRyYWxEaXJlY3RvcnlQYXJzaW5nWmlwRXh0cmFGaWVsZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBiID0gZWxlbWVudC5nZXRMb2NhbEZpbGVEYXRhRGF0YSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShiLCAwLCBiLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFeHRyYUZpZWxkLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFeHRyYUZpZWxkLmphdmEKaW5kZXggNjQ5ZmNhMC4uZTE3YTA3YiAxMDA2NDQKLS0tIGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRXh0cmFGaWVsZC5qYXZhCisrKyBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEV4dHJhRmllbGQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEZpbGUuamF2YSBiL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEZpbGUuamF2YQppbmRleCBhNTA1NzBlLi5kZmI2YmNmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBGaWxlLmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwRmlsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzUsMTAgKzM1LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVyOwogaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKQEAgLTg2LDEzICs4NiwxMyBAQAogICAgICAqIExpc3Qgb2YgZW50cmllcyBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW5zaWRlIHRoZSBjZW50cmFsCiAgICAgICogZGlyZWN0b3J5LgogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxaaXBFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0PFppcEVudHJ5PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxaaXBFbnRyeT4gZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogICAgIC8qKgogICAgICAqIE1hcHMgU3RyaW5nIHRvIGxpc3Qgb2YgWmlwRW50cnlzLCBuYW1lIC0+IGFjdHVhbCBlbnRyaWVzLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlua2VkTGlzdDxaaXBFbnRyeT4+IG5hbWVNYXAgPQotICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIExpbmtlZExpc3Q8WmlwRW50cnk+PihIQVNIX1NJWkUpOworICAgICAgICBuZXcgSGFzaE1hcDw+KEhBU0hfU0laRSk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPZmZzZXRFbnRyeSB7CiAgICAgICAgIHByaXZhdGUgbG9uZyBoZWFkZXJPZmZzZXQgPSAtMTsKQEAgLTEwMyw3ICsxMDMsOCBAQAogICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KICAgICAgKgogICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KKyAgICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCiAgICAgICogRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVuY29kaW5nOwpAQCAtMjQxLDYgKzI0Miw3IEBACiAgICAgICogQ2xvc2VzIHRoZSBhcmNoaXZlLgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIGNsb3NpbmcgdGhlIGFyY2hpdmUuCiAgICAgICovCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICAvLyB0aGlzIGZsYWcgaXMgb25seSB3cml0dGVuIGhlcmUgYW5kIHJlYWQgaW4gZmluYWxpemUoKSB3aGljaAogICAgICAgICAvLyBjYW4gbmV2ZXIgYmUgcnVuIGluIHBhcmFsbGVsLgpAQCAtMjg4LDkgKzI5MCw4IEBACiAgICAgICogQHNpbmNlIEFudCAxLjkuMAogICAgICAqLwogICAgIHB1YmxpYyBFbnVtZXJhdGlvbjxaaXBFbnRyeT4gZ2V0RW50cmllc0luUGh5c2ljYWxPcmRlcigpIHsKLSAgICAgICAgZmluYWwgWmlwRW50cnlbXSBhbGxFbnRyaWVzID0gZW50cmllcy50b0FycmF5KG5ldyBaaXBFbnRyeVswXSk7Ci0gICAgICAgIEFycmF5cy5zb3J0KGFsbEVudHJpZXMsIE9GRlNFVF9DT01QQVJBVE9SKTsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKEFycmF5cy5hc0xpc3QoYWxsRW50cmllcykpOworICAgICAgICByZXR1cm4gZW50cmllcy5zdHJlYW0oKS5zb3J0ZWQoT0ZGU0VUX0NPTVBBUkFUT1IpLmNvbGxlY3QoQ29sbGVjdG9ycworICAgICAgICAgICAgLmNvbGxlY3RpbmdBbmRUaGVuKENvbGxlY3RvcnMudG9MaXN0KCksIENvbGxlY3Rpb25zOjplbnVtZXJhdGlvbikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgcHVibGljIEl0ZXJhYmxlPFppcEVudHJ5PiBnZXRFbnRyaWVzKGZpbmFsIFN0cmluZyBuYW1lKSB7CiAgICAgICAgIGZpbmFsIExpc3Q8WmlwRW50cnk+IGVudHJpZXNPZlRoYXROYW1lID0gbmFtZU1hcC5nZXQobmFtZSk7CiAgICAgICAgIHJldHVybiBlbnRyaWVzT2ZUaGF0TmFtZSAhPSBudWxsID8gZW50cmllc09mVGhhdE5hbWUKLSAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuPFppcEVudHJ5PmVtcHR5TGlzdCgpOworICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzNSwxMiArMzM2LDExIEBACiAgICAgICogQHNpbmNlIDEuOS4yCiAgICAgICovCiAgICAgcHVibGljIEl0ZXJhYmxlPFppcEVudHJ5PiBnZXRFbnRyaWVzSW5QaHlzaWNhbE9yZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFppcEVudHJ5W10gZW50cmllc09mVGhhdE5hbWUgPSBuZXcgWmlwRW50cnlbMF07CiAgICAgICAgIGlmIChuYW1lTWFwLmNvbnRhaW5zS2V5KG5hbWUpKSB7Ci0gICAgICAgICAgICBlbnRyaWVzT2ZUaGF0TmFtZSA9IG5hbWVNYXAuZ2V0KG5hbWUpLnRvQXJyYXkoZW50cmllc09mVGhhdE5hbWUpOwotICAgICAgICAgICAgQXJyYXlzLnNvcnQoZW50cmllc09mVGhhdE5hbWUsIE9GRlNFVF9DT01QQVJBVE9SKTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lTWFwLmdldChuYW1lKS5zdHJlYW0oKS5zb3J0ZWQoT0ZGU0VUX0NPTVBBUkFUT1IpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoZW50cmllc09mVGhhdE5hbWUpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zOTYsNiArMzk2LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBhcmNoaXZlTmFtZTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIGNsb3NlIG1ldGhvZCBvZiB0aGlzIHppcGZpbGUgaXMgY2FsbGVkIHdoZW4KICAgICAgKiB0aGVyZSBhcmUgbm8gbW9yZSByZWZlcmVuY2VzIHRvIGl0LgpAQCAtNDA1LDggKzQwOSw4IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmICghY2xvc2VkKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJDbGVhbmluZyB1cCB1bmNsb3NlZCBaaXBGaWxlIGZvciBhcmNoaXZlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcmNoaXZlTmFtZSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkNsZWFuaW5nIHVwIHVuY2xvc2VkICVzIGZvciBhcmNoaXZlICVzJW4iLAorICAgICAgICAgICAgICAgICAgICBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgYXJjaGl2ZU5hbWUpOwogICAgICAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CkBAIC00NTIsOCArNDU2LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIE1hcDxaaXBFbnRyeSwgTmFtZUFuZENvbW1lbnQ+IHBvcHVsYXRlRnJvbUNlbnRyYWxEaXJlY3RvcnkoKQogICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBIYXNoTWFwPFppcEVudHJ5LCBOYW1lQW5kQ29tbWVudD4gbm9VVEY4RmxhZyA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxaaXBFbnRyeSwgTmFtZUFuZENvbW1lbnQ+KCk7CisgICAgICAgIGZpbmFsIE1hcDxaaXBFbnRyeSwgTmFtZUFuZENvbW1lbnQ+IG5vVVRGOEZsYWcgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAgICAgcG9zaXRpb25BdENlbnRyYWxEaXJlY3RvcnkoKTsKIApAQCAtNDYxLDggKzQ2NCw4IEBACiAgICAgICAgIGxvbmcgc2lnID0gWmlwTG9uZy5nZXRWYWx1ZShXT1JEX0JVRik7CiAKICAgICAgICAgaWYgKHNpZyAhPSBDRkhfU0lHICYmIHN0YXJ0c1dpdGhMb2NhbEZpbGVIZWFkZXIoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJjZW50cmFsIGRpcmVjdG9yeSBpcyBlbXB0eSwgY2FuJ3QgZXhwYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBjb3JydXB0IGFyY2hpdmUuIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImNlbnRyYWwgZGlyZWN0b3J5IGlzIGVtcHR5LCBjYW4ndCBleHBhbmQgY29ycnVwdCBhcmNoaXZlLiIpOwogICAgICAgICB9CiAKICAgICAgICAgd2hpbGUgKHNpZyA9PSBDRkhfU0lHKSB7CkBAIC00NzQsNyArNDc3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZWFkcyBhbiBpbmRpdmlkdWFsIGVudHJ5IG9mIHRoZSBjZW50cmFsIGRpcmVjdG9yeSwgY3JlYXRzIGFuCisgICAgICogUmVhZHMgYW4gaW5kaXZpZHVhbCBlbnRyeSBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnksIGNyZWF0ZXMgYW4KICAgICAgKiBaaXBFbnRyeSBmcm9tIGl0IGFuZCBhZGRzIGl0IHRvIHRoZSBnbG9iYWwgbWFwcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBub1VURjhGbGFnIG1hcCB1c2VkIHRvIGNvbGxlY3QgZW50cmllcyB0aGF0IGRvbid0IGhhdmUKQEAgLTc0NCw4ICs3NDcsOCBAQAogICAgICAgICBhcmNoaXZlLnNlZWsoWmlwRWlnaHRCeXRlSW50ZWdlci5nZXRMb25nVmFsdWUoRFdPUkRfQlVGKSk7CiAgICAgICAgIGFyY2hpdmUucmVhZEZ1bGx5KFdPUkRfQlVGKTsKICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKFdPUkRfQlVGLCBaaXBPdXRwdXRTdHJlYW0uWklQNjRfRU9DRF9TSUcpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWmlwRXhjZXB0aW9uKCJhcmNoaXZlJ3MgWklQNjQgZW5kIG9mIGNlbnRyYWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkaXJlY3RvcnkgbG9jYXRvciBpcyBjb3JydXB0LiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFppcEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiYXJjaGl2ZSdzIFpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIGlzIGNvcnJ1cHQuIik7CiAgICAgICAgIH0KICAgICAgICAgc2tpcEJ5dGVzKFpJUDY0X0VPQ0RfQ0ZEX0xPQ0FUT1JfT0ZGU0VUCiAgICAgICAgICAgICAgICAgICAtIFdPUkQgLyogc2lnbmF0dXJlIGhhcyBhbHJlYWR5IGJlZW4gcmVhZCAqLyk7CkBAIC03ODAsNyArNzgzLDcgQEAKIAogICAgIC8qKgogICAgICAqIFNlYXJjaGVzIHRoZSBhcmNoaXZlIGJhY2t3YXJkcyBmcm9tIG1pbkRpc3RhbmNlIHRvIG1heERpc3RhbmNlCi0gICAgICogZm9yIHRoZSBnaXZlbiBzaWduYXR1cmUsIHBvc2l0aW9ucyB0aGUgUmFuZG9tYWNjZXNzRmlsZSByaWdodAorICAgICAqIGZvciB0aGUgZ2l2ZW4gc2lnbmF0dXJlLCBwb3NpdGlvbnMgdGhlIFJhbmRvbUFjY2Vzc0ZpbGUgcmlnaHQKICAgICAgKiBhdCB0aGUgc2lnbmF0dXJlIGlmIGl0IGhhcyBiZWVuIGZvdW5kLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB0cnlUb0xvY2F0ZVNpZ25hdHVyZShmaW5hbCBsb25nIG1pbkRpc3RhbmNlRnJvbUVuZCwKQEAgLTg1OCwxMCArODYxLDEwIEBACiAgICAgcHJpdmF0ZSB2b2lkIHJlc29sdmVMb2NhbEZpbGVIZWFkZXJEYXRhKGZpbmFsIE1hcDxaaXBFbnRyeSwgTmFtZUFuZENvbW1lbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXNXaXRob3V0VVRGOEZsYWcpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8WmlwRW50cnk+IGl0ID0gZW50cmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7CisgICAgICAgIGZvciAoWmlwRW50cnkgemlwRW50cnkgOiBlbnRyaWVzKSB7CiAgICAgICAgICAgICAvLyBlbnRyaWVzIGlzIGZpbGxlZCBpbiBwb3B1bGF0ZUZyb21DZW50cmFsRGlyZWN0b3J5IGFuZAogICAgICAgICAgICAgLy8gbmV2ZXIgbW9kaWZpZWQKLSAgICAgICAgICAgIGZpbmFsIEVudHJ5IHplID0gKEVudHJ5KSBpdC5uZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBFbnRyeSB6ZSA9IChFbnRyeSkgemlwRW50cnk7CiAgICAgICAgICAgICBmaW5hbCBPZmZzZXRFbnRyeSBvZmZzZXRFbnRyeSA9IHplLmdldE9mZnNldEVudHJ5KCk7CiAgICAgICAgICAgICBmaW5hbCBsb25nIG9mZnNldCA9IG9mZnNldEVudHJ5LmhlYWRlck9mZnNldDsKICAgICAgICAgICAgIGFyY2hpdmUuc2VlayhvZmZzZXQgKyBMRkhfT0ZGU0VUX0ZPUl9GSUxFTkFNRV9MRU5HVEgpOwpAQCAtODczLDggKzg3Niw4IEBACiAgICAgICAgICAgICB3aGlsZSAobGVuVG9Ta2lwID4gMCkgewogICAgICAgICAgICAgICAgIGZpbmFsIGludCBza2lwcGVkID0gYXJjaGl2ZS5za2lwQnl0ZXMobGVuVG9Ta2lwKTsKICAgICAgICAgICAgICAgICBpZiAoc2tpcHBlZCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIHNraXAgZmlsZSBuYW1lIGluIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGxvY2FsIGZpbGUgaGVhZGVyIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gc2tpcCBmaWxlIG5hbWUgaW4gbG9jYWwgZmlsZSBoZWFkZXIiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbGVuVG9Ta2lwIC09IHNraXBwZWQ7CiAgICAgICAgICAgICB9CkBAIC04OTEsMTEgKzg5NCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gemUuZ2V0TmFtZSgpOwotICAgICAgICAgICAgTGlua2VkTGlzdDxaaXBFbnRyeT4gZW50cmllc09mVGhhdE5hbWUgPSBuYW1lTWFwLmdldChuYW1lKTsKLSAgICAgICAgICAgIGlmIChlbnRyaWVzT2ZUaGF0TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZW50cmllc09mVGhhdE5hbWUgPSBuZXcgTGlua2VkTGlzdDxaaXBFbnRyeT4oKTsKLSAgICAgICAgICAgICAgICBuYW1lTWFwLnB1dChuYW1lLCBlbnRyaWVzT2ZUaGF0TmFtZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBMaW5rZWRMaXN0PFppcEVudHJ5PiBlbnRyaWVzT2ZUaGF0TmFtZSA9IG5hbWVNYXAuY29tcHV0ZUlmQWJzZW50KG5hbWUsIGsgLT4gbmV3IExpbmtlZExpc3Q8PigpKTsKICAgICAgICAgICAgIGVudHJpZXNPZlRoYXROYW1lLmFkZExhc3QoemUpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTU4LDcgKzk1Nyw3IEBACiAgICAgICAgICAgICBpZiAobGVuID4gcmVtYWluaW5nKSB7CiAgICAgICAgICAgICAgICAgbGVuID0gKGludCkgcmVtYWluaW5nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHJldCA9IC0xOworICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoYXJjaGl2ZSkgewogICAgICAgICAgICAgICAgIGFyY2hpdmUuc2Vlayhsb2MpOwogICAgICAgICAgICAgICAgIHJldCA9IGFyY2hpdmUucmVhZChiLCBvZmYsIGxlbik7CkBAIC05OTYsMjUgKzk5NSwyMiBAQAogICAgICAqCiAgICAgICogQHNpbmNlIEFudCAxLjkuMAogICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxaaXBFbnRyeT4gT0ZGU0VUX0NPTVBBUkFUT1IgPQotICAgICAgICBuZXcgQ29tcGFyYXRvcjxaaXBFbnRyeT4oKSB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBaaXBFbnRyeSBlMSwgZmluYWwgWmlwRW50cnkgZTIpIHsKLSAgICAgICAgICAgIGlmIChlMSA9PSBlMikgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBFbnRyeSBlbnQxID0gZTEgaW5zdGFuY2VvZiBFbnRyeSA/IChFbnRyeSkgZTEgOiBudWxsOwotICAgICAgICAgICAgZmluYWwgRW50cnkgZW50MiA9IGUyIGluc3RhbmNlb2YgRW50cnkgPyAoRW50cnkpIGUyIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChlbnQxID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlbnQyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHZhbCA9IChlbnQxLmdldE9mZnNldEVudHJ5KCkuaGVhZGVyT2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAtIGVudDIuZ2V0T2Zmc2V0RW50cnkoKS5oZWFkZXJPZmZzZXQpOwotICAgICAgICAgICAgcmV0dXJuIHZhbCA9PSAwID8gMCA6IHZhbCA8IDAgPyAtMSA6ICsxOworICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxaaXBFbnRyeT4gT0ZGU0VUX0NPTVBBUkFUT1IgPSAoZTEsIGUyKSAtPiB7CisgICAgICAgIGlmIChlMSA9PSBlMikgeworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbnRyeSBlbnQxID0gZTEgaW5zdGFuY2VvZiBFbnRyeSA/IChFbnRyeSkgZTEgOiBudWxsOworICAgICAgICBmaW5hbCBFbnRyeSBlbnQyID0gZTIgaW5zdGFuY2VvZiBFbnRyeSA/IChFbnRyeSkgZTIgOiBudWxsOworICAgICAgICBpZiAoZW50MSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW50MiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgbG9uZyB2YWwgPSAoZW50MS5nZXRPZmZzZXRFbnRyeSgpLmhlYWRlck9mZnNldAorICAgICAgICAgICAgICAgICAgICAtIGVudDIuZ2V0T2Zmc2V0RW50cnkoKS5oZWFkZXJPZmZzZXQpOworICAgICAgICByZXR1cm4gdmFsID09IDAgPyAwIDogdmFsIDwgMCA/IC0xIDogKzE7CiAgICAgfTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwTG9uZy5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwTG9uZy5qYXZhCmluZGV4IDU5MzJmODQuLjIxNDJlZmYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcExvbmcuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgKiBAcGFyYW0gYnVmIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICogQHBhcmFtICBvZmZzZXQKICAgICAgKiAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBvdXRwdXQgYnVmZmVyIG9mIHRoZSBmaXJzdCBieXRlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPHR0PmJ1Zi5sZW5ndGgtNDwvdHQ+CisgICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPGNvZGU+YnVmLmxlbmd0aC00PC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRMb25nKGxvbmcgdmFsdWUsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKICAgICAgICAgYnVmW29mZnNldCsrXSA9IChieXRlKSAoKHZhbHVlICYgQllURV9NQVNLKSk7CkBAIC0xNjgsMTAgKzE2OCw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgIShvIGluc3RhbmNlb2YgWmlwTG9uZykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUgPT0gKChaaXBMb25nKSBvKS5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gbyBpbnN0YW5jZW9mIFppcExvbmcgJiYgdmFsdWUgPT0gKChaaXBMb25nKSBvKS5nZXRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlZjg1MGVlLi43NWFjZjU5IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMxLDEyICszMSwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwogaW1wb3J0IGphdmEudXRpbC5EYXRlOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFppcEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZExpc3Q8WmlwRW50cnk+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFppcEVudHJ5PiBlbnRyaWVzID0gbmV3IExpbmtlZExpc3Q8PigpOwogCiAgICAgLyoqCiAgICAgICogQ1JDIGluc3RhbmNlIHRvIGF2b2lkIHBhcnNpbmcgREVGTEFURUQgZGF0YSB0d2ljZS4KQEAgLTI0NywxMyArMjQ3LDE0IEBACiAgICAgICoKICAgICAgKiBAc2luY2UgMS4xCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8WmlwRW50cnksIExvbmc+IG9mZnNldHMgPSBuZXcgSGFzaE1hcDxaaXBFbnRyeSwgTG9uZz4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxaaXBFbnRyeSwgTG9uZz4gb2Zmc2V0cyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KICAgICAgKgogICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KKyAgICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCiAgICAgICogRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPgogICAgICAqCiAgICAgICogQHNpbmNlIDEuMwpAQCAtMzQzLDIyICszNDQsMjIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgWmlwT3V0cHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgc3VwZXIobnVsbCk7Ci0gICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgX3JhZiA9IG51bGw7CisgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFuZiA9IG51bGw7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBfcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZSwgInJ3Iik7Ci0gICAgICAgICAgICBfcmFmLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIHJhbmYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmaWxlLCAicnciKTsKKyAgICAgICAgICAgIHJhbmYuc2V0TGVuZ3RoKDApOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoX3JhZiAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocmFuZiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgX3JhZi5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByYW5mLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW5uZXIpIHsgLy8gTk9QTUQKICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9yYWYgPSBudWxsOworICAgICAgICAgICAgICAgIHJhbmYgPSBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7CisgICAgICAgICAgICBvdXQgPSBGaWxlcy5uZXdPdXRwdXRTdHJlYW0oZmlsZS50b1BhdGgoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmFmID0gX3JhZjsKKyAgICAgICAgcmFmID0gcmFuZjsKICAgICB9CiAKICAgICAvKioKQEAgLTM3OSw3ICszODAsOCBAQAogICAgICAqIFRoZSBlbmNvZGluZyB0byB1c2UgZm9yIGZpbGVuYW1lcyBhbmQgdGhlIGZpbGUgY29tbWVudC4KICAgICAgKgogICAgICAqIDxwPkZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIHNlZSA8YQotICAgICAqIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWwiPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjUuMC9kb2NzL2d1aWRlL2ludGwvZW5jb2RpbmcuZG9jLmh0bWw8L2E+LgorICAgICAqIGhyZWY9Imh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9pbnRsL2VuY29kaW5nLmRvYy5odG1sIj4KKyAgICAgKiBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL3RlY2hub3Rlcy9ndWlkZXMvaW50bC9lbmNvZGluZy5kb2MuaHRtbDwvYT4uCiAgICAgICogRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPgogICAgICAqIEBwYXJhbSBlbmNvZGluZyB0aGUgZW5jb2RpbmcgdmFsdWUKICAgICAgKiBAc2luY2UgMS4zCkBAIC0xMTUxLDIwICsxMTUzLDE2IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgY29tbSA9IHplLmdldENvbW1lbnQoKTsKLSAgICAgICAgaWYgKGNvbW0gIT0gbnVsbCAmJiAhIiIuZXF1YWxzKGNvbW0pKSB7CisgICAgICAgIGlmIChjb21tID09IG51bGwgfHwgY29tbS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBib29sZWFuIGNvbW1lbnRFbmNvZGFibGUgPSB6aXBFbmNvZGluZy5jYW5FbmNvZGUoY29tbSk7Ci0KLSAgICAgICAgICAgIGlmIChjcmVhdGVVbmljb2RlRXh0cmFGaWVsZHMgPT0gVW5pY29kZUV4dHJhRmllbGRQb2xpY3kuQUxXQVlTCi0gICAgICAgICAgICAgICAgfHwgIWNvbW1lbnRFbmNvZGFibGUpIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGNvbW1lbnRCID0gZ2V0RW50cnlFbmNvZGluZyh6ZSkuZW5jb2RlKGNvbW0pOwotICAgICAgICAgICAgICAgIHplLmFkZEV4dHJhRmllbGQobmV3IFVuaWNvZGVDb21tZW50RXh0cmFGaWVsZChjb21tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50Qi5hcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50Qi5hcnJheU9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50Qi5saW1pdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY29tbWVudEIucG9zaXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChjcmVhdGVVbmljb2RlRXh0cmFGaWVsZHMgPT0gVW5pY29kZUV4dHJhRmllbGRQb2xpY3kuQUxXQVlTCisgICAgICAgICAgICB8fCAhemlwRW5jb2RpbmcuY2FuRW5jb2RlKGNvbW0pKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGNvbW1lbnRCID0gZ2V0RW50cnlFbmNvZGluZyh6ZSkuZW5jb2RlKGNvbW0pOworICAgICAgICAgICAgemUuYWRkRXh0cmFGaWVsZChuZXcgVW5pY29kZUNvbW1lbnRFeHRyYUZpZWxkKGNvbW0sCisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRCLmFycmF5KCksIGNvbW1lbnRCLmFycmF5T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRCLmxpbWl0KCkgLSBjb21tZW50Qi5wb3NpdGlvbigpKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0LmphdmEgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBTaG9ydC5qYXZhCmluZGV4IGNjYmNhM2QuLmU0ZjY1YjEgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0LmphdmEKKysrIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgKiBAcGFyYW0gYnVmIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICogQHBhcmFtICBvZmZzZXQKICAgICAgKiAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBvdXRwdXQgYnVmZmVyIG9mIHRoZSBmaXJzdCBieXRlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPHR0PmJ1Zi5sZW5ndGgtMjwvdHQ+CisgICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPGNvZGU+YnVmLmxlbmd0aC0yPC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXRTaG9ydChpbnQgdmFsdWUsIGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKICAgICAgICAgYnVmW29mZnNldF0gPSAoYnl0ZSkgKHZhbHVlICYgQllURV9NQVNLKTsKQEAgLTEzMywxMCArMTMzLDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCAhKG8gaW5zdGFuY2VvZiBaaXBTaG9ydCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUgPT0gKChaaXBTaG9ydCkgbykuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBaaXBTaG9ydCAmJiB2YWx1ZSA9PSAoKFppcFNob3J0KSBvKS5nZXRWYWx1ZSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwVXRpbC5qYXZhIGIvc3JjL21haW4vb3JnL2FwYWNoZS90b29scy96aXAvWmlwVXRpbC5qYXZhCmluZGV4IGZmMzVjYTQuLjIxN2VkYTggMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFV0aWwuamF2YQorKysgYi9zcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBVdGlsLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICogQHBhcmFtIGJ1ZiB0aGUgb3V0cHV0IGJ1ZmZlcgogICAgICAqIEBwYXJhbSBvZmZzZXQKICAgICAgKiAgICAgICAgIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBvdXRwdXQgYnVmZmVyIG9mIHRoZSBmaXJzdCBieXRlIHRvIGJlIHdyaXR0ZW4uCi0gICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPHR0PmJ1Zi5sZW5ndGgtNDwvdHQ+CisgICAgICogICAgICAgICBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgbm8gbGFyZ2VyIHRoYW4gPGNvZGU+YnVmLmxlbmd0aC00PC9jb2RlPgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0b0Rvc1RpbWUobG9uZyB0LCBieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAgICAgICAgIHRvRG9zVGltZShDYWxlbmRhci5nZXRJbnN0YW5jZSgpLCB0LCBidWYsIG9mZnNldCk7CmRpZmYgLS1naXQgYS9zcmMvcmVzb3VyY2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9hbnRsaWIueG1sIGIvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvYW50bGliLnhtbAppbmRleCBhZTYxYjlkLi4wNGZkMjkzIDEwMDY0NAotLS0gYS9zcmMvcmVzb3VyY2VzL29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy9hbnRsaWIueG1sCisrKyBiL3NyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL2FudGxpYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9yZXNvdXJjZXMvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9hbnRsaWIueG1sIGIvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL2FudGxpYi54bWwKaW5kZXggMGQwZTUwMi4uMzMzYjQ1OCAxMDA2NDQKLS0tIGEvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL2FudGxpYi54bWwKKysrIGIvc3JjL3Jlc291cmNlcy9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL2FudGxpYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50IGIvc3JjL3NjcmlwdC9hbnQKaW5kZXggMjA5NTFmNC4uODExMDdiNSAxMDA2NDQKLS0tIGEvc3JjL3NjcmlwdC9hbnQKKysrIGIvc3JjL3NjcmlwdC9hbnQKQEAgLTcsNyArNyw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9hbnQuYmF0IGIvc3JjL3NjcmlwdC9hbnQuYmF0CmluZGV4IGExM2NhYmMuLjU1M2FmMjUgMTAwNzU1Ci0tLSBhL3NyYy9zY3JpcHQvYW50LmJhdAorKysgYi9zcmMvc2NyaXB0L2FudC5iYXQKQEAgLTcsNyArNyw3IEBACiBSRU0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiBSRU0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiBSRU0KLVJFTSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorUkVNICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogUkVNCiBSRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIFJFTSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50LmNtZCBiL3NyYy9zY3JpcHQvYW50LmNtZAppbmRleCA5MDJhMWE3Li5hMDE4ZTMwIDEwMDY0NAotLS0gYS9zcmMvc2NyaXB0L2FudC5jbWQKKysrIGIvc3JjL3NjcmlwdC9hbnQuY21kCkBAIC02LDcgKzYsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvc2NyaXB0L2FudFJ1biBiL3NyYy9zY3JpcHQvYW50UnVuCmluZGV4IDgxMTBmODYuLjcxMzc2MmUgMTAwNjQ0Ci0tLSBhL3NyYy9zY3JpcHQvYW50UnVuCisrKyBiL3NyYy9zY3JpcHQvYW50UnVuCkBAIC03LDcgKzcsNyBAQAogIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50UnVuLmJhdCBiL3NyYy9zY3JpcHQvYW50UnVuLmJhdAppbmRleCAyNGVhZGU5Li5iM2M1YTEwIDEwMDc1NQotLS0gYS9zcmMvc2NyaXB0L2FudFJ1bi5iYXQKKysrIGIvc3JjL3NjcmlwdC9hbnRSdW4uYmF0CkBAIC03LDcgKzcsNyBAQAogUkVNICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogUkVNICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogUkVNCi1SRU0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKK1JFTSAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFJFTQogUkVNICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiBSRU0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvc2NyaXB0L2FudFJ1bi5wbCBiL3NyYy9zY3JpcHQvYW50UnVuLnBsCmluZGV4IGJjNDkzZGQuLmU1N2YzZDcgMTAwNjQ0Ci0tLSBhL3NyYy9zY3JpcHQvYW50UnVuLnBsCisrKyBiL3NyYy9zY3JpcHQvYW50UnVuLnBsCkBAIC03LDcgKzcsNyBAQAogIyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICMgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvYW50ZW52LmNtZCBiL3NyYy9zY3JpcHQvYW50ZW52LmNtZAppbmRleCA3OTEzODAxLi42Y2JjY2VkIDEwMDY0NAotLS0gYS9zcmMvc2NyaXB0L2FudGVudi5jbWQKKysrIGIvc3JjL3NjcmlwdC9hbnRlbnYuY21kCkBAIC02LDcgKzYsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvc2NyaXB0L2NvbXBsZXRlLWFudC1jbWQucGwgYi9zcmMvc2NyaXB0L2NvbXBsZXRlLWFudC1jbWQucGwKaW5kZXggNDdlM2MwZS4uZTc0NzJiMyAxMDA2NDQKLS0tIGEvc3JjL3NjcmlwdC9jb21wbGV0ZS1hbnQtY21kLnBsCisrKyBiL3NyYy9zY3JpcHQvY29tcGxldGUtYW50LWNtZC5wbApAQCAtNyw3ICs3LDcgQEAKICMgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICMgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvc2NyaXB0L2VudnNldC5jbWQgYi9zcmMvc2NyaXB0L2VudnNldC5jbWQKaW5kZXggM2IwNzQxOS4uODQ2Zjg1ZCAxMDA2NDQKLS0tIGEvc3JjL3NjcmlwdC9lbnZzZXQuY21kCisrKyBiL3NyYy9zY3JpcHQvZW52c2V0LmNtZApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9sY3AuYmF0IGIvc3JjL3NjcmlwdC9sY3AuYmF0CmluZGV4IDZhMWFjYmUuLjlhZDFiNzggMTAwNzU1Ci0tLSBhL3NyYy9zY3JpcHQvbGNwLmJhdAorKysgYi9zcmMvc2NyaXB0L2xjcC5iYXQKQEAgLTYsNyArNiw3IEBACiBSRU0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiBSRU0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiBSRU0KLVJFTSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorUkVNICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogUkVNCiBSRU0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIFJFTSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy9zY3JpcHQvcnVuYW50LnBsIGIvc3JjL3NjcmlwdC9ydW5hbnQucGwKaW5kZXggYjZjNzJlOS4uODFlZWU4ZSAxMDA2NDQKLS0tIGEvc3JjL3NjcmlwdC9ydW5hbnQucGwKKysrIGIvc3JjL3NjcmlwdC9ydW5hbnQucGwKQEAgLTcsNyArNyw3IEBACiAjICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogIyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAjCiAjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3NjcmlwdC9ydW5yYy5jbWQgYi9zcmMvc2NyaXB0L3J1bnJjLmNtZAppbmRleCBjMTdmZDBmLi40NzUyNWQyIDEwMDY0NAotLS0gYS9zcmMvc2NyaXB0L3J1bnJjLmNtZAorKysgYi9zcmMvc2NyaXB0L3J1bnJjLmNtZApAQCAtNiw3ICs2LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvYW50dW5pdC1iYXNlLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2FudHVuaXQtYmFzZS54bWwKaW5kZXggNGJkNDY0My4uMTMzNmYyYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvYW50dW5pdC1iYXNlLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9hbnR1bml0LWJhc2UueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSwxMCArMzEsNiBAQAogICAgIDxqYXZhdmVyc2lvbiBhdGxlYXN0PSIxMCIvPgogICA8L2NvbmRpdGlvbj4KICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0iamRrOSsiIGNsYXNzbmFtZT0iamF2YS5sYW5nLm1vZHVsZS5Nb2R1bGVEZXNjcmlwdG9yIi8+Ci0gIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuOCsiIGNsYXNzbmFtZT0iamF2YS5sYW5nLnJlZmxlY3QuRXhlY3V0YWJsZSIvPgotICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjcrIiBjbGFzc25hbWU9ImphdmEubmlvLmZpbGUuRmlsZVN5c3RlbSIvPgotICA8YXZhaWxhYmxlIHByb3BlcnR5PSJqZGsxLjYrIiBjbGFzc25hbWU9ImphdmEubmV0LkNvb2tpZVN0b3JlIi8+Ci0gIDxhdmFpbGFibGUgcHJvcGVydHk9ImpkazEuNSsiIGNsYXNzbmFtZT0iamF2YS5uZXQuUHJveHkiLz4KICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYnVpbGQuc3lzY2xhc3NwYXRoLm9ubHkiPgogICAgIDxlcXVhbHMgYXJnMT0iJHtidWlsZC5zeXNjbGFzc3BhdGh9IiBhcmcyPSJvbmx5Ii8+CiAgIDwvY29uZGl0aW9uPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvYnVnZml4ZXMvYnVnemlsbGEtNDMzMjQtc3RhY2tvdmVyZmxvdy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2J1Z2ZpeGVzL2J1Z3ppbGxhLTQzMzI0LXN0YWNrb3ZlcmZsb3ctdGVzdC54bWwKaW5kZXggZDcwNmI4Zi4uOWY3ZThhYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvYnVnZml4ZXMvYnVnemlsbGEtNDMzMjQtc3RhY2tvdmVyZmxvdy10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9idWdmaXhlcy9idWd6aWxsYS00MzMyNC1zdGFja292ZXJmbG93LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2FudC1hdHRyaWJ1dGUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2FudC1hdHRyaWJ1dGUtdGVzdC54bWwKaW5kZXggNmY2ZGM1MS4uODE3NzBmZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9hbnQtYXR0cmlidXRlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvYW50LWF0dHJpYnV0ZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9iaW5kdGFyZ2V0cy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvYmluZHRhcmdldHMtdGVzdC54bWwKaW5kZXggMDI3OWEyYy4uZGFmYzc5OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9iaW5kdGFyZ2V0cy10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2JpbmR0YXJnZXRzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2NsYXNzbG9hZGVyLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9jbGFzc2xvYWRlci10ZXN0LnhtbAppbmRleCA0YWYwMDQwLi4xZDIzZTU1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2NsYXNzbG9hZGVyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvY2xhc3Nsb2FkZXItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvY3JlYXRldGFzay10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvY3JlYXRldGFzay10ZXN0LnhtbAppbmRleCBiNjk2MzNiLi44ZTJmODcyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2NyZWF0ZXRhc2stdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9jcmVhdGV0YXNrLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2RpcnNjYW5uZXItc3ltbGlua3MtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2RpcnNjYW5uZXItc3ltbGlua3MtdGVzdC54bWwKaW5kZXggMDY0NTk0Ni4uOTM0ZDRlNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9kaXJzY2FubmVyLXN5bWxpbmtzLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvZGlyc2Nhbm5lci1zeW1saW5rcy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9leHRlbnNpb24tcG9pbnQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi1wb2ludC10ZXN0LnhtbAppbmRleCA4YzBkYmRiLi41ZmMzOThmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi1wb2ludC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi1wb2ludC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTA1LDcgKzEwNSw3IEBACiA8cHJvamVjdCBuYW1lPSJtYXN0ZXIiPgogICA8aW5jbHVkZSBmaWxlPSJjb21waWxlLWphdmEueG1sIiBhcz0iY29tcGlsZSIvPgogPC9wcm9qZWN0Pl1dPjwvZWNobz4KLSAgICA8IS0tIGhlcmUgcHJlZml4IHNob3VsZCBiZSBjb25jYXRlbmVkIGZyb20gZWFjaCBpbmNsdWRlIGZpcnN0IAorICAgIDwhLS0gaGVyZSBwcmVmaXggc2hvdWxkIGJlIGNvbmNhdGVuYXRlZCBmcm9tIGVhY2ggaW5jbHVkZSBmaXJzdAogICAgICAgICAgImNvbXBpbGUiIHRoZW4gImFic3RyYWN0LWNvbXBpbGUiLS0+CiAgICAgPGFudCBkaXI9IiR7b3V0cHV0fSIgdGFyZ2V0PSJjb21waWxlLmFic3RyYWN0LWNvbXBpbGUuY29tcGlsZSIvPgogICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJpbiBjb21waWxlIGphdmEiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvZXh0ZW5zaW9uL2luY2x1ZGUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi9pbmNsdWRlLXRlc3QueG1sCmluZGV4IDRkM2I2NzQuLjM1ODI3NTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvZXh0ZW5zaW9uL2luY2x1ZGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9leHRlbnNpb24vaW5jbHVkZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9leHRlbnNpb24vbW9kdWxlMS54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi9tb2R1bGUxLnhtbAppbmRleCAzYjYzMTJmLi43YzY1NDMwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi9tb2R1bGUxLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2V4dGVuc2lvbi9tb2R1bGUxLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9sb2NhdGlvbi54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL2xvY2F0aW9uLnhtbAppbmRleCBiZjM3ZDlmLi5lYTY4ZWIwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL2xvY2F0aW9uLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL2xvY2F0aW9uLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9zcmMvdGFzay9FY2hvTG9jYXRpb24uamF2YSBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvbG9jYXRpb24vc3JjL3Rhc2svRWNob0xvY2F0aW9uLmphdmEKaW5kZXggYTIwMzFlNi4uNGE0NTg2MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9sb2NhdGlvbi9zcmMvdGFzay9FY2hvTG9jYXRpb24uamF2YQorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL2xvY2F0aW9uL3NyYy90YXNrL0VjaG9Mb2NhdGlvbi5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL21hZ2ljLW5hbWVzLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9tYWdpYy1uYW1lcy10ZXN0LnhtbAppbmRleCA1NDY2MmRhLi4xOWFjMTVlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL21hZ2ljLW5hbWVzLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvbWFnaWMtbmFtZXMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvbmVzdGVkLWVsZW1lbnRzLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtZWxlbWVudHMtdGVzdC54bWwKaW5kZXggZTAzMWM0MS4uZGZiOTY3ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtZWxlbWVudHMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtZWxlbWVudHMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvbmVzdGVkLXRleHQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL25lc3RlZC10ZXh0LXRlc3QueG1sCmluZGV4IDA1ZmI0YzguLjNmZTBiZjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvbmVzdGVkLXRleHQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9uZXN0ZWQtdGV4dC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMtdGVzdC54bWwKaW5kZXggOWU5MDAwZC4uY2I2NTJlZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLWNyb3NzLWV4dGVuc2lvbi1yZWYueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy1leHRlbnNpb24tcmVmLnhtbAppbmRleCA2NzgzN2EwLi4xOWJiOWI0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLWNyb3NzLWV4dGVuc2lvbi1yZWYueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtZXh0ZW5zaW9uLXJlZi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtZXh0ZW5zaW9uLXJlZi54bWxyZWYgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLWNyb3NzLWV4dGVuc2lvbi1yZWYueG1scmVmCmluZGV4IGY4MWQzZGIuLjY2MGM3YTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtZXh0ZW5zaW9uLXJlZi54bWxyZWYKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy1leHRlbnNpb24tcmVmLnhtbHJlZgpAQCAtNSw3ICs1LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy1leHRlbnNpb24ueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy1leHRlbnNpb24ueG1sCmluZGV4IGY4ZjEyMjAuLjE0Mzc3ZDMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtZXh0ZW5zaW9uLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLWNyb3NzLWV4dGVuc2lvbi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtdGFyZ2V0cy1yZWYueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWwKaW5kZXggYzE2ZDk4OS4uNTM4MWFiMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtdGFyZ2V0cy1yZWYueG1scmVmIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWxyZWYKaW5kZXggZjgxZDNkYi4uNjYwYzdhNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWxyZWYKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLXJlZi54bWxyZWYKQEAgLTUsNyArNSw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtdGFyZ2V0cy54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLWNyb3NzLXRhcmdldHMueG1sCmluZGV4IGM0YzdjYTcuLjc3NDllMjUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtY3Jvc3MtdGFyZ2V0cy54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1jcm9zcy10YXJnZXRzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1jb21tb24ueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1jb21tb24ueG1sCmluZGV4IDI0M2RlOGMuLjQwMjA3N2EgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQtY29tbW9uLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0LWNvbW1vbi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQtY29tbW9ucmVmLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQtY29tbW9ucmVmLnhtbAppbmRleCAzOGI1MGFkLi41MWY1NjFiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0LWNvbW1vbnJlZi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1jb21tb25yZWYueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0LXJlZi54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0LXJlZi54bWwKaW5kZXggYzljMDJmZS4uZTg3NWRkZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1yZWYueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQtcmVmLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1yZWYueG1scmVmIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC1yZWYueG1scmVmCmluZGV4IGY4MWQzZGIuLjY2MGM3YTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQtcmVmLnhtbHJlZgorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0LXJlZi54bWxyZWYKQEAgLTUsNyArNSw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC54bWwKaW5kZXggNzkyZmI1Ni4uZjUxOGQzNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQyLXJlZi54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0Mi1yZWYueG1sCmluZGV4IGQzMmNmMTcuLmY3ODBiM2UgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQyLXJlZi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydDItcmVmLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydDItcmVmLnhtbHJlZiBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcHJvamVjdGhlbHBlcnMvYnVpbGQtbWFueS1pbXBvcnQyLXJlZi54bWxyZWYKaW5kZXggZjgxZDNkYi4uNjYwYzdhNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9wcm9qZWN0aGVscGVycy9idWlsZC1tYW55LWltcG9ydDItcmVmLnhtbHJlZgorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3Byb2plY3RoZWxwZXJzL2J1aWxkLW1hbnktaW1wb3J0Mi1yZWYueG1scmVmCkBAIC01LDcgKzUsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3JlZi1wcm9wZXJ0eWhlbHBlci10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXByb3BlcnR5aGVscGVyLXRlc3QueG1sCmluZGV4IGIzYmMzOWMuLmM2YjJmMTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXByb3BlcnR5aGVscGVyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXByb3BlcnR5aGVscGVyLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC05Nyw4ICs5Nyw4IEBACiAgICAgPGphdmFjIHNyY2Rpcj0iJHtpbnB1dH0iIGRlc3RkaXI9IiR7b3V0cHV0fSIvPgogICAgIDx0YXNrZGVmIG5hbWU9IngiIGNsYXNzbmFtZT0ib3JnLmV4YW1wbGUuVGFzayIKICAgICAgICAgICAgICBjbGFzc3BhdGg9IiR7b3V0cHV0fSIvPgotICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvIiBpZD0iYW50dXJsIi8+CisgICAgPHVybCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIiBpZD0iYW50dXJsIi8+CiAgICAgPHggYXR0cj0iJHthbnQucmVmaWQ6YW50dXJsfSIvPgotICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJVUkwgaXM6IGh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iLz4KKyAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iVVJMIGlzOiBodHRwczovL2FudC5hcGFjaGUub3JnLyIvPgogICA8L3RhcmdldD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXBzeW50YXgtaGludC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvcmVmLXBzeW50YXgtaGludC10ZXN0LnhtbAppbmRleCBkZTMyNDExLi5mZTQ5MmY1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3JlZi1wc3ludGF4LWhpbnQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS9yZWYtcHN5bnRheC1oaW50LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3RhcmdldC10ZXN0LWhlbHBlci54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3RhcmdldC10ZXN0LWhlbHBlci54bWwKaW5kZXggNmNhMjQ1Mi4uZDVkYzNhNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS90YXJnZXQtdGVzdC1oZWxwZXIueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdGFyZ2V0LXRlc3QtaGVscGVyLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS90YXJnZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3RhcmdldC10ZXN0LnhtbAppbmRleCAzZTY1NmJlLi4zNzVkYWViIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3RhcmdldC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3RhcmdldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9CYXNlVGFzay5qYXZhIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9CYXNlVGFzay5qYXZhCmluZGV4IDcwZWI3YTMuLjM3NWViNTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svQmFzZVRhc2suamF2YQorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL0Jhc2VUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNiwxMiArMjYsMTMgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIHRoZSB1dWVuY29kZS9kZWNvZGUgdGVzdCB0YXNrcy4KICAqLwogYWJzdHJhY3QgcHVibGljIGNsYXNzIEJhc2VUYXNrIGV4dGVuZHMgVGFzayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAgICAgcHJpdmF0ZSBGaWxlIGluRmlsZTsKICAgICBwcml2YXRlIEZpbGUgb3V0RmlsZTsKIApAQCAtNTQsOCArNTUsOCBAQAogICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRJbkZpbGUoKSkpOwotICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZ2V0T3V0RmlsZSgpKTsKKyAgICAgICAgICAgICAgICBGaWxlcy5uZXdJbnB1dFN0cmVhbShnZXRJbkZpbGUoKS50b1BhdGgoKSkpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gRmlsZXMubmV3T3V0cHV0U3RyZWFtKGdldE91dEZpbGUoKS50b1BhdGgoKSk7CiAgICAgICAgICAgICBkb2l0KGlucHV0U3RyZWFtLCBvdXRwdXRTdHJlYW0pOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihleCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL1VVRGVjb2RlVGFzay5qYXZhIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9VVURlY29kZVRhc2suamF2YQppbmRleCBkNzRiODQ2Li5jZDJmNGZlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL1VVRGVjb2RlVGFzay5qYXZhCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svVVVEZWNvZGVUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL1VVRW5jb2RlVGFzay5qYXZhIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS9zcmMvdGFzay9VVUVuY29kZVRhc2suamF2YQppbmRleCAyYjg3OGY4Li42YmQyNzBjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3NyYy90YXNrL1VVRW5jb2RlVGFzay5qYXZhCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvc3JjL3Rhc2svVVVFbmNvZGVUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3V1ZW5jb2RlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvY29yZS91dWVuY29kZS91dWVuY29kZS10ZXN0LnhtbAppbmRleCAyZDY4YWIwLi41NmRjYzViIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9jb3JlL3V1ZW5jb2RlL3V1ZW5jb2RlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2NvcmUvdXVlbmNvZGUvdXVlbmNvZGUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvZXhwYW5kcHJvcGVydGllcy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvZXhwYW5kcHJvcGVydGllcy10ZXN0LnhtbAppbmRleCA1ZGZmODMyLi44ZDk2OTJkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL2V4cGFuZHByb3BlcnRpZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9leHBhbmRwcm9wZXJ0aWVzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9uYXRpdmUyYXNjaWktdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL25hdGl2ZTJhc2NpaS10ZXN0LnhtbAppbmRleCAyNmZhMGM3Li4zNjQ5MzM1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL25hdGl2ZTJhc2NpaS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL25hdGl2ZTJhc2NpaS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvcmVwbGFjZXRva2Vucy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvcmVwbGFjZXRva2Vucy10ZXN0LnhtbAppbmRleCBjMWY5OGFiLi5kMTYwMDUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3JlcGxhY2V0b2tlbnMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9yZXBsYWNldG9rZW5zLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3NvcnQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3NvcnQtdGVzdC54bWwKaW5kZXggOGMyYTg4Yi4uYzE3YzI0YSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9zb3J0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvc29ydC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvc3RyaXBsaW5lY29tbWVudHMtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3N0cmlwbGluZWNvbW1lbnRzLXRlc3QueG1sCmluZGV4IDJhZjBmMDEuLmI5NmI0MzQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvc3RyaXBsaW5lY29tbWVudHMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9zdHJpcGxpbmVjb21tZW50cy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy9zdWZmaXgtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3N1ZmZpeC10ZXN0LnhtbAppbmRleCBhMGE5NDAzLi43NzM1MmRjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3N1ZmZpeC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3N1ZmZpeC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvdW5pcS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L2ZpbHRlcnMvdW5pcS10ZXN0LnhtbAppbmRleCA4MzJlYzk0Li4xYjEyZDA1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9maWx0ZXJzL3VuaXEtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvZmlsdGVycy91bmlxLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvanVuaXQtZnJhbWVzLnhzbCBiL3NyYy90ZXN0cy9hbnR1bml0L2p1bml0LWZyYW1lcy54c2wKaW5kZXggOWZhYjI4NS4uYmJiMGM3NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvanVuaXQtZnJhbWVzLnhzbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC9qdW5pdC1mcmFtZXMueHNsCkBAIC0xNSw3ICsxNSw3IEBACiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoraHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtNjk1LDcgKzY5NSw3IEBACiAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KICAgICA8dHI+CiAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvIj5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2FudC5hcGFjaGUub3JnLyI+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvIj5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8iPkFudDwvYT4uPC90ZD4KICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAgICAgPGhyIHNpemU9IjEiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L2p1bml0LW5vZnJhbWVzLnhzbCBiL3NyYy90ZXN0cy9hbnR1bml0L2p1bml0LW5vZnJhbWVzLnhzbAppbmRleCAyNTUwNDZhLi4yZjVlNGZiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC9qdW5pdC1ub2ZyYW1lcy54c2wKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvanVuaXQtbm9mcmFtZXMueHNsCkBAIC0xNCw3ICsxNCw3IEBACiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLWh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoraHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpAQCAtMzE4LDcgKzMxOCw3IEBACiAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIj4KICAgICA8dHI+CiAgICAgICAgIDx0ZCBhbGlnbj0ibGVmdCI+PC90ZD4KLSAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RGVzaWduZWQgZm9yIHVzZSB3aXRoIDxhIGhyZWY9J2h0dHA6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvJz5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cDovL2FudC5hcGFjaGUub3JnLyc+QW50PC9hPi48L3RkPgorICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij5EZXNpZ25lZCBmb3IgdXNlIHdpdGggPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9hbnRsaWJzL2FudHVuaXQvJz5BbnRVbml0PC9hPiBhbmQgPGEgaHJlZj0naHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy8nPkFudDwvYT4uPC90ZD4KICAgICA8L3RyPgogICAgIDwvdGFibGU+CiAgICAgPGhyIHNpemU9IjEiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Byb3BlcnR5aGVscGVycy54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC9wcm9wZXJ0eWhlbHBlcnMueG1sCmluZGV4IDI4N2YwMGMuLmU0NTViMTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Byb3BlcnR5aGVscGVycy54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvcHJvcGVydHloZWxwZXJzLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYW50LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYW50LXRlc3QueG1sCmluZGV4IGMzZWU1NmIuLjEzM2I4YmEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FudC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hbnQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FudGNhbGwtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hbnRjYWxsLXRlc3QueG1sCmluZGV4IDk3NjcxODUuLjQ1MmI3ODggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FudGNhbGwtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYW50Y2FsbC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0LXRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjI0MDAxLi4wMDAwMDAwCi0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC10ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IGRlZmF1bHQ9ImFudHVuaXQiIHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCI+Ci0gIDxpbXBvcnQgZmlsZT0iLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KLSAgPCEtLSBhcHQgdGVzdHMgLS0+Ci0KLSAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgbG9jYXRpb249ImFwdGJ1aWxkIiAvPgotICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIGxvY2F0aW9uPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIgLz4KLSAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMyLmRpciIgbG9jYXRpb249IiR7YnVpbGQuZGlyfS9jbGFzc2VzMiIgLz4KLSAgPHByb3BlcnR5IG5hbWU9InByZXByb2Nlc3MuZGlyIiBsb2NhdGlvbj0iJHtidWlsZC5kaXJ9L3NvdXJjZSIgLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYyIgbG9jYXRpb249ImFwdCIgLz4KLQotICA8cHJvcGVydHkgbmFtZT0iQXB0RXhhbXBsZS5jbGFzcyIgbG9jYXRpb249IiR7Y2xhc3Nlcy5kaXJ9L0FwdEV4YW1wbGUuY2xhc3MiIC8+Ci0KLSAgPG1hY3JvZGVmIG5hbWU9ImFzc2VydENvbXBpbGVkIj4KLSAgICA8YXR0cmlidXRlIG5hbWU9ImZpbGUiIC8+Ci0gICAgPHNlcXVlbnRpYWwgPgotICAgICAgPGZhaWwgIG1lc3NhZ2U9Im5vdCBmb3VuZDogQHtmaWxlfSI+Ci0gICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgIDxhdmFpbGFibGUgZmlsZT0iQHtmaWxlfSIgLz4KLSAgICAgICAgICA8L25vdD4KLSAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICA8L2ZhaWw+Ci0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi0gIDxtYWNyb2RlZiBuYW1lPSJhc3NlcnRQcm9jZXNzZWQiPgotICAgIDxzZXF1ZW50aWFsPgotICAgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkRpc3RyaWJ1dGVkQW5ub3RhdGlvblByb2Nlc3Nvci1pcy1nbyIvPgotICAgICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IlstQWJ1aWxkLmRpcj0iLz4KLSAgICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJ2aXNpdGluZyBEaXN0cmlidXRlZEFubm90YXRpb25GYWN0b3J5Ii8+Ci0gICAgPC9zZXF1ZW50aWFsPgotICA8L21hY3JvZGVmPgotCi0gIDxwcmVzZXRkZWYgbmFtZT0iYXNzZXJ0QXB0RXhhbXBsZUNvbXBpbGVkIj4KLSAgICA8YXNzZXJ0Q29tcGlsZWQgZmlsZT0iJHtBcHRFeGFtcGxlLmNsYXNzfSIvPgotICA8L3ByZXNldGRlZj4KLQotICA8dGFyZ2V0IG5hbWU9InRlYXJEb3duIiBkZXBlbmRzPSJhbnR1bml0LWJhc2UudGVhckRvd24iPgotICAgIDxkZWxldGUgZGlyPSIke2J1aWxkLmRpcn0iLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJzZXRVcCI+Ci0gICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMyLmRpcn0iLz4KLSAgICA8bWtkaXIgZGlyPSIke3ByZXByb2Nlc3MuZGlyfSIvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RBcHQiIGRlcGVuZHM9InNldFVwIiB1bmxlc3M9ImpkazEuOCsiPgotICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCi0gICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKLSAgICAgICAgIGRlYnVnPSJvbiIKLSAgICAgICAgIGNvbXBpbGU9InRydWUiCi0gICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+Ci0gICAgPC9hcHQ+Ci0gICAgPGFzc2VydEFwdEV4YW1wbGVDb21waWxlZCAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RBcHRGb3JrIiBkZXBlbmRzPSJzZXRVcCIgdW5sZXNzPSJqZGsxLjgrIj4KLSAgICA8YXB0IHNyY2Rpcj0iJHtzcmN9IgotICAgICAgICAgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iCi0gICAgICAgICBkZWJ1Zz0ib24iCi0gICAgICAgICBjb21waWxlPSJ0cnVlIgotICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgIHByZXByb2Nlc3NkaXI9IiR7cHJlcHJvY2Vzcy5kaXJ9Ij4KLSAgICA8L2FwdD4KLSAgICA8YXNzZXJ0QXB0RXhhbXBsZUNvbXBpbGVkIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdEFwdEZvcmtGYWxzZSIgZGVwZW5kcz0ic2V0VXAiIHVubGVzcz0iamRrMS44KyI+Ci0gICAgPGFwdCBzcmNkaXI9IiR7c3JjfSIKLSAgICAgICAgIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IgotICAgICAgICAgZGVidWc9Im9uIgotICAgICAgICAgY29tcGlsZT0idHJ1ZSIKLSAgICAgICAgIGZvcms9ImZhbHNlIgotICAgICAgICAgcHJlcHJvY2Vzc2Rpcj0iJHtwcmVwcm9jZXNzLmRpcn0iPgotICAgIDwvYXB0PgotICAgIDxhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQgLz4KLSAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iQXB0IG9ubHkgcnVucyBpbiBpdHMgb3duIEpWTTsgZm9yaz1mYWxzZSBvcHRpb24gaWdub3JlZCIvPgotCi0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdExpc3RBbm5vdGF0aW9uVHlwZXMiIGRlcGVuZHM9InNldFVwIiB1bmxlc3M9ImpkazEuOCsiPgotICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCi0gICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKLSAgICAgICAgIGRlYnVnPSJvbiIKLSAgICAgICAgIGNvbXBpbGU9InRydWUiCi0gICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+Ci0gICAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YTGlzdEFubm90YXRpb25UeXBlcyIgLz4KLSAgICAgICAgIDxjb21waWxlcmFyZyB2YWx1ZT0iLVhsaW50OmRlcHJlY2F0aW9uIiAvPiAKLSAgICA8L2FwdD4KLSAgCi0gICAgPGFzc2VydEFwdEV4YW1wbGVDb21waWxlZCAvPgotICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJTZXQgb2YgYW5ub3RhdGlvbnMgZm91bmQ6Ii8+Ci0gICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkRpc3RyaWJ1dGVkIi8+Ci0gIDwvdGFyZ2V0PgotCi0KLSAgPCEtLSB1c2UgdGhlIGZhY3Rvcnkgd2UgY29tcGlsZWQuIFRvIGF2b2lkIHRyb3VibGUKLSAgICB3ZSBkZWxpdmVyIGludG8gYSB2ZXJzaW9uIGluIGEgbmV3IGNsYXNzcGF0aCwgb3RoZXJ3aXNlCi0gICAgdGhlIGRlcGVuZGVuY3kgbG9naWMgd2lsbCBub3QgcnVuIEFwdC0tPgotICA8dGFyZ2V0IG5hbWU9InRlc3RBcHROZXdGYWN0b3J5IiBkZXBlbmRzPSJ0ZXN0QXB0IiB1bmxlc3M9ImpkazEuOCsiPgotICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCi0gICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMyLmRpcn0iCi0gICAgICAgICBkZWJ1Zz0ib24iCi0gICAgICAgICBjb21waWxlPSJ0cnVlIgotICAgICAgICAgZmFjdG9yeT0iRGlzdHJpYnV0ZWRBbm5vdGF0aW9uRmFjdG9yeSIKLSAgICAgICAgIHByZXByb2Nlc3NkaXI9IiR7cHJlcHJvY2Vzcy5kaXJ9Ij4KLSAgICAgICAgIDxmYWN0b3J5cGF0aCBwYXRoPSIke2NsYXNzZXMuZGlyfSIgLz4KLSAgICAgICAgIDxvcHRpb24gbmFtZT0iYnVpbGQuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9IiAvPgotICAgIDwvYXB0PgotICAgIDxhc3NlcnRBcHRFeGFtcGxlQ29tcGlsZWQgLz4KLSAgICA8YXNzZXJ0UHJvY2Vzc2VkIC8+Ci0gIDwvdGFyZ2V0PgotCi0gIDx0YXJnZXQgbmFtZT0idGVzdEFwdE5ld0ZhY3RvcnlGb3JrIiBkZXBlbmRzPSJ0ZXN0QXB0IiB1bmxlc3M9ImpkazEuOCsiPgotICAgIDxhcHQgc3JjZGlyPSIke3NyY30iCi0gICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMyLmRpcn0iCi0gICAgICAgICBkZWJ1Zz0ib24iCi0gICAgICAgICBjb21waWxlPSJ0cnVlIgotICAgICAgICAgZm9yaz0idHJ1ZSIKLSAgICAgICAgIGZhY3Rvcnk9IkRpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkiCi0gICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+Ci0gICAgICAgICA8ZmFjdG9yeXBhdGggcGF0aD0iJHtjbGFzc2VzLmRpcn0iIC8+Ci0gICAgICAgICA8b3B0aW9uIG5hbWU9ImJ1aWxkLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfSIgLz4KLSAgICA8L2FwdD4KLSAgICA8YXNzZXJ0QXB0RXhhbXBsZUNvbXBpbGVkIC8+Ci0gICAgPGFzc2VydFByb2Nlc3NlZCAvPgotICA8L3RhcmdldD4KLQotICA8dGFyZ2V0IG5hbWU9InRlc3RBcHRVbmRlckpESzE4IiBpZj0iamRrMS44KyI+Ci0gICAgPGF1OmV4cGVjdGZhaWx1cmUgZXhwZWN0ZWRNZXNzYWdlPSJhcHQgZG9lcyBub3QgZXhpc3QgdW5kZXIgSmF2YSAxLjggYW5kIGhpZ2hlciI+Ci0gICAgICA8YXB0IHNyY2Rpcj0iJHtzcmN9IgotICAgICAgICAgICBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIKLSAgICAgICAgICAgZGVidWc9Im9uIgotICAgICAgICAgICBjb21waWxlPSJ0cnVlIgotICAgICAgICAgICBmb3JrPSJ0cnVlIgotICAgICAgICAgICBwcmVwcm9jZXNzZGlyPSIke3ByZXByb2Nlc3MuZGlyfSI+Ci0gICAgICA8L2FwdD4KLSAgICA8L2F1OmV4cGVjdGZhaWx1cmU+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9EaXN0cmlidXRlZC5qYXZhIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYzM0NjcuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICovCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotCi0vKioKLSAqLwotQERvY3VtZW50ZWQKLUBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKLUBUYXJnZXQodmFsdWUgPSBFbGVtZW50VHlwZS5UWVBFKQotcHVibGljIEBpbnRlcmZhY2UgRGlzdHJpYnV0ZWQgIHsKLQotICAgIHB1YmxpYyBEaXN0cmlidXRpb25UeXBlcyBkaXN0cmlidXRpb24oKSBkZWZhdWx0IERpc3RyaWJ1dGlvblR5cGVzLkxPQ0FMOwotCi0gICAgcHVibGljIFN0cmluZyBwcm90b2NvbCgpIGRlZmF1bHQgIlJNSSI7Ci0KLSAgICBwdWJsaWMgZW51bSBEaXN0cmlidXRpb25UeXBlcyB7IFNJTkdMRVRPTiwgTE9DQUwsIEZBVUxUX1RPTEVSQU5ULCBGRURFUkFURUQsIE1PQklMRX07Ci0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkuamF2YSBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9EaXN0cmlidXRlZEFubm90YXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZmI2MzMuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckZhY3Rvcnk7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgY29tLnN1bi5taXJyb3IuYXB0LkFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLQotLyoqCi0gKiBUaGlzIHdhcyB0aGUgZmlyc3QgcGllY2Ugb2YgSmF2YTEuNSBjb2RlIGluIHRoZSBzb3VyY2UgdHJlZS4KLSAqIEBzaW5jZSAyMDA1MC0wMy0wOVQyMToyOToyNVoKLSAqLwotcHVibGljIGNsYXNzIERpc3RyaWJ1dGVkQW5ub3RhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yRmFjdG9yeSB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gc3VwcG9ydGVkQW5ub3RhdGlvbnMKLSAgICAgICAgICAgID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihBcnJheXMuYXNMaXN0KCIqIikpOwotCi0gICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBzdXBwb3J0ZWRPcHRpb25zKCkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHN1cHBvcnRlZEFubm90YXRpb25UeXBlcygpIHsKLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEFubm90YXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yIGdldFByb2Nlc3NvckZvcigKLSAgICAgICAgICAgIFNldDxjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uPiBhbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9ucywKLSAgICAgICAgICAgIEFubm90YXRpb25Qcm9jZXNzb3JFbnZpcm9ubWVudCBlbnYpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEaXN0cmlidXRlZEFubm90YXRpb25Qcm9jZXNzb3IoZW52KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NGZmN2YuLjAwMDAwMDAKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0Rpc3RyaWJ1dGVkQW5ub3RhdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotCi0vL2ZvdW5kIGluIHRvb2xzLmphciwgbm90IHRoZSBKUkUgcnVudGltZS4KLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvcjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5hcHQuQW5ub3RhdGlvblByb2Nlc3NvckVudmlyb25tZW50OwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLmRlY2xhcmF0aW9uLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBjb20uc3VuLm1pcnJvci5kZWNsYXJhdGlvbi5DbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IGNvbS5zdW4ubWlycm9yLnV0aWwuU2ltcGxlRGVjbGFyYXRpb25WaXNpdG9yOwotaW1wb3J0IHN0YXRpYyBjb20uc3VuLm1pcnJvci51dGlsLkRlY2xhcmF0aW9uVmlzaXRvcnMuKjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQW5ub3RhdGlvbiBwcm9jZXNzb3Igb3V0cHV0cyBzdHVmZgotICovCi0KLXB1YmxpYyBjbGFzcyBEaXN0cmlidXRlZEFubm90YXRpb25Qcm9jZXNzb3IgaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJvY2Vzc29yIHsKLQotICAgIHB1YmxpYyBBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52OwotCi0gICAgcHVibGljIERpc3RyaWJ1dGVkQW5ub3RhdGlvblByb2Nlc3NvcihBbm5vdGF0aW9uUHJvY2Vzc29yRW52aXJvbm1lbnQgZW52KSB7Ci0gICAgICAgIHRoaXMuZW52ID0gZW52OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVjaG8oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgZW52LmdldE1lc3NhZ2VyKCkucHJpbnROb3RpY2UodGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJvY2VzcygpIHsKLSAgICAgICAgZWNobygiRGlzdHJpYnV0ZWRBbm5vdGF0aW9uUHJvY2Vzc29yLWlzLWdvIik7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zPWVudi5nZXRPcHRpb25zKCk7Ci0gICAgICAgIGZvcihTdHJpbmcga2V5Om9wdGlvbnMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGVjaG8oIk9wdGlvbiBbIitrZXkrIl0gPSAiK29wdGlvbnMuZ2V0KGtleSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy93b3JrIHRpbWUKLSAgICAgICAgZm9yIChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2wgOiBlbnYuZ2V0U3BlY2lmaWVkVHlwZURlY2xhcmF0aW9ucygpKSB7Ci0gICAgICAgICAgICB0eXBlRGVjbC5hY2NlcHQoZ2V0RGVjbGFyYXRpb25TY2FubmVyKG5ldyBDbGFzc1Zpc2l0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgTk9fT1ApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgQ2xhc3NWaXNpdG9yIGV4dGVuZHMgU2ltcGxlRGVjbGFyYXRpb25WaXNpdG9yIHsKLSAgICAgICAgcHVibGljIHZvaWQgdmlzaXRDbGFzc0RlY2xhcmF0aW9uKENsYXNzRGVjbGFyYXRpb24gZCkgewotICAgICAgICAgICAgZWNobygidmlzaXRpbmcgIisgZC5nZXRRdWFsaWZpZWROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXVnbWVudC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2F1Z21lbnQtdGVzdC54bWwKaW5kZXggMmU2ZjMzNS4uODI4ZDk1ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXVnbWVudC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hdWdtZW50LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9idW56aXAyLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYnVuemlwMi10ZXN0LnhtbAppbmRleCBmY2YwNWQ5Li43NjE0OGQ5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9idW56aXAyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2J1bnppcDItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwLDkgKzMwLDkgQEAKIAogICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoTm9uRmlsZVJlc291cmNlVG9GaWxlIiBkZXBlbmRzPSJzZXR1cCI+CiAgICAgPGJ1bnppcDIgZGVzdD0iJHtvdXRwdXR9L2dyZWV0aW5nLnR4dCI+Ci0gICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvYnVuemlwMi9ncmVldGluZy50eHQuYnoyIi8+CisgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2J1bnppcDIvZ3JlZXRpbmcudHh0LmJ6MiIvPgogICAgIDwvYnVuemlwMj4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dCIKKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2d1bnppcC9ncmVldGluZy50eHQiCiAgICAgICAgICBkZXN0PSIke291dHB1dH0vb3JpZy5ncmVldGluZy50eHQiLz4KICAgICA8YXU6YXNzZXJ0RmlsZXNNYXRjaCBleHBlY3RlZD0iJHtvdXRwdXR9L29yaWcuZ3JlZXRpbmcudHh0IgogICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbD0iJHtvdXRwdXR9L2dyZWV0aW5nLnR4dCIvPgpAQCAtNDAsOSArNDAsOSBAQAogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFdpdGhOb25GaWxlUmVzb3VyY2VUb0RpciIgZGVwZW5kcz0ic2V0dXAiPgogICAgIDxidW56aXAyIGRlc3Q9IiR7b3V0cHV0fSI+Ci0gICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvYnVuemlwMi9ncmVldGluZy50eHQuYnoyIi8+CisgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2J1bnppcDIvZ3JlZXRpbmcudHh0LmJ6MiIvPgogICAgIDwvYnVuemlwMj4KLSAgICA8Z2V0IHNyYz0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dCIKKyAgICA8Z2V0IHNyYz0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2d1bnppcC9ncmVldGluZy50eHQiCiAgICAgICAgICBkZXN0PSIke291dHB1dH0vb3JpZy5ncmVldGluZy50eHQiLz4KICAgICA8YXU6YXNzZXJ0RmlsZXNNYXRjaCBleHBlY3RlZD0iJHtvdXRwdXR9L29yaWcuZ3JlZXRpbmcudHh0IgogICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbD0iJHtvdXRwdXR9L2dyZWV0aW5nLnR4dCIvPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY2hlY2tzdW0tdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jaGVja3N1bS10ZXN0LnhtbAppbmRleCA4MzQxZjQyLi5iNmM4MDU3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jaGVja3N1bS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jaGVja3N1bS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29tbWFuZGxhdW5jaGVyL2NvbW1hbmRsYXVuY2hlci10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbW1hbmRsYXVuY2hlci9jb21tYW5kbGF1bmNoZXItdGVzdC54bWwKaW5kZXggNDk1MTliZC4uMmM3NzBiYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29tbWFuZGxhdW5jaGVyL2NvbW1hbmRsYXVuY2hlci10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb21tYW5kbGF1bmNoZXIvY29tbWFuZGxhdW5jaGVyLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25jYXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25jYXQtdGVzdC54bWwKaW5kZXggNGIyODVlMy4uYzU5NmQ5MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uY2F0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmNhdC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2FudHZlcnNpb24tdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vYW50dmVyc2lvbi10ZXN0LnhtbAppbmRleCA4OWMyZDdlLi4yMzZmMGU3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vYW50dmVyc2lvbi10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vYW50dmVyc2lvbi10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2VxdWFscy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9lcXVhbHMtdGVzdC54bWwKaW5kZXggODg4OGQzOS4uYzQyM2M4MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2VxdWFscy10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vZXF1YWxzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vZmlsZXNtYXRjaC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9maWxlc21hdGNoLXRlc3QueG1sCmluZGV4IDY3ZTdjMDAuLjQ1Y2RmMDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9maWxlc21hdGNoLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9maWxlc21hdGNoLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vaGFzZnJlZXNwYWNlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2hhc2ZyZWVzcGFjZS10ZXN0LnhtbAppbmRleCAwMWYxODA5Li4wMTFiNjM2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vaGFzZnJlZXNwYWNlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9oYXNmcmVlc3BhY2UtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9oYXNtZXRob2QtdGV4dC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vaGFzbWV0aG9kLXRleHQueG1sCmluZGV4IDlhZTliMzIuLmRjZTYwNGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9oYXNtZXRob2QtdGV4dC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2hhc21ldGhvZC10ZXh0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2lzbGFzdG1vZGlmaWVkLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2lzbGFzdG1vZGlmaWVkLXRlc3QueG1sCmluZGV4IDQyOWUzZjguLjZhZDc1MjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9pc2xhc3Rtb2RpZmllZC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vaXNsYXN0bW9kaWZpZWQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9qYXZhdmVyc2lvbi10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9qYXZhdmVyc2lvbi10ZXN0LnhtbAppbmRleCA1ZjE1YTFlLi5hNWQ5YTIxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vamF2YXZlcnNpb24tdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL2phdmF2ZXJzaW9uLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vcmVzb3VyY2Vjb250YWlucy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWNvbnRhaW5zLXRlc3QueG1sCmluZGV4IDExYzZhOWUuLmIzNmM3ZjAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWNvbnRhaW5zLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWNvbnRhaW5zLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vcmVzb3VyY2VleGlzdHMtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb25kaXRpb24vcmVzb3VyY2VleGlzdHMtdGVzdC54bWwKaW5kZXggYmRmNDBjMi4uYjUwYTAwZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29uZGl0aW9uL3Jlc291cmNlZXhpc3RzLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvbmRpdGlvbi9yZXNvdXJjZWV4aXN0cy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzksNyArMzksNyBAQAogICA8dGFyZ2V0IG5hbWU9InRlc3RVUkwiPgogICAgIDxhdTphc3NlcnRUcnVlPgogICAgICAgPGNvbmQ6cmVzb3VyY2VleGlzdHM+Ci0gICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPgorICAgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+CiAgICAgICA8L2NvbmQ6cmVzb3VyY2VleGlzdHM+CiAgICAgPC9hdTphc3NlcnRUcnVlPgogICA8L3RhcmdldD4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvcHktdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9jb3B5LXRlc3QueG1sCmluZGV4IDFmZDRiNTkuLjE0YTRiZWMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2NvcHktdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY29weS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTg3LDcgKzE4Nyw3IEBACiAgICAgPGF1OmV4cGVjdGZhaWx1cmU+CiAgICAgICA8Y29weSB0b2Rpcj0iJHtvdXRwdXR9IiBmYWlsb25lcnJvcj0idHJ1ZSIgZmxhdHRlbj0idHJ1ZSI+CiAgICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgPHVybCB1cmw9Imh0dHA6Ly9pLWRvLW5vdC1leGlzdC8iLz4KKyAgICAgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9pLWRvLW5vdC1leGlzdC8iLz4KICAgICAgICAgPC9yZXNvdXJjZXM+CiAgICAgICA8L2NvcHk+CiAgICAgPC9hdTpleHBlY3RmYWlsdXJlPgpAQCAtMzEyLDEzICszMTIsMTAgQEAKICAgICA8bWtkaXIgZGlyPSIke2lucHV0fSIvPgogICAgIDx0b3VjaCBmaWxlPSIke291dHB1dH0vJHtmaWxlfSIvPgogICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUiCi0gICAgICAgICAgZGVwZW5kcz0iY3JlYXRlVGVzdGRpcixtYWtlRmlsZVVud3JpdGFibGUtVW5peCxtYWtlRmlsZVVud3JpdGFibGUtV2luZG93cyIvPgotICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlVW53cml0YWJsZS1Vbml4IiBpZD0idW5peCI+Ci0gICAgPGNobW9kIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9IiBwZXJtPSI0NDQiLz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ibWFrZUZpbGVVbndyaXRhYmxlLVdpbmRvd3MiIHVubGVzcz0idW5peCI+Ci0gICAgPGF0dHJpYiBmaWxlPSIke291dHB1dH0vJHtmaWxlfSIgcmVhZG9ubHk9InRydWUiLz4KKyAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUiIGRlcGVuZHM9ImNyZWF0ZVRlc3RkaXIiPgorICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI0NDQiIG5vblBvc2l4TW9kZT0idHJ5RG9zT3JGYWlsIj4KKyAgICAgIDxmaWxlIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0Q29weU92ZXJSZWFkT25seUZpbGUiIGRlcGVuZHM9Im1ha2VGaWxlVW53cml0YWJsZSI+CkBAIC00NTMsMTQgKzQ1MCw5IEBACiAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CiAgICAgPHRvdWNoIGZpbGU9IiR7aW5wdXR9L3NvbWVmaWxlIi8+CiAgICAgPHRvdWNoIGZpbGU9IiR7b3V0cHV0fS9zb21lZmlsZSIvPgotICAgIDxleGVjIGV4ZWN1dGFibGU9ImNobW9kIiBvc2ZhbWlseT0idW5peCI+Ci0gICAgICA8YXJnIHZhbHVlPSItdyIvPgotICAgICAgPGFyZyBmaWxlPSIke291dHB1dH0vc29tZWZpbGUiLz4KLSAgICA8L2V4ZWM+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iYXR0cmliIiBvc2ZhbWlseT0iZG9zIj4KLSAgICAgIDxhcmcgdmFsdWU9IityIi8+Ci0gICAgICA8YXJnIGZpbGU9IiR7b3V0cHV0fS9zb21lZmlsZSIvPgotICAgIDwvZXhlYz4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNDQ0IiBub25Qb3NpeE1vZGU9InRyeURvc09yRmFpbCI+CisgICAgICA8ZmlsZSBmaWxlPSIke291dHB1dH0vc29tZWZpbGUiLz4KKyAgICA8L3NldHBlcm1pc3Npb25zPgogICAgIDxhdTpleHBlY3RmYWlsdXJlPgogICAgICAgPGNvcHkgdG9kaXI9IiR7b3V0cHV0fSIgZmlsZT0iJHtpbnB1dH0vc29tZWZpbGUiCiAgICAgICAgICAgICBvdmVyd3JpdGU9InRydWUiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2N2cy9jdnMueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY3ZzL2N2cy54bWwKaW5kZXggNTY0ZTU4Ny4uNDNjNjI5MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY3ZzL2N2cy54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvY3ZzL2N2cy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlZmF1bHRleGNsdWRlcy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlZmF1bHRleGNsdWRlcy10ZXN0LnhtbAppbmRleCBjYmVhOTNjLi5kNGU0ZWJhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZWZhdWx0ZXhjbHVkZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVmYXVsdGV4Y2x1ZGVzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZWxldGUtYW5kLXN5bWxpbmtzLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVsZXRlLWFuZC1zeW1saW5rcy10ZXN0LnhtbAppbmRleCBhYzc4OTk0Li5mZmM0YThhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZWxldGUtYW5kLXN5bWxpbmtzLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlbGV0ZS1hbmQtc3ltbGlua3MtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlbGV0ZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlbGV0ZS10ZXN0LnhtbAppbmRleCA1NTRmMDhmLi44NmFlOGNkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZWxldGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVsZXRlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZXBlbmRzZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kZXBlbmRzZXQtdGVzdC54bWwKaW5kZXggNTUyNTI1OS4uMTMwMTQ0NCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGVwZW5kc2V0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2RlcGVuZHNldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGlybmFtZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2Rpcm5hbWUtdGVzdC54bWwKaW5kZXggNjBjYWFmMS4uYWZiOTQ0NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZGlybmFtZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9kaXJuYW1lLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lYXItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lYXItdGVzdC54bWwKaW5kZXggMjM5YzUwMS4uYWFhY2I3MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWFyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2Vhci10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWNoby10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2VjaG8tdGVzdC54bWwKaW5kZXggYmQxZmMwNS4uNzFiMjRhZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWNoby10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lY2hvLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lY2hveG1sLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZWNob3htbC10ZXN0LnhtbAppbmRleCBkNDYxZDNkLi5iN2EzZWNhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9lY2hveG1sLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2VjaG94bWwtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvYXBwbHktdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9leGVjL2FwcGx5LXRlc3QueG1sCmluZGV4IDFiNWE2NjEuLjhmMWMxNGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvYXBwbHktdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9hcHBseS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9leGVjLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9leGVjLXRlc3QueG1sCmluZGV4IDI1YjAwODguLmM5MWRiOWIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvZXhlYy10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9leGVjL2V4ZWMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvcGFycm90LnNoIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9wYXJyb3Quc2gKaW5kZXggYzA2NGMzOC4uYzJjMDg3YiAxMDA3NTUKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9wYXJyb3Quc2gKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZXhlYy9wYXJyb3Quc2gKQEAgLTYsNyArNiw3IEBACiAjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZmFpbC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ZhaWwtdGVzdC54bWwKaW5kZXggZDUyNWI3My4uYzBmNzNkYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZmFpbC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9mYWlsLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9nZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9nZXQtdGVzdC54bWwKaW5kZXggNDRkNWFmOS4uMjEzMzMyMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZ2V0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2dldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTcgKzE5LDE1IEBACiA8cHJvamVjdCBuYW1lPSJnZXQtdGVzdCIgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KICAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgogCi0gIDxwcm9wZXJ0eSBuYW1lPSJsb2NhdGlvbiIgdmFsdWU9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2dldHRlc3QiIC8+Ci0gIDxjb25kaXRpb24gcHJvcGVydHk9ImphdmEuYXRsZWFzdC4xXzgiPgotICAgICAgPGphdmF2ZXJzaW9uIGF0bGVhc3Q9IjEuOCIvPgotICA8L2NvbmRpdGlvbj4KKyAgPHByb3BlcnR5IG5hbWU9ImxvY2F0aW9uIiB2YWx1ZT0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2dldHRlc3QiIC8+CisgIDxwcm9wZXJ0eSBuYW1lPSJ1bnNlY3VyZWxvY2F0aW9uIiB2YWx1ZT0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ2V0dGVzdC9odHRwLXRvLWh0dHBzLnR4dCIgLz4KIAotCi0gICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgogICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIgLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0U2VlT3RoZXJSZWRpcmVjdCI+CisgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjUwIi8+CiAgICAgPGdldCAgc3JjPSIke2xvY2F0aW9ufS9vdGhlci50eHQiIGRlc3Q9IiR7b3V0cHV0fS9vdGhlci50bXAiLz4KICAgICAgIDxhdTphc3NlcnRUcnVlPgogICAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgpAQCAtNDMsNiArNDEsNyBAQAogICA8L3RhcmdldD4KICAgICAKICAgICA8dGFyZ2V0IG5hbWU9InRlc3RQZXJtYW5lbnRSZWRpcmVjdCI+CisgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSIyNTAiLz4KICAgICAgIDxnZXQgIHNyYz0iJHtsb2NhdGlvbn0vcGVybWFuZW50LnR4dCIgZGVzdD0iJHtvdXRwdXR9L3Blcm1hbmVudC50bXAiLz4KICAgICAgICAgPGF1OmFzc2VydFRydWU+CiAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgpAQCAtNTYsNiArNTUsNyBAQAogICAgIDwvdGFyZ2V0PgogICAgIAogICAgIDx0YXJnZXQgbmFtZT0idGVzdFRlbXBvcmFyeVJlZGlyZWN0Ij4KKyAgICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjI1MCIvPgogICAgICAgPGdldCAgc3JjPSIke2xvY2F0aW9ufS90ZW1wLnR4dCIgZGVzdD0iJHtvdXRwdXR9L3RlbXAudHh0Ii8+CiAgICAgICAgIDxhdTphc3NlcnRUcnVlPgogICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KQEAgLTY5LDYgKzY5LDcgQEAKICAgICA8L3RhcmdldD4KICAgICAKICAgICA8dGFyZ2V0IG5hbWU9InRlc3RTdGF0dXNDb2RlMzA3UmVkaXJlY3QiPgorICAgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjUwIi8+CiAgICAgICA8Z2V0ICBzcmM9IiR7bG9jYXRpb259LzMwNy50eHQiIGRlc3Q9IiR7b3V0cHV0fS8zMDcudHh0Ii8+CiAgICAgICAgIDxhdTphc3NlcnRUcnVlPgogICAgICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KQEAgLTgyLDYgKzgzLDcgQEAKICAgICA8L3RhcmdldD4KICAgICAKICAgICA8dGFyZ2V0IG5hbWU9InRlc3Q1TGV2ZWxzT2ZSZWRpcmVjdCI+CisgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSIyNTAiLz4KICAgICAgIDxnZXQgIHNyYz0iJHtsb2NhdGlvbn0vcmVkaXI1LnR4dCIgZGVzdD0iJHtvdXRwdXR9L3JlZGlyNS50bXAiLz4KICAgICAgICAgPGF1OmFzc2VydFRydWU+CiAgICAgICAgICAgPHJlc291cmNlY291bnQgY291bnQ9IjEiPgpAQCAtOTksMjIgKzEwMSwyNSBAQAogICAgIAogICAgIAogICAgIDx0YXJnZXQgbmFtZT0idGVzdEluZmluaXRlUmVkaXJlY3QiIHVubGVzcz0iamVua2lucyI+Ci0gICAgICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iTW9yZSB0aGFuIDI1IHRpbWVzIHJlZGlyZWN0ZWQsIGdpdmluZyB1cCI+CisgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSIyNTAiLz4KKyAgICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iTW9yZSB0aGFuIDI1IHRpbWVzIHJlZGlyZWN0ZWQsIGdpdmluZyB1cCI+CiAgICAgICA8Z2V0ICBzcmM9IiR7bG9jYXRpb259L2luZmluaXRlLnR4dCIgZGVzdD0iJHtvdXRwdXR9L2luZmluaXRlLnRtcCIvPgogICAgICAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CiAgICAgPC90YXJnZXQ+CiAKIAogICAgIDx0YXJnZXQgbmFtZT0idGVzdE5lc3RlZFJlc291cmNlcyI+CisgICAgICA8c2xlZXAgbWlsbGlzZWNvbmRzPSIyNTAiLz4KICAgICAgIDxnZXQgZGVzdD0iJHtvdXRwdXR9L2Rvd25sb2FkcyI+Ci0gICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIvPiAKLSAgICAgICAgPHVybCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCIvPgorICAgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+IAorICAgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9mYXEuaHRtbCIvPgogICAgICAgPC9nZXQ+CiAgICAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke291dHB1dH0vZG93bmxvYWRzL2luZGV4Lmh0bWwiLz4KICAgICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7b3V0cHV0fS9kb3dubG9hZHMvZmFxLmh0bWwiLz4KICAgICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9Ilh0ZXN0UmVsYXRpdmVSZWRpcmVjdCI+CisgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjUwIi8+CiAgICAgPGdldCAgc3JjPSIke2xvY2F0aW9ufS9sb2NhbC5jZ2kiIGRlc3Q9IiR7b3V0cHV0fS9vdGhlci50bXAiLz4KICAgICA8YXU6YXNzZXJ0VHJ1ZT4KICAgICAgIDxyZXNvdXJjZWNvdW50IGNvdW50PSIxIj4KQEAgLTEyOCw4ICsxMzMsOSBAQAogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3RIdHRwVG9IdHRwc1JlZGlyZWN0IiBkZXNjcmlwdGlvbj0iVGVzdHMgdGhhdCBhIHJlc291cmNlIHRoYXQncyByZWRpcmVjdGVkCi0gICAgICAgIGZyb20gSFRUUCB0byBIVFRQUyB3b3JrcyB3aXRob3V0IGFuIGVycm9yLiBTZWUgYnVnemlsbGEtNjI0OTkgZm9yIGRldGFpbHMiIGlmPSJqYXZhLmF0bGVhc3QuMV84Ij4KLSAgICA8Z2V0ICBzcmM9IiR7bG9jYXRpb259L2h0dHAtdG8taHR0cHMudHh0IiBkZXN0PSIke291dHB1dH0vaHR0cC10by1odHRwcy1yZWRpcmVjdC50bXAiLz4KKyAgICAgICAgZnJvbSBIVFRQIHRvIEhUVFBTIHdvcmtzIHdpdGhvdXQgYW4gZXJyb3IuIFNlZSBidWd6aWxsYS02MjQ5OSBmb3IgZGV0YWlscyI+CisgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjUwIi8+CisgICAgPGdldCAgc3JjPSIke3Vuc2VjdXJlbG9jYXRpb259IiBkZXN0PSIke291dHB1dH0vaHR0cC10by1odHRwcy1yZWRpcmVjdC50bXAiLz4KICAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIke291dHB1dH0vaHR0cC10by1odHRwcy1yZWRpcmVjdC50bXAiLz4KICAgICA8YXU6YXNzZXJ0VHJ1ZT4KICAgICAgIDxyZXNvdXJjZWNvbnRhaW5zIHJlc291cmNlPSIke291dHB1dH0vaHR0cC10by1odHRwcy1yZWRpcmVjdC50bXAiIHN1YnN0cmluZz0iaGVsbG8gd29ybGQiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2d1bnppcC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2d1bnppcC10ZXN0LnhtbAppbmRleCBlNjc4ZWIwLi4xOWNhMGNlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9ndW56aXAtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZ3VuemlwLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zOSwyMCArMzksMjIgQEAKICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aE5vbkZpbGVSZXNvdXJjZVRvRmlsZSIgZGVwZW5kcz0ic2V0dXAiPgorICAgIDxzbGVlcCBtaWxsaXNlY29uZHM9IjI1MCIvPgogICAgIDxndW56aXAgZGVzdD0iJHtvdXRwdXR9L2dyZWV0aW5nLnR4dCI+Ci0gICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dC5neiIvPgorICAgICAgPHVybCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC9ndW56aXAvZ3JlZXRpbmcudHh0Lmd6Ii8+CiAgICAgPC9ndW56aXA+Ci0gICAgPGdldCBzcmM9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2d1bnppcC9ncmVldGluZy50eHQiCisgICAgPGdldCBzcmM9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC9ndW56aXAvZ3JlZXRpbmcudHh0IgogICAgICAgICAgZGVzdD0iJHtvdXRwdXR9L29yaWcuZ3JlZXRpbmcudHh0Ii8+CiAgICAgPGF1OmFzc2VydEZpbGVzTWF0Y2ggZXhwZWN0ZWQ9IiR7b3V0cHV0fS9vcmlnLmdyZWV0aW5nLnR4dCIKICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9ncmVldGluZy50eHQiLz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aE5vbkZpbGVSZXNvdXJjZVRvRGlyIiBkZXBlbmRzPSJzZXR1cCI+CisgICAgPHNsZWVwIG1pbGxpc2Vjb25kcz0iMjUwIi8+CiAgICAgPGd1bnppcCBkZXN0PSIke291dHB1dH0iPgotICAgICAgPHVybCB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy93ZWJ0ZXN0L2d1bnppcC9ncmVldGluZy50eHQuZ3oiLz4KKyAgICAgIDx1cmwgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dC5neiIvPgogICAgIDwvZ3VuemlwPgotICAgIDxnZXQgc3JjPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC9ndW56aXAvZ3JlZXRpbmcudHh0IgorICAgIDxnZXQgc3JjPSJodHRwczovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dCIKICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9vcmlnLmdyZWV0aW5nLnR4dCIvPgogICAgIDxhdTphc3NlcnRGaWxlc01hdGNoIGV4cGVjdGVkPSIke291dHB1dH0vb3JpZy5ncmVldGluZy50eHQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsPSIke291dHB1dH0vZ3JlZXRpbmcudHh0Ii8+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9nemlwLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvZ3ppcC10ZXN0LnhtbAppbmRleCAzOGYwYTdhLi40NTA3NjJiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9nemlwLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2d6aXAtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2hvc3RpbmZvLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaG9zdGluZm8tdGVzdC54bWwKaW5kZXggYTA0NGI5Yi4uMWE0MjQwMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaG9zdGluZm8tdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaG9zdGluZm8tdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydC10ZXN0LnhtbAppbmRleCBmOWU0YjA1Li5lOWM4NGY3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbXBvcnQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbXBvcnQtdXJsLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0LXVybC10ZXN0LnhtbAppbmRleCAxMDNlY2UzLi43YTFmZjE3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbXBvcnQtdXJsLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydC11cmwtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL2EueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYS54bWwKaW5kZXggNjA4Mjk5MC4uMDgwNzI1YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYS54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL2IueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYi54bWwKaW5kZXggNTQ2YmFkZi4uOGY5NDE3MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL25lc3RlZC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbXBvcnR0ZXN0cy9uZXN0ZWQueG1sCmluZGV4IDI4ZDdhZDQuLjMwOWI2MTMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL25lc3RlZC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvbmVzdGVkLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvb3ZlcnJpZGUueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvb3ZlcnJpZGUueG1sCmluZGV4IDk3ZmQzMjAuLjhkNzczYTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL292ZXJyaWRlLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbXBvcnR0ZXN0cy9vdmVycmlkZS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL3cueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvdy54bWwKaW5kZXggZTQwMGM1MC4uOTExZTQyYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvdy54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvdy54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL3gueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveC54bWwKaW5kZXggYTUwOWU1Ny4uYWRmZjIwZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL3kueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveS54bWwKaW5kZXggMGU1NGZhOC4uOGJkNjI3MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveS54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMveS54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2ltcG9ydHRlc3RzL3oueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvei54bWwKaW5kZXggNjA3ZGVlNy4uNTA3MDBlYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvei54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW1wb3J0dGVzdHMvei54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2luY2x1ZGUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9pbmNsdWRlLXRlc3QueG1sCmluZGV4IDdlMWE0NTIuLmY4ZDUzMDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2luY2x1ZGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvaW5jbHVkZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamFyLXNwaS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phci1zcGktdGVzdC54bWwKaW5kZXggYzA1MzExYS4uYzI3Mjk3OCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamFyLXNwaS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXItc3BpLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXItdGVzdC54bWwKaW5kZXggYzJjODgzNC4uMmFlNTU3YSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamFyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phci10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQ5LDQgKzI0OSw4OSBAQAogICAgICAgICByZXNvdXJjZT0iJHtvdXRwdXR9L01FVEEtSU5GL01BTklGRVNULk1GIi8+CiAgIDwvdGFyZ2V0PgogCisgIDx0YXJnZXQgbmFtZT0ibXVsdGlSZWxlYXNlSmFyUGFydDEiIGRlc2NyaXB0aW9uPSJodHRwczovL29wZW5qZGsuamF2YS5uZXQvamVwcy8yMzgiPgorICAgIDwhLS0gUHJlcGFyYXRpb24gb2YgdGhlICdNdWx0aVJlbGVhc2UtUHJvamVjdCcgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmE4LnNyYyIgIHZhbHVlPSIke2lucHV0fS9zcmMvamF2YSIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhOS5zcmMiICB2YWx1ZT0iJHtpbnB1dH0vc3JjL2phdmE5Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmExMC5zcmMiIHZhbHVlPSIke2lucHV0fS9zcmMvamF2YTEwIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmE4LmNsYXNzZXMiICB2YWx1ZT0iJHtpbnB1dH0vYnVpbGQvY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXZhOS5jbGFzc2VzIiAgdmFsdWU9IiR7aW5wdXR9L2J1aWxkL2NsYXNzZXM5Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmExMC5jbGFzc2VzIiB2YWx1ZT0iJHtpbnB1dH0vYnVpbGQvY2xhc3NlczEwIi8+CisgICAgPG1hY3JvZGVmIG5hbWU9ImNyZWF0ZSI+CisgICAgICA8YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIC8+CisgICAgICA8c2VxdWVudGlhbD4KKyAgICAgICAgPGxvY2FsIG5hbWU9InNyYyIvPgorICAgICAgICA8bG9jYWwgbmFtZT0iY2xhc3NlcyIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iJHtqYXZhQHt2ZXJzaW9ufS5zcmN9Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iJHtqYXZhQHt2ZXJzaW9ufS5jbGFzc2VzfSIvPgorICAgICAgICA8bWtkaXIgZGlyPSIke3NyY30vb3JnL2FwYWNoZS9hbnQvdGVzdCIvPgorICAgICAgICA8ZWNobyBmaWxlPSIke3NyY30vb3JnL2FwYWNoZS9hbnQvdGVzdC9NUkphclRlc3QuamF2YSI+CisgICAgICAgICAgcGFja2FnZSBvcmcuYXBhY2hlLmFudC50ZXN0OworICAgICAgICAgIHB1YmxpYyBjbGFzcyBNUkphclRlc3QgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJKYXZhQHt2ZXJzaW9ufSI7CisgICAgICAgICAgfQorICAgICAgICA8L2VjaG8+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlc30iLz4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmN9IiBkZXN0ZGlyPSIke2NsYXNzZXN9IiBkZWJ1Zz0ib24iIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIvPgorICAgICAgPC9zZXF1ZW50aWFsPgorICAgIDwvbWFjcm9kZWY+CisgICAgPGNyZWF0ZSB2ZXJzaW9uPSI4Ii8+CisgICAgPGNyZWF0ZSB2ZXJzaW9uPSI5Ii8+CisgICAgPGNyZWF0ZSB2ZXJzaW9uPSIxMCIvPgorICAgIAorICAgIDwhLS0gTm93IGNyZWF0ZSB0aGUgTXVsdGlSZWxlYXNlSmFyIC0tPgorICAgIDxqYXIgZGVzdGZpbGU9IiR7YW50dW5pdC50bXBkaXJ9L21yamFyLmphciI+CisgICAgICA8bWFuaWZlc3Q+CisgICAgICAgIDwhLS0gc3BlY2lhbCBtZi1lbnRyeSBhY2NvcmRpbmcgdG8gdGhlIHNwZWMgLS0+CisgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTXVsdGktUmVsZWFzZSIgdmFsdWU9InRydWUiLz4KKyAgICAgIDwvbWFuaWZlc3Q+CisgICAgICA8IS0tIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIHRoZSBzcGVjIC4uLiAtLT4KKyAgICAgIDwhLS0gLi4uIGRlZmF1bHQgY2xhc3NlcyBsb2FkYWJsZSBieSBvbGQgKDxKYXZhOSkgdmVyc2lvbnMgLS0+CisgICAgICA8ZmlsZXNldCBkaXI9IiR7amF2YTguY2xhc3Nlc30iLz4KKyAgICAgIDwhLS0gLi4uIHBlciByZWxlYXNlIGNsYXNzZXMsIHJlcXVpcmUgSmF2YTkrIGZvciBsb2FkYWJsZSB2aWEgc3RhbmRhcmQgQ2xhc3NMb2FkZXIgLS0+CisgICAgICA8emlwZmlsZXNldCBwcmVmaXg9Ik1FVEEtSU5GL3ZlcnNpb25zLzkvIiBkaXI9IiR7amF2YTkuY2xhc3Nlc30iLz4KKyAgICAgIDx6aXBmaWxlc2V0IHByZWZpeD0iTUVUQS1JTkYvdmVyc2lvbnMvMTAvIiBkaXI9IiR7amF2YTEwLmNsYXNzZXN9Ii8+CisgICAgPC9qYXI+CisgICAgCisgICAgPCEtLSBOb3cgc29tZSB0ZXN0cyAtLT4KKyAgICA8YXU6YXNzZXJ0TmVzdGVkUmVzb3VyY2VFeGlzdHM+CisgICAgICA8emlwZW50cnkgemlwZmlsZT0iJHthbnR1bml0LnRtcGRpcn0vbXJqYXIuamFyIiBuYW1lPSJNRVRBLUlORi92ZXJzaW9ucy85L29yZy9hcGFjaGUvYW50L3Rlc3QvTVJKYXJUZXN0LmNsYXNzIi8+CisgICAgPC9hdTphc3NlcnROZXN0ZWRSZXNvdXJjZUV4aXN0cz4KKyAgICA8YXU6YXNzZXJ0TmVzdGVkUmVzb3VyY2VFeGlzdHM+CisgICAgICA8emlwZW50cnkgemlwZmlsZT0iJHthbnR1bml0LnRtcGRpcn0vbXJqYXIuamFyIiBuYW1lPSJNRVRBLUlORi92ZXJzaW9ucy8xMC9vcmcvYXBhY2hlL2FudC90ZXN0L01SSmFyVGVzdC5jbGFzcyIvPgorICAgIDwvYXU6YXNzZXJ0TmVzdGVkUmVzb3VyY2VFeGlzdHM+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpUmVsZWFzZUphciIgZGVwZW5kcz0ibXVsdGlSZWxlYXNlSmFyUGFydDEiCisgICAgICAgICAgdW5sZXNzPSJidWlsZC5zeXNjbGFzc3BhdGgub25seSIKKyAgICAgICAgICBkZXNjcmlwdGlvbj0ibW9zdCBvZiB0aGUgdGVzdHMgaGFwcGVuIGluICwgdGhpcyB0YXJnZXQgY29udGFpbnMgdGhlIHBhcnQgdGhhdCBjYW5ub3QgYmUgdGVzdGVkIGluc2lkIEd1bXAiPgorICAgIDxsb2FkcmVzb3VyY2UgcHJvcGVydHk9InZhbHVlRnJvbTgiPgorICAgICAgPGphdmFjb25zdGFudCBuYW1lPSJvcmcuYXBhY2hlLmFudC50ZXN0Lk1SSmFyVGVzdC5WRVJTSU9OIj4KKyAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICA8cGF0aGVsZW1lbnQgbG9jYXRpb249IiR7YW50dW5pdC50bXBkaXJ9L21yamFyLmphciIvPgorICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgIDwvamF2YWNvbnN0YW50PgorICAgIDwvbG9hZHJlc291cmNlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPG9yPgorICAgICAgICA8YW5kPgorICAgICAgICAgIDxub3Q+CisgICAgICAgICAgICA8amF2YXZlcnNpb24gYXRsZWFzdD0iOSIvPgorICAgICAgICAgIDwvbm90PgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iSmF2YTgiIGFyZzI9IiR7dmFsdWVGcm9tOH0iLz4KKyAgICAgICAgPC9hbmQ+CisKKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8amF2YXZlcnNpb24gZXhhY3RseT0iOSIvPgorICAgICAgICAgIDxlcXVhbHMgYXJnMT0iSmF2YTkiIGFyZzI9IiR7dmFsdWVGcm9tOH0iLz4KKyAgICAgICAgPC9hbmQ+CisKKyAgICAgICAgPGFuZD4KKyAgICAgICAgICA8amF2YXZlcnNpb24gYXRsZWFzdD0iMTAiLz4KKyAgICAgICAgICA8ZXF1YWxzIGFyZzE9IkphdmExMCIgYXJnMj0iJHt2YWx1ZUZyb204fSIvPgorICAgICAgICA8L2FuZD4KKyAgICAgIDwvb3I+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKwogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmEtdGVzdC54bWwKaW5kZXggZGI2NzMxNi4uYjI3NDg5ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy1kaXIvYmFkLXNyYy9CYWQuamF2YSBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9iYWQtc3JjL0JhZC5qYXZhCmluZGV4IDNiNzQ5ZjguLjg5Zjc5YzYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9iYWQtc3JjL0JhZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9iYWQtc3JjL0JhZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YWMtZGlyL2dvb2Qtc3JjL1NpbXBsZS5qYXZhIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YWMtZGlyL2dvb2Qtc3JjL1NpbXBsZS5qYXZhCmluZGV4IDljMDhmNTYuLmM4NjBiOTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLWRpci9nb29kLXNyYy9TaW1wbGUuamF2YQorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy1kaXIvZ29vZC1zcmMvU2ltcGxlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhYy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLXRlc3QueG1sCmluZGV4IDQ4ZWQxNWQuLmNkZDgzODIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFjLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMjQsMjggKzIyNCw3IEBACiAgICAgICA8bWtkaXIgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgogICAgIDwvc2VxdWVudGlhbD4KICAgICAKLSAgICA8c2VxdWVudGlhbCB1bmxlc3M6c2V0PSJqZGs5KyI+Ci0gICAgICA8ZWNobz5KREsgMS41KzwvZWNobz4KLSAgICAgIDx0ZXN0SmF2YWMgc291cmNlPSIxLjUiLz4KLSAgICAgIDxkZWxldGUgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgotICAgICAgPG1rZGlyIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KLSAgICA8L3NlcXVlbnRpYWw+Ci0gICAgCi0gICAgPHNlcXVlbnRpYWwgaWY6c2V0PSJqZGsxLjYrIj4KLSAgICAgIDxlY2hvPkpESyAxLjYrPC9lY2hvPgotICAgICAgPHRlc3RKYXZhYyBzb3VyY2U9IjEuNiIvPgotICAgICAgPGRlbGV0ZSBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+Ci0gICAgICA8bWtkaXIgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgotICAgIDwvc2VxdWVudGlhbD4KLSAgCQkKLSAgICA8c2VxdWVudGlhbCBpZjpzZXQ9ImpkazEuNysiPgotICAgICAgPGVjaG8+SkRLIDEuNys8L2VjaG8+Ci0gICAgICA8dGVzdEphdmFjIHNvdXJjZT0iMS43Ii8+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KLSAgICAgIDxta2RpciBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+Ci0gICAgPC9zZXF1ZW50aWFsPgotICAgIAotICAgIDxzZXF1ZW50aWFsIGlmOnNldD0iamRrMS44KyI+CisgICAgPHNlcXVlbnRpYWwgdW5sZXNzOnNldD0iamRrMS45KyI+CiAgICAgICA8ZWNobz5KREsgMS44KzwvZWNobz4KICAgICAgIDx0ZXN0SmF2YWMgc291cmNlPSIxLjgiLz4KICAgICAgIDxkZWxldGUgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgpAQCAtMjc0LDM0ICsyNTMsNiBAQAogICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KIAogICAgIDxzZXF1ZW50aWFsIHVubGVzczpzZXQ9ImpkazkrIj4KLSAgICAgIDxlY2hvPkpESyAxLjQrPC9lY2hvPgotICAgICAgPHRlc3RKYXZhYyBzb3VyY2U9IjEuNCIgdGFyZ2V0PSIxLjQiLz4KLSAgICAgIDxkZWxldGUgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgotICAgICAgPG1rZGlyIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KLSAgICA8L3NlcXVlbnRpYWw+Ci0KLSAgICA8c2VxdWVudGlhbCB1bmxlc3M6c2V0PSJqZGs5KyI+Ci0gICAgICA8ZWNobz5KREsgMS41KzwvZWNobz4KLSAgICAgIDx0ZXN0SmF2YWMgc291cmNlPSIxLjUiIHRhcmdldD0iMS41Ii8+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KLSAgICAgIDxta2RpciBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+Ci0gICAgPC9zZXF1ZW50aWFsPgotICAgIAotICAgIDxzZXF1ZW50aWFsIGlmOnNldD0iamRrMS42KyI+Ci0gICAgICA8ZWNobz5KREsgMS42KzwvZWNobz4KLSAgICAgIDx0ZXN0SmF2YWMgc291cmNlPSIxLjYiIHRhcmdldD0iMS42Ii8+Ci0gICAgICA8ZGVsZXRlIGRpcj0iJHtqYXZhYy1kaXJ9L2NsYXNzZXMiLz4KLSAgICAgIDxta2RpciBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+Ci0gICAgPC9zZXF1ZW50aWFsPgotICAgICAgICAKLSAgICA8c2VxdWVudGlhbCBpZjpzZXQ9ImpkazEuNysiPgotICAgICAgPGVjaG8+SkRLIDEuNys8L2VjaG8+Ci0gICAgICA8dGVzdEphdmFjIHNvdXJjZT0iMS43IiB0YXJnZXQ9IjEuNyIvPgotICAgICAgPGRlbGV0ZSBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+Ci0gICAgICA8bWtkaXIgZGlyPSIke2phdmFjLWRpcn0vY2xhc3NlcyIvPgotICAgIDwvc2VxdWVudGlhbD4KLSAgICAKLSAgICA8c2VxdWVudGlhbCBpZjpzZXQ9ImpkazEuOCsiPgogICAgICAgPGVjaG8+SkRLIDEuOCs8L2VjaG8+CiAgICAgICA8dGVzdEphdmFjIHNvdXJjZT0iMS44IiB0YXJnZXQ9IjEuOCIvPgogICAgICAgPGRlbGV0ZSBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+CkBAIC0zMjMsNyArMjc0LDcgQEAKICAgICA8L3NlcXVlbnRpYWw+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0idGVzdEphdmFjV2l0aE5hdGl2ZUhlYWRlckdlbmVyYXRpb24iIGlmPSJqZGsxLjgrIiBkZXBlbmRzPSJzZXR1cCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdEphdmFjV2l0aE5hdGl2ZUhlYWRlckdlbmVyYXRpb24iIGRlcGVuZHM9InNldHVwIj4KICAgICA8bWtkaXIgZGlyPSIke2phdmFjLWRpcn0vc3JjL29yZy9leGFtcGxlIiAvPgogICAgIDxta2RpciBkaXI9IiR7amF2YWMtZGlyfS9jbGFzc2VzIi8+CiAgICAgPG1rZGlyIGRpcj0iJHtqYXZhYy1kaXJ9L2hlYWRlcnMiLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFkb2MtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9qYXZhZG9jLXRlc3QueG1sCmluZGV4IDIwMDA4MmIuLmNhMmUxMjcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2phdmFkb2MtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvamF2YWRvYy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbGVuZ3RoLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbGVuZ3RoLXRlc3QueG1sCmluZGV4IGFjZDUzMTAuLmM2YmRmMzUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xlbmd0aC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sZW5ndGgtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvYWRwcm9wZXJ0aWVzLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbG9hZHByb3BlcnRpZXMtdGVzdC54bWwKaW5kZXggMDRiNTNmMS4uZjNhYzllOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbG9hZHByb3BlcnRpZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbG9hZHByb3BlcnRpZXMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvYWRyZXNvdXJjZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvYWRyZXNvdXJjZS10ZXN0LnhtbAppbmRleCA4MTRkZWQ1Li43YTkyZWM4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sb2FkcmVzb3VyY2UtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbG9hZHJlc291cmNlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9sb2NhbC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvY2FsLXRlc3QueG1sCmluZGV4IDljNGU3YjcuLmU4YWY5NDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvY2FsLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2xvY2FsLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tYWNyb2RlZi10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hY3JvZGVmLXRlc3QueG1sCmluZGV4IGIxMmU2ZjcuLmU0NTcyOWUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hY3JvZGVmLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hY3JvZGVmLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tYW5pZmVzdC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0LXRlc3QueG1sCmluZGV4IDQyNDdlZjIuLjkzM2U3N2YgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tYW5pZmVzdGNsYXNzcGF0aC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLXRlc3QueG1sCmluZGV4IDYxMjk5MGIuLjZmOWQ3ZDkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21hbmlmZXN0Y2xhc3NwYXRoLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tb3ZlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvbW92ZS10ZXN0LnhtbAppbmRleCA5YWNhYzc0Li4wMWM5ODA3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9tb3ZlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL21vdmUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTEzNCwxMyArMTM0LDEwIEBACiAgICAgPG1rZGlyIGRpcj0iJHtpbnB1dH0iLz4KICAgICA8dG91Y2ggZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iLz4KICAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ibWFrZUZpbGVVbndyaXRhYmxlIgotICAgICAgICAgIGRlcGVuZHM9ImNyZWF0ZVRlc3RkaXIsbWFrZUZpbGVVbndyaXRhYmxlLVVuaXgsbWFrZUZpbGVVbndyaXRhYmxlLVdpbmRvd3MiLz4KLSAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUtVW5peCIgaWQ9InVuaXgiPgotICAgIDxjaG1vZCBmaWxlPSIke291dHB1dH0vJHtmaWxlfSIgcGVybT0iNDQ0Ii8+Ci0gIDwvdGFyZ2V0PgotICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlVW53cml0YWJsZS1XaW5kb3dzIiB1bmxlc3M9InVuaXgiPgotICAgIDxhdHRyaWIgZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iIHJlYWRvbmx5PSJ0cnVlIi8+CisgIDx0YXJnZXQgbmFtZT0ibWFrZUZpbGVVbndyaXRhYmxlIiBkZXBlbmRzPSJjcmVhdGVUZXN0ZGlyIj4KKyAgICA8c2V0cGVybWlzc2lvbnMgbW9kZT0iNDQ0IiBub25Qb3NpeE1vZGU9InRyeURvc09yRmFpbCI+CisgICAgICA8ZmlsZSBmaWxlPSIke291dHB1dH0vJHtmaWxlfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdE1vdmVPdmVyUmVhZE9ubHlGaWxlIiBkZXBlbmRzPSJtYWtlRmlsZVVud3JpdGFibGUiPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvY2FiLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2NhYi54bWwKaW5kZXggNDkwOTEwNy4uYjEyNTE3ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvY2FiLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9jYWIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL2RlcGVuZC10ZXN0LnhtbAppbmRleCA0OGY5NGFhLi4wZDI5OTE1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9kZXBlbmQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2Z1bnRlc3QtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9mdW50ZXN0LXRlc3QueG1sCmluZGV4IDZiYWE0ZjcuLmI1YmJhNDkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2Z1bnRlc3QtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvZnVudGVzdC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC10ZXN0LnhtbAppbmRleCA4MmQ5MWM4Li43MmY0MmI5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvanVuaXQtZm9ybWF0dGVyLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvanVuaXQtZm9ybWF0dGVyLXRlc3QueG1sCmluZGV4IGI5YTYzYzkuLjljY2NkYmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LWZvcm1hdHRlci10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9qdW5pdC1mb3JtYXR0ZXItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LW91dHB1dHRvZm9ybWF0dGVycy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LW91dHB1dHRvZm9ybWF0dGVycy10ZXN0LnhtbAppbmRleCBjODRhZTQ5Li5jNTViMjc1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9qdW5pdC1vdXRwdXR0b2Zvcm1hdHRlcnMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvanVuaXQtb3V0cHV0dG9mb3JtYXR0ZXJzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9qdW5pdC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LXRlc3QueG1sCmluZGV4IGU2YWE3OTQuLjg3NmFmYjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L2p1bml0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMTcsMTAgKzMxNyw3IEBACiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFRlc3RNZXRob2RzIj4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJzb3VyY2UiIHZhbHVlPSI2Ij4KLSAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamRrMS42KyIvPgotICAgIDwvY29uZGl0aW9uPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UiIHZhbHVlPSI1Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9InNvdXJjZSIgdmFsdWU9IjgiLz4KICAgICA8ZWNobyBmaWxlPSIke2lucHV0fS9UMS5qYXZhIj5wdWJsaWMgY2xhc3MgVDEgZXh0ZW5kcwogCQkJanVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlIHsKIAkJCXB1YmxpYyB2b2lkIHRlc3RPSygpIHt9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9zcmMvRXhhbXBsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3NyYy9FeGFtcGxlVGVzdC5qYXZhCmluZGV4IGYxZTVjYTIuLmU1OTVmMDkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3NyYy9FeGFtcGxlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3NyYy9FeGFtcGxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC94bWxmb3JtYXR0ZXItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC94bWxmb3JtYXR0ZXItdGVzdC54bWwKaW5kZXggNGFhNmU0ZC4uNDYxNmE0MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQveG1sZm9ybWF0dGVyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L3htbGZvcm1hdHRlci10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvbmF0aXZlMmFzY2lpLXRlc3QueG1sCmluZGV4IDhlZmYzN2MuLjBiMzZlYjAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWktdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZS10ZXN0LnhtbAppbmRleCAwZWE3MDUxLi5mOGUxYThkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvcHJvcGVydHlmaWxlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGVsYXlvdXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9wcm9wZXJ0eWZpbGVsYXlvdXQtdGVzdC54bWwKaW5kZXggZjFiMzY3Zi4uOGYwZWZkMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvcHJvcGVydHlmaWxlbGF5b3V0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3Byb3BlcnR5ZmlsZWxheW91dC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3JlcGxhY2VyZWdleHAtdGVzdC54bWwKaW5kZXggMmQ2NGNlNy4uNDAyMWJjNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9yZXBsYWNlcmVnZXhwLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvc2NyaXB0ZGVmLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L3NjcmlwdGRlZi10ZXN0LnhtbAppbmRleCBkYTc4ZTQyLi5iNjA0YWEyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvc2NyaXB0ZGVmLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdC9zY3JpcHRkZWYtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvc3ltbGluay10ZXN0LnhtbAppbmRleCA5MGM1N2Y0Li5kZTJiZGVjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC91bml4L3N5bWxpbmstdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9zeW1saW5rLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC93aW5kb3dzL2F0dHJpYi10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3dpbmRvd3MvYXR0cmliLXRlc3QueG1sCmluZGV4IGQ1Y2VhMmIuLjA3ZDQxMzQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3dpbmRvd3MvYXR0cmliLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL29wdGlvbmFsL3dpbmRvd3MvYXR0cmliLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC94ei91bnh6LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwveHovdW54ei10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTI1MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwveHovdW54ei10ZXN0LnhtbApAQCAtMCwwICsxLDYzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgPHRhcmdldCBuYW1lPSJzZXR1cCI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieHoucHJlc2VudCIgY2xhc3NuYW1lPSJvcmcudHVrYWFuaS54ei5YWk91dHB1dFN0cmVhbSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoRmlsZVJlc291cmNlVG9GaWxlIiBkZXBlbmRzPSJzZXR1cCIgaWY9Inh6LnByZXNlbnQiPgorICAgIDx1bnh6IGRlc3Q9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYiPgorICAgICAgPGZpbGUgZmlsZT0iLi4vLi4vLi4vLi4vLi4vZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leHBlY3RlZC9hc2YtbG9nby5naWYueHoiLz4KKyAgICA8L3VueHo+CisgICAgPGF1OmFzc2VydEZpbGVzTWF0Y2ggZXhwZWN0ZWQ9Ii4uLy4uLy4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvYXNmLWxvZ28uZ2lmIgorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbD0iJHtvdXRwdXR9L2FzZi1sb2dvLmdpZiIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RXaXRoRmlsZVJlc291cmNlVG9EaXJlY3RvcnkiIGRlcGVuZHM9InNldHVwIiBpZj0ieHoucHJlc2VudCI+CisgICAgPHVueHogZGVzdD0iJHtvdXRwdXR9Ij4KKyAgICAgIDxmaWxlIGZpbGU9Ii4uLy4uLy4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnh6Ii8+CisgICAgPC91bnh6PgorICAgIDxhdTphc3NlcnRGaWxlc01hdGNoIGV4cGVjdGVkPSIuLi8uLi8uLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0V2l0aE5vbkZpbGVSZXNvdXJjZVRvRmlsZSIgZGVwZW5kcz0ic2V0dXAiIGlmPSJ4ei5wcmVzZW50Ij4KKyAgICA8dW54eiBkZXN0PSIke291dHB1dH0vZ3JlZXRpbmcudHh0Ij4KKyAgICAgIDx1cmwgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QveHovZ3JlZXRpbmcudHh0Lnh6Ii8+CisgICAgPC91bnh6PgorICAgIDxnZXQgc3JjPSJodHRwczovL2FudC5hcGFjaGUub3JnL3dlYnRlc3QvZ3VuemlwL2dyZWV0aW5nLnR4dCIKKyAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9vcmlnLmdyZWV0aW5nLnR4dCIvPgorICAgIDxhdTphc3NlcnRGaWxlc01hdGNoIGV4cGVjdGVkPSIke291dHB1dH0vb3JpZy5ncmVldGluZy50eHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsPSIke291dHB1dH0vZ3JlZXRpbmcudHh0Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFdpdGhOb25GaWxlUmVzb3VyY2VUb0RpciIgZGVwZW5kcz0ic2V0dXAiIGlmPSJ4ei5wcmVzZW50Ij4KKyAgICA8dW54eiBkZXN0PSIke291dHB1dH0iPgorICAgICAgPHVybCB1cmw9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC94ei9ncmVldGluZy50eHQueHoiLz4KKyAgICA8L3VueHo+CisgICAgPGdldCBzcmM9Imh0dHBzOi8vYW50LmFwYWNoZS5vcmcvd2VidGVzdC9ndW56aXAvZ3JlZXRpbmcudHh0IgorICAgICAgICAgZGVzdD0iJHtvdXRwdXR9L29yaWcuZ3JlZXRpbmcudHh0Ii8+CisgICAgPGF1OmFzc2VydEZpbGVzTWF0Y2ggZXhwZWN0ZWQ9IiR7b3V0cHV0fS9vcmlnLmdyZWV0aW5nLnR4dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9ncmVldGluZy50eHQiLz4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwveHoveHotdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9vcHRpb25hbC94ei94ei10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDZmNDZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvb3B0aW9uYWwveHoveHotdGVzdC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBkZWZhdWx0PSJhbnR1bml0IiB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiPgorCisgICAgPCEtLSBub3RlIHJlbGllcyBvbiBhbnR1bml0IDEuMSAtLT4KKyAgICA8aW1wb3J0IGZpbGU9Ii4uLy4uLy4uL2FudHVuaXQtYmFzZS54bWwiIC8+CisKKyAgICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9IiAvPgorICAgICAgICA8bWtkaXIgZGlyPSIke291dHB1dH0vZW1wdHkiIC8+CisgICAgICAgIDx0b3VjaCBmaWxlPSIke291dHB1dH0vZmlsZW9uZSIgLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9IiR7b3V0cHV0fS9maWxldHdvIiAvPgorICAgICAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4ei5wcmVzZW50IiBjbGFzc25hbWU9Im9yZy50dWthYW5pLnh6LlhaT3V0cHV0U3RyZWFtIi8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsTm9uZSIgaWY9Inh6LnByZXNlbnQiPgorICAgICAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZG1lc3NhZ2U9Ik5vIHJlc291cmNlIHNlbGVjdGVkLCB4eiBuZWVkcyBleGFjdGx5IG9uZSByZXNvdXJjZS4iIG1lc3NhZ2U9IlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24iPgorICAgICAgICAgICAgPHh6IGRlc3RmaWxlPSIke291dHB1dH0vZmlsZS5neiI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0vZW1wdHkiIC8+CisgICAgICAgICAgICA8L3h6PgorICAgICAgICA8L2F1OmV4cGVjdGZhaWx1cmU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGYWlsVHdvIiBpZj0ieHoucHJlc2VudCI+CisgICAgICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0ieHogY2Fubm90IGhhbmRsZSBtdWx0aXBsZSByZXNvdXJjZXMgYXQgb25jZS4gKDIgcmVzb3VyY2VzIHdlcmUgc2VsZWN0ZWQuKSIgbWVzc2FnZT0iU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiI+CisgICAgICAgICAgICA8eHogZGVzdGZpbGU9IiR7b3V0cHV0fS9maWxlLnh6Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7b3V0cHV0fSIgLz4KKyAgICAgICAgICAgIDwveHo+CisgICAgICAgIDwvYXU6ZXhwZWN0ZmFpbHVyZT4KKyAgICA8L3RhcmdldD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcGFyYWxsZWwtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXJhbGxlbC10ZXN0LnhtbAppbmRleCA3MmU0ODI4Li4xODQyMmFkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXJhbGxlbC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXJhbGxlbC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcGF0aGNvbnZlcnQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXRoY29udmVydC10ZXN0LnhtbAppbmRleCAzNjgzYWZmLi45MzZlMjU3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXRoY29udmVydC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wYXRoY29udmVydC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcHJvcGVydHktdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wcm9wZXJ0eS10ZXN0LnhtbAppbmRleCAyZWIwZTE4Li41OWYwMDBmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wcm9wZXJ0eS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wcm9wZXJ0eS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1NCw3ICsxNTQsNyBAQAogICA8IS0tIAogICBQcm9ibGVtcyB3aXRoIEAtc2lnbiBkaXNjdXNzZWQgb24gdGhlIG1haWxpbmdsaXN0LgogICBTZWVtcyB0byB3b3JrLgotICBodHRwOi8vbWFpbC1hcmNoaXZlcy5hcGFjaGUub3JnL21vZF9tYm94L2FudC11c2VyLzIwMTQxMi5tYm94LyUzQ0NBUHhqd1clMkJRS0ZGajQ1Ty1aYkNHT25Ba0pYZTlLSjVxS3RWUUN2UzJ4N2hPYlJKbWtRJTQwbWFpbC5nbWFpbC5jb20lM0UKKyAgaHR0cHM6Ly9tYWlsLWFyY2hpdmVzLmFwYWNoZS5vcmcvbW9kX21ib3gvYW50LXVzZXIvMjAxNDEyLm1ib3gvJTNDQ0FQeGp3VyUyQlFLRkZqNDVPLVpiQ0dPbkFrSlhlOUtKNXFLdFZRQ3ZTMng3aE9iUkpta1ElNDBtYWlsLmdtYWlsLmNvbSUzRQogICAtLT4KICAgPHRhcmdldCBuYW1lPSJ0ZXN0QXRTaWduIj4KICAgICA8bWtkaXIgZGlyPSIke2lucHV0fSIvPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcHJvcGVydHlmaWxlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcHJvcGVydHlmaWxlLXRlc3QueG1sCmluZGV4IGIwMmNmYTQuLmJkYTdjMmEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5ZmlsZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wcm9wZXJ0eWZpbGUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9wcm9wZXJ0eWhlbHBlci10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5aGVscGVyLXRlc3QueG1sCmluZGV4IGY4NjM0MmUuLjJlZWNiNGEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5aGVscGVyLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Byb3BlcnR5aGVscGVyLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9yZXBsYWNlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcmVwbGFjZS10ZXN0LnhtbAppbmRleCBlN2FhMTE4Li42MWQ5M2FkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9yZXBsYWNlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3JlcGxhY2UtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3JldHJ5LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcmV0cnktdGVzdC54bWwKaW5kZXggZTgxODUzYi4uZmM5OTUzNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcmV0cnktdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcmV0cnktdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDcgKzI2LDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9InRlc3QtZmFpbC1hbmQtcmV0cnkiIGRlcGVuZHM9InNldFVwIj4KICAgICA8IS0tIGp1c3QgaW4gY2FzZSB0aGlzIGV2ZXIgYmVjb21lcyBhIGxlZ2l0IHVybC4uLiAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0ic3JjIiB2YWx1ZT0iaHR0cDovL2lvamFzb2Rqb2phb3NkaiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMiIHZhbHVlPSJodHRwczovL2lvamFzb2Rqb2phb3NkaiIvPgogICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkbWVzc2FnZT0iVGFzayBbZ2V0XSBmYWlsZWQgYWZ0ZXIgWyR7aX1dIGF0dGVtcHRzOyBnaXZpbmcgdXAiPgogICAgICAgPHJldHJ5IHJldHJ5Y291bnQ9IiR7aX0iPgogICAgICAgICA8Z2V0IHNyYz0iJHtzcmN9IiBkZXN0PSIke2Rlc3R9Ii8+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9ybWljLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvcm1pYy10ZXN0LnhtbAppbmRleCAzZmRmNWE1Li41OGMzYzAwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9ybWljLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3JtaWMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3NlY3VyZS1pbnB1dC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zZWN1cmUtaW5wdXQueG1sCmluZGV4IDgzMTFjZTkuLjBlZjFmNzIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3NlY3VyZS1pbnB1dC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc2VjdXJlLWlucHV0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsNyArMjIsNyBAQAogICA8dGFyZ2V0IG5hbWU9InNldFVwIj4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJ0ZXN0LXNlY3VyZS1pbnB1dCIgaWY9ImpkazEuNisiPgorICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2VjdXJlLWlucHV0Ij4KICAgICA8aW5wdXQgbWVzc2FnZT0ic2VjdXJlLWlucHV0Oj4iIGFkZHByb3BlcnR5PSJ0aGUucGFzc3dvcmQiPgogICAgICAgPGhhbmRsZXIgY2xhc3NuYW1lPSJvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5TZWN1cmVJbnB1dEhhbmRsZXIiIC8+CiAgICAgPC9pbnB1dD4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3NldHBlcm1pc3Npb25zLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc2V0cGVybWlzc2lvbnMtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkOTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3NldHBlcm1pc3Npb25zLXRlc3QueG1sCkBAIC0wLDAgKzEsNjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYW50dW5pdCI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgorICAgIDxta2RpciBkaXI9IiR7aW5wdXR9Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9ImZpbGUiIGxvY2F0aW9uPSIke2lucHV0fS9maWxlIi8+CisgICAgPHRvdWNoIGZpbGU9IiR7ZmlsZX0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0UmVxdWlyZXNOZXN0ZWRSZXNvdXJjZXMiIGRlcGVuZHM9InNldFVwIj4KKyAgICA8YXU6ZXhwZWN0ZmFpbHVyZSBleHBlY3RlZE1lc3NhZ2U9IkF0IGxlYXN0IG9uZSByZXNvdXJjZS1jb2xsZWN0aW9uIGlzIHJlcXVpcmVkIj4KKyAgICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI2NDQiIC8+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RQZXJtaXNzaW9uc1NldFZpYVBlcm1pc3Npb25zQXR0cmlidXRlIgorICAgICAgICAgIGRlcGVuZHM9InNldFVwIj4KKyAgICA8c2V0cGVybWlzc2lvbnMgcGVybWlzc2lvbnM9Ik9XTkVSX1JFQUQsR1JPVVBfUkVBRCxPVEhFUlNfUkVBRCIKKyAgICAgICAgICAgICAgICAgICAgbm9uUG9zaXhNb2RlPSJ0cnlEb3NPckZhaWwiPgorICAgICAgPGZpbGUgZmlsZT0iJHtmaWxlfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CisgICAgPGF1OmFzc2VydEZhbHNlPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7ZmlsZX0iPgorICAgICAgICA8d3JpdGFibGUvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydEZhbHNlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7ZmlsZX0iPgorICAgICAgICA8cmVhZGFibGUvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFBlcm1pc3Npb25zU2V0VmlhTW9kZUF0dHJpYnV0ZSIKKyAgICAgICAgICBkZXBlbmRzPSJzZXRVcCI+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9IjQ0NCIgbm9uUG9zaXhNb2RlPSJ0cnlEb3NPckZhaWwiPgorICAgICAgPGZpbGUgZmlsZT0iJHtmaWxlfSIvPgorICAgIDwvc2V0cGVybWlzc2lvbnM+CisgICAgPGF1OmFzc2VydEZhbHNlPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7ZmlsZX0iPgorICAgICAgICA8d3JpdGFibGUvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydEZhbHNlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7ZmlsZX0iPgorICAgICAgICA8cmVhZGFibGUvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc2lnbmphci10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3NpZ25qYXItdGVzdC54bWwKaW5kZXggOGZmZjQ3OS4uYjExOGYzYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc2lnbmphci10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zaWduamFyLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zdWJhbnQtaGVscGVyL2VjaG8ueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc3ViYW50LWhlbHBlci9lY2hvLnhtbAppbmRleCAyNGY0NDVjLi45NTdkMGIyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zdWJhbnQtaGVscGVyL2VjaG8ueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N1YmFudC1oZWxwZXIvZWNoby54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N1YmFudC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N1YmFudC10ZXN0LnhtbAppbmRleCAzYmM0NDA1Li5kOWI5YzFlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zdWJhbnQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc3ViYW50LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zeW5jLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvc3luYy10ZXN0LnhtbAppbmRleCAyMWExNDQyLi41NGM4YjAwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9zeW5jLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3N5bmMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Rhci10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Rhci10ZXN0LnhtbAppbmRleCAxYWFjOWE4Li43OTY0NGIzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90YXItdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGFyLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw2ICsyNCw3IEBACiAgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgogICAgIDxta2RpciBkaXI9IiR7aW5wdXR9IiAvPgogICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIgLz4KKyAgICA8YXZhaWxhYmxlIHByb3BlcnR5PSJ4ei5wcmVzZW50IiBjbGFzc25hbWU9Im9yZy50dWthYW5pLnh6LlhaT3V0cHV0U3RyZWFtIi8+CiAgIDwvdGFyZ2V0PgogCiAgIDx0YXJnZXQgbmFtZT0idGVzdFRhckZpbGVzZXRIYW5kbGVzRmlsZXNldFJlZmVyZW5jZXMiIGRlcGVuZHM9InNldFVwIj4KQEAgLTExNSw0ICsxMTYsNDcgQEAKICAgICA8dW50YXIgZGVzdD0iJHtvdXRwdXR9IiBzcmM9IiR7b3V0cHV0fS94LnRhciIvPgogICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9IiR7b3V0cHV0fS8ke2xvbmdmaWxlLmZpbGUubmFtZX0iLz4KICAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0R3ppcENvbXByZXNzaW9uIiBkZXBlbmRzPSJzZXRVcCI+CisgICAgPGF1OmFzc2VydEZpbGVFeGlzdHMgZmlsZT0iLi4vLi4vLi4vZXRjL3Rlc3RjYXNlcy9hc2YtbG9nby5naWYiLz4KKyAgICA8dGFyIGRlc3RmaWxlPSIke2lucHV0fS9hc2YtbG9nby5naWYudGFyLmd6IiBjb21wcmVzc2lvbj0iZ3ppcCI+CisgICAgICA8ZmlsZSBmaWxlPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIvPgorICAgIDwvdGFyPgorICAgIDxndW56aXAgZGVzdD0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhciI+CisgICAgICA8ZmlsZSBmaWxlPSIke2lucHV0fS9hc2YtbG9nby5naWYudGFyLmd6Ii8+CisgICAgPC9ndW56aXA+CisgICAgPHVudGFyIHNyYz0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhciIgZGVzdD0iJHtvdXRwdXR9Ii8+CisgICAgPGF1OmFzc2VydEZpbGVzTWF0Y2gKKyAgICAgICAgZXhwZWN0ZWQ9Ii4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvYXNmLWxvZ28uZ2lmIgorICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QnppcDJDb21wcmVzc2lvbiIgZGVwZW5kcz0ic2V0VXAiPgorICAgIDxhdTphc3NlcnRGaWxlRXhpc3RzIGZpbGU9Ii4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvYXNmLWxvZ28uZ2lmIi8+CisgICAgPHRhciBkZXN0ZmlsZT0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhci5iejIiIGNvbXByZXNzaW9uPSJiemlwMiI+CisgICAgICA8ZmlsZSBmaWxlPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIvPgorICAgIDwvdGFyPgorICAgIDxidW56aXAyIGRlc3Q9IiR7aW5wdXR9L2FzZi1sb2dvLmdpZi50YXIiPgorICAgICAgPGZpbGUgZmlsZT0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhci5iejIiLz4KKyAgICA8L2J1bnppcDI+CisgICAgPHVudGFyIHNyYz0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhciIgZGVzdD0iJHtvdXRwdXR9Ii8+CisgICAgPGF1OmFzc2VydEZpbGVzTWF0Y2gKKyAgICAgICAgZXhwZWN0ZWQ9Ii4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvYXNmLWxvZ28uZ2lmIgorICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WHpDb21wcmVzc2lvbiIgZGVwZW5kcz0ic2V0VXAiIGlmPSJ4ei5wcmVzZW50Ij4KKyAgICA8YXU6YXNzZXJ0RmlsZUV4aXN0cyBmaWxlPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIvPgorICAgIDx0YXIgZGVzdGZpbGU9IiR7aW5wdXR9L2FzZi1sb2dvLmdpZi50YXIueHoiIGNvbXByZXNzaW9uPSJ4eiI+CisgICAgICA8ZmlsZSBmaWxlPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIvPgorICAgIDwvdGFyPgorICAgIDx1bnh6IGRlc3Q9IiR7aW5wdXR9L2FzZi1sb2dvLmdpZi50YXIiPgorICAgICAgPGZpbGUgZmlsZT0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhci54eiIvPgorICAgIDwvdW54ej4KKyAgICA8dW50YXIgc3JjPSIke2lucHV0fS9hc2YtbG9nby5naWYudGFyIiBkZXN0PSIke291dHB1dH0iLz4KKyAgICA8YXU6YXNzZXJ0RmlsZXNNYXRjaAorICAgICAgICBleHBlY3RlZD0iLi4vLi4vLi4vZXRjL3Rlc3RjYXNlcy9hc2YtbG9nby5naWYiCisgICAgICAgIGFjdHVhbD0iJHtvdXRwdXR9L2FzZi1sb2dvLmdpZiIvPgorICA8L3RhcmdldD4KKwogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGFza2RlZi1hbnRsaWItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90YXNrZGVmLWFudGxpYi10ZXN0LnhtbAppbmRleCBiMDM5MTFlLi41MjYxZTUxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90YXNrZGVmLWFudGxpYi10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90YXNrZGVmLWFudGxpYi10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOSArMTgsNyBAQAogPHByb2plY3QgZGVmYXVsdD0iYW50dW5pdCIgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KICAgICA8aW1wb3J0IGZpbGU9Ii4uL2FudHVuaXQtYmFzZS54bWwiIC8+CiAKLSAgICA8IS0tIEphdmE1IGhhcyBzb21lIHRyb3VibGUgd2l0aCB0aGUgcmVjdXJzaXZlIEFudGxpYiBsb29rdXAgLS0+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9InNldFVwIiBpZj0iamRrMS42KyI+CisgICAgPHRhcmdldCBuYW1lPSJzZXRVcCI+CiAgICAgICAgIDxta2RpciBkaXI9IiR7aW5wdXR9L29yZy9leGFtcGxlIiAvPgogICAgICAgICA8cHJvcGVydHkgbmFtZT0idG1wZGlyIiBsb2NhdGlvbj0iLi4vLi4vLi4vLi4vYnVpbGQvYW50dW5pdC90YXNrZGVmIiAvPgogICAgICAgICA8bWtkaXIgZGlyPSIke3RtcGRpcn0iIC8+CkBAIC00NiwxNCArNDQsMTQgQEAKICAgICAgICAgPHNsZWVwIHNlY29uZHM9IjEiLz4KICAgICA8L3RhcmdldD4KIAotICAgIDx0YXJnZXQgbmFtZT0idGVzdEFudGxpYiIgZGVwZW5kcz0ic2V0VXAiIGlmPSJqZGsxLjYrIj4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RBbnRsaWIiIGRlcGVuZHM9InNldFVwIj4KICAgICAgICAgPHRhc2tkZWYgY2xhc3NwYXRoPSIke3Rlc3QuamFyfSIgdXJpPSJhbnRsaWI6b3JnLmV4YW1wbGUiCiAgICAgICAgICAgICAgICAgIGxvYWRlcnJlZj0ibG9hZGVyMSIvPgogICAgICAgICA8ZWNob29vbyB4bWxucz0iYW50bGliOm9yZy5leGFtcGxlIiBtZXNzYWdlPSJleGVtcGxlIiAvPgogICAgICAgICA8YXU6YXNzZXJ0TG9nQ29udGFpbnMgdGV4dD0iZXhlbXBsZWV4ZW1wbGVleGVtcGxlZXhlbXBsZSIgLz4KICAgICA8L3RhcmdldD4KIAotICAgIDx0YXJnZXQgbmFtZT0idGVzdFVSSSIgZGVwZW5kcz0ic2V0VXAiIGlmPSJqZGsxLjYrIj4KKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RVUkkiIGRlcGVuZHM9InNldFVwIj4KICAgICAgICAgPHRhc2tkZWYgY2xhc3NwYXRoPSIke3Rlc3QuamFyfSIgdXJpPSJ1cm46bXk6ZXhlbXBsZSIKICAgICAgICAgICAgICAgICAgbG9hZGVycmVmPSJsb2FkZXIyIgogICAgICAgICAgICAgICAgICByZXNvdXJjZT0ib3JnL2V4YW1wbGUvYW50bGliLnhtbCIgLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Rhc2tkZWYtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90YXNrZGVmLXRlc3QueG1sCmluZGV4IDAyNDQyNzAuLmFlYjM1ODcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3Rhc2tkZWYtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGFza2RlZi10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNDEsNyArNDEsNyBAQAogICAgIDxhdTphc3NlcnRMb2dDb250YWlucyB0ZXh0PSJIZWxsbyIvPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9InRlc3REaXJXaXRoUGxpbmciIGRlcGVuZHM9InNldFVwIiBpZj0iamRrMS42KyIKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RGlyV2l0aFBsaW5nIiBkZXBlbmRzPSJzZXRVcCIKICAgICAgICAgICBkZXNjcmlwdGlvbj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTAwMDciPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJkaXIiIGxvY2F0aW9uPSIke3RtcGRpcn0vcGwhbmciLz4KICAgICA8bWtkaXIgZGlyPSIke2Rpcn0iLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RlbXBmaWxlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGVtcGZpbGUtdGVzdC54bWwKaW5kZXggMTEzMjAwNy4uNDJiY2VjYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGVtcGZpbGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdGVtcGZpbGUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RvdWNoLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdG91Y2gtdGVzdC54bWwKaW5kZXggYTkzMjdlZC4uOGFiZGYzNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdG91Y2gtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdG91Y2gtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RydW5jYXRlL3RydW5jYXRlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdHJ1bmNhdGUvdHJ1bmNhdGUtdGVzdC54bWwKaW5kZXggODZmODk2Yy4uMjA5ZWFiYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdHJ1bmNhdGUvdHJ1bmNhdGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdHJ1bmNhdGUvdHJ1bmNhdGUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RzdGFtcC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3RzdGFtcC10ZXN0LnhtbAppbmRleCBjOWJlYmY4Li5lYzdlMmQ2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy90c3RhbXAtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdHN0YW1wLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw0ICsyNCwyMSBAQAogICAgIDx0c3RhbXAvPgogICAgIDxhdTphc3NlcnRQcm9wZXJ0eUVxdWFscyBuYW1lPSJEU1RBTVAiIHZhbHVlPSIxOTcwMDEwMiIvPgogICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RNYWdpY1Byb3BlcnR5SXNvIj4KKyAgICA8bG9jYWwgbmFtZT0iYW50LnRzdGFtcC5ub3cuaXNvIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC50c3RhbXAubm93LmlzbyIgdmFsdWU9IjE5NzItMDQtMTdUMDg6MDc6MDBaIi8+CisgICAgPHRzdGFtcC8+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9IkRTVEFNUCIgdmFsdWU9IjE5NzIwNDE3Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdE1hZ2ljUHJvcGVydHlCb3RoIj4KKyAgICA8bG9jYWwgbmFtZT0iYW50LnRzdGFtcC5ub3ciLz4KKyAgICA8bG9jYWwgbmFtZT0iYW50LnRzdGFtcC5ub3cuaXNvIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC50c3RhbXAubm93IiB2YWx1ZT0iMTAwMDAwIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImFudC50c3RhbXAubm93LmlzbyIgdmFsdWU9IjE5NzItMDQtMTdUMDg6MDc6MjJaIi8+CisgICAgPHRzdGFtcC8+CisgICAgPCEtLSAnaXNvJyBvdmVycmlkZXMgJ3NpbXBsZScgLS0+CisgICAgPGF1OmFzc2VydFByb3BlcnR5RXF1YWxzIG5hbWU9IkRTVEFNUCIgdmFsdWU9IjE5NzIwNDE3Ii8+CisgIDwvdGFyZ2V0PgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdW50YXItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91bnRhci10ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM1NDFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdW50YXItdGVzdC54bWwKQEAgLTAsMCArMSw2MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cHJvamVjdCBuYW1lPSJ1bnRhci10ZXN0IiBkZWZhdWx0PSJhbnR1bml0IgorICAgICAgICAgeG1sbnM6YXU9ImFudGxpYjpvcmcuYXBhY2hlLmFudC5hbnR1bml0Ij4KKyAgPGltcG9ydCBmaWxlPSIuLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0VXAiPgorICAgIDxta2RpciBkaXI9IiR7aW5wdXR9Ii8+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9L2V4cGVjdGVkIiAvPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fS9hY3R1YWwiIC8+CisgICAgPGF2YWlsYWJsZSBwcm9wZXJ0eT0ieHoucHJlc2VudCIgY2xhc3NuYW1lPSJvcmcudHVrYWFuaS54ei5YWk91dHB1dFN0cmVhbSIvPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RHemlwQ29tcHJlc3Npb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8dW50YXIgc3JjPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIiCisgICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9leHBlY3RlZCIvPgorICAgIDx1bnRhciBzcmM9Ii4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhci5neiIKKyAgICAgICAgICAgY29tcHJlc3Npb249Imd6aXAiCisgICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9hY3R1YWwiLz4KKyAgICA8YXU6YXNzZXJ0RmlsZXNNYXRjaCBleHBlY3RlZD0iJHtvdXRwdXR9L2V4cGVjdGVkL2FzZi1sb2dvLmdpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hY3R1YWwvYXNmLWxvZ28uZ2lmIi8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEJ6aXAyQ29tcHJlc3Npb24iIGRlcGVuZHM9InNldFVwIj4KKyAgICA8dW50YXIgc3JjPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIiCisgICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9leHBlY3RlZCIvPgorICAgIDx1bnRhciBzcmM9Ii4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnRhci5iejIiCisgICAgICAgICAgIGNvbXByZXNzaW9uPSJiemlwMiIKKyAgICAgICAgICAgZGVzdD0iJHtvdXRwdXR9L2FjdHVhbCIvPgorICAgIDxhdTphc3NlcnRGaWxlc01hdGNoIGV4cGVjdGVkPSIke291dHB1dH0vZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmIgorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbD0iJHtvdXRwdXR9L2FjdHVhbC9hc2YtbG9nby5naWYiLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0WFpDb21wcmVzc2lvbiIgZGVwZW5kcz0ic2V0VXAiIGlmPSJ4ei5wcmVzZW50Ij4KKyAgICA8dW50YXIgc3JjPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIiCisgICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9leHBlY3RlZCIvPgorICAgIDx4eiBkZXN0ZmlsZT0iJHtpbnB1dH0vYXNmLWxvZ28uZ2lmLnRhci54eiIKKyAgICAgICAgc3JjPSIuLi8uLi8uLi9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkL2FzZi1sb2dvLmdpZi50YXIiLz4KKyAgICA8dW50YXIgc3JjPSIke2lucHV0fS9hc2YtbG9nby5naWYudGFyLnh6IgorICAgICAgICAgICBjb21wcmVzc2lvbj0ieHoiCisgICAgICAgICAgIGRlc3Q9IiR7b3V0cHV0fS9hY3R1YWwiLz4KKyAgICA8YXU6YXNzZXJ0RmlsZXNNYXRjaCBleHBlY3RlZD0iJHtvdXRwdXR9L2V4cGVjdGVkL2FzZi1sb2dvLmdpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hY3R1YWwvYXNmLWxvZ28uZ2lmIi8+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdW56aXAtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91bnppcC10ZXN0LnhtbAppbmRleCBiZGY1ZjYxLi5lM2VkNDM2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91bnppcC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91bnppcC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvdXB0b2RhdGUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91cHRvZGF0ZS10ZXN0LnhtbAppbmRleCBlNDc3ODAzLi5mY2M4YjkzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91cHRvZGF0ZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy91cHRvZGF0ZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2FyLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2FyLXRlc3QueG1sCmluZGV4IGUyNjRlYmQuLjc4YmE1N2YgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3dhci10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93YXItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3dlYi54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93ZWIueG1sCmluZGV4IDQxNDYyNWEuLjU4OTg3MjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3dlYi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2ViLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3doaWNocmVzb3VyY2UtdGVzdC54bWwKaW5kZXggNmJmNWE4OC4uYmU4NjQ4YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvd2hpY2hyZXNvdXJjZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy93aGljaHJlc291cmNlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LXRlc3QueG1sCmluZGV4IDViZTA0MjAuLmI2NjRkMjIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS5pbmxpbmUtZXhwYW5zaW9uLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LmlubGluZS1leHBhbnNpb24ueG1sCmluZGV4IGE5MTUxNzkuLjg3ZjljNDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LmlubGluZS1leHBhbnNpb24ueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5LmlubGluZS1leHBhbnNpb24ueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS5tdWx0aS54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94bWxwcm9wZXJ0eS5tdWx0aS54bWwKaW5kZXggOTg5OWM1OC4uNGMzN2VjZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveG1scHJvcGVydHkubXVsdGkueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3htbHByb3BlcnR5Lm11bHRpLnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveHNsdC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3hzbHQtdGVzdC54bWwKaW5kZXggZDZmNmQ2Ni4uMmQ4ODM1MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveHNsdC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94c2x0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xODcsMTggKzE4Nyw3IEBACiAgICAgPC94c2x0PgogICA8L3RhcmdldD4KIAotCi0gIDx0YXJnZXQgbmFtZT0idGVzdFRyYWNlSmRrMTQiIHVubGVzcz0iamRrMS41KyIgZGVwZW5kcz0ic2V0VXAiPgotICAgIDx4c2x0IGluPSIke2xlZ2FjeS5kaXJ9L2RhdGEueG1sIgotICAgICAgICAgIG91dD0iJHtvdXRwdXR9L291dC54bWwiCi0gICAgICAgICAgc3R5bGU9IiR7bGVnYWN5LmRpcn0vcHJpbnRQYXJhbXMueHNsIj4KLSAgICAgIDxwYXJhbSBuYW1lPSJzZXQiIGV4cHJlc3Npb249Im15dmFsdWUiLz4KLSAgICAgIDx0cmFjZSB0ZW1wbGF0ZXM9InRydWUiLz4KLSAgICA8L3hzbHQ+Ci0gICAgPGF1OmFzc2VydExvZ0NvbnRhaW5zIHRleHQ9IkZhaWxlZCB0byBlbmFibGUgdHJhY2luZyIgbGV2ZWw9Indhcm5pbmciLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPHRhcmdldCBuYW1lPSJ0ZXN0VHJhY2VKZGsxNSsiIGlmPSJqZGsxLjUrIiBkZXBlbmRzPSJzZXRVcCI+CisgIDx0YXJnZXQgbmFtZT0idGVzdFRyYWNlIiBkZXBlbmRzPSJzZXRVcCI+CiAgICAgPHhzbHQgaW49IiR7bGVnYWN5LmRpcn0vZGF0YS54bWwiCiAgICAgICAgICAgb3V0PSIke291dHB1dH0vb3V0LnhtbCIKICAgICAgICAgICBzdHlsZT0iJHtsZWdhY3kuZGlyfS9wcmludFBhcmFtcy54c2wiPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveHNsdC9wcmludFBhcmFtcy1pbnZhbGlkLnhzbCBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3hzbHQvcHJpbnRQYXJhbXMtaW52YWxpZC54c2wKaW5kZXggMzZkNDA0ZS4uZTA0NWE1MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMveHNsdC9wcmludFBhcmFtcy1pbnZhbGlkLnhzbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy94c2x0L3ByaW50UGFyYW1zLWludmFsaWQueHNsCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy96aXAtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy96aXAtdGVzdC54bWwKaW5kZXggN2ZmNDVjMS4uZDFkYzcyYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvemlwLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL3ppcC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvYnVpbGQtZW1iZWRkZWQtcmVmLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2J1aWxkLWVtYmVkZGVkLXJlZi54bWwKaW5kZXggZjJjYmQyYS4uZjkwZDBlNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvYnVpbGQtZW1iZWRkZWQtcmVmLnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9idWlsZC1lbWJlZGRlZC1yZWYueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jb25kaXRpb25zL2lzcmVmZXJlbmNlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY29uZGl0aW9ucy9pc3JlZmVyZW5jZS10ZXN0LnhtbAppbmRleCA4OTI5ZTkwLi5mNDc2ZTZjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jb25kaXRpb25zL2lzcmVmZXJlbmNlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2NvbmRpdGlvbnMvaXNyZWZlcmVuY2UtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2NvbmRpdGlvbnMvbWF0Y2hlcy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2NvbmRpdGlvbnMvbWF0Y2hlcy10ZXN0LnhtbAppbmRleCA1ZDE3NDYxLi5mMGNiNzFjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jb25kaXRpb25zL21hdGNoZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY29uZGl0aW9ucy9tYXRjaGVzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jdXRkaXJzLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvY3V0ZGlycy10ZXN0LnhtbAppbmRleCA2NGYwNjUyLi4yZmY3MzY2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9jdXRkaXJzLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2N1dGRpcnMtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2RlZmVyLXJlZmVyZW5jZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2RlZmVyLXJlZmVyZW5jZS10ZXN0LnhtbAppbmRleCBhNjdhZDNiLi41ZjQ5OTZkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9kZWZlci1yZWZlcmVuY2UtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZGVmZXItcmVmZXJlbmNlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWxlc2V0LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZmlsZXNldC10ZXN0LnhtbAppbmRleCBlYTM5ZGVjLi5kNjc1MDlkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWxlc2V0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2ZpbGVzZXQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2ZpbHRlcnNldC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2ZpbHRlcnNldC10ZXN0LnhtbAppbmRleCBmMTY1NGY2Li5hZTQ1N2M0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maWx0ZXJzZXQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZmlsdGVyc2V0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maXJzdG1hdGNoLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvZmlyc3RtYXRjaC10ZXN0LnhtbAppbmRleCA2OGMzMzJiLi4yMGJhMDQ5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9maXJzdG1hdGNoLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2ZpcnN0bWF0Y2gtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2phdmFyZXNvdXJjZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL2phdmFyZXNvdXJjZS10ZXN0LnhtbAppbmRleCBkMGU5OWUwLi4yOTQ2MjhmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9qYXZhcmVzb3VyY2UtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvamF2YXJlc291cmNlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9tYXBwZXItcmVmLnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlci1yZWYueG1sCmluZGV4IDNhZGE3ZjMuLmFmNGQ0NmIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlci1yZWYueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlci1yZWYueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9tYXBwZXJzL2dsb2ItdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9tYXBwZXJzL2dsb2ItdGVzdC54bWwKaW5kZXggYzRkOTJkYS4uZjRlMDg2MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbWFwcGVycy9nbG9iLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlcnMvZ2xvYi10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbWFwcGVycy9wYWNrYWdlbWFwcGVyLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbWFwcGVycy9wYWNrYWdlbWFwcGVyLXRlc3QueG1sCmluZGV4IGNhZDAxNDYuLmEyODExNjIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21hcHBlcnMvcGFja2FnZW1hcHBlci10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9tYXBwZXJzL3BhY2thZ2VtYXBwZXItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL21vZGlmaWVkLXNlbGVjdG9yLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbW9kaWZpZWQtc2VsZWN0b3ItdGVzdC54bWwKaW5kZXggMTY2ODhjYS4uZjUyYjhmOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbW9kaWZpZWQtc2VsZWN0b3ItdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvbW9kaWZpZWQtc2VsZWN0b3ItdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL29wdGlvbmFsL3h6L3h6cmVzb3VyY2UtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9vcHRpb25hbC94ei94enJlc291cmNlLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjIxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9vcHRpb25hbC94ei94enJlc291cmNlLXRlc3QueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYW50dW5pdCI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi8uLi8uLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDx0YXJnZXQgbmFtZT0ic2V0dXAiPgorICAgIDxta2RpciBkaXI9IiR7b3V0cHV0fSIvPgorICAgIDxhdmFpbGFibGUgcHJvcGVydHk9Inh6LnByZXNlbnQiIGNsYXNzbmFtZT0ib3JnLnR1a2FhbmkueHouWFpPdXRwdXRTdHJlYW0iLz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0RG9jdW1lbnRhdGlvbkNsYWltc09uQ29weSIgaWY9Inh6LnByZXNlbnQiPgorICAgIDxjb3B5IHRvZGlyPSIke291dHB1dH0iPgorICAgICAgPHh6cmVzb3VyY2U+CisgICAgICAgIDxmaWxlIGZpbGU9Ii4uLy4uLy4uLy4uLy4uL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhwZWN0ZWQvYXNmLWxvZ28uZ2lmLnh6Ii8+CisgICAgICA8L3h6cmVzb3VyY2U+CisgICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IioueHoiIHRvPSIqIi8+CisgICAgPC9jb3B5PgorICAgIDxhdTphc3NlcnRGaWxlc01hdGNoIGV4cGVjdGVkPSIuLi8uLi8uLi8uLi8uLi9ldGMvdGVzdGNhc2VzL2FzZi1sb2dvLmdpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWw9IiR7b3V0cHV0fS9hc2YtbG9nby5naWYiLz4KKyAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wYXRoLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0aC10ZXN0LnhtbAppbmRleCA0ZjRiZTlhLi42MWNhMmRlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wYXRoLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdGgtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdHRlcm5zZXQtaW52ZXJ0LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0dGVybnNldC1pbnZlcnQtdGVzdC54bWwKaW5kZXggN2MwOTEyZS4uMjIwOGVjZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0dGVybnNldC1pbnZlcnQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0dGVybnNldC1pbnZlcnQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdHRlcm5zZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wYXR0ZXJuc2V0LXRlc3QueG1sCmluZGV4IDYwNjkwZDQuLjRkYTc2ZjIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3BhdHRlcm5zZXQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcGF0dGVybnNldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcHJvcGVydHlzZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wcm9wZXJ0eXNldC10ZXN0LnhtbAppbmRleCAwYjdlMjM2Li4xMWExZjUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wcm9wZXJ0eXNldC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9wcm9wZXJ0eXNldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9hcmNoaXZlcy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9hcmNoaXZlcy10ZXN0LnhtbAppbmRleCA5NjFlZmZjLi5jMWJiN2IxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvYXJjaGl2ZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2FyY2hpdmVzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvY29tcGFyYXRvcnMvdGVzdC54bWwKaW5kZXggNTI0ZjY3YS4uOWMzOTY0YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2NvbXBhcmF0b3JzL3Rlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9jb21wYXJhdG9ycy90ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2NvbmNhdC1yZXNvdXJjZS10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9jb25jYXQtcmVzb3VyY2UtdGVzdC54bWwKaW5kZXggNTU0YzEzZC4uZDA0YjIyMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2NvbmNhdC1yZXNvdXJjZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvY29uY2F0LXJlc291cmNlLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlsZXJlc291cmNlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2ZpbGVyZXNvdXJjZS10ZXN0LnhtbAppbmRleCA3MTE0MTE5Li4wM2M5OWFjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlsZXJlc291cmNlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maWxlcmVzb3VyY2UtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maWxlcy10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maWxlcy10ZXN0LnhtbAppbmRleCA0NDdhMjYyLi45ODM0YmUwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlsZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2ZpbGVzLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvZmlyc3QtbGFzdC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maXJzdC1sYXN0LXRlc3QueG1sCmluZGV4IGU3ZmM4MzEuLjM4MTE3ZTMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maXJzdC1sYXN0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9maXJzdC1sYXN0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2phdmFyZXNvdXJjZS10ZXN0LnhtbAppbmRleCBhODMxODRkLi5mYzJjZGIyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvamF2YXJlc291cmNlLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9qYXZhcmVzb3VyY2UtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9sYXRlcGF0aC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9sYXRlcGF0aC10ZXN0LnhtbAppbmRleCA1Y2FmZmZkLi5jNzBmNTE2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvbGF0ZXBhdGgtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL2xhdGVwYXRoLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvbXVsdGlyb290ZmlsZXNldC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9tdWx0aXJvb3RmaWxlc2V0LXRlc3QueG1sCmluZGV4IDI3YjYxOTMuLjRjM2MxNzggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9tdWx0aXJvb3RmaWxlc2V0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9tdWx0aXJvb3RmaWxlc2V0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VsaXN0LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3Jlc291cmNlbGlzdC10ZXN0LnhtbAppbmRleCAzMzU3NzQ3Li4yNTc1YjY1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VsaXN0LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9yZXNvdXJjZWxpc3QtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9yZXNvdXJjZXMtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvcmVzb3VyY2VzLXRlc3QueG1sCmluZGV4IDE5OTg1YzcuLjg1YjJjODMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9yZXNvdXJjZXMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3Jlc291cmNlcy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9uYW1lLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9uYW1lLXRlc3QueG1sCmluZGV4IDg0Y2JlZGIuLjE1ZDAyMjEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvbmFtZS10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL25hbWUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvcmVhZHdyaXRlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9yZWFkd3JpdGUtdGVzdC54bWwKaW5kZXggNmEwMzAxYi4uMDczYWRiMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9yZWFkd3JpdGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy9yZWFkd3JpdGUtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTcwLDEzICs3MCwxMCBAQAogICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUiCi0gICAgICAgICAgZGVwZW5kcz0iY3JlYXRlVGVzdGRpcixtYWtlRmlsZVVud3JpdGFibGUtVW5peCxtYWtlRmlsZVVud3JpdGFibGUtV2luZG93cyIvPgotICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlVW53cml0YWJsZS1Vbml4IiBpZD0idW5peCI+Ci0gICAgPGNobW9kIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9IiBwZXJtPSI0NDQiLz4KLSAgPC90YXJnZXQ+Ci0gIDx0YXJnZXQgbmFtZT0ibWFrZUZpbGVVbndyaXRhYmxlLVdpbmRvd3MiIHVubGVzcz0idW5peCI+Ci0gICAgPGF0dHJpYiBmaWxlPSIke291dHB1dH0vJHtmaWxlfSIgcmVhZG9ubHk9InRydWUiLz4KKyAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUiIGRlcGVuZHM9ImNyZWF0ZVRlc3RkaXIiPgorICAgIDxzZXRwZXJtaXNzaW9ucyBtb2RlPSI0NDQiIG5vblBvc2l4TW9kZT0idHJ5RG9zT3JGYWlsIj4KKyAgICAgIDxmaWxlIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KICAgPC90YXJnZXQ+CiAKICAgPHRhcmdldCBuYW1lPSJ0ZXN0VW53cml0YWJsZSIgZGVwZW5kcz0ibWFrZUZpbGVVbndyaXRhYmxlIj4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvdGVzdC1jb21wb25lbnRkZWYueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LWNvbXBvbmVudGRlZi54bWwKaW5kZXggMTg3NDEyZS4uMzg0NjgyZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LWNvbXBvbmVudGRlZi54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LWNvbXBvbmVudGRlZi54bWwKQEAgLTcsNyArNyw3IEBACiAgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgICAgPHJlc3RyaWN0PgogICAgICAgICAgIDxyZXNvdXJjZXM+CiAgICAgICAgICAgICA8ZmlsZSBmaWxlPSJmb28iIC8+Ci0gICAgICAgICAgICA8dXJsIHVybD0iaHR0cDovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiIC8+CisgICAgICAgICAgICA8dXJsIHVybD0iaHR0cHM6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sIiAvPgogICAgICAgICAgICAgPHJlc291cmNlIG5hbWU9ImZvbyIgLz4KICAgICAgICAgICAgIDxzdHJpbmcgdmFsdWU9ImZvbyIgLz4KICAgICAgICAgICAgIDxmaWxlIGZpbGU9ImJhciIgLz4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvc2VsZWN0b3JzL3Rlc3QueG1sCmluZGV4IDI0YjgwNGEuLmI3NThlYjQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy9zZWxlY3RvcnMvdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3NlbGVjdG9ycy90ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtODUsNyArODUsNyBAQAogICAgICAgICA8cmVzdHJpY3Q+CiAgICAgICAgICAgPHJlc291cmNlcz4KICAgICAgICAgICAgIDxmaWxlIGZpbGU9ImZvbyIgLz4KLSAgICAgICAgICAgIDx1cmwgdXJsPSJodHRwOi8vYW50LmFwYWNoZS5vcmcvaW5kZXguaHRtbCIgLz4KKyAgICAgICAgICAgIDx1cmwgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiIC8+CiAgICAgICAgICAgICA8cmVzb3VyY2UgbmFtZT0iZm9vIiAvPgogICAgICAgICAgICAgPHN0cmluZyB2YWx1ZT0iZm9vIiAvPgogICAgICAgICAgICAgPGZpbGUgZmlsZT0iYmFyIiAvPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3Rlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3Rlc3QueG1sCmluZGV4IDVhZjM3YjkuLjdhZmViNWMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy90ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDggKzI4LDggQEAKICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ib2ZmbGluZSI+CiAgICAgPG5vdD4KICAgICAgIDxvcj4KLSAgICAgICAgPGh0dHAgdXJsPSJodHRwOi8vd3d3LmFwYWNoZS5vcmciLz4KLSAgICAgICAgPGh0dHAgdXJsPSJodHRwOi8vd3d3Lmdvb2dsZS5jb20iLz4KKyAgICAgICAgPGh0dHAgdXJsPSJodHRwczovL3d3dy5hcGFjaGUub3JnIi8+CisgICAgICAgIDxodHRwIHVybD0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbSIvPgogICAgICAgPC9vcj4KICAgICA8L25vdD4KICAgPC9jb25kaXRpb24+CkBAIC0yODAsNyArMjgwLDcgQEAKIAogICA8dGFyZ2V0IG5hbWU9InRlc3RodHRwdXJsMiIgdW5sZXNzPSJvZmZsaW5lIj4KICAgICA8Y29uY2F0IGRlc3RmaWxlPSIke2ZpbGV9IiBmb3JjZT0idHJ1ZSIgYXBwZW5kPSJmYWxzZSI+Ci0gICAgICA8dXJsIGlkPSJodHRwdXJsIiB1cmw9Imh0dHA6Ly9hbnQuYXBhY2hlLm9yZy9pbmRleC5odG1sIiAvPgorICAgICAgPHVybCBpZD0iaHR0cHVybCIgdXJsPSJodHRwczovL2FudC5hcGFjaGUub3JnL2luZGV4Lmh0bWwiIC8+CiAgICAgICA8dXJsIHJlZmlkPSJodHRwdXJsIiAvPgogICAgIDwvY29uY2F0PgogICAgIDxsZW5ndGggcHJvcGVydHk9Imh0dHB1cmwubGVuZ3RoIj4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy90b2tlbnMtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9yZXNvdXJjZXMvdG9rZW5zLXRlc3QueG1sCmluZGV4IDI2YTMwMGQuLjUxYTdlMTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3Jlc291cmNlcy90b2tlbnMtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvcmVzb3VyY2VzL3Rva2Vucy10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL2RlcGVuZC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9kZXBlbmQtdGVzdC54bWwKaW5kZXggZTg2OGY2YS4uZGEyZTZmNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL2RlcGVuZC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvZGVwZW5kLXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvZGlmZmVyZW50LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL2RpZmZlcmVudC10ZXN0LnhtbAppbmRleCBjMjU0MmQyLi5iMWQwNGZmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvZGlmZmVyZW50LXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9kaWZmZXJlbnQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9leGVjdXRhYmxlLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL2V4ZWN1dGFibGUtdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiZGFiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9leGVjdXRhYmxlLXRlc3QueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYW50dW5pdCI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi8uLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0idGVzdGZpbGUiLz4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1bml4Ij4KKyAgICA8b3MgZmFtaWx5PSJ1bml4Ii8+CisgIDwvY29uZGl0aW9uPgorCisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlVGVzdGRpciI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEV4ZWN1dGFibGUiIGRlcGVuZHM9Im1ha2VGaWxlRXhlY3V0YWJsZSIgaWY9InVuaXgiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIxIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0iPgorICAgICAgICAgIDxleGVjdXRhYmxlLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtvdXRwdXR9IiBleGNsdWRlcz0iJHtmaWxlfSI+CisgICAgICAgICAgPGV4ZWN1dGFibGUvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlRXhlY3V0YWJsZSIgZGVwZW5kcz0iY3JlYXRlVGVzdGRpciI+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9Ijc1NSIgbm9uUG9zaXhNb2RlPSJwYXNzIj4KKyAgICAgIDxmaWxlIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgICAgPC9zZXRwZXJtaXNzaW9ucz4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm90ZXhlY3V0YWJsZSIgZGVwZW5kcz0iY3JlYXRlVGVzdGRpciIgaWY9InVuaXgiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIwIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0iPgorICAgICAgICAgIDxleGVjdXRhYmxlLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0QXNGYWxzZUNvbmRpdGlvbnMiIGRlcGVuZHM9ImNyZWF0ZVRlc3RkaXIiIGlmPSJ1bml4Ij4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iPgorICAgICAgICA8ZXhlY3V0YWJsZS8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFzVHJ1ZUNvbmRpdGlvbnMiIGRlcGVuZHM9Im1ha2VGaWxlRXhlY3V0YWJsZSIgaWY9InVuaXgiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ij4KKyAgICAgICAgPGV4ZWN1dGFibGUvPgorICAgICAgPC9pc2ZpbGVzZWxlY3RlZD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvZmlsZW5hbWUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvZmlsZW5hbWUtdGVzdC54bWwKaW5kZXggM2YyOGUxMS4uOTAxM2FiOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL2ZpbGVuYW1lLXRlc3QueG1sCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9maWxlbmFtZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkLXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL21vZGlmaWVkLXRlc3QueG1sCmluZGV4IGE0YzQzZTAuLmM3ZmRjMzQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9tb2RpZmllZC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvbW9kaWZpZWQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9vd25lZGJ5LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL293bmVkYnktdGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4NWMzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9vd25lZGJ5LXRlc3QueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhtbG5zOmF1PSJhbnRsaWI6b3JnLmFwYWNoZS5hbnQuYW50dW5pdCIgZGVmYXVsdD0iYW50dW5pdCI+CisKKyAgPGltcG9ydCBmaWxlPSIuLi8uLi9hbnR1bml0LWJhc2UueG1sIiAvPgorCisgIDxwcm9wZXJ0eSBuYW1lPSJmaWxlIiB2YWx1ZT0idGVzdGZpbGUiLz4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1bml4Ij4KKyAgICA8b3MgZmFtaWx5PSJ1bml4Ii8+CisgIDwvY29uZGl0aW9uPgorCisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlVGVzdGRpciI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFJlcXVpcmVzT3duZXIiIGRlcGVuZHM9ImNyZWF0ZVRlc3RkaXIiPgorICAgIDxhdTpleHBlY3RmYWlsdXJlIGV4cGVjdGVkTWVzc2FnZT0idGhlIG93bmVyIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCI+CisgICAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgICAgPGlzZmlsZXNlbGVjdGVkIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ij4KKyAgICAgICAgICA8b3duZWRCeS8+CisgICAgICAgIDwvaXNmaWxlc2VsZWN0ZWQ+CisgICAgICA8L2F1OmFzc2VydFRydWU+CisgICAgPC9hdTpleHBlY3RmYWlsdXJlPgorICA8L3RhcmdldD4KKworICA8IS0tIGF0IGxlYXN0IG9uIEplbmtpbnMgdGhlIGZpbGUgaXMgb3duZWQgYnkgQlVJTFRJTlxBZG1pbmlzdHJhdG9ycyAtLT4KKyAgPHRhcmdldCBuYW1lPSJ0ZXN0T3duZWRCeSIgZGVwZW5kcz0iY3JlYXRlVGVzdGRpciIgaWY9InVuaXgiPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIxIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0iPgorICAgICAgICAgIDxvd25lZEJ5IG93bmVyPSIke3VzZXIubmFtZX0iLz4KKyAgICAgICAgPC9maWxlc2V0PgorICAgICAgPC9yZXNvdXJjZWNvdW50PgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtvdXRwdXR9IiBleGNsdWRlcz0iJHtmaWxlfSI+CisgICAgICAgICAgPG93bmVkQnkgb3duZXI9IiR7dXNlci5uYW1lfSIvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICA8L3RhcmdldD4KKworICA8dGFyZ2V0IG5hbWU9InRlc3RBc1RydWVDb25kaXRpb25zIiBkZXBlbmRzPSJjcmVhdGVUZXN0ZGlyIiBpZj0idW5peCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iPgorICAgICAgICA8b3duZWRCeSBvd25lcj0iJHt1c2VyLm5hbWV9Ii8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9wcmVzZW50LXRlc3QueG1sIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3ByZXNlbnQtdGVzdC54bWwKaW5kZXggZTMxYzcyMi4uZWZhYTNiZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3ByZXNlbnQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3ByZXNlbnQtdGVzdC54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9yZWFkd3JpdGUtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvcmVhZHdyaXRlLXRlc3QueG1sCmluZGV4IGJkNGFjOGQuLmZjYzA3ZmEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9yZWFkd3JpdGUtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3JlYWR3cml0ZS10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjQsMTMgKzY0LDEwIEBACiAgICAgPC9hdTphc3NlcnRUcnVlPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlVW53cml0YWJsZSIKLSAgICAgICAgICBkZXBlbmRzPSJjcmVhdGVUZXN0ZGlyLG1ha2VGaWxlVW53cml0YWJsZS1Vbml4LG1ha2VGaWxlVW53cml0YWJsZS1XaW5kb3dzIi8+Ci0gIDx0YXJnZXQgbmFtZT0ibWFrZUZpbGVVbndyaXRhYmxlLVVuaXgiIGlkPSJ1bml4Ij4KLSAgICA8Y2htb2QgZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iIHBlcm09IjQ0NCIvPgotICA8L3RhcmdldD4KLSAgPHRhcmdldCBuYW1lPSJtYWtlRmlsZVVud3JpdGFibGUtV2luZG93cyIgdW5sZXNzPSJ1bml4Ij4KLSAgICA8YXR0cmliIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9IiByZWFkb25seT0idHJ1ZSIvPgorICA8dGFyZ2V0IG5hbWU9Im1ha2VGaWxlVW53cml0YWJsZSIgZGVwZW5kcz0iY3JlYXRlVGVzdGRpciI+CisgICAgPHNldHBlcm1pc3Npb25zIG1vZGU9IjQ0NCIgbm9uUG9zaXhNb2RlPSJ0cnlEb3NPckZhaWwiPgorICAgICAgPGZpbGUgZmlsZT0iJHtvdXRwdXR9LyR7ZmlsZX0iLz4KKyAgICA8L3NldHBlcm1pc3Npb25zPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9InRlc3RVbndyaXRhYmxlIiBkZXBlbmRzPSJtYWtlRmlsZVVud3JpdGFibGUiPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3NlbGVjdC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9zZWxlY3QtdGVzdC54bWwKaW5kZXggZjVmNWI5OS4uMDVjYzQ2NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvc2VsZWN0b3JzL3NlbGVjdC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvc2VsZWN0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvc3ltbGluay10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3NlbGVjdG9ycy9zeW1saW5rLXRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZmI2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy9zZWxlY3RvcnMvc3ltbGluay10ZXN0LnhtbApAQCAtMCwwICsxLDg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKyAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxuczphdT0iYW50bGliOm9yZy5hcGFjaGUuYW50LmFudHVuaXQiIGRlZmF1bHQ9ImFudHVuaXQiPgorCisgIDxpbXBvcnQgZmlsZT0iLi4vLi4vYW50dW5pdC1iYXNlLnhtbCIgLz4KKworICA8cHJvcGVydHkgbmFtZT0iZmlsZSIgdmFsdWU9InRlc3RmaWxlIi8+CisgIDxwcm9wZXJ0eSBuYW1lPSJsaW5rIiB2YWx1ZT0idGVzdGxpbmsiLz4KKworICA8Y29uZGl0aW9uIHByb3BlcnR5PSJ1bml4Ij4KKyAgICA8b3MgZmFtaWx5PSJ1bml4Ii8+CisgIDwvY29uZGl0aW9uPgorCisgIDx0YXJnZXQgbmFtZT0iY3JlYXRlVGVzdGRpciI+CisgICAgPG1rZGlyIGRpcj0iJHtvdXRwdXR9Ii8+CisgICAgPHRvdWNoIGZpbGU9IiR7b3V0cHV0fS8ke2ZpbGV9Ii8+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdFN5bWxpbmsiIGRlcGVuZHM9Im1ha2VTeW1saW5rIiBpZj0idW5peCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8cmVzb3VyY2Vjb3VudCB3aGVuPSJlcXVhbCIgY291bnQ9IjEiPgorICAgICAgICA8ZmlsZXNldCBkaXI9IiR7b3V0cHV0fSI+CisgICAgICAgICAgPHN5bWxpbmsvPgorICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICA8L3Jlc291cmNlY291bnQ+CisgICAgPC9hdTphc3NlcnRUcnVlPgorICAgIDxhdTphc3NlcnRUcnVlPgorICAgICAgPHJlc291cmNlY291bnQgd2hlbj0iZXF1YWwiIGNvdW50PSIwIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke291dHB1dH0iIGV4Y2x1ZGVzPSIke2xpbmt9Ij4KKyAgICAgICAgICA8c3ltbGluay8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0ibWFrZVN5bWxpbmsiCisgICAgICAgICAgZGVwZW5kcz0iY3JlYXRlVGVzdGRpcixtYWtlU3ltbGluay1Vbml4LG1ha2VTeW1saW5rLVdpbmRvd3MiLz4KKyAgPHRhcmdldCBuYW1lPSJtYWtlU3ltbGluay1Vbml4IiBpZj0idW5peCI+CisgICAgPHN5bWxpbmsgbGluaz0iJHtvdXRwdXR9LyR7bGlua30iIHJlc291cmNlPSIke291dHB1dH0vJHtmaWxlfSIvPgorICA8L3RhcmdldD4KKyAgPHRhcmdldCBuYW1lPSJtYWtlU3ltbGluay1XaW5kb3dzIiB1bmxlc3M9InVuaXgiPgorICAgIDwhLS0gbm8gaWRlYSBob3cgdG8gZG8gdGhpcyAtLT4KKyAgPC90YXJnZXQ+CisKKyAgPHRhcmdldCBuYW1lPSJ0ZXN0Tm9TeW1saW5rIiBkZXBlbmRzPSJjcmVhdGVUZXN0ZGlyIj4KKyAgICA8YXU6YXNzZXJ0VHJ1ZT4KKyAgICAgIDxyZXNvdXJjZWNvdW50IHdoZW49ImVxdWFsIiBjb3VudD0iMCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtvdXRwdXR9Ij4KKyAgICAgICAgICA8c3ltbGluay8+CisgICAgICAgIDwvZmlsZXNldD4KKyAgICAgIDwvcmVzb3VyY2Vjb3VudD4KKyAgICA8L2F1OmFzc2VydFRydWU+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFzRmFsc2VDb25kaXRpb25zIiBkZXBlbmRzPSJjcmVhdGVUZXN0ZGlyIj4KKyAgICA8YXU6YXNzZXJ0RmFsc2U+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtvdXRwdXR9LyR7bGlua30iPgorICAgICAgICA8c3ltbGluay8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvYXU6YXNzZXJ0RmFsc2U+CisgIDwvdGFyZ2V0PgorCisgIDx0YXJnZXQgbmFtZT0idGVzdEFzVHJ1ZUNvbmRpdGlvbnMiIGRlcGVuZHM9Im1ha2VTeW1saW5rIiBpZj0idW5peCI+CisgICAgPGF1OmFzc2VydFRydWU+CisgICAgICA8aXNmaWxlc2VsZWN0ZWQgZmlsZT0iJHtvdXRwdXR9LyR7bGlua30iPgorICAgICAgICA8c3ltbGluay8+CisgICAgICA8L2lzZmlsZXNlbGVjdGVkPgorICAgIDwvYXU6YXNzZXJ0VHJ1ZT4KKyAgPC90YXJnZXQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3RhcmZpbGVzZXQtdGVzdC54bWwgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy90YXJmaWxlc2V0LXRlc3QueG1sCmluZGV4IDNjNGQzYTkuLjgyODIzMTMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3RhcmZpbGVzZXQtdGVzdC54bWwKKysrIGIvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvdGFyZmlsZXNldC10ZXN0LnhtbApAQCAtNyw3ICs3LDcgQEAKICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIAotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvemlwZmlsZXNldC10ZXN0LnhtbCBiL3NyYy90ZXN0cy9hbnR1bml0L3R5cGVzL3ppcGZpbGVzZXQtdGVzdC54bWwKaW5kZXggYzhiYjAyMi4uNDIyMWZhNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdHlwZXMvemlwZmlsZXNldC10ZXN0LnhtbAorKysgYi9zcmMvdGVzdHMvYW50dW5pdC90eXBlcy96aXBmaWxlc2V0LXRlc3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50QXNzZXJ0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50QXNzZXJ0LmphdmEKaW5kZXggZDIzNzkyZS4uMzUzYTI2NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudEFzc2VydC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRBc3NlcnQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDkgKzIxLDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCi0gKiBQcm92aWRlcyBjb21tb24gYXNzZXJ0IGZ1bmN0aW9ucyBmb3IgdXNlIGFjcm9zcyBtdWx0aXBsZSB0ZXN0cywgc2ltaWxhciB0byB0aGUgPHR0PkFzc2VydDwvdHQ+cworICogUHJvdmlkZXMgY29tbW9uIGFzc2VydCBmdW5jdGlvbnMgZm9yIHVzZSBhY3Jvc3MgbXVsdGlwbGUgdGVzdHMsIHNpbWlsYXIgdG8gdGhlIDxjb2RlPkFzc2VydDwvY29kZT5zCiAgKiB3aXRoaW4gSlVuaXQuCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGFzc2VydFRoYXQoKSBpbiBKVW5pdCA0LjQrIGluIGNvbWJpbmF0aW9uIHdpdGggY29udGFpbnNTdHJpbmcoKSBtYXRjaGVyOworICogZm9yIGV4Y2VwdGlvbiBtZXNzYWdlcywgdXNlIEV4cGVjdGVkRXhjZXB0aW9uIHJ1bGUuCiAgKi8KK0BEZXByZWNhdGVkCiBwdWJsaWMgY2xhc3MgQW50QXNzZXJ0IHsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyRGVsZWdhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlckRlbGVnYXRpb25UZXN0LmphdmEKaW5kZXggYjZmNWI1Zi4uNjYwYTI4YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyRGVsZWdhdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJEZWxlZ2F0aW9uVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsNyArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTUyLDE1ICs1MiwxNCBAQAogICAgIH0KIAogICAgIC8qKiBTYW1wbGUgcmVzb3VyY2UgcHJlc2VudCBpbiBidWlsZC90ZXN0Y2FzZXMvICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0UKLSAgICAgICAgPSAiYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5jbGFzcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUkVTT1VSQ0UgPSAiYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5jbGFzcyI7CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gVGhpcyBwYXRoIHNob3VsZCBjb250YWluIHRoZSBjbGFzcyBmaWxlcyBmb3IgdGhlc2UgdGVzdGNhc2VzOgotICAgICAgICBTdHJpbmcgYnVpbGRUZXN0Y2FzZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImRlZmluZWQgJHtidWlsZC50ZXN0c30iLCBidWlsZFRlc3RjYXNlcyk7CisgICAgICAgIFN0cmluZyBidWlsZFRlc3RjYXNlcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQudGVzdHMudmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGVmaW5lZCAke2J1aWxkLnRlc3RzLnZhbHVlfSIsIGJ1aWxkVGVzdGNhc2VzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiaGF2ZSBhIGRpciAiICsgYnVpbGRUZXN0Y2FzZXMsCiAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYnVpbGRUZXN0Y2FzZXMpLmlzRGlyZWN0b3J5KCkpOwogICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChwLCBidWlsZFRlc3RjYXNlcyArICIvb3JnIik7CkBAIC03MiwyMSArNzEsMjEgQEAKICAgICAgICAgLy8gVGhlIGludGVuZGVkIHJlc3VsdCBVUkxzOgogICAgICAgICBVUkwgdXJsRnJvbVBhdGggPSBuZXcgVVJMKAogICAgICAgICAgICAgRklMRV9VVElMUy50b1VSSShidWlsZFRlc3RjYXNlcykgKyAib3JnLyIgKyBURVNUX1JFU09VUkNFKTsKLSAgICAgICAgVVJMIHVybEZyb21QYXJlbnQgPSBuZXcgVVJMKCJodHRwOi8vYW50LmFwYWNoZS5vcmcvIiArIFRFU1RfUkVTT1VSQ0UpOworICAgICAgICBVUkwgdXJsRnJvbVBhcmVudCA9IG5ldyBVUkwoImh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIiArIFRFU1RfUkVTT1VSQ0UpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImNvcnJlY3QgcmVzb3VyY2VzIChyZWd1bGFyIGRlbGVnYXRpb24gb3JkZXIpIiwKLSAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFVSTFtdIHt1cmxGcm9tUGFyZW50LCB1cmxGcm9tUGF0aH0pLAotICAgICAgICAgICAgZW51bTJMaXN0KGFjbC5nZXRSZXNvdXJjZXMoVEVTVF9SRVNPVVJDRSkpKTsKKyAgICAgICAgICAgIEFycmF5cy5hc0xpc3QodXJsRnJvbVBhcmVudCwgdXJsRnJvbVBhdGgpLAorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmxpc3QoYWNsLmdldFJlc291cmNlcyhURVNUX1JFU09VUkNFKSkpOwogICAgICAgICBhY2wgPSBuZXcgQW50Q2xhc3NMb2FkZXIocGFyZW50LCBwLCBwYXRoLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiY29ycmVjdCByZXNvdXJjZXMgKHJldmVyc2UgZGVsZWdhdGlvbiBvcmRlcikiLAotICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChuZXcgVVJMW10ge3VybEZyb21QYXRoLCB1cmxGcm9tUGFyZW50fSksCi0gICAgICAgICAgICBlbnVtMkxpc3QoYWNsLmdldFJlc291cmNlcyhURVNUX1JFU09VUkNFKSkpOworICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCh1cmxGcm9tUGF0aCwgdXJsRnJvbVBhcmVudCksCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMubGlzdChhY2wuZ2V0UmVzb3VyY2VzKFRFU1RfUkVTT1VSQ0UpKSk7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSXNvbGF0ZVJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgYnVpbGRUZXN0Y2FzZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoImRlZmluZWQgJHtidWlsZC50ZXN0c30iLCBidWlsZFRlc3RjYXNlcyk7CisgICAgICAgIFN0cmluZyBidWlsZFRlc3RjYXNlcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQudGVzdHMudmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiZGVmaW5lZCAke2J1aWxkLnRlc3RzLnZhbHVlfSIsIGJ1aWxkVGVzdGNhc2VzKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiaGF2ZSBhIGRpciAiICsgYnVpbGRUZXN0Y2FzZXMsCiAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYnVpbGRUZXN0Y2FzZXMpLmlzRGlyZWN0b3J5KCkpOwogICAgICAgICBQYXRoIHBhdGggPSBuZXcgUGF0aChwLCBidWlsZFRlc3RjYXNlcyArICIvb3JnIik7CkBAIC05OCwxMiArOTcsOCBAQAogICAgICAgICBBbnRDbGFzc0xvYWRlciBhY2wgPSBuZXcgQW50Q2xhc3NMb2FkZXIocGFyZW50LCBwLCBwYXRoLCBmYWxzZSk7CiAgICAgICAgIGFjbC5zZXRJc29sYXRlZCh0cnVlKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb3JyZWN0IHJlc291cmNlcyAocmV2ZXJzZSBkZWxlZ2F0aW9uIG9yZGVyKSIsCi0gICAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBVUkxbXSB7dXJsRnJvbVBhdGh9KSwKLSAgICAgICAgICAgIGVudW0yTGlzdChhY2wuZ2V0UmVzb3VyY2VzKFRFU1RfUkVTT1VSQ0UpKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdCBlbnVtMkxpc3QoRW51bWVyYXRpb24gZSkgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMubGlzdChlKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVybEZyb21QYXRoKSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5saXN0KGFjbC5nZXRSZXNvdXJjZXMoVEVTVF9SRVNPVVJDRSkpKTsKICAgICB9CiAKICAgICAvKiogU3BlY2lhbCBsb2FkZXIgdGhhdCBqdXN0IGtub3dzIGhvdyB0byBmaW5kIFRFU1RfUkVTT1VSQ0UuICovCkBAIC0xMTIsMTMgKzEwNywxMyBAQAogICAgICAgICBwdWJsaWMgUGFyZW50TG9hZGVyKCkgewogICAgICAgICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHByb3RlY3RlZCBFbnVtZXJhdGlvbjxVUkw+IGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoVEVTVF9SRVNPVVJDRSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oCiAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoImh0dHA6Ly9hbnQuYXBhY2hlLm9yZy8iICsgbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoImh0dHBzOi8vYW50LmFwYWNoZS5vcmcvIiArIG5hbWUpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbnVtZXJhdGlvbihDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJQZXJmb3JtYW5jZS5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyUGVyZm9ybWFuY2UuamF2YQppbmRleCAyMTQ1Y2ZhLi44NDIxNjU1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJQZXJmb3JtYW5jZS5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlclBlcmZvcm1hbmNlLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQW50Q2xhc3NMb2FkZXJUZXN0LmphdmEKaW5kZXggYTAxNmQ0OS4uY2VkZWVkMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0FudENsYXNzTG9hZGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9BbnRDbGFzc0xvYWRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDIxICsyMywyMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkNvbGxlY3Rpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUZXN0IGNhc2UgZm9yIGFudCBjbGFzcyBsb2FkZXIKQEAgLTQ4LDYgKzUwLDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBwcml2YXRlIEFudENsYXNzTG9hZGVyIGxvYWRlcjsKIAogICAgIEBCZWZvcmUKQEAgLTcwLDcgKzc1LDcgQEAKICAgICAgICAgU3RyaW5nIGV4dGphcnN0cmluZyA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImV4dC5qYXIiKTsKICAgICAgICAgUGF0aCBteVBhdGggPSBuZXcgUGF0aChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgbXlQYXRoLnNldExvY2F0aW9uKG5ldyBGaWxlKG1haW5qYXJzdHJpbmcpKTsKLSAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRVc2VyUHJvcGVydHkoImJ1aWxkLnN5c2NsYXNzcGF0aCIsICJpZ25vcmUiKTsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRVc2VyUHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9TWVNDTEFTU1BBVEgsICJpZ25vcmUiKTsKICAgICAgICAgbG9hZGVyID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihteVBhdGgpOwogICAgICAgICBTdHJpbmcgcGF0aCA9IGxvYWRlci5nZXRDbGFzc3BhdGgoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1haW5qYXJzdHJpbmcgKyBGaWxlLnBhdGhTZXBhcmF0b3IgKyBleHRqYXJzdHJpbmcsIHBhdGgpOwpAQCAtODIsNDUgKzg3LDQ2IEBACiAgICAgICAgIFN0cmluZyBleHRqYXJzdHJpbmcgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJleHQuamFyLm5vbmFzY2lpIik7CiAgICAgICAgIFBhdGggbXlQYXRoID0gbmV3IFBhdGgoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CiAgICAgICAgIG15UGF0aC5zZXRMb2NhdGlvbihuZXcgRmlsZShtYWluamFyc3RyaW5nKSk7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCAiaWdub3JlIik7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRILCAiaWdub3JlIik7CiAgICAgICAgIGxvYWRlciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKICAgICAgICAgU3RyaW5nIHBhdGggPSBsb2FkZXIuZ2V0Q2xhc3NwYXRoKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhtYWluamFyc3RyaW5nICsgRmlsZS5wYXRoU2VwYXJhdG9yICsgZXh0amFyc3RyaW5nLCBwYXRoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGUgdGVzdCBzaG91bGQgZmFpbCBpZiBOdWxsUG9pbnRFeGNlcHRpb24gaXMgdGhyb3duCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgYSBjbGFzcyBpcyBub3QgZm91bmQsIGlnbm9yZWQKKyAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhbnVwKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYW51cCgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKTsKICAgICAgICAgUGF0aCBwYXRoID0gbmV3IFBhdGgoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgIi4iKTsKICAgICAgICAgbG9hZGVyID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5jcmVhdGVDbGFzc0xvYWRlcihwYXRoKTsKKyAgICAgICAgYm9vbGVhbiBjYW5hcnkgPSBmYWxzZTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIC8vIHdlIGRvbid0IGV4cGVjdCB0byBmaW5kIHRoaXMKICAgICAgICAgICAgIGxvYWRlci5maW5kQ2xhc3MoImZ1YmFyIik7Ci0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IGV4cGVjdCB0byBmaW5kIGZ1YmFyIGNsYXNzIik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlIGV4cGVjdGVkCi0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXIuY2xlYW51cCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgLy8gd2UgZG9uJ3QgZXhwZWN0IHRvIGZpbmQgdGhpcwotICAgICAgICAgICAgbG9hZGVyLmZpbmRDbGFzcygiZnViYXIiKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgZXhwZWN0IHRvIGZpbmQgZnViYXIgY2xhc3MiKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgZXhwZWN0ZWQKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgibG9hZGVyIHNob3VsZCBub3QgZmFpbCBldmVuIGlmIGNsZWFuZWQgdXAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRlbGwgdGhlIGJ1aWxkIGl0IGlzIGZpbmlzaGVkCi0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZmlyZUJ1aWxkRmluaXNoZWQobnVsbCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgdG8gZmluZCB0aGlzCi0gICAgICAgICAgICBsb2FkZXIuZmluZENsYXNzKCJmdWJhciIpOwotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCBleHBlY3QgdG8gZmluZCBmdWJhciBjbGFzcyIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBleHBlY3RlZAotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJsb2FkZXIgc2hvdWxkIG5vdCBmYWlsIGV2ZW4gaWYgcHJvamVjdCBmaW5pc2hlZCIpOworICAgICAgICAgICAgY2FuYXJ5ID0gdHJ1ZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJOb25leGlzdGVudCBjbGFzcyBmb3VuZCIsIGNhbmFyeSk7CisgICAgICAgICAgICBsb2FkZXIuY2xlYW51cCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgdG8gZmluZCB0aGlzCisgICAgICAgICAgICAgICAgbG9hZGVyLmZpbmRDbGFzcygiZnViYXIiKTsKKyAgICAgICAgICAgICAgICBjYW5hcnkgPSB0cnVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiTm9uZXhpc3RlbnQgY2xhc3MgZm91bmQiLCBjYW5hcnkpOworICAgICAgICAgICAgICAgIC8vIHRlbGwgdGhlIGJ1aWxkIGl0IGlzIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5maXJlQnVpbGRGaW5pc2hlZChudWxsKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBleHBlY3QgdG8gZmluZCB0aGlzCisgICAgICAgICAgICAgICAgICAgIGxvYWRlci5maW5kQ2xhc3MoImZ1YmFyIik7CisgICAgICAgICAgICAgICAgICAgIGNhbmFyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIk5vbmV4aXN0ZW50IGNsYXNzIGZvdW5kIiwgY2FuYXJ5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEyOSw3ICsxMzUsNyBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicHJlcGFyZUdldFBhY2thZ2VUZXN0Iik7CiAgICAgICAgIFBhdGggbXlQYXRoID0gbmV3IFBhdGgoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CiAgICAgICAgIG15UGF0aC5zZXRMb2NhdGlvbihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmphciIpKSk7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCAiaWdub3JlIik7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRILCAiaWdub3JlIik7CiAgICAgICAgIGxvYWRlciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgic2hvdWxkIGZpbmQgY2xhc3MiLCBsb2FkZXIuZmluZENsYXNzKCJvcmcuZXhhbXBsZS5Gb28iKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoInNob3VsZCBmaW5kIHBhY2thZ2UiLApAQCAtMTQyLDcgKzE0OCw3IEBACiAgICAgICAgIFBhdGggbXlQYXRoID0gbmV3IFBhdGgoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CiAgICAgICAgIEZpbGUgdGVzdEphciA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuamFyIikpOwogICAgICAgICBteVBhdGguc2V0TG9jYXRpb24odGVzdEphcik7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCAiaWdub3JlIik7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRILCAiaWdub3JlIik7CiAgICAgICAgIGxvYWRlciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKICAgICAgICAgQ2xhc3M8Pz4gZm9vID0gbG9hZGVyLmZpbmRDbGFzcygib3JnLmV4YW1wbGUuRm9vIik7CiAgICAgICAgIFVSTCBjb2RlU291cmNlTG9jYXRpb24gPQpAQCAtMTU4LDcgKzE2NCw3IEBACiAKICAgICAgICAgUGF0aCBteVBhdGggPSBuZXcgUGF0aChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgbXlQYXRoLnNldExvY2F0aW9uKGphcik7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCAiaWdub3JlIik7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRILCAiaWdub3JlIik7CiAgICAgICAgIGxvYWRlciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKICAgICAgICAgQ2xhc3M8Pz4gZm9vID0gbG9hZGVyLmZpbmRDbGFzcygib3JnLmV4YW1wbGUuRm9vIik7CiAKQEAgLTE3MCwxOSArMTc2LDE5IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzU5MyI+Ci0gICAgICogICAgIGJ1ZyA0NzU5MywgcmVxdWVzdCB0byBsb2cgdGhlIG5hbWUgb2YgY29ycnVwdCB6aXAgZmlsZXMgZnJvbSB3aGljaAotICAgICAqICAgICBjbGFzc2VzIGNhbm5vdCBiZSBsb2FkZWQ8L2E+CisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzU5MyI+YnVnIDQ3NTkzPC9hPgorICAgICAqICAgICByZXF1ZXN0IHRvIGxvZyB0aGUgbmFtZSBvZiBjb3JydXB0IHppcCBmaWxlcyBmcm9tIHdoaWNoCisgICAgICogICAgIGNsYXNzZXMgY2Fubm90IGJlIGxvYWRlZAogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRaaXBFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFppcEV4Y2VwdGlvbigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNyZWF0ZU5vbkphciIpOwogICAgICAgICBGaWxlIGphciA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRtcC5kaXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi9mb28uamFyIik7CiAKICAgICAgICAgUGF0aCBteVBhdGggPSBuZXcgUGF0aChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgbXlQYXRoLnNldExvY2F0aW9uKGphcik7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJidWlsZC5zeXNjbGFzc3BhdGgiLCAiaWdub3JlIik7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQlVJTERfU1lTQ0xBU1NQQVRILCAiaWdub3JlIik7CiAgICAgICAgIGxvYWRlciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuY3JlYXRlQ2xhc3NMb2FkZXIobXlQYXRoKTsKICAgICAgICAgUHJpbnRTdHJlYW0gc3lzRXJyID0gU3lzdGVtLmVycjsKICAgICAgICAgdHJ5IHsKQEAgLTIwNCw4ICsyMTAsNyBAQAogICAgICAqIEFzc2VydHMgdGhhdCBnZXRSZXNvdXJjZXMgd29uJ3QgcmV0dXJuIHJlc291cmNlcyB0aGF0IGNhbm5vdCBiZQogICAgICAqIHNlZW4gYnkgQW50Q2xhc3NMb2FkZXIgYnV0IGJ5IENsYXNzTG9hZGVyLnRoaXMucGFyZW50LgogICAgICAqCi0gICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00Njc1MiI+Ci0gICAgICogICAgIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ2NzUyPC9hPgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDY3NTIiPmJ1ZyA0Njc1MjwvYT4KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgIEBUZXN0CkBAIC0yMzAsMTIgKzIzNSwzMyBAQAogICAgICAgICBhc3NlcnRGYWxzZShhY2wuZ2V0UmVzb3VyY2VzKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpLmhhc01vcmVFbGVtZW50cygpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHtAbGluayBBbnRDbGFzc0xvYWRlcn0gc3VwcG9ydHMgbXVsdGktcmVsZWFzZSBqYXIgZmlsZXMgd2hpbGUgZGVhbGluZyB3aXRoCisgICAgICogcnVudGltZSByZXNvdXJjZXMgaW4gSmF2YSA5KyBydW50aW1lIGVudmlyb25tZW50cy4KKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iYnotNjI5NTIiPmh0dHBzOi8vYnouYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NjI5NTI8L2E+CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlSZWxlYXNlSmFyKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1SSmFyIik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gYXRsZWFzdEphdmE5ID0gSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpOworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0T3V0cHV0ID0gYnVpbGRSdWxlLmdldE91dHB1dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTXVsdGktcmVsZWFzZSBqYXIgdGVzdCBkaWQgbm90IGdlbmVyYXRlIGFueSBvdXRwdXQiLCB0YXJnZXRPdXRwdXQpOworICAgICAgICBpZiAoYXRsZWFzdEphdmE5KSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiVW5leHBlY3RlZCBvdXRwdXQgZnJvbSBtdWx0aS1yZWxlYXNlIGphciB0ZXN0IGZvciBKYXZhIHJ1bnRpbWUgPj0gOSIsCisgICAgICAgICAgICAgICAgICAgIHRhcmdldE91dHB1dC5jb250YWlucygibXJqYXIgdGVzdCByZXN1bHQgPSA5IikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gbXVsdGktcmVsZWFzZSBqYXIgdGVzdCIsIHRhcmdldE91dHB1dC5jb250YWlucygibXJqYXIgdGVzdCByZXN1bHQgPSBkZWZhdWx0IikpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlMb2FkZXIgZXh0ZW5kcyBDbGFzc0xvYWRlciB7CiAgICAgICAgIHB1YmxpYyBVUkwgZ2V0UmVzb3VyY2UoU3RyaW5nIG4pIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRSZXNvdXJjZXMoU3RyaW5nIG4pIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29sbGVjdGlvblV0aWxzLkVtcHR5RW51bWVyYXRpb24oKTsKKworICAgICAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBnZXRSZXNvdXJjZXMoU3RyaW5nIG4pIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUVudW1lcmF0aW9uKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0Myw2ICsyNjksNyBAQAogICAgICAgICBHZXRQYWNrYWdlV3JhcHBlcihDbGFzc0xvYWRlciBwYXJlbnQpIHsKICAgICAgICAgICAgIHN1cGVyKHBhcmVudCk7CiAgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgUGFja2FnZSBnZXRQYWNrYWdlKFN0cmluZyBzKSB7CiAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UGFja2FnZShzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVJ1bGUuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEZpbGVSdWxlLmphdmEKaW5kZXggYTQ0NDEwOS4uNGY0MDdlYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVJ1bGUuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRGaWxlUnVsZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzUsNiArMzUsOSBAQAogICogICAgIFxAUnVsZQogICogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIHJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogICoKKyAqICAgICBcQFJ1bGUKKyAqICAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworICoKICAqICAgICBcQEJlZm9yZQogICogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICogICAgICAgICBydWxlLmNvbmZpZ3VyZVByb2plY3QoIm15L2FuZC9maWxlLnhtbCIpOwpAQCAtNDgsMTIgKzUxLDkgQEAKICAqCiAgKiAgICAgXEBUZXN0CiAgKiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKLSAqICAgICAgICAgdHJ5IHsKLSAqICAgICAgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgiZmFpbGluZ1RhcmdldCIpOwotICogICAgICAgICAgICAgZmFpbCgiVGFyZ2V0IHNob3VsZCBoYXZlIHRocm93biBhIEJ1aWxkRXhjZXB0aW9uIik7Ci0gKiAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gKiAgICAgICAgICAgICBhc3NlcnRDb250YWlucygiRXhjZXB0aW9uIGRpZCBub3QgY29udGFpbiBjb3JyZWN0IHRleHQiLCAiQ291bGQgbm90IGZpbmQgY29tcGlsZXIgb24gY2xhc3NwYXRoIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAqICAgICAgICAgfQorICogICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAqICAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNvdWxkIG5vdCBmaW5kIGNvbXBpbGVyIG9uIGNsYXNzcGF0aCIpOworICogICAgICAgICBydWxlLmV4ZWN1dGVUYXJnZXQoImZhaWxpbmdUYXJnZXQiKTsKICAqICAgICB9CiAgKgogICogfQpAQCAtNjgsMTEgKzY4LDkgQEAKICAgICBwcml2YXRlIFN0cmluZ0J1ZmZlciBvdXRwdXRCdWZmZXI7CiAgICAgcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXJyb3JCdWZmZXI7CiAKLQotCiAgICAgLyoqCiAgICAgICogVGlkaWVzIHVwIGZvbGxvd2luZyBhIHRlc3QgZXhlY3V0aW9uLiBJZiB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQKLSAgICAgKiBwcm9qZWN0IGhhcyBhIDx0dD50ZWFyRG93bjwvdHQ+IHRhcmdldCB0aGVuIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICogcHJvamVjdCBoYXMgYSA8Y29kZT50ZWFyRG93bjwvY29kZT4gdGFyZ2V0IHRoZW4gdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICAgKiBiZSBjYWxsZWQsIG90aGVyd2lzZSB0aGlzIG1ldGhvZCB3aWxsIG5vdCBwZXJmb3JtIGFueSBhY3Rpb25zLgogICAgICAqLwogICAgIEBPdmVycmlkZQpAQCAtMTU1LDExICsxNTMsMTQgQEAKICAgICAgICAgbG9nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBmdWxsTG9nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwogICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihNYWdpY1Rlc3ROYW1lcy5URVNUX0JBU0VESVJfSUdOT1JFKSkgeworICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIpOworICAgICAgICB9CiAgICAgICAgIHByb2plY3QuaW5pdCgpOwotICAgICAgICBGaWxlIGFudEZpbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgZmlsZW5hbWUpOwotICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJhbnQucHJvY2Vzc2lkIiwgUHJvY2Vzc1V0aWwuZ2V0UHJvY2Vzc0lkKCI8UHJvY2Vzcz4iKSk7Ci0gICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoImFudC50aHJlYWRuYW1lIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOwotICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eSgiYW50LmZpbGUiLCBhbnRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgRmlsZSBhbnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpLCBmaWxlbmFtZSk7CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoTWFnaWNUZXN0TmFtZXMuVEVTVF9QUk9DRVNTX0lELCBQcm9jZXNzVXRpbC5nZXRQcm9jZXNzSWQoIjxQcm9jZXNzPiIpKTsKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShNYWdpY1Rlc3ROYW1lcy5URVNUX1RIUkVBRF9OQU1FLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUsIGFudEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICBwcm9qZWN0LmFkZEJ1aWxkTGlzdGVuZXIobmV3IEFudFRlc3RMaXN0ZW5lcihsb2dMZXZlbCkpOwogICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocHJvamVjdCwgYW50RmlsZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9CdWlsZEZpbGVUZXN0LmphdmEKaW5kZXggNTFlMmRhZC4uMTgzMjZlNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0J1aWxkRmlsZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQnVpbGRGaWxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNzEsNiArNzEsMTAgQEAKICAgICAgKiB0byBjbGVhbiB1cCBhZnRlciBlYWNoIHRlc3QuIE5vdGUgdGhhdCBubyAic2V0VXAiIHRhcmdldAogICAgICAqIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkLCBzaW5jZSBpdCdzIHRyaXZpYWwgdG8gaGF2ZSBhCiAgICAgICogdGVzdCB0YXJnZXQgZGVwZW5kIG9uIGl0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHRocm93IGFueQorICAgICAqIGV4Y2VwdGlvbiBidXQgd2UndmUgYWRkZWQgaXQgdG8gdGhlIHNpZ25hdHVyZSBzbyB0aGF0CisgICAgICogc3ViY2xhc3NlcyBjYW4gdGhyb3cgd2hhdGV2ZXIgdGhleSBuZWVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKQEAgLTE1MSw3ICsxNTUsNyBAQAogICAgICAqIEFzc2VydCB0aGF0IHRoZSBnaXZlbiBzdWJzdHJpbmcgaXMgaW4gdGhlIG91dHB1dCBtZXNzYWdlcy4KICAgICAgKgogICAgICAqIEBwYXJhbSBtZXNzYWdlIFByaW50IHRoaXMgbWVzc2FnZSBpZiB0aGUgdGVzdCBmYWlscy4gRGVmYXVsdHMgdG8KLSAgICAgKiAgICAgICAgICAgICAgICBhIG1lYW5pbmdmdWwgdGV4dCBpZiA8dHQ+bnVsbDwvdHQ+IGlzIHBhc3NlZC4KKyAgICAgKiAgICAgICAgICAgICAgICBhIG1lYW5pbmdmdWwgdGV4dCBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyBwYXNzZWQuCiAgICAgICogQHBhcmFtIHN1YnN0cmluZyBTdHJpbmcKICAgICAgKiBAc2luY2UgQW50MS43CiAgICAgICovCkBAIC0xNjcsNyArMTcxLDcgQEAKICAgICAgKiBBc3NlcnQgdGhhdCB0aGUgZ2l2ZW4gc3Vic3RyaW5nIGlzIG5vdCBpbiB0aGUgb3V0cHV0IG1lc3NhZ2VzLgogICAgICAqCiAgICAgICogQHBhcmFtIG1lc3NhZ2UgUHJpbnQgdGhpcyBtZXNzYWdlIGlmIHRoZSB0ZXN0IGZhaWxzLiBEZWZhdWx0cyB0bwotICAgICAqICAgICAgICAgICAgICAgIGEgbWVhbmluZ2Z1bCB0ZXh0IGlmIDx0dD5udWxsPC90dD4gaXMgcGFzc2VkLgorICAgICAqICAgICAgICAgICAgICAgIGEgbWVhbmluZ2Z1bCB0ZXh0IGlmIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBhc3NlZC4KICAgICAgKiBAcGFyYW0gc3Vic3RyaW5nIFN0cmluZwogICAgICAqIEBzaW5jZSBBbnQxLjcKICAgICAgKi8KQEAgLTMyMywxMiArMzI3LDE1IEBACiAgICAgICAgIGxvZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgZnVsbExvZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CisgICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oTWFnaWNUZXN0TmFtZXMuVEVTVF9CQVNFRElSX0lHTk9SRSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KE1hZ2ljTmFtZXMuUFJPSkVDVF9CQVNFRElSKTsKKyAgICAgICAgfQogICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICAgICAgRmlsZSBhbnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIGZpbGVuYW1lKTsKLSAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoImFudC5maWxlIiwgYW50RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIEZpbGUgYW50RmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY1Rlc3ROYW1lcy5URVNUX1JPT1RfRElSRUNUT1JZKSwgZmlsZW5hbWUpOworICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9GSUxFLCBhbnRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgLy8gc2V0IHR3byBuZXcgcHJvcGVydGllcyB0byBhbGxvdyB0byBidWlsZCB1bmlxdWUgbmFtZXMgd2hlbiBydW5uaW5nIG11bHRpdGhyZWFkZWQgdGVzdHMKLSAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYW50LnByb2Nlc3NpZCIsIFByb2Nlc3NVdGlsLmdldFByb2Nlc3NJZCgiPFByb2Nlc3M+IikpOwotICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJhbnQudGhyZWFkbmFtZSIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eShNYWdpY1Rlc3ROYW1lcy5URVNUX1BST0NFU1NfSUQsIFByb2Nlc3NVdGlsLmdldFByb2Nlc3NJZCgiPFByb2Nlc3M+IikpOworICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfVEhSRUFEX05BTUUsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgcHJvamVjdC5hZGRCdWlsZExpc3RlbmVyKG5ldyBBbnRUZXN0TGlzdGVuZXIobG9nTGV2ZWwpKTsKICAgICAgICAgUHJvamVjdEhlbHBlci5jb25maWd1cmVQcm9qZWN0KHByb2plY3QsIGFudEZpbGUpOwogICAgIH0KQEAgLTQwMiwxMSArNDA5LDEwIEBACiAgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7CiAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBidWlsZEV4Y2VwdGlvbiA9IGV4OwotICAgICAgICAgICAgaWYgKChudWxsICE9IG1zZykgJiYgKCFleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1zZykpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEJ1aWxkRXhjZXB0aW9uIGJlY2F1c2UgJyIgKyBjYXVzZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyB3aXRoIG1lc3NhZ2UgJyIgKyBtc2cKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIicgKGFjdHVhbCBtZXNzYWdlICciICsgZXguZ2V0TWVzc2FnZSgpICsgIicgaW5zdGVhZCkiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCB0aHJvdyBCdWlsZEV4Y2VwdGlvbiBiZWNhdXNlICciICsgY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgKyAiJyB3aXRoIG1lc3NhZ2UgJyIgKyBtc2cgKyAiJyAoYWN0dWFsIG1lc3NhZ2UgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICInIGluc3RlYWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbXNnID09IG51bGwgfHwgZXguZ2V0TWVzc2FnZSgpLmVxdWFscyhtc2cpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZTogIiArIGNhdXNlKTsKQEAgLTQyMywxMiArNDI5LDEyIEBACiAgICAgcHVibGljIHZvaWQgZXhwZWN0QnVpbGRFeGNlcHRpb25Db250YWluaW5nKFN0cmluZyB0YXJnZXQsIFN0cmluZyBjYXVzZSwgU3RyaW5nIGNvbnRhaW5zKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBleGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICBidWlsZEV4Y2VwdGlvbiA9IGV4OwotICAgICAgICAgICAgaWYgKG51bGwgIT0gY29udGFpbnMgJiYgIWV4LmdldE1lc3NhZ2UoKS5jb250YWlucyhjb250YWlucykpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZSAnIiArIGNhdXNlICsgIicgd2l0aCBtZXNzYWdlIGNvbnRhaW5pbmcgJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29udGFpbnMgKyAiJyAoYWN0dWFsIG1lc3NhZ2UgJyIgKyBleC5nZXRNZXNzYWdlKCkgKyAiJyBpbnN0ZWFkKSIpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiU2hvdWxkIHRocm93IEJ1aWxkRXhjZXB0aW9uIGJlY2F1c2UgJyIgKyBjYXVzZQorICAgICAgICAgICAgICAgICAgICArICInIHdpdGggbWVzc2FnZSBjb250YWluaW5nICciICsgY29udGFpbnMgKyAiJyAoYWN0dWFsIG1lc3NhZ2UgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV4LmdldE1lc3NhZ2UoKSArICInIGluc3RlYWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCA9PSBjb250YWlucyB8fCBleC5nZXRNZXNzYWdlKCkuY29udGFpbnMoY29udGFpbnMpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZTogIiArIGNhdXNlKTsKQEAgLTQ3MywxMCArNDc5LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhc3NlcnRQcm9wZXJ0eVVuc2V0KFN0cmluZyBwcm9wZXJ0eSkgewogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcHJvamVjdC5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgcHJvcGVydHkgIiArIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgICsgIiB0byBiZSB1bnNldCwgYnV0IGl0IGlzIHNldCB0byB0aGUgdmFsdWU6ICIgKyByZXN1bHQpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydE51bGwoIkV4cGVjdGVkIHByb3BlcnR5ICIgKyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICsgIiB0byBiZSB1bnNldCwgYnV0IGl0IGlzIHNldCB0byB0aGUgdmFsdWU6ICIgKyByZXN1bHQsIHJlc3VsdCk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvQ2FzZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9DYXNlVGVzdC5qYXZhCmluZGV4IGE0NjZlYTQuLmI1YzQ3NTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9DYXNlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9DYXNlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsOSArMjEsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFNpbXBsZSB0ZXN0cyBvZiBidWlsZCBmaWxlIHByb2Nlc3NpbmcKQEAgLTMzLDYgKzMxLDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Nhc2UueG1sIik7CkBAIC00OSwxNSArNTAsMTIgQEAKIAogICAgIC8qKgogICAgICAqIFRlc3Qgd2hldGhlciB0aGUgYnVpbGQgZmlsZSB1c2VzIGNhc2Ugd2hlbiBkZXRlcm1pbmluZwotICAgICAqIHRhc2sgbmFtZXMuCisgICAgICogdGFzayBuYW1lcy4gVGFzayBuYW1lIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS4KICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrQ2FzZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0YXNrY2FzZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGR1ZSB0byBjYXNlIHNlbnNpdGl2aXR5IG9mIG5hbWUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJUYXNrIG5hbWVzIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZSIsICJQcm9ibGVtOiBmYWlsZWQgdG8gY3JlYXRlIHRhc2sgb3IgdHlwZSBlY0hPIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlByb2JsZW06IGZhaWxlZCB0byBjcmVhdGUgdGFzayBvciB0eXBlIGVjSE8iKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRhc2tjYXNlIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0RlZmF1bHRMb2dnZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlclRlc3QuamF2YQppbmRleCAzMDNhNDRiLi5mYzk1MGMzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGVmYXVsdExvZ2dlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDcgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwpAQCAtMzYsMjEgKzM1LDE4IEBACiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd2FibGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vICM0MzM5OAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd2FibGVNZXNzYWdlKCkgeyAvLyAjNDMzOTgKICAgICAgICAgQnVpbGRFeGNlcHRpb24gYmUgPSBuZXcgQnVpbGRFeGNlcHRpb24oIm9vcHMiLCBuZXcgTG9jYXRpb24oImJ1aWxkLnhtbCIsIDEsIDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJidWlsZC54bWw6MTogb29wcyIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICBtc2coYmUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJidWlsZC54bWw6MTogb29wcyVuIiksIG1zZyhiZSwgZmFsc2UpKTsKICAgICAgICAgYmUgPSBQcm9qZWN0SGVscGVyLmFkZExvY2F0aW9uVG9CdWlsZEV4Y2VwdGlvbihiZSwgbmV3IExvY2F0aW9uKCJidWlsZC54bWwiLCAyLCAwKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAiYnVpbGQueG1sOjI6IFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgbGluZToiICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKwotICAgICAgICAgICAgICAgICJidWlsZC54bWw6MTogb29wcyIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICBtc2coYmUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJidWlsZC54bWw6MjogVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnVpbGQueG1sOjE6IG9vcHMlbiIpLCBtc2coYmUsIGZhbHNlKSk7CiAgICAgICAgIGJlID0gUHJvamVjdEhlbHBlci5hZGRMb2NhdGlvblRvQnVpbGRFeGNlcHRpb24oYmUsIG5ldyBMb2NhdGlvbigiYnVpbGQueG1sIiwgMywgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgImJ1aWxkLnhtbDozOiBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGxpbmU6IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQICsKLSAgICAgICAgICAgICAgICAiYnVpbGQueG1sOjI6IFRoZSBmb2xsb3dpbmcgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoaXMgbGluZToiICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKwotICAgICAgICAgICAgICAgICJidWlsZC54bWw6MTogb29wcyIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgImJ1aWxkLnhtbDozOiBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGlzIGxpbmU6JW4iCisgICAgICAgICAgICAgICAgICAgICAgICArICJidWlsZC54bWw6MjogVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnVpbGQueG1sOjE6IG9vcHMlbiIpLAogICAgICAgICAgICAgICAgIG1zZyhiZSwgZmFsc2UpKTsKICAgICAgICAgRXhjZXB0aW9uIHggPSBuZXcgRXhjZXB0aW9uKCJwcm9ibGVtIikgewogICAgICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50V3JpdGVyIHcpIHsKQEAgLTU4LDIxICs1NCwxNCBAQAogICAgICAgICAgICAgICAgIHcucHJpbnRsbigiICBhdCBwLkMubSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgInByb2JsZW0iICsgU3RyaW5nVXRpbHMuTElORV9TRVAgKwotICAgICAgICAgICAgICAgICIgIGF0IHAuQy5tIiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLAotICAgICAgICAgICAgICAgIG1zZyh4LCBmYWxzZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgicHJvYmxlbSVuICBhdCBwLkMubSVuIiksIG1zZyh4LCBmYWxzZSkpOworCiAgICAgICAgIGJlID0gbmV3IEJ1aWxkRXhjZXB0aW9uKHgsIG5ldyBMb2NhdGlvbigiYnVpbGQueG1sIiwgMSwgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICAgICAgImJ1aWxkLnhtbDoxOiBwcm9ibGVtIiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQICsKLSAgICAgICAgICAgICAgICAiICBhdCBwLkMubSIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICBtc2coYmUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJidWlsZC54bWw6MTogcHJvYmxlbSVuICBhdCBwLkMubSVuIiksIG1zZyhiZSwgZmFsc2UpKTsKKwogICAgICAgICBiZSA9IFByb2plY3RIZWxwZXIuYWRkTG9jYXRpb25Ub0J1aWxkRXhjZXB0aW9uKGJlLCBuZXcgTG9jYXRpb24oImJ1aWxkLnhtbCIsIDIsIDApKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICJidWlsZC54bWw6MjogVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCArCi0gICAgICAgICAgICAgICAgImJ1aWxkLnhtbDoxOiBwcm9ibGVtIiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQICsKLSAgICAgICAgICAgICAgICAiICBhdCBwLkMubSIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICBtc2coYmUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJidWlsZC54bWw6MjogVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhpcyBsaW5lOiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnVpbGQueG1sOjE6IHByb2JsZW0lbiAgYXQgcC5DLm0lbiIpLCBtc2coYmUsIGZhbHNlKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGlyZWN0b3J5U2Nhbm5lclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhCmluZGV4IDgxOWQ0ZTUuLjZkMzgxMjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXJlY3RvcnlTY2FubmVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsMTEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzSXRlbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CkBAIC0yNywxMCArMzAsMTAgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMuVG9rZW5pemVkUGF0aDsKQEAgLTUwLDE1ICs1MywxNyBAQAogICAgIC8vIGtlZXAgdHJhY2sgb2Ygd2hhdCBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgc3VwcG9ydGVkIGhlcmUuCiAgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzU3ltbGlua3MgPSBPcy5pc0ZhbWlseSgidW5peCIpOwogCisgICAgcHJpdmF0ZSBEaXJlY3RvcnlTY2FubmVyIGRzOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kaXJlY3RvcnlzY2FubmVyLnhtbCIpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7CisgICAgICAgIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYSJ9KTsKICAgICAgICAgZHMuc2NhbigpOwpAQCAtNjcsNyArNzIsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIn0pOwogICAgICAgICBkcy5zY2FuKCk7CkBAIC03OCw3ICs4Miw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zY2FuKCk7CiAgICAgICAgIGNvbXBhcmVGaWxlcyhkcywgbmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iZXRhLnhtbCIsCkBAIC04OSw3ICs5Miw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsUGF0aE1hdGNoZXNDYXNlU2Vuc2l0aXZlKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCJ9KTsKICAgICAgICAgZHMuc2NhbigpOwpAQCAtOTgsNyArMTAwLDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxQYXRoTWF0Y2hlc0Nhc2VJbnNlbnNpdGl2ZSgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvZ2FtbWEvR0FNTUEuWE1MIn0pOwpAQCAtMTA5LDcgKzExMCw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyQnV0Q2FzZUluc2Vuc2l0aXZlKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJBTFBIQS8ifSk7CiAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwpAQCAtMTIwLDExICsxMjAsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dTeW1saW5rcygpIHsKLQogICAgICAgICBhc3N1bWVUcnVlKCJDdXJyZW50IHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFN5bWxpbmtzIiwgc3VwcG9ydHNTeW1saW5rcyk7Ci0KICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJzeW1saW5rLXNldHVwIik7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworCiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS8ifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKQEAgLTEzNSw5ICsxMzMsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb2hpYml0U3ltbGlua3MoKSB7CiAgICAgICAgIGFzc3VtZVRydWUoIkN1cnJlbnQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBzdXBwb3J0c1N5bWxpbmtzKTsKLQogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hLyJ9KTsKICAgICAgICAgZHMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOwpAQCAtMTUxLDcgKzE0OCw3IEBACiAgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRmlsZXMgPSB7ImFscGhhL2JldGEvYmV0YS54bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwifTsKICAgICAgICAgU3RyaW5nW10gZXhwZWN0ZWREaXJlY3RvcmllcyA9IHsiYWxwaGEvYmV0YSIsICJhbHBoYS9iZXRhL2dhbW1hIiB9OwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JlP2EvKioiLCAiYWxwaGEvYmV0YS9nYW1tYS8ifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKQEAgLTE2Niw3ICsxNjMsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybnNEaWZmZXJJbkNhc2VTY2FubmluZ1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIiwgIkFMUEhBLyJ9KTsKICAgICAgICAgZHMuc2NhbigpOwpAQCAtMTc2LDcgKzE3Miw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuc0RpZmZlckluQ2FzZVNjYW5uaW5nSW5zZW5zaXRpdmUoKSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyIsICJBTFBIQS8ifSk7CiAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwpAQCAtMTg3LDcgKzE4Miw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxscGF0aERpZmZlcnNJbkNhc2VTY2FubmluZ1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLCAiYWxwaGEvYmV0YS9nYW1tYS9HQU1NQS5YTUwifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKQEAgLTE5Niw3ICsxOTAsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHBhdGhEaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLCAiYWxwaGEvYmV0YS9nYW1tYS9HQU1NQS5YTUwifSk7CiAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwpAQCAtMjA2LDcgKzE5OSw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnREaWZmZXJzSW5DYXNlU2Nhbm5pbmdTZW5zaXRpdmUoKSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyIsICJBTFBIQS9iZXRhLyJ9KTsKICAgICAgICAgZHMuc2NhbigpOwpAQCAtMjE2LDcgKzIwOCw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJlbnREaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIiwgIkFMUEhBL2JldGEvIn0pOwogICAgICAgICBkcy5zZXRDYXNlU2Vuc2l0aXZlKGZhbHNlKTsKQEAgLTIyNiwyOSArMjE3LDMwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVzdCBjYXNlIGZvciBzZXRGb2xsb3dMaW5rcygpIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uYWxpdHkuCisgICAgICogVGVzdCBjYXNlIGZvciBzZXRGb2xsb3dTeW1saW5rcygpIGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uYWxpdHkuCiAgICAgICogT25seSBzdXBwb3J0cyB0ZXN0IG9uIExpbnV4IGF0IHRoZSBtb21lbnQgYmVjYXVzZSBKYXZhIGhhcwogICAgICAqIG5vIHJlYWwgbm90aW9uIG9mIHN5bWxpbmtzIGJ1aWx0IGluLCBzbyBhbiBvcy1zcGVjZmljIGNhbGwKICAgICAgKiB0byBSdW50aW1lLmV4ZWMoKSBtdXN0IGJlIG1hZGUgdG8gY3JlYXRlIGEgbGluayB0byB0ZXN0IGFnYWluc3QuCiAgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEZvbGxvd0xpbmtzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFNldEZvbGxvd1N5bWxpbmtzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChzdXBwb3J0c1N5bWxpbmtzKSB7Ci0gICAgICAgICAgICBGaWxlIGxpbmtGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzL1RoaXNJc0FMaW5rIik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oImxpbmsgZXhpc3RzIHByZS10ZXN0PyAiICsgbGlua0ZpbGUuZXhpc3RzKCkpOworICAgICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgIi4uLy4uLy4uL21haW4vb3JnL2FwYWNoZS90b29scyIpOworCisgICAgICAgICAgICBGaWxlIGxpbmtGaWxlID0gbmV3IEZpbGUoZGlyLCAiVGhpc0lzQUxpbmsiKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJsaW5rIGV4aXN0cyBwcmUtdGVzdCIsIGxpbmtGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGRpciwgImFudCIpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGFyZ2V0IGRvZXMgbm90IGV4aXN0IHByZS10ZXN0IiwgdGFyZ2V0RmlsZS5leGlzdHMoKSk7CiAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgLy8gYWRkIGNvbmRpdGlvbnMgYW5kIG1vcmUgY29tbWFuZHMgYXMgc29vbiBhcyB0aGUgbmVlZCBhcmlzZXMKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb21tYW5kID0gbmV3IFN0cmluZ1tdIHsibG4iLCAiLXMiLCAiYW50IiwgbGlua0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9OworICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbW1hbmQgPSBuZXcgU3RyaW5nW10geyJsbiIsICItcyIsIHRhcmdldEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGxpbmtGaWxlLmdldEFic29sdXRlUGF0aCgpfTsKICAgICAgICAgICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQpOwogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiMCByZXR1cm4gY29kZSBleHBlY3RlZCBmb3IgZXh0ZXJuYWwgcHJvY2VzcyIsIDAsIHByb2Nlc3Mud2FpdEZvcigpKTsKIAotICAgICAgICAgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvbWFpbi9vcmcvYXBhY2hlL3Rvb2xzIik7Ci0KLSAgICAgICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLQotICAgICAgICAgICAgICAgIC8vIGZvbGxvd0xpbmtzIHNob3VsZCBiZSB0cnVlIGJ5IGRlZmF1bHQsIGJ1dCBpZiB0aGlzIGV2ZXIKKyAgICAgICAgICAgICAgICAvLyBmb2xsb3dTeW1saW5rcyBzaG91bGQgYmUgdHJ1ZSBieSBkZWZhdWx0LCBidXQgaWYgdGhpcyBldmVyCiAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyB3ZSB3aWxsIG5lZWQgdGhpcyBsaW5lLgogICAgICAgICAgICAgICAgIGRzLnNldEZvbGxvd1N5bWxpbmtzKHRydWUpOwogCkBAIC0zMDYsNyArMjk4LDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVPbmVGaWxlKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyIqKi8qLnhtbCJ9KTsKICAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9iKnhtbCJ9KTsKQEAgLTMxNyw3ICszMDgsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZUhhc1ByZWNlZGVuY2UoKSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyoqIn0pOwogICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8qKiJ9KTsKQEAgLTMyOCw3ICszMTgsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJuYXRlSW5jbHVkZUV4Y2x1ZGUoKSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyoqIiwgImFscGhhL2JldGEvZ2FtbWEvKioifSk7CiAgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhL2JldGEvKioifSk7CkBAIC0zMzksNyArMzI4LDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUV4Y2x1ZGVJbmNsdWRlKCkgewotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8qKiIsICJhbHBoYS9iZXRhL2dhbW1hLyoqIn0pOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhLyoqIn0pOwpAQCAtMzUyLDE3ICszNDAsMjQgQEAKICAgICAgKiBUZXN0IGluc3BpcmVkIGJ5IEJ1ZyMxNDE1LgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoaWxkcmVuT2ZFeGNsdWRlZERpcmVjdG9yeSgpIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5PZlJlY3Vyc2l2ZWx5RXhjbHVkZWREaXJlY3RvcnkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiY2hpbGRyZW4tb2YtZXhjbHVkZWQtZGlyLXNldHVwIik7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworCiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpKTsKICAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvKioifSk7CiAgICAgICAgIGRzLnNldEZvbGxvd1N5bWxpbmtzKGZhbHNlKTsKICAgICAgICAgZHMuc2NhbigpOwogICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImRlbHRhL2RlbHRhLnhtbCJ9LAogICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyIiLCAiZGVsdGEifSk7CisgICAgfQogCi0gICAgICAgIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKyAgICAvKioKKyAgICAgKiBUZXN0IGluc3BpcmVkIGJ5IEJ1ZyMxNDE1LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoaWxkcmVuT2ZFeGNsdWRlZERpcmVjdG9yeSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJjaGlsZHJlbi1vZi1leGNsdWRlZC1kaXItc2V0dXAiKTsKKwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhIn0pOwogICAgICAgICBkcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CkBAIC0zODYsMjQgKzM4MSwyMyBAQAogICAgICAgICAgICAgICAgICsgInBhY2thZ2UgcHJpdmF0ZSBtZXRob2QgY2FsbGVkIiwgc2hhcmVjbGFzc2xvYWRlciA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzaGFyZWNsYXNzbG9hZGVyLmluZGV4T2YoIiR7IikgPT0gMCk7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiY2hpbGRyZW4tb2YtZXhjbHVkZWQtZGlyLXNldHVwIik7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAKKyAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSkpOwogICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyIqKi9nYW1tYS8qKiJ9KTsKICAgICAgICAgZHMuc2V0Rm9sbG93U3ltbGlua3MoZmFsc2UpOwogICAgICAgICBkcy5zY2FuKCk7CiAgICAgICAgIFNldDxTdHJpbmc+IHNldCA9IGRzLmdldFNjYW5uZWREaXJzKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJlbXB0eSBzZXQiLCBzZXQuaXNFbXB0eSgpKTsKICAgICAgICAgU3RyaW5nIHMgPSAiYWxwaGEvYmV0YS9nYW1tYS8iLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICBhc3NlcnRGYWxzZSgic2Nhbm5lZCAiICsgcywgc2V0LmNvbnRhaW5zKHMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic2Nhbm5lZCAiICsgcywgc2V0LCBub3QoaGFzSXRlbShzKSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlMSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJleHRlbmRlZC1zZXR1cCIpOwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgU3RyaW5nIHRtcGRpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLnJlcGxhY2UoCi0gICAgICAgICAgICAgICAgRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOworCisgICAgICAgIFN0cmluZyB0bXBkaXIgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKQorICAgICAgICAgICAgICAgIC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHt0bXBkaXIgKyAiLyoqLyoifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKICAgICAgICAgY29tcGFyZUZpbGVzKGRzLApAQCAtNDE4LDcgKzQxMiw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZTIoKSB7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8qKiIsICJhbHBoYS9iZXRhL2dhbW1hLyoqIn0pOwogICAgICAgICBkcy5zY2FuKCk7CiAgICAgICAgIFN0cmluZ1tdIG10ID0gbmV3IFN0cmluZ1swXTsKQEAgLTQyOCw3ICs0MjEsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlMygpIHsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJleHRlbmRlZC1zZXR1cCIpOwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKKwogICAgICAgICBTdHJpbmcgdG1wZGlyID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikucmVwbGFjZSgKICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7dG1wZGlyICsgIi8qKi8qIn0pOwpAQCAtNDQ1LDcgKzQzOCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzb2x1dGU0KCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImV4dGVuZGVkLXNldHVwIik7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworCiAgICAgICAgIFN0cmluZyB0bXBkaXIgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKS5yZXBsYWNlKAogICAgICAgICAgICAgICAgIEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHt0bXBkaXIgKyAiL2FscGhhL2JldGEvKiovKiIsIHRtcGRpciArICIvZGVsdGEvKiJ9KTsKQEAgLTQ2Miw3ICs0NTUsNyBAQAogICAgICAgICAvL3Rlc3RpbmcgZHJpdmUgbGV0dGVyIHNlYXJjaCBmcm9tIHJvb3Q6CiAgICAgICAgIGFzc3VtZVRydWUoIkNhbid0IHVzZSBkcml2ZSBsZXR0ZXJzIG9uIG5vbiBET1Mgb3IgTmV0d2FyZSBzeXN0ZW1zIiwKICAgICAgICAgICAgICAgICBPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSk7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHMgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOworCiAgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpLnRvVXBwZXJDYXNlKCkgKyAiKiI7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7cGF0dGVybn0pOwogICAgICAgICBkcy5zY2FuKCk7CkBAIC00ODAsNTYgKzQ3Myw0NSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImRpcmVjdG9yaWVzIHByZXNlbnQ6ICIsIGV4cGVjdGVkRGlyZWN0b3JpZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWREaXJlY3Rvcmllcy5sZW5ndGgpOwogCi0gICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBmaWxlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgaW5jbHVkZWRGaWxlIDogaW5jbHVkZWRGaWxlcykgewotICAgICAgICAgICAgZmlsZXMuYWRkKGluY2x1ZGVkRmlsZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7Ci0gICAgICAgIH0KLSAgICAgICAgVHJlZVNldDxTdHJpbmc+IGRpcmVjdG9yaWVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlZERpcmVjdG9yeSA6IGluY2x1ZGVkRGlyZWN0b3JpZXMpIHsKLSAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFkZChpbmNsdWRlZERpcmVjdG9yeS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSk7Ci0gICAgICAgIH0KKyAgICAgICAgVHJlZVNldDxTdHJpbmc+IGZpbGVzID0gQXJyYXlzLnN0cmVhbShpbmNsdWRlZEZpbGVzKQorICAgICAgICAgICAgICAgIC5tYXAoaW5jbHVkZWRGaWxlIC0+IGluY2x1ZGVkRmlsZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihUcmVlU2V0OjpuZXcpKTsKIAotICAgICAgICBTdHJpbmcgY3VycmVudGZpbGU7Ci0gICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaSA9IGZpbGVzLml0ZXJhdG9yKCk7CisgICAgICAgIFRyZWVTZXQ8U3RyaW5nPiBkaXJlY3RvcmllcyA9IEFycmF5cy5zdHJlYW0oaW5jbHVkZWREaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAubWFwKGluY2x1ZGVkRGlyZWN0b3J5IC0+IGluY2x1ZGVkRGlyZWN0b3J5LnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKFRyZWVTZXQ6Om5ldykpOworCiAgICAgICAgIGludCBjb3VudGVyID0gMDsKLSAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBjdXJyZW50ZmlsZSA9IGkubmV4dCgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZXNbY291bnRlcl0sIGN1cnJlbnRmaWxlKTsKLSAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgZm9yIChTdHJpbmcgY3VycmVudEZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZXNbY291bnRlcisrXSwgY3VycmVudEZpbGUpOwogICAgICAgICB9Ci0gICAgICAgIFN0cmluZyBjdXJyZW50ZGlyZWN0b3J5OwotICAgICAgICBJdGVyYXRvcjxTdHJpbmc+IGRpcml0ID0gZGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsKICAgICAgICAgY291bnRlciA9IDA7Ci0gICAgICAgIHdoaWxlIChkaXJpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIGN1cnJlbnRkaXJlY3RvcnkgPSBkaXJpdC5uZXh0KCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWREaXJlY3Rvcmllc1tjb3VudGVyXSwgY3VycmVudGRpcmVjdG9yeSk7Ci0gICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIGZvciAoU3RyaW5nIGN1cnJlbnREaXJlY3RvcnkgOiBkaXJlY3RvcmllcykgeworICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZERpcmVjdG9yaWVzW2NvdW50ZXIrK10sIGN1cnJlbnREaXJlY3RvcnkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlRXhjbHVkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CisgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZUV4Y2x1ZGVzKCkgewogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKSk7CiAgICAgICAgIGRzLnNldEV4Y2x1ZGVzKG5ldyBTdHJpbmdbXSB7IioqL2JldGEvKioifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IGRpcnMgPSBBcnJheXMuYXNMaXN0KGRzLmdldEV4Y2x1ZGVkRGlyZWN0b3JpZXMoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBkaXJzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImJldGEgaXMgZXhjbHVkZWQiLCBkaXJzLmNvbnRhaW5zKCJhbHBoYS9iZXRhIgotICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJnYW1tYSBpcyBleGNsdWRlZCIsIGRpcnMuY29udGFpbnMoImFscGhhL2JldGEvZ2FtbWEiCi0gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoImJldGEgaXMgZXhjbHVkZWQiLCBkaXJzLAorICAgICAgICAgICAgICAgIGhhc0l0ZW0oImFscGhhL2JldGEiLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoImdhbW1hIGlzIGV4Y2x1ZGVkIiwgZGlycywKKyAgICAgICAgICAgICAgICBoYXNJdGVtKCJhbHBoYS9iZXRhL2dhbW1hIi5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSkpOwogICAgICAgICBMaXN0PFN0cmluZz4gZmlsZXMgPSBBcnJheXMuYXNMaXN0KGRzLmdldEV4Y2x1ZGVkRmlsZXMoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCBmaWxlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJiZXRhLnhtbCBpcyBleGNsdWRlZCIsIGZpbGVzLmNvbnRhaW5zKCJhbHBoYS9iZXRhL2JldGEueG1sIgotICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJnYW1tYS54bWwgaXMgZXhjbHVkZWQiLCBmaWxlcy5jb250YWlucygiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiCi0gICAgICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoImJldGEueG1sIGlzIGV4Y2x1ZGVkIiwgZmlsZXMsCisgICAgICAgICAgICAgICAgaGFzSXRlbSgiYWxwaGEvYmV0YS9iZXRhLnhtbCIucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZ2FtbWEueG1sIGlzIGV4Y2x1ZGVkIiwgZmlsZXMsCisgICAgICAgICAgICAgICAgaGFzSXRlbSgiYWxwaGEvYmV0YS9nYW1tYS9nYW1tYS54bWwiLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudHNFeGNsdWRlZCgpIHsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG5ldyBEaXJlY3RvcnlTY2FubmVyKCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoIi4iKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7IioqIn0pOwogICAgICAgICBkcy5hZGREZWZhdWx0RXhjbHVkZXMoKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXNwYXRjaFRhc2tUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRGlzcGF0Y2hUYXNrVGVzdC5qYXZhCmluZGV4IGM2ODIwOTMuLmZjZDZmMmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EaXNwYXRjaFRhc2tUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0Rpc3BhdGNoVGFza1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE3ICsxOCwxOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgRGlzcGF0Y2hUYXNrVGVzdCB7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2Rpc3BhdGNoL2Rpc3BhdGNoLnhtbCIpOwpAQCAtMzYsMTEgKzM4LDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERpc3AoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZGlzcCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9GSVhNRSB0aGUgcHJldmlvdXMgbWV0aG9kIHVzZWQgaGVyZSBpZ25vcmVkIHRoZSBidWlsZCBleGNlcHRpb24gLSB3aGF0IGFyZSB3ZSB0cnlpbmcgdG8gdGVzdAotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgibGlzdCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZGlzcCIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teU1haWxTZXJ2ZXIuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teU1haWxTZXJ2ZXIuamF2YQppbmRleCAzZmM2NmYzLi5kYzdkZmY2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlNYWlsU2VydmVyLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15TWFpbFNlcnZlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza0Fic3RyYWN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrQWJzdHJhY3QuamF2YQppbmRleCAxOGZlMDlkLi43MGRkODdkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrQWJzdHJhY3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrQWJzdHJhY3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tJbnRlcmZhY2UuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tJbnRlcmZhY2UuamF2YQppbmRleCA4YWU1ZjViLi4wMjViZWRiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrSW50ZXJmYWNlLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza0ludGVyZmFjZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza09rLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrT2suamF2YQppbmRleCBmZjhmZGFiLi42ZGNlODBiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrT2suamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrT2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tPa05vblRhc2suamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tPa05vblRhc2suamF2YQppbmRleCAyMzRhYmQ2Li4yYjA4NWUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrT2tOb25UYXNrLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza09rTm9uVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhOb25QdWJsaWNFeGVjdXRlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUuamF2YQppbmRleCA3NjYyODNkLi4zYWU1NDM3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblB1YmxpY0V4ZWN1dGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRoTm9uVm9pZEV4ZWN1dGUuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRoTm9uVm9pZEV4ZWN1dGUuamF2YQppbmRleCA4NzZiOWI3Li42YTdmMDg2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aE5vblZvaWRFeGVjdXRlLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhOb25Wb2lkRXhlY3V0ZS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXREZWZhdWx0Q29uc3RydWN0b3IuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRob3V0RGVmYXVsdENvbnN0cnVjdG9yLmphdmEKaW5kZXggNDA2NjFmNS4uNWI3N2EwOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXREZWZhdWx0Q29uc3RydWN0b3IuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dERlZmF1bHRDb25zdHJ1Y3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXRFeGVjdXRlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUuamF2YQppbmRleCA2ZDVlYTAwLi45OTFiYTAyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dEV4ZWN1dGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRob3V0UHVibGljQ29uc3RydWN0b3IuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9EdW1teVRhc2tXaXRob3V0UHVibGljQ29uc3RydWN0b3IuamF2YQppbmRleCAwZWM0ZmY4Li5hYWRmYTI2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRHVtbXlUYXNrV2l0aG91dFB1YmxpY0NvbnN0cnVjdG9yLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0R1bW15VGFza1dpdGhvdXRQdWJsaWNDb25zdHJ1Y3Rvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4ZWN1dG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4ZWN1dG9yVGVzdC5qYXZhCmluZGV4IGIxNzU1NGMuLmU5NmYyMDkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeGVjdXRvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRXhlY3V0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwzNCArMTksMzcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBFeGVjdXRvciB0ZXN0cwogICovCiBwdWJsaWMgY2xhc3MgRXhlY3V0b3JUZXN0IGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciAgewogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9DSEVDSwotICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuU2luZ2xlQ2hlY2tFeGVjdXRvciI7CisgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuU2luZ2xlQ2hlY2tFeGVjdXRvciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9ERVBTCi0gICAgICAgID0gIm9yZy5hcGFjaGUudG9vbHMuYW50LmhlbHBlci5JZ25vcmVEZXBlbmRlbmNpZXNFeGVjdXRvciI7CisgICAgICAgICAgICA9ICJvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIuSWdub3JlRGVwZW5kZW5jaWVzRXhlY3V0b3IiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVjdG9yPFN0cmluZz4gVEFSR0VUX05BTUVTOwogICAgIHN0YXRpYyB7Ci0gICAgICAgIFRBUkdFVF9OQU1FUyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOworICAgICAgICBUQVJHRVRfTkFNRVMgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgVEFSR0VUX05BTUVTLmFkZCgiYSIpOwogICAgICAgICBUQVJHRVRfTkFNRVMuYWRkKCJiIik7CiAgICAgfQogCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwotCiAgICAgcHJpdmF0ZSBpbnQgdGFyZ2V0Q291bnQ7CiAKICAgICAvKiBCdWlsZExpc3RlbmVyIHN0dWZmICovCkBAIC04OSw3ICs5Miw3IEBACiAKICAgICBwcml2YXRlIFByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgZSwgYm9vbGVhbiBmLCBib29sZWFuIGspIHsKICAgICAgICAgUHJvamVjdCBwID0gYnVpbGRSdWxlLmdldFByb2plY3QoKTsKLSAgICAgICAgcC5zZXROZXdQcm9wZXJ0eSgiYW50LmV4ZWN1dG9yLmNsYXNzIiwgZSk7CisgICAgICAgIHAuc2V0TmV3UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfRVhFQ1VUT1JfQ0xBU1NOQU1FLCBlKTsKICAgICAgICAgcC5zZXRLZWVwR29pbmdNb2RlKGspOwogICAgICAgICBpZiAoZikgewogICAgICAgICAgICAgcC5zZXROZXdQcm9wZXJ0eSgiZmFpbGZvbyIsICJmb28iKTsKQEAgLTExNywyMiArMTIwLDIyIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RmFpbHVyZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJmYWlsZm9vIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBnZXRQcm9qZWN0KG51bGwsIHRydWUpLmV4ZWN1dGVUYXJnZXRzKFRBUkdFVF9OQU1FUyk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgZmFpbCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZhaWxmb28iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0Q291bnQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2hlY2tGYWlsdXJlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZhaWxmb28iKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdldFByb2plY3QoU0lOR0xFX0NIRUNLLCB0cnVlKS5leGVjdXRlVGFyZ2V0cyhUQVJHRVRfTkFNRVMpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGZhaWwiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmYWlsZm9vIiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRhcmdldENvdW50KTsKICAgICAgICAgfQogICAgIH0KQEAgLTE0NSwzNiArMTQ4LDM2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwR29pbmdEZWZhdWx0KCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZhaWxmb28iKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdldFByb2plY3QobnVsbCwgdHJ1ZSwgdHJ1ZSkuZXhlY3V0ZVRhcmdldHMoVEFSR0VUX05BTUVTKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmFpbGZvbyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB0YXJnZXRDb3VudCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwR29pbmdTaW5nbGVDaGVjaygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJmYWlsZm9vIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBnZXRQcm9qZWN0KFNJTkdMRV9DSEVDSywgdHJ1ZSwgdHJ1ZSkuZXhlY3V0ZVRhcmdldHMoVEFSR0VUX05BTUVTKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmFpbGZvbyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB0YXJnZXRDb3VudCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RLZWVwR29pbmdJZ25vcmVEZXBlbmRlbmNpZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiZmFpbGZvbyIpOworICAgICAgICBWZWN0b3I8U3RyaW5nPiB0YXJnZXROYW1lcyA9IG5ldyBWZWN0b3I8PihUQVJHRVRfTkFNRVMpOworICAgICAgICAvLyBleHBsaWNpdGx5IGFkZCBmb28gZm9yIGZhaWx1cmUKKyAgICAgICAgdGFyZ2V0TmFtZXMuYWRkKDAsICJmb28iKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vZXhwbGljaXRseSBhZGQgZm9vIGZvciBmYWlsdXJlCi0gICAgICAgICAgICBWZWN0b3I8U3RyaW5nPiB0YXJnZXROYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPihUQVJHRVRfTkFNRVMpOwotICAgICAgICAgICAgdGFyZ2V0TmFtZXMuYWRkKDAsICJmb28iKTsKICAgICAgICAgICAgIGdldFByb2plY3QoSUdOT1JFX0RFUFMsIHRydWUsIHRydWUpLmV4ZWN1dGVUYXJnZXRzKHRhcmdldE5hbWVzKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmFpbGZvbyIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCB0YXJnZXRDb3VudCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRXh0ZW5kZWRUYXNrZGVmVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0V4dGVuZGVkVGFza2RlZlRlc3QuamF2YQppbmRleCBkNTQ0NGY5Li45MmQwZDc3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRXh0ZW5kZWRUYXNrZGVmVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9FeHRlbmRlZFRhc2tkZWZUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNywxNCArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwotCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIGNyZWF0ZWQgMTYtTWFyLTIwMDYgMTI6MjU6MTIKQEAgLTM1LDM0ICszMiwzNyBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvZXh0ZW5kZWQtdGFza2RlZi54bWwiKTsKICAgICB9CiAKICAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVhcmRvd24iKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biBieSBhIHN1YmNsYXNzCisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJ1biIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJleGNlcHRpb24gdGhyb3duIGJ5IHRoZSBzdWJjbGFzcyIsICJleGVjdXRpbmcgdGhlIEZvbyB0YXNrIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiZXhlY3V0aW5nIHRoZSBGb28gdGFzayIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJ1biIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGJ5IGEgc3ViY2xhc3MKKyAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSdW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJ1bjIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiZXhjZXB0aW9uIHRocm93biBieSB0aGUgc3ViY2xhc3MiLCAiZXhlY3V0aW5nIHRoZSBGb28gdGFzayIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuMigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJleGVjdXRpbmcgdGhlIEZvbyB0YXNrIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuMiIpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ZpbGVVdGlsaXRpZXMuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9GaWxlVXRpbGl0aWVzLmphdmEKaW5kZXggMzIxZDhkNC4uMmE2NGYxZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ZpbGVVdGlsaXRpZXMuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvRmlsZVV0aWxpdGllcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIApAQCAtNDYsMjAgKzQ3LDEzIEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBvbiBlcnJvciByZWFkaW5nIHRoZSBmaWxlIChub3QgZXhpc3RpbmcsIG5vdCByZWFkYWJsZSBldGMpCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRzKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIEZpbGVSZWFkZXIgcmRyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmRyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5yZWFkRnVsbHkocmRyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChyZHIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJkci5jbG9zZSgpOwotICAgICAgICAgICAgfQorICAgICAgICB0cnkgKEZpbGVSZWFkZXIgcmRyID0gbmV3IEZpbGVSZWFkZXIoZmlsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBGaWxlVXRpbHMucmVhZEZ1bGx5KHJkcik7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKLSAgICAgKiBNb2RpZmllZCB0aGUgdGltZXN0YW1wIG9uIGEgZmlsZSBzbyBpdCdzIDx0dD5zZWNvbmRzPC90dD4gZWFybGllciB0aGFuIGl0IHdhcyBiZWZvcmUuIFdoZXJlIDx0dD5maWxlPC90dD4KKyAgICAgKiBNb2RpZmllZCB0aGUgdGltZXN0YW1wIG9uIGEgZmlsZSBzbyBpdCdzIDxjb2RlPnNlY29uZHM8L2NvZGU+IGVhcmxpZXIgdGhhbiBpdCB3YXMgYmVmb3JlLiBXaGVyZSA8Y29kZT5maWxlPC9jb2RlPgogICAgICAqIGlzIGEgZGlyZWN0b3J5LCB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzIGludG8gYWxsIGNoaWxkIGZpbGVzIChhbmQgZGlyZWN0b3JpZXMpIGFuZCByZWR1Y2VzIHRoZWlyIG1vZGlmaWVkCiAgICAgICogdGltZXN0YW1wcyBieSB0aGUgc2FtZSByYW5nZSwgcmF0aGVyIHRoYW4gc2V0IGFsbCB0aW1lc3RhbXBzIHRvIHRoZSBzYW1lIHRpbWUuCiAgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgdG8gY2hhbmdlLCBvciB0aGUgZGlyZWN0b3J5IHRvIGNoYW5nZSB0aGVuIHJlY3Vyc2UgaW50bwpAQCAtNzgsOSArNzIsNyBAQAogICAgICAgICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKEZpbGUgY2hpbGQgOiBjaGlsZHJlbikgewotICAgICAgICAgICAgICAgIHJvbGxiYWNrVGltZXN0YW1wcyhjaGlsZCwgc2Vjb25kcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBcnJheXMuc3RyZWFtKGNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkIC0+IHJvbGxiYWNrVGltZXN0YW1wcyhjaGlsZCwgc2Vjb25kcykpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW1tdXRhYmxlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ltbXV0YWJsZVRlc3QuamF2YQppbmRleCBlYjhjNGNjLi5mOWYxNzg5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW1tdXRhYmxlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbW11dGFibGVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvSW5jbHVkZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5qYXZhCmluZGV4IDgwZTUzZmUuLjliYjdjZDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbmNsdWRlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTMgKzE4LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuYm90aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc1Byb3BlcnR5OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuc3RhcnRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFRlc3QgdGhlIGJ1aWxkIGZpbGUgaW5jbHVzaW9uIHVzaW5nIFhNTCBlbnRpdGllcy4KQEAgLTM1LDYgKzM4LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2Jhc2ljL2luY2x1ZGUueG1sIik7CkBAIC03Miw1OSArNzgsNDEgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXJyb3JJbkluY2x1ZGluZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBjYXVzZWQgYSBwYXJzZXIgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgcmVmZXIgdG8gYnVpbGQueG1sIiwKLSAgICAgICAgICAgICAgICAgICAgICAgImJ1aWxkLnhtbDoiLCBlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImxvY2F0aW9uIiwgaGFzUHJvcGVydHkoImZpbGVOYW1lIiwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiYnVpbGQueG1sIikpKSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkaW5nX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza0Vycm9ySW5JbmNsdWRpbmcoKSB7CisgICAgICAgIC8vIFRPRE8gdGhlIHRlc3QgYnJlYWtzIGluIElERQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChoYXNQcm9wZXJ0eSgibG9jYXRpb24iLAorICAgICAgICAgICAgICAgIGJvdGgoaGFzUHJvcGVydHkoImZpbGVOYW1lIiwgY29udGFpbnNTdHJpbmcoImJ1aWxkLnhtbCIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmQoaGFzUHJvcGVydHkoImxpbmVOdW1iZXIiLCBlcXVhbFRvKDE0KSkpKSk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKHN0YXJ0c1dpdGgoIldhcm5pbmc6IENvdWxkIG5vdCBmaW5kIGZpbGUgIikpOwogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGluZ19maWxlX3Rhc2tfZXJyb3IvYnVpbGQueG1sIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdCIpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1c2UgYSBidWlsZCBmYWlsdXJlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBzdGFydCB3aXRoIFwnV2FybmluZzogQ291bGQgbm90IGZpbmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoIldhcm5pbmc6IENvdWxkIG5vdCBmaW5kIGZpbGUgIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICArICIgc2hvdWxkIGVuZCB3aXRoIGJ1aWxkLnhtbDoxNDogIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuZW5kc1dpdGgoImJ1aWxkLnhtbDoxNDogIikpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFcnJvckluSW5jbHVkZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9pbmNsdWRlL2luY2x1ZGVkX2ZpbGVfcGFyc2VfZXJyb3IvYnVpbGQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBjYXVzZWQgYSBwYXJzZXIgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgcmVmZXIgdG8gaW5jbHVkZWRfZmlsZS54bWwiLAotICAgICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZWRfZmlsZS54bWw6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgaGFzUHJvcGVydHkoImZpbGVOYW1lIiwgY29udGFpbnNTdHJpbmcoImluY2x1ZGVkX2ZpbGUueG1sIikpKSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV9wYXJzZV9lcnJvci9idWlsZC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrRXJyb3JJbkluY2x1ZGVkKCkgeworICAgICAgICAvLyBUT0RPIHRoZSB0ZXN0IGJyZWFrcyBpbiBJREUKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICBib3RoKGhhc1Byb3BlcnR5KCJmaWxlTmFtZSIsIGNvbnRhaW5zU3RyaW5nKCJpbmNsdWRlZF9maWxlLnhtbCIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmQoaGFzUHJvcGVydHkoImxpbmVOdW1iZXIiLCBlcXVhbFRvKDIpKSkpKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2Uoc3RhcnRzV2l0aCgiV2FybmluZzogQ291bGQgbm90IGZpbmQgZmlsZSAiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2luY2x1ZGUvaW5jbHVkZWRfZmlsZV90YXNrX2Vycm9yL2J1aWxkLnhtbCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdXNlIGEgYnVpbGQgZmFpbHVyZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICsgIiBzaG91bGQgc3RhcnQgd2l0aCBcJ1dhcm5pbmc6IENvdWxkIG5vdCBmaW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNob3VsZCBlbmQgd2l0aCBpbmNsdWRlZF9maWxlLnhtbDoyOiAiLAotICAgICAgICAgICAgICAgICAgICAgICBlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiaW5jbHVkZWRfZmlsZS54bWw6MjogIikpOwotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Iik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9JbnRyb3NwZWN0aW9uSGVscGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEKaW5kZXggYzMxOGM2OC4uNTM4N2Y4NCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0ludHJvc3BlY3Rpb25IZWxwZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw3ICsyMSw5IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTMyLDEzICszNCwxNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LkNvbXBhcmlzb25GYWlsdXJlOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNQcm9wZXJ0eTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogSlVuaXQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC5JbnRyb3NwZWN0aW9uSGVscGVyLgpAQCAtNDcsNiArNTMsOSBAQAogCiBwdWJsaWMgY2xhc3MgSW50cm9zcGVjdGlvbkhlbHBlclRlc3QgewogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CiAgICAgcHJpdmF0ZSBJbnRyb3NwZWN0aW9uSGVscGVyIGloOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBwcm9qZWN0QmFzZWRpciA9IEZpbGUuc2VwYXJhdG9yOwpAQCAtNjksMTQxICs3OCwxNzEgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRUZXh0KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVGV4dCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihDb21wYXJpc29uRmFpbHVyZS5jbGFzcykpKTsKICAgICAgICAgaWguYWRkVGV4dChwLCB0aGlzLCAidGVzdCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguYWRkVGV4dChwLCB0aGlzLCAidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoInRlc3QyIHNob3VsZG5cJ3QgYmUgZXF1YWwgdG8gdGVzdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29tcGFyaXNvbkZhaWx1cmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihTdHJpbmcuY2xhc3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguYWRkVGV4dChwLCAiIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoIlN0cmluZyBkb2VzblwndCBzdXBwb3J0IGFkZFRleHQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB0aGUgdmFsdWUgc2hvdWxkIGJlIGFzc2VydGVkCi0gICAgICAgIH0KKyAgICAgICAgaWguYWRkVGV4dChwLCB0aGlzLCAidGVzdDIiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFRleHRUb1N0cmluZygpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgaWguYWRkVGV4dChwLCAiIiwgInRlc3QiKTsKKyAgICB9CisKICAgICBASWdub3JlKCJUaGlzIHNpbGVudGx5IGlnbm9yZXMgYSBidWlsZCBleGNlcHRpb24iKQorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEdldEFkZFRleHRNZXRob2QoKSB7CiAgICAgICAgIE1ldGhvZCBtID0gaWguZ2V0QWRkVGV4dE1ldGhvZCgpOwogICAgICAgICBhc3NlcnRNZXRob2QobSwgImFkZFRleHQiLCBTdHJpbmcuY2xhc3MsICJ0ZXN0IiwgImJpbmchIik7Ci0KLSAgICAgICAgaWggPSBJbnRyb3NwZWN0aW9uSGVscGVyLmdldEhlbHBlcihTdHJpbmcuY2xhc3MpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbSA9IGloLmdldEFkZFRleHRNZXRob2QoKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICB9CisgICAgICAgIEludHJvc3BlY3Rpb25IZWxwZXIuZ2V0SGVscGVyKFN0cmluZy5jbGFzcykuZ2V0QWRkVGV4dE1ldGhvZCgpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN1cHBvcnRzQ2hhcmFjdGVycygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW50cm9zcGVjdGlvbkhlbHBlclRlc3Qgc3VwcG9ydHMgYWRkVGV4dCIsCi0gICAgICAgICAgICAgICAgICAgaWguc3VwcG9ydHNDaGFyYWN0ZXJzKCkpOwotCisgICAgICAgIGFzc2VydFRydWUoIkludHJvc3BlY3Rpb25IZWxwZXJUZXN0IHN1cHBvcnRzIGFkZFRleHQiLCBpaC5zdXBwb3J0c0NoYXJhY3RlcnMoKSk7CiAgICAgICAgIGloID0gSW50cm9zcGVjdGlvbkhlbHBlci5nZXRIZWxwZXIoU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIGRvZXNuXCd0IHN1cHBvcnQgYWRkVGV4dCIsICFpaC5zdXBwb3J0c0NoYXJhY3RlcnMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJTdHJpbmcgZG9lc25cJ3Qgc3VwcG9ydCBhZGRUZXh0IiwgaWguc3VwcG9ydHNDaGFyYWN0ZXJzKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFRleHQoU3RyaW5nIHRleHQpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgdGV4dCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRmFpbDogZG9uJ3QgaGF2ZSBlbGVtZW50IHR5cGUgb25lCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JPbmUoKSB7CisgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJvbmUiKTsKKyAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IGNyZWF0ZVR3byB0YWtlcyBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvclR3bygpIHsKKyAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInR3byIpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbDogY3JlYXRlVGhyZWUgcmV0dXJucyB2b2lkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JUaHJlZSgpIHsKKyAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInRocmVlIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBjcmVhdGVGb3VyIHJldHVybnMgYXJyYXkKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvckZvdXIoKSB7CisgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJmb3VyIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBjcmVhdGVGaXZlIHJldHVybnMgcHJpbWl0aXZlIHR5cGUKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvckZpdmUoKSB7CisgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJmaXZlIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvcnMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoIm9uZSIpOwotICAgICAgICAgICAgZmFpbCgiZG9uJ3QgaGF2ZSBlbGVtZW50IHR5cGUgb25lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInR3byIpOwotICAgICAgICAgICAgZmFpbCgiY3JlYXRlVHdvIHRha2VzIGFyZ3VtZW50cyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJ0aHJlZSIpOwotICAgICAgICAgICAgZmFpbCgiY3JlYXRlVGhyZWUgcmV0dXJucyB2b2lkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImZvdXIiKTsKLSAgICAgICAgICAgIGZhaWwoImNyZWF0ZUZvdXIgcmV0dXJucyBhcnJheSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJmaXZlIik7Ci0gICAgICAgICAgICBmYWlsKCJjcmVhdGVGaXZlIHJldHVybnMgcHJpbWl0aXZlIHR5cGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDcmVhdG9yU2l4KCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgaWguZ2V0RWxlbWVudFR5cGUoInNpeCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgaWguY3JlYXRlRWxlbWVudChwLCB0aGlzLCAic2l4IikpOworICAgIH0KIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInNldmVuIik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRTZXZlbiB0YWtlcyB0d28gYXJndW1lbnRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImVpZ2h0Iik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRFaWdodCB0YWtlcyBubyBhcmd1bWVudHMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgibmluZSIpOwotICAgICAgICAgICAgZmFpbCgibmluZSByZXR1cm4gbm9uIHZvaWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgidGVuIik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRUZW4gdGFrZXMgYXJyYXkgYXJndW1lbnQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgiZWxldmVuIik7Ci0gICAgICAgICAgICBmYWlsKCJhZGRFbGV2ZW4gdGFrZXMgcHJpbWl0aXZlIGFyZ3VtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInR3ZWx2ZSIpOwotICAgICAgICAgICAgZmFpbCgibm8gcHJpbWl0aXZlIGNvbnN0cnVjdG9yIGZvciBqYXZhLmxhbmcuQ2xhc3MiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9CisgICAgLyoqCisgICAgICogRmFpbDogYWRkU2V2ZW4gdGFrZXMgdHdvIGFyZ3VtZW50cworICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDcmVhdG9yU2V2ZW4oKSB7CisgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJzZXZlbiIpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbDogYWRkRWlnaHQgdGFrZXMgbm8gYXJndW1lbnRzCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JFaWdodCgpIHsKKyAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoImVpZ2h0Iik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBhZGROaW5lIHJldHVybnMgbm9uIHZvaWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvck5pbmUoKSB7CisgICAgICAgIGloLmdldEVsZW1lbnRUeXBlKCJuaW5lIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBhZGRUZW4gdGFrZXMgYXJyYXkgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Q3JlYXRvclRlbigpIHsKKyAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInRlbiIpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgLyoqCisgICAgICogYWRkRWxldmVuIHRha2VzIHByaW1pdGl2ZSBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDcmVhdG9yRWxldmVuKCkgeworICAgICAgICBpaC5nZXRFbGVtZW50VHlwZSgiZWxldmVuIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBubyBwcmltaXRpdmUgY29uc3RydWN0b3IgZm9yIGphdmEubGFuZy5DbGFzcworICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDcmVhdG9yVHdlbHZlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKKyAgICAgICAgaWguZ2V0RWxlbWVudFR5cGUoInR3ZWx2ZSIpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JUaGlydGVlbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmdCdWZmZXIuY2xhc3MsIGloLmdldEVsZW1lbnRUeXBlKCJ0aGlydGVlbiIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgaWguY3JlYXRlRWxlbWVudChwLCB0aGlzLCAidGhpcnRlZW4iKS50b1N0cmluZygpKTsKKyAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgImZvdXJ0ZWVuIik7Ci0gICAgICAgICAgICBmYWlsKCJmb3VydGVlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIEZhaWw6IGZvdXJ0ZWVuIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDcmVhdG9yRm91cnRlZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpKSk7CisgICAgICAgIGloLmNyZWF0ZUVsZW1lbnQocCwgdGhpcywgImZvdXJ0ZWVuIik7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5jcmVhdGVFbGVtZW50KHAsIHRoaXMsICJmb3VydGVlbiIpOwotICAgICAgICAgICAgZmFpbCgiZmlmdGVlbiB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bGxQb2ludGVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQorICAgIC8qKgorICAgICAqIEZhaWw6IGZpZnRlZW4gdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENyZWF0b3JGaWZ0ZWVuKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChoYXNQcm9wZXJ0eSgiY2F1c2UiLCBpbnN0YW5jZU9mKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKSkpOworICAgICAgICBpaC5jcmVhdGVFbGVtZW50KHAsIHRoaXMsICJmaWZ0ZWVuIik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZ2V0RXhwZWN0ZWROZXN0ZWRFbGVtZW50cygpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGVsZW1NYXAgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBlbGVtTWFwID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgICAgIGVsZW1NYXAucHV0KCJzaXgiLCBTdHJpbmcuY2xhc3MpOwogICAgICAgICBlbGVtTWFwLnB1dCgidGhpcnRlZW4iLCBTdHJpbmdCdWZmZXIuY2xhc3MpOwogICAgICAgICBlbGVtTWFwLnB1dCgiZm91cnRlZW4iLCBTdHJpbmdCdWZmZXIuY2xhc3MpOwpAQCAtMjE0LDExICsyNTMsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldE5lc3RlZEVsZW1lbnRzKCkgewogICAgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZWxlbU1hcCA9IGdldEV4cGVjdGVkTmVzdGVkRWxlbWVudHMoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGloLmdldE5lc3RlZEVsZW1lbnRzKCk7Ci0gICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLSAgICAgICAgICAgIENsYXNzIGV4cGVjdCA9IChDbGFzcykgZWxlbU1hcC5nZXQobmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiK25hbWUrIiBpbiBJbnRyb3NwZWN0aW9OSGVscGVyVGVzdD8iLAorICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogQ29sbGVjdGlvbnMubGlzdChpaC5nZXROZXN0ZWRFbGVtZW50cygpKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gZXhwZWN0ID0gZWxlbU1hcC5nZXQobmFtZSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiICsgbmFtZSArICIgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3Q/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0KTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuIHR5cGUgb2YgIiArIG5hbWUsIGV4cGVjdCwgaWguZ2V0RWxlbWVudFR5cGUobmFtZSkpOwogICAgICAgICAgICAgZWxlbU1hcC5yZW1vdmUobmFtZSk7CkBAIC0yMjYsMjYgKzI2MywyMSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJGb3VuZCBhbGwiLCBlbGVtTWFwLmlzRW1wdHkoKSk7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXN0ZWRFbGVtZW50TWFwKCkgewogICAgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZWxlbU1hcCA9IGdldEV4cGVjdGVkTmVzdGVkRWxlbWVudHMoKTsKICAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGFjdHVhbE1hcCA9IGloLmdldE5lc3RlZEVsZW1lbnRNYXAoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDbGFzczw/Pj4gZW50cnkgOiBhY3R1YWxNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGVsZW1OYW1lID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgICAgICBDbGFzczw/PiBlbGVtQ2xhc3MgPSAoQ2xhc3MpIGVsZW1NYXAuZ2V0KGVsZW1OYW1lKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIgKyBlbGVtTmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3Q/IiwgZWxlbUNsYXNzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVHlwZSBvZiAiICsgZWxlbU5hbWUsIGVsZW1DbGFzcywgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFjdHVhbE1hcC5mb3JFYWNoKChlbGVtTmFtZSwgdmFsdWUpIC0+IHsKKyAgICAgICAgICAgIENsYXNzPD8+IGVsZW1DbGFzcyA9IGVsZW1NYXAuZ2V0KGVsZW1OYW1lKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIgKyBlbGVtTmFtZSArICIgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3Q/IiwgZWxlbUNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVHlwZSBvZiAiICsgZWxlbU5hbWUsIGVsZW1DbGFzcywgdmFsdWUpOwogICAgICAgICAgICAgZWxlbU1hcC5yZW1vdmUoZWxlbU5hbWUpOwotICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICBhc3NlcnRUcnVlKCJGb3VuZCBhbGwiLCBlbGVtTWFwLmlzRW1wdHkoKSk7CiAKICAgICAgICAgLy8gQ2hlY2sgaXQncyBhIHJlYWQtb25seSBtYXAuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhY3R1YWxNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgc29tZXdoZXJlIGluIGhlcmUKLSAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB9CisgICAgICAgIGFjdHVhbE1hcC5jbGVhcigpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBzb21ld2hlcmUgaW4gaGVyZQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNTcsMTIgKzI4OSwxMiBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFbGVtTWV0aG9kKFN0cmluZyBlbGVtTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcmV0dXJuVHlwZSwgQ2xhc3MgbWV0aG9kQXJnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcmV0dXJuVHlwZSwgQ2xhc3M8Pz4gbWV0aG9kQXJnKSB7CiAgICAgICAgIE1ldGhvZCBtID0gaWguZ2V0RWxlbWVudE1ldGhvZChlbGVtTmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiTWV0aG9kIG5hbWUiLCBtZXRob2ROYW1lLCBtLmdldE5hbWUoKSk7Ci0gICAgICAgIENsYXNzIGV4cGVjdGVkUmV0dXJuVHlwZSA9IChyZXR1cm5UeXBlID09IG51bGwpPyBWb2lkLlRZUEU6IHJldHVyblR5cGU7CisgICAgICAgIENsYXNzPD8+IGV4cGVjdGVkUmV0dXJuVHlwZSA9IChyZXR1cm5UeXBlID09IG51bGwpID8gVm9pZC5UWVBFIDogcmV0dXJuVHlwZTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm4gdHlwZSIsIGV4cGVjdGVkUmV0dXJuVHlwZSwgbS5nZXRSZXR1cm5UeXBlKCkpOwotICAgICAgICBDbGFzc1tdIGFyZ3MgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIENsYXNzPD8+W10gYXJncyA9IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKICAgICAgICAgaWYgKG1ldGhvZEFyZyAhPSBudWxsKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZyBDb3VudCIsIDEsIGFyZ3MubGVuZ3RoKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXJnIFR5cGUiLCBtZXRob2RBcmcsIGFyZ3NbMF0pOwpAQCAtMzEwLDcgKzM0Miw3IEBACiAgICAgcHVibGljIHZvaWQgYWRkRWxldmVuKGludCBpKSB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkVHdlbHZlKENsYXNzIGMpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRUd2VsdmUoQ2xhc3M8Pz4gYykgewogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFRoaXJ0ZWVuKFN0cmluZ0J1ZmZlciBzYikgewpAQCAtMzIxLDE0NSArMzUzLDIxNSBAQAogICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJzKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAib25lIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNldE9uZSBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0d28iLCAidGVzdCIpOwotICAgICAgICAgICAgZmFpbCgic2V0VHdvIHJldHVybnMgbm9uIHZvaWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRocmVlIiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoInNldFRocmVlIHRha2VzIG5vIGFyZ3MiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZvdXIiLCAidGVzdCIpOwotICAgICAgICAgICAgZmFpbCgic2V0Rm91ciB0YWtlcyB0d28gYXJncyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZml2ZSIsICJ0ZXN0Iik7Ci0gICAgICAgICAgICBmYWlsKCJzZXRGaXZlIHRha2VzIGFycmF5IGFyZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCi0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4IiwgInRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoIlByb2plY3QgZG9lc24ndCBoYXZlIGEgU3RyaW5nIGNvbnN0cnVjdG9yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNldmVuIiwgIjIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW4iLCAiMyIpOwotICAgICAgICAgICAgZmFpbCgiMiBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb21wYXJpc29uRmFpbHVyZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlaWdodCIsICIyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVpZ2h0IiwgIjMiKTsKLSAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSAtIGFzIGludCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2F1c2Ugb2YgZXJyb3I6ICIgKyBiZS50b1N0cmluZygpLCBiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZSIsICIyIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmUiLCAiMyIpOwotICAgICAgICAgICAgZmFpbCgiMiBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlIC0gYXMgSW50ZWdlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGVuIiwgIjIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGVuIiwgIjMiKTsKLSAgICAgICAgICAgIGZhaWwocHJvamVjdEJhc2VkaXIgKyAiMiBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvICIgKyBwcm9qZWN0QmFzZWRpciArICIzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25FcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlbGV2ZW4iLCAiMiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlbGV2ZW4iLCAib24iKTsKLSAgICAgICAgICAgIGZhaWwoIm9uIHNob3VsZG4ndCBiZSBmYWxzZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidHdlbHZlIiwgIjIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidHdlbHZlIiwgIm9uIik7Ci0gICAgICAgICAgICBmYWlsKCJvbiBzaG91bGRuJ3QgYmUgZmFsc2UiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRoaXJ0ZWVuIiwgIm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGhpcnRlZW4iLCAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlciIpOwotICAgICAgICAgICAgZmFpbCgib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdCBzaG91bGRuJ3QgYmUgZXF1YWwgdG8gb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInRoaXJ0ZWVuIiwgIm9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0MiBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZvdXJ0ZWVuIiwgIjIiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZm91cnRlZW4iLCAib24iKTsKLSAgICAgICAgICAgIGZhaWwoIjIgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSAtIGFzIFN0cmluZ0J1ZmZlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ29tcGFyaXNvbkZhaWx1cmUpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZmlmdGVlbiIsICJhYmNkIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZpZnRlZW4iLCAib24iKTsKLSAgICAgICAgICAgIGZhaWwoIm8gc2hvdWxkbid0IGJlIGVxdWFsIHRvIGEiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNpeHRlZW4iLCAiYWJjZCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJzaXh0ZWVuIiwgIm9uIik7Ci0gICAgICAgICAgICBmYWlsKCJvIHNob3VsZG4ndCBiZSBlcXVhbCB0byBhIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGJlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBBc3NlcnRpb25FcnJvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJzZXZlbnRlZW4iLCAiMTciKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW50ZWVuIiwgIjMiKTsKLSAgICAgICAgICAgIGZhaWwoIjE3IHNob3VsZG4ndCBiZSBlcXVhbHMgdG8gdGhyZWUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYmUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEFzc2VydGlvbkVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVpZ2h0dGVlbiIsICIxOCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlaWdodHRlZW4iLCAiMyIpOwotICAgICAgICAgICAgZmFpbCgiMTggc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9Ci0gICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZXRlZW4iLCAiMTkiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZXRlZW4iLCAiMyIpOwotICAgICAgICAgICAgZmFpbCgiMTkgc2hvdWxkbid0IGJlIGVxdWFscyB0byB0aHJlZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogRmFpbDogc2V0T25lIGRvZXNuJ3QgZXhpc3QKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJPbmUoKSB7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAib25lIiwgInRlc3QiKTsKKyAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQogICAgIH0KIAotICAgIHByaXZhdGUgTWFwIGdldEV4cGVjdGVkQXR0cmlidXRlcygpIHsKLSAgICAgICAgTWFwIGF0dHJNYXAgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgLyoqCisgICAgICogRmFpbDogc2V0VHdvIHJldHVybnMgbm9uIHZvaWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJUd28oKSB7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidHdvIiwgInRlc3QiKTsKKyAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IHNldFRocmVlIHRha2VzIG5vIGFyZ3MKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJUaHJlZSgpIHsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aHJlZSIsICJ0ZXN0Iik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBzZXRGb3VyIHRha2VzIHR3byBhcmdzCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlU2V0dGVyRm91cigpIHsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmb3VyIiwgInRlc3QiKTsKKyAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbDogc2V0Rml2ZSB0YWtlcyBhcnJheSBhcmcKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJGaXZlKCkgeworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZpdmUiLCAidGVzdCIpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbDogUHJvamVjdCBkb2Vzbid0IGhhdmUgYSBTdHJpbmcgY29uc3RydWN0b3IKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJTaXgoKSB7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4IiwgInRlc3QiKTsKKyAgICAgICAgLy8gVE9ETyB3ZSBzaG91bGQgYmUgYXNzZXJ0aW5nIGEgdmFsdWUgaW4gaGVyZQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IDIgc2hvdWxkbid0IGJlIGVxdWFsIHRvIHRocmVlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlU2V0dGVyU2V2ZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQ29tcGFyaXNvbkZhaWx1cmUuY2xhc3MpKSk7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW4iLCAiMiIpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInNldmVuIiwgIjMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiAyIHNob3VsZG4ndCBiZSBlcXVhbCB0byB0aHJlZSBhcyBpbnQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJFaWdodCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlaWdodCIsICIyIik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZWlnaHQiLCAiMyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IDIgc2hvdWxkbid0IGJlIGVxdWFsIHRvIHRocmVlIGFzIEludGVnZXIKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJOaW5lKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChoYXNQcm9wZXJ0eSgiY2F1c2UiLCBpbnN0YW5jZU9mKEFzc2VydGlvbkVycm9yLmNsYXNzKSkpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmUiLCAiMiIpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmUiLCAiMyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IHN0cmluZyArIDIgc2hvdWxkbid0IGJlIGVxdWFsIHRvIHN0cmluZyArIDMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJUZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpKSk7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGVuIiwgIjIiKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0ZW4iLCAiMyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IG9uIHNob3VsZG4ndCBiZSBmYWxzZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlckVsZXZlbigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJlbGV2ZW4iLCAiMiIpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImVsZXZlbiIsICJvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IG9uIHNob3VsZG4ndCBiZSBmYWxzZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlclR3ZWx2ZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0d2VsdmUiLCAiMiIpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgInR3ZWx2ZSIsICJvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Qgc2hvdWxkbid0IGJlIGVxdWFsIHRvIG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXIKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJUaGlydGVlbigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aGlydGVlbiIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0Iik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAidGhpcnRlZW4iLCAib3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdEhlbHBlciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3QyIGRvZXNuJ3QgZXhpc3QKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJUaGlydGVlbk5vbkV4aXN0ZW50Q2xhc3MoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJ0aGlydGVlbiIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0MiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IDIgc2hvdWxkbid0IGJlIGVxdWFsIHRvIHRocmVlIGFzIFN0cmluZ0J1ZmZlcgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlckZvdXJ0ZWVuKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChoYXNQcm9wZXJ0eSgiY2F1c2UiLCBpbnN0YW5jZU9mKENvbXBhcmlzb25GYWlsdXJlLmNsYXNzKSkpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgImZvdXJ0ZWVuIiwgIjIiKTsKKyAgICAgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZm91cnRlZW4iLCAib24iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiBvIHNob3VsZG4ndCBiZSBlcXVhbCB0byBhCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlU2V0dGVyRmlmdGVlbigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoImNhdXNlIiwgaW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykpKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmaWZ0ZWVuIiwgImFiY2QiKTsKKyAgICAgICAgaWguc2V0QXR0cmlidXRlKHAsIHRoaXMsICJmaWZ0ZWVuIiwgIm9uIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFpbDogbyBzaG91bGRuJ3QgYmUgZXF1YWwgdG8gYQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVNldHRlclNpeHRlZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpKSk7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4dGVlbiIsICJhYmNkIik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2l4dGVlbiIsICJvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhaWw6IDE3IHNob3VsZG4ndCBiZSBlcXVhbHMgdG8gdGhyZWUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVTZXR0ZXJTZXZlbnRlZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpKSk7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW50ZWVuIiwgIjE3Iik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAic2V2ZW50ZWVuIiwgIjMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiAxOCBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlU2V0dGVyRWlnaHRlZW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJjYXVzZSIsIGluc3RhbmNlT2YoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpKSk7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZWlnaHR0ZWVuIiwgIjE4Iik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAiZWlnaHR0ZWVuIiwgIjMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGYWlsOiAxOSBzaG91bGRuJ3QgYmUgZXF1YWxzIHRvIHRocmVlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlU2V0dGVyTmluZXRlZW4oKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24geworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChoYXNQcm9wZXJ0eSgiY2F1c2UiLCBpbnN0YW5jZU9mKEFzc2VydGlvbkVycm9yLmNsYXNzKSkpOworICAgICAgICBpaC5zZXRBdHRyaWJ1dGUocCwgdGhpcywgIm5pbmV0ZWVuIiwgIjE5Iik7CisgICAgICAgIGloLnNldEF0dHJpYnV0ZShwLCB0aGlzLCAibmluZXRlZW4iLCAiMyIpOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldEV4cGVjdGVkQXR0cmlidXRlcygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGF0dHJNYXAgPSBuZXcgSGFzaHRhYmxlPD4oKTsKICAgICAgICAgYXR0ck1hcC5wdXQoInNldmVuIiwgU3RyaW5nLmNsYXNzKTsKICAgICAgICAgYXR0ck1hcC5wdXQoImVpZ2h0IiwgSW50ZWdlci5UWVBFKTsKICAgICAgICAgYXR0ck1hcC5wdXQoIm5pbmUiLCBJbnRlZ2VyLmNsYXNzKTsKQEAgLTQ3MywxMSArNTc1LDExIEBACiAgICAgICAgIGF0dHJNYXAucHV0KCJzZXZlbnRlZW4iLCBCeXRlLlRZUEUpOwogICAgICAgICBhdHRyTWFwLnB1dCgiZWlnaHR0ZWVuIiwgU2hvcnQuVFlQRSk7CiAgICAgICAgIGF0dHJNYXAucHV0KCJuaW5ldGVlbiIsIERvdWJsZS5UWVBFKTsKKyAgICAgICAgYXR0ck1hcC5wdXQoInR3ZW50eSIsIFBhdGguY2xhc3MpOwogCiAgICAgICAgIC8qCiAgICAgICAgICAqIEpVbml0IDMuNyBhZGRzIGEgZ2V0TmFtZSBtZXRob2QgdG8gVGVzdENhc2UgLSBzbyB3ZSBub3cKLSAgICAgICAgICogaGF2ZSBhIG5hbWUgYXR0cmlidXRlIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0IGlmIHdlIHJ1bgotICAgICAgICAgKiB1bmRlciBKVW5pdCAzLjcgYnV0IG5vdCBpbiBlYXJsaWVyIHZlcnNpb25zLgorICAgICAgICAgKiBoYXZlIGEgbmFtZSBhdHRyaWJ1dGUgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3QuCiAgICAgICAgICAqCiAgICAgICAgICAqIFNpbXBseSBhZGQgaXQgaGVyZSBhbmQgcmVtb3ZlIGl0IGFmdGVyIHRoZSB0ZXN0cy4KICAgICAgICAgICovCkBAIC00ODgsMTQgKzU5MCwxMiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlcygpIHsKLSAgICAgICAgTWFwIGF0dHJNYXAgPSBnZXRFeHBlY3RlZEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgRW51bWVyYXRpb24gZSA9IGloLmdldEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgQ2xhc3MgZXhwZWN0ID0gKENsYXNzKSBhdHRyTWFwLmdldChuYW1lKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIrbmFtZSsiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsCisgICAgICAgIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBhdHRyTWFwID0gZ2V0RXhwZWN0ZWRBdHRyaWJ1dGVzKCk7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBDb2xsZWN0aW9ucy5saXN0KGloLmdldEF0dHJpYnV0ZXMoKSkpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGV4cGVjdCA9IGF0dHJNYXAuZ2V0KG5hbWUpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU3VwcG9ydCBmb3IgIiArIG5hbWUgKyAiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUgb2YgIituYW1lLCBleHBlY3QsIGloLmdldEF0dHJpYnV0ZVR5cGUobmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUeXBlIG9mICIgKyBuYW1lLCBleHBlY3QsIGloLmdldEF0dHJpYnV0ZVR5cGUobmFtZSkpOwogICAgICAgICAgICAgYXR0ck1hcC5yZW1vdmUobmFtZSk7CiAgICAgICAgIH0KICAgICAgICAgYXR0ck1hcC5yZW1vdmUoIm5hbWUiKTsKQEAgLTUwNSw2NyArNjA1LDYzIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXR0cmlidXRlTWFwKCkgewogICAgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gYXR0ck1hcCA9IGdldEV4cGVjdGVkQXR0cmlidXRlcygpOwotICAgICAgICBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gYWN0dWFsTWFwID0gaWguZ2V0QXR0cmlidXRlTWFwKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ2xhc3M8Pz4+IGVudHJ5IDogYWN0dWFsTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgQ2xhc3MgYXR0ckNsYXNzID0gKENsYXNzKSBhdHRyTWFwLmdldChhdHRyTmFtZSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJTdXBwb3J0IGZvciAiICsgYXR0ck5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIEludHJvc3BlY3Rpb25IZWxwZXJUZXN0PyIsIGF0dHJDbGFzcyk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlR5cGUgb2YgIiArIGF0dHJOYW1lLCBhdHRyQ2xhc3MsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICBpaC5nZXRBdHRyaWJ1dGVNYXAoKS5mb3JFYWNoKChhdHRyTmFtZSwgdmFsdWUpIC0+IHsKKyAgICAgICAgICAgIENsYXNzPD8+IGF0dHJDbGFzcyA9IGF0dHJNYXAuZ2V0KGF0dHJOYW1lKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIlN1cHBvcnQgZm9yICIgKyBhdHRyTmFtZSArICIgaW4gSW50cm9zcGVjdGlvbkhlbHBlclRlc3Q/IiwgYXR0ckNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVHlwZSBvZiAiICsgYXR0ck5hbWUsIGF0dHJDbGFzcywgdmFsdWUpOwogICAgICAgICAgICAgYXR0ck1hcC5yZW1vdmUoYXR0ck5hbWUpOwotICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICBhdHRyTWFwLnJlbW92ZSgibmFtZSIpOwogICAgICAgICBhc3NlcnRUcnVlKCJGb3VuZCBhbGwiLCBhdHRyTWFwLmlzRW1wdHkoKSk7CisgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJHZXRBdHRyaWJ1dGVNYXAoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBzb21ld2hlcmUgaW4gaGVyZQogICAgICAgICAvLyBDaGVjayBpdCdzIGEgcmVhZC1vbmx5IG1hcC4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGFjdHVhbE1hcC5jbGVhcigpOwotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBzb21ld2hlcmUgaW4gaGVyZQotICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIH0KKyAgICAgICAgaWguZ2V0QXR0cmlidXRlTWFwKCkuY2xlYXIoKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBdHRyaWJ1dGVNZXRob2QoKSB7CiAgICAgICAgIGFzc2VydEF0dHJNZXRob2QoInNldmVuIiwgInNldFNldmVuIiwgU3RyaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICIyIiwgIjMiKTsKKyAgICAgICAgICAgICAgICAiMiIsICIzIik7CiAgICAgICAgIGFzc2VydEF0dHJNZXRob2QoImVpZ2h0IiwgInNldEVpZ2h0IiwgSW50ZWdlci5UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIudmFsdWVPZigyKSwgSW50ZWdlci52YWx1ZU9mKDMpKTsKKyAgICAgICAgICAgICAgICAyLCAzKTsKICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgibmluZSIsICJzZXROaW5lIiwgSW50ZWdlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoMiksIEludGVnZXIudmFsdWVPZigzKSk7CisgICAgICAgICAgICAgICAgMiwgMyk7CiAgICAgICAgIGFzc2VydEF0dHJNZXRob2QoInRlbiIsICJzZXRUZW4iLCBGaWxlLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKHByb2plY3RCYXNlZGlyICsgMiksIG5ldyBGaWxlKCJ0b3RvIikpOworICAgICAgICAgICAgICAgIG5ldyBGaWxlKHByb2plY3RCYXNlZGlyICsgMiksIG5ldyBGaWxlKCJ0b3RvIikpOwogICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJlbGV2ZW4iLCAic2V0RWxldmVuIiwgQm9vbGVhbi5UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5UUlVFKTsKICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgidHdlbHZlIiwgInNldFR3ZWx2ZSIsIEJvb2xlYW4uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLCBCb29sZWFuLlRSVUUpOwogICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJ0aGlydGVlbiIsICJzZXRUaGlydGVlbiIsIENsYXNzLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuY2xhc3MsIE1hcC5jbGFzcyk7CisgICAgICAgICAgICAgICAgUHJvamVjdC5jbGFzcywgTWFwLmNsYXNzKTsKICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZm91cnRlZW4iLCAic2V0Rm91cnRlZW4iLCBTdHJpbmdCdWZmZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1ZmZlcigiMiIpLCBuZXcgU3RyaW5nQnVmZmVyKCIzIikpOworICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWZmZXIoIjIiKSwgbmV3IFN0cmluZ0J1ZmZlcigiMyIpKTsKICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgiZmlmdGVlbiIsICJzZXRGaWZ0ZWVuIiwgQ2hhcmFjdGVyLlRZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnZhbHVlT2YoJ2EnKSwgQ2hhcmFjdGVyLnZhbHVlT2YoJ2InKSk7CisgICAgICAgICAgICAgICAgJ2EnLCAnYicpOwogICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJzaXh0ZWVuIiwgInNldFNpeHRlZW4iLCBDaGFyYWN0ZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcmFjdGVyLnZhbHVlT2YoJ2EnKSwgQ2hhcmFjdGVyLnZhbHVlT2YoJ2InKSk7CisgICAgICAgICAgICAgICAgJ2EnLCAnYicpOwogICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJzZXZlbnRlZW4iLCAic2V0U2V2ZW50ZWVuIiwgQnl0ZS5UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUudmFsdWVPZigoYnl0ZSkgMTcpLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIDEwKSk7CisgICAgICAgICAgICAgICAgKGJ5dGUpIDE3LCAoYnl0ZSkgMTApOwogICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJlaWdodHRlZW4iLCAic2V0RWlnaHR0ZWVuIiwgU2hvcnQuVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydC52YWx1ZU9mKChzaG9ydCkgMTgpLCBTaG9ydC52YWx1ZU9mKChzaG9ydCkgMTApKTsKKyAgICAgICAgICAgICAgICAoc2hvcnQpIDE4LCAoc2hvcnQpIDEwKTsKICAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgibmluZXRlZW4iLCAic2V0TmluZXRlZW4iLCBEb3VibGUuVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUudmFsdWVPZigxOSksIERvdWJsZS52YWx1ZU9mKChzaG9ydCkgMTApKTsKKyAgICAgICAgICAgICAgICAxOWQsIChkb3VibGUpIChzaG9ydCkgMTApOworICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJ0d2VudHkiLCAic2V0VHdlbnR5IiwgUGF0aC5jbGFzcywKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShwcm9qZWN0QmFzZWRpciArIDIwKS50b1BhdGgoKSwgUGF0aHMuZ2V0KCJ0b3RvIikpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRBdHRyTWV0aG9kKCJvbmVodW5kcmVkIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBCdWlsZEV4Y2VwdGlvbiEiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9UT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCi0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJkb2Vzbid0IHN1cHBvcnQgdGhlIFwib25laHVuZHJlZFwiIGF0dHJpYnV0ZS4iKTsKKyAgICAgICAgYXNzZXJ0QXR0ck1ldGhvZCgib25laHVuZHJlZCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBdHRyTWV0aG9kKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbWV0aG9kQXJnLCBPYmplY3QgYXJnLCBPYmplY3QgYmFkQXJnKSB7Ci0gICAgICAgIE1ldGhvZCBtID0gaWguZ2V0QXR0cmlidXRlTWV0aG9kKGF0dHJOYW1lKTsKLSAgICAgICAgYXNzZXJ0TWV0aG9kKG0sIG1ldGhvZE5hbWUsIG1ldGhvZEFyZywgYXJnLCBiYWRBcmcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IG1ldGhvZEFyZywgT2JqZWN0IGFyZywgT2JqZWN0IGJhZEFyZykgeworICAgICAgICBhc3NlcnRNZXRob2QoaWguZ2V0QXR0cmlidXRlTWV0aG9kKGF0dHJOYW1lKSwgbWV0aG9kTmFtZSwgbWV0aG9kQXJnLCBhcmcsIGJhZEFyZyk7CiAgICAgfQogCiAgICAgcHVibGljIGludCBzZXRUd28oU3RyaW5nIHMpIHsKQEAgLTYwOSwxNCArNzA1LDE0IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0RWxldmVuKGJvb2xlYW4gYikgewotICAgICAgICBhc3NlcnRUcnVlKCFiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgc2V0VHdlbHZlKEJvb2xlYW4gYikgewotICAgICAgICBhc3NlcnRUcnVlKCFiLmJvb2xlYW5WYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0VGhpcnRlZW4oQ2xhc3MgYykgeworICAgIHB1YmxpYyB2b2lkIHNldFRoaXJ0ZWVuKENsYXNzPD8+IGMpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFByb2plY3QuY2xhc3MsIGMpOwogICAgIH0KIApAQCAtNjQ1LDkgKzc0MSwyMSBAQAogICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCAxOSwgcmVjZWl2ZWQgIiArIGQsIGRpZmYgPiAtMWUtNiAmJiBkaWZmIDwgMWUtNik7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0VHdlbnR5KFBhdGggcCkgeworICAgICAgICBTdHJpbmcgcGF0aCA9IHAudG9BYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpOworICAgICAgICBpZiAoT3MuaXNGYW1pbHkoInVuaXgiKSB8fCBPcy5pc0ZhbWlseSgib3BlbnZtcyIpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdEJhc2VkaXIgKyAiMjAiLCBwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdEJhc2VkaXIgKyAiMjAiLCBwYXRoLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6IiArIHByb2plY3RCYXNlZGlyICsgIjIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEV4dGVuc2lvblBvaW50cygpIHsKLSAgICAgICAgTGlzdCBleHRlbnNpb25zID0gaWguZ2V0RXh0ZW5zaW9uUG9pbnRzKCk7CisgICAgICAgIExpc3Q8TWV0aG9kPiBleHRlbnNpb25zID0gaWguZ2V0RXh0ZW5zaW9uUG9pbnRzKCk7CiAgICAgICAgIGZpbmFsIGludCBhZGRlcnMgPSAyOwogICAgICAgICBhc3NlcnRFcXVhbHMoImV4dGVuc2lvbiBjb3VudCIsIGFkZGVycywgZXh0ZW5zaW9ucy5zaXplKCkpOwogCkBAIC02NTgsNTEgKzc2Niw0MSBAQAogICAgICAgICAvLyBjb21iaW5hdG9yaWNzIGFyZSB0b28gaGFyZCB0byBjaGVjay4gIFdlIHJlYWxseSBvbmx5IHdhbnQKICAgICAgICAgLy8gdG8gZW5zdXJlIHRoYXQgdGhlIG1vcmUgZGVyaXZlZCBIYXNodGFibGUgY2FuIGJlIGZvdW5kCiAgICAgICAgIC8vIGJlZm9yZSBNYXAuCi0vLyAgICAgICAgYXNzZXJ0RXh0TWV0aG9kKGV4dGVuc2lvbnMuZ2V0KDApLCAiYWRkIiwgTnVtYmVyLmNsYXNzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZWdlcigyKSwgbmV3IEludGVnZXIoMykpOworICAgICAgICAvLyBhc3NlcnRNZXRob2QoZXh0ZW5zaW9ucy5nZXQoMCksICJhZGQiLCBOdW1iZXIuY2xhc3MsIG5ldyBJbnRlZ2VyKDIpLCBuZXcgSW50ZWdlcigzKSk7CiAKICAgICAgICAgLy8gYWRkQ29uZmlndXJlZChIYXNodGFibGUpIHNob3VsZCBjb21lIGJlZm9yZSBhZGRDb25maWd1cmVkKE1hcCkKLSAgICAgICAgYXNzZXJ0RXh0TWV0aG9kKGV4dGVuc2lvbnMuZ2V0KGFkZGVycyAtIDIpLAorICAgICAgICBhc3NlcnRNZXRob2QoZXh0ZW5zaW9ucy5nZXQoYWRkZXJzIC0gMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkQ29uZmlndXJlZCIsIEhhc2h0YWJsZS5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VUYWJsZSgia2V5IiwgInZhbHVlIiksIG1ha2VUYWJsZSgiMSIsICIyIikpOwogCi0gICAgICAgIGFzc2VydEV4dE1ldGhvZChleHRlbnNpb25zLmdldChhZGRlcnMgLSAxKSwgImFkZENvbmZpZ3VyZWQiLCBNYXAuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSGFzaE1hcCgpLCBtYWtlVGFibGUoIjEiLCAiMiIpKTsKKyAgICAgICAgYXNzZXJ0TWV0aG9kKGV4dGVuc2lvbnMuZ2V0KGFkZGVycyAtIDEpLCAiYWRkQ29uZmlndXJlZCIsIE1hcC5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBtYWtlVGFibGUoIjEiLCAiMiIpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXh0TWV0aG9kKE9iamVjdCBtbywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzIG1ldGhvZEFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhcmcsIE9iamVjdCBiYWRBcmcpIHsKLSAgICAgICAgYXNzZXJ0TWV0aG9kKChNZXRob2QpIG1vLCBtZXRob2ROYW1lLCBtZXRob2RBcmcsIGFyZywgYmFkQXJnKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TWV0aG9kKE1ldGhvZCBtLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3MgbWV0aG9kQXJnLAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNZXRob2QoTWV0aG9kIG0sIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBtZXRob2RBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgYXJnLCBPYmplY3QgYmFkQXJnKSB7CiAgICAgICAgIGFzc2VydEVxdWFscygiTWV0aG9kIG5hbWUiLCBtZXRob2ROYW1lLCBtLmdldE5hbWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiUmV0dXJuIHR5cGUiLCBWb2lkLlRZUEUsIG0uZ2V0UmV0dXJuVHlwZSgpKTsKLSAgICAgICAgQ2xhc3NbXSBhcmdzID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBDbGFzczw/PltdIGFyZ3MgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQXJnIENvdW50IiwgMSwgYXJncy5sZW5ndGgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkFyZyBUeXBlIiwgbWV0aG9kQXJnLCBhcmdzWzBdKTsKIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5pbnZva2UodGhpcywgbmV3IE9iamVjdFtdIHsgYXJnIH0pOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbihlKTsKLSAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBtLmludm9rZSh0aGlzLCBhcmcpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAogICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5pbnZva2UodGhpcywgbmV3IE9iamVjdFtdIHsgYmFkQXJnIH0pOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGFuIGFzc2VydGlvbiBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIG0uaW52b2tlKHRoaXMsIGJhZEFyZyk7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGUpOwogICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodC50b1N0cmluZygpLCB0IGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChlLCBoYXNQcm9wZXJ0eSgiY2F1c2UiLCBpbnN0YW5jZU9mKEFzc2VydGlvbkVycm9yLmNsYXNzKSkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIExpc3QgYWRkKExpc3QgbCkgeworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gYWRkKExpc3Q8T2JqZWN0PiBsKSB7CiAgICAgICAgIC8vIElOVkFMSUQgZXh0ZW5zaW9uIHBvaW50CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KQEAgLTcxMywyNSArODExLDI0IEBACiAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG4uaW50VmFsdWUoKSk7CiAvLyAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGQoTGlzdCBsLCBpbnQgaSkgeworICAgIHB1YmxpYyB2b2lkIGFkZChMaXN0PE9iamVjdD4gbCwgaW50IGkpIHsKICAgICAgICAgLy8gSU5WQUxJRCBleHRlbnNpb24gcG9pbnQKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKE1hcCBtKSB7CisgICAgcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZChNYXA8T2JqZWN0LCBPYmplY3Q+IG0pIHsKICAgICAgICAgLy8gVmFsaWQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgIGFzc2VydFRydWUobS5zaXplKCkgPT0gMCk7CisgICAgICAgIGFzc2VydFRydWUobS5pc0VtcHR5KCkpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWQoSGFzaHRhYmxlIGgpIHsKKyAgICBwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkKEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gaCkgewogICAgICAgICAvLyBWYWxpZCBleHRlbnNpb24gcG9pbnQsIG1vcmUgZGVyaXZlZCB0aGFuIE1hcCBhYm92ZSwgYnV0ICphZnRlciogaXQhCiAgICAgICAgIGFzc2VydEVxdWFscyhtYWtlVGFibGUoImtleSIsICJ2YWx1ZSIpLCBoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEhhc2h0YWJsZSBtYWtlVGFibGUoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gbWFrZVRhYmxlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHRhYmxlID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgICAgIHRhYmxlLnB1dChrZXksIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIHRhYmxlOwogICAgIH0KIAotfSAvLyBJbnRyb3NwZWN0aW9uSGVscGVyVGVzdAotCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTG9hZGVyUmVmVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0xvYWRlclJlZlRlc3QuamF2YQppbmRleCA2NjgxNzBiLi40OTc4MjhhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTG9hZGVyUmVmVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2FkZXJSZWZUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMiArMTgsMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqLwpAQCAtMzIsNiArMzAsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvbG9hZGVycmVmL2xvYWRlcnJlZi54bWwiKTsKQEAgLTQxLDExICs0Miw4IEBACiAgICAgLy8gb3ZlcnJpZGUgYWxsb3dlZCBvbiA8YXZhaWxhYmxlPgogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhZFJlZigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0YmFkcmVmIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZFJ1bGUgc2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiBkdWUgdG8gYSBiYWQgY2xhc3Nsb2FkZXIgYmVpbmcgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiU2hvdWxkIGZhaWwgZHVlIHRvIHJlZiBub3QgYmVpbmcgYSBjbGFzcyBsb2FkZXIiLCAiZG9lcyBub3QgcmVmZXJlbmNlIGEgY2xhc3MgbG9hZGVyIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImRvZXMgbm90IHJlZmVyZW5jZSBhIGNsYXNzIGxvYWRlciIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdGJhZHJlZiIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Mb2NhdGlvblRlc3QuamF2YQppbmRleCBjYTdmOWIxLi4wNzg4MzgwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTG9jYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L0xvY2F0aW9uVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsOSArMjUsMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIExvY2F0aW9uVGVzdCB7CiAKQEAgLTQyLDE3ICs0NCwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBsYWluVGFzaygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQbGFpblRhc2siKTsKLSAgICAgICAgRWNobyBlID0gKEVjaG8pIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJlY2hvIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGUuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZS5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSA9PSAwKTsKKyAgICAgICAgRWNobyBlID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImVjaG8iKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShlLmdldExvY2F0aW9uKCksIExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoMCwgZS5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhbG9uZVR5cGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U3RhbmRhbG9uZVR5cGUiKTsKLSAgICAgICAgRWNobyBlID0gKEVjaG8pIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJlY2hvMiIpOwotICAgICAgICBGaWxlU2V0IGYgPSAoRmlsZVNldCkgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImZzIik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGYuZ2V0TG9jYXRpb24oKSA9PSBMb2NhdGlvbi5VTktOT1dOX0xPQ0FUSU9OKTsKKyAgICAgICAgRWNobyBlID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImVjaG8yIik7CisgICAgICAgIEZpbGVTZXQgZiA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmcyIpOworICAgICAgICBhc3NlcnROb3RTYW1lKGYuZ2V0TG9jYXRpb24oKSwgTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTik7CiAgICAgICAgIGFzc2VydEVxdWFscyhlLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpICsgMSwKICAgICAgICAgICAgICAgICAgICAgIGYuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkpOwogICAgIH0KQEAgLTYwLDI2ICs2MiwyNiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvblRhc2soKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q29uZGl0aW9uVGFzayIpOwotICAgICAgICBUYXNrQWRhcHRlciB0YSA9IChUYXNrQWRhcHRlcikgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImNvbmQiKTsKKyAgICAgICAgVGFza0FkYXB0ZXIgdGEgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiY29uZCIpOwogICAgICAgICBDb25kaXRpb25UYXNrIGMgPSAoQ29uZGl0aW9uVGFzaykgdGEuZ2V0UHJveHkoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYy5nZXRMb2NhdGlvbigpID09IExvY2F0aW9uLlVOS05PV05fTE9DQVRJT04pOwotICAgICAgICBhc3NlcnRGYWxzZShjLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpID09IDApOworICAgICAgICBhc3NlcnROb3RTYW1lKGMuZ2V0TG9jYXRpb24oKSwgTG9jYXRpb24uVU5LTk9XTl9MT0NBVElPTik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygwLCBjLmdldExvY2F0aW9uKCkuZ2V0TGluZU51bWJlcigpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYWNyb2RlZldyYXBwZWRUYXNrKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1hY3JvZGVmV3JhcHBlZFRhc2siKTsKLSAgICAgICAgRWNobyBlID0gKEVjaG8pIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJlY2hvMyIpOwotICAgICAgICBhc3NlcnRUcnVlKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiTGluZTogIgotICAgICAgICAgICAgICAgICsgKGUuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkgKyAxKSkpOworICAgICAgICBFY2hvIGUgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZWNobzMiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkxpbmU6ICIgKyAoZS5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSArIDEpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlc2V0ZGVmV3JhcHBlZFRhc2soKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UHJlc2V0ZGVmV3JhcHBlZFRhc2siKTsKLSAgICAgICAgRWNobyBlID0gKEVjaG8pIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJlY2hvNCIpOwotICAgICAgICBhc3NlcnRUcnVlKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiTGluZTogIgotICAgICAgICAgICAgICAgICsgKGUuZ2V0TG9jYXRpb24oKS5nZXRMaW5lTnVtYmVyKCkgKyAxKSkpOworICAgICAgICBFY2hvIGUgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZWNobzQiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkxpbmU6ICIgKyAoZS5nZXRMb2NhdGlvbigpLmdldExpbmVOdW1iZXIoKSArIDEpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFY2hvTG9jYXRpb24gZXh0ZW5kcyBUYXNrIHsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9NYWdpY1Rlc3ROYW1lcy5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L01hZ2ljVGVzdE5hbWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2MTFiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9NYWdpY1Rlc3ROYW1lcy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OworCisvKioKKyAqIE1hZ2ljIG5hbWVzIHVzZWQgd2l0aGluIEFudCdzIHRlc3RzLgorICoKKyAqIEBzaW5jZSBBbnQgMS4xMC42CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNYWdpY1Rlc3ROYW1lcyB7CisgICAgLyoqCisgICAgICogTWFnaWMgcHJvcGVydHkgdGhhdCBtYWtlcyB1bml0IHRlc3RzIGJhc2VkIG9uIEJ1aWxkRmlsZVRlc3QKKyAgICAgKiBvciBCdWlsZEZpbGVSdWxlIGlnbm9yZSBleHRlcm5hbGx5IHNldCBiYXNlZGlyCisgICAgICogKHR5cGljYWxseSBieSBTdXJlZmlyZS9GYWlsc2FmZSkKKyAgICAgKgorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqIEBzaW5jZSBBbnQgMS4xMC42CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CQVNFRElSX0lHTk9SRSA9ICJhbnQudGVzdC5iYXNlZGlyLmlnbm9yZSI7CisKKyAgICAvKioKKyAgICAgKiBNYWdpYyBwcm9wZXJ0eSB0aGF0IG1ha2VzIHVuaXQgdGVzdHMgYmFzZWQgb24gQnVpbGRGaWxlVGVzdAorICAgICAqIG9yIEJ1aWxkRmlsZVJ1bGUgdXNlIGJ1aWxkIGZpbGVzIGluIGFsdGVybmF0aXZlIGxvY2F0aW9ucworICAgICAqIChyZWxhdGl2ZSB0byAicm9vdCIgZGlyZWN0b3J5KQorICAgICAqCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICogQHNpbmNlIEFudCAxLjEwLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1JPT1RfRElSRUNUT1JZID0gInJvb3QiOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgZm9yIGFudCBwcm9jZXNzIElEIHNldCBpbiB1bml0IHRlc3RzIGJ5IEJ1aWxkRmlsZVRlc3QKKyAgICAgKiBvciBCdWlsZEZpbGVSdWxlLgorICAgICAqCisgICAgICogVmFsdWU6IHtAdmFsdWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9DRVNTX0lEID0gImFudC5wcm9jZXNzaWQiOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgZm9yIGFudCB0aHJlYWQgbmFtZSBzZXQgaW4gdW5pdCB0ZXN0cyBieSBCdWlsZEZpbGVUZXN0CisgICAgICogb3IgQnVpbGRGaWxlUnVsZS4KKyAgICAgKgorICAgICAqIFZhbHVlOiB7QHZhbHVlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfVEhSRUFEX05BTUUgPSAiYW50LnRocmVhZG5hbWUiOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L01vY2tCdWlsZExpc3RlbmVyLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTW9ja0J1aWxkTGlzdGVuZXIuamF2YQppbmRleCA2NTQ4NzJjLi40MzVlOTZjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTW9ja0J1aWxkTGlzdGVuZXIuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvTW9ja0J1aWxkTGlzdGVuZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE0ICsxOCwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci0KIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKIHB1YmxpYyBjbGFzcyBNb2NrQnVpbGRMaXN0ZW5lciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewogCi0gICAgcHJpdmF0ZSBmaW5hbCBWZWN0b3I8QnVpbGRFdmVudD4gYnVmZmVyID0gbmV3IFZlY3RvcjxCdWlsZEV2ZW50PigpOworICAgIHByaXZhdGUgZmluYWwgVmVjdG9yPEJ1aWxkRXZlbnQ+IGJ1ZmZlciA9IG5ldyBWZWN0b3I8PigpOwogICAgIHByaXZhdGUgZmluYWwgUHJvamVjdCBwcm9qZWN0OwogCiAgICAgcHVibGljIE1vY2tCdWlsZExpc3RlbmVyKGZpbmFsIFByb2plY3QgcHJvamVjdCkgewpAQCAtNTQsMTAgKzU1LDEwIEBACiAgICAgICAgIGlmIChhY3R1YWwuZ2V0UHJpb3JpdHkoKSA9PSBQcm9qZWN0Lk1TR19ERUJVRykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoInVuZXhwZWN0ZWQgbWVzc2FnZUxvZ2dlZDogIisgYWN0dWFsLmdldE1lc3NhZ2UoKSwgIWJ1ZmZlci5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgidW5leHBlY3RlZCBtZXNzYWdlTG9nZ2VkOiAiICsgYWN0dWFsLmdldE1lc3NhZ2UoKSwgYnVmZmVyLmlzRW1wdHkoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBwcm9qZWN0ICIsIHByb2plY3QsIGFjdHVhbC5nZXRQcm9qZWN0KCkpOwogCi0gICAgICAgIEJ1aWxkRXZlbnQgZXhwZWN0ZWQgPSAoQnVpbGRFdmVudCkgYnVmZmVyLmVsZW1lbnRBdCgwKTsKKyAgICAgICAgQnVpbGRFdmVudCBleHBlY3RlZCA9IGJ1ZmZlci5lbGVtZW50QXQoMCk7CiAgICAgICAgIGJ1ZmZlci5yZW1vdmVFbGVtZW50QXQoMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBtZXNzYWdlTG9nZ2VkICIsIGV4cGVjdGVkLmdldE1lc3NhZ2UoKSwgYWN0dWFsLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidW5leHBlY3RlZCBwcmlvcml0eSAiLCBleHBlY3RlZC5nZXRQcmlvcml0eSgpLCBhY3R1YWwuZ2V0UHJpb3JpdHkoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUGlja09uZVRhc2suamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QaWNrT25lVGFzay5qYXZhCmluZGV4IDU2MDE5NGIuLjg0NzJkYzggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QaWNrT25lVGFzay5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9QaWNrT25lVGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RDb21wb25lbnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudFRlc3QuamF2YQppbmRleCA2ZTUxMjA5Li5kYTg0NDdmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdENvbXBvbmVudFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyUmVwb3NpdG9yeVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0SGVscGVyUmVwb3NpdG9yeVRlc3QuamF2YQppbmRleCBlZWM0MmY3Li4zMjQ0N2Q4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdEhlbHBlclJlcG9zaXRvcnlUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb2plY3RIZWxwZXJSZXBvc2l0b3J5VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsOCArMjUsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5TdHJpbmdSZXNvdXJjZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBUZXN0aW5nIGFyb3VuZCB0aGUgbWFuYWdlbWVudCBvZiB0aGUgcHJvamVjdCBoZWxwZXJzCkBAIC00NSw2MSArNDUsNDEgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmQoKSB7CiAgICAgICAgIFByb2plY3RIZWxwZXJSZXBvc2l0b3J5IHJlcG8gPSBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpOwogICAgICAgICByZXBvLnJlZ2lzdGVyUHJvamVjdEhlbHBlcihTb21lSGVscGVyLmNsYXNzKTsKIAogICAgICAgICBSZXNvdXJjZSByID0gbmV3IEZpbGVSZXNvdXJjZShuZXcgRmlsZSgidGVzdC54bWwiKSk7Ci0gICAgICAgIFByb2plY3RIZWxwZXIgaGVscGVyID0gcmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKHIpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlciBpbnN0YW5jZW9mIFByb2plY3RIZWxwZXIyKTsKLSAgICAgICAgaGVscGVyID0gcmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQW50bGliKHIpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlciBpbnN0YW5jZW9mIFByb2plY3RIZWxwZXIyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXBvLmdldFByb2plY3RIZWxwZXJGb3JCdWlsZEZpbGUociksIGluc3RhbmNlT2YoUHJvamVjdEhlbHBlcjIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXBvLmdldFByb2plY3RIZWxwZXJGb3JBbnRsaWIociksIGluc3RhbmNlT2YoUHJvamVjdEhlbHBlcjIuY2xhc3MpKTsKIAogICAgICAgICByID0gbmV3IEZpbGVSZXNvdXJjZShuZXcgRmlsZSgidGVzdC5teWV4dCIpKTsKLSAgICAgICAgaGVscGVyID0gcmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKHIpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlciBpbnN0YW5jZW9mIFNvbWVIZWxwZXIpOwotICAgICAgICBoZWxwZXIgPSByZXBvLmdldFByb2plY3RIZWxwZXJGb3JBbnRsaWIocik7Ci0gICAgICAgIGFzc2VydFRydWUoaGVscGVyIGluc3RhbmNlb2YgU29tZUhlbHBlcik7CisgICAgICAgIGFzc2VydFRoYXQocmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKHIpLCBpbnN0YW5jZU9mKFNvbWVIZWxwZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXBvLmdldFByb2plY3RIZWxwZXJGb3JBbnRsaWIociksIGluc3RhbmNlT2YoU29tZUhlbHBlci5jbGFzcykpOwogCiAgICAgICAgIHIgPSBuZXcgU3RyaW5nUmVzb3VyY2UoInRlc3QubXlleHQiKTsKLSAgICAgICAgaGVscGVyID0gcmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKHIpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlciBpbnN0YW5jZW9mIFByb2plY3RIZWxwZXIyKTsKLSAgICAgICAgaGVscGVyID0gcmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQW50bGliKHIpOwotICAgICAgICBhc3NlcnRUcnVlKGhlbHBlciBpbnN0YW5jZW9mIFByb2plY3RIZWxwZXIyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXBvLmdldFByb2plY3RIZWxwZXJGb3JCdWlsZEZpbGUociksIGluc3RhbmNlT2YoUHJvamVjdEhlbHBlcjIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXBvLmdldFByb2plY3RIZWxwZXJGb3JBbnRsaWIociksIGluc3RhbmNlT2YoUHJvamVjdEhlbHBlcjIuY2xhc3MpKTsKIAogICAgICAgICByID0gbmV3IFN0cmluZ1Jlc291cmNlKCJ0ZXN0Lm90aGVyIik7Ci0gICAgICAgIGhlbHBlciA9IHJlcG8uZ2V0UHJvamVjdEhlbHBlckZvckJ1aWxkRmlsZShyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWxwZXIgaW5zdGFuY2VvZiBQcm9qZWN0SGVscGVyMik7Ci0gICAgICAgIGhlbHBlciA9IHJlcG8uZ2V0UHJvamVjdEhlbHBlckZvckFudGxpYihyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoZWxwZXIgaW5zdGFuY2VvZiBQcm9qZWN0SGVscGVyMik7CisgICAgICAgIGFzc2VydFRoYXQocmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQnVpbGRGaWxlKHIpLCBpbnN0YW5jZU9mKFByb2plY3RIZWxwZXIyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVwby5nZXRQcm9qZWN0SGVscGVyRm9yQW50bGliKHIpLCBpbnN0YW5jZU9mKFByb2plY3RIZWxwZXIyLmNsYXNzKSk7CiAgICAgfQogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0Q29udHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdENvbnN0cnVjdG9yKCkgewogCi0gICAgICAgIGNsYXNzIEluY3JyZWN0SGVscGVyIGV4dGVuZHMgUHJvamVjdEhlbHBlciB7CisgICAgICAgIGNsYXNzIEluY29ycmVjdEhlbHBlciBleHRlbmRzIFByb2plY3RIZWxwZXIgewogICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IHZpc2libGUgdG8gYW50IGhlcmUKICAgICAgICAgfQogCi0gICAgICAgIFByb2plY3RIZWxwZXJSZXBvc2l0b3J5IHJlcG8gPSBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmVwby5yZWdpc3RlclByb2plY3RIZWxwZXIoSW5jcnJlY3RIZWxwZXIuY2xhc3MpOwotICAgICAgICAgICAgZmFpbCgiUmVnaXN0cmluZyBhbiBoZWxwZXIgd2l0aCBubyBkZWZhdWx0IGNvbnN0cnVjdG9yIHNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQorICAgICAgICBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeS5nZXRJbnN0YW5jZSgpLnJlZ2lzdGVyUHJvamVjdEhlbHBlcihJbmNvcnJlY3RIZWxwZXIuY2xhc3MpOworICAgICAgICAvLyBUT0RPIHdlIHNob3VsZCBiZSBhc3NlcnRpbmcgYSB2YWx1ZSBpbiBoZXJlCiAgICAgfQogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rd25vd0hlbHBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0SGVscGVyUmVwb3NpdG9yeSByZXBvID0gUHJvamVjdEhlbHBlclJlcG9zaXRvcnkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJlcG8ucmVnaXN0ZXJQcm9qZWN0SGVscGVyKCJ4eHgueXl5Lnp6ei5Vbmtub3duSGVscGVyIik7Ci0gICAgICAgICAgICBmYWlsKCJSZWdpc3RyaW5nIGFuIHVua253b24gaGVscGVyIHNob3VsZCBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG9rCi0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFVua25vd25IZWxwZXIoKSB7CisgICAgICAgIFByb2plY3RIZWxwZXJSZXBvc2l0b3J5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJQcm9qZWN0SGVscGVyKCJ4eHgueXl5Lnp6ei5Vbmtub3duSGVscGVyIik7CisgICAgICAgIC8vIFRPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvamVjdFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0VGVzdC5qYXZhCmluZGV4IDM2NWU5MmQuLjg4NWU1YWEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9qZWN0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzEsMTUgKzMxLDIxIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNLZXk7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogLyoqCiAgKiBWZXJ5IGxpbWl0ZWQgdGVzdCBjbGFzcyBmb3IgUHJvamVjdC4gV2FpdGluZyB0byBiZSBleHRlbmRlZC4KQEAgLTUwLDYgKzU2LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBwcml2YXRlIFByb2plY3QgcDsKICAgICBwcml2YXRlIFN0cmluZyByb290OwogICAgIHByaXZhdGUgTW9ja0J1aWxkTGlzdGVuZXIgbWJsOwpAQCAtNjgsNzAgKzc3LDgyIEBACiAgICAgICAgICAgICAgICAgICAgcC5jcmVhdGVEYXRhVHlwZSgiZHVtbXkiKSk7CiAgICAgICAgIE9iamVjdCBvID0gcC5jcmVhdGVEYXRhVHlwZSgiZmlsZXNldCIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJmaWxlc2V0IGlzIGEga25vd24gdHlwZSIsIG8pOwotICAgICAgICBhc3NlcnRUcnVlKCJmaWxlc2V0IGNyZWF0ZXMgRmlsZVNldCIsIG8gaW5zdGFuY2VvZiBGaWxlU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUGF0dGVyblNldCIsCi0gICAgICAgICAgICAgICBwLmNyZWF0ZURhdGFUeXBlKCJwYXR0ZXJuc2V0IikgaW5zdGFuY2VvZiBQYXR0ZXJuU2V0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUGF0aCIsIHAuY3JlYXRlRGF0YVR5cGUoInBhdGgiKSBpbnN0YW5jZW9mIFBhdGgpOworICAgICAgICBhc3NlcnRUaGF0KCJmaWxlc2V0IGNyZWF0ZXMgRmlsZVNldCIsIG8sIGluc3RhbmNlT2YoRmlsZVNldC5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KCJQYXR0ZXJuU2V0IiwgcC5jcmVhdGVEYXRhVHlwZSgicGF0dGVybnNldCIpLAorICAgICAgICAgICAgICAgIGluc3RhbmNlT2YoUGF0dGVyblNldC5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KCJQYXRoIiwgcC5jcmVhdGVEYXRhVHlwZSgicGF0aCIpLCBpbnN0YW5jZU9mKFBhdGguY2xhc3MpKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIHRlc3QgaGFzIGJlZW4gYSBzdGFydGluZyBwb2ludCBmb3IgbW92aW5nIHRoZSBjb2RlIHRvIEZpbGVVdGlscy4KKyAgICAgKiBUaGlzIHRlc3QgaGFzIGJlZW4gYSBzdGFydGluZyBwb2ludCBmb3IgbW92aW5nIHRoZSBjb2RlIHRvIEZpbGVVdGlsczsKKyAgICAgKiBmaXJzdCwgdGhlIERPUy9OZXR3YXJlLXNwZWNpZmljIHBhcnQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZpbGVXaXRoRHJpdmVMZXR0ZXIoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIk5vdCBET1Mgb3IgTmV0d2FyZSIsIE9zLmlzRmFtaWx5KCJuZXR3YXJlIikgfHwgT3MuaXNGYW1pbHkoImRvcyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGxvY2FsaXplKEZpbGUuc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGxvY2FsaXplKEZpbGUuc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCJcXCIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIHRocm93IGluIGRyaXZlIGxldHRlcnMKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICBTdHJpbmcgZHJpdmVTcGVjTG93ZXIgPSAiYzoiOworCisgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiXFwiLCBudWxsKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjTG93ZXIgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCisgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICJcXCIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWMgKyAiXFwiLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIi8vLy8vIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaGFzIGJlZW4gYSBzdGFydGluZyBwb2ludCBmb3IgbW92aW5nIHRoZSBjb2RlIHRvIEZpbGVVdGlsczsKKyAgICAgKiBub3csIHRoZSBQT1NJWC1zcGVjaWZpYyBwYXJ0LgogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVGaWxlKCkgewotICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgiZG9zIikpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShsb2NhbGl6ZShGaWxlLnNlcGFyYXRvciksCi0gICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiLyIsIG51bGwpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UobG9jYWxpemUoRmlsZS5zZXBhcmF0b3IpLAotICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB0aHJvdyBpbiBkcml2ZSBsZXR0ZXJzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlYyArICIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWNMb3dlciArICJcXCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiXFwiLCBudWxsKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlY0xvd2VyICsgIi8iLCBudWxsKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBwcm9taXNlZCB0byBlbGltaW5hdGUgY29uc2VjdXRpdmUgc2xhc2hlcyBhZnRlciBkcml2ZSBsZXR0ZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWMgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIi8vLy8vIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkcml2ZVNwZWMgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIsIG51bGwpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIi8iLCBudWxsKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBkcml2ZSBsZXR0ZXJzIGFyZSBub3QgdXNlZCwganVzdCB0byBiZSBjb25zaWRlcmVkIGFzIG5vcm1hbAotICAgICAgICAgICAgICogcGFydCBvZiBhIG5hbWUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJDOiI7Ci0gICAgICAgICAgICBTdHJpbmcgdWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgZHJpdmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIi8iLCBudWxsKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiXFwiLCBudWxsKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgZHJpdmVTcGVjTG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgZHJpdmVTcGVjTG93ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWNMb3dlciArICJcXCIsIG51bGwpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzdW1lRmFsc2UoIkRPUyBvciBOZXR3YXJlIiwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgiZG9zIikpOwogICAgICAgICAvKgotICAgICAgICAgKiBOb3cgdGVzdCBzb21lIHJlbGF0aXZlIGZpbGUgbmFtZSBtYWdpYy4KKyAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KICAgICAgICAgICovCisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKCIvIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogZHJpdmUgbGV0dGVycyBhcmUgbm90IHVzZWQsIGp1c3QgdG8gYmUgY29uc2lkZXJlZCBhcyBub3JtYWwKKyAgICAgICAgICogcGFydCBvZiBhIG5hbWUKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICBTdHJpbmcgdWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIEZpbGUuc2VwYXJhdG9yQ2hhcjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZShkcml2ZVNwZWMgKyAiLyIsIG51bGwpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgZHJpdmVTcGVjLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjICsgIlxcIiwgbnVsbCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBkcml2ZVNwZWNMb3dlciwKKyAgICAgICAgICAgICAgICBwLnJlc29sdmVGaWxlKGRyaXZlU3BlY0xvd2VyICsgIi8iLCBudWxsKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIGRyaXZlU3BlY0xvd2VyLAorICAgICAgICAgICAgICAgIHAucmVzb2x2ZUZpbGUoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLCBudWxsKS5nZXRQYXRoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc29tZSByZWxhdGl2ZSBmaWxlIG5hbWUgbWFnaWM6IHBsYXRmb3JtLW5ldXRyYWwuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVJlbGF0aXZlRmlsZSgpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAogICAgICAgICAgICAgICAgICAgICAgcC5yZXNvbHZlRmlsZSgiNCIsIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSkpLmdldFBhdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKQEAgLTE2Niw4ICsxODcsOCBAQAogICAgICAqIGlzIGNhbGxlZCB2aWEgcmVzb2x2ZUZpbGUgdG8gcGFzcyB1bmRlciBjeWd3aW4KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0gICAgICAgIGlmICgoT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpCi0gICAgICAgICAgICAmJiBzMS5sZW5ndGgoKSA+PSAxICYmIHMyLmxlbmd0aCgpID49IDEpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiTm90IERPUyBvciBOZXR3YXJlIiwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgiZG9zIikpOworICAgICAgICBpZiAoczEubGVuZ3RoKCkgPj0gMSAmJiBzMi5sZW5ndGgoKSA+PSAxKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiMSA9IG5ldyBTdHJpbmdCdWlsZGVyKHMxKTsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IyID0gbmV3IFN0cmluZ0J1aWxkZXIoczIpOwogICAgICAgICAgICAgc2IxLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoczEuY2hhckF0KDApKSk7CkBAIC0xNzgsMTggKzE5OSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFRhc2tEZWZGYWlscyhmaW5hbCBDbGFzcyB0YXNrQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUYXNrRGVmRmFpbHMoZmluYWwgQ2xhc3M8Pz4gdGFza0NsYXNzLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBmaW5hbCBTdHJpbmcgZHVtbXlOYW1lID0gInRlc3RUYXNrRGVmaW5pdGlvbkR1bW15IjsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgbWJsLmFkZEJ1aWxkRXZlbnQobWVzc2FnZSwgUHJvamVjdC5NU0dfRVJSKTsKICAgICAgICAgICAgIHAuYWRkVGFza0RlZmluaXRpb24oZHVtbXlOYW1lLCB0YXNrQ2xhc3MpOwotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJleHBlY3RlZCBCdWlsZEV4Y2VwdGlvbihcIiVzXCIsIFByb2plY3QuTVNHX0VSUikgd2hlbiBhZGRpbmcgdGFzayAlcyIsCi0gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIHRhc2tDbGFzcykpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgbWJsLmFzc2VydEVtcHR5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCFwLmdldFRhc2tEZWZpbml0aW9ucygpLmNvbnRhaW5zS2V5KGR1bW15TmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChwLmdldFRhc2tEZWZpbml0aW9ucygpLCBub3QoaGFzS2V5KGR1bW15TmFtZSkpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjMzLDcgKzI1Miw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlcigpIHsKICAgICAgICAgSW5wdXRIYW5kbGVyIGloID0gcC5nZXRJbnB1dEhhbmRsZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpaCk7Ci0gICAgICAgIGFzc2VydFRydWUoaWggaW5zdGFuY2VvZiBEZWZhdWx0SW5wdXRIYW5kbGVyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpaCwgaW5zdGFuY2VPZihEZWZhdWx0SW5wdXRIYW5kbGVyLmNsYXNzKSk7CiAgICAgICAgIElucHV0SGFuZGxlciBwZmloID0gbmV3IFByb3BlcnR5RmlsZUlucHV0SGFuZGxlcigpOwogICAgICAgICBwLnNldElucHV0SGFuZGxlcihwZmloKTsKICAgICAgICAgYXNzZXJ0U2FtZShwZmloLCBwLmdldElucHV0SGFuZGxlcigpKTsKQEAgLTI0MSwyNSArMjYwLDIyIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrRGVmaW5pdGlvbkNvbnRhaW5zS2V5KCkgewotICAgICAgICBhc3NlcnRUcnVlKHAuZ2V0VGFza0RlZmluaXRpb25zKCkuY29udGFpbnNLZXkoImVjaG8iKSk7CisgICAgICAgIGFzc2VydFRoYXQocC5nZXRUYXNrRGVmaW5pdGlvbnMoKSwgaGFzS2V5KCJlY2hvIikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRhc2tEZWZpbml0aW9uQ29udGFpbnMoKSB7Ci0gICAgICAgIGFzc2VydFRydWUocC5nZXRUYXNrRGVmaW5pdGlvbnMoKS5jb250YWlucyhvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvLmNsYXNzKSk7CisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tEZWZpbml0aW9uQ29udGFpbnNWYWx1ZSgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChwLmdldFRhc2tEZWZpbml0aW9ucygpLCBoYXNWYWx1ZShvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5FY2hvLmNsYXNzKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogIEZhaWwgYmVjYXVzZSBidWlsZGZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlVGFyZ2V0cygpIHsKLSAgICAgICAgLy8gZmFpbCwgYmVjYXVzZSBidWlsZGZpbGUgY29udGFpbnMgdHdvIHRhcmdldHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LnhtbCIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IEJ1aWxkRXhjZXB0aW9uIGFib3V0IGR1cGxpY2F0ZSB0YXJnZXQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3BlY2lmaWMgbWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSB0YXJnZXQgJ3R3aWNlJyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkR1cGxpY2F0ZSB0YXJnZXQgJ3R3aWNlJyIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0LnhtbCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNjcsNyArMjgzLDcgQEAKICAgICAgICAgLy8gb3ZlcnJpZGluZyB0YXJnZXQgZnJvbSBpbXBvcnRlZCBidWlsZGZpbGUgaXMgYWxsb3dlZAogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS9kdXBsaWNhdGUtdGFyZ2V0Mi54bWwiKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm9uY2UiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIm9uY2UgZnJvbSBidWlsZGZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIm9uY2UgZnJvbSBidWlsZGZpbGUiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3NywxNiArMjkzLDIyIEBACiAgICAgICAgIHAuYWRkQnVpbGRMaXN0ZW5lcihuZXcgQnVpbGRMaXN0ZW5lcigpIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0YXNrU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKGZpbmFsIEJ1aWxkRXZlbnQgYWN0dWFsKSB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhGT08sIGFjdHVhbC5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgbGluZXMgd291bGQgY2F1c2UgYW4KQEAgLTI5NywyMCArMzE5LDE3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgICAgIGZpbmFsIGJvb2xlYW5bXSBkb25lID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBwLmxvZyhGT08sIFByb2plY3QuTVNHX0lORk8pOwotICAgICAgICAgICAgICAgICAgICBkb25lWzBdID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgcC5sb2coRk9PLCBQcm9qZWN0Lk1TR19JTkZPKTsKKyAgICAgICAgICAgIGRvbmVbMF0gPSB0cnVlOworICAgICAgICB9KTsKICAgICAgICAgdC5zdGFydCgpOwogICAgICAgICB0LmpvaW4oMjAwMCk7CiAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGxvZ2dpbmcgdGhyZWFkIHRvIGZpbmlzaCBzdWNjZXNzZnVsbHkiLCBkb25lWzBdKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ3NjIzIj4KLSAgICAgKiAgICAgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDc2MjM8L2E+CisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00NzYyMyI+YnVnIDQ3NjIzPC9hPgogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxUaHJvd2FibGVNZXNzYWdlTG9nKCkgewpAQCAtMzIyLDYgKzM0MSw3IEBACiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgRHVtbXlUYXNrUHJpdmF0ZSgpIHsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjksNiArMzQ5LDcgQEAKICAgICBwcm90ZWN0ZWQgY2xhc3MgRHVtbXlUYXNrUHJvdGVjdGVkIGV4dGVuZHMgVGFzayB7CiAgICAgICAgIHB1YmxpYyBEdW1teVRhc2tQcm90ZWN0ZWQoKSB7CiAgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICB9CiAgICAgfQpAQCAtMzM2LDYgKzM1Nyw3IEBACiAgICAgY2xhc3MgRHVtbXlUYXNrUGFja2FnZSBleHRlbmRzIFRhc2sgewogICAgICAgICBwdWJsaWMgRHVtbXlUYXNrUGFja2FnZSgpIHsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlFeHBhbnNpb25UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlFeHBhbnNpb25UZXN0LmphdmEKaW5kZXggYzk0M2QzZS4uMTRlYWM3NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb3BlcnR5RXhwYW5zaW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUV4cGFuc2lvblRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDE5ICsyMCw2MiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIC8qKgogICogY2xhc3MgdG8gbG9vayBhdCBob3cgd2UgZXhwYW5kIHByb3BlcnRpZXMKICAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUV4cGFuc2lvblRlc3QgewogCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImV4cGFuZCBcInswfVwiID0+IFwiezF9XCIiKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gdGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdCBbXVtdIHsKKyAgICAgICAgICAgICAgICAvKiBwcm9wZXJ0eSBleHBhbnNpb24gKi8KKyAgICAgICAgICAgICAgICB7IiIsICIifSwKKyAgICAgICAgICAgICAgICB7IiQiLCAiJCJ9LAorICAgICAgICAgICAgICAgIHsiJCQtIiwgIiQtIn0sCisgICAgICAgICAgICAgICAgeyIkJCIsICIkIn0sCisgICAgICAgICAgICAgICAgeyJhJHtleHBhbmRlZH1iIiwgImFFWFBBTkRFRGIifSwKKyAgICAgICAgICAgICAgICB7IiR7ZXhwYW5kZWR9JHtleHBhbmRlZH0iLCAiRVhQQU5ERURFWFBBTkRFRCJ9LAorICAgICAgICAgICAgICAgIHsiJCQkIiwgIiQkIn0sCisgICAgICAgICAgICAgICAgeyIkJCQkLSIsICIkJC0ifSwKKyAgICAgICAgICAgICAgICB7IiIsICIifSwKKyAgICAgICAgICAgICAgICB7IkNsYXNzJCRzdWJjbGFzcyIsICJDbGFzcyRzdWJjbGFzcyJ9LAorICAgICAgICAgICAgICAgIC8qIGRvbGxhciBwYXNzdGhyb3VnaCAqLworICAgICAgICAgICAgICAgIHsiJC0iLCAiJC0ifSwKKyAgICAgICAgICAgICAgICB7IkNsYXNzJHN1YmNsYXNzIiwgIkNsYXNzJHN1YmNsYXNzIn0sCisgICAgICAgICAgICAgICAgeyIkJCQtIiwgIiQkLSJ9LAorICAgICAgICAgICAgICAgIHsiJCQkJCQiLCAiJCQkIn0sCisgICAgICAgICAgICAgICAgeyIke3VuYXNzaWduZWQucHJvcGVydHl9IiwgIiR7dW5hc3NpZ25lZC5wcm9wZXJ0eX0ifSwKKyAgICAgICAgICAgICAgICB7ImEkYiIsICJhJGIifSwKKyAgICAgICAgICAgICAgICB7IiR9fSIsICIkfX0ifQorICAgICAgICAgICAgICAgIC8qIG9sZCB0aGluZ3MKKyAgICAgICAgICAgICAgICB7IkNsYXNzJHN1YmNsYXNzIiwgIkNsYXNzc3ViY2xhc3MifSwKKyAgICAgICAgICAgICAgICB7IiQkJC0iLCAiJC0ifSwKKyAgICAgICAgICAgICAgICB7ImEkYiIsICJhYiJ9LAorICAgICAgICAgICAgICAgIHsiJH19IiwgIn19In0sCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFN0cmluZyBpbnB1dDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgZXhwZWN0ZWQ7CisKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKICAgICAvKioKICAgICAgKiB3ZSBiaW5kIHRvIGFuIGV4aXN0aW5nIHRlc3QgZmlsZSBiZWNhdXNlIHdlIGFyZSB0b28gbGF6eSB0byB3cml0ZSBvdXIKICAgICAgKiBvd24sIGFuZCB3ZSBkb24ndCByZWFsbHkgY2FyZSB3aGF0IGl0IGlzCkBAIC00MCw1OSArODMsMTUgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL2ltbXV0YWJsZS54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBydW4gdGhyb3VnaCB0aGUgdGVzdCBjYXNlcyBvZiBleHBhbnNpb24KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUV4cGFuc2lvbigpIHsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIiLCAiIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCIsICIkIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCQtIiwgIiQtIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCQiLCAiJCIpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJleHBhbmRlZCIsICJFWFBBTkRFRCIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oImEke2V4cGFuZGVkfWIiLCAiYUVYUEFOREVEYiIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiR7ZXhwYW5kZWR9JHtleHBhbmRlZH0iLCAiRVhQQU5ERURFWFBBTkRFRCIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkJCIsICIkJCIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiQkJCQtIiwgIiQkLSIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIiIsICIiKTsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCJDbGFzcyQkc3ViY2xhc3MiLCAiQ2xhc3Mkc3ViY2xhc3MiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBuZXcgdGhpbmdzIHdlIHdhbnQKKyAgICAgKiB0aGUgdGVzdCBpdHNlbGYKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REb2xsYXJQYXNzdGhydSgpIHsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkLSIsICIkLSIpOwotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIkNsYXNzJHN1YmNsYXNzIiwgIkNsYXNzJHN1YmNsYXNzIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJCQkLSIsICIkJC0iKTsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkJCQkJCIsICIkJCQiKTsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIke3VuYXNzaWduZWQucHJvcGVydHl9IiwgIiR7dW5hc3NpZ25lZC5wcm9wZXJ0eX0iKTsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCJhJGIiLCAiYSRiIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJH19IiwgIiR9fSIpOwotICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogb2xkIHRoaW5ncyB3ZSBkb24ndCB3YW50OyBub3QgYSB0ZXN0IGFueW1vcmUKLSAgICAgKi8KLSAgICBAVGVzdAotICAgIEBJZ25vcmUoIlByZXZpb3VzbHkgZGlzYWJsZWQgdGhyb3VnaCBuYW1pbmcgY29udmVudGlvbiIpCi0gICAgcHVibGljIHZvaWQgb2xkdGVzdFF1aXJreUxlZ2FjeUJlaGF2aW9yKCkgewotICAgICAgICBhc3NlcnRFeHBhbmRzVG8oIkNsYXNzJHN1YmNsYXNzIiwgIkNsYXNzc3ViY2xhc3MiKTsKLSAgICAgICAgYXNzZXJ0RXhwYW5kc1RvKCIkJCQtIiwgIiQtIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiYSRiIiwgImFiIik7Ci0gICAgICAgIGFzc2VydEV4cGFuZHNUbygiJH19IiwgIn19Iik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogbGl0dGxlIGhlbHBlciBtZXRob2QgdG8gdmFsaWRhdGUgc3R1ZmYKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXhwYW5kc1RvKFN0cmluZyBzb3VyY2UsU3RyaW5nIGV4cGVjdGVkKSB7Ci0gICAgICAgIFN0cmluZyBhY3R1YWwgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKHNvdXJjZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2UsZXhwZWN0ZWQsYWN0dWFsKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXQsIGV4cGVjdGVkLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlcGxhY2VQcm9wZXJ0aWVzKGlucHV0KSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlGaWxlQ0xJVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Byb3BlcnR5RmlsZUNMSVRlc3QuamF2YQppbmRleCAzNzE4ODgyLi5lMWM4ZWM2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvUHJvcGVydHlGaWxlQ0xJVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Qcm9wZXJ0eUZpbGVDTElUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw0MiArMjIsMzggQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIFByb3BlcnR5RmlsZUNMSVRlc3QgeworICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciB0ZXN0Rm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOwogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlSZXNvbHV0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGVVdGlscyBmdSA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKLSAgICAgICAgRmlsZSBwcm9wcyA9IGZ1LmNyZWF0ZVRlbXBGaWxlKCJwcm9wZXJ0eWZpbGVjbGkiLCAiLnByb3BlcnRpZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIEZpbGUgYnVpbGQgPSBmdS5jcmVhdGVUZW1wRmlsZSgicHJvcGVydHlmaWxlY2xpIiwgIi54bWwiLCBudWxsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICAgIEZpbGUgbG9nID0gZnUuY3JlYXRlVGVtcEZpbGUoInByb3BlcnR5ZmlsZWNsaSIsICIubG9nIiwgbnVsbCwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgRmlsZVdyaXRlciBmdyA9IG51bGw7Ci0gICAgICAgIEZpbGVSZWFkZXIgZnIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZncgPSBuZXcgRmlsZVdyaXRlcihwcm9wcyk7CisgICAgICAgIEZpbGUgcHJvcHMgPSB0ZXN0Rm9sZGVyLm5ld0ZpbGUoInByb3BlcnR5ZmlsZWNsaS5wcm9wZXJ0aWVzIik7CisgICAgICAgIHRyeSAoRmlsZVdyaXRlciBmdyA9IG5ldyBGaWxlV3JpdGVyKHByb3BzKSkgewogICAgICAgICAgICAgZncud3JpdGUoInc9d29ybGRcbm1lc3NhZ2U9SGVsbG8sICR7d31cbiIpOwotICAgICAgICAgICAgZncuY2xvc2UoKTsKLSAgICAgICAgICAgIGZ3ID0gbmV3IEZpbGVXcml0ZXIoYnVpbGQpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZSBidWlsZCA9IHRlc3RGb2xkZXIubmV3RmlsZSgicHJvcGVydHlmaWxlY2xpLnhtbCIpOworICAgICAgICB0cnkgKEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihidWlsZCkpIHsKICAgICAgICAgICAgIGZ3LndyaXRlKCI8cHJvamVjdD48ZWNobz4ke21lc3NhZ2V9PC9lY2hvPjwvcHJvamVjdD4iKTsKLSAgICAgICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICAgICAgICBmdyA9IG51bGw7Ci0gICAgICAgICAgICBNYWluIG0gPSBuZXcgTm9FeGl0TWFpbigpOwotICAgICAgICAgICAgbS5zdGFydEFudChuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgICAgICAgICAiLXByb3BlcnR5ZmlsZSIsIHByb3BzLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAiLWYiLCBidWlsZC5nZXRBYnNvbHV0ZVBhdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgIi1sIiwgbG9nLmdldEFic29sdXRlUGF0aCgpCi0gICAgICAgICAgICAgICAgfSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgbCA9IEZpbGVVdGlscy5zYWZlUmVhZEZ1bGx5KGZyID0gbmV3IEZpbGVSZWFkZXIobG9nKSk7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiSGVsbG8sIHdvcmxkIiwgbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZncpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGZyKTsKKyAgICAgICAgfQorCisgICAgICAgIE1haW4gbSA9IG5ldyBOb0V4aXRNYWluKCk7CisgICAgICAgIEZpbGUgbG9nID0gdGVzdEZvbGRlci5uZXdGaWxlKCJwcm9wZXJ0eWZpbGVjbGkubG9nIik7CisgICAgICAgIG0uc3RhcnRBbnQobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAiLXByb3BlcnR5ZmlsZSIsIHByb3BzLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICItZiIsIGJ1aWxkLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICItbCIsIGxvZy5nZXRBYnNvbHV0ZVBhdGgoKQorICAgICAgICB9LCBudWxsLCBudWxsKTsKKyAgICAgICAgdHJ5IChGaWxlUmVhZGVyIGZyID0gbmV3IEZpbGVSZWFkZXIobG9nKSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChGaWxlVXRpbHMuc2FmZVJlYWRGdWxseShmciksIGNvbnRhaW5zU3RyaW5nKCJIZWxsbywgd29ybGQiKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UYXNrQ29udGFpbmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXJUZXN0LmphdmEKaW5kZXggNDkxZDM2MS4uM2E1M2UxOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Rhc2tDb250YWluZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw3ICsyMiw4IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIFRhc2tDb250YWluZXJUZXN0IHsKIApAQCAtMzcsMzAgKzM4LDI4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlFeHBhbnNpb24oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UHJvcGVydHlFeHBhbnNpb24iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYXR0cmlidXRlIHdvcmtlZCIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJBcyBhdHRyaWJ1dGU6IGl0IHdvcmtlZCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibmVzdGVkIHRleHQgd29ya2VkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIkFzIG5lc3RlZCB0ZXh0OiBpdCB3b3JrZWQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoImF0dHJpYnV0ZSB3b3JrZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoKCJBcyBhdHRyaWJ1dGU6IGl0IHdvcmtlZCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoIm5lc3RlZCB0ZXh0IHdvcmtlZCIsIGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygoIkFzIG5lc3RlZCB0ZXh0OiBpdCB3b3JrZWQiKSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRhc2tkZWYoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGFza2RlZiIpOwotICAgICAgICBhc3NlcnRUcnVlKCJhdHRyaWJ1dGUgd29ya2VkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIkFzIGF0dHJpYnV0ZTogaXQgd29ya2VkIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJuZXN0ZWQgdGV4dCB3b3JrZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiQXMgbmVzdGVkIHRleHQ6IGl0IHdvcmtlZCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibmVzdGVkIHRleHQgd29ya2VkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIkFzIG5lc3RlZCB0YXNrOiBpdCB3b3JrZWQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoImF0dHJpYnV0ZSB3b3JrZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkFzIGF0dHJpYnV0ZTogaXQgd29ya2VkIikpOworICAgICAgICBhc3NlcnRUaGF0KCJuZXN0ZWQgdGV4dCB3b3JrZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkFzIG5lc3RlZCB0ZXh0OiBpdCB3b3JrZWQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUluc2Vuc2l0aXZlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENhc2VJbnNlbnNpdGl2ZSIpOwotICAgICAgICBhc3NlcnRUcnVlKCJ3b3JrcyBvdXRzaWRlIG9mIGNvbnRhaW5lciIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJoZWxsbyAiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIndvcmtzIGluc2lkZSBvZiBjb250YWluZXIiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygid29ybGQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIndvcmtzIG91dHNpZGUgb2YgY29udGFpbmVyIiwgYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJoZWxsbyAiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIndvcmtzIGluc2lkZSBvZiBjb250YWluZXIiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIndvcmxkIikpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Rlc3RIZWxwZXIuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9UZXN0SGVscGVyLmphdmEKaW5kZXggZjM2ZGQ0Ni4uOWY4NTgyZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Rlc3RIZWxwZXIuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVGVzdEhlbHBlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzMsMjEgKzMzLDExIEBACiAgICAgICogYWZ0ZXIgdGhpcyBtZXRob2Qgc2luY2UgdGhlIGFzc29jaWF0ZWQgc29ja2V0IGlzIHJlbGVhc2VkIGFuZCBzb21lIG90aGVyIHByb2Nlc3MgY2FuIG5vdyB1c2UgaXQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF5YmVBdmFpbGFibGVQb3J0KCkgewotICAgICAgICBmaW5hbCBTZXJ2ZXJTb2NrZXQgczsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMgPSBuZXcgU2VydmVyU29ja2V0KDApOworICAgICAgICB0cnkgKFNlcnZlclNvY2tldCBzID0gbmV3IFNlcnZlclNvY2tldCgwKSkgewogICAgICAgICAgICAgcy5zZXRSZXVzZUFkZHJlc3ModHJ1ZSk7Ci0gICAgICAgICAgICBpbnQgcG9ydCA9IHMuZ2V0TG9jYWxQb3J0KCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHMuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBwb3J0OworICAgICAgICAgICAgcmV0dXJuIHMuZ2V0TG9jYWxQb3J0KCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIC8vIGlnbm9yZQotICAgICAgICB9IGZpbmFsbHkgewotCiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gVENQL0lQIHBvcnQgYXZhaWxhYmxlIik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1RvcExldmVsVGFza1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Ub3BMZXZlbFRhc2tUZXN0LmphdmEKaW5kZXggN2Q3M2RjMC4uMDZlMzU3NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1RvcExldmVsVGFza1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVG9wTGV2ZWxUYXNrVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsNiArMjMsMTEgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIApAQCAtMzEsMjkgKzM2LDMxIEBACiAgKgogICogQHNpbmNlIEFudCAxLjYKICAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBUb3BMZXZlbFRhc2tUZXN0IHsKIAorICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gdGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgeyJub3RhcmdldCIsICIifSwKKyAgICAgICAgICAgICAgICB7InRvcGxldmVsYW50IiwgIiJ9LAorICAgICAgICAgICAgICAgIHsidGFyZ2V0bGV2ZWxhbnQiLCAiZm9vIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFN0cmluZyBmaWxlTmFtZTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZTsKKwogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vVGFyZ2V0KCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvY29yZS90b3BsZXZlbHRhc2tzL25vdGFyZ2V0LnhtbCIpOwotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2FsbGVkIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsZWRGcm9tVG9wTGV2ZWxBbnQoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvdG9wbGV2ZWxhbnQueG1sIik7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYWxsZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENhbGxlZEZyb21UYXJnZXRMZXZlbEFudCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL2NvcmUvdG9wbGV2ZWx0YXNrcy90YXJnZXRsZXZlbGFudC54bWwiKTsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZvbyIpOworICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9jb3JlL3RvcGxldmVsdGFza3MvIiArIGZpbGVOYW1lICsgIi54bWwiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0TmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ2FsbGVkIiwgYnVpbGRSdWxlLmdldExvZygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvVW5rbm93bkVsZW1lbnRUZXN0LmphdmEKaW5kZXggNzZmMGQ4Zi4uZjczZWMyMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1Vua25vd25FbGVtZW50VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9Vbmtub3duRWxlbWVudFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDkgKzI2LDEwIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIHB1YmxpYyBjbGFzcyBVbmtub3duRWxlbWVudFRlc3QgewogCkBAIC00OSw1MyArNTAsNjIgQEAKICAgICAvKioKICAgICAgKiBOb3QgcmVhbGx5IGEgVW5rbm93bkVsZW1lbnQgdGVzdCBidXQgcmF0aGVyIG9uZSBvZiAid2hhdAogICAgICAqIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0YXNrRmluaXNoZWQiLgotICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjYxOTciPgotICAgICAqICAgICBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yNjE5NzwvYT4KKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI2MTk3Ij5idWcgMjYxOTc8L2E+CiAgICAgICovCiAgICAgQFRlc3QKICAgICBASWdub3JlKCJQcmV2aW91c2x5IGRpc2FibGVkIHRocm91Z2ggbmFtaW5nIGNvbnZlbnRpb24iKQotICAgIHB1YmxpYyB2b2lkIFh0ZXN0VGFza0ZpbmlzaGVkRXZlbnQoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdFRhc2tGaW5pc2hlZEV2ZW50KCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIobmV3IEJ1aWxkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGFza1Byb3BlcnRpZXMoZXZlbnQuZ2V0VGFzaygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGFza1Byb3BlcnRpZXMoZXZlbnQuZ2V0VGFzaygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUYXNrUHJvcGVydGllcyhUYXNrIHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWUpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHVlIGluc3RhbmNlb2YgVW5rbm93bkVsZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICBUYXNrIHQgPSAoKFVua25vd25FbGVtZW50KSB1ZSkuZ2V0VGFzaygpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHQpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBidWlsZEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgIGFzc2VydFRhc2tQcm9wZXJ0aWVzKGV2ZW50LmdldFRhc2soKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRhc2tGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGFza1Byb3BlcnRpZXMoZXZlbnQuZ2V0VGFzaygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUYXNrUHJvcGVydGllcyhUYXNrIHVlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1ZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh1ZSwgaW5zdGFuY2VPZihVbmtub3duRWxlbWVudC5jbGFzcykpOworICAgICAgICAgICAgICAgIFRhc2sgdCA9ICgoVW5rbm93bkVsZW1lbnQpIHVlKS5nZXRUYXNrKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh0KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZWNobyIpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBUYXNrIHsKICAgICAgICAgUGFyZW50IHBhcmVudDsKKwogICAgICAgICBwdWJsaWMgdm9pZCBpbmplY3RQYXJlbnQoUGFyZW50IHBhcmVudCkgewogICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgewogICAgICAgICAgICAgcGFyZW50LmZyb21DaGlsZCgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBUYXNrIGltcGxlbWVudHMgVGFza0NvbnRhaW5lciB7Ci0gICAgICAgIExpc3Q8VGFzaz4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7CisgICAgICAgIExpc3Q8VGFzaz4gY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwogICAgICAgICBwdWJsaWMgdm9pZCBhZGRUYXNrKFRhc2sgdCkgewogICAgICAgICAgICAgY2hpbGRyZW4uYWRkKHQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvWG1sTG9nZ2VyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L1htbExvZ2dlclRlc3QuamF2YQppbmRleCBjZmViMTZiLi40NmViODMwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvWG1sTG9nZ2VyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9YbWxMb2dnZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMCArMjMsMTMgQEAKIAogcHVibGljIGNsYXNzIFhtbExvZ2dlclRlc3QgewogCisgICAgLyoqCisgICAgICogIk5QRSBpbiBYbWxMb2dnZXIuYnVpbGRGaW5pc2hlZCIKKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTY4NTAiPmJ1ZyA1Njg1MDwvYT4KKyAgICAgKi8KICAgICBAVGVzdAotICAgIC8vIHNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01Njg1MAotICAgIC8vICJOUEUgaW4gWG1sTG9nZ2VyLmJ1aWxkRmluaXNoZWQiCi0gICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBUaHJvd2FibGUgeworICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CiAgICAgICAgIGZpbmFsIFhtbExvZ2dlciBsb2dnZXIgPSBuZXcgWG1sTG9nZ2VyKCk7CiAgICAgICAgIGZpbmFsIEN2cyB0YXNrID0gbmV3IEN2cygpOwogICAgICAgICBmaW5hbCBCdWlsZEV2ZW50IGV2ZW50ID0gbmV3IEJ1aWxkRXZlbnQodGFzayk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Db25jYXRGaWx0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Db25jYXRGaWx0ZXJUZXN0LmphdmEKaW5kZXggMDZjZDJmOC4uZWY2YThkZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvQ29uY2F0RmlsdGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0NvbmNhdEZpbHRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDQ4ICsyMyw0NCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5zdGFydHNXaXRoOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICogSlVuaXQgVGVzdGNhc2VzIGZvciBDb25jYXRSZWFkZXIKICAqLwogcHVibGljIGNsYXNzIENvbmNhdEZpbHRlclRlc3QgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxTZXAgPSBTdHJpbmdVdGlscy5MSU5FX1NFUDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUkVQRU5EX1dJVEggPSBTdHJpbmcuZm9ybWF0KCJ0aGlzLXNob3VsZC1iZS10aGUtZmlyc3QtbGluZSVuIgorICAgICAgICArICJMaW5lICAxJW4iCisgICAgICAgICsgIkxpbmUgIDIlbiIKKyAgICAgICAgKyAiTGluZSAgMyVuIgorICAgICAgICArICJMaW5lICA0JW4iKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRVBFTkRfV0lUSCA9Ci0gICAgICAgICAgInRoaXMtc2hvdWxkLWJlLXRoZS1maXJzdC1saW5lIiArIGxTZXAKLSAgICAgICAgKyAiTGluZSAgMSIgKyBsU2VwCi0gICAgICAgICsgIkxpbmUgIDIiICsgbFNlcAotICAgICAgICArICJMaW5lICAzIiArIGxTZXAKLSAgICAgICAgKyAiTGluZSAgNCIgKyBsU2VwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BSRVBFTkQgPSBTdHJpbmcuZm9ybWF0KCJMaW5lICAxJW4iCisgICAgICAgICsgIkxpbmUgIDIlbiIKKyAgICAgICAgKyAiTGluZSAgMyVuIgorICAgICAgICArICJMaW5lICA0JW4iCisgICAgICAgICsgIkxpbmUgIDUlbiIpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJFUEVORCA9Ci0gICAgICAgICAgIkxpbmUgIDEiICsgbFNlcAotICAgICAgICArICJMaW5lICAyIiArIGxTZXAKLSAgICAgICAgKyAiTGluZSAgMyIgKyBsU2VwCi0gICAgICAgICsgIkxpbmUgIDQiICsgbFNlcAotICAgICAgICArICJMaW5lICA1IiArIGxTZXA7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9BUFBFTkRfV0lUSCA9Ci0gICAgICAgICAgIkxpbmUgNTciICsgbFNlcAotICAgICAgICArICJMaW5lIDU4IiArIGxTZXAKLSAgICAgICAgKyAiTGluZSA1OSIgKyBsU2VwCi0gICAgICAgICsgIkxpbmUgNjAiICsgbFNlcAotICAgICAgICArICJ0aGlzLXNob3VsZC1iZS10aGUtbGFzdC1saW5lIiArIGxTZXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfQVBQRU5EX1dJVEggPSBTdHJpbmcuZm9ybWF0KCJMaW5lIDU3JW4iCisgICAgICAgICsgIkxpbmUgNTglbiIKKyAgICAgICAgKyAiTGluZSA1OSVuIgorICAgICAgICArICJMaW5lIDYwJW4iCisgICAgICAgICsgInRoaXMtc2hvdWxkLWJlLXRoZS1sYXN0LWxpbmUlbiIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfQVBQRU5EID0KLSAgICAgICAgICAiTGluZSA1NiIgKyBsU2VwCi0gICAgICAgICsgIkxpbmUgNTciICsgbFNlcAotICAgICAgICArICJMaW5lIDU4IiArIGxTZXAKLSAgICAgICAgKyAiTGluZSA1OSIgKyBsU2VwCi0gICAgICAgICsgIkxpbmUgNjAiICsgbFNlcDsKKyAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJMaW5lIDU2JW4iCisgICAgICAgICsgIkxpbmUgNTclbiIKKyAgICAgICAgKyAiTGluZSA1OCVuIgorICAgICAgICArICJMaW5lIDU5JW4iCisgICAgICAgICsgIkxpbmUgNjAlbiIpOwogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwpAQCAtNzksOCArNzUsOCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlclJlYWRlck5vQXJncyIpOwogICAgICAgICBGaWxlIGV4cGVjdGVkID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJjb25jYXRmaWx0ZXIudGVzdCIpOwogICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAgImNvbmNhdC5GaWx0ZXJSZWFkZXJOb0FyZ3MudGVzdCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RGaWx0ZXJSZWFkZXJOb0FyZ3M6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwKLSAgICAgICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0RmlsdGVyUmVhZGVyTm9BcmdzOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEzMSw5ICsxMjcsOCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwogICAgICAgICBTdHJpbmcgcmVzdWx0Q29udGVudCA9IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKAogICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9jb25jYXQuIiArIHRhcmdldC5zdWJzdHJpbmcoNCkgKyAiLnRlc3QiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkZpcnN0IDUgbGluZXMgZGlmZmVycy4iLCByZXN1bHRDb250ZW50LnN0YXJ0c1dpdGgoZXhwZWN0ZWRTdGFydCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJMYXN0IDUgbGluZXMgZGlmZmVycy4iLCByZXN1bHRDb250ZW50LmVuZHNXaXRoKGV4cGVjdGVkRW5kKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkZpcnN0IDUgbGluZXMgZGlmZmVycy4iLCByZXN1bHRDb250ZW50LCBzdGFydHNXaXRoKGV4cGVjdGVkU3RhcnQpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiTGFzdCA1IGxpbmVzIGRpZmZlcnMuIiwgcmVzdWx0Q29udGVudCwgZW5kc1dpdGgoZXhwZWN0ZWRFbmQpKTsKICAgICB9CiAKLQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRHluYW1pY0ZpbHRlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0R5bmFtaWNGaWx0ZXJUZXN0LmphdmEKaW5kZXggODVkZjBjZS4uOGYzMzMxYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRHluYW1pY0ZpbHRlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9EeW5hbWljRmlsdGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksOCArMTksOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkZpbGVVdGlsaXRpZXM7CkBAIC0yOCw3ICsyOCw4IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIER5bmFtaWNGaWx0ZXJUZXN0IHsKIApAQCAtNDYsNyArNDcsNyBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZHluYW1pY2ZpbHRlciIpOwogICAgICAgICBTdHJpbmcgY29udGVudCA9IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKAogICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9keW5hbWljZmlsdGVyIikpOwotICAgICAgICBhc3NlcnRDb250YWlucygiaGVsbE8gd09ybGQiLCBjb250ZW50KTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50LCBjb250YWluc1N0cmluZygiaGVsbE8gd09ybGQiKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21GaWx0ZXIgaW1wbGVtZW50cyBDaGFpbmFibGVSZWFkZXIgewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRXNjYXBlVW5pY29kZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0VzY2FwZVVuaWNvZGVUZXN0LmphdmEKaW5kZXggN2M1ZTMwNC4uOTNmYjRmZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvRXNjYXBlVW5pY29kZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Fc2NhcGVVbmljb2RlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvSGVhZFRhaWxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9IZWFkVGFpbFRlc3QuamF2YQppbmRleCAyMWQyNWExLi41ZjI2Y2Y5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9IZWFkVGFpbFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9IZWFkVGFpbFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEyICsyMCwxNiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRmlsZVV0aWxpdGllczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCkBAIC0zNCw4ICszOCwzMSBAQAogLyogSSB3cm90ZSB0aGUgdGVzdGNhc2VzIGluIG9uZSBqYXZhIGZpbGUgYmVjYXVzZSBJIHdhbnQgYWxzbyB0byB0ZXN0IHRoZQogICogY29tYmluZWQgYmVoYXZpb3VyIChzZWUgZW5kIG9mIHRoZSBjbGFzcykuCiAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBIZWFkVGFpbFRlc3QgewogCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiB0YXJnZXRzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0IFtdW10geworICAgICAgICAgICAgICAgIHsiaGVhZCIsICJoZWFkIn0sCisgICAgICAgICAgICAgICAgeyJoZWFkTGluZXMiLCAiaGVhZExpbmVzIn0sCisgICAgICAgICAgICAgICAgeyJoZWFkU2tpcCIsICJoZWFkU2tpcCJ9LAorICAgICAgICAgICAgICAgIHsiaGVhZExpbmVzU2tpcCIsICJoZWFkTGluZXNTa2lwIn0sCisgICAgICAgICAgICAgICAgeyJmaWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwIiwgImhlYWRMaW5lc1NraXAifSwKKyAgICAgICAgICAgICAgICB7InRhaWwiLCAidGFpbCJ9LAorICAgICAgICAgICAgICAgIHsidGFpbFNraXAiLCAidGFpbFNraXAifSwKKyAgICAgICAgICAgICAgICB7InRhaWxMaW5lcyIsICJ0YWlsTGluZXMifSwKKyAgICAgICAgICAgICAgICB7InRhaWxMaW5lc1NraXAiLCAidGFpbExpbmVzU2tpcCJ9LAorICAgICAgICAgICAgICAgIHsiZmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcCIsICJ0YWlsTGluZXNTa2lwIn0sCisgICAgICAgICAgICAgICAgeyJoZWFkVGFpbCIsICJoZWFkdGFpbCJ9fSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFN0cmluZyByZXN1bHQ7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICBwdWJsaWMgU3RyaW5nIGlucHV0OworCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCkBAIC00NSw5MyArNzIsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkIik7Ci0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZC50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2hlYWQtdGFpbC5oZWFkLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0SGVhZDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0IiArIHJlc3VsdC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKQorICAgICAgICAgICAgICAgICsgcmVzdWx0LnN1YnN0cmluZygxKSk7CisgICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9oZWFkLXRhaWwuIgorICAgICAgICAgICAgICAgICsgaW5wdXQgKyAiLnRlc3QiKTsKKyAgICAgICAgRmlsZSBhY3R1YWwgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKQorICAgICAgICAgICAgICAgICsgIi9oZWFkLXRhaWwuIiArICByZXN1bHQgKyAiLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCArICI6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhhY3R1YWwpKTsKICAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkTGluZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEhlYWRMaW5lcyIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvaGVhZC10YWlsLmhlYWRMaW5lcy50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2hlYWQtdGFpbC5oZWFkTGluZXMudGVzdCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RIZWFkTGluZXM6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZFNraXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEhlYWRTa2lwIik7Ci0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZFNraXAudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9oZWFkLXRhaWwuaGVhZFNraXAudGVzdCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RIZWFkU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkTGluZXNTa2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkTGluZXNTa2lwIik7Ci0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZExpbmVzU2tpcC50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2hlYWQtdGFpbC5oZWFkTGluZXNTa2lwLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0SGVhZExpbmVzU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwIik7Ci0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9oZWFkLXRhaWwuaGVhZExpbmVzU2tpcC50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2hlYWQtdGFpbC5maWx0ZXJSZWFkZXJIZWFkTGluZXNTa2lwLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0RmlsdGVyUmVhZGVySGVhZExpbmVzU2tpcDogUmVzdWx0IG5vdCBsaWtlIGV4cGVjdGVkIiwKLSAgICAgICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRhaWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFRhaWwiKTsKLSAgICAgICAgRmlsZSBleHBlY3RlZCA9YnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWwudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9oZWFkLXRhaWwudGFpbC50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdFRhaWw6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFpbExpbmVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUYWlsTGluZXMiKTsKLSAgICAgICAgRmlsZSBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImV4cGVjdGVkL2hlYWQtdGFpbC50YWlsTGluZXMudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9oZWFkLXRhaWwudGFpbExpbmVzLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0VGFpbExpbmVzOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRhaWxTa2lwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUYWlsU2tpcCIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxTa2lwLnRlc3QiKTsKLSAgICAgICAgRmlsZSByZXN1bHQgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvaGVhZC10YWlsLnRhaWxTa2lwLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0VGFpbFNraXA6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFpbExpbmVzU2tpcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGFpbExpbmVzU2tpcCIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxMaW5lc1NraXAudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9oZWFkLXRhaWwudGFpbExpbmVzU2tpcC50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdFRhaWxMaW5lc1NraXA6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcCIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvaGVhZC10YWlsLnRhaWxMaW5lc1NraXAudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9oZWFkLXRhaWwuZmlsdGVyUmVhZGVyVGFpbExpbmVzU2tpcC50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdEZpbHRlclJlYWRlclRhaWxMaW5lc1NraXA6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkVGFpbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SGVhZFRhaWwiKTsKLSAgICAgICAgRmlsZSBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImV4cGVjdGVkL2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2hlYWQtdGFpbC5oZWFkdGFpbC50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygidGVzdEhlYWRUYWlsOiBSZXN1bHQgbm90IGxpa2UgZXhwZWN0ZWQiLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOwotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTGluZUNvbnRhaW5zVGVzdC5qYXZhCmluZGV4IGQxMGQ5NTEuLjBiNTU1NGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL0xpbmVDb250YWluc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9MaW5lQ29udGFpbnNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00OSw4ICs0OSwzNCBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZUxpbmVDb250YWlucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdE5lZ2F0ZUxpbmVDb250YWlucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROZWdhdGVMaW5lQ29udGFpbnMiKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRoZSB7QGNvZGUgbWF0Y2hBbnl9IGF0dHJpYnV0ZSBvZiB7QGxpbmsgTGluZUNvbnRhaW5zfSB3b3JrcyBhcyBleHBlY3RlZAorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbmVDb250YWluc01hdGNoQW55KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNYXRjaEFueSIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvbGluZWNvbnRhaW5zLW1hdGNoYW55LnRlc3QiKTsKKyAgICAgICAgRmlsZSByZXN1bHQgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgImxpbmVjb250YWlucy50ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHtAY29kZSBtYXRjaEFueX0gYXR0cmlidXRlIHdoZW4gdXNlZCB3aXRoIHRoZSB7QGNvZGUgbmVnYXRlfSBhdHRyaWJ1dGUKKyAgICAgKiBvZiB7QGxpbmsgTGluZUNvbnRhaW5zfSB3b3JrcyBhcyBleHBlY3RlZAorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbmVDb250YWluc01hdGNoQW55TmVnYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNYXRjaEFueU5lZ2F0ZSIpOworICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvbGluZWNvbnRhaW5zLW1hdGNoYW55LW5lZ2F0ZS50ZXN0Iik7CisgICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJsaW5lY29udGFpbnMudGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ob05ld0xpbmVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ob05ld0xpbmVUZXN0LmphdmEKaW5kZXggYzEyYTFkMy4uNTliODk1OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvTm9OZXdMaW5lVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL05vTmV3TGluZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDggKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKQEAgLTQxLDcgKzM5LDcgQEAKIAogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BZGROZXdMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BZGROZXdMaW5lKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vQWRkTmV3TGluZSIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vuc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1JlcGxhY2VUb2tlbnNUZXN0LmphdmEKaW5kZXggNGRiOGQ3YS4uN2RlMzdkYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvUmVwbGFjZVRva2Vuc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9SZXBsYWNlVG9rZW5zVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTcgKzIwLDM4IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUmVwbGFjZVRva2Vuc1Rlc3QgewogCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiB0YXJnZXRzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0IFtdW10geworICAgICAgICAgICAgICAgIHsicmVwbGFjZVRva2VucyIsICJyZXBsYWNldG9rZW5zIn0sCisgICAgICAgICAgICAgICAgeyJyZXBsYWNlVG9rZW5zUHJvcGVydHlGaWxlIiwgInJlcGxhY2V0b2tlbnMifSwKKyAgICAgICAgICAgICAgICB7InJlcGxhY2VUb2tlbnNEb3VibGVFbmNvZGVkIiwgInJlcGxhY2V0b2tlbnMuZG91YmxlIn0sCisgICAgICAgICAgICAgICAgeyJyZXBsYWNlVG9rZW5zRG91YmxlRW5jb2RlZFRvU2ltcGxlIiwgInJlcGxhY2V0b2tlbnMifSwKKyAgICAgICAgICAgICAgICB7InJlcGxhY2VUb2tlbnNNdXN0YWNoZVN0eWxlIiwgInJlcGxhY2V0b2tlbnMifX0pOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgcmVzdWx0OworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgcHVibGljIFN0cmluZyBpbnB1dDsKKwogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIApAQCAtNDAsNDIgKzYxLDE0IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRva2VucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UmVwbGFjZVRva2VucyIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvcmVwbGFjZXRva2Vucy50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJyZXBsYWNldG9rZW5zLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRva2Vuc1Byb3BlcnR5RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UmVwbGFjZVRva2Vuc1Byb3BlcnR5RmlsZSIpOwotICAgICAgICBGaWxlIGV4cGVjdGVkID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiZXhwZWN0ZWQvcmVwbGFjZXRva2Vucy50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJyZXBsYWNldG9rZW5zUHJvcGVydHlGaWxlLnRlc3QiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGV4cGVjdGVkKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMocmVzdWx0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVRva2Vuc0RvdWJsZUVuY29kZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJlcGxhY2VUb2tlbnNEb3VibGVFbmNvZGVkIik7Ci0gICAgICAgIEZpbGUgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJleHBlY3RlZC9yZXBsYWNldG9rZW5zLmRvdWJsZS50ZXN0Iik7Ci0gICAgICAgIEZpbGUgcmVzdWx0ID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJyZXBsYWNldG9rZW5zLmRvdWJsZS50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VUb2tlbnNEb3VibGVFbmNvZGVkVG9TaW1wbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJlcGxhY2VUb2tlbnNEb3VibGVFbmNvZGVkVG9TaW1wbGUiKTsKLSAgICAgICAgRmlsZSBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImV4cGVjdGVkL3JlcGxhY2V0b2tlbnMudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAicmVwbGFjZXRva2Vucy5kb3VibGUudGVzdCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhyZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlVG9rZW5zTXVzdGFjaGVTdHlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UmVwbGFjZVRva2Vuc011c3RhY2hlU3R5bGUiKTsKLSAgICAgICAgRmlsZSBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImV4cGVjdGVkL3JlcGxhY2V0b2tlbnMudGVzdCIpOwotICAgICAgICBGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAicmVwbGFjZXRva2Vucy5tdXN0YWNoZS50ZXN0Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhleHBlY3RlZCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHJlc3VsdCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QiICsgcmVzdWx0LnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpCisgICAgICAgICAgICAgICAgKyByZXN1bHQuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgRmlsZSBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImV4cGVjdGVkLyIKKyAgICAgICAgICAgICAgICArIGlucHV0ICsgIi50ZXN0Iik7CisgICAgICAgIEZpbGUgYWN0dWFsID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikKKyAgICAgICAgICAgICAgICArICIvIiArICByZXN1bHQgKyAiLnRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCArICI6IFJlc3VsdCBub3QgbGlrZSBleHBlY3RlZCIsCisgICAgICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZXhwZWN0ZWQpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhhY3R1YWwpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9TdHJpcEphdmFDb21tZW50c1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzVGVzdC5qYXZhCmluZGV4IDcxMTRkNDkuLmJhOGNiNzMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9maWx0ZXJzL1N0cmlwSmF2YUNvbW1lbnRzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2ZpbHRlcnMvVG9rZW5GaWx0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlclRlc3QuamF2YQppbmRleCBiMDdhYmUwLi41ZWQ0N2U4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvZmlsdGVycy9Ub2tlbkZpbHRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE4ICsxOCwyMSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Tm90Q29udGFpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHMucmVhZEZ1bGx5OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuYm90aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNLZXk7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVGhhdDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUmVhZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC00MSw4ICs0NCw2IEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy9maWx0ZXJzL3Rva2VuZmlsdGVyLnhtbCIpOwpAQCAtNTEsOTkgKzUyLDEwMSBAQAogCiAgICAgLyoqIG1ha2Ugc3VyZSB0b2tlbmZpbHRlciBleGlzdHMgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbmZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFRva2VuZmlsdGVyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidG9rZW5maWx0ZXIiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RUcmltaWdub3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbWlnbm9yZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRyaW1pZ25vcmUiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkhlbGxvLVdvcmxkIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJIZWxsby1Xb3JsZCIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdUb2tlbml6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdUb2tlbml6ZXIoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzdHJpbmd0b2tlbml6ZXIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiNUaGlzI2lzI2EjbnVtYmVyI29mI3dvcmRzIyIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiI1RoaXMjaXMjYSNudW1iZXIjb2Yjd29yZHMjIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVuaXhMaW5lT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVuaXhsaW5lb3V0cHV0Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJcblRoaXNcbmlzXG5hXG5udW1iZXJcbm9mXG53b3Jkc1xuIiwKLSAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bml4bGluZW91dHB1dCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bml4bGluZW91dHB1dCIpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJcblRoaXNcbmlzXG5hXG5udW1iZXJcbm9mXG53b3Jkc1xuIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERvc0xpbmVPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkb3NsaW5lb3V0cHV0Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJcclxuVGhpc1xyXG5pc1xyXG5hXHJcbm51bWJlclxyXG5vZlxyXG53b3Jkc1xyXG4iLAotICAgICAgICAgICAgICAgIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2Rvc2xpbmVvdXRwdXQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvZG9zbGluZW91dHB1dCIpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJcclxuVGhpc1xyXG5pc1xyXG5hXHJcbm51bWJlclxyXG5vZlxyXG53b3Jkc1xyXG4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVRva2VuaXplcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJmaWxldG9rZW5pemVyIik7Ci0gICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2ZpbGV0b2tlbml6ZXIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiAgIG9mIHdvcmRzIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiIFRoaXMgaXMiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvZmlsZXRva2VuaXplciIpLAorICAgICAgICAgICAgICAgIGJvdGgoY29udGFpbnNTdHJpbmcoIiAgIG9mIHdvcmRzIikpLmFuZChub3QoY29udGFpbnNTdHJpbmcoIiBUaGlzIGlzIikpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZXBsYWNlc3RyaW5nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0aGlzIGlzIHRoZSBtb29uIiwKLSAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlc3RyaW5nIikpOworICAgICAgICBhc3NlcnRUaGF0KGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VzdHJpbmciKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygidGhpcyBpcyB0aGUgbW9vbiIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTdHJpbmdzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVwbGFjZXN0cmluZ3MiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImJhciBiYXIgYmFyIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJiYXIgYmFyIGJhciIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1N0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb250YWluc3N0cmluZyIpOwotICAgICAgICBTdHJpbmcgY29udGVudHMgPSBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9jb250YWluc3N0cmluZyIpOwotICAgICAgICBhc3NlcnRDb250YWlucygidGhpcyBpcyBhIGxpbmUgY29udGFpbnMgZm9vIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygidGhpcyBsaW5lIGRvZXMgbm90IiwgY29udGVudHMpOworICAgICAgICBhc3NlcnRUaGF0KGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2NvbnRhaW5zc3RyaW5nIiksCisgICAgICAgICAgICAgICAgYm90aChjb250YWluc1N0cmluZygidGhpcyBpcyBhIGxpbmUgY29udGFpbnMgZm9vIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW5kKG5vdChjb250YWluc1N0cmluZygidGhpcyBsaW5lIGRvZXMgbm90IikpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVJlZ2V4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGFzcmVnZXgiKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlJlZ2V4IG5vdCBwcmVzZW50IiwKLSAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlcmVnZXhwIikuY29udGFpbnMoImJ5ZSB3b3JsZCIpKTsKKyAgICAgICAgYXNzdW1lVGhhdCgiUmVnZXggbm90IHByZXNlbnQiLAorICAgICAgICAgICAgICAgIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VyZWdleHAiKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiYnllIHdvcmxkIikpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZXBsYWNlcmVnZXgiKTsKICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvcmVwbGFjZXJlZ2V4Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ3b3JsZCB3b3JsZCB3b3JsZCB3b3JsZCIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImRvZyBDYXQgZG9nIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnRDb250YWlucygibW9vbiBTdW4gU3VuIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnRDb250YWlucygiZm91bmQgV2hpdGVTcGFjZSIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkZvdW5kIGRpZ2l0cyBbMTIzNF0iLCBjb250ZW50cyk7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCJUaGlzIGlzIGEgbGluZSB3aXRoIGRpZ2l0cyIsIGNvbnRlbnRzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgY29udGFpbnNTdHJpbmcoIndvcmxkIHdvcmxkIHdvcmxkIHdvcmxkIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRlbnRzLCBjb250YWluc1N0cmluZygiZG9nIENhdCBkb2ciKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJtb29uIFN1biBTdW4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJmb3VuZCBXaGl0ZVNwYWNlIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRlbnRzLCBjb250YWluc1N0cmluZygiRm91bmQgZGlnaXRzIFsxMjM0XSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgbm90KGNvbnRhaW5zU3RyaW5nKCJUaGlzIGlzIGEgbGluZSB3aXRoIGRpZ2l0cyIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUmVwbGFjZVJlZ2V4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImhhc3JlZ2V4Iik7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJSZWdleCBub3QgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvcmVwbGFjZXJlZ2V4cCIpLmNvbnRhaW5zKCJieWUgd29ybGQiKSk7CisgICAgICAgIGFzc3VtZVRoYXQoIlJlZ2V4IG5vdCBwcmVzZW50IiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlcmVnZXhwIiksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoImJ5ZSB3b3JsZCIpKTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsdGVycmVwbGFjZXJlZ2V4Iik7Ci0gICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2ZpbHRlcnJlcGxhY2VyZWdleCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygid29ybGQgd29ybGQgd29ybGQgd29ybGQiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvZmlsdGVycmVwbGFjZXJlZ2V4IiksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIndvcmxkIHdvcmxkIHdvcmxkIHdvcmxkIikpOwogCiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFuZGxlRG9sbGVyTWF0Y2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGFzcmVnZXgiKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlJlZ2V4IG5vdCBwcmVzZW50IiwgZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvcmVwbGFjZXJlZ2V4cCIpLmNvbnRhaW5zKCJieWUgd29ybGQiKSk7CisgICAgICAgIGFzc3VtZVRoYXQoIlJlZ2V4IG5vdCBwcmVzZW50IiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlcmVnZXhwIiksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoImJ5ZSB3b3JsZCIpKTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZG9sbGVybWF0Y2giKTsKICAgICB9CkBAIC0xNTIsOTkgKzE1NSwxMTAgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidHJpbWZpbGUiKTsKICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdHJpbWZpbGUiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibm8gd3MgYXQgc3RhcnQiLCBjb250ZW50cy5zdGFydHNXaXRoKCJUaGlzIGlzIHRoIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJubyB3cyBhdCBlbmQiLCBjb250ZW50cy5lbmRzV2l0aCgic2Vjb25kIGxpbmUuIikpOwotICAgICAgICBhc3NlcnRDb250YWlucygiICBUaGlzIGlzIHRoZSBzZWNvbmQiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoIm5vIHdzIGF0IHN0YXJ0IiwgY29udGVudHMsIHN0YXJ0c1dpdGgoIlRoaXMgaXMgdGgiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIm5vIHdzIGF0IGVuZCIsIGNvbnRlbnRzLCBlbmRzV2l0aCgic2Vjb25kIGxpbmUuIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnRlbnRzLCBjb250YWluc1N0cmluZygiICBUaGlzIGlzIHRoZSBzZWNvbmQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbUZpbGVCeUxpbmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidHJpbWZpbGVieWxpbmUiKTsKICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdHJpbWZpbGVieWxpbmUiKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIm5vIHdzIGF0IHN0YXJ0IiwgY29udGVudHMuc3RhcnRzV2l0aCgiVGhpcyBpcyB0aCIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIm5vIHdzIGF0IGVuZCIsIGNvbnRlbnRzLmVuZHNXaXRoKCJzZWNvbmQgbGluZS4iKSk7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCIgIFRoaXMgaXMgdGhlIHNlY29uZCIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImZpbGUuXG5UaGlzIGlzIHRoZSBzZWNvbmQiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoIm5vIHdzIGF0IHN0YXJ0IiwgY29udGVudHMsIG5vdChzdGFydHNXaXRoKCJUaGlzIGlzIHRoIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgibm8gd3MgYXQgZW5kIiwgY29udGVudHMsIG5vdChlbmRzV2l0aCgic2Vjb25kIGxpbmUuIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgbm90KGNvbnRhaW5zU3RyaW5nKCIgIFRoaXMgaXMgdGhlIHNlY29uZCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJmaWxlLlxuVGhpcyBpcyB0aGUgc2Vjb25kIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlclJlcGxhY2VTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsdGVycmVwbGFjZXN0cmluZyIpOwotICAgICAgICBTdHJpbmcgY29udGVudHMgPSBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9maWx0ZXJyZXBsYWNlc3RyaW5nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJUaGlzIGlzIHRoZSBtb29uIiwgY29udGVudHMpOworICAgICAgICBhc3NlcnRUaGF0KGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2ZpbHRlcnJlcGxhY2VzdHJpbmciKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiVGhpcyBpcyB0aGUgbW9vbiIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJSZXBsYWNlU3RyaW5ncygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlclJlcGxhY2VTdHJpbmdzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsdGVycmVwbGFjZXN0cmluZ3MiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImJhciBiYXIgYmFyIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJiYXIgYmFyIGJhciIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1JlZ2V4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImhhc3JlZ2V4Iik7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJSZWdleCBub3QgcHJlc2VudCIsIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VyZWdleHAiKS5jb250YWlucygiYnllIHdvcmxkIikpOworICAgICAgICBhc3N1bWVUaGF0KCJSZWdleCBub3QgcHJlc2VudCIsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvcmVwbGFjZXJlZ2V4cCIpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJieWUgd29ybGQiKSk7CiAKLSAgICAgICAgLy9leHBlY3RGaWxlQ29udGFpbnMoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VyZWdleHAiLCAiYnllIHdvcmxkIik7CisgICAgICAgIC8vIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VyZWdleHAiLAorICAgICAgICAvLyBjb250YWluc1N0cmluZygiYnllIHdvcmxkIikpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb250YWluc3JlZ2V4Iik7CiAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2NvbnRhaW5zcmVnZXgiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImhlbGxvIHdvcmxkIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygidGhpcyBpcyB0aGUgbW9vbiIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIldvcmxkIGhlcmUiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJoZWxsbyB3b3JsZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgbm90KGNvbnRhaW5zU3RyaW5nKCJ0aGlzIGlzIHRoZSBtb29uIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgY29udGFpbnNTdHJpbmcoIldvcmxkIGhlcmUiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQ29udGFpbnNSZWdleCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJoYXNyZWdleCIpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiUmVnZXggbm90IHByZXNlbnQiLCBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlcmVnZXhwIikuY29udGFpbnMoImJ5ZSB3b3JsZCIpKTsKKyAgICAgICAgYXNzdW1lVGhhdCgiUmVnZXggbm90IHByZXNlbnQiLAorICAgICAgICAgICAgICAgIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3JlcGxhY2VyZWdleHAiKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiYnllIHdvcmxkIikpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJmaWx0ZXJjb250YWluc3JlZ2V4Iik7CiAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2ZpbHRlcmNvbnRhaW5zcmVnZXgiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImhlbGxvIHdvcmxkIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygidGhpcyBpcyB0aGUgbW9vbiIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIldvcmxkIGhlcmUiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJoZWxsbyB3b3JsZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgbm90KGNvbnRhaW5zU3RyaW5nKCJ0aGlzIGlzIHRoZSBtb29uIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb250ZW50cywgY29udGFpbnNTdHJpbmcoIldvcmxkIGhlcmUiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNSZWdleDIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGFzcmVnZXgiKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlJlZ2V4IG5vdCBwcmVzZW50IiwgZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvcmVwbGFjZXJlZ2V4cCIpLmNvbnRhaW5zKCJieWUgd29ybGQiKSk7CisgICAgICAgIGFzc3VtZVRoYXQoIlJlZ2V4IG5vdCBwcmVzZW50IiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9yZXBsYWNlcmVnZXhwIiksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoImJ5ZSB3b3JsZCIpKTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29udGFpbnNyZWdleDIiKTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvY29udGFpbnNyZWdleDIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoInZvaWQgcmVnaXN0ZXJfYml0cygpOyIsIGNvbnRlbnRzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9jb250YWluc3JlZ2V4MiIpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJ2b2lkIHJlZ2lzdGVyX2JpdHMoKTsiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ2hhcmFjdGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkZWxldGVjaGFyYWN0ZXJzIik7CiAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2RlbGV0ZWNoYXJzIik7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCIjIiwgY29udGVudHMpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiKiIsIGNvbnRlbnRzKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlRoaXMgaXMgc29tZSAiLCBjb250ZW50cyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIG5vdChjb250YWluc1N0cmluZygiIyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIG5vdChjb250YWluc1N0cmluZygiKiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudHMsIGNvbnRhaW5zU3RyaW5nKCJUaGlzIGlzIHNvbWUgIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdEZpbHRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJQcm9qZWN0IGRvZXMgbm90IGhhdmUgJ3Rlc3RTY3JpcHRGaWx0ZXInIHRhcmdldCIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRUYXJnZXRzKCkuY29udGFpbnMoInRlc3RTY3JpcHRGaWx0ZXIiKSk7CisgICAgICAgIGFzc3VtZVRoYXQoIlByb2plY3QgZG9lcyBub3QgaGF2ZSAndGVzdFNjcmlwdEZpbHRlcicgdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFRhcmdldHMoKSwgaGFzS2V5KCJ0ZXN0U2NyaXB0RmlsdGVyIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2NyaXB0ZmlsdGVyIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJIRUxMTyBXT1JMRCIsIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3NjcmlwdGZpbHRlciIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9zY3JpcHRmaWx0ZXIiKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiSEVMTE8gV09STEQiKSk7CiAKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRGaWx0ZXIyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlByb2plY3QgZG9lcyBub3QgaGF2ZSAndGVzdFNjcmlwdEZpbHRlcicgdGFyZ2V0IiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRUYXJnZXRzKCkuY29udGFpbnMoInRlc3RTY3JpcHRGaWx0ZXIiKSk7CisgICAgICAgIGFzc3VtZVRoYXQoIlByb2plY3QgZG9lcyBub3QgaGF2ZSAndGVzdFNjcmlwdEZpbHRlcicgdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFRhcmdldHMoKSwgaGFzS2V5KCJ0ZXN0U2NyaXB0RmlsdGVyIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2NyaXB0ZmlsdGVyMiIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiSEVMTE8gTU9PTiIsIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3NjcmlwdGZpbHRlcjIiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0RmlsZVN0cmluZyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvc2NyaXB0ZmlsdGVyMiIpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJIRUxMTyBNT09OIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVRva2VuRmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImN1c3RvbXRva2VuZmlsdGVyIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJIZWxsbyBXb3JsZCIsIGdldEZpbGVTdHJpbmcoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL2N1c3RvbSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRGaWxlU3RyaW5nKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9jdXN0b20iKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiSGVsbG8gV29ybGQiKSk7CiAgICAgfQogCiAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNTIsMjMgKzI2NiwxNSBAQAogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgICBwcml2YXRlIFN0cmluZyBnZXRGaWxlU3RyaW5nKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgUmVhZGVyIHIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgciA9IG5ldyBGaWxlUmVhZGVyKEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksZmlsZW5hbWUpKTsKLSAgICAgICAgICAgIHJldHVybiAgRmlsZVV0aWxzLnJlYWRGdWxseShyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShyKTsKKyAgICAgICAgdHJ5IChSZWFkZXIgciA9IG5ldyBGaWxlUmVhZGVyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZmlsZW5hbWUpKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRGdWxseShyKTsKICAgICAgICAgfQogICAgIH0KIAogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYXBpdGFsaXplIGltcGxlbWVudHMgVG9rZW5GaWx0ZXIuRmlsdGVyIHsKICAgICAgICAgcHVibGljIFN0cmluZyBmaWx0ZXIoU3RyaW5nIHRva2VuKSB7Ci0gICAgICAgICAgICBpZiAodG9rZW4ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0b2tlbi5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHRva2VuLnN1YnN0cmluZygxKTsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbi5pc0VtcHR5KCkgPyB0b2tlbiA6IHRva2VuLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdG9rZW4uc3Vic3RyaW5nKDEpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvbGF1bmNoL0xvY2F0b3JUZXN0LmphdmEKaW5kZXggYjhkZmZhZS4uNTRmYzRhOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L2xhdW5jaC9Mb2NhdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTG9jYXRvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDExICsyMiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogLyoqIFRlc3QgdGhlIGxvY2F0b3IgaW4gdGhlIGFudC1sYXVuY2ggSkFSICovCiBwdWJsaWMgY2xhc3MgTG9jYXRvclRlc3QgewpAQCAtMzYsOSArMzcsMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkVEX0pBUl9VUkkgPSAiamFyOmZpbGU6IiArIExBVU5DSEVSX0pBUgogICAgICAgICAgICAgKyAiIS9vcmcvYXBhY2hlL3Rvb2xzL2FudC9sYXVuY2gvTGF1bmNoZXIuY2xhc3MiOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOwogCiAgICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIHdpbmRvd3MgPSBPcy5pc0ZhbWlseShPcy5GQU1JTFlfRE9TKTsKICAgICAgICAgdW5peCA9IE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9VTklYKTsKICAgICB9CkBAIC02NSw3ICs2OCw3IEBACiAgICAgICogQHBhcmFtIGVuYWJsZWQgaXMgdGhlIHRlc3QgZW5hYmxlZD8KICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVzb2x2ZWQoU3RyaW5nIHVyaSwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0LCBTdHJpbmcgcmVzdWx0LCBib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgaWYgKGVuYWJsZWQgJiYgZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCAmJiBleHBlY3RlZFJlc3VsdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgJiYgZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCAmJiAhZXhwZWN0ZWRSZXN1bHQuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkICIgKyB1cmkgKyAiIHRvIHJlc29sdmUgdG8gXG4iICsgZXhwZWN0ZWRSZXN1bHQgKyAiXG4gYnV0IGdvdFxuIgogICAgICAgICAgICAgICAgICAgICArIHJlc3VsdCArICJcbiIsIGV4cGVjdGVkUmVzdWx0LCByZXN1bHQpOwogICAgICAgICB9CkBAIC04Niw5ICs4OSw4IEBACiAKICAgICAvKioKICAgICAgKiB0aGlzIGlzbid0IHJlYWxseSBhIHZhbGlkIFVSSSwgZXhjZXB0IG1heWJlIGluIElFCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TmV0d29ya1VSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3ROZXR3b3JrVVJJKCkgewogICAgICAgICByZXNvbHZlVG8oImZpbGU6XFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiLCAiIgogICAgICAgICAgICAgICAgICsgIlxcXFxQQzAzXFxqY2xhc3Nlc1xcbGliXFxhbnQtMS43LjAuamFyIiwKICAgICAgICAgICAgICAgICAiXFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiKTsKQEAgLTk2LDI2ICs5OCwyNiBAQAogCiAgICAgQElnbm9yZSgiV2UgZG9uJ3QgYXBwZWFyIHRvIGdlbmVyYXRlIHBhdGhzIGxpa2UgdGhpcyBpbiB0aGUgbGF1bmNoZXIiKQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRyaXBsZUZvcndhcmRTbGFzaE5ldHdvcmtVUkkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpcGxlRm9yd2FyZFNsYXNoTmV0d29ya1VSSSgpIHsKICAgICAgICAgcmVzb2x2ZVRvKCJmaWxlOi8vL1BDMDMvamNsYXNzZXMvbGliL2FudC0xLjcuMC5qYXIiLAogICAgICAgICAgICAgICAgICIvLy9QQzAzL2pjbGFzc2VzL2xpYi9hbnQtMS43LjAuamFyIiwKICAgICAgICAgICAgICAgICAiXFxcXFBDMDNcXGpjbGFzc2VzXFxsaWJcXGFudC0xLjcuMC5qYXIiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4TmV0d29ya1BhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peE5ldHdvcmtQYXRoKCkgewogICAgICAgICByZXNvbHZlVG8oImZpbGU6Ly9jbHVzdGVyL2hvbWUvYW50L2xpYiIsCiAgICAgICAgICAgICAgICAgIi8vY2x1c3Rlci9ob21lL2FudC9saWIiLAogICAgICAgICAgICAgICAgICJcXFxcY2x1c3RlclxcaG9tZVxcYW50XFxsaWIiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4UGF0aCgpIHsKICAgICAgICAgcmVzb2x2ZVRvKCJmaWxlOi9ob21lL2FudC9saWIiLCAiL2hvbWUvYW50L2xpYiIsIG51bGwpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNwYWNlZFVSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFjZWRVUkkoKSB7CiAgICAgICAgIHJlc29sdmVUbygiZmlsZTpDOlxcUHJvZ3JhbSBGaWxlc1xcQW50XFxsaWIiLAogICAgICAgICAgICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcQW50XFxsaWIiLAogICAgICAgICAgICAgICAgICJDOlxcUHJvZ3JhbSBGaWxlc1xcQW50XFxsaWIiKTsKQEAgLTEyMywxMCArMTI1LDkgQEAKIAogICAgIC8qKgogICAgICAqIEJ1ZyA0MjI3NTsgQW50IGZhaWxpbmcgdG8gcnVuIG9mZiBhIHJlbW90ZSBzaGFyZQotICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGlmIGRlc2lyZWQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRPblJlbW90ZVNoYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgcHVibGljIHZvaWQgdGVzdEFudE9uUmVtb3RlU2hhcmUoKSB7CiAgICAgICAgIFN0cmluZyByZXNvbHZlZCA9IExvY2F0b3IuZnJvbUphclVSSShTSEFSRURfSkFSX1VSSSk7CiAgICAgICAgIGFzc2VydFJlc29sdmVkKFNIQVJFRF9KQVJfVVJJLCBMQVVOQ0hFUl9KQVIsIHJlc29sdmVkLCB1bml4KTsKICAgICAgICAgYXNzZXJ0UmVzb2x2ZWQoU0hBUkVEX0pBUl9VUkksIExBVU5DSEVSX0pBUi5yZXBsYWNlKCcvJywgJ1xcJyksCkBAIC0xMzUsMzAgKzEzNiwyMiBAQAogCiAgICAgLyoqCiAgICAgICogQnVnIDQyMjc1OyBBbnQgZmFpbGluZyB0byBydW4gb2ZmIGEgcmVtb3RlIHNoYXJlCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFRocm93YWJsZSBpZiBkZXNpcmVkCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUZyb21SZW1vdGVTaGFyZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlRnJvbVJlbW90ZVNoYXJlKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJub3QgV2luZG93cyIsIHdpbmRvd3MpOwogICAgICAgICBTdHJpbmcgcmVzb2x2ZWQgPSBMb2NhdG9yLmZyb21KYXJVUkkoU0hBUkVEX0pBUl9VUkkpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShyZXNvbHZlZCk7CiAgICAgICAgIFN0cmluZyBwYXRoID0gZi5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgaWYgKHdpbmRvd3MpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBwYXRoLmluZGV4T2YoIlxcXFwiKSk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBhdGguaW5kZXhPZigiXFxcXCIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwVVJJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB1cmwgPSAiaHR0cDovL2FudC5hcGFjaGUub3JnIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvY2F0b3IuZnJvbVVSSSh1cmwpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoTG9jYXRvci5FUlJPUl9OT1RfRklMRV9VUkksIG1lc3NhZ2UpOwotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnModXJsLCBtZXNzYWdlKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwc1VSSSgpIHsKKyAgICAgICAgU3RyaW5nIHVybCA9ICJodHRwczovL2FudC5hcGFjaGUub3JnIjsKKyAgICAgICAgdGhyb3duLmV4cGVjdChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShMb2NhdG9yLkVSUk9SX05PVF9GSUxFX1VSSSArIHVybCk7CisgICAgICAgIExvY2F0b3IuZnJvbVVSSSh1cmwpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzQsNyArMTY3LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPZGRMb3dBc2NpaVVSSSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RPZGRMb3dBc2NpaVVSSSgpIHsKICAgICAgICAgYXNzZXJ0UmVzb2x2ZXMoImhhc2gjIGFuZCBwZXJjZW50JSIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0Q3ZzVGFza1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BYnN0cmFjdEN2c1Rhc2tUZXN0LmphdmEKaW5kZXggMjI3OTg3Zi4uYmQ3YzY4OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Fic3RyYWN0Q3ZzVGFza1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQWJzdHJhY3RDdnNUYXNrVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0yNiw2ICsyNSw5IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC01NCwxOCArNTYsMTggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlQXR0cmlidXRlKCkgewogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvc3JjL01ha2VmaWxlIik7Ci0gICAgICAgIGFzc2VydFRydWUoInN0YXJ0aW5nIGVtcHR5IiwgIWYuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgic3RhcnRpbmcgZW1wdHkiLCBmLmV4aXN0cygpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInBhY2thZ2UtYXR0cmlidXRlIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiVSBzcmMvTWFrZWZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlUgc3JjL01ha2VmaWxlIikpOwogICAgICAgICBhc3NlcnRUcnVlKCJub3cgaXQgaXMgdGhlcmUiLCBmLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUYWdBdHRyaWJ1dGUoKSB7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi9zcmMvTWFrZWZpbGUiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic3RhcnRpbmcgZW1wdHkiLCAhZi5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJzdGFydGluZyBlbXB0eSIsIGYuZXhpc3RzKCkpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGFnLWF0dHJpYnV0ZSIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIk9QRU5CU0RfNV8zIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJPUEVOQlNEXzVfMyIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgibm93IGl0IGlzIHRoZXJlIiwgZi5leGlzdHMoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudExpa2VUYXNrc0F0VG9wTGV2ZWxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QuamF2YQppbmRleCBjYjAzNjA5Li5lMWRkYmFiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50TGlrZVRhc2tzQXRUb3BMZXZlbFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDkgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIEBzaW5jZSBBbnQgMS42CkBAIC0zNCwzNyArMzIsMjggQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxhbnQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiYW50IHRhc2sgYXQgdGhlIHRvcCBsZXZlbCBtdXN0IG5vdCBpbnZva2UgaXRzIG93biIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnVpbGQgZmlsZS4iLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJhbnQgdGFzayBhdCB0aGUgdG9wIGxldmVsIG11c3Qgbm90IGludm9rZSBpdHMgb3duIGJ1aWxkIGZpbGUuIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbGFudC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJhbnQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxzdWJhbnQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJubyBleGNlcHRpb24gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3ViYW50IHRhc2sgYXQgdGhlIHRvcCBsZXZlbCBtdXN0IG5vdCBpbnZva2UgaXRzIG93biIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICIgYnVpbGQgZmlsZS4iLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJzdWJhbnQgdGFzayBhdCB0aGUgdG9wIGxldmVsIG11c3Qgbm90IGludm9rZSBpdHMgb3duIGJ1aWxkIGZpbGUuIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3BsZXZlbHN1YmFudC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRjYWxsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvcGxldmVsYW50Y2FsbC54bWwiKTsKLSAgICAgICAgICAgIGZhaWwoIm5vIGV4Y2VwdGlvbiB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbnRjYWxsIG11c3Qgbm90IGJlIHVzZWQgYXQgdGhlIHRvcCBsZXZlbC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImFudGNhbGwgbXVzdCBub3QgYmUgdXNlZCBhdCB0aGUgdG9wIGxldmVsLiIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdG9wbGV2ZWxhbnRjYWxsLnhtbCIpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRTdHJ1Y3R1cmVUZXN0LmphdmEKaW5kZXggZGE1MWI1ZC4uNDg2YjQ5ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFN0cnVjdHVyZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50U3RydWN0dXJlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTIgKzE4LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zMSw3ICsyOSwxMSBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKICAqLwpAQCAtNTAsMTQgKzUyLDEyIEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZWFyRG93biIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgbGFja2luZyBhIHJlcXVpcmVkIGFyZ3VtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgIC8vIHRoZSB0ZXN0IGhhcyBsaWtlbHkgYmVlbiBsb2FkZWQgdmlhIGEgZGlmZmVyZW50IGNsYXNzbG9hZGVyCiAgICAgICAgIC8vIHRoYW4gdGhpcyBjbGFzcy4gIFRoZXJlZm9yZSB3ZSBtYWtlIHRoZSBwcmludGVyIGFzc2VydCBpdHMKICAgICAgICAgLy8gc3RhdGUgYW5kIG9ubHkgY2hlY2sgZm9yIHRoZSB0YWlsIGludm9jYXRpb24uCi0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucyhNeVByaW50ZXIuVEFJTF9DQUxMRUQsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZyhNeVByaW50ZXIuVEFJTF9DQUxMRUQpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UHJpbnRlciBpbXBsZW1lbnRzIEFudFN0cnVjdHVyZS5TdHJ1Y3R1cmVQcmludGVyIHsKQEAgLTc5LDM0ICs3OSwzOCBAQAogICAgICAgICBwcml2YXRlIGludCBlbGVtZW50Q2FsbGVkID0gMDsKICAgICAgICAgcHJpdmF0ZSBQcm9qZWN0IHA7CiAKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnRIZWFkKFByaW50V3JpdGVyIG91dCwgUHJvamVjdCBwLCBIYXNodGFibGUgdGFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNodGFibGUgdHlwZXMpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCFoZWFkQ2FsbGVkKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCF0YXJnZXRDYWxsZWQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIXRhaWxDYWxsZWQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBlbGVtZW50Q2FsbGVkKTsKKyAgICAgICAgcHVibGljIHZvaWQgcHJpbnRIZWFkKFByaW50V3JpdGVyIG91dCwgUHJvamVjdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IHRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgQ2xhc3M8Pz4+IHR5cGVzKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShoZWFkQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHRhcmdldENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSh0YWlsQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBlbGVtZW50Q2FsbGVkKTsKICAgICAgICAgICAgIGhlYWRDYWxsZWQgPSB0cnVlOwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRUYXJnZXREZWNsKFByaW50V3JpdGVyIG91dCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaGVhZENhbGxlZCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghdGFyZ2V0Q2FsbGVkKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCF0YWlsQ2FsbGVkKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgZWxlbWVudENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGhlYWRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGFyZ2V0Q2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHRhaWxDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGVsZW1lbnRDYWxsZWQpOwogICAgICAgICAgICAgdGFyZ2V0Q2FsbGVkID0gdHJ1ZTsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50RWxlbWVudERlY2woUHJpbnRXcml0ZXIgb3V0LCBQcm9qZWN0IHAsIFN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIGVsZW1lbnQpIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGhlYWRDYWxsZWQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodGFyZ2V0Q2FsbGVkKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCF0YWlsQ2FsbGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBlbGVtZW50KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGhlYWRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGFpbENhbGxlZCk7CiAgICAgICAgICAgICBlbGVtZW50Q2FsbGVkKys7CiAgICAgICAgICAgICB0aGlzLnAgPSBwOwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgcHJpbnRUYWlsKFByaW50V3JpdGVyIG91dCkgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaGVhZENhbGxlZCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0YXJnZXRDYWxsZWQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIXRhaWxDYWxsZWQpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZWxlbWVudENhbGxlZCA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUodGFyZ2V0Q2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHRhaWxDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbGVtZW50Q2FsbGVkID4gMCk7CiAgICAgICAgICAgICB0YWlsQ2FsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIHAubG9nKFRBSUxfQ0FMTEVEKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRUZXN0LmphdmEKaW5kZXggYWVlOTFmZS4uOGYwYTBmOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTAgKzE5LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CkBAIC0zNSwxMiArMzQsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICovCkBAIC01OSw1NiArNjAsNDkgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNsZWFudXAiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIHJlY3Vyc2l2ZSBjYWxsCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgicmVjdXJzaXZlIGNhbGwiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAotICAgIC8vIHRhcmdldCBtdXN0IGJlIHNwZWNpZmllZAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gdW5zcGVjaWZpZWQgdGFyZ2V0CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgicmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgLy8gU2hvdWxkIGZhaWwgc2luY2UgYSByZWN1cnNpb24gd2lsbCBvY2N1ci4uLgotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gcmVjdXJzaXZlIGNhbGwKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJyZWN1cnNpdmUgY2FsbCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBGYWlsIGR1ZSB0byBlbXB0eSB0YXJnZXQgbmFtZQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICAgICAgICAgIGZhaWwoInRhcmdldCBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIG5vbmV4aXN0ZW50IHRhcmdldAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDRiKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0YiIpOwotICAgICAgICAgICAgZmFpbCgidGFyZ2V0IGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NGIiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTYzLDcgKzE1Nyw3IEBACiAgICAgICAgIEJhc2VkaXJDaGVja2VyIGJjID0gbmV3IEJhc2VkaXJDaGVja2VyKGRpcnMpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoYmMpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZSA9IGJjLmdldEVycm9yKCk7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGFlID0gYmMuZ2V0RXJyb3IoKTsKICAgICAgICAgaWYgKGFlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IGFlOwogICAgICAgICB9CkBAIC0yMjcsNyArMjIxLDcgQEAKICAgICAgICAgUmVmZXJlbmNlQ2hlY2tlciByYyA9IG5ldyBSZWZlcmVuY2VDaGVja2VyKGtleXMsIGV4cGVjdCwgdmFsdWUpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIocmMpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZSA9IHJjLmdldEVycm9yKCk7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGFlID0gcmMuZ2V0RXJyb3IoKTsKICAgICAgICAgaWYgKGFlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IGFlOwogICAgICAgICB9CkBAIC0yMzYsMjMgKzIzMCwxNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZmlsZVBsYWNlbWVudCgpIHsKLSAgICAgICAgRmlsZVtdIGxvZ0ZpbGVzID0gbmV3IEZpbGVbXSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ0ZXN0MS5sb2ciKSwKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QyLmxvZyIpLAotICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiYW50L3Rlc3QzLmxvZyIpLAotICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiYW50L3Rlc3Q0LmxvZyIpCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAoRmlsZSBsb2dGaWxlIDogbG9nRmlsZXMpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUobG9nRmlsZS5nZXROYW1lKCkgKyAiIGRvZXNuXCd0IGV4aXN0IiwKLSAgICAgICAgICAgICAgICAgICAgIWxvZ0ZpbGUuZXhpc3RzKCkpOwotICAgICAgICB9CisgICAgICAgIExpc3Q8RmlsZT4gbG9nRmlsZXMgPSBBcnJheXMuYXNMaXN0KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QxLmxvZyIpLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoInRlc3QyLmxvZyIpLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoImFudC90ZXN0My5sb2ciKSwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJhbnQvdGVzdDQubG9nIikpOworCisgICAgICAgIGxvZ0ZpbGVzLmZvckVhY2gobG9nRmlsZSAtPiBhc3NlcnRGYWxzZShsb2dGaWxlLmdldE5hbWUoKSArICIgZG9lc25cJ3QgZXhpc3QiLAorICAgICAgICAgICAgICAgIGxvZ0ZpbGUuZXhpc3RzKCkpKTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdExvZ2ZpbGVQbGFjZW1lbnQiKTsKIAotICAgICAgICBmb3IgKEZpbGUgbG9nRmlsZSA6IGxvZ0ZpbGVzKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGxvZ0ZpbGUuZ2V0TmFtZSgpICsgIiBleGlzdHMiLAotICAgICAgICAgICAgICAgICAgICBsb2dGaWxlLmV4aXN0cygpKTsKLSAgICAgICAgfQorICAgICAgICBsb2dGaWxlcy5mb3JFYWNoKGxvZ0ZpbGUgLT4gYXNzZXJ0VHJ1ZShsb2dGaWxlLmdldE5hbWUoKSArICIgZXhpc3RzIiwgbG9nRmlsZS5leGlzdHMoKSkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNjIsNyArMjUwLDcgQEAKICAgICAgICAgSW5wdXRIYW5kbGVyQ2hlY2tlciBpYyA9IG5ldyBJbnB1dEhhbmRsZXJDaGVja2VyKGloKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKGljKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRyaXBsZUNhbGwiKTsKLSAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYWUgPSBpYy5nZXRFcnJvcigpOworICAgICAgICBBc3NlcnRpb25FcnJvciBhZSA9IGljLmdldEVycm9yKCk7CiAgICAgICAgIGlmIChhZSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBhZTsKICAgICAgICAgfQpAQCAtMjczLDEzICsyNjEsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmSWQoKSB7CiAgICAgICAgIFBhdGggdGVzdFBhdGggPSBuZXcgUGF0aChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgdGVzdFBhdGguY3JlYXRlUGF0aCgpLnNldFBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7Ci0gICAgICAgIFByb3BlcnR5Q2hlY2tlciBwYyA9Ci0gICAgICAgICAgICBuZXcgUHJvcGVydHlDaGVja2VyKCJ0ZXN0cHJvcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7bnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UGF0aC50b1N0cmluZygpfSk7CisgICAgICAgIFByb3BlcnR5Q2hlY2tlciBwYyA9IG5ldyBQcm9wZXJ0eUNoZWNrZXIoInRlc3Rwcm9wIiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge251bGwsIHRlc3RQYXRoLnRvU3RyaW5nKCl9KTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKHBjKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSZWZpZCIpOwotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZSA9IHBjLmdldEVycm9yKCk7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGFlID0gcGMuZ2V0RXJyb3IoKTsKICAgICAgICAgaWYgKGFlICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IGFlOwogICAgICAgICB9CkBAIC0yOTAsNDcgKzI3Niw0MyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyUHJvcGVydHlXaW5zSW5oZXJpdEFsbCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRVc2VyUHJvcGVydHkoInRlc3QiLCAiNyIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1pbmhlcml0YWxsLXN0YXJ0Iik7Ci0KLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJUaGUgdmFsdWUgb2YgdGVzdCBpcyA3IiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJUaGUgdmFsdWUgb2YgdGVzdCBpcyA3IikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFVzZXJQcm9wZXJ0eVdpbnNOb0luaGVyaXRBbGwoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0VXNlclByb3BlcnR5KCJ0ZXN0IiwgIjciKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QtcHJvcGVydHktb3ZlcnJpZGUtbm8taW5oZXJpdGFsbC1zdGFydCIpOwotCi0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiVGhlIHZhbHVlIG9mIHRlc3QgaXMgNyIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiVGhlIHZhbHVlIG9mIHRlc3QgaXMgNyIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZVdpbnNJbmhlcml0QWxsKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1wcm9wZXJ0eS1vdmVycmlkZS1pbmhlcml0YWxsLXN0YXJ0Iik7Ci0KLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJUaGUgdmFsdWUgb2YgdGVzdCBpcyA0IiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJUaGUgdmFsdWUgb2YgdGVzdCBpcyA0IikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlV2luc05vSW5oZXJpdEFsbCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QtcHJvcGVydHktb3ZlcnJpZGUtbm8taW5oZXJpdGFsbC1zdGFydCIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIlRoZSB2YWx1ZSBvZiB0ZXN0IGlzIDQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlRoZSB2YWx1ZSBvZiB0ZXN0IGlzIDQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlTZXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LXByb3BlcnR5c2V0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJ0ZXN0MSBpcyAke3Rlc3QxfSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoInRlc3QyIGlzICR7dGVzdDJ9IikpOwotICAgICAgICBhc3NlcnRUcnVlKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygidGVzdDEueCBpcyAxIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QxIGlzICR7dGVzdDF9IikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QyIGlzICR7dGVzdDJ9IikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QxLnggaXMgMSIpKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIGluZmluaXRlIHJlY3Vyc2lvbiBsb29wCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5maW5pdGVMb29wVmlhRGVwZW5kcygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbmZpbml0ZS1sb29wLXZpYS1kZXBlbmRzIik7Ci0gICAgICAgICAgICBmYWlsKCJyZWN1cnNpdmUgY2FsbCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImluZmluaXRlLWxvb3AtdmlhLWRlcGVuZHMiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzQyLDcgKzMyNCw2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wTGV2ZWxUYXJnZXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0b3BsZXZlbHRhcmdldCIpOwotCiAgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gd29ybGQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgIH0KIApAQCAtMzU1LDExICszMzYsMTEgQEAKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKHBjQmFyKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKHBjRm9vKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm11bHRpcGxlLXByb3BlcnR5LWZpbGUtY2hpbGRyZW4iKTsKLSAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYWVCYXIgPSBwY0Jhci5nZXRFcnJvcigpOworICAgICAgICBBc3NlcnRpb25FcnJvciBhZUJhciA9IHBjQmFyLmdldEVycm9yKCk7CiAgICAgICAgIGlmIChhZUJhciAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBhZUJhcjsKICAgICAgICAgfQotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBhZUZvbyA9IHBjRm9vLmdldEVycm9yKCk7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGFlRm9vID0gcGNGb28uZ2V0RXJyb3IoKTsKICAgICAgICAgaWYgKGFlRm9vICE9IG51bGwpIHsKICAgICAgICAgICAgIHRocm93IGFlRm9vOwogICAgICAgICB9CkBAIC0zNjcsMTQgKzM0OCwxMyBAQAogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlbW92ZUJ1aWxkTGlzdGVuZXIocGNGb28pOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gZW1wdHkgdGFyZ2V0IG5hbWUKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RCbGFua1RhcmdldCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJibGFuay10YXJnZXQiKTsKLSAgICAgICAgICAgIGZhaWwoInRhcmdldCBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYmxhbmstdGFyZ2V0Iik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM5NCwxMyArMzc0LDE0IEBACiAgICAgICAgIC8vIENmLiAjNDIyNjMKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInN1Yi1zaG93LWFudC5jb3JlLmxpYiIpOwogICAgICAgICBTdHJpbmcgcmVhbExvZyA9IGJ1aWxkUnVsZS5nZXRMb2coKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZm91bmQgYW50LmNvcmUubGliIGluOiAiICsgcmVhbExvZywgcmVhbExvZy5tYXRjaGVzKCIuKihhbnRbLl1qYXJ8YnVpbGQuY2xhc3NlcykuKiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZm91bmQgYW50LmNvcmUubGliIGluOiAiICsgcmVhbExvZywKKyAgICAgICAgICAgICAgICByZWFsTG9nLm1hdGNoZXMoIi4qKGFudFsuXWphcnxhbnQuY2xhc3Nlc3xidWlsZC5jbGFzc2VzKS4qIikpOwogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgQmFzZWRpckNoZWNrZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKICAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEJhc2VkaXJzOwogICAgICAgICBwcml2YXRlIGludCBjYWxscyA9IDA7Ci0gICAgICAgIHByaXZhdGUgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXJyb3I7CisgICAgICAgIHByaXZhdGUgQXNzZXJ0aW9uRXJyb3IgZXJyb3I7CiAKICAgICAgICAgQmFzZWRpckNoZWNrZXIoU3RyaW5nW10gZGlycykgewogICAgICAgICAgICAgZXhwZWN0ZWRCYXNlZGlycyA9IGRpcnM7CkBAIC00MjUsMjMgKzQwNiwyMiBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVycm9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRCYXNlZGlyc1tjYWxscysrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZ2V0RXJyb3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgIH0KLQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgUmVmZXJlbmNlQ2hlY2tlciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewpAQCAtNDQ5LDcgKzQyOSw3IEBACiAgICAgICAgIHByaXZhdGUgYm9vbGVhbltdIGV4cGVjdFNhbWU7CiAgICAgICAgIHByaXZhdGUgT2JqZWN0IHZhbHVlOwogICAgICAgICBwcml2YXRlIGludCBjYWxscyA9IDA7Ci0gICAgICAgIHByaXZhdGUgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZXJyb3I7CisgICAgICAgIHByaXZhdGUgQXNzZXJ0aW9uRXJyb3IgZXJyb3I7CiAKICAgICAgICAgUmVmZXJlbmNlQ2hlY2tlcihTdHJpbmdbXSBrZXlzLCBib29sZWFuW10gZXhwZWN0U2FtZSwgT2JqZWN0IHZhbHVlKSB7CiAgICAgICAgICAgICB0aGlzLmtleXMgPSBrZXlzOwpAQCAtNDc2LDEzICs0NTYsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuZ2V0VGFyZ2V0KCkuZ2V0TmFtZSgpLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAiQ2FsbCAiICsgY2FsbHMgKyAiIHJlZmlkPVwnIiArIGtleXNbY2FsbHNdICsgIlwnIjsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9ICJDYWxsICIgKyBjYWxscyArICIgcmVmaWQ9XCciICsga2V5c1tjYWxsc10gKyAiXCciOwogICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBldmVudC5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKGtleXNbY2FsbHNdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlY3RTYW1lW2NhbGxzKytdKSB7CkBAIC00OTMsNDAgKzQ3MiwzOSBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSByYXRoZXIgY29udm9sdXRlZCBlcXVhbHMoKSB0ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIGV4cGVjdCA9IChQYXRoKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggcmVjZWl2ZWQgPSAoUGF0aCkgZXZlbnQuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShrZXlzW2NhbGxzXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIHJlY2VpdmVkID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZShrZXlzW2NhbGxzXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZEJlRXF1YWwgPSBleHBlY3RTYW1lW2NhbGxzKytdOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1zZywgIXNob3VsZEJlRXF1YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1zZywgc2hvdWxkQmVFcXVhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGwxID0gZXhwZWN0Lmxpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBsMiA9IHJlY2VpdmVkLmxpc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobDEubGVuZ3RoID09IGwyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGwxLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWwxW2ldLmVxdWFscyhsMltpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1zZywgIXNob3VsZEJlRXF1YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1zZywgc2hvdWxkQmVFcXVhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtc2csIHNob3VsZEJlRXF1YWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobXNnLCAhc2hvdWxkQmVFcXVhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKG1zZywgc2hvdWxkQmVFcXVhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIEFzc2VydGlvbkZhaWxlZEVycm9yIGdldEVycm9yKCkgeworICAgICAgICBBc3NlcnRpb25FcnJvciBnZXRFcnJvcigpIHsKICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBJbnB1dEhhbmRsZXJDaGVja2VyIGltcGxlbWVudHMgQnVpbGRMaXN0ZW5lciB7CiAgICAgICAgIHByaXZhdGUgSW5wdXRIYW5kbGVyIGloOwotICAgICAgICBwcml2YXRlIEFzc2VydGlvbkZhaWxlZEVycm9yIGVycm9yOworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkVycm9yIGVycm9yOwogCiAgICAgICAgIElucHV0SGFuZGxlckNoZWNrZXIoSW5wdXRIYW5kbGVyIHZhbHVlKSB7CiAgICAgICAgICAgICBpaCA9IHZhbHVlOwpAQCAtNTM1LDE4ICs1MTMsMjMgQEAKICAgICAgICAgcHVibGljIHZvaWQgYnVpbGRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGNoZWNrKGV2ZW50KTsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgY2hlY2soZXZlbnQpOwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgdGFyZ2V0RmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgY2hlY2soZXZlbnQpOwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgY2hlY2soZXZlbnQpOwogICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgdGFza0ZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIGNoZWNrKGV2ZW50KTsKICAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewogICAgICAgICAgICAgY2hlY2soZXZlbnQpOwogICAgICAgICB9CkBAIC01NjAsMjMgKzU0MywyMiBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZXZlbnQuZ2V0UHJvamVjdCgpLmdldElucHV0SGFuZGxlcigpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShpaCwgZXZlbnQuZ2V0UHJvamVjdCgpLmdldElucHV0SGFuZGxlcigpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewogICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZ2V0RXJyb3IoKSB7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGdldEVycm9yKCkgewogICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICB9Ci0KICAgICB9CiAKICAgICBwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hlY2tlciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewogICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkVmFsdWVzOwogICAgICAgICBwcml2YXRlIFN0cmluZyBrZXk7CiAgICAgICAgIHByaXZhdGUgaW50IGNhbGxzID0gMDsKLSAgICAgICAgcHJpdmF0ZSBBc3NlcnRpb25GYWlsZWRFcnJvciBlcnJvcjsKKyAgICAgICAgcHJpdmF0ZSBBc3NlcnRpb25FcnJvciBlcnJvcjsKIAogICAgICAgICBQcm9wZXJ0eUNoZWNrZXIoU3RyaW5nIGtleSwgU3RyaW5nW10gdmFsdWVzKSB7CiAgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKQEAgLTYwMiwyOSArNTg0LDI3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoY2FsbHMgPj0gZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIlVuZXhwZWN0ZWQgaW52b2NhdGlvbiBvZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGFyZ2V0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVuZXhwZWN0ZWQgaW52b2NhdGlvbiBvZiB0YXJnZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlc1tjYWxscysrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewogICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZ2V0RXJyb3IoKSB7CisgICAgICAgIEFzc2VydGlvbkVycm9yIGdldEVycm9yKCkgewogICAgICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgICAgICB9Ci0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQW50bGliVGVzdC5qYXZhCmluZGV4IDcwYWJlMGMuLmM0YTc2ZWIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BbnRsaWJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0FudGxpYlRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDEyICsyMSwxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIC8qKgogICovCkBAIC01OCwxMCArNTksMTEgQEAKICAgICAvKioKICAgICAgKiBDb25maXJtcyB0aGF0IGFsbCBtYXRjaGluZyByZXNvdXJjZXMgd2lsbCBiZSB1c2VkLCBzbyB0aGF0IHlvdQogICAgICAqIGNhbiBjb2xsZWN0IHNldmVyYWwgYW50bGlicyBpbiBvbmUgRGVmaW5lciBjYWxsLgotICAgICAqIEBzZWUgImh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjQwMjQiCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0yNDAyNCI+YnVnIDI0MDI0PC9hPgogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFudGxpYlJlc291cmNlKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKCJidWlsZC50ZXN0cy52YWx1ZSBub3Qgc2V0IiwgU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC50ZXN0cy52YWx1ZSIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImFudGxpYi5yZXNvdXJjZSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIk15VGFzayBjYWxsZWQtYW5kLXRoZW4tTXlUYXNrMiBjYWxsZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgIH0KQEAgLTc0LDE5ICs3NiwxOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QW50bGliX3VyaSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlRlc3QgcmVxdWlyZXMgc2hhcmVkIEpWTSIsIGlzU2hhcmVkSlZNKCkpOworICAgICAgICBhc3N1bWVUcnVlKCJUZXN0IHJlcXVpcmVzIHNoYXJlZCBKVk0iLCBpc1NoYXJlZEpWTSgpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImFudGxpYl91cmkiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRsaWJfdXJpX2F1dG8oKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUZXN0IHJlcXVpcmVzIHNoYXJlZCBKVk0iLCBpc1NoYXJlZEpWTSgpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiVGVzdCByZXF1aXJlcyBzaGFyZWQgSlZNIiwgaXNTaGFyZWRKVk0oKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJhbnRsaWJfdXJpX2F1dG8iKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRsaWJfdXJpX2F1dG8yKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiVGVzdCByZXF1aXJlcyBzaGFyZWQgSlZNIiwgaXNTaGFyZWRKVk0oKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlRlc3QgcmVxdWlyZXMgc2hhcmVkIEpWTSIsIGlzU2hhcmVkSlZNKCkpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYW50bGliX3VyaV9hdXRvMiIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F2YWlsYWJsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9BdmFpbGFibGVUZXN0LmphdmEKaW5kZXggYWU4N2E1YS4uYTdmMTA1NyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0F2YWlsYWJsZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQXZhaWxhYmxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTMgKzIxLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogSlVuaXQgdGVzdCBmb3IgdGhlIEF2YWlsYWJsZSB0YXNrL2NvbmRpdGlvbi4KQEAgLTQ0LDk1ICs0MywxMDQgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7CiAgICAgfQogCi0gICAgLy8gTm90aGluZyBzcGVjaWZpZWQgLT4gRmFpbAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogIE5vdGhpbmcgc3BlY2lmaWVkIC0mZ3Q7IEZhaWwKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJSZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CiAgICAgfQogCi0gICAgLy8gT25seSBwcm9wZXJ0eSBzcGVjaWZpZWQgLT4gRmFpbAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogT25seSBwcm9wZXJ0eSBzcGVjaWZpZWQgLSZndDsgRmFpbAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIlJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKICAgICB9CiAKLSAgICAvLyBPbmx5IGZpbGUgc3BlY2lmaWVkIC0+IEZhaWwKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIE9ubHkgZmlsZSBzcGVjaWZpZWQgLSZndDsgRmFpbAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIlJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKICAgICB9CiAKLSAgICAvLyBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKKyAgICAvKioKKyAgICAgKiBGaWxlIGRvZXNuJ3QgZXhpc3QgLSZndDsgcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikgPT0gbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBmaWxlIGRvZXMgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09ICd0cnVlJworICAgIC8qKgorICAgICAqIEZpbGUgZG9lcyBleGlzdCAtJmd0OyBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCisgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikpOwogICAgIH0KIAotICAgIC8vIHJlc291cmNlIGRvZXNuJ3QgZXhpc3QgLT4gcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBkb2Vzbid0IGV4aXN0IC0mZ3Q7IHByb3BlcnR5ICd0ZXN0JyA9PSBudWxsCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpID09IG51bGwpOworICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gcmVzb3VyY2UgZG9lcyBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgZG9lcyBleGlzdCAtJmd0OyBwcm9wZXJ0eSAndGVzdCcgPT0gJ3RydWUnCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gY2xhc3MgZG9lc24ndCBleGlzdCAtPiBwcm9wZXJ0eSAndGVzdCcgPT0gbnVsbAorICAgIC8qKgorICAgICAqIENsYXNzIGRvZXNuJ3QgZXhpc3QgLSZndDsgcHJvcGVydHkgJ3Rlc3QnID09IG51bGwKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDgiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikgPT0gbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBjbGFzcyBkb2VzIGV4aXN0IC0+IHByb3BlcnR5ICd0ZXN0JyA9PSAndHJ1ZScKKyAgICAvKioKKyAgICAgKiBjbGFzcyBkb2VzIGV4aXN0IC0mZ3Q7IHByb3BlcnR5ICd0ZXN0JyA9PSAndHJ1ZScKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBBbGwgdGhyZWUgc3BlY2lmaWVkIGFuZCBhbGwgdGhyZWUgZXhpc3QgLT4gdHJ1ZQorICAgIC8qKgorICAgICAqIEFsbCB0aHJlZSBzcGVjaWZpZWQgYW5kIGFsbCB0aHJlZSBleGlzdCAtJmd0OyB0cnVlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MTAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTAiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBBbGwgdGhyZWUgc3BlY2lmaWVkIGJ1dCBjbGFzcyBtaXNzaW5nIC0+IG51bGwKKyAgICAvKioKKyAgICAgKiBBbGwgdGhyZWUgc3BlY2lmaWVkIGJ1dCBjbGFzcyBtaXNzaW5nIC0mZ3Q7IG51bGwKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMSIpOwogICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gU3BlY2lmaWVkIHByb3BlcnR5LW5hbWUgaXMgIiIgLT4gdHJ1ZQorICAgIC8qKgorICAgICAqIFNwZWNpZmllZCBwcm9wZXJ0eS1uYW1lIGlzICIiIC0mZ3Q7IHRydWUKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMiIpOwpAQCAtMTQwLDEzMSArMTQ4LDE2MiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCIiKSk7CiAgICAgfQogCi0gICAgLy8gU3BlY2lmaWVkIGZpbGUgaXMgIiIgLT4gaW52YWxpZCBmaWxlcyBkbyBub3QgZXhpc3QKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZWQgZmlsZSBpcyAiIiAtJmd0OyBpbnZhbGlkIGZpbGVzIGRvIG5vdCBleGlzdAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEzIik7CiAgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBTcGVjaWZpZWQgZmlsZSBpcyAiIiBhY3R1YWxseSBhIGRpcmVjdG9yeSwgc28gaXQgc2hvdWxkIHBhc3MKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZWQgZmlsZSBpcyAiIiBhY3R1YWxseSBhIGRpcmVjdG9yeSwgc28gaXQgc2hvdWxkIHBhc3MKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxM2IoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTNiIik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gU3BlY2lmaWVkIHJlc291cmNlIGlzICIiIC0+IGNhbiBzdWNoIGEgdGhpbmcgZXhpc3Q/Ci0gICAgLyoKLSAgICAgKiByZXR1cm5zIG5vbiBudWxsIElCTSBKREsgMS4zIExpbnV4CisgICAgLyoqCisgICAgICogU3BlY2lmaWVkIHJlc291cmNlIGlzICIiIC1ndDsgY2FuIHN1Y2ggYSB0aGluZyBleGlzdD8KICAgICAgKi8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3QxNCgpIHsKLS8vICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDE0Iik7Ci0vLyAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSwgbnVsbCk7Ci0vLyAgICB9CisgICAgQElnbm9yZSgicmV0dXJucyBub24gbnVsbCBJQk0gSkRLIDEuMyBMaW51eCIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTQiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikpOworICAgIH0KIAotICAgIC8vIFNwZWNpZmllZCBjbGFzcyBpcyAiIiAtPiBjYW4gbm90IGV4aXN0CisgICAgLyoqCisgICAgICogU3BlY2lmaWVkIGNsYXNzIGlzICIiIC0mZ3Q7IGNhbiBub3QgZXhpc3QKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxNSIpOwogICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gU3BlY2lmaWVkIGRpciBpcyAiIiAtPiB0aGlzIGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2hvdWxkCi0gICAgLy8gYWx3YXlzIGV4aXN0CisgICAgLyoqCisgICAgICogU3BlY2lmaWVkIGRpciBpcyAiIiAtJmd0OyB0aGlzIGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgc2hvdWxkIGFsd2F5cyBleGlzdAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDE2KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDE2Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gU3BlY2lmaWVkIGRpciBpcyAiLi4vdGFza2RlZnMiIC0+IHNob3VsZCBleGlzdCBzaW5jZSBpdCdzIHRoZQotICAgIC8vIGxvY2F0aW9uIG9mIHRoZSBidWlsZGZpbGUgdXNlZC4uLgorICAgIC8qKgorICAgICAqIFNwZWNpZmllZCBkaXIgaXMgIi4uL3Rhc2tkZWZzIiAtJmd0OyBzaG91bGQgZXhpc3Qgc2luY2UgaXQncyB0aGUgbG9jYXRpb24KKyAgICAgKiBvZiB0aGUgYnVpbGRmaWxlIHVzZWQuLi4KKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxNygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxNyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikpOwogICAgIH0KIAotICAgIC8vIFNwZWNpZmllZCBkaXIgaXMgIi4uL3RoaXNfZGlyX3Nob3VsZF9uZXZlcl9leGlzdCIgLT4gbnVsbAorICAgIC8qKgorICAgICAqIFNwZWNpZmllZCBkaXIgaXMgIi4uL3RoaXNfZGlyX3Nob3VsZF9uZXZlcl9leGlzdCIgLSZndDsgbnVsbAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDE4KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDE4Iik7CiAgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBJbnZhbGlkIHR5cGUgc3BlY2lmaWVkCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBJbnZhbGlkIHR5cGUgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MTkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDE5Iik7Ci0gICAgICAgICAgICBmYWlsKCJJbnZhbGlkIHZhbHVlIGZvciB0eXBlIGF0dHJpYnV0ZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTkiKTsKICAgICB9CiAKLSAgICAvLyBDb3JlIGNsYXNzIHRoYXQgZXhpc3RzIGluIHN5c3RlbSBjbGFzc3BhdGggaXMgaWdub3JlZAorICAgIC8qKgorICAgICAqIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBpZ25vcmVkCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MjAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MjAiKTsKICAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikpOwogICAgIH0KIAotICAgIC8vIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBpZ25vcmVkLCBidXQgZm91bmQgaW4gc3BlY2lmaWVkIGNsYXNzcGF0aAorICAgIC8qKgorICAgICAqIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBpZ25vcmVkLCBidXQgZm91bmQgaW4gc3BlY2lmaWVkIGNsYXNzcGF0aAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDIxKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIxIik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gQ29yZSBjbGFzcyB0aGF0IGV4aXN0cyBpbiBzeXN0ZW0gY2xhc3NwYXRoIGlzIG5vdCBpZ25vcmVkIHdpdGggaWdub3Jlc3lzdGVtY2xhc3M9ImZhbHNlIgorICAgIC8qKgorICAgICAqIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBub3QgaWdub3JlZCB3aXRoIGlnbm9yZXN5c3RlbWNsYXNzPSJmYWxzZSIKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyMigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyMiIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0IikpOwogICAgIH0KIAotICAgIC8vIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBub3QgaWdub3JlZCB3aXRoIGRlZmF1bHQgaWdub3Jlc3lzdGVtY2xhc3NlcyB2YWx1ZQorICAgIC8qKgorICAgICAqIENvcmUgY2xhc3MgdGhhdCBleGlzdHMgaW4gc3lzdGVtIGNsYXNzcGF0aCBpcyBub3QgaWdub3JlZCB3aXRoIGRlZmF1bHQKKyAgICAgKiBpZ25vcmVzeXN0ZW1jbGFzc2VzIHZhbHVlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MjMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MjMiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyBDbGFzcyBpcyBmb3VuZCBpbiBzcGVjaWZpZWQgY2xhc3NwYXRoCisgICAgLyoqCisgICAgICogQ2xhc3MgaXMgZm91bmQgaW4gc3BlY2lmaWVkIGNsYXNzcGF0aAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDI0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDI0Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gRmlsZSBpcyBub3QgZm91bmQgaW4gc3BlY2lmaWVkIGZpbGVwYXRoCisgICAgLyoqCisgICAgICogRmlsZSBpcyBub3QgZm91bmQgaW4gc3BlY2lmaWVkIGZpbGVwYXRoCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VhcmNoSW5QYXRoTm90VGhlcmUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzZWFyY2hJblBhdGhOb3RUaGVyZSIpOwogICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QiKSk7CiAgICAgfQogCi0gICAgLy8gRmlsZSBpcyBub3QgZm91bmQgaW4gc3BlY2lmaWVkIGZpbGVwYXRoCisgICAgLyoqCisgICAgICogRmlsZSBpcyBub3QgZm91bmQgaW4gc3BlY2lmaWVkIGZpbGVwYXRoCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VhcmNoSW5QYXRoSXNUaGVyZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNlYXJjaEluUGF0aElzVGhlcmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdCIpKTsKICAgICB9CiAKLSAgICAvLyB0ZXN0IHdoZW4gZmlsZSBiZWdpbnMgd2l0aCBiYXNlZGlyIHR3aWNlCisgICAgLyoqCisgICAgICogRmlsZSBiZWdpbnMgd2l0aCBiYXNlZGlyIHR3aWNlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlQmFzZWRpcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3REb3VibGVCYXNlZGlyIik7CiAgICAgfQogCi0gICAgLy8gdGVzdCBmb3Igc2VhcmNoaW5nIHBhcmVudHMKKyAgICAvKioKKyAgICAgKiBTZWFyY2ggcGFyZW50cworICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhcmVudHMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzZWFyY2gtcGFyZW50cyIpOwogICAgIH0KLSAgICAvLyB0ZXN0IGZvciBub3Qgc2VhcmNoaW5nIHBhcmVudHMKKworICAgIC8qKgorICAgICAqIERvIG5vdCBzZWFyY2ggcGFyZW50cworICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlYXJjaFBhcmVudHNOb3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzZWFyY2gtcGFyZW50cy1ub3QiKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CVW56aXAyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDJUZXN0LmphdmEKaW5kZXggMGZhYWNkMS4uOWY4NWE0NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JVbnppcDJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQlppcDJUZXN0LmphdmEKaW5kZXggZDA4MGZhZS4uY2JlYmRmNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0JaaXAyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CWmlwMlRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDEzICsyNiwxMyBAQAogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqLwpAQCAtNjgsMTIgKzY4LDEyIEBACiAgICAgICAgIEZpbGUgYWN0dWFsRmlsZSAgID0gbmV3IEZpbGUob3V0cHV0RGlyLCAiYXNmLWxvZ28taHVnZS50YXIuYnoyIik7CiAKICAgICAgICAgSW5wdXRTdHJlYW0gb3JpZ2luYWxJbiA9Ci0gICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG9yaWdpbmFsRmlsZSkpOworICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0ob3JpZ2luYWxGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgJ0InLCBvcmlnaW5hbEluLnJlYWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgJ1onLCBvcmlnaW5hbEluLnJlYWQoKSk7CiAKICAgICAgICAgSW5wdXRTdHJlYW0gYWN0dWFsSW4gPQotICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhY3R1YWxGaWxlKSk7CisgICAgICAgICAgICBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShhY3R1YWxGaWxlLnRvUGF0aCgpKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgJ0InLCBhY3R1YWxJbi5yZWFkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpICdaJywgYWN0dWFsSW4ucmVhZCgpKTsKIApAQCAtODMsMTQgKzgzLDggQEAKICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgIGludCBleHBlY3RlZCA9IG9yaWdpbmFsSW4ucmVhZCgpOwogICAgICAgICAgICAgaW50IGFjdHVhbCAgID0gYWN0dWFsSW4ucmVhZCgpOwotICAgICAgICAgICAgaWYgKGV4cGVjdGVkID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkZpbGUgY29udGVudCBtaXNtYXRjaCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoIkZpbGUgY29udGVudCBtaXNtYXRjaCIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRmlsZSBjb250ZW50IG1pc21hdGNoIiwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgPCAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEwOCw5ICsxMDIsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlQ2hlY2soKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RGF0ZUNoZWNrIik7CiAgICAgICAgIFN0cmluZyBsb2cgPSBidWlsZFJ1bGUuZ2V0TG9nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAiRXhwZWN0aW5nIG1lc3NhZ2UgZW5kaW5nIHdpdGggJ2FzZi1sb2dvLmdpZi5iejIgaXMgdXAgdG8gZGF0ZS4nIGJ1dCBnb3QgJyIgKyBsb2cgKyAiJyIsCi0gICAgICAgICAgICBsb2cuZW5kc1dpdGgoImFzZi1sb2dvLmdpZi5iejIgaXMgdXAgdG8gZGF0ZS4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkV4cGVjdGluZyBtZXNzYWdlIGVuZGluZyB3aXRoICdhc2YtbG9nby5naWYuYnoyIGlzIHVwIHRvIGRhdGUuJyBidXQgZ290ICciCisgICAgICAgICAgICAgICAgICAgICAgICArIGxvZyArICInIiwgbG9nLCBlbmRzV2l0aCgiYXNmLWxvZ28uZ2lmLmJ6MiBpcyB1cCB0byBkYXRlLiIpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CYXNlbmFtZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9CYXNlbmFtZVRlc3QuamF2YQppbmRleCAzOTE1ZDZiLi40MDdlNmQ3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQmFzZW5hbWVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Jhc2VuYW1lVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICovCkBAIC0zOSwzNCArMzgsMjIgQEAKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2Jhc2VuYW1lLnhtbCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiUmVxdWlyZWQgYXR0cmlidXRlIG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIlJlcXVpcmVkIGF0dHJpYnV0ZSBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJSZXF1aXJlZCBhdHRyaWJ1dGUgbWlzc2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ1ZTUGFzc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzVGVzdC5qYXZhCmluZGV4IDYzZWU2NDUuLmZlNTA5MDYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DVlNQYXNzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsMTcgKzI3LDE3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIFRlc3RzIENWU0xvZ2luIHRhc2suCiAgKgogICovCiBwdWJsaWMgY2xhc3MgQ1ZTUGFzc1Rlc3QgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEVPTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBFT0wgPSBTeXN0ZW0ubGluZVNlcGFyYXRvcigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQUtBUlRBX1VSTCA9CiAgICAgICAgICI6cHNlcnZlcjphbm9uY3ZzQGpha2FydGEuYXBhY2hlLm9yZzovaG9tZS9jdnNwdWJsaWMgQXk9MD1oPFoiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVVJMID0KQEAgLTQ2LDM3ICs0NiwzMyBAQAogICAgICAgICAiOnBzZXJ2ZXI6Z3Vlc3RAY3ZzLnRpZ3Jpcy5vcmc6L2N2cyBBSWJkWiwiOwogCiAgICAgQFJ1bGUKLSAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jdnNwYXNzLnhtbCIpOwogICAgIH0KIAorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vQ1ZTUm9vdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gbm90IHRocm93biIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImN2c3Jvb3QgaXMgcmVxdWlyZWQiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJjdnNyb290IGlzIHJlcXVpcmVkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vUGFzc3dvcmQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXNzd29yZCBpcyByZXF1aXJlZCIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInBhc3N3b3JkIGlzIHJlcXVpcmVkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2FsbFRhcmdldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0VGVzdC5qYXZhCmluZGV4IDMzN2M2YTQuLjk2OGNlMWEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DYWxsVGFyZ2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNyArMTgsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTI3LDggKzI2LDkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICovCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdFJlZkZpbGVTZXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0aW5oZXJpdHJlZmZpbGVzZXQiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJjYWxsdGFyZ2V0LnhtbCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiY2FsbHRhcmdldC54bWwiKSk7CiAgICAgfQogCiAgICAgLy8gc2VlIGJ1Z3JlcCAyMTcyNCAocmVmZXJlbmNlcyBub3QgcGFzc2luZyB0aHJvdWdoIHdpdGggYW50Y2FsbCkKQEAgLTYwLDIxICs2MCwxOSBAQAogICAgIC8vIHBhcmFtcyB3aWxsIG5vdCBiZSBwYXNzZWQgaW4pCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlDYWxsKCkgewotICAgICAgICBWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7CisgICAgICAgIFZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPD4oKTsKICAgICAgICAgdi5hZGQoImNhbGwtbXVsdGkiKTsKICAgICAgICAgdi5hZGQoImNhbGwtbXVsdGkiKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0cyh2KTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJtdWx0aSBpcyBTRVRtdWx0aSBpcyBTRVQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIm11bHRpIGlzIFNFVG11bHRpIGlzIFNFVCIpKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIGVtcHR5IHRhcmdldCBuYW1lCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmxhbmtUYXJnZXQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYmxhbmstdGFyZ2V0Iik7Ci0gICAgICAgICAgICBmYWlsKCJ0YXJnZXQgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gY29udGVudHMKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYmxhbmstdGFyZ2V0Iik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9DaGVja3N1bVRlc3QuamF2YQppbmRleCA4ZDI2MTUzLi4yODM4NTU5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ2hlY2tzdW1UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NoZWNrc3VtVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC00MiwyMiArNDAsMjIgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZDUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNZDUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjcmVhdGVNZDUiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNRDVTVU1mb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNRDVTVU1mb3JtYXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjcmVhdGVNRDVTVU1mb3JtYXQiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTVkZmb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTVkZmb3JtYXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjcmVhdGVTVkZmb3JtYXQiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYXR0ZXJuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUGF0dGVybigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNyZWF0ZVBhdHRlcm4iKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25jYXRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uY2F0VGVzdC5qYXZhCmluZGV4IGRhZWM0NGIuLjVjMmIxNzcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25jYXRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmNhdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI5LDEwICsyOSwxMSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBBIHRlc3QgY2xhc3MgZm9yIHRoZSAnY29uY2F0JyB0YXNrLCB1c2VkIHRvIGNvbmNhdGVuYXRlIGEgc2VyaWVzIG9mCkBAIC03NywyOCArNzgsMTkgQEAKICAgICAvKioKICAgICAgKiBFeHBlY3QgYW4gZXhjZXB0aW9uIHdoZW4gaW5zdWZmaWNpZW50IGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgogICAgICAqLwotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBJbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQotCisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIC8qKgogICAgICAqIEV4cGVjdCBhbiBleGNlcHRpb24gd2hlbiB0aGUgZGVzdGluYXRpb24gZmlsZSBpcyBpbnZhbGlkLgogICAgICAqLwotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBJbnZhbGlkIGRlc3RpbmF0aW9uIGZpbGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICAvKioKQEAgLTEwNiwxNCArOTgsMTIgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotCiAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCB0ZW1wRmlsZSk7CiAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBmaWxlLmRlbGV0ZSgpOwogICAgICAgICB9CiAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0KICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKICAgICB9CiAKQEAgLTE0OSw3ICsxMzksNyBAQAogICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvdGhpc2ZpbGVkb2Vzbm90ZXhpc3QiCiAgICAgICAgICAgICAucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICBhc3NlcnRDb250YWlucyhmaWxlbmFtZSArICIgZG9lcyBub3QgZXhpc3QiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoZmlsZW5hbWUgKyAiIGRvZXMgbm90IGV4aXN0IikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzcsNyArMTY3LDYgQEAKICAgICAgICAgZmluYWwgbG9uZyBuZXdTaXplID0gZmlsZTIubGVuZ3RoKCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdTaXplLCBuZXdTaXplKTsKLQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xOTMsMTMgKzE4MiwxMiBAQAogICAgICAgICBmaW5hbCBsb25nIG5ld1NpemUgPSBmaWxlMi5sZW5ndGgoKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ1NpemUgKiAyLCBuZXdTaXplKTsKLQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RmaWx0ZXIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIlJFUExBQ0VEIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlJFUExBQ0VEIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMzUsMTQgKzIyMyw5IEBACiAgICAgLyoqCiAgICAgICogRXhwZWN0IGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gY2F0IGFuIGZpbGUgdG8gaXRzZWxmCiAgICAgICovCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RzYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNhbWVmaWxlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBvdXRwdXQgZmlsZSBzYW1lIGFzIGlucHV0Iik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2FtZWZpbGUiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI1MSw3ICsyMzQsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdGZpbHRlcmlubGluZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RmaWx0ZXJpbmxpbmUiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIlJFUExBQ0VEIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlJFUExBQ0VEIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjYwLDggKzI0Myw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0bXVsdGlyZWFkZXIoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0bXVsdGlyZWFkZXIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIkJ5ZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJIZWxsbyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJCeWUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIkhlbGxvIikpKTsKICAgICB9CiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgZml4bGFzdGxpbmUgd29ya3MKQEAgLTI2OSw4ICsyNTIsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdGZpeGxhc3RsaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RmaXhsYXN0bGluZSIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiZW5kIG9mIGxpbmUiICsgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpICsgIlRoaXMgaGFzIiwKLSAgICAgICAgICAgICAgICBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiY29uY2F0LmxpbmU0IikpOworICAgICAgICBhc3NlcnRUaGF0KEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJjb25jYXQubGluZTQiKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiZW5kIG9mIGxpbmUiICsgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSArICJUaGlzIGhhcyIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI3OSw3ICsyNjIsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdGZpeGxhc3RsaW5lZW9sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RmaXhsYXN0bGluZWVvbCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiZW5kIG9mIGxpbmVcclRoaXMgaGFzIiwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImNvbmNhdC5saW5lY3IiKSk7CisgICAgICAgIGFzc2VydFRoYXQoRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImNvbmNhdC5saW5lY3IiKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiZW5kIG9mIGxpbmVcclRoaXMgaGFzIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yOTEsMTggKzI3NSw0IEBACiAgICAgICAgICAgICAgICAgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZjEpLCBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhmMikpOwogICAgIH0KIAotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vICAgSGVscGVyIG1ldGhvZHMgLSBzaG91bGQgYmUgaW4gYSB1dGlsaXR5IGNsYXNzCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICBwcml2YXRlIHZvaWQgZXhwZWN0RmlsZUNvbnRhaW5zeChTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250YWlucykKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBGaWxlVXRpbGl0aWVzLmdldEZpbGVDb250ZW50cyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCBmaWxlbmFtZSk7Ci0gICAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgICAiZXhwZWN0aW5nIGZpbGUgIiArIGZpbGVuYW1lICsgIiB0byBjb250YWluICIgKwotICAgICAgICAgICAgY29udGFpbnMgKwotICAgICAgICAgICAgIiBidXQgZ290ICIgKyBjb250ZW50LCBjb250ZW50LmNvbnRhaW5zKGNvbnRhaW5zKSk7Ci0gICAgfQotCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvbmRpdGlvblRlc3QuamF2YQppbmRleCA5MzI5NTEyLi4wYTViNDAxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29uZGl0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db25kaXRpb25UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxNiArMjMsMTggQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBDb25kaXRpb25UZXN0IHsKIAogICAgIEBSdWxlCi0gICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCiAgICAgLyoqCiAgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZApAQCAtNTksMjIgKzYxLDE2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25JbmNvbXBsZXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbmRpdGlvbi1pbmNvbXBsZXRlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIHByb3BlcnR5IGF0dHJpYnV0ZSBoYXMgYmVlbiBvbWl0dGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb25kaXRpb24taW5jb21wbGV0ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbkVtcHR5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbmRpdGlvbi1lbXB0eSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBubyBjb25kaXRpb25zIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5lc3QgYSBjb25kaXRpb24gaW50byA8Y29uZGl0aW9uPiIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBuZXN0IGEgY29uZGl0aW9uIGludG8gPGNvbmRpdGlvbj4iKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbmRpdGlvbi1lbXB0eSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMDksMTIgKzEwNSw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGlvbkluY29tcGxldGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibmVnYXRpb25pbmNvbXBsZXRlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIG5vIGNvbmRpdGlvbnMgaW4gPG5vdD4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3QgbmVzdCBhIGNvbmRpdGlvbiBpbnRvIDxub3Q+IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5lc3QgYSBjb25kaXRpb24gaW50byA8bm90PiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibmVnYXRpb25pbmNvbXBsZXRlIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE3MywxMiArMTY2LDkgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVzbWF0Y2hJbmNvbXBsZXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZpbGVzbWF0Y2gtaW5jb21wbGV0ZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIC0gTWlzc2luZyBmaWxlMiBhdHRpcmJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiYm90aCBmaWxlMSBhbmQgZmlsZTIgYXJlIHJlcXVpcmVkIGluIGZpbGVzbWF0Y2giLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiYm90aCBmaWxlMSBhbmQgZmlsZTIgYXJlIHJlcXVpcmVkIGluIGZpbGVzbWF0Y2giKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZpbGVzbWF0Y2gtaW5jb21wbGV0ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNTIsMjIgKzI0MiwxNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbmNvbXBsZXRlMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb250YWlucy1pbmNvbXBsZXRlMSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBNaXNzaW5nIGNvbnRhaW5zIGF0dHJpYnV0ZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJib3RoIHN0cmluZyBhbmQgc3Vic3RyaW5nIGFyZSByZXF1aXJlZCBpbiBjb250YWlucyIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJib3RoIHN0cmluZyBhbmQgc3Vic3RyaW5nIGFyZSByZXF1aXJlZCBpbiBjb250YWlucyIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29udGFpbnMtaW5jb21wbGV0ZTEiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc0luY29tcGxldGUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbnRhaW5zLWluY29tcGxldGUyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIE1pc3NpbmcgY29udGFpbnMgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJvdGggc3RyaW5nIGFuZCBzdWJzdHJpbmcgYXJlIHJlcXVpcmVkIGluIGNvbnRhaW5zIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImJvdGggc3RyaW5nIGFuZCBzdWJzdHJpbmcgYXJlIHJlcXVpcmVkIGluIGNvbnRhaW5zIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb250YWlucy1pbmNvbXBsZXRlMiIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yOTAsMTIgKzI3NCw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJc3RydWVJbmNvbXBsZXRlMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpc3RydWUtaW5jb21wbGV0ZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBNaXNzaW5nIGF0dHJpYnV0ZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb3RoaW5nIHRvIHRlc3QgZm9yIHRydXRoIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk5vdGhpbmcgdG8gdGVzdCBmb3IgdHJ1dGgiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImlzdHJ1ZS1pbmNvbXBsZXRlIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTMxOSwxMiArMzAwLDkgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElzZmFsc2VJbmNvbXBsZXRlMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpc2ZhbHNlLWluY29tcGxldGUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIC0gTWlzc2luZyBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm90aGluZyB0byB0ZXN0IGZvciBmYWxzZWhvb2QiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiTm90aGluZyB0byB0ZXN0IGZvciBmYWxzZWhvb2QiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImlzZmFsc2UtaW5jb21wbGV0ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zMzIsMTQgKzMxMCwxMCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVsc2UiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlc21hdGNoRXJyb3IoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVzb3VyY2VtYXRjaC1lcnJvciIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBubyByZXNvdXJjZXMgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJlc291cmNlbWF0Y2gtZXJyb3IiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YQppbmRleCBkYjJkYWY4Li42NDE3M2Y0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDIyICsyMywyNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkZpbGVVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbmRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiAvKioKICAqIFRlc3RzIEZpbGVTZXQgdXNpbmcgdGhlIENvcHkgdGFzay4KQEAgLTQ5LDYgKzUzLDggQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CkBAIC02MCw3MCArNjYsNjIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAiY29weXRlc3QxLnRtcCIpOwotICAgICAgICBpZiAoIWYuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvcHkgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29weSBmYWlsZWQiLCBmLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJjb3B5dGVzdDFkaXIvY29weS54bWwiKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJDb3B5IGZhaWxlZCIpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkNvcHkgZmFpbGVkIiwgZi5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgIEZpbGUgZmlsZTMgID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJjb3B5dGVzdDMudG1wIik7Ci0gICAgICAgIC8vcm9sbGJhY2sgZmlsZSB0aW1lc3RhbXAgaW5zdGVhZCBvZiBkZWxheWluZyB0ZXN0CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKG91dHB1dCwgImNvcHl0ZXN0My50bXAiKTsKKyAgICAgICAgLy8gcm9sbGJhY2sgZmlsZSB0aW1lc3RhbXAgaW5zdGVhZCBvZiBkZWxheWluZyB0ZXN0CiAgICAgICAgIEZpbGVVdGlsaXRpZXMucm9sbGJhY2tUaW1lc3RhbXBzKGZpbGUzLCAzKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzUGFydDIiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CiAKLSAgICAgICAgRmlsZSBmaWxlM2EgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgImNvcHl0ZXN0M2EudG1wIik7CisgICAgICAgIEZpbGUgZmlsZTNhID0gbmV3IEZpbGUob3V0cHV0LCAiY29weXRlc3QzYS50bXAiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlM2EuZXhpc3RzKCkpOwotICAgICAgICBGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAiY29weXRlc3QzYi50bXAiKTsKKyAgICAgICAgRmlsZSBmaWxlM2IgPSBuZXcgRmlsZShvdXRwdXQsICJjb3B5dGVzdDNiLnRtcCIpOwogICAgICAgICBhc3NlcnRUcnVlKGZpbGUzYi5leGlzdHMoKSk7Ci0gICAgICAgIEZpbGUgZmlsZTNjID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJjb3B5dGVzdDNjLnRtcCIpOworICAgICAgICBGaWxlIGZpbGUzYyA9IG5ldyBGaWxlKG91dHB1dCwgImNvcHl0ZXN0M2MudG1wIik7CiAgICAgICAgIGFzc2VydFRydWUoZmlsZTNjLmV4aXN0cygpKTsKIAotICAgICAgICAvL2ZpbGUgbGVuZ3RoIGNoZWNrcyByZWx5IG9uIHRvdWNoIGdlbmVyYXRpbmcgYSB6ZXJvIGJ5dGUgZmlsZQotICAgICAgICBpZiAoZmlsZTMubGVuZ3RoKCk9PTApIHsKLSAgICAgICAgICAgIGZhaWwoImNvdWxkIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcsIG9sZGVyIGZpbGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsZTNjLmxlbmd0aCgpIT0wKSB7Ci0gICAgICAgICAgICBmYWlsKCJjb3VsZCBub3QgZm9yY2Ugb3ZlcndyaXRlIGFuIGV4aXN0aW5nLCBuZXdlciBmaWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUzYi5sZW5ndGgoKT09MCkgewotICAgICAgICAgICAgZmFpbCgidW5leHBlY3RlZGx5IG92ZXJ3cm90ZSBhbiBleGlzdGluZywgbmV3ZXIgZmlsZSIpOwotICAgICAgICB9CisgICAgICAgIC8vIGZpbGUgbGVuZ3RoIGNoZWNrcyByZWx5IG9uIHRvdWNoIGdlbmVyYXRpbmcgYSB6ZXJvIGJ5dGUgZmlsZQogCi0gICAgICAgIC8vZmlsZSB0aW1lIGNoZWNrcyBmb3IgamF2YTEuMisKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlM2EubGFzdE1vZGlmaWVkKCkgPT0gZmlsZTMubGFzdE1vZGlmaWVkKCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoImNvdWxkIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcsIG9sZGVyIGZpbGUiLCAwLCBmaWxlMy5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY291bGQgbm90IGZvcmNlIG92ZXJ3cml0ZSBhbiBleGlzdGluZywgbmV3ZXIgZmlsZSIsIDAsIGZpbGUzYy5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygidW5leHBlY3RlZGx5IG92ZXJ3cm90ZSBhbiBleGlzdGluZywgbmV3ZXIgZmlsZSIsIDAsIGZpbGUzYi5sZW5ndGgoKSk7CisKKyAgICAgICAgLy8gZmlsZSB0aW1lIGNoZWNrcyBmb3IgamF2YTEuMisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGUzYS5sYXN0TW9kaWZpZWQoKSwgZmlsZTMubGFzdE1vZGlmaWVkKCkpOwogICAgICAgICBhc3NlcnRUcnVlKGZpbGUzYy5sYXN0TW9kaWZpZWQoKSA8IGZpbGUzYS5sYXN0TW9kaWZpZWQoKSk7Ci0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJUZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsdGVydGVzdCIpOwotICAgICAgICBhc3NlcnRUcnVlKCFidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoImxvb3AgaW4gdG9rZW5zIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJsb29wIGluIHRva2VucyIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5maW5pdGVGaWx0ZXIoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbmZpbml0ZXRlc3QiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImxvb3AgaW4gdG9rZW5zIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCJsb29wIGluIHRva2VucyIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJTZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlclNldCIpOwotICAgICAgICBGaWxlIHRtcCAgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgImNvcHkuZmlsdGVyc2V0LnRtcCIpOwotICAgICAgICBGaWxlIGNoZWNrICA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAiZXhwZWN0ZWQvY29weS5maWx0ZXJzZXQuZmlsdGVyZWQiKTsKKyAgICAgICAgRmlsZSB0bXAgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgImNvcHkuZmlsdGVyc2V0LnRtcCIpOworICAgICAgICBGaWxlIGNoZWNrID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgImV4cGVjdGVkL2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkIik7CiAgICAgICAgIGFzc2VydFRydWUodG1wLmV4aXN0cygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHRtcCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGNoZWNrKSk7CiAgICAgfQpAQCAtMTMxLDggKzEyOSw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQ2hhaW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbHRlckNoYWluIik7Ci0gICAgICAgIEZpbGUgdG1wICA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAiY29weS5maWx0ZXJjaGFpbi50bXAiKTsKLSAgICAgICAgRmlsZSBjaGVjayAgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgImV4cGVjdGVkL2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkIik7CisgICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJjb3B5LmZpbHRlcmNoYWluLnRtcCIpOworICAgICAgICBGaWxlIGNoZWNrID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgImV4cGVjdGVkL2NvcHkuZmlsdGVyc2V0LmZpbHRlcmVkIik7CiAgICAgICAgIGFzc2VydFRydWUodG1wLmV4aXN0cygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKHRtcCksIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGNoZWNrKSk7CiAgICAgfQpAQCAtMTQwLDE2ICsxMzksMTYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVGaWxlRmlsZXNldCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Rfc2luZ2xlX2ZpbGVfZmlsZXNldCIpOwotICAgICAgICBGaWxlIGZpbGUgID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcHl0ZXN0X3NpbmdsZV9maWxlX2ZpbGVzZXQudG1wIik7CisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLAorICAgICAgICAgICAgICAgICJjb3B5dGVzdF9zaW5nbGVfZmlsZV9maWxlc2V0LnRtcCIpOwogICAgICAgICBhc3NlcnRUcnVlKGZpbGUuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZUZpbGVQYXRoKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdF9zaW5nbGVfZmlsZV9wYXRoIik7Ci0gICAgICAgIEZpbGUgZmlsZSAgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29weXRlc3Rfc2luZ2xlX2ZpbGVfcGF0aC50bXAiKTsKKyAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksCisgICAgICAgICAgICAgICAgImNvcHl0ZXN0X3NpbmdsZV9maWxlX3BhdGgudG1wIik7CiAgICAgICAgIGFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7CiAgICAgfQogCkBAIC0xNjQsNTcgKzE2Myw0NiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlSWdub3JlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1pc3NpbmdGaWxlSWdub3JlIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlQmFpbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TWlzc2luZ0ZpbGVCYWlsIik7Ci0gICAgICAgICAgICBmYWlsKCJub3QtdGhlcmUgZG9lc24ndCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShleC5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgoIldhcm5pbmc6IENvdWxkIG5vdCBmaW5kIGZpbGUgIikpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShzdGFydHNXaXRoKCJXYXJuaW5nOiBDb3VsZCBub3QgZmluZCBmaWxlICIpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNaXNzaW5nRmlsZUJhaWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRGlySWdub3JlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1pc3NpbmdEaXJJZ25vcmUiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIldhcm5pbmc6ICIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiV2FybmluZzogIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdEaXJCYWlsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNaXNzaW5nRGlyQmFpbCIpOwotICAgICAgICAgICAgZmFpbCgibm90LXRoZXJlIGRvZXNuJ3QgZXhpc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLmVuZHNXaXRoKCIgZG9lcyBub3QgZXhpc3QuIikpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShlbmRzV2l0aCgiIGRvZXMgbm90IGV4aXN0LiIpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNaXNzaW5nRGlyQmFpbCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVSZXNvdXJjZVBsYWluKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVSZXNvdXJjZVBsYWluIik7Ci0gICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTEudHh0Iik7Ci0gICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTIudHh0Iik7Ci0gICAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTMudHh0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyB0b0RpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMS50eHQiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUodG9EaXIgKyAiL2ZpbGUyLnR4dCIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZSh0b0RpciArICIvZmlsZTMudHh0IikuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBJZ25vcmUoIlByZXZpb3VzbHkgaWdub3JlZCBieSBuYW1pbmcgY29udmVudGlvbiIpCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVJlc291cmNlV2l0aE1hcHBlcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlUmVzb3VyY2VXaXRoTWFwcGVyIik7Ci0gICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTEudHh0LmJhayIpOwotICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIikgKyAiL2ZpbGUyLnR4dC5iYWsiKTsKLSAgICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpICsgIi9maWxlMy50eHQuYmFrIik7Ci0gICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyB0b0RpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMS50eHQuYmFrIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMi50eHQuYmFrIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMy50eHQuYmFrIikuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMjIsMzggKzIxMCwzMCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVSZXNvdXJjZVdpdGhGaWx0ZXIiKTsKICAgICAgICAgRmlsZSBmaWxlMSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpICsgIi9maWxlTlIudHh0Iik7CiAgICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotICAgICAgICBGaWxlUmVhZGVyIGYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZiA9IG5ldyBGaWxlUmVhZGVyKGZpbGUxKTsKKyAgICAgICAgdHJ5IChGaWxlUmVhZGVyIGYgPSBuZXcgRmlsZVJlYWRlcihmaWxlMSkpIHsKICAgICAgICAgICAgIFN0cmluZyBmaWxlMUNvbnRlbnQgPSBGaWxlVXRpbHMucmVhZEZ1bGx5KGYpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGlzIGZpbGUgNDIiLCBmaWxlMUNvbnRlbnQpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBuby1vcDogbm90IGEgcmVhbCBidXNpbmVzcyBlcnJvcgotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGYpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aEFzUmVzb3VyY2UoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0aEFzUmVzb3VyY2UiKTsKLSAgICAgICAgRmlsZSBmaWxlMSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpICsgIi9maWxlMS50eHQiKTsKLSAgICAgICAgRmlsZSBmaWxlMiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpICsgIi9maWxlMi50eHQiKTsKLSAgICAgICAgRmlsZSBmaWxlMyA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpICsgIi9maWxlMy50eHQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZmlsZTIuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbGUzLmV4aXN0cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRvRGlyID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidG8uZGlyIik7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUodG9EaXIgKyAiL2ZpbGUxLnR4dCIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZSh0b0RpciArICIvZmlsZTIudHh0IikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMy50eHQiKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwZmlsZXNldCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RaaXBmaWxlc2V0Iik7Ci0gICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTEudHh0Iik7Ci0gICAgICAgIEZpbGUgZmlsZTIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTIudHh0Iik7Ci0gICAgICAgIEZpbGUgZmlsZTMgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0by5kaXIiKSArICIvZmlsZTMudHh0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZmlsZTEuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbGUyLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlMy5leGlzdHMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyB0b0RpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRvLmRpciIpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHRvRGlyICsgIi9maWxlMS50eHQiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUodG9EaXIgKyAiL2ZpbGUyLnR4dCIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZSh0b0RpciArICIvZmlsZTMudHh0IikuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yOTUsNDkgKzI3NSw0MyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvcHlUb1N5bWxpbmtlZFNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gd2UgYXJlIG9ubHkgZ29pbmcgdG8gdGVzdCBhZ2FpbnN0IHN5c3RlbXMgdGhhdCBzdXBwb3J0IHN5bWxpbmtzCi0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJTeW1saW5rcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgb3BlcmF0aW5nIHN5c3RlbSIsIE9zLmlzRmFtaWx5KE9zLkZBTUlMWV9VTklYKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlN5bWxpbmtzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBvcGVyYXRpbmcgc3lzdGVtIiwgT3MuaXNGYW1pbHkoT3MuRkFNSUxZX1VOSVgpKTsKIAogICAgICAgICAvLyBzZXR1cCB0aGUgc291cmNlIGZpbGVzIHRvIHJ1biBjb3B5aW5nIGFnYWluc3QKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNldHVwU2VsZkNvcHlUZXN0aW5nIik7CiAgICAgICAgIGZpbmFsIEZpbGUgdGVzdERpciA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInNlbGYuY29weS50ZXN0LnJvb3QuZGlyIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0ZXN0RGlyICsgIiB3YXMgZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnkiLCB0ZXN0RGlyLmlzRGlyZWN0b3J5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHRlc3REaXIgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeSIsIHRlc3REaXIuaXNEaXJlY3RvcnkoKSk7CiAgICAgICAgIGZpbmFsIEZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHRlc3REaXIsICJmaWxlLnR4dCIpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiU291cmNlIGZpbGUgIiArIHNyY0ZpbGUgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGZpbGUiLCBzcmNGaWxlLmlzRmlsZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU291cmNlIGZpbGUgIiArIHNyY0ZpbGUgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGZpbGUiLCBzcmNGaWxlLmlzRmlsZSgpKTsKICAgICAgICAgZmluYWwgbG9uZyBvcmlnaW5hbEZpbGVTaXplID0gc3JjRmlsZS5sZW5ndGgoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIG9yaWdpbmFsQ29udGVudDsKLSAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKHNyY0ZpbGUpKTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoc3JjRmlsZSkpKSB7CiAgICAgICAgICAgICBvcmlnaW5hbENvbnRlbnQgPSBGaWxlVXRpbHMucmVhZEZ1bGx5KHJlYWRlcik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgfQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ29udGVudCBtaXNzaW5nIGluIGZpbGUgIiArIHNyY0ZpbGUsIG9yaWdpbmFsQ29udGVudCAhPSBudWxsICYmIG9yaWdpbmFsQ29udGVudC5sZW5ndGgoKSA+IDApOworICAgICAgICBhc3NlcnRUcnVlKCJDb250ZW50IG1pc3NpbmcgaW4gZmlsZSAiICsgc3JjRmlsZSwgb3JpZ2luYWxDb250ZW50ICE9IG51bGwgJiYgIW9yaWdpbmFsQ29udGVudC5pc0VtcHR5KCkpOwogCiAgICAgICAgIC8vIHJ1biB0aGUgY29weSB0ZXN0cwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFNlbGZDb3B5Iik7CiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc291cmNlIGZpbGUgaGFzbid0IGJlZW4gaW1wYWN0ZWQgYnkgdGhlIGNvcHkKICAgICAgICAgYXNzZXJ0U2l6ZUFuZENvbnRlbnQoc3JjRmlsZSwgb3JpZ2luYWxGaWxlU2l6ZSwgb3JpZ2luYWxDb250ZW50KTsKICAgICAgICAgZmluYWwgRmlsZSBzeW1saW5rZWRGaWxlID0gbmV3IEZpbGUodGVzdERpciwgInN5bG1pbmstZmlsZS50eHQiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3ltbGlua2VkRmlsZSArICIgd2FzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSIsIHN5bWxpbmtlZEZpbGUuaXNGaWxlKCkpOworICAgICAgICBhc3NlcnRUcnVlKHN5bWxpbmtlZEZpbGUgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGZpbGUiLCBzeW1saW5rZWRGaWxlLmlzRmlsZSgpKTsKICAgICAgICAgYXNzZXJ0U2l6ZUFuZENvbnRlbnQoc3ltbGlua2VkRmlsZSwgb3JpZ2luYWxGaWxlU2l6ZSwgb3JpZ2luYWxDb250ZW50KTsKIAogICAgICAgICBmaW5hbCBGaWxlIHN5bWxpbmtlZFRlc3REaXIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJzZWxmLmNvcHkudGVzdC5zeW1saW5rZWQuZGlyIikpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzeW1saW5rZWRUZXN0RGlyICsgIiB3YXMgZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3RvcnkiLCBzeW1saW5rZWRUZXN0RGlyLmlzRGlyZWN0b3J5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHN5bWxpbmtlZFRlc3REaXIgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeSIsIHN5bWxpbmtlZFRlc3REaXIuaXNEaXJlY3RvcnkoKSk7CiAgICAgICAgIGFzc2VydFNpemVBbmRDb250ZW50KG5ldyBGaWxlKHN5bWxpbmtlZFRlc3REaXIsICJmaWxlLnR4dCIpLCBvcmlnaW5hbEZpbGVTaXplLCBvcmlnaW5hbENvbnRlbnQpOwogICAgICAgICBhc3NlcnRTaXplQW5kQ29udGVudChuZXcgRmlsZShzeW1saW5rZWRUZXN0RGlyLCAic3lsbWluay1maWxlLnR4dCIpLCBvcmlnaW5hbEZpbGVTaXplLCBvcmlnaW5hbENvbnRlbnQpOwogCiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNpemVBbmRDb250ZW50KGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgbG9uZyBleHBlY3RlZFNpemUsIGZpbmFsIFN0cmluZyBleHBlY3RlZENvbnRlbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZpbGUgKyAiIHdhcyBleHBlY3RlZCB0byBiZSBhIGZpbGUiLCBmaWxlLmlzRmlsZSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBzaXplIG9mIGZpbGUgIiArIGZpbGUsIGV4cGVjdGVkU2l6ZSwgZmlsZS5sZW5ndGgoKSk7Ci0gICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7CisgICAgICAgIGFzc2VydFRydWUoZmlsZSArICIgd2FzIGV4cGVjdGVkIHRvIGJlIGEgZmlsZSIsIGZpbGUuaXNGaWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgc2l6ZSBvZiBmaWxlICIgKyBmaWxlLCBleHBlY3RlZFNpemUsIGZpbGUubGVuZ3RoKCkpOwogICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudDsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZmlsZSkpKSB7CiAgICAgICAgICAgICBjb250ZW50ID0gRmlsZVV0aWxzLnJlYWRGdWxseShyZWFkZXIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CiAgICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb250ZW50IGluIGZpbGUgIiArIGZpbGUsIGV4cGVjdGVkQ29udGVudCwgY29udGVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb250ZW50IGluIGZpbGUgIiArIGZpbGUsIGV4cGVjdGVkQ29udGVudCwgY29udGVudCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlkaXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YQppbmRleCBhZGFkOTk0Li42NjgxMjA0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWRpclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDcgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAKIHB1YmxpYyBjbGFzcyBDb3B5ZGlyVGVzdCB7CkBAIC0zOSwzNCArMzksMzEgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiUmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJSZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICAvLyBUT0RPIEFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIlJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTgxLDIwICs3OCwxNyBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpLCAidGFza2RlZnMudG1wIik7CiAKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGZhaWwoIkNvcHkgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29weSBmYWlsZWQiLCBmLmV4aXN0cygpICYmIGYuaXNEaXJlY3RvcnkoKSk7CiAgICAgICAgIC8vIFdlIGtlZXAgdGhpcywgc28gd2UgaGF2ZSBzb21ldGhpbmcgdG8gZGVsZXRlIGluIGxhdGVyIHRlc3RzIDotKQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogZXhwZWN0ZWQgZmFpbHVyZSBiZWNhdXNlIHRhcmdldCBpcyBmaWxlCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICAgICAgZmFpbCgidGFyZ2V0IGlzIGZpbGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Db3B5ZmlsZVRlc3QuamF2YQppbmRleCBhM2Q4NGVlLi45ZmQ2MGVhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvQ29weWZpbGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0NvcHlmaWxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjYsNyArMjYsNyBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgogICovCkBAIC00MCwzNCArNDAsMjIgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJSZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiUmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIlJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTgxLDIwICs2OSwxMyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpLCAiY29weWZpbGUudG1wIik7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmLmRlbGV0ZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmFpbCgiQ29weSBmYWlsZWQiKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJDb3B5IGZhaWxlZCIsIGYuZXhpc3RzKCkpOworICAgICAgICBmLmRlbGV0ZSgpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICAgICAgZmFpbCgiUmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlZmF1bHRFeGNsdWRlc1Rlc3QuamF2YQppbmRleCAwNmNhM2EyLi5mMTdhNGIzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVmYXVsdEV4Y2x1ZGVzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWZhdWx0RXhjbHVkZXNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCwxMyArMjQsMTIxIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCiAgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgRGVmYXVsdEV4Y2x1ZGVzVGVzdCB7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiB0YXJnZXRzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICAvKiBkZWZhdWx0ICovCisgICAgICAgICAgICAgICAgeyJ0ZXN0MSIsIG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8qfiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uIyoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLyUqJSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2bi8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdC8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRtb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGciLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdzdWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YnN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGd0YWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uRFNfU3RvcmUifX0sCisgICAgICAgICAgICAgICAgLyogYWRkICovCisgICAgICAgICAgICAgICAgeyJ0ZXN0MiIsIG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8qfiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uIyoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLyUqJSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2biIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2bi8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdC8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdGF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRtb2R1bGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGciLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZy8qKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdzdWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YnN0YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGd0YWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uRFNfU3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImZvbyJ9fSwKKyAgICAgICAgICAgICAgICAvKiBzdWJ0cmFjdCAqLworICAgICAgICAgICAgICAgIHsidGVzdDMiLCBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLyMqIyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLiMqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5fKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAvL0NWUyBtaXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovQ1ZTLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uY3ZzaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi92c3N2ZXIuc2NjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0LyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0YXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdGlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdG1vZHVsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnLyoqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnc3Vic3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3RhZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienIvKioiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5EU19TdG9yZSJ9fQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICBwdWJsaWMgU3RyaW5nW10gZXhwZWN0ZWQ7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CkBAIC00NSwxMjYgKzE1MywxNSBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwogICAgIH0KIAotICAgIC8vIE91dHB1dCB0aGUgZGVmYXVsdCBleGNsdWRlcwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy4jKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMvKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL1NDQ1MvKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5zdm4vKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0LyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRhdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdG1vZHVsZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZy8qKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnc3ViIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YnN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3RhZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmJ6ciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyLyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienJpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLkRTX1N0b3JlIn07Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlDb250ZW50c0VxdWFscygiY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIiwgZXhwZWN0ZWQsIERpcmVjdG9yeVNjYW5uZXIuZ2V0RGVmYXVsdEV4Y2x1ZGVzKCkpOwotICAgIH0KLQotICAgIC8vIGFkZGluZyBzb21ldGhpbmcgdG8gdGhlIGV4Y2x1ZGVzJwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy4jKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL0NWUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9DVlMvKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmN2c2lnbm9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL1NDQ1MvKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovdnNzdmVyLnNjYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5zdm4vKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0LyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRhdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdG1vZHVsZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZy8qKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnc3ViIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YnN0YXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3RhZ3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmJ6ciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyLyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienJpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLkRTX1N0b3JlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbyJ9OwotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlDb250ZW50c0VxdWFscygiY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIiwgZXhwZWN0ZWQsIERpcmVjdG9yeVNjYW5uZXIuZ2V0RGVmYXVsdEV4Y2x1ZGVzKCkpOwotICAgIH0KLQotICAgIC8vIHJlbW92aW5nIHNvbWV0aGluZyBmcm9tIHRoZSBkZWZhdWx0cwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovKn4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovIyojIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy4jKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8lKiUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLl8qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DVlMgbWlzc2luZwotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovQ1ZTLyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5jdnNpZ25vcmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovU0NDUyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi9TQ0NTLyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqL3Zzc3Zlci5zY2MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLnN2biIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uc3ZuLyoqIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmdpdC8qKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0YXR0cmlidXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uZ2l0aWdub3JlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5naXRtb2R1bGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGcvKioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmhnaWdub3JlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5oZ3N1YiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGdzdWJzdGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uaGd0YWdzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5ienIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiKiovLmJ6ci8qKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIqKi8uYnpyaWdub3JlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIioqLy5EU19TdG9yZSJ9OwotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlDb250ZW50c0VxdWFscygiY3VycmVudCBkZWZhdWx0IGV4Y2x1ZGVzIiwgZXhwZWN0ZWQsIERpcmVjdG9yeVNjYW5uZXIuZ2V0RGVmYXVsdEV4Y2x1ZGVzKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBcnJheUNvbnRlbnRzRXF1YWxzKFN0cmluZyBtZXNzYWdlLCBTdHJpbmdbXSBleHBlY3RlZCwgU3RyaW5nW10gYWN0dWFsKSB7CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICBTdHJpbmdbXSBhY3R1YWwgPSBEaXJlY3RvcnlTY2FubmVyLmdldERlZmF1bHRFeGNsdWRlcygpOwogICAgICAgICAvLyBjaGVjayB0aGF0IGJvdGggYXJyYXlzIGhhdmUgdGhlIHNhbWUgc2l6ZQotICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgOiBzdHJpbmcgYXJyYXkgbGVuZ3RoIG1hdGNoIiwgZXhwZWN0ZWQubGVuZ3RoLCBhY3R1YWwubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXJyZW50IGRlZmF1bHQgZXhjbHVkZXM6IHN0cmluZyBhcnJheSBsZW5ndGggbWF0Y2giLCBleHBlY3RlZC5sZW5ndGgsIGFjdHVhbC5sZW5ndGgpOwogICAgICAgICBmb3IgKFN0cmluZyBlbGVtZW50IDogZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyAhZm91bmQgJiYgaSA8IGFjdHVhbC5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGZvdW5kIHw9IGVsZW1lbnQuZXF1YWxzKGFjdHVhbFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UgKyAiIDogZGlkbid0IGZpbmQgZWxlbWVudCAiCi0gICAgICAgICAgICAgICAgICAgICsgZWxlbWVudCArICIgaW4gYXJyYXkgbWF0Y2giLCBmb3VuZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJjdXJyZW50IGRlZmF1bHQgZXhjbHVkZXM6IGRpZG4ndCBmaW5kIGVsZW1lbnQgIiArIGVsZW1lbnQgKyAiIGluIGFycmF5IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChhY3R1YWwpLmNvbnRhaW5zKGVsZW1lbnQpKTsKICAgICAgICAgfQotCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWxldGVUZXN0LmphdmEKaW5kZXggNGQzNDM0MS4uOTljY2M3MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbGV0ZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVsZXRlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsOCArMjQsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogLyoqCiAgKi8KIHB1YmxpYyBjbGFzcyBEZWxldGVUZXN0IHsKQEAgLTM4LDczICszNiw4NiBAQAogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsZXRlLnhtbCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoInJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKICAgICB9CisKICAgICAvL3doZXJlIG9oIHdoZXJlIGhhcyBteSB0ZXN0IGNhc2UgMyBnb25lPwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NyIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OCIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEwKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEwIik7CiAgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MTEoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTEiKTsKICAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMiIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEzIik7CiAgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MTQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTQiKTsKICAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxNSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxNSIpOwogICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDE2KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDE2Iik7CiAgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MTcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTciKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZWx0cmVlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWVUZXN0LmphdmEKaW5kZXggYjJkY2M2OS4uYzg1ZjZhYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbHRyZWVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiBwdWJsaWMgY2xhc3MgRGVsdHJlZVRlc3QgewogCiAgICAgQFJ1bGUKQEAgLTM2LDE0ICszNCwxMyBAQAogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZGVsdHJlZS54bWwiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJyZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZW11eE91dHB1dFRhc2suamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EZW11eE91dHB1dFRhc2suamF2YQppbmRleCBlNWUzYjJmLi41ODE1NTdkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGVtdXhPdXRwdXRUYXNrLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0RlbXV4T3V0cHV0VGFzay5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNTQsNyArNTQsNyBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlT3V0cHV0KFN0cmluZyBsaW5lKSB7CiAgICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgaWYgKGxpbmUubGVuZ3RoKCkgIT0gMCAmJiAhbGluZS5lcXVhbHMocmFuZG9tT3V0VmFsdWUpKSB7CisgICAgICAgIGlmICghbGluZS5pc0VtcHR5KCkgJiYgIWxpbmUuZXF1YWxzKHJhbmRvbU91dFZhbHVlKSkgewogICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiUmVjZWl2ZWQgPSBbIiArIGxpbmUgKyAiXSwgZXhwZWN0ZWQgPSBbIgogICAgICAgICAgICAgICAgICsgcmFuZG9tT3V0VmFsdWUgKyAiXSI7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CkBAIC02NCw3ICs2NCw3IEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVFcnJvck91dHB1dChTdHJpbmcgbGluZSkgewogICAgICAgICBsaW5lID0gbGluZS50cmltKCk7Ci0gICAgICAgIGlmIChsaW5lLmxlbmd0aCgpICE9IDAgJiYgIWxpbmUuZXF1YWxzKHJhbmRvbUVyclZhbHVlKSkgeworICAgICAgICBpZiAoIWxpbmUuaXNFbXB0eSgpICYmICFsaW5lLmVxdWFscyhyYW5kb21FcnJWYWx1ZSkpIHsKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlJlY2VpdmVkID0gWyIgKyBsaW5lICsgIl0sIGV4cGVjdGVkID0gWyIKICAgICAgICAgICAgICAgICArIHJhbmRvbUVyclZhbHVlICsgIl0iOwogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0Rpcm5hbWVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZVRlc3QuamF2YQppbmRleCBkODcwMzQ4Li4zYTBhNGYzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRGlybmFtZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDIxICsxOSwyNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOwogCiAvKioKICAqLwogcHVibGljIGNsYXNzIERpcm5hbWVUZXN0IHsKIAogICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKQEAgLTQzLDUwICs0OSwzOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGFzIHByb3BlcnR5IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eSBhdHRyaWJ1dGUgcmVxdWlyZWQiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgicHJvcGVydHkgYXR0cmlidXRlIHJlcXVpcmVkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBhcyBmaWxlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlIGF0dHJpYnV0ZSByZXF1aXJlZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJmaWxlIGF0dHJpYnV0ZSByZXF1aXJlZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gYXMgcHJvcGVydHkgYXR0cmlidXRlIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByb3BlcnR5IGF0dHJpYnV0ZSByZXF1aXJlZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJwcm9wZXJ0eSBhdHRyaWJ1dGUgcmVxdWlyZWQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZUZhbHNlKCJUZXN0IG5vdCBwb3NzaWJsZSBvbiBET1Mgb3IgTmV0d2FyZSBmYW1pbHkgT1MiLCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpIHx8IE9zLmlzRmFtaWx5KCJkb3MiKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJTa2lwIG9uIERPUyBvciBOZXR3YXJlIiwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgiZG9zIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICAgICAgU3RyaW5nIGZpbGVzZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZCA9IGZpbGVzZXAgKyAidXNyIiArIGZpbGVzZXAgKyAibG9jYWwiOwotICAgICAgICBTdHJpbmcgY2hlY2twcm9wID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYWwuZGlyIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZGlybmFtZSBmYWlsZWQiLCBleHBlY3RlZCwgY2hlY2twcm9wKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaXJuYW1lIGZhaWxlZCIsIEZpbGUuc2VwYXJhdG9yICsgInVzciIgKyBGaWxlLnNlcGFyYXRvciArICJsb2NhbCIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYWwuZGlyIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJiYXNlZGlyIik7Ci0gICAgICAgIFN0cmluZyBjaGVja3Byb3AgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJiYXNlLmRpciIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImRpcm5hbWUgZmFpbGVkIiwgZXhwZWN0ZWQsIGNoZWNrcHJvcCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlybmFtZSBmYWlsZWQiLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5QUk9KRUNUX0JBU0VESVIpLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImJhc2UuZGlyIikpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0R5bmFtaWNUYXNrLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rhc2suamF2YQppbmRleCAwZDRiNmNkLi5mZDI1N2E0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rhc2suamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRHluYW1pY1Rhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9EeW5hbWljVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0R5bmFtaWNUZXN0LmphdmEKaW5kZXggNjE1ZGQ5MC4uMTE3ZWZhZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0R5bmFtaWNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0R5bmFtaWNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhCmluZGV4IDZmMGM3YTkuLjljNzFlYjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FY2hvVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsMTMgKzI0LDE3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkRlZmF1bHRMb2dnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzLnJlYWRGdWxseTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIC8qKgpAQCAtMzgsMTYgKzQyLDI1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBFY2hvVGVzdCB7CiAKLSAgICBwcml2YXRlIEZpbGUgcmVtb3ZlVGhpczsKKyAgICBAUnVsZQorICAgIHB1YmxpYyBUZW1wb3JhcnlGb2xkZXIgZm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgICAgcHJpdmF0ZSBFY2hvVGVzdExvZ2dlciBsb2dnZXI7CisKKyAgICBwcml2YXRlIEVjaG8gZWNobzsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgUHJvamVjdCBwID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgcC5pbml0KCk7CisgICAgICAgIGxvZ2dlciA9IG5ldyBFY2hvVGVzdExvZ2dlcigpOworICAgICAgICBwLmFkZEJ1aWxkTGlzdGVuZXIobG9nZ2VyKTsKKyAgICAgICAgZWNobyA9IG5ldyBFY2hvKCk7CisgICAgICAgIGVjaG8uc2V0UHJvamVjdChwKTsKKyAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dCbGFua0VjaG8oKSB7Ci0gICAgICAgIFByb2plY3QgcCA9IG5ldyBQcm9qZWN0KCk7Ci0gICAgICAgIHAuaW5pdCgpOwotICAgICAgICBFY2hvVGVzdExvZ2dlciBsb2dnZXIgPSBuZXcgRWNob1Rlc3RMb2dnZXIoKTsKLSAgICAgICAgcC5hZGRCdWlsZExpc3RlbmVyKGxvZ2dlcik7Ci0gICAgICAgIEVjaG8gZWNobyA9IG5ldyBFY2hvKCk7Ci0gICAgICAgIGVjaG8uc2V0UHJvamVjdChwKTsKICAgICAgICAgZWNoby5zZXRUYXNrTmFtZSgidGVzdExvZ0JsYW5rRWNobyIpOwogICAgICAgICBlY2hvLmV4ZWN1dGUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbdGVzdExvZ0JsYW5rRWNob10gIiwgbG9nZ2VyLmxhc3RMb2dnZWRNZXNzYWdlKTsKQEAgLTU1LDI5ICs2OCwxNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nVVRGOEVjaG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0IHAgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwLmluaXQoKTsKLSAgICAgICAgRWNob1Rlc3RMb2dnZXIgbG9nZ2VyID0gbmV3IEVjaG9UZXN0TG9nZ2VyKCk7Ci0gICAgICAgIHAuYWRkQnVpbGRMaXN0ZW5lcihsb2dnZXIpOwotICAgICAgICBFY2hvIGVjaG8gPSBuZXcgRWNobygpOwotICAgICAgICBlY2hvLnNldFByb2plY3QocCk7Ci0gICAgICAgIGVjaG8uc2V0VGFza05hbWUoInRlc3RMb2dVVEY4RWNobyIpOwotICAgICAgICBlY2hvLnNldE1lc3NhZ2UoIlx1MDBlNFx1MDBhOSIpOwotICAgICAgICByZW1vdmVUaGlzID0gbmV3IEZpbGUoImFiYy50eHQiKTsKLSAgICAgICAgZWNoby5zZXRGaWxlKHJlbW92ZVRoaXMpOwotICAgICAgICBlY2hvLnNldEVuY29kaW5nKCJVVEYtOCIpOwotICAgICAgICBlY2hvLmV4ZWN1dGUoKTsKLSAgICAgICAgU3RyaW5nIHggPSBGaWxlVXRpbHMucmVhZEZ1bGx5KG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKHJlbW92ZVRoaXMpLCAiVVRGLTgiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh4LCJcdTAwZTRcdTAwYTkiKTsKLSAgICB9CisgICAgICAgIEZpbGUgcmVtb3ZlVGhpcyA9IGZvbGRlci5uZXdGaWxlKCJhYmMudHh0Iik7CisgICAgICAgIENoYXJzZXQgY3MgPSBTdGFuZGFyZENoYXJzZXRzLlVURl84OworICAgICAgICBTdHJpbmcgbXNnID0gIlx1MDBlNFx1MDBhOSI7CiAKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgaWYgKHJlbW92ZVRoaXMgIT0gbnVsbCAmJiByZW1vdmVUaGlzLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBpZiAoIXJlbW92ZVRoaXMuZGVsZXRlKCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVUaGlzLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGVjaG8uc2V0VGFza05hbWUoInRlc3RMb2dVVEY4RWNobyIpOworICAgICAgICBlY2hvLnNldE1lc3NhZ2UobXNnKTsKKyAgICAgICAgZWNoby5zZXRGaWxlKHJlbW92ZVRoaXMpOworICAgICAgICBlY2hvLnNldEVuY29kaW5nKGNzLm5hbWUoKSk7CisgICAgICAgIGVjaG8uZXhlY3V0ZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtc2csIHJlYWRGdWxseShuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShyZW1vdmVUaGlzKSwgY3MpKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBjbGFzcyBFY2hvVGVzdExvZ2dlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0VjaG9YTUxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1hNTFRlc3QuamF2YQppbmRleCBjYzllYzI0Li42NzNkZDU3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1hNTFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRWNob1hNTFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDE1ICsyNCwxNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgRWNob1hNTFRlc3QgewogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZWNob3htbC54bWwiKTsKQEAgLTUwLDIyICs1MSwxNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmFpbCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IG11c3QgZmFpbCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiR7Zm9vfT1iYXIiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiJHtmb299PWJhciIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZhaWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RW1wdHkiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBtdXN0IGZhaWwiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJObyBuZXN0ZWQgWE1MIHNwZWNpZmllZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJObyBuZXN0ZWQgWE1MIHNwZWNpZmllZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVtcHR5Iik7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1N0cmVhbVJlZGlyZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1N0cmVhbVJlZGlyZWN0b3JUZXN0LmphdmEKaW5kZXggOGEzMWQwYi4uYzI4YjZlMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNTdHJlYW1SZWRpcmVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjU3RyZWFtUmVkaXJlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEwICsxNywxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0SGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwpAQCAtMjgsNyArMjksNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTM3LDcxICszOCw2NiBAQAogICovCiBwdWJsaWMgY2xhc3MgRXhlY1N0cmVhbVJlZGlyZWN0b3JUZXN0IHsKIAotICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworICAgIEBSdWxlCisgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciBmb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyOwogCiAgICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICAgICAgZmluYWwgRmlsZSBhbnRGaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4ZWMtd2l0aC1yZWRpcmVjdG9yLnhtbCIpOwotICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eSgiYW50LmZpbGUiLCBhbnRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXIgPSB0aGlzLmNyZWF0ZVRtcERpcigpOwotICAgICAgICBwcm9qZWN0LnNldFVzZXJQcm9wZXJ0eSgib3V0cHV0Iiwgb3V0cHV0RGlyLnRvU3RyaW5nKCkpOwotICAgICAgICBQcm9qZWN0SGVscGVyLmNvbmZpZ3VyZVByb2plY3QocHJvamVjdCwgYW50RmlsZSk7Ci0gICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4ZWMtd2l0aC1yZWRpcmVjdG9yLnhtbCIpOworICAgICAgICBvdXRwdXREaXIgPSBmb2xkZXIubmV3Rm9sZGVyKFN0cmluZy52YWx1ZU9mKCJ0ZW1wLSIgKyBTeXN0ZW0ubmFub1RpbWUoKSkpOworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFVzZXJQcm9wZXJ0eSgib3V0cHV0Iiwgb3V0cHV0RGlyLnRvU3RyaW5nKCkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0cyB0aGF0IHRoZSByZWRpcmVjdGVkIHN0cmVhbXMgb2YgdGhlIGV4ZWMnZWQgcHJvY2VzcyBhcmVuJ3QgdHJ1bmNhdGVkLgogICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwogICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01ODQ1MSI+YnotNTg0NTE8L2E+IGFuZAogICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vYnouYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTg4MzMiPmJ6LTU4ODMzPC9hPiBmb3IgbW9yZSBkZXRhaWxzCiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkaXJlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRpclRvTGlzdCA9IHByb2plY3QuZ2V0UHJvcGVydHkoImRpci50by5scyIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGlyVG9MaXN0ID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGlyLnRvLmxzIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwoIkRpcmVjdG9yeSB0byBsaXN0IGlzbid0IGF2YWlsYWJsZSIsIGRpclRvTGlzdCk7CiAgICAgICAgIGFzc2VydFRydWUoZGlyVG9MaXN0ICsgIiBpcyBub3QgYSBkaXJlY3RvcnkiLCBuZXcgRmlsZShkaXJUb0xpc3QpLmlzRGlyZWN0b3J5KCkpOwogCi0gICAgICAgIHByb2plY3QuZXhlY3V0ZVRhcmdldCgibGlzdC1kaXIiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxpc3QtZGlyIik7CiAKICAgICAgICAgLy8gdmVyaWZ5IHRoZSByZWRpcmVjdGVkIG91dHB1dAotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0RGlyUGF0aCA9IHByb2plY3QuZ2V0UHJvcGVydHkoIm91dHB1dCIpOwogICAgICAgICBieXRlW10gZGlyTGlzdGluZ091dHB1dCA9IG51bGw7CiAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDE2OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgcmVkaXJlY3RlZE91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXJQYXRoLCAibHMiICsgaSArICIudHh0Iik7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHJlZGlyZWN0ZWRPdXRwdXRGaWxlICsgIiBpcyBtaXNzaW5nIG9yIG5vdCBhIHJlZ3VsYXIgZmlsZSIsIHJlZGlyZWN0ZWRPdXRwdXRGaWxlLmlzRmlsZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgcmVkaXJlY3RlZE91dHB1dEZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXIsICJscyIgKyBpICsgIi50eHQiKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocmVkaXJlY3RlZE91dHB1dEZpbGUgKyAiIGlzIG1pc3Npbmcgb3Igbm90IGEgcmVndWxhciBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3RlZE91dHB1dEZpbGUuaXNGaWxlKCkpOwogICAgICAgICAgICAgZmluYWwgYnl0ZVtdIHJlZGlyZWN0ZWRPdXRwdXQgPSByZWFkQWxsQnl0ZXMocmVkaXJlY3RlZE91dHB1dEZpbGUpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gY29udGVudCB3YXMgcmVkaXJlY3RlZCB0byAiICsgcmVkaXJlY3RlZE91dHB1dEZpbGUsIHJlZGlyZWN0ZWRPdXRwdXQpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkNvbnRlbnQgaW4gcmVkaXJlY3RlZCBmaWxlICIgKyByZWRpcmVjdGVkT3V0cHV0RmlsZSArICIgd2FzIGVtcHR5IiwgcmVkaXJlY3RlZE91dHB1dC5sZW5ndGggPT0gMCk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoIkNvbnRlbnQgaW4gcmVkaXJlY3RlZCBmaWxlICIgKyByZWRpcmVjdGVkT3V0cHV0RmlsZSArICIgd2FzIGVtcHR5IiwKKyAgICAgICAgICAgICAgICAgICAgMCwgcmVkaXJlY3RlZE91dHB1dC5sZW5ndGgpOwogICAgICAgICAgICAgaWYgKGRpckxpc3RpbmdPdXRwdXQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdGhlIGRpcmVjdG9yeSBsaXN0aW5nIHRoYXQgd2FzIHJlZGlyZWN0ZWQgdG8gdGhlc2UgZmlsZXMuIGFsbCBmaWxlcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBjb250ZW50CisgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgZGlyZWN0b3J5IGxpc3RpbmcgdGhhdCB3YXMgcmVkaXJlY3RlZCB0byB0aGVzZSBmaWxlcy4KKyAgICAgICAgICAgICAgICAvLyBBbGwgZmlsZXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgY29udGVudC4KICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJSZWRpcmVjdGVkIG91dHB1dCBpbiBmaWxlICIgKyByZWRpcmVjdGVkT3V0cHV0RmlsZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgbWF0Y2ggY29udGVudCBpbiBvdGhlciByZWRpcmVjdGVkIG91dHB1dCBmaWxlKHMpIiwgQXJyYXlzLmVxdWFscyhkaXJMaXN0aW5nT3V0cHV0LCByZWRpcmVjdGVkT3V0cHV0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3QgbWF0Y2ggY29udGVudCBpbiBvdGhlciByZWRpcmVjdGVkIG91dHB1dCBmaWxlKHMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5lcXVhbHMoZGlyTGlzdGluZ091dHB1dCwgcmVkaXJlY3RlZE91dHB1dCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZGlyTGlzdGluZ091dHB1dCA9IHJlZGlyZWN0ZWRPdXRwdXQ7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIEZpbGUgY3JlYXRlVG1wRGlyKCkgewotICAgICAgICBmaW5hbCBGaWxlIHRtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgU3RyaW5nLnZhbHVlT2YoInRlbXAtIiArIFN5c3RlbS5uYW5vVGltZSgpKSk7Ci0gICAgICAgIHRtcERpci5ta2RpcigpOwotICAgICAgICB0bXBEaXIuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIHJldHVybiB0bXBEaXI7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRBbGxCeXRlcyhmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwogICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICB0cnkgeworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSB7CiAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YUNodW5rID0gbmV3IGJ5dGVbMTAyNF07CiAgICAgICAgICAgICBpbnQgbnVtUmVhZCA9IC0xOwogICAgICAgICAgICAgd2hpbGUgKChudW1SZWFkID0gZmlzLnJlYWQoZGF0YUNodW5rKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYm9zLndyaXRlKGRhdGFDaHVuaywgMCwgbnVtUmVhZCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmaXMuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYm9zLnRvQnl0ZUFycmF5KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWNUYXNrVGVzdC5qYXZhCmluZGV4IDk1YjJjYTkuLmQ3N2JkNDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjVGFza1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY1Rhc2tUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZU5vdE51bGw7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwpAQCAtMjYsMTAgKzI4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3RIZWxwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CkBAIC00Myw4ICs0NSw2IEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BBVEggPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvZXhlYy8iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFID0gQlVJTERfUEFUSCArICJleGVjLnhtbCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRJTUVfVE9fV0FJVCA9IDE7CiAgICAgLyoqIG1heGltdW0gdGltZSBhbGxvd2VkIGZvciB0aGUgYnVpbGQgaW4gbWlsbGlzZWNvbmRzICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUlMRF9USU1FID0gNjAwMDsKQEAgLTU1LDI1ICs1NSwyMyBAQAogICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKLSAgICBwcml2YXRlIEZpbGUgbG9nRmlsZTsKLSAgICBwcml2YXRlIE1vbml0b3JlZEJ1aWxkIG15QnVpbGQgPSBudWxsOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBidWlsZEZpbmlzaGVkID0gZmFsc2U7CiAKLQogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoQlVJTERfRklMRSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9leGVjL2V4ZWMueG1sIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0c3Bhd24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVOb3ROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QuY2FuLnJ1biIpKTsKLSAgICAgICAgbXlCdWlsZCA9IG5ldyBNb25pdG9yZWRCdWlsZChuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgQlVJTERfRklMRSksICJzcGF3biIpOwotICAgICAgICBsb2dGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgic3Bhd24iLCAibG9nIiwgbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpLAotICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIGFzc3VtZU5vdE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdC5jYW4ucnVuIikpOworICAgICAgICBNb25pdG9yZWRCdWlsZCBteUJ1aWxkID0gbmV3IE1vbml0b3JlZEJ1aWxkKG5ldyBGaWxlKAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfRklMRSkpLCAic3Bhd24iKTsKKyAgICAgICAgRmlsZSBsb2dGaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgic3Bhd24iLCAibG9nIiwKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSksIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIC8vIHRoaXMgaXMgZ3VhcmFudGVlZCBieSBGaWxlVXRpbHMjY3JlYXRlVGVtcEZpbGUKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibG9nIGZpbGUgbm90IGV4aXN0aW5nIiwgIWxvZ0ZpbGUuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgibG9nIGZpbGUgbm90IGV4aXN0aW5nIiwgbG9nRmlsZS5leGlzdHMoKSk7CiAgICAgICAgIC8vIG1ha2UgdGhlIHNwYXduZWQgcHJvY2VzcyBydW4gMSBzZWNvbmRzCiAgICAgICAgIG15QnVpbGQuc2V0VGltZVRvV2FpdChUSU1FX1RPX1dBSVQpOwogICAgICAgICBteUJ1aWxkLnNldExvZ0ZpbGUobG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CkBAIC0xMzQsNyArMTMyLDcgQEAKICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KCJhbnQuZmlsZSIsIG15QnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHByb2plY3Quc2V0VXNlclByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0ZJTEUsIG15QnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIFByb2plY3RIZWxwZXIuY29uZmlndXJlUHJvamVjdChwcm9qZWN0LCBteUJ1aWxkRmlsZSk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVKYXZhVGVzdC5qYXZhCmluZGV4IDA2YmVhYjQuLjllOTNmNjQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlSmF2YVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZUphdmFUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgpAQCAtNTQsNyArNTUsNyBAQAogICAgICAgICBlai5zZXRDbGFzc3BhdGgoY3ApOwogICAgIH0KIAotICAgIHByaXZhdGUgQ29tbWFuZGxpbmUgZ2V0Q29tbWFuZGxpbmUoaW50IHRpbWV0b3J1bikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBDb21tYW5kbGluZSBnZXRDb21tYW5kbGluZShpbnQgdGltZXRvcnVuKSB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBjbWQuc2V0RXhlY3V0YWJsZShUaW1lUHJvY2Vzcy5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBjbWQuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZih0aW1ldG9ydW4pKTsKQEAgLTYyLDE2ICs2MywxNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vVGltZU91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RpbWVPdXQoKSB7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IGdldENvbW1hbmRsaW5lKFRJTUVfT1VUIC8gMik7CiAgICAgICAgIGVqLnNldEphdmFDb21tYW5kKGNtZCk7CiAgICAgICAgIGVqLmV4ZWN1dGUocHJvamVjdCk7Ci0gICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIWVqLmtpbGxlZFByb2Nlc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsIGVqLmtpbGxlZFByb2Nlc3MoKSk7CiAgICAgfQogCiAgICAgLy8gdGVzdCB0aGF0IHRoZSB3YXRjaGRvZyBlbmRzIHRoZSBwcm9jZXNzCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZU91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lT3V0KCkgewogICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBnZXRDb21tYW5kbGluZShUSU1FX09VVCAqIDIpOwogICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOwogICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtODgsMTYgKzg5LDE2IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UaW1lT3V0Rm9ya2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdE5vVGltZU91dEZvcmtlZCgpIHsKICAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gZ2V0Q29tbWFuZGxpbmUoVElNRV9PVVQgLyAyKTsKICAgICAgICAgZWouc2V0SmF2YUNvbW1hbmQoY21kKTsKICAgICAgICAgZWouZm9yayhjcCk7Ci0gICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIWVqLmtpbGxlZFByb2Nlc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsIGVqLmtpbGxlZFByb2Nlc3MoKSk7CiAgICAgfQogCiAgICAgLy8gdGVzdCB0aGF0IHRoZSB3YXRjaGRvZyBlbmRzIHRoZSBwcm9jZXNzCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZU91dEZvcmtlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lT3V0Rm9ya2VkKCkgewogICAgICAgICBDb21tYW5kbGluZSBjbWQgPSBnZXRDb21tYW5kbGluZShUSU1FX09VVCAqIDIpOwogICAgICAgICBlai5zZXRKYXZhQ29tbWFuZChjbWQpOwogICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMTE0LDEzICsxMTUsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBEYW5nZXJvdXMgbWV0aG9kIHRvIG9idGFpbiB0aGUgY2xhc3NwYXRoIGZvciB0aGUgdGVzdC4gVGhpcyBpcwotICAgICAqIHNldmVyZWx5IHRpZ2h0ZWQgdG8gdGhlIGJ1aWxkLnhtbCBwcm9wZXJ0aWVzLgorICAgICAqIERhbmdlcm91cyBtZXRob2QgdG8gb2J0YWluIHRoZSBjbGFzc3BhdGggZm9yIHRoZSB0ZXN0LgorICAgICAqIFRoaXMgaXMgc2V2ZXJlbHkgZGVwZW5kZW50IG9uIHRoZSBidWlsZC54bWwgcHJvcGVydGllcy4KICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVzdENsYXNzUGF0aCgpIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQudGVzdHMiKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQudGVzdHMudmFsdWUiKTsKICAgICAgICAgaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6ICdidWlsZC50ZXN0cycgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSEiKTsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiV0FSTklORzogJ2J1aWxkLnRlc3RzLnZhbHVlJyBwcm9wZXJ0eSBpcyBub3QgYXZhaWxhYmxlISIpOwogICAgICAgICAgICAgY2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0V4ZWN1dGVXYXRjaGRvZ1Rlc3QuamF2YQppbmRleCBiNTU3ZTc2Li4xOTBiNjUwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRXhlY3V0ZVdhdGNoZG9nVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9FeGVjdXRlV2F0Y2hkb2dUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxNCArMjAsMTYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LmludGVybmFsLkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC01NCw5ICs1Niw5IEBACiAgICAgICogc2V2ZXJlbHkgdGllZCB0byB0aGUgYnVpbGQueG1sIHByb3BlcnRpZXMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlc3RDbGFzc1BhdGgoKSB7Ci0gICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzIik7CisgICAgICAgIFN0cmluZyBjbGFzc3BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzLnZhbHVlIik7CiAgICAgICAgIGlmIChjbGFzc3BhdGggPT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJXQVJOSU5HOiAnYnVpbGQudGVzdHMnIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUhIik7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIldBUk5JTkc6ICdidWlsZC50ZXN0cy52YWx1ZScgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSEiKTsKICAgICAgICAgICAgIGNsYXNzcGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CiAgICAgICAgIH0KIApAQCAtNzIsMjEgKzc0LDE2IEBACiAgICAgICAgIHJldHVybiBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZEFycmF5KTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRFcnJvck91dHB1dChQcm9jZXNzIHApIHRocm93cyBFeGNlcHRpb24geworICAgIHByaXZhdGUgU3RyaW5nIGdldEVycm9yT3V0cHV0KFByb2Nlc3MgcCkgewogICAgICAgICBCdWZmZXJlZFJlYWRlciBlcnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHAuZ2V0RXJyb3JTdHJlYW0oKSkpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIFN0cmluZyBsaW5lOwotICAgICAgICB3aGlsZSAoKGxpbmUgPSBlcnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChsaW5lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBlcnIubGluZXMoKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygpKTsKICAgICB9CiAKICAgICBwcml2YXRlIGludCB3YWl0Rm9yRW5kKFByb2Nlc3MgcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGludCByZXRjb2RlID0gcC53YWl0Rm9yKCk7CiAgICAgICAgIGlmIChyZXRjb2RlICE9IDApIHsKICAgICAgICAgICAgIFN0cmluZyBlcnIgPSBnZXRFcnJvck91dHB1dChwKTsKLSAgICAgICAgICAgIGlmIChlcnIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWVyci5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVSUk9SOiIpOwogICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlcnIpOwogICAgICAgICAgICAgfQpAQCAtMTI2LDggKzEyMyw4IEBACiAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IGdldFByb2Nlc3MoLTEpOyAvLyBwcm9jZXNzIHNob3VsZCBhYm9ydAogICAgICAgICB3YXRjaGRvZy5zdGFydChwcm9jZXNzKTsKICAgICAgICAgaW50IHJldENvZGUgPSBwcm9jZXNzLndhaXRGb3IoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgicHJvY2VzcyBzaG91bGQgbm90IGhhdmUgYmVlbiBraWxsZWQiLCAhd2F0Y2hkb2cua2lsbGVkUHJvY2VzcygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgicmV0dXJuIGNvZGUgaXMgaW52YWxpZDogIiArIHJldENvZGUsIHJldENvZGUhPTApOworICAgICAgICBhc3NlcnRGYWxzZSgicHJvY2VzcyBzaG91bGQgbm90IGhhdmUgYmVlbiBraWxsZWQiLCB3YXRjaGRvZy5raWxsZWRQcm9jZXNzKCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoInJldHVybiBjb2RlIGlzIGludmFsaWQ6ICIgKyByZXRDb2RlLCAwLCByZXRDb2RlKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTM2LDE2ICsxMzMsMTQgQEAKICAgICAgICAgd2F0Y2hkb2cuc3RhcnQocHJvY2Vzcyk7CiAKICAgICAgICAgLy8gSSBhc3N1bWUgdGhhdCBzdGFydGluZyB0aGlzIHRha2VzIGxlc3MgdGhhbiBUSU1FX09VVC8yIG1zLi4uCi0gICAgICAgIFRocmVhZCB0aHJlYWQgPSBuZXcgVGhyZWFkKCl7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCl7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLndhaXRGb3IoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCB2ZXJ5IG5pY2UgYnV0IHdpbGwgZG8gdGhlIGpvYgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbigicHJvY2VzcyBpbnRlcnJ1cHRlZCBpbiB0aHJlYWQiLCBlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfTsKKyAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzLndhaXRGb3IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgdmVyeSBuaWNlIGJ1dCB3aWxsIGRvIHRoZSBqb2IKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uKCJwcm9jZXNzIGludGVycnVwdGVkIGluIHRocmVhZCIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgLy8gd2FpdCBmb3IgVElNRV9PVVQgLyAyLCB0aGVyZSBzaG91bGQgYmUgYWJvdXQgVElNRV9PVVQgLyAyIG1zIHJlbWFpbmluZyBiZWZvcmUgdGltZW91dApAQCAtMTU5LDYgKzE1NCw2IEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBzaG91bGQgYmUgZGVhZCBhbmQgd2VsbCBmaW5pc2hlZAogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcHJvY2Vzcy5leGl0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInByb2Nlc3Mgc2hvdWxkIG5vdCBoYXZlIGJlZW4ga2lsbGVkIiwgIXdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJwcm9jZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIGtpbGxlZCIsIHdhdGNoZG9nLmtpbGxlZFByb2Nlc3MoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZhaWxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmFpbFRlc3QuamF2YQppbmRleCAzNDI5OWQ1Li43MjZkNzkyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmFpbFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmFpbFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDE3ICsyMywxOCBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAvKioKICAqLwogcHVibGljIGNsYXNzIEZhaWxUZXN0IHsKIAogICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKQEAgLTQzLDU3ICs0NCw0MiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm8gbWVzc2FnZSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJObyBtZXNzYWdlIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QyIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInRlc3QyIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRleHQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFRleHQiKTsKLSAgICAgICAgICAgIGZhaWwoIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RUZXh0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInRlc3RUZXh0Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGV4dCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWYoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWYiKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgiZm9vIiwgIiIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJZiIpOwotICAgICAgICAgICAgZmFpbCgidGVzdElmIG11c3QgZmFpbCBpZiBmb28gaGFzIGJlZW4gc2V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHJlc3VsdAotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWYiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgcmVzdWx0CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RVbmxlc3MoKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFVubGVzcyIpOwotICAgICAgICAgICAgZmFpbCgidGVzdFVubGVzcyBtdXN0IGZhaWwgdW5sZXNzIGZvbyBoYXMgYmVlbiBzZXQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgcnVsZXMKKyAgICAgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHJ1bGVzCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJmb28iLCAiIik7CisgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFVubGVzcyIpOwogICAgICAgICB9Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImZvbyIsICIiKTsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVbmxlc3MiKTsKLQogICAgIH0KIAogICAgIC8qKgpAQCAtMTAzLDE4ICs4OSwxOCBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElmQW5kVW5sZXNzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImlmPWlmIGFuZCB1bmxlc3M9dW5sZXNzIik7CiAgICAgICAgIC8vbmVpdGhlcgogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElmQW5kVW5sZXNzIik7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImlmIiwgIiIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJZkFuZFVubGVzcyIpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0IGZhaWwgb24gZGVmaW5lZChpZikiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiaWY9aWYgYW5kIHVubGVzcz11bmxlc3MiLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgidW5sZXNzIiwgIiIpOworICAgICAgICAgICAgLy90aGlzIGNhbGwgc2hvdWxkIHN1Y2NlZWQgYXMgdW5sZXNzIG92ZXJyaWRlcyBpZgorICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJZkFuZFVubGVzcyIpOwogICAgICAgICB9Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInVubGVzcyIsICIiKTsKLSAgICAgICAgLy90aGlzIGNhbGwgc2hvdWxkIHN1Y2NlZWQgYXMgdW5sZXNzIG92ZXJyaWRlcyBpZgotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElmQW5kVW5sZXNzIik7CiAgICAgfQogICAgIC8qKgogICAgICAqIHNlZSB0aGF0IHRoZSBkaWZmZXJlbnQgY29tYmluYXRpb25zIHdvcmssIGFuZApAQCAtMTI5LDEyICsxMTUsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkMSIpOwotICAgICAgICAgICAgZmFpbCgiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29uZGl0aW9uIHNhdGlzZmllZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJjb25kaXRpb24gc2F0aXNmaWVkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkMSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDQsNjQgKzEyNyw0NiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkMygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkMyIpOwotICAgICAgICAgICAgZmFpbCgiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdE5lc3RlZDMiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgidGVzdE5lc3RlZDMiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROZXN0ZWQzIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkNCgpIHsKLSAgICAgICAgU3RyaW5nIHNwZWNpZmljTWVzc2FnZSA9ICJOZXN0ZWQgY29uZGl0aW9ucyAiCi0gICAgICAgICAgKyAibm90IHBlcm1pdHRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGlmL3VubGVzcyBhdHRyaWJ1dGVzIjsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJOZXN0ZWQgY29uZGl0aW9ucyBub3QgcGVybWl0dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggaWYvdW5sZXNzIGF0dHJpYnV0ZXMiKTsKIAogICAgICAgICBTdHJpbmdCdWlsZGVyIHRhcmdldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCJ0ZXN0TmVzdGVkNHgiKTsKICAgICAgICAgZm9yIChjaGFyIGNoIDogQXJyYXlzLmFzTGlzdCgnYScsICdiJywgJ2MnKSkgewogICAgICAgICAgICAgdGFyZ2V0LnNldENoYXJBdCh0YXJnZXQubGVuZ3RoKCkgLSAxLCBjaCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlY2lmaWNNZXNzYWdlLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0LnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkNSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkNSIpOwotICAgICAgICAgICAgZmFpbCgiaXQgaXMgcmVxdWlyZWQgdG8gZmFpbCA6LSkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiT25seSBvbmUgbmVzdGVkIGNvbmRpdGlvbiBpcyBhbGxvd2VkLiIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJPbmx5IG9uZSBuZXN0ZWQgY29uZGl0aW9uIGlzIGFsbG93ZWQuIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TmVzdGVkNSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZDYoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5lc3RlZDYiKTsKLSAgICAgICAgICAgIGZhaWwoIml0IGlzIHJlcXVpcmVkIHRvIGZhaWwgOi0pIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3ROZXN0ZWQ2XG50ZXN0TmVzdGVkNlxudGVzdE5lc3RlZDYiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgidGVzdE5lc3RlZDZcbnRlc3ROZXN0ZWQ2XG50ZXN0TmVzdGVkNiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5lc3RlZDYiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQ3KCkgewotICAgICAgICBTdHJpbmcgc3BlY2lmaWNNZXNzYWdlID0gIkEgc2luZ2xlIG5lc3RlZCBjb25kaXRpb24gaXMgcmVxdWlyZWQuIjsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJBIHNpbmdsZSBuZXN0ZWQgY29uZGl0aW9uIGlzIHJlcXVpcmVkLiIpOwogCiAgICAgICAgIFN0cmluZ0J1aWxkZXIgdGFyZ2V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoInRlc3ROZXN0ZWQ3eCIpOwogICAgICAgICBmb3IgKGNoYXIgY2ggOiBBcnJheXMuYXNMaXN0KCdhJywgJ2InKSkgewogICAgICAgICAgICAgdGFyZ2V0LnNldENoYXJBdCh0YXJnZXQubGVuZ3RoKCkgLSAxLCBjaCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJpdCBpcyByZXF1aXJlZCB0byBmYWlsIDotKSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3BlY2lmaWNNZXNzYWdlLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0LnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ZpbHRlclRlc3QuamF2YQppbmRleCAwZTQwYWQ4Li42YTAxZDAyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRmlsdGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaWx0ZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCw3ICsyMCw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIApAQCAtMzIsOSArMzEsOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAotCiBwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCB7CiAKICAgICBAUnVsZQpAQCAtNTAsMzQgKzQ5LDIyIEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjbGVhbnVwIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEyMiwyNCArMTA5LDE1IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsdGVyZWRGaWxlKFN0cmluZyB0ZXN0TnVtYmVyLCBTdHJpbmcgZmlsdGVyZWRGaWxlKSB7Ci0KICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgZmlsdGVyZWRGaWxlKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJmaWx0ZXIgdGVzdCIgKyB0ZXN0TnVtYmVyICsgIiBmYWlsZWQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoZikpOwotICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJmaWx0ZXIgdGVzdCIgKyB0ZXN0TnVtYmVyICsgIiBmYWlsZWQsIGZpbHRlcmVkIGZpbGU6ICIgKyBmLnRvU3RyaW5nKCkgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBsaW5lID0gaW4ucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZmlsdGVyIHRlc3QiICsgdGVzdE51bWJlciArICIgZmFpbGVkLiAgSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBmaWx0ZXJlZCBmaWxlOiAiICsgaW9lKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsdGVyIHRlc3QiICsgdGVzdE51bWJlciArICIgZmFpbGVkIiwgZi5leGlzdHMoKSk7CisKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSkpIHsKKyAgICAgICAgICAgIGxpbmUgPSBpbi5yZWFkTGluZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIGZhaWwoImZpbHRlciB0ZXN0IiArIHRlc3ROdW1iZXIKKyAgICAgICAgICAgICAgICAgKyAiIGZhaWxlZC4gIElPRXhjZXB0aW9uIHdoaWxlIHJlYWRpbmcgZmlsdGVyZWQgZmlsZTogIiArIGlvZSk7CiAgICAgICAgIH0KICAgICAgICAgZi5kZWxldGUoKTsKICAgICAgICAgcmV0dXJuIGxpbmU7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvRml4Q3JMZlRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDckxmVGVzdC5qYXZhCmluZGV4IDI1ODY4OGQuLjA2ODhlMDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDckxmVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9GaXhDckxmVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMjEgKzIwLDIxIEBACiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogCiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKICAqLwpAQCAtNDMsMTE5ICs0MywxMTkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9maXhjcmxmL2J1aWxkLnhtbCIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3Q4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0OCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0OSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdDkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1hY0xpbmVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFjTGluZXMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TWFjTGluZXMiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb092ZXJ3cml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdE5vT3ZlcndyaXRlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vT3ZlcndyaXRlIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFbmNvZGluZyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE91dHB1dEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0RW5jb2RpbmcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0T3V0cHV0RW5jb2RpbmciKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb25nTGluZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RMb25nTGluZXMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TG9uZ0xpbmVzIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JDckxmU2VxdWVuY2VVbml4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JDckxmU2VxdWVuY2VVbml4KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENyQ3JMZlNlcXVlbmNlLXVuaXgiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDckNyTGZTZXF1ZW5jZURvcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdENyQ3JMZlNlcXVlbmNlRG9zKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENyQ3JMZlNlcXVlbmNlLWRvcyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyQ3JMZlNlcXVlbmNlTWFjKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JDckxmU2VxdWVuY2VNYWMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q3JDckxmU2VxdWVuY2UtbWFjIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4bGFzdERvcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGxhc3REb3MoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Rml4bGFzdERvcyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpeGxhc3RGYWxzZU1hYygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGxhc3RGYWxzZU1hYygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaXhsYXN0RmFsc2VNYWMiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZpeEZpbGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Rml4RmlsZSIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpeEZpbGVFeGNsdXNpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Rml4RmlsZUV4Y2x1c2l2ZSIpOwotICAgICAgICAgICAgZmFpbChGaXhDUkxGLkVSUk9SX0ZJTEVfQU5EX1NSQ0RJUik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoRml4Q1JMRi5FUlJPUl9GSUxFX0FORF9TUkNESVIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4RmlsZUV4Y2x1c2l2ZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKEZpeENSTEYuRVJST1JfRklMRV9BTkRfU1JDRElSKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaXhGaWxlRXhjbHVzaXZlIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzEsMTcgKzIzMSwxMSBAQAogCiAgICAgLy8gbm90IHVzZWQsIGJ1dCBwdWJsaWMgc28gdGhlb3JldGljYWxseSBtdXN0IHJlbWFpbiBmb3IgQkM/CiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbENvbnRlbnQoRmlsZSBleHBlY3QsIEZpbGUgcmVzdWx0KQotICAgICAgICB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3IsIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKCFyZXN1bHQuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGZpbGUgIiArIHJlc3VsdCArICIgZG9lc25cJ3QgZXhpc3QiKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIGFzc2VydEVxdWFsQ29udGVudChGaWxlIGV4cGVjdCwgRmlsZSByZXN1bHQpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciwgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmaWxlICIgKyByZXN1bHQgKyAiIGRvZXNuXCd0IGV4aXN0IiwgcmVzdWx0LmV4aXN0cygpKTsKIAotICAgICAgICBJbnB1dFN0cmVhbSBpbkV4cGVjdCA9IG51bGw7Ci0gICAgICAgIElucHV0U3RyZWFtIGluUmVzdWx0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGluRXhwZWN0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShleHBlY3QpKTsKLSAgICAgICAgICAgIGluUmVzdWx0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXN1bHQpKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbkV4cGVjdCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKGV4cGVjdC50b1BhdGgoKSkpOworICAgICAgICAgICAgIElucHV0U3RyZWFtIGluUmVzdWx0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oRmlsZXMubmV3SW5wdXRTdHJlYW0ocmVzdWx0LnRvUGF0aCgpKSkpIHsKIAogICAgICAgICAgICAgaW50IGV4cGVjdGVkQnl0ZSA9IGluRXhwZWN0LnJlYWQoKTsKICAgICAgICAgICAgIHdoaWxlIChleHBlY3RlZEJ5dGUgIT0gLTEpIHsKQEAgLTI0OSwxMyArMjQzLDYgQEAKICAgICAgICAgICAgICAgICBleHBlY3RlZEJ5dGUgPSBpbkV4cGVjdC5yZWFkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVuZCBvZiBmaWxlIiwgLTEsIGluUmVzdWx0LnJlYWQoKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoaW5SZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluUmVzdWx0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5FeHBlY3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluRXhwZWN0LmNsb3NlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR1VuemlwVGVzdC5qYXZhCmluZGV4IGE3YWFjNWQuLjJhNzM4MDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HVW56aXBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dVbnppcFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgR1VuemlwVGVzdCB7CiAKQEAgLTQ1LDI0ICs0NCwyMiBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIGludmFsaWQgYXR0cmlidXRlCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiYXR0cmlidXRlIHNyYyBpbnZhbGlkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvR2V0VGVzdC5qYXZhCmluZGV4IDNlMTE1N2QuLjQwN2NjNTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HZXRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0dldFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDggKzI0LDEzIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuYm90aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqLwpAQCAtMzQsNiArMzksOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2dldC54bWwiKTsKQEAgLTQ0LDU0ICs1Miw0OSBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xlYW51cCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoInJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJyZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBGYWlsIGR1ZSB0byBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICAgICAgZmFpbCgicmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gaW52YWxpZCBzcmMgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgICAgICBmYWlsKCJzcmMgaW52YWxpZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gaW52YWxpZCBkZXN0IGFyZ3VtZW50IG9yIG5vIEhUVFAgc2VydmVyIG9uIGxvY2FsaG9zdAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgICAgIGZhaWwoImRlc3QgaW52YWxpZCAob3Igbm8gaHR0cC1zZXJ2ZXIgb24gbG9jYWwgbWFjaGluZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIEBUZXN0CkBAIC05OSwxMyArMTAyLDE3IEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIG51bGwgb3IgZW1wdHkgdXNlckFnZW50IGFyZ3VtZW50CisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0NygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKLSAgICAgICAgICAgIGZhaWwoInVzZXJBZ2VudCBtYXkgbm90IGJlIG51bGwgb3IgZW1wdHkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHBvc3QtbW9ydGVtCisgICAgICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJBZGRpbmcgaGVhZGVyIikpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTE5LDQgKzEyNiwzNCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFVzZVRvbW9ycm93Iik7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvSGVhZGVyc0FyZUFkZGVkT0soKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VHdvSGVhZGVyc0FyZUFkZGVkT0siKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGJvdGgoY29udGFpbnNTdHJpbmcoIkFkZGluZyBoZWFkZXIgJ2hlYWRlcjEnIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuYW5kKGNvbnRhaW5zU3RyaW5nKCJBZGRpbmcgaGVhZGVyICdoZWFkZXIyJyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlIZWFkZXJzQXJlTmV2ZXJBZGRlZCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFbXB0eUhlYWRlcnNBcmVOZXZlckFkZGVkIik7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIkFkZGluZyBoZWFkZXIiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoYXRXaGVuTW9yZVRoYW5PbmVIZWFkZXJIYXZlU2FtZU5hbWVPbmx5TGFzdE9uZUlzQWRkZWQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGhhdFdoZW5Nb3JlVGhhbk9uZUhlYWRlckhhdmVTYW1lTmFtZU9ubHlMYXN0T25lSXNBZGRlZCIpOworICAgICAgICBTdHJpbmcgbG9nID0gYnVpbGRSdWxlLmdldExvZygpOworICAgICAgICBhc3NlcnRUaGF0KGxvZywgY29udGFpbnNTdHJpbmcoIkFkZGluZyBoZWFkZXIgJ2hlYWRlcjEnIikpOworCisgICAgICAgIGludCBhY3R1YWxIZWFkZXJDb3VudCA9IGxvZy5zcGxpdCgiQWRkaW5nIGhlYWRlciAiKS5sZW5ndGggLSAxOworCisgICAgICAgIGFzc2VydEVxdWFscygiT25seSBvbmUgaGVhZGVyIGhhcyBiZWVuIGFkZGVkIiwgMSwgYWN0dWFsSGVhZGVyQ291bnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlclNwYWNlVHJpbW1lZCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RIZWFkZXJTcGFjZVRyaW1tZWQiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJBZGRpbmcgaGVhZGVyICdoZWFkZXIxJyIpKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9HemlwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEKaW5kZXggNzYzNDJiOC4uZGExODJlYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0d6aXBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw5ICsyNCwxMSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICovCkBAIC0zNSw2MCArMzcsNTggQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9nemlwLnhtbCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBGYWlsIGR1ZSB0byBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gemlwZmlsZSBwb2ludGluZyB0byBhIGRpcmVjdG9yeQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiB6aXBmaWxlIG11c3Qgbm90IHBvaW50IHRvIGEgZGlyZWN0b3J5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R1ppcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJlYWxUZXN0Iik7CiAgICAgICAgIFN0cmluZyBsb2cgPSBidWlsZFJ1bGUuZ2V0TG9nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGluZyBtZXNzYWdlIHN0YXJ0aW5nIHdpdGggJ0J1aWxkaW5nOicgYnV0IGdvdCAnIgotICAgICAgICAgICAgKyBsb2cgKyAiJyIsIGxvZy5zdGFydHNXaXRoKCJCdWlsZGluZzoiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGluZyBtZXNzYWdlIGVuZGluZyB3aXRoICdhc2YtbG9nby5naWYuZ3onIGJ1dCBnb3QgJyIKLSAgICAgICAgICAgICsgbG9nICsgIiciLCBsb2cuZW5kc1dpdGgoImFzZi1sb2dvLmdpZi5neiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0aW5nIG1lc3NhZ2Ugc3RhcnRpbmcgd2l0aCAnQnVpbGRpbmc6JyBidXQgZ290ICciCisgICAgICAgICAgICAgICAgKyBsb2cgKyAiJyIsIGxvZywgc3RhcnRzV2l0aCgiQnVpbGRpbmc6IikpOworICAgICAgICBhc3NlcnRUaGF0KCJFeHBlY3RpbmcgbWVzc2FnZSBlbmRpbmcgd2l0aCAnYXNmLWxvZ28uZ2lmLmd6JyBidXQgZ290ICciCisgICAgICAgICAgICAgICAgKyBsb2cgKyAiJyIsIGxvZywgZW5kc1dpdGgoImFzZi1sb2dvLmdpZi5neiIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTAwLDkgKzEwMCw4IEBACiAgICAgcHVibGljIHZvaWQgdGVzdERhdGVDaGVjaygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3REYXRlQ2hlY2siKTsKICAgICAgICAgU3RyaW5nIGxvZyA9IGJ1aWxkUnVsZS5nZXRMb2coKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICJFeHBlY3RpbmcgbWVzc2FnZSBlbmRpbmcgd2l0aCAnYXNmLWxvZ28uZ2lmLmd6IGlzIHVwIHRvIGRhdGUuJyBidXQgZ290ICciICsgbG9nICsgIiciLAotICAgICAgICAgICAgbG9nLmVuZHNXaXRoKCJhc2YtbG9nby5naWYuZ3ogaXMgdXAgdG8gZGF0ZS4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkV4cGVjdGluZyBtZXNzYWdlIGVuZGluZyB3aXRoICdhc2YtbG9nby5naWYuZ3ogaXMgdXAgdG8gZGF0ZS4nIGJ1dCBnb3QgJyIKKyAgICAgICAgICAgICAgICArIGxvZyArICInIiwgbG9nLCBlbmRzV2l0aCgiYXNmLWxvZ28uZ2lmLmd6IGlzIHVwIHRvIGRhdGUuIikpOwogICAgIH0KIAogICAgIEBBZnRlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbXBvcnRUZXN0LmphdmEKaW5kZXggNDBhNTJjZC4uYjg3NDAzMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0ltcG9ydFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW1wb3J0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMzQgKzE4LDM2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTG9jYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBwdWJsaWMgY2xhc3MgSW1wb3J0VGVzdCB7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbXBvcnQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiQmVmb3JlIGltcG9ydEluIGltcG9ydGVkIHRvcEFmdGVyIGltcG9ydCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiQmVmb3JlIGltcG9ydEluIGltcG9ydGVkIHRvcEFmdGVyIGltcG9ydCIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNTMsMTYgKzU1LDE1IEBACiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvdW5uYW1lZEltcG9ydC54bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFByb2plY3QuTVNHX1dBUk4pOwogICAgICAgICBTdHJpbmcgbG9nID0gYnVpbGRSdWxlLmdldExvZygpOwotICAgICAgICBhc3NlcnRUcnVlKCJXYXJuaW5ncyBsb2dnZWQgd2hlbiBub3QgZXhwZWN0ZWQ6ICIgKyBsb2csCi0gICAgICAgICAgICAgICAgICAgIGxvZy5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXYXJuaW5ncyBsb2dnZWQgd2hlbiBub3QgZXhwZWN0ZWQ6ICIgKyBsb2csIDAsIGxvZy5sZW5ndGgoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N1YmRpci9zZXJpYWwueG1sIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJVbm5hbWVkMi54bWxVbm5hbWVkMS54bWwiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwotICAgICAgICBhc3NlcnRDb250YWlucygiRXhwZWN0ZWQgc3RyaW5nIHdhcyBub3QgZm91bmQgaW4gbG9nIiwKLSAgICAgICAgICAgICAgICAiU2tpcHBlZCBhbHJlYWR5IGltcG9ydGVkIGZpbGUiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJVbm5hbWVkMi54bWxVbm5hbWVkMS54bWwiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkV4cGVjdGVkIHN0cmluZyB3YXMgbm90IGZvdW5kIGluIGxvZyIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIlNraXBwZWQgYWxyZWFkeSBpbXBvcnRlZCBmaWxlIikpOwogICAgIH0KIAogICAgIC8vIGFsbG93IHRoaXMgYXMgaW1wb3J0ZWQgaW4gdGFyZ2V0cyBhcmUgb25seSB0ZXN0ZWQgd2hlbiBhIHRhcmdldCBpcyBydW4KQEAgLTg1LDE1ICs4NiwxMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0SW5UYXJnZXROb3RBbGxvd2VkKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgKLSAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LnhtbCIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRvLWltcG9ydCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGFzIGltcG9ydCBvbmx5IGFsbG93ZWQgaW4gdG9wIGxldmVsIHRhc2siKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJub3QgYSB0b3AgbGV2ZWwgdGFzayIsICJpbXBvcnQgb25seSBhbGxvd2VkIGFzIGEgdG9wLWxldmVsIHRhc2siLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiaW1wb3J0IG9ubHkgYWxsb3dlZCBhcyBhIHRvcC1sZXZlbCB0YXNrIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ViZGlyL2ltcG9ydGludGFyZ2V0LnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZG8taW1wb3J0Iik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwNywzMSArMTAzLDE4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTYW1lVGFyZ2V0cygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KAotICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc2FtZV90YXJnZXQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBidWlsZCBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJNZXNzYWdlIGRpZCBub3QgY29udGFpbiBleHBlY3RlZCBjb250ZW50cyIsICJEdXBsaWNhdGUgdGFyZ2V0IiwKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkR1cGxpY2F0ZSB0YXJnZXQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zYW1lX3RhcmdldC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBvcnRFcnJvcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KAotICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0X2JhZF9pbXBvcnQueG1sIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvY2F0aW9uIGxvID0gZXguZ2V0TG9jYXRpb24oKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoCi0gICAgICAgICAgICAgICAgImV4cGVjdGVkIGxvY2F0aW9uIG9mIGJ1aWxkIGV4Y2VwdGlvbiB0byBiZSBzZXQiLCBsbyk7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygKLSAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbG9jYXRpb24gdG8gY29udGFpbiBjYWxsaW5nIGZpbGUiLCAiaW1wb3J0X2JhZF9pbXBvcnQueG1sIiwgbG8uZ2V0RmlsZU5hbWUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygKLSAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbWVzc2FnZSBvZiBleCB0byBjb250YWluIGNhbGxlZCBmaWxlIiwgImJhZC54bWwiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiYmFkLnhtbCIpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJsb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgaGFzUHJvcGVydHkoImZpbGVOYW1lIiwgY29udGFpbnNTdHJpbmcoImltcG9ydF9iYWRfaW1wb3J0LnhtbCIpKSkpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L2ltcG9ydF9iYWRfaW1wb3J0LnhtbCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDAsMjMgKzEyMywxNyBAQAogICAgICAgICBpZiAoIW5ldyBGaWxlKGxuKS5leGlzdHMoKSkgewogICAgICAgICAgICAgbG4gPSAiL2Jpbi9sbiI7CiAgICAgICAgIH0KLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkN1cnJlbnQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBuZXcgRmlsZShsbikuZXhpc3RzKCkpOwotICAgICAgICBTdHJpbmcgc3ltbGluayA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvc3ltbGlua3MvZDNiIjsKLSAgICAgICAgRmlsZSBzeW1saW5rRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCBzeW1saW5rKTsKLSAgICAgICAgaWYgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHtsbiwgIi1zIiwgImQzYSIsIHN5bWxpbmtGaWxlLmdldEFic29sdXRlUGF0aCgpfSkud2FpdEZvcigpICE9IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiJyIgKyBsbiArICIgLXMgZDNhICIgKyBzeW1saW5rICsgIicgZmFpbGVkIik7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ3VycmVudCBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBTeW1saW5rcyIsIG5ldyBGaWxlKGxuKS5leGlzdHMoKSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0LnhtbCIpOworICAgICAgICBGaWxlIHN5bWxpbmtGaWxlID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgic3ltbGlua3MvZDNiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiJyIgKyBsbiArICIgLXMgZDNhICIgKyBzeW1saW5rRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICInIGZhaWxlZCIsCisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10ge2xuLCAiLXMiLCAiZDNhIiwgc3ltbGlua0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCl9KS53YWl0Rm9yKCksIDApOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoCi0gICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2ltcG9ydC9zeW1saW5rcy9kMS9wMS54bWwiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZS5wMiIpLAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QyL3AyLnhtbCIpCi0gICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuZmlsZS5wMyIpLAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QzYi9wMy54bWwiKQotICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvaW1wb3J0L3N5bWxpbmtzL2QxL3AxLnhtbCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5maWxlLnAyIiksCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiLi4vZDIvcDIueG1sIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5maWxlLnAzIiksCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoIi4uL2QzYi9wMy54bWwiKS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBzeW1saW5rRmlsZS5kZWxldGUoKTsKICAgICAgICAgfQpAQCAtMTY1LDcgKzE0Miw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Rmlyc3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9pbXBvcnQvaW1wb3J0dGFyZ2V0Zmlyc3QueG1sIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJJbXBvcnRpbmcgdGFyZ2V0Zmlyc3RBZnRlciB0YXJnZXQgZmlyc3RBZnRlciBpbXBvcnRpbmciLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiSW1wb3J0aW5nIHRhcmdldGZpcnN0QWZ0ZXIgdGFyZ2V0IGZpcnN0QWZ0ZXIgaW1wb3J0aW5nIikpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5pdGlhbGl6ZUNsYXNzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0luaXRpYWxpemVDbGFzc1Rlc3QuamF2YQppbmRleCBhNDQzMDNmLi43NWU4ZTgxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5pdGlhbGl6ZUNsYXNzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Jbml0aWFsaXplQ2xhc3NUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIAogLyoqCiAgKiBUZXN0IHRvIHNlZSBpZiBzdGF0aWMgaW5pdGlhbGl6ZXJzIGFyZSBpbnZva2VkIHRoZSBzYW1lIHdheQpAQCAtNDIsMTMgKzQzLDE1IEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCi0gICAgcHJpdmF0ZSBGaWxlIGYxID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9mb3JrZWRvdXQiKTsKLSAgICBwcml2YXRlIEZpbGUgZjIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuZm9ya2Vkb3V0Iik7Ci0KKyAgICBwcml2YXRlIEZpbGUgZjE7CisgICAgcHJpdmF0ZSBGaWxlIGYyOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKCJidWlsZC50ZXN0cy52YWx1ZSBub3Qgc2V0IiwgU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC50ZXN0cy52YWx1ZSIpKTsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2luaXRpYWxpemVjbGFzcy54bWwiKTsKKyAgICAgICAgZjEgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJmb3JrZWRvdXQiKTsKKyAgICAgICAgZjIgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ1bmZvcmtlZG91dCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC01NiwxNSArNTksMTIgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZvcmtlZCIpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKICAgICAgICAgICAgIFByaW50U3RyZWFtIHBzID0gU3lzdGVtLm91dDsKLSAgICAgICAgICAgIFByaW50U3RyZWFtIG5ld3BzID0gbmV3IFByaW50U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYyKSk7Ci0gICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChuZXdwcyk7Ci0gICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgidW5mb3JrZWQiKTsKLSAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHBzKTsKLQotICAgICAgICAgICAgICAgICBuZXdwcy5jbG9zZSgpOwotICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSAoUHJpbnRTdHJlYW0gbmV3cHMgPSBuZXcgUHJpbnRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZjIpKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQobmV3cHMpOworICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgidW5mb3JrZWQiKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLnNldE91dChwcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKGYxKSwgRmlsZVV0aWxpdGllcy5nZXRGaWxlQ29udGVudHMoZjIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5wdXRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSW5wdXRUZXN0LmphdmEKaW5kZXggNGI2ZWZhYS4uMzgzZWFmMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0lucHV0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9JbnB1dFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI5LDI2ICsyOSwyNSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KIAogcHVibGljIGNsYXNzIElucHV0VGVzdCB7CiAKICAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKICAgICBwcml2YXRlIElucHV0U3RyZWFtIG9yaWdpbmFsU3RkSW47CiAKLQogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2lucHV0LnhtbCIpOwotICAgICAgICBTeXN0ZW0uZ2V0UHJvcGVydGllcygpCi0gICAgICAgICAgICAucHV0KFByb3BlcnR5RmlsZUlucHV0SGFuZGxlci5GSUxFX05BTUVfS0VZLAotICAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJpbnB1dC5wcm9wZXJ0aWVzIikKLSAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5wdXQoUHJvcGVydHlGaWxlSW5wdXRIYW5kbGVyLkZJTEVfTkFNRV9LRVksCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiaW5wdXQucHJvcGVydGllcyIpLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRJbnB1dEhhbmRsZXIobmV3IFByb3BlcnR5RmlsZUlucHV0SGFuZGxlcigpKTsKICAgICAgICAgb3JpZ2luYWxTdGRJbiA9IFN5c3RlbS5pbjsKICAgICB9CkBAIC03MCwxMyArNjksOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IGludmFsaWQgaW5wdXQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZvdW5kIGludmFsaWQgaW5wdXQgdGVzdCBmb3IgJ0FsbCBkYXRhIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSBEQiBjb250aW51ZT8nIiwKLSAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJGb3VuZCBpbnZhbGlkIGlucHV0IHRlc3QgZm9yICdBbGwgZGF0YSBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gREIgY29udGludWU/JyIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXJUZXN0LmphdmEKaW5kZXggNDAyOTc5Yy4uZDRlOWNkNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmFyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjQsOCArMjQsNyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKQEAgLTMzLDE3ICszMiwxOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRmlsZVV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmVhbVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiAvKioKICAqLwpAQCAtNTIsMTEgKzUzLDExIEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBKYXIgPSAidG1wLmphciI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlbXBEaXIgPSAiamFydG1wLyI7Ci0gICAgcHJpdmF0ZSBSZWFkZXIgcjE7Ci0gICAgcHJpdmF0ZSBSZWFkZXIgcjI7Ci0KIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKQEAgLTY0LDUwICs2NSwzMSBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKICAgICB9CiAKLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgaWYgKHIxICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcjEuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocjIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByMi5jbG9zZSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIG5vbmV4aXN0ZW50IG1hbmlmZXN0IGZpbGUKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogbWFuaWZlc3QgZmlsZSBkb2VzIG5vdCBleGlzdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gdW5yZWNvZ25pemVkIHdoZW5lbXB0eSBhdHRyaWJ1dGU6IGZvcm1hdCBDOiAveQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBVbnJlY29nbml6ZWQgd2hlbmVtcHR5IGF0dHJpYnV0ZTogZm9ybWF0IEM6IC95Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgcHJpdmF0ZSBGaWxlIGdldE91dHB1dERpcigpIHsKQEAgLTExOCw3ICsxMDAsNiBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKICAgICAgICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksIHRlbXBKYXIpOwotCiAgICAgICAgIGFzc2VydFRydWUoamFyRmlsZS5leGlzdHMoKSk7CiAgICAgfQogCkBAIC0xMzcsNyArMTE4LDcgQEAKICAgICAgICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksIHRlbXBKYXIpOwogCiAgICAgICAgIC8vIG1vdmUgdGhlIG1vZGlmaWVkIGRhdGUgYmFjayBhIGNvdXBsZSBvZiBzZWNvbmRzIHJhdGhlciB0aGFuIGRlbGF5IHRoZSB0ZXN0IG9uIGVhY2ggcnVuCi0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGphckZpbGUuc2V0TGFzdE1vZGlmaWVkKGphckZpbGUubGFzdE1vZGlmaWVkKCkKKyAgICAgICAgYXNzdW1lVHJ1ZShqYXJGaWxlLnNldExhc3RNb2RpZmllZChqYXJGaWxlLmxhc3RNb2RpZmllZCgpCiAgICAgICAgICAgICAgICAgLSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkgKiAzKSk7CiAgICAgICAgIGxvbmcgamFyTW9kaWZpZWREYXRlID0gamFyRmlsZS5sYXN0TW9kaWZpZWQoKTsKIApAQCAtMTU4LDE0ICsxMzksMTIgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlV2l0aG91dFVwZGF0ZU5ld2VyRmlsZSgpIHsKLSAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIsCi0gICAgICAgICAgICAgICAgICAgICAidGVzdFJlY3JlYXRlV2l0aG91dFVwZGF0ZU5ld2VyRmlsZSIpOworICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3RSZWNyZWF0ZU5ld2VyRmlsZVNldHVwIiwgInRlc3RSZWNyZWF0ZVdpdGhvdXRVcGRhdGVOZXdlckZpbGUiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNyZWF0ZVdpdGhVcGRhdGVOZXdlckZpbGUoKSB7Ci0gICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdFJlY3JlYXRlTmV3ZXJGaWxlU2V0dXAiLAotICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVdpdGhVcGRhdGVOZXdlckZpbGUiKTsKKyAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIsICJ0ZXN0UmVjcmVhdGVXaXRoVXBkYXRlTmV3ZXJGaWxlIik7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWNyZWF0ZShTdHJpbmcgZmlyc3RUYXJnZXQsIFN0cmluZyBzZWNvbmRUYXJnZXQpIHsKQEAgLTE4MSwyMiArMTYwLDI0IEBACiAgICAgICAgIGxvbmcgamFyTW9kaWZpZWREYXRlID0gamFyRmlsZS5sYXN0TW9kaWZpZWQoKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoc2Vjb25kVGFyZ2V0KTsKICAgICAgICAgamFyRmlsZSA9IG5ldyBGaWxlKGdldE91dHB1dERpcigpLCB0ZW1wSmFyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiamFyIGhhcyBiZWVuIHJlY3JlYXRlZCBpbiAiICsgc2Vjb25kVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgIGphck1vZGlmaWVkRGF0ZSA8IGphckZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJqYXIgaGFzIGJlZW4gcmVjcmVhdGVkIGluICIgKyBzZWNvbmRUYXJnZXQsIGphck1vZGlmaWVkRGF0ZSA8IGphckZpbGUubGFzdE1vZGlmaWVkKCkpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0U3RheXNJbnRhY3QoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIE1hbmlmZXN0RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuaWZlc3RTdGF5c0ludGFjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgTWFuaWZlc3RFeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1hbmlmZXN0U3RheXNJbnRhY3QiKTsKIAotICAgICAgICByMSA9IG5ldyBGaWxlUmVhZGVyKG5ldyBGaWxlKGdldE91dHB1dERpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBEaXIgKyAibWFuaWZlc3QiKSk7Ci0gICAgICAgIHIyID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksCi0gICAgICAgICAgICAgICAgdGVtcERpciArICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpKTsKKyAgICAgICAgTWFuaWZlc3QgbWYxOworICAgICAgICB0cnkgKEZpbGVSZWFkZXIgcjEgPSBuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShnZXRPdXRwdXREaXIoKSwgdGVtcERpciArICJtYW5pZmVzdCIpKSkgeworICAgICAgICAgICAgbWYxID0gbmV3IE1hbmlmZXN0KHIxKTsKKyAgICAgICAgfQogCi0gICAgICAgIE1hbmlmZXN0IG1mMSA9IG5ldyBNYW5pZmVzdChyMSk7Ci0gICAgICAgIE1hbmlmZXN0IG1mMiA9IG5ldyBNYW5pZmVzdChyMik7CisgICAgICAgIE1hbmlmZXN0IG1mMjsKKyAgICAgICAgdHJ5IChGaWxlUmVhZGVyIHIyID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksIHRlbXBEaXIKKyAgICAgICAgICAgICAgICArICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpKSkgeworICAgICAgICAgICAgbWYyID0gbmV3IE1hbmlmZXN0KHIyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGFzc2VydEVxdWFscyhtZjEsIG1mMik7CiAgICAgfQogCkBAIC0yMjIsMjYgKzIwMywyMiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aG91dFVwZGF0ZUFkZGl0aW9uYWxGaWxlcygpIHsKLSAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0NCIsCi0gICAgICAgICAgICAgICAgICAgICAidGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhvdXRVcGRhdGVBZGRpdGlvbmFsRmlsZXMiKTsKKyAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0NCIsICJ0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aG91dFVwZGF0ZUFkZGl0aW9uYWxGaWxlcyIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVBZGRpdGlvbmFsRmlsZXMoKSB7Ci0gICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdDQiLAotICAgICAgICAgICAgICAgICAgICAgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRoVXBkYXRlQWRkaXRpb25hbEZpbGVzIik7CisgICAgICAgIHRlc3RSZWNyZWF0ZSgidGVzdDQiLCAidGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVBZGRpdGlvbmFsRmlsZXMiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRob3V0VXBkYXRlTmV3ZXJGaWxlKCkgewotICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3RSZWNyZWF0ZU5ld2VyRmlsZVNldHVwIiwKLSAgICAgICAgICAgICAgICAgICAgICJ0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aG91dFVwZGF0ZU5ld2VyRmlsZSIpOworICAgICAgICB0ZXN0UmVjcmVhdGUoInRlc3RSZWNyZWF0ZU5ld2VyRmlsZVNldHVwIiwgInRlc3RSZWNyZWF0ZVppcGZpbGVzZXRXaXRob3V0VXBkYXRlTmV3ZXJGaWxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aFVwZGF0ZU5ld2VyRmlsZSgpIHsKLSAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIsCi0gICAgICAgICAgICAgICAgICAgICAidGVzdFJlY3JlYXRlWmlwZmlsZXNldFdpdGhVcGRhdGVOZXdlckZpbGUiKTsKKyAgICAgICAgdGVzdFJlY3JlYXRlKCJ0ZXN0UmVjcmVhdGVOZXdlckZpbGVTZXR1cCIsICJ0ZXN0UmVjcmVhdGVaaXBmaWxlc2V0V2l0aFVwZGF0ZU5ld2VyRmlsZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNjEsNjcgKzIzOCw1MCBAQAogICAgIC8vIGJ1Z3ppbGxhIHJlcG9ydCAxMDI2MgogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vRHVwbGljYXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBaaXBGaWxlIGFyY2hpdmUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJbmRleFRlc3RzIik7Ci0gICAgICAgICAgICBhcmNoaXZlID0gbmV3IFppcEZpbGUobmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksIHRlbXBKYXIpKTsKLSAgICAgICAgICAgIEVudW1lcmF0aW9uIGUgPSBhcmNoaXZlLmVudHJpZXMoKTsKLSAgICAgICAgICAgIGludCBudW1iZXJPZkluZGV4TGlzdHMgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIGlmICh6ZS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORi9JTkRFWC5MSVNUIikpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtYmVyT2ZJbmRleExpc3RzKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG51bWJlck9mSW5kZXhMaXN0cyk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoYXJjaGl2ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZS5jbG9zZSgpOwotICAgICAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKKyAgICAgICAgdHJ5IChaaXBGaWxlIGFyY2hpdmUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShnZXRPdXRwdXREaXIoKSwgdGVtcEphcikpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU3RyZWFtVXRpbHMuZW51bWVyYXRpb25Bc1N0cmVhbShhcmNoaXZlLmVudHJpZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih6ZSAtPiB6ZS5nZXROYW1lKCkuZXF1YWxzKCJNRVRBLUlORi9JTkRFWC5MSVNUIikpLmNvdW50KCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gYnVnemlsbGEgcmVwb3J0IDE2OTcyCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdEZpbGVzSW5JbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFppcEZpbGUgYXJjaGl2ZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKLSAgICAgICAgICAgIGFyY2hpdmUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShnZXRPdXRwdXREaXIoKSwgdGVtcEphcikpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKKyAgICAgICAgdHJ5IChaaXBGaWxlIGFyY2hpdmUgPSBuZXcgWmlwRmlsZShuZXcgRmlsZShnZXRPdXRwdXREaXIoKSwgdGVtcEphcikpKSB7CiAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IGFyY2hpdmUuZ2V0RW50cnkoIk1FVEEtSU5GL0lOREVYLkxJU1QiKTsKICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gYXJjaGl2ZS5nZXRJbnB1dFN0cmVhbSh6ZSk7Ci0gICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEY4IikpOworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaXMsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRTdWIgPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRTdWJGb28gPSBmYWxzZTsKICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRGb28gPSBmYWxzZTsKIAogICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICB3aGlsZSAobGluZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuZXF1YWxzKCJmb28iKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZEZvbyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLmVxdWFscygic3ViIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91bmRTdWIgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZS5lcXVhbHMoInN1Yi9mb28iKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZFN1YkZvbyA9IHRydWU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChsaW5lKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgImZvbyI6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEZvbyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAic3ViIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3ViID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJzdWIvZm9vIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3ViRm9vID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBsaW5lID0gci5yZWFkTGluZSgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvdW5kU3ViKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIWZvdW5kU3ViRm9vKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZvdW5kU3ViRm9vKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoZm91bmRGb28pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGFyY2hpdmUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyY2hpdmUuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5pZmVzdE9ubHlKYXIoKSB7Ci0KICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNYW5pZmVzdE9ubHlKYXIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkJ1aWxkaW5nIE1BTklGRVNULW9ubHkgamFyOiAiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkJ1aWxkaW5nIE1BTklGRVNULW9ubHkgamFyOiAiKSk7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUoZ2V0T3V0cHV0RGlyKCksIHRlbXBEaXIgKyAiTUVUQS1JTkYiICsgRmlsZS5zZXBhcmF0b3IgKyAiTUFOSUZFU1QuTUYiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShtYW5pZmVzdEZpbGUuZXhpc3RzKCkpOwogICAgIH0KQEAgLTMzMyw0NCArMjkzLDQxIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZlcnNpb25JbmZvRmFpbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9WZXJzaW9uSW5mb0ZhaWwiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBNYW5pZmVzdCBJbXBsZW1lbnRhdGlvbiBpbmZvcm1hdGlvbiBtaXNzaW5nLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk5vIEltcGxlbWVudGF0aW9uLVRpdGxlIHNldC4iLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vVmVyc2lvbkluZm9GYWlsIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WZXJzaW9uSW5mb0lnbm9yZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb1ZlcnNpb25JbmZvSWdub3JlIik7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucygiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIHNldC4iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucygiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVRpdGxlIHNldC4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBjb250YWluc1N0cmluZygiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WZXJzaW9uSW5mb1dhcm4oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9WZXJzaW9uSW5mb1dhcm4iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIk5vIEltcGxlbWVudGF0aW9uLVRpdGxlIHNldC4iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIHNldC4iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1WZW5kb3Igc2V0LiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJObyBJbXBsZW1lbnRhdGlvbi1UaXRsZSBzZXQuIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJObyBJbXBsZW1lbnRhdGlvbi1WZW5kb3Igc2V0LiIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZlcnNpb25JbmZvTm9TdHJpY3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9WZXJzaW9uSW5mb05vU3RyaWN0Iik7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIHNldC4iKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiTm8gSW1wbGVtZW50YXRpb24tVmVuZG9yIHNldC4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVRpdGxlIHNldC4iKSkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJObyBJbXBsZW1lbnRhdGlvbi1WZXJzaW9uIHNldC4iKSkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJObyBJbXBsZW1lbnRhdGlvbi1WZW5kb3Igc2V0LiIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzVmVyc2lvbkluZm8oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SGFzVmVyc2lvbkluZm8iKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1UaXRsZSBzZXQuIikpOwotICAgICAgICBhc3NlcnRGYWxzZShidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJObyBJbXBsZW1lbnRhdGlvbi1WZW5kb3Igc2V0LiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIG5vdChjb250YWluc1N0cmluZygiTm8gSW1wbGVtZW50YXRpb24tVGl0bGUgc2V0LiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVZlcnNpb24gc2V0LiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIk5vIEltcGxlbWVudGF0aW9uLVZlbmRvciBzZXQuIikpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFUZXN0LmphdmEKaW5kZXggNTU3OWY4NS4uOWZhMDkxMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMiwxOSArMzIsMjMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LkRlZmF1bHRJbnB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLkphdmFWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuVGVlT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogLyoqCiAgKiBzdHJlc3Mgb3V0IGphdmEgdGFzawpAQCAtNTQsNiArNTgsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSU1FX1RPX1dBSVQgPSAxOwogICAgIC8vIHdhaXQgMSBzZWNvbmQgZXh0cmEgdG8gYWxsb3cgZm9yIGphdmEgdG8gc3RhcnQgLi4uCiAgICAgLy8gdGhpcyB0aW1lIHdhcyBPSyBvbiBhIFdpbiBOVCBtYWNoaW5lIGFuZCBvbiBuYWdveWEKQEAgLTYyLDcgKzY5LDcgQEAKICAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwogCi0gICAgcHJpdmF0ZSBib29sZWFuIHJ1bkZhdGFsVGVzdHM9ZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIHJ1bkZhdGFsVGVzdHMgPSBmYWxzZTsKIAogCiAgICAgLyoqCkBAIC04Niw2MiArOTMsNDQgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vSmFyTm9DbGFzc25hbWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vSmFyTm9DbGFzc25hbWUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIHBhcmFtZXRlciB2YWxpZGF0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiQ2xhc3NuYW1lIG11c3Qgbm90IGJlIG51bGwuIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNsYXNzbmFtZSBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vSmFyTm9DbGFzc25hbWUiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJOb0ZvcmsoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEphck5vRm9yayIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIC0gcGFyYW1ldGVyIHZhbGlkYXRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJDYW5ub3QgZXhlY3V0ZSBhIGphciBpbiBub24tZm9ya2VkIG1vZGUuIFBsZWFzZSBzZXQgZm9yaz0ndHJ1ZScuICIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgZXhlY3V0ZSBhIGphciBpbiBub24tZm9ya2VkIG1vZGUuIFBsZWFzZSBzZXQgZm9yaz0ndHJ1ZScuICIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEphck5vRm9yayIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEphckFuZENsYXNzTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SmFyQW5kQ2xhc3NOYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBib3RoIGNsYXNzbmFtZSBhbmQgSkFSIGFyZSBub3QgYWxsb3dlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3QgdXNlICdqYXInIGFuZCAnY2xhc3NuYW1lJyBhdHRyaWJ1dGVzIGluIHNhbWUgY29tbWFuZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgdXNlIGNvbWJpbmF0aW9uIG9mICIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEphckFuZENsYXNzTmFtZSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsYXNzbmFtZUFuZEphcigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q2xhc3NuYW1lQW5kSmFyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBib3RoIGNsYXNzbmFtZSBhbmQgSkFSIGFyZSBub3QgYWxsb3dlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3QgdXNlICdqYXInIHdpdGggJ2NsYXNzbmFtZScgb3IgJ21vZHVsZScgYXR0cmlidXRlcyBpbiBzYW1lIGNvbW1hbmQuIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCB1c2UgY29tYmluYXRpb24gb2YgIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q2xhc3NuYW1lQW5kSmFyIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SmFyQW5kTW9kdWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RKYXJBbmRNb2R1bGUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIGJvdGggbW9kdWxlIGFuZCBKQVIgYXJlIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCB1c2UgJ2phcicgYW5kICdtb2R1bGUnIGF0dHJpYnV0ZXMgaW4gc2FtZSBjb21tYW5kIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCB1c2UgY29tYmluYXRpb24gb2YgIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SmFyQW5kTW9kdWxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlQW5kSmFyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNb2R1bGVBbmRKYXIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIGJvdGggbW9kdWxlIGFuZCBKQVIgYXJlIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCB1c2UgJ2phcicgd2l0aCAnY2xhc3NuYW1lJyBvciAnbW9kdWxlJyBhdHRyaWJ1dGVzIGluIHNhbWUgY29tbWFuZC4iLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQ2Fubm90IHVzZSBjb21iaW5hdGlvbiBvZiAiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNb2R1bGVBbmRKYXIiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTY5LDcgKzE1OCw3IEBACiAgICAgICAgIGphdmEuc2V0SnZtYXJncygiLVhteDEyOE0iKTsKICAgICAgICAgamF2YS5zZXRBcmdzKGFyZyk7CiAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNtZExpbmUgPSBqYXZhLmdldENvbW1hbmRMaW5lKCkuZ2V0Q29tbWFuZGxpbmUoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkhhcyBjb21tYW5kIGxpbmUuIiwgY21kTGluZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkhhcyBjb21tYW5kIGxpbmUuIiwgY21kTGluZSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29tbWFuZCBsaW5lIHNob3VsZCBoYXZlIDUgZWxlbWVudHMiLCA1LCBjbWRMaW5lLmxlbmd0aCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiTGFzdCBjb21tYW5kIGxpbmUgZWxlbWVudCBzaG91bGQgYmUgamF2YSBhcmd1bWVudDogIiArIGFyZywKICAgICAgICAgICAgICAgICBhcmcsCkBAIC0xOTUsNyArMTg0LDcgQEAKICAgICAgICAgamF2YS5zZXRKdm1hcmdzKCItWG14MTI4TSIpOyAgICAvL05PSTE4TgogICAgICAgICBqYXZhLnNldEFyZ3MoYXJnKTsKICAgICAgICAgZmluYWwgU3RyaW5nW10gY21kTGluZSA9IGphdmEuZ2V0Q29tbWFuZExpbmUoKS5nZXRDb21tYW5kbGluZSgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiSGFzIGNvbW1hbmQgbGluZS4iLCBjbWRMaW5lKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzIGNvbW1hbmQgbGluZS4iLCBjbWRMaW5lKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21tYW5kIGxpbmUgc2hvdWxkIGhhdmUgNSBlbGVtZW50cyIsIDUsIGNtZExpbmUubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJMYXN0IGNvbW1hbmQgbGluZSBlbGVtZW50IHNob3VsZCBiZSBqYXZhIGFyZ3VtZW50OiAiICsgYXJnLAogICAgICAgICAgICAgICAgIGFyZywKQEAgLTIxMyw2OCArMjAyLDU0IEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuIik7CiAgICAgfQogCi0KLQogICAgIC8qKiB0aGlzIHRlc3QgZmFpbHMgYnV0IHdlIGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlOwogICAgICAqICB3ZSB2ZXJpZnkgdGhhdCBmYWlsdXJlIG9ubHkgbWF0dGVycyB3aGVuIGZhaWxvbmVycm9yIGlzIHNldAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkZhaWwoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJGYXRhbCB0ZXN0cyBoYXZlIG5vdCBiZWVuIHNldCB0byBydW4iLCBydW5GYXRhbFRlc3RzKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiRmF0YWwgdGVzdHMgaGF2ZSBub3QgYmVlbiBzZXQgdG8gcnVuIiwgcnVuRmF0YWxUZXN0cyk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuRmFpbCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJ1bkZhaWxGb2UoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJGYXRhbCB0ZXN0cyBoYXZlIG5vdCBiZWVuIHNldCB0byBydW4iLCBydW5GYXRhbFRlc3RzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuRmFpbEZvZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIC0gIiArICJqYXZhIGZhaWx1cmVzIGJlaW5nIHByb3BhZ2F0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJKYXZhIHJldHVybmVkOiIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzdW1lVHJ1ZSgiRmF0YWwgdGVzdHMgaGF2ZSBub3QgYmVlbiBzZXQgdG8gcnVuIiwgcnVuRmF0YWxUZXN0cyk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSmF2YSByZXR1cm5lZDoiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSdW5GYWlsRm9lIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuRmFpbEZvZUZvcmsoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJ1bkZhaWxGb2VGb3JrIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSAiICsgImphdmEgZmFpbHVyZXMgYmVpbmcgcHJvcGFnYXRlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkphdmEgcmV0dXJuZWQ6IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkphdmEgcmV0dXJuZWQ6Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UnVuRmFpbEZvZUZvcmsiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpbmcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RXhjZXB0aW5nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJFeGNlcHRpb24gcmFpc2VkIGluc2lkZSBjYWxsZWQgcHJvZ3JhbSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiRXhjZXB0aW9uIHJhaXNlZCBpbnNpZGUgY2FsbGVkIHByb2dyYW0iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW5nRm9yaygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFeGNlcHRpbmdGb3JrIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJKYXZhIFJlc3VsdDoiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkphdmEgUmVzdWx0OiIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpbmdGb2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV4Y2VwdGluZ0ZvZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIC0gIiArICJwYXNzZXMgZXhjZXB0aW9uIHRocm91Z2giKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJFeGNlcHRpb24gcmFpc2VkIGluc2lkZSBjYWxsZWQgcHJvZ3JhbSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJFeGNlcHRpb24gcmFpc2VkIGluc2lkZSBjYWxsZWQgcHJvZ3JhbSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV4Y2VwdGluZ0ZvZSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGluZ0ZvZUZvcmsoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV4Y2VwdGluZ0ZvZUZvcmsiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtICIgKyAiZXhjZXB0aW9ucyB0dXJuZWQgaW50byBlcnJvciBjb2RlcyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkphdmEgcmV0dXJuZWQ6IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkphdmEgcmV0dXJuZWQ6Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RXhjZXB0aW5nRm9lRm9yayIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zMDMsMTIgKzI3OCw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSAiICsgIm5vbiB6ZXJvIHJldHVybiBjb2RlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiSmF2YSByZXR1cm5lZDoiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSmF2YSByZXR1cm5lZDoiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSdW5GYWlsV2l0aEZhaWxPbkVycm9yIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTMyMSwxNCArMjkzLDEzIEBACiAgICAgICAgIEZpbGUgbG9nRmlsZSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInNwYXduIiwgImxvZyIsCiAgICAgICAgICAgICAgICAgbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikpLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICAvLyB0aGlzIGlzIGd1YXJhbnRlZWQgYnkgRmlsZVV0aWxzI2NyZWF0ZVRlbXBGaWxlCi0gICAgICAgIGFzc2VydFRydWUoImxvZyBmaWxlIG5vdCBleGlzdGluZyIsICFsb2dGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoImxvZyBmaWxlIG5vdCBleGlzdGluZyIsIGxvZ0ZpbGUuZXhpc3RzKCkpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJsb2dGaWxlIiwgbG9nRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInRpbWVUb1dhaXQiLCBMb25nLnRvU3RyaW5nKFRJTUVfVE9fV0FJVCkpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInRlc3RTcGF3biIpOwogCiAgICAgICAgIFRocmVhZC5zbGVlcChUSU1FX1RPX1dBSVQgKiAxMDAwICsgU0VDVVJJVFlfTUFSR0lOKTsKIAotCiAgICAgICAgIC8vIGxldCdzIGJlIG5pY2Ugd2l0aCB0aGUgbmV4dCBnZW5lcmF0aW9uIG9mIGRldmVsb3BlcnMKICAgICAgICAgaWYgKCFsb2dGaWxlLmV4aXN0cygpKSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInN1Z2dlc3Rpb246IGluY3JlYXNlIHRoZSBjb25zdGFudCIKQEAgLTM4MiwxMyArMzUzLDExIEBACiAgICAgICAgIC8vIHJlYWRlciB3aWxsIGJlIHJlYWQKICAgICAgICAgamF2YS5leGVjdXRlKCk7CiAKLSAgICAgICAgVGhyZWFkIGlucHV0VGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXQgaW5wdXQgPSBuZXcgSW5wdXQoKTsKLSAgICAgICAgICAgICAgICBpbnB1dC5zZXRQcm9qZWN0KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgICAgIGlucHV0LnNldEFkZHByb3BlcnR5KCJpbnB1dC52YWx1ZSIpOwotICAgICAgICAgICAgICAgIGlucHV0LmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIGlucHV0VGhyZWFkID0gbmV3IFRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICBJbnB1dCBpbnB1dCA9IG5ldyBJbnB1dCgpOworICAgICAgICAgICAgaW5wdXQuc2V0UHJvamVjdChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIGlucHV0LnNldEFkZHByb3BlcnR5KCJpbnB1dC52YWx1ZSIpOworICAgICAgICAgICAgaW5wdXQuZXhlY3V0ZSgpOwogICAgICAgICB9KTsKICAgICAgICAgaW5wdXRUaHJlYWQuc3RhcnQoKTsKIApAQCAtNDI0LDE5ICszOTMsMTcgQEAKICAgICAgICAgZmluYWwgYm9vbGVhbltdIHRpbWVvdXQgPSBuZXcgYm9vbGVhblsxXTsKICAgICAgICAgdGltZW91dFswXSA9IGZhbHNlOwogCi0gICAgICAgIFRocmVhZCB3cml0aW5nVGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBhIGxpdHRsZSBiaXQgdG8gaGF2ZSB0aGUgdGFyZ2V0IGV4ZWN1dGVkCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbigiVGhyZWFkIGludGVycnVwdGVkIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiZm9vLUZsdXNoZWRJbnB1dFxuIi5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgVGhyZWFkIHdyaXRpbmdUaHJlYWQgPSBuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCBhIGxpdHRsZSBiaXQgdG8gaGF2ZSB0aGUgdGFyZ2V0IGV4ZWN1dGVkCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbigiVGhyZWFkIGludGVycnVwdGVkIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZSgiZm9vLUZsdXNoZWRJbnB1dFxuIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAgICAgICAgIHdyaXRpbmdUaHJlYWQuc2V0RGFlbW9uKHRydWUpOwpAQCAtNDQ2LDYgKzQxMyw3OCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgSmF2YSBzaW5nbGUgZmlsZSBzb3VyY2UgcHJvZ3JhbSBmZWF0dXJlIGludHJvZHVjZWQgaW4gSmF2YSAxMSB3b3JrcyBmaW5lCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNvdXJjZUZpbGUoKSB7CisgICAgICAgIHJlcXVpcmVKYXZhMTEoKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNpbXBsZVNvdXJjZUZpbGUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgdGhlIHNvdXJjZWZpbGUgb3B0aW9uIG9mIHRoZSBKYXZhIHRhc2sgY2FuIG9ubHkgYmUgcnVuIHdoZW4gZm9yayBhdHRyaWJ1dGUgaXMgc2V0CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvdXJjZUZpbGVSZXF1aXJlc0ZvcmsoKSB7CisgICAgICAgIHJlcXVpcmVKYXZhMTEoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgZXhlY3V0ZSBzb3VyY2VmaWxlIGluIG5vbi1mb3JrZWQgbW9kZS4gUGxlYXNlIHNldCBmb3JrPSd0cnVlJyIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic291cmNlRmlsZVJlcXVpcmVzRm9yayIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHNvdXJjZWZpbGUgYXR0cmlidXRlIGFuZCB0aGUgY2xhc3NuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgSmF2YSB0YXNrIGNhbm5vdCBiZSB1c2VkCisgICAgICogdG9nZXRoZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlRmlsZUNhbnRVc2VDbGFzc25hbWUoKSB7CisgICAgICAgIHJlcXVpcmVKYXZhMTEoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgdXNlICdzb3VyY2VmaWxlJyBpbiBjb21iaW5hdGlvbiB3aXRoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzb3VyY2VGaWxlQ2FudFVzZUNsYXNzbmFtZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHNvdXJjZWZpbGUgYXR0cmlidXRlIGFuZCB0aGUgamFyIGF0dHJpYnV0ZSBvZiB0aGUgSmF2YSB0YXNrIGNhbm5vdCBiZSB1c2VkCisgICAgICogdG9nZXRoZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlRmlsZUNhbnRVc2VKYXIoKSB7CisgICAgICAgIHJlcXVpcmVKYXZhMTEoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgdXNlICdzb3VyY2VmaWxlJyBpbiBjb21iaW5hdGlvbiB3aXRoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzb3VyY2VGaWxlQ2FudFVzZUphciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIHNvdXJjZWZpbGUgYXR0cmlidXRlIGFuZCB0aGUgbW9kdWxlIGF0dHJpYnV0ZSBvZiB0aGUgSmF2YSB0YXNrIGNhbm5vdCBiZSB1c2VkCisgICAgICogdG9nZXRoZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlRmlsZUNhbnRVc2VNb2R1bGUoKSB7CisgICAgICAgIHJlcXVpcmVKYXZhMTEoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3QgdXNlICdzb3VyY2VmaWxlJyBpbiBjb21iaW5hdGlvbiB3aXRoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzb3VyY2VGaWxlQ2FudFVzZU1vZHVsZSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVxdWlyZUphdmExMSgpIHsKKyAgICAgICAgZmluYWwgSmF2YVZlcnNpb24gamF2YVZlcnNpb24gPSBuZXcgSmF2YVZlcnNpb24oKTsKKyAgICAgICAgamF2YVZlcnNpb24uc2V0QXRMZWFzdCgiMTEiKTsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3Qgd2hpY2ggcmVxdWlyZXMgYSBtaW5pbXVtIG9mIEphdmEgMTEgcnVudGltZSIsIGphdmFWZXJzaW9uLmV2YWwoKSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogZW50cnkgcG9pbnQgY2xhc3Mgd2l0aCBubyBkZXBlbmRlbmNpZXMgb3RoZXIKICAgICAgKiB0aGFuIG5vcm1hbCBKUkUgcnVudGltZQogICAgICAqLwpAQCAtNTA2LDIyICs1NDUsMTMgQEAKICAgICAgICAgICAgIGlmIChhcmd2Lmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgICAgICAgbG9nRmlsZSA9IGFyZ3ZbMV07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0ID0gbnVsbDsKICAgICAgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcFRpbWUgKiAxMDAwKTsKIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWxlIGRlc3QgPSBuZXcgRmlsZShsb2dGaWxlKTsKLSAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3QpOwotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm9zKTsKKyAgICAgICAgICAgIEZpbGUgZGVzdCA9IG5ldyBGaWxlKGxvZ0ZpbGUpOworICAgICAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0KSkpIHsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUoImJ5ZSBieWVcbiIpOwogICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvSmF2YWNUZXN0LmphdmEKaW5kZXggODQ1MzkzZC4uMGFjYTVhMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFjVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhY1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDYgKzE5LDggQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY05hbWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLkNvbXBpbGVyQWRhcHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMuQ29tcGlsZXJBZGFwdGVyRmFjdG9yeTsKQEAgLTI4LDE0ICszMCwxNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIFRlc3RjYXNlIGZvciA8amF2YWM+LgpAQCAtNjYsMTcgKzcwLDE1IEBACiAKICAgICAgICAgamF2YWMuc2V0Rm9yayh0cnVlKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm9ybWFsIGZvcmsiLCBqYXZhYy5nZXRKYXZhY0V4ZWN1dGFibGUoKSk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJuYW1lIHNob3VsZCBjb250YWluIFwiamF2YWNcIiIsICJqYXZhYyIsCi0gICAgICAgICAgICAgICAgICAgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJuYW1lIHNob3VsZCBjb250YWluIFwiamF2YWNcIiIsIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpLCBjb250YWluc1N0cmluZygiamF2YWMiKSk7CiAKICAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiLCAiZXh0SmF2YWMiKTsKICAgICAgICAgamF2YWMuc2V0Rm9yayhmYWxzZSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoImZvcmsgdmlhIHByb3BlcnR5IiwgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkpOwotICAgICAgICBhc3NlcnRDb250YWlucygibmFtZSBzaG91bGQgY29udGFpbiBcImphdmFjXCIiLCAiamF2YWMiLCBqYXZhYy5nZXRKYXZhY0V4ZWN1dGFibGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoIm5hbWUgc2hvdWxkIGNvbnRhaW4gXCJqYXZhY1wiIiwgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCksIGNvbnRhaW5zU3RyaW5nKCJqYXZhYyIpKTsKIAogICAgICAgICBwcm9qZWN0LnNldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIsICJ3aGF0ZXZlciIpOwotICAgICAgICBhc3NlcnROdWxsKCJubyBmb3JrIGFuZCBub3QgZXh0SmF2YWMgbWVhbnMgbm8gZXhlY3V0YWJsZSIsCi0gICAgICAgICAgICAgICAgICAgamF2YWMuZ2V0SmF2YWNFeGVjdXRhYmxlKCkpOworICAgICAgICBhc3NlcnROdWxsKCJubyBmb3JrIGFuZCBub3QgZXh0SmF2YWMgbWVhbnMgbm8gZXhlY3V0YWJsZSIsIGphdmFjLmdldEphdmFjRXhlY3V0YWJsZSgpKTsKIAogICAgICAgICBTdHJpbmcgbXlKYXZhYyA9ICJTbGFydGliYXJ0ZmFzdCI7CiAgICAgICAgIGphdmFjLnNldEZvcmsodHJ1ZSk7CkBAIC0xNTMsOCArMTU1LDcgQEAKICAgICAgICAgU3RyaW5nIGNvbXBpbGVyID0gamF2YWMuZ2V0Q29tcGlsZXIoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlcik7CiAgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLmNvbXBpbGVyIikgIT0gbnVsbCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQuY29tcGlsZXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJidWlsZC5jb21waWxlciIpLCBjb21waWxlcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKCJkZWZhdWx0IHZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgImphdmFjMS4xIi5lcXVhbHMoY29tcGlsZXIpCkBAIC0yMDAsMTcgKzIwMSwxMyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVyQWRhcHRlcigpIHsKICAgICAgICAgamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMS40Iik7Ci0KICAgICAgICAgamF2YWMuc2V0RGVwZW5kKHRydWUpOwotICAgICAgICBDb21waWxlckFkYXB0ZXIgYWRhcHRlciA9Ci0gICAgICAgICAgICBDb21waWxlckFkYXB0ZXJGYWN0b3J5LmdldENvbXBpbGVyKGphdmFjLmdldENvbXBpbGVyKCksIGphdmFjKTsKLQotICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBKYXZhYzEzKTsKKyAgICAgICAgQ29tcGlsZXJBZGFwdGVyIGFkYXB0ZXIgPSBDb21waWxlckFkYXB0ZXJGYWN0b3J5LmdldENvbXBpbGVyKGphdmFjLmdldENvbXBpbGVyKCksIGphdmFjKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhZGFwdGVyLCBpbnN0YW5jZU9mKEphdmFjMTMuY2xhc3MpKTsKIAogICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOwotICAgICAgICBhZGFwdGVyID0KLSAgICAgICAgICAgIENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoamF2YWMuZ2V0Q29tcGlsZXIoKSwgamF2YWMpOwotICAgICAgICBhc3NlcnRUcnVlKGFkYXB0ZXIgaW5zdGFuY2VvZiBKYXZhY0V4dGVybmFsKTsKKyAgICAgICAgYWRhcHRlciA9IENvbXBpbGVyQWRhcHRlckZhY3RvcnkuZ2V0Q29tcGlsZXIoamF2YWMuZ2V0Q29tcGlsZXIoKSwgamF2YWMpOworICAgICAgICBhc3NlcnRUaGF0KGFkYXB0ZXIsIGluc3RhbmNlT2YoSmF2YWNFeHRlcm5hbC5jbGFzcykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMjAsMTMgKzIxNywxMyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlV2l0aERlZmF1bHQoKSB7Ci0gICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImFudC5idWlsZC5qYXZhYy5zb3VyY2UiLCAiMS40Iik7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19TT1VSQ0UsICIxLjQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjQiLCBqYXZhYy5nZXRTb3VyY2UoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U291cmNlT3ZlcnJpZGVzRGVmYXVsdCgpIHsKLSAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgiYW50LmJ1aWxkLmphdmFjLnNvdXJjZSIsICIxLjQiKTsKKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eShNYWdpY05hbWVzLkJVSUxEX0pBVkFDX1NPVVJDRSwgIjEuNCIpOwogICAgICAgICBqYXZhYy5zZXRTb3VyY2UoIjEuNSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEuNSIsIGphdmFjLmdldFNvdXJjZSgpKTsKICAgICB9CkBAIC0yMzgsNTcgKzIzNSw0MiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0V2l0aERlZmF1bHQoKSB7Ci0gICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImFudC5idWlsZC5qYXZhYy50YXJnZXQiLCAiMS40Iik7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9KQVZBQ19UQVJHRVQsICIxLjQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjQiLCBqYXZhYy5nZXRUYXJnZXQoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0T3ZlcnJpZGVzRGVmYXVsdCgpIHsKLSAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgiYW50LmJ1aWxkLmphdmFjLnRhcmdldCIsICIxLjQiKTsKKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eShNYWdpY05hbWVzLkJVSUxEX0pBVkFDX1RBUkdFVCwgIjEuNCIpOwogICAgICAgICBqYXZhYy5zZXRUYXJnZXQoIjEuNSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjEuNSIsIGphdmFjLmdldFRhcmdldCgpKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZXNvdXJjZXBhdGhPclNyY0RpclJlcXVpcmVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgamF2YWMuY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBuZWl0aGVyIHNyY0RpciBub3IgbW9kdWxlc291cmNlcGF0aCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL3Bhc3MKLSAgICAgICAgfQorICAgICAgICBqYXZhYy5jaGVja1BhcmFtZXRlcnMoKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZXNvdXJjZXBhdGhBbmRTcmNEaXJGb3JiaWRkZW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhYy5jaGVja1BhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAgICAgcC5zZXRQYXRoKCJzcmMiKTsKLSAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihwKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdGggbXAgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgICAgIHAuc2V0UGF0aCgibW9kc3JjIik7Ci0gICAgICAgICAgICBqYXZhYy5zZXRNb2R1bGVzb3VyY2VwYXRoKG1wKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biAtIG5laXRoZXIgc3JjRGlyIG5vciBtb2R1bGVzb3VyY2VwYXRoIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vcGFzcwotICAgICAgICB9CisgICAgICAgIGphdmFjLmNoZWNrUGFyYW1ldGVycygpOworICAgICAgICBmaW5hbCBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgcC5zZXRQYXRoKCJzcmMiKTsKKyAgICAgICAgamF2YWMuc2V0U3JjZGlyKHApOworICAgICAgICBmaW5hbCBQYXRoIG1wID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHAuc2V0UGF0aCgibW9kc3JjIik7CisgICAgICAgIGphdmFjLnNldE1vZHVsZXNvdXJjZXBhdGgobXApOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlc291cmNlcGF0aEFuZFNvdXJjZXBhdGhGb3JiaWRkZW4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBqYXZhYy5jaGVja1BhcmFtZXRlcnMoKTsKLSAgICAgICAgICAgIGZpbmFsIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOwotICAgICAgICAgICAgcC5zZXRQYXRoKCJzcmMiKTsKLSAgICAgICAgICAgIGphdmFjLnNldFNvdXJjZXBhdGgocCk7Ci0gICAgICAgICAgICBmaW5hbCBQYXRoIG1wID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgICAgICBwLnNldFBhdGgoIm1vZHNyYyIpOwotICAgICAgICAgICAgamF2YWMuc2V0TW9kdWxlc291cmNlcGF0aChtcCk7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBuZWl0aGVyIHNyY0RpciBub3IgbW9kdWxlc291cmNlcGF0aCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL3Bhc3MKLSAgICAgICAgfQorICAgICAgICBqYXZhYy5jaGVja1BhcmFtZXRlcnMoKTsKKyAgICAgICAgZmluYWwgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHAuc2V0UGF0aCgic3JjIik7CisgICAgICAgIGphdmFjLnNldFNvdXJjZXBhdGgocCk7CisgICAgICAgIGZpbmFsIFBhdGggbXAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgcC5zZXRQYXRoKCJtb2RzcmMiKTsKKyAgICAgICAgamF2YWMuc2V0TW9kdWxlc291cmNlcGF0aChtcCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTMxNywxNiArMjk5LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZXNvdXJjZXBhdGhSZXF1aXJlc0Rlc3RkaXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKLSAgICAgICAgICAgIHAuc2V0UGF0aCgic3JjIik7Ci0gICAgICAgICAgICBqYXZhYy5zZXRNb2R1bGVzb3VyY2VwYXRoKHApOwotICAgICAgICAgICAgamF2YWMuY2hlY2tQYXJhbWV0ZXJzKCk7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gLSBtb2R1bGVzb3VyY2VwYXRoIHJlcXVpcmVzIGRlc3RkaXIiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9wYXNzCi0gICAgICAgIH0KKyAgICAgICAgZmluYWwgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7CisgICAgICAgIHAuc2V0UGF0aCgic3JjIik7CisgICAgICAgIGphdmFjLnNldE1vZHVsZXNvdXJjZXBhdGgocCk7CisgICAgICAgIGphdmFjLmNoZWNrUGFyYW1ldGVycygpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9KYXZhZG9jVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2NUZXN0LmphdmEKaW5kZXggZjdhMjg3ZC4uMTczMGNiMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2NUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0phdmFkb2NUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCwxMyArMjgsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9QQVRIID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfRklMRU5BTUUgPSAiamF2YWRvYy54bWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFID0gQlVJTERfUEFUSCArIEJVSUxEX0ZJTEVOQU1FOwotCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChCVUlMRF9GSUxFKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2phdmFkb2MvamF2YWRvYy54bWwiKTsKICAgICB9CiAKICAgICAvLyBQUiAzODM3MApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRGaWxlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL0xvYWRGaWxlVGVzdC5qYXZhCmluZGV4IGFiNjY1YWQuLjNiZDY3MjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Mb2FkRmlsZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTG9hZEZpbGVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMiArMjMsMTMgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBUZXN0IHRoZSBsb2FkIGZpbGUgdGFzawpAQCAtMzgsNiArMzksOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2xvYWRmaWxlLnhtbCIpOwpAQCAtNDksMjkgKzUzLDIxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQSB1bml0IHRlc3QgZm9yIEpVbml0CisgICAgICogRmFpbCBkdWUgdG8gc291cmNlIGZpbGUgbm90IGRlZmluZWQKICAgICAgKi8KLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE5vU291cmNlZmlsZURlZmluZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vU291cmNlZmlsZURlZmluZWQiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBzb3VyY2UgZmlsZSBub3QgZGVmaW5lZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9Tb3VyY2VmaWxlRGVmaW5lZCIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqIEZhaWwgZHVlIHRvIG91dHB1dCBwcm9wZXJ0eSBub3QgZGVmaW5lZAogICAgICAqLwotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Qcm9wZXJ0eURlZmluZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vUHJvcGVydHlEZWZpbmVkIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogb3V0cHV0IHByb3BlcnR5IG5vdCBkZWZpbmVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb1Byb3BlcnR5RGVmaW5lZCIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIC8qKgpAQCAtNzksMTIgKzc1LDkgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NvdXJjZWZpbGVmb3VuZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9Tb3VyY2VmaWxlZm91bmQiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBGaWxlIG5vdCBmb3VuZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIiBkb2Vzbid0IGV4aXN0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIiBkb2Vzbid0IGV4aXN0Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9Tb3VyY2VmaWxlZm91bmQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMiw5ICs5NSw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEFGaWxlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RMb2FkQUZpbGUiKTsKLSAgICAgICAgaWYoIWJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3RMb2FkQUZpbGUiKS5jb250YWlucygiZWg/IikpIHsKLSAgICAgICAgICAgIGZhaWwoInByb3BlcnR5IGlzIG5vdCBhbGwgaW4gdGhlIGZpbGUiKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUaGF0KCJwcm9wZXJ0eSBpcyBub3QgYWxsIGluIHRoZSBmaWxlIiwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0TG9hZEFGaWxlIiksIGNvbnRhaW5zU3RyaW5nKCJlaD8iKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjIsOSArMTE0LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsUHJvcHMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV2YWxQcm9wcyIpOwotICAgICAgICBpZighYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdEV2YWxQcm9wcyIpLmNvbnRhaW5zKCJyYWluIikpIHsKLSAgICAgICAgICAgIGZhaWwoInByb3BlcnR5IGV2YWwgYnJva2VuIik7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VGhhdCgicHJvcGVydHkgZXZhbCBicm9rZW4iLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3RFdmFsUHJvcHMiKSwgY29udGFpbnNTdHJpbmcoInJhaW4iKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzMsOSArMTI0LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJDaGFpbigpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsdGVyQ2hhaW4iKTsKLSAgICAgICAgaWYoIWJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3RGaWx0ZXJDaGFpbiIpLmNvbnRhaW5zKCJXb3JsZCEiKSkgewotICAgICAgICAgICAgZmFpbCgiRmlsdGVyIENoYWluIGJyb2tlbiIpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRoYXQoIkZpbHRlciBDaGFpbiBicm9rZW4iLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3RGaWx0ZXJDaGFpbiIpLCBjb250YWluc1N0cmluZygiV29ybGQhIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ0LDkgKzEzNCw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0U3RyaXBKYXZhQ29tbWVudHMoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFN0cmlwSmF2YUNvbW1lbnRzIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImV4cGVjdGVkIik7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBnZW5lcmF0ZWQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0U3RyaXBKYXZhQ29tbWVudHMiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBnZW5lcmF0ZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZXhwZWN0ZWQiKSwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0U3RyaXBKYXZhQ29tbWVudHMiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZlRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWNyb0RlZlRlc3QuamF2YQppbmRleCA1OWI2YmQ3Li41MDE1NWIyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFjcm9EZWZUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hY3JvRGVmVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMTAgKzIzLDEyIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKi8KQEAgLTM1LDYgKzM3LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYWNyb2RlZi54bWwiKTsKQEAgLTUyLDI0ICs1NywxNiBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIklubmVyIFRleHQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQXR0cmlidXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImR1cGxpY2F0ZS5hdHRyaWJ1dGUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiB0aGUgYXR0cmlidXRlIHRleHQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZHVwbGljYXRlLmF0dHJpYnV0ZSIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVFbGVtZW50KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImR1cGxpY2F0ZS5lbGVtZW50Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogdGhlIGVsZW1lbnQgdGV4dCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkdXBsaWNhdGUuZWxlbWVudCIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwNSwzMiArMTAyLDMxIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dEVsZW1lbnQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXh0ZWxlbWVudCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiSGVsbG8gd29ybGQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkhlbGxvIHdvcmxkIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRleHRUcmltKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGV4dC50cmltIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJbSGVsbG8gd29ybGRdIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJbSGVsbG8gd29ybGRdIikpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gdGhlIG5hbWUgInRleHQiIGFscmVhZHkgdXNlZCBhcyBhbiBhdHRyaWJ1dGUKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVUZXh0TmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkdXBsaWNhdGV0ZXh0bmFtZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHRoZSBuYW1lIFwidGV4dFwiIGlzIGFscmVhZHkgdXNlZCBhcyBhbiBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZHVwbGljYXRldGV4dG5hbWUiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9Ci0gICAgQFRlc3QKKworICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIHRoZSBhdHRyaWJ1dGUgbmFtZSAidGV4dCIgYWxyZWFkeSB1c2VkIGJ5IGEgdGV4dCBlbGVtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlVGV4dE5hbWUyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImR1cGxpY2F0ZXRleHRuYW1lMiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHRoZSBhdHRyaWJ1dGUgbmFtZSBcInRleHRcIiBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgYnkgdGhlIHRleHQgZWxlbWVudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkdXBsaWNhdGV0ZXh0bmFtZTIiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTU5LDEyICsxNTUsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXROb3RPcHRpb25hbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbXBsaWNpdC5ub3RvcHRpb25hbCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IE1pc3NpbmcgbmVzdGVkIGVsZW1lbnRzIGZvciBpbXBsaWNpdCBlbGVtZW50IGltcGxpY2l0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc3NpbmcgbmVzdGVkIGVsZW1lbnRzIGZvciBpbXBsaWNpdCBlbGVtZW50IGltcGxpY2l0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk1pc3NpbmcgbmVzdGVkIGVsZW1lbnRzIGZvciBpbXBsaWNpdCBlbGVtZW50IGltcGxpY2l0Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbXBsaWNpdC5ub3RvcHRpb25hbCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzUsMzggKzE2OCwyOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRFeHBsaWNpdCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbXBsaWNpdC5leHBsaWNpdCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IE9ubHkgb25lIGVsZW1lbnQgYWxsb3dlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGVsZW1lbnRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk9ubHkgb25lIGVsZW1lbnQgYWxsb3dlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGVsZW1lbnRzIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk9ubHkgb25lIGVsZW1lbnQgYWxsb3dlZCB3aGVuIHVzaW5nIGltcGxpY2l0IGVsZW1lbnRzIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbXBsaWNpdC5leHBsaWNpdCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhY2tUcmFjZU9mZigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJiYWNrdHJhY2VvZmYiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGlmIChleC5nZXRNZXNzYWdlKCkuY29udGFpbnMoImZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCIpKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgiZXJyb3IgbWVzc2FnZSBjb250YWluZWQgYmFja3RyYWNlIC0gIiArIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKG5vdChjb250YWluc1N0cmluZygiZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIikpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImJhY2t0cmFjZW9mZiIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhY2tUcmFjZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJiYWNrdHJhY2VvbiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IENoZWNraW5nIGlmIGEgYmFjayB0cmFjZSBpcyBjcmVhdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYmFja3RyYWNlb24iKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUb3BMZXZlbFRleHQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0b3AtbGV2ZWwtdGV4dCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiSGVsbG8gV29ybGQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkhlbGxvIFdvcmxkIikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYWtlVXJsVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmxUZXN0LmphdmEKaW5kZXggYjYwNjA0Yi4uNjYwMzZlMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmxUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01ha2VVcmxUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxNTggKzE5LDExMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwucnVubmVycy5FbmNsb3NlZDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CiAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ib3RoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbmRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKLQorQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgTWFrZVVybFRlc3QgewogCi0gICAgQFJ1bGUKLSAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkQXJndW1lbnRUZXN0IHsKIAotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21ha2V1cmwueG1sIik7Ci0gICAgfQorICAgICAgICBAUnVsZQorICAgICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVtcHR5Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogbWlzc2luZyBwcm9wZXJ0eSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoInByb3BlcnR5IiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgQFJ1bGUKKyAgICAgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgICAgICBAQmVmb3JlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL21ha2V1cmwueG1sIik7CisgICAgICAgIH0KKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiB0YXJnZXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgICAgIHsidGVzdEVtcHR5IiwgIk5vIHByb3BlcnR5IGRlZmluZWQifSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXN0Tm9Qcm9wZXJ0eSIsICJObyBwcm9wZXJ0eSBkZWZpbmVkIn0sCisgICAgICAgICAgICAgICAgICAgIHsidGVzdE5vRmlsZSIsICJObyBmaWxlcyBkZWZpbmVkIn0sCisgICAgICAgICAgICAgICAgICAgIHsidGVzdFZhbGlkYXRpb24iLCAiQSBzb3VyY2UgZmlsZSBpcyBtaXNzaW5nIn0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGFyZ2V0TmFtZTsKKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0TmFtZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1Byb3BlcnR5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb1Byb3BlcnR5Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogbWlzc2luZyBwcm9wZXJ0eSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoInByb3BlcnR5IiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRBcmd1bWVudFRlc3QgeworCisgICAgICAgIEBSdWxlCisgICAgICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKKyAgICAgICAgQEJlZm9yZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9tYWtldXJsLnhtbCIpOworICAgICAgICB9CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gdGFyZ2V0cygpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgICAgICB7InRlc3RXb3JrcyIsIGJvdGgoY29udGFpbnNTdHJpbmcoImZpbGU6IikpLmFuZChjb250YWluc1N0cmluZygiL2ZvbyIpKX0sCisgICAgICAgICAgICAgICAgICAgIHsidGVzdElsbGVnYWxDaGFycyIsIGJvdGgoY29udGFpbnNTdHJpbmcoImZpbGU6IikpLmFuZChjb250YWluc1N0cmluZygiZm8lMjBvJTI1IikpfSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXN0Um91bmRUcmlwIiwgY29udGFpbnNTdHJpbmcoImZpbGU6Iil9LAorICAgICAgICAgICAgICAgICAgICB7InRlc3RJbGxlZ2FsQ29tYmluYXRpb25zIiwgYm90aChjb250YWluc1N0cmluZygiL2ZvbyIpKS5hbmQoY29udGFpbnNTdHJpbmcoIi54bWwiKSl9LAorICAgICAgICAgICAgICAgICAgICB7InRlc3RGaWxlc2V0IiwgYm90aChjb250YWluc1N0cmluZygiLnhtbCAiKSkuYW5kKGVuZHNXaXRoKCIueG1sIikpfSwKKyAgICAgICAgICAgICAgICAgICAgeyJ0ZXN0RmlsZXNldFNlcGFyYXRvciIsIGJvdGgoY29udGFpbnNTdHJpbmcoIi54bWxcIixcIiIpKS5hbmQoZW5kc1dpdGgoIi54bWwiKSl9LAorICAgICAgICAgICAgICAgICAgICB7InRlc3RQYXRoIiwgY29udGFpbnNTdHJpbmcoIm1ha2V1cmwueG1sIil9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIHRhcmdldE5hbWU7CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgICAgIHB1YmxpYyBNYXRjaGVyPFN0cmluZz4gbWF0Y2hlcjsKKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5ID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSh0YXJnZXROYW1lKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoInByb3BlcnR5IG5vdCBzZXQiLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHByb3BlcnR5LCBtYXRjaGVyKTsKKworICAgICAgICAgICAgaWYgKHRhcmdldE5hbWUuZXF1YWxzKCJ0ZXN0Um91bmRUcmlwIikpIHsKKyAgICAgICAgICAgICAgICAvLyB0ZXN0IHRoYXQgd2UgY2FuIHJvdW5kIHRyaXAgYnkgb3BlbmluZyBhIHVybCB0aGF0IGV4aXN0cworICAgICAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9GaWxlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogbWlzc2luZyBmaWxlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiZmlsZSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RWYWxpZGF0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogIiArIE1ha2VVcmwuRVJST1JfTUlTU0lOR19GSUxFKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJmaWxlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdvcmtzKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdvcmtzIik7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5Q29udGFpbnMoInRlc3RXb3JrcyIsICJmaWxlOiIpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKCJ0ZXN0V29ya3MiLCAiL2ZvbyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxDaGFycygpIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJbGxlZ2FsQ2hhcnMiKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdElsbGVnYWxDaGFycyIsICJmaWxlOiIpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKCJ0ZXN0SWxsZWdhbENoYXJzIiwgImZvJTIwbyUyNSIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHRlc3QgdGhhdCB3ZSBjYW4gcm91bmQgdHJpcCBieSBvcGVuaW5nIGEgdXJsIHRoYXQgZXhpc3RzCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmRUcmlwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSb3VuZFRyaXAiKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdFJvdW5kVHJpcCIsICJmaWxlOiIpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHkgPSBnZXRQcm9wZXJ0eSgidGVzdFJvdW5kVHJpcCIpOwotICAgICAgICBVUkwgdXJsID0gbmV3IFVSTChwcm9wZXJ0eSk7Ci0gICAgICAgIElucHV0U3RyZWFtIGluc3RyZWFtID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgaW5zdHJlYW0uY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQ29tYmluYXRpb25zKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElsbGVnYWxDb21iaW5hdGlvbnMiKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdElsbGVnYWxDb21iaW5hdGlvbnMiLCAiL2ZvbyIpOwotICAgICAgICBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKCJ0ZXN0SWxsZWdhbENvbWJpbmF0aW9ucyIsICIueG1sIik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlc2V0Iik7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5Q29udGFpbnMoInRlc3RGaWxlc2V0IiwgIi54bWwgIik7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5RW5kc1dpdGgoInRlc3RGaWxlc2V0IiwgIi54bWwiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlc2V0U2VwYXJhdG9yKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVzZXRTZXBhcmF0b3IiKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdEZpbGVzZXRTZXBhcmF0b3IiLCAiLnhtbFwiLFwiIik7Ci0gICAgICAgIGFzc2VydFByb3BlcnR5RW5kc1dpdGgoInRlc3RGaWxlc2V0U2VwYXJhdG9yIiwgIi54bWwiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFBhdGgiKTsKLSAgICAgICAgYXNzZXJ0UHJvcGVydHlDb250YWlucygidGVzdFBhdGgiLCAibWFrZXVybC54bWwiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhc3NlcnQgdGhhdCBhIHByb3BlcnR5IGVuZHMgd2l0aAotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IFN0cmluZwotICAgICAqIEBwYXJhbSBlbmRpbmcgU3RyaW5nCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByb3BlcnR5RW5kc1dpdGgoU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgZW5kaW5nKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgICAgIFN0cmluZyBzdWJzdHJpbmcgPSByZXN1bHQuc3Vic3RyaW5nKHJlc3VsdC5sZW5ndGgoKSAtIGVuZGluZy5sZW5ndGgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhlbmRpbmcsIHN1YnN0cmluZyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogYXNzZXJ0IHRoYXQgYSBwcm9wZXJ0eSBjb250YWlucyBhIHN0cmluZwotICAgICAqCi0gICAgICogQHBhcmFtIHByb3BlcnR5IG5hbWUgb2YgcHJvcGVydHkgdG8gbG9vayBmb3IKLSAgICAgKiBAcGFyYW0gY29udGFpbnMgd2hhdCB0byBzZWFyY2ggZm9yIGluIHRoZSBzdHJpbmcKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQcm9wZXJ0eUNvbnRhaW5zKFN0cmluZyBwcm9wZXJ0eSwgU3RyaW5nIGNvbnRhaW5zKSB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZXhwZWN0ZWQgIiArIGNvbnRhaW5zICsgIiBpbiAiICsgcmVzdWx0LAotICAgICAgICAgICAgICAgIHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5jb250YWlucyhjb250YWlucykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIGdldCBhIHByb3BlcnR5IGZyb20gdGhlIHByb2plY3QKLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm9wZXJ0eSBTdHJpbmcKLSAgICAgKiBAcmV0dXJuIFN0cmluZwotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KSB7Ci0gICAgICAgIHJldHVybiBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KHByb3BlcnR5KTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGhUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RDbGFzc1BhdGhUZXN0LmphdmEKaW5kZXggY2ZkYmYxMS4uN2VjNzAwZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0Q2xhc3NQYXRoVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdENsYXNzUGF0aFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEwICsxNywxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVOb0V4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC0yOSwxMCArMzIsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFRlc3RzICZsdDtibTptYW5pZmVzdGNsYXNzcGF0aCZndDsuCkBAIC00Miw2ICs0NSw5IEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWFuaWZlc3RjbGFzc3BhdGgueG1sIik7CkBAIC00OSw1NyArNTUsNjIgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhZERpcmVjdG9yeSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJKYXIncyBkaXJlY3Rvcnkgbm90IGZvdW5kOiIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QtYmFkLWRpcmVjdG9yeSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIG9uIGJhZCBkaXJlY3RvcnkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJKYXIncyBkaXJlY3Rvcnkgbm90IGZvdW5kOiIsIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBwb3N0LW1vcnRlbQorICAgICAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqYXIuY2xhc3NwYXRoIikpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiamFyLmNsYXNzcGF0aCIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROb1Byb3BlcnR5KCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk1pc3NpbmcgJ3Byb3BlcnR5JyBhdHRyaWJ1dGUhIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1iYWQtbm8tcHJvcGVydHkiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBvbiBubyBwcm9wZXJ0eSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk1pc3NpbmcgJ3Byb3BlcnR5JyBhdHRyaWJ1dGUhIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHBvc3QtbW9ydGVtCisgICAgICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqYXIuY2xhc3NwYXRoIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhZFByb3BlcnR5RXhpc3RzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlByb3BlcnR5ICdqYXIuY2xhc3NwYXRoJyBhbHJlYWR5IHNldCEiKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LWJhZC1wcm9wZXJ0eS1leGlzdHMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBvbiBiYWQgcHJvcGVydHkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJQcm9wZXJ0eSAnamFyLmNsYXNzcGF0aCcgYWxyZWFkeSBzZXQhIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHBvc3QtbW9ydGVtCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImV4aXN0cyIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSwgImV4aXN0cyIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhZE5vSmFyZmlsZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJNaXNzaW5nICdqYXJmaWxlJyBhdHRyaWJ1dGUhIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1iYWQtbm8tamFyZmlsZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIG9uIGJhZCBqYXIgZmlsZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk1pc3NpbmcgJ2phcmZpbGUnIGF0dHJpYnV0ZSEiLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcG9zdC1tb3J0ZW0KKyAgICAgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiamFyLmNsYXNzcGF0aCIpKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTm9DbGFzc1BhdGgoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiTWlzc2luZyBuZXN0ZWQgPGNsYXNzcGF0aD4hIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1iYWQtbm8tY2xhc3NwYXRoIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gb24gbm8gY2xhc3NwYXRoIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiTWlzc2luZyBuZXN0ZWQgPGNsYXNzcGF0aD4hIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHBvc3QtbW9ydGVtCisgICAgICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSk7CiAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqYXIuY2xhc3NwYXRoIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMzQsMTggKzE0NSwyMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyZW50TGV2ZWwyVG9vRGVlcCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJObyBzdWl0YWJsZSByZWxhdGl2ZSBwYXRoIGZyb20gIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1wYXJlbnQtbGV2ZWwyLXRvby1kZWVwIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gb24gbm8gc3VpdGFibGUgcGF0aCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk5vIHN1aXRhYmxlIHJlbGF0aXZlIHBhdGggZnJvbSAiLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgLy8gcG9zdC1tb3J0ZW0KKyAgICAgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiamFyLmNsYXNzcGF0aCIpKTsKICAgICAgICAgfQotICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHNldWRvVGFob2VSZWZpZCgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIk5vIHJlZ2V4cCBtYXRjaGVyIGlzIHByZXNlbnQiLCBSZWdleHBNYXRjaGVyRmFjdG9yeS5yZWdleHBNYXRjaGVyUHJlc2VudChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc3VtZVRydWUoIk5vIHJlZ2V4cCBtYXRjaGVyIGlzIHByZXNlbnQiLAorICAgICAgICAgICAgICAgIFJlZ2V4cE1hdGNoZXJGYWN0b3J5LnJlZ2V4cE1hdGNoZXJQcmVzZW50KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpKTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1wc2V1ZG8tdGFob2UtcmVmaWQiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImphci5jbGFzc3BhdGgiKSwgImNsYXNzZXMvZHNwLWNvcmUvICIKQEAgLTE1OCw3ICsxNzEsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHNldWRvVGFob2VOZXN0ZWQoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJObyByZWdleHAgbWF0Y2hlciBpcyBwcmVzZW50IiwgUmVnZXhwTWF0Y2hlckZhY3RvcnkucmVnZXhwTWF0Y2hlclByZXNlbnQoYnVpbGRSdWxlLmdldFByb2plY3QoKSkpOworICAgICAgICBhc3N1bWVUcnVlKCJObyByZWdleHAgbWF0Y2hlciBpcyBwcmVzZW50IiwKKyAgICAgICAgICAgICAgICBSZWdleHBNYXRjaGVyRmFjdG9yeS5yZWdleHBNYXRjaGVyUHJlc2VudChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKSk7CiAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QtcHNldWRvLXRhaG9lLW5lc3RlZCIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiamFyLmNsYXNzcGF0aCIpLCAiY2xhc3Nlcy9kc3AtY29yZS8gIgpAQCAtMTkwLDI3ICsyMDQsMjcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYXRpb25hbEdlcm1hbigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImludGVybmF0aW9uYWwtZ2VybWFuIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJydW4tdHdvLWphcnMiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImJldGEgYWxwaGEiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoImJldGEgYWxwaGEiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJuYXRpb25hbEhlYnJldygpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZUZhbHNlKCJUZXN0IHdpdGggaGVicmV3IHBhdGggbm90IGF0dGVtcHRlZCB1bmRlciBXaW5kb3dzIiwgT3MuaXNGYW1pbHkoIndpbmRvd3MiKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJUZXN0IHdpdGggaGVicmV3IHBhdGggbm90IGF0dGVtcHRlZCB1bmRlciBXaW5kb3dzIiwgT3MuaXNGYW1pbHkoIndpbmRvd3MiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbnRlcm5hdGlvbmFsLWhlYnJldyIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicnVuLXR3by1qYXJzIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJiZXRhIGFscGhhIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJiZXRhIGFscGhhIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNhbWVXaW5kb3dzRHJpdmUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUZXN0IHdpdGggZHJpdmUgbGV0dGVycyBvbmx5IHJ1biBvbiB3aW5kb3dzIiwgT3MuaXNGYW1pbHkoIndpbmRvd3MiKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlRlc3Qgd2l0aCBkcml2ZSBsZXR0ZXJzIG9ubHkgcnVuIG9uIHdpbmRvd3MiLCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTYW1lRHJpdmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNwIiksICIuLi9hL2IveC5qYXIiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REaWZmZXJlbnRXaW5kb3dzRHJpdmUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUZXN0IHdpdGggZHJpdmUgbGV0dGVycyBvbmx5IHJ1biBvbiB3aW5kb3dzIiwgT3MuaXNGYW1pbHkoIndpbmRvd3MiKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlRlc3Qgd2l0aCBkcml2ZSBsZXR0ZXJzIG9ubHkgcnVuIG9uIHdpbmRvd3MiLCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKICAgICAgICAgLy8gdGhlIGxpbmVzIGJlbG93IHRyeSB0byBmaW5kIGEgZHJpdmUgbmFtZSBkaWZmZXJlbnQgdGhhbiB0aGUgb25lIGNvbnRhaW5pbmcgdGhlIHRlbXAgZGlyCiAgICAgICAgIC8vIGlmIHRoZSB0ZW1wIGRpciBpcyBDIHdpbGwgdHJ5IHRvIHVzZSBECiAgICAgICAgIC8vIGlmIHRoZSB0ZW1wIGRpciBpcyBvbiBEIG9yIG90aGVyIHdpbGwgdHJ5IHRvIHVzZSBDCkBAIC0yMjAsNyArMjM0LDggQEAKICAgICAgICAgICAgIFN0cmluZyB0bXBDYW5vbmljYWxQYXRoID0gdG1wZGlyLmdldENhbm9uaWNhbFBhdGgoKTsKICAgICAgICAgICAgIGRyaXZlTGV0dGVyID0gdG1wQ2Fub25pY2FsUGF0aC5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImV4Y2VwdGlvbiBoYXBwZW5lZCBnZXR0aW5nIGNhbm9uaWNhbCBwYXRoIG9mIGphdmEuaW8udG1wZGlyIDogIiArIGlvZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJleGNlcHRpb24gaGFwcGVuZWQgZ2V0dGluZyBjYW5vbmljYWwgcGF0aCBvZiBqYXZhLmlvLnRtcGRpciA6ICIKKyAgICAgICAgICAgICAgICAgICAgKyBpb2UuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgYWx0RHJpdmVMZXR0ZXIgPSBudWxsOwogICAgICAgICB0cnkgewpAQCAtMjMxLDE3ICsyNDYsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5ldyBGaWxlKGFsdERyaXZlTGV0dGVyICsgIjovZm9vLnR4dCIpLmdldENhbm9uaWNhbFBhdGgoKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQXNzdW1lLmFzc3VtZU5vRXhjZXB0aW9uKCJEcml2ZSAiICsgYWx0RHJpdmVMZXR0ZXIgKyAiOiBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCByZWFkeSIsIGUpOworICAgICAgICAgICAgYXNzdW1lTm9FeGNlcHRpb24oIkRyaXZlICIgKyBhbHREcml2ZUxldHRlciArICI6IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IHJlYWR5IiwgZSk7CiAgICAgICAgIH0KICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgiYWx0RHJpdmVMZXR0ZXIiLCBhbHREcml2ZUxldHRlcik7CiAKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJObyBzdWl0YWJsZSByZWxhdGl2ZSBwYXRoIGZyb20gIik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERpZmZlcmVudERyaXZlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gb24gbm8gYWx0ZXJuYXRpdmUgZHJpdmUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJObyBzdWl0YWJsZSByZWxhdGl2ZSBwYXRoIGZyb20gIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIHBvc3QtbW9ydGVtCisgICAgICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNwIikpOwogICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0TnVsbChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjcCIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWFuaWZlc3RUZXN0LmphdmEKaW5kZXggZTUxODc4Mi4uMTYwOWEzOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01hbmlmZXN0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NYW5pZmVzdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMzLDEyICszMywxNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuc3RhcnRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogVGVzdGNhc2UgZm9yIHRoZSBNYW5pZmVzdCBjbGFzcyB1c2VkIGluIHRoZSBqYXIgdGFzay4KQEAgLTQ5LDE0ICs1MywxNyBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIHByaXZhdGUgRmlsZSBleHBhbmRlZE1hbmlmZXN0OwogICAgIHByaXZhdGUgRmlsZSBvdXREaXI7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJTkUKLSAgICAgICAgPSAiQVJlYWxseUxvbmdMaW5lVG9UZXN0TGluZUJyZWFraW5nSW5NYW5pZmVzdHMtQUNhcGFiaWxpdHlXaGljaCIgKwotICAgICAgICAgICJJc1N1cmVUb0xlYWRUb0h1bmRyZWRzT2ZRdWVzdGlvbnNBYm91dFdoeUFudE11bmdlc01hbmlmZXN0cyIgKwotICAgICAgICAgICJPZkNvdXJzZVRoZUFuc3dlcklzVGhhdElzV2hhdFRoZVNwZWNSZXF1aXJlc0FuZElmQW55dGhpbmdIYXMiICsKLSAgICAgICAgICAiQVByb2JsZW1XaXRoVGhhdEl0SXNOb3RBQnVnSW5BbnQiOworICAgICAgICAgICAgPSAiQVJlYWxseUxvbmdMaW5lVG9UZXN0TGluZUJyZWFraW5nSW5NYW5pZmVzdHMtQUNhcGFiaWxpdHlXaGljaCIKKyAgICAgICAgICAgICsgIklzU3VyZVRvTGVhZFRvSHVuZHJlZHNPZlF1ZXN0aW9uc0Fib3V0V2h5QW50TXVuZ2VzTWFuaWZlc3RzIgorICAgICAgICAgICAgKyAiT2ZDb3Vyc2VUaGVBbnN3ZXJJc1RoYXRJc1doYXRUaGVTcGVjUmVxdWlyZXNBbmRJZkFueXRoaW5nSGFzIgorICAgICAgICAgICAgKyAiQVByb2JsZW1XaXRoVGhhdEl0SXNOb3RBQnVnSW5BbnQiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9OR183MF9OQU1FCiAgICAgICAgID0gIlRoaXNOYW1lSXNKdXN0U2V2ZW50eUNoYXJhY3RlcnNXaGljaElzQWxsb3dlZEFjY29yZGluZ1RvVGhlU3BlY3NGaWxsZXIiOwpAQCAtMTA3LDEyICsxMTQsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBNYW5pZmVzdCBpcyBpbnZhbGlkIC0gbm8gY29sb24gb24gaGVhZGVyIGxpbmUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJJbnZhbGlkIE1hbmlmZXN0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkludmFsaWQgTWFuaWZlc3QiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjAsMTIgKzEyNCw5IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IE1hbmlmZXN0IGlzIGludmFsaWQgLSBzZWN0aW9uIHN0YXJ0cyB3aXRoIGNvbnRpbnVhdGlvbiBsaW5lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiSW52YWxpZCBNYW5pZmVzdCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJJbnZhbGlkIE1hbmlmZXN0Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwogICAgfQogCiAgICAgLyoqCkBAIC0xMzQsOCArMTM1LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgd2FybmluZyBhYm91dCBOYW1lIGluIG1haW4gc2VjdGlvbiIsIGJ1aWxkUnVsZS5nZXRMb2coKQotICAgICAgICAgICAgICAgIC5jb250YWlucygiTWFuaWZlc3Qgd2FybmluZzogXCJOYW1lXCIgYXR0cmlidXRlcyBzaG91bGQgbm90IG9jY3VyIGluIHRoZSBtYWluIHNlY3Rpb24iKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkV4cGVjdGVkIHdhcm5pbmcgYWJvdXQgTmFtZSBpbiBtYWluIHNlY3Rpb24iLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIk1hbmlmZXN0IHdhcm5pbmc6IFwiTmFtZVwiIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBvY2N1ciBpbiB0aGUgbWFpbiBzZWN0aW9uIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQzLDE2ICsxNDQsMTYgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkludmFsaWQgTWFuaWZlc3QiKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IE1hbmlmZXN0IGlzIGludmFsaWQgLSBzZWN0aW9uIHN0YXJ0cyB3aXRoIGluY29ycmVjdCBhdHRyaWJ1dGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJJbnZhbGlkIE1hbmlmZXN0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IHNlY3Rpb24gbm90IHN0YXJ0aW5nIHdpdGggTmFtZTogYXR0cmlidXRlIiwgYnVpbGRSdWxlLmdldExvZygpCi0gICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJNYW5pZmVzdCBzZWN0aW9ucyBzaG91bGQgc3RhcnQgd2l0aCBhIFwiTmFtZVwiIGF0dHJpYnV0ZSIpKTsKLSAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IHNlY3Rpb24gbm90IHN0YXJ0aW5nIHdpdGggTmFtZTogYXR0cmlidXRlIiwgYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiTWFuaWZlc3Qgc2VjdGlvbnMgc2hvdWxkIHN0YXJ0IHdpdGggYSBcIk5hbWVcIiBhdHRyaWJ1dGUiKSk7CiAKKyAgICAgICAgfQorICAgIH0KIAogICAgIC8qKgogICAgICAqIEZyb20gYXR0cmlidXRlIGlzIGlsbGVnYWwKQEAgLTE2MCw4ICsxNjEsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NyIpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IEZyb206IGF0dHJpYnV0ZSIsIGJ1aWxkUnVsZS5nZXRMb2coKQotICAgICAgICAgICAgICAgIC5jb250YWlucyhNYW5pZmVzdC5FUlJPUl9GUk9NX0ZPUkJJRERFTikpOworICAgICAgICBhc3NlcnRUaGF0KCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IEZyb206IGF0dHJpYnV0ZSIsIGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZyhNYW5pZmVzdC5FUlJPUl9GUk9NX0ZPUkJJRERFTikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTg1LDEzICsxODYsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDkoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBDb25zdHJ1Y3Rpb24gaXMgaW52YWxpZCAtIE5hbWUgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgdXNlZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlNwZWNpZnkgdGhlIHNlY3Rpb24gbmFtZSB1c2luZyB0aGUgXCJuYW1lXCIgYXR0cmlidXRlIG9mIHRoZSA8c2VjdGlvbj4gZWxlbWVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiU3BlY2lmeSB0aGUgc2VjdGlvbiBuYW1lIHVzaW5nIHRoZSBcIm5hbWVcIiBhdHRyaWJ1dGUgb2YgdGhlIDxzZWN0aW9uPiBlbGVtZW50Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTk5LDEyICsxOTYsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEwKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IEF0dHJpYnV0ZSBoYXMgbm8gbmFtZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIkF0dHJpYnV0ZXMgbXVzdCBoYXZlIG5hbWUgYW5kIHZhbHVlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkF0dHJpYnV0ZXMgbXVzdCBoYXZlIG5hbWUgYW5kIHZhbHVlIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTAiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIxMiwxMiArMjA2LDkgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTEiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBBdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiQXR0cmlidXRlcyBtdXN0IGhhdmUgbmFtZSBhbmQgdmFsdWUiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQXR0cmlidXRlcyBtdXN0IGhhdmUgbmFtZSBhbmQgdmFsdWUiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMSIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjI1LDEyICsyMTYsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IFNlY3Rpb24gd2l0aCBubyBuYW1lIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiU2VjdGlvbnMgbXVzdCBoYXZlIGEgbmFtZSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJTZWN0aW9ucyBtdXN0IGhhdmUgYSBuYW1lIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTIiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIzOCwxMyArMjI2LDkgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MTMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBEdXBsaWNhdGUgQXR0cmlidXRlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiVGhlIGF0dHJpYnV0ZSBcIlRlc3RcIiBtYXkgbm90IG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHNlY3Rpb24iLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhlIGF0dHJpYnV0ZSBcIlRlc3RcIiBtYXkgbm90IG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHNlY3Rpb24iKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMyIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc5LDE2ICsyNjMsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzcy1QYXRoIGF0dHJpYnV0ZSB3YXMgbm90IHNldCBjb3JyZWN0bHkgLSAiLAogICAgICAgICAgICAgTE9OR19MSU5FLCBjbGFzc3BhdGgpOwogCi0gICAgICAgIFN0cmluZyB2YWx1ZSA9IG1haW5TZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKExPTkdfNjhfTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTE9OR182OF9OQU1FX1ZBTFVFX01JU01BVENIIiwgVkFMVUUsIHZhbHVlKTsKLSAgICAgICAgdmFsdWUgPSBtYWluU2VjdGlvbi5nZXRBdHRyaWJ1dGVWYWx1ZShMT05HXzcwX05BTUUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkxPTkdfNzBfTkFNRV9WQUxVRV9NSVNNQVRDSCIsIFZBTFVFLCB2YWx1ZSk7Ci0gICAgICAgIHZhbHVlID0gbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoTk9UX0xPTkdfTkFNRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTk9UX0xPTkdfTkFNRV9WQUxVRV9NSVNNQVRDSCIsIFZBTFVFLCB2YWx1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTE9OR182OF9OQU1FX1ZBTFVFX01JU01BVENIIiwgVkFMVUUsCisgICAgICAgICAgICAgICAgbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoTE9OR182OF9OQU1FKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTE9OR183MF9OQU1FX1ZBTFVFX01JU01BVENIIiwgVkFMVUUsCisgICAgICAgICAgICAgICAgbWFpblNlY3Rpb24uZ2V0QXR0cmlidXRlVmFsdWUoTE9OR183MF9OQU1FKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTk9UX0xPTkdfTkFNRV9WQUxVRV9NSVNNQVRDSCIsIFZBTFVFLAorICAgICAgICAgICAgICAgIG1haW5TZWN0aW9uLmdldEF0dHJpYnV0ZVZhbHVlKE5PVF9MT05HX05BTUUpKTsKIAotICAgICAgICBTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgRmlsZVJlYWRlciBmaW4gPSBuZXcgRmlsZVJlYWRlcihleHBhbmRlZE1hbmlmZXN0KTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB0cnkgKEZpbGVSZWFkZXIgZmluID0gbmV3IEZpbGVSZWFkZXIoZXhwYW5kZWRNYW5pZmVzdCkpIHsKICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZpbik7CiAKICAgICAgICAgICAgIFN0cmluZyByZWFkID0gaW4ucmVhZExpbmUoKTsKQEAgLTI5Nyw4ICsyODAsNiBAQAogICAgICAgICAgICAgICAgIHJlYWQgPSBpbi5yZWFkTGluZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGZpbi5jbG9zZSgpOwogICAgICAgICB9CiAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuaWZlc3QgZmlsZSBzaG91bGQgaGF2ZSBjb250YWluZWQgc3RyaW5nICIsCkBAIC0zMTksMTYgKzMwMCwxNiBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE9yZGVyMSIpOwogCiAgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoZXhwYW5kZWRNYW5pZmVzdCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBtYW5pZmVzdC5nZXRTZWN0aW9uTmFtZXMoKTsKLSAgICAgICAgU3RyaW5nIHNlY3Rpb24xID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgc2VjdGlvbjIgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IG1hbmlmZXN0LmdldFNlY3Rpb25OYW1lcygpOworICAgICAgICBTdHJpbmcgc2VjdGlvbjEgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBzZWN0aW9uMiA9IGUubmV4dEVsZW1lbnQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaXJzdCBzZWN0aW9uIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0MSIsIHNlY3Rpb24xKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmQgc2VjdGlvbiBuYW1lIHVuZXhwZWN0ZWQiLCAiVGVzdDIiLCBzZWN0aW9uMik7CiAKICAgICAgICAgTWFuaWZlc3QuU2VjdGlvbiBzZWN0aW9uID0gbWFuaWZlc3QuZ2V0U2VjdGlvbigiVGVzdDEiKTsKICAgICAgICAgZSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlS2V5cygpOwotICAgICAgICBTdHJpbmcgYXR0cjFLZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBhdHRyMktleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIGF0dHIxS2V5ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgYXR0cjJLZXkgPSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgIFN0cmluZyBhdHRyMSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIxS2V5KS5nZXROYW1lKCk7CiAgICAgICAgIFN0cmluZyBhdHRyMiA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIyS2V5KS5nZXROYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRmlyc3QgYXR0cmlidXRlIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0QXR0cjEiLCBhdHRyMSk7CkBAIC0zNDMsMTYgKzMyNCwxNiBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE9yZGVyMiIpOwogCiAgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gZ2V0TWFuaWZlc3QoZXhwYW5kZWRNYW5pZmVzdCk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGUgPSBtYW5pZmVzdC5nZXRTZWN0aW9uTmFtZXMoKTsKLSAgICAgICAgU3RyaW5nIHNlY3Rpb24xID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBTdHJpbmcgc2VjdGlvbjIgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIEVudW1lcmF0aW9uPFN0cmluZz4gZSA9IG1hbmlmZXN0LmdldFNlY3Rpb25OYW1lcygpOworICAgICAgICBTdHJpbmcgc2VjdGlvbjEgPSBlLm5leHRFbGVtZW50KCk7CisgICAgICAgIFN0cmluZyBzZWN0aW9uMiA9IGUubmV4dEVsZW1lbnQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaXJzdCBzZWN0aW9uIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0MiIsIHNlY3Rpb24xKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTZWNvbmQgc2VjdGlvbiBuYW1lIHVuZXhwZWN0ZWQiLCAiVGVzdDEiLCBzZWN0aW9uMik7CiAKICAgICAgICAgTWFuaWZlc3QuU2VjdGlvbiBzZWN0aW9uID0gbWFuaWZlc3QuZ2V0U2VjdGlvbigiVGVzdDEiKTsKICAgICAgICAgZSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlS2V5cygpOwotICAgICAgICBTdHJpbmcgYXR0cjFLZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIFN0cmluZyBhdHRyMktleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIGF0dHIxS2V5ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICBTdHJpbmcgYXR0cjJLZXkgPSBlLm5leHRFbGVtZW50KCk7CiAgICAgICAgIFN0cmluZyBhdHRyMSA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIxS2V5KS5nZXROYW1lKCk7CiAgICAgICAgIFN0cmluZyBhdHRyMiA9IHNlY3Rpb24uZ2V0QXR0cmlidXRlKGF0dHIyS2V5KS5nZXROYW1lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiRmlyc3QgYXR0cmlidXRlIG5hbWUgdW5leHBlY3RlZCIsICJUZXN0QXR0cjIiLCBhdHRyMSk7CkBAIC0zNjIsMTQgKzM0MywxMCBAQAogICAgIC8qKgogICAgICAqIGZpbGUgYXR0cmlidXRlIGZvciBtYW5pZmVzdCB0YXNrIGlzIHJlcXVpcmVkLgogICAgICAqLwotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb0ZpbGUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBmaWxlIGlzIHJlcXVpcmVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb0ZpbGUiKTsKKyAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIC8qKgpAQCAtMzkxLDg1ICszNjgsNzcgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVcGRhdGUiKTsKICAgICAgICAgTWFuaWZlc3QgbWYgPSBnZXRNYW5pZmVzdChuZXcgRmlsZShvdXREaXIsICJtZnRlc3QubWYiKSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwobWYpOwotICAgICAgICBhc3NlcnRUcnVlKCFNYW5pZmVzdC5nZXREZWZhdWx0TWFuaWZlc3QoKS5lcXVhbHMobWYpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKE1hbmlmZXN0LmdldERlZmF1bHRNYW5pZmVzdCgpLCBtZik7CiAgICAgICAgIFN0cmluZyBtZkFzU3RyaW5nID0gbWYudG9TdHJpbmcoKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZkFzU3RyaW5nKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtZkFzU3RyaW5nLnN0YXJ0c1dpdGgoIk1hbmlmZXN0LVZlcnNpb246IDIuMCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtZkFzU3RyaW5nLmNvbnRhaW5zKCJGb286IEJhciIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZkFzU3RyaW5nLCBzdGFydHNXaXRoKCJNYW5pZmVzdC1WZXJzaW9uOiAyLjAiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWZBc1N0cmluZywgY29udGFpbnNTdHJpbmcoIkZvbzogQmFyIikpOwogCiAgICAgICAgIG1mID0gZ2V0TWFuaWZlc3QobmV3IEZpbGUob3V0RGlyLCAibWZ0ZXN0Mi5tZiIpKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChtZik7CiAgICAgICAgIG1mQXNTdHJpbmcgPSBtZi50b1N0cmluZygpOwogICAgICAgICBhc3NlcnROb3ROdWxsKG1mQXNTdHJpbmcpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG1mQXNTdHJpbmcuaW5kZXhPZigiRm9vOiBCYXIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUobWZBc1N0cmluZy5jb250YWlucygiRm9vOiBCYXoiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWZBc1N0cmluZywgY29udGFpbnNTdHJpbmcoIkZvbzogQmF6IikpOworICAgICAgICBhc3NlcnRUaGF0KG1mQXNTdHJpbmcsIG5vdChjb250YWluc1N0cmluZygiRm9vOiBCYXIiKSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZyb20oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RnJvbSIpOwotICAgICAgICBhc3NlcnRDb250YWlucyhNYW5pZmVzdC5FUlJPUl9GUk9NX0ZPUkJJRERFTiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKE1hbmlmZXN0LkVSUk9SX0ZST01fRk9SQklEREVOKSk7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlOiBtYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnICcKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsTmFtZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbE5hbWUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnICciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElsbGVnYWxOYW1lIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlOiBtYW5pZmVzdCBzZWN0aW9uIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJyAnCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbE5hbWVJblNlY3Rpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElsbGVnYWxOYW1lSW5TZWN0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJyAnIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJbGxlZ2FsTmFtZUluU2VjdGlvbiIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZTogbWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IGJlZ2luIHdpdGggJy0nCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbE5hbWVCZWdpbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbE5hbWVJblNlY3Rpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3Qgc3RhcnQgd2l0aCAnLScgYXQgdGhlIGJlZ2luLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbE5hbWVJblNlY3Rpb24iKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmU6IG1hbmlmZXN0IGF0dHJpYnV0ZSBuYW1lcyBtdXN0IG5vdCBjb250YWluICcuJworICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdElsbGVnYWxOYW1lMigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbE5hbWUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBNYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnLiciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElsbGVnYWxOYW1lIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlOiBtYW5pZmVzdCBhdHRyaWJ1dGUgbmFtZXMgbXVzdCBub3QgY29udGFpbiAnKicKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsTmFtZTMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElsbGVnYWxOYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogTWFuaWZlc3QgYXR0cmlidXRlIG5hbWVzIG11c3Qgbm90IGNvbnRhaW4gJyonIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KLSAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SWxsZWdhbE5hbWUiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKKyAgICAgfQogCiAgICAgLyoqCiAgICAgICogUmVhZHMgbWZ0ZXN0Lm1mLgogICAgICAqLwogICAgIHByaXZhdGUgTWFuaWZlc3QgZ2V0TWFuaWZlc3QoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1hbmlmZXN0RXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZVJlYWRlciByID0gbmV3IEZpbGVSZWFkZXIoZmlsZSk7Ci0gICAgICAgIHRyeSB7CisgICAgICAgIHRyeSAoRmlsZVJlYWRlciByID0gbmV3IEZpbGVSZWFkZXIoZmlsZSkpIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgTWFuaWZlc3Qocik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICByLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTWtkaXJUZXN0LmphdmEKaW5kZXggOTg2NGE0YS4uZTE0Y2NiMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01rZGlyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Na2RpclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE0ICsxOSwxNCBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KIC8qKgogICovCiBwdWJsaWMgY2xhc3MgTWtkaXJUZXN0IHsKQEAgLTM5LDM0ICszOSwyNyBAQAogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvbWtkaXIueG1sIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byByZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0aW5nIGFzIGEgZmlsZQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgYXMgYSBmaWxlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CiAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdGRpci50bXAiKTsKLSAgICAgICAgaWYgKCFmLmV4aXN0cygpIHx8ICFmLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgIGZhaWwoIm1rZGlyIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZi5kZWxldGUoKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJta2RpciBmYWlsZWQiLCBmLmV4aXN0cygpICYmIGYuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIGYuZGVsZXRlKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL01vdmVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZVRlc3QuamF2YQppbmRleCA5ZjVhNzk5Li40YTBiYTc5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTW92ZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgpAQCAtNjUsNTkgKzY2LDU5IEBACiAKICAgICAvKiogQnVnemlsbGEgUmVwb3J0IDExNzMyICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3J5UmVtb3ZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVJlbW92YWwoKSB7CiAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3REaXJlY3RvcnlSZW1vdmFsIik7CiAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghbmV3IEZpbGUob3V0cHV0LCJFL0IvMSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUob3V0cHV0LCAiRS9CLzEiKS5leGlzdHMoKSk7CiAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiRS9DLzIiKS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCJFL0QvMyIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsIkEvQi8xIikuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCFuZXcgRmlsZShvdXRwdXQsIkEvQy8yIikuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCFuZXcgRmlsZShvdXRwdXQsIkEvRC8zIikuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCFuZXcgRmlsZShvdXRwdXQsIkEvQyIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghbmV3IEZpbGUob3V0cHV0LCJBL0QiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiRS9ELzMiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiQS9CLzEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKG91dHB1dCwgIkEvQy8yIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShvdXRwdXQsICJBL0QvMyIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUob3V0cHV0LCAiQS9DIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShvdXRwdXQsICJBL0QiKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgLyoqIEJ1Z3ppbGxhIFJlcG9ydCAxODg4NiAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVJldGFpbmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVJldGFpbmluZygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3REaXJlY3RvcnlSZXRhaW5pbmciKTsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwiRSIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsIkUvMSIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghbmV3IEZpbGUob3V0cHV0LCJBLzEiKS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCJBIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwgIkUiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiRS8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShvdXRwdXQsICJBLzEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiQSIpLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoKSB7CiAgICAgICAgIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUoInRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0ZURpcmVjdG9yeU1vdmUyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlMigpIHsKICAgICAgICAgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZSgidGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZTIiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdGVzdENvbXBsZXRlRGlyZWN0b3J5TW92ZShTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29tcGxldGVEaXJlY3RvcnlNb3ZlKFN0cmluZyB0YXJnZXQpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwiRSIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsIkUvMSIpLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghbmV3IEZpbGUob3V0cHV0LCJBLzEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCAiRSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsICJFLzEiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKG91dHB1dCwgIkEvMSIpLmV4aXN0cygpKTsKICAgICAgICAgLy8gPHBhdGg+IHN3YWxsb3dzIHRoZSBiYXNlZGlyLCBpdCBzZWVtcwotICAgICAgICAvL2Fzc2VydFRydWUoIW5ldyBGaWxlKGdldE91dHB1dERpcigpLCJBIikuZXhpc3RzKCkpOworICAgICAgICAvL2Fzc2VydEZhbHNlKG5ldyBGaWxlKGdldE91dHB1dERpcigpLCAiQSIpLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoRWxlbWVudE1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoRWxlbWVudE1vdmUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0aEVsZW1lbnRNb3ZlIik7CiAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsIkUiKS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUob3V0cHV0LCJFLzEiKS5leGlzdHMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIW5ldyBGaWxlKG91dHB1dCwiQS8xIikuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwiQSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShvdXRwdXQsICJFIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwgIkUvMSIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUob3V0cHV0LCAiQS8xIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKG91dHB1dCwgIkEiKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NdWx0aU1hcFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9NdWx0aU1hcFRlc3QuamF2YQppbmRleCAyMjczZWYyLi4xNTFhY2QyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTXVsdGlNYXBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL011bHRpTWFwVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL05pY2VUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZVRlc3QuamF2YQppbmRleCA2MzVjMmQ1Li4xOGFkZDVhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvTmljZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDkgKzIzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiB0ZXN0IG5pY2UKQEAgLTM1LDYgKzMzLDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9uaWNlLnhtbCIpOwpAQCAtNjIsMjIgKzYzLDE2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUb29TbG93KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRvb19zbG93Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygib3V0IG9mIHRoZSByYW5nZSAxLTEwIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIm91dCBvZiB0aGUgcmFuZ2UgMS0xMCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidG9vX3Nsb3ciKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUb29GYXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRvb19mYXN0Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygib3V0IG9mIHRoZSByYW5nZSAxLTEwIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIm91dCBvZiB0aGUgcmFuZ2UgMS0xMCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidG9vX2Zhc3QiKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXJhbGxlbFRlc3QuamF2YQppbmRleCAwZGE1OTc4Li5jM2YyOThhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGFyYWxsZWxUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhcmFsbGVsVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsOSArMjcsMTIgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc1Byb3BlcnR5OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgogICogVGVzdCBvZiB0aGUgcGFyYWxsZWwgVGFza0NvbnRhaW5lcgpAQCAtMzksNiArNDIsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGJhc2ljIHRlc3QgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RfTUVTU0FHRSA9ICJkaXJlY3QiOwogICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGJhc2ljIGFuZCBmYWlsIHRlc3QgKi8KQEAgLTQ2LDIwICs1MiwxOCBAQAogICAgIC8qKiBTdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIGZhaWwgdGVzdCAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBSUxVUkVfTUVTU0FHRSA9ICJmYWlsdXJlIjsKIAotICAgIC8qKiB0aGUgYnVpbGQgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0ICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9CVUlMRF9GSUxFID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbCI7Ci0KKyAgICBwcml2YXRlIFByb2plY3QgcDsKICAgICAvKiogVGhlIEpVbml0IHNldHVwIG1ldGhvZCAqLwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoVEVTVF9CVUlMRF9GSUxFKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3BhcmFsbGVsLnhtbCIpOworICAgICAgICBwID0gYnVpbGRSdWxlLmdldFByb2plY3QoKTsKICAgICB9CiAKICAgICAvKiogdGVzdHMgYmFzaWMgb3BlcmF0aW9uIG9mIHRoZSBwYXJhbGxlbCB0YXNrICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWMoKSB7CiAgICAgICAgIC8vIHNob3VsZCBnZXQgbm8gb3V0cHV0IGF0IGFsbAotICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5kaXJlY3QiLCBESVJFQ1RfTUVTU0FHRSk7CiAgICAgICAgIHAuc2V0VXNlclByb3BlcnR5KCJ0ZXN0LmRlbGF5ZWQiLCBERUxBWUVEX01FU1NBR0UpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEJhc2ljIik7CkBAIC03NSw3ICs3OSw2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkQ291bnQoKSB7CiAgICAgICAgIC8vIHNob3VsZCBnZXQgbm8gb3V0cHV0IGF0IGFsbAotICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5kaXJlY3QiLCBESVJFQ1RfTUVTU0FHRSk7CiAgICAgICAgIHAuc2V0VXNlclByb3BlcnR5KCJ0ZXN0LmRlbGF5ZWQiLCBERUxBWUVEX01FU1NBR0UpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFRocmVhZENvdW50Iik7CkBAIC0xMDAsNyArMTAzLDcgQEAKICAgICAgICAgaW50IGZpcnN0UGlwZSA9IHMuaW5kZXhPZignfCcsIHN0YXJ0KTsKICAgICAgICAgaW50IGJlZ2luU2xhc2ggPSBzLmluZGV4T2YoJy8nLCBmaXJzdFBpcGUpOwogICAgICAgICBpbnQgbGFzdFBpcGUgPSBzLmluZGV4T2YoJ3wnLCBiZWdpblNsYXNoKTsKLSAgICAgICAgaWYgKChmaXJzdFBpcGUgPT0gLTEpIHx8IChiZWdpblNsYXNoID09IC0xKSB8fCAobGFzdFBpcGUgPT0gLTEpKSB7CisgICAgICAgIGlmIChmaXJzdFBpcGUgPT0gLTEgfHwgYmVnaW5TbGFzaCA9PSAtMSB8fCBsYXN0UGlwZSA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKQEAgLTEwOCw2ICsxMTEsOSBAQAogICAgICAgICBpbnQgY3VycmVudCA9IDA7CiAgICAgICAgIGludCBwb3MgPSBiZWdpblNsYXNoICsgMTsKICAgICAgICAgd2hpbGUgKHBvcyA8IGxhc3RQaXBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJPbmx5IGV4cGVjdCAnKy0nIGluIHJlc3VsdCBjb3VudCwgZm91bmQgIiArIHMuY2hhckF0KHBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXQgcG9zaXRpb24gIiArIChwb3MgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgcy5jaGFyQXQocG9zKSA9PSAnKycgfHwgcy5jaGFyQXQocG9zKSA9PSAnLScpOwogICAgICAgICAgICAgc3dpdGNoIChzLmNoYXJBdChwb3MrKykpIHsKICAgICAgICAgICAgICAgICBjYXNlICcrJzoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCsrOwpAQCAtMTE2LDEzICsxMjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0tOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBmYWlsKCJPbmx5IGV4cGVjdCAnKy0nIGluIHJlc3VsdCBjb3VudCwgZm91bmQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy5jaGFyQXQoLS1wb3MpICsgIiBhdCBwb3NpdGlvbiAiICsgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY3VycmVudCA+IG1heCkgewotICAgICAgICAgICAgICAgIGZhaWwoIk51bWJlciBvZiBleGVjdXRpbmcgdGhyZWFkcyBleGNlZWRlZCBudW1iZXIgYWxsb3dlZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgKyBjdXJyZW50ICsgIiA+ICIgKyBtYXgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTnVtYmVyIG9mIGV4ZWN1dGluZyB0aHJlYWRzIGV4Y2VlZGVkIG51bWJlciBhbGxvd2VkOiAiCisgICAgICAgICAgICAgICAgICAgICsgY3VycmVudCArICIgPiAiICsgbWF4LCBjdXJyZW50IDw9IG1heCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGxhc3RQaXBlOwogICAgIH0KQEAgLTEzMiwyMSArMTM1LDE2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbCgpIHsKICAgICAgICAgLy8gc2hvdWxkIGdldCBubyBvdXRwdXQgYXQgYWxsCi0gICAgICAgIFByb2plY3QgcCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShGQUlMVVJFX01FU1NBR0UpOwogICAgICAgICBwLnNldFVzZXJQcm9wZXJ0eSgidGVzdC5mYWlsdXJlIiwgRkFJTFVSRV9NRVNTQUdFKTsKICAgICAgICAgcC5zZXRVc2VyUHJvcGVydHkoInRlc3QuZGVsYXllZCIsIERFTEFZRURfTUVTU0FHRSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZhaWwiKTsKLSAgICAgICAgICAgIGZhaWwoImZhaWwgdGFzayBpbiBvbmUgcGFyYWxsZWwgYnJhbmNoIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoRkFJTFVSRV9NRVNTQUdFLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmFpbCIpOwogICAgIH0KIAogICAgIC8qKiB0ZXN0cyB0aGUgZGVtdXhpbmcgb2Ygb3V0cHV0IHN0cmVhbXMgaW4gYSBtdWx0aXRocmVhZGVkIHNpdHVhdGlvbiAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlbXV4KCkgewotICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgICAgICBwLmFkZFRhc2tEZWZpbml0aW9uKCJkZW11eHRlc3QiLCBEZW11eE91dHB1dFRhc2suY2xhc3MpOwogICAgICAgICBzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKICAgICAgICAgICAgIFByaW50U3RyZWFtIG91dCA9IFN5c3RlbS5vdXQ7CkBAIC0xNjQsMjkgKzE2MiwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTU1NTM5IgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTU1MzkiPmJ1ZyA1NTUzOTwvYT4KICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVFeGl0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW5nbGVFeGl0Iik7Ci0gICAgICAgICAgICBmYWlsKCJFeGl0U3RhdHVzRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4aXRTdGF0dXNFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MiwgZXguZ2V0U3RhdHVzKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoRXhpdFN0YXR1c0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3QoaGFzUHJvcGVydHkoInN0YXR1cyIsIGVxdWFsVG8oNDIpKSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2luZ2xlRXhpdCIpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBzZWUgImh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTU1NTM5IgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTU1MzkiPmJ1ZyA1NTUzOTwvYT4KICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGl0QW5kT3RoZXJFeGNlcHRpb24oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV4aXRBbmRPdGhlckV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgZmFpbCgiRXhpdFN0YXR1c0V4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biIpOwotICAgICAgICB9IGNhdGNoIChFeGl0U3RhdHVzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDIsIGV4LmdldFN0YXR1cygpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEV4aXRTdGF0dXNFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJzdGF0dXMiLCBlcXVhbFRvKDQyKSkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEV4aXRBbmRPdGhlckV4Y2VwdGlvbiIpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1BhdGhDb252ZXJ0VGVzdC5qYXZhCmluZGV4IGYyOWRjMTIuLmNmOWJiNWQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QYXRoQ29udmVydFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUGF0aENvbnZlcnRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMywxMyArMzMsMTEgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfUEFUSCA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy8iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFTkFNRSA9ICJwYXRoY29udmVydC54bWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRF9GSUxFID0gQlVJTERfUEFUSCArIEJVSUxEX0ZJTEVOQU1FOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChCVUlMRF9GSUxFKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzLyIgKyBCVUlMRF9GSUxFTkFNRSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QcmVTZXREZWZUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJlU2V0RGVmVGVzdC5qYXZhCmluZGV4IDY1YjY2YTQuLjYxYzhmYTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9QcmVTZXREZWZUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ByZVNldERlZlRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDEwICsyNSw5IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqLwpAQCAtMzcsNiArMzYsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3ByZXNldGRlZi54bWwiKTsKQEAgLTk4LDIyICsxMDAsMTYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RUYXNrTmFtZUJhZEF0dHIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29ycmVjdF90YXNrbmFtZV9iYWRhdHRyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogYXR0cmlidXRlIG1lc3NhZ2UiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJqYXZhYyBkb2Vzbid0IHN1cHBvcnQgdGhlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImphdmFjIGRvZXNuJ3Qgc3VwcG9ydCB0aGUiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvcnJlY3RfdGFza25hbWVfYmFkYXR0ciIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RUYXNrTmFtZUJhZEVsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvcnJlY3RfdGFza25hbWVfYmFkZWwiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBlbGVtZW50IG1lc3NhZ2UiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJqYXZhYyBkb2Vzbid0IHN1cHBvcnQgdGhlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImphdmFjIGRvZXNuJ3Qgc3VwcG9ydCB0aGUiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvcnJlY3RfdGFza25hbWVfYmFkZWwiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb2Nlc3NEZXN0cm95ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llclRlc3QuamF2YQppbmRleCBlYWRhYzQwLi43MWQxMDVmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvY2Vzc0Rlc3Ryb3llclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm9wZXJ0eVRlc3QuamF2YQppbmRleCAxNmM0ZDhhLi4yOWJmNTE2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUHJvcGVydHlUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3BlcnR5VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTkgKzE4LDIwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lTm9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljTmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKi8KQEAgLTM5LDggKzQwLDggQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLSAgICAvKiogVXRpbGl0aWVzIHVzZWQgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKQEAgLTU5LDM1ICs2MCwzMyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICBhc3NlcnRDb250YWlucygidGVzdHByb3AxPWFhLCB0ZXN0cHJvcDM9eHh5eSwgdGVzdHByb3A0PWFhenoiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3Rwcm9wMT1hYSwgdGVzdHByb3AzPXh4eXksIHRlc3Rwcm9wND1hYXp6IikpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIGNpcmN1bGFyIGRlZmluaXRpb24KKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJEaWQgbm90IHRocm93IGV4Y2VwdGlvbiBvbiBjaXJjdWxhciBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2lyY3VsYXIgZGVmaW5pdGlvbiBub3QgZGV0ZWN0ZWQgLSAiLAotICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKS5jb250YWlucygid2FzIGNpcmN1bGFybHkgZGVmaW5lZCIpKTsKLSAgICAgICAgfQotCisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgid2FzIGNpcmN1bGFybHkgZGVmaW5lZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImh0dHAudXJsIGlzIGh0dHA6Ly9sb2NhbGhvc3Q6OTk5IiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJodHRwLnVybCBpcyBodHRwOi8vbG9jYWxob3N0Ojk5OSIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewotICAgICAgICBTdHJpbmcgYmFzZURpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImJhc2VkaXIiKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9IEZJTEVfVVRJTFMudG9VUkkoYmFzZURpciArICIvcHJvcGVydHkzLnByb3BlcnRpZXMiKTsKKyAgICAgICAgU3RyaW5nIGJhc2VEaXIgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuUFJPSkVDVF9CQVNFRElSKTsKKyAgICAgICAgU3RyaW5nIHVyaSA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS50b1VSSShiYXNlRGlyICsgIi9wcm9wZXJ0eTMucHJvcGVydGllcyIpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldE5ld1Byb3BlcnR5KCJ0ZXN0NS51cmwiLCB1cmkpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiaHR0cC51cmwgaXMgaHR0cDovL2xvY2FsaG9zdDo5OTkiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoImh0dHAudXJsIGlzIGh0dHA6Ly9sb2NhbGhvc3Q6OTk5IikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC05NiwzMiArOTUsMzAgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCI4MCIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInNlcnZlcjEuaHR0cC5wb3J0IikpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIHByZWZpeCBhbGxvd2VkIG9ubHkgbm9uLXJlc291cmNlL2ZpbGUgbG9hZAorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeEZhaWx1cmUoKSB7Ci0gICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJwcmVmaXguZmFpbCIpOwotICAgICAgICAgICAgZmFpbCgiRGlkIG5vdCB0aHJvdyBleGNlcHRpb24gb24gaW52YWxpZCB1c2Ugb2YgcHJlZml4Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJQcmVmaXggYWxsb3dlZCBvbiBub24tcmVzb3VyY2UvZmlsZSBsb2FkIC0gIiwKLSAgICAgICAgICAgICAgICAgICAgICJQcmVmaXggaXMgb25seSB2YWxpZCIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlByZWZpeCBpcyBvbmx5IHZhbGlkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJwcmVmaXguZmFpbCIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIGNpcmN1bGFyIGRlZmluaXRpb24KKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q2lyY3VsYXJSZWZlcmVuY2UiKTsKLSAgICAgICAgICAgIGZhaWwoIkRpZCBub3QgdGhyb3cgZXhjZXB0aW9uIG9uIGNpcmN1bGFyIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiQ2lyY3VsYXIgZGVmaW5pdGlvbiBub3QgZGV0ZWN0ZWQgLSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXMgY2lyY3VsYXJseSBkZWZpbmVkIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgid2FzIGNpcmN1bGFybHkgZGVmaW5lZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENpcmN1bGFyUmVmZXJlbmNlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGhpc0lzTm90QUNpcmN1bGFyUmVmZXJlbmNlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGhpc0lzTm90QUNpcmN1bGFyUmVmZXJlbmNlIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJiIGlzIEEvQS9BIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJiIGlzIEEvQS9BIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjksMTIgKzEyNiwxMSBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5sYW5nLkl0ZXJhYmxlIik7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQXNzdW1lLmFzc3VtZU5vRXhjZXB0aW9uKCJYTUwgTG9hZGluZyBvbmx5IG9uIEphdmEgNSsiLCBlKTsKKyAgICAgICAgICAgIGFzc3VtZU5vRXhjZXB0aW9uKCJYTUwgTG9hZGluZyBvbmx5IG9uIEphdmEgNSsiLCBlKTsKICAgICAgICAgfQogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFhtbFByb3BlcnR5Iik7CiAgICAgICAgIGFzc2VydEVxdWFscygiT05FIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgieG1sLm9uZSIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUV08iLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ4bWwudHdvIikpOwotCiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Qcm90ZWN0ZWRKYXJNZXRob2RzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3RlY3RlZEphck1ldGhvZHNUZXN0LmphdmEKaW5kZXggYzgzYTc3Mi4uYzNjYTZhMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3RlY3RlZEphck1ldGhvZHNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Byb3RlY3RlZEphck1ldGhvZHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSwxNSArMjEsMTggQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc0l0ZW07CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqLwpAQCAtMzcsOCArNDAsNiBAQAogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0ZW1wSmFyID0gInRtcC5qYXIiOwotCiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CkBAIC00OSw5ICs1MCwxMCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdyYWJGaWxlc0FuZERpcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEluZGV4VGVzdHMiKTsKKyAgICAgICAgU3RyaW5nIHRlbXBKYXIgPSAidG1wLmphciI7CiAgICAgICAgIFN0cmluZyBhcmNoaXZlID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSh0ZW1wSmFyKTsKLSAgICAgICAgQXJyYXlMaXN0IGRpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIEFycmF5TGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGRpcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRGlycyA9IG5ldyBTdHJpbmdbXSB7CiAgICAgICAgICAgICAiTUVUQS1JTkYvIiwKICAgICAgICAgICAgICJzdWIvIiwKQEAgLTYwLDE2ICs2MiwxNCBAQAogICAgICAgICAgICAgImZvbyIsCiAgICAgICAgIH07CiAgICAgICAgIEphci5ncmFiRmlsZXNBbmREaXJzKGFyY2hpdmUsIGRpcnMsIGZpbGVzKTsKKwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWREaXJzLmxlbmd0aCwgZGlycy5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkRGlycy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgIiArIGV4cGVjdGVkRGlyc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGlycy5jb250YWlucyhleHBlY3RlZERpcnNbaV0pKTsKLSAgICAgICAgfQorICAgICAgICBBcnJheXMuc3RyZWFtKGV4cGVjdGVkRGlycykuZm9yRWFjaChleHBlY3RlZERpciAtPiBhc3NlcnRUaGF0KCJGb3VuZCAiICsgZXhwZWN0ZWREaXIsCisgICAgICAgICAgICAgICAgZGlycywgaGFzSXRlbShleHBlY3RlZERpcikpKTsKKwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlcy5sZW5ndGgsIGZpbGVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRGaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRm91bmQgIiArIGV4cGVjdGVkRmlsZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zKGV4cGVjdGVkRmlsZXNbaV0pKTsKLSAgICAgICAgfQorICAgICAgICBBcnJheXMuc3RyZWFtKGV4cGVjdGVkRmlsZXMpLmZvckVhY2goZXhwZWN0ZWRGaWxlIC0+IGFzc2VydFRoYXQoIkZvdW5kICIgKyBleHBlY3RlZEZpbGUsCisgICAgICAgICAgICAgICAgZmlsZXMsIGhhc0l0ZW0oZXhwZWN0ZWRGaWxlKSkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC04MSwyNiArODEsMjMgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbmRKYXJOYW1lTm9NYXRjaCgpIHsKLSAgICAgICAgYXNzZXJ0TnVsbChKYXIuZmluZEphck5hbWUoImZvbyIsIG5ldyBTdHJpbmdbXSB7ImJhciJ9KSk7CisgICAgICAgIGFzc2VydE51bGwoSmFyLmZpbmRKYXJOYW1lKCJmb28iLCBuZXcgU3RyaW5nW10geyAiYmFyIiB9KSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZEphck5hbWVTaW1wbGVNYXRjaGVzKCkgewotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIEphci5maW5kSmFyTmFtZSgiZm9vIiwgbmV3IFN0cmluZ1tdIHsiZm9vIn0pKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWIvZm9vIiwgSmFyLmZpbmRKYXJOYW1lKCJmb28iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsibGliL2ZvbyJ9KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmFyLmZpbmRKYXJOYW1lKCJiYXIiICsgRmlsZS5zZXBhcmF0b3JDaGFyICsgImZvbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImZvbyJ9KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmFyLmZpbmRKYXJOYW1lKCJmb28iLCBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibGliL2ZvbyIsCi0gICAgICAgICAgICAgICAgICAgICBKYXIuZmluZEphck5hbWUoImJhciIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyJsaWIvZm9vIn0pKTsKKyAgICAgICAgICAgIEphci5maW5kSmFyTmFtZSgiZm9vIiwgbmV3IFN0cmluZ1tdIHsgImxpYi9mb28iIH0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBKYXIuZmluZEphck5hbWUoImJhciIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZm9vIiwKKyAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJsaWIvZm9vIiwgSmFyLmZpbmRKYXJOYW1lKAorICAgICAgICAgICAgImJhciIgKyBGaWxlLnNlcGFyYXRvckNoYXIgKyAiZm9vIiwgbmV3IFN0cmluZ1tdIHsgImxpYi9mb28iIH0pKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kSmFyTmFtZUxvbmdlc3RNYXRjaFdpbnMoKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscygibGliL2ZvbyIsCi0gICAgICAgICAgICAgICAgICAgICBKYXIuZmluZEphck5hbWUoImxpYi9mb28iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7ImZvbyIsICJsaWIvZm9vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWIvYmFyL2ZvbyJ9KSk7CisgICAgICAgIGFzc2VydEVxdWFscygibGliL2ZvbyIsIEphci5maW5kSmFyTmFtZSgibGliL2ZvbyIsCisgICAgICAgICAgICBuZXcgU3RyaW5nW10geyAiZm9vIiwgImxpYi9mb28iLCAibGliL2Jhci9mb28iIH0pKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVjb3JkZXJUZXN0LmphdmEKaW5kZXggZmI2ZjExOC4uODg4NzRkNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlY29yZGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZWNvcmRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVuYW1lVGVzdC5qYXZhCmluZGV4IGNhMzc3OTkuLjlmZWM0NWQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZW5hbWVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JlbmFtZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI0LDggKzI0LDYgQEAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KIHB1YmxpYyBjbGFzcyBSZW5hbWVUZXN0IHsKIAogICAgIEBSdWxlCkBAIC0zNiw0MyArMzQsMzcgQEAKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JlbmFtZS54bWwiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bjogIHJlcXVpcmVkIGFyZ3VtZW50IG1pc3NpbmciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQotICAgIH0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bjogcmVxdWlyZWQgYXJndW1lbnQgbWlzc2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9Ci0gICAgfQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duOiByZXF1aXJlZCBhcmd1bWVudCBtaXNzaW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIHJlcXVpcmVkIGFyZ3VtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIHNvdXJjZSBzYW1lIGFzIGRlc3RpbmF0aW9uCisgICAgICovCiAgICAgQElnbm9yZSgiUHJldmlvdXNseSBjb21tZW50ZWQgb3V0IikKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93bjogc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0aGUgc2FtZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUmVwbGFjZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhCmluZGV4IDRhOTY5MWUuLjY2YmEzNTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SZXBsYWNlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMTEgKzIwLDkgQEAKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwpAQCAtMzUsNyArMzMsNiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiAvKioKQEAgLTUxLDQ0ICs0OCw0MCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWw6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBGYWlsOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWw6IGVtcHR5IHRva2VuIG5vdCBhbGxvd2VkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IGVtcHR5IHRva2VuIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTk2LDI0ICs4OSwyMiBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWw6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q2KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbDogZW1wdHkgdG9rZW4gbm90IGFsbG93ZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q3KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogZW1wdHkgdG9rZW4gbm90IGFsbG93ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTIzLDE0ICsxMTQsMTMgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwogICAgICAgICBhc3NlcnRFcXVhbENvbnRlbnQobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCAicmVzdWx0LnR4dCIpLAogICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJvdXRwdXQudHh0IikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJlc2VydmVMYXN0TW9kaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9QcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhc3RNb2RpZmllZFNldHVwIik7CiAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJ0ZXN0LnR4dCIpOwogICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUiLApAQCAtMTQxLDQxICsxMzEsMjcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhc3RNb2RpZmllZFNldHVwIik7CiAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJ0ZXN0LnR4dCIpOwogICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUiLAogICAgICAgICAgICAgICAgIHRlc3RGaWxlLnNldExhc3RNb2RpZmllZCh0ZXN0RmlsZS5sYXN0TW9kaWZpZWQoKSAtIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDUpKTsKICAgICAgICAgbG9uZyB0czEgPSB0ZXN0RmlsZS5sYXN0TW9kaWZpZWQoKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQcmVzZXJ2ZSIpOwotICAgICAgICBhc3NlcnRUcnVlKHRzMSA9PSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJ0ZXN0LnR4dCIpLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRzMSwgbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCAidGVzdC50eHQiKS5sYXN0TW9kaWZpZWQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0RXF1YWxDb250ZW50KEZpbGUgZXhwZWN0LCBGaWxlIHJlc3VsdCkKLSAgICAgICAgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yLCBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghcmVzdWx0LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBmaWxlICIgKyByZXN1bHQgKyAiIGRvZXNuXCd0IGV4aXN0Iik7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRFcXVhbENvbnRlbnQoRmlsZSBleHBlY3QsIEZpbGUgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmaWxlICIgKyByZXN1bHQgKyAiIGRvZXNuJ3QgZXhpc3QiLCByZXN1bHQuZXhpc3RzKCkpOwogCi0gICAgICAgIElucHV0U3RyZWFtIGluRXhwZWN0ID0gbnVsbDsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5SZXN1bHQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgaW5FeHBlY3QgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGV4cGVjdCkpOwotICAgICAgICAgICAgaW5SZXN1bHQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdCkpOwotCisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5FeHBlY3QgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShleHBlY3QudG9QYXRoKCkpKTsKKyAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpblJlc3VsdCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKHJlc3VsdC50b1BhdGgoKSkpKSB7CiAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOwogICAgICAgICAgICAgd2hpbGUgKGV4cGVjdGVkQnl0ZSAhPSAtMSkgewogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJ5dGUsIGluUmVzdWx0LnJlYWQoKSk7CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRCeXRlID0gaW5FeHBlY3QucmVhZCgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFbmQgb2YgZmlsZSIsIC0xLCBpblJlc3VsdC5yZWFkKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGluUmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpblJlc3VsdC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGluRXhwZWN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbkV4cGVjdC5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNBZHZhbmNlZFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljQWR2YW5jZWRUZXN0LmphdmEKaW5kZXggNGNhNGZlMi4uM2I3OGI4MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNBZHZhbmNlZFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvUm1pY0FkdmFuY2VkVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMjAgKzE5LDIxIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLlJtaWNBZGFwdGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLkRlZmF1bHRSbWljQWRhcHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLlJtaWNBZGFwdGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogLyoqCiAgKiBEYXRlOiAwNC1BdWctMjAwNApAQCAtNDAsMjQgKzQxLDI1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBSbWljQWR2YW5jZWRUZXN0IHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvcm1pYy8iOwotCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgLyoqCiAgICAgICogVGhlIEpVbml0IHNldHVwIG1ldGhvZAogICAgICAqLwogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAicm1pYy54bWwiKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3JtaWMvcm1pYy54bWwiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB2ZXJpZnkgdGhhdCAiZGVmYXVsdCIgYmluZHMgdXMgdG8gdGhlIGRlZmF1bHQgY29tcGlsZXIKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RGVmYXVsdCIpOwogICAgIH0KIApAQCAtNjUsNyArNjcsNyBAQAogICAgICAqIHZlcmlmeSB0aGF0ICJkZWZhdWx0IiBiaW5kcyB1cyB0byB0aGUgZGVmYXVsdCBjb21waWxlcgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHREZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERlZmF1bHREZXN0Iik7CiAgICAgfQogCkBAIC03Myw3ICs3NSw3IEBACiAgICAgICogdmVyaWZ5IHRoYXQgIiIgYmluZHMgdXMgdG8gdGhlIGRlZmF1bHQgY29tcGlsZXIKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFbXB0eSIpOwogICAgIH0KIApAQCAtODEsNyArODMsNyBAQAogICAgICAqIHZlcmlmeSB0aGF0ICIiIGJpbmRzIHVzIHRvIHRoZSBkZWZhdWx0IGNvbXBpbGVyCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RGVzdCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFbXB0eURlc3QiKTsKICAgICB9CiAKQEAgLTg5LDcgKzkxLDcgQEAKICAgICAgKiB0ZXN0IHN1bidzIHJtaWMgY29tcGlsZXIKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSbWljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFJtaWMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Um1pYyIpOwogICAgIH0KIApAQCAtOTcsNyArOTksNyBAQAogICAgICAqIHRlc3Qgc3VuJ3Mgcm1pYyBjb21waWxlcgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJtaWNEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFJtaWNEZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJtaWNEZXN0Iik7CiAgICAgfQogCkBAIC0xMDYsNyArMTA4LDcgQEAKICAgICAgKiBvdXQgLUogYXJndW1lbnRzIHdoZW4gbm90IGZvcmtpbmcKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSbWljSkFyZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RSbWljSkFyZygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSbWljSkFyZyIpOwogICAgIH0KIApAQCAtMTE1LDcgKzExNyw3IEBACiAgICAgICogb3V0IC1KIGFyZ3VtZW50cyB3aGVuIG5vdCBmb3JraW5nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Um1pY0pBcmdEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFJtaWNKQXJnRGVzdCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSbWljSkFyZ0Rlc3QiKTsKICAgICB9CiAKQEAgLTEyMyw3ICsxMjUsNyBAQAogICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEthZmZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEthZmZlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEthZmZlIik7CiAgICAgfQogCkBAIC0xMzEsNyArMTMzLDcgQEAKICAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLYWZmZURlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2FmZmVEZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEthZmZlRGVzdCIpOwogICAgIH0KIApAQCAtMTQxLDcgKzE0Myw3IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBASWdub3JlKCJXTFJtaWMgdGVzdHMgZG9uJ3Qgd29yayIpCi0gICAgcHVibGljIHZvaWQgWHRlc3RXbHJtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBYdGVzdFdscm1pYygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RXbHJtaWMiKTsKICAgICB9CiAKQEAgLTE1MCw3ICsxNTIsNyBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgQElnbm9yZSgiV0xSbWljIHRlc3RzIGRvbid0IHdvcmsiKQotICAgIHB1YmxpYyB2b2lkIFh0ZXN0V2xybWljSkFyZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIFh0ZXN0V2xybWljSkFyZygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RXbHJtaWNKQXJnIik7CiAgICAgfQogCkBAIC0xNTgsNyArMTYwLDcgQEAKICAgICAgKiB0ZXN0IHRoZSBmb3JraW5nIGNvbXBpbGVyCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ya2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JraW5nKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZvcmtpbmciKTsKICAgICB9CiAKQEAgLTE2Niw3ICsxNjgsNyBAQAogICAgICAqIHRlc3QgdGhlIGZvcmtpbmcgY29tcGlsZXIKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JraW5nQW50Q2xhc3NwYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmtpbmdBbnRDbGFzc3BhdGgoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Rm9ya2luZ0FudENsYXNzcGF0aCIpOwogICAgIH0KIApAQCAtMTc0LDcgKzE3Niw3IEBACiAgICAgICogdGVzdCB0aGUgZm9ya2luZyBjb21waWxlcgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZvcmtpbmdBbnRDbGFzc3BhdGhEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmtpbmdBbnRDbGFzc3BhdGhEZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZvcmtpbmdBbnRDbGFzc3BhdGhEZXN0Iik7CiAgICAgfQogCkBAIC0xODIsNyArMTg0LDcgQEAKICAgICAgKiB0ZXN0IHRoZSBmb3JraW5nIGNvbXBpbGVyCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QW50Q2xhc3NwYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEFudENsYXNzcGF0aCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RBbnRDbGFzc3BhdGgiKTsKICAgICB9CiAKQEAgLTE5MCw3ICsxOTIsNyBAQAogICAgICAqIHRlc3QgdGhlIGZvcmtpbmcgY29tcGlsZXIKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBbnRDbGFzc3BhdGhEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEFudENsYXNzcGF0aERlc3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0QW50Q2xhc3NwYXRoRGVzdCIpOwogICAgIH0KIApAQCAtMTk4LDIwICsyMDAsMTcgQEAKICAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEJhZE5hbWUiKTsKLSAgICAgICAgICAgIGZhaWwoIkNvbXBpbGUgbm90IGtub3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoUm1pY0FkYXB0ZXJGYWN0b3J5LkVSUk9SX1VOS05PV05fQ09NUElMRVIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTmFtZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKFJtaWNBZGFwdGVyRmFjdG9yeS5FUlJPUl9VTktOT1dOX0NPTVBJTEVSKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RCYWROYW1lIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogbG9hZCBhbiBhZGFwdGVyIGJ5IG5hbWUKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0Q2xhc3MoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RXhwbGljaXRDbGFzcyIpOwogICAgIH0KIApAQCAtMjE5LDQxICsyMTgsMjYgQEAKICAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdyb25nQ2xhc3MiKTsKLSAgICAgICAgICAgIGZhaWwoIkNsYXNzIG5vdCBhbiBSTUlDIGFkYXB0ZXIiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucyhSbWljQWRhcHRlckZhY3RvcnkuRVJST1JfTk9UX1JNSUNfQURBUFRFUiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0NsYXNzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoUm1pY0FkYXB0ZXJGYWN0b3J5LkVSUk9SX05PVF9STUlDX0FEQVBURVIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdyb25nQ2xhc3MiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmFkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZUZhbHNlKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTUiKSk7CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRCYWRDbGFzcygpIHsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgMTUgb3IgbmV3ZXIiLAorICAgICAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoUm1pYy5FUlJPUl9STUlDX0ZBSUxFRCk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERlZmF1bHRCYWRDbGFzcyIpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgdGhlIGNsYXNzIHRvIGZhaWwiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKFJtaWMuRVJST1JfUk1JQ19GQUlMRUQsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9kb250IGxvb2sgZm9yIG11Y2ggdGV4dCBoZXJlIGFzIGl0IGlzIHZlbmRvciBhbmQgdmVyc2lvbiBkZXBlbmRlbnQKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJ1bmltcGxlbWVudGVkLmNsYXNzIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYWdpY1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1hZ2ljUHJvcGVydHkiKTsKLSAgICAgICAgICAgIGZhaWwoIk1hZ2ljIHByb3BlcnR5IG5vdCB3b3JraW5nIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoUm1pY0FkYXB0ZXJGYWN0b3J5LkVSUk9SX1VOS05PV05fQ09NUElMRVIsIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBkb24ndCBsb29rIGZvciBtdWNoIHRleHQgaGVyZSBhcyBpdCBpcyB2ZW5kb3IgYW5kIHZlcnNpb24gZGVwZW5kZW50CisgICAgICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInVuaW1wbGVtZW50ZWQuY2xhc3MiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MSwyMjMgKzI0NSwyNjUgQEAKICAgICAgKiBBIHVuaXQgdGVzdCBmb3IgSlVuaXQKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYWdpY1Byb3BlcnR5T3ZlcnJpZGVzRW1wdHlTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TWFnaWNQcm9wZXJ0eU92ZXJyaWRlc0VtcHR5U3RyaW5nIik7Ci0gICAgICAgICAgICBmYWlsKCJNYWdpYyBwcm9wZXJ0eSBub3Qgd29ya2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKFJtaWNBZGFwdGVyRmFjdG9yeS5FUlJPUl9VTktOT1dOX0NPTVBJTEVSLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE1hZ2ljUHJvcGVydHkoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShSbWljQWRhcHRlckZhY3RvcnkuRVJST1JfVU5LTk9XTl9DT01QSUxFUik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TWFnaWNQcm9wZXJ0eSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdW5pdCB0ZXN0IGZvciBKVW5pdAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hZ2ljUHJvcGVydHlPdmVycmlkZXNFbXB0eVN0cmluZygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKFJtaWNBZGFwdGVyRmFjdG9yeS5FUlJPUl9VTktOT1dOX0NPTVBJTEVSKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNYWdpY1Byb3BlcnR5T3ZlcnJpZGVzRW1wdHlTdHJpbmciKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNYWdpY1Byb3BlcnR5SXNFbXB0eVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RNYWdpY1Byb3BlcnR5SXNFbXB0eVN0cmluZygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNYWdpY1Byb3BlcnR5SXNFbXB0eVN0cmluZyIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgQElnbm9yZSgiUHJldmlvdXNseSBuYW1lZCB0byBwcmV2ZW50IGV4ZWN1dGlvbiIpCi0gICAgcHVibGljIHZvaWQgTm90ZXN0RmFpbGluZ0FkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmFpbGluZ0FkYXB0ZXIiKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGZhaWx1cmVzIHRvIHByb3BhZ2F0ZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKFJtaWMuRVJST1JfUk1JQ19GQUlMRUQsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBOb3Rlc3RGYWlsaW5nQWRhcHRlcigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKFJtaWMuRVJST1JfUk1JQ19GQUlMRUQpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZhaWxpbmdBZGFwdGVyIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogdGVzdCB0aGF0IHZlcnNpb24gMS4xIHN0dWJzIGFyZSBnb29kCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjExKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb24xMSIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRlc3QgdGhhdCB2ZXJzaW9uIDEuMSBzdHVicyBhcmUgZ29vZAotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjExRGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uMTFEZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb24xMURlc3QiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiAxLjIgc3R1YnMgYXJlIGdvb2QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb24xMigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RWZXJzaW9uMTIiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiAxLjIgc3R1YnMgYXJlIGdvb2QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjEyRGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uMTJEZXN0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb24xMkRlc3QiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiBjb21wYXQgc3R1YnMgYXJlIGdvb2QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkNvbXBhdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uQ29tcGF0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFZlcnNpb25Db21wYXQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgdmVyc2lvbiBjb21wYXQgc3R1YnMgYXJlIGdvb2QKLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkNvbXBhdERlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkNvbXBhdERlc3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VmVyc2lvbkNvbXBhdERlc3QiKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiB0ZXN0IHRoYXQgcGFzc2VzIC1YbmV3IHRvIHN1bidzIHJtaWMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqIHRlc3QgdGhhdCBwYXNzZXMgLVhuZXcgdG8gc3VuJ3Mgcm1pYyBydW5uaW5nIGluIGEgZGlmZmVyZW50IFZNLgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFhuZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gc2tpcHBlZCB2aWEgdW5sZXNzIGF0dHJpYnV0ZSBmb3IgSkRLID4gNgotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFhuZXciKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB0ZXN0IHRoYXQgcGFzc2VzIC1YbmV3IHRvIHN1bidzIHJtaWMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFhuZXdEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIC8vIHNraXBwZWQgdmlhIHVubGVzcyBhdHRyaWJ1dGUgZm9yIEpESyA+IDYKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3RGVzdCIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Rm9ya2VkKCkgeworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSA5IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFhuZXdGb3JrZWQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgcGFzc2VzIC1YbmV3IHRvIHN1bidzIHJtaWMgcnVubmluZyBpbiBhIGRpZmZlcmVudCBWTS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0ZvcmtlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB4bmV3VGVzdCgidGVzdFhuZXdGb3JrZWQiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0ZvcmtlZEphdmE5cGx1cygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSA4IG9yIG9sZGVyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxNSBvciBuZXdlciIsCisgICAgICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTUiKSk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSkRLOSBoYXMgcmVtb3ZlZCBzdXBwb3J0IGZvciAtWG5ldyIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFhuZXdGb3JrZWQiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgcGFzc2VzIC1YbmV3IHRvIHN1bidzIHJtaWMgcnVubmluZyBpbiBhIGRpZmZlcmVudCBWTS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0ZvcmtlZERlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgeG5ld1Rlc3QoInRlc3RYbmV3Rm9ya2VkRGVzdCIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Rm9ya2VkRGVzdCgpIHsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgOSBvciBuZXdlciIsCisgICAgICAgICAgICAgICAgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Rm9ya2VkRGVzdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCBwYXNzZXMgLVhuZXcgdG8gc3VuJ3Mgcm1pYyBydW5uaW5nIGluIGEgZGlmZmVyZW50IFZNLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFhuZXdGb3JrZWREZXN0SmF2YTlwbHVzKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDggb3Igb2xkZXIiLAorICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDE1IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICAgICAgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxNSIpKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJKREs5IGhhcyByZW1vdmVkIHN1cHBvcnQgZm9yIC1YbmV3Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0WG5ld0ZvcmtlZERlc3QiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgcnVucyB0aGUgbmV3IHhuZXcgY29tcGlsZXIgYWRhcHRlci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0NvbXBpbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHhuZXdUZXN0KCJ0ZXN0WG5ld0NvbXBpbGVyIik7CisgICAgcHVibGljIHZvaWQgdGVzdFhuZXdDb21waWxlcigpIHsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgOSBvciBuZXdlciIsCisgICAgICAgICAgICAgICAgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Q29tcGlsZXIiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHRoYXQgcnVucyB0aGUgbmV3IHhuZXcgY29tcGlsZXIgYWRhcHRlci4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0NvbXBpbGVyRGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB4bmV3VGVzdCgidGVzdFhuZXdDb21waWxlckRlc3QiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG5ld0NvbXBpbGVySmF2YTlwbHVzKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDggb3Igb2xkZXIiLAorICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDE1IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkpESzkgaGFzIHJlbW92ZWQgc3VwcG9ydCBmb3IgLVhuZXciKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Q29tcGlsZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgcnVucyB0aGUgbmV3IHhuZXcgY29tcGlsZXIgYWRhcHRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Q29tcGlsZXJEZXN0KCkgeworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSA5IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFhuZXdDb21waWxlckRlc3QiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgcnVucyB0aGUgbmV3IHhuZXcgY29tcGlsZXIgYWRhcHRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYbmV3Q29tcGlsZXJEZXN0SmF2YTlwbHVzKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDggb3Igb2xkZXIiLAorICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDE1IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkpESzkgaGFzIHJlbW92ZWQgc3VwcG9ydCBmb3IgLVhuZXciKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RYbmV3Q29tcGlsZXJEZXN0Iik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogdGVzdCB0aGF0IHZlcmlmaWVzIHRoYXQgSURMIGNvbXBpbGVzLgotICAgICAqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJREwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY29yYmFUZXN0KCJ0ZXN0SURMIik7CisgICAgcHVibGljIHZvaWQgdGVzdElETCgpIHsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgMTEgb3IgbmV3ZXIiLCBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjExIikpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElETCIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IElETCBjb21waWxlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SURMRGVzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb3JiYVRlc3QoInRlc3RJRExEZXN0Iik7CisgICAgcHVibGljIHZvaWQgdGVzdElETEphdmExMXBsdXMoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgMTAgb3Igb2xkZXIiLCBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjExIikpOworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxNSBvciBuZXdlciIsCisgICAgICAgICAgICAgICAgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxNSIpKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJ0aGlzIHJtaWMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoZSAtaWRsIHN3aXRjaCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElETCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IElETCBjb21waWxlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJRExEZXN0KCkgeworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxMSBvciBuZXdlciIsIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTEiKSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SURMRGVzdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IElETCBjb21waWxlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJRExEZXN0SmF2YTExcGx1cygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxMCBvciBvbGRlciIsIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTEiKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDE1IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInRoaXMgcm1pYyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlIC1pZGwgc3dpdGNoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SURMIik7CisgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgdmVyaWZpZXMgdGhhdCBJSU9QIGNvbXBpbGVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElJT1AoKSB7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDExIG9yIG5ld2VyIiwgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMSIpKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJSU9QIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogdGVzdCB0aGF0IHZlcmlmaWVzIHRoYXQgSUlPUCBjb21waWxlcy4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SUlPUCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjb3JiYVRlc3QoInRlc3RJSU9QIik7CisgICAgcHVibGljIHZvaWQgdGVzdElJT1BKYXZhMTFwbHVzKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDEwIG9yIG9sZGVyIiwgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMSIpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoIkN1cnJlbnQgc3lzdGVtIGlzIEphdmEgMTUgb3IgbmV3ZXIiLAorICAgICAgICAgICAgICAgIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTUiKSk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgidGhpcyBybWljIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgLWlpb3Agc3dpdGNoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SUlPUCIpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIHRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IElJT1AgY29tcGlsZXMuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdElJT1BEZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNvcmJhVGVzdCgidGVzdElJT1BEZXN0Iik7CisgICAgcHVibGljIHZvaWQgdGVzdElJT1BEZXN0KCkgeworICAgICAgICBhc3N1bWVGYWxzZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxMSBvciBuZXdlciIsIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTEiKSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SUlPUERlc3QiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgeG5ld1Rlc3QoU3RyaW5nIHRhcmdldCkgewotICAgICAgICBpZiAoIUphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KQotICAgICAgICAgICAgfHwgSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxNSIpKSB7Ci0gICAgICAgICAgICAvLyB0YXJnZXQgaXMgc2tpcHBlZCB3aXRoIEphdmEgMTUrCi0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwotICAgICAgICAgICAgICAgIGZhaWwoIlRhcmdldCBzaG91bGQgaGF2ZSB0aHJvd24gYSBCdWlsZEV4Y2VwdGlvbiIpOwotICAgICAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkpESzkgaGFzIHJlbW92ZWQgc3VwcG9ydCBmb3IgLVhuZXciLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvcmJhVGVzdChTdHJpbmcgdGFyZ2V0KSB7Ci0gICAgICAgIGlmICghSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMSIpCi0gICAgICAgICAgICB8fCBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpIHsKLSAgICAgICAgICAgIC8vIHRhcmdldCBpcyBza2lwcGVkIHdpdGggSmF2YSAxNSsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICAgICAgZmFpbCgiVGFyZ2V0IHNob3VsZCBoYXZlIHRocm93biBhIEJ1aWxkRXhjZXB0aW9uIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY29udGFpbnMoIklETCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGhpcyBybWljIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgLWlkbCBzd2l0Y2giLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidGhpcyBybWljIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgLWlpb3Agc3dpdGNoIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgdmVyaWZpZXMgdGhhdCBJSU9QIGNvbXBpbGVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElJT1BEZXN0SmF2YTExcGx1cygpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ3VycmVudCBzeXN0ZW0gaXMgSmF2YSAxMCBvciBvbGRlciIsIEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbigiMTEiKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJDdXJyZW50IHN5c3RlbSBpcyBKYXZhIDE1IG9yIG5ld2VyIiwKKyAgICAgICAgICAgICAgICBKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oIjE1IikpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInRoaXMgcm1pYyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhlIC1paW9wIHN3aXRjaCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdElJT1AiKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9SbWljVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNUZXN0LmphdmEKaW5kZXggZWI4MTg1Ny4uMWM4MDBjMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1JtaWNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU1FMRXhlY1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjVGVzdC5qYXZhCmluZGV4IGZhYTg5MGUuLjkyZmJjYTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TUUxFeGVjVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMjYgKzE3LDI5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBqYXZhLnNxbC5Ecml2ZXI7CiBpbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zcWwuRHJpdmVyOwogaW1wb3J0IGphdmEuc3FsLkRyaXZlclByb3BlcnR5SW5mbzsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIGltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzS2V5OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqIFNpbXBsZSB0ZXN0Y2FzZSB0byB0ZXN0IGZvciBkcml2ZXIgY2FjaGluZy4KQEAgLTYyLDggKzY1LDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJwYXRoIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUUwgPSAic3FsIjsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGNhY2hlIGlzIGNsZWFyZWQuCiAgICAgICAgIEpEQkNUYXNrLmdldExvYWRlck1hcCgpLmNsZWFyKCk7CiAgICAgfQpAQCAtNzEsMzQgKzc3LDM4IEBACiAgICAvLyBzaW1wbGUgdGVzdCB0byBlbnN1cmUgdGhhdCB0aGUgY2FjaGluZyBkb2VzIHdvcmsuLi4KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REcml2ZXJDYWNoaW5nKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk5vIHN1aXRhYmxlIERyaXZlciIpOworICAgICAgICBib29sZWFuIGNhbmFyeSA9IGZhbHNlOwogICAgICAgICBTUUxFeGVjIHNxbCA9IGNyZWF0ZVRhc2soZ2V0UHJvcGVydGllcyhOVUxMKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIVNRTEV4ZWMuZ2V0TG9hZGVyTWFwKCkuY29udGFpbnNLZXkoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChTUUxFeGVjLmdldExvYWRlck1hcCgpLCBub3QoaGFzS2V5KE5VTExfRFJJVkVSKSkpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgc3FsLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJObyBzdWl0YWJsZSBEcml2ZXIiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShTUUxFeGVjLmdldExvYWRlck1hcCgpLmNvbnRhaW5zS2V5KE5VTExfRFJJVkVSKSk7Ci0gICAgICAgIGFzc2VydFNhbWUoc3FsLmdldExvYWRlcigpLCBKREJDVGFzay5nZXRMb2FkZXJNYXAoKS5nZXQoTlVMTF9EUklWRVIpKTsKLSAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyMSA9IHNxbC5nZXRMb2FkZXIoKTsKKyAgICAgICAgICAgIGNhbmFyeSA9IHRydWU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgiRm91bmQgc29tZSBEcml2ZXIiLCBjYW5hcnkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChTUUxFeGVjLmdldExvYWRlck1hcCgpLCBoYXNLZXkoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoc3FsLmdldExvYWRlcigpLCBKREJDVGFzay5nZXRMb2FkZXJNYXAoKS5nZXQoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGxvYWRlcjEgPSBzcWwuZ2V0TG9hZGVyKCk7CiAKLSAgICAgICAgLy8gMm5kIHJ1bi4uCi0gICAgICAgIHNxbCA9IGNyZWF0ZVRhc2soZ2V0UHJvcGVydGllcyhOVUxMKSk7Ci0gICAgICAgIC8vIHRoZSBkcml2ZXIgbXVzdCBzdGlsbCBiZSBjYWNoZWQuCi0gICAgICAgIGFzc2VydFRydWUoSkRCQ1Rhc2suZ2V0TG9hZGVyTWFwKCkuY29udGFpbnNLZXkoTlVMTF9EUklWRVIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNxbC5leGVjdXRlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJObyBzdWl0YWJsZSBEcml2ZXIiKSk7CisgICAgICAgICAgICAvLyAybmQgcnVuLi4KKyAgICAgICAgICAgIHNxbCA9IGNyZWF0ZVRhc2soZ2V0UHJvcGVydGllcyhOVUxMKSk7CisgICAgICAgICAgICAvLyB0aGUgZHJpdmVyIG11c3Qgc3RpbGwgYmUgY2FjaGVkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChKREJDVGFzay5nZXRMb2FkZXJNYXAoKSwgaGFzS2V5KE5VTExfRFJJVkVSKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNxbC5leGVjdXRlKCk7CisgICAgICAgICAgICAgICAgY2FuYXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIkZvdW5kIHNvbWUgRHJpdmVyIiwgY2FuYXJ5KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KEpEQkNUYXNrLmdldExvYWRlck1hcCgpLCBoYXNLZXkoTlVMTF9EUklWRVIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHNxbC5nZXRMb2FkZXIoKSwgSkRCQ1Rhc2suZ2V0TG9hZGVyTWFwKCkuZ2V0KE5VTExfRFJJVkVSKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0U2FtZShsb2FkZXIxLCBzcWwuZ2V0TG9hZGVyKCkpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoSkRCQ1Rhc2suZ2V0TG9hZGVyTWFwKCkuY29udGFpbnNLZXkoTlVMTF9EUklWRVIpKTsKLSAgICAgICAgYXNzZXJ0U2FtZShzcWwuZ2V0TG9hZGVyKCksIEpEQkNUYXNrLmdldExvYWRlck1hcCgpLmdldChOVUxMX0RSSVZFUikpOwotICAgICAgICBhc3NlcnRTYW1lKGxvYWRlcjEsIHNxbC5nZXRMb2FkZXIoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsKCkgewogICAgICAgICBkb011bHRpcGxlQ2FsbHMoMTAwMCwgTlVMTCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2lnbkphclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyVGVzdC5qYXZhCmluZGV4IDk1NTg1ZmQuLjRkNWYyOWMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TaWduSmFyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsMTYgKzIyLDE2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuSmF2YUVudlV0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIAogLyoqCiAgKiBUZXN0Y2FzZSBmb3IgdGhlIFNpZ25qYXIgdGFzawpAQCAtNDIsNiArNDIsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3NpZ25qYXIueG1sIik7CkBAIC02Miw4ICs2NSw3IEBACiAgICAgICAgIHNqLnNldEFsaWFzKCJ0ZXN0b25seSIpOwogICAgICAgICBzai5zZXRLZXlzdG9yZSgidGVzdGtleXN0b3JlIik7CiAgICAgICAgIHNqLnNldFN0b3JlcGFzcygiYXBhY2hlYW50Iik7Ci0gICAgICAgIEZpbGUgamFyID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdC5qYXIiKSk7Ci0gICAgICAgIHNqLnNldEphcihqYXIpOworICAgICAgICBzai5zZXRKYXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGVzdC5qYXIiKSkpOwogICAgICAgICBhc3NlcnRGYWxzZSgibXVzdG4ndCBmaW5kIHNpZ25hdHVyZSB3aXRob3V0IHNpZ2ZpbGUgYXR0cmlidXRlIiwKICAgICAgICAgICAgICAgICAgICAgc2ouaXNTaWduZWQoKSk7CiAgICAgICAgIHNqLnNldFNpZ2ZpbGUoIlRFU1QiKTsKQEAgLTc4LDggKzgwLDcgQEAKICAgICAgICAgc2ouc2V0QWxpYXMoInRlc3RAbmx5Iik7CiAgICAgICAgIHNqLnNldEtleXN0b3JlKCJ0ZXN0a2V5c3RvcmUiKTsKICAgICAgICAgc2ouc2V0U3RvcmVwYXNzKCJhcGFjaGVhbnQiKTsKLSAgICAgICAgRmlsZSBqYXIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmphciIpKTsKLSAgICAgICAgc2ouc2V0SmFyKGphcik7CisgICAgICAgIHNqLnNldEphcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0LmphciIpKSk7CiAgICAgICAgIGFzc2VydFRydWUoc2ouaXNTaWduZWQoKSk7CiAgICAgfQogCkBAIC0xMDAsMTkgKzEwMSwxNSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VVJMS2V5c3RvcmVIVFRQKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIlRlc3QgaXMgc2V0IG9mZmxpbmUiLCBpc09mZmxpbmUoKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJUZXN0IGlzIHNldCBvZmZsaW5lIiwgaXNPZmZsaW5lKCkpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidXJsS2V5c3RvcmVIVFRQIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHNhTG9jYWxob3N0KCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiT25seSBydW5zIG9uIEphdmEgMS41KyIsIEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbk51bWJlcigpPj0xNSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFRzYUxvY2FsaG9zdCIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbiAtIG5vIFRTQSBhdCBsb2NhbGhvc3Q6MCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImphcnNpZ25lciByZXR1cm5lZDogMSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImphcnNpZ25lciByZXR1cm5lZDogMSIpOworICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUc2FMb2NhbGhvc3QiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNiw3ICsxMjMsNyBAQAogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZSh0ZXN0SmFyUGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAiLi4vIiArIHRlc3RKYXJQYXJlbnQuZ2V0TmFtZSgpICsgIi8iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGVzdEphci5nZXROYW1lKCkpOwotICAgICAgICBhc3NlcnRGYWxzZSh0ZXN0SmFyLmVxdWFscyhmKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyh0ZXN0SmFyLCBmKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RKYXIuZ2V0Q2Fub25pY2FsUGF0aCgpLCBmLmdldENhbm9uaWNhbFBhdGgoKSk7CiAgICAgICAgIFNpZ25KYXIgcyA9IG5ldyBTaWduSmFyKCk7CiAgICAgICAgIHMuc2V0UHJvamVjdChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TbGVlcFRlc3QuamF2YQppbmRleCAzZDZjZTg3Li43NjRmYzg1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU2xlZXBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1NsZWVwVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjYgKzE4LDI0IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiBwdWJsaWMgY2xhc3MgU2xlZXBUZXN0IHsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfUkFOR0UgPSAxMDAwOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAic2xlZXAueG1sIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zbGVlcC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNzIsMTQgKzcwLDEzIEBACiAgICAgICAgIGFzc2VydFRydWUodGltZXIudGltZSgpID49ICgyMDAwIC0gRVJST1JfUkFOR0UpICYmIHRpbWVyLnRpbWUoKSA8IDYwMDAwKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmU6IG5lZ2F0aXZlIHNsZWVwIHBlcmlvZHMgYXJlIG5vdCBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgICAgICBmYWlsKCJOZWdhdGl2ZSBzbGVlcCBwZXJpb2RzIGFyZSBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHlsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdHlsZVRlc3QuamF2YQppbmRleCBlOTU4NTI0Li4wMDFiNmNkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3R5bGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N0eWxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjcsMTAgKzI3LDEyIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogCiAvKioKQEAgLTQzLDIxICs0NSwyMyBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvc3R5bGUvYnVpbGQueG1sIik7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZTogbm8gc3R5bGVzaGVldCBzcGVjaWZpZWQKKyAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdHlsZUlzU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U3R5bGVJc1NldCIpOwotICAgICAgICAgICAgZmFpbCgiTXVzdCB0aHJvd3MgYSBCdWlsZEV4Y2VwdGlvbjogbm8gc3R5bGVzaGVldCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3BlY2lmeSB0aGUgc3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSBhdHRyaWJ1dGUgb3IgYXMgYSBuZXN0ZWQgcmVzb3VyY2UiLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFN0eWxlSXNTZXQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgic3BlY2lmeSB0aGUgc3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSBhdHRyaWJ1dGUgb3IgIgorICAgICAgICAgICAgICAgICsgImFzIGEgbmVzdGVkIHJlc291cmNlIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U3R5bGVJc1NldCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMDYsOCArMTEwLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcHBlcihTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghKAotICAgICAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSwgImRhdGEuaHRtbCIpLmV4aXN0cygpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSwgImRhdGEuaHRtbCIpLmV4aXN0cygpKTsKICAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSArICIvZGF0YS5odG1sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQ9J215dmFsdWUnIik7CkBAIC0xMTUsNyArMTE4LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU1hcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKCFuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCkuZ2V0QWJzb2x1dGVGaWxlKCksICAib3V0LnhtbCIpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLmdldEFic29sdXRlRmlsZSgpLCAib3V0LnhtbCIpLmV4aXN0cygpKTsKICAgICAgICAgZXhwZWN0RmlsZUNvbnRhaW5zKCJ0ZXN0Q3VzdG9tTWFwcGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSArICIvb3V0LnhtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2V0PSdteXZhbHVlJyIpOwpAQCAtMTIzLDM1ICsxMjYsMzUgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFR5cGVkTWFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGFzc2VydFRydWUoIW5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSwgICJvdXQueG1sIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCkuZ2V0QWJzb2x1dGVGaWxlKCksICJvdXQueG1sIikuZXhpc3RzKCkpOwogICAgICAgICBleHBlY3RGaWxlQ29udGFpbnMoInRlc3RUeXBlZE1hcHBlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCkuZ2V0QWJzb2x1dGVGaWxlKCkgKyAiL291dC54bWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldD0nbXl2YWx1ZSciKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3RvcnlIaWVyYXJjaHlXaXRoRGlyTWF0Y2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0b3J5SGllcmFyY2h5V2l0aERpck1hdGNoaW5nKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERpcmVjdG9yeUhpZXJhcmNoeVdpdGhEaXJNYXRjaGluZyIpOwogICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKS5nZXRBYnNvbHV0ZUZpbGUoKSwgICJkZXN0L2xldmVsMS9kYXRhLmh0bWwiKQogICAgICAgICAgICAgICAgICAgIC5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyc1dpdGhTcGFjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyc1dpdGhTcGFjZXMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RGlyc1dpdGhTcGFjZXMiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCkuZ2V0QWJzb2x1dGVGaWxlKCksICAiZCBlc3QvZGF0YS5odG1sIikKICAgICAgICAgICAgICAgICAgICAuZXhpc3RzKCkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmU6IHN0eWxlc2hlZXQgc3BlY2lmaWVkIHR3aWNlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFN0eWxlQXR0ckFuZFJlc291cmNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RXaXRoU3R5bGVBdHRyQW5kUmVzb3VyY2UiKTsKLSAgICAgICAgICAgIGZhaWwoIk11c3QgdGhyb3dzIGEgQnVpbGRFeGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic3BlY2lmeSB0aGUgc3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSBhdHRyaWJ1dGUgb3IgYXMgYSAiCi0gICAgICAgICAgICAgICAgICAgICsgIm5lc3RlZCByZXNvdXJjZSBidXQgbm90IGFzIGJvdGgiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgic3BlY2lmeSB0aGUgc3R5bGVzaGVldCBlaXRoZXIgYXMgYSBmaWxlbmFtZSBpbiBzdHlsZSBhdHRyaWJ1dGUgb3IgIgorICAgICAgICAgICAgICAgICsgImFzIGEgbmVzdGVkIHJlc291cmNlIGJ1dCBub3QgYXMgYm90aCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdpdGhTdHlsZUF0dHJBbmRSZXNvdXJjZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMjgsMTEgKzIzMSw4IEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmlsZUNvbnRhaW5zKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNvbnRhaW5zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgY29udGVudCA9IGdldEZpbGVTdHJpbmcoZmlsZW5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgICAgICAiZXhwZWN0aW5nIGZpbGUgIiArIGZpbGVuYW1lCi0gICAgICAgICAgICArICIgdG8gY29udGFpbiAiICsgY29udGFpbnMKLSAgICAgICAgICAgICsgIiBidXQgZ290ICIgKyBjb250ZW50LAotICAgICAgICAgICAgICAgIGNvbnRlbnQuY29udGFpbnMoY29udGFpbnMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZXhwZWN0aW5nIGZpbGUgIiArIGZpbGVuYW1lICsgIiB0byBjb250YWluICIgKyBjb250YWlucyArICIgYnV0IGdvdCAiICsgY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250ZW50LCBjb250YWluc1N0cmluZyhjb250YWlucykpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TdWJBbnRUZXN0LmphdmEKaW5kZXggMGE3MzIxZi4uMjU2NGI2MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1N1YkFudFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3ViQW50VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsOCArMjAsNiBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwpAQCAtMjksMTcgKzI3LDIwIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiBwdWJsaWMgY2xhc3MgU3ViQW50VGVzdCB7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9zdWJhbnQueG1sIik7CkBAIC04NCwzMyArODUsMzEgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVRhcmdldHMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtdWx0aXBsZVRhcmdldHMiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoInRlc3QxLW9uZSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0ZXN0MS10d28iLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwotICAgICAgICBhc3NlcnRDb250YWlucygidGVzdDItb25lIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoInRlc3QyLXR3byIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygidGVzdDEtb25lIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QxLXR3byIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJ0ZXN0Mi1vbmUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygidGVzdDItdHdvIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVGFyZ2V0c09uZURvZXNudEV4aXN0X0ZPRWZhbHNlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibXVsdGlwbGVUYXJnZXRzT25lRG9lc250RXhpc3RfRk9FZmFsc2UiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlRhcmdldCBcInRocmVlXCIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHByb2plY3QgXCJzdWJhbnRcIiIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJUYXJnZXQgXCJ0aHJlZVwiIGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcm9qZWN0IFwic3ViYW50XCIiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVUYXJnZXRzT25lRG9lc250RXhpc3RfRk9FdHJ1ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtdWx0aXBsZVRhcmdldHNPbmVEb2VzbnRFeGlzdF9GT0V0cnVlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogQ2FsbGluZyBub3QgZXhpc3RlbnQgdGFyZ2V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiVGFyZ2V0IFwidGhyZWVcIiBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcHJvamVjdCBcInN1YmFudFwiIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRhcmdldCBcInRocmVlXCIgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHByb2plY3QgXCJzdWJhbnRcIiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibXVsdGlwbGVUYXJnZXRzT25lRG9lc250RXhpc3RfRk9FdHJ1ZSIpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIHRlc3RCYXNlRGlycyhTdHJpbmcgdGFyZ2V0LCBTdHJpbmdbXSBkaXJzKSB7CiAgICAgICAgIFN1YkFudFRlc3QuQmFzZWRpckNoZWNrZXIgYmMgPSBuZXcgU3ViQW50VGVzdC5CYXNlZGlyQ2hlY2tlcihkaXJzKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRCdWlsZExpc3RlbmVyKGJjKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgYWUgPSBiYy5nZXRFcnJvcigpOworICAgICAgICBBc3NlcnRpb25FcnJvciBhZSA9IGJjLmdldEVycm9yKCk7CiAgICAgICAgIGlmIChhZSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0aHJvdyBhZTsKICAgICAgICAgfQpAQCAtMTIwLDcgKzExOSw3IEBACiAgICAgcHJpdmF0ZSBjbGFzcyBCYXNlZGlyQ2hlY2tlciBpbXBsZW1lbnRzIEJ1aWxkTGlzdGVuZXIgewogICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkQmFzZWRpcnM7CiAgICAgICAgIHByaXZhdGUgaW50IGNhbGxzID0gMDsKLSAgICAgICAgcHJpdmF0ZSBBc3NlcnRpb25GYWlsZWRFcnJvciBlcnJvcjsKKyAgICAgICAgcHJpdmF0ZSBBc3NlcnRpb25FcnJvciBlcnJvcjsKIAogICAgICAgICBCYXNlZGlyQ2hlY2tlcihTdHJpbmdbXSBkaXJzKSB7CiAgICAgICAgICAgICBleHBlY3RlZEJhc2VkaXJzID0gZGlyczsKQEAgLTE0NSwyNCArMTQ0LDIyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCB0YXJnZXRTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgICAgIGlmIChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkuZXF1YWxzKCIiKSkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRhcmdldCgpLmdldE5hbWUoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZXJyb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJhc2VkaXJzW2NhbGxzKytdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRFcnJvcigpIHsKKyAgICAgICAgQXNzZXJ0aW9uRXJyb3IgZ2V0RXJyb3IoKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgICAgIH0KLQogICAgIH0KIAotCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvU3luY1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jVGVzdC5qYXZhCmluZGV4IGIyOTZiN2IuLjg1ZTA5ZTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9TeW5jVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTEgKzE5LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIFN5bmNUZXN0IHsKQEAgLTQxLDcgKzQ1LDcgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNpbXBsZWNvcHkiKTsKICAgICAgICAgU3RyaW5nIGQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2EvYi9jL2QiOwogICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGQpOwotICAgICAgICBhc3NlcnRUcnVlKCFidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJkYW5nbGluZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoImRhbmdsaW5nIikpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNTEsNyArNTUsNyBAQAogICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGQpOwogICAgICAgICBTdHJpbmcgYyA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvYS9iL2MiOwogICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGMpOwotICAgICAgICBhc3NlcnRUcnVlKCFidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJkYW5nbGluZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoImRhbmdsaW5nIikpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNjEsNyArNjUsNyBAQAogICAgICAgICBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KGQpOwogICAgICAgICBTdHJpbmcgYyA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvYS9iL2MiOwogICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGMpOwotICAgICAgICBhc3NlcnRUcnVlKCFidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJkYW5nbGluZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoImRhbmdsaW5nIikpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtODUsOSArODksOSBAQAogICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGQpOwogICAgICAgICBTdHJpbmcgZiA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvZS9mIjsKICAgICAgICAgYXNzZXJ0RmlsZUlzTm90UHJlc2VudChmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJSZW1vdmVkIDEgZGFuZ2xpbmcgZmlsZSBmcm9tIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJSZW1vdmVkIDEgZGFuZ2xpbmcgZGlyZWN0b3J5IGZyb20iLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBjb250YWluc1N0cmluZygoIlJlbW92aW5nIG9ycGhhbiBmaWxlOiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIlJlbW92ZWQgMSBkYW5nbGluZyBmaWxlIGZyb20iKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIlJlbW92ZWQgMSBkYW5nbGluZyBkaXJlY3RvcnkgZnJvbSIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtOTcsOSArMTAxLDkgQEAKICAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkKTsKICAgICAgICAgU3RyaW5nIGYgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2UvZiI7CiAgICAgICAgIGFzc2VydEZpbGVJc05vdFByZXNlbnQoZik7Ci0gICAgICAgIGFzc2VydFRydWUoYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucygiUmVtb3Zpbmcgb3JwaGFuIGZpbGU6IikpOwotICAgICAgICBhc3NlcnRDb250YWlucygiUmVtb3ZlZCAxIGRhbmdsaW5nIGZpbGUgZnJvbSIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOwotICAgICAgICBhc3NlcnRDb250YWlucygiUmVtb3ZlZCAxIGRhbmdsaW5nIGRpcmVjdG9yeSBmcm9tIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIGNvbnRhaW5zU3RyaW5nKCJSZW1vdmVkIDEgZGFuZ2xpbmcgZmlsZSBmcm9tIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIGNvbnRhaW5zU3RyaW5nKCJSZW1vdmVkIDEgZGFuZ2xpbmcgZGlyZWN0b3J5IGZyb20iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTExMSw5ICsxMTUsOSBAQAogICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGMpOwogICAgICAgICBTdHJpbmcgZiA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvZS9mIjsKICAgICAgICAgYXNzZXJ0RmlsZUlzTm90UHJlc2VudChmKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJSZW1vdmluZyBvcnBoYW4gZGlyZWN0b3J5OiIpKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk5PIGRhbmdsaW5nIGZpbGUgdG8gcmVtb3ZlIGZyb20iLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlJlbW92ZWQgMiBkYW5nbGluZyBkaXJlY3RvcmllcyBmcm9tIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoKCJSZW1vdmluZyBvcnBoYW4gZGlyZWN0b3J5OiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIk5PIGRhbmdsaW5nIGZpbGUgdG8gcmVtb3ZlIGZyb20iKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIlJlbW92ZWQgMiBkYW5nbGluZyBkaXJlY3RvcmllcyBmcm9tIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjMsNyArMTI3LDcgQEAKICAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkKTsKICAgICAgICAgU3RyaW5nIGYgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJkZXN0IikgKyAiL2UvZiI7CiAgICAgICAgIGFzc2VydEZpbGVJc1ByZXNlbnQoZik7Ci0gICAgICAgIGFzc2VydFRydWUoIWJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkuY29udGFpbnMoIlJlbW92aW5nIG9ycGhhbiBmaWxlOiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIlJlbW92aW5nIG9ycGhhbiBmaWxlOiIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEzMywxNiArMTM3LDM2IEBACiAgICAgICAgIGFzc2VydEZpbGVJc1ByZXNlbnQoZCk7CiAgICAgICAgIFN0cmluZyBmID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZGVzdCIpICsgIi9lL2YiOwogICAgICAgICBhc3NlcnRGaWxlSXNQcmVzZW50KGYpOwotICAgICAgICBhc3NlcnRUcnVlKCFidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJSZW1vdmluZyBvcnBoYW4gZmlsZToiKSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3QgZm9yIGJ6LTYyODkwIGJ1ZyBmaXgKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlU2Vuc2l0aXZpdHlPZkRlc3QoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjYXNlc2Vuc2l0aXZpdHktdGVzdCIpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVzdERpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImRlc3QiKSArICIvY2FzZWNoZWNrIjsKKyAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkZXN0RGlyICsgIi9hLnR4dCIpOworICAgICAgICBmaW5hbCBib29sZWFuIGNhc2VTZW5zaXRpdmUgPSBGaWxlVXRpbHMuaXNDYXNlU2Vuc2l0aXZlRmlsZVN5c3RlbSgKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGRlc3REaXIpLnRvUGF0aCgpKQorICAgICAgICAgICAgICAgIC5vckVsc2UodHJ1ZSk7IC8vIGRpcmVjdG9yeSBzY2FubmVyIGRlZmF1bHRzIHRvIGNhc2Ugc2Vuc2l0aXZlID0gdHJ1ZQorICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSkgeworICAgICAgICAgICAgYXNzZXJ0RmlsZUlzTm90UHJlc2VudChkZXN0RGlyICsgIi9BLnR4dCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RmlsZUlzUHJlc2VudChkZXN0RGlyICsgIi9BLnR4dCIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZpbGVJc1ByZXNlbnQoZGVzdERpciArICIvZm9vLnR4dCIpOworCisgICAgICAgIGFzc2VydEZpbGVJc05vdFByZXNlbnQoZGVzdERpciArICIvYmFyLnR4dCIpOworICAgIH0KKworCiAgICAgcHVibGljIHZvaWQgYXNzZXJ0RmlsZUlzUHJlc2VudChTdHJpbmcgZikgewotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmaWxlICIgKyBmLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmaWxlICIgKyBmLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKGYpLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhc3NlcnRGaWxlSXNOb3RQcmVzZW50KFN0cmluZyBmKSB7Ci0gICAgICAgIGFzc2VydFRydWUoIkRpZG4ndCBleHBlY3QgZmlsZSAiICsgZiwKLSAgICAgICAgICAgICAgICAgICAhYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShmKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJEaWRuJ3QgZXhwZWN0IGZpbGUgIiArIGYsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZikuZXhpc3RzKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UU3RhbXBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVFN0YW1wVGVzdC5qYXZhCmluZGV4IDAzM2QxYjkuLmYzOTNiZjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UU3RhbXBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RTdGFtcFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQwLDcgKzQwLDcgQEAKICAgICBwcm90ZWN0ZWQgTG9jYXRpb24gbG9jYXRpb247CiAKICAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oInRlc3QueG1sIik7CiAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwogICAgICAgICB0c3RhbXAgPSBuZXcgVHN0YW1wKCk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVpvbmUoKSB7CiAgICAgICAgIFRzdGFtcC5DdXN0b21Gb3JtYXQgZm9ybWF0ID0gdHN0YW1wLmNyZWF0ZUZvcm1hdCgpOwogICAgICAgICBmb3JtYXQuc2V0UHJvcGVydHkoInRvZGF5Iik7CiAgICAgICAgIGZvcm1hdC5zZXRQYXR0ZXJuKCJISDptbTpzcyB6Iik7CkBAIC02OCwxMCArNjgsOSBAQAogICAgIC8qKgogICAgICAqIHZlcmlmaWVzIHRoYXQgY3VzdG9tIHByb3BzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUKICAgICAgKiBvcmlnaW5hbHMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZwogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdyaXRlT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVPcmRlcigpIHsKICAgICAgICAgVHN0YW1wLkN1c3RvbUZvcm1hdCBmb3JtYXQgPSB0c3RhbXAuY3JlYXRlRm9ybWF0KCk7CiAgICAgICAgIGZvcm1hdC5zZXRQcm9wZXJ0eSgiVE9EQVkiKTsKICAgICAgICAgZm9ybWF0LnNldFBhdHRlcm4oIkhIOm1tOnNzIHoiKTsKQEAgLTg5LDEyICs4OCwxMCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHZlcmlmaWVzIHRoYXQgY3VzdG9tIHByb3BzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUKLSAgICAgKiBvcmlnaW5hbHMKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAqIHZlcmlmaWVzIHRoYXQgY3VzdG9tIHByb3BzIGhhdmUgcHJpb3JpdHkgb3ZlciB0aGUgb3JpZ2luYWxzCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeCgpIHsKICAgICAgICAgdHN0YW1wLnNldFByZWZpeCgicHJlZml4Iik7CiAgICAgICAgIHRzdGFtcC5leGVjdXRlKCk7CiAgICAgICAgIFN0cmluZyBwcm9wID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgicHJlZml4LkRTVEFNUCIpOwpAQCAtMTAyLDcgKzk5LDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXRQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybWF0UHJlZml4KCkgewogICAgICAgICBUc3RhbXAuQ3VzdG9tRm9ybWF0IGZvcm1hdCA9IHRzdGFtcC5jcmVhdGVGb3JtYXQoKTsKICAgICAgICAgZm9ybWF0LnNldFByb3BlcnR5KCJmb3JtYXQiKTsKICAgICAgICAgZm9ybWF0LnNldFBhdHRlcm4oIkhIOm1tOnNzIHoiKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFyVGVzdC5qYXZhCmluZGV4IDk2NTBkZmMuLmUzN2UyYjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RhclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDggKzE4LDggQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwpAQCAtMjksNyArMjksNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIFRhclRlc3QgewogCkBAIC00Miw2NSArNDIsNTYgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNldFVwIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmU6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZTogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlOiB0YXIgY2Fubm90IGluY2x1ZGUgaXRzZWxmCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHRhciBjYW5ub3QgaW5jbHVkZSBpdHNlbGYiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDUiKTsKLSAgICAgICAgRmlsZSBmCi0gICAgICAgICAgICA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDUudGFyIik7Ci0KLSAgICAgICAgaWYgKCFmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJUYXJyaW5nIGEgZGlyZWN0b3J5IGZhaWxlZCIpOwotICAgICAgICB9CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDUudGFyIik7CisgICAgICAgIGFzc2VydFRydWUoIlRhcnJpbmcgYSBkaXJlY3RvcnkgZmFpbGVkIiwgZi5leGlzdHMoKSk7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBpbnZhbGlkIHZhbHVlIHNwZWNpZmllZCBmb3IgbG9uZ2ZpbGUgYXR0cmlidXRlLgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDYoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDYiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBJbnZhbGlkIHZhbHVlIHNwZWNpZmllZCBmb3IgbG9uZ2ZpbGUgYXR0cmlidXRlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjAsMTkgKzExMSwxMSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3Q3KFN0cmluZyB0YXJnZXQpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgRmlsZSBmMQotICAgICAgICAgICAgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgInVudGFyL3Rlc3Q3LXByZWZpeCIpOwotCi0gICAgICAgIGlmICghKGYxLmV4aXN0cygpICYmIGYxLmlzRGlyZWN0b3J5KCkpKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgcHJlZml4IGF0dHJpYnV0ZSBpcyBub3Qgd29ya2luZyBwcm9wZXJseS4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZjIKLSAgICAgICAgICAgID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ1bnRhci90ZXN0N2RpciIpOwotCi0gICAgICAgIGlmICghKGYyLmV4aXN0cygpICYmIGYyLmlzRGlyZWN0b3J5KCkpKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgcHJlZml4IGF0dHJpYnV0ZSBpcyBub3Qgd29ya2luZyBwcm9wZXJseS4iKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0Iik7CisgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShvdXRwdXQsICJ1bnRhci90ZXN0Ny1wcmVmaXgiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHByZWZpeCBhdHRyaWJ1dGUgaXMgbm90IHdvcmtpbmcgcHJvcGVybHkuIiwgZjEuZXhpc3RzKCkgJiYgZjEuaXNEaXJlY3RvcnkoKSk7CisgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZShvdXRwdXQsICJ1bnRhci90ZXN0N2RpciIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcHJlZml4IGF0dHJpYnV0ZSBpcyBub3Qgd29ya2luZyBwcm9wZXJseS4iLCBmMi5leGlzdHMoKSAmJiBmMi5pc0RpcmVjdG9yeSgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTYyLDQxICsxNDUsMzQgQEAKIAogICAgIHByaXZhdGUgdm9pZCB0ZXN0OChTdHJpbmcgdGFyZ2V0KSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgIEZpbGUgZjEKLSAgICAgICAgICAgID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ1bnRhci90ZXN0OC54bWwiKTsKLSAgICAgICAgaWYgKCEgZjEuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgIGZhaWwoIlRoZSBmdWxscGF0aCBhdHRyaWJ1dGUgb3IgdGhlIHByZXNlcnZlTGVhZGluZ1NsYXNoZXMgYXR0cmlidXRlIGRvZXMgbm90IHdvcmsgcHJvcGVybHkiKTsKLSAgICAgICAgfQorICAgICAgICBGaWxlIGYxID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ1bnRhci90ZXN0OC54bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZ1bGxwYXRoIGF0dHJpYnV0ZSBvciB0aGUgcHJlc2VydmVMZWFkaW5nU2xhc2hlcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBwcm9wZXJseSIsCisgICAgICAgICAgICAgICAgZjEuZXhpc3RzKCkpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gaW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yIGNvbXByZXNzaW9uIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q5KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q5Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogSW52YWxpZCB2YWx1ZSBzcGVjaWZpZWQgZm9yIGNvbXByZXNzaW9uIGF0dHJpYnV0ZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOwotICAgICAgICBGaWxlIGYxCi0gICAgICAgICAgICA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidW50YXIvdGVzdDEwLnhtbCIpOwotICAgICAgICBpZiAoISBmMS5leGlzdHMoKSkgewotICAgICAgICAgICAgZmFpbCgiVGhlIGZ1bGxwYXRoIGF0dHJpYnV0ZSBvciB0aGUgcHJlc2VydmVMZWFkaW5nU2xhc2hlcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBwcm9wZXJseSIpOwotICAgICAgICB9CisgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgInVudGFyL3Rlc3QxMC54bWwiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZ1bGxwYXRoIGF0dHJpYnV0ZSBvciB0aGUgcHJlc2VydmVMZWFkaW5nU2xhc2hlcyBhdHRyaWJ1dGUgZG9lcyBub3Qgd29yayBwcm9wZXJseSIsCisgICAgICAgICAgICAgICAgZjEuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDExKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDExIik7Ci0gICAgICAgIEZpbGUgZjEKLSAgICAgICAgICAgID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ1bnRhci90ZXN0MTEueG1sIik7Ci0gICAgICAgIGlmICghIGYxLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBmYWlsKCJUaGUgZnVsbHBhdGggYXR0cmlidXRlIG9yIHRoZSBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzIGF0dHJpYnV0ZSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5Iik7Ci0gICAgICAgIH0KKyAgICAgICAgRmlsZSBmMSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidW50YXIvdGVzdDExLnhtbCIpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZnVsbHBhdGggYXR0cmlidXRlIG9yIHRoZSBwcmVzZXJ2ZUxlYWRpbmdTbGFzaGVzIGF0dHJpYnV0ZSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IiwKKyAgICAgICAgICAgICAgICBmMS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIwNiw1ICsxODIsOCBAQAogICAgICAgICAgICAgICAgIEZpbGVVdGlsaXRpZXMuZ2V0RmlsZUNvbnRlbnRzKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidW50YXIvYXNmLWxvZ28uZ2lmLmd6IikpKTsKICAgICB9CiAKLQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdHRlc3RUYXJGaWxlc2V0V2l0aFJlZmVyZW5jZSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUYXJGaWxlc2V0V2l0aFJlZmVyZW5jZSIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEKaW5kZXggMjRlNTA5MC4uYmNlZmNiYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMCwxNCArMjAsMTMgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICovCkBAIC00MSw1NCArNDAsNDkgQEAKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3Rhc2tkZWYueG1sIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSBsYWNraW5nIGEgcmVxdWlyZWQgYXJndW1lbnQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIEFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgbGFja2luZyBhIHJlcXVpcmVkIGFyZ3VtZW50CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIGxhY2tpbmcgYSByZXF1aXJlZCBhcmd1bWVudAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBub25leGlzdGVudCBjbGFzcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogY2xhc3NuYW1lIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBub24tcHVibGljIGV4ZWN1dGUoKSBtZXRob2QKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogTm8gcHVibGljIGV4ZWN1dGUoKSBpbiAiICsgUHJvamVjdC5jbGFzcyk7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTExOCwxMSArMTEyLDExIEBACiAgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE92ZXJyaWRlIik7CiAgICAgICAgIFN0cmluZyBsb2cgPSBidWlsZFJ1bGUuZ2V0TG9nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIm92ZXJyaWRlIHdhcm5pbmcgc2VudCIsCi0gICAgICAgICAgICAgICAgbG9nLmNvbnRhaW5zKCJUcnlpbmcgdG8gb3ZlcnJpZGUgb2xkIGRlZmluaXRpb24gb2YgdGFzayBjb3B5IikpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0YXNrIGluc2lkZSB0YXJnZXQgd29ya2VkIiwKLSAgICAgICAgICAgICAgICBsb2cuY29udGFpbnMoIkluIHRhcmdldCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidGFzayBpbnNpZGUgdGFyZ2V0IHdvcmtlZCIsCi0gICAgICAgICAgICAgICAgbG9nLmNvbnRhaW5zKCJJbiBUYXNrQ29udGFpbmVyIikpOworICAgICAgICBhc3NlcnRUaGF0KCJvdmVycmlkZSB3YXJuaW5nIHNlbnQiLCBsb2csCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIlRyeWluZyB0byBvdmVycmlkZSBvbGQgZGVmaW5pdGlvbiBvZiB0YXNrIGNvcHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoInRhc2sgaW5zaWRlIHRhcmdldCB3b3JrZWQiLCBsb2csCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkluIHRhcmdldCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidGFzayBpbnNpZGUgdGFyZ2V0IHdvcmtlZCIsIGxvZywKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiSW4gVGFza0NvbnRhaW5lciIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZnNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGFza2RlZnNUZXN0LmphdmEKaW5kZXggOTMxNjA1OS4uNjk5YWVhZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rhc2tkZWZzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UYXNrZGVmc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UZXN0UHJvY2Vzcy5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3RQcm9jZXNzLmphdmEKaW5kZXggYTYxY2EzYy4uZjA4NjBiNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3RQcm9jZXNzLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1Rlc3RQcm9jZXNzLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CiAKLWltcG9ydCBvcmcuanVuaXQuaW50ZXJuYWwuQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247CiAKIC8qKgogICogSW50ZXJhY3RpdmUgVGVzdGNhc2UgZm9yIFByb2Nlc3NkZXN0cm95ZXIuCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVGltZVByb2Nlc3MuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UaW1lUHJvY2Vzcy5qYXZhCmluZGV4IGVlZTE1ZDEuLjFmYWIxMTggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UaW1lUHJvY2Vzcy5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UaW1lUHJvY2Vzcy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RvdWNoVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1RvdWNoVGVzdC5qYXZhCmluZGV4IDBmOTAxNDYuLjY0MDUzYmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9Ub3VjaFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVG91Y2hUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwzMSArMTgsMzAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmczsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIFRvdWNoVGVzdCB7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVE9VQ0hfRklMRSA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy90b3VjaHRlc3QiOworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKIAogICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CiAKLQogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3RvdWNoLnhtbCIpOwpAQCAtNTQsOCArNTMsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBsb25nIGdldFRhcmdldFRpbWUoKSB7Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIFRPVUNIX0ZJTEUpOworICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRvdWNodGVzdCIpOwogICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmFpbGVkIHRvIHRvdWNoIGZpbGUgIiArIGZpbGUpOwogICAgICAgICB9CkBAIC05Niw5ICs5NCw5IEBACiAgICAgcHVibGljIHZvaWQgdGVzdE5vdygpIHsKICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb3ciKTsKLSAgICAgICAgbG9uZyB0aW1lID0gZ2V0VGFyZ2V0VGltZSgpOwotICAgICAgICBhc3NlcnRUaW1lc05lYXJseU1hdGNoKHRpbWUsIG5vdywgNTAwMCk7CisgICAgICAgIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2goZ2V0VGFyZ2V0VGltZSgpLCBub3csIDUwMDApOwogICAgIH0KKwogICAgIC8qKgogICAgICAqIHZlcmlmeSB0aGF0IHRoZSBtaWxsaXMgdGVzdCBzZXRzIHRoaW5ncyB1cAogICAgICAqLwpAQCAtMTY4LDEzICsxNjYsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhZFBhdHRlcm4oKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEJhZFBhdHRlcm4iKTsKLSAgICAgICAgICAgIGZhaWwoIk5vIHBhcnNpbmcgZXhjZXB0aW9uIHRocm93biIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlVucGFyc2VhYmxlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVW5wYXJzZWFibGUiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RCYWRQYXR0ZXJuIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODQsOCArMTc4LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdG91Y2hGaWxlKFN0cmluZyB0YXJnZXROYW1lLCBsb25nIHRpbWVzdGFtcCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKLSAgICAgICAgbG9uZyB0aW1lID0gZ2V0VGFyZ2V0VGltZSgpOwotICAgICAgICBhc3NlcnRUaW1lc05lYXJseU1hdGNoKHRpbWVzdGFtcCwgdGltZSk7CisgICAgICAgIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2godGltZXN0YW1wLCBnZXRUYXJnZXRUaW1lKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTkzLDkgKzE4Niw4IEBACiAgICAgICogQHBhcmFtIHRpbWVzdGFtcCBsb25nCiAgICAgICogQHBhcmFtIHRpbWUgbG9uZwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2gobG9uZyB0aW1lc3RhbXAsbG9uZyB0aW1lKSB7Ci0gICAgICAgIGxvbmcgZ3JhbnVsYXJpdHk9IEZJTEVfVVRJTFMuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCk7Ci0gICAgICAgIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2godGltZXN0YW1wLCB0aW1lLCBncmFudWxhcml0eSk7CisgICAgcHVibGljIHZvaWQgYXNzZXJ0VGltZXNOZWFybHlNYXRjaChsb25nIHRpbWVzdGFtcCwgbG9uZyB0aW1lKSB7CisgICAgICAgIGFzc2VydFRpbWVzTmVhcmx5TWF0Y2godGltZXN0YW1wLCB0aW1lLCBGSUxFX1VUSUxTLmdldEZpbGVUaW1lc3RhbXBHcmFudWxhcml0eSgpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlQWRhcHRlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9UeXBlQWRhcHRlclRlc3QuamF2YQppbmRleCBhYWM4OWFlLi5jNGZjOGZjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZUFkYXB0ZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVBZGFwdGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjgsMTEgKzI4LDExIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqLwpAQCAtNDEsNiArNDEsOCBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKQEAgLTUwLDM1ICs1MiwzMiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRhc2tBZGFwdGVyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGFza2FkYXB0ZXIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk15RXhlYyBjYWxsZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIk15RXhlYyBjYWxsZWQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UnVuQWRhcHRlcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJ1bmFkYXB0ZXIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk15UnVubmFibGUgY2FsbGVkIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJNeVJ1bm5hYmxlIGNhbGxlZCIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW5BZGFwdGVyRXJyb3IoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicnVuYWRhcHRlcmVycm9yIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogbm8gcHVibGljIHJ1biBtZXRob2QiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJObyBwdWJsaWMgcnVuKCkgbWV0aG9kIGluIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk5vIHB1YmxpYyBydW4oKSBtZXRob2QgaW4iKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJ1bmFkYXB0ZXJlcnJvciIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlbGF5KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZGVsYXkiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIk15VGFzayBjYWxsZWQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIk15VGFzayBjYWxsZWQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T25FcnJvclJlcG9ydCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm9uZXJyb3IucmVwb3J0Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJNeVRhc2tOb3RQcmVzZW50IGNhbm5vdCBiZSBmb3VuZCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiTXlUYXNrTm90UHJlc2VudCBjYW5ub3QgYmUgZm91bmQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEyMCw3ICsxMTksNyBAQAogICAgICAgICBwcml2YXRlIFN0cmluZyBleGVjTWV0aG9kTmFtZSA9ICJydW4iOwogICAgICAgICBwcml2YXRlIE9iamVjdCBwcm94eTsKIAotICAgICAgICBwdWJsaWMgTWV0aG9kIGdldEV4ZWN1dGVNZXRob2QoQ2xhc3MgcHJveHlDbGFzcykgeworICAgICAgICBwdWJsaWMgTWV0aG9kIGdldEV4ZWN1dGVNZXRob2QoQ2xhc3M8Pz4gcHJveHlDbGFzcykgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBNZXRob2QgZXhlY01ldGhvZCA9IHByb3h5Q2xhc3MuZ2V0TWV0aG9kKGV4ZWNNZXRob2ROYW1lKTsKICAgICAgICAgICAgICAgICBpZiAoIVZvaWQuVFlQRS5lcXVhbHMoZXhlY01ldGhvZC5nZXRSZXR1cm5UeXBlKCkpKSB7CkBAIC0xMzYsNyArMTM1LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24obWVzc2FnZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgY2hlY2tQcm94eUNsYXNzKENsYXNzIHByb3h5Q2xhc3MpIHsKKyAgICAgICAgcHVibGljIHZvaWQgY2hlY2tQcm94eUNsYXNzKENsYXNzPD8+IHByb3h5Q2xhc3MpIHsKICAgICAgICAgICAgIGdldEV4ZWN1dGVNZXRob2QocHJveHlDbGFzcyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1R5cGVkZWZUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZlRlc3QuamF2YQppbmRleCAwYjkzODI2Li40ZjgwNjQzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZlRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVHlwZWRlZlRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDExICsyMywxMiBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKi8KQEAgLTM2LDUwICszNywzNyBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3R5cGVkZWYueG1sIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJlbXB0eSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZW1wdHkiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb05hbWUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9OYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiT25seSBhbnRsaWIgVVJJcyBjYW4gYmUgbG9jYXRlZCBmcm9tIHRoZSBVUkkgYWxvbmUsIG5vdCB0aGUgVVJJICcnIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub05hbWUiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE5vQ2xhc3NuYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5vQ2xhc3NuYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub0NsYXNzbmFtZSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCB2YWx1ZQogICAgIH0KIAotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOb3RGb3VuZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjbGFzc05vdEZvdW5kIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogY2xhc3NuYW1lIHNwZWNpZmllZCBkb2Vzbid0IGV4aXN0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNsYXNzTm90Rm91bmQiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdApAQCAtODgsOCArNzYsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CiAgICAgICAgIE9iamVjdCByZWYgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZXMoKS5nZXQoImdsb2JhbCIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJyZWYgaXMgbm90IG51bGwiLCByZWYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICByZWYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSIsIHJlZi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTk4LDggKzg1LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwogICAgICAgICBPYmplY3QgcmVmID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2VzKCkuZ2V0KCJsb2NhbCIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJyZWYgaXMgbm90IG51bGwiLCByZWYpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICByZWYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5leGFtcGxlLnR5cGVzLlR5cGVkZWZUZXN0VHlwZSIsIHJlZi5nZXRDbGFzcygpLmdldE5hbWUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDksMjggKzk1LDI1IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlTm90UHJlc2VudCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRvdWJsZS1ub3RwcmVzZW50Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJoaSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiaGkiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXNvdXJjZU9uRXJyb3JGYWlsQWxsKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub3Jlc291cmNlZmFpbGFsbCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tIHJlc291cmNlICIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tIHJlc291cmNlICIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9yZXNvdXJjZWZhaWxhbGwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1Jlc291cmNlT25FcnJvckZhaWwoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub3Jlc291cmNlZmFpbCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiQ291bGQgbm90IGxvYWQgZGVmaW5pdGlvbnMgZnJvbSByZXNvdXJjZSAiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkNvdWxkIG5vdCBsb2FkIGRlZmluaXRpb25zIGZyb20gcmVzb3VyY2UgIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vUmVzb3VyY2VPbkVycm9yTm90RmFpbCgpIHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub3Jlc291cmNlbm90ZmFpbCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiQ291bGQgbm90IGxvYWQgZGVmaW5pdGlvbnMgZnJvbSByZXNvdXJjZSAiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9yZXNvdXJjZW5vdGZhaWwiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJDb3VsZCBub3QgbG9hZCBkZWZpbml0aW9ucyBmcm9tIHJlc291cmNlICIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW50YXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW50YXJUZXN0LmphdmEKaW5kZXggZWEwYzYwYy4uNmExY2NhNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VudGFyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnRhclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwLDggKzMwLDYgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAKIHB1YmxpYyBjbGFzcyBVbnRhclRlc3QgewogCkBAIC03MywxNCArNzEsMTAgQEAKICAgICAgICAgdGVzdExvZ29FeHRyYWN0aW9uKCJ0ZXN0QnppcDJUYXJUYXNrIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTcmNEaXJUZXN0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNyY0RpclRlc3QiKTsKLSAgICAgICAgICAgIGZhaWwoIlNyYyBjYW5ub3QgYmUgYSBkaXJlY3RvcnkuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNyY0RpclRlc3QiKTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VuemlwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VuemlwVGVzdC5qYXZhCmluZGV4IDU1ZDRjOGIuLjQ1OGViYTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VbnppcFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVW56aXBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOSw4ICsyOSw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBVbnppcFRlc3QgewogCkBAIC00MiwzNyArNDIsMzMgQEAKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3VuemlwLnhtbCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6IHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDIiKTsKKyAgICAgICAgLy8gVE9ETyBBc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MyIpOworICAgICAgICAvLyBUT0RPIEFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgIH0KIAotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhbFRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVhbFRlc3QiKTsKQEAgLTEwNywxMCArMTAzLDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuU2V0RXhjbHVkZU9ubHkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0dGVyblNldEV4Y2x1ZGVPbmx5Iik7Ci0gICAgICAgIGFzc2VydEZpbGVNaXNzaW5nKCIxL2ZvbyBpcyBleGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3VuemlwdGVzdG91dC8xL2ZvbyIpOwotICAgICAgICBhc3NlcnRGaWxlRXhpc3RzKCIyL2JhciBpcyBub3QgZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgZXhjbHVkZWQiLCBvdXRwdXQgKyAiL3VuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlRXhpc3RzKCIyL2JhciBpcyBub3QgZXhjbHVkZWQiLCBvdXRwdXQgKyAiL3VuemlwdGVzdG91dC8yL2JhciIpOwogICAgIH0KIAogICAgIC8qCkBAIC0xMTksMTAgKzExNCw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVyblNldEluY2x1ZGVPbmx5KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFBhdHRlcm5TZXRJbmNsdWRlT25seSIpOwotICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzEvZm9vIik7Ci0gICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjIvYmFyIGlzIGluY2x1ZGVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzIvYmFyIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBpbmNsdWRlZCIsIG91dHB1dCArICIvdW56aXB0ZXN0b3V0LzEvZm9vIik7CisgICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIjIvYmFyIGlzIGluY2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTMxLDEwICsxMjUsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5TZXRJbmNsdWRlQW5kRXhjbHVkZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQYXR0ZXJuU2V0SW5jbHVkZUFuZEV4Y2x1ZGUiKTsKLSAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBpbmNsdWRlZCIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3VuemlwdGVzdG91dC8xL2ZvbyIpOwotICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMi9iYXIgaXMgZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjIvYmFyIGlzIGV4Y2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTQzLDEwICsxMzYsOSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFR3b1BhdHRlcm5TZXRzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFR3b1BhdHRlcm5TZXRzIik7Ci0gICAgICAgIGFzc2VydEZpbGVNaXNzaW5nKCIxL2ZvbyBpcyBub3QgaW5jbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKLSAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMi9iYXIgaXMgaW5jbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMi9iYXIgaXMgaW5jbHVkZWQiLCBvdXRwdXQgKyAiL3VuemlwdGVzdG91dC8yL2JhciIpOwogICAgIH0KIAogICAgIC8qCkBAIC0xNTUsMTAgKzE0Nyw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvUGF0dGVyblNldHNXaXRoRXhjbHVkZXMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VHdvUGF0dGVyblNldHNXaXRoRXhjbHVkZXMiKTsKLSAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBpbmNsdWRlZCIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IikgKyAiL3VuemlwdGVzdG91dC8xL2ZvbyIpOwotICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMi9iYXIgaXMgZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjIvYmFyIGlzIGV4Y2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKICAgICB9CiAKICAgICAvKgpAQCAtMTcyLDIwICsxNjMsMTcgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNlbGZFeHRyYWN0aW5nQXJjaGl2ZSIpOwogICAgIH0KIAotCiAgICAgLyoKICAgICAgKiBQUiAyMDk2OQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBhdHRlcm5TZXRTbGFzaE9ubHkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UGF0dGVyblNldFNsYXNoT25seSIpOwotICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzEvZm9vIik7Ci0gICAgICAgIGFzc2VydEZpbGVFeGlzdHMoIlwiMi9iYXIgaXMgaW5jbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpOworICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgbm90IGluY2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiXCIyL2JhciBpcyBpbmNsdWRlZCIsIG91dHB1dCArICIvdW56aXB0ZXN0b3V0LzIvYmFyIik7CiAgICAgfQogCi0KICAgICAvKgogICAgICAqIFBSIDEwNTA0CiAgICAgICovCkBAIC0yMDIsMTAgKzE5MCw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhdHRlbk1hcHBlcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGbGF0dGVuTWFwcGVyIik7Ci0gICAgICAgIGFzc2VydEZpbGVNaXNzaW5nKCIxL2ZvbyBpcyBub3QgZmxhdHRlbmVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzEvZm9vIik7Ci0gICAgICAgIGFzc2VydEZpbGVFeGlzdHMoImZvbyBpcyBmbGF0dGVuZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvZm9vIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBmbGF0dGVuZWQiLCBvdXRwdXQgKyAiL3VuemlwdGVzdG91dC8xL2ZvbyIpOworICAgICAgICBhc3NlcnRGaWxlRXhpc3RzKCJmb28gaXMgZmxhdHRlbmVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvZm9vIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQsOCArMjAxLDcgQEAKICAgICAgKiBAcGFyYW0gZmlsZW5hbWUgZmlsZW5hbWUgdG8gcmVzb2x2ZSBhZ2FpbnN0IHRoZSBwcm9qZWN0CiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZpbGVFeGlzdHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTIyNSw4ICsyMTEsNyBAQAogICAgICAqIEBwYXJhbSBmaWxlbmFtZSBmaWxlbmFtZSB0byByZXNvbHZlIGFnYWluc3QgdGhlIHByb2plY3QKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmlsZU1pc3NpbmcoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmaWxlbmFtZSkgewotICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIWJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUoZmlsZW5hbWUpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZSwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShmaWxlbmFtZSkuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjM1LDIwICsyMjAsMTggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iTWFwcGVyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEdsb2JNYXBwZXIiKTsKLSAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIG5vdCBtYXBwZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKLSAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMS9mb28gaXMgbWFwcGVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzEvZm9vLnR4dCIpOworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0Iik7CisgICAgICAgIGFzc2VydEZpbGVNaXNzaW5nKCIxL2ZvbyBpcyBub3QgbWFwcGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMS9mb28gaXMgbWFwcGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28udHh0Iik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBtdWx0aXBsZSBtYXBwZXJzCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTWFwcGVycygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VHdvTWFwcGVycyIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gZXhwZWN0ZWQ6ICIgKyBFeHBhbmQuRVJST1JfTVVMVElQTEVfTUFQUEVSUyk7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUd29NYXBwZXJzIik7CisgICAgICAgIC8vIFRPRE8gQXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2MSw5ICsyNDQsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERvY3VtZW50YXRpb25DbGFpbXNPbkNvcHkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RG9jdW1lbnRhdGlvbkNsYWltc09uQ29weSIpOwotICAgICAgICBhc3NlcnRGaWxlTWlzc2luZygiMS9mb28gaXMgZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKLSAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMi9iYXIgaXMgbm90IGV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSArICIvdW56aXB0ZXN0b3V0LzIvYmFyIik7CisgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXQgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKTsKKyAgICAgICAgYXNzZXJ0RmlsZU1pc3NpbmcoIjEvZm9vIGlzIGV4Y2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMS9mb28iKTsKKyAgICAgICAgYXNzZXJ0RmlsZUV4aXN0cygiMi9iYXIgaXMgbm90IGV4Y2x1ZGVkIiwgb3V0cHV0ICsgIi91bnppcHRlc3RvdXQvMi9iYXIiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvVXBUb0RhdGVUZXN0LmphdmEKaW5kZXggOTdhM2M4Yy4uOWI3NzMyMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1VwVG9EYXRlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9VcFRvRGF0ZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XYXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvV2FyVGVzdC5qYXZhCmluZGV4IDE1MTNhYzcuLjgwNDE1MDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XYXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1dhclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDE1ICszMiwxMyBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFdhclRlc3QgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQlVJTERfRklMRQotICAgICAgICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93YXIueG1sIjsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoVEVTVF9CVUlMRF9GSUxFKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3dhci54bWwiKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9XaGljaFJlc291cmNlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1doaWNoUmVzb3VyY2VUZXN0LmphdmEKaW5kZXggOGUyODJiMy4uMzc0MjI5ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1doaWNoUmVzb3VyY2VUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1doaWNoUmVzb3VyY2VUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNiwxNiArMjYsMTMgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBwdWJsaWMgY2xhc3MgV2hpY2hSZXNvdXJjZVRlc3QgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQlVJTERfRklMRQotICAgICAgICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy93aGljaHJlc291cmNlLnhtbCI7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLQogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoVEVTVF9CVUlMRF9GSUxFKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL3doaWNocmVzb3VyY2UueG1sIik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxQcm9wZXJ0eVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxQcm9wZXJ0eVRlc3QuamF2YQppbmRleCBkODMzZjc1Li43ZjlmODAxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sUHJvcGVydHlUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbFByb3BlcnR5VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsMTAgKzIyLDEwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwpAQCAtMzUsOCArMzUsMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKICAqLwpAQCAtMTQ1LDEwICsxNDgsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBkb1Rlc3QoU3RyaW5nIG1zZywgYm9vbGVhbiBrZWVwUm9vdCwgYm9vbGVhbiBjb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VtYW50aWMsIGJvb2xlYW4gaW5jbHVkZSwgYm9vbGVhbiBsb2NhbFJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEVudW1lcmF0aW9uIGl0ZXIgPQotICAgICAgICAgICAgZ2V0RmlsZXMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy94bWxwcm9wZXJ0eS9pbnB1dHMiKSk7Ci0gICAgICAgIHdoaWxlIChpdGVyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBGaWxlIGlucHV0RmlsZSA9IChGaWxlKSBpdGVyLm5leHRFbGVtZW50KCk7CisgICAgICAgIGZvciAoRmlsZSBpbnB1dEZpbGUgOiBnZXRGaWxlcyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCJ4bWxwcm9wZXJ0eS9pbnB1dHMiKSkpIHsKICAgICAgICAgICAgIC8vIFdoYXQncyB0aGUgd29ya2luZyBkaXJlY3Rvcnk/ICBJZiBsb2NhbCwgdGhlbiBpdHMgdGhlCiAgICAgICAgICAgICAvLyBmb2xkZXIgb2YgdGhlIGlucHV0IGZpbGUuICBPdGhlcndpc2UsIGl0cyB0aGUgImN1cnJlbnQiIGRpci4uCiAgICAgICAgICAgICBGaWxlIHdvcmtpbmdEaXI7CkBAIC0xNTgsNyArMTU4LDYgQEAKICAgICAgICAgICAgICAgICB3b3JraW5nRGlyID0gRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZSgiLiIpLCAiLiIpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIEZpbGUgcHJvcGVydHlGaWxlID0gZ2V0R29sZGZpbGUoaW5wdXRGaWxlLCBrZWVwUm9vdCwgY29sbGFwc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbWFudGljLCBpbmNsdWRlLCBsb2NhbFJvb3QpOwogICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eUZpbGUuZXhpc3RzKCkpIHsKQEAgLTIwOSwxMSArMjA4LDkgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVByb3BlcnRpZXMoU3RyaW5nIG1zZywgRmlsZSBpbnB1dEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIHdvcmtpbmdEaXIsIFByb2plY3QgcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcykgewotICAgICAgICBIYXNodGFibGUgeG1scHJvcGVydGllcyA9IHAuZ2V0UHJvcGVydGllcygpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+IHhtbHByb3BlcnRpZXMgPSBwLmdldFByb3BlcnRpZXMoKTsKICAgICAgICAgLy8gRXZlcnkga2V5IGlkZW50aWZpZWQgYnkgdGhlIFByb3BlcnRpZXMgbXVzdCBoYXZlIGJlZW4gbG9hZGVkLgotICAgICAgICBFbnVtZXJhdGlvbjw/PiBwcm9wZXJ0eUtleUVudW0gPSBwcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgd2hpbGUgKHByb3BlcnR5S2V5RW51bS5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRLZXkgPSBwcm9wZXJ0eUtleUVudW0ubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOworICAgICAgICBmb3IgKFN0cmluZyBjdXJyZW50S2V5IDogcHJvcGVydGllcy5zdHJpbmdQcm9wZXJ0eU5hbWVzKCkpIHsKICAgICAgICAgICAgIFN0cmluZyBhc3NlcnRNc2cgPSBtc2cgKyAiLSIgKyBpbnB1dEZpbGUuZ2V0TmFtZSgpCiAgICAgICAgICAgICAgICAgKyAiIEtleT0iICsgY3VycmVudEtleTsKIApAQCAtMjI5LDE4ICsyMjYsMTMgQEAKICAgICAgICAgICAgICAgICAvLyAqdmFsdWUqIG9mIHRoZSBQYXRoIG9iamVjdCwgdGhvdWdoLi4uCiAgICAgICAgICAgICAgICAgT2JqZWN0IG9iaiA9IHAuZ2V0UmVmZXJlbmNlcygpLmdldChjdXJyZW50S2V5KTsKIAotICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsKGFzc2VydE1zZyArICIgT2JqZWN0IElEIGRvZXMgbm90IGV4aXN0LiIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoYXNzZXJ0TXNnICsgIiBPYmplY3QgSUQgZG9lcyBub3QgZXhpc3QuIiwgbnVsbCwgb2JqKTsKIAogICAgICAgICAgICAgICAgIC8vIFdoYXQgaXMgdGhlIHByb3BlcnR5IHN1cHBvc2VkIHRvIGJlPwotICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUgPQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnN1YnN0cmluZygzLCBwcm9wZXJ0eVZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcoMyk7CiAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUuZXF1YWxzKCJwYXRoIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUGF0aCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoYXNzZXJ0TXNnICsgIiBQYXRoIElEIGlzIGEgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChhc3NlcnRNc2cgKyAiIFBhdGggSUQgaXMgYSAiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiwgaW5zdGFuY2VPZihQYXRoLmNsYXNzKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFzc2VydE1zZywgcHJvcGVydHlWYWx1ZSwgb2JqLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KQEAgLTI1MSw4ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJvcGVydHkgaXMgdGhlIG5hbWUgb2YgYSBmaWxlLiAgV2UgYXJlIHRlc3RpbmcKICAgICAgICAgICAgICAgICAgICAgLy8gYSBsb2NhdGlvbiBhdHRyaWJ1dGUsIHNvIHdlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgZ2l2ZW4KICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBuYW1lIGluIHRoZSBwcm92aWRlZCBmb2xkZXIuCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLnN1YnN0cmluZyg1LCBwcm9wZXJ0eVZhbHVlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcHJvcGVydHlWYWx1ZS5zdWJzdHJpbmcoNSk7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsIGZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZSA9IGYuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjY2LDMxICsyNTcsMTkgQEAKICAgICAvKioKICAgICAgKiBEZWJ1Z2dpbmcgbWV0aG9kIHRvIHByaW50IHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBnaXZlbiBoYXNodGFibGUKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UHJvcGVydGllcyhIYXNodGFibGUgeG1scHJvcGVydGllcykgewotICAgICAgICBFbnVtZXJhdGlvbiBrZXlFbnVtID0geG1scHJvcGVydGllcy5rZXlzKCk7Ci0gICAgICAgIHdoaWxlIChrZXlFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgY3VycmVudEtleSA9IGtleUVudW0ubmV4dEVsZW1lbnQoKS50b1N0cmluZygpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1cnJlbnRLZXkgKyAiID0gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgeG1scHJvcGVydGllcy5nZXQoY3VycmVudEtleSkpOwotICAgICAgICB9CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFByb3BlcnRpZXMoSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PiB4bWxwcm9wZXJ0aWVzKSB7CisgICAgICAgIHhtbHByb3BlcnRpZXMuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgLT4gU3lzdGVtLm91dC5wcmludGxuKGtleSArICIgPSAiICsgdmFsdWUpKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBFbnN1cmUgYWxsIHJlZmVyZW5jZXMgbG9hZGVkIGJ5IHRoZSBwcm9qZWN0IGFyZSB2YWxpZC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuc3VyZVJlZmVyZW5jZXMgKFN0cmluZyBtc2csIEZpbGUgaW5wdXRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlIHJlZmVyZW5jZXMpIHsKLSAgICAgICAgRW51bWVyYXRpb24gcmVmZXJlbmNlS2V5RW51bSA9IHJlZmVyZW5jZXMua2V5cygpOwotICAgICAgICB3aGlsZShyZWZlcmVuY2VLZXlFbnVtLmhhc01vcmVFbGVtZW50cygpKXsKLSAgICAgICAgICAgIFN0cmluZyBjdXJyZW50S2V5ID0gcmVmZXJlbmNlS2V5RW51bS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBPYmplY3QgY3VycmVudFZhbHVlID0gcmVmZXJlbmNlcy5nZXQoY3VycmVudEtleSk7Ci0KLSAgICAgICAgICAgIGlmICghKGN1cnJlbnRWYWx1ZSBpbnN0YW5jZW9mIFBhdGgpICYmICEoY3VycmVudFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICAmJiAhY3VycmVudEtleS5zdGFydHNXaXRoKCJhbnQuIikpIHsKLSAgICAgICAgICAgICAgICBmYWlsKG1zZyArICItIiArIGlucHV0RmlsZS5nZXROYW1lKCkgKyAiIEtleT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGN1cnJlbnRLZXkgKyAiIGlzIG5vdCBhIHJlY29nbml6ZWQgdHlwZS4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlUmVmZXJlbmNlcyhTdHJpbmcgbXNnLCBGaWxlIGlucHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgT2JqZWN0PiByZWZlcmVuY2VzKSB7CisgICAgICAgIHJlZmVyZW5jZXMuZm9yRWFjaCgoa2V5LCB2YWx1ZSkgLT4gYXNzZXJ0VHJ1ZShtc2cgKyAiLSIgKyBpbnB1dEZpbGUuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgKyAiIEtleT0iICsga2V5ICsgIiBpcyBub3QgYSByZWNvZ25pemVkIHR5cGUuIiwKKyAgICAgICAgICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIFBhdGggfHwgdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgfHwga2V5LnN0YXJ0c1dpdGgoImFudC4iKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzM3LDMyICszMTYsMzAgQEAKICAgICAgKiBSZXRyaWV2ZSBhIGxpc3Qgb2YgeG1sIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyCiAgICAgICogYW5kIGJlbG93LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uIGdldEZpbGVzIChmaW5hbCBGaWxlIHN0YXJ0aW5nRGlyKSB7Ci0gICAgICAgIFZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWxlPiBnZXRGaWxlcyhmaW5hbCBGaWxlIHN0YXJ0aW5nRGlyKSB7CisgICAgICAgIExpc3Q8RmlsZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGdldEZpbGVzKHN0YXJ0aW5nRGlyLCByZXN1bHQpOwotICAgICAgICByZXR1cm4gcmVzdWx0LmVsZW1lbnRzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQ29sbGVjdCBhIGxpc3Qgb2YgeG1sIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyCiAgICAgICogYW5kIGJlbG93LgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RmlsZXMgKGZpbmFsIEZpbGUgc3RhcnRpbmdEaXIsIFZlY3RvciBjb2xsZWN0KSB7Ci0gICAgICAgIEZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQgKEZpbGUgZmlsZSkgewotICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmaWxlLmdldFBhdGgoKS5pbmRleE9mKCJ0YXNrZGVmcyIpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuZ2V0UGF0aCgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi54bWwiKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RmlsZXMoZmluYWwgRmlsZSBzdGFydGluZ0RpciwgTGlzdDxGaWxlPiBjb2xsZWN0KSB7CisgICAgICAgIEZpbGVGaWx0ZXIgZmlsdGVyID0gZmlsZSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWxlLmdldFBhdGgoKS5jb250YWlucygidGFza2RlZnMiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZmlsZS5nZXRQYXRoKCkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgiLnhtbCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogCiAgICAgICAgIEZpbGVbXSBmaWxlcyA9IHN0YXJ0aW5nRGlyLmxpc3RGaWxlcyhmaWx0ZXIpOwogICAgICAgICBmb3IgKEZpbGUgZiA6IGZpbGVzKSB7CiAgICAgICAgICAgICBpZiAoIWYuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIGNvbGxlY3QuYWRkRWxlbWVudChmKTsKKyAgICAgICAgICAgICAgICBjb2xsZWN0LmFkZChmKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZ2V0RmlsZXMoZiwgY29sbGVjdCk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sbnNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWG1sbnNUZXN0LmphdmEKaW5kZXggMzc5ZmMwMi4uNjBiMTU5NSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1htbG5zVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9YbWxuc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE1ICsxOCwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIAogcHVibGljIGNsYXNzIFhtbG5zVGVzdCB7CkBAIC0zNCw2ICszNCw5IEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMveG1sbnMueG1sIik7CkBAIC01OSwxMiArNjIsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZWQoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZXhjbHVkZWQiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiBleGNsdWRlZCB1cmkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXR0ZW1wdCB0byB1c2UgYSByZXNlcnZlZCBVUkkgYW50Om5vdGFsbG93ZWQiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQXR0ZW1wdCB0byB1c2UgYSByZXNlcnZlZCBVUkkgYW50Om5vdGFsbG93ZWQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVkIik7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXBFeHRyYUZpZWxkVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcEV4dHJhRmllbGRUZXN0LmphdmEKaW5kZXggZGNmNGUzOC4uNmI1M2E2OCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcEV4dHJhRmllbGRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcEV4dHJhRmllbGRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNSw5ICszNSwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiBwdWJsaWMgY2xhc3MgWmlwRXh0cmFGaWVsZFRlc3QgewogCkBAIC05OCwxMCArOTksMTAgQEAKICAgICAgICAgICAgIFppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoIngiKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoemUpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdFppcDY0ID8gMiA6IDEsIHplLmdldEV4dHJhRmllbGRzKCkubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoemUuZ2V0RXh0cmFGaWVsZHMoKVswXSBpbnN0YW5jZW9mIEphck1hcmtlcik7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHplLmdldEV4dHJhRmllbGRzKClbMF0sIGluc3RhbmNlT2YoSmFyTWFya2VyLmNsYXNzKSk7CiAgICAgICAgICAgICBpZiAoZXhwZWN0WmlwNjQpIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHplLmdldEV4dHJhRmllbGRzKClbMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlb2YgWmlwNjRFeHRlbmRlZEluZm9ybWF0aW9uRXh0cmFGaWVsZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCh6ZS5nZXRFeHRyYUZpZWxkcygpWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VPZihaaXA2NEV4dGVuZGVkSW5mb3JtYXRpb25FeHRyYUZpZWxkLmNsYXNzKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBaaXBGaWxlLmNsb3NlUXVpZXRseSh6Zik7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL1ppcFRlc3QuamF2YQppbmRleCA0YTczYWVjLi5mNmI1NjE1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvWmlwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9aaXBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKQEAgLTM0LDE0ICszMywxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAotCiBwdWJsaWMgY2xhc3MgWmlwVGVzdCB7CiAKICAgICBAUnVsZQpAQCAtNTAsNTIgKzQ5LDQ3IEBACiAgICAgLy9pbnN0YW5jZSB2YXJpYWJsZSB0byBhbGxvdyBjbGVhbnVwCiAgICAgWmlwRmlsZSB6ZlByZWZpeEFkZHNEaXIgPSBudWxsOwogCi0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy96aXAueG1sIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzZXRVcCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRmFpbCBkdWUgdG8gcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiByZXF1aXJlZCBhcmd1bWVudCBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7CisgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgZHVlIHRvIHJlcXVpcmVkIGFyZ3VtZW50IG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogcmVxdWlyZWQgYXJndW1lbnQgbm90IHNwZWNpZmllZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBGYWlsIGJlY2F1c2UgemlwIGNhbm5vdCBpbmNsdWRlIGl0c2VsZgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIGV4cGVjdGVkOiB6aXAgY2Fubm90IGluY2x1ZGUgaXRzZWxmIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CisgICAgICAgIC8vVE9ETyBhc3NlcnQgdmFsdWUKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEZhaWwgYmVjYXVzZSB6aXAgY2Fubm90IGluY2x1ZGUgaXRzZWxmCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBASWdub3JlKCJQcmV2aW91c2x5IGNvbW1lbnRlZCBvdXQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q0Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBleHBlY3RlZDogemlwIGNhbm5vdCBpbmNsdWRlIGl0c2VsZiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCB2YWx1ZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NCIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IHZhbHVlCiAgICAgfQogCiAgICAgQEFmdGVyCkBAIC0xMDQsNyArOTgsNiBAQAogICAgICAgICAgICAgaWYgKHpmUHJlZml4QWRkc0RpciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgemZQcmVmaXhBZGRzRGlyLmNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgLy9pZ25vcmVkCiAgICAgICAgIH0KQEAgLTEzOSwxMiArMTMyLDEyIEBACiAgICAgICAgIFppcEZpbGUgemlwRmlsZSA9IG5ldyBaaXBGaWxlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLAogICAgICAgICAgICAgICAgICJ6aXBncm91cGZpbGVzZXQuemlwIikpOwogCi0gICAgICAgIGFzc2VydFRydWUoemlwRmlsZS5nZXRFbnRyeSgiYW50LnhtbCIpICE9IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHppcEZpbGUuZ2V0RW50cnkoIm9wdGlvbmFsL2pzcGMueG1sIikgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoemlwRmlsZS5nZXRFbnRyeSgiemlwL3ppcGdyb3VwZmlsZXNldDMuemlwIikgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoemlwRmlsZS5nZXRFbnRyeSgiYW50LnhtbCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh6aXBGaWxlLmdldEVudHJ5KCJvcHRpb25hbC9qc3BjLnhtbCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh6aXBGaWxlLmdldEVudHJ5KCJ6aXAvemlwZ3JvdXBmaWxlc2V0My56aXAiKSk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSh6aXBGaWxlLmdldEVudHJ5KCJ0ZXN0Ni5tZiIpID09IG51bGwpOwotICAgICAgICBhc3NlcnRUcnVlKHppcEZpbGUuZ2V0RW50cnkoInRlc3Q3Lm1mIikgPT0gbnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoemlwRmlsZS5nZXRFbnRyeSgidGVzdDYubWYiKSk7CisgICAgICAgIGFzc2VydE51bGwoemlwRmlsZS5nZXRFbnRyeSgidGVzdDcubWYiKSk7CiAKICAgICAgICAgemlwRmlsZS5jbG9zZSgpOwogICAgIH0KQEAgLTE1MiwxMyArMTQ1LDEzIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm90TmVjZXNzYXJ5KCkgewogICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VXBkYXRlTm90TmVjZXNzYXJ5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscygtMSwgYnVpbGRSdWxlLmdldExvZygpLmluZGV4T2YoIlVwZGF0aW5nIikpOworICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIlVwZGF0aW5nIikpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJc05lY2Vzc2FyeSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVcGRhdGVJc05lY2Vzc2FyeSIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiVXBkYXRpbmciLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlVwZGF0aW5nIikpOwogICAgIH0KIAogICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAxODQwMwpAQCAtMjA2LDcgKzE5OSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwRW1wdHlDcmVhdGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ6aXBFbXB0eUNyZWF0ZSIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiTm90ZTogY3JlYXRpbmcgZW1wdHkiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIk5vdGU6IGNyZWF0aW5nIGVtcHR5IikpOwogICAgIH0KIAogICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAyNTUxMwpAQCAtMjE3LDE4ICsyMTAsMTAgQEAKIAogICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAzMzQxMgogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFeGNsdWRlc0FuZFVwZGF0ZSgpCi0gICAgICAgIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEV4Y2x1ZGVzQW5kVXBkYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERlZmF1bHRFeGNsdWRlc0FuZFVwZGF0ZSIpOwotICAgICAgICBaaXBGaWxlIGYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZiA9IG5ldyBaaXBGaWxlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDMuemlwIikpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiemlwdGVzdH4gc2hvdWxkIGJlIGluY2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXRFbnRyeSgiemlwdGVzdH4iKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZi5jbG9zZSgpOwotICAgICAgICAgICAgfQorICAgICAgICB0cnkgKFppcEZpbGUgZiA9IG5ldyBaaXBGaWxlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDMuemlwIikpKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJ6aXB0ZXN0fiBzaG91bGQgYmUgaW5jbHVkZWQiLCBmLmdldEVudHJ5KCJ6aXB0ZXN0fiIpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ1LDY1ICsyMzAsNDEgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJGaWxlU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RUYXJGaWxlU2V0Iik7Ci0gICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUgemYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgemYgPSBuZXcgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgInRlc3QzLnppcCIpKTsKKyAgICAgICAgdHJ5IChvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlIHpmID0gbmV3IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ0ZXN0My56aXAiKSkpIHsKICAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoImFzZi1sb2dvLmdpZiIpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXhTdGF0LkZJTEVfRkxBRyB8IDA0NDYsIHplLmdldFVuaXhNb2RlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmV3cml0ZVplcm9QZXJtaXNzaW9ucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJld3JpdGVaZXJvUGVybWlzc2lvbnMiKTsKLSAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZSB6ZiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6ZiA9IG5ldyBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDMuemlwIikpOworICAgICAgICB0cnkgKG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUgemYgPSBuZXcgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgInRlc3QzLnppcCIpKSkgewogICAgICAgICAgICAgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnkgemUgPSB6Zi5nZXRFbnRyeSgidGVzdGRpci90ZXN0LnR4dCIpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXhTdGF0LkZJTEVfRkxBRyB8IDA2NDQsIHplLmdldFVuaXhNb2RlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0WmVyb1Blcm1pc3Npb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiYWNjZXB0WmVyb1Blcm1pc3Npb25zIik7Ci0gICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUgemYgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgemYgPSBuZXcgb3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJvdXRwdXQiKSwgInRlc3QzLnppcCIpKTsKKyAgICAgICAgdHJ5IChvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlIHpmID0gbmV3IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ0ZXN0My56aXAiKSkpIHsKICAgICAgICAgICAgIG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoInRlc3RkaXIvdGVzdC50eHQiKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygwMDAwLCB6ZS5nZXRVbml4TW9kZSgpKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmICh6ZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgemYuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZvckJ1Z3ppbGxhMzQ3NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Rm9yQnVnemlsbGEzNDc2NCIpOwotICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlIHpmID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHpmID0gbmV3IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJ0ZXN0My56aXAiKSk7CisgICAgICAgIHRyeSAob3JnLmFwYWNoZS50b29scy56aXAuWmlwRmlsZSB6ZiA9IG5ldyBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBGaWxlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAidGVzdDMuemlwIikpKSB7CiAgICAgICAgICAgICBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBFbnRyeSB6ZSA9IHpmLmdldEVudHJ5KCJmaWxlMSIpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFVuaXhTdGF0LkZJTEVfRkxBRyB8IDA2NDQsIHplLmdldFVuaXhNb2RlKCkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpmICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB6Zi5jbG9zZSgpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnZXhwTWFwcGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnZXhwTWFwcGVyKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJlZ2V4cE1hcHBlcjEiKTsKICAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgInJlZ2V4cC56aXAiKTsKICAgICAgICAgbG9uZyBsID0gdGVzdEZpbGUubGFzdE1vZGlmaWVkKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0RlZmF1bHRDb21waWxlckFkYXB0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0RlZmF1bHRDb21waWxlckFkYXB0ZXJUZXN0LmphdmEKaW5kZXggNGVhMDc5Yy4uYzNmMmVhMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXJBZGFwdGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvRGVmYXVsdENvbXBpbGVyQWRhcHRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDYgKzE4LDE1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc0l0ZW07CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTI1LDE3ICszNCwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5KYXZhYzsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5Db21tYW5kbGluZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogCiBwdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBpbGVyQWRhcHRlclRlc3QgewogCkBAIC0yNDgsNiArMjU3LDcgQEAKICAgICAgICAgICAgIGphdmFjLnNldFByb2plY3QocHJqKTsKICAgICAgICAgICAgIGZpbmFsIENvbW1hbmRsaW5lW10gY21kID0gbmV3IENvbW1hbmRsaW5lWzFdOwogICAgICAgICAgICAgZmluYWwgRGVmYXVsdENvbXBpbGVyQWRhcHRlciBpbXBsID0gbmV3IERlZmF1bHRDb21waWxlckFkYXB0ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgIGNtZFswXSA9IHNldHVwTW9kZXJuSmF2YWNDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjYyLDIyICsyNzIsMjIgQEAKICAgICAgICAgICAgIGphdmFjLnNldEluY2x1ZGVhbnRydW50aW1lKGZhbHNlKTsKICAgICAgICAgICAgIGphdmFjLmFkZChpbXBsKTsKICAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNtZFswXSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNtZFswXSk7CiAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY21kTGluZSA9IEFycmF5cy5hc0xpc3QoY21kWzBdLmdldENvbW1hbmRsaW5lKCkpOwogICAgICAgICAgICAgLy9ObyBtb2R1bGVzb3VyY2VwYXRoCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGNtZExpbmUuaW5kZXhPZigiLS1tb2R1bGUtc291cmNlLXBhdGgiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNtZExpbmUsIG5vdChoYXNJdGVtKCItLW1vZHVsZS1zb3VyY2UtcGF0aCIpKSk7CiAgICAgICAgICAgICAvL1RoZSAtc291cmNlcGF0aCBoYXMgdG8gYmUgZm9sbG93ZWQgYnkgc3JjCiAgICAgICAgICAgICBpbnQgaW5kZXggPSBjbWRMaW5lLmluZGV4T2YoIi1zb3VyY2VwYXRoIik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbmRleCAhPSAtMSAmJiBpbmRleCA8IGNtZExpbmUuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGluZGV4ICE9IC0xICYmIGluZGV4IDwgY21kTGluZS5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcmMuZ2V0QWJzb2x1dGVQYXRoKCksIGNtZExpbmUuZ2V0KGluZGV4ICsgMSkpOwogICAgICAgICAgICAgLy9UaGUgLS1tb2R1bGUtcGF0aCBoYXMgdG8gYmUgZm9sbG93ZWQgYnkgbW9kdWxlcwogICAgICAgICAgICAgaW5kZXggPSBjbWRMaW5lLmluZGV4T2YoIi0tbW9kdWxlLXBhdGgiKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGluZGV4ICE9IC0xICYmIGluZGV4IDwgY21kTGluZS5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW5kZXggIT0gLTEgJiYgaW5kZXggPCBjbWRMaW5lLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZXMuZ2V0QWJzb2x1dGVQYXRoKCksIGNtZExpbmUuZ2V0KGluZGV4ICsgMSkpOwogICAgICAgICAgICAgLy9KMS5qYXZhICYgSjIuamF2YSBoYXMgdG8gYmUgaW4gZmlsZXMgbGlzdAotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBleHBlY3RlZCA9IG5ldyBUcmVlU2V0PD4oKTsKICAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChleHBlY3RlZCwgamF2YTEuZ2V0QWJzb2x1dGVQYXRoKCksIGphdmEyLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFjdHVhbCA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY21kTGluZS5zdWJMaXN0KGNtZExpbmUuc2l6ZSgpIC0gMiwgY21kTGluZS5zaXplKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFjdHVhbCA9IG5ldyBUcmVlU2V0PD4oY21kTGluZS5zdWJMaXN0KGNtZExpbmUuc2l6ZSgpIC0gMiwgY21kTGluZS5zaXplKCkpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGRlbGV0ZSh3b3JrRGlyKTsKQEAgLTMwMyw2ICszMTMsNyBAQAogICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcmopOwogICAgICAgICAgICAgZmluYWwgQ29tbWFuZGxpbmVbXSBjbWQgPSBuZXcgQ29tbWFuZGxpbmVbMV07CiAgICAgICAgICAgICBmaW5hbCBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyIGltcGwgPSBuZXcgRGVmYXVsdENvbXBpbGVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgY21kWzBdID0gc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmQoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0zMTksMTMgKzMzMCwxMyBAQAogICAgICAgICAgICAgamF2YWMuc2V0SW5jbHVkZWFudHJ1bnRpbWUoZmFsc2UpOwogICAgICAgICAgICAgamF2YWMuYWRkKGltcGwpOwogICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY21kWzBdKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY21kWzBdKTsKICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjbWRMaW5lID0gQXJyYXlzLmFzTGlzdChjbWRbMF0uZ2V0Q29tbWFuZGxpbmUoKSk7CiAgICAgICAgICAgICAvL05vIHNvdXJjZXBhdGgKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygtMSwgY21kTGluZS5pbmRleE9mKCItc291cmNlcGF0aCIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY21kTGluZSwgbm90KGhhc0l0ZW0oIi1zb3VyY2VwYXRoIikpKTsKICAgICAgICAgICAgIC8vVGhlIC0tbW9kdWxlLXNvdXJjZS1wYXRoIGhhcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgcGF0dGVybgogICAgICAgICAgICAgaW50IGluZGV4ID0gY21kTGluZS5pbmRleE9mKCItLW1vZHVsZS1zb3VyY2UtcGF0aCIpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5kZXggIT0gLTEgJiYgaW5kZXggPCBjbWRMaW5lLnNpemUoKSAtIDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbmRleCAhPSAtMSAmJiBpbmRleCA8IGNtZExpbmUuc2l6ZSgpIC0gMSk7CiAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWRNb2RTcmNQYXRoID0gU3RyaW5nLmZvcm1hdCgiJXMvJXMiLAogICAgICAgICAgICAgICAgICAgICB3b3JrRGlyLmdldEFic29sdXRlUGF0aCgpLAogICAgICAgICAgICAgICAgICAgICBtb2R1bGVTcmNQYXRoU3RyKQpAQCAtMzM0LDE1ICszNDUsMTUgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1vZFNyY1BhdGgsIGNtZExpbmUuZ2V0KGluZGV4ICsgMSkpOwogICAgICAgICAgICAgLy9UaGUgLS1tb2R1bGUtcGF0aCBoYXMgdG8gYmUgZm9sbG93ZWQgYnkgbW9kdWxlcwogICAgICAgICAgICAgaW5kZXggPSBjbWRMaW5lLmluZGV4T2YoIi0tbW9kdWxlLXBhdGgiKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGluZGV4ICE9IC0xICYmIGluZGV4IDwgY21kTGluZS5zaXplKCkgLSAxKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW5kZXggIT0gLTEgJiYgaW5kZXggPCBjbWRMaW5lLnNpemUoKSAtIDEpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZXMuZ2V0QWJzb2x1dGVQYXRoKCksIGNtZExpbmUuZ2V0KGluZGV4ICsgMSkpOwogICAgICAgICAgICAgLy9KMS5qYXZhLCBKMi5qYXZhICYgSjMuamF2YSBoYXMgdG8gYmUgaW4gZmlsZXMgbGlzdAotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZXhwZWN0ZWRGaWxlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGV4cGVjdGVkRmlsZXMgPSBuZXcgVHJlZVNldDw+KCk7CiAgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwoZXhwZWN0ZWRGaWxlcywKICAgICAgICAgICAgICAgICAgICAgamF2YTEuZ2V0QWJzb2x1dGVQYXRoKCksCiAgICAgICAgICAgICAgICAgICAgIGphdmEyLmdldEFic29sdXRlUGF0aCgpLAogICAgICAgICAgICAgICAgICAgICBqYXZhMy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhY3R1YWxGaWxlcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oY21kTGluZS5zdWJMaXN0KGNtZExpbmUuc2l6ZSgpIC0gMywgY21kTGluZS5zaXplKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGFjdHVhbEZpbGVzID0gbmV3IFRyZWVTZXQ8PihjbWRMaW5lLnN1Ykxpc3QoY21kTGluZS5zaXplKCkgLSAzLCBjbWRMaW5lLnNpemUoKSkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZXMsIGFjdHVhbEZpbGVzKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGRlbGV0ZSh3b3JrRGlyKTsKQEAgLTM2Niw2ICszNzcsNyBAQAogICAgICAgICAgICAgZmluYWwgTG9nQ2FwdHVyaW5nSmF2YWMgamF2YWMgPSBuZXcgTG9nQ2FwdHVyaW5nSmF2YWMoKTsKICAgICAgICAgICAgIGphdmFjLnNldFByb2plY3QocHJqKTsKICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRDb21waWxlckFkYXB0ZXIgaW1wbCA9IG5ldyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGV4ZWN1dGUoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICBzZXR1cE1vZGVybkphdmFjQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM4MywxNyArMzk1LDE0IEBACiAgICAgICAgICAgICBqYXZhYy5hZGQoaW1wbCk7CiAgICAgICAgICAgICBqYXZhYy5leGVjdXRlKCk7CiAgICAgICAgICAgICBmaW5hbCBGaWxlW10gY29tcGlsZUxpc3QgPSBpbXBsLmNvbXBpbGVMaXN0OwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29tcGlsZUxpc3QpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21waWxlTGlzdCk7CiAgICAgICAgICAgICAvL0oxLmphdmEsIEoyLmphdmEgaGFzIHRvIGJlIGluIGZpbGVzIGxpc3QgYnV0IG5vdCBKMy5qYXZhCi0gICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBleHBlY3RlZEZpbGVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZXhwZWN0ZWRGaWxlcyA9IG5ldyBUcmVlU2V0PD4oKTsKICAgICAgICAgICAgIENvbGxlY3Rpb25zLmFkZEFsbChleHBlY3RlZEZpbGVzLAogICAgICAgICAgICAgICAgICAgICBqYXZhMS5nZXRBYnNvbHV0ZVBhdGgoKSwKICAgICAgICAgICAgICAgICAgICAgamF2YTIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWN0dWFsRmlsZXMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKEZpbGUgY29tcGlsZUZpbGUgOiBjb21waWxlTGlzdCkgewotICAgICAgICAgICAgICAgIGFjdHVhbEZpbGVzLmFkZChjb21waWxlRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlcywgYWN0dWFsRmlsZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZXMsIEFycmF5cy5zdHJlYW0oY29tcGlsZUxpc3QpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoRmlsZTo6Z2V0QWJzb2x1dGVQYXRoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9Db2xsZWN0aW9uKFRyZWVTZXQ6Om5ldykpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGRlbGV0ZSh3b3JrRGlyKTsKICAgICAgICAgfQpAQCAtNDA0LDcgKzQxMyw3IEBACiAgICAgICAgIExvZ0NhcHR1cmluZ0phdmFjIGphdmFjID0gbmV3IExvZ0NhcHR1cmluZ0phdmFjKCk7CiAgICAgICAgIFByb2plY3QgcCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgIGphdmFjLnNldFByb2plY3QocCk7Ci0gICAgICAgIGphdmFjLnNldENvbXBpbGVyKCJqYXZhYzgiKTsKKyAgICAgICAgamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMS44Iik7CiAgICAgICAgIGphdmFjLnNldFNvdXJjZSgiNiIpOwogICAgICAgICBqYXZhYy5zZXRUYXJnZXQoIjYiKTsKICAgICAgICAgamF2YWMuc2V0UmVsZWFzZSgiNiIpOwpAQCAtNDEzLDggKzQyMiw4IEBACiAgICAgICAgIHN0aC5zZXRKYXZhYyhqYXZhYyk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBzdGguc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlN1cHBvcnQgZm9yIGphdmFjIC0tcmVsZWFzZSBoYXMgYmVlbiBhZGRlZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICsgIkphdmE5IGlnbm9yaW5nIGl0IiwgamF2YWMuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGphdmFjLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJTdXBwb3J0IGZvciBqYXZhYyAtLXJlbGVhc2UgaGFzIGJlZW4gYWRkZWQgaW4gSmF2YTkgaWdub3JpbmcgaXQiKSk7CiAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBjbWQuZ2V0Q29tbWFuZGxpbmUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGFyZ3MubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCItY2xhc3NwYXRoIiwgYXJnc1swXSk7CkBAIC00MzksOCArNDQ4LDggQEAKICAgICAgICAgc3RoLnNldEphdmFjKGphdmFjKTsKICAgICAgICAgQ29tbWFuZGxpbmUgY21kID0gbmV3IENvbW1hbmRsaW5lKCk7CiAgICAgICAgIHN0aC5zZXR1cE1vZGVybkphdmFjQ29tbWFuZGxpbmVTd2l0Y2hlcyhjbWQpOwotICAgICAgICBhc3NlcnRDb250YWlucygiSWdub3Jpbmcgc291cmNlLCB0YXJnZXQgYW5kIGJvb3RjbGFzc3BhdGggYXMgIgotICAgICAgICAgICAgICAgICAgICAgICArICJyZWxlYXNlIGhhcyBiZWVuIHNldCIsIGphdmFjLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqYXZhYy5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiSWdub3Jpbmcgc291cmNlLCB0YXJnZXQgYW5kIGJvb3RjbGFzc3BhdGggYXMgcmVsZWFzZSBoYXMgYmVlbiBzZXQiKSk7CiAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSBjbWQuZ2V0Q29tbWFuZGxpbmUoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGFyZ3MubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCItY2xhc3NwYXRoIiwgYXJnc1swXSk7CkBAIC00NDksNiArNDU4LDkwIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiNiIsIGFyZ3NbNF0pOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzc3VtZUphdmFYUGx1cygpIHsKKyAgICAJTG9nQ2FwdHVyaW5nSmF2YWMgamF2YWMgPSBuZXcgTG9nQ2FwdHVyaW5nSmF2YWMoKTsKKyAgICAgICAgUHJvamVjdCBwID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgamF2YWMuc2V0UHJvamVjdChwKTsKKyAgICAgICAgRGVmYXVsdENvbXBpbGVyQWRhcHRlciBjYSA9IG5ldyBEZWZhdWx0Q29tcGlsZXJBZGFwdGVyKCkgewkKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7CisJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgorCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfTsKKwkJY2Euc2V0SmF2YWMoamF2YWMpOworCQlTeXN0ZW0ub3V0LnByaW50bG4oamF2YWMuZ2V0Q29tcGlsZXIoKSk7CisJCQorCQlpZiAoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzEwKSkgeworCQkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMTBQbHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhOVBsdXMoKSk7CisJCX0gZWxzZSBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpIHsKKwkJCWFzc2VydEZhbHNlKGNhLmFzc3VtZUphdmExMFBsdXMoKSk7CisJCQlhc3NlcnRUcnVlKGNhLmFzc3VtZUphdmE5UGx1cygpKTsKKwkJCWFzc2VydFRydWUoY2EuYXNzdW1lSmF2YTFfOFBsdXMoKSk7CisJCX0gZWxzZSBpZiAoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV84KSkgeworCQkJYXNzZXJ0RmFsc2UoY2EuYXNzdW1lSmF2YTlQbHVzKCkpOworCQkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV84UGx1cygpKTsKKwkJCWFzc2VydFRydWUoY2EuYXNzdW1lSmF2YTFfN1BsdXMoKSk7CisJCX0KKwkJamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMTArIik7CisJCWFzc2VydFRydWUoY2EuYXNzdW1lSmF2YTEwUGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhOVBsdXMoKSk7CisJCQorCQlqYXZhYy5zZXRDb21waWxlcigiamF2YWM5Iik7CisJCWFzc2VydEZhbHNlKGNhLmFzc3VtZUphdmExMFBsdXMoKSk7CisJCWFzc2VydFRydWUoY2EuYXNzdW1lSmF2YTlQbHVzKCkpOworCQlhc3NlcnRUcnVlKGNhLmFzc3VtZUphdmExXzhQbHVzKCkpOworCQkKKwkJamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMS45Iik7CisJCWFzc2VydEZhbHNlKGNhLmFzc3VtZUphdmExMFBsdXMoKSk7CisJCWFzc2VydFRydWUoY2EuYXNzdW1lSmF2YTlQbHVzKCkpOworCQlhc3NlcnRUcnVlKGNhLmFzc3VtZUphdmExXzhQbHVzKCkpOworCQkKKwkJamF2YWMuc2V0Q29tcGlsZXIoImphdmFjMS44Iik7CisJCWFzc2VydEZhbHNlKGNhLmFzc3VtZUphdmE5UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV84UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV83UGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuNyIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV84UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV83UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV82UGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuNiIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV83UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV82UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV81UGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuNSIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV82UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV81UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV80UGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuNCIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV81UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV80UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8zUGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuMyIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV80UGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8zUGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8yUGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuMiIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV8zUGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8yUGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8xUGx1cygpKTsKKwkJCisJCWphdmFjLnNldENvbXBpbGVyKCJqYXZhYzEuMSIpOworCQlhc3NlcnRGYWxzZShjYS5hc3N1bWVKYXZhMV8yUGx1cygpKTsKKwkJYXNzZXJ0VHJ1ZShjYS5hc3N1bWVKYXZhMV8xUGx1cygpKTsKKyAgICB9CisgICAgCisKKyAgICAKKwogICAgIHByaXZhdGUgdm9pZCBjb21tb25Tb3VyY2VEb3duZ3JhZGVzKFN0cmluZyBqYXZhVmVyc2lvbikgewogICAgICAgICB0ZXN0U291cmNlKCIxLjMiLCBqYXZhVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAiSWYgeW91IHNwZWNpZnkgLXRhcmdldCAxLjEgeW91IG5vdyBtdXN0IGFsc28gc3BlY2lmeSIKQEAgLTQ4MiwxMSArNTc1LDEwIEBACiAgICAgICAgIHN0aC5zZXRKYXZhYyhqYXZhYyk7CiAgICAgICAgIENvbW1hbmRsaW5lIGNtZCA9IG5ldyBDb21tYW5kbGluZSgpOwogICAgICAgICBzdGguc2V0dXBNb2Rlcm5KYXZhY0NvbW1hbmRsaW5lU3dpdGNoZXMoY21kKTsKLSAgICAgICAgaWYgKCIiLmVxdWFscyhleHBlY3RlZExvZykpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkTG9nLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBqYXZhYy5nZXRMb2coKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTdHJpbmcgbCA9IGphdmFjLmdldExvZygpOwotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoZXhwZWN0ZWRMb2csIGwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChqYXZhYy5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoZXhwZWN0ZWRMb2cpKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmdbXSBhcmdzID0gY21kLmdldENvbW1hbmRsaW5lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNvdXJjZSA9PSBudWxsID8gMCA6IDIsIGFyZ3MubGVuZ3RoKTsKQEAgLTUxOCw5ICs2MTAsNyBAQAogICAgICAgICBpZiAoZi5pc0RpcmVjdG9yeSgpKSB7CiAgICAgICAgICAgICBmaW5hbCBGaWxlW10gY2xkcyA9IGYubGlzdEZpbGVzKCk7CiAgICAgICAgICAgICBpZiAoY2xkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChGaWxlIGNsZCA6IGNsZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlKGNsZCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oY2xkcykuZm9yRWFjaCh0aGlzOjpkZWxldGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGYuZGVsZXRlKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjRXh0ZXJuYWxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29tcGlsZXJzL0phdmFjRXh0ZXJuYWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5M2ZiNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb21waWxlcnMvSmF2YWNFeHRlcm5hbFRlc3QuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkphdmFjOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkNvbW1hbmRsaW5lOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBKYXZhY0V4dGVybmFsVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdEphdmFjRXh0ZXJuYWwgZXh0ZW5kcyBKYXZhY0V4dGVybmFsIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBhcmdzOworICAgICAgICBwcml2YXRlIGludCBmaXJzdEZpbGVOYW1lOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGV4ZWN1dGVFeHRlcm5hbENvbXBpbGUoU3RyaW5nW10gYXJncywgaW50IGZpcnN0RmlsZU5hbWUsIGZpbmFsIGJvb2xlYW4gcXVvdGVGaWxlcykgeworICAgICAgICAgICAgdGhpcy5hcmdzID0gYXJnczsKKyAgICAgICAgICAgIHRoaXMuZmlyc3RGaWxlTmFtZSA9IGZpcnN0RmlsZU5hbWU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBcmdzKCkgeworICAgICAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEZpcnN0RmlsZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmlyc3RGaWxlTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWxsSmF2YWNPcHRpb25zQnV0SkFyZVdyaXR0ZW5Ub0ZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSB3b3JrRGlyID0gY3JlYXRlV29ya0RpcigidGVzdFNNQyIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgRmlsZSBzcmMgPSBuZXcgRmlsZSh3b3JrRGlyLCAic3JjIik7CisgICAgICAgICAgICBzcmMubWtkaXIoKTsKKyAgICAgICAgICAgIGNyZWF0ZUZpbGUoc3JjLCAib3JnL2FwYWNoZS9hbnQvdGVzdHMvSjEuamF2YSIpOworICAgICAgICAgICAgY3JlYXRlRmlsZShzcmMsICJvcmcvYXBhY2hlL2FudC90ZXN0cy9KMi5qYXZhIik7CisgICAgICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZXMgPSBuZXcgRmlsZSh3b3JrRGlyLCAibW9kdWxlcyIpOworICAgICAgICAgICAgbW9kdWxlcy5ta2RpcigpOworICAgICAgICAgICAgZmluYWwgUHJvamVjdCBwcmogPSBuZXcgUHJvamVjdCgpOworICAgICAgICAgICAgcHJqLnNldEJhc2VEaXIod29ya0Rpcik7CisgICAgICAgICAgICBmaW5hbCBKYXZhYyBqYXZhYyA9IG5ldyBKYXZhYygpOworICAgICAgICAgICAgamF2YWMuc2V0UHJvamVjdChwcmopOworICAgICAgICAgICAgZmluYWwgQ29tbWFuZGxpbmVbXSBjbWQgPSBuZXcgQ29tbWFuZGxpbmVbMV07CisgICAgICAgICAgICBmaW5hbCBUZXN0SmF2YWNFeHRlcm5hbCBpbXBsID0gbmV3IFRlc3RKYXZhY0V4dGVybmFsKCk7CisgICAgICAgICAgICBmaW5hbCBQYXRoIHNyY1BhdGggPSBuZXcgUGF0aChwcmopOworICAgICAgICAgICAgc3JjUGF0aC5zZXRMb2NhdGlvbihzcmMpOworICAgICAgICAgICAgamF2YWMuc2V0U3JjZGlyKHNyY1BhdGgpOworICAgICAgICAgICAgamF2YWMuY3JlYXRlTW9kdWxlcGF0aCgpLnNldExvY2F0aW9uKG1vZHVsZXMpOworICAgICAgICAgICAgamF2YWMuc2V0U291cmNlKCI5Iik7CisgICAgICAgICAgICBqYXZhYy5zZXRUYXJnZXQoIjkiKTsKKyAgICAgICAgICAgIGphdmFjLnNldEZvcmsodHJ1ZSk7CisgICAgICAgICAgICBqYXZhYy5zZXRNZW1vcnlJbml0aWFsU2l6ZSgiODBtIik7CisgICAgICAgICAgICBqYXZhYy5zZXRFeGVjdXRhYmxlKCJqYXZhY0V4ZWN1dGFibGUiKTsKKyAgICAgICAgICAgIGphdmFjLmFkZChpbXBsKTsKKyAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YWNFeGVjdXRhYmxlIiwgaW1wbC5nZXRBcmdzKClbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItSi1YbXM4MG0iLCBpbXBsLmdldEFyZ3MoKVsxXSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGltcGwuZ2V0QXJncygpW2ltcGwuZ2V0QXJncygpLmxlbmd0aCAtIDFdLmVuZHNXaXRoKCJKMi5qYXZhIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGltcGwuZ2V0Rmlyc3RGaWxlTmFtZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRlbGV0ZSh3b3JrRGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYWxsSk9wdGlvbnNBcmVNb3ZlZFRvQmVnaW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgd29ya0RpciA9IGNyZWF0ZVdvcmtEaXIoInRlc3RTTUMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgc3JjID0gbmV3IEZpbGUod29ya0RpciwgInNyYyIpOworICAgICAgICAgICAgc3JjLm1rZGlyKCk7CisgICAgICAgICAgICBjcmVhdGVGaWxlKHNyYywgIm9yZy9hcGFjaGUvYW50L3Rlc3RzL0oxLmphdmEiKTsKKyAgICAgICAgICAgIGNyZWF0ZUZpbGUoc3JjLCAib3JnL2FwYWNoZS9hbnQvdGVzdHMvSjIuamF2YSIpOworICAgICAgICAgICAgZmluYWwgRmlsZSBtb2R1bGVzID0gbmV3IEZpbGUod29ya0RpciwgIm1vZHVsZXMiKTsKKyAgICAgICAgICAgIG1vZHVsZXMubWtkaXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJqID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgICAgIHByai5zZXRCYXNlRGlyKHdvcmtEaXIpOworICAgICAgICAgICAgZmluYWwgSmF2YWMgamF2YWMgPSBuZXcgSmF2YWMoKTsKKyAgICAgICAgICAgIGphdmFjLnNldFByb2plY3QocHJqKTsKKyAgICAgICAgICAgIGZpbmFsIENvbW1hbmRsaW5lW10gY21kID0gbmV3IENvbW1hbmRsaW5lWzFdOworICAgICAgICAgICAgZmluYWwgVGVzdEphdmFjRXh0ZXJuYWwgaW1wbCA9IG5ldyBUZXN0SmF2YWNFeHRlcm5hbCgpOworICAgICAgICAgICAgZmluYWwgUGF0aCBzcmNQYXRoID0gbmV3IFBhdGgocHJqKTsKKyAgICAgICAgICAgIHNyY1BhdGguc2V0TG9jYXRpb24oc3JjKTsKKyAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihzcmNQYXRoKTsKKyAgICAgICAgICAgIGphdmFjLmNyZWF0ZU1vZHVsZXBhdGgoKS5zZXRMb2NhdGlvbihtb2R1bGVzKTsKKyAgICAgICAgICAgIGphdmFjLnNldFNvdXJjZSgiOSIpOworICAgICAgICAgICAgamF2YWMuc2V0VGFyZ2V0KCI5Iik7CisgICAgICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOworICAgICAgICAgICAgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUoIjgwbSIpOworICAgICAgICAgICAgamF2YWMuc2V0RXhlY3V0YWJsZSgiamF2YWNFeGVjdXRhYmxlIik7CisgICAgICAgICAgICBqYXZhYy5hZGQoaW1wbCk7CisgICAgICAgICAgICBqYXZhYy5jcmVhdGVDb21waWxlckFyZygpLnNldFZhbHVlKCItSkRmb289YmFyIik7CisgICAgICAgICAgICBqYXZhYy5jcmVhdGVDb21waWxlckFyZygpLnNldFZhbHVlKCItSkRyZWQ9Y29sb3IiKTsKKyAgICAgICAgICAgIGphdmFjLmNyZWF0ZUNvbXBpbGVyQXJnKCkuc2V0TGluZSgiLUpEc3BhY2UgbGluZSIpOworICAgICAgICAgICAgamF2YWMuZXhlY3V0ZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhY0V4ZWN1dGFibGUiLCBpbXBsLmdldEFyZ3MoKVswXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi1KLVhtczgwbSIsIGltcGwuZ2V0QXJncygpWzFdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiLUpEZm9vPWJhciIsIGltcGwuZ2V0QXJncygpWzJdKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiLUpEcmVkPWNvbG9yIiwgaW1wbC5nZXRBcmdzKClbM10pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItSkRzcGFjZSIsIGltcGwuZ2V0QXJncygpWzRdKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW1wbC5nZXRBcmdzKClbaW1wbC5nZXRBcmdzKCkubGVuZ3RoIC0gMV0uZW5kc1dpdGgoIkoyLmphdmEiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgaW1wbC5nZXRGaXJzdEZpbGVOYW1lKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZGVsZXRlKHdvcmtEaXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhcmdGaWxlT3B0aW9uSXNNb3ZlZFRvQmVnaW5uaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGUgd29ya0RpciA9IGNyZWF0ZVdvcmtEaXIoInRlc3RTTUMiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgc3JjID0gbmV3IEZpbGUod29ya0RpciwgInNyYyIpOworICAgICAgICAgICAgc3JjLm1rZGlyKCk7CisgICAgICAgICAgICBjcmVhdGVGaWxlKHNyYywgIm9yZy9hcGFjaGUvYW50L3Rlc3RzL0oxLmphdmEiKTsKKyAgICAgICAgICAgIGNyZWF0ZUZpbGUoc3JjLCAib3JnL2FwYWNoZS9hbnQvdGVzdHMvSjIuamF2YSIpOworICAgICAgICAgICAgZmluYWwgRmlsZSBtb2R1bGVzID0gbmV3IEZpbGUod29ya0RpciwgIm1vZHVsZXMiKTsKKyAgICAgICAgICAgIG1vZHVsZXMubWtkaXIoKTsKKyAgICAgICAgICAgIGZpbmFsIFByb2plY3QgcHJqID0gbmV3IFByb2plY3QoKTsKKyAgICAgICAgICAgIHByai5zZXRCYXNlRGlyKHdvcmtEaXIpOworICAgICAgICAgICAgZmluYWwgSmF2YWMgamF2YWMgPSBuZXcgSmF2YWMoKTsKKyAgICAgICAgICAgIGphdmFjLnNldFByb2plY3QocHJqKTsKKyAgICAgICAgICAgIGZpbmFsIENvbW1hbmRsaW5lW10gY21kID0gbmV3IENvbW1hbmRsaW5lWzFdOworICAgICAgICAgICAgZmluYWwgVGVzdEphdmFjRXh0ZXJuYWwgaW1wbCA9IG5ldyBUZXN0SmF2YWNFeHRlcm5hbCgpOworICAgICAgICAgICAgZmluYWwgUGF0aCBzcmNQYXRoID0gbmV3IFBhdGgocHJqKTsKKyAgICAgICAgICAgIHNyY1BhdGguc2V0TG9jYXRpb24oc3JjKTsKKyAgICAgICAgICAgIGphdmFjLnNldFNyY2RpcihzcmNQYXRoKTsKKyAgICAgICAgICAgIGphdmFjLmNyZWF0ZU1vZHVsZXBhdGgoKS5zZXRMb2NhdGlvbihtb2R1bGVzKTsKKyAgICAgICAgICAgIGphdmFjLnNldFNvdXJjZSgiOSIpOworICAgICAgICAgICAgamF2YWMuc2V0VGFyZ2V0KCI5Iik7CisgICAgICAgICAgICBqYXZhYy5zZXRGb3JrKHRydWUpOworICAgICAgICAgICAgamF2YWMuc2V0TWVtb3J5SW5pdGlhbFNpemUoIjgwbSIpOworICAgICAgICAgICAgamF2YWMuc2V0RXhlY3V0YWJsZSgiamF2YWNFeGVjdXRhYmxlIik7CisgICAgICAgICAgICBqYXZhYy5hZGQoaW1wbCk7CisgICAgICAgICAgICBqYXZhYy5jcmVhdGVDb21waWxlckFyZygpLnNldFZhbHVlKCItZyIpOworICAgICAgICAgICAgamF2YWMuY3JlYXRlQ29tcGlsZXJBcmcoKS5zZXRWYWx1ZSgiQC9ob21lL215LWNvbXBpbGVyLmFyZ3MiKTsKKyAgICAgICAgICAgIGphdmFjLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YWNFeGVjdXRhYmxlIiwgaW1wbC5nZXRBcmdzKClbMF0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItSi1YbXM4MG0iLCBpbXBsLmdldEFyZ3MoKVsxXSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkAvaG9tZS9teS1jb21waWxlci5hcmdzIiwgaW1wbC5nZXRBcmdzKClbMl0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdHJlYW0ub2YoaW1wbC5nZXRBcmdzKCkpLmFueU1hdGNoKHggLT4geC5lcXVhbHMoIi1nIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW1wbC5nZXRBcmdzKClbaW1wbC5nZXRBcmdzKCkubGVuZ3RoIC0gMl0uZW5kc1dpdGgoIkoxLmphdmEiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGltcGwuZ2V0QXJncygpW2ltcGwuZ2V0QXJncygpLmxlbmd0aCAtIDFdLmVuZHNXaXRoKCJKMi5qYXZhIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGltcGwuZ2V0Rmlyc3RGaWxlTmFtZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGRlbGV0ZSh3b3JrRGlyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRmlsZSBjcmVhdGVXb3JrRGlyKFN0cmluZyB0ZXN0TmFtZSkgeworICAgICAgICBmaW5hbCBGaWxlIHRtcCA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7ICAgLy9OT0kxOE4KKyAgICAgICAgZmluYWwgRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodG1wLCBTdHJpbmcuZm9ybWF0KCIlcyVzJWQiLAorICAgICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIHRlc3ROYW1lLAorICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCkpOworICAgICAgICBkZXN0RGlyLm1rZGlycygpOworICAgICAgICByZXR1cm4gZGVzdERpcjsKKyAgICB9CisKKyAgICBwcml2YXRlIEZpbGUgY3JlYXRlRmlsZShGaWxlIGZvbGRlciwgU3RyaW5nIHJlbGF0aXZlUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoCisgICAgICAgICAgICAgICAgZm9sZGVyLAorICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aC5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKS5yZXBsYWNlKCdcXCcsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOworICAgICAgICBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuY3JlYXRlTmV3RmlsZShmaWxlLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZShGaWxlIGYpIHsKKyAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgZmluYWwgRmlsZVtdIGNsZHMgPSBmLmxpc3RGaWxlcygpOworICAgICAgICAgICAgaWYgKGNsZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0oY2xkcykuZm9yRWFjaCh0aGlzOjpkZWxldGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGYuZGVsZXRlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbnRWZXJzaW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9BbnRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IGI3MGExMzguLjI0NjRmODMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQW50VmVyc2lvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0FudFZlcnNpb25UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMiw3ICszMiw3IEBACiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9hbnR2ZXJzaW9uLnhtbCIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db250YWluc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vQ29udGFpbnNUZXN0LmphdmEKaW5kZXggYTQ1YjUxMS4uYjE3OWE1MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Db250YWluc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0NvbnRhaW5zVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKQEAgLTMzLDcgKzM0LDcgQEAKICAgICAgICAgQ29udGFpbnMgY29uID0gbmV3IENvbnRhaW5zKCk7CiAgICAgICAgIGNvbi5zZXRTdHJpbmcoImFiYyIpOwogICAgICAgICBjb24uc2V0U3Vic3RyaW5nKCJBIik7Ci0gICAgICAgIGFzc2VydFRydWUoIWNvbi5ldmFsKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjb24uZXZhbCgpKTsKIAogICAgICAgICBjb24uc2V0Q2FzZXNlbnNpdGl2ZShmYWxzZSk7CiAgICAgICAgIGFzc2VydFRydWUoY29uLmV2YWwoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0VxdWFsc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzVGVzdC5qYXZhCmluZGV4IDVmOWI5OTYuLjc4ZTY2MjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vRXF1YWxzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsOCArMTgsMTAgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb247CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC0yOCwxMiArMzAsMTggQEAKICAqLwogcHVibGljIGNsYXNzIEVxdWFsc1Rlc3QgewogCisgICAgcHJpdmF0ZSBFcXVhbHMgZXE7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGVxID0gbmV3IEVxdWFscygpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRyaW0oKSB7Ci0gICAgICAgIEVxdWFscyBlcSA9IG5ldyBFcXVhbHMoKTsKICAgICAgICAgZXEuc2V0QXJnMSgiYSIpOwogICAgICAgICBlcS5zZXRBcmcyKCIgYSIpOwotICAgICAgICBhc3NlcnRUcnVlKCFlcS5ldmFsKCkpOworICAgICAgICBhc3NlcnRGYWxzZShlcS5ldmFsKCkpOwogCiAgICAgICAgIGVxLnNldFRyaW0odHJ1ZSk7CiAgICAgICAgIGFzc2VydFRydWUoZXEuZXZhbCgpKTsKQEAgLTQ0LDEwICs1Miw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYXNlU2Vuc2l0aXZlKCkgewotICAgICAgICBFcXVhbHMgZXEgPSBuZXcgRXF1YWxzKCk7CiAgICAgICAgIGVxLnNldEFyZzEoImEiKTsKICAgICAgICAgZXEuc2V0QXJnMigiQSIpOwotICAgICAgICBhc3NlcnRUcnVlKCFlcS5ldmFsKCkpOworICAgICAgICBhc3NlcnRGYWxzZShlcS5ldmFsKCkpOwogCiAgICAgICAgIGVxLnNldENhc2VzZW5zaXRpdmUoZmFsc2UpOwogICAgICAgICBhc3NlcnRUcnVlKGVxLmV2YWwoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0h0dHBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0h0dHBUZXN0LmphdmEKaW5kZXggMTVhOWQyZC4uMDFjZmM0OCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9IdHRwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSHR0cFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDcgKzI1LDYgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogVGVzdGNhc2VzIGZvciB0aGUgJmx0O2h0dHAmZ3Q7IGNvbmRpdGlvbi4gQWxsIHRoZXNlIHRlc3RzIHJlcXVpcmUKQEAgLTYzLDE0ICs2MiwxMiBAQAogICAgICAgICBhc3NlcnROdWxsKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRlc3QtZ2V0LXJlcXVlc3QtYmFkLXVybCIpKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIGludmFsaWQgSFRUUCByZXF1ZXN0IG1ldGhvZCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXF1ZXN0TWV0aG9kKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImJhZC1yZXF1ZXN0LW1ldGhvZCIpOwotICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGFzIGludmFsaWQgSFRUUCByZXF1ZXN0IG1ldGhvZCBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyB3ZSBzaG91bGQgYXNzZXJ0IHRoZSBjb3JyZWN0IGJ1aWxkIGV4Y2VwdGlvbiB3YXMgdGhyb3duCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImJhZC1yZXF1ZXN0LW1ldGhvZCIpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZhaWx1cmVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZVRlc3QuamF2YQppbmRleCA4NjU5NDc2Li4xOTNmNzhmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmFpbHVyZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzRmlsZVNlbGVjdGVkVGVzdC5qYXZhCmluZGV4IDg0ZDg4YTUuLjVkNTYwZDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNGaWxlU2VsZWN0ZWRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc0ZpbGVTZWxlY3RlZFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE0ICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUZXN0Y2FzZSBmb3IgdGhlICZsdDtpc2ZpbGVzZWxlY3RlZCZndDsgY29uZGl0aW9uLgpAQCAtMzYsNiArMzQsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2NvbmRpdGlvbnMvaXNmaWxlc2VsZWN0ZWQueG1sIik7CkBAIC02MywxMiArNjQsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90U2VsZWN0b3IoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm90LnNlbGVjdG9yIik7Ci0gICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd246IGNoZWNraW5nIGZvciB1c2UgYXMgYSBzZWxlY3RvciAobm90IGFsbG93ZWQpIik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiZmlsZXNldCBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lc3RlZCBcImlzZmlsZSIsCi0gICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJmaWxlc2V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgbmVzdGVkIFwiaXNmaWxlc2VsZWN0ZWRcIiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm90LnNlbGVjdG9yIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlYWNoYWJsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWFjaGFibGVUZXN0LmphdmEKaW5kZXggYTU4ZmI5Ny4uNDYyMDU5MDMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWFjaGFibGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlYWNoYWJsZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDE2ICsxNywxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiB0ZXN0IGZvciByZWFjaGFibGUgdGhpbmdzCkBAIC0zNiw4MSArMzMsNjcgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KAotICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVhY2hhYmxlLnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvY29uZGl0aW9ucy9pc3JlYWNoYWJsZS54bWwiKTsKICAgICB9CiAKLQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExvY2FsaG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGhvc3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TG9jYWxob3N0Iik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxob3N0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsaG9zdFVSTCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RMb2NhbGhvc3RVUkwiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJcHY0bG9jYWxob3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdElwdjRsb2NhbGhvc3QoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0SXB2NGxvY2FsaG9zdCIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZUUFVSTCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RGVFBVUkwoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RlRQVVJMIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEJvdGgiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogZXJyb3Igb24gdHdvIHRhcmdldHMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhJc1JlYWNoYWJsZS5FUlJPUl9CT1RIX1RBUkdFVFMsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKElzUmVhY2hhYmxlLkVSUk9SX0JPVEhfVEFSR0VUUyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Qm90aCIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vVGFyZ2V0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb1RhcmdldHMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogbm8gcGFyYW1zIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSXNSZWFjaGFibGUuRVJST1JfTk9fSE9TVE5BTUUsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UYXJnZXRzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoSXNSZWFjaGFibGUuRVJST1JfTk9fSE9TVE5BTUUpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vVGFyZ2V0cyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEJhZFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0QmFkVGltZW91dCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIGV4cGVjdGVkOiBlcnJvciBvbiAtdmUgdGltZW91dCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKElzUmVhY2hhYmxlLkVSUk9SX0JBRF9USU1FT1VULCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFRpbWVvdXQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShJc1JlYWNoYWJsZS5FUlJPUl9CQURfVElNRU9VVCk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0QmFkVGltZW91dCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgQElnbm9yZSgiUHJldmlvdXNseSBuYW1lZCBpbiBhIHdheSB0byBwcmV2ZW50IGV4ZWN1dGlvbiIpCi0gICAgcHVibGljIHZvaWQgTm90ZXN0RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gZXhwZWN0ZWQ6IGVycm9yIG9uIGZpbGUgVVJMIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoSXNSZWFjaGFibGUuRVJST1JfTk9fSE9TVF9JTl9VUkwsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCBOb3Rlc3RGaWxlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoSXNSZWFjaGFibGUuRVJST1JfTk9fSE9TVF9JTl9VUkwpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGUiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0QmFkVVJMIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gZXhwZWN0ZWQ6IGVycm9yIGluIFVSTCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoSXNSZWFjaGFibGUuRVJST1JfQkFEX1VSTCwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRVUkwoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShJc1JlYWNoYWJsZS5FUlJPUl9CQURfVVJMKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RCYWRVUkwiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1JlZmVyZW5jZVRlc3QuamF2YQppbmRleCAwMWI2YjQ3Li4xYzcwOGI1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzUmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNSZWZlcmVuY2VUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiw5ICsyMiw5IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiAvKioKQEAgLTM2LDYgKzM2LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL2lzcmVmZXJlbmNlLnhtbCIpOwpAQCAtNDksMTQgKzUyLDE0IEBACiAgICAgICAgIGFzc2VydE51bGwoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidW5kZWZpbmVkIikpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIG9taXR0ZWQgcmVmaWQgYXR0cmlidXRlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RW5vdWdoQXJncygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpc3JlZmVyZW5jZS1pbmNvbXBsZXRlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gZXhwZWN0ZWQ6IHJlZmlkIGF0dGlyYnV0ZSBoYXMgYmVlbiBvbWl0dGVkIik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiTm8gcmVmZXJlbmNlIHNwZWNpZmllZCBmb3IgaXNyZWZlcmVuY2UgY29uZGl0aW9uIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uIC5jbGFzcykgOworICAgICAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk5vIHJlZmVyZW5jZSBzcGVjaWZpZWQgZm9yIGlzcmVmZXJlbmNlIGNvbmRpdGlvbiIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaXNyZWZlcmVuY2UtaW5jb21wbGV0ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2lnbmVkVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Jc1NpZ25lZFRlc3QuamF2YQppbmRleCAwZjQwMDFjLi5hNjZhYWE5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL0lzU2lnbmVkVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vSXNTaWduZWRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9QYXJzZXJTdXBwb3J0c1Rlc3QuamF2YQppbmRleCAyNzFjMTliLi40ZDBhOGRlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1BhcnNlclN1cHBvcnRzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vUGFyc2VyU3VwcG9ydHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw5ICsyNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAKQEAgLTM2LDYgKzM0LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3BhcnNlcnN1cHBvcnRzLnhtbCIpOwpAQCAtNDMsMjIgKzQ0LDE2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RW1wdHkiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogIiArIFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX0FUVFJJQlVURVMpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoUGFyc2VyU3VwcG9ydHMuRVJST1JfTk9fQVRUUklCVVRFUywgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uIC5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX0FUVFJJQlVURVMpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVtcHR5Iik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Qm90aCIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIGV4cGVjdGVkOiAiICsgUGFyc2VyU3VwcG9ydHMuRVJST1JfQk9USF9BVFRSSUJVVEVTKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlclN1cHBvcnRzLkVSUk9SX0JPVEhfQVRUUklCVVRFUywgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uIC5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKFBhcnNlclN1cHBvcnRzLkVSUk9SX0JPVEhfQVRUUklCVVRFUyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Qm90aCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC02OCwxMiArNjMsOSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlOb1ZhbHVlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eU5vVmFsdWUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogIiArIFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX1ZBTFVFKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFBhcnNlclN1cHBvcnRzLkVSUk9SX05PX1ZBTFVFLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24gLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoUGFyc2VyU3VwcG9ydHMuRVJST1JfTk9fVkFMVUUpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFByb3BlcnR5Tm9WYWx1ZSIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1R5cGVGb3VuZFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vVHlwZUZvdW5kVGVzdC5qYXZhCmluZGV4IDZjNzMxODguLmUzMWU3NjAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vVHlwZUZvdW5kVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jb25kaXRpb24vVHlwZUZvdW5kVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTUgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiAvKioKQEAgLTM2LDYgKzM1LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9jb25kaXRpb25zL3R5cGVmb3VuZC54bWwiKTsKQEAgLTQ3LDE0ICs0OSwxNCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZXN0VGFzayIpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBtaXNzaW5nIG5hbWUgYXR0cmlidXRlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5kZWZpbmVkKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVbmRlZmluZWQiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogbGVmdCBvdXQgdGhlIG5hbWUgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiTm8gdHlwZSBzcGVjaWZpZWQiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiTm8gdHlwZSBzcGVjaWZpZWQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVbmRlZmluZWQiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2NvbmRpdGlvbi9Yb3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvclRlc3QuamF2YQppbmRleCA0ZjA0YzM1Li42MzVhOTBlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY29uZGl0aW9uL1hvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nUGFyc2VyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXJUZXN0LmphdmEKaW5kZXggZmQwNjVkMS4uMmEzZGQyMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2N2c2xpYi9DaGFuZ2VMb2dQYXJzZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zNCw3ICszNCw3IEBACiAgICAgcHJvdGVjdGVkIENoYW5nZUxvZ1BhcnNlciBwYXJzZXIgPSBuZXcgQ2hhbmdlTG9nUGFyc2VyKCk7CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPbGRDdnNGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkQ3ZzRm9ybWF0KCkgewogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJXb3JraW5nIGZpbGU6IGJ1aWxkLnhtbCIpOwogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJyZXZpc2lvbiAxLjQ3NSIpOwogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJkYXRlOiAyMDA0LzA2LzA1IDE2OjEwOjMyOyAgYXV0aG9yOiBzb21lYm9keTsgIHN0YXRlOiBFeHA7ICBsaW5lczogKzIgLTIiKTsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDdnMxMTJGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3ZzMTEyRm9ybWF0KCkgewogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJXb3JraW5nIGZpbGU6IGJ1aWxkLnhtbCIpOwogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJyZXZpc2lvbiAxLjQ3NSIpOwogICAgICAgICBwYXJzZXIuc3Rkb3V0KCJkYXRlOiAyMDA0LTA2LTA1IDE2OjEwOjMyICswMDAwOyBhdXRob3I6IHNvbWVib2R5OyBzdGF0ZTogRXhwOyAgbGluZXM6ICsyIC0yIik7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvY3ZzbGliL0NoYW5nZUxvZ1dyaXRlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyVGVzdC5qYXZhCmluZGV4IDE5YjM3YTQuLjFlNDc5MDYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9jdnNsaWIvQ2hhbmdlTG9nV3JpdGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKQEAgLTQ4LDcgKzQ5LDcgQEAKICAgICAgICAgQ1ZTRW50cnlbXSBlbnRyaWVzID0ge2VudHJ5fTsKIAogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBQcmludFdyaXRlciBwd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGLTgiKSk7CisgICAgICAgIFByaW50V3JpdGVyIHB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXQsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKICAgICAgICAgd3JpdGVyLnByaW50Q2hhbmdlTG9nKHB3cml0ZXIsIGVudHJpZXMpOwogCiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXJzaW5nIGRvZXMgbm90IGJyZWFrCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMS9CLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMS9CLmphdmEKaW5kZXggOTA1N2ZhMC4uMWZjNWRiMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RpcjEvQi5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kaXIxL0IuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kaXIyL0EuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kaXIyL0EuamF2YQppbmRleCA4MmIyMDQ4Li40MTYyYjg0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZGlyMi9BLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2RpcjIvQS5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsQWRkcmVzc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9FbWFpbEFkZHJlc3NUZXN0LmphdmEKaW5kZXggMDBiZWZjZC4uOWViMTdmZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsQWRkcmVzc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxBZGRyZXNzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFza1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9lbWFpbC9FbWFpbFRhc2tUZXN0LmphdmEKaW5kZXggMjAwZWJhYy4uNTc2NjBkYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL0VtYWlsVGFza1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvRW1haWxUYXNrVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFRPRE8gOiBkZXZlbG9wIHRoZXNlIHRlc3RjYXNlcyAtIHRoZSBlbWFpbCB0YXNrIG5lZWRzIHRvIGhhdmUgYXR0cmlidXRlcyBhbGxvd2luZwpAQCAtMzUsNiArMzYsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2VtYWlsL21haWwueG1sIik7CkBAIC00NSwxNSArNDksOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDEiKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeGVjdXRpb24gb2YgbWFpbCB0YXNrIHdhcyBleHBlY3RlZCB0byBmYWlsIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGFzc2VydCBpdCdzIHRoZSBleHBlY3RlZCBvbmUKLSAgICAgICAgICAgIGlmICghZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJTTVRQIGF1dGggb25seSBwb3NzaWJsZSB3aXRoIE1JTUUgbWFpbCIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlNNVFAgYXV0aCBvbmx5IHBvc3NpYmxlIHdpdGggTUlNRSBtYWlsIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjEsMTUgKzU5LDkgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhlY3V0aW9uIG9mIG1haWwgdGFzayB3YXMgZXhwZWN0ZWQgdG8gZmFpbCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBhc3NlcnQgaXQncyB0aGUgZXhwZWN0ZWQgb25lCi0gICAgICAgICAgICBpZiAoIWUuZ2V0TWVzc2FnZSgpLmVxdWFscygiU1NMIGFuZCBTVEFSVFRMUyBvbmx5IHBvc3NpYmxlIHdpdGggTUlNRSBtYWlsIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiU1NMIGFuZCBTVEFSVFRMUyBvbmx5IHBvc3NpYmxlIHdpdGggTUlNRSBtYWlsIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MiIpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL2VtYWlsL01lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWVzc2FnZVRlc3QuamF2YQppbmRleCBkZjc1MDY3Li4zNzVmZjMwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWVzc2FnZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvZW1haWwvTWVzc2FnZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE5ICsxOCwxOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmVtYWlsOwogCi1pbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCiBwdWJsaWMgY2xhc3MgTWVzc2FnZVRlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlLnR4dCIpOworICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciB0ZXN0Rm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCiAgICAgLyoqCiAgICAgICogdGVzdCBmb3IgYnVnemlsbGEgNDg5MzIKICAgICAgKi8KQEAgLTQwLDIzICs0MCw5IEBACiAgICAgICAgIFByb2plY3QgcCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgIG1zLnNldFByb2plY3QocCk7CiAgICAgICAgIG1zLmFkZFRleHQoImhpLCB0aGlzIGlzIGFuIGVtYWlsIik7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZmlzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGZpcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpOwotICAgICAgICAgICAgbXMucHJpbnQobmV3IFByaW50U3RyZWFtKGZpcykpOwotICAgICAgICAgICAgZmlzLndyaXRlKDEyMCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2UoZmlzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIGlmIChmLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMgZnUgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0gICAgICAgICAgICBmdS50cnlIYXJkVG9EZWxldGUoZik7CisgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZXN0Rm9sZGVyLm5ld0ZpbGUoIm1lc3NhZ2UudHh0IikpKSB7CisgICAgICAgICAgICBtcy5wcmludChuZXcgUHJpbnRTdHJlYW0oZm9zKSk7CisgICAgICAgICAgICBmb3Mud3JpdGUoMTIwKTsKICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL21vZHVsZXMvSm1vZFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0ptb2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhMzI3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0ptb2RUZXN0LmphdmEKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubW9kdWxlczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworCitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YS51dGlsLnNwaS5Ub29sUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKKworLyoqCisgKiBUZXN0cyB0aGUge0BsaW5rIEptb2R9IHRhc2suCisgKi8KK3B1YmxpYyBjbGFzcyBKbW9kVGVzdCB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgRXhwZWN0ZWRFeGNlcHRpb24gZXhwZWN0ZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9qbW9kLnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXN0QW5kQ2xhc3NwYXRoTm9KbW9kKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZGVzdEFuZENsYXNzcGF0aE5vSm1vZCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXN0QW5kTmVzdGVkQ2xhc3NwYXRoKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xhc3NwYXRoLW5lc3RlZCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXN0QW5kQ2xhc3NwYXRoT2xkZXJUaGFuSm1vZCgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRlc3RBbmRDbGFzc3BhdGhPbGRlclRoYW5KbW9kIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgRmlsZSBqYXIgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJoZWxsby5qYXIiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IG5ld2VyIGptb2Qgd2FzIG5vdCB3cml0dGVuICIKKyAgICAgICAgICAgICsgIndoZW4gc291cmNlIGZpbGVzIGFyZSBvbGRlci4iLAorICAgICAgICAgICAgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShqbW9kLnRvUGF0aCgpKS50b0luc3RhbnQoKS5pc0FmdGVyKAorICAgICAgICAgICAgICAgIEluc3RhbnQubm93KCkucGx1cygzMCwgQ2hyb25vVW5pdC5NSU5VVEVTKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRGVzdEZpbGUoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub0Rlc3RGaWxlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9DbGFzc3BhdGgoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub0NsYXNzcGF0aCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Q2xhc3NwYXRoKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZW1wdHlDbGFzc3BhdGgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhFbnRpcmVseU5vbmV4aXN0ZW50KCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9uZXhpc3RlbnRDbGFzc3BhdGgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhyZWYoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjbGFzc3BhdGhyZWYiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoQXR0cmlidXRlQW5kQ2hpbGRFbGVtZW50KCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY2xhc3NwYXRoLWJvdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlcGF0aCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1vZHVsZXBhdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlcGF0aHJlZigpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1vZHVsZXBhdGhyZWYiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlcGF0aE5lc3RlZCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1vZHVsZXBhdGgtbmVzdGVkIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZXBhdGhOb25EaXIoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtb2R1bGVwYXRobm9uZGlyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlcGF0aEF0dHJpYnV0ZUFuZENoaWxkRWxlbWVudCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1vZHVsZXBhdGgtYm90aCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21tYW5kUGF0aCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbW1hbmRwYXRoIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBjb21tYW5kLiIsCisgICAgICAgICAgICBjb250YWluc0xpbmUob3V0cHV0LCBsIC0+IGwuZXF1YWxzKCJiaW4vY29tbWFuZDEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbW1hbmRQYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29tbWFuZHBhdGhyZWYiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGNvbW1hbmQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImJpbi9jb21tYW5kMiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFuZFBhdGhOZXN0ZWQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb21tYW5kcGF0aC1uZXN0ZWQiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGNvbW1hbmQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImJpbi9jb21tYW5kMyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tbWFuZFBhdGhBdHRyaWJ1dGVBbmRDaGlsZEVsZW1lbnQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb21tYW5kcGF0aC1ib3RoIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBjb21tYW5kcyAiCisgICAgICAgICAgICArICJmcm9tIGJvdGggYXR0cmlidXRlIGFuZCBjaGlsZCBlbGVtZW50LiIsCisgICAgICAgICAgICBjb250YWluc0FsbChvdXRwdXQsCisgICAgICAgICAgICAgICAgbCAtPiBsLmVxdWFscygiYmluL2NvbW1hbmQ0IiksCisgICAgICAgICAgICAgICAgbCAtPiBsLmVxdWFscygiYmluL2NvbW1hbmQ1IikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJQYXRoKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGVhZGVycGF0aCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgaGVhZGVyIGZpbGUuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImluY2x1ZGUvaGVhZGVyMS5oIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJQYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGVhZGVycGF0aHJlZiIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgaGVhZGVyIGZpbGUuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImluY2x1ZGUvaGVhZGVyMi5oIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJQYXRoTmVzdGVkKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaGVhZGVycGF0aC1uZXN0ZWQiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGhlYWRlciBmaWxlLiIsCisgICAgICAgICAgICBjb250YWluc0xpbmUob3V0cHV0LCBsIC0+IGwuZXF1YWxzKCJpbmNsdWRlL2hlYWRlcjMuaCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyUGF0aEF0dHJpYnV0ZUFuZENoaWxkRWxlbWVudCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImhlYWRlcnBhdGgtYm90aCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgaGVhZGVyIGZpbGVzICIKKyAgICAgICAgICAgICsgImZyb20gYm90aCBhdHRyaWJ1dGUgYW5kIGNoaWxkIGVsZW1lbnQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zQWxsKG91dHB1dCwKKyAgICAgICAgICAgICAgICBsIC0+IGwuZXF1YWxzKCJpbmNsdWRlL2hlYWRlcjQuaCIpLAorICAgICAgICAgICAgICAgIGwgLT4gbC5lcXVhbHMoImluY2x1ZGUvaGVhZGVyNS5oIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdQYXRoKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29uZmlncGF0aCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgY29uZmlnIGZpbGUuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImNvbmYvY29uZmlnMS5wcm9wZXJ0aWVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdQYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29uZmlncGF0aHJlZiIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgY29uZmlnIGZpbGUuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImNvbmYvY29uZmlnMi5wcm9wZXJ0aWVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWdQYXRoTmVzdGVkKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29uZmlncGF0aC1uZXN0ZWQiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGNvbmZpZyBmaWxlLiIsCisgICAgICAgICAgICBjb250YWluc0xpbmUob3V0cHV0LCBsIC0+IGwuZXF1YWxzKCJjb25mL2NvbmZpZzMucHJvcGVydGllcyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlnUGF0aEF0dHJpYnV0ZUFuZENoaWxkRWxlbWVudCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbmZpZ3BhdGgtYm90aCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgY29uZmlnIGZpbGVzICIKKyAgICAgICAgICAgICsgImZyb20gYm90aCBhdHRyaWJ1dGUgYW5kIGNoaWxkIGVsZW1lbnQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zQWxsKG91dHB1dCwKKyAgICAgICAgICAgICAgICBsIC0+IGwuZXF1YWxzKCJjb25mL2NvbmZpZzQucHJvcGVydGllcyIpLAorICAgICAgICAgICAgICAgIGwgLT4gbC5lcXVhbHMoImNvbmYvY29uZmlnNS5wcm9wZXJ0aWVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMZWdhbFBhdGgoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJsZWdhbHBhdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGxpY2Vuc2UgZmlsZS4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLmVxdWFscygibGVnYWwvbGVnYWwxLnR4dCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVnYWxQYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibGVnYWxwYXRocmVmIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBsaWNlbnNlIGZpbGUuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoImxlZ2FsL2xlZ2FsMi50eHQiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExlZ2FsUGF0aE5lc3RlZCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxlZ2FscGF0aC1uZXN0ZWQiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGxpY2Vuc2UgZmlsZS4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLmVxdWFscygibGVnYWwvbGVnYWwzLnR4dCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVnYWxQYXRoQXR0cmlidXRlQW5kQ2hpbGRFbGVtZW50KCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibGVnYWxwYXRoLWJvdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIGxlZ2FsIGZpbGVzICIKKyAgICAgICAgICAgICsgImZyb20gYm90aCBhdHRyaWJ1dGUgYW5kIGNoaWxkIGVsZW1lbnQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zQWxsKG91dHB1dCwKKyAgICAgICAgICAgICAgICBsIC0+IGwuZXF1YWxzKCJsZWdhbC9sZWdhbDQudHh0IiksCisgICAgICAgICAgICAgICAgbCAtPiBsLmVxdWFscygibGVnYWwvbGVnYWw1LnR4dCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuUGF0aCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1hbnBhdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIG1hbiBwYWdlLiIsCisgICAgICAgICAgICBjb250YWluc0xpbmUob3V0cHV0LCBsIC0+IGwuZXF1YWxzKCJtYW4vbWFuMS4xIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5QYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibWFucGF0aHJlZiIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgbWFuIHBhZ2UuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoIm1hbi9tYW4yLjEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hblBhdGhOZXN0ZWQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtYW5wYXRoLW5lc3RlZCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgbWFuIHBhZ2UuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lcXVhbHMoIm1hbi9tYW4zLjEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hblBhdGhBdHRyaWJ1dGVBbmRDaGlsZEVsZW1lbnQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtYW5wYXRoLWJvdGgiKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIG91dHB1dCA9IHJ1bkptb2QoImxpc3QiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGNvbnRhaW5zIG1hbiBwYWdlcyAiCisgICAgICAgICAgICArICJmcm9tIGJvdGggYXR0cmlidXRlIGFuZCBjaGlsZCBlbGVtZW50LiIsCisgICAgICAgICAgICBjb250YWluc0FsbChvdXRwdXQsCisgICAgICAgICAgICAgICAgbCAtPiBsLmVxdWFscygibWFuL21hbjQuMSIpLAorICAgICAgICAgICAgICAgIGwgLT4gbC5lcXVhbHMoIm1hbi9tYW41LjEiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUxpYlBhdGgoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJuYXRpdmVsaWJwYXRoIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBuYXRpdmUgbGlicmFyeS4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLm1hdGNoZXMoImxpYi9bXi9dK1xcLihkbGx8ZHlsaWJ8c28pIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVMaWJQYXRocmVmKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibmF0aXZlbGlicGF0aHJlZiIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgibGlzdCIsIGptb2QudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgY29udGFpbnMgbmF0aXZlIGxpYnJhcnkuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5tYXRjaGVzKCJsaWIvW14vXStcXC4oZGxsfGR5bGlifHNvKSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlTGliUGF0aE5lc3RlZCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5hdGl2ZWxpYnBhdGgtbmVzdGVkIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBuYXRpdmUgbGlicmFyeS4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLm1hdGNoZXMoImxpYi9bXi9dK1xcLihkbGx8ZHlsaWJ8c28pIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVMaWJQYXRoQXR0cmlidXRlQW5kQ2hpbGRFbGVtZW50KCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibmF0aXZlbGlicGF0aC1ib3RoIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJsaXN0Iiwgam1vZC50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBjb250YWlucyBuYXRpdmUgbGlicmFyaWVzICIKKyAgICAgICAgICAgICsgImZyb20gYm90aCBhdHRyaWJ1dGUgYW5kIGNoaWxkIGVsZW1lbnQuIiwKKyAgICAgICAgICAgIGNvbnRhaW5zQWxsKG91dHB1dCwKKyAgICAgICAgICAgICAgICBsIC0+IGwubWF0Y2hlcygibGliLyhsaWIpP3ppcFxcLihkbGx8ZHlsaWJ8c28pIiksCisgICAgICAgICAgICAgICAgbCAtPiBsLm1hdGNoZXMoImxpYi8obGliKT9qdm1cXC4oZGxsfGR5bGlifHNvKSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInZlcnNpb24iKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIHZlcnNpb24gPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ2ZXJzaW9uIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyB0aGF0ICd2ZXJzaW9uJyBwcm9wZXJ0eSBpcyBzZXQiLAorICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQ2hlY2tpbmcgdGhhdCAndmVyc2lvbicgcHJvcGVydHkgaXMgbm90IGVtcHR5IiwKKyAgICAgICAgICAgIHZlcnNpb24uaXNFbXB0eSgpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgiZGVzY3JpYmUiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGhhcyBjb3JyZWN0IHZlcnNpb24uIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lbmRzV2l0aCgiQCIgKyB2ZXJzaW9uKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFZlcnNpb24oKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ2ZXJzaW9uLW5lc3RlZCIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgiZGVzY3JpYmUiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGhhcyBjb3JyZWN0IHZlcnNpb24uIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5tYXRjaGVzKCIuKkAxXFwuMFxcLjFbLStdKzk5IikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWZXJzaW9uTnVtYmVyT25seSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInZlcnNpb24tbmVzdGVkLW51bWJlciIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgiZGVzY3JpYmUiLCBqbW9kLnRvU3RyaW5nKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIGhhcyBjb3JyZWN0IHZlcnNpb24uIiwKKyAgICAgICAgICAgIGNvbnRhaW5zTGluZShvdXRwdXQsIGwgLT4gbC5lbmRzV2l0aCgiQDEuMC4xIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWZXJzaW9uTm9OdW1iZXIoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ2ZXJzaW9uLW5lc3RlZC1uby1udW1iZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWZXJzaW9uSW52YWxpZE51bWJlcigpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInZlcnNpb24tbmVzdGVkLWludmFsaWQtbnVtYmVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmVyc2lvbkludmFsaWRQcmVSZWxlYXNlKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidmVyc2lvbi1uZXN0ZWQtaW52YWxpZC1wcmVyZWxlYXNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbkF0dHJpYnV0ZUFuZENoaWxkRWxlbWVudCgpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInZlcnNpb24tYm90aCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1haW5DbGFzcygpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1haW5jbGFzcyIpOworCisgICAgICAgIEZpbGUgam1vZCA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImptb2QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2Qgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBqbW9kLmV4aXN0cygpKTsKKworICAgICAgICBTdHJpbmcgbWFpbkNsYXNzID0KKyAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImhlbGxvLm1haW4tY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkNoZWNraW5nIHRoYXQgJ21haW4tY2xhc3MnIHByb3BlcnR5IGlzIHNldCIsCisgICAgICAgICAgICBtYWluQ2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkNoZWNraW5nIHRoYXQgJ21haW4tY2xhc3MnIHByb3BlcnR5IGlzIG5vdCBlbXB0eSIsCisgICAgICAgICAgICBtYWluQ2xhc3MuaXNFbXB0eSgpKTsKKworICAgICAgICBTdHJpbmcgb3V0cHV0ID0gcnVuSm1vZCgiZGVzY3JpYmUiLCBqbW9kLnRvU3RyaW5nKCkpOworCisgICAgICAgIFN0cmluZyBtYWluQ2xhc3NQYXR0ZXJuID0gIm1haW4tY2xhc3NcXHMrIiArIFBhdHRlcm4ucXVvdGUobWFpbkNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBoYXMgY29ycmVjdCBtYWluIGNsYXNzLiIsCisgICAgICAgICAgICBjb250YWluc0xpbmUob3V0cHV0LCBsIC0+IGwubWF0Y2hlcyhtYWluQ2xhc3NQYXR0ZXJuKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicGxhdGZvcm0iKTsKKworICAgICAgICBGaWxlIGptb2QgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJqbW9kIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBqbW9kIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgam1vZC5leGlzdHMoKSk7CisKKyAgICAgICAgU3RyaW5nIHBsYXRmb3JtID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidGFyZ2V0LXBsYXRmb3JtIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyB0aGF0ICd0YXJnZXQtcGxhdGZvcm0nIHByb3BlcnR5IGlzIHNldCIsCisgICAgICAgICAgICBwbGF0Zm9ybSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQ2hlY2tpbmcgdGhhdCAndGFyZ2V0LXBsYXRmb3JtJyBwcm9wZXJ0eSAiCisgICAgICAgICAgICArICJpcyBub3QgZW1wdHkiLCBwbGF0Zm9ybS5pc0VtcHR5KCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJkZXNjcmliZSIsIGptb2QudG9TdHJpbmcoKSk7CisKKyAgICAgICAgU3RyaW5nIHBsYXRmb3JtUGF0dGVybiA9ICJwbGF0Zm9ybVxccysiICsgUGF0dGVybi5xdW90ZShwbGF0Zm9ybSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGptb2QgaGFzIGNvcnJlY3QgbWFpbiBjbGFzcy4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLm1hdGNoZXMocGxhdGZvcm1QYXR0ZXJuKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhhc2hpbmcoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJoYXNoaW5nIik7CisKKyAgICAgICAgRmlsZSBqbW9kID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiam1vZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIiwKKyAgICAgICAgICAgIGptb2QuZXhpc3RzKCkpOworCisgICAgICAgIFN0cmluZyBvdXRwdXQgPSBydW5KbW9kKCJkZXNjcmliZSIsIGptb2QudG9TdHJpbmcoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgam1vZCBoYXMgbW9kdWxlIGhhc2hlcy4iLAorICAgICAgICAgICAgY29udGFpbnNMaW5lKG91dHB1dCwgbCAtPiBsLnN0YXJ0c1dpdGgoImhhc2hlcyIpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcnVuSm1vZChmaW5hbCBTdHJpbmcuLi4gYXJncykgeworICAgICAgICBUb29sUHJvdmlkZXIgam1vZCA9IFRvb2xQcm92aWRlci5maW5kRmlyc3QoImptb2QiKS5vckVsc2VUaHJvdygKKyAgICAgICAgICAgICgpIC0+IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJqbW9kIHRvb2wgbm90IGZvdW5kIGluIEpESy4iKSk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBpbnQgZXhpdENvZGU7CisgICAgICAgIHRyeSAoUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKHN0ZG91dCk7CisgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKHN0ZGVycikpIHsKKworICAgICAgICAgICAgZXhpdENvZGUgPSBqbW9kLnJ1bihvdXQsIGVyciwgYXJncyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhpdENvZGUgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgImptb2QgZmFpbGVkLCBvdXRwdXQgaXM6ICIgKyBzdGRvdXQgKyAiLCBlcnJvciBpczogIiArIHN0ZGVycik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3Rkb3V0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTGluZShmaW5hbCBTdHJpbmcgbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcmVkaWNhdGU8PyBzdXBlciBTdHJpbmc+IHRlc3QpIHsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIobGluZXMpKSkgeworCisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLmxpbmVzKCkuYW55TWF0Y2godGVzdCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zQWxsKGZpbmFsIFN0cmluZyBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJlZGljYXRlPD8gc3VwZXIgU3RyaW5nPiB0ZXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJlZGljYXRlPD8gc3VwZXIgU3RyaW5nPiB0ZXN0MikgeworCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGxpbmVzKSkpIHsKKworICAgICAgICAgICAgYm9vbGVhbiB0ZXN0MU1hdGNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gdGVzdDJNYXRjaGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXN0MU1hdGNoZWQgfD0gdGVzdDEudGVzdChsaW5lKTsKKyAgICAgICAgICAgICAgICB0ZXN0Mk1hdGNoZWQgfD0gdGVzdDIudGVzdChsaW5lKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRlc3QxTWF0Y2hlZCAmJiB0ZXN0Mk1hdGNoZWQ7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL21vZHVsZXMvTGlua1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0xpbmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5MmFiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9tb2R1bGVzL0xpbmtUZXN0LmphdmEKQEAgLTAsMCArMSw5ODQgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMubW9kdWxlczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbmNoZWNrZWRJT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuRGlyZWN0b3J5U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworCitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnNwaS5Ub29sUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgTGlua30gdGFzay4KKyAqLworcHVibGljIGNsYXNzIExpbmtUZXN0IHsKKyAgICAvKgorICAgICAqIFRPRE86CisgICAgICogVGVzdCAtLW9yZGVyLXJlc291cmNlcyAoaG93PykKKyAgICAgKiBUZXN0IC0tZXhjbHVkZS1maWxlcyAod2hhdCBkb2VzIHRoaXMgYWN0dWFsbHkgZG8/KQorICAgICAqIFRlc3QgLS1lbmRpYW4gKGhvdz8pCisgICAgICogVGVzdCAtLXZtIChob3c/KQorICAgICAqLworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgZmluYWwgRXhwZWN0ZWRFeGNlcHRpb24gZXhwZWN0ZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9saW5rLnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luZG93cygpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLmNvbnRhaW5zKCJXaW5kb3dzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VhcmxpZXJUaGFuKGZpbmFsIEluc3RhbnQgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aCBwYXRoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShwYXRoKS50b0luc3RhbnQoKS5pc0JlZm9yZSh0aW1lKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuY2hlY2tlZElPRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VTdHJ1Y3R1cmUgeworICAgICAgICBmaW5hbCBGaWxlIHJvb3Q7CisgICAgICAgIGZpbmFsIEZpbGUgYmluOworICAgICAgICBmaW5hbCBGaWxlIGphdmE7CisKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUoZmluYWwgRmlsZSByb290KSB7CisgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290OworCisgICAgICAgICAgICBiaW4gPSBuZXcgRmlsZShyb290LCAiYmluIik7CisgICAgICAgICAgICBqYXZhID0gbmV3IEZpbGUoYmluLCBpc1dpbmRvd3MoKSA/ICJqYXZhLmV4ZSIgOiAiamF2YSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbWFnZVN0cnVjdHVyZSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKSB7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gbmV3IEltYWdlU3RydWN0dXJlKAorICAgICAgICAgICAgbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaW1hZ2UiKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGltYWdlIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4iLAorICAgICAgICAgICAgaW1hZ2Uucm9vdC5leGlzdHMoKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgaW1hZ2UgaGFzIGphdmEgZXhlY3V0YWJsZS4iLAorICAgICAgICAgICAgaW1hZ2UuamF2YS5leGlzdHMoKSk7CisKKyAgICAgICAgcmV0dXJuIGltYWdlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZXBhdGgoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtb2R1bGVwYXRoIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltYWdlTm90UmVjcmVhdGVkRnJvbVN0YWxlSm1vZHMoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbWFnZU5ld2VyVGhhbkptb2RzIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgSW5zdGFudCBmdXR1cmUgPSBJbnN0YW50Lm5vdygpLnBsdXMoMzAsIENocm9ub1VuaXQuTUlOVVRFUyk7CisgICAgICAgIHRyeSAoU3RyZWFtPFBhdGg+IGltYWdlRmlsZXMgPSBGaWxlcy53YWxrKGltYWdlLnJvb3QudG9QYXRoKCkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IG5ld2VyIGltYWdlIHdhcyBub3Qgd3JpdHRlbiAiCisgICAgICAgICAgICAgICAgKyAid2hlbiBzb3VyY2UgZmlsZXMgYXJlIG9sZGVyLiIsCisgICAgICAgICAgICAgICAgaW1hZ2VGaWxlcy5ub25lTWF0Y2goaSAtPiBpc0VhcmxpZXJUaGFuKGZ1dHVyZSwgaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTW9kdWxlUGF0aCgpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5vbW9kdWxlcGF0aCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTW9kdWxlcygpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5vbW9kdWxlcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVBhdGhSZWYoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtb2R1bGVwYXRocmVmIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE1vZHVsZVBhdGgoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtb2R1bGVwYXRoLW5lc3RlZCIpOworICAgICAgICB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVQYXRoSW5BdHRyaWJ1dGVBbmROZXN0ZWQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJtb2R1bGVwYXRoLWJvdGgiKTsKKyAgICAgICAgdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkTW9kdWxlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm1vZHVsZXMtbmVzdGVkIik7CisKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBQcm9jZXNzQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2Nlc3NCdWlsZGVyKAorICAgICAgICAgICAgaW1hZ2UuamF2YS50b1N0cmluZygpLAorICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaGVsbG8ubWFpbi1jbGFzcyIpKTsKKyAgICAgICAgYnVpbGRlci5pbmhlcml0SU8oKTsKKyAgICAgICAgaW50IGV4aXRDb2RlID0gYnVpbGRlci5zdGFydCgpLndhaXRGb3IoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICJDaGVja2luZyB0aGF0IGV4ZWN1dGlvbiBvZiBmaXJzdCBtb2R1bGUgc3VjY2VlZGVkLiIsIDAsIGV4aXRDb2RlKTsKKworICAgICAgICBidWlsZGVyLmNvbW1hbmQoCisgICAgICAgICAgICBpbWFnZS5qYXZhLnRvU3RyaW5nKCksCisgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJzbWlsZS5tYWluLWNsYXNzIikpOworICAgICAgICBleGl0Q29kZSA9IGJ1aWxkZXIuc3RhcnQoKS53YWl0Rm9yKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBleGVjdXRpb24gb2Ygc2Vjb25kIG1vZHVsZSBzdWNjZWVkZWQuIiwgMCwgZXhpdENvZGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE1vZHVsZU1pc3NpbmdOYW1lKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibW9kdWxlcy1uZXN0ZWQtbWlzc2luZy1uYW1lIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlc0luQXR0cmlidXRlQW5kTmVzdGVkKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibW9kdWxlcy1ib3RoIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ic2VydmFibGVNb2R1bGVzKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgib2JzZXJ2YWJsZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE9ic2VydmFibGVNb2R1bGVzKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgib2JzZXJ2YWJsZS1uZXN0ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRPYnNlcnZhYmxlTW9kdWxlTWlzc2luZ05hbWUoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJvYnNlcnZhYmxlLW5lc3RlZC1taXNzaW5nLW5hbWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPYnNlcnZhYmxlTW9kdWxlc0luQXR0cmlidXRlQW5kTmVzdGVkKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgib2JzZXJ2YWJsZS1ib3RoIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlMYXVuY2hlcnNFeGlzdCgpIHsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBGaWxlIGxhdW5jaGVyMSA9CisgICAgICAgICAgICBuZXcgRmlsZShpbWFnZS5iaW4sIGlzV2luZG93cygpID8gIkhlbGxvLmJhdCIgOiAiSGVsbG8iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgaW1hZ2UgaGFzICdIZWxsbycgbGF1bmNoZXIuIiwKKyAgICAgICAgICAgIGxhdW5jaGVyMS5leGlzdHMoKSk7CisKKyAgICAgICAgRmlsZSBsYXVuY2hlcjIgPQorICAgICAgICAgICAgbmV3IEZpbGUoaW1hZ2UuYmluLCBpc1dpbmRvd3MoKSA/ICJTbWlsZS5iYXQiIDogIlNtaWxlIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGltYWdlIGhhcyAnU21pbGUnIGxhdW5jaGVyLiIsCisgICAgICAgICAgICBsYXVuY2hlcjIuZXhpc3RzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhdW5jaGVycygpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhdW5jaGVycyIpOworICAgICAgICB2ZXJpZnlMYXVuY2hlcnNFeGlzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZExhdW5jaGVycygpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhdW5jaGVycy1uZXN0ZWQiKTsKKyAgICAgICAgdmVyaWZ5TGF1bmNoZXJzRXhpc3QoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRMYXVuY2hlck1pc3NpbmdOYW1lKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibGF1bmNoZXJzLW5lc3RlZC1taXNzaW5nLW5hbWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRMYXVuY2hlck1pc3NpbmdNb2R1bGUoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJsYXVuY2hlcnMtbmVzdGVkLW1pc3NpbmctbW9kdWxlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGF1bmNoZXJzSW5BdHRyaWJ1dGVBbmROZXN0ZWQoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJsYXVuY2hlcnMtYm90aCIpOworICAgICAgICB2ZXJpZnlMYXVuY2hlcnNFeGlzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlMb2NhbGVzKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIFN0cmluZyBtYWluQ2xhc3MgPQorICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYWxlZmluZGVyLm1haW4tY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkNoZWNraW5nIHRoYXQgbWFpbi1jbGFzcyBwcm9wZXJ0eSBleGlzdHMiLAorICAgICAgICAgICAgbWFpbkNsYXNzKTsKKworICAgICAgICBQcm9jZXNzQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgIG5ldyBQcm9jZXNzQnVpbGRlcihpbWFnZS5qYXZhLnRvU3RyaW5nKCksIG1haW5DbGFzcywgInpoIiwgImluIik7CisgICAgICAgIGJ1aWxkZXIuaW5oZXJpdElPKCk7CisgICAgICAgIGludCBleGl0Q29kZSA9IGJ1aWxkZXIuc3RhcnQoKS53YWl0Rm9yKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVmVyaWZ5aW5nIHRoYXQgaW1hZ2UgaGFzIGFjY2VzcyB0byBsb2NhbGVzICIKKyAgICAgICAgICAgICsgInNwZWNpZmllZCBkdXJpbmcgbGlua2luZy4iLCAwLCBleGl0Q29kZSk7CisKKyAgICAgICAgYnVpbGRlci5jb21tYW5kKGltYWdlLmphdmEudG9TdHJpbmcoKSwgbWFpbkNsYXNzLCAiamEiKTsKKyAgICAgICAgZXhpdENvZGUgPSBidWlsZGVyLnN0YXJ0KCkud2FpdEZvcigpOworCisgICAgICAgIEFzc2VydC5hc3NlcnROb3RFcXVhbHMoCisgICAgICAgICAgICAiVmVyaWZ5aW5nIHRoYXQgaW1hZ2UgZG9lcyBub3QgaGF2ZSBhY2Nlc3MgdG8gbG9jYWxlcyAiCisgICAgICAgICAgICArICJub3Qgc3BlY2lmaWVkIGR1cmluZyBsaW5raW5nLiIsIDAsIGV4aXRDb2RlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbGVzKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibG9jYWxlcyIpOworICAgICAgICB2ZXJpZnlMb2NhbGVzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkTG9jYWxlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxvY2FsZXMtbmVzdGVkIik7CisgICAgICAgIHZlcmlmeUxvY2FsZXMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRMb2NhbGVNaXNzaW5nTmFtZSgpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxvY2FsZXMtbmVzdGVkLW1pc3NpbmctbmFtZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsZXNJbkF0dHJpYnV0ZUFuZE5lc3RlZCgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxvY2FsZXMtYm90aCIpOworICAgICAgICB2ZXJpZnlMb2NhbGVzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZVJlc291cmNlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVyZXNvdXJjZXMiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBTdHJpbmcgbWFpbkNsYXNzID0KKyAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImhlbGxvLm1haW4tY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkNoZWNraW5nIHRoYXQgbWFpbi1jbGFzcyBwcm9wZXJ0eSBleGlzdHMiLAorICAgICAgICAgICAgbWFpbkNsYXNzKTsKKworICAgICAgICBQcm9jZXNzQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgIG5ldyBQcm9jZXNzQnVpbGRlcihpbWFnZS5qYXZhLnRvU3RyaW5nKCksIG1haW5DbGFzcywKKyAgICAgICAgICAgICAgICAicmVzb3VyY2UxLnR4dCIsICJyZXNvdXJjZTIudHh0Iik7CisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RJbnB1dChQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5JTkhFUklUKTsKKyAgICAgICAgYnVpbGRlci5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOworCisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBvdXRwdXRMaW5lczsKKyAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gYnVpbGRlci5zdGFydCgpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKyAgICAgICAgICAgIG5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jZXNzLmdldElucHV0U3RyZWFtKCkpKSkgeworCisgICAgICAgICAgICBvdXRwdXRMaW5lcyA9IHJlYWRlci5saW5lcygpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJDaGVja2luZyB0aGF0IGV4Y2x1ZGVkIHJlc291cmNlIGlzIGFjdHVhbGx5IGV4Y2x1ZGVkLiIsCisgICAgICAgICAgICBvdXRwdXRMaW5lcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBsIC0+IGwuZW5kc1dpdGgoInJlc291cmNlMS50eHQgYWJzZW50IikpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJDaGVja2luZyB0aGF0IHJlc291cmNlIG5vdCBleGNsdWRlZCBpcyBwcmVzZW50LiIsCisgICAgICAgICAgICBvdXRwdXRMaW5lcy5zdHJlYW0oKS5hbnlNYXRjaCgKKyAgICAgICAgICAgICAgICBsIC0+IGwuZW5kc1dpdGgoInJlc291cmNlMi50eHQgcHJlc2VudCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkRXhjbHVkZVJlc291cmNlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVyZXNvdXJjZXMtbmVzdGVkIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgU3RyaW5nIG1haW5DbGFzcyA9CisgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJoZWxsby5tYWluLWNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyB0aGF0IG1haW4tY2xhc3MgcHJvcGVydHkgZXhpc3RzIiwKKyAgICAgICAgICAgIG1haW5DbGFzcyk7CisKKyAgICAgICAgUHJvY2Vzc0J1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICBuZXcgUHJvY2Vzc0J1aWxkZXIoaW1hZ2UuamF2YS50b1N0cmluZygpLCBtYWluQ2xhc3MsCisgICAgICAgICAgICAgICAgInJlc291cmNlMS50eHQiLCAicmVzb3VyY2UyLnR4dCIpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0SW5wdXQoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuSU5IRVJJVCk7CisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKKworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gb3V0cHV0TGluZXM7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IGJ1aWxkZXIuc3RhcnQoKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSkpIHsKKworICAgICAgICAgICAgb3V0cHV0TGluZXMgPSByZWFkZXIubGluZXMoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBleGNsdWRlZCByZXNvdXJjZSBpcyBhY3R1YWxseSBleGNsdWRlZC4iLAorICAgICAgICAgICAgb3V0cHV0TGluZXMuc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgbCAtPiBsLmVuZHNXaXRoKCJyZXNvdXJjZTEudHh0IGFic2VudCIpKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCByZXNvdXJjZSBub3QgZXhjbHVkZWQgaXMgcHJlc2VudC4iLAorICAgICAgICAgICAgb3V0cHV0TGluZXMuc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgbCAtPiBsLmVuZHNXaXRoKCJyZXNvdXJjZTIudHh0IHByZXNlbnQiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4Y2x1ZGVSZXNvdXJjZXNGaWxlKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZXhjbHVkZXJlc291cmNlcy1uZXN0ZWQtZmlsZSIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIFN0cmluZyBtYWluQ2xhc3MgPQorICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaGVsbG8ubWFpbi1jbGFzcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiQ2hlY2tpbmcgdGhhdCBtYWluLWNsYXNzIHByb3BlcnR5IGV4aXN0cyIsCisgICAgICAgICAgICBtYWluQ2xhc3MpOworCisgICAgICAgIFByb2Nlc3NCdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgbmV3IFByb2Nlc3NCdWlsZGVyKGltYWdlLmphdmEudG9TdHJpbmcoKSwgbWFpbkNsYXNzLAorICAgICAgICAgICAgICAgICJyZXNvdXJjZTEudHh0IiwgInJlc291cmNlMi50eHQiKTsKKyAgICAgICAgYnVpbGRlci5yZWRpcmVjdElucHV0KFByb2Nlc3NCdWlsZGVyLlJlZGlyZWN0LklOSEVSSVQpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0RXJyb3JTdHJlYW0odHJ1ZSk7CisKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IG91dHB1dExpbmVzOworICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBidWlsZGVyLnN0YXJ0KCk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CisKKyAgICAgICAgICAgIG91dHB1dExpbmVzID0gcmVhZGVyLmxpbmVzKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgIkNoZWNraW5nIHRoYXQgZXhjbHVkZWQgcmVzb3VyY2UgaXMgYWN0dWFsbHkgZXhjbHVkZWQuIiwKKyAgICAgICAgICAgIG91dHB1dExpbmVzLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGwgLT4gbC5lbmRzV2l0aCgicmVzb3VyY2UxLnR4dCBhYnNlbnQiKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgIkNoZWNraW5nIHRoYXQgcmVzb3VyY2Ugbm90IGV4Y2x1ZGVkIGlzIHByZXNlbnQuIiwKKyAgICAgICAgICAgIG91dHB1dExpbmVzLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGwgLT4gbC5lbmRzV2l0aCgicmVzb3VyY2UyLnR4dCBwcmVzZW50IikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNsdWRlUmVzb3VyY2VzTm9BdHRyaWJ1dGVzKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZXhjbHVkZXJlc291cmNlcy1uZXN0ZWQtbm8tYXR0ciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4Y2x1ZGVSZXNvdXJjZXNGaWxlQW5kUGF0dGVybigpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVyZXNvdXJjZXMtbmVzdGVkLWJvdGgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNsdWRlUmVzb3VyY2VzQXR0cmlidXRlQW5kTmVzdGVkKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZXhjbHVkZXJlc291cmNlcy1ib3RoIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgU3RyaW5nIG1haW5DbGFzcyA9CisgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJoZWxsby5tYWluLWNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyB0aGF0IG1haW4tY2xhc3MgcHJvcGVydHkgZXhpc3RzIiwKKyAgICAgICAgICAgIG1haW5DbGFzcyk7CisKKyAgICAgICAgUHJvY2Vzc0J1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICBuZXcgUHJvY2Vzc0J1aWxkZXIoaW1hZ2UuamF2YS50b1N0cmluZygpLCBtYWluQ2xhc3MsCisgICAgICAgICAgICAgICAgInJlc291cmNlMS50eHQiLCAicmVzb3VyY2UyLnR4dCIpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0SW5wdXQoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuSU5IRVJJVCk7CisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKTsKKworICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gb3V0cHV0TGluZXM7CisgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IGJ1aWxkZXIuc3RhcnQoKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSkpIHsKKworICAgICAgICAgICAgb3V0cHV0TGluZXMgPSByZWFkZXIubGluZXMoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBmaXJzdCBleGNsdWRlZCByZXNvdXJjZSBpcyBhY3R1YWxseSBleGNsdWRlZC4iLAorICAgICAgICAgICAgb3V0cHV0TGluZXMuc3RyZWFtKCkuYW55TWF0Y2goCisgICAgICAgICAgICAgICAgbCAtPiBsLmVuZHNXaXRoKCJyZXNvdXJjZTEudHh0IGFic2VudCIpKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBzZWNvbmQgZXhjbHVkZWQgcmVzb3VyY2UgaXMgYWN0dWFsbHkgZXhjbHVkZWQuIiwKKyAgICAgICAgICAgIG91dHB1dExpbmVzLnN0cmVhbSgpLmFueU1hdGNoKAorICAgICAgICAgICAgICAgIGwgLT4gbC5lbmRzV2l0aCgicmVzb3VyY2UyLnR4dCBhYnNlbnQiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVGaWxlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVmaWxlcyIpOworICAgICAgICB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKyAgICAgICAgLy8gVE9ETzogVGVzdCBjcmVhdGVkIGltYWdlICh3aGF0IGRvZXMgLS1leGNsdWRlLWZpbGVzIGFjdHVhbGx5IGRvPykKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNsdWRlRmlsZXMoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJleGNsdWRlZmlsZXMtbmVzdGVkIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgICAgICAvLyBUT0RPOiBUZXN0IGNyZWF0ZWQgaW1hZ2UgKHdoYXQgZG9lcyAtLWV4Y2x1ZGUtZmlsZXMgYWN0dWFsbHkgZG8/KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4Y2x1ZGVGaWxlc0ZpbGUoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJleGNsdWRlZmlsZXMtbmVzdGVkLWZpbGUiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKyAgICAgICAgLy8gVE9ETzogVGVzdCBjcmVhdGVkIGltYWdlICh3aGF0IGRvZXMgLS1leGNsdWRlLWZpbGVzIGFjdHVhbGx5IGRvPykKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNsdWRlRmlsZXNOb0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJleGNsdWRlZmlsZXMtbmVzdGVkLW5vLWF0dHIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNsdWRlRmlsZXNGaWxlQW5kUGF0dGVybigpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVmaWxlcy1uZXN0ZWQtYm90aCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVGaWxlc0F0dHJpYnV0ZUFuZE5lc3RlZCgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2x1ZGVmaWxlcy1ib3RoIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgICAgICAvLyBUT0RPOiBUZXN0IGNyZWF0ZWQgaW1hZ2UgKHdoYXQgZG9lcyAtLWV4Y2x1ZGUtZmlsZXMgYWN0dWFsbHkgZG8/KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyaW5nKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgib3JkZXJpbmciKTsKKyAgICAgICAgdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisgICAgICAgIC8vIFRPRE86IFRlc3QgcmVzb3VyY2Ugb3JkZXIgaW4gY3JlYXRlZCBpbWFnZSAoaG93PykKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRPcmRlcmluZygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm9yZGVyaW5nLW5lc3RlZCIpOworICAgICAgICB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKyAgICAgICAgLy8gVE9ETzogVGVzdCByZXNvdXJjZSBvcmRlciBpbiBjcmVhdGVkIGltYWdlIChob3c/KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE9yZGVyaW5nTGlzdEZpbGUoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJvcmRlcmluZy1uZXN0ZWQtZmlsZSIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgICAgICAvLyBUT0RPOiBUZXN0IHJlc291cmNlIG9yZGVyIGluIGNyZWF0ZWQgaW1hZ2UgKGhvdz8pCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkT3JkZXJpbmdOb0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJvcmRlcmluZy1uZXN0ZWQtbm8tYXR0ciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZE9yZGVyaW5nRmlsZUFuZFBhdHRlcm4oKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJvcmRlcmluZy1uZXN0ZWQtYm90aCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyaW5nQXR0cmlidXRlQW5kTmVzdGVkKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgib3JkZXJpbmctYm90aCIpOworICAgICAgICB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKyAgICAgICAgLy8gVE9ETzogVGVzdCByZXNvdXJjZSBvcmRlciBpbiBjcmVhdGVkIGltYWdlIChob3c/KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY2x1ZGVIZWFkZXJzKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaW5jbHVkZWhlYWRlcnMiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBGaWxlW10gaGVhZGVycyA9IG5ldyBGaWxlKGltYWdlLnJvb3QsICJpbmNsdWRlIikubGlzdEZpbGVzKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0IGluY2x1ZGUgZmlsZXMgd2VyZSBvbWl0dGVkLiIsCisgICAgICAgICAgICBoZWFkZXJzID09IG51bGwgfHwgaGVhZGVycy5sZW5ndGggPT0gMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZU1hblBhZ2VzKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiaW5jbHVkZW1hbnBhZ2VzIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgRmlsZVtdIG1hblBhZ2VzID0gbmV3IEZpbGUoaW1hZ2Uucm9vdCwgIm1hbiIpLmxpc3RGaWxlcygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBtYW4gcGFnZXMgd2VyZSBvbWl0dGVkLiIsCisgICAgICAgICAgICBtYW5QYWdlcyA9PSBudWxsIHx8IG1hblBhZ2VzLmxlbmd0aCA9PSAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlTmF0aXZlQ29tbWFuZHMoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJpbmNsdWRlbmF0aXZlY29tbWFuZHMiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSBuZXcgSW1hZ2VTdHJ1Y3R1cmUoCisgICAgICAgICAgICBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJpbWFnZSIpKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgaW1hZ2Ugd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBpbWFnZS5yb290LmV4aXN0cygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBpbWFnZSB3YXMgc3RyaXBwZWQgb2YgamF2YSBleGVjdXRhYmxlLiIsCisgICAgICAgICAgICBpbWFnZS5qYXZhLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgdG90YWxTaXplT2YoZmluYWwgUGF0aCBwYXRoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChGaWxlcy5pc0RpcmVjdG9yeShwYXRoKSkgeworICAgICAgICAgICAgbG9uZyBzaXplID0gMDsKKyAgICAgICAgICAgIHRyeSAoRGlyZWN0b3J5U3RyZWFtPFBhdGg+IGNoaWxkcmVuID0gRmlsZXMubmV3RGlyZWN0b3J5U3RyZWFtKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChQYXRoIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSB0b3RhbFNpemVPZihjaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoRmlsZXMuaXNSZWd1bGFyRmlsZShwYXRoKSkgeworICAgICAgICAgICAgcmV0dXJuIEZpbGVzLnNpemUocGF0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc2lvbigpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbXByZXNzaW9uIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgRmlsZSBjb21wcmVzc2VkSW1hZ2VSb290ID0KKyAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNvbXByZXNzZWQtaW1hZ2UiKSk7CisKKyAgICAgICAgbG9uZyBzaXplID0gdG90YWxTaXplT2YoaW1hZ2Uucm9vdC50b1BhdGgoKSk7CisgICAgICAgIGxvbmcgY29tcHJlc3NlZFNpemUgPSB0b3RhbFNpemVPZihjb21wcmVzc2VkSW1hZ2VSb290LnRvUGF0aCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBjb21wcmVzc2lvbiByZXN1bHRlZCBpbiBzbWFsbGVyIGltYWdlLiIsCisgICAgICAgICAgICBjb21wcmVzc2VkU2l6ZSA8IHNpemUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbXByZXNzaW9uKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29tcHJlc3Npb24tbmVzdGVkIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgRmlsZSBjb21wcmVzc2VkSW1hZ2VSb290ID0KKyAgICAgICAgICAgIG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNvbXByZXNzZWQtaW1hZ2UiKSk7CisKKyAgICAgICAgbG9uZyBzaXplID0gdG90YWxTaXplT2YoaW1hZ2Uucm9vdC50b1BhdGgoKSk7CisgICAgICAgIGxvbmcgY29tcHJlc3NlZFNpemUgPSB0b3RhbFNpemVPZihjb21wcmVzc2VkSW1hZ2VSb290LnRvUGF0aCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBjb21wcmVzc2lvbiByZXN1bHRlZCBpbiBzbWFsbGVyIGltYWdlLiIsCisgICAgICAgICAgICBjb21wcmVzc2VkU2l6ZSA8IHNpemUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbXByZXNzaW9uTm9BdHRyaWJ1dGVzKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29tcHJlc3Npb24tbmVzdGVkLW5vLWF0dHIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRDb21wcmVzc2lvbkF0dHJpYnV0ZUFuZE5lc3RlZCgpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbXByZXNzaW9uLWJvdGgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRpYW4oKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJlbmRpYW4iKTsKKyAgICAgICAgdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisgICAgICAgIC8vIFRPRE86IEhvdyBjYW4gd2UgdGVzdCB0aGUgY3JlYXRlZCBpbWFnZT8gIFdoaWNoIGZpbGVzIGRvZXMgLS1lbmRpYW4KKyAgICAgICAgLy8gYWZmZWN0PworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZNVHlwZSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInZtIik7CisgICAgICAgIHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworICAgICAgICAvLyBUT0RPOiBIb3cgY2FuIHdlIHRlc3QgdGhlIGNyZWF0ZWQgaW1hZ2U/ICBXaGljaCBmaWxlcyBkb2VzIC0tdm0KKyAgICAgICAgLy8gYWZmZWN0PworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvRmlsZSgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJlbGVhc2VpbmZvLWZpbGUiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBGaWxlIHJlbGVhc2UgPSBuZXcgRmlsZShpbWFnZS5yb290LCAicmVsZWFzZSIpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICBGaWxlcy5uZXdCdWZmZXJlZFJlYWRlcihyZWxlYXNlLnRvUGF0aCgpKSkgeworCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgZm9yICd0ZXN0PXRydWUnIGluIGltYWdlIHJlbGVhc2UgaW5mby4iLAorICAgICAgICAgICAgICAgIHJlYWRlci5saW5lcygpLmFueU1hdGNoKGwgLT4gbC5lcXVhbHMoInRlc3Q9dHJ1ZSIpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlSW5mb0RlbGV0ZSgpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJlbGVhc2VpbmZvLWRlbGV0ZSIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIEZpbGUgcmVsZWFzZSA9IG5ldyBGaWxlKGltYWdlLnJvb3QsICJyZWxlYXNlIik7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgIEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHJlbGVhc2UudG9QYXRoKCkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQ2hlY2tpbmcgdGhhdCAndGVzdCcgd2FzIGRlbGV0ZWQgIgorICAgICAgICAgICAgICAgICsgImZyb20gaW1hZ2UgcmVsZWFzZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkuYW55TWF0Y2gobCAtPiBsLnN0YXJ0c1dpdGgoInRlc3Q9IikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvTmVzdGVkRGVsZXRlKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVsZWFzZWluZm8tbmVzdGVkLWRlbGV0ZSIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIEZpbGUgcmVsZWFzZSA9IG5ldyBGaWxlKGltYWdlLnJvb3QsICJyZWxlYXNlIik7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0KKyAgICAgICAgICAgIEZpbGVzLm5ld0J1ZmZlcmVkUmVhZGVyKHJlbGVhc2UudG9QYXRoKCkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiQ2hlY2tpbmcgdGhhdCAndGVzdCcgd2FzIGRlbGV0ZWQgIgorICAgICAgICAgICAgICAgICsgImZyb20gaW1hZ2UgcmVsZWFzZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkuYW55TWF0Y2gobCAtPiBsLnN0YXJ0c1dpdGgoInRlc3Q9IikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvTmVzdGVkRGVsZXRlTm9LZXkoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZWxlYXNlaW5mby1uZXN0ZWQtZGVsZXRlLW5vLWtleSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvRGVsZXRlQXR0cmlidXRlQW5kTmVzdGVkKCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVsZWFzZWluZm8tbmVzdGVkLWRlbGV0ZS1ib3RoIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgRmlsZSByZWxlYXNlID0gbmV3IEZpbGUoaW1hZ2Uucm9vdCwgInJlbGVhc2UiKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIocmVsZWFzZS50b1BhdGgoKSkpIHsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIkNoZWNraW5nIHRoYXQgJ3Rlc3QnIGFuZCAnZm9vJyB3ZXJlIGRlbGV0ZWQgIgorICAgICAgICAgICAgICAgICsgImZyb20gaW1hZ2UgcmVsZWFzZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkubm9uZU1hdGNoKGwgLT4KKyAgICAgICAgICAgICAgICAgICAgbC5zdGFydHNXaXRoKCJ0ZXN0PSIpIHx8IGwuc3RhcnRzV2l0aCgiZm9vPSIpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlSW5mb0FkZEZpbGUoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZWxlYXNlaW5mby1hZGQtZmlsZSIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIEZpbGUgcmVsZWFzZSA9IG5ldyBGaWxlKGltYWdlLnJvb3QsICJyZWxlYXNlIik7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIocmVsZWFzZSkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0ICd0ZXN0PXNcdTAwZWQnIHdhcyBhZGRlZCAiCisgICAgICAgICAgICAgICAgKyAidG8gaW1hZ2UgcmVsZWFzZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkuYW55TWF0Y2gobCAtPiBsLmVxdWFscygidGVzdD1zXHUwMGVkIikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvQWRkRmlsZVdpdGhDaGFyc2V0KCkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVsZWFzZWluZm8tYWRkLWZpbGUtY2hhcnNldCIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIEZpbGUgcmVsZWFzZSA9IG5ldyBGaWxlKGltYWdlLnJvb3QsICJyZWxlYXNlIik7CisgICAgICAgIC8vIFVzaW5nIEZpbGVSZWFkZXIgaGVyZSBzaW5jZSAncmVsZWFzZScgZmlsZSBpcyBpbiBwbGF0Zm9ybSdzIGNoYXJzZXQuCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIocmVsZWFzZSkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyB0aGF0ICd0ZXN0PXNcdTAwZWQnIHdhcyBhZGRlZCAiCisgICAgICAgICAgICAgICAgKyAidG8gaW1hZ2UgcmVsZWFzZSBpbmZvLiIsCisgICAgICAgICAgICAgICAgcmVhZGVyLmxpbmVzKCkuYW55TWF0Y2gobCAtPiBsLmVxdWFscygidGVzdD1zXHUwMGVkIikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGVhc2VJbmZvQWRkS2V5QW5kVmFsdWUoKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZWxlYXNlaW5mby1hZGQta2V5Iik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgRmlsZSByZWxlYXNlID0gbmV3IEZpbGUoaW1hZ2Uucm9vdCwgInJlbGVhc2UiKTsKKyAgICAgICAgdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPQorICAgICAgICAgICAgRmlsZXMubmV3QnVmZmVyZWRSZWFkZXIocmVsZWFzZS50b1BhdGgoKSkpIHsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgJ3Rlc3Q9dHJ1ZScgd2FzIGFkZGVkICIKKyAgICAgICAgICAgICAgICArICJ0byBpbWFnZSByZWxlYXNlIGluZm8uIiwKKyAgICAgICAgICAgICAgICByZWFkZXIubGluZXMoKS5hbnlNYXRjaChsIC0+IGwuZXF1YWxzKCJ0ZXN0PXRydWUiKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZUluZm9BZGROb1ZhbHVlKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgicmVsZWFzZWluZm8tYWRkLW5vLXZhbHVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZUluZm9BZGROb0tleSgpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJlbGVhc2VpbmZvLWFkZC1uby1rZXkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxlYXNlSW5mb0FkZEZpbGVBbmRLZXkoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZWxlYXNlaW5mby1hZGQtZmlsZS1hbmQta2V5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsZWFzZUluZm9BZGRGaWxlQW5kVmFsdWUoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZWxlYXNlaW5mby1hZGQtZmlsZS1hbmQtdmFsdWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWJ1Z1N0cmlwcGluZygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRlYnVnIik7CisgICAgICAgIEltYWdlU3RydWN0dXJlIGltYWdlID0gdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisKKyAgICAgICAgUHJvY2Vzc0J1aWxkZXIgYnVpbGRlciA9IG5ldyBQcm9jZXNzQnVpbGRlcigKKyAgICAgICAgICAgIGltYWdlLmphdmEudG9TdHJpbmcoKSwKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInRocm93ZXIubWFpbi1jbGFzcyIpKTsKKyAgICAgICAgYnVpbGRlci5yZWRpcmVjdElucHV0KFByb2Nlc3NCdWlsZGVyLlJlZGlyZWN0LklOSEVSSVQpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0RXJyb3JTdHJlYW0odHJ1ZSk7CisKKyAgICAgICAgUHJvY2VzcyBwcm9jZXNzID0gYnVpbGRlci5zdGFydCgpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGxpbmVzUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICJDaGVja2luZyB0aGF0IHN0YWNrIHRyYWNlIGNvbnRhaW5zIG5vIGRlYnVnIGluZm9ybWF0aW9uLiIsCisgICAgICAgICAgICAgICAgbGluZXNSZWFkZXIubGluZXMoKS5ub25lTWF0Y2goCisgICAgICAgICAgICAgICAgICAgIGwgLT4gbC5tYXRjaGVzKCIuKlxcKFteKV0qOlswLTldK1xcKSIpKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVkdXBsaWNhdGlvbk9mTGljZW5zZXMoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkZWR1cCIpOworICAgICAgICBJbWFnZVN0cnVjdHVyZSBpbWFnZSA9IHZlcmlmeUltYWdlQnVpbHROb3JtYWxseSgpOworCisgICAgICAgIFN0cmluZyBoZWxsb01vZHVsZU5hbWUgPQorICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaGVsbG8ubW9kIik7CisgICAgICAgIFN0cmluZyBzbWlsZU1vZHVsZU5hbWUgPQorICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgic21pbGUubW9kIik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkNoZWNraW5nIHRoYXQgJ2hlbGxvLm1vZCcgcHJvcGVydHkgd2FzIHNldC4iLAorICAgICAgICAgICAgaGVsbG9Nb2R1bGVOYW1lKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIkNoZWNraW5nIHRoYXQgJ3NtaWxlLm1vZCcgcHJvcGVydHkgd2FzIHNldC4iLAorICAgICAgICAgICAgc21pbGVNb2R1bGVOYW1lKTsKKworICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIkNoZWNraW5nIHRoYXQgdGhpcyBvcGVyYXRpbmcgc3lzdGVtIgorICAgICAgICAgICAgKyAiIHN1cHBvcnRzIHN5bWJvbGljIGxpbmtzIGFzIGEgbWVhbnMgb2YgbGljZW5zZSBkZS1kdXBsaWNhdGlvbi4iLAorICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuY29udGFpbnMoIldpbmRvd3MiKSk7CisKKyAgICAgICAgUGF0aCBsZWdhbCA9IGltYWdlLnJvb3QudG9QYXRoKCkucmVzb2x2ZSgibGVnYWwiKTsKKworICAgICAgICBQYXRoW10gbGljZW5zZXMgPSB7CisgICAgICAgICAgICBsZWdhbC5yZXNvbHZlKGhlbGxvTW9kdWxlTmFtZSkucmVzb2x2ZSgiVVNFTEVTU0xJQ0VOU0UiKSwKKyAgICAgICAgICAgIGxlZ2FsLnJlc29sdmUoc21pbGVNb2R1bGVOYW1lKS5yZXNvbHZlKCJVU0VMRVNTTElDRU5TRSIpLAorICAgICAgICB9OworCisgICAgICAgIGludCBub25MaW5rQ291bnQgPSAwOworICAgICAgICBmb3IgKFBhdGggbGljZW5zZSA6IGxpY2Vuc2VzKSB7CisgICAgICAgICAgICBpZiAoIUZpbGVzLmlzU3ltYm9saWNMaW5rKGxpY2Vuc2UpKSB7CisgICAgICAgICAgICAgICAgbm9uTGlua0NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIkNoZWNraW5nIHRoYXQgVVNFTEVTU0xJQ0VOU0Ugb25seSBleGlzdHMgb25jZSBpbiBpbWFnZSAiCisgICAgICAgICAgICArICJhbmQgYWxsIG90aGVyIGluc3RhbmNlcyBhcmUgbGlua3MgdG8gaXQuIiwKKyAgICAgICAgICAgIDEsIG5vbkxpbmtDb3VudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWdub3JlU2lnbmluZygpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImlnbm9yZXNpZ25pbmciKTsKKyAgICAgICAgdmVyaWZ5SW1hZ2VCdWlsdE5vcm1hbGx5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2hvdWxkIGZhaWwgZHVlIHRvIGpsaW5rIHJlamVjdGluZyBpZGVudGljYWxseSBuYW1lZCBmaWxlcyB3aG9zZQorICAgICAqIGNvbnRlbnRzIGFyZSBkaWZmZXJlbnQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVkdXBsaWNhdGlvbk9mSW5jb25zaXN0ZW50TGljZW5zZXMoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJkZWR1cC1pZGVudGljYWwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kaW5nT2ZTZXJ2aWNlcygpCisgICAgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJiaW5kc2VydmljZXMiKTsKKyAgICAgICAgSW1hZ2VTdHJ1Y3R1cmUgaW1hZ2UgPSB2ZXJpZnlJbWFnZUJ1aWx0Tm9ybWFsbHkoKTsKKworICAgICAgICBTdHJpbmcgbWFpbkNsYXNzID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaW5jLm1haW4tY2xhc3MiKTsKKworICAgICAgICBQcm9jZXNzQnVpbGRlciBidWlsZGVyID0gbmV3IFByb2Nlc3NCdWlsZGVyKAorICAgICAgICAgICAgaW1hZ2UuamF2YS50b1N0cmluZygpLCBtYWluQ2xhc3MpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0SW5wdXQoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuSU5IRVJJVCk7CisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RFcnJvcihQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5JTkhFUklUKTsKKworICAgICAgICBQcm9jZXNzIHByb2Nlc3MgPSBidWlsZGVyLnN0YXJ0KCk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgbGluZXNSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisgICAgICAgICAgICBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpKSkpIHsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiQ2hlY2tpbmcgdGhhdCBiaW5kU2VydmljZXM9ZmFsc2UgcmVzdWx0cyBpbiBubyBwcm92aWRlcnMgaW4gaW1hZ2UuIiwKKyAgICAgICAgICAgICAgICAwLCBsaW5lc1JlYWRlci5saW5lcygpLmNvdW50KCkpOworICAgICAgICB9CisgICAgICAgIHByb2Nlc3Mud2FpdEZvcigpOworCisgICAgICAgIGltYWdlID0gbmV3IEltYWdlU3RydWN0dXJlKAorICAgICAgICAgICAgbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiaW1hZ2UyIikpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQ2hlY2tpbmcgdGhhdCBpbWFnZTIgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLiIsCisgICAgICAgICAgICBpbWFnZS5yb290LmV4aXN0cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIHRoYXQgaW1hZ2UyIGhhcyBqYXZhIGV4ZWN1dGFibGUuIiwKKyAgICAgICAgICAgIGltYWdlLmphdmEuZXhpc3RzKCkpOworCisgICAgICAgIGJ1aWxkZXIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoaW1hZ2UuamF2YS50b1N0cmluZygpLCBtYWluQ2xhc3MpOworICAgICAgICBidWlsZGVyLnJlZGlyZWN0SW5wdXQoUHJvY2Vzc0J1aWxkZXIuUmVkaXJlY3QuSU5IRVJJVCk7CisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RFcnJvcihQcm9jZXNzQnVpbGRlci5SZWRpcmVjdC5JTkhFUklUKTsKKworICAgICAgICBwcm9jZXNzID0gYnVpbGRlci5zdGFydCgpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGxpbmVzUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorICAgICAgICAgICAgbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSkpKSB7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIkNoZWNraW5nIHRoYXQgYmluZFNlcnZpY2VzPXRydWUgcmVzdWx0cyBpbiBpbWFnZSB3aXRoIHByb3ZpZGVyLiIsCisgICAgICAgICAgICAgICAgNSwgbGluZXNSZWFkZXIubGluZXMoKS5jb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzLndhaXRGb3IoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBydW5KbGluayhmaW5hbCBTdHJpbmcuLi4gYXJncykgeworICAgICAgICBUb29sUHJvdmlkZXIgamxpbmsgPSBUb29sUHJvdmlkZXIuZmluZEZpcnN0KCJqbGluayIpLm9yRWxzZVRocm93KAorICAgICAgICAgICAgKCkgLT4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oImpsaW5rIHRvb2wgbm90IGZvdW5kIGluIEpESy4iKSk7CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZG91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0ZGVyciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBpbnQgZXhpdENvZGU7CisgICAgICAgIHRyeSAoUHJpbnRTdHJlYW0gb3V0ID0gbmV3IFByaW50U3RyZWFtKHN0ZG91dCk7CisgICAgICAgICAgICAgUHJpbnRTdHJlYW0gZXJyID0gbmV3IFByaW50U3RyZWFtKHN0ZGVycikpIHsKKworICAgICAgICAgICAgZXhpdENvZGUgPSBqbGluay5ydW4ob3V0LCBlcnIsIGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4aXRDb2RlICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJqbGluayBmYWlsZWQsIG91dHB1dCBpczogIiArIHN0ZG91dCArICIsIGVycm9yIGlzOiAiICsgc3RkZXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdGRvdXQudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQU5UTFJUZXN0LmphdmEKaW5kZXggZjU3ZTQxOC4uZmVhNTFmNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0FOVExSVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BTlRMUlRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI4LDEwICsyOCwxMCBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydE5vdENvbnRhaW5zOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqIElmIHlvdSB3YW50IHRvIHJ1biB0ZXN0cywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkCkBAIC00NiwzNSArNDYsMzEgQEAKICAqLwogcHVibGljIGNsYXNzIEFOVExSVGVzdCB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyLyI7Ci0KICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJhbnRsci54bWwiKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2FudGxyL2FudGxyLnhtbCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCwgdGFyZ2V0CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgicmVxdWlyZWQgYXJndW1lbnQsIHRhcmdldCwgbWlzc2luZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIHNob3VsZCBjaGVjayBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOworICAgICAgICAvLyBUT0RPIENoZWNrIGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBpbnZhbGlkIG91dHB1dCBkaXJlY3RvcnkKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJJbnZhbGlkIG91dHB1dCBkaXJlY3RvcnkiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBzaG91bGQgY2hlY2sgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CisgICAgICAgIC8vIFRPRE8gQ2hlY2sgZXhjZXB0aW9uIG1lc3NhZ2UKKyAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MygpIHsKQEAgLTg2LDE2ICs4MiwxNCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDQiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIHNob3VsZCBwcmludCAicGFuaWM6IENhbm5vdCBmaW5kIGltcG9ydFZvY2FiIGZpbGUgJ0phdmFUb2tlblR5cGVzLnR4dCciCisgICAgICogc2luY2UgaXQgbmVlZHMgdG8gcnVuIGphdmEuZyBmaXJzdCBiZWZvcmUgamF2YS50cmVlLmcKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3Q1KCkgewotICAgICAgICAvLyBzaG91bGQgcHJpbnQgInBhbmljOiBDYW5ub3QgZmluZCBpbXBvcnRWb2NhYiBmaWxlICdKYXZhVG9rZW5UeXBlcy50eHQnIgotICAgICAgICAvLyBzaW5jZSBpdCBuZWVkcyB0byBydW4gamF2YS5nIGZpcnN0IGJlZm9yZSBqYXZhLnRyZWUuZwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7Ci0gICAgICAgICAgICBmYWlsKCJBTlRMUiByZXR1cm5lZDogMSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIHNob3VsZCBjaGVjayBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NSIpOworICAgICAgICAvLyBUT0RPIENoZWNrIGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwMywyNyArOTcsMjIgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q2Iik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBpbmFiaWxpdHkgdG8gZGV0ZXJtaW5lIGdlbmVyYXRlZCBjbGFzcworICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDcoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDciKTsKLSAgICAgICAgICAgIGZhaWwoIlVuYWJsZSB0byBkZXRlcm1pbmUgZ2VuZXJhdGVkIGNsYXNzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gc2hvdWxkIGNoZWNrIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q3Iik7CisgICAgICAgIC8vIFRPRE8gQ2hlY2sgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGlzIGEgbmVnYXRpdmUgdGVzdCBmb3IgdGhlIHN1cGVyIGdyYW1tYXIgKGdsaWIpIG9wdGlvbi4KKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBpbnZhbGlkIHN1cGVyIGdyYW1tYXIgKGdsaWIpIG9wdGlvbi4KICAgICAgKi8KLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDgoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDgiKTsKLSAgICAgICAgICAgIGZhaWwoIkludmFsaWQgc3VwZXIgZ3JhbW1hciBmaWxlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gc2hvdWxkIGNoZWNrIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q4Iik7CisgICAgICAgIC8vIFRPRE8gQ2hlY2sgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKICAgICAvKioKQEAgLTE0Myw4ICsxMzIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxMCIpOwogICAgICAgICBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpKTsKLSAgICAgICAgU3RyaW5nW10gY2FsY0ZpbGVzID0gb3V0cHV0RGlyZWN0b3J5Lmxpc3QobmV3IEhUTUxGaWx0ZXIoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY2FsY0ZpbGVzLmxlbmd0aCA+IDApOworICAgICAgICBhc3NlcnROb3RFcXVhbHMob3V0cHV0RGlyZWN0b3J5Lmxpc3QobmV3IEhUTUxGaWx0ZXIoKSkubGVuZ3RoLCAwKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3OCwzMiArMTY2LDMyIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWNvbXBpbGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSkpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9SZWNvbXBpbGUiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIGNvbnRhaW5zU3RyaW5nKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsUmVjb21waWxlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDkiKTsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIG5vdChjb250YWluc1N0cmluZygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIikpKTsKIAogICAgICAgICBGaWxlVXRpbGl0aWVzLnJvbGxiYWNrVGltZXN0YW1wcyhidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksIDUpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub3JtYWxSZWNvbXBpbGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMoIlNraXBwZWQgZ3JhbW1hciBmaWxlLiIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIG5vdChjb250YWluc1N0cmluZygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIikpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIC8vIEJ1Z3ppbGxhIFJlcG9ydCAxMjk2MQogICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBlcmdyYW1tYXJDaGFuZ2VSZWNvbXBpbGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0OSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSkpOwogCiAgICAgICAgIEZpbGVVdGlsaXRpZXMucm9sbGJhY2tUaW1lc3RhbXBzKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgNSk7CiAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInN1cGVyZ3JhbW1hckNoYW5nZVJlY29tcGlsZSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiU2tpcHBlZCBncmFtbWFyIGZpbGUuIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJTa2lwcGVkIGdyYW1tYXIgZmlsZS4iKSkpOwogCiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQWJzdHJhY3RYU0xUTGlhaXNvblRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhCmluZGV4IGY1NWMzZjkuLjkyMGExMDQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9BYnN0cmFjdFhTTFRMaWFpc29uVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0JlYW5TaGVsbFNjcmlwdFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9CZWFuU2hlbGxTY3JpcHRUZXN0LmphdmEKaW5kZXggODgwMjAyMi4uMzM4M2E5MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0JlYW5TaGVsbFNjcmlwdFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvQmVhblNoZWxsU2NyaXB0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0VjaG9Qcm9wZXJ0aWVzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0VjaG9Qcm9wZXJ0aWVzVGVzdC5qYXZhCmluZGV4IDlkMzQ3NjAuLjBjNTYxYTQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9FY2hvUHJvcGVydGllc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvRWNob1Byb3BlcnRpZXNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMSArMTgsMTIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0zNiwxMSArMzcsMTMgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIC8qKgogICogVGVzdHMgdGhlIEVjaG9Qcm9wZXJ0aWVzIHRhc2suCkBAIC01MCw3ICs1Myw2IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBFY2hvUHJvcGVydGllc1Rlc3QgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHT09EX09VVEZJTEUgPSAidGVzdC5wcm9wZXJ0aWVzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09PRF9PVVRGSUxFX1hNTCA9ICJ0ZXN0LnhtbCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9PVVRGSUxFID0gInRlc3QtcHJlZml4LnByb3BlcnRpZXMiOwpAQCAtNTksOSArNjEsMTIgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJlY2hvcHJvcGVydGllcy54bWwiKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2VjaG9wcm9wZXJ0aWVzLnhtbCIpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJ0ZXN0LnByb3BlcnR5IiwgVEVTVF9WQUxVRSk7CiAgICAgfQogCkBAIC03Myw0NSArNzgsMzkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Mb2coKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RWNob1RvTG9nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0ZXN0LnByb3BlcnR5PSIgKyBURVNUX1ZBTFVFLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QucHJvcGVydHk9IiArIFRFU1RfVkFMVUUpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvV2l0aEVtcHR5UHJlZml4VG9Mb2coKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RWNob1dpdGhFbXB0eVByZWZpeFRvTG9nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0ZXN0LnByb3BlcnR5PSIgKyBURVNUX1ZBTFVFLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QucHJvcGVydHk9IiArIFRFU1RfVkFMVUUpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQmFkRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UmVhZEJhZEZpbGUiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIG9uIGJhZCBmaWxlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygic3JjZmlsZSBpcyBhIGRpcmVjdG9yeSIsICJzcmNmaWxlIGlzIGEgZGlyZWN0b3J5ISIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJzcmNmaWxlIGlzIGEgZGlyZWN0b3J5ISIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFJlYWRCYWRGaWxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJhZEZpbGVOb0ZhaWwoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UmVhZEJhZEZpbGVOb0ZhaWwiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoInNyY2ZpbGUgaXMgYSBkaXJlY3RvcnkhIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJzcmNmaWxlIGlzIGEgZGlyZWN0b3J5ISIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9CYWRGaWxlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RFY2hvVG9CYWRGaWxlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBvbiBkZXN0aW5hdGlvbiBmaWxlIGJlaW5nIGEgZGlyZWN0b3J5Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkiLCAiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkhIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5ISIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVjaG9Ub0JhZEZpbGUiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9CYWRGaWxlTm9GYWlsKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVjaG9Ub0JhZEZpbGVOb0ZhaWwiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImRlc3RmaWxlIGlzIGEgZGlyZWN0b3J5ISIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiZGVzdGZpbGUgaXMgYSBkaXJlY3RvcnkhIikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMjUsMjcgKzEyNCwxMCBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVjaG9Ub0dvb2RGaWxlWG1sIik7CiAKICAgICAgICAgLy8gcmVhZCBpbiB0aGUgZmlsZQotICAgICAgICBGaWxlIGYgPSBjcmVhdGVSZWxhdGl2ZUZpbGUoR09PRF9PVVRGSUxFX1hNTCk7Ci0gICAgICAgIEZpbGVSZWFkZXIgZnIgPSBuZXcgRmlsZVJlYWRlcihmKTsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHJlYWQgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChyZWFkLmNvbnRhaW5zKCI8cHJvcGVydHkgbmFtZT1cInRlc3QucHJvcGVydHlcIiB2YWx1ZT1cIiIgKyBURVNUX1ZBTFVFICsgIlwiIC8+IikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhlIHByb3BlcnR5IHdlIHNldCAtIGl0J3MgZ29vZC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZhaWwoImRpZCBub3QgZW5jb3VudGVyIHNldCBwcm9wZXJ0eSBpbiBnZW5lcmF0ZWQgZmlsZS4iKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgZnIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYnIuY2xvc2UoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIH0KKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIEdPT0RfT1VURklMRV9YTUwpOworICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGYpKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlkIG5vdCBlbmNvdW50ZXIgc2V0IHByb3BlcnR5IGluIGdlbmVyYXRlZCBmaWxlLiIsIGJyLmxpbmVzKCkuYW55TWF0Y2gobGluZQorICAgICAgICAgICAgICAgICAgICAtPiBsaW5lLmNvbnRhaW5zKCI8cHJvcGVydHkgbmFtZT1cInRlc3QucHJvcGVydHlcIiB2YWx1ZT1cIiIgKyBURVNUX1ZBTFVFICsgIlwiIC8+IikpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTgyLDMwICsxNjQsMjYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUHJlZml4QW5kUmVnZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFByZWZpeEFuZFJlZ2V4Iik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBvbiBQcmVmaXggYW5kIFJlZ0V4IGJlaW5nIHNldCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGFyZ2V0IG11c3QgZmFpbCB3aXRoIHByZWZpeCBhbmQgcmVnZXggYXR0cmlidXRlcyBzZXQiLAotICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHByZWZpeCBvciByZWdleCwgYnV0IG5vdCBib3RoIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUHJlZml4QW5kUmVnZXgoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiUGxlYXNlIHNwZWNpZnkgZWl0aGVyIHByZWZpeCBvciByZWdleCwgYnV0IG5vdCBib3RoIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFByZWZpeEFuZFJlZ2V4Iik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEVtcHR5UHJlZml4QW5kUmVnZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEVtcHR5UHJlZml4QW5kUmVnZXgoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RWNob1dpdGhFbXB0eVByZWZpeFRvTG9nIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0ZXN0LnByb3BlcnR5PSIgKyBURVNUX1ZBTFVFLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInRlc3QucHJvcGVydHk9IiArIFRFU1RfVkFMVUUpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUmVnZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFJlZ2V4KCkgewogICAgICAgICBhc3N1bWVUcnVlKCJUZXN0IHNraXBwZWQgYmVjYXVzZSBubyByZWdleHAgbWF0Y2hlciBpcyBwcmVzZW50LiIsCiAgICAgICAgICAgICAgICAgUmVnZXhwTWF0Y2hlckZhY3RvcnkucmVnZXhwTWF0Y2hlclByZXNlbnQoYnVpbGRSdWxlLmdldFByb2plY3QoKSkpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdpdGhSZWdleCIpOwogICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGxpbmUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIGNoZWNraW5nIGFudC5ob21lIHRvIGFudC52ZXJzaW9uCiAgICAgICAgIC8vIHNvIHRoZSB0ZXN0IHdpbGwgc3RpbGwgd29yayB3aGVuIHJ1biBvdXRzaWRlIG9mIGFuIEFudCBzY3JpcHQKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImFudC52ZXJzaW9uPSIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCksIGNvbnRhaW5zU3RyaW5nKE1hZ2ljTmFtZXMuQU5UX1ZFUlNJT04gKyAiPSIpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdEVjaG9QcmVmaXhWYXJpb3VzKFN0cmluZyB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24gewpAQCAtMjE5LDQyICsxOTcsMjEgQEAKIAogICAgIHByb3RlY3RlZCBQcm9wZXJ0aWVzIGxvYWRQcm9wRmlsZShTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZSkKICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZiA9IGNyZWF0ZVJlbGF0aXZlRmlsZShyZWxhdGl2ZUZpbGVuYW1lKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTnVsbCBwcm9wZXJ0eSBmaWxlIG5hbWUiLCByZWxhdGl2ZUZpbGVuYW1lKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHJlbGF0aXZlRmlsZW5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGNyZWF0ZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgZi5leGlzdHMoKSk7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIHRyeSAgewotICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpKSB7CiAgICAgICAgICAgICBwcm9wcy5sb2FkKGluKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwcm9wczsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRHb29kRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGaWxlIGYgPSBjcmVhdGVSZWxhdGl2ZUZpbGUoR09PRF9PVVRGSUxFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBjcmVhdGUgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICBmLmV4aXN0cygpKTsKICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IGxvYWRQcm9wRmlsZShHT09EX09VVEZJTEUpOwogICAgICAgICBwcm9wcy5saXN0KFN5c3RlbS5vdXQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QgcHJvcGVydHkgbm90IGZvdW5kICIsCiAgICAgICAgICAgICAgICAgICAgICBURVNUX1ZBTFVFLCBwcm9wcy5nZXRQcm9wZXJ0eSgidGVzdC5wcm9wZXJ0eSIpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvQWJzb2x1dGUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0gICAgICAgIHJldHVybiBjcmVhdGVSZWxhdGl2ZUZpbGUoZmlsZW5hbWUpLmdldEFic29sdXRlUGF0aCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBGaWxlIGNyZWF0ZVJlbGF0aXZlRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICAgICAgaWYgKGZpbGVuYW1lLmVxdWFscygiLiIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZWxzZQotICAgICAgICByZXR1cm4gbmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIGZpbGVuYW1lKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmF2YWhUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSmF2YWhUZXN0LmphdmEKaW5kZXggMzJlYzhiYi4uM2ViYTBkYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL0phdmFoVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9KYXZhaFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDcgKzE5LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKQEAgLTI4LDE3ICsyNywxNiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CiAKIHB1YmxpYyBjbGFzcyBKYXZhaFRlc3QgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1hNTCA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qYXZhaC9idWlsZC54bWwiOwotCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChCVUlMRF9YTUwpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvamF2YWgvYnVpbGQueG1sIik7CiAgICAgfQogCiAgICAgQEFmdGVyCkBAIC00OCw3ICs0Niw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb21waWxlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMCIpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMCIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInNpbXBsZS1jb21waWxlIik7CiAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJvcmdfZXhhbXBsZV9Gb28uaCIpCiAgICAgICAgICAgICAgICAgLmV4aXN0cygpKTsKQEAgLTU2LDggKzU0LDkgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBpbGVGaWxlc2V0KCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMCIpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKCIxMCIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QtZmlsZXNldCIpOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dCIpLCAib3JnX2V4YW1wbGVfRm9vLmgiKS5leGlzdHMoKSk7CisgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgib3V0cHV0IiksICJvcmdfZXhhbXBsZV9Gb28uaCIpCisgICAgICAgICAgICAgICAgLmV4aXN0cygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvSnNwY1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Kc3BjVGVzdC5qYXZhCmluZGV4IDM5NTVmNTcuLjA4OTQwM2MgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Kc3BjVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Kc3BjVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzAsMTAgKzMwLDEzIEBACiBpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBUZXN0cyB0aGUgSnNwYyB0YXNrLgpAQCAtNDQsMTQgKzQ3LDE1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBKc3BjVGVzdCB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsLyI7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOwogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAianNwYy54bWwiKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pzcGMueG1sIik7CiAgICAgIH0KIAogICAgIEBUZXN0CkBAIC02MCwxMiArNjQsMTIgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlyb290KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFVyaXJvb3QoKSB7CiAgICAgICAgIGV4ZWN1dGVKc3BDb21waWxlKCJ0ZXN0VXJpcm9vdCIsICJ1cmlyb290X2pzcC5qYXZhIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFhtbCgpIHsKICAgICAgICAgZXhlY3V0ZUpzcENvbXBpbGUoInRlc3RYbWwiLCAieG1sX2pzcC5qYXZhIik7CiAgICAgfQogCkBAIC03Myw3ICs3Nyw3IEBACiAgICAgICogdHJ5IGEga2V5d29yZCBpbiBhIGZpbGUKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXl3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEtleXdvcmQoKSB7CiAgICAgICAgIGV4ZWN1dGVKc3BDb21waWxlKCJ0ZXN0S2V5d29yZCIsICJkZWZhdWx0X2pzcC5qYXZhIik7CiAgICAgfQogCkBAIC04MSwyMyArODUsMjAgQEAKICAgICAgKiB3aGF0IGhhcHBlbnMgdG8gMW52YWxpZC1jbGFzc25hbWUKICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2xhc3NuYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDbGFzc25hbWUoKSB7CiAgICAgICAgIGV4ZWN1dGVKc3BDb21waWxlKCJ0ZXN0SW52YWxpZENsYXNzbmFtZSIsCiAgICAgICAgICAgICAgICAgIl8xbnZhbGlkXzAwMDJkY2xhc3NuYW1lX2pzcC5qYXZhIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9UbGQiKTsKLSAgICAgICAgICAgIGZhaWwoIk5vdCBmb3VuZCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYXZhIHJldHVybmVkOiA5IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RsZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJKYXZhIHJldHVybmVkOiA5Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9UbGQiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RBSnNwRmlsZSgpICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QUpzcEZpbGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm90QUpzcEZpbGUiKTsKICAgICB9CiAKQEAgLTEwNyw3ICsxMDgsNyBAQAogICAgICAqLwogICAgIEBJZ25vcmUoInBpY2tzIHVwIG9uIHRoZSBtaXNzaW5nX3RsZCBmaWxlLCBhbmQgaW5jb3JyZWN0bHkgYmFpbHMiKQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdlYmFwcCgpICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViYXBwKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFdlYmFwcCIpOwogICAgIH0KIApAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SmF2YUZpbGVDcmVhdGVkKFN0cmluZyBmaWxlbmFtZSkgewogICAgICAgICBGaWxlIGZpbGUgPSBnZXRPdXRwdXRGaWxlKGZpbGVuYW1lKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsZSAiICsgZmlsZW5hbWUgKyAiIG5vdCBmb3VuZCIsIGZpbGUuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJmaWxlICIgKyBmaWxlbmFtZSArICIgaXMgZW1wdHkiLCBmaWxlLmxlbmd0aCgpID4gMCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygiZmlsZSAiICsgZmlsZW5hbWUgKyAiIGlzIGVtcHR5IiwgMCwgZmlsZS5sZW5ndGgoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTEsMTAgKzE1MiwxMCBAQAogICAgICAgICBKc3BDb21waWxlckFkYXB0ZXIgYWRhcHRlciA9CiAgICAgICAgICAgICAgICAgSnNwQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5nZXRDb21waWxlcigiamFzcGVyIiwgbnVsbCwgbnVsbCk7CiAgICAgICAgIEpzcE1hbmdsZXIgbWFuZ2xlciA9IGFkYXB0ZXIuY3JlYXRlTWFuZ2xlcigpOwotICAgICAgICBhc3NlcnRUcnVlKG1hbmdsZXIgaW5zdGFuY2VvZiBKc3BOYW1lTWFuZ2xlcik7CisgICAgICAgIGFzc2VydFRoYXQobWFuZ2xlciwgaW5zdGFuY2VPZihKc3BOYW1lTWFuZ2xlci5jbGFzcykpOwogICAgICAgICBhZGFwdGVyID0gSnNwQ29tcGlsZXJBZGFwdGVyRmFjdG9yeS5nZXRDb21waWxlcigiamFzcGVyNDEiLCBudWxsLCBudWxsKTsKICAgICAgICAgbWFuZ2xlciA9IGFkYXB0ZXIuY3JlYXRlTWFuZ2xlcigpOwotICAgICAgICBhc3NlcnRUcnVlKG1hbmdsZXIgaW5zdGFuY2VvZiBKYXNwZXI0MU1hbmdsZXIpOworICAgICAgICBhc3NlcnRUaGF0KG1hbmdsZXIsIGluc3RhbmNlT2YoSmFzcGVyNDFNYW5nbGVyLmNsYXNzKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE4MSw5ICsxODIsOCBAQAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydE1hcHBlZChKc3BNYW5nbGVyIG1hbmdsZXIsIFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGNsYXNzbmFtZSkgewogICAgICAgICBTdHJpbmcgbWFwcGVkbmFtZSA9IG1hbmdsZXIubWFwSnNwVG9KYXZhTmFtZShuZXcgRmlsZShmaWxlbmFtZSkpOwotICAgICAgICBhc3NlcnRUcnVlKGZpbGVuYW1lICsgIiBzaG91bGQgaGF2ZSBtYXBwZWQgdG8gIiArIGNsYXNzbmFtZQotICAgICAgICAgICAgICAgICAgICArICIgYnV0IGluc3RlYWQgbWFwcGVkIHRvICIgKyBtYXBwZWRuYW1lLAotICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUuZXF1YWxzKG1hcHBlZG5hbWUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGVuYW1lICsgIiBzaG91bGQgaGF2ZSBtYXBwZWQgdG8gIiArIGNsYXNzbmFtZQorICAgICAgICAgICAgICAgICsgIiBidXQgaW5zdGVhZCBtYXBwZWQgdG8gIiArIG1hcHBlZG5hbWUsIGNsYXNzbmFtZSwgbWFwcGVkbmFtZSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmF0aXZlMkFzY2lpVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL05hdGl2ZTJBc2NpaVRlc3QuamF2YQppbmRleCAwZWE1ZDliLi4wYTgzOWMzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvTmF0aXZlMkFzY2lpVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9OYXRpdmUyQXNjaWlUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMiwxNSArMzIsMTIgQEAKIAogcHVibGljIGNsYXNzIE5hdGl2ZTJBc2NpaVRlc3QgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1hNTCA9Ci0gICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9uYXRpdmUyYXNjaWkvYnVpbGQueG1sIjsKLQogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoQlVJTERfWE1MKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL25hdGl2ZTJhc2NpaS9idWlsZC54bWwiKTsKICAgICB9CiAKICAgICBAQWZ0ZXIKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUHJvcGVydHlGaWxlVGVzdC5qYXZhCmluZGV4IGZhNmNkODYuLmMxMTY5OTAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Qcm9wZXJ0eUZpbGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1Byb3BlcnR5RmlsZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDExICsyMSwxMSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGU7CiBpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNTgsMTUgKzU4LDE0IEBACiAgICAgICAgICAgICAgICAgdmFsdWVEb2VzTm90R2V0T3ZlcndyaXR0ZW5Qcm9wZXJ0eUZpbGUpOwogICAgIH0KIAotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RpbmdGaWxlKCkgewotICAgICAgICBQcm9wZXJ0eUZpbGUgcHJvcHMgPSBuZXcgUHJvcGVydHlGaWxlKCk7Ci0gICAgICAgIHByb3BzLnNldFByb2plY3QoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CisgICAgICAgIFByb3BlcnR5RmlsZSBwZiA9IG5ldyBQcm9wZXJ0eUZpbGUoKTsKKyAgICAgICAgcGYuc2V0UHJvamVjdChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoInRoaXMtZmlsZS1kb2VzLW5vdC1leGlzdC5wcm9wZXJ0aWVzIik7Ci0gICAgICAgIHByb3BzLnNldEZpbGUoZmlsZSk7CisgICAgICAgIHBmLnNldEZpbGUoZmlsZSk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJQcm9wZXJ0aWVzIGZpbGUgZXhpc3RzIGJlZm9yZSB0ZXN0LiIsIGZpbGUuZXhpc3RzKCkpOwotICAgICAgICBwcm9wcy5leGVjdXRlKCk7CisgICAgICAgIHBmLmV4ZWN1dGUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiUHJvcGVydGllcyBmaWxlIGRvZXMgbm90IGV4aXN0IGFmdGVyIHRlc3QuIiwgZmlsZS5leGlzdHMoKSk7CiAgICAgICAgIGZpbGUuZGVsZXRlKCk7CiAgICAgfQpAQCAtODEsOSArODAsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoRk5BTUUsIGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShGTkFNRV9LRVkpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKExOQU1FLCBiZWZvcmVVcGRhdGUuZ2V0UHJvcGVydHkoTE5BTUVfS0VZKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhFTUFJTCwgYmVmb3JlVXBkYXRlLmdldFByb3BlcnR5KEVNQUlMX0tFWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYmVmb3JlVXBkYXRlLmdldFByb3BlcnR5KFBIT05FX0tFWSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYmVmb3JlVXBkYXRlLmdldFByb3BlcnR5KEFHRV9LRVkpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShEQVRFX0tFWSkpOworICAgICAgICBhc3NlcnROdWxsKGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShQSE9ORV9LRVkpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChiZWZvcmVVcGRhdGUuZ2V0UHJvcGVydHkoQUdFX0tFWSkpOworICAgICAgICBhc3NlcnROdWxsKGJlZm9yZVVwZGF0ZS5nZXRQcm9wZXJ0eShEQVRFX0tFWSkpOwogCiAgICAgICAgIC8vIGFzayBhbnQgdG8gdXBkYXRlIHRoZSBwcm9wZXJ0aWVzLi4uCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ1cGRhdGUtZXhpc3RpbmctcHJvcGVydGllcyIpOwpAQCAtMTE1LDcgKzExNCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlcmNpc2VEZWZhdWx0QW5kSW5jcmVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdEV4ZXJjaXNlRGVmYXVsdEFuZEluY3JlbWVudCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4ZXJjaXNlIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiMyIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImludC53aXRoLmRlZmF1bHQiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImludC53aXRob3V0LmRlZmF1bHQiKSk7CkBAIC0xMzYsMjkgKzEzNSwzMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoIjUiLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJmb28iKSk7CiAgICAgfQogCi0KICAgICBAVGVzdAotICAgIEBJZ25vcmUoIlByZXZpb3VzbHkgY29tbWVudGVkIG91dCIpCiAgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBQcm9wZXJ0eUZpbGUgcGYgPSBuZXcgUHJvcGVydHlGaWxlKCk7CiAgICAgICAgIHBmLnNldFByb2plY3QoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7Ci0gICAgICAgIHBmLnNldEZpbGUobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIHRlc3RQcm9wc0ZpbGVQYXRoKSk7Ci0gICAgICAgIFByb3BlcnR5RmlsZS5FbnRyeSBlbnRyeSA9IHBmLmNyZWF0ZUVudHJ5KCk7CisgICAgICAgIHBmLnNldEZpbGUobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCB0ZXN0UHJvcHNGaWxlUGF0aCkpOwogCisgICAgICAgIGxvbmcgZGVsdGEgPSAxMjNMOworICAgICAgICBQcm9wZXJ0eUZpbGUuRW50cnkgZW50cnkgPSBwZi5jcmVhdGVFbnRyeSgpOwogICAgICAgICBlbnRyeS5zZXRLZXkoImRhdGUiKTsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoIjEyMyIpOworICAgICAgICBlbnRyeS5zZXRWYWx1ZShTdHJpbmcudmFsdWVPZihkZWx0YSkpOworCiAgICAgICAgIFByb3BlcnR5RmlsZS5FbnRyeS5UeXBlIHR5cGUgPSBuZXcgUHJvcGVydHlGaWxlLkVudHJ5LlR5cGUoKTsKICAgICAgICAgdHlwZS5zZXRWYWx1ZSgiZGF0ZSIpOwogICAgICAgICBlbnRyeS5zZXRUeXBlKHR5cGUpOwotCiAgICAgICAgIGVudHJ5LnNldFBhdHRlcm4oInl5eXkvTU0vZGQiKTsKIAogICAgICAgICBQcm9wZXJ0eUZpbGUuRW50cnkuT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG5ldyBQcm9wZXJ0eUZpbGUuRW50cnkuT3BlcmF0aW9uKCk7CiAgICAgICAgIG9wZXJhdGlvbi5zZXRWYWx1ZSgiKyIpOworICAgICAgICBlbnRyeS5zZXRPcGVyYXRpb24ob3BlcmF0aW9uKTsKICAgICAgICAgcGYuZXhlY3V0ZSgpOwogCiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRUZXN0UHJvcGVydGllcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInllZWhhdyIsIHByb3BzLmdldFByb3BlcnR5KCJkYXRlIikpOworICAgICAgICBMb2NhbERhdGUgY3VycmVudERhdGUgPSBMb2NhbERhdGUubm93KCkucGx1c0RheXMoZGVsdGEpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiJWQvJTAyZC8lMDJkIiwgY3VycmVudERhdGUuZ2V0WWVhcigpLCBjdXJyZW50RGF0ZS5nZXRNb250aFZhbHVlKCksCisgICAgICAgICAgICAgICAgY3VycmVudERhdGUuZ2V0RGF5T2ZNb250aCgpKSwgcHJvcHMuZ2V0UHJvcGVydHkoImRhdGUiKSk7CiAgICAgfQogCiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9QdmNzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEKaW5kZXggMjliMjY4NS4uNjI5NDJlZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1B2Y3NUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiBwdWJsaWMgY2xhc3MgUHZjc1Rlc3QgewogCiAgICAgQFJ1bGUKQEAgLTM2LDE0ICszNCwxMiBAQAogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcHZjcy54bWwiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIG1pc3NpbmcgYXJndW1lbnQgInJlcG9zaXRvcnkiCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLSAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICAgICAgZmFpbCgiUmVxdWlyZWQgYXJndW1lbnQgcmVwb3NpdG9yeSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gY2hlY2sgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CkBAIC02NiwxNCArNjIsMTIgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Q1Iik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBub25leGlzdGVudCBkaXJlY3Rvcnkgc3RydWN0dXJlCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOwotICAgICAgICAgICAgZmFpbCgiRmFpbGVkIGV4ZWN1dGluZzogL25ldmVyL2hlYXJkL29mL2EvZGlyZWN0b3J5L3N0cnVjdHVyZS9saWtlL3RoaXMvcGNsaSBsdmYgLXogIiArCi0gICAgICAgICAgICAgICAgICAgICItYXcgLXByLy9jdDRzZXJ2Mi9wdmNzL21vbml0b3IgLy4gRXhjZXB0aW9uOiAvbmV2ZXIvaGVhcmQvb2YvYS9kaXJlY3Rvcnkvc3RydWN0dXJlL2xpa2UvdGhpcy9wY2xpOiBub3QgZm91bmQiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0NiIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JlcGxhY2VSZWdFeHBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVwbGFjZVJlZ0V4cFRlc3QuamF2YQppbmRleCBiN2FiNzQ4Li40Y2QxZjc0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVwbGFjZVJlZ0V4cFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmVwbGFjZVJlZ0V4cFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM5LDI4ICszOSwyMSBAQAogICoKICAqLwogcHVibGljIGNsYXNzIFJlcGxhY2VSZWdFeHBUZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9QQVRIID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsIjsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoUFJPSkVDVF9QQVRIICsgIi9yZXBsYWNlcmVnZXhwLnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvcmVwbGFjZXJlZ2V4cC54bWwiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgUHJvcGVydGllcyBvcmlnaW5hbCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBwcm9wc0ZpbGUgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcHJvcHNGaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSArICIvcmVwbGFjZXJlZ2V4cC5wcm9wZXJ0aWVzIikpOworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBwcm9wc0ZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpICsgIi9yZXBsYWNlcmVnZXhwLnByb3BlcnRpZXMiKSkpIHsKICAgICAgICAgICAgIG9yaWdpbmFsLmxvYWQocHJvcHNGaWxlKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChwcm9wc0ZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3BzRmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHByb3BzRmlsZSA9IG51bGw7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnRFcXVhbHMoIkRlZiIsIG9yaWdpbmFsLmdldCgiT2xkQWJjIikpOwpAQCAtNjgsMTMgKzYxLDkgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RSZXBsYWNlIik7CiAKICAgICAgICAgUHJvcGVydGllcyBhZnRlciA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwcm9wc0ZpbGUgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgInRlc3QucHJvcGVydGllcyIpKTsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gcHJvcHNGaWxlID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksCisgICAgICAgICAgICAgICAgInRlc3QucHJvcGVydGllcyIpKSkgewogICAgICAgICAgICAgYWZ0ZXIubG9hZChwcm9wc0ZpbGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHByb3BzRmlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvcHNGaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnROdWxsKGFmdGVyLmdldCgiT2xkQWJjIikpOwpAQCAtMTA4LDI1ICs5NywyNSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vUHJlc2VydmVMYXN0TW9kaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9QcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhc3RNb2RpZmllZFNldHVwIik7CiAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJ0ZXN0LnR4dCIpOwogICAgICAgICBhc3N1bWVUcnVlKHRlc3RGaWxlLnNldExhc3RNb2RpZmllZCh0ZXN0RmlsZS5sYXN0TW9kaWZpZWQoKQotICAgICAgICAgICAgICAgIC0gKEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDMpKSk7CisgICAgICAgICAgICAgICAgLSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkgKiAzKSk7CiAgICAgICAgIGxvbmcgdHMxID0gdGVzdEZpbGUubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9QcmVzZXJ2ZSIpOwogICAgICAgICBhc3NlcnRUcnVlKHRzMSA8IHRlc3RGaWxlLmxhc3RNb2RpZmllZCgpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2ZUxhc3RNb2RpZmllZCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImxhc3RNb2RpZmllZFNldHVwIik7CiAgICAgICAgIEZpbGUgdGVzdEZpbGUgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJ0ZXN0LnR4dCIpOwogICAgICAgICBhc3N1bWVUcnVlKHRlc3RGaWxlLnNldExhc3RNb2RpZmllZCh0ZXN0RmlsZS5sYXN0TW9kaWZpZWQoKQotICAgICAgICAgICAgICAgIC0gKEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDMpKSk7CisgICAgICAgICAgICAgICAgLSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkuZ2V0RmlsZVRpbWVzdGFtcEdyYW51bGFyaXR5KCkgKiAzKSk7CiAgICAgICAgIGxvbmcgdHMxID0gdGVzdEZpbGUubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0UHJlc2VydmUiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRzMSwgdGVzdEZpbGUubGFzdE1vZGlmaWVkKCkpOwogICAgIH0KIAotfS8vIFJlcGxhY2VSZWdFeHBUZXN0Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9SZWZlcmVuY2VUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9SZWZlcmVuY2VUZXN0LmphdmEKaW5kZXggNDE4MDNkZS4uMGExYzY1NCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JoaW5vUmVmZXJlbmNlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SaGlub1JlZmVyZW5jZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM0LDggKzM0LDcgQEAKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoCi0gICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3NjcmlwdF9yZWZlcmVuY2UueG1sIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHRfcmVmZXJlbmNlLnhtbCIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9TY3JpcHRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUmhpbm9TY3JpcHRUZXN0LmphdmEKaW5kZXggM2NhNDI4ZS4uNjkzYjRiYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JoaW5vU2NyaXB0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9SaGlub1NjcmlwdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEwICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwogCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTM0LDYgKzM2LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQueG1sIik7CkBAIC02NCw0ICs2OSwxNyBAQAogICAgICAgICBhc3NlcnRUcnVlKGluZGV4ID4gLTEpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZVNyY0FuZEVuY29kaW5nKCkgeworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJ1c2VTcmNBbmRFbmNvZGluZy5yZWFkZXIuZW5jb2RpbmciLCAiVVRGLTgiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVzZVNyY0FuZEVuY29kaW5nIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlU3JjQW5kRW5jb2RpbmdGYWlsdXJlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImV4cGVjdGVkIDxlYWN1dGUgW1x1MDBlOV0+IGJ1dCB3YXMgPGVhY3V0ZSBbXHUwMGMzXHUwMGE5XT4iKTsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgidXNlU3JjQW5kRW5jb2RpbmcucmVhZGVyLmVuY29kaW5nIiwgIklTTy04ODU5LTEiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVzZVNyY0FuZEVuY29kaW5nIik7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JwbVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9ScG1UZXN0LmphdmEKaW5kZXggYjU1N2Y0NC4uNzI5MWE5ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1JwbVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvUnBtVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMjkgKzIzLDI3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRXhlY3V0ZVN0cmVhbUhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQ29tbWFuZGxpbmU7CiAKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIHB1YmxpYyBjbGFzcyBScG1UZXN0IHsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFRocm93RXhjZXB0aW9uV2hlblJwbUZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFRocm93RXhjZXB0aW9uV2hlblJwbUZhaWxzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIicgZmFpbGVkIHdpdGggZXhpdCBjb2RlIDIiKTsKICAgICAgICAgUnBtIHJwbSA9IG5ldyBNeVJwbSgpOwogICAgICAgICBycG0uc2V0UHJvamVjdChuZXcgUHJvamVjdCgpKTsKICAgICAgICAgcnBtLnNldEZhaWxPbkVycm9yKHRydWUpOwotICAgICAgICAvLyBleGVjdXRlCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBycG0uZXhlY3V0ZSgpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgdGhyb3duIGEgYnVpbGQgZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiJyBmYWlsZWQgd2l0aCBleGl0IGNvZGUgMiIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcnBtLmV4ZWN1dGUoKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RUaHJvd0V4Y2VwdGlvbldoZW5ScG1GYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RUaHJvd0V4Y2VwdGlvbldoZW5ScG1GYWlscygpIHsKICAgICAgICAgUnBtIHJwbSA9IG5ldyBNeVJwbSgpOwogICAgICAgICBycG0uZXhlY3V0ZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9TY2hlbWFWYWxpZGF0ZVRlc3QuamF2YQppbmRleCA2NDNhYTZlLi43OWRmZWZiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvU2NoZW1hVmFsaWRhdGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1NjaGVtYVZhbGlkYXRlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTQgKzE3LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIC8qKgogICogVGVzdCBzY2hlbWEgdmFsaWRhdGlvbgpAQCAtMzIsMjQgKzMwLDIyIEBACiAKIHB1YmxpYyBjbGFzcyBTY2hlbWFWYWxpZGF0ZVRlc3QgewogCi0gICAgLyoqCi0gICAgICogd2hlcmUgdGFza3MgcnVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iOwotCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAic2NoZW1hdmFsaWRhdGUueG1sIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY2hlbWF2YWxpZGF0ZS54bWwiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiB0ZXN0IHdpdGggbm8gbmFtZXNwYWNlCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9OYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9OYW1lc3BhY2UoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9OYW1lc3BhY2UiKTsKICAgICB9CiAKQEAgLTU3LDcxICs1Myw1MiBAQAogICAgICAqIGFkZCBuYW1lc3BhY2UgYXdhcmVuZXNzLgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5TTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3ROU01hcHBpbmcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TlNNYXBwaW5nIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9FbXB0eVNjaGVtYU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb0VtcHR5U2NoZW1hTmFtZXNwYWNlIik7Ci0gICAgICAgICAgICBmYWlsKCJFbXB0eSBuYW1lc3BhY2UgVVJJIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoU2NoZW1hVmFsaWRhdGUuU2NoZW1hTG9jYXRpb24uRVJST1JfTk9fVVJJLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE5vRW1wdHlTY2hlbWFOYW1lc3BhY2UoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19VUkkpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vRW1wdHlTY2hlbWFOYW1lc3BhY2UiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0VtcHR5U2NoZW1hTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9FbXB0eVNjaGVtYUxvY2F0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJFbXB0eSBzY2hlbWEgbG9jYXRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucyhTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19MT0NBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0VtcHR5U2NoZW1hTG9jYXRpb24oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShTY2hlbWFWYWxpZGF0ZS5TY2hlbWFMb2NhdGlvbi5FUlJPUl9OT19MT0NBVElPTik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9FbXB0eVNjaGVtYUxvY2F0aW9uIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vRmlsZSIpOwotICAgICAgICAgICAgZmFpbCgiTm8gZmlsZSBhdCBmaWxlIGF0dHJpYnV0ZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKFNjaGVtYVZhbGlkYXRlLlNjaGVtYUxvY2F0aW9uLkVSUk9SX05PX0ZJTEUsCi0gICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWxlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoU2NoZW1hVmFsaWRhdGUuU2NoZW1hTG9jYXRpb24uRVJST1JfTk9fRklMRSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9GaWxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Eb3VibGVTY2hlbWFMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb0RvdWJsZVNjaGVtYUxvY2F0aW9uIik7Ci0gICAgICAgICAgICBmYWlsKCJUd28gbG9jYXRpb25zIGZvciBzY2hlbWFzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoU2NoZW1hVmFsaWRhdGUuU2NoZW1hTG9jYXRpb24uRVJST1JfVFdPX0xPQ0FUSU9OUywKLSAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0RvdWJsZVNjaGVtYUxvY2F0aW9uKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoU2NoZW1hVmFsaWRhdGUuU2NoZW1hTG9jYXRpb24uRVJST1JfVFdPX0xPQ0FUSU9OUyk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9Eb3VibGVTY2hlbWFMb2NhdGlvbiIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vRHVwbGljYXRlU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vRHVwbGljYXRlU2NoZW1hIik7Ci0gICAgICAgICAgICBmYWlsKCJkdXBsaWNhdGUgc2NoZW1hcyB3aXRoIGRpZmZlcmVudCB2YWx1ZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucyhTY2hlbWFWYWxpZGF0ZS5FUlJPUl9EVVBMSUNBVEVfU0NIRU1BLAotICAgICAgICAgICAgICAgICAgICBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE5vRHVwbGljYXRlU2NoZW1hKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoU2NoZW1hVmFsaWRhdGUuRVJST1JfRFVQTElDQVRFX1NDSEVNQSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9EdXBsaWNhdGVTY2hlbWEiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNTY2hlbWFzT0soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzU2NoZW1hc09LKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVxdWFsc1NjaGVtYXNPSyIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVzZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZXNldCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlc2V0Iik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1RyYVhMaWFpc29uVGVzdC5qYXZhCmluZGV4IDUyN2UyNjQuLjllYTYwODkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9UcmFYTGlhaXNvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvVHJhWExpYWlzb25UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVOb0V4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0zMiw3ICszNyw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWFNMVExvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogLyoqCkBAIC01OSwxMyArNjMsMTIgQEAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoIm9yZy5hcGFjaGUueGFsYW4ubGliLlJlZGlyZWN0Iik7CiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLSAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVOb0V4Y2VwdGlvbigieGFsYW4gcmVkaXJlY3QgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgiLCBleGMpOworICAgICAgICAgICAgYXNzdW1lTm9FeGNlcHRpb24oInhhbGFuIHJlZGlyZWN0IGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoIiwgZXhjKTsKICAgICAgICAgfQogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlOYW1lID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIlRyYXhGYWN0b3J5IGlzIFhhbGFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhmYWN0b3J5TmFtZSkpOworICAgICAgICAgICAgYXNzdW1lRmFsc2UoIlRyYXhGYWN0b3J5IGlzIFhhbGFuIiwKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiLmVxdWFscyhmYWN0b3J5TmFtZSkpOwogICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXhjKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGMpOwogICAgICAgICB9CkBAIC0xMDYsMTMgKzEwOSwxMiBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcygib3JnLmFwYWNoZS54YWxhbi5saWIuUmVkaXJlY3QiKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4YykgewotICAgICAgICAgICAgQXNzdW1lLmFzc3VtZU5vRXhjZXB0aW9uKCJ4YWxhbiByZWRpcmVjdCBpcyBub3Qgb24gdGhlIGNsYXNzcGF0aCIsIGV4Yyk7CisgICAgICAgICAgICBhc3N1bWVOb0V4Y2VwdGlvbigieGFsYW4gcmVkaXJlY3QgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgiLCBleGMpOwogICAgICAgICB9CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmcgZmFjdG9yeU5hbWUgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUcmF4RmFjdG9yeSBpcyAiICsgZmFjdG9yeU5hbWUgKyAiIGFuZCBub3QgWGFsYW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKGZhY3RvcnlOYW1lKSk7CisgICAgICAgICAgICBhc3N1bWVUcnVlKCJUcmF4RmFjdG9yeSBpcyAiICsgZmFjdG9yeU5hbWUgKyAiIGFuZCBub3QgWGFsYW4iLAorICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCIuZXF1YWxzKGZhY3RvcnlOYW1lKSk7CiAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBleGMpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Yyk7CiAgICAgICAgIH0KQEAgLTE2MSw4ICsxNjMsOCBAQAogICAgICAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCIvdXNlci9sb2NhbC9iaW4iKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgc3lzdGVtaWQgPSBKQVhQVXRpbHMuZ2V0U3lzdGVtSWQoZmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN5c3RlbUlEcyBzaG91bGQgc3RhcnQgYnkgZmlsZTovIiwgc3lzdGVtaWQuc3RhcnRzV2l0aCgiZmlsZTovIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJTeXN0ZW1JRHMgc2hvdWxkIG5vdCBzdGFydCB3aXRoIGZpbGU6Ly8vLyIsICFzeXN0ZW1pZC5zdGFydHNXaXRoKCJmaWxlOi8vLy8iKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlN5c3RlbUlEcyBzaG91bGQgc3RhcnQgYnkgZmlsZTovIiwgc3lzdGVtaWQsIHN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiU3lzdGVtSURzIHNob3VsZCBub3Qgc3RhcnQgd2l0aCBmaWxlOi8vLy8iLCBzeXN0ZW1pZCwgbm90KHN0YXJ0c1dpdGgoImZpbGU6Ly8vLyIpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlKSB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVDYXRhbG9nVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1htbFZhbGlkYXRlQ2F0YWxvZ1Rlc3QuamF2YQppbmRleCAzM2ZhMTg5Li4xODcxMDhiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVDYXRhbG9nVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YbWxWYWxpZGF0ZUNhdGFsb2dUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0zMCwxNyArMzAsMTIgQEAKICAqLwogcHVibGljIGNsYXNzIFhtbFZhbGlkYXRlQ2F0YWxvZ1Rlc3QgewogCi0gICAgLyoqCi0gICAgICogd2hlcmUgdGFza3MgcnVuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tERUZTX0RJUiA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC8iOwotCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAieG1sdmFsaWRhdGUueG1sIik7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWx2YWxpZGF0ZS54bWwiKTsKICAgICB9CiAKIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1htbFZhbGlkYXRlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1htbFZhbGlkYXRlVGVzdC5qYXZhCmluZGV4IDEwOGU3ZDAuLjY1NjU3NmMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9YbWxWYWxpZGF0ZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvWG1sVmFsaWRhdGVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMiwxMCArMjIsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LmludGVybmFsLkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIC8qKgogICogVGVzdHMgdGhlIFhNTFZhbGlkYXRlIG9wdGlvbmFsIHRhc2ssIGJ5IHJ1bm5pbmcgdGFyZ2V0cyBpbiB0aGUgdGVzdCBzY3JpcHQKQEAgLTM3LDI0ICszNCwyMiBAQAogICovCiBwdWJsaWMgY2xhc3MgWG1sVmFsaWRhdGVUZXN0IHsKIAotICAgIC8qKgotICAgICAqIHdoZXJlIHRhc2tzIHJ1bgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLREVGU19ESVIgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvIjsKLQogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoVEFTS0RFRlNfRElSICsgInhtbHZhbGlkYXRlLnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sdmFsaWRhdGUueG1sIik7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogQmFzaWMgaW5saW5lICdkdGQnIGVsZW1lbnQgdGVzdC4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RWYWxpZGF0ZSIpOwogICAgIH0KIApAQCAtNjIsNyArNTcsNyBAQAogICAgICAqIFRlc3QgaW5kaXJlY3QgdmFsaWRhdGlvbi4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REZWVwVmFsaWRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVlcFZhbGlkYXRlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERlZXBWYWxpZGF0ZSIpOwogICAgIH0KIApAQCAtMTA0LDQxICs5OSwyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFRlc3QgeG1sIHNjaGVtYSB2YWxpZGF0aW9uCisgICAgICogVGVzdCB4bWwgc2NoZW1hIHZhbGlkYXRpb24sCisgICAgICogaW1wbGljaXRseSBhc3N1bWUgc2NoZW1hLXN1cHBvcnRpbmcgcGFyc2VyIChKYXZhIDUrKQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFhtbFNjaGVtYUdvb2QoKSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTY2hlbWFHb29kIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgKLSAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IHJlY29nbml6ZSBmZWF0dXJlIGh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIpCi0gICAgICAgICAgICAgICAgICAgIHx8IGUuZ2V0TWVzc2FnZSgpLmVuZHNXaXRoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBzdXBwb3J0IGZlYXR1cmUgaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL3ZhbGlkYXRpb24vc2NoZW1hIikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uKCJwYXJzZXIgZG9lc24ndCBzdXBwb3J0IHNjaGVtYSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2NoZW1hR29vZCIpOwogICAgIH0KKwogICAgIC8qKgotICAgICAqIFRlc3QgeG1sIHNjaGVtYSB2YWxpZGF0aW9uCisgICAgICogVGVzdCB4bWwgc2NoZW1hIHZhbGlkYXRpb24sCisgICAgICogaW1wbGljaXRseSBhc3N1bWUgc2NoZW1hLXN1cHBvcnRpbmcgcGFyc2VyIChKYXZhIDUrKQogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFhtbFNjaGVtYUJhZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2NoZW1hQmFkIik7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdGhyb3cgQnVpbGRFeGNlcHRpb24gYmVjYXVzZSAnQmFkIFNjaGVtYSBWYWxpZGF0aW9uJyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoCi0gICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCByZWNvZ25pemUgZmVhdHVyZSBodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiKQotICAgICAgICAgICAgICAgICAgICB8fCBlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRvZXNuJ3Qgc3VwcG9ydCBmZWF0dXJlIGh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbigicGFyc2VyIGRvZXNuJ3Qgc3VwcG9ydCBzY2hlbWEiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5jb250YWlucygibm90IGEgdmFsaWQgWE1MIGRvY3VtZW50IikpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgibm90IGEgdmFsaWQgWE1MIGRvY3VtZW50Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2NoZW1hQmFkIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTksMzAgKzEzNiwyNyBAQAogICAgICAqCiAgICAgICogQnVnIDExMjc5CiAgICAgICovCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RVdGY4KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RVdGY4Iik7Ci0gICAgICAgICAgICBmYWlsKCJJbnZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZSIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VXRmOCIpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCi0gICAgLy8gVGVzdHMgcHJvcGVydHkgZWxlbWVudCwgdXNpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIGFzIGFuIGV4YW1wbGUuCisgICAgLyoqCisgICAgICogVGVzdHMgcHJvcGVydHkgZWxlbWVudCwgdXNpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIGFzIGFuIGV4YW1wbGUuCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlTY2hlbWFGb3JWYWxpZFhNTCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eS52YWxpZFhNTCIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogVGVzdCBzaG91bGQgZmFpbCBkdWUgdG8gdW5zYXRpc2ZpZWQgc2NoZW1hCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlTY2hlbWFGb3JJbnZhbGlkWE1MKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eS5pbnZhbGlkWE1MIik7Ci0gICAgICAgICAgICBmYWlsKCJYTUwgZmlsZSBkb2VzIG5vdCBzYXRpc2Z5IHNjaGVtYSIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RQcm9wZXJ0eS5pbnZhbGlkWE1MIik7CisgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9Yc2x0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHRUZXN0LmphdmEKaW5kZXggZTc1N2ZhZS4uN2E0OGZmMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL1hzbHRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw3ICsyMyw5IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBUZXN0cyB0aGUge0BsaW5rIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLlhTTFRQcm9jZXNzfSB0YXNrLgpAQCAtMzIsNTMgKzM0LDQ1IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBYc2x0VGVzdCB7CiAKLSAgICAvKioKLSAgICAgKiB3aGVyZSB0YXNrcyBydW4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsLyI7Ci0KICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KFRBU0tERUZTX0RJUiArICJ4c2x0LnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveHNsdC54bWwiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgZHVlIHRvIGxhY2tpbmcgRFRECisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2F0Y2hOb0R0ZCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Q2F0Y2hOb0R0ZCIpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgZmFpbHVyZSIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RDYXRjaE5vRHRkIik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RDYXRhbG9nKCkgewogICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RDYXRhbG9nIik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0UHJvcGVydHkoKSB7CiAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE91dHB1dFByb3BlcnR5Iik7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MV2l0aEVudGl0aWVzSW5Ob25Bc2NpaVBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WE1MV2l0aEVudGl0aWVzSW5Ob25Bc2NpaVBhdGgoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0WE1MV2l0aEVudGl0aWVzSW5Ob25Bc2NpaVBhdGgiKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBjaGVjayB0aGF0IHRoZSBzeXN0ZW0gaWQgZ2V0cyBzZXQgcHJvcGVybHkgb24gc3R5bGVzaGVldHMuCi0gICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3R5bGVTaGVldFdpdGhJbmNsdWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFN0eWxlU2hlZXRXaXRoSW5jbHVkZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTdHlsZVNoZWV0V2l0aEluY2x1ZGUiKTsKLSAgICAgICAgaWYgKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygiamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24iKSkgewotICAgICAgICAgICAgZmFpbCgieHNsOmluY2x1ZGUgd2FzIG5vdCBmb3VuZCIpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRoYXQoInhzbDppbmNsdWRlIHdhcyBub3QgZm91bmQiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgbm90KGNvbnRhaW5zU3RyaW5nKCJqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2RlcGVuZC9EZXBlbmRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFRlc3QuamF2YQppbmRleCAxMTc3YzhhLi44YjI0YjBlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvZGVwZW5kL0RlcGVuZFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDIxICsxOSwyOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5GaWxlVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5KYXZhVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5GaWxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuYm90aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzS2V5OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBUZXN0Y2FzZSBmb3IgdGhlIERlcGVuZCBvcHRpb25hbCB0YXNrLgpAQCAtNDIsMTUgKzQ5LDE1IEBACiBwdWJsaWMgY2xhc3MgRGVwZW5kVGVzdCB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX0ZJTEVTRVQgPSAicmVzdWx0IjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQlVJTERfRklMRQotICAgICAgICA9ICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbCI7Ci0KICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KFRFU1RfQlVJTERfRklMRSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9kZXBlbmQvZGVwZW5kLnhtbCIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjUsMTMgKzcyLDEwIEBACiAgICAgICAgIEZpbGVVdGlsaXRpZXMucm9sbGJhY2tUaW1lc3RhbXBzKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNsYXNzZXMuZGlyIikpLCA1KTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdGRpcmVjdCIpOwotICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBnZXRSZXN1bHRGaWxlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkRlcGVuZCBkaWQgbm90IGxlYXZlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIiwgMywKLSAgICAgICAgICAgIGZpbGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQS5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQS5jbGFzcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBELmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJELmNsYXNzIikpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gZ2V0UmVzdWx0RmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDMsIGZpbGVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQS5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkEuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gRC5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkQuY2xhc3MiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC04NiwxMSArOTAsOSBAQAogICAgICAgICBGaWxlVXRpbGl0aWVzLnJvbGxiYWNrVGltZXN0YW1wcyhuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjbGFzc2VzLmRpciIpKSwgNSk7CiAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RjbG9zdXJlIik7Ci0gICAgICAgIEhhc2h0YWJsZSBmaWxlcyA9IGdldFJlc3VsdEZpbGVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkRlcGVuZCBkaWQgbm90IGxlYXZlIGNvcnJlY3QgbnVtYmVyIG9mIGZpbGVzIiwKLSAgICAgICAgICAgIGZpbGVzLnNpemUoKSA8PSAyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBELmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJELmNsYXNzIikpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gZ2V0UmVzdWx0RmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRGVwZW5kIGRpZCBub3QgbGVhdmUgY29ycmVjdCBudW1iZXIgb2YgZmlsZXMiLCBmaWxlcy5zaXplKCkgPD0gMik7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gRC5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkQuY2xhc3MiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQsMTQgKzEwNiwxMiBAQAogICAgICAgICBGaWxlVXRpbGl0aWVzLnJvbGxiYWNrVGltZXN0YW1wcyhuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJ0ZW1wc3JjLmRpciIpKSwgNSk7CiAgICAgICAgIEZpbGVVdGlsaXRpZXMucm9sbGJhY2tUaW1lc3RhbXBzKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNsYXNzZXMuZGlyIikpLCA1KTsKIAotCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0aW5uZXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDAsCi0gICAgICAgICAgICBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVwZW5kIGRpZCBub3QgbGVhdmUgY29ycmVjdCBudW1iZXIgb2YgZmlsZXMiLCAwLCBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVGVzdCB0aGF0IG11bHRpLWxldmUgaW5uZXIgY2xhc3MgZGVwZW5kZW5jaWVzIHRyaWdnZXIgZGVsZXRpb24gb2YKKyAgICAgKiBUZXN0IHRoYXQgbXVsdGktbGV2ZWwgaW5uZXIgY2xhc3MgZGVwZW5kZW5jaWVzIHRyaWdnZXIgZGVsZXRpb24gb2YKICAgICAgKiB0aGUgb3V0ZXIgY2xhc3MKICAgICAgKi8KICAgICBAVGVzdApAQCAtMTIzLDggKzEyMyw3IEBACiAgICAgICAgIEZpbGVVdGlsaXRpZXMucm9sbGJhY2tUaW1lc3RhbXBzKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImNsYXNzZXMuZGlyIikpLCA1KTsKIAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdGlubmVyaW5uZXIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZXBlbmQgZGlkIG5vdCBsZWF2ZSBjb3JyZWN0IG51bWJlciBvZiBmaWxlcyIsIDAsCi0gICAgICAgICAgICBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVwZW5kIGRpZCBub3QgbGVhdmUgY29ycmVjdCBudW1iZXIgb2YgZmlsZXMiLCAwLCBnZXRSZXN1bHRGaWxlcygpLnNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIsMTIgKzEzMSw5IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Tb3VyY2UoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdG5vc291cmNlIik7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZCBleGNlcHRpb24gZXhwZWN0ZWQ6IE5vIHNvdXJjZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgc2V0IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInNyY2RpciBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Rub3NvdXJjZSIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTQ1LDEyICsxNDEsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5U291cmNlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RlbXB0eXNvdXJjZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIGV4cGVjdGVkOiBObyBzb3VyY2Ugc3BlY2lmaWVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygic3JjZGlyIGF0dHJpYnV0ZSBtdXN0IGJlIG5vbi1lbXB0eSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJzcmNkaXIgYXR0cmlidXRlIG11c3QgYmUgbm9uLWVtcHR5Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0ZW1wdHlzb3VyY2UiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OSwxNCArMTUyLDExIEBACiAgICAgICogQHJldHVybiBhIEhhc2h0YWJsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgaW4gdGhlIHJlc3VsdAogICAgICAqIGZpbGVzZXQKICAgICAgKi8KLSAgICBwcml2YXRlIEhhc2h0YWJsZSBnZXRSZXN1bHRGaWxlcygpIHsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0UmVzdWx0RmlsZXMoKSB7CiAgICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc2Nhbm5lZEZpbGUgOiBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkgewotICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlLCBzY2FubmVkRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVzOworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGZpbGUgLT4gZmlsZSwgZmlsZSAtPiBmaWxlLCAoYSwgYikgLT4gYiwgSGFzaHRhYmxlOjpuZXcpKTsKICAgICB9CiAKIApAQCAtMjAxLDEyICsxOTEsMjEgQEAKICAgICAgICAgRmlsZVV0aWxpdGllcy5yb2xsYmFja1RpbWVzdGFtcHMobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiY2xhc3Nlcy5kaXIiKSksIDUpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0bm9ucHVibGljIik7Ci0gICAgICAgIFN0cmluZyBsb2cgPSBidWlsZFJ1bGUuZ2V0TG9nKCk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJFeHBlY3RlZCB3YXJuaW5nIGFib3V0IEFQcml2YXRlIiwKLSAgICAgICAgICAgICJUaGUgY2xhc3MgQVByaXZhdGUgaW4gZmlsZSIsIGxvZyk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJidXQgaGFzIG5vdCBiZWVuIGRlbGV0ZWQgYmVjYXVzZSBpdHMgc291cmNlIGZpbGUgIgotICAgICAgICAgICAgKyAiY291bGQgbm90IGJlIGRldGVybWluZWQiLAotICAgICAgICAgICAgIlRoZSBjbGFzcyBBUHJpdmF0ZSBpbiBmaWxlIiwgbG9nKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0ZWQgd2FybmluZyBhYm91dCBBUHJpdmF0ZSIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldExvZygpLCBib3RoKGNvbnRhaW5zU3RyaW5nKCJUaGUgY2xhc3MgQVByaXZhdGUgaW4gZmlsZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFuZChjb250YWluc1N0cmluZygiYnV0IGhhcyBub3QgYmVlbiBkZWxldGVkIGJlY2F1c2UgaXRzIHNvdXJjZSBmaWxlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIikpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRoZSBkZXBlbmQgdGFzayB3aGVuIHJ1biBhZ2FpbnN0IGEgcGF0aCBjb250YWluaW5nIGEgbW9kdWxlLWluZm8uY2xhc3MgKEphdmEgOSsgY29uc3RydWN0KQorICAgICAqIGRvZXNuJ3QgcnVuIGludG8gZXJyb3IKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVJbmZvKCkgeworICAgICAgICBmaW5hbCBKYXZhVmVyc2lvbiBhdExlYXN0SmF2YTkgPSBuZXcgSmF2YVZlcnNpb24oKTsKKyAgICAgICAgYXRMZWFzdEphdmE5LnNldEF0TGVhc3QoIjkiKTsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlNraXBwaW5nIHRlc3QgZXhlY3V0aW9uIHNpbmNlIEphdmEgdmVyc2lvbiBpcyBsZXNzZXIgdGhhbiA5IiwgYXRMZWFzdEphdmE5LmV2YWwoKSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0bW9kdWxlaW5mbyIpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2kxOG4vVHJhbnNsYXRlVGVzdC5qYXZhCmluZGV4IDc1YzkxZDQuLjUzMjQ3ZTggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pMThuL1RyYW5zbGF0ZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaTE4bi9UcmFuc2xhdGVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC02OSwyNiArNjksMTcgQEAKICAgICAgICAgYnl0ZVtdIGJ1ZmZlcjEgPSBuZXcgYnl0ZVtCVUZfU0laRV07CiAgICAgICAgIGJ5dGVbXSBidWZmZXIyID0gbmV3IGJ5dGVbQlVGX1NJWkVdOwogCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMxID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpczIgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlYWQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IGZpczEucmVhZChidWZmZXIxKSkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlzMi5yZWFkKGJ1ZmZlcjIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlYWQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcjFbaV0gIT0gYnVmZmVyMltpXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzMSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOworICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMyID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMikpIHsKKyAgICAgICAgICAgIGludCByZWFkID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IGZpczEucmVhZChidWZmZXIxKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmaXMyLnJlYWQoYnVmZmVyMik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcjFbaV0gIT0gYnVmZmVyMltpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBmaXMyLmNsb3NlKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBmaXMxLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlSU9UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VJT1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdhNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlSU9UZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CisKKy8qKgorICogVGVzdHMgSW1hZ2VJT1Rhc2suCisgKgorICogQHNpbmNlICAgICBBbnQgMS4xMC42CisgKi8KK3B1YmxpYyBjbGFzcyBJbWFnZUlPVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFSR0VJTUFHRSA9ICJsYXJnZWltYWdlLmpwZyI7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9pbWFnZWlvLnhtbCIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1RvTG9nKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVjaG9Ub0xvZyIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTY2FsZSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZSIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKKworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksIExBUkdFSU1BR0UpOworICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGNyZWF0ZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgZi5leGlzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlVHJ1ZSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZSIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCBMQVJHRUlNQUdFKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlIiwKKyAgICAgICAgICAgICAgICBmLnNldExhc3RNb2RpZmllZChmLmxhc3RNb2RpZmllZCgpIC0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDIpKTsKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE92ZXJ3cml0ZVRydWUiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJQcm9jZXNzaW5nIEZpbGUiKSk7CisgICAgICAgIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksIExBUkdFSU1BR0UpOworICAgICAgICBsb25nIG92ZXJ3cml0dGVuTGFzdE1vZGlmaWVkID0gZi5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSB3YXMgbm90IG92ZXJ3cml0dGVuLiIsIGxhc3RNb2RpZmllZCA8IG92ZXJ3cml0dGVuTGFzdE1vZGlmaWVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REcmF3T3ZlcndyaXRlVHJ1ZSgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZSIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCBMQVJHRUlNQUdFKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlIiwKKyAgICAgICAgICAgICAgICBmLnNldExhc3RNb2RpZmllZChmLmxhc3RNb2RpZmllZCgpIC0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDIpKTsKKyAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdERyYXdPdmVyd3JpdGVUcnVlIik7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiUHJvY2Vzc2luZyBGaWxlIikpOworICAgICAgICBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCBMQVJHRUlNQUdFKTsKKyAgICAgICAgbG9uZyBvdmVyd3JpdHRlbkxhc3RNb2RpZmllZCA9IGYubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGUgd2FzIG5vdCBvdmVyd3JpdHRlbi4iLCBsYXN0TW9kaWZpZWQgPCBvdmVyd3JpdHRlbkxhc3RNb2RpZmllZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlRmFsc2UoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2ltcGxlU2NhbGUiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJQcm9jZXNzaW5nIEZpbGUiKSk7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgTEFSR0VJTUFHRSk7CisgICAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gZi5sYXN0TW9kaWZpZWQoKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RPdmVyd3JpdGVGYWxzZSIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgTEFSR0VJTUFHRSk7CisgICAgICAgIGxvbmcgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGUgd2FzIG92ZXJ3cml0dGVuLiIsIGxhc3RNb2RpZmllZCwgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNjYWxlV2l0aE1hcHBlcigpIHsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZVdpdGhNYXBwZXIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJQcm9jZXNzaW5nIEZpbGUiKSk7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgInNjYWxlZC0iICsgTEFSR0VJTUFHRSk7CisgICAgICAgIGFzc2VydFRydWUoIkRpZCBub3QgY3JlYXRlICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBmLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbGlwKCkgeworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZsaXAiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0RnVsbExvZygpLCBjb250YWluc1N0cmluZygiRmxpcHBpbmcgYW4gaW1hZ2UiKSk7CisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgTEFSR0VJTUFHRSk7CisgICAgICAgIGFzc2VydFRydWUoIkRpZCBub3QgY3JlYXRlICIgKyBmLmdldEFic29sdXRlUGF0aCgpLCBmLmV4aXN0cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsT25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5zdXBwb3J0ZWQgSW1hZ2UgVHlwZSI7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShtZXNzYWdlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmFpbE9uRXJyb3IiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZyhtZXNzYWdlKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9JbWFnZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9pbWFnZS9JbWFnZVRlc3QuamF2YQppbmRleCA1MzIwNTQxLi5jZWZkNGMwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvSW1hZ2VUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlL0ltYWdlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMjAgKzE4LDI1IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2U7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkphdmFFbnZVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZU5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAotCiAvKioKICAqIFRlc3RzIHRoZSBJbWFnZSB0YXNrLgogICoKQEAgLTQwLDQzICs0NSw1MiBAQAogcHVibGljIGNsYXNzIEltYWdlVGVzdCB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWxlVXRpbHMgRklMRV9VVElMUyA9IEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS0RFRlNfRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2ltYWdlLyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBUkdFSU1BR0UgPSAibGFyZ2VpbWFnZS5qcGciOwogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChUQVNLREVGU19ESVIgKyAiaW1hZ2UueG1sIik7CisgICAgICAgIC8qIEpBSSBkZXBlbmRzIG9uIGludGVybmFsIEFQSSByZW1vdmVkIGluIEphdmEgOSAqLworICAgICAgICBhc3N1bWVGYWxzZShKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvaW1hZ2UvaW1hZ2UueG1sIik7CiAgICAgfQogCiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvVG9Mb2coKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RWNob1RvTG9nIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiUHJvY2Vzc2luZyBGaWxlIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzdW1lTm90TnVsbCgiSlBFRyBjb2RlYyBpcyB1bmF2YWlsYWJsZSBpbiBjbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImpwZWcuY29kZWMuYXZhaWxhYmxlIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTY2FsZSgpeworICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTY2FsZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZSIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIlByb2Nlc3NpbmcgRmlsZSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7Ci0KKyAgICAgICAgYXNzdW1lTm90TnVsbCgiSlBFRyBjb2RlYyBpcyB1bmF2YWlsYWJsZSBpbiBjbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImpwZWcuY29kZWMuYXZhaWxhYmxlIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCBMQVJHRUlNQUdFKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGlkIG5vdCBjcmVhdGUgIiArIGYuZ2V0QWJzb2x1dGVQYXRoKCksIGYuZXhpc3RzKCkpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE92ZXJ3cml0ZVRydWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyd3JpdGVUcnVlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdFNpbXBsZVNjYWxlIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiUHJvY2Vzc2luZyBGaWxlIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzdW1lTm90TnVsbCgiSlBFRyBjb2RlYyBpcyB1bmF2YWlsYWJsZSBpbiBjbGFzc3BhdGgiLAorICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImpwZWcuY29kZWMuYXZhaWxhYmxlIikpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCBMQVJHRUlNQUdFKTsKLSAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSBmaWxlIG1vZGlmaWNhaXRvbiBkYXRlIiwKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlIiwKICAgICAgICAgICAgICAgICBmLnNldExhc3RNb2RpZmllZChmLmxhc3RNb2RpZmllZCgpIC0gRklMRV9VVElMUy5nZXRGaWxlVGltZXN0YW1wR3JhbnVsYXJpdHkoKSAqIDIpKTsKICAgICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE92ZXJ3cml0ZVRydWUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJQcm9jZXNzaW5nIEZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKICAgICAgICAgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgTEFSR0VJTUFHRSk7CiAgICAgICAgIGxvbmcgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOwogICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHdhcyBub3Qgb3ZlcndyaXR0ZW4uIiwgbGFzdE1vZGlmaWVkIDwgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQpOwpAQCAtODUsMjAgKzk5LDI0IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlRmFsc2UoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U2ltcGxlU2NhbGUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJQcm9jZXNzaW5nIEZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3N1bWVOb3ROdWxsKCJKUEVHIGNvZGVjIGlzIHVuYXZhaWxhYmxlIGluIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgianBlZy5jb2RlYy5hdmFpbGFibGUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiUHJvY2Vzc2luZyBGaWxlIikpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksIExBUkdFSU1BR0UpOwogICAgICAgICBsb25nIGxhc3RNb2RpZmllZCA9IGYubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0T3ZlcndyaXRlRmFsc2UiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJQcm9jZXNzaW5nIEZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIlByb2Nlc3NpbmcgRmlsZSIpKTsKICAgICAgICAgZiA9IG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRPdXRwdXREaXIoKSwgTEFSR0VJTUFHRSk7CiAgICAgICAgIGxvbmcgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQgPSBmLmxhc3RNb2RpZmllZCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHdhcyBvdmVyd3JpdHRlbi4iLCBsYXN0TW9kaWZpZWQgPT0gb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbGUgd2FzIG92ZXJ3cml0dGVuLiIsIGxhc3RNb2RpZmllZCwgb3ZlcndyaXR0ZW5MYXN0TW9kaWZpZWQpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNjYWxlV2l0aE1hcHBlcigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RTaW1wbGVTY2FsZVdpdGhNYXBwZXIiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJQcm9jZXNzaW5nIEZpbGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3N1bWVOb3ROdWxsKCJKUEVHIGNvZGVjIGlzIHVuYXZhaWxhYmxlIGluIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgianBlZy5jb2RlYy5hdmFpbGFibGUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiUHJvY2Vzc2luZyBGaWxlIikpOwogICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJzY2FsZWQtIiArIExBUkdFSU1BR0UpOwogICAgICAgICBhc3NlcnRUcnVlKCJEaWQgbm90IGNyZWF0ZSAiICsgZi5nZXRBYnNvbHV0ZVBhdGgoKSwgZi5leGlzdHMoKSk7CiAgICAgfQpAQCAtMTA2LDEzICsxMjQsMTMgQEAKICAgICBAVGVzdAogICAgIEBJZ25vcmUoIlByZXZpb3VzbHkgbmFtZWQgaW4gYSBtYW5uZXIgdG8gcHJldmVudCBleGVjdXRpb24iKQogICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsT25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5hYmxlIHRvIHJlbmRlciBSZW5kZXJlZE9wIGZvciB0aGlzIG9wZXJhdGlvbi4iOworICAgICAgICB0aHJvd24uZXhwZWN0KFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShtZXNzYWdlKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmFpbE9uRXJyb3IiKTsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiVW5hYmxlIHRvIHByb2Nlc3MgaW1hZ2Ugc3RyZWFtIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSl7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJSdW4gdGltZSBleGNlcHRpb24gc2hvdWxkIHNheSAnVW5hYmxlIHRvIHByb2Nlc3MgaW1hZ2Ugc3RyZWFtJy4gOiIKLSAgICAgICAgICAgICAgICAgICAgICAgKyByZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICByZS50b1N0cmluZygpLmNvbnRhaW5zKCJVbmFibGUgdG8gcHJvY2VzcyBpbWFnZSBzdHJlYW0iKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcobWVzc2FnZSkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9KRGVwZW5kVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvSkRlcGVuZFRlc3QuamF2YQppbmRleCAxMzY5MWZjLi5lMTIzMjdlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvamRlcGVuZC9KRGVwZW5kVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL0pEZXBlbmRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMiArMTgsMTUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCiAvKioKICAqIFRlc3RjYXNlIGZvciB0aGUgSkRlcGVuZCBvcHRpb25hbCB0YXNrLgogICoKQEAgLTM1LDggKzM4LDggQEAKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoCi0gICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2pkZXBlbmQvamRlcGVuZC54bWwiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiYnVpbGQudGVzdHMudmFsdWUgbm90IHNldCIsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiYnVpbGQudGVzdHMudmFsdWUiKSk7CisgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9qZGVwZW5kL2pkZXBlbmQueG1sIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NSw4ICs0OCw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2ltcGxlIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJQYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZSIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU1LDcgKzU4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RYbWwoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ4bWwiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCI8RGVwZW5kc1Vwb24+IiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCI8RGVwZW5kc1Vwb24+IikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjUsNyArNjgsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZvcmsoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJmb3JrIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NCw3ICs3OCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ya1htbCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZvcmsteG1sIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiPERlcGVuZHNVcG9uPiIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiPERlcGVuZHNVcG9uPiIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTgzLDcgKzg3LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lb3V0KCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZm9yay10aW1lb3V0Iik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiSkRlcGVuZCBGQUlMRUQgLSBUaW1lZCBvdXQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoIkpEZXBlbmQgRkFJTEVEIC0gVGltZWQgb3V0IikpOwogICAgIH0KIAogCkBAIC05Myw3ICs5Nyw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dE5vdCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImZvcmstdGltZW91dC1ub3QiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJQYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJQYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZSIpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXRjaFRlc3RUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvQmF0Y2hUZXN0VGVzdC5qYXZhCmluZGV4IGE1YWQyZmUuLjZlMzI5Y2EgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9CYXRjaFRlc3RUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0JhdGNoVGVzdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDEwMiArMTksOTcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC5ydW5uZXJzLkVuY2xvc2VkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIC8qKgogICoKICAqIEBhdXRob3IgIE1hcmlhbiBQZXRyYXMKICAqLworQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgQmF0Y2hUZXN0VGVzdCB7CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KG51bGwpOwotICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gdGhlIHBhcmFtIGlzIDxudWxsPiIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vdGhpcyBpcyBhbiBleHBlY3RlZCBleGNlcHRpb24KKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWxsZWdhbEFyZ3VtZW50VGVzdCB7CisKKyAgICAgICAgLy8gcmVxdWlyZXMgSlVuaXQgNC4xMgorICAgICAgICBAUGFyYW1ldGVycyhuYW1lID0gImlsbGVnYWwgYXJndW1lbnQ6IHx7MH18IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG51bGwsICIsIiwgIiAsIiwgIiwgIiwgIiAsICIsCisgICAgICAgICAgICAgICAgICAgICIsYSIsICIgLGEiLCAiICAsYSIsICIgICwgYSIsICIgICxhICAiLCAiICAsYSAgLCIsCisgICAgICAgICAgICAgICAgICAgICJhYiwsY2QiLCAiYWIsICxjZCIsICJhYiwgICxjZCIsICJhYiwgICxjZCwiLCAiLGFiLCAgLGNkLCIsCisgICAgICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgSmF2YSBpZGVudGlmaWVyczogKi8KKyAgICAgICAgICAgICAgICAgICAgIjEiLCAiMWEiLCAiMWFiIiwgIjFhYmMiLCAiMWFiYyBkIiwgIjFhYmMgZGUiLCAiMWFiYyBkZWYiLCAiMWFiYyBkZWYsIiwKKyAgICAgICAgICAgICAgICAgICAgIiwxYWJjIGRlZiIpOwogICAgICAgICB9CiAKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1swXSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nWzBdLCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nWzBdLCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgICIpKTsKKyAgICAgICAgQFBhcmFtZXRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIGFyZ3VtZW50OwogCi0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIiwiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiICwiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiLCAiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiICwgIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIixhIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIiAsYSIpOwotICAgICAgICBjaGVja1BhcnNlQ2F1c2VzSUFFKCIgICxhIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIiAgLCBhIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIiAgLGEgICIpOwotICAgICAgICBjaGVja1BhcnNlQ2F1c2VzSUFFKCIgICxhICAsIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoImFiLCxjZCIpOwotICAgICAgICBjaGVja1BhcnNlQ2F1c2VzSUFFKCJhYiwgLGNkIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoImFiLCAgLGNkIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoImFiLCAgLGNkLCIpOwotICAgICAgICBjaGVja1BhcnNlQ2F1c2VzSUFFKCIsYWIsICAsY2QsIik7Ci0KLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImFiYyIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImFiYyAiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgYWJjIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiIGFiYyAiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMgICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImFiYywiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMsICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImFiYyAsIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiYWJjICwgIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiIGFiYyAgLCIpKTsKLQotICAgICAgICAvKiBsZWdhbCBKYXZhIGlkZW50aWZpZXJzOiAqLwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImEiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImExIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImExIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhJCJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhJCIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYSQxIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImEkMSIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiX2JjIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIl9iYyIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiX19fIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIl9fXyIpKTsKLQotICAgICAgICAvKiBpbGxlZ2FsIEphdmEgaWRlbnRpZmllcnM6ICovCi0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIjEiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiMWEiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiMWFiIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIjFhYmMiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiMWFiYyBkIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIjFhYmMgZGUiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiMWFiYyBkZWYiKTsKLSAgICAgICAgY2hlY2tQYXJzZUNhdXNlc0lBRSgiMWFiYyBkZWYsIik7Ci0gICAgICAgIGNoZWNrUGFyc2VDYXVzZXNJQUUoIiwxYWJjIGRlZiIpOwotCi0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyIsICJkZWYifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiYWJjLGRlZiIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMsZGVmLCIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMsZGVmICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMsIGRlZiIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMsIGRlZiAiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyIsICJkZWYifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiYWJjICxkZWYiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyIsICJkZWYifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiYWJjICxkZWYgIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMiLCAiZGVmIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoImFiYyAsIGRlZiIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCJhYmMgLCBkZWYgIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMiLCAiZGVmIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIiBhYmMsZGVmIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMiLCAiZGVmIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIiBhYmMsZGVmICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgYWJjLCBkZWYiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyIsICJkZWYifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiIGFiYywgZGVmICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgYWJjICxkZWYiKSk7Ci0gICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7ImFiYyIsICJkZWYifSwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgiIGFiYyAsZGVmICIpKTsKLSAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IFN0cmluZ1tdIHsiYWJjIiwgImRlZiJ9LCBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCIgYWJjICwgZGVmIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMiLCAiZGVmIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIiBhYmMgLCBkZWYgIikpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyJhYmMiLCAiZGVmIn0sIEpVbml0VGVzdC5wYXJzZVRlc3RNZXRob2ROYW1lc0xpc3QoIiBhYmMgLCBkZWYgLCIpKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cGVjdGVkIGZhaWx1cmUgd2hlbiB0aGUgcGFyYW1ldGVyIGlzIGlsbGVnYWwKKyAgICAgICAgICovCisgICAgICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KCkgeworICAgICAgICAgICAgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdChhcmd1bWVudCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGFyc2VDYXVzZXNJQUUoU3RyaW5nIHBhcmFtKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBKVW5pdFRlc3QucGFyc2VUZXN0TWV0aG9kTmFtZXNMaXN0KHBhcmFtKTsKLSAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHRoZSBwYXJhbSBpcyBcIiIgKyBwYXJhbSArICciJyk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy90aGlzIGlzIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbgorICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMZWdhbEFyZ3VtZW50VGVzdCB7CisKKyAgICAgICAgQFBhcmFtZXRlcnMobmFtZSA9ICJsZWdhbCBhcmd1bWVudDogfHswfXwiKQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgICAgIHsiIiwgbmV3IFN0cmluZ1swXX0sIHsiICIsIG5ldyBTdHJpbmdbMF19LCB7IiAgIiwgbmV3IFN0cmluZ1swXX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjIiwgbmV3IFN0cmluZ1tdeyJhYmMifX0sIHsiYWJjICIsIG5ldyBTdHJpbmdbXXsiYWJjIn19LAorICAgICAgICAgICAgICAgICAgICB7IiBhYmMiLCBuZXcgU3RyaW5nW117ImFiYyJ9fSwgeyIgYWJjICIsIG5ldyBTdHJpbmdbXXsiYWJjIn19LAorICAgICAgICAgICAgICAgICAgICB7ImFiYyAgIiwgbmV3IFN0cmluZ1tdeyJhYmMifX0sIHsiYWJjLCIsIG5ldyBTdHJpbmdbXXsiYWJjIn19LAorICAgICAgICAgICAgICAgICAgICB7ImFiYywgIiwgbmV3IFN0cmluZ1tdeyJhYmMifX0sIHsiYWJjICwiLCBuZXcgU3RyaW5nW117ImFiYyJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyJhYmMgLCAiLCBuZXcgU3RyaW5nW117ImFiYyJ9fSwgeyIgYWJjICAsIiwgbmV3IFN0cmluZ1tdeyJhYmMifX0sCisgICAgICAgICAgICAgICAgICAgIC8qIGxlZ2FsIEphdmEgaWRlbnRpZmllcnM6ICovCisgICAgICAgICAgICAgICAgICAgIHsiYSIsIG5ldyBTdHJpbmdbXXsiYSJ9fSwgeyJhMSIsIG5ldyBTdHJpbmdbXXsiYTEifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYSQiLCBuZXcgU3RyaW5nW117ImEkIn19LCB7ImEkMSIsIG5ldyBTdHJpbmdbXXsiYSQxIn19LAorICAgICAgICAgICAgICAgICAgICB7Il9iYyIsIG5ldyBTdHJpbmdbXXsiX2JjIn19LCB7Il9fXyIsIG5ldyBTdHJpbmdbXXsiX19fIn19LAorICAgICAgICAgICAgICAgICAgICB7ImFiYyxkZWYiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjLGRlZiwiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjLGRlZiAiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjLCBkZWYiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjLCBkZWYgIiwgbmV3IFN0cmluZ1tdeyJhYmMiLCAiZGVmIn19LAorICAgICAgICAgICAgICAgICAgICB7ImFiYyAsZGVmIiwgbmV3IFN0cmluZ1tdeyJhYmMiLCAiZGVmIn19LAorICAgICAgICAgICAgICAgICAgICB7ImFiYyAsZGVmICIsIG5ldyBTdHJpbmdbXXsiYWJjIiwgImRlZiJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyJhYmMgLCBkZWYiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiYWJjICwgZGVmICIsIG5ldyBTdHJpbmdbXXsiYWJjIiwgImRlZiJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyIgYWJjLGRlZiIsIG5ldyBTdHJpbmdbXXsiYWJjIiwgImRlZiJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyIgYWJjLGRlZiAiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiIGFiYywgZGVmIiwgbmV3IFN0cmluZ1tdeyJhYmMiLCAiZGVmIn19LAorICAgICAgICAgICAgICAgICAgICB7IiBhYmMsIGRlZiAiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiIGFiYyAsZGVmIiwgbmV3IFN0cmluZ1tdeyJhYmMiLCAiZGVmIn19LAorICAgICAgICAgICAgICAgICAgICB7IiBhYmMgLGRlZiAiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICAgICAgICAgIHsiIGFiYyAsIGRlZiIsIG5ldyBTdHJpbmdbXXsiYWJjIiwgImRlZiJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyIgYWJjICwgZGVmICIsIG5ldyBTdHJpbmdbXXsiYWJjIiwgImRlZiJ9fSwKKyAgICAgICAgICAgICAgICAgICAgeyIgYWJjICwgZGVmICwiLCBuZXcgU3RyaW5nW117ImFiYyIsICJkZWYifX0sCisgICAgICAgICAgICB9KTsKICAgICAgICAgfQorCisgICAgICAgIEBQYXJhbWV0ZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBhcmd1bWVudDsKKworICAgICAgICBAUGFyYW1ldGVyKDEpCisgICAgICAgIHB1YmxpYyBTdHJpbmdbXSByZXN1bHQ7CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdCgpIHsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHJlc3VsdCwgSlVuaXRUZXN0LnBhcnNlVGVzdE1ldGhvZE5hbWVzTGlzdChhcmd1bWVudCkpOworICAgICAgIH0KICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9ET01VdGlsVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWxUZXN0LmphdmEKaW5kZXggN2Y5OTZkZi4uODBiYzhjMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWxUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0RPTVV0aWxUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRDbGFzc0xvYWRlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdENsYXNzTG9hZGVyVGVzdC5qYXZhCmluZGV4IDE3NWRmNWYuLjFjNWI2YmEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdENsYXNzTG9hZGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdENsYXNzTG9hZGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVwb3J0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0UmVwb3J0VGVzdC5qYXZhCmluZGV4IGM0NjdlOWEuLjA3OGU4MDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFJlcG9ydFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRSZXBvcnRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw5ICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzLmdldEZpbGVVdGlsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTM1LDcgKzM4LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNjMsOCArNjUsOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZUpVbml0Tm9GcmFtZXMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJyZXBvcnRzMSIpOwotICAgICAgICBhc3NlcnRGYWxzZSgiTm8gZmlsZSBqdW5pdC1ub2ZyYW1lcy5odG1sIGV4cGVjdGVkIiwgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCi0gICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0cmVwb3J0L3Rlc3QvaHRtbC9qdW5pdC1ub2ZyYW1lcy5odG1sIikuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiTm8gZmlsZSBqdW5pdC1ub2ZyYW1lcy5odG1sIGV4cGVjdGVkIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgKKyAgICAgICAgICAgICAgICAianVuaXRyZXBvcnQvdGVzdC9odG1sL2p1bml0LW5vZnJhbWVzLmh0bWwiKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYXNzZXJ0SW5kZXhDcmVhdGVkKCkgewpAQCAtODcsMzQgKzg5LDM0IEBACiAgICAgICAgIGFzc2VydFRydWUoIkNhbid0IHJlYWQgdGhlIHJlcG9ydCBmaWxlLiIsIHJlcG9ydEZpbGUuY2FuUmVhZCgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBzaG91bGRuJ3QgYmUgZW1wdHkuIiwgcmVwb3J0RmlsZS5sZW5ndGgoKSA+IDApOwogICAgICAgICAvLyBjb252ZXJzaW9uIHRvIFVSTCB2aWEgRmlsZVV0aWxzIGxpa2UgaW4gWE1MUmVzdWx0QWdncmVnYXRvciwgbm90IGFzIHN1Z2dlc3RlZCBpbiB0aGUgYnVnIHJlcG9ydAotICAgICAgICBVUkwgcmVwb3J0VXJsID0gbmV3IFVSTChGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCkudG9VUkkocmVwb3J0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotICAgICAgICBJbnB1dFN0cmVhbSByZXBvcnRTdHJlYW0gPSByZXBvcnRVcmwub3BlblN0cmVhbSgpOwotICAgICAgICB0cnkgeworICAgICAgICBVUkwgcmVwb3J0VXJsID0gbmV3IFVSTChnZXRGaWxlVXRpbHMoKS50b1VSSShyZXBvcnRGaWxlLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gcmVwb3J0U3RyZWFtID0gcmVwb3J0VXJsLm9wZW5TdHJlYW0oKSkgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhpcyBzaG91bGRuJ3QgYmUgYW4gZW1wdHkgc3RyZWFtLiIsIHJlcG9ydFN0cmVhbS5hdmFpbGFibGUoKSA+IDApOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmdldEZpbGVVdGlscygpLmNsb3NlKHJlcG9ydFN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlGaWxlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEVtcHR5RmlsZSIpOwogICAgICAgICBhc3NlcnRJbmRleENyZWF0ZWQoKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlJlcXVpcmVkIHRleHQgbm90IGZvdW5kIGluIGxvZyIsIFhNTFJlc3VsdEFnZ3JlZ2F0b3IuV0FSTklOR19FTVBUWV9GSUxFLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXF1aXJlZCB0ZXh0IG5vdCBmb3VuZCBpbiBsb2ciLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoWE1MUmVzdWx0QWdncmVnYXRvci5XQVJOSU5HX0VNUFRZX0ZJTEUpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBsZXRlRmlsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBsZXRlRmlsZSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RJbmNvbXBsZXRlRmlsZSIpOwogICAgICAgICBhc3NlcnRJbmRleENyZWF0ZWQoKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIlJlcXVpcmVkIHRleHQgbm90IGZvdW5kIGluIGxvZyIsIFhNTFJlc3VsdEFnZ3JlZ2F0b3IuV0FSTklOR19JU19QT1NTSUJMWV9DT1JSVVBURUQsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlcXVpcmVkIHRleHQgbm90IGZvdW5kIGluIGxvZyIsIGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZyhYTUxSZXN1bHRBZ2dyZWdhdG9yLldBUk5JTkdfSVNfUE9TU0lCTFlfQ09SUlVQVEVEKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFdyb25nRWxlbWVudCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RXcm9uZ0VsZW1lbnQiKTsKICAgICAgICAgYXNzZXJ0SW5kZXhDcmVhdGVkKCk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJSZXF1aXJlZCB0ZXh0IG5vdCBmb3VuZCBpbiBsb2ciLCBYTUxSZXN1bHRBZ2dyZWdhdG9yLldBUk5JTkdfSU5WQUxJRF9ST09UX0VMRU1FTlQsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlcXVpcmVkIHRleHQgbm90IGZvdW5kIGluIGxvZyIsIGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZyhYTUxSZXN1bHRBZ2dyZWdhdG9yLldBUk5JTkdfSU5WQUxJRF9ST09UX0VMRU1FTlQpKTsKICAgICB9CiAKICAgICAvLyBCdWd6aWxsYSBSZXBvcnQgMzQ5NjMKQEAgLTEyMiwxNCArMTI0LDEzIEBACiAgICAgcHVibGljIHZvaWQgdGVzdFN0YWNrVHJhY2VMaW5lQnJlYWtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0U3RhY2tUcmFjZUxpbmVCcmVha3MiKTsKICAgICAgICAgYXNzZXJ0SW5kZXhDcmVhdGVkKCk7Ci0gICAgICAgIEZpbGVSZWFkZXIgciA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCAiaHRtbC9zYW1wbGVwcm9qZWN0L2NvaW5zLzBfQ29pblRlc3QuaHRtbCIpKTsKKyAgICAgICAgdHJ5IChGaWxlUmVhZGVyIHIgPSBuZXcgRmlsZVJlYWRlcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksCisgICAgICAgICAgICAgICAgImh0bWwvc2FtcGxlcHJvamVjdC9jb2lucy8wX0NvaW5UZXN0Lmh0bWwiKSkpIHsKICAgICAgICAgICAgIFN0cmluZyByZXBvcnQgPSBGaWxlVXRpbHMucmVhZEZ1bGx5KHIpOwotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoIm91dHB1dCBtdXN0IGNvbnRhaW4gPGJyPjpcbiIgKyByZXBvcnQsICJqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I6IERPRUc8YnI+IiwgcmVwb3J0KTsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCIjNTEwNDk6IG91dHB1dCBtdXN0IHRyYW5zbGF0ZSBsaW5lIGJyZWFrczpcbiIgKyByZXBvcnQsICJjdXJbJ2xpbmUuc2VwYXJhdG9yJ10gPSAnXFxyXFxuJzsiLCByZXBvcnQpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHIpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgib3V0cHV0IG11c3QgY29udGFpbiA8YnI+OlxuIiArIHJlcG9ydCwgcmVwb3J0LAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygianVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOiBET0VHPGJyPiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIiM1MTA0OTogb3V0cHV0IG11c3QgdHJhbnNsYXRlIGxpbmUgYnJlYWtzOlxuIiArIHJlcG9ydCwgcmVwb3J0LAorICAgICAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiY3VyWydsaW5lLnNlcGFyYXRvciddID0gJ1xcclxcbic7IikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzksNyArMTgwLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0V2l0aFBhcmFtcyIpOwotICAgICAgICBhc3NlcnRDb250YWlucygia2V5MT12YWx1ZTEsa2V5Mj12YWx1ZTIiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoImtleTE9dmFsdWUxLGtleTI9dmFsdWUyIikpOwogICAgICAgICBjb21tb25JbmRleEZpbGVBc3NlcnRpb25zKCk7CiAgICAgfQogCkBAIC0xODcsOSArMTg4LDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFNlY3VyaXR5TWFuYWdlckFuZFhhbGFuRmFjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICB0cnkgewogICAgICAgICAgICAgU3RyaW5nIGZhY3RvcnlOYW1lID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiVHJheEZhY3RvcnkgaXMgIiArIGZhY3RvcnlOYW1lICsgIiBhbmQgbm90IFhhbGFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhmYWN0b3J5TmFtZSkpOworICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiVHJheEZhY3RvcnkgaXMgIiArIGZhY3RvcnlOYW1lICsgIiBhbmQgbm90IFhhbGFuIiwKKyAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwiLmVxdWFscyhmYWN0b3J5TmFtZSkpOwogICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZXhjKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGFza1Rlc3QuamF2YQppbmRleCA1ZjVkNDRmLi4zMmUyMTc5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUYXNrVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRhc2tUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNywxNCArMTcsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5zdGFydHNXaXRoOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnROb3RDb250YWluczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0zNCw2ICszNiw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIApAQCAtNTEsNyArNTQsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5KYXZhRW52VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5Mb2FkZXJVdGlsczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC05Niw3ICs5OCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRm9ya2VkQ2FwdHVyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkZvcmtlZENhcHR1cmUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjYXB0dXJlIik7CiAgICAgICAgIGFzc2VydE5vUHJpbnQoYnVpbGRSdWxlLmdldExvZygpLCAibG9nIik7CiAgICAgICAgIGFzc2VydE5vUHJpbnQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgImRlYnVnIGxvZyIpOwpAQCAtMTM5LDcgKzE0MSw3IEBACiAgICAgICAgIGlmIChKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfMV81KSkgewogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBDbGFzczw/PiBjbGF6eiA9IENsYXNzLmZvck5hbWUoImp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlciIpOwotICAgICAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVGYWxzZSgiU2tpcHBpbmcgdGVzdCBzaW5jZSBpdCBmYWlscyB3aXRoIEpVbml0IDQiLCBjbGF6eiAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICBhc3N1bWVUcnVlKCJTa2lwcGluZyB0ZXN0IHNpbmNlIGl0IGZhaWxzIHdpdGggSlVuaXQgNCIsIGNsYXp6ID09IG51bGwpOwogICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgLy8gT0ssIHRoaXMgaXMgSlVuaXQzLCBjYW4gcnVuIHRlc3QKICAgICAgICAgICAgIH0KQEAgLTE3OCwyNiArMTgwLDI2IEBACiAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yRmlsZS5leGlzdHMoKSk7CiAgICAgICAgIC8vIHRoZSBwYXNzaW5nIHRlc3QgY2FzZXMKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkEudGVzdDAxIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIxc3QgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAxIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAxIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQi50ZXN0MDUiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjFzdCBydW46IHNob3VsZCBydW4gQi50ZXN0MDUiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjFzdCBydW46IHNob3VsZCBydW4gQi50ZXN0MDUiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJCLnRlc3QwNiIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiMXN0IHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNiIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNiIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkMudGVzdDA3Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIxc3QgcnVuOiBzaG91bGQgcnVuIEMudGVzdDA3IiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEMudGVzdDA3IikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQy50ZXN0MDgiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjFzdCBydW46IHNob3VsZCBydW4gQy50ZXN0MDgiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjFzdCBydW46IHNob3VsZCBydW4gQy50ZXN0MDgiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJDLnRlc3QwOSIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiMXN0IHJ1bjogc2hvdWxkIHJ1biBDLnRlc3QwOSIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBDLnRlc3QwOSIpKTsKICAgICAgICAgLy8gdGhlIGZhaWxpbmcgdGVzdCBjYXNlcwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQS50ZXN0MDIiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjFzdCBydW46IHNob3VsZCBydW4gQS50ZXN0MDIiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjFzdCBydW46IHNob3VsZCBydW4gQS50ZXN0MDIiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJBLnRlc3QwMyIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiMXN0IHJ1bjogc2hvdWxkIHJ1biBBLnRlc3QwMyIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygiMXN0IHJ1bjogc2hvdWxkIHJ1biBBLnRlc3QwMyIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkIudGVzdDA0Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIxc3QgcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIxc3QgcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiRC50ZXN0MTAiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjFzdCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjFzdCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiKSk7CiAKIAogICAgICAgICAvLyAybmQganVuaXQgcnVuOiBzaG91bGQgZG8gb25seSBmYWlsaW5nIHRlc3RzCkBAIC0yMDcsMjYgKzIwOSwyNiBAQAogICAgICAgICAgICAgICAgICAgIGNvbGxlY3RvckZpbGUuZXhpc3RzKCkpOwogICAgICAgICAvLyB0aGUgcGFzc2luZyB0ZXN0IGNhc2VzCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJBLnRlc3QwMSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQS50ZXN0MDEiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwMSIpKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJCLnRlc3QwNSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQS50ZXN0MDUiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwNSIpKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJCLnRlc3QwNiIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQi50ZXN0MDYiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBCLnRlc3QwNiIpKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJDLnRlc3QwNyIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQy50ZXN0MDciLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwNyIpKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJDLnRlc3QwOCIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQy50ZXN0MDgiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwOCIpKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJDLnRlc3QwOSIpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIG5vdCBydW4gQy50ZXN0MDkiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgbm90IHJ1biBDLnRlc3QwOSIpKSk7CiAgICAgICAgIC8vIHRoZSBmYWlsaW5nIHRlc3QgY2FzZXMKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkEudGVzdDAyIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIybmQgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAyIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAyIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQS50ZXN0MDMiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjJuZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDMiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjJuZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDMiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJCLnRlc3QwNCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiMm5kIHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNCIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygiMm5kIHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNCIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkQudGVzdDEwIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIybmQgcnVuOiBzaG91bGQgcnVuIEQudGVzdDEwIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIybmQgcnVuOiBzaG91bGQgcnVuIEQudGVzdDEwIikpOwogCiAKICAgICAgICAgLy8gImZpeCIgZXJyb3JzIGluIGNsYXNzIEEKQEAgLTIzOCwxMyArMjQwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgKyAiJyBzaG91bGQgZXhpc3QgYWZ0ZXIgdGhlIDNyZCBydW4uIiwKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3JGaWxlLmV4aXN0cygpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkEudGVzdDAyIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIzcmQgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAyIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIzcmQgcnVuOiBzaG91bGQgcnVuIEEudGVzdDAyIikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQS50ZXN0MDMiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjNyZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDMiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjNyZCBydW46IHNob3VsZCBydW4gQS50ZXN0MDMiKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJCLnRlc3QwNCIpOwotICAgICAgICBhc3NlcnRDb250YWlucygiM3JkIHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNCIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygiM3JkIHJ1bjogc2hvdWxkIHJ1biBCLnRlc3QwNCIpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkQudGVzdDEwIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCIzcmQgcnVuOiBzaG91bGQgcnVuIEQudGVzdDEwIiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCIzcmQgcnVuOiBzaG91bGQgcnVuIEQudGVzdDEwIikpOwogCiAKICAgICAgICAgLy8gNHJkIHJ1bjogdHdvIHJ1bm5pbmcgdGVzdHMgd2l0aCBlcnJvcnMKQEAgLTI1MiwxMyArMjU0LDE1IEBACiAgICAgICAgIGFzc2VydFRydWUoIlRoZSBjb2xsZWN0b3IgZmlsZSAnIiArIGNvbGxlY3RvckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkKICAgICAgICAgICAgICAgICAgICArICInIHNob3VsZCBleGlzdCBhZnRlciB0aGUgNHRoIHJ1bi4iLAogICAgICAgICAgICAgICAgICAgIGNvbGxlY3RvckZpbGUuZXhpc3RzKCkpOwotICAgICAgICAvL1RPRE86IHRoZXNlIHR3byBzdGF0ZW1lbnRzIGZhaWwKLSAgICAgICAgLy9idWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiQS50ZXN0MDIiKTthc3NlcnROb3RDb250YWlucygiNHRoIHJ1bjogc2hvdWxkIG5vdCBydW4gQS50ZXN0MDIiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOwotICAgICAgICAvL2J1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJBLnRlc3QwMyIpO2Fzc2VydE5vdENvbnRhaW5zKCI0dGggcnVuOiBzaG91bGQgbm90IHJ1biBBLnRlc3QwMyIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIC8vVE9ETzogdGhlc2Ugc3RhdGVtZW50cyBmYWlsCisgICAgICAgIC8vYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkEudGVzdDAyIik7CisgICAgICAgIC8vYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIG5vdChjb250YWluc1N0cmluZygiNHRoIHJ1bjogc2hvdWxkIG5vdCBydW4gQS50ZXN0MDIiKSkpOworICAgICAgICAvL2J1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJBLnRlc3QwMyIpOworICAgICAgICAvL2Fzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBub3QoY29udGFpbnNTdHJpbmcoIjR0aCBydW46IHNob3VsZCBub3QgcnVuIEEudGVzdDAzIikpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIkIudGVzdDA0Iik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCI0dGggcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IiwgYnVpbGRSdWxlLmdldE91dHB1dCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0T3V0cHV0KCksIGNvbnRhaW5zU3RyaW5nKCI0dGggcnVuOiBzaG91bGQgcnVuIEIudGVzdDA0IikpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiRC50ZXN0MTAiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoIjR0aCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgY29udGFpbnNTdHJpbmcoIjR0aCBydW46IHNob3VsZCBydW4gRC50ZXN0MTAiKSk7CiAKICAgICB9CiAKQEAgLTI3MSwxNiArMjc1LDE2IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lQXNzZXJ0c05vRm9yaygpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RNdWx0aWxpbmVBc3NlcnRzTm9Gb3JrIik7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCJtZXNzYWdlZCB1cCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCJjcmFzaGVkKSIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBub3QoY29udGFpbnNTdHJpbmcoIm1lc3NhZ2VkIHVwIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIG5vdChjb250YWluc1N0cmluZygiY3Jhc2hlZCkiKSkpOwogICAgIH0KIAogICAgIC8vIEJ1Z3ppbGxhIElzc3VlIDQ1NDExCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lQXNzZXJ0c0ZvcmsoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TXVsdGlsaW5lQXNzZXJ0c0ZvcmsiKTsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMoIm1lc3NhZ2VkIHVwIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMoImNyYXNoZWQpIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIG5vdChjb250YWluc1N0cmluZygibWVzc2FnZWQgdXAiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJjcmFzaGVkKSIpKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlc3VsdEZpbGVzRXhpc3QoU3RyaW5nIHRhcmdldCwgU3RyaW5nIGV4dGVuc2lvbikgewpAQCAtMzAwLDQ2ICszMDQsMzcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm9QcmludChTdHJpbmcgcmVzdWx0LCBTdHJpbmcgd2hlcmUpIHsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMod2hlcmUgKyAiICciICsgcmVzdWx0ICsgIicgbXVzdCBub3QgY29udGFpbiBwcmludCBzdGF0ZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICJwcmludCB0byBTeXN0ZW0uIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VGhhdCh3aGVyZSArICIgJyIgKyByZXN1bHQgKyAiJyBtdXN0IG5vdCBjb250YWluIHByaW50IHN0YXRlbWVudCIsCisgICAgICAgICAgICAgICAgcmVzdWx0LCBub3QoY29udGFpbnNTdHJpbmcoInByaW50IHRvIFN5c3RlbS4iKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlUmVhZGVyIGlubmVyID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rsb2cudHh0IikpOwotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5uZXIpOwotICAgICAgICB0cnkgeworICAgICAgICBGaWxlUmVhZGVyIGlubmVyID0gbmV3IEZpbGVSZWFkZXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCAidGVzdGxvZy50eHQiKSk7CisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlubmVyKSkgewogICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGVzdHN1aXRlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5QcmludGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGVzdHN1aXRlOiBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC5QcmludGVyIiwgbGluZSk7CiAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGxpbmUpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsaW5lLnN0YXJ0c1dpdGgoIlRlc3RzIHJ1bjogMSwgRmFpbHVyZXM6IDAsIEVycm9yczogMCwgU2tpcHBlZDogMCwgVGltZSBlbGFwc2VkOiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobGluZSwgc3RhcnRzV2l0aCgiVGVzdHMgcnVuOiAxLCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBTa2lwcGVkOiAwLCBUaW1lIGVsYXBzZWQ6IikpOwogICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIE91dHB1dCAtLS0tLS0tLS0tLS0tLS0iLCBsaW5lKTsKICAgICAgICAgICAgIGFzc2VydFByaW50KHJlYWRlci5yZWFkTGluZSgpLCAic3RhdGljIiwgIm91dCIpOwogICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJjb25zdHJ1Y3RvciIsICJvdXQiKTsKICAgICAgICAgICAgIGFzc2VydFByaW50KHJlYWRlci5yZWFkTGluZSgpLCAibWV0aG9kIiwgIm91dCIpOwogICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLSIsIGxpbmUpOwogICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIFN0YW5kYXJkIEVycm9yIC0tLS0tLS0tLS0tLS0tLS0tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiLS0tLS0tLS0tLS0tLSBTdGFuZGFyZCBFcnJvciAtLS0tLS0tLS0tLS0tLS0tLSIsIGxpbmUpOwogICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJzdGF0aWMiLCAiZXJyIik7CiAgICAgICAgICAgICBhc3NlcnRQcmludChyZWFkZXIucmVhZExpbmUoKSwgImNvbnN0cnVjdG9yIiwgImVyciIpOwogICAgICAgICAgICAgYXNzZXJ0UHJpbnQocmVhZGVyLnJlYWRMaW5lKCksICJtZXRob2QiLCAiZXJyIik7CiAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCItLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tIiwgbGluZSk7CiAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGxpbmUpOwogICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChsaW5lKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobGluZS5zdGFydHNXaXRoKCJUZXN0Y2FzZTogdGVzdE5vQ3Jhc2ggdG9vayAiKSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpbm5lci5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChsaW5lLCBzdGFydHNXaXRoKCJUZXN0Y2FzZTogdGVzdE5vQ3Jhc2ggdG9vayAiKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4NCwxMiArMzc5LDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdE1ldGhvZHMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGVzdE1ldGhvZHMiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb25UZXN0c1NraXBwZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uVGVzdHNTa2lwcGVkKCkgewogCiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Tm9uVGVzdHMiKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIlRlc3QgcmVzdWx0IHNob3VsZCBub3QgZXhpc3QgYXMgdGVzdCB3YXMgc2tpcHBlZCAtIFRFU1Qtb3JnLmV4YW1wbGUuanVuaXQuTm9uVGVzdE1pc3NlZC54bWwiLApAQCAtNDk2LDcgKzQ5MSw3IEBACiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vY2tQcm9jTGF1bmNoZXIuY21kKTsKICAgICAgICAgICAgIFN0cmluZyByZXNDcCA9IG51bGw7CiAgICAgICAgICAgICBTdHJpbmcgcmVzTXAgPSBudWxsOwotICAgICAgICAgICAgU2V0PFN0cmluZz4gcmVzRXhwb3J0cyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IHJlc0V4cG9ydHMgPSBuZXcgVHJlZVNldDw+KCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vY2tQcm9jTGF1bmNoZXIuY21kLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKCItY2xhc3NwYXRoIi5lcXVhbHMobW9ja1Byb2NMYXVuY2hlci5jbWRbaV0pKSB7IC8vTk9JMThOCiAgICAgICAgICAgICAgICAgICAgIHJlc0NwID0gbW9ja1Byb2NMYXVuY2hlci5jbWRbKytpXTsKQEAgLTU1Myw3ICs1NDgsNyBAQAogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtb2NrUHJvY0xhdW5jaGVyLmNtZCk7CiAgICAgICAgICAgICBTdHJpbmcgcmVzQ3AgPSBudWxsOwogICAgICAgICAgICAgU3RyaW5nIHJlc01wID0gbnVsbDsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHJlc0V4cG9ydHMgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiByZXNFeHBvcnRzID0gbmV3IFRyZWVTZXQ8PigpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtb2NrUHJvY0xhdW5jaGVyLmNtZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgIGlmICgiLWNsYXNzcGF0aCIuZXF1YWxzKG1vY2tQcm9jTGF1bmNoZXIuY21kW2ldKSkgeyAvL05PSTE4TgogICAgICAgICAgICAgICAgICAgICByZXNDcCA9IG1vY2tQcm9jTGF1bmNoZXIuY21kWysraV07CkBAIC01OTAsMjkgKzU4NSwyNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrRHVwbGljYXRlQW50SmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrRHVwbGljYXRlQW50SmFyKCkgewogICAgICAgICBzZXR1cENoZWNrRHVwbGljYXRlVGVzdCgpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENoZWNrRm9ya2VkUGF0aCIpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RpbmcgdGhlIHdhcm5pbmcgYWJvdXQgdGhlIGR1cGxpY2F0ZSBhbnQgamFyIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIldBUk5JTkc6IG11bHRpcGxlIHZlcnNpb25zIG9mIGFudCBkZXRlY3RlZCBpbiBwYXRoIGZvciBqdW5pdCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0aW5nIHRoZSB3YXJuaW5nIGFib3V0IHRoZSBkdXBsaWNhdGUgYW50IGphciIsIGJ1aWxkUnVsZS5nZXRMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiV0FSTklORzogbXVsdGlwbGUgdmVyc2lvbnMgb2YgYW50IGRldGVjdGVkIGluIHBhdGggZm9yIGp1bml0IikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENoZWNrTm9uRHVwbGljYXRlQW50SmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrTm9uRHVwbGljYXRlQW50SmFyKCkgewogICAgICAgICBzZXR1cENoZWNrRHVwbGljYXRlVGVzdCgpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJpbmNsdWRlYW50cnVudGltZSIsICJubyIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdENoZWNrRm9ya2VkUGF0aCIpOwotICAgICAgICBhc3NlcnRGYWxzZSgiVW5leHBlY3RlZCB3YXJuaW5nIGFib3V0IHRoZSBkdXBsaWNhdGUgYW50IGphciIsCi0gICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldExvZygpLmNvbnRhaW5zKCJXQVJOSU5HOiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhbnQgZGV0ZWN0ZWQgaW4gcGF0aCBmb3IganVuaXQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgd2FybmluZyBhYm91dCB0aGUgZHVwbGljYXRlIGFudCBqYXIiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgbm90KGNvbnRhaW5zU3RyaW5nKCJXQVJOSU5HOiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBhbnQgZGV0ZWN0ZWQgaW4gcGF0aCBmb3IganVuaXQiKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkZWxldGUoRmlsZSBmKSB7CiAgICAgICAgIGlmIChmLmlzRGlyZWN0b3J5KCkpIHsKICAgICAgICAgICAgIGZpbmFsIEZpbGVbXSBjbGRzID0gZi5saXN0RmlsZXMoKTsKICAgICAgICAgICAgIGlmIChjbGRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEZpbGUgY2xkIDogY2xkcykgewotICAgICAgICAgICAgICAgICAgICBkZWxldGUoY2xkKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShjbGRzKS5mb3JFYWNoKHRoaXM6OmRlbGV0ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZi5kZWxldGUoKTsKQEAgLTYyMyw4ICs2MTYsNyBAQAogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUHJvY2VzcyBleGVjKFByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gY21kLCBTdHJpbmdbXSBlbnYsIEZpbGUgd29ya2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHRoaXMuY21kID0gbmV3IFN0cmluZ1tjbWQubGVuZ3RoXTsKLSAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY21kLCAwLCB0aGlzLmNtZCwgMCwgY21kLmxlbmd0aCk7CisgICAgICAgICAgICB0aGlzLmNtZCA9IEFycmF5cy5jb3B5T2YoY21kLCBjbWQubGVuZ3RoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgTW9ja1Byb2Nlc3MoKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0TGlzdGVuZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0TGlzdGVuZXJUZXN0LmphdmEKaW5kZXggYTQ3OThlZi4uMzg2YWFlOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdExpc3RlbmVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RMaXN0ZW5lclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDggKzE4LDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnROb3RDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNDgsNTUgKzQ5LDU1IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxMb2dPdXRwdXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImVuYWJsZUV2ZW50cyIsICJ0cnVlIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KFBBU1NfVEVTVF9UQVJHRVQpOwotICAgICAgICBhc3NlcnRDb250YWlucygiZXhwZWN0aW5nIGZ1bGwgbG9nIHRvIGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLAotICAgICAgICAgICAgICAgIEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZXhwZWN0aW5nIGZ1bGwgbG9nIHRvIGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Mb2dPdXRwdXQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImVuYWJsZUV2ZW50cyIsICJ0cnVlIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KFBBU1NfVEVTVF9UQVJHRVQpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygiZXhwZWN0aW5nIGxvZyB0byBub3QgaGF2ZSBCdWlsZExpc3RlbmVyIGV2ZW50cyIsCi0gICAgICAgICAgICAgICAgSlVuaXRUYXNrLlRFU1RMSVNURU5FUl9QUkVGSVgsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoImV4cGVjdGluZyBsb2cgdG8gbm90IGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLCBidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgbm90KGNvbnRhaW5zU3RyaW5nKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYKSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRlc3RDb3VudEZpcmVkKCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJlbmFibGVFdmVudHMiLCAidHJ1ZSIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImV4cGVjdGluZyB0ZXN0IGNvdW50IG1lc3NhZ2UiLCBKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWAotICAgICAgICAgICAgICAgICsgInRlc3RzIHRvIHJ1bjogIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoImV4cGVjdGluZyB0ZXN0IGNvdW50IG1lc3NhZ2UiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgInRlc3RzIHRvIHJ1bjogIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0VGVzdEZpcmVkKCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJlbmFibGVFdmVudHMiLCAidHJ1ZSIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImV4cGVjdGluZyB0ZXN0IHN0YXJ0ZWQgbWVzc2FnZSIsIEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYCi0gICAgICAgICAgICAgICAgKyAic3RhcnRUZXN0KCIgKyBQQVNTX1RFU1QgKyAiKSIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJleHBlY3RpbmcgdGVzdCBzdGFydGVkIG1lc3NhZ2UiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgInN0YXJ0VGVzdCgiICsgUEFTU19URVNUICsgIikiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kVGVzdEZpcmVkKCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJlbmFibGVFdmVudHMiLCAidHJ1ZSIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImV4cGVjdGluZyB0ZXN0IGVuZGVkIG1lc3NhZ2UiLCBKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWAotICAgICAgICAgICAgICAgICsgImVuZFRlc3QoIiArIFBBU1NfVEVTVCArICIpIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoImV4cGVjdGluZyB0ZXN0IGVuZGVkIG1lc3NhZ2UiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYICsgImVuZFRlc3QoIiArIFBBU1NfVEVTVCArICIpIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vRnVsbExvZ091dHB1dEJ5RGVmYXVsdCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoUEFTU19URVNUX1RBUkdFVCk7Ci0gICAgICAgIGFzc2VydE5vdENvbnRhaW5zKCJleHBlY3RpbmcgZnVsbCBsb2cgdG8gbm90IGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLAotICAgICAgICAgICAgICAgIEpVbml0VGFzay5URVNUTElTVEVORVJfUFJFRklYLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZXhwZWN0aW5nIGZ1bGwgbG9nIHRvIG5vdCBoYXZlIEJ1aWxkTGlzdGVuZXIgZXZlbnRzIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwKKyAgICAgICAgICAgICAgICBub3QoY29udGFpbnNTdHJpbmcoSlVuaXRUYXNrLlRFU1RMSVNURU5FUl9QUkVGSVgpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbExvZ091dHB1dE1hZ2ljUHJvcGVydHkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoSlVuaXRUYXNrLkVOQUJMRV9URVNUTElTVEVORVJfRVZFTlRTLCAidHJ1ZSIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoImV4cGVjdGluZyBmdWxsIGxvZyB0byBoYXZlIEJ1aWxkTGlzdGVuZXIgZXZlbnRzIiwKLSAgICAgICAgICAgICAgICBKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoImV4cGVjdGluZyBmdWxsIGxvZyB0byBoYXZlIEJ1aWxkTGlzdGVuZXIgZXZlbnRzIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZyhKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMDQsOCArMTA1LDggQEAKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eShKVW5pdFRhc2suRU5BQkxFX1RFU1RMSVNURU5FUl9FVkVOVFMsICJmYWxzZSIpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnNldFByb3BlcnR5KCJlbmFibGVFdmVudHMiLCAidHJ1ZSIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldChQQVNTX1RFU1RfVEFSR0VUKTsKLSAgICAgICAgYXNzZXJ0Tm90Q29udGFpbnMoImV4cGVjdGluZyBmdWxsIGxvZyB0byBub3QgaGF2ZSBCdWlsZExpc3RlbmVyIGV2ZW50cyIsCi0gICAgICAgICAgICAgICAgSlVuaXRUYXNrLlRFU1RMSVNURU5FUl9QUkVGSVgsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJleHBlY3RpbmcgZnVsbCBsb2cgdG8gbm90IGhhdmUgQnVpbGRMaXN0ZW5lciBldmVudHMiLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLAorICAgICAgICAgICAgICAgIG5vdChjb250YWluc1N0cmluZyhKVW5pdFRhc2suVEVTVExJU1RFTkVSX1BSRUZJWCkpKTsKICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRUZXN0UnVubmVyVGVzdC5qYXZhCmluZGV4IGRlZGU3MGQuLmFkMjU0MjUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFRlc3RSdW5uZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VGVzdFJ1bm5lclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDIwICsxNywyMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CiBpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgogICogU21hbGwgdGVzdGNhc2UgZm9yIHRoZSBydW5uZXIsIHRlc3RzIGFyZSB2ZXJ5IHZlcnkgdmVyeSBiYXNpY3MuCkBAIC01NCw3ICs1Niw3IEBACiAgICAgICAgIHJ1bm5lci5ydW4oKTsKICAgICAgICAgU3RyaW5nIGVycm9yID0gcnVubmVyLmdldEZvcm1hdHRlcigpLmdldEVycm9yKCk7CiAgICAgICAgIC8vIG1pZ2h0IGJlIEZBSUxVUkVTIG9yIEVSUk9SUyBkZXBlbmRpbmcgb24gSlVuaXQgdmVyc2lvbj8KLSAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciwgcnVubmVyLmdldFJldENvZGUoKSAhPSBKVW5pdFRlc3RSdW5uZXIuU1VDQ0VTUyk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhlcnJvciwgSlVuaXRUZXN0UnVubmVyLlNVQ0NFU1MsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOwogICAgIH0KIAogICAgIC8vIGNoZWNrIHRoYXQgaGF2aW5nIG5vIHN1aXRlIGdlbmVyYXRlcyBubyBlcnJvcnMKQEAgLTgwLDcgKzgyLDcgQEAKICAgICAgICAgcnVubmVyLnJ1bigpOwogICAgICAgICBTdHJpbmcgZXJyb3IgPSBydW5uZXIuZ2V0Rm9ybWF0dGVyKCkuZ2V0RXJyb3IoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGVycm9yLCBKVW5pdFRlc3RSdW5uZXIuRVJST1JTLCBydW5uZXIuZ2V0UmV0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlcnJvciwgZXJyb3IuY29udGFpbnMoInRocm93biBvbiBwdXJwb3NlIikpOworICAgICAgICBhc3NlcnRUaGF0KGVycm9yLCBlcnJvciwgY29udGFpbnNTdHJpbmcoInRocm93biBvbiBwdXJwb3NlIikpOwogICAgIH0KIAogICAgIC8vIGNoZWNrIHRoYXQgc29tZXRoaW5nIHdoaWNoIGlzIG5vdCBhIHRlc3RjYXNlIGdlbmVyYXRlcyBubyBlcnJvcnMKQEAgLTkxLDEwICs5Myw4IEBACiAgICAgICAgIHJ1bm5lci5ydW4oKTsKICAgICAgICAgLy8gT24ganVuaXQzIHRoaXMgaXMgYSBGQUlMVVJFLCBvbiBqdW5pdDQgdGhpcyBpcyBhbiBFUlJPUgogICAgICAgICBpbnQgcmV0ID0gcnVubmVyLmdldFJldENvZGUoKTsKLQotICAgICAgICBpZiAocmV0ICE9IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyAmJiByZXQgIT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUykgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCByZXN1bHQgIiArIHJldCArICIgZnJvbSBqdW5pdCBydW5uZXIiKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIHJlc3VsdCAiICsgcmV0ICsgIiBmcm9tIGp1bml0IHJ1bm5lciIsCisgICAgICAgICAgICAgICAgcmV0ID09IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyB8fCByZXQgPT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUyk7CiAgICAgICAgIC8vIEpVbml0MyB0ZXN0CiAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKHJ1bm5lci5nZXRGb3JtYXR0ZXIoKS5nZXRFcnJvcigpLCBKVW5pdFRlc3RSdW5uZXIuRkFJTFVSRVMsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOwogICAgIH0KQEAgLTEyMSwxMSArMTIxLDEwIEBACiAgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpY0luaXRpYWxpemVyRXJyb3JUZXN0Q2FzZSgpIHsKICAgICAgICAgVGVzdFJ1bm5lciBydW5uZXIgPSBjcmVhdGVSdW5uZXIoU3RhdGljSW5pdGlhbGl6ZXJFcnJvclRlc3RDYXNlLmNsYXNzKTsKICAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICAvLyBPbiBqdW5pdDMgdGhpcyBpcyBhIEZBSUxVUkUsIG9uIGp1bml0NCB0aGlzIGlzIGFuIEVSUk9SCisgICAgICAgIC8vIEZvciBKVW5pdCAzIHRoaXMgaXMgYSBGQUlMVVJFLCBmb3IgSlVuaXQgNCB0aGlzIGlzIGFuIEVSUk9SCiAgICAgICAgIGludCByZXQgPSBydW5uZXIuZ2V0UmV0Q29kZSgpOwotICAgICAgICBpZiAocmV0ICE9IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyAmJiByZXQgIT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUykgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCByZXN1bHQgIiArIHJldCArICIgZnJvbSBqdW5pdCBydW5uZXIiKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIHJlc3VsdCAiICsgcmV0ICsgIiBmcm9tIGp1bml0IHJ1bm5lciIsCisgICAgICAgICAgICAgICAgcmV0ID09IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyB8fCByZXQgPT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUyk7CiAgICAgfQogCiAgICAgLy8gY2hlY2sgdGhhdCBhbiBleGNlcHRpb24gaW4gdGhlIGNvbnN0cnVjdG9yIGlzIG5vdGljZWQKQEAgLTEzMywxNSArMTMyLDE0IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUZXN0Q2FzZSgpIHsKICAgICAgICAgVGVzdFJ1bm5lciBydW5uZXIgPSBjcmVhdGVSdW5uZXIoSW52YWxpZFRlc3RDYXNlLmNsYXNzKTsKICAgICAgICAgcnVubmVyLnJ1bigpOwotICAgICAgICAvLyBPbiBqdW5pdDMgdGhpcyBpcyBhIEZBSUxVUkUsIG9uIGp1bml0NCB0aGlzIGlzIGFuIEVSUk9SCisgICAgICAgIC8vIEZvciBKVW5pdCAzIHRoaXMgaXMgYSBGQUlMVVJFLCBmb3IgSlVuaXQgNCB0aGlzIGlzIGFuIEVSUk9SCiAgICAgICAgIGludCByZXQgPSBydW5uZXIuZ2V0UmV0Q29kZSgpOwotICAgICAgICBpZiAocmV0ICE9IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyAmJiByZXQgIT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUykgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCByZXN1bHQgIiArIHJldCArICIgZnJvbSBqdW5pdCBydW5uZXIiKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIHJlc3VsdCAiICsgcmV0ICsgIiBmcm9tIGp1bml0IHJ1bm5lciIsCisgICAgICAgICAgICAgICAgcmV0ID09IEpVbml0VGVzdFJ1bm5lci5GQUlMVVJFUyB8fCByZXQgPT0gSlVuaXRUZXN0UnVubmVyLkVSUk9SUyk7CiAgICAgICAgIC8vIEpVTklUMyB0ZXN0CiAgICAgICAgIC8vYXNzZXJ0RXF1YWxzKGVycm9yLCBKVW5pdFRlc3RSdW5uZXIuRkFJTFVSRVMsIHJ1bm5lci5nZXRSZXRDb2RlKCkpOwogICAgICAgICAvL0BmaXhtZSBhcyBvZiBub3cgZG9lcyBub3QgcmVwb3J0IHRoZSBvcmlnaW5hbCBzdGFja3RyYWNlLgotICAgICAgICAvL2Fzc2VydFRydWUoZXJyb3IsIGVycm9yLmluZGV4T2YoInRocm93biBvbiBwdXJwb3NlIikgIT0gLTEpOworICAgICAgICAvL2Fzc2VydFRoYXQoZXJyb3IsIGVycm9yLCBjb250YWluc1N0cmluZygidGhyb3duIG9uIHB1cnBvc2UiKSk7CiAgICAgfQogCiAgICAgLy8gY2hlY2sgdGhhdCBKVW5pdCA0IHN5bnRoZXRpYyBBc3NlcnRpb25GYWlsZWRFcnJvciBnZXRzIG1lc3NhZ2UgYW5kIGNhdXNlIGZyb20gQXNzZXJ0aW9uRXJyb3IKQEAgLTMwOSw5ICszMDcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXNzZXJ0aW9uRXJyb3JUZXN0IHsKICAgICAgICAgQFRlc3QKICAgICAgICAgcHVibGljIHZvaWQgdGhyb3dzQXNzZXJ0aW9uRXJyb3IoKSB7Ci0gICAgICAgICAgICBBc3NlcnRpb25FcnJvciBhc3NlcnRpb25FcnJvciA9IG5ldyBBc3NlcnRpb25FcnJvcigiZmFpbHVyZSBtZXNzYWdlIik7Ci0gICAgICAgICAgICBhc3NlcnRpb25FcnJvci5pbml0Q2F1c2UobmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhdXNlIG1lc3NhZ2UiKSk7Ci0gICAgICAgICAgICB0aHJvdyBhc3NlcnRpb25FcnJvcjsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiZmFpbHVyZSBtZXNzYWdlIiwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNhdXNlIG1lc3NhZ2UiKSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L0pVbml0VmVyc2lvbkhlbHBlclRlc3QuamF2YQppbmRleCBhNGI4Y2U5Li40MTcxOTU5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvSlVuaXRWZXJzaW9uSGVscGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9KVW5pdFZlcnNpb25IZWxwZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvTm9WbUNyYXNoLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvTm9WbUNyYXNoLmphdmEKaW5kZXggMzkyYTkyZS4uZmVhMTNhMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L05vVm1DcmFzaC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9Ob1ZtQ3Jhc2guamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9QcmludGVyLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvUHJpbnRlci5qYXZhCmluZGV4IDAyMDA2NDguLmE4MWIxNGIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9QcmludGVyLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ByaW50ZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TbGVlcGVyLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU2xlZXBlci5qYXZhCmluZGV4IGFiOGNjZGEuLjI0NDM0ODggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TbGVlcGVyLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1NsZWVwZXIuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TdWl0ZU1ldGhvZFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9TdWl0ZU1ldGhvZFRlc3QuamF2YQppbmRleCAxNGEwOTY2Li4zYjE3OWQ1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvU3VpdGVNZXRob2RUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1N1aXRlTWV0aG9kVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1RlYXJEb3duT25WbUNyYXNoVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1RlYXJEb3duT25WbUNyYXNoVGVzdC5qYXZhCmluZGV4IGViMjAyODQuLjQ3Nzk3NTMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZWFyRG93bk9uVm1DcmFzaFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVhckRvd25PblZtQ3Jhc2hUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw5ICsxOCwxMCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0LmFzc2VydE5vdENvbnRhaW5zOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC00MSwxMyArNDIsMTMgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UZWFyZG93bigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb1RlYXJkb3duIik7CiAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImVycm9yIikpOwotICAgICAgICBhc3NlcnROb3RDb250YWlucygidGVhckRvd24gY2FsbGVkIG9uIFRpbWVvdXQiLCBidWlsZFJ1bGUuZ2V0T3V0cHV0KCkpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSwgbm90KGNvbnRhaW5zU3RyaW5nKCJ0ZWFyRG93biBjYWxsZWQgb24gVGltZW91dCIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGVhcmRvd24oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0VGVhcmRvd24iKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiZXJyb3IiKSk7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJ0ZWFyRG93biBjYWxsZWQgb24gVGltZW91dCIsIGJ1aWxkUnVsZS5nZXRPdXRwdXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldE91dHB1dCgpLCBjb250YWluc1N0cmluZygidGVhckRvd24gY2FsbGVkIG9uIFRpbWVvdXQiKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RGb3JtYXR0ZXIuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9UZXN0Rm9ybWF0dGVyLmphdmEKaW5kZXggMjc0MjBkNi4uNWQ5MzAzYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1Rlc3RGb3JtYXR0ZXIuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVGVzdEZvcm1hdHRlci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ZtQ3Jhc2guamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9WbUNyYXNoLmphdmEKaW5kZXggOTJkMjFiNi4uNTZjNDBmYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1ZtQ3Jhc2guamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvVm1DcmFzaC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTEZvcm1hdHRlcldpdGhDREFUQU9uU3lzdGVtT3V0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQuamF2YQppbmRleCAxMjIxYmE0Li42MjhiYjI0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvWE1MRm9ybWF0dGVyV2l0aENEQVRBT25TeXN0ZW1PdXQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDExICsyNiwxMSBAQAogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIHB1YmxpYyBjbGFzcyBYTUxGb3JtYXR0ZXJXaXRoQ0RBVEFPblN5c3RlbU91dCB7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1JUID0KICAgICAgICAgIlRFU1QtIiArIFhNTEZvcm1hdHRlcldpdGhDREFUQU9uU3lzdGVtT3V0LmNsYXNzLmdldE5hbWUoKSArICIueG1sIjsKIApAQCAtNjAsMjEgKzYwLDE1IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZGZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdChESVIgKyAiL2NkYXRhb3V0cHV0LnhtbCIpOworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvanVuaXQvY2RhdGFvdXRwdXQueG1sIik7CiAgICAgICAgIGlmIChidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJjZGF0YS5pbm5lciIpID09IG51bGwpIHsKICAgICAgICAgICAgIC8vIGF2b2lkIGVuZGxlc3MgbG9vcAogICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInJ1bi1qdW5pdCIpOwogICAgICAgICAgICAgRmlsZSBmID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShSRVBPUlQpOwotICAgICAgICAgICAgRmlsZVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IEZpbGVVdGlscy5yZWFkRnVsbHkocmVhZGVyKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuaW5kZXhPZigiPC9SRVNQT05TRT4mI3g1ZDsmI3g1ZDsmZ3Q7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjwvRVJST1I+IikgPiAwKTsKKyAgICAgICAgICAgIHRyeSAoRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihmKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoRmlsZVV0aWxzLnJlYWRGdWxseShyZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIjwvUkVTUE9OU0U+JiN4NWQ7JiN4NWQ7Jmd0OzwvRVJST1I+IikpOwogICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGYuZGVsZXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdC9YTUxSZXN1bHRBZ2dyZWdhdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3JUZXN0LmphdmEKaW5kZXggYzM1MzBhZS4uODAyZjU3MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3JUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0L1hNTFJlc3VsdEFnZ3JlZ2F0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVOb0V4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CkBAIC0yOSw3ICszMCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5EZWxldGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRmlsZVNldDsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgWE1MUmVzdWx0QWdncmVnYXRvclRlc3QgewpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgiamF2YS5uaW8uZmlsZS5GaWxlcyIpOwogICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVOb0V4Y2VwdGlvbigiU2tpcCB0ZXN0IG9uIEpESyA2IGFuZCBiZWxvdyIsIHgpOworICAgICAgICAgICAgYXNzdW1lTm9FeGNlcHRpb24oIlNraXAgdGVzdCBvbiBKREsgNiBhbmQgYmVsb3ciLCB4KTsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBGaWxlIGQgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJYTUxSZXN1bHRBZ2dyZWdhdG9yVGVzdCIpOwogICAgICAgICBpZiAoZC5leGlzdHMoKSkgewpAQCAtNTAsMTQgKzUwLDExIEBACiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VHJ1ZShkLmdldEFic29sdXRlUGF0aCgpLCBkLm1rZGlyKCkpOwogICAgICAgICBGaWxlIHhtbCA9IG5ldyBGaWxlKGQsICJ4LnhtbCIpOwotICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh4bWwpKTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbSh4bWwpKSkgewogICAgICAgICAgICAgcHcucHJpbnRsbigiPHRlc3RzdWl0ZSBlcnJvcnM9JzAnIGZhaWx1cmVzPScwJyBuYW1lPSdteS5Vbml0VGVzdCcgdGVzdHM9JzEnPiIpOwogICAgICAgICAgICAgcHcucHJpbnRsbigiIDx0ZXN0Y2FzZSBjbGFzc25hbWU9J215LlVuaXRUZXN0JyBuYW1lPSd0ZXN0U29tZXRoaW5nJy8+Iik7CiAgICAgICAgICAgICBwdy5wcmludGxuKCI8L3Rlc3RzdWl0ZT4iKTsKICAgICAgICAgICAgIHB3LmZsdXNoKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwdy5jbG9zZSgpOwogICAgICAgICB9CiAgICAgICAgIFhNTFJlc3VsdEFnZ3JlZ2F0b3IgdGFzayA9IG5ldyBYTUxSZXN1bHRBZ2dyZWdhdG9yKCk7CiAgICAgICAgIHRhc2suc2V0VG9kaXIoZCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9KVW5pdExhdW5jaGVyVGFza1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9qdW5pdGxhdW5jaGVyL0pVbml0TGF1bmNoZXJUYXNrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzY2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvanVuaXRsYXVuY2hlci9KVW5pdExhdW5jaGVyVGFza1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIudmVyaWZ5RmFpbGVkOworaW1wb3J0IHN0YXRpYyBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIudmVyaWZ5U2V0dXBGYWlsZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuVHJhY2tlci52ZXJpZnlTa2lwcGVkOworaW1wb3J0IHN0YXRpYyBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLlRyYWNrZXIudmVyaWZ5U3VjY2VzczsKK2ltcG9ydCBzdGF0aWMgb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5UcmFja2VyLndhc1Rlc3RSdW47CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLmNvbmZpbmVkLkpVbml0TGF1bmNoZXJUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuTG9hZGVyVXRpbHM7CitpbXBvcnQgb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyLkp1cGl0ZXJTYW1wbGVUZXN0OworaW1wb3J0IG9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGw7CitpbXBvcnQgb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyLkp1cGl0ZXJUYWdTYW1wbGVUZXN0OworaW1wb3J0IG9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZS5BbHdheXNGYWlsaW5nSlVuaXQ0VGVzdDsKK2ltcG9ydCBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2UuRm9ya2VkVGVzdDsKK2ltcG9ydCBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2UuSlVuaXQ0U2FtcGxlVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBKVW5pdExhdW5jaGVyVGFza30KKyAqLworcHVibGljIGNsYXNzIEpVbml0TGF1bmNoZXJUYXNrVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSlVuaXQgc2V0dXAgbWV0aG9kLgorICAgICAqLworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL2p1bml0bGF1bmNoZXIueG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB3aGVuIGEgdGVzdCwgdGhhdCdzIGNvbmZpZ3VyZWQgd2l0aCB7QGNvZGUgaGFsdE9uRmFpbHVyZT10cnVlfSwgc3RvcHMgdGhlIGJ1aWxkLCB3aGVuIHRoZQorICAgICAqIHRlc3QgZmFpbHMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWlsdXJlU3RvcHNCdWlsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWZhaWx1cmUtc3RvcHMtYnVpbGQiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0TmFtZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKHRhcmdldE5hbWUgKyAiIHdhcyBleHBlY3RlZCB0byBmYWlsIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLCBidXQgZG8gZnVydGhlciB0ZXN0cyB0byBtYWtlIHN1cmUgdGhlIGJ1aWxkIGZhaWxlZCBmb3IgZXhwZWN0ZWQgcmVhc29uCisgICAgICAgICAgICBpZiAoIXZlcmlmeUZhaWxlZCh0cmFja2VyRmlsZSwgQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAidGVzdFdpbGxGYWlsIikpIHsKKyAgICAgICAgICAgICAgICAvLyB0aHJvdyBiYWNrIHRoZSBvcmlnaW5hbCBjYXVzZQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB3aGVuIGEgdGVzdCwgdGhhdCdzIGlzbid0IGNvbmZpZ3VyZWQgd2l0aCB7QGNvZGUgaGFsdE9uRmFpbHVyZT10cnVlfSwgY29udGludWVzIHRoZQorICAgICAqIGJ1aWxkIGV2ZW4gd2hlbiB0aGVyZSBhcmUgdGVzdCBmYWlsdXJlcworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVDb250aW51ZXNCdWlsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWZhaWx1cmUtY29udGludWVzLWJ1aWxkIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyRmlsZSA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldE5hbWUpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSB0ZXN0IHRoYXQgd2FzIGV4cGVjdGVkIHRvIGJlIHJ1biAoYW5kIGZhaWwpLCBkaWQgaW5kZWVkIGZhaWwKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkFsd2F5c0ZhaWxpbmdKVW5pdDRUZXN0I3Rlc3RXaWxsRmFpbCB3YXMgZXhwZWN0ZWQgdG8gcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBBbHdheXNGYWlsaW5nSlVuaXQ0VGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0V2lsbEZhaWwiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCN0ZXN0V2lsbEZhaWwgd2FzIGV4cGVjdGVkIHRvIGZhaWwiLCB2ZXJpZnlGYWlsZWQodHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdFdpbGxGYWlsIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBleGVjdXRpb24gb2YgdGVzdCB0aGF0J3MgZXhwZWN0ZWQgdG8gc3VjY2VlZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3NmdWxUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LXN1Y2Nlc3MiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0TmFtZSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHJpZ2h0IHRlc3Qocykgd2VyZSBydW4KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkpVbml0NFNhbXBsZVRlc3QgdGVzdCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyRmlsZSwgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkpVbml0NFNhbXBsZVRlc3QjdGVzdEZvbyB3YXMgZXhwZWN0ZWQgdG8gc3VjY2VlZCIsIHZlcmlmeVN1Y2Nlc3ModHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0Rm9vIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGV4ZWN1dGlvbiBvZiBhIHRlc3Qgd2hpY2ggaXMgY29uZmlndXJlZCB0byBleGVjdXRlIG9ubHkgYSBwYXJ0aWN1bGFyIHNldCBvZiB0ZXN0IG1ldGhvZHMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpY01ldGhvZFRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldFNwZWNpZmljTWV0aG9kID0gInRlc3Qtb25lLXNwZWNpZmljLW1ldGhvZCI7CisgICAgICAgIGZpbmFsIFBhdGggdHJhY2tlcjEgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXRTcGVjaWZpY01ldGhvZCk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldFNwZWNpZmljTWV0aG9kKTsKKyAgICAgICAgLy8gdmVyaWZ5IG9ubHkgdGhhdCBzcGVjaWZpYyBtZXRob2Qgd2FzIHJ1bgorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidGVzdEJhciB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMSwgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RCYXIiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdEZvbyB3YXNuJ3QgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMSwgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RGb28iKSk7CisKKworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TXVsdGlwbGVNZXRob2RzID0gInRlc3QtbXVsdGlwbGUtc3BlY2lmaWMtbWV0aG9kcyI7CisgICAgICAgIGZpbmFsIFBhdGggdHJhY2tlcjIgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXRNdWx0aXBsZU1ldGhvZHMpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXRNdWx0aXBsZU1ldGhvZHMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidGVzdEZvb0JhciB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RGb29CYXIiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJ0ZXN0Rm9vIHdhcyBleHBlY3RlZCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIyLCBKVW5pdDRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdEZvbyIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJ0ZXN0QmFyIHdhc24ndCBleHBlY3RlZCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIyLCBKVW5pdDRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdEJhciIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgZXhlY3V0aW9uIG9mIG1vcmUgdGhhbiBvbmUge0Bjb2RlICZsdDt0ZXN0Jmd0O30gZWxlbWVudHMgaW4gdGhlIHtAY29kZSAmbHQ7anVuaXRsYXVuY2hlciZndDt9IHRhc2sKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUluZGl2aWR1YWxUZXN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LW11bHRpcGxlLWluZGl2aWR1YWwiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlMSA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldE5hbWUgKyAiLTEiKTsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyRmlsZTIgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXROYW1lICsgIi0yIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCN0ZXN0V2lsbEZhaWwgd2FzIGV4cGVjdGVkIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlckZpbGUxLAorICAgICAgICAgICAgICAgIEFsd2F5c0ZhaWxpbmdKVW5pdDRUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RXaWxsRmFpbCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkpVbml0NFNhbXBsZVRlc3QjdGVzdEZvbyB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyRmlsZTIsCisgICAgICAgICAgICAgICAgSlVuaXQ0U2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0Rm9vIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGV4ZWN1dGlvbiBvZiB0ZXN0cywgdGhhdCBoYXZlIGJlZW4gY29uZmlndXJlZCB1c2luZyB0aGUge0Bjb2RlICZsdDt0ZXN0Y2xhc3NlcyZndDt9IG5lc3RlZCBlbGVtZW50CisgICAgICogb2YgdGhlIHtAY29kZSAmbHQ7anVuaXRsYXVuY2hlciZndDt9IHRhc2sKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0Q2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWJhdGNoIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyRmlsZSA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldE5hbWUpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSlVuaXQ0U2FtcGxlVGVzdCN0ZXN0Rm9vIHdhcyBleHBlY3RlZCB0byBzdWNjZWVkIiwgdmVyaWZ5U3VjY2Vzcyh0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBKVW5pdDRTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RGb28iKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCN0ZXN0V2lsbEZhaWwgd2FzIGV4cGVjdGVkIHRvIGZhaWwiLCB2ZXJpZnlGYWlsZWQodHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdFdpbGxGYWlsIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSnVwaXRlclNhbXBsZVRlc3QjdGVzdFN1Y2NlZWRzIHdhcyBleHBlY3RlZCB0byBzdWNjZWVkIiwgdmVyaWZ5U3VjY2Vzcyh0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBKdXBpdGVyU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0U3VjY2VlZHMiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJKdXBpdGVyU2FtcGxlVGVzdCN0ZXN0RmFpbHMgd2FzIGV4cGVjdGVkIHRvIHN1Y2NlZWQiLCB2ZXJpZnlGYWlsZWQodHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdEZhaWxzIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSnVwaXRlclNhbXBsZVRlc3QjdGVzdFNraXBwZWQgd2FzIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQiLCB2ZXJpZnlTa2lwcGVkKHRyYWNrZXJGaWxlLAorICAgICAgICAgICAgICAgIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RTa2lwcGVkIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIkZvcmtlZFRlc3Qgd2Fzbid0IGV4cGVjdGVkIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlckZpbGUsIEZvcmtlZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgdmVyaWZ5TGVnYWN5WE1MRmlsZSgiVEVTVC1vcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXIuSnVwaXRlclNhbXBsZVRlc3RGYWlsaW5nQmVmb3JlQWxsLnhtbCIsICI8ZmFpbHVyZSBtZXNzYWdlPVwiSW50ZW50aW9uYWwgZmFpbHVyZVwiIHR5cGU9XCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvblwiPiIpOworICAgICAgICB2ZXJpZnlMZWdhY3lYTUxGaWxlKCJURVNULW9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIuanVwaXRlci5KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdTdGF0aWMueG1sIiwgIkNhdXNlZCBieTogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEludGVudGlvbmFsIGV4Y2VwdGlvbiBmcm9tIHN0YXRpYyBpbml0IGJsb2NrIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxlZ2FjeVhNTEZpbGUoZmluYWwgU3RyaW5nIGZpbGVOYW1lLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRDb250ZW50RXh0cmFjdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dC5kaXIiKTsKKyAgICAgICAgZmluYWwgUGF0aCB4bWxGaWxlID0gUGF0aHMuZ2V0KG91dHB1dERpciwgZmlsZU5hbWUpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJYTUwgZmlsZSBkb2Vzbid0IGV4aXN0OiAiICsgeG1sRmlsZSwgRmlsZXMuZXhpc3RzKHhtbEZpbGUpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKEZpbGVzLnJlYWRBbGxCeXRlcyh4bWxGaWxlKSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGZpbGVOYW1lICsgIiBkb2Vzbid0IGNvbnRhaW4gIiArIGV4cGVjdGVkQ29udGVudEV4dHJhY3QsIGNvbnRlbnQuY29udGFpbnMoZXhwZWN0ZWRDb250ZW50RXh0cmFjdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoZSBleGVjdXRpb24gb2YgYSBmb3JrZWQgdGVzdAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljRm9yaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWJhc2ljLWZvcmsiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0TmFtZSk7CisgICAgICAgIC8vIHNldHVwIGEgZHVtbXkgYW5kIGluY29ycmVjdCB2YWx1ZSBvZiBhIHN5c3Byb3BlcnR5IHRoYXQncyB1c2VkIGluIHRoZSB0ZXN0CisgICAgICAgIC8vIGJlaW5nIGZvcmtlZAorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoRm9ya2VkVGVzdC5TWVNfUFJPUF9PTkUsICJkdW1teSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgb3VyIEpWTSdzIHN5c3Byb3AgdmFsdWUgZGlkbid0IGdldCBjaGFuZ2VkCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlN5c3RlbSBwcm9wZXJ0eSAiICsgRm9ya2VkVGVzdC5TWVNfUFJPUF9PTkUgKyAiIHdhcyB1bmV4cGVjdGVkIHVwZGF0ZWQiLAorICAgICAgICAgICAgICAgICJkdW1teSIsIFN5c3RlbS5nZXRQcm9wZXJ0eShGb3JrZWRUZXN0LlNZU19QUk9QX09ORSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJGb3JrZWRUZXN0I3Rlc3RTeXNQcm9wIHdhcyBleHBlY3RlZCB0byBzdWNjZWVkIiwgdmVyaWZ5U3VjY2Vzcyh0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBGb3JrZWRUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RTeXNQcm9wIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW4gYSBmb3JrZWQgbW9kZSBleGVjdXRpb24gb2YgdGVzdHMsIHdoZW4gdGhlIHtAY29kZSBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllc30gYXR0cmlidXRlCisgICAgICogaXMgc2V0IHRvIGZhbHNlLCB0aGVuIHRoZSBleGVjdXRpb24gb2Ygc3VjaCB0ZXN0cyBmYWlscyB3aXRoIGEgY2xhc3Nsb2FkaW5nIGVycm9yIGZvciB0aGUgSlVuaXQgcGxhdGZvcm0KKyAgICAgKiBjbGFzc2VzCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVKVW5pdFBsYXRmb3JtTGlicygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWp1bml0LXBsYXRmb3JtLWxpYi1leGNsdWRlZCI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKHRhcmdldE5hbWUgKyAiIHdhcyBleHBlY3RlZCB0byBmYWlsIHNpbmNlIEpVbml0IHBsYXRmb3JtIGxpYnJhcmllcyAiICsKKyAgICAgICAgICAgICAgICAgICAgIndlcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGNsYXNzcGF0aCBvZiB0aGUgZm9ya2VkIEpWTSIpOworICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0IGEgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBmb3IgYSBKVW5pdCBwbGF0Zm9ybSBjbGFzcworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNuZmVNZXNzYWdlID0gQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCkgKyAiOiBvcmcuanVuaXQucGxhdGZvcm0iOworICAgICAgICAgICAgaWYgKCFidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKGNuZmVNZXNzYWdlKSkgeworICAgICAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25Mb2dNc2cgPSAiRXhjbHVkaW5nIEpVbml0IHBsYXRmb3JtIGxpYnJhcmllcyI7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJKVW5pdCBwbGF0Zm9ybSBsaWJyYXJpZXMgd2VyZW4ndCBleGNsdWRlZCBmcm9tIGNsYXNzcGF0aCIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkuY29udGFpbnMoZXhjbHVzaW9uTG9nTXNnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBpbiBhIGZvcmtlZCBtb2RlIGV4ZWN1dGlvbiBvZiB0ZXN0cywgd2hlbiB0aGUge0Bjb2RlIGluY2x1ZGVBbnRSdW50aW1lTGlicmFyaWVzfSBhdHRyaWJ1dGUKKyAgICAgKiBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gdGhlIGV4ZWN1dGlvbiBvZiBzdWNoIHRlc3RzIGZhaWxzIHdpdGggYSBjbGFzc2xvYWRpbmcgZXJyb3IgZm9yIHRoZSBBbnQgcnVudGltZQorICAgICAqIGNsYXNzZXMKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZUFudFJ1bnRpbWVMaWJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXROYW1lID0gInRlc3QtanVuaXQtYW50LXJ1bnRpbWUtbGliLWV4Y2x1ZGVkIjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwodGFyZ2V0TmFtZSArICIgd2FzIGV4cGVjdGVkIHRvIGZhaWwgc2luY2UgQW50IHJ1bnRpbWUgbGlicmFyaWVzICIgKworICAgICAgICAgICAgICAgICAgICAid2VyZW4ndCBpbmNsdWRlZCBpbiB0aGUgY2xhc3NwYXRoIG9mIHRoZSBmb3JrZWQgSlZNIik7CisgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7CisgICAgICAgICAgICAvLyBleHBlY3QgYSBFcnJvciBkdWUgdG8gbWlzc2luZyBtYWluIGNsYXNzICh3aGljaCBpcyBwYXJ0IG9mIEFudCBydW50aW1lIGxpYnJhcmllcworICAgICAgICAgICAgLy8gdGhhdCB3ZSBleGNsdWRlZCkKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaXNzaW5nTWFpbkNsYXNzID0gIkNvdWxkIG5vdCBmaW5kIG9yIGxvYWQgbWFpbiBjbGFzcyAiICsgU3RhbmRhbG9uZUxhdW5jaGVyLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmICghYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucyhtaXNzaW5nTWFpbkNsYXNzKSkgeworICAgICAgICAgICAgICAgIHRocm93IGJlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25Mb2dNc2cgPSAiRXhjbHVkaW5nIEFudCBydW50aW1lIGxpYnJhcmllcyI7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbnQgcnVudGltZSBsaWJyYXJpZXMgd2VyZW4ndCBleGNsdWRlZCBmcm9tIGNsYXNzcGF0aCIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkuY29udGFpbnMoZXhjbHVzaW9uTG9nTXNnKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGluIGEgZm9ya2VkIG1vZGUgZXhlY3V0aW9uLCB3aXRoIHtAY29kZSBpbmNsdWRlSlVuaXRQbGF0Zm9ybUxpYnJhcmllc30gYXR0cmlidXRlIHNldCB0byBmYWxzZQorICAgICAqIGFuZCB3aXRoIHRoZSB0ZXN0IGNsYXNzcGF0aCBleHBsaWNpdGx5IGluY2x1ZGluZyBKVW5pdCBwbGF0Zm9ybSBsaWJyYXJ5IGphcnMsIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpVbml0UGxhdGZvcm1MaWJzQ3VzdG9tTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSAidGVzdC1qdW5pdC1wbGF0Zm9ybS1saWItY3VzdG9tLWxvY2F0aW9uIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyRmlsZSA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldE5hbWUpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXROYW1lKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2x1c2lvbkxvZ01zZyA9ICJFeGNsdWRpbmcgSlVuaXQgcGxhdGZvcm0gbGlicmFyaWVzIjsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkpVbml0IHBsYXRmb3JtIGxpYnJhcmllcyB3ZXJlbid0IGV4Y2x1ZGVkIGZyb20gY2xhc3NwYXRoIiwgYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucyhleGNsdXNpb25Mb2dNc2cpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkp1cGl0ZXJTYW1wbGVUZXN0I3Rlc3RTdWNjZWVkcyB3YXMgZXhwZWN0ZWQgdG8gc3VjY2VlZCIsIHZlcmlmeVN1Y2Nlc3ModHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdFN1Y2NlZWRzIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiSnVwaXRlclNhbXBsZVRlc3QjdGVzdEZhaWxzIHdhcyBleHBlY3RlZCB0byBmYWlsIiwgdmVyaWZ5RmFpbGVkKHRyYWNrZXJGaWxlLAorICAgICAgICAgICAgICAgIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RGYWlscyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGluIGEgZm9ya2VkIG1vZGUgZXhlY3V0aW9uLCB3aXRoIHtAY29kZSBpbmNsdWRlQW50UnVudGltZUxpYnJhcmllc30gYXR0cmlidXRlIHNldCB0byBmYWxzZQorICAgICAqIGFuZCB3aXRoIHRoZSB0ZXN0IGNsYXNzcGF0aCBleHBsaWNpdGx5IGluY2x1ZGluZyBBbnQgcnVudGltZSBsaWJyYXJ5IGphcnMsIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFudFJ1bnRpbWVMaWJzQ3VzdG9tTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSAidGVzdC1hbnQtcnVudGltZS1saWItY3VzdG9tLWxvY2F0aW9uIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyRmlsZSA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldE5hbWUpOworICAgICAgICBzZXR1cFJ1bnRpbWVDbGFzc2VzUHJvcGVydHkoKTsKKyAgICAgICAgLy8gcnVuIHRoZSB0YXJnZXQKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0TmFtZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25Mb2dNc2cgPSAiRXhjbHVkaW5nIEFudCBydW50aW1lIGxpYnJhcmllcyI7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbnQgcnVudGltZSBsaWJyYXJpZXMgd2VyZW4ndCBleGNsdWRlZCBmcm9tIGNsYXNzcGF0aCIsIGJ1aWxkUnVsZS5nZXRGdWxsTG9nKCkuY29udGFpbnMoZXhjbHVzaW9uTG9nTXNnKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJKdXBpdGVyU2FtcGxlVGVzdCN0ZXN0U3VjY2VlZHMgd2FzIGV4cGVjdGVkIHRvIHN1Y2NlZWQiLCB2ZXJpZnlTdWNjZXNzKHRyYWNrZXJGaWxlLAorICAgICAgICAgICAgICAgIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RTdWNjZWVkcyIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkp1cGl0ZXJTYW1wbGVUZXN0I3Rlc3RGYWlscyB3YXMgZXhwZWN0ZWQgdG8gZmFpbCIsIHZlcmlmeUZhaWxlZCh0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBKdXBpdGVyU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0RmFpbHMiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbHdheXNGYWlsaW5nSlVuaXQ0VGVzdCN0ZXN0V2lsbEZhaWwgd2FzIGV4cGVjdGVkIHRvIGZhaWwiLCB2ZXJpZnlGYWlsZWQodHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdFdpbGxGYWlsIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRm9ya2VkVGVzdCN0ZXN0U3lzUHJvcCB3YXMgZXhwZWN0ZWQgdG8gc3VjY2VlZCIsIHZlcmlmeVN1Y2Nlc3ModHJhY2tlckZpbGUsCisgICAgICAgICAgICAgICAgRm9ya2VkVGVzdC5jbGFzcy5nZXROYW1lKCksICJ0ZXN0U3lzUHJvcCIpKTsKKworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBpbiBhIGZvcmtlZCBtb2RlIGV4ZWN1dGlvbiwgd2l0aCB7QGNvZGUgaW5jbHVkZUFudFJ1bnRpbWVMaWJyYXJpZXN9IGFuZCB7QGNvZGUgaW5jbHVkZUpVbml0UGxhdGZvcm1MaWJyYXJpZXN9CisgICAgICogYXR0cmlidXRlcyBzZXQgdG8gZmFsc2UgYW5kIHdpdGggdGhlIHRlc3QgY2xhc3NwYXRoIGV4cGxpY2l0bHkgaW5jbHVkaW5nIEFudCBydW50aW1lIGFuZCBKVW5pdCBwbGF0Zm9ybSBsaWJyYXJ5IGphcnMsCisgICAgICogdGhlIHRlc3RzIGFyZSBleGVjdXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW50QW5kSlVuaXRQbGF0Zm9ybUxpYnNDdXN0b21Mb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSA9ICJ0ZXN0LWFudC1hbmQtanVuaXQtcGxhdGZvcm0tbGliLWN1c3RvbS1sb2NhdGlvbiI7CisgICAgICAgIGZpbmFsIFBhdGggdHJhY2tlckZpbGUgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXROYW1lKTsKKyAgICAgICAgc2V0dXBSdW50aW1lQ2xhc3Nlc1Byb3BlcnR5KCk7CisgICAgICAgIC8vIHJ1biB0aGUgdGFyZ2V0CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJBbnQgcnVudGltZSBsaWJyYXJpZXMgd2VyZW4ndCBleGNsdWRlZCBmcm9tIGNsYXNzcGF0aCIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldEZ1bGxMb2coKS5jb250YWlucygiRXhjbHVkaW5nIEFudCBydW50aW1lIGxpYnJhcmllcyIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkpVbml0IHBsYXRmb3JtIGxpYnJhcmllcyB3ZXJlbid0IGV4Y2x1ZGVkIGZyb20gY2xhc3NwYXRoIiwKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0RnVsbExvZygpLmNvbnRhaW5zKCJFeGNsdWRpbmcgSlVuaXQgcGxhdGZvcm0gbGlicmFyaWVzIikpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJKVW5pdDRTYW1wbGVUZXN0I3Rlc3RCYXIgd2FzIGV4cGVjdGVkIHRvIHBhc3MiLCB2ZXJpZnlTdWNjZXNzKHRyYWNrZXJGaWxlLAorICAgICAgICAgICAgICAgIEpVbml0NFNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLCAidGVzdEJhciIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBleGVjdXRpb24gb2YgYSB0ZXN0IHdoaWNoIGlzIGNvbmZpZ3VyZWQgdG8gZXhlY3V0ZSBvbmx5IG1ldGhvZHMgd2l0aCBhIHNwZWNpYWwgdGFnCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEluY2x1ZGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldCA9ICJ0ZXN0LW1ldGhvZC13aXRoLWluY2x1ZGUtdGFnIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyMiA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldCk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIC8vIHZlcmlmeSBvbmx5IHRoYXQgc3BlY2lmaWMgbWV0aG9kIHdhcyBydW4KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzRXhlY3V0ZWQiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkIHdhcyBleHBlY3RlZCBOT1QgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWQiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZXhlY3V0aW9uIG9mIGEgdGVzdCB3aGljaCBpcyBjb25maWd1cmVkIHRvIGV4ZWN1dGUgb25seSBtZXRob2RzIHdpdGhvdXQgc3BlY2lhbCB0YWdzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kV2l0aEV4Y2x1ZGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldCA9ICJ0ZXN0LW1ldGhvZC13aXRoLWV4Y2x1ZGUtdGFnIjsKKyAgICAgICAgZmluYWwgUGF0aCB0cmFja2VyMiA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldCk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7CisgICAgICAgIC8vIHZlcmlmeSBvbmx5IHRoYXQgc3BlY2lmaWMgbWV0aG9kIHdhcyBydW4KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzRXhlY3V0ZWQiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkIHdhcyBleHBlY3RlZCBOT1QgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWQiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZXhlY3V0aW9uIG9mIGEgdGVzdCB3aGljaCBpcyBjb25maWd1cmVkIHRvIGV4ZWN1dGUgb25seSBtZXRob2RzIHdpdGggc3BlY2lhbCB0YWdzLCB0d28gY2xhc3NlcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RXaXRoVGFnMkNsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldCA9ICJ0ZXN0LW1ldGhvZC13aXRoLXRhZy0yLWNsYXNzZXMiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXIxID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0ICsgIjEiKTsKKworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXIyID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0ICsgIjIiKTsKKworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOworICAgICAgICAvLyB2ZXJpZnkgb25seSB0aGF0IHNwZWNpZmljIG1ldGhvZCB3YXMgcnVuCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzRXhlY3V0ZWQgd2FzIGV4cGVjdGVkIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlcjEsIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZCB3YXMgZXhwZWN0ZWQgTk9UIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlcjEsIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkVGFnU2FtcGxlVGVzdCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyMiwgSnVwaXRlclRhZ1NhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzRXhlY3V0ZWRUYWdTYW1wbGVUZXN0IikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3Qgd2FzIGV4cGVjdGVkIE5PVCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIyLCBKdXBpdGVyVGFnU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkVGFnU2FtcGxlVGVzdDIgd2FzIGV4cGVjdGVkIE5PVCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIyLCBKdXBpdGVyVGFnU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QyIikpOworICAgIH0KKyAgICAKKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgZmFpbHVyZSBhdCB3aXRoIGJlZm9yZWFsbCBzdG9wcyB0aGUgYnVpbGQgCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVmb3JlQWxsRmFpbHVyZVN0b3BzQnVpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSAidGVzdC1iZWZvcmVhbGwtZmFpbHVyZS1zdG9wcy1idWlsZCI7CisgICAgICAgIGZpbmFsIFBhdGggdHJhY2tlckZpbGUgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXROYW1lKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwodGFyZ2V0TmFtZSArICIgd2FzIGV4cGVjdGVkIHRvIGZhaWwiKTsKKyAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQsIGJ1dCBkbyBmdXJ0aGVyIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGUgYnVpbGQgZmFpbGVkIGZvciBleHBlY3RlZCByZWFzb24KKyAgICAgICAgICAgIGlmICghdmVyaWZ5U2V0dXBGYWlsZWQodHJhY2tlckZpbGUsIEp1cGl0ZXJTYW1wbGVUZXN0RmFpbGluZ0JlZm9yZUFsbC5jbGFzcy5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgYmFjayB0aGUgb3JpZ2luYWwgY2F1c2UKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgd2hlbiBhIHRlc3QsIHRoYXQncyBpc24ndCBjb25maWd1cmVkIHdpdGgge0Bjb2RlIGhhbHRPbkZhaWx1cmU9dHJ1ZX0sIGNvbnRpbnVlcyB0aGUKKyAgICAgKiBidWlsZCBldmVuIHdoZW4gdGhlcmUgYXJlIHRlc3QgZmFpbHVyZXMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWZvcmVBbGxGYWlsdXJlQ29udGludWVzQnVpbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSAidGVzdC1iZWZvcmVhbGwtZmFpbHVyZS1jb250aW51ZXMtYnVpbGQiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0TmFtZSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgQEJlZm9yZUFsbCBmYWlsdXJlIHRvIGxlYWQgdG8gZmFpbGluZyB0ZXN0Y2FzZSIsIHZlcmlmeVNldHVwRmFpbGVkKHRyYWNrZXJGaWxlLCBKdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBleGVjdXRpb24gb2YgYSB0ZXN0IHdoaWNoIGlzIGNvbmZpZ3VyZWQgdG8gZXhlY3V0ZSBvbmx5IG1ldGhvZHMgd2l0aCBzcGVjaWFsIHRhZ3MsIHR3byBjbGFzc2VzIHNwZWNpZmllZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZFdpdGhUYWdGaWxlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0YXJnZXQgPSAidGVzdC1tZXRob2Qtd2l0aC10YWctZmlsZXNldCI7CisgICAgICAgIGZpbmFsIFBhdGggdHJhY2tlciA9IHNldHVwVHJhY2tlclByb3BlcnR5KHRhcmdldCk7CisKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgLy8gdmVyaWZ5IG9ubHkgdGhhdCBzcGVjaWZpYyBtZXRob2Qgd2FzIHJ1bgorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkIHdhcyBleHBlY3RlZCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIsIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZCB3YXMgZXhwZWN0ZWQgTk9UIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlciwgSnVwaXRlclNhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWQiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzRXhlY3V0ZWRUYWdTYW1wbGVUZXN0IHdhcyBleHBlY3RlZCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIsIEp1cGl0ZXJUYWdTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkVGFnU2FtcGxlVGVzdCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWRUYWdTYW1wbGVUZXN0IHdhcyBleHBlY3RlZCBOT1QgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyLCBKdXBpdGVyVGFnU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkVGFnU2FtcGxlVGVzdDIgd2FzIGV4cGVjdGVkIE5PVCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIsIEp1cGl0ZXJUYWdTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkVGFnU2FtcGxlVGVzdDIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgZXhlY3V0aW9uIG9mIGEgdGVzdCB3aGljaCBpcyBjb25maWd1cmVkIHRvIGV4ZWN1dGUgb25seSBtZXRob2RzIHdpdGggc3BlY2lhbCB0YWdzLCB0d28gY2xhc3NlcyBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RXaXRoVGFnRmlsZVNldEZvcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldCA9ICJ0ZXN0LW1ldGhvZC13aXRoLXRhZy1maWxlc2V0LWZvcmsiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXIgPSBzZXR1cFRyYWNrZXJQcm9wZXJ0eSh0YXJnZXQpOworCisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyLCBKdXBpdGVyU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZCIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKCJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWQgd2FzIGV4cGVjdGVkIE5PVCB0byBiZSBydW4iLCB3YXNUZXN0UnVuKHRyYWNrZXIsIEp1cGl0ZXJTYW1wbGVUZXN0LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkIikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkVGFnU2FtcGxlVGVzdCB3YXMgZXhwZWN0ZWQgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyLCBKdXBpdGVyVGFnU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZFRhZ1NhbXBsZVRlc3QiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgidGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkVGFnU2FtcGxlVGVzdCB3YXMgZXhwZWN0ZWQgTk9UIHRvIGJlIHJ1biIsIHdhc1Rlc3RSdW4odHJhY2tlciwgSnVwaXRlclRhZ1NhbXBsZVRlc3QuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICJ0ZXN0TWV0aG9kSW5jbHVkZVRhZ2lzTm90RXhlY3V0ZWRUYWdTYW1wbGVUZXN0IikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QyIHdhcyBleHBlY3RlZCBOT1QgdG8gYmUgcnVuIiwgd2FzVGVzdFJ1bih0cmFja2VyLCBKdXBpdGVyVGFnU2FtcGxlVGVzdC5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgInRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QyIikpOworCisgICAgICAgIC8vIERvIGl0IGluIHRoZSB0ZXN0LCBjYXVzZSBvdGhlcndpc2UgdGhlIGZpbGUgd2lsbCBiZSB0b28gYmlnCisgICAgICAgIEZpbGVzLmRlbGV0ZUlmRXhpc3RzKHRyYWNrZXIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgZm9ya2VkIHRlc3Qgd29ya3MgZmluZSB3aGVuIHRoZSB7QGNvZGUgdGVzdGNsYXNzZXN9IGVsZW1lbnQgaXMgdXNlZAorICAgICAqIGFzIGEgc2libGluZyBvZiBhIHtAY29kZSBsaXN0ZW5lcn0gZWxlbWVudAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ6NjM5NTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhcmdldE5hbWUgPSAiYnotNjM5NTgiOworICAgICAgICBmaW5hbCBQYXRoIHRyYWNrZXJGaWxlID0gc2V0dXBUcmFja2VyUHJvcGVydHkodGFyZ2V0TmFtZSk7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJGb3JrZWRUZXN0I3Rlc3RTeXNQcm9wIHdhcyBleHBlY3RlZCB0byBzdWNjZWVkIiwgdmVyaWZ5U3VjY2Vzcyh0cmFja2VyRmlsZSwKKyAgICAgICAgICAgICAgICBGb3JrZWRUZXN0LmNsYXNzLmdldE5hbWUoKSwgInRlc3RTeXNQcm9wIikpOworICAgIH0KKworICAgIHByaXZhdGUgUGF0aCBzZXR1cFRyYWNrZXJQcm9wZXJ0eShmaW5hbCBTdHJpbmcgdGFyZ2V0TmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSB0YXJnZXROYW1lICsgIi10cmFja2VyLnR4dCI7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkodGFyZ2V0TmFtZSArICIudHJhY2tlciIsIGZpbGVuYW1lKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpciA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm91dHB1dC5kaXIiKTsKKyAgICAgICAgcmV0dXJuIFBhdGhzLmdldChvdXRwdXREaXIsIGZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBSdW50aW1lQ2xhc3Nlc1Byb3BlcnR5KCkgeworICAgICAgICAvLyBzZXR1cCBhIHByb3BlcnR5IHRoYXQgcG9pbnRzIHRvIHRoZSBsb2NhdGlvbnMgb2YgQW50IHJ1bnRpbWUgY2xhc3Nlcy4KKyAgICAgICAgLy8gdGhpcyBwYXRoIHdpbGwgdGhlbiBiZSB1c2VkIGluIHRhcmdldCB0byBjcmVhdGUgYSBkdXBsaWNhdGUgY29waWVkCisgICAgICAgIC8vIGNsYXNzZXMgYW5kIHRoZW4gd2lsbCBiZSB1c2VkIGFzIGEgY3VzdG9tIGxvY2F0aW9uIGZvciBBbnQgcnVudGltZSBsaWJyYXJpZXMKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb2plY3RSZXNvdXJjZU5hbWUgPSBMb2FkZXJVdGlscy5jbGFzc05hbWVUb1Jlc291cmNlKFByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgZmluYWwgRmlsZSBhbnRDbGFzc2VzUGF0aCA9IExvYWRlclV0aWxzLmdldFJlc291cmNlU291cmNlKFByb2plY3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgcHJvamVjdFJlc291cmNlTmFtZSk7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImFudC5ydW50aW1lLmNsYXNzZXMub3JpZ2luYWwucGF0aCIsIGFudENsYXNzZXNQYXRoLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvbmV0L0ZUUFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGVzdC5qYXZhCmluZGV4IGVkY2E2OTMuLmVmNmFmZDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9uZXQvRlRQVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsMTAgKzE3LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC00NCw3ICs0NCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHAuUmVnZXhwTWF0Y2hlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cC5SZWdleHBNYXRjaGVyRmFjdG9yeTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNjQsMjAgKzYzLDE4IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBsb2dpbkZhaWx1cmVNZXNzYWdlOwogCi0gICAgcHJpdmF0ZSBTdHJpbmcgdG1wRGlyID0gbnVsbDsKICAgICBwcml2YXRlIFN0cmluZyByZW1vdGVUbXBEaXIgPSBudWxsOwotICAgIHByaXZhdGUgU3RyaW5nIGZ0cEZpbGVTZXAgPSBudWxsOwotICAgIHByaXZhdGUgbXlGVFAgbXlGVFBUYXNrID0gbmV3IG15RlRQKCk7CiAKKyAgICBwcml2YXRlIG15RlRQIG15RlRQVGFzayA9IG5ldyBteUZUUCgpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvbmV0L2Z0cC54bWwiKTsKICAgICAgICAgUHJvamVjdCBwcm9qZWN0ID0gYnVpbGRSdWxlLmdldFByb2plY3QoKTsKICAgICAgICAgcHJvamVjdC5leGVjdXRlVGFyZ2V0KCJzZXR1cCIpOwotICAgICAgICB0bXBEaXIgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJ0bXAuZGlyIik7CisgICAgICAgIFN0cmluZyB0bXBEaXIgPSBwcm9qZWN0LmdldFByb3BlcnR5KCJ0bXAuZGlyIik7CiAgICAgICAgIGZ0cCA9IG5ldyBGVFBDbGllbnQoKTsKLSAgICAgICAgZnRwRmlsZVNlcCA9IHByb2plY3QuZ2V0UHJvcGVydHkoImZ0cC5maWxlc2VwIik7CisgICAgICAgIFN0cmluZyBmdHBGaWxlU2VwID0gcHJvamVjdC5nZXRQcm9wZXJ0eSgiZnRwLmZpbGVzZXAiKTsKICAgICAgICAgbXlGVFBUYXNrLnNldFNlcGFyYXRvcihmdHBGaWxlU2VwKTsKICAgICAgICAgbXlGVFBUYXNrLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIHJlbW90ZVRtcERpciA9IG15RlRQVGFzay5yZXNvbHZlRmlsZSh0bXBEaXIpOwpAQCAtMTI3LDggKzEyNCw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwpAQCAtMTM5LDggKzEzNiw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIn0pOwpAQCAtMTUxLDggKzE0OCw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2NhbigpOwpAQCAtMTYyLDggKzE1OSw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdWxsUGF0aE1hdGNoZXNDYXNlU2Vuc2l0aXZlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvYmV0YS9nYW1tYS9HQU1NQS5YTUwifSk7CkBAIC0xNzMsOCArMTcwLDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZ1bGxQYXRoTWF0Y2hlc0Nhc2VJbnNlbnNpdGl2ZSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CiAgICAgICAgIGRzLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwpAQCAtMTg1LDggKzE4Miw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyQnV0Q2FzZUluc2Vuc2l0aXZlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiQUxQSEEvIn0pOwpAQCAtMTk4LDggKzE5NSw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyYmlzQnV0Q2FzZUluc2Vuc2l0aXZlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvQkVUQS9nYW1tYS8ifSk7CkBAIC0yMTIsOCArMjA5LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoU2VsZWN0b3IoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJmdHAtZ2V0LXdpdGgtc2VsZWN0b3IiKTsKLSAgICAgICAgYXNzZXJ0Q29udGFpbnMoInNlbGVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZCBpbiByZW1vdGUgZmlsZXNldHMiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwotICAgICAgICBGaWxlU2V0IGZzRGVzdGluYXRpb24gPSAoRmlsZVNldCkgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImZpbGVzZXQtZGVzdGluYXRpb24td2l0aG91dC1zZWxlY3RvciIpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcoInNlbGVjdG9ycyBhcmUgbm90IHN1cHBvcnRlZCBpbiByZW1vdGUgZmlsZXNldHMiKSk7CisgICAgICAgIEZpbGVTZXQgZnNEZXN0aW5hdGlvbiA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGhvdXQtc2VsZWN0b3IiKTsKICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkc0Rlc3RpbmF0aW9uID0gZnNEZXN0aW5hdGlvbi5nZXREaXJlY3RvcnlTY2FubmVyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwogICAgICAgICBkc0Rlc3RpbmF0aW9uLnNjYW4oKTsKICAgICAgICAgU3RyaW5nW10gc29ydGVkRGVzdGluYXRpb25EaXJlY3RvcmllcyA9IGRzRGVzdGluYXRpb24uZ2V0SW5jbHVkZWREaXJlY3RvcmllcygpOwpAQCAtMjI2LDcgKzIyMyw3IEBACiAgICAgICAgICAgICBzb3J0ZWREZXN0aW5hdGlvbkZpbGVzW2NvdW50ZXJdID0KICAgICAgICAgICAgICAgICBzb3J0ZWREZXN0aW5hdGlvbkZpbGVzW2NvdW50ZXJdLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwogICAgICAgICB9Ci0gICAgICAgIEZpbGVTZXQgZnNTb3VyY2UgPSAgKEZpbGVTZXQpIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmaWxlc2V0LXNvdXJjZS13aXRob3V0LXNlbGVjdG9yIik7CisgICAgICAgIEZpbGVTZXQgZnNTb3VyY2UgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZmlsZXNldC1zb3VyY2Utd2l0aG91dC1zZWxlY3RvciIpOwogICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzU291cmNlID0gZnNTb3VyY2UuZ2V0RGlyZWN0b3J5U2Nhbm5lcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKICAgICAgICAgZHNTb3VyY2Uuc2NhbigpOwogICAgICAgICBjb21wYXJlRmlsZXMoZHNTb3VyY2UsIHNvcnRlZERlc3RpbmF0aW9uRmlsZXMsIHNvcnRlZERlc3RpbmF0aW9uRGlyZWN0b3JpZXMpOwpAQCAtMjM0LDkgKzIzMSw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb2xsb3dTeW1saW5rc1RydWUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBTeW1saW5rcyIsIHN1cHBvcnRzU3ltbGlua3MpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUoIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFN5bWxpbmtzIiwgc3VwcG9ydHNTeW1saW5rcyk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC1kaXJlY3Rvcnktc3ltYm9saWMtbGluayIpOwogICAgICAgICBGaWxlU2V0IGZzRGVzdGluYXRpb24gPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiZmlsZXNldC1kZXN0aW5hdGlvbi13aXRob3V0LXNlbGVjdG9yIik7CiAgICAgICAgIERpcmVjdG9yeVNjYW5uZXIgZHNEZXN0aW5hdGlvbiA9IGZzRGVzdGluYXRpb24uZ2V0RGlyZWN0b3J5U2Nhbm5lcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKQEAgLTI0NywxMSArMjQ0LDExIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGb2xsb3dTeW1saW5rc0ZhbHNlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBzdXBwb3J0c1N5bWxpbmtzKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKCJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBTeW1saW5rcyIsIHN1cHBvcnRzU3ltbGlua3MpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImZ0cC1nZXQtZGlyZWN0b3J5LW5vLXN5bWJvbGljLWxpbmsiKTsKLSAgICAgICAgRmlsZVNldCBmc0Rlc3RpbmF0aW9uID0gKEZpbGVTZXQpIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJmaWxlc2V0LWRlc3RpbmF0aW9uLXdpdGhvdXQtc2VsZWN0b3IiKTsKKyAgICAgICAgRmlsZVNldCBmc0Rlc3RpbmF0aW9uID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoImZpbGVzZXQtZGVzdGluYXRpb24td2l0aG91dC1zZWxlY3RvciIpOwogICAgICAgICBEaXJlY3RvcnlTY2FubmVyIGRzRGVzdGluYXRpb24gPSBmc0Rlc3RpbmF0aW9uLmdldERpcmVjdG9yeVNjYW5uZXIoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CiAgICAgICAgIGRzRGVzdGluYXRpb24uc2NhbigpOwogICAgICAgICBjb21wYXJlRmlsZXMoZHNEZXN0aW5hdGlvbiwgbmV3IFN0cmluZ1tdIHt9LCBuZXcgU3RyaW5nW10ge30pOwpAQCAtMjU5LDkgKzI1Niw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd1N5bWxpbmtzKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBzdXBwb3J0c1N5bWxpbmtzKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKCJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBTeW1saW5rcyIsIHN1cHBvcnRzU3ltbGlua3MpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwpAQCAtMjc0LDkgKzI3MSw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9oaWJpdFN5bWxpbmtzKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBzdXBwb3J0c1N5bWxpbmtzKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKCJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBTeW1saW5rcyIsIHN1cHBvcnRzU3ltbGlua3MpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoInN5bWxpbmstc2V0dXAiKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwpAQCAtMjg4LDkgKzI4NSw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU3ltbGluaygpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFN5bWxpbmtzIiwgc3VwcG9ydHNTeW1saW5rcyk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgU3ltbGlua3MiLCBzdXBwb3J0c1N5bWxpbmtzKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7CisgICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJzeW1saW5rLWZpbGUtc2V0dXAiKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwpAQCAtMzA0LDggKzMwMSw4IEBACiAgICAgLy8gZmF0aGVyIGFuZCBjaGlsZCBwYXR0ZXJuIHRlc3QKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPcmRlck9mSW5jbHVkZVBhdHRlcm5zSXJyZWxldmFudCgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBTdHJpbmdbXSBleHBlY3RlZEZpbGVzID0geyJhbHBoYS9iZXRhL2JldGEueG1sIiwgImFscGhhL2JldGEvZ2FtbWEvZ2FtbWEueG1sIn07CiAgICAgICAgIFN0cmluZ1tdIGV4cGVjdGVkRGlyZWN0b3JpZXMgPSB7ImFscGhhL2JldGEiLCAiYWxwaGEvYmV0YS9nYW1tYSIgfTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwpAQCAtMzIzLDggKzMyMCw4IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYXR0ZXJuc0RpZmZlckluQ2FzZVNjYW5uaW5nU2Vuc2l0aXZlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIiwgIkFMUEhBLyJ9KTsKQEAgLTMzNSw4ICszMzIsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0dGVybnNEaWZmZXJJbkNhc2VTY2FubmluZ0luc2Vuc2l0aXZlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvIiwgIkFMUEhBLyJ9KTsKQEAgLTM0OCw4ICszNDUsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHBhdGhEaWZmZXJzSW5DYXNlU2Nhbm5pbmdTZW5zaXRpdmUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7CisgICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS9iZXRhL2dhbW1hL2dhbW1hLnhtbCIsICJhbHBoYS9iZXRhL2dhbW1hL0dBTU1BLlhNTCJ9KTsKQEAgLTM1OSw4ICszNTYsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVsbHBhdGhEaWZmZXJzSW5DYXNlU2Nhbm5pbmdJbnNlbnNpdGl2ZSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7CkBAIC0zNzUsOCArMzcyLDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBhcmVudERpZmZlcnNJbkNhc2VTY2FubmluZ1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOwotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOworICAgICAgICBhc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiQ291bGQgbm90IGNoYW5nZSByZW1vdGUgZGlyZWN0b3J5IiwgY2hhbmdlUmVtb3RlRGlyKHJlbW90ZVRtcERpcikpOwogICAgICAgICBGVFAuRlRQRGlyZWN0b3J5U2Nhbm5lciBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7CiAgICAgICAgIGRzLnNldEJhc2VkaXIobmV3IEZpbGUoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksICJ0bXAiKSk7CiAgICAgICAgIGRzLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ImFscGhhLyIsICJBTFBIQS9iZXRhLyJ9KTsKQEAgLTM4OCw4ICszODUsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyZW50RGlmZmVyc0luQ2FzZVNjYW5uaW5nSW5zZW5zaXRpdmUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7CisgICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwogICAgICAgICBkcy5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8iLCAiQUxQSEEvYmV0YS8ifSk7CkBAIC00MDEsOCArMzk4LDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVPbmVGaWxlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiKiovKi54bWwifSk7CkBAIC00MTMsOCArNDEwLDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVIYXNQcmVjZWRlbmNlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvKioifSk7CkBAIC00MjUsOCArNDIyLDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsdGVybmF0ZUluY2x1ZGVFeGNsdWRlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEvKioiLCAiYWxwaGEvYmV0YS9nYW1tYS8qKiJ9KTsKQEAgLTQzNyw4ICs0MzQsOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJuYXRlRXhjbHVkZUluY2x1ZGUoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKGxvZ2luRmFpbHVyZU1lc3NhZ2UsIGxvZ2luU3VjY2VlZGVkKTsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7CisgICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKICAgICAgICAgRlRQLkZUUERpcmVjdG9yeVNjYW5uZXIgZHMgPSBteUZUUFRhc2submV3U2Nhbm5lcihmdHApOwogICAgICAgICBkcy5zZXRCYXNlZGlyKG5ldyBGaWxlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCAidG1wIikpOwogICAgICAgICBkcy5zZXRFeGNsdWRlcyhuZXcgU3RyaW5nW10geyJhbHBoYS8qKiIsICJhbHBoYS9iZXRhL2dhbW1hLyoqIn0pOwpAQCAtNDUyLDggKzQ0OSw4IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRyZW5PZkV4Y2x1ZGVkRGlyZWN0b3J5KCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShsb2dpbkZhaWx1cmVNZXNzYWdlLCBsb2dpblN1Y2NlZWRlZCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUobG9naW5GYWlsdXJlTWVzc2FnZSwgbG9naW5TdWNjZWVkZWQpOworICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiY2hpbGRyZW4tb2YtZXhjbHVkZWQtZGlyLXNldHVwIik7CiAgICAgICAgIEZUUC5GVFBEaXJlY3RvcnlTY2FubmVyIGRzID0gbXlGVFBUYXNrLm5ld1NjYW5uZXIoZnRwKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKQEAgLTQ2Miw3ICs0NTksNyBAQAogICAgICAgICBjb21wYXJlRmlsZXMoZHMsIG5ldyBTdHJpbmdbXSB7ImRlbHRhL2RlbHRhLnhtbCJ9LCBuZXcgU3RyaW5nW10geyJkZWx0YSJ9KTsKIAogICAgICAgICBkcyA9IG15RlRQVGFzay5uZXdTY2FubmVyKGZ0cCk7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIHJlbW90ZSBkaXJlY3RvcnkiLCBjaGFuZ2VSZW1vdGVEaXIocmVtb3RlVG1wRGlyKSk7CisgICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgcmVtb3RlIGRpcmVjdG9yeSIsIGNoYW5nZVJlbW90ZURpcihyZW1vdGVUbXBEaXIpKTsKICAgICAgICAgZHMuc2V0QmFzZWRpcihuZXcgRmlsZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgInRtcCIpKTsKICAgICAgICAgZHMuc2V0RXhjbHVkZXMobmV3IFN0cmluZ1tdIHsiYWxwaGEifSk7CiAgICAgICAgIGRzLnNjYW4oKTsKQEAgLTQ3OCw3ICs0NzUsNyBAQAogICAgICAqIHRvIHBhcnNlIHRoZSBsb2cgb3V0cHV0LgogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgQ291bnRMb2dMaXN0ZW5lciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewotICAgICAgICBwcml2YXRlIFZlY3RvciBsYXN0TWF0Y2hHcm91cHMgPSBudWxsOworICAgICAgICBwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGxhc3RNYXRjaEdyb3VwcyA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgUmVnZXhwTWF0Y2hlciBtYXRjaGVyID0gbmV3IFJlZ2V4cE1hdGNoZXJGYWN0b3J5KCkubmV3UmVnZXhwTWF0Y2hlcigpOwogCiAgICAgICAgIC8qKgpAQCAtNTE0LDcgKzUxMSw3IEBACiAgICAgICAgICAgICBpZiAodGhpcy5sYXN0TWF0Y2hHcm91cHMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIHRoaXMubGFzdE1hdGNoR3JvdXBzLmdldCgxKSk7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludCh0aGlzLmxhc3RNYXRjaEdyb3Vwcy5nZXQoMSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MjMsMTEgKzUyMCwxMCBAQAogICAgICAqIG9mIHRpbWVzIGEgbWVzc2FnZSBoYXMgYmVlbiBlbWl0dGVkLgogICAgICAqLwogICAgIHByaXZhdGUgY2xhc3MgTG9nQ291bnRlciBleHRlbmRzIERlZmF1bHRMb2dnZXIgewotICAgICAgICBwcml2YXRlIE1hcCBzZWFyY2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBwcml2YXRlIGludCBtYXRjaENvdW50OworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IHNlYXJjaE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICBwdWJsaWMgdm9pZCBhZGRMb2dNZXNzYWdlVG9TZWFyY2goU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHNlYXJjaE1hcC5wdXQobWVzc2FnZSwgSW50ZWdlci52YWx1ZU9mKDApKTsKKyAgICAgICAgICAgIHNlYXJjaE1hcC5wdXQobWVzc2FnZSwgMCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKgpAQCAtNTM1LDkgKzUzMSw5IEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCBtZXNzYWdlTG9nZ2VkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXZlbnQuZ2V0TWVzc2FnZSgpOwotICAgICAgICAgICAgSW50ZWdlciBtY250ID0gKEludGVnZXIpIHNlYXJjaE1hcC5nZXQobWVzc2FnZSk7CisgICAgICAgICAgICBJbnRlZ2VyIG1jbnQgPSBzZWFyY2hNYXAuZ2V0KG1lc3NhZ2UpOwogICAgICAgICAgICAgaWYgKG51bGwgIT0gbWNudCkgewotICAgICAgICAgICAgICAgIHNlYXJjaE1hcC5wdXQobWVzc2FnZSwgSW50ZWdlci52YWx1ZU9mKG1jbnQuaW50VmFsdWUoKSArIDEpKTsKKyAgICAgICAgICAgICAgICBzZWFyY2hNYXAucHV0KG1lc3NhZ2UsIG1jbnQgKyAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN1cGVyLm1lc3NhZ2VMb2dnZWQoZXZlbnQpOwogICAgICAgICB9CkBAIC01NDcsOSArNTQzLDkgQEAKICAgICAgICAgICogdG8gdGhlIGxvZwogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGludCBnZXRNYXRjaENvdW50KFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBJbnRlZ2VyIG1jbnQgPSAoSW50ZWdlcikgc2VhcmNoTWFwLmdldChtZXNzYWdlKTsKKyAgICAgICAgICAgIEludGVnZXIgbWNudCA9IHNlYXJjaE1hcC5nZXQobWVzc2FnZSk7CiAgICAgICAgICAgICBpZiAobnVsbCAhPSBtY250KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1jbnQuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWNudDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC02MTQsMTYgKzYxMCwxNSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25MYW5nKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uR29vZExhbmcoKSB7CiAgICAgICAgIGludFtdIGV4cGVjdGVkQ291bnRzID0gezEsIDEsIDAsIDAsIDAsIDAsIDF9OwogICAgICAgICBwZXJmb3JtQ29uZmlnVGVzdCgiY29uZmlndXJhdGlvbi5sYW5nLmdvb2QiLCBleHBlY3RlZENvdW50cyk7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwZXJmb3JtQ29uZmlnVGVzdCgiY29uZmlndXJhdGlvbi5sYW5nLmJhZCIsIGV4cGVjdGVkQ291bnRzKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIEV4cGVjdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBieCkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShieCBpbnN0YW5jZW9mIEJ1aWxkRXhjZXB0aW9uKTsKLSAgICAgICAgfQorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25CYWRMYW5nKCkgeworICAgICAgICBpbnRbXSBleHBlY3RlZENvdW50cyA9IHsxLCAxLCAwLCAwLCAwLCAwLCAxfTsKKyAgICAgICAgcGVyZm9ybUNvbmZpZ1Rlc3QoImNvbmZpZ3VyYXRpb24ubGFuZy5iYWQiLCBleHBlY3RlZENvdW50cyk7CiAgICAgfQogICAgIC8qKgogICAgICAqIFRlc3RzIHRoZSBzeXN0ZW1UeXBlS2V5IGF0dHJpYnV0ZS4KQEAgLTY0Niw5ICs2NDEsNyBAQAogICAgICAgICAgICAgICAgICJjdXN0b20gY29uZmlnOiBzZXJ2ZXIgbGFuZ3VhZ2UgY29kZSA9IGRlIgogICAgICAgICB9OwogICAgICAgICBMb2dDb3VudGVyIGNvdW50ZXIgPSBuZXcgTG9nQ291bnRlcigpOwotICAgICAgICBmb3IgKFN0cmluZyBtZXNzYWdlIDogbWVzc2FnZXMpIHsKLSAgICAgICAgICAgIGNvdW50ZXIuYWRkTG9nTWVzc2FnZVRvU2VhcmNoKG1lc3NhZ2UpOwotICAgICAgICB9CisgICAgICAgIEFycmF5cy5zdHJlYW0obWVzc2FnZXMpLmZvckVhY2goY291bnRlcjo6YWRkTG9nTWVzc2FnZVRvU2VhcmNoKTsKIAogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZEJ1aWxkTGlzdGVuZXIoY291bnRlcik7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwpAQCAtNzU3LDQyICs3NTAsMjkgQEAKIAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoU2VsZWN0b3JSZXRyeWFibGUxKCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFRhc2tEZWZpbml0aW9uKCJmdHAiLCBvbmVGYWlsdXJlRlRQLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBieCkgewotICAgICAgICAgICAgZmFpbCgiVHdvIHJldHJpZXMgZXhwZWN0ZWQsIGZhaWxlZCBhZnRlciBvbmUuIik7Ci0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJmdHAtZ2V0LXdpdGgtc2VsZWN0b3ItcmV0cnlhYmxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aFNlbGVjdG9yUmV0cnlhYmxlMigpIHsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRUYXNrRGVmaW5pdGlvbigiZnRwIiwgdHdvRmFpbHVyZUZUUC5jbGFzcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImZ0cC1nZXQtd2l0aC1zZWxlY3Rvci1yZXRyeWFibGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYngpIHsKLSAgICAgICAgICAgIGZhaWwoIlR3byByZXRyaWVzIGV4cGVjdGVkLCBmYWlsZWQgYWZ0ZXIgdHdvLiIpOwotICAgICAgICB9CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogVHdvIHJldHJpZXMgZXhwZWN0ZWQsIGNvbnRpbnVlZCBhZnRlciB0d28uCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aFNlbGVjdG9yUmV0cnlhYmxlMygpIHsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRUYXNrRGVmaW5pdGlvbigiZnRwIiwgdGhyZWVGYWlsdXJlRlRQLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOwotICAgICAgICAgICAgZmFpbCgiVHdvIHJldHJpZXMgZXhwZWN0ZWQsIGNvbnRpbnVlZCBhZnRlciB0d28uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJ4KSB7Ci0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KCJmdHAtZ2V0LXdpdGgtc2VsZWN0b3ItcmV0cnlhYmxlIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aFNlbGVjdG9yUmV0cnlhYmxlUmFuZG9tKCkgewogICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFRhc2tEZWZpbml0aW9uKCJmdHAiLCByYW5kb21GYWlsdXJlRlRQLmNsYXNzKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoImZ0cC5yZXRyaWVzIiwgImZvcmV2ZXIiKTsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZXhlY3V0ZVRhcmdldCgiZnRwLWdldC13aXRoLXNlbGVjdG9yLXJldHJ5YWJsZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBieCkgewotICAgICAgICAgICAgZmFpbCgiUmV0cnkgZm9yZXZlciBzcGVjaWZpZWQsIGJ1dCBmYWlsZWQuIik7Ci0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgiZnRwLnJldHJpZXMiLCAiZm9yZXZlciIpOworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmV4ZWN1dGVUYXJnZXQoImZ0cC1nZXQtd2l0aC1zZWxlY3Rvci1yZXRyeWFibGUiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtODA5LDEyICs3ODksOSBAQAogICAgICAgICBTdHJpbmdbXSBtZXNzYWdlcyA9IG5ldyBTdHJpbmdbXXsKICAgICAgICAgICAgICAgICAiRG9pbmcgU2l0ZSBDb21tYW5kOiB1bWFzayAyMjIiLAogICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaXNzdWUgU2l0ZSBDb21tYW5kOiB1bWFzayAyMjIiLAotCiAgICAgICAgIH07CiAgICAgICAgIExvZ0NvdW50ZXIgY291bnRlciA9IG5ldyBMb2dDb3VudGVyKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIG1lc3NhZ2UgOiBtZXNzYWdlcykgewotICAgICAgICAgICAgY291bnRlci5hZGRMb2dNZXNzYWdlVG9TZWFyY2gobWVzc2FnZSk7Ci0gICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnN0cmVhbShtZXNzYWdlcykuZm9yRWFjaChjb3VudGVyOjphZGRMb2dNZXNzYWdlVG9TZWFyY2gpOwogCiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkQnVpbGRMaXN0ZW5lcihjb3VudGVyKTsKICAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc2NyaXB0L1NjcmlwdERlZlRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmVGVzdC5qYXZhCmluZGV4IGJmYmEyOTguLjY2N2RiNDMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvU2NyaXB0RGVmVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNjcmlwdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0yNSwxMiArMjQsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIFRlc3RzIHRoZSBleGFtcGxlcyBvZiB0aGUgJmx0O3NjcmlwdGRlZiZndDsgdGFzay4KQEAgLTQyLDYgKzQzLDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zY3JpcHQvc2NyaXB0ZGVmLnhtbCIpOwpAQCAtNTIsMzQgKzU2LDMzIEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJzaW1wbGUiKTsKICAgICAgICAgLy8gZ2V0IHRoZSBmaWxlc2V0IGFuZCBpdHMgYmFzZWRpcgogICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwotICAgICAgICBGaWxlU2V0IGZpbGVzZXQgPSAoRmlsZVNldCkgcC5nZXRSZWZlcmVuY2UoInRlc3RmaWxlc2V0Iik7CisgICAgICAgIEZpbGVTZXQgZmlsZXNldCA9IHAuZ2V0UmVmZXJlbmNlKCJ0ZXN0ZmlsZXNldCIpOwogICAgICAgICBGaWxlIGJhc2VEaXIgPSBmaWxlc2V0LmdldERpcihwKTsKICAgICAgICAgU3RyaW5nIGxvZyA9IGJ1aWxkUnVsZS5nZXRMb2coKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSBwcmludGVkIiwKLSAgICAgICAgICAgICAgICBsb2cuY29udGFpbnMoIkF0dHJpYnV0ZSBhdHRyMSA9IHRlc3QiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG5lc3RlZCBlbGVtZW50IHZhbHVlIHByaW50ZWQiLAotICAgICAgICAgICAgICAgIGxvZy5jb250YWlucygiRmlsZXNldCBiYXNlZGlyID0gIiArIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSBwcmludGVkIiwgbG9nLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJBdHRyaWJ1dGUgYXR0cjEgPSB0ZXN0IikpOworICAgICAgICBhc3NlcnRUaGF0KCJFeHBlY3RpbmcgbmVzdGVkIGVsZW1lbnQgdmFsdWUgcHJpbnRlZCIsIGxvZywKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiRmlsZXNldCBiYXNlZGlyID0gIiArIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBsYWNraW5nIGxhbmd1YWdlIGF0dHJpYnV0ZQorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vTGFuZygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub2xhbmciKTsKLSAgICAgICAgICAgIGZhaWwoIkFic2VuY2Ugb2YgbGFuZ3VhZ2UgYXR0cmlidXRlIG5vdCBkZXRlY3RlZCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoInJlcXVpcmVzIGEgbGFuZ3VhZ2UgYXR0cmlidXRlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInJlcXVpcmVzIGEgbGFuZ3VhZ2UgYXR0cmlidXRlIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJub2xhbmciKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBsYWNraW5nIG5hbWUgYXR0cmlidXRlCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9OYW1lKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5vbmFtZSIpOwotICAgICAgICAgICAgZmFpbCgiQWJzZW5jZSBvZiBuYW1lIGF0dHJpYnV0ZSBub3QgZGV0ZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJzY3JpcHRkZWYgcmVxdWlyZXMgYSBuYW1lIGF0dHJpYnV0ZSIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJzY3JpcHRkZWYgcmVxdWlyZXMgYSBuYW1lIGF0dHJpYnV0ZSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibm9uYW1lIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg3LDE0ICs5MCwxMyBAQAogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibmVzdGVkYnljbGFzc25hbWUiKTsKICAgICAgICAgLy8gZ2V0IHRoZSBmaWxlc2V0IGFuZCBpdHMgYmFzZWRpcgogICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwotICAgICAgICBGaWxlU2V0IGZpbGVzZXQgPSAoRmlsZVNldCkgcC5nZXRSZWZlcmVuY2UoInRlc3RmaWxlc2V0Iik7CisgICAgICAgIEZpbGVTZXQgZmlsZXNldCA9IHAuZ2V0UmVmZXJlbmNlKCJ0ZXN0ZmlsZXNldCIpOwogICAgICAgICBGaWxlIGJhc2VEaXIgPSBmaWxlc2V0LmdldERpcihwKTsKICAgICAgICAgU3RyaW5nIGxvZyA9IGJ1aWxkUnVsZS5nZXRMb2coKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBwcmludGVkIiwKLSAgICAgICAgICAgICAgICBsb2cuY29udGFpbnMoIkF0dHJpYnV0ZSBhdHRyMSA9IHRlc3QiKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0aW5nIG5lc3RlZCBlbGVtZW50IHZhbHVlIHRvIGJlIHByaW50ZWQiLAotICAgICAgICAgICAgICAgIGxvZy5jb250YWlucygiRmlsZXNldCBiYXNlZGlyID0gIiArIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSB0byBiZSBwcmludGVkIiwgbG9nLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJBdHRyaWJ1dGUgYXR0cjEgPSB0ZXN0IikpOworICAgICAgICBhc3NlcnRUaGF0KCJFeHBlY3RpbmcgbmVzdGVkIGVsZW1lbnQgdmFsdWUgdG8gYmUgcHJpbnRlZCIsIGxvZywKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiRmlsZXNldCBiYXNlZGlyID0gIiArIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTA1LDQwICsxMDcsNzUgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbigpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJleGNlcHRpb24iKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gaW4gdGhlIHNjcmlwdCIpOwotICAgICAgICB9IGNhdGNoKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoIlR5cGVFcnJvciIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUeXBlRXJyb3IiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImV4Y2VwdGlvbiIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERvdWJsZURlZigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRvdWJsZWRlZiIpOwogICAgICAgICBTdHJpbmcgbG9nID0gYnVpbGRSdWxlLmdldExvZygpOwotICAgICAgICBhc3NlcnRUcnVlKCJUYXNrMSBkaWQgbm90IGV4ZWN1dGUiLCBsb2cuY29udGFpbnMoIlRhc2sxIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJUYXNrMiBkaWQgbm90IGV4ZWN1dGUiLCBsb2cuY29udGFpbnMoIlRhc2syIikpOworICAgICAgICBhc3NlcnRUaGF0KCJUYXNrMSBkaWQgbm90IGV4ZWN1dGUiLCBsb2csIGNvbnRhaW5zU3RyaW5nKCJUYXNrMSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVGFzazIgZGlkIG5vdCBleGVjdXRlIiwgbG9nLCBjb250YWluc1N0cmluZygiVGFzazIiKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gZHVwbGljYXRlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlQXR0cmlidXRlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImRvdWJsZUF0dHJpYnV0ZURlZiIpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgZGV0ZWN0ZWQgZHVwbGljYXRlIGF0dGlyYnV0ZSBkZWZpbml0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2goQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiYXR0cjEgYXR0cmlidXRlIG1vcmUgdGhhbiBvbmNlIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImF0dHIxIGF0dHJpYnV0ZSBtb3JlIHRoYW4gb25jZSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZG91YmxlQXR0cmlidXRlRGVmIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHkoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJwcm9wZXJ0eSIpOwotICAgICAgICAvLyBnZXQgdGhlIGZpbGVzZXQgYW5kIGl0cyBiYXNlZGlyCi0gICAgICAgIFN0cmluZyBsb2cgPSBidWlsZFJ1bGUuZ2V0TG9nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGluZyBwcm9wZXJ0eSBpbiBhdHRyaWJ1dGUgdmFsdWUgcmVwbGFjZWQiLAotICAgICAgICAgICAgICAgIGxvZy5jb250YWlucygiQXR0cmlidXRlIHZhbHVlID0gdGVzdCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0aW5nIHByb3BlcnR5IGluIGF0dHJpYnV0ZSB2YWx1ZSByZXBsYWNlZCIsCisgICAgICAgICAgICAgICAgYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiQXR0cmlidXRlIHZhbHVlID0gdGVzdCIpKTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VTcmNBbmRFbmNvZGluZygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlYWRlckVuY29kaW5nID0gIlVURi04IjsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5zZXRQcm9wZXJ0eSgidXNlU3JjQW5kRW5jb2RpbmcucmVhZGVyLmVuY29kaW5nIiwgcmVhZGVyRW5jb2RpbmcpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlU3JjQW5kRW5jb2RpbmciKTsKKyAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VTcmNBbmRFbmNvZGluZ0ZhaWx1cmUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiZXhwZWN0ZWQgPGVhY3V0ZSBbXHUwMGU5XT4gYnV0IHdhcyA8ZWFjdXRlIFtcdTAwYzNcdTAwYTldPiIpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVhZGVyRW5jb2RpbmcgPSAiSVNPLTg4NTktMSI7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuc2V0UHJvcGVydHkoInVzZVNyY0FuZEVuY29kaW5nLnJlYWRlci5lbmNvZGluZyIsIHJlYWRlckVuY29kaW5nKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVzZVNyY0FuZEVuY29kaW5nIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlQ29tcGlsZWQoKSB7CisKKyAgICAgICAgZmluYWwgbG9uZyBkdXJhdGlvbjsKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInVzZUNvbXBpbGVkIik7CisgICAgICAgICAgICBkdXJhdGlvbiA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBsb25nIG5vdENvbXBpbGVkRHVyYXRpb247CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ1c2VOb3RDb21waWxlZCIpOworICAgICAgICAgICAgbm90Q29tcGlsZWREdXJhdGlvbiA9IFN5c3RlbS5uYW5vVGltZSgpIC0gc3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiQ29tcGlsZWQgc2NyaXB0cyBzaG91bGQgcnVuIGZhc3RlciAoJWQgbnMpIHRoYW4gbm90IGNvbXBpbGVkICglZCBucykgc2NyaXB0cy4iLAorICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBub3RDb21waWxlZER1cmF0aW9uCisJICAgICAgICApLCAKKyAgICAgICAgICAgIGR1cmF0aW9uIDwgbm90Q29tcGlsZWREdXJhdGlvbgorICAgICAgICApOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zb3MvU09TVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NUZXN0LmphdmEKaW5kZXggM2U4Y2FmNS4uYjY4NzVkMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9TT1NUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yOCw5ICsyOCw5IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiAgVGVzdGNhc2UgdG8gZW5zdXJlIHRoYXQgY29tbWFuZCBsaW5lIGdlbmVyYXRpb24gYW5kIHJlcXVpcmVkIGF0dHJpYnV0ZXMgYXJlCkBAIC01NSw3ICs1NSwxMSBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjAwNyI7CiAKICAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKICAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKIAogICAgIEBCZWZvcmUKQEAgLTEzNiwxMCArMTQwLDEwIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC4xIiwgInNvbWUgY2F1c2UiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC4yIiwgInNvbWUgY2F1c2UiLCAidXNlcm5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NnZXQuMyIsICJzb21lIGNhdXNlIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NnZXQuNCIsICJzb21lIGNhdXNlIiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zZ2V0LjEiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC4yIiwgInVzZXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zZ2V0LjMiLCAidnNzc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2dldC40IiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKICAgICB9CiAKICAgICAvKiogIFRlc3QgQ2hlY2tJbkZpbGUgb3B0aW9uIGZsYWdzICAqLwpAQCAtMjA1LDEwICsyMDksMTAgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luRXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNraW4uMSIsICJzb21lIGNhdXNlIiwgInNvc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja2luLjIiLCAic29tZSBjYXVzZSIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNraW4uMyIsICJzb21lIGNhdXNlIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja2luLjQiLCAic29tZSBjYXVzZSIsICJwcm9qZWN0cGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNraW4uMSIsICJzb3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tpbi4yIiwgInVzZXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tpbi4zIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja2luLjQiLCAicHJvamVjdHBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdCBDaGVja091dEZpbGUgb3B0aW9uIGZsYWdzICAqLwpAQCAtMjcyLDEwICsyNzYsMTAgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja291dEV4Y2VwdGlvbnMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC9zb3Mvc29zLnhtbCIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NjaGVja291dC4xIiwgInNvbWUgY2F1c2UiLCAic29zc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjIiLCAic29tZSBjYXVzZSIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjMiLCAic29tZSBjYXVzZSIsICJ2c3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tvdXQuNCIsICJzb21lIGNhdXNlIiwgInByb2plY3RwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tvdXQuMSIsICJzb3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zY2hlY2tvdXQuMiIsICJ1c2VybmFtZSBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjMiLCAidnNzc2VydmVycGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2NoZWNrb3V0LjQiLCAicHJvamVjdHBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdCBMYWJlbCBvcHRpb24gZmxhZ3MgICovCkBAIC0zMDgsMjEgKzMxMiwxOCBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExhYmVsRXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Nvcy9zb3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2xhYmVsLjEiLCAic29tZSBjYXVzZSIsICJzb3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuMiIsICJzb21lIGNhdXNlIiwgInVzZXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuMyIsICJzb21lIGNhdXNlIiwgInZzc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NsYWJlbC40IiwgInNvbWUgY2F1c2UiLCAicHJvamVjdHBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NsYWJlbC41IiwgInNvbWUgY2F1c2UiLCAibGFiZWwgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NsYWJlbC4xIiwgInNvc3NlcnZlcnBhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJzb3NsYWJlbC4yIiwgInVzZXJuYW1lIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuMyIsICJ2c3NzZXJ2ZXJwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigic29zbGFiZWwuNCIsICJwcm9qZWN0cGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInNvc2xhYmVsLjUiLCAibGFiZWwgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBlcnJvck1lc3NhZ2UsCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oU3RyaW5nIHRhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXhjZXB0aW9uTWVzc2FnZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKLSAgICAgICAgICAgIGZhaWwoZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleGNlcHRpb25NZXNzYWdlLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShleGNlcHRpb25NZXNzYWdlKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQodGFyZ2V0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTMzNCwxOCArMzM1LDEwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29tbWFuZExpbmVzKFN0cmluZ1tdIHNUZXN0Q21kTGluZSwgU3RyaW5nW10gc0dlbmVyYXRlZENtZExpbmUpIHsKICAgICAgICAgaW50IGxlbmd0aCA9IHNUZXN0Q21kTGluZS5sZW5ndGg7CisgICAgICAgIGFzc2VydEVxdWFscygibnVtYmVyIG9mIGFyZ3VtZW50cyBkb2Vzbid0IG1hdGNoIiwgbGVuZ3RoLCBzR2VuZXJhdGVkQ21kTGluZS5sZW5ndGgpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiYXJnICMgIiArIFN0cmluZy52YWx1ZU9mKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgc1Rlc3RDbWRMaW5lW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgc0dlbmVyYXRlZENtZExpbmVbaV0pOwotICAgICAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGFpb29iKSB7Ci0gICAgICAgICAgICAgICAgZmFpbCgibWlzc2luZyBhcmcgIiArIHNUZXN0Q21kTGluZVtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNHZW5lcmF0ZWRDbWRMaW5lLmxlbmd0aCA+IHNUZXN0Q21kTGluZS5sZW5ndGgpIHsKLSAgICAgICAgICAgIC8vIFdlIGhhdmUgZXh0cmEgZWxlbWVudHMKLSAgICAgICAgICAgIGZhaWwoImV4dHJhIGFyZ3MiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYXJnICMgIiArIFN0cmluZy52YWx1ZU9mKGkpLAorICAgICAgICAgICAgICAgICAgICBzVGVzdENtZExpbmVbaV0sIHNHZW5lcmF0ZWRDbWRMaW5lW2ldKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zcGxhc2gvU3BsYXNoU2NyZWVuVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW5UZXN0LmphdmEKaW5kZXggZGZlYzlmNS4uZjQ2MGZjMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW5UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3NwbGFzaC9TcGxhc2hTY3JlZW5UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvc3NoL1NjcFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVGVzdC5qYXZhCmluZGV4IDFjMmExN2QuLjgzMjUyMGYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC9zc2gvU2NwVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzksNyArMzksNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZU5vdE51bGw7CiAKIC8qKgogICogVGhpcyBpcyBhIHVuaXQgdGVzdCBmb3IgdGhlIFNjcCB0YXNrIGluIEFudC4gIEl0IG11c3QgYmUKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBwcml2YXRlIGludCBwb3J0ID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoInNjcC5wb3J0IiwgIjIyIikpOwogICAgIHByaXZhdGUgU3RyaW5nIGtub3duSG9zdHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNjcC5rbm93bi5ob3N0cyIpOwogCi0gICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGNsZWFuVXBMaXN0ID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOworICAgIHByaXZhdGUgTGlzdDxGaWxlPiBjbGVhblVwTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewpAQCAtNzgsMTMgKzc4LDEyIEBACiAKICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLSAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBjbGVhblVwTGlzdCkgewotICAgICAgICAgICAgZmlsZS5kZWxldGUoKTsKLSAgICAgICAgfQorICAgICAgICBjbGVhblVwTGlzdC5mb3JFYWNoKEZpbGU6OmRlbGV0ZSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRmlsZVVwbG9hZEFuZERvd25sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lTm90TnVsbCgic3lzdGVtIHByb3BlcnR5IHNjcC5ob3N0IG11c3QgYmUgc2V0Iiwgc3NoSG9zdFVyaSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoInN5c3RlbSBwcm9wZXJ0eSBzY3AudG1wIG11c3QgYmUgc2V0IiwgdGVtcERpcik7CiAgICAgICAgIEZpbGUgdXBsb2FkRmlsZSA9IGNyZWF0ZVRlbXBvcmFyeUZpbGUoKTsKIApAQCAtMTEwLDggKzEwOSw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVVwbG9hZEFuZERvd25sb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lTm90TnVsbCgic3lzdGVtIHByb3BlcnR5IHNjcC5ob3N0IG11c3QgYmUgc2V0Iiwgc3NoSG9zdFVyaSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoInN5c3RlbSBwcm9wZXJ0eSBzY3AudG1wIG11c3QgYmUgc2V0IiwgdGVtcERpcik7Ci0gICAgICAgIExpc3Q8RmlsZT4gdXBsb2FkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKKyAgICAgICAgTGlzdDxGaWxlPiB1cGxvYWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgICAgICB1cGxvYWRMaXN0LmFkZChjcmVhdGVUZW1wb3JhcnlGaWxlKCkpOwogICAgICAgICB9CkBAIC0xNDYsOCArMTQ2LDkgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpUmVzb3VyY2VDb2xsZWN0aW9uVXBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzdW1lTm90TnVsbCgic3lzdGVtIHByb3BlcnR5IHNjcC5ob3N0IG11c3QgYmUgc2V0Iiwgc3NoSG9zdFVyaSk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoInN5c3RlbSBwcm9wZXJ0eSBzY3AudG1wIG11c3QgYmUgc2V0IiwgdGVtcERpcik7Ci0gICAgICAgIExpc3QgdXBsb2FkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxGaWxlPiB1cGxvYWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAgICAgICAgICAgICB1cGxvYWRMaXN0LmFkZChjcmVhdGVUZW1wb3JhcnlGaWxlKCkpOwogICAgICAgICB9CkBAIC0xNzIsMjIgKzE3MywxNyBAQAogICAgICAgICBzY3BUYXNrLmV4ZWN1dGUoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBpbnZhbGlkIHJlbW90ZVRvRGlyCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBCdWlsZEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFJlbW90ZVRvRGlyKCkgeworICAgICAgICBzY3BUYXNrLnNldFJlbW90ZVRvZGlyKCJob3N0Oi9hL3BhdGgvd2l0aG91dC9hbi9hdCIpOworICAgIH0KKwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlbW90ZVRvRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgICAgICAvLyBmaXJzdCB0cnkgYW4gaW52YWxpZCBVUkkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNjcFRhc2suc2V0UmVtb3RlVG9kaXIoImhvc3Q6L2EvcGF0aC93aXRob3V0L2FuL2F0Iik7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIEJ1aWxkRXhjZXB0aW9uIHRvIGJlIHRocm93biBkdWUgdG8gaW52YWxpZCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHJlbW90ZVRvRGlyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgICAgICAvL1RPRE8gd2Ugc2hvdWxkIGJlIGFzc2VydGluZyBhIHZhbHVlIGluIGhlcmUKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFuZCB0aGlzIG9uZSBzaG91bGQgd29yaworICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdGVUb0RpcigpIHsKICAgICAgICAgc2NwVGFzay5zZXRSZW1vdGVUb2RpcigidXNlcjpwYXNzd29yZEBob3N0Oi9hL3BhdGgvd2l0aC9hbi9hdCIpOwotICAgICAgICAvLyBubyBleGNlcHRpb24KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYWRkQ2xlYW51cChGaWxlIGZpbGUpIHsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmtUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9TeW1saW5rVGVzdC5qYXZhCmluZGV4IGI1ZjRiYmYuLjhkM2I1NzQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC91bml4L1N5bWxpbmtUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3VuaXgvU3ltbGlua1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM1LDE3ICszNSwyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5TeW1ib2xpY0xpbmtVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogCiAvKioKICAqIFRlc3QgY2FzZXMgZm9yIHRoZSBTeW1saW5rIHRhc2suIExpbmsgY3JlYXRpb24sIGxpbmsgZGVsZXRpb24sIHJlY29yZGluZwpAQCAtNjEsMTEgKzY1LDkgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLSAgICBwcml2YXRlIGJvb2xlYW4gc3VwcG9ydHNTeW1saW5rcyA9IE9zLmlzRmFtaWx5KCJ1bml4Iik7Ci0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJTeW1saW5rcyBub3Qgc3VwcG9ydGVkIG9uIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSIsIHN1cHBvcnRzU3ltbGlua3MpOworICAgICAgICBhc3N1bWVUcnVlKCJTeW1saW5rcyBub3Qgc3VwcG9ydGVkIG9uIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSIsIE9zLmlzRmFtaWx5KCJ1bml4IikpOwogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdW5peC9zeW1saW5rLnhtbCIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgic2V0VXAiKTsKICAgICB9CkBAIC04NCwxMiArODYsMTAgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1kZWxldGUiKTsKICAgICAgICAgUHJvamVjdCBwID0gYnVpbGRSdWxlLmdldFByb2plY3QoKTsKLSAgICAgICAgU3RyaW5nIGxpbmtEZWxldGVkID0gcC5nZXRQcm9wZXJ0eSgidGVzdC5kZWxldGUubGluay5zdGlsbC50aGVyZSIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJBY3R1YWwgZmlsZSBkZWxldGVkIGJ5IHN5bWxpbmsiLAogICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QuZGVsZXRlLmZpbGUuc3RpbGwudGhlcmUiKSk7Ci0gICAgICAgIGlmIChsaW5rRGVsZXRlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKGxpbmtEZWxldGVkKTsKLSAgICAgICAgfQorICAgICAgICBTdHJpbmcgbGlua0RlbGV0ZWQgPSBwLmdldFByb3BlcnR5KCJ0ZXN0LmRlbGV0ZS5saW5rLnN0aWxsLnRoZXJlIik7CisgICAgICAgIGFzc2VydE51bGwobGlua0RlbGV0ZWQsIGxpbmtEZWxldGVkKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTQwLDExICsxNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjb3JkLmRpcjIucmVjb3JkZWQiKSk7CiAKICAgICAgICAgU3RyaW5nIGRpcjNyZWMgPSBwLmdldFByb3BlcnR5KCJ0ZXN0LnJlY29yZC5kaXIzLnJlY29yZGVkIik7Ci0KLSAgICAgICAgaWYgKGRpcjNyZWMgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbChkaXIzcmVjKTsKLSAgICAgICAgfQotCisgICAgICAgIGFzc2VydE51bGwoZGlyM3JlYywgZGlyM3JlYyk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE1NSwxOCArMTUxLDEyIEBACiAgICAgICAgIFN0cmluZyBsaW5rMlJlbSA9IHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUubGluazIubm90LnJlbW92ZWQiKTsKICAgICAgICAgU3RyaW5nIGxpbmszUmVtID0gcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNyZWF0ZS5saW5rMy5ub3QucmVtb3ZlZCIpOwogICAgICAgICBTdHJpbmcgZGlybGlua1JlbSA9IHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluay5ub3QucmVtb3ZlZCIpOwotICAgICAgICBpZiAobGluazFSZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbChsaW5rMVJlbSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxpbmsyUmVtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZhaWwobGluazJSZW0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsaW5rM1JlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKGxpbmszUmVtKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGlybGlua1JlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmYWlsKGRpcmxpbmtSZW0pOwotICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0TnVsbChsaW5rMVJlbSwgbGluazFSZW0pOworICAgICAgICBhc3NlcnROdWxsKGxpbmsyUmVtICxsaW5rMlJlbSk7CisgICAgICAgIGFzc2VydE51bGwobGluazNSZW0gLGxpbmszUmVtKTsKKyAgICAgICAgYXNzZXJ0TnVsbChkaXJsaW5rUmVtICxkaXJsaW5rUmVtKTsKKwogICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjcmVhdGUgbGluazEiLAogICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUubGluazEucmVjcmVhdGVkIikpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJGYWlsZWQgdG8gcmVjcmVhdGUgbGluazIiLApAQCAtMTc3LDEwICsxNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInRlc3QucmVjcmVhdGUuZGlybGluay5yZWNyZWF0ZWQiKSk7CiAKICAgICAgICAgU3RyaW5nIGRvdWJsZVJlY3JlYXRlID0gcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNyZWF0ZS5kaXJsaW5rMi5yZWNyZWF0ZWQudHdpY2UiKTsKLQotICAgICAgICBpZiAoZG91YmxlUmVjcmVhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZmFpbChkb3VibGVSZWNyZWF0ZSk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChkb3VibGVSZWNyZWF0ZSwgZG91YmxlUmVjcmVhdGUpOwogCiAgICAgICAgIGFzc2VydE5vdE51bGwoIkZhaWxlZCB0byBhbHRlciBkaXJsaW5rMyIsCiAgICAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgidGVzdC5yZWNyZWF0ZS5kaXJsaW5rMy53YXMuYWx0ZXJlZCIpKTsKQEAgLTI2OSw4ICsyNTYsOCBAQAogICAgICAgICBhc3NlcnRGYWxzZShmLmV4aXN0cygpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5pc0RpcmVjdG9yeSgpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5pc0ZpbGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc3UuaXNTeW1ib2xpY0xpbmsoZi5nZXRBYnNvbHV0ZVBhdGgoKSkgPT0gZmFsc2UpOwotICAgICAgICBhc3NlcnRUcnVlKHN1LmlzU3ltYm9saWNMaW5rKGYuZ2V0UGFyZW50RmlsZSgpLCBmLmdldE5hbWUoKSkgPT0gZmFsc2UpOworICAgICAgICBhc3NlcnRGYWxzZShzdS5pc1N5bWJvbGljTGluayhmLmdldEFic29sdXRlUGF0aCgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHN1LmlzU3ltYm9saWNMaW5rKGYuZ2V0UGFyZW50RmlsZSgpLCBmLmdldE5hbWUoKSkpOwogICAgICAgICBhc3NlcnRUcnVlKHN1LmlzRGFuZ2xpbmdTeW1ib2xpY0xpbmsoZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOwogICAgICAgICBhc3NlcnRUcnVlKHN1LmlzRGFuZ2xpbmdTeW1ib2xpY0xpbmsoZi5nZXRQYXJlbnRGaWxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmdldE5hbWUoKSkpOwpAQCAtMjc5LDE0ICsyNjYsMzMgQEAKICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuaXNEaXJlY3RvcnkoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGYuaXNGaWxlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHN1LmlzU3ltYm9saWNMaW5rKGYuZ2V0QWJzb2x1dGVQYXRoKCkpID09IGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzdS5pc1N5bWJvbGljTGluayhmLmdldFBhcmVudEZpbGUoKSwgZi5nZXROYW1lKCkpID09IGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3UuaXNTeW1ib2xpY0xpbmsoZi5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICBhc3NlcnRGYWxzZShzdS5pc1N5bWJvbGljTGluayhmLmdldFBhcmVudEZpbGUoKSwgZi5nZXROYW1lKCkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzdS5pc0RhbmdsaW5nU3ltYm9saWNMaW5rKGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzdS5pc0RhbmdsaW5nU3ltYm9saWNMaW5rKGYuZ2V0UGFyZW50RmlsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5nZXROYW1lKCkpKTsKIAogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgd2hlbiB7QGNvZGUgc3ltbGlua30gdGFzayBpcyB1c2VkIHRvIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgYW5kIHtAY29kZSBvdmVyd3JpdGV9IG9wdGlvbgorICAgICAqIGlzIHtAY29kZSBmYWxzZX0sIHRoZW4gYW55IGV4aXN0aW5nIHN5bWJvbGljIGxpbmsgYXQgdGhlIHtAY29kZSBsaW5rfSBsb2NhdGlvbiAod2hvc2UgdGFyZ2V0IGlzIGEgZGlyZWN0b3J5KQorICAgICAqIGRvZXNuJ3QgZW5kIHVwIGNyZWF0ZSBhIG5ldyBzeW1ib2xpYyBsaW5rIHdpdGhpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTU4NjgzIj5CWi01ODY4MzwvYT4gZm9yIG1vcmUgZGV0YWlscworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJ3cml0ZUV4aXN0aW5nTGluaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1vdmVyd3JpdGUtbGluayIpOworICAgICAgICBmaW5hbCBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgbGlua1RhcmdldFJlc291cmNlID0gcC5nZXRQcm9wZXJ0eSgidGVzdC5vdmVyd3JpdGUubGluay50YXJnZXQuZGlyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IHRlc3Qub3ZlcndyaXRlLmxpbmsudGFyZ2V0LmRpciBpcyBub3Qgc2V0IiwgbGlua1RhcmdldFJlc291cmNlKTsKKyAgICAgICAgZmluYWwgUGF0aCB0YXJnZXRSZXNvdXJjZVBhdGggPSBQYXRocy5nZXQobGlua1RhcmdldFJlc291cmNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXRSZXNvdXJjZVBhdGggKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSIsIEZpbGVzLmlzRGlyZWN0b3J5KHRhcmdldFJlc291cmNlUGF0aCkpOworICAgICAgICBhc3NlcnRFcXVhbHModGFyZ2V0UmVzb3VyY2VQYXRoICsgIiBkaXJlY3Rvcnkgd2FzIGV4cGVjdGVkIHRvIGJlIGVtcHR5IiwgMCwgRmlsZXMubGlzdCh0YXJnZXRSZXNvdXJjZVBhdGgpLmNvdW50KCkpOworICAgIH0KKwogICAgIEBBZnRlcgogICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewogICAgICAgICBpZiAoYnVpbGRSdWxlLmdldFByb2plY3QoKSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy9NU1ZTU1Rlc3QuamF2YQppbmRleCA1ZDI3ZjU3Li41Y2E0ZjNiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdGFza2RlZnMvb3B0aW9uYWwvdnNzL01TVlNTVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9vcHRpb25hbC92c3MvTVNWU1NUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwpAQCAtMzQsOSArMzUsMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgogICogIFRlc3RjYXNlIHRvIGVuc3VyZSB0aGF0IGNvbW1hbmQgbGluZSBnZW5lcmF0aW9uIGFuZCByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBjb3JyZWN0LgpAQCAtNjQsNiArNjcsOSBAQAogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwpAQCAtMTE0LDcgKzEyMCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2dldC4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2dldC4xIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdHMgTGFiZWwgY29tbWFuZGxpbmUgZ2VuZXJhdGlvbi4gICovCkBAIC0xNjcsOCArMTczLDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RMYWJlbEV4Y2VwdGlvbnMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC92c3MvdnNzLnhtbCIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NsYWJlbC4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2xhYmVsLjIiLCAic29tZSBjYXVzZSIsICJsYWJlbCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2xhYmVsLjEiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2xhYmVsLjIiLCAibGFiZWwgYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdHMgVlNTSGlzdG9yeSBjb21tYW5kbGluZSBnZW5lcmF0aW9uIHdpdGggZnJvbSBsYWJlbC4gICovCkBAIC0yNjEsMTcgKzI2NywxMyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEhpc3RvcnlFeGNlcHRpb25zKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzaGlzdG9yeS4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2hpc3RvcnkuMSIsICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZmFpbE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICBmYWlsKGZhaWxNZXNzYWdlKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleGNlcHRpb25NZXNzYWdlLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGV4Y2VwdGlvbk1lc3NhZ2UpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKGV4Y2VwdGlvbk1lc3NhZ2UpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdHMgQ2hlY2tJbiBjb21tYW5kbGluZSBnZW5lcmF0aW9uLiAgKi8KQEAgLTMwMSw3ICszMDMsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENoZWNraW5FeGNlcHRpb25zKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tpbi4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2NoZWNraW4uMSIsICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKICAgICB9CiAKICAgICAvKiogIFRlc3RzIENoZWNrT3V0IGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLwpAQCAtMzM3LDggKzMzOSw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tvdXRFeGNlcHRpb25zKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tvdXQuMSIsICJzb21lIGNhdXNlIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwotICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NjaGVja291dC4yIiwgInNvbWUgY2F1c2UiLCAiYmxhaCBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tvdXQuMSIsICJ2c3NwYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY2hlY2tvdXQuMiIsICJibGFoIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdHMgQWRkIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLwpAQCAtMzcwLDcgKzM3Miw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2FkZC4xIiwgInNvbWUgY2F1c2UiLCAibG9jYWxQYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKKyAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzYWRkLjEiLCAibG9jYWxQYXRoIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCEiKTsKICAgICB9CiAKICAgICAvKiogIFRlc3RzIENQIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLwpAQCAtMzk3LDcgKzM5OSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3BFeGNlcHRpb25zKCkgewogICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwvdnNzL3Zzcy54bWwiKTsKLSAgICAgICAgZXhwZWN0U3BlY2lmaWNCdWlsZEV4Y2VwdGlvbigidnNzY3AuMSIsICJzb21lIGNhdXNlIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOworICAgICAgICBleHBlY3RTcGVjaWZpY0J1aWxkRXhjZXB0aW9uKCJ2c3NjcC4xIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKiAgVGVzdHMgQ3JlYXRlIGNvbW1hbmRsaW5lIGdlbmVyYXRpb24uICAqLwpAQCAtNDI4LDcgKzQzMCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRXhjZXB0aW9ucygpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3Zzcy92c3MueG1sIik7Ci0gICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2NyZWF0ZS4xIiwgInNvbWUgY2F1c2UiLCAidnNzcGF0aCBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQhIik7CisgICAgICAgIGV4cGVjdFNwZWNpZmljQnVpbGRFeGNlcHRpb24oInZzc2NyZWF0ZS4xIiwgInZzc3BhdGggYXR0cmlidXRlIG11c3QgYmUgc2V0ISIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNDQ0LDMxICs0NDYsMjAgQEAKICAgICAgICAgaW50IHRlc3RJbmRleCA9IDA7CiAKICAgICAgICAgd2hpbGUgKHRlc3RJbmRleCA8IHRlc3RMZW5ndGgpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNHZW5lcmF0ZWRDbWRMaW5lW2dlbkluZGV4XS5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdlbkluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImFyZyAjICIgKyB0ZXN0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzVGVzdENtZExpbmVbdGVzdEluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNHZW5lcmF0ZWRDbWRMaW5lW2dlbkluZGV4XSk7Ci0gICAgICAgICAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgICAgICBpZiAoc0dlbmVyYXRlZENtZExpbmVbZ2VuSW5kZXhdLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGdlbkluZGV4Kys7Ci0gICAgICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gYWlvb2IpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJtaXNzaW5nIGFyZyAiICsgc1Rlc3RDbWRMaW5lW3Rlc3RJbmRleF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgibWlzc2luZyBhcmcgIiArIHNUZXN0Q21kTGluZVt0ZXN0SW5kZXhdLCBnZW5JbmRleCA8IGdlbkxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImFyZyAjICIgKyB0ZXN0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHNUZXN0Q21kTGluZVt0ZXN0SW5kZXhdLCBzR2VuZXJhdGVkQ21kTGluZVtnZW5JbmRleF0pOworICAgICAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgICAgICBnZW5JbmRleCsrOwogICAgICAgICB9CiAKICAgICAgICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBlbXB0eSBzdHJpbmdzCi0gICAgICAgIGludCBjbnQgPSAwOwotICAgICAgICBmb3IgKFN0cmluZyBhcmd1bWVudCA6IHNHZW5lcmF0ZWRDbWRMaW5lKSB7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnQuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGNudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChnZW5MZW5ndGggLSBjbnQgPiBzVGVzdENtZExpbmUubGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBXZSBoYXZlIGV4dHJhIGVsZW1lbnRzCi0gICAgICAgICAgICBmYWlsKCJleHRyYSBhcmdzIik7Ci0gICAgICAgIH0KKyAgICAgICAgaW50IGNudCA9IChpbnQpIEFycmF5cy5zdHJlYW0oc0dlbmVyYXRlZENtZExpbmUpLmZpbHRlcihTdHJpbmc6OmlzRW1wdHkpLmNvdW50KCk7CisgICAgICAgIC8vIFdlIGhhdmUgZXh0cmEgZWxlbWVudHMKKyAgICAgICAgYXNzZXJ0RmFsc2UoImV4dHJhIGFyZ3MiLCBnZW5MZW5ndGggLSBjbnQgPiBzVGVzdENtZExpbmUubGVuZ3RoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWJzdHJhY3RGaWxlU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fic3RyYWN0RmlsZVNldFRlc3QuamF2YQppbmRleCBhMDI1YjJiLi4yNGY2NDQ5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWJzdHJhY3RGaWxlU2V0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BYnN0cmFjdEZpbGVTZXRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywxMCArMjMsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogQmFzZSBjbGFzcyBmb3IgRmlsZVNldFRlc3QgYW5kIERpclNldFRlc3QuCkBAIC0zOSwxMCArNDAsMTYgQEAKIAogICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwogCisgICAgcHJpdmF0ZSBBYnN0cmFjdEZpbGVTZXQgZjsKKworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgICAgICBmID0gZ2V0SW5zdGFuY2UoKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQWJzdHJhY3RGaWxlU2V0IGdldEluc3RhbmNlKCk7CkBAIC01MiwyMTYgKzU5LDE4NyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIEFic3RyYWN0RmlsZVNldCBmID0gZ2V0SW5zdGFuY2UoKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2Fubm90U2V0SW5jbHVkZXNUaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOwogICAgICAgICBmLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvICIKLSAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiB3aXRoIGVsZW1lbnRzIGZyb20gc2V0SW5jbHVkZXMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGYuY3JlYXRlUGF0dGVyblNldCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gIgotICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIHdpdGggbmVzdGVkIHBhdHRlcm5zZXQgZWxlbWVudC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBmLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvICIKLSAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiB3aXRoIG5lc3RlZCBpbmNsdWRlIGVsZW1lbnQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgaW5jbHVkZXMgaW4gIgotICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRJbmNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBpbmNsdWRlc2ZpbGUgaW4gIgotICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJ3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRFeGNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGV4Y2x1ZGVzIGluICIKLSAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RXhjbHVkZXNmaWxlKG5ldyBGaWxlKCIvYSIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgZXhjbHVkZXNmaWxlIGluICIKLSAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGRpciBpbiAiCi0gICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGluY2x1ZGUgaW4gIgotICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJyZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuY3JlYXRlRXhjbHVkZSgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgZXhjbHVkZSBpbiAiCi0gICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGluY2x1ZGVzZmlsZSBpbiAiCi0gICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGV4Y2x1ZGVzZmlsZSBpbiAiCi0gICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5jcmVhdGVQYXR0ZXJuU2V0KCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBwYXR0ZXJuc2V0IGluICIKLSAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAicmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYgPSBnZXRJbnN0YW5jZSgpOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDYW5ub3RBZGRQYXR0ZXJuU2V0VGhlblJlZmlkKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIGYuY3JlYXRlUGF0dGVyblNldCgpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2Fubm90QWRkSW5jbHVkZVRoZW5SZWZpZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIGYuY3JlYXRlSW5jbHVkZSgpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2Fubm90U2V0UmVmaWRUaGVuSW5jbHVkZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENhbm5vdFNldFJlZmlkVGhlbkluY2x1ZGVzZmlsZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgZi5zZXRJbmNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENhbm5vdFNldFJlZmlkVGhlbkV4Y2x1ZGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBmLnNldEV4Y2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDYW5ub3RTZXRSZWZpZFRoZW5FeGNsdWRlc2ZpbGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuc2V0RXhjbHVkZXNmaWxlKG5ldyBGaWxlKCIvYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDYW5ub3RTZXRSZWZpZFRoZW5EaXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2Fubm90U2V0UmVmaWRUaGVuQWRkSW5jbHVkZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuY3JlYXRlSW5jbHVkZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENhbm5vdFNldFJlZmlkVGhlbkFkZEV4Y2x1ZGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBmLmNyZWF0ZUV4Y2x1ZGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDYW5ub3RTZXRSZWZpZFRoZW5BZGRJbmNsdWRlc2ZpbGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBmLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENhbm5vdFNldFJlZmlkVGhlbkFkZEV4Y2x1ZGVzRmlsZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuY3JlYXRlRXhjbHVkZXNGaWxlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Q2Fubm90U2V0UmVmaWRUaGVuQWRkUGF0dGVybnNldCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIGYuY3JlYXRlUGF0dGVyblNldCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2tHZXREaXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CiAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGYpOwogICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLmdldERpcihwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlICIgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICsgIiBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgIiArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgKyAiIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIGYuZ2V0RGlyKHByb2plY3QpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2tHZXREaXJTY2FubmVyKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15IikpOworICAgICAgICBmLmdldERpcmVjdG9yeVNjYW5uZXIocHJvamVjdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9vcFJlZmVyZW5jZUNoZWNrR2V0RGlyKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzIC0tPiBkdW1teTEKLSAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYxID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYxKTsKLSAgICAgICAgZjEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTIiKSk7Ci0gICAgICAgIEFic3RyYWN0RmlsZVNldCBmMiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBmMik7Ci0gICAgICAgIGYyLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkzIikpOwotICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZjMgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgZjMpOwotICAgICAgICBmMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYxLmdldERpcihwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmMS5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOworICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZmEgPSBnZXRJbnN0YW5jZSgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZmEpOworICAgICAgICBmYS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MyIpKTsKKyAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGZiID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIGZiKTsKKyAgICAgICAgZmIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTEiKSk7CisgICAgICAgIGYuZ2V0RGlyKHByb2plY3QpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVja0dldERpclNjYW5uZXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQorICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgZik7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTIiKSk7CisgICAgICAgIEFic3RyYWN0RmlsZVNldCBmYSA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBmYSk7CisgICAgICAgIGZhLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkzIikpOworICAgICAgICBBYnN0cmFjdEZpbGVTZXQgZmIgPSBnZXRJbnN0YW5jZSgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgZmIpOworICAgICAgICBmYi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MSIpKTsKKyAgICAgICAgZi5nZXREaXJlY3RvcnlTY2FubmVyKHByb2plY3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVjaygpIHsKICAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MwogICAgICAgICAvLyAod2hpY2ggaGFzIHRoZSBQcm9qZWN0J3MgYmFzZWRpciBhcyByb290KS4KLSAgICAgICAgZjEgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgZjEpOwotICAgICAgICBmMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MiIpKTsKLSAgICAgICAgZjIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOwotICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MyIpKTsKLSAgICAgICAgZjMgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgZjMpOwotICAgICAgICBmMy5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKLSAgICAgICAgRmlsZSBkaXIgPSBmMS5nZXREaXIocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15MiIpKTsKKyAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGZhID0gZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIGZhKTsKKyAgICAgICAgZmEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teTMiKSk7CisgICAgICAgIEFic3RyYWN0RmlsZVNldCBmYiA9IGdldEluc3RhbmNlKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBmYik7CisgICAgICAgIGZiLnNldERpcihwcm9qZWN0LnJlc29sdmVGaWxlKCIuIikpOworICAgICAgICBGaWxlIGRpciA9IGYuZ2V0RGlyKHByb2plY3QpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkRpciBpcyBiYXNlZGlyIiwgZGlyLCBwcm9qZWN0LmdldEJhc2VEaXIoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBjYW5DYWxsU2V0RmlsZVR3aWNlV2l0aFNhbWVBcmd1bWVudCgpIHsKLSAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYgPSBnZXRJbnN0YW5jZSgpOwogICAgICAgICBmLnNldEZpbGUobmV3IEZpbGUoIi9hIikpOwogICAgICAgICBmLnNldEZpbGUobmV3IEZpbGUoIi9hIikpOwogICAgICAgICAvLyByZWFsbHkgb25seSBhc3NlcnRzIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24KICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNhbnRDYWxsU2V0RmlsZVR3aWNlV2l0aERpZmZlcmVudEFyZ3VtZW50cygpIHsKLSAgICAgICAgQWJzdHJhY3RGaWxlU2V0IGYgPSBnZXRJbnN0YW5jZSgpOworICAgIHB1YmxpYyB2b2lkIGNhbm5vdENhbGxTZXRGaWxlVHdpY2VXaXRoRGlmZmVyZW50QXJndW1lbnRzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInNldEZpbGUgY2Fubm90IGJlIGNhbGxlZCB0d2ljZSB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMiKTsKICAgICAgICAgZi5zZXRGaWxlKG5ldyBGaWxlKCIvYSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RmlsZShuZXcgRmlsZSgiL2IiKSk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBhbiBleGNlcHRpb24iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygic2V0RmlsZSBjYW5ub3QgYmUgY2FsbGVkIHR3aWNlIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50cyIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZi5zZXRGaWxlKG5ldyBGaWxlKCIvYiIpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQWRkVHlwZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BZGRUeXBlVGVzdC5qYXZhCmluZGV4IDZkZmJjZjYuLjk3Mjg2MTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BZGRUeXBlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9BZGRUeXBlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNyArMTgsNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKQEAgLTI3LDE0ICsyNiwxOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIHB1YmxpYyBjbGFzcyBBZGRUeXBlVGVzdCB7CiAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9hZGR0eXBlLnhtbCIpOwpAQCAtNjMsNzEgKzY3LDY1IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5lc3RlZC5hIik7Ci0gICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiYWRkIEEgY2FsbGVkIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJhZGQgQSBjYWxsZWQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQigpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5lc3RlZC5iIik7Ci0gICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoImFkZCBCIGNhbGxlZCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiYWRkIEIgY2FsbGVkIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEMoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJuZXN0ZWQuYyIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoImFkZCBDIGNhbGxlZCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiYWRkIEMgY2FsbGVkIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEFCKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5lc3RlZC5hYiIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGQgZXhjZXB0aW9uIGV4cGVjdGVkOiBTaG91bGQgaGF2ZSBnb3QgYW1iaWd1b3VzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoImFtYmlndW91cyIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJhbWJpZ3VvdXMiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoIm5lc3RlZC5hYiIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvblR5cGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb25kaXRpb24udHlwZSIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoImJlZm9yZWFmdGVyIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJiZWZvcmVhZnRlciIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25UYXNrKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiY29uZGl0aW9uLnRhc2siKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJNeSBDb25kaXRpb24gZXhlY3V0aW9uIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJNeSBDb25kaXRpb24gZXhlY3V0aW9uIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbkNvbmRpdGlvblR5cGUoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb25kaXRpb24uY29uZGl0aW9uLnR5cGUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJNeSBDb25kaXRpb24gZXZhbCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLCBjb250YWluc1N0cmluZygiTXkgQ29uZGl0aW9uIGV2YWwiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uQ29uZGl0aW9uVGFzaygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJjb25kaXRpb24uY29uZGl0aW9uLnRhc2siKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkIGV4Y2VwdGlvbiBleHBlY3RlZDogVGFzayBtYXNraW5nIGNvbmRpdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgIEFudEFzc2VydC5hc3NlcnRDb250YWlucygiZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiZG9lc24ndCBzdXBwb3J0IHRoZSBuZXN0ZWQiKTsKKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbmRpdGlvbi5jb25kaXRpb24udGFzayIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFkZENvbmZpZ3VyZWQoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJteWFkZGNvbmZpZ3VyZWQiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJ2YWx1ZSBpcyBWYWx1ZSBTZXRleGVjdXRlOiB2YWx1ZSBpcyBWYWx1ZSBTZXQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJ2YWx1ZSBpcyBWYWx1ZSBTZXRleGVjdXRlOiB2YWx1ZSBpcyBWYWx1ZSBTZXQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQ29uZmlndXJlZFZhbHVlKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgibXlhZGRjb25maWd1cmVkdmFsdWUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJ2YWx1ZSBpcyBWYWx1ZSBTZXRleGVjdXRlOiB2YWx1ZSBpcyBWYWx1ZSBTZXQiLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRMb2coKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldExvZygpLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJ2YWx1ZSBpcyBWYWx1ZSBTZXRleGVjdXRlOiB2YWx1ZSBpcyBWYWx1ZSBTZXQiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Bc3NlcnRpb25zVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEKaW5kZXggNWU1NGY0NS4uOWI5NjNhYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Fzc2VydGlvbnNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMyArMTksMTQgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CiAKIC8qKgogICogdGVzdCBhc3NlcnRpb24gaGFuZGxpbmcKQEAgLTM1LDIzICszNiwyMiBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Fzc2VydGlvbnMueG1sIik7CiAgICAgfQogCi0KICAgICAvKioKICAgICAgKiBydW5zIGEgdGVzdCBhbmQgZXhwZWN0cyBhbiBhc3NlcnRpb24gdGhyb3duIGluIGZvcmtlZCBjb2RlCiAgICAgICogQHBhcmFtIHRhcmdldCBTdHJpbmcKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZXhwZWN0QXNzZXJ0aW9uKFN0cmluZyB0YXJnZXQpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldCk7Ci0gICAgICAgICAgICBmYWlsKCJCdWlsZEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHRocm93biBieSBhc3NlcnRpb24gZmFpbCBpbiB0YXNrIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygiYXNzZXJ0aW9uIG5vdCB0aHJvd24gaW4gIiArIHRhcmdldCwgIkphdmEgcmV0dXJuZWQ6IDEiLCBleC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSmF2YSByZXR1cm5lZDogMSIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCh0YXJnZXQpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC05MSwyOSArOTEsMjUgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXNzZXJ0aW9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LW11bHRpcGxlLWFzc2VydGlvbnMiKTsKLSAgICAgICAgICAgIGZhaWwoIkJ1aWxkRXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gdGhyb3duIGJ5IGFzc2VydGlvbiBmYWlsIGluIHRhc2siKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydENvbnRhaW5zKCJtdWx0aXBsZSBhc3NlcnRpb25zIHJlamVjdGVkIiwgIk9ubHkgb25lIGFzc2VydGlvbiBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIk9ubHkgb25lIGFzc2VydGlvbiBkZWNsYXJhdGlvbiBpcyBhbGxvd2VkIik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LW11bHRpcGxlLWFzc2VydGlvbnMiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZlcmVuY2VBYnVzZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LXJlZmVyZW5jZS1hYnVzZSIpOwotICAgICAgICAgICAgZmFpbCgiQnVpbGRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiB0aHJvd24gYnkgcmVmZXJlbmNlIGFidXNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRDb250YWlucygicmVmZXJlbmNlIGFidXNlIHJlamVjdGVkIiwgIllvdSBtdXN0IG5vdCBzcGVjaWZ5IiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5Iik7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0LXJlZmVyZW5jZS1hYnVzZSIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vZm9yaygpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZUZhbHNlKCJyYW4gQW50IHRlc3RzIHdpdGggLWVhIGFuZCB0aGlzIHdvdWxkIGZhaWwgc3B1cmlvdXNseSIsIEFzc2VydGlvbnNUZXN0LmNsYXNzLmRlc2lyZWRBc3NlcnRpb25TdGF0dXMoKSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJyYW4gQW50IHRlc3RzIHdpdGggLWVhIGFuZCB0aGlzIHdvdWxkIGZhaWwgc3B1cmlvdXNseSIsCisgICAgICAgICAgICAgICAgQXNzZXJ0aW9uc1Rlc3QuY2xhc3MuZGVzaXJlZEFzc2VydGlvblN0YXR1cygpKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3Qtbm9mb3JrIik7Ci0gICAgICAgIGFzc2VydENvbnRhaW5zKCJBc3NlcnRpb24gc3RhdGVtZW50cyBhcmUgY3VycmVudGx5IGlnbm9yZWQgaW4gbm9uLWZvcmtlZCBtb2RlIiwgYnVpbGRSdWxlLmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChidWlsZFJ1bGUuZ2V0TG9nKCksCisgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkFzc2VydGlvbiBzdGF0ZW1lbnRzIGFyZSBjdXJyZW50bHkgaWdub3JlZCBpbiBub24tZm9ya2VkIG1vZGUiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9DaGFyU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NoYXJTZXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OTI5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9DaGFyU2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwucnVubmVycy5FbmNsb3NlZDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVxdWFsVG9JZ25vcmluZ0Nhc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitAUnVuV2l0aChFbmNsb3NlZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDaGFyU2V0VGVzdCB7CisKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGVnYWxBcmd1bWVudFRlc3QgeworICAgICAgICAvLyByZXF1aXJlcyBKVW5pdCA0LjEyCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJsZWdhbCBhcmd1bWVudDogfHswfXwiKQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBkYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoIlVURi04IiwgIklTTy04ODU5LTEiLCAiMDM3IiwgInVzIiwgIklCTTUwMCIsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgamF2YS5pbyBlbmNvZGluZ3MgYXJlIG5vdCBwcm92aWRlZCBhcyBhbGlhc2VzIGluIGphdmEubmlvLmNoYXJzZXQKKyAgICAgICAgICAgICAgICAgICAgLy8gc28sIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIGNhc2Ugc2hvdWxkIG5vdCBtYXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgImFzY2lpIiwgInV0Zi04IiwgIkNwMTI1MiIpOworICAgICAgICB9CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXJndW1lbnQ7CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3ROYW1lcygpIHsKKyAgICAgICAgICAgIENoYXJTZXQgY3MgPSBuZXcgQ2hhclNldChhcmd1bWVudCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGFyZ3VtZW50LCBlcXVhbFRvSWdub3JpbmdDYXNlKGNzLmdldFZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbGxlZ2FsQXJndW1lbnRUZXN0IHsKKyAgICAgICAgLy8gcmVxdWlyZXMgSlVuaXQgNC4xMgorICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiaWxsZWdhbCBhcmd1bWVudDogfHswfXwiKQorICAgICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBkYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoIm1vamliYWtlIiwgImR1bW15Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBhcmd1bWVudDsKKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRXhpc3RlbnROYW1lcygpIHsKKyAgICAgICAgICAgIG5ldyBDaGFyU2V0KGFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMZWdhbEVxdWl2YWxlbmNlVGVzdCB7CisgICAgICAgIC8vIHJlcXVpcmVzIEpVbml0IDQuMTIKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImVxdWl2YWxlbnQgYXJndW1lbnQ6IHx7MH18IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KCJVVEY4IiwgInVuaWNvZGUtMS0xLXV0Zi04Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBhcmd1bWVudDsKKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdE5hbWVzKCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgQ2hhclNldChhcmd1bWVudCkuZXF1aXZhbGVudChDaGFyU2V0LmdldFV0ZjgoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluY29ycmVjdEVxdWl2YWxlbmNlVGVzdCB7CisgICAgICAgIC8vIHJlcXVpcmVzIEpVbml0IDQuMTIKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm5vbi1lcXVpdmFsZW50IGFyZ3VtZW50OiB8ezB9fCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgidXMiLCAiSVNPLTg4NTktMSIsICJkZWZhdWx0Iik7CisgICAgICAgIH0KKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBhcmd1bWVudDsKKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jb3JyZWN0TmFtZXMoKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShuZXcgQ2hhclNldChhcmd1bWVudCkuZXF1aXZhbGVudChDaGFyU2V0LmdldFV0ZjgoKSkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lSmF2YVRlc3QuamF2YQppbmRleCA1ZjZiYjUwLi4wN2FmYzdiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVKYXZhVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZUphdmFUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxOCArMTgsMjIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAotCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5NYWdpY1Rlc3ROYW1lczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVuZHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzS2V5OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICogSlVuaXQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC5Db21tYW5kbGluZUphdmEKQEAgLTQxLDE1ICs0NSwyMCBAQAogCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CiAKKyAgICBwcml2YXRlIENvbW1hbmRsaW5lSmF2YSBjOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewogICAgICAgICBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTsKLSAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpKTsKLSAgICAgICAgcHJvamVjdC5zZXRQcm9wZXJ0eSgiYnVpbGQuc3lzY2xhc3NwYXRoIiwgImlnbm9yZSIpOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcihTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNUZXN0TmFtZXMuVEVTVF9ST09UX0RJUkVDVE9SWSkpOworICAgICAgICB9CisgICAgICAgIHByb2plY3Quc2V0UHJvcGVydHkoTWFnaWNOYW1lcy5CVUlMRF9TWVNDTEFTU1BBVEgsICJpZ25vcmUiKTsKICAgICAgICAgY2xvbmVWbSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmJ1aWxkLmNsb25ldm0iKTsKICAgICAgICAgaWYgKGNsb25lVm0gIT0gbnVsbCkgewogICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJhbnQuYnVpbGQuY2xvbmV2bSIsICJmYWxzZSIpOwogICAgICAgICB9CisgICAgICAgIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CiAgICAgfQogCiAgICAgQEFmdGVyCkBAIC01OSw5ICs2OCwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogTnVsbFBvaW50ZXJFeGNlcHRpb24gbWF5IGJyZWFrIHRoZSBidWlsZAorICAgICAqCisgICAgICogQHRocm93cyBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBpZiBjbG9uZSgpIGZhaWxzCisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tbWFuZGxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbW1hbmRsaW5lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQW50IGhvbWUgbm90IHNldCIsIFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKSk7CiAgICAgICAgIGMuY3JlYXRlQXJndW1lbnQoKS5zZXRWYWx1ZSgib3JnLmFwYWNoZS50b29scy5hbnQuQ29tbWFuZGxpbmVKYXZhVGVzdCIpOwogICAgICAgICBjLnNldENsYXNzbmFtZSgianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiKTsKICAgICAgICAgYy5jcmVhdGVWbUFyZ3VtZW50KCkuc2V0VmFsdWUoIi1EamF2YS5jb21waWxlcj1OT05FIik7CkBAIC03OSwzMSArOTMsMjQgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBjbGFzc3BhdGgiLCAianVuaXQudGV4dHVpLlRlc3RSdW5uZXIiLCBzWzJdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBjbGFzc3BhdGgiLAogICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiLCBzWzNdKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGMuY2xvbmUoKTsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGZhaWwoImNsb25pbmcgc2hvdWxkIHdvcmsgd2l0aG91dCBjbGFzc3BhdGggc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLQorICAgICAgICBjLmNsb25lKCk7CiAgICAgICAgIGMuY3JlYXRlQ2xhc3NwYXRoKHByb2plY3QpLnNldExvY2F0aW9uKHByb2plY3QucmVzb2x2ZUZpbGUoImJ1aWxkLnhtbCIpKTsKICAgICAgICAgYy5jcmVhdGVDbGFzc3BhdGgocHJvamVjdCkuc2V0TG9jYXRpb24ocHJvamVjdC5yZXNvbHZlRmlsZSgKICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKSArICIvbGliL2FudC5qYXIiKSk7CiAgICAgICAgIHMgPSBjLmdldENvbW1hbmRsaW5lKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCA2LCBzLmxlbmd0aCk7Ci0gICAgICAgIC8vICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgImphdmEiLCBzWzBdKTsKKyAgICAgICAgLy8gYXNzZXJ0RXF1YWxzKCJ3aXRoIGNsYXNzcGF0aCIsICJqYXZhIiwgc1swXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLCAiLURqYXZhLmNvbXBpbGVyPU5PTkUiLCBzWzFdKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aXRoIGNsYXNzcGF0aCIsICItY2xhc3NwYXRoIiwgc1syXSk7Ci0gICAgICAgIGFzc2VydFRydWUoImJ1aWxkLnhtbCBjb250YWluZWQiLAotICAgICAgICAgICAgICAgIHNbM10uY29udGFpbnMoImJ1aWxkLnhtbCIgKyBqYXZhLmlvLkZpbGUucGF0aFNlcGFyYXRvcikpOwotICAgICAgICBhc3NlcnRUcnVlKCJhbnQuamFyIGNvbnRhaW5lZCIsIHNbM10uZW5kc1dpdGgoImFudC5qYXIiKSk7CisgICAgICAgIGFzc2VydFRoYXQoImJ1aWxkLnhtbCBjb250YWluZWQiLCBzWzNdLCBjb250YWluc1N0cmluZygiYnVpbGQueG1sIiArIEZpbGUucGF0aFNlcGFyYXRvcikpOworICAgICAgICBhc3NlcnRUaGF0KCJhbnQuamFyIGNvbnRhaW5lZCIsIHNbM10sIGVuZHNXaXRoKCJhbnQuamFyIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIndpdGggY2xhc3NwYXRoIiwgImp1bml0LnRleHR1aS5UZXN0UnVubmVyIiwgc1s0XSk7CiAgICAgICAgIGFzc2VydEVxdWFscygid2l0aCBjbGFzc3BhdGgiLAogICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiLCBzWzVdKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CisgICAgcHVibGljIHZvaWQgdGVzdEphck9wdGlvbigpIHsKICAgICAgICAgYy5jcmVhdGVBcmd1bWVudCgpLnNldFZhbHVlKCJhcmcxIik7CiAgICAgICAgIGMuc2V0SmFyKCJteWZpbGUuamFyIik7CiAgICAgICAgIGMuY3JlYXRlVm1Bcmd1bWVudCgpLnNldFZhbHVlKCItY2xhc3NpYyIpOwpAQCAtMTIxLDcgKzEyOCw2IEBACiAgICAgICAgIFN0cmluZyBjdXJyZW50Q2xhc3NwYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChjdXJyZW50Q2xhc3NwYXRoKTsKICAgICAgICAgYXNzZXJ0TnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkoImtleSIpKTsKLSAgICAgICAgQ29tbWFuZGxpbmVKYXZhIGMgPSBuZXcgQ29tbWFuZGxpbmVKYXZhKCk7CiAgICAgICAgIEVudmlyb25tZW50LlZhcmlhYmxlIHYgPSBuZXcgRW52aXJvbm1lbnQuVmFyaWFibGUoKTsKICAgICAgICAgdi5zZXRLZXkoImtleSIpOwogICAgICAgICB2LnNldFZhbHVlKCJ2YWx1ZSIpOwpAQCAtMTQwLDcgKzE0Niw3IEBACiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VycmVudENsYXNzcGF0aCwgbmV3Q2xhc3NwYXRoKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoU3lzdGVtLmdldFByb3BlcnR5KCJrZXkiKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgU3lzdGVtLmdldFByb3BlcnR5KCJrZXkiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImphdmEuY2xhc3MucGF0aCIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoU3lzdGVtLmdldFByb3BlcnRpZXMoKSwgaGFzS2V5KCJqYXZhLmNsYXNzLnBhdGgiKSk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKFN5c3RlbS5nZXRQcm9wZXJ0eSgia2V5MiIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUyIiwgU3lzdGVtLmdldFByb3BlcnR5KCJrZXkyIikpOwogICAgICAgICB9IGZpbmFsbHkgewpAQCAtMTUyLDcgKzE1OCw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NlcnRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIENvbW1hbmRsaW5lSmF2YSBjID0gbmV3IENvbW1hbmRsaW5lSmF2YSgpOwogICAgICAgICBjLmNyZWF0ZUFyZ3VtZW50KCkuc2V0VmFsdWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LkNvbW1hbmRsaW5lSmF2YVRlc3QiKTsKICAgICAgICAgYy5zZXRDbGFzc25hbWUoImp1bml0LnRleHR1aS5UZXN0UnVubmVyIik7CiAgICAgICAgIGMuY3JlYXRlVm1Bcmd1bWVudCgpLnNldFZhbHVlKCItRGphdmEuY29tcGlsZXI9Tk9ORSIpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0NvbW1hbmRsaW5lVGVzdC5qYXZhCmluZGV4IDRiYTAwYmIuLjQxMjRiOTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Db21tYW5kbGluZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvQ29tbWFuZGxpbmVUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMCArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiAvKioKQEAgLTMwLDYgKzMxLDkgQEAKICAqLwogcHVibGljIGNsYXNzIENvbW1hbmRsaW5lVGVzdCB7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbml6ZXIoKSB7CiAgICAgICAgIFN0cmluZ1tdIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiMSAyIDMiKTsKQEAgLTEwMCwyMiArMTA0LDI2IEBACiAgICAgICAgIHMgPSBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiXCdcJyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlNpbmdsZXF1b3RlZCBudWxsIGFyZyIsIDEsIHMubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJTaW5nbGVxdW90ZWQgbnVsbCBhcmciLCAiIiwgc1swXSk7CisgICAgfQogCi0gICAgICAgIC8vIG5vdyB0byB0aGUgZXhwZWN0ZWQgZmFpbHVyZXMKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byB1bmJhbGFuY2VkIHNpbmdsZSBxdW90ZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRva2VuaXplclVuYmFsYW5jZWRTaW5nbGVRdW90ZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmJhbGFuY2VkIHF1b3RlcyBpbiBhIFwnYiBjIik7CisgICAgICAgIENvbW1hbmRsaW5lLnRyYW5zbGF0ZUNvbW1hbmRsaW5lKCJhIFwnYiBjIik7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiYSBcJ2IgYyIpOwotICAgICAgICAgICAgZmFpbCgidW5iYWxhbmNlZCBzaW5nbGUgcXVvdGVzIHVuZGV0ZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidW5iYWxhbmNlZCBxdW90ZXMgaW4gYSBcJ2IgYyIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ29tbWFuZGxpbmUudHJhbnNsYXRlQ29tbWFuZGxpbmUoImEgXCJiIGMiKTsKLSAgICAgICAgICAgIGZhaWwoInVuYmFsYW5jZWQgZG91YmxlIHF1b3RlcyB1bmRldGVjdGVkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInVuYmFsYW5jZWQgcXVvdGVzIGluIGEgXCJiIGMiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gdW5iYWxhbmNlZCBkb3VibGUgcXVvdGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbml6ZXJVbmJhbGFuY2VkRG91YmxlUXVvdGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgidW5iYWxhbmNlZCBxdW90ZXMgaW4gYSBcImIgYyIpOworICAgICAgICBDb21tYW5kbGluZS50cmFuc2xhdGVDb21tYW5kbGluZSgiYSBcImIgYyIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb25UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGVzY3JpcHRpb25UZXN0LmphdmEKaW5kZXggYWViNzkxMS4uNTA3Yjc4OCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0Rlc2NyaXB0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EZXNjcmlwdGlvblRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDQzICsyMSw0NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiAvKioKLSAqIEZpbHRlclNldCB0ZXN0aW5nCi0gKgorICogRGVzY3JpcHRpb24gdGVzdHMKICAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKIHB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblRlc3QgeworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MX0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gdGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgeyJkZXNjcmlwdGlvbjEiLCAiU2luZ2xlIiwgIlRlc3QgUHJvamVjdCBEZXNjcmlwdGlvbiJ9LAorICAgICAgICAgICAgICAgIHsiZGVzY3JpcHRpb24yIiwgIk11bHRpIGxpbmUiLCAiTXVsdGkgTGluZVxuUHJvamVjdCBEZXNjcmlwdGlvbiJ9LAorICAgICAgICAgICAgICAgIHsiZGVzY3JpcHRpb24zIiwgIk11bHRpIGluc3RhbmNlIiwgIk11bHRpIEluc3RhbmNlIFByb2plY3QgRGVzY3JpcHRpb24ifSwKKyAgICAgICAgICAgICAgICB7ImRlc2NyaXB0aW9uNCIsICJNdWx0aSBpbnN0YW5jZSBuZXN0ZWQiLCAiTXVsdGkgSW5zdGFuY2UgTmVzdGVkIFByb2plY3QgRGVzY3JpcHRpb24ifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICBwdWJsaWMgU3RyaW5nIGZpbGVOYW1lOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigyKQorICAgIHB1YmxpYyBTdHJpbmcgb3V0Y29tZTsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjEueG1sIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU2luZ2xlIGRlc2NyaXB0aW9uIGZhaWxlZCIsICJUZXN0IFByb2plY3QgRGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uMi54bWwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdWx0aSBsaW5lIGRlc2NyaXB0aW9uIGZhaWxlZCIsICJNdWx0aSBMaW5lXG5Qcm9qZWN0IERlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldERlc2NyaXB0aW9uKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXNjcmlwdGlvbjMueG1sIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiTXVsdGkgaW5zdGFuY2UgZGVzY3JpcHRpb24gZmFpbGVkIiwgIk11bHRpIEluc3RhbmNlIFByb2plY3QgRGVzY3JpcHRpb24iLAotICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc2NyaXB0aW9uNC54bWwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJNdWx0aSBpbnN0YW5jZSBuZXN0ZWQgZGVzY3JpcHRpb24gZmFpbGVkIiwgIk11bHRpIEluc3RhbmNlIE5lc3RlZCBQcm9qZWN0IERlc2NyaXB0aW9uIiwKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBidWlsZFJ1bGUuY29uZmlndXJlUHJvamVjdCgic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvIiArIGZpbGVOYW1lICsgIi54bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2NyaXB0aW9uICsgIiBkZXNjcmlwdGlvbiBmYWlsZWQiLCBvdXRjb21lLAogICAgICAgICAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0RGVzY3JpcHRpb24oKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9EaXJTZXRUZXN0LmphdmEKaW5kZXggZTkxNjJmMS4uMGQ3M2VkYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0RpclNldFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRGlyU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsNDcgKzIyLDUyIEBACiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIEpVbml0IDQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5EaXJTZXQuCiAgKi8KIHB1YmxpYyBjbGFzcyBEaXJTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RGaWxlU2V0VGVzdCB7CiAKKyAgICBwcml2YXRlIERpclNldCBkczsKKworICAgIHByaXZhdGUgRmlsZVNldCBmczsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgZHMgPSAoRGlyU2V0KSBnZXRJbnN0YW5jZSgpOworICAgICAgICBkcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7CisgICAgICAgIGZzID0gbmV3IEZpbGVTZXQoKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IERpclNldCgpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXRJc05vRGlyU2V0KCkgewotICAgICAgICBEaXJTZXQgZHMgPSAoRGlyU2V0KSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBkcy5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0gICAgICAgIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOworICAgIHB1YmxpYyB2b2lkIHRlc3REaXJTZXRGcm9tRmlsZVNldCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJkdW1teSBkb2VzblwndCBkZW5vdGUgYSBEaXJTZXQiKTsKICAgICAgICAgZnMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwogICAgICAgICBnZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGZzKTsKICAgICAgICAgZHMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGRzLmdldERpcihnZXRQcm9qZWN0KCkpOwotICAgICAgICAgICAgZmFpbCgiRGlyU2V0IGNyZWF0ZWQgZnJvbSBGaWxlU2V0IHJlZmVyZW5jZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImR1bW15IGRvZXNuXCd0IGRlbm90ZSBhIERpclNldCIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRzID0gKERpclNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZHMuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOwotICAgICAgICBnZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBkcyk7Ci0gICAgICAgIGZzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBmYWlsKCJGaWxlU2V0IGNyZWF0ZWQgZnJvbSBEaXJTZXQgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZHVtbXkyIGRvZXNuXCd0IGRlbm90ZSBhIEZpbGVTZXQiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgZHMuZ2V0RGlyKGdldFByb2plY3QoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNldEZyb21EaXJTZXQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiZHVtbXkgZG9lc25cJ3QgZGVub3RlIGEgRmlsZVNldCIpOworICAgICAgICBnZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGRzKTsKKyAgICAgICAgZnMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teSIpKTsKKyAgICAgICAgZnMuZ2V0RGlyKGdldFByb2plY3QoKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSB0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJEaXJTZXRUZXN0IiwgIiIpOwogICAgICAgICB0cnkgewpAQCAtNzUsOCArODAsNiBAQAogICAgICAgICAgICAgbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoYSwgIngiKSkuY2xvc2UoKTsKICAgICAgICAgICAgIG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5ldyBGaWxlKGIsICJ4IikpLmNsb3NlKCk7CiAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShiYywgIngiKSkuY2xvc2UoKTsKLSAgICAgICAgICAgIERpclNldCBkcyA9IG5ldyBEaXJTZXQoKTsKLSAgICAgICAgICAgIGRzLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKICAgICAgICAgICAgIGRzLnNldERpcih0bXApOwogICAgICAgICAgICAgZHMuc2V0SW5jbHVkZXMoImIvIik7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImI7YiIgKyBGaWxlLnNlcGFyYXRvciArICJjIiwgZHMudG9TdHJpbmcoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRW51bWVyYXRlZEF0dHJpYnV0ZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlVGVzdC5qYXZhCmluZGV4IDE0NDM2ZGUuLmY1ZTg5ZGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9FbnVtZXJhdGVkQXR0cmlidXRlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsOSArMjEsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIEpVbml0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQuRW51bWVyYXRlZEF0dHJpYnV0ZS4KQEAgLTM2LDUyICszOCw0NCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKICAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZSB0MSA9IG5ldyBUZXN0Tm9ybWFsKCk7CiAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUodmFsdWUgKyAiIGlzIGluIFRlc3ROb3JtYWwiLAotICAgICAgICAgICAgICAgICAgICB0MS5jb250YWluc1ZhbHVlKHZhbHVlKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHZhbHVlLnRvVXBwZXJDYXNlKCkgKyAiIGlzIGluIFRlc3ROb3JtYWwiLAotICAgICAgICAgICAgICAgICAgICAhdDEuY29udGFpbnNWYWx1ZSh2YWx1ZS50b1VwcGVyQ2FzZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHZhbHVlICsgIiBpcyBpbiBUZXN0Tm9ybWFsIiwgdDEuY29udGFpbnNWYWx1ZSh2YWx1ZSkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UodmFsdWUudG9VcHBlckNhc2UoKSArICIgaXMgaW4gVGVzdE5vcm1hbCIsCisgICAgICAgICAgICAgICAgICAgIHQxLmNvbnRhaW5zVmFsdWUodmFsdWUudG9VcHBlckNhc2UoKSkpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIlRlc3ROb3JtYWwgZG9lc25cJ3QgaGF2ZSBcImRcIiBhdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgIXQxLmNvbnRhaW5zVmFsdWUoImQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRlc3ROdWxsIGRvZXNuXCd0IGhhdmUgXCJkXCIgYXR0cmlidXRlIGFuZCBkb2VzblwndCBkaWUiLAotICAgICAgICAgICAgICAgIShuZXcgVGVzdE51bGwoKSkuY29udGFpbnNWYWx1ZSgiZCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRlc3ROb3JtYWwgZG9lc25cJ3QgaGF2ZSBcImRcIiBhdHRyaWJ1dGUiLCB0MS5jb250YWluc1ZhbHVlKCJkIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGVzdE51bGwgZG9lc25cJ3QgaGF2ZSBcImRcIiBhdHRyaWJ1dGUgYW5kIGRvZXNuXCd0IGRpZSIsCisgICAgICAgICAgICAgICAgKG5ldyBUZXN0TnVsbCgpKS5jb250YWluc1ZhbHVlKCJkIikpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZSBkdWUgdG8gYXR0ZW1wdCB0byBzZXQgYW4gaWxsZWdhbCB2YWx1ZQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEZhY3RvcnkoKSB7CiAgICAgICAgIEZhY3RvcnkgZWEgPSAoRmFjdG9yeSkgRW51bWVyYXRlZEF0dHJpYnV0ZS5nZXRJbnN0YW5jZShGYWN0b3J5LmNsYXNzLCAib25lIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiRmFjdG9yeSBkaWQgbm90IHNldCB0aGUgcmlnaHQgdmFsdWUuIiwgZWEuZ2V0VmFsdWUoKSwgIm9uZSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgRW51bWVyYXRlZEF0dHJpYnV0ZS5nZXRJbnN0YW5jZShGYWN0b3J5LmNsYXNzLCAiaWxsZWdhbCIpOwotICAgICAgICAgICAgZmFpbCgiRmFjdG9yeSBzaG91bGQgZmFpbCB3aGVuIHRyeWluZyB0byBzZXQgYW4gaWxsZWdhbCB2YWx1ZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIC8vIHdhcyBleHBlY3RlZAotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgICAgIEVudW1lcmF0ZWRBdHRyaWJ1dGUuZ2V0SW5zdGFuY2UoRmFjdG9yeS5jbGFzcywgImlsbGVnYWwiKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25zKCkgewotICAgICAgICBFbnVtZXJhdGVkQXR0cmlidXRlIHQxID0gbmV3IFRlc3ROb3JtYWwoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBleHBlY3RlZCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB0MS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgICAgIGZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIGZvciB2YWx1ZSAiICsgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0MS5zZXRWYWx1ZSgiZCIpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGZvciB2YWx1ZSBcImRcIiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgLy9UT0RPIGFzc2VydCBidWlsZCBleGNlcHRpb24KLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgKG5ldyBUZXN0TnVsbCgpKS5zZXRWYWx1ZSgiZCIpOwotICAgICAgICAgICAgZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGZvciB2YWx1ZSBcImRcIiBpbiBUZXN0TnVsbCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbnNOb3JtYWwoKSB7CisgICAgICAgIEFycmF5cy5zdHJlYW0oZXhwZWN0ZWQpLmZvckVhY2gobmV3IFRlc3ROb3JtYWwoKTo6c2V0VmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGVjdGVkIGV4Y2VwdGlvbiBmb3IgdmFsdWUgImQiIGluIFRlc3ROb3JtYWwKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25Ob3JtYWwoKSB7CisgICAgICAgIG5ldyBUZXN0Tm9ybWFsKCkuc2V0VmFsdWUoImQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBleGNlcHRpb24gZm9yIHZhbHVlICJkIiBpbiBUZXN0TnVsbAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk51bGwoKSB7CisgICAgICAgIG5ldyBUZXN0TnVsbCgpLnNldFZhbHVlKCJkIik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Tm9ybWFsIGV4dGVuZHMgRW51bWVyYXRlZEF0dHJpYnV0ZSB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3RUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZUxpc3RUZXN0LmphdmEKaW5kZXggMGZlNTlmNy4uOWQwZDIwNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbGVMaXN0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlTGlzdFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDExICsyMywxMSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogU29tZSB0ZXN0cyBmb3IgZmlsZWxpc3QuCkBAIC0zNiwxMTAgKzM2LDExNyBAQAogcHVibGljIGNsYXNzIEZpbGVMaXN0VGVzdCB7CiAKICAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAUnVsZQogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKKyAgICBwcml2YXRlIEZpbGVMaXN0IGY7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9maWxlbGlzdC54bWwiKTsKKyAgICAgICAgZiA9IG5ldyBGaWxlTGlzdCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENhbiBhZGQgcmVmZXJlbmNlIHRvIEZpbGVMaXN0IHdpdGggZGlyZWN0b3J5IGF0dHJpYnV0ZSBzZXQuCisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZSgpIHsKLSAgICAgICAgRmlsZUxpc3QgZiA9IG5ldyBGaWxlTGlzdCgpOworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXREaXJUaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOwogICAgICAgICBmLnNldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIEZpbGVMaXN0IHdpdGggZGlyZWN0b3J5IGF0dHJpYnV0ZSBzZXQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIGYuc2V0RmlsZXMoImZvby54bWwsYy9kL2Jhci54bWwiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBGaWxlTGlzdCB3aXRoIGZpbGUgYXR0cmlidXRlIHNldC4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGYgPSBuZXcgRmlsZUxpc3QoKTsKICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RmlsZXMoImEvYi9mb28uamF2YSIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBmaWxlcyBpbiBGaWxlTGlzdCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBkaXIgaW4gRmlsZUxpc3QgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2soKSB7Ci0gICAgICAgIEZpbGVMaXN0IGYgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0RmlsZXNUaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldEZpbGVzKCJmb28ueG1sLGMvZC9iYXIueG1sIik7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0UmVmaWRUaGVuRmlsZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBmLnNldEZpbGVzKCJhL2IvZm9vLmphdmEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRSZWZpZFRoZW5EaXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBmLnNldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2tEaXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CiAgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGYpOwogICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15IikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXREaXIoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBGaWxlTGlzdCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5nZXRGaWxlcyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIEZpbGVMaXN0IGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIGYuZ2V0RGlyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOworICAgIH0KIAotICAgICAgICAvLyBkdW1teTEgLS0+IGR1bW15MiAtLT4gZHVtbXkzIC0tPiBkdW1teTEKLSAgICAgICAgRmlsZUxpc3QgZjEgPSBuZXcgRmlsZUxpc3QoKTsKLSAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYxKTsKLSAgICAgICAgZjEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOwotICAgICAgICBGaWxlTGlzdCBmMiA9IG5ldyBGaWxlTGlzdCgpOwotICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOwotICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teTMiKSk7Ci0gICAgICAgIEZpbGVMaXN0IGYzID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBmMyk7Ci0gICAgICAgIGYzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15MSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYxLmdldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmMS5nZXRGaWxlcyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVja0ZpbGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teSIpKTsKKyAgICAgICAgZi5nZXRGaWxlcyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICB9CiAKLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVja0RpcigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgLy8gZHVtbXkgLS0+IGR1bW15QSAtLT4gZHVtbXlCIC0tPiBkdW1teQorICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBmKTsKKyAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teUEiKSk7CisgICAgICAgIEZpbGVMaXN0IGZhID0gbmV3IEZpbGVMaXN0KCk7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teUEiLCBmYSk7CisgICAgICAgIGZhLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15QiIpKTsKKyAgICAgICAgRmlsZUxpc3QgZmIgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoImR1bW15QiIsIGZiKTsKKyAgICAgICAgZmIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXkiKSk7CisgICAgICAgIGYuZ2V0RGlyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVja0ZpbGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICAvLyBkdW1teSAtLT4gZHVtbXlBIC0tPiBkdW1teUIgLS0+IGR1bW15CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teSIsIGYpOworICAgICAgICBmLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15QSIpKTsKKyAgICAgICAgRmlsZUxpc3QgZmEgPSBuZXcgRmlsZUxpc3QoKTsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoImR1bW15QSIsIGZhKTsKKyAgICAgICAgZmEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlCIikpOworICAgICAgICBGaWxlTGlzdCBmYiA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXlCIiwgZmIpOworICAgICAgICBmYi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teSIpKTsKKyAgICAgICAgZi5nZXRGaWxlcyhidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wUmVmZXJlbmNlQ2hlY2soKSB7CisgICAgICAgIC8vIGR1bW15IC0tPiBkdW1teUEgLS0+IGR1bW15QgogICAgICAgICAvLyAod2hpY2ggaGFzIHRoZSBQcm9qZWN0J3MgYmFzZWRpciBhcyByb290KS4KLSAgICAgICAgZjEgPSBuZXcgRmlsZUxpc3QoKTsKLSAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoImR1bW15MSIsIGYxKTsKLSAgICAgICAgZjEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXkyIikpOwotICAgICAgICBmMiA9IG5ldyBGaWxlTGlzdCgpOwotICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgZjIpOwotICAgICAgICBmMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teTMiKSk7Ci0gICAgICAgIGYzID0gbmV3IEZpbGVMaXN0KCk7Ci0gICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBmMyk7Ci0gICAgICAgIGYzLnNldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOwotICAgICAgICBGaWxlIGRpciA9IGYxLmdldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgYnVpbGRSdWxlLmdldFByb2plY3QoKS5hZGRSZWZlcmVuY2UoImR1bW15IiwgZik7CisgICAgICAgIGYuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlBIikpOworICAgICAgICBGaWxlTGlzdCBmYSA9IG5ldyBGaWxlTGlzdCgpOworICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZHVtbXlBIiwgZmEpOworICAgICAgICBmYS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teUIiKSk7CisgICAgICAgIEZpbGVMaXN0IGZiID0gbmV3IEZpbGVMaXN0KCk7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJkdW1teUIiLCBmYik7CisgICAgICAgIGZiLnNldERpcihidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLnJlc29sdmVGaWxlKCIuIikpOworICAgICAgICBGaWxlIGRpciA9IGYuZ2V0RGlyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkRpciBpcyBiYXNlZGlyIiwgZGlyLCBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsZVNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0VGVzdC5qYXZhCmluZGV4IDNjYTVmYWEuLmM4YzNkNDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWxlU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GaWx0ZXJTZXRUZXN0LmphdmEKaW5kZXggNjhjMTc1NC4uZWU4YjNkZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZpbHRlclNldFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmlsdGVyU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsNyArMzIsNiBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBGaWx0ZXJTZXQgdGVzdGluZwpAQCAtNTgsMjIgKzU3LDE5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0MSIpOwotICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXJzZXQgMSBmYWlsZWQiLCBjb21wYXJlRmlsZXMoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2dvbGQvZmlsdGVyc2V0MS50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL2Rlc3QxLnR4dCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyc2V0IDEgZmFpbGVkIiwgY29tcGFyZUZpbGVzKCJnb2xkL2ZpbHRlcnNldDEudHh0IiwgImRlc3QxLnR4dCIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgIGFzc2VydFRydWUoIkZpbHRlcnNldCAyIGZhaWxlZCIsIGNvbXBhcmVGaWxlcygic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZ29sZC9maWx0ZXJzZXQyLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvZGVzdDIudHh0IikpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXJzZXQgMiBmYWlsZWQiLCBjb21wYXJlRmlsZXMoImdvbGQvZmlsdGVyc2V0Mi50eHQiLCAiZGVzdDIudHh0IikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsdGVyc2V0IDMgZmFpbGVkIiwgY29tcGFyZUZpbGVzKCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9nb2xkL2ZpbHRlcnNldDMudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy9kZXN0My50eHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbHRlcnNldCAzIGZhaWxlZCIsIGNvbXBhcmVGaWxlcygiZ29sZC9maWx0ZXJzZXQzLnR4dCIsICJkZXN0My50eHQiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTIsMjMgKzE0OCwyMyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGaWx0ZXJTZXRzKCkgewogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdC1uZXN0ZWQtZmlsdGVyc2V0cyIpOwogCi0gICAgICAgIEZpbHRlclNldCBmcyA9IChGaWx0ZXJTZXQpIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCIxIik7Ci0gICAgICAgIEhhc2h0YWJsZSBmaWx0ZXJzID0gZnMuZ2V0RmlsdGVySGFzaCgpOworICAgICAgICBGaWx0ZXJTZXQgZnMgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiMSIpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbHRlcnMgPSBmcy5nZXRGaWx0ZXJIYXNoKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBmaWx0ZXJzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgZmlsdGVycy5nZXQoInRva2VuMSIpKTsKIAotICAgICAgICBmcyA9IChGaWx0ZXJTZXQpIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCIyIik7CisgICAgICAgIGZzID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIjIiKTsKICAgICAgICAgZmlsdGVycyA9IGZzLmdldEZpbHRlckhhc2goKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcnMuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMTExIiwgZmlsdGVycy5nZXQoImFhYWEiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiMjIyMiIsIGZpbHRlcnMuZ2V0KCJiYmJiIikpOwogCi0gICAgICAgIGZzID0gKEZpbHRlclNldCkgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIjMiKTsKKyAgICAgICAgZnMgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiMyIpOwogICAgICAgICBmaWx0ZXJzID0gZnMuZ2V0RmlsdGVySGFzaCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZmlsdGVycy5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlNCIsIGZpbHRlcnMuZ2V0KCJ0b2tlbjQiKSk7CiAKLSAgICAgICAgZnMgPSAoRmlsdGVyU2V0KSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgiNSIpOworICAgICAgICBmcyA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCI1Iik7CiAgICAgICAgIGZpbHRlcnMgPSBmcy5nZXRGaWx0ZXJIYXNoKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBmaWx0ZXJzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUxIiwgZmlsdGVycy5nZXQoInRva2VuMSIpKTsKQEAgLTE4OSwxNCArMTg1LDEwIEBACiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TXVsdGlwbGVGaWx0ZXJzRmlsZXMiKTsKICAgICB9CiAKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWx0ZXJzRmlsZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TWlzc2luZ0ZpbHRlcnNGaWxlIik7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgZmFpbCBkdWUgdG8gbWlzc2luZyAgZmlsdGVyc2ZpbGUiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIHRleHQKLSAgICAgICAgfQorICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE1pc3NpbmdGaWx0ZXJzRmlsZSIpOworICAgICAgICAvLyBUT0RPIGFzc2VydCBleGNlcHRpb24gdGV4dAogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDUsMTUgKzE5NywxMCBAQAogICAgIH0KIAogICAgIHByaXZhdGUgYm9vbGVhbiBjb21wYXJlRmlsZXMoU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgZmlsZTEgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgbmFtZTEpOwotICAgICAgICBGaWxlIGZpbGUyID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksIG5hbWUyKTsKKyAgICAgICAgRmlsZSBmaWxlMSA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkucmVzb2x2ZUZpbGUobmFtZTEpOworICAgICAgICBGaWxlIGZpbGUyID0gYnVpbGRSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZShuYW1lMik7CiAKLQotICAgICAgICBpZiAoIWZpbGUxLmV4aXN0cygpIHx8ICFmaWxlMi5leGlzdHMoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZpbGUxLmxlbmd0aCgpICE9IGZpbGUyLmxlbmd0aCgpKSB7CisgICAgICAgIGlmICghZmlsZTEuZXhpc3RzKCkgfHwgIWZpbGUyLmV4aXN0cygpIHx8IGZpbGUxLmxlbmd0aCgpICE9IGZpbGUyLmxlbmd0aCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIApAQCAtMjIxLDE2ICsyMDgsMTUgQEAKICAgICAgICAgYnl0ZVtdIGJ1ZmZlcjEgPSBuZXcgYnl0ZVtCVUZfU0laRV07CiAgICAgICAgIGJ5dGVbXSBidWZmZXIyID0gbmV3IGJ5dGVbQlVGX1NJWkVdOwogCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMxID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMSk7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMyID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0gICAgICAgIGludCByZWFkID0gMDsKLSAgICAgICAgd2hpbGUgKChyZWFkID0gZmlzMS5yZWFkKGJ1ZmZlcjEpKSAhPSAtMSkgewotICAgICAgICAgICAgZmlzMi5yZWFkKGJ1ZmZlcjIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoYnVmZmVyMVtpXSAhPSBidWZmZXIyW2ldKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzMSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOworICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMyID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlMikpIHsKKyAgICAgICAgICAgIGludCByZWFkID0gMDsKKyAgICAgICAgICAgIHdoaWxlICgocmVhZCA9IGZpczEucmVhZChidWZmZXIxKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmaXMyLnJlYWQoYnVmZmVyMik7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcjFbaV0gIT0gYnVmZmVyMltpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmxleEludGVnZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvRmxleEludGVnZXJUZXN0LmphdmEKaW5kZXggZGQwMWZmNy4uZGMxYzE1NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL0ZsZXhJbnRlZ2VyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9GbGV4SW50ZWdlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTQ3LDExICs0NywxMSBAQAogICAgIC8vIFRoaXMgY2xhc3MgYWN0cyBhcyBhIGN1c3RvbSBBbnQgdGFzayBhbHNvCiAgICAgLy8gYW5kIHVzZXMgdGhlc2UgdmFyaWFibGVzL21ldGhvZHMgaW4gdGhhdCBtb2RlCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHRhc2tQcm9qZWN0OworCiAgICAgU3RyaW5nIHByb3BOYW1lOworCiAgICAgcHJpdmF0ZSBGbGV4SW50ZWdlciB2YWx1ZTsKIAotCi0KICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wTmFtZShTdHJpbmcgcHJvcE5hbWUpIHsKICAgICAgICAgdGhpcy5wcm9wTmFtZSA9IHByb3BOYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTWFwcGVyVGVzdC5qYXZhCmluZGV4IDc3YzE4MTEuLmIwZTlkNmIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9NYXBwZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01hcHBlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDEyICszMiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiAvKioKICAqIEpVbml0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyLgpAQCAtNDksMTA0ICs1MSw5NyBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OwogCisgICAgcHJpdmF0ZSBNYXBwZXIgbTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgICAgICBtID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlKCkgewotICAgICAgICBNYXBwZXIgbSA9IG5ldyBNYXBwZXIocHJvamVjdCk7CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UxKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKICAgICAgICAgbS5zZXRGcm9tKCIqLmphdmEiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBNYXBwZXIgd2l0aCBmcm9tIGF0dHJpYnV0ZSBzZXQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgbS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0uc2V0RnJvbSgiKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGZyb20gaW4gTWFwcGVyIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbSA9IG5ldyBNYXBwZXIocHJvamVjdCk7Ci0gICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBtLnNldFRvKCIqLmphdmEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgdG8gaW4gTWFwcGVyIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBtdCA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOwotICAgICAgICAgICAgbXQuc2V0VmFsdWUoImdsb2IiKTsKLSAgICAgICAgICAgIG0uc2V0VHlwZShtdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IHR5cGUgaW4gTWFwcGVyIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgTWFwcGVyIG0gPSBuZXcgTWFwcGVyKHByb2plY3QpOworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlMigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7CisgICAgICAgIG0uc2V0RnJvbSgiKi5qYXZhIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZTMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBtLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15IikpOworICAgICAgICBtLnNldFRvKCIqLmphdmEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlNCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG10ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIG10LnNldFZhbHVlKCJnbG9iIik7CisgICAgICAgIG0uc2V0VHlwZShtdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjazEoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CiAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIG0pOwogICAgICAgICBtLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15IikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbS5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgTWFwcGVyIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBtLmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgfQogCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQotICAgICAgICBNYXBwZXIgbTEgPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgbTEpOwotICAgICAgICBtMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjazIoKSB7CisgICAgICAgIC8vIGR1bW15IC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15IiwgbSk7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkyIikpOwogICAgICAgICBNYXBwZXIgbTIgPSBuZXcgTWFwcGVyKHByb2plY3QpOwogICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgbTIpOwogICAgICAgICBtMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTMiKSk7CiAgICAgICAgIE1hcHBlciBtMyA9IG5ldyBNYXBwZXIocHJvamVjdCk7CiAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBtMyk7Ci0gICAgICAgIG0zLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15MSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG0xLmdldEltcGxlbWVudGF0aW9uKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgbTMuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7CisgICAgICAgIG0uZ2V0SW1wbGVtZW50YXRpb24oKTsKKyAgICB9CiAKLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2szKCkgeworICAgICAgICAvLyBkdW1teSAtLT4gZHVtbXkyIC0tPiBkdW1teTMKICAgICAgICAgLy8gKHdoaWNoIGhvbGRzIGEgZ2xvYiBtYXBwZXIgZnJvbSAiKi5qYXZhIiB0byAiKi5jbGFzcyIKLSAgICAgICAgbTEgPSBuZXcgTWFwcGVyKHByb2plY3QpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgbTEpOwotICAgICAgICBtMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7Ci0gICAgICAgIG0yID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15IiwgbSk7CisgICAgICAgIG0uc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkyIikpOworICAgICAgICBNYXBwZXIgbTIgPSBuZXcgTWFwcGVyKHByb2plY3QpOwogICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgbTIpOwogICAgICAgICBtMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTMiKSk7Ci0gICAgICAgIG0zID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKKyAgICAgICAgTWFwcGVyIG0zID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIG0zKTsKICAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgbXQgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKICAgICAgICAgbXQuc2V0VmFsdWUoImdsb2IiKTsKICAgICAgICAgbTMuc2V0VHlwZShtdCk7CiAgICAgICAgIG0zLnNldEZyb20oIiouamF2YSIpOwogICAgICAgICBtMy5zZXRUbygiKi5jbGFzcyIpOwotICAgICAgICBGaWxlTmFtZU1hcHBlciBmbW0gPSBtMS5nZXRJbXBsZW1lbnRhdGlvbigpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgYmUgZ2xvYiIsIGZtbSBpbnN0YW5jZW9mIEdsb2JQYXR0ZXJuTWFwcGVyKTsKKyAgICAgICAgRmlsZU5hbWVNYXBwZXIgZm1tID0gbS5nZXRJbXBsZW1lbnRhdGlvbigpOworICAgICAgICBhc3NlcnRUaGF0KCJzaG91bGQgYmUgZ2xvYiIsIGZtbSwgaW5zdGFuY2VPZihHbG9iUGF0dGVybk1hcHBlci5jbGFzcykpOwogICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBmbW0ubWFwRmlsZU5hbWUoImEuamF2YSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImEuamF2YSBzaG91bGQgbWF0Y2giLCAxLCByZXN1bHQubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLmNsYXNzIiwgcmVzdWx0WzBdKTsKQEAgLTE2NiwzMCArMTYxLDI5IEBACiAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlcjMgPSBuZXcgTWVyZ2luZ01hcHBlcigpOwogICAgICAgICBtYXBwZXIzLnNldFRvKCJtZXJnZWZpbGUiKTsKIAotICAgICAgICBNYXBwZXIgY29udGFpbmVyID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLSAgICAgICAgY29udGFpbmVyLmFkZENvbmZpZ3VyZWRNYXBwZXIobWFwcGVyMSk7Ci0gICAgICAgIGNvbnRhaW5lci5hZGQobWFwcGVyMik7Ci0gICAgICAgIGNvbnRhaW5lci5hZGQobWFwcGVyMyk7CisgICAgICAgIC8vIG0gaXMgaW1wbGljaXQgY29tcG9zaXRlCisgICAgICAgIG0uYWRkQ29uZmlndXJlZE1hcHBlcihtYXBwZXIxKTsKKyAgICAgICAgbS5hZGQobWFwcGVyMik7CisgICAgICAgIG0uYWRkKG1hcHBlcjMpOwogCi0gICAgICAgIEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyID0gY29udGFpbmVyLmdldEltcGxlbWVudGF0aW9uKCk7CisgICAgICAgIEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyID0gbS5nZXRJbXBsZW1lbnRhdGlvbigpOwogICAgICAgICBTdHJpbmdbXSB0YXJnZXRzID0gZmlsZU5hbWVNYXBwZXIubWFwRmlsZU5hbWUoImZyb21maWxlbmFtZSIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKCJubyBmaWxlbmFtZXMgbWFwcGVkIiwgdGFyZ2V0cyk7CiAgICAgICAgIGFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGZpbGVuYW1lcyBtYXBwZWQiLCAzLCB0YXJnZXRzLmxlbmd0aCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IEFycmF5cy5hc0xpc3QodGFyZ2V0cyk7Ci0gICAgICAgIGFzc2VydFRydWUoImNhbm5vdCBmaW5kIGV4cGVjdGVkIHRhcmdldCBcInRvZmlsZW5hbWVcIiIsCi0gICAgICAgICAgICAgICAgbGlzdC5jb250YWlucygidG9maWxlbmFtZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwiZnJvbWZpbGVuYW1lXCIiLAotICAgICAgICAgICAgICAgIGxpc3QuY29udGFpbnMoImZyb21maWxlbmFtZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwibWVyZ2VmaWxlXCIiLAotICAgICAgICAgICAgICAgIGxpc3QuY29udGFpbnMoIm1lcmdlZmlsZSIpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KHRhcmdldHMpOworICAgICAgICBhc3NlcnRUaGF0KCJjYW5ub3QgZmluZCBleHBlY3RlZCB0YXJnZXQgXCJ0b2ZpbGVuYW1lXCIiLCBsaXN0LCBoYXNJdGVtKCJ0b2ZpbGVuYW1lIikpOworICAgICAgICBhc3NlcnRUaGF0KCJjYW5ub3QgZmluZCBleHBlY3RlZCB0YXJnZXQgXCJmcm9tZmlsZW5hbWVcIiIsIGxpc3QsIGhhc0l0ZW0oImZyb21maWxlbmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwibWVyZ2VmaWxlXCIiLCBsaXN0LCBoYXNJdGVtKCJtZXJnZWZpbGUiKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogPHByZT4KKyAgICAgKiBhIC0tPiBiIC0tPiBjIC0tLSBkZWYKKyAgICAgKiAgICAgICAgICAgICAgXC0tIGdoaQorICAgICAqIDwvcHJlPgorICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENoYWluZWQoKSB7Ci0KLSAgICAgICAgLy8gYSAtLT4gYiAtLT4gYyAtLS0gZGVmCi0gICAgICAgIC8vICAgICAgICAgICAgICAgXC0tIGdoaQotCiAgICAgICAgIEZpbGVOYW1lTWFwcGVyIG1hcHBlckFCID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CiAgICAgICAgIG1hcHBlckFCLnNldEZyb20oImEiKTsKICAgICAgICAgbWFwcGVyQUIuc2V0VG8oImIiKTsKQEAgLTE5OCw5ICsxOTIsNiBAQAogICAgICAgICBtYXBwZXJCQy5zZXRGcm9tKCJiIik7CiAgICAgICAgIG1hcHBlckJDLnNldFRvKCJjIik7CiAKLSAgICAgICAgLy9pbXBsaWNpdCBjb21wb3NpdGUKLSAgICAgICAgTWFwcGVyIG1hcHBlckNYID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKLQogICAgICAgICBGaWxlTmFtZU1hcHBlciBtYXBwZXJERUYgPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKICAgICAgICAgbWFwcGVyREVGLnNldEZyb20oImMiKTsKICAgICAgICAgbWFwcGVyREVGLnNldFRvKCJkZWYiKTsKQEAgLTIwOSwyMiArMjAwLDIzIEBACiAgICAgICAgIG1hcHBlckdISS5zZXRGcm9tKCJjIik7CiAgICAgICAgIG1hcHBlckdISS5zZXRUbygiZ2hpIik7CiAKLSAgICAgICAgbWFwcGVyQ1guYWRkKG1hcHBlckRFRik7Ci0gICAgICAgIG1hcHBlckNYLmFkZChtYXBwZXJHSEkpOworICAgICAgICAvLyBtIGlzIGltcGxpY2l0IGNvbXBvc2l0ZQorICAgICAgICBtLmFkZChtYXBwZXJERUYpOworICAgICAgICBtLmFkZChtYXBwZXJHSEkpOwogCiAgICAgICAgIE1hcHBlciBjaGFpbmVkID0gbmV3IE1hcHBlcihwcm9qZWN0KTsKICAgICAgICAgY2hhaW5lZC5zZXRDbGFzc25hbWUoQ2hhaW5lZE1hcHBlci5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBjaGFpbmVkLmFkZChtYXBwZXJBQik7CiAgICAgICAgIGNoYWluZWQuYWRkKG1hcHBlckJDKTsKLSAgICAgICAgY2hhaW5lZC5hZGRDb25maWd1cmVkTWFwcGVyKG1hcHBlckNYKTsKKyAgICAgICAgY2hhaW5lZC5hZGRDb25maWd1cmVkTWFwcGVyKG0pOwogCiAgICAgICAgIEZpbGVOYW1lTWFwcGVyIGZpbGVOYW1lTWFwcGVyID0gY2hhaW5lZC5nZXRJbXBsZW1lbnRhdGlvbigpOwogICAgICAgICBTdHJpbmdbXSB0YXJnZXRzID0gZmlsZU5hbWVNYXBwZXIubWFwRmlsZU5hbWUoImEiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgibm8gZmlsZW5hbWVzIG1hcHBlZCIsIHRhcmdldHMpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBmaWxlbmFtZXMgbWFwcGVkIiwgMiwgdGFyZ2V0cy5sZW5ndGgpOwotICAgICAgICBMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KHRhcmdldHMpOwotICAgICAgICBhc3NlcnRUcnVlKCJjYW5ub3QgZmluZCBleHBlY3RlZCB0YXJnZXQgXCJkZWZcIiIsIGxpc3QuY29udGFpbnMoImRlZiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwiZ2hpXCIiLCBsaXN0LmNvbnRhaW5zKCJnaGkiKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsaXN0ID0gQXJyYXlzLmFzTGlzdCh0YXJnZXRzKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiY2Fubm90IGZpbmQgZXhwZWN0ZWQgdGFyZ2V0IFwiZGVmXCIiLCBsaXN0LCBoYXNJdGVtKCJkZWYiKSk7CisgICAgICAgIGFzc2VydFRoYXQoImNhbm5vdCBmaW5kIGV4cGVjdGVkIHRhcmdldCBcImdoaVwiIiwgbGlzdCwgaGFzSXRlbSgiZ2hpIikpOwogCiAgICAgICAgIHRhcmdldHMgPSBmaWxlTmFtZU1hcHBlci5tYXBGaWxlTmFtZSgieiIpOwogICAgICAgICBhc3NlcnROdWxsKHRhcmdldHMpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01vZHVsZVZlcnNpb25UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvTW9kdWxlVmVyc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDYwNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL01vZHVsZVZlcnNpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMge0BsaW5rIE1vZHVsZVZlcnNpb259IGNsYXNzLgorICovCitwdWJsaWMgY2xhc3MgTW9kdWxlVmVyc2lvblRlc3QgeworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEV4cGVjdGVkRXhjZXB0aW9uIGV4cGVjdGVkID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlVmVyc2lvblN0cmluZ051bWJlclByZUJ1aWxkKCkgeworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworCisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0TnVtYmVyKCIxLjEuMyIpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldFByZVJlbGVhc2UoImVhIik7CisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0QnVpbGQoIjI1Iik7CisKKyAgICAgICAgU3RyaW5nIHZlcnNpb25TdHIgPSBtb2R1bGVWZXJzaW9uLnRvTW9kdWxlVmVyc2lvblN0cmluZygpOworCisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyBmb3Igbm9uLW51bGwgbW9kdWxlIHZlcnNpb24gc3RyaW5nLiIsCisgICAgICAgICAgICB2ZXJzaW9uU3RyKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIGZvciBjb3JyZWN0IG1vZHVsZSB2ZXJzaW9uIHN0cmluZy4iLAorICAgICAgICAgICAgdmVyc2lvblN0ci5tYXRjaGVzKCIxXFwuMVxcLjNbLStdZWFcXCsyNSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVWZXJzaW9uU3RyaW5nTnVtYmVyUHJlKCkgeworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworCisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0TnVtYmVyKCIxLjEuMyIpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldFByZVJlbGVhc2UoImVhIik7CisKKyAgICAgICAgU3RyaW5nIHZlcnNpb25TdHIgPSBtb2R1bGVWZXJzaW9uLnRvTW9kdWxlVmVyc2lvblN0cmluZygpOworCisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJDaGVja2luZyBmb3Igbm9uLW51bGwgbW9kdWxlIHZlcnNpb24gc3RyaW5nLiIsCisgICAgICAgICAgICB2ZXJzaW9uU3RyKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNoZWNraW5nIGZvciBjb3JyZWN0IG1vZHVsZSB2ZXJzaW9uIHN0cmluZy4iLAorICAgICAgICAgICAgdmVyc2lvblN0ci5tYXRjaGVzKCIxXFwuMVxcLjNbLStdZWEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlVmVyc2lvblN0cmluZ051bWJlckJ1aWxkKCkgeworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworCisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0TnVtYmVyKCIxLjEuMyIpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldEJ1aWxkKCIyNSIpOworCisgICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyID0gbW9kdWxlVmVyc2lvbi50b01vZHVsZVZlcnNpb25TdHJpbmcoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiQ2hlY2tpbmcgZm9yIG5vbi1udWxsIG1vZHVsZSB2ZXJzaW9uIHN0cmluZy4iLAorICAgICAgICAgICAgdmVyc2lvblN0cik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDaGVja2luZyBmb3IgY29ycmVjdCBtb2R1bGUgdmVyc2lvbiBzdHJpbmcuIiwKKyAgICAgICAgICAgIHZlcnNpb25TdHIubWF0Y2hlcygiMVxcLjFcXC4zWy0rXVxcKzI1IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVZlcnNpb25TdHJpbmdOdW1iZXJPbmx5KCkgeworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworCisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0TnVtYmVyKCIxLjEuMyIpOworCisgICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyID0gbW9kdWxlVmVyc2lvbi50b01vZHVsZVZlcnNpb25TdHJpbmcoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiQ2hlY2tpbmcgZm9yIG5vbi1udWxsIG1vZHVsZSB2ZXJzaW9uIHN0cmluZy4iLAorICAgICAgICAgICAgdmVyc2lvblN0cik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkNoZWNraW5nIGZvciBjb3JyZWN0IG1vZHVsZSB2ZXJzaW9uIHN0cmluZy4iLAorICAgICAgICAgICAgIjEuMS4zIiwgdmVyc2lvblN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlVmVyc2lvblN0cmluZ051bGxOdW1iZXIoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgIE1vZHVsZVZlcnNpb24gbW9kdWxlVmVyc2lvbiA9IG5ldyBNb2R1bGVWZXJzaW9uKCk7CisgICAgICAgIG1vZHVsZVZlcnNpb24udG9Nb2R1bGVWZXJzaW9uU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbE51bWJlcigpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKTsKKworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldE51bWJlcihudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTnVtYmVyKCkgeworICAgICAgICBleHBlY3RlZC5leHBlY3QoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKworICAgICAgICBNb2R1bGVWZXJzaW9uIG1vZHVsZVZlcnNpb24gPSBuZXcgTW9kdWxlVmVyc2lvbigpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldE51bWJlcigiMS0xLTMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTnVtYmVyMigpIHsKKyAgICAgICAgZXhwZWN0ZWQuZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgTW9kdWxlVmVyc2lvbiBtb2R1bGVWZXJzaW9uID0gbmV3IE1vZHVsZVZlcnNpb24oKTsKKyAgICAgICAgbW9kdWxlVmVyc2lvbi5zZXROdW1iZXIoIjEuMSszIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByZVJlbGVhc2UoKSB7CisgICAgICAgIGV4cGVjdGVkLmV4cGVjdChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgIE1vZHVsZVZlcnNpb24gbW9kdWxlVmVyc2lvbiA9IG5ldyBNb2R1bGVWZXJzaW9uKCk7CisgICAgICAgIG1vZHVsZVZlcnNpb24uc2V0TnVtYmVyKCIxLjEuMyIpOworICAgICAgICBtb2R1bGVWZXJzaW9uLnNldFByZVJlbGVhc2UoImVhK2ludGVyaW0iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0aFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoVGVzdC5qYXZhCmluZGV4IGI3NWU5ZjUuLjVmYWU2YmIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXRoVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTcgKzE5LDIyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljVGVzdE5hbWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbmRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBKVW5pdCB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGgKQEAgLTQyLDE3ICs0NywyNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc05ldFdhcmUgPSBPcy5pc0ZhbWlseSgibmV0d2FyZSIpOwogCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisgICAgcHJpdmF0ZSBQYXRoIHA7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IikpOworICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcihTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNUZXN0TmFtZXMuVEVTVF9ST09UX0RJUkVDVE9SWSkpOworICAgICAgICB9CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKICAgICB9CiAKICAgICAvLyBhY3R1YWxseSB0ZXN0cyBjb25zdHJ1Y3RvciBhcyB3ZWxsIGFzIHNldFBhdGgKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvclVuaXhTdHlsZSgpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9iIik7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiL2E6L2IiKTsKICAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInR3byBpdGVtcywgVW5peCBzdHlsZSIsIDIsIGwubGVuZ3RoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CkBAIC03MCwzMSArODIsMzEgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGF0aFVuaXhTdHlsZSgpIHsKLSAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAic3JjL2V0YyIpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi4uOnRlc3RjYXNlcyIpOworICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCksICJzcmMvZXRjIikuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgIi4uOnRlc3RjYXNlcyIpOwogICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygidHdvIGl0ZW1zLCBVbml4IHN0eWxlIiwgMiwgbC5sZW5ndGgpOwogICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKLSAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKLSAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL3NyYyIpKTsKLSAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKLSAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiL3NyYy9ldGMvdGVzdGNhc2VzIikpOworICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL3NyYyIpKTsKKyAgICAgICAgICAgYXNzZXJ0VGhhdCgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKKyAgICAgICAgICAgICAgICAgbFsxXSwgZW5kc1dpdGgoIi9zcmMvZXRjL3Rlc3RjYXNlcyIpKTsKICAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKLSAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKLSAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiXFxzcmMiKSk7Ci0gICAgICAgICAgIGFzc2VydFRydWUoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gc3JjL2V0YyIsCi0gICAgICAgICAgICAgICAgIGxbMV0uZW5kc1dpdGgoIlxcc3JjXFxldGNcXHRlc3RjYXNlcyIpKTsKKyAgICAgICAgICAgYXNzZXJ0VGhhdCgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKKyAgICAgICAgICAgICAgICAgbFswXSwgZW5kc1dpdGgoIlxcc3JjIikpOworICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzFdLCBlbmRzV2l0aCgiXFxzcmNcXGV0Y1xcdGVzdGNhc2VzIikpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAotICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCJcXHNyYyIpKTsKLSAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBzcmMvZXRjIiwKLSAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiXFxzcmNcXGV0Y1xcdGVzdGNhc2VzIikpOworICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHNyYy9ldGMiLAorICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiXFxzcmMiKSk7CisgICAgICAgICAgIGFzc2VydFRoYXQoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gc3JjL2V0YyIsCisgICAgICAgICAgICAgICAgIGxbMV0sIGVuZHNXaXRoKCJcXHNyY1xcZXRjXFx0ZXN0Y2FzZXMiKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcldpbmRvd3NTdHlsZSgpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIlxcYTtcXGIiKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JXaW5kb3dzU3R5bGVUd29JdGVtc05vRHJpdmUoKSB7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiXFxhO1xcYiIpOwogICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygidHdvIGl0ZW1zLCBET1Mgc3R5bGUiLCAyLCBsLmxlbmd0aCk7CiAgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewpAQCAtMTA4LDEzICsxMjAsMTYgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhiYXNlICsgImEiLCBsWzBdKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhiYXNlICsgImIiLCBsWzFdKTsKICAgICAgICAgfQorICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yV2luZG93c1N0eWxlKCkgewogICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6XFx0ZXN0Iik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOwogICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL2MiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXSwgZW5kc1dpdGgoIi9jIikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOwogICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2x1bWVzIG9uIE5ldFdhcmUiLCAxLCBsLmxlbmd0aCk7CkBAIC0xMjMsNTEgKzEzOCwxOSBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkcml2ZXMgb24gRE9TIiwgMSwgbC5sZW5ndGgpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CiAgICAgICAgIH0KKyAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcldpbmRvd3NTdHlsZVR3b0l0ZW1zKCkgewogICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6XFx0ZXN0O2Q6XFxwcm9ncmFtcyIpOwotICAgICAgICBsID0gcC5saXN0KCk7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgNCwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiYyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9jIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiYyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0sIGVuZHNXaXRoKCIvYyIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoImQgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKLSAgICAgICAgICAgICAgICAgICBsWzJdLmVuZHNXaXRoKCIvZCIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Byb2dyYW1zIiwgbFszXSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZvbHVtZXMgb24gTmV0V2FyZSIsIDIsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiYzpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkOlxccHJvZ3JhbXMiLCBsWzFdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkcml2ZXMgb24gRE9TIiwgMiwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImQ6XFxwcm9ncmFtcyIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6L3Rlc3QiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL2MiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZvbHVtZXMgb24gTmV0V2FyZSIsIDEsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiYzpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkcml2ZXMgb24gRE9TIiwgMSwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjOlxcdGVzdCIsIGxbMF0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgImM6L3Rlc3Q7ZDovcHJvZ3JhbXMiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOwotICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCA0LCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL2MiKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJkIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiL2QiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJkIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsyXSwgZW5kc1dpdGgoIi9kIikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcHJvZ3JhbXMiLCBsWzNdKTsKICAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMiwgbC5sZW5ndGgpOwpAQCAtMTgxLDgyICsxNjQsODAgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5ldFdhcmVTdHlsZSgpIHsKLSAgICAgICAgLy8gdHJ5IGEgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGgsIHNlZSBob3cgaXQgaXMgaGFuZGxlZAotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAic3lzOlxcdGVzdCIpOworICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcldpbmRvd3NTdHlsZVVuaXhGUygpIHsKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJjOi90ZXN0Iik7CiAgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgMiwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL3N5cyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL2MiKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi90ZXN0IiwgbFsxXSk7CiAgICAgICAgIH0gZWxzZSBpZiAoaXNOZXRXYXJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN5czpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2x1bWVzIG9uIE5ldFdhcmUiLCAxLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbXVsdGlwbGUgY2hhcmFjdGVyLWxlbmd0aCB2b2x1bWVzIG9uIFdpbmRvd3MiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKLSAgICAgICAgICAgICAgICAgICBsWzBdLmVuZHNXaXRoKCJcXHN5cyIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKLSAgICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCJcXHRlc3QiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRyaXZlcyBvbiBET1MiLCAxLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyB0cnkgYSBtdWx0aS1wYXJ0IG5ldHdhcmUtdm9sdW1lIGxlbmd0aCBwYXRoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKLSAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJzeXM6XFx0ZXN0O2RldjpcXHRlbXAiKTsKLSAgICAgICAgbCA9IHAubGlzdCgpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yV2luZG93c1N0eWxlVW5peEZTVHdvSXRlbXMoKSB7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiYzovdGVzdDtkOi9wcm9ncmFtcyIpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDQsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9zeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJjIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXSwgZW5kc1dpdGgoIi9jIikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVzdCIsIGxbMV0pOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGV2IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiL2RldiIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3RlbXAiLCBsWzNdKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImQgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLCBlbmRzV2l0aCgiL2QiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9wcm9ncmFtcyIsIGxbM10pOwogICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2x1bWVzIG9uIE5ldFdhcmUiLCAyLCBsLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN5czpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZXY6XFx0ZW1wIiwgbFsxXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYzpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkOlxccHJvZ3JhbXMiLCBsWzFdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBtdWx0aXBsZSBjaGFyYWN0ZXItbGVuZ3RoIHZvbHVtZXMgb24gV2luZG93cyIsIDQsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcc3lzIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMV0uZW5kc1dpdGgoIlxcdGVzdCIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoImRldiByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMl0uZW5kc1dpdGgoIlxcZGV2IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVtcCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbM10uZW5kc1dpdGgoIlxcdGVtcCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZHJpdmVzIG9uIERPUyIsIDIsIGwubGVuZ3RoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYzpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkOlxccHJvZ3JhbXMiLCBsWzFdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIHRyeSBhIG5ldHdhcmUtdm9sdW1lIGxlbmd0aCBwYXRoIHcvZm9yd2FyZCBzbGFzaCwgc2VlIGhvdyBpdCBpcyBoYW5kbGVkCi0gICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAic3lzOi90ZXN0Iik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAvLyB0cnkgYSBuZXR3YXJlLXZvbHVtZSBsZW5ndGggcGF0aCwgc2VlIGhvdyBpdCBpcyBoYW5kbGVkCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOZXRXYXJlU3R5bGUoKSB7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAic3lzOlxcdGVzdCIpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDIsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9zeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL3N5cyIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKICAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBtdWx0aXBsZSBjaGFyYWN0ZXItbGVuZ3RoIHZvbHVtZXMgb24gV2luZG93cyIsIDIsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIlxcc3lzIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMV0uZW5kc1dpdGgoIlxcdGVzdCIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0sIGVuZHNXaXRoKCJcXHN5cyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoInRlc3QgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzFdLCBlbmRzV2l0aCgiXFx0ZXN0IikpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIHRyeSBhIG11bHRpLXBhcnQgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGggdy9mb3J3YXJkIHNsYXNoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKLSAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJzeXM6L3Rlc3Q7ZGV2Oi90ZW1wIik7Ci0gICAgICAgIGwgPSBwLmxpc3QoKTsKKyAgICAvLyB0cnkgYSBtdWx0aS1wYXJ0IG5ldHdhcmUtdm9sdW1lIGxlbmd0aCBwYXRoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5ldFdhcmVTdHlsZVR3b0l0ZW1zKCkgeworICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czpcXHRlc3Q7ZGV2OlxcdGVtcCIpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJubyBkcml2ZXMgb24gVW5peCIsIDQsIGwubGVuZ3RoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMF0uZW5kc1dpdGgoIi9zeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL3N5cyIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoImRldiByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAotICAgICAgICAgICAgICAgICAgIGxbMl0uZW5kc1dpdGgoIi9kZXYiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJkZXYgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLCBlbmRzV2l0aCgiL2RldiIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3RlbXAiLCBsWzNdKTsKICAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMiwgbC5sZW5ndGgpOwpAQCAtMjY0LDI2ICsyNDUsODAgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGV2OlxcdGVtcCIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIG11bHRpcGxlIGNoYXJhY3Rlci1sZW5ndGggdm9sdW1lcyBvbiBXaW5kb3dzIiwgNCwgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiXFxzeXMiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFsxXS5lbmRzV2l0aCgiXFx0ZXN0IikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGV2IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFsyXS5lbmRzV2l0aCgiXFxkZXYiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJ0ZW1wIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFszXS5lbmRzV2l0aCgiXFx0ZW1wIikpOwotICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VGhhdCgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFswXSwgZW5kc1dpdGgoIlxcc3lzIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgidGVzdCByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMV0sIGVuZHNXaXRoKCJcXHRlc3QiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJkZXYgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzJdLCBlbmRzV2l0aCgiXFxkZXYiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZW1wIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFszXSwgZW5kc1dpdGgoIlxcdGVtcCIpKTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvLyB0cnkgYSBtdWx0aS1wYXJ0IG5ldHdhcmUtdm9sdW1lIGxlbmd0aCBwYXRoIHdpdGggVU5JWAotICAgICAgICAvLyBzZXBhcmF0b3IgKHRoaXMgdGVzdGNhc2UgaWYgZnJvbSBhbiBhY3R1YWwgYnVnIHRoYXQgd2FzCi0gICAgICAgIC8vIGZvdW5kLCBpbiBBdmFpbGFibGVUZXN0LCB3aGljaCB1c2VzIFBhdGhUb2tlbml6ZXIpCi0gICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgIlNZUzpcXEpBVkEvbGliL3J0LmphcjpTWVM6XFxKQVZBL2xpYi9jbGFzc2VzLnppcCIpOwotICAgICAgICBsID0gcC5saXN0KCk7CisgICAgLy8gdHJ5IGEgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGggdy9mb3J3YXJkIHNsYXNoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5ldFdhcmVTdHlsZVVuaXhGUygpIHsKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJzeXM6L3Rlc3QiKTsKKyAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOworICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL3N5cyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc05ldFdhcmUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidm9sdW1lcyBvbiBOZXRXYXJlIiwgMSwgbC5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeXM6XFx0ZXN0IiwgbFswXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbXVsdGlwbGUgY2hhcmFjdGVyLWxlbmd0aCB2b2x1bWVzIG9uIFdpbmRvd3MiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiXFxzeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsxXSwgZW5kc1dpdGgoIlxcdGVzdCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRyeSBhIG11bHRpLXBhcnQgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGggdy9mb3J3YXJkIHNsYXNoLCBzZWUgaG93IGl0IGlzIGhhbmRsZWQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3Rvck5ldFdhcmVTdHlsZVVuaXhGU1R3b0l0ZW1zKCkgeworICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgInN5czovdGVzdDtkZXY6L3RlbXAiKTsKKyAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOworICAgICAgICBpZiAoaXNVbml4U3R5bGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gZHJpdmVzIG9uIFVuaXgiLCA0LCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiL3N5cyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Rlc3QiLCBsWzFdKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImRldiByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMl0sIGVuZHNXaXRoKCIvZGV2IikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGVtcCIsIGxbM10pOworICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2b2x1bWVzIG9uIE5ldFdhcmUiLCAyLCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInN5czpcXHRlc3QiLCBsWzBdLnRvTG93ZXJDYXNlKExvY2FsZS5VUykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZXY6XFx0ZW1wIiwgbFsxXS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibm8gbXVsdGlwbGUgY2hhcmFjdGVyLWxlbmd0aCB2b2x1bWVzIG9uIFdpbmRvd3MiLCA0LCBsLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiXFxzeXMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJ0ZXN0IHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsxXSwgZW5kc1dpdGgoIlxcdGVzdCIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImRldiByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMl0sIGVuZHNXaXRoKCJcXGRldiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoInRlbXAgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzNdLCBlbmRzV2l0aCgiXFx0ZW1wIikpOworICAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRyeSBhIG11bHRpLXBhcnQgbmV0d2FyZS12b2x1bWUgbGVuZ3RoIHBhdGggd2l0aCBVTklYCisgICAgLy8gc2VwYXJhdG9yICh0aGlzIHRlc3RjYXNlIGlmIGZyb20gYW4gYWN0dWFsIGJ1ZyB0aGF0IHdhcworICAgIC8vIGZvdW5kLCBpbiBBdmFpbGFibGVUZXN0LCB3aGljaCB1c2VzIFBhdGhUb2tlbml6ZXIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JOZXRXYXJlU3R5bGVVbml4UFMoKSB7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiU1lTOlxcSkFWQS9saWIvcnQuamFyOlNZUzpcXEpBVkEvbGliL2NsYXNzZXMuemlwIik7CisgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIGRyaXZlcyBvbiBVbml4IiwgMywgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiL1NZUyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoInN5cyByZXNvbHZlZCByZWxhdGl2ZSB0byBwcm9qZWN0XCdzIGJhc2VkaXIiLAorICAgICAgICAgICAgICAgICAgIGxbMF0sIGVuZHNXaXRoKCIvU1lTIikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvSkFWQS9saWIvcnQuamFyIiwgbFsxXSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9KQVZBL2xpYi9jbGFzc2VzLnppcCIsIGxbMl0pOwogICAgICAgICB9IGVsc2UgaWYgKGlzTmV0V2FyZSkgewpAQCAtMjkyLDE4ICszMjcsMTggQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygic3lzOlxcamF2YVxcbGliXFxjbGFzc2VzLnppcCIsIGxbMV0udG9Mb3dlckNhc2UoTG9jYWxlLlVTKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIG11bHRpcGxlIGNoYXJhY3Rlci1sZW5ndGggdm9sdW1lcyBvbiBXaW5kb3dzIiwgMywgbC5sZW5ndGgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgic3lzIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCi0gICAgICAgICAgICAgICAgICAgbFswXS5lbmRzV2l0aCgiXFxTWVMiKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJqYXZhL2xpYi9ydC5qYXIgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKLSAgICAgICAgICAgICAgICAgICBsWzFdLmVuZHNXaXRoKCJcXEpBVkFcXGxpYlxccnQuamFyIikpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiamF2YS9saWIvY2xhc3Nlcy56aXAgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKLSAgICAgICAgICAgICAgICAgICBsWzJdLmVuZHNXaXRoKCJcXEpBVkFcXGxpYlxcY2xhc3Nlcy56aXAiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJzeXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzBdLCBlbmRzV2l0aCgiXFxTWVMiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJqYXZhL2xpYi9ydC5qYXIgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gcHJvamVjdFwncyBiYXNlZGlyIiwKKyAgICAgICAgICAgICAgICAgICBsWzFdLCBlbmRzV2l0aCgiXFxKQVZBXFxsaWJcXHJ0LmphciIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImphdmEvbGliL2NsYXNzZXMuemlwIHJlc29sdmVkIHJlbGF0aXZlIHRvIHByb2plY3RcJ3MgYmFzZWRpciIsCisgICAgICAgICAgICAgICAgICAgbFsyXSwgZW5kc1dpdGgoIlxcSkFWQVxcbGliXFxjbGFzc2VzLnppcCIpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yTWl4ZWRTdHlsZSgpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIlxcYTtcXGI6L2MiKTsKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICJcXGE7XFxiOi9jIik7CiAgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHJlZSBpdGVtcywgbWl4ZWQgc3R5bGUiLCAzLCBsLmxlbmd0aCk7CiAgICAgICAgIGlmIChpc1VuaXhTdHlsZSkgewpAQCAtMzI0LDcgKzM1OSw2IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMb2NhdGlvbigpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCk7CiAgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoRmlsZS5zZXBhcmF0b3JDaGFyICsgImEiKSk7CiAgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CkBAIC0zNDEsNyArMzc1LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZGluZygpIHsKLSAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9iIik7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiL2E6L2IiKTsKICAgICAgICAgU3RyaW5nW10gbCA9IHAubGlzdCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIjIgYWZ0ZXIgY29uc3RydWN0aW9uIiwgMiwgbC5sZW5ndGgpOwogICAgICAgICBwLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvYyIpKTsKQEAgLTM2MCw3ICszOTQsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQYXRoKCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiIik7CisgICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiIik7CiAgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIGFmdGVyIGNvbnN0cnVjdGlvbiIsIDAsIGwubGVuZ3RoKTsKICAgICAgICAgcC5zZXRQYXRoKCIiKTsKQEAgLTM3Niw3ICs0MTAsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlKCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0LCAiL2E6L2EiKTsKKyAgICAgICAgcCA9IG5ldyBQYXRoKHByb2plY3QsICIvYTovYSIpOwogICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiMSBhZnRlciBjb25zdHJ1Y3Rpb24iLCAxLCBsLmxlbmd0aCk7CiAgICAgICAgIFN0cmluZyBiYXNlID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpOwpAQCAtMzk1LDEyNSArNDI5LDExMiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UoKSB7Ci0gICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QsICIvYTovYSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIFBhdGggd2l0aCBlbGVtZW50cyBmcm9tIGNvbnN0cnVjdG9yIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0UmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9hIik7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgfQogCi0gICAgICAgIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRMb2NhdGlvblRoZW5SZWZpZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CiAgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9hIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIFBhdGggd2l0aCBlbGVtZW50cyBmcm9tIHNldExvY2F0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKKyAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VFeGlzdGluZ1JlZmlkKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKICAgICAgICAgUGF0aCBhbm90aGVyID0gbmV3IFBhdGgocHJvamVjdCwgIi9hOi9hIik7CiAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teXJlZiIsIGFub3RoZXIpOwotICAgICAgICBwID0gbmV3IFBhdGgocHJvamVjdCk7CiAgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLnNldExvY2F0aW9uKG5ldyBGaWxlKCIvYSIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgbG9jYXRpb24gaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHAuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9hIikpOworICAgIH0KIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRQYXRoKCIvYTtcXGEiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgcGF0aCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlQXR0cigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHAuc2V0UGF0aCgiL2E7XFxhIik7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmNyZWF0ZVBhdGgoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBjcmVhdGUgbmVzdGVkIFBhdGggaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudENyZWF0ZVBhdGgoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKKyAgICAgICAgcC5jcmVhdGVQYXRoKCk7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmNyZWF0ZVBhdGhFbGVtZW50KCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gY3JlYXRlIG5lc3RlZCBQYXRoRWxlbWVudCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50Q3JlYXRlUGF0aEVsZW1lbnQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKKyAgICAgICAgcC5jcmVhdGVQYXRoRWxlbWVudCgpOworICAgIH0KIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5hZGRGaWxlc2V0KG5ldyBGaWxlU2V0KCkpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCBuZXN0ZWQgRmlsZVNldCBpbiBQYXRoIHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50QWRkRmlsZXNldCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmFkZEZpbGVzZXQobmV3IEZpbGVTZXQoKSk7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmFkZEZpbGVsaXN0KG5ldyBGaWxlTGlzdCgpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIEZpbGVMaXN0IGluIFBhdGggdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRBZGRGaWxlbGlzdCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmFkZEZpbGVsaXN0KG5ldyBGaWxlTGlzdCgpKTsKKyAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuYWRkRGlyc2V0KG5ldyBEaXJTZXQoKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBEaXJzZXQgaW4gUGF0aCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudEFkZERpcnNldCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmFkZERpcnNldChuZXcgRGlyU2V0KCkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2soKSB7Ci0gICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBwKTsKICAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAubGlzdCgpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgUGF0aCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBwLmxpc3QoKTsKKyAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wUmVmZXJlbmNlQ2hlY2soKSB7CiAgICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMgLS0+IGR1bW15MQotICAgICAgICBQYXRoIHAxID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBwMSk7Ci0gICAgICAgIFBhdGggcDIgPSBwMS5jcmVhdGVQYXRoKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTIiLCBwMik7Ci0gICAgICAgIFBhdGggcDMgPSBwMi5jcmVhdGVQYXRoKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBwMyk7Ci0gICAgICAgIHAzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15MSIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAxLmxpc3QoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBwKTsKKyAgICAgICAgUGF0aCBwYSA9IHAuY3JlYXRlUGF0aCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgcGEpOworICAgICAgICBQYXRoIHBiID0gcGEuY3JlYXRlUGF0aCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgcGIpOworICAgICAgICBwYi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTEiKSk7CisgICAgICAgIHAubGlzdCgpOworICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVja1dpdGhMb2NhdGlvbigpIHsKICAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAod2l0aCBQYXRoICIvYSIpCi0gICAgICAgIHAxID0gbmV3IFBhdGgocHJvamVjdCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTEiLCBwMSk7Ci0gICAgICAgIHAyID0gcDEuY3JlYXRlUGF0aCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgcDIpOwotICAgICAgICBwMyA9IHAyLmNyZWF0ZVBhdGgoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHAzKTsKLSAgICAgICAgcDMuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9hIikpOwotICAgICAgICBTdHJpbmdbXSBsID0gcDEubGlzdCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgcCk7CisgICAgICAgIFBhdGggcGEgPSBwLmNyZWF0ZVBhdGgoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHBhKTsKKyAgICAgICAgUGF0aCBwYiA9IHBhLmNyZWF0ZVBhdGgoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MyIsIHBiKTsKKyAgICAgICAgcGIuc2V0TG9jYXRpb24obmV3IEZpbGUoIi9hIikpOworICAgICAgICBTdHJpbmdbXSBsID0gcC5saXN0KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiT25lIGVsZW1lbnQgYnVyaWVkIGRlZXAgaW5zaWRlIGEgbmVzdGVkIHBhdGggc3RydWN0dXJlIiwKICAgICAgICAgICAgICAgICAgICAgIDEsIGwubGVuZ3RoKTsKICAgICAgICAgaWYgKGlzVW5peFN0eWxlKSB7CkBAIC01MjcsNyArNTQ4LDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVMaXN0KCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKICAgICAgICAgRmlsZUxpc3QgZiA9IG5ldyBGaWxlTGlzdCgpOwogICAgICAgICBmLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CkBAIC01NDAsNyArNTYwLDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXQoKSB7Ci0gICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHByb2plY3QpOwogICAgICAgICBGaWxlU2V0IGYgPSBuZXcgRmlsZVNldCgpOwogICAgICAgICBmLnNldFByb2plY3QocHJvamVjdCk7CiAgICAgICAgIGYuc2V0RGlyKHByb2plY3QucmVzb2x2ZUZpbGUoIi4iKSk7CkBAIC01NTMsMjYgKzU3MiwyOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyU2V0KCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKICAgICAgICAgRGlyU2V0IGQgPSBuZXcgRGlyU2V0KCk7CiAgICAgICAgIGQuc2V0UHJvamVjdChwcm9qZWN0KTsKICAgICAgICAgZC5zZXREaXIocHJvamVjdC5yZXNvbHZlRmlsZSgiLiIpKTsKLSAgICAgICAgZC5zZXRJbmNsdWRlcygiYnVpbGQiKTsKKyAgICAgICAgU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImJ1aWxkLnRlc3RzLnZhbHVlIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoImJ1aWxkLnRlc3RzLnZhbHVlIG5vdCBzZXQiLCBzKTsKKyAgICAgICAgU3RyaW5nIG4gPSBQYXRocy5nZXQocykuZ2V0UGFyZW50KCkuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpLmVxdWFscygiYW50IikKKyAgICAgICAgICAgICAgICA/ICJ0YXJnZXQiIDogImJ1aWxkIjsKKyAgICAgICAgZC5zZXRJbmNsdWRlcyhuKTsKICAgICAgICAgcC5hZGREaXJzZXQoZCk7CiAgICAgICAgIFN0cmluZ1tdIGwgPSBwLmxpc3QoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGwubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByb2plY3QucmVzb2x2ZUZpbGUoImJ1aWxkIikuZ2V0QWJzb2x1dGVQYXRoKCksIGxbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMocHJvamVjdC5yZXNvbHZlRmlsZShuKS5nZXRBYnNvbHV0ZVBhdGgoKSwgbFswXSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaW9uKCkgewotICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwcm9qZWN0KTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJjaXJjdWxhciIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgcC5hcHBlbmQocCk7CisgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcC5saXN0KCkubGVuZ3RoKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24geCkgewotICAgICAgICAgICAgU3RyaW5nIG0gPSB4LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG0sIG0uY29udGFpbnMoImNpcmN1bGFyIikpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGF0dGVyblNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0VGVzdC5qYXZhCmluZGV4IDZiYWVjYmIuLmQ5MzFhZTAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QYXR0ZXJuU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsMjAgKzIwLDIyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CiBpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIEpVbml0IDQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXR0ZXJuU2V0LgpAQCAtNDMsMTUxICs0NSwxNjMgQEAKIAogcHVibGljIGNsYXNzIFBhdHRlcm5TZXRUZXN0IHsKIAorICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciB0ZXN0Rm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CiAKKyAgICBwcml2YXRlIFBhdHRlcm5TZXQgcDsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgcHJvamVjdCA9IG5ldyBQcm9qZWN0KCk7CiAgICAgICAgIHByb2plY3Quc2V0QmFzZWRpcigiLiIpOworICAgICAgICBwID0gbmV3IFBhdHRlcm5TZXQoKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRJZklzUmVmZXJlbmNlKCkgewotICAgICAgICBQYXR0ZXJuU2V0IHAgPSBuZXcgUGF0dGVyblNldCgpOworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRJbmNsdWRlc1RoZW5SZWZpZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CiAgICAgICAgIHAuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIFBhdHRlcm5TZXQgd2l0aCBlbGVtZW50cyBmcm9tIHNldEluY2x1ZGVzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gbmV3IFBhdHRlcm5TZXQoKTsKICAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBpbmNsdWRlcyBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuc2V0SW5jbHVkZXNmaWxlKG5ldyBGaWxlKCIvYSIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBzZXQgaW5jbHVkZXNmaWxlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRFeGNsdWRlcygiKiovKi5qYXZhIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGV4Y2x1ZGVzIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5zZXRFeGNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBleGNsdWRlc2ZpbGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmNyZWF0ZUluY2x1ZGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGluY2x1ZGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5jcmVhdGVFeGNsdWRlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBleGNsdWRlIGluIFBhdHRlcm5TZXQgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuY3JlYXRlSW5jbHVkZXNGaWxlKCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBpbmNsdWRlc2ZpbGUgaW4gUGF0dGVyblNldCB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcC5jcmVhdGVFeGNsdWRlc0ZpbGUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIGV4Y2x1ZGVzZmlsZSBpbiBQYXR0ZXJuU2V0IHRoYXQgaXMgYSByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHsKLSAgICAgICAgUGF0dGVyblNldCBwID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0UmVmaWRUaGVuSW5jbHVkZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLnNldEluY2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRSZWZpZFRoZW5JbmNsdWRlc2ZpbGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICAgICAgcC5zZXRJbmNsdWRlc2ZpbGUobmV3IEZpbGUoIi9hIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudFNldFJlZmlkVGhlbkV4Y2x1ZGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLnNldEV4Y2x1ZGVzKCIqKi8qLmphdmEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRSZWZpZFRoZW5FeGNsdWRlc2ZpbGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLnNldEV4Y2x1ZGVzZmlsZShuZXcgRmlsZSgiL2EiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0UmVmaWRUaGVuQWRkSW5jbHVkZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmNyZWF0ZUluY2x1ZGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRSZWZpZFRoZW5BZGRFeGNsdWRlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgICAgIHAuY3JlYXRlRXhjbHVkZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudFNldFJlZmlkVGhlbkFkZEluY2x1ZGVzZmlsZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmNyZWF0ZUluY2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudFNldFJlZmlkVGhlbkFkZEV4Y2x1ZGVzZmlsZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOworICAgICAgICBwLmNyZWF0ZUV4Y2x1ZGVzRmlsZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlQ2hlY2tJbmNsdWRlUGF0ZXJucygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKICAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15IiwgcCk7CiAgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIFBhdHRlcm5TZXQgYSBSZWZlcmVuY2UgdG8gaXRzZWxmLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHAuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgUGF0dGVyblNldCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKKyAgICB9CiAKLSAgICAgICAgLy8gZHVtbXkxIC0tPiBkdW1teTIgLS0+IGR1bW15MyAtLT4gZHVtbXkxCi0gICAgICAgIFBhdHRlcm5TZXQgcDEgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgcDEpOwotICAgICAgICBwMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7Ci0gICAgICAgIFBhdHRlcm5TZXQgcDIgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkyIiwgcDIpOwotICAgICAgICBwMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTMiKSk7Ci0gICAgICAgIFBhdHRlcm5TZXQgcDMgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkzIiwgcDMpOwotICAgICAgICBwMy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTEiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwMS5nZXRJbmNsdWRlUGF0dGVybnMocHJvamVjdCk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBjaXJjdWxhciByZWZlcmVuY2UuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcDEuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaXJjdWxhclJlZmVyZW5jZUNoZWNrRXhjbHVkZVBhdHRlcm5zKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBwKTsKKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teSIpKTsKKyAgICAgICAgcC5nZXRFeGNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgfQogCi0gICAgICAgIC8vIGR1bW15MSAtLT4gZHVtbXkyIC0tPiBkdW1teTMKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb29wUmVmZXJlbmNlQ2hlY2tJbmNsdWRlUGF0ZXJucygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgLy8gZHVtbXkgLS0+IGR1bW15QSAtLT4gZHVtbXlCIC0tPiBkdW1teQorICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkiLCBwKTsKKyAgICAgICAgcC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teUEiKSk7CisgICAgICAgIFBhdHRlcm5TZXQgcGEgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXlBIiwgcGEpOworICAgICAgICBwYS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teUIiKSk7CisgICAgICAgIFBhdHRlcm5TZXQgcGIgPSBuZXcgUGF0dGVyblNldCgpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXlCIiwgcGIpOworICAgICAgICBwYi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teSIpKTsKKyAgICAgICAgcC5nZXRJbmNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9vcFJlZmVyZW5jZUNoZWNrRXhjbHVkZVBhdGVybnMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIik7CisgICAgICAgIC8vIGR1bW15IC0tPiBkdW1teUEgLS0+IGR1bW15QiAtLT4gZHVtbXkKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15IiwgcCk7CisgICAgICAgIHAuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlBIikpOworICAgICAgICBQYXR0ZXJuU2V0IHBhID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15QSIsIHBhKTsKKyAgICAgICAgcGEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlCIikpOworICAgICAgICBQYXR0ZXJuU2V0IHBiID0gbmV3IFBhdHRlcm5TZXQoKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15QiIsIHBiKTsKKyAgICAgICAgcGIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkiKSk7CisgICAgICAgIHAuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVjaygpIHsKKyAgICAgICAgLy8gZHVtbXkgLS0+IGR1bW15QSAtLT4gZHVtbXlCCiAgICAgICAgIC8vICh3aGljaCBob2xkcyBwYXR0ZXJucyAiaW5jbHVkZSIgYW5kICJleGNsdWRlIikKLSAgICAgICAgcDEgPSBuZXcgUGF0dGVyblNldCgpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiZHVtbXkxIiwgcDEpOwotICAgICAgICBwMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJkdW1teTIiKSk7Ci0gICAgICAgIHAyID0gbmV3IFBhdHRlcm5TZXQoKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImR1bW15MiIsIHAyKTsKLSAgICAgICAgcDIuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXkzIikpOwotICAgICAgICBwMyA9IG5ldyBQYXR0ZXJuU2V0KCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teTMiLCBwMyk7Ci0gICAgICAgIHAzLnNldEluY2x1ZGVzKCJpbmNsdWRlIik7Ci0gICAgICAgIHAzLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKCJleGNsdWRlIik7Ci0gICAgICAgIFN0cmluZ1tdIGkgPSBwMS5nZXRJbmNsdWRlUGF0dGVybnMocHJvamVjdCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teSIsIHApOworICAgICAgICBwLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15QSIpKTsKKyAgICAgICAgUGF0dGVyblNldCBwYSA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teUEiLCBwYSk7CisgICAgICAgIHBhLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15QiIpKTsKKyAgICAgICAgUGF0dGVyblNldCBwYiA9IG5ldyBQYXR0ZXJuU2V0KCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJkdW1teUIiLCBwYik7CisgICAgICAgIHBiLnNldEluY2x1ZGVzKCJpbmNsdWRlIik7CisgICAgICAgIHBiLmNyZWF0ZUV4Y2x1ZGUoKS5zZXROYW1lKCJleGNsdWRlIik7CisgICAgICAgIFN0cmluZ1tdIGkgPSBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmUgaW5jbHVkZSBwYXR0ZXJuIGJ1cmllZCBkZWVwIGluc2lkZSBhIG5lc3RlZCBwYXR0ZXJuc2V0IHN0cnVjdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgICAxLCBpLmxlbmd0aCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiaW5jbHVkZSIsIGlbMF0pOwotICAgICAgICBpID0gcDMuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOworICAgICAgICBpID0gcGIuZ2V0RXhjbHVkZVBhdHRlcm5zKHByb2plY3QpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIk9uZSBleGNsdWRlIHBhdHRlcm4gYnVyaWVkIGRlZXAgaW5zaWRlIGEgbmVzdGVkIHBhdHRlcm5zZXQgc3RydWN0dXJlIiwKICAgICAgICAgICAgICAgICAgICAgIDEsIGkubGVuZ3RoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJleGNsdWRlIiwgaVswXSk7CkBAIC0xOTUsNyArMjA5LDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFBhdHRlcm5zZXQoKSB7Ci0gICAgICAgIFBhdHRlcm5TZXQgcCA9IG5ldyBQYXR0ZXJuU2V0KCk7CiAgICAgICAgIHAuc2V0SW5jbHVkZXMoIioqLyouamF2YSIpOwogCiAgICAgICAgIFBhdHRlcm5TZXQgbmVzdGVkID0gbmV3IFBhdHRlcm5TZXQoKTsKQEAgLTIxMiwyMyArMjI1LDE1IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGluZ09mSW5jbHVkZXNGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSB0ZXN0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFudC0iLCAiLnBhdHRlcm4iKTsKLSAgICAgICAgdGVzdEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIE91dHB1dFN0cmVhbSBvID0gbnVsbDsKLSAgICAgICAgV3JpdGVyIHcgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlc3RGaWxlKTsKLSAgICAgICAgICAgIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG8sICJVVEYtMTZMRSIpOworICAgICAgICBGaWxlIHRlc3RGaWxlID0gdGVzdEZvbGRlci5uZXdGaWxlKCJhbnQucGF0dGVybiIpOworICAgICAgICBDaGFyc2V0IGNzID0gU3RhbmRhcmRDaGFyc2V0cy5VVEZfMTZMRTsKKyAgICAgICAgdHJ5IChXcml0ZXIgdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGVzdEZpbGUpLCBjcykpIHsKICAgICAgICAgICAgIHcud3JpdGUoIlx1MDBlNFxuIik7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uodyk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2Uobyk7CiAgICAgICAgIH0KLSAgICAgICAgUGF0dGVyblNldCBwID0gbmV3IFBhdHRlcm5TZXQoKTsKICAgICAgICAgUGF0dGVyblNldC5QYXR0ZXJuRmlsZU5hbWVFbnRyeSBuZSA9Ci0gICAgICAgICAgICAoUGF0dGVyblNldC5QYXR0ZXJuRmlsZU5hbWVFbnRyeSkgcC5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKKyAgICAgICAgICAgICAgICAoUGF0dGVyblNldC5QYXR0ZXJuRmlsZU5hbWVFbnRyeSkgcC5jcmVhdGVJbmNsdWRlc0ZpbGUoKTsKICAgICAgICAgbmUuc2V0TmFtZSh0ZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgIG5lLnNldEVuY29kaW5nKCJVVEYtMTZMRSIpOwotICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgU3RyaW5nW10geyAiXHUwMGU0IiB9LCBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KSk7CisgICAgICAgIG5lLnNldEVuY29kaW5nKGNzLm5hbWUoKSk7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBTdHJpbmdbXSB7Ilx1MDBlNCJ9LCBwLmdldEluY2x1ZGVQYXR0ZXJucyhwcm9qZWN0KSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Blcm1pc3Npb25zVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Blcm1pc3Npb25zVGVzdC5qYXZhCmluZGV4IDA5MTI1ODguLmJiYzdmMWYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9QZXJtaXNzaW9uc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUGVybWlzc2lvbnNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxNiArMTksMjMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5FeGl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzUHJvcGVydHk7CiAKIC8qKgogICogSlVuaXQgNCB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBlcm1pc3Npb25zLgogICovCiBwdWJsaWMgY2xhc3MgUGVybWlzc2lvbnNUZXN0IHsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIFBlcm1pc3Npb25zIHBlcm1zOwogCiAgICAgQEJlZm9yZQpAQCAtNjcsOTAgKzc0LDYyIEBACiAgICAgICAgIHBlcm0uc2V0TmFtZSgib3MuKiIpOwogICAgICAgICBwZXJtLnNldENsYXNzKCJqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uIik7CiAgICAgICAgIHBlcm1zLmFkZENvbmZpZ3VyZWRSZXZva2UocGVybSk7CisKKyAgICAgICAgLy8gQWxsb3cgbG9hZGluZyBIYW1jcmVzdCBNYXRjaGVyIGNsYXNzZXMgb24gZGVtYW5kCisgICAgICAgIHBlcm0gPSBuZXcgUGVybWlzc2lvbnMuUGVybWlzc2lvbigpOworICAgICAgICBwZXJtLnNldEFjdGlvbnMoInJlYWQiKTsKKyAgICAgICAgcGVybS5zZXROYW1lKCI8PEFMTCBGSUxFUz4+Iik7CisgICAgICAgIHBlcm0uc2V0Q2xhc3MoImphdmEuaW8uRmlsZVBlcm1pc3Npb24iKTsKKyAgICAgICAgcGVybXMuYWRkQ29uZmlndXJlZEdyYW50KHBlcm0pOworCisgICAgICAgIHBlcm1zLnNldFNlY3VyaXR5TWFuYWdlcigpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBwZXJtcy5yZXN0b3JlU2VjdXJpdHlNYW5hZ2VyKCk7CiAgICAgfQogCiAgICAgLyoqIFRlc3RzIGEgcGVybWlzc2lvbiB0aGF0IGlzIGdyYW50ZWQgcGVyIGRlZmF1bHQuICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEdyYW50ZWQoKSB7Ci0gICAgICAgIHBlcm1zLnNldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICB9CisgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKICAgICB9CiAKICAgICAvKiogVGVzdHMgYSBwZXJtaXNzaW9uIHRoYXQgaGFzIGJlZW4gZ3JhbnRlZCBsYXRlciB2aWEgd2lsZGNhcmQuICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R3JhbnRlZCgpIHsKLSAgICAgICAgcGVybXMuc2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInVzZXIubmFtZSIsIHMpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICB9CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgidXNlci5uYW1lIiwgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLm5hbWUiKSk7CiAgICAgfQogCiAgICAgLyoqIFRlc3RzIGEgcGVybWlzc2lvbiB0aGF0IGhhcyBiZWVuIGdyYW50ZWQgYW5kIHJldm9rZWQgbGF0ZXIuICovCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHcmFudGVkQW5kUmV2b2tlZCgpIHsKLSAgICAgICAgcGVybXMuc2V0U2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInVzZXIuaG9tZSIsIHMpOwotICAgICAgICAgICAgZmFpbCgiQ291bGQgcGVyZm9ybSBhbiBhY3Rpb24gdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGZvcmJpZGRlbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gV2FzIGV4cGVjdGVkLCB0ZXN0IHBhc3NlcwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICB9CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgidXNlci5ob21lIiwgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSk7CiAgICAgfQogCiAgICAgLyoqIFRlc3RzIGEgcGVybWlzc2lvbiB0aGF0IGlzIGdyYW50ZWQgYXMgcGVyIGRlZmF1bHQgYnV0IHJldm9rZWQgbGF0ZXIgdmlhIHdpbGRjYXJkLiAqLwotICAgIEBUZXN0CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBTZWN1cml0eUV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJldm9rZWQoKSB7Ci0gICAgICAgIHBlcm1zLnNldFNlY3VyaXR5TWFuYWdlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7Ci0gICAgICAgICAgICBmYWlsKCJDb3VsZCBwZXJmb3JtIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBoYXZlIGJlZW4gZm9yYmlkZGVuLiIpOwotICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBXYXMgZXhwZWN0ZWQsIHRlc3QgcGFzc2VzCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBwZXJtcy5yZXN0b3JlU2VjdXJpdHlNYW5hZ2VyKCk7Ci0gICAgICAgIH0KKyAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7CiAgICAgfQorCiAgICAgLyoqIFRlc3RzIGEgcGVybWlzc2lvbiB0aGF0IGhhcyBub3QgYmVlbiBncmFudGVkIG9yIHJldm9rZWQuICovCi0gICAgQFRlc3QKKyAgICBAVGVzdChleHBlY3RlZCA9IFNlY3VyaXR5RXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RPdGhlcigpIHsKLSAgICAgICAgU3RyaW5nIGxzID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotICAgICAgICBwZXJtcy5zZXRTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLGxzKTsKLSAgICAgICAgICAgIGZhaWwoIkNvdWxkIHBlcmZvcm0gYW4gYWN0aW9uIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBmb3JiaWRkZW4uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIFdhcyBleHBlY3RlZCwgdGVzdCBwYXNzZXMKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIHBlcm1zLnJlc3RvcmVTZWN1cml0eU1hbmFnZXIoKTsKLSAgICAgICAgfQorICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgfQogCiAgICAgLyoqIFRlc3RzIGFuIGV4aXQgY29uZGl0aW9uLiAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEV4aXQoKSB7Ci0gICAgICAgIHBlcm1zLnNldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICB0aHJvd24uZXhwZWN0KEV4aXRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0KGhhc1Byb3BlcnR5KCJzdGF0dXMiLCBlcXVhbFRvKDMpKSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIklmIHRoaXMgaXMgdGhlIGxhc3QgbGluZSBvbiBzdGFuZGFyZCBvdXQgdGhlIHRlc3RFeGl0IGYuYS5pLmwuZS5kIik7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgzKTsKLSAgICAgICAgICAgIGZhaWwoIlRvdGFsbHkgaW1wb3NzaWJsZSB0aGF0IHRoaXMgZmFpbCBpcyBldmVyIGV4ZWN1dGVkLiBQbGVhc2UgbGV0IG1lIGtub3cgaWYgaXQgaXMhIik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4aXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgaWYgKGUuZ2V0U3RhdHVzKCkgIT0gMykgewotICAgICAgICAgICAgICAgIGZhaWwoIlJlY2VpdmVkIHdyb25nIGV4aXQgc3RhdHVzIGluIEV4aXQgRXhjZXB0aW9uLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0RXhpdCBzdWNjZXNzZnVsLiIpOwogICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcGVybXMucmVzdG9yZVNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZXN0RXhpdCBzdWNjZXNzZnVsLiIpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUG9seVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Qb2x5VGVzdC5qYXZhCmluZGV4IDczZmZmZjQuLjQ0YWUwZDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Qb2x5VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9Qb2x5VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTUgKzE4LDM4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5BbnRBc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUG9seVRlc3QgeworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gdGFyZ2V0cygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgeyJmaWxlc2V0IiwgInR5cGVzLkZpbGVTZXQifSwKKyAgICAgICAgICAgICAgICB7ImZpbGVzZXQtYW50LXR5cGUiLCAidHlwZXMuUG9seVRlc3QkTXlGaWxlU2V0In0sCisgICAgICAgICAgICAgICAgeyJwYXRoIiwgInR5cGVzLlBhdGgifSwKKyAgICAgICAgICAgICAgICB7InBhdGgtYW50LXR5cGUiLCAidHlwZXMuUG9seVRlc3QkTXlQYXRoIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgcHVibGljIFN0cmluZyBvdXRjb21lOwogCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwpAQCAtMzcsMjcgKzYwLDkgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2V0KCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsZXNldCIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoInR5cGVzLkZpbGVTZXQiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXRBbnRUeXBlKCkgewotICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgiZmlsZXNldC1hbnQtdHlwZSIpOwotICAgICAgICBBbnRBc3NlcnQuYXNzZXJ0Q29udGFpbnMoInR5cGVzLlBvbHlUZXN0JE15RmlsZVNldCIsIGJ1aWxkUnVsZS5nZXRMb2coKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aCgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInBhdGgiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJ0eXBlcy5QYXRoIiwgYnVpbGRSdWxlLmdldExvZygpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoQW50VHlwZSgpIHsKLSAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInBhdGgtYW50LXR5cGUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJ0eXBlcy5Qb2x5VGVzdCRNeVBhdGgiLCBidWlsZFJ1bGUuZ2V0TG9nKCkpOworICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KHRhcmdldE5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KGJ1aWxkUnVsZS5nZXRMb2coKSwgY29udGFpbnNTdHJpbmcob3V0Y29tZSkpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaWxlU2V0IGV4dGVuZHMgRmlsZVNldCB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVkaXJlY3RvckVsZW1lbnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVkaXJlY3RvckVsZW1lbnRUZXN0LmphdmEKaW5kZXggOWVkNmVmNi4uYzlhY2I0OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1JlZGlyZWN0b3JFbGVtZW50VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZWRpcmVjdG9yRWxlbWVudFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlczsKIAotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CkBAIC0yNSw4ICsyNCw5IEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgUmVkaXJlY3RvckVsZW1lbnRUZXN0IHsKIApAQCAtNDEsMjggKzQxLDI0IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QxIik7Ci0gICAgICAgIGFzc2VydFRydWUoKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuPE9iamVjdD4gZ2V0UmVmZXJlbmNlKCJ0ZXN0MSIpCisgICAgICAgIGFzc2VydFRydWUoKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKCJ0ZXN0MSIpCiAgICAgICAgICAgICBpbnN0YW5jZW9mIFJlZGlyZWN0b3JFbGVtZW50KSk7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBtdWx0aXBsZSBhdHRyaWJ1dGVzIHdoZW4gdXNpbmcgcmVmaWQKKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3QyKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7Ci0gICAgICAgICAgICBmYWlsKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QyIik7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlIGR1ZSB0byBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZAorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gQnVpbGRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdDMiKTsKLSAgICAgICAgICAgIGZhaWwoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3QzIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTc0LDcgKzcwLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nSW5wdXRTdHJpbmcoKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0TG9nSW5wdXRTdHJpbmciKTsKICAgICAgICAgaWYgKGJ1aWxkUnVsZS5nZXRMb2coKS5jb250YWlucygidGVzdExvZ0lucHV0U3RyaW5nIGNhbi1jYXQiKSkgewotICAgICAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJVc2luZyBpbnB1dCBzdHJpbmciLCBidWlsZFJ1bGUuZ2V0RnVsbExvZygpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldEZ1bGxMb2coKSwgY29udGFpbnNTdHJpbmcoIlVzaW5nIGlucHV0IHN0cmluZyIpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlT3V0cHV0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1Jlc291cmNlT3V0cHV0VGVzdC5qYXZhCmluZGV4IDI1YTY1M2QuLmZiZWY5MDcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9SZXNvdXJjZU91dHB1dFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvUmVzb3VyY2VPdXRwdXRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS5uZXQuVW5rbm93blNlcnZpY2VFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuWmlwOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5JbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbjsKQEAgLTMzLDM0ICszNCwzNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUmVzb3VyY2VVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgUmVzb3VyY2VPdXRwdXRUZXN0IHsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGVVdGlscyBGSUxFX1VUSUxTID0gRmlsZVV0aWxzLmdldEZpbGVVdGlscygpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgYmFzZWRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLAotICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdHlwZXMvcmVzb3VyY2VzIik7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCiAgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0gICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LmluaXQoKTsKLSAgICAgICAgcHJvamVjdC5zZXRVc2VyUHJvcGVydHkoImJhc2VkaXIiLCBiYXNlZGlyLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy9yZXNvdXJjZWxpc3QueG1sIik7CisgICAgICAgIHByb2plY3QgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZQorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdHJlc291cmNlb3V0cHV0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdG91dHB1dGJlKG5ldyBSZXNvdXJjZSgiZm9vIikpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKLSAgICAgICAgfQorICAgICAgICB0ZXN0b3V0cHV0YmUobmV3IFJlc291cmNlKCJmb28iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTcwLDE1ICs3MSwyMCBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHIuZ2V0VmFsdWUoKSk7CiAgICAgfQogCi0gICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmYWlsdXJlCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0c3RyaW5nb3V0cHV0MigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZ1Jlc291cmNlIHIgPSBuZXcgU3RyaW5nUmVzb3VyY2UoImJhciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdG91dHB1dChyKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdWdodCBJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgdGVzdG91dHB1dChyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RzdHJpbmdvdXRwdXQzKCkgeworICAgICAgICBTdHJpbmdSZXNvdXJjZSByID0gbmV3IFN0cmluZ1Jlc291cmNlKCJiYXIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCByLmdldFZhbHVlKCkpOwogICAgIH0KIApAQCAtODksMjggKzk1LDMyIEBACiAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcHJvamVjdC5nZXRQcm9wZXJ0eSgiYmFyIikpOwogICAgIH0KIAotICAgIEBUZXN0CisgICAgLyoqCisgICAgICogRXhwZWN0ZWQgZmFpbHVyZQorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gSW1tdXRhYmxlUmVzb3VyY2VFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdHByb3BlcnR5b3V0cHV0MigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImJhciIsICJiYXIiKTsKICAgICAgICAgUHJvcGVydHlSZXNvdXJjZSByID0gbmV3IFByb3BlcnR5UmVzb3VyY2UocHJvamVjdCwgImJhciIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGVzdG91dHB1dChyKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCBoYXZlIGNhdWdodCBJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJbW11dGFibGVSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgICAgIH0KKyAgICAgICAgdGVzdG91dHB1dChyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3Rwcm9wZXJ0eW91dHB1dDMoKSB7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoImJhciIsICJiYXIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9qZWN0LmdldFByb3BlcnR5KCJiYXIiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0dXJsb3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChVbmtub3duU2VydmljZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0IGV4Y2VwdGlvbiBtZXNzYWdlCiAgICAgICAgIEZpbGUgZiA9IHByb2plY3QucmVzb2x2ZUZpbGUoInRlc3R1cmxvdXRwdXQiKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIEZJTEVfVVRJTFMuY3JlYXRlTmV3RmlsZShmKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5nZXRGaWxlVXRpbHMoKS5jcmVhdGVOZXdGaWxlKGYpOwogICAgICAgICAgICAgdGVzdG91dHB1dChuZXcgVVJMUmVzb3VyY2UoZikpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFVua25vd25TZXJ2aWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgewogICAgICAgICAgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CkBAIC0xMjAsMTIgKzEzMCwxNCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0emlwZW50cnlvdXRwdXQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uY2xhc3MpOworICAgICAgICAvLyBUT0RPIGFzc2VydCBleGNlcHRpb24gbWVzc2FnZQogICAgICAgICBaaXAgeiA9IG5ldyBaaXAoKTsKICAgICAgICAgei5zZXRQcm9qZWN0KHByb2plY3QpOwogICAgICAgICBaaXAuV2hlbkVtcHR5IGNyZWF0ZSA9IG5ldyBaaXAuV2hlbkVtcHR5KCk7CiAgICAgICAgIGNyZWF0ZS5zZXRWYWx1ZSgiY3JlYXRlIik7CiAgICAgICAgIHouc2V0V2hlbmVtcHR5KGNyZWF0ZSk7Ci0gICAgICAgIHouc2V0QmFzZWRpcihiYXNlZGlyKTsKKyAgICAgICAgei5zZXRCYXNlZGlyKHByb2plY3QuZ2V0QmFzZURpcigpKTsKICAgICAgICAgei5zZXRFeGNsdWRlcygiKiovKiIpOwogICAgICAgICBGaWxlIGYgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJmb28iKTsKICAgICAgICAgei5zZXREZXN0RmlsZShmKTsKQEAgLTEzNSw5ICsxNDcsNiBAQAogICAgICAgICByLnNldE5hbWUoImZvbyIpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgdGVzdG91dHB1dGJlKHIpOwotICAgICAgICAgICAgZmFpbCgic2hvdWxkIGhhdmUgY2F1Z2h0IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vVE9ETyBhc3NlcnQgZXhjZXB0aW9uIG1lc3NhZ2UKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGlmICghZi5kZWxldGUoKSkgewogICAgICAgICAgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvVGFyRmlsZVNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0VGVzdC5qYXZhCmluZGV4IDM5MWUyNDguLmY4NDgzOWYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9UYXJGaWxlU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQsNiArMTQsNyBAQAogICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCisgKiA8cD5UaGlzIGRvZXNuJ3QgYWN0dWFsbHkgdGVzdCBtdWNoLCBtYWlubHkgcmVmZXJlbmNlIGhhbmRsaW5nLjwvcD4KICAqLwogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzOwpAQCAtMjEsMTEgKzIyLDEwIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogSlVuaXQgNCB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlRhckZpbGVTZXQuCkBAIC0zNCw4NyArMzQsOTIgQEAKICAqLwogcHVibGljIGNsYXNzIFRhckZpbGVTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RGaWxlU2V0VGVzdCB7CiAKKyAgICBwcml2YXRlIFRhckZpbGVTZXQgdGZzOwogCiAgICAgcHJvdGVjdGVkIEFic3RyYWN0RmlsZVNldCBnZXRJbnN0YW5jZSgpIHsKICAgICAgICAgcmV0dXJuIG5ldyBUYXJGaWxlU2V0KCk7CiAgICAgfQogCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICB0ZnMgPSAoVGFyRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aGF0IGRpciBhbmQgc3JjIGFyZSBpbmNvbXBhdGlibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RTcmNEaXJBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCBzZXQgYm90aCBkaXIgYW5kIHNyYyBhdHRyaWJ1dGVzIik7CisgICAgICAgIHRmcy5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOworICAgICAgICB0ZnMuc2V0RGlyKG5ldyBGaWxlKCJleGFtcGxlcyIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aGF0IGRpciBhbmQgc3JjIGFyZSBpbmNvbXBhdGlibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3REaXJTcmNBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCBzZXQgYm90aCBkaXIgYW5kIHNyYyBhdHRyaWJ1dGVzIik7CisgICAgICAgIHRmcy5zZXREaXIobmV3IEZpbGUoImV4YW1wbGVzIikpOworICAgICAgICB0ZnMuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnRhciIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aGF0IGZ1bGxwYXRoIGFuZCBwcmVmaXggYXJlIGluY29tcGF0aWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFByZWZpeEZ1bGxwYXRoQXR0cmlidXRlcygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3Qgc2V0IGJvdGggZnVsbHBhdGggYW5kIHByZWZpeCBhdHRyaWJ1dGVzIik7CisgICAgICAgIHRmcy5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOworICAgICAgICB0ZnMuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICAgICAgdGZzLnNldEZ1bGxwYXRoKCIvZG9jL21hbnVhbC9pbmRleC5odG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0RnVsbHBhdGhQcmVmaXhBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgdGZzLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7CisgICAgICAgIHRmcy5zZXRGdWxscGF0aCgiL2RvYy9tYW51YWwvaW5kZXguaHRtbCIpOworICAgICAgICB0ZnMuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aGF0IHJlZmVyZW5jZSB0YXJmaWxlc2V0cyBjYW5ub3QgaGF2ZSBzcGVjaWZpYyBhdHRyaWJ1dGVzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UmVmaWRTcmNBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgdGZzLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAidGVzdCIpKTsKKyAgICAgICAgdGZzLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgdGhhdCBhIHJlZmVyZW5jZSB0YXJmaWxlc2V0IGdldHMgdGhlIHNhbWUgYXR0cmlidXRlcyBhcyB0aGUgb3JpZ2luYWwKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyBmaW5hbCB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgewotICAgICAgICBUYXJGaWxlU2V0IGYgPSAoVGFyRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgLy9jaGVjayB0aGF0IGRpciBhbmQgc3JjIGFyZSBpbmNvbXBhdGlibGUKLSAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXREaXIobmV3IEZpbGUoImV4YW1wbGVzIikpOwotICAgICAgICAgICAgZmFpbCgiY2FuIGFkZCBkaXIgdG8gIgotICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBzcmMgaXMgYWxyZWFkeSBwcmVzZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBkaXIgYW5kIHNyYyBhdHRyaWJ1dGVzIixiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGYgPSAoVGFyRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgLy9jaGVjayB0aGF0IGRpciBhbmQgc3JjIGFyZSBpbmNvbXBhdGlibGUKLSAgICAgICAgZi5zZXREaXIobmV3IEZpbGUoImV4YW1wbGVzIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOwotICAgICAgICAgICAgZmFpbCgiY2FuIGFkZCBzcmMgdG8gIgotICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBkaXIgaXMgYWxyZWFkeSBwcmVzZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBkaXIgYW5kIHNyYyBhdHRyaWJ1dGVzIixiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vY2hlY2sgdGhhdCBmdWxscGF0aCBhbmQgcHJlZml4IGFyZSBpbmNvbXBhdGlibGUKLSAgICAgICAgZiA9IChUYXJGaWxlU2V0KSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7Ci0gICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgZnVsbHBhdGggdG8gIgotICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBwcmVmaXggaXMgYWxyZWFkeSBwcmVzZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGYgPSAoVGFyRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUudGFyIikpOwotICAgICAgICBmLnNldEZ1bGxwYXRoKCIvZG9jL21hbnVhbC9pbmRleC5odG1sIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFByZWZpeCgiL2V4YW1wbGVzIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHByZWZpeCB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIGZ1bGxwYXRoIGlzIGFscmVhZHkgcHJlc2VudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3Qgc2V0IGJvdGggZnVsbHBhdGggYW5kIHByZWZpeCBhdHRyaWJ1dGVzIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayB0aGF0IHJlZmVyZW5jZSB0YXJmaWxlc2V0cyBjYW5ub3QgaGF2ZSBzcGVjaWZpYyBhdHRyaWJ1dGVzCi0gICAgICAgIGYgPSAoVGFyRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS50YXIiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHNyYyB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIHJlZmlkIGlzIGFscmVhZHkgcHJlc2VudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lICIKLSAgICAgICAgICAgICsgImF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayB0aGF0IGEgcmVmZXJlbmNlIHRhcmZpbGVzZXQgZ2V0cyB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBvcmlnaW5hbAotICAgICAgICBmID0gKFRhckZpbGVTZXQpIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnRhciIpKTsKLSAgICAgICAgZi5zZXRQcmVmaXgoIi9leGFtcGxlcyIpOwotICAgICAgICBmLnNldEZpbGVNb2RlKCI2MDAiKTsKLSAgICAgICAgZi5zZXREaXJNb2RlKCI1MzAiKTsKLSAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsIGYpOworICAgICAgICB0ZnMuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnRhciIpKTsKKyAgICAgICAgdGZzLnNldFByZWZpeCgiL2V4YW1wbGVzIik7CisgICAgICAgIHRmcy5zZXRGaWxlTW9kZSgiNjAwIik7CisgICAgICAgIHRmcy5zZXREaXJNb2RlKCI1MzAiKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsIHRmcyk7CiAgICAgICAgIFRhckZpbGVTZXQgemlkID0gKFRhckZpbGVTZXQpIGdldEluc3RhbmNlKCk7CiAgICAgICAgIHppZC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNyYyBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKS5lcXVhbHMoZi5nZXRTcmMoZ2V0UHJvamVjdCgpKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJwcmVmaXggYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICBmLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLmVxdWFscyh6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsZSBtb2RlIGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsCi0gICAgICAgICAgICAgICAgZi5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpID09IHppZC5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlyIG1vZGUgYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICBmLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSA9PSB6aWQuZ2V0RGlyTW9kZShnZXRQcm9qZWN0KCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcmMgYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICB0ZnMuZ2V0U3JjKGdldFByb2plY3QoKSksIHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJlZml4IGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgdGZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLCB6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGUgbW9kZSBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLAorICAgICAgICAgICAgICAgIHRmcy5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpLCB6aWQuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGlyIG1vZGUgYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICB0ZnMuZ2V0RGlyTW9kZShnZXRQcm9qZWN0KCkpLCB6aWQuZ2V0RGlyTW9kZShnZXRQcm9qZWN0KCkpKTsKICAgICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1hNTENhdGFsb2dCdWlsZEZpbGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QuamF2YQppbmRleCA5NmMwYzVkLi4zNjk4Y2E5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ0J1aWxkRmlsZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDYgKzE5LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTM1LDcgKzM2LDEwIEBACiAgICAgIEBSdWxlCiAgICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKLQorICAgICBAQmVmb3JlCisgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CisgICAgIH0KIAogICAgIC8vCiAgICAgLy8gRW5zdXJlIHRoYXQgYW4gZXh0ZXJuYWwgZW50aXR5IHJlc29sdmVzIGFzIGV4cGVjdGVkIHdpdGggTk8KQEAgLTQ2LDcgKzUwLDYgQEAKICAgICAvLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eU5vQ2F0YWxvZygpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0ZW50aXR5bm9jYXRhbG9nIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiQSBzdGl0Y2ggaW4gdGltZSBzYXZlcyBuaW5lIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidmFsMSIpKTsKICAgICB9CkBAIC02MSw3ICs2NCw2IEBACiAgICAgLy8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlXaXRoQ2F0YWxvZygpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0ZW50aXR5d2l0aGNhdGFsb2ciKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJObyBuZXdzIGlzIGdvb2QgbmV3cyIsIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoInZhbDIiKSk7CiAgICAgfQpAQCAtNzYsNyArNzgsNiBAQAogICAgIC8vCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jdW1lbnROb0NhdGFsb2coKSB7Ci0gICAgICAgIGJ1aWxkUnVsZS5jb25maWd1cmVQcm9qZWN0KCJzcmMvZXRjL3Rlc3RjYXNlcy90eXBlcy94bWxjYXRhbG9nLnhtbCIpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdGRvY3VtZW50bm9jYXRhbG9nIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiQSBzdGl0Y2ggaW4gdGltZSBzYXZlcyBuaW5lIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidmFsMyIpKTsKICAgICB9CkBAIC05MSw3ICs5Miw2IEBACiAgICAgLy8gU3R1ZmYgcmVzdWx0IGludG8gdGhlIHByb3BlcnR5OiB2YWw0CiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jdW1lbnRXaXRoQ2F0YWxvZygpIHsKLSAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3htbGNhdGFsb2cueG1sIik7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0ZG9jdW1lbnR3aXRoY2F0YWxvZyIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIk5vIG5ld3MgaXMgZ29vZCBuZXdzIiwgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgidmFsNCIpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvWE1MQ2F0YWxvZ1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nVGVzdC5qYXZhCmluZGV4IDk2MWU1NWQuLjgyNjE3MjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9YTUxDYXRhbG9nVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjgsMTggKzI4LDIxIEBACiBpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNUZXN0TmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkpBWFBVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVuZHNXaXRoOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBKVW5pdCB0ZXN0Y2FzZXMgZm9yIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlhNTENhdGFsb2cKQEAgLTU2LDE1ICs1OSwxOSBAQAogICAgICAgICByZXR1cm4gY2F0OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1VSTFN0cmluZyhGaWxlIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1VSTFN0cmluZyhGaWxlIGZpbGUpIHsKICAgICAgICAgcmV0dXJuIEpBWFBVdGlscy5nZXRTeXN0ZW1JZChmaWxlKTsKICAgICB9CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIHByb2plY3QgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBwcm9qZWN0LnNldEJhc2VkaXIoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IikpOwotCisgICAgICAgIGlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNUZXN0TmFtZXMuVEVTVF9ST09UX0RJUkVDVE9SWSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvamVjdC5zZXRCYXNlZGlyKFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY1Rlc3ROYW1lcy5URVNUX1JPT1RfRElSRUNUT1JZKSk7CisgICAgICAgIH0KICAgICAgICAgLy8gVGhpcyBjYXVzZXMgWE1MQ2F0YWxvZyB0byBwcmludCBvdXQgZGV0YWlsZWQgbG9nZ2luZwogICAgICAgICAvLyBtZXNzYWdlcyBmb3IgZGVidWdnaW5nCiAgICAgICAgIC8vCkBAIC03OCwyNiArODUsMTkgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUNhdGFsb2coKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVFbnRpdHkoIlBVQkxJQyBJRCBPTkUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpL2RvbnQvZXhpc3QuZHRkIik7Ci0gICAgICAgICAgICBhc3NlcnROdWxsKCJFbXB0eSBjYXRhbG9nIHNob3VsZCByZXR1cm4gbnVsbCIsIHJlc3VsdCk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBmYWlsKCJyZXNvbHZlRW50aXR5KCkgZmFpbGVkISIgKyBlLnRvU3RyaW5nKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Q2F0YWxvZ1Jlc29sdmVFbnRpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZUVudGl0eSgiUFVCTElDIElEIE9ORSIsICJpL2RvbnQvZXhpc3QuZHRkIik7CisgICAgICAgIGFzc2VydE51bGwoIkVtcHR5IGNhdGFsb2cgc2hvdWxkIHJldHVybiBudWxsIiwgcmVzdWx0KTsKKyAgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlKCJpL2RvbnQvZXhpc3QuZHRkIiwgbnVsbCk7Ci0gICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSB0b1VSTFN0cmluZyhuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VEaXIoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2kvZG9udC9leGlzdC5kdGQiKSk7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gZmlsZVVSTFBhcnRXaXRob3V0TGVhZGluZ1NsYXNoZXMoKFNBWFNvdXJjZSkgcmVzdWx0KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkVtcHR5IGNhdGFsb2cgc2hvdWxkIHJldHVybiBpbnB1dCB3aXRoIGEgc3lzdGVtIElEIGxpa2UgIgotICAgICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkICsgIiBidXQgd2FzICIgKyByZXN1bHRTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLmVuZHNXaXRoKHJlc3VsdFN0cikpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgicmVzb2x2ZSgpIGZhaWxlZCEiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Q2F0YWxvZ1Jlc29sdmUoKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZCA9IHRvVVJMU3RyaW5nKG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZURpcigpICsKKyAgICAgICAgICAgICAgICAiL2kvZG9udC9leGlzdC5kdGQiKSk7CisgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUoImkvZG9udC9leGlzdC5kdGQiLCBudWxsKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdFN0ciA9IGZpbGVVUkxQYXJ0V2l0aG91dExlYWRpbmdTbGFzaGVzKChTQVhTb3VyY2UpIHJlc3VsdCk7CisgICAgICAgIGFzc2VydFRoYXQoIkVtcHR5IGNhdGFsb2cgc2hvdWxkIHJldHVybiBpbnB1dCB3aXRoIGEgc3lzdGVtIElEIGxpa2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBleHBlY3RlZCArICIgYnV0IHdhcyAiICsgcmVzdWx0U3RyLCBleHBlY3RlZCwgZW5kc1dpdGgocmVzdWx0U3RyKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbGVVUkxQYXJ0V2l0aG91dExlYWRpbmdTbGFzaGVzKFNBWFNvdXJjZSByZXN1bHQpCkBAIC0xMDcsOCArMTA3LDcgQEAKICAgICAgICAgLy8gaGFzIGEgZGlmZmVyZW50IGlkZWEgb2YgaG93IGZpbGUgVVJMcyBhcmUgY3JlYXRlZCBvbiB3aW5kb3plCiAgICAgICAgIC8vIGllIGZpbGU6Ly9jOi9mb28gaW5zdGVhZCBvZiBmaWxlOi8vL2M6L2ZvbwogICAgICAgICAvLwotICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0KLSAgICAgICAgICAgIG5ldyBVUkwocmVzdWx0LmdldElucHV0U291cmNlKCkuZ2V0U3lzdGVtSWQoKSkuZ2V0RmlsZSgpOworICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gbmV3IFVSTChyZXN1bHQuZ2V0SW5wdXRTb3VyY2UoKS5nZXRTeXN0ZW1JZCgpKS5nZXRGaWxlKCk7CiAgICAgICAgIC8vIG9uIFN1bidzIEphdmE2IHRoaXMgcmV0dXJucyBhbiB1bmV4cGVjdGVkIG51bWJlciBvZiBmb3VyCiAgICAgICAgIC8vIGxlYWRpbmcgc2xhc2hlcywgYXQgbGVhc3Qgb24gTGludXggLSBzdHJpcCBhbGwgb2YgdGhlbQogICAgICAgICB3aGlsZSAocmVzdWx0U3RyLnN0YXJ0c1dpdGgoIi8iKSkgewpAQCAtMTIzLDg0ICsxMjIsNjUgQEAKICAgICAgICAgZHRkLnNldFB1YmxpY0lkKCJQVUJMSUMgSUQgT05FIik7CiAgICAgICAgIGR0ZC5zZXRMb2NhdGlvbigiaS9kb250L2V4aXN0LmR0ZCIpOwogCi0gICAgICAgIElucHV0U291cmNlIGlzUmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpL2RvbnQvZXhpc3QuZHRkIik7CisgICAgICAgIElucHV0U291cmNlIGlzUmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwgImkvZG9udC9leGlzdC5kdGQiKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiTm9uZXhpc3RlbnQgQ2F0YWxvZyBlbnRyeSBzaG91bGQgbm90IGJlIHJldHVybmVkIiwgaXNSZXN1bHQpOwogCiAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUoImkvZG9udC9leGlzdC5kdGQiLCBudWxsKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gdG9VUkxTdHJpbmcobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCkudG9VUkwoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvaS9kb250L2V4aXN0LmR0ZCIpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gdG9VUkxTdHJpbmcobmV3IEZpbGUocHJvamVjdC5nZXRCYXNlRGlyKCkudG9VUkwoKQorICAgICAgICAgICAgICAgICsgIi9pL2RvbnQvZXhpc3QuZHRkIikpOwogICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gZmlsZVVSTFBhcnRXaXRob3V0TGVhZGluZ1NsYXNoZXMoKFNBWFNvdXJjZSkgcmVzdWx0KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiTm9uZXhpc3RlbnQgQ2F0YWxvZyBlbnRyeSByZXR1cm4gaW5wdXQgd2l0aCBhIHN5c3RlbSBJRCBsaWtlICIKKyAgICAgICAgYXNzZXJ0VGhhdCgiTm9uZXhpc3RlbnQgQ2F0YWxvZyBlbnRyeSByZXR1cm4gaW5wdXQgd2l0aCBhIHN5c3RlbSBJRCBsaWtlICIKICAgICAgICAgICAgICAgICAgICArIGV4cGVjdGVkICsgIiBidXQgd2FzICIgKyByZXN1bHRTdHIsCi0gICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQuZW5kc1dpdGgocmVzdWx0U3RyKSk7CisgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIGVuZHNXaXRoKHJlc3VsdFN0cikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2UoKSB7CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudElmSXNSZWZlcmVuY2VBdHRyKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBkdGQgPSBuZXcgUmVzb3VyY2VMb2NhdGlvbigpOwogICAgICAgICBkdGQuc2V0UHVibGljSWQoIlBVQkxJQyBJRCBPTkUiKTsKICAgICAgICAgZHRkLnNldExvY2F0aW9uKCJpL2RvbnQvZXhpc3QuZHRkIik7CiAgICAgICAgIGNhdGFsb2cuYWRkRFREKGR0ZCk7CiAgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nIiwgY2F0YWxvZyk7CisgICAgICAgIGNhdGFsb2cuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiZHVtbXlyZWYiKSk7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYXRhbG9nLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gbm9uZXhpc3RlbnQgWE1MQ2F0YWxvZyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBYTUxDYXRhbG9nIGNhdGFsb2cyID0gbmV3Q2F0YWxvZygpOwotICAgICAgICBjYXRhbG9nMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJjYXRhbG9nIikpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjYXRhbG9nMi5hZGRDb25maWd1cmVkWE1MQ2F0YWxvZyhjYXRhbG9nKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgbmVzdGVkIFhNTENhdGFsb2cgdG8gWE1MQ2F0YWxvZyB0aGF0IGlzIGEgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZUVsZW0oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nQSA9IG5ld0NhdGFsb2coKTsKKyAgICAgICAgY2F0YWxvZ0Euc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiY2F0YWxvZyIpKTsKKyAgICAgICAgY2F0YWxvZ0EuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2lyY3VsYXJSZWZlcmVuY2VDaGVjaygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKLQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOwogICAgICAgICAvLyBjYXRhbG9nIDwtLT4gY2F0YWxvZwogICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZyIsIGNhdGFsb2cpOwogICAgICAgICBjYXRhbG9nLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2ciKSk7CisgICAgICAgIGNhdGFsb2cucmVzb2x2ZUVudGl0eSgiUFVCTElDIElEIE9ORSIsICJpL2RvbnQvZXhpc3QuZHRkIik7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgICAgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZUVudGl0eSgiUFVCTElDIElEIE9ORSIsICJpL2RvbnQvZXhpc3QuZHRkIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gbWFrZSBYTUxDYXRhbG9nIGEgUmVmZXJlbmNlIHRvIGl0c2VsZi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhpcyBkYXRhIHR5cGUgY29udGFpbnMgYSBjaXJjdWxhciByZWZlcmVuY2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZmFpbCgicmVzb2x2ZUVudGl0eSgpIGZhaWxlZCEiICsgZS50b1N0cmluZygpKTsKLSAgICAgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb3BSZWZlcmVuY2VDaGVjaygpIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGlzIGRhdGEgdHlwZSBjb250YWlucyBhIGNpcmN1bGFyIHJlZmVyZW5jZS4iKTsKKyAgICAgICAgLy8gY2F0YWxvZyAtLT4gY2F0YWxvZ0EgLS0+IGNhdGFsb2dCIC0tPiBjYXRhbG9nCisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nIiwgY2F0YWxvZyk7CisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZ0EgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nQSIsIGNhdGFsb2dBKTsKKyAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nQiA9IG5ld0NhdGFsb2coKTsKKyAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImNhdGFsb2dCIiwgY2F0YWxvZ0IpOwogCi0gICAgICAgIC8vIGNhdGFsb2cxIC0tPiBjYXRhbG9nMiAtLT4gY2F0YWxvZzMgLS0+IGNhdGFsb2cxCi0gICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZzEgPSBuZXdDYXRhbG9nKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nMSIsIGNhdGFsb2cxKTsKLSAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMiA9IG5ld0NhdGFsb2coKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImNhdGFsb2cyIiwgY2F0YWxvZzIpOwotICAgICAgICBYTUxDYXRhbG9nIGNhdGFsb2czID0gbmV3Q2F0YWxvZygpOwotICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZzMiLCBjYXRhbG9nMyk7CisgICAgICAgIGNhdGFsb2dCLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2ciKSk7CisgICAgICAgIGNhdGFsb2dBLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2dCIikpOworICAgICAgICBjYXRhbG9nLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2dBIikpOwogCi0gICAgICAgIGNhdGFsb2czLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UocHJvamVjdCwgImNhdGFsb2cxIikpOwotICAgICAgICBjYXRhbG9nMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJjYXRhbG9nMyIpKTsKLSAgICAgICAgY2F0YWxvZzEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiY2F0YWxvZzIiKSk7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNhdGFsb2cxLnJlc29sdmVFbnRpdHkoIlBVQkxJQyBJRCBPTkUiLCAiaS9kb250L2V4aXN0LmR0ZCIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIG1ha2UgY2lyY3VsYXIgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgY2F0YWxvZy5yZXNvbHZlRW50aXR5KCJQVUJMSUMgSUQgT05FIiwgImkvZG9udC9leGlzdC5kdGQiKTsKICAgICB9CiAKICAgICAvLyBpbnNwaXJlZCBieSBCdWd6aWxsYSBSZXBvcnQgMjM5MTMKQEAgLTIxMSwxNCArMTkxLDE2IEBACiAgICAgICAgIFJlc291cmNlTG9jYXRpb24gZHRkID0gbmV3IFJlc291cmNlTG9jYXRpb24oKTsKICAgICAgICAgZHRkLnNldFB1YmxpY0lkKCItLy9zdGV2by8vRFREIGRvYyAxLjAvL0VOIik7CiAKLSAgICAgICAgU3RyaW5nIHN5c2lkID0gU3lzdGVtLmdldFByb3BlcnR5KCJyb290IikgKyBGaWxlLnNlcGFyYXRvciArICJzcmMvZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvZG9jLmR0ZCI7CisgICAgICAgIFN0cmluZyBzeXNpZCA9IHByb2plY3QucmVzb2x2ZUZpbGUoInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9kb2MuZHRkIikKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihzeXNpZCk7CiAgICAgICAgIGNhdGFsb2cuYWRkRFREKGR0ZCk7Ci0gICAgICAgIEZpbGUgZHRkRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoc3lzaWQpOwogCiAgICAgICAgIElucHV0U291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZUVudGl0eSgiLS8vc3Rldm8vL0RURCBkb2MgMS4wLy9FTiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKworICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHN5c2lkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRvVVJMU3RyaW5nKGR0ZEZpbGUpLCByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CiAgICAgfQogCkBAIC0yMjksMTMgKzIxMSwxMyBAQAogICAgICAgICBTdHJpbmcgc3lzaWQgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQiOwogICAgICAgICBkdGQuc2V0TG9jYXRpb24oc3lzaWQpOwogICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOwotICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHN5c2lkKTsKIAogICAgICAgICBJbnB1dFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVFbnRpdHkoIi0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hcDpjaGVtaWNhbCticm90aGVycyIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0b1VSTFN0cmluZyhkdGRGaWxlKSwgcmVzdWx0LmdldFN5c3RlbUlkKCkpOwogCisgICAgICAgIEZpbGUgZHRkRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoc3lzaWQpOworICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoZHRkRmlsZSksIHJlc3VsdC5nZXRTeXN0ZW1JZCgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjQzLDEyICsyMjUsMTEgQEAKICAgICAgICAgU3RyaW5nIHB1YmxpY0lkID0gIi0vL3N0ZXZvLy9EVEQgZG9jIDEuMC8vRU4iOwogICAgICAgICBTdHJpbmcgc3lzaWQgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2RvYy5kdGQiOwogCi0gICAgICAgIC8vIGNhdGFsb2cyIC0tPiBjYXRhbG9nMSAtLT4gY2F0YWxvZworICAgICAgICAvLyBjYXRhbG9nQiAtLT4gY2F0YWxvZ0EgLS0+IGNhdGFsb2cKICAgICAgICAgUmVzb3VyY2VMb2NhdGlvbiBkdGQgPSBuZXcgUmVzb3VyY2VMb2NhdGlvbigpOwogICAgICAgICBkdGQuc2V0UHVibGljSWQocHVibGljSWQpOwogICAgICAgICBkdGQuc2V0TG9jYXRpb24oc3lzaWQpOwogICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOwotICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHN5c2lkKTsKIAogICAgICAgICBTdHJpbmcgdXJpID0gImh0dHA6Ly9mb28uY29tL2Jhci9ibGFoLnhtbCI7CiAgICAgICAgIFN0cmluZyB1cmlMb2MgPSAic3JjL2V0Yy90ZXN0Y2FzZXMvdGFza2RlZnMvb3B0aW9uYWwveG1sL2Fib3V0LnhtbCI7CkBAIC0yNTcsMjYgKzIzOCwyOCBAQAogICAgICAgICBlbnRpdHkuc2V0UHVibGljSWQodXJpKTsKICAgICAgICAgZW50aXR5LnNldExvY2F0aW9uKHVyaUxvYyk7CiAgICAgICAgIGNhdGFsb2cuYWRkRW50aXR5KGVudGl0eSk7Ci0gICAgICAgIEZpbGUgeG1sRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUodXJpTG9jKTsKIAogICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZyIsIGNhdGFsb2cpOwogCi0gICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZzEgPSBuZXdDYXRhbG9nKCk7Ci0gICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nMSIsIGNhdGFsb2cxKTsKLSAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMiA9IG5ld0NhdGFsb2coKTsKLSAgICAgICAgcHJvamVjdC5hZGRSZWZlcmVuY2UoImNhdGFsb2cyIiwgY2F0YWxvZzEpOworICAgICAgICBYTUxDYXRhbG9nIGNhdGFsb2dBID0gbmV3Q2F0YWxvZygpOworICAgICAgICBwcm9qZWN0LmFkZFJlZmVyZW5jZSgiY2F0YWxvZ0EiLCBjYXRhbG9nQSk7CisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZ0IgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIHByb2plY3QuYWRkUmVmZXJlbmNlKCJjYXRhbG9nQiIsIGNhdGFsb2dCKTsKIAotICAgICAgICBjYXRhbG9nMS5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJjYXRhbG9nIikpOwotICAgICAgICBjYXRhbG9nMi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKHByb2plY3QsICJjYXRhbG9nMSIpKTsKKyAgICAgICAgY2F0YWxvZ0Euc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiY2F0YWxvZyIpKTsKKyAgICAgICAgY2F0YWxvZ0Iuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShwcm9qZWN0LCAiY2F0YWxvZ0EiKSk7CiAKLSAgICAgICAgSW5wdXRTb3VyY2UgaXNSZXN1bHQgPSBjYXRhbG9nMi5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7Ci0KKyAgICAgICAgSW5wdXRTb3VyY2UgaXNSZXN1bHQgPSBjYXRhbG9nQi5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7CiAgICAgICAgIGFzc2VydE5vdE51bGwoaXNSZXN1bHQpOworCisgICAgICAgIEZpbGUgZHRkRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoc3lzaWQpOwogICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoZHRkRmlsZSksIGlzUmVzdWx0LmdldFN5c3RlbUlkKCkpOwogCi0gICAgICAgICAgICBTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlKHVyaSwgbnVsbCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoeG1sRmlsZSksIHJlc3VsdC5nZXRTeXN0ZW1JZCgpKTsKKyAgICAgICAgU291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZSh1cmksIG51bGwpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisKKyAgICAgICAgRmlsZSB4bWxGaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZSh1cmlMb2MpOworICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoeG1sRmlsZSksIHJlc3VsdC5nZXRTeXN0ZW1JZCgpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjg4LDcgKzI3MSw2IEBACiAgICAgICAgIGR0ZC5zZXRQdWJsaWNJZChwdWJsaWNJZCk7CiAgICAgICAgIGR0ZC5zZXRMb2NhdGlvbihkdGRMb2MpOwogICAgICAgICBjYXRhbG9nLmFkZERURChkdGQpOwotICAgICAgICBGaWxlIGR0ZEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKGR0ZExvYyk7CiAKICAgICAgICAgU3RyaW5nIHVyaSA9ICJodHRwOi8vZm9vLmNvbS9iYXIvYmxhaC54bWwiOwogICAgICAgICBTdHJpbmcgdXJpTG9jID0gInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL29wdGlvbmFsL3htbC9hYm91dC54bWwiOwpAQCAtMjk3LDIyICsyNzksMjQgQEAKICAgICAgICAgZW50aXR5LnNldFB1YmxpY0lkKHVyaSk7CiAgICAgICAgIGVudGl0eS5zZXRMb2NhdGlvbih1cmlMb2MpOwogICAgICAgICBjYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOwotICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKHVyaUxvYyk7CiAKLSAgICAgICAgWE1MQ2F0YWxvZyBjYXRhbG9nMSA9IG5ld0NhdGFsb2coKTsKLSAgICAgICAgY2F0YWxvZzEuYWRkQ29uZmlndXJlZFhNTENhdGFsb2coY2F0YWxvZyk7Ci0KLSAgICAgICAgSW5wdXRTb3VyY2UgaXNSZXN1bHQgPSBjYXRhbG9nMS5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCAibmFwOmNoZW1pY2FsK2Jyb3RoZXJzIik7CisgICAgICAgIFhNTENhdGFsb2cgY2F0YWxvZ0EgPSBuZXdDYXRhbG9nKCk7CisgICAgICAgIGNhdGFsb2dBLmFkZENvbmZpZ3VyZWRYTUxDYXRhbG9nKGNhdGFsb2cpOworICAgICAgICBJbnB1dFNvdXJjZSBpc1Jlc3VsdCA9IGNhdGFsb2dBLnJlc29sdmVFbnRpdHkocHVibGljSWQsICJuYXA6Y2hlbWljYWwrYnJvdGhlcnMiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpc1Jlc3VsdCk7CisKKyAgICAgICAgRmlsZSBkdGRGaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZShkdGRMb2MpOwogICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoZHRkRmlsZSksIGlzUmVzdWx0LmdldFN5c3RlbUlkKCkpOwogCiAgICAgICAgIFNvdXJjZSByZXN1bHQgPSBjYXRhbG9nLnJlc29sdmUodXJpLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOworCisgICAgICAgIEZpbGUgeG1sRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUodXJpTG9jKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKHRvVVJMU3RyaW5nKHhtbEZpbGUpLCByZXN1bHQuZ2V0U3lzdGVtSWQoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZXJCYXNlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlckJhc2UoKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgdXJpID0gImh0dHA6Ly9mb28uY29tL2Jhci9ibGFoLnhtbCI7CiAgICAgICAgIFN0cmluZyB1cmlMb2MgPSAiZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYWJvdXQueG1sIjsKICAgICAgICAgU3RyaW5nIGJhc2UgPSB0b1VSTFN0cmluZyhwcm9qZWN0LmdldEJhc2VEaXIoKSkgKyAiL3NyYy8iOwpAQCAtMzIxLDEwICszMDUsMTEgQEAKICAgICAgICAgZW50aXR5LnNldFB1YmxpY0lkKHVyaSk7CiAgICAgICAgIGVudGl0eS5zZXRMb2NhdGlvbih1cmlMb2MpOwogICAgICAgICBjYXRhbG9nLmFkZEVudGl0eShlbnRpdHkpOwotICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJzcmMvIiArIHVyaUxvYyk7CiAKICAgICAgICAgU291cmNlIHJlc3VsdCA9IGNhdGFsb2cucmVzb2x2ZSh1cmksIGJhc2UpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdCk7CisKKyAgICAgICAgRmlsZSB4bWxGaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZSgic3JjLyIgKyB1cmlMb2MpOwogICAgICAgICBhc3NlcnRFcXVhbHModG9VUkxTdHJpbmcoeG1sRmlsZSksIHJlc3VsdC5nZXRTeXN0ZW1JZCgpKTsKICAgICB9CiAKQEAgLTMzOCw3ICszMjMsNiBAQAogICAgICAgICBkdGQuc2V0UHVibGljSWQocHVibGljSWQpOwogICAgICAgICBkdGQuc2V0TG9jYXRpb24oZHRkTG9jKTsKICAgICAgICAgY2F0YWxvZy5hZGREVEQoZHRkKTsKLSAgICAgICAgRmlsZSBkdGRGaWxlID0gcHJvamVjdC5yZXNvbHZlRmlsZSgic3JjL2V0Yy8iICsgZHRkTG9jKTsKIAogICAgICAgICBTdHJpbmcgdXJpID0gImh0dHA6Ly9mb28uY29tL2Jhci9ibGFoLnhtbCI7CiAgICAgICAgIFN0cmluZyB1cmlMb2MgPSAiZXRjL3Rlc3RjYXNlcy90YXNrZGVmcy9vcHRpb25hbC94bWwvYWJvdXQueG1sIjsKQEAgLTM0OCw3ICszMzIsNiBAQAogICAgICAgICBlbnRpdHkuc2V0UHVibGljSWQodXJpKTsKICAgICAgICAgZW50aXR5LnNldExvY2F0aW9uKHVyaUxvYyk7CiAgICAgICAgIGNhdGFsb2cuYWRkRW50aXR5KGVudGl0eSk7Ci0gICAgICAgIEZpbGUgeG1sRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoInNyYy8iICsgdXJpTG9jKTsKIAogICAgICAgICBQYXRoIGFQYXRoID0gbmV3IFBhdGgocHJvamVjdCwgcGF0aDEpOwogICAgICAgICBhUGF0aC5hcHBlbmQobmV3IFBhdGgocHJvamVjdCwgcGF0aDIpKTsKQEAgLTM1NiwxMiArMzM5LDE2IEBACiAKICAgICAgICAgSW5wdXRTb3VyY2UgaXNSZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVFbnRpdHkocHVibGljSWQsICJuYXA6Y2hlbWljYWwrYnJvdGhlcnMiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbChpc1Jlc3VsdCk7CisKICAgICAgICAgU3RyaW5nIHJlc3VsdFN0cjEgPSBuZXcgVVJMKGlzUmVzdWx0LmdldFN5c3RlbUlkKCkpLmdldEZpbGUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh0b1VSTFN0cmluZyhkdGRGaWxlKS5lbmRzV2l0aChyZXN1bHRTdHIxKSk7CisgICAgICAgIEZpbGUgZHRkRmlsZSA9IHByb2plY3QucmVzb2x2ZUZpbGUoInNyYy9ldGMvIiArIGR0ZExvYyk7CisgICAgICAgIGFzc2VydFRoYXQodG9VUkxTdHJpbmcoZHRkRmlsZSksIGVuZHNXaXRoKHJlc3VsdFN0cjEpKTsKIAogICAgICAgICBTb3VyY2UgcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlKHVyaSwgbnVsbCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKKworICAgICAgICBGaWxlIHhtbEZpbGUgPSBwcm9qZWN0LnJlc29sdmVGaWxlKCJzcmMvIiArIHVyaUxvYyk7CiAgICAgICAgIFN0cmluZyByZXN1bHRTdHIgPSBuZXcgVVJMKHJlc3VsdC5nZXRTeXN0ZW1JZCgpKS5nZXRGaWxlKCk7Ci0gICAgICAgIGFzc2VydFRydWUodG9VUkxTdHJpbmcoeG1sRmlsZSkuZW5kc1dpdGgocmVzdWx0U3RyKSk7CisgICAgICAgIGFzc2VydFRoYXQodG9VUkxTdHJpbmcoeG1sRmlsZSksIGVuZHNXaXRoKHJlc3VsdFN0cikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9aaXBGaWxlU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXRUZXN0LmphdmEKaW5kZXggYzg5YjQyMC4uMTc0NTU5ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL1ppcEZpbGVTZXRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSwxMSArMjEsMTAgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBKVW5pdCA0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuWmlwRmlsZVNldC4KQEAgLTM0LDg2ICszMyw5NSBAQAogICovCiBwdWJsaWMgY2xhc3MgWmlwRmlsZVNldFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZpbGVTZXRUZXN0IHsKIAorICAgIHByaXZhdGUgWmlwRmlsZVNldCB6ZnM7CisKICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IFppcEZpbGVTZXQoKTsKICAgICB9CiAKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHpmcyA9IChaaXBGaWxlU2V0KSBnZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoYXQgZGlyIGFuZCBzcmMgYXJlIGluY29tcGF0aWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFNyY0RpckF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgemZzLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7CisgICAgICAgIHpmcy5zZXREaXIobmV3IEZpbGUoImV4YW1wbGVzIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoYXQgZGlyIGFuZCBzcmMgYXJlIGluY29tcGF0aWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdERpclNyY0F0dHJpYnV0ZXMoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgemZzLnNldERpcihuZXcgRmlsZSgiZXhhbXBsZXMiKSk7CisgICAgICAgIHpmcy5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUuemlwIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoYXQgZnVsbHBhdGggYW5kIHByZWZpeCBhcmUgaW5jb21wYXRpYmxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0UHJlZml4RnVsbHBhdGhBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiKTsKKyAgICAgICAgemZzLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7CisgICAgICAgIHpmcy5zZXRQcmVmaXgoIi9leGFtcGxlcyIpOworICAgICAgICB6ZnMuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBjaGVjayB0aGF0IGZ1bGxwYXRoIGFuZCBwcmVmaXggYXJlIGluY29tcGF0aWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZ1bGxwYXRoUHJlZml4QXR0cmlidXRlcygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJDYW5ub3Qgc2V0IGJvdGggZnVsbHBhdGggYW5kIHByZWZpeCBhdHRyaWJ1dGVzIik7CisgICAgICAgIHpmcy5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUuemlwIikpOworICAgICAgICB6ZnMuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgemZzLnNldFByZWZpeCgiL2V4YW1wbGVzIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2sgdGhhdCByZWZlcmVuY2UgemlwZmlsZXNldHMgY2Fubm90IGhhdmUgc3BlY2lmaWMgYXR0cmlidXRlcworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFJlZmlkU3JjQXR0cmlidXRlcygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIHpmcy5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7CisgICAgICAgIHpmcy5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUuemlwIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIGNoZWNrIHRoYXQgYSByZWZlcmVuY2UgemlwZmlsZXNldCBnZXRzIHRoZSBzYW1lIGF0dHJpYnV0ZXMgYXMgdGhlIG9yaWdpbmFsCisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0QXR0cmlidXRlcygpIHsKLSAgICAgICAgWmlwRmlsZVNldCBmID0gKFppcEZpbGVTZXQpIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIC8vY2hlY2sgdGhhdCBkaXIgYW5kIHNyYyBhcmUgaW5jb21wYXRpYmxlCi0gICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnppcCIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RGlyKG5ldyBGaWxlKCJleGFtcGxlcyIpKTsKLSAgICAgICAgICAgIGZhaWwoImNhbiBhZGQgZGlyIHRvICIKLSAgICAgICAgICAgICAgICAgICAgKyBmLmdldERhdGFUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB3aGVuIGEgc3JjIGlzIGFscmVhZHkgcHJlc2VudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3Qgc2V0IGJvdGggZGlyIGFuZCBzcmMgYXR0cmlidXRlcyIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZiA9IChaaXBGaWxlU2V0KSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAvL2NoZWNrIHRoYXQgZGlyIGFuZCBzcmMgYXJlIGluY29tcGF0aWJsZQotICAgICAgICBmLnNldERpcihuZXcgRmlsZSgiZXhhbXBsZXMiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7Ci0gICAgICAgICAgICBmYWlsKCJjYW4gYWRkIHNyYyB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIGRpciBpcyBhbHJlYWR5IHByZXNlbnQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IHNldCBib3RoIGRpciBhbmQgc3JjIGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIC8vY2hlY2sgdGhhdCBmdWxscGF0aCBhbmQgcHJlZml4IGFyZSBpbmNvbXBhdGlibGUKLSAgICAgICAgZiA9IChaaXBGaWxlU2V0KSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7Ci0gICAgICAgIGYuc2V0UHJlZml4KCIvZXhhbXBsZXMiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuc2V0RnVsbHBhdGgoIi9kb2MvbWFudWFsL2luZGV4Lmh0bWwiKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgZnVsbHBhdGggdG8gIgotICAgICAgICAgICAgICAgICAgICArIGYuZ2V0RGF0YVR5cGVOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIHdoZW4gYSBwcmVmaXggaXMgYWxyZWFkeSBwcmVzZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNhbm5vdCBzZXQgYm90aCBmdWxscGF0aCBhbmQgcHJlZml4IGF0dHJpYnV0ZXMiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGYgPSAoWmlwRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZi5zZXRTcmMobmV3IEZpbGUoImV4YW1wbGUuemlwIikpOwotICAgICAgICBmLnNldEZ1bGxwYXRoKCIvZG9jL21hbnVhbC9pbmRleC5odG1sIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFByZWZpeCgiL2V4YW1wbGVzIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHByZWZpeCB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIGZ1bGxwYXRoIGlzIGFscmVhZHkgcHJlc2VudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDYW5ub3Qgc2V0IGJvdGggZnVsbHBhdGggYW5kIHByZWZpeCBhdHRyaWJ1dGVzIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayB0aGF0IHJlZmVyZW5jZSB6aXBmaWxlc2V0cyBjYW5ub3QgaGF2ZSBzcGVjaWZpYyBhdHRyaWJ1dGVzCi0gICAgICAgIGYgPSAoWmlwRmlsZVNldCkgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFNyYyhuZXcgRmlsZSgiZXhhbXBsZS56aXAiKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHNyYyB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgZi5nZXREYXRhVHlwZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgd2hlbiBhIHJlZmlkIGlzIGFscmVhZHkgcHJlc2VudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lICIKLSAgICAgICAgICAgICsgImF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayB0aGF0IGEgcmVmZXJlbmNlIHppcGZpbGVzZXQgZ2V0cyB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFzIHRoZSBvcmlnaW5hbAotICAgICAgICBmID0gKFppcEZpbGVTZXQpIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGYuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnppcCIpKTsKLSAgICAgICAgZi5zZXRQcmVmaXgoIi9leGFtcGxlcyIpOwotICAgICAgICBmLnNldEZpbGVNb2RlKCI2MDAiKTsKLSAgICAgICAgZi5zZXREaXJNb2RlKCI1MzAiKTsKLSAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsIGYpOworICAgICAgICB6ZnMuc2V0U3JjKG5ldyBGaWxlKCJleGFtcGxlLnppcCIpKTsKKyAgICAgICAgemZzLnNldFByZWZpeCgiL2V4YW1wbGVzIik7CisgICAgICAgIHpmcy5zZXRGaWxlTW9kZSgiNjAwIik7CisgICAgICAgIHpmcy5zZXREaXJNb2RlKCI1MzAiKTsKKyAgICAgICAgZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgidGVzdCIsIHpmcyk7CiAgICAgICAgIFppcEZpbGVTZXQgemlkID0gKFppcEZpbGVTZXQpIGdldEluc3RhbmNlKCk7CiAgICAgICAgIHppZC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgInRlc3QiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNyYyBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKS5lcXVhbHMoZi5nZXRTcmMoZ2V0UHJvamVjdCgpKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJwcmVmaXggYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICBmLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLmVxdWFscyh6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzcmMgYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgICAgICB6ZnMuZ2V0U3JjKGdldFByb2plY3QoKSksIHppZC5nZXRTcmMoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJlZml4IGF0dHJpYnV0ZSBjb3BpZWQgYnkgY29weSBjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICAgICAgemZzLmdldFByZWZpeChnZXRQcm9qZWN0KCkpLCB6aWQuZ2V0UHJlZml4KGdldFByb2plY3QoKSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGUgbW9kZSBhdHRyaWJ1dGUgY29waWVkIGJ5IGNvcHkgY29uc3RydWN0b3IiLAotICAgICAgICAgICAgICAgIGYuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSwgemlkLmdldEZpbGVNb2RlKGdldFByb2plY3QoKSkpOworICAgICAgICAgICAgICAgIHpmcy5nZXRGaWxlTW9kZShnZXRQcm9qZWN0KCkpLCB6aWQuZ2V0RmlsZU1vZGUoZ2V0UHJvamVjdCgpKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZGlyIG1vZGUgYXR0cmlidXRlIGNvcGllZCBieSBjb3B5IGNvbnN0cnVjdG9yIiwKLSAgICAgICAgICAgICAgICBmLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSwgemlkLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSk7CisgICAgICAgICAgICAgICAgemZzLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSwgemlkLmdldERpck1vZGUoZ2V0UHJvamVjdCgpKSk7CiAgICAgICB9CiAKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL0dsb2JNYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9HbG9iTWFwcGVyVGVzdC5qYXZhCmluZGV4IGM3M2MyZmUuLmRjNGQ3ZmEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL0dsb2JNYXBwZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvR2xvYk1hcHBlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL01hcHBlclJlc3VsdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvTWFwcGVyUmVzdWx0LmphdmEKaW5kZXggODM4MmUwNS4uMTAwMGRlZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvTWFwcGVyUmVzdWx0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvTWFwcGVyUmVzdWx0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC04MCwxNCArODAsNyBAQAogICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgIGZsYXR0ZW5lZCA9IE5VTExfTUFQUEVSX1JFU1VMVDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkgewotICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQoInwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYi5hcHBlbmQocmVzdWx0W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsYXR0ZW5lZCA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZsYXR0ZW5lZCA9IFN0cmluZy5qb2luKCJ8IiwgcmVzdWx0KTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWZsYXR0ZW5lZC5lcXVhbHMob3V0cHV0KSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKGZhaWxNZXNzYWdlICsgIiBnb3QgIiArIGZsYXR0ZW5lZCArICIgZXhwZWN0ZWQgIiArIG91dHB1dCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9SZWdleHBQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL21hcHBlcnMvUmVnZXhwUGF0dGVybk1hcHBlclRlc3QuamF2YQppbmRleCA2ZDRkMTNhLi44Zjk1ZDYzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvbWFwcGVycy9SZWdleHBQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9tYXBwZXJzL1JlZ2V4cFBhdHRlcm5NYXBwZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdE1hcHBlclRlc3QuamF2YQppbmRleCBiZjcyN2RiLi42MjVhM2QwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0TWFwcGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRNYXBwZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvU2NyaXB0U2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMzA0ZDZkMC4uYzJjNTQwYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL1NjcmlwdFNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9vcHRpb25hbC9TY3JpcHRTZWxlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDkgKzIyLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LkFudEFzc2VydC5hc3NlcnRDb250YWluczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUZXN0IHRoYXQgc2NyaXB0aW5nIHNlbGVjdGlvbiB3b3Jrcy4gTmVlZHMgc2NyaXB0aW5nIHN1cHBvcnQgdG8gd29yawpAQCAtMzQsNiArMzIsOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgYnVpbGRSdWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3NlbGVjdG9ycy9zY3JpcHRzZWxlY3Rvci54bWwiKTsKQEAgLTQxLDEzICs0Miw5IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb2xhbmd1YWdlKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3ROb2xhbmd1YWdlIik7Ci0gICAgICAgICAgICBmYWlsKCJBYnNlbmNlIG9mIGxhbmd1YWdlIGF0dHJpYnV0ZSBub3QgZGV0ZWN0ZWQiKTsKLSAgICAgICAgfSBjYXRjaChCdWlsZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgYXNzZXJ0Q29udGFpbnMoInNjcmlwdCBsYW5ndWFnZSBtdXN0IGJlIHNwZWNpZmllZCIsIGV4LmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoInNjcmlwdCBsYW5ndWFnZSBtdXN0IGJlIHNwZWNpZmllZCIpOworICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE5vbGFuZ3VhZ2UiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL29wdGlvbmFsL2RlcGVuZC9DbGFzc0ZpbGVTZXRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QuamF2YQppbmRleCBlMjI1ZjEzLi5kZDdmNTRjIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvb3B0aW9uYWwvZGVwZW5kL0NsYXNzRmlsZVNldFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE4ICsxOSwyMCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5kZXBlbmQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaGFzS2V5OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiAKIC8qKgogICogVGVzdGNhc2UgZm9yIHRoZSBDbGFzc2ZpbGVzZXQgb3B0aW9uYWwgdHlwZS4KQEAgLTUzLDI1ICs1NSwxNCBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljU2V0KCkgewotICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdGJhc2ljc2V0Iik7Ci0gICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IHAuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKLSAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKHApOwotICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgSGFzaHRhYmxlIGZpbGVzID0gbmV3IEhhc2h0YWJsZSgpOwotICAgICAgICBmb3IgKFN0cmluZyBzY2FubmVkRmlsZSA6IHNjYW5uZWRGaWxlcykgewotICAgICAgICAgICAgZmlsZXMucHV0KHNjYW5uZWRGaWxlLCBzY2FubmVkRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzc2ZpbGVzZXQgZGlkIG5vdCBwaWNrIHVwIGV4cGVjdGVkIG51bWJlciBvZiAiCi0gICAgICAgICAgICArICJjbGFzcyBmaWxlcyIsIDQsIGZpbGVzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQS5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQS5jbGFzcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBCLmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJCLmNsYXNzIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEMuY2xhc3MiLAotICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkMuY2xhc3MiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gRC5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiRC5jbGFzcyIpKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBmaWxlcyA9IGdldEZpbGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3NmaWxlc2V0IGRpZCBub3QgcGljayB1cCBleHBlY3RlZCBudW1iZXIgb2YgY2xhc3MgZmlsZXMiLAorICAgICAgICAgICAgICAgIDQsIGZpbGVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQS5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkEuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQi5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkIuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQy5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkMuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gRC5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkQuY2xhc3MiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03OSwyMSArNzAsMTIgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTbWFsbFNldCgpIHsKLSAgICAgICAgUHJvamVjdCBwID0gYnVpbGRSdWxlLmdldFByb2plY3QoKTsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RzbWFsbHNldCIpOwotICAgICAgICBGaWxlU2V0IHJlc3VsdEZpbGVTZXQgPSBwLmdldFJlZmVyZW5jZShSRVNVTFRfRklMRVNFVCk7Ci0gICAgICAgIERpcmVjdG9yeVNjYW5uZXIgc2Nhbm5lciA9IHJlc3VsdEZpbGVTZXQuZ2V0RGlyZWN0b3J5U2Nhbm5lcihwKTsKLSAgICAgICAgU3RyaW5nW10gc2Nhbm5lZEZpbGVzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0gICAgICAgIEhhc2h0YWJsZSBmaWxlcyA9IG5ldyBIYXNodGFibGUoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgc2Nhbm5lZEZpbGUgOiBzY2FubmVkRmlsZXMpIHsKLSAgICAgICAgICAgIGZpbGVzLnB1dChzY2FubmVkRmlsZSwgc2Nhbm5lZEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3NmaWxlc2V0IGRpZCBub3QgcGljayB1cCBleHBlY3RlZCBudW1iZXIgb2YgIgotICAgICAgICAgICAgKyAiY2xhc3MgZmlsZXMiLCAyLCBmaWxlcy5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEIuY2xhc3MiLAotICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkIuY2xhc3MiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQy5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQy5jbGFzcyIpKTsKKyAgICAgICAgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBmaWxlcyA9IGdldEZpbGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xhc3NmaWxlc2V0IGRpZCBub3QgcGljayB1cCBleHBlY3RlZCBudW1iZXIgb2YgY2xhc3MgZmlsZXMiLAorICAgICAgICAgICAgICAgIDIsIGZpbGVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQi5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkIuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQy5jbGFzcyIsIGZpbGVzLCBoYXNLZXkoIkMuY2xhc3MiKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDEsMTkgKzgzLDExIEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYm9TZXQoKSB7Ci0gICAgICAgIFByb2plY3QgcCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0Y29tYm9zZXQiKTsKLSAgICAgICAgRmlsZVNldCByZXN1bHRGaWxlU2V0ID0gcC5nZXRSZWZlcmVuY2UoUkVTVUxUX0ZJTEVTRVQpOwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSByZXN1bHRGaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIocCk7Ci0gICAgICAgIFN0cmluZ1tdIHNjYW5uZWRGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNjYW5uZWRGaWxlIDogc2Nhbm5lZEZpbGVzKSB7Ci0gICAgICAgICAgICBmaWxlcy5wdXQoc2Nhbm5lZEZpbGUsIHNjYW5uZWRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKLSAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgMSwgZmlsZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBDLmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJDLmNsYXNzIikpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gZ2V0RmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzc2ZpbGVzZXQgZGlkIG5vdCBwaWNrIHVwIGV4cGVjdGVkIG51bWJlciBvZiBjbGFzcyBmaWxlcyIsCisgICAgICAgICAgICAgICAgMSwgZmlsZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBDLmNsYXNzIiwgZmlsZXMsIGhhc0tleSgiQy5jbGFzcyIpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyOSwyNyArMTAzLDE1IEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kUGFyYW0oKSB7Ci0gICAgICAgIFByb2plY3QgcCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCk7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0bWV0aG9kcGFyYW0iKTsKLSAgICAgICAgRmlsZVNldCByZXN1bHRGaWxlU2V0ID0gcC5nZXRSZWZlcmVuY2UoUkVTVUxUX0ZJTEVTRVQpOwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSByZXN1bHRGaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIocCk7Ci0gICAgICAgIFN0cmluZ1tdIHNjYW5uZWRGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNjYW5uZWRGaWxlIDogc2Nhbm5lZEZpbGVzKSB7Ci0gICAgICAgICAgICBmaWxlcy5wdXQoc2Nhbm5lZEZpbGUsIHNjYW5uZWRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKLSAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgNSwgZmlsZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBBLmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJBLmNsYXNzIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEIuY2xhc3MiLAotICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkIuY2xhc3MiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gQy5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgiQy5jbGFzcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiBELmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJELmNsYXNzIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEUuY2xhc3MiLAotICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoIkUuY2xhc3MiKSk7CisgICAgICAgIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZmlsZXMgPSBnZXRGaWxlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mIGNsYXNzIGZpbGVzIiwKKyAgICAgICAgICAgICAgICA1LCBmaWxlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEEuY2xhc3MiLCBmaWxlcywgaGFzS2V5KCJBLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEIuY2xhc3MiLCBmaWxlcywgaGFzS2V5KCJCLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEMuY2xhc3MiLCBmaWxlcywgaGFzS2V5KCJDLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEQuY2xhc3MiLCBmaWxlcywgaGFzS2V5KCJELmNsYXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIEUuY2xhc3MiLCBmaWxlcywgaGFzS2V5KCJFLmNsYXNzIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU3LDI1ICsxMTksMTggQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RQYXJhbUlubmVyKCkgewotICAgICAgICBQcm9qZWN0IHAgPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpOwogICAgICAgICBidWlsZFJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdG1ldGhvZHBhcmFtaW5uZXIiKTsKLSAgICAgICAgRmlsZVNldCByZXN1bHRGaWxlU2V0ID0gcC5nZXRSZWZlcmVuY2UoUkVTVUxUX0ZJTEVTRVQpOwotICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSByZXN1bHRGaWxlU2V0LmdldERpcmVjdG9yeVNjYW5uZXIocCk7Ci0gICAgICAgIFN0cmluZ1tdIHNjYW5uZWRGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgICBIYXNodGFibGUgZmlsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIHNjYW5uZWRGaWxlIDogc2Nhbm5lZEZpbGVzKSB7Ci0gICAgICAgICAgICBmaWxlcy5wdXQoc2Nhbm5lZEZpbGUsIHNjYW5uZWRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoIkNsYXNzZmlsZXNldCBkaWQgbm90IHBpY2sgdXAgZXhwZWN0ZWQgbnVtYmVyIG9mICIKLSAgICAgICAgICAgICsgImNsYXNzIGZpbGVzIiwgNCwgZmlsZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiB0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyJElubmVyLmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyJElubmVyLmNsYXNzIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJSZXN1bHQgZGlkIG5vdCBjb250YWluIHRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiT3V0ZXIuY2xhc3MiLAotICAgICAgICAgICAgZmlsZXMuY29udGFpbnNLZXkoInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiT3V0ZXIuY2xhc3MiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gdGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJDb250YWluc09ubHlJbm5lci5jbGFzcyIsCi0gICAgICAgICAgICBmaWxlcy5jb250YWluc0tleSgidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJDb250YWluc09ubHlJbm5lci5jbGFzcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiUmVzdWx0IGRpZCBub3QgY29udGFpbiB0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIkNvbnRhaW5zT25seUlubmVyLmNsYXNzIiwKLSAgICAgICAgICAgIGZpbGVzLmNvbnRhaW5zS2V5KCJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk1ldGhvZFBhcmFtLmNsYXNzIikpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGZpbGVzID0gZ2V0RmlsZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbGFzc2ZpbGVzZXQgZGlkIG5vdCBwaWNrIHVwIGV4cGVjdGVkIG51bWJlciBvZiBjbGFzcyBmaWxlcyIsCisgICAgICAgICAgICAgICAgNCwgZmlsZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiUmVzdWx0IGRpZCBub3QgY29udGFpbiB0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyJElubmVyLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLCBoYXNLZXkoInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiT3V0ZXIkSW5uZXIuY2xhc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlJlc3VsdCBkaWQgbm90IGNvbnRhaW4gdGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJPdXRlci5jbGFzcyIsCisgICAgICAgICAgICBmaWxlcywgaGFzS2V5KCJ0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIk91dGVyLmNsYXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KCJSZXN1bHQgZGlkIG5vdCBjb250YWluIHRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiQ29udGFpbnNPbmx5SW5uZXIuY2xhc3MiLAorICAgICAgICAgICAgZmlsZXMsIGhhc0tleSgidGVzdCIgKyBGaWxlLnNlcGFyYXRvciArICJDb250YWluc09ubHlJbm5lci5jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiUmVzdWx0IGRpZCBub3QgY29udGFpbiB0ZXN0IiArIEZpbGUuc2VwYXJhdG9yICsgIkNvbnRhaW5zT25seUlubmVyLmNsYXNzIiwKKyAgICAgICAgICAgIGZpbGVzLCBoYXNLZXkoInRlc3QiICsgRmlsZS5zZXBhcmF0b3IgKyAiTWV0aG9kUGFyYW0uY2xhc3MiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE4Myw0ICsxMzgsMTEgQEAKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RyZXNvdXJjZWNvbGxlY3Rpb24iKTsKICAgICB9CiAKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0RmlsZXMoKSB7CisgICAgICAgIEZpbGVTZXQgcmVzdWx0RmlsZVNldCA9IGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UmVmZXJlbmNlKFJFU1VMVF9GSUxFU0VUKTsKKyAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gcmVzdWx0RmlsZVNldC5nZXREaXJlY3RvcnlTY2FubmVyKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOworICAgICAgICBTdHJpbmdbXSBzY2FubmVkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5zdHJlYW0oc2Nhbm5lZEZpbGVzKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZmlsZSAtPiBmaWxlLCBmaWxlIC0+IGZpbGUsIChhLCBiKSAtPiBiLCBIYXNodGFibGU6Om5ldykpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvRmlsZVJlc291cmNlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VUZXN0LmphdmEKaW5kZXggNjkwYWNlNi4uYzM0ZDg2ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9GaWxlUmVzb3VyY2VUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw5IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNUZXN0TmFtZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMzQsOCArMzYsMTAgQEAKICAgICBwcml2YXRlIEZpbGUgcm9vdDsKIAogICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLSAgICAgICAgcm9vdCA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJvb3QgPSAoU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBuZXcgRmlsZSgiLiIpLmdldENhbm9uaWNhbEZpbGUoKQorICAgICAgICAgICAgICAgIDogbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9KYXZhUmVzb3VyY2VUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZVRlc3QuamF2YQppbmRleCBhNjdkYjM5Li4wNTA1MDliIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0phdmFSZXNvdXJjZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDkgKzIyLDEwIEBACiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZVRlc3QgewogCkBAIC00Myw4ICs0NCw4IEBACiAKICAgICAgICAgLy8gdGhpcyBhY3R1YWxseSByZWxpZXMgb24gdGhlIGZpcnN0IG1hbmlmZXN0IGJlaW5nIGZvdW5kIG9uCiAgICAgICAgIC8vIHRoZSBjbGFzc3BhdGggKHByb2JhYmx5IHJ0LmphcidzKSBiZWluZyB2YWxpZAotICAgICAgICBhc3NlcnRUcnVlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoIm1hbmlmZXN0IikKLSAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCgiTWFuaWZlc3QtVmVyc2lvbjoiKSk7CisgICAgICAgIGFzc2VydFRoYXQoYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibWFuaWZlc3QiKSwKKyAgICAgICAgICAgICAgICAgICBzdGFydHNXaXRoKCJNYW5pZmVzdC1WZXJzaW9uOiIpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9MYXp5UmVzb3VyY2VDb2xsZWN0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9MYXp5UmVzb3VyY2VDb2xsZWN0aW9uVGVzdC5qYXZhCmluZGV4IDNhMmE3ZWMuLmU4YmU0N2UgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTGF6eVJlc291cmNlQ29sbGVjdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL0xhenlSZXNvdXJjZUNvbGxlY3Rpb25UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw3ICsxOCw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlczsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CkBAIC0yOSwzOCArMjgsNDAgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBMYXp5UmVzb3VyY2VDb2xsZWN0aW9uVGVzdCB7CiAKICAgICBwcml2YXRlIGNsYXNzIFN0cmluZ1Jlc291cmNlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIFJlc291cmNlQ29sbGVjdGlvbiB7Ci0gICAgICAgIExpc3QgcmVzb3VyY2VzID0gQXJyYXlzLjxSZXNvdXJjZT5hc0xpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmdSZXNvdXJjZUl0ZXJhdG9yPiBjcmVhdGVkSXRlcmF0b3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKLSAgICAgICAgTGlzdCBjcmVhdGVkSXRlcmF0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzLnNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiAzOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxSZXNvdXJjZT4gaXRlcmF0b3IoKSB7CiAgICAgICAgICAgICBTdHJpbmdSZXNvdXJjZUl0ZXJhdG9yIGl0ID0gbmV3IFN0cmluZ1Jlc291cmNlSXRlcmF0b3IoKTsKICAgICAgICAgICAgIGNyZWF0ZWRJdGVyYXRvcnMuYWRkKGl0KTsKICAgICAgICAgICAgIHJldHVybiBpdDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0ZpbGVzeXN0ZW1Pbmx5KCkgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBjbGFzcyBTdHJpbmdSZXNvdXJjZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgeworICAgIHByaXZhdGUgY2xhc3MgU3RyaW5nUmVzb3VyY2VJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFJlc291cmNlPiB7CiAgICAgICAgIGludCBjdXJzb3IgPSAwOwogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdSZXNvdXJjZSBuZXh0KCkgewogICAgICAgICAgICAgaWYgKGN1cnNvciA8IDMpIHsKICAgICAgICAgICAgICAgICBjdXJzb3IrKzsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1Jlc291cmNlKCJyIiArIGN1cnNvcik7CkBAIC02OCw0NyArNjksNTEgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CiAgICAgICAgICAgICByZXR1cm4gY3Vyc29yIDwgMzsKICAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhenlMb2FkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdExhenlMb2FkaW5nKCkgewogICAgICAgICBTdHJpbmdSZXNvdXJjZUNvbGxlY3Rpb24gY29sbGVjdGlvblRlc3QgPSBuZXcgU3RyaW5nUmVzb3VyY2VDb2xsZWN0aW9uKCk7CiAgICAgICAgIExhenlSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyIGxhenlDb2xsZWN0aW9uID0gbmV3IExhenlSZXNvdXJjZUNvbGxlY3Rpb25XcmFwcGVyKCk7CiAgICAgICAgIGxhenlDb2xsZWN0aW9uLmFkZChjb2xsZWN0aW9uVGVzdCk7CiAKICAgICAgICAgSXRlcmF0b3I8UmVzb3VyY2U+IGl0ID0gbGF6eUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKICAgICAgICAgYXNzZXJ0T25lQ3JlYXRlZEl0ZXJhdG9yKGNvbGxlY3Rpb25UZXN0KTsKLSAgICAgICAgU3RyaW5nUmVzb3VyY2VJdGVyYXRvciBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yID0gKFN0cmluZ1Jlc291cmNlSXRlcmF0b3IpIGNvbGxlY3Rpb25UZXN0LmNyZWF0ZWRJdGVyYXRvcnMuZ2V0KDApOworICAgICAgICBTdHJpbmdSZXNvdXJjZUl0ZXJhdG9yIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IgPSBjb2xsZWN0aW9uVGVzdC5jcmVhdGVkSXRlcmF0b3JzLmdldCgwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIHJlc291cmNlIHdhcyBsb2FkZWQgd2l0aG91dCBpdGVyYXRpbmciLCAxLAotICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKIAotICAgICAgICBTdHJpbmdSZXNvdXJjZSByID0gKFN0cmluZ1Jlc291cmNlKSBpdC5uZXh0KCk7CisgICAgICAgIGFzc2VydFN0cmluZ1ZhbHVlKCJyMSIsIGl0Lm5leHQoKSk7CiAgICAgICAgIGFzc2VydE9uZUNyZWF0ZWRJdGVyYXRvcihjb2xsZWN0aW9uVGVzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicjEiLCByLmdldFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkl0ZXJhdGluZyBvbmNlIGxvYWQgbW9yZSB0aGFuIDEgcmVzb3VyY2UiLCAyLAotICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKIAotICAgICAgICByID0gKFN0cmluZ1Jlc291cmNlKSBpdC5uZXh0KCk7CisgICAgICAgIGFzc2VydFN0cmluZ1ZhbHVlKCJyMiIsIGl0Lm5leHQoKSk7CiAgICAgICAgIGFzc2VydE9uZUNyZWF0ZWRJdGVyYXRvcihjb2xsZWN0aW9uVGVzdCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicjIiLCByLmdldFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkl0ZXJhdGluZyB0d2ljZSBsb2FkIG1vcmUgdGhhbiAyIHJlc291cmNlcyIsIDMsCi0gICAgICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOworICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOwogCi0gICAgICAgIHIgPSAoU3RyaW5nUmVzb3VyY2UpIGl0Lm5leHQoKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nVmFsdWUoInIzIiwgaXQubmV4dCgpKTsKICAgICAgICAgYXNzZXJ0T25lQ3JlYXRlZEl0ZXJhdG9yKGNvbGxlY3Rpb25UZXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyMyIsIHIuZ2V0VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSXRlcmF0aW5nIDMgdGltZXMgbG9hZCBtb3JlIHRoYW4gMyByZXNvdXJjZXMiLCAzLAotICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICB9CiAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIGZhaWwoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQiKTsKLSAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBvawotICAgICAgICB9CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXp5TG9hZGluZ0ZhaWxzT25jZVdyYXBwZWRDb2xsZWN0aW9uSXNFeGhhdXN0ZWQoKSB7CisgICAgICAgIFN0cmluZ1Jlc291cmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uVGVzdCA9IG5ldyBTdHJpbmdSZXNvdXJjZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgTGF6eVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgbGF6eUNvbGxlY3Rpb24gPSBuZXcgTGF6eVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIoKTsKKyAgICAgICAgbGF6eUNvbGxlY3Rpb24uYWRkKGNvbGxlY3Rpb25UZXN0KTsKKworICAgICAgICBJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSBsYXp5Q29sbGVjdGlvbi5pdGVyYXRvcigpOworICAgICAgICBpdC5uZXh0KCk7CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICAgICAgaXQubmV4dCgpOworICAgICAgICBpdC5uZXh0KCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9uZUNyZWF0ZWRJdGVyYXRvcigKQEAgLTExOCw3ICsxMjMsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZygpIHsKICAgICAgICAgU3RyaW5nUmVzb3VyY2VDb2xsZWN0aW9uIGNvbGxlY3Rpb25UZXN0ID0gbmV3IFN0cmluZ1Jlc291cmNlQ29sbGVjdGlvbigpOwogICAgICAgICBMYXp5UmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlciBsYXp5Q29sbGVjdGlvbiA9IG5ldyBMYXp5UmVzb3VyY2VDb2xsZWN0aW9uV3JhcHBlcigpOwogICAgICAgICBsYXp5Q29sbGVjdGlvbi5hZGQoY29sbGVjdGlvblRlc3QpOwpAQCAtMTI5LDUyICsxMzQsNjYgQEAKICAgICAgICAgSXRlcmF0b3I8UmVzb3VyY2U+IGl0MiA9IGxhenlDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CiAgICAgICAgIGFzc2VydE9uZUNyZWF0ZWRJdGVyYXRvcihjb2xsZWN0aW9uVGVzdCk7CiAKLSAgICAgICAgU3RyaW5nUmVzb3VyY2VJdGVyYXRvciBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yID0gKFN0cmluZ1Jlc291cmNlSXRlcmF0b3IpIGNvbGxlY3Rpb25UZXN0LmNyZWF0ZWRJdGVyYXRvcnMuZ2V0KDApOworICAgICAgICBTdHJpbmdSZXNvdXJjZUl0ZXJhdG9yIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IgPSBjb2xsZWN0aW9uVGVzdC5jcmVhdGVkSXRlcmF0b3JzLmdldCgwKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIHJlc291cmNlIHdhcyBsb2FkZWQgd2l0aG91dCBpdGVyYXRpbmciLCAxLAotICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKIAotICAgICAgICBTdHJpbmdSZXNvdXJjZSByID0gKFN0cmluZ1Jlc291cmNlKSBpdDEubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInIxIiwgci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0U3RyaW5nVmFsdWUoInIxIiwgaXQxLm5leHQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiSXRlcmF0aW5nIG9uY2UgbG9hZCBtb3JlIHRoYW4gMSByZXNvdXJjZSIsIDIsCi0gICAgICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOworICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOwogCi0gICAgICAgIHIgPSAoU3RyaW5nUmVzb3VyY2UpIGl0Mi5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicjEiLCByLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBzZWNvbmQgaXRlcmF0b3IgZGlkIG5vdCBsb29rdXAgaW4gdGhlIGNhY2hlIGZvciBhIHJlc291cmNlIiwKLSAgICAgICAgICAgICAgICAyLCBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yLmN1cnNvcik7CisgICAgICAgIGFzc2VydFN0cmluZ1ZhbHVlKCJyMSIsIGl0Mi5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiVGhlIHNlY29uZCBpdGVyYXRvciBkaWQgbm90IGxvb2t1cCBpbiB0aGUgY2FjaGUgZm9yIGEgcmVzb3VyY2UiLCAyLAorICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOwogCi0gICAgICAgIHIgPSAoU3RyaW5nUmVzb3VyY2UpIGl0Mi5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicjIiLCByLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRTdHJpbmdWYWx1ZSgicjIiLCBpdDIubmV4dCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJdGVyYXRpbmcgdHdpY2UgbG9hZCBtb3JlIHRoYW4gMiByZXNvdXJjZXMiLCAzLAotICAgICAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKKyAgICAgICAgICAgIHN0cmluZ1Jlc291cmNlSXRlcmF0b3IuY3Vyc29yKTsKIAotICAgICAgICByID0gKFN0cmluZ1Jlc291cmNlKSBpdDEubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoInIyIiwgci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgZmlyc3QgaXRlcmF0b3IgZGlkIG5vdCBsb29rdXAgaW4gdGhlIGNhY2hlIGZvciBhIHJlc291cmNlIiwKLSAgICAgICAgICAgICAgICAzLCBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yLmN1cnNvcik7CisgICAgICAgIGFzc2VydFN0cmluZ1ZhbHVlKCJyMiIsIGl0MS5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiVGhlIGZpcnN0IGl0ZXJhdG9yIGRpZCBub3QgbG9va3VwIGluIHRoZSBjYWNoZSBmb3IgYSByZXNvdXJjZSIsIDMsCisgICAgICAgICAgICBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yLmN1cnNvcik7CiAKLSAgICAgICAgciA9IChTdHJpbmdSZXNvdXJjZSkgaXQyLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyMyIsIHIuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydFN0cmluZ1ZhbHVlKCJyMyIsIGl0Mi5uZXh0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIkl0ZXJhdGluZyAzIHRpbWVzIGxvYWQgbW9yZSB0aGFuIDMgcmVzb3VyY2VzIiwgMywKLSAgICAgICAgICAgICAgICBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yLmN1cnNvcik7CisgICAgICAgICAgICBzdHJpbmdSZXNvdXJjZUl0ZXJhdG9yLmN1cnNvcik7CiAKLSAgICAgICAgciA9IChTdHJpbmdSZXNvdXJjZSkgaXQxLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJyMyIsIHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVGhlIGZpcnN0IGl0ZXJhdG9yIGRpZCBub3QgbG9va3VwIGluIHRoZSBjYWNoZSBmb3IgYSByZXNvdXJjZSIsCi0gICAgICAgICAgICAgICAgMywgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOworICAgICAgICBhc3NlcnRTdHJpbmdWYWx1ZSgicjMiLCBpdDEubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIlRoZSBmaXJzdCBpdGVyYXRvciBkaWQgbm90IGxvb2t1cCBpbiB0aGUgY2FjaGUgZm9yIGEgcmVzb3VyY2UiLCAzLAorICAgICAgICAgICAgc3RyaW5nUmVzb3VyY2VJdGVyYXRvci5jdXJzb3IpOworICAgIH0KIAorICAgIEBUZXN0KGV4cGVjdGVkID0gTm9TdWNoRWxlbWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZ0ZhaWxzT25jZVdyYXBwZWRDb2xsZWN0aW9uSXNFeGhhdXN0ZWQoKSB7CisgICAgICAgIFN0cmluZ1Jlc291cmNlQ29sbGVjdGlvbiBjb2xsZWN0aW9uVGVzdCA9IG5ldyBTdHJpbmdSZXNvdXJjZUNvbGxlY3Rpb24oKTsKKyAgICAgICAgTGF6eVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIgbGF6eUNvbGxlY3Rpb24gPSBuZXcgTGF6eVJlc291cmNlQ29sbGVjdGlvbldyYXBwZXIoKTsKKyAgICAgICAgbGF6eUNvbGxlY3Rpb24uYWRkKGNvbGxlY3Rpb25UZXN0KTsKKworICAgICAgICBJdGVyYXRvcjxSZXNvdXJjZT4gaXQxID0gbGF6eUNvbGxlY3Rpb24uaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8UmVzb3VyY2U+IGl0MiA9IGxhenlDb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisKKyAgICAgICAgaXQxLm5leHQoKTsKKyAgICAgICAgaXQyLm5leHQoKTsKKyAgICAgICAgaXQyLm5leHQoKTsKKyAgICAgICAgaXQxLm5leHQoKTsKKyAgICAgICAgaXQyLm5leHQoKTsKKyAgICAgICAgaXQxLm5leHQoKTsKKworICAgICAgICAvLyBuZXh0KCkgbXVzdCB0aHJvdyB0aGUgZXhwZWN0ZWQgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKyAgICAgICAgLy8gaWYgdGhhdCBkb2VzIG5vdCBoYXBwZW4sIGFzc2VydGlvbnMgdGhyb3cgdGhlIHVuZXhwZWN0ZWQgQXNzZXJ0aW9uIGVycm9yCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBpdDEubmV4dCgpOwotICAgICAgICAgICAgZmFpbCgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpOwotICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIG9rCi0gICAgICAgIH0KLQotICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpdDEuaGFzTmV4dCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIGl0Mi5uZXh0KCk7Ci0gICAgICAgICAgICBmYWlsKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkIik7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgICAgIGFzc2VydFRydWUoaXQyLmhhc05leHQoKSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U3RyaW5nVmFsdWUoU3RyaW5nIGV4cGVjdGVkLCBSZXNvdXJjZSByKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgci5hcyhTdHJpbmdSZXNvdXJjZS5jbGFzcykuZ2V0VmFsdWUoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NdWx0aVJvb3RGaWxlU2V0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9NdWx0aVJvb3RGaWxlU2V0VGVzdC5qYXZhCmluZGV4IDI2NzY2MzIuLjg0MWQwZDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvTXVsdGlSb290RmlsZVNldFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL011bHRpUm9vdEZpbGVTZXRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSwxNyArMjUsMjQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5BYnN0cmFjdEZpbGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuQWJzdHJhY3RGaWxlU2V0VGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbmRzV2l0aDsKIAogLyoqCiAgKiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgdGVzdCBtdWNoLCBtYWlubHkgcmVmZXJlbmNlIGhhbmRsaW5nLgogICovCiBwdWJsaWMgY2xhc3MgTXVsdGlSb290RmlsZVNldFRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZpbGVTZXRUZXN0IHsKIAorICAgIHByaXZhdGUgTXVsdGlSb290RmlsZVNldCBtdWx0aVJvb3RGaWxlU2V0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBtdWx0aVJvb3RGaWxlU2V0ID0gbmV3IE11bHRpUm9vdEZpbGVTZXQoKTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RGaWxlU2V0IGdldEluc3RhbmNlKCkgewogICAgICAgICByZXR1cm4gbmV3IE11bHRpUm9vdEZpbGVTZXQoKSB7CiAgICAgICAgICAgICAvLyBvdmVycmlkaW5nIHNvIHNldC9nZXREaXIgd29ya3MgYXMgZXhwZWN0ZWQgYnkgdGhlIGJhc2UgdGVzdCBjbGFzcwpAQCAtNTgsNzMgKzY1LDU4IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50SWZJc1JlZmVyZW5jZUFkZGl0aW9uYWxBdHRyaWJ1dGVzKCkgewotICAgICAgICBNdWx0aVJvb3RGaWxlU2V0IGYgPSBuZXcgTXVsdGlSb290RmlsZVNldCgpOwotICAgICAgICBmLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLSAgICAgICAgZi5zZXRCYXNlRGlycygiYSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gbXVsdGlyb290ZmlsZXNldCAiCi0gICAgICAgICAgICAgICAgICsgIiB3aXRoIGVsZW1lbnRzIGZyb20gc2V0QmFzZWRpcnMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGYgPSBuZXcgTXVsdGlSb290RmlsZVNldCgpOwotICAgICAgICBmLmFkZENvbmZpZ3VyZWRCYXNlRGlyKG5ldyBGaWxlUmVzb3VyY2UobmV3IEZpbGUoIi4iKSkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gbXVsdGlyb290ZmlsZXNldCIKLSAgICAgICAgICAgICAgICAgKyAiIHdpdGggZWxlbWVudHMgZnJvbSBhZGRDb25maWd1cmVkQmFzZURpciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmID0gbmV3IE11bHRpUm9vdEZpbGVTZXQoKTsKLSAgICAgICAgZi5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgZi5zZXRCYXNlRGlycygiYSIpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBiYXNlZGlycyBpbiBtdWx0aXJvb3RmaWxlc2V0IgotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldENhY2hlKHRydWUpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBjYWNoZSBpbiBtdWx0aXJvb3RmaWxlc2V0IgotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgIndoZW4gdXNpbmcgcmVmaWQiLCBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmLnNldFR5cGUoTXVsdGlSb290RmlsZVNldC5TZXRUeXBlLmZpbGUpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCB0eXBlIGluIG11bHRpcm9vdGZpbGVzZXQiCi0gICAgICAgICAgICAgICAgICsgIiB0aGF0IGlzIGEgcmVmZXJlbmNlLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAid2hlbiB1c2luZyByZWZpZCIsIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGYuYWRkQ29uZmlndXJlZEJhc2VEaXIobmV3IEZpbGVSZXNvdXJjZShuZXcgRmlsZSgiLiIpKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIG5lc3RlZCBiYXNlZGlyIGluIG11bHRpcm9vdGZpbGVzZXQgIgotICAgICAgICAgICAgICAgICArICIgdGhhdCBpcyBhIHJlZmVyZW5jZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICsgInJlZmlkIiwgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RTZXRCYXNlRGlyc1RoZW5SZWZpZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuc2V0UHJvamVjdChnZXRQcm9qZWN0KCkpOworICAgICAgICBtdWx0aVJvb3RGaWxlU2V0LnNldEJhc2VEaXJzKCJhIik7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXJDYW5ub3RCZVNldCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBNdWx0aVJvb3RGaWxlU2V0KCkuc2V0RGlyKG5ldyBGaWxlKCIuIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIHNldCBkaXIgaW4gYSBtdWx0aXJvb3RmaWxlc2V0Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgLmVuZHNXaXRoKCIgZG9lc24ndCBzdXBwb3J0IHRoZSBkaXIgYXR0cmlidXRlIikpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFNldENvbmZpZ3VyZWRCYXNlRGlyVGhlblJlZmlkKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgbXVsdGlSb290RmlsZVNldC5hZGRDb25maWd1cmVkQmFzZURpcihuZXcgRmlsZVJlc291cmNlKG5ldyBGaWxlKCIuIikpKTsKKyAgICAgICAgbXVsdGlSb290RmlsZVNldC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbm5vdFNldFJlZmlkVGhlbkJhc2VEaXJzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgbXVsdGlSb290RmlsZVNldC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBtdWx0aVJvb3RGaWxlU2V0LnNldEJhc2VEaXJzKCJhIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U2V0UmVmaWRUaGVuQ2FjaGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBtdWx0aVJvb3RGaWxlU2V0LnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuc2V0Q2FjaGUodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U2V0UmVmaWRUaGVuVHlwZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShnZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgbXVsdGlSb290RmlsZVNldC5zZXRUeXBlKE11bHRpUm9vdEZpbGVTZXQuU2V0VHlwZS5maWxlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3RTZXRSZWZpZFRoZW5Db25maWd1cmVkQmFzZURpcigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBtdWx0aVJvb3RGaWxlU2V0LnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuYWRkQ29uZmlndXJlZEJhc2VEaXIobmV3IEZpbGVSZXNvdXJjZShuZXcgRmlsZSgiLiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2Fubm90U2V0RGlyKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoZW5kc1dpdGgoIiBkb2Vzbid0IHN1cHBvcnQgdGhlIGRpciBhdHRyaWJ1dGUiKSk7CisgICAgICAgIG11bHRpUm9vdEZpbGVTZXQuc2V0RGlyKG5ldyBGaWxlKCIuIikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvUmVzb3VyY2VMaXN0VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZUxpc3RUZXN0LmphdmEKaW5kZXggZjAyMDE3OC4uNGI4ODQzMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZUxpc3RUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9SZXNvdXJjZUxpc3RUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNSwxMTAgKzI1LDkzIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIFJlc291cmNlTGlzdFRlc3QgewogCiAgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFJ1bGUKICAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBidWlsZFJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOwogCisgICAgcHJpdmF0ZSBSZXNvdXJjZUxpc3Qgcmw7CisKICAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy9yZXNvdXJjZWxpc3QueG1sIik7CisgICAgICAgIHJsID0gbmV3IFJlc291cmNlTGlzdCgpOwogICAgIH0KIAogICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZWFyRG93biIpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudFdpdGhSZWZlcmVuY2UoKSB7Ci0gICAgICAgIFJlc291cmNlTGlzdCBybCA9IG5ldyBSZXNvdXJjZUxpc3QoKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50U2V0RW5jb2RpbmdUaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgd2hlbiB1c2luZyByZWZpZCIpOwogICAgICAgICBybC5zZXRFbmNvZGluZygiZm9vIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIFJlc291cmNlTGlzdCB3aXRoIGVuY29kaW5nIGF0dHJpYnV0ZSBzZXQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBybCA9IG5ldyBSZXNvdXJjZUxpc3QoKTsKICAgICAgICAgcmwuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBybC5zZXRFbmNvZGluZygiZm9vIik7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gc2V0IGVuY29kaW5nIGluIFJlc291cmNlTGlzdCB0aGF0IGlzIGEgcmVmZXJlbmNlIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBybCA9IG5ldyBSZXNvdXJjZUxpc3QoKTsKLSAgICAgICAgcmwuYWRkKG5ldyBGaWxlUmVzb3VyY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgIi4iKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBhZGQgcmVmZXJlbmNlIHRvIFJlc291cmNlTGlzdCB3aXRoIG5lc3RlZCByZXNvdXJjZSBjb2xsZWN0aW9uLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJsID0gbmV3IFJlc291cmNlTGlzdCgpOwotICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJsLmFkZChuZXcgRmlsZVJlc291cmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICIuIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gUmVzb3VyY2VMaXN0IHdpdGggbmVzdGVkIHJlc291cmNlIGNvbGxlY3Rpb24uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIllvdSBtdXN0IG5vdCBzcGVjaWZ5IG5lc3RlZCBlbGVtZW50cyB3aGVuIHVzaW5nIHJlZmlkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmwgPSBuZXcgUmVzb3VyY2VMaXN0KCk7Ci0gICAgICAgIHJsLmFkZEZpbHRlckNoYWluKG5ldyBGaWx0ZXJDaGFpbigpKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJsLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15cmVmIikpOwotICAgICAgICAgICAgZmFpbCgiQ2FuIGFkZCByZWZlcmVuY2UgdG8gUmVzb3VyY2VMaXN0IHdpdGggbmVzdGVkIGZpbHRlciBjaGFpbi4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBybCA9IG5ldyBSZXNvdXJjZUxpc3QoKTsKLSAgICAgICAgcmwuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZHVtbXlyZWYiKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBybC5hZGRGaWx0ZXJDaGFpbihuZXcgRmlsdGVyQ2hhaW4oKSk7Ci0gICAgICAgICAgICBmYWlsKCJDYW4gYWRkIHJlZmVyZW5jZSB0byBSZXNvdXJjZUxpc3Qgd2l0aCBuZXN0ZWQgZmlsdGVyIGNoYWluLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFJlc291cmNlTGlzdCBybDEgPSBuZXcgUmVzb3VyY2VMaXN0KCk7Ci0gICAgICAgIHJsMS5zZXRQcm9qZWN0KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICBybDEuc2V0UmVmaWQobmV3IFJlZmVyZW5jZShidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLCAiZm9vIikpOworICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRTZXRSZWZpZFRoZW5FbmNvZGluZygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIGF0dHJpYnV0ZSB3aGVuIHVzaW5nIHJlZmlkIik7CisgICAgICAgIHJsLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgICAgICBybC5zZXRFbmNvZGluZygiZm9vIik7CisgICAgfQogCi0gICAgICAgIFJlc291cmNlTGlzdCBybDIgPSBuZXcgUmVzb3VyY2VMaXN0KCk7Ci0gICAgICAgIHJsMi5zZXRQcm9qZWN0KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOwotICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmFkZFJlZmVyZW5jZSgiZm9vIiwgcmwyKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRBZGRGaWxlUmVzb3VyY2VUaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgcmwuYWRkKG5ldyBGaWxlUmVzb3VyY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgIi4iKSk7CisgICAgICAgIHJsLnNldFJlZmlkKG5ldyBSZWZlcmVuY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgImR1bW15cmVmIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RWxlbWVudEFkZFJlZmlkVGhlbkZpbGVSZXNvdXJjZSgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgcmwuYWRkKG5ldyBGaWxlUmVzb3VyY2UoYnVpbGRSdWxlLmdldFByb2plY3QoKSwgIi4iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlFbGVtZW50QWRkRmlsdGVyQ2hhaW5UaGVuUmVmaWQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiWW91IG11c3Qgbm90IHNwZWNpZnkgbmVzdGVkIGVsZW1lbnRzIHdoZW4gdXNpbmcgcmVmaWQiKTsKKyAgICAgICAgcmwuYWRkRmlsdGVyQ2hhaW4obmV3IEZpbHRlckNoYWluKCkpOworICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVsZW1lbnRBZGRSZWZpZFRoZW5GaWx0ZXJDaGFpbigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBub3Qgc3BlY2lmeSBuZXN0ZWQgZWxlbWVudHMgd2hlbiB1c2luZyByZWZpZCIpOworICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJkdW1teXJlZiIpKTsKKyAgICAgICAgcmwuYWRkRmlsdGVyQ2hhaW4obmV3IEZpbHRlckNoYWluKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENpcmN1bGFyUmVmZXJlbmNlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIpOworICAgICAgICBybC5zZXRQcm9qZWN0KGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkpOworICAgICAgICBybC5zZXRSZWZpZChuZXcgUmVmZXJlbmNlKGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCksICJmb28iKSk7CisKKyAgICAgICAgUmVzb3VyY2VMaXN0IHJlc291cmNlTGlzdCA9IG5ldyBSZXNvdXJjZUxpc3QoKTsKKyAgICAgICAgcmVzb3VyY2VMaXN0LnNldFByb2plY3QoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CisgICAgICAgIGJ1aWxkUnVsZS5nZXRQcm9qZWN0KCkuYWRkUmVmZXJlbmNlKCJmb28iLCByZXNvdXJjZUxpc3QpOwogCiAgICAgICAgIFVuaW9uIHUgPSBuZXcgVW5pb24oKTsKLSAgICAgICAgdS5hZGQocmwxKTsKKyAgICAgICAgdS5hZGQocmwpOwogICAgICAgICB1LnNldFByb2plY3QoYnVpbGRSdWxlLmdldFByb2plY3QoKSk7CiAKLSAgICAgICAgcmwyLmFkZCh1KTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmwyLnNpemUoKTsKLSAgICAgICAgICAgIGZhaWwoIkNhbiBtYWtlIFJlc291cmNlTGlzdCBhIFJlZmVyZW5jZSB0byBpdHNlbGYuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoaXMgZGF0YSB0eXBlIGNvbnRhaW5zIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICByZXNvdXJjZUxpc3QuYWRkKHUpOworICAgICAgICByZXNvdXJjZUxpc3Quc2l6ZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2VUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvcmVzb3VyY2VzL1RhclJlc291cmNlVGVzdC5qYXZhCmluZGV4IGY4NDhmN2QuLjMxYTdkNTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9yZXNvdXJjZXMvVGFyUmVzb3VyY2VUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3Jlc291cmNlcy9UYXJSZXNvdXJjZVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTM2LDEzICszNiwxMyBAQAogICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIGJ1aWxkUnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CiAKICAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmNvbmZpZ3VyZVByb2plY3QoInNyYy9ldGMvdGVzdGNhc2VzL3R5cGVzL3Jlc291cmNlcy90YXJlbnRyeS54bWwiKTsKICAgICB9CiAKIAogICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CiAgICAgICAgIGJ1aWxkUnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZWFyRG93biIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3JSdWxlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclJ1bGUuamF2YQppbmRleCA3MzVhNGRkLi40MDI4YzUzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclJ1bGUuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0Jhc2VTZWxlY3RvclJ1bGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQmFzZVNlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3JUZXN0LmphdmEKaW5kZXggODEzMzMwOC4uNzk1ZGViOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3JUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9CYXNlU2VsZWN0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zUmVnZXhwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1JlZ2V4cFRlc3QuamF2YQppbmRleCA0OTI4ZTc2Li4xYjVlOTY3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zUmVnZXhwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNSZWdleHBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00MSwxNSArNDEsMTAgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1JlZ2V4cCgpIHsKICAgICAgICAgYnVpbGRSdWxlLmV4ZWN1dGVUYXJnZXQoImNvbnRhaW5zcmVnZXhwIik7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoYnVpbGRSdWxlLmdldE91dHB1dERpcigpLCAicmVnZXhwc2VsdGVzdGRlc3QiKTsKLSAgICAgICAgRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotICAgICAgICBpbnQgZmlsZWNvdW50ID0gZmlsZXMubGVuZ3RoOworICAgICAgICBGaWxlW10gZmlsZXMgPSBuZXcgRmlsZShidWlsZFJ1bGUuZ2V0T3V0cHV0RGlyKCksICJyZWdleHBzZWx0ZXN0ZGVzdCIpLmxpc3RGaWxlcygpOwogCi0gICAgICAgIGlmIChmaWxlY291bnQgIT0gMSkgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ29udGFpbnNSZWdleHAgdGVzdCBzaG91bGQgaGF2ZSBjb3BpZWQgMSBmaWxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAxLCBmaWxlcy5sZW5ndGgpOwotCi0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb250YWluc1JlZ2V4cCB0ZXN0IHNob3VsZCBoYXZlIGNvcGllZCAxIGZpbGUiLAorICAgICAgICAgICAgICAgIDEsIGZpbGVzLmxlbmd0aCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zU2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0NvbnRhaW5zU2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMWIxOWMwNS4uZmM0ZWNhMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Db250YWluc1NlbGVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvQ29udGFpbnNTZWxlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEzICsxOCwxNCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAvKioKICAqIFRlc3RzIENvbnRhaW5zIFNlbGVjdG9ycy4KQEAgLTM1LDc2ICszNiw4MSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJhc2VTZWxlY3RvclJ1bGUgc2VsZWN0b3JSdWxlID0gbmV3IEJhc2VTZWxlY3RvclJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIHByaXZhdGUgQ29udGFpbnNTZWxlY3RvciBzOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzID0gbmV3IENvbnRhaW5zU2VsZWN0b3IoKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0IHRoZSBjb2RlIHRoYXQgdmFsaWRhdGVzIHRoZSBzZWxlY3Rvci4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKLSAgICAgICAgQ29udGFpbnNTZWxlY3RvciBzID0gbmV3IENvbnRhaW5zU2VsZWN0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSxzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiQ29udGFpbnNTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZCAndGV4dCciKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUxKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSB0ZXh0IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGJlMS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTWlzc2luZ1BhcmFtZXRlcigpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGUgdGV4dCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KIAotICAgICAgICBzID0gbmV3IENvbnRhaW5zU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUludmFsaWRQYXJhbWV0ZXIoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoImdhcmJhZ2UgaW4iKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IHtwYXJhbX07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJDb250YWluc1NlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlciBlbGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHBhcmFtZXRlciBnYXJiYWdlIGluIiwgYmUyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlbGVjdG9yIGlzIHNlbGVjdGluZyBmaWxlcyBjb3JyZWN0bHkuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgewotICAgICAgICBDb250YWluc1NlbGVjdG9yIHM7Ci0gICAgICAgIFN0cmluZyByZXN1bHRzOwotCi0gICAgICAgIHMgPSBuZXcgQ29udGFpbnNTZWxlY3RvcigpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJOb1N1Y2goKSB7CiAgICAgICAgIHMuc2V0VGV4dCgibm8gc3VjaCBzdHJpbmcgaW4gdGVzdCBmaWxlcyIpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBDb250YWluc1NlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQ2FzZSgpIHsKICAgICAgICAgcy5zZXRUZXh0KCJBcGFjaGUgQW50Iik7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IENvbnRhaW5zU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJDYXNlU2Vuc2l0aXZlKCkgewogICAgICAgICBzLnNldFRleHQoImFwYWNoZSBhbnQiKTsKICAgICAgICAgcy5zZXRDYXNlc2Vuc2l0aXZlKHRydWUpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBDb250YWluc1NlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQ2FzZUluc2Vuc2l0aXZlKCkgewogICAgICAgICBzLnNldFRleHQoImFwYWNoZSBhbnQiKTsKICAgICAgICAgcy5zZXRDYXNlc2Vuc2l0aXZlKGZhbHNlKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEZGRlRGRkZGRkZUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVEZGRlRGRkZGRkZUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgQ29udGFpbnNTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91ck5vV2hpdGVzcGFjZSgpIHsKICAgICAgICAgcy5zZXRUZXh0KCJBcGFjaGVBbnQiKTsKICAgICAgICAgcy5zZXRJZ25vcmV3aGl0ZXNwYWNlKHRydWUpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGVEZGRkZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGVEZGRkZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBDb250YWluc1NlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VySWdub3JlV2hpdGVzcGFjZSgpIHsKICAgICAgICAgcy5zZXRUZXh0KCJBIHAgYSBjIGggZSAgICBBIG4gdCIpOwogICAgICAgICBzLnNldElnbm9yZXdoaXRlc3BhY2UodHJ1ZSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EYXRlU2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3RvclRlc3QuamF2YQppbmRleCBlYzNlYTg5Li42OGUwZWRlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3RvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RhdGVTZWxlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDEzICsyMCwxMyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIC8qKgogICogVGVzdHMgRGF0ZSBTZWxlY3RvcnMuCkBAIC0zNywxNjAgKzM3LDE2MCBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJhc2VTZWxlY3RvclJ1bGUgc2VsZWN0b3JSdWxlID0gbmV3IEJhc2VTZWxlY3RvclJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIHByaXZhdGUgRGF0ZVNlbGVjdG9yIHM7CisKKyAgICBwcml2YXRlIERhdGVTZWxlY3Rvci5UaW1lQ29tcGFyaXNvbnMgYmVmb3JlOworCisgICAgcHJpdmF0ZSBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zIGVxdWFsOworCisgICAgcHJpdmF0ZSBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zIGFmdGVyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzID0gbmV3IERhdGVTZWxlY3RvcigpOworCisgICAgICAgIGJlZm9yZSA9IG5ldyBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zKCk7CisgICAgICAgIGJlZm9yZS5zZXRWYWx1ZSgiYmVmb3JlIik7CisKKyAgICAgICAgZXF1YWwgPSBuZXcgRGF0ZVNlbGVjdG9yLlRpbWVDb21wYXJpc29ucygpOworICAgICAgICBlcXVhbC5zZXRWYWx1ZSgiZXF1YWwiKTsKKworICAgICAgICBhZnRlciA9IG5ldyBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zKCk7CisgICAgICAgIGFmdGVyLnNldFZhbHVlKCJhZnRlciIpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yLgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgewotICAgICAgICBEYXRlU2VsZWN0b3IgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJZb3UgbXVzdCBwcm92aWRlIGEgZGF0ZXRpbWUgb3IgdGhlIG51bWJlciBvZiAiCi0gICAgICAgICAgICAgICAgICAgICsgIm1pbGxpc2Vjb25kcy4iLCBiZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUZpZWxkcygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBwcm92aWRlIGEgZGF0ZXRpbWUgb3IgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuIik7CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVJhbmdlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkRhdGUgb2YgMDEvMDEvMTk2OSAwMTowMSBBTSByZXN1bHRzIGluIG5lZ2F0aXZlIG1pbGxpc2Vjb25kcyB2YWx1ZSIKKyAgICAgICAgICAgICAgICArICIgcmVsYXRpdmUgdG8gZXBvY2ggKEphbnVhcnkgMSwgMTk3MCwgMDA6MDA6MDAgR01UKS4iKTsKICAgICAgICAgcy5zZXREYXRldGltZSgiMDEvMDEvMTk2OSAwMTowMSBBTSIpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLAotICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKLSAgICAgICAgICAgIGZhaWwoIkRhdGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciBEYXRldGltZSBiZWluZyBpbiB0aGUgIgotICAgICAgICAgICAgICAgICAgICArICJhbGxvd2FibGUgcmFuZ2UiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUyKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRhdGUgb2YgMDEvMDEvMTk2OSAwMTowMSBBTSByZXN1bHRzIGluIG5lZ2F0aXZlICIKLSAgICAgICAgICAgICAgICAgICAgKyAibWlsbGlzZWNvbmRzIHZhbHVlIHJlbGF0aXZlIHRvIGVwb2NoIChKYW51YXJ5IDEsICIKLSAgICAgICAgICAgICAgICAgICAgKyAiMTk3MCwgMDA6MDA6MDAgR01UKS4iLCBiZTIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVGb3JtYXQoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiRGF0ZSBvZiB0aGlzIGlzIG5vdCBhIGRhdGUgQ2Fubm90IGJlIHBhcnNlZCBjb3JyZWN0bHkuIgorICAgICAgICAgICAgICAgICsgIiBJdCBzaG91bGQgYmUgaW4gJ01NL2RkL3l5eXkgaGg6bW0gYScgZm9ybWF0LiIpOwogICAgICAgICBzLnNldERhdGV0aW1lKCJ0aGlzIGlzIG5vdCBhIGRhdGUiKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgRGF0ZXRpbWUgYmVpbmcgaW4gYSAiCi0gICAgICAgICAgICAgICAgICAgICsgInZhbGlkIGZvcm1hdCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTMpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiRGF0ZSBvZiB0aGlzIGlzIG5vdCBhIGRhdGUiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgQ2Fubm90IGJlIHBhcnNlZCBjb3JyZWN0bHkuIEl0IHNob3VsZCBiZSBpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiAnTU0vZGQveXl5eSBoaDptbSBhJyBmb3JtYXQuIiwgYmUzLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KIAotICAgICAgICBzID0gbmV3IERhdGVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUGFyYW1ldGVySW4oKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoImdhcmJhZ2UgaW4iKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMV07CiAgICAgICAgIHBhcmFtc1swXSA9IHBhcmFtOwogICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgdmFsaWQgcGFyYW1ldGVyIGVsZW1lbnQiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmU0KSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFyYW1ldGVyIGdhcmJhZ2UgaW4iLCBiZTQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUGFyYW1ldGVyTWlsbGlzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkludmFsaWQgbWlsbGlzZWNvbmQgc2V0dGluZyBnYXJiYWdlIG91dCIpOworICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoIm1pbGxpcyIpOwogICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gbmV3IFBhcmFtZXRlclsxXTsKICAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLAotICAgICAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKLSAgICAgICAgICAgIGZhaWwoIkRhdGVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBtaWxsaXMgcGFyYW1ldGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIG1pbGxpc2Vjb25kIHNldHRpbmcgZ2FyYmFnZSBvdXQiLAotICAgICAgICAgICAgICAgICAgICBiZTUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUGFyYW1ldGVyR3JhbnVsYXJpdHkoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBncmFudWxhcml0eSBzZXR0aW5nIGdhcmJhZ2Ugb3V0Iik7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0uc2V0TmFtZSgiZ3JhbnVsYXJpdHkiKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMV07CiAgICAgICAgIHBhcmFtc1swXSA9IHBhcmFtOwogICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEYXRlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgdmFsaWQgZ3JhbnVsYXJpdHkgcGFyYW1ldGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIGdyYW51bGFyaXR5IHNldHRpbmcgZ2FyYmFnZSBvdXQiLAotICAgICAgICAgICAgICAgICAgICBiZTYuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUZXN0cyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VsZWN0b3IgaXMgc2VsZWN0aW5nIGZpbGVzIGNvcnJlY3RseS4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7Ci0gICAgICAgIERhdGVTZWxlY3RvciBzOwotICAgICAgICBTdHJpbmcgcmVzdWx0czsKLQotICAgICAgICBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zIGJlZm9yZSA9IG5ldwotICAgICAgICAgICAgICAgIERhdGVTZWxlY3Rvci5UaW1lQ29tcGFyaXNvbnMoKTsKLSAgICAgICAgYmVmb3JlLnNldFZhbHVlKCJiZWZvcmUiKTsKLSAgICAgICAgRGF0ZVNlbGVjdG9yLlRpbWVDb21wYXJpc29ucyBlcXVhbCA9IG5ldwotICAgICAgICAgICAgICAgIERhdGVTZWxlY3Rvci5UaW1lQ29tcGFyaXNvbnMoKTsKLSAgICAgICAgZXF1YWwuc2V0VmFsdWUoImVxdWFsIik7Ci0gICAgICAgIERhdGVTZWxlY3Rvci5UaW1lQ29tcGFyaXNvbnMgYWZ0ZXIgPSBuZXcKLSAgICAgICAgICAgICAgICBEYXRlU2VsZWN0b3IuVGltZUNvbXBhcmlzb25zKCk7Ci0gICAgICAgIGFmdGVyLnNldFZhbHVlKCJhZnRlciIpOwotCi0KLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQmVmb3JlKCkgewogICAgICAgICBzLnNldERhdGV0aW1lKCIxMC8xMC8xOTk5IDE6NDUgUE0iKTsKICAgICAgICAgcy5zZXRXaGVuKGJlZm9yZSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IERhdGVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91ckJlZm9yZUNoZWNrZGlycygpIHsKICAgICAgICAgcy5zZXREYXRldGltZSgiMTAvMTAvMTk5OSAxOjQ1IFBNIik7CiAgICAgICAgIHMuc2V0V2hlbihiZWZvcmUpOwogICAgICAgICBzLnNldENoZWNrZGlycyh0cnVlKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQWZ0ZXIoKSB7CiAgICAgICAgIHMuc2V0RGF0ZXRpbWUoIjEwLzEwLzE5OTkgMTo0NSBQTSIpOwogICAgICAgICBzLnNldFdoZW4oYWZ0ZXIpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJCZWZvcmUySygpIHsKICAgICAgICAgcy5zZXREYXRldGltZSgiMTEvMjEvMjAwMSA0OjU0IEFNIik7CiAgICAgICAgIHMuc2V0V2hlbihiZWZvcmUpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRkZGRkZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRkZGRkZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJFcXVhbCgpIHsKICAgICAgICAgcy5zZXREYXRldGltZSgiMTEvMjEvMjAwMSA0OjU1IEFNIik7Ci0KLSAgICAgICAgbG9uZyBtaWxsaXNlY29uZHMgPSBzLmdldE1pbGxpcygpOwogICAgICAgICBzLnNldFdoZW4oZXF1YWwpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZGVEZGRlRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZGVEZGRlRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcy5zZXRNaWxsaXMobWlsbGlzZWNvbmRzKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJFcXVhbE1pbGxpcygpIHsKKyAgICAgICAgcy5zZXREYXRldGltZSgiMTEvMjEvMjAwMSA0OjU1IEFNIik7CisgICAgICAgIHMuc2V0TWlsbGlzKHMuZ2V0TWlsbGlzKCkpOwogICAgICAgICBzLnNldFdoZW4oZXF1YWwpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZGVEZGRlRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZGVEZGRlRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJBZnRlcjJLKCkgewogICAgICAgICBzLnNldERhdGV0aW1lKCIxMS8yMS8yMDAxIDQ6NTYgQU0iKTsKICAgICAgICAgcy5zZXRXaGVuKGFmdGVyKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEZGVEZUVFRGRkZUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVEZGVEZUVFRGRkZUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQWZ0ZXJOYW1lZCgpIHsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMiA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0xLnNldE5hbWUoImRhdGV0aW1lIik7CkBAIC0xOTksMzkgKzE5OSwzOCBAQAogICAgICAgICBwYXJhbTIuc2V0VmFsdWUoImFmdGVyIik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IHtwYXJhbTEsIHBhcmFtMn07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZURlRUVEZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZURlRUVEZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEYXRlU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJBZnRlcldpdGhHcmFudWxhcml0eSgpIHsKICAgICAgICAgbG9uZyB0ZXN0dGltZSA9IHNlbGVjdG9yUnVsZS5nZXRNaXJyb3JGaWxlcygpWzVdLmxhc3RNb2RpZmllZCgpOwogICAgICAgICBzLnNldE1pbGxpcyh0ZXN0dGltZSk7CiAgICAgICAgIHMuc2V0V2hlbihhZnRlcik7CiAgICAgICAgIHMuc2V0R3JhbnVsYXJpdHkoMik7CiAKLSAgICAgICAgLy8gc2V0dXAgdGhlIG1vZGlmaWVkIHRpbWVzdGFtcCB0byBtYXRjaCB3aGF0IHRoZSB0ZXN0IG5lZWRzLCBhbHRob3VnaCBiZSBhd2FyZSB0aGF0IHRoZSAzcmQgYW5kIDR0aAotICAgICAgICAvLyBmaWxlcyBkb24ndCBleGlzdCBzbyBjYW4ndCBiZSBjaGFuZ2VkLCBzbyBkb24ndCB0cnkgYW5kIGxvb3Agb3ZlciB0aGVtCisgICAgICAgIC8vIHNldHVwIHRoZSBtb2RpZmllZCB0aW1lc3RhbXAgdG8gbWF0Y2ggd2hhdCB0aGUgdGVzdCBuZWVkcywgYWx0aG91Z2ggYmUgYXdhcmUgdGhhdAorICAgICAgICAvLyB0aGUgM3JkIGFuZCA0dGggZmlsZXMgZG9uJ3QgZXhpc3Qgc28gY2FuJ3QgYmUgY2hhbmdlZCwgc28gZG9uJ3QgdHJ5IGFuZCBsb29wIG92ZXIgdGhlbQogICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSAyOyBpKyspIHsKLSAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDYW5ub3Qgc2V0dXAgZmlsZSB0aW1lcyBmb3IgdGVzdCIsCisgICAgICAgICAgICBhc3N1bWVUcnVlKCJDYW5ub3Qgc2V0dXAgZmlsZSB0aW1lcyBmb3IgdGVzdCIsCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRNaXJyb3JGaWxlcygpW2ldLnNldExhc3RNb2RpZmllZCh0ZXN0dGltZSAtICgzICogNjAgKiA2MCAqIDEwMCkpKTsKICAgICAgICAgfQogCisgICAgICAgIGFzc2VydEVxdWFscygiVEZGRkZUVFRUVFRUIiwgc2VsZWN0b3JSdWxlLm1pcnJvclNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUubWlycm9yU2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGVFRUVFRUVCIsIHJlc3VsdHMpOwotCi0gICAgICAgIHMgPSBuZXcgRGF0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHRlc3R0aW1lID0gc2VsZWN0b3JSdWxlLmdldE1pcnJvckZpbGVzKClbNl0ubGFzdE1vZGlmaWVkKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyQmVmb3JlV2l0aEdyYW51bGFyaXR5KCkgeworICAgICAgICBsb25nIHRlc3R0aW1lID0gc2VsZWN0b3JSdWxlLmdldE1pcnJvckZpbGVzKClbNl0ubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIHMuc2V0TWlsbGlzKHRlc3R0aW1lKTsKICAgICAgICAgcy5zZXRXaGVuKGJlZm9yZSk7CiAgICAgICAgIHMuc2V0R3JhbnVsYXJpdHkoMik7CiAgICAgICAgIGZvciAoaW50IGkgPSA3OyBpIDw9IDEwOyBpKyspIHsKLSAgICAgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJDYW5ub3Qgc2V0dXAgZmlsZSB0aW1lcyBmb3IgdGVzdCIsCisgICAgICAgICAgICBhc3N1bWVUcnVlKCJDYW5ub3Qgc2V0dXAgZmlsZSB0aW1lcyBmb3IgdGVzdCIsCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRNaXJyb3JGaWxlcygpW2ldLnNldExhc3RNb2RpZmllZCh0ZXN0dGltZSArICgzICogNjAgKiA2MCAqIDEwMCkpKTsKICAgICAgICAgfQogCi0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUubWlycm9yU2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRGRkZGVCIsIHJlc3VsdHMpOwotCisgICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVEZGRkZUIiwgc2VsZWN0b3JSdWxlLm1pcnJvclNlbGVjdGlvblN0cmluZyhzKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcGVuZFNlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXBlbmRTZWxlY3RvclRlc3QuamF2YQppbmRleCBlYzk1ODc4Li5iZDcwNjlmIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcGVuZFNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwZW5kU2VsZWN0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNSArMTgsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuTWFwcGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiAKIC8qKgpAQCAtMzUsNDggKzM2LDQ0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEZXBlbmRTZWxlY3RvclRlc3QgewogCisgICAgcHJpdmF0ZSBEZXBlbmRTZWxlY3RvciBzOworCiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQmFzZVNlbGVjdG9yUnVsZSBzZWxlY3RvclJ1bGUgPSBuZXcgQmFzZVNlbGVjdG9yUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTaW5nbGVNYXBwZXIoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgcy5jcmVhdGVNYXBwZXIoKTsKLSAgICAgICAgICAgIGZhaWwoIkRlcGVuZFNlbGVjdG9yIGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBuZXN0ZWQgbWFwcGVyLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCi0gICAgICAgICAgICAgICAgICAgIGJlMS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIpOworICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOwogICAgIH0KIAogCiAgICAgQFRlc3QKICAgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUmVxdWlyZWRGaWVsZHMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiRGVwZW5kU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGFyZ2V0ZGlyIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4iLAotICAgICAgICAgICAgICAgICAgICBiZTIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhlIHRhcmdldGRpciBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQuIik7CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb01hcHBlcigpIHsKLSAgICAgICAgRGVwZW5kU2VsZWN0b3IgcyA9IG5ldyBEZXBlbmRTZWxlY3RvcigpOwogICAgICAgICBzLnNldFRhcmdldGRpcihzZWxlY3RvclJ1bGUuZ2V0QmVkZGlyKCkpOwotCi0gICAgICAgIFN0cmluZyByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eU1hcHBlcigpIHsKLSAgICAgICAgRGVwZW5kU2VsZWN0b3IgcyA9IG5ldyBEZXBlbmRTZWxlY3RvcigpOwogICAgICAgICBzLnNldFRhcmdldGRpcihzZWxlY3RvclJ1bGUuZ2V0QmVkZGlyKCkpOwogCiAgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIGlkZW50aXR5ID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CkBAIC04NSwxMyArODIsMTEgQEAKICAgICAgICAgTWFwcGVyIG0gPSBzLmNyZWF0ZU1hcHBlcigpOwogICAgICAgICBtLnNldFR5cGUoaWRlbnRpdHkpOwogCi0gICAgICAgIFN0cmluZyByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1hcHBlcigpIHsKLSAgICAgICAgRGVwZW5kU2VsZWN0b3IgcyA9IG5ldyBEZXBlbmRTZWxlY3RvcigpOwogICAgICAgICBzLnNldFRhcmdldGRpcihzZWxlY3RvclJ1bGUuZ2V0QmVkZGlyKCkpOwogCiAgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG1lcmdlID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CkBAIC0xMDEsMTMgKzk2LDExIEBACiAgICAgICAgIG0uc2V0VHlwZShtZXJnZSk7CiAgICAgICAgIG0uc2V0VG8oImFzZi1sb2dvLmdpZi5neiIpOwogCi0gICAgICAgIFN0cmluZyByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRlRUVEZGRiIsIHJlc3VsdHMuc3Vic3RyaW5nKDAsMTEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRlRUVEZGRiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykuc3Vic3RyaW5nKDAsIDExKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VNYXBwZXIyKCkgewotICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CiAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHNlbGVjdG9yUnVsZS5nZXRCZWRkaXIoKSk7CiAKICAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgbWVyZ2UgPSBuZXcgTWFwcGVyLk1hcHBlclR5cGUoKTsKQEAgLTExNiwxMyArMTA5LDEyIEBACiAgICAgICAgIE1hcHBlciBtID0gcy5jcmVhdGVNYXBwZXIoKTsKICAgICAgICAgbS5zZXRUeXBlKG1lcmdlKTsKICAgICAgICAgbS5zZXRUbygiYXNmLWxvZ28uZ2lmLmJ6MiIpOwotICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFRGVFRUVFRUVFRUIiwgcmVzdWx0cyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVEZUVFRUVFRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iTWFwcGVyUmVsYXRpdmVQYXRoKCkgewotICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CiAgICAgICAgIEZpbGUgc3ViZGlyID0gbmV3IEZpbGUoInNlbGVjdG9ydGVzdC90YXIvYnoyIik7CiAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHN1YmRpcik7CiAKQEAgLTEzNCwxMyArMTI2LDExIEBACiAgICAgICAgIG0uc2V0RnJvbSgiKi5iejIiKTsKICAgICAgICAgbS5zZXRUbygiKi50YXIuYnoyIik7CiAKLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZGVEZGRkZGRlRURiIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGVEZGRkZGRlRURiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlc3RyaWN0ZWRHbG9iTWFwcGVyKCkgewotICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CiAgICAgICAgIEZpbGUgc3ViZGlyID0gbmV3IEZpbGUoc2VsZWN0b3JSdWxlLmdldEJlZGRpcigpLCAidGFyL2J6MiIpOwogICAgICAgICBzLnNldFRhcmdldGRpcihzdWJkaXIpOwogCkBAIC0xNTEsMjIgKzE0MSwxOSBAQAogICAgICAgICBtLnNldFR5cGUoZ2xvYik7CiAgICAgICAgIG0uc2V0RnJvbSgiKi5iejIiKTsKICAgICAgICAgbS5zZXRUbygiKi50YXIuYnoyIik7Ci0gICAgICAgIFN0cmluZyByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZUVEYiLCByZXN1bHRzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRlRURiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbk5vTWFwcGVyKCkgewotICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CiAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKG5ldyBGaWxlKHNlbGVjdG9yUnVsZS5nZXRPdXRwdXREaXIoKSwgInNlbGVjdG9ydGVzdDIiKSk7Ci0gICAgICAgIFN0cmluZyByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZUVEZGRkZGRkYiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZUVEZGRkZGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKICAgICB9CiAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pcnJvcmVkU2VsZWN0aW9uKCkgewotICAgICAgICBEZXBlbmRTZWxlY3RvciBzID0gbmV3IERlcGVuZFNlbGVjdG9yKCk7CiAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKG5ldyBGaWxlKHNlbGVjdG9yUnVsZS5nZXRPdXRwdXREaXIoKSwgInNlbGVjdG9ydGVzdDIvdGFyL2J6MiIpKTsKIAogICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBnbG9iID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CkBAIC0xNzYsMTAgKzE2Myw5IEBACiAgICAgICAgIG0uc2V0VHlwZShnbG9iKTsKICAgICAgICAgbS5zZXRGcm9tKCIqLmJ6MiIpOwogICAgICAgICBtLnNldFRvKCIqLnRhci5iejIiKTsKLSAgICAgICAgU3RyaW5nIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUubWlycm9yU2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRlRURiIsIHJlc3VsdHMpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZUVEYiLCByZXN1bHRzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRlRURiIsIHNlbGVjdG9yUnVsZS5taXJyb3JTZWxlY3Rpb25TdHJpbmcocykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRkZGRkZGRlRURiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXB0aFNlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9EZXB0aFNlbGVjdG9yVGVzdC5qYXZhCmluZGV4IDNjN2U0MjkuLjEzNjdlODcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRGVwdGhTZWxlY3RvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0RlcHRoU2VsZWN0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxMyArMTgsMTQgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUZXN0cyBEZXB0aCBTZWxlY3RvcnMKQEAgLTM1LDExMSArMzYsMTEyIEBACiAgICAgQFJ1bGUKICAgICBwdWJsaWMgZmluYWwgQmFzZVNlbGVjdG9yUnVsZSBzZWxlY3RvclJ1bGUgPSBuZXcgQmFzZVNlbGVjdG9yUnVsZSgpOwogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgcHJpdmF0ZSBEZXB0aFNlbGVjdG9yIHM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHMgPSBuZXcgRGVwdGhTZWxlY3RvcigpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yLgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgewotICAgICAgICBEZXB0aFNlbGVjdG9yIHMgPSBuZXcgRGVwdGhTZWxlY3RvcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEZXB0aFNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcyIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiWW91IG11c3Qgc2V0IGF0IGxlYXN0IG9uZSBvZiB0aGUgbWluIG9yIHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgIm1heCBsZXZlbHMuIiwgYmUxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVSZXF1aXJlZEZpZWxkcygpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJZb3UgbXVzdCBzZXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBtaW4gb3IgdGhlIG1heCBsZXZlbHMuIik7CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEZXB0aFNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVEZXB0aCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGUgbWF4aW11bSBkZXB0aCBpcyBsb3dlciB0aGFuIHRoZSBtaW5pbXVtLiIpOwogICAgICAgICBzLnNldE1pbig1KTsKICAgICAgICAgcy5zZXRNYXgoMik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKLSAgICAgICAgICAgIGZhaWwoIkRlcHRoU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgbWF4aW11bSBiZWluZyBoaWdoZXIgIgotICAgICAgICAgICAgICAgICAgICArICJ0aGFuIG1pbmltdW0iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUyKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBtYXhpbXVtIGRlcHRoIGlzIGxvd2VyIHRoYW4gdGhlIG1pbmltdW0uIiwKLSAgICAgICAgICAgICAgICAgICAgYmUyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KIAotICAgICAgICBzID0gbmV3IERlcHRoU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVBhcmFtZXRlck5hbWUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoImdhcmJhZ2UgaW4iKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMV07CiAgICAgICAgIHBhcmFtc1swXSA9IHBhcmFtOwogICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSxzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiRGVwdGhTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciB2YWxpZCBwYXJhbWV0ZXIgZWxlbWVudCIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTMpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIsIGJlMy5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEZXB0aFNlbGVjdG9yKCk7Ci0gICAgICAgIHBhcmFtID0gbmV3IFBhcmFtZXRlcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTWluVmFsdWUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBtaW5pbXVtIHZhbHVlIGdhcmJhZ2Ugb3V0Iik7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0uc2V0TmFtZSgibWluIik7CiAgICAgICAgIHBhcmFtLnNldFZhbHVlKCJnYXJiYWdlIG91dCIpOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSBuZXcgUGFyYW1ldGVyWzFdOwogICAgICAgICBwYXJhbXNbMF0gPSBwYXJhbTsKICAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKLSAgICAgICAgICAgIGZhaWwoIkRlcHRoU2VsZWN0b3IgYWNjZXB0ZWQgYmFkIG1pbmltdW0gYXMgcGFyYW1ldGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIG1pbmltdW0gdmFsdWUgZ2FyYmFnZSBvdXQiLAotICAgICAgICAgICAgICAgICAgICBiZTQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGVwdGhTZWxlY3RvcigpOwotICAgICAgICBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU1heFZhbHVlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkludmFsaWQgbWF4aW11bSB2YWx1ZSBnYXJiYWdlIG91dCIpOworICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoIm1heCIpOwogICAgICAgICBwYXJhbS5zZXRWYWx1ZSgiZ2FyYmFnZSBvdXQiKTsKKyAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0gbmV3IFBhcmFtZXRlclsxXTsKICAgICAgICAgcGFyYW1zWzBdID0gcGFyYW07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJEZXB0aFNlbGVjdG9yIGFjY2VwdGVkIGJhZCBtYXhpbXVtIGFzIHBhcmFtZXRlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW52YWxpZCBtYXhpbXVtIHZhbHVlIGdhcmJhZ2Ugb3V0IiwKLSAgICAgICAgICAgICAgICAgICAgYmU1LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlbGVjdG9yIGlzIHNlbGVjdGluZyBmaWxlcyBjb3JyZWN0bHkuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgewotICAgICAgICBEZXB0aFNlbGVjdG9yIHM7Ci0gICAgICAgIFN0cmluZyByZXN1bHRzOwotCi0gICAgICAgIHMgPSBuZXcgRGVwdGhTZWxlY3RvcigpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJNaW5NYXgoKSB7CiAgICAgICAgIHMuc2V0TWluKDIwKTsKICAgICAgICAgcy5zZXRNYXgoMjUpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZGRkZGRkZGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEZXB0aFNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyTWluMCgpIHsKICAgICAgICAgcy5zZXRNaW4oMCk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRUVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IERlcHRoU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJNaW4xKCkgewogICAgICAgICBzLnNldE1pbigxKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRUVFRUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRUVFRUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRGVwdGhTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91ck1heDAoKSB7CiAgICAgICAgIHMuc2V0TWF4KDApOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVEZGRkZGRkYiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVEZGRkZGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBEZXB0aFNlbGVjdG9yKCk7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyTWluMU1heDEoKSB7CiAgICAgICAgIHMuc2V0TWluKDEpOwogICAgICAgICBzLnNldE1heCgxKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRGRkZUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZUVFRGRkZUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL0ZpbGVuYW1lU2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMDk0ODNiZi4uMGM1MDhiNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9GaWxlbmFtZVNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvRmlsZW5hbWVTZWxlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEzICsxOCwxNSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIC8qKgogICogVGVzdHMgRmlsZW5hbWUgU2VsZWN0b3JzCkBAIC0zNSwzMiArMzcsNDEgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCYXNlU2VsZWN0b3JSdWxlIHNlbGVjdG9yUnVsZSA9IG5ldyBCYXNlU2VsZWN0b3JSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBwcml2YXRlIEZpbGVuYW1lU2VsZWN0b3IgczsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcyA9IG5ldyBGaWxlbmFtZVNlbGVjdG9yKCk7CisgICAgfQorCiAgICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3IuCisgICAgICogVGVzdCB0aGUgY29kZSB0aGF0IHZhbGlkYXRlcyB0aGUgc2VsZWN0b3I6IHJlcXVpcmVkIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZCgpIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJUaGUgbmFtZSBvciByZWdleCBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiKTsKKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yOiBpbnZhbGlkIHBhcmFtZXRlci4KICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKLSAgICAgICAgRmlsZW5hbWVTZWxlY3RvciBzID0gbmV3IEZpbGVuYW1lU2VsZWN0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSxzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiRmlsZW5hbWVTZWxlY3RvciBkaWQgbm90IGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMiKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUxKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlRoZSBuYW1lIG9yIHJlZ2V4IGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIsIGJlMS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcyA9IG5ldyBGaWxlbmFtZVNlbGVjdG9yKCk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoImdhcmJhZ2UgaW4iKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IHtwYXJhbX07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJGaWxlbmFtZVNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlciBlbGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHBhcmFtZXRlciBnYXJiYWdlIGluIiwgYmUyLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQorICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OCw0NCArNzksNDAgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7Ci0gICAgICAgIEZpbGVuYW1lU2VsZWN0b3IgczsKLSAgICAgICAgU3RyaW5nIHJlc3VsdHM7Ci0KLSAgICAgICAgcyA9IG5ldyBGaWxlbmFtZVNlbGVjdG9yKCk7CiAgICAgICAgIHMuc2V0TmFtZSgibm8gbWF0Y2ggcG9zc2libGUiKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRkZGRkZGRkZGRkZGIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRmlsZW5hbWVTZWxlY3RvcigpOworICAgIEBJZ25vcmUoIlR1cm5lZCBvZmYgZHVlIHRvIGEgYnVnOiBTZWxlY3RvclV0aWxzLm1hdGNoUGF0dGVybigpIGlzIHJlY3Vyc2l2ZSB3aXRob3V0ICcqKicgb24gV2luZG93cyIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyV2lsZGNhcmQoKSB7CiAgICAgICAgIHMuc2V0TmFtZSgiKi5neiIpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgLy8gVGhpcyBpcyB0dXJuZWQgb2ZmIHRlbXBvcmFyaWx5LiBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnCi0gICAgICAgIC8vIGluIFNlbGVjdG9yVXRpbHMubWF0Y2hQYXR0ZXJuKCkgd2hlcmUgaXQgaXMgcmVjdXJzaXZlIG9uCi0gICAgICAgIC8vIFdpbmRvd3MgZXZlbiBpZiBubyAqKiBpcyBpbiBwYXR0ZXJuLgotICAgICAgICAvL2Fzc2VydEVxdWFscygiRkZGVEZGRkZGRkZGIiwgcmVzdWx0cyk7IC8vIFVuaXgKLSAgICAgICAgLy8gdnMKLSAgICAgICAgLy9hc3NlcnRFcXVhbHMoIkZGRlRGRkZGVEZGRiIsIHJlc3VsdHMpOyAvLyBXaW5kb3dzCisgICAgICAgIGFzc2VydEVxdWFscygiRkZGVEZGRkZGRkZGIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7IC8vIFVuaXgKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGRkZURkZGRlRGRkYiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsgLy8gV2luZG93cworICAgIH0KIAotICAgICAgICBzID0gbmV3IEZpbGVuYW1lU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJOZWdhdGUoKSB7CiAgICAgICAgIHMuc2V0TmFtZSgiKiovKi5neiIpOwogICAgICAgICBzLnNldE5lZ2F0ZSh0cnVlKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFRURlRUVEZGVFRUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFRURlRUVEZGVFRUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgRmlsZW5hbWVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91ckNhc2VJbnNlbnNpdGl2ZSgpIHsKICAgICAgICAgcy5zZXROYW1lKCIqKi8qLkdaIik7CiAgICAgICAgIHMuc2V0Q2FzZXNlbnNpdGl2ZShmYWxzZSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRlRGRkZUVEZGRiIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGRlRGRkZUVEZGRiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IEZpbGVuYW1lU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJOYW1lZFBhcmFtZXRlcigpIHsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0xLnNldE5hbWUoIm5hbWUiKTsKICAgICAgICAgcGFyYW0xLnNldFZhbHVlKCIqKi8qLmJ6MiIpOwogICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW0xfTsKICAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkZGVEZGRkZGRlRURiIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkZGVEZGRkZGRlRURiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQWxnb3JpdGhtLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tBbGdvcml0aG0uamF2YQppbmRleCA0NThjODNmLi4yZDI0YjBkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tBbGdvcml0aG0uamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tBbGdvcml0aG0uamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NhY2hlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tDYWNoZS5qYXZhCmluZGV4IDgxZTM3OWEuLmI4ZWZlNjggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NhY2hlLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQ2FjaGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NvbXBhcmF0b3IuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9ja0NvbXBhcmF0b3IuamF2YQppbmRleCAxODBhYTQ2Li5lZjU4OTQ0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vY2tDb21wYXJhdG9yLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2NrQ29tcGFyYXRvci5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjAsNyArMjAsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiAKLXB1YmxpYyBjbGFzcyBNb2NrQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgeworcHVibGljIGNsYXNzIE1vY2tDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxPYmplY3Q+IHsKIAogICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewogICAgICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9kaWZpZWRTZWxlY3RvclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvTW9kaWZpZWRTZWxlY3RvclRlc3QuamF2YQppbmRleCAwYjk0MGFkLi4xZTg0YmI3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL01vZGlmaWVkU2VsZWN0b3JUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Nb2RpZmllZFNlbGVjdG9yVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTYgKzE4LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzOwogCi0KIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0LlJ1bGVCYXNlZENvbGxhdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQW50QXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNOYW1lczsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5Qcm9qZWN0OwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhcmdldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwpAQCAtNDEsMjAgKzQyLDIxIEBACiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuSGFzaHZhbHVlQWxnb3JpdGhtOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuUHJvcGVydGllc2ZpbGVDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAKIC8qKgogICogVW5pdCB0ZXN0cyBmb3IgTW9kaWZpZWRTZWxlY3Rvci4KQEAgLTY2LDE3ICs2OCwxOSBAQAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJhc2VTZWxlY3RvclJ1bGUgc2VsZWN0b3JSdWxlID0gbmV3IEJhc2VTZWxlY3RvclJ1bGUoKTsKIAotICAgIC8qKiBVdGlsaXRpZXMgdXNlZCBmb3IgZmlsZSBvcGVyYXRpb25zICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOwogCi0gICAgLy8gID09PT09PT09PT09PT09PT09PT09PSAgYXR0cmlidXRlcyAgPT09PT09PT09PT09PT09PT09PT09CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIHRlc3RGb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgICAvLyAgPT09PT09PT09PT09PT09PT09PT09ICBmaXh0dXJlcyAgPT09PT09PT09PT09PT09PT09PT09CiAKICAgICAvKiogUGF0aCB3aGVyZSB0aGUgdGVzdGNsYXNzZXMgYXJlLiAqLwotICAgIHByaXZhdGUgUGF0aCB0ZXN0Y2xhc3NlcyA9IG51bGw7CisgICAgcHJpdmF0ZSBQYXRoIHRlc3RjbGFzc2VzOwogCiAgICAgLy8gID09PT09PT09PT09PT09PT09PT09PSAgSlVuaXQgc3R1ZmYgID09PT09PT09PT09PT09PT09PT09PQogCi0KICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIC8vIGluaXQgdGhlIHRlc3RjbGFzc2VzIHBhdGggb2JqZWN0CkBAIC05MCw4OSArOTQsNjMgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVdyb25nQ2FjaGUoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gInRoaXMtaXMtbm90LWEtdmFsaWQtY2FjaGUtbmFtZSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2RpZmllZFNlbGVjdG9yLkNhY2hlTmFtZSBjYWNoZU5hbWUgPSBuZXcgTW9kaWZpZWRTZWxlY3Rvci5DYWNoZU5hbWUoKTsKLSAgICAgICAgICAgIGNhY2hlTmFtZS5zZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgIGZhaWwoIkNhY2hlU2VsZWN0b3IuQ2FjaGVOYW1lIGFjY2VwdGVkIGludmFsaWQgdmFsdWUuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShuYW1lICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgbmV3IE1vZGlmaWVkU2VsZWN0b3IuQ2FjaGVOYW1lKCkuc2V0VmFsdWUobmFtZSk7CiAgICAgfQogCiAgICAgLyoqIFRlc3QgY29ycmVjdCB1c2Ugb2YgY2FjaGUgbmFtZXMuICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVXcm9uZ0FsZ29yaXRobSgpIHsKICAgICAgICAgU3RyaW5nIG5hbWUgPSAidGhpcy1pcy1ub3QtYS12YWxpZC1hbGdvcml0aG0tbmFtZSI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNb2RpZmllZFNlbGVjdG9yLkFsZ29yaXRobU5hbWUgYWxnb05hbWUKLSAgICAgICAgICAgICAgICA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkFsZ29yaXRobU5hbWUoKTsKLSAgICAgICAgICAgIGFsZ29OYW1lLnNldFZhbHVlKG5hbWUpOwotICAgICAgICAgICAgZmFpbCgiQ2FjaGVTZWxlY3Rvci5BbGdvcml0aG1OYW1lIGFjY2VwdGVkIGludmFsaWQgdmFsdWUuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSArICIgaXMgbm90IGEgbGVnYWwgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShuYW1lICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgbmV3IE1vZGlmaWVkU2VsZWN0b3IuQWxnb3JpdGhtTmFtZSgpLnNldFZhbHVlKG5hbWUpOwogICAgIH0KIAogICAgIC8qKiBUZXN0IGNvcnJlY3QgdXNlIG9mIGNvbXBhcmF0b3IgbmFtZXMuICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVXcm9uZ0NvbXBhcmF0b3IoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gInRoaXMtaXMtbm90LWEtdmFsaWQtY29tcGFyYXRvci1uYW1lIjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE1vZGlmaWVkU2VsZWN0b3IuQ29tcGFyYXRvck5hbWUgY29tcE5hbWUKLSAgICAgICAgICAgICAgICA9IG5ldyBNb2RpZmllZFNlbGVjdG9yLkNvbXBhcmF0b3JOYW1lKCk7Ci0gICAgICAgICAgICBjb21wTmFtZS5zZXRWYWx1ZShuYW1lKTsKLSAgICAgICAgICAgIGZhaWwoIk1vZGlmaWVkU2VsZWN0b3IuQ29tcGFyYXRvck5hbWUgYWNjZXB0ZWQgaW52YWxpZCB2YWx1ZS4iKTsKLSAgICAgICAgfSBjYXRjaCAoQnVpbGRFeGNlcHRpb24gYmUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lICsgIiBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKG5hbWUgKyAiIGlzIG5vdCBhIGxlZ2FsIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSIpOworICAgICAgICBuZXcgTW9kaWZpZWRTZWxlY3Rvci5Db21wYXJhdG9yTmFtZSgpLnNldFZhbHVlKG5hbWUpOwogICAgIH0KIAogICAgIC8qKiBUZXN0IGNvcnJlY3QgdXNlIG9mIGFsZ29yaXRobSBuYW1lcy4gKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQ3VzdG9tQWxnb3JpdGhtKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZ2V0QWxnb05hbWUoImphdmEubGFuZy5PYmplY3QiKTsKLSAgICAgICAgICAgIGZhaWwoIklsbGVnYWwgY2xhc3NuYW1lIHVzZWQuIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIGNsYXNzIChqYXZhLmxhbmcuT2JqZWN0KSBpcyBub3QgYW4gQWxnb3JpdGhtLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKCJTcGVjaWZpZWQgY2xhc3MgKCIgKyBjbGFzc05hbWUgKyAiKSBpcyBub3QgYW4gQWxnb3JpdGhtLiIpOworICAgICAgICBnZXRBbGdvTmFtZShjbGFzc05hbWUpOwogICAgIH0KIAogICAgIC8qKiBUZXN0IGNvcnJlY3QgdXNlIG9mIGFsZ29yaXRobSBuYW1lcy4gKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGVudEN1c3RvbUFsZ29yaXRobSgpIHsKLSAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBnZXRBbGdvTmFtZSgibm9uLmV4aXN0ZW50LmN1c3RvbS5BbGdvcml0aG0iKTsKLSAgICAgICAgICAgIGZhaWwoImRvZXMgJ25vbi5leGlzdGVudC5jdXN0b20uQWxnb3JpdGhtJyByZWFsbHkgZXhpc3Q/Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiV3JvbmcgZXhjZXB0aW9uIG1lc3NhZ2UuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIGNsYXNzIChub24uZXhpc3RlbnQuY3VzdG9tLkFsZ29yaXRobSkgbm90IGZvdW5kLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotCi0gICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICJub24uZXhpc3RlbnQuY3VzdG9tLkFsZ29yaXRobSI7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiU3BlY2lmaWVkIGNsYXNzICgiICsgY2xhc3NOYW1lICsgIikgbm90IGZvdW5kLiIpOworICAgICAgICBnZXRBbGdvTmFtZShjbGFzc05hbWUpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFsZ29yaXRobSgpIHsKICAgICAgICAgU3RyaW5nIGFsZ28gPSBnZXRBbGdvTmFtZSgib3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLm1vZGlmaWVkc2VsZWN0b3IuSGFzaHZhbHVlQWxnb3JpdGhtIik7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIGFsZ29yaXRobSB1c2VkOiAiICsgYWxnbywgYWxnby5zdGFydHNXaXRoKCJIYXNodmFsdWVBbGdvcml0aG0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIGFsZ29yaXRobSB1c2VkOiAiICsgYWxnbywgYWxnbywgc3RhcnRzV2l0aCgiSGFzaHZhbHVlQWxnb3JpdGhtIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFsZ29yaXRobTIoKSB7CiAgICAgICAgIFN0cmluZyBhbGdvID0gZ2V0QWxnb05hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5Nb2NrQWxnb3JpdGhtIik7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIGFsZ29yaXRobSB1c2VkOiAiICsgYWxnbywgYWxnby5zdGFydHNXaXRoKCJNb2NrQWxnb3JpdGhtIikpOworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBhbGdvcml0aG0gdXNlZDogIiArIGFsZ28sIGFsZ28sIHN0YXJ0c1dpdGgoIk1vY2tBbGdvcml0aG0iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ2xhc3NlcygpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZU5vdE51bGwoIkFudCBob21lIG5vdCBzZXQiLCBzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJhbnQuaG9tZSIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQW50IGhvbWUgbm90IHNldCIsCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShNYWdpY05hbWVzLkFOVF9IT01FKSk7CiAgICAgICAgIEJGVCBiZnQgPSBuZXcgQkZUKCk7CiAgICAgICAgIGJmdC5zZXRVcCgpOwogICAgICAgICAvLyBkb24ndCBjYXRjaCB0aGUgSlVuaXQgZXhjZXB0aW9ucwpAQCAtMTg0LDEyICsxNjIsMTMgQEAKICAgICAgICAgICAgIFN0cmluZyBmc01vZFZhbHVlICA9IGJmdC5nZXRQcm9wZXJ0eSgiZnMubW9kLnZhbHVlIik7CiAKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIidmcy5mdWxsLnZhbHVlJyBtdXN0IGJlIHNldC4iLCBmc0Z1bGxWYWx1ZSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCInZnMuZnVsbC52YWx1ZScgbXVzdCBub3QgYmUgbnVsbC4iLCAhIiIuZXF1YWxzKGZzRnVsbFZhbHVlKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCInZnMuZnVsbC52YWx1ZScgbXVzdCBjb250YWluIGFudC5iYXQuIiwgZnNGdWxsVmFsdWUuY29udGFpbnMoImFudC5iYXQiKSk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoIidmcy5mdWxsLnZhbHVlJyBtdXN0IG5vdCBiZSBudWxsLiIsICIiLCBmc0Z1bGxWYWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCInZnMuZnVsbC52YWx1ZScgbXVzdCBjb250YWluIGFudC5iYXQuIiwgZnNGdWxsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCJhbnQuYmF0IikpOwogCiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCInZnMubW9kLnZhbHVlJyBtdXN0IGJlIHNldC4iLCBmc01vZFZhbHVlKTsKICAgICAgICAgICAgIC8vIG11c3QgYmUgZW1wdHkgYWNjb3JkaW5nIHRvIHRoZSBNb2NrKiBpbXBsZW1lbnRhdGlvbnMKLSAgICAgICAgICAgIGFzc2VydFRydWUoIidmcy5tb2QudmFsdWUnIG11c3QgYmUgZW1wdHkuIiwgIiIuZXF1YWxzKGZzTW9kVmFsdWUpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJ2ZzLm1vZC52YWx1ZScgbXVzdCBiZSBlbXB0eS4iLCAiIiwgZnNNb2RWYWx1ZSk7CiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNsZWFuIik7CiAgICAgICAgICAgICBiZnQuZGVsZXRlUHJvcGVydGllc2ZpbGUoKTsKQEAgLTMwMiw4ICsyODEsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByb3BjYWNoZUludmFsaWQoKSB7CiAgICAgICAgIENhY2hlIGNhY2hlID0gbmV3IFByb3BlcnRpZXNmaWxlQ2FjaGUoKTsKLSAgICAgICAgaWYgKGNhY2hlLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIGZhaWwoIlByb3BlcnR5ZmlsZXNDYWNoZSBkb2VzIG5vdCBjaGVjayBpdHMgY29uZmlndXJhdGlvbi4iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlByb3BlcnR5ZmlsZXNDYWNoZSBkb2VzIG5vdCBjaGVjayBpdHMgY29uZmlndXJhdGlvbi4iLCBjYWNoZS5pc1ZhbGlkKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zNjcsMTEgKzM0NSwxMCBAQAogICAgICAqIGNvbmZpZ3VyZSgpIG1ldGhvZCBvZiBNb2RpZmllZFNlbGVjdG9yLiBUaGlzIHRlc3RjYXNlIHRlc3RzIHRoYXQuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUHJvcGVydGllc0NhY2hlVmlhQ3VzdG9tU2VsZWN0b3IoKSB7Ci0gICAgICAgIEZpbGUgY2FjaGVmaWxlID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgidG1wLWNhY2hlLSIsICIucHJvcGVydGllcyIsIG51bGwsIGZhbHNlLCBmYWxzZSk7CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnRpZXNDYWNoZVZpYUN1c3RvbVNlbGVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBjYWNoZWZpbGUgPSB0ZXN0Rm9sZGVyLm5ld0ZpbGUoInRtcC1jYWNoZS5wcm9wZXJ0aWVzIik7CiAKICAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBzZWxlY3RvcgotCiAgICAgICAgIEV4dGVuZFNlbGVjdG9yIHMgPSBuZXcgRXh0ZW5kU2VsZWN0b3IoKTsKICAgICAgICAgcy5zZXRDbGFzc25hbWUoIm9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLk1vZGlmaWVkU2VsZWN0b3IiKTsKICAgICAgICAgcy5hZGRQYXJhbShjcmVhdGVQYXJhbSgidXBkYXRlIiwgInRydWUiKSk7CkBAIC0zODIsNyArMzU5LDYgQEAKIAogICAgICAgICAvLyBldmFsdWF0ZSBjb3JyZWN0bmVzcwogICAgICAgICBhc3NlcnRUcnVlKCJDYWNoZSBmaWxlIGlzIG5vdCBjcmVhdGVkLiIsIGNhY2hlZmlsZS5leGlzdHMoKSk7Ci0gICAgICAgIGNhY2hlZmlsZS5kZWxldGUoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNDA4LDcgKzM4NCw3IEBACiAgICAgICAgIFN0cmluZyB2YWx1ZTIgPSAidmFsdWUyIjsKIAogICAgICAgICAvLyBnaXZlbiBjYWNoZSBtdXN0IGJlIGVtcHR5Ci0gICAgICAgIEl0ZXJhdG9yIGl0MSA9IGNhY2hlLml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXQxID0gY2FjaGUuaXRlcmF0b3IoKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoIkNhY2hlIGlzIG5vdCBlbXB0eSIsIGl0MS5oYXNOZXh0KCkpOwogCiAgICAgICAgIC8vIGNhY2hlIG11c3QgcmV0dXJuIGEgc3RvcmVkIHZhbHVlCkBAIC00MTgsOSArMzk0LDkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWNoZSByZXR1cm5lZCB3cm9uZyB2YWx1ZSIsIHZhbHVlMiwgY2FjaGUuZ2V0KGtleTIpKTsKIAogICAgICAgICAvLyB0ZXN0IHRoZSBpdGVyYXRvcgotICAgICAgICBJdGVyYXRvciBpdDIgPSBjYWNoZS5pdGVyYXRvcigpOwotICAgICAgICBPYmplY3QgICByZXR1cm5lZCA9IGl0Mi5uZXh0KCk7Ci0gICAgICAgIGJvb2xlYW4gb2sgPSAoa2V5MS5lcXVhbHMocmV0dXJuZWQpIHx8IGtleTIuZXF1YWxzKHJldHVybmVkKSk7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXQyID0gY2FjaGUuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIHJldHVybmVkID0gaXQyLm5leHQoKTsKKyAgICAgICAgYm9vbGVhbiBvayA9IGtleTEuZXF1YWxzKHJldHVybmVkKSB8fCBrZXkyLmVxdWFscyhyZXR1cm5lZCk7CiAgICAgICAgIFN0cmluZyBtc2cgPSAiSXRlcmF0b3IgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZS4iCiAgICAgICAgICAgICAgICAgICAgKyAiICBrZXkxLmVxdWFscyhyZXR1cm5lZCk9IiArIGtleTEuZXF1YWxzKHJldHVybmVkKQogICAgICAgICAgICAgICAgICAgICsgIiAga2V5Mi5lcXVhbHMocmV0dXJuZWQpPSIgKyBrZXkyLmVxdWFscyhyZXR1cm5lZCkKQEAgLTQzMCw3ICs0MDYsNyBAQAogCiAgICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZQogICAgICAgICBjYWNoZS5kZWxldGUoKTsKLSAgICAgICAgSXRlcmF0b3IgaXQzID0gY2FjaGUuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdDMgPSBjYWNoZS5pdGVyYXRvcigpOwogICAgICAgICBhc3NlcnRGYWxzZSgiQ2FjaGUgaXMgbm90IGVtcHR5IiwgaXQzLmhhc05leHQoKSk7CiAgICAgfQogCkBAIC00ODUsMzAgKzQ2MSwyNiBAQAogICAgICAqIEBwYXJhbSBhbGdvICAgY29uZmlndXJlZCB0ZXN0IG9iamVjdAogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGRvVGVzdChBbGdvcml0aG0gYWxnbykgewotICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxnb3JpdGhtIG5vdCBwcm9wZXIgY29uZmlndXJlZC4iLCBhbGdvLmlzVmFsaWQoKSk7Ci0gICAgICAgICBmb3IgKGludCBpPTA7IGk8c2VsZWN0b3JSdWxlLmdldEZpbGVzKCkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpW2ldOyAgLy8gbXVzdCBub3QgYmUgYSBkaXJlY3RvcnkKLSAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBIYXNodmFsdWVzCi0gICAgICAgICAgICAgICAgU3RyaW5nIGhhc2gxID0gYWxnby5nZXRWYWx1ZShmaWxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDIgPSBhbGdvLmdldFZhbHVlKGZpbGUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBoYXNoMyA9IGFsZ28uZ2V0VmFsdWUoZmlsZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGhhc2g0ID0gYWxnby5nZXRWYWx1ZShmaWxlKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgaGFzaDUgPSBhbGdvLmdldFZhbHVlKG5ldyBGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQotICAgICAgICAgICAgICAgIC8vIEFzc2VydCAhPW51bGwgYW5kIGVxdWFsaXR5Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzaHZhbHVlIHdhcyBudWxsIGZvciAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxKTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDIpOwotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIkhhc2h2YWx1ZSB3YXMgbnVsbCBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSGFzaHZhbHVlIHdhcyBudWxsIGZvciAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2g0KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDUpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SGFzaHZhbHVlKCkgcmV0dXJuZWQgZGlmZmVyZW50IHZhbHVlIGZvciAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoMik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRIYXNodmFsdWUoKSByZXR1cm5lZCBkaWZmZXJlbnQgdmFsdWUgZm9yICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgaGFzaDEsIGhhc2gzKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIitmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSwgaGFzaDQpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2V0SGFzaHZhbHVlKCkgcmV0dXJuZWQgZGlmZmVyZW50IHZhbHVlIGZvciAiK2ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoNSk7Ci0gICAgICAgICAgICB9Ly9pZi1pc0ZpbGUKLSAgICAgICAgfS8vZm9yCi0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQWxnb3JpdGhtIG5vdCBwcm9wZXIgY29uZmlndXJlZC4iLCBhbGdvLmlzVmFsaWQoKSk7CisgICAgICAgIC8vIG11c3Qgbm90IGJlIGEgZGlyZWN0b3J5CisgICAgICAgIEFycmF5cy5zdHJlYW0oc2VsZWN0b3JSdWxlLmdldEZpbGVzKCkpLmZpbHRlcihGaWxlOjppc0ZpbGUpLmZvckVhY2goZmlsZSAtPiB7CisgICAgICAgICAgICAvLyBnZXQgdGhlIEhhc2h2YWx1ZXMKKyAgICAgICAgICAgIFN0cmluZyBoYXNoMSA9IGFsZ28uZ2V0VmFsdWUoZmlsZSk7CisgICAgICAgICAgICBTdHJpbmcgaGFzaDIgPSBhbGdvLmdldFZhbHVlKGZpbGUpOworICAgICAgICAgICAgU3RyaW5nIGhhc2gzID0gYWxnby5nZXRWYWx1ZShmaWxlKTsKKyAgICAgICAgICAgIFN0cmluZyBoYXNoNCA9IGFsZ28uZ2V0VmFsdWUoZmlsZSk7CisgICAgICAgICAgICBTdHJpbmcgaGFzaDUgPSBhbGdvLmdldFZhbHVlKG5ldyBGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCAhPW51bGwgYW5kIGVxdWFsaXR5CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoMyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoNCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJIYXNodmFsdWUgd2FzIG51bGwgZm9yICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBoYXNoNSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoMyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoNCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldEhhc2h2YWx1ZSgpIHJldHVybmVkIGRpZmZlcmVudCB2YWx1ZSBmb3IgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGhhc2gxLCBoYXNoNSk7CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIC8vID09PT09PT09PT09PT09ICB0ZXN0Y2FzZXMgZm9yIHRoZSBjb21wYXJhdG9yIGltcGxlbWVudGF0aW9ucyAgPT09PT09PT09PT09PT0KQEAgLTU3MCw3ICs1NDIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNlbGVjdG9yU2VscmVzVHJ1ZSgpIHsKICAgICAgICAgQkZUIGJmdCA9IG5ldyBCRlQoKTsKICAgICAgICAgYmZ0LmRvVGFyZ2V0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1SZXNvdXJjZVNlbHJlc1RydWUiKTsKLSAgICAgICAgQW50QXNzZXJ0LmFzc2VydENvbnRhaW5zKCJkb2VzIG5vdCBwcm92aWRlIGFuIElucHV0U3RyZWFtIiwgYmZ0LmdldExvZygpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChiZnQuZ2V0TG9nKCksIGNvbnRhaW5zU3RyaW5nKCJkb2VzIG5vdCBwcm92aWRlIGFuIElucHV0U3RyZWFtIikpOwogICAgICAgICBiZnQuZGVsZXRlQ2FjaGVmaWxlKCk7CiAgICAgfQogCkBAIC01ODMsOCArNTU1LDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2VsZWN0b3JTY2VuYXJpb1NpbXBsZSgpIHsKLQotICAgICAgICBBc3N1bWUuYXNzdW1lTm90TnVsbCgiQW50IGhvbWUgbm90IHNldCIsIHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5ob21lIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJBbnQgaG9tZSBub3Qgc2V0IiwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpKTsKICAgICAgICAgQkZUIGJmdCA9IG5ldyBCRlQoKTsKICAgICAgICAgYmZ0LmRvVGFyZ2V0KCJtb2RpZmllZHNlbGVjdG9ydGVzdC1zY2VuYXJpby1yZXNvdXJjZVNpbXBsZSIpOwogICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNsZWFuIik7CkBAIC01OTcsMTQgKzU2OSwxNCBAQAogICAgICAqCiAgICAgICogQHBhcmFtIGNvbXAgICBjb25maWd1cmVkIHRlc3Qgb2JqZWN0CiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZG9UZXN0KENvbXBhcmF0b3IgY29tcCkgewotICAgICAgICBPYmplY3QgbzEgPSBuZXcgU3RyaW5nKCJzdHJpbmcxIik7Ci0gICAgICAgIE9iamVjdCBvMiA9IG5ldyBTdHJpbmcoInN0cmluZzIiKTsKLSAgICAgICAgT2JqZWN0IG8zID0gbmV3IFN0cmluZygic3RyaW5nMiIpOyAvLyByZWFsbHkgIjIiCisgICAgcHJvdGVjdGVkIHZvaWQgZG9UZXN0KENvbXBhcmF0b3I8T2JqZWN0PiBjb21wKSB7CisgICAgICAgIE9iamVjdCBvMSA9ICJzdHJpbmcxIjsKKyAgICAgICAgT2JqZWN0IG8yID0gInN0cmluZzIiOworICAgICAgICBPYmplY3QgbzMgPSAic3RyaW5nMiI7IC8vIHJlYWxseSAiMiIKIAotICAgICAgICBhc3NlcnRUcnVlKCJDb21wYXJhdG9yIGdhdmUgd3JvbmcgdmFsdWUuIiwgY29tcC5jb21wYXJlKG8xLCBvMikgIT0gMCk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNvbXBhcmF0b3IgZ2F2ZSB3cm9uZyB2YWx1ZS4iLCBjb21wLmNvbXBhcmUobzEsIG8zKSAhPSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29tcGFyYXRvciBnYXZlIHdyb25nIHZhbHVlLiIsIGNvbXAuY29tcGFyZShvMiwgbzMpID09IDApOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoIkNvbXBhcmF0b3IgZ2F2ZSB3cm9uZyB2YWx1ZS4iLCAwLCBjb21wLmNvbXBhcmUobzEsIG8yKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygiQ29tcGFyYXRvciBnYXZlIHdyb25nIHZhbHVlLiIsIDAsIGNvbXAuY29tcGFyZShvMSwgbzMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb21wYXJhdG9yIGdhdmUgd3JvbmcgdmFsdWUuIiwgMCwgY29tcC5jb21wYXJlKG8yLCBvMykpOwogICAgIH0KIAogICAgIC8vID09PT09PT09PT09PT09PT09PT09PSAgc2NlbmFyaW8gdGVzdHMgID09PT09PT09PT09PT09PT09PT09PQpAQCAtODA0LDE5ICs3NzYsMjIgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNjZW5hcmlvQ29yZVNlbGVjdG9yRGVmYXVsdHMoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVOb3ROdWxsKCJBbnQgaG9tZSBub3Qgc2V0Iiwgc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmhvbWUiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkFudCBob21lIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSkpOwogICAgICAgICBkb1NjZW5hcmlvVGVzdCgibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY29yZXNlbGVjdG9yLWRlZmF1bHRzIiwgImNhY2hlLnByb3BlcnRpZXMiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpb0NvcmVTZWxlY3RvclNldHRpbmdzKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lTm90TnVsbCgiQW50IGhvbWUgbm90IHNldCIsIHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImFudC5ob21lIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJBbnQgaG9tZSBub3Qgc2V0IiwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KE1hZ2ljTmFtZXMuQU5UX0hPTUUpKTsKICAgICAgICAgZG9TY2VuYXJpb1Rlc3QoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNvcmVzZWxlY3Rvci1zZXR0aW5ncyIsICJjb3JlLmNhY2hlLnByb3BlcnRpZXMiKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTY2VuYXJpb0N1c3RvbVNlbGVjdG9yU2V0dGluZ3MoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVOb3ROdWxsKCJBbnQgaG9tZSBub3Qgc2V0Iiwgc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgiYW50LmhvbWUiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkFudCBob21lIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoTWFnaWNOYW1lcy5BTlRfSE9NRSkpOwogICAgICAgICBkb1NjZW5hcmlvVGVzdCgibW9kaWZpZWRzZWxlY3RvcnRlc3Qtc2NlbmFyaW8tY3VzdG9tc2VsZWN0b3Itc2V0dGluZ3MiLCAiY29yZS5jYWNoZS5wcm9wZXJ0aWVzIik7CiAgICAgfQogCkBAIC04MzcsOCArODEyLDggQEAKICAgICAgICAgICAgIC8vIGRvIHRoZSBjaGVja3MKICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhY2hlIGZpbGUgbm90IGNyZWF0ZWQuIiwgY2FjaGVmaWxlLmV4aXN0cygpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vdCBlbm91Z2ggZmlsZXMgY29waWVkIG9uIGZpcnN0IHRpbWUuIiwgdG8xLmxpc3QoKS5sZW5ndGggPiA1KTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRvbyBtdWNoIGZpbGVzIGNvcGllZCBvbiBzZWNvbmQgdGltZS4iLCB0bzIubGlzdCgpLmxlbmd0aCA9PSAwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlRvbyBtdWNoIGZpbGVzIGNvcGllZCBvbiB0aGlyZCB0aW1lLiIsIHRvMy5saXN0KCkubGVuZ3RoID09IDIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb28gbXVjaCBmaWxlcyBjb3BpZWQgb24gc2Vjb25kIHRpbWUuIiwgMCwgdG8yLmxpc3QoKS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb28gbXVjaCBmaWxlcyBjb3BpZWQgb24gdGhpcmQgdGltZS4iLCAyLCB0bzMubGlzdCgpLmxlbmd0aCk7CiAgICAgICAgIC8vIGRvbid0IGNhdGNoIHRoZSBKVW5pdCBleGNlcHRpb25zCiAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICBiZnQuZG9UYXJnZXQoIm1vZGlmaWVkc2VsZWN0b3J0ZXN0LXNjZW5hcmlvLWNsZWFuIik7CkBAIC05MDgsNyArODgzLDcgQEAKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgRmlsZVdyaXRlciBvdXQgPSBuZXcgRmlsZVdyaXRlcihmaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGUobGluZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKFN0cmluZ1V0aWxzLkxJTkVfU0VQKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSk7CiAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CiAgICAgICAgICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewpAQCAtOTMyLDcgKzkwNyw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogTW9ja1Byb2plY3Qgd3JhcHBlcyBhIHZlcnkgc21hbGwgYW50IHByb2plY3QgKG9uZSB0YXJnZXQsIG9uZSB0YXNrKQorICAgICAqIE1vY2tQcm9qZWN0IHdyYXBzIGEgdmVyeSBzbWFsbCBhbnQgcHJvamVjdCAob25lIHRhcmdldCwgb25lIHRhc2spCiAgICAgICogYnV0IHByb3ZpZGVzIHB1YmxpYyBtZXRob2RzIHRvIGZpcmUgdGhlIGJ1aWxkIGV2ZW50cy4KICAgICAgKi8KICAgICBwcml2YXRlIGNsYXNzIE1vY2tQcm9qZWN0IGV4dGVuZHMgUHJvamVjdCB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL093bmVkQnlTZWxlY3RvclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvT3duZWRCeVNlbGVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjEwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL093bmVkQnlTZWxlY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlVzZXJQcmluY2lwYWw7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCitwdWJsaWMgY2xhc3MgT3duZWRCeVNlbGVjdG9yVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBUZW1wb3JhcnlGb2xkZXIgZm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIFRFU1RfRklMRSA9IG5ldyBGaWxlKCIvZXRjL3Bhc3N3ZCIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VMRiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5uYW1lIik7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBST09UX1VTRVIgPSAicm9vdCI7CisKKyAgICBwcml2YXRlIE93bmVkQnlTZWxlY3RvciBzOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAvLyBhdCBsZWFzdCBvbiBKZW5raW5zIHRoZSBmaWxlIGlzIG93bmVkIGJ5ICJCVUlMVElOXEFkbWluaXN0cmF0b3JzIgorICAgICAgICBhc3N1bWVGYWxzZShPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKKworICAgICAgICBzID0gbmV3IE93bmVkQnlTZWxlY3RvcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb3duZWRCeUlzVHJ1ZUZvclNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmaWxlID0gZm9sZGVyLm5ld0ZpbGUoImYudHh0Iik7CisgICAgICAgIFVzZXJQcmluY2lwYWwgdXNlciA9IEZpbGVzLmdldE93bmVyKGZpbGUudG9QYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRiwgdXNlci5nZXROYW1lKCkpOworCisgICAgICAgIHMuc2V0T3duZXIoU0VMRik7CisgICAgICAgIGFzc2VydFRydWUocy5pc1NlbGVjdGVkKG51bGwsIG51bGwsIGZpbGUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG93bmVkQnlGb2xsb3dTeW1saW5rcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoZm9sZGVyLmdldFJvb3QoKSwgImxpbmsiKTsKKyAgICAgICAgUGF0aCBzeW1ib2xpY0xpbmsgPSBGaWxlcy5jcmVhdGVTeW1ib2xpY0xpbmsodGFyZ2V0LnRvUGF0aCgpLCBURVNUX0ZJTEUudG9QYXRoKCkpOworCisgICAgICAgIFVzZXJQcmluY2lwYWwgcm9vdCA9IEZpbGVzLmdldE93bmVyKHN5bWJvbGljTGluayk7CisgICAgICAgIGFzc2VydEVxdWFscyhST09UX1VTRVIsIHJvb3QuZ2V0TmFtZSgpKTsKKworICAgICAgICBVc2VyUHJpbmNpcGFsIHVzZXIgPSBGaWxlcy5nZXRPd25lcihzeW1ib2xpY0xpbmssIExpbmtPcHRpb24uTk9GT0xMT1dfTElOS1MpOworICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRiwgdXNlci5nZXROYW1lKCkpOworCisgICAgICAgIHMuc2V0T3duZXIoU0VMRik7CisgICAgICAgIGFzc2VydEZhbHNlKHMuaXNTZWxlY3RlZChudWxsLCBudWxsLCBzeW1ib2xpY0xpbmsudG9GaWxlKCkpKTsKKyAgICAgICAgcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUocy5pc1NlbGVjdGVkKG51bGwsIG51bGwsIHN5bWJvbGljTGluay50b0ZpbGUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUG9zaXhHcm91cFNlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Qb3NpeEdyb3VwU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5NzA4MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUG9zaXhHcm91cFNlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Hcm91cFByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lTm9FeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworcHVibGljIGNsYXNzIFBvc2l4R3JvdXBTZWxlY3RvclRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIGZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEdST1VQX0dFVFRFUiA9ICJnZXRHaWQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIFRFU1RfRklMRSA9IG5ldyBGaWxlKCIvZXRjL3Bhc3N3ZCIpOworCisgICAgcHJpdmF0ZSBDbGFzczw/PiBqYWFzUHJvdmlkZXJDbGFzczsKKworICAgIHByaXZhdGUgUG9zaXhHcm91cFNlbGVjdG9yIHM7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIk5vdCBQT1NJWCIsIE9zLmlzRmFtaWx5KCJ1bml4IikpOworICAgICAgICBTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIiwgInVua25vd24iKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmcgamFhc1Byb3ZpZGVyQ2xhc3NOYW1lID0gb3NOYW1lLmNvbnRhaW5zKCJzdW5vcyIpCisgICAgICAgICAgID8gImNvbS5zdW4uc2VjdXJpdHkuYXV0aC5tb2R1bGUuU29sYXJpc1N5c3RlbSIKKyAgICAgICAgICAgOiAiY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5Vbml4U3lzdGVtIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamFhc1Byb3ZpZGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGphYXNQcm92aWRlckNsYXNzTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBhc3N1bWVOb0V4Y2VwdGlvbigiQ2Fubm90IG9idGFpbiBPUy1zcGVjaWZpYyBKQUFTIGluZm9ybWF0aW9uIiwgZSk7CisgICAgICAgIH0KKworICAgICAgICBzID0gbmV3IFBvc2l4R3JvdXBTZWxlY3RvcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcG9zaXhHcm91cElzVHJ1ZUZvclNlbGYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBnaWQgPSAobG9uZykgamFhc1Byb3ZpZGVyQ2xhc3MuZ2V0TWV0aG9kKEdST1VQX0dFVFRFUikKKyAgICAgICAgICAgICAgICAuaW52b2tlKGphYXNQcm92aWRlckNsYXNzLm5ld0luc3RhbmNlKCkpOworCisgICAgICAgIEZpbGUgZmlsZSA9IGZvbGRlci5uZXdGaWxlKCJmLnR4dCIpOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGZpbGVBdHRyaWJ1dGVzID0gRmlsZXMucmVhZEF0dHJpYnV0ZXMoZmlsZS50b1BhdGgoKSwKKyAgICAgICAgICAgICAgICAidW5peDpncm91cCxnaWQiLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKTsKKyAgICAgICAgbG9uZyBhY3R1YWxHaWQgPSAoaW50KSBmaWxlQXR0cmlidXRlcy5nZXQoImdpZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRpZmZlcmVudCBHSURzIiwgZ2lkLCBhY3R1YWxHaWQpOworCisgICAgICAgIEdyb3VwUHJpbmNpcGFsIGFjdHVhbEdyb3VwID0gKEdyb3VwUHJpbmNpcGFsKSBmaWxlQXR0cmlidXRlcy5nZXQoImdyb3VwIik7CisgICAgICAgIHMuc2V0R3JvdXAoYWN0dWFsR3JvdXAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmlzU2VsZWN0ZWQobnVsbCwgbnVsbCwgZmlsZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcG9zaXhHcm91cEZvbGxvd1N5bWxpbmtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGxvbmcgZ2lkID0gKGxvbmcpIGphYXNQcm92aWRlckNsYXNzLmdldE1ldGhvZChHUk9VUF9HRVRURVIpCisgICAgICAgICAgICAgICAgLmludm9rZShqYWFzUHJvdmlkZXJDbGFzcy5uZXdJbnN0YW5jZSgpKTsKKworICAgICAgICBGaWxlIHRhcmdldCA9IG5ldyBGaWxlKGZvbGRlci5nZXRSb290KCksICJsaW5rIik7CisgICAgICAgIFBhdGggc3ltYm9saWNMaW5rID0gRmlsZXMuY3JlYXRlU3ltYm9saWNMaW5rKHRhcmdldC50b1BhdGgoKSwgVEVTVF9GSUxFLnRvUGF0aCgpKTsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBsaW5rQXR0cmlidXRlcyA9IEZpbGVzLnJlYWRBdHRyaWJ1dGVzKHRhcmdldC50b1BhdGgoKSwKKyAgICAgICAgICAgICAgICAidW5peDpncm91cCxnaWQiLCBMaW5rT3B0aW9uLk5PRk9MTE9XX0xJTktTKTsKKyAgICAgICAgbG9uZyBsaW5rR2lkID0gKGludCkgbGlua0F0dHJpYnV0ZXMuZ2V0KCJnaWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJEaWZmZXJlbnQgR0lEcyIsIGdpZCwgbGlua0dpZCk7CisKKyAgICAgICAgR3JvdXBQcmluY2lwYWwgdGFyZ2V0R3JvdXAgPSBGaWxlcy5yZWFkQXR0cmlidXRlcyh0YXJnZXQudG9QYXRoKCksCisgICAgICAgICAgICAgICAgUG9zaXhGaWxlQXR0cmlidXRlcy5jbGFzcykuZ3JvdXAoKTsKKyAgICAgICAgR3JvdXBQcmluY2lwYWwgbGlua0dyb3VwID0gKEdyb3VwUHJpbmNpcGFsKSBsaW5rQXR0cmlidXRlcy5nZXQoImdyb3VwIik7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygiU2FtZSBncm91cCBuYW1lIiwgbGlua0dyb3VwLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICB0YXJnZXRHcm91cC5nZXROYW1lKCkpOworCisgICAgICAgIHMuc2V0R3JvdXAobGlua0dyb3VwLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHMuaXNTZWxlY3RlZChudWxsLCBudWxsLCBzeW1ib2xpY0xpbmsudG9GaWxlKCkpKTsKKyAgICAgICAgcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgIGFzc2VydFRydWUocy5pc1NlbGVjdGVkKG51bGwsIG51bGwsIHN5bWJvbGljTGluay50b0ZpbGUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Qb3NpeFBlcm1pc3Npb25zU2VsZWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM5ZWY0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb25kaXRpb24uT3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnJ1bm5lcnMuRW5jbG9zZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRlbXBvcmFyeUZvbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKKworQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yVGVzdCB7CisKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSWxsZWdhbEFyZ3VtZW50VGVzdCB7CisKKyAgICAgICAgcHJpdmF0ZSBQb3NpeFBlcm1pc3Npb25zU2VsZWN0b3IgczsKKworICAgICAgICAvLyByZXF1aXJlcyBKVW5pdCA0LjEyCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJpbGxlZ2FsIGFyZ3VtZW50OiB8ezB9fCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgiODU1IiwgIjQ1NTUiLCAiLXJ3eHIteHIteCIsICJ4cndyLXhyLXgiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIGFyZ3VtZW50OworCisgICAgICAgIEBCZWZvcmUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgICAgICBhc3N1bWVUcnVlKCJOb3QgUE9TSVgiLCBPcy5pc0ZhbWlseSgidW5peCIpKTsKKyAgICAgICAgICAgIHMgPSBuZXcgUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEJ1aWxkRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICAgICAgcy5zZXRQZXJtaXNzaW9ucyhhcmd1bWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGVnYWxBcmd1bWVudFRlc3QgeworCisgICAgICAgIHByaXZhdGUgUG9zaXhQZXJtaXNzaW9uc1NlbGVjdG9yIHM7CisKKyAgICAgICAgQFJ1bGUKKyAgICAgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciBmb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgICAgICAgLy8gcmVxdWlyZXMgSlVuaXQgNC4xMgorICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibGVnYWwgYXJndW1lbnQgKHNlbGYpOiB8ezB9fCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGRhdGEoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgiNzUwIiwgInJ3eHIteC0tLSIpOworICAgICAgICB9CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXJndW1lbnQ7CisKKyAgICAgICAgQEJlZm9yZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgICAgIGFzc3VtZVRydWUoIk5vdCBQT1NJWCIsIE9zLmlzRmFtaWx5KCJ1bml4IikpOworICAgICAgICAgICAgcyA9IG5ldyBQb3NpeFBlcm1pc3Npb25zU2VsZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBkZXBlbmQgb24gZGVmYXVsdCB1bWFzaworICAgICAgICAgICAgRmlsZSBzdWJGb2xkZXIgPSBmb2xkZXIubmV3Rm9sZGVyKCk7CisgICAgICAgICAgICBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcGVybWlzc2lvbnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGQoUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9SRUFEKTsKKyAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZChQb3NpeEZpbGVQZXJtaXNzaW9uLk9XTkVSX1dSSVRFKTsKKyAgICAgICAgICAgIHBlcm1pc3Npb25zLmFkZChQb3NpeEZpbGVQZXJtaXNzaW9uLk9XTkVSX0VYRUNVVEUpOworICAgICAgICAgICAgcGVybWlzc2lvbnMuYWRkKFBvc2l4RmlsZVBlcm1pc3Npb24uR1JPVVBfUkVBRCk7CisgICAgICAgICAgICBwZXJtaXNzaW9ucy5hZGQoUG9zaXhGaWxlUGVybWlzc2lvbi5HUk9VUF9FWEVDVVRFKTsKKyAgICAgICAgICAgIEZpbGVzLnNldFBvc2l4RmlsZVBlcm1pc3Npb25zKHN1YkZvbGRlci50b1BhdGgoKSwgcGVybWlzc2lvbnMpOworCisgICAgICAgICAgICBzLnNldFBlcm1pc3Npb25zKGFyZ3VtZW50KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pc1NlbGVjdGVkKG51bGwsIG51bGwsIHN1YkZvbGRlcikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExlZ2FsU3ltYm9saWNMaW5rQXJndW1lbnRUZXN0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgVEVTVF9GSUxFID0gbmV3IEZpbGUoIi9ldGMvcGFzc3dkIik7CisKKyAgICAgICAgcHJpdmF0ZSBQb3NpeFBlcm1pc3Npb25zU2VsZWN0b3IgczsKKworICAgICAgICBAUnVsZQorICAgICAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIGZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworICAgICAgICAvLyByZXF1aXJlcyBKVW5pdCA0LjEyCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJsZWdhbCBhcmd1bWVudCAobGluayk6IHx7MH18IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KCI2NDQiLCAicnctci0tci0tIik7CisgICAgICAgIH0KKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICAgICAgcHVibGljIFN0cmluZyBhcmd1bWVudDsKKworICAgICAgICBAQmVmb3JlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAgICAgYXNzdW1lVHJ1ZSgiTm90IFBPU0lYIiwgT3MuaXNGYW1pbHkoInVuaXgiKSk7CisgICAgICAgICAgICBzID0gbmV3IFBvc2l4UGVybWlzc2lvbnNTZWxlY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gc3ltbGlua3MgaGF2ZSBleGVjdXRlIGJpdCBzZXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShmb2xkZXIuZ2V0Um9vdCgpLCAibGluayIpOworICAgICAgICAgICAgUGF0aCBzeW1ib2xpY0xpbmsgPSBGaWxlcy5jcmVhdGVTeW1ib2xpY0xpbmsodGFyZ2V0LnRvUGF0aCgpLCBURVNUX0ZJTEUudG9QYXRoKCkpOworCisgICAgICAgICAgICBzLnNldFBlcm1pc3Npb25zKGFyZ3VtZW50KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUocy5pc1NlbGVjdGVkKG51bGwsIG51bGwsIHN5bWJvbGljTGluay50b0ZpbGUoKSkpOworICAgICAgICAgICAgcy5zZXRGb2xsb3dTeW1saW5rcyhmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShzLmlzU2VsZWN0ZWQobnVsbCwgbnVsbCwgc3ltYm9saWNMaW5rLnRvRmlsZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvUHJlc2VudFNlbGVjdG9yVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMDdiNjY0ZC4uYjQzZGU0NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3JUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9QcmVzZW50U2VsZWN0b3JUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCwxNiArMTgsMTYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlJ1bGU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5NYXBwZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKIC8qKgogICogVGVzdHMgUHJlc2VudCBTZWxlY3RvcnMKQEAgLTM1LDM0ICszNSwzOSBAQAogICovCiBwdWJsaWMgY2xhc3MgUHJlc2VudFNlbGVjdG9yVGVzdCB7CiAKKyAgICBwcml2YXRlIFByZXNlbnRTZWxlY3RvciBzOworCisgICAgcHJpdmF0ZSBGaWxlIGJlZGRpcjsKIAogICAgIEBSdWxlCiAgICAgcHVibGljIGZpbmFsIEJhc2VTZWxlY3RvclJ1bGUgc2VsZWN0b3JSdWxlID0gbmV3IEJhc2VTZWxlY3RvclJ1bGUoKTsKIAorICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcyA9IG5ldyBQcmVzZW50U2VsZWN0b3IoKTsKKyAgICAgICAgYmVkZGlyID0gc2VsZWN0b3JSdWxlLmdldEJlZGRpcigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yLgogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgewotICAgICAgICBQcmVzZW50U2VsZWN0b3IgcyA9IG5ldyBQcmVzZW50U2VsZWN0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuY3JlYXRlTWFwcGVyKCk7Ci0gICAgICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOwotICAgICAgICAgICAgZmFpbCgiUHJlc2VudFNlbGVjdG9yIGFsbG93ZWQgbW9yZSB0aGFuIG9uZSBuZXN0ZWQgbWFwcGVyLiIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTEpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIsCi0gICAgICAgICAgICAgICAgICAgIGJlMS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiQ2Fubm90IGRlZmluZSBtb3JlIHRoYW4gb25lIG1hcHBlciIpOworICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICBzLmNyZWF0ZU1hcHBlcigpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFByZXNlbnRTZWxlY3RvcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJQcmVzZW50U2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMikgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdGFyZ2V0ZGlyIGF0dHJpYnV0ZSBpcyByZXF1aXJlZC4iLAotICAgICAgICAgICAgICAgICAgICBiZTIuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBdHRyaWJ1dGVzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoZSB0YXJnZXRkaXIgYXR0cmlidXRlIGlzIHJlcXVpcmVkLiIpOworICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSwKKyAgICAgICAgICAgICAgICBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03MCw2NSArNzUsNjEgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXIoKSB7Ci0gICAgICAgIFByZXNlbnRTZWxlY3RvciBzOwotICAgICAgICBTdHJpbmcgcmVzdWx0czsKLSAgICAgICAgTWFwcGVyIG07CisgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKGJlZGRpcik7CisgICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVFRUVFRUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyMSgpIHsKKyAgICAgICAgcy5zZXRUYXJnZXRkaXIoYmVkZGlyKTsKKyAgICAgICAgTWFwcGVyIG0gPSBzLmNyZWF0ZU1hcHBlcigpOwogICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBpZGVudGl0eSA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOwogICAgICAgICBpZGVudGl0eS5zZXRWYWx1ZSgiaWRlbnRpdHkiKTsKLSAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgZ2xvYiA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOwotICAgICAgICBnbG9iLnNldFZhbHVlKCJnbG9iIik7Ci0gICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG1lcmdlID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7Ci0gICAgICAgIG1lcmdlLnNldFZhbHVlKCJtZXJnZSIpOworICAgICAgICBtLnNldFR5cGUoaWRlbnRpdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cjIoKSB7CisgICAgICAgIEZpbGUgc3ViZGlyID0gc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5yZXNvbHZlRmlsZSgiLi4vdGFza2RlZnMvZXhwZWN0ZWQiKTsKKyAgICAgICAgcy5zZXRUYXJnZXRkaXIoc3ViZGlyKTsKKyAgICAgICAgTWFwcGVyIG0gPSBzLmNyZWF0ZU1hcHBlcigpOwogICAgICAgICBNYXBwZXIuTWFwcGVyVHlwZSBmbGF0dGVuID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CiAgICAgICAgIGZsYXR0ZW4uc2V0VmFsdWUoImZsYXR0ZW4iKTsKLQotICAgICAgICBGaWxlIGJlZGRpciA9IHNlbGVjdG9yUnVsZS5nZXRCZWRkaXIoKTsKLQotICAgICAgICBzID0gbmV3IFByZXNlbnRTZWxlY3RvcigpOwotICAgICAgICBzLnNldFRhcmdldGRpcihiZWRkaXIpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKLQotICAgICAgICBzID0gbmV3IFByZXNlbnRTZWxlY3RvcigpOwotICAgICAgICBzLnNldFRhcmdldGRpcihiZWRkaXIpOwotICAgICAgICBtID0gcy5jcmVhdGVNYXBwZXIoKTsKLSAgICAgICAgbS5zZXRUeXBlKGlkZW50aXR5KTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVFRUVFRUIiwgcmVzdWx0cyk7Ci0KLSAgICAgICAgcyA9IG5ldyBQcmVzZW50U2VsZWN0b3IoKTsKLSAgICAgICAgRmlsZSBzdWJkaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYy9ldGMvdGVzdGNhc2VzL3Rhc2tkZWZzL2V4cGVjdGVkIik7Ci0gICAgICAgIHMuc2V0VGFyZ2V0ZGlyKHN1YmRpcik7Ci0gICAgICAgIG0gPSBzLmNyZWF0ZU1hcHBlcigpOwogICAgICAgICBtLnNldFR5cGUoZmxhdHRlbik7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRURiIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVFRUVFRUVFRURiIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFByZXNlbnRTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cjMoKSB7CiAgICAgICAgIHMuc2V0VGFyZ2V0ZGlyKGJlZGRpcik7Ci0gICAgICAgIG0gPSBzLmNyZWF0ZU1hcHBlcigpOworICAgICAgICBNYXBwZXIgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgIE1hcHBlci5NYXBwZXJUeXBlIG1lcmdlID0gbmV3IE1hcHBlci5NYXBwZXJUeXBlKCk7CisgICAgICAgIG1lcmdlLnNldFZhbHVlKCJtZXJnZSIpOwogICAgICAgICBtLnNldFR5cGUobWVyZ2UpOwogICAgICAgICBtLnNldFRvKCJhc2YtbG9nby5naWYuZ3oiKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVFRUVFRUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFRUVFRUVFRUVFRUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgUHJlc2VudFNlbGVjdG9yKCk7Ci0gICAgICAgIHN1YmRpciA9IG5ldyBGaWxlKGJlZGRpciwgInRhci9iejIiKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXI0KCkgeworICAgICAgICBGaWxlIHN1YmRpciA9IG5ldyBGaWxlKGJlZGRpciwgInRhci9iejIiKTsKICAgICAgICAgcy5zZXRUYXJnZXRkaXIoc3ViZGlyKTsKLSAgICAgICAgbSA9IHMuY3JlYXRlTWFwcGVyKCk7CisgICAgICAgIE1hcHBlciBtID0gcy5jcmVhdGVNYXBwZXIoKTsKKyAgICAgICAgTWFwcGVyLk1hcHBlclR5cGUgZ2xvYiA9IG5ldyBNYXBwZXIuTWFwcGVyVHlwZSgpOworICAgICAgICBnbG9iLnNldFZhbHVlKCJnbG9iIik7CiAgICAgICAgIG0uc2V0VHlwZShnbG9iKTsKICAgICAgICAgbS5zZXRGcm9tKCIqLmJ6MiIpOwogICAgICAgICBtLnNldFRvKCIqLnRhci5iejIiKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRkZURkZGRkZGRkZGIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRkZURkZGRkZGRkZGIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CisgICAgfQogCi0gICAgICAgIHMgPSBuZXcgUHJlc2VudFNlbGVjdG9yKCk7Ci0gICAgICAgIHN1YmRpciA9IG5ldyBGaWxlKHNlbGVjdG9yUnVsZS5nZXRPdXRwdXREaXIoKSwgInNlbGVjdG9ydGVzdDIiKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXI1KCkgeworICAgICAgICBGaWxlIHN1YmRpciA9IG5ldyBGaWxlKHNlbGVjdG9yUnVsZS5nZXRPdXRwdXREaXIoKSwgInNlbGVjdG9ydGVzdDIiKTsKICAgICAgICAgcy5zZXRUYXJnZXRkaXIoc3ViZGlyKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVFRURkZUVFRUVFRUIiwgcmVzdWx0cyk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVEZGVFRUVFRUVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVEZGVFRUVFRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRUVEZGVFRUVFRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3RvclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvU2lnbmVkU2VsZWN0b3JUZXN0LmphdmEKaW5kZXggMWViNDBkYy4uMzdhNTUyOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaWduZWRTZWxlY3RvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpZ25lZFNlbGVjdG9yVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9TaXplU2VsZWN0b3JUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3RvclRlc3QuamF2YQppbmRleCAzODE3OWMzLi43NTdiOWFkIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3RvclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1NpemVTZWxlY3RvclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDE1ICsxOCwxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogLyoqCiAgKiBUZXN0cyBTaXplIFNlbGVjdG9ycwpAQCAtMzcsMTQwICszOCwxNTEgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBmaW5hbCBCYXNlU2VsZWN0b3JSdWxlIHNlbGVjdG9yUnVsZSA9IG5ldyBCYXNlU2VsZWN0b3JSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBwcml2YXRlIFNpemVTZWxlY3RvciBzOworCisgICAgcHJpdmF0ZSBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zIGxlc3M7CisKKyAgICBwcml2YXRlIFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMgZXF1YWw7CisKKyAgICBwcml2YXRlIFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMgbW9yZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKworICAgICAgICBsZXNzID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKKyAgICAgICAgbGVzcy5zZXRWYWx1ZSgibGVzcyIpOworCisgICAgICAgIGVxdWFsID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKKyAgICAgICAgZXF1YWwuc2V0VmFsdWUoImVxdWFsIik7CisKKyAgICAgICAgbW9yZSA9IG5ldyBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zKCk7CisgICAgICAgIG1vcmUuc2V0VmFsdWUoIm1vcmUiKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBUZXN0IHRoZSBjb2RlIHRoYXQgdmFsaWRhdGVzIHRoZSBzZWxlY3Rvci4KICAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZSgpIHsKLSAgICAgICAgU2l6ZVNlbGVjdG9yIHMgPSBuZXcgU2l6ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJTaXplU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdmFsdWUgYXR0cmlidXRlIGlzIHJlcXVpcmVkLCBhbmQgbXVzdCAiCi0gICAgICAgICAgICAgICAgICAgICsgImJlIHBvc2l0aXZlIiwgYmUxLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVBdHRyaWJ1dGUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYW5kIG11c3QgYmUgcG9zaXRpdmUiKTsKKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlVmFsdWUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYW5kIG11c3QgYmUgcG9zaXRpdmUiKTsKICAgICAgICAgcy5zZXRWYWx1ZSgtMTApOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiU2l6ZVNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbHVlIGJlaW5nIGluIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICsgImFsbG93YWJsZSByYW5nZSIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTIpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHZhbHVlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCwgYW5kIG11c3QgIgotICAgICAgICAgICAgICAgICAgICArICJiZSBwb3NpdGl2ZSIsIGJlMi5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUF0dHJpYnV0ZU5hbWUoKSB7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiSW52YWxpZCBwYXJhbWV0ZXIgZ2FyYmFnZSBpbiIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0gPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHBhcmFtLnNldE5hbWUoImdhcmJhZ2UgaW4iKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7CiAgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IHtwYXJhbX07CiAgICAgICAgIHMuc2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwotICAgICAgICAgICAgZmFpbCgiU2l6ZVNlbGVjdG9yIGRpZCBub3QgY2hlY2sgZm9yIHZhbGlkIHBhcmFtZXRlciBlbGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHBhcmFtZXRlciBnYXJiYWdlIGluIiwgYmUzLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOwotICAgICAgICBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUF0dHJpYnV0ZVZhbHVlKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIkludmFsaWQgc2l6ZSBzZXR0aW5nIGdhcmJhZ2Ugb3V0Iik7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgcGFyYW0uc2V0TmFtZSgidmFsdWUiKTsKICAgICAgICAgcGFyYW0uc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7Ci0gICAgICAgIHBhcmFtc1swXSA9IHBhcmFtOworICAgICAgICBQYXJhbWV0ZXJbXSBwYXJhbXMgPSB7cGFyYW19OwogICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKLSAgICAgICAgICAgIGZhaWwoIlNpemVTZWxlY3RvciBhY2NlcHRlZCBiYWQgdmFsdWUgYXMgcGFyYW1ldGVyIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlNCkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbnZhbGlkIHNpemUgc2V0dGluZyBnYXJiYWdlIG91dCIsCi0gICAgICAgICAgICAgICAgICAgIGJlNC5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLAorICAgICAgICAgICAgICAgIHNlbGVjdG9yUnVsZS5nZXRGaWxlcygpWzBdKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZUF0dHJpYnV0ZVVuaXRzKCkgeworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImdhcmJhZ2Ugb3V0IGlzIG5vdCBhIGxlZ2FsIHZhbHVlIGZvciB0aGlzIGF0dHJpYnV0ZSIpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0xID0gbmV3IFBhcmFtZXRlcigpOwogICAgICAgICBQYXJhbWV0ZXIgcGFyYW0yID0gbmV3IFBhcmFtZXRlcigpOwogICAgICAgICBwYXJhbTEuc2V0TmFtZSgidmFsdWUiKTsKICAgICAgICAgcGFyYW0xLnNldFZhbHVlKCI1Iik7CiAgICAgICAgIHBhcmFtMi5zZXROYW1lKCJ1bml0cyIpOwogICAgICAgICBwYXJhbTIuc2V0VmFsdWUoImdhcmJhZ2Ugb3V0Iik7Ci0gICAgICAgIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMl07CisgICAgICAgIFBhcmFtZXRlcltdIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJbMl07CiAgICAgICAgIHBhcmFtc1swXSA9IHBhcmFtMTsKICAgICAgICAgcGFyYW1zWzFdID0gcGFyYW0yOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksIHNlbGVjdG9yUnVsZS5nZXRGaWxlbmFtZXMoKVswXSxzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJTaXplU2VsZWN0b3IgYWNjZXB0ZWQgYmFkIHVuaXRzIGFzIHBhcmFtZXRlciIpOwotICAgICAgICB9IGNhdGNoIChCdWlsZEV4Y2VwdGlvbiBiZTUpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZ2FyYmFnZSBvdXQgaXMgbm90IGEgbGVnYWwgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIiwKLSAgICAgICAgICAgICAgICAgICAgYmU1LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLQorICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgcy5pc1NlbGVjdGVkKHNlbGVjdG9yUnVsZS5nZXRQcm9qZWN0KCkuZ2V0QmFzZURpcigpLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZW5hbWVzKClbMF0sCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVzKClbMF0pOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzZWxlY3RvciBpcyBzZWxlY3RpbmcgZmlsZXMgY29ycmVjdGx5LgogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cigpIHsKLSAgICAgICAgU2l6ZVNlbGVjdG9yIHM7Ci0gICAgICAgIFN0cmluZyByZXN1bHRzOwotCi0gICAgICAgIFNpemVTZWxlY3Rvci5CeXRlVW5pdHMga2lsbyA9IG5ldyBTaXplU2VsZWN0b3IuQnl0ZVVuaXRzKCk7Ci0gICAgICAgIGtpbG8uc2V0VmFsdWUoIksiKTsKLSAgICAgICAgU2l6ZVNlbGVjdG9yLkJ5dGVVbml0cyBraWJpID0gbmV3IFNpemVTZWxlY3Rvci5CeXRlVW5pdHMoKTsKLSAgICAgICAga2liaS5zZXRWYWx1ZSgiS2kiKTsKLSAgICAgICAgU2l6ZVNlbGVjdG9yLkJ5dGVVbml0cyB0aWJpID0gbmV3IFNpemVTZWxlY3Rvci5CeXRlVW5pdHMoKTsKLSAgICAgICAgdGliaS5zZXRWYWx1ZSgiVGkiKTsKLSAgICAgICAgU2l6ZVNlbGVjdG9yLlNpemVDb21wYXJpc29ucyBsZXNzID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKLSAgICAgICAgbGVzcy5zZXRWYWx1ZSgibGVzcyIpOwotICAgICAgICBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zIGVxdWFsID0gbmV3IFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMoKTsKLSAgICAgICAgZXF1YWwuc2V0VmFsdWUoImVxdWFsIik7Ci0gICAgICAgIFNpemVTZWxlY3Rvci5TaXplQ29tcGFyaXNvbnMgbW9yZSA9IG5ldyBTaXplU2VsZWN0b3IuU2l6ZUNvbXBhcmlzb25zKCk7Ci0gICAgICAgIG1vcmUuc2V0VmFsdWUoIm1vcmUiKTsKLQotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJMZXNzKCkgewogICAgICAgICBzLnNldFZhbHVlKDEwKTsKICAgICAgICAgcy5zZXRXaGVuKGxlc3MpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURkZGRkZGRkZGRlQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJNb3JlKCkgewogICAgICAgICBzLnNldFZhbHVlKDEwKTsKICAgICAgICAgcy5zZXRXaGVuKG1vcmUpOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUVFRUVFRUVFRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJFcXVhbCgpIHsKICAgICAgICAgcy5zZXRWYWx1ZSgzMik7CiAgICAgICAgIHMuc2V0V2hlbihlcXVhbCk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZURkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cktpbG8oKSB7CisgICAgICAgIFNpemVTZWxlY3Rvci5CeXRlVW5pdHMga2lsbyA9IG5ldyBTaXplU2VsZWN0b3IuQnl0ZVVuaXRzKCk7CisgICAgICAgIGtpbG8uc2V0VmFsdWUoIksiKTsKICAgICAgICAgcy5zZXRWYWx1ZSg3KTsKICAgICAgICAgcy5zZXRXaGVuKG1vcmUpOwogICAgICAgICBzLnNldFVuaXRzKGtpbG8pOwotICAgICAgICByZXN1bHRzID0gc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRlRUVFRUVFQiLCByZXN1bHRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJURlRGRlRUVFRUVFQiLCBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpKTsKKyAgICB9CiAKLSAgICAgICAgcyA9IG5ldyBTaXplU2VsZWN0b3IoKTsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25CZWhhdmlvdXJLaWJpKCkgeworICAgICAgICBTaXplU2VsZWN0b3IuQnl0ZVVuaXRzIGtpYmkgPSBuZXcgU2l6ZVNlbGVjdG9yLkJ5dGVVbml0cygpOworICAgICAgICBraWJpLnNldFZhbHVlKCJLaSIpOwogICAgICAgICBzLnNldFZhbHVlKDcpOwogICAgICAgICBzLnNldFdoZW4obW9yZSk7CiAgICAgICAgIHMuc2V0VW5pdHMoa2liaSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGVEZGRlRURlRUVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGVEZGRlRURlRUVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91clRpYmkoKSB7CisgICAgICAgIFNpemVTZWxlY3Rvci5CeXRlVW5pdHMgdGliaSA9IG5ldyBTaXplU2VsZWN0b3IuQnl0ZVVuaXRzKCk7CisgICAgICAgIHRpYmkuc2V0VmFsdWUoIlRpIik7CiAgICAgICAgIHMuc2V0VmFsdWUoOTk5OTkpOwogICAgICAgICBzLnNldFdoZW4obW9yZSk7CiAgICAgICAgIHMuc2V0VW5pdHModGliaSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KIAotICAgICAgICBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91cigpIHsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMSA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMiA9IG5ldyBQYXJhbWV0ZXIoKTsKICAgICAgICAgUGFyYW1ldGVyIHBhcmFtMyA9IG5ldyBQYXJhbWV0ZXIoKTsKQEAgLTE4Miw4ICsxOTQsNyBAQAogICAgICAgICBwYXJhbTMuc2V0VmFsdWUoIm1vcmUiKTsKICAgICAgICAgUGFyYW1ldGVyW10gcGFyYW1zID0ge3BhcmFtMSwgcGFyYW0yLCBwYXJhbTN9OwogICAgICAgICBzLnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiVEZGRkZGRlRGRlRUIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVEZGRkZGRlRGRlRUIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIxOSwxNiArMjMwLDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RDYXNlSW5zZW5zaXRpdmVQYXJhbWV0ZXJQYXJzaW5nKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIFNpemVTZWxlY3RvciBzID0gbmV3IFNpemVTZWxlY3RvcigpOworICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZvbyBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiKTsKICAgICAgICAgUGFyYW1ldGVyIHAgPSBuZXcgUGFyYW1ldGVyKCk7CiAgICAgICAgIHAuc2V0TmFtZShuYW1lKTsKICAgICAgICAgcC5zZXRWYWx1ZSgiZm9vIik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzLnNldFBhcmFtZXRlcnMobmV3IFBhcmFtZXRlcltdIHtwfSk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgaGF2ZSBjYXVzZWQgYW4gZXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlKSB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyBpcyBub3QgYSBsZWdhbCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcy5zZXRQYXJhbWV0ZXJzKHApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVG9rZW5pemVkUGF0dGVyblRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVG9rZW5pemVkUGF0dGVyblRlc3QuamF2YQppbmRleCA0ZTk1YzJjLi4xZjE2ZjkzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1Rva2VuaXplZFBhdHRlcm5UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3R5cGVzL3NlbGVjdG9ycy9Ub2tlbml6ZWRQYXR0ZXJuVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtNjIsMTIgKzYyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgLndpdGhvdXRMYXN0VG9rZW4oKS5tYXRjaFBhdGgocCwgdHJ1ZSkpOwogICAgIH0KIAotICAgIEBUZXN0CiAgICAgLyoqCiAgICAgICogdGhpcyB0ZXN0IGlsbHVzdHJhdGVzIHRoZSBiZWhhdmlvciBkZXNjcmliZWQgaW4gYnVnemlsbGEgNTkxMTQKICAgICAgKiBtZWFuaW5nIHRoYXQgdGhlIHBhdHRlcm4gIioqIiBtYXRjaGVzIHRoZSBlbXB0eSBwYXRoCiAgICAgICogYnV0IHRoZSBwYXR0ZXJuICIqIiBkb2VzIG5vdAogICAgICAqLworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Rm9sZGVyV2l0aFN0YXJTdGFyKCkgewogICAgICAgICBUb2tlbml6ZWRQYXRoIHAgPSBUb2tlbml6ZWRQYXRoLkVNUFRZX1BBVEg7CiAgICAgICAgIGFzc2VydFRydWUobmV3IFRva2VuaXplZFBhdHRlcm4oU2VsZWN0b3JVdGlscy5ERUVQX1RSRUVfTUFUQ0gpLm1hdGNoUGF0aChwLCB0cnVlKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdHlwZXMvc2VsZWN0b3JzL1R5cGVTZWxlY3RvclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yVGVzdC5qYXZhCmluZGV4IGY2YmUyNDAuLmNkZTQ4MDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC90eXBlcy9zZWxlY3RvcnMvVHlwZVNlbGVjdG9yVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTksMTEgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIC8qKgogICogVGVzdHMgVHlwZSBTZWxlY3RvcnMuCkBAIC0zNCw0MyArMzUsNDYgQEAKICAgICBAUnVsZQogICAgIHB1YmxpYyBCYXNlU2VsZWN0b3JSdWxlIHNlbGVjdG9yUnVsZSA9IG5ldyBCYXNlU2VsZWN0b3JSdWxlKCk7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBwcml2YXRlIFR5cGVTZWxlY3RvciBzOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBzID0gbmV3IFR5cGVTZWxlY3RvcigpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRlc3QgdGhlIGNvZGUgdGhhdCB2YWxpZGF0ZXMgdGhlIHNlbGVjdG9yLgogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlKCkgewotICAgICAgICBUeXBlU2VsZWN0b3IgcyA9IG5ldyBUeXBlU2VsZWN0b3IoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHMuaXNTZWxlY3RlZChzZWxlY3RvclJ1bGUuZ2V0UHJvamVjdCgpLmdldEJhc2VEaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7Ci0gICAgICAgICAgICBmYWlsKCJUeXBlU2VsZWN0b3IgZGlkIG5vdCBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGJlMSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgdHlwZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQiLCBiZTEuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdE1lc3NhZ2UoIlRoZSB0eXBlIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCIpOworICAgICAgICBzLmlzU2VsZWN0ZWQoc2VsZWN0b3JSdWxlLmdldFByb2plY3QoKS5nZXRCYXNlRGlyKCksCisgICAgICAgICAgICAgICAgc2VsZWN0b3JSdWxlLmdldEZpbGVuYW1lcygpWzBdLCBzZWxlY3RvclJ1bGUuZ2V0RmlsZXMoKVswXSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHNlbGVjdG9yIGlzIHNlbGVjdGluZyBmaWxlcyBjb3JyZWN0bHkuCiAgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyKCkgewotICAgICAgICBUeXBlU2VsZWN0b3IgczsKLSAgICAgICAgU3RyaW5nIHJlc3VsdHM7Ci0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0aW9uQmVoYXZpb3VyRGlyKCkgewogICAgICAgICBUeXBlU2VsZWN0b3IuRmlsZVR5cGUgZGlyZWN0b3J5ID0gbmV3IFR5cGVTZWxlY3Rvci5GaWxlVHlwZSgpOwogICAgICAgICBkaXJlY3Rvcnkuc2V0VmFsdWUoImRpciIpOworCisgICAgICAgIHMuc2V0VHlwZShkaXJlY3RvcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkJlaGF2aW91ckZpbGUoKSB7CiAgICAgICAgIFR5cGVTZWxlY3Rvci5GaWxlVHlwZSBmaWxlID0gbmV3IFR5cGVTZWxlY3Rvci5GaWxlVHlwZSgpOwogICAgICAgICBmaWxlLnNldFZhbHVlKCJmaWxlIik7CiAKLSAgICAgICAgcyA9IG5ldyBUeXBlU2VsZWN0b3IoKTsKLSAgICAgICAgcy5zZXRUeXBlKGRpcmVjdG9yeSk7Ci0gICAgICAgIHJlc3VsdHMgPSBzZWxlY3RvclJ1bGUuc2VsZWN0aW9uU3RyaW5nKHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIlRGRkZGRkZGRkZGVCIsIHJlc3VsdHMpOwotCi0gICAgICAgIHMgPSBuZXcgVHlwZVNlbGVjdG9yKCk7CiAgICAgICAgIHMuc2V0VHlwZShmaWxlKTsKLSAgICAgICAgcmVzdWx0cyA9IHNlbGVjdG9yUnVsZS5zZWxlY3Rpb25TdHJpbmcocyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiRlRUVFRUVFRUVFRGIiwgcmVzdWx0cyk7CisgICAgICAgIGFzc2VydEVxdWFscygiRlRUVFRUVFRUVFRGIiwgc2VsZWN0b3JSdWxlLnNlbGVjdGlvblN0cmluZyhzKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9CYXNlNjRDb252ZXJ0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9CYXNlNjRDb252ZXJ0ZXJUZXN0LmphdmEKaW5kZXggNjFmZGZiYS4uN2IyYmUxZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQmFzZTY0Q29udmVydGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Jhc2U2NENvbnZlcnRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTI3LDE3ICsyOCwyMiBAQAogICovCiBwdWJsaWMgY2xhc3MgQmFzZTY0Q29udmVydGVyVGVzdCB7CiAKKyAgICBwcml2YXRlIEJhc2U2NENvbnZlcnRlciBiYXNlNjRDb252ZXJ0ZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGJhc2U2NENvbnZlcnRlciA9IG5ldyBCYXNlNjRDb252ZXJ0ZXIoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVWYWx1ZSgpIHsKLSAgICAgICAgYnl0ZVtdIG15Ynl0ZXMgPSB7MCwgMCwgKGJ5dGUpIDB4RkZ9OwotICAgICAgICBCYXNlNjRDb252ZXJ0ZXIgYmFzZTY0Q29udmVydGVyID0gbmV3IEJhc2U2NENvbnZlcnRlcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIkFBRC8iLCBiYXNlNjRDb252ZXJ0ZXIuZW5jb2RlKG15Ynl0ZXMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQUQvIiwKKyAgICAgICAgICAgICAgICBiYXNlNjRDb252ZXJ0ZXIuZW5jb2RlKG5ldyBieXRlW117MCwgMCwgKGJ5dGUpIDB4RkZ9KSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHsKLSAgICAgICAgYnl0ZVtdIG15Ynl0ZXMgPSAiSGVsbG8gV29ybGQiLmdldEJ5dGVzKCk7Ci0gICAgICAgIEJhc2U2NENvbnZlcnRlciBiYXNlNjRDb252ZXJ0ZXIgPSBuZXcgQmFzZTY0Q29udmVydGVyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiU0dWc2JHOGdWMjl5YkdRPSIsIGJhc2U2NENvbnZlcnRlci5lbmNvZGUobXlieXRlcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNHVnNiRzhnVjI5eWJHUT0iLAorICAgICAgICAgICAgICAgIGJhc2U2NENvbnZlcnRlci5lbmNvZGUoIkhlbGxvIFdvcmxkIi5nZXRCeXRlcygpKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ2xhc3NwYXRoVXRpbHNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlsc1Rlc3QuamF2YQppbmRleCAzY2ZmYTEwLi4zZWE5ZGMxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9DbGFzc3BhdGhVdGlsc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE5LDE1ICsxOSwxNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogCiAvKioKQEAgLTQ3LDkgKzQ3LDggQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9ubHlPbmVJbnN0YW5jZSgpIHsKLSAgICAgICAgRW51bWVyYXRpb24gZW51bWVyYXRpb247Ci0gICAgICAgIFN0cmluZyBsaXN0ID0gIiI7Ci0gICAgICAgIENsYXNzTG9hZGVyIGMgPSBDbGFzc3BhdGhVdGlscy5nZXRVbmlxdWVDbGFzc0xvYWRlckZvclBhdGgocCwgKFBhdGgpIG51bGwsIGZhbHNlKTsKKyAgICAgICAgRW51bWVyYXRpb248VVJMPiBlbnVtZXJhdGlvbjsKKyAgICAgICAgQ2xhc3NMb2FkZXIgYyA9IENsYXNzcGF0aFV0aWxzLmdldFVuaXF1ZUNsYXNzTG9hZGVyRm9yUGF0aChwLCBudWxsLCBmYWxzZSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBlbnVtZXJhdGlvbiA9IGMuZ2V0UmVzb3VyY2VzKAogICAgICAgICAgICAgICAgICJvcmcvYXBhY2hlL3Rvb2xzL2FudC90YXNrZGVmcy9kZWZhdWx0cy5wcm9wZXJ0aWVzIik7CkBAIC01OCwxMCArNTcsMTEgQEAKICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCB0aGUgZGVmYXVsdHMucHJvcGVydGllcyByZXNvdXJjZSIsIGUpOwogICAgICAgICB9CiAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgIHdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotICAgICAgICAgICAgbGlzdCA9IGxpc3QgKyAiICIgKyBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgbGlzdC5hcHBlbmQoIiAiKS5hcHBlbmQoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSk7CiAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBvbmx5IG9uZSBhbmQgbm90ICIgKyBjb3VudCArICIgIiArIGxpc3QsIGNvdW50ID09IDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBiZSBvbmx5IG9uZSBhbmQgbm90ICIgKyBjb3VudCArICIgIiArIGxpc3QsIDEsIGNvdW50KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db2xsZWN0aW9uVXRpbHNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Db2xsZWN0aW9uVXRpbHNUZXN0LmphdmEKaW5kZXggNDI1ZGM0Ny4uOWZiYjUxNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvQ29sbGVjdGlvblV0aWxzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0NvbGxlY3Rpb25VdGlsc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI1LDYgKzI1LDcgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC0zNiw2NyArMzcsNjcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZlY3RvckVxdWFscygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhudWxsLCBuZXcgVmVjdG9yKCkpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhuZXcgVmVjdG9yKCksIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhudWxsLCBuZXcgVmVjdG9yKCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhuZXcgVmVjdG9yKCksIG51bGwpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKG5ldyBWZWN0b3IoKSwgbmV3IFZlY3RvcigpKSk7Ci0gICAgICAgIFZlY3RvciB2MSA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgU3RhY2sgczIgPSBuZXcgU3RhY2soKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdjEgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAgICAgU3RhY2s8U3RyaW5nPiBzMiA9IG5ldyBTdGFjazw+KCk7CiAgICAgICAgIHYxLmFkZEVsZW1lbnQoImZvbyIpOwogICAgICAgICBzMi5wdXNoKCJmb28iKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwogICAgICAgICBhc3NlcnRUcnVlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMoczIsIHYxKSk7CiAgICAgICAgIHYxLmFkZEVsZW1lbnQoImJhciIpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOwogICAgICAgICBzMi5wdXNoKCJiYXIiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwogICAgICAgICBhc3NlcnRUcnVlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMoczIsIHYxKSk7CiAgICAgICAgIHMyLnB1c2goImJheiIpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOwogICAgICAgICB2MS5hZGRFbGVtZW50KCJiYXoiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwogICAgICAgICBhc3NlcnRUcnVlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMoczIsIHYxKSk7CiAgICAgICAgIHYxLmFkZEVsZW1lbnQoInp5enp5Iik7CiAgICAgICAgIHMyLnB1c2goInp5enp5MiIpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHYxLCBzMikpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHMyLCB2MSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERpY3Rpb25hcnlFcXVhbHMoKSB7Ci0gICAgICAgIGFzc2VydFRydWUoIUNvbGxlY3Rpb25VdGlscy5lcXVhbHMobnVsbCwgbmV3IEhhc2h0YWJsZSgpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIUNvbGxlY3Rpb25VdGlscy5lcXVhbHMobmV3IEhhc2h0YWJsZSgpLCBudWxsKSk7CisgICAgICAgIGFzc2VydEZhbHNlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMobnVsbCwgbmV3IEhhc2h0YWJsZSgpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKENvbGxlY3Rpb25VdGlscy5lcXVhbHMobmV3IEhhc2h0YWJsZSgpLCBudWxsKSk7CiAgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhuZXcgSGFzaHRhYmxlKCksIG5ldyBQcm9wZXJ0aWVzKCkpKTsKLSAgICAgICAgSGFzaHRhYmxlIGgxID0gbmV3IEhhc2h0YWJsZSgpOworICAgICAgICBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IGgxID0gbmV3IEhhc2h0YWJsZTw+KCk7CiAgICAgICAgIFByb3BlcnRpZXMgcDIgPSBuZXcgUHJvcGVydGllcygpOwogICAgICAgICBoMS5wdXQoImZvbyIsICIiKTsKICAgICAgICAgcDIucHV0KCJmb28iLCAiIik7CiAgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOwogICAgICAgICBoMS5wdXQoImJhciIsICIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKICAgICAgICAgcDIucHV0KCJiYXIiLCAiIik7CiAgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOwogICAgICAgICBwMi5wdXQoImJheiIsICIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKICAgICAgICAgaDEucHV0KCJiYXoiLCAiIik7CiAgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOwogICAgICAgICBoMS5wdXQoInp5enp5IiwgIiIpOwogICAgICAgICBwMi5wdXQoInp5enp5MiIsICIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhwMiwgaDEpKTsKICAgICAgICAgcDIucHV0KCJ6eXp6eSIsICIiKTsKICAgICAgICAgaDEucHV0KCJ6eXp6eTIiLCAiIik7CiAgICAgICAgIGFzc2VydFRydWUoQ29sbGVjdGlvblV0aWxzLmVxdWFscyhoMSwgcDIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOwogICAgICAgICBoMS5wdXQoImRhZGEiLCAiMSIpOwogICAgICAgICBwMi5wdXQoImRhZGEiLCAiMiIpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKGgxLCBwMikpOwotICAgICAgICBhc3NlcnRUcnVlKCFDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKGgxLCBwMikpOworICAgICAgICBhc3NlcnRGYWxzZShDb2xsZWN0aW9uVXRpbHMuZXF1YWxzKHAyLCBoMSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTUVsZW1lbnRXcml0ZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9ET01FbGVtZW50V3JpdGVyVGVzdC5qYXZhCmluZGV4IGY5YmYwOGIuLjI5MmI0ZjMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RPTUVsZW1lbnRXcml0ZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRE9NRWxlbWVudFdyaXRlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKQEAgLTQxLDkgKzQyLDkgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiJiMyMDsiLCB3LmlzUmVmZXJlbmNlKCImIzIwOyIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiJiN4MjA7Iiwgdy5pc1JlZmVyZW5jZSgiJiN4MjA7IikpOwogICAgICAgICBhc3NlcnRUcnVlKCImI3hBMDsiLCB3LmlzUmVmZXJlbmNlKCImI3hBMDsiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIiYjQTA7IiwgIXcuaXNSZWZlcmVuY2UoIiYjQTA7IikpOwotICAgICAgICBhc3NlcnRUcnVlKCIyMDsiLCAhdy5pc1JlZmVyZW5jZSgiMjA7IikpOwotICAgICAgICBhc3NlcnRUcnVlKCImIzIwIiwgIXcuaXNSZWZlcmVuY2UoIiYjMjAiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCImI0EwOyIsIHcuaXNSZWZlcmVuY2UoIiYjQTA7IikpOworICAgICAgICBhc3NlcnRGYWxzZSgiMjA7Iiwgdy5pc1JlZmVyZW5jZSgiMjA7IikpOworICAgICAgICBhc3NlcnRGYWxzZSgiJiMyMCIsIHcuaXNSZWZlcmVuY2UoIiYjMjAiKSk7CiAgICAgICAgIGFzc2VydFRydWUoIiZxdW90OyIsIHcuaXNSZWZlcmVuY2UoIiZxdW90OyIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiJmFwb3M7Iiwgdy5pc1JlZmVyZW5jZSgiJmFwb3M7IikpOwogICAgICAgICBhc3NlcnRUcnVlKCImZ3Q7Iiwgdy5pc1JlZmVyZW5jZSgiJmd0OyIpKTsKQEAgLTk5LDggKzEwMCw3IEBACiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKICAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgZm9vPVwiYmFyJiN4YTtiYXpcIiAvPiIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICAgICAgIHN3LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiPHJvb3QgZm9vPVwiYmFyJiN4YTtiYXpcIiAvPiVuIiksIHN3LnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMTEsMTggKzExMSwxOCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNMZWdhbENoYXJhY3RlcigpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgwMCIsICF3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAwMCcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIjB4MDAiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAwMCcpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgwOSIsIHcuaXNMZWdhbENoYXJhY3RlcignXHQnKSk7CiAgICAgICAgIGFzc2VydFRydWUoIjB4MEEiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1xuJykpOwogICAgICAgICBhc3NlcnRUcnVlKCIweDBDIiwgdy5pc0xlZ2FsQ2hhcmFjdGVyKCdccicpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgxRiIsICF3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAxRicpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIjB4MUYiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1MDAxRicpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiMHgyMCIsIHcuaXNMZWdhbENoYXJhY3RlcignXHUwMDIwJykpOwogICAgICAgICBhc3NlcnRUcnVlKCIweEQ3RkYiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RDdGRicpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiMHhEODAwIiwgIXcuaXNMZWdhbENoYXJhY3RlcignXHVEODAwJykpOwotICAgICAgICBhc3NlcnRUcnVlKCIweERGRkYiLCAhdy5pc0xlZ2FsQ2hhcmFjdGVyKCdcdURGRkYnKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCIweEQ4MDAiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RDgwMCcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIjB4REZGRiIsIHcuaXNMZWdhbENoYXJhY3RlcignXHVERkZGJykpOwogICAgICAgICBhc3NlcnRUcnVlKCIweEUwMDAiLCB3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RTAwMCcpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiMHhGRkZEIiwgdy5pc0xlZ2FsQ2hhcmFjdGVyKCdcdUZGRkQnKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIjB4RkZGRSIsICF3LmlzTGVnYWxDaGFyYWN0ZXIoJ1x1RkZGRScpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIjB4RkZGRSIsIHcuaXNMZWdhbENoYXJhY3RlcignXHVGRkZFJykpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDYsMTEgKzE0Niw4IEBACiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKICAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPHJvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICIgIDx0ZXh0RWxlbWVudD5jb250ZW50PC90ZXh0RWxlbWVudD4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICI8L3Jvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLAotICAgICAgICAgICAgICAgICAgICAgc3cudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCI8cm9vdD4lbiAgPHRleHRFbGVtZW50PmNvbnRlbnQ8L3RleHRFbGVtZW50PiVuPC9yb290PiVuIiksCisgICAgICAgICAgICAgICAgc3cudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE2MiwxMSArMTU5LDggQEAKICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPSBuZXcgRE9NRWxlbWVudFdyaXRlcigpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdD4iICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICsgIiAgPGNkYXRhRWxlbWVudD48IVtDREFUQVtjb250ZW50XV0+PC9jZGF0YUVsZW1lbnQ+IgotICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAotICAgICAgICAgICAgICAgICAgICAgKyAiPC9yb290PiIgKyBTdHJpbmdVdGlscy5MSU5FX1NFUCwKLSAgICAgICAgICAgICAgICAgICAgIHN3LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiPHJvb3Q+JW4gIDxjZGF0YUVsZW1lbnQ+PCFbQ0RBVEFbY29udGVudF1dPjwvY2RhdGFFbGVtZW50PiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPC9yb290PiVuIiksIHN3LnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzgsMTIgKzE3Miw3IEBACiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKICAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0gbmV3IERPTUVsZW1lbnRXcml0ZXIoKTsKICAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPHJvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICsgIiAgPGVtcHR5RWxlbWVudD48L2VtcHR5RWxlbWVudD4iCi0gICAgICAgICAgICAgICAgICAgICArICIgIDxlbXB0eUVsZW1lbnQgLz4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICI8L3Jvb3Q+IiArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLAotICAgICAgICAgICAgICAgICAgICAgc3cudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCI8cm9vdD4lbiAgPGVtcHR5RWxlbWVudCAvPiVuPC9yb290PiVuIiksIHN3LnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xOTUsOCArMTg0LDcgQEAKICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPSBuZXcgRE9NRWxlbWVudFdyaXRlcigpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdCBiYXI9XCJiYXpcIiAvPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAsIHN3LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiPHJvb3QgYmFyPVwiYmF6XCIgLz4lbiIpLCBzdy50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjA2LDEzICsxOTQsMTAgQEAKICAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUygidXJuOmZvbzIiLCAiYmFyIiwgImJheiIpOwogCiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0KLSAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOworICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPSBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeS5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdCBiYXI9XCJiYXpcIiB4bWxucz1cInVybjpmb29cIiAvPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAsIHN3LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiPHJvb3QgYmFyPVwiYmF6XCIgeG1sbnM9XCJ1cm46Zm9vXCIgLz4lbiIpLCBzdy50b1N0cmluZygpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjIyLDE0ICsyMDcsMTEgQEAKICAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUygidXJuOmZvbzIiLCAiYmFyIiwgImJheiIpOwogCiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0KLSAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5RVUFMSUZZX0FMTCk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9IG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAorICAgICAgICAgICAgICAgIERPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5LlFVQUxJRllfQUxMKTsKICAgICAgICAgdy53cml0ZShyb290LCBzdywgMCwgIiAgIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPHJvb3QgbnMwOmJhcj1cImJhelwiIHhtbG5zPVwidXJuOmZvb1wiIgotICAgICAgICAgICAgICAgICAgICAgKyAiIHhtbG5zOm5zMD1cInVybjpmb28yXCIgLz4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIjxyb290IG5zMDpiYXI9XCJiYXpcIiB4bWxucz1cInVybjpmb29cIiIKKyAgICAgICAgICAgICAgICAgICAgICsgIiB4bWxuczpuczA9XCJ1cm46Zm9vMlwiIC8+JW4iKSwgc3cudG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIzOSwxMSArMjIxLDExIEBACiAgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlTlMoInVybjpmb28yIiwgImJhciIsICJiYXoiKTsKIAogICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9Ci0gICAgICAgICAgICBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwgbmV3IERPTUVsZW1lbnRXcml0ZXIuWG1sTmFtZXNwYWNlUG9saWN5KGZhbHNlLCB0cnVlKSk7CisgICAgICAgIERPTUVsZW1lbnRXcml0ZXIgdyA9IG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAorICAgICAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeShmYWxzZSwgdHJ1ZSkpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdCBuczA6YmFyPVwiYmF6XCIgeG1sbnM6bnMwPVwidXJuOmZvbzJcIiAvPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAsIHN3LnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiPHJvb3QgbnMwOmJhcj1cImJhelwiIHhtbG5zOm5zMD1cInVybjpmb28yXCIgLz4lbiIpLAorICAgICAgICAgICAgICAgIHN3LnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNTMsMTcgKzIzNSwxMSBAQAogICAgICAgICBFbGVtZW50IGNoaWxkID0gZC5jcmVhdGVFbGVtZW50TlMoInVybjpmb28iLCAiY2hpbGQiKTsKICAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChjaGlsZCk7CiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0KLSAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOworICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPSBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeS5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdCB4bWxucz1cInVybjpmb29cIj4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICIgIDxjaGlsZCAvPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICsgIjwvcm9vdD4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIjxyb290IHhtbG5zPVwidXJuOmZvb1wiPiVuICA8Y2hpbGQgLz4lbjwvcm9vdD4lbiIpLAorICAgICAgICAgICAgICAgIHN3LnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yNzksMjQgKzI1NSwxNSBAQAogICAgICAgICBFbGVtZW50IGNoaWxkMyA9IGQuY3JlYXRlRWxlbWVudE5TKCJ1cm46Zm9vMiIsICJjaGlsZCIpOwogICAgICAgICByb290LmFwcGVuZENoaWxkKGNoaWxkMyk7CiAgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgRE9NRWxlbWVudFdyaXRlciB3ID0KLSAgICAgICAgICAgIG5ldyBET01FbGVtZW50V3JpdGVyKGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NRWxlbWVudFdyaXRlci5YbWxOYW1lc3BhY2VQb2xpY3kKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOworICAgICAgICBET01FbGVtZW50V3JpdGVyIHcgPSBuZXcgRE9NRWxlbWVudFdyaXRlcihmYWxzZSwKKyAgICAgICAgICAgICAgICBET01FbGVtZW50V3JpdGVyLlhtbE5hbWVzcGFjZVBvbGljeS5PTkxZX1FVQUxJRllfRUxFTUVOVFMpOwogICAgICAgICB3LndyaXRlKHJvb3QsIHN3LCAwLCAiICAiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8cm9vdCB4bWxucz1cInVybjpmb29cIj4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICIgIDxuczA6Y2hpbGQgeG1sbnM6bnMwPVwidXJuOmZvbzJcIiAvPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICsgIiAgPG5zMTpjaGlsZCB4bWxuczpuczE9XCJ1cm46Zm9vMlwiPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICsgIiAgICA8bnMxOmdyYW5kY2hpbGQgLz4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQCi0gICAgICAgICAgICAgICAgICAgICArICIgIDwvbnMxOmNoaWxkPiIKLSAgICAgICAgICAgICAgICAgICAgICsgU3RyaW5nVXRpbHMuTElORV9TRVAKLSAgICAgICAgICAgICAgICAgICAgICsgIiAgPG5zMjpjaGlsZCB4bWxuczpuczI9XCJ1cm46Zm9vMlwiIC8+IgotICAgICAgICAgICAgICAgICAgICAgKyBTdHJpbmdVdGlscy5MSU5FX1NFUAotICAgICAgICAgICAgICAgICAgICAgICsgIjwvcm9vdD4iCi0gICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1V0aWxzLkxJTkVfU0VQLCBzdy50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIjxyb290IHhtbG5zPVwidXJuOmZvb1wiPiVuIgorICAgICAgICAgICAgICAgICsgIiAgPG5zMDpjaGlsZCB4bWxuczpuczA9XCJ1cm46Zm9vMlwiIC8+JW4iCisgICAgICAgICAgICAgICAgKyAiICA8bnMxOmNoaWxkIHhtbG5zOm5zMT1cInVybjpmb28yXCI+JW4iCisgICAgICAgICAgICAgICAgKyAiICAgIDxuczE6Z3JhbmRjaGlsZCAvPiVuIgorICAgICAgICAgICAgICAgICsgIiAgPC9uczE6Y2hpbGQ+JW4iCisgICAgICAgICAgICAgICAgKyAiICA8bnMyOmNoaWxkIHhtbG5zOm5zMj1cInVybjpmb28yXCIgLz4lbiIKKyAgICAgICAgICAgICAgICArICI8L3Jvb3Q+JW4iKSwgc3cudG9TdHJpbmcoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGF0ZVV0aWxzVGVzdC5qYXZhCmluZGV4IGNhMjIzZDkuLjljOGU5OTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0RhdGVVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EYXRlVXRpbHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC00Myw3ICs0Myw5IEBACiAgICAgICAgIGFzc2VydEVxdWFscygiMiBtaW51dGVzIDEgc2Vjb25kIiwgdGV4dCk7CiAgICAgfQogCi0gICAgLy8gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDQ2NTkKKyAgICAvKioKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ0NjU5Ij5idWcgNDQ2NTk8L2E+CisgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0VsYXBzZWRUaW1lKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMoIjI5MjYgbWludXRlcyAxMyBzZWNvbmRzIiwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Rld2V5RGVjaW1hbFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0Rld2V5RGVjaW1hbFRlc3QuamF2YQppbmRleCBlOGU4Y2JkLi44ZTEzYjBiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9EZXdleURlY2ltYWxUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRGV3ZXlEZWNpbWFsVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTIgKzE4LDEzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKIHB1YmxpYyBjbGFzcyBEZXdleURlY2ltYWxUZXN0IHsKIAogICAgIEBUZXN0CkBAIC01NSwyMyArNTYsNzYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpLmVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikuZXF1YWxzKG5ldyBEZXdleURlY2ltYWwoIjEuMi40IikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMCIpLmVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIiKSkpOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMiIpLmVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMCIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpLCBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIiksIG5ldyBEZXdleURlY2ltYWwoIjEuMi40IikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERld2V5RGVjaW1hbCgiMS4yLjAiKSwgbmV3IERld2V5RGVjaW1hbCgiMS4yIikpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERld2V5RGVjaW1hbCgiMS4yIiksIG5ldyBEZXdleURlY2ltYWwoIjEuMi4wIikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgY29tcGFyZVRvKCkgewogICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikuY29tcGFyZVRvKG5ldyBEZXdleURlY2ltYWwoIjEuMiIpKSA+IDApOwogICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMiIpLmNvbXBhcmVUbyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpKSA8IDApOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikuY29tcGFyZVRvKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikpID09IDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IERld2V5RGVjaW1hbCgiMS4yLjMiKS5jb21wYXJlVG8obmV3IERld2V5RGVjaW1hbCgiMS4yLjMiKSkpOwogICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikuY29tcGFyZVRvKG5ldyBEZXdleURlY2ltYWwoIjEuMS40IikpID4gMCk7CiAgICAgICAgIGFzc2VydFRydWUobmV3IERld2V5RGVjaW1hbCgiMS4yLjMiKS5jb21wYXJlVG8obmV3IERld2V5RGVjaW1hbCgiMS4yLjIuOSIpKSA+IDApOwotICAgICAgICBhc3NlcnRUcnVlKG5ldyBEZXdleURlY2ltYWwoIjEuMi4wIikuY29tcGFyZVRvKG5ldyBEZXdleURlY2ltYWwoIjEuMiIpKSA9PSAwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRGV3ZXlEZWNpbWFsKCIxLjIiKS5jb21wYXJlVG8obmV3IERld2V5RGVjaW1hbCgiMS4yLjAiKSkgPT0gMCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMCIpLmNvbXBhcmVUbyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbmV3IERld2V5RGVjaW1hbCgiMS4yIikuY29tcGFyZVRvKG5ldyBEZXdleURlY2ltYWwoIjEuMi4wIikpKTsKICAgICB9CiAKLSAgICAvLyBUT0RPIGlzR3JlYXRlclRoYW4sIC4uLgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaW50Q29uc3RydWN0b3IoKSB7CisgICAgICAgIGludFtdIGFyZ3MgPSB7MSwyLDN9OworICAgICAgICBhc3NlcnRFcXVhbHMoIjEuMi4zIiwgbmV3IERld2V5RGVjaW1hbChhcmdzKS50b1N0cmluZygpKTsKKyAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGludENvbnN0cnVjdG9yTmVnYXRpdmVWYWx1ZXMoKSB7CisgICAgICAgIGludFtdIGFyZ3MgPSB7LTEsLTIsLTN9OworICAgICAgICBhc3NlcnRFcXVhbHMoIi0xLi0yLi0zIiwgbmV3IERld2V5RGVjaW1hbChhcmdzKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRldGFpbHMoKSB7CisgICAgICAgICBEZXdleURlY2ltYWwgZGQgPSBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpOworICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGRkLmdldFNpemUoKSk7CisgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZGQuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzR3JlYXRlclRoYW5PckVxdWFsKCkgeworICAgICAgICAgRGV3ZXlEZWNpbWFsIGZpcnN0ID0gbmV3IERld2V5RGVjaW1hbCgiMS4yLjMiKTsKKyAgICAgICAgIGFzc2VydFRydWUoZmlyc3QuaXNHcmVhdGVyVGhhbk9yRXF1YWwobmV3IERld2V5RGVjaW1hbCgiMSIpKSk7CisgICAgICAgICBhc3NlcnRUcnVlKGZpcnN0LmlzR3JlYXRlclRoYW5PckVxdWFsKG5ldyBEZXdleURlY2ltYWwoIjEuMiIpKSk7CisgICAgICAgICBhc3NlcnRUcnVlKGZpcnN0LmlzR3JlYXRlclRoYW5PckVxdWFsKG5ldyBEZXdleURlY2ltYWwoIjEuMi4zIikpKTsKKyAgICAgICAgIGFzc2VydFRydWUoZmlyc3QuaXNHcmVhdGVyVGhhbk9yRXF1YWwobmV3IERld2V5RGVjaW1hbCgiMS4yLjMuMCIpKSk7CisgICAgICAgICBhc3NlcnRGYWxzZShmaXJzdC5pc0dyZWF0ZXJUaGFuT3JFcXVhbChuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuNCIpKSk7CisgICAgICAgICBhc3NlcnRGYWxzZShmaXJzdC5pc0dyZWF0ZXJUaGFuT3JFcXVhbChuZXcgRGV3ZXlEZWNpbWFsKCIxLjMiKSkpOworICAgICAgICAgYXNzZXJ0RmFsc2UoZmlyc3QuaXNHcmVhdGVyVGhhbk9yRXF1YWwobmV3IERld2V5RGVjaW1hbCgiMiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBlcXVhbHMoKSB7CisgICAgICAgICBEZXdleURlY2ltYWwgZGQgPSBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpOworICAgICAgICAgYXNzZXJ0RmFsc2UoZGQuZXF1YWxzKCJvdGhlciIpKTsKKyAgICAgICAgIGFzc2VydEZhbHNlKGRkLmVxdWFscyhudWxsKSk7CisgICAgICAgICBhc3NlcnRUcnVlKGRkLmVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpKSk7CisgICAgICAgICBhc3NlcnRUcnVlKGRkLmVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMy4wIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGlzTGVzc1RoYW4oKSB7CisgICAgICAgICBEZXdleURlY2ltYWwgZGQgPSBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpOworICAgICAgICAgYXNzZXJ0VHJ1ZShkZC5pc0xlc3NUaGFuKG5ldyBEZXdleURlY2ltYWwoIjIiKSkpOworICAgICAgICAgYXNzZXJ0RmFsc2UoZGQuaXNMZXNzVGhhbihuZXcgRGV3ZXlEZWNpbWFsKCIxIikpKTsKKyAgICAgICAgIGFzc2VydEZhbHNlKGRkLmlzTGVzc1RoYW4obmV3IERld2V5RGVjaW1hbCgiMS4yLjMiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaXNMZXNzVGhhbk9yRXF1YWwoKSB7CisgICAgICAgICBEZXdleURlY2ltYWwgZGQgPSBuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpOworICAgICAgICAgYXNzZXJ0VHJ1ZShkZC5pc0xlc3NUaGFuT3JFcXVhbChuZXcgRGV3ZXlEZWNpbWFsKCIyIikpKTsKKyAgICAgICAgIGFzc2VydEZhbHNlKGRkLmlzTGVzc1RoYW5PckVxdWFsKG5ldyBEZXdleURlY2ltYWwoIjEiKSkpOworICAgICAgICAgYXNzZXJ0VHJ1ZShkZC5pc0xlc3NUaGFuT3JFcXVhbChuZXcgRGV3ZXlEZWNpbWFsKCIxLjIuMyIpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvRmlsZVV0aWxzVGVzdC5qYXZhCmluZGV4IDk4NzdlNzEuLmZjNTg0NTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0ZpbGVVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9GaWxlVXRpbHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSwxOCArMjEsMzIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljVGVzdE5hbWVzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLk9zOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzLmdldEZpbGVVdGlsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHMuaXNDYXNlU2Vuc2l0aXZlRmlsZVN5c3RlbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5GaWxlVXRpbHMuaXNDb250ZXh0UmVsYXRpdmVQYXRoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5zdGFydHNXaXRoOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lRmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3N1bWUuYXNzdW1lVHJ1ZTsKIApAQCAtNDIsOCArNTYsMTMgQEAKICAqLwogcHVibGljIGNsYXNzIEZpbGVVdGlsc1Rlc3QgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZVV0aWxzIEZJTEVfVVRJTFMgPSBGaWxlVXRpbHMuZ2V0RmlsZVV0aWxzKCk7Ci0gICAgcHJpdmF0ZSBGaWxlIHJlbW92ZVRoaXM7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGVtcG9yYXJ5Rm9sZGVyIGZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gU3lzdGVtLmdldFByb3BlcnR5KE1hZ2ljVGVzdE5hbWVzLlRFU1RfUk9PVF9ESVJFQ1RPUlkpOwogICAgIHByaXZhdGUgU3RyaW5nIHJvb3Q7CiAKICAgICBAQmVmb3JlCkBAIC01MiwxNSArNzEsNiBAQAogICAgICAgICByb290ID0gbmV3IEZpbGUoRmlsZS5zZXBhcmF0b3IpLmdldEFic29sdXRlUGF0aCgpLnRvVXBwZXJDYXNlKCk7CiAgICAgfQogCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0gICAgICAgIGlmIChyZW1vdmVUaGlzICE9IG51bGwgJiYgcmVtb3ZlVGhpcy5leGlzdHMoKSkgewotICAgICAgICAgICAgaWYgKCFyZW1vdmVUaGlzLmRlbGV0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlVGhpcy5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQogICAgIC8qKgogICAgICAqIHRlc3QgbW9kaWZpY2F0aW9uLgogICAgICAqIFNpbmNlIEFudDEuNywgdGhlIG1ldGhvZCBiZWluZyB0ZXN0ZWQgbm8gbG9uZ2VyIHVzZXMKQEAgLTczLDE2ICs4MywxNiBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldExhc3RNb2RpZmllZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbW92ZVRoaXMgPSBuZXcgRmlsZSgiZHVtbXkiKTsKLSAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZW1vdmVUaGlzKTsKLSAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlWzBdKTsKLSAgICAgICAgZm9zLmNsb3NlKCk7Ci0gICAgICAgIGFzc3VtZVRydWUoIkNvdWxkIG5vdCBjaGFuZ2UgZmlsZSBtb2RpZmllZCB0aW1lIiwgcmVtb3ZlVGhpcy5zZXRMYXN0TW9kaWZpZWQocmVtb3ZlVGhpcy5sYXN0TW9kaWZpZWQoKSAtIDIwMDApKTsKKyAgICAgICAgRmlsZSByZW1vdmVUaGlzID0gZm9sZGVyLm5ld0ZpbGUoImR1bW15Iik7CisgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShyZW1vdmVUaGlzKSkgeworICAgICAgICAgICAgZm9zLndyaXRlKG5ldyBieXRlWzBdKTsKKyAgICAgICAgfQorICAgICAgICBhc3N1bWVUcnVlKCJDb3VsZCBub3QgY2hhbmdlIGZpbGUgbW9kaWZpZWQgdGltZSIsCisgICAgICAgICAgICAgICAgcmVtb3ZlVGhpcy5zZXRMYXN0TW9kaWZpZWQocmVtb3ZlVGhpcy5sYXN0TW9kaWZpZWQoKSAtIDIwMDApKTsKICAgICAgICAgbG9uZyBtb2RUaW1lID0gcmVtb3ZlVGhpcy5sYXN0TW9kaWZpZWQoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShtb2RUaW1lICE9IDApOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoMCwgbW9kVGltZSk7CiAKLQotICAgICAgICBGSUxFX1VUSUxTLnNldEZpbGVMYXN0TW9kaWZpZWQocmVtb3ZlVGhpcywgLTEpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5zZXRGaWxlTGFzdE1vZGlmaWVkKHJlbW92ZVRoaXMsIC0xKTsKICAgICAgICAgbG9uZyBzZWNvbmRNb2RUaW1lID0gcmVtb3ZlVGhpcy5sYXN0TW9kaWZpZWQoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShzZWNvbmRNb2RUaW1lID4gbW9kVGltZSk7CiAKQEAgLTkxLDcgKzEwMSw3IEBACiAgICAgICAgIC8vIGluIGEgcHJldmlvdXMgdmVyc2lvbiwgdGhlIGRhdGUgb2YgdGhlIGZpbGUgd2FzIHNldCB0byAxMjM0NTYKICAgICAgICAgLy8gbWlsbGlzZWNvbmRzIHNpbmNlIDAxLjAxLjE5NzAKICAgICAgICAgLy8gaXQgZGlkIG5vdCB3b3JrIG9uIGEgY29tcHV0ZXIgcnVubmluZyBKREsgMS40LjFfMDIgKyBXaW5kb3dzIDIwMDAKLSAgICAgICAgRklMRV9VVElMUy5zZXRGaWxlTGFzdE1vZGlmaWVkKHJlbW92ZVRoaXMsIHNlY29uZE1vZFRpbWUgKyBtaWxsaXNwZXJkYXkpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5zZXRGaWxlTGFzdE1vZGlmaWVkKHJlbW92ZVRoaXMsIHNlY29uZE1vZFRpbWUgKyBtaWxsaXNwZXJkYXkpOwogICAgICAgICBsb25nIHRoaXJkTW9kVGltZSA9IHJlbW92ZVRoaXMubGFzdE1vZGlmaWVkKCk7CiAgICAgICAgIC8qCiAgICAgICAgICAqIEkgd291bGQgbG92ZSB0byBjb21wYXJlIHRoaXMgd2l0aCAxMjM0NTYsIGJ1dCBkZXBlbmRpbmcgb24KQEAgLTk5LDIyNiArMTA5LDIzMyBAQAogICAgICAgICAgKgogICAgICAgICAgKiBKdXN0IGFzc2VydCB0aGUgdGltZSBoYXMgY2hhbmdlZC4KICAgICAgICAgICovCi0gICAgICAgIGFzc2VydFRydWUodGhpcmRNb2RUaW1lICE9IHNlY29uZE1vZFRpbWUpOworICAgICAgICBhc3NlcnROb3RFcXVhbHModGhpcmRNb2RUaW1lLCBzZWNvbmRNb2RUaW1lKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRmlsZSgpIHsKLSAgICAgICAgaWYgKCEoT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgIlxcIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShsb2NhbGl6ZShGaWxlLnNlcGFyYXRvciksCi0gICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCAiLyIpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UobG9jYWxpemUoRmlsZS5zZXBhcmF0b3IpLAotICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgIlxcIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiB0aHJvdyBpbiBkcml2ZSBsZXR0ZXJzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjTG93ZXIgPSAiYzoiOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIlxcIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBwcm9taXNlZCB0byBlbGltaW5hdGUgY29uc2VjdXRpdmUgc2xhc2hlcyBhZnRlciBkcml2ZSBsZXR0ZXIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIi8vLy8vIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZpbGVQb3NpeCgpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiRE9TIG9yIE5ldFdhcmUiLCAhT3MuaXNGYW1pbHkoImRvcyIpICYmICFPcy5pc0ZhbWlseSgibmV0d2FyZSIpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZS5zZXBhcmF0b3IsIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsICJcXCIpLmdldFBhdGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZpbGVEb3NPck5ldHdhcmUoKSB7CisgICAgICAgIGFzc3VtZVRydWUoIk5vdCBET1Mgb3IgTmV0d2FyZSIsIE9zLmlzRmFtaWx5KCJkb3MiKSB8fCBPcy5pc0ZhbWlseSgibmV0d2FyZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGxvY2FsaXplKEZpbGUuc2VwYXJhdG9yKSwKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShsb2NhbGl6ZShGaWxlLnNlcGFyYXRvciksCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogdGhyb3cgaW4gZHJpdmUgbGV0dGVycworICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJDOiI7CisgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAorICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICIvIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlY0xvd2VyICsgIlxcIiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWNMb3dlciArICJcXCIpLmdldFBhdGgoKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KKyAgICAgICAgICovCisgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAorICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAorICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICJcXFxcXFxcXFxcXFwiKS5nZXRQYXRoKCkpOworCiAgICAgICAgIGlmIChPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogdGhyb3cgaW4gTmV0V2FyZSB2b2x1bWUgbmFtZXMKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlYyA9ICJTWVM6IjsKKyAgICAgICAgICAgIGRyaXZlU3BlYyA9ICJTWVM6IjsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gInN5czoiOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgZHJpdmVTcGVjTG93ZXIgPSAic3lzOiI7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjTG93ZXIgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoIShPcy5pc0ZhbWlseSgiZG9zIikpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogZHJpdmUgbGV0dGVycyBtdXN0IGJlIGNvbnNpZGVyZWQganVzdCBub3JtYWwgZmlsZW5hbWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjID0gIkM6IjsKLSAgICAgICAgICAgIFN0cmluZyB1ZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlYyArICIvIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBkcml2ZVNwZWNMb3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlY0xvd2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIikuZ2V0UGF0aCgpKTsKICAgICAgICAgfQotCisgICAgfQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVGaWxlTm90RG9zKCkgeworICAgICAgICBhc3N1bWVGYWxzZSgiaXMgRE9TIiwgT3MuaXNGYW1pbHkoImRvcyIpKTsKICAgICAgICAgLyoKLSAgICAgICAgICogTm93IHRlc3Qgc29tZSByZWxhdGl2ZSBmaWxlIG5hbWUgbWFnaWMuCisgICAgICAgICAqIGRyaXZlIGxldHRlcnMgbXVzdCBiZSBjb25zaWRlcmVkIGp1c3Qgbm9ybWFsIGZpbGVuYW1lcy4KICAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICBTdHJpbmcgdWRpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlYywKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5yZXNvbHZlRmlsZShudWxsLCBkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1ZGlyICsgRmlsZS5zZXBhcmF0b3IgKyBkcml2ZVNwZWMsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3RyaW5nIGRyaXZlU3BlY0xvd2VyID0gImM6IjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVkaXIgKyBGaWxlLnNlcGFyYXRvciArIGRyaXZlU3BlY0xvd2VyLAorICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG51bGwsIGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHModWRpciArIEZpbGUuc2VwYXJhdG9yICsgZHJpdmVTcGVjTG93ZXIsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgIH0KKworICAgIC8qCisgICAgICogVGVzdCBzb21lIHJlbGF0aXZlIGZpbGUgbmFtZSBtYWdpYy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlUmVsYXRpdmVGaWxlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICI0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICI0IikuZ2V0UGF0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi80IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLzQiKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuXFw0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuXFw0IikuZ2V0UGF0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZXNvbHZlRmlsZShuZXcgRmlsZShsb2NhbGl6ZSgiLzEvMi8zIikpLCAiLi8uXFw0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLy5cXDQiKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLi8zLzQiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uLzMvNCIpLmdldFBhdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uXFwzXFw0IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLlxcM1xcNCIpLmdldFBhdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uLy4uLzUvLi4vLi8yLy4vMy82Ly4uLzQiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xLzIvMyIpKSwgIi4uLy4uLzUvLi4vLi8yLy4vMy82Ly4uLzQiKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLlxcLi4vNS8uLlxcLi8yLy4vMy82XFwuLi80IikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMS8yLzMiKSksICIuLlxcLi4vNS8uLlxcLi8yLy4vMy82XFwuLi80IikuZ2V0UGF0aCgpKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoIm1lYW5pbmdsZXNzIHJlc3VsdCBidXQgbm8gZXhjZXB0aW9uIiwKICAgICAgICAgICAgICAgICBuZXcgRmlsZShsb2NhbGl6ZSgiLzEvLi4vLi4vYiIpKSwKLSAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLnJlc29sdmVGaWxlKG5ldyBGaWxlKGxvY2FsaXplKCIvMSIpKSwgIi4uLy4uL2IiKSk7CisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobmV3IEZpbGUobG9jYWxpemUoIi8xIikpLCAiLi4vLi4vYiIpKTsKIAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZSgpIHsKLSAgICAgICAgaWYgKCEoT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU3RhcnQgd2l0aCBzaW1wbGUgYWJzb2x1dGUgZmlsZSBuYW1lcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKCIvIikuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhGaWxlLnNlcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoIi8iKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgIGZhaWwoIm5vcm1hbGl6ZWQgXCIvXCIgb24gZG9zIG9yIG5ldHdhcmUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgIGZhaWwoIm5vcm1hbGl6ZWQgXCJcXFwiIG9uIGRvcyBvciBuZXR3YXJlIik7Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVBvc2l4KCkgeworICAgICAgICBhc3N1bWVUcnVlKCJET1Mgb3IgTmV0V2FyZSIsICFPcy5pc0ZhbWlseSgiZG9zIikgJiYgIU9zLmlzRmFtaWx5KCJuZXR3YXJlIikpOworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCB3aXRoIHNpbXBsZSBhYnNvbHV0ZSBmaWxlIG5hbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGUuc2VwYXJhdG9yLCBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoIi8iKS5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmlsZS5zZXBhcmF0b3IsIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZSgiXFwiKS5nZXRQYXRoKCkpOwogCisgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOworICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLCBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjKS5nZXRQYXRoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZVNsYXNoRG9zT3JOZXR3YXJlKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJOb3QgRE9TIG9yIE5ldHdhcmUiLCBPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoIi8iKS5nZXRQYXRoKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplQmFja1NsYXNoRG9zT3JOZXR3YXJlKCkgeworICAgICAgICBhc3N1bWVUcnVlKCJOb3QgRE9TIG9yIE5ldHdhcmUiLCBPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSk7CisgICAgICAgIHRocm93bi5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoIlxcIikuZ2V0UGF0aCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZURvc09yTmV0d2FyZSgpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiTm90IERPUyBvciBOZXR3YXJlIiwgT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpOwogICAgICAgICBpZiAoT3MuaXNGYW1pbHkoImRvcyIpKSB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogdGhyb3cgaW4gZHJpdmUgbGV0dGVycwogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBTdHJpbmcgZHJpdmVTcGVjID0gIkM6IjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlYykuZ2V0UGF0aCgpOwotICAgICAgICAgICAgICAgICBmYWlsKGRyaXZlU3BlYyArICIgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLyIpLmdldFBhdGgoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjICsgIlxcIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJjOiI7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiLyIpLmdldFBhdGgoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjTG93ZXIgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIlxcIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIlxcIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBwcm9taXNlZCB0byBlbGltaW5hdGUgY29uc2VjdXRpdmUgc2xhc2hlcyBhZnRlciBkcml2ZSBsZXR0ZXIuCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMgKyAiXFwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlYyArICIvLy8vLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLy8vLy8iKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiXFxcXFxcXFxcXFxcIikuZ2V0UGF0aCgpKTsKKworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgZXhjZXB0aW9uIGNhdWdodAorICAgICAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjKS5nZXRQYXRoKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgewogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIHRocm93IGluIE5ldFdhcmUgdm9sdW1lIG5hbWVzCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiU1lTOiI7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZHJpdmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlYykuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGRyaXZlU3BlYykuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8iKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWNMb3dlciA9ICJzeXM6IjsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlcikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiLyIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlciArICIvIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjTG93ZXIgKyAiXFwiKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYyArICJcXGp1bmsiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlY0xvd2VyICsgIlxcanVuayIpLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShkcml2ZVNwZWNMb3dlciArICJcXGp1bmsiKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIHByb21pc2VkIHRvIGVsaW1pbmF0ZSBjb25zZWN1dGl2ZSBzbGFzaGVzIGFmdGVyIGRyaXZlIGxldHRlci4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRyaXZlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShkcml2ZVNwZWMgKyAiLy8vLy8iKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIi8vLy8vIikuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFN0cmluZyBkcml2ZVNwZWMgPSAiQzoiOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkcml2ZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGRyaXZlU3BlYykuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBmYWlsdXJlLCBDOiBpc24ndCBhbiBhYnNvbHV0ZSBwYXRoIG9uIG90aGVyIG9zJ3MiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBQYXNzZWQgdGVzdAotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUoZHJpdmVTcGVjICsgIlxcXFxcXFxcXFxcXCIpLmdldFBhdGgoKSk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogTm93IHRlc3Qgc29tZSByZWxhdGl2ZSBmaWxlIG5hbWUgbWFnaWMuCi0gICAgICAgICAqLworICAgIC8qKgorICAgICAqIFRlc3Qgc29tZSByZWxhdGl2ZSBmaWxlIG5hbWUgbWFnaWMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplUmVsYXRpdmVGaWxlKCkgewogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLzQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLzQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLzQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4vNCIpKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy5cXDQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy5cXDQiKSkuZ2V0UGF0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGxvY2FsaXplKCIvMS8yLzMvNCIpLAotICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobG9jYWxpemUoIi8xLzIvMy8uLy5cXDQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4vLlxcNCIpKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4uLzMvNCIpKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi4vMy80IikpLmdldFBhdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi5cXDNcXDQiKSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4uXFwzXFw0IikpLmdldFBhdGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhsb2NhbGl6ZSgiLzEvMi8zLzQiKSwKLSAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi4vLi4vNS8uLi8uLzIvLi8zLzYvLi4vNCIpKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi4vLi4vNS8uLi8uLzIvLi8zLzYvLi4vNCIpKS5nZXRQYXRoKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxpemUoIi8xLzIvMy80IiksCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLm5vcm1hbGl6ZShsb2NhbGl6ZSgiLzEvMi8zLy4uXFwuLi81Ly4uXFwuLzIvLi8zLzZcXC4uLzQiKSkuZ2V0UGF0aCgpKTsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUoImZvbyIpOwotICAgICAgICAgICAgZmFpbCgiZm9vIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIik7Ci0gICAgICAgIH0gY2F0Y2ggKEJ1aWxkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKGxvY2FsaXplKCIvMS8yLzMvLi5cXC4uLzUvLi5cXC4vMi8uLzMvNlxcLi4vNCIpKS5nZXRQYXRoKCkpOwogCiAgICAgICAgIGFzc2VydEVxdWFscygid2lsbCBub3QgZ28gb3V0c2lkZSBGUyByb290IChidXQgd2lsbCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGVpdGhlcikiLAogICAgICAgICAgICAgICAgIG5ldyBGaWxlKGxvY2FsaXplKCIvMS8uLi8uLi9iIikpLAotICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMubm9ybWFsaXplKGxvY2FsaXplKCIvMS8uLi8uLi9iIikpKTsKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUobG9jYWxpemUoIi8xLy4uLy4uL2IiKSkpOworCisgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKKyAgICAgICAgdGhyb3duLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZSgiZm9vIik7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMjYsNDMgKzM0MywzNyBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxBcmdzKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgRklMRV9VVElMUy5ub3JtYWxpemUobnVsbCk7Ci0gICAgICAgICAgICBmYWlsKCJzdWNjZXNzZnVsbHkgbm9ybWFsaXplZCBhIG51bGwtZmlsZSIpOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKLSAgICAgICAgICAgIC8vIEV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZiA9IEZJTEVfVVRJTFMucmVzb2x2ZUZpbGUobnVsbCwgImEiKTsKKyAgICAgICAgRmlsZSBmID0gZ2V0RmlsZVV0aWxzKCkucmVzb2x2ZUZpbGUobnVsbCwgImEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGYsIG5ldyBGaWxlKCJhIikuZ2V0QWJzb2x1dGVGaWxlKCkpOwotICAgIH0KIAorICAgICAgICAvLyBFeHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0CisgICAgICAgIHRocm93bi5leHBlY3QoTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5ub3JtYWxpemUobnVsbCk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogVGVzdCBjcmVhdGVUZW1wRmlsZQogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRlbXBGaWxlKCkgeworICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUZW1wRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0bXBsb2MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7CiAgICAgICAgIGZpbmFsIFByb2plY3QgcHJvamVjdFdpdGhvdXRUZW1wRGlyID0gbmV3IFByb2plY3QoKTsKICAgICAgICAgZmluYWwgUHJvamVjdCBwcm9qZWN0V2l0aFRlbXBEaXIgPSBuZXcgUHJvamVjdCgpOwotICAgICAgICBmaW5hbCBGaWxlIHByb2plY3RUbXBEaXIgPSBuZXcgRmlsZSh0bXBsb2MsICJzdWJkaXIiKTsKLSAgICAgICAgcHJvamVjdFRtcERpci5ta2RpcigpOwotICAgICAgICByZW1vdmVUaGlzID0gcHJvamVjdFRtcERpcjsKKyAgICAgICAgZmluYWwgRmlsZSBwcm9qZWN0VG1wRGlyID0gZm9sZGVyLm5ld0ZvbGRlcigic3ViZGlyIik7CiAgICAgICAgIHByb2plY3RXaXRoVGVtcERpci5zZXRQcm9wZXJ0eSgiYW50LnRtcGRpciIsIHByb2plY3RUbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogCiAgICAgICAgIC8vIG51bGwgcGFyZW50IGRpciwgbnVsbCBwcm9qZWN0Ci0gICAgICAgIEZpbGUgdG1wMSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUobnVsbCwgInByZSIsICIuc3VmIiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICBGaWxlIHRtcDEgPSBnZXRGaWxlVXRpbHMoKS5jcmVhdGVUZW1wRmlsZShudWxsLCAicHJlIiwgIi5zdWYiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIFN0cmluZyBuYW1lID0gdG1wMS5nZXROYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoInN0YXJ0cyB3aXRoIHByZSIsIG5hbWUuc3RhcnRzV2l0aCgicHJlIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJlbmRzIHdpdGggLnN1ZiIsIG5hbWUuZW5kc1dpdGgoIi5zdWYiKSk7CisgICAgICAgIGFzc2VydFRoYXQoInN0YXJ0cyB3aXRoIHByZSIsIG5hbWUsIHN0YXJ0c1dpdGgoInByZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZW5kcyB3aXRoIC5zdWYiLCBuYW1lLCBlbmRzV2l0aCgiLnN1ZiIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSB3YXMgY3JlYXRlZCIsIHRtcDEuZXhpc3RzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKG5ldyBGaWxlKHRtcGxvYywgdG1wMS5nZXROYW1lKCkpKS5nZXRBYnNvbHV0ZVBhdGgoKSwgdG1wMQotICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygobmV3IEZpbGUodG1wbG9jLCB0bXAxLmdldE5hbWUoKSkpLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgIHRtcDEuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB0bXAxLmRlbGV0ZSgpOwogCiAgICAgICAgIC8vIG51bGwgcGFyZW50IGRpciwgcHJvamVjdCB3aXRob3V0IG1hZ2ljIHByb3BlcnR5Ci0gICAgICAgIHRtcDEgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKHByb2plY3RXaXRob3V0VGVtcERpciwgInByZSIsICIuc3VmIiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICB0bXAxID0gZ2V0RmlsZVV0aWxzKCkuY3JlYXRlVGVtcEZpbGUocHJvamVjdFdpdGhvdXRUZW1wRGlyLCAicHJlIiwgIi5zdWYiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIG5hbWUgPSB0bXAxLmdldE5hbWUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgic3RhcnRzIHdpdGggcHJlIiwgbmFtZS5zdGFydHNXaXRoKCJwcmUiKSk7CiAgICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZS5lbmRzV2l0aCgiLnN1ZiIpKTsKQEAgLTM3Miw3ICszODMsNyBAQAogICAgICAgICB0bXAxLmRlbGV0ZSgpOwogCiAgICAgICAgIC8vIG51bGwgcGFyZW50IGRpciwgcHJvamVjdCB3aXRoIG1hZ2ljIHByb3BlcnR5Ci0gICAgICAgIHRtcDEgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKHByb2plY3RXaXRoVGVtcERpciwgInByZSIsICIuc3VmIiwgbnVsbCwgZmFsc2UsIHRydWUpOworICAgICAgICB0bXAxID0gZ2V0RmlsZVV0aWxzKCkuY3JlYXRlVGVtcEZpbGUocHJvamVjdFdpdGhUZW1wRGlyLCAicHJlIiwgIi5zdWYiLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIG5hbWUgPSB0bXAxLmdldE5hbWUoKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgic3RhcnRzIHdpdGggcHJlIiwgbmFtZS5zdGFydHNXaXRoKCJwcmUiKSk7CiAgICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZS5lbmRzV2l0aCgiLnN1ZiIpKTsKQEAgLTM4MSwxOSArMzkyLDE4IEBACiAgICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKICAgICAgICAgdG1wMS5kZWxldGUoKTsKIAotICAgICAgICBGaWxlIGRpcjIgPSBuZXcgRmlsZSh0bXBsb2MgKyAiL2FudC10ZXN0Iik7Ci0gICAgICAgIGRpcjIubWtkaXIoKTsKKyAgICAgICAgRmlsZSBkaXIyID0gZm9sZGVyLm5ld0ZvbGRlcigiYW50LXRlc3QiKTsKIAotICAgICAgICBGaWxlIHRtcDIgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKG51bGwsICJwcmUiLCAiLnN1ZiIsIGRpcjIsIHRydWUsIHRydWUpOworICAgICAgICBGaWxlIHRtcDIgPSBnZXRGaWxlVXRpbHMoKS5jcmVhdGVUZW1wRmlsZShudWxsLCAicHJlIiwgIi5zdWYiLCBkaXIyLCB0cnVlLCB0cnVlKTsKICAgICAgICAgU3RyaW5nIG5hbWUyID0gdG1wMi5nZXROYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoInN0YXJ0cyB3aXRoIHByZSIsIG5hbWUyLnN0YXJ0c1dpdGgoInByZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kcyB3aXRoIC5zdWYiLCBuYW1lMi5lbmRzV2l0aCgiLnN1ZiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic3RhcnRzIHdpdGggcHJlIiwgbmFtZTIsIHN0YXJ0c1dpdGgoInByZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZW5kcyB3aXRoIC5zdWYiLCBuYW1lMiwgZW5kc1dpdGgoIi5zdWYiKSk7CiAgICAgICAgIGFzc2VydFRydWUoIkZpbGUgd2FzIGNyZWF0ZWQiLCB0bXAyLmV4aXN0cygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKChuZXcgRmlsZShkaXIyLCB0bXAyLmdldE5hbWUoKSkpLmdldEFic29sdXRlUGF0aCgpLCB0bXAyCi0gICAgICAgICAgICAgICAgLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChuZXcgRmlsZShkaXIyLCB0bXAyLmdldE5hbWUoKSkpLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgIHRtcDIuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB0bXAyLmRlbGV0ZSgpOwogCi0gICAgICAgIHRtcDIgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKHByb2plY3RXaXRob3V0VGVtcERpciwgInByZSIsICIuc3VmIiwgZGlyMiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHRtcDIgPSBnZXRGaWxlVXRpbHMoKS5jcmVhdGVUZW1wRmlsZShwcm9qZWN0V2l0aG91dFRlbXBEaXIsICJwcmUiLCAiLnN1ZiIsIGRpcjIsIHRydWUsIHRydWUpOwogICAgICAgICBuYW1lMiA9IHRtcDIuZ2V0TmFtZSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJzdGFydHMgd2l0aCBwcmUiLCBuYW1lMi5zdGFydHNXaXRoKCJwcmUiKSk7CiAgICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZTIuZW5kc1dpdGgoIi5zdWYiKSk7CkBAIC00MDIsNyArNDEyLDcgQEAKICAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOwogICAgICAgICB0bXAyLmRlbGV0ZSgpOwogCi0gICAgICAgIHRtcDIgPSBGSUxFX1VUSUxTLmNyZWF0ZVRlbXBGaWxlKHByb2plY3RXaXRoVGVtcERpciwgInByZSIsICIuc3VmIiwgZGlyMiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIHRtcDIgPSBnZXRGaWxlVXRpbHMoKS5jcmVhdGVUZW1wRmlsZShwcm9qZWN0V2l0aFRlbXBEaXIsICJwcmUiLCAiLnN1ZiIsIGRpcjIsIHRydWUsIHRydWUpOwogICAgICAgICBuYW1lMiA9IHRtcDIuZ2V0TmFtZSgpOwogICAgICAgICBhc3NlcnRUcnVlKCJzdGFydHMgd2l0aCBwcmUiLCBuYW1lMi5zdGFydHNXaXRoKCJwcmUiKSk7CiAgICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZTIuZW5kc1dpdGgoIi5zdWYiKSk7CkBAIC00MTMsMTYgKzQyMywxNiBAQAogICAgICAgICBkaXIyLmRlbGV0ZSgpOwogCiAgICAgICAgIEZpbGUgcGFyZW50ID0gbmV3IEZpbGUoKG5ldyBGaWxlKCIvdG1wIikpLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgdG1wMSA9IEZJTEVfVVRJTFMuY3JlYXRlVGVtcEZpbGUoInByZSIsICIuc3VmIiwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIm5ldyBmaWxlIiwgIXRtcDEuZXhpc3RzKCkpOworICAgICAgICB0bXAxID0gZ2V0RmlsZVV0aWxzKCkuY3JlYXRlVGVtcEZpbGUoInByZSIsICIuc3VmIiwgcGFyZW50LCBmYWxzZSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJuZXcgZmlsZSIsIHRtcDEuZXhpc3RzKCkpOwogCiAgICAgICAgIG5hbWUgPSB0bXAxLmdldE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic3RhcnRzIHdpdGggcHJlIiwgbmFtZS5zdGFydHNXaXRoKCJwcmUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImVuZHMgd2l0aCAuc3VmIiwgbmFtZS5lbmRzV2l0aCgiLnN1ZiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic3RhcnRzIHdpdGggcHJlIiwgbmFtZSwgc3RhcnRzV2l0aCgicHJlIikpOworICAgICAgICBhc3NlcnRUaGF0KCJlbmRzIHdpdGggLnN1ZiIsIG5hbWUsIGVuZHNXaXRoKCIuc3VmIikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImlzIGluc2lkZSBwYXJlbnQgZGlyIiwgcGFyZW50LmdldEFic29sdXRlUGF0aCgpLCB0bXAxCiAgICAgICAgICAgICAgICAgLmdldFBhcmVudCgpKTsKIAotICAgICAgICB0bXAyID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgicHJlIiwgIi5zdWYiLCBwYXJlbnQsIGZhbHNlKTsKKyAgICAgICAgdG1wMiA9IGdldEZpbGVVdGlscygpLmNyZWF0ZVRlbXBGaWxlKCJwcmUiLCAiLnN1ZiIsIHBhcmVudCwgZmFsc2UpOwogICAgICAgICBhc3NlcnRUcnVlKCJmaWxlcyBhcmUgZGlmZmVyZW50IiwgIXRtcDEuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKAogICAgICAgICAgICAgICAgIHRtcDIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKICAgICB9CkBAIC00MzIsMTggKzQ0MiwyMSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRFcXVhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBhc3NlcnRUcnVlKCJOb24gZXhpc3RpbmcgZmlsZXMiLCBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJmb28iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgImJhciIpKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIk9uZSBleGlzdHMsIHRoZSBvdGhlciBvbmUgZG9lc25cJ3QiLAotICAgICAgICAgICAgICAgICAgICFGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJmb28iKSwgbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJidWlsZC54bWwiKSkpOwotICAgICAgICBhc3NlcnRUcnVlKCJEb25cJ3QgY29tcGFyZSBkaXJlY3RvcmllcyIsCi0gICAgICAgICAgICAgICAgICAgIUZJTEVfVVRJTFMuY29udGVudEVxdWFscyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYyIpLCBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgInNyYyIpKSk7CisgICAgICAgIGFzc2VydFRydWUoIk5vbiBleGlzdGluZyBmaWxlcyIsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkuY29udGVudEVxdWFscyhuZXcgRmlsZShST09ULCAiZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShST09ULCAiYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk9uZSBleGlzdHMsIHRoZSBvdGhlciBvbmUgZG9lc25cJ3QiLAorICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoUk9PVCwgImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoUk9PVCwgImJ1aWxkLnhtbCIpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJEb25cJ3QgY29tcGFyZSBkaXJlY3RvcmllcyIsCisgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkuY29udGVudEVxdWFscyhuZXcgRmlsZShST09ULCAic3JjIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShST09ULCAic3JjIikpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBlcXVhbHMgaXRzZWxmIiwKLSAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksICJidWlsZC54bWwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAiYnVpbGQueG1sIikpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXMgYXJlIGRpZmZlcmVudCIsCi0gICAgICAgICAgICAgICAgICAgIUZJTEVfVVRJTFMuY29udGVudEVxdWFscyhuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwgImJ1aWxkLnhtbCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLCAiZG9jcy54bWwiKSkpOworICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLmNvbnRlbnRFcXVhbHMobmV3IEZpbGUoUk9PVCwgImJ1aWxkLnhtbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoUk9PVCwgImJ1aWxkLnhtbCIpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJGaWxlcyBhcmUgZGlmZmVyZW50IiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5jb250ZW50RXF1YWxzKG5ldyBGaWxlKFJPT1QsICJidWlsZC54bWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKFJPT1QsICJkb2NzLnhtbCIpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NTEsOSArNDY0LDEwIEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTmV3RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJlbW92ZVRoaXMgPSBuZXcgRmlsZSgiZHVtbXkiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghcmVtb3ZlVGhpcy5leGlzdHMoKSk7Ci0gICAgICAgIEZJTEVfVVRJTFMuY3JlYXRlTmV3RmlsZShyZW1vdmVUaGlzKTsKKyAgICAgICAgRmlsZSByZW1vdmVUaGlzID0gbmV3IEZpbGUoImR1bW15Iik7CisgICAgICAgIHJlbW92ZVRoaXMuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlbW92ZVRoaXMuZXhpc3RzKCkpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5jcmVhdGVOZXdGaWxlKHJlbW92ZVRoaXMpOwogICAgICAgICBhc3NlcnRUcnVlKHJlbW92ZVRoaXMuZXhpc3RzKCkpOwogICAgIH0KIApAQCAtNDYyLDQ1ICs0NzYsNDUgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMZWFkaW5nUGF0aCgpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiL2Zvby9iYXIiKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi9mb28vYmFyIikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJcXGZvbyIpLAorICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGdldEZpbGVVdGlscygpLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJcXGZvbyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJcXGZvb1xcYmFyIikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJcXGZvb1xcIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIlxcZm9vXFwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiXFxmb29cXGJhciIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzovZm9vIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6L2ZvbyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJjOi9mb28vYmFyIikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOi9mb28vIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6L2Zvby8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiYzovZm9vL2JhciIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvbyIpLAorICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGdldEZpbGVVdGlscygpLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoImM6XFxmb29cXGJhciIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksCisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJjOlxcZm9vXFxiYXIiKSkpOwotICAgICAgICBpZiAoIShPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhGSUxFX1VUSUxTLm5vcm1hbGl6ZSgiL2JhciIpLmdldEFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9iYXIiKSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZJTEVfVVRJTFMubm9ybWFsaXplKCIvZm9vYmFyIikuZ2V0QWJzb2x1dGVQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvb2JhciIpKSk7CisgICAgICAgIGlmICghT3MuaXNGYW1pbHkoImRvcyIpICYmICFPcy5pc0ZhbWlseSgibmV0d2FyZSIpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0RmlsZVV0aWxzKCkubm9ybWFsaXplKCIvYmFyIikuZ2V0QWJzb2x1dGVQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9iYXIiKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEZpbGVVdGlscygpLm5vcm1hbGl6ZSgiL2Zvb2JhciIpLmdldEFic29sdXRlUGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbGVVdGlscygpLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vYmFyIikpKTsKICAgICAgICAgfQogICAgICAgICAvLyBidWd6aWxsYSByZXBvcnQgMTk5NzkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2JhciIpLAorICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGdldEZpbGVVdGlscygpLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2JhciIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZm9vL2JhciIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby9iYXIiKSwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBnZXRGaWxlVXRpbHMoKS5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby9iYXIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiL2Zvby9iYXIvIikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBnZXRGaWxlVXRpbHMoKS5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby9iYXIvIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi9mb28vYmFyLyIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby9iYXIvIiksCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vYmFyLyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZm9vL2JhciIpKSk7CiAKICAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gImZvby9iYXIiLnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKQogICAgICAgICAgICAgLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZJTEVfVVRJTFMucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoIi8iKSwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBnZXRGaWxlVXRpbHMoKS5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiLyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvZm9vL2JhciIpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgRklMRV9VVElMUy5yZW1vdmVMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzovIiksCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6LyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJjOi9mb28vYmFyIikpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGSUxFX1VUSUxTLnJlbW92ZUxlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcIiksCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZ2V0RmlsZVV0aWxzKCkucmVtb3ZlTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyIikpKTsKICAgICB9CiAKQEAgLTUxNywyOCArNTMxLDI4IEBACiAgICAgICAgICAgICBkb3NSb290ID0gIiI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9jOi9mb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KEZJTEVfVVRJTFMudG9VUkkoImM6XFxmb28iKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9jOi9mb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCJjOlxcZm9vIikpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9TWVM6L2ZvbyIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgic3lzOlxcZm9vIikpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovU1lTOi9mb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCJzeXM6XFxmb28iKSkpOwogICAgICAgICB9CiAgICAgICAgIGlmIChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICcvJykgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9mb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KEZJTEVfVVRJTFMudG9VUkkoIi9mb28iKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiZmlsZTogVVJJcyBtdXN0IG5hbWUgYWJzb2x1dGUgcGF0aHMiLCBGSUxFX1VUSUxTLnRvVVJJKCIuL2ZvbyIpLnN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy50b1VSSSgiLi9mb28iKS5lbmRzV2l0aCgiL2ZvbyIpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiZm9vJTIwYmFyIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCIvZm9vIGJhciIpKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6LyIgKyBkb3NSb290ICsgImZvbyUyM2JhciIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgiL2ZvbyNiYXIiKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi9mb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCIvZm9vIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoImZpbGU6IFVSSXMgbXVzdCBuYW1lIGFic29sdXRlIHBhdGhzIiwgZ2V0RmlsZVV0aWxzKCkudG9VUkkoIi4vZm9vIiksIHN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0RmlsZVV0aWxzKCkudG9VUkkoIi4vZm9vIiksIGVuZHNXaXRoKCIvZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi8iICsgZG9zUm9vdCArICJmb28lMjBiYXIiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCIvZm9vIGJhciIpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6LyIgKyBkb3NSb290ICsgImZvbyUyM2JhciIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoZ2V0RmlsZVV0aWxzKCkudG9VUkkoIi9mb28jYmFyIikpKTsKICAgICAgICAgfSBlbHNlIGlmIChGaWxlLnBhdGhTZXBhcmF0b3JDaGFyID09ICdcXCcpIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiZm9vIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCJcXGZvbyIpKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJmaWxlOiBVUklzIG11c3QgbmFtZSBhYnNvbHV0ZSBwYXRocyIsIEZJTEVfVVRJTFMudG9VUkkoIi5cXGZvbyIpLnN0YXJ0c1dpdGgoImZpbGU6LyIpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy50b1VSSSgiLlxcZm9vIikuZW5kc1dpdGgoIi9mb28iKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpbGU6LyIgKyBkb3NSb290ICsgImZvbyUyMGJhciIsIHJlbW92ZUV4dHJhbmVvdXNBdXRob3JpdHkoRklMRV9VVElMUy50b1VSSSgiXFxmb28gYmFyIikpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiZm9vJTIzYmFyIiwgcmVtb3ZlRXh0cmFuZW91c0F1dGhvcml0eShGSUxFX1VUSUxTLnRvVVJJKCJcXGZvbyNiYXIiKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi8iICsgZG9zUm9vdCArICJmb28iLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCJcXGZvbyIpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJmaWxlOiBVUklzIG11c3QgbmFtZSBhYnNvbHV0ZSBwYXRocyIsIGdldEZpbGVVdGlscygpLnRvVVJJKCIuXFxmb28iKSwgc3RhcnRzV2l0aCgiZmlsZTovIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRGaWxlVXRpbHMoKS50b1VSSSgiLlxcZm9vIiksIGVuZHNXaXRoKCIvZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi8iICsgZG9zUm9vdCArICJmb28lMjBiYXIiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCJcXGZvbyBiYXIiKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlOi8iICsgZG9zUm9vdCArICJmb28lMjNiYXIiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCJcXGZvbyNiYXIiKSkpOwogICAgICAgICB9CiAgICAgICAgIC8vIGEgdGVzdCB3aXRoIGFudCBmb3IgZ2VybWFucwogICAgICAgICAvLyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIgdXNlZCBmb3IgdGhlIHRlc3QgaXMgdGhlICJhIHVtbGF1dCIKICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZml4IGZvciB0aGUgYnVnIDM3MzQ4Ci0gICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiJUMzJUE0bnQiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KEZJTEVfVVRJTFMudG9VUkkoIi9cdTAwRTRudCIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmlsZTovIiArIGRvc1Jvb3QgKyAiJUMzJUE0bnQiLCByZW1vdmVFeHRyYW5lb3VzQXV0aG9yaXR5KGdldEZpbGVVdGlscygpLnRvVVJJKCIvXHUwMEU0bnQiKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTU3LDggKzU3MSw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNDb250ZXh0UmVsYXRpdmVQYXRoKCkgewogICAgICAgICBhc3N1bWVUcnVlKCJUZXN0IG9ubHkgcnVucyBvbiBET1MiLCBPcy5pc0ZhbWlseSgiZG9zIikpOwotICAgICAgICBhc3NlcnRUcnVlKEZpbGVVdGlscy5pc0NvbnRleHRSZWxhdGl2ZVBhdGgoIi9cdTAwRTRudCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGaWxlVXRpbHMuaXNDb250ZXh0UmVsYXRpdmVQYXRoKCJcXGZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0NvbnRleHRSZWxhdGl2ZVBhdGgoIi9cdTAwRTRudCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc0NvbnRleHRSZWxhdGl2ZVBhdGgoIlxcZm9vIikpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNTczLDE2ICs1ODcsMTYgQEAKICAgICAgICAgICAgIGRvc1Jvb3QgPSAiIjsKICAgICAgICAgfQogICAgICAgICBpZiAoT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKCJTWVM6XFxmb28iLCBGSUxFX1VUSUxTLmZyb21VUkkoImZpbGU6Ly8vc3lzOi9mb28iKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoIlNZUzpcXGZvbyIsIGdldEZpbGVVdGlscygpLmZyb21VUkkoImZpbGU6Ly8vc3lzOi9mb28iKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJkb3MiKSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKCJDOlxcZm9vIiwgRklMRV9VVElMUy5mcm9tVVJJKCJmaWxlOi8vL2M6L2ZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZSgiQzpcXGZvbyIsIGdldEZpbGVVdGlscygpLmZyb21VUkkoImZpbGU6Ly8vYzovZm9vIikpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFsc0lnbm9yZURyaXZlQ2FzZShkb3NSb290ICsgRmlsZS5zZXBhcmF0b3IgKyAiZm9vIiwgRklMRV9VVElMUy5mcm9tVVJJKCJmaWxlOi8vL2ZvbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzSWdub3JlRHJpdmVDYXNlKGRvc1Jvb3QgKyBGaWxlLnNlcGFyYXRvciArICJmb28iLCBnZXRGaWxlVXRpbHMoKS5mcm9tVVJJKCJmaWxlOi8vL2ZvbyIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIuIiArIEZpbGUuc2VwYXJhdG9yICsgImZvbyIsCi0gICAgICAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmZyb21VUkkoImZpbGU6Li9mb28iKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb3NSb290ICsgRmlsZS5zZXBhcmF0b3IgKyAiZm9vIGJhciIsIEZJTEVfVVRJTFMuZnJvbVVSSSgiZmlsZTovLy9mb28lMjBiYXIiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkb3NSb290ICsgRmlsZS5zZXBhcmF0b3IgKyAiZm9vI2JhciIsIEZJTEVfVVRJTFMuZnJvbVVSSSgiZmlsZTovLy9mb28lMjNiYXIiKSk7CisgICAgICAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5mcm9tVVJJKCJmaWxlOi4vZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZG9zUm9vdCArIEZpbGUuc2VwYXJhdG9yICsgImZvbyBiYXIiLCBnZXRGaWxlVXRpbHMoKS5mcm9tVVJJKCJmaWxlOi8vL2ZvbyUyMGJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRvc1Jvb3QgKyBGaWxlLnNlcGFyYXRvciArICJmb28jYmFyIiwgZ2V0RmlsZVV0aWxzKCkuZnJvbVVSSSgiZmlsZTovLy9mb28lMjNiYXIiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTU5OSwzMCArNjEzLDMwIEBACiAKICAgICAgICAgLy9jaGVjayB0aGF0IG9sZGVyIGlzIHVwIHRvIGRhdGUgd2l0aCBhIG5ld2VyIGRlc3QKICAgICAgICAgYXNzZXJ0VHJ1ZSgib2xkZXIgc291cmNlIGZpbGVzIGFyZSB1cCB0byBkYXRlIiwKLSAgICAgICAgICAgICAgICBGSUxFX1VUSUxTLmlzVXBUb0RhdGUoZmlyc3RUaW1lLHNlY29uZFRpbWUpKTsKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5pc1VwVG9EYXRlKGZpcnN0VGltZSxzZWNvbmRUaW1lKSk7CiAgICAgICAgIC8vY2hlY2sgdGhhdCBvbGRlciBpcyB1cCB0byBkYXRlIHdpdGggYSBuZXdlciBkZXN0CiAgICAgICAgIGFzc2VydEZhbHNlKCJuZXdlciBzb3VyY2UgZmlsZXMgYXJlIG5vIHVwIHRvIGRhdGUiLAotICAgICAgICAgICAgICAgIEZJTEVfVVRJTFMuaXNVcFRvRGF0ZShzZWNvbmRUaW1lLCBmaXJzdFRpbWUpKTsKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5pc1VwVG9EYXRlKHNlY29uZFRpbWUsIGZpcnN0VGltZSkpOwogCi0gICAgICAgIGFzc2VydFRydWUoIi0xIGRlc3QgdGltZXN0YW1wIGltcGxpZXMgbm9uZXhpc3RlbmNlIiwKLSAgICAgICAgICAgICAgICAhRklMRV9VVElMUy5pc1VwVG9EYXRlKGZpcnN0VGltZSwtMUwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIi0xIGRlc3QgdGltZXN0YW1wIGltcGxpZXMgbm9uZXhpc3RlbmNlIiwKKyAgICAgICAgICAgICAgICBnZXRGaWxlVXRpbHMoKS5pc1VwVG9EYXRlKGZpcnN0VGltZSwgLTFMKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzRXJyb3JJbkNhc2UoKSB7CiAgICAgICAgIEZpbGUgdGVtcEZvbGRlciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7Ci0gICAgICAgIEZpbGUgd2VsbGNhc2VkID0gRklMRV9VVElMUy5jcmVhdGVUZW1wRmlsZSgiYWxwaGEiLCAiYmV0YSIsIHRlbXBGb2xkZXIsCisgICAgICAgIEZpbGUgd2VsbGNhc2VkID0gZ2V0RmlsZVV0aWxzKCkuY3JlYXRlVGVtcEZpbGUoImFscGhhIiwgImJldGEiLCB0ZW1wRm9sZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIFN0cmluZyBzID0gd2VsbGNhc2VkLmdldE5hbWUoKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICBGaWxlIHdyb25nY2FzZWQgPSBuZXcgRmlsZSh0ZW1wRm9sZGVyLCBzKTsKICAgICAgICAgaWYgKE9zLmlzRmFtaWx5KCJtYWMiKSAmJiBPcy5pc0ZhbWlseSgidW5peCIpKSB7CiAgICAgICAgICAgICAvL25vIGd1YXJhbnRlZXMgb24gZmlsZXN5c3RlbSBjYXNlLXNlbnNpdGl2aXR5CiAgICAgICAgIH0gZWxzZSBpZiAoT3MuaXNGYW1pbHkoImRvcyIpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaGFzRXJyb3JJbkNhc2Uod3JvbmdjYXNlZCkpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5oYXNFcnJvckluQ2FzZSh3ZWxsY2FzZWQpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZ2V0RmlsZVV0aWxzKCkuaGFzRXJyb3JJbkNhc2Uod3JvbmdjYXNlZCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RmlsZVV0aWxzKCkuaGFzRXJyb3JJbkNhc2Uod2VsbGNhc2VkKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmhhc0Vycm9ySW5DYXNlKHdyb25nY2FzZWQpKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKEZJTEVfVVRJTFMuaGFzRXJyb3JJbkNhc2Uod2VsbGNhc2VkKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXRGaWxlVXRpbHMoKS5oYXNFcnJvckluQ2FzZSh3cm9uZ2Nhc2VkKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShnZXRGaWxlVXRpbHMoKS5oYXNFcnJvckluQ2FzZSh3ZWxsY2FzZWQpKTsKICAgICAgICAgfQogCiAgICAgfQpAQCAtNjMwLDcgKzY0NCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEVuY29kaW5nKCkgewogICAgICAgICAvLyBUaGlzIGp1c3QgdGVzdHMgdGhhdCB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYmxvdyB1cAotICAgICAgICBGSUxFX1VUSUxTLmdldERlZmF1bHRFbmNvZGluZygpOworICAgICAgICBnZXRGaWxlVXRpbHMoKS5nZXREZWZhdWx0RW5jb2RpbmcoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTYzOCw5ICs2NTIsOSBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaXNMZWFkaW5nUGF0aENhbm5vdEJlRm9vbGVkQnlUb29NYW55RG91YmxlRG90cygpIHsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vLy4uLy4uL2JhciIpKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvbyIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcLi5cXC4uXFxiYXIiKSkpOwotICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vLi4vLi4iKSkpOworICAgICAgICBhc3NlcnRGYWxzZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vLy4uLy4uL2JhciIpKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb28iKSwgbmV3IEZpbGUoImM6XFxmb29cXC4uXFwuLlxcYmFyIikpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvby8uLi8uLiIpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02NDgsNjEgKzY2Miw5MyBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaXNMZWFkaW5nUGF0aENhbm9uaWNhbFZlcnNpb25DYW5ub3RCZUZvb2xlZEJ5VG9vTWFueURvdWJsZURvdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vLi4vLi4vYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vIiksIG5ldyBGaWxlKCJjOlxcZm9vXFwuLlxcLi5cXGJhciIpLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2ZvbyIpLCBuZXcgRmlsZSgiL2Zvby8uLi8uLiIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vLi4vLi4vYmFyIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvbyIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcLi5cXC4uXFxiYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGYWxzZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vLy4uLy4uIiksIHRydWUpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGlzTGVhZGluZ1BhdGhDYW5vbmljYWxWZXJzaW9uV29ya3NBc0V4cGVjdGVkT25Vbml4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzdW1lRmFsc2UoIlRlc3QgZG9lc24ndCBydW4gb24gRE9TIiwgT3MuaXNGYW1pbHkoImRvcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmF6Ly4uL2JhciIpLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vLy4uL2Zvby9iYXIiKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb29iYXIiKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRGYWxzZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9iYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vL2Jhei8uLi9iYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vLi4vZm9vL2JhciIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb29iYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRGYWxzZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvYmFyIiksIHRydWUpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGlzTGVhZGluZ1BhdGhBbmRUcmFpbGluZ1NsYXNoZXNPblVuaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBhc3N1bWVGYWxzZSgiVGVzdCBkb2Vzbid0IHJ1biBvbiBET1MiLCBPcy5pc0ZhbWlseSgiZG9zIikpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby8iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby8iKSwgbmV3IEZpbGUoIi9mb28vIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLCBuZXcgRmlsZSgiL2Zvby9iYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vLyIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby8iKSwgbmV3IEZpbGUoIi9mb28iKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vIiksIHRydWUpKTsKIAotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiL2Zvby8iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLCBuZXcgRmlsZSgiL2Zvby9iYXIvIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLCBuZXcgRmlsZSgiL2Zvby8iKSwgZmFsc2UpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vIiksIG5ldyBGaWxlKCIvZm9vLyIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vL2JhciIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28vIiksIG5ldyBGaWxlKCIvZm9vL2Jhci8iKSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLCBuZXcgRmlsZSgiL2Zvby8iKSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCIvZm9vLyIpLCBuZXcgRmlsZSgiL2ZvbyIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vIiksIGZhbHNlKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBpc0xlYWRpbmdQYXRoQ2Fub25pY2FsVmVyc2lvbldvcmtzQXNFeHBlY3RlZE9uRG9zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzdW1lVHJ1ZSgiVGVzdCBvbmx5IHJ1bnMgb24gRE9TIiwgT3MuaXNGYW1pbHkoImRvcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIkM6XFxmb28iKSwgbmV3IEZpbGUoIkM6XFxmb29cXGJhciIpLCB0cnVlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJDOlxcZm9vIiksIG5ldyBGaWxlKCJDOlxcZm9vXFxiYXpcXC4uXFxiYXIiKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiQzpcXGZvbyIpLCBuZXcgRmlsZSgiQzpcXGZvb1xcLi5cXGZvb1xcYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJDOlxcZm9vIiksIG5ldyBGaWxlKCJDOlxcZm9vYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJDOlxcZm9vIiksIG5ldyBGaWxlKCJDOlxcYmFyIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJDOlxcZm9vIiksIG5ldyBGaWxlKCJDOlxcZm9vXFxiYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIkM6XFxmb28iKSwgbmV3IEZpbGUoIkM6XFxmb29cXGJhelxcLi5cXGJhciIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiQzpcXGZvbyIpLCBuZXcgRmlsZSgiQzpcXGZvb1xcLi5cXGZvb1xcYmFyIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiQzpcXGZvbyIpLCBuZXcgRmlsZSgiQzpcXGZvb2JhciIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoIkM6XFxmb28iKSwgbmV3IEZpbGUoIkM6XFxiYXIiKSwgdHJ1ZSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaXNMZWFkaW5nUGF0aEFuZFRyYWlsaW5nU2xhc2hlc09uRG9zKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYXNzdW1lVHJ1ZSgiVGVzdCBvbmx5IHJ1bnMgb24gRE9TIiwgT3MuaXNGYW1pbHkoImRvcyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyXFwiKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksIG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgdHJ1ZSkpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksIG5ldyBGaWxlKCJjOlxcZm9vIiksIHRydWUpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb28iKSwgbmV3IEZpbGUoImM6XFxmb29cXCIpLCB0cnVlKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RmlsZVV0aWxzKCkuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksIG5ldyBGaWxlKCJjOlxcZm9vXFxiYXIiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyXFwiKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcIiksIHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgbmV3IEZpbGUoImM6XFxmb28iKSwgdHJ1ZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb28iKSwgbmV3IEZpbGUoImM6XFxmb29cXCIpLCB0cnVlKSk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShGSUxFX1VUSUxTLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgbmV3IEZpbGUoImM6XFxmb29cXGJhclxcIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgbmV3IEZpbGUoImM6XFxmb29cXCIpLCBmYWxzZSkpOwotICAgICAgICBhc3NlcnRUcnVlKEZJTEVfVVRJTFMuaXNMZWFkaW5nUGF0aChuZXcgRmlsZSgiYzpcXGZvb1xcIiksIG5ldyBGaWxlKCJjOlxcZm9vIiksIGZhbHNlKSk7Ci0gICAgICAgIGFzc2VydFRydWUoRklMRV9VVElMUy5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vIiksIG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgbmV3IEZpbGUoImM6XFxmb29cXGJhciIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvb1xcYmFyXFwiKSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXRGaWxlVXRpbHMoKS5pc0xlYWRpbmdQYXRoKG5ldyBGaWxlKCJjOlxcZm9vXFwiKSwgbmV3IEZpbGUoImM6XFxmb29cXCIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb29cXCIpLCBuZXcgRmlsZSgiYzpcXGZvbyIpLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGdldEZpbGVVdGlscygpLmlzTGVhZGluZ1BhdGgobmV3IEZpbGUoImM6XFxmb28iKSwgbmV3IEZpbGUoImM6XFxmb29cXCIpLCBmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHtAbGluayBGaWxlVXRpbHMjaXNDYXNlU2Vuc2l0aXZlRmlsZVN5c3RlbShQYXRoKX0gbWV0aG9kCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhc2VTZW5zaXRpdmVGaWxlU3lzdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhIHRlbXAgZmlsZSBpbiBhIGZyZXNoIGRpcmVjdG9yeQorICAgICAgICBmaW5hbCBQYXRoIHRtcERpciA9IEZpbGVzLmNyZWF0ZVRlbXBEaXJlY3RvcnkobnVsbCk7CisgICAgICAgIGZpbmFsIFBhdGggdG1wRmlsZSA9IEZpbGVzLmNyZWF0ZVRlbXBGaWxlKHRtcERpciwgbnVsbCwgbnVsbCk7CisgICAgICAgIHRtcEZpbGUudG9GaWxlKCkuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIHRtcERpci50b0ZpbGUoKS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgLy8gbm93IGNoZWNrIGlmIGEgZmlsZSB3aXRoIHRoYXQgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgY2FzZSBpcyBjb25zaWRlcmVkIHRvIGV4aXN0CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhpc3RzQXNMb3dlckNhc2UgPSBGaWxlcy5leGlzdHMoUGF0aHMuZ2V0KHRtcERpci50b1N0cmluZygpLCB0bXBGaWxlLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXhpc3RzQXNVcHBlckNhc2UgPSBGaWxlcy5leGlzdHMoUGF0aHMuZ2V0KHRtcERpci50b1N0cmluZygpLCB0bXBGaWxlLmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpKSk7CisgICAgICAgIC8vIGlmIHRoZSB0ZW1wIGZpbGUgdGhhdCB3ZSBjcmVhdGVkIGlzIGZvdW5kIHRvIG5vdCBleGlzdCBpbiBhIHBhcnRpY3VsYXIgImNhc2UiLCB0aGVuCisgICAgICAgIC8vIHRoZSBmaWxlc3lzdGVtIGlzIGNhc2Ugc2Vuc2l0aXZlCisgICAgICAgIGZpbmFsIEJvb2xlYW4gZXhwZWN0ZWRDYXNlU2Vuc2l0aXZpdHkgPSAhZXhpc3RzQXNMb3dlckNhc2UgfHwgIWV4aXN0c0FzVXBwZXJDYXNlOworCisgICAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBhbmQgcGFzcyBpdCBhIGRpcmVjdG9yeQorICAgICAgICBPcHRpb25hbDxCb29sZWFuPiBhY3R1YWxDYXNlU2Vuc2l0aXZpdHkgPSBpc0Nhc2VTZW5zaXRpdmVGaWxlU3lzdGVtKHRtcERpcik7CisgICAgICAgIGFzc2VydFRydWUoIkZpbGVzeXN0ZW0gY2FzZSBzZW5zaXRpdml0eSB3YXMgZXhwZWN0ZWQgdG8gYmUgZGV0ZXJtaW5lZCIsIGFjdHVhbENhc2VTZW5zaXRpdml0eS5pc1ByZXNlbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRmlsZXN5c3RlbSB3YXMgZXhwZWN0ZWQgdG8gYmUgY2FzZSAiICsgKGV4cGVjdGVkQ2FzZVNlbnNpdGl2aXR5CisgICAgICAgICAgICAgICAgPyAic2Vuc2l0aXZlIiA6ICJpbnNlbnNpdGl2ZSIpLCBleHBlY3RlZENhc2VTZW5zaXRpdml0eSwgYWN0dWFsQ2FzZVNlbnNpdGl2aXR5LmdldCgpKTsKKworICAgICAgICAvLyBub3cgdGVzdCBpdCBvdXQgYnkgcGFzc2luZyBpdCBhIGZpbGUKKyAgICAgICAgYWN0dWFsQ2FzZVNlbnNpdGl2aXR5ID0gaXNDYXNlU2Vuc2l0aXZlRmlsZVN5c3RlbSh0bXBGaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZXN5c3RlbSBjYXNlIHNlbnNpdGl2aXR5IHdhcyBleHBlY3RlZCB0byBiZSBkZXRlcm1pbmVkIiwgYWN0dWFsQ2FzZVNlbnNpdGl2aXR5LmlzUHJlc2VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJGaWxlc3lzdGVtIHdhcyBleHBlY3RlZCB0byBiZSBjYXNlICIgKyAoZXhwZWN0ZWRDYXNlU2Vuc2l0aXZpdHkKKyAgICAgICAgICAgICAgICA/ICJzZW5zaXRpdmUiIDogImluc2Vuc2l0aXZlIiksIGV4cGVjdGVkQ2FzZVNlbnNpdGl2aXR5LCBhY3R1YWxDYXNlU2Vuc2l0aXZpdHkuZ2V0KCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNzIwLDggKzc2Niw4IEBACiAgICAgICogY2FsbGluZyB0aGlzIG1ldGhvZCBhbGxvd3MgdGVzdHMgd2hlcmUgbm9ybWFsaXplIGlzIGNhbGxlZCB0byBwYXNzIHVuZGVyIGN5Z3dpbgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRFcXVhbHNJZ25vcmVEcml2ZUNhc2UoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLSAgICAgICAgaWYgKChPcy5pc0ZhbWlseSgiZG9zIikgfHwgT3MuaXNGYW1pbHkoIm5ldHdhcmUiKSkKLSAgICAgICAgICAgICYmIHMxLmxlbmd0aCgpID4gMCAmJiBzMi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiTm90IERPUyBvciBOZXR3YXJlIiwgT3MuaXNGYW1pbHkoImRvcyIpIHx8IE9zLmlzRmFtaWx5KCJuZXR3YXJlIikpOworICAgICAgICBpZiAoIXMxLmlzRW1wdHkoKSAmJiAhczIuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiMSA9IG5ldyBTdHJpbmdCdWlsZGVyKHMxKTsKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IyID0gbmV3IFN0cmluZ0J1aWxkZXIoczIpOwogICAgICAgICAgICAgc2IxLnNldENoYXJBdCgwLCBDaGFyYWN0ZXIudG9VcHBlckNhc2UoczEuY2hhckF0KDApKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9HbG9iUGF0dGVybk1hcHBlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhCmluZGV4IDViZDdkYjYuLjJjNTVkNjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0dsb2JQYXR0ZXJuTWFwcGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsNiArMTgsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMjUsMTQgKzI2LDIwIEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKIAogLyoqCi0gKiBUZXN0cyBmb3Igb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDtHbG9iUGF0dGVybk1hcHBlci4KKyAqIFRlc3RzIGZvciBvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLkdsb2JQYXR0ZXJuTWFwcGVyLgogICoKICAqLwogcHVibGljIGNsYXNzIEdsb2JQYXR0ZXJuTWFwcGVyVGVzdCB7CiAKKyAgICBwcml2YXRlIEdsb2JQYXR0ZXJuTWFwcGVyIG07CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BhdHRlcm5BdEFsbCgpIHsKLSAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOwogICAgICAgICBtLnNldEZyb20oImZvb2JhciIpOwogICAgICAgICBtLnNldFRvKCJiYXoiKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCBmb29iYXIiLCBtLm1hcEZpbGVOYW1lKCJwbG9uayIpKTsKQEAgLTQ0LDcgKzUxLDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBvc3RmaXhPbmx5KCkgewotICAgICAgICBHbG9iUGF0dGVybk1hcHBlciBtID0gbmV3IEdsb2JQYXR0ZXJuTWFwcGVyKCk7CiAgICAgICAgIG0uc2V0RnJvbSgiKmZvbyIpOwogICAgICAgICBtLnNldFRvKCIqcGxvbmsiKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCAqZm9vIiwgbS5tYXBGaWxlTmFtZSgiYmFyLmJheiIpKTsKQEAgLTYxLDcgKzY3LDYgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeE9ubHkoKSB7Ci0gICAgICAgIEdsb2JQYXR0ZXJuTWFwcGVyIG0gPSBuZXcgR2xvYlBhdHRlcm5NYXBwZXIoKTsKICAgICAgICAgbS5zZXRGcm9tKCJmb28qIik7CiAgICAgICAgIG0uc2V0VG8oInBsb25rKiIpOwogICAgICAgICBhc3NlcnROdWxsKCJTaG91bGRuXCd0IG1hdGNoIGZvbyoiLCBtLm1hcEZpbGVOYW1lKCJiYXIuYmF6IikpOwpAQCAtNzgsNyArODMsNiBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlQW5kUG9zdGZpeCgpIHsKLSAgICAgICAgR2xvYlBhdHRlcm5NYXBwZXIgbSA9IG5ldyBHbG9iUGF0dGVybk1hcHBlcigpOwogICAgICAgICBtLnNldEZyb20oImZvbypiYXIiKTsKICAgICAgICAgbS5zZXRUbygicGxvbmsqcGxpbmciKTsKICAgICAgICAgYXNzZXJ0TnVsbCgiU2hvdWxkblwndCBtYXRjaCBmb28qYmFyIiwgbS5tYXBGaWxlTmFtZSgiYmFyLmJheiIpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlsc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0pBWFBVdGlsc1Rlc3QuamF2YQppbmRleCA3OTUwNzcxLi44NDA1NDZiIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KQVhQVXRpbHNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSkFYUFV0aWxzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsNyArMjEsOSBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogLyoqCiAgKiBKQVhQVXRpbHMgdGVzdCBjYXNlCkBAIC0zNyw3ICszOSw3IEBACiAgICAgICAgICAgICBmaWxlID0gbmV3IEZpbGUoIi91c2VyL2xvY2FsL2JpbiIpOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBzeXN0ZW1pZCA9IEpBWFBVdGlscy5nZXRTeXN0ZW1JZChmaWxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiU3lzdGVtSURzIHNob3VsZCBzdGFydCBieSBmaWxlOi8iLCBzeXN0ZW1pZC5zdGFydHNXaXRoKCJmaWxlOi8iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN5c3RlbUlEcyBzaG91bGQgbm90IHN0YXJ0IHdpdGggZmlsZTovLy8vIiwgIXN5c3RlbWlkLnN0YXJ0c1dpdGgoImZpbGU6Ly8vLyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiU3lzdGVtSURzIHNob3VsZCBzdGFydCBieSBmaWxlOi8iLCBzeXN0ZW1pZCwgc3RhcnRzV2l0aCgiZmlsZTovIikpOworICAgICAgICBhc3NlcnRUaGF0KCJTeXN0ZW1JRHMgc2hvdWxkIG5vdCBzdGFydCB3aXRoIGZpbGU6Ly8vLyIsIHN5c3RlbWlkLCBub3Qoc3RhcnRzV2l0aCgiZmlsZTovLy8vIikpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KYXZhRW52VXRpbHNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9KYXZhRW52VXRpbHNUZXN0LmphdmEKaW5kZXggYWE3MWIwYi4uNjU2MzFkNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvSmF2YUVudlV0aWxzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0phdmFFbnZVdGlsc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIwLDExICsyMCwxNSBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbmRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnN0YXJ0c1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVUcnVlOwogCiAvKioKQEAgLTM3LDcgKzQxLDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEV4ZWN1dGFibGVOZXR3YXJlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiVGVzdCBvbmx5IHJ1bnMgb24gbmV0d2FyZSIsIE9zLmlzTmFtZSgibmV0d2FyZSIpKTsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiVGVzdCBvbmx5IHJ1bnMgb24gbmV0d2FyZSIsIE9zLmlzTmFtZSgibmV0d2FyZSIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhIiwgSmF2YUVudlV0aWxzLmdldEpyZUV4ZWN1dGFibGUoImphdmEiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiamF2YWMiLCBKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZSgiamF2YWMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgSmF2YUVudlV0aWxzLmdldEpyZUV4ZWN1dGFibGUoImZvbyIpKTsKQEAgLTQ2LDMxICs1MCwzMSBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhlY3V0YWJsZVdpbmRvd3MoKSB7Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUZXN0IG9ubHkgcnVucyBvbiB3aW5kb3dzIiwgT3MuaXNGYW1pbHkoIndpbmRvd3MiKSk7Ci0gICAgICAgIFN0cmluZyBqYXZhSG9tZSA9IEZJTEVfVVRJTFMubm9ybWFsaXplKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikpCisgICAgICAgIGFzc3VtZVRydWUoIlRlc3Qgb25seSBydW5zIG9uIHdpbmRvd3MiLCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKKyAgICAgICAgU3RyaW5nIGphdmFIb21lID0gRklMRV9VVElMUy5ub3JtYWxpemUoSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkpCiAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCk7CiAKICAgICAgICAgU3RyaW5nIGogPSBKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiamF2YSIpOwotICAgICAgICBhc3NlcnRUcnVlKGouZW5kc1dpdGgoIi5leGUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoaiwgZW5kc1dpdGgoIi5leGUiKSk7CiAgICAgICAgIGFzc2VydFRydWUoaiArICIgaXMgYWJzb2x1dGUiLCAobmV3IEZpbGUoaikpLmlzQWJzb2x1dGUoKSk7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKUkUgZGlyIiwgai5zdGFydHNXaXRoKGphdmFIb21lKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKUkUgZGlyIiwgaiwgc3RhcnRzV2l0aChqYXZhSG9tZSkpOwogICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7CiAgICAgICAgICAgICAvLyBqYXZhLmhvbWUgaXMgYm9ndXMKICAgICAgICAgICAgIGFzc2VydEVxdWFscygiamF2YS5leGUiLCBqKTsKICAgICAgICAgfQogCiAgICAgICAgIGogPSBKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZSgiamF2YWMiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqLmVuZHNXaXRoKCIuZXhlIikpOworICAgICAgICBhc3NlcnRUaGF0KGosIGVuZHNXaXRoKCIuZXhlIikpOwogCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKGogKyAiIGlzIGFic29sdXRlIiwgKG5ldyBGaWxlKGopKS5pc0Fic29sdXRlKCkpOwogICAgICAgICAgICAgU3RyaW5nIGphdmFIb21lUGFyZW50ID0gRklMRV9VVElMUy5ub3JtYWxpemUoamF2YUhvbWUgKyAiLy4uIikuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKREsgZGlyIiwgai5zdGFydHNXaXRoKGphdmFIb21lUGFyZW50KSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKREsgZGlyIiwgaiwgc3RhcnRzV2l0aChqYXZhSG9tZVBhcmVudCkpOwogICAgICAgICAgICAgaWYgKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSkgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaiArICIgaXMgbm9ybWFsaXplZCBhbmQgbm90IGluIHRoZSBKUkUgZGlyIiwgai5zdGFydHNXaXRoKGphdmFIb21lKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChqICsgIiBpcyBub3JtYWxpemVkIGFuZCBub3QgaW4gdGhlIEpSRSBkaXIiLCBqLCBzdGFydHNXaXRoKGphdmFIb21lKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaiArICIgaXMgbm9ybWFsaXplZCBhbmQgbm90IGluIHRoZSBKUkUgZGlyIiwgIWouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoaiArICIgaXMgbm9ybWFsaXplZCBhbmQgbm90IGluIHRoZSBKUkUgZGlyIiwgaiwgbm90KHN0YXJ0c1dpdGgoamF2YUhvbWUpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKICAgICAgICAgICAgIC8vIGphdmEuaG9tZSBpcyBib2d1cwpAQCAtODMsMzQgKzg3LDMzIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGVjdXRhYmxlTW9zdFBsYXRmb3JtcygpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlRlc3Qgb25seSBydW5zIG9uIG5vbiBOZXR3YXJlIGFuZCBub24gV2luZG93cyBzeXN0ZW1zIiwKLSAgICAgICAgICAgICAgICAhT3MuaXNOYW1lKCJuZXR3YXJlIikgJiYgIU9zLmlzRmFtaWx5KCJ3aW5kb3dzIikpOwotICAgICAgICBTdHJpbmcgamF2YUhvbWUgPSBGSUxFX1VUSUxTLm5vcm1hbGl6ZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoIlRlc3Qgb25seSBydW5zIG9uIG5vbiBOZXR3YXJlIGFuZCBub24gV2luZG93cyBzeXN0ZW1zIiwKKyAgICAgICAgICAgICAgICBPcy5pc05hbWUoIm5ldHdhcmUiKSB8fCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKKyAgICAgICAgU3RyaW5nIGphdmFIb21lID0gRklMRV9VVElMUy5ub3JtYWxpemUoSmF2YUVudlV0aWxzLmdldEphdmFIb21lKCkpLmdldEFic29sdXRlUGF0aCgpOwogCiAgICAgICAgIC8vIGNvdWxkIHN0aWxsIGJlIE9TLzIKICAgICAgICAgU3RyaW5nIGV4dGVuc2lvbiA9IE9zLmlzRmFtaWx5KCJkb3MiKSA/ICIuZXhlIiA6ICIiOwogCiAgICAgICAgIFN0cmluZyBqID0gSmF2YUVudlV0aWxzLmdldEpyZUV4ZWN1dGFibGUoImphdmEiKTsKLSAgICAgICAgaWYgKCFleHRlbnNpb24uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqLmVuZHNXaXRoKGV4dGVuc2lvbikpOworICAgICAgICBpZiAoIWV4dGVuc2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaiwgZW5kc1dpdGgoZXh0ZW5zaW9uKSk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBhYnNvbHV0ZSIsIChuZXcgRmlsZShqKSkuaXNBYnNvbHV0ZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBub3JtYWxpemVkIGFuZCBpbiB0aGUgSlJFIGRpciIsIGouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKUkUgZGlyIiwgaiwgc3RhcnRzV2l0aChqYXZhSG9tZSkpOwogCiAgICAgICAgIGogPSBKYXZhRW52VXRpbHMuZ2V0SmRrRXhlY3V0YWJsZSgiamF2YWMiKTsKLSAgICAgICAgaWYgKCFleHRlbnNpb24uZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqLmVuZHNXaXRoKGV4dGVuc2lvbikpOworICAgICAgICBpZiAoIWV4dGVuc2lvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaiwgZW5kc1dpdGgoZXh0ZW5zaW9uKSk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBhYnNvbHV0ZSIsIChuZXcgRmlsZShqKSkuaXNBYnNvbHV0ZSgpKTsKIAogICAgICAgICBTdHJpbmcgamF2YUhvbWVQYXJlbnQgPSBGSUxFX1VUSUxTLm5vcm1hbGl6ZShqYXZhSG9tZSArICIvLi4iKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBub3JtYWxpemVkIGFuZCBpbiB0aGUgSkRLIGRpciIsIGouc3RhcnRzV2l0aChqYXZhSG9tZVBhcmVudCkpOworICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKREsgZGlyIiwgaiwgc3RhcnRzV2l0aChqYXZhSG9tZVBhcmVudCkpOwogCi0gICAgICAgIGlmICgoT3MuaXNGYW1pbHkoIm1hYyIpICYmIEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbk51bWJlcigpIDw9IEphdmFFbnZVdGlscy5WRVJTSU9OXzFfNikKLSAgICAgICAgICAgIHx8IEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBub3JtYWxpemVkIGFuZCBpbiB0aGUgSlJFIGRpciIsIGouc3RhcnRzV2l0aChqYXZhSG9tZSkpOworICAgICAgICBpZiAoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIGluIHRoZSBKUkUgZGlyIiwgaiwgc3RhcnRzV2l0aChqYXZhSG9tZSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShqICsgIiBpcyBub3JtYWxpemVkIGFuZCBub3QgaW4gdGhlIEpSRSBkaXIiLCAhai5zdGFydHNXaXRoKGphdmFIb21lKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGogKyAiIGlzIG5vcm1hbGl6ZWQgYW5kIG5vdCBpbiB0aGUgSlJFIGRpciIsIGosIG5vdChzdGFydHNXaXRoKGphdmFIb21lKSkpOwogICAgICAgICB9CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iICsgZXh0ZW5zaW9uLCBKYXZhRW52VXRpbHMuZ2V0SnJlRXhlY3V0YWJsZSgiZm9vIikpOwpAQCAtMTI0LDYgKzEyNyw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIGlzSmF2YVZlcnNpb25TdXBwb3J0c0JvdGhWZXJzaW9uc09mSmF2YTkoKSB7CiAgICAgICAgIGFzc3VtZVRydWUoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOwogICAgICAgICBhc3NlcnRUcnVlKCJKQVZBXzFfOSBpcyBub3QgY29uc2lkZXJlZCBlcXVhbCB0byBKQVZBXzkiLApAQCAtMTMxLDYgKzEzNSw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIHB1YmxpYyB2b2lkIGphdmExMElzRGV0ZWN0ZWRQcm9wZXJseSgpIHsKICAgICAgICAgYXNzdW1lVHJ1ZSgiMTAiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIikpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMCIsIEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpKTsKQEAgLTEzOSw0ICsxNDQsMjggQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShKYXZhRW52VXRpbHMuaXNKYXZhVmVyc2lvbigiMTAiKSk7CiAgICAgICAgIGFzc2VydFRydWUoSmF2YUVudlV0aWxzLmlzQXRMZWFzdEphdmFWZXJzaW9uKEphdmFFbnZVdGlscy5KQVZBXzkpKTsKICAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIHB1YmxpYyB2b2lkIGphdmExMUlzRGV0ZWN0ZWRQcm9wZXJseSgpIHsKKyAgICAgICAgYXNzdW1lVHJ1ZSgiMTEiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuc3BlY2lmaWNhdGlvbi52ZXJzaW9uIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMSIsIEphdmFFbnZVdGlscy5nZXRKYXZhVmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDExMCwgSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uTnVtYmVyKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IERld2V5RGVjaW1hbCgiMTEiKSwgSmF2YUVudlV0aWxzLmdldFBhcnNlZEphdmFWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRUcnVlKEphdmFFbnZVdGlscy5pc0phdmFWZXJzaW9uKCIxMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShKYXZhRW52VXRpbHMuaXNBdExlYXN0SmF2YVZlcnNpb24oSmF2YUVudlV0aWxzLkpBVkFfOSkpOworICAgIH0KKyAgICAKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgcHVibGljIHZvaWQgamF2YTEySXNEZXRlY3RlZFByb3Blcmx5KCkgeworICAgICAgICBhc3N1bWVUcnVlKCIxMiIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5zcGVjaWZpY2F0aW9uLnZlcnNpb24iKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyIiwgSmF2YUVudlV0aWxzLmdldEphdmFWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIwLCBKYXZhRW52VXRpbHMuZ2V0SmF2YVZlcnNpb25OdW1iZXIoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRGV3ZXlEZWNpbWFsKCIxMiIpLCBKYXZhRW52VXRpbHMuZ2V0UGFyc2VkSmF2YVZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydFRydWUoSmF2YUVudlV0aWxzLmlzSmF2YVZlcnNpb24oIjEyIikpOworICAgICAgICBhc3NlcnRUcnVlKEphdmFFbnZVdGlscy5pc0F0TGVhc3RKYXZhVmVyc2lvbihKYXZhRW52VXRpbHMuSkFWQV85KSk7CisgICAgfQorCisKIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXNUZXN0LmphdmEKaW5kZXggMWUwYmRmYi4uOWZlMTQ5MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yNCwxMyArMjQsMzUgQEAKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuTWFnaWNUZXN0TmFtZXM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzLnJlYWRGdWxseTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuc3RhcnRzV2l0aDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OwogCiBwdWJsaWMgY2xhc3MgTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXNUZXN0IHsKIAorICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciBmb2xkZXIgPSBuZXcgVGVtcG9yYXJ5Rm9sZGVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNYWdpY1Rlc3ROYW1lcy5URVNUX1JPT1RfRElSRUNUT1JZKTsKKworICAgIHByaXZhdGUgTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXMgbHBmOworCisgICAgcHJpdmF0ZSBGaWxlIHRtcDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOworICAgICAgICB0bXAgPSBmb2xkZXIubmV3RmlsZSgidG1wLnByb3BlcnRpZXMiKTsKKyAgICB9CiAgICAgLyoqCiAgICAgICogVGVzdHMgdGhhdCBhIHByb3BlcnRpZXMgZmlsZSByZWFkIGJ5IHRoZQogICAgICAqIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzRmlsZSBhbmQgdGhlbiBzYXZlcyB0aGUgcHJvcGVydGllcyBpbgpAQCAtMzgsMTQgKzYwLDEwIEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlc2VydmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOworICAgICAgICBGaWxlIHNpbXBsZSA9IG5ldyBGaWxlKFJPT1QsICJzcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3NpbXBsZS5wcm9wZXJ0aWVzIik7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNpbXBsZSk7Ci0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOwogICAgICAgICBscGYubG9hZChmaXMpOwogCi0gICAgICAgIEZpbGUgdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInByb3BzIik7Ci0gICAgICAgIHRtcC5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgbHBmLnNhdmVBcyh0bXApOwogCiAgICAgICAgIC8vIG5vdyBjb21wYXJlIG9yaWdpbmFsIGFuZCB0bXAgZm9yIHByb3BlcnR5IGVxdWl2YWxlbmNlCkBAIC01OSw4ICs3Nyw4IEBACiAKICAgICAgICAgLy8gYW5kIG5vdyBtYWtlIHN1cmUgdGhhdCB0aGUgY29tbWVudHMgbWFkZSBpdCBpbnRvIHRoZSBuZXcgZmlsZQogICAgICAgICBTdHJpbmcgcyA9IHJlYWRGaWxlKHRtcCk7Ci0gICAgICAgIGFzc2VydFRydWUoIm1pc3NpbmcgY29tbWVudCIsIHMuY29udGFpbnMoIiMgYSBjb21tZW50IikpOwotICAgICAgICBhc3NlcnRUcnVlKCJtaXNzaW5nIGNvbW1lbnQiLCBzLmNvbnRhaW5zKCIhIG1vcmUgY29tbWVudCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgibWlzc2luZyBjb21tZW50IiwgcywgY29udGFpbnNTdHJpbmcoKCIjIGEgY29tbWVudCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoIm1pc3NpbmcgY29tbWVudCIsIHMsIGNvbnRhaW5zU3RyaW5nKCgiISBtb3JlIGNvbW1lbnQiKSkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtNjksOCArODcsNiBAQAogICAgICAqLwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVzY2FwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOwotCiAgICAgICAgIGxwZi5zZXRQcm9wZXJ0eSgiIHByb3Agb25lICIsICIgIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyAiKTsKICAgICAgICAgbHBmLnNldFByb3BlcnR5KCJwcm9wXHR0d28iLCAiY29udGFpbnNcdHRhYiIpOwogICAgICAgICBscGYuc2V0UHJvcGVydHkoInByb3BcbnRocmVlIiwgImNvbnRhaW5zXG5uZXdsaW5lIik7CkBAIC04MiwyMiArOTgsMjAgQEAKICAgICAgICAgbHBmLnNldFByb3BlcnR5KCJwcm9wI25pbmUiLCAiY29udGFpbnMjaGFzaCIpOwogICAgICAgICBscGYuc2V0UHJvcGVydHkoInByb3AhdGVuIiwgImNvbnRhaW5zIWV4Y2xhbWF0aW9uIik7CiAKLSAgICAgICAgRmlsZSB0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAicHJvcHMiKTsKLSAgICAgICAgdG1wLmRlbGV0ZU9uRXhpdCgpOwogICAgICAgICBscGYuc2F2ZUFzKHRtcCk7CiAKICAgICAgICAgLy8gYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyBmaWxlIGxvb2tzIG9rYXkKICAgICAgICAgU3RyaW5nIHMgPSByZWFkRmlsZSh0bXApOwogCi0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygiXFwgcHJvcFxcIG9uZVxcID1cXCBcXCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgIikpOwotICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoInByb3BcXHR0d289Y29udGFpbnNcXHR0YWIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygicHJvcFxcbnRocmVlPWNvbnRhaW5zXFxubmV3bGluZSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFxyZm91cj1jb250YWluc1xccmNhcnJpYWdlIHJldHVybiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFxcXHNpeD1jb250YWluc1xcXFxiYWNrc2xhc2giKSk7Ci0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygicHJvcFxcOnNldmVuPWNvbnRhaW5zXFw6Y29sb24iKSk7Ci0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygicHJvcFxcPWVpZ2h0PWNvbnRhaW5zXFw9ZXF1YWxzIikpOwotICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoInByb3BcXCNuaW5lPWNvbnRhaW5zXFwjaGFzaCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFwhdGVuPWNvbnRhaW5zXFwhZXhjbGFtYXRpb24iKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoIlxcIHByb3BcXCBvbmVcXCA9XFwgXFwgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzICIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcdHR3bz1jb250YWluc1xcdHRhYiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcbnRocmVlPWNvbnRhaW5zXFxubmV3bGluZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxccmZvdXI9Y29udGFpbnNcXHJjYXJyaWFnZSByZXR1cm4iKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoInByb3BcXFxcc2l4PWNvbnRhaW5zXFxcXGJhY2tzbGFzaCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcOnNldmVuPWNvbnRhaW5zXFw6Y29sb24iKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoInByb3BcXD1laWdodD1jb250YWluc1xcPWVxdWFscyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcI25pbmU9Y29udGFpbnNcXCNoYXNoIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKCJwcm9wXFwhdGVuPWNvbnRhaW5zXFwhZXhjbGFtYXRpb24iKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDcsMTYzICsxMjEsMTMyIEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgdW51c3VhbCA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgicm9vdCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC91bnVzdWFsLnByb3BlcnRpZXMiKTsKKyAgICAgICAgRmlsZSB1bnVzdWFsID0gbmV3IEZpbGUoUk9PVCwgInNyYy9ldGMvdGVzdGNhc2VzL3V0aWwvdW51c3VhbC5wcm9wZXJ0aWVzIik7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHVudXN1YWwpOwotICAgICAgICBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcyBscGYgPSBuZXcgTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXMoKTsKICAgICAgICAgbHBmLmxvYWQoZmlzKTsKIAogICAgICAgICBscGYuc2V0UHJvcGVydHkoIiBwcm9wIG9uZSAiLCAibmV3IG9uZSIpOwogICAgICAgICBscGYuc2V0UHJvcGVydHkoInByb3BcdHR3byIsICJuZXcgdHdvIik7CiAgICAgICAgIGxwZi5zZXRQcm9wZXJ0eSgicHJvcFxudGhyZWUiLCAibmV3IHRocmVlIik7CiAKLSAgICAgICAgRmlsZSB0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAicHJvcHMiKTsKLSAgICAgICAgdG1wLmRlbGV0ZU9uRXhpdCgpOwogICAgICAgICBscGYuc2F2ZUFzKHRtcCk7CiAKICAgICAgICAgLy8gYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyBmaWxlIGxvb2tzIG9rYXkKICAgICAgICAgU3RyaW5nIHMgPSByZWFkRmlsZSh0bXApOwogCi0gICAgICAgIGFzc2VydFRydWUoIXMuY29udGFpbnMoIlxcIHByb3BcXCBvbmVcXCA9XFwgXFwgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzICIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJcXCBwcm9wXFwgb25lXFwgPW5ldyBvbmUiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIXMuY29udGFpbnMoInByb3BcXHR0d289Y29udGFpbnNcXHR0YWIiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygicHJvcFxcdHR3bz1uZXcgdHdvIikpOwotICAgICAgICBhc3NlcnRUcnVlKCFzLmNvbnRhaW5zKCJwcm9wXFxudGhyZWU9Y29udGFpbnNcXG5uZXdsaW5lIikpOwotICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoInByb3BcXG50aHJlZT1uZXcgdGhyZWUiKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgbm90KGNvbnRhaW5zU3RyaW5nKCJcXCBwcm9wXFwgb25lXFwgPVxcIFxcIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyAiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKCJcXCBwcm9wXFwgb25lXFwgPW5ldyBvbmUiKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgbm90KGNvbnRhaW5zU3RyaW5nKCJwcm9wXFx0dHdvPWNvbnRhaW5zXFx0dGFiIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcdHR3bz1uZXcgdHdvIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIG5vdChjb250YWluc1N0cmluZygicHJvcFxcbnRocmVlPWNvbnRhaW5zXFxubmV3bGluZSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoInByb3BcXG50aHJlZT1uZXcgdGhyZWUiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3RvcmVXaXRoSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgc2ltcGxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3V0aWwvc2ltcGxlLnByb3BlcnRpZXMiKTsKKyAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShST09ULCAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzaW1wbGUpOwotICAgICAgICBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcyBscGYgPSBuZXcgTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXMoKTsKICAgICAgICAgbHBmLmxvYWQoZmlzKTsKIAotICAgICAgICBGaWxlIHRtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJwcm9wcyIpOwotICAgICAgICB0bXAuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKTsKLSAgICAgICAgbHBmLnN0b3JlKGZvcywgImZpbGUtaGVhZGVyIik7Ci0gICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKSkgeworICAgICAgICAgICAgbHBmLnN0b3JlKGZvcywgImZpbGUtaGVhZGVyIik7CisgICAgICAgIH0KIAogICAgICAgICAvLyBhbmQgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIGZpbGUgbG9va3Mgb2theQotICAgICAgICBTdHJpbmcgcyA9IHJlYWRGaWxlKHRtcCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgaGFkIGhlYWRlciAiLCBzLnN0YXJ0c1dpdGgoIiNmaWxlLWhlYWRlciIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic2hvdWxkIGhhdmUgaGFkIGhlYWRlciAiLCByZWFkRmlsZSh0bXApLCBzdGFydHNXaXRoKCIjZmlsZS1oZWFkZXIiKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOworICAgICAgICBGaWxlIHNpbXBsZSA9IG5ldyBGaWxlKFJPT1QsICJzcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3NpbXBsZS5wcm9wZXJ0aWVzIik7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNpbXBsZSk7Ci0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOwogICAgICAgICBscGYubG9hZChmaXMpOwogCiAgICAgICAgIGxwZi5jbGVhcigpOwogCi0gICAgICAgIEZpbGUgdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInByb3BzIik7Ci0gICAgICAgIHRtcC5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgbHBmLnNhdmVBcyh0bXApOwogCiAgICAgICAgIC8vIGFuZCBjaGVjayB0aGF0IHRoZSByZXN1bHRpbmcgZmlsZSBsb29rcyBva2F5CiAgICAgICAgIFN0cmluZyBzID0gcmVhZEZpbGUodG1wKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBoYWQgbm8gcHJvcGVydGllcyAiLCAhcy5jb250YWlucygicHJvcC5hbHBoYSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgaGFkIG5vIHByb3BlcnRpZXMgIiwgIXMuY29udGFpbnMoInByb3AuYmV0YSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgaGFkIG5vIHByb3BlcnRpZXMgIiwgIXMuY29udGFpbnMoInByb3AuZ2FtbWEiKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBubyBwcm9wZXJ0aWVzICIsIHMsIG5vdChjb250YWluc1N0cmluZygoInByb3AuYWxwaGEiKSkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic2hvdWxkIGhhdmUgaGFkIG5vIHByb3BlcnRpZXMgIiwgcywgbm90KGNvbnRhaW5zU3RyaW5nKCgicHJvcC5iZXRhIikpKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBubyBwcm9wZXJ0aWVzICIsIHMsIG5vdChjb250YWluc1N0cmluZygoInByb3AuZ2FtbWEiKSkpKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBoYWQgbm8gY29tbWVudHMiLCAhcy5jb250YWlucygiIyBhIGNvbW1lbnQiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIGhhZCBubyBjb21tZW50cyIsICFzLmNvbnRhaW5zKCIhIG1vcmUgY29tbWVudCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIGhhdmUgaGFkIG5vIGNvbW1lbnRzIiwgIXMuY29udGFpbnMoIiMgbm93IGEgbGluZSB3cmFwcGluZyBvbmUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBubyBjb21tZW50cyIsIHMsIG5vdChjb250YWluc1N0cmluZygoIiMgYSBjb21tZW50IikpKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBubyBjb21tZW50cyIsIHMsIG5vdChjb250YWluc1N0cmluZygoIiEgbW9yZSBjb21tZW50IikpKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBubyBjb21tZW50cyIsIHMsIG5vdChjb250YWluc1N0cmluZygoIiMgbm93IGEgbGluZSB3cmFwcGluZyBvbmUiKSkpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOworICAgICAgICBGaWxlIHNpbXBsZSA9IG5ldyBGaWxlKFJPT1QsICJzcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3NpbXBsZS5wcm9wZXJ0aWVzIik7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNpbXBsZSk7Ci0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOwogICAgICAgICBscGYubG9hZChmaXMpOwogCiAgICAgICAgIGxwZi5yZW1vdmUoInByb3AuYmV0YSIpOwogCi0gICAgICAgIEZpbGUgdG1wID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInByb3BzIik7Ci0gICAgICAgIHRtcC5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgbHBmLnNhdmVBcyh0bXApOwogCiAgICAgICAgIC8vIGFuZCBjaGVjayB0aGF0IHRoZSByZXN1bHRpbmcgZmlsZSBsb29rcyBva2F5CiAgICAgICAgIFN0cmluZyBzID0gcmVhZEZpbGUodG1wKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgbm90IGhhdmUgaGFkIHByb3AuYmV0YSIsICFzLmNvbnRhaW5zKCJwcm9wLmJldGEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBoYXZlIGhhZCBwcm9wLmJldGEncyBjb21tZW50Iiwgcy5jb250YWlucygiISBtb3JlIGNvbW1lbnQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBub3QgaGF2ZSBoYWQgcHJvcC5iZXRhIiwgcywgbm90KGNvbnRhaW5zU3RyaW5nKCgicHJvcC5iZXRhIikpKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCBwcm9wLmJldGEncyBjb21tZW50IiwgcywgY29udGFpbnNTdHJpbmcoIiEgbW9yZSBjb21tZW50IikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZVdpdGhDb21tZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgc2ltcGxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3V0aWwvc2ltcGxlLnByb3BlcnRpZXMiKTsKKyAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShST09ULCAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzaW1wbGUpOwotICAgICAgICBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcyBscGYgPSBuZXcgTGF5b3V0UHJlc2VydmluZ1Byb3BlcnRpZXMoKTsKICAgICAgICAgbHBmLmxvYWQoZmlzKTsKIAogICAgICAgICBscGYuc2V0UmVtb3ZlQ29tbWVudHModHJ1ZSk7CiAKICAgICAgICAgbHBmLnJlbW92ZSgicHJvcC5iZXRhIik7CiAKLSAgICAgICAgRmlsZSB0bXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0bXAiLCAicHJvcHMiKTsKLSAgICAgICAgdG1wLmRlbGV0ZU9uRXhpdCgpOwogICAgICAgICBscGYuc2F2ZUFzKHRtcCk7CiAKICAgICAgICAgLy8gYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdGluZyBmaWxlIGxvb2tzIG9rYXkKICAgICAgICAgU3RyaW5nIHMgPSByZWFkRmlsZSh0bXApOwogCi0gICAgICAgIGFzc2VydFRydWUoInNob3VsZCBub3QgaGF2ZSBoYWQgcHJvcC5iZXRhIiwgIXMuY29udGFpbnMoInByb3AuYmV0YSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgic2hvdWxkIG5vdCBoYXZlIGhhZCBwcm9wLmJldGEncyBjb21tZW50IiwgIXMuY29udGFpbnMoIiEgbW9yZSBjb21tZW50IikpOworICAgICAgICBhc3NlcnRUaGF0KCJzaG91bGQgbm90IGhhdmUgaGFkIHByb3AuYmV0YSIsIHMsIG5vdChjb250YWluc1N0cmluZygoInByb3AuYmV0YSIpKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJzaG91bGQgbm90IGhhdmUgaGFkIHByb3AuYmV0YSdzIGNvbW1lbnQiLCBzLCBub3QoY29udGFpbnNTdHJpbmcoKCIhIG1vcmUgY29tbWVudCIpKSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZpbGUgc2ltcGxlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3V0aWwvc2ltcGxlLnByb3BlcnRpZXMiKTsKKyAgICAgICAgRmlsZSBzaW1wbGUgPSBuZXcgRmlsZShST09ULCAic3JjL2V0Yy90ZXN0Y2FzZXMvdXRpbC9zaW1wbGUucHJvcGVydGllcyIpOwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzaW1wbGUpOwotICAgICAgICBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcyBscGYxID0gbmV3IExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGxwZjEubG9hZChmaXMpOworICAgICAgICBscGYubG9hZChmaXMpOwogCi0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZjIgPQotICAgICAgICAgICAgKExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzKSBscGYxLmNsb25lKCk7CisgICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZkNsb25lID0gKExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzKSBscGYuY2xvbmUoKTsKIAotICAgICAgICBscGYyLnNldFByb3BlcnR5KCJwcm9wLm5ldyIsICJhIG5ldyBwcm9wZXJ0eSIpOwotICAgICAgICBscGYyLnNldFByb3BlcnR5KCJwcm9wLmJldGEiLCAiYSBuZXcgdmFsdWUgZm9yIGJldGEiKTsKKyAgICAgICAgbHBmQ2xvbmUuc2V0UHJvcGVydHkoInByb3AubmV3IiwgImEgbmV3IHByb3BlcnR5Iik7CisgICAgICAgIGxwZkNsb25lLnNldFByb3BlcnR5KCJwcm9wLmJldGEiLCAiYSBuZXcgdmFsdWUgZm9yIGJldGEiKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMoInNpemUgb2Ygb3JpZ2luYWwgaXMgd3JvbmciLCAzLCBscGYxLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2l6ZSBvZiBjbG9uZSBpcyB3cm9uZyIsIDQsIGxwZjIuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzaXplIG9mIG9yaWdpbmFsIGlzIHdyb25nIiwgMywgbHBmLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2l6ZSBvZiBjbG9uZSBpcyB3cm9uZyIsIDQsIGxwZkNsb25lLnNpemUoKSk7CiAKLSAgICAgICAgRmlsZSB0bXAxID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgInByb3BzIik7Ci0gICAgICAgIHRtcDEuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIGxwZjEuc2F2ZUFzKHRtcDEpOwotICAgICAgICBTdHJpbmcgczEgPSByZWFkRmlsZSh0bXAxKTsKKyAgICAgICAgbHBmLnNhdmVBcyh0bXApOworICAgICAgICBTdHJpbmcgczEgPSByZWFkRmlsZSh0bXApOwogCi0gICAgICAgIEZpbGUgdG1wMiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJwcm9wcyIpOwotICAgICAgICB0bXAyLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICBscGYyLnNhdmVBcyh0bXAyKTsKLSAgICAgICAgU3RyaW5nIHMyID0gcmVhZEZpbGUodG1wMik7CisgICAgICAgIEZpbGUgdG1wQ2xvbmUgPSBmb2xkZXIubmV3RmlsZSgidG1wLWNsb25lLnByb3BlcnRpZXMiKTsKKyAgICAgICAgbHBmQ2xvbmUuc2F2ZUFzKHRtcENsb25lKTsKKyAgICAgICAgU3RyaW5nIHMyID0gcmVhZEZpbGUodG1wQ2xvbmUpOwogCiAgICAgICAgIC8vIGNoZWNrIG9yaWdpbmFsIGlzIHVudG91Y2hlZAotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBoYWQgJ3NpbXBsZSciLCBzMS5jb250YWlucygic2ltcGxlIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgbm90IGhhdmUgaGFkIHByb3AubmV3IiwgIXMxLmNvbnRhaW5zKCJwcm9wLm5ldyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic2hvdWxkIGhhdmUgaGFkICdzaW1wbGUnIiwgczEsIGNvbnRhaW5zU3RyaW5nKCgic2ltcGxlIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgic2hvdWxkIG5vdCBoYXZlIGhhZCBwcm9wLm5ldyIsIHMxLCBub3QoY29udGFpbnNTdHJpbmcoKCJwcm9wLm5ldyIpKSkpOwogCiAgICAgICAgIC8vIGNoZWNrIGNsb25lIGhhcyB0aGUgY2hhbmdlcwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBoYWQgJ2EgbmV3IHZhbHVlIGZvciBiZXRhJyIsCi0gICAgICAgICAgICAgICAgczIuY29udGFpbnMoImEgbmV3IHZhbHVlIGZvciBiZXRhIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJzaG91bGQgaGF2ZSBoYWQgcHJvcC5uZXciLCBzMi5jb250YWlucygicHJvcC5uZXciKSk7CisgICAgICAgIGFzc2VydFRoYXQoInNob3VsZCBoYXZlIGhhZCAnYSBuZXcgdmFsdWUgZm9yIGJldGEnIiwgczIsIGNvbnRhaW5zU3RyaW5nKCgiYSBuZXcgdmFsdWUgZm9yIGJldGEiKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJzaG91bGQgaGF2ZSBoYWQgcHJvcC5uZXciLCBzMiwgY29udGFpbnNTdHJpbmcoKCJwcm9wLm5ldyIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlc2VydmVFc2NhcGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExheW91dFByZXNlcnZpbmdQcm9wZXJ0aWVzIGxwZiA9IG5ldyBMYXlvdXRQcmVzZXJ2aW5nUHJvcGVydGllcygpOwotICAgICAgICBGaWxlIHVudXN1YWwgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy9ldGMvdGVzdGNhc2VzL3V0aWwvdW51c3VhbC5wcm9wZXJ0aWVzIik7CisgICAgICAgIEZpbGUgdW51c3VhbCA9IG5ldyBGaWxlKFJPT1QsICJzcmMvZXRjL3Rlc3RjYXNlcy91dGlsL3VudXN1YWwucHJvcGVydGllcyIpOwogICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh1bnVzdWFsKTsKICAgICAgICAgbHBmLmxvYWQoZmlzKTsKIApAQCAtMjc0LDMxICsyNTcsMjYgQEAKICAgICAgICAgbHBmLnNldFByb3BlcnR5KCJhbHBoYSIsICJuZXcgdmFsdWUgZm9yIGFscGhhIik7CiAgICAgICAgIGxwZi5zZXRQcm9wZXJ0eSgiYmV0YSIsICJuZXcgdmFsdWUgZm9yIGJldGEiKTsKIAotICAgICAgICBGaWxlIHRtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRtcCIsICJwcm9wcyIpOwotICAgICAgICB0bXAuZGVsZXRlT25FeGl0KCk7CiAgICAgICAgIGxwZi5zYXZlQXModG1wKTsKIAogICAgICAgICAvLyBhbmQgY2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIGZpbGUgbG9va3Mgb2theQogICAgICAgICBTdHJpbmcgcyA9IHJlYWRGaWxlKHRtcCk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFw6c2V2ZW49bmV3IHZhbHVlIGZvciBzZXZlbiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFw9ZWlnaHQ9bmV3IHZhbHVlIGZvciBlaWdodCIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJwcm9wXFwgZWxldmVuPW5ldyB2YWx1ZSBmb3IgZWxldmVuIikpOwotICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoImFscGhhPW5ldyB2YWx1ZSBmb3IgYWxwaGEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygiYmV0YT1uZXcgdmFsdWUgZm9yIGJldGEiKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoInByb3BcXDpzZXZlbj1uZXcgdmFsdWUgZm9yIHNldmVuIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKCJwcm9wXFw9ZWlnaHQ9bmV3IHZhbHVlIGZvciBlaWdodCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygicHJvcFxcIGVsZXZlbj1uZXcgdmFsdWUgZm9yIGVsZXZlbiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygiYWxwaGE9bmV3IHZhbHVlIGZvciBhbHBoYSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygiYmV0YT1uZXcgdmFsdWUgZm9yIGJldGEiKSk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSghcy5jb250YWlucygicHJvcFxcOnNldmVuPWNvbnRhaW5zXFw6Y29sb24iKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIXMuY29udGFpbnMoInByb3BcXD1laWdodD1jb250YWluc1xcPWVxdWFscyIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghcy5jb250YWlucygiYWxwaGE6c2V0IHdpdGggYSBjb2xvbiIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghcy5jb250YWlucygiYmV0YSBzZXQgd2l0aCBhIHNwYWNlIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIG5vdChjb250YWluc1N0cmluZygicHJvcFxcOnNldmVuPWNvbnRhaW5zXFw6Y29sb24iKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIG5vdChjb250YWluc1N0cmluZygicHJvcFxcPWVpZ2h0PWNvbnRhaW5zXFw9ZXF1YWxzIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBub3QoY29udGFpbnNTdHJpbmcoImFscGhhOnNldCB3aXRoIGEgY29sb24iKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIG5vdChjb250YWluc1N0cmluZygiYmV0YSBzZXQgd2l0aCBhIHNwYWNlIikpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEZpbGUoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmKTsKLSAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpcyk7Ci0gICAgICAgIFN0cmluZyBzID0gRmlsZVV0aWxzLnJlYWRGdWxseShpc3IpOwotICAgICAgICBpc3IuY2xvc2UoKTsKLSAgICAgICAgZmlzLmNsb3NlKCk7Ci0gICAgICAgIHJldHVybiBzOworICAgICAgICB0cnkgKElucHV0U3RyZWFtUmVhZGVyIGlzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGYpKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRGdWxseShpc3IpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGF6eUZpbGVPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA4MmMzNjM0Li4yOGIwYTY4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC0zMCw3ICszMSw3IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBMYXp5RmlsZU91dHB1dFN0cmVhbVRlc3QgewogICAgIHByaXZhdGUgTGF6eUZpbGVPdXRwdXRTdHJlYW0gbG9zOwotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEZpbGUgZiA9IG5ldyBGaWxlKCJ0ZXN0LnR4dCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpbGUgZiA9IG5ldyBGaWxlKCJ0ZXN0LnR4dCIpOwogCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgewpAQCAtNDksNyArNTAsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsZVdpdGhvdXRXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGxvcy5jbG9zZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGYgKyAiIGhhcyBub3QgYmVlbiB3cml0dGVuLiIsICFmLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZiArICIgaGFzIG5vdCBiZWVuIHdyaXR0ZW4uIiwgZi5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmVPcmllbnRlZE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmVPcmllbnRlZE91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCA2OGE4MTY0Li42ZWJiOTUxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5lT3JpZW50ZWRPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGluZU9yaWVudGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90SW52b2tlZCgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIG91dHB1dCIsICFpbnZva2VkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJObyBvdXRwdXQiLCBpbnZva2VkKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmtlZEhhc2h0YWJsZVRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xpbmtlZEhhc2h0YWJsZVRlc3QuamF2YQppbmRleCBiZmQyY2RhLi40YTRiNjcyIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9MaW5rZWRIYXNodGFibGVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTGlua2VkSGFzaHRhYmxlVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTcgKzE4LDIzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc0tleTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmhhc1ZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIExpbmtlZEhhc2h0YWJsZVRlc3QgewogCkBAIC0zNiw3ICs0Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEsyID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBWMSA9IG5ldyBPYmplY3QoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3QgVjIgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBIYXNodGFibGUgaCA9IG5ldyBMaW5rZWRIYXNodGFibGUoKTsKKyAgICBwcml2YXRlIEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4gaCA9IG5ldyBMaW5rZWRIYXNodGFibGU8PigpOwogCiAgICAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgewogICAgICAgICBoLnB1dChLMSwgVjEpOwpAQCAtNDQsMjAgKzUwLDIxIEBACiAgICAgICAgIGFzc2VydFRydWUoaC5pc0VtcHR5KCkpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKICAgICAgICAgaC5wdXQoSzEsIFYxKTsKLSAgICAgICAgSGFzaHRhYmxlIGgyID0gKEhhc2h0YWJsZSkgaC5jbG9uZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGgyIGluc3RhbmNlb2YgTGlua2VkSGFzaHRhYmxlKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoMi5jb250YWluc0tleShLMSkpOworICAgICAgICBIYXNodGFibGU8T2JqZWN0LCBPYmplY3Q+IGgyID0gKEhhc2h0YWJsZTxPYmplY3QsIE9iamVjdD4pIGguY2xvbmUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoMiwgaW5zdGFuY2VPZihMaW5rZWRIYXNodGFibGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoMiwgaGFzS2V5KEsxKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbmRQdXQoKSB7CiAgICAgICAgIGgucHV0KEsxLCBWMSk7CiAgICAgICAgIGFzc2VydFRydWUoaC5jb250YWlucyhLMSkpOwotICAgICAgICBhc3NlcnRUcnVlKGguY29udGFpbnNLZXkoSzEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShoLmNvbnRhaW5zVmFsdWUoVjEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoaC5jb250YWluc0tleShLMikpOworICAgICAgICBhc3NlcnRUaGF0KGgsIGhhc0tleShLMSkpOworICAgICAgICBhc3NlcnRUaGF0KGgsIGhhc1ZhbHVlKFYxKSk7CisgICAgICAgIGFzc2VydFRoYXQoaCwgbm90KGhhc0tleShLMikpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtODIsMTAgKzg5LDEwIEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRBbGwoKSB7Ci0gICAgICAgIExpbmtlZEhhc2h0YWJsZSBoMiA9IG5ldyBMaW5rZWRIYXNodGFibGUoKTsKKyAgICAgICAgTGlua2VkSGFzaHRhYmxlPE9iamVjdCwgT2JqZWN0PiBoMiA9IG5ldyBMaW5rZWRIYXNodGFibGU8PigpOwogICAgICAgICBoLnB1dChLMSwgVjEpOwogICAgICAgICBoMi5wdXRBbGwoaCk7Ci0gICAgICAgIGFzc2VydFRydWUoaDIuY29udGFpbnNLZXkoSzEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoMiwgaGFzS2V5KEsxKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwNiw3ICsxMTMsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEtleXMoKSB7CiAgICAgICAgIG11bHRpU2V0dXAoKTsKLSAgICAgICAgYXNzZXJ0S2V5cyhDb2xsZWN0aW9uVXRpbHMuYXNJdGVyYXRvcihoLmtleXMoKSkpOworICAgICAgICBhc3NlcnRLZXlzKENvbGxlY3Rpb25zLmxpc3QoaC5rZXlzKCkpLml0ZXJhdG9yKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xMTgsNyArMTI1LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbGVtZW50cygpIHsKICAgICAgICAgbXVsdGlTZXR1cCgpOwotICAgICAgICBhc3NlcnRWYWx1ZXMoQ29sbGVjdGlvblV0aWxzLmFzSXRlcmF0b3IoaC5lbGVtZW50cygpKSk7CisgICAgICAgIGFzc2VydFZhbHVlcyhDb2xsZWN0aW9ucy5saXN0KGguZWxlbWVudHMoKSkuaXRlcmF0b3IoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEzMCwxMyArMTM3LDEzIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXQoKSB7CiAgICAgICAgIG11bHRpU2V0dXAoKTsKLSAgICAgICAgSXRlcmF0b3IgaSA9IGguZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+PiBpID0gaC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CiAgICAgICAgIGFzc2VydFRydWUoaS5oYXNOZXh0KCkpOwotICAgICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIGkubmV4dCgpOworICAgICAgICBNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGUgPSBpLm5leHQoKTsKICAgICAgICAgYXNzZXJ0U2FtZShLMSwgZS5nZXRLZXkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoVjEsIGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydFRydWUoaS5oYXNOZXh0KCkpOwotICAgICAgICBlID0gKE1hcC5FbnRyeSkgaS5uZXh0KCk7CisgICAgICAgIGUgPSBpLm5leHQoKTsKICAgICAgICAgYXNzZXJ0U2FtZShLMiwgZS5nZXRLZXkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoVjIsIGUuZ2V0VmFsdWUoKSk7CiAgICAgICAgIGFzc2VydEZhbHNlKGkuaGFzTmV4dCgpKTsKQEAgLTE0Nyw3ICsxNTQsNyBAQAogICAgICAgICBoLnB1dChLMiwgVjIpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0S2V5cyhJdGVyYXRvciBpKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRLZXlzKEl0ZXJhdG9yPE9iamVjdD4gaSkgewogICAgICAgICBhc3NlcnRUcnVlKGkuaGFzTmV4dCgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShLMSwgaS5uZXh0KCkpOwogICAgICAgICBhc3NlcnRUcnVlKGkuaGFzTmV4dCgpKTsKQEAgLTE1NSw3ICsxNjIsNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShpLmhhc05leHQoKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWx1ZXMoSXRlcmF0b3IgaSkgeworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VmFsdWVzKEl0ZXJhdG9yPE9iamVjdD4gaSkgewogICAgICAgICBhc3NlcnRUcnVlKGkuaGFzTmV4dCgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShWMSwgaS5uZXh0KCkpOwogICAgICAgICBhc3NlcnRUcnVlKGkuaGFzTmV4dCgpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL0xvYWRlclV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHNUZXN0LmphdmEKaW5kZXggOTkzNWVkZC4uMTk2ZGQxMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvTG9hZGVyVXRpbHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9OYXRpdmUyQXNjaWlVdGlsc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL05hdGl2ZTJBc2NpaVV0aWxzVGVzdC5qYXZhCmluZGV4IGYzYjU0ZTYuLjA4MWU5MTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL05hdGl2ZTJBc2NpaVV0aWxzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL05hdGl2ZTJBc2NpaVV0aWxzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YQppbmRleCBmZGY3MzkzLi4yNGU3ZTE5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMxLDEwICszMSw5IEBACiAgICAgICAgIG1hcHBlci5zZXRGcm9tKCIqLmphdmEiKTsKICAgICAgICAgbWFwcGVyLnNldFRvKCJURVNULSoueG1sIik7CiAgICAgICAgIFN0cmluZyBmaWxlID0gZml4dXBQYXRoKCJvcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1BhY2thZ2VOYW1lTWFwcGVyVGVzdC5qYXZhIik7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBtYXBwZXIubWFwRmlsZU5hbWUoZmlsZSlbMF07CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJURVNULW9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuUGFja2FnZU5hbWVNYXBwZXJUZXN0LnhtbCIsCi0gICAgICAgICAgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBtYXBwZXIubWFwRmlsZU5hbWUoZmlsZSlbMF0pOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGZpeHVwUGF0aChTdHJpbmcgZmlsZSkgewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGVybWlzc2lvblV0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUGVybWlzc2lvblV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZmE2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9QZXJtaXNzaW9uVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc3VtZS5hc3N1bWVOb3ROdWxsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuUG9zaXhGaWxlQXR0cmlidXRlVmlldzsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5Qb3NpeEZpbGVQZXJtaXNzaW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuRmlsZVJlc291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5UYXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMuWmlwUmVzb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFyRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy50YXIuVGFyT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuemlwLlppcE91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCitwdWJsaWMgY2xhc3MgUGVybWlzc2lvblV0aWxzVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBUZW1wb3JhcnlGb2xkZXIgZm9sZGVyID0gbmV3IFRlbXBvcmFyeUZvbGRlcigpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtb2RlRnJvbVBlcm1pc3Npb25zUmV0dXJuc0V4cGVjdGVkUmVzdWx0KCkgeworICAgICAgICBpbnQgbW9kZSA9IFBlcm1pc3Npb25VdGlscy5tb2RlRnJvbVBlcm1pc3Npb25zKEVudW1TZXQub2YoUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfRVhFQ1VURSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvblV0aWxzLkZpbGVUeXBlLlJFR1VMQVJfRklMRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTAwNzAwIiwgSW50ZWdlci50b1N0cmluZyhtb2RlLCA4KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwZXJtaXNzaW9uc0Zyb21Nb2RlUmV0dXJuc0V4cGVjdGVkUmVzdWx0KCkgeworICAgICAgICBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcyA9IFBlcm1pc3Npb25VdGlscy5wZXJtaXNzaW9uc0Zyb21Nb2RlKDAxMDA3NTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoRW51bVNldC5vZihQb3NpeEZpbGVQZXJtaXNzaW9uLk9XTkVSX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5HUk9VUF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpeEZpbGVQZXJtaXNzaW9uLkdST1VQX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1RIRVJTX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpeEZpbGVQZXJtaXNzaW9uLk9USEVSU19FWEVDVVRFKSwKKyAgICAgICAgICAgICAgICAgICAgIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGV0ZWN0c0ZpbGVUeXBlT2ZSZWd1bGFyRmlsZUZyb21QYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBlcm1pc3Npb25VdGlscy5GaWxlVHlwZS5SRUdVTEFSX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uVXRpbHMuRmlsZVR5cGUub2YoZm9sZGVyLm5ld0ZpbGUoImFudC50c3QiKS50b1BhdGgoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZGV0ZWN0c0ZpbGVUeXBlT2ZSZWd1bGFyRmlsZUZyb21SZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscyhQZXJtaXNzaW9uVXRpbHMuRmlsZVR5cGUuUkVHVUxBUl9GSUxFLAorICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvblV0aWxzLkZpbGVUeXBlLm9mKG5ldyBGaWxlUmVzb3VyY2UoZm9sZGVyLm5ld0ZpbGUoImFudC50c3QiKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRldGVjdHNGaWxlVHlwZU9mRGlyZWN0b3J5RnJvbVBhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoUGVybWlzc2lvblV0aWxzLkZpbGVUeXBlLkRJUiwKKyAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25VdGlscy5GaWxlVHlwZS5vZihmb2xkZXIubmV3Rm9sZGVyKCJhbnQudHN0IikudG9QYXRoKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRldGVjdHNGaWxlVHlwZU9mRGlyZWN0b3J5RnJvbVJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBlcm1pc3Npb25VdGlscy5GaWxlVHlwZS5ESVIsCisgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uVXRpbHMuRmlsZVR5cGUub2YobmV3IEZpbGVSZXNvdXJjZShmb2xkZXIubmV3Rm9sZGVyKCJhbnQudHN0IikpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRTZXRQZXJtaXNzaW9uc1dvcmtzRm9yRmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBmb2xkZXIubmV3RmlsZSgiYW50LnRzdCIpOworICAgICAgICBhc3N1bWVOb3ROdWxsKEZpbGVzLmdldEZpbGVBdHRyaWJ1dGVWaWV3KGYudG9QYXRoKCksCisgICAgICAgICAgICAgICAgUG9zaXhGaWxlQXR0cmlidXRlVmlldy5jbGFzcykpOworICAgICAgICBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcyA9CisgICAgICAgICAgICBFbnVtU2V0Lm9mKFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICBQb3NpeEZpbGVQZXJtaXNzaW9uLkdST1VQX1JFQUQpOworICAgICAgICBQZXJtaXNzaW9uVXRpbHMuc2V0UGVybWlzc2lvbnMobmV3IEZpbGVSZXNvdXJjZShmKSwgcywgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBQZXJtaXNzaW9uVXRpbHMuZ2V0UGVybWlzc2lvbnMobmV3IEZpbGVSZXNvdXJjZShmKSwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0U2V0UGVybWlzc2lvbnNXb3Jrc0ZvclppcFJlc291cmNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgZiA9IGZvbGRlci5uZXdGaWxlKCJhbnQuemlwIik7CisgICAgICAgIHRyeSAoWmlwT3V0cHV0U3RyZWFtIG9zID0gbmV3IFppcE91dHB1dFN0cmVhbShmKSkgeworICAgICAgICAgICAgWmlwRW50cnkgZSA9IG5ldyBaaXBFbnRyeSgiZm9vIik7CisgICAgICAgICAgICBvcy5wdXROZXh0RW50cnkoZSk7CisgICAgICAgICAgICBvcy5jbG9zZUVudHJ5KCk7CisgICAgICAgIH0KKworICAgICAgICBaaXBSZXNvdXJjZSByID0gbmV3IFppcFJlc291cmNlKCk7CisgICAgICAgIHIuc2V0TmFtZSgiZm9vIik7CisgICAgICAgIHIuc2V0QXJjaGl2ZShmKTsKKyAgICAgICAgU2V0PFBvc2l4RmlsZVBlcm1pc3Npb24+IHMgPQorICAgICAgICAgICAgRW51bVNldC5vZihQb3NpeEZpbGVQZXJtaXNzaW9uLk9XTkVSX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgIFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfRVhFQ1VURSwKKyAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5HUk9VUF9SRUFEKTsKKyAgICAgICAgUGVybWlzc2lvblV0aWxzLnNldFBlcm1pc3Npb25zKHIsIHMsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMocywgUGVybWlzc2lvblV0aWxzLmdldFBlcm1pc3Npb25zKHIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFNldFBlcm1pc3Npb25zV29ya3NGb3JUYXJSZXNvdXJjZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBGaWxlIGYgPSBmb2xkZXIubmV3RmlsZSgiYW50LnRhciIpOworICAgICAgICB0cnkgKFRhck91dHB1dFN0cmVhbSBvcyA9IG5ldyBUYXJPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpKSB7CisgICAgICAgICAgICBUYXJFbnRyeSBlID0gbmV3IFRhckVudHJ5KCJmb28iKTsKKyAgICAgICAgICAgIG9zLnB1dE5leHRFbnRyeShlKTsKKyAgICAgICAgICAgIG9zLmNsb3NlRW50cnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIFRhclJlc291cmNlIHIgPSBuZXcgVGFyUmVzb3VyY2UoKTsKKyAgICAgICAgci5zZXROYW1lKCJmb28iKTsKKyAgICAgICAgci5zZXRBcmNoaXZlKGYpOworICAgICAgICBTZXQ8UG9zaXhGaWxlUGVybWlzc2lvbj4gcyA9CisgICAgICAgICAgICBFbnVtU2V0Lm9mKFBvc2l4RmlsZVBlcm1pc3Npb24uT1dORVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgUG9zaXhGaWxlUGVybWlzc2lvbi5PV05FUl9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICBQb3NpeEZpbGVQZXJtaXNzaW9uLkdST1VQX1JFQUQpOworICAgICAgICBQZXJtaXNzaW9uVXRpbHMuc2V0UGVybWlzc2lvbnMociwgcywgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBQZXJtaXNzaW9uVXRpbHMuZ2V0UGVybWlzc2lvbnMociwgbnVsbCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1JlYWRlcklucHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggMTk1MWE4YS4uZjZmZDg0ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVhZGVySW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAoraW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50Lk1hZ2ljVGVzdE5hbWVzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CkBAIC0yNCwxNSArMjUsMTcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKICAqIFRlc3QgZm9yIFJlYWRlcklucHV0U3RyZWFtCiAgKi8KIHB1YmxpYyBjbGFzcyBSZWFkZXJJbnB1dFN0cmVhbVRlc3QgewogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTWFnaWNUZXN0TmFtZXMuVEVTVF9ST09UX0RJUkVDVE9SWSk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY29tcGFyZUJ5dGVzKCJhYmMiLCAidXRmLTgiKTsKQEAgLTU5LDkgKzYyLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGVzW3BvcysrXSA9IChieXRlKSByZXM7CiAgICAgICAgIH0KLSAgICAgICAgYnl0ZXMgPSAiYWJjIi5nZXRCeXRlcygidXRmLTE2Iik7CisgICAgICAgIGJ5dGVzID0gImFiYyIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfMTYpOwogICAgICAgICAvLyAgICAgICAgU3RyaW5nIG4gPSBuZXcgU3RyaW5nKGJ5dGVzLCAwLCBwb3MsICJ1dGYtMTYiKTsKLSAgICAgICAgbmV3IFN0cmluZyhieXRlcywgMCwgYnl0ZXMubGVuZ3RoLCAidXRmLTE2Iik7CisgICAgICAgIG5ldyBTdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfMTYpOwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCkBAIC03OSw2OSArODIsNTQgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVhbXBsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBieXRlW10gYnl0ZXMgPSAiIi5nZXRCeXRlcygidXRmLTE2Iik7CisgICAgcHVibGljIHZvaWQgdGVzdFByZWFtcGxlKCkgeworICAgICAgICBieXRlW10gYnl0ZXMgPSAiIi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl8xNik7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJlYW1wbGUgbGVuIGlzICIgKyBieXRlcy5sZW5ndGgpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdElzbzg4NTkxVG9VdGY4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtUmVhZGVyIGZpbiA9IG51bGw7Ci0gICAgICAgIFJlYWRlcklucHV0U3RyZWFtIHIgPSBudWxsOwotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gdXRmOCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInJvb3QiKSwKLSAgICAgICAgICAgICAgICAgICAgInNyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvaW5wdXQvaXNvODg1OS0xIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJU084ODU5XzEiKTsKLSAgICAgICAgICAgIHIgPSBuZXcgUmVhZGVySW5wdXRTdHJlYW0oZmluLCAiVVRGOCIpOwotCi0gICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYWN0dWFsT1MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBhY3R1YWxPUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IChSZWFkZXJJbnB1dFN0cmVhbSByID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKFJPT1QsCisgICAgICAgICAgICAgICAgInNyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2V4ZWMvaW5wdXQvaXNvODg1OS0xIikpLCBTdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzEpLAorICAgICAgICAgICAgICAgIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKSB7CiAgICAgICAgICAgICBpbnQgYiA9IHIucmVhZCgpOwogICAgICAgICAgICAgd2hpbGUgKGIgPiAtMSkgewogICAgICAgICAgICAgICAgIGFjdHVhbE9TLndyaXRlKChieXRlKSBiKTsKICAgICAgICAgICAgICAgICBiID0gci5yZWFkKCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgdXRmOCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJyb290IiksCi0gICAgICAgICAgICAgICAgICAgICJzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9leGVjL2V4cGVjdGVkL3V0Zi04IikpOwotICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkT1MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBiID0gdXRmOC5yZWFkKCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZE9TID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSB1dGY4ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShST09ULAorICAgICAgICAgICAgICAgICJzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9leGVjL2V4cGVjdGVkL3V0Zi04IikpKSB7CisgICAgICAgICAgICBpbnQgYiA9IHV0ZjgucmVhZCgpOwogICAgICAgICAgICAgd2hpbGUgKGIgPiAtMSkgewogICAgICAgICAgICAgICAgIGV4cGVjdGVkT1Mud3JpdGUoKGJ5dGUpIGIpOwogICAgICAgICAgICAgICAgIGIgPSB1dGY4LnJlYWQoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBleHBlY3RlZE9TLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBieXRlW10gYWN0dWFsID0gYWN0dWFsT1MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIiwgZXhwZWN0ZWQubGVuZ3RoLCBhY3R1YWwubGVuZ3RoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJieXRlICIgKyBpLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZShmaW4pOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHIpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKHV0ZjgpOworICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBleHBlY3RlZE9TLnRvQnl0ZUFycmF5KCk7CisgICAgICAgIGJ5dGVbXSBhY3R1YWwgPSBhY3R1YWxPUy50b0J5dGVBcnJheSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aCIsIGV4cGVjdGVkLmxlbmd0aCwgYWN0dWFsLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWN0dWFsLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJ5dGUgIiArIGksIGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwcml2YXRlIHZvaWQgY29tcGFyZUJ5dGVzKFN0cmluZyBzLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBieXRlW10gZXhwZWN0ZWQgPSBzLmdldEJ5dGVzKGVuY29kaW5nKTsKLQotICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbSByID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKAotICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihzKSwgZW5jb2RpbmcpOworICAgICAgICBSZWFkZXJJbnB1dFN0cmVhbSByID0gbmV3IFJlYWRlcklucHV0U3RyZWFtKG5ldyBTdHJpbmdSZWFkZXIocyksIGVuY29kaW5nKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgaW50IGV4cGVjdCA9IGV4cGVjdGVkW2ldICYgMHhGRjsKICAgICAgICAgICAgIGludCByZWFkID0gci5yZWFkKCk7Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ICE9IHJlYWQpIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJNaXNtYXRjaCBpbiBSZWFkZXJJbnB1dFN0cmVhbSBhdCBpbmRleCAiICsgaQotICAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGVjdGluZyAiICsgZXhwZWN0ICsgIiBnb3QgIiArIHJlYWQgKyAiIGZvciBzdHJpbmcgIgotICAgICAgICAgICAgICAgICAgICAgKyBzICsgIiB3aXRoIGVuY29kaW5nICIgKyBlbmNvZGluZyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc21hdGNoIGluIFJlYWRlcklucHV0U3RyZWFtIGF0IGluZGV4ICIgKyBpCisgICAgICAgICAgICAgICAgICAgICsgIiBleHBlY3RpbmcgIiArIGV4cGVjdCArICIgZ290ICIgKyByZWFkICsgIiBmb3Igc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgKyBzICsgIiB3aXRoIGVuY29kaW5nICIgKyBlbmNvZGluZywgZXhwZWN0LCByZWFkKTsKICAgICAgICAgfQotICAgICAgICBpZiAoci5yZWFkKCkgIT0gLTEpIHsKLSAgICAgICAgICAgIGZhaWwoIk1pc21hdGNoIGluIFJlYWRlcklucHV0U3RyZWFtIC0gRU9GIG5vdCBzZWVuIGZvciBzdHJpbmcgIgotICAgICAgICAgICAgICAgICArIHMgKyAiIHdpdGggZW5jb2RpbmcgIiArIGVuY29kaW5nKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIk1pc21hdGNoIGluIFJlYWRlcklucHV0U3RyZWFtIC0gRU9GIG5vdCBzZWVuIGZvciBzdHJpbmcgIgorICAgICAgICAgICAgICAgICsgcyArICIgd2l0aCBlbmNvZGluZyAiICsgZW5jb2RpbmcsIC0xLCByLnJlYWQoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVzb3VyY2VVdGlsc1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1Jlc291cmNlVXRpbHNUZXN0LmphdmEKaW5kZXggNTAyNDdiMS4uNjg2ZGE2OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvUmVzb3VyY2VVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9SZXNvdXJjZVV0aWxzVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3RyaW5nVXRpbHNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlsc1Rlc3QuamF2YQppbmRleCA1OWQzZWM2Li42ZDE3ZDQ3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TdHJpbmdVdGlsc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE3LDEyICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW5kc1dpdGg7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKQEAgLTMzLDcgKzM4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTcGxpdCgpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSAiYSxiLCwiOwotICAgICAgICBWZWN0b3IgcmVzID0gU3RyaW5nVXRpbHMuc3BsaXQoZGF0YSwgJywnKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gcmVzID0gU3RyaW5nVXRpbHMuc3BsaXQoZGF0YSwgJywnKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlcy5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZXMuZWxlbWVudEF0KDApKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVzLmVsZW1lbnRBdCgxKSk7CkBAIC00NCw3ICs0OSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRMaW5lcygpIHsKICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSAiYVxyXG5iXG5jXG5kXG5lIjsKLSAgICAgICAgVmVjdG9yIHJlcyA9IFN0cmluZ1V0aWxzLmxpbmVTcGxpdChkYXRhKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gcmVzID0gU3RyaW5nVXRpbHMubGluZVNwbGl0KGRhdGEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcmVzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiYVxyIiwgcmVzLmVsZW1lbnRBdCgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIHJlcy5lbGVtZW50QXQoMSkpOwpAQCAtNTMsNiArNTgsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoImUiLCByZXMuZWxlbWVudEF0KDQpKTsKICAgICB9CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7CiAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhID0gImFiY2FiY2FiY2EiOwpAQCAtOTIsMTQgKzk4LDE0IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRzV2l0aEVtcHR5QnVmZmVyKCkgewotICAgICAgICBhc3NlcnRGYWxzZShTdHJpbmdVdGlscy5lbmRzV2l0aChuZXcgU3RyaW5nQnVmZmVyKCIiKSwgIjEyMzQ1NjY3IikpOworICAgICAgICBhc3NlcnRGYWxzZShTdHJpbmdVdGlscy5lbmRzV2l0aChuZXcgU3RyaW5nQnVmZmVyKCksICIxMjM0NTY2NyIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRzV2l0aEpES1BlcmYoKSB7CiAgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBnZXRGaWxsZWRCdWZmZXIoMTAyNCAqIDMwMCwgJ2EnKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoYnVmLnRvU3RyaW5nKCkuZW5kc1dpdGgoImFhIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChidWYudG9TdHJpbmcoKSwgZW5kc1dpdGgoImFhIikpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDMsMTMgKzE0OSwxMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoCiAgICAgICAgICAgICAiRG9lcyBub3QgcmVtb3ZlIHRoZSBzdWZmaXggcmlnaHQuIiwKICAgICAgICAgICAgIHByZWZpeCArIG5hbWUsCi0gICAgICAgICAgICBTdHJpbmdVdGlscy5yZW1vdmVTdWZmaXgoaW5wdXQsIHN1ZmZpeCkKLSAgICAgICAgKTsKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChpbnB1dCwgc3VmZml4KSk7CiAgICAgICAgIGFzc2VydEVxdWFscygKICAgICAgICAgICAgICJTaG91bGQgbGVhdmUgdGhlIHN0cmluZyB1bmF0dGVuZGVkLiIsCiAgICAgICAgICAgICBwcmVmaXggKyBuYW1lICsgc3VmZml4LAotICAgICAgICAgICAgU3RyaW5nVXRpbHMucmVtb3ZlU3VmZml4KGlucHV0LCAiYmxhIikKLSAgICAgICAgKTsKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVN1ZmZpeChpbnB1dCwgImJsYSIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTU4LDE1ICsxNjIsNTYgQEAKICAgICAgICAgU3RyaW5nIG5hbWUgPSAiTmFtZSI7CiAgICAgICAgIFN0cmluZyBzdWZmaXggPSAiU3VmZml4IjsKICAgICAgICAgU3RyaW5nIGlucHV0ID0gcHJlZml4ICsgbmFtZSArIHN1ZmZpeDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgIkRvZXMgbm90IHJlbW92ZSB0aGUgcHJlZml4IHJpZ2h0LiIsCisgICAgICAgIGFzc2VydEVxdWFscygiRG9lcyBub3QgcmVtb3ZlIHRoZSBwcmVmaXggcmlnaHQuIiwKICAgICAgICAgICAgIG5hbWUgKyBzdWZmaXgsCi0gICAgICAgICAgICBTdHJpbmdVdGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsIHByZWZpeCkKLSAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgIlNob3VsZCBsZWF2ZSB0aGUgc3RyaW5nIHVuYXR0ZW5kZWQuIiwKKyAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgcHJlZml4KSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGxlYXZlIHRoZSBzdHJpbmcgdW5hdHRlbmRlZC4iLAogICAgICAgICAgICAgcHJlZml4ICsgbmFtZSArIHN1ZmZpeCwKLSAgICAgICAgICAgIFN0cmluZ1V0aWxzLnJlbW92ZVByZWZpeChpbnB1dCwgImJsYSIpCi0gICAgICAgICk7CisgICAgICAgICAgICBTdHJpbmdVdGlscy5yZW1vdmVQcmVmaXgoaW5wdXQsICJibGEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9pbigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLCBiLCBjIiwgU3RyaW5nVXRpbHMuam9pbihBcnJheXMuYXNMaXN0KCJhIiwgImIiLCAiYyIpLCAiLCAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9pbkVtcHR5QXJyYXkoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgU3RyaW5nVXRpbHMuam9pbihuZXcgU3RyaW5nW10ge30sICIsICIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKb2luTnVsbENvbGxlY3Rpb24oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgU3RyaW5nVXRpbHMuam9pbigoQ29sbGVjdGlvbjxTdHJpbmc+KSBudWxsLCAiLCAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sm9pbk51bGxBcnJheSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBTdHJpbmdVdGlscy5qb2luKChTdHJpbmdbXSkgbnVsbCwgIiwgIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpvaW5OdWxsU2VwYXJhdG9yKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIFN0cmluZ1V0aWxzLmpvaW4oQXJyYXlzLmFzTGlzdCgiYSIsICJiIiwgImMiKSwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyaW1Ub051bGxXaXRoTnVsbElucHV0KCkgeworICAgICAgICBhc3NlcnROdWxsKFN0cmluZ1V0aWxzLnRyaW1Ub051bGwobnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyaW1Ub051bGxXaXRoRW1wdHlJbnB1dCgpIHsKKyAgICAgICAgYXNzZXJ0TnVsbChTdHJpbmdVdGlscy50cmltVG9OdWxsKCIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJpbVRvTnVsbFdpdGhCbGFua1NwYWNlSW5wdXQoKSB7CisgICAgICAgIGFzc2VydE51bGwoU3RyaW5nVXRpbHMudHJpbVRvTnVsbCgiICAgIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyaW1Ub051bGxXaXRoSW5wdXRQYWRkZWRXaXRoU3BhY2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYWFCY0RlRiIsIFN0cmluZ1V0aWxzLnRyaW1Ub051bGwoIiBhYUJjRGVGICAiKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3ltbGlua1V0aWxzVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvU3ltbGlua1V0aWxzVGVzdC5qYXZhCmluZGV4IGQxZGUxYjEuLjExOWEzMzkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1N5bWxpbmtVdGlsc1Rlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9TeW1saW5rVXRpbHNUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOSwxMSArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbi5PczsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgU3ltbGlua1V0aWxzVGVzdCB7CkBAIC0zMyw3ICszMyw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSb290SXNOb1N5bWxpbmsoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIlN5bWxpbmsgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MiLCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKKyAgICAgICAgYXNzdW1lRmFsc2UoIlN5bWxpbmsgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MiLCBPcy5pc0ZhbWlseSgid2luZG93cyIpKTsKICAgICAgICAgYXNzZXJ0RmFsc2UoU1lNTElOS19VVElMUy5pc1N5bWJvbGljTGluaygiLyIpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9VblBhY2thZ2VOYW1lTWFwcGVyVGVzdC5qYXZhCmluZGV4IGM1OTE1NGQuLjlmMTdmNGUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1VuUGFja2FnZU5hbWVNYXBwZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMwLDEwICszMCw5IEBACiAgICAgICAgIG1hcHBlci5zZXRGcm9tKCJURVNULSoueG1sIik7CiAgICAgICAgIG1hcHBlci5zZXRUbygiKi5qYXZhIik7CiAgICAgICAgIFN0cmluZyBmaWxlID0gIlRFU1Qtb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5VblBhY2thZ2VOYW1lTWFwcGVyVGVzdC54bWwiOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbWFwcGVyLm1hcEZpbGVOYW1lKGZpbGUpWzBdOwogICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBmaXh1cFBhdGgoIm9yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5QYWNrYWdlTmFtZU1hcHBlclRlc3QuamF2YSIpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBtYXBwZXIubWFwRmlsZU5hbWUoZmlsZSlbMF0pOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGZpeHVwUGF0aChTdHJpbmcgZmlsZSkgewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVW5pY29kZVV0aWxUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Vbmljb2RlVXRpbFRlc3QuamF2YQppbmRleCAwOTBkYTU2Li41OWI5MTM2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Vbmljb2RlVXRpbFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9Vbmljb2RlVXRpbFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1ZlY3RvclNldFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL1ZlY3RvclNldFRlc3QuamF2YQppbmRleCAxMTQ5MWUzLi41Yjg2YzIzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9WZWN0b3JTZXRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvVmVjdG9yU2V0VGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjMsMTYgKzIzLDE3IEBACiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIAogcHVibGljIGNsYXNzIFZlY3RvclNldFRlc3QgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IE8gPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBWZWN0b3JTZXQgdiA9IG5ldyBWZWN0b3JTZXQoKTsKKyAgICBwcml2YXRlIFZlY3RvclNldDxPYmplY3Q+IHYgPSBuZXcgVmVjdG9yU2V0PD4oKTsKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKQEAgLTU3LDEzICs1OCwxMyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotICAgICAgICBhc3NlcnRUcnVlKHYuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtPLCBPfSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2LmFkZEFsbChBcnJheXMuYXNMaXN0KE8sIE8pKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB2LnNpemUoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsMigpIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh2LmFkZEFsbCgwLCBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7TywgT30pKSk7CisgICAgICAgIGFzc2VydFRydWUodi5hZGRBbGwoMCwgQXJyYXlzLmFzTGlzdChPLCBPKSkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdi5zaXplKCkpOwogICAgIH0KIApAQCAtNzUsMTEgKzc2LDEyIEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CiAgICAgICAgIHYuYWRkKE8pOwogICAgICAgICBPYmplY3QgbyA9IHYuY2xvbmUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShvIGluc3RhbmNlb2YgVmVjdG9yU2V0KTsKLSAgICAgICAgVmVjdG9yU2V0IHZzID0gKFZlY3RvclNldCkgbzsKKyAgICAgICAgYXNzZXJ0VGhhdChvLCBpbnN0YW5jZU9mKFZlY3RvclNldC5jbGFzcykpOworICAgICAgICBWZWN0b3JTZXQ8T2JqZWN0PiB2cyA9IChWZWN0b3JTZXQ8T2JqZWN0PikgbzsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydFRydWUodnMuY29udGFpbnMoTykpOwogICAgIH0KQEAgLTk0LDEwICs5NiwxMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGwoKSB7Ci0gICAgICAgIGFzc2VydEZhbHNlKHYuY29udGFpbnNBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge08sIE99KSkpOworICAgICAgICBhc3NlcnRGYWxzZSh2LmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoTywgTykpKTsKICAgICAgICAgdi5hZGQoTyk7Ci0gICAgICAgIGFzc2VydFRydWUodi5jb250YWluc0FsbChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7TywgT30pKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHYuY29udGFpbnNBbGwoQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge08sIG51bGx9KSkpOworICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwoQXJyYXlzLmFzTGlzdChPLCBPKSkpOworICAgICAgICBhc3NlcnRGYWxzZSh2LmNvbnRhaW5zQWxsKEFycmF5cy5hc0xpc3QoTywgbnVsbCkpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEyLDEzICsxMTQsMTEgQEAKICAgICAgICAgdi5hZGQoTyk7CiAgICAgICAgIGFzc2VydFNhbWUoTywgdi5yZW1vdmUoMCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdi5yZW1vdmUoMCk7Ci0gICAgICAgICAgICBmYWlsKCJleHBlY3RlZCBhbiBBSU9CRSIpOwotICAgICAgICB9IGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gdmFsdWVzCi0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENhbnRSZW1vdmVCeUluZGV4RnJvbUVtcHR5U2V0KCkgeworICAgICAgICB2LnJlbW92ZSgwKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTMxLDcgKzEzMSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBdEVuZFdoZW5TaXplRXF1YWxzQ2FwYWNpdHkoKSB7Ci0gICAgICAgIHYgPSBuZXcgVmVjdG9yU2V0KDMsIDEpOworICAgICAgICB2ID0gbmV3IFZlY3RvclNldDw+KDMsIDEpOwogICAgICAgICBPYmplY3QgYSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgdi5hZGQoYSk7CiAgICAgICAgIE9iamVjdCBiID0gbmV3IE9iamVjdCgpOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBdEZyb250V2hlblNpemVFcXVhbHNDYXBhY2l0eSgpIHsKLSAgICAgICAgdiA9IG5ldyBWZWN0b3JTZXQoMywgMSk7CisgICAgICAgIHYgPSBuZXcgVmVjdG9yU2V0PD4oMywgMSk7CiAgICAgICAgIHYuYWRkKE8pOwogICAgICAgICBPYmplY3QgYSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgdi5hZGQoYSk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZUluTWlkZGxlV2hlblNpemVFcXVhbHNDYXBhY2l0eSgpIHsKLSAgICAgICAgdiA9IG5ldyBWZWN0b3JTZXQoMywgMSk7CisgICAgICAgIHYgPSBuZXcgVmVjdG9yU2V0PD4oMywgMSk7CiAgICAgICAgIE9iamVjdCBhID0gbmV3IE9iamVjdCgpOwogICAgICAgICB2LmFkZChhKTsKICAgICAgICAgdi5hZGQoTyk7CkBAIC0xODMsOSArMTgzLDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7CiAgICAgICAgIHYuYWRkKE8pOwotICAgICAgICBhc3NlcnRUcnVlKHYucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtPLCBPfSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2LnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KE8sIE8pKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHYucmVtb3ZlQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtPLCBPfSkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uodi5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChPLCBPKSkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDgsMTMgKzIwOCwxMSBAQAogICAgICAgICB2LmFkZChPKTsKICAgICAgICAgdi5yZW1vdmVFbGVtZW50QXQoMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB2LnJlbW92ZUVsZW1lbnRBdCgwKTsKLSAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGFuIEFJT0JFIik7Ci0gICAgICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiB2YWx1ZXMKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FudFJlbW92ZUF0RnJvbUVtcHR5U2V0KCkgeworICAgICAgICB2LnJlbW92ZUVsZW1lbnRBdCgwKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjIyLDcgKzIyMCw3IEBACiAgICAgICAgIE9iamVjdCBhID0gbmV3IE9iamVjdCgpOwogICAgICAgICBPYmplY3QgYiA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgT2JqZWN0IGMgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIHYuYWRkQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtPLCBhLCBiLCBjfSkpOworICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KE8sIGEsIGIsIGMpKTsKICAgICAgICAgdi5yZW1vdmVSYW5nZSgxLCAzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHYuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKE8pKTsKQEAgLTIzNCw5ICsyMzIsOSBAQAogICAgICAgICBPYmplY3QgYSA9IG5ldyBPYmplY3QoKTsKICAgICAgICAgT2JqZWN0IGIgPSBuZXcgT2JqZWN0KCk7CiAgICAgICAgIE9iamVjdCBjID0gbmV3IE9iamVjdCgpOwotICAgICAgICB2LmFkZEFsbChBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXSB7TywgYSwgYiwgY30pKTsKKyAgICAgICAgdi5hZGRBbGwoQXJyYXlzLmFzTGlzdChPLCBhLCBiLCBjKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LmluZGV4T2YoTykpOwotICAgICAgICBhc3NlcnRUcnVlKHYucmV0YWluQWxsKEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdIHtjLCBPfSkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2LnJldGFpbkFsbChBcnJheXMuYXNMaXN0KGMsIE8pKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCB2LnNpemUoKSk7CiAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyhPKSk7CiAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyhjKSk7CkBAIC0yODMsNyArMjgxLDcgQEAKICAgICAgICAgICAgIHYuYWRkKGkpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscyhzaXplLCB2LnNpemUoKSk7Ci0gICAgICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKGludCBpID0gc2l6ZSAtIDQ7IGkgPCAyICogc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBsaXN0LmFkZChpKTsKICAgICAgICAgICAgIHYuYWRkKGkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvWE1MRnJhZ21lbnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudFRlc3QuamF2YQppbmRleCAwYWM5MzhmLi4wNTFjY2QwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9YTUxGcmFnbWVudFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTQyLDEwICs0MywxMCBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVGV4dCgpIHsKLSAgICAgICAgWE1MRnJhZ21lbnQgeCA9IChYTUxGcmFnbWVudCkgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIm5lc3RlZC10ZXh0Iik7CisgICAgICAgIFhNTEZyYWdtZW50IHggPSBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgibmVzdGVkLXRleHQiKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCh4KTsKICAgICAgICAgTm9kZSBuID0geC5nZXRGcmFnbWVudCgpOwotICAgICAgICBhc3NlcnRUcnVlKCJObyBhdHRyaWJ1dGVzIiwgIW4uaGFzQXR0cmlidXRlcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIk5vIGF0dHJpYnV0ZXMiLCBuLmhhc0F0dHJpYnV0ZXMoKSk7CiAgICAgICAgIE5vZGVMaXN0IG5sID0gbi5nZXRDaGlsZE5vZGVzKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBubC5nZXRMZW5ndGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhOb2RlLlRFWFRfTk9ERSwgbmwuaXRlbSgwKS5nZXROb2RlVHlwZSgpKTsKQEAgLTU1LDE3ICs1NiwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZENoaWxkcmVuKCkgewogICAgICAgICBYTUxGcmFnbWVudCB4ID0KLSAgICAgICAgICAgIChYTUxGcmFnbWVudCkgYnVpbGRSdWxlLmdldFByb2plY3QoKS5nZXRSZWZlcmVuY2UoIndpdGgtY2hpbGRyZW4iKTsKKyAgICAgICAgICAgICAgICBidWlsZFJ1bGUuZ2V0UHJvamVjdCgpLmdldFJlZmVyZW5jZSgid2l0aC1jaGlsZHJlbiIpOwogICAgICAgICBhc3NlcnROb3ROdWxsKHgpOwogICAgICAgICBOb2RlIG4gPSB4LmdldEZyYWdtZW50KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIk5vIGF0dHJpYnV0ZXMiLCAhbi5oYXNBdHRyaWJ1dGVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiTm8gYXR0cmlidXRlcyIsIG4uaGFzQXR0cmlidXRlcygpKTsKICAgICAgICAgTm9kZUxpc3QgbmwgPSBuLmdldENoaWxkTm9kZXMoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5sLmdldExlbmd0aCgpKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoTm9kZS5FTEVNRU5UX05PREUsIG5sLml0ZW0oMCkuZ2V0Tm9kZVR5cGUoKSk7CiAgICAgICAgIEVsZW1lbnQgY2hpbGQxID0gKEVsZW1lbnQpIG5sLml0ZW0oMCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQxIiwgY2hpbGQxLmdldFRhZ05hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIWNoaWxkMS5oYXNBdHRyaWJ1dGVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShjaGlsZDEuaGFzQXR0cmlidXRlcygpKTsKICAgICAgICAgTm9kZUxpc3QgbmwyID0gY2hpbGQxLmdldENoaWxkTm9kZXMoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5sMi5nZXRMZW5ndGgoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhOb2RlLlRFWFRfTk9ERSwgbmwyLml0ZW0oMCkuZ2V0Tm9kZVR5cGUoKSk7CkBAIC04Miw3ICs4Myw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhOb2RlLkVMRU1FTlRfTk9ERSwgbmwuaXRlbSgyKS5nZXROb2RlVHlwZSgpKTsKICAgICAgICAgRWxlbWVudCBjaGlsZDMgPSAoRWxlbWVudCkgbmwuaXRlbSgyKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZDMiLCBjaGlsZDMuZ2V0VGFnTmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghY2hpbGQzLmhhc0F0dHJpYnV0ZXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNoaWxkMy5oYXNBdHRyaWJ1dGVzKCkpOwogICAgICAgICBubDIgPSBjaGlsZDMuZ2V0Q2hpbGROb2RlcygpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmwyLmdldExlbmd0aCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKE5vZGUuRUxFTUVOVF9OT0RFLCBubDIuaXRlbSgwKS5nZXROb2RlVHlwZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9GYWNhZGVUYXNrSGVscGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ZhY2FkZVRhc2tIZWxwZXJUZXN0LmphdmEKaW5kZXggZGYyZDQzYi4uMjQ1OTU4ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ZhY2FkZVRhc2tIZWxwZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ZhY2FkZVRhc2tIZWxwZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogLyoqCkBAIC01MSwxMyArNTIsMTMgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNCZWVuU2V0KCkgewogICAgICAgICBGYWNhZGVUYXNrSGVscGVyIGZ0aCA9IG5ldyBGYWNhZGVUYXNrSGVscGVyKCJmb28iKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibm90aGluZyBzZXQiLCAhZnRoLmhhc0JlZW5TZXQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJub3RoaW5nIHNldCIsIGZ0aC5oYXNCZWVuU2V0KCkpOwogICAgICAgICBmdGguc2V0TWFnaWNWYWx1ZShudWxsKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibWFnaWMgaGFzIG5vdCBiZWVuIHNldCIsICFmdGguaGFzQmVlblNldCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIm1hZ2ljIGhhcyBub3QgYmVlbiBzZXQiLCBmdGguaGFzQmVlblNldCgpKTsKICAgICAgICAgZnRoLnNldE1hZ2ljVmFsdWUoImZvbyIpOwogICAgICAgICBhc3NlcnRUcnVlKCJtYWdpYyBoYXMgYmVlbiBzZXQiLCBmdGguaGFzQmVlblNldCgpKTsKICAgICAgICAgZnRoLnNldE1hZ2ljVmFsdWUobnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIWZ0aC5oYXNCZWVuU2V0KCkpOworICAgICAgICBhc3NlcnRGYWxzZShmdGguaGFzQmVlblNldCgpKTsKICAgICAgICAgZnRoLnNldEltcGxlbWVudGF0aW9uKCJiYXoiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgic2V0IGV4cGxpY2l0bHkiLCBmdGguaGFzQmVlblNldCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvZmFjYWRlL0ltcGxlbWVudGF0aW9uU3BlY2lmaWNBcmd1bWVudFRlc3QuamF2YQppbmRleCBhMWI5N2QxLi5mNGE2ZTI5IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9mYWNhZGUvSW1wbGVtZW50YXRpb25TcGVjaWZpY0FyZ3VtZW50VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL2ZhY2FkZS9JbXBsZW1lbnRhdGlvblNwZWNpZmljQXJndW1lbnRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YU9yb01hdGNoZXJUZXN0LmphdmEKaW5kZXggYzA1ZWEyMi4uNmIyMzRhYSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9NYXRjaGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvTWF0Y2hlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhT3JvUmVnZXhwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHBUZXN0LmphdmEKaW5kZXggYWU4MmY3NS4uYTk4Y2NhNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHBUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFPcm9SZWdleHBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cE1hdGNoZXJUZXN0LmphdmEKaW5kZXggY2U0MmM4Yy4uYWRjZGZiMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBNYXRjaGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KYWthcnRhUmVnZXhwTWF0Y2hlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAvKioKICAqIFRlc3RzIGZvciB0aGUgamFrYXJ0YS1yZWdleHAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlZ2V4cE1hdGNoZXIgaW50ZXJmYWNlLgogICoKQEAgLTM0LDI1ICszMCwyMSBAQAogICAgICAgICByZXR1cm4gbmV3IEpha2FydGFSZWdleHBNYXRjaGVyKCk7CiAgICAgfQogCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcjIoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIHdoZW4gdGhpcyBidWcgaXMgZml4ZWQuIHtAc2luY2UgMS4yfSIpOwotICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIDEuMn0KKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IEFzc2VydGlvbkVycm9yLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcjIoKSB7CisgICAgICAgIHN1cGVyLnRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcjIoKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBGYWlscyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzICJkZWZhdWx0IiBtb2RlIGluIGRvRW5kVGVzdDIuCisgICAgICogU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSAxLjJ9CiAgICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIudGVzdFVuaXhMaW5lU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIHRoaXMgYnVnIGlzIGZpeGVkLiB7QHNpbmNlIDEuMn0iKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICB9CisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVTZXBhcmF0b3IoKSB7CisgICAgICAgIHN1cGVyLnRlc3RVbml4TGluZVNlcGFyYXRvcigpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pha2FydGFSZWdleHBSZWdleHBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cFJlZ2V4cFRlc3QuamF2YQppbmRleCA0OTM3ZmY0Li40ZjFkMDc3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cFJlZ2V4cFRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmFrYXJ0YVJlZ2V4cFJlZ2V4cFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAvKioKICAqIFRlc3RzIGZvciB0aGUgamFrYXJ0YS1yZWdleHAgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJlZ2V4cCBpbnRlcmZhY2UuCiAgKgpAQCAtMzQsMjUgKzMwLDIxIEBACiAgICAgICAgIHJldHVybiBuZXcgSmFrYXJ0YVJlZ2V4cFJlZ2V4cCgpOwogICAgIH0KIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci50ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciB3aGVuIHRoaXMgYnVnIGlzIGZpeGVkLiB7QHNpbmNlIDEuMn0iKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICB9CisgICAgLyoqCisgICAgICogU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSAxLjJ9CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCkgeworICAgICAgICBzdXBlci50ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogRmFpbHMgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyAiZGVmYXVsdCIgbW9kZSBpbiBkb0VuZFRlc3QyLgorICAgICAqIFNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgMS4yfQogICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVuaXhMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnRlc3RVbml4TGluZVNlcGFyYXRvcigpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSB0aGlzIGJ1ZyBpcyBmaXhlZC4ge0BzaW5jZSAxLjJ9Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLSAgICAgICAgfQorICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFVuaXhMaW5lU2VwYXJhdG9yKCkgeworICAgICAgICBzdXBlci50ZXN0VW5peExpbmVTZXBhcmF0b3IoKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXJUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBNYXRjaGVyVGVzdC5qYXZhCmluZGV4IDVhNWYxZDIuLmY2YzA1OGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cE1hdGNoZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwTWF0Y2hlclRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAvKioKICAqIFRlc3RzIGZvciB0aGUgSkRLIDEuNCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwTWF0Y2hlciBpbnRlcmZhY2UuCiAgKgpAQCAtMzQsMzkgKzMwLDM1IEBACiAgICAgICAgIHJldHVybiBuZXcgSmRrMTRSZWdleHBNYXRjaGVyKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfQorICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBhcmFncmFwaENoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci50ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhZ3JhcGhDaGFyYWN0ZXIoKSB7CisgICAgICAgIHN1cGVyLnRlc3RQYXJhZ3JhcGhDaGFyYWN0ZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9CisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci50ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOwotICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpIHsKKyAgICAgICAgc3VwZXIudGVzdExpbmVTZXBhcmF0b3JDaGFyYWN0ZXIoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9CisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhbG9uZUNSKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN1cGVyLnRlc3RTdGFuZGFsb25lQ1IoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0iKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVDUigpIHsKKyAgICAgICAgc3VwZXIudGVzdFN0YW5kYWxvbmVDUigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0KKyAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci50ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0iKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCkgeworICAgICAgICBzdXBlci50ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHBUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvSmRrMTRSZWdleHBSZWdleHBUZXN0LmphdmEKaW5kZXggNjdiNjlhYS4uOGZhOTg5MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL0pkazE0UmVnZXhwUmVnZXhwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9KZGsxNFJlZ2V4cFJlZ2V4cFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCw4IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5yZWdleHA7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiAvKioKICAqIFRlc3RzIGZvciB0aGUgSkRLIDEuNCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVnZXhwIGludGVyZmFjZS4KICAqCkBAIC0zNCw0MCArMzAsMzYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBKZGsxNFJlZ2V4cFJlZ2V4cCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0KKyAgICAgKi8KICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhZ3JhcGhDaGFyYWN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIudGVzdFBhcmFncmFwaENoYXJhY3RlcigpOwotICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfSIpOwotICAgICAgICB9IGNhdGNoIChBc3NlcnRpb25FcnJvciBlKSB7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCkgeworICAgICAgICBzdXBlci50ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfQorICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExpbmVTZXBhcmF0b3JDaGFyYWN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIudGVzdExpbmVTZXBhcmF0b3JDaGFyYWN0ZXIoKTsKLSAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0cmlnZ2VyIG9uY2UgZml4ZWQuIHtAc2luY2UgSkRLIDEuNFJDMX0iKTsKLSAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgewotICAgICAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdExpbmVTZXBhcmF0b3JDaGFyYWN0ZXIoKSB7CisgICAgICAgIHN1cGVyLnRlc3RMaW5lU2VwYXJhdG9yQ2hhcmFjdGVyKCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2hvdWxkIHRyaWdnZXIgb25jZSBmaXhlZC4ge0BzaW5jZSBKREsgMS40UkMxfQorICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVDUigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzdXBlci50ZXN0U3RhbmRhbG9uZUNSKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFsb25lQ1IoKSB7CisgICAgICAgIHN1cGVyLnRlc3RTdGFuZGFsb25lQ1IoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9CisgICAgICovCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc3VwZXIudGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgdHJpZ2dlciBvbmNlIGZpeGVkLiB7QHNpbmNlIEpESyAxLjRSQzF9Iik7Ci0gICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKLSAgICAgICAgfQorICAgIHB1YmxpYyB2b2lkIHRlc3RXaW5kb3dzTGluZVNlcGFyYXRvcigpIHsKKyAgICAgICAgc3VwZXIudGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwTWF0Y2hlclRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhCmluZGV4IDVlZGFmNTcuLjI1YmU1OTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBNYXRjaGVyVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjEsMTAgKzIxLDEwIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKQEAgLTUzLDE4ICs1MywxOCBAQAogICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSIpOwogICAgICAgICBhc3NlcnRUcnVlKCJhYWFhIHNob3VsZCBtYXRjaCBpdHNlbGYiLCByZWcubWF0Y2hlcygiYWFhYSIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSBzaG91bGQgbWF0Y2ggeGFhYWEiLCByZWcubWF0Y2hlcygieGFhYWEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImFhYWEgc2hvdWxkblwndCBtYXRjaCB4YWFhIiwgIXJlZy5tYXRjaGVzKCJ4YWFhIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiYWFhYSBzaG91bGRuXCd0IG1hdGNoIHhhYWEiLCByZWcubWF0Y2hlcygieGFhYSIpKTsKICAgICAgICAgcmVnLnNldFBhdHRlcm4oIl5hYWFhIik7Ci0gICAgICAgIGFzc2VydFRydWUoIl5hYWFhIHNob3VsZG5cJ3QgbWF0Y2ggeGFhYWEiLCAhcmVnLm1hdGNoZXMoInhhYWFhIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiXmFhYWEgc2hvdWxkblwndCBtYXRjaCB4YWFhYSIsIHJlZy5tYXRjaGVzKCJ4YWFhYSIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiXmFhYWEgc2hvdWxkIG1hdGNoIGFhYWF4IiwgcmVnLm1hdGNoZXMoImFhYWF4IikpOwogICAgICAgICByZWcuc2V0UGF0dGVybigiYWFhYSQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSQgc2hvdWxkblwndCBtYXRjaCBhYWFheCIsICFyZWcubWF0Y2hlcygiYWFhYXgiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJhYWFhJCBzaG91bGRuXCd0IG1hdGNoIGFhYWF4IiwgcmVnLm1hdGNoZXMoImFhYWF4IikpOwogICAgICAgICBhc3NlcnRUcnVlKCJhYWFhJCBzaG91bGQgbWF0Y2ggeGFhYWEiLCByZWcubWF0Y2hlcygieGFhYWEiKSk7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJbMC05XSsiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0rIHNob3VsZCBtYXRjaCAxMjMiLCByZWcubWF0Y2hlcygiMTIzIikpOwogICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSsgc2hvdWxkIG1hdGNoIDEiLCByZWcubWF0Y2hlcygiMSIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0rIHNob3VsZG5cJ3QgbWF0Y2ggXCdcJyIsICFyZWcubWF0Y2hlcygiIikpOwotICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSsgc2hvdWxkblwndCBtYXRjaCBhIiwgIXJlZy5tYXRjaGVzKCJhIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiWzAtOV0rIHNob3VsZG5cJ3QgbWF0Y2ggXCdcJyIsIHJlZy5tYXRjaGVzKCIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJbMC05XSsgc2hvdWxkblwndCBtYXRjaCBhIiwgcmVnLm1hdGNoZXMoImEiKSk7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJbMC05XSoiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiWzAtOV0qIHNob3VsZCBtYXRjaCAxMjMiLCByZWcubWF0Y2hlcygiMTIzIikpOwogICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSogc2hvdWxkIG1hdGNoIDEiLCByZWcubWF0Y2hlcygiMSIpKTsKQEAgLTcyLDM3ICs3MiwzNyBAQAogICAgICAgICBhc3NlcnRUcnVlKCJbMC05XSogc2hvdWxkIG1hdGNoIGEiLCByZWcubWF0Y2hlcygiYSIpKTsKICAgICAgICAgcmVnLnNldFBhdHRlcm4oIihbMC05XSspPVxcMSIpOwogICAgICAgICBhc3NlcnRUcnVlKCIoWzAtOV0rKT1cXDEgc2hvdWxkIG1hdGNoIDE9MSIsIHJlZy5tYXRjaGVzKCIxPTEiKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIihbMC05XSspPVxcMSBzaG91bGRuXCd0IG1hdGNoIDE9MiIsICFyZWcubWF0Y2hlcygiMT0yIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiKFswLTldKyk9XFwxIHNob3VsZG5cJ3QgbWF0Y2ggMT0yIiwgcmVnLm1hdGNoZXMoIjE9MiIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHcm91cHMoKSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJhYWFhIik7Ci0gICAgICAgIFZlY3RvciB2ID0gcmVnLmdldEdyb3VwcygieGFhYWEiKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdiA9IHJlZy5nZXRHcm91cHMoInhhYWFhIik7CiAgICAgICAgIGFzc2VydEVxdWFscygiTm8gcGFyZW5zIC0+IG5vIGV4dHJhIGdyb3VwcyIsIDEsIHYuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJUcml2aWFsIG1hdGNoIHdpdGggbm8gcGFyZW5zIiwgImFhYWEiLAotICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOworICAgICAgICAgICAgICAgIHYuZWxlbWVudEF0KDApKTsKIAogICAgICAgICByZWcuc2V0UGF0dGVybigiKGFhYWEpIik7CiAgICAgICAgIHYgPSByZWcuZ2V0R3JvdXBzKCJ4YWFhYSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIlRyaXZpYWwgbWF0Y2ggd2l0aCBzaW5nbGUgcGFyZW4iLCAyLCB2LnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVHJpdmlhbCBtYXRjaCB3aXRoIHNpbmdsZSBwYXJlbiwgZnVsbCBtYXRjaCIsICJhYWFhIiwKLSAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHYuZWxlbWVudEF0KDApKTsKKyAgICAgICAgICAgICAgICB2LmVsZW1lbnRBdCgwKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiVHJpdmlhbCBtYXRjaCB3aXRoIHNpbmdsZSBwYXJlbiwgbWF0Y2hlZCBwYXJlbiIsICJhYWFhIiwKLSAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHYuZWxlbWVudEF0KDApKTsKKyAgICAgICAgICAgICAgICB2LmVsZW1lbnRBdCgwKSk7CiAKICAgICAgICAgcmVnLnNldFBhdHRlcm4oIihhKyliKGIrKSIpOwogICAgICAgICB2ID0gcmVnLmdldEdyb3VwcygieGFhYmIiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHYuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWJiIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFhIiwgKFN0cmluZykgdi5lbGVtZW50QXQoMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCAoU3RyaW5nKSB2LmVsZW1lbnRBdCgyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWFiYiIsIHYuZWxlbWVudEF0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYSIsIHYuZWxlbWVudEF0KDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgdi5lbGVtZW50QXQoMikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEJ1Z3ppbGxhUmVwb3J0MTQ2MTkoKSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJeKC4qKS9zcmMvKCguKi8pKikoW2EtekEtWjAtOV9cXC5dKylcXC5qYXZhJCIpOwotICAgICAgICBWZWN0b3IgdiA9IHJlZy5nZXRHcm91cHMoImRlL3RvbS9zcmMvR29vZ2xlLmphdmEiKTsKKyAgICAgICAgVmVjdG9yPFN0cmluZz4gdiA9IHJlZy5nZXRHcm91cHMoImRlL3RvbS9zcmMvR29vZ2xlLmphdmEiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHYuc2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZS90b20iLCB2LmVsZW1lbnRBdCgxKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiIiwgdi5lbGVtZW50QXQoMikpOwpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUluc2Vuc2l0aXZlTWF0Y2goKSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJhYWFhIik7Ci0gICAgICAgIGFzc2VydFRydWUoImFhYWEgZG9lc24ndCBtYXRjaCBBQWFhIiwgIXJlZy5tYXRjaGVzKCJBQWFhIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiYWFhYSBkb2Vzbid0IG1hdGNoIEFBYWEiLCByZWcubWF0Y2hlcygiQUFhYSIpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiYWFhYSBtYXRjaGVzIEFBYWEgaWdub3JpbmcgY2FzZSIsCiAgICAgICAgICAgICAgICAgICAgcmVnLm1hdGNoZXMoIkFBYWEiLCBSZWdleHBNYXRjaGVyLk1BVENIX0NBU0VfSU5TRU5TSVRJVkUpKTsKICAgICB9CkBAIC0xMjIsNTUgKzEyMiw1MyBAQAogICAgIC8vIGEgbGluZSBzZXBhcmF0b3IgZm9yIHJlZ2V4IChwZXJsKSBpcyBhbHdheXMgYSB1bml4IGxpbmUgKGllIFxuKQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWdyYXBoQ2hhcmFjdGVyKCkgewogICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kIG9mIHRleHQkIik7Ci0gICAgICAgIGFzc2VydFRydWUoInBhcmFncmFwaCBjaGFyYWN0ZXIiLCAhcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHUyMDI5IikpOworICAgICAgICBhc3NlcnRGYWxzZSgicGFyYWdyYXBoIGNoYXJhY3RlciIsIHJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFx1MjAyOSIpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lU2VwYXJhdG9yQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGluZVNlcGFyYXRvckNoYXJhY3RlcigpIHsKICAgICAgICAgcmVnLnNldFBhdHRlcm4oImVuZCBvZiB0ZXh0JCIpOwotICAgICAgICBhc3NlcnRUcnVlKCJsaW5lLXNlcGFyYXRvciBjaGFyYWN0ZXIiLCAhcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHUyMDI4IikpOworICAgICAgICBhc3NlcnRGYWxzZSgibGluZS1zZXBhcmF0b3IgY2hhcmFjdGVyIiwgcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHUyMDI4IikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5leHRMaW5lQ2hhcmFjdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dExpbmVDaGFyYWN0ZXIoKSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJlbmQgb2YgdGV4dCQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgibmV4dC1saW5lIGNoYXJhY3RlciIsICFyZWcubWF0Y2hlcygiZW5kIG9mIHRleHRcdTAwODUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJuZXh0LWxpbmUgY2hhcmFjdGVyIiwgcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XHUwMDg1IikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVDUigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYWxvbmVDUigpIHsKICAgICAgICAgcmVnLnNldFBhdHRlcm4oImVuZCBvZiB0ZXh0JCIpOwotICAgICAgICBhc3NlcnRUcnVlKCJzdGFuZGFsb25lIENSIiwgIXJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFxyIikpOworICAgICAgICBhc3NlcnRGYWxzZSgic3RhbmRhbG9uZSBDUiIsIHJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFxyIikpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NMaW5lU2VwYXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IoKSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJlbmQgb2YgdGV4dCQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiV2luZG93cyBsaW5lIHNlcGFyYXRvciIsICFyZWcubWF0Y2hlcygiZW5kIG9mIHRleHRcclxuIikpOworICAgICAgICBhc3NlcnRGYWxzZSgiV2luZG93cyBsaW5lIHNlcGFyYXRvciIsIHJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFxyXG4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2luZG93c0xpbmVTZXBhcmF0b3IyKCkgewogICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kIG9mIHRleHRcciQiKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2luZG93cyBsaW5lIHNlcGFyYXRvciIsIHJlZy5tYXRjaGVzKCJlbmQgb2YgdGV4dFxyXG4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5peExpbmVTZXBhcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyB2b2lkIHRlc3RVbml4TGluZVNlcGFyYXRvcigpIHsKICAgICAgICAgcmVnLnNldFBhdHRlcm4oImVuZCBvZiB0ZXh0JCIpOwogICAgICAgICBhc3NlcnRUcnVlKCJVbml4IGxpbmUgc2VwYXJhdG9yIiwgcmVnLm1hdGNoZXMoImVuZCBvZiB0ZXh0XG4iKSk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlWZXJzdXNTaW5nbGVMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBidWYuYXBwZW5kKCJMaW5lMSIpLmFwcGVuZChVTklYX0xJTkUpOwotICAgICAgICBidWYuYXBwZW5kKCJzdGFydHRlc3QgTGluZTIiKS5hcHBlbmQoVU5JWF9MSU5FKTsKLSAgICAgICAgYnVmLmFwcGVuZCgiTGluZTMgZW5kdGVzdCIpLmFwcGVuZChVTklYX0xJTkUpOwotICAgICAgICBidWYuYXBwZW5kKCJMaW5lNCIpLmFwcGVuZChVTklYX0xJTkUpOwotICAgICAgICBTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOworICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aVZlcnN1c1NpbmdsZUxpbmUoKSB7CisgICAgICAgIFN0cmluZyB0ZXh0ID0gIkxpbmUxIiArIFVOSVhfTElORSArCisgICAgICAgICAgICAgICAgInN0YXJ0dGVzdCBMaW5lMiIgKyBVTklYX0xJTkUgKworICAgICAgICAgICAgICAgICJMaW5lMyBlbmR0ZXN0IiArIFVOSVhfTElORSArCisgICAgICAgICAgICAgICAgIkxpbmU0IiArIFVOSVhfTElORTsKIAogICAgICAgICBkb1N0YXJ0VGVzdDEodGV4dCk7CiAgICAgICAgIGRvU3RhcnRUZXN0Mih0ZXh0KTsKQEAgLTE4MCw5ICsxNzgsOSBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9TdGFydFRlc3QxKFN0cmluZyB0ZXh0KSB7CiAgICAgICAgIHJlZy5zZXRQYXR0ZXJuKCJec3RhcnR0ZXN0Iik7Ci0gICAgICAgIGFzc2VydFRydWUoIl5zdGFydHRlc3QgaW4gZGVmYXVsdCBtb2RlIiwgIXJlZy5tYXRjaGVzKHRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiXnN0YXJ0dGVzdCBpbiBzaW5nbGUgbGluZSBtb2RlIiwKLSAgICAgICAgICAgICAgICFyZWcubWF0Y2hlcyh0ZXh0LCBSZWdleHBNYXRjaGVyLk1BVENIX1NJTkdMRUxJTkUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIl5zdGFydHRlc3QgaW4gZGVmYXVsdCBtb2RlIiwgcmVnLm1hdGNoZXModGV4dCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiXnN0YXJ0dGVzdCBpbiBzaW5nbGUgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgICByZWcubWF0Y2hlcyh0ZXh0LCBSZWdleHBNYXRjaGVyLk1BVENIX1NJTkdMRUxJTkUpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiXnN0YXJ0dGVzdCBpbiBtdWx0aSBsaW5lIG1vZGUiLAogICAgICAgICAgICAgICAgcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9NVUxUSUxJTkUpKTsKICAgICB9CkBAIC0xOTgsMTEgKzE5NiwxMSBAQAogCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9FbmRUZXN0MShTdHJpbmcgdGV4dCkgewogICAgICAgICByZWcuc2V0UGF0dGVybigiZW5kdGVzdCQiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kdGVzdCQgaW4gZGVmYXVsdCBtb2RlIiwgIXJlZy5tYXRjaGVzKHRleHQpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kdGVzdCQgaW4gc2luZ2xlIGxpbmUgbW9kZSIsCi0gICAgICAgICAgICAgICAhcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9TSU5HTEVMSU5FKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJlbmR0ZXN0JCBpbiBkZWZhdWx0IG1vZGUiLCByZWcubWF0Y2hlcyh0ZXh0KSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJlbmR0ZXN0JCBpbiBzaW5nbGUgbGluZSBtb2RlIiwKKyAgICAgICAgICAgICAgICByZWcubWF0Y2hlcyh0ZXh0LCBSZWdleHBNYXRjaGVyLk1BVENIX1NJTkdMRUxJTkUpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZW5kdGVzdCQgaW4gbXVsdGkgbGluZSBtb2RlIiwKLSAgICAgICAgICAgICAgIHJlZy5tYXRjaGVzKHRleHQsIFJlZ2V4cE1hdGNoZXIuTUFUQ0hfTVVMVElMSU5FKSk7CisgICAgICAgICAgICAgICAgcmVnLm1hdGNoZXModGV4dCwgUmVnZXhwTWF0Y2hlci5NQVRDSF9NVUxUSUxJTkUpKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgdm9pZCBkb0VuZFRlc3QyKFN0cmluZyB0ZXh0KSB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYW50L3V0aWwvcmVnZXhwL1JlZ2V4cFRlc3QuamF2YQppbmRleCAwOGE4NDE2Li4xZjdhNzc3IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9hbnQvdXRpbC9yZWdleHAvUmVnZXhwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2FudC91dGlsL3JlZ2V4cC9SZWdleHBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9iemlwMi9CbG9ja1NvcnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9iemlwMi9CbG9ja1NvcnRUZXN0LmphdmEKaW5kZXggZWQwMjY5ZS4uNTZjMzZjMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQmxvY2tTb3J0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0Jsb2NrU29ydFRlc3QuamF2YQpAQCAtNyw3ICs3LDcgQEAKICAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKICAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCiAgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAyU3RyZWFtVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvYnppcDIvQ0JaaXAyU3RyZWFtVGVzdC5qYXZhCmluZGV4IDg4YjUwMGEuLjViOGVhOTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL2J6aXAyL0NCWmlwMlN0cmVhbVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9iemlwMi9DQlppcDJTdHJlYW1UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0yMywyMCArMjMsMTIgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQogcHVibGljIGNsYXNzIENCWmlwMlN0cmVhbVRlc3QgewogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBAVGVzdAorICAgIEBUZXN0KGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxQb2ludGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG5ldyBDQlppcDJJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLSAgICAgICAgICAgIGZhaWwoImV4cGVjdGVkIGFuIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICAgICAgLy9UT0RPIGFzc2VydCBleGNlcHRpb24gdmFsdWVzCi0gICAgICAgIH0KKyAgICAgICAgbmV3IENCWmlwMklucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvbWFpbC9NYWlsTWVzc2FnZVRlc3QuamF2YQppbmRleCBlZTdhMDVjLi43MmVlMWZhIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy9tYWlsL01haWxNZXNzYWdlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL21haWwvTWFpbE1lc3NhZ2VUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xOCw2ICsxOCw5IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5tYWlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCiBpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRHVtbXlNYWlsU2VydmVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKQEAgLTI3LDEyICszMCw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotCiAvKioKICAqIEpVbml0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy5tYWlsLk1haWxNZXNzYWdlLgogICoKQEAgLTQ1LDcgKzQ0LDcgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb2NhbCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICBsb2NhbCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7CiAgICAgICAgIH0gY2F0Y2ggKGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uIHVoZSkgewogICAgICAgICAgICAgLy8gaWdub3JlCiAgICAgICAgIH0KQEAgLTQzMCwxMCArNDI5LDEwIEBACiAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgc3ViamVjdCA9IG51bGw7CiAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZSA9IG51bGw7CiAKLSAgICAgICAgcHJvdGVjdGVkIFZlY3RvciByZXBseVRvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgcHJvdGVjdGVkIFZlY3RvciB0b0xpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIHByb3RlY3RlZCBWZWN0b3IgY2NMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBwcm90ZWN0ZWQgVmVjdG9yIGJjY0xpc3QgPSBuZXcgVmVjdG9yKCk7CisgICAgICAgIHByb3RlY3RlZCBWZWN0b3I8U3RyaW5nPiByZXBseVRvTGlzdCA9IG5ldyBWZWN0b3I8PigpOworICAgICAgICBwcm90ZWN0ZWQgVmVjdG9yPFN0cmluZz4gdG9MaXN0ID0gbmV3IFZlY3Rvcjw+KCk7CisgICAgICAgIHByb3RlY3RlZCBWZWN0b3I8U3RyaW5nPiBjY0xpc3QgPSBuZXcgVmVjdG9yPD4oKTsKKyAgICAgICAgcHJvdGVjdGVkIFZlY3RvcjxTdHJpbmc+IGJjY0xpc3QgPSBuZXcgVmVjdG9yPD4oKTsKIAogICAgICAgICBDbGllbnRUaHJlYWQoaW50IHBvcnQpIHsKICAgICAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CkBAIC00NjgsMjYgKzQ2NywxOCBAQAogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICBtc2cuZnJvbShmcm9tKTsKIAotICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uIGU7CisgICAgICAgICAgICAgICAgcmVwbHlUb0xpc3QuZm9yRWFjaChlIC0+IG1zZy5yZXBseXRvKGUpKTsKIAotICAgICAgICAgICAgICAgIGUgPSByZXBseVRvTGlzdC5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5yZXBseXRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBlIDogdG9MaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy50byhlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlID0gdG9MaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLnRvKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBlIDogY2NMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5jYyhlKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBlID0gY2NMaXN0LmVsZW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbXNnLmNjKGUubmV4dEVsZW1lbnQoKS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlID0gYmNjTGlzdC5lbGVtZW50cygpOwotICAgICAgICAgICAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy5iY2MoZS5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGUgOiBiY2NMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG1zZy5iY2MoZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN1YmplY3QgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5VGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhckVudHJ5VGVzdC5qYXZhCmluZGV4IGY1YzIwMjAuLjEzZDlmOTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJFbnRyeVRlc3QuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyRW50cnlUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1Rhck91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBjYjY1ZTJkLi40NmIxMGRlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyUm91bmRUcmlwVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvdGFyL1RhclJvdW5kVHJpcFRlc3QuamF2YQppbmRleCAzY2FiYTM0Li44ODRhZDc2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy90YXIvVGFyUm91bmRUcmlwVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3Rhci9UYXJSb3VuZFRyaXBUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvQXNpRXh0cmFGaWVsZFRlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhCmluZGV4IGFmNDRlN2QuLjg0NjlmNDUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9Bc2lFeHRyYUZpZWxkVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTgsMTIgKzE4LDE3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS50b29scy56aXA7CiAKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247CiAKIC8qKgogICogSlVuaXQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5Bc2lFeHRyYUZpZWxkLgpAQCAtMzEsMTIgKzM2LDIxIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBBc2lFeHRyYUZpZWxkVGVzdCBpbXBsZW1lbnRzIFVuaXhTdGF0IHsKIAorICAgIHByaXZhdGUgIEFzaUV4dHJhRmllbGQgYTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGVzdCBmaWxlIG1vZGUgbWFnaWMuCiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZXMoKSB7Ci0gICAgICAgIEFzaUV4dHJhRmllbGQgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7CiAgICAgICAgIGEuc2V0TW9kZSgwMTIzKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiBmaWxlIiwgMDEwMDEyMywgYS5nZXRNb2RlKCkpOwogICAgICAgICBhLnNldERpcmVjdG9yeSh0cnVlKTsKQEAgLTUwLDcgKzY0LDYgQEAKICAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50KCkgewotICAgICAgICBBc2lFeHRyYUZpZWxkIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOwogICAgICAgICBhLnNldE1vZGUoMDEyMyk7CiAgICAgICAgIGEuc2V0VXNlcklkKDUpOwogICAgICAgICBhLnNldEdyb3VwSWQoNik7CkBAIC04MSw4MyArOTQsOTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZXN0IHJlcGFyc2UKKyAgICAgKiBUZXN0IHJlcGFyc2UgZmlsZQogICAgICAqLwogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFJlcGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgQXNpRXh0cmFGaWVsZCBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwYXJzZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgLy8gQ1JDIG1hbnVhbGx5IGNhbGN1bGF0ZWQsIHNvcnJ5CiAgICAgICAgIGJ5dGVbXSBkYXRhID0geyhieXRlKSAweEM2LCAweDAyLCAweDc4LCAoYnl0ZSkgMHhCNiwgLy8gQ1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkgMHg4MCwgICAgICAgICAgICAgICAgICAgLy8gbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlkLCBnaWQKKyAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpIDB4ODAsICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluayBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNiwgMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAorCiAgICAgICAgIGEucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIHBsYWluIGZpbGUiLCBkYXRhLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJwbGFpbiBmaWxlLCBubyBsaW5rIiwgIWEuaXNMaW5rKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJwbGFpbiBmaWxlLCBubyBkaXIiLCAhYS5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICBhLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInBsYWluIGZpbGUsIG5vIGxpbmsiLCBhLmlzTGluaygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoInBsYWluIGZpbGUsIG5vIGRpciIsIGEuaXNEaXJlY3RvcnkoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBwbGFpbiBmaWxlIiwgRklMRV9GTEFHIHwgMDEyMywgYS5nZXRNb2RlKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoInVpZCBwbGFpbiBmaWxlIiwgNSwgYS5nZXRVc2VySWQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygiZ2lkIHBsYWluIGZpbGUiLCA2LCBhLmdldEdyb3VwSWQoKSk7CisgICAgfQogCi0gICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtdIHsweDc1LCAoYnl0ZSkgMHg4RSwgMHg0MSwgKGJ5dGUpIDB4RkQsIC8vIENSQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpIDB4QTAsICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpbmsgbGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgJ3QnLCAoYnl0ZSkgJ2UnLCAoYnl0ZSkgJ3MnLCAoYnl0ZSkgJ3QnfTsKLSAgICAgICAgYSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7CisgICAgLyoqCisgICAgICogVGVzdCByZXBhcnNlIGxpbmsKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhcnNlTGluaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9IHsweDc1LCAoYnl0ZSkgMHg4RSwgMHg0MSwgKGJ5dGUpIDB4RkQsIC8vIENSQworICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkgMHhBMCwgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgNCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAndCcsIChieXRlKSAnZScsIChieXRlKSAncycsIChieXRlKSAndCd9OworCiAgICAgICAgIGEucGFyc2VGcm9tTG9jYWxGaWxlRGF0YShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGxpbmsiLCBkYXRhLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCJsaW5rLCBpcyBsaW5rIiwgYS5pc0xpbmsoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImxpbmssIG5vIGRpciIsICFhLmlzRGlyZWN0b3J5KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgibGluaywgbm8gZGlyIiwgYS5pc0RpcmVjdG9yeSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIGxpbmsiLCBMSU5LX0ZMQUcgfCAwMTIzLCBhLmdldE1vZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidWlkIGxpbmsiLCA1LCBhLmdldFVzZXJJZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWQgbGluayIsIDYsIGEuZ2V0R3JvdXBJZCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgYS5nZXRMaW5rZWRGaWxlKCkpOworICAgIH0KIAotICAgICAgICBkYXRhID0gbmV3IGJ5dGVbXSB7KGJ5dGUpIDB4OEUsIDB4MDEsIChieXRlKSAweEJGLCAoYnl0ZSkgMHgwRSwgLy8gQ1JDCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwMTIzLCAoYnl0ZSkgMHg0MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1aWQsIGdpZAotICAgICAgICBhID0gbmV3IEFzaUV4dHJhRmllbGQoKTsKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlcGFyc2UgZGlyZWN0b3J5CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwYXJzZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBieXRlW10gZGF0YSA9eyhieXRlKTB4OEUsIDB4MDEsIChieXRlKTB4QkYsIChieXRlKTB4MEUsIC8vIENSQworICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKTB4NDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rCisgICAgICAgICAgICAgICAgICAgICAgNSwgMCwgNiwgMH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdWlkLCBnaWQKKwogICAgICAgICBhLnBhcnNlRnJvbUxvY2FsRmlsZURhdGEoZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImxlbmd0aCBkaXIiLCBkYXRhLmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIGEuZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJkaXIsIG5vIGxpbmsiLCAhYS5pc0xpbmsoKSk7CisgICAgICAgICAgICAgICAgYS5nZXRMb2NhbEZpbGVEYXRhTGVuZ3RoKCkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJkaXIsIG5vIGxpbmsiLCBhLmlzTGluaygpKTsKICAgICAgICAgYXNzZXJ0VHJ1ZSgiZGlyLCBpcyBkaXIiLCBhLmlzRGlyZWN0b3J5KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGUgZGlyIiwgRElSX0ZMQUcgfCAwMTIzLCBhLmdldE1vZGUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygidWlkIGRpciIsIDUsIGEuZ2V0VXNlcklkKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImdpZCBkaXIiLCA2LCBhLmdldEdyb3VwSWQoKSk7CisgICAgfQogCi0gICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtdIHswLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBDUkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDAxMjMsIChieXRlKSAweDQwLCAgICAgICAgICAgICAgICAgICAgLy8gbW9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5rCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCi0gICAgICAgIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCByYWlzZSBiYWQgQ1JDIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYWQgQ1JDIGNoZWNrc3VtIDAgaW5zdGVhZCBvZiBlYmYwMThlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBUZXN0IHJlcGFyc2UgYmFkIENSQworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGFyc2VCYWRDUkMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChaaXBFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiYmFkIENSQyBjaGVja3N1bSAwIGluc3RlYWQgb2YgZWJmMDE4ZSIpOworICAgICAgICBieXRlW10gZGF0YSA9IHswLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhZCBDUkMKKyAgICAgICAgICAgICAgICAgICAgICAgMDEyMywgKGJ5dGUpMHg0MCwgICAgICAgICAgICAgICAgICAgICAvLyBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluaworICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCA2LCAwfTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVpZCwgZ2lkCisKKyAgICAgICAgYS5wYXJzZUZyb21Mb2NhbEZpbGVEYXRhKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLSAgICAgICAgQXNpRXh0cmFGaWVsZCBzMSA9IG5ldyBBc2lFeHRyYUZpZWxkKCk7Ci0gICAgICAgIHMxLnNldFVzZXJJZCg0Mik7Ci0gICAgICAgIHMxLnNldEdyb3VwSWQoMTIpOwotICAgICAgICBzMS5zZXRMaW5rZWRGaWxlKCJmb28iKTsKLSAgICAgICAgczEuc2V0TW9kZSgwNjQ0KTsKLSAgICAgICAgczEuc2V0RGlyZWN0b3J5KHRydWUpOwotICAgICAgICBBc2lFeHRyYUZpZWxkIHMyID0gKEFzaUV4dHJhRmllbGQpIHMxLmNsb25lKCk7Ci0gICAgICAgIGFzc2VydE5vdFNhbWUoczEsIHMyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHMxLmdldFVzZXJJZCgpLCBzMi5nZXRVc2VySWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzMS5nZXRHcm91cElkKCksIHMyLmdldEdyb3VwSWQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzMS5nZXRMaW5rZWRGaWxlKCksIHMyLmdldExpbmtlZEZpbGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzMS5nZXRNb2RlKCksIHMyLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzMS5pc0RpcmVjdG9yeSgpLCBzMi5pc0RpcmVjdG9yeSgpKTsKKyAgICAgICAgYS5zZXRVc2VySWQoNDIpOworICAgICAgICBhLnNldEdyb3VwSWQoMTIpOworICAgICAgICBhLnNldExpbmtlZEZpbGUoImZvbyIpOworICAgICAgICBhLnNldE1vZGUoMDY0NCk7CisgICAgICAgIGEuc2V0RGlyZWN0b3J5KHRydWUpOworICAgICAgICBBc2lFeHRyYUZpZWxkIHMyID0gKEFzaUV4dHJhRmllbGQpIGEuY2xvbmUoKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShhLCBzMik7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmdldFVzZXJJZCgpLCBzMi5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmdldEdyb3VwSWQoKSwgczIuZ2V0R3JvdXBJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEuZ2V0TGlua2VkRmlsZSgpLCBzMi5nZXRMaW5rZWRGaWxlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYS5nZXRNb2RlKCksIHMyLmdldE1vZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmlzRGlyZWN0b3J5KCksIHMyLmlzRGlyZWN0b3J5KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvRXh0cmFGaWVsZFV0aWxzVGVzdC5qYXZhCmluZGV4IDg0MWEyZmMuLmJhZjNlMmIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9FeHRyYUZpZWxkVXRpbHNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL0V4dHJhRmllbGRVdGlsc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCwxNiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwogCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaW5zdGFuY2VPZjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRXhjZXB0aW9uOwogCiAvKioKICAqIEpVbml0IDQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5FeHRyYUZpZWxkVXRpbHMuCkBAIC00Myw2ICs0Nyw5IEBACiAgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKICAgICBwcml2YXRlIGJ5dGVbXSBhTG9jYWw7CiAKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CiAgICAgICAgIGEgPSBuZXcgQXNpRXh0cmFGaWVsZCgpOwpAQCAtNzMsMjYgKzgwLDIyIEBACiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3duLmV4cGVjdChaaXBFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZSgiYmFkIGV4dHJhIGZpZWxkIHN0YXJ0aW5nIGF0ICIgKyAoNCArIGFMb2NhbC5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICArICIuICBCbG9jayBsZW5ndGggb2YgMSBieXRlcyBleGNlZWRzIHJlbWFpbmluZyBkYXRhIG9mIDAgYnl0ZXMuIik7CisKICAgICAgICAgWmlwRXh0cmFGaWVsZFtdIHplID0gRXh0cmFGaWVsZFV0aWxzLnBhcnNlKGRhdGEpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bWJlciBvZiBmaWVsZHMiLCAyLCB6ZS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSBpbnN0YW5jZW9mIEFzaUV4dHJhRmllbGQpOworICAgICAgICBhc3NlcnRUaGF0KCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSwgaW5zdGFuY2VPZihBc2lFeHRyYUZpZWxkLmNsYXNzKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBmaWVsZCAxIiwgMDQwNzU1LAogICAgICAgICAgICAgICAgICAgICAgKChBc2lFeHRyYUZpZWxkKSB6ZVswXSkuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidHlwZSBmaWVsZCAyIiwgemVbMV0gaW5zdGFuY2VvZiBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidHlwZSBmaWVsZCAyIiwgemVbMV0sIGluc3RhbmNlT2YoVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5jbGFzcykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgbGVuZ3RoIGZpZWxkIDIiLCAxLAogICAgICAgICAgICAgICAgICAgICAgemVbMV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwogCiAgICAgICAgIGJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoIC0gMV07CiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgZGF0YTIsIDAsIGRhdGEyLmxlbmd0aCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMucGFyc2UoZGF0YTIpOwotICAgICAgICAgICAgZmFpbCgiZGF0YSBzaG91bGQgYmUgaW52YWxpZCIpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGV4dHJhIGZpZWxkIHN0YXJ0aW5nIGF0ICIgKyAoNCArIGFMb2NhbC5sZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgQmxvY2sgbGVuZ3RoIG9mIDEgYnl0ZXMgZXhjZWVkcyByZW1haW5pbmcgZGF0YSBvZiAwIGJ5dGVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9CisgICAgICAgIEV4dHJhRmllbGRVdGlscy5wYXJzZShkYXRhMik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwMSwxMCArMTA0LDEwIEBACiAgICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMucGFyc2UoZGF0YSwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMuVW5wYXJzZWFibGVFeHRyYUZpZWxkLlJFQUQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bWJlciBvZiBmaWVsZHMiLCAyLCB6ZS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSBpbnN0YW5jZW9mIEFzaUV4dHJhRmllbGQpOworICAgICAgICBhc3NlcnRUaGF0KCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSwgaW5zdGFuY2VPZihBc2lFeHRyYUZpZWxkLmNsYXNzKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBmaWVsZCAxIiwgMDQwNzU1LAogICAgICAgICAgICAgICAgICAgICAgKChBc2lFeHRyYUZpZWxkKSB6ZVswXSkuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidHlwZSBmaWVsZCAyIiwgemVbMV0gaW5zdGFuY2VvZiBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidHlwZSBmaWVsZCAyIiwgemVbMV0sIGluc3RhbmNlT2YoVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5jbGFzcykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgbGVuZ3RoIGZpZWxkIDIiLCAxLAogICAgICAgICAgICAgICAgICAgICAgemVbMV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwogCkBAIC0xMTMsMTAgKzExNiwxMCBAQAogICAgICAgICB6ZSA9IEV4dHJhRmllbGRVdGlscy5wYXJzZShkYXRhMiwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFGaWVsZFV0aWxzLlVucGFyc2VhYmxlRXh0cmFGaWVsZC5SRUFEKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJudW1iZXIgb2YgZmllbGRzIiwgMiwgemUubGVuZ3RoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidHlwZSBmaWVsZCAxIiwgemVbMF0gaW5zdGFuY2VvZiBBc2lFeHRyYUZpZWxkKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidHlwZSBmaWVsZCAxIiwgemVbMF0sIGluc3RhbmNlT2YoQXNpRXh0cmFGaWVsZC5jbGFzcykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm1vZGUgZmllbGQgMSIsIDA0MDc1NSwKICAgICAgICAgICAgICAgICAgICAgICgoQXNpRXh0cmFGaWVsZCkgemVbMF0pLmdldE1vZGUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoInR5cGUgZmllbGQgMiIsIHplWzFdIGluc3RhbmNlb2YgVW5wYXJzZWFibGVFeHRyYUZpZWxkRGF0YSk7CisgICAgICAgIGFzc2VydFRoYXQoInR5cGUgZmllbGQgMiIsIHplWzFdLCBpbnN0YW5jZU9mKFVucGFyc2VhYmxlRXh0cmFGaWVsZERhdGEuY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkYXRhIGxlbmd0aCBmaWVsZCAyIiwgNCwKICAgICAgICAgICAgICAgICAgICAgIHplWzFdLmdldExvY2FsRmlsZURhdGFMZW5ndGgoKS5nZXRWYWx1ZSgpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKQEAgLTEzMiwxMCArMTM1LDEwIEBACiAgICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMucGFyc2UoZGF0YSwgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUZpZWxkVXRpbHMuVW5wYXJzZWFibGVFeHRyYUZpZWxkLlNLSVApOwogICAgICAgICBhc3NlcnRFcXVhbHMoIm51bWJlciBvZiBmaWVsZHMiLCAyLCB6ZS5sZW5ndGgpOwotICAgICAgICBhc3NlcnRUcnVlKCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSBpbnN0YW5jZW9mIEFzaUV4dHJhRmllbGQpOworICAgICAgICBhc3NlcnRUaGF0KCJ0eXBlIGZpZWxkIDEiLCB6ZVswXSwgaW5zdGFuY2VPZihBc2lFeHRyYUZpZWxkLmNsYXNzKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9kZSBmaWVsZCAxIiwgMDQwNzU1LAogICAgICAgICAgICAgICAgICAgICAgKChBc2lFeHRyYUZpZWxkKSB6ZVswXSkuZ2V0TW9kZSgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgidHlwZSBmaWVsZCAyIiwgemVbMV0gaW5zdGFuY2VvZiBVbnJlY29nbml6ZWRFeHRyYUZpZWxkKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgidHlwZSBmaWVsZCAyIiwgemVbMV0sIGluc3RhbmNlT2YoVW5yZWNvZ25pemVkRXh0cmFGaWVsZC5jbGFzcykpOwogICAgICAgICBhc3NlcnRFcXVhbHMoImRhdGEgbGVuZ3RoIGZpZWxkIDIiLCAxLAogICAgICAgICAgICAgICAgICAgICAgemVbMV0uZ2V0TG9jYWxGaWxlRGF0YUxlbmd0aCgpLmdldFZhbHVlKCkpOwogCkBAIC0xNDQsNyArMTQ3LDcgQEAKICAgICAgICAgemUgPSBFeHRyYUZpZWxkVXRpbHMucGFyc2UoZGF0YTIsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhRmllbGRVdGlscy5VbnBhcnNlYWJsZUV4dHJhRmllbGQuU0tJUCk7CiAgICAgICAgIGFzc2VydEVxdWFscygibnVtYmVyIG9mIGZpZWxkcyIsIDEsIHplLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydFRydWUoInR5cGUgZmllbGQgMSIsIHplWzBdIGluc3RhbmNlb2YgQXNpRXh0cmFGaWVsZCk7CisgICAgICAgIGFzc2VydFRoYXQoInR5cGUgZmllbGQgMSIsIHplWzBdLCBpbnN0YW5jZU9mKEFzaUV4dHJhRmllbGQuY2xhc3MpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2RlIGZpZWxkIDEiLCAwNDA3NTUsCiAgICAgICAgICAgICAgICAgICAgICAoKEFzaUV4dHJhRmllbGQpIHplWzBdKS5nZXRNb2RlKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VVEY4WmlwRmlsZXNUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvVVRGOFppcEZpbGVzVGVzdC5qYXZhCmluZGV4IDZmMjFjYTguLmZlNWVjY2QgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9VVEY4WmlwRmlsZXNUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1VURjhaaXBGaWxlc1Rlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIyLDcgKzIyLDggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0xMjYsNzEgKzEyNyw2MSBAQAogCiAgICAgICAgIFppcEVuY29kaW5nIHppcEVuY29kaW5nID0gWmlwRW5jb2RpbmdIZWxwZXIuZ2V0WmlwRW5jb2RpbmcoZW5jb2RpbmcpOwogCi0gICAgICAgIFppcE91dHB1dFN0cmVhbSB6b3MgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgem9zID0gbmV3IFppcE91dHB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgdHJ5IChaaXBPdXRwdXRTdHJlYW0gem9zID0gbmV3IFppcE91dHB1dFN0cmVhbShmaWxlKSkgewogICAgICAgICAgICAgem9zLnNldEVuY29kaW5nKGVuY29kaW5nKTsKICAgICAgICAgICAgIHpvcy5zZXRVc2VMYW5ndWFnZUVuY29kaW5nRmxhZyh3aXRoRUZTKTsKICAgICAgICAgICAgIHpvcy5zZXRDcmVhdGVVbmljb2RlRXh0cmFGaWVsZHMod2l0aEV4cGxpY2l0VW5pY29kZUV4dHJhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWmlwT3V0cHV0U3RyZWFtLlVuaWNvZGVFeHRyYUZpZWxkUG9saWN5Lk5FVkVSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWmlwT3V0cHV0U3RyZWFtLlVuaWNvZGVFeHRyYUZpZWxkUG9saWN5LkFMV0FZUyk7CisgICAgICAgICAgICAgICAgICAgID8gWmlwT3V0cHV0U3RyZWFtLlVuaWNvZGVFeHRyYUZpZWxkUG9saWN5Lk5FVkVSCisgICAgICAgICAgICAgICAgICAgIDogWmlwT3V0cHV0U3RyZWFtLlVuaWNvZGVFeHRyYUZpZWxkUG9saWN5LkFMV0FZUyk7CiAKICAgICAgICAgICAgIFppcEVudHJ5IHplID0gbmV3IFppcEVudHJ5KE9JTF9CQVJSRUxfVFhUKTsKICAgICAgICAgICAgIGlmICh3aXRoRXhwbGljaXRVbmljb2RlRXh0cmEKLSAgICAgICAgICAgICAgICAmJiAhemlwRW5jb2RpbmcuY2FuRW5jb2RlKHplLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgIXppcEVuY29kaW5nLmNhbkVuY29kZSh6ZS5nZXROYW1lKCkpKSB7CiAKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVuID0gemlwRW5jb2RpbmcuZW5jb2RlKHplLmdldE5hbWUoKSk7CiAKICAgICAgICAgICAgICAgICB6ZS5hZGRFeHRyYUZpZWxkKG5ldyBVbmljb2RlUGF0aEV4dHJhRmllbGQoemUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheU9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5saW1pdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuLmxpbWl0KCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgem9zLnB1dE5leHRFbnRyeSh6ZSk7Ci0gICAgICAgICAgICB6b3Mud3JpdGUoIkhlbGxvLCB3b3JsZCEiLmdldEJ5dGVzKCJVUy1BU0NJSSIpKTsKKyAgICAgICAgICAgIHpvcy53cml0ZSgiSGVsbG8sIHdvcmxkISIuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSkpOwogICAgICAgICAgICAgem9zLmNsb3NlRW50cnkoKTsKIAogICAgICAgICAgICAgemUgPSBuZXcgWmlwRW50cnkoRVVST19GT1JfRE9MTEFSX1RYVCk7CiAgICAgICAgICAgICBpZiAod2l0aEV4cGxpY2l0VW5pY29kZUV4dHJhCi0gICAgICAgICAgICAgICAgJiYgIXppcEVuY29kaW5nLmNhbkVuY29kZSh6ZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICYmICF6aXBFbmNvZGluZy5jYW5FbmNvZGUoemUuZ2V0TmFtZSgpKSkgewogCiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbiA9IHppcEVuY29kaW5nLmVuY29kZSh6ZS5nZXROYW1lKCkpOwogCiAgICAgICAgICAgICAgICAgemUuYWRkRXh0cmFGaWVsZChuZXcgVW5pY29kZVBhdGhFeHRyYUZpZWxkKHplLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW4uYXJyYXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW4uYXJyYXlPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW4ubGltaXQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZW4uYXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuLmFycmF5T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbi5saW1pdCgpKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHpvcy5wdXROZXh0RW50cnkoemUpOwotICAgICAgICAgICAgem9zLndyaXRlKCJHaXZlIG1lIHlvdXIgbW9uZXkhIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgICAgICB6b3Mud3JpdGUoIkdpdmUgbWUgeW91ciBtb25leSEiLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKICAgICAgICAgICAgIHpvcy5jbG9zZUVudHJ5KCk7CiAKICAgICAgICAgICAgIHplID0gbmV3IFppcEVudHJ5KEFTQ0lJX1RYVCk7CiAKICAgICAgICAgICAgIGlmICh3aXRoRXhwbGljaXRVbmljb2RlRXh0cmEKLSAgICAgICAgICAgICAgICAmJiAhemlwRW5jb2RpbmcuY2FuRW5jb2RlKHplLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgIXppcEVuY29kaW5nLmNhbkVuY29kZSh6ZS5nZXROYW1lKCkpKSB7CiAKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVuID0gemlwRW5jb2RpbmcuZW5jb2RlKHplLmdldE5hbWUoKSk7CiAKICAgICAgICAgICAgICAgICB6ZS5hZGRFeHRyYUZpZWxkKG5ldyBVbmljb2RlUGF0aEV4dHJhRmllbGQoemUuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheU9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5saW1pdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbi5hcnJheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZW4uYXJyYXlPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuLmxpbWl0KCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgem9zLnB1dE5leHRFbnRyeSh6ZSk7Ci0gICAgICAgICAgICB6b3Mud3JpdGUoImFzY2lpIi5nZXRCeXRlcygiVVMtQVNDSUkiKSk7CisgICAgICAgICAgICB6b3Mud3JpdGUoImFzY2lpIi5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSk7CiAgICAgICAgICAgICB6b3MuY2xvc2VFbnRyeSgpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKHpvcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgem9zLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvKiBzd2FsbG93ICovCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xOTksMTEgKzE5MCw3IEBACiAgICAgICAgIFppcEZpbGUgemYgPSBudWxsOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgemYgPSBuZXcgWmlwRmlsZShmaWxlLCBlbmNvZGluZywgZmFsc2UpOwotCi0gICAgICAgICAgICBFbnVtZXJhdGlvbiBlID0gemYuZ2V0RW50cmllcygpOwotICAgICAgICAgICAgd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLSAgICAgICAgICAgICAgICBaaXBFbnRyeSB6ZSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCisgICAgICAgICAgICBmb3IgKFppcEVudHJ5IHplIDogQ29sbGVjdGlvbnMubGlzdCh6Zi5nZXRFbnRyaWVzKCkpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHplLmdldE5hbWUoKS5lbmRzV2l0aCgic3Nlci50eHQiKSkgewogICAgICAgICAgICAgICAgICAgICBhc3NlcnRVbmljb2RlTmFtZSh6ZSwgT0lMX0JBUlJFTF9UWFQsIGVuY29kaW5nKTsKIApAQCAtMjM5LDIwICsyMjYsMTYgQEAKICAgICAgICAgICAgIGNyYy51cGRhdGUobmUuYXJyYXkoKSwgbmUuYXJyYXlPZmZzZXQoKSwgbmUubGltaXQoKSk7CiAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjcmMuZ2V0VmFsdWUoKSwgdWNwZi5nZXROYW1lQ1JDMzIoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lLCBuZXcgU3RyaW5nKHVjcGYuZ2V0VW5pY29kZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGXzgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE5hbWUsIG5ldyBTdHJpbmcodWNwZi5nZXRVbmljb2RlTmFtZSgpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydENhblJlYWQoWmlwRmlsZSB6ZiwgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBaaXBFbnRyeSBlbnRyeSA9IHpmLmdldEVudHJ5KGZpbGVOYW1lKTsKICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRW50cnkgIiArIGZpbGVOYW1lICsgIiBkb2Vzbid0IGV4aXN0IiwgZW50cnkpOwotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IHpmLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSW5wdXRTdHJlYW0gaXMgbnVsbCIsIGlzKTsKLSAgICAgICAgdHJ5IHsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IHpmLmdldElucHV0U3RyZWFtKGVudHJ5KSkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSW5wdXRTdHJlYW0gaXMgbnVsbCIsIGlzKTsKICAgICAgICAgICAgIGlzLnJlYWQoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlzLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbmNvZGluZ1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbmNvZGluZ1Rlc3QuamF2YQppbmRleCBmMDVkNTUzLi5hMTZhYzgzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW5jb2RpbmdUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVuY29kaW5nVGVzdC5qYXZhCkBAIC03LDcgKzcsNyBAQAogICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKICAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCkBAIC0yMSwxMCArMjEsMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKICAqIFRlc3QgemlwIGVuY29kaW5ncy4KQEAgLTEzMywxNiArMTM2LDE2IEBACiAKICAgICAgICAgU3RyaW5nIGRlY29kZWQgPSBlbmMuZGVjb2RlKHRlc3RCeXRlcyk7CiAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGVuYy5jYW5FbmNvZGUoZGVjb2RlZCkpOworICAgICAgICBhc3NlcnRUcnVlKGVuYy5jYW5FbmNvZGUoZGVjb2RlZCkpOwogCiAgICAgICAgIEJ5dGVCdWZmZXIgZW5jb2RlZCA9IGVuYy5lbmNvZGUoZGVjb2RlZCk7CiAKICAgICAgICAgYXNzZXJ0Qnl0ZUVxdWFscyh0ZXN0Qnl0ZXMsIGVuY29kZWQpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgZW5jLmNhbkVuY29kZShVTkVOQ19TVFJJTkcpKTsKLSAgICAgICAgYXNzZXJ0Qnl0ZUVxdWFscygiJVUyMDE2Ii5nZXRCeXRlcygiVVMtQVNDSUkiKSwgZW5jLmVuY29kZShVTkVOQ19TVFJJTkcpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBlbmMuY2FuRW5jb2RlKEJBRF9TVFJJTkcpKTsKLSAgICAgICAgYXNzZXJ0Qnl0ZUVxdWFscyhCQURfU1RSSU5HX0VOQy5nZXRCeXRlcygiVVMtQVNDSUkiKSwKKyAgICAgICAgYXNzZXJ0RmFsc2UoZW5jLmNhbkVuY29kZShVTkVOQ19TVFJJTkcpKTsKKyAgICAgICAgYXNzZXJ0Qnl0ZUVxdWFscygiJVUyMDE2Ii5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSwgZW5jLmVuY29kZShVTkVOQ19TVFJJTkcpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZW5jLmNhbkVuY29kZShCQURfU1RSSU5HKSk7CisgICAgICAgIGFzc2VydEJ5dGVFcXVhbHMoQkFEX1NUUklOR19FTkMuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSksCiAgICAgICAgICAgICAgICAgZW5jLmVuY29kZShCQURfU1RSSU5HKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW50cnlUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwRW50cnlUZXN0LmphdmEKaW5kZXggZmMzMGVjYS4uZDc5YjBlNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcEVudHJ5VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBFbnRyeVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDIwICsxOCwyMyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuemlwOwogCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogLyoqCiAgKiBKVW5pdCA0IHRlc3RjYXNlcyBmb3Igb3JnLmFwYWNoZS50b29scy56aXAuWmlwRW50cnkuCiAgKi8KIHB1YmxpYyBjbGFzcyBaaXBFbnRyeVRlc3QgewogCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOwogCiAgICAgLyoqCiAgICAgICogdGVzdCBoYW5kbGluZyBvZiBleHRyYSBmaWVsZHMKQEAgLTgwLDEyICs4Myw5IEBACiAgICAgICAgIGFzc2VydFNhbWUodTMsIHJlc3VsdFsxXSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibGVuZ3RoIGZvdXJ0aCBwYXNzIiwgZGF0YTIubGVuZ3RoLCBkYXRhMy5sZW5ndGgpOwogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB6ZS5yZW1vdmVFeHRyYUZpZWxkKEV4dHJhRmllbGRVdGlsc1Rlc3QuVU5SRUNPR05JWkVEX0hFQURFUik7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgbm8gc3VjaCBlbGVtZW50Iik7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbnNlKSB7Ci0gICAgICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiB2YWx1ZXMKLSAgICAgICAgfQorICAgICAgICB0aHJvd24uZXhwZWN0KE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAvL1RPRE8gYXNzZXJ0IGV4Y2VwdGlvbiB2YWx1ZXMKKyAgICAgICAgemUucmVtb3ZlRXh0cmFGaWVsZChFeHRyYUZpZWxkVXRpbHNUZXN0LlVOUkVDT0dOSVpFRF9IRUFERVIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjAzLDE0ICsyMDMsMTMgQEAKIAogICAgIC8qKgogICAgICAqIFRlc3QgY2FzZSBmb3IKLSAgICAgKiA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NPTVBSRVNTLTk0IgotICAgICAqID5DT01QUkVTUy05NDwvYT4uCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DT01QUkVTUy05NCI+Q09NUFJFU1MtOTQ8L2E+CiAgICAgICovCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxzKCkgewogICAgICAgICBaaXBFbnRyeSBlbnRyeTEgPSBuZXcgWmlwRW50cnkoImZvbyIpOwogICAgICAgICBaaXBFbnRyeSBlbnRyeTIgPSBuZXcgWmlwRW50cnkoImJhciIpOwotICAgICAgICBhc3NlcnRGYWxzZShlbnRyeTEuZXF1YWxzKGVudHJ5MikpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoZW50cnkxLCBlbnRyeTIpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwTG9uZ1Rlc3QuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nVGVzdC5qYXZhCmluZGV4IDY1ZWU1MDUuLjZiYmUxODQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBMb25nVGVzdC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMjIsNyArMjIsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CiAKIC8qKgogICogSlVuaXQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBMb25nLgpAQCAtNjMsMTUgKzYzLDE1IEBACiAgICAgICAgIFppcExvbmcgemwyID0gbmV3IFppcExvbmcoMHgxMjM0NTY3OCk7CiAgICAgICAgIFppcExvbmcgemwzID0gbmV3IFppcExvbmcoMHg4NzY1NDMyMSk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgicmVmbGV4aXZlIiwgemwuZXF1YWxzKHpsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVmbGV4aXZlIiwgemwsIHpsKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJ3b3JrcyIsIHpsLmVxdWFscyh6bDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgid29ya3MsIHBhcnQgdHdvIiwgIXpsLmVxdWFscyh6bDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JrcyIsIHpsLCB6bDIpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoIndvcmtzLCBwYXJ0IHR3byIsIHpsLCB6bDMpOwogCi0gICAgICAgIGFzc2VydFRydWUoInN5bW1ldHJpYyIsIHpsMi5lcXVhbHMoemwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW1tZXRyaWMiLCB6bDIsIHpsKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJudWxsIGhhbmRsaW5nIiwgIXpsLmVxdWFscyhudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIm5vbiBaaXBMb25nIGhhbmRsaW5nIiwgIXpsLmVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMHgxMjM0KSkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoIm51bGwgaGFuZGxpbmciLCBudWxsLCB6bCk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscygibm9uIFppcExvbmcgaGFuZGxpbmciLCAweDEyMzQsIHpsKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IGY0MWIyNDYuLjVlOTRjMTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcE91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBwcml2YXRlIFppcExvbmcgemw7CiAKICAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKICAgICAgICAgdGltZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAgIGNhbC5zZXRUaW1lKHRpbWUpOwpAQCAtNTUsMTkgKzU1LDE5IEBACiAKIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFppcExvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgWmlwTG9uZyB0ZXN0ID0gWmlwT3V0cHV0U3RyZWFtLnRvRG9zVGltZSh0aW1lKTsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WmlwTG9uZygpIHsKKyAgICAgICAgWmlwTG9uZyB0ZXN0ID0gWmlwVXRpbC50b0Rvc1RpbWUodGltZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0LmdldFZhbHVlKCksIHpsLmdldFZhbHVlKCkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFkanVzdFRvTG9uZygpIHsKICAgICAgICAgYXNzZXJ0RXF1YWxzKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAgIFppcE91dHB1dFN0cmVhbS5hZGp1c3RUb0xvbmcoSW50ZWdlci5NQVhfVkFMVUUpKTsKKyAgICAgICAgICAgICAgICAgICAgIFppcFV0aWwuYWRqdXN0VG9Mb25nKEludGVnZXIuTUFYX1ZBTFVFKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygoKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0uYWRqdXN0VG9Mb25nKEludGVnZXIuTUFYX1ZBTFVFICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgWmlwVXRpbC5hZGp1c3RUb0xvbmcoSW50ZWdlci5NQVhfVkFMVUUgKyAxKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygyICogKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSksCi0gICAgICAgICAgICAgICAgICAgICBaaXBPdXRwdXRTdHJlYW0uYWRqdXN0VG9Mb25nKDIgKiBJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICAgWmlwVXRpbC5hZGp1c3RUb0xvbmcoMiAqIEludGVnZXIuTUFYX1ZBTFVFKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnRUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2FwYWNoZS90b29scy96aXAvWmlwU2hvcnRUZXN0LmphdmEKaW5kZXggN2VmY2E1OC4uZTJlY2VhNiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9hcGFjaGUvdG9vbHMvemlwL1ppcFNob3J0VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvYXBhY2hlL3Rvb2xzL3ppcC9aaXBTaG9ydFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTIxLDggKzIxLDggQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvKioKICAqIEpVbml0IDQgdGVzdGNhc2VzIGZvciBvcmcuYXBhY2hlLnRvb2xzLnppcC5aaXBTaG9ydC4KQEAgLTYwLDE1ICs2MCwxNSBAQAogICAgICAgICBaaXBTaG9ydCB6czIgPSBuZXcgWmlwU2hvcnQoMHgxMjM0KTsKICAgICAgICAgWmlwU2hvcnQgenMzID0gbmV3IFppcFNob3J0KDB4NTY3OCk7CiAKLSAgICAgICAgYXNzZXJ0VHJ1ZSgicmVmbGV4aXZlIiwgenMuZXF1YWxzKHpzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVmbGV4aXZlIiwgenMsIHpzKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJ3b3JrcyIsIHpzLmVxdWFscyh6czIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgid29ya3MsIHBhcnQgdHdvIiwgIXpzLmVxdWFscyh6czMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JrcyIsIHpzLCB6czIpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoIndvcmtzLCBwYXJ0IHR3byIsIHpzLCB6czMpOwogCi0gICAgICAgIGFzc2VydFRydWUoInN5bW1ldHJpYyIsIHpzMi5lcXVhbHMoenMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzeW1tZXRyaWMiLCB6czIsIHpzKTsKIAotICAgICAgICBhc3NlcnRUcnVlKCJudWxsIGhhbmRsaW5nIiwgIXpzLmVxdWFscyhudWxsKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIm5vbiBaaXBTaG9ydCBoYW5kbGluZyIsICF6cy5lcXVhbHMoSW50ZWdlci52YWx1ZU9mKDB4MTIzNCkpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJudWxsIGhhbmRsaW5nIiwgbnVsbCwgenMpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoIm5vbiBaaXBTaG9ydCBoYW5kbGluZyIsIDB4MTIzNCwgenMpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0SlVuaXQzVGVzdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0SlVuaXQzVGVzdE1pc3NlZC5qYXZhCmluZGV4IGZkMjYxZjUuLjkzZGU4YzUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9BYnN0cmFjdEpVbml0M1Rlc3RNaXNzZWQuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvQWJzdHJhY3RKVW5pdDNUZXN0TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvQWJzdHJhY3RKVW5pdDNUZXN0Tm90TWlzc2VkLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvQWJzdHJhY3RKVW5pdDNUZXN0Tm90TWlzc2VkLmphdmEKaW5kZXggZTFkMWMwYi4uMjBmZDlkNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0SlVuaXQzVGVzdE5vdE1pc3NlZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9BYnN0cmFjdEpVbml0M1Rlc3ROb3RNaXNzZWQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9BYnN0cmFjdFRlc3RNaXNzZWQuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9BYnN0cmFjdFRlc3RNaXNzZWQuamF2YQppbmRleCA2NzI0ZDViLi43ZGVkOTEzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvQWJzdHJhY3RUZXN0TWlzc2VkLmphdmEKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0VGVzdE1pc3NlZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0VGVzdE5vdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0Fic3RyYWN0VGVzdE5vdE1pc3NlZC5qYXZhCmluZGV4IDlhNzdkMWIuLmFjOWIyOTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9BYnN0cmFjdFRlc3ROb3RNaXNzZWQuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvQWJzdHJhY3RUZXN0Tm90TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQzTm9uVGVzdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0pVbml0M05vblRlc3RNaXNzZWQuamF2YQppbmRleCA3NmNlYWQ2Li40MDVlYTBlIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQzTm9uVGVzdE1pc3NlZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9KVW5pdDNOb25UZXN0TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQzVGVzdE5vdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0pVbml0M1Rlc3ROb3RNaXNzZWQuamF2YQppbmRleCAxZTVhYzJkLi4wZDRkYzE4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQzVGVzdE5vdE1pc3NlZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9KVW5pdDNUZXN0Tm90TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQ0U2tpcHBhYmxlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvSlVuaXQ0U2tpcHBhYmxlLmphdmEKaW5kZXggYWE4OWFiNy4uMGU2NjQ5MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L0pVbml0NFNraXBwYWJsZS5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9KVW5pdDRTa2lwcGFibGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE4LDEyICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5leGFtcGxlLmp1bml0OwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuSWdub3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOwogCiBwdWJsaWMgY2xhc3MgSlVuaXQ0U2tpcHBhYmxlIHsKIApAQCAtNDAsNyArNDAsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBpbXBsaWNpdGx5SWdub3JlVGVzdCgpIHsKLSAgICAgICAgQXNzdW1lLmFzc3VtZUZhbHNlKCJUaGlzIHRlc3Qgd2lsbCBiZSBpZ25vcmVkIiwgdHJ1ZSk7CisgICAgICAgIGFzc3VtZUZhbHNlKCJUaGlzIHRlc3Qgd2lsbCBiZSBpZ25vcmVkIiwgdHJ1ZSk7CiAgICAgICAgIGZhaWwoIkkgdG9sZCB5b3UsIHRoaXMgdGVzdCBzaG91bGQgaGF2ZSBiZWVuIGlnbm9yZWQhIik7CiAgICAgfQogCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGltcGxpY2l0bHlJZ25vcmVUZXN0Tm9NZXNzYWdlKCkgewotICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UodHJ1ZSk7CisgICAgICAgIGFzc3VtZUZhbHNlKHRydWUpOwogICAgICAgICBmYWlsKCJJIHRvbGQgeW91LCB0aGlzIHRlc3Qgc2hvdWxkIGhhdmUgYmVlbiBpZ25vcmVkISIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L011bHRpbGluZUFzc2VydHMuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9NdWx0aWxpbmVBc3NlcnRzLmphdmEKaW5kZXggYmU2OGVjNi4uNjJiNTU1YyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L011bHRpbGluZUFzc2VydHMuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvTXVsdGlsaW5lQXNzZXJ0cy5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L05vblRlc3RNaXNzZWQuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9Ob25UZXN0TWlzc2VkLmphdmEKaW5kZXggMGEwMjBlYy4uOWJlMGYyYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L05vblRlc3RNaXNzZWQuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvTm9uVGVzdE1pc3NlZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L091dHB1dC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L091dHB1dC5qYXZhCmluZGV4IGE3MTM1ZjcuLjQxNmI2N2UgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9PdXRwdXQuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvT3V0cHV0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGVzdE5vdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L1Rlc3ROb3RNaXNzZWQuamF2YQppbmRleCA0MWI3MjJmLi45NDJlMmMzIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGVzdE5vdE1pc3NlZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UZXN0Tm90TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGVzdFdpdGhTdWl0ZU5vdE1pc3NlZC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L1Rlc3RXaXRoU3VpdGVOb3RNaXNzZWQuamF2YQppbmRleCA4MGI3MjJjLi40MDYzMmM1IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGVzdFdpdGhTdWl0ZU5vdE1pc3NlZC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UZXN0V2l0aFN1aXRlTm90TWlzc2VkLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGhyZWFkZWRPdXRwdXQuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UaHJlYWRlZE91dHB1dC5qYXZhCmluZGV4IDkxZjQ2MmEuLjIxZjc1MDcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UaHJlYWRlZE91dHB1dC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UaHJlYWRlZE91dHB1dC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMzIsMTEgKzMyLDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZm9vIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgoKSAtPiBTeXN0ZW0ub3V0LnByaW50bG4oImZvbyIpKTsKICAgICAgICAgdC5zdGFydCgpOwogICAgICAgICB0LmpvaW4oKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGltZW91dC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L1RpbWVvdXQuamF2YQppbmRleCA2YTQyZWU3Li4xYzBlYzUxIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvVGltZW91dC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9UaW1lb3V0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvWG1sUGFyc2VyVGVzdC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0L1htbFBhcnNlclRlc3QuamF2YQppbmRleCBlNWZhZTU1Li40NDc1YzI2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXQvWG1sUGFyc2VyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdC9YbWxQYXJzZXJUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9UcmFja2VyLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9UcmFja2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzMWVjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL1RyYWNrZXIuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5UZXN0RXhlY3V0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdGxhdW5jaGVyLlRlc3RSZXN1bHRGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmp1bml0LnBsYXRmb3JtLmVuZ2luZS5UZXN0RXhlY3V0aW9uUmVzdWx0OworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuc3VwcG9ydC5kZXNjcmlwdG9yLkNsYXNzU291cmNlOworaW1wb3J0IG9yZy5qdW5pdC5wbGF0Zm9ybS5lbmdpbmUuc3VwcG9ydC5kZXNjcmlwdG9yLk1ldGhvZFNvdXJjZTsKK2ltcG9ydCBvcmcuanVuaXQucGxhdGZvcm0ubGF1bmNoZXIuVGVzdElkZW50aWZpZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5PcGVuT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFV0aWxpdHkgbGlzdGVuZXIgdXNlZCBpbiB7QGxpbmsgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXRsYXVuY2hlci5KVW5pdExhdW5jaGVyVGFza1Rlc3R9CisgKiB0byB2ZXJpZnkgdGhhdCB0ZXN0cyBsYXVuY2hlZCB0aHJvdWdoIGp1bml0bGF1bmNoZXIgdGFzayBhcmUgZXhlY3V0ZWQgYXMgZXhwZWN0ZWQKKyAqLworcHVibGljIGNsYXNzIFRyYWNrZXIgaW1wbGVtZW50cyBUZXN0UmVzdWx0Rm9ybWF0dGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVEVTVF9DTEFTU19TVEFSVEVEID0gInN0YXJ0ZWQ6dGVzdC1jbGFzczoiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfVEVTVF9NRVRIT0RfU1RBUlRFRCA9ICJzdGFydGVkOnRlc3QtbWV0aG9kOiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9URVNUX0NMQVNTX1NLSVBQRUQgPSAic2tpcHBlZDp0ZXN0LWNsYXNzOiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9URVNUX01FVEhPRF9TS0lQUEVEID0gInNraXBwZWQ6dGVzdC1tZXRob2Q6IjsKKworICAgIHByaXZhdGUgUHJpbnRXcml0ZXIgd3JpdGVyOworICAgIHByaXZhdGUgVGVzdEV4ZWN1dGlvbkNvbnRleHQgY29udGV4dDsKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBhcHBlbmRNb2RlRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbCA9IHRoaXMuY29udGV4dC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImp1bml0bGF1bmNoZXIudGVzdC50cmFja2VyLmFwcGVuZC5maWxlIik7CisgICAgICAgIGlmIChwcm9wVmFsID09IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMud3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG9zLCB0cnVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBpZ25vcmUgdGhlIHBhc3NlZCBvdXRwdXRzdHJlYW0gYW5kIGluc3RlYWQgY3JlYXRlIG91ciBvd24sIGluIGFwcGVuZCBtb2RlCisgICAgICAgIGZpbmFsIFBhdGggYXBwZW5kTW9kZUZpbGVQYXRoID0gUGF0aHMuZ2V0KHByb3BWYWwpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy5hcHBlbmRNb2RlRmlsZSA9IEZpbGVzLm5ld091dHB1dFN0cmVhbShhcHBlbmRNb2RlRmlsZVBhdGgsIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsIFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQpOworICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIodGhpcy5hcHBlbmRNb2RlRmlsZSwgdHJ1ZSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBUZXN0RXhlY3V0aW9uQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLndyaXRlci5mbHVzaCgpOworICAgICAgICBpZiAodGhpcy5hcHBlbmRNb2RlRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmFwcGVuZE1vZGVGaWxlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRpb25TdGFydGVkKGZpbmFsIFRlc3RJZGVudGlmaWVyIHRlc3RJZGVudGlmaWVyKSB7CisgICAgICAgIHRlc3RJZGVudGlmaWVyLmdldFNvdXJjZSgpLmlmUHJlc2VudCgocykgLT4geworICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBNZXRob2RTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihQUkVGSVhfVEVTVF9NRVRIT0RfU1RBUlRFRCArICgoTWV0aG9kU291cmNlKSBzKS5nZXRDbGFzc05hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIyIgKyAoKE1ldGhvZFNvdXJjZSkgcykuZ2V0TWV0aG9kTmFtZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocyBpbnN0YW5jZW9mIENsYXNzU291cmNlKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4oUFJFRklYX1RFU1RfQ0xBU1NfU1RBUlRFRCArICgoQ2xhc3NTb3VyY2UpIHMpLmdldENsYXNzTmFtZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0aW9uRmluaXNoZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFRlc3RFeGVjdXRpb25SZXN1bHQgdGVzdEV4ZWN1dGlvblJlc3VsdCkgeworICAgICAgICB0ZXN0SWRlbnRpZmllci5nZXRTb3VyY2UoKS5pZlByZXNlbnQoKHMpIC0+IHsKKyAgICAgICAgICAgIGlmIChzIGluc3RhbmNlb2YgTWV0aG9kU291cmNlKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50bG4odGVzdEV4ZWN1dGlvblJlc3VsdC5nZXRTdGF0dXMoKS5uYW1lKCkgKyAiOnRlc3QtbWV0aG9kOiIgKyAoKE1ldGhvZFNvdXJjZSkgcykuZ2V0Q2xhc3NOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiMiICsgKChNZXRob2RTb3VyY2UpIHMpLmdldE1ldGhvZE5hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMgaW5zdGFuY2VvZiBDbGFzc1NvdXJjZSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKHRlc3RFeGVjdXRpb25SZXN1bHQuZ2V0U3RhdHVzKCkubmFtZSgpICsgIjp0ZXN0LWNsYXNzOiIgKyAoKENsYXNzU291cmNlKSBzKS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGlvblNraXBwZWQoZmluYWwgVGVzdElkZW50aWZpZXIgdGVzdElkZW50aWZpZXIsIGZpbmFsIFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgdGVzdElkZW50aWZpZXIuZ2V0U291cmNlKCkuaWZQcmVzZW50KChzKSAtPiB7CisgICAgICAgICAgICBpZiAocyBpbnN0YW5jZW9mIE1ldGhvZFNvdXJjZSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKFBSRUZJWF9URVNUX01FVEhPRF9TS0lQUEVEICsgKChNZXRob2RTb3VyY2UpIHMpLmdldENsYXNzTmFtZSgpICsgIiMiCisgICAgICAgICAgICAgICAgICAgICAgICArICgoTWV0aG9kU291cmNlKSBzKS5nZXRNZXRob2ROYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzIGluc3RhbmNlb2YgQ2xhc3NTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIucHJpbnRsbihQUkVGSVhfVEVTVF9DTEFTU19TS0lQUEVEICsgKChDbGFzc1NvdXJjZSkgcykuZ2V0Q2xhc3NOYW1lKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gd2FzVGVzdFJ1bihmaW5hbCBQYXRoIHRyYWNrZXJGaWxlLCBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGluZXMgPSByZWFkVHJhY2tlckZpbGUodHJhY2tlckZpbGUpOworICAgICAgICByZXR1cm4gbGluZXMuY29udGFpbnMoUFJFRklYX1RFU1RfQ0xBU1NfU1RBUlRFRCArIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdhc1Rlc3RSdW4oZmluYWwgUGF0aCB0cmFja2VyRmlsZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlYWRUcmFja2VyRmlsZSh0cmFja2VyRmlsZSk7CisgICAgICAgIHJldHVybiBsaW5lcy5jb250YWlucyhQUkVGSVhfVEVTVF9NRVRIT0RfU1RBUlRFRCArIGNsYXNzTmFtZSArICIjIiArIG1ldGhvZE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlGYWlsZWQoZmluYWwgUGF0aCB0cmFja2VyRmlsZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlYWRUcmFja2VyRmlsZSh0cmFja2VyRmlsZSk7CisgICAgICAgIHJldHVybiBsaW5lcy5jb250YWlucyhUZXN0RXhlY3V0aW9uUmVzdWx0LlN0YXR1cy5GQUlMRUQgKyAiOnRlc3QtbWV0aG9kOiIgKyBjbGFzc05hbWUgKyAiIyIgKyBtZXRob2ROYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeVNldHVwRmFpbGVkKGZpbmFsIFBhdGggdHJhY2tlckZpbGUsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlYWRUcmFja2VyRmlsZSh0cmFja2VyRmlsZSk7CisgICAgICAgIHJldHVybiBsaW5lcy5jb250YWlucyhUZXN0RXhlY3V0aW9uUmVzdWx0LlN0YXR1cy5GQUlMRUQgKyAiOnRlc3QtY2xhc3M6IiArIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeVN1Y2Nlc3MoZmluYWwgUGF0aCB0cmFja2VyRmlsZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlYWRUcmFja2VyRmlsZSh0cmFja2VyRmlsZSk7CisgICAgICAgIHJldHVybiBsaW5lcy5jb250YWlucyhUZXN0RXhlY3V0aW9uUmVzdWx0LlN0YXR1cy5TVUNDRVNTRlVMICsgIjp0ZXN0LW1ldGhvZDoiICsgY2xhc3NOYW1lICsgIiMiICsgbWV0aG9kTmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZlcmlmeVNraXBwZWQoZmluYWwgUGF0aCB0cmFja2VyRmlsZSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IHJlYWRUcmFja2VyRmlsZSh0cmFja2VyRmlsZSk7CisgICAgICAgIHJldHVybiBsaW5lcy5jb250YWlucyhQUkVGSVhfVEVTVF9NRVRIT0RfU0tJUFBFRCArIGNsYXNzTmFtZSArICIjIiArIG1ldGhvZE5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkVHJhY2tlckZpbGUoZmluYWwgUGF0aCB0cmFja2VyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFGaWxlcy5pc1JlZ3VsYXJGaWxlKHRyYWNrZXJGaWxlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odHJhY2tlckZpbGUgKyAiIGlzIGVpdGhlciBtaXNzaW5nIG9yIG5vdCBhIGZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRmlsZXMucmVhZEFsbExpbmVzKHRyYWNrZXJGaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMzUxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL2p1cGl0ZXIvSnVwaXRlclNhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQWZ0ZXJBbGw7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFmdGVyRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlQWxsOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5EaXNhYmxlZDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuVGFnOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5Bc3NlcnRpb25zLmZhaWw7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEp1cGl0ZXJTYW1wbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlRoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2ciOworCisgICAgQEJlZm9yZUFsbAorICAgIHN0YXRpYyB2b2lkIGJlZm9yZUFsbCgpIHsKKyAgICB9CisKKyAgICBAQmVmb3JlRWFjaAorICAgIHZvaWQgYmVmb3JlRWFjaCgpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgdGVzdFN1Y2NlZWRzKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIjxzb21lLW90aGVyLW1lc3NhZ2U+SGVsbG8gd29ybGQhIDwhLS0gc29tZSBjb21tZW50IC0tPjwvc29tZS1vdGhlci1tZXNzYWdlPiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCB0ZXN0RmFpbHMoKSB7CisgICAgICAgIGZhaWwoImludGVudGlvbmFsbHkgZmFpbGluZyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQERpc2FibGVkKCJpbnRlbnRpb25hbGx5IHNraXBwZWQiKQorICAgIHZvaWQgdGVzdFNraXBwZWQoKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVGFnKCJmYXN0IikKKyAgICB2b2lkIHRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZCgpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBUYWcoImZhc3QiKQorICAgIHZvaWQgdGVzdE1ldGhvZEluY2x1ZGVUYWdpc0V4ZWN1dGVkMigpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBUYWcoInNsb3ciKQorICAgIHZvaWQgdGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkKCkgeworICAgIH0KKworICAgIEBBZnRlckVhY2gKKyAgICB2b2lkIGFmdGVyRWFjaCgpIHsKKyAgICB9CisKKyAgICBAQWZ0ZXJBbGwKKyAgICBzdGF0aWMgdm9pZCBhZnRlckFsbCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJTYW1wbGVUZXN0RmFpbGluZ0JlZm9yZUFsbC5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvanVwaXRlci9KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDJlNzAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvanVwaXRlci9KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQWZ0ZXJBbGw7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFmdGVyRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlQWxsOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UZXN0OworCisvKioKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBKdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdCZWZvcmVBbGwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyI7CisKKyAgICBAQmVmb3JlQWxsCisgICAgc3RhdGljIHZvaWQgYmVmb3JlQWxsKCkgeworICAgIAl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW50ZW50aW9uYWwgZmFpbHVyZSIpOworICAgIH0KKworICAgIEBCZWZvcmVFYWNoCisgICAgdm9pZCBiZWZvcmVFYWNoKCkgeworICAgIH0KKworICAgIEBUZXN0CisgICAgdm9pZCB0ZXN0U3VjY2VlZHMoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludCgiPHNvbWUtb3RoZXItbWVzc2FnZT5IZWxsbyB3b3JsZCEgPCEtLSBzb21lIGNvbW1lbnQgLS0+PC9zb21lLW90aGVyLW1lc3NhZ2U+Iik7CisgICAgfQorCisgICAgQEFmdGVyRWFjaAorICAgIHZvaWQgYWZ0ZXJFYWNoKCkgeworICAgIH0KKworICAgIEBBZnRlckFsbAorICAgIHN0YXRpYyB2b2lkIGFmdGVyQWxsKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJTYW1wbGVUZXN0RmFpbGluZ1N0YXRpYy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvanVwaXRlci9KdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdTdGF0aWMuamF2YQppbmRleCA5ZDZmY2JhLi4yYzg4ZDY2IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL2p1cGl0ZXIvSnVwaXRlclNhbXBsZVRlc3RGYWlsaW5nU3RhdGljLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNSwxMSArMTUsMjUgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKi8KK3BhY2thZ2Ugb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci5qdXBpdGVyOworCitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CisKIC8qKgorICoKICAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKK3B1YmxpYyBjbGFzcyBKdXBpdGVyU2FtcGxlVGVzdEZhaWxpbmdTdGF0aWMgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlbnRpb25hbCBleGNlcHRpb24gZnJvbSBzdGF0aWMgaW5pdCBibG9jayIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHZvaWQgdGVzdFN1Y2NlZWRzKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImhlbGxvIik7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJUYWdTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci9qdXBpdGVyL0p1cGl0ZXJUYWdTYW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxOTE2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL2p1cGl0ZXIvSnVwaXRlclRhZ1NhbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLmp1cGl0ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQWZ0ZXJBbGw7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLkFmdGVyRWFjaDsKK2ltcG9ydCBvcmcuanVuaXQuanVwaXRlci5hcGkuQmVmb3JlQWxsOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5CZWZvcmVFYWNoOworaW1wb3J0IG9yZy5qdW5pdC5qdXBpdGVyLmFwaS5UYWc7CitpbXBvcnQgb3JnLmp1bml0Lmp1cGl0ZXIuYXBpLlRlc3Q7CisKKy8qKgorICoKKyAqLworcHVibGljIGNsYXNzIEp1cGl0ZXJUYWdTYW1wbGVUZXN0IHsKKworICAgIEBCZWZvcmVBbGwKKyAgICBzdGF0aWMgdm9pZCBiZWZvcmVBbGwoKSB7CisgICAgfQorCisgICAgQEJlZm9yZUVhY2gKKyAgICB2b2lkIGJlZm9yZUVhY2goKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVGFnKCJmYXN0IikKKyAgICB2b2lkIHRlc3RNZXRob2RJbmNsdWRlVGFnaXNFeGVjdXRlZFRhZ1NhbXBsZVRlc3QoKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVGFnKCJzbG93IikKKyAgICB2b2lkIHRlc3RNZXRob2RJbmNsdWRlVGFnaXNOb3RFeGVjdXRlZFRhZ1NhbXBsZVRlc3QoKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAVGFnKCJleHRyYVNsb3ciKQorICAgIHZvaWQgdGVzdE1ldGhvZEluY2x1ZGVUYWdpc05vdEV4ZWN1dGVkMlRhZ1NhbXBsZVRlc3QoKSB7CisgICAgfQorCisKKyAgICBAQWZ0ZXJFYWNoCisgICAgdm9pZCBhZnRlckVhY2goKSB7CisgICAgfQorCisgICAgQEFmdGVyQWxsCisgICAgc3RhdGljIHZvaWQgYWZ0ZXJBbGwoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL3ZpbnRhZ2UvQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpjb3B5IHRvIHNyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL3ZpbnRhZ2UvQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuamF2YQppbmRleCA5ZDZmY2JhLi4xODg3ZWI4IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL3ZpbnRhZ2UvQWx3YXlzRmFpbGluZ0pVbml0NFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1LDExICsxNSwxOSBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqLworcGFja2FnZSBvcmcuZXhhbXBsZS5qdW5pdGxhdW5jaGVyLnZpbnRhZ2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKwogLyoqCisgKgogICovCi1ARGlzdHJpYnV0ZWQoCi0gICAgICAgIHByb3RvY29sPSJDT1JCQSIsCi0gICAgICAgIGRpc3RyaWJ1dGlvbj1EaXN0cmlidXRlZC5EaXN0cmlidXRpb25UeXBlcy5GRURFUkFURUQKLSAgICAgICAgKQotcHVibGljIGNsYXNzIEFwdEV4YW1wbGUgeworcHVibGljIGNsYXNzIEFsd2F5c0ZhaWxpbmdKVW5pdDRUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpbGxGYWlsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlZhbHVlcyB3ZXJlbid0IGVxdWFsIiwgMywgNCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YSBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS9qdW5pdGxhdW5jaGVyL3ZpbnRhZ2UvRm9ya2VkVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjMlCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvdmludGFnZS9Gb3JrZWRUZXN0LmphdmEKaW5kZXggOWQ2ZmNiYS4uMmY0MzJlNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci92aW50YWdlL0ZvcmtlZFRlc3QuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1LDExICsxNSwyMyBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqLworCitwYWNrYWdlIG9yZy5leGFtcGxlLmp1bml0bGF1bmNoZXIudmludGFnZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKIC8qKgorICoKICAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKK3B1YmxpYyBjbGFzcyBGb3JrZWRUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFNZU19QUk9QX09ORSA9ICJqdW5pdGxhdW5jaGVyLnRlc3Quc3lzcHJvcC5vbmUiOworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeXNQcm9wKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBzeXN0ZW0gcHJvcGVydHkiLAorICAgICAgICAgICAgICAgICJmb3JrZWQiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoU1lTX1BST1BfT05FKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvdmludGFnZS9KVW5pdDRTYW1wbGVUZXN0LmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvanVuaXRsYXVuY2hlci92aW50YWdlL0pVbml0NFNhbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGQ2MjkxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL2p1bml0bGF1bmNoZXIvdmludGFnZS9KVW5pdDRTYW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmV4YW1wbGUuanVuaXRsYXVuY2hlci52aW50YWdlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKgorICovCitwdWJsaWMgY2xhc3MgSlVuaXQ0U2FtcGxlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb28oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygxLCAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXIoKSB7CisgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyKCkgeworICAgICAgICBhc3NlcnRGYWxzZShmYWxzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL1Rhc2tkZWZUZXN0Q29udGFpbmVyVGFzay5qYXZhIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL1Rhc2tkZWZUZXN0Q29udGFpbmVyVGFzay5qYXZhCmluZGV4IDk2MGFkNzIuLmNmZDk4YjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9UYXNrZGVmVGVzdENvbnRhaW5lclRhc2suamF2YQorKysgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RDb250YWluZXJUYXNrLmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RTaW1wbGVUYXNrLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvVGFza2RlZlRlc3RTaW1wbGVUYXNrLmphdmEKaW5kZXggNGFkYWQ5My4uMTFmZGU3OSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL1Rhc2tkZWZUZXN0U2ltcGxlVGFzay5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9UYXNrZGVmVGVzdFNpbXBsZVRhc2suamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIueG1sIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL2FudGxpYi54bWwKaW5kZXggYjkyMGRhNy4uNDdiYjZhNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL2FudGxpYi54bWwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL2FudGxpYi54bWwKQEAgLTcsNyArNyw3IEBACiAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAKLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogCiAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIyLnhtbCBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90YXNrcy9hbnRsaWIyLnhtbAppbmRleCBiOTIwZGE3Li40N2JiNmE0IDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdGFza3MvYW50bGliMi54bWwKKysrIGIvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3Rhc2tzL2FudGxpYjIueG1sCkBAIC03LDcgKzcsNyBAQAogICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIAogICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdHlwZXMvVHlwZWRlZlRlc3RUeXBlLmphdmEgYi9zcmMvdGVzdHMvanVuaXQvb3JnL2V4YW1wbGUvdHlwZXMvVHlwZWRlZlRlc3RUeXBlLmphdmEKaW5kZXggYzAzMTQyMi4uMzY2MGIxNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2p1bml0L29yZy9leGFtcGxlL3R5cGVzL1R5cGVkZWZUZXN0VHlwZS5qYXZhCisrKyBiL3NyYy90ZXN0cy9qdW5pdC9vcmcvZXhhbXBsZS90eXBlcy9UeXBlZGVmVGVzdFR5cGUuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKZGlmZiAtLWdpdCBhL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMS1zaW1wbGUvYnVpbGQueG1sIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAxLXNpbXBsZS9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4OTZjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMS1zaW1wbGUvYnVpbGQueG1sCkBAIC0wLDAgKzEsNTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iSGVsbG9Xb3JsZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiICAgdmFsdWU9ImJ1aWxkIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgICAgIHZhbHVlPSIke2J1aWxkLmRpcn0vamFyIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFpbi1jbGFzcyIgIHZhbHVlPSJvYXRhLkhlbGxvV29ybGQiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICAgICAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtqYXIuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9IiR7bWFpbi1jbGFzc30iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxqYXZhIGphcj0iJHtqYXIuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgZm9yaz0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbi1idWlsZCIgZGVwZW5kcz0iY2xlYW4samFyIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLHJ1biIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAxLXNpbXBsZS9zcmMvb2F0YS9IZWxsb1dvcmxkLmphdmEKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpyZW5hbWUgdG8gc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAxLXNpbXBsZS9zcmMvb2F0YS9IZWxsb1dvcmxkLmphdmEKaW5kZXggOWQ2ZmNiYS4uMTdmMmQ5ZiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQorKysgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDEtc2ltcGxlL3NyYy9vYXRhL0hlbGxvV29ybGQuamF2YQpAQCAtNiw3ICs2LDcgQEAKICAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAogICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICoKICAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKQEAgLTE1LDExICsxNSwxMCBAQAogICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICoKICAqLwotLyoqCi0gKi8KLUBEaXN0cmlidXRlZCgKLSAgICAgICAgcHJvdG9jb2w9IkNPUkJBIiwKLSAgICAgICAgZGlzdHJpYnV0aW9uPURpc3RyaWJ1dGVkLkRpc3RyaWJ1dGlvblR5cGVzLkZFREVSQVRFRAotICAgICAgICApCi1wdWJsaWMgY2xhc3MgQXB0RXhhbXBsZSB7CitwYWNrYWdlIG9hdGE7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQiKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDItbG9nZ2luZy9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDItbG9nZ2luZy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NGFhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMi1sb2dnaW5nL2J1aWxkLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKworPCEtLQorICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IG5hbWU9IkhlbGxvV29ybGQiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9Im1haW4iPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiICAgICB2YWx1ZT0ic3JjIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYnVpbGQuZGlyIiAgIHZhbHVlPSJidWlsZCIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzLmRpciIgdmFsdWU9IiR7YnVpbGQuZGlyfS9jbGFzc2VzIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imphci5kaXIiICAgICB2YWx1ZT0iJHtidWlsZC5kaXJ9L2phciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJsaWIuZGlyIiAgICAgdmFsdWU9ImxpYiIvPgorCisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPHByb3BlcnR5IG5hbWU9Im1haW4tY2xhc3MiICB2YWx1ZT0ib2F0YS5IZWxsb1dvcmxkIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIiBiYXNlZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0iJHttYWluLWNsYXNzfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iamFyIj4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke21haW4tY2xhc3N9IiBmb3JrPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIGxvY2F0aW9uPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKyAgICAgICAgPC9qYXZhPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbi1idWlsZCIgZGVwZW5kcz0iY2xlYW4samFyIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLHJ1biIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAyLWxvZ2dpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjUlCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAyLWxvZ2dpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCmluZGV4IDlkNmZjYmEuLmIxNGY5OTkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEKKysrIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAyLWxvZ2dpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTUsMTEgKzE1LDE2IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICovCi0vKioKLSAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKK3BhY2thZ2Ugb2F0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouQmFzaWNDb25maWd1cmF0b3I7CisKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIHsKKyAgICBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZC5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIEJhc2ljQ29uZmlndXJhdG9yLmNvbmZpZ3VyZSgpOworICAgICAgICBsb2dnZXIuaW5mbygiSGVsbG8gV29ybGQiKTsgICAgICAgICAgLy8gdGhlIG9sZCBTeXN0ZW0ub3V0LXN0YXRlbWVudAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMy10ZXN0aW5nL2J1aWxkLnhtbCBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMy10ZXN0aW5nL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdhNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAzLXRlc3RpbmcvYnVpbGQueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorCis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iSGVsbG9Xb3JsZCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5kaXIiICAgdmFsdWU9ImJ1aWxkIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NsYXNzZXMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamFyLmRpciIgICAgIHZhbHVlPSIke2J1aWxkLmRpcn0vamFyIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImxpYi5kaXIiICAgICB2YWx1ZT0ibGliIi8+CisKKyAgICA8cGF0aCBpZD0iYXBwbGljYXRpb24iIGxvY2F0aW9uPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtsaWIuZGlyfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPHByb3BlcnR5IG5hbWU9Im1haW4tY2xhc3MiICB2YWx1ZT0ib2F0YS5IZWxsb1dvcmxkIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNsZWFuIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7YnVpbGQuZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjb21waWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgY2xhc3NwYXRocmVmPSJjbGFzc3BhdGgiLz4KKyAgICAgICAgPGNvcHkgdG9kaXI9IiR7Y2xhc3Nlcy5kaXJ9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgZXhjbHVkZXM9IioqLyouamF2YSIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgICAgIDxta2RpciBkaXI9IiR7amFyLmRpcn0iLz4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHtqYXIuZGlyfS8ke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iTWFpbi1DbGFzcyIgdmFsdWU9IiR7bWFpbi1jbGFzc30iLz4KKyAgICAgICAgICAgIDwvbWFuaWZlc3Q+CisgICAgICAgIDwvamFyPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxqYXZhIGNsYXNzbmFtZT0iJHttYWluLWNsYXNzfSIgZm9yaz0idHJ1ZSI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjbGFzc3BhdGgiLz4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iYXBwbGljYXRpb24iLz4KKyAgICAgICAgICAgIDwvY2xhc3NwYXRoPgorICAgICAgICA8L2phdmE+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0IiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKworICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLz4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbi1idWlsZCIgZGVwZW5kcz0iY2xlYW4samFyIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLHJ1biIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDMtdGVzdGluZy9zcmMvbG9nNGoucHJvcGVydGllcyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMy10ZXN0aW5nL3NyYy9sb2c0ai5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjAyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDMtdGVzdGluZy9zcmMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgc3Rkb3V0CisKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lbSVuCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAzLXRlc3Rpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzAlCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAzLXRlc3Rpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCmluZGV4IDlkNmZjYmEuLjNjMzRmMTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEKKysrIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAzLXRlc3Rpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTUsMTEgKzE1LDE0IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICovCi0vKioKLSAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKK3BhY2thZ2Ugb2F0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCB7CisgICAgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGQuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBsb2dnZXIuaW5mbygiSGVsbG8gV29ybGQiKTsgICAgICAgICAgLy8gdGhlIG9sZCBTeXN0ZW0ub3V0LXN0YXRlbWVudAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvMDMtdGVzdGluZy9zcmMvb2F0YS9IZWxsb1dvcmxkVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNzElCmNvcHkgZnJvbSBzcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCmNvcHkgdG8gc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkLzAzLXRlc3Rpbmcvc3JjL29hdGEvSGVsbG9Xb3JsZFRlc3QuamF2YQppbmRleCA5ZDZmY2JhLi5mYzhhMTAwIDEwMDY0NAotLS0gYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhCisrKyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC8wMy10ZXN0aW5nL3NyYy9vYXRhL0hlbGxvV29ybGRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNSwxMSArMTUsMjEgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKi8KLS8qKgotICovCi1ARGlzdHJpYnV0ZWQoCi0gICAgICAgIHByb3RvY29sPSJDT1JCQSIsCi0gICAgICAgIGRpc3RyaWJ1dGlvbj1EaXN0cmlidXRlZC5EaXN0cmlidXRpb25UeXBlcy5GRURFUkFURUQKLSAgICAgICAgKQotcHVibGljIGNsYXNzIEFwdEV4YW1wbGUgeworcGFja2FnZSBvYXRhOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxsQWx3YXlzRmFpbCgpIHsKKyAgICAgICAgZmFpbCgiQW4gZXJyb3IgbWVzc2FnZSIpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkL2ZpbmFsL2J1aWxkLnhtbCBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC9maW5hbC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYjlhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC9maW5hbC9idWlsZC54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJIZWxsb1dvcmxkIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KKworICAgIDxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiAgICAgdmFsdWU9InNyYyIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmRpciIgICB2YWx1ZT0iYnVpbGQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vY2xhc3NlcyIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqYXIuZGlyIiAgICAgdmFsdWU9IiR7YnVpbGQuZGlyfS9qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ibGliLmRpciIgICAgIHZhbHVlPSJsaWIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgIHZhbHVlPSIke2J1aWxkLmRpcn0vanVuaXRyZXBvcnQiLz4KKworICAgIDxwYXRoIGlkPSJhcHBsaWNhdGlvbiIgbG9jYXRpb249IiR7amFyLmRpcn0vJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoIj4KKyAgICAgICAgPGZpbGVzZXQgZGlyPSIke2xpYi5kaXJ9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ibWFpbi1jbGFzcyIgIHZhbHVlPSJvYXRhLkhlbGxvV29ybGQiLz4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtidWlsZC5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICAgICAgICA8amF2YWMgaW5jbHVkZWFudHJ1bnRpbWU9ImZhbHNlIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbGFzc3BhdGhyZWY9ImNsYXNzcGF0aCIvPgorICAgICAgICA8Y29weSB0b2Rpcj0iJHtjbGFzc2VzLmRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBleGNsdWRlcz0iKiovKi5qYXZhIi8+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqYXIuZGlyfSIvPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke2phci5kaXJ9LyR7YW50LnByb2plY3QubmFtZX0uamFyIiBiYXNlZGlyPSIke2NsYXNzZXMuZGlyfSI+CisgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJNYWluLUNsYXNzIiB2YWx1ZT0iJHttYWluLWNsYXNzfSIvPgorICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgPC9qYXI+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iamFyIj4KKyAgICAgICAgPGphdmEgY2xhc3NuYW1lPSIke21haW4tY2xhc3N9IiBmb3JrPSJ0cnVlIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aCIvPgorICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJhcHBsaWNhdGlvbiIvPgorICAgICAgICAgICAgPC9jbGFzc3BhdGg+CisgICAgICAgIDwvamF2YT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ianVuaXQiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxta2RpciBkaXI9IiR7cmVwb3J0LmRpcn0iLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiB0ZW1wZGlyPSIke2J1aWxkLmRpcn0iPgorICAgICAgICAgICAgPGNsYXNzcGF0aD4KKyAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoIi8+CisgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImFwcGxpY2F0aW9uIi8+CisgICAgICAgICAgICA8L2NsYXNzcGF0aD4KKworICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKworICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke3JlcG9ydC5kaXJ9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ianVuaXRyZXBvcnQiPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7cmVwb3J0LmRpcn0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3JlcG9ydC5kaXJ9IiBpbmNsdWRlcz0iVEVTVC0qLnhtbCIvPgorICAgICAgICAgICAgPHJlcG9ydCB0b2Rpcj0iJHtyZXBvcnQuZGlyfSIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbi1idWlsZCIgZGVwZW5kcz0iY2xlYW4samFyIi8+CisKKyAgICA8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLHJ1biIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvZmluYWwvc3JjL2xvZzRqLnByb3BlcnRpZXMgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvZmluYWwvc3JjL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMDJhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC9oZWxsby13b3JsZC9maW5hbC9zcmMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorbG9nNGoucm9vdExvZ2dlcj1ERUJVRywgc3Rkb3V0CisKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lbSVuCmRpZmYgLS1naXQgYS9zcmMvdGVzdHMvYW50dW5pdC90YXNrZGVmcy9hcHQvQXB0RXhhbXBsZS5qYXZhIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkL2ZpbmFsL3NyYy9vYXRhL0hlbGxvV29ybGQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcwJQpjb3B5IGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpjb3B5IHRvIHNyYy90dXRvcmlhbC9oZWxsby13b3JsZC9maW5hbC9zcmMvb2F0YS9IZWxsb1dvcmxkLmphdmEKaW5kZXggOWQ2ZmNiYS4uM2MzNGYxNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQorKysgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvZmluYWwvc3JjL29hdGEvSGVsbG9Xb3JsZC5qYXZhCkBAIC02LDcgKzYsNyBAQAogICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCiAgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAgKgogICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApAQCAtMTUsMTEgKzE1LDE0IEBACiAgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKgogICovCi0vKioKLSAqLwotQERpc3RyaWJ1dGVkKAotICAgICAgICBwcm90b2NvbD0iQ09SQkEiLAotICAgICAgICBkaXN0cmlidXRpb249RGlzdHJpYnV0ZWQuRGlzdHJpYnV0aW9uVHlwZXMuRkVERVJBVEVECi0gICAgICAgICkKLXB1YmxpYyBjbGFzcyBBcHRFeGFtcGxlIHsKK3BhY2thZ2Ugb2F0YTsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZCB7CisgICAgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGQuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICBsb2dnZXIuaW5mbygiSGVsbG8gV29ybGQiKTsgICAgICAgICAgLy8gdGhlIG9sZCBTeXN0ZW0ub3V0LXN0YXRlbWVudAorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEgYi9zcmMvdHV0b3JpYWwvaGVsbG8td29ybGQvZmluYWwvc3JjL29hdGEvSGVsbG9Xb3JsZFRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gc3JjL3Rlc3RzL2FudHVuaXQvdGFza2RlZnMvYXB0L0FwdEV4YW1wbGUuamF2YQpjb3B5IHRvIHNyYy90dXRvcmlhbC9oZWxsby13b3JsZC9maW5hbC9zcmMvb2F0YS9IZWxsb1dvcmxkVGVzdC5qYXZhCmluZGV4IDlkNmZjYmEuLmZjOGExMDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0cy9hbnR1bml0L3Rhc2tkZWZzL2FwdC9BcHRFeGFtcGxlLmphdmEKKysrIGIvc3JjL3R1dG9yaWFsL2hlbGxvLXdvcmxkL2ZpbmFsL3NyYy9vYXRhL0hlbGxvV29ybGRUZXN0LmphdmEKQEAgLTYsNyArNiw3IEBACiAgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKICAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCiAgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCkBAIC0xNSwxMSArMTUsMjEgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqCiAgKi8KLS8qKgotICovCi1ARGlzdHJpYnV0ZWQoCi0gICAgICAgIHByb3RvY29sPSJDT1JCQSIsCi0gICAgICAgIGRpc3RyaWJ1dGlvbj1EaXN0cmlidXRlZC5EaXN0cmlidXRpb25UeXBlcy5GRURFUkFURUQKLSAgICAgICAgKQotcHVibGljIGNsYXNzIEFwdEV4YW1wbGUgeworcGFja2FnZSBvYXRhOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90aGluZygpIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxsQWx3YXlzRmFpbCgpIHsKKyAgICAgICAgZmFpbCgiQW4gZXJyb3IgbWVzc2FnZSIpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDEtcHJvcGVydHlhY2Nlc3MvYnVpbGQueG1sIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDEtcHJvcGVydHlhY2Nlc3MvYnVpbGQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMTgxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMS1wcm9wZXJ0eWFjY2Vzcy9idWlsZC54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJGaW5kVGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdCI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJjbGFzc2VzIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnRlc3QubGliIiB2YWx1ZT0iYW50LXRlc3R1dGlsLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci54bWwiICB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC94bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci5odG1sIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC9odG1sIi8+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1biI+CisgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiPgorICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1biIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsYXNzcGF0aD0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249IkpBUnMgdGhlIFRhc2siIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLmluaXQiIGRlc2NyaXB0aW9uPSJUYXNrZGVmIHRoZSBGaW5kLVRhc2siIGRlcGVuZHM9ImphciI+CisgICAgICAgIDx0YXNrZGVmIG5hbWU9ImZpbmQiIGNsYXNzbmFtZT0iRmluZCIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2Uuc2ltcGxlIiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIHByb3BlcnR5PSJ0ZXN0IiB2YWx1ZT0idGVzdC12YWx1ZSIvPgorICAgICAgICA8ZmluZCBwcmludD0idGVzdCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIgLz4KKyAgICAgICAgPG1rZGlyICBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9IiAvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC50ZXN0Ii8+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvPgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0cmVwb3J0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgcmVwb3J0IGZvciB0aGUgcmVzdCByZXN1bHQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iIC8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiCisgICAgICAgICAgICBkZXBlbmRzPSJqdW5pdCxqdW5pdHJlcG9ydCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDEtcHJvcGVydHlhY2Nlc3Mvc3JjL0ZpbmQuamF2YSBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAxLXByb3BlcnR5YWNjZXNzL3NyYy9GaW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjNzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAxLXByb3BlcnR5YWNjZXNzL3NyYy9GaW5kLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworCitwdWJsaWMgY2xhc3MgRmluZCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJpbnQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJpbnQoU3RyaW5nIHByaW50KSB7CisgICAgICAgIHRoaXMucHJpbnQgPSBwcmludDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkgeworICAgICAgICBpZiAocHJpbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IGdldFByb2plY3QoKS5nZXRQcm9wZXJ0eShwcmludCk7CisgICAgICAgICAgICBsb2cocHJvcFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInByb3BlcnR5IG5vdCBzZXQiKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAgICA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInZhbHVlIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMS1wcm9wZXJ0eWFjY2Vzcy9zcmMvRmluZFRlc3QuamF2YSBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAxLXByb3BlcnR5YWNjZXNzL3NyYy9GaW5kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYTUzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMS1wcm9wZXJ0eWFjY2Vzcy9zcmMvRmluZFRlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRmlsZVJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEZpbmRUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIEJ1aWxkRmlsZVJ1bGUgcnVsZSA9IG5ldyBCdWlsZEZpbGVSdWxlKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJ1bGUuY29uZmlndXJlUHJvamVjdCgiYnVpbGQueG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlKCkgeworICAgICAgICBydWxlLmV4ZWN1dGVUYXJnZXQoInVzZS5zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LXZhbHVlIiwgcnVsZS5nZXRMb2coKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDItZmlsZXNldC9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMi1maWxlc2V0L2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTU3NWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDItZmlsZXNldC9idWlsZC54bWwKQEAgLTAsMCArMSwxMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHByb2plY3QgbmFtZT0iRmluZFRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QiPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiICAgICB2YWx1ZT0ic3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImFudC50ZXN0LmxpYiIgdmFsdWU9ImFudC10ZXN0dXRpbC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgICB2YWx1ZT0icmVwb3J0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0Lm91dC5kaXIueG1sIiAgdmFsdWU9IiR7cmVwb3J0LmRpcn0vanVuaXQveG1sIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0Lm91dC5kaXIuaHRtbCIgdmFsdWU9IiR7cmVwb3J0LmRpcn0vanVuaXQvaHRtbCIvPgorCisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aC5ydW4iPgorICAgICAgICA8cGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KKyAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aC50ZXN0Ij4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aC5ydW4iLz4KKyAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YW50LnRlc3QubGlifSIvPgorICAgIDwvcGF0aD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcyI+CisgICAgICAgIDxkZWxldGUgZmFpbG9uZXJyb3I9ImZhbHNlIiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cmVwb3J0LmRpcn0iLz4KKyAgICAgICAgPC9kZWxldGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayI+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgICAgIDxqYXZhYyBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbGFzc3BhdGg9IiR7YW50LnRlc3QubGlifSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJKQVJzIHRoZSBUYXNrIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InVzZS5pbml0IiBkZXNjcmlwdGlvbj0iVGFza2RlZiB0aGUgRmluZC1UYXNrIiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJmaW5kIiBjbGFzc25hbWU9IkZpbmQiIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLnNpbXBsZSIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgPC9maW5kPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZU5vdFByZXNlbnQiIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGZpbmQgZmlsZT0iYS1ub3QtZXhpc3RpbmctZmlsZS5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICA8L2ZpbmQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlUHJlc2VudCIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgPC9maW5kPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIgLz4KKyAgICAgICAgPG1rZGlyICBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9IiAvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC50ZXN0Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJhbnQuaG9tZSIgdmFsdWU9IiR7YW50LmhvbWV9Ii8+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvPgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0cmVwb3J0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgcmVwb3J0IGZvciB0aGUgcmVzdCByZXN1bHQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iIC8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9Im5vIiBoYWx0b25mYWlsdXJlPSJubyI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYW50LmhvbWUiIHZhbHVlPSIke2FudC5ob21lfSIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJicmllZiIgdXNlZmlsZT0iZmFsc2UiLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdDIiCisgICAgICAgICAgICBkZXBlbmRzPSJqdW5pdCxqdW5pdHJlcG9ydCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDItZmlsZXNldC9zcmMvRmluZC5qYXZhIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDItZmlsZXNldC9zcmMvRmluZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmFlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMi1maWxlc2V0L3NyYy9GaW5kLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLkZpbGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuRGlyZWN0b3J5U2Nhbm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5pby5GaWxlOworCitwdWJsaWMgY2xhc3MgRmluZCBleHRlbmRzIFRhc2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKKyAgICBwcml2YXRlIExpc3Q8RmlsZVNldD4gZmlsZXNldHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVzZXQoRmlsZVNldCBmaWxlc2V0KSB7CisgICAgICAgIGZpbGVzZXRzLmFkZChmaWxlc2V0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIG5vdCBzZXQiKTsKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibG9jYXRpb24gbm90IHNldCIpOworICAgICAgICBpZiAoZmlsZXNldHMuc2l6ZSgpIDwgMSkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlc2V0IG5vdCBzZXQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlMigpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgU3RyaW5nIGZvdW5kTG9jYXRpb24gPSBudWxsOworICAgICAgICBmb3IgKEZpbGVTZXQgZnMgOiBmaWxlc2V0cykgeworICAgICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBkcyA9IGZzLmdldERpcmVjdG9yeVNjYW5uZXIoZ2V0UHJvamVjdCgpKTsKKyAgICAgICAgICAgIEZpbGUgYmFzZSAgPSBkcy5nZXRCYXNlZGlyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlZEZpbGUgOiBkcy5nZXRJbmNsdWRlZEZpbGVzKCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBpbmNsdWRlZEZpbGUucmVwbGFjZSgnXFwnLCcvJyk7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZExvY2F0aW9uID09IG51bGwgJiYgZmlsZS5lcXVhbHMoZmlsZW5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgZm91bmQgPSBuZXcgRmlsZShiYXNlLCBpbmNsdWRlZEZpbGUpOworICAgICAgICAgICAgICAgICAgICBmb3VuZExvY2F0aW9uID0gZm91bmQuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZExvY2F0aW9uICE9IG51bGwpCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobG9jYXRpb24sIGZvdW5kTG9jYXRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDItZmlsZXNldC9zcmMvRmluZFRlc3QuamF2YSBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAyLWZpbGVzZXQvc3JjL0ZpbmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1YTc4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAyLWZpbGVzZXQvc3JjL0ZpbmRUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBGaW5kVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIHJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdHJpZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJ1bGUuY29uZmlndXJlUHJvamVjdCgiYnVpbGQueG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpbGUoKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImZpbGUgbm90IHNldCIpOworICAgICAgICBGaW5kIGZpbmQgPSBuZXcgRmluZCgpOworICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTG9jYXRpb24oKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImxvY2F0aW9uIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuZXhlY3V0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlc2V0KCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJmaWxlc2V0IG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuc2V0TG9jYXRpb24oImxvY2F0aW9uLmFudC1qYXIiKTsKKyAgICAgICAgZmluZC5leGVjdXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vdFByZXNlbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVOb3RQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBydWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROdWxsKCJQcm9wZXJ0eSBzZXQgdG8gd3JvbmcgdmFsdWUuIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlUHJlc2VudCgpIHsKKyAgICAgICAgcnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZVByZXNlbnQiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbi5hbnQtamFyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZmlsZSBmb3VuZC4iLCByZXN1bHQuZW5kc1dpdGgoImFudC5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMy1wYXRocy9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMy1wYXRocy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwMmMxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAzLXBhdGhzL2J1aWxkLnhtbApAQCAtMCwwICsxLDEyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJGaW5kVGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdCI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJjbGFzc2VzIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnRlc3QubGliIiB2YWx1ZT0iYW50LXRlc3R1dGlsLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci54bWwiICB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC94bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci5odG1sIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC9odG1sIi8+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1biI+CisgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiPgorICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1biIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsYXNzcGF0aD0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249IkpBUnMgdGhlIFRhc2siIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLmluaXQiIGRlc2NyaXB0aW9uPSJUYXNrZGVmIHRoZSBGaW5kLVRhc2siIGRlcGVuZHM9ImphciI+CisgICAgICAgIDx0YXNrZGVmIG5hbWU9ImZpbmQiIGNsYXNzbmFtZT0iRmluZCIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2Uuc2ltcGxlIiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIj4KKyAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZpbmQ+CisgICAgICAgIDxlY2hvPmFudC5qYXIgZm91bmQgb24gJHtsb2NhdGlvbi5hbnQtamFyfTwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVOb3RQcmVzZW50IiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIGZpbGU9ImEtbm90LWV4aXN0aW5nLWZpbGUuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPC9maW5kPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZVByZXNlbnQiIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGZpbmQgZmlsZT0iYW50LmphciIgbG9jYXRpb249ImxvY2F0aW9uLmFudC1qYXIiPgorICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgIDwvZmluZD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ianVuaXQiIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSB1bml0IHRlc3RzIiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iIC8+CisgICAgICAgIDxta2RpciAgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIgLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYW50LmhvbWUiIHZhbHVlPSIke2FudC5ob21lfSIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLz4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqdW5pdHJlcG9ydCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHJlcG9ydCBmb3IgdGhlIHJlc3QgcmVzdWx0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9IiAvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnhtbCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHJlcG9ydCBmb3JtYXQ9ImZyYW1lcyIgdG9kaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0IiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJubyIgaGFsdG9uZmFpbHVyZT0ibm8iPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoLnRlc3QiLz4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImFudC5ob21lIiB2YWx1ZT0iJHthbnQuaG9tZX0iLz4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0iYnJpZWYiIHVzZWZpbGU9ImZhbHNlIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InRydWUiIHRvZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvPgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QyIgorICAgICAgICAgICAgZGVwZW5kcz0ianVuaXQsanVuaXRyZXBvcnQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB1bml0IHRlc3RzIGFuZCBjcmVhdGVzIGEgcmVwb3J0Ii8+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzAzLXBhdGhzL3NyYy9GaW5kLmphdmEgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMy1wYXRocy9zcmMvRmluZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWEzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMy1wYXRocy9zcmMvRmluZC5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIEZpbmQgZXh0ZW5kcyBUYXNrIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247CisgICAgcHJpdmF0ZSBMaXN0PFBhdGg+IHBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoKFBhdGggcGF0aCkgeworICAgICAgICBwYXRocy5hZGQocGF0aCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoKSB7CisgICAgICAgIGlmIChmaWxlID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigiZmlsZSBub3Qgc2V0Iik7CisgICAgICAgIGlmIChsb2NhdGlvbiA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImxvY2F0aW9uIG5vdCBzZXQiKTsKKyAgICAgICAgaWYgKHBhdGhzLnNpemUoKSA8IDEpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0aCBub3Qgc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgU3RyaW5nIGZvdW5kTG9jYXRpb24gPSBudWxsOworICAgICAgICBmb3IgKFBhdGggcGF0aCA6IHBhdGhzKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBpbmNsdWRlZEZpbGUgOiBwYXRoLmxpc3QoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IGluY2x1ZGVkRmlsZS5yZXBsYWNlKCdcXCcsJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kTG9jYXRpb24gPT0gbnVsbCAmJiBmaWxlLmVxdWFscyhmaWxlbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRMb2NhdGlvbiA9IGluY2x1ZGVkRmlsZXNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZExvY2F0aW9uICE9IG51bGwpCisgICAgICAgICAgICBnZXRQcm9qZWN0KCkuc2V0TmV3UHJvcGVydHkobG9jYXRpb24sIGZvdW5kTG9jYXRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDMtcGF0aHMvc3JjL0ZpbmRUZXN0LmphdmEgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wMy1wYXRocy9zcmMvRmluZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTUxOGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDMtcGF0aHMvc3JjL0ZpbmRUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBGaW5kVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIHJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdHJpZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJ1bGUuY29uZmlndXJlUHJvamVjdCgiYnVpbGQueG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpbGUoKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImZpbGUgbm90IHNldCIpOworICAgICAgICBGaW5kIGZpbmQgPSBuZXcgRmluZCgpOworICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTG9jYXRpb24oKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImxvY2F0aW9uIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuZXhlY3V0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdQYXRoKCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJwYXRoIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuc2V0TG9jYXRpb24oImxvY2F0aW9uLmFudC1qYXIiKTsKKyAgICAgICAgZmluZC5leGVjdXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vdFByZXNlbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVOb3RQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBydWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROdWxsKCJQcm9wZXJ0eSBzZXQgdG8gd3JvbmcgdmFsdWUuIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlUHJlc2VudCgpIHsKKyAgICAgICAgcnVsZS5leGVjdXRlVGFyZ2V0KCJ0ZXN0RmlsZVByZXNlbnQiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbi5hbnQtamFyIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgZmlsZSBmb3VuZC4iLCByZXN1bHQuZW5kc1dpdGgoImFudC5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wNC1saXN0cy9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wNC1saXN0cy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmYjAzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzLzA0LWxpc3RzL2J1aWxkLnhtbApAQCAtMCwwICsxLDE3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJGaW5kVGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdCI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJjbGFzc2VzIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnRlc3QubGliIiB2YWx1ZT0iYW50LXRlc3R1dGlsLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci54bWwiICB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC94bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci5odG1sIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC9odG1sIi8+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1biI+CisgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiPgorICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1biIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIHNyY2Rpcj0iJHtzcmMuZGlyfSIgZGVzdGRpcj0iJHtjbGFzc2VzLmRpcn0iIGNsYXNzcGF0aD0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImphciIgZGVzY3JpcHRpb249IkpBUnMgdGhlIFRhc2siIGRlcGVuZHM9ImNvbXBpbGUiPgorICAgICAgICA8amFyIGRlc3RmaWxlPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIgYmFzZWRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLmluaXQiIGRlc2NyaXB0aW9uPSJUYXNrZGVmIHRoZSBGaW5kLVRhc2siIGRlcGVuZHM9ImphciI+CisgICAgICAgIDx0YXNrZGVmIG5hbWU9ImZpbmQiIGNsYXNzbmFtZT0iRmluZCIgY2xhc3NwYXRoPSIke2FudC5wcm9qZWN0Lm5hbWV9LmphciIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2Uuc2ltcGxlIiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIj4KKyAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iYzovc2V1IiBpbmNsdWRlcz0iYW50Ki8qKi8qLmphciIvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZpbmQ+CisgICAgICAgIDxlY2hvPmFudC5qYXIgZm91bmQgb24gJHtsb2NhdGlvbi5hbnQtamFyfTwvZWNobz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLnNpbXBsZTIiIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGZpbmQgZmlsZT0iYW50LmphciIgbG9jYXRpb249ImxvY2F0aW9uLmFudC1qYXIiIGRlbGltaXRlcj0iOyI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImM6L3NldSIgaW5jbHVkZXM9ImFudCovKiovKi5qYXIiLz4KKyAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPC9maW5kPgorICAgICAgICA8ZWNobz5hbnQuamFyIGZvdW5kIG9uICR7bG9jYXRpb24uYW50LWphcn08L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlTm90UHJlc2VudCIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8ZmluZCBmaWxlPSJhLW5vdC1leGlzdGluZy1maWxlLmphciIgbG9jYXRpb249ImxvY2F0aW9uLmFudC1qYXIiPgorICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgIDwvZmluZD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdEZpbGVQcmVzZW50IiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIj4KKyAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZpbmQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QuaW5pdCI+CisgICAgICAgIDxta2RpciBkaXI9InRlc3QxL2RpcjExL2RpcjExMSIvPgorICAgICAgICA8bWtkaXIgZGlyPSJ0ZXN0MS9kaXIxMS9kaXIxMTIiLz4KKyAgICAgICAgPG1rZGlyIGRpcj0idGVzdDEvZGlyMTIvIi8+CisgICAgICAgIDxta2RpciBkaXI9InRlc3QxL2RpcjEzL2RpcjEzMSIvPgorICAgICAgICA8bWtkaXIgZGlyPSJ0ZXN0MS9kaXIxMy9kaXIxMzIiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjExL2RpcjExMS90ZXN0Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTEvbm90Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTEvbm90MiIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTEvZGlyMTEyL3Rlc3QiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjExL2RpcjExMi9ub3QiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjExL2RpcjExMi9ub3QyIi8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMi90ZXN0Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMi9ub3QiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjEyL25vdDIiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjEzL2RpcjEzMS90ZXN0Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzEvbm90Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzEvbm90MiIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTMvZGlyMTMyL3Rlc3QiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjEzL2RpcjEzMi9ub3QiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjEzL2RpcjEzMi9ub3QyIi8+CisgICAgICAgIDxta2RpciBkaXI9InRlc3QyIi8+CisgICAgICAgIDxjb3B5IHRvZGlyPSJ0ZXN0MiI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QxIi8+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdE11bHRpcGxlRmlsZXMiIGRlcGVuZHM9InVzZS5pbml0LHRlc3QuaW5pdCI+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTEvdGVzdCIvPgorICAgICAgICA8ZmluZCBmaWxlPSJ0ZXN0IiBsb2NhdGlvbj0ibG9jYXRpb24udGVzdCIgZGVsaW1pdGVyPSI7Ij4KKyAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdDEiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QyIi8+CisgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgIDwvZmluZD4KKyAgICAgICAgPGRlbGV0ZT4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdDEiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0idGVzdDIiLz4KKyAgICAgICAgPC9kZWxldGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0IiBkZXNjcmlwdGlvbj0iUnVucyB0aGUgdW5pdCB0ZXN0cyIgZGVwZW5kcz0iamFyIj4KKyAgICAgICAgPGRlbGV0ZSBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9IiAvPgorICAgICAgICA8bWtkaXIgIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iIC8+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9InllcyIgaGFsdG9uZmFpbHVyZT0ibm8iPgorICAgICAgICAgICAgPGNsYXNzcGF0aCByZWZpZD0iY2xhc3NwYXRoLnRlc3QiLz4KKyAgICAgICAgICAgIDxzeXNwcm9wZXJ0eSBrZXk9ImFudC5ob21lIiB2YWx1ZT0iJHthbnQuaG9tZX0iLz4KKyAgICAgICAgICAgIDxmb3JtYXR0ZXIgdHlwZT0ieG1sIi8+CisgICAgICAgICAgICA8YmF0Y2h0ZXN0IGZvcms9InllcyIgdG9kaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0ianVuaXRyZXBvcnQiIGRlc2NyaXB0aW9uPSJDcmVhdGUgYSByZXBvcnQgZm9yIHRoZSByZXN0IHJlc3VsdCI+CisgICAgICAgIDxta2RpciBkaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSIgLz4KKyAgICAgICAgPGp1bml0cmVwb3J0IHRvZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSI+CisgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iKi54bWwiLz4KKyAgICAgICAgICAgIDwvZmlsZXNldD4KKyAgICAgICAgICAgIDxyZXBvcnQgZm9ybWF0PSJmcmFtZXMiIHRvZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iLz4KKyAgICAgICAgPC9qdW5pdHJlcG9ydD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iamFyIj4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ibm8iIGhhbHRvbmZhaWx1cmU9Im5vIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC50ZXN0Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJhbnQuaG9tZSIgdmFsdWU9IiR7YW50LmhvbWV9Ii8+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9ImJyaWVmIiB1c2VmaWxlPSJmYWxzZSIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ0cnVlIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLz4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0MiIKKyAgICAgICAgICAgIGRlcGVuZHM9Imp1bml0LGp1bml0cmVwb3J0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlJ1bnMgdW5pdCB0ZXN0cyBhbmQgY3JlYXRlcyBhIHJlcG9ydCIvPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wNC1saXN0cy9zcmMvRmluZC5qYXZhIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDQtbGlzdHMvc3JjL0ZpbmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjg5ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDQtbGlzdHMvc3JjL0ZpbmQuamF2YQpAQCAtMCwwICsxLDk2IEBACisvKgorICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICogIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICogIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICogICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgKiAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqLworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBGaW5kIGV4dGVuZHMgVGFzayB7CisKKyAgICAvLyA9PT09PSAgaW50ZXJuYWwgYXR0cmlidXRlcyAgPT09PT0KKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZvdW5kRmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8vID09PT09ICBhdHRyaWJ1dGUgc3VwcG9ydCAgPT09PT0KKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247CisgICAgcHJpdmF0ZSBMaXN0PFBhdGg+IHBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyID0gbnVsbDsKKworICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoU3RyaW5nIGZpbGUpIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKKyAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFBhdGgoUGF0aCBwYXRoKSB7CisgICAgICAgIHBhdGhzLmFkZChwYXRoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWxpbWl0ZXIoU3RyaW5nIGRlbGltKSB7CisgICAgICAgIGRlbGltaXRlciA9IGRlbGltOworICAgIH0KKworICAgIC8vID09PT09ICB0aGUgdGFza3Mgd29yayAgPT09PT0KKworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgeworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oImZpbGUgbm90IHNldCIpOworICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJsb2NhdGlvbiBub3Qgc2V0Iik7CisgICAgICAgIGlmIChwYXRocy5pc0VtcHR5KCkpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigicGF0aCBub3Qgc2V0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKyAgICAgICAgdmFsaWRhdGUoKTsKKyAgICAgICAgZm9yIChQYXRoIHBhdGggOiBwYXRocykgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaW5jbHVkZWRGaWxlIDogcGF0aC5saXN0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBpbmNsdWRlZEZpbGUucmVwbGFjZSgnXFwnLCcvJyk7CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpOworICAgICAgICAgICAgICAgIGlmIChmaWxlLmVxdWFscyhmaWxlbmFtZSkgJiYgIWZvdW5kRmlsZXMuY29udGFpbnMoaW5jbHVkZWRGaWxlKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZEZpbGVzLmFkZChpbmNsdWRlZEZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcnYgPSBudWxsOworICAgICAgICBpZiAoIWZvdW5kRmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIHJ2ID0gZm91bmRGaWxlcy5nZXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBsaXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZm91bmRGaWxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGRlbGltaXRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJ2ID0gbGlzdC50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZiAocnYgIT0gbnVsbCkKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShsb2NhdGlvbiwgcnYpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDQtbGlzdHMvc3JjL0ZpbmRUZXN0LmphdmEgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy8wNC1saXN0cy9zcmMvRmluZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTQ5NDkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvMDQtbGlzdHMvc3JjL0ZpbmRUZXN0LmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEZpbGVSdWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBGaW5kVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBCdWlsZEZpbGVSdWxlIHJ1bGUgPSBuZXcgQnVpbGRGaWxlUnVsZSgpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdHJpZWQgPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHJ1bGUuY29uZmlndXJlUHJvamVjdCgiYnVpbGQueG1sIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0ZpbGUoKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImZpbGUgbm90IHNldCIpOworICAgICAgICBGaW5kIGZpbmQgPSBuZXcgRmluZCgpOworICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTG9jYXRpb24oKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoImxvY2F0aW9uIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuZXhlY3V0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdQYXRoKCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJwYXRoIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5zZXRGaWxlKCJhbnQuamFyIik7CisgICAgICAgIGZpbmQuc2V0TG9jYXRpb24oImxvY2F0aW9uLmFudC1qYXIiKTsKKyAgICAgICAgZmluZC5leGVjdXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5vdFByZXNlbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVOb3RQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBydWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROdWxsKCJQcm9wZXJ0eSBzZXQgdG8gd3JvbmcgdmFsdWUuIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVByZXNlbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBydWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJQcm9wZXJ0eSBub3Qgc2V0LiIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIGZpbGUgZm91bmQuIiwgcmVzdWx0LmVuZHNXaXRoKCJhbnQuamFyIikpOworICAgIH0KKworCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXMoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE11bHRpcGxlRmlsZXMiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbi50ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT25seSBvbmUgZmlsZSBmb3VuZC4iLCByZXN1bHQuY29udGFpbnMoIjsiKSk7CisgICAgICAgIC8vYXNzZXJ0VHJ1ZSgiV3JvbmcgZmlsZSBmb3VuZC4iLCByZXN1bHQuZW5kc1dpdGgoImFudC5qYXIiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy9maW5hbC9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy9maW5hbC9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2ZDc5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzL2ZpbmFsL2J1aWxkLnhtbApAQCAtMCwwICsxLDE3NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJGaW5kVGFzayIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdCI+CisKKyAgICA8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgICAgIHZhbHVlPSJzcmMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3Nlcy5kaXIiIHZhbHVlPSJjbGFzc2VzIi8+CisKKyAgICA8cHJvcGVydHkgbmFtZT0iYW50LnRlc3QubGliIiB2YWx1ZT0iYW50LXRlc3R1dGlsLmphciIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJyZXBvcnQuZGlyIiAgIHZhbHVlPSJyZXBvcnQiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci54bWwiICB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC94bWwiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0ianVuaXQub3V0LmRpci5odG1sIiB2YWx1ZT0iJHtyZXBvcnQuZGlyfS9qdW5pdC9odG1sIi8+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnJ1biI+CisgICAgICAgIDxwYXRoIHBhdGg9IiR7amF2YS5jbGFzcy5wYXRofSIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3BhdGg+CisKKyAgICA8cGF0aCBpZD0iY2xhc3NwYXRoLnRlc3QiPgorICAgICAgICA8cGF0aCByZWZpZD0iY2xhc3NwYXRoLnJ1biIvPgorICAgICAgICA8cGF0aCBsb2NhdGlvbj0iJHthbnQudGVzdC5saWJ9Ii8+CisgICAgPC9wYXRoPgorCisgICAgPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVzY3JpcHRpb249IkRlbGV0ZSBhbGwgZ2VuZXJhdGVkIGZpbGVzIj4KKyAgICAgICAgPGRlbGV0ZSBmYWlsb25lcnJvcj0iZmFsc2UiIGluY2x1ZGVFbXB0eURpcnM9InRydWUiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIuIiBpbmNsdWRlcz0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtyZXBvcnQuZGlyfSIvPgorICAgICAgICA8L2RlbGV0ZT4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iY29tcGlsZSIgZGVzY3JpcHRpb249IkNvbXBpbGVzIHRoZSBUYXNrIj4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtjbGFzc2VzLmRpcn0iLz4KKyAgICAgICAgPGphdmFjIGluY2x1ZGVhbnRydW50aW1lPSJ0cnVlIiBzcmNkaXI9IiR7c3JjLmRpcn0iIGRlc3RkaXI9IiR7Y2xhc3Nlcy5kaXJ9IiBjbGFzc3BhdGg9IiR7YW50LnRlc3QubGlifSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqYXIiIGRlc2NyaXB0aW9uPSJKQVJzIHRoZSBUYXNrIiBkZXBlbmRzPSJjb21waWxlIj4KKyAgICAgICAgPGphciBkZXN0ZmlsZT0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiIGJhc2VkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InVzZS5pbml0IiBkZXNjcmlwdGlvbj0iVGFza2RlZiB0aGUgRmluZC1UYXNrIiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJmaW5kIiBjbGFzc25hbWU9IkZpbmQiIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idXNlLnNpbXBsZSIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9ImM6L3NldSIgaW5jbHVkZXM9ImFudCovKiovKi5qYXIiLz4KKyAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPC9maW5kPgorICAgICAgICA8ZWNobz5hbnQuamFyIGZvdW5kIG9uICR7bG9jYXRpb24uYW50LWphcn08L2VjaG8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InVzZS5zaW1wbGUyIiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIiBkZWxpbWl0ZXI9IjsiPgorICAgICAgICAgICAgPHBhdGg+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2FudC5ob21lfSIgaW5jbHVkZXM9IioqLyouamFyIi8+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJjOi9zZXUiIGluY2x1ZGVzPSJhbnQqLyoqLyouamFyIi8+CisgICAgICAgICAgICA8L3BhdGg+CisgICAgICAgIDwvZmluZD4KKyAgICAgICAgPGVjaG8+YW50LmphciBmb3VuZCBvbiAke2xvY2F0aW9uLmFudC1qYXJ9PC9lY2hvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0RmlsZU5vdFByZXNlbnQiIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGZpbmQgZmlsZT0iYS1ub3QtZXhpc3RpbmctZmlsZS5qYXIiIGxvY2F0aW9uPSJsb2NhdGlvbi5hbnQtamFyIj4KKyAgICAgICAgICAgIDxwYXRoPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0iIGluY2x1ZGVzPSIqKi8qLmphciIvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZpbmQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RGaWxlUHJlc2VudCIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jYXRpb24uYW50LWphciI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgICAgICAgIDwvcGF0aD4KKyAgICAgICAgPC9maW5kPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0LmluaXQiPgorICAgICAgICA8bWtkaXIgZGlyPSJ0ZXN0MS9kaXIxMS9kaXIxMTEiLz4KKyAgICAgICAgPG1rZGlyIGRpcj0idGVzdDEvZGlyMTEvZGlyMTEyIi8+CisgICAgICAgIDxta2RpciBkaXI9InRlc3QxL2RpcjEyLyIvPgorICAgICAgICA8bWtkaXIgZGlyPSJ0ZXN0MS9kaXIxMy9kaXIxMzEiLz4KKyAgICAgICAgPG1rZGlyIGRpcj0idGVzdDEvZGlyMTMvZGlyMTMyIi8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTEvdGVzdCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTEvZGlyMTExL25vdCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTEvZGlyMTExL25vdDIiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjExL2RpcjExMi90ZXN0Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTIvbm90Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMS9kaXIxMTIvbm90MiIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTIvdGVzdCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTIvbm90Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMi9ub3QyIi8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzEvdGVzdCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTMvZGlyMTMxL25vdCIvPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTMvZGlyMTMxL25vdDIiLz4KKyAgICAgICAgPHRvdWNoIGZpbGU9InRlc3QxL2RpcjEzL2RpcjEzMi90ZXN0Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzIvbm90Ii8+CisgICAgICAgIDx0b3VjaCBmaWxlPSJ0ZXN0MS9kaXIxMy9kaXIxMzIvbm90MiIvPgorICAgICAgICA8bWtkaXIgZGlyPSJ0ZXN0MiIvPgorICAgICAgICA8Y29weSB0b2Rpcj0idGVzdDIiPgorICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0MSIvPgorICAgICAgICA8L2NvcHk+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3RNdWx0aXBsZUZpbGVzIiBkZXBlbmRzPSJ1c2UuaW5pdCx0ZXN0LmluaXQiPgorICAgICAgICA8dG91Y2ggZmlsZT0idGVzdDEvZGlyMTEvZGlyMTExL3Rlc3QiLz4KKyAgICAgICAgPGZpbmQgZmlsZT0idGVzdCIgbG9jYXRpb249ImxvY2F0aW9uLnRlc3QiIGRlbGltaXRlcj0iOyI+CisgICAgICAgICAgICA8cGF0aD4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QxIi8+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJ0ZXN0MiIvPgorICAgICAgICAgICAgPC9wYXRoPgorICAgICAgICA8L2ZpbmQ+CisgICAgICAgIDxkZWxldGU+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QxIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9InRlc3QyIi8+CisgICAgICAgIDwvZGVsZXRlPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqdW5pdCIgZGVzY3JpcHRpb249IlJ1bnMgdGhlIHVuaXQgdGVzdHMiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxkZWxldGUgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIgLz4KKyAgICAgICAgPG1rZGlyICBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9IiAvPgorICAgICAgICA8anVuaXQgcHJpbnRzdW1tYXJ5PSJ5ZXMiIGhhbHRvbmZhaWx1cmU9Im5vIj4KKyAgICAgICAgICAgIDxjbGFzc3BhdGggcmVmaWQ9ImNsYXNzcGF0aC50ZXN0Ii8+CisgICAgICAgICAgICA8c3lzcHJvcGVydHkga2V5PSJhbnQuaG9tZSIgdmFsdWU9IiR7YW50LmhvbWV9Ii8+CisgICAgICAgICAgICA8Zm9ybWF0dGVyIHR5cGU9InhtbCIvPgorICAgICAgICAgICAgPGJhdGNodGVzdCBmb3JrPSJ5ZXMiIHRvZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSI+CisgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBpbmNsdWRlcz0iKiovKlRlc3QuamF2YSIvPgorICAgICAgICAgICAgPC9iYXRjaHRlc3Q+CisgICAgICAgIDwvanVuaXQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9Imp1bml0cmVwb3J0IiBkZXNjcmlwdGlvbj0iQ3JlYXRlIGEgcmVwb3J0IGZvciB0aGUgcmVzdCByZXN1bHQiPgorICAgICAgICA8bWtkaXIgZGlyPSIke2p1bml0Lm91dC5kaXIuaHRtbH0iIC8+CisgICAgICAgIDxqdW5pdHJlcG9ydCB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ij4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioueG1sIi8+CisgICAgICAgICAgICA8L2ZpbGVzZXQ+CisgICAgICAgICAgICA8cmVwb3J0IGZvcm1hdD0iZnJhbWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9Ii8+CisgICAgICAgIDwvanVuaXRyZXBvcnQ+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InRlc3QiIGRlcGVuZHM9ImphciI+CisgICAgICAgIDxqdW5pdCBwcmludHN1bW1hcnk9Im5vIiBoYWx0b25mYWlsdXJlPSJubyI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvPgorICAgICAgICAgICAgPHN5c3Byb3BlcnR5IGtleT0iYW50LmhvbWUiIHZhbHVlPSIke2FudC5ob21lfSIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJicmllZiIgdXNlZmlsZT0iZmFsc2UiLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0idHJ1ZSIgdG9kaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0iIGluY2x1ZGVzPSIqKi8qVGVzdC5qYXZhIi8+CisgICAgICAgICAgICA8L2JhdGNodGVzdD4KKyAgICAgICAgPC9qdW5pdD4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0idGVzdDIiCisgICAgICAgICAgICBkZXBlbmRzPSJqdW5pdCxqdW5pdHJlcG9ydCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJSdW5zIHVuaXQgdGVzdHMgYW5kIGNyZWF0ZXMgYSByZXBvcnQiLz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvZmluYWwvZmluZC5odG1sIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvZmluYWwvZmluZC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNzEyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy9maW5hbC9maW5kLmh0bWwKQEAgLTAsMCArMSw4NCBAQAorPCFET0NUWVBFIGh0bWw+Cis8IS0tCisgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGh0bWwgbGFuZz0iZW4iPgorCis8aGVhZD4KKzx0aXRsZT4gRmluZCBUYXNrPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMiBpZD0iZmluZCI+RmluZDwvaDI+Cis8aDM+RGVzY3JpcHRpb248L2gzPgorPHA+U2VhcmNoZXMgaW4gYSBnaXZlbiBwYXRoIGZvciBhIGZpbGUgYW5kIHJldHVybnMgdGhlIGFic29sdXRlIHRvIGl0IGFzIHByb3BlcnR5LgorSWYgZGVsaW1pdGVyIGlzIHNldCB0aGlzIHRhc2sgcmV0dXJucyBhbGwgZm91bmQgbG9jYXRpb25zLjwvcD4KKworPGgzPlBhcmFtZXRlcnM8L2gzPgorPHRhYmxlIGNsYXNzPSJhdHRyIj4KKyAgPHRyPgorICAgIDx0aCBzY29wZT0iY29sIj5BdHRyaWJ1dGU8L3RoPgorICAgIDx0aCBzY29wZT0iY29sIj5EZXNjcmlwdGlvbjwvdGg+CisgICAgPHRoIHNjb3BlPSJjb2wiPlJlcXVpcmVkPC90aD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5maWxlPC90ZD4KKyAgICA8dGQ+VGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gc2VhcmNoLjwvdGQ+CisgICAgPHRkPnllczwvdGQ+CisgIDwvdHI+CisgIDx0cj4KKyAgICA8dGQ+bG9jYXRpb248L3RkPgorICAgIDx0ZD5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgd2hlcmUgdG8gc3RvcmUgdGhlIGxvY2F0aW9uPC90ZD4KKyAgICA8dGQ+eWVzPC90ZD4KKyAgPC90cj4KKyAgPHRyPgorICAgIDx0ZD5kZWxpbWl0ZXI8L3RkPgorICAgIDx0ZD5BIGRlbGltaXRlciB0byB1c2Ugd2hlbiByZXR1cm5pbmcgdGhlIGxpc3Q8L3RkPgorICAgIDx0ZD5vbmx5IGlmIHRoZSBsaXN0IGlzIHJlcXVpcmVkPC90ZD4KKyAgPC90cj4KKzwvdGFibGU+CisKKzxoMz5QYXJhbWV0ZXJzIHNwZWNpZmllZCBhcyBuZXN0ZWQgZWxlbWVudHM8L2gzPgorCis8aDQ+cGF0aDwvaDQ+Cis8cD5UaGUgcGF0aCB3aGVyZSB0byBzZWFyY2ggdGhlIGZpbGUuPC9wPgorCis8aDM+RXhhbXBsZXM8L2gzPgorPHByZT4KKyAgICAmbHQ7ZmluZCBmaWxlPSJhbnQuamFyIiBsb2NhdGlvbj0ibG9jIj4KKyAgICAgICAgJmx0O3BhdGg+CisgICAgICAgICAgICAmbHQ7ZmlsZXNldCBkaXI9IiR7YW50LmhvbWV9Ii8+CisgICAgICAgICZsdDtwYXRoPgorICAgICZsdDsvZmluZD4KKzwvcHJlPgorU2VhcmNoZXMgaW4gQW50IGhvbWUgZGlyZWN0b3J5IGZvciBhIGZpbGUgPHNhbXA+YW50Lmphcjwvc2FtcD4gYW5kIHN0b3JlcyBpdHMgbG9jYXRpb24gaW4KK3Byb3BlcnR5IDxzYW1wPmxvYzwvc2FtcD4gKHNob3VsZCBiZSA8c2FtcD5BTlRfSE9NRS9iaW4vYW50Lmphcjwvc2FtcD4pLgorCis8cHJlPgorICAgICZsdDtmaW5kIGZpbGU9ImFudC5qYXIiIGxvY2F0aW9uPSJsb2MiIGRlbGltaXRlcj0iOyI+CisgICAgICAgICZsdDtwYXRoPgorICAgICAgICAgICAgJmx0O2ZpbGVzZXQgZGlyPSJDOi8iLz4KKyAgICAgICAgJmx0O3BhdGg+CisgICAgJmx0Oy9maW5kPgorICAgICZsdDtlY2hvPmFudC5qYXIgZm91bmQgaW46ICR7bG9jfSZsdDsvZWNobz4KKzwvcHJlPgorU2VhcmNoZXMgaW4gV2luZG93cyA8c2FtcD5DOjwvc2FtcD4gZHJpdmUgZm9yIGFsbCA8c2FtcD5hbnQuamFyPC9zYW1wPiBhbmQgc3RvcmVzIHRoZWlyIGxvY2F0aW9ucyBpbgorcHJvcGVydHkgPHNhbXA+bG9jPC9zYW1wPiBkZWxpbWl0ZWQgd2l0aCA8cT47PC9xPi4gKHNob3VsZCBuZWVkIGEgbG9uZyB0aW1lIDotKQorQWZ0ZXIgdGhhdCBpdCBwcmludHMgb3V0IHRoZSByZXN1bHQgKGUuZy4gPHNhbXA+QzovYW50LTEuNS40L2Jpbi9hbnQuamFyO0M6L2FudC0xLjYvYmluL2FudC5qYXI8L3NhbXA+KS4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvZmluYWwvc3JjL0ZpbmQuamF2YSBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzL2ZpbmFsL3NyYy9GaW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmMWNmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1maWxlc2V0cy1wcm9wZXJ0aWVzL2ZpbmFsL3NyYy9GaW5kLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCisvL3BhY2thZ2Ugb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLlBhdGg7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgY2xhc3MgRmluZCBleHRlbmRzIFRhc2sgeworCisgICAgLy8gPT09PT0gIGludGVybmFsIGF0dHJpYnV0ZXMgID09PT09CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBmb3VuZEZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAvLyA9PT09PSAgYXR0cmlidXRlIHN1cHBvcnQgID09PT09CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlOworICAgIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOworICAgIHByaXZhdGUgTGlzdDxQYXRoPiBwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgU3RyaW5nIGRlbGltaXRlciA9IG51bGw7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKSB7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7CisgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoKFBhdGggcGF0aCkgeworICAgICAgICBwYXRocy5hZGQocGF0aCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVsaW1pdGVyKFN0cmluZyBkZWxpbSkgeworICAgICAgICBkZWxpbWl0ZXIgPSBkZWxpbTsKKyAgICB9CisKKyAgICAvLyA9PT09PSAgdGhlIHRhc2tzIHdvcmsgID09PT09CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkgdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJmaWxlIG5vdCBzZXQiKTsKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwpIHRocm93IG5ldyBCdWlsZEV4Y2VwdGlvbigibG9jYXRpb24gbm90IHNldCIpOworICAgICAgICBpZiAocGF0aHMuaXNFbXB0eSgpKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oInBhdGggbm90IHNldCIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIHZhbGlkYXRlKCk7CisgICAgICAgIC8vIGZpbmQgYWxsIGZpbGVzCisgICAgICAgIGZvciAoUGF0aCBwYXRoIDogcGF0aHMpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGluY2x1ZGVkRmlsZSA6IHBhdGgubGlzdCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gaW5jbHVkZWRGaWxlLnJlcGxhY2UoJ1xcJywgJy8nKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZS5sYXN0SW5kZXhPZigiLyIpICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXF1YWxzKGZpbGVuYW1lKSAmJiAhZm91bmRGaWxlcy5jb250YWlucyhpbmNsdWRlZEZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kRmlsZXMuYWRkKGluY2x1ZGVkRmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSByZXR1cm4gdmFsdWUgKGxpc3Qvc2luZ2xlKQorICAgICAgICBTdHJpbmcgcnYgPSBudWxsOworICAgICAgICBpZiAoIWZvdW5kRmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoZGVsaW1pdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBvbmx5IHRoZSBmaXJzdAorICAgICAgICAgICAgICAgIHJ2ID0gZm91bmRGaWxlcy5nZXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBsaXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlIDogZm91bmRGaWxlcykgeworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGRlbGltaXRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJ2ID0gbGlzdC50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBwcm9wZXJ0eQorICAgICAgICBpZiAocnYgIT0gbnVsbCkKKyAgICAgICAgICAgIGdldFByb2plY3QoKS5zZXROZXdQcm9wZXJ0eShsb2NhdGlvbiwgcnYpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvZmluYWwvc3JjL0ZpbmRUZXN0LmphdmEgYi9zcmMvdHV0b3JpYWwvdGFza3MtZmlsZXNldHMtcHJvcGVydGllcy9maW5hbC9zcmMvRmluZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUyZTljCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLWZpbGVzZXRzLXByb3BlcnRpZXMvZmluYWwvc3JjL0ZpbmRUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKi8KKworLy9wYWNrYWdlIG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzOworCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgRmluZFRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBydWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRyaWVkID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBydWxlLmNvbmZpZ3VyZVByb2plY3QoImJ1aWxkLnhtbCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWxlKCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJmaWxlIG5vdCBzZXQiKTsKKyAgICAgICAgRmluZCBmaW5kID0gbmV3IEZpbmQoKTsKKyAgICAgICAgZmluZC5leGVjdXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0xvY2F0aW9uKCkgeworICAgICAgICB0cmllZC5leHBlY3QoQnVpbGRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0cmllZC5leHBlY3RNZXNzYWdlKCJsb2NhdGlvbiBub3Qgc2V0Iik7CisgICAgICAgIEZpbmQgZmluZCA9IG5ldyBGaW5kKCk7CisgICAgICAgIGZpbmQuc2V0RmlsZSgiYW50LmphciIpOworICAgICAgICBmaW5kLmV4ZWN1dGUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUGF0aCgpIHsKKyAgICAgICAgdHJpZWQuZXhwZWN0KEJ1aWxkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgdHJpZWQuZXhwZWN0TWVzc2FnZSgicGF0aCBub3Qgc2V0Iik7CisgICAgICAgIEZpbmQgZmluZCA9IG5ldyBGaW5kKCk7CisgICAgICAgIGZpbmQuc2V0RmlsZSgiYW50LmphciIpOworICAgICAgICBmaW5kLnNldExvY2F0aW9uKCJsb2NhdGlvbi5hbnQtamFyIik7CisgICAgICAgIGZpbmQuZXhlY3V0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVOb3RQcmVzZW50KCkgeworICAgICAgICBydWxlLmV4ZWN1dGVUYXJnZXQoInRlc3RGaWxlTm90UHJlc2VudCIpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gcnVsZS5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydHkoImxvY2F0aW9uLmFudC1qYXIiKTsKKyAgICAgICAgYXNzZXJ0TnVsbCgiUHJvcGVydHkgc2V0IHRvIHdyb25nIHZhbHVlLiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVByZXNlbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdEZpbGVQcmVzZW50Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBydWxlLmdldFByb2plY3QoKS5nZXRQcm9wZXJ0eSgibG9jYXRpb24uYW50LWphciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJQcm9wZXJ0eSBub3Qgc2V0LiIsIHJlc3VsdCk7CisgICAgICAgIGFzc2VydFRydWUoIldyb25nIGZpbGUgZm91bmQuIiwgcmVzdWx0LmVuZHNXaXRoKCJhbnQuamFyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXMoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidGVzdE11bHRpcGxlRmlsZXMiKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJ1bGUuZ2V0UHJvamVjdCgpLmdldFByb3BlcnR5KCJsb2NhdGlvbi50ZXN0Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlByb3BlcnR5IG5vdCBzZXQuIiwgcmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiT25seSBvbmUgZmlsZSBmb3VuZC4iLCByZXN1bHQuY29udGFpbnMoIjsiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdHV0b3JpYWwvdGFza3Mtc3RhcnQtd3JpdGluZy9idWlsZC54bWwgYi9zcmMvdHV0b3JpYWwvdGFza3Mtc3RhcnQtd3JpdGluZy9idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2OGIwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1zdGFydC13cml0aW5nL2J1aWxkLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKyAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCBuYW1lPSJNeVRhc2siIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QiPgorCisgICAgPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiICAgICB2YWx1ZT0ic3JjIi8+CisgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZXMuZGlyIiB2YWx1ZT0iY2xhc3NlcyIvPgorCisgICAgPHByb3BlcnR5IG5hbWU9ImFudC50ZXN0LmxpYiIgdmFsdWU9ImFudC10ZXN0dXRpbC5qYXIiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0icmVwb3J0LmRpciIgICB2YWx1ZT0icmVwb3J0Ii8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0Lm91dC5kaXIueG1sIiAgdmFsdWU9IiR7cmVwb3J0LmRpcn0vanVuaXQveG1sIi8+CisgICAgPHByb3BlcnR5IG5hbWU9Imp1bml0Lm91dC5kaXIuaHRtbCIgdmFsdWU9IiR7cmVwb3J0LmRpcn0vanVuaXQvaHRtbCIvPgorCisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aC5ydW4iPgorICAgICAgICA8cGF0aCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0iLz4KKyAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgPC9wYXRoPgorCisgICAgPHBhdGggaWQ9ImNsYXNzcGF0aC50ZXN0Ij4KKyAgICAgICAgPHBhdGggcmVmaWQ9ImNsYXNzcGF0aC5ydW4iLz4KKyAgICAgICAgPHBhdGggbG9jYXRpb249IiR7YW50LnRlc3QubGlifSIvPgorICAgIDwvcGF0aD4KKworICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJEZWxldGUgYWxsIGdlbmVyYXRlZCBmaWxlcyI+CisgICAgICAgIDxkZWxldGUgZmFpbG9uZXJyb3I9ImZhbHNlIiBpbmNsdWRlRW1wdHlEaXJzPSJ0cnVlIj4KKyAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXM9IiR7YW50LnByb2plY3QubmFtZX0uamFyIi8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7cmVwb3J0LmRpcn0iLz4KKyAgICAgICAgPC9kZWxldGU+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIGRlc2NyaXB0aW9uPSJDb21waWxlcyB0aGUgVGFzayI+CisgICAgICAgIDxta2RpciBkaXI9IiR7Y2xhc3Nlcy5kaXJ9Ii8+CisgICAgICAgIDxqYXZhYyBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSIgc3JjZGlyPSIke3NyYy5kaXJ9IiBkZXN0ZGlyPSIke2NsYXNzZXMuZGlyfSIgY2xhc3NwYXRoPSIke2FudC50ZXN0LmxpYn0iLz4KKyAgICA8L3RhcmdldD4KKworICAgIDx0YXJnZXQgbmFtZT0iamFyIiBkZXNjcmlwdGlvbj0iSkFScyB0aGUgVGFzayIgZGVwZW5kcz0iY29tcGlsZSI+CisgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7YW50LnByb2plY3QubmFtZX0uamFyIiBiYXNlZGlyPSIke2NsYXNzZXMuZGlyfSIvPgorICAgIDwvdGFyZ2V0PgorCisKKyAgICA8dGFyZ2V0IG5hbWU9InVzZS5pbml0IiBkZXNjcmlwdGlvbj0iVGFza2RlZiB0aGUgSGVsbG9Xb3JsZC1UYXNrIiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJoZWxsb3dvcmxkIiBjbGFzc25hbWU9IkhlbGxvV29ybGQiIGNsYXNzcGF0aD0iJHthbnQucHJvamVjdC5uYW1lfS5qYXIiLz4KKyAgICA8L3RhcmdldD4KKworCisgICAgPHRhcmdldCBuYW1lPSJ1c2Uud2l0aG91dCIgZGVzY3JpcHRpb249IlVzZSB3aXRob3V0IGFueSIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8aGVsbG93b3JsZC8+CisgICAgPC90YXJnZXQ+CisKKyAgICA8dGFyZ2V0IG5hbWU9InVzZS5tZXNzYWdlIiBkZXNjcmlwdGlvbj0iVXNlIHdpdGggYXR0cmlidXRlICdtZXNzYWdlJyIgZGVwZW5kcz0idXNlLmluaXQiPgorICAgICAgICA8aGVsbG93b3JsZCBtZXNzYWdlPSJhdHRyaWJ1dGUtdGV4dCIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2UuZmFpbCIgZGVzY3JpcHRpb249IlVzZSB3aXRoIGF0dHJpYnV0ZSAnZmFpbCciIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGhlbGxvd29ybGQgZmFpbD0idHJ1ZSIvPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2UubmVzdGVkVGV4dCIgZGVzY3JpcHRpb249IlVzZSB3aXRoIG5lc3RlZCB0ZXh0IiBkZXBlbmRzPSJ1c2UuaW5pdCI+CisgICAgICAgIDxoZWxsb3dvcmxkPm5lc3RlZC10ZXh0PC9oZWxsb3dvcmxkPgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ1c2UubmVzdGVkRWxlbWVudCIgZGVzY3JpcHRpb249IlVzZSB3aXRoIG5lc3RlZCAnbWVzc2FnZSciIGRlcGVuZHM9InVzZS5pbml0Ij4KKyAgICAgICAgPGhlbGxvd29ybGQ+CisgICAgICAgICAgICA8bWVzc2FnZSBtc2c9Ik5lc3RlZCBFbGVtZW50IDEiLz4KKyAgICAgICAgICAgIDxtZXNzYWdlIG1zZz0iTmVzdGVkIEVsZW1lbnQgMiIvPgorICAgICAgICA8L2hlbGxvd29ybGQ+CisgICAgPC90YXJnZXQ+CisKKworICAgIDx0YXJnZXQgbmFtZT0idXNlIgorICAgICAgICAgICAgZGVzY3JpcHRpb249IlRyeSBhbGwgKHcvb3V0IHVzZS5mYWlsKSIKKyAgICAgICAgICAgIGRlcGVuZHM9InVzZS53aXRob3V0LHVzZS5tZXNzYWdlLHVzZS5uZXN0ZWRUZXh0LHVzZS5uZXN0ZWRFbGVtZW50Ii8+CisKKworICAgIDx0YXJnZXQgbmFtZT0ianVuaXQiIGRlc2NyaXB0aW9uPSJSdW5zIHRoZSB1bml0IHRlc3RzIiBkZXBlbmRzPSJqYXIiPgorICAgICAgICA8ZGVsZXRlIGRpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iIC8+CisgICAgICAgIDxta2RpciAgZGlyPSIke2p1bml0Lm91dC5kaXIueG1sfSIgLz4KKyAgICAgICAgPGp1bml0IHByaW50c3VtbWFyeT0ieWVzIiBoYWx0b25mYWlsdXJlPSJubyI+CisgICAgICAgICAgICA8Y2xhc3NwYXRoIHJlZmlkPSJjbGFzc3BhdGgudGVzdCIvPgorICAgICAgICAgICAgPGZvcm1hdHRlciB0eXBlPSJ4bWwiLz4KKyAgICAgICAgICAgIDxiYXRjaHRlc3QgZm9yaz0ieWVzIiB0b2Rpcj0iJHtqdW5pdC5vdXQuZGlyLnhtbH0iPgorICAgICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMuZGlyfSIgaW5jbHVkZXM9IioqLypUZXN0LmphdmEiLz4KKyAgICAgICAgICAgIDwvYmF0Y2h0ZXN0PgorICAgICAgICA8L2p1bml0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJqdW5pdHJlcG9ydCIgZGVzY3JpcHRpb249IkNyZWF0ZSBhIHJlcG9ydCBmb3IgdGhlIHJlc3QgcmVzdWx0Ij4KKyAgICAgICAgPG1rZGlyIGRpcj0iJHtqdW5pdC5vdXQuZGlyLmh0bWx9IiAvPgorICAgICAgICA8anVuaXRyZXBvcnQgdG9kaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSI+CisgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7anVuaXQub3V0LmRpci54bWx9Ij4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSIqLnhtbCIvPgorICAgICAgICAgICAgPC9maWxlc2V0PgorICAgICAgICAgICAgPHJlcG9ydCBmb3JtYXQ9ImZyYW1lcyIgdG9kaXI9IiR7anVuaXQub3V0LmRpci5odG1sfSIvPgorICAgICAgICA8L2p1bml0cmVwb3J0PgorICAgIDwvdGFyZ2V0PgorCisgICAgPHRhcmdldCBuYW1lPSJ0ZXN0IgorICAgICAgICAgICAgZGVwZW5kcz0ianVuaXQsanVuaXRyZXBvcnQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iUnVucyB1bml0IHRlc3RzIGFuZCBjcmVhdGVzIGEgcmVwb3J0Ii8+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NyYy90dXRvcmlhbC90YXNrcy1zdGFydC13cml0aW5nL3NyYy9IZWxsb1dvcmxkLmphdmEgYi9zcmMvdHV0b3JpYWwvdGFza3Mtc3RhcnQtd3JpdGluZy9zcmMvSGVsbG9Xb3JsZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiN2RmNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdHV0b3JpYWwvdGFza3Mtc3RhcnQtd3JpdGluZy9zcmMvSGVsbG9Xb3JsZC5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhlIHRhc2sgb2YgdGhlIHR1dG9yaWFsLgorICogUHJpbnRzIGEgbWVzc2FnZSBvciBsZXRzIHRoZSBidWlsZCBmYWlsLgorICogQGF1dGhvciBKYW4gTWF0w6lybmUKKyAqIEBzaW5jZSAyMDAzLTA4LTE5CisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkIGV4dGVuZHMgVGFzayB7CisKKworICAgIC8qKiBUaGUgbWVzc2FnZSB0byBwcmludC4gQXMgYXR0cmlidXRlLiAqLworICAgIFN0cmluZyBtZXNzYWdlOworICAgIHB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoU3RyaW5nIG1zZykgeworICAgICAgICBtZXNzYWdlID0gbXNnOworICAgIH0KKworICAgIC8qKiBTaG91bGQgdGhlIGJ1aWxkIGZhaWw/IERlZmF1bHRzIHRvIDxpPmZhbHNlPC9pPi4gQXMgYXR0cmlidXRlLiAqLworICAgIGJvb2xlYW4gZmFpbCA9IGZhbHNlOworICAgIHB1YmxpYyB2b2lkIHNldEZhaWwoYm9vbGVhbiBiKSB7CisgICAgICAgIGZhaWwgPSBiOworICAgIH0KKworICAgIC8qKiBTdXBwb3J0IGZvciBuZXN0ZWQgdGV4dC4gKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIG1lc3NhZ2UgPSB0ZXh0OworICAgIH0KKworCisgICAgLyoqIERvIHRoZSB3b3JrLiAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgJ2ZhaWwnCisgICAgICAgIGlmIChmYWlsKSB0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIkZhaWwgcmVxdWVzdGVkLiIpOworCisgICAgICAgIC8vIGhhbmRsZSBhdHRyaWJ1dGUgJ21lc3NhZ2UnIGFuZCBuZXN0ZWQgdGV4dAorICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsKSBsb2cobWVzc2FnZSk7CisKKyAgICAgICAgLy8gaGFuZGxlIG5lc3RlZCBlbGVtZW50cworICAgICAgICBmb3IgKE1lc3NhZ2UgbXNnIDogbWVzc2FnZXMpIHsKKyAgICAgICAgICAgIGxvZyhtc2cuZ2V0TXNnKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiogU3RvcmUgbmVzdGVkICdtZXNzYWdlJ3MuICovCisgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgLyoqIEZhY3RvcnkgbWV0aG9kIGZvciBjcmVhdGluZyBuZXN0ZWQgJ21lc3NhZ2Uncy4gKi8KKyAgICBwdWJsaWMgTWVzc2FnZSBjcmVhdGVNZXNzYWdlKCkgeworICAgICAgICBNZXNzYWdlIG1zZyA9IG5ldyBNZXNzYWdlKCk7CisgICAgICAgIG1lc3NhZ2VzLmFkZChtc2cpOworICAgICAgICByZXR1cm4gbXNnOworICAgIH0KKworICAgIC8qKiBBIG5lc3RlZCAnbWVzc2FnZScuICovCisgICAgcHVibGljIGNsYXNzIE1lc3NhZ2UgeworICAgICAgICAvLyBCZWFuIGNvbnN0cnVjdG9yCisgICAgICAgIHB1YmxpYyBNZXNzYWdlKCkge30KKworICAgICAgICAvKiogTWVzc2FnZSB0byBwcmludC4gKi8KKyAgICAgICAgU3RyaW5nIG1zZzsKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TXNnKFN0cmluZyBtc2cpIHsgdGhpcy5tc2cgPSBtc2c7IH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNc2coKSB7IHJldHVybiBtc2c7IH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90dXRvcmlhbC90YXNrcy1zdGFydC13cml0aW5nL3NyYy9IZWxsb1dvcmxkVGVzdC5qYXZhIGIvc3JjL3R1dG9yaWFsL3Rhc2tzLXN0YXJ0LXdyaXRpbmcvc3JjL0hlbGxvV29ybGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkYmIyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90dXRvcmlhbC90YXNrcy1zdGFydC13cml0aW5nL3NyYy9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICovCitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRGaWxlUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgQnVpbGRGaWxlUnVsZSBydWxlID0gbmV3IEJ1aWxkRmlsZVJ1bGUoKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRyaWVkID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICAvLyBpbml0aWFsaXplIEFudAorICAgICAgICBydWxlLmNvbmZpZ3VyZVByb2plY3QoImJ1aWxkLnhtbCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhvdXQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlLndpdGhvdXQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIHdhcyBsb2dnZWQgYnV0IHNob3VsZCBub3QuIiwgIiIsIHJ1bGUuZ2V0TG9nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2UoKSB7CisgICAgICAgIC8vIGV4ZWN1dGUgdGFyZ2V0ICd1c2UubmVzdGVkVGV4dCcgYW5kIGV4cGVjdCBhIG1lc3NhZ2UKKyAgICAgICAgLy8gJ2F0dHJpYnV0ZS10ZXh0JyBpbiB0aGUgbG9nCisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlLm1lc3NhZ2UiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJ1bGUuZ2V0TG9nKCksICJhdHRyaWJ1dGUtdGV4dCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaWwoKSB7CisgICAgICAgIHRyaWVkLmV4cGVjdChCdWlsZEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRyaWVkLmV4cGVjdE1lc3NhZ2UoIkZhaWwgcmVxdWVzdGVkLiIpOworICAgICAgICAvLyBleGVjdXRlIHRhcmdldCAndXNlLmZhaWwnIGFuZCBleHBlY3QgYSBCdWlsZEV4Y2VwdGlvbgorICAgICAgICAvLyB3aXRoIHRleHQgJ0ZhaWwgcmVxdWVzdGVkLicKKyAgICAgICAgcnVsZS5leGVjdXRlVGFyZ2V0KCJ1c2UuZmFpbCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFRleHQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlLm5lc3RlZFRleHQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuZXN0ZWQtdGV4dCIsIHJ1bGUuZ2V0TG9nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEVsZW1lbnQoKSB7CisgICAgICAgIHJ1bGUuZXhlY3V0ZVRhcmdldCgidXNlLm5lc3RlZEVsZW1lbnQiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShydWxlLmdldExvZygpLmNvbnRhaW5zKCJOZXN0ZWQgRWxlbWVudCAxIikpOworICAgICAgICBhc3NlcnRUcnVlKHJ1bGUuZ2V0TG9nKCkuY29udGFpbnMoIk5lc3RlZCBFbGVtZW50IDIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1jb21wYXRpYmlsaXR5LnNoIGIvdGVzdC1jb21wYXRpYmlsaXR5LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc5ZDRlZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWNvbXBhdGliaWxpdHkuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL3NoCisKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisjIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisjIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisjICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisjIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgQ29tcGlsZXMgYW5kIGJ1aWxkcyBBbnQgd2l0aCB2YXJpb3VzIGRpZmZlcmVudCByZWNlbnQgdmVyc2lvbnMgb2YgSmF2YSBhbmQKKyMgdGhlbiBydW5zIChvbmx5IHRoZSkgdGVzdHMgd2l0aCB0aGUgbWluaW1hbCBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBKYXZhIHJ1bnRpbWUKKyMgKHdoaWNoIGFzIG9mIEF1ZyAyMDE5LCBpcyBKYXZhIDgpLgorIyBUaGlzIGVuc3VyZXMvdmVyaWZpZXMgdGhhdCB2YXJpb3VzIEFudCBmdW5jdGlvbmFsaXR5IHdvcmtzIGFzIGV4cGVjdGVkCisjIHdoZW4gQW50IGlzIGJ1aWx0IHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiBKYXZhIGFuZCBpcyBydW4gYWdhaW5zdCB0aGUgbWluaW1hbAorIyBzdXBwb3J0ZWQgdmVyc2lvbi4KKyMgVGhpcyBzY3JpcHQgaXMgaWRlYWwgZm9yIHVzaW5nIGluIGEgQ0kgZW52aXJvbm1lbnQgd2hlcmUgaXQgY2FuIGJlIGludm9rZWQKKyMgdGhyb3VnaCBhIGpvYiB3aGljaCBpcyBjb25maWd1cmVkIHRvIHVzZSB2YXJpb3VzIGRpZmZlcmVudCBKREsgdmVyc2lvbnMuCisKKyMgRmFpbCB0aGUgc2NyaXB0IG9uIGVycm9yCitzZXQgLWUKKworIyBCdWlsZCAoY29tcGlsZSBhbmQgZ2VuZXJhdGUgdGhlIGRpc3QpIHRoZSBwcm9qZWN0IHVzaW5nIHRoZSBKYXZhIHZlcnNpb24KKyMgdGhhdCdzIGFscmVhZHkgc2V0IGluIHRoZSBlbnZpcm9ubWVudAorZWNobyAiVXNpbmcgIFwiJHtKQVZBX0hPTUV9XCIgdG8gYnVpbGQgQW50IgoramF2YSAtdmVyc2lvbgorCisjIEZldGNoIGFsbCB0aGUgbmVjZXNzYXJ5IHRoaXJkcGFydHkgbGlicywgYmVmb3JlIGJvb3N0cmFwaW5nIEFudAorYW50IC1mIGZldGNoLnhtbCAtRGRlc3Q9b3B0aW9uYWwKKworIyBOb3cgYm9vdHN0cmFwIEFudCB3aXRoIGFsbCBuZWNlc3NhcnkgdGhpcmRwYXJ0eSBsaWJzIGFscmVhZHkgZmV0Y2hlZAorLi9idWlsZC5zaCBhbGxjbGVhbiBkaXN0CisKKyMgU3dpdGNoIHRoZSBKREsgdG8gSmF2YSA4IHRvIHJ1biAqb25seSogdGhlIHRlc3RzLgorIyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgQW50IGJ1aWx0IHdpdGggZGlmZmVyZW50IChoaWdoZXIpIHZlcnNpb24gb2YgQW50CisjIGNhbiBiZSB1c2VkIGJ5IEphdmEgOCBydW50aW1lIGFuZCBjYW4gZnVuY3Rpb24gcHJvcGVybHkgZm9yIGFsbCBBbnQKKyMgZnVuY3Rpb25hbGl0eQorbWtkaXIgLXAgYnVpbGQvamF2YS04LWxhdGVzdAorY2QgYnVpbGQvamF2YS04LWxhdGVzdAorIyBEb3dubG9hZCBsYXRlc3QgSmF2YSA4ICh3ZSB1c2UgQWRvcHQgT3BlbkpESyBiaW5hcmllcykKK3dnZXQgaHR0cHM6Ly9naXRodWIuY29tL0Fkb3B0T3BlbkpESy9vcGVuamRrOC1iaW5hcmllcy9yZWxlYXNlcy9kb3dubG9hZC9qZGs4dTIzMi1iMDkvT3BlbkpESzhVLWpka194NjRfbGludXhfaG90c3BvdF84dTIzMmIwOS50YXIuZ3oKK3RhciAtenhmIC4vKi50YXIuZ3oKKyMgc2V0IEpBVkFfSE9NRSB0byBwb2ludCB0byB0aGUgbmV3bHkgZXh0cmFjdGVkIHRhcidzIGNvbnRlbnQKK2V4cG9ydCBKQVZBX0hPTUU9ImBlY2hvIFxgcHdkXGAvXGBlY2hvICovXGBgIgorZXhwb3J0IFBBVEg9IiR7SkFWQV9IT01FfSIvYmluOiIke1BBVEh9IgorY2QgLi4vLi4KKworZWNobyAiVXNpbmcgXCIke0pBVkFfSE9NRX1cIiB0byBydW4gQW50IHRlc3RzIgoramF2YSAtdmVyc2lvbgorCisjIFNldCBBTlRfSE9NRSB0byB0aGUgYm9vc3RyYXBlZCB2ZXJzaW9uIC0gdGhlIG9uZSB3aGljaCB3YXMgYnVpbHQsIHVzaW5nIGEgZGlmZmVyZW50IEphdmEgdmVyc2lvbiwgYSBmZXcgc3RlcHMKKyMgZWFybGllciBpbiB0aGlzIHNjcmlwdAorZXhwb3J0IEFOVF9IT01FPSJgcHdkYC9ib290c3RyYXAiCisjIFJ1biB0aGUgdGVzdHMuIFdlIGludGVudGlvbmFsbHkgc2tpcCB0aGUgYnVpbGQgKGNvbXBpbGF0aW9uIGV0YykgdG8gYXZvaWQgY29tcGlsaW5nIHRoZSBwcm9qZWN0CisjIHdpdGggdGhlIG5ld2x5IHNldCBKYXZhIHZlcnNpb24uCithbnQgLW5vdXNlcmxpYiAtbGliIGxpYi9vcHRpb25hbCB0ZXN0IC1Ec2tpcC5idWlsZD10cnVlIC1EaWdub3JlLnRlc3RzLmZhaWxlZD10cnVlIC1Eb3B0aW9uYWwuamFycy53aGVubWFuaWZlc3Rvbmx5PXNraXAgLURqZW5raW5zPXQKKwo=